X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=main.c;h=1d6ff7f90cf1f4b11949dc0cc11655606f4ec9aa;hb=c8ebabdf3b4db5a6c199eaf62109d44e759b1880;hp=335f10523307c8a869d729d89d8e93ad7ba1d634;hpb=db8dc40b8491009182db9640a2ce010fe6b428bf;p=open-adventure.git diff --git a/main.c b/main.c index 335f105..1d6ff7f 100644 --- a/main.c +++ b/main.c @@ -15,7 +15,7 @@ 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, @@ -28,7 +28,7 @@ long AMBER, AXE, BACK, BATTER, BEAR, BIRD, BLOOD, 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; @@ -68,7 +68,7 @@ int main(int argc, char *argv[]) while ((ch = getopt(argc, argv, "l:o")) != EOF) { switch (ch) { - case 'l': +case 'l': logfp = fopen(optarg, "w"); if (logfp == NULL) fprintf(stderr, @@ -102,7 +102,6 @@ int main(int argc, char *argv[]) set_seed(seedval); /* Initialize game variables */ - MAP2[1] = 0; if (!game.setup) initialise(); @@ -267,15 +266,15 @@ static bool dwarfmove(void) 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); @@ -291,24 +290,25 @@ static bool dwarfmove(void) 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; @@ -316,16 +316,16 @@ static bool dwarfmove(void) ++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. @@ -334,21 +334,41 @@ static bool dwarfmove(void) * (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); @@ -360,38 +380,18 @@ static bool dwarfmove(void) 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. @@ -416,6 +416,26 @@ static bool dwarfmove(void) 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. */ { @@ -449,8 +469,183 @@ static void croak(FILE *cmdin) } } +/* 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 + * 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.) */ + +static bool playermove(FILE *cmdin, token_t verb) +{ + int LL, K2, KK=KEY[game.loc]; + game.newloc=game.loc; + if(KK == 0) + BUG(26); + if(K == NUL) + return true; + if(K == BACK) { + /* 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. */ + K=game.oldloc; + if(FORCED(K))K=game.oldlc2; + game.oldlc2=game.oldloc; + game.oldloc=game.loc; + K2=0; + if(K == game.loc)K2=91; + if(CNDBIT(game.loc,4))K2=274; + if(K2 == 0) goto L21; + RSPEAK(K2); + return true; + } + if(K == LOOK) { + /* Look. Can't give more detail. Pretend it wasn't dark + * (though it may "now" be dark) so he won't fall into a + * pit while staring into the gloom. */ + if(game.detail < 3)RSPEAK(15); + game.detail=game.detail+1; + game.wzdark=false; + game.abbrev[game.loc]=0; + return true; + } + if(K == CAVE) { + /* Cave. Different messages depending on whether above ground. */ + RSPEAK((OUTSID(game.loc) && game.loc != 8) ? 57 : 58); + return true; + } + game.oldlc2=game.oldloc; + game.oldloc=game.loc; + +L9: + LL=labs(TRAVEL[KK]); + if(MOD(LL,1000) == 1 || MOD(LL,1000) == K) + goto L10; + if(TRAVEL[KK] < 0) { + /* Non-applicable motion. Various messages depending on + * word given. */ + SPK=12; + if(K >= 43 && K <= 50)SPK=52; + if(K == 29 || K == 30)SPK=52; + if(K == 7 || K == 36 || K == 37)SPK=10; + if(K == 11 || K == 19)SPK=11; + if(verb == FIND || verb == INVENT)SPK=59; + if(K == 62 || K == 65)SPK=42; + if(K == 17)SPK=80; + RSPEAK(SPK); + return true; + } + KK=KK+1; + goto L9; + +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; + 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; + if(game.newloc == LL) goto L12; + LL=game.newloc; + goto L11; + +L13: if(game.newloc <= 100) + goto L14; + if(TOTING(K) || (game.newloc > 200 && AT(K))) goto L16; + goto L12; + +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) { + game.newloc=game.newloc-300; + switch (game.newloc) + { + case 1: + /* Travel 301. Plover-alcove passage. Can carry only + * emerald. Note: travel table must include "useless" + * entries going through passage, which can never be used for + * actual motion, but can be spotted by "go back". */ + game.newloc=99+100-game.loc; /* ESR: an instance of NOBJECTS? */ + if(game.holdng == 0 || (game.holdng == 1 && TOTING(EMRALD))) return true; + game.newloc=game.loc; + RSPEAK(117); + return true; + case 2: + /* Travel 302. Plover transport. Drop the emerald (only use + * special travel if 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. */ + DROP(EMRALD,game.loc); + goto L12; + case 3: + /* 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 + * 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. */ + if(game.prop[TROLL] == 1) { + PSPEAK(TROLL,1); + game.prop[TROLL]=0; + MOVE(TROLL2,0); + MOVE(TROLL2+NOBJECTS,0); + MOVE(TROLL,PLAC[TROLL]); + MOVE(TROLL+NOBJECTS,FIXD[TROLL]); + JUGGLE(CHASM); + game.newloc=game.loc; + return true; + } else { + game.newloc=PLAC[TROLL]+FIXD[TROLL]-game.loc; + if(game.prop[TROLL] == 0)game.prop[TROLL]=1; + if(!TOTING(BEAR)) return true; + RSPEAK(162); + game.prop[CHASM]=1; + game.prop[TROLL]=2; + DROP(BEAR,game.newloc); + game.fixed[BEAR]= -1; + game.prop[BEAR]=3; + game.oldlc2=game.newloc; + croak(cmdin); + return false; + } + } + BUG(20); + } + RSPEAK(game.newloc-500); + game.newloc=game.loc; + return true; + +L21: LL=MOD((labs(TRAVEL[KK])/1000),1000); + if(LL != K) { + if(LL <= 300) { + if(FORCED(LL) && MOD((labs(TRAVEL[KEY[LL]])/1000),1000) == K) + K2=KK; + } + if(TRAVEL[KK] < 0) + goto L23; + KK=KK+1; + goto L21; + + L23: KK=K2; + if(KK == 0) { + RSPEAK(140); + return true; + } + } + + K=MOD(labs(TRAVEL[KK]),1000); + KK=KEY[game.loc]; + goto L9; +} + static bool do_command(FILE *cmdin) { - long LL, KQ, VERB, KK, K2, V1, V2; + long KQ, VERB, KK, V1, V2; long obj, i; static long IGO = 0; @@ -480,34 +675,46 @@ static bool do_command(FILE *cmdin) { 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; @@ -529,7 +736,7 @@ L2004: if(I == 0) goto L2012; 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; @@ -597,8 +804,8 @@ L2607: game.foobar=(game.foobar>0 ? -game.foobar : 0); 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; @@ -621,11 +828,11 @@ L2620: if(WD1 == MAKEWD(23051920)) { 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); @@ -647,11 +854,11 @@ L3000: SETPRM(1,WD1,WD1X); /* 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; @@ -677,205 +884,16 @@ L8000: SETPRM(1,WD1,WD1X); obj=0; goto L2600; -/* Figure out the new location - * - * 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 - * 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.) */ +/* Figure out the new location */ -L8: KK=KEY[game.loc]; - game.newloc=game.loc; - if(KK == 0) - BUG(26); - if(K == NUL) - return true; - if(K == BACK) { - /* 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. */ - K=game.oldloc; - if(FORCED(K))K=game.oldlc2; - game.oldlc2=game.oldloc; - game.oldloc=game.loc; - K2=0; - if(K == game.loc)K2=91; - if(CNDBIT(game.loc,4))K2=274; - if(K2 == 0) goto L21; - RSPEAK(K2); - return true; - } - if(K == LOOK) { - /* Look. Can't give more detail. Pretend it wasn't dark - * (though it may "now" be dark) so he won't fall into a - * pit while staring into the gloom. */ - if(game.detail < 3)RSPEAK(15); - game.detail=game.detail+1; - game.wzdark=false; - game.abbrev[game.loc]=0; - return true; - } - if(K == CAVE) { - /* Cave. Different messages depending on whether above ground. */ - RSPEAK((OUTSID(game.loc) && game.loc != 8) ? 57 : 58); +L8: + if (playermove(cmdin, VERB)) return true; - } - game.oldlc2=game.oldloc; - game.oldloc=game.loc; - -L9: LL=labs(TRAVEL[KK]); - if(MOD(LL,1000) == 1 || MOD(LL,1000) == K) goto L10; - if(TRAVEL[KK] < 0) goto L50; - KK=KK+1; - goto L9; - -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; - 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; - if(game.newloc == LL) goto L12; - LL=game.newloc; - goto L11; - -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(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=game.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: game.newloc=game.newloc-300; - switch (game.newloc) { case 1: goto L30100; case 2: goto L30200; case 3: goto - L30300; } - BUG(20); - -/* Travel 301. Plover-alcove passage. Can carry only emerald. Note: travel - * 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-game.loc; /* ESR: an instance of NOBJECTS? */ - if(game.holdng == 0 || (game.holdng == 1 && TOTING(EMRALD))) return true; - game.newloc=game.loc; - RSPEAK(117); - return true; - -/* Travel 302. Plover transport. Drop the emerald (only use special travel if - * 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,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 - * 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(game.prop[TROLL] != 1) goto L30310; - PSPEAK(TROLL,1); - game.prop[TROLL]=0; - MOVE(TROLL2,0); - MOVE(TROLL2+NOBJECTS,0); - MOVE(TROLL,PLAC[TROLL]); - MOVE(TROLL+NOBJECTS,FIXD[TROLL]); - JUGGLE(CHASM); - game.newloc=game.loc; - return true; - -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); - game.prop[CHASM]=1; - game.prop[TROLL]=2; - DROP(BEAR,game.newloc); - game.fixed[BEAR]= -1; - game.prop[BEAR]=3; - game.oldlc2=game.newloc; - croak(cmdin); - goto L2000; - -/* End of specials. */ - -L21: LL=MOD((labs(TRAVEL[KK])/1000),1000); - if(LL != K) { - if(LL <= 300) { - if(FORCED(LL) && MOD((labs(TRAVEL[KEY[LL]])/1000),1000) == K) - K2=KK; - } - if(TRAVEL[KK] < 0) - goto L23; - KK=KK+1; - goto L21; - - L23: KK=K2; - if(KK == 0) { - RSPEAK(140); - return true; - } - } - - K=MOD(labs(TRAVEL[KK]),1000); - KK=KEY[game.loc]; - goto L9; - - -/* Non-applicable motion. Various messages depending on word given. */ - -L50: SPK=12; - if(K >= 43 && K <= 50)SPK=52; - if(K == 29 || K == 30)SPK=52; - if(K == 7 || K == 36 || K == 37)SPK=10; - if(K == 11 || K == 19)SPK=11; - if(VERB == FIND || VERB == INVENT)SPK=59; - if(K == 62 || K == 65)SPK=42; - if(K == 17)SPK=80; - 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; + else + goto L2000; /* Cave closing and scoring */ - /* These sections handle the closing of the cave. The cave closes "clock1" * turns after the last treasure has been located (including the pirate's * chest, which may of course never show up). Note that the treasures need not @@ -907,10 +925,10 @@ L90: RSPEAK(23); 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]); @@ -924,7 +942,7 @@ L10000: game.prop[GRATE]=0; 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). @@ -951,8 +969,8 @@ L11000: game.prop[BOTTLE]=PUT(BOTTLE,115,1); /* 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); @@ -963,9 +981,9 @@ L11000: game.prop[BOTTLE]=PUT(BOTTLE,115,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);