shogun/misc.zil

1152 lines
29 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"MISC for
SHOGUN
(c) Copyright 1988 Infocom, Inc. All Rights Reserved."
<BEGIN-SEGMENT 0>
<PROPDEF SCENE <> (SCENE "MANY" S:FIX = <> "MANY" <BYTE .S>)>
<PROPDEF SCORE <> (SCORE N:FIX = 2 <BYTE 0> <BYTE .N>)>
;"tell macro and friends"
;"moved tell-tokens to DEFS"
<ROUTINE PRINT-HIM/HER (X)
<COND (<FSET? .X ,PLURAL>
<TELL "them">)
(<FSET? .X ,PERSON>
<COND (<EQUAL? .X ,ME ,WINNER>
<TELL "yourself">)
(<FSET? .X ,FEMALE>
<TELL "her">)
(ELSE <TELL "him">)>)
(ELSE <TELL "it">)>>
<ROUTINE CPRINT-HE/SHE (X)
<COND (<FSET? .X ,PLURAL>
<TELL "They">)
(<FSET? .X ,PERSON>
<COND (<EQUAL? .X ,ME ,WINNER>
<TELL "You">)
(<FSET? .X ,FEMALE>
<TELL "She">)
(ELSE <TELL "He">)>)
(ELSE <TELL "It">)>>
<ROUTINE PRINT-HE/SHE (X)
<COND (<FSET? .X ,PLURAL>
<TELL "they">)
(<FSET? .X ,PERSON>
<COND (<EQUAL? .X ,ME ,WINNER>
<TELL "yourself">)
(<FSET? .X ,FEMALE>
<TELL "she">)
(ELSE <TELL "he">)>)
(ELSE <TELL "it">)>>
<ROUTINE PRINT-HIS/HER (X)
<COND (<FSET? .X ,PLURAL>
<TELL "their">)
(<FSET? .X ,PERSON>
<COND (<EQUAL? .X ,ME ,WINNER>
<TELL "your">)
(<FSET? .X ,FEMALE>
<TELL "her">)
(ELSE <TELL "his">)>)
(ELSE <TELL "its">)>>
<ROUTINE PRINT-PLURAL (OBJ)
<COND (<NOT <FSET? .OBJ ,PLURAL>>
<TELL "s">)>>
<ROUTINE PRINTUNDER (X)
<HLIGHT ,H-UNDER>
<PRINT .X>
<HLIGHT ,H-NORMAL>>
<ROUTINE CTHE-PRINT-PRSO ()
<THE-PRINT ,PRSO T>>
<ROUTINE CTHE-PRINT-PRSI ()
<THE-PRINT ,PRSI T>>
<ROUTINE CTHE-PRINT (O)
<THE-PRINT .O T>>
<ROUTINE THE-PRINT-PRSO ()
<THE-PRINT ,PRSO>>
<ROUTINE THE-PRINT-PRSI ()
<THE-PRINT ,PRSI>>
<ROUTINE THE-PRINT (O "OPTIONAL" (CAP? <>))
<DPRINT .O .CAP? <NOT <FSET? .O ,NOTHEBIT>>>>
<ROUTINE CPRINTA-PRSO ()
<PRINTA ,PRSO T>>
;<ROUTINE CPRINTA-PRSI ()
<PRINTA ,PRSI T>>
;<ROUTINE CPRINTA (O)
<PRINTA .O T>>
<ROUTINE PRINTA-PRSO ()
<PRINTA ,PRSO>>
<ROUTINE PRINTA-PRSI ()
<PRINTA ,PRSI>>
<ROUTINE PRINTA (O "OPT" (CAP? <>))
<COND (<FSET? .O ,THE>
<COND (.CAP? <PRINTI "The ">)
(ELSE <PRINTI "the ">)>)
(<NOT <FSET? .O ,NOABIT>>
<COND (<FSET? .O ,AN>
<COND (.CAP? <PRINTI "An ">)
(ELSE <PRINTI "an ">)>)
(.CAP? <PRINTI "A ">)
(ELSE <PRINTI "a ">)>)>
<IPRINT .O>>
<ROUTINE DPRINT-PRSO ()
<DPRINT ,PRSO>>
<ROUTINE DPRINT-PRSI ()
<DPRINT ,PRSI>>
;<ROUTINE CDPRINT-PRSO ()
<DPRINT ,PRSO T>>
;<ROUTINE CDPRINT-PRSI ()
<DPRINT ,PRSI T>>
;<ROUTINE CDPRINT (O)
<DPRINT .O T>>
<ROUTINE DPRINT (O "OPTIONAL" (CAP? <>) (THE? <>) "AUX" S)
<COND (<EQUAL? .O ,PLAYER ,ME>
<COND (.CAP? <TELL "You">)
(ELSE <TELL "you">)>)
(<AND <EQUAL? .O ,RUTTER> .CAP?>
<TELL "Your rutter">)
(ELSE
<COND (<AND <SET S <GET-OWNER .O>>
<NOT <EQUAL? .S <GETP .O ,P?OWNER>>>>
<COND (<EQUAL? .S ,PLAYER>
<COND (.CAP? <TELL "Your ">)
(T <TELL "your ">)>)
(ELSE
<DPRINT .S .CAP? ;.THE?>
<TELL "'s ">)>)
(<OR .THE? <FSET? .O ,THE>>
<COND (.CAP? <PRINTI "The ">)
(T <PRINTI "the ">)>)>
<IPRINT .O>)>>
<ROUTINE IPRINT (O "AUX" TMP)
<COND ;(<AND <EQUAL? .O ,PSEUDO-OBJECT>
<NOT ,P-MERGED>
<EQUAL? .O ,PRSO ,PRSI>>
<THING-PRINT ,PSEUDO-PRSO ;"<EQUAL? .O ,PRSO>">)
(<SET TMP <GETP .O ,P?SDESC>>
<PRINT .TMP>)
(ELSE
<PRINTD .O>)>>
<COND (<GASSIGNED? ZILCH>
<DEFINE PE (F I)
<COND (<TYPE? .I LIST>
<FORM .F !.I>)
(ELSE
<FORM .F .I>)>>
<DEFMAC P? ('V "OPT" ('O '*) ('I '*) ('W '*) "AUX" (L ()))
<COND (<N==? .I '*>
<SET L (<PE PRSI? .I> !.L)>)>
<COND (<N==? .O '*>
<COND (<OR <==? .V 'WALK>
<==? .V ',V?WALK>>
<SET L (<PE DIR? .O> !.L)>)
(ELSE
<SET L (<PE PRSO? .O> !.L)>)>)>
<COND (<N==? .V '*>
<SET L (<PE VERB? .V> !.L)>)>
<COND (<N==? .W '*>
<SET L (<PE WINNER? .W> !.L)>)>
<COND (<EMPTY? <REST .L>>
<1 .L>)
(ELSE <FORM AND !.L>)>>
<DEFMAC NOT-SOLVED? ('OBJ)
<FORM FSET? .OBJ ',SCOREBIT>>
<DEFMAC SOLVED? ('OBJ)
<FORM NOT <FORM FSET? .OBJ ',SCOREBIT>>>
<DEFMAC VERB? ("ARGS" ATMS)
<MULTIFROB ',PRSA .ATMS>>
<DEFMAC SCENE? ("ARGS" ATMS)
<MULTIFROB ',SCENE .ATMS>>
<DEFMAC CONTEXT? ("ARGS" ATMS)
<MULTIFROB '.RARG .ATMS>>
<DEFMAC ADJ? ("ARGS" ATMS)
<MULTIFROB '<PARSE-ADJ ,PARSE-RESULT> .ATMS>>
<SETG RARG? ,CONTEXT?>
<DEFMAC WINNER? ("ARGS" ATMS)
<MULTIFROB ',WINNER .ATMS>>
<DEFMAC PRSO? ("ARGS" ATMS)
<MULTIFROB ',PRSO .ATMS>>
<DEFMAC DIR? ("ARGS" ATMS)
<MULTIFROB ',P-WALK-DIR .ATMS>>
<DEFMAC PRSI? ("ARGS" ATMS)
<MULTIFROB ',PRSI .ATMS>>
<DEFMAC HERE? ("ARGS" ATMS)
<MULTIFROB ',HERE .ATMS>>
<SETG ROOM? ,HERE?>
<DEFINE MULTIFROB (X ATMS "AUX" (OO (OR)) (O .OO) (L ()) ATM SP)
<REPEAT ()
<COND (<EMPTY? .ATMS>
<RETURN!- <COND (<LENGTH? .OO 1> <ERROR .X>)
(<LENGTH? .OO 2> <NTH .OO 2>)
(ELSE <CHTYPE .OO FORM>)>>)>
<REST
<PUTREST
.O
<SET O
(<REPEAT
((LL <FORM EQUAL? .X>)
(L <REST .LL>))
<COND (<OR <EMPTY? .ATMS>
<==? <LENGTH <REST .LL 2>> 3>>
<RETURN!- .LL>)>
<SET ATM <NTH .ATMS 1>>
<PUTREST
.L
<SET L
(<COND
(<TYPE? .ATM ATOM>
<SET SP <SPNAME .ATM>>
<MAKE-GVAL
<COND (<==? .X ',PRSA>
<PARSE <STRING "V?" .SP>>)
(<==? .X ',P-WALK-DIR>
<COND (<AND <G? <LENGTH .SP> 2>
<==? <1 .SP> !\P>
<==? <2 .SP> !\?>>
.ATM)
(ELSE
<PARSE
<STRING "P?" .SP>>)>)
(<==? .X '.RARG>
<COND (<AND <G? <LENGTH .SP> 2>
<==? <1 .SP> !\M>
<==? <2 .SP> !\->>
.ATM)
(ELSE
<PARSE
<STRING "M-" .SP>>)>)
(ELSE .ATM)>>)
(ELSE .ATM)>)>>
<SET ATMS <REST .ATMS>>>)>>>>>)
(ELSE
<DEFINE P? (V "OPT" (O '*) (I '*) (W '*) "AUX" (L <>))
<AND <OR <==? .W '*> <WINNER? .W>>
<OR <==? .V '*> <VERB? .V>>
<OR <==? .O '*> <PRSO? .O>>
<OR <==? .I '*> <PRSI? .I>>>>
<DEFINE VERB? ("TUPLE" ATMS)
<MAPF <>
<FUNCTION (A "AUX" ATM)
<COND (<TYPE? .A ATOM>
<COND (<SET ATM
<LOOKUP <STRING "V?" <SPNAME .A>>
<MOBLIST INITIAL>>>
<COND (<EQUAL? ,PRSA ,.ATM>
<MAPLEAVE T>)>)
(ELSE
<ERROR NOT-A-VERB? .A>)>)
(<EQUAL? ,PRSA .A>
<MAPLEAVE T>)>>
.ATMS>>
<DEFINE CONTEXT? ("TUPLE" ATMS)
<MAPF <>
<FUNCTION (A "AUX" ATM)
<COND (<TYPE? .A ATOM>
<COND (<AND <G? <LENGTH <SET ATM <SPNAME .A>>> 2>
<==? <1 .ATM> !\M>
<==? <2 .ATM> !\->>
<COND (<EQUAL? .RARG ,.ATM>
<MAPLEAVE T>)>)
(<SET ATM
<LOOKUP <STRING "M-" <SPNAME .A>>
<MOBLIST INITIAL>>>
<COND (<EQUAL? .RARG ,.ATM>
<MAPLEAVE T>)>)
(ELSE
<ERROR NOT-A-CONTEXT? .A>)>)
(<EQUAL? .RARG .A>
<MAPLEAVE T>)>>
.ATMS>>
<SETG RARG? ,CONTEXT?>
<DEFINE WINNER? ("TUPLE" ATMS)
<MULTIFROB ,WINNER .ATMS>>
<DEFINE PRSO? ("TUPLE" ATMS)
<MULTIFROB ,PRSO .ATMS>>
<DEFINE PRSI? ("TUPLE" ATMS)
<MULTIFROB ,PRSI .ATMS>>
<DEFINE HERE? ("TUPLE" ATMS)
<MULTIFROB HERE .ATMS>>
<SETG ROOM? ,HERE?>
<DEFINE MULTIFROB (X ATMS)
<MAPF <>
<FUNCTION (A)
<COND (<TYPE? .A ATOM> <SET A ,.A>)>
<COND (<EQUAL? .X .A>
<MAPLEAVE T>)>>
.ATMS>>)>
<COND (<GASSIGNED? ZILCH>
<DEFMAC BSET ('OBJ "ARGS" BITS)
<MULTIBITS FSET .OBJ .BITS>>
<DEFMAC BCLEAR ('OBJ "ARGS" BITS)
<MULTIBITS FCLEAR .OBJ .BITS>>
<DEFMAC BSET? ('OBJ "ARGS" BITS)
<MULTIBITS FSET? .OBJ .BITS>>
<DEFINE MULTIBITS (X OBJ ATMS
"AUX" (OT <COND (<==? .X FSET?> <FORM OR>)
(ELSE <FORM PROG ()>)>)
(OO <COND (<LENGTH? .OT 1> .OT)
(ELSE <REST .OT>)>)
(O .OO)
ATM)
<REPEAT ()
<COND (<EMPTY? .ATMS>
<RETURN!- .OT>)>
<SET ATM <NTH .ATMS 1>>
<SET ATMS <REST .ATMS>>
<PUTREST .O
<SET O
(<FORM .X
.OBJ
<COND (<TYPE? .ATM FORM> .ATM)
(ELSE <MAKE-GVAL .ATM>)>>)>>>>)
(ELSE
<DEFINE BSET (OBJ "TUPLE" BITS)
<MULTIBITS ,FSET .OBJ .BITS>>
<DEFINE BCLEAR (OBJ "TUPLE" BITS)
<MULTIBITS ,FCLEAR .OBJ .BITS>>
<DEFINE BSET? (OBJ "TUPLE" BITS)
<MAPF <>
<FUNCTION (A)
<COND (<FSET? .OBJ ,.A> <MAPLEAVE T>)>>
.BITS>>
<DEFINE MULTIBITS (X OBJ ATMS)
<MAPF <>
<FUNCTION (A)
<APPLY!- .X .OBJ ,.A>>
.ATMS>>)>
<DEFMAC RFATAL ()
'<RETURN ,M-FATAL>>
<COND (<GASSIGNED? ZILCH>
<DEFMAC PROB ('BASE?)
<FORM NOT <FORM L? .BASE? '<RANDOM 100>>>>)
(ELSE
<DEFINE PROB (BASE?)
<NOT <L? .BASE? <RANDOM 100>>>>)>
<ROUTINE PICK-ONE (FROB
"AUX" (L <GET .FROB 0>) (CNT <GET .FROB 1>) RND MSG RFROB)
<SET L <- .L 1>>
<SET FROB <REST .FROB 2>>
<SET RFROB <REST .FROB <* .CNT 2>>>
<SET RND <RANDOM <- .L .CNT>>>
<SET MSG <GET .RFROB .RND>>
<PUT .RFROB .RND <GET .RFROB 1>>
<PUT .RFROB 1 .MSG>
<SET CNT <+ .CNT 1>>
<COND (<==? .CNT .L> <SET CNT 0>)>
<PUT .FROB 0 .CNT>
.MSG>
;<ROUTINE RANDOM-ELEMENT (FROB)
<GET .FROB <RANDOM <GET .FROB 0>>>>
<DEFMAC APPLE? ()
'<EQUAL? ,MACHINE ,APPLE-2E ,APPLE-2C ,APPLE-2GS>>
;"former MAIN.ZIL stuff"
<GLOBAL P-WON <>>
<GLOBAL SCENE 0>
<ROUTINE SCENE-SELECT ("OPT" (FULL? <>) "AUX" TMP M WID WHICH L Y END)
<SET L <+ <GET ,PART-MENU ;.MEN 0> 1>>
<SET END <+ 1 <WINGET ,S-FULL ,WHIGH>>>
<COND (<APPLE?> <SET L <+ .L 2>>)>
<SET TMP <* .L ,FONT-Y>>
<SET Y <- .END .TMP>>
<COND (<APPLE?> <SET Y <- .Y <* 2 ,FONT-Y>>>)>
<WINDEF ,S-TEXT
.Y <WINGET ,S-TEXT ,WLEFT>
.TMP <WINGET ,S-TEXT ,WWIDE>>
<RESET-MARGIN>
<REPEAT ()
<CLEAR ,S-TEXT>
<SCREEN ,S-TEXT>
<SET WHICH
<GET-FROM-MENU "You may choose to: "
,PART-MENU
,SCENE-SELECT-F
1>>
<COND (.WHICH <RTRUE>)>>>
<ROUTINE SCENE-SELECT-F (TMP M)
<COND (<EQUAL? .TMP 1>
<SETUP-TEXT-AND-STATUS>
;<SPLIT <* ,FONT-Y ,STATUS-LINES>>
<SETG SCENE <GET ,SCENES 1>>)
(<EQUAL? .TMP 2>
<CLEAR ,S-TEXT>
<V-RESTORE>
<RESET-MARGIN>
<CLEAR ,S-TEXT>
<RFALSE>)
(<EQUAL? .TMP 3>
<CLEAR ,S-TEXT>
<V-QUIT T <>>
<RESET-MARGIN>
<CLEAR ,S-TEXT>
<RFALSE>)>>
"SCENES AND PARTS"
<CONSTANT PART-MENU
<LTABLE <TABLE (PURE STRING LENGTH) "START the game ">
<TABLE (PURE STRING LENGTH) "RESTORE a saved game ">
<TABLE (PURE STRING LENGTH) "QUIT the game ">>>
<CONSTANT SCENE-NAMES
<PLTABLE "Erasmus"
"Anjiro"
"Yabu"
"Pit" ;"omi & yabu"
"Rodrigues" ;"crew out of pit"
"Voyage to Osaka" ;"rod's advice"
"Toranaga" ;"ishido vs. t."
"Prison" ;"how to help"
"Mariko" ;"alvito & ferriera"
"Escape" ;"hatamoto"
"Earthquake" ;"zataki"
"Journey to Yedo" ;"delay, etc."
"Ochiba"
"Departure" ;"council"
"Seppuku"
"Ninja" ;"etsu's death"
"Yokohama"
"Aftermath"
"Epilogue">>
<DEFMAC SCENE-CONSTANTS ("TUPLE" SS "AUX" (CNT 0))
<MAPF ,PLTABLE
<FUNCTION (S)
<EVAL <FORM CONSTANT .S <SET CNT <+ .CNT 1>>>>>
.SS>>
<CONSTANT SCENES
<SCENE-CONSTANTS S-ERASMUS
S-ANJIRO
S-YABU
S-PIT
S-RODRIGUES
S-VOYAGE
S-TORANAGA
S-PRISON
S-MARIKO
S-ESCAPE
S-QUAKE
S-JOURNEY
S-OCHIBA
S-DEPARTURE
S-SEPPUKU
S-NINJA
S-YOKOHAMA
S-AFTERMATH
S-EPILOGUE>>
<CONSTANT SCENE-LOCS
<PLTABLE BRIDGE-OF-ERASMUS ;"S-ERASMUS"
MURA-HOUSE ;"S-ANJIRO"
VILLAGE-SQUARE ;"S-YABU"
PIT ;"S-PIT"
ANJIRO-WATERFRONT ;"S-RODRIGUES"
GALLEY ;"S-VOYAGE"
OUTER-CORRIDOR ;"S-TORANAGA"
PRISON ;"S-PRISON"
MAPLE-GLADE ;"S-MARIKO"
COURTYARD ;"S-ESCAPE"
PLATEAU ;"S-QUAKE"
YOKOSE-BATH-HOUSE ;"S-JOURNEY"
OCHIBA-ROOM ;"S-OCHIBA"
FORECOURT ;"S-DEPARTURE"
FORMAL-GARDEN ;"S-SEPPUKU"
PRIVATE-QUARTERS ;"S-NINJA"
YOKOHAMA ;"S-YOKOHAMA"
STABLE ;"S-AFTERMATH"
SEKIGAHARA ;"S-EPILOGUE">>
<CONSTANT SCENE-PICS
<TABLE (PURE BYTE LENGTH)
P-STORM ;"S-ERASMUS"
P-GARDEN ;"S-ANJIRO"
P-YABU-SEG ;"S-YABU"
P-PIT ;"S-PIT"
P-RODRIGUES-SEG ;"S-RODRIGUES"
P-CONFUSION ;"S-VOYAGE"
P-OSAKA ;"S-TORANAGA"
P-PRISON-SEG ;"S-PRISON"
P-MARIKO-SEG ;"S-MARIKO"
P-PROCESSION ;"S-ESCAPE"
P-QUAKE ;"S-QUAKE"
P-BATH ;"S-JOURNEY"
P-OCHIBA-SEG ;"S-OCHIBA"
P-DEPARTURE-SEG ;"S-DEPARTURE"
P-SEPPUKU ;"S-SEPPUKU"
P-NINJA ;"S-NINJA"
P-VINCK ;"S-YOKOHAMA"
P-AFTERMATH-SEG ;"S-AFTERMATH"
P-CREST ;"S-EPILOGUE">>
<GLOBAL MACHINE <>>
<GLOBAL WIDTH 0>
<END-SEGMENT ;"0">
<BEGIN-SEGMENT STARTUP>
<ROUTINE GO ()
<MOUSE-LIMIT -1>
<SETG MACHINE <LOWCORE INTID>>
<COND ;(<EQUAL? ,MACHINE ,AMIGA> ;"sigh, all Amiga colors are ugly"
<SETG FG-COLOR ,C-BLACK>
<SETG BG-COLOR 10 ;"light gray">
<COLOR ,FG-COLOR ,BG-COLOR>)
(ELSE
<SETG FG-COLOR <LOWCORE (CLRWRD 1)>>
<SETG BG-COLOR <LOWCORE (CLRWRD 0)>>)>
<COND (<APPLE?>
<SETG TEXT-MARGIN 0>
<COND (<PICINF ,P-BORDER ,YX-TBL>
<SETG BORDER-HEIGHT <GET ,YX-TBL 0>>)>)
(ELSE <SETG TEXT-MARGIN 2>)>
<SETG LIT T>
<SETG CLOCK-HAND <REST ,C-TABLE ,C-TABLELEN>>
<SETG PLAYER ,BLACKTHORNE>
<SETUP-FULL>
<TITLE-SCREEN>
<COND (,DEMO-VERSION?
<SLIDE-SHOW>
<AGAIN>)>
<SETUP-DISPLAY>
<SCENE-SELECT>
<GOTO-SCENE ,SCENE <>>
<MAIN-LOOP>>
<ROUTINE SLIDE-SHOW ()
<CLEAR -1>
<TELL
"This is a demonstration version of SHOGUN.|
|
First you will see a few samples of the graphic screens that await you
in SHOGUN. We've used graphics in surprising new ways to enhance the
story without detracting from Infocom's traditional richness and depth.|
Then you will be able to interact with a small section of
SHOGUN. Feel free to try the new friendlier parser, the optional mouse
interface, and the on-screen hints.|
SHOGUN is an adaptation of James Clavell's novel,
which has sold over 7 million copies and inspired the popular T.V.
mini-series. Dave Lebling, while collaborating with Clavell, has
incorporated the creative style and rich prose that have made his
earlier ZORK titles so popular.|
In SHOGUN you are transcended into the world of Clavell's saga, which
combines all of the mystery and action of a great adventure story with
the intensity and romance of a classic love story. Whether you find
yourself matching wits with tyrannical Japanese aristocrats or fighting
off attacks by Ninja assassins, you are sure to be both challenged and
entertained. Both the action and the intriguing, historical locale set
the stage for unparalleled fun and excitement.|
">
<TYPE-ANY-KEY>
<END-DEMO>>
<ROUTINE END-DEMO ()
<CLEAR -1>
<TELL "|
You have reached the end of this demonstration version of|">
<V-VERSION>
<TELL "||">
<TYPE-ANY-KEY>
<SCREEN ,S-TEXT>
;<DEFAULT-COLORS> ;"return to default before screen clears"
<RESTART>
<TELL ,FAILED>
<AGAIN>>
<END-SEGMENT ;"STARTUP">
<BEGIN-SEGMENT 0>
<CONSTANT S-FULL 7>
<ROUTINE SETUP-FULL ("AUX" (HIGH <LOWCORE VWRD>) (WIDE <LOWCORE HWRD>) X)
<WINDEF ,S-FULL 1 1 .HIGH .WIDE>
<SET X <WINGET ,S-TEXT ,WFSIZE>>
<SETG FONT-Y <HIGH-BYTE .X>>
<SETG FONT-X <LOW-BYTE .X>>>
<ROUTINE SETUP-DISPLAY ("AUX" (HIGH <LOWCORE VWRD>) (WIDE <LOWCORE HWRD>))
<MOUSE-LIMIT -1>
<SETUP-FULL>
<SETUP-TEXT-AND-STATUS>
<SET WIDE <WINGET ,S-TEXT ,WWIDE>>
<MARGIN ,TEXT-MARGIN ,TEXT-MARGIN ,S-TEXT>
<SET WIDE <- .WIDE <* 2 ,TEXT-MARGIN>>>
<SETG WIDTH <GETB ,P-INBUF 0>>
<SET WIDE </ .WIDE ,FONT-X>>
<COND (<L? .WIDE ,WIDTH>
<SETG WIDTH .WIDE>
<PUTB ,P-INBUF 0
<COND (<G? .WIDE ,INBUF-LENGTH>
,INBUF-LENGTH)
(T
.WIDE)>>)>>
<ROUTINE REPAINT-DISPLAY ("OPT" (NO-BORDER? <>))
<RESET-MARGIN>
<NORMAL-COLOR>
<SETUP-DISPLAY>
<COND (<OR <APPLE?> <NOT .NO-BORDER?>>
<DISPLAY-BORDER>)>
<INIT-STATUS-LINE T>
<COND (<HERE? ,MAZE>
<DISPLAY-MAZE>)>>
<ROUTINE GOTO-SCENE (SC "OPT" (OSC ,SCENE))
<CLEAR ,S-TEXT>
<COND (<AND <APPLE?> <NOT .OSC>>
<SCREEN ,S-STATUS>
<CLEAR ,S-STATUS>
<DISPLAY-BORDER ,P-EBORDER>)
(<NOT <EQUAL? ,CURRENT-BORDER ,P-BORDER>>
<DISPLAY-BORDER ,P-BORDER>)>
<END-QUOTE>
<RESET-MARGIN>
<DEQUEUE-ALL>
<SETG ORPHAN-ANSWER <>>
<SETG SCENE .SC>
<SETG HERE <GET ,SCENE-LOCS ,SCENE>>
<TOUCH-SEG <GETB ,SCENE-PICS ,SCENE>>
<FCLEAR ,HERE ,TOUCHBIT>
<SETG QCONTEXT <>>
<MOVE-ALL ,BLACKTHORNE>
<MOVE ,BLACKTHORNE ,HERE>
<FCLEAR ,BLACKTHORNE ,RMUNGBIT>
<SETG P-IT-OBJECT <>>
<SETG P-HIM-OBJECT <>>
<SETG P-HER-OBJECT <>>
<SETG P-THEM-OBJECT <>>
<B-STAND>
<SETG OPPONENT <>>
<APPLY <GETP ,HERE ,P?ACTION> ,M-SCENE-SETUP>
<SETG WINNER ,PLAYER>
<CLEAR ,S-TEXT>
<COND (<ZERO? .OSC>
<CLEAR ,S-STATUS>
<INIT-STATUS-LINE>)
(ELSE <UPDATE-STATUS-LINE T>)>
<GOTO ,HERE>
<COND (<ZERO? .OSC>
<CLOCKER> ;"simulate a previous move..."
<SETG MOVES 0>)>
<RTRUE>>
<ROUTINE TOUCH-SEG (S)
<COND (<OR <APPLE?> <EQUAL? ,MACHINE ,IBM>>
<PICINF .S ,YX-TBL>)>>
;<GLOBAL WAS-IT? <>>
;<GLOBAL WAS-THEM? <>>
;<GLOBAL WAS-HIM? <>>
;<GLOBAL WAS-HER? <>>
;<GLOBAL PERFORM-DEPTH 0> ;"number recursive calls to perform"
;<CONSTANT P-MATCHLEN 0>
;<ROUTINE OBJECT-SUBSTITUTE (OBJ VAR "AUX" (TMP <>) (CNT 0) ICNT OCNT)
<COND (<AND .VAR <ACCESSIBLE? .VAR>>
<SET ICNT <GET ,P-PRSI ,P-MATCHLEN>>
<SET OCNT <GET ,P-PRSO ,P-MATCHLEN>>
<REPEAT ()
<COND (<G? <SET CNT <+ .CNT 1>> .ICNT>
<RETURN>)
(T
<COND (<EQUAL? <GET ,P-PRSI .CNT> .OBJ>
<PUT ,P-PRSI .CNT .VAR>
<SET TMP T>
<RETURN>)>)>>
<SET CNT 0>
<REPEAT ()
<COND (<G? <SET CNT <+ .CNT 1>> .OCNT>
<RETURN>)
(T
<COND (<EQUAL? <GET ,P-PRSO .CNT> .OBJ>
<PUT ,P-PRSO .CNT .VAR>
<SET TMP T>
<RETURN>)>)>>
.TMP)>>
;<GLOBAL PSEUDO-PRSO <>> ;"T IF ORIGINAL PRSO WAS PSEUDO-OBJECT"
<ROUTINE GAME-VERB? ()
<COND (<AND <VERB? TELL> ,P-CONT> <RTRUE>)
(<AND <VERB? HELP>
<NOT ,PRSO>>
<RTRUE>)
(<VERB? QUIT VERSION BRIEF SUPER-BRIEF VERBOSE COLOR
$VERIFY RESTART SAVE RESTORE SCRIPT UNSCRIPT UNDO
SCORE TIME DEFINE $REFRESH NOTIFY HINT HINTS-OFF
CREDITS>
<RTRUE>)
(<VERB? $RANDOM $COMMAND $RECORD $UNRECORD
;$SCENE ;$SHOW ;$W ;$P ;$D ;$I ;$G ;$X ;$M>
<RTRUE>)>>
"MULTIPLE-EXCEPTION? -- return true if an object found by all should not
be included when the crunch comes."
;<ROUTINE MULTIPLE-EXCEPTION? (OBJ1 "AUX" (L <LOC .OBJ1>))
<COND (<EQUAL? .OBJ1 ,NOT-HERE-OBJECT>
<SETG P-NOT-HERE <+ ,P-NOT-HERE 1>>
<RTRUE>)
(<AND <VERB? TAKE>
,PRSI
<NOT <IN? ,PRSO ,PRSI>>>
;"TAKE X FROM Y and x not in y"
<RTRUE>)
(<NOT <ACCESSIBLE? .OBJ1>>
;"can't get at object"
<RTRUE>)
(<EQUAL? ,P-GETFLAGS ,P-ALL>
;"cases for ALL"
<COND (<AND ,PRSI
<PRSO? ,PRSI>>
;"VERB ALL and prso = prsi"
<RTRUE>)
(<AND <VERB? TAKE> <NOT ,PRSI>>
<COND (<OR <AND <NOT <EQUAL? .L ,WINNER ,HERE ,PRSI>>
<NOT <EQUAL? .L <LOC ,WINNER>>>
<NOT <FSET? .L ,SURFACEBIT>>
<NOT <FSET? .L ,SEARCHBIT>>>
<AND <NOT <FSET? .OBJ1 ,TAKEBIT>>
<NOT <FSET? .OBJ1 ,TRYTAKEBIT>>>>
;"TAKE ALL and object not accessible or takeable"
<RTRUE>)
(<OR <FSET? .L ,PERSON>
<FSET? <LOC .L> ,PERSON>>
;"TAKE ALL held by a person (use TAKE ALL FROM)"
<RTRUE>)
(<HELD? ,PRSO>
;"TAKE ALL and one object has others in it"
<RTRUE>)>)
(<VERB? DROP GIVE>
<COND (<NOT <IN? .OBJ1 ,WINNER>>
;"GIVE/DROP ALL and object not held"
<RTRUE>)
(<FSET? .OBJ1 ,WEARBIT>
;"GIVE/DROP ALL and object worn"
<RTRUE>)>)
(<AND <VERB? PUT>
<NOT <IN? ,PRSO ,WINNER>>
<HELD? ,PRSO ,PRSI>>
;"PUT ALL IN X and object already in x"
<RTRUE>)>)>>
;<ROUTINE SAVE-INPUT (TBL "AUX" (OFFS 0) CNT TMP)
<SET CNT <+ <GETB ,P-LEXV <SET TMP <* 4 ,P-INPUT-WORDS>>>
<GETB ,P-LEXV <+ .TMP 1>>>>
<COND (<EQUAL? .CNT 0> ;"failed"
<RFALSE>)>
<SET CNT <- .CNT 1>>
<REPEAT ()
<COND (<EQUAL? .OFFS .CNT>
<PUTB .TBL .OFFS 0>
<RETURN>)
(T
<PUTB .TBL .OFFS <GETB ,P-INBUF <+ .OFFS 1>>>)>
<SET OFFS <+ .OFFS 1>>>
<RTRUE>>
;<ROUTINE RESTORE-INPUT (TBL "AUX" CHR)
<REPEAT ()
<COND (<EQUAL? <SET CHR <GETB .TBL 0>> 0>
<RETURN>)
(T
<PRINTC .CHR>
<SET TBL <REST .TBL>>)>>>
<GLOBAL P-MULT <>>
<GLOBAL P-NOT-HERE 0>
;<GLOBAL WHAT-DO-YOU-WANT-TO "What do you want to ">
;<ROUTINE FAKE-ORPHAN ("AUX" TMP)
<ORPHAN ,P-SYNTAX <>>
<TELL ,WHAT-DO-YOU-WANT-TO>
<SET TMP <GET ,P-OTBL ,P-VERBN>>
<COND (<EQUAL? .TMP 0>
<TELL "tell">)
(<ZERO? <GETB ,P-VTBL 2>>
<PRINTB <GET .TMP 0>>)
(T
<WORD-PRINT <GETB .TMP 2> <GETB .TMP 3>>
<PUTB ,P-VTBL 2 0>)>
<SETG P-OFLAG T>
<SETG P-WON <>>
<PREP-PRINT
<GETB ,P-SYNTAX ,P-SPREP1>>
<TELL "?" CR>>
<ROUTINE END-QUOTE ()
<SETG P-CONT <>>
<RFATAL>>
;"former CLOCK.ZIL stuff"
<GLOBAL CLOCK-WAIT <>>
<GLOBAL C-TABLE <ITABLE 13 <> <>>>
<CONSTANT C-INTLEN 4> ;"length of an interrupt entry in bytes"
<CONSTANT C-RTN 0> ;"word offset of routine name"
<CONSTANT C-TICK 1> ;"word offset of count"
<CONSTANT C-TABLELEN 52> ;"length of interrupt table in bytes"
<GLOBAL C-INTS 52> ;"start of queued interrupts in bytes"
<ROUTINE DEQUEUE (RTN "AUX" TIM)
<COND (<SET RTN <QUEUED? .RTN>>
<SET TIM <GET .RTN ,C-TICK>>
<PUT .RTN ,C-RTN 0>
.TIM)>>
<ROUTINE QUEUED? (RTN "AUX" C E)
<SET E <REST ,C-TABLE ,C-TABLELEN>>
<SET C <REST ,C-TABLE ,C-INTS>>
<REPEAT ()
<COND (<EQUAL? .C .E> <RFALSE>)
(<EQUAL? <GET .C ,C-RTN> .RTN>
<COND (<ZERO? <GET .C ,C-TICK>>
<RFALSE>)
(T <RETURN .C>)>)>
<SET C <REST .C ,C-INTLEN>>>>
"this version of QUEUE automatically enables as well"
"QUEUE routine when fresh?:t means only queue if not currently queued"
<ROUTINE QUEUE (RTN TICK "OPT" (I? <>) "AUX" C E (INT <>))
<SET E <REST ,C-TABLE ,C-TABLELEN>>
<SET C <REST ,C-TABLE ,C-INTS>>
<REPEAT ()
<COND (<EQUAL? .C .E>
<COND (.INT
<SET C .INT>)
(ELSE
<SETG C-INTS <- ,C-INTS ,C-INTLEN>>
<SET INT <REST ,C-TABLE ,C-INTS>>)>
<PUT .INT ,C-RTN .RTN>
<RETURN>)
(<EQUAL? <GET .C ,C-RTN> .RTN>
<COND (.I? <RFALSE>)
(ELSE
<SET INT .C>
<RETURN>)>)
(<ZERO? <GET .C ,C-RTN>>
<SET INT .C>)>
<SET C <REST .C ,C-INTLEN>>>
<COND (%<COND (<GASSIGNED? ZILCH>
'<G? .INT ,CLOCK-HAND>)
(ELSE
'<L=? <LENGTH .INT> <LENGTH ,CLOCK-HAND>>)>
<SET TICK <- <+ .TICK 3>>>)>
<PUT .INT ,C-TICK .TICK>
.INT>
<GLOBAL STATIONARY? <>> ;"winner not walking around?"
<GLOBAL STATIONARY-CNT <>> ;"and for how long"
<GLOBAL CLOCK-HAND <>>
<ROUTINE CLOCKER ("AUX" E TICK RTN (FLG <>) (Q? <>) OWINNER TMP)
<COND (,CLOCK-WAIT <SETG CLOCK-WAIT <>> <RFALSE>)>
<COND (<EQUAL? ,HERE ,STATIONARY?>
<SETG STATIONARY-CNT <+ ,STATIONARY-CNT 1>>)
(ELSE
<SETG STATIONARY? ,HERE>
<SETG STATIONARY-CNT 0>)>
<SETG CLOCK-HAND <REST ,C-TABLE ,C-INTS>>
<SET E <REST ,C-TABLE ,C-TABLELEN>>
<SET OWINNER ,WINNER>
<SETG WINNER ,PLAYER>
<REPEAT ()
<COND (,NEW-SCENE-NUMBER
<I-NEW-SCENE>
<SETG CLOCK-HAND <REST ,C-TABLE ,C-INTS>>
<SET FLG T>)>
<COND (<EQUAL? ,CLOCK-HAND .E>
<SETG MOVES <+ ,MOVES 1>>
<SETG WINNER .OWINNER>
<RETURN .FLG>)
(<NOT <ZERO? <GET ,CLOCK-HAND ,C-RTN>>>
<SET TICK <GET ,CLOCK-HAND ,C-TICK>>
<COND (<L? .TICK -1>
<PUT ,CLOCK-HAND ,C-TICK <- <- .TICK> 3>>
<SET Q? ,CLOCK-HAND>)
(<NOT <ZERO? .TICK>>
<COND (<G? .TICK 0>
<SET TICK <- .TICK 1>>
<PUT ,CLOCK-HAND ,C-TICK .TICK>)>
<COND (<NOT <ZERO? .TICK>>
<SET Q? ,CLOCK-HAND>)>
<COND (<NOT <G? .TICK 0>>
<SET RTN
%<COND (<GASSIGNED? ZILCH>
'<GET ,CLOCK-HAND ,C-RTN>)
(ELSE
'<NTH ,CLOCK-HAND
<+ <* ,C-RTN 2>
1>>)>>
<COND (<ZERO? .TICK>
<PUT ,CLOCK-HAND ,C-RTN 0>)>
<COND (<SET TMP <APPLY .RTN>>
<SET FLG .TMP>)>
<COND (<AND <NOT .Q?>
<NOT
<ZERO?
<GET ,CLOCK-HAND
,C-RTN>>>>
<SET Q? T>)>)>)>)>
<COND (,NEW-SCENE-NUMBER ;"new scene during int?"
<SETG CLOCK-HAND <REST ,C-TABLE ,C-INTS>>)
(<EQUAL? .FLG ,M-FATAL>
<SETG CLOCK-HAND .E>)
(<NOT <EQUAL? ,CLOCK-HAND .E>>
<SETG CLOCK-HAND <REST ,CLOCK-HAND ,C-INTLEN>>
<COND (<NOT .Q?>
<SETG C-INTS <+ ,C-INTS ,C-INTLEN>>)>)>>>
<ROUTINE DEQUEUE-ALL ("AUX" E TICK RTN (FLG <>) (Q? <>))
<COND (,CLOCK-WAIT <SETG CLOCK-WAIT <>> <RFALSE>)>
<SETG CLOCK-HAND <REST ,C-TABLE ,C-INTS>>
<SET E <REST ,C-TABLE ,C-TABLELEN>>
<REPEAT ()
<COND (<EQUAL? ,CLOCK-HAND .E>
<SETG CLOCK-HAND .E>
<RETURN>)
(ELSE
<PUT ,CLOCK-HAND ,C-TICK 0>
<PUT ,CLOCK-HAND ,C-RTN 0>)>
<SETG CLOCK-HAND <REST ,CLOCK-HAND ,C-INTLEN>>
<SETG C-INTS <+ ,C-INTS ,C-INTLEN>>>>
<DEFINE PSEUDO ("TUPLE" V)
<MAPF ,PLTABLE
<FUNCTION (OBJ)
<COND (<N==? <LENGTH .OBJ> 3>
<ERROR BAD-THING .OBJ>)>
<MAPRET <COND (<NTH .OBJ 1>
<VOC <SPNAME <NTH .OBJ 1>> ADJECTIVE>)>
<COND (<NTH .OBJ 2>
<VOC <SPNAME <NTH .OBJ 2>> NOUN>)>
;<3 .OBJ>>>
.V>>
<ROUTINE PERFORM-PRSA ("OPT" (O <>) (I <>))
<PERFORM ,PRSA .O .I>>
<ROUTINE NEW-VERB (V)
<PERFORM .V ,PRSO ,PRSI>>
<ROUTINE SWAP-VERB (V)
<PERFORM .V ,PRSI ,PRSO>>
<ROUTINE NEW-PRSO (O)
<PERFORM-PRSA .O ,PRSI>>
;<ROUTINE NEW-PRSI (I)
<PERFORM-PRSA ,PRSO .I>>
<ROUTINE NEW-WINNER-PRSO (A "OPT" (O <>) (I <>) "AUX" OW)
<SET OW ,WINNER>
<SETG WINNER ,PRSO>
<PERFORM .A .O .I>
<SETG WINNER .OW>
<RTRUE>>
<ROUTINE REDIRECT (FROM TO "AUX" O I)
<SET O <COND (<PRSO? .FROM> .TO) (ELSE ,PRSO)>>
<SET I <COND (<PRSI? .FROM> .TO) (ELSE ,PRSI)>>
<PERFORM-PRSA .O .I>
<RTRUE>>
<GLOBAL DELAY-CNT 0>
<COND (<GASSIGNED? ZILCH>
<DEFMAC ZLINES ('VAR:<PRIMTYPE ATOM> "ARGS" LINES:LIST
"AUX" (CNT:FIX 0) SETTER:ATOM
(DELAYS:<OR FALSE LIST> <>))
<COND (<TYPE? .VAR ATOM>
<EVAL <FORM GLOBAL .VAR 0>>
<SET SETTER <CHTYPE .VAR GVAL>>)
(<TYPE? .VAR GVAL>
<EVAL <FORM GLOBAL <CHTYPE .VAR ATOM> 0>>
<SET SETTER 'SETG>)
(<TYPE? .VAR LVAL>
<EVAL <FORM GLOBAL <CHTYPE .VAR ATOM> 0>>
<SET SETTER 'SET>)>
<SET DELAYS
<MAPF ,LIST
<FUNCTION (LINE:LIST)
<COND (<EMPTY? .LINE> <MAPRET>)
(<==? <1 .LINE> DELAY>
<MAPRET (<FORM EQUAL? .VAR .CNT>
!<REST .LINE>)>)
(ELSE
<COND (<AND <NOT <EMPTY? .LINE>>
<TYPE? <1 .LINE> FIX>>
<SET CNT <+ .CNT <1 .LINE>>>
<SET LINE <REST .LINE>>)
(ELSE
<SET CNT <+ .CNT 1>>)>
<MAPRET>)>>
.LINES>>
<SET CNT 0>
<COND (<NOT <EMPTY? .DELAYS>>
<SET DELAYS
('<SETG DELAY-CNT <+ ,DELAY-CNT 1>>
<FORM COND !.DELAYS>
'<SETG DELAY-CNT 0>)>)>
<FORM PROG ()
!.DELAYS
<FORM .SETTER <CHTYPE .VAR ATOM> <FORM + .VAR 1>>
<FORM COND
!<MAPF ,LIST
<FUNCTION (LINE:LIST)
<COND (<NOT <EMPTY? .LINE>>
<COND (<==? <1 .LINE> DELAY>
<MAPRET>)
(<TYPE? <1 .LINE> FIX>
<SET CNT
<+ .CNT <1 .LINE>>>
<SET LINE <REST .LINE>>)
(ELSE
<SET CNT <+ .CNT 1>>)>
<LIST <FORM EQUAL? .VAR .CNT>
!.LINE>)
(ELSE
<ERROR BAD-ZLINES>)>>
.LINES>>>>)
(ELSE
<DEFINE ZLINES (VAR "ARGS" LINES)
<RFALSE>>)>
<COND (<GASSIGNED? ZILCH>
<DEFMAC FOR ('X "ARGS" BODY)
<FORM REPEAT (<1 .X>)
<FORM COND (<FORM NOT <2 .X>> '<RETURN>)>
!.BODY
<3 .X>>>)>
<ROUTINE CREWMAN? (OBJ)
<AND <NOT <EQUAL? .OBJ ,CREWMEN ,LG-CREWMEN>>
<FSET? .OBJ ,DUTCHBIT>>>
"stuff for handling opcodes that want pixels"
<ROUTINE WINDEF (W TOP LEFT HIGH WIDE)
<WINPOS .W .TOP .LEFT>
<WINSIZE .W .HIGH .WIDE>>
<GLOBAL FONT-X 7>
<GLOBAL FONT-Y 10>
<ROUTINE C-PIXELS (X)
<+ <* <- .X 1> ,FONT-X> 1>>
<ROUTINE L-PIXELS (Y)
<+ <* <- .Y 1> ,FONT-Y> 1>>
<ROUTINE CCURSET (Y X)
<CURSET <L-PIXELS .Y> <C-PIXELS .X>>>
<ROUTINE IN-SCENE? (OBJ "AUX" SC PT)
<COND (<NOT <SET SC <GETPT .OBJ ,P?SCENE>>>
<RTRUE>)
(ELSE
<SET PT <PTSIZE .SC>>
<COND (<INTBL? ,SCENE .SC .PT 1> <RTRUE>)
(ELSE <RFALSE>)>)>>
<ROUTINE REPLACE-SYNONYM (OBJ OLD NEW "OPT" (DUP? <>) "AUX" TMP S L)
<COND (<SET S <GETPT .OBJ ,P?SYNONYM>>
<SET L </ <PTSIZE .S> 2>>
<COND (<AND <NOT .DUP?> <INTBL? .NEW .S .L>>
<RTRUE>)
(<SET TMP <INTBL? .OLD .S .L>>
<PUT .TMP 0 .NEW>)>)>>
<ROUTINE REPLACE-ADJECTIVE (OBJ OLD NEW "OPT" (DUP? <>) "AUX" TMP S L)
<COND (<SET S <GETPT .OBJ ,P?ADJECTIVE>>
<SET L </ <PTSIZE .S> 2>>
<COND (<AND <NOT .DUP?> <INTBL? .NEW .S .L>>
<RTRUE>)
(<SET TMP <INTBL? .OLD .S .L>>
<PUT .TMP 0 .NEW>)>)>>
<ROUTINE CURSOR-OFF ()
<CURSET -1>>
<ROUTINE CURSOR-ON ()
<CURSET -2>>
<END-SEGMENT ;"0">