Pack more globals into the game block structure.
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index ea620fce3fa26c232a65cc956daad25862d29511..b3310bb535e5076b12aac31cc57e4271a69119b5 100644 (file)
--- a/main.c
+++ b/main.c
@@ -9,22 +9,22 @@
 #include <getopt.h>
 #include <signal.h>
 #include <time.h>
 #include <getopt.h>
 #include <signal.h>
 #include <time.h>
-#include "main.h"
+#include "advent.h"
 #include "database.h"
 #include "database.h"
-#include "misc.h"
 
 
-long ABB[186], ATLOC[186], BLKLIN = true, DFLAG,
-               DLOC[7], FIXED[101], HOLDNG,
-               LINK[201], LNLENG, LNPOSN,
-               PARMS[26], PLACE[101],
+struct game_t game;
+
+long ABB[186], ATLOC[186], DFLAG,
+               FIXED[NOBJECTS+1], HOLDNG,
+               LINK[NOBJECTS*2 + 1], LNLENG, LNPOSN,
+               PARMS[26], PLACE[NOBJECTS+1],
                SETUP = 0;
                SETUP = 0;
-signed char rawbuf[LINESIZE], INLINE[LINESIZE+1], MAP1[129], MAP2[129];
+char rawbuf[LINESIZE], INLINE[LINESIZE+1], MAP1[129], MAP2[129];
 
 
-long ABBNUM, AMBER, ATTACK, AXE, BACK, BATTER, BEAR, BIRD, BLOOD, BONUS,
-                BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST, CHLOC, CHLOC2,
-               CLAM, CLOCK1, CLOCK2, CLOSED, CLOSNG, CLSHNT,
-               COINS, CONDS, DALTLC, DETAIL,
-                DKILL, DOOR, DPRSSN, DRAGON, DSEEN[7], DTOTAL, DWARF, EGGS,
+long AMBER, ATTACK, AXE, BACK, BATTER, BEAR, BIRD, BLOOD,
+               BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST,
+               CLAM, CLSHNT, COINS, DALTLC,
+               DOOR, DPRSSN, DRAGON, DWARF, EGGS,
                EMRALD, ENTER, ENTRNC, FIND, FISSUR, FOOBAR, FOOD,
                GRATE, HINT, HINTED[21], HINTLC[21],
                I, INVENT, IGO, IWEST, J, JADE, K, K2, KEYS, KK,
                EMRALD, ENTER, ENTRNC, FIND, FISSUR, FOOBAR, FOOD,
                GRATE, HINT, HINTED[21], HINTLC[21],
                I, INVENT, IGO, IWEST, J, JADE, K, K2, KEYS, KK,
@@ -33,15 +33,14 @@ long ABBNUM, AMBER, ATTACK, AXE, BACK, BATTER, BEAR, BIRD, BLOOD, BONUS,
                MAGZIN, MAXDIE, MAXTRS,
                MESSAG, MIRROR, MXSCOR,
                NEWLOC, NOVICE, NUGGET, NUL, NUMDIE, OBJ,
                MAGZIN, MAXDIE, MAXTRS,
                MESSAG, MIRROR, MXSCOR,
                NEWLOC, NOVICE, NUGGET, NUL, NUMDIE, OBJ,
-               ODLOC[7], OGRE, OIL, OLDLC2, OLDLOC, OLDOBJ, OYSTER,
-               PANIC, PEARL, PILLOW, PLANT, PLANT2, PROP[101], PYRAM,
+               OGRE, OIL, OLDOBJ, OYSTER,
+               PANIC, PEARL, PILLOW, PLANT, PLANT2, PROP[NOBJECTS+1], PYRAM,
                RESER, ROD, ROD2, RUBY, RUG, SAPPH, SAVED, SAY,
                SCORE, SECT, SIGN, SNAKE, SPK, STEPS, STICK,
                STREAM, TALLY, THRESH, THROW, TK[21], TRIDNT,
                TRNDEX, TRNLUZ, TROLL, TROLL2,
                RESER, ROD, ROD2, RUBY, RUG, SAPPH, SAVED, SAY,
                SCORE, SECT, SIGN, SNAKE, SPK, STEPS, STICK,
                STREAM, TALLY, THRESH, THROW, TK[21], TRIDNT,
                TRNDEX, TRNLUZ, TROLL, TROLL2,
-                TURNS, URN, V1, V2, VASE, VEND, VERB,
-               VOLCAN, VRSION = 25, WATER, WD1, WD1X, WD2, WD2X,
-               WZDARK = false, ZZWORD;
+               TURNS, URN, V1, V2, VASE, VEND, VERB,
+               VOLCAN, VRSION = 25, WATER, WD1, WD1X, WD2, WD2X;
 FILE  *logfp;
 bool oldstyle = false;
 lcg_state lcgstate;
 FILE  *logfp;
 bool oldstyle = false;
 lcg_state lcgstate;
@@ -95,13 +94,13 @@ int main(int argc, char *argv[]) {
 
 /* Logical variables:
  *
 
 /* Logical variables:
  *
- *  CLOSED says whether we're all the way closed
- *  CLOSNG says whether it's closing time yet
+ *  game.closed says whether we're all the way closed
+ *  game.closng says whether it's closing time yet
  *  CLSHNT says whether he's read the clue in the endgame
  *  LMWARN says whether he's been warned about lamp going dim
  *  NOVICE says whether he asked for instructions at start-up
  *  PANIC says whether he's found out he's trapped in the cave
  *  CLSHNT says whether he's read the clue in the endgame
  *  LMWARN says whether he's been warned about lamp going dim
  *  NOVICE says whether he asked for instructions at start-up
  *  PANIC says whether he's found out he's trapped in the cave
- *  WZDARK says whether the loc he's leaving was dark */
+ *  game.wzdark says whether the loc he's leaving was dark */
 
 #include "funcs.h"
 
 
 #include "funcs.h"
 
@@ -132,7 +131,7 @@ int main(int argc, char *argv[]) {
 
 L1:    SETUP= -1;
        I=0;
 
 L1:    SETUP= -1;
        I=0;
-       ZZWORD=RNDVOC(3,0);
+       game.zzword=RNDVOC(3,0);
        NOVICE=YES(stdin, 65,1,0);
        NEWLOC=1;
        LOC=1;
        NOVICE=YES(stdin, 65,1,0);
        NEWLOC=1;
        LOC=1;
@@ -141,7 +140,7 @@ L1: SETUP= -1;
 
        if (logfp)
            fprintf(logfp, "seed %ld\n", seedval);
 
        if (logfp)
            fprintf(logfp, "seed %ld\n", seedval);
-       
+
        for (;;) {
            if (!do_command(stdin))
                break;
        for (;;) {
            if (!do_command(stdin))
                break;
@@ -149,7 +148,7 @@ L1: SETUP= -1;
        score(1);
 }
 
        score(1);
 }
 
-static bool fallback_handler(signed char *buf)
+static bool fallback_handler(char *buf)
 /* fallback handler for commands not handled by FORTRANish parser */
 {
     long sv;
 /* fallback handler for commands not handled by FORTRANish parser */
 {
     long sv;
@@ -159,7 +158,7 @@ static bool fallback_handler(signed char *buf)
        // autogenerated, so don't charge user time for it.
        --TURNS;
        // here we reconfigure any global game state that uses random numbers
        // autogenerated, so don't charge user time for it.
        --TURNS;
        // here we reconfigure any global game state that uses random numbers
-       ZZWORD=RNDVOC(3,0);
+       game.zzword=RNDVOC(3,0);
        return true;
     }
     return false;
        return true;
     }
     return false;
@@ -169,10 +168,10 @@ static bool do_command(FILE *cmdin) {
 
 /*  Can't leave cave once it's closing (except by main office). */
 
 
 /*  Can't leave cave once it's closing (except by main office). */
 
-       if(!OUTSID(NEWLOC) || NEWLOC == 0 || !CLOSNG) goto L71;
+       if(!OUTSID(NEWLOC) || NEWLOC == 0 || !game.closng) goto L71;
        RSPEAK(130);
        NEWLOC=LOC;
        RSPEAK(130);
        NEWLOC=LOC;
-       if(!PANIC)CLOCK2=15;
+       if(!PANIC)game.clock2=15;
        PANIC=true;
 
 /*  See if a dwarf has seen him and has come from where he wants to go.  If so,
        PANIC=true;
 
 /*  See if a dwarf has seen him and has come from where he wants to go.  If so,
@@ -180,8 +179,8 @@ static bool do_command(FILE *cmdin) {
  *  (dwarves rooted in place) let him get out (and attacked). */
 
 L71:   if(NEWLOC == LOC || FORCED(LOC) || CNDBIT(LOC,3)) goto L74;
  *  (dwarves rooted in place) let him get out (and attacked). */
 
 L71:   if(NEWLOC == LOC || FORCED(LOC) || CNDBIT(LOC,3)) goto L74;
-       /* 73 */ for (I=1; I<=5; I++) {
-       if(ODLOC[I] != NEWLOC || !DSEEN[I]) goto L73;
+       /* 73 */ for (I=1; I<=NDWARVES-1; I++) {
+       if(game.odloc[I] != NEWLOC || !game.dseen[I]) goto L73;
        NEWLOC=LOC;
        RSPEAK(2);
         goto L74;
        NEWLOC=LOC;
        RSPEAK(2);
         goto L74;
@@ -211,12 +210,12 @@ L6000:    if(DFLAG != 1) goto L6010;
        if(!INDEEP(LOC) || (PCT(95) && (!CNDBIT(LOC,4) || PCT(85)))) goto L2000;
        DFLAG=2;
        for (I=1; I<=2; I++) {
        if(!INDEEP(LOC) || (PCT(95) && (!CNDBIT(LOC,4) || PCT(85)))) goto L2000;
        DFLAG=2;
        for (I=1; I<=2; I++) {
-       J=1+randrange(5);
-       if(PCT(50))DLOC[J]=0;
+       J=1+randrange(NDWARVES-1);
+       if(PCT(50))game.dloc[J]=0;
        } /* end loop */
        } /* end loop */
-       for (I=1; I<=5; I++) {
-       if(DLOC[I] == LOC)DLOC[I]=DALTLC;
-       ODLOC[I]=DLOC[I];
+       for (I=1; I<=NDWARVES-1; I++) {
+       if(game.dloc[I] == LOC)game.dloc[I]=DALTLC;
+       game.odloc[I]=game.dloc[I];
        } /* end loop */
        RSPEAK(3);
        DROP(AXE,LOC);
        } /* end loop */
        RSPEAK(3);
        DROP(AXE,LOC);
@@ -227,34 +226,34 @@ L6000:    if(DFLAG != 1) goto L6010;
  *  they don't back up unless there's no alternative.  If they don't have to
  *  move, they attack.  And, of course, dead dwarves don't do much of anything. */
 
  *  they don't back up unless there's no alternative.  If they don't have to
  *  move, they attack.  And, of course, dead dwarves don't do much of anything. */
 
-L6010: DTOTAL=0;
+L6010: game.dtotal=0;
        ATTACK=0;
        STICK=0;
        ATTACK=0;
        STICK=0;
-       /* 6030 */ for (I=1; I<=6; I++) {
-       if(DLOC[I] == 0) goto L6030;
+       /* 6030 */ for (I=1; I<=NDWARVES; I++) {
+       if(game.dloc[I] == 0) goto L6030;
 /*  Fill TK array with all the places this dwarf might go. */
        J=1;
 /*  Fill TK array with all the places this dwarf might go. */
        J=1;
-       KK=DLOC[I];
+       KK=game.dloc[I];
        KK=KEY[KK];
        if(KK == 0) goto L6016;
        KK=KEY[KK];
        if(KK == 0) goto L6016;
-L6012: NEWLOC=MOD(IABS(TRAVEL[KK])/1000,1000);
+L6012: NEWLOC=MOD(labs(TRAVEL[KK])/1000,1000);
        {long x = J-1;
        {long x = J-1;
-       if(NEWLOC > 300 || !INDEEP(NEWLOC) || NEWLOC == ODLOC[I] || (J > 1 &&
-               NEWLOC == TK[x]) || J >= 20 || NEWLOC == DLOC[I] ||
+       if(NEWLOC > 300 || !INDEEP(NEWLOC) || NEWLOC == game.odloc[I] || (J > 1 &&
+               NEWLOC == TK[x]) || J >= 20 || NEWLOC == game.dloc[I] ||
                FORCED(NEWLOC) || (I == 6 && CNDBIT(NEWLOC,3)) ||
                FORCED(NEWLOC) || (I == 6 && CNDBIT(NEWLOC,3)) ||
-               IABS(TRAVEL[KK])/1000000 == 100) goto L6014;}
+               labs(TRAVEL[KK])/1000000 == 100) goto L6014;}
        TK[J]=NEWLOC;
        J=J+1;
 L6014: KK=KK+1;
        {long x = KK-1; if(TRAVEL[x] >= 0) goto L6012;}
        TK[J]=NEWLOC;
        J=J+1;
 L6014: KK=KK+1;
        {long x = KK-1; if(TRAVEL[x] >= 0) goto L6012;}
-L6016: TK[J]=ODLOC[I];
+L6016: TK[J]=game.odloc[I];
        if(J >= 2)J=J-1;
        J=1+randrange(J);
        if(J >= 2)J=J-1;
        J=1+randrange(J);
-       ODLOC[I]=DLOC[I];
-       DLOC[I]=TK[J];
-       DSEEN[I]=(DSEEN[I] && INDEEP(LOC)) || (DLOC[I] == LOC || ODLOC[I] == LOC);
-       if(!DSEEN[I]) goto L6030;
-       DLOC[I]=LOC;
+       game.odloc[I]=game.dloc[I];
+       game.dloc[I]=TK[J];
+       game.dseen[I]=(game.dseen[I] && INDEEP(LOC)) || (game.dloc[I] == LOC || game.odloc[I] == LOC);
+       if(!game.dseen[I]) goto L6030;
+       game.dloc[I]=LOC;
        if(I != 6) goto L6027;
 
 /*  The pirate's spotted him.  He leaves him alone once we've found chest.  K
        if(I != 6) goto L6027;
 
 /*  The pirate's spotted him.  He leaves him alone once we've found chest.  K
@@ -262,7 +261,7 @@ L6016:      TK[J]=ODLOC[I];
  *  the pirate be spotted.  Note that PLACE(CHEST)=0 might mean that he's
  *  thrown it to the troll, but in that case he's seen the chest (PROP=0). */
 
  *  the pirate be spotted.  Note that PLACE(CHEST)=0 might mean that he's
  *  thrown it to the troll, but in that case he's seen the chest (PROP=0). */
 
-       if(LOC == CHLOC || PROP[CHEST] >= 0) goto L6030;
+       if(LOC == game.chloc || PROP[CHEST] >= 0) goto L6030;
        K=0;
        /* 6020 */ for (J=50; J<=MAXTRS; J++) {
 /*  Pirate won't take pyramid from plover room or dark room (too easy!). */
        K=0;
        /* 6020 */ for (J=50; J<=MAXTRS; J++) {
 /*  Pirate won't take pyramid from plover room or dark room (too easy!). */
@@ -272,34 +271,34 @@ L6020:    if(HERE(J))K=1;
        } /* end loop */
        if(TALLY == 1 && K == 0 && PLACE[CHEST] == 0 && HERE(LAMP) && PROP[LAMP]
                == 1) goto L6025;
        } /* end loop */
        if(TALLY == 1 && K == 0 && PLACE[CHEST] == 0 && HERE(LAMP) && PROP[LAMP]
                == 1) goto L6025;
-       if(ODLOC[6] != DLOC[6] && PCT(20))RSPEAK(127);
+       if(game.odloc[6] != game.dloc[6] && PCT(20))RSPEAK(127);
         goto L6030;
 
 L6021: if(PLACE[CHEST] != 0) goto L6022;
 /*  Install chest only once, to insure it is the last treasure in the list. */
         goto L6030;
 
 L6021: if(PLACE[CHEST] != 0) goto L6022;
 /*  Install chest only once, to insure it is the last treasure in the list. */
-       MOVE(CHEST,CHLOC);
-       MOVE(MESSAG,CHLOC2);
+       MOVE(CHEST,game.chloc);
+       MOVE(MESSAG,game.chloc2);
 L6022: RSPEAK(128);
        /* 6023 */ for (J=50; J<=MAXTRS; J++) {
        if(J == PYRAM && (LOC == PLAC[PYRAM] || LOC == PLAC[EMRALD])) goto L6023;
        if(AT(J) && FIXED[J] == 0)CARRY(J,LOC);
 L6022: RSPEAK(128);
        /* 6023 */ for (J=50; J<=MAXTRS; J++) {
        if(J == PYRAM && (LOC == PLAC[PYRAM] || LOC == PLAC[EMRALD])) goto L6023;
        if(AT(J) && FIXED[J] == 0)CARRY(J,LOC);
-       if(TOTING(J))DROP(J,CHLOC);
+       if(TOTING(J))DROP(J,game.chloc);
 L6023: /*etc*/ ;
        } /* end loop */
 L6023: /*etc*/ ;
        } /* end loop */
-L6024: DLOC[6]=CHLOC;
-       ODLOC[6]=CHLOC;
-       DSEEN[6]=false;
+L6024: game.dloc[6]=game.chloc;
+       game.odloc[6]=game.chloc;
+       game.dseen[6]=false;
         goto L6030;
 
 L6025: RSPEAK(186);
         goto L6030;
 
 L6025: RSPEAK(186);
-       MOVE(CHEST,CHLOC);
-       MOVE(MESSAG,CHLOC2);
+       MOVE(CHEST,game.chloc);
+       MOVE(MESSAG,game.chloc2);
         goto L6024;
 
 /*  This threatening little dwarf is in the room with him! */
 
         goto L6024;
 
 /*  This threatening little dwarf is in the room with him! */
 
-L6027: DTOTAL=DTOTAL+1;
-       if(ODLOC[I] != DLOC[I]) goto L6030;
+L6027: game.dtotal=game.dtotal+1;
+       if(game.odloc[I] != game.dloc[I]) goto L6030;
        ATTACK=ATTACK+1;
        if(KNFLOC >= 0)KNFLOC=LOC;
        if(randrange(1000) < 95*(DFLAG-2))STICK=STICK+1;
        ATTACK=ATTACK+1;
        if(KNFLOC >= 0)KNFLOC=LOC;
        if(randrange(1000) < 95*(DFLAG-2))STICK=STICK+1;
@@ -310,9 +309,9 @@ L6030:      /*etc*/ ;
  *  Note that various of the "knife" messages must have specific relative
  *  positions in the RSPEAK database. */
 
  *  Note that various of the "knife" messages must have specific relative
  *  positions in the RSPEAK database. */
 
-       if(DTOTAL == 0) goto L2000;
-       SETPRM(1,DTOTAL,0);
-       RSPEAK(4+1/DTOTAL);
+       if(game.dtotal == 0) goto L2000;
+       SETPRM(1,game.dtotal,0);
+       RSPEAK(4+1/game.dtotal);
        if(ATTACK == 0) goto L2000;
        if(DFLAG == 2)DFLAG=3;
        SETPRM(1,ATTACK,0);
        if(ATTACK == 0) goto L2000;
        if(DFLAG == 2)DFLAG=3;
        SETPRM(1,ATTACK,0);
@@ -322,7 +321,7 @@ L6030:      /*etc*/ ;
        SETPRM(1,STICK,0);
        RSPEAK(K+1+2/(1+STICK));
        if(STICK == 0) goto L2000;
        SETPRM(1,STICK,0);
        RSPEAK(K+1+2/(1+STICK));
        if(STICK == 0) goto L2000;
-       OLDLC2=LOC;
+       game.oldlc2=LOC;
         goto L99;
 
 
         goto L99;
 
 
@@ -336,15 +335,15 @@ L6030:    /*etc*/ ;
 
 L2000: if(LOC == 0) goto L99;
        KK=STEXT[LOC];
 
 L2000: if(LOC == 0) goto L99;
        KK=STEXT[LOC];
-       if(MOD(ABB[LOC],ABBNUM) == 0 || KK == 0)KK=LTEXT[LOC];
+       if(MOD(ABB[LOC],game.abbnum) == 0 || KK == 0)KK=LTEXT[LOC];
        if(FORCED(LOC) || !DARK(0)) goto L2001;
        if(FORCED(LOC) || !DARK(0)) goto L2001;
-       if(WZDARK && PCT(35)) goto L90;
+       if(game.wzdark && PCT(35)) goto L90;
        KK=RTEXT[16];
 L2001: if(TOTING(BEAR))RSPEAK(141);
        SPEAK(KK);
        K=1;
        if(FORCED(LOC)) goto L8;
        KK=RTEXT[16];
 L2001: if(TOTING(BEAR))RSPEAK(141);
        SPEAK(KK);
        K=1;
        if(FORCED(LOC)) goto L8;
-       if(LOC == 33 && PCT(25) && !CLOSNG)RSPEAK(7);
+       if(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
 
 /*  Print out descriptions of objects at this location.  If not closing and
  *  property value is negative, tally off another treasure.  Rug is special
@@ -357,10 +356,10 @@ L2001:    if(TOTING(BEAR))RSPEAK(141);
        I=ATLOC[LOC];
 L2004: if(I == 0) goto L2012;
        OBJ=I;
        I=ATLOC[LOC];
 L2004: if(I == 0) goto L2012;
        OBJ=I;
-       if(OBJ > 100)OBJ=OBJ-100;
+       if(OBJ > NOBJECTS)OBJ=OBJ-NOBJECTS;
        if(OBJ == STEPS && TOTING(NUGGET)) goto L2008;
        if(PROP[OBJ] >= 0) goto L2006;
        if(OBJ == STEPS && TOTING(NUGGET)) goto L2008;
        if(PROP[OBJ] >= 0) goto L2006;
-       if(CLOSED) goto L2008;
+       if(game.closed) goto L2008;
        PROP[OBJ]=0;
        if(OBJ == RUG || OBJ == CHAIN)PROP[OBJ]=1;
        TALLY=TALLY-1;
        PROP[OBJ]=0;
        if(OBJ == RUG || OBJ == CHAIN)PROP[OBJ]=1;
        TALLY=TALLY-1;
@@ -394,7 +393,7 @@ L2012:      VERB=0;
  *  to finish the loop.  Ignore "HINTS" < 4 (special stuff, see database notes).
                */
 
  *  to finish the loop.  Ignore "HINTS" < 4 (special stuff, see database notes).
                */
 
-L2600: if(COND[LOC] < CONDS) goto L2603;
+L2600: if(COND[LOC] < game.conds) goto L2603;
        /* 2602 */ for (HINT=1; HINT<=HNTMAX; HINT++) {
        if(HINTED[HINT]) goto L2602;
        if(!CNDBIT(LOC,HINT+10))HINTLC[HINT]= -1;
        /* 2602 */ for (HINT=1; HINT<=HNTMAX; HINT++) {
        if(HINTED[HINT]) goto L2602;
        if(!CNDBIT(LOC,HINT+10))HINTLC[HINT]= -1;
@@ -403,18 +402,17 @@ L2600:    if(COND[LOC] < CONDS) goto L2603;
 L2602: /*etc*/ ;
        } /* end loop */
 
 L2602: /*etc*/ ;
        } /* end loop */
 
-/*  Kick the random number generator just to add variety to the chase.  Also,
- *  if closing time, check for any objects being toted with PROP < 0 and set
+/*  If closing time, check for any objects being toted with PROP < 0 and set
  *  the prop to -1-PROP.  This way objects won't be described until they've
  *  been picked up and put down separate from their respective piles.  Don't
  *  the prop to -1-PROP.  This way objects won't be described until they've
  *  been picked up and put down separate from their respective piles.  Don't
- *  tick CLOCK1 unless well into cave (and not at Y2). */
+ *  tick game.clock1 unless well into cave (and not at Y2). */
 
 
-L2603: if(!CLOSED) goto L2605;
+L2603: if(!game.closed) goto L2605;
        if(PROP[OYSTER] < 0 && TOTING(OYSTER))PSPEAK(OYSTER,1);
        if(PROP[OYSTER] < 0 && TOTING(OYSTER))PSPEAK(OYSTER,1);
-       for (I=1; I<=100; I++) {
+       for (I=1; I<=NOBJECTS; I++) {
        if(TOTING(I) && PROP[I] < 0)PROP[I]= -1-PROP[I];
        } /* end loop */
        if(TOTING(I) && PROP[I] < 0)PROP[I]= -1-PROP[I];
        } /* end loop */
-L2605: WZDARK=DARK(0);
+L2605: game.wzdark=DARK(0);
        if(KNFLOC > 0 && KNFLOC != LOC)KNFLOC=0;
        I=0;
        if (!GETIN(cmdin, WD1,WD1X,WD2,WD2X))
        if(KNFLOC > 0 && KNFLOC != LOC)KNFLOC=0;
        I=0;
        if (!GETIN(cmdin, WD1,WD1X,WD2,WD2X))
@@ -425,18 +423,20 @@ L2605:    WZDARK=DARK(0);
 
 L2607: FOOBAR=(FOOBAR>0 ? -FOOBAR : 0);
        TURNS=TURNS+1;
 
 L2607: FOOBAR=(FOOBAR>0 ? -FOOBAR : 0);
        TURNS=TURNS+1;
-       if(TURNS != THRESH) goto L2608;
+       if(TURNS == THRESH) {
        SPEAK(TTEXT[TRNDEX]);
        TRNLUZ=TRNLUZ+TRNVAL[TRNDEX]/100000;
        TRNDEX=TRNDEX+1;
        THRESH= -1;
        SPEAK(TTEXT[TRNDEX]);
        TRNLUZ=TRNLUZ+TRNVAL[TRNDEX]/100000;
        TRNDEX=TRNDEX+1;
        THRESH= -1;
-       if(TRNDEX <= TRNVLS)THRESH=MOD(TRNVAL[TRNDEX],100000)+1;
-L2608: if(VERB == SAY && WD2 > 0)VERB=0;
+       if(TRNDEX <= TRNVLS)
+           THRESH=MOD(TRNVAL[TRNDEX],100000)+1;
+       }
+       if(VERB == SAY && WD2 > 0)VERB=0;
        if(VERB == SAY) goto L4090;
        if(VERB == SAY) goto L4090;
-       if(TALLY == 0 && INDEEP(LOC) && LOC != 33)CLOCK1=CLOCK1-1;
-       if(CLOCK1 == 0) goto L10000;
-       if(CLOCK1 < 0)CLOCK2=CLOCK2-1;
-       if(CLOCK2 == 0) goto L11000;
+       if(TALLY == 0 && INDEEP(LOC) && LOC != 33)game.clock1=game.clock1-1;
+       if(game.clock1 == 0) goto L10000;
+       if(game.clock1 < 0)game.clock2=game.clock2-1;
+       if(game.clock2 == 0) goto L11000;
        if(PROP[LAMP] == 1)LIMIT=LIMIT-1;
        if(LIMIT <= 30 && HERE(BATTER) && PROP[BATTER] == 0 && HERE(LAMP)) goto
                L12000;
        if(PROP[LAMP] == 1)LIMIT=LIMIT-1;
        if(LIMIT <= 30 && HERE(BATTER) && PROP[BATTER] == 0 && HERE(LAMP)) goto
                L12000;
@@ -451,12 +451,13 @@ L19999: K=43;
        if((V1 != 1000+WATER && V1 != 1000+OIL) || (V2 != 1000+PLANT && V2 !=
                1000+DOOR)) goto L2610;
        {long x = V2-1000; if(AT(x))WD2=MAKEWD(16152118);}
        if((V1 != 1000+WATER && V1 != 1000+OIL) || (V2 != 1000+PLANT && V2 !=
                1000+DOOR)) goto L2610;
        {long x = V2-1000; if(AT(x))WD2=MAKEWD(16152118);}
-L2610: if(V1 == 1000+CAGE && V2 == 1000+BIRD && HERE(CAGE) &&
-               HERE(BIRD))WD1=MAKEWD(301200308);
-L2620: if(WD1 != MAKEWD(23051920)) goto L2625;
-       IWEST=IWEST+1;
-       if(IWEST == 10)RSPEAK(17);
-L2625: if(WD1 != MAKEWD( 715) || WD2 == 0) goto L2630;
+L2610: if(V1 == 1000+CAGE && V2 == 1000+BIRD && HERE(CAGE) && HERE(BIRD))
+               WD1=MAKEWD(301200308);
+L2620: if(WD1 == MAKEWD(23051920)) {
+               IWEST=IWEST+1;
+               if(IWEST == 10)RSPEAK(17);
+       }
+       if(WD1 != MAKEWD( 715) || WD2 == 0) goto L2630;
        IGO=IGO+1;
        if(IGO == 10)RSPEAK(276);
 L2630: I=VOCAB(WD1,-1);
        IGO=IGO+1;
        if(IGO == 10)RSPEAK(276);
 L2630: I=VOCAB(WD1,-1);
@@ -516,11 +517,13 @@ L8000:    SETPRM(1,WD1,WD1X);
 
 /*  Figure out the new location
  *
 
 /*  Figure out the new location
  *
- *  Given the current location in "LOC", and a motion verb number in "K", put
- *  the new location in "NEWLOC".  The current loc is saved in "OLDLOC" in case
- *  he wants to retreat.  The current OLDLOC is saved in OLDLC2, in case he
- *  dies.  (if he does, NEWLOC will be limbo, and OLDLOC will be what killed
- *  him, so we need OLDLC2, which is the last place he was safe.) */
+ *  Given the current location in "LOC", and a motion verb number in
+ *  "K", put the new location in "NEWLOC".  The current loc is saved
+ *  in "game.olddloc" in case he wants to retreat.  The current
+ *  game.oldloc is saved in game.oldlc2, in case he dies.  (if he
+ *  does, NEWLOC will be limbo, and OLgame.dloc will be what killed
+ *  him, so we need game.oldlc2, which is the last place he was
+ *  safe.) */
 
 L8:    KK=KEY[LOC];
        NEWLOC=LOC;
 
 L8:    KK=KEY[LOC];
        NEWLOC=LOC;
@@ -529,10 +532,10 @@ L8:       KK=KEY[LOC];
        if(K == BACK) goto L20;
        if(K == LOOK) goto L30;
        if(K == CAVE) goto L40;
        if(K == BACK) goto L20;
        if(K == LOOK) goto L30;
        if(K == CAVE) goto L40;
-       OLDLC2=OLDLOC;
-       OLDLOC=LOC;
+       game.oldlc2=game.oldloc;
+       game.oldloc=LOC;
 
 
-L9:    LL=IABS(TRAVEL[KK]);
+L9:    LL=labs(TRAVEL[KK]);
        if(MOD(LL,1000) == 1 || MOD(LL,1000) == K) goto L10;
        if(TRAVEL[KK] < 0) goto L50;
        KK=KK+1;
        if(MOD(LL,1000) == 1 || MOD(LL,1000) == K) goto L10;
        if(TRAVEL[KK] < 0) goto L50;
        KK=KK+1;
@@ -540,17 +543,17 @@ L9:       LL=IABS(TRAVEL[KK]);
 
 L10:   LL=LL/1000;
 L11:   NEWLOC=LL/1000;
 
 L10:   LL=LL/1000;
 L11:   NEWLOC=LL/1000;
-       K=MOD(NEWLOC,100);
+        K=MOD(NEWLOC,100);     /* ESR: an instance of NOBJECTS? */
        if(NEWLOC <= 300) goto L13;
        if(PROP[K] != NEWLOC/100-3) goto L16;
 L12:   if(TRAVEL[KK] < 0)BUG(25);
        KK=KK+1;
        if(NEWLOC <= 300) goto L13;
        if(PROP[K] != NEWLOC/100-3) goto L16;
 L12:   if(TRAVEL[KK] < 0)BUG(25);
        KK=KK+1;
-       NEWLOC=IABS(TRAVEL[KK])/1000;
+       NEWLOC=labs(TRAVEL[KK])/1000;
        if(NEWLOC == LL) goto L12;
        LL=NEWLOC;
         goto L11;
 
        if(NEWLOC == LL) goto L12;
        LL=NEWLOC;
         goto L11;
 
-L13:   if(NEWLOC <= 100) goto L14;
+L13:   if(NEWLOC <= 100) goto L14;     /* ESR: an instance of NOBJECTS? */
        if(TOTING(K) || (NEWLOC > 200 && AT(K))) goto L16;
         goto L12;
 
        if(TOTING(K) || (NEWLOC > 200 && AT(K))) goto L16;
         goto L12;
 
@@ -574,7 +577,7 @@ L30000: NEWLOC=NEWLOC-300;
  *  table must include "useless" entries going through passage, which can never
  *  be used for actual motion, but can be spotted by "go back". */
 
  *  table must include "useless" entries going through passage, which can never
  *  be used for actual motion, but can be spotted by "go back". */
 
-L30100: NEWLOC=99+100-LOC;
+L30100: NEWLOC=99+100-LOC;     /* ESR: an instance of NOBJECTS? */
        if(HOLDNG == 0 || (HOLDNG == 1 && TOTING(EMRALD))) return true;
        NEWLOC=LOC;
        RSPEAK(117);
        if(HOLDNG == 0 || (HOLDNG == 1 && TOTING(EMRALD))) return true;
        NEWLOC=LOC;
        RSPEAK(117);
@@ -597,9 +600,9 @@ L30300: if(PROP[TROLL] != 1) goto L30310;
        PSPEAK(TROLL,1);
        PROP[TROLL]=0;
        MOVE(TROLL2,0);
        PSPEAK(TROLL,1);
        PROP[TROLL]=0;
        MOVE(TROLL2,0);
-       MOVE(TROLL2+100,0);
+       MOVE(TROLL2+NOBJECTS,0);
        MOVE(TROLL,PLAC[TROLL]);
        MOVE(TROLL,PLAC[TROLL]);
-       MOVE(TROLL+100,FIXD[TROLL]);
+       MOVE(TROLL+NOBJECTS,FIXD[TROLL]);
        JUGGLE(CHASM);
        NEWLOC=LOC;
        return true;
        JUGGLE(CHASM);
        NEWLOC=LOC;
        return true;
@@ -613,18 +616,18 @@ L30310: NEWLOC=PLAC[TROLL]+FIXD[TROLL]-LOC;
        DROP(BEAR,NEWLOC);
        FIXED[BEAR]= -1;
        PROP[BEAR]=3;
        DROP(BEAR,NEWLOC);
        FIXED[BEAR]= -1;
        PROP[BEAR]=3;
-       OLDLC2=NEWLOC;
+       game.oldlc2=NEWLOC;
         goto L99;
 
 /*  End of specials. */
 
         goto L99;
 
 /*  End of specials. */
 
-/*  Handle "go back".  Look for verb which goes from LOC to OLDLOC, or to OLDLC2
- *  If OLDLOC has forced-motion.  K2 saves entry -> forced loc -> previous loc. */
+/*  Handle "go back".  Look for verb which goes from LOC to game.oldloc, or to game.oldlc2
+ *  If game.oldloc has forced-motion.  K2 saves entry -> forced loc -> previous loc. */
 
 
-L20:   K=OLDLOC;
-       if(FORCED(K))K=OLDLC2;
-       OLDLC2=OLDLOC;
-       OLDLOC=LOC;
+L20:   K=game.oldloc;
+       if(FORCED(K))K=game.oldlc2;
+       game.oldlc2=game.oldloc;
+       game.oldloc=LOC;
        K2=0;
        if(K == LOC)K2=91;
        if(CNDBIT(LOC,4))K2=274;
        K2=0;
        if(K == LOC)K2=91;
        if(CNDBIT(LOC,4))K2=274;
@@ -632,30 +635,34 @@ L20:      K=OLDLOC;
        RSPEAK(K2);
        return true;
 
        RSPEAK(K2);
        return true;
 
-L21:   LL=MOD((IABS(TRAVEL[KK])/1000),1000);
-       if(LL == K) goto L25;
-       if(LL > 300) goto L22;
-       J=KEY[LL];
-       if(FORCED(LL) && MOD((IABS(TRAVEL[J])/1000),1000) == K)K2=KK;
-L22:   if(TRAVEL[KK] < 0) goto L23;
-       KK=KK+1;
-        goto L21;
-
-L23:   KK=K2;
-       if(KK != 0) goto L25;
-       RSPEAK(140);
-       return true;
+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;
+               }
+       }
 
 
-L25:   K=MOD(IABS(TRAVEL[KK]),1000);
+       K=MOD(labs(TRAVEL[KK]),1000);
        KK=KEY[LOC];
         goto L9;
 
 /*  Look.  Can't give more detail.  Pretend it wasn't dark (though it may "now"
  *  be dark) so he won't fall into a pit while staring into the gloom. */
 
        KK=KEY[LOC];
         goto L9;
 
 /*  Look.  Can't give more detail.  Pretend it wasn't dark (though it may "now"
  *  be dark) so he won't fall into a pit while staring into the gloom. */
 
-L30:   if(DETAIL < 3)RSPEAK(15);
-       DETAIL=DETAIL+1;
-       WZDARK=false;
+L30:   if(game.detail < 3)RSPEAK(15);
+       game.detail=game.detail+1;
+       game.wzdark=false;
        ABB[LOC]=0;
        return true;
 
        ABB[LOC]=0;
        return true;
 
@@ -686,7 +693,7 @@ L50:        SPK=12;
  *  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
  *  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 OLDLC2
+ *  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
  *  (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
@@ -694,32 +701,32 @@ L50:      SPK=12;
  *  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!).
  *  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!).
- *  OLDLOC is zapped so he can't just "retreat". */
+ *  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);
 
 /*  The easiest way to get killed is to fall into a pit in pitch darkness. */
 
 L90:   RSPEAK(23);
-       OLDLC2=LOC;
+       game.oldlc2=LOC;
 
 /*  Okay, he's dead.  Let's get on with it. */
 
 
 /*  Okay, he's dead.  Let's get on with it. */
 
-L99:   if(CLOSNG) goto L95;
+L99:   if(game.closng) goto L95;
        NUMDIE=NUMDIE+1;
        if(!YES(cmdin,79+NUMDIE*2,80+NUMDIE*2,54)) score(0);
        if(NUMDIE == MAXDIE) score(0);
        PLACE[WATER]=0;
        PLACE[OIL]=0;
        if(TOTING(LAMP))PROP[LAMP]=0;
        NUMDIE=NUMDIE+1;
        if(!YES(cmdin,79+NUMDIE*2,80+NUMDIE*2,54)) score(0);
        if(NUMDIE == MAXDIE) score(0);
        PLACE[WATER]=0;
        PLACE[OIL]=0;
        if(TOTING(LAMP))PROP[LAMP]=0;
-       /* 98 */ for (J=1; J<=100; J++) {
-       I=101-J;
+       /* 98 */ for (J=1; J<=NOBJECTS; J++) {
+       I=NOBJECTS + 1 - J;
        if(!TOTING(I)) goto L98;
        if(!TOTING(I)) goto L98;
-       K=OLDLC2;
+       K=game.oldlc2;
        if(I == LAMP)K=1;
        DROP(I,K);
 L98:   /*etc*/ ;
        } /* end loop */
        LOC=3;
        if(I == LAMP)K=1;
        DROP(I,K);
 L98:   /*etc*/ ;
        } /* end loop */
        LOC=3;
-       OLDLOC=LOC;
+       game.oldloc=LOC;
         goto L2000;
 
 /*  He died during closing time.  No resurrection.  Tally up a death and exit. */
         goto L2000;
 
 /*  He died during closing time.  No resurrection.  Tally up a death and exit. */
@@ -767,7 +774,7 @@ L40200: if(PLACE[BIRD] == LOC && TOTING(ROD) && OLDOBJ == BIRD) goto L40010;
 L40300: if(HERE(SNAKE) && !HERE(BIRD)) goto L40010;
         goto L40020;
 
 L40300: if(HERE(SNAKE) && !HERE(BIRD)) goto L40010;
         goto L40020;
 
-L40400: if(ATLOC[LOC] == 0 && ATLOC[OLDLOC] == 0 && ATLOC[OLDLC2] == 0 && HOLDNG >
+L40400: if(ATLOC[LOC] == 0 && ATLOC[game.oldloc] == 0 && ATLOC[game.oldlc2] == 0 && HOLDNG >
                1) goto L40010;
         goto L40020;
 
                1) goto L40010;
         goto L40020;
 
@@ -779,7 +786,7 @@ L40600:  goto L40010;
 L40700: if(DFLAG == 0) goto L40010;
         goto L40020;
 
 L40700: if(DFLAG == 0) goto L40010;
         goto L40020;
 
-L40800: if(ATLOC[LOC] == 0 && ATLOC[OLDLOC] == 0 && ATLOC[OLDLC2] == 0) goto
+L40800: if(ATLOC[LOC] == 0 && ATLOC[game.oldloc] == 0 && ATLOC[game.oldlc2] == 0) goto
                L40010;
         goto L40030;
 
                L40010;
         goto L40030;
 
@@ -829,14 +836,14 @@ L41000: if(TALLY == 1 && PROP[JADE] < 0) goto L40010;
 
 L10000: PROP[GRATE]=0;
        PROP[FISSUR]=0;
 
 L10000: PROP[GRATE]=0;
        PROP[FISSUR]=0;
-       for (I=1; I<=6; I++) {
-       DSEEN[I]=false;
-       DLOC[I]=0;
+       for (I=1; I<=NDWARVES; I++) {
+       game.dseen[I]=false;
+       game.dloc[I]=0;
        } /* end loop */
        MOVE(TROLL,0);
        } /* end loop */
        MOVE(TROLL,0);
-       MOVE(TROLL+100,0);
+       MOVE(TROLL+NOBJECTS,0);
        MOVE(TROLL2,PLAC[TROLL]);
        MOVE(TROLL2,PLAC[TROLL]);
-       MOVE(TROLL2+100,FIXD[TROLL]);
+       MOVE(TROLL2+NOBJECTS,FIXD[TROLL]);
        JUGGLE(CHASM);
        if(PROP[BEAR] != 3)DSTROY(BEAR);
        PROP[CHAIN]=0;
        JUGGLE(CHASM);
        if(PROP[BEAR] != 3)DSTROY(BEAR);
        PROP[CHAIN]=0;
@@ -844,8 +851,8 @@ L10000: PROP[GRATE]=0;
        PROP[AXE]=0;
        FIXED[AXE]=0;
        RSPEAK(129);
        PROP[AXE]=0;
        FIXED[AXE]=0;
        RSPEAK(129);
-       CLOCK1= -1;
-       CLOSNG=true;
+       game.clock1= -1;
+       game.closng=true;
         goto L19999;
 
 /*  Once he's panicked, and clock2 has run out, we come here to set up the
         goto L19999;
 
 /*  Once he's panicked, and clock2 has run out, we come here to set up the
@@ -868,7 +875,7 @@ L11000: PROP[BOTTLE]=PUT(BOTTLE,115,1);
        PROP[ROD]=PUT(ROD,115,0);
        PROP[DWARF]=PUT(DWARF,115,0);
        LOC=115;
        PROP[ROD]=PUT(ROD,115,0);
        PROP[DWARF]=PUT(DWARF,115,0);
        LOC=115;
-       OLDLOC=115;
+       game.oldloc=115;
        NEWLOC=115;
 
 /*  Leave the grate with normal (non-negative) property.  Reuse sign. */
        NEWLOC=115;
 
 /*  Leave the grate with normal (non-negative) property.  Reuse sign. */
@@ -885,12 +892,13 @@ L11000: PROP[BOTTLE]=PUT(BOTTLE,115,1);
        PROP[MIRROR]=PUT(MIRROR,115,0);
        FIXED[MIRROR]=116;
 
        PROP[MIRROR]=PUT(MIRROR,115,0);
        FIXED[MIRROR]=116;
 
-       for (I=1; I<=100; I++) {
-       if(TOTING(I))DSTROY(I);
+       for (I=1; I<=NOBJECTS; I++) {
+               if(TOTING(I))
+                       DSTROY(I);
        } /* end loop */
 
        RSPEAK(132);
        } /* end loop */
 
        RSPEAK(132);
-       CLOSED=true;
+       game.closed=true;
        return true;
 
 /*  Another way we can force an end to things is by having the lamp give out.
        return true;
 
 /*  Another way we can force an end to things is by having the lamp give out.