shogun/maze.zil

782 lines
23 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.

"MAZE for
SHOGUN
(c) Copyright 1988 Infocom, Inc. All Rights Reserved."
<FILE-FLAGS SENTENCE-ENDS?>
<BEGIN-SEGMENT MAZE>
<CONSTANT MAZE-WINDOW 3>
<CONSTANT MWALL 128>
<DEFMAC MSTREET? ('VAL)
<FORM ZERO? <FORM BAND .VAL ,MWALL>>>
<OBJECT HOUSE
(LOC LOCAL-GLOBALS)
(SYNONYM HOUSE HOUSES SHOP SHOPS)
(DESC "house")
(FLAGS NDESCBIT)
(ACTION HOUSE-F)>
<ROUTINE HOUSE-F ()
<COND (<VERB? EXAMINE>
<TELL
"Houses and shops crowd the street on all sides, some dark and some
lit by oil lamps flickering through the paper panels of the shojis." CR>)
(<VERB? ENTER BOARD THROUGH>
<TELL
"As you start to move off from the cortege, Mariko calls you back,
speaking in Latin. \"No, Pilot, that is not the way.\"" CR>)>>
<OBJECT RONIN
(SYNONYM RONIN DETACHMENT)
(DESC "detachment of ronin")
(FLAGS PERSON PLURAL JAPANESEBIT)
(ACTION RONIN-F)>
<ROUTINE RONIN-F ("OPT" (RARG <>))
<COND (<RARG? WINNER>
<TELL
"The ronin take orders only from Toranaga." CR>
<END-QUOTE>)>>
<OBJECT FISH-GATE
(SYNONYM GATE FISH)
(ADJECTIVE BATTERED ETCHED)
(DESC "gate")
(FLAGS NDESCBIT SCOREBIT)
(ACTION FISH-GATE-F)>
<ROUTINE FISH-GATE-F ()
<COND (<VERB? EXAMINE>
<TELL
"It's just a weathered old gate with a fish carved on it." CR>)>>
<OBJECT AMBUSHERS
(SYNONYM AMBUSHER BOWMAN FIGURE SHAPE
AMBUSHERS BOWMEN FIGURES SHAPES)
(ADJECTIVE SHADOWY DIM)
(DESC "dim figures")
(FLAGS PERSON JAPANESEBIT PLURAL)
(DESCFCN AMBUSHERS-DESC)
(ACTION AMBUSHERS-F)>
<ROUTINE AMBUSHERS-DESC (RARG OBJ)
<COND (<RARG? OBJDESC?> <RTRUE>)
(ELSE
<TELL
"Dim figures can be seen on one of the tiled roofs of a nearby house.">)>>
<ROUTINE AMBUSHERS-F ("OPT" RARG)
<COND (<RARG? SUBJ>
<RFALSE>)
(<RARG? WINNER>
<TELL G"There is no response." CR>)
(<VERB? EXAMINE>
<TELL
"From here, in the dark, they are merely dim dark outlines." CR>)>>
<OBJECT MESSENGER
(SYNONYM MESSENGER MAN SAMURAI GRAY)
(ADJECTIVE GRAY)
(DESC "messenger")
(FLAGS PERSON JAPANESEBIT INVISIBLE SCOREBIT)
(GENERIC GENERIC-MAN-F)
(ACTION MESSENGER-F)>
<ROUTINE MESSENGER-F ("OPT" (RARG <>))
<COND (<AND <IN? ,MESSENGER ,LOCAL-GLOBALS>
<NOT <PASSIVE-VERB?>>>
<TELL "He's gone!" CR>)
(<RARG? SUBJ>
<RFALSE>)
(<RARG? WINNER>
<WAKARIMASEN>)
(<OR <VERB? STOP>
<HOSTILE-VERB?>>
<COND (<FSET? ,MESSENGER ,DEAD>
<TELL "Buntaro hacked him to pieces." CR>)
(<NOT <FSET? ,MESSENGER ,RMUNGBIT>>
<FSET ,MESSENGER ,RMUNGBIT>
<TELL
"You stretch to intercept the man, grabbing and nearly tackling him, and he
tumbles to the ground." CR>)
(ELSE
<TELL
"Desperately you struggle with the messenger and manage to knock him down
a second time." CR>
<SCORE-OBJECT ,MESSENGER>)>)>>
<ROOM AMBUSH-SITE
(LOC ROOMS)
(DESC "City Street")
(LDESC
"This is a dark, deserted street in the middle of Osaka.")
(SYNONYM STREET)
(ADJECTIVE CITY)
(FLAGS ONBIT OUTSIDE)
(GLOBAL MESSENGER)
(ACTION AMBUSH-SITE-F)>
<ROUTINE AMBUSH-SITE-F ("OPT" (RARG <>))
<COND (<RARG? BEG>
<COND (<VERB? WALK>
<TELL
"You are pinned down by the attack. To run would be suicidal!" CR>)
(<AND <P? (PUSH TAKE HELP PULL-BEHIND) MARIKO>
<FSET? ,MARIKOS-LITTER ,SCOREBIT>>
<B-LIE-DOWN>
<TELL
"You roll for cover, taking Mariko with you into the lee of the tumbled
litter." CR>
<SCORE-OBJECT ,MARIKOS-LITTER>)
(<AND <OR <VERB? DODGE>
<P? (HIDE-BEHIND HIDE-UNDER) MARIKOS-LITTER>>
<FSET? ,MARIKOS-LITTER ,SCOREBIT>>
<B-LIE-DOWN>
<TELL
"You roll for cover into the lee of the tumbled litter." CR>)>)>>
<GLOBAL AMBUSH-PROB 2>
<GLOBAL XAMBUSH 0>
<GLOBAL YAMBUSH 0>
<ROUTINE I-AMBUSH-START ()
<COND (<AND <L=? ,AMBUSH-PROB 100>
<NOT <PROB ,AMBUSH-PROB>>>
<QUEUE I-AMBUSH-START 5>
<SETG AMBUSH-PROB
<+ ,AMBUSH-PROB
<COND (<APPLE?> 12)
(ELSE 6)>>>
<RFALSE>)
(ELSE
<SETG XAMBUSH ,X>
<SETG YAMBUSH ,Y>
<MOVE-ALL ,MAZE ,AMBUSH-SITE>
<COND (<IN? ,BLACKTHORNE ,MARIKOS-LITTER>
<MOVE ,MARIKOS-LITTER ,MAZE>)
(ELSE
<MOVE ,BLACKTHORNE ,MAZE>)>
<MOVE ,AMBUSHERS ,AMBUSH-SITE>
<QUEUE I-AMBUSH -1>
<TELL CR
"The arrows come out of the night, the first impaling the captain
through the throat. His lungs fill with molten fire and death
swallows him. His last thought is one of wonder, for did not Lord
Kiyama, his master, tell him the ambush was to be later, beside
the wharves, and directed at the pirate?" CR CR>
<GOTO ,AMBUSH-SITE>)>>
<ROUTINE I-AMBUSH ()
<ZLINES ,AMBUSH-CNT
(<TELL CR
"An arrow slams into the litter post an inch from your head! Two
arrows pierce the curtains of Kiritsubo's litter, and another strikes
one of the maids in the waist. As she screams, the litter bearers
take to their heels into the darkness. Mariko ">
<COND (<FSET? ,MARIKOS-LITTER ,SCOREBIT>
<TELL "stands in the open">)
(ELSE
<TELL "clings to you">)>
<TELL ",
staring in shock at the dying maid." CR>)
(<TELL CR
"A shower of arrows straddles both litters.">
<COND (<FSET? ,MARIKOS-LITTER ,SCOREBIT>
<FSET ,MARIKO ,DEAD>
<TELL
" One strikes Mariko in the back as she starts to run for cover. She
falls to the ground and is still." CR>
<FAILED-SCENE>)
(ELSE
<TELL
" One thuds into the ground where Mariko was an instant ago." CR>)>)
(<MOVE ,TORANAGA ,HERE>
<REMOVE ,TORANAGA-IN-DRAG>
<FSET ,CURTAINS ,OPENBIT>
<COND (<NOT <MARGINAL-PIC ,P-IN-DRAG T ,P-IN-DRAG-CORNER T>>
<CRLF>)>
<TELL
"Buntaro shields Toranaga's litter with his body as best he can, then
whips open the curtains. Two arrows are imbedded in Toranaga's chest and
side,
and he jerks them out of the armor he wears beneath the kimono. He
fights his way out of the litter and stands in the street, sword
drawn, an incongruous figure in kimono and hat." CR>)
(<REMOVE ,AMBUSHERS>
<TELL CR
"Another volley of arrows comes out of the darkness, one missing you
so narrowly that it takes skin off of your cheek, and then all is silent.|
|
Buntaro and some of his men are near the wall in pursuit but the
ambushers vanish into the blackness. A dozen men race in pursuit but
all know it's hopeless." CR>)
(<MOVE ,MESSENGER ,HERE>
<FCLEAR ,MESSENGER ,INVISIBLE>
<THIS-IS-IT ,MESSENGER>
<SETG OPPONENT ,MESSENGER>
<TELL CR
"One of the officer Grays says, \"Toranaga!\" and though it is said
quietly, everyone hears. Here, incredibly, is the enemy of his
master, free, outside the castle walls. \"You will wait here, Lord
Toranaga. You,\" he snaps at one of his men, \"report to Lord Ishido
at once!\" The man races toward you, heading back toward the castle!" CR>)
(DELAY
<COND (<FSET? ,MESSENGER ,SCOREBIT>
<COND (<AND <FSET? ,MESSENGER ,RMUNGBIT>
<NOT <FSET? ,MESSENGER ,SURFACEBIT>>>
<FSET ,MESSENGER ,SURFACEBIT>
<TELL CR
"Immediately he rolls and is on his feet again!" CR>)
(ELSE
<MOVE ,MESSENGER ,LOCAL-GLOBALS>
<FCLEAR ,MESSENGER ,SCOREBIT>
<TELL CR
"This time the messenger scuttles away from you and is off like a hare
chased by hounds." CR>)>
<RTRUE>)
(<AND <NOT <IN? ,MESSENGER ,LOCAL-GLOBALS>>
<NOT <FSET? ,MESSENGER ,DEAD>>>
<FSET ,MESSENGER ,DEAD>
<TELL CR
"This time Buntaro, with a vicious chop of his sword, cuts the man down." CR>
<RTRUE>)>)
(<REPLACE-SYNONYM ,CORTEGE ,W?GRAYS ,W?BROWNS>
<MOVE ,GRAYS ,HERE>
<THIS-IS-IT ,GRAYS>
<TELL CR
"The rest of the Grays attack, trying to reach Toranaga. One officer
whips out his two-handed sword and leaps for Toranaga but Buntaro
parries. The Browns and Grays, all intermixed, erupt into a swirling
melee.|
|
The Grays fight courageously. Four join in a suicidal charge at
Toranaga. The Browns break it and the Grays regroup and charge
again. Then a senior officer orders three to retreat for help and the
rest to guard the retreat." CR>)
(<DEQUEUE I-AMBUSH>
<COND (<FSET? ,MESSENGER ,DEAD> <REMOVE ,MESSENGER>)
(ELSE <QUEUE I-CAUGHT 150>)>
<REMOVE ,GRAYS>
<MOVE-ALL ,AMBUSH-SITE ,MAZE>
<MOVE ,BLACKTHORNE ,AMBUSH-SITE>
<TELL CR
"The three Grays tear off, and though Buntaro kills one, the other two
are only wounded. The rest die." CR CR>
<GOTO ,MAZE>)>>
<ROUTINE I-CAUGHT ()
<COND (<HERE? MAZE>
<LEAVE-MAZE>
<TELL CR
"Ahead of you, a mass of Gray archers materializes out of the night. Above,
a mass of fireworks blooms in warning from the castle. Toranaga turns,
ordering the cortege to retreat down an alley, but there are Grays there
too. The party is surrounded!" CR>
<JIGS-UP>
<RFATAL>)>>
<ROOM MAZE
(LOC ROOMS)
(SYNONYM STREETS)
(ADJECTIVE CITY)
(DESC "City Streets")
(FLAGS OUTSIDE ONBIT)
(GLOBAL HOUSE)
(MOUSE MAZE-MOUSE-F)
(ACTION MAZE-F)>
<ROUTINE MAZE-F (RARG "AUX" XX YY OXX OYY)
<COND (<RARG? LOOK>
<TELL
"This maze of streets and alleys extends from the great castle to the
harbor. At night, it is a nightmare of blind alleys, twisting overhung
streets, and shadowy hurrying shapes." CR>)
(<RARG? ENTER>
<TOUCH-SEG ,P-MAZE-BACKGROUND>
<PICSET ,MAZE-PICS>
<COND (<NOT <FSET? ,HERE ,TOUCHBIT>>
<MOVE-ALL ,CITY ,MAZE>
<TELL
"The cortege continues through the winding, curling city streets,
the pedestrians bowing and the very poor on their knees until you
pass." CR CR>
<QUEUE I-AMBUSH-START 5>
<TELL "[Building Osaka.]" CR CR>
<BUILDMAZE>)>
<COND (<EQUAL? ,OHERE ,WAREHOUSE>
<SET XX ,XGOAL>
<SET YY ,YGOAL>
<TELL
"You have returned to the"G" maze of back streets and alleys." CR>)
(<EQUAL? ,OHERE ,AMBUSH-SITE>
<SET XX ,XAMBUSH>
<SET YY ,YAMBUSH>
<TELL
"The cortege re-forms and prepares to continue the escape. The urgency is
now great, as the escaped Grays will spread the alarm." CR>)
(ELSE
<SET XX ,XSTART>
<SET YY ,YSTART>
<TELL
"You have entered a"G" maze of back streets and alleys." CR>)>
<CRLF>
<TYPE-ANY-KEY>
<DISPLAY-MAZE>
<MAZE-MOVE .XX .YY>
<RTRUE>)
(<RARG? LEAVE>
<LEAVE-MAZE>)
(<RARG? BEG>
<COND (<VERB? DEFINE>
<CLEAR ,MAZE-WINDOW>
<RFALSE>)
(<VERB? COLOR>
<TELL
"[Sorry, you can't change colors in this part of Osaka.]" CR>)
(<VERB? WALK>
<REPEAT ((MOVED? <>))
<SET XX ,X>
<SET YY ,Y>
<SET OXX ,X>
<SET OYY ,Y>
<COND (<AND <EQUAL? ,P-WALK-DIR ,P?NORTH>
<G? .YY 0>>
<SET YY <- .YY 1>>)
(<AND <EQUAL? ,P-WALK-DIR ,P?EAST>
<L? .XX <- ,MAZE-WIDTH 1>>>
<SET XX <+ .XX 1>>)
(<AND <EQUAL? ,P-WALK-DIR ,P?WEST>
<G? .XX 0>>
<SET XX <- .XX 1>>)
(<AND <EQUAL? ,P-WALK-DIR ,P?SOUTH>
<L? .YY <- ,MAZE-HEIGHT 1>>>
<SET YY <+ .YY 1>>)
(<AND <EQUAL? ,P-WALK-DIR ,P?NE>
<L? .XX <- ,MAZE-WIDTH 1>>
<G? .YY 0>>
<SET XX <+ .XX 1>>
<SET YY <- .YY 1>>)
(<AND <EQUAL? ,P-WALK-DIR ,P?SE>
<L? .XX <- ,MAZE-WIDTH 1>>
<L? .YY <- ,MAZE-HEIGHT 1>>>
<SET XX <+ .XX 1>>
<SET YY <+ .YY 1>>)
(<AND <EQUAL? ,P-WALK-DIR ,P?SW>
<G? .XX 0>
<L? .YY <- ,MAZE-HEIGHT 1>>>
<SET XX <- .XX 1>>
<SET YY <+ .YY 1>>)
(<AND <EQUAL? ,P-WALK-DIR ,P?NW>
<G? .XX 0>
<G? .YY 0>>
<SET XX <- .XX 1>>
<SET YY <- .YY 1>>)
(ELSE
<TELL "You can't go that way." CR>
<RTRUE>)>
<COND (<AND <EQUAL? .XX ,XSTART>
<EQUAL? .YY ,YSTART>>
<GOTO ,CITY>
<RTRUE>)
(<AND <EQUAL? .XX ,XGOAL>
<EQUAL? .YY ,YGOAL>>
<GOTO ,WAREHOUSE>
<RTRUE>)
(<AND <MSTREET? <MGETB .XX .YY>>
<OR <EQUAL? .XX .OXX>
<EQUAL? .YY .OYY>
<MSTREET? <MGETB .XX .OYY>>
<MSTREET? <MGETB .OXX .YY>>>>
<MAZE-MOVE .XX .YY>
<COND (<AND <EQUAL? .XX ,XFISH>
<EQUAL? .YY ,YFISH>
<NOT <LOC ,FISH-GATE>>>
<MOVE ,FISH-GATE ,HERE>
<COND (<FSET? ,FISH-GATE ,SCOREBIT>
<MOVE ,RONIN ,HERE>
<SCORE-OBJECT ,FISH-GATE>
<TELL
G"You make your way through the deserted streets.">
<TELL
" Toranaga stops the cortege outside a battered gate. A fish is etched
into its timbers. He knocks in code. The door opens at once, and an
ill-kempt samurai bows. \"Bring your men and follow me,\" Toranaga
says. Fifteen men dressed as "I"ronin"" follow him and slip into
place as advance and rear guard. Others spread the alarm to other
secret cadres. Soon there are fifty troops with you and a hundred
guarding your flanks." CR>)>
<RTRUE>)
(<AND <EQUAL? .OXX ,XFISH>
<EQUAL? .OYY ,YFISH>>
<REMOVE ,FISH-GATE>)>
<COND (<EQUAL? ,P-WALK-DIR ,P?NORTH ,P?SOUTH>
<COND (<OR <MSTREET?
<MGETB <- .XX 1> .YY>>
<MSTREET?
<MGETB <+ .XX 1> .YY>>>
<RETURN>)
(ELSE
<SET MOVED? T>)>)
(<EQUAL? ,P-WALK-DIR ,P?EAST ,P?WEST>
<COND (<OR <MSTREET?
<MGETB .XX <- .YY 1>>>
<MSTREET?
<MGETB .XX <+ .YY 1>>>>
<RETURN>)
(ELSE
<SET MOVED? T>)>)>)
(.MOVED? <RETURN>)
(ELSE
<TELL "There's a house there." CR>
<RTRUE>)>>
<TELL
G"You make your way through the deserted streets." CR>)
(<AND <VERB? DROP>
<IN? ,WINNER ,MAZE>>
<COND (<IDROP>
<REMOVE ,PRSO>
<TELL
CTHE ,PRSO " drops to the ground and is lost from sight in the dark and
confusion." CR>)
(ELSE <RTRUE>)>)>)>>
<ROUTINE LEAVE-MAZE ("AUX" YY)
<SET YY <+ <WINGET ,S-TEXT ,WYPOS> <WINGET ,S-TEXT ,WTOP>>>
<SETUP-TEXT-AND-STATUS>
<COND (<APPLE?> <DISPLAY-BORDER>)>
<SCREEN ,S-TEXT>
<CURSET <- .YY <WINGET ,S-TEXT ,WTOP>> 1>>
<CONSTANT MAZE-PICS
<TABLE P-MAZE-WALL
P-MAZE-STREET
P-MAZE-PARTY
P-MAZE-CASTLE
P-MAZE-DOCK
P-MAZE-FISH
P-MAZE-BACKGROUND
0>>
<ROUTINE MAZE-MOUSE-F (TRM "AUX" (DIR <>) WX WY
(BX <GET ,MAZE-BOX-TBL 1>) (BY <GET ,MAZE-BOX-TBL 0>))
<SET WY
<+ <WINGET ,MAZE-WINDOW ,WTOP>
,YOFFSET
<* ,Y .BY>
</ .BY 2>>>
<SET WX
<+ <WINGET ,MAZE-WINDOW ,WLEFT>
,XOFFSET
<* ,X .BX>
</ .BX 2>>>
<SET WY <- ,MOUSE-LOC-Y .WY>>
<SET WX <- ,MOUSE-LOC-X .WX>>
<COND (<G=? .WX 0> ;"right side"
<COND (<L? .WY 0> ;"top right"
<SET WY <- .WY>>
<COND (<G? .WX <* .WY 3>>
<SET DIR ,EAST-STR>)
(<G? .WY <* .WX 3>>
<SET DIR ,NORTH-STR>)
(ELSE
<SET DIR ,NE-STR>)>)
(ELSE ;"bottom right"
<COND (<G? .WX <* .WY 3>>
<SET DIR ,EAST-STR>)
(<G? .WY <* .WX 3>>
<SET DIR ,SOUTH-STR>)
(ELSE
<SET DIR ,SE-STR>)>)>)
(<L? .WY 0> ;"top left"
<SET WY <- .WY>>
<SET WX <- .WX>>
<COND (<G? .WX <* .WY 3>>
<SET DIR ,WEST-STR>)
(<G? .WY <* .WX 3>>
<SET DIR ,NORTH-STR>)
(ELSE
<SET DIR ,NW-STR>)>)
(ELSE ;"bottom left"
<SET WX <- .WX>>
<COND (<G? .WX <* .WY 3>>
<SET DIR ,WEST-STR>)
(<G? .WY <* .WX 3>>
<SET DIR ,SOUTH-STR>)
(ELSE
<SET DIR ,SW-STR>)>)>
<COND (<AND <L=? .WX </ .BX 2>> <L=? .WY </ .BY 2>>>
<RFALSE>)
(.DIR
<ADD-TO-INPUT .DIR 13>
<RETURN 13>)
(ELSE
<RFALSE>)>>
<CONSTANT NORTH-STR <LTABLE (PURE STRING) "north">>
<CONSTANT SOUTH-STR <LTABLE (PURE STRING) "south">>
<CONSTANT EAST-STR <LTABLE (PURE STRING) "east">>
<CONSTANT WEST-STR <LTABLE (PURE STRING) "west">>
<CONSTANT SE-STR <LTABLE (PURE STRING) "se">>
<CONSTANT SW-STR <LTABLE (PURE STRING) "sw">>
<CONSTANT NE-STR <LTABLE (PURE STRING) "ne">>
<CONSTANT NW-STR <LTABLE (PURE STRING) "nw">>
<CONSTANT MAZE-BOX-TBL <TABLE 0 0>>
"Mechanics of building and displaying maze."
<ROUTINE MGETB (X Y)
<GETB ,MAZE-MAP <+ <* .Y ,MAZE-WIDTH> .X>>>
<ROUTINE MPUTB (X Y VAL)
<PUTB ,MAZE-MAP <+ <* .Y ,MAZE-WIDTH> .X> .VAL>>
<GLOBAL YOFFSET 0>
<GLOBAL XOFFSET 0>
<ROUTINE DISPLAY-MAZE-PIC (VAL Y X "AUX" BY BX OY OX)
<COND (<NOT <ZERO? .VAL>> ;<EQUAL? .VAL ;!\#>
<SET BY <GET ,MAZE-BOX-TBL 0>>
<SET BX <GET ,MAZE-BOX-TBL 1>>
<DISPLAY .VAL ;<MAZE-PIC .VAL>
<+ 1 ,YOFFSET <* .Y .BY>>
<+ 1 ,XOFFSET <* .X .BX>>>)>>
;<ROUTINE MAZE-PIC (VAL)
<COND (<EQUAL? .VAL !\B> ,P-MAZE-PARTY)
(<EQUAL? .VAL !\*> ,P-MAZE-WALL)
(<EQUAL? .VAL !\ > ,P-MAZE-STREET)
(<EQUAL? .VAL !\C> ,P-MAZE-CASTLE)
(<EQUAL? .VAL !\D> ,P-MAZE-DOCK)
(<EQUAL? .VAL !\F> ,P-MAZE-FISH)>>
<ROUTINE MAZE-MOVE (X Y)
<SCREEN ,MAZE-WINDOW>
<SETG X .X>
<SETG Y .Y>
<MPUTC <- .X 1> <- .Y 1>>
<MPUTC .X <- .Y 1>>
<MPUTC <+ .X 1> <- .Y 1>>
<MPUTC <- .X 1> .Y>
<MPUTC <+ .X 1> .Y>
<MPUTC <- .X 1> <+ .Y 1>>
<MPUTC .X <+ .Y 1>>
<MPUTC <+ .X 1> <+ .Y 1>>
<MPUTC .X .Y ,P-MAZE-PARTY ;!\B>
<SCREEN ,S-TEXT>>
<ROUTINE MPUTC (X Y "OPT" (VAL <>) "AUX" OVAL)
<COND (<VALID .X .Y>
<SET OVAL <MGETB .X .Y>>
<COND (<NOT .VAL>
<SET VAL .OVAL>
<COND (<MSTREET? .VAL>
<COND (<AND <EQUAL? .X ,XSTART>
<EQUAL? .Y ,YSTART>>
<SET VAL ,P-MAZE-CASTLE ;!\C>)
(<AND <EQUAL? .X ,XGOAL>
<EQUAL? .Y ,YGOAL>>
<SET VAL ,P-MAZE-DOCK ;!\D>)
(<AND <EQUAL? .X ,XFISH>
<EQUAL? .Y ,YFISH>>
<SET VAL ,P-MAZE-FISH ;!\F>)
(ELSE <SET VAL ,P-MAZE-STREET ;!\ >)>)
(ELSE
<SET VAL ,P-MAZE-WALL ;!\*>)>)>
<SET VAL <BOR .VAL <BAND .OVAL ,MWALL>>>
<COND (<NOT <EQUAL? .VAL .OVAL>>
<MPUTB .X .Y .VAL>
<DISPLAY-MAZE-PIC <BAND .VAL 127> .Y .X>)>)>>
<ROUTINE DISPLAY-MAZE ("AUX" Y BY BX MH MW TH SH FH)
<RESET-MARGIN>
<CLEAR ,S-TEXT>
<PICINF ,P-MAZE-BACKGROUND ,YX-TBL>
<SET FH <WINGET ,S-FULL ,WHIGH>>
<SET SH <WINGET ,S-STATUS ,WHIGH>>
<SET MH <GET ,YX-TBL 0>>
<SET MW <GET ,YX-TBL 1>>
<COND (<G? <+ .SH .MH <* 2 ,FONT-Y>> .FH>
<SET MH <- .FH .SH <* 2 ,FONT-Y>>>)>
<COND (<G? .MW <WINGET ,S-TEXT ,WWIDE>>
<SET MW <WINGET ,S-TEXT ,WWIDE>>)>
<WINDEF ,MAZE-WINDOW
<SET Y <+ <WINGET ,S-STATUS ,WTOP> .SH>>
<WINGET ,S-TEXT ,WLEFT>
.MH
.MW>
<SET TH <- .FH .SH>>
<WINDEF ,S-TEXT
<+ .Y .MH> <WINGET ,S-TEXT ,WLEFT>
<- .TH .MH> <WINGET ,S-TEXT ,WWIDE>>
<CLEAR ,S-TEXT>
<SCREEN ,MAZE-WINDOW>
<PICINF ,P-MAZE-BOX ,MAZE-BOX-TBL>
<SET BY <GET ,MAZE-BOX-TBL 0>>
<SET BX <GET ,MAZE-BOX-TBL 1>>
<SETG YOFFSET
<- <WINGET ,MAZE-WINDOW ,WHIGH>
<* ,MAZE-HEIGHT .BY>>>
<COND (<L? ,YOFFSET 0> <SETG YOFFSET 0>)
(ELSE <SETG YOFFSET </ ,YOFFSET 2>>)>
<SETG XOFFSET
<- <WINGET ,MAZE-WINDOW ,WWIDE>
<* ,MAZE-WIDTH .BX>>>
<COND (<L? ,XOFFSET 0> <SETG XOFFSET 0>)
(ELSE <SETG XOFFSET </ ,XOFFSET 2>>)>
<PRINTM>
<SCREEN ,S-TEXT>>
<ROUTINE PRINTM ("AUX" M (OFFS 0))
<DISPLAY ,P-MAZE-BACKGROUND 1 1>
<FOR ((Y 0) <L? .Y ,MAZE-HEIGHT> <SET Y <+ .Y 1>>)
<FOR ((X 0) <L? .X ,MAZE-WIDTH> <SET X <+ .X 1>>)
<DISPLAY-MAZE-PIC <SET M <BAND <GETB ,MAZE-MAP .OFFS> 127>>
.Y .X>
<SET OFFS <+ .OFFS 1>>>>>
<CONSTANT MAX-MAZE-WIDTH 37>
<CONSTANT MAX-MAZE-HEIGHT 17>
<GLOBAL MAZE-MAP <ITABLE <* ,MAX-MAZE-WIDTH ,MAX-MAZE-HEIGHT> (BYTE) 128>>
<GLOBAL MAZE-WIDTH 37>
<GLOBAL MAZE-HEIGHT 17>
<GLOBAL SIZE 0>
<GLOBAL PMAX 0>
<CONSTANT DIR
<TABLE <TABLE (BYTE) 0 1 2 3> <TABLE (BYTE) 0 1 3 2>
<TABLE (BYTE) 0 2 1 3> <TABLE (BYTE) 0 2 3 1>
<TABLE (BYTE) 0 3 1 2> <TABLE (BYTE) 0 3 2 1>
<TABLE (BYTE) 1 0 2 3> <TABLE (BYTE) 1 0 3 2>
<TABLE (BYTE) 1 2 0 3> <TABLE (BYTE) 1 2 3 0>
<TABLE (BYTE) 1 3 0 2> <TABLE (BYTE) 1 3 2 0>
<TABLE (BYTE) 2 0 1 3> <TABLE (BYTE) 2 0 3 1>
<TABLE (BYTE) 2 1 0 3> <TABLE (BYTE) 2 1 3 0>
<TABLE (BYTE) 2 3 0 1> <TABLE (BYTE) 2 3 1 0>
<TABLE (BYTE) 3 0 1 2> <TABLE (BYTE) 3 0 2 1>
<TABLE (BYTE) 3 1 0 2> <TABLE (BYTE) 3 1 2 0>
<TABLE (BYTE) 3 2 0 1> <TABLE (BYTE) 3 2 1 0>>>
<CONSTANT XOFF1 <TABLE 0 0 1 -1>>
<CONSTANT YOFF1 <TABLE -1 1 0 0>>
<CONSTANT XOFF2 <TABLE 0 0 2 -2>>
<CONSTANT YOFF2 <TABLE -2 2 0 0>>
<GLOBAL X 0>
<GLOBAL Y 0>
<GLOBAL XSTART 0>
<GLOBAL YSTART 0>
<GLOBAL XGOAL 0>
<GLOBAL YGOAL 0>
<GLOBAL LEN 0>
<GLOBAL LMAX 0>
<GLOBAL FLEN 0>
<GLOBAL XFISH 0>
<GLOBAL YFISH 0>
<ROUTINE BUILDMAZE ("AUX" LEFT PLEN D)
<COND (<APPLE?>
<SETG MAZE-WIDTH 19>
<SETG MAZE-HEIGHT 15>)>
<SETG SIZE <* </ ,MAZE-WIDTH 2> </ ,MAZE-HEIGHT 2>>>
<SETG PMAX ,SIZE>
<SET LEFT ,SIZE>
<SETG FLEN <+ 10 <RANDOM 5>>>
<FOR ((YY 0) <L? .YY ,MAZE-HEIGHT> <SET YY <+ .YY 1>>)
<FOR ((XX 0) <L? .XX ,MAZE-WIDTH> <SET XX <+ .XX 1>>)
<MPUTB .XX .YY ,MWALL>>>
<FOR ((YY 1) <L? .YY ,MAZE-HEIGHT> <SET YY <+ .YY 2>>)
<FOR ((XX 1) <L? .XX ,MAZE-WIDTH> <SET XX <+ .XX 2>>)
<MPUTB .XX .YY 0>>>
<SETG XGOAL <- ,MAZE-WIDTH 2>
;<+ <* <RANDOM <- </ ,MAZE-WIDTH 2> 1>> 2> 1>>
<SETG XSTART ,XGOAL>
<SETG X ,XGOAL>
<SETG YGOAL <+ <* <RANDOM <- </ ,MAZE-HEIGHT 2> 1>> 2> 1>>
<SETG YSTART ,YGOAL>
<SETG Y ,YGOAL>
<MPUTB ,X ,Y 1>
<SETG LEN 1>
<SETG LMAX 1>
<FOR ((PLEN 0) <G? <SET LEFT <- .LEFT 1>> 0> <SET PLEN <+ .PLEN 1>>)
<REPEAT ()
<COND (<OR <ZERO? <MGETB ,X ,Y>>
<G=? .PLEN ,PMAX>
<L? <SET D <FINDMOVE ,X ,Y>> 0>>
<BACKUP>
<SET PLEN 0>)
(ELSE <RETURN>)>>
<REMOVEWALL .D>>
<FOR ((YY 1) <L? .YY ,MAZE-HEIGHT> <SET YY <+ .YY 2>>)
<FOR ((XX 1) <L? .XX ,MAZE-WIDTH> <SET XX <+ .XX 2>>)
<MPUTB .XX .YY 0>>>
<FOR ((XX 0) <L? .XX ,MAZE-WIDTH> <SET XX <+ .XX 1>>)
<MPUTB .XX 0 ,MWALL>
<MPUTB .XX <- ,MAZE-HEIGHT 1> ,MWALL>>
<FOR ((YY 1) <L? .YY <- ,MAZE-HEIGHT 1>> <SET YY <+ .YY 1>>)
<MPUTB 0 .YY ,MWALL>
<MPUTB <- ,MAZE-WIDTH 1> .YY ,MWALL>>
<SETG XGOAL <+ ,XGOAL 1>>
;<REPEAT ()
<SETG XFISH <RANDOM ,MAZE-WIDTH>>
<SETG YFISH <RANDOM ,MAZE-HEIGHT>>
<COND (<ZERO? <BAND <MGETB ,XFISH ,YFISH> ,MWALL>>
<RETURN>)>>
<MPUTB ,XGOAL ,YGOAL 0> ;"make the exit">
<ROUTINE VISITED (XLOC YLOC)
<COND (<NOT <VALID .XLOC .YLOC>>)
(<N==? <MGETB .XLOC .YLOC> 0>)>>
<ROUTINE VALID (XLOC YLOC)
<COND (<OR <L? .XLOC 0> <G=? .XLOC ,MAZE-WIDTH>
<L? .YLOC 0> <G=? .YLOC ,MAZE-HEIGHT>>
<>)
(ELSE T)>>
<ROUTINE FINDMOVE (XLOC YLOC "AUX" (DV <RANDOM 23>) D I)
<FOR ((I 0) <L? .I 4> <SET I <+ .I 1>>)
<SET D <GETB <GET ,DIR .DV> .I>>
<COND (<NOT <VISITED <+ .XLOC <GET ,XOFF2 .D>>
<+ .YLOC <GET ,YOFF2 .D>>>>
<RETURN .D>)
(ELSE <SET D -1>)>>
.D>
<ROUTINE BACKUP ("AUX" D XX YY)
<SETG LEN <- ,LEN 1>>
<FOR ((D 0) <L? .D 4> <SET D <+ .D 1>>)
<SET XX <+ ,X <GET ,XOFF2 .D>>>
<SET YY <+ ,Y <GET ,YOFF2 .D>>>
<COND (<AND <VALID .XX .YY>
<==? <MGETB .XX .YY> ,LEN>>
<RETURN>)>>
<SETG X .XX>
<SETG Y .YY>
<RTRUE>>
<ROUTINE REMOVEWALL (D)
<MPUTB <+ ,X <GET ,XOFF1 .D>>
<+ ,Y <GET ,YOFF1 .D>>
0>
<SETG LEN <+ <MGETB ,X ,Y> 1>>
<SETG X <+ ,X <GET ,XOFF2 .D>>>
<SETG Y <+ ,Y <GET ,YOFF2 .D>>>
<MPUTB ,X ,Y ,LEN>
<COND (<EQUAL? ,LEN ,FLEN>
<SETG XFISH ,X>
<SETG YFISH ,Y>)>
<COND (<G? ,LEN ,LMAX>
<SETG LMAX ,LEN>
<SETG XSTART ,X>
<SETG YSTART ,Y>)>
<RTRUE>>
<END-SEGMENT>