- J=1;
- KK=game.dloc[I];
- KK=KEY[KK];
- if(KK == 0) goto L6016;
-L6012: game.newloc=MOD(labs(TRAVEL[KK])/1000,1000);
- {long x = J-1;
- 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]=game.newloc;
- J=J+1;
-L6014: KK=KK+1;
- {long x = KK-1; if(TRAVEL[x] >= 0) goto L6012;}
-L6016: TK[J]=game.odloc[I];
- if(J >= 2)J=J-1;
- 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]) goto L6030;
- game.dloc[I]=game.loc;
- if(I != 6) goto L6027;
-
-/* 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. Note that game.place(CHEST)=0 might mean that he's
- * thrown it to the troll, but in that case he's seen the chest (game.prop=0). */
-
- if(game.loc == game.chloc || game.prop[CHEST] >= 0) goto L6030;
- K=0;
- /* 6020 */ for (J=50; 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;
- if(TOTING(J)) goto L6021;
-L6020: if(HERE(J))K=1;
- } /* end loop */
- if(game.tally == 1 && K == 0 && game.place[CHEST] == 0 && HERE(LAMP) && game.prop[LAMP]
- == 1) goto L6025;
- if(game.odloc[6] != game.dloc[6] && PCT(20))RSPEAK(127);
- goto L6030;
-
-L6021: if(game.place[CHEST] != 0) goto L6022;
-/* Install chest only once, to insure it is the last treasure in the list. */
- MOVE(CHEST,game.chloc);
- MOVE(MESSAG,game.chloc2);
-L6022: RSPEAK(128);
- /* 6023 */ for (J=50; J<=MAXTRS; J++) {
- if(J == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD])) goto L6023;
- if(AT(J) && game.fixed[J] == 0)CARRY(J,game.loc);
- if(TOTING(J))DROP(J,game.chloc);
-L6023: /*etc*/ ;
- } /* end loop */
-L6024: game.dloc[6]=game.chloc;
- game.odloc[6]=game.chloc;
- game.dseen[6]=false;
- goto L6030;
-
-L6025: RSPEAK(186);
- MOVE(CHEST,game.chloc);
- MOVE(MESSAG,game.chloc2);
- goto L6024;
-
-/* This threatening little dwarf is in the room with him! */
-
-L6027: game.dtotal=game.dtotal+1;
- if(game.odloc[I] != game.dloc[I]) goto L6030;
- ATTACK=ATTACK+1;
- if(game.knfloc >= 0)game.knfloc=game.loc;
- if(randrange(1000) < 95*(game.dflag-2))STICK=STICK+1;
-L6030: /*etc*/ ;
- } /* end loop */
-
-/* Now we know what's happening. Let's tell the poor sucker about it.
- * Note that various of the "knife" messages must have specific relative
- * positions in the RSPEAK database. */
-
- if(game.dtotal == 0) goto L2000;
- SETPRM(1,game.dtotal,0);
- RSPEAK(4+1/game.dtotal);
- if(ATTACK == 0) goto L2000;
- if(game.dflag == 2)game.dflag=3;
- SETPRM(1,ATTACK,0);
- K=6;
- if(ATTACK > 1)K=250;
- RSPEAK(K);
- SETPRM(1,STICK,0);
- RSPEAK(K+1+2/(1+STICK));
- if(STICK == 0) goto L2000;
- game.oldlc2=game.loc;
- goto L99;
-
-/* Describe the current location and (maybe) get next command. */
-
-/* Print text for current loc. */
-
-L2000: if(game.loc == 0) goto L99;
- 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);
- SPEAK(KK);
- K=1;
- 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. */
-
- 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;
- if(obj > NOBJECTS)obj=obj-NOBJECTS;
- if(obj == STEPS && TOTING(NUGGET)) goto L2008;
- if(game.prop[obj] >= 0) goto L2006;
- if(game.closed) goto L2008;
- game.prop[obj]=0;
- if(obj == RUG || obj == CHAIN)game.prop[obj]=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;
- * things like killing the bird before the snake was gone (can never see
- * jewelry), and doing it "right" was hopeless. E.G., could cross troll
- * bridge several times, using up all available treasures, breaking vase,
- * using coins to buy batteries, etc., and eventually never be able to get
- * across again. If bottle were left on far side, could then never get eggs
- * or trident, and the effects propagate. So the whole thing was flushed.
- * anyone who makes such a gross blunder isn't likely to find everything
- * else anyway (so goes the rationalisation). */
-L2006: KK=game.prop[obj];
- if(obj == STEPS && game.loc == game.fixed[STEPS])KK=1;
- PSPEAK(obj,KK);
-L2008: I=game.link[I];
- goto L2004;
-
-L2009: K=54;
-L2010: SPK=K;
-L2011: RSPEAK(SPK);
-
-L2012: VERB=0;
- game.oldobj=obj;
- obj=0;
-
-/* Check if this loc is eligible for any hints. If been here long enough,
- * branch to help section (on later page). Hints all come back here eventually
- * to finish the loop. Ignore "HINTS" < 4 (special stuff, see database notes).
- */
-L2600: if(COND[game.loc] < game.conds) goto L2603;
- /* 2602 */ for (HINT=1; HINT<=HNTMAX; HINT++) {
- if(game.hinted[HINT]) goto L2602;
- if(!CNDBIT(game.loc,HINT+10))game.hintlc[HINT]= -1;
- game.hintlc[HINT]=game.hintlc[HINT]+1;
- if(game.hintlc[HINT] >= HINTS[HINT][1]) goto L40000;
-L2602: /*etc*/ ;
- } /* end loop */
-
- /* If closing time, check for any objects being toted with
- * game.prop < 0 and set the prop to -1-game.prop. This way
- * objects won't be described until they've been picked up
- * and put down separate from their respective piles. Don't
- * tick game.clock1 unless well into cave (and not at Y2). */
-L2603: if(game.closed) {
- if(game.prop[OYSTER] < 0 && TOTING(OYSTER))
- PSPEAK(OYSTER,1);
- for (i=1; i<=NOBJECTS; i++) {
- if(TOTING(i) && game.prop[i] < 0)
- game.prop[i] = -1-game.prop[i];
+ int j=1;
+ 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] ||
+ (j > 1 && game.newloc == TK[j-1]) ||
+ j >= 20 ||
+ game.newloc == game.dloc[i] ||
+ FORCED(game.newloc) ||
+ (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];
+ 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) {
+ /* 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.
+ * Note that game.place(CHEST)=0 might mean that he's thrown
+ * it to the troll, but in that case he's seen the chest
+ * (game.prop=0). */
+ if (game.loc == game.chloc || game.prop[CHEST] >= 0)
+ continue;
+ 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])) {
+ if (HERE(j))
+ k=1;
+ continue;
+ }
+ if (TOTING(j)) {
+ 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;
+ }
+ if (HERE(j))
+ k=1;