- 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=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=LOC;
- goto L99;
-
-/* Describe the current location and (maybe) get next command. */
-
-/* Print text for current loc. */
-
-L2000: if(LOC == 0) goto L99;
- KK=STEXT[LOC];
- if(MOD(game.abbrev[LOC],game.abbnum) == 0 || KK == 0)KK=LTEXT[LOC];
- if(FORCED(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(LOC)) goto L8;
- if(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[LOC]=game.abbrev[LOC]+1;
- I=game.atloc[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 && 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[LOC] < game.conds) goto L2603;
- /* 2602 */ for (HINT=1; HINT<=HNTMAX; HINT++) {
- if(game.hinted[HINT]) goto L2602;
- if(!CNDBIT(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) goto L2605;
- 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];
- } /* end loop */
-L2605: game.wzdark=DARK(0);
- if(game.knfloc > 0 && game.knfloc != LOC)game.knfloc=0;
- I=0;
- if (!GETIN(cmdin, WD1,WD1X,WD2,WD2X))
- return false;
-
-/* Every input, check "game.foobar" flag. If zero, nothing's going on. If pos,
- * make neg. If neg, he skipped a word, so make it zero. */
-
-L2607: game.foobar=(game.foobar>0 ? -game.foobar : 0);
- game.turns=game.turns+1;
- if(game.turns == game.thresh) {
- SPEAK(TTEXT[game.trndex]);
- game.trnluz=game.trnluz+TRNVAL[game.trndex]/100000;
- game.trndex=game.trndex+1;
- game.thresh= -1;
- if(game.trndex <= TRNVLS)
- game.thresh=MOD(TRNVAL[game.trndex],100000)+1;
- }
- if(VERB == SAY && WD2 > 0)VERB=0;
- if(VERB == SAY) goto L4090;
- if(game.tally == 0 && INDEEP(LOC) && LOC != 33)game.clock1=game.clock1-1;
- if(game.clock1 == 0) goto L10000;
- 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 == 0) goto L12400;
- if(game.limit <= 30) goto L12200;
-L19999: K=43;
- if(LIQLOC(LOC) == WATER)K=70;
- V1=VOCAB(WD1,-1);
- V2=VOCAB(WD2,-1);
- if(V1 == ENTER && (V2 == STREAM || V2 == 1000+WATER)) goto L2010;
- if(V1 == ENTER && WD2 > 0) goto L2800;
- if((V1 != 1000+WATER && V1 != 1000+OIL) || (V2 != 1000+PLANT && V2 !=
- 1000+DOOR)) goto L2610;
- {long x = V2-1000; if(AT(x))WD2=MAKEWD(16152118);}
-L2610: if(V1 == 1000+CAGE && V2 == 1000+BIRD && HERE(CAGE) && HERE(BIRD))
- WD1=MAKEWD(301200308);
-L2620: if(WD1 == MAKEWD(23051920)) {
- game.iwest=game.iwest+1;
- if(game.iwest == 10)RSPEAK(17);
- }
- if(WD1 != MAKEWD( 715) || WD2 == 0) goto L2630;
- IGO=IGO+1;
- if(IGO == 10)RSPEAK(276);
-L2630: I=VOCAB(WD1,-1);
- if(I == -1) goto L3000;
- 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);
-
-/* Get second word for analysis. */
-
-L2800: WD1=WD2;
- WD1X=WD2X;
- WD2=0;
- goto L2620;
-
-/* Gee, I don't understand. */
-
-L3000: SETPRM(1,WD1,WD1X);
- if (fallback_handler(rawbuf))
- return true;
- RSPEAK(254);
- goto L2600;
-
-/* Verb and object analysis moved to separate module. */
-
-L4000: I=4000; goto Laction;
-L4090: I=4090; goto Laction;
-L5000: I=5000;
-Laction:
- switch (action(cmdin, I)) {
- case 2: return true;
- case 8: goto L8;
- case 2000: goto L2000;
- case 2009: goto L2009;
- case 2010: goto L2010;
- case 2011: goto L2011;
- case 2012: goto L2012;
- case 2600: goto L2600;
- case 2607: goto L2607;
- case 2630: goto L2630;
- case 2800: goto L2800;
- case 8000: goto L8000;
- case 18999: goto L18999;
- case 19000: goto L19000;
- }
- BUG(99);
-
-/* Random intransitive verbs come here. Clear obj just in case (see "attack").
- */
-
-L8000: SETPRM(1,WD1,WD1X);
- RSPEAK(257);
- OBJ=0;
- goto L2600;
-
-/* Figure out the new location
- *
- * Given the current location in "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.) */
-
-L8: KK=KEY[LOC];
- game.newloc=LOC;
- if(KK == 0)BUG(26);
- if(K == NUL) return true;
- if(K == BACK) goto L20;
- if(K == LOOK) goto L30;
- if(K == CAVE) goto L40;
- game.oldlc2=game.oldloc;
- game.oldloc=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=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-LOC; /* ESR: an instance of NOBJECTS? */
- if(game.holdng == 0 || (game.holdng == 1 && TOTING(EMRALD))) return true;
- game.newloc=LOC;
- RSPEAK(117);