|
|
1.1 root 1: C OAPPLI- OBJECT SPECIAL ACTION ROUTINES
2: C
3: C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
4: C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
5: C WRITTEN BY R. M. SUPNIK
6: C
7: C DECLARATIONS
8: C
9: LOGICAL FUNCTION OAPPLI(RI,ARG)
10: IMPLICIT INTEGER (A-Z)
11: LOGICAL SOBJS,NOBJS
12: LOGICAL QOPEN,QON,LIT
13: LOGICAL MOVETO,RMDESC,CLOCKD
14: LOGICAL THIEFP,CYCLOP,TROLLP,BALLOP,LIGHTP
15: LOGICAL QEMPTY,QHERE,F,OPNCLS
16: #include "parser.h"
17: #include "gamestate.h"
18: #include "state.h"
19: C
20: COMMON /BATS/ BATDRP(9)
21: C
22: C PUZZLE ROOM
23: C
24: COMMON /PUZZLE/ CPDR(16),CPWL(8),CPVEC(64)
25: #include "rooms.h"
26: #include "rflag.h"
27: #include "rindex.h"
28: #include "objects.h"
29: #include "oflags.h"
30: #include "oindex.h"
31: #include "clock.h"
32:
33: #include "advers.h"
34: #include "verbs.h"
35: #include "flags.h"
36: C
37: C FUNCTIONS AND DATA
38: C
39: QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0
40: QON(R)=and(OFLAG1(R),ONBT).NE.0
41: DATA MXSMP/99/
42: C OAPPLI, PAGE 2
43: C
44: IF(RI.EQ.0) GO TO 10
45: C !ZERO IS FALSE APP.
46: IF(RI.LE.MXSMP) GO TO 100
47: C !SIMPLE OBJECT?
48: IF(PRSO.GT.220) GO TO 5
49: IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
50: 5 IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
51: AV=AVEHIC(WINNER)
52: FLOBTS=FLAMBT+LITEBT+ONBT
53: OAPPLI=.TRUE.
54: C
55: GO TO (2000,5000,10000,11000,12000,15000,18000,
56: & 19000,20000,22000,25000,26000,32000,35000,39000,40000,
57: & 45000,47000,48000,49000,50000,51000,52000,54000,55000,
58: & 56000,57000,58000,59000,60000,61000,62000),
59: & (RI-MXSMP)
60: CALL BUG(6,RI)
61: C
62: C RETURN HERE TO DECLARE FALSE RESULT
63: C
64: 10 OAPPLI=.FALSE.
65: RETURN
66: C
67: C SIMPLE OBJECTS, PROCESSED EXTERNALLY.
68: C
69: 100 IF(RI.LT.32) OAPPLI=SOBJS(RI,ARG)
70: IF(RI.GE.32) OAPPLI=NOBJS(RI,ARG)
71: RETURN
72: C OAPPLI, PAGE 3
73: C
74: C O100-- MACHINE FUNCTION
75: C
76: 2000 IF(HERE.NE.MMACH) GO TO 10
77: C !NOT HERE? F
78: OAPPLI=OPNCLS(MACHI,123,124)
79: C !HANDLE OPN/CLS.
80: RETURN
81: C
82: C O101-- WATER FUNCTION
83: C
84: 5000 IF(PRSA.NE.FILLW) GO TO 5050
85: C !FILL X WITH Y IS
86: PRSA=PUTW
87: C !MADE INTO
88: I=PRSI
89: PRSI=PRSO
90: PRSO=I
91: C !PUT Y IN X.
92: I=ODI2
93: ODI2=ODO2
94: ODO2=I
95: 5050 IF((PRSO.EQ.WATER).OR.(PRSO.EQ.GWATE)) GO TO 5100
96: CALL RSPEAK(561)
97: C !WATER IS IND OBJ,
98: RETURN
99: C !PUNT.
100: C
101: 5100 IF(PRSA.NE.TAKEW) GO TO 5400
102: C !TAKE WATER?
103: IF((OADV(BOTTL).EQ.WINNER).AND.(OCAN(PRSO).NE.BOTTL))
104: & GO TO 5500
105: IF(OCAN(PRSO).EQ.0) GO TO 5200
106: C !INSIDE ANYTHING?
107: IF(QOPEN(OCAN(PRSO))) GO TO 5200
108: C !YES, OPEN?
109: CALL RSPEAK(525,ODESC2(OCAN(PRSO)))
110: C !INSIDE, CLOSED, PUNT.
111: RETURN
112: C
113: 5200 CALL RSPEAK(615)
114: C !NOT INSIDE OR OPEN,
115: RETURN
116: C !SLIPS THRU FINGERS.
117: C
118: 5400 IF(PRSA.NE.PUTW) GO TO 5700
119: C !PUT WATER IN X?
120: IF((AV.NE.0).AND.(PRSI.EQ.AV)) GO TO 5800
121: C !IN VEH?
122: IF(PRSI.EQ.BOTTL) GO TO 5500
123: C !IN BOTTLE?
124: CALL RSPSUB(297,ODI2)
125: C !WONT GO ELSEWHERE.
126: CALL NEWSTA(PRSO,0,0,0,0)
127: C !VANISH WATER.
128: RETURN
129: C
130: 5500 IF(QOPEN(BOTTL)) GO TO 5550
131: C !BOTTLE OPEN?
132: CALL RSPEAK(612)
133: C !NO, LOSE.
134: RETURN
135: C
136: 5550 IF(QEMPTY(BOTTL)) GO TO 5600
137: C !OPEN, EMPTY?
138: CALL RSPEAK(613)
139: C !NO, ALREADY FULL.
140: RETURN
141: C
142: 5600 CALL NEWSTA(WATER,614,0,BOTTL,0)
143: C !TAKE WATER TO BOTTLE.
144: RETURN
145: C
146: 5700 IF((PRSA.NE.DROPW).AND.(PRSA.NE.POURW).AND.
147: & (PRSA.NE.GIVEW)) GO TO 5900
148: IF(AV.NE.0) GO TO 5800
149: C !INTO VEHICLE?
150: CALL NEWSTA(PRSO,133,0,0,0)
151: C !NO, VANISHES.
152: RETURN
153: C
154: 5800 CALL NEWSTA(WATER,0,0,AV,0)
155: C !WATER INTO VEHICLE.
156: CALL RSPSUB(296,ODESC2(AV))
157: C !DESCRIBE.
158: RETURN
159: C
160: 5900 IF(PRSA.NE.THROWW) GO TO 10
161: C !LAST CHANCE, THROW?
162: CALL NEWSTA(PRSO,132,0,0,0)
163: C !VANISHES.
164: RETURN
165: C OAPPLI, PAGE 4
166: C
167: C O102-- LEAF PILE
168: C
169: 10000 IF(PRSA.NE.BURNW) GO TO 10500
170: C !BURN?
171: IF(OROOM(PRSO).EQ.0) GO TO 10100
172: C !WAS HE CARRYING?
173: CALL NEWSTA(PRSO,158,0,0,0)
174: C !NO, BURN IT.
175: RETURN
176: C
177: 10100 CALL NEWSTA(PRSO,0,HERE,0,0)
178: C !DROP LEAVES.
179: CALL JIGSUP(159)
180: C !BURN HIM.
181: RETURN
182: C
183: 10500 IF(PRSA.NE.MOVEW) GO TO 10600
184: C !MOVE?
185: CALL RSPEAK(2)
186: C !DONE.
187: RETURN
188: C
189: 10600 IF((PRSA.NE.LOOKUW).OR.(RVCLR.NE.0)) GO TO 10
190: CALL RSPEAK(344)
191: C !LOOK UNDER?
192: RETURN
193: C
194: C O103-- TROLL, DONE EXTERNALLY.
195: C
196: 11000 OAPPLI=TROLLP(ARG)
197: C !TROLL PROCESSOR.
198: RETURN
199: C
200: C O104-- RUSTY KNIFE.
201: C
202: 12000 IF(PRSA.NE.TAKEW) GO TO 12100
203: C !TAKE?
204: IF(OADV(SWORD).EQ.WINNER) CALL RSPEAK(160)
205: C !PULSE SWORD.
206: GO TO 10
207: C
208: 12100 IF((((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW)).OR.
209: & (PRSI.NE.RKNIF)).AND.
210: & (((PRSA.NE.SWINGW).AND.(PRSA.NE.THROWW)).OR.
211: & (PRSO.NE.RKNIF))) GO TO 10
212: CALL NEWSTA(RKNIF,0,0,0,0)
213: C !KILL KNIFE.
214: CALL JIGSUP(161)
215: C !KILL HIM.
216: RETURN
217: C OAPPLI, PAGE 5
218: C
219: C O105-- GLACIER
220: C
221: 15000 IF(PRSA.NE.THROWW) GO TO 15500
222: C !THROW?
223: IF(PRSO.NE.TORCH) GO TO 15400
224: C !TORCH?
225: CALL NEWSTA(ICE,169,0,0,0)
226: C !MELT ICE.
227: ODESC1(TORCH)=174
228: C !MUNG TORCH.
229: ODESC2(TORCH)=173
230: OFLAG1(TORCH)=and(OFLAG1(TORCH), not(FLOBTS))
231: CALL NEWSTA(TORCH,0,STREA,0,0)
232: C !MOVE TORCH.
233: GLACRF=.TRUE.
234: C !GLACIER GONE.
235: IF(.NOT.LIT(HERE)) CALL RSPEAK(170)
236: C !IN DARK?
237: RETURN
238: C
239: 15400 CALL RSPEAK(171)
240: C !JOKE IF NOT TORCH.
241: RETURN
242: C
243: 15500 IF((PRSA.NE.MELTW).OR.(PRSO.NE.ICE)) GO TO 10
244: IF(and(OFLAG1(PRSI),FLOBTS).EQ.FLOBTS) GO TO 15600
245: CALL RSPSUB(298,ODI2)
246: C !CANT MELT WITH THAT.
247: RETURN
248: C
249: 15600 GLACMF=.TRUE.
250: C !PARTIAL MELT.
251: IF(PRSI.NE.TORCH) GO TO 15700
252: C !MELT WITH TORCH?
253: ODESC1(TORCH)=174
254: C !MUNG TORCH.
255: ODESC2(TORCH)=173
256: OFLAG1(TORCH)=and(OFLAG1(TORCH), not(FLOBTS))
257: 15700 CALL JIGSUP(172)
258: C !DROWN.
259: RETURN
260: C
261: C O106-- BLACK BOOK
262: C
263: 18000 IF(PRSA.NE.OPENW) GO TO 18100
264: C !OPEN?
265: CALL RSPEAK(180)
266: C !JOKE.
267: RETURN
268: C
269: 18100 IF(PRSA.NE.CLOSEW) GO TO 18200
270: C !CLOSE?
271: CALL RSPEAK(181)
272: RETURN
273: C
274: 18200 IF(PRSA.NE.BURNW) GO TO 10
275: C !BURN?
276: CALL NEWSTA(PRSO,0,0,0,0)
277: C !FATAL JOKE.
278: CALL JIGSUP(182)
279: RETURN
280: C OAPPLI, PAGE 6
281: C
282: C O107-- CANDLES, PROCESSED EXTERNALLY
283: C
284: 19000 OAPPLI=LIGHTP(CANDL)
285: RETURN
286: C
287: C O108-- MATCHES, PROCESSED EXTERNALLY
288: C
289: 20000 OAPPLI=LIGHTP(MATCH)
290: RETURN
291: C
292: C O109-- CYCLOPS, PROCESSED EXTERNALLY.
293: C
294: 22000 OAPPLI=CYCLOP(ARG)
295: C !CYCLOPS
296: RETURN
297: C
298: C O110-- THIEF, PROCESSED EXTERNALLY
299: C
300: 25000 OAPPLI=THIEFP(ARG)
301: RETURN
302: C
303: C O111-- WINDOW
304: C
305: 26000 OAPPLI=OPNCLS(WINDO,208,209)
306: C !OPEN/CLS WINDOW.
307: RETURN
308: C
309: C O112-- PILE OF BODIES
310: C
311: 32000 IF(PRSA.NE.TAKEW) GO TO 32500
312: C !TAKE?
313: CALL RSPEAK(228)
314: C !CANT.
315: RETURN
316: C
317: 32500 IF((PRSA.NE.BURNW).AND.(PRSA.NE.MUNGW)) GO TO 10
318: IF(ONPOLF) RETURN
319: C !BURN OR MUNG?
320: ONPOLF=.TRUE.
321: C !SET HEAD ON POLE.
322: CALL NEWSTA(HPOLE,0,LLD2,0,0)
323: CALL JIGSUP(229)
324: C !BEHEADED.
325: RETURN
326: C
327: C O113-- VAMPIRE BAT
328: C
329: 35000 CALL RSPEAK(50)
330: C !TIME TO FLY, JACK.
331: F=MOVETO(BATDRP(RND(9)+1),WINNER)
332: C !SELECT RANDOM DEST.
333: F=RMDESC(0)
334: RETURN
335: C OAPPLI, PAGE 7
336: C
337: C O114-- STICK
338: C
339: 39000 IF(PRSA.NE.WAVEW) GO TO 10
340: C !WAVE?
341: IF(HERE.EQ.MRAIN) GO TO 39500
342: C !ON RAINBOW?
343: IF((HERE.EQ.POG).OR.(HERE.EQ.FALLS)) GO TO 39200
344: CALL RSPEAK(244)
345: C !NOTHING HAPPENS.
346: RETURN
347: C
348: 39200 OFLAG1(POT)=or(OFLAG1(POT),VISIBT)
349: RAINBF=.NOT. RAINBF
350: C !COMPLEMENT RAINBOW.
351: I=245
352: C !ASSUME OFF.
353: IF(RAINBF) I=246
354: C !IF ON, SOLID.
355: CALL RSPEAK(I)
356: C !DESCRIBE.
357: RETURN
358: C
359: 39500 RAINBF=.FALSE.
360: C !ON RAINBOW,
361: CALL JIGSUP(247)
362: C !TAKE A FALL.
363: RETURN
364: C
365: C O115-- BALLOON, HANDLED EXTERNALLY
366: C
367: 40000 OAPPLI=BALLOP(ARG)
368: RETURN
369: C
370: C O116-- HEADS
371: C
372: 45000 IF(PRSA.NE.HELLOW) GO TO 45100
373: C !HELLO HEADS?
374: CALL RSPEAK(633)
375: C !TRULY BIZARRE.
376: RETURN
377: C
378: 45100 IF(PRSA.EQ.READW) GO TO 10
379: C !READ IS OK.
380: CALL NEWSTA(LCASE,260,LROOM,0,0)
381: C !MAKE LARGE CASE.
382: I=ROBADV(WINNER,0,LCASE,0)+ROBRM(HERE,100,0,LCASE,0)
383: CALL JIGSUP(261)
384: C !KILL HIM.
385: RETURN
386: C OAPPLI, PAGE 8
387: C
388: C O117-- SPHERE
389: C
390: 47000 IF(CAGESF.OR.(PRSA.NE.TAKEW)) GO TO 10
391: C !TAKE?
392: IF(WINNER.NE.PLAYER) GO TO 47500
393: C !ROBOT TAKE?
394: CALL RSPEAK(263)
395: C !NO, DROP CAGE.
396: IF(OROOM(ROBOT).NE.HERE) GO TO 47200
397: C !ROBOT HERE?
398: F=MOVETO(CAGED,WINNER)
399: C !YES, MOVE INTO CAGE.
400: CALL NEWSTA(ROBOT,0,CAGED,0,0)
401: C !MOVE ROBOT.
402: AROOM(AROBOT)=CAGED
403: OFLAG1(ROBOT)=or(OFLAG1(ROBOT),NDSCBT)
404: CTICK(CEVSPH)=10
405: C !GET OUT IN 10 OR ELSE.
406: RETURN
407: C
408: 47200 CALL NEWSTA(SPHER,0,0,0,0)
409: C !YOURE DEAD.
410: RFLAG(CAGER)=or(RFLAG(CAGER),RMUNG)
411: RRAND(CAGER)=147
412: CALL JIGSUP(148)
413: C !MUNG PLAYER.
414: RETURN
415: C
416: 47500 CALL NEWSTA(SPHER,0,0,0,0)
417: C !ROBOT TRIED,
418: CALL NEWSTA(ROBOT,264,0,0,0)
419: C !KILL HIM.
420: CALL NEWSTA(CAGE,0,HERE,0,0)
421: C !INSERT MANGLED CAGE.
422: RETURN
423: C
424: C O118-- GEOMETRICAL BUTTONS
425: C
426: 48000 IF(PRSA.NE.PUSHW) GO TO 10
427: C !PUSH?
428: I=PRSO-SQBUT+1
429: C !GET BUTTON INDEX.
430: IF((I.LE.0).OR.(I.GE.4)) GO TO 10
431: C !A BUTTON?
432: IF(WINNER.NE.PLAYER) GO TO (48100,48200,48300),I
433: CALL JIGSUP(265)
434: C !YOU PUSHED, YOU DIE.
435: RETURN
436: C
437: 48100 I=267
438: IF(CAROZF) I=266
439: C !SPEED UP?
440: CAROZF=.TRUE.
441: CALL RSPEAK(I)
442: RETURN
443: C
444: 48200 I=266
445: C !ASSUME NO CHANGE.
446: IF(CAROZF) I=268
447: CAROZF=.FALSE.
448: CALL RSPEAK(I)
449: RETURN
450: C
451: 48300 CAROFF=.NOT.CAROFF
452: C !FLIP CAROUSEL.
453: IF(.NOT.QHERE(IRBOX,CAROU)) RETURN
454: C !IRON BOX IN CAROUSEL?
455: CALL RSPEAK(269)
456: C !YES, THUMP.
457: OFLAG1(IRBOX)=xor(OFLAG1(IRBOX),VISIBT)
458: IF(CAROFF) RFLAG(CAROU)=and(RFLAG(CAROU), not(RSEEN))
459: RETURN
460: C
461: C O119-- FLASK FUNCTION
462: C
463: 49000 IF(PRSA.EQ.OPENW) GO TO 49100
464: C !OPEN?
465: IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10
466: CALL NEWSTA(FLASK,270,0,0,0)
467: C !KILL FLASK.
468: 49100 RFLAG(HERE)=or(RFLAG(HERE),RMUNG)
469: RRAND(HERE)=271
470: CALL JIGSUP(272)
471: C !POISONED.
472: RETURN
473: C
474: C O120-- BUCKET FUNCTION
475: C
476: 50000 IF(ARG.NE.2) GO TO 10
477: C !READOUT?
478: IF((OCAN(WATER).NE.BUCKE).OR.BUCKTF) GO TO 50500
479: BUCKTF=.TRUE.
480: C !BUCKET AT TOP.
481: CTICK(CEVBUC)=100
482: C !START COUNTDOWN.
483: CALL NEWSTA(BUCKE,290,TWELL,0,0)
484: C !REPOSITION BUCKET.
485: GO TO 50900
486: C !FINISH UP.
487: C
488: 50500 IF((OCAN(WATER).EQ.BUCKE).OR..NOT.BUCKTF) GO TO 10
489: BUCKTF=.FALSE.
490: CALL NEWSTA(BUCKE,291,BWELL,0,0)
491: C !BUCKET AT BOTTOM.
492: 50900 IF(AV.NE.BUCKE) RETURN
493: C !IN BUCKET?
494: F=MOVETO(OROOM(BUCKE),WINNER)
495: C !MOVE ADVENTURER.
496: F=RMDESC(0)
497: C !DESCRIBE ROOM.
498: RETURN
499: C OAPPLI, PAGE 9
500: C
501: C O121-- EATME CAKE
502: C
503: 51000 IF((PRSA.NE.EATW).OR.(PRSO.NE.ECAKE).OR.
504: & (HERE.NE.ALICE)) GO TO 10
505: CALL NEWSTA(ECAKE,273,0,0,0)
506: C !VANISH CAKE.
507: OFLAG1(ROBOT)=and(OFLAG1(ROBOT), not(VISIBT))
508: OAPPLI=MOVETO(ALISM,WINNER)
509: C !MOVE TO ALICE SMALL.
510: IZ=64
511: IR=ALISM
512: IO=ALICE
513: GO TO 52405
514: C
515: C O122-- ICINGS
516: C
517: 52000 IF(PRSA.NE.READW) GO TO 52200
518: C !READ?
519: I=274
520: C !CANT READ.
521: IF(PRSI.NE.0) I=275
522: C !THROUGH SOMETHING?
523: IF(PRSI.EQ.BOTTL) I=276
524: C !THROUGH BOTTLE?
525: IF(PRSI.EQ.FLASK) I=277+(PRSO-ORICE)
526: C !THROUGH FLASK?
527: CALL RSPEAK(I)
528: C !READ FLASK.
529: RETURN
530: C
531: 52200 IF((PRSA.NE.THROWW).OR.(PRSO.NE.RDICE).OR.(PRSI.NE.POOL))
532: & GO TO 52300
533: CALL NEWSTA(POOL,280,0,0,0)
534: C !VANISH POOL.
535: OFLAG1(SAFFR)=or(OFLAG1(SAFFR),VISIBT)
536: RETURN
537: C
538: 52300 IF((HERE.NE.ALICE).AND.(HERE.NE.ALISM).AND.(HERE.NE.ALITR))
539: & GO TO 10
540: IF(((PRSA.NE.EATW).AND.(PRSA.NE.THROWW)).OR.
541: & (PRSO.NE.ORICE)) GO TO 52400
542: CALL NEWSTA(ORICE,0,0,0,0)
543: C !VANISH ORANGE ICE.
544: RFLAG(HERE)=or(RFLAG(HERE),RMUNG)
545: RRAND(HERE)=281
546: CALL JIGSUP(282)
547: C !VANISH ADVENTURER.
548: RETURN
549: C
550: 52400 IF((PRSA.NE.EATW).OR.(PRSO.NE.BLICE))
551: & GO TO 10
552: CALL NEWSTA(BLICE,283,0,0,0)
553: C !VANISH BLUE ICE.
554: IF(HERE.NE.ALISM) GO TO 52500
555: C !IN REDUCED ROOM?
556: OFLAG1(ROBOT)=or(OFLAG1(ROBOT),VISIBT)
557: IO=HERE
558: OAPPLI=MOVETO(ALICE,WINNER)
559: IZ=1/64
560: IR=ALICE
561: C
562: C Do a size change, common loop used also by code at 51000
563: C
564: 52405 DO 52450 I=1,OLNT
565: C !ENLARGE WORLD.
566: IF((OROOM(I).NE.IO).OR.(OSIZE(I).EQ.10000))
567: & GO TO 52450
568: OROOM(I)=IR
569: OSIZE(I)=OSIZE(I)*IZ
570: 52450 CONTINUE
571: RETURN
572: C
573: 52500 CALL JIGSUP(284)
574: C !ENLARGED IN WRONG ROOM.
575: RETURN
576: C
577: C O123-- BRICK
578: C
579: 54000 IF(PRSA.NE.BURNW) GO TO 10
580: C !BURN?
581: CALL JIGSUP(150)
582: C !BOOM
583: C !
584: RETURN
585: C
586: C O124-- MYSELF
587: C
588: 55000 IF(PRSA.NE.GIVEW) GO TO 55100
589: C !GIVE?
590: CALL NEWSTA(PRSO,2,0,0,PLAYER)
591: C !DONE.
592: RETURN
593: C
594: 55100 IF(PRSA.NE.TAKEW) GO TO 55200
595: C !TAKE?
596: CALL RSPEAK(286)
597: C !JOKE.
598: RETURN
599: C
600: 55200 IF((PRSA.NE.KILLW).AND.(PRSA.NE.MUNGW)) GO TO 10
601: CALL JIGSUP(287)
602: C !KILL, NO JOKE.
603: RETURN
604: C OAPPLI, PAGE 10
605: C
606: C O125-- PANELS INSIDE MIRROR
607: C
608: 56000 IF(PRSA.NE.PUSHW) GO TO 10
609: C !PUSH?
610: IF(POLEUF.NE.0) GO TO 56100
611: C !SHORT POLE UP?
612: I=731
613: C !NO, WONT BUDGE.
614: IF(MOD(MDIR,180).EQ.0) I=732
615: C !DIFF MSG IF N-S.
616: CALL RSPEAK(I)
617: C !TELL WONT MOVE.
618: RETURN
619: C
620: 56100 IF(MLOC.NE.MRG) GO TO 56200
621: C !IN GDN ROOM?
622: CALL RSPEAK(733)
623: C !YOU LOSE.
624: CALL JIGSUP(685)
625: RETURN
626: C
627: 56200 I=831
628: C !ROTATE L OR R.
629: IF((PRSO.EQ.RDWAL).OR.(PRSO.EQ.YLWAL)) I=830
630: CALL RSPEAK(I)
631: C !TELL DIRECTION.
632: MDIR=MOD(MDIR+45+(270*(I-830)),360)
633: C !CALCULATE NEW DIR.
634: CALL RSPSUB(734,695+(MDIR/45))
635: C !TELL NEW DIR.
636: IF(WDOPNF) CALL RSPEAK(730)
637: C !IF PANEL OPEN, CLOSE.
638: WDOPNF=.FALSE.
639: RETURN
640: C !DONE.
641: C
642: C O126-- ENDS INSIDE MIRROR
643: C
644: 57000 IF(PRSA.NE.PUSHW) GO TO 10
645: C !PUSH?
646: IF(MOD(MDIR,180).EQ.0) GO TO 57100
647: C !MIRROR N-S?
648: CALL RSPEAK(735)
649: C !NO, WONT BUDGE.
650: RETURN
651: C
652: 57100 IF(PRSO.NE.PINDR) GO TO 57300
653: C !PUSH PINE WALL?
654: IF(((MLOC.EQ.MRC).AND.(MDIR.EQ.180)).OR.
655: & ((MLOC.EQ.MRD).AND.(MDIR.EQ.0)).OR.
656: & (MLOC.EQ.MRG)) GO TO 57200
657: CALL RSPEAK(736)
658: C !NO, OPENS.
659: WDOPNF=.TRUE.
660: C !INDICATE OPEN.
661: CFLAG(CEVPIN)=.TRUE.
662: C !TIME OPENING.
663: CTICK(CEVPIN)=5
664: RETURN
665: C
666: 57200 CALL RSPEAK(737)
667: C !GDN SEES YOU, DIE.
668: CALL JIGSUP(685)
669: RETURN
670: C
671: 57300 NLOC=MLOC-1
672: C !NEW LOC IF SOUTH.
673: IF(MDIR.EQ.0) NLOC=MLOC+1
674: C !NEW LOC IF NORTH.
675: IF((NLOC.GE.MRA).AND.(NLOC.LE.MRD)) GO TO 57400
676: CALL RSPEAK(738)
677: C !HAVE REACHED END.
678: RETURN
679: C
680: 57400 I=699
681: C !ASSUME SOUTH.
682: IF(MDIR.EQ.0) I=695
683: C !NORTH.
684: J=739
685: C !ASSUME SMOOTH.
686: IF(POLEUF.NE.0) J=740
687: C !POLE UP, WOBBLES.
688: CALL RSPSUB(J,I)
689: C !DESCRIBE.
690: MLOC=NLOC
691: IF(MLOC.NE.MRG) RETURN
692: C !NOW IN GDN ROOM?
693: C
694: IF(POLEUF.NE.0) GO TO 57500
695: C !POLE UP, GDN SEES.
696: IF(MROPNF.OR.WDOPNF) GO TO 57600
697: C !DOOR OPEN, GDN SEES.
698: IF(MR1F.AND.MR2F) RETURN
699: C !MIRRORS INTACT, OK.
700: CALL RSPEAK(742)
701: C !MIRRORS BROKEN, DIE.
702: CALL JIGSUP(743)
703: RETURN
704: C
705: 57500 CALL RSPEAK(741)
706: C !POLE UP, DIE.
707: CALL JIGSUP(743)
708: RETURN
709: C
710: 57600 CALL RSPEAK(744)
711: C !DOOR OPEN, DIE.
712: CALL JIGSUP(743)
713: RETURN
714: C OAPPLI, PAGE 11
715: C
716: C O127-- GLOBAL GUARDIANS
717: C
718: 58000 IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
719: & (PRSA.NE.MUNGW)) GO TO 58100
720: CALL JIGSUP(745)
721: C !LOSE.
722: RETURN
723: C
724: 58100 IF(PRSA.NE.HELLOW) GO TO 10
725: C !HELLO?
726: CALL RSPEAK(746)
727: C !NO REPLY.
728: RETURN
729: C
730: C O128-- GLOBAL MASTER
731: C
732: 59000 IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
733: & (PRSA.NE.MUNGW)) GO TO 59100
734: CALL JIGSUP(747)
735: C !BAD IDEA.
736: RETURN
737: C
738: 59100 IF(PRSA.NE.TAKEW) GO TO 10
739: C !TAKE?
740: CALL RSPEAK(748)
741: C !JOKE.
742: RETURN
743: C
744: C O129-- NUMERAL FIVE (FOR JOKE)
745: C
746: 60000 IF(PRSA.NE.TAKEW) GO TO 10
747: C !TAKE FIVE?
748: CALL RSPEAK(419)
749: C !TIME PASSES.
750: DO 60100 I=1,3
751: C !WAIT A WHILE.
752: IF(CLOCKD(X)) RETURN
753: 60100 CONTINUE
754: RETURN
755: C
756: C O130-- CRYPT FUNCTION
757: C
758: 61000 IF(.NOT.ENDGMF) GO TO 45000
759: C !IF NOT EG, DIE.
760: IF(PRSA.NE.OPENW) GO TO 61100
761: C !OPEN?
762: I=793
763: IF(QOPEN(TOMB)) I=794
764: CALL RSPEAK(I)
765: OFLAG2(TOMB)=or(OFLAG2(TOMB),OPENBT)
766: RETURN
767: C
768: 61100 IF(PRSA.NE.CLOSEW) GO TO 45000
769: C !CLOSE?
770: I=795
771: IF(QOPEN(TOMB)) I=796
772: CALL RSPEAK(I)
773: OFLAG2(TOMB)=and(OFLAG2(TOMB),not(OPENBT))
774: IF(HERE.EQ.CRYPT) CTICK(CEVSTE)=3
775: C !IF IN CRYPT, START EG.
776: RETURN
777: C OAPPLI, PAGE 12
778: C
779: C O131-- GLOBAL LADDER
780: C
781: 62000 IF((CPVEC(CPHERE+1).EQ.-2).OR.(CPVEC(CPHERE-1).EQ.-3))
782: & GO TO 62100
783: CALL RSPEAK(865)
784: C !NO, LOSE.
785: RETURN
786: C
787: 62100 IF((PRSA.EQ.CLMBW).OR.(PRSA.EQ.CLMBUW)) GO TO 62200
788: CALL RSPEAK(866)
789: C !CLIMB IT?
790: RETURN
791: C
792: 62200 IF((CPHERE.EQ.10).AND.(CPVEC(CPHERE+1).EQ.-2))
793: & GO TO 62300
794: CALL RSPEAK(867)
795: C !NO, HIT YOUR HEAD.
796: RETURN
797: C
798: 62300 F=MOVETO(CPANT,WINNER)
799: C !TO ANTEROOM.
800: F=RMDESC(3)
801: C !DESCRIBE.
802: RETURN
803: C
804: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.