cutthroats/main.zap

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