217 lines
4.1 KiB
Plaintext
217 lines
4.1 KiB
Plaintext
|
|
|
|
.FUNCT NULL-F,A1,A2
|
|
RFALSE
|
|
|
|
|
|
.FUNCT DOOR-ROOM,RM,DR,P=0,TBL
|
|
?PRG1: NEXTP RM,P >P
|
|
ZERO? P /FALSE
|
|
LESS? P,LOW-DIRECTION /FALSE
|
|
GETPT RM,P >TBL
|
|
PTSIZE TBL
|
|
EQUAL? DEXIT,STACK \?PRG1
|
|
GETB TBL,DEXITOBJ
|
|
EQUAL? DR,STACK \?PRG1
|
|
GETB TBL,REXIT
|
|
RSTACK
|
|
|
|
|
|
.FUNCT FIND-FLAG,RM,FLAG,EXCLUDED=0,O
|
|
FIRST? RM >O /?PRG1
|
|
?PRG1: ZERO? O /FALSE
|
|
FSET? O,FLAG \?CCL7
|
|
FSET? O,INVISIBLE /?CCL7
|
|
EQUAL? O,EXCLUDED /?CCL7
|
|
RETURN O
|
|
?CCL7: NEXT? O >O /?PRG1
|
|
JUMP ?PRG1
|
|
|
|
|
|
.FUNCT FIND-FLAG-NOT,RM,FLAG,O
|
|
FIRST? RM >O /?PRG1
|
|
?PRG1: ZERO? O /FALSE
|
|
FSET? O,FLAG /?CCL7
|
|
FSET? O,INVISIBLE /?CCL7
|
|
RETURN O
|
|
?CCL7: NEXT? O >O /?PRG1
|
|
JUMP ?PRG1
|
|
|
|
|
|
.FUNCT FIND-FLAG-LG,RM,FLAG,FLAG2=0,TBL,O,CNT=0,SIZE
|
|
GETPT RM,P?GLOBAL >TBL
|
|
ZERO? TBL /FALSE
|
|
PTSIZE TBL
|
|
SUB STACK,1 >SIZE
|
|
?PRG4: GETB TBL,CNT >O
|
|
FSET? O,FLAG \?CCL8
|
|
FSET? O,INVISIBLE /?CCL8
|
|
ZERO? FLAG2 /?CTR7
|
|
FSET? O,FLAG2 \?CCL8
|
|
?CTR7: RETURN O
|
|
?CCL8: IGRTR? 'CNT,SIZE \?PRG4
|
|
RFALSE
|
|
|
|
|
|
.FUNCT FIND-FLAG-HERE,FLAG,NOT1=0,NOT2=0,O
|
|
FIRST? HERE >O /?PRG1
|
|
?PRG1: ZERO? O /FALSE
|
|
FSET? O,FLAG \?CCL7
|
|
FSET? O,INVISIBLE /?CCL7
|
|
EQUAL? O,NOT1,NOT2 /?CCL7
|
|
RETURN O
|
|
?CCL7: NEXT? O >O /?PRG1
|
|
JUMP ?PRG1
|
|
|
|
|
|
.FUNCT FIND-FLAG-HERE-NOT,FLAG,NFLAG,NOT2=0,O
|
|
FIRST? HERE >O /?PRG1
|
|
?PRG1: ZERO? O /FALSE
|
|
FSET? O,FLAG \?CCL7
|
|
FSET? O,NFLAG /?CCL7
|
|
FSET? O,INVISIBLE /?CCL7
|
|
EQUAL? O,NOT2 /?CCL7
|
|
RETURN O
|
|
?CCL7: NEXT? O >O /?PRG1
|
|
JUMP ?PRG1
|
|
|
|
|
|
.FUNCT LEVER-F,X=0
|
|
FSET? HERE,SECRETBIT \?CCL3
|
|
CALL FIND-FLAG-LG,HERE,DOORBIT >X
|
|
JUMP ?CND1
|
|
?CCL3: EQUAL? HERE,DUNGEON,LOVER-PATH \?CND1
|
|
SET 'X,PRIEST-DOOR
|
|
?CND1: ZERO? X \?CCL7
|
|
CALL NOT-HERE,LEVER
|
|
RTRUE
|
|
?CCL7: EQUAL? PRSA,V?TURN,V?TAKE,V?RUB /?CTR8
|
|
EQUAL? PRSA,V?PUSH,V?MOVE-DIR,V?MOVE \?CCL9
|
|
?CTR8: FSET X,TOUCHBIT
|
|
CALL OPEN-CLOSE,X
|
|
RSTACK
|
|
?CCL9: EQUAL? PRSA,V?OPEN \?CCL13
|
|
FSET X,TOUCHBIT
|
|
CALL OKAY,X,STR?66
|
|
RTRUE
|
|
?CCL13: EQUAL? PRSA,V?CLOSE \FALSE
|
|
FSET X,TOUCHBIT
|
|
CALL OKAY,X,STR?61
|
|
RTRUE
|
|
|
|
|
|
.FUNCT OPEN-CLOSE,DR,SAY-NAME=1,X
|
|
ZERO? SAY-NAME /?PRG5
|
|
CALL START-SENTENCE,DR
|
|
?PRG5: PRINTI " creaks "
|
|
FSET? DR,OPENBIT \?CCL9
|
|
FCLEAR DR,OPENBIT
|
|
CALL THIS-IS-IT,DR
|
|
PRINTI "closed.
|
|
"
|
|
CALL REMOVE-CAREFULLY
|
|
RTRUE
|
|
?CCL9: CALL DOOR-ROOM,HERE,DR >X
|
|
ZERO? X /FALSE
|
|
FSET DR,OPENBIT
|
|
CALL THIS-IS-IT,X
|
|
PRINTI "open, revealing"
|
|
FSET? HERE,SECRETBIT \?CCL18
|
|
CALL PRINTT,X
|
|
JUMP ?CND16
|
|
?CCL18: EQUAL? HERE,LOVER-PATH \?PRG25
|
|
CALL PRINTT,DUNGEON
|
|
JUMP ?CND16
|
|
?PRG25: PRINTI " a "
|
|
PRINTD PASSAGE
|
|
?CND16: FSET DR,SEENBIT
|
|
FSET X,SEENBIT
|
|
PRINTR "!"
|
|
|
|
|
|
.FUNCT OUTSIDE?,RM
|
|
CALL GLOBAL-IN?,MOON,RM
|
|
RSTACK
|
|
|
|
|
|
.FUNCT WINDOW-F
|
|
EQUAL? PRSA,V?UNLOCK /?CTR2
|
|
EQUAL? PRSA,V?LOCK,V?CLOSE,V?OPEN \?CCL3
|
|
?CTR2: EQUAL? HERE,DRIVEWAY /?CTR7
|
|
LOC PLAYER
|
|
EQUAL? STACK,CAR \?CCL8
|
|
?CTR7: CALL NO-NEED
|
|
RTRUE
|
|
?CCL8: EQUAL? PRSA,V?OPEN \?CCL12
|
|
PRINTR "The night air is too damp and chilly."
|
|
?CCL12: CALL ALREADY,WINDOW,STR?61
|
|
RTRUE
|
|
?CCL3: EQUAL? PRSA,V?THROUGH,V?LEAVE,V?DISEMBARK \?CCL16
|
|
PRINTR "It's closed tight against the mist."
|
|
?CCL16: EQUAL? PRSA,V?LOOK-OUTSIDE,V?LOOK-THROUGH,V?LOOK-INSIDE \FALSE
|
|
LOC WINNER
|
|
EQUAL? STACK,CAR \?PRG24
|
|
CALL V-LOOK
|
|
RSTACK
|
|
?PRG24: PRINTR "All you can see are grey shapes in the moonlight."
|
|
|
|
|
|
.FUNCT CORRIDOR-LOOK,ITM=0,C,Z,COR,VAL,FOUND=0
|
|
GETP HERE,P?CORRIDOR >C
|
|
ZERO? C /FALSE
|
|
?PRG5: SUB C,4 >Z
|
|
LESS? Z,0 /?CCL9
|
|
SET 'COR,COR-4
|
|
JUMP ?CND7
|
|
?CCL9: SUB C,2 >Z
|
|
LESS? Z,0 /?CCL11
|
|
SET 'COR,COR-2
|
|
JUMP ?CND7
|
|
?CCL11: SUB C,1 >Z
|
|
LESS? Z,0 /?REP6
|
|
SET 'COR,COR-1
|
|
?CND7: CALL CORRIDOR-CHECK,COR,ITM >VAL
|
|
ZERO? FOUND \?CND14
|
|
SET 'FOUND,VAL
|
|
?CND14: SET 'C,Z
|
|
JUMP ?PRG5
|
|
?REP6: RETURN FOUND
|
|
|
|
|
|
.FUNCT CORRIDOR-CHECK,COR,ITM,CNT=1,PAST=0,FOUND=0,RM,OBJ
|
|
?PRG1: INC 'CNT
|
|
GET COR,CNT >RM
|
|
ZERO? RM /FALSE
|
|
EQUAL? RM,ITM \?CCL7
|
|
GET COR,PAST
|
|
RSTACK
|
|
?CCL7: EQUAL? ITM,ROOMS \?CCL9
|
|
CALL THIS-IT?,RM
|
|
ZERO? STACK /?CCL9
|
|
RETURN RM
|
|
?CCL9: CALL LIT?,RM
|
|
ZERO? STACK \?CCL13
|
|
EQUAL? ITM,ROOMS \?PRG1
|
|
?CCL13: EQUAL? RM,HERE \?CCL17
|
|
SET 'PAST,1
|
|
JUMP ?PRG1
|
|
?CCL17: FIRST? RM >OBJ \?PRG1
|
|
?PRG19: ZERO? ITM /?CCL23
|
|
EQUAL? OBJ,ITM \?CND21
|
|
GET COR,PAST >FOUND
|
|
JUMP ?REP20
|
|
?CCL23: FSET? OBJ,PERSONBIT \?CND21
|
|
CALL IN-MOTION?,OBJ,TRUE-VALUE
|
|
ZERO? STACK \?CND21
|
|
PRINTD OBJ
|
|
PRINTI " is in"
|
|
CALL PRINTT,RM
|
|
PRINTC 46
|
|
CRLF
|
|
?CND21: NEXT? OBJ >OBJ /?KLU35
|
|
?KLU35: ZERO? OBJ \?PRG19
|
|
?REP20: ZERO? FOUND /?PRG1
|
|
RETURN FOUND
|
|
|
|
.ENDI
|