the-infocom-files / bureaucracy

Bureaucracy
8 stars 2 forks source link

[game breaking crash] read called on nonexistant local var #13

Open ChristopherDrum opened 2 years ago

ChristopherDrum commented 2 years ago

Without the phone number patch provided by @heasm66 in the previous game breaking bug applied to r160, it is impossible to progress far enough to find this one. I have confirmed this bug crashes at least two interpreters.

I'm following this walkthrough: https://www.bruceasmith.com/infocom/bureau.php

The final stage occurs at the Airshaft. Once there, the first thing to do is go up This results in a hard crash of an interpreter.

Gargoyle reports fatal error: attempting to read from nonexistent local variable 3: routine has 0 (pc = 0x2a7df) which corroborates the crash log information I saw in my personal WIP interpreter.

It takes a non-trivial amount of time to get to this point in the game, so if I find the time to try other interpreters and r116, I will. (is it possible the game expects an interpreter to fail silently in this case?)

heasm66 commented 2 years ago

The failing source code is:

<SETG PLANE-ARRIVE-COUNT 4>

<DEFINE I-PLANE-ARRIVES ()
  <COND (<==? <SETG PLANE-ARRIVE-COUNT <- ,PLANE-ARRIVE-COUNT 1>> 2>
     <TELL CR
           "In the distance you hear the sound of Zalagasans having
a huge row about whether bearnaise sauce or grated Parmesan is better
with boiled visitor." CR>)
...

This compiles to:

2a7d9:  4f 10 04 00             loadw           g00 #04 -> sp
2a7dd:  96 00                   dec             sp
2a7df:  ae 00 00                load            [sp] -> sp
2a7e2:  e1 9b 10 04 00          storew          g00 #04 sp
2a7e7:  41 00 02 00 54          je              sp #02 ~2a83e
2a7ec:  bb                      new_line
2a7ed:  b3 ...                  print_ret       "In the distance you hear the
sound of Zalagasans having a huge row about whether bearnaise sauce or grated
Parmesan is better with boiled visitor."

If I write a small program like this:

<FILE-FLAGS MDL-ZIL?>

<VERSION 4>

<SETG VARIABLE 4>

<ROUTINE GO ()
    <COND (<==? <SETG VARIABLE <- ,VARIABLE 1>> 3>
        <TELL CR "Three..." CR>)>
    <TELL N ,VARIABLE CR>
    <INPUT 1>
>

It compiles to this:

  1b9:  96 10                   dec             g00
  1bb:  41 10 03 4d             je              g00 #03 ~1ca
  1bf:  bb                      new_line
  1c0:  b2 ...                  print           "Three..."
  1c9:  bb                      new_line
  1ca:  e6 bf 10                print_num       g00
  1cd:  bb                      new_line
  1ce:  f6 7f 01 00             read_char       #01 -> sp
  1d2:  ba                      quit

And works as expected and prints:

Three...
3

But if I introduce FUNNY-GLOBALS? and create a lot of globals to activate array storage. I get the following result, (first the source):

<FILE-FLAGS MDL-ZIL?>
<FUNNY-GLOBALS?>

<VERSION 4>

<SETG VARIABLE-00 4>
<SETG VARIABLE-01 4>
<SETG VARIABLE-02 4>
<SETG VARIABLE-03 4>
<SETG VARIABLE-04 4>
<SETG VARIABLE-05 4>
<SETG VARIABLE-06 4>
<SETG VARIABLE-07 4>
<SETG VARIABLE-08 4>
<SETG VARIABLE-09 4>
<SETG VARIABLE-10 4>
<SETG VARIABLE-11 4>
<SETG VARIABLE-12 4>
<SETG VARIABLE-13 4>
<SETG VARIABLE-14 4>
<SETG VARIABLE-15 4>
<SETG VARIABLE-16 4>
<SETG VARIABLE-17 4>
<SETG VARIABLE-18 4>
<SETG VARIABLE-19 4>
<SETG VARIABLE-20 4>
<SETG VARIABLE-21 4>
<SETG VARIABLE-22 4>
<SETG VARIABLE-23 4>
<SETG VARIABLE-24 4>
<SETG VARIABLE-25 4>
<SETG VARIABLE-26 4>
<SETG VARIABLE-27 4>
<SETG VARIABLE-28 4>
<SETG VARIABLE-29 4>
<SETG VARIABLE-30 4>
<SETG VARIABLE-31 4>
<SETG VARIABLE-32 4>
<SETG VARIABLE-33 4>
<SETG VARIABLE-34 4>
<SETG VARIABLE-35 4>
<SETG VARIABLE-36 4>
<SETG VARIABLE-37 4>
<SETG VARIABLE-38 4>
<SETG VARIABLE-39 4>
<SETG VARIABLE-40 4>
<SETG VARIABLE-41 4>
<SETG VARIABLE-42 4>
<SETG VARIABLE-43 4>
<SETG VARIABLE-44 4>
<SETG VARIABLE-45 4>
<SETG VARIABLE-46 4>
<SETG VARIABLE-47 4>
<SETG VARIABLE-48 4>
<SETG VARIABLE-49 4>
<SETG VARIABLE-50 4>
<SETG VARIABLE-51 4>
<SETG VARIABLE-52 4>
<SETG VARIABLE-53 4>
<SETG VARIABLE-54 4>
<SETG VARIABLE-55 4>
<SETG VARIABLE-56 4>
<SETG VARIABLE-57 4>
<SETG VARIABLE-58 4>
<SETG VARIABLE-59 4>
<SETG VARIABLE-60 4>
<SETG VARIABLE-61 4>
<SETG VARIABLE-62 4>
<SETG VARIABLE-63 4>
<SETG VARIABLE-64 4>
<SETG VARIABLE-65 4>
<SETG VARIABLE-66 4>
<SETG VARIABLE-67 4>
<SETG VARIABLE-68 4>
<SETG VARIABLE-69 4>
<SETG VARIABLE-70 4>
<SETG VARIABLE-71 4>
<SETG VARIABLE-72 4>
<SETG VARIABLE-73 4>
<SETG VARIABLE-74 4>
<SETG VARIABLE-75 4>
<SETG VARIABLE-76 4>
<SETG VARIABLE-77 4>
<SETG VARIABLE-78 4>
<SETG VARIABLE-79 4>
<SETG VARIABLE-80 4>
<SETG VARIABLE-81 4>
<SETG VARIABLE-82 4>
<SETG VARIABLE-83 4>
<SETG VARIABLE-84 4>
<SETG VARIABLE-85 4>
<SETG VARIABLE-86 4>
<SETG VARIABLE-87 4>
<SETG VARIABLE-88 4>
<SETG VARIABLE-89 4>
<SETG VARIABLE-90 4>
<SETG VARIABLE-91 4>
<SETG VARIABLE-92 4>
<SETG VARIABLE-93 4>
<SETG VARIABLE-94 4>
<SETG VARIABLE-95 4>
<SETG VARIABLE-96 4>
<SETG VARIABLE-97 4>
<SETG VARIABLE-98 4>
<SETG VARIABLE-99 4>
<SETG VARIABLE-100 4>
<SETG VARIABLE-101 4>
<SETG VARIABLE-102 4>
<SETG VARIABLE-103 4>
<SETG VARIABLE-104 4>
<SETG VARIABLE-105 4>
<SETG VARIABLE-106 4>
<SETG VARIABLE-107 4>
<SETG VARIABLE-108 4>
<SETG VARIABLE-109 4>
<SETG VARIABLE-110 4>
<SETG VARIABLE-111 4>
<SETG VARIABLE-112 4>
<SETG VARIABLE-113 4>
<SETG VARIABLE-114 4>
<SETG VARIABLE-115 4>
<SETG VARIABLE-116 4>
<SETG VARIABLE-117 4>
<SETG VARIABLE-118 4>
<SETG VARIABLE-119 4>
<SETG VARIABLE-120 4>
<SETG VARIABLE-121 4>
<SETG VARIABLE-122 4>
<SETG VARIABLE-123 4>
<SETG VARIABLE-124 4>
<SETG VARIABLE-125 4>
<SETG VARIABLE-126 4>
<SETG VARIABLE-127 4>
<SETG VARIABLE-128 4>
<SETG VARIABLE-129 4>
<SETG VARIABLE-130 4>
<SETG VARIABLE-131 4>
<SETG VARIABLE-132 4>
<SETG VARIABLE-133 4>
<SETG VARIABLE-134 4>
<SETG VARIABLE-135 4>
<SETG VARIABLE-136 4>
<SETG VARIABLE-137 4>
<SETG VARIABLE-138 4>
<SETG VARIABLE-139 4>
<SETG VARIABLE-140 4>
<SETG VARIABLE-141 4>
<SETG VARIABLE-142 4>
<SETG VARIABLE-143 4>
<SETG VARIABLE-144 4>
<SETG VARIABLE-145 4>
<SETG VARIABLE-146 4>
<SETG VARIABLE-147 4>
<SETG VARIABLE-148 4>
<SETG VARIABLE-149 4>
<SETG VARIABLE-150 4>
<SETG VARIABLE-151 4>
<SETG VARIABLE-152 4>
<SETG VARIABLE-153 4>
<SETG VARIABLE-154 4>
<SETG VARIABLE-155 4>
<SETG VARIABLE-156 4>
<SETG VARIABLE-157 4>
<SETG VARIABLE-158 4>
<SETG VARIABLE-159 4>
<SETG VARIABLE-160 4>
<SETG VARIABLE-161 4>
<SETG VARIABLE-162 4>
<SETG VARIABLE-163 4>
<SETG VARIABLE-164 4>
<SETG VARIABLE-165 4>
<SETG VARIABLE-166 4>
<SETG VARIABLE-167 4>
<SETG VARIABLE-168 4>
<SETG VARIABLE-169 4>
<SETG VARIABLE-170 4>
<SETG VARIABLE-171 4>
<SETG VARIABLE-172 4>
<SETG VARIABLE-173 4>
<SETG VARIABLE-174 4>
<SETG VARIABLE-175 4>
<SETG VARIABLE-176 4>
<SETG VARIABLE-177 4>
<SETG VARIABLE-178 4>
<SETG VARIABLE-179 4>
<SETG VARIABLE-180 4>
<SETG VARIABLE-181 4>
<SETG VARIABLE-182 4>
<SETG VARIABLE-183 4>
<SETG VARIABLE-184 4>
<SETG VARIABLE-185 4>
<SETG VARIABLE-186 4>
<SETG VARIABLE-187 4>
<SETG VARIABLE-188 4>
<SETG VARIABLE-189 4>
<SETG VARIABLE-190 4>
<SETG VARIABLE-191 4>
<SETG VARIABLE-192 4>
<SETG VARIABLE-193 4>
<SETG VARIABLE-194 4>
<SETG VARIABLE-195 4>
<SETG VARIABLE-196 4>
<SETG VARIABLE-197 4>
<SETG VARIABLE-198 4>
<SETG VARIABLE-199 4>
<SETG VARIABLE-200 4>
<SETG VARIABLE-201 4>
<SETG VARIABLE-202 4>
<SETG VARIABLE-203 4>
<SETG VARIABLE-204 4>
<SETG VARIABLE-205 4>
<SETG VARIABLE-206 4>
<SETG VARIABLE-207 4>
<SETG VARIABLE-208 4>
<SETG VARIABLE-209 4>
<SETG VARIABLE-210 4>
<SETG VARIABLE-211 4>
<SETG VARIABLE-212 4>
<SETG VARIABLE-213 4>
<SETG VARIABLE-214 4>
<SETG VARIABLE-215 4>
<SETG VARIABLE-216 4>
<SETG VARIABLE-217 4>
<SETG VARIABLE-218 4>
<SETG VARIABLE-219 4>
<SETG VARIABLE-220 4>
<SETG VARIABLE-221 4>
<SETG VARIABLE-222 4>
<SETG VARIABLE-223 4>
<SETG VARIABLE-224 4>
<SETG VARIABLE-225 4>
<SETG VARIABLE-226 4>
<SETG VARIABLE-227 4>
<SETG VARIABLE-228 4>
<SETG VARIABLE-229 4>
<SETG VARIABLE-230 4>
<SETG VARIABLE-231 4>
<SETG VARIABLE-232 4>
<SETG VARIABLE-233 4>
<SETG VARIABLE-234 4>
<SETG VARIABLE-235 4>
<SETG VARIABLE-236 4>
<SETG VARIABLE-237 4>
<SETG VARIABLE-238 4>
<SETG VARIABLE-239 4>
<SETG VARIABLE-240 4>
<SETG VARIABLE-241 4>
<SETG VARIABLE-242 4>
<SETG VARIABLE-243 4>
<SETG VARIABLE-244 4>
<SETG VARIABLE-245 4>
<SETG VARIABLE-246 4>
<SETG VARIABLE-247 4>
<SETG VARIABLE-248 4>
<SETG VARIABLE-249 4>
<SETG VARIABLE-250 4>
<SETG VARIABLE-251 4>
<SETG VARIABLE-252 4>
<SETG VARIABLE-253 4>
<SETG VARIABLE-254 4>
<SETG VARIABLE-255 4>
<SETG VARIABLE-256 4>
<SETG VARIABLE-257 4>
<SETG VARIABLE-258 4>
<SETG VARIABLE-259 4>
<SETG VARIABLE-260 4>
<SETG VARIABLE-261 4>
<SETG VARIABLE-262 4>
<SETG VARIABLE-263 4>
<SETG VARIABLE-264 4>
<SETG VARIABLE-265 4>
<SETG VARIABLE-266 4>
<SETG VARIABLE-267 4>
<SETG VARIABLE-268 4>
<SETG VARIABLE-269 4>
<SETG VARIABLE-270 4>
<SETG VARIABLE-271 4>
<SETG VARIABLE-272 4>
<SETG VARIABLE-273 4>
<SETG VARIABLE-274 4>
<SETG VARIABLE-275 4>
<SETG VARIABLE-276 4>
<SETG VARIABLE-277 4>
<SETG VARIABLE-278 4>
<SETG VARIABLE-279 4>
<SETG VARIABLE-280 4>
<SETG VARIABLE-281 4>
<SETG VARIABLE-282 4>
<SETG VARIABLE-283 4>
<SETG VARIABLE-284 4>
<SETG VARIABLE-285 4>
<SETG VARIABLE-286 4>
<SETG VARIABLE-287 4>
<SETG VARIABLE-288 4>
<SETG VARIABLE-289 4>
<SETG VARIABLE-290 4>
<SETG VARIABLE-291 4>
<SETG VARIABLE-292 4>
<SETG VARIABLE-293 4>
<SETG VARIABLE-294 4>
<SETG VARIABLE-295 4>
<SETG VARIABLE-296 4>
<SETG VARIABLE-297 4>
<SETG VARIABLE-298 4>
<SETG VARIABLE-299 4>

<SETG VARIABLE 4>

<ROUTINE GO ()
    <COND (<==? <SETG VARIABLE <- ,VARIABLE 1>> 3>
        <TELL CR "Three..." CR>)>
    <TELL N ,VARIABLE CR>
    <INPUT 1>
>

Compiles to:

  411:  4f 10 41 00             loadw           g00 #41 -> sp
  415:  96 00                   dec             sp
  417:  ae 00 00                load            [sp] -> sp
  41a:  e1 9b 10 41 00          storew          g00 #41 sp
  41f:  41 00 03 4d             je              sp #03 ~42e
  423:  bb                      new_line
  424:  b2 ...                  print           "Three..."
  42d:  bb                      new_line
  42e:  4f 10 41 00             loadw           g00 #41 -> sp
  432:  e6 bf 00                print_num       sp
  435:  bb                      new_line
  436:  f6 7f 01 00             read_char       #01 -> sp
  43a:  ba                      quit

When run it prints:

0

If I rewrite the code as:

<ROUTINE GO ()
    <SETG VARIABLE <- ,VARIABLE 1>>
    <COND (<==? ,VARIABLE 3>
        <TELL CR "Three..." CR>)>
    <TELL N ,VARIABLE CR>
    <INPUT 1>
>

It compiles to:

  411:  4f 10 41 00             loadw           g00 #41 -> sp
  415:  96 00                   dec             sp
  417:  e1 9b 10 41 00          storew          g00 #41 sp
  41c:  4f 10 41 00             loadw           g00 #41 -> sp
  420:  41 00 03 4d             je              sp 
...

And produces the expected result.

I suspect this is a compiler bug. The LOAD-opcode is wrong and shouldn't be there in this case. The code could probably be fixed by breaking out the assignment of the variable from inside the COND to outside (as hinted at above).

heasm66 commented 2 years ago

Suggested changes:

Change RUN-TELE-COMM, LANDING-STRIP-F and I-PLANE-ARRIVES to:

<DEFINE RUN-TELE-COMM ("AUX" (F 0))
  <COND (<T? <COMPUTER-DEAD?>>
     <TELL CR "The mainframe doesn't seem to be responding, so your Boysenberry rejects the modular plug. Have you messed up the computer system?" CR>)
    (T
     <SETG REFRESH-COUNT <- ,REFRESH-COUNT 1>>
     <COND (<NOT <L? ,REFRESH-COUNT 0>>
        <REPEAT ((N 0))
          <ZPUT ,TARGETS .N <ZGET ,ITARGETS .N>>
          <COND (<G? <SET N <+ .N 1>> <- ,TARGET-COUNT 1>>
             <RETURN>)>>)>
     <SETG FORM-COMPUTER? T>
     <TELECOM? T>
     <DRAW-COMPUTER-SCREEN>
     <SET-COMPUTER-CURS 0 0>
     <HLIGHT ,H-NORMAL>
     <DUMP-STRING "CONNECTION IN PROGRESS...." T>
     <DELAY 1>
     <SET-COMPUTER-CURS 2 0>
     <DUMP-STRING "CONNECTED TO DVH2 NODE 0106. WAITING." T>
     <DELAY 1>
     <COND (<DO-LOGIN>
        <SET-COMPUTER-CURS 4 0>
        <DUMP-STRING "LOGON AT ">
        <TELL N ,HOURS ":">
        <COND (<L? ,MINUTES:FIX 10> <TELL "0">)>
        <TELL N ,MINUTES>
        <SET-COMPUTER-CURS 6 0>
        <DUMP-STRING "DVH2 CHA/OS: ? OR HELP FOR HELP" T>
        <TELECOM? T>
        <SETUP-NEXT-TARGET>
        <REMAINING-TARGET-TURNS 2>
        <FERROR-MSG "ENTER-COMMAND">
        <COND (<F? <DIE-ON-NEXT-COMMAND>>
               <COMPUTER-LOOP ,TELECOM-TABLE>)
              (<F? <EXITED-ALREADY?>>
               <SECURITY-COMES T>)>)>
     <EXIT-HACK>)>>

<DEFINE I-PLANE-ARRIVES ()
  <SETG PLANE-ARRIVE-COUNT <- ,PLANE-ARRIVE-COUNT 1>>
  <COND (<==? ,PLANE-ARRIVE-COUNT 2>
     <TELL CR
           "In the distance you hear the sound of Zalagasans having
a huge row about whether bearnaise sauce or grated Parmesan is better
with boiled visitor." CR>)
    (<==? ,PLANE-ARRIVE-COUNT 0>
     <DEQUEUE I-PLANE-ARRIVES>
     <COND (<NOT ,PLANE-SUMMONED?>
        <TELL CR
              "At this point, you'd expect the Zalagasans to start
droning, and then that would turn into an " D ,PLANE ", and you'd fly out of
here. Unfortunately, the plane doesn't know it's supposed to show up here,
since you never told it to,
so that doesn't happen. The Zalagasans continue to row about bearnaise
sauce and grated Parmesan." CR>)
           (T
        <TELL CR
"For some reason, the Zalagasans have started droning... or have they?
No, it is the sound of an aircraft in the distance. The sound of the
engines gets louder and louder until suddenly an ancient DC-3 appears
nightmarishly low above the treetops, circles the airfield once, and
lands with a cloud of dust and a squeal of brakes.|
|
The door opens and you leap on board to be greeted by a ">
        <GENDER-PRINT "beautiful copilot"
                  "ruggedly handsome flight attendant">
        <TELL ". \"You finally fixed that dreadful nerd,\" ">
        <GENDER-PRINT "she" "he">
        <TELL " says. \"You wouldn't believe what he was doing, even to
our own navigation systems. It was as if he didn't care who he
inconvenienced, even himself, as long as he was hacking. Gosh, I'm just so
grateful I could die!\"|
|
With that, the ">
        <GENDER-PRINT "copilot" "flight attendant">
        <TELL " enfolds you in ">
        <GENDER-PRINT "her" "his">
        <TELL " arms and you begin to realise why people like
private " D ,PLANE "s" ,PCR>
        <COND (<T? <COMPUTER-DEAD?>>
               <MOVE ,END-MAIL ,FROOM>
               <TELL "After an eventful and invigorating flight, you land
at your home airport, pass through customs without the least difficulty, and are
ushered into a waiting taxi, which drives you straight to the wrong place.
Perhaps you thought that the taxi company was being fouled up by the
nerd. Wrong. Taxi companies foul up because that's what they like doing"
                 ,PERIOD>
               <SETG END-GAME? T>
               <UPDATE-SCORE 2>
               <ZCRLF>
               <UNMAKE ,FROOM ,TOUCHED>
               <UNMAKE ,BROOM ,TOUCHED>
               <UNMAKE ,PORCH-DOOR ,OPENED>
               <MAKE ,PORCH-DOOR ,LOCKED>
               <UNMAKE ,BWGATE ,OPENED>
               <MAKE ,BWGATE ,LOCKED>
               <GOTO ,THALL T <>>)
              (T
               <TELL "You " ITAL "knew"
                 " something was up, didn't you?
Quite right.|
|
The pilot comes back to where you are sitting, spoiling your tasty fun.
You wonder why he is not flying the " D ,PLANE ", but when he explains that
the computerised navigation system appears to be going haywire due to
outside intervention, you realise why he is not flying it. There would
be little point.|
|
You realise just " ITAL "how" " little when the " D ,PLANE " goes into a steep
spiral dive and you hear a loud bang followed by a toneless but exuberant
rendition of an ancient Zalagasan song about what a coincidence it is
that, just when everyone is feeling peckish and wondering about sending
out for a 48-inch deep-dish pizza with extra everything, there should be
a convenient lunch delivery.|
|
Your last words are \"Hey! I don't " ITAL "like" " anchovies!\" But the
Zalagasans put them on you anyway.">
               <JIGS-UP>
               T)>)>)
    (T <>)>>

<DEFINE LANDING-STRIP-F ("OPT" (CONTEXT <>))
  <COND (<==? .CONTEXT ,M-ENTERING>
     <DEQUEUE I-NERD>
     <COND (<NOT ,PLANE-SUMMONED?>
        <QUEUE I-PLANE-ARRIVES -1>
        <SETG LS-MOVE-COUNT 7>)
           (<NOT <QUEUED? I-PLANE-ARRIVES>>
        <QUEUE I-PLANE-ARRIVES -1>)>
     <>)
    (<AND <==? .CONTEXT ,M-BEG>
          <NOT ,PLANE-SUMMONED?>>
     <SETG LS-MOVE-COUNT <- ,LS-MOVE-COUNT 1>>
     <COND (<==? ,LS-MOVE-COUNT 254>
        <TELL "Infocom regrets that the laws of nature were
suspended for only one turn. You crash to the ground with some interesting new
theories forming in your mind on the method of proof-by-induction.
Unfortunately, before you can organise your thoughts into anything which
would be remotely acceptable as a Ph.D. dissertation -- even at Caltech -- you die.">
        <JIGS-UP>
        T)
           (<L=? ,LS-MOVE-COUNT 0>
        <COND (<VERB? WAIT>
               <TELL "There is a limit to human patience. You are
really fed up now, and wish you were dead. Fair enough.">
               <JIGS-UP>
               T)
              (<VERB? WALK>
               <COND (<==? ,P-WALK-DIR ,P?DOWN>
                  <TELL "A reasonable suggestion. A line from
John Donne comes into your mind:|
|
\"The grave's a fine and private place|
But none, methinks, do there embrace.\"|
|
Just as you realise that this is, in fact, a line from Andrew Marvell,
you die. What a bitch, eh?">
                  <JIGS-UP>
                  T)
                 (<==? ,P-WALK-DIR ,P?UP>
                  <TELL "You were planning to fly, perhaps?
Nah, you wouldn't want to try that without an " D ,PLANE ". There probably
won't be one showing up here, since you neglected to ask for one, so you're
doomed to die here in the jungle.">
                  <JIGS-UP>
                  T)>)
              (<VERB? FLY>
               <TELL "Right-ho. You are de... Oh -- sorry. Misheard
you. Thought you said \"Die\". Ah well; too late now.">
               <JIGS-UP>
               T)
              (T <>)>)
           (<AND <VERB? WALK>
             <==? ,P-WALK-DIR ,P?UP>>
        <TELL "What in?" CR>)
           (<VERB? FLY>
        <SETG LS-MOVE-COUNT 255>
        <TELL "You flap your arms wildly and, in defiance of the
laws of nature, rise slowly off the ground." CR>
        T)
           (T <>)>)
    (<==? .CONTEXT ,M-LOOK>
     <TELL "This is a bare landing strip surrounded by jungle. An
air shaft leads down." CR>)
    (<T? .CONTEXT> <>)
    (<VERB? EXAMINE LOOK-ON>
     <COND (<NOUN-USED? ,W?JUNGLE>
        <TELL "It's the usual impenetrable Zalagasan jungle." CR>)
           (T
        <PERFORM ,V?LOOK>)>)>>