-
-/* FIGURE OUT THE NEW LOCATION
- *
- * GIVEN THE CURRENT LOCATION IN "LOC", AND A MOTION VERB NUMBER IN "K", PUT
- * THE NEW LOCATION IN "NEWLOC". THE CURRENT LOC IS SAVED IN "OLDLOC" IN CASE
- * HE WANTS TO RETREAT. THE CURRENT OLDLOC IS SAVED IN OLDLC2, IN CASE HE
- * DIES. (IF HE DOES, NEWLOC WILL BE LIMBO, AND OLDLOC WILL BE WHAT KILLED
- * HIM, SO WE NEED OLDLC2, WHICH IS THE LAST PLACE HE WAS SAFE.) */
-
-L8: KK=KEY[LOC];
- NEWLOC=LOC;
- if(KK == 0)BUG(26);
- if(K == NUL) goto L2;
- if(K == BACK) goto L20;
- if(K == LOOK) goto L30;
- if(K == CAVE) goto L40;
- OLDLC2=OLDLOC;
- OLDLOC=LOC;
-
-L9: LL=IABS(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: NEWLOC=LL/1000;
- K=MOD(NEWLOC,100);
- if(NEWLOC <= 300) goto L13;
- if(PROP[K] != NEWLOC/100-3) goto L16;
-L12: if(TRAVEL[KK] < 0)BUG(25);
- KK=KK+1;
- NEWLOC=IABS(TRAVEL[KK])/1000;
- if(NEWLOC == LL) goto L12;
- LL=NEWLOC;
- goto L11;
-
-L13: if(NEWLOC <= 100) goto L14;
- if(TOTING(K) || (NEWLOC > 200 && AT(K))) goto L16;
- goto L12;
-
-L14: if(NEWLOC != 0 && !PCT(NEWLOC)) goto L12;
-L16: NEWLOC=MOD(LL,1000);
- if(NEWLOC <= 300) goto L2;
- if(NEWLOC <= 500) goto L30000;
- RSPEAK(NEWLOC-500);
- NEWLOC=LOC;
- goto L2;
-
-/* SPECIAL MOTIONS COME HERE. LABELLING CONVENTION: STATEMENT NUMBERS NNNXX
- * (XX=00-99) ARE USED FOR SPECIAL CASE NUMBER NNN (NNN=301-500). */
-
-L30000: NEWLOC=NEWLOC-300;
- switch (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: NEWLOC=99+100-LOC;
- if(HOLDNG == 0 || (HOLDNG == 1 && TOTING(EMRALD))) goto L2;
- NEWLOC=LOC;
- RSPEAK(117);
- goto L2;
-
-/* 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,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
- * PROP(TROLL)=1, HE'S CROSSED SINCE PAYING, SO STEP OUT AND BLOCK HIM.
- * (STANDARD TRAVEL ENTRIES CHECK FOR PROP(TROLL)=0.) SPECIAL STUFF FOR BEAR. */
-
-L30300: if(PROP[TROLL] != 1) goto L30310;
- PSPEAK(TROLL,1);
- PROP[TROLL]=0;
- MOVE(TROLL2,0);
- MOVE(TROLL2+100,0);
- MOVE(TROLL,PLAC[TROLL]);
- MOVE(TROLL+100,FIXD[TROLL]);
- JUGGLE(CHASM);
- NEWLOC=LOC;
- goto L2;
-
-L30310: NEWLOC=PLAC[TROLL]+FIXD[TROLL]-LOC;
- if(PROP[TROLL] == 0)PROP[TROLL]=1;
- if(!TOTING(BEAR)) goto L2;
- RSPEAK(162);
- PROP[CHASM]=1;
- PROP[TROLL]=2;
- DROP(BEAR,NEWLOC);
- FIXED[BEAR]= -1;
- PROP[BEAR]=3;
- OLDLC2=NEWLOC;
- goto L99;
-
-/* END OF SPECIALS. */
-
-/* HANDLE "GO BACK". LOOK FOR VERB WHICH GOES FROM LOC TO OLDLOC, OR TO OLDLC2
- * IF OLDLOC HAS FORCED-MOTION. K2 SAVES ENTRY -> FORCED LOC -> PREVIOUS LOC. */
-
-L20: K=OLDLOC;
- if(FORCED(K))K=OLDLC2;
- OLDLC2=OLDLOC;
- OLDLOC=LOC;
- K2=0;
- if(K == LOC)K2=91;
- if(CNDBIT(LOC,4))K2=274;
- if(K2 == 0) goto L21;
- RSPEAK(K2);
- goto L2;
-
-L21: LL=MOD((IABS(TRAVEL[KK])/1000),1000);
- if(LL == K) goto L25;
- if(LL > 300) goto L22;
- J=KEY[LL];
- if(FORCED(LL) && MOD((IABS(TRAVEL[J])/1000),1000) == K)K2=KK;
-L22: if(TRAVEL[KK] < 0) goto L23;
- KK=KK+1;
- goto L21;
-
-L23: KK=K2;
- if(KK != 0) goto L25;
- RSPEAK(140);
- goto L2;
-
-L25: K=MOD(IABS(TRAVEL[KK]),1000);
- KK=KEY[LOC];
- goto L9;
-
-/* 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. */
-
-L30: if(DETAIL < 3)RSPEAK(15);
- DETAIL=DETAIL+1;
- WZDARK=FALSE;
- ABB[LOC]=0;
- goto L2;
-
-/* CAVE. DIFFERENT MESSAGES DEPENDING ON WHETHER ABOVE GROUND. */
-
-L40: K=58;
- if(OUTSID(LOC) && LOC != 8)K=57;
- RSPEAK(K);
- goto L2;
-
-/* 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);
- goto L2;
-
-
-
-
-
-/* "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 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!).
- * 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);
- OLDLC2=LOC;
-
-/* OKAY, HE'S DEAD. LET'S GET ON WITH IT. */
-
-L99: if(CLOSNG) goto L95;
- NUMDIE=NUMDIE+1;
- if(!YES(79+NUMDIE*2,80+NUMDIE*2,54)) score(0);
- if(NUMDIE == MAXDIE) score(0);
- PLACE[WATER]=0;
- PLACE[OIL]=0;
- if(TOTING(LAMP))PROP[LAMP]=0;
- /* 98 */ for (J=1; J<=100; J++) {
- I=101-J;
- if(!TOTING(I)) goto L98;
- K=OLDLC2;
- if(I == LAMP)K=1;
- DROP(I,K);
-L98: /*etc*/ ;
- } /* end loop */
- LOC=3;
- OLDLOC=LOC;
- goto L2000;
-
-/* HE DIED DURING CLOSING TIME. NO RESURRECTION. TALLY UP A DEATH AND EXIT. */
-
-L95: RSPEAK(131);
- NUMDIE=NUMDIE+1;
- score(0);
-
-
-
-
-/* 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 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: HINTLC[HINT]=0;
- if(!YES(HINTS[HINT][3],0,54)) goto L2602;
- SETPRM(1,HINTS[HINT][2],HINTS[HINT][2]);
- RSPEAK(261);
- HINTED[HINT]=YES(175,HINTS[HINT][4],54);
- if(HINTED[HINT] && LIMIT > 30)LIMIT=LIMIT+30*HINTS[HINT][2];
-L40020: HINTLC[HINT]=0;
-L40030: goto L2602;
-
-/* NOW FOR THE QUICK TESTS. SEE DATABASE DESCRIPTION FOR ONE-LINE NOTES. */
-
-L40100: if(PROP[GRATE] == 0 && !HERE(KEYS)) goto L40010;
- goto L40020;
-
-L40200: if(PLACE[BIRD] == LOC && TOTING(ROD) && OLDOBJ == BIRD) goto L40010;
- goto L40030;
-
-L40300: if(HERE(SNAKE) && !HERE(BIRD)) goto L40010;
- goto L40020;
-
-L40400: if(ATLOC[LOC] == 0 && ATLOC[OLDLOC] == 0 && ATLOC[OLDLC2] == 0 && HOLDNG >
- 1) goto L40010;
- goto L40020;
-
-L40500: if(PROP[EMRALD] != -1 && PROP[PYRAM] == -1) goto L40010;
- goto L40020;
-
-L40600: goto L40010;
-
-L40700: if(DFLAG == 0) goto L40010;
- goto L40020;
-
-L40800: if(ATLOC[LOC] == 0 && ATLOC[OLDLOC] == 0 && ATLOC[OLDLC2] == 0) goto
- L40010;
- goto L40030;
-
-L40900: I=ATDWRF(LOC);
- if(I < 0) goto L40020;
- if(HERE(OGRE) && I == 0) goto L40010;
- goto L40030;
-
-L41000: if(TALLY == 1 && 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 MT. 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: PROP[GRATE]=0;
- PROP[FISSUR]=0;
- /* 10010 */ for (I=1; I<=6; I++) {
- DSEEN[I]=FALSE;
-L10010: DLOC[I]=0;
- } /* end loop */
- MOVE(TROLL,0);
- MOVE(TROLL+100,0);
- MOVE(TROLL2,PLAC[TROLL]);
- MOVE(TROLL2+100,FIXD[TROLL]);
- JUGGLE(CHASM);
- if(PROP[BEAR] != 3)DSTROY(BEAR);
- PROP[CHAIN]=0;
- FIXED[CHAIN]=0;
- PROP[AXE]=0;
- FIXED[AXE]=0;
- RSPEAK(129);
- CLOCK1= -1;
- CLOSNG=TRUE;
- 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).
- * AT THE NE END, WE PLACE EMPTY BOTTLES, A NURSERY OF PLANTS, A BED OF
- * OYSTERS, A PILE OF LAMPS, RODS WITH STARS, SLEEPING DWARVES, AND HIM. AT
- * THE SW END WE PLACE GRATE OVER TREASURES, SNAKE PIT, COVEY OF CAGED BIRDS,
- * MORE RODS, AND PILLOWS. A MIRROR STRETCHES ACROSS ONE WALL. MANY OF THE
- * OBJECTS COME FROM KNOWN LOCATIONS AND/OR STATES (E.G. THE SNAKE IS KNOWN TO
- * HAVE BEEN DESTROYED AND NEEDN'T BE CARRIED AWAY FROM ITS OLD "PLACE"),
- * MAKING THE VARIOUS OBJECTS BE HANDLED DIFFERENTLY. WE ALSO DROP ALL OTHER
- * OBJECTS HE MIGHT BE CARRYING (LEST HE HAVE SOME WHICH COULD CAUSE TROUBLE,
- * SUCH AS THE KEYS). WE DESCRIBE THE FLASH OF LIGHT AND TRUNDLE BACK. */
-
-L11000: PROP[BOTTLE]=PUT(BOTTLE,115,1);
- PROP[PLANT]=PUT(PLANT,115,0);
- PROP[OYSTER]=PUT(OYSTER,115,0);
- OBJTXT[OYSTER]=3;
- PROP[LAMP]=PUT(LAMP,115,0);
- PROP[ROD]=PUT(ROD,115,0);
- PROP[DWARF]=PUT(DWARF,115,0);
- LOC=115;
- OLDLOC=115;
- NEWLOC=115;
-
-/* LEAVE THE GRATE WITH NORMAL (NON-NEGATIVE) PROPERTY. REUSE SIGN. */
-
- I=PUT(GRATE,116,0);
- I=PUT(SIGN,116,0);
- OBJTXT[SIGN]=OBJTXT[SIGN]+1;
- PROP[SNAKE]=PUT(SNAKE,116,1);
- PROP[BIRD]=PUT(BIRD,116,1);
- PROP[CAGE]=PUT(CAGE,116,0);
- PROP[ROD2]=PUT(ROD2,116,0);
- PROP[PILLOW]=PUT(PILLOW,116,0);
-
- PROP[MIRROR]=PUT(MIRROR,115,0);
- FIXED[MIRROR]=116;
-
- /* 11010 */ for (I=1; I<=100; I++) {
-L11010: if(TOTING(I))DSTROY(I);
- } /* end loop */
-
- RSPEAK(132);
- CLOSED=TRUE;
- goto L2;
-
-/* ANOTHER WAY WE CAN FORCE AN END TO THINGS IS BY HAVING THE LAMP GIVE OUT.
- * WHEN IT GETS CLOSE, WE COME HERE TO WARN HIM. WE GO TO 12000 IF THE LAMP
- * AND FRESH BATTERIES ARE HERE, IN WHICH CASE WE REPLACE THE BATTERIES AND
- * CONTINUE. 12200 IS FOR OTHER CASES OF LAMP DYING. 12400 IS WHEN IT GOES
- * OUT. EVEN THEN, HE CAN EXPLORE OUTSIDE FOR A WHILE IF DESIRED. */
-
-L12000: RSPEAK(188);
- PROP[BATTER]=1;
- if(TOTING(BATTER))DROP(BATTER,LOC);
- LIMIT=LIMIT+2500;
- LMWARN=FALSE;
- goto L19999;
-
-L12200: if(LMWARN || !HERE(LAMP)) goto L19999;
- LMWARN=TRUE;
- SPK=187;
- if(PLACE[BATTER] == 0)SPK=183;
- if(PROP[BATTER] == 1)SPK=189;
- RSPEAK(SPK);
- goto L19999;
-
-L12400: LIMIT= -1;
- PROP[LAMP]=0;
- if(HERE(LAMP))RSPEAK(184);
- goto L19999;
-
-/* OH DEAR, HE'S DISTURBED THE DWARVES. */
-
-L18999: RSPEAK(SPK);
-L19000: RSPEAK(136);