struct game_t game;
long LNLENG, LNPOSN, PARMS[MAXPARMS+1];
-char rawbuf[LINESIZE], INLINE[LINESIZE+1], MAP1[129], MAP2[129];
+char rawbuf[LINESIZE], INLINE[LINESIZE+1];
long AMBER, AXE, BACK, BATTER, BEAR, BIRD, BLOOD,
BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST,
RUBY, RUG, SAPPH, SAY, SIGN, SNAKE,
STEPS, STREAM, THROW, TRIDNT, TROLL, TROLL2,
URN, VASE, VEND, VOLCAN, WATER;
-long I, K, SPK, WD1, WD1X, WD2, WD2X;
+long K, SPK, WD1, WD1X, WD2, WD2X;
FILE *logfp;
bool oldstyle = false;
while ((ch = getopt(argc, argv, "l:o")) != EOF) {
switch (ch) {
- case 'l':
+case 'l':
logfp = fopen(optarg, "w");
if (logfp == NULL)
fprintf(stderr,
set_seed(seedval);
/* Initialize game variables */
- MAP2[1] = 0;
if (!game.setup)
initialise();
if(!INDEEP(game.loc) || (PCT(95) && (!CNDBIT(game.loc,4) || PCT(85))))
return true;
game.dflag=2;
- for (I=1; I<=2; I++) {
+ for (int i=1; i<=2; i++) {
int j=1+randrange(NDWARVES-1);
if(PCT(50))
game.dloc[j]=0;
}
- for (I=1; I<=NDWARVES-1; I++) {
- if(game.dloc[I] == game.loc)
- game.dloc[I]=DALTLC;
- game.odloc[I]=game.dloc[I];
+ for (int i=1; i<=NDWARVES-1; i++) {
+ if(game.dloc[i] == game.loc)
+ game.dloc[i]=DALTLC;
+ game.odloc[i]=game.dloc[i];
}
RSPEAK(3);
DROP(AXE,game.loc);
game.dtotal=0;
attack=0;
stick=0;
- for (I=1; I<=NDWARVES; I++) {
- if(game.dloc[I] == 0)
+ for (int i=1; i<=NDWARVES; i++) {
+ int k;
+ if(game.dloc[i] == 0)
continue;
/* Fill TK array with all the places this dwarf might go. */
int j=1;
- kk=KEY[game.dloc[I]];
+ kk=KEY[game.dloc[i]];
if(kk != 0)
do {
game.newloc=MOD(labs(TRAVEL[kk])/1000,1000);
/* Have we avoided a dwarf enciounter? */
bool avoided = (game.newloc > 300 ||
!INDEEP(game.newloc) ||
- game.newloc == game.odloc[I] ||
+ game.newloc == game.odloc[i] ||
(j > 1 && game.newloc == TK[j-1]) ||
j >= 20 ||
- game.newloc == game.dloc[I] ||
+ game.newloc == game.dloc[i] ||
FORCED(game.newloc) ||
- (I == PIRATE && CNDBIT(game.newloc,3)) ||
+ (i == PIRATE && CNDBIT(game.newloc,3)) ||
labs(TRAVEL[kk])/1000000 == 100);
if (!avoided) {
TK[j++] = game.newloc;
++kk;
} while
(TRAVEL[kk-1] >= 0);
- TK[j]=game.odloc[I];
+ TK[j]=game.odloc[i];
if(j >= 2)
--j;
j=1+randrange(j);
- game.odloc[I]=game.dloc[I];
- game.dloc[I]=TK[j];
- game.dseen[I]=(game.dseen[I] && INDEEP(game.loc)) || (game.dloc[I] == game.loc || game.odloc[I] == game.loc);
- if(!game.dseen[I]) continue;
- game.dloc[I]=game.loc;
- if(I == PIRATE) {
+ game.odloc[i]=game.dloc[i];
+ game.dloc[i]=TK[j];
+ game.dseen[i]=(game.dseen[i] && INDEEP(game.loc)) || (game.dloc[i] == game.loc || game.odloc[i] == game.loc);
+ if(!game.dseen[i]) continue;
+ game.dloc[i]=game.loc;
+ if(i == PIRATE) {
/* 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.
* (game.prop=0). */
if(game.loc == game.chloc || game.prop[CHEST] >= 0)
continue;
- K=0;
+ k=0;
for (int j=MINTRS; j<=MAXTRS; j++) {
- /* Pirate won't take pyramid from plover room or dark
- * room (too easy!). */
- if(j == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD]))
- goto L6020;
+ /* Pirate won't take pyramid from plover room or dark
+ * room (too easy!). */
+ if(j == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD])) {
+ if(HERE(j))
+ k=1;
+ continue;
+ }
if(TOTING(j)) {
- goto L6021;
+ if(game.place[CHEST] == 0) {
+ /* Install chest only once, to insure it is
+ * the last treasure in the list. */
+ MOVE(CHEST,game.chloc);
+ MOVE(MESSAG,game.chloc2);
+ }
+ RSPEAK(128);
+ for (int j=MINTRS; j<=MAXTRS; j++) {
+ if (!(j == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD]))) {
+ if(AT(j) && game.fixed[j] == 0)
+ CARRY(j,game.loc);
+ if(TOTING(j))
+ DROP(j,game.chloc);
+ }
+ }
+ game.dloc[PIRATE]=game.chloc;
+ game.odloc[PIRATE]=game.chloc;
+ game.dseen[PIRATE]=false;
+ goto jumpout;
}
- L6020:
if(HERE(j))
- K=1;
+ k=1;
}
/* Force chest placement before player finds last treasure */
- if(game.tally == 1 && K == 0 && game.place[CHEST] == 0 && HERE(LAMP) && game.prop[LAMP] == 1) {
+ if(game.tally == 1 && k == 0 && game.place[CHEST] == 0 && HERE(LAMP) && game.prop[LAMP] == 1) {
RSPEAK(186);
MOVE(CHEST,game.chloc);
MOVE(MESSAG,game.chloc2);
if(game.odloc[PIRATE] != game.dloc[PIRATE] && PCT(20))
RSPEAK(127);
continue;
-
- L6021:
- if(game.place[CHEST] == 0) {
- /* Install chest only once, to insure it is the last treasure in
- * the list. */
- MOVE(CHEST,game.chloc);
- MOVE(MESSAG,game.chloc2);
- }
- RSPEAK(128);
- for (int j=MINTRS; j<=MAXTRS; j++) {
- if (!(j == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD]))) {
- if(AT(j) && game.fixed[j] == 0)
- CARRY(j,game.loc);
- if(TOTING(j))
- DROP(j,game.chloc);
- }
- }
- game.dloc[PIRATE]=game.chloc;
- game.odloc[PIRATE]=game.chloc;
- game.dseen[PIRATE]=false;
- continue;
}
/* This threatening little dwarf is in the room with him! */
++game.dtotal;
- if(game.odloc[I] == game.dloc[I]) {
+ if(game.odloc[i] == game.dloc[i]) {
++attack;
if(game.knfloc >= 0)
game.knfloc=game.loc;
if(randrange(1000) < 95*(game.dflag-2))
++stick;
}
+ jumpout:;
}
/* Now we know what's happening. Let's tell the poor sucker about it.
return false;
}
+/* "You're dead, Jim."
+ *
+ * If the current loc is zero, it means the clown got himself killed.
+ * We'll allow this maxdie times. MAXDIE is automatically set based
+ * on the number of 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 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 are done by keywords.) The
+ * lamp is a special case (it wouldn't do to leave 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!). game.oldloc is zapped so he can't just
+ * "retreat". */
+
static void croak(FILE *cmdin)
/* Okay, he's dead. Let's get on with it. */
{
if (!dwarfmove())
croak(cmdin);
-/* Describe the current location and (maybe) get next command. */
+ /* Describe the current location and (maybe) get next command. */
-/* Print text for current loc. */
+ /* Print text for current loc. */
L2000: if(game.loc == 0)
croak(cmdin);
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);
+ if(MOD(game.abbrev[game.loc],game.abbnum) == 0 || KK == 0)
+ KK=LTEXT[game.loc];
+ if(!FORCED(game.loc) && DARK(0)) {
+ /* The easiest way to get killed is to fall into a pit in
+ * pitch darkness. */
+ if(game.wzdark && PCT(35)) {
+ RSPEAK(23);
+ game.oldlc2 = game.loc;
+ croak(cmdin);
+ goto L2000;
+ }
+ KK=RTEXT[16];
+ }
+ if(TOTING(BEAR))RSPEAK(141);
SPEAK(KK);
K=1;
- if(FORCED(game.loc)) goto L8;
+ 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
- * 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. */
+ /* 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
+ * 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;
game.abbrev[game.loc]=game.abbrev[game.loc]+1;
- I=game.atloc[game.loc];
-L2004: if(I == 0) goto L2012;
- obj=I;
+ i=game.atloc[game.loc];
+L2004: if(i == 0) goto L2012;
+ obj=i;
if(obj > NOBJECTS)obj=obj-NOBJECTS;
if(obj == STEPS && TOTING(NUGGET)) goto L2008;
if(game.prop[obj] >= 0) goto L2006;
L2006: KK=game.prop[obj];
if(obj == STEPS && game.loc == game.fixed[STEPS])KK=1;
PSPEAK(obj,KK);
-L2008: I=game.link[I];
+L2008: i=game.link[i];
goto L2004;
L2009: K=54;
if(game.clock1 < 0)game.clock2=game.clock2-1;
if(game.clock2 == 0) goto L11000;
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 <= 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;
RSPEAK(276);
}
L2630:
- I=VOCAB(WD1,-1);
- if(I == -1)
+ i=VOCAB(WD1,-1);
+ if(i == -1)
goto L3000;
- K=MOD(I,1000);
- KQ=I/1000+1;
+ K=MOD(i,1000);
+ KQ=i/1000+1;
switch (KQ-1) { case 0: goto L8; case 1: goto L5000; case 2: goto L4000;
case 3: goto L2010; }
BUG(22);
/* Verb and object analysis moved to separate module. */
-L4000: I=4000; VERB=K; goto Laction;
-L4090: I=4090; goto Laction;
-L5000: I=5000; obj = K;
+L4000: i=4000; VERB=K; goto Laction;
+L4090: i=4090; goto Laction;
+L5000: i=5000; obj = K;
Laction:
- switch (action(cmdin, I, VERB, obj)) {
+ switch (action(cmdin, i, VERB, obj)) {
case 2: return true;
case 8: goto L8;
case 2000: goto L2000;
RSPEAK(SPK);
return true;
-/* "You're dead, Jim."
- *
- * If the current loc is zero, it means the clown got himself killed. We'll
- * allow this maxdie times. MAXDIE is automatically set based on the number of
- * 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 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
- * are done by keywords.) The lamp is a special case (it wouldn't do to leave
- * 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!).
- * 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);
- game.oldlc2=game.loc;
- croak(cmdin);
- goto L2000;
-
/* Cave closing and scoring */
L10000: game.prop[GRATE]=0;
game.prop[FISSUR]=0;
- for (I=1; I<=NDWARVES; I++) {
- game.dseen[I]=false;
- game.dloc[I]=0;
- } /* end loop */
+ for (i=1; i<=NDWARVES; i++) {
+ game.dseen[i]=false;
+ game.dloc[i]=0;
+ }
MOVE(TROLL,0);
MOVE(TROLL+NOBJECTS,0);
MOVE(TROLL2,PLAC[TROLL]);
RSPEAK(129);
game.clock1= -1;
game.closng=true;
- goto L19999;
+ goto L19999;
/* Once he's panicked, and clock2 has run out, we come here to set up the
* storage room. The room has two locs, hardwired as 115 (ne) and 116 (sw).
/* Leave the grate with normal (non-negative) property. Reuse sign. */
- I=PUT(GRATE,116,0);
- I=PUT(SIGN,116,0);
+ PUT(GRATE,116,0);
+ PUT(SIGN,116,0);
OBJTXT[SIGN]=OBJTXT[SIGN]+1;
game.prop[SNAKE]=PUT(SNAKE,116,1);
game.prop[BIRD]=PUT(BIRD,116,1);
game.prop[MIRROR]=PUT(MIRROR,115,0);
game.fixed[MIRROR]=116;
- for (I=1; I<=NOBJECTS; I++) {
- if(TOTING(I))
- DSTROY(I);
+ for (int i=1; i<=NOBJECTS; i++) {
+ if(TOTING(i))
+ DSTROY(i);
} /* end loop */
RSPEAK(132);