-/* Hints */
-
-/* Come here if he's been long enough at required loc(s) for some unused hint.
- * hint number is in variable "hint". Branch to quick test for additional
- * conditions, then come back to do neat stuff. Goto 40010 if conditions are
- * met and we want to offer the hint. Goto 40020 to clear game.hintlc back to zero,
- * 40030 to take no action yet. */
-
-L40000: switch (HINT-1) { case 0: goto L40100; case 1: goto L40200; case 2: goto
- L40300; case 3: goto L40400; case 4: goto L40500; case 5: goto
- L40600; case 6: goto L40700; case 7: goto L40800; case 8: goto
- L40900; case 9: goto L41000; }
-/* CAVE BIRD SNAKE MAZE DARK WITT URN WOODS OGRE
- * JADE */
- BUG(27);
-
-L40010: game.hintlc[HINT]=0;
- if(!YES(cmdin,HINTS[HINT][3],0,54)) goto L2602;
- SETPRM(1,HINTS[HINT][2],HINTS[HINT][2]);
- RSPEAK(261);
- game.hinted[HINT]=YES(cmdin,175,HINTS[HINT][4],54);
- if(game.hinted[HINT] && game.limit > 30)game.limit=game.limit+30*HINTS[HINT][2];
-L40020: game.hintlc[HINT]=0;
-L40030: goto L2602;
-
-/* Now for the quick tests. See database description for one-line notes. */
-
-L40100: if(game.prop[GRATE] == 0 && !HERE(KEYS)) goto L40010;
- goto L40020;
-
-L40200: if(game.place[BIRD] == game.loc && TOTING(ROD) && game.oldobj == BIRD) goto L40010;
- goto L40030;
-
-L40300: if(HERE(SNAKE) && !HERE(BIRD)) goto L40010;
- goto L40020;
-
-L40400: if(game.atloc[game.loc] == 0 && game.atloc[game.oldloc] == 0 && game.atloc[game.oldlc2] == 0 && game.holdng >
- 1) goto L40010;
- goto L40020;
-
-L40500: if(game.prop[EMRALD] != -1 && game.prop[PYRAM] == -1) goto L40010;
- goto L40020;
-
-L40600: goto L40010;
-
-L40700: if(game.dflag == 0) goto L40010;
- goto L40020;
-
-L40800: if(game.atloc[game.loc] == 0 && game.atloc[game.oldloc] == 0 && game.atloc[game.oldlc2] == 0) goto
- L40010;
- goto L40030;
-
-L40900: I=ATDWRF(game.loc);
- if(I < 0) goto L40020;
- if(HERE(OGRE) && I == 0) goto L40010;
- goto L40030;
-
-L41000: if(game.tally == 1 && game.prop[JADE] < 0) goto L40010;
- goto L40020;
-
-
-
-
-
-/* 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
- * have been taken yet, just located. Hence clock1 must be large enough to get
- * out of the cave (it only ticks while inside the cave). When it hits zero,
- * we branch to 10000 to start closing the cave, and then sit back and wait for
- * him to try to get out. If he doesn't within clock2 turns, we close the
- * cave; if he does try, we assume he panics, and give him a few additional
- * turns to get frantic before we close. When clock2 hits zero, we branch to
- * 11000 to transport him into the final puzzle. Note that the puzzle depends
- * upon all sorts of random things. For instance, there must be no water or
- * oil, since there are beanstalks which we don't want to be able to water,
- * since the code can't handle it. Also, we can have no keys, since there is a
- * grate (having moved the fixed object!) there separating him from all the
- * treasures. Most of these problems arise from the use of negative prop
- * numbers to suppress the object descriptions until he's actually moved the
- * objects. */
-
-/* When the first warning comes, we lock the grate, destroy the bridge, kill
- * all the dwarves (and the pirate), remove the troll and bear (unless dead),
- * and set "closng" to true. Leave the dragon; too much trouble to move it.
- * from now until clock2 runs out, he cannot unlock the grate, move to any
- * location outside the cave, or create the bridge. Nor can he be
- * resurrected if he dies. Note that the snake is already gone, since he got
- * to the treasure accessible only via the hall of the mountain king. Also, he's
- * been in giant room (to get eggs), so we can refer to it. Also also, he's
- * gotten the pearl, so we know the bivalve is an oyster. *And*, the dwarves
- * must have been activated, since we've found chest. */
-
-L10000: game.prop[GRATE]=0;
+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) {
+ for (int hint=1; hint<=HNTMAX; hint++) {
+ if (game.hinted[hint])
+ continue;
+ if (!CNDBIT(game.loc,hint+10))
+ game.hintlc[hint]= -1;
+ ++game.hintlc[hint];
+ if (game.hintlc[hint] >= HINTS[hint][1])
+ dohint(cmdin, hint);
+ }
+ }
+
+ /* 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). */
+ 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];
+ }
+ }
+ game.wzdark=DARK(game.loc);
+ if (game.knfloc > 0 && game.knfloc != game.loc)
+ game.knfloc=0;
+
+ /* This is where we get a new command from the user */
+ 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;
+ if (game.turns == game.thresh) {
+ newspeak(turn_threshold_messages[game.trndex]);
+ game.trnluz=game.trnluz+TRNVAL[game.trndex]/100000;
+ ++game.trndex;
+ 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) {
+ part=transitive;
+ goto Laction;
+ }
+ if (game.tally == 0 && INDEEP(game.loc) && game.loc != 33)
+ --game.clock1;
+
+ /* Next few 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
+ * have been taken yet, just located. Hence clock1 must be
+ * large enough to get out of the cave (it only ticks while
+ * inside the cave). When it hits zero, we branch to 10000
+ * to start closing the cave, and then sit back and wait for
+ * him to try to get out. If he doesn't within clock2 turns,
+ * we close the cave; if he does try, we assume he panics,
+ * and give him a few additional turns to get frantic before
+ * we close. When clock2 hits zero, we branch to 11000 to
+ * transport him into the final puzzle. Note that the puzzle
+ * depends upon all sorts of random things. For instance,
+ * there must be no water or oil, since there are beanstalks
+ * which we don't want to be able to water, since the code
+ * can't handle it. Also, we can have no keys, since there
+ * is a grate (having moved the fixed object!) there
+ * separating him from all the treasures. Most of these
+ * problems arise from the use of negative prop numbers to
+ * suppress the object descriptions until he's actually moved
+ * the objects. */
+
+ /* When the first warning comes, we lock the grate, destroy
+ * the bridge, kill all the dwarves (and the pirate), remove
+ * the troll and bear (unless dead), and set "closng" to
+ * true. Leave the dragon; too much trouble to move it.
+ * from now until clock2 runs out, he cannot unlock the
+ * grate, move to any location outside the cave, or create
+ * the bridge. Nor can he be resurrected if he dies. Note
+ * that the snake is already gone, since he got to the
+ * treasure accessible only via the hall of the mountain
+ * king. Also, he's been in giant room (to get eggs), so we
+ * can refer to it. Also also, he's gotten the pearl, so we
+ * know the bivalve is an oyster. *And*, the dwarves must
+ * have been activated, since we've found chest. */
+ if (game.clock1 == 0)
+ {
+ game.prop[GRATE]=0;