mirror of
https://github.com/historicalsource/sherlock
synced 2024-07-02 22:55:22 +03:00
1074 lines
22 KiB
Plaintext
1074 lines
22 KiB
Plaintext
|
|
|
|
.FUNCT SET-SIZE-TO-ONE,OBJ,NUM
|
|
GETP OBJ,P?SIZE >NUM
|
|
DIV NUM,SIZE-VALS
|
|
MUL STACK,SIZE-VALS
|
|
ADD 1,STACK
|
|
PUTP OBJ,P?SIZE,STACK
|
|
RTRUE
|
|
|
|
|
|
.FUNCT GET-SIZE,OBJ,NUM
|
|
GETP OBJ,P?SIZE >NUM
|
|
MOD NUM,SIZE-VALS >NUM
|
|
LESS? NUM,6 \?CCL3
|
|
RETURN NUM
|
|
?CCL3: SUB NUM,6
|
|
GETB SIZE-TABLE,STACK
|
|
RSTACK
|
|
|
|
|
|
.FUNCT SET-MASS-TO-ONE,OBJ,NUM,?TMP1
|
|
GETP OBJ,P?SIZE >NUM
|
|
MOD NUM,SIZE-VALS
|
|
ADD SIZE-VALS,STACK >?TMP1
|
|
DIV NUM,143
|
|
MUL STACK,143
|
|
ADD ?TMP1,STACK
|
|
PUTP OBJ,P?SIZE,STACK
|
|
RTRUE
|
|
|
|
|
|
.FUNCT GET-MASS,OBJ,NUM
|
|
GETP OBJ,P?SIZE >NUM
|
|
DIV NUM,SIZE-VALS
|
|
MOD STACK,MASS-VALS >NUM
|
|
LESS? NUM,6 \?CCL3
|
|
RETURN NUM
|
|
?CCL3: SUB NUM,6
|
|
GETB MASS-TABLE,STACK
|
|
RSTACK
|
|
|
|
|
|
.FUNCT GET-CAPACITY,OBJ,NUM
|
|
GETP OBJ,P?SIZE >NUM
|
|
DIV NUM,143 >NUM
|
|
GRTR? NUM,100 \?CCL3
|
|
RETURN 999
|
|
?CCL3: RETURN NUM
|
|
|
|
|
|
.FUNCT SET-CAPACITY-TO-ONE,OBJ,NUM
|
|
GETP OBJ,P?SIZE >NUM
|
|
MOD NUM,143
|
|
ADD 143,STACK
|
|
PUTP OBJ,P?SIZE,STACK
|
|
RTRUE
|
|
|
|
|
|
.FUNCT RT-SEE-ANYTHING-IN?,THING,OBJ
|
|
FIRST? THING >OBJ /?PRG2
|
|
?PRG2: ZERO? OBJ /FALSE
|
|
FSET? OBJ,FL-NODESC /?CCL8
|
|
EQUAL? OBJ,GL-WINNER \TRUE
|
|
?CCL8: NEXT? OBJ >OBJ /?PRG2
|
|
JUMP ?PRG2
|
|
|
|
|
|
.FUNCT RT-CANT-TOUCH-MSG,OBJ,CLSD,IN-OUT
|
|
ICALL1 RT-CYOU-MSG
|
|
PRINTI "cannot "
|
|
PRINTB GL-P-PRSA-WORD
|
|
PRINTC 32
|
|
ICALL2 RT-THEO-PRINT,OBJ
|
|
ZERO? CLSD /?CND1
|
|
PRINTI " because "
|
|
FSET? OBJ,FL-PLURAL \?CCL5
|
|
FSET? OBJ,FL-COLLECTIVE /?CCL5
|
|
PRINTI "they are"
|
|
JUMP ?CND3
|
|
?CCL5: PRINTI "it is"
|
|
?CND3: PRINTC 32
|
|
ZERO? IN-OUT /?CCL10
|
|
PRINTI "inside"
|
|
JUMP ?CND8
|
|
?CCL10: PRINTI "outside"
|
|
?CND8: PRINTC 32
|
|
ICALL2 RT-THEO-PRINT,CLSD
|
|
PRINTI ", which is closed"
|
|
?CND1: PRINTR "."
|
|
|
|
|
|
.FUNCT RT-TOTAL-SIZE-IN-OBJ,OBJ1,OBJ,TOTSIZ
|
|
FIRST? OBJ1 >OBJ /?PRG2
|
|
?PRG2: ZERO? OBJ /?REP3
|
|
CALL2 GET-SIZE,OBJ
|
|
ADD TOTSIZ,STACK >TOTSIZ
|
|
NEXT? OBJ >OBJ /?PRG2
|
|
JUMP ?PRG2
|
|
?REP3: RETURN TOTSIZ
|
|
|
|
|
|
.FUNCT RT-TOTAL-MASS-OF-OBJ,OBJ1,OBJ,TOTMAS
|
|
FIRST? OBJ1 >OBJ /?PRG2
|
|
?PRG2: ZERO? OBJ /?REP3
|
|
CALL2 RT-TOTAL-MASS-OF-OBJ,OBJ
|
|
ADD TOTMAS,STACK >TOTMAS
|
|
NEXT? OBJ >OBJ /?PRG2
|
|
JUMP ?PRG2
|
|
?REP3: CALL2 GET-MASS,OBJ1
|
|
ADD TOTMAS,STACK >TOTMAS
|
|
RETURN TOTMAS
|
|
|
|
|
|
.FUNCT RT-TOTAL-COUNT-IN-OBJ,OBJ1,OBJ,TOTCNT
|
|
FIRST? OBJ1 >OBJ /?PRG2
|
|
?PRG2: ZERO? OBJ /?REP3
|
|
FSET? OBJ,FL-WORN \?CCL8
|
|
IN? OBJ,CH-PLAYER /?CND4
|
|
?CCL8: FSET? OBJ,FL-BODYPART /?CND4
|
|
INC 'TOTCNT
|
|
?CND4: NEXT? OBJ >OBJ /?PRG2
|
|
JUMP ?PRG2
|
|
?REP3: RETURN TOTCNT
|
|
|
|
|
|
.FUNCT RT-OBJ-TOO-LARGE?,OBJ1,OBJ2,?TMP1,?TMP2
|
|
CALL2 GET-SIZE,OBJ1 >?TMP2
|
|
CALL2 RT-TOTAL-SIZE-IN-OBJ,OBJ2
|
|
ADD ?TMP2,STACK >?TMP1
|
|
CALL2 GET-CAPACITY,OBJ2
|
|
GRTR? ?TMP1,STACK /TRUE
|
|
RFALSE
|
|
|
|
|
|
.FUNCT RT-OBJ-TOO-HEAVY?,OBJ1,OBJ2,?TMP1,?TMP2
|
|
CALL2 RT-TOTAL-MASS-OF-OBJ,OBJ1 >?TMP2
|
|
CALL2 RT-TOTAL-MASS-OF-OBJ,OBJ2
|
|
ADD ?TMP2,STACK >?TMP1
|
|
GETP OBJ2,P?STRENGTH
|
|
GRTR? ?TMP1,STACK /TRUE
|
|
RFALSE
|
|
|
|
|
|
.FUNCT RT-OBJ-TOO-MANY?,OBJ1,OBJ2,?TMP1
|
|
CALL2 RT-TOTAL-COUNT-IN-OBJ,OBJ2
|
|
ADD 1,STACK >?TMP1
|
|
GETP OBJ2,P?DEXTERITY
|
|
GRTR? ?TMP1,STACK /TRUE
|
|
RFALSE
|
|
|
|
|
|
.FUNCT RT-REMOVE-ALL,OBJ1,OBJ,NXT,CNT
|
|
FIRST? OBJ1 >OBJ /?PRG2
|
|
?PRG2: ZERO? OBJ /?REP3
|
|
NEXT? OBJ >NXT /?BOGUS6
|
|
?BOGUS6: REMOVE OBJ
|
|
INC 'CNT
|
|
SET 'OBJ,NXT
|
|
JUMP ?PRG2
|
|
?REP3: RETURN CNT
|
|
|
|
|
|
.FUNCT RT-MOVE-ALL-BUT-WORN,OBJ1,OBJ2,OBJ,NXT,CNT
|
|
FIRST? OBJ1 >OBJ /?PRG2
|
|
?PRG2: ZERO? OBJ /?REP3
|
|
NEXT? OBJ >NXT /?BOGUS6
|
|
?BOGUS6: FSET? OBJ,FL-WORN /?CND7
|
|
EQUAL? OBJ,TH-POCKET /?CND7
|
|
MOVE OBJ,OBJ2
|
|
INC 'CNT
|
|
?CND7: SET 'OBJ,NXT
|
|
JUMP ?PRG2
|
|
?REP3: RETURN CNT
|
|
|
|
|
|
.FUNCT RT-MOVE-NODESC-OBJS,OBJ1,OBJ2,OBJ,NXT,CNT
|
|
FIRST? OBJ1 >OBJ /?PRG2
|
|
?PRG2: ZERO? OBJ /?REP3
|
|
NEXT? OBJ >NXT /?BOGUS6
|
|
?BOGUS6: FSET? OBJ,FL-NODESC \?CND7
|
|
MOVE OBJ,OBJ2
|
|
INC 'CNT
|
|
?CND7: SET 'OBJ,NXT
|
|
JUMP ?PRG2
|
|
?REP3: RETURN CNT
|
|
|
|
|
|
.FUNCT RT-FIND-IN?,OBJ1,FLG,OBJ
|
|
FIRST? OBJ1 >OBJ /?PRG2
|
|
?PRG2: ZERO? OBJ /FALSE
|
|
FSET? OBJ,FLG \?CND4
|
|
RETURN OBJ
|
|
?CND4: NEXT? OBJ >OBJ /?PRG2
|
|
JUMP ?PRG2
|
|
|
|
|
|
.FUNCT RT-GET-ANY-KEY,X
|
|
PRINTI "[Press any key.]"
|
|
CRLF
|
|
INPUT 1 >X
|
|
RTRUE
|
|
|
|
|
|
.FUNCT RT-GET-YES-NO?,WORD
|
|
?PRG1: CRLF
|
|
PRINTI "Please type YES or NO > "
|
|
PUTB GL-YES-LEXV,0,4
|
|
PUTB GL-YES-IBUF,1,0
|
|
READ GL-YES-IBUF,GL-YES-LEXV
|
|
GET GL-YES-LEXV,K-P-LEXSTART >WORD
|
|
GETB GL-YES-LEXV,K-P-LEXWORDS
|
|
ZERO? STACK /?PRG1
|
|
ZERO? WORD /?PRG1
|
|
EQUAL? WORD,W?Y,W?YES /TRUE
|
|
EQUAL? WORD,W?N,W?NO \?PRG1
|
|
RFALSE
|
|
|
|
|
|
.FUNCT RT-INIT-SCREEN,FAST?
|
|
ZERO? FAST? /?CCL3
|
|
SPLIT GL-SPLIT-ROW
|
|
CLEAR 1
|
|
JUMP ?CND1
|
|
?CCL3: CLEAR -1
|
|
SPLIT GL-SPLIT-ROW
|
|
?CND1: SCREEN K-S-WIN
|
|
HLIGHT K-H-INV
|
|
CURSET GL-SPLIT-ROW,1
|
|
ICALL2 RT-PRINT-SPACES,GL-ALLSCREEN
|
|
SET 'GL-PLACE-STS,-1
|
|
SET 'GL-MOVES-STS,-1
|
|
SET 'GL-SCORE-STS,-1
|
|
CURSET GL-SPLIT-ROW,GL-STAT-S-POS
|
|
ZERO? GL-SHORT-STAT? \?CND4
|
|
PRINTI "Score:"
|
|
?CND4: HLIGHT K-H-NRM
|
|
SCREEN K-S-NOR
|
|
RTRUE
|
|
|
|
|
|
.FUNCT RT-GAMETITLE-MSG
|
|
PRINTR "Sherlock: The Riddle of the Crown Jewels"
|
|
|
|
|
|
.FUNCT RT-COPYRIGHT-MSG
|
|
PRINTR "Copyright 1987 Infocom, Inc."
|
|
|
|
|
|
.FUNCT RT-TRADEMARK-MSG
|
|
PRINTR "Sherlock: The Riddle of the Crown Jewels is a trademark of Infocom, Inc."
|
|
|
|
|
|
.FUNCT RT-ID-MSG,IDX
|
|
SET 'IDX,18
|
|
PRINTI "Release "
|
|
GET 0,1
|
|
BAND STACK,2047
|
|
PRINTN STACK
|
|
PRINTI " Interpreter "
|
|
GETB 0,30
|
|
PRINTN STACK
|
|
PRINTI " Version "
|
|
GETB 0,31
|
|
PRINTC STACK
|
|
PRINTI " Serial Number "
|
|
?PRG1: GETB 0,IDX
|
|
PRINTC STACK
|
|
IGRTR? 'IDX,23 \?PRG1
|
|
CRLF
|
|
RTRUE
|
|
|
|
|
|
.FUNCT RT-VERSION-MSG
|
|
HLIGHT K-H-BLD
|
|
ICALL1 RT-GAMETITLE-MSG
|
|
ICALL1 RT-COPYRIGHT-MSG
|
|
ICALL1 RT-TRADEMARK-MSG
|
|
ICALL1 RT-ID-MSG
|
|
HLIGHT K-H-NRM
|
|
RTRUE
|
|
|
|
|
|
.FUNCT RT-DESC-PL-CONT-1,SURFACE,CNT,OBJ,NXT,FIRST,PERSON-COUNT,PERSON-PLURAL
|
|
FIRST? SURFACE >OBJ /?BOGUS1
|
|
?BOGUS1: SET 'FIRST,TRUE-VALUE
|
|
?PRG2: ZERO? OBJ /?REP3
|
|
FSET? OBJ,FL-NODESC /?CTR7
|
|
EQUAL? OBJ,GL-PUPPY \?CCL8
|
|
?CTR7: NEXT? OBJ >OBJ /?PRG2
|
|
JUMP ?PRG2
|
|
?CCL8: FSET? OBJ,FL-PERSON \?CCL13
|
|
INC 'PERSON-COUNT
|
|
NEXT? OBJ >OBJ /?PRG2
|
|
JUMP ?PRG2
|
|
?CCL13: ZERO? FIRST /?CND4
|
|
GRTR? CNT,0 \?CCL18
|
|
PRINTC 32
|
|
JUMP ?CND16
|
|
?CCL18: CRLF
|
|
?CND16: PRINTI "You see "
|
|
SET 'FIRST,FALSE-VALUE
|
|
?CND4: ICALL2 RT-A-PRINT,OBJ
|
|
INC 'CNT
|
|
NEXT? OBJ >OBJ /?PRG20
|
|
?PRG20: ZERO? OBJ /?REP21
|
|
EQUAL? OBJ,GL-PUPPY /?CND22
|
|
FSET? OBJ,FL-NODESC /?CND22
|
|
FSET? OBJ,FL-PERSON \?REP21
|
|
FSET? OBJ,FL-NODESC /?REP21
|
|
INC 'PERSON-COUNT
|
|
?CND22: NEXT? OBJ >OBJ /?PRG20
|
|
JUMP ?PRG20
|
|
?REP21: ZERO? OBJ /?CCL36
|
|
NEXT? OBJ >NXT /?PRG38
|
|
?PRG38: ZERO? NXT /?REP39
|
|
FSET? NXT,FL-NODESC /?CND40
|
|
EQUAL? NXT,GL-PUPPY /?CND40
|
|
FSET? NXT,FL-PERSON \?REP39
|
|
?CND40: NEXT? NXT >NXT /?PRG38
|
|
JUMP ?PRG38
|
|
?REP39: ZERO? NXT \?CCL50
|
|
PRINTI " and "
|
|
JUMP ?PRG2
|
|
?CCL50: PRINTI ", "
|
|
JUMP ?PRG2
|
|
?CCL36: IN? SURFACE,ROOMS /?CND51
|
|
PRINTI " on "
|
|
ICALL2 RT-THEO-PRINT,SURFACE
|
|
?CND51: PRINTC 46
|
|
JUMP ?PRG2
|
|
?REP3: GRTR? PERSON-COUNT,0 \?CND53
|
|
GRTR? CNT,0 \?CCL57
|
|
PRINTC 32
|
|
JUMP ?CND55
|
|
?CCL57: CRLF
|
|
?CND55: ADD CNT,PERSON-COUNT >CNT
|
|
GRTR? PERSON-COUNT,1 \?CND58
|
|
SET 'PERSON-PLURAL,TRUE-VALUE
|
|
?CND58: FIRST? SURFACE >OBJ /?BOGUS60
|
|
?BOGUS60: SET 'FIRST,TRUE-VALUE
|
|
?PRG61: FSET? OBJ,FL-NODESC /?CND63
|
|
EQUAL? OBJ,GL-PUPPY /?CND63
|
|
FSET? OBJ,FL-PERSON \?CND63
|
|
ZERO? FIRST /?CCL71
|
|
ICALL RT-THEO-PRINT,OBJ,TRUE-VALUE,K-DESC-A
|
|
JUMP ?CND69
|
|
?CCL71: ICALL2 RT-A-PRINT,OBJ
|
|
?CND69: SET 'FIRST,FALSE-VALUE
|
|
FSET? OBJ,FL-PLURAL \?CND72
|
|
SET 'PERSON-PLURAL,TRUE-VALUE
|
|
?CND72: DEC 'PERSON-COUNT
|
|
ZERO? PERSON-COUNT \?CCL76
|
|
ZERO? PERSON-PLURAL /?CCL79
|
|
PRINTI " are"
|
|
JUMP ?CND77
|
|
?CCL79: PRINTI " is"
|
|
?CND77: PRINTI " here."
|
|
?CND53: FIRST? SURFACE >OBJ /?PRG84
|
|
?PRG84: ZERO? OBJ /?REP85
|
|
FSET? OBJ,FL-SURFACE \?CND86
|
|
CALL RT-DESC-PL-CONT-1,OBJ,CNT >CNT
|
|
?CND86: NEXT? OBJ >OBJ /?PRG84
|
|
JUMP ?PRG84
|
|
?CCL76: EQUAL? PERSON-COUNT,1 \?CCL81
|
|
PRINTI " and "
|
|
JUMP ?CND63
|
|
?CCL81: PRINTI ", "
|
|
?CND63: NEXT? OBJ >OBJ /?PRG61
|
|
JUMP ?PRG61
|
|
?REP85: RETURN CNT
|
|
|
|
|
|
.FUNCT RT-DESCRIBE-PLACE-CONTENTS,PLACE,LOOK,OBJ,PREV,CNT,LIGHT
|
|
ZERO? PLACE \?CND1
|
|
SET 'PLACE,GL-PLACE-CUR
|
|
?CND1: CALL RT-DESC-PL-CONT-1,PLACE,0
|
|
ZERO? STACK /TRUE
|
|
CRLF
|
|
RTRUE
|
|
|
|
|
|
.FUNCT RT-RANK-STR,PTS
|
|
LESS? PTS,1 \?CCL3
|
|
RETURN STR?231
|
|
?CCL3: LESS? PTS,21 \?CCL5
|
|
RETURN STR?232
|
|
?CCL5: LESS? PTS,41 \?CCL7
|
|
RETURN STR?233
|
|
?CCL7: LESS? PTS,61 \?CCL9
|
|
RETURN STR?234
|
|
?CCL9: LESS? PTS,81 \?CCL11
|
|
RETURN STR?235
|
|
?CCL11: LESS? PTS,91 \?CCL13
|
|
RETURN STR?236
|
|
?CCL13: LESS? PTS,100 /?CTR14
|
|
RETURN STR?238
|
|
?CTR14: RETURN STR?237
|
|
|
|
|
|
.FUNCT RT-NEW-SCORE-MSG,PTS
|
|
ZERO? PTS /FALSE
|
|
HLIGHT K-H-BLD
|
|
ZERO? GL-SCORE-MSG /?CND3
|
|
CRLF
|
|
PRINTI "[Your score just went up by "
|
|
PRINTN PTS
|
|
PRINTI " point"
|
|
GRTR? PTS,1 \?CND5
|
|
PRINTC 115
|
|
?CND5: PRINTI ". The total is now "
|
|
PRINTN GL-SCORE-CUR
|
|
PRINTI " out of "
|
|
PRINTN GL-SCORE-MAX
|
|
PRINTI ".]"
|
|
CRLF
|
|
?CND3: HLIGHT K-H-NRM
|
|
RTRUE
|
|
|
|
|
|
.FUNCT RT-PARSE-EVENT?,NOUN,ADJ,OBJ,N,TB,NTB,ATB,FLGS,?TMP1
|
|
SET 'OBJ,TH-EVENT
|
|
SET 'N,10
|
|
SET 'TB,TH-EVENT-NAMES+2
|
|
?PRG1: GET TB,0 >NTB
|
|
ADD NTB,2 >?TMP1
|
|
GET NTB,0
|
|
INTBL? NOUN,?TMP1,STACK \?CND3
|
|
ZERO? ADJ /?CTR6
|
|
GET TB,1 >ATB
|
|
ZERO? ATB /FALSE
|
|
ADD ATB,2 >?TMP1
|
|
GET ATB,0
|
|
INTBL? ADJ,?TMP1,STACK \FALSE
|
|
?CTR6: GET NTB,1
|
|
PUTP OBJ,P?OBJ-NOUN,STACK
|
|
GET TB,3 >FLGS
|
|
BTST FLGS,2 \?CCL14
|
|
FSET OBJ,FL-ALIVE
|
|
JUMP ?CND12
|
|
?CCL14: FCLEAR OBJ,FL-ALIVE
|
|
?CND12: BTST FLGS,4 \?CCL17
|
|
FSET OBJ,FL-PERSON
|
|
JUMP ?CND15
|
|
?CCL17: FCLEAR OBJ,FL-PERSON
|
|
?CND15: BTST FLGS,8 \?CCL20
|
|
FSET OBJ,FL-VOWEL
|
|
RETURN OBJ
|
|
?CCL20: FCLEAR OBJ,FL-VOWEL
|
|
RETURN OBJ
|
|
?CND3: DLESS? 'N,1 /FALSE
|
|
ADD TB,8 >TB
|
|
JUMP ?PRG1
|
|
|
|
|
|
.FUNCT RT-IDENTIFY-EVENT?,WD,OBJ,NAM,N,TB,NTB,?TMP1
|
|
GETP TH-EVENT,P?OBJ-NOUN >NAM
|
|
ZERO? OBJ /?CND1
|
|
EQUAL? OBJ,TH-EVENT \FALSE
|
|
?CND1: SET 'N,10
|
|
SET 'TB,TH-EVENT-NAMES+2
|
|
?PRG5: GET TB,0 >NTB
|
|
GET NTB,1
|
|
EQUAL? WD,STACK \?CND7
|
|
ADD NTB,2 >?TMP1
|
|
GET NTB,0
|
|
INTBL? NAM,?TMP1,STACK /TRUE
|
|
RFALSE
|
|
?CND7: DLESS? 'N,1 /FALSE
|
|
ADD TB,8 >TB
|
|
JUMP ?PRG5
|
|
|
|
|
|
.FUNCT RT-DESC-EVENT,CLASS,WD,FLAGS,N,TB,?TMP1,?TMP2,?TMP3
|
|
GETP TH-EVENT,P?OBJ-NOUN >WD
|
|
SET 'N,10
|
|
SET 'TB,TH-EVENT-NAMES+2
|
|
?PRG1: GET TB,0
|
|
GET STACK,1
|
|
EQUAL? WD,STACK \?CND3
|
|
GET TB,3 >FLAGS
|
|
GET TB,2
|
|
ZERO? STACK /?CCL7
|
|
GET TB,2 >?TMP3
|
|
BTST FLAGS,1 \?PRF10
|
|
SET '?TMP2,1
|
|
JUMP ?PEN8
|
|
?PRF10: SET '?TMP2,0
|
|
?PEN8: FSET? TH-EVENT,FL-PLURAL /?PRD11
|
|
PUSH 0
|
|
JUMP ?PRD12
|
|
?PRD11: PUSH 1
|
|
?PRD12: SET '?TMP1,STACK
|
|
FSET? TH-EVENT,FL-VOWEL /?PRD13
|
|
PUSH 0
|
|
JUMP ?PRD14
|
|
?PRD13: PUSH 1
|
|
?PRD14: ICALL PRINT-SDESC,?TMP3,CLASS,?TMP2,?TMP1,STACK
|
|
RTRUE
|
|
?CCL7: BTST FLAGS,1 \?PRF17
|
|
SET '?TMP2,1
|
|
JUMP ?PEN15
|
|
?PRF17: SET '?TMP2,0
|
|
?PEN15: FSET? TH-EVENT,FL-PLURAL /?PRD18
|
|
PUSH 0
|
|
JUMP ?PRD19
|
|
?PRD18: PUSH 1
|
|
?PRD19: SET '?TMP1,STACK
|
|
FSET? TH-EVENT,FL-VOWEL /?PRD20
|
|
PUSH 0
|
|
JUMP ?PRD21
|
|
?PRD20: PUSH 1
|
|
?PRD21: ICALL PRINT-SDESC,WD,CLASS,?TMP2,?TMP1,STACK,TRUE-VALUE
|
|
RTRUE
|
|
?CND3: DLESS? 'N,1 /FALSE
|
|
ADD TB,8 >TB
|
|
JUMP ?PRG1
|
|
|
|
|
|
.FUNCT RT-AC-TH-EVENT,CONTEXT,CLASS
|
|
EQUAL? CONTEXT,K-M-SDESC \?CCL3
|
|
CALL2 RT-DESC-EVENT,CLASS
|
|
RSTACK
|
|
?CCL3: CALL1 RT-TALK-VERB?
|
|
ZERO? STACK \FALSE
|
|
ICALL1 RT-IMPOSSIBLE-MSG
|
|
RTRUE
|
|
|
|
|
|
.FUNCT RT-TO-DO-THING-USE-MSG,STR1,STR2
|
|
PRINTI "[To "
|
|
PRINT STR1
|
|
PRINTI " something, use the command: "
|
|
PRINT STR2
|
|
PRINTR " THING.]"
|
|
|
|
|
|
.FUNCT RT-NOT-IN-SENTENCE-MSG,STR
|
|
PRINTI "[There are not "
|
|
PRINT STR
|
|
PRINTR " in that sentence.]"
|
|
|
|
|
|
.FUNCT RT-IMPOSSIBLE-MSG,WHO
|
|
CALL1 RT-WHO-SAYS? >WHO
|
|
EQUAL? WHO,CH-HOLMES,CH-WIGGINS \?CCL3
|
|
EQUAL? WHO,CH-HOLMES \?CCL6
|
|
CALL2 RT-PICK-NEXT,GL-HOLMES-DESC-TXT
|
|
PRINT STACK
|
|
PRINTI " looks at you "
|
|
CALL2 RT-PICK-NEXT,GL-HOLMES-DESPAIR-TXT
|
|
PRINT STACK
|
|
PRINTI " and says, """
|
|
CALL2 RT-PICK-NEXT,GL-HOLMES-IMPOSSIBLE-TXT
|
|
PRINT STACK
|
|
JUMP ?CND4
|
|
?CCL6: EQUAL? WHO,CH-WIGGINS \?CND4
|
|
CALL2 RT-PICK-NEXT,GL-WIGGINS-DESC-TXT
|
|
PRINT STACK
|
|
PRINTI " says, """
|
|
CALL2 RT-PICK-NEXT,GL-WIGGINS-IMPOSSIBLE-TXT
|
|
PRINT STACK
|
|
?CND4: PRINTR "."""
|
|
?CCL3: CALL2 RT-PICK-NEXT,GL-IMPOSSIBLE-TXT
|
|
PRINT STACK
|
|
PRINTR "."
|
|
|
|
|
|
.FUNCT RT-NOT-LIKELY-MSG,THING,STR
|
|
PRINTI "It"
|
|
CALL2 RT-PICK-NEXT,GL-NOT-LIKELY-TXT
|
|
PRINT STACK
|
|
PRINTI " that "
|
|
ICALL2 RT-THEO-PRINT,THING
|
|
PRINTC 32
|
|
PRINT STR
|
|
PRINTR "."
|
|
|
|
|
|
.FUNCT RT-LOOKS-PUZZLED-MSG,WHO
|
|
ICALL2 RT-CTHEO-PRINT,WHO
|
|
PRINTC 32
|
|
CALL2 RT-PICK-NEXT,GL-LOOKS-TXT
|
|
PRINT STACK
|
|
PRINTC 32
|
|
CALL2 RT-PICK-NEXT,GL-PUZZLED-TXT
|
|
PRINT STACK
|
|
PRINTR "."
|
|
|
|
|
|
.FUNCT RT-WINNER-NOT-HOLDING-MSG
|
|
ICALL2 RT-CTHEO-PRINT,GL-WINNER
|
|
ICALL2 RT-ISNT-ARENT-MSG,GL-WINNER
|
|
PRINTI "holding "
|
|
RTRUE
|
|
|
|
|
|
.FUNCT RT-YOUD-HAVE-TO-MSG,STR,THING
|
|
PRINTI "You would have to "
|
|
PRINT STR
|
|
PRINTC 32
|
|
ICALL2 RT-THEO-PRINT,THING
|
|
PRINTI " to do that."
|
|
CRLF
|
|
ICALL2 RT-THIS-IS-IT,THING
|
|
RTRUE
|
|
|
|
|
|
.FUNCT RT-WOULD-HAVE-TO-MSG,STR,THING
|
|
PRINTI "would have to "
|
|
PRINT STR
|
|
PRINTC 32
|
|
ZERO? THING /?CND1
|
|
ICALL2 RT-THEO-PRINT,THING
|
|
?CND1: ICALL2 RT-THIS-IS-IT,THING
|
|
RTRUE
|
|
|
|
|
|
.FUNCT RT-NOBODY-TO-ASK-MSG
|
|
PRINTI "[There is nobody here to ask.]"
|
|
CRLF
|
|
ICALL1 RT-P-CLEAR
|
|
RTRUE
|
|
|
|
|
|
.FUNCT RT-TALK-TO-SELF-MSG
|
|
PRINTI "[You must address characters directly.]"
|
|
CRLF
|
|
ICALL1 RT-P-CLEAR
|
|
RTRUE
|
|
|
|
|
|
.FUNCT RT-WAY-TO-TALK-MSG
|
|
PRINTI "[Refer to your instruction manual for the correct way to address characters.]"
|
|
CRLF
|
|
ICALL1 RT-P-CLEAR
|
|
RETURN 2
|
|
|
|
|
|
.FUNCT RT-I-SUN-UP-DOWN-MSG,TOD
|
|
FSET? GL-PLACE-CUR,FL-INDOORS /FALSE
|
|
CALL RT-CLOCK-CMP,6,30,0
|
|
ZERO? STACK \?CCL5
|
|
CALL RT-DO-CLOCK-SET,GL-TIME-PARM,0,30,0
|
|
ICALL RT-ALARM-SET-REL,RT-I-SUN-UP-DOWN-MSG,STACK
|
|
SET 'GL-LAST-OUT-TOD,1
|
|
CRLF
|
|
PRINTI "Visibility increases in the gathering light of the new day."
|
|
EQUAL? GL-PLACE-CUR,RM-THAMES-ONE,RM-THAMES-TWO,RM-THAMES-THREE /?CND6
|
|
EQUAL? GL-PLACE-CUR,RM-THAMES-FOUR,RM-THAMES-FIVE /?CND6
|
|
PRINTR " Tourists are beginning to crowd into the streets."
|
|
?CND6: CRLF
|
|
RTRUE
|
|
?CCL5: CALL RT-CLOCK-CMP,7,0,0
|
|
ZERO? STACK \?CCL11
|
|
CALL RT-DO-CLOCK-SET,GL-TIME-PARM,12,30,0
|
|
ICALL RT-ALARM-SET-REL,RT-I-SUN-UP-DOWN-MSG,STACK
|
|
SET 'GL-LAST-OUT-TOD,2
|
|
CRLF
|
|
PRINTI "The sun comes up, as much as it ever comes up in England."
|
|
CRLF
|
|
RFALSE
|
|
?CCL11: CALL RT-CLOCK-CMP,19,30,0
|
|
ZERO? STACK \?CCL13
|
|
CALL RT-DO-CLOCK-SET,GL-TIME-PARM,0,30,0
|
|
ICALL RT-ALARM-SET-REL,RT-I-SUN-UP-DOWN-MSG,STACK
|
|
SET 'GL-LAST-OUT-TOD,3
|
|
CRLF
|
|
PRINTR "Daylight begins to fade. Soon it will be dark."
|
|
?CCL13: CALL RT-CLOCK-CMP,20,0,0
|
|
ZERO? STACK \FALSE
|
|
CALL RT-DO-CLOCK-SET,GL-TIME-PARM,10,30,0
|
|
ICALL RT-ALARM-SET-REL,RT-I-SUN-UP-DOWN-MSG,STACK
|
|
SET 'GL-LAST-OUT-TOD,0
|
|
CRLF
|
|
PRINTI "Darkness falls and the mists come in."
|
|
CRLF
|
|
RFALSE
|
|
|
|
|
|
.FUNCT RT-NO-OTHER?,FEMALE?,OBJ
|
|
FIRST? GL-PLACE-CUR >OBJ /?PRG2
|
|
?PRG2: ZERO? OBJ /?REP3
|
|
EQUAL? OBJ,GL-WINNER /?CND7
|
|
FSET? OBJ,FL-PERSON \?CND7
|
|
ZERO? FEMALE? /?CCL13
|
|
FSET? OBJ,FL-FEMALE /?REP3
|
|
?CCL13: ZERO? FEMALE? \?CND7
|
|
FSET? OBJ,FL-FEMALE \?REP3
|
|
?CND7: NEXT? OBJ >OBJ /?PRG2
|
|
JUMP ?PRG2
|
|
?REP3: ZERO? OBJ /FALSE
|
|
ICALL2 RT-LOOKS-PUZZLED-MSG,GL-WINNER
|
|
PRINTR "To whom are you referring?"
|
|
|
|
|
|
.FUNCT RT-GLOBAL-IN?,OBJ1,OBJ2,TBL
|
|
GETPT OBJ2,P?GLOBAL >TBL
|
|
ZERO? TBL /FALSE
|
|
GRTR? OBJ1,255 /FALSE
|
|
PTSIZE TBL
|
|
INTBL? OBJ1,TBL,STACK,1 /TRUE
|
|
RFALSE
|
|
|
|
|
|
.FUNCT RT-META-LOC,OBJ
|
|
?PRG1: ZERO? OBJ /FALSE
|
|
IN? OBJ,GLOBAL-OBJECTS \?CCL7
|
|
RETURN GLOBAL-OBJECTS
|
|
?CCL7: IN? OBJ,ROOMS \?CCL9
|
|
RETURN OBJ
|
|
?CCL9: LOC OBJ >OBJ
|
|
JUMP ?PRG1
|
|
|
|
|
|
.FUNCT GO
|
|
START::
|
|
|
|
?FCN: SET 'GL-CLOCK-FMT,0
|
|
SET 'GL-SCORE-MSG,TRUE-VALUE
|
|
SET 'GL-SCORE-MAX,100
|
|
SET 'GL-PLACE-CUR,RM-221B-BAKER-ST
|
|
ICALL RT-DO-CLOCK-SET,GL-TIME-UPDT-INC,0,1,0
|
|
ICALL RT-DO-CLOCK-SET,GL-TIME-UPDT-DEF,0,1,0
|
|
ICALL RT-DO-CLOCK-SET,GL-TIME,5,0,0,18
|
|
CALL RT-DO-CLOCK-SET,GL-TIME-PARM,6,0,0,18
|
|
ICALL RT-ALARM-SET-ABS,RT-I-BIGBEN,STACK
|
|
CALL RT-DO-CLOCK-SET,GL-TIME-PARM,6,30,0,18
|
|
ICALL RT-ALARM-SET-ABS,RT-I-SUN-UP-DOWN-MSG,STACK
|
|
CALL RT-DO-CLOCK-SET,GL-TIME-PARM,6,30,0,18
|
|
ICALL RT-ALARM-SET-ABS,RT-I-PM-QUITS,STACK
|
|
CALL RT-DO-CLOCK-SET,GL-TIME-PARM,7,0,0,18
|
|
ICALL RT-ALARM-SET-ABS,RT-I-OPEN-WESTMINSTER-DOOR,STACK
|
|
CALL RT-DO-CLOCK-SET,GL-TIME-PARM,6,55,0,18
|
|
ICALL RT-ALARM-SET-ABS,RT-I-WESTMINSTER-LIGHTS-ON,STACK
|
|
CALL RT-DO-CLOCK-SET,GL-TIME-PARM,17,50,0,18
|
|
ICALL RT-ALARM-SET-ABS,RT-I-FLASH-WESTMINSTER-LIGHTS,STACK
|
|
CALL RT-DO-CLOCK-SET,GL-TIME-PARM,18,5,0,18
|
|
ICALL RT-ALARM-SET-ABS,RT-I-WESTMINSTER-LIGHTS-OFF,STACK
|
|
CALL RT-DO-CLOCK-SET,GL-TIME-PARM,6,55,0,19
|
|
ICALL RT-ALARM-SET-ABS,RT-I-WESTMINSTER-LIGHTS-ON,STACK
|
|
CALL RT-DO-CLOCK-SET,GL-TIME-PARM,17,50,0,19
|
|
ICALL RT-ALARM-SET-ABS,RT-I-FLASH-WESTMINSTER-LIGHTS,STACK
|
|
CALL RT-DO-CLOCK-SET,GL-TIME-PARM,18,1,0,19
|
|
ICALL RT-ALARM-SET-ABS,RT-I-LOCKED-IN-END-GAME,STACK
|
|
CALL RT-DO-CLOCK-SET,GL-TIME-PARM,8,0,0,18
|
|
ICALL RT-ALARM-SET-ABS,RT-I-OPEN-MUSEUM-DOOR,STACK
|
|
CALL RT-DO-CLOCK-SET,GL-TIME-PARM,9,0,0,20
|
|
ICALL RT-ALARM-SET-ABS,RT-I-OUT-OF-TIME,STACK
|
|
SET 'GL-SCORE-CUR,0
|
|
SET 'GL-MOVES-CUR,0
|
|
SET 'GL-SCORE-STS,-1
|
|
SET 'GL-MOVES-STS,-1
|
|
SET 'GL-PLACE-STS,-1
|
|
SET 'GL-PLACE-PRV,-1
|
|
CALL1 RT-IS-LIT? >GL-NOW-LIT?
|
|
SET 'GL-WINNER,CH-PLAYER
|
|
GETB 0,33 >GL-ALLSCREEN
|
|
DIV GL-ALLSCREEN,2 >GL-MIDSCREEN
|
|
LESS? GL-ALLSCREEN,60 \?CND1
|
|
SET 'GL-SHORT-STAT?,TRUE-VALUE
|
|
SET 'GL-STAT-S-POS,4
|
|
SET 'GL-STAT-T-POS,17
|
|
SET 'GL-SCORE-HEADER-LEN,0
|
|
SUB GL-ALLSCREEN,19 >GL-STAT-MAX-ROOM
|
|
?CND1: SUB GL-ALLSCREEN,GL-STAT-S-POS >GL-STAT-S-POS
|
|
SUB GL-ALLSCREEN,GL-STAT-T-POS >GL-STAT-T-POS
|
|
SET 'GL-SPLIT-ROW,1
|
|
MOVE CH-PLAYER,GL-PLACE-CUR
|
|
CLEAR -1
|
|
CRLF
|
|
ICALL1 RT-GAMETITLE-MSG
|
|
ICALL1 RT-COPYRIGHT-MSG
|
|
ICALL1 RT-TRADEMARK-MSG
|
|
ICALL1 RT-ID-MSG
|
|
CRLF
|
|
ICALL1 RT-GET-ANY-KEY
|
|
ICALL1 RT-INIT-SCREEN
|
|
ICALL1 RT-UPDATE-STATUS-LINE
|
|
ICALL1 RT-DESC-ALL
|
|
ICALL1 RT-P-CLEAR
|
|
ICALL1 RT-MAIN-LOOP
|
|
JUMP ?FCN
|
|
|
|
|
|
.FUNCT RT-NUMBER?,PTR,TMP,CNT,BPTR,TPTR,CHR,SUM,TIM,AM-PM?,?TMP1
|
|
SET 'TPTR,K-HRS
|
|
MUL PTR,2
|
|
ADD GL-P-P-LEX,STACK >TMP
|
|
GET TMP,K-P-LEXELEN >CNT
|
|
EQUAL? CNT,W?AM \?CCL3
|
|
SET 'AM-PM?,1
|
|
JUMP ?CND1
|
|
?CCL3: EQUAL? CNT,W?PM \?CND1
|
|
SET 'AM-PM?,2
|
|
?CND1: ZERO? AM-PM? /?CCL7
|
|
SET 'BELIEVE-WAIT-TIME?,TRUE-VALUE
|
|
JUMP ?CND5
|
|
?CCL7: SET 'BELIEVE-WAIT-TIME?,FALSE-VALUE
|
|
?CND5: GETB TMP,2 >CNT
|
|
GETB TMP,3 >BPTR
|
|
?PRG8: DLESS? 'CNT,0 /?REP9
|
|
GETB GL-P-PIBUF,BPTR >CHR
|
|
EQUAL? CHR,58 \?CCL15
|
|
PUTB GL-P-TIME,TPTR,SUM
|
|
EQUAL? TPTR,K-HRS \?CCL18
|
|
GRTR? SUM,23 /FALSE
|
|
EQUAL? AM-PM?,2 \?CND21
|
|
LESS? SUM,12 \?CND21
|
|
ADD SUM,12 >SUM
|
|
PUTB GL-P-TIME,K-HRS,SUM
|
|
?CND21: SET 'TPTR,K-MIN
|
|
JUMP ?CND16
|
|
?CCL18: EQUAL? TPTR,K-MIN /FALSE
|
|
ZERO? TPTR /FALSE
|
|
?CND16: SET 'TIM,TRUE-VALUE
|
|
SET 'SUM,0
|
|
JUMP ?CND13
|
|
?CCL15: GRTR? SUM,9999 /FALSE
|
|
GRTR? CHR,57 /FALSE
|
|
LESS? CHR,48 /FALSE
|
|
MUL SUM,10 >?TMP1
|
|
SUB CHR,48
|
|
ADD ?TMP1,STACK >SUM
|
|
?CND13: INC 'BPTR
|
|
JUMP ?PRG8
|
|
?REP9: ZERO? TIM /?CCL36
|
|
PUTB GL-P-TIME,TPTR,SUM
|
|
EQUAL? TPTR,K-HRS /FALSE
|
|
EQUAL? TPTR,K-MIN \?CCL41
|
|
LESS? SUM,0 /FALSE
|
|
GRTR? SUM,59 \?CND34
|
|
RFALSE
|
|
?CCL41: ZERO? TPTR \?CND34
|
|
RFALSE
|
|
?CCL36: EQUAL? AM-PM?,2 \?CND47
|
|
LESS? SUM,12 \?CND47
|
|
ADD SUM,12 >SUM
|
|
?CND47: PUTB GL-P-TIME,K-HRS,SUM
|
|
PUTB GL-P-TIME,K-MIN,0
|
|
PUTB GL-P-TIME,K-SEC,0
|
|
?CND34: ICALL RT-CHANGE-LEXV,PTR,W?INTNUM
|
|
GRTR? SUM,9999 /FALSE
|
|
ZERO? TIM /?CND51
|
|
SET 'SUM,0
|
|
?CND51: SET 'GL-P-TIME-FLAG,TIM
|
|
SET 'GL-P-NUMBER,SUM
|
|
RETURN W?INTNUM
|
|
|
|
|
|
.FUNCT V-WAIT-FOR,H,M,S,N
|
|
EQUAL? GL-PRSO,TH-TIME \?CCL3
|
|
SET 'N,GL-P-NUMBER
|
|
EQUAL? N,-1 \?CND4
|
|
SET 'N,1
|
|
?CND4: GETP GL-PRSO,P?OBJ-NOUN
|
|
EQUAL? STACK,W?MINUTE,W?MINUTES \?CCL8
|
|
SET 'H,0
|
|
SET 'M,N
|
|
JUMP ?CND6
|
|
?CCL8: SET 'H,N
|
|
SET 'M,0
|
|
?CND6: SET 'S,0
|
|
PRINTI "Time passes..."
|
|
CRLF
|
|
CALL RT-CLOCK-JMP,H,M,S
|
|
RSTACK
|
|
?CCL3: ZERO? GL-P-TIME-FLAG \?CCL10
|
|
EQUAL? GL-PRSO,TH-INTNUM /?CCL10
|
|
ICALL1 RT-CYOU-MSG
|
|
PRINT K-CANT-WAIT-MSG
|
|
CRLF
|
|
RETURN 2
|
|
?CCL10: GETB GL-P-TIME,K-HRS >H
|
|
GETB GL-P-TIME,K-MIN >M
|
|
GETB GL-P-TIME,K-SEC >S
|
|
EQUAL? GL-PRSO,TH-INTNUM \?CND13
|
|
ZERO? GL-P-TIME-FLAG \?CND13
|
|
PRINTC 91
|
|
PRINTN H
|
|
PRINTI ":00]"
|
|
CRLF
|
|
CRLF
|
|
?CND13: GRTR? H,23 \?CCL19
|
|
ICALL1 RT-CYOU-MSG
|
|
PRINT K-CANT-WAIT-MSG
|
|
CRLF
|
|
RETURN 2
|
|
?CCL19: ZERO? BELIEVE-WAIT-TIME? \?CTR20
|
|
GRTR? H,12 \?CCL21
|
|
?CTR20: GETB GL-TIME,K-HRS
|
|
SUB H,STACK >H
|
|
GETB GL-TIME,K-MIN
|
|
SUB M,STACK >M
|
|
GETB GL-TIME,K-SEC
|
|
SUB S,STACK >S
|
|
JUMP ?CND17
|
|
?CCL21: GETB GL-TIME,K-HRS
|
|
SUB STACK,1
|
|
MOD STACK,12
|
|
ADD STACK,1
|
|
SUB H,STACK >H
|
|
GETB GL-TIME,K-MIN
|
|
SUB M,STACK >M
|
|
GETB GL-TIME,K-SEC
|
|
SUB S,STACK >S
|
|
?CND17: SUB S,59
|
|
DIV STACK,60 >N
|
|
ADD M,N >M
|
|
MUL N,60
|
|
SUB S,STACK >S
|
|
SUB M,59
|
|
DIV STACK,60 >N
|
|
ADD H,N >H
|
|
MUL N,60
|
|
SUB M,STACK >M
|
|
?PRG24: LESS? H,0 \?REP25
|
|
ZERO? BELIEVE-WAIT-TIME? /?CCL30
|
|
ADD H,24 >H
|
|
JUMP ?PRG24
|
|
?CCL30: ADD H,12 >H
|
|
JUMP ?PRG24
|
|
?REP25: ZERO? H \?CCL33
|
|
ZERO? M \?CCL33
|
|
ZERO? S \?CCL33
|
|
PRINTI "It is"
|
|
GETB GL-TIME,K-HRS
|
|
SUB STACK,1
|
|
MOD STACK,12
|
|
ADD STACK,1
|
|
GRTR? STACK,9 \?CND37
|
|
PRINTC 32
|
|
?CND37: ICALL2 RT-CLK-NTI-MSG,6
|
|
PRINTI " now."
|
|
CRLF
|
|
ICALL2 RT-TIME-OF-DAY-MSG,TRUE-VALUE
|
|
RETURN 2
|
|
?CCL33: PRINTI "Time passes..."
|
|
CRLF
|
|
ICALL RT-CLOCK-JMP,H,M,S
|
|
ICALL2 RT-TIME-OF-DAY-MSG,TRUE-VALUE
|
|
RTRUE
|
|
|
|
|
|
.FUNCT RT-WAIT-TOD-MSG,TOD
|
|
CRLF
|
|
PRINTI "While you were waiting, "
|
|
ZERO? TOD \?CCL3
|
|
PRINTR "the sun set and the mists rolled in."
|
|
?CCL3: EQUAL? TOD,1 \?CCL5
|
|
PRINTR "the sky started to lighten. Soon it will be sunrise."
|
|
?CCL5: EQUAL? TOD,2 \?CCL7
|
|
PRINTR "the sun rose... as much as it ever does here."
|
|
?CCL7: PRINTR "the sun set. Soon it will be dark."
|
|
|
|
|
|
.FUNCT RT-WINDOW,TABLE,MARGIN,Y,I,WIDTH,LINES,STR,PLINES
|
|
SET 'Y,8
|
|
SET 'I,2
|
|
GET TABLE,0 >LINES
|
|
GET TABLE,1 >WIDTH
|
|
SET 'PLINES,LINES
|
|
GRTR? WIDTH,GL-ALLSCREEN \?CND1
|
|
PRINTR "[*** Window too wide ***]"
|
|
?CND1: ZERO? MARGIN \?CND3
|
|
DIV WIDTH,2
|
|
SUB GL-MIDSCREEN,STACK >MARGIN
|
|
?CND3: ADD LINES,6
|
|
SPLIT STACK
|
|
SCREEN K-S-WIN
|
|
HLIGHT K-H-INV
|
|
CURSET Y,MARGIN
|
|
ICALL2 RT-PRINT-SPACES,WIDTH
|
|
?PRG5: INC 'Y
|
|
CURSET Y,MARGIN
|
|
DEC 'LINES
|
|
ZERO? LINES \?CND7
|
|
ICALL2 RT-PRINT-SPACES,WIDTH
|
|
HLIGHT K-H-NRM
|
|
SCREEN K-S-NOR
|
|
SPLIT 1
|
|
DIROUT K-D-SCR-OFF
|
|
SET 'I,2
|
|
CRLF
|
|
PRINTC 91
|
|
?PRG12: DEC 'PLINES
|
|
ZERO? PLINES /?REP13
|
|
GET TABLE,I >STR
|
|
ZERO? STR /?CND16
|
|
EQUAL? I,2 /?CND18
|
|
PRINTC 32
|
|
?CND18: PRINT STR
|
|
EQUAL? PLINES,1 \?CND16
|
|
PRINTC 93
|
|
?CND16: CRLF
|
|
INC 'I
|
|
JUMP ?PRG12
|
|
?CND7: GET TABLE,I >STR
|
|
ZERO? STR \?CCL11
|
|
ICALL2 RT-PRINT-SPACES,WIDTH
|
|
JUMP ?CND9
|
|
?CCL11: PRINTC 32
|
|
PRINT STR
|
|
PRINTC 32
|
|
?CND9: INC 'I
|
|
JUMP ?PRG5
|
|
?REP13: CRLF
|
|
DIROUT K-D-SCR-ON
|
|
RTRUE
|
|
|
|
|
|
.FUNCT HOLMES-COMPLAINS,AMP?,SS?
|
|
ZERO? AMP? /?CND1
|
|
CALL1 RT-ANYONE-HERE?
|
|
EQUAL? STACK,FALSE-VALUE,CH-HOLMES \?CND1
|
|
SET 'AMP?,FALSE-VALUE
|
|
?CND1: ZERO? SS? \?PRD9
|
|
ZERO? AMP? /FALSE
|
|
?PRD9: CALL1 RT-WHO-SAYS?
|
|
EQUAL? STACK,CH-HOLMES \FALSE
|
|
CRLF
|
|
PRINTI "Holmes "
|
|
ZERO? AMP? /?CND12
|
|
PRINTI "takes you aside and whispers, ""Watson, you must keep the ampoule hidden"
|
|
?CND12: ZERO? SS? /?CND14
|
|
ZERO? AMP? /?CCL18
|
|
PRINTI ", and"
|
|
JUMP ?CND16
|
|
?CCL18: PRINTI "says, ""Watson,"
|
|
?CND16: PRINTI " take that ridiculous thing out of your ears"
|
|
?CND14: PRINTR "."""
|
|
|
|
|
|
.FUNCT TOO-DARK-TO-GO,NEWPLACE
|
|
PRINTI "You start off into the "
|
|
FSET? NEWPLACE,FL-INDOORS \?CCL3
|
|
PRINTI "darkness"
|
|
JUMP ?CND1
|
|
?CCL3: PRINTI "fog"
|
|
?CND1: PRINTR ", but think better of it when you realize you have no light to guide your way."
|
|
|
|
|
|
.FUNCT RT-AC-CH-PLAYER-AUX
|
|
ZERO? GL-NOW-PRSI? /?CCL3
|
|
EQUAL? GL-WINNER,CH-PLAYER \FALSE
|
|
EQUAL? GL-PRSA,V?GIVE \FALSE
|
|
ICALL RT-PERFORM,V?TAKE,GL-PRSO
|
|
RTRUE
|
|
?CCL3: ZERO? GL-NOW-PRSI? \FALSE
|
|
EQUAL? GL-PRSA,V?EXAMINE,V?LOOK-ON,V?SEARCH \FALSE
|
|
PRINTR "You don't look any uglier than usual."
|
|
|
|
|
|
.FUNCT RT-CHECK-HANDS
|
|
EQUAL? GL-PRSA,V?TAKE-OFF \?CCL3
|
|
EQUAL? GL-PRSO,TH-HANDS /TRUE
|
|
?CCL3: EQUAL? GL-PRSA,V?PUT-ON,V?TAKE \?CCL7
|
|
EQUAL? GL-PRSO,TH-HANDS \?CCL7
|
|
EQUAL? GL-PRSI,TH-EARS /TRUE
|
|
?CCL7: EQUAL? GL-PRSA,V?COVER \FALSE
|
|
EQUAL? GL-PRSI,TH-HANDS \FALSE
|
|
EQUAL? GL-PRSO,TH-EARS /TRUE
|
|
RFALSE
|
|
|
|
|
|
.FUNCT RT-HANDS-COVERING-EARS
|
|
PRINTI "You cannot do that because "
|
|
ICALL2 RT-THEO-PRINT,TH-HANDS
|
|
PRINTI " are covering "
|
|
ICALL2 RT-THEO-PRINT,TH-EARS
|
|
PRINTR "."
|
|
|
|
.ENDI
|