First step in game state encapsulation: the dwarf & pirate locations.

This commit is contained in:
Eric S. Raymond 2017-06-06 21:34:11 -04:00
parent 3b8122ae3a
commit 07c0020a7a
6 changed files with 60 additions and 50 deletions

View file

@ -542,13 +542,13 @@ L8305: DATIME(&I,&K);
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(ODLOC,NDWARVES);
SAVARR(game.odloc,NDWARVES);
SAVARR(PLACE,NOBJECTS);
SAVARR(PROP,NOBJECTS);
SAVWRD(KK,K);

View file

@ -199,10 +199,10 @@ L9128: RSPEAK(SPK);
DSTROY(OGRE);
K=0;
for (I=1; I < PIRATE; I++) {
if(DLOC[I] == LOC) {
if(game.dloc[I] == LOC) {
K=K+1;
DLOC[I]=61;
DSEEN[I]=false;
game.dloc[I]=61;
game.dseen[I]=false;
}
}
SPK=SPK+1+1/K;
@ -233,8 +233,8 @@ int throw(FILE *cmdin) {
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;

View file

@ -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 */
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[];
@ -82,7 +90,7 @@ 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,
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,
@ -90,7 +98,7 @@ extern long ABBNUM, AMBER, ATTACK, AXE, BACK, BATTER, BEAR,
LMWARN, LOC, LOCK, LOOK,
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,

18
init.c
View file

@ -314,10 +314,10 @@ L1106: /*etc*/ ;
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
* 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
@ -331,15 +331,15 @@ L1106: /*etc*/ ;
CHLOC=114;
CHLOC2=140;
for (I=1; I<=NDWARVES; I++) {
DSEEN[I]=false;
game.dseen[I]=false;
} /* 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:

56
main.c
View file

@ -12,8 +12,10 @@
#include "advent.h"
#include "database.h"
struct game_t game;
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;
@ -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,
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,
@ -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,
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,
@ -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++) {
if(ODLOC[I] != NEWLOC || !DSEEN[I]) goto L73;
if(game.odloc[I] != NEWLOC || !game.dseen[I]) goto L73;
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);
if(PCT(50))DLOC[J]=0;
if(PCT(50))game.dloc[J]=0;
} /* 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);
@ -230,30 +232,30 @@ L6010: DTOTAL=0;
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;
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;
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;}
L6016: TK[J]=ODLOC[I];
L6016: TK[J]=game.odloc[I];
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
@ -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;
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;
@ -285,9 +287,9 @@ L6022: RSPEAK(128);
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);
@ -298,7 +300,7 @@ L6025: RSPEAK(186);
/* 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;
@ -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
* 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];
@ -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++) {
DSEEN[I]=false;
DLOC[I]=0;
game.dseen[I]=false;
game.dloc[I]=0;
} /* end loop */
MOVE(TROLL,0);
MOVE(TROLL+NOBJECTS,0);

4
misc.c
View file

@ -592,8 +592,8 @@ long AT, 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);