Another gotoicide.
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index 4e066cb0191309f1133cd0f6c1670e2f5afbf7e2..f7a13aeb8ca1be10804611fdd655daf3e9d59350 100644 (file)
--- a/main.c
+++ b/main.c
 struct game_t game;
 
 long LNLENG, LNPOSN, PARMS[MAXPARMS+1];
 struct game_t game;
 
 long LNLENG, LNPOSN, PARMS[MAXPARMS+1];
-char rawbuf[LINESIZE], INLINE[LINESIZE+1], MAP1[129], MAP2[129];
+char rawbuf[LINESIZE], INLINE[LINESIZE+1];
 
 long AMBER, AXE, BACK, BATTER, BEAR, BIRD, BLOOD,
                BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST,
                CLAM, COINS, DOOR, DPRSSN, DRAGON, DWARF, EGGS,
                EMRALD, ENTER, ENTRNC, FIND, FISSUR, FOOD,
 
 long AMBER, AXE, BACK, BATTER, BEAR, BIRD, BLOOD,
                BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST,
                CLAM, COINS, DOOR, DPRSSN, DRAGON, DWARF, EGGS,
                EMRALD, ENTER, ENTRNC, FIND, FISSUR, FOOD,
-               GRATE, HINT, I, INVENT, J, JADE, K, KEYS,
-               KNIFE, L, LAMP, LOCK, LOOK, MAGZIN,
+               GRATE, HINT, INVENT, JADE, KEYS,
+               KNIFE, LAMP, LOCK, LOOK, MAGZIN,
                MESSAG, MIRROR, NUGGET, NUL, OGRE, OIL, OYSTER,
                PEARL, PILLOW, PLANT, PLANT2, PYRAM, RESER, ROD, ROD2,
                MESSAG, MIRROR, NUGGET, NUL, OGRE, OIL, OYSTER,
                PEARL, PILLOW, PLANT, PLANT2, PYRAM, RESER, ROD, ROD2,
-               RUBY, RUG, SAPPH, SAY, SECT, SIGN, SNAKE, SPK,
+               RUBY, RUG, SAPPH, SAY, SIGN, SNAKE,
                STEPS, STREAM, THROW, TRIDNT, TROLL, TROLL2,
                STEPS, STREAM, THROW, TRIDNT, TROLL, TROLL2,
-               URN, VASE, VEND,
-               VOLCAN, VRSION = 25, WATER, WD1, WD1X, WD2, WD2X;
+               URN, VASE, VEND, VOLCAN, WATER;
+long K, SPK, WD1, WD1X, WD2, WD2X;
+
 FILE  *logfp;
 bool oldstyle = false;
 lcg_state lcgstate;
 FILE  *logfp;
 bool oldstyle = false;
 lcg_state lcgstate;
@@ -67,7 +68,7 @@ int main(int argc, char *argv[])
 
     while ((ch = getopt(argc, argv, "l:o")) != EOF) {
        switch (ch) {
 
     while ((ch = getopt(argc, argv, "l:o")) != EOF) {
        switch (ch) {
-       case 'l':
+case 'l':
            logfp = fopen(optarg, "w");
            if (logfp == NULL)
                fprintf(stderr,
            logfp = fopen(optarg, "w");
            if (logfp == NULL)
                fprintf(stderr,
@@ -101,7 +102,6 @@ int main(int argc, char *argv[])
     set_seed(seedval);
 
     /*  Initialize game variables */
     set_seed(seedval);
 
     /*  Initialize game variables */
-    MAP2[1] = 0;
     if (!game.setup)
        initialise();
 
     if (!game.setup)
        initialise();
 
@@ -266,15 +266,15 @@ static bool dwarfmove(void)
        if(!INDEEP(game.loc) || (PCT(95) && (!CNDBIT(game.loc,4) || PCT(85))))
            return true;
        game.dflag=2;
        if(!INDEEP(game.loc) || (PCT(95) && (!CNDBIT(game.loc,4) || PCT(85))))
            return true;
        game.dflag=2;
-       for (I=1; I<=2; I++) {
-           J=1+randrange(NDWARVES-1);
+       for (int i=1; i<=2; i++) {
+           int j=1+randrange(NDWARVES-1);
            if(PCT(50))
            if(PCT(50))
-               game.dloc[J]=0;
+               game.dloc[j]=0;
        }
        }
-       for (I=1; I<=NDWARVES-1; I++) {
-           if(game.dloc[I] == game.loc)
-               game.dloc[I]=DALTLC;
-           game.odloc[I]=game.dloc[I];
+       for (int i=1; i<=NDWARVES-1; i++) {
+           if(game.dloc[i] == game.loc)
+               game.dloc[i]=DALTLC;
+           game.odloc[i]=game.dloc[i];
        }
        RSPEAK(3);
        DROP(AXE,game.loc);
        }
        RSPEAK(3);
        DROP(AXE,game.loc);
@@ -290,41 +290,42 @@ static bool dwarfmove(void)
     game.dtotal=0;
     attack=0;
     stick=0;
     game.dtotal=0;
     attack=0;
     stick=0;
-    for (I=1; I<=NDWARVES; I++) {
-       if(game.dloc[I] == 0)
+    for (int i=1; i<=NDWARVES; i++) {
+       int k;
+       if(game.dloc[i] == 0)
            continue;
        /*  Fill TK array with all the places this dwarf might go. */
            continue;
        /*  Fill TK array with all the places this dwarf might go. */
-       J=1;
-       kk=KEY[game.dloc[I]];
+       int j=1;
+       kk=KEY[game.dloc[i]];
        if(kk != 0)
            do {
                game.newloc=MOD(labs(TRAVEL[kk])/1000,1000);
                /* Have we avoided a dwarf enciounter? */
                bool avoided = (game.newloc > 300 ||
                                !INDEEP(game.newloc) ||
        if(kk != 0)
            do {
                game.newloc=MOD(labs(TRAVEL[kk])/1000,1000);
                /* Have we avoided a dwarf enciounter? */
                bool avoided = (game.newloc > 300 ||
                                !INDEEP(game.newloc) ||
-                               game.newloc == game.odloc[I] ||
-                               (J > 1 && game.newloc == TK[J-1]) ||
-                               J >= 20 ||
-                               game.newloc == game.dloc[I] ||
+                               game.newloc == game.odloc[i] ||
+                               (j > 1 && game.newloc == TK[j-1]) ||
+                               j >= 20 ||
+                               game.newloc == game.dloc[i] ||
                                FORCED(game.newloc) ||
                                FORCED(game.newloc) ||
-                               (I == PIRATE && CNDBIT(game.newloc,3)) ||
+                               (i == PIRATE && CNDBIT(game.newloc,3)) ||
                                labs(TRAVEL[kk])/1000000 == 100);
                if (!avoided) {
                                labs(TRAVEL[kk])/1000000 == 100);
                if (!avoided) {
-                   TK[J++] = game.newloc;
+                   TK[j++] = game.newloc;
                }
                ++kk;
            } while
                (TRAVEL[kk-1] >= 0);
                }
                ++kk;
            } while
                (TRAVEL[kk-1] >= 0);
-       TK[J]=game.odloc[I];
-       if(J >= 2)
-           --J;
-       J=1+randrange(J);
-       game.odloc[I]=game.dloc[I];
-       game.dloc[I]=TK[J];
-       game.dseen[I]=(game.dseen[I] && INDEEP(game.loc)) || (game.dloc[I] == game.loc || game.odloc[I] == game.loc);
-       if(!game.dseen[I]) continue;
-       game.dloc[I]=game.loc;
-       if(I == PIRATE) {
+       TK[j]=game.odloc[i];
+       if(j >= 2)
+           --j;
+       j=1+randrange(j);
+       game.odloc[i]=game.dloc[i];
+       game.dloc[i]=TK[j];
+       game.dseen[i]=(game.dseen[i] && INDEEP(game.loc)) || (game.dloc[i] == game.loc || game.odloc[i] == game.loc);
+       if(!game.dseen[i]) continue;
+       game.dloc[i]=game.loc;
+       if(i == PIRATE) {
            /*  The pirate's spotted him.  He leaves him alone once we've
             *  found chest.  K counts if a treasure is here.  If not, and
             *  tally=1 for an unseen chest, let the pirate be spotted.
            /*  The pirate's spotted him.  He leaves him alone once we've
             *  found chest.  K counts if a treasure is here.  If not, and
             *  tally=1 for an unseen chest, let the pirate be spotted.
@@ -333,61 +334,64 @@ static bool dwarfmove(void)
             *  (game.prop=0). */
            if(game.loc == game.chloc || game.prop[CHEST] >= 0)
                continue;
             *  (game.prop=0). */
            if(game.loc == game.chloc || game.prop[CHEST] >= 0)
                continue;
-           K=0;
-           for (J=MINTRS; J<=MAXTRS; J++) {
-               /*  Pirate won't take pyramid from plover room or dark
-               *  room (too easy!). */
-               if(J == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD]))
-                   goto L6020;
-               if(TOTING(J)) {
-                   goto L6021;
+           k=0;
+           for (int j=MINTRS; j<=MAXTRS; j++) {
+               /*  Pirate won't take pyramid from plover room or dark
+                *  room (too easy!). */
+               if(j == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD])) {
+                   if(HERE(j))
+                       k=1;
+                   continue;
+               }
+               if(TOTING(j)) {
+                   if(game.place[CHEST] == 0) {
+                       /*  Install chest only once, to insure it is
+                        *  the last treasure in the list. */
+                       MOVE(CHEST,game.chloc);
+                       MOVE(MESSAG,game.chloc2);
+                   }
+                   RSPEAK(128);
+                   for (int j=MINTRS; j<=MAXTRS; j++) {
+                       if (!(j == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD]))) {
+                           if(AT(j) && game.fixed[j] == 0)
+                               CARRY(j,game.loc);
+                           if(TOTING(j))
+                               DROP(j,game.chloc);
+                       }
+                   }
+                   game.dloc[PIRATE]=game.chloc;
+                   game.odloc[PIRATE]=game.chloc;
+                   game.dseen[PIRATE]=false;
+                   goto jumpout;
                }
                }
-           L6020:
-               if(HERE(J))
-                   K=1;
+               if(HERE(j))
+                   k=1;
            }
            }
-           if(game.tally == 1 && K == 0 && game.place[CHEST] == 0 && HERE(LAMP) && game.prop[LAMP] == 1) {
+           /* Force chest placement before player finds last treasure */
+           if(game.tally == 1 && k == 0 && game.place[CHEST] == 0 && HERE(LAMP) && game.prop[LAMP] == 1) {
                RSPEAK(186);
                MOVE(CHEST,game.chloc);
                MOVE(MESSAG,game.chloc2);
                RSPEAK(186);
                MOVE(CHEST,game.chloc);
                MOVE(MESSAG,game.chloc2);
-               goto L6024;
+               game.dloc[PIRATE]=game.chloc;
+               game.odloc[PIRATE]=game.chloc;
+               game.dseen[PIRATE]=false;
+               continue;
            }
            if(game.odloc[PIRATE] != game.dloc[PIRATE] && PCT(20))
                RSPEAK(127);
            continue;
            }
            if(game.odloc[PIRATE] != game.dloc[PIRATE] && PCT(20))
                RSPEAK(127);
            continue;
-
-       L6021:
-           if(game.place[CHEST] == 0) {
-               /*  Install chest only once, to insure it is the last treasure in
-                *  the list. */
-               MOVE(CHEST,game.chloc);
-               MOVE(MESSAG,game.chloc2);
-           }
-           RSPEAK(128);
-           for (J=MINTRS; J<=MAXTRS; J++) {
-               if (!(J == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD]))) {
-                   if(AT(J) && game.fixed[J] == 0)
-                       CARRY(J,game.loc);
-                   if(TOTING(J))
-                       DROP(J,game.chloc);
-               }
-           }
-       L6024:
-           game.dloc[PIRATE]=game.chloc;
-           game.odloc[PIRATE]=game.chloc;
-           game.dseen[PIRATE]=false;
-           continue;
        }
 
        /* This threatening little dwarf is in the room with him! */
        ++game.dtotal;
        }
 
        /* This threatening little dwarf is in the room with him! */
        ++game.dtotal;
-       if(game.odloc[I] == game.dloc[I]) {
+       if(game.odloc[i] == game.dloc[i]) {
            ++attack;
            if(game.knfloc >= 0)
                game.knfloc=game.loc;
            if(randrange(1000) < 95*(game.dflag-2))
                ++stick;
        }
            ++attack;
            if(game.knfloc >= 0)
                game.knfloc=game.loc;
            if(randrange(1000) < 95*(game.dflag-2))
                ++stick;
        }
+    jumpout:;
     }
 
     /*  Now we know what's happening.  Let's tell the poor sucker about it.
     }
 
     /*  Now we know what's happening.  Let's tell the poor sucker about it.
@@ -412,6 +416,59 @@ static bool dwarfmove(void)
     return false;
 }
 
     return false;
 }
 
+/*  "You're dead, Jim."
+ *
+ *  If the current loc is zero, it means the clown got himself killed.
+ *  We'll allow this maxdie times.  MAXDIE is automatically set based
+ *  on the number of snide messages available.  Each death results in
+ *  a message (81, 83, etc.)  which offers reincarnation; if accepted,
+ *  this results in message 82, 84, etc.  The last time, if he wants
+ *  another chance, he gets a snide remark as we exit.  When
+ *  reincarnated, all objects being carried get dropped at game.oldlc2
+ *  (presumably the last place prior to being killed) without change
+ *  of props.  the loop runs backwards to assure that the bird is
+ *  dropped before the cage.  (this kluge could be changed once we're
+ *  sure all references to bird and cage are done by keywords.)  The
+ *  lamp is a special case (it wouldn't do to leave it in the cave).
+ *  It is turned off and left outside the building (only if he was
+ *  carrying it, of course).  He himself is left inside the building
+ *  (and heaven help him if he tries to xyzzy back into the cave
+ *  without the lamp!).  game.oldloc is zapped so he can't just
+ *  "retreat". */
+
+static void croak(FILE *cmdin)
+/*  Okay, he's dead.  Let's get on with it. */
+{
+    if(game.closng) {
+       /*  He died during closing time.  No resurrection.  Tally up a
+        *  death and exit. */
+       RSPEAK(131);
+       ++game.numdie;
+       score(0);
+    } else {
+       ++game.numdie;
+       if(!YES(cmdin,79+game.numdie*2,80+game.numdie*2,54))
+           score(0);
+       if(game.numdie == MAXDIE)
+           score(0);
+       game.place[WATER]=0;
+       game.place[OIL]=0;
+       if(TOTING(LAMP))
+           game.prop[LAMP]=0;
+       for (int j=1; j<=NOBJECTS; j++) {
+           int i=NOBJECTS + 1 - j;
+           if(TOTING(i)) {
+               int k=game.oldlc2;
+               if(i == LAMP)
+                   k=1;
+               DROP(i,k);
+           }
+       }
+       game.loc=3;
+       game.oldloc=game.loc;
+    }
+}
+
 static bool do_command(FILE *cmdin) {
        long LL, KQ, VERB, KK, K2, V1, V2;
        long obj, i;
 static bool do_command(FILE *cmdin) {
        long LL, KQ, VERB, KK, K2, V1, V2;
        long obj, i;
@@ -441,35 +498,48 @@ static bool do_command(FILE *cmdin) {
        game.loc=game.newloc;
 
        if (!dwarfmove())
        game.loc=game.newloc;
 
        if (!dwarfmove())
-           goto L99;
+           croak(cmdin);
 
 
-/*  Describe the current location and (maybe) get next command. */
+       /*  Describe the current location and (maybe) get next command. */
 
 
-/*  Print text for current loc. */
+       /*  Print text for current loc. */
 
 
-L2000: if(game.loc == 0) goto L99;
+L2000: if(game.loc == 0)
+           croak(cmdin);
        KK=STEXT[game.loc];
        KK=STEXT[game.loc];
-       if(MOD(game.abbrev[game.loc],game.abbnum) == 0 || KK == 0)KK=LTEXT[game.loc];
-       if(FORCED(game.loc) || !DARK(0)) goto L2001;
-       if(game.wzdark && PCT(35)) goto L90;
-       KK=RTEXT[16];
-L2001: if(TOTING(BEAR))RSPEAK(141);
+       if(MOD(game.abbrev[game.loc],game.abbnum) == 0 || KK == 0)
+           KK=LTEXT[game.loc];
+       if(!FORCED(game.loc) && DARK(0)) {
+           /*  The easiest way to get killed is to fall into a pit in
+            *  pitch darkness. */
+           if(game.wzdark && PCT(35)) {
+               RSPEAK(23);
+               game.oldlc2 = game.loc;
+               croak(cmdin);
+               goto L2000;
+           }
+           KK=RTEXT[16];
+       }
+       if(TOTING(BEAR))RSPEAK(141);
        SPEAK(KK);
        K=1;
        SPEAK(KK);
        K=1;
-       if(FORCED(game.loc)) goto L8;
+       if(FORCED(game.loc))
+           goto L8;
        if(game.loc == 33 && PCT(25) && !game.closng)RSPEAK(7);
 
        if(game.loc == 33 && PCT(25) && !game.closng)RSPEAK(7);
 
-/*  Print out descriptions of objects at this location.  If not closing and
- *  property value is negative, tally off another treasure.  Rug is special
- *  case; once seen, its game.prop is 1 (dragon on it) till dragon is killed.
- *  Similarly for chain; game.prop is initially 1 (locked to bear).  These hacks
- *  are because game.prop=0 is needed to get full score. */
+       /*  Print out descriptions of objects at this location.  If
+        *  not closing and property value is negative, tally off
+        *  another treasure.  Rug is special case; once seen, its
+        *  game.prop is 1 (dragon on it) till dragon is killed.
+        *  Similarly for chain; game.prop is initially 1 (locked to
+        *  bear).  These hacks are because game.prop=0 is needed to
+        *  get full score. */
 
        if(DARK(0)) goto L2012;
        game.abbrev[game.loc]=game.abbrev[game.loc]+1;
 
        if(DARK(0)) goto L2012;
        game.abbrev[game.loc]=game.abbrev[game.loc]+1;
-       I=game.atloc[game.loc];
-L2004: if(I == 0) goto L2012;
-       obj=I;
+       i=game.atloc[game.loc];
+L2004: if(i == 0) goto L2012;
+       obj=i;
        if(obj > NOBJECTS)obj=obj-NOBJECTS;
        if(obj == STEPS && TOTING(NUGGET)) goto L2008;
        if(game.prop[obj] >= 0) goto L2006;
        if(obj > NOBJECTS)obj=obj-NOBJECTS;
        if(obj == STEPS && TOTING(NUGGET)) goto L2008;
        if(game.prop[obj] >= 0) goto L2006;
@@ -491,7 +561,7 @@ L2004:      if(I == 0) goto L2012;
 L2006: KK=game.prop[obj];
        if(obj == STEPS && game.loc == game.fixed[STEPS])KK=1;
        PSPEAK(obj,KK);
 L2006: KK=game.prop[obj];
        if(obj == STEPS && game.loc == game.fixed[STEPS])KK=1;
        PSPEAK(obj,KK);
-L2008: I=game.link[I];
+L2008: i=game.link[i];
         goto L2004;
 
 L2009: K=54;
         goto L2004;
 
 L2009: K=54;
@@ -536,7 +606,7 @@ L2603:      if(game.closed) {
            game.knfloc=0;
 
        /* This is where we get a new command from the user */
            game.knfloc=0;
 
        /* This is where we get a new command from the user */
-       if (!GETIN(cmdin, WD1,WD1X,WD2,WD2X))
+       if (!GETIN(cmdin, &WD1,&WD1X,&WD2,&WD2X))
            return false;
 
        /*  Every input, check "game.foobar" flag.  If zero, nothing's
            return false;
 
        /*  Every input, check "game.foobar" flag.  If zero, nothing's
@@ -559,8 +629,8 @@ L2607:      game.foobar=(game.foobar>0 ? -game.foobar : 0);
        if(game.clock1 < 0)game.clock2=game.clock2-1;
        if(game.clock2 == 0) goto L11000;
        if(game.prop[LAMP] == 1)game.limit=game.limit-1;
        if(game.clock1 < 0)game.clock2=game.clock2-1;
        if(game.clock2 == 0) goto L11000;
        if(game.prop[LAMP] == 1)game.limit=game.limit-1;
-       if(game.limit <= 30 && HERE(BATTER) && game.prop[BATTER] == 0 && HERE(LAMP)) goto
-               L12000;
+       if(game.limit <= 30 && HERE(BATTER) && game.prop[BATTER] == 0 && HERE(LAMP))
+           goto L12000;
        if(game.limit == 0) goto L12400;
        if(game.limit <= 30) goto L12200;
 L19999: K=43;
        if(game.limit == 0) goto L12400;
        if(game.limit <= 30) goto L12200;
 L19999: K=43;
@@ -583,11 +653,11 @@ L2620:    if(WD1 == MAKEWD(23051920)) {
                RSPEAK(276);
        }
 L2630:
                RSPEAK(276);
        }
 L2630:
-       I=VOCAB(WD1,-1);
-       if(I == -1)
+       i=VOCAB(WD1,-1);
+       if(i == -1)
           goto L3000;
           goto L3000;
-       K=MOD(I,1000);
-       KQ=I/1000+1;
+       K=MOD(i,1000);
+       KQ=i/1000+1;
         switch (KQ-1) { case 0: goto L8; case 1: goto L5000; case 2: goto L4000;
                case 3: goto L2010; }
        BUG(22);
         switch (KQ-1) { case 0: goto L8; case 1: goto L5000; case 2: goto L4000;
                case 3: goto L2010; }
        BUG(22);
@@ -609,11 +679,11 @@ L3000:    SETPRM(1,WD1,WD1X);
 
 /* Verb and object analysis moved to separate module. */
 
 
 /* Verb and object analysis moved to separate module. */
 
-L4000: I=4000; VERB=K; goto Laction;
-L4090: I=4090; goto Laction;
-L5000: I=5000;
+L4000: i=4000; VERB=K; goto Laction;
+L4090: i=4090; goto Laction;
+L5000: i=5000; obj = K;
 Laction:
 Laction:
-        switch (action(cmdin, I, VERB, obj)) {
+        switch (action(cmdin, i, VERB, obj)) {
           case 2: return true;
           case 8: goto L8;
           case 2000: goto L2000;
           case 2: return true;
           case 8: goto L8;
           case 2000: goto L2000;
@@ -690,7 +760,20 @@ L8:        KK=KEY[game.loc];
 
 L9:    LL=labs(TRAVEL[KK]);
        if(MOD(LL,1000) == 1 || MOD(LL,1000) == K) goto L10;
 
 L9:    LL=labs(TRAVEL[KK]);
        if(MOD(LL,1000) == 1 || MOD(LL,1000) == K) goto L10;
-       if(TRAVEL[KK] < 0) goto L50;
+       if(TRAVEL[KK] < 0) {
+           /*  Non-applicable motion.  Various messages depending on
+            *  word given. */
+           SPK=12;
+           if(K >= 43 && K <= 50)SPK=52;
+           if(K == 29 || K == 30)SPK=52;
+           if(K == 7 || K == 36 || K == 37)SPK=10;
+           if(K == 11 || K == 19)SPK=11;
+           if(VERB == FIND || VERB == INVENT)SPK=59;
+           if(K == 62 || K == 65)SPK=42;
+           if(K == 17)SPK=80;
+           RSPEAK(SPK);
+           return true;
+       }
        KK=KK+1;
        goto L9;
 
        KK=KK+1;
        goto L9;
 
@@ -770,102 +853,33 @@ L30310: game.newloc=PLAC[TROLL]+FIXD[TROLL]-game.loc;
        game.fixed[BEAR]= -1;
        game.prop[BEAR]=3;
        game.oldlc2=game.newloc;
        game.fixed[BEAR]= -1;
        game.prop[BEAR]=3;
        game.oldlc2=game.newloc;
-        goto L99;
+       croak(cmdin);
+       goto L2000;
 
 /*  End of specials. */
 
 
 /*  End of specials. */
 
-
 L21:   LL=MOD((labs(TRAVEL[KK])/1000),1000);
        if(LL != K) {
 L21:   LL=MOD((labs(TRAVEL[KK])/1000),1000);
        if(LL != K) {
-               if(LL <= 300) {
-                       J=KEY[LL];
-                       if(FORCED(LL) && MOD((labs(TRAVEL[J])/1000),1000) == K)
-                               K2=KK;
-               }
-               if(TRAVEL[KK] < 0)
-                   goto L23;
-               KK=KK+1;
-               goto L21;
-
-L23:           KK=K2;
-               if(KK == 0) {
-                       RSPEAK(140);
-                       return true;
-               }
+           if(LL <= 300) {
+               if(FORCED(LL) && MOD((labs(TRAVEL[KEY[LL]])/1000),1000) == K)
+                   K2=KK;
+           }
+           if(TRAVEL[KK] < 0)
+               goto L23;
+           KK=KK+1;
+           goto L21;
+
+       L23:            KK=K2;
+           if(KK == 0) {
+               RSPEAK(140);
+               return true;
+           }
        }
 
        K=MOD(labs(TRAVEL[KK]),1000);
        KK=KEY[game.loc];
        goto L9;
 
        }
 
        K=MOD(labs(TRAVEL[KK]),1000);
        KK=KEY[game.loc];
        goto L9;
 
-
-/*  Non-applicable motion.  Various messages depending on word given. */
-
-L50:   SPK=12;
-       if(K >= 43 && K <= 50)SPK=52;
-       if(K == 29 || K == 30)SPK=52;
-       if(K == 7 || K == 36 || K == 37)SPK=10;
-       if(K == 11 || K == 19)SPK=11;
-       if(VERB == FIND || VERB == INVENT)SPK=59;
-       if(K == 62 || K == 65)SPK=42;
-       if(K == 17)SPK=80;
-       RSPEAK(SPK);
-       return true;
-
-/*  "You're dead, Jim."
- *
- *  If the current loc is zero, it means the clown got himself killed.  We'll
- *  allow this maxdie times.  MAXDIE is automatically set based on the number of
- *  snide messages available.  Each death results in a message (81, 83, etc.)
- *  which offers reincarnation; if accepted, this results in message 82, 84,
- *  etc.  The last time, if he wants another chance, he gets a snide remark as
- *  we exit.  When reincarnated, all objects being carried get dropped at game.oldlc2
- *  (presumably the last place prior to being killed) without change of props.
- *  the loop runs backwards to assure that the bird is dropped before the cage.
- *  (this kluge could be changed once we're sure all references to bird and cage
- *  are done by keywords.)  The lamp is a special case (it wouldn't do to leave
- *  it in the cave).  It is turned off and left outside the building (only if he
- *  was carrying it, of course).  He himself is left inside the building (and
- *  heaven help him if he tries to xyzzy back into the cave without the lamp!).
- *  game.oldloc is zapped so he can't just "retreat". */
-
-/*  The easiest way to get killed is to fall into a pit in pitch darkness. */
-
-L90:   RSPEAK(23);
-       game.oldlc2=game.loc;
-
-/*  Okay, he's dead.  Let's get on with it. */
-
-L99:   if(game.closng) {
-       /*  He died during closing time.  No resurrection.  Tally up a
-        *  death and exit. */
-           RSPEAK(131);
-           ++game.numdie;
-           score(0);
-       } else {
-           ++game.numdie;
-           if(!YES(cmdin,79+game.numdie*2,80+game.numdie*2,54))
-               score(0);
-           if(game.numdie == MAXDIE)
-               score(0);
-           game.place[WATER]=0;
-           game.place[OIL]=0;
-           if(TOTING(LAMP))
-               game.prop[LAMP]=0;
-           for (J=1; J<=NOBJECTS; J++) {
-               I=NOBJECTS + 1 - J;
-               if(TOTING(I)) {
-                   K=game.oldlc2;
-                   if(I == LAMP)
-                       K=1;
-                   DROP(I,K);
-               }
-           }
-           game.loc=3;
-           game.oldloc=game.loc;
-           goto L2000;
-       }
-
 /*  Cave closing and scoring */
 
 
 /*  Cave closing and scoring */
 
 
@@ -900,10 +914,10 @@ L99:      if(game.closng) {
 
 L10000: game.prop[GRATE]=0;
        game.prop[FISSUR]=0;
 
 L10000: game.prop[GRATE]=0;
        game.prop[FISSUR]=0;
-       for (I=1; I<=NDWARVES; I++) {
-       game.dseen[I]=false;
-       game.dloc[I]=0;
-       } /* end loop */
+       for (i=1; i<=NDWARVES; i++) {
+           game.dseen[i]=false;
+           game.dloc[i]=0;
+       }
        MOVE(TROLL,0);
        MOVE(TROLL+NOBJECTS,0);
        MOVE(TROLL2,PLAC[TROLL]);
        MOVE(TROLL,0);
        MOVE(TROLL+NOBJECTS,0);
        MOVE(TROLL2,PLAC[TROLL]);
@@ -917,7 +931,7 @@ L10000: game.prop[GRATE]=0;
        RSPEAK(129);
        game.clock1= -1;
        game.closng=true;
        RSPEAK(129);
        game.clock1= -1;
        game.closng=true;
-        goto L19999;
+       goto L19999;
 
 /*  Once he's panicked, and clock2 has run out, we come here to set up the
  *  storage room.  The room has two locs, hardwired as 115 (ne) and 116 (sw).
 
 /*  Once he's panicked, and clock2 has run out, we come here to set up the
  *  storage room.  The room has two locs, hardwired as 115 (ne) and 116 (sw).
@@ -944,8 +958,8 @@ L11000: game.prop[BOTTLE]=PUT(BOTTLE,115,1);
 
 /*  Leave the grate with normal (non-negative) property.  Reuse sign. */
 
 
 /*  Leave the grate with normal (non-negative) property.  Reuse sign. */
 
-       I=PUT(GRATE,116,0);
-       I=PUT(SIGN,116,0);
+       PUT(GRATE,116,0);
+       PUT(SIGN,116,0);
        OBJTXT[SIGN]=OBJTXT[SIGN]+1;
        game.prop[SNAKE]=PUT(SNAKE,116,1);
        game.prop[BIRD]=PUT(BIRD,116,1);
        OBJTXT[SIGN]=OBJTXT[SIGN]+1;
        game.prop[SNAKE]=PUT(SNAKE,116,1);
        game.prop[BIRD]=PUT(BIRD,116,1);
@@ -956,9 +970,9 @@ L11000: game.prop[BOTTLE]=PUT(BOTTLE,115,1);
        game.prop[MIRROR]=PUT(MIRROR,115,0);
        game.fixed[MIRROR]=116;
 
        game.prop[MIRROR]=PUT(MIRROR,115,0);
        game.fixed[MIRROR]=116;
 
-       for (I=1; I<=NOBJECTS; I++) {
-               if(TOTING(I))
-                       DSTROY(I);
+       for (int i=1; i<=NOBJECTS; i++) {
+               if(TOTING(i))
+                       DSTROY(i);
        } /* end loop */
 
        RSPEAK(132);
        } /* end loop */
 
        RSPEAK(132);