commit 1dfe76cfc7dab6379646dbd6d93af96fc17ed53e Author: historicalsource Date: Sat Apr 13 22:03:05 2019 -0400 Revision 17 (Original Source) diff --git a/README.md b/README.md new file mode 100644 index 0000000..7666f36 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# zork3 diff --git a/actions.zap b/actions.zap new file mode 100644 index 0000000..4771fb6 --- /dev/null +++ b/actions.zap @@ -0,0 +1,1945 @@ + + + .FUNCT SWORD-FCN + ZERO? SWORD-IN-STONE? /?ELS5 + EQUAL? PRSA,V?MOVE,V?TAKE \FALSE + RANDOM 100 + GRTR? 10,STACK \?ELS16 + PRINTR "Who do you think you are? Arthur?" +?ELS16: PRINTR "The sword is deeply imbedded within the rock. You can't even begin to budge it." +?ELS5: EQUAL? PRSA,V?TAKE \FALSE + EQUAL? WINNER,ADVENTURER \FALSE + CALL QUEUE,I-SWORD,-1 + PUT STACK,0,1 + RFALSE + + + .FUNCT LANTERN + EQUAL? PRSA,V?THROW \?ELS5 + PRINTI "The lamp has smashed into the floor, and the light has gone out." + CRLF + CALL INT,I-LANTERN + PUT STACK,0,0 + REMOVE LAMP + SET 'CURRENT-LAMP,BROKEN-LAMP + MOVE BROKEN-LAMP,HERE + RTRUE +?ELS5: EQUAL? PRSA,V?LAMP-ON \?ELS9 + FSET? LAMP,LIGHTBIT /?ELS14 + PRINTR "A burned-out lamp won't light." +?ELS14: CALL INT,I-LANTERN + PUT STACK,0,1 + RFALSE +?ELS9: EQUAL? PRSA,V?LAMP-OFF \?ELS20 + FSET? LAMP,LIGHTBIT /?ELS25 + PRINTR "The lamp has already burned out." +?ELS25: CALL INT,I-LANTERN + PUT STACK,0,0 + RFALSE +?ELS20: EQUAL? PRSA,V?EXAMINE \FALSE + FSET? LAMP,LIGHTBIT /?ELS34 + PRINTI "The lamp has burned out." + JUMP ?CND32 +?ELS34: FSET? LAMP,ONBIT \?ELS38 + PRINTI "The lamp is on." + JUMP ?CND32 +?ELS38: PRINTI "The lamp is turned off." +?CND32: CRLF + RTRUE + + + .FUNCT I-LANTERN,TICK,TBL + VALUE 'LAMP-TABLE >TBL + GET TBL,0 >TICK + CALL QUEUE,I-LANTERN,TICK + PUT STACK,0,1 + CALL LIGHT-INT,LAMP,TBL,TICK + ZERO? TICK /TRUE + ADD TBL,4 >LAMP-TABLE + RTRUE + + + .FUNCT LIGHT-INT,OBJ,TBL,TICK + ZERO? TICK \?CND1 + FCLEAR OBJ,LIGHTBIT + FCLEAR OBJ,ONBIT +?CND1: CALL HELD?,OBJ + ZERO? STACK \?THN9 + IN? OBJ,HERE \FALSE +?THN9: ZERO? TICK \?ELS15 + PRINTI "You'd better have more light than from the " + PRINTD OBJ + PRINTR "." +?ELS15: GET TBL,1 + PRINT STACK + CRLF + RTRUE + + + .FUNCT CRETIN + EQUAL? PRSA,V?GIVE \?ELS5 + CALL PERFORM,V?TAKE,PRSO + RSTACK +?ELS5: EQUAL? PRSA,V?EAT \?ELS7 + PRINTR "Auto-cannibalism is not the answer." +?ELS7: EQUAL? PRSA,V?MUNG,V?KILL \?ELS11 + CALL JIGS-UP,STR?65 + RSTACK +?ELS11: EQUAL? PRSA,V?TAKE \?ELS13 + PRINTR "How romantic!" +?ELS13: EQUAL? PRSA,V?DISEMBARK \?ELS17 + PRINTR "You'll have to do that on your own." +?ELS17: EQUAL? PRSA,V?EXAMINE \?ELS21 + PRINTR "That's difficult unless your eyes are prehensile." +?ELS21: EQUAL? PRSA,V?MAKE \FALSE + PRINTR "Only you can do that." + + + .FUNCT CHASM-FCN + EQUAL? PRSA,V?LEAP /?THN6 + EQUAL? PRSA,V?PUT \?ELS5 + EQUAL? PRSO,ME \?ELS5 +?THN6: PRINTR "You look before leaping and realize you would never survive." +?ELS5: EQUAL? PRSA,V?CROSS \?ELS13 + PRINTR "You'll have to find a bridge." +?ELS13: EQUAL? PRSA,V?PUT \FALSE + EQUAL? PRSI,PSEUDO-OBJECT \FALSE + PRINTI "The " + PRINTD PRSO + PRINTI " drops out of sight into the chasm." + CRLF + REMOVE PRSO + RTRUE + + + .FUNCT PATH-OBJECT + EQUAL? PRSA,V?FOLLOW,V?TAKE \?ELS5 + PRINTR "You must specify a direction to go." +?ELS5: EQUAL? PRSA,V?FIND \FALSE + PRINTR "I can't help you there...." + + + .FUNCT TUNNEL-OBJECT + EQUAL? PRSA,V?THROUGH \?ELS5 + GETP HERE,P?IN + ZERO? STACK /?ELS5 + CALL DO-WALK,P?IN + RTRUE +?ELS5: CALL PATH-OBJECT + RSTACK + + + .FUNCT GROUND-FCN + EQUAL? PRSA,V?PUT \?ELS5 + EQUAL? PRSI,GROUND \?ELS5 + CALL PERFORM,V?DROP,PRSO + RTRUE +?ELS5: EQUAL? PRSA,V?DIG \FALSE + PRINTR "The ground is too hard for digging here." + + + .FUNCT GRUE-FUNCTION + EQUAL? PRSA,V?EXAMINE \?ELS5 + PRINTR "The grue is a sinister, lurking presence in the dark places of the earth. Its favorite diet is adventurers, but its insatiable appetite is tempered by its fear of light. No grue has ever been seen by the light of day, and few have survived its fearsome jaws to tell the tale." +?ELS5: EQUAL? PRSA,V?FIND \?ELS9 + PRINTR "There is no grue here, but I'm sure there is at least one lurking in the darkness nearby. I wouldn't let my light go out if I were you!" +?ELS9: EQUAL? PRSA,V?LISTEN \FALSE + PRINTR "It makes no sound but is always lurking in the darkness nearby." + + + .FUNCT CPEXIT,FX,NFX,?TMP1 + SET 'CP-MOVED,FALSE-VALUE + EQUAL? PRSO,P?UP \?ELS5 + EQUAL? CPHERE,1 \?ELS10 + GET CPTABLE,2 + EQUAL? STACK,-2 \?ELS15 + PRINTI "With the help of the ladder, you exit the puzzle." + CRLF + RETURN CP-ANTE +?ELS15: PRINTI "The exit is too far above your head." + CRLF + RFALSE +?ELS10: PRINTI "There is no way up." + CRLF + RFALSE +?ELS5: EQUAL? CPHERE,33 \?ELS27 + EQUAL? PRSO,P?WEST \?ELS27 + ZERO? CP-FLAG /?ELS27 + FCLEAR CP,TOUCHBIT + RETURN CP-OUT +?ELS27: EQUAL? PRSO,P?DOWN \?ELS31 + PRINTI "There's no way down here." + CRLF + RFALSE +?ELS31: EQUAL? CPHERE,33 \?ELS35 + EQUAL? PRSO,P?WEST \?ELS35 + PRINTI "The metal door bars the way." + CRLF + RFALSE +?ELS35: CALL LKP,PRSO,CPEXITS >FX + ADD FX,CPHERE >NFX + GRTR? NFX,36 /?THN45 + LESS? NFX,0 /?THN45 + CALL ILLCP,CPHERE,FX + ZERO? STACK /?ELS44 +?THN45: PRINTI "There is a wall there." + CRLF + RFALSE +?ELS44: LESS? FX,0 \?ELS55 + SUB 0,FX + JUMP ?CND51 +?ELS55: PUSH FX +?CND51: EQUAL? STACK,1,6 \?ELS50 + CALL CPMOVE,FX + RFALSE +?ELS50: GRTR? FX,0 \?ELS59 + ADD CPHERE,6 + GET CPTABLE,STACK >?TMP1 + SUB FX,6 + ADD CPHERE,STACK + GET CPTABLE,STACK + EQUAL? 0,?TMP1,STACK \?ELS59 + CALL CPMOVE,FX + RFALSE +?ELS59: LESS? FX,0 \?ELS63 + SUB CPHERE,6 + GET CPTABLE,STACK >?TMP1 + ADD CPHERE,6 + ADD STACK,FX >STACK + GET CPTABLE,STACK + EQUAL? 0,?TMP1,STACK \?ELS63 + CALL CPMOVE,FX + RFALSE +?ELS63: PRINTI "There is a wall there." + CRLF + RFALSE + + + .FUNCT ILLCP,ONE,TWO + MOD ONE,6 + ZERO? STACK \?ELS5 + EQUAL? TWO,MINUS-FIVE,1,7 /TRUE +?ELS5: MOD ONE,6 + EQUAL? STACK,1 \?ELS9 + EQUAL? TWO,MINUS-SEVEN,MINUS-ONE,5 /TRUE +?ELS9: LESS? ONE,7 \?ELS13 + LESS? TWO,MINUS-FOUR /TRUE +?ELS13: GRTR? ONE,30 \FALSE + GRTR? TWO,4 /TRUE + RFALSE + + + .FUNCT CPMOVE,FX + ADD CPHERE,FX >FX + GET CPTABLE,FX + ZERO? STACK \?ELS5 + CALL CPGOTO,FX + RSTACK +?ELS5: PRINTR "There is a wall there." + + + .FUNCT CPENTER + EQUAL? YEAR,YEAR-PRESENT \?THN6 + ZERO? CPBLOCK-FLAG /?ELS5 +?THN6: PRINTI "The hole is blocked by sandstone." + CRLF + RFALSE +?ELS5: SET 'CPHERE,1 + RETURN CP + + + .FUNCT CPANT-ROOM,RARG + EQUAL? RARG,M-LOOK \FALSE + PRINTI "This is a small square room, in the middle of which is a perfectly round hole" + ZERO? CPBLOCK-FLAG \?THN13 + EQUAL? YEAR,YEAR-PRESENT /?ELS12 +?THN13: PRINTR " which is blocked by smooth sandstone." +?ELS12: PRINTR " through which you can discern the floor some ten feet below. The place under the hole is dark, but it appears to be completely enclosed in rock. In any event, it doesn't seem likely that you could climb back up. Exits are west and, up a few steps, north." + + + .FUNCT CPLADDER-OBJECT,FLG=0 + SUB CPHERE,1 + GET CPTABLE,STACK + EQUAL? STACK,-3 /?THN6 + ADD CPHERE,1 + GET CPTABLE,STACK + EQUAL? STACK,-2 \?ELS5 + SET 'FLG,TRUE-VALUE + ZERO? FLG /?ELS5 +?THN6: EQUAL? PRSA,V?CLIMB-FOO,V?CLIMB-UP \?ELS14 + ZERO? FLG /?ELS19 + EQUAL? CPHERE,1 \?ELS19 + SET 'CPSOLVE-FLAG,TRUE-VALUE + CALL GOTO,CP-ANTE + RSTACK +?ELS19: PRINTR "You hit your head on the ceiling and fall off the ladder." +?ELS14: PRINTR "Come, come!" +?ELS5: PRINTR "I can't see any ladder here." + + + .FUNCT CPWALL-OBJECT,WL,NWL,NXT,NNXT,CNT,TOP,SNAP=0 + EQUAL? PRSA,V?MOVE \?ELS5 + PRINTR "You can't grab the wall to pull it." +?ELS5: EQUAL? PRSA,V?PUSH \FALSE + CALL CPNEXT,CPHERE,PRSO >NXT + ZERO? NXT \?CND10 + PRINTR "The wall doesn't budge." +?CND10: GET CPTABLE,NXT >WL + ZERO? WL \?ELS19 + PRINTR "There is only a passage in that direction." +?ELS19: EQUAL? WL,1 \?ELS23 + PRINTR "The wall doesn't budge." +?ELS23: CALL CPNEXT,NXT,PRSO >NNXT + ZERO? NNXT \?ELS27 + PRINTR "The wall barely gives." +?ELS27: GET CPTABLE,NNXT >NWL + ZERO? NWL /?ELS31 + PRINTR "The wall barely gives." +?ELS31: PRINTI "The wall slides forward and you follow it" + ZERO? CPPUSH-FLAG /?ELS40 + PRINTI " to this position:" + CRLF + JUMP ?CND38 +?ELS40: INC 'SCORE + PRINTI ".... +The architecture of this region is getting complex, so that further descriptions will be diagrams of the immediate vicinity in a 3x3 grid. The walls here are rock, but of two different types - sandstone and marble. The following notations will be used: +" + GET 0,8 + BOR STACK,2 + PUT 0,8,STACK + PRINTI " + .. = your position (middle of grid) + MM = marble wall + SS = sandstone wall + ?? = unknown (blocked by walls) + +" + GET 0,8 + BAND STACK,-3 + PUT 0,8,STACK +?CND38: SET 'CPPUSH-FLAG,TRUE-VALUE + PUT CPTABLE,NXT,0 + PUT CPTABLE,NNXT,WL + ZERO? NNXT /?CND50 + SUB NNXT,1 + MUL 8,STACK >TOP + GET CPOBJS,TOP >CNT +?PRG53: ZERO? CNT \?ELS57 + JUMP ?CND50 +?ELS57: INC 'TOP + GET CPOBJS,TOP + MOVE STACK,CP-OUT + ZERO? SNAP \?CND60 + SET 'SNAP,TRUE-VALUE + PRINTI "You hear a soft ""snap"" from behind the wall you were pushing." + CRLF +?CND60: DEC 'CNT + JUMP ?PRG53 +?CND50: EQUAL? NNXT,1 \?CND65 + SET 'CPBLOCK-FLAG,TRUE-VALUE +?CND65: CALL CPGOTO,NXT + RSTACK + + + .FUNCT CPGOTO,FX,F,X,CNT,TOP + SET 'CP-MOVED,TRUE-VALUE + FCLEAR HERE,TOUCHBIT + SUB CPHERE,1 + MUL 8,STACK >TOP + ADD TOP,1 >CNT + FIRST? CP >F /?KLU22 +?KLU22: +?PRG1: NEXT? F >X /?KLU23 +?KLU23: ZERO? F \?ELS5 + JUMP ?REP2 +?ELS5: EQUAL? F,ADVENTURER \?ELS7 + JUMP ?CND3 +?ELS7: PUT CPOBJS,CNT,F + REMOVE F + INC 'CNT +?CND3: ZERO? X \?ELS12 + JUMP ?REP2 +?ELS12: SET 'F,X + JUMP ?PRG1 +?REP2: SUB CNT,TOP + SUB STACK,1 + PUT CPOBJS,TOP,STACK + SET 'CPHERE,FX + SUB CPHERE,1 + MUL 8,STACK >TOP + GET CPOBJS,TOP >CNT +?PRG15: ZERO? CNT \?ELS19 + JUMP ?REP16 +?ELS19: INC 'TOP + GET CPOBJS,TOP + MOVE STACK,CP + DEC 'CNT + JUMP ?PRG15 +?REP16: CALL PERFORM,V?LOOK + RTRUE + + + .FUNCT CPNEXT,RM,OBJ,FX + CALL LKP,OBJ,CPWALLS >FX + CALL ILLCP,RM,FX + ZERO? STACK \FALSE + ADD RM,FX + RSTACK + + + .FUNCT CPDOOR-F + EQUAL? HERE,CP \?ELS5 + EQUAL? CPHERE,33 /?ELS5 + PRINTR "I can't see any steel door here." +?ELS5: EQUAL? PRSA,V?OPEN \?ELS11 + ZERO? CP-FLAG /?ELS16 + PRINTR "The steel door has already opened." +?ELS16: PRINTR "You can't force it open." +?ELS11: EQUAL? PRSA,V?CLOSE \?ELS25 + ZERO? CP-FLAG /?ELS30 + PRINTR "There doesn't seem to be any way to close it." +?ELS30: PRINTR "Do you think it isn't already?" +?ELS25: EQUAL? PRSA,V?MUNG \?ELS39 + PRINTR "The door is, to a first approximation, indestructible." +?ELS39: EQUAL? PRSA,V?KNOCK \FALSE + PRINTR "Besides a great amount of reverberation, nothing happens." + + + .FUNCT CP-ROOM,RARG + EQUAL? RARG,M-ENTER \?ELS5 + EQUAL? PRSO,P?DOWN \?ELS10 + PUSH 1 + JUMP ?CND6 +?ELS10: PUSH 33 +?CND6: SET 'CPHERE,STACK + RETURN CPHERE +?ELS5: EQUAL? RARG,M-LOOK \FALSE + ZERO? CPPUSH-FLAG /?ELS19 + CALL CPWHERE + RSTACK +?ELS19: PRINTR "You are in a small square room bounded to the north and west with marble walls and to the east and south with sandstone walls." + + + .FUNCT CPNS,NUM + GRTR? NUM,36 /TRUE + LESS? NUM,1 /TRUE + GET CPTABLE,NUM + RSTACK + + + .FUNCT CPEW,NUM,FOO + MOD NUM,6 + EQUAL? STACK,FOO /TRUE + GET CPTABLE,NUM + RSTACK + + + .FUNCT CPWHERE,N,S,E,W + ADD CPHERE,-6 + CALL CPNS,STACK >N + ADD CPHERE,6 + CALL CPNS,STACK >S + ADD CPHERE,1 + CALL CPEW,STACK,1 >E + ADD CPHERE,-1 + CALL CPEW,STACK,0 >W + GET 0,8 + BOR STACK,2 + PUT 0,8,STACK + PRINTI " +" + CALL CP-CORNER,MINUS-SEVEN,N,W + PRINTI " " + CALL CP-ORTHO,N + PRINTI " " + CALL CP-CORNER,MINUS-FIVE,N,E + PRINTI "+" + CRLF + PRINTI "West +" + CALL CP-ORTHO,W + PRINTI " .. " + CALL CP-ORTHO,E + PRINTI "+ East" + CRLF + PRINTI " +" + CALL CP-CORNER,5,S,W + PRINTI " " + CALL CP-ORTHO,S + PRINTI " " + CALL CP-CORNER,7,S,E + PRINTI "+" + CRLF + GET 0,8 + BAND STACK,-3 + PUT 0,8,STACK + EQUAL? CPHERE,1 \?ELS25 + PRINTI "In the ceiling above you is a large circular opening." + CRLF + JUMP ?CND23 +?ELS25: EQUAL? CPHERE,22 \?ELS29 + PRINTI "The center of the floor here is noticeably depressed." + CRLF + JUMP ?CND23 +?ELS29: EQUAL? CPHERE,33 \?CND23 + PRINTI "In the center of the west wall is a steel door which is " + ZERO? CP-FLAG /?ELS38 + PRINTI "open" + JUMP ?CND36 +?ELS38: PRINTI "closed" +?CND36: PRINTI ". On one side of the door is a narrow slot." + CRLF +?CND23: EQUAL? E,-2 \?CND48 + PRINTI "There is a ladder here, firmly attached to the east wall." + CRLF +?CND48: EQUAL? W,-3 \FALSE + PRINTR "There is a ladder here, firmly attached to the west wall." + + + .FUNCT CP-ORTHO,CONTENTS + ZERO? CONTENTS \?ELS5 + PRINTI " " + RTRUE +?ELS5: EQUAL? CONTENTS,1 \?ELS9 + PRINTI "MM" + RTRUE +?ELS9: PRINTI "SS" + RTRUE + + + .FUNCT CP-CORNER,DIR,COL,ROW,LOCN + ADD CPHERE,DIR >LOCN + ZERO? COL /?ELS5 + ZERO? ROW /?ELS5 + PRINTI "??" + RTRUE +?ELS5: CALL ILLCP,CPHERE,DIR + ZERO? STACK /?ELS11 + PRINTI "MM" + RTRUE +?ELS11: LESS? LOCN,1 /?THN21 + GRTR? LOCN,36 \?ELS20 +?THN21: PUSH 1 + JUMP ?CND16 +?ELS20: GET CPTABLE,LOCN +?CND16: SET 'COL,STACK + ZERO? COL \?ELS15 + PRINTI " " + RTRUE +?ELS15: EQUAL? COL,1 \?ELS28 + PRINTI "MM" + RTRUE +?ELS28: PRINTI "SS" + RTRUE + + + .FUNCT CP-SLOT-FCN + EQUAL? PRSA,V?PUT \FALSE + GETP PRSO,P?SIZE + GRTR? STACK,10 \?CND6 + PRINTR "It doesn't fit." +?CND6: REMOVE PRSO + EQUAL? PRSO,LORE-BOOK \?ELS15 + SET 'CP-FLAG,TRUE-VALUE + PRINTR "The book drops easily into the slot and vanishes. The metal door slides open, revealing a passageway to the west, as a previously unseen sign flashes: + ""Royal Puzzle Exit Fee Paid + Item Confiscated""" +?ELS15: FSET? PRSO,VICBIT /?THN20 + FSET? PRSO,VILLAIN \?ELS19 +?THN20: CALL PICK-ONE,YUKS + PRINT STACK + CRLF + RTRUE +?ELS19: PRINTI "The item vanishes into the slot. A moment later, a previously unseen sign flashes ""Garbage In, Garbage Out"" and spews the " + PRINTD PRSO + PRINTR " (now atomized) through the slot." + + + .FUNCT CPOUT-ROOM,RARG + EQUAL? RARG,M-LOOK \FALSE + PRINTI "You are in a narrow room, lit from above. A flight of steps leads up toward the north, and a " + ZERO? CP-FLAG /?ELS10 + PRINTI "passage" + JUMP ?CND8 +?ELS10: PRINTI "metal door" +?CND8: PRINTR " leads to the east." + + + .FUNCT MRGO,TORM + EQUAL? PRSO,P?NORTH,P?NW,P?NE \?ELS3 + CALL LKP,HERE,R-NORTHS >TORM + JUMP ?CND1 +?ELS3: CALL LKP,HERE,R-SOUTHS >TORM +?CND1: EQUAL? PRSO,P?NORTH,P?SOUTH \?ELS10 + EQUAL? MLOC,TORM \?ELS15 + MOD MDIR,180 + ZERO? STACK \?ELS20 + PRINTI "There is a wooden wall blocking your way." + CRLF + RFALSE +?ELS20: CALL MIRIN,FALSE-VALUE + ZERO? STACK /?ELS24 + RETURN IN-MIRROR +?ELS24: CALL MIRBLOCK + RFALSE +?ELS15: RETURN TORM +?ELS10: EQUAL? MLOC,TORM \?ELS30 + MOD MDIR,180 + ZERO? STACK \?ELS35 + CALL GO-E-W,TORM + RSTACK +?ELS35: CALL MIRBLOCK + RFALSE +?ELS30: RETURN TORM + + + .FUNCT MIRBLOCK,MD + SET 'MD,MDIR + EQUAL? PRSO,P?SOUTH \?CND1 + ADD MDIR,180 + MOD STACK,360 >MD +?CND1: EQUAL? MD,270 \?ELS12 + ZERO? MR1-FLAG /?THN9 +?ELS12: EQUAL? MD,90 \?ELS8 + ZERO? MR2-FLAG \?ELS8 +?THN9: PRINTR "There is a large broken mirror blocking your way." +?ELS8: PRINTR "There is a large mirror blocking your way." + + + .FUNCT GO-E-W,RM + EQUAL? PRSO,P?NE,P?SE \?ELS5 + CALL LKP,RM,R-EASTS + RSTACK +?ELS5: CALL LKP,RM,R-WESTS + RSTACK + + + .FUNCT EWTELL,RM,EAST?=0,M1?=0,MWIN + EQUAL? RM,MRAE,MRBE,MRCE /?THN4 + EQUAL? RM,MRGE,MRCE \?CND1 +?THN4: SET 'EAST?,TRUE-VALUE +?CND1: ZERO? EAST? /?ELS13 + PUSH 0 + JUMP ?CND9 +?ELS13: PUSH 180 +?CND9: ADD MDIR,STACK + EQUAL? STACK,180 \?CND6 + SET 'M1?,TRUE-VALUE +?CND6: ZERO? M1? /?ELS19 + SET 'MWIN,MR1-FLAG + JUMP ?CND17 +?ELS19: SET 'MWIN,MR2-FLAG +?CND17: PRINTI "You are in a narrow room, whose " + ZERO? EAST? /?ELS29 + PUSH STR?66 + JUMP ?CND25 +?ELS29: PUSH STR?67 +?CND25: PRINT STACK + PRINTI " wall is a large " + ZERO? MWIN /?ELS37 + PUSH STR?68 + JUMP ?CND33 +?ELS37: PUSH STR?69 +?CND33: PRINT STACK + CRLF + ZERO? M1? /?CND41 + ZERO? MIRROR-OPEN-FLAG /?CND41 + ZERO? MWIN /?ELS52 + PUSH STR?70 + JUMP ?CND48 +?ELS52: PUSH STR?71 +?CND48: PRINT STACK + CRLF +?CND41: PRINTR "The opposite wall is solid rock." + + + .FUNCT MRDEW,RARG=0 + EQUAL? RARG,M-LOOK \FALSE + CALL EWTELL,HERE + SET 'GUARDIANS-SEEN,TRUE-VALUE + PRINTI "Somewhat to the south" + PRINT GUARDSTR + CRLF + RTRUE + + + .FUNCT MRCEW,RARG=0 + EQUAL? RARG,M-LOOK \FALSE + CALL EWTELL,HERE + SET 'GUARDIANS-SEEN,TRUE-VALUE + PRINTI "Somewhat to the north" + PRINT GUARDSTR + CRLF + RTRUE + + + .FUNCT MRBEW,RARG=0 + EQUAL? RARG,M-LOOK \FALSE + CALL EWTELL,HERE + PRINTR "To the north and south are large hallways." + + + .FUNCT MRAEW,RARG=0 + EQUAL? RARG,M-LOOK \FALSE + CALL EWTELL,HERE + PRINTR "To the north is a large hallway." + + + .FUNCT LOOK-TO,RMN,RMS,NORTH?=0,NTELL=0,STELL=0,MIR?,M1?=0,DIR + EQUAL? HERE,MREYE,FRONT-DOOR /?CND1 + PRINTI "This is a part of the long hallway. The east and west walls are dressed stone. In the center of the hall is a shallow stone channel. In the center of the room the channel widens into a large hole around which is engraved a compass rose." + CRLF +?CND1: EQUAL? HERE,MRG \?ELS8 + SET 'GUARDIANS-SEEN,TRUE-VALUE + PRINTI "On either side of you are identical stone statues holding bludgeons. They appear ready to strike, though, for the moment, they remain impassive." + CRLF + JUMP ?CND6 +?ELS8: EQUAL? HERE,MRC \?ELS12 + SET 'GUARDIANS-SEEN,TRUE-VALUE + PRINTI "Somewhat to the north" + PRINT GUARDSTR + CRLF + SET 'NTELL,TRUE-VALUE + JUMP ?CND6 +?ELS12: EQUAL? HERE,FRONT-DOOR \?ELS16 + PRINTI "You are in a north-south hallway which ends, to the north, at a large wooden door." + CRLF + SET 'NTELL,TRUE-VALUE + JUMP ?CND6 +?ELS16: EQUAL? HERE,MRD \?ELS20 + SET 'GUARDIANS-SEEN,TRUE-VALUE + PRINTI "Somewhat to the south" + PRINT GUARDSTR + CRLF + SET 'STELL,TRUE-VALUE + JUMP ?CND6 +?ELS20: EQUAL? HERE,MRA \?CND6 + PRINTI "The hallway continues to the south." + CRLF + SET 'STELL,TRUE-VALUE +?CND6: EQUAL? MLOC,RMN,RMS \?CND27 + EQUAL? MLOC,RMN \?ELS32 + SET 'NORTH?,TRUE-VALUE + SET 'NTELL,TRUE-VALUE + SET 'DIR,STR?73 + JUMP ?CND30 +?ELS32: SET 'STELL,TRUE-VALUE + SET 'DIR,STR?74 +?CND30: ZERO? NORTH? /?ELS39 + GRTR? MDIR,180 \?ELS39 + LESS? MDIR,359 \?ELS39 + SET 'M1?,TRUE-VALUE + PUSH MR1-FLAG + JUMP ?CND35 +?ELS39: ZERO? NORTH? \?ELS43 + GRTR? MDIR,0 \?ELS43 + LESS? MDIR,179 \?ELS43 + SET 'M1?,TRUE-VALUE + PUSH MR1-FLAG + JUMP ?CND35 +?ELS43: PUSH MR2-FLAG +?CND35: SET 'MIR?,STACK + MOD MDIR,180 + ZERO? STACK \?ELS50 + PRINTI "The " + PRINT DIR + PRINTI "th side of the room is divided by a wooden wall into small hallways to the " + PRINT DIR + PRINTI "theast and " + PRINT DIR + PRINTI "thwest." + CRLF + JUMP ?CND27 +?ELS50: ZERO? MIR? /?ELS65 + PUSH STR?75 + JUMP ?CND61 +?ELS65: PUSH STR?76 +?CND61: PRINT STACK + PRINT DIR + PRINTI "th side of the hallway." + CRLF + ZERO? M1? /?CND48 + ZERO? MIRROR-OPEN-FLAG /?CND48 + ZERO? MIR? /?ELS80 + PUSH STR?70 + JUMP ?CND76 +?ELS80: PUSH STR?71 +?CND76: PRINT STACK + CRLF +?CND48: +?CND27: ZERO? NTELL \?ELS86 + ZERO? STELL \?ELS86 + PRINTR "The corridor continues north and south." +?ELS86: ZERO? NTELL \?ELS92 + PRINTR "The corridor continues north." +?ELS92: ZERO? STELL \TRUE + PRINTR "The corridor continues south." + + + .FUNCT MRDF,RARG=0 + EQUAL? RARG,M-LOOK \FALSE + CALL LOOK-TO,FRONT-DOOR,MRG + RSTACK + + + .FUNCT MRCF,RARG=0 + EQUAL? RARG,M-LOOK \FALSE + CALL LOOK-TO,MRG,MRB + RSTACK + + + .FUNCT MRBF,RARG=0 + EQUAL? RARG,M-LOOK \FALSE + CALL LOOK-TO,MRC,MRA + RSTACK + + + .FUNCT MRAF,RARG=0 + EQUAL? RARG,M-LOOK \FALSE + CALL LOOK-TO,MRB,FALSE-VALUE + RSTACK + + + .FUNCT EG-INFESTED?,R + EQUAL? MLOC,MRG \?ELS5 + EQUAL? R,IN-MIRROR /?THN1 +?ELS5: EQUAL? R,MRGE,MRG,MRGW \FALSE + PUSH 1 +?THN1: RSTACK + + + .FUNCT GUARDIANS,RARG=0 + EQUAL? RARG,M-LOOK \?ELS5 + EQUAL? HERE,MRG \?ELS10 + CALL LOOK-TO,MRD,MRC + RSTACK +?ELS10: CALL EWTELL,HERE + PRINTR "To the east and west are the Guardians of Zork, in perfect symmetry. From here, it's hard to tell which of the two is a reflection!" +?ELS5: EQUAL? RARG,M-ENTER \?ELS16 + ZERO? INVIS \?ELS16 + CALL JIGS-UP,STR?77 + RSTACK +?ELS16: EQUAL? RARG,M-END \FALSE + EQUAL? PRSA,V?EXAMINE \?ELS22 + EQUAL? HERE,IN-MIRROR \?ELS27 + PRINTR "You can't see them from here." +?ELS27: PRINTR "The guardians are quite impressive. I wouldn't get in their way if I were you!" +?ELS22: EQUAL? PRSA,V?THROW \?ELS35 + EQUAL? PRSI,GUARDIAN \?ELS35 + PRINTI "The " + PRINTD PRSO + PRINTI " flies within sight of the guardians, who, in perfect unison, destroy it utterly. Satisfied, they resume their posts." + CRLF + REMOVE PRSO + RTRUE +?ELS35: EQUAL? PRSA,V?ATTACK \?ELS41 + PRINTR "You aren't close enough to fight them and even if you were, the contest would be a bit one-sided." +?ELS41: EQUAL? PRSA,V?HELLO \FALSE + PRINTR "The statues are impassive." + + + .FUNCT MIRROR-DIR?,DIR,RM,TBL + EQUAL? DIR,P?NORTH \?ELS5 + PUSH R-NORTHS + JUMP ?CND1 +?ELS5: PUSH R-SOUTHS +?CND1: SET 'TBL,STACK + GETPT RM,DIR + ZERO? STACK /FALSE + CALL LKP,RM,TBL + EQUAL? MLOC,STACK \FALSE + EQUAL? DIR,P?NORTH \?ELS19 + GRTR? MDIR,180 \?ELS19 + LESS? MDIR,360 /TRUE +?ELS19: EQUAL? DIR,P?SOUTH \?ELS23 + GRTR? MDIR,0 \?ELS23 + LESS? MDIR,180 /TRUE +?ELS23: RETURN 2 + + + .FUNCT WOODEN-WALL-F + MOD MDIR,180 + ZERO? STACK \?ELS5 + CALL MIRROR-DIR?,P?NORTH,HERE + ZERO? STACK \?THN8 + CALL MIRROR-DIR?,P?SOUTH,HERE + ZERO? STACK /?ELS5 +?THN8: EQUAL? PRSA,V?PUSH \FALSE + PRINTR "The structure won't budge." +?ELS5: PRINTR "I can't see any wooden wall here." + + + .FUNCT MIRROR-HERE?,RM,TMP + EQUAL? HERE,MRAE,MRAW,MRBE /?THN6 + EQUAL? HERE,MRBW,MRCE,MRCW /?THN6 + EQUAL? HERE,MRGE,MRGW,MRDE /?THN6 + EQUAL? HERE,MRDW \?ELS5 +?THN6: EQUAL? RM,MRAE,MRBE,MRCE /?THN18 + EQUAL? RM,MRGE,MRDE \?ELS17 +?THN18: PUSH 0 + JUMP ?CND13 +?ELS17: PUSH 180 +?CND13: ADD MDIR,STACK + EQUAL? 180,STACK /TRUE + RETURN 2 +?ELS5: MOD MDIR,180 + ZERO? STACK /FALSE + CALL MIRROR-DIR?,P?NORTH,RM >TMP + ZERO? TMP /?ELS27 + RETURN TMP +?ELS27: CALL MIRROR-DIR?,P?SOUTH,RM >TMP + ZERO? TMP /FALSE + RETURN TMP + + + .FUNCT MIRROR-FUNCTION,MIRROR + CALL MIRROR-HERE?,HERE >MIRROR + ZERO? MIRROR \?ELS5 + PRINTR "I can't see any mirror here." +?ELS5: EQUAL? PRSA,V?MOVE,V?OPEN \?ELS9 + PRINTR "I don't see a way to open the mirror here." +?ELS9: EQUAL? PRSA,V?LOOK-INSIDE \?ELS13 + EQUAL? MIRROR,1 \?ELS22 + ZERO? MR1-FLAG \?THN19 +?ELS22: ZERO? MR2-FLAG /?ELS18 +?THN19: ZERO? INVIS /?ELS27 + PRINTR "Amazingly, you have no reflection!" +?ELS27: PRINTR "A disheveled adventurer stares back at you." +?ELS18: PRINTR "You have destroyed the mirror, or have you forgotten?" +?ELS13: EQUAL? PRSA,V?MUNG \?ELS40 + EQUAL? MIRROR,1 \?ELS45 + ZERO? MR1-FLAG /?ELS50 + SET 'MR1-FLAG,FALSE-VALUE + PRINTR "The mirror breaks, revealing a wooden panel behind it. The glistening fragments of mirror quietly sparkle into nonexistance." +?ELS50: PRINTR "The mirror has already been broken." +?ELS45: ZERO? MR2-FLAG /?ELS59 + SET 'MR2-FLAG,FALSE-VALUE + PRINTR "The mirror breaks, revealing a wooden panel behind it. The glistening fragments of mirror quietly sparkle into nonexistance." +?ELS59: PRINTR "The mirror has already been broken." +?ELS40: EQUAL? MIRROR,1 \?ELS72 + ZERO? MR1-FLAG /?THN69 +?ELS72: ZERO? MR2-FLAG \?ELS68 +?THN69: PRINTR "There's no mirror left." +?ELS68: EQUAL? PRSA,V?PUSH \FALSE + EQUAL? MIRROR,1 \?ELS83 + PUSH STR?78 + JUMP ?CND79 +?ELS83: PUSH STR?79 +?CND79: PRINT STACK + CRLF + RTRUE + + + .FUNCT PANEL-FUNCTION,MIRROR + CALL MIRROR-HERE?,HERE >MIRROR + ZERO? MIRROR \?ELS5 + PRINTR "I can't see any panel here." +?ELS5: EQUAL? PRSA,V?MOVE,V?OPEN \?ELS9 + PRINTR "I don't see a way to open the panel here." +?ELS9: EQUAL? PRSA,V?MUNG \?ELS13 + EQUAL? MIRROR,1 \?ELS18 + ZERO? MR1-FLAG /?ELS23 + PRINTR "To break the panel you would have to break the mirror first." +?ELS23: PRINTR "The panel is not that easily destroyed." +?ELS18: ZERO? MR2-FLAG /?ELS32 + PRINTR "To break the panel you would have to break the mirror first." +?ELS32: PRINTR "The panel is not that easily destroyed." +?ELS13: EQUAL? PRSA,V?PUSH \FALSE + EQUAL? MIRROR,1 \?ELS48 + PUSH STR?80 + JUMP ?CND44 +?ELS48: PUSH STR?81 +?CND44: PRINT STACK + CRLF + RTRUE + + + .FUNCT MIROUT,DIR,RM + EQUAL? PRSO,P?OUT \?ELS3 + SET 'DIR,1 + JUMP ?CND1 +?ELS3: CALL LKP,PRSO,DIRVEC >DIR +?CND1: ZERO? MIRROR-OPEN-FLAG /?ELS10 + EQUAL? DIR,1 /?THN17 + ADD MDIR,270 + MOD STACK,360 + EQUAL? STACK,DIR \FALSE +?THN17: MOD MDIR,180 + ZERO? STACK \?ELS23 + CALL MIREW + RSTACK +?ELS23: LESS? MDIR,180 /?PRD26 + PUSH 0 + JUMP ?PRD27 +?PRD26: PUSH 1 +?PRD27: CALL MIRNS,STACK,TRUE-VALUE + RSTACK +?ELS10: ZERO? WOOD-OPEN-FLAG /?ELS31 + EQUAL? DIR,1 /?THN38 + ADD MDIR,180 + MOD STACK,360 + EQUAL? STACK,DIR \?ELS37 +?THN38: ZERO? MDIR \?ELS42 + SET 'RM,FALSE-VALUE + JUMP ?CND40 +?ELS42: SET 'RM,TRUE-VALUE +?CND40: CALL MIRNS,RM,TRUE-VALUE >RM + ZERO? RM /?ELS49 + PRINTI "As you leave, the door swings shut." + CRLF + SET 'WOOD-OPEN-FLAG,FALSE-VALUE + RETURN RM +?ELS49: PRINTI "You can't go that way." + CRLF + RFALSE +?ELS37: PRINTI "You would hit one of the panels." + CRLF + RFALSE +?ELS31: PRINTI "You are inside a closed box!" + CRLF + RFALSE + + + .FUNCT MIRNS,NORTH?,EXIT?=0,S,T + ZERO? EXIT? \?CND1 + ZERO? NORTH? /?ELS6 + EQUAL? MLOC,MRD /FALSE +?ELS6: ZERO? NORTH? \?CND1 + EQUAL? MLOC,MRA /FALSE +?CND1: ZERO? NORTH? /?ELS22 + PUSH P?NORTH + JUMP ?CND18 +?ELS22: PUSH P?SOUTH +?CND18: GETPT MLOC,STACK >T + ZERO? T /FALSE + PTSIZE T >S + EQUAL? S,UEXIT \?ELS30 + GETB T,0 + RSTACK +?ELS30: ZERO? NORTH? /?ELS32 + CALL LKP,MLOC,R-NORTHS + RSTACK +?ELS32: CALL LKP,MLOC,R-SOUTHS + RSTACK + + + .FUNCT MIREW + ZERO? MDIR \?ELS5 + CALL LKP,MLOC,R-WESTS + RSTACK +?ELS5: CALL LKP,MLOC,R-EASTS + RSTACK + + + .FUNCT MIRIN,VRB=1 + CALL MIRROR-HERE?,HERE + EQUAL? STACK,1 \?ELS5 + ZERO? MIRROR-OPEN-FLAG /?ELS5 + RETURN IN-MIRROR +?ELS5: ZERO? VRB /FALSE + CALL MIRROR-HERE?,HERE + EQUAL? STACK,1 \?ELS11 + ZERO? MIRROR-OPENED \?ELS16 + ZERO? MR1-FLAG /?ELS16 + PRINTI "A mirror blocks your way." + CRLF + RFALSE +?ELS16: PRINTI "The panel is closed." + CRLF + RFALSE +?ELS11: PRINTI "The structure blocks your way." + CRLF + RFALSE + + + .FUNCT MREYE-ROOM,RARG=0,O + EQUAL? RARG,M-BEG \?ELS5 + EQUAL? PRSA,V?DROP \?ELS5 + IN? PRSO,WINNER \?ELS5 + CALL BEAM-STOPPED? + ZERO? STACK \?ELS5 + MOVE PRSO,HERE + PRINTI "You conveniently drop the " + PRINTD PRSO + PRINTR " in position to block the beam of light." +?ELS5: EQUAL? RARG,M-LOOK \FALSE + PRINTI "You are in the middle of a long north-south corridor whose walls are polished stone. A narrow red beam of light crosses the room at the north end, inches above the floor." + CRLF + CALL BEAM-STOPPED? >O + ZERO? O /?CND14 + PRINTI "The beam is stopped halfway across the room by a " + PRINTD O + PRINTI " lying on the floor." + CRLF +?CND14: CALL LOOK-TO,MRA,FALSE-VALUE + RSTACK + + + .FUNCT BEAM-STOPPED?,N + FIRST? MREYE >N /?KLU8 +?KLU8: +?PRG1: EQUAL? N,PLAYER,BEAM /?ELS5 + SET 'BEAM-BREAKER,N + RETURN N +?ELS5: NEXT? N >N /?PRG1 + RFALSE + + + .FUNCT BEAM-FUNCTION,PRO,PRI + EQUAL? PRSA,V?LEAP \?ELS5 + PRINTI "You jump over the beam and into the hallway." + CRLF + CALL GOTO,MRA + RTRUE +?ELS5: EQUAL? PRSA,V?FOLLOW \?ELS9 + PRINTR "It simply crosses the northern end of the room, so there's nowhere to follow it." +?ELS9: EQUAL? PRSA,V?EXAMINE \?ELS13 + PRINTI "The red beam of light crosses the north end of the room only an inch or so above the floor." + CALL BEAM-STOPPED? + ZERO? STACK /?CND16 + PRINTI " The beam is broken by a " + PRINTD BEAM-BREAKER + PRINTI " lying on the ground." +?CND16: CRLF + RTRUE +?ELS13: EQUAL? PRSA,V?MUNG,V?PUT \?ELS22 + EQUAL? PRSA,V?PUT \?ELS25 + SET 'PRI,PRSO + SET 'PRO,PRSI + JUMP ?CND23 +?ELS25: SET 'PRI,PRSI + SET 'PRO,PRSO +?CND23: ZERO? PRI /FALSE + EQUAL? PRO,BEAM \FALSE + IN? PRI,WINNER \?ELS36 + MOVE PRI,HERE + SET 'BEAM-BREAKER,PRI + PRINTI "The beam is now interrupted by a " + PRINTD PRI + PRINTR " lying on the floor." +?ELS36: IN? PRI,HERE \?ELS40 + PRINTI "The " + PRINTD PRI + PRINTR " already breaks the beam." +?ELS40: EQUAL? PRI,HANDS \?ELS44 + PRINTR "The beam is broken briefly as it passes through." +?ELS44: PRINTI "You're not holding the " + PRINTD PRI + PRINTR "." +?ELS22: EQUAL? PRSA,V?TAKE \FALSE + EQUAL? PRSO,BEAM \FALSE + PRINTR "No doubt you have a bottle of moonbeams as well." + + + .FUNCT MRSWITCH + EQUAL? PRSA,V?PUSH \FALSE + ZERO? MRSWPUSH-FLAG /?ELS10 + PRINTR "Click." +?ELS10: CALL BEAM-STOPPED? + ZERO? STACK /?ELS20 + PRINTI "Click. Snap!" + CRLF + CALL QUEUE,I-MRINT,7 + PUT STACK,0,1 + SET 'MRSWPUSH-FLAG,TRUE-VALUE + SET 'MIRROR-OPEN-FLAG,TRUE-VALUE + SET 'MIRROR-OPENED,TRUE-VALUE + FCLEAR MRA,TOUCHBIT + RTRUE +?ELS20: PRINTR "Click." + + + .FUNCT I-MRINT + SET 'MRSWPUSH-FLAG,FALSE-VALUE + SET 'MIRROR-OPEN-FLAG,FALSE-VALUE + CALL MIRROR-HERE?,HERE + EQUAL? STACK,1 /?THN6 + EQUAL? HERE,IN-MIRROR \?ELS5 +?THN6: PRINTR "The mirror quietly swings shut." +?ELS5: EQUAL? HERE,MR-ANTE \FALSE + PRINTR "The button pops back to its original position." + + + .FUNCT MAGIC-MIRROR,RARG=0 + EQUAL? RARG,M-LOOK \FALSE + PRINTI "You are inside a rectangular box of wood whose structure is rather complicated. Four sides and the roof are filled in, and the floor is open. + +As you face the side opposite the entrance, two short sides of carved and polished wood are to your left and right. The left panel is mahogany, the right pine. The wall you face is red on its left half and black on its right. On the entrance side, the wall is white opposite the red part of the wall it faces, and yellow opposite the black section. The painted walls are at least twice the length of the unpainted ones. The ceiling is painted blue. + +In the floor is a stone channel about six inches wide and a foot deep. The channel is oriented in a north-south direction. In the exact center of the room the channel widens into a circular depression perhaps two feet wide. Incised in the stone around this area is a compass rose. + +Running from one short wall to the other at about waist height is a wooden bar, carefully carved and drilled. This bar is pierced in two places. The first hole is in the center of the bar (and thus the center of the room). The second is at the left end of the room (as you face opposite the entrance). Through each hole runs a wooden pole. + +The pole at the left end of the bar is short, extending about a foot above the bar, and ends in a hand grip. The pole " + EQUAL? MLOC,MRB \?ELS10 + EQUAL? MDIR,270 \?ELS10 + ZERO? POLEUP-FLAG /?ELS15 + PRINTI "has been lifted out of a hole carved in the stone floor. There is evidently enough friction to keep the pole from dropping back down." + JUMP ?CND8 +?ELS15: PRINTI "has been dropped into a hole carved in the stone floor." + JUMP ?CND8 +?ELS10: EQUAL? MDIR,0,180 \?ELS23 + ZERO? POLEUP-FLAG /?ELS26 + PRINTI "is positioned above the stone channel in the floor." + JUMP ?CND8 +?ELS26: PRINTI "has been dropped into the stone channel incised in the floor." + JUMP ?CND8 +?ELS23: PRINTI "is resting on the stone floor." +?CND8: PRINTI " + +The long pole at the center of the bar extends from the ceiling through the bar to the circular area in the stone channel. This bottom end of the pole has a T-bar a bit less than two feet long attached to it, and on the T-bar is carved an arrow. The arrow and T-bar are pointing " + DIV MDIR,45 + GET LONGDIRS,STACK + PRINT STACK + PRINTI "." + ZERO? WOOD-OPEN-FLAG /?CND39 + PRINTI " +The pine panel has been opened outward." +?CND39: CRLF + RTRUE + + + .FUNCT MPANELS,MD + EQUAL? PRSA,V?PUSH \FALSE + ZERO? POLEUP-FLAG /?ELS10 + EQUAL? MLOC,MRG \?CND11 + ZERO? GUARDIANS-SEEN /?ELS16 + CALL JIGS-UP,STR?77 + RTRUE +?ELS16: CALL JIGS-UP,STR?88 + RTRUE +?CND11: EQUAL? PRSO,RED-PANEL,YELLOW-PANEL \?ELS22 + ADD MDIR,45 + MOD STACK,360 >MD + PRINTI "The structure rotates clockwise." + CRLF + JUMP ?CND20 +?ELS22: ADD MDIR,315 + MOD STACK,360 >MD + PRINTI "The structure rotates counterclockwise." + CRLF +?CND20: PRINTI "The arrow on the compass rose now indicates " + DIV MD,45 + GET LONGDIRS,STACK + PRINT STACK + PRINTI "." + CRLF + ZERO? WOOD-OPEN-FLAG /?CND31 + SET 'WOOD-OPEN-FLAG,FALSE-VALUE + PRINTI "The pine wall closes quietly." + CRLF +?CND31: SET 'MDIR,MD + RETURN MDIR +?ELS10: MOD MDIR,180 + ZERO? STACK \?ELS38 + PRINTR "The short pole prevents the structure from rotating." +?ELS38: PRINTR "The structure shakes slightly but doesn't move." + + + .FUNCT MENDS,RM + EQUAL? PRSA,V?CLOSE \?ELS5 + PRINTR "You can't do that to the panel." +?ELS5: EQUAL? PRSA,V?PUSH /?THN10 + EQUAL? PRSA,V?OPEN \FALSE + EQUAL? PRSO,PINE-PANEL \FALSE +?THN10: MOD MDIR,180 + ZERO? STACK /?ELS18 + PRINTR "The structure rocks back and forth slightly but doesn't move." +?ELS18: EQUAL? PRSO,MAHOGANY-PANEL \?ELS22 + LESS? MDIR,180 /?PRD28 + PUSH 0 + JUMP ?PRD29 +?PRD28: PUSH 1 +?PRD29: CALL MIRNS,STACK >RM + ZERO? RM /?ELS27 + ZERO? MDIR /?PRD30 + PUSH 0 + JUMP ?PRD31 +?PRD30: PUSH 1 +?PRD31: CALL MIRMOVE,STACK,RM + RSTACK +?ELS27: PRINTR "The structure has reached the end of the stone channel and won't budge." +?ELS22: PRINTI "The pine wall swings open." + CRLF + EQUAL? MLOC,MRD \?ELS46 + ZERO? MDIR /?THN43 +?ELS46: EQUAL? MLOC,MRC \?ELS48 + EQUAL? MDIR,180 /?THN43 +?ELS48: EQUAL? MLOC,MRG \?CND40 +?THN43: ZERO? GUARDIANS-SEEN /?ELS51 + PRINTI "The pine door opens into the field of view of the Guardians." + CRLF + JUMP ?CND49 +?ELS51: PRINTI "The pine door opens into the field of view of the Guardians of Zork, represented by two identical stone statues carrying bludgeons." + CRLF +?CND49: CALL JIGS-UP,STR?77 + RTRUE +?CND40: SET 'WOOD-OPEN-FLAG,TRUE-VALUE + CALL QUEUE,I-PININ,5 + PUT STACK,0,1 + RTRUE + + + .FUNCT I-PININ + ZERO? WOOD-OPEN-FLAG /FALSE + SET 'WOOD-OPEN-FLAG,FALSE-VALUE + PRINTR "The pine wall closes quietly." + + + .FUNCT MIRMOVE,NORTH?,RM,PU?=0,LOSE=0 + ZERO? POLEUP-FLAG /?CND1 + SET 'PU?,TRUE-VALUE +?CND1: ZERO? PU? /?ELS10 + PUSH STR?89 + JUMP ?CND6 +?ELS10: PUSH STR?90 +?CND6: PRINT STACK + ZERO? NORTH? /?ELS18 + PUSH STR?82 + JUMP ?CND14 +?ELS18: PUSH STR?85 +?CND14: PRINT STACK + PRINTI " and stops over another compass rose." + CRLF + SET 'MLOC,RM + EQUAL? RM,MRG \TRUE + EQUAL? HERE,IN-MIRROR \TRUE + ZERO? PU? /?ELS29 + SET 'LOSE,TRUE-VALUE + JUMP ?CND27 +?ELS29: ZERO? MR1-FLAG /?THN33 + ZERO? MR2-FLAG \?ELS32 +?THN33: SET 'LOSE,TRUE-VALUE + JUMP ?CND27 +?ELS32: ZERO? MIRROR-OPEN-FLAG \?THN37 + ZERO? WOOD-OPEN-FLAG /?CND27 +?THN37: SET 'LOSE,TRUE-VALUE +?CND27: ZERO? LOSE /TRUE + ZERO? GUARDIANS-SEEN /?ELS45 + CALL JIGS-UP,STR?91 + RTRUE +?ELS45: CALL JIGS-UP,STR?92 + RTRUE + + + .FUNCT SHORT-POLE-F + EQUAL? PRSA,V?RAISE \?ELS5 + EQUAL? POLEUP-FLAG,2 \?ELS10 + PRINTR "The pole cannot be raised further." +?ELS10: SET 'POLEUP-FLAG,2 + PRINTR "The pole is now slightly above the floor." +?ELS5: EQUAL? PRSA,V?PUT \?ELS22 + EQUAL? PRSI,CHANNEL /?THN19 +?ELS22: EQUAL? PRSA,V?LOWER,V?PUSH \FALSE +?THN19: ZERO? POLEUP-FLAG \?ELS27 + PRINTR "The pole cannot be lowered further." +?ELS27: MOD MDIR,180 + ZERO? STACK \?ELS31 + PRINTI "The pole is lowered into the channel." + CRLF + SET 'POLEUP-FLAG,0 + RTRUE +?ELS31: EQUAL? MDIR,270 \?ELS35 + EQUAL? MLOC,MRB \?ELS35 + SET 'POLEUP-FLAG,0 + PRINTR "The pole is lowered into the stone hole." +?ELS35: EQUAL? POLEUP-FLAG,1 \?ELS41 + PRINTR "The pole is already resting on the floor." +?ELS41: SET 'POLEUP-FLAG,1 + PRINTR "The pole now rests on the stone floor." + + + .FUNCT DUNGEON-MASTER-F,RARG=0 + EQUAL? RARG,M-OBJDESC /FALSE + EQUAL? WINNER,DUNGEON-MASTER \?ELS7 + EQUAL? PRSA,V?FOLLOW \?ELS12 + IN? DUNGEON-MASTER,HERE \?ELS17 + CALL QUEUE,I-FOLIN,-1 + PUT STACK,0,1 + PRINTR "The dungeon master answers, ""I will follow.""" +?ELS17: PRINTR "The dungeon master's voice replies, ""You must come here first!""" +?ELS12: EQUAL? PRSA,V?WAIT,V?STAY \?ELS25 + CALL QUEUE,I-FOLIN,0 + PRINTR "The dungeon master answers, ""I will stay.""" +?ELS25: EQUAL? PRSA,V?WALK \?ELS29 + EQUAL? PRSO,P?SOUTH,P?ENTER \?ELS34 + EQUAL? HERE,NORTH-CORRIDOR \?ELS34 + PRINTR """I am not permitted to enter the prison cell.""" +?ELS34: EQUAL? PRSO,P?NORTH \?ELS40 + EQUAL? HERE,NORTH-CORRIDOR \?ELS40 + MOVE DUNGEON-MASTER,PARAPET + PRINTI """Very well. I am at the parapet!""" + CRLF + CALL QUEUE,I-FOLIN,0 + RSTACK +?ELS40: EQUAL? PRSO,P?NORTH,P?ENTER \?ELS46 + EQUAL? HERE,SOUTH-CORRIDOR \?ELS46 + PRINTR """I am not permitted to enter the prison cell.""" +?ELS46: PRINTR """I prefer to stay where I am, thank you.""" +?ELS29: EQUAL? PRSA,V?WALK-TO \?ELS56 + EQUAL? PRSO,PARAPET-OBJ \?ELS56 + MOVE DUNGEON-MASTER,PARAPET + CALL QUEUE,I-FOLIN,0 + PRINTR """Very well!""" +?ELS56: EQUAL? PRSA,V?TAKE \?ELS62 + PRINTR """I will have no use for that, I am afraid.""" +?ELS62: EQUAL? PRSA,V?OPEN \?ELS66 + EQUAL? PRSO,DUNGEON-DOOR \?ELS66 + PRINTR "The dungeon master appears angered. ""Do not run from your quest: you are nearing the end!""" +?ELS66: EQUAL? PRSA,V?WALK-TO /?THN73 + EQUAL? PRSA,V?WAIT,V?KILL,V?CLOSE /?THN73 + EQUAL? PRSA,V?OPEN,V?STAY,V?FOLLOW /?THN73 + EQUAL? PRSA,V?SPIN,V?TURN,V?PUSH \?ELS72 +?THN73: EQUAL? PRSA,V?WAIT,V?FOLLOW,V?STAY /FALSE + PRINTI """If you wish,"" he replies." + CRLF + RFALSE +?ELS72: PRINTR """Do not be foolish! Consider the end of your quest!""" +?ELS7: EQUAL? PRSA,V?EXAMINE \?ELS87 + PRINTR "He is dressed simply in a hood and cloak, wearing an amulet and ring, carrying an old book under one arm, and leaning on a wooden staff. A single key, as if to a prison cell, hangs from his belt." +?ELS87: EQUAL? PRSA,V?MUNG,V?KILL,V?ATTACK \?ELS91 + CALL REALLY-DEAD,STR?93 + RSTACK +?ELS91: EQUAL? PRSA,V?TAKE \?ELS93 + PRINTR """I'm willing to accompany you, but not ride in your pocket!""" +?ELS93: EQUAL? PRSA,V?GIVE \FALSE + EQUAL? PRSI,DUNGEON-MASTER \FALSE + PRINTR """I have no need for those things.""" + + + .FUNCT MASTER-F + EQUAL? HERE,PRISON-CELL,GOOD-CELL \?ELS5 + CALL HELLO?,MASTER + ZERO? STACK /?ELS10 + PRINTR "He can't hear you." +?ELS10: PRINTR "He is not here." +?ELS5: EQUAL? PRSA,V?TELL \?ELS18 + SET 'PRSO,DUNGEON-MASTER + RFALSE +?ELS18: EQUAL? PRSA,V?SGIVE,V?GIVE \?ELS20 + IN? DUNGEON-MASTER,HERE \?ELS20 + PRINTR "He politely refuses your offer." +?ELS20: EQUAL? PRSA,V?EXAMINE \?ELS26 + EQUAL? HERE,CELL,NORTH-CORRIDOR \?ELS26 + IN? DUNGEON-MASTER,PARAPET \?ELS26 + PRINTR "The dungeon master is standing on the parapet." +?ELS26: PRINTR "The dungeon master isn't here." + + + .FUNCT BEHIND-DOOR-F,RARG=0 + EQUAL? RARG,M-ENTER \?ELS5 + ZERO? DM-SEEN \?ELS5 + CALL QUEUE,I-FOLIN,-1 + PUT STACK,0,1 + SET 'DM-SEEN,TRUE-VALUE + RETURN DM-SEEN +?ELS5: EQUAL? RARG,M-LOOK \FALSE + PRINTI "You are in a narrow north-south corridor. At the south end is a door and at the north end is an east-west corridor. The door is " + CALL DPR,DUNGEON-DOOR + RSTACK + + + .FUNCT FRONT-DOOR-F,RARG=0 + EQUAL? RARG,M-ENTER \?ELS5 + CALL QUEUE,I-FOLIN,0 + RSTACK +?ELS5: EQUAL? RARG,M-LOOK \FALSE + CALL LOOK-TO,FALSE-VALUE,MRD + PRINTI "The wooden door has a barred panel in it at about head height. The door itself is " + CALL DPR,DUNGEON-DOOR + RSTACK + + + .FUNCT LOOK-LIKE-DM? + IN? CLOAK,WINNER \FALSE + IN? HOOD,WINNER \FALSE + IN? AMULET,WINNER \FALSE + IN? STAFF,WINNER \FALSE + IN? RING,WINNER \FALSE + IN? LORE-BOOK,WINNER \FALSE + IN? KEY,WINNER /TRUE + RFALSE + + + .FUNCT DUNGEON-DOOR-F + EQUAL? PRSA,V?CLOSE,V?OPEN \?ELS5 + PRINTR "The door won't budge." +?ELS5: EQUAL? PRSA,V?KNOCK \FALSE + EQUAL? HERE,FRONT-DOOR \FALSE + PRINTI "The knock reverberates along the hall. For a time it seems there will be no answer. Then you hear someone unlatching the small wooden panel. Through the bars of the great door, the wrinkled face of an old man appears." + ZERO? INVIS /?CND14 + PRINTI " He seems not to take notice of you for for a brief moment, then recovers." +?CND14: CALL LOOK-LIKE-DM? + ZERO? STACK /?ELS24 + PRINTI " After a moment, he starts to smile broadly. He disappears for an instant and the massive door opens without a sound. The old man motions and you feel yourself drawn toward him. +""I am the Master of the Dungeon!"" he booms. ""I have been watching you closely during your journey through the Great Underground Empire. Yes!,"" he says, as if recalling some almost forgotten time, ""we have met before, although I may not appear as I did then."" You look closely into his deeply lined face and see the faces of the old man by the secret door, your ""friend"" at the cliff, and the hooded figure. ""You have shown kindness to the old man, and compassion toward the hooded one. I have seen you display patience in the puzzle and trust at the cliff. You have demonstrated strength, ingenuity, and valor. However, one final test awaits you. Now! Command me as you will, and complete your quest!"" +" + CRLF + CALL GOTO,BEHIND-DOOR + SET 'IN-DUNGEON,TRUE-VALUE + RETURN IN-DUNGEON +?ELS24: PRINTI " He looks you over with his keen, piercing gaze and then speaks gravely. ""I have been waiting a long time for you, " + CALL DMISH + GET DM-REASONS,STACK + PRINT STACK + PRINTI " I will remain here. When you feel you are ready, go to the secret door and 'SAY ""FROTZ OZMOO""'! Go, now!"" He starts to leave but turns back briefly and wags his finger in warning. ""Do not forget the double quotes!"" A moment later, you find yourself in the Button Room." + CRLF + CALL GOTO,MR-ANTE,FALSE-VALUE + RTRUE + + + .FUNCT DMISH,CNT=0 + IN? AMULET,WINNER \?CND1 + INC 'CNT +?CND1: IN? LORE-BOOK,WINNER \?CND4 + INC 'CNT +?CND4: IN? HOOD,WINNER \?CND7 + INC 'CNT +?CND7: IN? CLOAK,WINNER \?CND10 + INC 'CNT +?CND10: IN? RING,WINNER \?CND13 + INC 'CNT +?CND13: IN? KEY,WINNER \?CND16 + INC 'CNT +?CND16: IN? STAFF,WINNER \?CND19 + INC 'CNT + RETURN CNT +?CND19: RETURN CNT + + + .FUNCT I-FOLIN + IN? DUNGEON-MASTER,HERE /FALSE + EQUAL? HERE,PRISON-CELL,CELL \?ELS7 + ZERO? FOLFLAG /?ELS7 + PRINTI "You notice that the dungeon master doesn't follow you." + CRLF + SET 'FOLFLAG,FALSE-VALUE + RTRUE +?ELS7: EQUAL? HERE,PRISON-CELL,CELL /FALSE + ZERO? FOLFLAG \?ELS15 + SET 'FOLFLAG,TRUE-VALUE + PRINTI "The dungeon master rejoins you." + CRLF + MOVE DUNGEON-MASTER,HERE + RTRUE +?ELS15: PRINTI "The dungeon master follows you." + CRLF + MOVE DUNGEON-MASTER,HERE + RTRUE + + + .FUNCT MOVE-CELL-OBJECTS,TOP,CNT,F,X + SUB LCELL,1 + MUL 8,STACK >TOP + ADD TOP,1 >CNT + FIRST? CELL >F /?KLU24 +?KLU24: ZERO? F /?CND1 +?PRG5: NEXT? F >X /?KLU25 +?KLU25: ZERO? F \?ELS9 + JUMP ?CND1 +?ELS9: PUT CELLOBJS,CNT,F + REMOVE F + INC 'CNT +?CND7: ZERO? X \?ELS14 + JUMP ?CND1 +?ELS14: SET 'F,X + JUMP ?PRG5 +?CND1: SUB CNT,TOP + SUB STACK,1 + PUT CELLOBJS,TOP,STACK + SUB PNUMB,1 + MUL 8,STACK >TOP + GET CELLOBJS,TOP >CNT +?PRG17: ZERO? CNT /TRUE + INC 'TOP + GET CELLOBJS,TOP + MOVE STACK,CELL + DEC 'CNT + JUMP ?PRG17 + + + .FUNCT CELL-MOVE,F,X + FCLEAR CELL-DOOR,OPENBIT + FCLEAR BRONZE-DOOR,OPENBIT + EQUAL? PNUMB,LCELL /FALSE + EQUAL? PNUMB,4 \?ELS8 + FCLEAR BRONZE-DOOR,INVISIBLE + JUMP ?CND6 +?ELS8: FSET BRONZE-DOOR,INVISIBLE +?CND6: IN? PLAYER,CELL \?ELS13 + SET 'WINNER,PLAYER + FCLEAR GOOD-CELL,TOUCHBIT + FCLEAR PRISON-CELL,TOUCHBIT + EQUAL? LCELL,4 \?ELS18 + FCLEAR BRONZE-DOOR,INVISIBLE + PUSH GOOD-CELL + JUMP ?CND14 +?ELS18: PUSH PRISON-CELL +?CND14: CALL GOTO,STACK + FIRST? CELL >F /?KLU39 +?KLU39: ZERO? F /?CND11 +?PRG25: NEXT? F >X /?KLU40 +?KLU40: ZERO? F \?ELS29 + JUMP ?CND11 +?ELS29: MOVE F,HERE +?CND27: ZERO? X \?ELS34 + JUMP ?CND11 +?ELS34: SET 'F,X + JUMP ?PRG25 +?ELS13: CALL MOVE-CELL-OBJECTS +?CND11: SET 'LCELL,PNUMB + RETURN LCELL + + + .FUNCT PARAPET-F,RARG + EQUAL? RARG,M-LOOK \FALSE + PRINTI "You are standing behind a stone retaining wall which rims a large parapet overlooking a fiery pit. It is difficult to see through the smoke and flame which fills the pit, but it seems to be more or less bottomless. The pit itself is circular, about two hundred feet in diameter, and is fashioned of roughly hewn stone. The flames generate considerable heat, so it is rather uncomfortable standing here. +There is an object here which looks like a sundial. On it are an indicator arrow and (in the center) a large button. On the face of the dial are numbers 1 through 8. The indicator points to the number " + PRINTN PNUMB + PRINTI "." + CRLF + PRINTR "To the south, across a narrow corridor, is a prison cell." + + + .FUNCT DIAL,N + EQUAL? PRSA,V?EXAMINE \?ELS5 + PRINTI "The dial points to " + PRINTN PNUMB + PRINTR "." +?ELS5: EQUAL? PRSA,V?TURN \?ELS9 + EQUAL? PRSI,INTNUM \?ELS14 + ZERO? P-NUMBER /?THN18 + GRTR? P-NUMBER,8 \?CND15 +?THN18: PRINTR "There is no such setting." +?CND15: SET 'PNUMB,P-NUMBER + EQUAL? WINNER,PLAYER \TRUE + PRINTI "The dial now points to " + PRINTN PNUMB + PRINTR "." +?ELS14: ZERO? PRSI \?ELS28 + PRINTR "You must specify what to set the dial to." +?ELS28: PRINTR "The dial face only contains numbers." +?ELS9: EQUAL? PRSA,V?SPIN \FALSE + RANDOM 8 >PNUMB + EQUAL? WINNER,PLAYER \TRUE + PRINTI "The dial spins and comes to a stop pointing at " + PRINTN PNUMB + PRINTI "." + RTRUE + + + .FUNCT DIALBUTTON,C + FSET? CELL-DOOR,OPENBIT /?PRD1 + PUSH 0 + JUMP ?PRD2 +?PRD1: PUSH 1 +?PRD2: SET 'C,STACK + FCLEAR CELL,TOUCHBIT + EQUAL? PRSA,V?PUSH \FALSE + EQUAL? WINNER,PLAYER \?CND8 + PRINTI "The button depresses with a slight click, and pops back." + CRLF +?CND8: CALL CELL-MOVE + ZERO? C /TRUE + PRINTR "You notice that the cell door is now closed." + + + .FUNCT CELL-ROOM,RARG + EQUAL? RARG,M-LOOK \FALSE + PRINTI "You are in a featureless prison cell. You can see " + FSET? CELL-DOOR,OPENBIT \?ELS10 + PRINTI "an east-west corridor outside the open wooden door in front of you. Your view also takes in the parapet, and behind, a large, fiery pit." + CRLF + JUMP ?CND8 +?ELS10: PRINTI "through the small window in the closed door in front of you the parapet, and, behind that, smoke and flames rising from a fiery pit." + CRLF +?CND8: IN? DUNGEON-MASTER,PARAPET \?CND17 + PRINTI "The dungeon master is standing on the parapet, leaning on his wooden staff. His keen gaze is fixed on you and he looks somewhat tense, as if waiting for something to happen." + CRLF +?CND17: EQUAL? LCELL,4 \TRUE + PRINTI "Behind you, to the south, is a bronze door which is " + CALL DPR,BRONZE-DOOR + RTRUE + + + .FUNCT NCELL-ROOM,RARG + EQUAL? RARG,M-LOOK \FALSE + PRINTI "You are in a bare prison cell. Its wooden door is securely fastened, and you can see only flames and smoke through its small window. On the south wall is a bronze door which seems to be " + CALL DPR,BRONZE-DOOR + RSTACK + + + .FUNCT DPR,OBJ + FSET? OBJ,OPENBIT \?ELS5 + PRINTR "open." +?ELS5: PRINTR "closed." + + + .FUNCT NORTH-CORRIDOR-F,RARG + EQUAL? RARG,M-LOOK \FALSE + PRINTI "This is a wide east-west corridor which opens onto a northern parapet at its center. You can see flames and smoke as you peer towards the parapet. The corridor turns south at either end, and in the center of the south wall is a heavy wooden door with a small window barred with iron. The door is " + CALL DPR,CELL-DOOR + RSTACK + + + .FUNCT SOUTH-CORRIDOR-F,RARG + EQUAL? RARG,M-LOOK \FALSE + PRINTI "You are in an east-west corridor which turns north at its eastern and western ends. The walls are made of the finest marble. An additional passage leads south at the center of the corridor." + CRLF + EQUAL? LCELL,4 \TRUE + PRINTI "In the center of the north wall is a bronze door which is " + CALL DPR,BRONZE-DOOR + RTRUE + + + .FUNCT BRONZE-DOOR-F + EQUAL? PRSA,V?OPEN \?ELS5 + FSET? BRONZE-DOOR,OPENBIT /?ELS5 + EQUAL? HERE,GOOD-CELL \?ELS5 + ZERO? BRONZE-DOOR-LOCKED \?ELS5 + PRINTI "On the other side of the bronze door is a narrow passage which opens out into a larger area." + CRLF + FSET BRONZE-DOOR,OPENBIT + RTRUE +?ELS5: EQUAL? PRSA,V?OPEN \FALSE + ZERO? BRONZE-DOOR-LOCKED /FALSE + PRINTR "The bronze door is locked." + + + .FUNCT LOCKED-DOOR-F + EQUAL? PRSA,V?UNLOCK,V?OPEN \FALSE + PRINTR "The door is securely fastened." + + + .FUNCT NIRVANA-F,RARG + EQUAL? RARG,M-END \FALSE + PRINTI "As you gleefully examine your new-found riches, the Dungeon Master materializes beside you, and says, ""Now that you have solved all the mysteries of the Dungeon, it is time for you to assume your rightly-earned place in the scheme of things. Long have I waited for one capable of releasing me from my burden!"" He taps you lightly on the head with his staff, mumbling a few well-chosen spells, and you feel yourself changing, growing older and more stooped. For a moment there are two identical mages standing among the treasure, then your counterpart dissolves into a mist and disappears, a sardonic grin on his face. + +For a moment you are relieved, safe in the knowledge that you have at last completed your quest in ZORK. You begin to feel the vast powers and lore at your command and thirst for an opportunity to use them. + +" + CALL FINISH + RSTACK + + + .FUNCT BRONZE-DOOR-EXIT + FSET? BRONZE-DOOR,INVISIBLE \?ELS5 + PRINTI "You can't go that way." + CRLF + RFALSE +?ELS5: FSET? BRONZE-DOOR,OPENBIT \?ELS9 + RETURN CELL +?ELS9: PRINTI "The bronze door is closed." + CRLF + RFALSE + + + .FUNCT SECRET-DOOR-F + EQUAL? PRSA,V?OPEN \FALSE + FSET? SECRET-DOOR,OPENBIT /FALSE + PRINTI "The massive stone door opens noiselessly. " + PRINT SECRET-DOOR-DESC + CRLF + FSET SECRET-DOOR,OPENBIT + RTRUE + + + .FUNCT MSTAIRS-F,RARG + EQUAL? RARG,M-ENTER \?ELS5 + RANDOM 100 + GRTR? 30,STACK \?ELS5 + ZERO? OLD-MAN-FED \?ELS5 + ZERO? OLD-MAN-GONE \?ELS5 + MOVE OLD-MAN,HERE + RTRUE +?ELS5: EQUAL? RARG,M-LOOK \FALSE + PRINTI "You are in a room with passages heading southwest and southeast. The north wall is ornately carved, filled with strange runes and writing in an unfamiliar language." + CRLF + FSET? SECRET-DOOR,OPENBIT \?ELS16 + PRINT SECRET-DOOR-DESC + CRLF + RTRUE +?ELS16: FSET? SECRET-DOOR,INVISIBLE /FALSE + PRINTR "The outline of a door is barely visible on the surface of the rock." + + + .FUNCT HELLO?,WHO + EQUAL? WINNER,WHO /?THN8 + EQUAL? PRSA,V?INCANT,V?HELLO,V?SAY /?THN8 + EQUAL? PRSA,V?REPLY,V?ANSWER,V?TELL \FALSE +?THN8: EQUAL? PRSA,V?REPLY,V?INCANT /?THN13 + EQUAL? PRSA,V?SAY,V?ANSWER,V?TELL \TRUE +?THN13: SET 'P-CONT,FALSE-VALUE + SET 'QUOTE-FLAG,FALSE-VALUE + RTRUE + + + .FUNCT OLD-MAN-F,RARG=0 + EQUAL? RARG,M-OBJDESC \?ELS5 + ZERO? OLD-MAN-AWAKE /?ELS10 + PRINTR "There is an old man huddled in the corner, eyeing you cautiously. He seems weak and tired, and nods off frequently." +?ELS10: PRINTR "An old and wizened man is huddled, asleep, in the corner. He is snoring loudly. From his appearance, he is weak and frail." +?ELS5: EQUAL? PRSA,V?GIVE \?ELS19 + EQUAL? PRSI,OLD-MAN \?ELS19 + ZERO? OLD-MAN-AWAKE /?ELS26 + EQUAL? PRSO,WAYBREAD \?ELS32 + REMOVE WAYBREAD + PRINTI "He looks up at you and takes the waybread from you. Slowly, he eats the bread and pauses when he is finished. He starts to speak: ""Perhaps what you seek is through there!"" He points at the carved wall to the north, where you now notice the bare outline of a secret door. When you turn back to the old man, you notice that he has gone!" + CRLF + FCLEAR SECRET-DOOR,INVISIBLE + SET 'OLD-MAN-GONE,TRUE-VALUE + REMOVE OLD-MAN + RTRUE +?ELS32: IN? WAYBREAD,WINNER \?ELS36 + PRINTR "He refuses your offer but motions with his arm to the waybread in your hand." +?ELS36: PRINTI "The old man refuses the " + PRINTD PRSO + PRINTR " with a wave of his hand." +?ELS26: PRINTR "He is asleep!" +?ELS19: EQUAL? PRSA,V?EXAMINE \?ELS48 + ZERO? OLD-MAN-AWAKE /?ELS53 + PRINTR "The old man is barely awake and appears to nod off every few moments. He has bright eyes, which, when open, appear to see right through your body." +?ELS53: PRINTR "The man is very, very old and wizened. He has a long, stringy beard and is snoring quite loudly." +?ELS48: EQUAL? PRSA,V?LISTEN \?ELS62 + ZERO? OLD-MAN-AWAKE /?ELS67 + PRINTR "He isn't talking." +?ELS67: PRINTR "He is snoring like a buzz saw." +?ELS62: CALL HELLO?,OLD-MAN + ZERO? STACK /?ELS76 + ZERO? OLD-MAN-AWAKE /?ELS81 + PRINTR "He nods at you without seeming to have understood." +?ELS81: PRINTR "He is sleeping soundly and does not respond." +?ELS76: EQUAL? PRSA,V?ALARM,V?SHAKE \?ELS90 + PRINTI "The old man is roused to consciousness. He peers at you through eyes which appear much younger and stronger than his frail body and waits, as if expecting something to happen." + CRLF + SET 'OLD-MAN-AWAKE,TRUE-VALUE + CALL QUEUE,I-OLD-MAN-SLEEPS,3 + PUT STACK,0,1 + RTRUE +?ELS90: EQUAL? PRSA,V?MUNG,V?ATTACK,V?KILL \FALSE + PRINTI "The attack seems to have left the old man unharmed! You watch in awe as he rises to his feet and seems to tower above you. He peers down menacingly, then sadly and wearily. ""Not yet,"" he mourns, and vanishes in a puff of smoke." + CRLF + SET 'OLD-MAN-GONE,TRUE-VALUE + REMOVE OLD-MAN + RTRUE + + + .FUNCT I-OLD-MAN-SLEEPS + SET 'OLD-MAN-AWAKE,FALSE-VALUE + IN? OLD-MAN,HERE \FALSE + PRINTR "You notice that the old man has fallen asleep." + + + .FUNCT RUNES-F + EQUAL? PRSA,V?READ,V?EXAMINE \FALSE + PRINTR "The runes are in an ancient language. Some pictures, among the runes, depict flames, stone statues, and figures of old men." + + + .FUNCT T-BAR-F + EQUAL? PRSA,V?TURN \FALSE + PRINTR "You don't have enough leverage to turn the T-bar itself. You might cause the whole structure to turn, however." + + + .FUNCT FLAMING-PIT-F + EQUAL? PRSA,V?EXAMINE \?ELS5 + PRINTR "The flaming pit is a seemingly bottomless abyss filled with smoke and flame." +?ELS5: EQUAL? PRSA,V?PUT \FALSE + EQUAL? PRSI,FLAMING-PIT \FALSE + EQUAL? HERE,PARAPET,NORTH-CORRIDOR \?ELS16 + EQUAL? PRSO,ME \?ELS21 + PRINTR "It would be a pity to end your life so near the end of your quest!" +?ELS21: PRINTI "You cast the " + PRINTD PRSO + PRINTI " into the pit, where it is lost forever." + CRLF + REMOVE PRSO + RTRUE +?ELS16: PRINTR "You're not close enough." + + + .FUNCT PARAPET-OBJ-F + EQUAL? PRSA,V?EXAMINE \FALSE + EQUAL? HERE,CELL,NORTH-CORRIDOR \?ELS10 + PRINTI "You can see the parapet and sundial from here." + IN? DUNGEON-MASTER,PARAPET \?CND13 + PRINTI " The dungeon master is there also, leaning on his staff." +?CND13: CRLF + RTRUE +?ELS10: CALL V-LOOK + RSTACK + + + .FUNCT ROSE-F + EQUAL? PRSA,V?MOVE,V?TURN \FALSE + PRINTR "The compass rose is made of stone and is imbedded in the ground. You could not possibly turn it or move it." + + + .FUNCT CELL-DOOR-F + EQUAL? PRSA,V?PUT \?ELS5 + EQUAL? PRSI,CELL-DOOR \?ELS5 + PRINTR "You will have to enter the cell first." +?ELS5: EQUAL? PRSA,V?THROUGH \FALSE + EQUAL? HERE,CELL \?ELS16 + PRINTR "Look around." +?ELS16: CALL DO-WALK,P?SOUTH + RTRUE + + + .FUNCT LORE-BOOK-F + EQUAL? PRSA,V?BURN \?ELS5 + IN? LORE-BOOK,WINNER /?ELS5 + PRINTI "The book is consumed in a dazzling display of color." + CRLF + REMOVE PRSO + RTRUE +?ELS5: ZERO? IN-DUNGEON /?ELS11 + EQUAL? PRSA,V?READ,V?EXAMINE,V?OPEN \?ELS11 + PRINTR "The book seems to will itself open to a specific page. On it is a picture of eight small rooms located around a great circle of flame. All are identical save one, which has a bronze door leading to a magnificent room bathed in golden light. A legend beneath the picture says only ""The Dungeon and Treasury of Zork.""" +?ELS11: EQUAL? PRSA,V?OPEN \FALSE + PRINTR "The book can be perused but not left open." + + + .FUNCT CP-HOLE-F + EQUAL? PRSA,V?THROUGH \FALSE + CALL DO-WALK,P?DOWN + RTRUE + + + .FUNCT TORCH-PSEUDO + PRINTR "The torches are out of reach." + + + .FUNCT WATER-FCN,AV,PI? + EQUAL? PRSA,V?SGIVE /FALSE + EQUAL? PRSA,V?THROUGH \?ELS5 + CALL PERFORM,V?SWIM,PRSO + RTRUE +?ELS5: EQUAL? PRSA,V?FILL \?ELS7 + SET 'PRSA,V?PUT + SET 'PRSI,PRSO + SET 'PRSO,GLOBAL-WATER + SET 'PI?,FALSE-VALUE + JUMP ?CND1 +?ELS7: EQUAL? PRSO,GLOBAL-WATER \?ELS9 + SET 'PI?,FALSE-VALUE + JUMP ?CND1 +?ELS9: ZERO? PRSI /?CND1 + SET 'PI?,TRUE-VALUE +?CND1: ZERO? PI? /?ELS15 + SET 'PRSI,GLOBAL-WATER + JUMP ?CND13 +?ELS15: SET 'PRSO,GLOBAL-WATER +?CND13: EQUAL? PRSA,V?PUT,V?TAKE \?ELS23 + ZERO? PI? \?ELS23 + PRINTR "The water slips through your fingers." +?ELS23: ZERO? PI? /?ELS29 + PRINTR "You can't do that." +?ELS29: EQUAL? PRSA,V?THROW,V?GIVE,V?DROP \FALSE + PRINTR "You don't have any water." + + + .FUNCT RANDOM-WALL + EQUAL? PRSA,V?PUSH \FALSE + EQUAL? HERE,IN-MIRROR \?ELS10 + PRINTR "You should specify which panel you want to push." +?ELS10: PRINTR "You can't budge it; at least from here." + + .ENDI diff --git a/actions.zil b/actions.zil new file mode 100644 index 0000000..00c7b32 --- /dev/null +++ b/actions.zil @@ -0,0 +1,1935 @@ +"ACTIONS3 for + ZORK III: The Dungeon Master + The Great Underground Empire (Part 3) + (c) Copyright 1982 Infocom, Inc. All Rights Reserved. +" + +> + + + + ) + (T )>)>) + ( <==? ,WINNER ,ADVENTURER>> + > + <>)>> + +> + + + + > + + + ) + ( + > + ) + (ELSE + > + <>)>) + ( + > + ) + (ELSE + > + <>)>) + ( + > + ) + ( + ) + (ELSE + )> + )>> + +)) + >>> + + > + >)> + > + + + + )> + > + + ) + (T + CR>)>)>> + + + ) + ( ) + ( + ) + ( + ) + ( + ) + ( + ) + ( + )>> + + + <==? ,PRSO ,ME>>> + ) + ( + ) + ( <==? ,PRSI ,PSEUDO-OBJECT>> + + )>> + + + ) + ( + )>> + + > + + ) + (T )>> + + <==? ,PRSI ,GROUND>> + + ) + ( + )>> + + + ) + ( + ) + ( + )>> + + +\ + +"SUBTITLE CHINESE PUZZLE SECTION (COURTESY OF WILL WENG)" + + + +>> + +> + +;" 0 is no wall + 1 is fixed wall + -1 is movable wall (-2 is good ladder, -3 bad ladder)" + +> + +> + +> + +> + + + -2> + + ,CP-ANTE) + (T + + )>) + (T + + )>) + ( + <==? ,PRSO ,P?WEST> + ,CP-FLAG> + + ,CP-OUT) + (<==? ,PRSO ,P?DOWN> + + ) + ( + <==? ,PRSO ,P?WEST>> + + ) + (T + > + > 36> + + > + + ) + ( 1 6> + ) + ( ; "SW AND SE" + > + >>>> + ) + ( + > + >>> + ) + (T + )> + )>> + + + + + + + 0> + > ) + ( 1> + > ) + ( > ) + ( > )>> + +>>> + ) + (T + )>> + +> ,CPBLOCK-FLAG> + + ) + (T + + ,CP)>> + + + + >> + ) + (T + )>)>> + +> + +> + +)) + #DECL ((FLG) ) + > -3> + > -2> >> + + > + + ) + (T + )>) + (T )>) + (T )>> + +)) + #DECL ((NXT WL NNXT NWL) FIX (UVEC) ) + ) + ( + > + + + )> + > + + ) + (<1? .WL> + ) + (<0? >> + ) + (>>> + ) + (T + + ) + (T + > + + 2>> + + -3>>)> + + + + > + >> + > + ) + (T + > + ,CP-OUT> + + + )> + >)>>)> + + )> + )>)>> + +; "Flag for blocking of main entrance" + +> + + ;"8*(22-1)" + +) + + + >> + > + > + > + ) + (<==? .F ,ADVENTURER> T) + (T + + + >)> + ) + (T )>> + 1>> + + >> + > + ) + (T + > + ,CP> + >)>> + + > + +> + 0) + (T <+ .RM .FX>)>> + + >> + ) + ( + ) + (T )>) + ( + ) + (T )>) + ( + ) + ( + )>> + + + 1) + (T 33)>>) + (<==? .RARG ,M-LOOK> + ) + (T + )>)>> + + > 1) + (T )>> + + .FOO> 1) + (T )>> + +>) + (S >) + (E 1>) + (W 0>)) + #DECL ((N S E W) FIX) + 2>> + ;"Top Row" + + + + + + + ;"Middle Row" + + + + + ;"Bottom Row" + + + + + + + -3>> + + ) + (<==? ,CPHERE 22> + ) + (<==? ,CPHERE 33> + + ) + (T )> + )> + + )> + + )>> + +;"Show where the eight nearest neighbors are located" + + ) + (<1? .CONTENTS> ) + (T )>> + +;"Show an orthogonal neighbor" + +> + > >> ) + ( ) + (<0? > 1) + (T )>>> + ) + (<1? .COL> ) + (T )>> + + + 10> + + )> + + + + ) + ( + > + CR>) + (T + )>)>> + + + + ) + (T )> + )>> + +"Old end-game stuff" + +"SUBTITLE It's All Done with Mirrors" + +> + + + + + +> + +> + +> + +> +> + + + >) + (T >)> + + + > + + ) + (> ,IN-MIRROR) + (T )>) + (T .TORM)>) + (<==? ,MLOC .TORM> + > ) + (T )>) + (T .TORM)>> + + + + 360>>)> + > + >> + ) + (T + )>> + + + ) + (T )>> + +> +> + +>> + +
>> + +) (M1? <>) MWIN) + + > + )> + > 180> + )> + ) (T )> + + " wall is a large " + + CR> + + + CR>)> + > + +> + +)) + + + + )>> + +)) + + + + )>> + +)) + + + )>> + +)) + + + )>> + + + +) (NTELL <>) (STELL <>) + MIR? (M1? <>) DIR) + > + )> + + + ) + (<==? ,HERE ,MRC> + + + ) + (<==? ,HERE ,FRONT-DOOR> + + ) + (<==? ,HERE ,MRD> + + + ) + (<==? ,HERE ,MRA> + + )> + + + + + ) + (T + + )> + > + + ,MR1-FLAG) + ( > + + ,MR1-FLAG) + (T ,MR2-FLAG)>> + > + + + ) + (T + + .DIR + "th side of the hallway." CR> + + CR>)>)>)> + > + ) + ( + ) + ( + )> + > + +)) + + )>> + +)) + + )>> + +)) + + )>> + +)) + + >)>> + +"Infestation function for Sword-glow demon, tailored for end game" + + <==? .R ,IN-MIRROR>> + >> + +)) + + + ) + (T + + )>) + ( > + ) + (> ) + ( + + ) + (T )>) + ( <==? ,PRSI ,GUARDIAN>> + + ) + ( + ) + ( + )>> + + ,R-NORTHS) (T ,R-SOUTHS)>> + + <==? ,MLOC >> + + + > + 1) + ( + + > + 1) + (T 2)>)>> + +> + + >> + + )>) + (T )>> + + + + + > + + > 0) + (T 180)>>> + 1) + (T 2)>) + (<0? > ) + (> .TMP) + (> .TMP) + (T )>> + +>> + ) + ( + ) + ( + ,MR1-FLAG> ,MR2-FLAG> + ) + (T + )>) + (T + )>) + ( + + > + ) + (T )>) + (,MR2-FLAG + > + ) + (T )>) + ( > > + ) + ( + +"The mirror is mounted on a wooden panel which moves slightly inward +as you push, and back out when you let go. The mirror feels fragile.") + (T +"The mirror is unyielding, but seems rather fragile.")> CR>)>> + +>> + ) + ( + ) + ( + + ) + (T )>) + (,MR2-FLAG + ) + (T )>) + ( + +"The wooden panel moves slightly inward as you push, and back out +when you let go.") + (T +"The panel is unyielding.")> CR>)>> + +> + + ) + (T >)> + + <==? 360> .DIR>> + > + ) + (T T>)>) + (T )>) + (,WOOD-OPEN-FLAG + + <==? 360> .DIR>> + >) (T )> + > + + > + .RM) + (T + + )>) + (T + + )>) + (T + + )>> + +"MIRNS -- returns room in a given direction from the mirror (north or +south as indicated by first argument). If second arg is T, then we +are exiting, not moving the mirror, so don't worry about ends." + +) "AUX" S T) + + > + ) + ( <==? ,MLOC ,MRA>> + )>)> + >> + > ,UEXIT> + ) + (.NORTH? + ) + (T + )>)>> + + ) + (T )>> + + 1> ,MIRROR-OPEN-FLAG> + ,IN-MIRROR) + ( ) + (<==? 1> + ,MR1-FLAG> + + ) + (T )>) + (T )>> + +) "AUX" O) + + + + >> + + ) + (<==? .RARG ,M-LOOK> + + > + )> + >)>> + +> + > + + ) + (>> )>>> + +; "This function cannot have its .PRSI and .PRSO's changed to ,PRSI etc!!" + +> + + + + + ) + ( + ) + ( + + + )> + ) + ( + + + ) + (T + + )> + >> ) + ( + + + ) + ( + ) + (<==? .PRI ,HANDS> + ) + (T )>) + ( <==? ,PRSO ,BEAM>> + )>> + +> + + + ) + (T + + + > + + + + ) + (T )>)>)>> + +> + > + 1> + <==? ,HERE ,IN-MIRROR>> + ) + (<==? ,HERE ,MR-ANTE> + )>> + + + +;"mirror points... 0 = north" + + + +;"pole raised?: 0 -- in hole or channel, 1 -- foor level, 2 -- in air" + +)) + + + <==? ,MDIR 270>> + > + ) + (T + )>) + ( + > + ) + (T + )>) + (T + )> + > + "."> + )> + )>> + +> + +;"MOVEMENT" + + + > + + + ) + (T + + )>)> + + 360>> + ) + (T + 360>> + )> + > + "." CR> + > + )> + ) + (<0? > + ) + (T + )>)>> + + ) + ( + <==? ,PRSO ,PINE-PANEL>>> + >> + ) + (<==? ,PRSO ,MAHOGANY-PANEL> + >> + .RM>) + (T + )>) + (T + + + <==? ,MDIR 0>> + + <==? ,MDIR 180>> + <==? ,MLOC ,MRG>> + ) + (T + )> + + )> + + >)>)>> + +> + )>> + +) (LOSE <>)) + > )> + + + " and stops over another compass rose." CR> + + <==? ,HERE ,IN-MIRROR>> + ) + ( > + ) + ( + )> + ) + (T + )>)> + )> + T> + + + + ) + (T + + )>) + ( <==? ,PRSI ,CHANNEL>> + > + + ) + (<0? > + + + T) + ( <==? ,MLOC ,MRB>> + + ) + (<==? ,POLEUP-FLAG 1> + ) + (T + + )>)>> + +\ + +)) + ) + (<==? ,WINNER ,DUNGEON-MASTER> + + + > + ) + (T + )>) + ( + + ) + ( + + <==? ,HERE ,NORTH-CORRIDOR>> + ) + ( + <==? ,HERE ,NORTH-CORRIDOR>> + + + ) + ( + <==? ,HERE ,SOUTH-CORRIDOR>> + ) + (T + )>) + ( <==? ,PRSO ,PARAPET-OBJ>> + + + ) + ( + ) + ( <==? ,PRSO ,DUNGEON-DOOR>> + ) + ( + T) + (T )> + ) + (T )>) + ( + ) + ( + ) + ( + ) + ( <==? ,PRSI ,DUNGEON-MASTER>> + )>> + + + + ) + (T )>) + ( ) + ( > + ) + ( + + > + ) + (T )>> + +> + +)) + > + > + ) + (<==? .RARG ,M-LOOK> + + )>> + +)) + + ) + (<==? .RARG ,M-LOOK> + ,MRD> + + )>> + + + + + + + + >> + + + ) + ( > + + )> + + + + ) + (T + + >> + + > + )>)>> + +> + +> + + >)> + >)> + >)> + >)> + >)> + >)> + >)> + .CNT> + + ;"Following?" + + ) + ( ,FOLFLAG> + + > + ) + ( ) + ( + + + + ) + (T + + + )>> + +\ + +;"SUBTITLE + 'The end had come, and this was it; he dropped her in the Flaming Pit.'" + + ;"cell in slot" + + ;"cell pointed at" + +>> + +>> + > + > + > + ) + (T + + + >)> + ) + (T )>>)> + 1>> + >> + > + ) + (T + > + ,CELL> + >)>>> + + + + > + ) + (ELSE )> + + + + + + + ,GOOD-CELL) + (ELSE ,PRISON-CELL)>> + > + > + ) + (T )> + ) + (T )>>)>) + (T )> + )>> + + + + )>> + + + ) + ( + + + > + + )> + + + )> + ) + ( + ) + (T )>) + ( + > + + )> + )>> + +> + + + + )> + + )> + )>> + + + + + ) + (T + )> + + )> + + + )> + )>> + + + + )>> + + ) + (T )>> + + + + )>> + + + + + + )> + )>> + + + + + > + <==? ,HERE ,GOOD-CELL> + > + + ) + ( ,BRONZE-DOOR-LOCKED> + )>> + + + )>> + +\ + +"=========== The Ultimate Winnage ==========" + + + + )>> + + + + ) + ( + ,CELL) + (T + + )>> + +; + > + +> +> + + + + >> + + )>> + + + + + > + ) + (<==? .RARG ,M-LOOK> + + + ) + (> + )>)>> + + + > + + > + >)> + )>> + +)) + + ) + (T + )>) + ( <==? ,PRSI ,OLD-MAN>> + + + + + + ) + ( + ) + (T + )>) + (T )>) + ( + ) + (T + )>) + ( + ) + (T + )>) + ( + ) + (T + )>) + ( + + + >) + ( + + + )>> + +> + +> + + )>> + + + )>> + + + )>> + + + ) + ( <==? ,PRSI ,FLAMING-PIT>> + + + ) + (T + + )>) + (T )>)>> + + + + + + )> + ) + (T )>)>> + + + )>> + + <==? ,PRSI ,CELL-DOOR>> + ) + ( + + ) + (T + + )>)>> + + >> + + + ) + (> + ) + ( + )>> + + + + )>> + +> + + (PI?) ) + ) + ( + + ) + ( ;"fill bottle with water =>" + + + + >) + ( + >) + (,PRSI + )> + ) + (T )> + > + ) + (.PI? ) + ( + )>> + + + + ) + (T )>)>> \ No newline at end of file diff --git a/clock.zap b/clock.zap new file mode 100644 index 0000000..7c145e4 --- /dev/null +++ b/clock.zap @@ -0,0 +1,60 @@ + + + .FUNCT DEMON,RTN,TICK,CINT + CALL INT,RTN,TRUE-VALUE >CINT + PUT CINT,C-TICK,TICK + RETURN CINT + + + .FUNCT QUEUE,RTN,TICK,CINT + CALL INT,RTN >CINT + PUT CINT,C-TICK,TICK + RETURN CINT + + + .FUNCT INT,RTN,DEMON=0,E,C,INT + ADD C-TABLE,C-TABLELEN >E + ADD C-TABLE,C-INTS >C +?PRG1: EQUAL? C,E \?ELS5 + SUB C-INTS,C-INTLEN >C-INTS + ZERO? DEMON /?ELS7 + SUB C-DEMONS,C-INTLEN >C-DEMONS +?ELS7: ADD C-TABLE,C-INTS >INT + PUT INT,C-RTN,RTN + RETURN INT +?ELS5: GET C,C-RTN + EQUAL? STACK,RTN \?CND3 + RETURN C +?CND3: ADD C,C-INTLEN >C + JUMP ?PRG1 + + + .FUNCT CLOCKER,C,E,TICK,FLG=0 + ZERO? CLOCK-WAIT /?CND1 + SET 'CLOCK-WAIT,FALSE-VALUE + RFALSE +?CND1: ZERO? P-WON /?ELS9 + PUSH C-INTS + JUMP ?CND5 +?ELS9: PUSH C-DEMONS +?CND5: ADD C-TABLE,STACK >C + ADD C-TABLE,C-TABLELEN >E +?PRG13: EQUAL? C,E \?ELS17 + RETURN FLG +?ELS17: GET C,C-ENABLED? + ZERO? STACK /?CND15 + GET C,C-TICK >TICK + ZERO? TICK \?ELS22 + JUMP ?CND15 +?ELS22: SUB TICK,1 + PUT C,C-TICK,STACK + GRTR? TICK,1 /?CND20 + GET C,C-RTN + CALL STACK + ZERO? STACK /?CND20 + SET 'FLG,TRUE-VALUE +?CND20: +?CND15: ADD C,C-INTLEN >C + JUMP ?PRG13 + + .ENDI diff --git a/clock.zil b/clock.zil new file mode 100644 index 0000000..e98e59f --- /dev/null +++ b/clock.zil @@ -0,0 +1,60 @@ + + + +> + + + + + + + + + + + + + +) + > ,C-TICK .TICK> + .CINT> + +) + > ,C-TICK .TICK> + .CINT> + +) E C INT) + #DECL ((RTN) ATOM (DEMON) (E C INT) ) + > + > + + > + >> + > + + ) + (<==? .RTN> )> + >>> + +> + +)) + #DECL ((C E) (TICK) FIX (FLG) ) + > )> + >> + > + ) + (>> + > + ) + (T + > + > + >> + )>)>)> + >>> diff --git a/demons.zap b/demons.zap new file mode 100644 index 0000000..a8dc291 --- /dev/null +++ b/demons.zap @@ -0,0 +1,58 @@ + + + .FUNCT I-SWORD,DEM,NG=0,P,T,L + CALL INT,I-SWORD >DEM + IN? SWORD,ADVENTURER \?ELS5 + EQUAL? HERE,CLIFF \?ELS8 + ZERO? MAN-GONE \?ELS8 + SET 'NG,1 + JUMP ?CND6 +?ELS8: EQUAL? HERE,CLIFF-LEDGE \?ELS12 + ZERO? MAN-FLAG /?ELS12 + SET 'NG,1 + JUMP ?CND6 +?ELS12: CALL INFESTED?,HERE + ZERO? STACK /?ELS16 + SET 'NG,2 + JUMP ?CND6 +?ELS16: SET 'P,0 +?PRG19: NEXTP HERE,P >P + ZERO? P \?ELS23 + JUMP ?CND6 +?ELS23: LESS? P,LOW-DIRECTION /?PRG19 + GETPT HERE,P >T + PTSIZE T >L + EQUAL? L,UEXIT,CEXIT,DEXIT \?PRG19 + GETB T,0 + CALL INFESTED?,STACK + ZERO? STACK /?PRG19 + SET 'NG,1 +?CND6: EQUAL? NG,SWORD-STATE /FALSE + EQUAL? NG,2 \?ELS36 + PRINTI "Your sword has begun to glow very brightly." + CRLF + JUMP ?CND32 +?ELS36: EQUAL? NG,1 \?ELS40 + PRINTI "Your sword is glowing with a faint blue glow." + CRLF + JUMP ?CND32 +?ELS40: ZERO? NG \?CND32 + PRINTI "Your sword is no longer glowing." + CRLF +?CND32: SET 'SWORD-STATE,NG + RTRUE +?ELS5: PUT DEM,0,0 + RFALSE + + + .FUNCT INFESTED?,R,F + FIRST? R >F /?KLU12 +?KLU12: +?PRG1: ZERO? F /FALSE + FSET? F,VILLAIN \?ELS7 + FSET? F,INVISIBLE /?ELS7 + RETURN F +?ELS7: NEXT? F >F /?PRG1 + RFALSE + + .ENDI diff --git a/demons.zil b/demons.zil new file mode 100644 index 0000000..1d36545 --- /dev/null +++ b/demons.zil @@ -0,0 +1,41 @@ + + +"SWORD demon" + +) (NG 0) P T L) + + > ) + ( ,MAN-FLAG> ) + ( ) + (ELSE + + >> + ) + (> + > + > + + > + + )>)>)>>)> + ) + (<==? .NG 2> + ) + (<1? .NG> + ) + (<0? .NG> + )> + + ) + (ELSE )>> + + + +)) + >) + ( >> + ) + (>> >)>>> diff --git a/dungeon.zap b/dungeon.zap new file mode 100644 index 0000000..a92e0b4 --- /dev/null +++ b/dungeon.zap @@ -0,0 +1,2 @@ + + .ENDI diff --git a/dungeon.zil b/dungeon.zil new file mode 100644 index 0000000..91c6644 --- /dev/null +++ b/dungeon.zil @@ -0,0 +1,999 @@ +"DUNGEON3 for + ZORK III: The Dungeon Master + The Great Underground Empire (Part 3) + (c) Copyright 1982 Infocom, Inc. All Rights Reserved. +" + + + +"SUBTITLE GLOBAL OBJECTS" + + + + + + + + +;"Yes, this synonym for LOCAL-GLOBALS needs to exist... sigh" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +"CHINESE PUZZLE ROOMS/OBJECTS" + + + + + + + +;"SUBTITLE CHINESE PUZZLE OBJECTS" + + + + + + + + + +> + + + + + + + + + + + +;"Objects/rooms for old end-game" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gmain.cmp b/gmain.cmp new file mode 100644 index 0000000..1536a05 --- /dev/null +++ b/gmain.cmp @@ -0,0 +1,380 @@ + +;COMPARISON OF SS:GMAIN.ZIL.28 AND SS:MAIN.ZIL.31 +;OPTIONS ARE /S /9 + +**** FILE SS:GMAIN.ZIL.28, 1-1 (0) + "Generic MAIN file for + The ZORK Trilogy + started on 7/28/83 by MARC" +> +> + + + + +> + +> + + + + + + + + + + +> +;"GO now lives in SPECIAL.ZIL" +MAIN.ZIL.31, 1-1 (0) +"MAIN3 for + Zork III: The Dungeon Master + Copyright 1982 Infocom, Inc. All Rights Reserved. +" +> +> + + + + +> + + + +> + + + + + + + + +;"clean up junk compiler can't do" + + 1> + 1> ,LORE-BOOK> + 1> + 1> ,CP-SLOT> + ;"set up and go" + + + + + + >>> + > + + > + > + + + + )> + + + + + > + (OBJ) + (OBJ1) OBJECT (TBL) TABLE (PTBL) ) +*************** + +**** FILE SS:GMAIN.ZIL.28, 2-31 (1342) + + >)>) + (T + + > + )> + > + > .NUM> + + + > + )> + + > + )> + + > + ) + (T )> + ) + ( + )> + ) + (T + >) + (T >)> + > + > + + + 0> + ,W?ALL>> + > + + > + ) + ( + ,PRSI + + 0> + ,W?ALL> + >> + ) + ( + + + ,WINNER + .V>> + + ,SURFACEBIT>>> + + >>>> + ) + (T + + ) + (T )> + )>)> + + > + )>)>>)> + > + ; ,PRSO> + >)> + ,P?ACTION> ,M-END>>)> + T) + (T + + + )> + >)>) + (T + >)> + T) + (T >)>)>>> + +> + +> + +> +> + +% +') (I <>) "AUX" V OA OO OI) + + % ') + (T ' 1>>>)> + >> + )> + )> + )> +**** FILE SS:MAIN.ZIL.31, 2-33 (2759) + + > + >) + (T + >)> + + >)>) + (T + > .NUM> ) + (T + >) + (T >)> + + + )> + > + > + > + )>)>>)> + T) + (T + + + )> + > + >)>) + (T + >)> + T) + (T >)>)>>> + +> + +> + +> +) (I <>) "AUX" V OA OO OI) + #DECL ((A) FIX (O) (I) (V) ANY) +*************** + +**** FILE SS:GMAIN.ZIL.28, 3-25 (4793) + > >> + + )> + + + >> .V) + (T + + + >> .V) + ( ,P?ACTION> ,M-BEG>> .V) + (>> .V) + (>>> .V) + (> + + ,P?CONTFCN>>>> + .V) + (> + >>> + .V) + (>> .V)>)> + + + + .V>) + (T + +'> +) (I <>) "AUX" V OA OO OI) + #DECL ((A) FIX (O) (I) (V) ANY) + + )> + )> + )> + + + >> + + )> + + + >> .V) + (T + + + >> .V) + ( ,P?ACTION> + ,M-BEG>> .V) + (>> .V) + (>>> .V) + (> + + ,P?CONTFCN> + + ,P?CONTFCN>>>> + .V) + (> + >>> + .V) + ( + >> .V)>)> + + + + .V> + <>) + (T + + " CR>) + (T ">)>)> + + ) + (T )>> + + + ) + ( + ) + (T )>)> + .RES)>> +)) + )> + > +>)> +**** FILE SS:MAIN.ZIL.31, 3-15 (4360) + >> + + )> + + >> .V) + ( ,P?ACTION> ,M-BEG>> .V) + (>> .V) + (>>> .V) + (> + >>> + .V) + (>> .V)> + > + ,PRSO> + >)> + ,P?ACTION> ,M-END>>)> + + + + .V> + +*************** diff --git a/macros.zap b/macros.zap new file mode 100644 index 0000000..548fceb --- /dev/null +++ b/macros.zap @@ -0,0 +1,19 @@ + + + .FUNCT ZPROB,BASE + ZERO? LUCKY /?ELS5 + RANDOM 100 + GRTR? BASE,STACK /TRUE + RFALSE +?ELS5: RANDOM 300 + GRTR? BASE,STACK /TRUE + RFALSE + + + .FUNCT PICK-ONE,FROB + GET FROB,0 + RANDOM STACK + GET FROB,STACK + RSTACK + + .ENDI diff --git a/macros.zil b/macros.zil new file mode 100644 index 0000000..5028d33 --- /dev/null +++ b/macros.zil @@ -0,0 +1,94 @@ + + + + + + + ) + (> + >)> + + > + "CRLF"> + <=? .P "CR">> + >) + ( + ) + (ELSE + > + > + > + "DESC"> + <=? .P "D"> + <=? .P "OBJ"> + <=? .P "O">> + >) + ( + <=? .P "N">> + >) + ( + <=? .P "CHR"> + <=? .P "C">> + >) + (ELSE + >>)>)>) + ( + >) + ( + >) + (ELSE )>>>>> + + + ) + (ELSE )>>)> + )> + > + >>> + !.L)> + > + 3> )>> + !.O)> + >> + + >> + + ) + (ELSE >)>> + +>) + (ELSE >)>> + +>>> + +> + +> + + + >> + + + >> + + ) + (T .NUM)>> + + diff --git a/main.zap b/main.zap new file mode 100644 index 0000000..afb8691 --- /dev/null +++ b/main.zap @@ -0,0 +1,204 @@ + + + .FUNCT GO +START:: + +?FCN: CALL QUEUE,I-LANTERN,200 + SET 'CURRENT-LAMP,LAMP + MUL 8,21 + PUT CPOBJS,STACK,1 + MUL 8,21 + ADD STACK,1 + PUT CPOBJS,STACK,LORE-BOOK + MUL 8,32 + PUT CPOBJS,STACK,1 + MUL 8,32 + ADD STACK,1 + PUT CPOBJS,STACK,CP-SLOT + SET 'LIT,TRUE-VALUE + SET 'WINNER,ADVENTURER + SET 'PLAYER,WINNER + SET 'MLOC,MRB + SET 'HERE,ZORK2-STAIR + RANDOM 70 + ADD 70,STACK + CALL QUEUE,I-CLEFT,STACK + PUT STACK,0,1 + CALL QUEUE,I-VIEW-CHANGE,4 + PUT STACK,0,1 + SET 'P-IT-LOC,HERE + SET 'P-IT-OBJECT,FALSE-VALUE + FSET? HERE,TOUCHBIT /?CND1 + PRINTI "As in a dream, you see yourself tumbling down a great, dark staircase. All about you are shadowy images of struggles against fierce opponents and diabolical traps. These give way to another round of images: of imposing stone figures, a cool, clear lake, and, now, of an old, yet oddly youthful man. He turns toward you slowly, his long, silver hair dancing about him in a fresh breeze. ""You have reached the final test, my friend! You are proved clever and powerful, but this is not yet enough! Seek me when you feel yourself worthy!"" The dream dissolves around you as his last words echo through the void...." + CRLF + CRLF + CALL V-VERSION + CRLF +?CND1: MOVE WINNER,HERE + MOVE LAMP,HERE + CALL V-LOOK + CALL MAIN-LOOP + JUMP ?FCN + + + .FUNCT MAIN-LOOP,ICNT,OCNT,NUM,CNT,OBJ,TBL,V,PTBL,OBJ1,TMP,?TMP1 +?PRG1: SET 'CNT,0 + SET 'OBJ,FALSE-VALUE + SET 'PTBL,TRUE-VALUE + CALL PARSER >P-WON + ZERO? P-WON /?ELS5 + GET P-PRSI,P-MATCHLEN >ICNT + GET P-PRSO,P-MATCHLEN >OCNT + ZERO? OCNT \?ELS10 + PUSH OCNT + JUMP ?CND6 +?ELS10: GRTR? OCNT,1 \?ELS12 + SET 'TBL,P-PRSO + ZERO? ICNT \?ELS15 + SET 'OBJ,FALSE-VALUE + JUMP ?CND13 +?ELS15: GET P-PRSI,1 >OBJ +?CND13: PUSH OCNT + JUMP ?CND6 +?ELS12: GRTR? ICNT,1 \?ELS19 + SET 'PTBL,FALSE-VALUE + SET 'TBL,P-PRSI + GET P-PRSO,1 >OBJ + PUSH ICNT + JUMP ?CND6 +?ELS19: PUSH 1 +?CND6: SET 'NUM,STACK + ZERO? OBJ \?CND22 + EQUAL? ICNT,1 \?CND22 + GET P-PRSI,1 >OBJ +?CND22: EQUAL? PRSA,V?WALK \?ELS29 + CALL PERFORM,PRSA,PRSO >V + JUMP ?CND27 +?ELS29: ZERO? NUM \?ELS31 + GETB P-SYNTAX,P-SBITS + BAND STACK,P-SONUMS + ZERO? STACK \?ELS34 + CALL PERFORM,PRSA >V + SET 'PRSO,FALSE-VALUE + JUMP ?CND27 +?ELS34: ZERO? LIT \?ELS36 + PRINTI "It's too dark to see." + CRLF + JUMP ?CND27 +?ELS36: PRINTI "There isn't anything to " + GET P-ITBL,P-VERBN >TMP + ZERO? P-OFLAG /?ELS45 + GET TMP,0 + PRINTB STACK + JUMP ?CND43 +?ELS45: GETB TMP,2 >?TMP1 + GETB TMP,3 + CALL WORD-PRINT,?TMP1,STACK +?CND43: PRINTI "!" + CRLF + SET 'V,FALSE-VALUE + JUMP ?CND27 +?ELS31: +?PRG53: IGRTR? 'CNT,NUM \?ELS57 + JUMP ?CND27 +?ELS57: ZERO? PTBL /?ELS62 + GET P-PRSO,CNT >OBJ1 + JUMP ?CND60 +?ELS62: GET P-PRSI,CNT >OBJ1 +?CND60: GRTR? NUM,1 \?CND66 + PRINTD OBJ1 + PRINTI ": " +?CND66: ZERO? PTBL /?ELS75 + PUSH OBJ1 + JUMP ?CND71 +?ELS75: PUSH OBJ +?CND71: SET 'PRSO,STACK + ZERO? PTBL /?ELS83 + PUSH OBJ + JUMP ?CND79 +?ELS83: PUSH OBJ1 +?CND79: SET 'PRSI,STACK + CALL PERFORM,PRSA,PRSO,PRSI >V + EQUAL? V,M-FATAL \?PRG53 +?CND27: EQUAL? PRSA,V?WAIT /?CND90 + EQUAL? PRSA,V?VERSION,V?SCORE,V?RESTORE /?CND90 + EQUAL? PRSA,V?SAVE,V?WALK,V?AGAIN \?ELS92 + JUMP ?CND90 +?ELS92: SET 'L-PRSA,PRSA + SET 'L-PRSO,PRSO + SET 'L-PRSI,PRSI +?CND90: EQUAL? V,M-FATAL \?CND3 + SET 'P-CONT,FALSE-VALUE + JUMP ?CND3 +?ELS5: SET 'P-CONT,FALSE-VALUE +?CND3: ZERO? P-WON /?PRG1 + EQUAL? PRSA,V?RESTORE,V?UNSCRIPT,V?SCRIPT /?PRG1 + EQUAL? PRSA,V?SCORE,V?RESTART,V?QUIT /?PRG1 + EQUAL? PRSA,V?VERSION,V?SAVE,V?VERBOSE /?PRG1 + EQUAL? PRSA,V?SUPER-BRIEF,V?BRIEF,V?TELL \?ELS108 + JUMP ?PRG1 +?ELS108: INC 'MOVES + CALL CLOCKER >V + JUMP ?PRG1 + + + .FUNCT PERFORM,A,O=0,I=0,V,OA,OO,OI + SET 'OA,PRSA + SET 'OO,PRSO + SET 'OI,PRSI + EQUAL? IT,I,O \?CND1 + EQUAL? P-IT-LOC,HERE /?CND1 + PRINTI "I don't see what you are referring to." + CRLF + RETURN 2 +?CND1: EQUAL? O,IT \?CND10 + SET 'O,P-IT-OBJECT +?CND10: EQUAL? I,IT \?CND13 + SET 'I,P-IT-OBJECT +?CND13: SET 'PRSA,A + SET 'PRSO,O + ZERO? PRSO /?CND16 + EQUAL? PRSA,V?WALK /?CND16 + SET 'P-IT-OBJECT,PRSO + SET 'P-IT-LOC,HERE +?CND16: SET 'PRSI,I + GETP WINNER,P?ACTION + CALL STACK >V + ZERO? V /?ELS23 + JUMP ?CND21 +?ELS23: LOC WINNER + GETP STACK,P?ACTION + CALL STACK,M-BEG >V + ZERO? V /?ELS25 + JUMP ?CND21 +?ELS25: GET PREACTIONS,A + CALL STACK >V + ZERO? V /?ELS27 + JUMP ?CND21 +?ELS27: ZERO? I /?ELS29 + GETP I,P?ACTION + CALL STACK >V + ZERO? V /?ELS29 + JUMP ?CND21 +?ELS29: ZERO? O /?ELS33 + EQUAL? A,V?WALK /?ELS33 + GETP O,P?ACTION + CALL STACK >V + ZERO? V /?ELS33 + JUMP ?CND21 +?ELS33: GET ACTIONS,A + CALL STACK >V + ZERO? V /?CND21 +?CND21: EQUAL? V,M-FATAL /?CND38 + LOC WINNER + EQUAL? STACK,PRSO \?CND41 + SET 'PRSO,FALSE-VALUE +?CND41: LOC WINNER + GETP STACK,P?ACTION + CALL STACK,M-END >V +?CND38: SET 'PRSA,OA + SET 'PRSO,OO + SET 'PRSI,OI + RETURN V + + .ENDI diff --git a/main.zil b/main.zil new file mode 100644 index 0000000..f548ddb --- /dev/null +++ b/main.zil @@ -0,0 +1,175 @@ +"MAIN3 for + Zork III: The Dungeon Master + Copyright 1982 Infocom, Inc. All Rights Reserved. +" + +> + +> + + + + + +> + + + +> + + + + + + + + + + +;"clean up junk compiler can't do" + + 1> + 1> ,LORE-BOOK> + 1> + 1> ,CP-SLOT> + ;"set up and go" + + + + + + >>> + > + + > + > + + + + )> + + + + + > + + + (OBJ) + (OBJ1) OBJECT (TBL) TABLE (PTBL) ) + + > + + > + > + >> .OCNT) + ( + + >) + (T >)> + .OCNT) + ( + > + + > + .ICNT) + (T 1)>> + <1? .ICNT>> >)> + >) + (<0? .NUM> + ,P-SONUMS>> + > + >) + ( + ) + (T + + > + >) + (T + >)> + + >)>) + (T + > .NUM> ) + (T + >) + (T >)> + + + )> + > + > + > + )>)>>)> + T) + (T + + + )> + >)>) + (T + >)> + T) + (T + > + >)>)>>> + +> + +> + +> + +) (I <>) "AUX" V OA OO OI) + #DECL ((A) FIX (O) (I) (V) ANY) + + + + + >> + + )> + )> + )> + + + >> + + )> + + >> .V) + ( ,P?ACTION> ,M-BEG>> .V) + (>> .V) + (>>> .V) + (> + >>> + .V) + (>> .V)> + > + ,PRSO> + >)> + ,P?ACTION> ,M-END>>)> + + + + .V> + diff --git a/parser.zap b/parser.zap new file mode 100644 index 0000000..0c3a746 --- /dev/null +++ b/parser.zap @@ -0,0 +1,1220 @@ + + + .FUNCT PARSER,PTR=P-LEXSTART,WRD,VAL=0,VERB=0,LEN,DIR=0,NW=0,LW=0,NUM,SCNT,CNT=-1 +?PRG1: IGRTR? 'CNT,P-ITBLLEN \?ELS5 + JUMP ?REP2 +?ELS5: PUT P-ITBL,CNT,0 + JUMP ?PRG1 +?REP2: SET 'P-ADVERB,FALSE-VALUE + SET 'P-MERGED,FALSE-VALUE + PUT P-PRSO,P-MATCHLEN,0 + PUT P-PRSI,P-MATCHLEN,0 + PUT P-BUTS,P-MATCHLEN,0 + ZERO? QUOTE-FLAG \?CND8 + EQUAL? WINNER,PLAYER /?CND8 + SET 'WINNER,PLAYER + LOC WINNER + FSET? STACK,VEHBIT /?CND8 + LOC WINNER >HERE +?CND8: ZERO? P-CONT /?ELS18 + SET 'PTR,P-CONT + ZERO? SUPER-BRIEF \?CND20 + EQUAL? PLAYER,WINNER \?CND20 + CRLF +?CND20: SET 'P-CONT,FALSE-VALUE + JUMP ?CND16 +?ELS18: SET 'WINNER,PLAYER + SET 'QUOTE-FLAG,FALSE-VALUE + LOC WINNER + FSET? STACK,VEHBIT /?CND27 + LOC WINNER >HERE +?CND27: ZERO? SUPER-BRIEF \?CND30 + CRLF +?CND30: PRINTI ">" + READ P-INBUF,P-LEXV +?CND16: GETB P-LEXV,P-LEXWORDS >P-LEN + ZERO? P-LEN \?CND35 + PRINTI "I beg your pardon?" + CRLF + RFALSE +?CND35: SET 'LEN,P-LEN + SET 'P-DIR,FALSE-VALUE + SET 'P-NCN,0 + SET 'P-GETFLAGS,0 +?PRG40: DLESS? 'P-LEN,0 \?ELS44 + SET 'QUOTE-FLAG,FALSE-VALUE + JUMP ?REP41 +?ELS44: GET P-LEXV,PTR >WRD + ZERO? WRD \?THN47 + CALL NUMBER?,PTR >WRD + ZERO? WRD /?ELS46 +?THN47: EQUAL? WRD,W?TO \?ELS51 + EQUAL? VERB,ACT?TELL \?ELS51 + SET 'WRD,W?QUOTE + JUMP ?CND49 +?ELS51: EQUAL? WRD,W?THEN \?CND49 + ZERO? VERB \?CND49 + PUT P-ITBL,P-VERB,ACT?TELL + PUT P-ITBL,P-VERBN,0 + SET 'WRD,W?QUOTE +?CND49: EQUAL? WRD,W?THEN,W?PERIOD /?THN61 + EQUAL? WRD,W?QUOTE \?ELS60 +?THN61: EQUAL? WRD,W?QUOTE \?CND63 + ZERO? QUOTE-FLAG /?ELS68 + SET 'QUOTE-FLAG,FALSE-VALUE + JUMP ?CND63 +?ELS68: SET 'QUOTE-FLAG,TRUE-VALUE +?CND63: ZERO? P-LEN /?THN72 + ADD PTR,P-LEXELEN >P-CONT +?THN72: PUTB P-LEXV,P-LEXWORDS,P-LEN + JUMP ?REP41 +?ELS60: CALL WT?,WRD,PS?DIRECTION,P1?DIRECTION >VAL + ZERO? VAL /?ELS75 + EQUAL? VERB,FALSE-VALUE,ACT?WALK \?ELS75 + EQUAL? LEN,1 /?THN78 + EQUAL? LEN,2 \?ELS81 + EQUAL? VERB,ACT?WALK /?THN78 +?ELS81: ADD PTR,P-LEXELEN + GET P-LEXV,STACK >NW + EQUAL? NW,W?THEN,W?PERIOD,W?QUOTE \?ELS83 + LESS? LEN,2 \?THN78 +?ELS83: ZERO? QUOTE-FLAG /?ELS85 + EQUAL? LEN,2 \?ELS85 + EQUAL? NW,W?QUOTE /?THN78 +?ELS85: GRTR? LEN,2 \?ELS75 + EQUAL? NW,W?COMMA,W?AND \?ELS75 +?THN78: SET 'DIR,VAL + EQUAL? NW,W?COMMA,W?AND \?CND88 + ADD PTR,P-LEXELEN + PUT P-LEXV,STACK,W?THEN +?CND88: GRTR? LEN,2 /?CND42 + SET 'QUOTE-FLAG,FALSE-VALUE + JUMP ?REP41 +?ELS75: CALL WT?,WRD,PS?VERB,P1?VERB >VAL + ZERO? VAL /?ELS95 + ZERO? VERB \?ELS95 + SET 'VERB,VAL + PUT P-ITBL,P-VERB,VAL + PUT P-ITBL,P-VERBN,P-VTBL + PUT P-VTBL,0,WRD + MUL PTR,2 + ADD STACK,2 >NUM + GETB P-LEXV,NUM + PUTB P-VTBL,2,STACK + ADD NUM,1 + GETB P-LEXV,STACK + PUTB P-VTBL,3,STACK + JUMP ?CND42 +?ELS95: CALL WT?,WRD,PS?PREPOSITION,0 >VAL + ZERO? VAL \?THN100 + EQUAL? WRD,W?ALL,W?ONE,W?A /?THN104 + CALL WT?,WRD,PS?ADJECTIVE + ZERO? STACK \?THN104 + CALL WT?,WRD,PS?OBJECT + ZERO? STACK /?ELS99 +?THN104: SET 'VAL,0 +?THN100: GRTR? P-LEN,0 \?ELS108 + ADD PTR,P-LEXELEN + GET P-LEXV,STACK + EQUAL? STACK,W?OF \?ELS108 + ZERO? VAL \?ELS108 + EQUAL? WRD,W?ALL,W?ONE,W?A /?ELS108 + JUMP ?CND42 +?ELS108: ZERO? VAL /?ELS112 + ZERO? P-LEN /?THN115 + ADD PTR,2 + GET P-LEXV,STACK + EQUAL? STACK,W?THEN,W?PERIOD \?ELS112 +?THN115: LESS? P-NCN,2 \?CND42 + PUT P-ITBL,P-PREP1,VAL + PUT P-ITBL,P-PREP1N,WRD + JUMP ?CND42 +?ELS112: EQUAL? P-NCN,2 \?ELS121 + PRINTI "There were too many nouns in that sentence." + CRLF + RFALSE +?ELS121: INC 'P-NCN + CALL CLAUSE,PTR,VAL,WRD >PTR + ZERO? PTR /FALSE + LESS? PTR,0 \?CND42 + SET 'QUOTE-FLAG,FALSE-VALUE + JUMP ?REP41 +?ELS99: CALL WT?,WRD,PS?BUZZ-WORD + ZERO? STACK /?ELS132 + JUMP ?CND42 +?ELS132: CALL CANT-USE,PTR + RFALSE +?ELS46: CALL UNKNOWN-WORD,PTR + RFALSE +?CND42: SET 'LW,WRD + ADD PTR,P-LEXELEN >PTR + JUMP ?PRG40 +?REP41: ZERO? DIR /?CND137 + SET 'PRSA,V?WALK + SET 'PRSO,DIR + SET 'P-WALK-DIR,DIR + RETURN TRUE-VALUE +?CND137: SET 'P-WALK-DIR,FALSE-VALUE + ZERO? P-OFLAG /?CND141 + CALL ORPHAN-MERGE +?CND141: CALL SYNTAX-CHECK + ZERO? STACK /FALSE + CALL SNARF-OBJECTS + ZERO? STACK /FALSE + CALL TAKE-CHECK + ZERO? STACK /FALSE + CALL MANY-CHECK + ZERO? STACK /FALSE + RTRUE + + + .FUNCT WT?,PTR,BIT,B1=5,OFFS=P-P1OFF,TYP + GETB PTR,P-PSOFF >TYP + BTST TYP,BIT \FALSE + GRTR? B1,4 /TRUE + BAND TYP,P-P1BITS >TYP + EQUAL? TYP,B1 /?CND13 + INC 'OFFS +?CND13: GETB PTR,OFFS + RSTACK + + + .FUNCT CLAUSE,PTR,VAL,WRD,OFF,NUM,ANDFLG=0,FIRST??=1,NW,LW=0,?TMP1 + SUB P-NCN,1 + MUL STACK,2 >OFF + ZERO? VAL /?ELS3 + ADD P-PREP1,OFF >NUM + PUT P-ITBL,NUM,VAL + ADD NUM,1 + PUT P-ITBL,STACK,WRD + ADD PTR,P-LEXELEN >PTR + JUMP ?CND1 +?ELS3: INC 'P-LEN +?CND1: ZERO? P-LEN \?CND6 + DEC 'P-NCN + RETURN -1 +?CND6: ADD P-NC1,OFF >NUM + MUL PTR,2 + ADD P-LEXV,STACK + PUT P-ITBL,NUM,STACK + GET P-LEXV,PTR + EQUAL? STACK,W?THE,W?A,W?AN \?CND9 + GET P-ITBL,NUM + ADD STACK,4 + PUT P-ITBL,NUM,STACK +?CND9: +?PRG12: DLESS? 'P-LEN,0 \?CND14 + ADD NUM,1 >?TMP1 + MUL PTR,2 + ADD P-LEXV,STACK + PUT P-ITBL,?TMP1,STACK + RETURN -1 +?CND14: GET P-LEXV,PTR >WRD + ZERO? WRD \?THN20 + CALL NUMBER?,PTR >WRD + ZERO? WRD /?ELS19 +?THN20: ZERO? P-LEN \?ELS24 + SET 'NW,0 + JUMP ?CND22 +?ELS24: ADD PTR,P-LEXELEN + GET P-LEXV,STACK >NW +?CND22: EQUAL? WRD,W?AND,W?COMMA \?ELS29 + SET 'ANDFLG,TRUE-VALUE + JUMP ?CND17 +?ELS29: EQUAL? WRD,W?ALL,W?ONE \?ELS31 + EQUAL? NW,W?OF \?CND17 + DEC 'P-LEN + ADD PTR,P-LEXELEN >PTR + JUMP ?CND17 +?ELS31: EQUAL? WRD,W?THEN,W?PERIOD /?THN37 + CALL WT?,WRD,PS?PREPOSITION + ZERO? STACK /?ELS36 + ZERO? FIRST?? \?ELS36 +?THN37: INC 'P-LEN + ADD NUM,1 >?TMP1 + MUL PTR,2 + ADD P-LEXV,STACK + PUT P-ITBL,?TMP1,STACK + SUB PTR,P-LEXELEN + RETURN STACK +?ELS36: CALL WT?,WRD,PS?OBJECT + ZERO? STACK /?ELS42 + CALL WT?,WRD,PS?ADJECTIVE,P1?ADJECTIVE + ZERO? STACK /?ELS45 + ZERO? NW /?ELS45 + CALL WT?,NW,PS?OBJECT + ZERO? STACK /?ELS45 + JUMP ?CND17 +?ELS45: ZERO? ANDFLG \?ELS49 + EQUAL? NW,W?BUT,W?EXCEPT /?ELS49 + EQUAL? NW,W?AND,W?COMMA /?ELS49 + ADD NUM,1 >?TMP1 + ADD PTR,2 + MUL STACK,2 + ADD P-LEXV,STACK + PUT P-ITBL,?TMP1,STACK + RETURN PTR +?ELS49: SET 'ANDFLG,FALSE-VALUE + JUMP ?CND17 +?ELS42: CALL WT?,WRD,PS?ADJECTIVE + ZERO? STACK \?CND17 + CALL WT?,WRD,PS?BUZZ-WORD + ZERO? STACK /?ELS55 + JUMP ?CND17 +?ELS55: ZERO? ANDFLG /?ELS59 + CALL WT?,WRD,PS?DIRECTION + ZERO? STACK \?THN62 + CALL WT?,WRD,PS?VERB + ZERO? STACK /?ELS59 +?THN62: SUB PTR,4 >PTR + ADD PTR,2 + PUT P-LEXV,STACK,W?THEN + ADD P-LEN,2 >P-LEN + JUMP ?CND17 +?ELS59: CALL WT?,WRD,PS?PREPOSITION + ZERO? STACK /?ELS65 + JUMP ?CND17 +?ELS65: CALL CANT-USE,PTR + RFALSE +?ELS19: CALL UNKNOWN-WORD,PTR + RFALSE +?CND17: SET 'LW,WRD + SET 'FIRST??,FALSE-VALUE + ADD PTR,P-LEXELEN >PTR + JUMP ?PRG12 + + + .FUNCT NUMBER?,PTR,CNT,BPTR,CHR,SUM=0,TIM=0,?TMP1 + MUL PTR,2 + ADD P-LEXV,STACK + GETB STACK,2 >CNT + MUL PTR,2 + ADD P-LEXV,STACK + GETB STACK,3 >BPTR +?PRG1: DLESS? 'CNT,0 \?ELS5 + JUMP ?REP2 +?ELS5: GETB P-INBUF,BPTR >CHR + EQUAL? CHR,58 \?ELS10 + SET 'TIM,SUM + SET 'SUM,0 + JUMP ?CND8 +?ELS10: GRTR? SUM,10000 /FALSE + LESS? CHR,58 \FALSE + GRTR? CHR,47 \FALSE + MUL SUM,10 >?TMP1 + SUB CHR,48 + ADD ?TMP1,STACK >SUM +?CND8: INC 'BPTR + JUMP ?PRG1 +?REP2: PUT P-LEXV,PTR,W?INTNUM + GRTR? SUM,1000 /FALSE + ZERO? TIM /?CND19 + LESS? TIM,8 \?ELS27 + ADD TIM,12 >TIM + JUMP ?CND25 +?ELS27: GRTR? TIM,23 /FALSE +?CND25: MUL TIM,60 + ADD SUM,STACK >SUM +?CND19: SET 'P-NUMBER,SUM + RETURN W?INTNUM + + + .FUNCT ORPHAN-MERGE,CNT=-1,TEMP,VERB,BEG,END,ADJ=0,WRD,?TMP1 + SET 'P-OFLAG,FALSE-VALUE + GET P-ITBL,P-VERB >VERB + ZERO? VERB /?ELS3 + GET P-OTBL,P-VERB + EQUAL? VERB,STACK \FALSE +?ELS3: EQUAL? P-NCN,2 /FALSE + GET P-OTBL,P-NC1 + EQUAL? STACK,1 \?ELS9 + GET P-ITBL,P-PREP1 >TEMP + GET P-OTBL,P-PREP1 + EQUAL? TEMP,STACK /?THN13 + ZERO? TEMP \FALSE +?THN13: GET P-ITBL,P-NC1 + PUT P-OTBL,P-NC1,STACK + GET P-ITBL,P-NC1L + PUT P-OTBL,P-NC1L,STACK + JUMP ?CND1 +?ELS9: GET P-OTBL,P-NC2 + EQUAL? STACK,1 \?ELS18 + GET P-ITBL,P-PREP1 >TEMP + GET P-OTBL,P-PREP2 + EQUAL? TEMP,STACK /?THN22 + ZERO? TEMP \FALSE +?THN22: GET P-ITBL,P-NC1 + PUT P-OTBL,P-NC2,STACK + GET P-ITBL,P-NC1L + PUT P-OTBL,P-NC2L,STACK + SET 'P-NCN,2 + JUMP ?CND1 +?ELS18: ZERO? P-ACLAUSE /?CND1 + EQUAL? P-NCN,1 /?ELS31 + SET 'P-ACLAUSE,FALSE-VALUE + RFALSE +?ELS31: GET P-ITBL,P-NC1 >BEG + GET P-ITBL,P-NC1L >END +?PRG34: EQUAL? BEG,END \?ELS38 + ZERO? ADJ /?ELS41 + CALL ACLAUSE-WIN,ADJ + JUMP ?CND29 +?ELS41: SET 'P-ACLAUSE,FALSE-VALUE + RFALSE +?ELS38: ZERO? ADJ \?ELS46 + GET BEG,0 >WRD + GETB WRD,P-PSOFF + BTST STACK,PS?ADJECTIVE \?ELS46 + SET 'ADJ,WRD + JUMP ?CND36 +?ELS46: GETB WRD,P-PSOFF + BTST STACK,PS?OBJECT /?THN51 + EQUAL? WRD,W?ONE \?CND36 +?THN51: EQUAL? WRD,P-ANAM,W?ONE \FALSE + CALL ACLAUSE-WIN,ADJ + JUMP ?CND29 +?CND36: ADD BEG,P-WORDLEN >BEG + JUMP ?PRG34 +?CND29: +?CND1: +?PRG58: IGRTR? 'CNT,P-ITBLLEN \?ELS62 + SET 'P-MERGED,TRUE-VALUE + RTRUE +?ELS62: GET P-OTBL,CNT + PUT P-ITBL,CNT,STACK + JUMP ?PRG58 + + + .FUNCT ACLAUSE-WIN,ADJ + SET 'P-CCSRC,P-OTBL + ADD P-ACLAUSE,1 + CALL CLAUSE-COPY,P-ACLAUSE,STACK,ADJ + GET P-OTBL,P-NC2 + ZERO? STACK /?ELS2 + SET 'P-NCN,2 +?ELS2: SET 'P-ACLAUSE,FALSE-VALUE + RTRUE + + + .FUNCT WORD-PRINT,CNT,BUF +?PRG1: DLESS? 'CNT,0 /TRUE + GETB P-INBUF,BUF + PRINTC STACK + INC 'BUF + JUMP ?PRG1 + + + .FUNCT UNKNOWN-WORD,PTR,BUF,?TMP1 + EQUAL? PRSA,V?SAY \?CND1 + PRINTI "Nothing happens." + CRLF + RFALSE +?CND1: PRINTI "I don't know the word """ + MUL PTR,2 >BUF + ADD P-LEXV,BUF + GETB STACK,2 >?TMP1 + ADD P-LEXV,BUF + GETB STACK,3 + CALL WORD-PRINT,?TMP1,STACK + PRINTI """." + CRLF + SET 'QUOTE-FLAG,FALSE-VALUE + SET 'P-OFLAG,FALSE-VALUE + RETURN P-OFLAG + + + .FUNCT CANT-USE,PTR,BUF,?TMP1 + EQUAL? PRSA,V?SAY \?CND1 + PRINTI "Nothing happens." + CRLF + RFALSE +?CND1: PRINTI "You used the word """ + MUL PTR,2 >BUF + ADD P-LEXV,BUF + GETB STACK,2 >?TMP1 + ADD P-LEXV,BUF + GETB STACK,3 + CALL WORD-PRINT,?TMP1,STACK + PRINTI """ in a way that I don't understand." + CRLF + SET 'QUOTE-FLAG,FALSE-VALUE + SET 'P-OFLAG,FALSE-VALUE + RETURN P-OFLAG + + + .FUNCT SYNTAX-CHECK,SYN,LEN,NUM,OBJ,DRIVE1=0,DRIVE2=0,PREP,VERB,TMP,?TMP2,?TMP1 + GET P-ITBL,P-VERB >VERB + ZERO? VERB \?CND1 + PRINTI "There was no verb in that sentence!" + CRLF + RFALSE +?CND1: SUB 255,VERB + GET VERBS,STACK >SYN + GETB SYN,0 >LEN + ADD 1,SYN >SYN +?PRG6: GETB SYN,P-SBITS + BAND STACK,P-SONUMS >NUM + LESS? NUM,1 /?ELS10 + ZERO? P-NCN \?ELS10 + GET P-ITBL,P-PREP1 >PREP + ZERO? PREP /?THN13 + GETB SYN,P-SPREP1 + EQUAL? PREP,STACK \?ELS10 +?THN13: SET 'DRIVE1,SYN + JUMP ?CND8 +?ELS10: GETB SYN,P-SPREP1 >?TMP1 + GET P-ITBL,P-PREP1 + EQUAL? ?TMP1,STACK \?CND8 + EQUAL? NUM,2 \?ELS19 + EQUAL? P-NCN,1 \?ELS19 + SET 'DRIVE2,SYN + JUMP ?CND8 +?ELS19: GETB SYN,P-SPREP2 >?TMP1 + GET P-ITBL,P-PREP2 + EQUAL? ?TMP1,STACK \?CND8 + CALL SYNTAX-FOUND,SYN + RTRUE +?CND8: DLESS? 'LEN,1 \?ELS26 + ZERO? DRIVE1 \?REP7 + ZERO? DRIVE2 /?ELS29 + JUMP ?REP7 +?ELS29: PRINTI "That sentence isn't one I recognize." + CRLF + RFALSE +?ELS26: ADD SYN,P-SYNLEN >SYN + JUMP ?PRG6 +?REP7: ZERO? DRIVE1 /?ELS42 + GETB DRIVE1,P-SFWIM1 >?TMP2 + GETB DRIVE1,P-SLOC1 >?TMP1 + GETB DRIVE1,P-SPREP1 + CALL GWIM,?TMP2,?TMP1,STACK >OBJ + ZERO? OBJ /?ELS42 + PUT P-PRSO,P-MATCHLEN,1 + PUT P-PRSO,1,OBJ + CALL SYNTAX-FOUND,DRIVE1 + RSTACK +?ELS42: ZERO? DRIVE2 /?ELS46 + GETB DRIVE2,P-SFWIM2 >?TMP2 + GETB DRIVE2,P-SLOC2 >?TMP1 + GETB DRIVE2,P-SPREP2 + CALL GWIM,?TMP2,?TMP1,STACK >OBJ + ZERO? OBJ /?ELS46 + PUT P-PRSI,P-MATCHLEN,1 + PUT P-PRSI,1,OBJ + CALL SYNTAX-FOUND,DRIVE2 + RSTACK +?ELS46: EQUAL? VERB,ACT?FIND \?ELS50 + PRINTI "That question can't be answered." + CRLF + RFALSE +?ELS50: CALL ORPHAN,DRIVE1,DRIVE2 + PRINTI "What do you want to " + GET P-OTBL,P-VERBN >TMP + ZERO? TMP \?ELS59 + PRINTI "tell" + JUMP ?CND57 +?ELS59: GETB P-VTBL,2 + ZERO? STACK \?ELS63 + GET TMP,0 + PRINTB STACK + JUMP ?CND57 +?ELS63: GETB TMP,2 >?TMP1 + GETB TMP,3 + CALL WORD-PRINT,?TMP1,STACK + PUTB P-VTBL,2,0 +?CND57: ZERO? DRIVE2 /?CND66 + CALL CLAUSE-PRINT,P-NC1,P-NC1L +?CND66: SET 'P-OFLAG,TRUE-VALUE + ZERO? DRIVE1 /?ELS74 + GETB DRIVE1,P-SPREP1 + JUMP ?CND70 +?ELS74: GETB DRIVE2,P-SPREP2 +?CND70: CALL PREP-PRINT,STACK + PRINTI "?" + CRLF + RFALSE + + + .FUNCT ORPHAN,D1,D2,CNT=-1 + PUT P-OCLAUSE,P-MATCHLEN,0 + SET 'P-CCSRC,P-ITBL +?PRG1: IGRTR? 'CNT,P-ITBLLEN \?ELS5 + JUMP ?REP2 +?ELS5: GET P-ITBL,CNT + PUT P-OTBL,CNT,STACK + JUMP ?PRG1 +?REP2: EQUAL? P-NCN,2 \?CND8 + CALL CLAUSE-COPY,P-NC2,P-NC2L +?CND8: LESS? P-NCN,1 /?CND11 + CALL CLAUSE-COPY,P-NC1,P-NC1L +?CND11: ZERO? D1 /?ELS18 + GETB D1,P-SPREP1 + PUT P-OTBL,P-PREP1,STACK + PUT P-OTBL,P-NC1,1 + RTRUE +?ELS18: ZERO? D2 /FALSE + GETB D2,P-SPREP2 + PUT P-OTBL,P-PREP2,STACK + PUT P-OTBL,P-NC2,1 + RTRUE + + + .FUNCT CLAUSE-PRINT,BPTR,EPTR,?TMP1 + GET P-ITBL,BPTR >?TMP1 + GET P-ITBL,EPTR + CALL BUFFER-PRINT,?TMP1,STACK,TRUE-VALUE + RSTACK + + + .FUNCT BUFFER-PRINT,BEG,END,CP,NOSP=0,WRD,FIRST??=1,PN=0,?TMP1 +?PRG1: EQUAL? BEG,END /TRUE + ZERO? NOSP /?ELS10 + SET 'NOSP,FALSE-VALUE + JUMP ?CND8 +?ELS10: PRINTI " " +?CND8: GET BEG,0 >WRD + EQUAL? WRD,W?PERIOD \?ELS18 + SET 'NOSP,TRUE-VALUE + JUMP ?CND3 +?ELS18: ZERO? FIRST?? /?CND21 + ZERO? PN \?CND21 + ZERO? CP /?CND21 + PRINTI "the " +?CND21: ZERO? P-OFLAG /?ELS30 + PRINTB WRD + JUMP ?CND28 +?ELS30: EQUAL? WRD,W?IT \?ELS33 + EQUAL? P-IT-LOC,HERE \?ELS33 + PRINTD P-IT-OBJECT + JUMP ?CND28 +?ELS33: GETB BEG,2 >?TMP1 + GETB BEG,3 + CALL WORD-PRINT,?TMP1,STACK +?CND28: SET 'FIRST??,FALSE-VALUE +?CND3: ADD BEG,P-WORDLEN >BEG + JUMP ?PRG1 + + + .FUNCT CAPITALIZE,PTR,?TMP1 + GETB PTR,3 + GETB P-INBUF,STACK + SUB STACK,32 + PRINTC STACK + GETB PTR,2 + SUB STACK,1 >?TMP1 + GETB PTR,3 + ADD STACK,1 + CALL WORD-PRINT,?TMP1,STACK + RSTACK + + + .FUNCT PREP-PRINT,PREP,WRD + ZERO? PREP /FALSE + PRINTI " " + CALL PREP-FIND,PREP >WRD + PRINTB WRD + RTRUE + + + .FUNCT CLAUSE-COPY,BPTR,EPTR,INSRT=0,BEG,END + GET P-CCSRC,BPTR >BEG + GET P-CCSRC,EPTR >END + GET P-OCLAUSE,P-MATCHLEN + MUL STACK,P-LEXELEN + ADD STACK,2 + ADD P-OCLAUSE,STACK + PUT P-OTBL,BPTR,STACK +?PRG1: EQUAL? BEG,END \?ELS5 + GET P-OCLAUSE,P-MATCHLEN + MUL STACK,P-LEXELEN + ADD STACK,2 + ADD P-OCLAUSE,STACK + PUT P-OTBL,EPTR,STACK + RTRUE +?ELS5: ZERO? INSRT /?CND8 + GET BEG,0 + EQUAL? P-ANAM,STACK \?CND8 + CALL CLAUSE-ADD,INSRT +?CND8: GET BEG,0 + CALL CLAUSE-ADD,STACK +?CND3: ADD BEG,P-WORDLEN >BEG + JUMP ?PRG1 + + + .FUNCT CLAUSE-ADD,WRD,PTR + GET P-OCLAUSE,P-MATCHLEN + ADD STACK,2 >PTR + SUB PTR,1 + PUT P-OCLAUSE,STACK,WRD + PUT P-OCLAUSE,PTR,0 + PUT P-OCLAUSE,P-MATCHLEN,PTR + RTRUE + + + .FUNCT PREP-FIND,PREP,CNT=0,SIZE + GET PREPOSITIONS,0 + MUL STACK,2 >SIZE +?PRG1: IGRTR? 'CNT,SIZE /FALSE + GET PREPOSITIONS,CNT + EQUAL? STACK,PREP \?PRG1 + SUB CNT,1 + GET PREPOSITIONS,STACK + RETURN STACK + + + .FUNCT SYNTAX-FOUND,SYN + SET 'P-SYNTAX,SYN + GETB SYN,P-SACTION >PRSA + RETURN PRSA + + + .FUNCT GWIM,GBIT,LBIT,PREP,OBJ + EQUAL? GBIT,RMUNGBIT \?CND1 + RETURN ROOMS +?CND1: SET 'P-GWIMBIT,GBIT + SET 'P-SLOCBITS,LBIT + PUT P-MERGE,P-MATCHLEN,0 + CALL GET-OBJECT,P-MERGE,FALSE-VALUE + ZERO? STACK /?ELS8 + SET 'P-GWIMBIT,0 + GET P-MERGE,P-MATCHLEN + EQUAL? STACK,1 \FALSE + GET P-MERGE,1 >OBJ + PRINTI "(" + ZERO? PREP /?CND16 + CALL PREP-FIND,PREP + PRINTB STACK + PRINTI " the " +?CND16: PRINTD OBJ + PRINTI ")" + CRLF + RETURN OBJ +?ELS8: SET 'P-GWIMBIT,0 + RFALSE + + + .FUNCT SNARF-OBJECTS,PTR + GET P-ITBL,P-NC1 >PTR + ZERO? PTR /?CND1 + GETB P-SYNTAX,P-SLOC1 >P-SLOCBITS + GET P-ITBL,P-NC1L + CALL SNARFEM,PTR,STACK,P-PRSO + ZERO? STACK /FALSE + GET P-BUTS,P-MATCHLEN + ZERO? STACK /?CND1 + CALL BUT-MERGE,P-PRSO >P-PRSO +?CND1: GET P-ITBL,P-NC2 >PTR + ZERO? PTR /TRUE + GETB P-SYNTAX,P-SLOC2 >P-SLOCBITS + GET P-ITBL,P-NC2L + CALL SNARFEM,PTR,STACK,P-PRSI + ZERO? STACK /FALSE + GET P-BUTS,P-MATCHLEN + ZERO? STACK /TRUE + GET P-PRSI,P-MATCHLEN + EQUAL? STACK,1 \?ELS18 + CALL BUT-MERGE,P-PRSO >P-PRSO + RTRUE +?ELS18: CALL BUT-MERGE,P-PRSI >P-PRSI + RTRUE + + + .FUNCT BUT-MERGE,TBL,LEN,BUTLEN,CNT=1,MATCHES=0,OBJ,NTBL + GET TBL,P-MATCHLEN >LEN + PUT P-MERGE,P-MATCHLEN,0 +?PRG1: DLESS? 'LEN,0 \?ELS5 + JUMP ?REP2 +?ELS5: GET TBL,CNT >OBJ + CALL ZMEMQ,OBJ,P-BUTS + ZERO? STACK /?ELS7 + JUMP ?CND3 +?ELS7: ADD MATCHES,1 + PUT P-MERGE,STACK,OBJ + INC 'MATCHES +?CND3: INC 'CNT + JUMP ?PRG1 +?REP2: PUT P-MERGE,P-MATCHLEN,MATCHES + SET 'NTBL,P-MERGE + SET 'P-MERGE,TBL + RETURN NTBL + + + .FUNCT SNARFEM,PTR,EPTR,TBL,BUT=0,LEN,WV,WRD,NW + SET 'P-GETFLAGS,0 + SET 'P-CSPTR,PTR + SET 'P-CEPTR,EPTR + PUT P-BUTS,P-MATCHLEN,0 + PUT TBL,P-MATCHLEN,0 + GET PTR,0 >WRD +?PRG1: EQUAL? PTR,EPTR \?ELS5 + ZERO? BUT /?ORP9 + PUSH BUT + JUMP ?THN6 +?ORP9: PUSH TBL +?THN6: CALL GET-OBJECT,STACK + RETURN STACK +?ELS5: GET PTR,P-LEXELEN >NW + EQUAL? WRD,W?ALL \?ELS14 + SET 'P-GETFLAGS,P-ALL + EQUAL? NW,W?OF \?CND12 + ADD PTR,P-WORDLEN >PTR + JUMP ?CND12 +?ELS14: EQUAL? WRD,W?BUT,W?EXCEPT \?ELS19 + ZERO? BUT /?ORP25 + PUSH BUT + JUMP ?THN22 +?ORP25: PUSH TBL +?THN22: CALL GET-OBJECT,STACK + ZERO? STACK /FALSE + SET 'BUT,P-BUTS + PUT BUT,P-MATCHLEN,0 + JUMP ?CND3 +?ELS19: EQUAL? WRD,W?A,W?ONE \?ELS27 + ZERO? P-ADJ \?ELS30 + SET 'P-GETFLAGS,P-ONE + EQUAL? NW,W?OF \?CND3 + ADD PTR,P-WORDLEN >PTR + JUMP ?CND3 +?ELS30: SET 'P-NAM,P-ONEOBJ + ZERO? BUT /?ORP41 + PUSH BUT + JUMP ?THN38 +?ORP41: PUSH TBL +?THN38: CALL GET-OBJECT,STACK + ZERO? STACK /FALSE + ZERO? NW /TRUE + JUMP ?CND3 +?ELS27: EQUAL? WRD,W?AND,W?COMMA \?ELS45 + EQUAL? NW,W?AND,W?COMMA /?ELS45 + ZERO? BUT /?ORP53 + PUSH BUT + JUMP ?THN50 +?ORP53: PUSH TBL +?THN50: CALL GET-OBJECT,STACK + ZERO? STACK \?CND12 + RFALSE +?ELS45: CALL WT?,WRD,PS?BUZZ-WORD + ZERO? STACK /?ELS55 + JUMP ?CND3 +?ELS55: EQUAL? WRD,W?AND,W?COMMA \?ELS57 + JUMP ?CND3 +?ELS57: EQUAL? WRD,W?OF \?ELS59 + ZERO? P-GETFLAGS \?CND12 + SET 'P-GETFLAGS,P-INHIBIT + JUMP ?CND12 +?ELS59: CALL WT?,WRD,PS?ADJECTIVE,P1?ADJECTIVE >WV + ZERO? WV /?ELS64 + ZERO? P-ADJ \?ELS64 + SET 'P-ADJ,WV + SET 'P-ADJN,WRD + JUMP ?CND3 +?ELS64: CALL WT?,WRD,PS?OBJECT,P1?OBJECT + ZERO? STACK /?CND3 + SET 'P-NAM,WRD + SET 'P-ONEOBJ,WRD +?CND12: +?CND3: EQUAL? PTR,EPTR /?PRG1 + ADD PTR,P-WORDLEN >PTR + SET 'WRD,NW + JUMP ?PRG1 + + + .FUNCT GET-OBJECT,TBL,VRB=1,BTS,LEN,XBITS,TLEN,GCHECK=0,OLEN=0 + SET 'XBITS,P-SLOCBITS + GET TBL,P-MATCHLEN >TLEN + BTST P-GETFLAGS,P-INHIBIT /TRUE + ZERO? P-NAM \?CND4 + ZERO? P-ADJ /?CND4 + CALL WT?,P-ADJN,PS?OBJECT,P1?OBJECT + ZERO? STACK /?ELS11 + SET 'P-NAM,P-ADJN + SET 'P-ADJ,FALSE-VALUE + JUMP ?CND4 +?ELS11: CALL WT?,P-ADJN,PS?DIRECTION,P1?DIRECTION >BTS + ZERO? BTS /?CND4 + SET 'P-ADJ,FALSE-VALUE + PUT TBL,P-MATCHLEN,1 + PUT TBL,1,INTDIR + SET 'P-DIRECTION,BTS + RTRUE +?CND4: ZERO? P-NAM \?CND14 + ZERO? P-ADJ \?CND14 + EQUAL? P-GETFLAGS,P-ALL /?CND14 + ZERO? P-GWIMBIT \?CND14 + ZERO? VRB /FALSE + PRINTI "There seems to be a noun missing in that sentence!" + CRLF + RFALSE +?CND14: EQUAL? P-GETFLAGS,P-ALL \?THN28 + ZERO? P-SLOCBITS \?CND25 +?THN28: SET 'P-SLOCBITS,-1 +?CND25: SET 'P-TABLE,TBL +?PRG30: ZERO? GCHECK /?ELS34 + CALL GLOBAL-CHECK,TBL + JUMP ?CND32 +?ELS34: ZERO? LIT /?CND38 + CALL DO-SL,HERE,SOG,SIR +?CND38: CALL DO-SL,WINNER,SH,SC + EQUAL? WINNER,PLAYER /?CND32 + CALL DO-SL,PLAYER,SH,SC +?CND32: GET TBL,P-MATCHLEN + SUB STACK,TLEN >LEN + BTST P-GETFLAGS,P-ALL \?ELS47 + JUMP ?CND45 +?ELS47: BTST P-GETFLAGS,P-ONE \?ELS49 + ZERO? LEN /?ELS49 + EQUAL? LEN,1 /?CND52 + RANDOM LEN + GET TBL,STACK + PUT TBL,1,STACK + PRINTI "(How about the " + GET TBL,1 + PRINTD STACK + PRINTI "?)" + CRLF +?CND52: PUT TBL,P-MATCHLEN,1 + JUMP ?CND45 +?ELS49: GRTR? LEN,1 /?THN61 + ZERO? LEN \?ELS60 + EQUAL? P-SLOCBITS,-1 /?ELS60 +?THN61: EQUAL? P-SLOCBITS,-1 \?ELS67 + SET 'P-SLOCBITS,XBITS + SET 'OLEN,LEN + GET TBL,P-MATCHLEN + SUB STACK,LEN + PUT TBL,P-MATCHLEN,STACK + JUMP ?PRG30 +?ELS67: ZERO? LEN \?CND70 + SET 'LEN,OLEN +?CND70: ZERO? VRB /?ELS75 + ZERO? P-NAM /?ELS75 + CALL WHICH-PRINT,TLEN,LEN,TBL + EQUAL? TBL,P-PRSO \?ELS82 + PUSH P-NC1 + JUMP ?CND78 +?ELS82: PUSH P-NC2 +?CND78: SET 'P-ACLAUSE,STACK + SET 'P-AADJ,P-ADJ + SET 'P-ANAM,P-NAM + CALL ORPHAN,FALSE-VALUE,FALSE-VALUE + SET 'P-OFLAG,TRUE-VALUE + JUMP ?CND73 +?ELS75: ZERO? VRB /?CND73 + PRINTI "There seems to be a noun missing in that sentence!" + CRLF +?CND73: SET 'P-NAM,FALSE-VALUE + SET 'P-ADJ,FALSE-VALUE + RFALSE +?ELS60: ZERO? LEN \?ELS91 + ZERO? GCHECK /?ELS91 + ZERO? VRB /?CND94 + EQUAL? WINNER,PLAYER /?ELS100 + PRINTI """I can't see that here!""" + CRLF + JUMP ?CND94 +?ELS100: ZERO? LIT /?ELS104 + PRINTI "You can't see any" + ZERO? P-OFLAG /?ELS110 + ZERO? P-ADJ /?CND112 + PRINTI " " + PRINTB P-ADJN +?CND112: ZERO? P-NAM /?CND108 + PRINTI " " + PRINTB P-NAM + JUMP ?CND108 +?ELS110: CALL BUFFER-PRINT,P-CSPTR,P-CEPTR,FALSE-VALUE +?CND108: PRINTI " here." + CRLF + JUMP ?CND94 +?ELS104: PRINTI "It's too dark to see." + CRLF +?CND94: SET 'P-NAM,FALSE-VALUE + SET 'P-ADJ,FALSE-VALUE + RFALSE +?ELS91: ZERO? LEN \?CND45 + SET 'GCHECK,TRUE-VALUE + JUMP ?PRG30 +?CND45: SET 'P-ADJ,FALSE-VALUE + SET 'P-NAM,FALSE-VALUE + SET 'P-SLOCBITS,XBITS + RTRUE + + + .FUNCT WHICH-PRINT,TLEN,LEN,TBL,OBJ,RLEN + SET 'RLEN,LEN + PRINTI "Which " + PRINTB P-NAM + PRINTI " do you mean, " +?PRG5: INC 'TLEN + GET TBL,TLEN >OBJ + PRINTI "the " + PRINTD OBJ + EQUAL? LEN,2 \?ELS11 + EQUAL? RLEN,2 /?CND12 + PRINTI "," +?CND12: PRINTI " or " + JUMP ?CND9 +?ELS11: GRTR? LEN,2 \?CND9 + PRINTI ", " +?CND9: DLESS? 'LEN,1 \?PRG5 + PRINTR "?" + + + .FUNCT GLOBAL-CHECK,TBL,LEN,RMG,RMGL,CNT=0,OBJ,OBITS,FOO + GET TBL,P-MATCHLEN >LEN + SET 'OBITS,P-SLOCBITS + GETPT HERE,P?GLOBAL >RMG + ZERO? RMG /?CND1 + PTSIZE RMG + SUB STACK,1 >RMGL +?PRG4: GETB RMG,CNT >OBJ + CALL THIS-IT?,OBJ,TBL + ZERO? STACK /?CND6 + CALL OBJ-FOUND,OBJ,TBL +?CND6: IGRTR? 'CNT,RMGL \?PRG4 +?CND1: GETPT HERE,P?PSEUDO >RMG + ZERO? RMG /?CND12 + PTSIZE RMG + DIV STACK,4 + SUB STACK,1 >RMGL + SET 'CNT,0 +?PRG15: MUL CNT,2 + GET RMG,STACK + EQUAL? P-NAM,STACK \?ELS19 + MUL CNT,2 + ADD STACK,1 + GET RMG,STACK + PUTP PSEUDO-OBJECT,P?ACTION,STACK + GETPT PSEUDO-OBJECT,P?ACTION + SUB STACK,5 >FOO + GET P-NAM,0 + PUT FOO,0,STACK + GET P-NAM,1 + PUT FOO,1,STACK + CALL OBJ-FOUND,PSEUDO-OBJECT,TBL + JUMP ?CND12 +?ELS19: IGRTR? 'CNT,RMGL \?PRG15 +?CND12: GET TBL,P-MATCHLEN + EQUAL? STACK,LEN \FALSE + SET 'P-SLOCBITS,-1 + SET 'P-TABLE,TBL + CALL DO-SL,GLOBAL-OBJECTS,1,1 + SET 'P-SLOCBITS,OBITS + GET TBL,P-MATCHLEN + ZERO? STACK \FALSE + EQUAL? PRSA,V?LOOK-INSIDE,V?SEARCH,V?EXAMINE \FALSE + CALL DO-SL,ROOMS,1,1 + RSTACK + + + .FUNCT DO-SL,OBJ,BIT1,BIT2,BTS + ADD BIT1,BIT2 + BTST P-SLOCBITS,STACK \?ELS5 + CALL SEARCH-LIST,OBJ,P-TABLE,P-SRCALL + RSTACK +?ELS5: BTST P-SLOCBITS,BIT1 \?ELS12 + CALL SEARCH-LIST,OBJ,P-TABLE,P-SRCTOP + RSTACK +?ELS12: BTST P-SLOCBITS,BIT2 \TRUE + CALL SEARCH-LIST,OBJ,P-TABLE,P-SRCBOT + RSTACK + + + .FUNCT SEARCH-LIST,OBJ,TBL,LVL,FLS,NOBJ + FIRST? OBJ >OBJ \FALSE +?PRG6: EQUAL? LVL,P-SRCBOT /?CND8 + GETPT OBJ,P?SYNONYM + ZERO? STACK /?CND8 + CALL THIS-IT?,OBJ,TBL + ZERO? STACK /?CND8 + CALL OBJ-FOUND,OBJ,TBL +?CND8: EQUAL? LVL,P-SRCTOP \?THN18 + FSET? OBJ,SEARCHBIT /?THN18 + FSET? OBJ,SURFACEBIT \?CND13 +?THN18: FIRST? OBJ >NOBJ \?CND13 + FSET? OBJ,OPENBIT /?THN20 + FSET? OBJ,TRANSBIT \?CND13 +?THN20: FSET? OBJ,SURFACEBIT \?ELS26 + PUSH P-SRCALL + JUMP ?CND22 +?ELS26: FSET? OBJ,SEARCHBIT \?ELS28 + PUSH P-SRCALL + JUMP ?CND22 +?ELS28: PUSH P-SRCTOP +?CND22: CALL SEARCH-LIST,OBJ,TBL,STACK >FLS +?CND13: NEXT? OBJ >OBJ /?PRG6 + RTRUE + + + .FUNCT OBJ-FOUND,OBJ,TBL,PTR + GET TBL,P-MATCHLEN >PTR + ADD PTR,1 + PUT TBL,STACK,OBJ + ADD PTR,1 + PUT TBL,P-MATCHLEN,STACK + RTRUE + + + .FUNCT TAKE-CHECK + GETB P-SYNTAX,P-SLOC1 + CALL ITAKE-CHECK,P-PRSO,STACK + ZERO? STACK /FALSE + GETB P-SYNTAX,P-SLOC2 + CALL ITAKE-CHECK,P-PRSI,STACK + RSTACK + + + .FUNCT ITAKE-CHECK,TBL,BTS,PTR,OBJ,TAKEN + GET TBL,P-MATCHLEN >PTR + ZERO? PTR /TRUE + BTST BTS,STAKE \TRUE +?PRG8: DLESS? 'PTR,0 /TRUE + ADD PTR,1 + GET TBL,STACK >OBJ + EQUAL? OBJ,IT \?CND15 + SET 'OBJ,P-IT-OBJECT +?CND15: IN? OBJ,WINNER /?PRG8 + SET 'PRSO,OBJ + FSET? OBJ,TRYTAKEBIT \?ELS23 + SET 'TAKEN,TRUE-VALUE + JUMP ?CND21 +?ELS23: CALL ITAKE,FALSE-VALUE + EQUAL? STACK,TRUE-VALUE \?ELS25 + SET 'TAKEN,FALSE-VALUE + JUMP ?CND21 +?ELS25: SET 'TAKEN,TRUE-VALUE +?CND21: ZERO? TAKEN /?ELS30 + BTST BTS,SHAVE \?ELS30 + PRINTI "You don't have the " + PRINTD OBJ + PRINTI "." + CRLF + RFALSE +?ELS30: ZERO? TAKEN \?PRG8 + PRINTI "(Taken)" + CRLF + JUMP ?PRG8 + + + .FUNCT MANY-CHECK,LOSS=0,TMP,?TMP1 + GET P-PRSO,P-MATCHLEN + GRTR? STACK,1 \?ELS3 + GETB P-SYNTAX,P-SLOC1 + BTST STACK,SMANY /?ELS3 + SET 'LOSS,1 + JUMP ?CND1 +?ELS3: GET P-PRSI,P-MATCHLEN + GRTR? STACK,1 \?CND1 + GETB P-SYNTAX,P-SLOC2 + BTST STACK,SMANY /?CND1 + SET 'LOSS,2 +?CND1: ZERO? LOSS /TRUE + PRINTI "You can't use multiple " + EQUAL? LOSS,2 \?CND18 + PRINTI "in" +?CND18: PRINTI "direct objects with """ + GET P-ITBL,P-VERBN >TMP + ZERO? TMP \?ELS27 + PRINTI "tell" + JUMP ?CND25 +?ELS27: ZERO? P-OFLAG \?THN32 + ZERO? P-MERGED /?ELS31 +?THN32: GET TMP,0 + PRINTB STACK + JUMP ?CND25 +?ELS31: GETB TMP,2 >?TMP1 + GETB TMP,3 + CALL WORD-PRINT,?TMP1,STACK +?CND25: PRINTI """." + CRLF + RFALSE + + + .FUNCT ZMEMQ,ITM,TBL,SIZE=-1,CNT=1 + ZERO? TBL /FALSE + LESS? SIZE,0 /?ELS6 + SET 'CNT,0 + JUMP ?CND4 +?ELS6: GET TBL,0 >SIZE +?CND4: +?PRG9: GET TBL,CNT + EQUAL? ITM,STACK /TRUE + IGRTR? 'CNT,SIZE \?PRG9 + RFALSE + + + .FUNCT ZMEMQB,ITM,TBL,SIZE,CNT=0 +?PRG1: GETB TBL,CNT + EQUAL? ITM,STACK /TRUE + IGRTR? 'CNT,SIZE \?PRG1 + RFALSE + + + .FUNCT LIT?,RM,OHERE,LIT=0 + SET 'P-GWIMBIT,ONBIT + SET 'OHERE,HERE + SET 'HERE,RM + FSET? RM,ONBIT \?ELS3 + SET 'LIT,TRUE-VALUE + JUMP ?CND1 +?ELS3: PUT P-MERGE,P-MATCHLEN,0 + SET 'P-TABLE,P-MERGE + SET 'P-SLOCBITS,-1 + EQUAL? OHERE,RM \?CND6 + CALL DO-SL,WINNER,1,1 +?CND6: CALL DO-SL,RM,1,1 + GET P-TABLE,P-MATCHLEN + GRTR? STACK,0 \?CND1 + SET 'LIT,TRUE-VALUE +?CND1: SET 'HERE,OHERE + SET 'P-GWIMBIT,0 + RETURN LIT + + + .FUNCT PRSO-PRINT,PTR + ZERO? P-MERGED \?THN6 + GET P-ITBL,P-NC1 >PTR + GET PTR,0 + EQUAL? STACK,W?IT \?ELS5 +?THN6: PRINTI " " + PRINTD PRSO + RTRUE +?ELS5: GET P-ITBL,P-NC1L + CALL BUFFER-PRINT,PTR,STACK,FALSE-VALUE + RSTACK + + + .FUNCT PRSI-PRINT,PTR + ZERO? P-MERGED \?THN6 + GET P-ITBL,P-NC2 >PTR + GET PTR,0 + EQUAL? STACK,W?IT \?ELS5 +?THN6: PRINTI " " + PRINTD PRSO + RTRUE +?ELS5: GET P-ITBL,P-NC2L + CALL BUFFER-PRINT,PTR,STACK,FALSE-VALUE + RSTACK + + + .FUNCT THIS-IT?,OBJ,TBL,SYNS,?TMP1 + FSET? OBJ,INVISIBLE /FALSE + ZERO? P-NAM /?ELS5 + GETPT OBJ,P?SYNONYM >SYNS + PTSIZE SYNS + DIV STACK,2 + SUB STACK,1 + CALL ZMEMQ,P-NAM,SYNS,STACK + ZERO? STACK /FALSE +?ELS5: ZERO? P-ADJ /?ELS9 + GETPT OBJ,P?ADJECTIVE >SYNS + ZERO? SYNS /FALSE + PTSIZE SYNS + SUB STACK,1 + CALL ZMEMQB,P-ADJ,SYNS,STACK + ZERO? STACK /FALSE +?ELS9: ZERO? P-GWIMBIT /TRUE + FSET? OBJ,P-GWIMBIT /TRUE + RFALSE + + .ENDI diff --git a/parser.zil b/parser.zil new file mode 100644 index 0000000..336994b --- /dev/null +++ b/parser.zil @@ -0,0 +1,1135 @@ +"Parser global variable convention: All parser globals will + begin with 'P-'. Local variables are not restricted in any + way. +" + + + +> + + + + + + + + + + + + + + + + + + + + + + + +> +;"INBUF - Input buffer for READ" + +> +;"Parse-cont variable" + +> + +> +> + +;"Orphan flag" + +> + +> + +> + +> + +> +;"Parser variables and temporaries" + + + + + + +;"Byte offset to # of entries in LEXV" + + +;"Word offset to start of LEXV entries" + + +;"Number of words per LEXV entry" + + + + +;"Offset to parts of speech byte" + + +;"Offset to first part of speech" + + +;"First part of speech bit mask in PSOFF byte" + + + + + +> + +> + +> + + + + + + + + + + + + + + + + + + + + + + + +> + +" Grovel down the input finding the verb, prepositions, and noun clauses. + If the input is or , fall out immediately + setting PRSA to ,V?WALK and PRSO to . Otherwise, perform + all required orphaning, syntax checking, and noun clause lookup." + +) + LEN (DIR <>) (NW 0) (LW 0) NUM SCNT (CNT -1)) + > ,P-ITBLLEN> ) + (T )>> + > + > + + + + > + + ,VEHBIT>> + >)>)> + + <==? ,PLAYER ,WINNER>> + )> + >) + (T + + > + ,VEHBIT>> + >)> + )> + "> + )> + > + )> + + > + + + > 0> + > + ) + (> + >> + + > + ) + ( + > + + + )> + + > + ) + ( + > + + >) + (T )>)> + + >> + + ) + (> + ,ACT?WALK> + + <==? .VERB ,ACT?WALK>> + >> + ,W?THEN + ,W?PERIOD + ,W?QUOTE> + >> + + > + + >>> + + + + ,W?THEN>)> + > + > + )>) + (> + ; + >> + + + + + 2>>>> + >>) + (> + + + > + >> + + <==? > + ,W?OF> + ;> + <0? .VAL> + >>) + (> + + > + ,W?THEN ,W?PERIOD>>> + + + )>) + (<==? ,P-NCN 2> + + ) + (T + > + > + > + + > + )>)>) + ;( + > + ) + () + (T + + )>) + (T + + )> + + >> + + + + )> + > + )> + ; 0> )> + > + T)>> + + +> + +;"Check whether word pointed at by PTR is the correct part of speech. + The second argument is the part of speech (,PS?). The + 3rd argument (,P1?), if given, causes the value + for that part of speech to be returned." + +> .BIT> + ) + (T + > + > >)> + )>)>> +;" Scan through a noun clause, leave a pointer to its starting location" + +) (FIRST?? T) NW (LW 0)) + #DECL ((PTR VAL OFF NUM) FIX (WRD NW) + (ANDFLG FIRST??) ) + 2>> + > + > .VAL> + .WRD> + >) + (T >)> + > )> + > >> + ,W?THE ,W?A ,W?AN> + 4>>)> + > 0> + >> + )> + > + >> + ) + (T >>)> + ; + <==? ,ACT?ACCUSE>> + + )> + + > + ) + ( ) + ( + + > + >)>) + ( + + >> + > + + >> + >) + ( + + > + >) + ( + > + >> + + 2>>> + ) + (T >)>) + ( + >) + ( + >> + > + ,W?THEN> + >) + ( T) + (T + + )>) + (T )> + + > + >>> + +)) + > 2>> + > 3>> + > 0> ) + (T + > + + + ) + ( ) + ( > + <- .CHR 48>>>) + (T )> + >)>> + + ) + (.TIM + >) + ( )> + >>)> + + ,W?INTNUM> + + + + + +) WRD) + #DECL ((CNT TEMP VERB) FIX (BEG END) (WRD) TABLE) + > + >>> + >>> + ) + (<==? ,P-NCN 2> + ) + (<==? 1> + > > + <0? .TEMP>> + > + >) + (T )>) + (<==? 1> + > > + <0? .TEMP>> + > + > + ) + (T )>) + (,P-ACLAUSE + > > ) + (T + > + > + + + ) + (T + > + )>) + ( + > ,P-PSOFF> + ,PS?ADJECTIVE>> + ) + ( ,PS?OBJECT> + <==? .WRD ,W?ONE>> + > ) + (T + + )>)> + >>)>)> + > ,P-ITBLLEN> + + ) + (T >)>> + T> + + + .ADJ> + 0>> + > + > + > + +;"Print undefined word in input. + PTR points to the unknown word in P-LEXV" + + ) + (ELSE + > + >)>>> + + + + )> + + >> 2> + 3>> + + > + >> + + + + )> + + >> 2> + 3>> + + > + >> + +;" Perform syntax matching operations, using P-ITBL as the source of + the verb and adjectives for this input. Returns false if no + syntax matches, and does it's own orphaning. If return is true, + the syntax is saved in P-SYNTAX." + + + + + + + + + + + + + + + + + + + + + + + +) (DRIVE2 <>) PREP VERB TMP) + #DECL ((DRIVE1 DRIVE2) > + (SYN) (LEN NUM VERB PREP) FIX + (OBJ) ) + >> + + )> + >> + > + > + ,P-SONUMS>> + > + <0? ,P-NCN> + >> + <==? .PREP >>> + ) + (<==? > + <==? ,P-NCN 1>> + ) + (<==? > + + )>)> + + ) + (T + + )>) + (T >)>> + + + >>> + + + ) + ( + + >>> + + + ) + ( + + ) + (T + + + > + ) + (<0? > + >) + (T + > + )> + )> + + ) + (T )>> + + )>> + +>) + + + ) + (T >)>> + )> + > )> + > + ) + (.D2 + > + )>> + + T>> + +) WRD (FIRST?? T) (PN <>)) + #DECL ((BEG END) (CP) ) + ) + (T + >) + (T )> + > ,W?PERIOD> + ) + (T + .CP> + )> + ) + ( + <==? ,P-IT-LOC ,HERE>> + ) + (T + + >)> + >)>)> + >>> + +> 32>> + 1> <+ 1>>> + +> + + > + )>> + +) "AUX" BEG END) + #DECL ((BPTR EPTR) FIX (BEG END) + (INSRT) ) + > + > + ,P-LEXELEN> 2>>> + + ,P-LEXELEN> + 2>>> + ) + (T + >> + )> + >)> + >>> + + + 2>> + .WRD> + + > + + 2>> + ) + (<==? .PREP> + >>)>>> + +) + + >> + + + + + )> + + + + > + + 1> + > + + > + > + + ) + (T + )>)> + + .OBJ)>) + (T )>> + +>) + > 0>> + > + ,P-PRSO> > + > + >>)> + > 0>> + > + ,P-PRSI> > + >> + 1> + >) + (T >)>)>)> + > + +> + + ) + (> ,P-BUTS>) + (T + .OBJ> + >)> + >> + + + + .NTBL> + +> + +> + +> + +> + +> + +> + +> + +> + +> + + + + + + + + + + + +> +> + +) LEN WV WRD NW) + #DECL ((TBL) TABLE (PTR EPTR) + (BUT) (WV) ) + + + + + + > + >>) + (T + > + + + + >)>) + ( + > > + + ) + ( + + + + >)>) + (T + + > > + >)>) + ( + >> + > > + T) + () + () + (<==? .WRD ,W?OF> + + )>) + (> + > + + ) + ( + + )>)> + > + > + )>>> + + + + + + + + + + + + + + + +) (OLEN 0)) + #DECL ((TBL) TABLE (XBTS BTS TLEN LEN) FIX (GWIM) + (VRB GCHECK) ) + + > + )> + ,P-ADJ> + + + >) + (> + > + + + + )>)> + + + > + <0? ,P-GWIMBIT>> + )> + )> + > <0? ,P-SLOCBITS>> + )> + + ) + (T + )> + + > + )>)> + .TLEN>> + ) + ( + >> + > + >> + + > + )> + ) + ( + >>> + + + + .LEN>> + ) + (T + )> + + + ,P-NC1) + (T ,P-NC2)>> + + + <>> + ) + (.VRB + )> + > + > + )>) + ( .GCHECK> + > + ) + (,LIT + + + )> + + )>) + (T + >)> + ) + (T + )>)> + > + > + ) + (<0? .LEN> )> + > + > + + >> + + + + + + > + > + + + > )> + ) + ( )> + > 1> + + )>>> + + + (RMGL CNT) FIX (OBJ) OBJECT) + > + + > + 1>> + > .TBL> + )> + )>>)> + > + 4> 1>> + + >> + 1>>> + 5>> + > + > + + ) + ( )>>)> + .LEN> + + + + + > + > + )>)>> + +> + ) + (T + + ) + ( + ) + (T )>)>> + + + + + + + + (TBL) TABLE (LVL) FIX (FLS) ANY) + > + > + + > + )> + > + + > + > + + >> + + ,P-SRCALL) + ( + ,P-SRCALL) + (T ,P-SRCTOP)>>>)> + >) (T )>>)>> + +> + .OBJ> + >> + +> + >>> + +) + > > + > 0> ) + (T + >> + )> + > + + + ) + (<==? > T> + >) + (T )> + > + + + + ) + ( + )>)>)>>) + (T)>> + +) TMP) + #DECL ((LOSS) ) + 1> + ,SMANY>>> + ) + ( 1> + ,SMANY>>> + )> + + )> + + > + ) + ( + >) + (T + >)> + + ) + (T)>> + + )> + > ) + (ELSE >)> + > ) + ( )>>> + +> ) + ( )>>> + +)) + #DECL ((RM OHERE) OBJECT (LIT) ) + + + + ) + (T + + + + )> + + 0> )>)> + + + .LIT> + +> 0> ,W?IT>> + ) + (T <>>)>> + +> 0> ,W?IT>> + ) + (T <>>)>> + +"former CRUFTY routine, re-written by SWG" + + ) + (> + <- 2> 1>>>> + ) + (>> + 1>>>>> + ) + (> >> + )> + > diff --git a/shadow.zap b/shadow.zap new file mode 100644 index 0000000..7efc7e0 --- /dev/null +++ b/shadow.zap @@ -0,0 +1,1219 @@ + + + .FUNCT PICK-DIRECTION,RM,NXT=0,CNT=0,OFFS=0 +?PRG1: NEXTP RM,NXT >NXT + ZERO? NXT \?ELS5 + JUMP ?REP2 +?ELS5: LESS? NXT,LOW-DIRECTION /?PRG1 + EQUAL? NXT,P?UP,P?DOWN /?PRG1 + INC 'OFFS + PUT DIR-TBL,OFFS,NXT + INC 'CNT + JUMP ?PRG1 +?REP2: RANDOM CNT + GET DIR-TBL,STACK + RSTACK + + + .FUNCT SHADOW-F,RARG=0 + EQUAL? RARG,M-OBJDESC \?ELS5 + ZERO? BLOCKED-DIR \?CND6 + CALL PICK-DIRECTION,HERE >BLOCKED-DIR +?CND6: PRINTI "A cloaked and hooded person, carrying a sword not unlike your own," + GRTR? S-STRENGTH,3 \?ELS13 + PRINTI " is standing blocking the way to the " + CALL LKP,BLOCKED-DIR,DIRS + PRINT STACK + PRINTI "." + CRLF + JUMP ?CND11 +?ELS13: PRINTI " is here." + CRLF +?CND11: PRINTI "The hooded figure" + GET SHADOW-DIAG,S-STRENGTH + PRINT STACK + CRLF + RTRUE +?ELS5: EQUAL? PRSA,V?GIVE \?ELS25 + EQUAL? PRSI,SHADOW \?ELS25 + PRINTR "The hooded figure isn't interested in your gifts." +?ELS25: CALL HELLO?,SHADOW + ZERO? STACK /?ELS31 + PRINTR "The hooded figure does not respond to your words." +?ELS31: EQUAL? PRSA,V?KILL,V?ATTACK \?ELS35 + EQUAL? PRSI,SWORD \?ELS35 + ZERO? SHADOW-POINT-2 \?CND38 + INC 'SCORE + SET 'SHADOW-POINT-2,TRUE-VALUE +?CND38: CALL SHADOW-ATTACK + RSTACK +?ELS35: EQUAL? PRSA,V?KILL,V?ATTACK \FALSE + PRINTI "The hooded figure ignores your feeble attack." + CRLF + SET 'ATTACK-MODE,TRUE-VALUE + CALL QUEUE,I-CURE,10 + PUT STACK,0,1 + CALL QUEUE,I-SHADOW-REPLY,-1 + PUT STACK,0,1 + RTRUE + + + .FUNCT I-CURE + EQUAL? P-STRENGTH,5 /?CND1 + INC 'P-STRENGTH +?CND1: EQUAL? S-STRENGTH,5 /?CND4 + INC 'S-STRENGTH +?CND4: ADD P-STRENGTH,S-STRENGTH + EQUAL? STACK,10 /FALSE + CALL QUEUE,I-CURE,10 + RFALSE + + + .FUNCT SHADOW-ATTACK,?TMP1 + ZERO? ATTACK-MODE \?CND1 + CALL QUEUE,I-CURE,10 + PUT STACK,0,1 + SET 'ATTACK-MODE,TRUE-VALUE + CALL QUEUE,I-SHADOW-REPLY,-1 + PUT STACK,0,1 +?CND1: MUL P-STRENGTH,10 + ADD STACK,10 >?TMP1 + RANDOM 100 + GRTR? ?TMP1,STACK \?ELS8 + RANDOM 100 + GRTR? 85,STACK \?ELS13 + DEC 'S-STRENGTH + ZERO? S-STRENGTH \?CND14 + CALL SHADOW-DIES + RTRUE +?CND14: CALL PICK-ONE,P-HITS + PRINT STACK + CRLF + PRINTI "The figure" + GET SHADOW-DIAG,S-STRENGTH + PRINT STACK + CRLF + RTRUE +?ELS13: SUB S-STRENGTH,2 >S-STRENGTH + ZERO? S-STRENGTH \?ELS25 + SET 'S-STRENGTH,1 + JUMP ?CND23 +?ELS25: LESS? S-STRENGTH,1 \?CND23 + CALL SHADOW-DIES + RTRUE +?CND23: PRINTI "A sharp thrust and the hooded figure is badly wounded!" + CRLF + PRINTI "The figure" + GET SHADOW-DIAG,S-STRENGTH + PRINT STACK + CRLF + RTRUE +?ELS8: LESS? S-STRENGTH,2 \?ELS38 + PRINTR "Your opponent blocks your attack with its sword." +?ELS38: CALL PICK-ONE,P-MISSES + PRINT STACK + CRLF + RTRUE + + + .FUNCT I-SHADOW-REPLY,?TMP1 + ZERO? ATTACK-MODE /?THN4 + IN? SHADOW,HERE /?CND1 +?THN4: CALL QUEUE,I-SHADOW-REPLY,0 + SET 'ATTACK-MODE,FALSE-VALUE + RFALSE +?CND1: MUL S-STRENGTH,10 + ADD STACK,10 >?TMP1 + RANDOM 100 + GRTR? ?TMP1,STACK \?ELS10 + GRTR? S-STRENGTH,1 \?ELS10 + RANDOM 100 + GRTR? 90,STACK \?ELS17 + DLESS? 'P-STRENGTH,1 \?ELS22 + SET 'P-STRENGTH,1 + PRINTR "The hooded figure swings its sword and sends yours flying to the ground. Although you are defenseless, the figure reaches for your sword and hands it back to you, nodding grimly." +?ELS22: CALL PICK-ONE,S-HITS + PRINT STACK + CRLF + RTRUE +?ELS17: SUB P-STRENGTH,2 >P-STRENGTH + LESS? P-STRENGTH,1 \?ELS35 + CALL JIGS-UP,STR?160 + RSTACK +?ELS35: PRINTR "A brilliant feint puts you off guard, and the hooded figure slips its sword between your ribs. You are hurt very badly." +?ELS10: LESS? S-STRENGTH,3 \?ELS41 + PRINTR "The hooded figure attempts a thrust, but its weakened state prevents hitting you." +?ELS41: CALL PICK-ONE,S-MISSES + PRINT STACK + CRLF + RTRUE + + + .FUNCT SHADOW-DIES + PRINTI "The hooded figure, fatally wounded, slumps to the ground. It gazes up at you once, and you catch a brief glimpse of deep and sorrowful eyes. Before you can react, the figure vanishes in a cloud of fetid vapor." + CRLF + REMOVE SHADOW + SET 'SHADOW-GONE,TRUE-VALUE + SET 'BLOCKED-DIR,FALSE-VALUE + RETURN BLOCKED-DIR + + + .FUNCT HOOD-F + EQUAL? PRSA,V?LOOK-UNDER \?ELS5 + IN? HOOD,SHADOW \?ELS5 + PRINTR "The figure's hood casts a dark shadow over its face. There is no way from where you stand to look beneath it." +?ELS5: EQUAL? PRSA,V?TAKE \FALSE + IN? HOOD,SHADOW \FALSE + EQUAL? S-STRENGTH,1 \?ELS18 + PRINTI "You slowly remove the hood from your badly wounded opponent and recoil in horror at the sight of your own face, weary and wounded. A faint smile comes to the lips and then the face starts to change, very slowly, into that of an old, wizened person. The image fades and with it the body of your hooded opponent. The cloak remains on the ground." + CRLF + REMOVE SHADOW + SET 'SHADOW-GONE,TRUE-VALUE + MOVE HOOD,WINNER + FCLEAR HOOD,NDESCBIT + MOVE CLOAK,HERE + FCLEAR CLOAK,NDESCBIT + RTRUE +?ELS18: EQUAL? S-STRENGTH,2 \?ELS22 + PRINTR "The hooded figure, though recovering from wounds, is strong enough to force you back." +?ELS22: PRINTR "You cannot get close enough to the hooded figure to remove the hood." + + + .FUNCT CLOAK-F + EQUAL? PRSA,V?LOOK-UNDER \?ELS5 + IN? CLOAK,SHADOW \?ELS5 + PRINTR "You cannot get close enough to look underneath the cloak." +?ELS5: EQUAL? PRSA,V?TAKE \FALSE + IN? CLOAK,SHADOW \FALSE + PRINTR "The cloak is fastened around the neck of the hooded figure. It would be difficult to remove." + + + .FUNCT V-DIAGNOSE + GET DIAG,P-STRENGTH + PRINT STACK + CRLF + RTRUE + + + .FUNCT SHADOW-ROOMS,RARG + EQUAL? RARG,M-BEG \?ELS5 + EQUAL? PRSA,V?WALK \?ELS5 + EQUAL? PRSO,BLOCKED-DIR \?ELS5 + PRINTR "Your way is blocked by the hooded figure." +?ELS5: EQUAL? RARG,M-END \FALSE + IN? SHADOW,HERE /?CND12 + SET 'BLOCKED-DIR,FALSE-VALUE + REMOVE SHADOW +?CND12: ZERO? SHADOW-GONE \FALSE + IN? SHADOW,HERE \?ELS22 + RANDOM 100 + GRTR? 30,STACK \FALSE + ZERO? ATTACK-MODE \FALSE + SET 'ATTACK-MODE,TRUE-VALUE + CALL QUEUE,I-CURE,10 + PUT STACK,0,1 + CALL QUEUE,I-SHADOW-REPLY,-1 + PUT STACK,0,1 + RTRUE +?ELS22: RANDOM 100 + GRTR? 30,STACK \?ELS31 + PRINTR "You can hear quiet footsteps nearby." +?ELS31: RANDOM 100 + GRTR? 30,STACK \FALSE + ZERO? LIT /FALSE + GRTR? S-STRENGTH,3 \FALSE + CALL PICK-DIRECTION,HERE >BLOCKED-DIR + PRINTI "Through the shadows, a cloaked and hooded figure appears before you, blocking the " + CALL LKP,BLOCKED-DIR,DIRS + PRINT STACK + PRINTI "ern exit from the room and carrying a brightly glowing sword." + CRLF + CALL SHADOW-ARRIVAL + RTRUE + + + .FUNCT SHADOW-ARRIVAL + MOVE SHADOW,HERE + ZERO? SHADOW-POINT-1 \?CND1 + INC 'SCORE + SET 'SHADOW-POINT-1,TRUE-VALUE +?CND1: IN? SWORD,WINNER /FALSE + MOVE SWORD,WINNER + ZERO? SWORD-IN-STONE? /?ELS11 + PRINTI "From nowhere, the sword from the junction appears in your hand, wildly glowing!" + CRLF + JUMP ?CND9 +?ELS11: PRINTI "Your sword, glowing wildly, appears in your hand!" + CRLF +?CND9: SET 'SWORD-IN-STONE?,FALSE-VALUE + RETURN SWORD-IN-STONE? + + + .FUNCT CREEPY-CRAWL-F,RARG + EQUAL? RARG,M-END \FALSE + SET 'BLOCKED-DIR,FALSE-VALUE + RTRUE + + + .FUNCT LEDGE-F + EQUAL? HERE,CLIFF-LEDGE \FALSE + EQUAL? PRSA,V?THROW-OFF \FALSE + EQUAL? PRSI,LEDGE \FALSE + IN? PRSO,WINNER /?CND8 + PRINTR "You're not holding that!" +?CND8: MOVE PRSO,CLIFF-BASE + PRINTI "The " + PRINTD PRSO + PRINTR " falls to the base of the cliff below." + + + .FUNCT WAYBREAD-F + EQUAL? PRSA,V?CUT \FALSE + EQUAL? PRSI,SWORD \FALSE + PRINTI "The bread is crushed rather than cut by your sword, and the crumbs scatter to the wind." + CRLF + REMOVE WAYBREAD + RTRUE + + + .FUNCT STAFF-F + EQUAL? PRSA,V?BURN \FALSE + EQUAL? PRSI,TORCH \FALSE + REMOVE PRSO + CALL JIGS-UP,STR?197 + RSTACK + + + .FUNCT I-MAN-APPEARS + EQUAL? HERE,CLIFF-LEDGE \FALSE + LOC CHEST + EQUAL? STACK,CLIFF-LEDGE,WINNER \FALSE + ZERO? CHEST-TIED /?ELS9 + SET 'MAN-SEEN,TRUE-VALUE + PRINTI "All at once, the chest is lifted from you. Looking up, you see a man at the top of the cliff, pulling intently at the rope. ""That is uncommonly good of you, I do say!"" He chuckles unpleasantly. ""Oh, you are stuck, aren't you. Well, I'll be right back to get you!"" He leaves your sight." + CRLF + SET 'CHEST-LIFTED,TRUE-VALUE + MOVE CHEST,MAN + FSET CHEST,TOUCHBIT + SET 'ROPE-FLAG,FALSE-VALUE + SET 'CHEST-TIED,FALSE-VALUE + CALL QUEUE,I-MAN-RETURNS,10 + PUT STACK,0,1 + RTRUE +?ELS9: PRINTI "At the edge of the cliff above you, a man appears. He looks down at you and speaks. ""Hello, down there! You seem to have a problem. Maybe I can help you."" He chuckles in an unsettling sort of way. ""Perhaps if you tied that chest to the end of the rope I might be able to drag it up for you. Then, I'll be more than happy to help you up!"" He laughs again." + CRLF + SET 'MAN-FLAG,TRUE-VALUE + SET 'MAN-SEEN,TRUE-VALUE + CALL QUEUE,I-MAN-PRESENT,-1 + PUT STACK,0,1 + RTRUE + + + .FUNCT I-MAN-PRESENT + EQUAL? HERE,CLIFF-LEDGE \?THN6 + ZERO? MAN-FLAG /?THN6 + IN? CHEST,MAN \?ELS5 +?THN6: CALL QUEUE,I-MAN-PRESENT,0 + SET 'MAN-FLAG,FALSE-VALUE + RFALSE +?ELS5: IGRTR? 'MAN-WAITING,10 \?ELS9 + PRINTI "The man looks quite displeased. ""All right, then. I guess someone else can always help me! See you around, sport!"" He disappears." + CRLF + CALL QUEUE,I-MAN-PRESENT,0 + SET 'MAN-FLAG,FALSE-VALUE + RTRUE +?ELS9: CALL PICK-ONE,MAN-WAITS + PRINT STACK + CRLF + RTRUE + + + .FUNCT CLIFF-BASE-F,RARG + EQUAL? RARG,M-ENTER \FALSE + ZERO? CHEST-TIED /FALSE + SET 'CHEST-TIED,FALSE-VALUE + SET 'ROPE-FLAG,FALSE-VALUE + CALL QUEUE,I-MAN-APPEARS,0 + RSTACK + + + .FUNCT CLIFF-LEDGE-F,RARG + EQUAL? RARG,M-BEG \?ELS5 + EQUAL? PRSA,V?WALK \?ELS5 + IN? CHEST,WINNER \?ELS5 + ZERO? CHEST-TIED /?ELS5 + PRINTR "You can't go anywhere holding that chest. The rope is tied around it!" +?ELS5: EQUAL? RARG,M-ENTER \?ELS11 + ZERO? MAN-SEEN \?ELS11 + ZERO? MAN-FLAG \?ELS11 + ZERO? MAN-GONE \?ELS11 + ZERO? MAN-POINT \?CND14 + INC 'SCORE + SET 'MAN-POINT,TRUE-VALUE +?CND14: CALL QUEUE,I-MAN-APPEARS,5 + PUT STACK,0,1 + RTRUE +?ELS11: EQUAL? RARG,M-LOOK \FALSE + PRINTI "This is a rock-strewn ledge near the base of a tall cliff. The bottom of the cliff is another fifteen feet below. You have little hope of climbing up the cliff face, but you might be able to scramble down from here (though it's doubtful you could return)." + CRLF + ZERO? ROPE-FLAG /TRUE + PRINTR "A long piece of rope is dangling down from the top of the cliff and is within your reach." + + + .FUNCT CLIFF-F,RARG + EQUAL? RARG,M-ENTER \?ELS5 + IN? CHEST,MAN \?ELS5 + CALL QUEUE,I-MAN-RETURNS,0 + MOVE CHEST,HERE + FSET CHEST,OPENBIT + SET 'ROPE-FLAG,TRUE-VALUE + SET 'CHEST-TIED,FALSE-VALUE + SET 'CHEST-OPENED,TRUE-VALUE + RFALSE +?ELS5: EQUAL? RARG,M-LOOK \?ELS9 + PRINTI "This is a remarkable spot in the dungeon. Perhaps two hundred feet above you is a gaping hole in the earth's surface through which pours bright sunshine! A few seedlings from the world above, nurtured by the sunlight and occasional rains, have grown into giant trees, making this a virtual oasis in the desert of the Underground Empire. To the west is a sheer precipice, dropping nearly fifty feet to jagged rocks below. The way south is barred by a forbidding stone wall, crumbling from age. There is a jagged opening in the wall to the southwest, through which leaks a fine mist. The land to the east looks lifeless and barren." + CRLF + ZERO? ROPE-FLAG /TRUE + PRINTR "A rope is tied to one of the large trees here and is dangling over the side of the cliff, reaching down to the shelf below." +?ELS9: EQUAL? RARG,M-END \?ELS19 + RANDOM 100 + GRTR? 15,STACK \?ELS19 + FSET? CLIFF-LEDGE,TOUCHBIT /?ELS19 + PRINTR "You catch, out of the corner of your eye, some movement among the trees." +?ELS19: EQUAL? RARG,M-END \FALSE + RANDOM 100 + GRTR? 20,STACK \FALSE + PRINTR "You seem to hear, from the southwest, the sounds of the sea." + + + .FUNCT GLOBAL-ROPE-F + ZERO? ROPE-FLAG \?ELS5 + PRINTR "You can't see any rope here." +?ELS5: EQUAL? PRSA,V?CLIMB-ON,V?MOVE,V?TAKE \?ELS9 + ZERO? MAN-FLAG \?ELS14 + PRINTR "A short tug on the rope convinces you that it is securely fastened from above." +?ELS14: IN? CHEST,MAN \?ELS18 + SET 'HOLDING-ROPE,TRUE-VALUE + PRINTR "You grab securely on to the rope." +?ELS18: PRINTR "The man scowls. ""I may help you up, but not before I have that chest."" He points to the chest near you on the ledge." +?ELS9: EQUAL? PRSA,V?CLIMB-UP \?ELS26 + PRINTR "You try to climb the rope, but you cannot reach the top even with your best effort." +?ELS26: EQUAL? PRSA,V?TIE \?ELS30 + EQUAL? CHEST,PRSO,PRSI \?ELS35 + PRINTI "The chest is now tied to the rope." + CRLF + SET 'CHEST-TIED,TRUE-VALUE + ZERO? MAN-FLAG /TRUE + ZERO? MAN-GONE \TRUE + PRINTI "The man above you looks pleased. ""Now there's a good friend! Thank you very much, indeed!"" He pulls on the rope and the chest is lifted to the top of the cliff and out of sight. With a short laugh, he disappears. ""I'll be back in a short while!"" are his last words." + CRLF + MOVE CHEST,MAN + FSET CHEST,TOUCHBIT + SET 'CHEST-TIED,FALSE-VALUE + SET 'ROPE-FLAG,FALSE-VALUE + CALL QUEUE,I-MAN-RETURNS,10 + PUT STACK,0,1 + SET 'MAN-FLAG,FALSE-VALUE + RTRUE +?ELS35: EQUAL? ME,PRSI,PRSO \?ELS46 + ZERO? MAN-FLAG /?ELS51 + IN? CHEST,MAN \?ELS51 + PRINTR """Just grab onto it!"", the man bellows." +?ELS51: ZERO? MAN-FLAG /?ELS57 + PRINTR "The man looks cross. ""I want the chest, not you!"" he snaps. ""Now stop fooling around and pass it up!""" +?ELS57: PRINTR "You're unable to tie the rope around yourself." +?ELS46: PRINTR "You're unable to tie the rope to that." +?ELS30: EQUAL? PRSA,V?UNTIE \FALSE + ZERO? CHEST-TIED /?ELS75 + SET 'CHEST-TIED,FALSE-VALUE + PRINTR "The chest is now disconnected from the rope." +?ELS75: PRINTR "The rope isn't tied to anything." + + + .FUNCT I-MAN-RETURNS + SET 'ROPE-FLAG,TRUE-VALUE + EQUAL? HERE,CLIFF-LEDGE \FALSE + PRINTI "A familiar voice calls down to you. ""Are you still there?"" he bellows with a coarse laugh. ""Well, then, grab onto the rope and we'll see what we can do."" The rope drops to within your reach." + CRLF + SET 'MAN-FLAG,TRUE-VALUE + CALL QUEUE,I-MAN-LIFT,-1 + PUT STACK,0,1 + RTRUE + + + .FUNCT I-MAN-LIFT + EQUAL? HERE,CLIFF-LEDGE /?ELS5 + CALL QUEUE,I-MAN-LIFT,0 + MOVE CHEST,CLIFF + FSET CHEST,OPENBIT + SET 'CHEST-OPENED,TRUE-VALUE + REMOVE MAN + RFALSE +?ELS5: ZERO? HOLDING-ROPE /?ELS7 + PRINTI "The man starts to heave on the rope and within a few moments you arrive at the top of the cliff. The man removes the last few valuables from the chest and prepares to leave. ""You've been a good sport! Here, take this, for whatever good it is! I can't see that I'll be needing one!"" He hands you a plain wooden staff from the bottom of the chest and begins examining his valuables." + CRLF + CALL QUEUE,I-MAN-LIFT,0 + MOVE STAFF,WINNER + SET 'HOLDING-ROPE,FALSE-VALUE + SET 'ROPE-FLAG,TRUE-VALUE + MOVE WINNER,CLIFF + MOVE CHEST,CLIFF + FSET CHEST,OPENBIT + PRINTI "The chest, open and empty, is at your feet." + CRLF + SET 'CHEST-OPENED,TRUE-VALUE + MOVE MAN,CLIFF + CALL QUEUE,I-MAN-LEAVES,-1 + PUT STACK,0,1 + RTRUE +?ELS7: IGRTR? 'LIFT-WAIT,4 \?ELS14 + PRINTI """Well, I don't have all day. See you around sometime."" Showering you with gravel, he disappears from sight." + CRLF + SET 'MAN-FLAG,FALSE-VALUE + MOVE CHEST,CLIFF + FSET CHEST,OPENBIT + SET 'CHEST-OPENED,TRUE-VALUE + CALL QUEUE,I-MAN-LIFT,0 + RSTACK +?ELS14: PRINTR "The man appears impatient. ""Are you coming up then, or not?""" + + + .FUNCT CHEST-F + ZERO? CHEST-OPENED /?ELS5 + EQUAL? PRSA,V?TIE \?ELS11 + EQUAL? ROPE,PRSO,PRSI \?ELS11 + PRINTR "What's the point?" +?ELS11: EQUAL? PRSA,V?PUT \FALSE + EQUAL? PRSO,STAFF,LAMP,TORCH \FALSE + PRINTR "It doesn't fit." +?ELS5: EQUAL? PRSA,V?UNLOCK,V?OPEN \FALSE + ZERO? MAN-FLAG /?ELS30 + PRINTR "The man calls down to you. ""Is this what you're looking for?"" he cackles, waving a small key over his head. You try to open the chest, but it is locked." +?ELS30: PRINTR "The chest is locked and cannot be opened." + + + .FUNCT I-MAN-LEAVES + EQUAL? HERE,CLIFF /?ELS5 + REMOVE MAN + SET 'MAN-GONE,TRUE-VALUE + SET 'MAN-FLAG,FALSE-VALUE + SET 'ROPE-FLAG,TRUE-VALUE + CALL QUEUE,I-MAN-LEAVES,0 + RFALSE +?ELS5: RANDOM 100 + GRTR? 40,STACK \?ELS7 + PRINTI "Your ""friend"", moving quickly, dodges behind some trees and is lost from sight." + CRLF + REMOVE MAN + SET 'MAN-FLAG,FALSE-VALUE + SET 'MAN-GONE,TRUE-VALUE + SET 'ROPE-FLAG,TRUE-VALUE + CALL QUEUE,I-MAN-LEAVES,0 + RTRUE +?ELS7: PRINTR "Your ""friend"" examines his valuables with great pride." + + + .FUNCT MAN-F + EQUAL? PRSA,V?HELLO \?ELS5 + PRINTR "He responds cheerfully. ""It is a wonderful day, isn't it?""" +?ELS5: CALL HELLO?,MAN + ZERO? STACK /?ELS9 + PRINTR "The man is thoroughly engrossed in the examination of his booty and doesn't seem to hear you." +?ELS9: EQUAL? PRSA,V?EXAMINE \?ELS13 + PRINTR "The man is stocky and of medium height, with several days' growth of stubble on his face. He is carrying a number of valuables under his arm, presumably from the now-open chest." +?ELS13: EQUAL? PRSA,V?KILL,V?ATTACK \FALSE + EQUAL? PRSI,SWORD \?ELS22 + PRINTI "The man is taken by surprise and is hit with the sword. He grabs you and throws you to the ground" + LOC STAFF + EQUAL? STACK,WINNER,HERE \?CND25 + PRINTI ", breaking the staff in the process" + REMOVE STAFF + MOVE BROKEN-STAFF,HERE +?CND25: PRINTI ", but you finish him off with a quick thrust to the chest. He dies, and disappears without ceremony in the usual style of the Great Underground Empire. His assorted valuables remain behind." + CRLF + REMOVE MAN + MOVE VALUABLES,HERE + FCLEAR VALUABLES,NDESCBIT + CALL QUEUE,I-MAN-LEAVES,0 + SET 'MAN-GONE,TRUE-VALUE + RETURN MAN-GONE +?ELS22: PRINTR "You wouldn't hurt him with that!" + + + .FUNCT VALUABLES-F + EQUAL? PRSA,V?MOVE,V?TAKE \FALSE + IN? MAN,CLIFF \FALSE + PRINTR "The man recoils sharply. ""These here things are mine. It's my chest and they're my valuables. You've a lot of nerve trying to take them from me after me saving you like that!""" + + + .FUNCT ROPE-F + EQUAL? PRSA,V?MOVE,V?TAKE \?ELS5 + ZERO? ROPE-FLAG /FALSE + PRINTR "The rope is tied to a tree." +?ELS5: EQUAL? PRSA,V?BURN \?ELS15 + PRINTR "The rope won't catch fire." +?ELS15: EQUAL? PRSA,V?UNTIE \?ELS19 + PRINTR "The rope is very securely tied and cannot be undone." +?ELS19: EQUAL? PRSA,V?CUT \FALSE + EQUAL? PRSI,SWORD \FALSE + PRINTR "The rope is made of pretty tough stuff and won't cut." + + + .FUNCT GLOBAL-MAN-F + EQUAL? HERE,CLIFF \?ELS5 + ZERO? MAN-GONE /?ELS10 + PRINTR "You've lost him among the trees." +?ELS10: PRINTR "You can't see any man here." +?ELS5: ZERO? MAN-FLAG \?ELS19 + PRINTR "You can't see any man here." +?ELS19: EQUAL? PRSA,V?GIVE \?ELS23 + PRINTR "You aren't even close to him!" +?ELS23: EQUAL? PRSA,V?HELLO \?ELS27 + PRINTR "The man waves back in a friendly way." +?ELS27: CALL HELLO?,GLOBAL-MAN + ZERO? STACK /?ELS31 + PRINTI "He yells back, ""What's that you say? I can't hear you very well." + ZERO? CHEST-LIFTED \?ELS36 + PRINTI " Just tie the rope to the chest and we can chat afterwards!"" He smiles broadly." + JUMP ?CND34 +?ELS36: PRINTI """" +?CND34: CRLF + RTRUE +?ELS31: EQUAL? PRSA,V?MUNG,V?ATTACK,V?KILL \?ELS44 + PRINTR "I don't think you'll succeed at this distance." +?ELS44: EQUAL? PRSA,V?THROW \FALSE + EQUAL? PRSI,GLOBAL-MAN \FALSE + IN? PRSO,WINNER \FALSE + PRINTI "The " + PRINTD PRSO + PRINTI " flies upward, but not nearly far enough to hit the man. It does seem to amuse him, however, especially as it passes within inches of your head. ""We're wasting time now. Be a good fellow and tie the rope!""" + CRLF + MOVE PRSO,HERE + RTRUE + + + .FUNCT LAKE-F + EQUAL? PRSA,V?LEAP,V?THROUGH \?ELS5 + EQUAL? HERE,LAKE-SHORE,FAR-SHORE,SOUTH-SHORE \?ELS10 + CALL GO-ON-LAKE + RSTACK +?ELS10: EQUAL? HERE,ON-LAKE \?ELS12 + CALL GOTO,IN-LAKE + RSTACK +?ELS12: PRINTR "Just where do you think you are?" +?ELS5: EQUAL? PRSA,V?LOOK-UNDER \FALSE + EQUAL? HERE,ON-LAKE \?ELS23 + PRINTR "You can't quite make out the bottom of the lake from here..." +?ELS23: PRINTR "You can't see under the surface from here." + + + .FUNCT IN-LAKE-F,RARG + EQUAL? RARG,M-ENTER \?ELS5 + CALL QUEUE,I-IN-LAKE,3 + PUT STACK,0,1 + RTRUE +?ELS5: EQUAL? RARG,M-BEG \?ELS7 + EQUAL? PRSA,V?TAKE \?ELS7 + EQUAL? PRSO,SHINY-OBJECT /?ELS7 + CALL WEIGHT,WINNER + GRTR? STACK,25 \?ELS14 + PRINTR "You can't carry that much underwater." +?ELS14: FSET? PRSO,TAKEBIT /?ELS18 + PRINTR "You can't take that!" +?ELS18: RANDOM 100 + GRTR? 30,STACK \FALSE + PRINTI "The " + PRINTD PRSO + PRINTR " is yours for a moment, but drops from your grasp." +?ELS7: EQUAL? RARG,M-END \FALSE + RANDOM 100 + GRTR? 10,STACK \?ELS31 + PRINTR "A large and hungry-looking fish is swimming in the neighborhood." +?ELS31: RANDOM 100 + GRTR? 4,STACK \?ELS35 + ZERO? INVIS \?ELS35 + CALL QUEUE,I-ROC,0 + CALL QUEUE,I-ON-LAKE,0 + CALL JIGS-UP,STR?205 + RSTACK +?ELS35: IN? SHINY-OBJECT,HERE \FALSE + EQUAL? MOVES,LAST-MOVES /TRUE + RANDOM 100 + GRTR? 40,STACK \?ELS44 + PRINTI "Out of the corner of your eye, a small, shiny object appears in the sand. A moment later, it is gone!" + CRLF + JUMP ?CND40 +?ELS44: RANDOM 100 + GRTR? 70,STACK \?ELS48 + PRINTI "You catch a brief glimpse of something shiny in the sand." + CRLF + JUMP ?CND40 +?ELS48: PRINTI "Something sparkling in the sand catches your eye for a moment." + CRLF +?CND40: SET 'LAST-MOVES,MOVES + RETURN LAST-MOVES + + + .FUNCT I-IN-LAKE + EQUAL? HERE,IN-LAKE \FALSE + PRINTI "You run out of air and return to the surface." + CRLF + CALL GOTO,ON-LAKE + RSTACK + + + .FUNCT ON-LAKE-F,RARG + EQUAL? RARG,M-ENTER \?ELS5 + CALL QUEUE,I-IN-LAKE,0 + ZERO? LAKE-POINT \FALSE + INC 'SCORE + SET 'LAKE-POINT,TRUE-VALUE + RETURN LAKE-POINT +?ELS5: EQUAL? RARG,M-BEG \FALSE + EQUAL? PRSA,V?LEAP \FALSE + ZERO? PRSO \FALSE + CALL DO-WALK,P?DOWN + RTRUE + + + .FUNCT GO-ON-LAKE,F,N,TOLD=0 + FIRST? WINNER >F \?CND1 +?PRG4: NEXT? F >N /?KLU31 +?KLU31: FSET? F,WEARBIT /?CND6 + MOVE F,IN-LAKE + EQUAL? F,TORCH \?ELS11 + REMOVE TORCH + MOVE FRIED-TORCH,IN-LAKE + JUMP ?CND9 +?ELS11: EQUAL? F,LAMP \?ELS13 + MOVE LAMP,LOCAL-GLOBALS + MOVE FRIED-LAMP,IN-LAKE + SET 'CURRENT-LAMP,FRIED-LAMP + JUMP ?CND9 +?ELS13: EQUAL? F,WAYBREAD \?CND9 + REMOVE WAYBREAD +?CND9: ZERO? TOLD \?CND6 + SET 'TOLD,TRUE-VALUE + PRINTI "The shock of entering the frigid water has made you drop all your possessions into the lake!" + CRLF +?CND6: ZERO? N \?ELS23 + JUMP ?CND1 +?ELS23: SET 'F,N + JUMP ?PRG4 +?CND1: ZERO? TOLD \?CND26 + PRINTI "You are nearly paralyzed by the icy waters as you swim into the center of the lake." + CRLF +?CND26: CRLF + CALL GOTO,ON-LAKE + SET 'LAKE-TIME,0 + CALL QUEUE,I-ON-LAKE,-1 + PUT STACK,0,1 + RTRUE + + + .FUNCT I-ON-LAKE + INC 'LAKE-TIME + RANDOM 100 + GRTR? 10,STACK \?ELS5 + EQUAL? HERE,ON-LAKE \?ELS5 + ZERO? INVIS \?ELS5 + PRINTI "A giant roc, previously hidden among the rocks, is heading right toward you, its mouth gaping wide!" + CRLF + CALL QUEUE,I-ROC,2 + PUT STACK,0,1 + RTRUE +?ELS5: EQUAL? HERE,ON-LAKE,IN-LAKE /?ELS11 + CALL QUEUE,I-ON-LAKE,0 + CALL QUEUE,I-IN-LAKE,0 + CALL QUEUE,I-ROC,0 + RFALSE +?ELS11: EQUAL? LAKE-TIME,4 \?ELS13 + PRINTR "The icy waters are taking their toll. You will not be able to hold out much longer." +?ELS13: EQUAL? LAKE-TIME,6 \?ELS17 + PRINTR "You are becoming very weak. You had better leave the water before you drown!" +?ELS17: EQUAL? LAKE-TIME,8 \FALSE + CALL QUEUE,I-ON-LAKE,0 + CALL QUEUE,I-IN-LAKE,0 + CALL QUEUE,I-ROC,0 + CALL JIGS-UP,STR?206 + RSTACK + + + .FUNCT I-ROC + EQUAL? HERE,ON-LAKE \FALSE + ZERO? INVIS \FALSE + CALL QUEUE,I-ON-LAKE,0 + CALL QUEUE,I-IN-LAKE,0 + CALL JIGS-UP,STR?207 + RSTACK + + + .FUNCT SHINY-OBJECT-F + EQUAL? PRSA,V?FIND,V?TAKE \FALSE + IN? AMULET,WINNER /FALSE + RANDOM 100 + GRTR? 50,STACK \?ELS12 + REMOVE SHINY-OBJECT + MOVE AMULET,WINNER + SET 'P-IT-OBJECT,AMULET + SET 'P-IT-LOC,HERE + FCLEAR AMULET,NDESCBIT + PRINTR "You reach the shiny object. It is a simple golden amulet!" +?ELS12: PRINTR "The shiny object slips from your grasp and back onto the floor of the lake, where it is covered in sand." + + + .FUNCT SAND-F + EQUAL? PRSA,V?DIG \?ELS5 + PRINTR "You don't come across anything unusual." +?ELS5: EQUAL? PRSA,V?EXAMINE \?ELS9 + PRINTR "There is nothing notable on the floor of the lake, except some plants and algae." +?ELS9: EQUAL? PRSA,V?TAKE \FALSE + PRINTR "It slips through your fingers." + + + .FUNCT ALGAE-F + EQUAL? PRSA,V?EAT \FALSE + PRINTR "Yeecchhhh!" + + + .FUNCT FRIED-LAMP-F + EQUAL? PRSA,V?LAMP-ON \FALSE + PRINTR "The lamp isn't functioning (probably from having gotten wet)." + + + .FUNCT I-VIEW-SNAP + PRINTI "You suddenly find yourself back in the viewing room!" + CRLF + CALL GOTO,VIEW-ROOM,FALSE-VALUE + RTRUE + + + .FUNCT VIEWING-TABLE-F,L + EQUAL? PRSA,V?RUB \?ELS5 + ADD SCORE,VIEW-POINT >SCORE + SET 'VIEW-POINT,0 + PRINTI "You touch the table and are instantly transported to another place!" + CRLF + CRLF + CALL QUEUE,I-VIEW-SNAP,3 + PUT STACK,0,1 + GET VIEW-ROOMS,ACTIVE-VIEW + CALL GOTO,STACK + RTRUE +?ELS5: EQUAL? PRSA,V?LOOK-INSIDE,V?EXAMINE \FALSE + PRINTI "The surface is pale and featureless, but slowly, an image takes shape!" + CRLF + GET VIEWS,ACTIVE-VIEW + PRINT STACK + CRLF + PRINTR "The image slowly fades." + + + .FUNCT I-VIEW-CHANGE + INC 'ACTIVE-VIEW + EQUAL? ACTIVE-VIEW,5 \?CND1 + SET 'ACTIVE-VIEW,1 +?CND1: CALL QUEUE,I-VIEW-CHANGE,4 + EQUAL? HERE,VIEW-ROOM \FALSE + PRINTI "The indicator above the table flickers briefly, then changes to """ + GET VIEW-ROMANS,ACTIVE-VIEW + PRINT STACK + PRINTR """." + + + .FUNCT VIEW-ROOM-F,RARG + EQUAL? RARG,M-LOOK \FALSE + PRINTI "You are in a small chamber carved in the rock, with the sole exit to the north. Mounted on one wall is a table labelled ""Scenic Vista,"" whose featureless surface is angled toward you. One might believe that the table was used to indicate points of interest in the view from this spot, like those found in many parks. On the other hand, your surroundings are far from spacious and by no stretch of the imagination could this spot be considered scenic. An indicator above the table reads """ + GET VIEW-ROMANS,ACTIVE-VIEW + PRINT STACK + PRINTR """." + + + .FUNCT CLIFF-OBJECT-F + EQUAL? HERE,CLIFF \?ELS5 + EQUAL? PRSA,V?LEAP \?ELS10 + CALL JIGS-UP,STR?41 + RSTACK +?ELS10: EQUAL? PRSA,V?CLIMB-DOWN \?ELS12 + ZERO? ROPE-FLAG /?ELS17 + CALL GOTO,CLIFF-LEDGE + RTRUE +?ELS17: PRINTR "The fall would kill you." +?ELS12: EQUAL? PRSA,V?THROW-OFF \FALSE + EQUAL? PRSI,CLIFF-OBJECT \FALSE + EQUAL? PRSO,ROPE \?ELS29 + PRINTR "The rope is dangling over the side of the cliff already." +?ELS29: IN? PRSO,WINNER /?CND27 + PRINTI "You aren't holding the " + PRINTD PRSO + PRINTR "." +?CND27: MOVE PRSO,CLIFF-LEDGE + PRINTI "The " + PRINTD PRSO + PRINTI " goes over the cliff and lands among the rocks below." + CRLF + EQUAL? PRSO,LAMP \?ELS40 + REMOVE PRSO + MOVE BROKEN-LAMP,CLIFF-LEDGE + SET 'CURRENT-LAMP,BROKEN-LAMP + RTRUE +?ELS40: EQUAL? PRSO,STAFF \TRUE + REMOVE PRSO + MOVE BROKEN-STAFF,CLIFF-LEDGE + RTRUE +?ELS5: EQUAL? PRSA,V?CLIMB-UP \?ELS44 + PRINTR "You haven't enough strength to climb the cliff." +?ELS44: PRINTR "The cliff is above you!" + + + .FUNCT TREE-F + EQUAL? PRSA,V?CLIMB-FOO,V?CLIMB-UP \?ELS5 + PRINTR "The trunks are too large for you to climb them." +?ELS5: EQUAL? PRSA,V?LOOK-INSIDE,V?EXAMINE \?ELS9 + ZERO? MAN-SEEN \?ELS9 + PRINTR "There seems to be nobody there, but it's hard to tell." +?ELS9: EQUAL? PRSA,V?BURN \FALSE + CALL JIGS-UP,STR?216 + RSTACK + + + .FUNCT FRIED-TORCH-F + EQUAL? PRSA,V?LAMP-ON \FALSE + PRINTR "It's hopeless. The torch is wet." + + + .FUNCT TORCH-F + EQUAL? PRSA,V?LAMP-ON \?ELS5 + FSET? TORCH,ONBIT \?ELS10 + PRINTR "It's already lit." +?ELS10: PRINTR "You have nothing to light it with." +?ELS5: EQUAL? PRSA,V?LAMP-OFF \FALSE + FSET? TORCH,ONBIT \?ELS23 + PRINTI "You manage to extinguish the flame." + CRLF + FCLEAR TORCH,ONBIT + RTRUE +?ELS23: PRINTR "It has already been extinguished." + + + .FUNCT NO-OBJS,RARG,F + EQUAL? RARG,M-BEG \FALSE + FIRST? WINNER >F /?KLU13 +?KLU13: SET 'EMPTY-HANDED,TRUE-VALUE +?PRG6: ZERO? F /FALSE + CALL WEIGHT,F + GRTR? STACK,4 \?CND8 + SET 'EMPTY-HANDED,FALSE-VALUE + RFALSE +?CND8: NEXT? F >F /?KLU14 +?KLU14: JUMP ?PRG6 + + + .FUNCT REPELLENT-FCN + EQUAL? PRSA,V?SHAKE \?ELS5 + ZERO? SPRAY-USED? /?ELS10 + PRINTR "The can seems empty." +?ELS10: PRINTR "There is a sloshing sound from inside." +?ELS5: EQUAL? PRSA,V?BURN \?ELS19 + CALL JIGS-UP,STR?226 + RSTACK +?ELS19: EQUAL? PRSA,V?PUT,V?SPRAY \FALSE + EQUAL? PRSO,REPELLENT \FALSE + ZERO? SPRAY-USED? /?ELS28 + PRINTR "The repellent is all gone." +?ELS28: ZERO? PRSI \?ELS33 + SET 'SPRAY-USED?,TRUE-VALUE + PRINTR "The spray stinks amazingly for a few moments, then drifts away." +?ELS33: EQUAL? PRSI,ME \?CND38 + CALL QUEUE,I-SPRAY,5 + PUT STACK,0,1 + SET 'SPRAYED?,TRUE-VALUE +?CND38: SET 'SPRAY-USED?,TRUE-VALUE + PRINTR "The spray smells like a mixture of old socks and burning rubber. If I were a grue I'd sure stay clear!" + + + .FUNCT I-SPRAY + SET 'SPRAYED?,FALSE-VALUE + PRINTR "That horrible smell is much less pungent now." + + + .FUNCT ZORK-IV-F,RARG + EQUAL? RARG,M-ENTER \FALSE + CALL JIGS-UP,STR?227 + RSTACK + + + .FUNCT AQUEDUCT-F + EQUAL? PRSA,V?EXAMINE \?ELS5 + PRINTR "The aqueduct is large and impressive. It was probably the major method of water transport in the Empire." +?ELS5: EQUAL? PRSA,V?LEAP \FALSE + CALL JIGS-UP,STR?238 + RSTACK + + + .FUNCT WATER-CHANNEL-F + EQUAL? PRSA,V?EXAMINE \?ELS5 + PRINTR "The channel is a few feet deep and ten feet wide, rounded on the bottom." +?ELS5: EQUAL? PRSA,V?BOARD \FALSE + EQUAL? HERE,DAMP-PASSAGE \?ELS14 + PRINTR "Getting into the channel wouldn't be of much use." +?ELS14: PRINTR "You're standing in it. Otherwise, you would be floating in midair above some very nasty rocks." + + + .FUNCT MOSS-F + EQUAL? PRSA,V?MOVE,V?TAKE \FALSE + PRINTR "Don't be silly." + + + .FUNCT AQ-2-F,RARG + EQUAL? RARG,M-LOOK \FALSE + PRINTI "You are now on one of the tallest arches of the aqueduct, hundreds of feet above a rocky chasm. The immensity of the aqueduct project is apparent from here. Stone supports rise from the rock floor to form massive arches, which traverse the region from north to south. The water-carrying channel here is wide and deep. To the west and far below, you can make out a balcony which must command a wide view of the aqueduct." + CRLF + ZERO? AQ-FLAG \FALSE + PRINTR "The channel ends abruptly to your north where a supporting pillar has crumbled, casting the arch into the chasm." + + + .FUNCT AQ-3-F,RARG + EQUAL? RARG,M-LOOK \FALSE + PRINTI "You are near the northern end of this segment of the aqueduct system. To the south and slightly uphill, the bulk of the aqueduct looms ominously, towering above a gorge. To the north, the water channel drops precipitously and enters a rocky hole. The damp moss and lichen would certainly make that a one-way trip." + CRLF + ZERO? AQ-FLAG \FALSE + PRINTR "The southern part of the aqueduct system is inaccessable due to the collapse of one of the water-bearing arches." + + + .FUNCT COVER-F + EQUAL? PRSA,V?OPEN,V?RAISE,V?MOVE \?ELS5 + PRINTI "The cover is moved a bit to one side, revealing a small hole leading into darkness." + CRLF + SET 'COVER-MOVED,TRUE-VALUE + RETURN COVER-MOVED +?ELS5: EQUAL? PRSA,V?TAKE \FALSE + PRINTR "The cover is far too heavy to take." + + + .FUNCT KEY-ROOM-F,RARG + EQUAL? RARG,M-LOOK \FALSE + PRINTI "You are between some rock and a dark place, The room is lit dimly from above, revealing a lone, dark path sloping down to the west." + CRLF + ZERO? COVER-MOVED /?ELS12 + PRINTR "A heavy manhole cover has been moved to reveal a dark passage below." +?ELS12: PRINTR "To one side of the room is a large manhole cover." + + + .FUNCT KEY-F + EQUAL? PRSA,V?UNLOCK \?ELS5 + EQUAL? PRSI,KEY \?ELS5 + EQUAL? PRSO,BRONZE-DOOR \?ELS12 + EQUAL? HERE,GOOD-CELL \?ELS12 + ZERO? BRONZE-DOOR-LOCKED /?ELS17 + PRINTI "The key seems to mold itself to the shape of the lock. With a mere twist of your hand, the massive bolt gives way." + CRLF + JUMP ?CND15 +?ELS17: PRINTI "It already is." + CRLF +?CND15: SET 'BRONZE-DOOR-LOCKED,FALSE-VALUE + RTRUE +?ELS12: EQUAL? PRSO,BRONZE-DOOR \?ELS26 + PRINTR "The key molds itself to the lock but will not turn." +?ELS26: EQUAL? PRSO,CHEST /?THN31 + FSET? PRSO,DOORBIT \FALSE +?THN31: PRINTR "The key, which initially seemed certain to fit the lock, seems to change shape and will not enter the keyhole." +?ELS5: EQUAL? PRSA,V?EXAMINE \FALSE + CALL PICK-ONE,KEY-DESCS + PRINT STACK + CRLF + PRINTR "Strange, though. The key seems to change shape constantly." + + + .FUNCT VIEW-INDICATOR-F + EQUAL? PRSA,V?READ,V?EXAMINE \FALSE + PRINTI "The indicator reads """ + GET VIEW-ROMANS,ACTIVE-VIEW + PRINT STACK + PRINTR """." + + + .FUNCT FLATHEAD-OCEAN-F,RARG + EQUAL? RARG,M-LOOK \?ELS5 + PRINTI "You are at the shore of an amazing underground sea, the topic of many a legend among adventurers. Few were known to have arrived at this spot, and fewer to return. There is a heavy surf and a breeze is blowing on-shore. The land rises steeply to the east and quicksand prevents movement to the south. A thick mist covers the ocean and extends over the hills to the east. A path heads north along the beach." + CRLF + FSET? VIKING-SHIP,INVISIBLE /TRUE + PRINTR "An ancient Viking ship is passing along the shore, an old and crusty sailor at the helm." +?ELS5: EQUAL? RARG,M-END \FALSE + RANDOM 100 + GRTR? 20,STACK \FALSE + ZERO? BOAT-SEEN \FALSE + ZERO? LIT /FALSE + SET 'BOAT-SEEN,TRUE-VALUE + CALL QUEUE,I-BOAT-DISAPPEAR,2 + PUT STACK,0,1 + PRINTI "Passing alongside the shore now is an old boat, reminiscent of an ancient Viking ship. Standing on the prow of the ship is an old and crusty sailor, peering out over the misty ocean." + CRLF + FCLEAR VIKING-SHIP,INVISIBLE + RTRUE + + + .FUNCT SAILOR-F + EQUAL? PRSA,V?HELLO \FALSE + FSET? VIKING-SHIP,INVISIBLE /?ELS10 + PRINTI "The seaman looks up and maneuvers the boat toward shore. He cries out ""I have waited three ages for someone to say those words and save me from sailing this endless ocean. Please accept this gift. You may find it useful!"" He throws something which falls near you in the sand, then sails off toward the west, singing a lively, but somewhat uncouth, sailor song." + CRLF + FSET VIKING-SHIP,INVISIBLE + MOVE VIAL,HERE + RTRUE +?ELS10: EQUAL? HERE,FLATHEAD-OCEAN \?ELS14 + ZERO? SHIP-GONE /?ELS19 + PRINTR "Nothing happens anymore." +?ELS19: PRINTR "Nothing happens yet." +?ELS14: PRINTR "Nothing happens here." + + + .FUNCT I-BOAT-DISAPPEAR + FSET VIKING-SHIP,INVISIBLE + SET 'SHIP-GONE,TRUE-VALUE + EQUAL? HERE,FLATHEAD-OCEAN \FALSE + PRINTR "The boat sails silently through the mist and out of sight." + + + .FUNCT I-VISIBLE + SET 'INVIS,FALSE-VALUE + EQUAL? HERE,MRG,MRGE,MRGW \FALSE + CALL JIGS-UP,STR?245 + RFALSE + + + .FUNCT POTION-F + EQUAL? PRSA,V?DRINK \?ELS5 + REMOVE POTION + SET 'INVIS,TRUE-VALUE + CALL QUEUE,I-VISIBLE,3 + PUT STACK,0,1 + PRINTR "You ""drink"" the contents in one gulp, but nothing unusual seems to have happened as a result." +?ELS5: EQUAL? PRSA,V?POUR-ON \?ELS9 + EQUAL? PRSO,POTION \?ELS9 + REMOVE POTION + PRINTI "It spills onto the " + PRINTD PRSI + PRINTR " and vanishes." +?ELS9: EQUAL? PRSA,V?EXAMINE \?ELS15 + PRINTR "It feels like there's something inside, but you can't see anything even though the vial is transparent." +?ELS15: EQUAL? PRSA,V?SMELL \?ELS19 + PRINTR "The vial (or something in it) smells sweet." +?ELS19: EQUAL? PRSA,V?TAKE,V?DROP \FALSE + PRINTI "Nothing seems to come out, although the sweet smell disappears from the vial, seeming to permeate the air briefly before fading entirely." + CRLF + REMOVE POTION + RTRUE + + + .FUNCT VIAL-F + EQUAL? PRSA,V?FILL \?ELS5 + PRINTR "You can't seem to put anything in it." +?ELS5: EQUAL? PRSA,V?DRINK-FROM \?ELS9 + IN? POTION,VIAL \?ELS9 + CALL PERFORM,V?DRINK,POTION + RTRUE +?ELS9: EQUAL? PRSA,V?SMELL \?ELS13 + IN? POTION,VIAL \?ELS13 + CALL PERFORM,V?SMELL,POTION + RTRUE +?ELS13: EQUAL? PRSA,V?SHAKE \?ELS17 + IN? POTION,VIAL \?ELS17 + FSET? VIAL,OPENBIT \?ELS17 + PRINTI "Nothing seems to come out, although the vial is lighter now." + CRLF + REMOVE POTION + RTRUE +?ELS17: EQUAL? PRSA,V?OPEN \?ELS23 + FSET VIAL,OPENBIT + PRINTI "The vial is open." + IN? POTION,VIAL \?CND26 + PRINTI " There is a sweet odor from within the vial, apparently coming from a heavy but invisible liquid." +?CND26: CRLF + RTRUE +?ELS23: EQUAL? PRSA,V?EXAMINE \FALSE + PRINTI "It is a small, transparent vial " + IN? POTION,VIAL \?ELS39 + PRINTR "which looks empty but is strangely heavy." +?ELS39: PRINTR "which is light and empty." + + + .FUNCT OCEAN-F + EQUAL? HERE,FLATHEAD-OCEAN /?ELS5 + PRINTR "There is no ocean here." +?ELS5: EQUAL? PRSA,V?BOARD,V?THROUGH \?ELS9 + PRINTR "You would be killed by the pounding surf!" +?ELS9: EQUAL? PRSA,V?THROW,V?PUT \FALSE + EQUAL? PRSI,OCEAN \FALSE + PRINTI "The " + PRINTD PRSO + PRINTI " falls into the ocean and is lost forever." + CRLF + REMOVE PRSO + RTRUE + + + .FUNCT STONE-DESC,FOO + PRINTI "Standing before you is a great rock." + ZERO? SWORD-IN-STONE? /?CND3 + PRINTI " Imbedded within it is an Elvish sword." +?CND3: CRLF + RTRUE + + + .FUNCT STONE-F + EQUAL? PRSA,V?CLOSE,V?OPEN \?ELS5 + PRINTR "You can't be serious." +?ELS5: EQUAL? PRSA,V?PUT \?ELS9 + EQUAL? PRSI,STONE \?ELS9 + PRINTR "You can't force anything into the stone." +?ELS9: EQUAL? PRSA,V?PUSH,V?TAKE,V?MOVE \?ELS15 + EQUAL? PRSO,STONE \?ELS15 + PRINTR "The stone is far too massive to be moved." +?ELS15: EQUAL? PRSA,V?LOOK-UNDER \FALSE + PRINTR "Since it can't be moved, it's hard to know what's there." + + + .FUNCT FISH-F + PRINTR "There is no fish visible now." + + + .FUNCT QUICKSAND-PSEUDO + EQUAL? PRSA,V?LEAP,V?THROUGH \?ELS5 + CALL JIGS-UP,STR?246 + RSTACK +?ELS5: EQUAL? PRSA,V?RUB \?ELS7 + PRINTR "It's quicksand alright!" +?ELS7: EQUAL? PRSA,V?LOOK-INSIDE \FALSE + PRINTR "It's hard to tell what's in there." + + + .FUNCT SWAMP-PSEUDO + EQUAL? PRSA,V?THROUGH \FALSE + PRINTR "Yucko." + + + .FUNCT MIST-PSEUDO + EQUAL? PRSA,V?LOOK-INSIDE \?ELS5 + PRINTR "You can't make anything out through the mist." +?ELS5: EQUAL? PRSA,V?SMELL \FALSE + PRINTR "It smells vaguely salty." + + + .FUNCT SHORE-PSEUDO + EQUAL? PRSA,V?DIG \FALSE + PRINTR "There's nothing there." + + + .FUNCT WATERFALL-PSEUDO + EQUAL? PRSA,V?CLIMB-UP \FALSE + PRINTR "It's much too slippery." + + + .FUNCT ARCH-PSEUDO + EQUAL? PRSA,V?EXAMINE \FALSE + ZERO? AQ-FLAG /?ELS10 + PRINTR "The arches all show some signs of decay." +?ELS10: PRINTR "The arch before you is broken. The others show signs of decay." + + .ENDI diff --git a/shadow.zil b/shadow.zil new file mode 100644 index 0000000..ad33cce --- /dev/null +++ b/shadow.zil @@ -0,0 +1,2236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +> + +> + +> 0> + ) + (> + > + > + + >)>)>> + >> + +)) + + + >)> + + + + "." CR>) + (T )> + CR>) + ( <==? ,PRSI ,SHADOW>> + ) + ( + ) + ( <==? ,PRSI ,SWORD>> + + > + )> + ) + ( + + + > + >)>> + +> + + + + +> +> + +> + >)> + > + >)> + 10>> + )> + > + + + > + + >)> + 10>> + + > + + + )> + CR> + CR>) + (T + > + ) + ( + + )> + + CR>)>) + (T + + ) + (T CR>)>)>> + +> + +> + +> + + >> + + > + )> + 10>> > + + > 1> + + ) + (T + CR>)>) + (T + > 1> + ) + (T + )>)>) + ( + ) + (T + CR>)>> + +> + + + + + >> + + > + ) + ( > + + + + + + + + ) + (<==? ,S-STRENGTH 2> + ) + (T + )>)>> + + > + ) + ( > + )>> + + CR>> + +> + +> + + + + <==? ,PRSO ,BLOCKED-DIR>> + ) + (<==? .RARG ,M-END> + > + > + )> + ) + ( + > + + > + >)>) + ( + ) + ( ,LIT > + > + + + "ern exit from the room and carrying a +brightly glowing sword." CR> + + )>)>> + + + + > + )> + > + + ) + (T + )> + >)>> + +> +> + + + > + )>> + +;" Cooperative Problem" +y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <==? ,PRSI ,LEDGE>> + > + + )> + + )>> + + + + <==? ,PRSI ,SWORD>> + + )>> + + + + + + + + + + + + <==? ,PRSI ,TORCH>> + + )>> + + + + + + + + + +> + +> + ,CLIFF-LEDGE ,WINNER>>> + ) + (,CHEST-TIED + + + + + + > + > + > + ) + (T + + + + >)>> + +> + +> + + > + + > + ) + (> 10> + + + > + ) + (T CR>)>> + + + ,CHEST-TIED> + > + > + )>> + +> + + +> +> +> + + + + + ,CHEST-TIED> + ) + ( + + + > + + > + )> + >) + (<==? .RARG ,M-LOOK> + + )> + )>> + + > + + + + + > + + ) + (<==? .RARG ,M-LOOK> + + )> + ) + ( + + >> + ) + ( + > + )>> + + + ) + ( + + ) + ( + + ) + (T + )>) + ( + ) + ( + + + + > + + + + > + > + > + > + )> + ) + ( + > + ) + (,MAN-FLAG + ) + (T + )>) + (T + )>) + ( + > + ) + (T + )>)>> + +> +> + + + + + + > + )>> + + + +> + + + + + + ) + (,HOLDING-ROPE + + + + > + + + + + + + + > + ) + (> 4> + + > + + + + ) + (T + )>> + +> + + <==? ,ROPE ,PRSO ,PRSI>> + ) + ( > + ) + (T )>) + ( + ) + (T )>)>> + + + +> + + + > + + + ) + ( + + + > + + + + ) + (T + )>> + + + ) + ( + ) + ( + ) + ( + + + ,WINNER ,HERE> + + + )> + + + + + + ) + (T )>)>> + + > + )>> + + + )>) + ( + ) + ( + ) + ( <==? ,PRSI ,SWORD>> + )>> + + + ) + (T + )>) + ( + ) + ( + ) + ( + ) + ( + + + ) + (T )> + ) + ( + ) + ( <==? ,PRSI ,GLOBAL-MAN> > + + )>> + + + + ) + (<==? ,HERE ,ON-LAKE> + ) + (T + )>) + ( + + ) + (T )>)>> + + + >) + ( + + >> + 25> + ) + (> + ) + ( + )>) + (<==? .RARG ,M-END> + + ) + ( > + + + ) + ( + ) + ( + ) + ( + ) + (T + )> + )>)>> + + + + + + )>> + +> + + + + + > + )>) + ( > + + )>> + + + +)) + > + > + > + + + + ) + ( + + + ) + (<==? .F ,WAYBREAD> + )> + + + )>)> + ) + (T )>>)> + + )> + + + + >> + +> + +> + <==? ,HERE ,ON-LAKE> > +