"Generic PARSER file for
The ZORK Trilogy
started on 7/28/83 by MARC"
"Parser global variable convention: All parser globals will
begin with 'P-'. Local variables are not restricted in any
way.
"
<SETG SIBREAKS ".,\"">
<GLOBAL GWIM-DISABLE <>>
<GLOBAL PRSA <>>
<GLOBAL PRSI <>>
<GLOBAL PRSO <>>
<GLOBAL P-TABLE 0>
<GLOBAL P-ONEOBJ 0>
The grammar line found when the most recent command was parsed. (Except for simple direction commands, which are a special case.) See the Grammar tab.
<GLOBAL P-SYNTAX 0>
<GLOBAL P-CCSRC 0>
<GLOBAL P-LEN 0>
<GLOBAL P-DIR 0>
WINNER is the actor in the current command. (Compare PLAYER.)
WINNER is usually ADVENTURER, but for a command like ROBOT, GO EAST it shifts to the named NPC. (But Zork 1 has no commandable NPCs, so this doesn’t come up.)
“Winner” is just as sarcastic as “cretin”, but from the other side.
<GLOBAL WINNER 0>
<GLOBAL P-LEXV <ITABLE BYTE 120>>
<GLOBAL P-INBUF <ITABLE BYTE 100>>
<GLOBAL P-CONT <>>
<GLOBAL P-IT-OBJECT <>>
<GLOBAL P-IT-LOC <>>
<GLOBAL P-OFLAG <>>
<GLOBAL P-MERGED <>>
<GLOBAL P-ACLAUSE <>>
<GLOBAL P-ANAM <>>
<GLOBAL P-AADJ <>>
<CONSTANT P-PHRLEN 3>
<CONSTANT P-ORPHLEN 7>
<CONSTANT P-RTLEN 3>
<CONSTANT P-LEXWORDS 1>
<CONSTANT P-LEXSTART 1>
<CONSTANT P-LEXELEN 2>
<CONSTANT P-WORDLEN 4>
<CONSTANT P-PSOFF 4>
<CONSTANT P-P1OFF 5>
<CONSTANT P-P1BITS 3>
<CONSTANT P-ITBLLEN 9>
<GLOBAL P-ITBL <TABLE 0 0 0 0 0 0 0 0 0 0>>
<GLOBAL P-OTBL <TABLE 0 0 0 0 0 0 0 0 0 0>>
<GLOBAL P-VTBL <TABLE 0 0 0 0>>
<GLOBAL P-NCN 0>
<CONSTANT P-VERB 0>
<CONSTANT P-VERBN 1>
<CONSTANT P-PREP1 2>
<CONSTANT P-PREP1N 3>
<CONSTANT P-PREP2 4>
<CONSTANT P-PREP2N 5>
<CONSTANT P-NC1 6>
<CONSTANT P-NC1L 7>
<CONSTANT P-NC2 8>
<CONSTANT P-NC2L 9>
<GLOBAL QUOTE-FLAG <>>
" Grovel down the input finding the verb, prepositions, and noun clauses.
If the input is <direction> or <walk> <direction>, fall out immediately
setting PRSA to ,V?WALK and PRSO to <direction>. Otherwise, perform
all required orphaning, syntax checking, and noun clause lookup."
<ROUTINE PARSER ("AUX" (PTR ,P-LEXSTART) WRD (VAL 0) (VERB <>)
LEN (DIR <>) (NW 0) (LW 0) NUM SCNT (CNT -1))
<REPEAT ()
<COND (<G? <SET CNT <+ .CNT 1>> ,P-ITBLLEN> <RETURN>)
<NOT <VERB? SAY>>>
<CRLF>)>
(T
<TELL ">">
<COND (<0? ,P-LEN> <TELL "I beg your pardon?" CR> <RFALSE>)>
<REPEAT ()
<RETURN>)
(<OR <SET WRD <GET ,P-LEXV .PTR>>
<COND (<AND <==? .WRD ,W?TO>
<EQUAL? .VERB ,ACT?TELL >>
<SET WRD ,W?QUOTE>)
(<AND <==? .WRD ,W?THEN>
<NOT .VERB>
<SET WRD ,W?QUOTE>)>
<COND (<OR <EQUAL? .WRD ,W?THEN ,W?PERIOD>
<EQUAL? .WRD ,W?QUOTE>>
<COND (<EQUAL? .WRD ,W?QUOTE>
<RETURN>)
(<AND <SET VAL
,PS?DIRECTION
,P1?DIRECTION>>
<EQUAL? .VERB <> ,ACT?WALK>
<OR <==? .LEN 1>
<AND <==? .LEN 2>
<EQUAL? .VERB ,ACT?WALK>>
<AND <EQUAL? <SET NW
,W?THEN
,W?PERIOD
,W?QUOTE>
<NOT <L? .LEN 2>>>
<==? .LEN 2>
<EQUAL? .NW ,W?QUOTE>>
<AND <G? .LEN 2>
<EQUAL? .NW ,W?COMMA ,W?AND>>>>
<SET DIR .VAL>
<COND (<EQUAL? .NW ,W?COMMA ,W?AND>
,W?THEN>)>
<COND (<NOT <G? .LEN 2>>
<RETURN>)>)
(<AND <SET VAL <WT? .WRD ,PS?VERB ,P1?VERB>>
<NOT .VERB>>
<SET VERB .VAL>
<SET NUM
<+ <* .PTR 2> 2>>>>
(<OR <SET VAL <WT? .WRD ,PS?PREPOSITION 0>>
<AND <OR <EQUAL? .WRD ,W?ALL ,W?ONE >
<SET VAL 0>>>
<COND (<AND <G? ,P-LEN 0>
,W?OF>
<0? .VAL>
<NOT
<EQUAL? .WRD ,W?ALL ,W?ONE ,W?A>>>)
(<AND <NOT <0? .VAL>>
<EQUAL? <GET ,P-LEXV <+ .PTR 2>>
,W?THEN ,W?PERIOD>>>
<TELL
"There were too many nouns in that sentence." CR>
<RFALSE>)
(T
<OR <SET PTR <CLAUSE .PTR .VAL .WRD>>
<RFALSE>>
<COND (<L? .PTR 0>
<RETURN>)>)>)
(<WT? .WRD ,PS?BUZZ-WORD>)
(<AND <EQUAL? .VERB ,ACT?TELL>
<WT? .WRD ,PS?VERB ,P1?VERB>>
<TELL
"Please consult your manual for the correct way to talk to other people
or creatures." CR>
<RFALSE>)
(T
<RFALSE>)>)
(T
<RFALSE>)>
<SET LW .WRD>
<COND (.DIR
<RETURN T>)>
T)>>
<GLOBAL P-WALK-DIR <>>
<ROUTINE WT? (PTR BIT "OPTIONAL" (B1 5) "AUX" (OFFS ,P-P1OFF) TYP)
<COND (<BTST <SET TYP <GETB .PTR ,P-PSOFF>> .BIT>
<COND (<G? .B1 4> <RTRUE>)
(T
<COND (<NOT <==? .TYP .B1>> <SET OFFS <+ .OFFS 1>>)>
<GETB .PTR .OFFS>)>)>>
<ROUTINE CLAUSE (PTR VAL WRD "AUX" OFF NUM (ANDFLG <>) (FIRST?? T) NW (LW 0))
<SET OFF <* <- ,P-NCN 1> 2>>
<COND (<NOT <==? .VAL 0>>
<COND (<EQUAL? <GET ,P-LEXV .PTR> ,W?THE ,W?A ,W?AN>
<REPEAT ()
<RETURN -1>)>
<COND (<OR <SET WRD <GET ,P-LEXV .PTR>>
<COND (<0? ,P-LEN> <SET NW 0>)
<COND (<EQUAL? .WRD ,W?AND ,W?COMMA> <SET ANDFLG T>)
(<EQUAL? .WRD ,W?ALL ,W?ONE>
<COND (<==? .NW ,W?OF>
(<OR <EQUAL? .WRD ,W?THEN ,W?PERIOD>
<AND <WT? .WRD ,PS?PREPOSITION>
<NOT .FIRST??>>>
<+ .NUM 1>
<COND (<AND <G? ,P-LEN 0>
<EQUAL? .NW ,W?OF>
<NOT <EQUAL? .WRD ,W?ALL ,W?ONE>>>
T)
,PS?ADJECTIVE
,P1?ADJECTIVE>
<NOT <==? .NW 0>>
(<AND <NOT .ANDFLG>
<NOT <EQUAL? .NW ,W?BUT ,W?EXCEPT>>
<NOT <EQUAL? .NW ,W?AND ,W?COMMA>>>
<+ .NUM 1>
<REST ,P-LEXV <* <+ .PTR 2> 2>>>
<RETURN .PTR>)
(T <SET ANDFLG <>>)>)
<OR <WT? .WRD ,PS?ADJECTIVE>
<WT? .WRD ,PS?BUZZ-WORD>>>)
(<AND .ANDFLG
<OR <WT? .WRD ,PS?DIRECTION>
<SET PTR <- .PTR 4>>
<PUT ,P-LEXV <+ .PTR 2> ,W?THEN>
(<WT? .WRD ,PS?PREPOSITION> T)
(T
<RFALSE>)>)
<SET LW .WRD>
<SET FIRST?? <>>
<ROUTINE NUMBER? (PTR "AUX" CNT BPTR CHR (SUM 0) (TIM <>))
<SET CNT <GETB <REST ,P-LEXV <* .PTR 2>> 2>>
<SET BPTR <GETB <REST ,P-LEXV <* .PTR 2>> 3>>
<REPEAT ()
<COND (<L? <SET CNT <- .CNT 1>> 0> <RETURN>)
(T
<COND (<==? .CHR 58>
<SET TIM .SUM>
<SET SUM 0>)
(<G? .SUM 10000> <RFALSE>)
(<AND <L? .CHR 58> <G? .CHR 47>>
<SET SUM <+ <* .SUM 10> <- .CHR 48>>>)
(T <RFALSE>)>
<SET BPTR <+ .BPTR 1>>)>>
<COND (<G? .SUM 1000> <RFALSE>)
(.TIM
<COND (<L? .TIM 8> <SET TIM <+ .TIM 12>>)
(<G? .TIM 23> <RFALSE>)>
<SET SUM <+ .SUM <* .TIM 60>>>)>
,W?INTNUM>
<GLOBAL P-NUMBER 0>
<GLOBAL P-DIRECTION 0>
<ROUTINE ORPHAN-MERGE ("AUX" (CNT -1) TEMP VERB BEG END (ADJ <>) WRD)
<SET ADJ T>)>
<NOT .ADJ>
<RFALSE>)
(<==? ,P-NCN 2> <RFALSE>)
<0? .TEMP>>
<COND (.ADJ
(T
(T <RFALSE>)>)
<0? .TEMP>>
<COND (.ADJ
(T <RFALSE>)>)
<COND (<AND <NOT <==? ,P-NCN 1>> <NOT .ADJ>>
<RFALSE>)
(T
<COND (.ADJ <SET BEG <REST ,P-LEXV 2>> <SET ADJ <>>)>
<REPEAT ()
<SET WRD <GET .BEG 0>>
<COND (<==? .BEG .END>
(<AND <NOT .ADJ>
,PS?ADJECTIVE>
<EQUAL? .WRD ,W?ALL ,W?ONE>>>
<SET ADJ .WRD>)
(<OR <BTST <GETB .WRD ,P-PSOFF> ,PS?OBJECT>
<==? .WRD ,W?ONE>>
<COND (<NOT <EQUAL? .WRD ,P-ANAM ,W?ONE>>
<RFALSE>)
<COND (<EQUAL? .END 0>
<SET END .BEG>
<REPEAT ()
<RTRUE>)
T>
<ROUTINE ACLAUSE-WIN (ADJ)
<RTRUE>>
<ROUTINE WORD-PRINT (CNT BUF)
<REPEAT ()
<COND (<DLESS? CNT 0> <RETURN>)
(ELSE
<SET BUF <+ .BUF 1>>)>>>
<ROUTINE UNKNOWN-WORD (PTR "AUX" BUF)
<COND (<VERB? SAY>
<TELL "Nothing happens." CR>
<RFALSE>)>
<TELL "I don't know the word \"">
<TELL "\"." CR>
<ROUTINE CANT-USE (PTR "AUX" BUF)
<COND (<VERB? SAY>
<TELL "Nothing happens." CR>
<RFALSE>)>
<TELL "You used the word \"">
<TELL "\" in a way that I don't understand." CR>
<GLOBAL P-SLOCBITS 0>
<CONSTANT P-SYNLEN 8>
<CONSTANT P-SBITS 0>
<CONSTANT P-SPREP1 1>
<CONSTANT P-SPREP2 2>
<CONSTANT P-SFWIM1 3>
<CONSTANT P-SFWIM2 4>
<CONSTANT P-SLOC1 5>
<CONSTANT P-SLOC2 6>
<CONSTANT P-SACTION 7>
<CONSTANT P-SONUMS 3>
<ROUTINE SYNTAX-CHECK ("AUX" SYN LEN NUM OBJ
(DRIVE1 <>) (DRIVE2 <>) PREP VERB TMP)
<TELL "There was no verb in that sentence!" CR>
<RFALSE>)>
<SET SYN <GET ,VERBS <- 255 .VERB>>>
<SET LEN <GETB .SYN 0>>
<SET SYN <REST .SYN>>
<REPEAT ()
<COND (<G? ,P-NCN .NUM> T)
(<AND <NOT <L? .NUM 1>>
<SET DRIVE1 .SYN>)
<COND (<AND <==? .NUM 2> <==? ,P-NCN 1>>
<SET DRIVE2 .SYN>)
<RTRUE>)>)>
<COND (<DLESS? LEN 1>
<COND (<OR .DRIVE1 .DRIVE2> <RETURN>)
(T
<TELL
"That sentence isn't one I recognize." CR>
<RFALSE>)>)
<COND (<AND .DRIVE1
<SET OBJ
(<AND .DRIVE2
<SET OBJ
(<EQUAL? .VERB ,ACT?FIND>
<TELL "That question can't be answered." CR>
<RFALSE>)
(T
<TELL "What do you want to ">
<COND (<==? .TMP 0> <TELL "tell">)
<PRINTB <GET .TMP 0>>)
(T
<COND (.DRIVE2
<TELL "?" CR>
<RFALSE>)>>
<ROUTINE CANT-ORPHAN ()
<TELL "\"I don't understand! What are you referring to?\"" CR>
<RFALSE>>
<ROUTINE ORPHAN (D1 D2 "AUX" (CNT -1))
<REPEAT ()
<COND (.D1
(.D2
<ROUTINE CLAUSE-PRINT (BPTR EPTR "OPTIONAL" (THE? T))
<ROUTINE BUFFER-PRINT (BEG END CP "AUX" (NOSP <>) WRD (FIRST?? T) (PN <>))
<REPEAT ()
<COND (<==? .BEG .END> <RETURN>)
(T
<COND (.NOSP <SET NOSP <>>)
(T <TELL " ">)>
<COND (<==? <SET WRD <GET .BEG 0>> ,W?PERIOD>
<SET NOSP T>)
(T
<COND (<AND .FIRST?? <NOT .PN> .CP>
<TELL "the ">)>
(<AND <==? .WRD ,W?IT>
(T
<GETB .BEG 3>>)>
<SET FIRST?? <>>)>)>
<ROUTINE CAPITALIZE (PTR)
<PRINTC <- <GETB ,P-INBUF <GETB .PTR 3>> 32>>
<WORD-PRINT <- <GETB .PTR 2> 1> <+ <GETB .PTR 3> 1>>>
<ROUTINE PREP-PRINT (PREP "AUX" WRD)
<COND (<NOT <0? .PREP>>
<TELL " ">
<PRINTB .WRD>)>>
<ROUTINE CLAUSE-COPY (BPTR EPTR "OPTIONAL" (INSRT <>) "AUX" BEG END)
.BPTR
<REPEAT ()
<COND (<==? .BEG .END>
.EPTR
2>>>
<RETURN>)
(T
<COND (<AND .INSRT <==? ,P-ANAM <GET .BEG 0>>>
<ROUTINE CLAUSE-ADD (WRD "AUX" PTR)
<ROUTINE PREP-FIND (PREP "AUX" (CNT 0) SIZE)
<SET SIZE <* <GET ,PREPOSITIONS 0> 2>>
<REPEAT ()
<COND (<IGRTR? CNT .SIZE> <RFALSE>)
(<==? <GET ,PREPOSITIONS .CNT> .PREP>
<RETURN <GET ,PREPOSITIONS <- .CNT 1>>>)>>>
<ROUTINE SYNTAX-FOUND (SYN)
A filter used when GWIM searches for objects. For example, for an IGNITE command, P-GWIMBIT would be set to FLAMEBIT so the parser can search for a flaming object.
<GLOBAL P-GWIMBIT 0>
“Get What I Mean”. The parser uses this to infer a missing object or ask a disambiguation question.
<ROUTINE GWIM (GBIT LBIT PREP "AUX" OBJ)
<COND (<EQUAL? <SET OBJ <GET ,P-MERGE 1>> ,ME>
<RFALSE>)>
<TELL "(">
<COND (<NOT <0? .PREP>>
<COND (<==? .PREP ,W?OUT>
<TELL " of">)>
<TELL " your hands)" CR>)
(T
<TELL " the ">)>)>
<COND (<NOT <==? .OBJ ,HANDS>>
<TELL D .OBJ ")" CR>)>
.OBJ)>)
<ROUTINE SNARF-OBJECTS ("AUX" PTR)
<RTRUE>>
<ROUTINE BUT-MERGE (TBL "AUX" LEN BUTLEN (CNT 1) (MATCHES 0) OBJ NTBL)
<REPEAT ()
<COND (<DLESS? LEN 0> <RETURN>)
(T
<SET MATCHES <+ .MATCHES 1>>)>
<SET CNT <+ .CNT 1>>>
.NTBL>
<GLOBAL P-NAM <>>
<GLOBAL P-ADJ <>>
<GLOBAL P-ADVERB <>>
<GLOBAL P-ADJN <>>
<GLOBAL P-PRSO <ITABLE NONE 50>>
<GLOBAL P-PRSI <ITABLE NONE 50>>
<GLOBAL P-BUTS <ITABLE NONE 50>>
<GLOBAL P-MERGE <ITABLE NONE 50>>
<GLOBAL P-OCLAUSE <ITABLE NONE 50>>
<GLOBAL P-MATCHLEN 0>
<GLOBAL P-GETFLAGS 0>
<CONSTANT P-ALL 1>
<CONSTANT P-ONE 2>
<CONSTANT P-INHIBIT 4>
<GLOBAL P-CSPTR <>>
<GLOBAL P-CEPTR <>>
<GLOBAL P-AND <>>
<ROUTINE SNARFEM (PTR EPTR TBL "AUX" (BUT <>) LEN WV WRD NW)
<SET WRD <GET .PTR 0>>
<REPEAT ()
<COND (<==? .PTR .EPTR> <RETURN <GET-OBJECT <OR .BUT .TBL>>>)
(T
<COND (<==? .WRD ,W?ALL>
<COND (<==? .NW ,W?OF>
(<EQUAL? .WRD ,W?BUT ,W?EXCEPT>
(<EQUAL? .WRD ,W?A ,W?ONE>
<COND (<==? .NW ,W?OF>
(T
<AND <0? .NW> <RTRUE>>)>)
(<AND <EQUAL? .WRD ,W?AND ,W?COMMA>
<NOT <EQUAL? .NW ,W?AND ,W?COMMA>>>
T)
(<WT? .WRD ,PS?BUZZ-WORD>)
(<EQUAL? .WRD ,W?AND ,W?COMMA>)
(<==? .WRD ,W?OF>
(<AND <SET WV <WT? .WRD ,PS?ADJECTIVE ,P1?ADJECTIVE>>
(<WT? .WRD ,PS?OBJECT ,P1?OBJECT>
<COND (<NOT <==? .PTR .EPTR>>
<SET WRD .NW>)>>>
<CONSTANT SH 128>
<CONSTANT SC 64>
<CONSTANT SIR 32>
<CONSTANT SOG 16>
<CONSTANT STAKE 8>
<CONSTANT SMANY 4>
<CONSTANT SHAVE 2>
<ROUTINE GET-OBJECT (TBL
"OPTIONAL" (VRB T)
"AUX" BITS LEN XBITS TLEN (GCHECK <>) (OLEN 0) OBJ)
<COND (.VRB
<TELL
"There seems to be a noun missing in that sentence!" CR>)>
<RFALSE>)>
<PROG ()
(T
<NOT <0? .LEN>>>
<COND (<NOT <==? .LEN 1>>
<PUT .TBL 1 <GET .TBL <RANDOM .LEN>>>
<TELL "(How about the ">
<PRINTD <GET .TBL 1>>
<TELL "?)" CR>)>
(<OR <G? .LEN 1>
<SET OLEN .LEN>
<PUT .TBL
<AGAIN>)
(T
<COND (<0? .LEN> <SET LEN .OLEN>)>
<RFALSE>)
(.VRB
<TELL
"There seems to be a noun missing in that sentence!" CR>)>
<RFALSE>)>)
(<AND <0? .LEN> .GCHECK>
<COND (.VRB
<RTRUE>)
(T <TELL "It's too dark to see!" CR>)>)>
<RFALSE>)
(<0? .LEN> <SET GCHECK T> <AGAIN>)>
<RTRUE>>>
<ROUTINE MOBY-FIND (TBL "AUX" FOO LEN)
<SET FOO <FIRST? ,ROOMS>>
<REPEAT ()
<COND (<NOT .FOO> <RETURN>)
(T
<SET FOO <NEXT? .FOO>>)>>
<COND (<EQUAL? <SET LEN <GET .TBL ,P-MATCHLEN>> 0>
<COND (<EQUAL? <SET LEN <GET .TBL ,P-MATCHLEN>> 0>
<COND (<EQUAL? <SET LEN <GET .TBL ,P-MATCHLEN>> 1>
.LEN>
<GLOBAL P-MOBY-FOUND <>>
<GLOBAL P-XNAM <>>
<GLOBAL P-XADJ <>>
<GLOBAL P-XADJN <>>
<ROUTINE WHICH-PRINT (TLEN LEN TBL "AUX" OBJ RLEN)
<SET RLEN .LEN>
<TELL "Which">
<TELL " do you mean, ">
<REPEAT ()
<SET TLEN <+ .TLEN 1>>
<SET OBJ <GET .TBL .TLEN>>
<TELL "the " D .OBJ>
<COND (<==? .LEN 2>
<COND (<NOT <==? .RLEN 2>> <TELL ",">)>
<TELL " or ">)
(<G? .LEN 2> <TELL ", ">)>
<COND (<L? <SET LEN <- .LEN 1>> 1>
<TELL "?" CR>
<RETURN>)>>>
<ROUTINE GLOBAL-CHECK (TBL "AUX" LEN RMG RMGL (CNT 0) OBJ OBITS FOO)
<SET RMGL <- <PTSIZE .RMG> 1>>
<REPEAT ()
<COND (<THIS-IT? <SET OBJ <GETB .RMG .CNT>> .TBL>
<COND (<IGRTR? CNT .RMGL> <RETURN>)>>)>
<SET RMGL <- </ <PTSIZE .RMG> 4> 1>>
<SET CNT 0>
<REPEAT ()
<COND (<==? ,P-NAM <GET .RMG <* .CNT 2>>>
<GET .RMG <+ <* .CNT 2> 1>>>
<SET FOO
<PUT .FOO 0 <GET ,P-NAM 0>>
<PUT .FOO 1 <GET ,P-NAM 1>>
<RETURN>)
(<IGRTR? CNT .RMGL> <RETURN>)>>)>
<EQUAL? ,PRSA ,V?LOOK-INSIDE ,V?SEARCH ,V?EXAMINE>>
<ROUTINE DO-SL (OBJ BIT1 BIT2 "AUX" BTS)
(T
(T <RTRUE>)>)>>
<CONSTANT P-SRCBOT 2>
<CONSTANT P-SRCTOP 0>
<CONSTANT P-SRCALL 1>
<ROUTINE SEARCH-LIST (OBJ TBL LVL "AUX" FLS NOBJ)
<COND (<SET OBJ <FIRST? .OBJ>>
<REPEAT ()
<COND (<AND <OR <NOT <==? .LVL ,P-SRCTOP>>
<SET NOBJ <FIRST? .OBJ>>
<SET FLS
<SEARCH-LIST .OBJ
.TBL
<COND (<SET OBJ <NEXT? .OBJ>>) (T <RETURN>)>>)>>
<ROUTINE OBJ-FOUND (OBJ TBL "AUX" PTR)
<PUT .TBL <+ .PTR 1> .OBJ>
<ROUTINE TAKE-CHECK ()
<ROUTINE ITAKE-CHECK (TBL IBITS "AUX" PTR OBJ TAKEN)
#DECL ((TBL) TABLE (IBITS PTR) FIX (OBJ) OBJECT
(TAKEN) <OR FALSE FIX ATOM>)
<REPEAT ()
<COND (<L? <SET PTR <- .PTR 1>> 0> <RETURN>)
(T
<SET OBJ <GET .TBL <+ .PTR 1>>>
<COND (<AND <NOT <HELD? .OBJ>>
<SET TAKEN T>)
<SET TAKEN <>>)
(<AND <BTST .IBITS ,STAKE>
<SET TAKEN <>>)
(T <SET TAKEN T>)>
<COND (<AND .TAKEN <BTST .IBITS ,SHAVE>>
<COND (<EQUAL? .OBJ
<TELL
"You don't have that!" CR>
<RFALSE>)>
<TELL "You don't have the ">
<PRINTD .OBJ>
<TELL "." CR>
<RFALSE>)
(<AND <NOT .TAKEN>
<TELL "(Taken)" CR>)>)>)>>)
(T)>>
<ROUTINE MANY-CHECK ("AUX" (LOSS <>) TMP)
<SET LOSS 1>)
<SET LOSS 2>)>
<COND (.LOSS
<TELL "You can't use multiple ">
<COND (<==? .LOSS 2> <TELL "in">)>
<TELL "direct objects with \"">
<COND (<0? .TMP> <TELL "tell">)
<PRINTB <GET .TMP 0>>)
(T
<TELL "\"." CR>
<RFALSE>)
(T)>>
<ROUTINE ZMEMQ (ITM TBL "OPTIONAL" (SIZE -1) "AUX" (CNT 1))
<COND (<NOT .TBL> <RFALSE>)>
<COND (<NOT <L? .SIZE 0>> <SET CNT 0>)
(ELSE <SET SIZE <GET .TBL 0>>)>
<REPEAT ()
<COND (<==? .ITM <GET .TBL .CNT>> <RTRUE>)
(<IGRTR? CNT .SIZE> <RFALSE>)>>>
<ROUTINE ZMEMQB (ITM TBL SIZE "AUX" (CNT 0))
<REPEAT ()
<COND (<==? .ITM <GETB .TBL .CNT>> <RTRUE>)
(<IGRTR? CNT .SIZE> <RFALSE>)>>>
Whether the player is inherently emitting light. This is set when you are dead, so that you can move spectrally around the world without carrying a light source.
<GLOBAL ALWAYS-LIT <>>
Determine whether the current location has light. This is true if the room or anything in it has ONBIT. It’s also true if the player is ALWAYS-LIT.
This routine is always used to set the LIT variable.
<ROUTINE LIT? (RM "OPTIONAL" (RMBIT T) "AUX" OHERE (LIT <>))
<RTRUE>)>
<COND (<AND .RMBIT
<SET LIT T>)
(T
<COND (<==? .OHERE .RM>
.LIT>
<ROUTINE PRSO-PRINT ("AUX" PTR)
<ROUTINE PRSI-PRINT ("AUX" PTR)
<ROUTINE THIS-IT? (OBJ TBL "AUX" SYNS)
<- </ <PTSIZE .SYNS> 2> 1>>>>
<RFALSE>)
<RFALSE>)
<RFALSE>)>
<RTRUE>>