Commit | Line | Data |
---|---|---|
8b22683c KB |
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 |