Eliminate globals.
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index 18beb85ffdf0b4c846171ce2350b9cc94b88c0cf..c6a1eef1e7537d82317435a3e5401feea464080e 100644 (file)
--- a/main.c
+++ b/main.c
@@ -19,18 +19,15 @@ char rawbuf[LINESIZE], INLINE[LINESIZE+1], MAP1[129], MAP2[129];
 
 long AMBER, ATTACK, AXE, BACK, BATTER, BEAR, BIRD, BLOOD,
                BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST,
 
 long AMBER, ATTACK, AXE, BACK, BATTER, BEAR, BIRD, BLOOD,
                BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST,
-               CLAM, COINS, DALTLC, DOOR, DPRSSN, DRAGON, DWARF, EGGS,
+               CLAM, COINS, DOOR, DPRSSN, DRAGON, DWARF, EGGS,
                EMRALD, ENTER, ENTRNC, FIND, FISSUR, FOOD,
                EMRALD, ENTER, ENTRNC, FIND, FISSUR, FOOD,
-               GRATE, HINT, HINTLC[21],
-               I, INVENT, IGO, J, JADE, K, K2, KEYS, KK,
-               KNIFE, KQ, L, LAMP, LL, LOC, LOCK, LOOK,
-               MAGZIN, MAXDIE, MAXTRS, MESSAG, MIRROR, MXSCOR,
-               NUGGET, NUL, OBJ, OGRE, OIL, OYSTER, PEARL, PILLOW,
-               PLANT, PLANT2, PROP[NOBJECTS+1], PYRAM,
-               RESER, ROD, ROD2, RUBY, RUG, SAPPH, SAY,
-               SCORE, SECT, SIGN, SNAKE, SPK, STEPS, STICK,
-               STREAM, THROW, TK[21], TRIDNT, TROLL, TROLL2,
-               URN, V1, V2, VASE, VEND, VERB,
+               GRATE, HINT, I, INVENT, J, JADE, K, KEYS,
+               KNIFE, L, LAMP, LOCK, LOOK, MAGZIN, MAXDIE,
+               MESSAG, MIRROR, NUGGET, NUL, OGRE, OIL, OYSTER,
+               PEARL, PILLOW, PLANT, PLANT2, PYRAM, RESER, ROD, ROD2,
+               RUBY, RUG, SAPPH, SAY, SCORE, SECT, SIGN, SNAKE, SPK,
+               STEPS, STICK, STREAM, THROW, TRIDNT, TROLL, TROLL2,
+               URN, V1, V2, VASE, VEND,
                VOLCAN, VRSION = 25, WATER, WD1, WD1X, WD2, WD2X;
 FILE  *logfp;
 bool oldstyle = false;
                VOLCAN, VRSION = 25, WATER, WD1, WD1X, WD2, WD2X;
 FILE  *logfp;
 bool oldstyle = false;
@@ -38,7 +35,7 @@ lcg_state lcgstate;
 
 extern void initialise();
 extern void score(long);
 
 extern void initialise();
 extern void score(long);
-extern int action(FILE *, long);
+extern int action(FILE *, long, long, long);
 
 void sig_handler(int signo)
 {
 
 void sig_handler(int signo)
 {
@@ -56,7 +53,7 @@ static bool do_command(FILE *);
 
 int main(int argc, char *argv[]) {
        int ch;
 
 int main(int argc, char *argv[]) {
        int ch;
-
+       
 /*  Adventure (rev 2: 20 treasures) */
 
 /*  History: Original idea & 5-treasure version (adventures) by Willie Crowther
 /*  Adventure (rev 2: 20 treasures) */
 
 /*  History: Original idea & 5-treasure version (adventures) by Willie Crowther
@@ -125,7 +122,7 @@ L1: game.setup= -1;
        game.zzword=RNDVOC(3,0);
        game.novice=YES(stdin, 65,1,0);
        game.newloc=1;
        game.zzword=RNDVOC(3,0);
        game.novice=YES(stdin, 65,1,0);
        game.newloc=1;
-       LOC=1;
+       game.loc=1;
        game.limit=330;
        if(game.novice)game.limit=1000;
 
        game.limit=330;
        if(game.novice)game.limit=1000;
 
@@ -156,12 +153,16 @@ static bool fallback_handler(char *buf)
 }
 
 static bool do_command(FILE *cmdin) {
 }
 
 static bool do_command(FILE *cmdin) {
+       long LL, KQ, VERB, KK, K2;
+       long obj;
+       long TK[21];
+       static long IGO = 0;
 
 /*  Can't leave cave once it's closing (except by main office). */
 
        if(!OUTSID(game.newloc) || game.newloc == 0 || !game.closng) goto L71;
        RSPEAK(130);
 
 /*  Can't leave cave once it's closing (except by main office). */
 
        if(!OUTSID(game.newloc) || game.newloc == 0 || !game.closng) goto L71;
        RSPEAK(130);
-       game.newloc=LOC;
+       game.newloc=game.loc;
        if(!game.panic)game.clock2=15;
        game.panic=true;
 
        if(!game.panic)game.clock2=15;
        game.panic=true;
 
@@ -169,15 +170,15 @@ static bool do_command(FILE *cmdin) {
  *  the dwarf's blocking his way.  If coming from place forbidden to pirate
  *  (dwarves rooted in place) let him get out (and attacked). */
 
  *  the dwarf's blocking his way.  If coming from place forbidden to pirate
  *  (dwarves rooted in place) let him get out (and attacked). */
 
-L71:   if(game.newloc == LOC || FORCED(LOC) || CNDBIT(LOC,3)) goto L74;
+L71:   if(game.newloc == game.loc || FORCED(game.loc) || CNDBIT(game.loc,3)) goto L74;
        /* 73 */ for (I=1; I<=NDWARVES-1; I++) {
        if(game.odloc[I] != game.newloc || !game.dseen[I]) goto L73;
        /* 73 */ for (I=1; I<=NDWARVES-1; I++) {
        if(game.odloc[I] != game.newloc || !game.dseen[I]) goto L73;
-       game.newloc=LOC;
+       game.newloc=game.loc;
        RSPEAK(2);
         goto L74;
 L73:   /*etc*/ ;
        } /* end loop */
        RSPEAK(2);
         goto L74;
 L73:   /*etc*/ ;
        } /* end loop */
-L74:   LOC=game.newloc;
+L74:   game.loc=game.newloc;
 
 /*  Dwarf stuff.  See earlier comments for description of variables.  Remember
  *  sixth dwarf is pirate and is thus very different except for motion rules. */
 
 /*  Dwarf stuff.  See earlier comments for description of variables.  Remember
  *  sixth dwarf is pirate and is thus very different except for motion rules. */
@@ -189,27 +190,27 @@ L74:      LOC=game.newloc;
  *  dwarves can't meet the bear.  Also means dwarves won't follow him into dead
  *  end in maze, but c'est la vie.  They'll wait for him outside the dead end. */
 
  *  dwarves can't meet the bear.  Also means dwarves won't follow him into dead
  *  end in maze, but c'est la vie.  They'll wait for him outside the dead end. */
 
-       if(LOC == 0 || FORCED(LOC) || CNDBIT(game.newloc,3)) goto L2000;
+       if(game.loc == 0 || FORCED(game.loc) || CNDBIT(game.newloc,3)) goto L2000;
        if(game.dflag != 0) goto L6000;
        if(game.dflag != 0) goto L6000;
-       if(INDEEP(LOC))game.dflag=1;
+       if(INDEEP(game.loc))game.dflag=1;
         goto L2000;
 
 /*  When we encounter the first dwarf, we kill 0, 1, or 2 of the 5 dwarves.  If
  *  any of the survivors is at loc, replace him with the alternate. */
 
 L6000: if(game.dflag != 1) goto L6010;
         goto L2000;
 
 /*  When we encounter the first dwarf, we kill 0, 1, or 2 of the 5 dwarves.  If
  *  any of the survivors is at loc, replace him with the alternate. */
 
 L6000: if(game.dflag != 1) goto L6010;
-       if(!INDEEP(LOC) || (PCT(95) && (!CNDBIT(LOC,4) || PCT(85)))) goto L2000;
+       if(!INDEEP(game.loc) || (PCT(95) && (!CNDBIT(game.loc,4) || PCT(85)))) goto L2000;
        game.dflag=2;
        for (I=1; I<=2; I++) {
        J=1+randrange(NDWARVES-1);
        if(PCT(50))game.dloc[J]=0;
        } /* end loop */
        for (I=1; I<=NDWARVES-1; I++) {
        game.dflag=2;
        for (I=1; I<=2; I++) {
        J=1+randrange(NDWARVES-1);
        if(PCT(50))game.dloc[J]=0;
        } /* end loop */
        for (I=1; I<=NDWARVES-1; I++) {
-       if(game.dloc[I] == LOC)game.dloc[I]=DALTLC;
+       if(game.dloc[I] == game.loc)game.dloc[I]=DALTLC;
        game.odloc[I]=game.dloc[I];
        } /* end loop */
        RSPEAK(3);
        game.odloc[I]=game.dloc[I];
        } /* end loop */
        RSPEAK(3);
-       DROP(AXE,LOC);
+       DROP(AXE,game.loc);
         goto L2000;
 
 /*  Things are in full swing.  Move each dwarf at random, except if he's seen us
         goto L2000;
 
 /*  Things are in full swing.  Move each dwarf at random, except if he's seen us
@@ -242,25 +243,25 @@ L6016:    TK[J]=game.odloc[I];
        J=1+randrange(J);
        game.odloc[I]=game.dloc[I];
        game.dloc[I]=TK[J];
        J=1+randrange(J);
        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);
+       game.dseen[I]=(game.dseen[I] && INDEEP(game.loc)) || (game.dloc[I] == game.loc || game.odloc[I] == game.loc);
        if(!game.dseen[I]) goto L6030;
        if(!game.dseen[I]) goto L6030;
-       game.dloc[I]=LOC;
+       game.dloc[I]=game.loc;
        if(I != 6) goto L6027;
 
 /*  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.  Note that game.place(CHEST)=0 might mean that he's
        if(I != 6) goto L6027;
 
 /*  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.  Note that game.place(CHEST)=0 might mean that he's
- *  thrown it to the troll, but in that case he's seen the chest (PROP=0). */
+ *  thrown it to the troll, but in that case he's seen the chest (game.prop=0). */
 
 
-       if(LOC == game.chloc || PROP[CHEST] >= 0) goto L6030;
+       if(game.loc == game.chloc || game.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!). */
-       if(J == PYRAM && (LOC == PLAC[PYRAM] || LOC == PLAC[EMRALD])) goto L6020;
+       if(J == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD])) goto L6020;
        if(TOTING(J)) goto L6021;
 L6020: if(HERE(J))K=1;
        } /* end loop */
        if(TOTING(J)) goto L6021;
 L6020: if(HERE(J))K=1;
        } /* end loop */
-       if(game.tally == 1 && K == 0 && game.place[CHEST] == 0 && HERE(LAMP) && PROP[LAMP]
+       if(game.tally == 1 && K == 0 && game.place[CHEST] == 0 && HERE(LAMP) && game.prop[LAMP]
                == 1) goto L6025;
        if(game.odloc[6] != game.dloc[6] && PCT(20))RSPEAK(127);
         goto L6030;
                == 1) goto L6025;
        if(game.odloc[6] != game.dloc[6] && PCT(20))RSPEAK(127);
         goto L6030;
@@ -271,8 +272,8 @@ L6021:      if(game.place[CHEST] != 0) goto L6022;
        MOVE(MESSAG,game.chloc2);
 L6022: RSPEAK(128);
        /* 6023 */ for (J=50; J<=MAXTRS; J++) {
        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) && game.fixed[J] == 0)CARRY(J,LOC);
+       if(J == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD])) goto L6023;
+       if(AT(J) && game.fixed[J] == 0)CARRY(J,game.loc);
        if(TOTING(J))DROP(J,game.chloc);
 L6023: /*etc*/ ;
        } /* end loop */
        if(TOTING(J))DROP(J,game.chloc);
 L6023: /*etc*/ ;
        } /* end loop */
@@ -291,7 +292,7 @@ L6025:      RSPEAK(186);
 L6027: game.dtotal=game.dtotal+1;
        if(game.odloc[I] != game.dloc[I]) goto L6030;
        ATTACK=ATTACK+1;
 L6027: game.dtotal=game.dtotal+1;
        if(game.odloc[I] != game.dloc[I]) goto L6030;
        ATTACK=ATTACK+1;
-       if(game.knfloc >= 0)game.knfloc=LOC;
+       if(game.knfloc >= 0)game.knfloc=game.loc;
        if(randrange(1000) < 95*(game.dflag-2))STICK=STICK+1;
 L6030: /*etc*/ ;
        } /* end loop */
        if(randrange(1000) < 95*(game.dflag-2))STICK=STICK+1;
 L6030: /*etc*/ ;
        } /* end loop */
@@ -312,47 +313,42 @@ 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;
-       game.oldlc2=LOC;
+       game.oldlc2=game.loc;
         goto L99;
 
         goto L99;
 
-
-
-
-
-
 /*  Describe the current location and (maybe) get next command. */
 
 /*  Print text for current loc. */
 
 /*  Describe the current location and (maybe) get next command. */
 
 /*  Print text for current loc. */
 
-L2000: if(LOC == 0) goto L99;
-       KK=STEXT[LOC];
-       if(MOD(game.abbrev[LOC],game.abbnum) == 0 || KK == 0)KK=LTEXT[LOC];
-       if(FORCED(LOC) || !DARK(0)) goto L2001;
+L2000: if(game.loc == 0) goto L99;
+       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);
        SPEAK(KK);
        K=1;
        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;
-       if(LOC == 33 && PCT(25) && !game.closng)RSPEAK(7);
+       if(FORCED(game.loc)) goto L8;
+       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
 
 /*  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 PROP is 1 (dragon on it) till dragon is killed.
- *  Similarly for chain; PROP is initially 1 (locked to bear).  These hacks
- *  are because PROP=0 is needed to get full score. */
+ *  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;
 
        if(DARK(0)) goto L2012;
-       game.abbrev[LOC]=game.abbrev[LOC]+1;
-       I=game.atloc[LOC];
+       game.abbrev[game.loc]=game.abbrev[game.loc]+1;
+       I=game.atloc[game.loc];
 L2004: if(I == 0) goto L2012;
 L2004: if(I == 0) goto L2012;
-       OBJ=I;
-       if(OBJ > NOBJECTS)OBJ=OBJ-NOBJECTS;
-       if(OBJ == STEPS && TOTING(NUGGET)) goto L2008;
-       if(PROP[OBJ] >= 0) goto L2006;
+       obj=I;
+       if(obj > NOBJECTS)obj=obj-NOBJECTS;
+       if(obj == STEPS && TOTING(NUGGET)) goto L2008;
+       if(game.prop[obj] >= 0) goto L2006;
        if(game.closed) goto L2008;
        if(game.closed) goto L2008;
-       PROP[OBJ]=0;
-       if(OBJ == RUG || OBJ == CHAIN)PROP[OBJ]=1;
+       game.prop[obj]=0;
+       if(obj == RUG || obj == CHAIN)game.prop[obj]=1;
        game.tally=game.tally-1;
 /*  Note: There used to be a test here to see whether the player had blown it
  *  so badly that he could never ever see the remaining treasures, and if so
        game.tally=game.tally-1;
 /*  Note: There used to be a test here to see whether the player had blown it
  *  so badly that he could never ever see the remaining treasures, and if so
@@ -365,9 +361,9 @@ L2004:      if(I == 0) goto L2012;
  *  or trident, and the effects propagate.  So the whole thing was flushed.
  *  anyone who makes such a gross blunder isn't likely to find everything
  *  else anyway (so goes the rationalisation). */
  *  or trident, and the effects propagate.  So the whole thing was flushed.
  *  anyone who makes such a gross blunder isn't likely to find everything
  *  else anyway (so goes the rationalisation). */
-L2006: KK=PROP[OBJ];
-       if(OBJ == STEPS && 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];
         goto L2004;
 
 L2008: I=game.link[I];
         goto L2004;
 
@@ -376,35 +372,35 @@ L2010:    SPK=K;
 L2011: RSPEAK(SPK);
 
 L2012: VERB=0;
 L2011: RSPEAK(SPK);
 
 L2012: VERB=0;
-       game.oldobj=OBJ;
-       OBJ=0;
+       game.oldobj=obj;
+       obj=0;
 
 /*  Check if this loc is eligible for any hints.  If been here long enough,
  *  branch to help section (on later page).  Hints all come back here eventually
  *  to finish the loop.  Ignore "HINTS" < 4 (special stuff, see database notes).
                */
 
 
 /*  Check if this loc is eligible for any hints.  If been here long enough,
  *  branch to help section (on later page).  Hints all come back here eventually
  *  to finish the loop.  Ignore "HINTS" < 4 (special stuff, see database notes).
                */
 
-L2600: if(COND[LOC] < game.conds) goto L2603;
+L2600: if(COND[game.loc] < game.conds) goto L2603;
        /* 2602 */ for (HINT=1; HINT<=HNTMAX; HINT++) {
        if(game.hinted[HINT]) goto L2602;
        /* 2602 */ for (HINT=1; HINT<=HNTMAX; HINT++) {
        if(game.hinted[HINT]) goto L2602;
-       if(!CNDBIT(LOC,HINT+10))HINTLC[HINT]= -1;
-       HINTLC[HINT]=HINTLC[HINT]+1;
-       if(HINTLC[HINT] >= HINTS[HINT][1]) goto L40000;
+       if(!CNDBIT(game.loc,HINT+10))game.hintlc[HINT]= -1;
+       game.hintlc[HINT]=game.hintlc[HINT]+1;
+       if(game.hintlc[HINT] >= HINTS[HINT][1]) goto L40000;
 L2602: /*etc*/ ;
        } /* end loop */
 
 L2602: /*etc*/ ;
        } /* end loop */
 
-/*  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
+/*  If closing time, check for any objects being toted with game.prop < 0 and set
+ *  the prop to -1-game.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 game.clock1 unless well into cave (and not at Y2). */
 
 L2603: if(!game.closed) goto L2605;
  *  been picked up and put down separate from their respective piles.  Don't
  *  tick game.clock1 unless well into cave (and not at Y2). */
 
 L2603: if(!game.closed) goto L2605;
-       if(PROP[OYSTER] < 0 && TOTING(OYSTER))PSPEAK(OYSTER,1);
+       if(game.prop[OYSTER] < 0 && TOTING(OYSTER))PSPEAK(OYSTER,1);
        for (I=1; I<=NOBJECTS; I++) {
        for (I=1; I<=NOBJECTS; I++) {
-       if(TOTING(I) && PROP[I] < 0)PROP[I]= -1-PROP[I];
+       if(TOTING(I) && game.prop[I] < 0)game.prop[I]= -1-game.prop[I];
        } /* end loop */
 L2605: game.wzdark=DARK(0);
        } /* end loop */
 L2605: game.wzdark=DARK(0);
-       if(game.knfloc > 0 && game.knfloc != LOC)game.knfloc=0;
+       if(game.knfloc > 0 && game.knfloc != game.loc)game.knfloc=0;
        I=0;
        if (!GETIN(cmdin, WD1,WD1X,WD2,WD2X))
            return false;
        I=0;
        if (!GETIN(cmdin, WD1,WD1X,WD2,WD2X))
            return false;
@@ -424,17 +420,17 @@ L2607:    game.foobar=(game.foobar>0 ? -game.foobar : 0);
        }
        if(VERB == SAY && WD2 > 0)VERB=0;
        if(VERB == SAY) goto L4090;
        }
        if(VERB == SAY && WD2 > 0)VERB=0;
        if(VERB == SAY) goto L4090;
-       if(game.tally == 0 && INDEEP(LOC) && LOC != 33)game.clock1=game.clock1-1;
+       if(game.tally == 0 && INDEEP(game.loc) && game.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(game.clock1 == 0) goto L10000;
        if(game.clock1 < 0)game.clock2=game.clock2-1;
        if(game.clock2 == 0) goto L11000;
-       if(PROP[LAMP] == 1)game.limit=game.limit-1;
-       if(game.limit <= 30 && HERE(BATTER) && PROP[BATTER] == 0 && HERE(LAMP)) goto
+       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 == 0) goto L12400;
        if(game.limit <= 30) goto L12200;
 L19999: K=43;
                L12000;
        if(game.limit == 0) goto L12400;
        if(game.limit <= 30) goto L12200;
 L19999: K=43;
-       if(LIQLOC(LOC) == WATER)K=70;
+       if(LIQLOC(game.loc) == WATER)K=70;
        V1=VOCAB(WD1,-1);
        V2=VOCAB(WD2,-1);
        if(V1 == ENTER && (V2 == STREAM || V2 == 1000+WATER)) goto L2010;
        V1=VOCAB(WD1,-1);
        V2=VOCAB(WD2,-1);
        if(V1 == ENTER && (V2 == STREAM || V2 == 1000+WATER)) goto L2010;
@@ -476,11 +472,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; goto Laction;
+L4000: I=4000; VERB=K; goto Laction;
 L4090: I=4090; goto Laction;
 L5000: I=5000;
 Laction:
 L4090: I=4090; goto Laction;
 L5000: I=5000;
 Laction:
-        switch (action(cmdin, I)) {
+        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;
@@ -503,28 +499,28 @@ Laction:
 
 L8000: SETPRM(1,WD1,WD1X);
        RSPEAK(257);
 
 L8000: SETPRM(1,WD1,WD1X);
        RSPEAK(257);
-       OBJ=0;
+       obj=0;
        goto L2600;
 
 /*  Figure out the new location
  *
        goto L2600;
 
 /*  Figure out the new location
  *
- *  Given the current location in "LOC", and a motion verb number in
+ *  Given the current location in "game.loc", and a motion verb number in
  *  "K", put the new location in "game.newloc".  The current loc is saved
  *  "K", put the new location in "game.newloc".  The current loc is saved
- *  in "game.olddloc" in case he wants to retreat.  The current
+ *  in "game.oldloc" in case he wants to retreat.  The current
  *  game.oldloc is saved in game.oldlc2, in case he dies.  (if he
  *  does, game.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.) */
 
  *  game.oldloc is saved in game.oldlc2, in case he dies.  (if he
  *  does, game.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];
-       game.newloc=LOC;
+L8:    KK=KEY[game.loc];
+       game.newloc=game.loc;
        if(KK == 0)BUG(26);
        if(K == NUL) return true;
        if(K == BACK) goto L20;
        if(K == LOOK) goto L30;
        if(K == CAVE) goto L40;
        game.oldlc2=game.oldloc;
        if(KK == 0)BUG(26);
        if(K == NUL) return true;
        if(K == BACK) goto L20;
        if(K == LOOK) goto L30;
        if(K == CAVE) goto L40;
        game.oldlc2=game.oldloc;
-       game.oldloc=LOC;
+       game.oldloc=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;
@@ -536,7 +532,7 @@ L10:        LL=LL/1000;
 L11:   game.newloc=LL/1000;
         K=MOD(game.newloc,100);        /* ESR: an instance of NOBJECTS? */
        if(game.newloc <= 300) goto L13;
 L11:   game.newloc=LL/1000;
         K=MOD(game.newloc,100);        /* ESR: an instance of NOBJECTS? */
        if(game.newloc <= 300) goto L13;
-       if(PROP[K] != game.newloc/100-3) goto L16;
+       if(game.prop[K] != game.newloc/100-3) goto L16;
 L12:   if(TRAVEL[KK] < 0)BUG(25);
        KK=KK+1;
        game.newloc=labs(TRAVEL[KK])/1000;
 L12:   if(TRAVEL[KK] < 0)BUG(25);
        KK=KK+1;
        game.newloc=labs(TRAVEL[KK])/1000;
@@ -553,7 +549,7 @@ L16:        game.newloc=MOD(LL,1000);
        if(game.newloc <= 300) return true;
        if(game.newloc <= 500) goto L30000;
        RSPEAK(game.newloc-500);
        if(game.newloc <= 300) return true;
        if(game.newloc <= 500) goto L30000;
        RSPEAK(game.newloc-500);
-       game.newloc=LOC;
+       game.newloc=game.loc;
         return true;
 
 /*  Special motions come here.  Labelling convention: statement numbers NNNXX
         return true;
 
 /*  Special motions come here.  Labelling convention: statement numbers NNNXX
@@ -568,9 +564,9 @@ L30000: game.newloc=game.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: game.newloc=99+100-LOC;        /* ESR: an instance of NOBJECTS? */
+L30100: game.newloc=99+100-game.loc;   /* ESR: an instance of NOBJECTS? */
        if(game.holdng == 0 || (game.holdng == 1 && TOTING(EMRALD))) return true;
        if(game.holdng == 0 || (game.holdng == 1 && TOTING(EMRALD))) return true;
-       game.newloc=LOC;
+       game.newloc=game.loc;
        RSPEAK(117);
        return true;
 
        RSPEAK(117);
        return true;
 
@@ -578,50 +574,50 @@ L30100: game.newloc=99+100-LOC;   /* ESR: an instance of NOBJECTS? */
  *  toting it), so he's forced to use the plover-passage to get it out.  Having
  *  dropped it, go back and pretend he wasn't carrying it after all. */
 
  *  toting it), so he's forced to use the plover-passage to get it out.  Having
  *  dropped it, go back and pretend he wasn't carrying it after all. */
 
-L30200: DROP(EMRALD,LOC);
+L30200: DROP(EMRALD,game.loc);
         goto L12;
 
 /*  Travel 303.  Troll bridge.  Must be done only as special motion so that
  *  dwarves won't wander across and encounter the bear.  (They won't follow the
  *  player there because that region is forbidden to the pirate.)  If
         goto L12;
 
 /*  Travel 303.  Troll bridge.  Must be done only as special motion so that
  *  dwarves won't wander across and encounter the bear.  (They won't follow the
  *  player there because that region is forbidden to the pirate.)  If
- *  PROP(TROLL)=1, he's crossed since paying, so step out and block him.
- *  (standard travel entries check for PROP(TROLL)=0.)  Special stuff for bear. */
+ *  game.prop(TROLL)=1, he's crossed since paying, so step out and block him.
+ *  (standard travel entries check for game.prop(TROLL)=0.)  Special stuff for bear. */
 
 
-L30300: if(PROP[TROLL] != 1) goto L30310;
+L30300: if(game.prop[TROLL] != 1) goto L30310;
        PSPEAK(TROLL,1);
        PSPEAK(TROLL,1);
-       PROP[TROLL]=0;
+       game.prop[TROLL]=0;
        MOVE(TROLL2,0);
        MOVE(TROLL2+NOBJECTS,0);
        MOVE(TROLL,PLAC[TROLL]);
        MOVE(TROLL+NOBJECTS,FIXD[TROLL]);
        JUGGLE(CHASM);
        MOVE(TROLL2,0);
        MOVE(TROLL2+NOBJECTS,0);
        MOVE(TROLL,PLAC[TROLL]);
        MOVE(TROLL+NOBJECTS,FIXD[TROLL]);
        JUGGLE(CHASM);
-       game.newloc=LOC;
+       game.newloc=game.loc;
        return true;
 
        return true;
 
-L30310: game.newloc=PLAC[TROLL]+FIXD[TROLL]-LOC;
-       if(PROP[TROLL] == 0)PROP[TROLL]=1;
+L30310: game.newloc=PLAC[TROLL]+FIXD[TROLL]-game.loc;
+       if(game.prop[TROLL] == 0)game.prop[TROLL]=1;
        if(!TOTING(BEAR)) return true;
        RSPEAK(162);
        if(!TOTING(BEAR)) return true;
        RSPEAK(162);
-       PROP[CHASM]=1;
-       PROP[TROLL]=2;
+       game.prop[CHASM]=1;
+       game.prop[TROLL]=2;
        DROP(BEAR,game.newloc);
        game.fixed[BEAR]= -1;
        DROP(BEAR,game.newloc);
        game.fixed[BEAR]= -1;
-       PROP[BEAR]=3;
+       game.prop[BEAR]=3;
        game.oldlc2=game.newloc;
         goto L99;
 
 /*  End of specials. */
 
        game.oldlc2=game.newloc;
         goto L99;
 
 /*  End of specials. */
 
-/*  Handle "go back".  Look for verb which goes from LOC to game.oldloc, or to game.oldlc2
+/*  Handle "go back".  Look for verb which goes from game.loc to game.oldloc, or to game.oldlc2
  *  If game.oldloc has forced-motion.  K2 saves entry -> forced loc -> previous loc. */
 
 L20:   K=game.oldloc;
        if(FORCED(K))K=game.oldlc2;
        game.oldlc2=game.oldloc;
  *  If game.oldloc has forced-motion.  K2 saves entry -> forced loc -> previous loc. */
 
 L20:   K=game.oldloc;
        if(FORCED(K))K=game.oldlc2;
        game.oldlc2=game.oldloc;
-       game.oldloc=LOC;
+       game.oldloc=game.loc;
        K2=0;
        K2=0;
-       if(K == LOC)K2=91;
-       if(CNDBIT(LOC,4))K2=274;
+       if(K == game.loc)K2=91;
+       if(CNDBIT(game.loc,4))K2=274;
        if(K2 == 0) goto L21;
        RSPEAK(K2);
        return true;
        if(K2 == 0) goto L21;
        RSPEAK(K2);
        return true;
@@ -645,7 +641,7 @@ L23:                KK=K2;
        }
 
        K=MOD(labs(TRAVEL[KK]),1000);
        }
 
        K=MOD(labs(TRAVEL[KK]),1000);
-       KK=KEY[LOC];
+       KK=KEY[game.loc];
         goto L9;
 
 /*  Look.  Can't give more detail.  Pretend it wasn't dark (though it may "now"
         goto L9;
 
 /*  Look.  Can't give more detail.  Pretend it wasn't dark (though it may "now"
@@ -654,13 +650,13 @@ L23:              KK=K2;
 L30:   if(game.detail < 3)RSPEAK(15);
        game.detail=game.detail+1;
        game.wzdark=false;
 L30:   if(game.detail < 3)RSPEAK(15);
        game.detail=game.detail+1;
        game.wzdark=false;
-       game.abbrev[LOC]=0;
+       game.abbrev[game.loc]=0;
        return true;
 
 /*  Cave.  Different messages depending on whether above ground. */
 
 L40:   K=58;
        return true;
 
 /*  Cave.  Different messages depending on whether above ground. */
 
 L40:   K=58;
-       if(OUTSID(LOC) && LOC != 8)K=57;
+       if(OUTSID(game.loc) && game.loc != 8)K=57;
        RSPEAK(K);
        return true;
 
        RSPEAK(K);
        return true;
 
@@ -697,7 +693,7 @@ L50:        SPK=12;
 /*  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);
-       game.oldlc2=LOC;
+       game.oldlc2=game.loc;
 
 /*  Okay, he's dead.  Let's get on with it. */
 
 
 /*  Okay, he's dead.  Let's get on with it. */
 
@@ -707,7 +703,7 @@ L99:        if(game.closng) goto L95;
        if(game.numdie == MAXDIE) score(0);
        game.place[WATER]=0;
        game.place[OIL]=0;
        if(game.numdie == MAXDIE) score(0);
        game.place[WATER]=0;
        game.place[OIL]=0;
-       if(TOTING(LAMP))PROP[LAMP]=0;
+       if(TOTING(LAMP))game.prop[LAMP]=0;
        /* 98 */ for (J=1; J<=NOBJECTS; J++) {
        I=NOBJECTS + 1 - J;
        if(!TOTING(I)) goto L98;
        /* 98 */ for (J=1; J<=NOBJECTS; J++) {
        I=NOBJECTS + 1 - J;
        if(!TOTING(I)) goto L98;
@@ -716,8 +712,8 @@ L99:        if(game.closng) goto L95;
        DROP(I,K);
 L98:   /*etc*/ ;
        } /* end loop */
        DROP(I,K);
 L98:   /*etc*/ ;
        } /* end loop */
-       LOC=3;
-       game.oldloc=LOC;
+       game.loc=3;
+       game.oldloc=game.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. */
@@ -734,7 +730,7 @@ L95:        RSPEAK(131);
 /*  Come here if he's been long enough at required loc(s) for some unused hint.
  *  hint number is in variable "hint".  Branch to quick test for additional
  *  conditions, then come back to do neat stuff.  Goto 40010 if conditions are
 /*  Come here if he's been long enough at required loc(s) for some unused hint.
  *  hint number is in variable "hint".  Branch to quick test for additional
  *  conditions, then come back to do neat stuff.  Goto 40010 if conditions are
- *  met and we want to offer the hint.  Goto 40020 to clear HINTLC back to zero,
+ *  met and we want to offer the hint.  Goto 40020 to clear game.hintlc back to zero,
  *  40030 to take no action yet. */
 
 L40000:    switch (HINT-1) { case 0: goto L40100; case 1: goto L40200; case 2: goto
  *  40030 to take no action yet. */
 
 L40000:    switch (HINT-1) { case 0: goto L40100; case 1: goto L40200; case 2: goto
@@ -745,31 +741,31 @@ L40000:    switch (HINT-1) { case 0: goto L40100; case 1: goto L40200; case 2: g
  *             JADE */
        BUG(27);
 
  *             JADE */
        BUG(27);
 
-L40010: HINTLC[HINT]=0;
+L40010: game.hintlc[HINT]=0;
        if(!YES(cmdin,HINTS[HINT][3],0,54)) goto L2602;
        SETPRM(1,HINTS[HINT][2],HINTS[HINT][2]);
        RSPEAK(261);
        game.hinted[HINT]=YES(cmdin,175,HINTS[HINT][4],54);
        if(game.hinted[HINT] && game.limit > 30)game.limit=game.limit+30*HINTS[HINT][2];
        if(!YES(cmdin,HINTS[HINT][3],0,54)) goto L2602;
        SETPRM(1,HINTS[HINT][2],HINTS[HINT][2]);
        RSPEAK(261);
        game.hinted[HINT]=YES(cmdin,175,HINTS[HINT][4],54);
        if(game.hinted[HINT] && game.limit > 30)game.limit=game.limit+30*HINTS[HINT][2];
-L40020: HINTLC[HINT]=0;
+L40020: game.hintlc[HINT]=0;
 L40030:  goto L2602;
 
 /*  Now for the quick tests.  See database description for one-line notes. */
 
 L40030:  goto L2602;
 
 /*  Now for the quick tests.  See database description for one-line notes. */
 
-L40100: if(PROP[GRATE] == 0 && !HERE(KEYS)) goto L40010;
+L40100: if(game.prop[GRATE] == 0 && !HERE(KEYS)) goto L40010;
         goto L40020;
 
         goto L40020;
 
-L40200: if(game.place[BIRD] == LOC && TOTING(ROD) && game.oldobj == BIRD) goto L40010;
+L40200: if(game.place[BIRD] == game.loc && TOTING(ROD) && game.oldobj == BIRD) goto L40010;
         goto L40030;
 
 L40300: if(HERE(SNAKE) && !HERE(BIRD)) goto L40010;
         goto L40020;
 
         goto L40030;
 
 L40300: if(HERE(SNAKE) && !HERE(BIRD)) goto L40010;
         goto L40020;
 
-L40400: if(game.atloc[LOC] == 0 && game.atloc[game.oldloc] == 0 && game.atloc[game.oldlc2] == 0 && game.holdng >
+L40400: if(game.atloc[game.loc] == 0 && game.atloc[game.oldloc] == 0 && game.atloc[game.oldlc2] == 0 && game.holdng >
                1) goto L40010;
         goto L40020;
 
                1) goto L40010;
         goto L40020;
 
-L40500: if(PROP[EMRALD] != -1 && PROP[PYRAM] == -1) goto L40010;
+L40500: if(game.prop[EMRALD] != -1 && game.prop[PYRAM] == -1) goto L40010;
         goto L40020;
 
 L40600:  goto L40010;
         goto L40020;
 
 L40600:  goto L40010;
@@ -777,16 +773,16 @@ L40600:  goto L40010;
 L40700: if(game.dflag == 0) goto L40010;
         goto L40020;
 
 L40700: if(game.dflag == 0) goto L40010;
         goto L40020;
 
-L40800: if(game.atloc[LOC] == 0 && game.atloc[game.oldloc] == 0 && game.atloc[game.oldlc2] == 0) goto
+L40800: if(game.atloc[game.loc] == 0 && game.atloc[game.oldloc] == 0 && game.atloc[game.oldlc2] == 0) goto
                L40010;
         goto L40030;
 
                L40010;
         goto L40030;
 
-L40900: I=ATDWRF(LOC);
+L40900: I=ATDWRF(game.loc);
        if(I < 0) goto L40020;
        if(HERE(OGRE) && I == 0) goto L40010;
         goto L40030;
 
        if(I < 0) goto L40020;
        if(HERE(OGRE) && I == 0) goto L40010;
         goto L40030;
 
-L41000: if(game.tally == 1 && PROP[JADE] < 0) goto L40010;
+L41000: if(game.tally == 1 && game.prop[JADE] < 0) goto L40010;
         goto L40020;
 
 
         goto L40020;
 
 
@@ -825,8 +821,8 @@ L41000: if(game.tally == 1 && PROP[JADE] < 0) goto L40010;
  *  gotten the pearl, so we know the bivalve is an oyster.  *And*, the dwarves
  *  must have been activated, since we've found chest. */
 
  *  gotten the pearl, so we know the bivalve is an oyster.  *And*, the dwarves
  *  must have been activated, since we've found chest. */
 
-L10000: PROP[GRATE]=0;
-       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;
        for (I=1; I<=NDWARVES; I++) {
        game.dseen[I]=false;
        game.dloc[I]=0;
@@ -836,10 +832,10 @@ L10000: PROP[GRATE]=0;
        MOVE(TROLL2,PLAC[TROLL]);
        MOVE(TROLL2+NOBJECTS,FIXD[TROLL]);
        JUGGLE(CHASM);
        MOVE(TROLL2,PLAC[TROLL]);
        MOVE(TROLL2+NOBJECTS,FIXD[TROLL]);
        JUGGLE(CHASM);
-       if(PROP[BEAR] != 3)DSTROY(BEAR);
-       PROP[CHAIN]=0;
+       if(game.prop[BEAR] != 3)DSTROY(BEAR);
+       game.prop[CHAIN]=0;
        game.fixed[CHAIN]=0;
        game.fixed[CHAIN]=0;
-       PROP[AXE]=0;
+       game.prop[AXE]=0;
        game.fixed[AXE]=0;
        RSPEAK(129);
        game.clock1= -1;
        game.fixed[AXE]=0;
        RSPEAK(129);
        game.clock1= -1;
@@ -858,14 +854,14 @@ L10000: PROP[GRATE]=0;
  *  objects he might be carrying (lest he have some which could cause trouble,
  *  such as the keys).  We describe the flash of light and trundle back. */
 
  *  objects he might be carrying (lest he have some which could cause trouble,
  *  such as the keys).  We describe the flash of light and trundle back. */
 
-L11000: PROP[BOTTLE]=PUT(BOTTLE,115,1);
-       PROP[PLANT]=PUT(PLANT,115,0);
-       PROP[OYSTER]=PUT(OYSTER,115,0);
+L11000: game.prop[BOTTLE]=PUT(BOTTLE,115,1);
+       game.prop[PLANT]=PUT(PLANT,115,0);
+       game.prop[OYSTER]=PUT(OYSTER,115,0);
        OBJTXT[OYSTER]=3;
        OBJTXT[OYSTER]=3;
-       PROP[LAMP]=PUT(LAMP,115,0);
-       PROP[ROD]=PUT(ROD,115,0);
-       PROP[DWARF]=PUT(DWARF,115,0);
-       LOC=115;
+       game.prop[LAMP]=PUT(LAMP,115,0);
+       game.prop[ROD]=PUT(ROD,115,0);
+       game.prop[DWARF]=PUT(DWARF,115,0);
+       game.loc=115;
        game.oldloc=115;
        game.newloc=115;
 
        game.oldloc=115;
        game.newloc=115;
 
@@ -874,13 +870,13 @@ L11000: PROP[BOTTLE]=PUT(BOTTLE,115,1);
        I=PUT(GRATE,116,0);
        I=PUT(SIGN,116,0);
        OBJTXT[SIGN]=OBJTXT[SIGN]+1;
        I=PUT(GRATE,116,0);
        I=PUT(SIGN,116,0);
        OBJTXT[SIGN]=OBJTXT[SIGN]+1;
-       PROP[SNAKE]=PUT(SNAKE,116,1);
-       PROP[BIRD]=PUT(BIRD,116,1);
-       PROP[CAGE]=PUT(CAGE,116,0);
-       PROP[ROD2]=PUT(ROD2,116,0);
-       PROP[PILLOW]=PUT(PILLOW,116,0);
+       game.prop[SNAKE]=PUT(SNAKE,116,1);
+       game.prop[BIRD]=PUT(BIRD,116,1);
+       game.prop[CAGE]=PUT(CAGE,116,0);
+       game.prop[ROD2]=PUT(ROD2,116,0);
+       game.prop[PILLOW]=PUT(PILLOW,116,0);
 
 
-       PROP[MIRROR]=PUT(MIRROR,115,0);
+       game.prop[MIRROR]=PUT(MIRROR,115,0);
        game.fixed[MIRROR]=116;
 
        for (I=1; I<=NOBJECTS; I++) {
        game.fixed[MIRROR]=116;
 
        for (I=1; I<=NOBJECTS; I++) {
@@ -899,8 +895,8 @@ L11000: PROP[BOTTLE]=PUT(BOTTLE,115,1);
  *  out.  Even then, he can explore outside for a while if desired. */
 
 L12000: RSPEAK(188);
  *  out.  Even then, he can explore outside for a while if desired. */
 
 L12000: RSPEAK(188);
-       PROP[BATTER]=1;
-       if(TOTING(BATTER))DROP(BATTER,LOC);
+       game.prop[BATTER]=1;
+       if(TOTING(BATTER))DROP(BATTER,game.loc);
        game.limit=game.limit+2500;
        game.lmwarn=false;
         goto L19999;
        game.limit=game.limit+2500;
        game.lmwarn=false;
         goto L19999;
@@ -909,12 +905,12 @@ L12200: if(game.lmwarn || !HERE(LAMP)) goto L19999;
        game.lmwarn=true;
        SPK=187;
        if(game.place[BATTER] == 0)SPK=183;
        game.lmwarn=true;
        SPK=187;
        if(game.place[BATTER] == 0)SPK=183;
-       if(PROP[BATTER] == 1)SPK=189;
+       if(game.prop[BATTER] == 1)SPK=189;
        RSPEAK(SPK);
         goto L19999;
 
 L12400: game.limit= -1;
        RSPEAK(SPK);
         goto L19999;
 
 L12400: game.limit= -1;
-       PROP[LAMP]=0;
+       game.prop[LAMP]=0;
        if(HERE(LAMP))RSPEAK(184);
         goto L19999;
 
        if(HERE(LAMP))RSPEAK(184);
         goto L19999;