First step in game state encapsulation: the dwarf & pirate locations.
authorEric S. Raymond <esr@thyrsus.com>
Wed, 7 Jun 2017 01:34:11 +0000 (21:34 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Wed, 7 Jun 2017 01:34:11 +0000 (21:34 -0400)
actions1.c
actions2.c
advent.h
init.c
main.c
misc.c

index 8a7ccadf0350ef24403c1c6f50a43dec5de02b0a..6a751d7cf5f55efacdfae1d2b517dee8695f1dc0 100644 (file)
@@ -542,13 +542,13 @@ L8305:    DATIME(&I,&K);
        SAVWDS(OBJTXT[SIGN],CLSHNT,NOVICE,K,K,K,K);
        SAVARR(ABB,LOCSIZ);
        SAVARR(ATLOC,LOCSIZ);
        SAVWDS(OBJTXT[SIGN],CLSHNT,NOVICE,K,K,K,K);
        SAVARR(ABB,LOCSIZ);
        SAVARR(ATLOC,LOCSIZ);
-       SAVARR(DLOC,NDWARVES);
-       SAVARR(DSEEN,NDWARVES);
+       SAVARR(game.dloc,NDWARVES);
+       SAVARR(game.dseen,NDWARVES);
        SAVARR(FIXED,NOBJECTS);
        SAVARR(HINTED,HNTSIZ);
        SAVARR(HINTLC,HNTSIZ);
        SAVARR(LINK,NOBJECTS*2);
        SAVARR(FIXED,NOBJECTS);
        SAVARR(HINTED,HNTSIZ);
        SAVARR(HINTLC,HNTSIZ);
        SAVARR(LINK,NOBJECTS*2);
-       SAVARR(ODLOC,NDWARVES);
+       SAVARR(game.odloc,NDWARVES);
        SAVARR(PLACE,NOBJECTS);
        SAVARR(PROP,NOBJECTS);
        SAVWRD(KK,K);
        SAVARR(PLACE,NOBJECTS);
        SAVARR(PROP,NOBJECTS);
        SAVWRD(KK,K);
index 08a62837e73449a499072458dc90ffbd97183ad4..208a453b402768e76d1fdc39466bfe0ac6868bee 100644 (file)
@@ -199,10 +199,10 @@ L9128:    RSPEAK(SPK);
        DSTROY(OGRE);
        K=0;
        for (I=1; I < PIRATE; I++) {
        DSTROY(OGRE);
        K=0;
        for (I=1; I < PIRATE; I++) {
-               if(DLOC[I] == LOC) {
+               if(game.dloc[I] == LOC) {
                        K=K+1;
                        K=K+1;
-                       DLOC[I]=61;
-                       DSEEN[I]=false;
+                       game.dloc[I]=61;
+                       game.dseen[I]=false;
                }
        }
        SPK=SPK+1+1/K;
                }
        }
        SPK=SPK+1+1/K;
@@ -233,8 +233,8 @@ int throw(FILE *cmdin) {
 
 L9172: SPK=48;
        if(randrange(NDWARVES+1) < DFLAG) goto L9175;
 
 L9172: SPK=48;
        if(randrange(NDWARVES+1) < DFLAG) goto L9175;
-       DSEEN[I]=false;
-       DLOC[I]=0;
+       game.dseen[I]=false;
+       game.dloc[I]=0;
        SPK=47;
        DKILL=DKILL+1;
        if(DKILL == 1)SPK=149;
        SPK=47;
        DKILL=DKILL+1;
        if(DKILL == 1)SPK=149;
index af9695a6d4151b982f4e9787cf0985dff9040c25..3dff47b05a3a08cfee33bd3e3ffd1cd65bd26f8d 100644 (file)
--- a/advent.h
+++ b/advent.h
@@ -13,7 +13,15 @@ typedef struct lcg_state
 typedef long token_t;  /* word token - someday this will be a character array */
 typedef long vocab_t;  /* index into a vocabulary array */
 
 typedef long token_t;  /* word token - someday this will be a character array */
 typedef long vocab_t;  /* index into a vocabulary array */
 
-extern long ABB[], ATLOC[], BLKLIN, DFLAG, DLOC[], FIXED[], HOLDNG,
+struct game_t {
+    long dseen[NDWARVES+1];
+    long dloc[NDWARVES+1];
+    long odloc[NDWARVES+1];
+};
+
+extern struct game_t game;
+
+extern long ABB[], ATLOC[], BLKLIN, DFLAG, FIXED[], HOLDNG,
                LINK[], LNLENG, LNPOSN,
                PARMS[], PLACE[];
 extern char rawbuf[LINESIZE], INLINE[LINESIZE+1], MAP1[], MAP2[];
                LINK[], LNLENG, LNPOSN,
                PARMS[], PLACE[];
 extern char rawbuf[LINESIZE], INLINE[LINESIZE+1], MAP1[], MAP2[];
@@ -82,15 +90,15 @@ extern long ABBNUM, AMBER, ATTACK, AXE, BACK, BATTER, BEAR,
    BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST, CHLOC, CHLOC2,
    CLAM, CLOCK1, CLOCK2, CLOSED, CLOSNG, CLSHNT,
    COINS, CONDS, DALTLC, DETAIL,
    BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST, CHLOC, CHLOC2,
    CLAM, CLOCK1, CLOCK2, CLOSED, CLOSNG, CLSHNT,
    COINS, CONDS, DALTLC, DETAIL,
-   DKILL, DOOR, DPRSSN, DRAGON, DSEEN[], DTOTAL, DWARF, EGGS,
+    DKILL, DOOR, DPRSSN, DRAGON, DTOTAL, DWARF, EGGS,
    EMRALD, ENTER, ENTRNC, FIND, FISSUR, FOOBAR, FOOD,
    GRATE, HINT, HINTED[], HINTLC[],
    I, INVENT, IGO, IWEST, J, JADE, K, K2, KEYS, KK,
    KNFLOC, KNIFE, KQ, L, LAMP, LIMIT, LL,
    EMRALD, ENTER, ENTRNC, FIND, FISSUR, FOOBAR, FOOD,
    GRATE, HINT, HINTED[], HINTLC[],
    I, INVENT, IGO, IWEST, J, JADE, K, K2, KEYS, KK,
    KNFLOC, KNIFE, KQ, L, LAMP, LIMIT, LL,
-  LMWARN, LOC, LOCK, LOOK,
+   LMWARN, LOC, LOCK, LOOK,
    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[], OGRE, OIL, OLDLC2, OLDLOC, OLDOBJ, OYSTER,
+   OGRE, OIL, OLDLC2, OLDLOC, OLDOBJ, OYSTER,
    PANIC, PEARL, PILLOW, PLANT, PLANT2, PROP[], PYRAM,
    RESER, ROD, ROD2, RUBY, RUG, SAPPH, SAVED, SAY,
    SCORE, SECT, SETUP, SIGN, SNAKE, SPK, STEPS, STICK,
    PANIC, PEARL, PILLOW, PLANT, PLANT2, PROP[], PYRAM,
    RESER, ROD, ROD2, RUBY, RUG, SAPPH, SAVED, SAY,
    SCORE, SECT, SETUP, SIGN, SNAKE, SPK, STEPS, STICK,
diff --git a/init.c b/init.c
index 1220d88d93e0a7683bf0693fe7b20e3ac1e1202c..2a714649e50026f6e2dcf276692cc98af7ba5328 100644 (file)
--- a/init.c
+++ b/init.c
@@ -314,10 +314,10 @@ L1106:    /*etc*/ ;
        SAY=VOCWRD(190125,2);
        THROW=VOCWRD(2008181523,2);
 
        SAY=VOCWRD(190125,2);
        THROW=VOCWRD(2008181523,2);
 
-/*  Initialise the dwarves.  DLOC is loc of dwarves, hard-wired in.  ODLOC is
+/*  Initialise the dwarves.  game.dloc is loc of dwarves, hard-wired in.  game.odloc is
  *  prior loc of each dwarf, initially garbage.  DALTLC is alternate initial loc
  *  for dwarf, in case one of them starts out on top of the adventurer.  (No 2
  *  prior loc of each dwarf, initially garbage.  DALTLC is alternate initial loc
  *  for dwarf, in case one of them starts out on top of the adventurer.  (No 2
- *  of the 5 initial locs are adjacent.)  DSEEN is true if dwarf has seen him.
+ *  of the 5 initial locs are adjacent.)  game.dseen is true if dwarf has seen him.
  *  DFLAG controls the level of activation of all this:
  *     0       No dwarf stuff yet (wait until reaches Hall Of Mists)
  *     1       Reached Hall Of Mists, but hasn't met first dwarf
  *  DFLAG controls the level of activation of all this:
  *     0       No dwarf stuff yet (wait until reaches Hall Of Mists)
  *     1       Reached Hall Of Mists, but hasn't met first dwarf
@@ -331,15 +331,15 @@ L1106:    /*etc*/ ;
        CHLOC=114;
        CHLOC2=140;
        for (I=1; I<=NDWARVES; I++) {
        CHLOC=114;
        CHLOC2=140;
        for (I=1; I<=NDWARVES; I++) {
-               DSEEN[I]=false;
+               game.dseen[I]=false;
        } /* end loop */
        DFLAG=0;
        } /* end loop */
        DFLAG=0;
-       DLOC[1]=19;
-       DLOC[2]=27;
-       DLOC[3]=33;
-       DLOC[4]=44;
-       DLOC[5]=64;
-       DLOC[6]=CHLOC;
+       game.dloc[1]=19;
+       game.dloc[2]=27;
+       game.dloc[3]=33;
+       game.dloc[4]=44;
+       game.dloc[5]=64;
+       game.dloc[6]=CHLOC;
        DALTLC=18;
 
 /*  Other random flags and counters, as follows:
        DALTLC=18;
 
 /*  Other random flags and counters, as follows:
diff --git a/main.c b/main.c
index 698163aeea417b686e2edc2efff69e91a79ba129..75982c651cab10000f7e3b868dd3eab0c512239b 100644 (file)
--- a/main.c
+++ b/main.c
 #include "advent.h"
 #include "database.h"
 
 #include "advent.h"
 #include "database.h"
 
+struct game_t game;
+
 long ABB[186], ATLOC[186], BLKLIN = true, DFLAG,
 long ABB[186], ATLOC[186], BLKLIN = true, DFLAG,
-               DLOC[7], FIXED[NOBJECTS+1], HOLDNG,
+               FIXED[NOBJECTS+1], HOLDNG,
                LINK[NOBJECTS*2 + 1], LNLENG, LNPOSN,
                PARMS[26], PLACE[NOBJECTS+1],
                SETUP = 0;
                LINK[NOBJECTS*2 + 1], LNLENG, LNPOSN,
                PARMS[26], PLACE[NOBJECTS+1],
                SETUP = 0;
@@ -23,7 +25,7 @@ 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,
                 BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST, CHLOC, CHLOC2,
                CLAM, CLOCK1, CLOCK2, CLOSED, CLOSNG, CLSHNT,
                COINS, CONDS, DALTLC, DETAIL,
-               DKILL, DOOR, DPRSSN, DRAGON, DSEEN[NDWARVES+1], DTOTAL, DWARF, EGGS,
+               DKILL, DOOR, DPRSSN, DRAGON, DTOTAL, 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,
@@ -32,7 +34,7 @@ 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[NDWARVES+1], OGRE, OIL, OLDLC2, OLDLOC, OLDOBJ, OYSTER,
+               OGRE, OIL, OLDLC2, OLDLOC, 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,
                PANIC, PEARL, PILLOW, PLANT, PLANT2, PROP[NOBJECTS+1], PYRAM,
                RESER, ROD, ROD2, RUBY, RUG, SAPPH, SAVED, SAY,
                SCORE, SECT, SIGN, SNAKE, SPK, STEPS, STICK,
@@ -180,7 +182,7 @@ static bool do_command(FILE *cmdin) {
 
 L71:   if(NEWLOC == LOC || FORCED(LOC) || CNDBIT(LOC,3)) goto L74;
        /* 73 */ for (I=1; I<=NDWARVES-1; I++) {
 
 L71:   if(NEWLOC == LOC || FORCED(LOC) || CNDBIT(LOC,3)) goto L74;
        /* 73 */ for (I=1; I<=NDWARVES-1; I++) {
-       if(ODLOC[I] != NEWLOC || !DSEEN[I]) goto L73;
+       if(game.odloc[I] != NEWLOC || !game.dseen[I]) goto L73;
        NEWLOC=LOC;
        RSPEAK(2);
         goto L74;
        NEWLOC=LOC;
        RSPEAK(2);
         goto L74;
@@ -211,11 +213,11 @@ L6000:    if(DFLAG != 1) goto L6010;
        DFLAG=2;
        for (I=1; I<=2; I++) {
        J=1+randrange(NDWARVES-1);
        DFLAG=2;
        for (I=1; I<=2; I++) {
        J=1+randrange(NDWARVES-1);
-       if(PCT(50))DLOC[J]=0;
+       if(PCT(50))game.dloc[J]=0;
        } /* end loop */
        for (I=1; I<=NDWARVES-1; I++) {
        } /* end loop */
        for (I=1; I<=NDWARVES-1; I++) {
-       if(DLOC[I] == LOC)DLOC[I]=DALTLC;
-       ODLOC[I]=DLOC[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);
@@ -230,30 +232,30 @@ L6010:    DTOTAL=0;
        ATTACK=0;
        STICK=0;
        /* 6030 */ for (I=1; I<=NDWARVES; I++) {
        ATTACK=0;
        STICK=0;
        /* 6030 */ for (I=1; I<=NDWARVES; I++) {
-       if(DLOC[I] == 0) goto L6030;
+       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;
 L6012: NEWLOC=MOD(labs(TRAVEL[KK])/1000,1000);
        {long x = J-1;
        KK=KEY[KK];
        if(KK == 0) goto L6016;
 L6012: NEWLOC=MOD(labs(TRAVEL[KK])/1000,1000);
        {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)) ||
                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;}
                FORCED(NEWLOC) || (I == 6 && CNDBIT(NEWLOC,3)) ||
                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;}
-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
@@ -271,7 +273,7 @@ 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;
         goto L6030;
 
 L6021: if(PLACE[CHEST] != 0) goto L6022;
@@ -285,9 +287,9 @@ L6022:      RSPEAK(128);
        if(TOTING(J))DROP(J,CHLOC);
 L6023: /*etc*/ ;
        } /* end loop */
        if(TOTING(J))DROP(J,CHLOC);
 L6023: /*etc*/ ;
        } /* end loop */
-L6024: DLOC[6]=CHLOC;
-       ODLOC[6]=CHLOC;
-       DSEEN[6]=false;
+L6024: game.dloc[6]=CHLOC;
+       game.odloc[6]=CHLOC;
+       game.dseen[6]=false;
         goto L6030;
 
 L6025: RSPEAK(186);
         goto L6030;
 
 L6025: RSPEAK(186);
@@ -298,7 +300,7 @@ L6025:      RSPEAK(186);
 /*  This threatening little dwarf is in the room with him! */
 
 L6027: DTOTAL=DTOTAL+1;
 /*  This threatening little dwarf is in the room with him! */
 
 L6027: DTOTAL=DTOTAL+1;
-       if(ODLOC[I] != DLOC[I]) goto L6030;
+       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;
@@ -518,9 +520,9 @@ L8000:      SETPRM(1,WD1,WD1X);
 /*  Figure out the new location
  *
  *  Given the current location in "LOC", and a motion verb number in "K", put
 /*  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
+ *  the new location in "NEWLOC".  The current loc is saved in "OLgame.dloc" in case
+ *  he wants to retreat.  The current OLgame.dloc is saved in OLDLC2, in case he
+ *  dies.  (if he does, NEWLOC will be limbo, and OLgame.dloc will be what killed
  *  him, so we need OLDLC2, which is the last place he was safe.) */
 
 L8:    KK=KEY[LOC];
  *  him, so we need OLDLC2, which is the last place he was safe.) */
 
 L8:    KK=KEY[LOC];
@@ -835,8 +837,8 @@ L41000: if(TALLY == 1 && PROP[JADE] < 0) goto L40010;
 L10000: PROP[GRATE]=0;
        PROP[FISSUR]=0;
        for (I=1; I<=NDWARVES; I++) {
 L10000: PROP[GRATE]=0;
        PROP[FISSUR]=0;
        for (I=1; I<=NDWARVES; I++) {
-       DSEEN[I]=false;
-       DLOC[I]=0;
+       game.dseen[I]=false;
+       game.dloc[I]=0;
        } /* end loop */
        MOVE(TROLL,0);
        MOVE(TROLL+NOBJECTS,0);
        } /* end loop */
        MOVE(TROLL,0);
        MOVE(TROLL+NOBJECTS,0);
diff --git a/misc.c b/misc.c
index 86d4626b9c7682706a97c569f9334361fc4484ff..5c71c744d7067f4806e5664e2878324c8ce82ff0 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -592,8 +592,8 @@ long AT, I;
        if(DFLAG < 2)return(AT);
        AT= -1;
        for (I=1; I<=NDWARVES-1; I++) {
        if(DFLAG < 2)return(AT);
        AT= -1;
        for (I=1; I<=NDWARVES-1; I++) {
-       if(DLOC[I] == WHERE) goto L2;
-       if(DLOC[I] != 0)AT=0;
+       if(game.dloc[I] == WHERE) goto L2;
+       if(game.dloc[I] != 0)AT=0;
        } /* end loop */
        return(AT);
 
        } /* end loop */
        return(AT);