mirror of
https://github.com/historicalsource/moonmist
synced 2024-05-20 09:48:32 +03:00
3351 lines
98 KiB
Plaintext
3351 lines
98 KiB
Plaintext
"PARSER for MOONMIST
|
||
Copyright (C) 1986 Infocom, Inc. All rights reserved."
|
||
|
||
"Parser global variable convention: All parser globals will
|
||
begin with 'P-'. Local variables are not restricted in any
|
||
way."
|
||
|
||
<SETG SIBREAKS ".,\"!?'">
|
||
|
||
<GLOBAL PRSA:NUMBER 0>
|
||
<GLOBAL PRSI:OBJECT 0>
|
||
<GLOBAL PRSO:OBJECT 0>
|
||
<GLOBAL OPRSO:OBJECT 0>
|
||
|
||
<GLOBAL P-SYNTAX 0>
|
||
|
||
<GLOBAL P-LEN:NUMBER 0>
|
||
|
||
;<GLOBAL P-DIR 0>
|
||
|
||
<GLOBAL WINNER:OBJECT PLAYER>
|
||
|
||
<GLOBAL P-LEXV <ITABLE 79 (LEXV) 0 #BYTE 0 #BYTE 0>>
|
||
<GLOBAL AGAIN-LEXV <ITABLE 79 (LEXV) 0 #BYTE 0 #BYTE 0>>
|
||
<GLOBAL RESERVE-LEXV <ITABLE 79 (LEXV) 0 #BYTE 0 #BYTE 0>>
|
||
<GLOBAL RESERVE-PTR:NUMBER <>>
|
||
|
||
"INBUF - Input buffer for READ"
|
||
<GLOBAL P-INBUF <ITABLE 80 (BYTE LENGTH) 0>>
|
||
<GLOBAL OOPS-INBUF <ITABLE 80 (BYTE LENGTH) 0>>
|
||
<GLOBAL RESERVE-INBUF <ITABLE 80 (BYTE LENGTH) 0>>
|
||
|
||
<GLOBAL OOPS-TABLE <TABLE <> <> <> <>>>
|
||
<CONSTANT O-PTR 0> "word pointer to unknown token in P-LEXV"
|
||
<CONSTANT O-START 1> "word pointer to sentence start in P-LEXV"
|
||
<CONSTANT O-LENGTH 2> "byte length of unparsed tokens in P-LEXV"
|
||
<CONSTANT O-END 3> "byte pointer to first free byte in OOPS-INBUF"
|
||
|
||
"Parse-cont variable"
|
||
<GLOBAL P-CONT:NUMBER <>>
|
||
|
||
<GLOBAL P-IT-OBJECT:OBJECT <>>
|
||
<GLOBAL P-HER-OBJECT:OBJECT FRIEND>
|
||
<GLOBAL P-HIM-OBJECT:OBJECT LORD>
|
||
"<GLOBAL P-THEM-OBJECT:OBJECT <>>"
|
||
|
||
"Orphan flag"
|
||
<GLOBAL P-OFLAG:FLAG <>>
|
||
|
||
<GLOBAL P-MERGED:FLAG <>>
|
||
|
||
<GLOBAL P-ACLAUSE <>>
|
||
|
||
<GLOBAL P-ANAM <>>
|
||
|
||
<GLOBAL P-AADJ <>>
|
||
|
||
"Byte offset to # of entries in LEXV"
|
||
<CONSTANT P-LEXWORDS 1>
|
||
|
||
"Word offset to start of LEXV entries"
|
||
<CONSTANT P-LEXSTART 1>
|
||
|
||
"Number of words per LEXV entry"
|
||
<CONSTANT P-LEXELEN 2>
|
||
<CONSTANT P-WORDLEN 4>
|
||
|
||
"Offset to parts of speech byte"
|
||
<CONSTANT P-PSOFF %<COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE> 6) (T 4)>>
|
||
|
||
"Offset to first part of speech"
|
||
<CONSTANT P-P1OFF %<COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE> 7) (T 5)>>
|
||
|
||
"First part of speech bit mask in PSOFF byte"
|
||
<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-OVTBL <TABLE 0 0 0 0>>
|
||
|
||
<GLOBAL P-NCN:NUMBER 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:FLAG <>>
|
||
|
||
;<GLOBAL P-ADVERB <>>
|
||
<GLOBAL P-PRSA-WORD <>>
|
||
<GLOBAL P-END-ON-PREP:FLAG <>>
|
||
<GLOBAL P-WON <>>
|
||
<CONSTANT M-FATAL 2>
|
||
|
||
<CONSTANT M-BEG 1>
|
||
<CONSTANT M-ENTER 2>
|
||
<CONSTANT M-LOOK 3>
|
||
<CONSTANT M-FLASH 4>
|
||
<CONSTANT M-OBJDESC 5>
|
||
<CONSTANT M-END 6>
|
||
<CONSTANT M-CONT 7>
|
||
<CONSTANT M-WINNER 8>
|
||
<CONSTANT M-EXIT 9>
|
||
<CONSTANT M-OTHER 69>
|
||
|
||
<ROUTINE MAIN-LOOP ("AUX" X) <REPEAT () <SET X <MAIN-LOOP-1>>>>
|
||
|
||
<ROUTINE MAIN-LOOP-1 ("AUX" ICNT OCNT NUM CNT OBJ ;TBL V PTBL OBJ1 TMP X GW)
|
||
<SET CNT 0>
|
||
<SET OBJ <>>
|
||
<SET PTBL T>
|
||
;<COND (<NOT <==? ,QCONTEXT-ROOM ,HERE>>
|
||
<SETG QCONTEXT <>>)>
|
||
<COND (<SETG P-WON <PARSER>>
|
||
<SETG CLOCK-WAIT <>>
|
||
<SET ICNT <GET/B ,P-PRSI ,P-MATCHLEN>>
|
||
<SET OCNT <GET/B ,P-PRSO ,P-MATCHLEN>>
|
||
<COND (<AND <ZERO? .OCNT> <ZERO? .ICNT>>
|
||
T)
|
||
(<AND ,P-IT-OBJECT <ACCESSIBLE? ,P-IT-OBJECT>>
|
||
<SET TMP <>>
|
||
<REPEAT ()
|
||
<COND (<IGRTR? CNT .ICNT>
|
||
<RETURN>)>
|
||
<COND (<EQUAL? <GET/B ,P-PRSI .CNT> ,IT>
|
||
<PUT/B ,P-PRSI .CNT ,P-IT-OBJECT>
|
||
<TELL-I-ASSUME ,P-IT-OBJECT>
|
||
<SET TMP T>
|
||
<RETURN>)>>
|
||
<COND (T ;<ZERO? .TMP>
|
||
<SET CNT 0>
|
||
<REPEAT ()
|
||
<COND (<IGRTR? CNT .OCNT>
|
||
<RETURN>)>
|
||
<COND (<EQUAL? <GET/B ,P-PRSO .CNT> ,IT>
|
||
<PUT/B ,P-PRSO .CNT ,P-IT-OBJECT>
|
||
<TELL-I-ASSUME ,P-IT-OBJECT>
|
||
<RETURN>)>>)>
|
||
<SET CNT 0>)>
|
||
<SET NUM
|
||
<COND (<0? .OCNT> .OCNT)
|
||
(<G? .OCNT 1>
|
||
;<SET TBL ,P-PRSO>
|
||
<COND (<0? .ICNT> <SET OBJ <>>)
|
||
(T <SET OBJ <GET/B ,P-PRSI 1>>)>
|
||
.OCNT)
|
||
(<G? .ICNT 1>
|
||
<SET PTBL <>>
|
||
;<SET TBL ,P-PRSI>
|
||
<SET OBJ <GET/B ,P-PRSO 1>>
|
||
.ICNT)
|
||
(T ;.ICNT 1)>>
|
||
<COND (<AND <NOT .OBJ> <1? .ICNT>>
|
||
<SET OBJ <GET/B ,P-PRSI 1>>)>
|
||
<COND (<EQUAL? ,PRSA ,V?WALK ;,V?FACE>
|
||
<COND ;(<ZERO? ,PRSO>
|
||
<SET V <PERFORM ,PRSA <GET/B ,P-PRSO 1>>>)
|
||
(T <SET V <PERFORM ,PRSA ,PRSO>>)>)
|
||
(<0? .NUM>
|
||
<COND (<0? <BAND <GETB ,P-SYNTAX ,P-SBITS> ,P-SONUMS>>
|
||
<SET V <PERFORM ,PRSA>>
|
||
<SETG PRSO <>>)
|
||
(<AND <ZERO? ,LIT> <SEE-VERB?>>
|
||
;<AND <NOT ,LIT>
|
||
<NOT <VERB? WAIT-FOR WAIT-UNTIL>>
|
||
<NOT <SPEAKING-VERB?>>
|
||
<NOT <GAME-VERB?>>>
|
||
<SETG QUOTE-FLAG <>>
|
||
<SETG P-CONT <>>
|
||
<TOO-DARK>)
|
||
(T
|
||
<SETG QUOTE-FLAG <>>
|
||
<SETG P-CONT <>>
|
||
<TELL "(There isn't any">
|
||
<COND (<OR <AND .PTBL
|
||
<==? <GETB ,P-SYNTAX ,P-SFWIM1>
|
||
,PERSONBIT>>
|
||
<AND <NOT .PTBL>
|
||
<==? <GETB ,P-SYNTAX ,P-SFWIM2>
|
||
,PERSONBIT>>>
|
||
<TELL "one">)
|
||
(T <TELL "thing">)>
|
||
<TELL " to ">
|
||
<SET TMP <GET ,P-ITBL ,P-VERBN>>
|
||
<COND (<VERB? TELL>
|
||
<TELL "talk to">)
|
||
(<OR ,P-MERGED ,P-OFLAG>
|
||
<PRINTB <GET .TMP 0>>)
|
||
(T
|
||
<SET V <WORD-PRINT <GETB .TMP 2>
|
||
<GETB .TMP 3>>>)>
|
||
<TELL "!)" CR>
|
||
<SET V <>>)>)
|
||
(<AND .PTBL <G? .NUM 1> <VERB? COMPARE>>
|
||
<SET V <PERFORM ,PRSA ,OBJECT-PAIR>>)
|
||
(T
|
||
<SET X 0>
|
||
;"<SETG P-MULT <>>
|
||
<COND (<G? .NUM 1> <SETG P-MULT T>)>"
|
||
<SET TMP 0>
|
||
<SET GW <>>
|
||
<REPEAT ()
|
||
<COND (<IGRTR? CNT .NUM>
|
||
<COND (<G? .X 0>
|
||
<TELL "The ">
|
||
<COND (<NOT <EQUAL? .X .NUM>>
|
||
<TELL "other ">)>
|
||
<TELL "object">
|
||
<COND (<NOT <EQUAL? .X 1>>
|
||
<TELL !\s>)>
|
||
<TELL " that you mentioned ">
|
||
<COND (<NOT <EQUAL? .X 1>>
|
||
<TELL "are">)
|
||
(T <TELL "is">)>
|
||
<TELL "n't here." CR>)
|
||
(<NOT .TMP>
|
||
<MORE-SPECIFIC ;REFERRING>)>
|
||
<RETURN>)
|
||
(T
|
||
<COND (.PTBL
|
||
<SET OBJ1 <GET/B ,P-PRSO .CNT>>)
|
||
(T <SET OBJ1 <GET/B ,P-PRSI .CNT>>)>
|
||
<COND (<OR <G? .NUM 1>
|
||
<EQUAL? <GET <GET ,P-ITBL ,P-NC1> 0>
|
||
,W?ALL>>
|
||
<COND (<==? .OBJ1 ,NOT-HERE-OBJECT>
|
||
<SET X <+ .X 1>>
|
||
<AGAIN>)
|
||
(<AND <EQUAL? ,P-GETFLAGS ,P-ALL>
|
||
<NOT<VERB-ALL-TEST .OBJ1 .OBJ>>>
|
||
<AGAIN>)
|
||
(<NOT <ACCESSIBLE? .OBJ1>>
|
||
<AGAIN>)
|
||
(<==? .OBJ1 ,PLAYER> <AGAIN>)
|
||
;(<FSET? .OBJ1 ,DUPLICATE> <AGAIN>)
|
||
(T
|
||
<COND (<==? .OBJ1 ,COSTUME>
|
||
<COND (<T? .GW>
|
||
<AGAIN>)
|
||
(T <SET GW T>)>)>
|
||
<COND (<EQUAL? .OBJ1 ,IT>
|
||
<PRINTD ,P-IT-OBJECT>)
|
||
(T <PRINTD .OBJ1>)>
|
||
<TELL ": ">)>)>
|
||
<SET TMP T>
|
||
<SET V <QCONTEXT-CHECK <COND (.PTBL .OBJ1)
|
||
(T .OBJ)>>>
|
||
<COND (.PTBL
|
||
<SETG PRSO .OBJ1>
|
||
<SETG PRSI .OBJ>)
|
||
(T
|
||
<SETG PRSO .OBJ>
|
||
<SETG PRSI .OBJ1>)>
|
||
<SET V <PERFORM ,PRSA ,PRSO ,PRSI>>
|
||
<COND (<==? .V ,M-FATAL> <RETURN>)>)>>)>
|
||
<SETG OPRSO ,PRSO>
|
||
<COND (<==? .V ,M-FATAL> <SETG P-CONT <>>)>)
|
||
(T
|
||
<SETG CLOCK-WAIT T>
|
||
<SETG P-CONT <>>)>
|
||
<COND (<AND <ZERO? ,CLOCK-WAIT> <T? ,P-WON>>
|
||
<COND (<OR ;<VERB? SAVE RESTORE>
|
||
<NOT <GAME-VERB?>>>
|
||
<SETG CLOCKER-RUNNING 1>
|
||
<SET V <CLOCKER>>
|
||
<SETG CLOCKER-RUNNING 2 ;0>)>)>
|
||
<SETG PRSA <>>
|
||
<SETG PRSO <>>
|
||
<SETG PRSI <>>>
|
||
|
||
<ROUTINE TELL-I-ASSUME (OBJ "OPT" (STR 0))
|
||
<COND (<OR <T? .STR>
|
||
<AND <NOT <==? ,OPRSO .OBJ>>
|
||
<NOT <FSET? .OBJ ,SECRETBIT>>>>
|
||
<TELL ,I-ASSUME>
|
||
<COND (<T? .STR> <TELL .STR>)>
|
||
<TELL THE .OBJ ".]" CR>)>>
|
||
|
||
<ROUTINE VERB-ALL-TEST (O I "AUX" L) ;"O=PRSO I=PRSI"
|
||
<SET L <LOC .O>>
|
||
<COND (<EQUAL? .O ,PAINT>
|
||
<RFALSE>)
|
||
(<VERB? DROP GIVE>
|
||
<COND (<EQUAL? .O ;,POCKET ,NOW-WEARING>
|
||
<RFALSE>)
|
||
(<OR <==? .L ,WINNER> ;<IN? ,P-IT-OBJECT ,WINNER>>
|
||
<RTRUE>)
|
||
(T <RFALSE>)>)
|
||
(<VERB? PUT PUT-IN>
|
||
<COND (<EQUAL? .O .I ;,POCKET ,NOW-WEARING>
|
||
<RFALSE>)
|
||
(<NOT <IN? ;HELD? .O .I>>
|
||
<RTRUE>)
|
||
(T <RFALSE>)>)
|
||
(<VERB? TAKE>
|
||
<COND (<FSET? .O ,SECRETBIT>
|
||
<RFALSE>)
|
||
(<AND <NOT <FSET? .O ,TAKEBIT>>
|
||
<NOT <FSET? .O ,TRYTAKEBIT>>>
|
||
<RFALSE>)>
|
||
<COND (<NOT <ZERO? .I>>
|
||
<COND (<NOT <==? .L .I>>
|
||
<RFALSE>)
|
||
;(T
|
||
<SET L .I>)>)
|
||
(<EQUAL? .L ;,WINNER ,HERE>
|
||
<COND (<AND <==? .O ,CANDLE>
|
||
<NOT <EQUAL? ,P-PRSA-WORD ,W?RAISE ,W?LIFT>>>
|
||
<RFALSE>)
|
||
(T <RTRUE>)>)>
|
||
<COND (<OR <FSET? .L ,PERSONBIT>
|
||
<FSET? .L ,SURFACEBIT>>
|
||
<RTRUE>)
|
||
(<AND <FSET? .L ,CONTBIT>
|
||
<FSET? .L ,OPENBIT>>
|
||
<RTRUE>)
|
||
(T <RFALSE>)>)
|
||
(<NOT <ZERO? .I>>
|
||
<COND (<NOT <==? .O .I>>
|
||
<RTRUE>)
|
||
(T <RFALSE>)>)
|
||
(T <RTRUE>)>>
|
||
|
||
<ROUTINE GAME-VERB? ()
|
||
%<DEBUG-CODE <COND (<VERB? $GENDER $GOAL $QUEUE
|
||
$RANDOM $COMMAND $RECORD $UNRECORD ;$WHERE DEBUG>
|
||
<RTRUE>)>>
|
||
<COND (<VERB? BRIEF QUIT RESTART RESTORE SAVE SCORE SCRIPT SUPER-BRIEF
|
||
TELL TIME UNSCRIPT VERBOSE VERSION $VERIFY>
|
||
<RTRUE>)>>
|
||
|
||
<ROUTINE QCONTEXT-CHECK (PER "AUX" OTHER (WHO <>) (N 0))
|
||
<COND (<OR <VERB? ;FIND HELP ;WHAT>
|
||
<AND <VERB? SHOW TELL-ABOUT>
|
||
<==? .PER ,PLAYER>>> ;"? more?"
|
||
<SET OTHER <FIRST? ,HERE>>
|
||
<REPEAT ()
|
||
<COND (<NOT .OTHER> <RETURN>)
|
||
(<AND <FSET? .OTHER ,PERSONBIT>
|
||
<NOT <FSET? .OTHER ,INVISIBLE>>
|
||
<NOT <==? .OTHER ,PLAYER>>>
|
||
<SET N <+ 1 .N>>
|
||
<SET WHO .OTHER>)>
|
||
<SET OTHER <NEXT? .OTHER>>>
|
||
<COND (<AND <==? 1 .N> <ZERO? ,QCONTEXT>>
|
||
<SETG QCONTEXT .WHO>)>
|
||
<COND (<AND <QCONTEXT-GOOD?>
|
||
<==? ,WINNER ,PLAYER>> ;"? more?"
|
||
<SETG WINNER ,QCONTEXT>
|
||
<TELL "(said to " D ,QCONTEXT ")" CR>)>)>>
|
||
|
||
<ROUTINE QCONTEXT-GOOD? ()
|
||
<COND (<AND <NOT <ZERO? ,QCONTEXT>>
|
||
<FSET? ,QCONTEXT ,PERSONBIT>
|
||
<NOT <FSET? ,QCONTEXT ,MUNGBIT ;,INVISIBLE>>
|
||
;<==? ,HERE ,QCONTEXT-ROOM>
|
||
<==? ,HERE <META-LOC ,QCONTEXT>>>
|
||
<RETURN ,QCONTEXT>)>>
|
||
|
||
<ROUTINE NOT-IT (WHO)
|
||
<COND (<EQUAL? .WHO ,P-HER-OBJECT>
|
||
<FCLEAR ,HER ,TOUCHBIT>)
|
||
(<EQUAL? .WHO ,P-HIM-OBJECT>
|
||
<FCLEAR ,HIM ,TOUCHBIT>)
|
||
;(<EQUAL? .WHO ,P-THEM-OBJECT>
|
||
<FCLEAR ,THEM ,TOUCHBIT>)
|
||
(<EQUAL? .WHO ,P-IT-OBJECT>
|
||
<FCLEAR ,IT ,TOUCHBIT>)>>
|
||
|
||
<OBJECT NOT-HERE-OBJECT
|
||
(DESC "that thing")
|
||
(FLAGS NARTICLEBIT)
|
||
(ACTION NOT-HERE-OBJECT-F)>
|
||
|
||
<ROUTINE NOT-HERE-OBJECT-F ("AUX" TBL (PRSO? <>) (OBJ <>))
|
||
;"Protocol: return ,M-FATAL if case was handled and msg TELLed,
|
||
<> if PRSO/PRSI ready to use"
|
||
<COND (<AND <EQUAL? ,PRSO ,NOT-HERE-OBJECT>
|
||
<EQUAL? ,PRSI ,NOT-HERE-OBJECT>>
|
||
<TELL "(Those things aren't here!)" CR>
|
||
<RFATAL>)
|
||
(<EQUAL? ,PRSO ,NOT-HERE-OBJECT>
|
||
<SET TBL ,P-PRSO>
|
||
<SET PRSO? T>)
|
||
(T
|
||
<SET TBL ,P-PRSI>)>
|
||
<COND (<EQUAL? ,P-XADJ ,A?MY>
|
||
<COND (<EQUAL? ,P-XNAM ,W?EYE ,W?EYES>
|
||
<SET OBJ ,EYE>)
|
||
(<EQUAL? ,P-XNAM ,W?HANDS ,W?HAND>
|
||
<SET OBJ ,HANDS>)
|
||
(<EQUAL? ,P-XNAM ,W?HEAD>
|
||
<SET OBJ ,HEAD>)>
|
||
<COND (<T? .OBJ>
|
||
<COND (<T? .PRSO?>
|
||
<SETG PRSO .OBJ>)
|
||
(T <SETG PRSI .OBJ>)>
|
||
<RFALSE>)>)>
|
||
;<COND (<AND <VERB? ASK-ABOUT ASK-FOR SEARCH-FOR>
|
||
<FSET? ,PRSO ,PERSONBIT>
|
||
<IN? ,PRSO ,GLOBAL-OBJECTS>>
|
||
<NOT-HERE-PERSON ,PRSO>
|
||
<RFATAL>)>
|
||
<COND (<AND <EQUAL? ,P-ADJN ,W?YOUR ,W?HER ,W?HIS>
|
||
<T? ,P-NAM>>
|
||
<RESOLVE-YOUR-HER-HIS>)>
|
||
<COND (<OR <AND .PRSO? <PRSO-VERB?>>
|
||
<AND <NOT .PRSO?> <PRSI-VERB?>>>
|
||
<COND (<SET OBJ <FIND-NOT-HERE .TBL .PRSO?>>
|
||
<COND (<NOT <==? .OBJ ,NOT-HERE-OBJECT>>
|
||
<RFATAL>)>)
|
||
(T
|
||
<RFALSE>)>)>
|
||
;"Here is the default 'cant see any' printer"
|
||
<TELL !\( CHE ,WINNER ;"You" " can't ">
|
||
<COND (<VERB? LISTEN> <TELL "hear">)
|
||
(T <TELL "see">)>
|
||
<COND (<NOT <CAPITAL-NOUN? ,P-XNAM>>
|
||
<TELL " any">)>
|
||
<NOT-HERE-PRINT>
|
||
<TELL " right here!)" CR>
|
||
<RFATAL>>
|
||
|
||
<ROUTINE PRSO-VERB? ()
|
||
<COND (<VERB? ;ARREST ASK-CONTEXT-ABOUT ASK-CONTEXT-FOR
|
||
BOARD CLIMB-DOWN CLIMB-UP ;"GO DOWN/UP TO room"
|
||
DISEMBARK DRESS DESCRIBE ;EXAMINE
|
||
FIND FOLLOW LEAVE TALK-ABOUT TELL ;"YELL TO person"
|
||
THROUGH USE WAIT-FOR WALK-TO ;$WHERE>
|
||
<RTRUE>)
|
||
(<AND <NOT <==? ,WINNER ,PLAYER>>
|
||
<VERB? ;BRING GIVE TAKE SSHOW>>
|
||
<RTRUE>)>>
|
||
|
||
<ROUTINE PRSI-VERB? ()
|
||
<COND (<VERB? ASK-ABOUT ASK-FOR SEARCH-FOR ;SSHOOT TAKE-TO TELL-ABOUT ;$WHERE>
|
||
<RTRUE>)
|
||
(<NOT <==? ,WINNER ,PLAYER>>
|
||
<COND (<VERB? ;SBRING SGIVE SHOW>
|
||
<RTRUE>)
|
||
(<VERB? SSHOW>
|
||
<COND (T ;<IN? ,PRSI ,ROOMS> ;"SHOW ME TO MY ROOM"
|
||
<RTRUE>)>)>)>>
|
||
|
||
<ROUTINE GEN-TEST (OBJ)
|
||
<COND (<VISIBLE? .OBJ> ;<IN? .OBJ ,HERE>
|
||
<RTRUE>)
|
||
(<CORRIDOR-LOOK .OBJ>
|
||
<RTRUE>)
|
||
(<AND <OR <VERB? FOLLOW> <REMOTE-VERB?>>
|
||
<FSET? .OBJ ,PERSONBIT>
|
||
<FSET? .OBJ ,SEENBIT>>
|
||
<RTRUE>)>>
|
||
|
||
<ROUTINE NOT-SECRET-TEST (OBJ)
|
||
<COND (<AND <FSET? .OBJ ,SECRETBIT>
|
||
<NOT <FSET? .OBJ ,SEENBIT>>>
|
||
<RFALSE>)
|
||
(T
|
||
<RTRUE>)>>
|
||
|
||
<ROUTINE PRUNE (TBL LEN FCN "AUX" (CNT 1) OBJ)
|
||
<REPEAT ()
|
||
<SET OBJ <GET/B .TBL .CNT>>
|
||
<COND (<ZERO? <APPLY .FCN .OBJ>>
|
||
<DEC LEN>
|
||
<ELIMINATE .TBL .CNT .LEN>
|
||
<COND (<NOT <G? .CNT .LEN>> <AGAIN>)>)>
|
||
<COND (<IGRTR? CNT .LEN> <RETURN>)>>
|
||
<PUT/B .TBL ,P-MATCHLEN .LEN>
|
||
.LEN>
|
||
|
||
<ROUTINE ELIMINATE (TBL CNT N)
|
||
;<COND (<NOT <L? .CNT .N>> <RFALSE>)>
|
||
<REPEAT ()
|
||
<PUT/B .TBL .CNT <GET/B .TBL <+ 1 .CNT>>>
|
||
<COND (<IGRTR? CNT .N> <RETURN>)>>>
|
||
|
||
<GLOBAL P-MOBY-FOUND:OBJECT <>>
|
||
<GLOBAL P-MOBY-FLAG:FLAG <>> "Needed only for ZIL"
|
||
<CONSTANT LAST-OBJECT 0> "ZILCH should stick the # of the last object here"
|
||
|
||
<ROUTINE MOBY-FIND (TBL "AUX" (OBJ 1) LEN FOO)
|
||
<SETG P-NAM ,P-XNAM>
|
||
<SETG P-ADJ ,P-XADJ>
|
||
<PUT/B .TBL ,P-MATCHLEN 0>
|
||
%<COND (<GASSIGNED? PREDGEN> ;<NOT <ZERO? <GETB 0 18>>> ;"ZIP case"
|
||
'<PROG ()
|
||
<REPEAT ()
|
||
<COND (<AND <SET FOO <META-LOC .OBJ T>>
|
||
<SET FOO <THIS-IT? .OBJ>>>
|
||
<SET FOO <OBJ-FOUND .OBJ .TBL>>)>
|
||
<COND (<IGRTR? OBJ ,LAST-OBJECT>
|
||
<RETURN>)>>>)
|
||
(T ;"ZIL case"
|
||
'<PROG ()
|
||
<SETG P-MOBY-FLAG T>
|
||
<SETG P-TABLE .TBL>
|
||
<SETG P-SLOCBITS -1>
|
||
<SET FOO <FIRST? ,ROOMS>>
|
||
<REPEAT ()
|
||
<COND (<NOT .FOO> <RETURN>)
|
||
(T
|
||
<SEARCH-LIST .FOO .TBL ,P-SRCALL ;T>
|
||
<SET FOO <NEXT? .FOO>>)>>
|
||
<COND (T ;<EQUAL? <SET LEN <GET/B .TBL ,P-MATCHLEN>> 0>
|
||
<DO-SL ,LOCAL-GLOBALS 1 1 ;".TBL T">)>
|
||
<COND (T ;<EQUAL? <SET LEN <GET/B .TBL ,P-MATCHLEN>> 0>
|
||
<SEARCH-LIST ,ROOMS .TBL ,P-SRCTOP ;T>)>
|
||
<SETG P-MOBY-FLAG <>>>)>
|
||
<SETG P-NAM <>>
|
||
<SETG P-ADJ <>>
|
||
<SET LEN <GET/B .TBL ,P-MATCHLEN>>
|
||
<COND (<EQUAL? .LEN 1>
|
||
<SETG P-MOBY-FOUND <GET/B .TBL 1>>)>
|
||
.LEN>
|
||
|
||
<ROUTINE FIND-NOT-HERE (TBL PRSO? "AUX" M-F OBJ LEN CNT (LOCAL 0))
|
||
;"Protocol: return T if case was handled and msg TELLed,
|
||
,NOT-HERE-OBJECT if 'can't see' msg TELLed,
|
||
<> if PRSO/PRSI ready to use"
|
||
;"Here is where special-case code goes. <MOBY-FIND .TBL> returns
|
||
number of matches. If 1, then P-MOBY-FOUND is it. One may treat
|
||
the 0 and >1 cases alike or different. It doesn't matter. Always
|
||
return FALSE (not handled) if you have resolved the problem."
|
||
<SET M-F <MOBY-FIND .TBL>>
|
||
%<DEBUG-CODE
|
||
<COND (,DBUG
|
||
<TELL "{Found " N .M-F " objects}" CR>
|
||
<COND (<NOT <==? 1 .M-F>>
|
||
<TELL "{Namely: ">
|
||
<SET CNT 1>
|
||
<SET LEN <GET/B .TBL ,P-MATCHLEN>>
|
||
<REPEAT ()
|
||
<COND (<DLESS? LEN 0> <RETURN>)
|
||
(T <TELL D <GET/B .TBL .CNT> ", ">)>
|
||
<INC CNT>>
|
||
<TELL "}" CR>)>)>>
|
||
<COND (<G? .M-F 1>
|
||
<SET CNT 0>
|
||
<REPEAT ()
|
||
<COND (<G? <SET CNT <+ .CNT 1>> .M-F>
|
||
<RETURN>)>
|
||
<SET OBJ <GET/B .TBL .CNT>>
|
||
<COND (<GEN-TEST .OBJ>
|
||
<COND (<G? <SET LOCAL <+ .LOCAL 1>> 1>
|
||
<RETURN>)
|
||
(ELSE
|
||
<SETG P-MOBY-FOUND .OBJ>)>)>>
|
||
<COND (<EQUAL? .LOCAL 1>
|
||
<SET M-F 1>)>)>
|
||
<COND (<==? 1 .M-F>
|
||
%<DEBUG-CODE
|
||
<COND (,DBUG <TELL "{Namely: " D ,P-MOBY-FOUND "}" CR>)>>
|
||
<COND (<AND <NOT <REMOTE-VERB?>>
|
||
<FSET? ,P-MOBY-FOUND ,SECRETBIT>>
|
||
<NOT-FOUND ,P-MOBY-FOUND>
|
||
<RETURN T ;,NOT-HERE-OBJECT>)
|
||
(<AND <NOT <REMOTE-VERB?>>
|
||
<NOT <VERB? $CALL>>
|
||
<NOT <VISIBLE? ,P-MOBY-FOUND>>>
|
||
<NOT-HERE ,P-MOBY-FOUND>
|
||
<RETURN T ;,NOT-HERE-OBJECT>)
|
||
(<T? .PRSO?>
|
||
;<SETG OPRSO ,PRSO>
|
||
<SETG PRSO ,P-MOBY-FOUND>)
|
||
(T
|
||
<SETG PRSI ,P-MOBY-FOUND>)>
|
||
;<THIS-IS-IT ,P-MOBY-FOUND>
|
||
<RFALSE>)
|
||
(<AND <L? 1 .M-F>
|
||
<FSET? <SET OBJ <GET/B .TBL 1>> ,PERSONBIT>>
|
||
;<SET FOUND 0>
|
||
<SET LEN <PRUNE .TBL <GET/B .TBL ,P-MATCHLEN> ,GEN-TEST>>
|
||
<COND (<0? .LEN>
|
||
<RETURN ,NOT-HERE-OBJECT>)
|
||
(<NOT <1? .LEN>>
|
||
<WHICH-PRINT 0 .LEN .TBL>
|
||
<COND (<==? .TBL ,P-PRSO> <SETG P-ACLAUSE ,P-NC1>)
|
||
(T <SETG P-ACLAUSE ,P-NC2>)>
|
||
<SETG P-AADJ ,P-ADJ>
|
||
<SETG P-ANAM ,P-NAM>
|
||
<ORPHAN <> <>>
|
||
<SETG P-OFLAG T>
|
||
<RTRUE>)>
|
||
%<DEBUG-CODE <COND (,DBUG <TELL "{Corridor: " D .OBJ "}" CR>)>>
|
||
<COND (<FSET? .OBJ ,SECRETBIT>
|
||
<NOT-FOUND .OBJ>
|
||
<RETURN T ;,NOT-HERE-OBJECT>)
|
||
(<T? .PRSO?>
|
||
;<SETG OPRSO ,PRSO>
|
||
<SETG PRSO .OBJ>)
|
||
(T
|
||
<SETG PRSI .OBJ>)>
|
||
<RFALSE>)
|
||
(<AND <L? 1 .M-F>
|
||
<SET OBJ <APPLY <GETP <SET OBJ <GET/B .TBL 1>> ,P?GENERIC>
|
||
.TBL .M-F ;"?">>>
|
||
;"Protocol: returns .OBJ if that's the one to use,
|
||
,NOT-HERE-OBJECT if case was handled and msg TELLed,
|
||
<> if WHICH-PRINT should be called"
|
||
%<DEBUG-CODE <COND (,DBUG <TELL "{Generic: " D .OBJ "}" CR>)>>
|
||
<COND (<==? .OBJ ,NOT-HERE-OBJECT>
|
||
<RTRUE>)
|
||
(<FSET? .OBJ ,SECRETBIT>
|
||
<NOT-FOUND .OBJ>
|
||
<RETURN T ;,NOT-HERE-OBJECT>)
|
||
(.PRSO?
|
||
;<SETG OPRSO ,PRSO>
|
||
<SETG PRSO .OBJ>)
|
||
(T
|
||
<SETG PRSI .OBJ>)>
|
||
;<THIS-IS-IT .OBJ>
|
||
<RFALSE>)
|
||
(<OR <AND <NOT .PRSO?>
|
||
<IN? ,PRSO ,HERE>
|
||
<VERB? ASK-ABOUT ASK-FOR TELL-ABOUT>>
|
||
<AND .PRSO?
|
||
<QCONTEXT-GOOD?>
|
||
<VERB? ASK-CONTEXT-ABOUT ASK-CONTEXT-FOR>>
|
||
<AND <NOT <==? ,WINNER ,PLAYER>>
|
||
<VERB? FIND ;WHAT GIVE SGIVE>>>
|
||
<SET LEN <>>
|
||
<COND (<NOT <==? ,WINNER ,PLAYER>>
|
||
<SET LEN ,WINNER>)
|
||
(<VERB? ASK-ABOUT ASK-FOR TELL-ABOUT>
|
||
<SET LEN ,PRSO>)
|
||
(<QCONTEXT-GOOD?>
|
||
<SET LEN ,QCONTEXT>)
|
||
;(<SET OBJ <FIND-FLAG ,HERE ,PERSONBIT ,WINNER ;,PLAYER>>
|
||
<SET LEN .OBJ>)
|
||
;(<VISIBLE? ,FRIEND>
|
||
<SET LEN ,FRIEND>)
|
||
;(T <SET LEN ,GAME>)>
|
||
<COND (<NOT <EQUAL? .LEN 0 ,PLAYER>>
|
||
<START-SENTENCE .LEN>
|
||
<TELL " looks confused. ">)>
|
||
<TELL "\"I don't know wh">
|
||
<COND (<0? .M-F>
|
||
<TELL "at you mean by">
|
||
<NOT-HERE-PRINT>)
|
||
(T
|
||
<TELL "ich">
|
||
<NOT-HERE-PRINT>
|
||
<TELL " you mean">)>
|
||
<TELL "!\"" CR>
|
||
<RTRUE>)
|
||
(<NOT .PRSO?>
|
||
<TELL CHE ,WINNER " wouldn't find">
|
||
<COND (<NOT <CAPITAL-NOUN? ,P-XNAM>>
|
||
<TELL " any">)>
|
||
<NOT-HERE-PRINT>
|
||
<TELL " there." CR>
|
||
<RTRUE>)
|
||
(T ,NOT-HERE-OBJECT)>>
|
||
|
||
<ROUTINE NOT-HERE-PRINT ()
|
||
;<TELL " any">
|
||
<COND (<OR ,P-OFLAG ,P-MERGED>
|
||
<COND (<T? ,P-XADJ>
|
||
<TELL !\ >
|
||
<PRINTB ,P-XADJN>)>
|
||
<COND (<T? ,P-XNAM>
|
||
<TELL !\ >
|
||
<PRINTB ,P-XNAM>)>)
|
||
(<EQUAL? ,PRSO ,NOT-HERE-OBJECT>
|
||
<CLAUSE-PRINT ,P-NC1 ,P-NC1L <>>
|
||
;<BUFFER-PRINT <GET ,P-ITBL ,P-NC1> <GET ,P-ITBL ,P-NC1L> <>>)
|
||
(T
|
||
<CLAUSE-PRINT ,P-NC2 ,P-NC2L <>>
|
||
;<BUFFER-PRINT <GET ,P-ITBL ,P-NC2> <GET ,P-ITBL ,P-NC2L> <>>)>>
|
||
|
||
%<DEBUG-CODE
|
||
<ROUTINE TELL-D-LOC (OBJ)
|
||
<TELL D .OBJ>
|
||
<COND (<IN? .OBJ ,GLOBAL-OBJECTS> <TELL "(gl)">)
|
||
(<IN? .OBJ ,LOCAL-GLOBALS> <TELL "(lg)">)
|
||
(<IN? .OBJ ,ROOMS> <TELL "(rm)">)>
|
||
<COND (<EQUAL? .OBJ ,TURN ,INTNUM>
|
||
<TELL !\( N ,P-NUMBER !\)>)>>>
|
||
|
||
<ROUTINE SEE-VERB? ()
|
||
<VERB? ANALYZE SANALYZE CHASTISE ;COUNT EXAMINE FIND
|
||
;INVENTORY LOOK LOOK-BEHIND LOOK-DOWN LOOK-INSIDE LOOK-ON
|
||
LOOK-OUTSIDE LOOK-THROUGH LOOK-UNDER LOOK-UP
|
||
READ SEARCH SEARCH-FOR SSEARCH-FOR>>
|
||
|
||
<ROUTINE FIX-HIM-HER-IT (PRON OBJ)
|
||
<COND (<OR <ZERO? .OBJ>
|
||
<AND <NOT <ACCESSIBLE? .OBJ>>
|
||
<OR <AND <==? .PRON ,PRSI> <NOT <PRSI-VERB?>>>
|
||
<AND <==? .PRON ,PRSO> <NOT <PRSO-VERB?>>>>>>
|
||
<COND (<EQUAL? 0 .OBJ ,PRSI>
|
||
<FAKE-ORPHAN>)
|
||
(T <NOT-HERE .OBJ>)>
|
||
<RFALSE>)
|
||
(T
|
||
<COND (<==? ,PRSO .PRON>
|
||
<COND (<==? .PRON ,IT>
|
||
<PUT ,P-ADJW 0 <GET ,P-IT-WORDS 0>>
|
||
<PUT ,P-NAMW 0 <GET ,P-IT-WORDS 1>>)>
|
||
<SETG PRSO .OBJ>
|
||
<TELL-I-ASSUME .OBJ>)>
|
||
<COND (<==? ,PRSI .PRON>
|
||
<COND (<==? .PRON ,IT>
|
||
<PUT ,P-ADJW 1 <GET ,P-IT-WORDS 0>>
|
||
<PUT ,P-NAMW 1 <GET ,P-IT-WORDS 1>>)>
|
||
<SETG PRSI .OBJ>
|
||
<TELL-I-ASSUME .OBJ>)>
|
||
<RTRUE>)>>
|
||
|
||
<ROUTINE FAKE-ORPHAN ("AUX" TMP)
|
||
<ORPHAN ,P-SYNTAX <>>
|
||
<TELL "[Please be specific: wh">
|
||
<COND ;(<VERB? WALK WALK-TO>
|
||
<TELL "ere">)
|
||
(<==? <GETB ,P-SYNTAX ,P-SFWIM1> ,PERSONBIT>
|
||
<TELL "om">)
|
||
(T <TELL "at">)>
|
||
<TELL " do you want to ">
|
||
<VERB-PRINT>
|
||
;<SET TMP <GET ,P-OTBL ,P-VERBN>>
|
||
;<COND (<==? .TMP 0> <TELL "tell">)
|
||
(<0? <GETB ,P-VTBL 2>>
|
||
<PRINTB <GET .TMP 0>>)
|
||
(T
|
||
<WORD-PRINT <GETB .TMP 2> <GETB .TMP 3>>
|
||
<PUTB ,P-VTBL 2 0>)>
|
||
;<PREP-PRINT <GETB ,P-SYNTAX ,P-SPREP2>>
|
||
<SETG P-OFLAG T>
|
||
<SETG P-WON <>>
|
||
;<SETG CLOCK-WAIT T>
|
||
<TELL "?]" CR>>
|
||
|
||
<GLOBAL NOW-PRSI:FLAG <>>
|
||
|
||
<ROUTINE PERFORM (A "OPTIONAL" (O <>) (I <>) "AUX" V OA OO OI X)
|
||
%<DEBUG-CODE <COND (,DBUG
|
||
<TELL "{Perform: ">
|
||
%<COND (<GASSIGNED? PREDGEN> '<TELL N .A>)
|
||
(T '<PRINC <NTH ,ACTIONS <+ <* .A 2> 1>>>)>
|
||
<COND (.O
|
||
<TELL !\/>
|
||
<COND (<EQUAL? .A ,V?WALK ;,V?FACE> <TELL N .O>)
|
||
(T <TELL-D-LOC .O>)>)>
|
||
<COND (.I
|
||
<TELL !\/>
|
||
<TELL-D-LOC .I>)>
|
||
<TELL "}" CR>)>>
|
||
<SET OA ,PRSA>
|
||
<SET OO ,PRSO>
|
||
<SET OI ,PRSI>
|
||
<SETG PRSA .A>
|
||
<SETG PRSI .I>
|
||
<SETG PRSO .O>
|
||
<COND (<AND <ZERO? ,LIT>
|
||
<SEE-VERB?>
|
||
;<NOT <DOBJ? GHOST-NEW COSTUME BLOWGUN>>
|
||
;<NOT <IOBJ? GHOST-NEW COSTUME BLOWGUN>>>
|
||
<TOO-DARK>
|
||
<RFATAL>)
|
||
(<NOT <VERB? WALK ;FACE>>
|
||
<COND (<EQUAL? ,IT ,PRSI ,PRSO>
|
||
<COND (<NOT <FIX-HIM-HER-IT ,IT ,P-IT-OBJECT>>
|
||
<RFATAL>)>)>
|
||
<COND (<EQUAL? ,HER ,PRSI ,PRSO>
|
||
<COND (<NOT <FIX-HIM-HER-IT ,HER ,P-HER-OBJECT>>
|
||
<RFATAL>)>)>
|
||
<COND (<EQUAL? ,HIM ,PRSI ,PRSO>
|
||
<COND (<NOT <FIX-HIM-HER-IT ,HIM ,P-HIM-OBJECT>>
|
||
<RFATAL>)>)>)>
|
||
<SET V <>>
|
||
<COND (<AND <NOT <EQUAL? .A ,V?WALK ;,V?FACE>>
|
||
<EQUAL? ,NOT-HERE-OBJECT ,PRSO ,PRSI>>
|
||
<SET V <D-APPLY "Not Here" ,NOT-HERE-OBJECT-F>>
|
||
<COND (.V
|
||
<SETG P-WON <>>
|
||
;<SETG CLOCK-WAIT T>)>)>
|
||
<THIS-IS-IT ,PRSI>
|
||
<THIS-IS-IT ,PRSO>
|
||
<COND (<NOT <EQUAL? ,WINNER ,PLAYER>>
|
||
<THIS-IS-IT ,WINNER>)>
|
||
<SET O ,PRSO>
|
||
<SET I ,PRSI>
|
||
%<DEBUG-CODE <COND (,DBUG
|
||
<TELL !\{ D ,WINNER "=}"> ;"extra output for next (...)")>>
|
||
<COND (<ZERO? .V>
|
||
<SET V <D-APPLY "Actor" <GETP ,WINNER ,P?ACTION>
|
||
,M-WINNER>>)>
|
||
<COND (<ZERO? .V>
|
||
<SET V <D-APPLY "Room (M-BEG)"
|
||
<GETP <COND (<IN? ,WINNER ,CAR> ,CAR)
|
||
(T ,HERE)> ;<LOC ,WINNER>
|
||
,P?ACTION>
|
||
,M-BEG>>)>
|
||
<COND (<ZERO? .V>
|
||
<SET V <D-APPLY "Preaction" <GET ,PREACTIONS .A>>>)>
|
||
<SETG NOW-PRSI 1>
|
||
;<COND (<AND <ZERO? .V>
|
||
.I ;"This new clause applies CONTFCN to PRSI, BM 2/85"
|
||
<NOT <EQUAL? .A ,V?WALK>>
|
||
<LOC .I>>
|
||
<SET V <GETP <LOC .I> ,P?CONTFCN>>
|
||
<COND (.V
|
||
<SET V <APPLY .V ,M-CONT>>)>)>
|
||
<COND (<AND <ZERO? .V>
|
||
.I>
|
||
<SET V <D-APPLY "PRSI" <GETP .I ,P?ACTION>>>)>
|
||
<SETG NOW-PRSI 0>
|
||
;<COND (<AND <ZERO? .V>
|
||
.O
|
||
<NOT <EQUAL? .A ,V?WALK ;,V?FACE>>
|
||
<LOC .O>>
|
||
<SET V <GETP <LOC .O> ,P?CONTFCN>>
|
||
<COND (.V
|
||
<SET V <APPLY .V ,M-CONT>>)>)>
|
||
<COND (<AND <ZERO? .V>
|
||
.O
|
||
<NOT <EQUAL? .A ,V?WALK ;,V?FACE>>>
|
||
<SET V <D-APPLY "PRSO" <GETP .O ,P?ACTION>>>
|
||
;<COND (.V <THIS-IS-IT .O>)>)>
|
||
<COND (<ZERO? .V>
|
||
<SET V <D-APPLY <> <GET ,ACTIONS .A>>>)>
|
||
;<COND (<NOT <==? .V ,M-FATAL>>
|
||
<COND (<OR ;<VERB? SAVE RESTORE> <NOT <GAME-VERB?>>>
|
||
<SET V <D-APPLY "Room (M-END)"
|
||
<GETP ,HERE ;<LOC ,WINNER> ,P?ACTION>
|
||
,M-END>>)>)>
|
||
<SETG PRSA .OA>
|
||
<SETG PRSO .OO>
|
||
<SETG PRSI .OI>
|
||
.V>
|
||
|
||
<ROUTINE D-APPLY (STR FCN "OPTIONAL" (FOO <>) "AUX" RES)
|
||
<COND (<T? .FCN>
|
||
%<DEBUG-CODE <COND (,DBUG
|
||
<COND (<ZERO? .STR>
|
||
<TELL "{Action:}" CR>)
|
||
(T <TELL !\{ .STR ": ">)>)>>
|
||
<COND (<=? .STR "Container">
|
||
<SET FOO ,M-CONT>)>
|
||
<COND (.FOO <SET RES <APPLY .FCN .FOO>>)
|
||
(T <SET RES <APPLY .FCN>>)>
|
||
%<DEBUG-CODE <COND (<AND ,DBUG .STR>
|
||
<COND (<==? .RES ,M-FATAL>
|
||
<TELL "Fatal}" CR>)
|
||
(<ZERO? .RES>
|
||
<TELL "Not handled}" CR>)
|
||
(T <TELL "Handled}" CR>)>)>>
|
||
.RES)>>
|
||
|
||
<CONSTANT P-PROMPT-START 4>
|
||
<GLOBAL P-PROMPT:NUMBER 4>
|
||
|
||
<ROUTINE I-PROMPT ("OPTIONAL" (GARG <>))
|
||
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
|
||
<TELL "{I-PROMPT:">
|
||
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
|
||
<SETG P-PROMPT <- ,P-PROMPT 1>>
|
||
%<DEBUG-CODE <COND (,IDEBUG <TELL "(0)}" CR>)>>
|
||
<RFALSE>>
|
||
|
||
<ROUTINE BUZZER-WORD? (WRD PTR)
|
||
<COND (<OR <QUESTION-WORD? .WRD>
|
||
<NAUGHTY-WORD? .WRD>
|
||
<NUMBER-WORD? .WRD>>
|
||
<PUT ,OOPS-TABLE ,O-PTR .PTR>
|
||
<RTRUE>)>>
|
||
|
||
<BUZZ WHAT WHEN WHERE WHO WHY \(SOME
|
||
;"ANY WHAT\'S WHEN\'S WHERE\'S WHO\'S WHY\'S">
|
||
|
||
;<GLOBAL QUESTION-WORD-PAIR-TABLE
|
||
<PLTABLE <PTABLE <VOC "AREN" BUZZ> <VOC "T" BUZZ>>
|
||
<PTABLE <VOC "COULDN" BUZZ> <VOC "T" <>>>
|
||
<PTABLE <VOC "DIDN" BUZZ> <VOC "T" <>>>
|
||
<PTABLE <VOC "DON" <>> <VOC "T" <>>>
|
||
<PTABLE <VOC "HASN" BUZZ> <VOC "T" <>>>
|
||
<PTABLE <VOC "HAVEN" BUZZ> <VOC "T" <>>>
|
||
<PTABLE <VOC "HE" BUZZ ;NOUN> <VOC "S" <>>>
|
||
<PTABLE <VOC "I" <>> <VOC "LL" BUZZ>>
|
||
<PTABLE <VOC "I" <>> <VOC "M" BUZZ>>
|
||
<PTABLE <VOC "I" <>> <VOC "VE" BUZZ>>
|
||
<PTABLE <VOC "ISN" BUZZ> <VOC "T" <>>>
|
||
<PTABLE <VOC "IT" <>> <VOC "S" <>>>
|
||
<PTABLE <VOC "LET" BUZZ> <VOC "S" <>>>
|
||
;<PTABLE <VOC "SHAN" BUZZ> <VOC "T" <>>>
|
||
<PTABLE <VOC "SHE" BUZZ ;NOUN> <VOC "S" <>>>
|
||
<PTABLE <VOC "SHOULD" BUZZ> <VOC "T" <>>>
|
||
<PTABLE <VOC "THAT" BUZZ> <VOC "S" <>>>
|
||
<PTABLE <VOC "THEY" BUZZ> <VOC "RE" BUZZ>>
|
||
<PTABLE <VOC "WASN" BUZZ> <VOC "T" <>>>
|
||
<PTABLE <VOC "WE" <>> <VOC "RE" BUZZ>>
|
||
<PTABLE <VOC "WEREN" BUZZ> <VOC "T" <>>>
|
||
<PTABLE <VOC "WON" BUZZ> <VOC "T" <>>>
|
||
<PTABLE <VOC "WOULDN" BUZZ> <VOC "T" <>>>
|
||
<PTABLE <VOC "YOU" <>> <VOC "RE" BUZZ>>>>
|
||
|
||
<GLOBAL QWP1-TABLE
|
||
<PLTABLE <VOC "AREN" BUZZ>
|
||
<VOC "COULDN" BUZZ>
|
||
<VOC "DIDN" BUZZ>
|
||
<VOC "DON" <>>
|
||
<VOC "HASN" BUZZ>
|
||
<VOC "HAVEN" BUZZ>
|
||
<VOC "HE" BUZZ ;NOUN>
|
||
<VOC "I" <>>
|
||
<VOC "I" <>>
|
||
<VOC "I" <>>
|
||
<VOC "I" <>>
|
||
<VOC "ISN" BUZZ>
|
||
<VOC "IT" <>>
|
||
<VOC "LET" BUZZ>
|
||
;<VOC "SHAN" BUZZ>
|
||
<VOC "SHE" BUZZ ;NOUN>
|
||
<VOC "SHOULD" BUZZ>
|
||
<VOC "THAT" BUZZ>
|
||
<VOC "THEY" BUZZ>
|
||
<VOC "WASN" BUZZ>
|
||
<VOC "WE" <>>
|
||
<VOC "WE" <>>
|
||
<VOC "WEREN" BUZZ>
|
||
<VOC "WON" BUZZ>
|
||
<VOC "WOULDN" BUZZ>
|
||
<VOC "YOU" <>>>>
|
||
|
||
<GLOBAL QWP2-TABLE
|
||
<PLTABLE <VOC "T" BUZZ>
|
||
<VOC "T" <>>
|
||
<VOC "T" <>>
|
||
<VOC "T" <>>
|
||
<VOC "T" <>>
|
||
<VOC "T" <>>
|
||
<VOC "S" <>>
|
||
<VOC "D" <>>
|
||
<VOC "LL" BUZZ>
|
||
<VOC "M" BUZZ>
|
||
<VOC "VE" BUZZ>
|
||
<VOC "T" <>>
|
||
<VOC "S" <>>
|
||
<VOC "S" <>>
|
||
;<VOC "T" <>>
|
||
<VOC "S" <>>
|
||
<VOC "T" <>>
|
||
<VOC "S" <>>
|
||
<VOC "RE" BUZZ>
|
||
<VOC "T" <>>
|
||
<VOC "RE" BUZZ>
|
||
<VOC "LL" BUZZ>
|
||
<VOC "T" <>>
|
||
<VOC "T" <>>
|
||
<VOC "T" <>>
|
||
<VOC "RE" BUZZ>>>
|
||
|
||
<GLOBAL QUESTION-WORD-TABLE
|
||
<PLTABLE <VOC "AM" BUZZ>
|
||
<VOC "ARE" BUZZ>
|
||
<VOC "CAN" BUZZ>
|
||
<VOC "COULD" BUZZ>
|
||
<VOC "DID" BUZZ>
|
||
<VOC "DO" BUZZ>
|
||
<VOC "HAS" BUZZ>
|
||
<VOC "HAVE" BUZZ>
|
||
<VOC "HOW" BUZZ>
|
||
<VOC "IS" BUZZ>
|
||
<VOC "LIKE" BUZZ>
|
||
<VOC "MAY" BUZZ>
|
||
<VOC "SHALL" BUZZ>
|
||
<VOC "SHOULD" BUZZ>
|
||
<VOC "WANT" BUZZ>
|
||
<VOC "WAS" BUZZ>
|
||
<VOC "WERE" BUZZ>
|
||
<VOC "WHEN" BUZZ>
|
||
<VOC "WHICH" BUZZ>
|
||
<VOC "WHY" BUZZ>
|
||
;<VOC "WILL" BUZZ>
|
||
<VOC "WOULD" BUZZ>>>
|
||
|
||
<GLOBAL SOMETHING " (something).]|">
|
||
<GLOBAL QUESTION-WORD-COUNT:NUMBER 2>
|
||
|
||
<ROUTINE QUESTION-WORD? (WORD "OPTIONAL" (DO-IT <>))
|
||
<COND (<EQUAL? .WORD ,W?\(SOME>
|
||
<TELL "[Type a real word instead of" ,SOMETHING>
|
||
<RTRUE>)
|
||
(<EQUAL? .WORD ,W?WHERE>
|
||
<TO-DO-X-USE-Y "locate" "FIND">
|
||
<RTRUE>)
|
||
(<OR <EQUAL? .WORD ,W?WHAT ,W?WHO ,W?WHEN>
|
||
<EQUAL? .WORD ,W?WHY>>
|
||
<TO-DO-X-USE-Y "ask about" "TELL ME ABOUT">
|
||
<RTRUE>)
|
||
(<OR <T? .DO-IT> <ZMEMQ .WORD ,QUESTION-WORD-TABLE>>
|
||
<TELL "[Please use commands">
|
||
<SETG QUESTION-WORD-COUNT <+ 1 ,QUESTION-WORD-COUNT>>
|
||
<COND (<ZERO? <MOD ,QUESTION-WORD-COUNT 4 ;9>>
|
||
<TELL
|
||
" to tell the computer what you want to do in the story.
|
||
Here are some commands:|
|
||
GO TO MY ROOM|
|
||
LOOK UNDER THE RUG|
|
||
MADAM, DESCRIBE THE GHOST|
|
||
Now you can try again">)
|
||
(T <TELL ", not statements or questions">)>
|
||
<TELL ".]" CR>)>>
|
||
|
||
<ROUTINE TO-DO-X-USE-Y (STR1 STR2)
|
||
<TELL
|
||
"[To " .STR1 " something, use the command: " .STR2 ,SOMETHING>
|
||
<RTRUE>>
|
||
|
||
<GLOBAL NUMBER-WORD-TABLE
|
||
<PLTABLE <VOC "ZERO" BUZZ>
|
||
<VOC "ONE" BUZZ>
|
||
<VOC "TWO" BUZZ>
|
||
<VOC "THREE" BUZZ>
|
||
<VOC "FOUR" BUZZ>
|
||
<VOC "FIVE" BUZZ>
|
||
<VOC "SIX" BUZZ>
|
||
<VOC "SEVEN" BUZZ>
|
||
<VOC "EIGHT" BUZZ>
|
||
<VOC "NINE" BUZZ>
|
||
<VOC "TEN" BUZZ>
|
||
<VOC "ELEVEN" BUZZ>
|
||
<VOC "TWELVE" BUZZ>
|
||
;"<VOC 'THIRTEEN' BUZZ>
|
||
<VOC 'FOURTEEN' BUZZ>
|
||
<VOC 'FIFTEEN' BUZZ>
|
||
<VOC 'SIXTEEN' BUZZ>
|
||
<VOC 'SEVENT' BUZZ>
|
||
<VOC 'EIGHTEEN' BUZZ>
|
||
<VOC 'NINETEEN' BUZZ>"
|
||
<VOC "TWENTY" BUZZ>
|
||
<VOC "THIRTY" BUZZ>
|
||
<VOC "FORTY" BUZZ>
|
||
<VOC "FIFTY" BUZZ>
|
||
<VOC "SIXTY" BUZZ>
|
||
;<VOC "EIGHTY" BUZZ>
|
||
;<VOC "NINETY" BUZZ>
|
||
<VOC "HUNDRED" BUZZ>
|
||
<VOC "THOUSAND" BUZZ>
|
||
;<VOC "MILLION" BUZZ>
|
||
;<VOC "BILLION" BUZZ>>>
|
||
|
||
<ROUTINE NUMBER-WORD? (WRD)
|
||
<COND (<ZMEMQ .WRD ,NUMBER-WORD-TABLE>
|
||
<TELL "[Use numerals for numbers, for example \"10.\"]" CR>
|
||
<RTRUE>)>>
|
||
|
||
<GLOBAL NAUGHTY-WORD-TABLE
|
||
<PLTABLE <VOC "ASSHOLE" BUZZ>
|
||
<VOC "BASTARD" BUZZ>
|
||
<VOC "BITCH" BUZZ>
|
||
;<VOC "CHOMP" BUZZ>
|
||
;<VOC "CHOMPING" BUZZ>
|
||
<VOC "COCK" BUZZ>
|
||
<VOC "COCKSUCKER" BUZZ>
|
||
<VOC "CRAP" BUZZ>
|
||
<VOC "CUNT" BUZZ>
|
||
<VOC "CURSE" BUZZ>
|
||
;<VOC "CURSES" BUZZ>
|
||
<VOC "CUSS" BUZZ>
|
||
<VOC "DAMN" BUZZ>
|
||
<VOC "DAMNED" BUZZ>
|
||
<VOC "DARN" BUZZ>
|
||
<VOC "FUCK" BUZZ>
|
||
<VOC "FUCKED" BUZZ>
|
||
<VOC "FUCKING" BUZZ>
|
||
<VOC "FUDGE" BUZZ>
|
||
<VOC "GODDAMN" BUZZ>
|
||
<VOC "HELL" BUZZ>
|
||
<VOC "PEE" BUZZ>
|
||
<VOC "PISS" BUZZ>
|
||
<VOC "SCREW" BUZZ>
|
||
<VOC "SHIT" BUZZ>
|
||
<VOC "SHITHEAD" BUZZ>
|
||
<VOC "SUCK" BUZZ>
|
||
<VOC "SUCKS" BUZZ>>>
|
||
|
||
<ROUTINE NAUGHTY-WORD? (WORD)
|
||
<COND (<ZMEMQ .WORD ,NAUGHTY-WORD-TABLE>
|
||
<TELL !\[ <PICK-ONE-NEW ,OFFENDED> !\] CR>)>>
|
||
|
||
<GLOBAL OFFENDED
|
||
<LTABLE 0
|
||
"What charming language!"
|
||
"Computers aren't impressed by naughty words!"
|
||
"You ought to be ashamed of yourself!"
|
||
"Hey, save that talk for the locker room!"
|
||
"Step outside and say that!"
|
||
"And so's your old man!">>
|
||
|
||
" Grovel down the input finding the verb, prepositions, and noun phrases.
|
||
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 phrase lookup."
|
||
|
||
<BUZZ AGAIN G OOPS>
|
||
<GLOBAL BEG-PARDON "I beg your pardon?">
|
||
|
||
<ROUTINE NOT-THAT-WAY (STR)
|
||
<TELL "[You can't use " .STR " that way.]" CR>>
|
||
|
||
<ROUTINE PARSER ("AUX" (PTR ,P-LEXSTART) WRD (VAL 0) (VERB <>) (OF-FLAG <>)
|
||
LEN (DIR <>) (NW 0) (LW 0) (CNT -1) OMERGED OWINNER
|
||
TMP)
|
||
<REPEAT ()
|
||
<COND (<G? <SET CNT <+ .CNT 1>> ,P-ITBLLEN> <RETURN>)
|
||
(T
|
||
<COND (<NOT ,P-OFLAG>
|
||
<PUT ,P-OTBL .CNT <GET ,P-ITBL .CNT>>)>
|
||
<PUT ,P-ITBL .CNT 0>)>>
|
||
<SETG P-NAM <>>
|
||
<SETG P-ADJ <>>
|
||
<SETG P-ADJN <>>
|
||
<SETG P-XNAM <>>
|
||
<SETG P-XADJ <>>
|
||
<SETG P-XADJN <>>
|
||
;<SETG P-ADVERB <>>
|
||
<COND (<ZERO? ,P-OFLAG>
|
||
<PUT ,P-NAMW 0 <>>
|
||
<PUT ,P-NAMW 1 <>>
|
||
<PUT ,P-ADJW 0 <>>
|
||
<PUT ,P-ADJW 1 <>>
|
||
<PUT ,P-OFW 0 <>>
|
||
<PUT ,P-OFW 1 <>>)>
|
||
<SETG P-PRSA-WORD <>>
|
||
<SET OMERGED ,P-MERGED>
|
||
<SETG P-MERGED <>>
|
||
<SETG P-END-ON-PREP <>>
|
||
<PUT/B ,P-PRSO ,P-MATCHLEN 0>
|
||
<PUT/B ,P-PRSI ,P-MATCHLEN 0>
|
||
<PUT/B ,P-BUTS ,P-MATCHLEN 0>
|
||
<SET OWINNER ,WINNER>
|
||
<COND (<AND <NOT ,QUOTE-FLAG> <N==? ,WINNER ,PLAYER>>
|
||
<SETG WINNER ,PLAYER>
|
||
<COND (<NOT <FSET? <LOC ,WINNER> ,VEHBIT>>
|
||
;<SETG OHERE ,HERE>
|
||
<SETG HERE <LOC ,WINNER>>)>
|
||
<SETG LIT <LIT? ;,HERE>>)>
|
||
<COND (<NOT <ZERO? ,RESERVE-PTR>>
|
||
<SET PTR ,RESERVE-PTR>
|
||
<STUFF ,P-LEXV ,RESERVE-LEXV>
|
||
<INBUF-STUFF ,P-INBUF ,RESERVE-INBUF>
|
||
<COND (<AND <NOT <0? ,VERBOSITY>>
|
||
<==? ,PLAYER ,WINNER>>
|
||
<CRLF>)>
|
||
<SETG RESERVE-PTR <>>
|
||
;<SETG P-CONT <>>)
|
||
(<NOT <ZERO? ,P-CONT>>
|
||
<SET PTR ,P-CONT>
|
||
;<SETG P-CONT <>>
|
||
<COND (<AND <NOT <0? ,VERBOSITY>>
|
||
<==? ,PLAYER ,WINNER>>
|
||
<CRLF>)>
|
||
;<COND (<NOT <VERB? ASK TELL SAY>> <CRLF>)>)
|
||
(T
|
||
<SETG WINNER ,PLAYER>
|
||
<SETG QUOTE-FLAG <>>
|
||
<COND (<ZERO? <GET ,OOPS-TABLE ,O-PTR>>
|
||
<PUT ,OOPS-TABLE ,O-END <>>)>
|
||
<COND (<NOT <FSET? <LOC ,WINNER> ,VEHBIT>>
|
||
;<SETG OHERE ,HERE>
|
||
<SETG HERE <LOC ,WINNER>>)>
|
||
<SETG LIT <LIT? ;,HERE>>
|
||
<FCLEAR ,IT ,TOUCHBIT> ;"to prevent pronouns w/o referents"
|
||
<FCLEAR ,HER ,TOUCHBIT>
|
||
<FCLEAR ,HIM ,TOUCHBIT>
|
||
;<FCLEAR,THEM ,TOUCHBIT>
|
||
<COND (<NOT <0? ,VERBOSITY>>
|
||
;<NOT ,SUPER-BRIEF>
|
||
<CRLF>)>
|
||
<COND (<AND ,P-PROMPT <ZERO? ,P-OFLAG> <ZERO? ,AWAITING-REPLY>>
|
||
<COND (<EQUAL? ,P-PROMPT ,P-PROMPT-START>
|
||
<TELL "What would you like to do?">)
|
||
(<L? <SETG P-PROMPT <- ,P-PROMPT 1>> 1>
|
||
<TELL
|
||
"[You won't see \"What next?\" any more.]|
|
||
">)
|
||
(T <TELL "What next?">)>
|
||
<CRLF>)>
|
||
%<COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE>
|
||
'<PROG ()
|
||
<USL>
|
||
<TELL !\>>>)
|
||
(T
|
||
'<TELL !\>>)>
|
||
<READ ,P-INBUF ,P-LEXV>)>
|
||
<SETG P-LEN <GETB ,P-LEXV ,P-LEXWORDS>>
|
||
;<PUT ,P-LEXV <+ 1 <* ,P-LEN ,P-LEXELEN>> 0> ;"for NW in SNARFEM"
|
||
<COND (<AND <==? ,W?QUOTE <GET ,P-LEXV .PTR>>
|
||
<QCONTEXT-GOOD?>> ;"Is quote first input token?"
|
||
<SET PTR <+ .PTR ,P-LEXELEN>> ;"If so, ignore it."
|
||
<SETG P-LEN <- ,P-LEN 1>>)>
|
||
<COND (<==? ,W?THEN <GET ,P-LEXV .PTR>> ;"Is THEN first input word?"
|
||
<SET PTR <+ .PTR ,P-LEXELEN>> ;"If so, ignore it."
|
||
<SETG P-LEN <- ,P-LEN 1>>)>
|
||
<COND (<AND <L? 1 ,P-LEN>
|
||
<EQUAL? <GET ,P-LEXV .PTR>
|
||
,W?YOU> ;"Is this the first word ..."
|
||
<SET NW <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>
|
||
<WT? .NW ,PS?VERB ;,P1?VERB> ;" followed by verb?">
|
||
<SET PTR <+ .PTR ,P-LEXELEN>> ;"If so, ignore it."
|
||
<SETG P-LEN <- ,P-LEN 1>>)>
|
||
<COND (<AND <L? 1 ,P-LEN>
|
||
<EQUAL? <GET ,P-LEXV .PTR>
|
||
,W?GO ,W?TO> ;"Is this the first word ..."
|
||
<SET NW <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>
|
||
<WT? .NW ,PS?VERB ;,P1?VERB> ;" followed by verb?">
|
||
<SET PTR <+ .PTR ,P-LEXELEN>> ;"If so, ignore it."
|
||
<SETG P-LEN <- ,P-LEN 1>>)>
|
||
<COND (<0? ,P-LEN>
|
||
<TELL !\[ ,BEG-PARDON "]" CR>
|
||
<RFALSE>)
|
||
(<EQUAL? <GET ,P-LEXV .PTR> ,W?OOPS>
|
||
<COND (<EQUAL? <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>
|
||
,W?PERIOD ,W?COMMA ,W?\!>
|
||
<SET PTR <+ .PTR ,P-LEXELEN>>
|
||
<SETG P-LEN <- ,P-LEN 1>>)>
|
||
<COND (<NOT <G? ,P-LEN 1>>
|
||
<NOT-THAT-WAY "OOPS">
|
||
<RFALSE>)
|
||
(<SET VAL <GET ,OOPS-TABLE ,O-PTR>>
|
||
<COND (<AND <G? ,P-LEN 2>
|
||
;<NOT <FIX-POSSESSIVES .PTR
|
||
<+ .PTR
|
||
<* ,P-LEXELEN 3>>
|
||
,P-LEXELEN>>>
|
||
<TELL
|
||
"[Warning: only the first word after OOPS is used.]" CR>)>
|
||
<PUT ,AGAIN-LEXV .VAL <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>
|
||
;<COND (<G? ,P-LEN 2>
|
||
)>
|
||
<SETG WINNER .OWINNER> ;"Fixes OOPS w/chars"
|
||
<SET PTR <+ <* .PTR ,P-LEXELEN> 6>>
|
||
<INBUF-ADD <GETB ,P-LEXV .PTR>
|
||
<GETB ,P-LEXV <+ .PTR 1>>
|
||
<+ <* .VAL ,P-LEXELEN> 3>>
|
||
;<COND (<G? ,P-LEN 2>
|
||
)>
|
||
<STUFF ,P-LEXV ,AGAIN-LEXV>
|
||
<SETG P-LEN <GETB ,P-LEXV ,P-LEXWORDS>>
|
||
<SET PTR <GET ,OOPS-TABLE ,O-START>>
|
||
<INBUF-STUFF ,P-INBUF ,OOPS-INBUF>
|
||
<SETG OOPS-PRINT T>
|
||
<PRINT-LEXV .PTR>
|
||
<SETG OOPS-PRINT <>>)
|
||
(T
|
||
<PUT ,OOPS-TABLE ,O-END <>>
|
||
<TELL "[There was no word to replace!]" CR>
|
||
<RFALSE>)>)
|
||
(<ZERO? ,P-CONT>
|
||
<PUT ,OOPS-TABLE ,O-END <>>)>
|
||
<SETG P-CONT <>>
|
||
<COND (<EQUAL? <GET ,P-LEXV .PTR> ,W?AGAIN ,W?G>
|
||
<COND (<ZERO? <GETB ,OOPS-INBUF 1>>
|
||
<TELL "[What do you want to do again?]" CR>
|
||
<RFALSE>)
|
||
(<NOT <ZERO? ,P-OFLAG>>
|
||
<NOT-THAT-WAY "AGAIN">
|
||
<RFALSE>)
|
||
(<NOT ,P-WON> ;<T? ,CLOCK-WAIT>
|
||
<TELL "[That would just repeat a mistake!]" CR>
|
||
<RFALSE>)
|
||
(<G? ,P-LEN 1>
|
||
<COND (<OR <EQUAL? <SET CNT <GET ,P-LEXV
|
||
<+ .PTR ,P-LEXELEN>>>
|
||
,W?PERIOD ,W?COMMA ,W?THEN>
|
||
<EQUAL? .CNT ,W?AND ,W?\! ,W??>>
|
||
<SET PTR <+ .PTR <* 2 ,P-LEXELEN>>>
|
||
<PUTB ,P-LEXV ,P-LEXWORDS
|
||
<- <GETB ,P-LEXV ,P-LEXWORDS> 2>>)
|
||
(T
|
||
<DONT-UNDERSTAND>
|
||
<RFALSE>)>)
|
||
(T
|
||
<SET PTR <+ .PTR ,P-LEXELEN>>
|
||
<PUTB ,P-LEXV ,P-LEXWORDS
|
||
<- <GETB ,P-LEXV ,P-LEXWORDS> 1>>)>
|
||
<COND (<G? <GETB ,P-LEXV ,P-LEXWORDS> 0>
|
||
<STUFF ,RESERVE-LEXV ,P-LEXV>
|
||
<INBUF-STUFF ,RESERVE-INBUF ,P-INBUF>
|
||
<SETG RESERVE-PTR .PTR>)
|
||
(T
|
||
<SETG RESERVE-PTR <>>)>
|
||
;<SETG P-LEN <GETB ,AGAIN-LEXV ,P-LEXWORDS>>
|
||
<SETG WINNER .OWINNER>
|
||
<SETG P-MERGED .OMERGED>
|
||
<INBUF-STUFF ,P-INBUF ,OOPS-INBUF>
|
||
<STUFF ,P-LEXV ,AGAIN-LEXV>
|
||
<SET CNT -1>
|
||
<SET DIR ,AGAIN-DIR>
|
||
<REPEAT ()
|
||
<COND (<IGRTR? CNT ,P-ITBLLEN> <RETURN>)
|
||
(T <PUT ,P-ITBL .CNT <GET ,P-OTBL .CNT>>)>>)
|
||
(T
|
||
<SETG P-NUMBER -1>
|
||
<SET LEN <+ .PTR <* ,P-LEXELEN <GETB ,P-LEXV ,P-LEXWORDS>>>>
|
||
<COND (<==? T <FIX-POSSESSIVES .PTR .LEN>>
|
||
<RFALSE>)>
|
||
<STUFF ,AGAIN-LEXV ,P-LEXV>
|
||
<INBUF-STUFF ,OOPS-INBUF ,P-INBUF>
|
||
<PUT ,OOPS-TABLE ,O-START .PTR>
|
||
<PUT ,OOPS-TABLE ,O-LENGTH <* 4 ,P-LEN>>
|
||
<COND (<ZERO? <GET ,OOPS-TABLE ,O-END>>
|
||
<SET LEN <* 2 .LEN>>
|
||
<PUT ,OOPS-TABLE ,O-END <+ <GETB ,P-LEXV <- .LEN 1>>
|
||
<GETB ,P-LEXV <- .LEN 2>>>>)>
|
||
<SETG RESERVE-PTR <>>
|
||
<SET LEN ,P-LEN>
|
||
<SETG P-DIRECTION <>>
|
||
<SETG P-NCN 0>
|
||
<SETG P-GETFLAGS 0>
|
||
;"3/25/83: Next statement added."
|
||
<PUT ,P-ITBL ,P-VERBN 0>
|
||
<REPEAT ()
|
||
<COND (<L? <SETG P-LEN <- ,P-LEN 1>> 0>
|
||
<SETG QUOTE-FLAG <>>
|
||
<RETURN>)
|
||
(<OR <T? <SET WRD <GET ,P-LEXV .PTR>>>
|
||
<SET WRD <NUMBER? .PTR>>
|
||
<SET WRD <NAME? .PTR>>>
|
||
<COND (<0? ,P-LEN> <SET NW 0>)
|
||
(T <SET NW <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>)>
|
||
<COND (<AND <==? .WRD ,W?TO>
|
||
<EQUAL? .VERB ,ACT?TELL ,ACT?ASK>>
|
||
<PUT ,P-ITBL ,P-VERB ,ACT?TELL>
|
||
;<SET VERB ,ACT?TELL>
|
||
<SET WRD ,W?QUOTE>)
|
||
(<AND <EQUAL? .WRD ,W?THEN ;,W?PERIOD>
|
||
;<NOT <EQUAL? .NW ,W?THEN ;,W?PERIOD>>
|
||
<G? ,P-LEN 0>
|
||
<ZERO? .VERB>
|
||
<ZERO? ,QUOTE-FLAG>>
|
||
<PUT ,P-ITBL ,P-VERB ,ACT?TELL>
|
||
<PUT ,P-ITBL ,P-VERBN 0>
|
||
<SET WRD ,W?QUOTE>)>
|
||
<COND (<AND <EQUAL? .WRD ,W?PERIOD>
|
||
<OR <EQUAL? .LW ,W?MRS ,W?MR ,W?MS>
|
||
<EQUAL? .LW ,W?DR ;,W?LT>>>
|
||
<SET LW 0>)
|
||
(<OR <EQUAL? .WRD ,W?THEN ,W?PERIOD ,W?QUOTE>
|
||
<EQUAL? .WRD ,W?\! ,W??>>
|
||
<COND (<EQUAL? .WRD ,W?QUOTE>
|
||
<COND (<NOT <ZERO? ,QUOTE-FLAG>>
|
||
<SETG QUOTE-FLAG <>>)
|
||
(T <SETG QUOTE-FLAG T>)>)>
|
||
<OR <0? ,P-LEN>
|
||
<SETG P-CONT <+ .PTR ,P-LEXELEN>>>
|
||
<PUTB ,P-LEXV ,P-LEXWORDS ,P-LEN>
|
||
<RETURN>)
|
||
(<AND <SET VAL
|
||
<WT? .WRD
|
||
,PS?DIRECTION
|
||
,P1?DIRECTION>>
|
||
<EQUAL? .VERB <> ,ACT?HEAD ;WALK>
|
||
<OR <==? .LEN 1>
|
||
<AND <==? .LEN 2>
|
||
<EQUAL? .VERB ,ACT?HEAD ;WALK>>
|
||
<AND <EQUAL? .NW
|
||
,W?THEN ,W?PERIOD ,W?QUOTE>
|
||
<G? .LEN 1 ;2>>
|
||
<AND <EQUAL? .NW ,W?\! ,W??>
|
||
<G? .LEN 1 ;2>>
|
||
<AND ,QUOTE-FLAG
|
||
<==? .LEN 2>
|
||
<EQUAL? .NW ,W?QUOTE>>
|
||
<AND <G? .LEN 2>
|
||
<EQUAL? .NW ,W?COMMA ,W?AND>>>>
|
||
;<COND (<ZERO? ,P-PRSA-WORD>
|
||
<SETG P-PRSA-WORD .WRD>)>
|
||
<SET DIR .VAL>
|
||
<COND (<EQUAL? .NW ,W?COMMA ,W?AND>
|
||
<CHANGE-LEXV <+ .PTR ,P-LEXELEN>
|
||
,W?THEN>)>
|
||
<COND (<NOT <G? .LEN 2>>
|
||
<SETG QUOTE-FLAG <>>
|
||
<RETURN>)>)
|
||
(<AND <SET VAL <WT? .WRD ,PS?VERB ,P1?VERB>>
|
||
<ZERO? .VERB>>
|
||
<COND (<ZERO? ,P-OFLAG>
|
||
<SETG P-PRSA-WORD .WRD>)>
|
||
<SET VERB .VAL>
|
||
<PUT ,P-ITBL ,P-VERB .VAL>
|
||
<PUT ,P-ITBL ,P-VERBN ,P-VTBL>
|
||
<PUT ,P-VTBL 0 .WRD>
|
||
<PUTB ,P-VTBL 2 <GETB ,P-LEXV
|
||
<SET TMP
|
||
<+ <* .PTR 2> 2>>>>
|
||
<PUTB ,P-VTBL 3 <GETB ,P-LEXV <+ .TMP 1>>>)
|
||
(<OR <SET VAL <WT? .WRD ,PS?PREPOSITION 0>>
|
||
<AND <OR <EQUAL? .WRD ,W?ALL ,W?ONE ,W?A>
|
||
;<EQUAL? .WRD ,W?BOTH>
|
||
<WT? .WRD ,PS?ADJECTIVE>
|
||
<WT? .WRD ,PS?OBJECT>>
|
||
;<SET VAL 0>>>
|
||
<COND (<AND <G? ,P-LEN 1 ;0>
|
||
<==? .NW ,W?OF>
|
||
;<NOT <EQUAL? .VERB
|
||
,ACT?MAKE ,ACT?TAKE>>
|
||
<0? .VAL>
|
||
<NOT<EQUAL? .WRD ,W?ALL ,W?ONE ,W?A>>
|
||
;<NOT <EQUAL? .WRD ,W?BOTH>>>
|
||
<PUT ,P-OFW ,P-NCN .WRD> ;"Save OF-word"
|
||
<SET OF-FLAG T>)
|
||
(<AND <NOT <0? .VAL>>
|
||
<OR <0? ,P-LEN>
|
||
<EQUAL? .NW ,W?THEN ,W?PERIOD>
|
||
<EQUAL? .NW ,W?\! ,W??>>>
|
||
<SETG P-END-ON-PREP T>
|
||
<COND (<L? ,P-NCN 2>
|
||
<PUT ,P-ITBL ,P-PREP1 .VAL>
|
||
<PUT ,P-ITBL ,P-PREP1N .WRD>)>)
|
||
(<==? ,P-NCN 2>
|
||
<TELL
|
||
"[I found too many nouns in that sentence!]" CR>
|
||
<RFALSE>)
|
||
(T
|
||
<SETG P-NCN <+ ,P-NCN 1>>
|
||
<COND (<ZERO?
|
||
<SET PTR <CLAUSE .PTR .VAL .WRD>>>
|
||
<RFALSE>)>
|
||
<COND (<L? .PTR 0>
|
||
<SETG QUOTE-FLAG <>>
|
||
<RETURN>)>)>)
|
||
;(<==? .WRD ,W?CLOSELY>
|
||
<SETG P-ADVERB ,W?CAREFULLY>)
|
||
;(<OR <EQUAL? .WRD
|
||
,W?CAREFULLY ,W?QUIETLY>
|
||
<EQUAL? .WRD
|
||
,W?SLOWLY ,W?QUICKLY ,W?BRIEFLY>>
|
||
<SETG P-ADVERB .WRD>)
|
||
(<EQUAL? .WRD ,W?OF>
|
||
<COND (<OR <ZERO? .OF-FLAG>
|
||
<EQUAL? .NW ,W?PERIOD ,W?THEN>
|
||
<EQUAL? .NW ,W?\! ,W??>>
|
||
<CANT-USE .PTR>
|
||
<RFALSE>)
|
||
(T
|
||
<SET OF-FLAG <>>)>)
|
||
(<WT? .WRD ,PS?BUZZ-WORD>
|
||
<COND (<BUZZER-WORD? .WRD .PTR>
|
||
<RFALSE>)>)
|
||
(<AND <EQUAL? .VERB ,ACT?TELL>
|
||
<WT? .WRD ,PS?VERB ;,P1?VERB>>
|
||
<TELL
|
||
"[Please consult your manual on how to talk to people.]" CR>
|
||
<RFALSE>)
|
||
(T
|
||
<CANT-USE .PTR>
|
||
<RFALSE>)>)
|
||
(T
|
||
<UNKNOWN-WORD .PTR>
|
||
<RFALSE>)>
|
||
<SET LW .WRD>
|
||
<SET PTR <+ .PTR ,P-LEXELEN>>>)>
|
||
<PUT ,OOPS-TABLE ,O-PTR <>>
|
||
<COND (<NOT <ZERO? .DIR>>
|
||
<SETG PRSA ,V?WALK>
|
||
<SETG P-WALK-DIR .DIR>
|
||
<SETG AGAIN-DIR .DIR>
|
||
<SETG PRSO .DIR>
|
||
<SETG P-OFLAG <>>
|
||
<RETURN T>)>
|
||
<SETG P-WALK-DIR <>>
|
||
<SETG AGAIN-DIR <>>
|
||
<COND (<AND ,P-OFLAG
|
||
<ORPHAN-MERGE>>
|
||
<SETG WINNER .OWINNER>)>
|
||
<COND (<==? <GET ,P-ITBL ,P-VERB> 0>
|
||
<SET PTR <- .PTR ,P-LEXELEN>>
|
||
<SET TMP <>>
|
||
<COND (<G? .PTR 0>
|
||
<SET TMP <GET ,P-LEXV .PTR>>)>
|
||
<COND (<EQUAL? .TMP ,W?PLEASE>
|
||
<PUT ,P-ITBL ,P-VERB ,ACT?YES>)
|
||
(<EQUAL? .TMP ,W?PERIOD>
|
||
<MISSING "verb">
|
||
<RFALSE>)
|
||
(T <PUT ,P-ITBL ,P-VERB ,ACT?$CALL>)>)>
|
||
<COND (<AND <SYNTAX-CHECK> <SNARF-OBJECTS> <MANY-CHECK> <TAKE-CHECK>>
|
||
T)>>
|
||
|
||
<ROUTINE CHANGE-LEXV (PTR WRD)
|
||
<PUT ,P-LEXV .PTR .WRD>
|
||
<PUT ,AGAIN-LEXV .PTR .WRD>>
|
||
|
||
<GLOBAL OOPS-PRINT <>>
|
||
<ROUTINE PRINT-LEXV (PTR "AUX" X)
|
||
<TELL ,I-ASSUME>
|
||
<SET X <+ ,P-LEXV <* 2 .PTR>>>
|
||
<BUFFER-PRINT .X <+ .X <* ,P-WORDLEN ,P-LEN>> <>>
|
||
<TELL "]" CR>>
|
||
|
||
<GLOBAL P-WALK-DIR <>>
|
||
<GLOBAL AGAIN-DIR <>>
|
||
|
||
"For AGAIN purposes, put contents of one LEXV table into another:"
|
||
|
||
<ROUTINE STUFF (DEST SRC "OPTIONAL" (MAX 29) "AUX" (PTR ,P-LEXSTART) (CTR 1)
|
||
BPTR)
|
||
<PUTB .DEST 0 <GETB .SRC 0>>
|
||
<PUTB .DEST 1 <GETB .SRC 1>>
|
||
<REPEAT ()
|
||
<PUT .DEST .PTR <GET .SRC .PTR>>
|
||
<SET BPTR <+ <* .PTR 2> 2>>
|
||
<PUTB .DEST .BPTR <GETB .SRC .BPTR>>
|
||
<SET BPTR <+ <* .PTR 2> 3>>
|
||
<PUTB .DEST .BPTR <GETB .SRC .BPTR>>
|
||
<SET PTR <+ .PTR ,P-LEXELEN>>
|
||
<COND (<IGRTR? CTR .MAX>
|
||
<RETURN>)>>>
|
||
|
||
"Put contents of one INBUF into another:"
|
||
|
||
<ROUTINE INBUF-STUFF (DEST SRC "OPTIONAL" (CNT 80))
|
||
<REPEAT ()
|
||
<COND (<DLESS? CNT 0> <RETURN>)
|
||
(T <PUTB .DEST .CNT <GETB .SRC .CNT>>)>>>
|
||
|
||
"Put the word in the positions specified from P-INBUF to the end of
|
||
OOPS-INBUF, leaving the appropriate pointers in AGAIN-LEXV:"
|
||
|
||
<ROUTINE INBUF-ADD (LEN BEG SLOT "AUX" DBEG (CTR 0) TMP)
|
||
<COND (<SET TMP <GET ,OOPS-TABLE ,O-END>>
|
||
<SET DBEG .TMP>)
|
||
(T
|
||
<SET TMP <GET ,OOPS-TABLE ,O-LENGTH>>
|
||
<SET DBEG <+ <GETB ,AGAIN-LEXV .TMP>
|
||
<GETB ,AGAIN-LEXV <+ .TMP 1>>>>)>
|
||
<PUT ,OOPS-TABLE ,O-END <+ .DBEG .LEN>>
|
||
<REPEAT ()
|
||
<PUTB ,OOPS-INBUF <+ .DBEG .CTR> <GETB ,P-INBUF <+ .BEG .CTR>>>
|
||
<SET CTR <+ .CTR 1>>
|
||
<COND (<EQUAL? .CTR .LEN> <RETURN>)>>
|
||
<PUTB ,AGAIN-LEXV .SLOT .DBEG>
|
||
<PUTB ,AGAIN-LEXV <- .SLOT 1> .LEN>>
|
||
|
||
<ROUTINE FIX-POSSESSIVES (START END "OPTIONAL" (WHERE 0)
|
||
"AUX" PTR N PNAM PADJ (VAL <>) X)
|
||
<SET PNAM ,P-NAM>
|
||
<SET PADJ ,P-ADJ>
|
||
<SETG P-ADJ <>>
|
||
<SET PTR .END>
|
||
<REPEAT ()
|
||
<SET PTR <- .PTR ,P-LEXELEN>>
|
||
<COND (<==? .PTR .START> <RETURN>)
|
||
(<==? <GET ,P-LEXV .PTR> ,W?APOSTROPHE>
|
||
<SETG P-NAM <GET ,P-LEXV <- .PTR ,P-LEXELEN>>>
|
||
<SET N ,RHINO-HEAD-C ;,CHARACTER-MAX>
|
||
<REPEAT ()
|
||
<COND (<AND <T? ,P-NAM>
|
||
<THIS-IT? <GET ,CHARACTER-TABLE .N>>>
|
||
<THIS-IS-IT <GET ,CHARACTER-TABLE .N>>
|
||
<SET VAL <GET ,CHAR-POSS-TABLE <+ 1 .N>>>
|
||
<CHANGE-LEXV ;.PTR <- .PTR .WHERE> .VAL>
|
||
<RETURN>)
|
||
(<DLESS? N 0 ;1>
|
||
<RETURN>)>>
|
||
<COND (<NOT <L? .N 0 ;1>> <AGAIN>)>
|
||
<COND (<NAME? <- .PTR ,P-LEXELEN>>
|
||
<CHANGE-LEXV ;.PTR <- .PTR .WHERE> ,W?MY>
|
||
<AGAIN>)>
|
||
<SET N <GET ,QWP1-TABLE 0>>
|
||
<SET X <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>
|
||
<REPEAT ()
|
||
<COND (<AND <==? <GET ,QWP1-TABLE .N> ,P-NAM>
|
||
<==? <GET ,QWP2-TABLE .N> .X>>
|
||
<QUESTION-WORD? ,P-NAM T>
|
||
<RTRUE>)
|
||
(<DLESS? N 1> <RETURN>)>>
|
||
;<UNKNOWN-WORD .PTR ,P-LEXELEN>)>>
|
||
;%<DEBUG-CODE <COND (<T? .VAL> <PRINT-LEXV .PTR>)>>
|
||
<SETG P-NAM .PNAM>
|
||
<SETG P-ADJ .PADJ>
|
||
<RETURN .VAL>>
|
||
|
||
<ROUTINE NAME? (PTR)
|
||
<OR <XNAME? .PTR ,FIRST-NAME>
|
||
<XNAME? .PTR ,LAST-NAME>
|
||
<XNAME? .PTR ,FAVE-COLOR>>>
|
||
|
||
<ROUTINE XNAME? (PTR TBL "AUX" MAX CNT BPTR CHR (N? T) (NCNT 0))
|
||
<SET BPTR <REST ,P-LEXV <* .PTR 2>>>
|
||
<SET CNT <GETB .BPTR 2>>
|
||
<COND (<G? .CNT 6>
|
||
<SET CNT 6>)>
|
||
<SET BPTR <GETB .BPTR 3>>
|
||
<SET MAX <GETB .TBL 0>>
|
||
<COND (<NOT <L? .MAX 7>>
|
||
<SET MAX 6>)>
|
||
;%<DEBUG-CODE <COND (,DBUG <TELL "{Namelen=" N .MAX "}" CR>)>>
|
||
<REPEAT ()
|
||
<COND (<IGRTR? NCNT .MAX>
|
||
;%<DEBUG-CODE <COND (,DBUG
|
||
<TELL "{NCNT=" N .NCNT " CNT=" N .CNT "}" CR>)>>
|
||
<COND (<NOT <0? .CNT>> <SET N? <>>)>
|
||
<RETURN>)
|
||
(<DLESS? CNT 0>
|
||
;%<DEBUG-CODE <COND (,DBUG
|
||
<TELL "{CNT=" N .CNT "}" CR>)>>
|
||
<SET N? <>>
|
||
<RETURN>)
|
||
(T
|
||
<SET CHR <GETB ,P-INBUF .BPTR>>
|
||
;%<DEBUG-CODE <COND (,DBUG <TELL "{CHR=" N .CHR>)>>
|
||
<COND (<NOT <EQUAL? .CHR 45 39 38>>
|
||
<SET CHR <+ *140* <MOD .CHR 32>>>
|
||
;%<DEBUG-CODE <COND (,DBUG
|
||
<TELL "->" N .CHR>)>>)>
|
||
;%<DEBUG-CODE <COND (,DBUG
|
||
<TELL " Namechr=" N <GETB .TBL .NCNT> "}" CR>)>>
|
||
<COND (<NOT <==? .CHR <GETB .TBL .NCNT>>>
|
||
<SET N? <>>)>
|
||
<SET BPTR <+ .BPTR 1>>)>>
|
||
<COND (.N?
|
||
<COND (<==? .TBL ,FIRST-NAME>
|
||
<CHANGE-LEXV .PTR ,W?F.N>
|
||
,W?F.N)
|
||
(<==? .TBL ,FAVE-COLOR>
|
||
<CHANGE-LEXV .PTR ,W?F.C>
|
||
,W?F.C)
|
||
(T
|
||
<CHANGE-LEXV .PTR ,W?L.N>
|
||
,W?L.N)>)>>
|
||
|
||
"Check whether word pointed at by PTR is the correct part of speech.
|
||
The second argument is the part of speech (,PS?<part of speech>). The
|
||
3rd argument (,P1?<part of speech>), if given, causes the value
|
||
for that part of speech to be returned."
|
||
|
||
<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>)
|
||
(<EQUAL? .BIT ,PS?OBJECT> 1) ;"NEW-VOC"
|
||
(T
|
||
<SET TYP <BAND .TYP ,P-P1BITS>>
|
||
<COND (<NOT <EQUAL? .TYP .B1>> <SET OFFS <+ .OFFS 1>>)>
|
||
<GETB .PTR .OFFS>)>)>>
|
||
|
||
"Scan through a noun phrase, leaving a pointer to its starting location:"
|
||
|
||
<ROUTINE CLAUSE (PTR VAL WRD "AUX" OFF NUM (ANDFLG <>) (FIRST?? T) NW (LW 0))
|
||
<SET OFF <* <- ,P-NCN 1> 2>>
|
||
<COND (<NOT <==? .VAL 0>>
|
||
<PUT ,P-ITBL <SET NUM <+ ,P-PREP1 .OFF>> .VAL>
|
||
<PUT ,P-ITBL <+ .NUM 1> .WRD>
|
||
<SET PTR <+ .PTR ,P-LEXELEN>>)
|
||
(T <SETG P-LEN <+ ,P-LEN 1>>)>
|
||
<COND (<0? ,P-LEN> <SETG P-NCN <- ,P-NCN 1>> <RETURN -1>)>
|
||
<PUT ,P-ITBL <SET NUM <+ ,P-NC1 .OFF>> <REST ,P-LEXV <* .PTR 2>>>
|
||
<COND (<EQUAL? <GET ,P-LEXV .PTR> ,W?THE ,W?A ,W?AN>
|
||
<PUT ,P-ITBL .NUM <REST <GET ,P-ITBL .NUM> 4>>)>
|
||
<REPEAT ()
|
||
<COND (<L? <SETG P-LEN <- ,P-LEN 1>> 0>
|
||
<PUT ,P-ITBL <+ .NUM 1> <REST ,P-LEXV <* .PTR 2>>>
|
||
<RETURN -1>)>
|
||
<COND (<OR <T? <SET WRD <GET ,P-LEXV .PTR>>>
|
||
<SET WRD <NUMBER? .PTR>>
|
||
<SET WRD <NAME? .PTR>>>
|
||
<COND (<0? ,P-LEN> <SET NW 0>)
|
||
(T
|
||
<SET NW <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>
|
||
<COND (<ZERO? .NW> ;"added 8/14/86 SWG"
|
||
<SET NW <NUMBER? <+ .PTR ,P-LEXELEN>>>)>)>
|
||
;<COND (<AND <==? .WRD ,W?OF>
|
||
<EQUAL? <GET ,P-ITBL ,P-VERB>
|
||
,ACT?MAKE ,ACT?TAKE>>
|
||
<CHANGE-LEXV .PTR ,W?WITH>
|
||
<SET WRD ,W?WITH>)>
|
||
<COND (<AND <EQUAL? .WRD ,W?PERIOD>
|
||
<OR <EQUAL? .LW ,W?MRS ,W?MR ,W?MS>
|
||
<EQUAL? .LW ,W?DR ;,W?LT>>>
|
||
<SET LW 0>)
|
||
(<EQUAL? .WRD ,W?AND ,W?COMMA> <SET ANDFLG T>)
|
||
(<EQUAL? .WRD ,W?ALL ;,W?BOTH ,W?ONE>
|
||
<COND (<==? .NW ,W?OF>
|
||
<SETG P-LEN <- ,P-LEN 1>>
|
||
<SET PTR <+ .PTR ,P-LEXELEN>>)>)
|
||
(<OR <EQUAL? .WRD ,W?THEN ,W?PERIOD>
|
||
<EQUAL? .WRD ,W?\! ,W??>
|
||
<AND <WT? .WRD ,PS?PREPOSITION>
|
||
<GET ,P-ITBL ,P-VERB>
|
||
<NOT .FIRST??>>>
|
||
<SETG P-LEN <+ ,P-LEN 1>>
|
||
<PUT ,P-ITBL
|
||
<+ .NUM 1>
|
||
<REST ,P-LEXV <* .PTR 2>>>
|
||
<RETURN <- .PTR ,P-LEXELEN>>)
|
||
;"3/16/83: This clause used to be later."
|
||
(<AND .ANDFLG
|
||
<OR <EQUAL? <GET ,P-ITBL ,P-VERBN> 0>
|
||
<VERB-DIR-ONLY? .WRD>>>
|
||
<SET PTR <- .PTR 4>>
|
||
<CHANGE-LEXV <+ .PTR 2> ,W?THEN>
|
||
<SETG P-LEN <+ ,P-LEN 2>>)
|
||
(<WT? .WRD ,PS?OBJECT>
|
||
<COND (<AND <G? ,P-LEN 0>
|
||
<EQUAL? .NW ,W?OF>
|
||
<NOT <EQUAL? .WRD ,W?ALL ,W?ONE>>>
|
||
<PUT ,P-OFW <- ,P-NCN 1> .WRD>)
|
||
(<AND <WT? .WRD ,PS?ADJECTIVE>
|
||
<T? .NW>
|
||
<NOT <WT? .NW ,PS?DIRECTION>>
|
||
;"DRIVE CAR SOUTH"
|
||
<OR <WT? .NW ,PS?OBJECT>
|
||
<WT? .NW ,PS?ADJECTIVE>>>)
|
||
(<AND <NOT .ANDFLG>
|
||
<NOT <EQUAL? .NW ,W?BUT ,W?EXCEPT>>
|
||
<NOT <EQUAL? .NW ,W?AND ,W?COMMA>>>
|
||
<PUT ,P-ITBL
|
||
<+ .NUM 1>
|
||
<REST ,P-LEXV <* <+ .PTR 2> 2>>>
|
||
<RETURN .PTR>)
|
||
(T <SET ANDFLG <>>)>)
|
||
(<WT? .WRD ,PS?ADJECTIVE>)
|
||
(<WT? .WRD ,PS?BUZZ-WORD>
|
||
<COND (<BUZZER-WORD? .WRD .PTR>
|
||
<RFALSE>)>)
|
||
(<AND .ANDFLG
|
||
<EQUAL? <GET ,P-ITBL ,P-VERB> 0>>
|
||
<SET PTR <- .PTR 4>>
|
||
<CHANGE-LEXV <+ .PTR 2> ,W?THEN>
|
||
<SETG P-LEN <+ ,P-LEN 2>>)
|
||
(<WT? .WRD ,PS?PREPOSITION> T)
|
||
(T
|
||
<CANT-USE .PTR>
|
||
<RFALSE>)>)
|
||
(T <UNKNOWN-WORD .PTR> <RFALSE>)>
|
||
<SET LW .WRD>
|
||
<SET FIRST?? <>>
|
||
<SET PTR <+ .PTR ,P-LEXELEN>>>>
|
||
|
||
<ROUTINE VERB-DIR-ONLY? (WRD)
|
||
<AND <NOT <WT? .WRD ,PS?OBJECT>>
|
||
<NOT <WT? .WRD ,PS?ADJECTIVE>>
|
||
<OR <WT? .WRD ,PS?DIRECTION>
|
||
<WT? .WRD ,PS?VERB>>>>
|
||
|
||
<ROUTINE NUMBER? (PTR "AUX" CNT BPTR CHR (SUM 0) (TIM <>) TMP)
|
||
<SET TMP <REST ,P-LEXV <* .PTR 2>>>
|
||
<SET CNT <GETB .TMP 2>>
|
||
<SET BPTR <GETB .TMP 3>>
|
||
<REPEAT ()
|
||
<COND (<L? <SET CNT <- .CNT 1>> 0> <RETURN>)
|
||
(T
|
||
<SET CHR <GETB ,P-INBUF .BPTR>>
|
||
<COND (<==? .CHR %<ASCII !\:>>
|
||
<SET TIM .SUM>
|
||
<SET SUM 0>)
|
||
(<G? .SUM 29999> <RFALSE>)
|
||
(<OR <G? .CHR %<ASCII !\9>>
|
||
<L? .CHR %<ASCII !\0>>>
|
||
<RFALSE>)
|
||
(T
|
||
<SET SUM <+ <* .SUM 10>
|
||
<- .CHR %<ASCII !\0>>>>)>
|
||
<SET BPTR <+ .BPTR 1>>)>>
|
||
<CHANGE-LEXV .PTR ,W?INT.NUM ;NUMBER>
|
||
<COND (<G? .SUM 9999> <RFALSE>)
|
||
(.TIM
|
||
<COND (<G? .TIM 23> <RFALSE>)>
|
||
<SET SUM <+ .SUM <* .TIM 60>>>)>
|
||
<SETG P-TIME .TIM>
|
||
<SETG P-NUMBER .SUM>
|
||
,W?INT.NUM>
|
||
|
||
<GLOBAL P-NUMBER:NUMBER -1>
|
||
<GLOBAL P-TIME:FLAG <>>
|
||
<GLOBAL P-DIRECTION 0>
|
||
|
||
<ROUTINE ORPHAN-MERGE ("AUX" (CNT -1) TEMP VERB BEG END
|
||
(ADJ <>) (ADJB <>) (VRB <>) (NOUN <>) ADJE WRD)
|
||
<SETG P-OFLAG <>>
|
||
<COND (<AND <SET WRD <GET ,P-ITBL ,P-VERBN>>
|
||
<SET WRD <GET .WRD 0>>>
|
||
<COND (<EQUAL? <WT? .WRD ,PS?VERB ,P1?VERB>
|
||
<GET ,P-OTBL ,P-VERB>>
|
||
<SET VRB T>)>
|
||
<COND (<WT? .WRD ,PS?ADJECTIVE>
|
||
<SET ADJ T>)>
|
||
<COND (<WT? .WRD ,PS?OBJECT>
|
||
<SET NOUN T>)>)>
|
||
<COND (<AND <NOT .VRB> ;"convert apparent verb into noun clause"
|
||
<NOT .ADJ>
|
||
<WT? .WRD ,PS?OBJECT ,P1?OBJECT>
|
||
<EQUAL? ,P-NCN 0>>
|
||
<PUT ,P-ITBL ,P-VERB 0>
|
||
<PUT ,P-ITBL ,P-VERBN 0>
|
||
<PUT ,P-ITBL ,P-NC1 <REST ,P-LEXV <* 2 ,P-LEXSTART>>>
|
||
<PUT ,P-ITBL ,P-NC1L <REST ,P-LEXV <+ ,P-WORDLEN <* 2 ,P-LEXSTART>>>>
|
||
<SETG P-NCN 1>)>
|
||
<COND (<AND <NOT <ZERO? <SET VERB <GET ,P-ITBL ,P-VERB>>>>
|
||
<NOT .ADJ>
|
||
<NOT .VRB>
|
||
<NOT <EQUAL? .VERB <GET ,P-OTBL ,P-VERB>>>>
|
||
<RFALSE>)
|
||
(<EQUAL? ,P-NCN 2> <RFALSE>)
|
||
(<EQUAL? <GET ,P-OTBL ,P-NC1> 1>
|
||
<COND (<EQUAL? <GET ,P-ITBL ,P-PREP1>
|
||
0
|
||
<GET ,P-OTBL ,P-PREP1>>
|
||
<COND (.ADJ
|
||
<PUT ,P-ITBL ,P-NC1 <REST ,P-LEXV <* 2 ,P-LEXSTART>>>
|
||
<COND (<ZERO? <GET ,P-ITBL ,P-NC1L>>
|
||
<PUT ,P-ITBL ,P-NC1L
|
||
<REST ,P-LEXV <+ ,P-WORDLEN
|
||
<* 2 ,P-LEXSTART>>>>)>
|
||
<COND (<ZERO? ,P-NCN> <SETG P-NCN 1>)>)>
|
||
<PUT ,P-OTBL ,P-NC1 <GET ,P-ITBL ,P-NC1>>
|
||
<PUT ,P-OTBL ,P-NC1L <GET ,P-ITBL ,P-NC1L>>)
|
||
(T <RFALSE>)>)
|
||
(<EQUAL? <GET ,P-OTBL ,P-NC2> 1>
|
||
<COND (<EQUAL? <GET ,P-ITBL ,P-PREP1>
|
||
<>
|
||
<GET ,P-OTBL ,P-PREP2>>
|
||
<COND (<OR .ADJ
|
||
<AND <ZERO? ,P-NCN> .NOUN>>
|
||
<PUT ,P-ITBL ,P-NC1 <REST ,P-LEXV <* 2 ,P-LEXSTART>>>
|
||
<COND (<ZERO? <GET ,P-ITBL ,P-NC1L>>
|
||
<PUT ,P-ITBL ,P-NC1L
|
||
<REST ,P-LEXV <+ ,P-WORDLEN
|
||
<* 2 ,P-LEXSTART>>>>)>)>
|
||
<PUT ,P-OTBL ,P-NC2 <GET ,P-ITBL ,P-NC1>>
|
||
<PUT ,P-OTBL ,P-NC2L <GET ,P-ITBL ,P-NC1L>>
|
||
<SETG P-NCN 2>)
|
||
(T <RFALSE>)>)
|
||
(,P-ACLAUSE
|
||
<COND (<AND <NOT <EQUAL? ,P-NCN 1>> <NOT .ADJ>>
|
||
<SETG P-ACLAUSE <>>
|
||
<RFALSE>)
|
||
(T
|
||
<SET BEG <GET ,P-ITBL ,P-NC1>>
|
||
<COND (.ADJ
|
||
<SET BEG <REST ,P-LEXV <* 2 ,P-LEXSTART>>>
|
||
<PUT ,P-ITBL ,P-NC1 .BEG>
|
||
<SET ADJ <>>)>
|
||
<SET END <GET ,P-ITBL ,P-NC1L>>
|
||
<REPEAT ()
|
||
<COND (<EQUAL? .BEG .END>
|
||
<COND (.ADJB <CLAUSE-WIN .ADJB .ADJE> <RETURN>)
|
||
(T
|
||
<SETG P-ACLAUSE <>>
|
||
<RFALSE>)>)>
|
||
<SET WRD <GET .BEG 0>>
|
||
<COND (<OR <EQUAL? .WRD ,W?ALL ,W?ONE>
|
||
<AND <BTST <GETB .WRD ,P-PSOFF>
|
||
,PS?ADJECTIVE> ;"same as WT?"
|
||
<ADJ-CHECK .WRD .ADJ .ADJ>>>
|
||
<COND (<NOT .ADJB> <SET ADJB .BEG>)>
|
||
<SET ADJ .WRD>
|
||
<SET ADJE <REST .BEG ,P-WORDLEN>>)
|
||
(<AND <BTST <GETB .WRD ,P-PSOFF> ,PS?OBJECT>
|
||
<EQUAL? <+ .BEG ,P-WORDLEN> .END>>
|
||
<COND (<AND ,P-ANAM
|
||
<NOT <EQUAL? .WRD ,P-ANAM>>>
|
||
<SETG P-ANAM <>>
|
||
<SET ADJB <GET ,P-ITBL ,P-NC1>>
|
||
<SET ADJE .END>)>)>
|
||
<SET BEG <REST .BEG ,P-WORDLEN>>
|
||
<COND (<EQUAL? .END 0>
|
||
<SET END .BEG>
|
||
<SETG P-NCN 1>
|
||
<PUT ,P-ITBL ,P-NC1 <BACK .BEG ,P-WORDLEN>>
|
||
<PUT ,P-ITBL ,P-NC1L .BEG>)>>)>)>
|
||
<PUT ,P-VTBL 0 <GET ,P-OVTBL 0>>
|
||
<PUTB ,P-VTBL 2 <GETB ,P-OVTBL 2>>
|
||
<PUTB ,P-VTBL 3 <GETB ,P-OVTBL 3>>
|
||
<PUT ,P-OTBL ,P-VERBN ,P-VTBL>
|
||
<PUTB ,P-VTBL 2 0>
|
||
;<AND <NOT <EQUAL? <GET ,P-OTBL ,P-NC2> 0>> <SETG P-NCN 2>>
|
||
<REPEAT ()
|
||
<COND (<G? <SET CNT <+ .CNT 1>> ,P-ITBLLEN>
|
||
<SETG P-MERGED T>
|
||
<RTRUE>)
|
||
(T <PUT ,P-ITBL .CNT <GET ,P-OTBL .CNT>>)>>
|
||
T>
|
||
|
||
<ROUTINE CLAUSE-WIN ("OPT" (ADJB <>) (ADJE <>))
|
||
<COND (.ADJB
|
||
<PUT ,P-ITBL ,P-VERB <GET ,P-OTBL ,P-VERB>>)>
|
||
<PUT ,P-CCTBL ,CC-BEG ,P-ACLAUSE>
|
||
<PUT ,P-CCTBL ,CC-END <+ ,P-ACLAUSE 1>>
|
||
<PUT ,P-CCTBL ,CC-IBEG .ADJB>
|
||
<PUT ,P-CCTBL ,CC-IEND .ADJE>
|
||
<COND (<EQUAL? ,P-ACLAUSE ,P-NC1>
|
||
<PUT ,P-CCTBL ,CC-CLAUSE ,P-OCL1>)
|
||
(ELSE
|
||
<PUT ,P-CCTBL ,CC-CLAUSE ,P-OCL2>)>
|
||
<CLAUSE-COPY ,P-OTBL ,P-OTBL>
|
||
<AND <NOT <EQUAL? <GET ,P-OTBL ,P-NC2> 0>> <SETG P-NCN 2>>
|
||
<SETG P-ACLAUSE <>>
|
||
<RTRUE>>
|
||
|
||
"Print undefined word in input. PTR points to the unknown word in P-LEXV:"
|
||
|
||
<ROUTINE WORD-PRINT (CNT BUF "OPTIONAL" (TBL 0))
|
||
;<COND (<G? .CNT 6> <SET CNT 6>)>
|
||
<COND (<ZERO? .TBL> <SET TBL ,P-INBUF>)>
|
||
<REPEAT ()
|
||
<COND (<DLESS? CNT 0> <RETURN>)
|
||
(ELSE
|
||
<PRINTC <GETB .TBL .BUF>>
|
||
<SET BUF <+ .BUF 1>>)>>>
|
||
|
||
<ROUTINE UNKNOWN-WORD (PTR ;"OPT" ;(APOST 0) "AUX" BUF)
|
||
<PUT ,OOPS-TABLE ,O-PTR .PTR ;<- .PTR .APOST>>
|
||
<COND (<T? ,P-OFLAG>
|
||
<PUT ,OOPS-TABLE ,O-END 0>)>
|
||
<COND (T ;<EQUAL? ,WINNER ,PLAYER>
|
||
<TELL !\[>)
|
||
;(T <TELL "\"I'm sorry, but ">)>
|
||
<TELL "I don't know the word ">
|
||
<COND (T ;<EQUAL? ,WINNER ,PLAYER>
|
||
<TELL !\">)
|
||
;(T <TELL !\'>)>
|
||
<SET BUF <* 2 .PTR ;<- .PTR .APOST>>>
|
||
<WORD-PRINT <GETB <REST ,P-LEXV .BUF> 2>
|
||
<GETB <REST ,P-LEXV .BUF> 3>>
|
||
;<COND (<T? .APOST>
|
||
<TELL !\'>
|
||
<SET BUF <* 2 <+ .PTR ,P-LEXELEN>>>
|
||
<WORD-PRINT <GETB <REST ,P-LEXV .BUF> 2>
|
||
<GETB <REST ,P-LEXV .BUF> 3>>)>
|
||
<SETG QUOTE-FLAG <>>
|
||
<SETG P-OFLAG <>>
|
||
<COND (T ;<EQUAL? ,WINNER ,PLAYER>
|
||
<TELL ".\"]" CR>)
|
||
;(T <TELL ".'\"" CR>)>>
|
||
|
||
<ROUTINE CANT-USE (PTR "AUX" BUF)
|
||
;#DECL ((PTR BUF) FIX)
|
||
<SETG QUOTE-FLAG <>>
|
||
<SETG P-OFLAG <>>
|
||
<COND (T ;<EQUAL? ,WINNER ,PLAYER>
|
||
<TELL "[Sorry, but I don't understand the word \"">
|
||
<WORD-PRINT <GETB <REST ,P-LEXV <SET BUF <* .PTR 2>>> 2>
|
||
<GETB <REST ,P-LEXV .BUF> 3>>
|
||
<TELL "\" when you use it that way.]" CR>)
|
||
;(T <TELL "\"Please, to me simple English speak.\"" CR>)>>
|
||
|
||
" Perform syntax matching operations, using P-ITBL as the source of
|
||
the verb and adjectives for this input. Returns false if no
|
||
syntax matches, and does it's own orphaning. If return is true,
|
||
the syntax is saved in P-SYNTAX."
|
||
|
||
<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)
|
||
<COND (<0? <SET VERB <GET ,P-ITBL ,P-VERB>>>
|
||
<MISSING "verb">
|
||
<RFALSE>)>
|
||
<SET SYN <GET ,VERBS <- 255 .VERB>>>
|
||
<SET LEN <GETB .SYN 0>>
|
||
<SET SYN <REST .SYN>>
|
||
<REPEAT ()
|
||
<SET NUM <BAND <GETB .SYN ,P-SBITS> ,P-SONUMS>>
|
||
<COND (<G? ,P-NCN .NUM> T) ;"Added 4/27/83"
|
||
(<AND <NOT <L? .NUM 1>>
|
||
<0? ,P-NCN>
|
||
<OR <0? <SET PREP <GET ,P-ITBL ,P-PREP1>>>
|
||
<==? .PREP <GETB .SYN ,P-SPREP1>>>>
|
||
<SET DRIVE1 .SYN>)
|
||
(<==? <GETB .SYN ,P-SPREP1> <GET ,P-ITBL ,P-PREP1>>
|
||
<COND (<AND <==? .NUM 2> <==? ,P-NCN 1>>
|
||
<SET DRIVE2 .SYN>)
|
||
(<==? <GETB .SYN ,P-SPREP2>
|
||
<GET ,P-ITBL ,P-PREP2>>
|
||
<SYNTAX-FOUND .SYN>
|
||
<RTRUE>)>)>
|
||
<COND (<DLESS? LEN 1>
|
||
<COND (<OR <T? .DRIVE1> <T? .DRIVE2>>
|
||
<RETURN>)
|
||
(T
|
||
<DONT-UNDERSTAND>
|
||
<RFALSE>)>)
|
||
(T <SET SYN <REST .SYN ,P-SYNLEN>>)>>
|
||
<COND (<AND .DRIVE1
|
||
<SET OBJ
|
||
<GWIM <GETB .DRIVE1 ,P-SFWIM1>
|
||
<GETB .DRIVE1 ,P-SLOC1>
|
||
<GETB .DRIVE1 ,P-SPREP1>>>>
|
||
<PUT/B ,P-PRSO ,P-MATCHLEN 1>
|
||
<PUT/B ,P-PRSO 1 .OBJ>
|
||
<SYNTAX-FOUND .DRIVE1>)
|
||
(<AND .DRIVE2
|
||
<SET OBJ
|
||
<GWIM <GETB .DRIVE2 ,P-SFWIM2>
|
||
<GETB .DRIVE2 ,P-SLOC2>
|
||
<GETB .DRIVE2 ,P-SPREP2>>>>
|
||
<PUT/B ,P-PRSI ,P-MATCHLEN 1>
|
||
<PUT/B ,P-PRSI 1 .OBJ>
|
||
<SYNTAX-FOUND .DRIVE2>)
|
||
;(<EQUAL? .VERB ,ACT?FIND ;,ACT?NAME>
|
||
<TELL "[Sorry, but I can't answer that question.]" CR>
|
||
<RFALSE>)
|
||
(T
|
||
<SET OBJ <>>
|
||
<COND (<AND <EQUAL? ,WINNER ,PLAYER>
|
||
<NOT <EQUAL? ,P-PRSA-WORD;"can't orphan DRIVE/SOUTH"
|
||
,W?DRIVE ,W?PROCEED ,W?STEER>>>
|
||
<ORPHAN .DRIVE1 .DRIVE2>
|
||
<SET OBJ T>
|
||
<TELL "[Wh">)
|
||
(T
|
||
<TELL
|
||
"[Your command was not complete. Next time, type wh">)>
|
||
<COND (<EQUAL? .VERB ,ACT?HEAD ;WALK>
|
||
<TELL "ere">)
|
||
(<OR <AND .DRIVE1
|
||
<==? <GETB .DRIVE1 ,P-SFWIM1> ,PERSONBIT>>
|
||
<AND .DRIVE2
|
||
<==? <GETB .DRIVE2 ,P-SFWIM2> ,PERSONBIT>>>
|
||
<TELL "om">)
|
||
(T <TELL "at">)>
|
||
<COND (<T? .OBJ> ;<EQUAL? ,WINNER ,PLAYER>
|
||
<TELL " do you want to ">)
|
||
(T
|
||
<TELL " you want" HIM ,WINNER " to ">)>
|
||
<VERB-PRINT>
|
||
;<PREP-PRINT <COND (.DRIVE1 <GETB .DRIVE1 ,P-SPREP1 ;2>)
|
||
(T <GETB .DRIVE2 ,P-SPREP1>)>> ;"not in X1"
|
||
<COND (.DRIVE2
|
||
<SET PREP ,P-MERGED>
|
||
<SETG P-MERGED <>>
|
||
<SETG P-OFLAG <>>
|
||
<CLAUSE-PRINT ,P-NC1 ,P-NC1L>
|
||
<SETG P-MERGED .PREP>)>
|
||
<SETG P-END-ON-PREP <>>
|
||
<PREP-PRINT <COND (.DRIVE1 <GETB .DRIVE1 ,P-SPREP1 ;2>)
|
||
(T <GETB .DRIVE2 ,P-SPREP2>)>>
|
||
<COND (<T? .OBJ> ;<EQUAL? ,WINNER ,PLAYER>
|
||
<SETG P-OFLAG T>
|
||
<TELL "?]" CR>)
|
||
(T
|
||
;<SETG P-OFLAG <>>
|
||
<TELL ".]" CR>)>
|
||
<RFALSE>)>>
|
||
|
||
;<GLOBAL CANT-UNDERSTAND "[Sorry, but I don't understand that sentence.]"
|
||
;"[I couldn't understand that sentence.]">
|
||
<ROUTINE DONT-UNDERSTAND ()
|
||
<SETG CLOCK-WAIT T>
|
||
<TELL
|
||
"[Sorry, but I don't understand. Please say that another way, or try
|
||
something else.]" CR>>
|
||
|
||
<ROUTINE VERB-PRINT ("OPTIONAL" (GERUND <>) "AUX" TMP)
|
||
<SET TMP <GET ,P-ITBL ,P-VERBN>> ;"? ,P-OTBL?"
|
||
<COND (<==? .TMP 0>
|
||
<COND (<ZERO? .GERUND> <TELL "tell"> <RTRUE>)
|
||
(T <TELL "walk">)>)
|
||
(<OR <T? .GERUND> <0? <GETB ,P-VTBL 2>>>
|
||
<SET TMP <GET .TMP 0>>
|
||
<COND (<==? .TMP ,W?L> <PRINTB ,W?LOOK>)
|
||
(<==? .TMP ,W?X> <PRINTB ,W?EXAMINE>)
|
||
(<==? .TMP ,W?Z> <PRINTB ,W?WAIT>)
|
||
(<T? .GERUND>
|
||
<COND (<==? .TMP ,W?BATHE> <PRINTB ,W?BATH>)
|
||
(<==? .TMP ,W?DIG> <PRINTI "digg">)
|
||
(<==? .TMP ,W?GET> <PRINTI "gett">)
|
||
(T <PRINTB .TMP>)>)
|
||
(T <PRINTB .TMP>)>)
|
||
(T
|
||
<WORD-PRINT <GETB .TMP 2> <GETB .TMP 3>>
|
||
<PUTB ,P-VTBL 2 0>)>
|
||
<COND (<T? .GERUND> <TELL "ing?">)>>
|
||
|
||
<ROUTINE ORPHAN (D1 D2 "AUX" (CNT -1))
|
||
<COND (<NOT ,P-MERGED>
|
||
<PUT ,P-OCL1 ,P-MATCHLEN 0>
|
||
<PUT ,P-OCL2 ,P-MATCHLEN 0>)>
|
||
<PUT ,P-OVTBL 0 <GET ,P-VTBL 0>>
|
||
<PUTB ,P-OVTBL 2 <GETB ,P-VTBL 2>>
|
||
<PUTB ,P-OVTBL 3 <GETB ,P-VTBL 3>>
|
||
<REPEAT ()
|
||
<COND (<IGRTR? CNT ,P-ITBLLEN> <RETURN>)
|
||
(T <PUT ,P-OTBL .CNT <GET ,P-ITBL .CNT>>)>>
|
||
<COND (<EQUAL? ,P-NCN 2>
|
||
<PUT ,P-CCTBL ,CC-BEG ,P-NC2>
|
||
<PUT ,P-CCTBL ,CC-END ,P-NC2L>
|
||
<PUT ,P-CCTBL ,CC-CLAUSE ,P-OCL2>
|
||
<PUT ,P-CCTBL ,CC-IBEG <>>
|
||
<PUT ,P-CCTBL ,CC-IEND <>>
|
||
<CLAUSE-COPY ,P-ITBL ,P-OTBL>)>
|
||
<COND (<NOT <L? ,P-NCN 1>>
|
||
<PUT ,P-CCTBL ,CC-BEG ,P-NC1>
|
||
<PUT ,P-CCTBL ,CC-END ,P-NC1L>
|
||
<PUT ,P-CCTBL ,CC-CLAUSE ,P-OCL1>
|
||
<PUT ,P-CCTBL ,CC-IBEG <>>
|
||
<PUT ,P-CCTBL ,CC-IEND <>>
|
||
<CLAUSE-COPY ,P-ITBL ,P-OTBL>)>
|
||
<COND (.D1
|
||
<PUT ,P-OTBL ,P-PREP1 <GETB .D1 ,P-SPREP1>>
|
||
<PUT ,P-OTBL ,P-NC1 1>)
|
||
(.D2
|
||
<PUT ,P-OTBL ,P-PREP2 <GETB .D2 ,P-SPREP2>>
|
||
<PUT ,P-OTBL ,P-NC2 1>)>>
|
||
|
||
<ROUTINE CLAUSE-PRINT (BPTR EPTR "OPTIONAL" (THE? T))
|
||
<BUFFER-PRINT <GET ,P-ITBL .BPTR> <GET ,P-ITBL .EPTR> .THE?>>
|
||
|
||
<ROUTINE BUFFER-PRINT (BEG END CP "AUX" (NOSP <>) WRD NW (FIRST?? T) (PN <>))
|
||
<REPEAT ()
|
||
<COND (<==? .BEG .END> <RETURN>)>
|
||
<COND (<OR <T? .NOSP>
|
||
<EQUAL? .WRD ,W?APOSTROPHE>
|
||
<EQUAL? .NW ,W?PERIOD ,W?COMMA ,W?APOSTROPHE>>
|
||
<SET NOSP <>>)
|
||
(T <TELL !\ >)>
|
||
<SET WRD <GET .BEG 0>>
|
||
;<SET NW <GET .BEG ,P-LEXELEN>>
|
||
<COND (<==? .END <REST .BEG ,P-WORDLEN>>
|
||
<SET NW 0>)
|
||
(T <SET NW <GET .BEG ,P-LEXELEN>>)>
|
||
<COND (<AND <NOT <==? .WRD ,W?MY>>
|
||
<ZMEMQ .WRD ,CHAR-POSS-TABLE>>
|
||
<SET NOSP T>)
|
||
(<AND <NOT <==? .NW ,W?MY>>
|
||
<ZMEMQ .NW ,CHAR-POSS-TABLE>>
|
||
<SET NOSP T>)
|
||
(<AND <T? ,OOPS-PRINT>
|
||
<OR <AND <EQUAL? .WRD ,W?HIM>
|
||
<NOT <VISIBLE? ,P-HIM-OBJECT>>>
|
||
<AND <EQUAL? .WRD ,W?HER>
|
||
<NOT <VISIBLE? ,P-HER-OBJECT>>>
|
||
;<AND <EQUAL? .WRD ,W?THEM>
|
||
<NOT <VISIBLE? ,P-THEM-OBJECT>>>>>
|
||
<SET PN T>)>
|
||
<COND ;(<EQUAL? .WRD ,W?PERIOD ,W?\! ,W??>
|
||
<SET NOSP T>)
|
||
(<EQUAL? .WRD ,W?MY>
|
||
<COND (<ZERO? ,OOPS-PRINT>
|
||
<PRINTB ,W?YOUR>)
|
||
(T <PRINTB ,W?MY>)>
|
||
;<SET NOSP T>)
|
||
(<ZMEMQ .WRD ,CHAR-POSS-TABLE>
|
||
<TELL !\'>)
|
||
(<AND <ZERO? ,OOPS-PRINT>
|
||
<NOT <EQUAL? .WRD ,W?ALL ,W?PERIOD ,W?APOSTROPHE>>
|
||
<OR <WT? .WRD ,PS?BUZZ-WORD>
|
||
<WT? .WRD ,PS?PREPOSITION>>
|
||
<NOT <WT? .WRD ,PS?ADJECTIVE>>
|
||
<NOT <WT? .WRD ,PS?OBJECT>>>
|
||
<SET NOSP T>)
|
||
(<AND <EQUAL? .WRD ,W?ME>
|
||
<ZERO? ,OOPS-PRINT>>
|
||
<PRINTD ,PLAYER>
|
||
<SET PN T>)
|
||
(<CAPITAL-NOUN? .WRD>
|
||
<CAPITALIZE .BEG>
|
||
<SET PN T>)
|
||
(T
|
||
<COND (<AND .FIRST?? <NOT .PN> .CP>
|
||
<COND (<NOT <EQUAL? .WRD ,W?HER ,W?HIM ,W?YOUR;,W?THEM>>
|
||
<TELL "the ">)>)>
|
||
<COND (<OR <T? ,P-OFLAG> <T? ,P-MERGED>>
|
||
<PRINTB .WRD>)
|
||
(<AND <==? .WRD ,W?IT>
|
||
<VISIBLE? ,P-IT-OBJECT>>
|
||
<PRINTD ,P-IT-OBJECT>)
|
||
(<AND <EQUAL? .WRD ,W?HER>
|
||
<NOT .PN> ;"VISIBLE check above"
|
||
;<VISIBLE? ,P-HER-OBJECT>>
|
||
<PRINTD ,P-HER-OBJECT>)
|
||
;(<AND <EQUAL? .WRD ,W?THEM>
|
||
<NOT .PN>
|
||
;<VISIBLE? ,P-THEM-OBJECT>>
|
||
<PRINTD ,P-THEM-OBJECT>)
|
||
(<AND <EQUAL? .WRD ,W?HIM>
|
||
<NOT .PN>
|
||
;<VISIBLE? ,P-HIM-OBJECT>>
|
||
<PRINTD ,P-HIM-OBJECT>)
|
||
(T
|
||
<WORD-PRINT <GETB .BEG 2> <GETB .BEG 3>>)>
|
||
<SET FIRST?? <>>)>
|
||
<SET BEG <REST .BEG ,P-WORDLEN>>>>
|
||
|
||
<ROUTINE TITLE-NOUN? (WRD)
|
||
<OR <EQUAL? .WRD ,W?MR ,W?MRS ,W?MS>
|
||
<EQUAL? .WRD ,W?MISTER ,W?MISS ,W?SIR>
|
||
<EQUAL? .WRD ,W?LADY ,W?DAME ,W?LORD>
|
||
<EQUAL? .WRD ,W?DR ,W?DOCTOR ,W?DETECT>
|
||
<EQUAL? .WRD ,W?MADAME ,W?MADAM ,W?MASTER>
|
||
;<EQUAL? .WRD ,W?LT>>>
|
||
|
||
<ROUTINE CAPITAL-NOUN? (WRD)
|
||
<OR <TITLE-NOUN? .WRD>
|
||
<EQUAL? .WRD ,W?BOLITHO ,W?DEE>
|
||
<EQUAL? .WRD ,W?DEIRDRE ,W?FORDYCE ,W?HALLAM>
|
||
<EQUAL? .WRD ,W?HYDE ,W?IAN ,W?INDIAN>
|
||
<EQUAL? .WRD ,W?IRIS ,W?JACK ,W?LIONEL>
|
||
<EQUAL? .WRD ,W?LYND ,W?MONTAGUE ,W?MOONMIST>
|
||
<EQUAL? .WRD ,W?NICHOLAS ,W?PENTREATH ,W?TAMARA>
|
||
<EQUAL? .WRD ,W?TAMMY ,W?TRESYLLIAN ,W?VIV>
|
||
<EQUAL? .WRD ,W?VIVIEN ,W?WENDISH>
|
||
;<EQUAL? .WRD ,W?AMAZON ,W?DINGAAN ,W?EGYPTIAN ,W?LONDON ,W?MAYFAIR ,W?PORSCHE ,W?ZULU>>>
|
||
|
||
<ROUTINE CAPITALIZE (PTR)
|
||
<COND (<OR <T? ,P-OFLAG> <T? ,P-MERGED>>
|
||
<PRINTB <GET .PTR 0>>)
|
||
(T
|
||
<PRINTC <- <GETB ,P-INBUF <GETB .PTR 3>> 32>>
|
||
<WORD-PRINT <- <GETB .PTR 2> 1> <+ <GETB .PTR 3> 1>>)>>
|
||
|
||
<ROUTINE PREP-PRINT (PREP "OPTIONAL" (SP? T) "AUX" WRD VRB)
|
||
<COND (<0? .PREP>
|
||
<RFALSE>)>
|
||
<SET VRB <GET <GET ,P-ITBL ,P-VERBN> 0>>
|
||
<COND (<AND <T? ,P-END-ON-PREP>
|
||
<OR <NOT <EQUAL? .VRB ,W?LIE ,W?SIT>>
|
||
<NOT <==? .PREP ,PR?DOWN>>>>
|
||
<RFALSE>)
|
||
(T
|
||
<COND (.SP? <TELL !\ >)>
|
||
<SET WRD <PREP-FIND .PREP>>
|
||
<COND (<==? .WRD ,W?AGAINST> <TELL "against">)
|
||
(<==? .WRD ,W?THROUGH> <TELL "through">)
|
||
(T <PRINTB .WRD>)>
|
||
<COND (<AND <EQUAL? .VRB ,W?SIT ,W?LIE>
|
||
<EQUAL? .WRD ,W?DOWN>>
|
||
<TELL " on">)>
|
||
<COND (<AND <EQUAL? .VRB ,W?GET>
|
||
<EQUAL? .WRD ,W?OUT>>
|
||
<TELL " of">)>
|
||
<RTRUE>)>>
|
||
|
||
"CLAUSE-COPY"
|
||
|
||
<GLOBAL P-CCTBL <TABLE 0 0 0 0 0>>
|
||
|
||
"pointers used by CLAUSE-COPY (source/destination beginning/end pointers)"
|
||
<CONSTANT CC-BEG 0> "slot in source to start from"
|
||
<CONSTANT CC-END 1> "slot in source to end at"
|
||
<CONSTANT CC-CLAUSE 2> "which orphan table to use"
|
||
<CONSTANT CC-IBEG 3> "insertion beginning (from lexv)"
|
||
<CONSTANT CC-IEND 4> "insertion ending"
|
||
|
||
"do something about duplicate words in clause?"
|
||
|
||
<ROUTINE CLAUSE-COPY (SRC DEST
|
||
"AUX" (IBEG <>) IEND OCL BEG END BB EE OBEG CNT B E)
|
||
<SET BB <GET ,P-CCTBL ,CC-BEG>>
|
||
<SET EE <GET ,P-CCTBL ,CC-END>>
|
||
<SET OCL <GET ,P-CCTBL ,CC-CLAUSE>>
|
||
<SET IBEG <GET ,P-CCTBL ,CC-IBEG>>
|
||
<SET IEND <GET ,P-CCTBL ,CC-IEND>>
|
||
<SET BEG <GET .SRC .BB>>
|
||
<SET END <GET .SRC .EE>>
|
||
<SET OBEG <GET .OCL ,P-MATCHLEN>>
|
||
<REPEAT ()
|
||
<COND (<EQUAL? .BEG .END>
|
||
<COND (<AND .IBEG <NOT ,P-ANAM>>
|
||
<CLAUSE-SUBSTRUC .IBEG .IEND>)>
|
||
<RETURN>)>
|
||
<COND (<AND .IBEG
|
||
<EQUAL? ,P-ANAM <GET .BEG 0>>>
|
||
<CLAUSE-SUBSTRUC .IBEG .IEND>)>
|
||
<CLAUSE-ADD <GET .BEG 0>>
|
||
<SET BEG <REST .BEG ,P-WORDLEN>>>
|
||
<COND (<AND <G? .OBEG 0>
|
||
<G? <SET CNT <- <GET .OCL ,P-MATCHLEN> .OBEG>> 0>>
|
||
<PUT .OCL ,P-MATCHLEN 0>
|
||
<SET OBEG <+ .OBEG 1>>
|
||
<REPEAT ()
|
||
<CLAUSE-ADD <GET .OCL .OBEG> T>
|
||
<COND (<ZERO? <SET CNT <- .CNT 2>>>
|
||
<RETURN>)>
|
||
<SET OBEG <+ .OBEG 2>>>
|
||
<SET OBEG 0>)>
|
||
<PUT .DEST
|
||
.BB
|
||
<REST .OCL <+ <* .OBEG ,P-LEXELEN> 2>>>
|
||
<PUT .DEST
|
||
.EE
|
||
<REST .OCL
|
||
<+ <* <GET .OCL ,P-MATCHLEN> ,P-LEXELEN> 2>>>>
|
||
|
||
<ROUTINE CLAUSE-SUBSTRUC (B E)
|
||
<REPEAT ()
|
||
<COND (<EQUAL? .B .E> <RETURN>)>
|
||
<CLAUSE-ADD <GET .B 0>>
|
||
<SET B <REST .B ,P-WORDLEN>>>>
|
||
|
||
<ROUTINE CLAUSE-ADD (WRD "OPT" (CHECK? <>) "AUX" OCL PTR)
|
||
<SET OCL <GET ,P-CCTBL ,CC-CLAUSE>>
|
||
<SET PTR <GET .OCL ,P-MATCHLEN>>
|
||
<COND (<AND .CHECK? <NOT <ZERO? .PTR>> <ZMEMQ .WRD .OCL>>
|
||
<RFALSE>)
|
||
(ELSE
|
||
<SET PTR <+ .PTR 2>>
|
||
<PUT .OCL <- .PTR 1> .WRD>
|
||
<PUT .OCL .PTR 0>
|
||
<PUT .OCL ,P-MATCHLEN .PTR>)>>
|
||
|
||
<ROUTINE PREP-FIND (PREP "AUX" (CNT 0) SIZE)
|
||
;#DECL ((PREP CNT SIZE) FIX)
|
||
<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)
|
||
;#DECL ((SYN) <PRIMTYPE VECTOR>)
|
||
<SETG P-SYNTAX .SYN>
|
||
<SETG PRSA <GETB .SYN ,P-SACTION>>>
|
||
|
||
<GLOBAL P-GWIMBIT 0>
|
||
|
||
<ROUTINE GWIM (GBIT LBIT PREP "AUX" OBJ ;WPREP)
|
||
;#DECL ((GBIT LBIT) FIX (OBJ) OBJECT)
|
||
<COND (<==? .GBIT ,RMUNGBIT>
|
||
<RETURN ,ROOMS>)>
|
||
<SETG P-GWIMBIT .GBIT>
|
||
<SETG P-SLOCBITS .LBIT>
|
||
<PUT/B ,P-MERGE ,P-MATCHLEN 0>
|
||
<COND (<GET-OBJECT ,P-MERGE <>>
|
||
<SETG P-GWIMBIT 0>
|
||
<COND (<==? <GET/B ,P-MERGE ,P-MATCHLEN> 1>
|
||
<SET OBJ <GET/B ,P-MERGE 1>>
|
||
<TELL !\(>
|
||
<COND (<PREP-PRINT .PREP <>>
|
||
<THE? .OBJ>
|
||
<TELL !\ >)>
|
||
<TELL D .OBJ !\) CR>
|
||
.OBJ)>)
|
||
(T <SETG P-GWIMBIT 0> <RFALSE>)>>
|
||
|
||
<GLOBAL P-PHR:NUMBER 0> "Which noun phrase is being parsed?"
|
||
<GLOBAL P-NAMW <TABLE 0 0>> "noun for PRSO & PRSI"
|
||
<GLOBAL P-ADJW <TABLE 0 0>> "adjective for ditto"
|
||
<GLOBAL P-OFW <TABLE 0 0>> "noun before OF for ditto"
|
||
<VOC "FRONT" NOUN> "to make P-OFW work"
|
||
|
||
<ROUTINE SNARF-OBJECTS ("AUX" PTR)
|
||
<COND (<NOT <==? <SET PTR <GET ,P-ITBL ,P-NC1>> 0>>
|
||
<SETG P-PHR 0>
|
||
<SETG P-SLOCBITS <GETB ,P-SYNTAX ,P-SLOC1>>
|
||
<COND (<NOT <SNARFEM .PTR <GET ,P-ITBL ,P-NC1L> ,P-PRSO>>
|
||
<RFALSE>)>
|
||
<COND (<T? <GET/B ,P-BUTS ,P-MATCHLEN>>
|
||
<SETG P-PRSO <BUT-MERGE ,P-PRSO>>)>)>
|
||
<COND (<NOT <==? <SET PTR <GET ,P-ITBL ,P-NC2>> 0>>
|
||
<SETG P-PHR 1>
|
||
<SETG P-SLOCBITS <GETB ,P-SYNTAX ,P-SLOC2>>
|
||
<COND (<NOT <SNARFEM .PTR <GET ,P-ITBL ,P-NC2L> ,P-PRSI>>
|
||
<RFALSE>)>
|
||
<COND (<NOT <0? <GET/B ,P-BUTS ,P-MATCHLEN>>>
|
||
<COND (<==? <GET/B ,P-PRSI ,P-MATCHLEN> 1>
|
||
<SETG P-PRSO <BUT-MERGE ,P-PRSO>>)
|
||
(T <SETG P-PRSI <BUT-MERGE ,P-PRSI>>)>)>)>
|
||
<RTRUE>>
|
||
|
||
<ROUTINE BUT-MERGE (TBL "AUX" LEN BUTLEN (CNT 1) (MATCHES 0) OBJ NTBL)
|
||
<SET LEN <GET/B .TBL ,P-MATCHLEN>>
|
||
<PUT/B ,P-MERGE ,P-MATCHLEN 0>
|
||
;<SET LB <GET/B ,P-BUTS ,P-MATCHLEN>>
|
||
<REPEAT ()
|
||
<COND (<DLESS? LEN 0> <RETURN>)
|
||
(<NOT <ZMEMQ/B <SET OBJ <GET/B .TBL .CNT>> ,P-BUTS>>
|
||
<SET MATCHES <+ .MATCHES 1>>
|
||
<PUT/B ,P-MERGE .MATCHES .OBJ>)>
|
||
<SET CNT <+ .CNT 1>>>
|
||
<PUT/B ,P-MERGE ,P-MATCHLEN .MATCHES>
|
||
<SET NTBL ,P-MERGE>
|
||
<SETG P-MERGE .TBL>
|
||
.NTBL>
|
||
|
||
<GLOBAL P-NAM <>>
|
||
<GLOBAL P-XNAM <>>
|
||
|
||
<GLOBAL P-ADJ:NUMBER <>>
|
||
<GLOBAL P-XADJ:NUMBER <>>
|
||
|
||
<GLOBAL P-ADJN <>>
|
||
<GLOBAL P-XADJN <>>
|
||
|
||
"These three must be same length:"
|
||
<GLOBAL P-MERGE <ITABLE 45 (BYTE) 0> ;<ITABLE NONE 23 ;45>>
|
||
<GLOBAL P-PRSO <ITABLE 45 (BYTE) 0> ;<ITABLE NONE 23 ;45>>
|
||
<GLOBAL P-PRSI <ITABLE 45 (BYTE) 0> ;<ITABLE NONE 23 ;45>>
|
||
|
||
<GLOBAL P-BUTS <ITABLE 25 (BYTE) 0> ;<ITABLE NONE 12 ;25>>
|
||
|
||
<GLOBAL P-OCL1 <ITABLE NONE 25>>
|
||
<GLOBAL P-OCL2 <ITABLE NONE 25>>
|
||
|
||
<CONSTANT 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:FLAG <>>
|
||
|
||
"grabs the first adjective, unless it comes across a special-cased adjective:"
|
||
<ROUTINE ADJ-CHECK (WRD ADJ "OPT" (NW <>))
|
||
<COND (<ZERO? .ADJ>
|
||
<RTRUE>)
|
||
(<EQUAL? .WRD ,W?RHINO ,W?BUFFALO> ;"STUFFED x HEAD"
|
||
<RTRUE>)
|
||
(<EQUAL? .WRD ,W?BLOND ,W?BLONDE> ;"TALL BLOND(E) MAN"
|
||
<RTRUE>)
|
||
(<EQUAL? .WRD ,W?FIRST ,W?SECOND>;"x CONTACT LENS (why needed?)"
|
||
<RTRUE>)
|
||
(<EQUAL? .NW ,W?OUTFIT> ;"MY x OUTFIT"
|
||
<RTRUE>)
|
||
(<ZMEMQ .WRD ,CHAR-POSS-TABLE>
|
||
<RTRUE>)>>
|
||
|
||
<ROUTINE SNARFEM (PTR EPTR TBL
|
||
"AUX" (BUT <>) LEN WV WRD NW (WAS-ALL <>) ONEOBJ)
|
||
;"Next SETG 6/21/84 for WHICH retrofix"
|
||
<SETG P-NAM <>>
|
||
<SETG P-ADJ <>>
|
||
<SETG P-ADJN <>>
|
||
<SETG P-AND <>>
|
||
<COND (<EQUAL? ,P-GETFLAGS ,P-ALL>
|
||
<SET WAS-ALL T>)>
|
||
<SETG P-GETFLAGS 0>
|
||
;"<SETG P-CSPTR .PTR>
|
||
<SETG P-CEPTR .EPTR>"
|
||
<PUT/B ,P-BUTS ,P-MATCHLEN 0>
|
||
<PUT/B .TBL ,P-MATCHLEN 0>
|
||
<SET WRD <GET .PTR 0>>
|
||
<REPEAT ()
|
||
<COND (<==? .PTR .EPTR>
|
||
<SET WV <GET-OBJECT <OR .BUT .TBL>>>
|
||
<COND (.WAS-ALL <SETG P-GETFLAGS ,P-ALL>)>
|
||
<RETURN .WV>)
|
||
(T
|
||
<COND (<==? .EPTR <REST .PTR ,P-WORDLEN>>
|
||
<SET NW 0>)
|
||
(T <SET NW <GET .PTR ,P-LEXELEN>>)>
|
||
<COND (<EQUAL? .WRD ,W?ALL ;,W?BOTH>
|
||
<SETG P-GETFLAGS ,P-ALL>
|
||
<COND (<==? .NW ,W?OF>
|
||
<SET PTR <REST .PTR ,P-WORDLEN>>)>)
|
||
(<EQUAL? .WRD ,W?BUT ,W?EXCEPT>
|
||
<COND (<NOT <GET-OBJECT <OR .BUT .TBL>>>
|
||
<RFALSE>)>
|
||
<SET BUT ,P-BUTS>
|
||
<PUT/B .BUT ,P-MATCHLEN 0>)
|
||
(<EQUAL? .WRD ,W?A ,W?ONE>
|
||
<COND (<ZERO? ,P-ADJ>
|
||
<SETG P-GETFLAGS ,P-ONE>
|
||
<COND (<==? .NW ,W?OF>
|
||
<SET PTR <REST .PTR ,P-WORDLEN>>)>)
|
||
(T
|
||
<SETG P-NAM .ONEOBJ>
|
||
<COND (<NOT <GET-OBJECT <OR .BUT .TBL>>>
|
||
<RFALSE>)>
|
||
<AND <0? .NW> <RTRUE>>)>)
|
||
(<AND <EQUAL? .WRD ,W?AND ,W?COMMA>
|
||
<NOT <EQUAL? .NW ,W?AND ,W?COMMA>>>
|
||
;"Next SETG 6/21/84 for WHICH retrofix"
|
||
<SETG P-AND T>
|
||
<COND (<NOT <GET-OBJECT <OR .BUT .TBL>>>
|
||
<RFALSE>)>
|
||
T)
|
||
(<WT? .WRD ,PS?BUZZ-WORD>
|
||
<COND (<BUZZER-WORD? .WRD .PTR>
|
||
<RFALSE>)>)
|
||
(<EQUAL? .WRD ,W?AND ,W?COMMA>)
|
||
(<==? .WRD ,W?OF>
|
||
<COND (<0? ,P-GETFLAGS>
|
||
<SETG P-GETFLAGS ,P-INHIBIT>)>)
|
||
(<AND <SET WV <WT? .WRD ,PS?ADJECTIVE ,P1?ADJECTIVE>>
|
||
<ADJ-CHECK .WRD ,P-ADJ .NW ;,P-ADJN>
|
||
<NOT <EQUAL? .NW ,W?OF>>>
|
||
<SETG P-ADJ .WV>
|
||
<SETG P-ADJN .WRD>)
|
||
(<WT? .WRD ,PS?OBJECT ;,P1?OBJECT>
|
||
<SETG P-NAM .WRD>
|
||
<SET ONEOBJ .WRD>)>)>
|
||
<COND (<NOT <==? .PTR .EPTR>>
|
||
<SET PTR <REST .PTR ,P-WORDLEN>>
|
||
<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 RESOLVE-YOUR-HER-HIS ("AUX" (OBJ 0))
|
||
<COND (<EQUAL? ,P-ADJN ,W?YOUR>
|
||
<COND (<NOT <==? ,WINNER ,PLAYER>>
|
||
<SET OBJ ,WINNER>)
|
||
;(T <SET OBJ <QCONTEXT-GOOD?>>)>)
|
||
(<EQUAL? ,P-ADJN ,W?HER>
|
||
<SET OBJ ,P-HER-OBJECT>)
|
||
(<EQUAL? ,P-ADJN ,W?HIS>
|
||
<SET OBJ ,P-HIM-OBJECT>)>
|
||
<COND (<T? .OBJ>
|
||
<SETG P-ADJN <GET ,CHAR-POSS-TABLE
|
||
<+ 1 <GETP .OBJ ,P?CHARACTER>>>>
|
||
<SETG P-ADJ <WT? ,P-ADJN ,PS?ADJECTIVE ,P1?ADJECTIVE>>)>>
|
||
|
||
<ROUTINE GET-OBJECT (TBL
|
||
"OPTIONAL" (VRB T)
|
||
"AUX" BTS LEN XBITS TLEN (GCHECK <>) (OLEN 0) (OBJ 0) (ADJ 0))
|
||
<SET XBITS ,P-SLOCBITS>
|
||
<SET TLEN <GET/B .TBL ,P-MATCHLEN>>
|
||
<COND (<BTST ,P-GETFLAGS ,P-INHIBIT> <RTRUE>)>
|
||
<COND (<AND <EQUAL? ,P-ADJN ,W?YOUR ,W?HER ,W?HIS>
|
||
<T? ,P-NAM>>
|
||
<RESOLVE-YOUR-HER-HIS>)>
|
||
<SET ADJ ,P-ADJN>
|
||
<COND (<AND <NOT ,P-NAM> ,P-ADJ>
|
||
<COND (<WT? ,P-ADJN ,PS?OBJECT>
|
||
<SETG P-NAM ,P-ADJN>
|
||
<SETG P-ADJ <>>
|
||
<SETG P-ADJN <>>)
|
||
(<SET BTS <WT? ,P-ADJN ,PS?DIRECTION ,P1?DIRECTION>>
|
||
<SETG P-ADJ <>>
|
||
<SETG P-ADJN <>>
|
||
<PUT/B .TBL ,P-MATCHLEN 1>
|
||
<PUT/B .TBL 1 ,INTDIR>
|
||
<SETG P-DIRECTION .BTS>
|
||
<RTRUE>)>)>
|
||
<COND (<AND <ZERO? ,P-NAM>
|
||
<ZERO? ,P-ADJ>
|
||
<NOT <==? ,P-GETFLAGS ,P-ALL>>
|
||
<0? ,P-GWIMBIT>>
|
||
<COND (.VRB <MISSING "noun" .ADJ>)>
|
||
<RFALSE>)>
|
||
<COND (<OR <NOT <==? ,P-GETFLAGS ,P-ALL>> <0? ,P-SLOCBITS>>
|
||
<SETG P-SLOCBITS -1>)>
|
||
<SETG P-TABLE .TBL>
|
||
<PROG ()
|
||
<COND (.GCHECK
|
||
<GLOBAL-CHECK .TBL>)
|
||
(T
|
||
<COND (<T? ,LIT>
|
||
;<COND (<EQUAL? ,HERE ,CAR>
|
||
<DO-SL <GETP ,HERE ,P?STATION> ,SOG ,SIR ;.TBL>)>
|
||
;<COND (<AND <EQUAL? ,HERE ,COURTYARD>
|
||
<FIRST? ,FRONT-GATE> ;"for CLUE-4">
|
||
<SEARCH-LIST ,FRONT-GATE .TBL ,P-SRCALL>)>
|
||
<FCLEAR ,WINNER ;,PLAYER ,OPENBIT ;,TRANSBIT>
|
||
<DO-SL ,HERE ,SOG ,SIR ;.TBL>
|
||
<FSET ,WINNER ;,PLAYER ,OPENBIT ;,TRANSBIT>)>
|
||
<DO-SL ,WINNER ,SH ,SC ;.TBL>)>
|
||
<SET LEN <- <GET/B .TBL ,P-MATCHLEN> .TLEN>>
|
||
<COND (<BTST ,P-GETFLAGS ,P-ALL>)
|
||
(<AND <BTST ,P-GETFLAGS ,P-ONE>
|
||
<NOT <0? .LEN>>>
|
||
<COND (<NOT <==? .LEN 1>>
|
||
<PUT/B .TBL 1 <GET/B .TBL <RANDOM .LEN>>>
|
||
<TELL-I-ASSUME <GET/B .TBL 1>>)>
|
||
<PUT/B .TBL ,P-MATCHLEN 1>)
|
||
(<AND <NOT <EQUAL? ,P-GETFLAGS ,P-ALL>>
|
||
<OR <G? .LEN 1>
|
||
<AND <0? .LEN> <NOT <==? ,P-SLOCBITS -1>>>>>
|
||
<COND (<==? ,P-SLOCBITS -1>
|
||
<SETG P-SLOCBITS .XBITS>
|
||
<SET OLEN .LEN>
|
||
<PUT/B .TBL ,P-MATCHLEN <- <GET/B .TBL ,P-MATCHLEN> .LEN>>
|
||
<AGAIN>)
|
||
(T
|
||
<PUT-ADJ-NAM>
|
||
<COND (<0? .LEN> <SET LEN .OLEN>)>
|
||
<COND (<AND <G? .LEN 1>
|
||
;,P-NAM
|
||
;<REMOTE-VERB?>
|
||
<AND <SET OBJ <GET/B .TBL .LEN>>
|
||
<SET OBJ <APPLY <GETP .OBJ ,P?GENERIC>
|
||
.TBL .LEN>>>>
|
||
<COND (<==? .OBJ ,NOT-HERE-OBJECT>
|
||
<RFALSE>)
|
||
(<==? .OBJ ,ROOMS> ;"SWG put it here 7/17/86"
|
||
<SET LEN <GET/B .TBL ,P-MATCHLEN>>)
|
||
(T
|
||
<PUT/B .TBL ,P-MATCHLEN <SET LEN <+ .TLEN 1>>>
|
||
<PUT/B .TBL .LEN .OBJ>
|
||
;<PUT/B .TBL 1 .OBJ>
|
||
;<PUT/B .TBL ,P-MATCHLEN 1>
|
||
<SETG P-NAM <>>
|
||
<SETG P-ADJ <>>
|
||
<SETG P-ADJN <>>
|
||
<RTRUE>)>)
|
||
(<AND .VRB ;".VRB added 8/14/84 by JW"
|
||
<NOT <==? ,WINNER ,PLAYER>>>
|
||
<MORE-SPECIFIC> ;<CANT-ORPHAN>
|
||
<RFALSE>)>
|
||
<COND (<AND .VRB <OR ,P-NAM ;,P-ADJ>>
|
||
<COND (<WHICH-PRINT .TLEN .LEN ;<GET/B .TBL 0> .TBL>
|
||
<COND (<==? .TBL ,P-PRSO>
|
||
<SETG P-ACLAUSE ,P-NC1>)
|
||
(T <SETG P-ACLAUSE ,P-NC2>)>
|
||
<SETG P-AADJ ,P-ADJ>
|
||
<SETG P-ANAM ,P-NAM>
|
||
<ORPHAN <> <>>
|
||
<SETG P-OFLAG T>)>)
|
||
(.VRB
|
||
<MISSING "noun" .ADJ>)>
|
||
<SETG P-NAM <>>
|
||
<SETG P-ADJ <>>
|
||
<SETG P-ADJN <>>
|
||
<RFALSE>)>)>
|
||
<COND (<AND <0? .LEN> .GCHECK>
|
||
<PUT-ADJ-NAM>
|
||
<COND (.VRB
|
||
<SETG P-SLOCBITS .XBITS>
|
||
<COND (<OR <T? ,LIT> <NOT <SEE-VERB?>>>
|
||
;<OR ,LIT
|
||
<VERB? WAIT-FOR WAIT-UNTIL>
|
||
<SPEAKING-VERB?>
|
||
<GAME-VERB?>>
|
||
<OBJ-FOUND ,NOT-HERE-OBJECT .TBL>
|
||
<SETG P-XNAM ,P-NAM>
|
||
<SETG P-NAM <>>
|
||
<SETG P-XADJ ,P-ADJ>
|
||
<SETG P-XADJN ,P-ADJN>
|
||
;"<SETG P-ADJ <>>
|
||
<SETG P-ADJN <>>"
|
||
<RTRUE>)
|
||
(T <TOO-DARK>)>)>
|
||
<SETG P-NAM <>>
|
||
<SETG P-ADJ <>>
|
||
<SETG P-ADJN <>>
|
||
<RFALSE>)
|
||
(<0? .LEN>
|
||
<SET GCHECK T>
|
||
<AGAIN>)>
|
||
<COND (<AND ,P-ADJ <NOT ,P-NAM>>
|
||
<SET OBJ <GET/B .TBL <+ .TLEN 1>>>
|
||
<TELL-I-ASSUME .OBJ>
|
||
<THIS-IS-IT .OBJ>)>
|
||
<SETG P-SLOCBITS .XBITS>
|
||
<PUT-ADJ-NAM>
|
||
<SETG P-NAM <>>
|
||
<SETG P-ADJ <>>
|
||
<SETG P-ADJN <>>
|
||
<RTRUE>>>
|
||
|
||
<ROUTINE GENERIC-CLUE-FCN (TBL "OPTIONAL" (LEN 0))
|
||
<COND (<VERB? FIND ;SEARCH SEARCH-FOR>
|
||
,GENERIC-CLUE)
|
||
(T
|
||
<COND (<0? .LEN> <SET LEN <GET/B .TBL 0>>)>
|
||
<COND (<1? <SET LEN <PRUNE .TBL .LEN ,CLUE-TEST>>>
|
||
<GET/B .TBL 1>)
|
||
;(<0? .LEN>
|
||
<TELL CHE ,PRSI do "n't have" HIM ,PRSO "!" CR>
|
||
,NOT-HERE-OBJECT)
|
||
(T <RETURN ,ROOMS ;<>>)>)>>
|
||
|
||
<ROUTINE CLUE-TEST (OBJ)
|
||
<COND (<AND ;<NOT <==? ,WINNER ,PLAYER>>
|
||
<IN? .OBJ ,WINNER>>
|
||
<RTRUE>)
|
||
(<AND <T? ,PRSI> ;"TAKE CLUE FROM JACK"
|
||
<IN? .OBJ ,PRSI>>
|
||
<RTRUE>)
|
||
(<==? .OBJ ,P-IT-OBJECT>
|
||
<RTRUE>)
|
||
;(<NOT <FSET? .OBJ ,NDESCBIT>>
|
||
<RTRUE>)>>
|
||
|
||
<ROUTINE GENERIC-STAIRS (X "OPTIONAL" Y) ;"in KITCHEN"
|
||
<COND (<VERB? BOARD CLIMB-DOWN CLIMB-UP>
|
||
,STAIRS)
|
||
(T ,BACKSTAIRS)>>
|
||
|
||
;<ROUTINE GENERIC-STAIRS-F (X "OPTIONAL" Y)
|
||
<COND ;(<EQUAL? ,HERE ,JUNCTION ,BASEMENT> ,STAIRS-0)
|
||
;(<EQUAL? ,HERE ,OLD-GREAT-HALL> ,STAIRS-1)
|
||
;(<EQUAL? ,HERE ,CORR-2>
|
||
<COND (<VERB? BOARD CLIMB-UP> ,STAIRS-2)
|
||
(<VERB? CLIMB-DOWN> ,STAIRS-1)>)
|
||
;(<EQUAL? ,HERE ,CORR-3>
|
||
<COND (<VERB? BOARD CLIMB-UP> ,STAIRS-3)
|
||
(<VERB? CLIMB-DOWN> ,STAIRS-2)>)
|
||
;(<EQUAL? ,HERE ,DECK> ,STAIRS-3)
|
||
(<FSET? ,HERE ,WEARBIT> ;"WING-ROOMS" ,STAIRS-NEW)>>
|
||
|
||
<ROUTINE GENERIC-CLOTHES (X "OPTIONAL" Y)
|
||
<COND (<VERB? CHANGE REMOVE ;TAKE TAKE-OFF>
|
||
,NOW-WEARING)>>
|
||
|
||
"use of WINDOW in CAR in COURTYARD:"
|
||
;<ROUTINE GENERIC-WINDOW (X "OPTIONAL" Y)
|
||
<COND (<GLOBAL-IN? ,WINDOW ,HERE>
|
||
,WINDOW)>>
|
||
|
||
;<ROUTINE GENERIC-JACK-DOOR-F (X "OPTIONAL" Y)
|
||
<COND (<NOT <FSET? ,SECRET-JACK-DOOR ,TOUCHBIT>>
|
||
,JACK-ROOM ;,JACK-DOOR)
|
||
(<VERB? OPEN CLOSE>
|
||
,JACK-ROOM ;,JACK-DOOR)>>
|
||
|
||
;<ROUTINE GENERIC-LIBRARY-DOOR-F (X "OPTIONAL" Y)
|
||
<COND (<NOT <FSET? ,SECRET-LIBRARY-DOOR ,TOUCHBIT>>
|
||
,LIBRARY ;,LIBRARY-DOOR)
|
||
(<VERB? OPEN CLOSE>
|
||
,LIBRARY ;,LIBRARY-DOOR)>>
|
||
|
||
;<ROUTINE GENERIC-TAMARA-DOOR-F (X "OPTIONAL" Y)
|
||
<COND (<NOT <FSET? ,SECRET-TAMARA-DOOR ,TOUCHBIT>>
|
||
,TAMARA-ROOM ;,TAMARA-DOOR)
|
||
(<VERB? OPEN CLOSE>
|
||
,TAMARA-ROOM ;,TAMARA-DOOR)>>
|
||
|
||
;<ROUTINE GENERIC-LUMBER-DOOR-F (X "OPTIONAL" Y)
|
||
<COND (<NOT <FSET? ,SECRET-LUMBER-DOOR ,TOUCHBIT>>
|
||
,LUMBER-ROOM ;,LUMBER-DOOR)
|
||
(<VERB? OPEN CLOSE>
|
||
,LUMBER-ROOM ;,LUMBER-DOOR)>>
|
||
|
||
<ROUTINE GENERIC-CLOSET (TBL "OPTIONAL" (LEN 0) "AUX" N)
|
||
<COND (<SET N <ZMEMQ ,HERE ,CHAR-ROOM-TABLE ,CHARACTER-MAX>>
|
||
<RETURN <GET ,CHAR-CLOSET-TABLE .N>>)
|
||
(<0? .TBL>
|
||
<RFALSE>)>
|
||
<COND (<ZMEMQ/B ,HERE .TBL>
|
||
<RETURN ,HERE>)>
|
||
<COND (<0? .LEN>
|
||
<SET LEN <GET/B .TBL 0>>)>
|
||
<COND (<0? <SET LEN <PRUNE .TBL .LEN ,NOT-SECRET-TEST>>>
|
||
<TELL "(You haven't found a secret entrance yet!)" CR>
|
||
,NOT-HERE-OBJECT)
|
||
(<1? .LEN>
|
||
<GET/B .TBL 1>)
|
||
(T <RETURN ,ROOMS ;<>>)>>
|
||
|
||
<ROUTINE GENERIC-DINNER (X "OPTIONAL" Y)
|
||
<COND (<OR <REMOTE-VERB?>
|
||
<VERB? EXAMINE>>
|
||
,DINNER)
|
||
(<AND <EQUAL? ,P-ADJ <> ,A?MY>
|
||
<EQUAL? ,P-XADJ <> ,A?MY>>
|
||
,DINNER)
|
||
;(<NOT <VISIBLE? ,DINNER>>
|
||
<NOT-HERE ,DINNER>
|
||
,NOT-HERE-OBJECT)
|
||
(T
|
||
<SETG CLOCK-WAIT T>
|
||
<TELL "(That wouldn't be polite!)" CR>
|
||
,NOT-HERE-OBJECT)>>
|
||
|
||
<ROUTINE GENERIC-BEDROOM (TBL "OPTIONAL" (N 0) "AUX" RM)
|
||
<COND (<ZERO? .N>
|
||
<SET N <GET/B .TBL ,P-MATCHLEN>>)>
|
||
<COND (<SET RM <ZMEMQ ,HERE ,CHAR-CLOSET-TABLE>>
|
||
<COND (<EQUAL? ,W?DOOR ,P-NAM ,P-XNAM>
|
||
<RETURN <FIND-FLAG-LG ,HERE ,DOORBIT>>)
|
||
(T <RETURN <GET ,CHAR-ROOM-TABLE .RM>>)>)
|
||
(<AND <EQUAL? ,A?JACK\'S ,P-ADJ ,P-XADJ>
|
||
<EQUAL? ,W?DOOR ,P-NAM ,P-XNAM>>
|
||
<RETURN ,JACK-ROOM>)
|
||
(<ZMEMQ/B ,P-IT-OBJECT .TBL>
|
||
<RETURN ,P-IT-OBJECT>)
|
||
(<ZMEMQ/B ,HERE .TBL>
|
||
<RETURN ,HERE>)
|
||
(<REMOTE-VERB?>
|
||
<COND (<EQUAL? ,A?BATH ,P-ADJ ,P-XADJ>
|
||
<RETURN ,YOUR-BATHROOM>)
|
||
(<EQUAL? ,W?ROOM ,P-NAM ,P-XNAM>
|
||
<RETURN ,YOUR-ROOM>)
|
||
(T <SET RM <>>)>)
|
||
(<EQUAL? ,HERE ,GALLERY ,YOUR-BATHROOM>
|
||
<RETURN ,YOUR-ROOM>)
|
||
(<ZMEMQ ,HERE ,CHAR-ROOM-TABLE>
|
||
<RETURN ,HERE>)
|
||
(<VERB? CLIMB-DOWN CLIMB-UP WALK-TO>
|
||
<RETURN ,YOUR-ROOM>)
|
||
(T
|
||
<REPEAT ()
|
||
<COND (<EQUAL? ,HERE <GETP <SET RM <GET/B .TBL .N>> ,P?STATION>>
|
||
<RETURN>)
|
||
(<DLESS? N 1>
|
||
<SET RM <>>
|
||
<RETURN>)>>)>
|
||
<COND (<T? .RM>
|
||
<RETURN .RM>)
|
||
(<EQUAL? ,WINNER ,FRIEND ,LORD>
|
||
<RETURN ,YOUR-ROOM>)
|
||
(T <RFALSE>)>>
|
||
|
||
<ROUTINE GENERIC-GREAT-HALL (X "OPTIONAL" Y)
|
||
<COND (<EQUAL? ,W?ROOM ,P-NAM ,P-XNAM>
|
||
,HERE) ;"kludge!"
|
||
(<FSET? ,HERE ,WEARBIT> ;"WING-ROOMS"
|
||
,GREAT-HALL)
|
||
(T ,OLD-GREAT-HALL)>>
|
||
|
||
<ROUTINE GENERIC-LENS (X "OPTIONAL" Y)
|
||
<COND (<REMOTE-VERB?>
|
||
,LENS)
|
||
(<NOT <FSET? ,LENS-2 ,SEENBIT>>
|
||
,LENS-1)>>
|
||
|
||
<ROUTINE GENERIC-RECORDER (X "OPTIONAL" Y)
|
||
<COND (<NOT <FSET? ,JACK-TAPE ,SEENBIT>>
|
||
,RECORDER)>>
|
||
|
||
<ROUTINE GENERIC-BOX (X "OPTIONAL" Y)
|
||
<COND (<FSET? ,LENS-BOX ,SECRETBIT>
|
||
,VIVIEN-BOX)>>
|
||
|
||
<ROUTINE GENERIC-BOOK (X "OPTIONAL" Y)
|
||
<COND (<EQUAL? ,HERE ,LIBRARY>
|
||
,BOOKS-GLOBAL)>>
|
||
|
||
<ROUTINE GENERIC-WELL (X "OPTIONAL" Y)
|
||
<COND (<NOT <EQUAL? ,HERE ,BASEMENT>>
|
||
,WELL)>>
|
||
|
||
<ROUTINE GENERIC-SKELETON (X "OPTIONAL" Y)
|
||
<COND (<FSET? ,SKELETON ,SEENBIT>
|
||
,SKELETON)>>
|
||
|
||
<ROUTINE GENERIC-ROOM (X "OPTIONAL" Y) ,GLOBAL-HERE>
|
||
|
||
<ROUTINE GENERIC-EYE (X "OPTIONAL" Y)
|
||
<COND (<EQUAL? ,W?EYE ,P-NAM ,P-XNAM>
|
||
,GLASS-EYE)>>
|
||
|
||
<ROUTINE GENERIC-BELL (X "OPTIONAL" Y)
|
||
<COND (<REMOTE-VERB?> ,BELL)>>
|
||
|
||
<ROUTINE GENERIC-WINE (X "OPTIONAL" Y)
|
||
<COND (<VERB? TAKE> ,BOTTLE)>>
|
||
|
||
<ROUTINE SPEAKING-VERB? ("OPTIONAL" (PER 0))
|
||
<COND (<VERB? ANSWER ASK ASK-ABOUT ASK-FOR FORGIVE
|
||
;GOODBYE HELLO NO REPLY SORRY TELL TELL-ABOUT YES $CALL>
|
||
<COND (<EQUAL? .PER 0 ,PRSO>
|
||
<RTRUE>)>)
|
||
(<VERB? ASK-CONTEXT-ABOUT ASK-CONTEXT-FOR TALK-ABOUT>
|
||
<COND (<EQUAL? .PER 0>
|
||
<RTRUE>)>)>>
|
||
|
||
;<ROUTINE CANT-ORPHAN ()
|
||
<TELL "[Please try saying that another way.]" CR>
|
||
<RFALSE>>
|
||
|
||
<ROUTINE MISSING (NV "OPTIONAL" ADJ)
|
||
<COND ;(<EQUAL? .ADJ ,W?INT.NUM ;NUMBER>
|
||
<TELL "[Please use units with numbers.]" CR>)
|
||
(T <TELL
|
||
"[I think there's a " .NV " missing in that sentence!]" CR>)>>
|
||
|
||
<ROUTINE WHICH-PRINT (TLEN LEN TBL "AUX" OBJ RLEN)
|
||
;%<DEBUG-CODE <TELL
|
||
"{Note to Stu: TLEN=" N .TLEN " LEN=" N .LEN " TBL=" N .TBL "}" CR>>
|
||
<COND (<ZERO? .LEN>
|
||
<MORE-SPECIFIC ;REFERRING>
|
||
<RFALSE>)>
|
||
<SET RLEN .LEN>
|
||
<COND (<NOT <==? ,WINNER ,PLAYER>>
|
||
<TELL "\"I don't understand ">
|
||
<COND (<EQUAL? ,P-NAM ,W?DOOR>
|
||
<TELL "which door">)
|
||
;(<EQUAL? ,P-NAM ,W?KEYHOLE>
|
||
<TELL "which " 'KEYHOLE>)
|
||
(T
|
||
<TELL "if">)>
|
||
<TELL " you mean">)
|
||
(T
|
||
<TELL "[Which">
|
||
<COND (<OR <T? ,P-OFLAG> <T? ,P-MERGED> <T? ,P-AND>>
|
||
<COND (<T? ,P-NAM>
|
||
<TELL !\ >
|
||
<PRINTB ,P-NAM>)>)
|
||
(<EQUAL? .TBL ,P-PRSO>
|
||
<CLAUSE-PRINT ,P-NC1 ,P-NC1L <>>)
|
||
(T
|
||
<CLAUSE-PRINT ,P-NC2 ,P-NC2L <>>)>
|
||
<TELL " do you mean">
|
||
<COND (<NOT <EQUAL? ,P-NAM ,W?DOOR ;,W?KEYHOLE>>
|
||
<TELL ",">)>)>
|
||
<COND (<NOT <EQUAL? ,P-NAM ,W?DOOR ;,W?KEYHOLE>>
|
||
<REPEAT ()
|
||
<SET TLEN <+ .TLEN 1>>
|
||
<SET OBJ <GET/B .TBL .TLEN>>
|
||
<TELL THE .OBJ>
|
||
<COND (<==? .LEN 2>
|
||
<COND (<NOT <==? .RLEN 2>> <TELL !\,>)>
|
||
<TELL " or">)
|
||
(<G? .LEN 2> <TELL !\,>)>
|
||
<COND (<L? <SET LEN <- .LEN 1>> 1>
|
||
<RETURN>)>>)>
|
||
<COND (<NOT <==? ,WINNER ,PLAYER>>
|
||
<TELL ".\"" CR>)
|
||
(T
|
||
<TELL "?]" CR>)>>
|
||
|
||
<ROUTINE GLOBAL-SEARCH (TBL RMG "AUX" CNT OBJ)
|
||
<SET CNT <RMGL-SIZE .RMG>>
|
||
<REPEAT ()
|
||
<SET OBJ <GET/B .RMG .CNT>>
|
||
;<COND (<AND <EQUAL? .OBJ ,FRONT-GATE> ;"for CLUE-4"
|
||
<FIRST? .OBJ>>
|
||
<SEARCH-LIST .OBJ .TBL ,P-SRCALL>)>
|
||
<COND (<THIS-IT? .OBJ>
|
||
<OBJ-FOUND .OBJ .TBL>)>
|
||
<COND (<DLESS? CNT 0> <RETURN>)>>>
|
||
|
||
<ROUTINE GLOBAL-CHECK (TBL "AUX" LEN RMG RMGL (CNT 0) ;OBJ OBITS FOO)
|
||
<SET LEN <GET/B .TBL ,P-MATCHLEN>>
|
||
<SET OBITS ,P-SLOCBITS>
|
||
<COND (<SET RMG <GETPT ,HERE ,P?GLOBAL>>
|
||
<GLOBAL-SEARCH .TBL .RMG>)>
|
||
<COND (<NOT <EQUAL? ,P-NAM ,W?DOOR ;,W?KEYHOLE>>
|
||
<COND (<AND <THIS-IT? ,HERE>
|
||
<NOT <ZMEMQ/B ,HERE .TBL>>>
|
||
<OBJ-FOUND ,HERE .TBL>)>
|
||
<COND (<VERB? BOARD CLIMB-DOWN CLIMB-UP EXAMINE LOOK-INSIDE
|
||
;"SEARCH SEARCH-FOR SMELL" THROUGH>
|
||
<ROOM-SEARCH .TBL>)>)>
|
||
<COND (<SET RMG <GETP ,HERE ,P?THINGS>>
|
||
<SET RMGL <GET .RMG 0>>
|
||
<SET CNT 0>
|
||
<REPEAT ()
|
||
<COND (<AND <EQUAL? ,P-NAM <GET .RMG <+ .CNT 1>>>
|
||
<OR <ZERO? ,P-ADJ>
|
||
<EQUAL? ,P-ADJN <GET .RMG <+ .CNT 2>>>>>
|
||
<SETG LAST-PSEUDO-LOC ,HERE>
|
||
<PUTP ,PSEUDO-OBJECT
|
||
,P?ACTION
|
||
<GET .RMG <+ .CNT 3>>>
|
||
<SET FOO
|
||
<BACK <GETPT ,PSEUDO-OBJECT ,P?ACTION> 5>>
|
||
<PUT .FOO 0 <GET ,P-NAM 0>>
|
||
<PUT .FOO 1 <GET ,P-NAM 1>>
|
||
<OBJ-FOUND ,PSEUDO-OBJECT .TBL>
|
||
<RETURN>)>
|
||
<SET CNT <+ .CNT 3>>
|
||
<COND (<NOT <L? .CNT .RMGL>> <RETURN>)>>)>
|
||
<COND (<==? <GET/B .TBL ,P-MATCHLEN> .LEN>
|
||
<SETG P-SLOCBITS -1>
|
||
<SETG P-TABLE .TBL>
|
||
<DO-SL ,GLOBAL-OBJECTS 1 1 ;.TBL>
|
||
<SETG P-SLOCBITS .OBITS>
|
||
<COND (<0? <GET/B .TBL ,P-MATCHLEN>>
|
||
<COND (<VERB? ;$WHERE CLIMB-DOWN CLIMB-UP FIND
|
||
SHOW SSHOW TAKE-TO THROUGH WALK-TO>
|
||
<SEARCH-LIST ,ROOMS ,P-TABLE ,P-SRCTOP>
|
||
;<DO-SL ,ROOMS 1 1 ;.TBL>)>)>)>>
|
||
|
||
<ROUTINE DO-SL (OBJ BIT1 BIT2 "AUX" BITS)
|
||
<COND (<BTST ,P-SLOCBITS <+ .BIT1 .BIT2>>
|
||
<SEARCH-LIST .OBJ ,P-TABLE ,P-SRCALL>)
|
||
(T
|
||
<COND (<BTST ,P-SLOCBITS .BIT1>
|
||
<SEARCH-LIST .OBJ ,P-TABLE ,P-SRCTOP>)
|
||
(<BTST ,P-SLOCBITS .BIT2>
|
||
<SEARCH-LIST .OBJ ,P-TABLE ,P-SRCBOT>)
|
||
(T <RTRUE>)>)>>
|
||
|
||
<GLOBAL P-TABLE:TABLE 0>
|
||
<CONSTANT P-SRCBOT 2>
|
||
<CONSTANT P-SRCTOP 0>
|
||
<CONSTANT P-SRCALL 1>
|
||
|
||
<ROUTINE SEARCH-LIST (OBJ TBL LVL)
|
||
<COND (<SET OBJ <FIRST? .OBJ>>
|
||
<REPEAT ()
|
||
<COND (<AND <NOT <==? .LVL ,P-SRCBOT>>
|
||
;<GETPT .OBJ ,P?SYNONYM>
|
||
<THIS-IT? .OBJ>>
|
||
<OBJ-FOUND .OBJ .TBL>)>
|
||
<COND (<AND <OR <NOT <==? .LVL ,P-SRCTOP>>
|
||
<FSET? .OBJ ,SEARCHBIT>
|
||
<FSET? .OBJ ,SURFACEBIT>>
|
||
<FIRST? .OBJ>
|
||
;<OR ,P-MOBY-FLAG
|
||
<SEE-INSIDE? .OBJ>>
|
||
<OR <FSET? .OBJ ,OPENBIT>
|
||
<FSET? .OBJ ,TRANSBIT>
|
||
,P-MOBY-FLAG
|
||
<AND <FSET? .OBJ ,PERSONBIT>
|
||
<NOT <==? .OBJ ,WINNER ;,PLAYER>>>>
|
||
;<NOT <EQUAL? .OBJ ,PLAYER ,LOCAL-GLOBALS>>>
|
||
<SEARCH-LIST .OBJ .TBL
|
||
<COND (<FSET? .OBJ ,SURFACEBIT> ,P-SRCALL)
|
||
(<FSET? .OBJ ,SEARCHBIT> ,P-SRCALL)
|
||
(T ,P-SRCTOP)>
|
||
;,P-MOBY-FLAG>)>
|
||
<COND (<SET OBJ <NEXT? .OBJ>>) (T <RETURN>)>>)>>
|
||
|
||
<ROUTINE ROOM-SEARCH (TTBL "AUX" (P 0) L TBL O)
|
||
<SET O <CORRIDOR-LOOK ,ROOMS>>
|
||
<COND (<T? .O>
|
||
<OBJ-FOUND .O .TTBL>)>
|
||
<REPEAT ()
|
||
<COND (<OR <0? <SET P <NEXTP ,HERE .P>>>
|
||
<L? .P ,LOW-DIRECTION>>
|
||
<RFALSE>)>
|
||
<SET TBL <GETPT ,HERE .P>>
|
||
<SET L <PTSIZE .TBL>>
|
||
<SET O <GET-REXIT-ROOM .TBL>>
|
||
<COND (<ZMEMQ/B .O .TTBL>
|
||
<AGAIN>)
|
||
(<==? .L ,UEXIT>
|
||
<COND (<THIS-IT? .O>
|
||
<OBJ-FOUND .O .TTBL>)>)
|
||
(<==? .L ,DEXIT>
|
||
<COND (<AND <FSET? <GET-DOOR-OBJ .TBL> ,OPENBIT>
|
||
<THIS-IT? .O>>
|
||
<OBJ-FOUND .O .TTBL>)>)
|
||
(<==? .L ,CEXIT>
|
||
<COND (<AND <VALUE <GETB .TBL ,CEXITFLAG>>
|
||
<THIS-IT? .O>>
|
||
<OBJ-FOUND .O .TTBL>)>)>>>
|
||
|
||
<ROUTINE THIS-IT? (OBJ "AUX" SYNS)
|
||
<COND (<FSET? .OBJ ,INVISIBLE>
|
||
<RFALSE>)
|
||
(<AND <T? ,P-NAM>
|
||
<OR <NOT <SET SYNS <GETPT .OBJ ,P?SYNONYM>>>
|
||
<NOT <ZMEMQ ,P-NAM .SYNS <- </ <PTSIZE .SYNS> 2> 1>>>>>
|
||
<RFALSE>)
|
||
(<AND <T? ,P-ADJ>
|
||
<OR <NOT <SET SYNS <GETPT .OBJ ,P?ADJECTIVE>>>
|
||
<NOT %<COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE>
|
||
'<ZMEMQ ,P-ADJ .SYNS <RMGL-SIZE .SYNS>>)
|
||
(T
|
||
'<ZMEMQB ,P-ADJ .SYNS <RMGL-SIZE .SYNS>>)>>>>
|
||
<RFALSE>)
|
||
(<AND <NOT <0? ,P-GWIMBIT>> <NOT <FSET? .OBJ ,P-GWIMBIT>>>
|
||
<RFALSE>)>
|
||
<RTRUE>>
|
||
|
||
<ROUTINE OBJ-FOUND (OBJ TBL "AUX" PTR)
|
||
<COND (<AND <NOT <==? .OBJ ,NOT-HERE-OBJECT>>
|
||
<ZMEMQ/B .OBJ .TBL>>
|
||
<RFALSE>)>
|
||
<SET PTR <GET/B .TBL ,P-MATCHLEN>>
|
||
<INC PTR>
|
||
<PUT/B .TBL .PTR .OBJ>
|
||
<PUT/B .TBL ,P-MATCHLEN .PTR>>
|
||
|
||
<ROUTINE TAKE-CHECK ()
|
||
<AND <ITAKE-CHECK ,P-PRSO <GETB ,P-SYNTAX ,P-SLOC1>>
|
||
<ITAKE-CHECK ,P-PRSI <GETB ,P-SYNTAX ,P-SLOC2>>>>
|
||
|
||
<ROUTINE ITAKE-CHECK (TBL BITS "AUX" PTR OBJ TAKEN)
|
||
<COND (<AND <SET PTR <GET/B .TBL ,P-MATCHLEN>>
|
||
<OR <BTST .BITS ,SHAVE>
|
||
<BTST .BITS ,STAKE>>
|
||
;<EQUAL? ,WINNER ,PLAYER>>
|
||
<REPEAT ()
|
||
<COND (<L? <SET PTR <- .PTR 1>> 0> <RETURN>)>
|
||
<SET OBJ <GET/B .TBL <+ .PTR 1>>>
|
||
<COND (<==? .OBJ ,IT>
|
||
<COND (<NOT <ACCESSIBLE? ,P-IT-OBJECT>>
|
||
<MORE-SPECIFIC>
|
||
<RFALSE>)
|
||
(T
|
||
<SET OBJ ,P-IT-OBJECT>)>)
|
||
(<==? .OBJ ,HER>
|
||
<COND (<NOT <ACCESSIBLE? ,P-HER-OBJECT>>
|
||
<MORE-SPECIFIC>
|
||
<RFALSE>)
|
||
(T
|
||
<SET OBJ ,P-HER-OBJECT>)>)
|
||
(<==? .OBJ ,HIM>
|
||
<COND (<NOT <ACCESSIBLE? ,P-HIM-OBJECT>>
|
||
<MORE-SPECIFIC>
|
||
<RFALSE>)
|
||
(T
|
||
<SET OBJ ,P-HIM-OBJECT>)>)
|
||
;(<==? .OBJ ,THEM>
|
||
<COND (<NOT <ACCESSIBLE? ,P-THEM-OBJECT>>
|
||
<MORE-SPECIFIC>
|
||
<RFALSE>)
|
||
(T
|
||
<SET OBJ ,P-THEM-OBJECT>)>)>
|
||
<COND (<AND <NOT <HELD? .OBJ ,WINNER>>
|
||
<NOT <EQUAL? .OBJ ,HANDS ,ROOMS>>>
|
||
<SETG PRSO .OBJ>
|
||
<COND (<FSET? .OBJ ,TRYTAKEBIT>
|
||
<SET TAKEN T>)
|
||
(<NOT <==? ,WINNER ,PLAYER>>
|
||
<SET TAKEN <>>)
|
||
(<AND <BTST .BITS ,STAKE>
|
||
<==? <ITAKE <>> T>>
|
||
<SET TAKEN <>>)
|
||
(T <SET TAKEN T>)>
|
||
<COND (<AND .TAKEN <BTST .BITS ,SHAVE>>
|
||
<TELL !\(>
|
||
<TELL CHE ,WINNER is "n't holding">
|
||
<COND (<L? 1 <GET/B .TBL ,P-MATCHLEN>>
|
||
<TELL ;" all" " those things">)
|
||
(<EQUAL? .OBJ ,NOT-HERE-OBJECT>
|
||
<TELL " that">)
|
||
(T
|
||
<TELL THE .OBJ>
|
||
<THIS-IS-IT .OBJ>)>
|
||
<TELL "!)" CR>
|
||
<RFALSE>)
|
||
;(<AND <NOT .TAKEN> <==? ,WINNER ,PLAYER>>
|
||
<FIRST-YOU "take" .OBJ ;,PRSO ,ITAKE-LOC>)>)>>)
|
||
(T)>>
|
||
|
||
<ROUTINE MANY-CHECK ("AUX" (LOSS <>) TMP)
|
||
<COND (<AND <G? <GET/B ,P-PRSO ,P-MATCHLEN> 1>
|
||
<NOT <BTST <GETB ,P-SYNTAX ,P-SLOC1> ,SMANY>>>
|
||
<SET LOSS 1>)
|
||
(<AND <G? <GET/B ,P-PRSI ,P-MATCHLEN> 1>
|
||
<NOT <BTST <GETB ,P-SYNTAX ,P-SLOC2> ,SMANY>>>
|
||
<SET LOSS 2>)>
|
||
<COND (.LOSS
|
||
<COND ;(<NOT <EQUAL? ,WINNER ,PLAYER>>
|
||
<TELL "\"Please, to me simple English speak.\"" CR>
|
||
<RFALSE>)
|
||
(T
|
||
<TELL "[You can't use more than one ">
|
||
<COND (<==? .LOSS 2> <TELL "in">)>
|
||
<TELL "direct object with \"">
|
||
<SET TMP <GET ,P-ITBL ,P-VERBN>>
|
||
<COND (<0? .TMP> <TELL "tell">)
|
||
(<OR <T? ,P-OFLAG> <T? ,P-MERGED>>
|
||
<PRINTB <GET .TMP 0>>)
|
||
(T
|
||
<WORD-PRINT <GETB .TMP 2> <GETB .TMP 3>>)>
|
||
<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>>
|
||
<COND (<NOT <G? .SIZE 0>>
|
||
<RFALSE>)>)>
|
||
<REPEAT ()
|
||
<COND (<==? .ITM <GET .TBL .CNT>>
|
||
<COND (<0? .CNT> <RTRUE>)
|
||
(T <RETURN .CNT>)>)
|
||
(<IGRTR? CNT .SIZE> <RFALSE>)>>>
|
||
|
||
<ROUTINE ZMEMQB (ITM TBL "OPTIONAL" (SIZE -1) "AUX" (CNT 1))
|
||
<COND (<NOT .TBL> <RFALSE>)>
|
||
<COND (<NOT <L? .SIZE 0>> <SET CNT 0>)
|
||
(ELSE
|
||
<SET SIZE <GETB .TBL 0>>
|
||
<COND (<NOT <G? .SIZE 0>>
|
||
<RFALSE>)>)>
|
||
<REPEAT ()
|
||
<COND (<==? .ITM <GETB .TBL .CNT>>
|
||
<COND (<0? .CNT> <RTRUE>)
|
||
(T <RETURN .CNT>)>)
|
||
(<IGRTR? CNT .SIZE> <RFALSE>)>>>
|
||
|
||
;<ROUTINE ZMEMQB (ITM TBL SIZE "AUX" (CNT 0))
|
||
<REPEAT ()
|
||
<COND (<==? .ITM <GETB .TBL .CNT>>
|
||
<COND (<0? .CNT> <RTRUE>)
|
||
(T <RETURN .CNT>)>)
|
||
(<IGRTR? CNT .SIZE> <RFALSE>)>>>
|
||
|
||
<GLOBAL LIT:OBJECT DRIVEWAY ;CAR> "source of light, 0=dark"
|
||
;"2=light here, 1=light from next room, 0=dark"
|
||
|
||
<ROUTINE LIT? ("OPTIONAL" (RM <>) (RMBIT <>) "AUX" OHERE (LIT <>) (P 0) TBL L)
|
||
<COND (<ZERO? .RM>
|
||
<SET RM ,HERE>)>
|
||
<COND (<T? .RMBIT>
|
||
<COND (<NOT <FSET? .RM ,ONBIT>>
|
||
<RETURN <>>)
|
||
(T <RETURN .RM>)>)>
|
||
<COND (<FSET? .RM ,ONBIT>
|
||
<SET LIT .RM>)
|
||
(T
|
||
<SETG P-GWIMBIT ,ONBIT>
|
||
<SET OHERE ,HERE>
|
||
<SETG HERE .RM>
|
||
<PUT/B ,P-MERGE ,P-MATCHLEN 0>
|
||
<SETG P-TABLE ,P-MERGE>
|
||
<SETG P-SLOCBITS -1>
|
||
;<COND (<==? .OHERE .RM>
|
||
<DO-SL ,WINNER 1 1>
|
||
<COND (<AND <NOT <EQUAL? ,WINNER ,PLAYER>>
|
||
<IN? ,PLAYER .RM>>
|
||
<DO-SL ,PLAYER 1 1>)>)>
|
||
<SEARCH-LIST .RM ,P-TABLE ,P-SRCALL>
|
||
;<DO-SL .RM 1 1>
|
||
<COND (<NOT <ZERO? <GET/B ,P-MERGE ,P-MATCHLEN>>>
|
||
<SET LIT <GET/B ,P-MERGE 1>>)>
|
||
<SETG HERE .OHERE>
|
||
<SETG P-GWIMBIT 0>)>
|
||
<COND (<T? .LIT> <RETURN .LIT>)
|
||
(<AND <==? .RM ,GALLERY-CORNER>
|
||
<FSET? ,GALLERY ,ONBIT>>
|
||
<RETURN ,GALLERY>)
|
||
(T
|
||
<REPEAT ()
|
||
<COND (<0? <SET P <NEXTP .RM .P>>>
|
||
<RETURN <>>)
|
||
(<EQUAL? .P ,P?UP ,P?DOWN>
|
||
<AGAIN>) ;"not up or down stairs"
|
||
(<NOT <L? .P ,LOW-DIRECTION>>
|
||
<SET TBL <GETPT .RM .P>>
|
||
<SET L <PTSIZE .TBL>>
|
||
<SET OHERE <GET-REXIT-ROOM .TBL>>
|
||
<COND (<AND <==? .L ,UEXIT>
|
||
<LIT? .OHERE T>>
|
||
<RETURN .OHERE>)
|
||
(<AND <==? .L ,DEXIT>
|
||
<FSET? <GET-DOOR-OBJ .TBL> ,OPENBIT>
|
||
<LIT? .OHERE T>>
|
||
<RETURN .OHERE>)
|
||
(<AND <==? .L ,CEXIT>
|
||
<VALUE <GETB .TBL ,CEXITFLAG>>
|
||
<LIT? .OHERE T>>
|
||
<RETURN .OHERE>)>)>>)>>
|
||
|
||
;<ROUTINE VPRINT ("AUX" TMP)
|
||
<SET TMP <GET ,P-OTBL ,P-VERBN>>
|
||
<COND (<==? .TMP 0> <TELL "tell">)
|
||
(<0? <GETB ,P-VTBL 2>>
|
||
<PRINTB <GET .TMP 0>>)
|
||
(T
|
||
<WORD-PRINT <GETB .TMP 2> <GETB .TMP 3>>)>>
|
||
|
||
<ROUTINE NOT-HERE (OBJ "OPT" (CLOCK <>))
|
||
<COND (<ZERO? .CLOCK>
|
||
<SETG CLOCK-WAIT T>
|
||
<TELL !\(>)>
|
||
<TELL CTHE .OBJ " isn't ">
|
||
<COND (<VISIBLE? .OBJ>
|
||
<TELL "close enough">
|
||
<COND (<SPEAKING-VERB?> <TELL " to hear you">)>
|
||
<TELL !\.>)
|
||
(T <TELL "here!">)>
|
||
<THIS-IS-IT .OBJ>
|
||
<COND (<ZERO? .CLOCK>
|
||
<TELL !\)>)>
|
||
<CRLF>>
|
||
|
||
;<ROUTINE NOT-HERE (OBJ "OPT" (CLOCK <>))
|
||
<COND (<ZERO? .CLOCK>
|
||
<SETG CLOCK-WAIT T>
|
||
<TELL !\(>)>
|
||
<TELL "You can't see ">
|
||
<COND (<NOT <FSET? .OBJ ,NARTICLEBIT>> <TELL "any ">)>
|
||
<THIS-IS-IT .OBJ>
|
||
<TELL D .OBJ " here.">
|
||
<COND (<ZERO? .CLOCK>
|
||
<TELL !\)>)>
|
||
<CRLF>>
|
||
|
||
<OBJECT HER
|
||
(IN GLOBAL-OBJECTS)
|
||
(SYNONYM ;SHE HER MADAM)
|
||
(DESC "her")
|
||
(FLAGS NARTICLEBIT)>
|
||
|
||
<OBJECT HIM
|
||
(IN GLOBAL-OBJECTS)
|
||
(SYNONYM ;HE HIM SIR)
|
||
(DESC "him")
|
||
(FLAGS NARTICLEBIT)>
|
||
|
||
;<OBJECT THEM
|
||
(IN GLOBAL-OBJECTS)
|
||
(SYNONYM THEY THEM)
|
||
(DESC "them")
|
||
(FLAGS NARTICLEBIT)>
|
||
|
||
<GLOBAL QCONTEXT:OBJECT <>>
|
||
;<GLOBAL QCONTEXT-ROOM:OBJECT <>>
|
||
<GLOBAL LAST-PSEUDO-LOC:OBJECT <>>
|
||
<GLOBAL I-ASSUME "[I assume you mean:">
|
||
|
||
<OBJECT INTDIR
|
||
(IN GLOBAL-OBJECTS)
|
||
(SYNONYM DIRECTION)
|
||
(ADJECTIVE NORTH EAST SOUTH WEST NE NW SE SW)
|
||
(DESC ;"compass " "direction")>
|
||
|
||
<ROUTINE PUT-ADJ-NAM ()
|
||
<COND (<NOT <EQUAL? ,P-NAM ,W?IT ,W?HIM ,W?HER>>
|
||
<PUT ,P-NAMW ,P-PHR ,P-NAM>
|
||
<PUT ,P-ADJW ,P-PHR ,P-ADJN>)>>
|
||
|
||
<ROUTINE NOUN-USED? (WORD1 "OPTIONAL" (WORD2 1) (WORD3 1))
|
||
<COND (<ZERO? ,NOW-PRSI>
|
||
<COND (<EQUAL? <GET ,P-NAMW 0> .WORD1 .WORD2 .WORD3>
|
||
<RTRUE>)
|
||
(<EQUAL? <GET ,P-OFW 0> .WORD1 .WORD2 .WORD3>
|
||
<RTRUE>)>)
|
||
(T
|
||
<COND (<EQUAL? <GET ,P-NAMW 1> .WORD1 .WORD2 .WORD3>
|
||
<RTRUE>)
|
||
(<EQUAL? <GET ,P-OFW 1> .WORD1 .WORD2 .WORD3>
|
||
<RTRUE>)>)>>
|
||
|
||
<ROUTINE ADJ-USED? ("OPTIONAL" (WORD1 1) (WORD2 1) (WORD3 1))
|
||
<COND (<ZERO? ,NOW-PRSI>
|
||
<COND (<EQUAL? .WORD1 1>
|
||
<RETURN <GET ,P-ADJW 0>>)
|
||
(<EQUAL? <GET ,P-ADJW 0> .WORD1 .WORD2 .WORD3>
|
||
<RTRUE>)
|
||
(T <RFALSE>)>)
|
||
(T
|
||
<COND (<EQUAL? .WORD1 1>
|
||
<RETURN <GET ,P-ADJW 1>>)
|
||
(<EQUAL? <GET ,P-ADJW 1> .WORD1 .WORD2 .WORD3>
|
||
<RTRUE>)
|
||
(T <RFALSE>)>)>>
|