166 lines
3.1 KiB
Plaintext
166 lines
3.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
|
|
GET TBL,DEXITOBJ
|
|
EQUAL? DR,STACK \?PRG1
|
|
GET TBL,REXIT
|
|
RETURN STACK
|
|
|
|
|
|
.FUNCT DOOR-DIR,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
|
|
GET TBL,DEXITOBJ
|
|
EQUAL? DR,STACK \?PRG1
|
|
EQUAL? P,P?NORTH,P?EAST /?THN12
|
|
EQUAL? P,P?SOUTH,P?WEST \?PRG1
|
|
?THN12: RETURN P
|
|
|
|
|
|
.FUNCT FACE-DOOR,DR,PER
|
|
EQUAL? PRSA,V?UNLOCK,V?OPEN,V?LOOK-THROUGH /?THN8
|
|
EQUAL? PRSA,V?LOCK,V?KNOCK,V?CLOSE \FALSE
|
|
?THN8: CALL DOOR-DIR,HERE,DR >PER
|
|
ZERO? PER /FALSE
|
|
CALL2 OPP-DIR,PER >PLAYER-NOT-FACING
|
|
EQUAL? PLAYER-NOT-FACING-OLD,PLAYER-NOT-FACING /FALSE
|
|
PRINTI "[You're facing to "
|
|
CALL2 DIR-PRINT,PER
|
|
PRINTR ".]"
|
|
|
|
|
|
.FUNCT FIND-FLAG,RM,FLAG,EXCLUDED=0,O,CAR,STA?
|
|
FIRST? RM >O /?KLU14
|
|
?KLU14: GETP WINNER,P?CAR >CAR
|
|
CALL ZMEMQ,RM,STATION-ROOMS >STA?
|
|
?PRG1: ZERO? O /FALSE
|
|
FSET? O,FLAG \?ELS7
|
|
EQUAL? O,EXCLUDED /?ELS7
|
|
ZERO? STA? \?THN10
|
|
GETP O,P?CAR
|
|
EQUAL? STACK,CAR \?ELS7
|
|
?THN10: RETURN O
|
|
?ELS7: NEXT? O >O /?KLU15
|
|
?KLU15: JUMP ?PRG1
|
|
|
|
|
|
.FUNCT FIND-FLAG-CAR,RM,CAR,FLAG,O
|
|
FIRST? RM >O /?KLU12
|
|
?KLU12:
|
|
?PRG1: ZERO? O /FALSE
|
|
FSET? O,FLAG \?ELS7
|
|
GETP O,P?CAR
|
|
EQUAL? STACK,CAR \?ELS7
|
|
RETURN O
|
|
?ELS7: NEXT? O >O /?KLU13
|
|
?KLU13: JUMP ?PRG1
|
|
|
|
|
|
.FUNCT FIND-FLAG-LG,RM,FLAG,TBL,O,CNT=0,SIZE
|
|
GETPT RM,P?GLOBAL >TBL
|
|
ZERO? TBL /FALSE
|
|
PTSIZE TBL
|
|
DIV STACK,2
|
|
SUB STACK,1 >SIZE
|
|
?PRG6: GET TBL,CNT >O
|
|
FSET? O,FLAG \?ELS10
|
|
RETURN O
|
|
?ELS10: IGRTR? 'CNT,SIZE \?PRG6
|
|
RFALSE
|
|
|
|
|
|
.FUNCT FIND-FLAG-HERE,FLAG,NOT1=0,NOT2=0,NOT3=0,O,CAR,STA?
|
|
FIRST? HERE >O /?KLU14
|
|
?KLU14: GETP WINNER,P?CAR >CAR
|
|
CALL ZMEMQ,HERE,STATION-ROOMS >STA?
|
|
?PRG1: ZERO? O /FALSE
|
|
FSET? O,FLAG \?ELS7
|
|
EQUAL? O,NOT1,NOT2,NOT3 /?ELS7
|
|
ZERO? STA? \?THN10
|
|
GETP O,P?CAR
|
|
EQUAL? STACK,CAR \?ELS7
|
|
?THN10: RETURN O
|
|
?ELS7: NEXT? O >O /?KLU15
|
|
?KLU15: JUMP ?PRG1
|
|
|
|
|
|
.FUNCT FIND-FLAG-HERE-NOT,FLAG,NFLAG,NOT2=0,O,CAR,STA?
|
|
FIRST? HERE >O /?KLU14
|
|
?KLU14: GETP WINNER,P?CAR >CAR
|
|
CALL ZMEMQ,HERE,STATION-ROOMS >STA?
|
|
?PRG1: ZERO? O /FALSE
|
|
FSET? O,FLAG \?ELS7
|
|
FSET? O,NFLAG /?ELS7
|
|
EQUAL? O,NOT2 /?ELS7
|
|
ZERO? STA? \?THN10
|
|
GETP O,P?CAR
|
|
EQUAL? STACK,CAR \?ELS7
|
|
?THN10: RETURN O
|
|
?ELS7: NEXT? O >O /?KLU15
|
|
?KLU15: JUMP ?PRG1
|
|
|
|
|
|
.FUNCT NEXT-ROOM,RM,DIR,PT,PTS
|
|
GETPT RM,DIR >PT
|
|
ZERO? PT /FALSE
|
|
PTSIZE PT >PTS
|
|
EQUAL? PTS,UEXIT \?ELS10
|
|
GET PT,REXIT
|
|
RSTACK
|
|
?ELS10: EQUAL? PTS,NEXIT /FALSE
|
|
EQUAL? PTS,FEXIT \?ELS14
|
|
GET PT,FEXITFCN
|
|
CALL STACK
|
|
RSTACK
|
|
?ELS14: EQUAL? PTS,CEXIT \?ELS16
|
|
GETB PT,CEXITFLAG
|
|
VALUE STACK
|
|
ZERO? STACK /FALSE
|
|
GET PT,REXIT
|
|
RSTACK
|
|
?ELS16: EQUAL? PTS,DEXIT \FALSE
|
|
GET PT,REXIT
|
|
RSTACK
|
|
|
|
|
|
.FUNCT OUTSIDE?,RM
|
|
EQUAL? RM,ROOF,OTHER-ROOF,BESIDE-TRACKS /TRUE
|
|
EQUAL? RM,SIDEWALK,OTHER-BESIDE-TRACKS /TRUE
|
|
RFALSE
|
|
|
|
|
|
.FUNCT WINDOW-IN?,RM
|
|
CALL FIND-FLAG-LG,RM,WINDOWBIT
|
|
RSTACK
|
|
|
|
|
|
.FUNCT FRESH-AIR?,RM,P,L,TBL,O
|
|
SET 'P,0
|
|
?PRG1: NEXTP HERE,P >P
|
|
ZERO? P /FALSE
|
|
LESS? P,LOW-DIRECTION /?PRG1
|
|
GETPT HERE,P >TBL
|
|
PTSIZE TBL >L
|
|
EQUAL? L,DEXIT \?PRG1
|
|
GET TBL,DEXITOBJ >O
|
|
FSET? O,OPENBIT \?PRG1
|
|
PRINTI "There's a pleasant breeze coming through the "
|
|
PRINTD O
|
|
PRINTR "."
|
|
|
|
.ENDI
|