482 lines
11 KiB
Plaintext
482 lines
11 KiB
Plaintext
|
|
|
|
.FUNCT GO
|
|
START::
|
|
|
|
?FCN: CALL QUEUE,I-UNWOUND,20
|
|
PUT STACK,0,1
|
|
CALL QUEUE,I-BUSINESS-HOURS,60
|
|
PUT STACK,0,1
|
|
CALL QUEUE,I-FERRY-APPROACHING,117
|
|
PUT STACK,0,1
|
|
CALL QUEUE,I-FERRY,120
|
|
PUT STACK,0,1
|
|
CALL QUEUE,I-HUNGER,15
|
|
PUT STACK,0,1
|
|
CALL QUEUE,I-THIRST,25
|
|
PUT STACK,0,1
|
|
CALL QUEUE,I-TIRED,929
|
|
PUT STACK,0,1
|
|
CALL QUEUE,I-LIVER,10
|
|
PUT STACK,0,1
|
|
CALL QUEUE,I-DRILL,5
|
|
CALL QUEUE,I-MM-COMPRESSOR,80
|
|
CALL QUEUE,I-PLOT-NEVER-STARTS,60
|
|
PUT STACK,0,1
|
|
SET 'LIT,TRUE-VALUE
|
|
SET 'SCORE,8
|
|
SET 'WINNER,ADVENTURER
|
|
SET 'PLAYER,WINNER
|
|
SET 'SAMPLE-TREASURE,GLOBAL-OBJECTS
|
|
CALL PUT-IN-TABLE,ENVELOPE,MCGINTY-HQ,GLOBAL-SURFACE
|
|
SET 'HERE,BEDROOM
|
|
SET 'P-IT-OBJECT,FALSE-VALUE
|
|
FSET? HERE,TOUCHBIT /?CND1
|
|
CALL START-MOVEMENT
|
|
CALL TELL-START-STR
|
|
CRLF
|
|
CALL V-VERSION
|
|
CRLF
|
|
?CND1: MOVE WINNER,BED
|
|
CALL V-LOOK
|
|
CALL MAIN-LOOP
|
|
JUMP ?FCN
|
|
|
|
|
|
.FUNCT MAIN-VERB-PRINT,TMP,?TMP1
|
|
GET P-ITBL,P-VERBN >TMP
|
|
ZERO? P-OFLAG /?ELS5
|
|
GET TMP,0
|
|
PRINTB STACK
|
|
RTRUE
|
|
?ELS5: GETB TMP,2 >?TMP1
|
|
GETB TMP,3
|
|
CALL WORD-PRINT,?TMP1,STACK
|
|
RSTACK
|
|
|
|
|
|
.FUNCT MAIN-LOOP,ICNT,OCNT,NUM,CNT,OBJ,TBL,V,PTBL,OBJ1,TMP,PLACE
|
|
?PRG1: SET 'CNT,0
|
|
SET 'OBJ,FALSE-VALUE
|
|
SET 'PTBL,TRUE-VALUE
|
|
SET 'WAITED?,FALSE-VALUE
|
|
SET 'P-WALK-DIR,FALSE-VALUE
|
|
EQUAL? HERE,QCONTEXT-ROOM /?CND3
|
|
SET 'QCONTEXT,FALSE-VALUE
|
|
?CND3: CALL PARSER >P-WON
|
|
ZERO? P-WON /?ELS8
|
|
LOC PLAYER >LAST-PLAYER-LOC
|
|
GET P-PRSI,P-MATCHLEN >ICNT
|
|
GET P-PRSO,P-MATCHLEN >OCNT
|
|
ZERO? P-IT-OBJECT /?CND9
|
|
CALL ACCESSIBLE?,P-IT-OBJECT
|
|
ZERO? STACK /?CND9
|
|
SET 'TMP,FALSE-VALUE
|
|
?PRG14: IGRTR? 'CNT,ICNT \?ELS18
|
|
JUMP ?REP15
|
|
?ELS18: GET P-PRSI,CNT
|
|
EQUAL? STACK,IT \?PRG14
|
|
PUT P-PRSI,CNT,P-IT-OBJECT
|
|
SET 'TMP,TRUE-VALUE
|
|
?REP15: ZERO? TMP \?CND24
|
|
SET 'CNT,0
|
|
?PRG27: IGRTR? 'CNT,OCNT \?ELS31
|
|
JUMP ?CND24
|
|
?ELS31: GET P-PRSO,CNT
|
|
EQUAL? STACK,IT \?PRG27
|
|
PUT P-PRSO,CNT,P-IT-OBJECT
|
|
?CND24: SET 'CNT,0
|
|
?CND9: ZERO? OCNT \?ELS41
|
|
PUSH OCNT
|
|
JUMP ?CND37
|
|
?ELS41: GRTR? OCNT,1 \?ELS43
|
|
SET 'TBL,P-PRSO
|
|
ZERO? ICNT \?ELS46
|
|
SET 'OBJ,FALSE-VALUE
|
|
JUMP ?CND44
|
|
?ELS46: GET P-PRSI,1 >OBJ
|
|
?CND44: PUSH OCNT
|
|
JUMP ?CND37
|
|
?ELS43: GRTR? ICNT,1 \?ELS50
|
|
SET 'PTBL,FALSE-VALUE
|
|
SET 'TBL,P-PRSI
|
|
GET P-PRSO,1 >OBJ
|
|
PUSH ICNT
|
|
JUMP ?CND37
|
|
?ELS50: PUSH 1
|
|
?CND37: SET 'NUM,STACK
|
|
ZERO? OBJ \?CND53
|
|
EQUAL? ICNT,1 \?CND53
|
|
GET P-PRSI,1 >OBJ
|
|
?CND53: EQUAL? PRSA,V?WALK \?ELS60
|
|
ZERO? P-WALK-DIR /?ELS60
|
|
CALL PERFORM,PRSA,PRSO >V
|
|
JUMP ?CND58
|
|
?ELS60: ZERO? NUM \?ELS64
|
|
GETB P-SYNTAX,P-SBITS
|
|
BAND STACK,P-SONUMS
|
|
ZERO? STACK \?ELS67
|
|
CALL PERFORM,PRSA >V
|
|
SET 'PRSO,FALSE-VALUE
|
|
JUMP ?CND58
|
|
?ELS67: ZERO? LIT \?ELS69
|
|
CALL TELL-TOO-DARK
|
|
JUMP ?CND58
|
|
?ELS69: ZERO? OBJ /?ELS74
|
|
EQUAL? OBJ,NOT-HERE-OBJECT \?ELS78
|
|
CALL GLOBAL-NOT-HERE-PRINT,OBJ
|
|
JUMP ?CND58
|
|
?ELS78: LOC WINNER >PLACE
|
|
FSET? PLACE,VEHBIT \?ELS80
|
|
LOC OBJ
|
|
EQUAL? PLACE,STACK /?CND58
|
|
PRINTI "You should get "
|
|
FSET? PLACE,SURFACEBIT \?ELS88
|
|
PRINTI "off"
|
|
JUMP ?CND86
|
|
?ELS88: PRINTI "out"
|
|
?CND86: PRINTI " of "
|
|
CALL THE?,PLACE
|
|
CALL DPRINT,PLACE
|
|
PRINTI " first."
|
|
CRLF
|
|
SET 'V,FALSE-VALUE
|
|
JUMP ?CND58
|
|
?ELS80: EQUAL? PRSA,V?GIVE \?ELS100
|
|
CALL TELL-NOTHING,STR?48
|
|
CALL MAIN-VERB-PRINT
|
|
PRINTI "."
|
|
CRLF
|
|
SET 'V,FALSE-VALUE
|
|
JUMP ?CND58
|
|
?ELS100: FSET? OBJ,CONTBIT \?ELS104
|
|
FSET? OBJ,OPENBIT /?ELS104
|
|
PRINTI "Better open the "
|
|
CALL DPRINT,OBJ
|
|
PRINTI " first."
|
|
CRLF
|
|
SET 'P-IT-OBJECT,OBJ
|
|
SET 'V,FALSE-VALUE
|
|
JUMP ?CND58
|
|
?ELS104: FSET? OBJ,CONTBIT /?ELS110
|
|
CALL TELL-NOTHING,STR?49,TRUE-VALUE
|
|
SET 'V,FALSE-VALUE
|
|
JUMP ?CND58
|
|
?ELS110: PRINTI "It's not in that."
|
|
CRLF
|
|
SET 'V,FALSE-VALUE
|
|
JUMP ?CND58
|
|
?ELS74: EQUAL? PRSA,V?$CALL \?ELS116
|
|
CALL V-CALL-LOSE
|
|
SET 'V,FALSE-VALUE
|
|
JUMP ?CND58
|
|
?ELS116: ZERO? P-NONE /?ELS118
|
|
PRINTI "I can't find any here!"
|
|
CRLF
|
|
SET 'V,FALSE-VALUE
|
|
JUMP ?CND58
|
|
?ELS118: PRINTI "There isn't anything to "
|
|
CALL MAIN-VERB-PRINT
|
|
PRINTI " here!"
|
|
CRLF
|
|
SET 'V,FALSE-VALUE
|
|
JUMP ?CND58
|
|
?ELS64: SET 'P-NOT-HERE,0
|
|
SET 'P-MULT,FALSE-VALUE
|
|
GRTR? NUM,1 \?CND130
|
|
SET 'P-MULT,TRUE-VALUE
|
|
?CND130: SET 'TMP,FALSE-VALUE
|
|
?PRG133: IGRTR? 'CNT,NUM \?ELS137
|
|
GRTR? P-NOT-HERE,0 \?ELS140
|
|
PRINTI "The "
|
|
EQUAL? P-NOT-HERE,NUM /?CND143
|
|
PRINTI "other "
|
|
?CND143: PRINTI "object"
|
|
EQUAL? P-NOT-HERE,1 /?CND150
|
|
PRINTI "s"
|
|
?CND150: PRINTI " that you mentioned "
|
|
EQUAL? P-NOT-HERE,1 /?ELS159
|
|
PRINTI "are"
|
|
JUMP ?CND157
|
|
?ELS159: PRINTI "is"
|
|
?CND157: PRINTI "n't here."
|
|
CRLF
|
|
JUMP ?REP134
|
|
?ELS140: ZERO? TMP \?REP134
|
|
PRINTI "I don't know what you're referring to."
|
|
CRLF
|
|
JUMP ?REP134
|
|
?ELS137: ZERO? PTBL /?ELS176
|
|
GET P-PRSO,CNT >OBJ1
|
|
JUMP ?CND174
|
|
?ELS176: GET P-PRSI,CNT >OBJ1
|
|
?CND174: ZERO? PTBL /?ELS184
|
|
PUSH OBJ1
|
|
JUMP ?CND180
|
|
?ELS184: PUSH OBJ
|
|
?CND180: SET 'PRSO,STACK
|
|
ZERO? PTBL /?ELS192
|
|
PUSH OBJ
|
|
JUMP ?CND188
|
|
?ELS192: PUSH OBJ1
|
|
?CND188: SET 'PRSI,STACK
|
|
GRTR? NUM,1 \?CND196
|
|
EQUAL? OBJ1,NOT-HERE-OBJECT \?ELS201
|
|
INC 'P-NOT-HERE
|
|
JUMP ?PRG133
|
|
?ELS201: EQUAL? PRSA,V?TAKE \?ELS203
|
|
ZERO? PRSI /?ELS203
|
|
GET P-ITBL,P-NC1
|
|
GET STACK,0
|
|
EQUAL? STACK,W?ALL \?ELS203
|
|
IN? PRSO,PRSI /?ELS203
|
|
JUMP ?PRG133
|
|
?ELS203: EQUAL? P-GETFLAGS,P-ALL \?ELS207
|
|
EQUAL? PRSA,V?TAKE \?ELS207
|
|
LOC OBJ1
|
|
EQUAL? STACK,WINNER,HERE /?ELS213
|
|
LOC OBJ1
|
|
FSET? STACK,TRANSBIT \?PRG133
|
|
?ELS213: FSET? OBJ1,TAKEBIT /?ELS207
|
|
FSET? OBJ1,TRYTAKEBIT /?ELS207
|
|
JUMP ?PRG133
|
|
?ELS207: EQUAL? P-GETFLAGS,P-ALL \?ELS217
|
|
EQUAL? PRSA,V?DROP \?ELS217
|
|
IN? OBJ1,WINNER /?ELS217
|
|
IN? P-IT-OBJECT,WINNER /?ELS217
|
|
JUMP ?PRG133
|
|
?ELS217: EQUAL? OBJ1,IT \?ELS224
|
|
CALL DPRINT,P-IT-OBJECT
|
|
JUMP ?CND222
|
|
?ELS224: CALL DPRINT,OBJ1
|
|
?CND222: PRINTI ": "
|
|
?CND196: ZERO? PTBL /?ELS233
|
|
PUSH OBJ1
|
|
JUMP ?CND229
|
|
?ELS233: PUSH OBJ
|
|
?CND229: CALL QCONTEXT-CHECK,STACK >V
|
|
SET 'TMP,TRUE-VALUE
|
|
CALL PERFORM,PRSA,PRSO,PRSI >V
|
|
EQUAL? V,M-FATAL \?PRG133
|
|
JUMP ?CND58
|
|
?REP134:
|
|
?CND58: EQUAL? V,M-FATAL /?CND240
|
|
LOC WINNER
|
|
GETP STACK,P?ACTION
|
|
CALL STACK,M-END >V
|
|
?CND240: EQUAL? PRSA,V?FOLLOW,V?WALK,V?AGAIN /?CND243
|
|
EQUAL? PRSA,V?WAIT /?CND243
|
|
CALL GAME-COMMAND?
|
|
ZERO? STACK /?ELS245
|
|
JUMP ?CND243
|
|
?ELS245: SET 'L-PRSA,PRSA
|
|
SET 'L-PRSO,PRSO
|
|
SET 'L-PRSI,PRSI
|
|
SET 'L-WALK-DIR,P-WALK-DIR
|
|
SET 'L-WINNER,WINNER
|
|
?CND243: EQUAL? V,M-FATAL \?CND6
|
|
SET 'P-CONT,FALSE-VALUE
|
|
JUMP ?CND6
|
|
?ELS8: SET 'P-CONT,FALSE-VALUE
|
|
?CND6: ZERO? P-WON /?CND255
|
|
CALL GAME-COMMAND?
|
|
ZERO? STACK /?ELS261
|
|
JUMP ?CND255
|
|
?ELS261: EQUAL? PRSA,V?TELL \?ELS263
|
|
ZERO? PRSI \?ELS263
|
|
JUMP ?CND255
|
|
?ELS263: ZERO? CLOCK-WAIT \?THN268
|
|
ZERO? I-WAIT-DURATION \?ELS267
|
|
?THN268: CALL CLOCKER >V
|
|
CALL DETECTOR-NOISE >V
|
|
JUMP ?CND255
|
|
?ELS267: CALL V-WAIT,I-WAIT-DURATION,FALSE-VALUE >I-WAIT-FLAG
|
|
ZERO? I-WAIT-FLAG /?ELS274
|
|
CALL I-WAIT-RTN
|
|
SET 'I-WAIT-FLAG,FALSE-VALUE
|
|
JUMP ?CND272
|
|
?ELS274: SET 'I-WAIT-DURATION,0
|
|
CALL CLOCKER >V
|
|
?CND272: CALL DETECTOR-NOISE >V
|
|
?CND255: SET 'PRSA,FALSE-VALUE
|
|
SET 'PRSO,FALSE-VALUE
|
|
SET 'PRSI,FALSE-VALUE
|
|
JUMP ?PRG1
|
|
|
|
|
|
.FUNCT GAME-COMMAND?
|
|
EQUAL? PRSA,V?VERBOSE,V?SUPER-BRIEF,V?BRIEF /TRUE
|
|
EQUAL? PRSA,V?RESTART,V?RESTORE,V?SAVE /TRUE
|
|
EQUAL? PRSA,V?UNSCRIPT,V?SCRIPT,V?QUIT /TRUE
|
|
EQUAL? PRSA,V?SCORE,V?VERSION,V?$VERIFY /TRUE
|
|
EQUAL? PRSA,V?TIME /TRUE
|
|
RFALSE
|
|
|
|
|
|
.FUNCT QCONTEXT-CHECK,PRSO,OTHER,WHO=0,N=0
|
|
EQUAL? PRSA,V?LONGITUDE,V?LATITUDE,V?HELP /?THN6
|
|
EQUAL? PRSA,V?GIVE,V?TELL,V?SHOW \FALSE
|
|
EQUAL? PRSO,PLAYER \FALSE
|
|
?THN6: FIRST? HERE >OTHER /?KLU33
|
|
?KLU33:
|
|
?PRG10: ZERO? OTHER \?ELS14
|
|
JUMP ?REP11
|
|
?ELS14: FSET? OTHER,PERSON \?CND12
|
|
EQUAL? OTHER,PLAYER /?CND12
|
|
INC 'N
|
|
SET 'WHO,OTHER
|
|
?CND12: NEXT? OTHER >OTHER /?KLU34
|
|
?KLU34: JUMP ?PRG10
|
|
?REP11: EQUAL? 1,N \?CND19
|
|
ZERO? QCONTEXT \?CND19
|
|
CALL SAID-TO,WHO
|
|
?CND19: ZERO? QCONTEXT /FALSE
|
|
IN? QCONTEXT,HERE \FALSE
|
|
EQUAL? QCONTEXT-ROOM,HERE \FALSE
|
|
EQUAL? WINNER,PLAYER \FALSE
|
|
SET 'WINNER,QCONTEXT
|
|
PRINTI "(said to "
|
|
CALL DPRINT,QCONTEXT
|
|
PRINTR ")"
|
|
|
|
|
|
.FUNCT SAID-TO,WHO
|
|
SET 'WINNER,WHO
|
|
SET 'QCONTEXT,WHO
|
|
SET 'QCONTEXT-ROOM,HERE
|
|
RETURN QCONTEXT-ROOM
|
|
|
|
|
|
.FUNCT PERFORM,A,O=0,I=0,V,OA,OO,OI
|
|
SET 'OA,PRSA
|
|
SET 'OO,PRSO
|
|
SET 'OI,PRSI
|
|
EQUAL? A,V?WALK /?CND1
|
|
EQUAL? IT,I,O \?CND1
|
|
PRINTI "I don't see what you are referring to."
|
|
CRLF
|
|
RETURN 2
|
|
?CND1: SET 'PRSA,A
|
|
SET 'PRSO,O
|
|
ZERO? PRSO /?CND10
|
|
EQUAL? PRSI,IT /?CND10
|
|
EQUAL? PRSA,V?WALK /?CND10
|
|
SET 'P-IT-OBJECT,PRSO
|
|
?CND10: SET 'PRSI,I
|
|
EQUAL? NOT-HERE-OBJECT,PRSO,PRSI \?ELS17
|
|
EQUAL? PRSA,V?WALK /?ELS17
|
|
CALL NOT-HERE-OBJECT-F >V
|
|
ZERO? V /?ELS17
|
|
SET 'P-WON,FALSE-VALUE
|
|
JUMP ?CND15
|
|
?ELS17: SET 'O,PRSO
|
|
SET 'I,PRSI
|
|
GETP WINNER,P?ACTION
|
|
CALL STACK >V
|
|
ZERO? V /?ELS24
|
|
JUMP ?CND15
|
|
?ELS24: LOC WINNER
|
|
GETP STACK,P?ACTION
|
|
CALL STACK,M-BEG >V
|
|
ZERO? V /?ELS26
|
|
JUMP ?CND15
|
|
?ELS26: GET PREACTIONS,A
|
|
CALL STACK >V
|
|
ZERO? V /?ELS28
|
|
JUMP ?CND15
|
|
?ELS28: SET 'I,PRSI
|
|
ZERO? I /?ELS30
|
|
ZERO? I /?ELS30
|
|
GETP I,P?ACTION
|
|
CALL STACK >V
|
|
ZERO? V /?ELS30
|
|
JUMP ?CND15
|
|
?ELS30: ZERO? O /?ELS34
|
|
EQUAL? A,V?WALK /?ELS34
|
|
LOC O
|
|
ZERO? STACK /?ELS34
|
|
LOC O
|
|
GETP STACK,P?CONTFCN
|
|
CALL STACK,M-CONT >V
|
|
ZERO? V /?ELS34
|
|
JUMP ?CND15
|
|
?ELS34: ZERO? O /?ELS38
|
|
EQUAL? A,V?WALK /?ELS38
|
|
GETP O,P?ACTION
|
|
CALL STACK >V
|
|
ZERO? V /?ELS38
|
|
JUMP ?CND15
|
|
?ELS38: GET ACTIONS,A
|
|
CALL STACK >V
|
|
ZERO? V /?CND15
|
|
?CND15: EQUAL? V,M-FATAL /?CND43
|
|
LOC WINNER
|
|
EQUAL? STACK,PRSO \?CND46
|
|
SET 'PRSO,FALSE-VALUE
|
|
?CND46: LOC WINNER
|
|
GETP STACK,P?ACTION
|
|
CALL STACK,M-END >V
|
|
?CND43: SET 'PRSA,OA
|
|
SET 'PRSO,OO
|
|
SET 'PRSI,OI
|
|
RETURN V
|
|
|
|
|
|
.FUNCT TELL-START-STR
|
|
PRINTR "Nights on Hardscrabble Island are lonely and cold when the lighthouse barely pierces the gloom. You sit on your bed, thinking of better times and far-off places. A knock on your door stirs you, and Hevlin, a shipmate you haven't seen for years, staggers in.
|
|
|
|
""I'm in trouble,"" he says. ""I had a few too many at The Shanty. I was looking for Red, but he wasn't around, and I started talking about ... here,"" he says, handing you a slim volume that you recognize as a shipwreck book written years ago by the Historical Society.
|
|
|
|
You smile. Every diver on the island has looked for those wrecks, without even an old boot to show for it. You open the door, hoping the drunken fool will leave. ""I know what you're thinkin',"" Hevlin scowls, ""but look!"" He points to the familiar map, and you see new locations marked for two of the wrecks.
|
|
|
|
""Keep it for me,"" he says. ""Just for tonight. It'll be safe here with you. Don't let -- "" He stops and broods for a moment. ""I've got to go find Red!"" And with that, Hevlin leaves.
|
|
|
|
You put the book in your dresser and think about following Hevlin. Then you hear a scuffle outside. You look through your window and see two men struggling. One falls to the ground in a heap. The other man bends down beside him, then turns as if startled and runs away. Another man then approaches the wounded figure. He kneels beside him for a long moment, then takes off after the other man.
|
|
|
|
It isn't long before the police arrive to tell you that Hevlin's been murdered. You don't mention the book, and hours later, as you lie awake in your bed, you wonder if the book could really be what it seems."
|
|
|
|
|
|
.FUNCT ACCESSIBLE?,OBJ,L
|
|
LOC OBJ >L
|
|
FSET? OBJ,INVISIBLE /FALSE
|
|
EQUAL? OBJ,PSEUDO-OBJECT \?ELS7
|
|
GETP PSEUDO-OBJECT,P?DESCFCN
|
|
EQUAL? STACK,HERE \FALSE
|
|
RTRUE
|
|
?ELS7: ZERO? L /FALSE
|
|
EQUAL? L,GLOBAL-OBJECTS /TRUE
|
|
EQUAL? L,LOCAL-GLOBALS \?ELS20
|
|
CALL GLOBAL-IN?,OBJ,HERE
|
|
ZERO? STACK \TRUE
|
|
?ELS20: CALL META-LOC,OBJ
|
|
EQUAL? STACK,HERE \FALSE
|
|
EQUAL? L,WINNER,HERE /TRUE
|
|
FSET? L,OPENBIT /?THN31
|
|
FSET? L,PERSON \FALSE
|
|
?THN31: CALL ACCESSIBLE?,L
|
|
ZERO? STACK /FALSE
|
|
RTRUE
|
|
|
|
|
|
.FUNCT VISIBLE?,OBJ,L
|
|
LOC OBJ >L
|
|
CALL ACCESSIBLE?,OBJ
|
|
ZERO? STACK \TRUE
|
|
CALL SEE-INSIDE?,L
|
|
ZERO? STACK /FALSE
|
|
CALL VISIBLE?,L
|
|
ZERO? STACK /FALSE
|
|
RTRUE
|
|
|
|
|
|
.FUNCT META-LOC,OBJ
|
|
?PRG1: ZERO? OBJ /FALSE
|
|
EQUAL? OBJ,GLOBAL-OBJECTS,LOCAL-GLOBALS \?CND3
|
|
RETURN OBJ
|
|
?CND3: IN? OBJ,ROOMS \?ELS10
|
|
RETURN OBJ
|
|
?ELS10: LOC OBJ >OBJ
|
|
JUMP ?PRG1
|
|
|
|
.ENDI
|