forked from historicalsource/shogun
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmaze.zil
781 lines (729 loc) · 22.8 KB
/
maze.zil
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
"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>