Pull more globals into the game state block.
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index 3239fc32d6f05ab4dd088aaee269bf53e6f194f0..8a58c5770035dfa8815d1c28ccb41c26a198f260 100644 (file)
--- a/main.c
+++ b/main.c
@@ -14,8 +14,7 @@
 
 struct game_t game;
 
-long ABB[186], ATLOC[186],
-               FIXED[NOBJECTS+1],
+long ATLOC[186], FIXED[NOBJECTS+1],
                LINK[NOBJECTS*2 + 1], LNLENG, LNPOSN,
                PARMS[26], PLACE[NOBJECTS+1],
                SETUP = 0;
@@ -23,21 +22,18 @@ 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,
-               CLAM, CLSHNT, COINS, DALTLC,
-               DOOR, DPRSSN, DRAGON, DWARF, EGGS,
+               CLAM, COINS, DALTLC, DOOR, DPRSSN, DRAGON, DWARF, EGGS,
                EMRALD, ENTER, ENTRNC, FIND, FISSUR, FOOD,
                GRATE, HINT, HINTED[21], 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,
-               NEWLOC, NOVICE, NUGGET, NUL, NUMDIE, OBJ,
-               OGRE, OIL, OLDOBJ, OYSTER,
-               PANIC, PEARL, PILLOW, PLANT, PLANT2, PROP[NOBJECTS+1], PYRAM,
-               RESER, ROD, ROD2, RUBY, RUG, SAPPH, SAVED, SAY,
+               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, TALLY, THRESH, THROW, TK[21], TRIDNT,
-               TRNDEX, TRNLUZ, TROLL, TROLL2,
-               TURNS, URN, V1, V2, VASE, VEND, VERB,
+               STREAM, THROW, TK[21], TRIDNT, TROLL, TROLL2,
+               URN, V1, V2, VASE, VEND, VERB,
                VOLCAN, VRSION = 25, WATER, WD1, WD1X, WD2, WD2X;
 FILE  *logfp;
 bool oldstyle = false;
@@ -94,10 +90,10 @@ int main(int argc, char *argv[]) {
  *
  *  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
+ *  game.clshnt says whether he's read the clue in the endgame
  *  game.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
+ *  game.novice says whether he asked for instructions at start-up
+ *  game.panic says whether he's found out he's trapped in the cave
  *  game.wzdark says whether the loc he's leaving was dark */
 
 #include "funcs.h"
@@ -130,11 +126,11 @@ int main(int argc, char *argv[]) {
 L1:    SETUP= -1;
        I=0;
        game.zzword=RNDVOC(3,0);
-       NOVICE=YES(stdin, 65,1,0);
-       NEWLOC=1;
+       game.novice=YES(stdin, 65,1,0);
+       game.newloc=1;
        LOC=1;
        game.limit=330;
-       if(NOVICE)game.limit=1000;
+       if(game.novice)game.limit=1000;
 
        if (logfp)
            fprintf(logfp, "seed %ld\n", seedval);
@@ -154,7 +150,7 @@ static bool fallback_handler(char *buf)
        set_seed(sv);
        printf("Seed set to %ld\n", sv);
        // autogenerated, so don't charge user time for it.
-       --TURNS;
+       --game.turns;
        // here we reconfigure any global game state that uses random numbers
        game.zzword=RNDVOC(3,0);
        return true;
@@ -166,37 +162,37 @@ static bool do_command(FILE *cmdin) {
 
 /*  Can't leave cave once it's closing (except by main office). */
 
-       if(!OUTSID(NEWLOC) || NEWLOC == 0 || !game.closng) goto L71;
+       if(!OUTSID(game.newloc) || game.newloc == 0 || !game.closng) goto L71;
        RSPEAK(130);
-       NEWLOC=LOC;
-       if(!PANIC)game.clock2=15;
-       PANIC=true;
+       game.newloc=LOC;
+       if(!game.panic)game.clock2=15;
+       game.panic=true;
 
 /*  See if a dwarf has seen him and has come from where he wants to go.  If so,
  *  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(NEWLOC == LOC || FORCED(LOC) || CNDBIT(LOC,3)) goto L74;
+L71:   if(game.newloc == LOC || FORCED(LOC) || CNDBIT(LOC,3)) goto L74;
        /* 73 */ for (I=1; I<=NDWARVES-1; I++) {
-       if(game.odloc[I] != NEWLOC || !game.dseen[I]) goto L73;
-       NEWLOC=LOC;
+       if(game.odloc[I] != game.newloc || !game.dseen[I]) goto L73;
+       game.newloc=LOC;
        RSPEAK(2);
         goto L74;
 L73:   /*etc*/ ;
        } /* end loop */
-L74:   LOC=NEWLOC;
+L74:   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. */
 
 /*  First off, don't let the dwarves follow him into a pit or a wall.  Activate
  *  the whole mess the first time he gets as far as the hall of mists (loc 15).
- *  If NEWLOC is forbidden to pirate (in particular, if it's beyond the troll
+ *  If game.newloc is forbidden to pirate (in particular, if it's beyond the troll
  *  bridge), bypass dwarf stuff.  That way pirate can't steal return toll, and
  *  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(NEWLOC,3)) goto L2000;
+       if(LOC == 0 || FORCED(LOC) || CNDBIT(game.newloc,3)) goto L2000;
        if(game.dflag != 0) goto L6000;
        if(INDEEP(LOC))game.dflag=1;
         goto L2000;
@@ -234,13 +230,13 @@ L6010:    game.dtotal=0;
        KK=game.dloc[I];
        KK=KEY[KK];
        if(KK == 0) goto L6016;
-L6012: NEWLOC=MOD(labs(TRAVEL[KK])/1000,1000);
+L6012: game.newloc=MOD(labs(TRAVEL[KK])/1000,1000);
        {long x = J-1;
-       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)) ||
+       if(game.newloc > 300 || !INDEEP(game.newloc) || game.newloc == game.odloc[I] || (J > 1 &&
+               game.newloc == TK[x]) || J >= 20 || game.newloc == game.dloc[I] ||
+               FORCED(game.newloc) || (I == 6 && CNDBIT(game.newloc,3)) ||
                labs(TRAVEL[KK])/1000000 == 100) goto L6014;}
-       TK[J]=NEWLOC;
+       TK[J]=game.newloc;
        J=J+1;
 L6014: KK=KK+1;
        {long x = KK-1; if(TRAVEL[x] >= 0) goto L6012;}
@@ -267,7 +263,7 @@ L6016:      TK[J]=game.odloc[I];
        if(TOTING(J)) goto L6021;
 L6020: if(HERE(J))K=1;
        } /* end loop */
-       if(TALLY == 1 && K == 0 && PLACE[CHEST] == 0 && HERE(LAMP) && PROP[LAMP]
+       if(game.tally == 1 && K == 0 && PLACE[CHEST] == 0 && HERE(LAMP) && PROP[LAMP]
                == 1) goto L6025;
        if(game.odloc[6] != game.dloc[6] && PCT(20))RSPEAK(127);
         goto L6030;
@@ -333,7 +329,7 @@ L6030:      /*etc*/ ;
 
 L2000: if(LOC == 0) goto L99;
        KK=STEXT[LOC];
-       if(MOD(ABB[LOC],game.abbnum) == 0 || KK == 0)KK=LTEXT[LOC];
+       if(MOD(game.abbrev[LOC],game.abbnum) == 0 || KK == 0)KK=LTEXT[LOC];
        if(FORCED(LOC) || !DARK(0)) goto L2001;
        if(game.wzdark && PCT(35)) goto L90;
        KK=RTEXT[16];
@@ -350,7 +346,7 @@ L2001:      if(TOTING(BEAR))RSPEAK(141);
  *  are because PROP=0 is needed to get full score. */
 
        if(DARK(0)) goto L2012;
-       ABB[LOC]=ABB[LOC]+1;
+       game.abbrev[LOC]=game.abbrev[LOC]+1;
        I=ATLOC[LOC];
 L2004: if(I == 0) goto L2012;
        OBJ=I;
@@ -360,7 +356,7 @@ L2004:      if(I == 0) goto L2012;
        if(game.closed) goto L2008;
        PROP[OBJ]=0;
        if(OBJ == RUG || OBJ == CHAIN)PROP[OBJ]=1;
-       TALLY=TALLY-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
  *  the lamp was zapped to 35 turns.  But the tests were too simple-minded;
@@ -383,7 +379,7 @@ L2010:      SPK=K;
 L2011: RSPEAK(SPK);
 
 L2012: VERB=0;
-       OLDOBJ=OBJ;
+       game.oldobj=OBJ;
        OBJ=0;
 
 /*  Check if this loc is eligible for any hints.  If been here long enough,
@@ -420,18 +416,18 @@ L2605:    game.wzdark=DARK(0);
  *  make neg.  If neg, he skipped a word, so make it zero. */
 
 L2607: game.foobar=(game.foobar>0 ? -game.foobar : 0);
-       TURNS=TURNS+1;
-       if(TURNS == THRESH) {
-       SPEAK(TTEXT[TRNDEX]);
-       TRNLUZ=TRNLUZ+TRNVAL[TRNDEX]/100000;
-       TRNDEX=TRNDEX+1;
-       THRESH= -1;
-       if(TRNDEX <= TRNVLS)
-           THRESH=MOD(TRNVAL[TRNDEX],100000)+1;
+       game.turns=game.turns+1;
+       if(game.turns == game.thresh) {
+       SPEAK(TTEXT[game.trndex]);
+       game.trnluz=game.trnluz+TRNVAL[game.trndex]/100000;
+       game.trndex=game.trndex+1;
+       game.thresh= -1;
+       if(game.trndex <= TRNVLS)
+           game.thresh=MOD(TRNVAL[game.trndex],100000)+1;
        }
        if(VERB == SAY && WD2 > 0)VERB=0;
        if(VERB == SAY) goto L4090;
-       if(TALLY == 0 && INDEEP(LOC) && LOC != 33)game.clock1=game.clock1-1;
+       if(game.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;
@@ -516,15 +512,15 @@ L8000:    SETPRM(1,WD1,WD1X);
 /*  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
+ *  "K", put the new location in "game.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
+ *  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];
-       NEWLOC=LOC;
+       game.newloc=LOC;
        if(KK == 0)BUG(26);
        if(K == NUL) return true;
        if(K == BACK) goto L20;
@@ -540,34 +536,34 @@ L9:       LL=labs(TRAVEL[KK]);
         goto L9;
 
 L10:   LL=LL/1000;
-L11:   NEWLOC=LL/1000;
-        K=MOD(NEWLOC,100);     /* ESR: an instance of NOBJECTS? */
-       if(NEWLOC <= 300) goto L13;
-       if(PROP[K] != NEWLOC/100-3) goto L16;
+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;
 L12:   if(TRAVEL[KK] < 0)BUG(25);
        KK=KK+1;
-       NEWLOC=labs(TRAVEL[KK])/1000;
-       if(NEWLOC == LL) goto L12;
-       LL=NEWLOC;
+       game.newloc=labs(TRAVEL[KK])/1000;
+       if(game.newloc == LL) goto L12;
+       LL=game.newloc;
         goto L11;
 
-L13:   if(NEWLOC <= 100) goto L14;     /* ESR: an instance of NOBJECTS? */
-       if(TOTING(K) || (NEWLOC > 200 && AT(K))) goto L16;
+L13:   if(game.newloc <= 100) goto L14;        /* ESR: an instance of NOBJECTS? */
+       if(TOTING(K) || (game.newloc > 200 && AT(K))) goto L16;
         goto L12;
 
-L14:   if(NEWLOC != 0 && !PCT(NEWLOC)) goto L12;
-L16:   NEWLOC=MOD(LL,1000);
-       if(NEWLOC <= 300) return true;
-       if(NEWLOC <= 500) goto L30000;
-       RSPEAK(NEWLOC-500);
-       NEWLOC=LOC;
+L14:   if(game.newloc != 0 && !PCT(game.newloc)) goto L12;
+L16:   game.newloc=MOD(LL,1000);
+       if(game.newloc <= 300) return true;
+       if(game.newloc <= 500) goto L30000;
+       RSPEAK(game.newloc-500);
+       game.newloc=LOC;
         return true;
 
 /*  Special motions come here.  Labelling convention: statement numbers NNNXX
  *  (XX=00-99) are used for special case number NNN (NNN=301-500). */
 
-L30000: NEWLOC=NEWLOC-300;
-        switch (NEWLOC) { case 1: goto L30100; case 2: goto L30200; case 3: goto
+L30000: game.newloc=game.newloc-300;
+        switch (game.newloc) { case 1: goto L30100; case 2: goto L30200; case 3: goto
                L30300; }
        BUG(20);
 
@@ -575,9 +571,9 @@ 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". */
 
-L30100: NEWLOC=99+100-LOC;     /* ESR: an instance of NOBJECTS? */
+L30100: game.newloc=99+100-LOC;        /* ESR: an instance of NOBJECTS? */
        if(game.holdng == 0 || (game.holdng == 1 && TOTING(EMRALD))) return true;
-       NEWLOC=LOC;
+       game.newloc=LOC;
        RSPEAK(117);
        return true;
 
@@ -602,19 +598,19 @@ L30300: if(PROP[TROLL] != 1) goto L30310;
        MOVE(TROLL,PLAC[TROLL]);
        MOVE(TROLL+NOBJECTS,FIXD[TROLL]);
        JUGGLE(CHASM);
-       NEWLOC=LOC;
+       game.newloc=LOC;
        return true;
 
-L30310: NEWLOC=PLAC[TROLL]+FIXD[TROLL]-LOC;
+L30310: game.newloc=PLAC[TROLL]+FIXD[TROLL]-LOC;
        if(PROP[TROLL] == 0)PROP[TROLL]=1;
        if(!TOTING(BEAR)) return true;
        RSPEAK(162);
        PROP[CHASM]=1;
        PROP[TROLL]=2;
-       DROP(BEAR,NEWLOC);
+       DROP(BEAR,game.newloc);
        FIXED[BEAR]= -1;
        PROP[BEAR]=3;
-       game.oldlc2=NEWLOC;
+       game.oldlc2=game.newloc;
         goto L99;
 
 /*  End of specials. */
@@ -661,7 +657,7 @@ L23:                KK=K2;
 L30:   if(game.detail < 3)RSPEAK(15);
        game.detail=game.detail+1;
        game.wzdark=false;
-       ABB[LOC]=0;
+       game.abbrev[LOC]=0;
        return true;
 
 /*  Cave.  Different messages depending on whether above ground. */
@@ -709,9 +705,9 @@ L90:        RSPEAK(23);
 /*  Okay, he's dead.  Let's get on with it. */
 
 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);
+       game.numdie=game.numdie+1;
+       if(!YES(cmdin,79+game.numdie*2,80+game.numdie*2,54)) score(0);
+       if(game.numdie == MAXDIE) score(0);
        PLACE[WATER]=0;
        PLACE[OIL]=0;
        if(TOTING(LAMP))PROP[LAMP]=0;
@@ -730,7 +726,7 @@ L98:        /*etc*/ ;
 /*  He died during closing time.  No resurrection.  Tally up a death and exit. */
 
 L95:   RSPEAK(131);
-       NUMDIE=NUMDIE+1;
+       game.numdie=game.numdie+1;
         score(0);
 
 
@@ -766,7 +762,7 @@ L40030:  goto L2602;
 L40100: if(PROP[GRATE] == 0 && !HERE(KEYS)) goto L40010;
         goto L40020;
 
-L40200: if(PLACE[BIRD] == LOC && TOTING(ROD) && OLDOBJ == BIRD) goto L40010;
+L40200: if(PLACE[BIRD] == LOC && TOTING(ROD) && game.oldobj == BIRD) goto L40010;
         goto L40030;
 
 L40300: if(HERE(SNAKE) && !HERE(BIRD)) goto L40010;
@@ -793,7 +789,7 @@ L40900: I=ATDWRF(LOC);
        if(HERE(OGRE) && I == 0) goto L40010;
         goto L40030;
 
-L41000: if(TALLY == 1 && PROP[JADE] < 0) goto L40010;
+L41000: if(game.tally == 1 && PROP[JADE] < 0) goto L40010;
         goto L40020;
 
 
@@ -874,7 +870,7 @@ L11000: PROP[BOTTLE]=PUT(BOTTLE,115,1);
        PROP[DWARF]=PUT(DWARF,115,0);
        LOC=115;
        game.oldloc=115;
-       NEWLOC=115;
+       game.newloc=115;
 
 /*  Leave the grate with normal (non-negative) property.  Reuse sign. */