Original Source

This commit is contained in:
historicalsource 2019-04-13 19:48:51 -04:00
commit 65673bb434
20 changed files with 14485 additions and 0 deletions

1
README.md Normal file
View File

@ -0,0 +1 @@
# minizork-1982

1656
actions.zil Normal file

File diff suppressed because it is too large Load Diff

43
chr.mud Normal file
View File

@ -0,0 +1,43 @@
<SETG LENTAB <IVECTOR 4 0>>
<SETG TBL <IVECTOR 26 0>>
<SETG LINE <ISTRING 100>>
<DEFINE CNTLIN (C "AUX" STR L)
<PROG ()
<READSTRING ,LINE .C <STRING <ASCII 13>> '<RETURN <>>>
<READCHR .C>
<READCHR .C>
<SET L <REST <MEMQ !\, ,LINE>>>
<SET STR <PARSE .L>>
<MAPF <>
<FUNCTION (CHR "AUX" OFF)
<SET OFF <- <ASCII .CHR> 96>>
<PUT ,TBL .OFF <+ <NTH ,TBL .OFF> 1>>>
.STR>>>
<DEFINE WRDLIN (C "AUX" STR L)
<PROG ()
<READSTRING ,LINE .C <STRING <ASCII 13>> '<RETURN <>>>
<READCHR .C>
<READCHR .C>
<SET L <REST <MEMQ !\, ,LINE>>>
<SET STR <PARSE .L>>
<SET LEN </ <+ 4
<MAPF ,+
<FUNCTION (CHR)
<COND (<MEMQ .CHR ,BAD> 2)
(T 1)>>
.STR>> 4>>
<PUT ,LENTAB .LEN <+ <NTH ,LENTAB .LEN> 1>>>>
<DEFINE WRDFILE (NAM "AUX" C)
<COND (<SET C <OPEN "READ" .NAM>>
<REPEAT ()
<COND (<NOT <WRDLIN .C>> <RETURN>)>>
<CLOSE .C>)>>
<DEFINE CNTFILE (NAM "AUX" C)
<COND (<SET C <OPEN "READ" .NAM>>
<REPEAT ()
<COND (<NOT <CNTLIN .C>> <RETURN>)>>
<CLOSE .C>)>>

51
clock.zil Normal file
View File

@ -0,0 +1,51 @@
<CONSTANT C-TABLELEN 180>
<GLOBAL C-TABLE <ITABLE NONE 90>>
<GLOBAL C-INTS 90>
<CONSTANT C-INTLEN 6>
<CONSTANT C-ENABLED? 0>
<CONSTANT C-TICK 1>
<CONSTANT C-RTN 2>
<ROUTINE QUEUE (RTN TICK "AUX" CINT)
#DECL ((RTN) ATOM (TICK) FIX (CINT) <PRIMTYPE VECTOR>)
<PUT <SET CINT <INT .RTN>> ,C-TICK .TICK>
.CINT>
<ROUTINE INT (RTN "AUX" E C INT)
#DECL ((RTN) ATOM (E C INT) <PRIMTYPE VECTOR>)
<SET E <REST ,C-TABLE ,C-TABLELEN>>
<SET C <REST ,C-TABLE ,C-INTS>>
<REPEAT ()
<COND (<==? .C .E>
<SETG C-INTS <- ,C-INTS ,C-INTLEN>>
<SET INT <REST ,C-TABLE ,C-INTS>>
<PUT .INT ,C-RTN .RTN>
<RETURN .INT>)
(<==? <GET .C ,C-RTN> .RTN> <RETURN .C>)>
<SET C <REST .C ,C-INTLEN>>>>
<GLOBAL CLOCK-WAIT <>>
<ROUTINE CLOCKER ("AUX" C E TICK (FLG <>))
#DECL ((C E) <PRIMTYPE VECTOR> (TICK) FIX (FLG) <OR FALSE ATOM>)
<COND (,CLOCK-WAIT <SETG CLOCK-WAIT <>> <RFALSE>)>
<SET C <REST ,C-TABLE ,C-INTS>>
<SET E <REST ,C-TABLE ,C-TABLELEN>>
<REPEAT ()
<COND (<==? .C .E> <RETURN .FLG>)
(<NOT <0? <GET .C ,C-ENABLED?>>>
<SET TICK <GET .C ,C-TICK>>
<COND (<0? .TICK>)
(T
<PUT .C ,C-TICK <- .TICK 1>>
<COND (<NOT <G? .TICK 1>>
<SET FLG T>
<APPLY <GET .C ,C-RTN>>)>)>)>
<SET C <REST .C ,C-INTLEN>>>>

28
crufty.xzap Normal file
View File

@ -0,0 +1,28 @@
.FUNCT THIS-IT?,OBJ,TBL,SYNS,?TMP1
FSET? OBJ,INVISIBLE /FALSE
ZERO? P-NAM /?THN3
GETPT OBJ,P?SYNONYM >SYNS
PTSIZE SYNS
DIV STACK,2
SUB STACK,1
CALL ZMEMQ,P-NAM,SYNS,STACK
ZERO? STACK /FALSE
?THN3: ZERO? P-ADJ /?ELS8
GETPT OBJ,P?ADJECTIVE >SYNS
ZERO? SYNS /FALSE
PTSIZE SYNS
SUB STACK,1
CALL ZMEMQB,P-ADJ,SYNS,STACK
ZERO? STACK /FALSE
?ELS8: ZERO? P-GWIMBIT /TRUE
FSET? OBJ,P-GWIMBIT /TRUE
RFALSE
.FUNCT I-LANTERN
CALL LIGHT-INT,LAMP,I-LANTERN,'LAMP-TABLE
RSTACK
.ENDI

18
crufty.zil Normal file
View File

@ -0,0 +1,18 @@
<ROUTINE THIS-IT? (OBJ TBL "AUX" SYNS)
#DECL ((OBJ) OBJECT (TBL) TABLE (SYNS) <OR FALSE TABLE>)
<AND <NOT <FSET? .OBJ ,INVISIBLE>>
<OR <NOT ,P-NAM>
<ZMEMQ ,P-NAM
<SET SYNS <GETPT .OBJ ,P?SYNONYM>>
<- </ <PTSIZE .SYNS> 2> 1>>>
<OR <NOT ,P-ADJ>
<AND <SET SYNS <GETPT .OBJ ,P?ADJECTIVE>>
<ZMEMQB ,P-ADJ .SYNS <- <PTSIZE .SYNS> 1>>>>
<OR <0? ,P-GWIMBIT> <FSET? .OBJ ,P-GWIMBIT>>>>
<ROUTINE I-LANTERN ()
<LIGHT-INT ,LAMP I-LANTERN LAMP-TABLE>>

164
demons.zil Normal file
View File

@ -0,0 +1,164 @@
"Fighting demon"
<ROUTINE I-FIGHT ("AUX" (FIGHT? <>) (LEN <GET ,VILLAINS 0>)
CNT OO O P)
<COND (,DEAD <RTRUE>)>
<SET CNT 0>
<REPEAT ()
<SET CNT <+ .CNT 1>>
<COND (<==? .CNT .LEN> <RETURN>)>
<SET OO <GET ,VILLAINS .CNT>>
<COND (<IN? <SET O <GET .OO ,V-VILLAIN>> ,HERE>
<COND (<AND <==? .O ,THIEF> ,THIEF-ENGROSSED>
<SETG THIEF-ENGROSSED <>>)
(<L? <GETP .O ,P?STRENGTH> 0>
<SET P <GET .OO ,V-PROB>>
<COND (<AND <NOT <0? .P>> <PROB .P>>
<PUT .OO ,V-PROB 0>
<AWAKEN .O>)
(ELSE
<PUT .OO ,V-PROB <+ .P 25>>)>)
(<OR <FSET? .O ,FIGHTBIT>
<APPLY <GETP .O ,P?ACTION> ,F-FIRST?>>
<SET FIGHT? T>)>)
(ELSE
<COND (<FSET? .O ,FIGHTBIT>
<APPLY <GETP .O ,P?ACTION> ,F-BUSY?>)>
<COND (<==? .O ,THIEF> <SETG THIEF-ENGROSSED <>>)>
<FCLEAR ,WINNER ,STAGGERED>
<FCLEAR .O ,STAGGERED>
<FCLEAR .O ,FIGHTBIT>
<AWAKEN .O>)>>
<COND (<NOT .FIGHT?> <RTRUE>)>
<DO-FIGHT .LEN>>
<ROUTINE AWAKEN (O "AUX" (S <GETP .O ,P?STRENGTH>))
<COND (<L? .S 0>
<PUTP .O ,P?STRENGTH <- 0 .S>>
<APPLY <GETP .O ,P?ACTION> ,F-CONSCIOUS>)>
T>
"SWORD demon"
<ROUTINE I-SWORD ("AUX" (DEM <INT I-SWORD>) (G <GETP ,SWORD ,P?TVALUE>)
(NG 0) P T L)
#DECL ((NG G) FIX)
<COND (<IN? ,SWORD ,ADVENTURER>
<COND (<INFESTED? ,HERE> <SET NG 2>)
(ELSE
<SET P 0>
<REPEAT ()
<COND (<0? <SET P <NEXTP ,HERE .P>>>
<RETURN>)
(<NOT <L? .P ,LOW-DIRECTION>>
<SET T <GETPT ,HERE .P>>
<SET L <PTSIZE .T>>
<COND (<EQUAL? .L ,UEXIT ,CEXIT ,DEXIT>
<COND (<INFESTED? <GETB .T 0>>
<SET NG 1>
<RETURN>)>)>)>>)>
<COND (<==? .NG .G>)
(<==? .NG 2>
<TELL "Your sword has begun to glow very brightly." CR>)
(<1? .NG>
<TELL "Your sword is glowing with a faint blue glow."
CR>)
(<0? .NG>
<TELL "Your sword is no longer glowing." CR>)>
<PUTP ,SWORD ,P?TVALUE .NG>)
(ELSE <PUT .DEM ,C-ENABLED? 0>)>>
<ROUTINE INFESTED? (R "AUX" (F <FIRST? .R>))
<REPEAT ()
<COND (<NOT .F> <RETURN <>>)
(<AND <FSET? .F ,VILLAIN> <NOT <FSET? .F ,INVISIBLE>>>
<RTRUE>)
(<NOT <SET F <NEXT? .F>>> <RETURN <>>)>>>
"THIEF demon"
<ROUTINE I-THIEF ("AUX" (RM <LOC ,THIEF>) ROBJ HERE? (ONCE <>))
<PROG ()
<COND (<SET HERE? <NOT <FSET? ,THIEF ,INVISIBLE>>>
<SET RM <LOC ,THIEF>>)>
<COND
(<AND <==? .RM ,TREASURE-ROOM> <NOT <==? .RM ,HERE>>>
<COND (.HERE? <HACK-TREASURES> <SET HERE? <>>)>
<DEPOSIT-BOOTY ,TREASURE-ROOM>)
(<==? .RM ,HERE>
<THIEF-VS-ADVENTURER .HERE?>)
(ELSE
<COND (<AND <IN? ,THIEF .RM>
<NOT <FSET? ,THIEF ,INVISIBLE>>> ;"Leave if victim left"
<FSET ,THIEF ,INVISIBLE>
<SET HERE? <>>)>
<COND (<FSET? .RM ,TOUCHBIT> ;"Hack the adventurer's belongings"
<ROB .RM ,THIEF 75>
<COND (<AND <FSET? .RM ,MAZEBIT> <FSET? ,HERE ,MAZEBIT>>
<ROB-MAZE .RM>)
(ELSE <STEAL-JUNK .RM>)>)>)>
<COND (<AND <SET ONCE <NOT .ONCE>> <NOT .HERE?>>
;"Move to next room, and hack."
<REPEAT ()
<COND (<AND .RM <SET RM <NEXT? .RM>>>)
(ELSE <SET RM <FIRST? ,ROOMS>>)>
<COND (<AND <NOT <FSET? .RM ,SACREDBIT>>
<FSET? .RM ,RLANDBIT>>
<MOVE ,THIEF .RM>
<FCLEAR ,THIEF ,FIGHTBIT>
<FSET ,THIEF ,INVISIBLE>
<RETURN>)>>
<AGAIN>)>>
<COND (<NOT <==? .RM ,TREASURE-ROOM>>
<DROP-JUNK .RM>)>>
<ROUTINE DROP-JUNK (RM "AUX" X N)
<SET X <FIRST? ,THIEF>>
<REPEAT ()
<COND (<NOT .X> <RETURN>)>
<SET N <NEXT? .X>>
<COND (<==? .X ,STILETTO>)
(<AND <0? <GETP .X ,P?TVALUE>> <PROB 30 T>>
<FCLEAR .X ,INVISIBLE>
<MOVE .X .RM>
<COND (<==? .RM ,HERE>
<TELL
"The robber, rummaging through his bag, dropped a few items he found
valueless." CR>)>)>
<SET X .N>>>
<ROUTINE STEAL-JUNK (RM "AUX" X N)
<SET X <FIRST? .RM>>
<REPEAT ()
<COND (<NOT .X> <RETURN>)>
<SET N <NEXT? .X>>
<COND (<AND <0? <GETP .X ,P?TVALUE>>
<FSET? .X ,TAKEBIT>
<NOT <FSET? .X ,SACREDBIT>>
<NOT <FSET? .X ,INVISIBLE>>
<OR <==? .X ,STILETTO>
<PROB 10 T>>>
<MOVE .X ,THIEF>
<FSET .X ,TOUCHBIT>
<FSET .X ,INVISIBLE>
<COND (<==? .X ,ROPE> <SETG DOME-FLAG <>>)>
<COND (<==? .RM ,HERE>
<TELL "You suddenly notice that the "
D .X " vanished." CR>)>
<RETURN>)>
<SET X .N>>>
<ROUTINE ROB (WHAT THIEF "OPTIONAL" (PROB <>) "AUX" N X (ROBBED? <>))
<SET X <FIRST? .WHAT>>
<REPEAT ()
<COND (<NOT .X> <RETURN .ROBBED?>)>
<SET N <NEXT? .X>>
<COND (<AND <NOT <FSET? .X ,INVISIBLE>>
<NOT <FSET? .X ,SACREDBIT>>
<G? <GETP .X ,P?TVALUE> 0>
<OR <NOT .PROB> <PROB .PROB>>>
<MOVE .X .THIEF>
<FSET .X ,TOUCHBIT>
<COND (<==? .THIEF ,THIEF> <FSET .X ,INVISIBLE>)>
<SET ROBBED? T>)>
<SET X .N>>>

1687
dungeon.zil Normal file

File diff suppressed because it is too large Load Diff

98
fights.zil Normal file
View File

@ -0,0 +1,98 @@
;"SUBTITLE PURE STRUCTURE FROM MELEE"
"messages for winner"
<CONSTANT F-WEP 0> ;"means print weapon name"
<CONSTANT F-DEF 1> ;"means print defender name (villain, e.g.)"
<GLOBAL HERO-MELEE
<TABLE
<LTABLE
<LTABLE "Your " F-WEP " misses the " F-DEF " by an inch.">
<LTABLE "A good slash, but it misses the " F-DEF " by a mile.">
<LTABLE "You charge, but the " F-DEF " jumps nimbly aside.">>
<LTABLE
<LTABLE "Your " F-WEP " crashes down, knocking the " F-DEF " into dreamland.">>
<LTABLE
<LTABLE "The fatal blow strikes the " F-DEF " square in the heart: He dies.">>
<LTABLE
<LTABLE "The " F-DEF " is struck on the arm, blood begins to trickle down.">
<LTABLE "Your " F-WEP " pinks the " F-DEF " on the wrist, but it's not serious.">>
<LTABLE
<LTABLE "The " F-DEF " receives a deep gash in his side.">
<LTABLE "A savage blow on the thigh! The " F-DEF " is stunned but can still fight!">>
<LTABLE
<LTABLE "The " F-DEF " is confused and can't fight back.">
<LTABLE "The quickness of your thrust knocks the " F-DEF " back, stunned.">>
<LTABLE
<LTABLE "The " F-DEF " is disarmed by a subtle feint past his guard.">>>>
\
"messages for troll"
<GLOBAL TROLL-MELEE
<TABLE
<LTABLE
<LTABLE "The axe sweeps past as you jump aside.">
<LTABLE "The axe crashes against the rock, throwing sparks!">>
<LTABLE
<LTABLE "The flat of the troll's axe hits you delicately on the head, knocking
you out.">>
<LTABLE
<LTABLE "The troll neatly removes your head.">>
<LTABLE
<LTABLE "The axe gets you right in the side. Ouch!">
<LTABLE "The flat of the troll's axe skins across your forearm.">>
<LTABLE
<LTABLE "An axe stroke makes a deep wound in your leg.">
<LTABLE "The troll's axe swings down, gashing your shoulder.">>
<LTABLE
<LTABLE "The troll hits you with a glancing blow, and you are momentarily
stunned.">
<LTABLE "You stagger back under a hail of axe strokes.">>
<LTABLE
<LTABLE "The axe knocks your " F-WEP " out of your hand. It falls to the floor.">>
<LTABLE
<LTABLE "The troll hesitates, fingering his axe.">>
<LTABLE
<LTABLE "Conquering his fears, the troll puts you to death.">>>>
\
"messages for thief"
<GLOBAL THIEF-MELEE
<TABLE
<LTABLE
<LTABLE "The thief stabs nonchalantly with his stiletto and misses.">
<LTABLE "You dodge as the thief comes in low.">
<LTABLE "The thief tries to sneak past your guard, but you twist away.">>
<LTABLE
<LTABLE "The thief knocks you out.">>
<LTABLE
<LTABLE "The thief bows formally, raises his stiletto, and with a wry grin,
ends the battle and your life.">>
<LTABLE
<LTABLE "The thief draws blood, raking his stiletto across your arm.">
<LTABLE "The thief slowly approaches, strikes like a snake, and leaves
you wounded.">>
<LTABLE
<LTABLE "The thief stabs a deep cut in your upper arm.">
<LTABLE "The thief strikes at your wrist, and suddenly your grip is slippery
with blood.">>
<LTABLE
<LTABLE "The thief rams the haft of his blade into your stomach, leaving
you out of breath.">>
<LTABLE
<LTABLE "The thief neatly flips your " F-WEP " out of your hands, and it drops
to the floor.">>
<LTABLE
<LTABLE "The thief, a man of good breeding, refrains from attacking a helpless
opponent.">
<LTABLE "The thief amuses himself by searching your pockets.">>
<LTABLE
<LTABLE "The thief, who is essentially a pragmatist, dispatches you as a
threat to his livelihood.">>>>

90
macros.zil Normal file
View File

@ -0,0 +1,90 @@
<SETG C-ENABLED? 0>
<SETG C-ENABLED 1>
<SETG C-DISABLED 0>
<DEFMAC TELL ("ARGS" A)
<FORM PROG ()
!<MAPF ,LIST
<FUNCTION ("AUX" E P O)
<COND (<EMPTY? .A> <MAPSTOP>)
(<SET E <NTH .A 1>>
<SET A <REST .A>>)>
<COND (<TYPE? .E ATOM>
<COND (<OR <=? <SET P <SPNAME .E>>
"CRLF">
<=? .P "CR">>
<MAPRET '<CRLF>>)
(<EMPTY? .A>
<ERROR INDICATOR-AT-END? .E>)
(ELSE
<SET O <NTH .A 1>>
<SET A <REST .A>>
<COND (<OR <=? <SET P <SPNAME .E>>
"DESC">
<=? .P "D">
<=? .P "OBJ">
<=? .P "O">>
<MAPRET <FORM PRINTD .O>>)
(<OR <=? .P "NUM">
<=? .P "N">>
<MAPRET <FORM PRINTN .O>>)
(<OR <=? .P "CHAR">
<=? .P "CHR">
<=? .P "C">>
<MAPRET <FORM PRINTC .O>>)
(ELSE
<MAPRET
<FORM PRINT
<FORM GETP .O .E>>>)>)>)
(<TYPE? .E STRING>
<MAPRET <FORM PRINTI .E>>)
(<TYPE? .E FORM>
<MAPRET <FORM PRINT .E>>)
(ELSE <ERROR UNKNOWN-TYPE .E>)>>>>>
<DEFMAC VERB? ("TUPLE" ATMS "AUX" (O ()) (L ()))
<REPEAT ()
<COND (<EMPTY? .ATMS>
<RETURN!- <COND (<LENGTH? .O 1> <NTH .O 1>)
(ELSE <FORM OR !.O>)>>)>
<REPEAT ()
<COND (<EMPTY? .ATMS> <RETURN!->)>
<SET ATM <NTH .ATMS 1>>
<SET L
(<FORM GVAL <PARSE <STRING "V?" <SPNAME .ATM>>>>
!.L)>
<SET ATMS <REST .ATMS>>
<COND (<==? <LENGTH .L> 3> <RETURN!->)>>
<SET O (<FORM EQUAL? ',PRSA !.L> !.O)>
<SET L ()>>>
<DEFMAC RFATAL ()
'<PROG () <PUSH 2> <RSTACK>>>
<DEFMAC PROB ('BASE? "OPTIONAL" 'LOSER?)
<COND (<ASSIGNED? LOSER?> <FORM ZPROB .BASE?>)
(ELSE <FORM G? .BASE? '<RANDOM 100>>)>>
<ROUTINE ZPROB
(BASE)
<COND (,LUCKY <G? .BASE <RANDOM 100>>)
(ELSE <G? .BASE <RANDOM 300>>)>>
<ROUTINE PICK-ONE (FROB)
<GET .FROB <RANDOM <GET .FROB 0>>>>
<DEFMAC ENABLE ('INT) <FORM PUT .INT ,C-ENABLED? 1>>
<DEFMAC DISABLE ('INT) <FORM PUT .INT ,C-ENABLED? 0>>
<DEFMAC FLAMING? ('OBJ)
<FORM AND <FORM FSET? .OBJ ',FLAMEBIT>
<FORM FSET? .OBJ ',ONBIT>>>
<DEFMAC OPENABLE? ('OBJ)
<FORM OR <FORM FSET? .OBJ ',DOORBIT>
<FORM FSET? .OBJ ',CONTBIT>>>
<DEFMAC ABS ('NUM)
<FORM COND (<FORM L? .NUM 0> <FORM - 0 .NUM>)
(T .NUM)>>

129
main.zil Normal file
View File

@ -0,0 +1,129 @@
<CONSTANT M-FATAL 2>
<CONSTANT M-HANDLED 1>
<CONSTANT M-NOT-HANDLED <>>
<CONSTANT M-BEG 1>
<CONSTANT M-END <>>
<CONSTANT M-ENTER 2>
<CONSTANT M-LOOK 3>
<ROUTINE GO ()
<ENABLE <QUEUE I-FIGHT -1>>
<QUEUE I-SWORD -1>
<ENABLE <QUEUE I-THIEF -1>>
<QUEUE I-LANTERN 200>
<PUTP ,INFLATED-BOAT ,P?VTYPE ,RWATERBIT>
<PUT ,DEF1-RES 1 <REST ,DEF1 2>>
<PUT ,DEF1-RES 2 <REST ,DEF1 4>>
<PUT ,DEF2-RES 2 <REST ,DEF2B 2>>
<PUT ,DEF2-RES 3 <REST ,DEF2B 4>>
<PUT ,DEF3-RES 1 <REST ,DEF3A 2>>
<PUT ,DEF3-RES 3 <REST ,DEF3B 2>>
<SETG HERE ,WEST-OF-HOUSE>
<SETG P-IT-OBJECT ,MAILBOX>
<SETG P-IT-LOC ,HERE>
<COND (<NOT <FSET? ,HERE ,TOUCHBIT>> <V-VERSION> <CRLF>)>
<SETG LIT T>
<SETG WINNER ,ADVENTURER>
<V-LOOK>
<MAIN-LOOP>
<AGAIN>>
<ROUTINE MAIN-LOOP ("AUX" ICNT OCNT NUM CNT OBJ TBL V PTBL OBJ1 TMP)
#DECL ((CNT OCNT ICNT NUM) FIX (V) <OR 'T FIX FALSE> (OBJ) <OR FALSE OBJECT>
(OBJ1) OBJECT (TBL) TABLE (PTBL) <OR FALSE ATOM>)
<REPEAT ()
<SET CNT 0>
<SET OBJ <>>
<SET PTBL T>
<COND (<SETG P-WON <PARSER>>
<SET ICNT <GET ,P-PRSI ,P-MATCHLEN>>
<SET NUM
<COND (<0? <SET OCNT <GET ,P-PRSO ,P-MATCHLEN>>> .OCNT)
(<G? .OCNT 1>
<SET TBL ,P-PRSO>
<COND (<0? .ICNT> <SET OBJ <>>)
(T <SET OBJ <GET ,P-PRSI 1>>)>
.OCNT)
(<G? .ICNT 1>
<SET PTBL <>>
<SET TBL ,P-PRSI>
<SET OBJ <GET ,P-PRSO 1>>
.ICNT)
(T 1)>>
<COND (<AND <NOT .OBJ> <1? .ICNT>> <SET OBJ <GET ,P-PRSI 1>>)>
<COND (<==? ,PRSA ,V?WALK> <SET V <PERFORM ,PRSA ,PRSO>>)
(<0? .NUM>
<COND (<0? <BAND <GETB ,P-SYNTAX ,P-SBITS> ,P-SONUMS>>
<SET V <PERFORM ,PRSA>>)
(T
<TELL "I don't know what object you mean.">
<SET V <>>)>)
(T
<REPEAT ()
<COND (<G? <SET CNT <+ .CNT 1>> .NUM> <RETURN>)
(T
<COND (.PTBL <SET OBJ1 <GET ,P-PRSO .CNT>>)
(T <SET OBJ1 <GET ,P-PRSI .CNT>>)>
<COND (<G? .NUM 1>
<PRINTD .OBJ1>
<TELL ": ">)>
<SET V
<PERFORM ,PRSA
<COND (.PTBL .OBJ1) (T .OBJ)>
<COND (.PTBL .OBJ) (T .OBJ1)>>>
<COND (<==? .V ,M-FATAL> <RETURN>)>)>>
<SETG P-IT-OBJECT .OBJ1>
<SETG P-IT-LOC ,HERE>)>
<SETG MOVES <+ ,MOVES 1>>
<COND (<==? .V ,M-FATAL> <SETG P-CONT <>>)>)
(T
<SETG P-CONT <>>)>
<SET V <CLOCKER>>>>
<GLOBAL L-PRSA <>>
<GLOBAL L-PRSO <>>
<GLOBAL L-PRSI <>>
<ROUTINE PERFORM (A "OPTIONAL" (O <>) (I <>) "AUX" V OA OO OI)
#DECL ((A) FIX (O) <OR FALSE OBJECT FIX> (I) <OR FALSE OBJECT> (V) ANY)
<SET OA ,PRSA>
<SET OO ,PRSO>
<SET OI ,PRSI>
<SETG PRSA .A>
<COND (<AND <EQUAL? ,IT .I .O>
<NOT <EQUAL? ,P-IT-LOC ,HERE>>>
<TELL "I don't see what you are referring to." CR>
<RFATAL>)>
<COND (<==? .O ,IT> <SET O ,P-IT-OBJECT>)>
<COND (<==? .I ,IT> <SET I ,P-IT-OBJECT>)>
<SETG PRSO .O>
<SETG PRSI .I>
<COND (<NOT <==? .A ,V?AGAIN>>
<SETG L-PRSA .A>
<SETG L-PRSO .O>
<SETG L-PRSI .I>)>
<COND (<SET V <APPLY <GETP ,WINNER ,P?ACTION>>> .V)
(<SET V <APPLY <GETP <LOC ,WINNER> ,P?ACTION> ,M-BEG>> .V)
(<SET V <APPLY <GET ,PREACTIONS .A>>> .V)
(<AND .I <SET V <APPLY <GETP .I ,P?ACTION>>>> .V)
(<AND .O
<NOT <==? .A ,V?WALK>>
<SET V <APPLY <GETP .O ,P?ACTION>>>>
.V)
(<SET V <APPLY <GET ,ACTIONS .A>>> .V)>
<COND (<NOT <==? .V ,M-FATAL>>
<SET V <APPLY <GETP ,HERE ,P?ACTION> ,M-END>>)>
<SETG PRSA .OA>
<SETG PRSO .OO>
<SETG PRSI .OI>
.V>

365
melee.zil Normal file
View File

@ -0,0 +1,365 @@
"SUBTITLE MELEE"
"melee actions (object functions for villains called with these"
<CONSTANT F-DEAD 2> ;"mistah kurtz, he dead."
<CONSTANT F-FIRST? 5> ;"strike first?"
\
"blow results"
<CONSTANT MISSED 1> ;"attacker misses"
<CONSTANT KILLED 3> ;"defender dead"
<CONSTANT LIGHT-WOUND 4> ;"defender lightly wounded"
<CONSTANT SERIOUS-WOUND 5> ;"defender seriously wounded"
<CONSTANT STAGGER 6> ;"defender staggered (miss turn)"
<CONSTANT LOSE-WEAPON 7> ;"defender loses weapon"
<CONSTANT HESITATE 8> ;"hesitates (miss on free swing)"
<CONSTANT SITTING-DUCK 9> ;"sitting duck (crunch!)"
"tables of melee results"
<GLOBAL DEF1
<TABLE
MISSED MISSED MISSED MISSED
STAGGER STAGGER
STAGGER STAGGER
KILLED KILLED KILLED KILLED KILLED>>
<GLOBAL DEF2A
<TABLE
MISSED MISSED MISSED MISSED MISSED
STAGGER STAGGER
LIGHT-WOUND LIGHT-WOUND
KILLED>>
<GLOBAL DEF2B
<TABLE
MISSED MISSED MISSED
STAGGER STAGGER
LIGHT-WOUND LIGHT-WOUND LIGHT-WOUND
KILLED
KILLED KILLED KILLED>>
<GLOBAL DEF3A
<TABLE
MISSED MISSED MISSED MISSED MISSED
STAGGER STAGGER
LIGHT-WOUND LIGHT-WOUND
SERIOUS-WOUND SERIOUS-WOUND>>
<GLOBAL DEF3B
<TABLE
MISSED MISSED MISSED
STAGGER STAGGER
LIGHT-WOUND LIGHT-WOUND LIGHT-WOUND
SERIOUS-WOUND SERIOUS-WOUND SERIOUS-WOUND>>
<GLOBAL DEF3C
<TABLE
MISSED
STAGGER STAGGER
LIGHT-WOUND LIGHT-WOUND LIGHT-WOUND LIGHT-WOUND
SERIOUS-WOUND SERIOUS-WOUND SERIOUS-WOUND>>
<GLOBAL DEF1-RES
<TABLE DEF1
0 ;<REST ,DEF1 2>
0 ;<REST ,DEF1 4>>>
<GLOBAL DEF2-RES
<TABLE DEF2A
DEF2B
0; <REST ,DEF2B 2>
0; <REST ,DEF2B 4>>>
<GLOBAL DEF3-RES
<TABLE DEF3A
0 ;<REST ,DEF3A 2>
DEF3B
0 ;<REST ,DEF3B 2>
DEF3C>>
\
"useful constants"
<CONSTANT STRENGTH-MAX 7>
<CONSTANT STRENGTH-MIN 2>
<CONSTANT CURE-WAIT 30>
"each table entry is:"
<CONSTANT V-VILLAIN 0> ;"villain"
<CONSTANT V-BEST 1> ;"best weapon"
<CONSTANT V-BEST-ADV 2> ;"advantage it confers"
<CONSTANT V-PROB 3> ;"prob of waking if unconscious"
<CONSTANT V-MSGS 4> ;"messages for that villain"
<GLOBAL VILLAINS
<LTABLE <TABLE TROLL SWORD 1 0 TROLL-MELEE>
<TABLE THIEF KNIFE 1 0 THIEF-MELEE>>>
\
"I-FIGHT moved to DEMONS"
<ROUTINE DO-FIGHT (LEN "AUX" CNT RES O OO (OUT <>))
<REPEAT ()
<SET CNT 0>
<REPEAT ()
<SET CNT <+ .CNT 1>>
<COND (<==? .CNT .LEN>
<SET RES T>
<RETURN T>)>
<SET OO <GET ,VILLAINS .CNT>>
<SET O <GET .OO ,V-VILLAIN>>
<COND (<NOT <FSET? .O ,FIGHTBIT>>)
(<NOT <SET RES
<VILLAIN-BLOW
.OO
.OUT>>>
<SET RES <>>
<RETURN>)
(<==? .RES ,UNCONSCIOUS>
<SET OUT <+ 1 <RANDOM 3>>>)>>
<COND (.RES
<COND (<NOT .OUT> <RETURN>)
(T
<SET OUT <- .OUT 1>>
<COND (<0? .OUT> <RETURN>)>)>)
(ELSE <RETURN>)>>>
\
"takes a remark, defender, and good-guy's weapon"
<ROUTINE REMARK (REMARK D W "AUX" (LEN <GET .REMARK 0>) (CNT 0) STR)
#DECL ((A D) OBJECT (W) <OR OBJECT FALSE> (LEN CNT) FIX
(STR) <OR FIX STRING>)
<REPEAT ()
<COND (<G? <SET CNT <+ .CNT 1>> .LEN> <RETURN>)>
<SET STR <GET .REMARK .CNT>>
<COND (<==? .STR ,F-WEP> <PRINTD .W>)
(<==? .STR ,F-DEF> <PRINTD .D>)
(ELSE <PRINT .STR>)>>
<CRLF>>
"Strength of the player is a basic value (S) adjusted by his P?STRENGTH
property, which is normally 0"
<ROUTINE FIGHT-STRENGTH ("OPTIONAL" (ADJUST? T) "AUX" S)
#DECL ((HERO) ADV (S SMAX SMIN VALUE) FIX (ADJUST?) <OR ATOM FALSE>)
<SET S
<+ ,STRENGTH-MIN
</ ,SCORE
</ ,SCORE-MAX
<- ,STRENGTH-MAX ,STRENGTH-MIN>>>>>
<COND (.ADJUST? <+ .S <GETP ,WINNER ,P?STRENGTH>>)(ELSE .S)>>
<ROUTINE VILLAIN-STRENGTH (OO
"AUX" (VILLAIN <GET .OO ,V-VILLAIN>)
OD TMP)
#DECL ((VILLAIN) OBJECT (WV) <OR FALSE VECTOR>
(OD VALUE) FIX)
<SET OD <GETP .VILLAIN ,P?STRENGTH>>
<COND (<NOT <L? .OD 0>>
<COND (<AND <==? .VILLAIN ,THIEF> ,THIEF-ENGROSSED>
<COND (<G? .OD 2> <SET OD 2>)>
<SETG THIEF-ENGROSSED <>>)>
<COND (<AND ,PRSI
<FSET? ,PRSI ,WEAPONBIT>
<==? <GET .OO ,V-BEST> ,PRSI>>
<SET TMP <- .OD <GET .OO ,V-BEST-ADV>>>
<COND (<L? .TMP 1> <SET TMP 1>)>
<SET OD .TMP>)>)>
.OD>
"find a weapon (if any) in possession of argument"
<ROUTINE FIND-WEAPON (O "AUX" W)
<SET W <FIRST? .O>>
<COND (<NOT .W>
<RFALSE>)>
<REPEAT ()
<COND (<FSET? .W ,WEAPONBIT> <RETURN .W>)
(<NOT <SET W <NEXT? .W>>> <RETURN <>>)>>>
\
<ROUTINE VILLAIN-BLOW (OO OUT?
"AUX" (VILLAIN <GET .OO ,V-VILLAIN>)
(REMARKS <GET .OO ,V-MSGS>)
DWEAPON ATT DEF OA OD TBL RES NWEAPON)
<FCLEAR ,WINNER ,STAGGERED>
<COND (<FSET? .VILLAIN ,STAGGERED>
<TELL "The " D .VILLAIN
" slowly regains his feet." CR>
<FCLEAR .VILLAIN ,STAGGERED>
<RTRUE>)>
<SET OA <SET ATT <VILLAIN-STRENGTH .OO>>>
<COND (<NOT <G? <SET DEF <FIGHT-STRENGTH>> 0>> <RTRUE>)>
<SET OD <FIGHT-STRENGTH <>>>
<SET DWEAPON <FIND-WEAPON ,WINNER>>
<COND (<L? .DEF 0> <SET RES ,KILLED>)
(ELSE
<COND (<1? .DEF>
<COND (<G? .ATT 2> <SET ATT 3>)>
<SET TBL <GET ,DEF1-RES <- .ATT 1>>>)
(<==? .DEF 2>
<COND (<G? .ATT 3> <SET ATT 4>)>
<SET TBL <GET ,DEF2-RES <- .ATT 1>>>)
(<G? .DEF 2>
<SET ATT <- .ATT .DEF>>
<COND (<L? .ATT -1> <SET ATT -2>)
(<G? .ATT 1> <SET ATT 2>)>
<SET TBL <GET ,DEF3-RES <+ .ATT 2>>>)>
<SET RES <GET .TBL <- <RANDOM 9> 1>>>
<REMARK
<PICK-ONE <GET .REMARKS <- .RES 1>>>
,WINNER
.DWEAPON>)>
<COND (<OR <==? .RES ,MISSED> <==? .RES ,HESITATE>>)
(<OR <==? .RES ,KILLED> <==? .RES ,SITTING-DUCK>> <SET DEF 0>)
(<==? .RES ,LIGHT-WOUND>
<SET DEF <- .DEF 1>>
<COND (<L? .DEF 0> <SET DEF 0>)>
<COND (<G? ,LOAD-ALLOWED 50>
<SETG LOAD-ALLOWED <- ,LOAD-ALLOWED 10>>)>)
(<==? .RES ,SERIOUS-WOUND>
<SET DEF <- .DEF 2>>
<COND (<L? .DEF 0> <SET DEF 0>)>
<COND (<G? ,LOAD-ALLOWED 50>
<SETG LOAD-ALLOWED <- ,LOAD-ALLOWED 20>>)>)
(<==? .RES ,STAGGER> <FSET ,WINNER ,STAGGERED>)>
<WINNER-RESULT .DEF .RES .OD>>
<ROUTINE HERO-BLOW ("AUX" OO VILLAIN DWEAPON ATT DEF (CNT 0)
OA OD TBL RES NWEAPON (LEN <GET ,VILLAINS 0>))
#DECL ((VILLAIN) OBJECT (NWEAPON) <OR OBJECT FALSE>
(RES OA OD ATT DEF FIX) FIX (HERO?) <OR ATOM FALSE>)
<REPEAT ()
<SET CNT <+ .CNT 1>>
<COND (<==? .CNT .LEN> <RETURN>)>
<SET OO <GET ,VILLAINS .CNT>>
<COND (<==? <GET .OO ,V-VILLAIN> ,PRSO>
<RETURN>)>>
<FSET ,PRSO ,FIGHTBIT>
<COND (<FSET? ,WINNER ,STAGGERED>
<TELL
"You are still recovering from that last blow, so your attack is
ineffective." CR>
<FCLEAR ,WINNER ,STAGGERED>
<RTRUE>)>
<SET ATT <FIGHT-STRENGTH>>
<COND (<L? .ATT 1> <SET ATT 1>)>
<SET OA .ATT>
<SET VILLAIN <GET .OO ,V-VILLAIN>>
<COND (<0? <SET OD <SET DEF <VILLAIN-STRENGTH .OO>>>>
<COND (<==? ,PRSO ,WINNER>
<RETURN <JIGS-UP
"Well, you really did it that time. Is suicide painless?">>)>
<TELL "Attacking the " D .VILLAIN " is pointless." CR>
<RTRUE>)>
<SET DWEAPON <FIND-WEAPON .VILLAIN>>
<COND (<1? .DEF>
<COND (<G? .ATT 2> <SET ATT 3>)>
<SET TBL <GET ,DEF1-RES <- .ATT 1>>>)
(<==? .DEF 2>
<COND (<G? .ATT 3> <SET ATT 4>)>
<SET TBL <GET ,DEF2-RES <- .ATT 1>>>)
(<G? .DEF 2>
<SET ATT <- .ATT .DEF>>
<COND (<L? .ATT -1> <SET ATT -2>)
(<G? .ATT 1> <SET ATT 2>)>
<SET TBL <GET ,DEF3-RES <+ .ATT 2>>>)>
<SET RES <GET .TBL <- <RANDOM 9> 1>>>
<COND (<==? .RES 2> <SET RES 1>)>
<REMARK
<PICK-ONE <GET ,HERO-MELEE <- .RES 1>>>
,PRSO
,PRSI>
<COND (<EQUAL? .RES ,MISSED ,HESITATE>)
(<EQUAL? .RES ,KILLED ,SITTING-DUCK> <SET DEF 0>)
(<==? .RES ,LIGHT-WOUND>
<SET DEF <- .DEF 1>>
<COND (<L? .DEF 0> <SET DEF 0>)>)
(<==? .RES ,SERIOUS-WOUND>
<SET DEF <- .DEF 2>>
<COND (<L? .DEF 0> <SET DEF 0>)>)
(<==? .RES ,STAGGER> <FSET ,PRSO ,STAGGERED>)>
<VILLAIN-RESULT ,PRSO .DEF .RES>>
\
<ROUTINE WINNER-RESULT (DEF RES OD)
<PUTP ,WINNER
,P?STRENGTH
<COND (<0? .DEF> -10000)(ELSE <- .DEF .OD>)>>
<COND (<L? <- .DEF .OD> 0>
<ENABLE <QUEUE I-CURE ,CURE-WAIT>>)>
<COND (<NOT <G? <FIGHT-STRENGTH> 0>>
<PUTP ,WINNER ,P?STRENGTH <+ 1 <- <FIGHT-STRENGTH <>>>>>
<JIGS-UP
"It appears that that last blow was too much for you. I'm afraid you
are dead.">
<>)
(ELSE .RES)>>
<ROUTINE VILLAIN-RESULT (VILLAIN DEF RES)
<PUTP .VILLAIN ,P?STRENGTH .DEF>
<COND (<0? .DEF>
<FCLEAR .VILLAIN ,FIGHTBIT>
<TELL
"Almost as soon as the " D .VILLAIN " breathes his last breath, a cloud
of sinister black fog envelops him, and when the fog lifts, his carcass
and weapon have disappeared." CR>
<REMOVE .VILLAIN>
<APPLY <GETP .VILLAIN ,P?ACTION> ,F-DEAD>
.RES)
(ELSE .RES)>>
\
<ROUTINE WINNING? (V "AUX" VS PS)
#DECL ((V) OBJECT (VS PS) FIX)
<SET VS <GETP .V ,P?STRENGTH>>
<SET PS <- .VS <FIGHT-STRENGTH>>>
<COND (<G? .PS 3> <PROB 90>)
(<G? .PS 0> <PROB 75>)
(<0? .PS> <PROB 50>)
(<G? .VS 1> <PROB 25>)
(ELSE <PROB 10>)>>
<ROUTINE I-CURE ("AUX" (S <GETP ,WINNER ,P?STRENGTH>))
#DECL ((S) FIX)
<COND (<G? .S 0> <SET S 0> <PUTP ,WINNER ,P?STRENGTH .S>)
(<L? .S 0> <SET S <+ .S 1>> <PUTP ,WINNER ,P?STRENGTH .S>)>
<COND (<L? .S 0>
<COND (<L? ,LOAD-ALLOWED ,LOAD-MAX>
<SETG LOAD-ALLOWED <+ ,LOAD-ALLOWED 10>>)>
<ENABLE <QUEUE I-CURE ,CURE-WAIT>>)
(ELSE
<SETG LOAD-ALLOWED ,LOAD-MAX>
<DISABLE <INT I-CURE>>)>>
<ROUTINE V-DIAGNOSE ("AUX" (MS <FIGHT-STRENGTH <>>)
(WD <GETP ,WINNER ,P?STRENGTH>) (RS <+ .MS .WD>))
#DECL ((MS WD RS) FIX)
<COND (<0? <GET <INT I-CURE> ,C-ENABLED?>> <SET WD 0>)
(ELSE <SET WD <- .WD>>)>
<COND (<0? .WD> <TELL "You are in perfect health.">)
(T
<TELL "You have wounds which will be cured in ">
<PRINTN
<+ <* ,CURE-WAIT <- .WD 1>>
<GET <INT I-CURE> ,C-TICK>>>
<TELL " moves." CR>)>
<CRLF>
<COND (<0? .RS> <TELL "You are at death's door.">)
(<1? .RS> <TELL "You can be killed by one more wound.">)
(<==? .RS 2> <TELL "You can be killed by a serious wound.">)
(<==? .RS 3> <TELL "You can survive one serious wound.">)
(<G? .RS 3> <TELL "You are still strong.">)>
<CRLF>>

749
parser.zil Normal file
View File

@ -0,0 +1,749 @@
"Z-parser (ZIL)"
;"Parser global variable convention: All parser globals will
begin with 'P-'. Local variables are not restricted in any
way.
"
<SETG SIBREAKS ".,">
<GLOBAL ALWAYS-LIT <>>
<GLOBAL GWIM-DISABLE <>>
<GLOBAL PRSA 0>
<GLOBAL PRSI 0>
<GLOBAL PRSO 0>
<GLOBAL P-TABLE 0>
<GLOBAL P-ONEOBJ 0>
<GLOBAL P-SYNTAX 0>
<GLOBAL P-CCSRC 0>
<GLOBAL P-LEN 0>
<GLOBAL P-DIR 0>
<GLOBAL HERE 0>
<GLOBAL WINNER 0>
<GLOBAL P-LEXV <ITABLE BYTE 60>>
;"INBUF - Input buffer for READ"
<GLOBAL P-INBUF <ITABLE BYTE 60>>
;"Parse-cont variable"
<GLOBAL P-CONT <>>
<GLOBAL P-IT-OBJECT <>>
<GLOBAL P-IT-LOC <>>
;"Parser variables and temporaries"
<CONSTANT P-PHRLEN 3>
<CONSTANT P-ORPHLEN 7>
<CONSTANT P-RTLEN 3>
;"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 4>
;"Offset to first part of speech"
<CONSTANT P-P1OFF 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-VTBL <TABLE 0 0 0 0>>
<GLOBAL P-NCN 0>
<CONSTANT P-VERB 0>
<CONSTANT P-VERBN 1>
<CONSTANT P-PREP1 2>
<CONSTANT P-PREP1N 3>
<CONSTANT P-PREP2 4>
<CONSTANT P-PREP2N 5>
<CONSTANT P-NC1 6>
<CONSTANT P-NC1L 7>
<CONSTANT P-NC2 8>
<CONSTANT P-NC2L 9>
" Grovel down the input finding the verb, prepositions, and noun clauses.
If the input is <direction> or <walk> <direction>, fall out immediately
setting PRSA to ,V?WALK and PRSO to <direction>. Otherwise, perform
all required orphaning, syntax checking, and noun clause lookup."
<ROUTINE PARSER ("AUX" (PTR ,P-LEXSTART) WORD (VAL 0) (VERB <>)
LEN (DIR <>) (NW 0) NUM)
<CLEAR-ITBL>
<PUT ,P-PRSO ,P-MATCHLEN 0>
<PUT ,P-PRSI ,P-MATCHLEN 0>
<PUT ,P-BUTS ,P-MATCHLEN 0>
<COND (,P-CONT
<SET PTR ,P-CONT>
<SETG P-CONT <>>
<COND (<NOT ,SUPER-BRIEF> <CRLF>)>)
(T
<COND (<NOT ,SUPER-BRIEF> <CRLF>)>
<TELL ">">
<READ ,P-INBUF ,P-LEXV>)>
<SETG P-LEN <GETB ,P-LEXV ,P-LEXWORDS>>
<COND (<0? ,P-LEN> <TELL "Beg pardon?" CR> <RFALSE>)>
<SET LEN ,P-LEN>
<SETG P-DIR <>>
<SETG P-NCN 0>
<SETG P-GETFLAGS 0>
<REPEAT ()
<COND (<L? <SETG P-LEN <- ,P-LEN 1>> 0> <RETURN>)
(<SET WORD <GET ,P-LEXV .PTR>>
<COND (<EQUAL? .WORD ,W?THEN ,W?.>
<OR <0? ,P-LEN>
<SETG P-CONT <+ .PTR ,P-LEXELEN>>>
<PUTB ,P-LEXV ,P-LEXWORDS ,P-LEN>
<RETURN>)
(<AND <SET VAL
<WT? .WORD
,PS?DIRECTION
,P1?DIRECTION>>
<OR <==? .LEN 1>
<AND <==? .LEN 2> <==? .VERB ,ACT?WALK>>
<EQUAL? <SET NW
<GET ,P-LEXV
<+ .PTR ,P-LEXELEN>>>
,W?THEN
,W?.>
<EQUAL? .NW ,W?COMMA ,W?AND>>>
<SET DIR .VAL>
<COND (<EQUAL? .NW ,W?COMMA ,W?AND>
<PUT ,P-LEXV
<+ .PTR ,P-LEXELEN>
,W?THEN>)>
<COND (<NOT <G? .LEN 2>> <RETURN>)>)
(<AND <SET VAL <WT? .WORD ,PS?VERB ,P1?VERB>>
<NOT .VERB>>
<SET VERB .VAL>
<PUT ,P-ITBL ,P-VERB .VAL>
<PUT ,P-ITBL ,P-VERBN ,P-VTBL>
<PUT ,P-VTBL 0 .WORD>
<PUTB ,P-VTBL 2 <GETB ,P-LEXV
<SET NUM
<+ <* .PTR 2> 2>>>>
<PUTB ,P-VTBL 3 <GETB ,P-LEXV <+ .NUM 1>>>)
(<OR <SET VAL <WT? .WORD ,PS?PREPOSITION 0>>
<AND <OR <EQUAL? .WORD ,W?ALL ,W?ONE ,W?A>
<WT? .WORD ,PS?ADJECTIVE>
<WT? .WORD ,PS?OBJECT>>
<SET VAL 0>>>
<COND (<AND <G? ,P-LEN 0>
<==? <GET ,P-LEXV
<+ .PTR ,P-LEXELEN>>
,W?OF>
<0? .VAL>
<NOT
<EQUAL? .WORD ,W?ALL ,W?ONE ,W?A>>>)
(<AND <NOT <0? .VAL>>
<OR <0? ,P-LEN>
<EQUAL? <GET ,P-LEXV <+ .PTR 2>>
,W?THEN ,W?.>>>
<COND (<L? ,P-NCN 2>
<PUT ,P-ITBL ,P-PREP1 .VAL>
<PUT ,P-ITBL ,P-PREP1N .WORD>)>)
(<==? ,P-NCN 2>
<TELL "Too many noun clauses??" CR>
<RFALSE>)
(T
<SETG P-NCN <+ ,P-NCN 1>>
<OR <SET PTR <CLAUSE .PTR .VAL .WORD>>
<RFALSE>>
<AND <L? .PTR 0> <RETURN>>)>)
(<WT? .WORD ,PS?BUZZ-WORD>)
(T
<TELL "I can't use the word '">
<PRINTB .WORD>
<TELL "' here." CR>
<RFALSE>)>)
(T <UNKNOWN-WORD .PTR> <RFALSE>)>
<SET PTR <+ .PTR ,P-LEXELEN>>>
<COND (.DIR <SETG PRSA ,V?WALK> <SETG PRSO .DIR> <RETURN T>)>
<COND (<AND <SYNTAX-CHECK> <SNARF-OBJECTS> <TAKE-CHECK> <MANY-CHECK>>
T)>>
;"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" (OFFSET ,P-P1OFF) TYP)
<COND (<BTST <SET TYP <GETB .PTR ,P-PSOFF>> .BIT>
<COND (<G? .B1 4> <RTRUE>)
(T
<SET TYP <BAND .TYP ,P-P1BITS>>
<COND (<NOT <==? .TYP .B1>> <SET OFFSET <+ .OFFSET 1>>)>
<GETB .PTR .OFFSET>)>)>>
;" Scan through a noun clause, leave a pointer to its starting location"
<ROUTINE CLAUSE (PTR VAL WORD "AUX" OFF NUM (ANDFLG <>) (FIRST?? <>) NW)
#DECL ((PTR VAL OFF NUM) FIX (WORD NW) <OR FALSE FIX TABLE>
(ANDFLG FIRST??) <OR ATOM FALSE>)
<SET OFF <* <- ,P-NCN 1> 2>>
<COND (<NOT <==? .VAL 0>>
<PUT ,P-ITBL <SET NUM <+ ,P-PREP1 .OFF>> .VAL>
<PUT ,P-ITBL <+ .NUM 1> .WORD>
<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>>>
<REPEAT ()
<COND (<L? <SETG P-LEN <- ,P-LEN 1>> 0>
<PUT ,P-ITBL <+ .NUM 1> <REST ,P-LEXV <* .PTR 2>>>
<RETURN -1>)>
<COND (<SET WORD <GET ,P-LEXV .PTR>>
<COND (<0? ,P-LEN> <SET NW 0>)
(T <SET NW <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>)>
<COND (<EQUAL? .WORD ,W?AND ,W?COMMA> <SET ANDFLG T>)
(<EQUAL? .WORD ,W?ALL ,W?ONE>
<COND (<==? .NW ,W?OF>
<SETG P-LEN <- ,P-LEN 1>>
<SET PTR <+ .PTR ,P-LEXELEN>>)>)
(<OR <EQUAL? .WORD ,W?THEN ,W?.>
<AND <WT? .WORD ,PS?PREPOSITION>
<NOT .FIRST??>>>
<SETG P-LEN <+ ,P-LEN 1>>
<PUT ,P-ITBL
<+ .NUM 1>
<REST ,P-LEXV <* .PTR 2>>>
<RETURN <- .PTR ,P-LEXELEN>>)
(<WT? .WORD ,PS?OBJECT>
<COND (<AND <WT? .WORD
,PS?ADJECTIVE
,P1?ADJECTIVE>
<NOT <==? .NW 0>>
<WT? .NW ,PS?OBJECT>>)
(<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 <>>)>)
(<OR <WT? .WORD ,PS?ADJECTIVE>
<WT? .WORD ,PS?BUZZ-WORD>>)
(<AND .ANDFLG
<OR <WT? .WORD ,PS?DIRECTION>
<WT? .WORD ,PS?VERB>>>
<SET PTR <- .PTR 4>>
<PUT ,P-LEXV <+ .PTR 2> ,W?THEN>
<SETG P-LEN <+ ,P-LEN 2>>)
(T
<TELL "I can't use the word '">
<PRINTB .WORD>
<TELL "' here." CR>
<RFALSE>)>)
(T <UNKNOWN-WORD .PTR> <RFALSE>)>
<SET FIRST?? <>>
<SET PTR <+ .PTR ,P-LEXELEN>>>>
;"Print undefined word in input.
PTR points to the unknown word in P-LEXV"
<ROUTINE WORD-PRINT (CNT BUF)
<REPEAT ()
<COND (<DLESS? CNT 0> <RETURN>)
(ELSE
<PRINTC <GETB ,P-INBUF .BUF>>
<SET BUF <+ .BUF 1>>)>>>
<ROUTINE UNKNOWN-WORD (PTR "AUX" BUF)
#DECL ((PTR BUF) FIX)
<TELL "I don't know the word '">
<WORD-PRINT <GETB <REST ,P-LEXV <SET BUF <* .PTR 2>>> 2>
<GETB <REST ,P-LEXV .BUF> 3>>
<TELL "'." CR>>
;"Clear out the input table (prior to GROVELing through the input)"
<ROUTINE CLEAR-ITBL ("AUX" (CNT -1))
<REPEAT ()
<COND (<IGRTR? CNT ,P-ITBLLEN> <RETURN>)
(T <PUT ,P-ITBL .CNT 0>)>>>
;" 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 TMP)
#DECL ((DRIVE1 DRIVE2) <OR FALSE <PRIMTYPE VECTOR>>
(SYN) <PRIMTYPE VECTOR> (LEN NUM VERB PREP) FIX
(OBJ) <OR FALSE OBJECT>)
<COND (<0? <SET VERB <GET ,P-ITBL ,P-VERB>>>
<TELL "You must supply a verb!" CR>
<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 (<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 .DRIVE1 .DRIVE2> <RETURN>)
(T
<TELL "I don't understand that sentence." CR>
<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 ,P-PRSO ,P-MATCHLEN 1>
<PUT ,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 ,P-PRSI ,P-MATCHLEN 1>
<PUT ,P-PRSI 1 .OBJ>
<SYNTAX-FOUND .DRIVE2>)
(T
<TELL "You must supply a noun!" CR>
<RFALSE>)>>
<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)
#DECL ((GBIT LBIT) FIX (OBJ) OBJECT)
<COND (<==? .GBIT ,RWATERBIT>
<RETURN ,ROOMS>)>
<SETG P-GWIMBIT .GBIT>
<SETG P-SLOCBITS .LBIT>
<PUT ,P-MERGE ,P-MATCHLEN 0>
<COND (<GET-OBJECT ,P-MERGE <>>
<SETG P-GWIMBIT 0>
<COND (<==? <GET ,P-MERGE ,P-MATCHLEN> 1>
<SET OBJ <GET ,P-MERGE 1>>
<TELL "(">
<COND (<NOT <0? .PREP>>
<PRINTB <PREP-FIND .PREP>>
<COND (<==? .OBJ ,HANDS>
<TELL " your hands)" CR>)
(T
<TELL " the ">)>)>
<COND (<NOT <==? .OBJ ,HANDS>>
<TELL D .OBJ ")" CR>)>
.OBJ)>)
(T <SETG P-GWIMBIT 0> <RFALSE>)>>
<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 SNARF-OBJECTS ("AUX" PTR)
#DECL ((PTR) <OR FIX <PRIMTYPE VECTOR>>)
<COND (<NOT <==? <SET PTR <GET ,P-ITBL ,P-NC1>> 0>>
<SETG P-SLOCBITS <GETB ,P-SYNTAX ,P-SLOC1>>
<OR <SNARFEM .PTR <GET ,P-ITBL ,P-NC1L> ,P-PRSO> <RFALSE>>
<OR <0? <GET ,P-BUTS ,P-MATCHLEN>>
<SETG P-PRSO <BUT-MERGE ,P-PRSO>>>)>
<COND (<NOT <==? <SET PTR <GET ,P-ITBL ,P-NC2>> 0>>
<SETG P-SLOCBITS <GETB ,P-SYNTAX ,P-SLOC2>>
<OR <SNARFEM .PTR <GET ,P-ITBL ,P-NC2L> ,P-PRSI> <RFALSE>>
<COND (<NOT <0? <GET ,P-BUTS ,P-MATCHLEN>>>
<COND (<==? <GET ,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)
#DECL ((TBL NTBL) TABLE (LEN BUTLEN MATCHES) FIX (OBJ) OBJECT)
<SET LEN <GET .TBL ,P-MATCHLEN>>
<PUT ,P-MERGE ,P-MATCHLEN 0>
<REPEAT ()
<COND (<DLESS? LEN 0> <RETURN>)
(<ZMEMQ <SET OBJ <GET .TBL .CNT>> ,P-BUTS>)
(T
<PUT ,P-MERGE <+ .MATCHES 1> .OBJ>
<SET MATCHES <+ .MATCHES 1>>)>
<SET CNT <+ .CNT 1>>>
<PUT ,P-MERGE ,P-MATCHLEN .MATCHES>
<SET NTBL ,P-MERGE>
<SETG P-MERGE .TBL>
.NTBL>
<GLOBAL P-NAM <>>
<GLOBAL P-ADJ <>>
<GLOBAL P-ADJN <>>
<GLOBAL P-PRSO <ITABLE NONE 20>>
<GLOBAL P-PRSI <ITABLE NONE 20>>
<GLOBAL P-BUTS <ITABLE NONE 50>>
<GLOBAL P-MERGE <ITABLE NONE 50>>
<GLOBAL P-MATCHLEN 0>
<GLOBAL P-GETFLAGS 0>
<CONSTANT P-ALL 1>
<CONSTANT P-ONE 2>
<CONSTANT P-INHIBIT 4>
<ROUTINE SNARFEM (PTR EPTR TBL "AUX" (AND <>) (BUT <>) LEN WV WORD NW)
#DECL ((TBL) TABLE (PTR EPTR) <PRIMTYPE VECTOR> (AND) <OR ATOM FALSE>
(BUT) <OR FALSE TABLE> (WV) <OR FALSE FIX>)
<SETG P-GETFLAGS 0>
<PUT ,P-BUTS ,P-MATCHLEN 0>
<PUT .TBL ,P-MATCHLEN 0>
<SET WORD <GET .PTR 0>>
<REPEAT ()
<COND (<==? .PTR .EPTR> <RETURN <GET-OBJECT <OR .BUT .TBL>>>)
(T
<SET NW <GET .PTR ,P-LEXELEN>>
<COND (<==? .WORD ,W?ALL>
<SETG P-GETFLAGS ,P-ALL>
<COND (<==? .NW ,W?OF>
<SET PTR <REST .PTR ,P-WORDLEN>>)>)
(<EQUAL? .WORD ,W?BUT ,W?EXCEPT>
<OR <GET-OBJECT <OR .BUT .TBL>> <RFALSE>>
<SET BUT ,P-BUTS>
<PUT .BUT ,P-MATCHLEN 0>)
(<EQUAL? .WORD ,W?A ,W?ONE>
<COND (<NOT ,P-ADJ>
<SETG P-GETFLAGS ,P-ONE>
<COND (<==? .NW ,W?OF>
<SET PTR <REST .PTR ,P-WORDLEN>>)>)
(T
<SETG P-NAM ,P-ONEOBJ>
<OR <GET-OBJECT <OR .BUT .TBL>> <RFALSE>>
<AND <0? .NW> <RTRUE>>)>)
(<AND <EQUAL? .WORD ,W?AND ,W?COMMA>
<NOT <EQUAL? .NW ,W?AND ,W?COMMA>>>
<OR <GET-OBJECT <OR .BUT .TBL>> <RFALSE>>
T)
(<WT? .WORD ,PS?BUZZ-WORD>)
(<EQUAL? .WORD ,W?AND ,W?COMMA>)
(<==? .WORD ,W?OF>
<COND (<0? ,P-GETFLAGS>
<SETG P-GETFLAGS ,P-INHIBIT>)>)
(<SET WV <WT? .WORD ,PS?ADJECTIVE ,P1?ADJECTIVE>>
<SETG P-ADJ .WV>
<SETG P-ADJN .WORD>)
(<WT? .WORD ,PS?OBJECT ,P1?OBJECT>
<SETG P-NAM .WORD>
<SETG P-ONEOBJ .WORD>)>)>
<COND (<NOT <==? .PTR .EPTR>>
<SET PTR <REST .PTR ,P-WORDLEN>>
<SET WORD .NW>)>>>
<CONSTANT SH 128>
<CONSTANT SC 64>
<CONSTANT SIR 32>
<CONSTANT SOG 16>
<CONSTANT STAKE 8>
<CONSTANT SMANY 4>
<CONSTANT SHAVE 2>
<ROUTINE GET-OBJECT (TBL
"OPTIONAL" (VRB T)
"AUX" BITS LEN XBITS TLEN (GCHECK <>))
#DECL ((TBL) TABLE (XBITS BITS TLEN LEN) FIX (GWIM) <OR FALSE FIX>
(VRB GCHECK) <OR ATOM FALSE>)
<SET XBITS ,P-SLOCBITS>
<SET TLEN <GET .TBL ,P-MATCHLEN>>
<COND (<BTST ,P-GETFLAGS ,P-INHIBIT> <RTRUE>)>
<COND (<AND <NOT ,P-NAM> ,P-ADJ <WT? ,P-ADJN ,PS?OBJECT ,P1?OBJECT>>
<SETG P-NAM ,P-ADJN>
<SETG P-ADJ <>>)>
<COND (<AND <NOT ,P-NAM>
<NOT ,P-ADJ>
<NOT <==? ,P-GETFLAGS ,P-ALL>>
<0? ,P-GWIMBIT>>
<COND (.VRB
<TELL "There is a noun missing." CR>)>
<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 (,LIT <DO-SL ,HERE ,SOG ,SIR>)>
<DO-SL ,WINNER ,SH ,SC>)>
<SET LEN <- <GET .TBL ,P-MATCHLEN> .TLEN>>
<COND (<BTST ,P-GETFLAGS ,P-ALL>)
(<OR <G? .LEN 1>
<AND <0? .LEN> <NOT <==? ,P-SLOCBITS -1>>>>
<COND (<==? ,P-SLOCBITS -1>
<SETG P-SLOCBITS .XBITS>
<PUT .TBL
,P-MATCHLEN
<- <GET .TBL ,P-MATCHLEN> .LEN>>
<AGAIN>)
(T
<COND (.VRB
<TELL "Specify which ">
<PRINTB ,P-NAM>
<TELL " you mean." CR>)>
<SETG P-NAM <>>
<SETG P-ADJ <>>
<RFALSE>)>)
(<AND <0? .LEN> .GCHECK>
<COND (.VRB
<COND (,LIT
<TELL "I can't see any">
<COND (,P-ADJ <TELL " "> <PRINTB ,P-ADJN>)>
<COND (,P-NAM <TELL " "> <PRINTB ,P-NAM>)>
<TELL " here." CR>)
(T
<TELL "It's too dark to see." CR>)>)>
<SETG P-NAM <>>
<SETG P-ADJ <>>
<RFALSE>)
(<0? .LEN> <SET GCHECK T> <AGAIN>)>
<SETG P-ADJ <>>
<SETG P-NAM <>>
<SETG P-SLOCBITS .XBITS>
<RTRUE>>>
<ROUTINE GLOBAL-CHECK (TBL "AUX" RMG RMGL (CNT 0) OBJ OBITS FOO)
#DECL ((TBL) TABLE (RMG) <OR FALSE TABLE> (RMGL CNT) FIX (OBJ) OBJECT)
<SET OBITS ,P-SLOCBITS>
<COND (<SET RMG <GETPT ,HERE ,P?GLOBAL>>
<SET RMGL <- <PTSIZE .RMG> 1>>
<REPEAT ()
<COND (<THIS-IT? <SET OBJ <GETB .RMG .CNT>> .TBL>
<OBJ-FOUND .OBJ .TBL>)>
<COND (<IGRTR? CNT .RMGL> <RETURN>)>>)>
<COND (<SET RMG <GETPT ,HERE ,P?PSEUDO>>
<SET RMGL <- </ <PTSIZE .RMG> 4> 1>>
<SET CNT 0>
<REPEAT ()
<COND (<==? ,P-NAM <GET .RMG <* .CNT 2>>>
<PUTP ,PSEUDO-OBJECT
,P?ACTION
<GET .RMG <+ <* .CNT 2> 1>>>
<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>)
(<IGRTR? CNT .RMGL> <RETURN>)>>)>
<COND (<0? <GET .TBL ,P-MATCHLEN>>
<SETG P-SLOCBITS -1>
<SETG P-TABLE .TBL>
<DO-SL ,GLOBAL-OBJECTS 1 1>
<SETG P-SLOCBITS .OBITS>)>>
<ROUTINE DO-SL (OBJ BIT1 BIT2 "AUX" BITS)
#DECL ((OBJ) OBJECT (BIT1 BIT2 BITS) FIX)
<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>)>)>>
<CONSTANT P-SRCBOT 2>
<CONSTANT P-SRCTOP 0>
<CONSTANT P-SRCALL 1>
<ROUTINE SEARCH-LIST (OBJ TBL LVL "AUX" FLS NOBJ)
#DECL ((OBJ NOBJ) <OR FALSE OBJECT> (TBL) TABLE (LVL) FIX (FLS) ANY)
<COND (<SET OBJ <FIRST? .OBJ>>
<REPEAT ()
<COND (<AND <NOT <==? .LVL ,P-SRCBOT>>
<THIS-IT? .OBJ .TBL>>
<OBJ-FOUND .OBJ .TBL>)>
<COND (<AND <OR <NOT <==? .LVL ,P-SRCTOP>>
<FSET? .OBJ ,SURFACEBIT>>
<SET NOBJ <FIRST? .OBJ>>
<OR <FSET? .OBJ ,OPENBIT>
<FSET? .OBJ ,TRANSBIT>>>
<SET FLS
<SEARCH-LIST .OBJ
.TBL
<COND (<FSET? .OBJ ,SURFACEBIT>
,P-SRCALL)
(T ,P-SRCTOP)>>>)>
<COND (<SET OBJ <NEXT? .OBJ>>) (T <RETURN>)>>)>>
<ROUTINE OBJ-FOUND (OBJ TBL "AUX" PTR)
#DECL ((OBJ) OBJECT (TBL) TABLE (PTR) FIX)
<SET PTR <GET .TBL ,P-MATCHLEN>>
<PUT .TBL <+ .PTR 1> .OBJ>
<PUT .TBL ,P-MATCHLEN <+ .PTR 1>>>
<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)
#DECL ((TBL) TABLE (BITS PTR) FIX (OBJ) OBJECT
(TAKEN) <OR FALSE FIX ATOM>)
<COND (<AND <SET PTR <GET .TBL ,P-MATCHLEN>> <BTST .BITS ,STAKE>>
<REPEAT ()
<COND (<L? <SET PTR <- .PTR 1>> 0> <RETURN>)
(T
<SET OBJ <GET .TBL <+ .PTR 1>>>
<COND (<==? .OBJ ,IT> <SET OBJ ,P-IT-OBJECT>)>
<COND (<NOT <IN? .OBJ ,WINNER>>
<SETG PRSO .OBJ>
<COND (<FSET? .OBJ ,TRYTAKEBIT>
<SET TAKEN T>)
(<==? <ITAKE <>> T>
<SET TAKEN <>>)
(T <SET TAKEN T>)>
<COND (<AND .TAKEN <BTST .BITS ,SHAVE>>
<TELL "You don't have the ">
<PRINTD .OBJ>
<TELL "." CR>
<RFALSE>)
(<NOT .TAKEN>
<TELL "(Taken)" CR>)>)>)>>)
(T)>>
<ROUTINE MANY-CHECK ("AUX" (LOSS <>) TMP)
#DECL ((LOSS) <OR FALSE FIX>)
<COND (<AND <G? <GET ,P-PRSO ,P-MATCHLEN> 1>
<NOT <BTST <GETB ,P-SYNTAX ,P-SLOC1> ,SMANY>>>
<SET LOSS 1>)
(<AND <G? <GET ,P-PRSI ,P-MATCHLEN> 1>
<NOT <BTST <GETB ,P-SYNTAX ,P-SLOC2> ,SMANY>>>
<SET LOSS 2>)>
<COND (.LOSS
<TELL "You can't use multiple objects with '">
<SET TMP <GET ,P-ITBL ,P-VERBN>>
<COND (,P-OFLAG
<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>>)>
<REPEAT ()
<COND (<==? .ITM <GET .TBL .CNT>> <RTRUE>)
(<IGRTR? CNT .SIZE> <RFALSE>)>>>
<ROUTINE ZMEMQB (ITM TBL SIZE "AUX" (CNT 0))
#DECL ((ITM) ANY (TBL) TABLE (SIZE CNT) FIX)
<REPEAT ()
<COND (<==? .ITM <GETB .TBL .CNT>> <RTRUE>)
(<IGRTR? CNT .SIZE> <RFALSE>)>>>
<SETG ALWAYS-LIT <>>
<ROUTINE LIT? (RM "AUX" OHERE (LIT <>))
#DECL ((RM OHERE) OBJECT (LIT) <OR ATOM FALSE>)
<SETG P-GWIMBIT ,ONBIT>
<SET OHERE ,HERE>
<SETG HERE .RM>
<COND (<OR <FSET? .RM ,ONBIT> ,ALWAYS-LIT> <SET LIT T>)
(T
<PUT ,P-MERGE ,P-MATCHLEN 0>
<SETG P-TABLE ,P-MERGE>
<SETG P-SLOCBITS -1>
<COND (<==? .OHERE .RM> <DO-SL ,WINNER 1 1>)>
<DO-SL .RM 1 1>
<COND (<G? <GET ,P-TABLE ,P-MATCHLEN> 0> <SET LIT T>)>)>
<SETG HERE .OHERE>
<SETG P-GWIMBIT 0>
.LIT>

467
syntax.zil Normal file
View File

@ -0,0 +1,467 @@
"SUBTITLE VOCABULARY"
<BUZZ A THE IS AND OF THEN ALL ONE BUT EXCEPT \. \, YES NO Y>
<SYNONYM WITH USING THROUGH>
<SYNONYM IN INSIDE INTO>
<SYNONYM NORTH N>
<SYNONYM SOUTH S>
<SYNONYM EAST E>
<SYNONYM WEST W>
<SYNONYM DOWN D>
<SYNONYM UP U>
<SYNONYM NW NORTHWEST>
<SYNONYM NE NORTHEAST>
<SYNONYM SW SOUTHWEST>
<SYNONYM SE SOUTHEAST>
\
"ZORK game commands"
<SYNTAX BRIEF = V-BRIEF>
<SYNTAX SUPER = V-SUPER-BRIEF>
<SYNONYM SUPERBRIEF>
<SYNTAX DIAGNOSE = V-DIAGNOSE>
<SYNTAX INVENTORY = V-INVENTORY>
<SYNONYM INVENTORY I>
<SYNTAX QUIT = V-QUIT>
<SYNONYM QUIT Q>
<SYNTAX RESTART = V-RESTART>
<SYNTAX RESTORE = V-RESTORE>
<SYNTAX SAVE = V-SAVE>
<SYNTAX SCORE = V-SCORE>
<SYNTAX VERSION = V-VERSION>
<SYNTAX VERBOSE = V-VERBOSE>
\
"SUBTITLE REAL VERBS"
<SYNTAX AGAIN = V-AGAIN>
<SYNTAX ATTACK
OBJECT (FIND VILLAIN) (ON-GROUND IN-ROOM)
WITH
OBJECT (FIND WEAPONBIT) (HELD CARRIED HAVE)
= V-ATTACK>
<SYNONYM ATTACK FIGHT HIT>
<SYNTAX BOARD OBJECT (FIND VEHBIT) (ON-GROUND IN-ROOM)
= V-BOARD PRE-BOARD>
<SYNTAX BURN
OBJECT (FIND BURNBIT) (HELD CARRIED ON-GROUND IN-ROOM)
WITH
OBJECT (FIND FLAMEBIT) (HELD CARRIED ON-GROUND IN-ROOM HAVE)
= V-BURN PRE-BURN>
<SYNTAX BURN
DOWN
OBJECT (FIND BURNBIT) (HELD CARRIED ON-GROUND IN-ROOM)
WITH
OBJECT (FIND FLAMEBIT) (HELD CARRIED ON-GROUND IN-ROOM HAVE)
= V-BURN PRE-BURN>
<SYNONYM BURN IGNITE>
<SYNTAX CLIMB UP OBJECT (FIND CLIMBBIT) (ON-GROUND IN-ROOM) = V-CLIMB-UP>
<SYNTAX CLIMB DOWN OBJECT (FIND CLIMBBIT) (ON-GROUND IN-ROOM) = V-CLIMB-DOWN>
<SYNTAX CLIMB OBJECT (FIND CLIMBBIT) (ON-GROUND IN-ROOM) = V-CLIMB-FOO>
<SYNTAX CLIMB IN OBJECT (FIND VEHBIT) (ON-GROUND IN-ROOM) = V-BOARD PRE-BOARD>
<SYNTAX CLIMB ON OBJECT (FIND VEHBIT) (ON-GROUND IN-ROOM) = V-CLIMB-ON>
<SYNONYM CLIMB SIT HATCH>
<SYNTAX CLOSE
OBJECT (FIND DOORBIT) (HELD CARRIED ON-GROUND IN-ROOM)
= V-CLOSE>
<SYNTAX COUNT OBJECT = V-COUNT>
<SYNONYM COUNT>
<SYNTAX CROSS OBJECT = V-CROSS>
<SYNONYM CROSS FORD>
<SYNTAX CUT OBJECT WITH OBJECT (FIND WEAPONBIT) (CARRIED HELD) = V-CUT>
<SYNONYM CUT SLICE PIERCE>
<SYNTAX DEFLATE OBJECT = V-DEFLATE>
<SYNTAX DIG
OBJECT (ON-GROUND IN-ROOM)
WITH
OBJECT (FIND TOOLBIT) (HELD CARRIED HAVE) = V-DIG PRE-DIG>
<SYNTAX DIG
IN
OBJECT (ON-GROUND IN-ROOM)
WITH
OBJECT (FIND TOOLBIT) (HELD CARRIED HAVE)
= V-DIG PRE-DIG>
<SYNTAX DISEMBARK OBJECT (FIND VEHBIT) (ON-GROUND IN-ROOM)
= V-DISEMBARK>
<SYNTAX DRINK
OBJECT (FIND DRINKBIT) (HELD CARRIED ON-GROUND IN-ROOM)
= V-DRINK>
<SYNONYM DRINK>
<SYNTAX DROP OBJECT (HELD MANY HAVE) = V-DROP ;*>
<SYNTAX DROP OBJECT (HELD MANY HAVE) DOWN OBJECT = V-PUT PRE-PUT>
<SYNTAX DROP OBJECT (HELD MANY HAVE) IN OBJECT = V-PUT PRE-PUT>
<SYNTAX DROP OBJECT (HELD MANY HAVE) ON OBJECT = V-PUT PRE-PUT>
<SYNONYM DROP POUR>
<SYNTAX EAT
OBJECT (FIND FOODBIT) (HELD CARRIED ON-GROUND IN-ROOM TAKE MANY)
= V-EAT>
<SYNONYM EAT TASTE>
<SYNTAX ENTER = V-ENTER>
<SYNTAX ENTER OBJECT = V-THROUGH>
<SYNTAX EXAMINE OBJECT (HELD CARRIED IN-ROOM ON-GROUND MANY) = V-EXAMINE>
<SYNTAX EXAMINE IN OBJECT (HELD CARRIED IN-ROOM ON-GROUND MANY)
= V-LOOK-INSIDE>
<SYNONYM EXAMINE DESCRIBE WHAT WHATS>
<SYNTAX EXORCISE OBJECT = V-EXORCISE>
<SYNTAX EXORCISE OUT OBJECT (FIND VILLAIN) = V-EXORCISE>
<SYNTAX EXORCISE AWAY OBJECT (FIND VILLAIN) = V-EXORCISE>
<SYNONYM EXORCISE BANISH CAST DRIVE>
<SYNTAX EXTINGUISH
OBJECT (FIND LIGHTBIT) (MANY HELD CARRIED ON-GROUND IN-ROOM TAKE HAVE)
= V-LAMP-OFF>
<SYNONYM EXTINGUISH DOUSE>
<SYNTAX FILL
OBJECT (FIND CONTBIT) (HELD CARRIED ON-GROUND IN-ROOM)
WITH
OBJECT
= V-FILL>
<SYNTAX FILL
OBJECT (FIND CONTBIT) (HELD CARRIED ON-GROUND IN-ROOM)
= V-FILL>
<SYNTAX FIND OBJECT
= V-FIND>
<SYNONYM FIND WHERE SEEK SEE>
<SYNTAX GIVE
OBJECT (MANY HELD CARRIED ON-GROUND IN-ROOM)
TO
OBJECT (FIND VICBIT) (ON-GROUND)
= V-GIVE ;*>
<SYNTAX GIVE
OBJECT (FIND VICBIT) (ON-GROUND)
OBJECT (MANY)
= V-SGIVE>
<SYNONYM GIVE>
<SYNTAX HELLO = V-HELLO ;*>
<SYNTAX HELLO OBJECT = V-HELLO>
<SYNONYM HELLO HI>
<SYNTAX BLOW OUT OBJECT = V-LAMP-OFF>
<SYNTAX BLOW UP
OBJECT
WITH
OBJECT (FIND TOOLBIT) (ON-GROUND IN-ROOM HELD CARRIED)
= V-INFLATE ;*>
<SYNTAX BLOW UP OBJECT = V-BLAST>
<SYNTAX BLOW IN OBJECT = V-BREATHE>
<SYNTAX INFLAT
OBJECT
WITH
OBJECT (FIND TOOLBIT) (ON-GROUND IN-ROOM HELD CARRIED)
= V-INFLATE>
<SYNTAX JUMP = V-LEAP>
<SYNTAX JUMP OVER OBJECT = V-LEAP>
<SYNTAX JUMP ACROSS OBJECT = V-LEAP>
<SYNTAX JUMP IN OBJECT = V-LEAP>
<SYNONYM JUMP LEAP>
<SYNTAX KICK OBJECT = V-KICK>
<SYNONYM KICK BITE>
<SYNTAX KILL
OBJECT (FIND VILLAIN) (ON-GROUND IN-ROOM)
WITH
OBJECT (FIND WEAPONBIT) (HELD CARRIED HAVE)
= V-KILL>
<SYNONYM KILL STAB>
<SYNTAX KNOCK AT OBJECT = V-KNOCK ;*>
<SYNTAX KNOCK ON OBJECT = V-KNOCK>
<SYNTAX KNOCK DOWN OBJECT (FIND VICBIT) (ON-GROUND IN-ROOM) = V-ATTACK>
<SYNONYM KNOCK>
<SYNTAX LAUNCH OBJECT (FIND VEHBIT) = V-LAUNCH>
<SYNTAX LEAVE = V-LEAVE>
<SYNTAX LEAVE OBJECT = V-DROP>
<SYNTAX LIGHT
OBJECT (FIND LIGHTBIT)
(HELD CARRIED ON-GROUND IN-ROOM TAKE HAVE)
= V-LAMP-ON ;*>
<SYNTAX LIGHT
OBJECT (FIND LIGHTBIT) (HELD CARRIED ON-GROUND IN-ROOM)
WITH
OBJECT (FIND FLAMEBIT) (HELD CARRIED TAKE HAVE)
= V-BURN PRE-BURN>
<SYNTAX LISTEN TO OBJECT = V-LISTEN>
<SYNTAX LISTEN FOR OBJECT = V-LISTEN>
<SYNTAX LOOK = V-LOOK>
<SYNTAX LOOK AROUND OBJECT (FIND RWATERBIT) = V-LOOK>
<SYNTAX LOOK UP OBJECT (FIND RWATERBIT) = V-LOOK>
<SYNTAX LOOK DOWN OBJECT (FIND RWATERBIT) = V-LOOK>
<SYNTAX LOOK AT OBJECT (HELD CARRIED ON-GROUND IN-ROOM MANY) = V-EXAMINE>
<SYNTAX LOOK WITH OBJECT = V-LOOK-INSIDE>
<SYNTAX LOOK UNDER OBJECT = V-LOOK-UNDER>
<SYNTAX LOOK BEHIND OBJECT = V-LOOK-BEHIND>
<SYNTAX LOOK IN OBJECT (HELD CARRIED ON-GROUND IN-ROOM MANY) = V-LOOK-INSIDE>
<SYNTAX LOOK AT OBJECT (HELD CARRIED ON-GROUND IN-ROOM MANY) WITH OBJECT = V-READ PRE-READ>
<SYNTAX LOOK FOR OBJECT = V-FIND>
<SYNONYM LOOK L STARE GAZE>
<SYNTAX SEARCH OBJECT = V-SEARCH>
<SYNTAX SEARCH IN OBJECT = V-SEARCH>
<SYNTAX SEARCH FOR OBJECT = V-FIND>
<SYNTAX LOWER OBJECT = V-LOWER>
<SYNTAX MELT
OBJECT
WITH
OBJECT (FIND FLAMEBIT) (HELD CARRIED ON-GROUND IN-ROOM)
= V-MELT>
<SYNONYM MELT>
<SYNTAX MOVE OBJECT (ON-GROUND IN-ROOM) = V-MOVE PRE-MOVE>
<SYNTAX ROLL UP OBJECT (ON-GROUND IN-ROOM) = V-MOVE PRE-MOVE>
<SYNONYM MOVE>
<SYNTAX PULL OBJECT (ON-GROUND IN-ROOM) = V-MOVE PRE-MOVE ; *>
<SYNTAX PULL ON OBJECT (ON-GROUND IN-ROOM) = V-MOVE PRE-MOVE>
<SYNONYM PULL TUG>
<SYNTAX MUMBLE = V-MUMBLE>
<SYNONYM MUMBLE SIGH>
<SYNTAX DESTROY
OBJECT (ON-GROUND IN-ROOM HELD CARRIED)
WITH
OBJECT (HELD CARRIED TAKE)
= V-MUNG PRE-MUNG>
<SYNTAX DESTROY
DOWN
OBJECT (ON-GROUND IN-ROOM HELD CARRIED)
WITH
OBJECT (HELD CARRIED TAKE)
= V-MUNG PRE-MUNG>
<SYNONYM DESTROY BREAK SMASH>
<SYNTAX ODYSSEUS = V-ODYSSEUS>
<SYNONYM ODYSSEUS ULYSSES>
<SYNTAX OPEN
OBJECT (FIND DOORBIT) (HELD CARRIED ON-GROUND IN-ROOM)
= V-OPEN ;*>
<SYNTAX OPEN
UP
OBJECT (FIND DOORBIT) (HELD CARRIED ON-GROUND IN-ROOM)
= V-OPEN ;*>
<SYNTAX OPEN
OBJECT (FIND DOORBIT) (HELD CARRIED ON-GROUND IN-ROOM)
WITH
OBJECT (FIND TOOLBIT) (ON-GROUND IN-ROOM HELD CARRIED HAVE)
= V-OPEN>
<SYNTAX PICK UP
OBJECT (FIND TAKEBIT)
(ON-GROUND MANY)
= V-TAKE PRE-TAKE>
<SYNTAX POKE
OBJECT (FIND VILLAIN) (ON-GROUND IN-ROOM)
WITH
OBJECT (FIND WEAPONBIT) (HELD CARRIED HAVE)
= V-MUNG PRE-MUNG>
<SYNONYM POKE BLIND>
<SYNTAX POUR OBJECT (HELD CARRIED) = V-DROP ;*>
<SYNTAX POUR OBJECT (HELD CARRIED) IN OBJECT = V-DROP>
<SYNTAX POUR OBJECT (HELD CARRIED) ON OBJECT = V-POUR-ON PRE-POUR-ON>
<SYNONYM POUR SPILL>
<SYNTAX PRAY = V-PRAY>
<SYNTAX PUMP UP OBJECT = V-PUMP>
<SYNTAX PUMP UP OBJECT WITH OBJECT = V-PUMP>
<SYNTAX PUSH OBJECT (IN-ROOM ON-GROUND MANY) = V-PUSH>
<SYNTAX PUSH ON OBJECT (IN-ROOM ON-GROUND MANY) = V-PUSH>
<SYNTAX PUSH OBJECT UNDER OBJECT = V-PUT-UNDER>
<SYNONYM PUSH PRESS>
<SYNTAX PUT OBJECT (HELD MANY HAVE) IN OBJECT = V-PUT PRE-PUT ;*>
<SYNTAX PUT OBJECT (HELD MANY HAVE) ON OBJECT = V-PUT PRE-PUT>
<SYNTAX PUT DOWN OBJECT (HELD MANY) = V-DROP>
<SYNTAX PUT OBJECT UNDER OBJECT = V-PUT-UNDER>
<SYNONYM PUT PLACE>
<SYNTAX RAISE OBJECT = V-RAISE ;*>
<SYNTAX RAISE UP OBJECT = V-RAISE>
<SYNONYM RAISE LIFT>
<SYNTAX READ
OBJECT (FIND READBIT) (HELD CARRIED ON-GROUND IN-ROOM TAKE)
= V-READ PRE-READ ; *>
<SYNTAX RING OBJECT (TAKE) = V-RING ;*>
<SYNTAX RING OBJECT (TAKE) WITH OBJECT = V-RING>
<SYNONYM RING PEAL>
<SYNTAX RUB OBJECT = V-RUB>
<SYNTAX RUB OBJECT WITH OBJECT = V-RUB>
<SYNONYM RUB TOUCH FEEL>
<SYNTAX SHAKE OBJECT = V-SHAKE>
<SYNTAX SLIDE OBJECT UNDER OBJECT = V-PUT-UNDER>
<SYNTAX SMELL OBJECT = V-SMELL>
<SYNONYM SMELL SNIFF>
<SYNTAX STRIKE
OBJECT (FIND VICBIT) (ON-GROUND IN-ROOM)
WITH
OBJECT (FIND WEAPONBIT) (HELD CARRIED ON-GROUND IN-ROOM HAVE)
= V-ATTACK>
<SYNTAX STRIKE
OBJECT (FIND VICBIT) (ON-GROUND IN-ROOM)
= V-ATTACK ;*>
<SYNTAX STRIKE OBJECT (ON-GROUND IN-ROOM HELD CARRIED) = V-LAMP-ON>
<SYNTAX SWIM = V-SWIM>
<SYNTAX SWIM IN OBJECT = V-SWIM>
<SYNONYM SWIM>
<SYNTAX SWING
OBJECT (FIND WEAPONBIT) (HELD CARRIED HAVE)
AT
OBJECT (FIND VILLAIN) (ON-GROUND IN-ROOM)
= V-SWING>
<SYNONYM SWING THRUST>
<SYNTAX TAKE
OBJECT (FIND TAKEBIT)
(ON-GROUND MANY)
= V-TAKE PRE-TAKE ;*>
<SYNTAX TAKE IN OBJECT (FIND VEHBIT) (ON-GROUND IN-ROOM) = V-BOARD PRE-BOARD>
<SYNTAX TAKE OUT OBJECT (FIND VEHBIT) (ON-GROUND IN-ROOM) = V-DISEMBARK>
<SYNTAX TAKE ON OBJECT (FIND VEHBIT) (ON-GROUND IN-ROOM) = V-CLIMB-ON>
<SYNTAX TAKE
OBJECT (FIND TAKEBIT) (CARRIED IN-ROOM MANY)
OUT
OBJECT
= V-TAKE PRE-TAKE>
<SYNTAX TAKE
OBJECT (FIND TAKEBIT) (CARRIED IN-ROOM MANY)
OFF
OBJECT
= V-TAKE PRE-TAKE>
<SYNTAX TAKE
OBJECT (FIND TAKEBIT) (IN-ROOM CARRIED MANY)
FROM
OBJECT
= V-TAKE PRE-TAKE>
<SYNONYM TAKE GET HOLD CARRY REMOVE>
<SYNTAX THROW
OBJECT (HELD CARRIED HAVE)
AT
OBJECT (FIND VICBIT) (ON-GROUND IN-ROOM)
= V-THROW ;*>
<SYNTAX THROW
OBJECT (HELD CARRIED HAVE)
WITH
OBJECT (FIND VICBIT) (ON-GROUND IN-ROOM)
= V-THROW>
<SYNTAX THROW OBJECT OBJECT = V-OVERBOARD>
<SYNTAX THROW OBJECT (HELD CARRIED HAVE) IN OBJECT = V-PUT PRE-PUT>
<SYNTAX THROW OBJECT (HELD CARRIED HAVE) ON OBJECT = V-PUT PRE-PUT>
<SYNTAX THROW OBJECT (HELD CARRIED HAVE) OVER OBJECT = V-PUT PRE-PUT>
<SYNONYM THROW>
<SYNTAX TIE OBJECT TO OBJECT = V-TIE PRE-TIE>
<SYNTAX TIE UP
OBJECT (FIND VICBIT) (ON-GROUND IN-ROOM)
WITH
OBJECT (FIND TOOLBIT) (ON-GROUND IN-ROOM HELD CARRIED HAVE)
= V-TIE-UP>
<SYNONYM TIE FASTEN>
<SYNTAX TURN
OBJECT (FIND TURNBIT) ( HELD CARRIED ON-GROUND IN-ROOM)
WITH
OBJECT (FIND TOOLBIT) (ON-GROUND IN-ROOM HELD CARRIED HAVE)
= V-TURN PRE-TURN ;*>
<SYNTAX TURN ON
OBJECT (FIND LIGHTBIT) (HELD CARRIED ON-GROUND IN-ROOM TAKE HAVE)
= V-LAMP-ON>
<SYNTAX TURN OFF
OBJECT (FIND LIGHTBIT) (HELD CARRIED ON-GROUND IN-ROOM TAKE HAVE)
= V-LAMP-OFF>
<SYNONYM TURN SHUT>
<SYNTAX UNTIE
OBJECT (ON-GROUND IN-ROOM HELD CARRIED)
= V-UNTIE PRE-UNTIE ;*>
<SYNTAX UNTIE
OBJECT (ON-GROUND IN-ROOM HELD CARRIED)
FROM
OBJECT
= V-UNTIE PRE-UNTIE>
<SYNONYM UNTIE>
<SYNTAX WAIT = V-WAIT>
<SYNTAX WAKE OBJECT (FIND VICBIT) (ON-GROUND IN-ROOM) = V-ALARM ;*>
<SYNTAX WAKE UP OBJECT (FIND VICBIT) (ON-GROUND IN-ROOM) = V-ALARM>
<SYNONYM WAKE>
<SYNTAX WALK AWAY OBJECT = V-WALK> ;"Crock!"
<SYNTAX WALK IN OBJECT = V-THROUGH>
<SYNTAX WALK WITH OBJECT = V-THROUGH>
<SYNTAX WALK AROUND OBJECT = V-WALK-AROUND>
<SYNTAX WALK UP OBJECT (FIND CLIMBBIT) (ON-GROUND IN-ROOM) = V-CLIMB-UP>
<SYNTAX WALK DOWN OBJECT (FIND CLIMBBIT) (ON-GROUND IN-ROOM) = V-CLIMB-DOWN>
<SYNONYM WALK GO RUN PROCEED>
<SYNTAX WAVE OBJECT (HELD CARRIED) = V-WAVE>
<SYNONYM WAVE BRANDISH>
<SYNTAX WIND OBJECT = V-WIND>
<SYNTAX WIND UP OBJECT = V-WIND>
<SYNTAX YELL = V-YELL>
<SYNONYM YELL SCREAM SHOUT>

1202
verbs.zil Normal file

File diff suppressed because it is too large Load Diff

3839
x.mid Normal file

File diff suppressed because it is too large Load Diff

3800
zap.mid Normal file

File diff suppressed because it is too large Load Diff

53
zork.errors Normal file
View File

@ -0,0 +1,53 @@
Assembling ZORK.XZAP.1
Inserting ZORKFREQ.ZAP.8
Inserting ZORKDAT.ZAP.2
Inserting DUNGEON.ZAP.1
Inserting SYNTAX.ZAP.1
Inserting MACROS.ZAP.1
Inserting CLOCK.ZAP.1
Inserting MAIN.ZAP.1
Inserting PARSER.ZAP.1
Inserting DEMONS.ZAP.1
Inserting CRUFTY.XZAP.1
CALL LIGHT-INT,CANDLES,I-CANDLES,'CANDLE-TABLE
17360 (in I-CANDLES) Bad variable name after value or predicate
CALL LIGHT-INT,CANDLES,I-CANDLES,'CANDLE-TABLE
17360 (in I-CANDLES) Bad variable name after value or predicate
Inserting VERBS.ZAP.1
19152 (in RANDOMIZE-OBJECTS) Multiply defined .FUNCT
.FUNCT KILL-INTERRUPTS
Inserting ACTIONS.ZAP.1
Inserting FIGHTS.ZAP.1
Inserting MELEE.ZAP.1
Inserting ZORKSTR.ZAP.1
UNCONSCIOUS global undefined: 0,
V?FOLLOW global undefined: 0, 0,
SWIMYUKS global undefined: 0,
V?PLUG global undefined: 0,
YELLOW-BUTTON global undefined: 0,
BROWN-BUTTON global undefined: 0,
RED-BUTTON global undefined: 0,
KEYS global undefined: 0, 0,
CLEARING global undefined: 0, 0, 0,
V?UNLOCK global undefined: 0, 0,
SAILOR global undefined: 0,
V-SKIP global undefined: 0, 0,
CANDLE-TABLE global undefined:
CANDLES global undefined: 0,
F-CONSCIOUS global undefined: 0,
F-BUSY? global undefined: 0,
HANDS global undefined: 0, 0, 0, 0, 0,
V-BLAST global undefined: 0,
TORCH-ROOM-FCN global undefined: 0,
TROPHY-CASE-FCN global undefined: 0,
SMELLY-ROOM global undefined: 0,
GRANITE global undefined: 0,
CLIFF-BOTTOM global undefined: 0,
TORCH-ROOM global undefined: 0,
RIVR4-ROOM global undefined: 0,
ARAGIAN-FALLS global undefined: 0,
47676 bytes.
169 objects.
114 globals.

45
zork.xzap Normal file
View File

@ -0,0 +1,45 @@
.INSERT "ZORKFREQ"
.INSERT "ZORKDAT" ; DATA IS IN THIS FILE
.INSERT "DUNGEON"
.INSERT "SYNTAX"
ENDLOD::
.INSERT "MACROS"
.INSERT "CLOCK"
.INSERT "MAIN"
.INSERT "PARSER"
.INSERT "DEMONS"
.INSERT "CRUFTY"
.INSERT "VERBS"
.INSERT "ACTIONS"
.INSERT "FIGHTS"
.INSERT "MELEE"
.INSERT "ZORKSTR"
.END

BIN
zork.zip Normal file

Binary file not shown.