-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathgoal.zap
More file actions
2130 lines (2033 loc) · 48.5 KB
/
goal.zap
File metadata and controls
2130 lines (2033 loc) · 48.5 KB
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
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
.FUNCT DIR-PRINT,DIR,CNT=0,TBL,X
ZERO? DIR \?CND1
PRINTI "out of view"
RTRUE
?CND1: SET 'TBL,DIR-STRINGS
ZERO? ON-TRAIN /?CND6
ZERO? IN-STATION /?THN13
EQUAL? DIR,P?DOWN /?CND6
?THN13: SET 'TBL,NAUTICAL-DIR-STRINGS
?CND6:
?PRG15: GET TBL,CNT >X
ZERO? X \?ELS19
PRINTI "out of view"
RTRUE
?ELS19: EQUAL? X,DIR \?CND17
EQUAL? DIR,P?UP,P?DOWN /?CND24
PRINTI "the "
?CND24: ZERO? ON-TRAIN /?ELS31
ZERO? IN-STATION /?ELS31
EQUAL? DIR,P?DOWN \?ELS31
PRINTI "down the steps"
RTRUE
?ELS31: ADD CNT,1
GET TBL,STACK
PRINT STACK
RTRUE
?CND17: ADD CNT,2 >CNT
JUMP ?PRG15
.FUNCT OPP-DIR,DIR,CNT=0,X
?PRG1: GET DIR-STRINGS,CNT >X
ZERO? X /FALSE
EQUAL? X,DIR \?CND3
MOD CNT,4
ZERO? STACK \?ELS10
ADD CNT,2
GET DIR-STRINGS,STACK
RETURN STACK
?ELS10: SUB CNT,2
GET DIR-STRINGS,STACK
RETURN STACK
?CND3: ADD CNT,2 >CNT
JUMP ?PRG1
.FUNCT GET-LINE,LN
EQUAL? LN,1 \?ELS5
RETURN TRAIN-LINE
?ELS5: EQUAL? LN,2 \?ELS7
RETURN OTHER-LINE
?ELS7: EQUAL? LN,3 \?ELS9
RETURN DINER-LINE
?ELS9: EQUAL? LN,4 \?ELS11
RETURN PLATF-LINE
?ELS11: EQUAL? LN,5 \?ELS13
RETURN STATN-LINE
?ELS13: EQUAL? LN,6 \FALSE
RETURN FANCY-LINE
.FUNCT FOLLOW-GOAL,PERSON,HERE,GT,GOAL,FLG,IGOAL=0,X
LOC PERSON >HERE
IN? HERE,ROOMS /?CND1
CALL2 META-LOC,HERE >HERE
MOVE PERSON,HERE
?CND1: GETP PERSON,P?CHARACTER
GET GOAL-TABLES,STACK >GT
GET GT,GOAL-F
EQUAL? HERE,STACK \?ELS6
CALL2 GOAL-REACHED,PERSON
RSTACK
?ELS6: GET GT,GOAL-ENABLE
ZERO? STACK /FALSE
?CND4: GETP HERE,P?STATION >X
EQUAL? HERE,X /?CND9
ZERO? X \?CND12
SET 'X,HERE
PRINTI "[!! NO STATION AT "
PRINTD HERE
PRINTI "]"
CRLF
?CND12: CALL ZMEMQ,HERE,CAR-ROOMS-REST
ZERO? STACK /?CND17
CALL FIND-FLAG-LG,HERE,DOORBIT
FCLEAR STACK,LOCKED
?CND17: CALL MOVE-PERSON,PERSON,X
RSTACK
?CND9: GET GT,GOAL-I >IGOAL
GET TRANSFER-TABLE,IGOAL >GOAL
ZERO? GOAL \?CND20
SET 'IGOAL,FALSE-VALUE
GET GT,GOAL-S >GOAL
?CND20: ZERO? GOAL /FALSE
EQUAL? HERE,GOAL \?CND23
ZERO? IGOAL /?ELS30
ADD IGOAL,1
GET TRANSFER-TABLE,STACK >FLG
ZERO? FLG \?CND32
SET 'FLG,HERE
PRINTI "[!! NO TRANSFER #"
PRINTN IGOAL
PRINTI "]"
CRLF
?CND32: CALL MOVE-PERSON,PERSON,FLG >FLG
GET GT,GOAL-F
CALL ESTABLISH-GOAL,PERSON,STACK
RETURN FLG
?ELS30: GET GT,GOAL-F >FLG
EQUAL? HERE,FLG /?ELS38
ZERO? FLG \?CND39
SET 'FLG,HERE
PRINTI "[!! NO GOAL FOR "
CALL2 TELL-$WHERE,PERSON
PRINTI "]"
CRLF
?CND39: EQUAL? PERSON,CONDUCTOR,CUSTOMS-AGENT /?CND46
FCLEAR PERSON,TOUCHBIT
PUTP PERSON,P?LDESC,3
?CND46: CALL ZMEMQ,FLG,CAR-ROOMS-REST
ZERO? STACK /?CND49
EQUAL? PERSON,PLAYER /?ELS54
GETP PERSON,P?CAR
CALL OCCUPIED?,FLG,STACK
ZERO? STACK /?ELS54
CALL2 GOAL-REACHED,PERSON
RSTACK
?ELS54: CALL FIND-FLAG-LG,FLG,DOORBIT
FSET STACK,LOCKED
?CND49: CALL MOVE-PERSON,PERSON,FLG >FLG
RETURN FLG
?ELS38: CALL2 GOAL-REACHED,PERSON
RSTACK
?CND23: CALL FOLLOW-GOAL-NEXT,HERE,GOAL,PERSON >FLG
EQUAL? HERE,FLG \?CND61
GETP GOAL,P?OTHER
CALL FOLLOW-GOAL-NEXT,HERE,STACK,PERSON >FLG
?CND61: CALL MOVE-PERSON,PERSON,FLG
RSTACK
.FUNCT FOLLOW-GOAL-DIR,HERE,GOAL,PERSON=0,LINE,LOC
GETP GOAL,P?LINE >LINE
ZERO? LINE /FALSE
GETP HERE,P?LINE
EQUAL? LINE,STACK \FALSE
GETP HERE,P?STATION >LOC
EQUAL? HERE,LOC /?CND6
CALL DIR-FROM,HERE,LOC
RSTACK
?CND6: GETP GOAL,P?STATION >LOC
EQUAL? GOAL,LOC /?CND9
EQUAL? HERE,LOC \?ELS14
CALL DIR-FROM,HERE,GOAL
RSTACK
?ELS14: SET 'GOAL,LOC
?CND9: CALL FOLLOW-GOAL-NEXT,HERE,GOAL,PERSON >LOC
EQUAL? LOC,HERE \?CND17
GETP GOAL,P?OTHER
CALL FOLLOW-GOAL-NEXT,HERE,STACK,PERSON >LOC
?CND17: CALL DIR-FROM,HERE,LOC
RSTACK
.FUNCT FOLLOW-GOAL-NEXT,HERE,GOAL,PERSON=0,LINE,CNT=1,RM,GOAL-FLAG=0,LOC
ZERO? PERSON \?CND1
SET 'PERSON,GAME
?CND1: GETP GOAL,P?LINE
CALL2 GET-LINE,STACK >LINE
ZERO? LINE \?ELS6
PRINTI "[!! STUCK ("
PRINTD PERSON
PRINTI "): GOAL="
PRINTD GOAL
PRINTI "]"
CRLF
RETURN HERE
?ELS6: GETP HERE,P?LINE
CALL2 GET-LINE,STACK
EQUAL? LINE,STACK /?CND4
EQUAL? HERE,VESTIBULE-REAR,VESTIBULE-REAR-DINER /?THN16
EQUAL? HERE,OTHER-VESTIBULE-REAR,VESTIBULE-REAR-FANCY \?ELS13
?THN16: CALL2 ON-PLATFORM?,GOAL
ZERO? STACK /?ELS13
GETP PERSON,P?CAR
GET STATION-ROOMS,STACK >HERE
CALL MOVE-PERSON,PERSON,HERE
JUMP ?CND4
?ELS13: PRINTI "[!! STUCK: "
CALL TELL-$WHERE,PERSON,HERE
PRINTI "GOAL: "
CALL TELL-$WHERE,PERSON,GOAL
PRINTI "]"
CRLF
RETURN HERE
?CND4:
?PRG26: GET LINE,CNT >RM
EQUAL? RM,HERE \?ELS30
ZERO? GOAL-FLAG /?ELS33
SUB CNT,3
GET LINE,STACK >LOC
RETURN LOC
?ELS33: ADD CNT,3
GET LINE,STACK >LOC
RETURN LOC
?ELS30: EQUAL? RM,GOAL \?CND28
SET 'GOAL-FLAG,TRUE-VALUE
?CND28: ADD CNT,3 >CNT
JUMP ?PRG26
.FUNCT COR-GRAB-ATTENTION
CALL CORRIDOR-LOOK,FALSE-VALUE,FALSE-VALUE,TRUE-VALUE
RSTACK
.FUNCT CORRIDOR-LOOK,ITM=0,CAR=0,GRAB=0,C,Z,COR,VAL,FOUND=0
ZERO? ITM /?CND1
ZERO? CAR \?CND1
GETP ITM,P?CAR >CAR
?CND1: GETP HERE,P?CORRIDOR >C
ZERO? C /FALSE
LESS? C,0 \?ELS15
CALL CORRIDOR-CHECK,FALSE-VALUE,ITM,CAR,GRAB
RSTACK
?ELS15:
?PRG18: SUB C,16384 >Z
LESS? Z,0 /?ELS22
SET 'COR,COR-40000
JUMP ?CND20
?ELS22: SUB C,8192 >Z
LESS? Z,0 /?ELS24
SET 'COR,COR-20000
JUMP ?CND20
?ELS24: SUB C,4096 >Z
LESS? Z,0 /?ELS26
SET 'COR,COR-10000
JUMP ?CND20
?ELS26: SUB C,2048 >Z
LESS? Z,0 /?ELS28
SET 'COR,COR-4000
JUMP ?CND20
?ELS28: SUB C,1024 >Z
LESS? Z,0 /?ELS30
SET 'COR,COR-2000
JUMP ?CND20
?ELS30: SUB C,512 >Z
LESS? Z,0 /?ELS32
SET 'COR,COR-1000
JUMP ?CND20
?ELS32: SUB C,256 >Z
LESS? Z,0 /?ELS34
SET 'COR,COR-400
JUMP ?CND20
?ELS34: SUB C,128 >Z
LESS? Z,0 /?ELS36
SET 'COR,COR-200
JUMP ?CND20
?ELS36: SUB C,64 >Z
LESS? Z,0 /?ELS38
SET 'COR,COR-100
JUMP ?CND20
?ELS38: SUB C,32 >Z
LESS? Z,0 /?ELS40
SET 'COR,COR-40
JUMP ?CND20
?ELS40: SUB C,16 >Z
LESS? Z,0 /?ELS42
SET 'COR,COR-20
JUMP ?CND20
?ELS42: SUB C,8 >Z
LESS? Z,0 /?ELS44
SET 'COR,COR-10
JUMP ?CND20
?ELS44: SUB C,4 >Z
LESS? Z,0 /?ELS46
SET 'COR,COR-4
JUMP ?CND20
?ELS46: SUB C,2 >Z
LESS? Z,0 /?ELS48
SET 'COR,COR-2
JUMP ?CND20
?ELS48: SUB C,1 >Z
LESS? Z,0 /?REP19
SET 'COR,COR-1
?CND20: CALL CORRIDOR-CHECK,COR,ITM,CAR,GRAB >VAL
ZERO? FOUND \?CND53
SET 'FOUND,VAL
?CND53: SET 'C,Z
JUMP ?PRG18
?REP19: RETURN FOUND
.FUNCT CORRIDOR-CHECK,COR,ITM,CAR,GRAB=0,CNT=2,PAST=0,FOUND=0,RM=0,OBJ,DIR,NCAR=0,X,Y=0
ZERO? COR /?ORP4
PUSH COR
JUMP ?THN1
?ORP4: PUSH COR-1
?THN1: GET STACK,PAST >DIR
?PRG5: ZERO? COR /?ELS9
GET COR,CNT >RM
ZERO? RM \?CND7
CALL1 COR-TELL-PER
RETURN Y
?ELS9: EQUAL? HERE,ROOF,BESIDE-TRACKS \?ELS14
EQUAL? HERE,ROOF \?ELS17
SET 'RM,OTHER-ROOF
JUMP ?CND15
?ELS17: SET 'RM,OTHER-BESIDE-TRACKS
?CND15: ZERO? NCAR \?ELS22
SUB CAR-HERE,1 >NCAR
ZERO? NCAR \?CND7
SET 'PAST,1
ZERO? COR /?ORP29
PUSH COR
JUMP ?THN26
?ORP29: PUSH COR-1
?THN26: GET STACK,PAST >DIR
ADD CAR-HERE,1 >NCAR
JUMP ?CND7
?ELS22: ZERO? PAST \?ELS31
DEC 'NCAR
ZERO? NCAR \?CND7
SET 'PAST,1
ZERO? COR /?ORP38
PUSH COR
JUMP ?THN35
?ORP38: PUSH COR-1
?THN35: GET STACK,PAST >DIR
ADD CAR-HERE,1 >NCAR
JUMP ?CND7
?ELS31: INC 'NCAR
GRTR? NCAR,CAR-MAX \?CND7
CALL1 COR-TELL-PER
RETURN Y
?ELS14: ZERO? RM /?ELS45
CALL1 COR-TELL-PER
RETURN Y
?ELS45: EQUAL? HERE,VESTIBULE-REAR,VESTIBULE-REAR-DINER,VESTIBULE-REAR-FANCY \?ELS47
SET 'PAST,1
ZERO? COR /?ORP51
PUSH COR
JUMP ?THN48
?ORP51: PUSH COR-1
?THN48: GET STACK,PAST >DIR
ADD CAR-HERE,1 >NCAR
CALL2 V-FWD,NCAR >RM
JUMP ?CND7
?ELS47: EQUAL? HERE,VESTIBULE-FWD,VESTIBULE-FWD-DINER,VESTIBULE-FWD-FANCY \?CND7
SUB CAR-HERE,1 >NCAR
CALL2 V-REAR,NCAR >RM
?CND7: EQUAL? RM,HERE \?ELS56
SET 'PAST,1
ZERO? COR /?ORP62
PUSH COR
JUMP ?THN59
?ORP62: PUSH COR-1
?THN59: GET STACK,PAST >DIR
JUMP ?CND54
?ELS56: SET 'OBJ,RM
EQUAL? ITM,OBJ /?THN65
FIRST? RM >OBJ \?CND54
?THN65:
?PRG67: ZERO? ITM /?ELS71
EQUAL? OBJ,ITM \?CND69
ZERO? COR /?ELS77
GET COR,PAST >FOUND
JUMP ?REP68
?ELS77: EQUAL? NCAR,CAR \?CND69
GET COR-1,PAST >FOUND
JUMP ?REP68
?ELS71: ZERO? COR-ALL-DIRS \?THN84
EQUAL? DIR,PLAYER-NOT-FACING /?CND69
?THN84: EQUAL? OBJ,BRIEFCASE /?THN86
GETP OBJ,P?CHARACTER
ZERO? STACK /?CND69
?THN86: ZERO? COR \?THN88
GETP OBJ,P?CAR
EQUAL? NCAR,STACK \?CND69
?THN88: FSET? OBJ,NDESCBIT /?CND69
ZERO? GRAB \?THN90
CALL2 IN-MOTION?,OBJ
ZERO? STACK \?CND69
?THN90: ZERO? GRAB /?ELS94
CALL2 GRAB-ATTENTION,OBJ >X
ZERO? X /?CND95
FCLEAR OBJ,TOUCHBIT
PUTP OBJ,P?LDESC,21
CALL HE-SHE-IT,OBJ,TRUE-VALUE,STR?211
PRINTI " toward you."
CRLF
?CND95: ZERO? Y \?CND92
SET 'Y,X
JUMP ?CND92
?ELS94: CALL COR-ADD-PER,OBJ,DIR
ZERO? STACK /?ELS104
JUMP ?CND69
?ELS104: CALL HE-SHE-IT,OBJ,TRUE-VALUE,STR?1
CALL WHERE?,OBJ,DIR
PRINTI "."
CRLF
?CND92:
?CND69: NEXT? OBJ >OBJ /?KLU117
?KLU117: ZERO? OBJ \?PRG67
?REP68: ZERO? FOUND /?CND54
RETURN FOUND
?CND54: INC 'CNT
JUMP ?PRG5
.FUNCT COR-ADD-PER,PER,DIR,T,L
CALL ZMEMQ,DIR,COR-DIR-TBL >L
ZERO? L /FALSE
GET COR-PER-TBLS,L >T
GET T,0 >L
?PRG4: GET T,L
ZERO? STACK \?ELS8
PUT T,L,PER
RTRUE
?ELS8: DLESS? 'L,1 \?PRG4
RFALSE
.FUNCT COR-TELL-PER,TBL,LEN,T,L,FIRST,P,OP,NUM
SET 'TBL,COR-PER-TBLS
GET TBL,0 >LEN
?PRG1: GET TBL,LEN >T
GET T,0 >L
SET 'FIRST,TRUE-VALUE
SET 'NUM,0
?PRG3: GET T,L >P
ZERO? P /?CND5
SET 'OP,P
INC 'NUM
PUT T,L,0
ZERO? FIRST /?ELS10
SET 'FIRST,FALSE-VALUE
CALL2 START-SENTENCE,P
JUMP ?CND5
?ELS10: EQUAL? L,1 /?THN19
SUB L,1
GET T,STACK
ZERO? STACK \?ELS18
?THN19: PRINTI " and"
JUMP ?CND16
?ELS18: PRINTI ","
?CND16: CALL2 PRINTT,P
CALL2 THIS-IS-IT,P
?CND5: DLESS? 'L,1 \?PRG3
ZERO? NUM \?ELS34
JUMP ?REP4
?ELS34: EQUAL? NUM,1 \?ELS36
FSET? OP,PLURALBIT /?ELS36
PRINTI " is"
JUMP ?CND32
?ELS36: PRINTI " are"
?CND32: GET COR-DIR-TBL,LEN
CALL WHERE?,OP,STACK
PRINTI "."
CRLF
?REP4: DLESS? 'LEN,1 \?PRG1
RTRUE
.FUNCT IN-MOTION?,PERSON,DISABLED-OK=0,GT,L,F,C,?TMP1
EQUAL? PERSON,BOND /TRUE
GETP PERSON,P?CHARACTER >C
EQUAL? EXTRA-C,C \?CND4
GET GLOBAL-CHARACTER-TABLE,C
EQUAL? PERSON,STACK \FALSE
ZERO? DISABLED-OK \TRUE
?CND4: GET GOAL-TABLES,C >GT
GET GT,GOAL-S
ZERO? STACK /FALSE
LOC PERSON >L
GET GT,GOAL-F >F
EQUAL? L,F /FALSE
ZERO? DISABLED-OK \TRUE
GET GT,GOAL-ENABLE
ZERO? STACK /FALSE
CALL FOLLOW-GOAL-DIR,L,F,PERSON
RSTACK
.FUNCT START-MOVEMENT
CALL2 I-EXTRA,M-OTHER
RANDOM 9
CALL QUEUE,I-STAR,STACK
PUT STACK,0,1
CALL QUEUE,G-LEAVE-TRAIN,0
CALL QUEUE,I-CONDUCTOR,1
PUT STACK,0,1
CALL QUEUE,I-FOLLOW,-1
PUT STACK,0,1
CALL QUEUE,I-ATTENTION,-1
PUT STACK,0,1
CALL QUEUE,I-LEAVE-TRAIN,0
CALL QUEUE,I-TICKETS-PLEASE,-1
PUT STACK,0,1
RTRUE
.FUNCT ESTABLISH-GOAL,PERSON,GOAL,WALK-TRAIN=0,HERE,HL,GL,GT,?TMP1
ZERO? PERSON \?CND1
PRINTI "[!! E-G: PERSON=0, GOAL="
PRINTD GOAL
PRINTI ", W-T="
PRINTN WALK-TRAIN
PRINTI ".]"
CRLF
?CND1: LOC PERSON >HERE
GETP PERSON,P?CHARACTER
GET GOAL-TABLES,STACK >GT
GETP HERE,P?LINE
SUB STACK,1
MUL STACK,GOAL-I-MULTIPLIER >?TMP1
GETP GOAL,P?LINE
SUB STACK,1
MUL STACK,2
ADD ?TMP1,STACK
PUT GT,GOAL-I,STACK
GETP GOAL,P?STATION
PUT GT,GOAL-S,STACK
PUT GT,GOAL-F,GOAL
EQUAL? 2,WALK-TRAIN \?CND6
GET GT,GOAL-SCRIPT
PUT GT,GOAL-FUNCTION,STACK
?CND6: ZERO? WALK-TRAIN \?CND9
EQUAL? PERSON,CONDUCTOR,CUSTOMS-AGENT /?CND9
FCLEAR PERSON,TOUCHBIT
PUTP PERSON,P?LDESC,13
?CND9: LOC PERSON
RSTACK
.FUNCT ESTABLISH-GOAL-TRAIN,PERSON,GOAL,CAR,GT,CARH
LOC PERSON
EQUAL? STACK,BESIDE-TRACKS,OTHER-BESIDE-TRACKS /?THN4
LOC PERSON
CALL ZMEMQ,STACK,STATION-ROOMS
ZERO? STACK /?CND1
?THN4: PRINTI "[!! "
PRINTD PERSON
PRINTR " not on train!]"
?CND1: GETP PERSON,P?CAR >CARH
GETP PERSON,P?CHARACTER
GET GOAL-TABLES,STACK >GT
EQUAL? CAR,CARH /?ELS10
PUT GT,GOAL-CAR,CAR
PUT GT,GOAL-QUEUED,GOAL
PUT GT,GOAL-FUNCTION,I-WALK-TRAIN
LESS? CAR,CARH \?ELS13
CALL2 L-FWD,CARH >GOAL
JUMP ?CND8
?ELS13: CALL2 L-REAR,CARH >GOAL
JUMP ?CND8
?ELS10: GET GT,GOAL-SCRIPT
PUT GT,GOAL-FUNCTION,STACK
EQUAL? CAR,CAR-HERE,DINER-CAR,FANCY-CAR /?CND8
GETP GOAL,P?OTHER >GOAL
?CND8: CALL ESTABLISH-GOAL,PERSON,GOAL
RSTACK
.FUNCT GOAL-REACHED,PERSON,GT
GETP PERSON,P?CHARACTER
GET GOAL-TABLES,STACK >GT
EQUAL? PERSON,CONDUCTOR,CUSTOMS-AGENT,BAD-SPY /?CND1
GET GT,GOAL-FUNCTION
EQUAL? I-WALK-TRAIN,STACK /?CND1
CALL2 NEW-LDESC,PERSON
?CND1: LOC PERSON
EQUAL? STACK,BOOTH-1,BOOTH-2,BOOTH-3 \?CND6
EQUAL? HERE,PANTRY \?ELS11
PRINTI "A concealed bell tinkles merrily."
CRLF
JUMP ?CND6
?ELS11: IN? WAITER,PANTRY \?CND6
LOC PERSON
CALL ESTABLISH-GOAL,WAITER,STACK
?CND6: GET GT,GOAL-S
ZERO? STACK /FALSE
PUT GT,GOAL-S,FALSE-VALUE
SET 'GOAL-PERSON,PERSON
GET GT,GOAL-FUNCTION
CALL D-APPLY,STR?314,STACK,G-REACHED
RSTACK
.FUNCT ENTERS?,DIR,OWHERE
EQUAL? DIR,P?IN /TRUE
CALL ZMEMQ,HERE,CAR-ROOMS-CORRID
ZERO? STACK /FALSE
CALL ZMEMQ,OWHERE,CAR-ROOMS-COMPS
ZERO? STACK \TRUE
EQUAL? OWHERE,BOOTH-1,BOOTH-2,BOOTH-3 /TRUE
CALL ZMEMQ,OWHERE,CAR-ROOMS-REST
ZERO? STACK \TRUE
RFALSE
.FUNCT TELL-THE-NOT-OTHER,RM
CALL ZMEMQ,RM,STATION-ROOMS
ZERO? STACK \?THN6
CALL ZMEMQ,RM,CAR-ROOMS-DINER
ZERO? STACK \?THN6
CALL ZMEMQ,RM,CAR-ROOMS-FANCY
ZERO? STACK \?THN6
CALL ZMEMQ,RM,CAR-ROOMS
ZERO? STACK /?ELS5
?THN6: CALL2 PRINTT,RM
RSTACK
?ELS5: GETP RM,P?OTHER
CALL2 PRINTT,STACK
RSTACK
.FUNCT DESCRIBE-MOVER?,PERSON
EQUAL? PRSA,V?EXAMINE \?ELS5
EQUAL? PRSO,PERSON /FALSE
?ELS5: EQUAL? PRSA,V?WAIT-UNTIL,V?WAIT-FOR /FALSE
FSET? PERSON,ONBIT \FALSE
EQUAL? PERSON,CONDUCTOR \TRUE
GETP PERSON,P?LDESC
EQUAL? STACK,19 /FALSE
RTRUE
.FUNCT MOVE-PERSON,PERSON,WHERE,LIMBO?=0,DIR,GT=0,OL,COR,PCOR,CHR,OWHERE,DOOR=0,VAL=0,X,CAR,NCAR
GETP PERSON,P?CHARACTER >CHR
GETP PERSON,P?CAR >CAR
SET 'NCAR,CAR
GET GOAL-TABLES,CHR >GT
LOC PERSON >OL
CALL DIR-FROM,OL,WHERE >DIR
SET 'OWHERE,WHERE
EQUAL? OL,VESTIBULE-FWD,VESTIBULE-FWD-DINER /?THN7
EQUAL? OL,OTHER-VESTIBULE-FWD,VESTIBULE-FWD-FANCY \?ELS6
?THN7: EQUAL? WHERE,LIMBO-FWD,LIMBO-FWD-FANCY /?THN12
EQUAL? WHERE,OTHER-LIMBO-FWD,LIMBO-FWD-DINER \?CND4
?THN12: DEC 'NCAR
CALL2 V-REAR,NCAR >OWHERE
JUMP ?CND4
?ELS6: EQUAL? OL,VESTIBULE-REAR,VESTIBULE-REAR-DINER /?THN16
EQUAL? OL,OTHER-VESTIBULE-REAR,VESTIBULE-REAR-FANCY \?CND4
?THN16: EQUAL? WHERE,LIMBO-REAR,LIMBO-REAR-FANCY /?THN21
EQUAL? WHERE,OTHER-LIMBO-REAR,LIMBO-REAR-DINER \?CND4
?THN21: INC 'NCAR
CALL2 V-FWD,NCAR >OWHERE
?CND4: ZERO? DIR /?CND23
GETPT OL,DIR >X
ZERO? X /?CND23
PTSIZE X
EQUAL? STACK,DEXIT \?CND23
GET X,DEXITOBJ >DOOR
?CND23: EQUAL? PERSON,PLAYER \?ELS30
CALL COMPASS-EQV,HERE,DIR >OL
ZERO? OL /?CND31
CALL2 OPP-DIR,OL >PLAYER-NOT-FACING
?CND31: ZERO? DOOR /?CND28
CALL2 WALK-THRU-DOOR?,X
ZERO? STACK \?CND28
CRLF
RETURN 2
?ELS30: FSET? PERSON,NDESCBIT \?ELS42
JUMP ?CND28
?ELS42: CALL PREVENTS-YOU?,OL,DIR,PERSON
ZERO? STACK /?ELS44
CALL2 VISIBLE?,PERSON
ZERO? STACK /?CND28
SET 'VAL,TRUE-VALUE
CALL HE-SHE-IT,CONDUCTOR,TRUE-VALUE
PRINTI " prevents"
CALL2 PRINTT,PERSON
PRINTI " from passing him."
CRLF
JUMP ?CND28
?ELS44: EQUAL? OL,HERE \?ELS51
CALL2 DESCRIBE-MOVER?,PERSON
ZERO? STACK /?CND52
FCLEAR PERSON,ONBIT
CALL DESCRIBE-OBJECT,PERSON,0
?CND52: SET 'VAL,TRUE-VALUE
IN? BRIEFCASE,PERSON \?ELS57
FSET? BRIEFCASE,SEENBIT /?ELS57
CALL START-SENTENCE,PERSON,TRUE-VALUE
JUMP ?CND55
?ELS57: CALL HE-SHE-IT,PERSON,TRUE-VALUE
?CND55: EQUAL? PERSON,CONDUCTOR \?CND64
ZERO? TOUCH-CAP? /?CND64
SET 'TOUCH-CAP?,FALSE-VALUE
PRINTI " touches a finger to his cap and"
?CND64: ZERO? DOOR /?CND71
CALL HE-SHE-IT,PERSON,-1,STR?12
CALL2 HIM-HER-IT,DOOR
PRINTI " for a moment and"
?CND71: EQUAL? DIR,P?OUT /?THN80
CALL ZMEMQ,HERE,CAR-ROOMS-COMPS
ZERO? STACK \?THN80
EQUAL? HERE,BOOTH-1,BOOTH-2,BOOTH-3 \?ELS79
?THN80: CALL HE-SHE-IT,PERSON,-1,STR?315
PRINTI "."
CRLF
JUMP ?CND28
?ELS79: CALL ENTERS?,DIR,OWHERE
ZERO? STACK /?ELS85
CALL HE-SHE-IT,PERSON,-1,STR?316
CALL2 TELL-THE-NOT-OTHER,OWHERE
ZERO? DOOR /?CND90
FSET? DOOR,LOCKED \?CND90
PRINTI ", locking the door"
?CND90: PRINTI "."
CRLF
JUMP ?CND28
?ELS85: EQUAL? CAR,CAR-MAX \?ELS100
EQUAL? OL,VESTIBULE-REAR \?ELS100
EQUAL? WHERE,LIMBO-REAR \?ELS100
CALL HE-SHE-IT,PERSON,-1,STR?317
CALL HIM-HER-IT,PERSON,FALSE-VALUE,TRUE-VALUE
PRINTI " pocket for a minute."
CRLF
JUMP ?CND28
?ELS100: CALL HE-SHE-IT,PERSON,-1,STR?318
PRINTC 32
EQUAL? DIR,P?UP,P?DOWN /?CND109
PRINTI "off to "
?CND109: CALL2 DIR-PRINT,DIR
ZERO? DOOR /?CND114
FSET? DOOR,LOCKED \?CND114
PRINTI ", locking the door"
?CND114: PRINTI "."
CRLF
JUMP ?CND28
?ELS51: EQUAL? OWHERE,HERE \?ELS124
ZERO? GT /?THN128
GET GT,GOAL-F
EQUAL? HERE,STACK /?CND28
?THN128: ZERO? TICKETS-PUNCHED? /?ELS136
ZERO? CUSTOMS-SWEEP /?THN133
?ELS136: EQUAL? PERSON,CONDUCTOR /?CND28
?THN133: SET 'VAL,TRUE-VALUE
CALL START-SENTENCE,PERSON,TRUE-VALUE
ZERO? DOOR /?CND137
CALL HE-SHE-IT,PERSON,-1,STR?12
CALL2 HIM-HER-IT,DOOR
PRINTI " for a moment and"
?CND137: CALL HE-SHE-IT,PERSON,-1,STR?319
PRINTC 32
EQUAL? PRSA,V?WALK \?ELS147
EQUAL? OL,LAST-PLAYER-LOC \?ELS147
PRINTI "along with you"
JUMP ?CND145
?ELS147: PRINTI "past you"
EQUAL? DIR,P?IN,P?OUT /?CND145
PRINTI " from "
CALL2 OPP-DIR,DIR
CALL2 DIR-PRINT,STACK
?CND145: PRINTI "."
CRLF
JUMP ?CND28
?ELS124: GETP HERE,P?CORRIDOR >COR
ZERO? COR /?CND28
CALL CORRIDOR-LOOK,PERSON,CAR >PCOR
EQUAL? PCOR,FALSE-VALUE,PLAYER-NOT-FACING /?ELS167
CALL CORRIDOR-LOOK,OWHERE,NCAR
EQUAL? STACK,FALSE-VALUE,PLAYER-NOT-FACING \?ELS170
SET 'VAL,TRUE-VALUE
EQUAL? PERSON,P-HER-OBJECT \?ELS173
FSET? HER,TOUCHBIT \?ELS173
PRINTI "She"
JUMP ?CND171
?ELS173: EQUAL? PERSON,P-HIM-OBJECT \?ELS179
FSET? HIM,TOUCHBIT \?ELS179
PRINTI "He"
JUMP ?CND171
?ELS179: EQUAL? PERSON,P-THEM-OBJECT \?ELS185
FSET? THEM,TOUCHBIT \?ELS185
PRINTI "They"
JUMP ?CND171
?ELS185: CALL START-SENTENCE,PERSON,TRUE-VALUE
ZERO? STACK \?CND192
PRINTI ","
?CND192: CALL WHERE?,PERSON,PCOR
PRINTI ","
?CND171: ZERO? DOOR /?CND199
CALL HE-SHE-IT,PERSON,-1,STR?12
CALL2 HIM-HER-IT,DOOR
PRINTI " for a moment and"
?CND199: CALL ENTERS?,DIR,OWHERE
ZERO? STACK /?ELS207
CALL HE-SHE-IT,PERSON,-1,STR?316
CALL2 TELL-THE-NOT-OTHER,OWHERE
JUMP ?CND205
?ELS207: CALL HE-SHE-IT,PERSON,-1,STR?320
PRINTC 32
EQUAL? DIR,P?UP,P?DOWN /?CND216
PRINTI "to "
?CND216: CALL2 DIR-PRINT,DIR
?CND205: ZERO? DOOR /?CND221
FSET? DOOR,LOCKED \?CND221
PRINTI ", locking the door"
?CND221: PRINTI "."
CRLF
JUMP ?CND165
?ELS170: SET 'VAL,TRUE-VALUE
CALL START-SENTENCE,PERSON,TRUE-VALUE
CALL HE-SHE-IT,PERSON,-1,STR?1
CALL WHERE?,PERSON,PCOR
PRINTI ", heading "
EQUAL? PCOR,DIR \?ELS238
PRINTI "away from you"
JUMP ?CND236
?ELS238: CALL2 OPP-DIR,DIR
EQUAL? PCOR,STACK \?ELS242
PRINTI "toward you"
JUMP ?CND236
?ELS242: EQUAL? DIR,P?UP,P?DOWN /?CND247
PRINTI "toward "
?CND247: CALL2 DIR-PRINT,DIR
?CND236: PRINTI "."
CRLF
JUMP ?CND165
?ELS167: CALL CORRIDOR-LOOK,OWHERE,NCAR >PCOR
EQUAL? PCOR,FALSE-VALUE,PLAYER-NOT-FACING /?CND28
SET 'VAL,TRUE-VALUE
CALL WHERE?,PERSON,PCOR,TRUE-VALUE
CALL2 HE-SHE-IT,PERSON
IN? BRIEFCASE,PERSON \?CND258
FSET? BRIEFCASE,SEENBIT /?CND258
FSET BRIEFCASE,SEENBIT
PRINTI ", carrying"
CALL2 HIM-HER-IT,BRIEFCASE
PRINTI ","
?CND258: CALL HE-SHE-IT,PERSON,-1,STR?321
CALL DIR-FROM,OWHERE,OL >DIR
EQUAL? DIR,P?IN /?CND267
PRINTI " from"
CALL2 TELL-THE-NOT-OTHER,OL
?CND267: PRINTI "."
CRLF
?CND165:
?CND28: ZERO? PERSON \?ELS276
PRINTI "[PERSON=0!]"
CRLF
JUMP ?CND274
?ELS276: CALL2 ON-PLATFORM?,WHERE
ZERO? STACK /?CND281
GETP WHERE,P?CAR
PUTP PERSON,P?CAR,STACK
?CND281: MOVE PERSON,WHERE
?CND274: EQUAL? PERSON,PLAYER /?CND284
EQUAL? PERSON,PEEKER /?THN290
EQUAL? PERSON,BAD-SPY \?ELS289
ZERO? BAD-SPY-DONE-PEEKING \?ELS289
?THN290: PUTP PERSON,P?LDESC,PEEKING-CODE
JUMP ?CND284
?ELS289: EQUAL? PERSON,CONDUCTOR,CUSTOMS-AGENT /?CND284
PUTP PERSON,P?LDESC,14
?CND284: ZERO? GT /?CND296
GET GT,GOAL-F
EQUAL? STACK,WHERE \?ELS302
CALL2 GOAL-REACHED,PERSON >VAL
ZERO? VAL \?CND300
GET GT,GOAL-FUNCTION
EQUAL? I-WALK-TRAIN,STACK /?CND300
EQUAL? HERE,WHERE \?CND300
FSET? PERSON,NDESCBIT /?CND300
SET 'VAL,TRUE-VALUE
CALL HE-SHE-IT,PERSON,TRUE-VALUE,STR?210
PRINTI " here."
CRLF
JUMP ?CND300
?ELS302: SET 'GOAL-PERSON,PERSON
GET GT,GOAL-FUNCTION
CALL D-APPLY,STR?322,STACK,G-ENROUTE >VAL
?CND300:
?CND296: ZERO? DEBUG /?CND312
PRINTI "["
CALL TELL-$WHERE,PERSON,WHERE
PRINTI "]"
CRLF
?CND312: ZERO? VAL /?CND320
CALL2 THIS-IS-IT,PERSON
RETURN VAL
?CND320: RETURN VAL
.FUNCT DIR-FROM,HERE,THERE,V=0,P,D
CALL2 ON-PLATFORM?,HERE >P
CALL2 ON-PLATFORM?,THERE >D
ZERO? P /?ELS3
ZERO? D /?ELS3
LESS? P,D \?ELS8
RETURN P?SOUTH
?ELS8: GRTR? P,D \FALSE
RETURN P?NORTH
?ELS3: EQUAL? THERE,ROOF,OTHER-ROOF \?ELS14
EQUAL? HERE,VESTIBULE-REAR-FANCY /?THN17
EQUAL? HERE,VESTIBULE-REAR,VESTIBULE-REAR-DINER,OTHER-VESTIBULE-REAR \?ELS14
?THN17: RETURN P?UP
?ELS14: EQUAL? HERE,ROOF,OTHER-ROOF \?ELS20
EQUAL? THERE,VESTIBULE-REAR-FANCY /?THN23
EQUAL? THERE,VESTIBULE-REAR,VESTIBULE-REAR-DINER,OTHER-VESTIBULE-REAR \?ELS20
?THN23: RETURN P?DOWN
?ELS20: ZERO? P \?THN29
EQUAL? HERE,BESIDE-TRACKS,OTHER-BESIDE-TRACKS \?ELS26
?THN29: EQUAL? THERE,VESTIBULE-REAR-FANCY /?THN31
EQUAL? THERE,VESTIBULE-REAR,VESTIBULE-REAR-DINER,OTHER-VESTIBULE-REAR \?ELS26
?THN31: RETURN P?UP
?ELS26: ZERO? D \?THN37
EQUAL? THERE,BESIDE-TRACKS,OTHER-BESIDE-TRACKS \?ELS34
?THN37: EQUAL? HERE,VESTIBULE-REAR-FANCY /?THN39
EQUAL? HERE,VESTIBULE-REAR,VESTIBULE-REAR-DINER,OTHER-VESTIBULE-REAR \?ELS34
?THN39: RETURN P?DOWN
?ELS34: EQUAL? HERE,VESTIBULE-FWD-DINER,VESTIBULE-FWD-FANCY,VESTIBULE-FWD \?THN47
EQUAL? THERE,VESTIBULE-REAR-FANCY,VESTIBULE-REAR /?THN47
EQUAL? THERE,VESTIBULE-REAR-DINER,OTHER-VESTIBULE-REAR /?THN47
EQUAL? THERE,LIMBO-FWD-DINER,LIMBO-FWD-FANCY,LIMBO-FWD /?THN43
?THN47: EQUAL? HERE,OTHER-VESTIBULE-FWD \?ELS42
EQUAL? THERE,OTHER-LIMBO-FWD \?ELS42
?THN43: RETURN P?NORTH
?ELS42: EQUAL? HERE,VESTIBULE-REAR-DINER,VESTIBULE-REAR-FANCY,VESTIBULE-REAR \?THN57
EQUAL? THERE,VESTIBULE-FWD-FANCY,VESTIBULE-FWD /?THN57
EQUAL? THERE,VESTIBULE-FWD-DINER,OTHER-VESTIBULE-FWD /?THN57
EQUAL? THERE,LIMBO-REAR-DINER,LIMBO-REAR-FANCY,LIMBO-REAR /?THN53
?THN57: EQUAL? HERE,OTHER-VESTIBULE-REAR \?CND1
EQUAL? THERE,OTHER-LIMBO-REAR \?CND1
?THN53: RETURN P?SOUTH
?CND1: CALL DIR-FROM-TEST,HERE,THERE,P?IN
ZERO? STACK /?ELS63
RETURN P?IN
?ELS63: CALL DIR-FROM-TEST,HERE,THERE,P?OUT
ZERO? STACK /?CND61
RETURN P?OUT
?CND61: SET 'P,0
?PRG66: NEXTP HERE,P >P
LESS? P,LOW-DIRECTION \?ELS70
RETURN V
?ELS70: CALL DIR-FROM-TEST,HERE,THERE,P >D
ZERO? D /?PRG66
LESS? D,LOW-DIRECTION \?ELS75
ZERO? V \?ELS75
SET 'V,P
JUMP ?PRG66
?ELS75: RETURN P
.FUNCT DIR-FROM-TEST,HERE,THERE,P,L,TBL
GETPT HERE,P >TBL
ZERO? TBL /FALSE
PTSIZE TBL >L
EQUAL? L,DEXIT,UEXIT,CEXIT \FALSE
GET TBL,REXIT
EQUAL? STACK,THERE \FALSE
RETURN P
.FUNCT I-FOLLOW,GARG=0,FLG=0,CNT=0,GT,VAL
ZERO? IDEBUG \?THN4
EQUAL? GARG,G-DEBUG \?CND1
?THN4: PRINTI "[I-FOLLOW:"
EQUAL? GARG,G-DEBUG /FALSE
?CND1:
?PRG11: IGRTR? 'CNT,CHARACTER-MAX \?ELS15
JUMP ?REP12
?ELS15: GET GOAL-TABLES,CNT >GT
GET GT,GOAL-S
ZERO? STACK /?PRG11
GET GT,GOAL-ENABLE
ZERO? STACK /?PRG11
GET CHARACTER-TABLE,CNT
CALL2 FOLLOW-GOAL,STACK >VAL
ZERO? VAL /?PRG11
EQUAL? FLG,M-FATAL /?PRG11
SET 'FLG,VAL
JUMP ?PRG11
?REP12: ZERO? IDEBUG /?CND28
PRINTN FLG
PRINTI "]"
CRLF
RETURN FLG
?CND28: RETURN FLG
.FUNCT I-PLAYER,ARG,VAL
LOC PLAYER >HERE
CALL ZMEMQ,HERE,STATION-ROOMS
ZERO? STACK /?CND1
GETP HERE,P?CAR
CALL NEXT-CAR-SWITCHEROO,CAR-HERE,STACK
?CND1: EQUAL? ARG,G-ENROUTE \?ELS8
CALL FIND-FLAG-HERE-NOT,PERSONBIT,NDESCBIT,PLAYER >VAL
ZERO? VAL /FALSE
EQUAL? NOW-LURCHING,PRESENT-TIME /?THN16
RANDOM 100
LESS? 50,STACK /FALSE
?THN16: GETP VAL,P?LDESC
ZERO? STACK \?CND18