Commit | Line | Data |
---|---|---|
8b22683c KB |
1 | C VAPPLI- MAIN VERB PROCESSING ROUTINE |
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 VAPPLI(RI) | |
10 | IMPLICIT INTEGER (A-Z) | |
11 | LOGICAL LIT,OBJACT | |
12 | LOGICAL QEMPTY,RMDESC,CLOCKD | |
13 | LOGICAL QOPEN,EDIBLE,DRKBLE | |
14 | LOGICAL TAKE,PUT,DROP,WALK | |
15 | LOGICAL QHERE,SVERBS,FINDXT,OAPPLI,F | |
16 | #include "parser.h" | |
17 | #include "gamestate.h" | |
18 | #include "state.h" | |
19 | C | |
20 | COMMON /STAR/ MBASE,STRBIT | |
21 | #include "rooms.h" | |
22 | #include "rflag.h" | |
23 | #include "rindex.h" | |
24 | #include "xsrch.h" | |
25 | #include "objects.h" | |
26 | #include "oflags.h" | |
27 | #include "oindex.h" | |
28 | #include "advers.h" | |
29 | #include "verbs.h" | |
30 | C | |
31 | C FUNCTIONS AND DATA | |
32 | C | |
33 | QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0 | |
34 | EDIBLE(R)=and(OFLAG1(R),FOODBT).NE.0 | |
35 | DRKBLE(R)=and(OFLAG1(R),DRNKBT).NE.0 | |
36 | DATA MXNOP/39/,MXSMP/99/ | |
37 | C VAPPLI, PAGE 2 | |
38 | C | |
39 | VAPPLI=.TRUE. | |
40 | C !ASSUME WINS. | |
41 | C | |
42 | IF(PRSO.GT.220) GO TO 5 | |
43 | C | |
44 | IF(PRSO.NE.0) ODO2=ODESC2(PRSO) | |
45 | C !SET UP DESCRIPTORS. | |
46 | 5 IF(PRSI.NE.0) ODI2=ODESC2(PRSI) | |
47 | AV=AVEHIC(WINNER) | |
48 | RMK=372+RND(6) | |
49 | C !REMARK FOR HACK-HACKS. | |
50 | C | |
51 | IF(RI.EQ.0) GO TO 10 | |
52 | C !ZERO IS FALSE. | |
53 | IF(RI.LE.MXNOP) RETURN | |
54 | C !NOP? | |
55 | IF(RI.LE.MXSMP) GO TO 100 | |
56 | C !SIMPLE VERB? | |
57 | GO TO (18000,20000, | |
58 | & 22000,23000,24000,25000,26000,27000,28000,29000,30000, | |
59 | & 31000,32000,33000,34000,35000,36000, 38000,39000,40000, | |
60 | & 41000,42000,43000,44000,45000,46000,47000,48000,49000,50000, | |
61 | & 51000,52000,53000, 55000,56000, 58000,59000,60000, | |
62 | & 63000,64000,65000,66000, 68000,69000,70000, | |
63 | & 71000,72000,73000,74000, 77000,78000, | |
64 | & 80000,81000,82000,83000,84000,85000,86000,87000,88000), | |
65 | & (RI-MXSMP) | |
66 | CALL BUG(7,RI) | |
67 | C | |
68 | C ALL VERB PROCESSORS RETURN HERE TO DECLARE FAILURE. | |
69 | C | |
70 | 10 VAPPLI=.FALSE. | |
71 | C !LOSE. | |
72 | RETURN | |
73 | C | |
74 | C SIMPLE VERBS ARE HANDLED EXTERNALLY. | |
75 | C | |
76 | 100 VAPPLI=SVERBS(RI) | |
77 | RETURN | |
78 | C VAPPLI, PAGE 3 | |
79 | C | |
80 | C V100-- READ. OUR FIRST REAL VERB. | |
81 | C | |
82 | 18000 IF(LIT(HERE)) GO TO 18100 | |
83 | C !ROOM LIT? | |
84 | CALL RSPEAK(356) | |
85 | C !NO, CANT READ. | |
86 | RETURN | |
87 | C | |
88 | 18100 IF(PRSI.EQ.0) GO TO 18200 | |
89 | C !READ THROUGH OBJ? | |
90 | IF(and(OFLAG1(PRSI),TRANBT).NE.0) GO TO 18200 | |
91 | CALL RSPSUB(357,ODI2) | |
92 | C !NOT TRANSPARENT. | |
93 | RETURN | |
94 | C | |
95 | 18200 IF(and(OFLAG1(PRSO),READBT).NE.0) GO TO 18300 | |
96 | CALL RSPSUB(358,ODO2) | |
97 | C !NOT READABLE. | |
98 | RETURN | |
99 | C | |
100 | 18300 IF(.NOT.OBJACT(X)) CALL RSPEAK(OREAD(PRSO)) | |
101 | RETURN | |
102 | C | |
103 | C V101-- MELT. UNLESS OBJECT HANDLES, JOKE. | |
104 | C | |
105 | 20000 IF(.NOT.OBJACT(X)) CALL RSPSUB(361,ODO2) | |
106 | RETURN | |
107 | C | |
108 | C V102-- INFLATE. WORKS ONLY WITH BOATS. | |
109 | C | |
110 | 22000 IF(.NOT.OBJACT(X)) CALL RSPEAK(368) | |
111 | C !OBJ HANDLE? | |
112 | RETURN | |
113 | C | |
114 | C V103-- DEFLATE. | |
115 | C | |
116 | 23000 IF(.NOT.OBJACT(X)) CALL RSPEAK(369) | |
117 | C !OBJ HANDLE? | |
118 | RETURN | |
119 | C VAPPLI, PAGE 4 | |
120 | C | |
121 | C V104-- ALARM. IF SLEEPING, WAKE HIM UP. | |
122 | C | |
123 | 24000 IF(and(OFLAG2(PRSO),SLEPBT).EQ.0) GO TO 24100 | |
124 | VAPPLI=OBJACT(X) | |
125 | C !SLEEPING, LET OBJ DO. | |
126 | RETURN | |
127 | C | |
128 | 24100 CALL RSPSUB(370,ODO2) | |
129 | C !JOKE. | |
130 | RETURN | |
131 | C | |
132 | C V105-- EXORCISE. OBJECTS HANDLE. | |
133 | C | |
134 | 25000 F=OBJACT(X) | |
135 | C !OBJECTS HANDLE. | |
136 | RETURN | |
137 | C | |
138 | C V106-- PLUG. LET OBJECTS HANDLE. | |
139 | C | |
140 | 26000 IF(.NOT.OBJACT(X)) CALL RSPEAK(371) | |
141 | RETURN | |
142 | C | |
143 | C V107-- KICK. IF OBJECT IGNORES, JOKE. | |
144 | C | |
145 | 27000 IF(.NOT.OBJACT(X)) CALL RSPSB2(378,ODO2,RMK) | |
146 | RETURN | |
147 | C | |
148 | C V108-- WAVE. SAME. | |
149 | C | |
150 | 28000 IF(.NOT.OBJACT(X)) CALL RSPSB2(379,ODO2,RMK) | |
151 | RETURN | |
152 | C | |
153 | C V109,V110-- RAISE, LOWER. SAME. | |
154 | C | |
155 | 29000 CONTINUE | |
156 | 30000 IF(.NOT.OBJACT(X)) CALL RSPSB2(380,ODO2,RMK) | |
157 | RETURN | |
158 | C | |
159 | C V111-- RUB. SAME. | |
160 | C | |
161 | 31000 IF(.NOT.OBJACT(X)) CALL RSPSB2(381,ODO2,RMK) | |
162 | RETURN | |
163 | C | |
164 | C V112-- PUSH. SAME. | |
165 | C | |
166 | 32000 IF(.NOT.OBJACT(X)) CALL RSPSB2(382,ODO2,RMK) | |
167 | RETURN | |
168 | C VAPPLI, PAGE 5 | |
169 | C | |
170 | C V113-- UNTIE. IF OBJECT IGNORES, JOKE. | |
171 | C | |
172 | 33000 IF(OBJACT(X)) RETURN | |
173 | C !OBJECT HANDLE? | |
174 | I=383 | |
175 | C !NO, NOT TIED. | |
176 | IF(and(OFLAG2(PRSO),TIEBT).EQ.0) I=384 | |
177 | CALL RSPEAK(I) | |
178 | RETURN | |
179 | C | |
180 | C V114-- TIE. NEVER REALLY WORKS. | |
181 | C | |
182 | 34000 IF(and(OFLAG2(PRSO),TIEBT).NE.0) GO TO 34100 | |
183 | CALL RSPEAK(385) | |
184 | C !NOT TIEABLE. | |
185 | RETURN | |
186 | C | |
187 | 34100 IF(.NOT.OBJACT(X)) CALL RSPSUB(386,ODO2) | |
188 | C !JOKE. | |
189 | RETURN | |
190 | C | |
191 | C V115-- TIE UP. NEVER REALLY WORKS. | |
192 | C | |
193 | 35000 IF(and(OFLAG2(PRSI),TIEBT).NE.0) GO TO 35100 | |
194 | CALL RSPSUB(387,ODO2) | |
195 | C !NOT TIEABLE. | |
196 | RETURN | |
197 | C | |
198 | 35100 I=388 | |
199 | C !ASSUME VILLAIN. | |
200 | IF(and(OFLAG2(PRSO),VILLBT).EQ.0) I=389 | |
201 | CALL RSPSUB(I,ODO2) | |
202 | C !JOKE. | |
203 | RETURN | |
204 | C | |
205 | C V116-- TURN. OBJECT MUST HANDLE. | |
206 | C | |
207 | 36000 IF(and(OFLAG1(PRSO),TURNBT).NE.0) GO TO 36100 | |
208 | CALL RSPEAK(390) | |
209 | C !NOT TURNABLE. | |
210 | RETURN | |
211 | C | |
212 | 36100 IF(and(OFLAG1(PRSI),TOOLBT).NE.0) GO TO 36200 | |
213 | CALL RSPSUB(391,ODI2) | |
214 | C !NOT A TOOL. | |
215 | RETURN | |
216 | C | |
217 | 36200 VAPPLI=OBJACT(X) | |
218 | C !LET OBJECT HANDLE. | |
219 | RETURN | |
220 | C | |
221 | C V117-- BREATHE. BECOMES INFLATE WITH LUNGS. | |
222 | C | |
223 | 38000 PRSA=INFLAW | |
224 | PRSI=LUNGS | |
225 | GO TO 22000 | |
226 | C !HANDLE LIKE INFLATE. | |
227 | C | |
228 | C V118-- KNOCK. MOSTLY JOKE. | |
229 | C | |
230 | 39000 IF(OBJACT(X)) RETURN | |
231 | C !OBJ HANDLE? | |
232 | I=394 | |
233 | C !JOKE FOR DOOR. | |
234 | IF(and(OFLAG1(PRSO),DOORBT).EQ.0) I=395 | |
235 | CALL RSPSUB(I,ODO2) | |
236 | C !JOKE FOR NONDOORS TOO. | |
237 | RETURN | |
238 | C | |
239 | C V119-- LOOK. | |
240 | C | |
241 | 40000 IF(PRSO.NE.0) GO TO 41500 | |
242 | C !SOMETHING TO LOOK AT? | |
243 | VAPPLI=RMDESC(3) | |
244 | C !HANDLED BY RMDESC. | |
245 | RETURN | |
246 | C | |
247 | C V120-- EXAMINE. | |
248 | C | |
249 | 41000 IF(PRSO.NE.0) GO TO 41500 | |
250 | C !SOMETHING TO EXAMINE? | |
251 | VAPPLI=RMDESC(0) | |
252 | C !HANDLED BY RMDESC. | |
253 | RETURN | |
254 | C | |
255 | 41500 IF(OBJACT(X)) RETURN | |
256 | C !OBJ HANDLE? | |
257 | I=OREAD(PRSO) | |
258 | C !GET READING MATERIAL. | |
259 | IF(I.NE.0) CALL RSPEAK(I) | |
260 | C !OUTPUT IF THERE, | |
261 | IF(I.EQ.0) CALL RSPSUB(429,ODO2) | |
262 | C !OTHERWISE DEFAULT. | |
263 | PRSA=FOOW | |
264 | C !DEFUSE ROOM PROCESSORS. | |
265 | RETURN | |
266 | C | |
267 | C V121-- SHAKE. IF HOLLOW OBJECT, SOME ACTION. | |
268 | C | |
269 | 42000 IF(OBJACT(X)) RETURN | |
270 | C !OBJECT HANDLE? | |
271 | IF(and(OFLAG2(PRSO),VILLBT).EQ.0) GO TO 42100 | |
272 | CALL RSPEAK(371) | |
273 | C !JOKE FOR VILLAINS. | |
274 | RETURN | |
275 | C | |
276 | 42100 IF(QEMPTY(PRSO).OR.(and(OFLAG1(PRSO),TAKEBT).EQ.0)) | |
277 | & GO TO 10 | |
278 | IF(QOPEN(PRSO)) GO TO 42300 | |
279 | C !OPEN? SPILL. | |
280 | CALL RSPSUB(396,ODO2) | |
281 | C !NO, DESCRIBE NOISE. | |
282 | RETURN | |
283 | C | |
284 | 42300 CALL RSPSUB(397,ODO2) | |
285 | C !SPILL THE WORKS. | |
286 | DO 42500 I=1,OLNT | |
287 | C !SPILL CONTENTS. | |
288 | IF(OCAN(I).NE.PRSO) GO TO 42500 | |
289 | C !INSIDE? | |
290 | OFLAG2(I)=or(OFLAG2(I),TCHBT) | |
291 | IF(AV.EQ.0) GO TO 42400 | |
292 | C !IN VEHICLE? | |
293 | CALL NEWSTA(I,0,0,AV,0) | |
294 | C !YES, SPILL IN THERE. | |
295 | GO TO 42500 | |
296 | C | |
297 | 42400 CALL NEWSTA(I,0,HERE,0,0) | |
298 | C !NO, SPILL ON FLOOR, | |
299 | IF(I.EQ.WATER) CALL NEWSTA(I,133,0,0,0) | |
300 | C !BUT WATER DISAPPEARS. | |
301 | 42500 CONTINUE | |
302 | RETURN | |
303 | C | |
304 | C V122-- MOVE. MOSTLY JOKES. | |
305 | C | |
306 | 43000 IF(OBJACT(X)) RETURN | |
307 | C !OBJ HANDLE? | |
308 | I=398 | |
309 | C !ASSUME NOT HERE. | |
310 | IF(QHERE(PRSO,HERE)) I=399 | |
311 | CALL RSPSUB(I,ODO2) | |
312 | C !JOKE. | |
313 | RETURN | |
314 | C VAPPLI, PAGE 6 | |
315 | C | |
316 | C V123-- TURN ON. | |
317 | C | |
318 | 44000 F=LIT(HERE) | |
319 | C !RECORD IF LIT. | |
320 | IF(OBJACT(X)) GO TO 44300 | |
321 | C !OBJ HANDLE? | |
322 | IF((and(OFLAG1(PRSO),LITEBT).NE.0).AND. | |
323 | & (OADV(PRSO).EQ.WINNER)) GO TO 44100 | |
324 | CALL RSPEAK(400) | |
325 | C !CANT DO IT. | |
326 | RETURN | |
327 | C | |
328 | 44100 IF(and(OFLAG1(PRSO),ONBT).EQ.0) GO TO 44200 | |
329 | CALL RSPEAK(401) | |
330 | C !ALREADY ON. | |
331 | RETURN | |
332 | C | |
333 | 44200 OFLAG1(PRSO)=or(OFLAG1(PRSO),ONBT) | |
334 | CALL RSPSUB(404,ODO2) | |
335 | 44300 IF(.NOT.F .AND.LIT(HERE)) F=RMDESC(0) | |
336 | C !ROOM NEWLY LIT. | |
337 | RETURN | |
338 | C | |
339 | C V124-- TURN OFF. | |
340 | C | |
341 | 45000 IF(OBJACT(X)) GO TO 45300 | |
342 | C !OBJ HANDLE? | |
343 | IF((and(OFLAG1(PRSO),LITEBT).NE.0).AND. | |
344 | & (OADV(PRSO).EQ.WINNER)) GO TO 45100 | |
345 | CALL RSPEAK(402) | |
346 | C !CANT DO IT. | |
347 | RETURN | |
348 | C | |
349 | 45100 IF(and(OFLAG1(PRSO),ONBT).NE.0) GO TO 45200 | |
350 | CALL RSPEAK(403) | |
351 | C !ALREADY OFF. | |
352 | RETURN | |
353 | C | |
354 | 45200 OFLAG1(PRSO)=and(OFLAG1(PRSO), not(ONBT)) | |
355 | CALL RSPSUB(405,ODO2) | |
356 | 45300 IF(.NOT.LIT(HERE)) CALL RSPEAK(406) | |
357 | C !MAY BE DARK. | |
358 | RETURN | |
359 | C | |
360 | C V125-- OPEN. A FINE MESS. | |
361 | C | |
362 | 46000 IF(OBJACT(X)) RETURN | |
363 | C !OBJ HANDLE? | |
364 | IF(and(OFLAG1(PRSO),CONTBT).NE.0) GO TO 46100 | |
365 | 46050 CALL RSPSUB(407,ODO2) | |
366 | C !NOT OPENABLE. | |
367 | RETURN | |
368 | C | |
369 | 46100 IF(OCAPAC(PRSO).NE.0) GO TO 46200 | |
370 | CALL RSPSUB(408,ODO2) | |
371 | C !NOT OPENABLE. | |
372 | RETURN | |
373 | C | |
374 | 46200 IF(.NOT.QOPEN(PRSO)) GO TO 46225 | |
375 | CALL RSPEAK(412) | |
376 | C !ALREADY OPEN. | |
377 | RETURN | |
378 | C | |
379 | 46225 OFLAG2(PRSO)=or(OFLAG2(PRSO),OPENBT) | |
380 | IF((and(OFLAG1(PRSO),TRANBT).NE.0).OR.QEMPTY(PRSO)) | |
381 | & GO TO 46300 | |
382 | CALL PRINCO(PRSO,410) | |
383 | C !PRINT CONTENTS. | |
384 | RETURN | |
385 | C | |
386 | 46300 CALL RSPEAK(409) | |
387 | C !DONE | |
388 | RETURN | |
389 | C | |
390 | C V126-- CLOSE. | |
391 | C | |
392 | 47000 IF(OBJACT(X)) RETURN | |
393 | C !OBJ HANDLE? | |
394 | IF(and(OFLAG1(PRSO),CONTBT).EQ.0) GO TO 46050 | |
395 | IF(OCAPAC(PRSO).NE.0) GO TO 47100 | |
396 | CALL RSPSUB(411,ODO2) | |
397 | C !NOT CLOSABLE. | |
398 | RETURN | |
399 | C | |
400 | 47100 IF(QOPEN(PRSO)) GO TO 47200 | |
401 | C !OPEN? | |
402 | CALL RSPEAK(413) | |
403 | C !NO, JOKE. | |
404 | RETURN | |
405 | C | |
406 | 47200 OFLAG2(PRSO)=and(OFLAG2(PRSO), not(OPENBT)) | |
407 | CALL RSPEAK(414) | |
408 | C !DONE. | |
409 | RETURN | |
410 | C VAPPLI, PAGE 7 | |
411 | C | |
412 | C V127-- FIND. BIG MEGILLA. | |
413 | C | |
414 | 48000 IF(OBJACT(X)) RETURN | |
415 | C !OBJ HANDLE? | |
416 | I=415 | |
417 | C !DEFAULT CASE. | |
418 | IF(QHERE(PRSO,HERE)) GO TO 48300 | |
419 | C !IN ROOM? | |
420 | IF(OADV(PRSO).EQ.WINNER) GO TO 48200 | |
421 | C !ON WINNER? | |
422 | J=OCAN(PRSO) | |
423 | C !DOWN ONE LEVEL. | |
424 | IF(J.EQ.0) GO TO 10 | |
425 | IF(((and(OFLAG1(J),TRANBT).EQ.0).AND. | |
426 | & (.NOT.QOPEN(J).OR.(and(OFLAG1(J),(DOORBT+CONTBT)).EQ.0)))) | |
427 | & GO TO 10 | |
428 | I=417 | |
429 | C !ASSUME IN ROOM. | |
430 | IF(QHERE(J,HERE)) GO TO 48100 | |
431 | IF(OADV(J).NE.WINNER) GO TO 10 | |
432 | C !NOT HERE OR ON PERSON. | |
433 | I=418 | |
434 | 48100 CALL RSPSUB(I,ODESC2(J)) | |
435 | C !DESCRIBE FINDINGS. | |
436 | RETURN | |
437 | C | |
438 | 48200 I=416 | |
439 | 48300 CALL RSPSUB(I,ODO2) | |
440 | C !DESCRIBE FINDINGS. | |
441 | RETURN | |
442 | C | |
443 | C V128-- WAIT. RUN CLOCK DEMON. | |
444 | C | |
445 | 49000 CALL RSPEAK(419) | |
446 | C !TIME PASSES. | |
447 | DO 49100 I=1,3 | |
448 | IF(CLOCKD(X)) RETURN | |
449 | 49100 CONTINUE | |
450 | RETURN | |
451 | C | |
452 | C V129-- SPIN. | |
453 | C V159-- TURN TO. | |
454 | C | |
455 | 50000 CONTINUE | |
456 | 88000 IF(.NOT.OBJACT(X)) CALL RSPEAK(663) | |
457 | C !IF NOT OBJ, JOKE. | |
458 | RETURN | |
459 | C | |
460 | C V130-- BOARD. WORKS WITH VEHICLES. | |
461 | C | |
462 | 51000 IF(and(OFLAG2(PRSO),VEHBT).NE.0) GO TO 51100 | |
463 | CALL RSPSUB(421,ODO2) | |
464 | C !NOT VEHICLE, JOKE. | |
465 | RETURN | |
466 | C | |
467 | 51100 IF(QHERE(PRSO,HERE)) GO TO 51200 | |
468 | C !HERE? | |
469 | CALL RSPSUB(420,ODO2) | |
470 | C !NO, JOKE. | |
471 | RETURN | |
472 | C | |
473 | 51200 IF(AV.EQ.0) GO TO 51300 | |
474 | C !ALREADY GOT ONE? | |
475 | CALL RSPSUB(422,ODO2) | |
476 | C !YES, JOKE. | |
477 | RETURN | |
478 | C | |
479 | 51300 IF(OBJACT(X)) RETURN | |
480 | C !OBJ HANDLE? | |
481 | CALL RSPSUB(423,ODO2) | |
482 | C !DESCRIBE. | |
483 | AVEHIC(WINNER)=PRSO | |
484 | IF(WINNER.NE.PLAYER) OCAN(AOBJ(WINNER))=PRSO | |
485 | RETURN | |
486 | C | |
487 | C V131-- DISEMBARK. | |
488 | C | |
489 | 52000 IF(AV.EQ.PRSO) GO TO 52100 | |
490 | C !FROM VEHICLE? | |
491 | CALL RSPEAK(424) | |
492 | C !NO, JOKE. | |
493 | RETURN | |
494 | C | |
495 | 52100 IF(OBJACT(X)) RETURN | |
496 | C !OBJ HANDLE? | |
497 | IF(and(RFLAG(HERE),RLAND).NE.0) GO TO 52200 | |
498 | CALL RSPEAK(425) | |
499 | C !NOT ON LAND. | |
500 | RETURN | |
501 | C | |
502 | 52200 AVEHIC(WINNER)=0 | |
503 | CALL RSPEAK(426) | |
504 | IF(WINNER.NE.PLAYER) CALL NEWSTA(AOBJ(WINNER),0,HERE,0,0) | |
505 | RETURN | |
506 | C | |
507 | C V132-- TAKE. HANDLED EXTERNALLY. | |
508 | C | |
509 | 53000 VAPPLI=TAKE(.TRUE.) | |
510 | RETURN | |
511 | C | |
512 | C V133-- INVENTORY. PROCESSED EXTERNALLY. | |
513 | C | |
514 | 55000 CALL INVENT(WINNER) | |
515 | RETURN | |
516 | C VAPPLI, PAGE 8 | |
517 | C | |
518 | C V134-- FILL. STRANGE DOINGS WITH WATER. | |
519 | C | |
520 | 56000 IF(PRSI.NE.0) GO TO 56050 | |
521 | C !ANY OBJ SPECIFIED? | |
522 | IF(and(RFLAG(HERE),(RWATER+RFILL)).NE.0) GO TO 56025 | |
523 | CALL RSPEAK(516) | |
524 | C !NOTHING TO FILL WITH. | |
525 | PRSWON=.FALSE. | |
526 | C !YOU LOSE. | |
527 | RETURN | |
528 | C | |
529 | 56025 PRSI=GWATE | |
530 | C !USE GLOBAL WATER. | |
531 | 56050 IF(OBJACT(X)) RETURN | |
532 | C !OBJ HANDLE? | |
533 | IF((PRSI.NE.GWATE).AND.(PRSI.NE.WATER)) | |
534 | & CALL RSPSB2(444,ODI2,ODO2) | |
535 | RETURN | |
536 | C | |
537 | C V135,V136-- EAT/DRINK | |
538 | C | |
539 | 58000 CONTINUE | |
540 | 59000 IF(OBJACT(X)) RETURN | |
541 | C !OBJ HANDLE? | |
542 | IF(PRSO.EQ.GWATE) GO TO 59500 | |
543 | C !DRINK GLOBAL WATER? | |
544 | IF(.NOT.EDIBLE(PRSO)) GO TO 59400 | |
545 | C !EDIBLE? | |
546 | IF(OADV(PRSO).EQ.WINNER) GO TO 59200 | |
547 | C !YES, ON WINNER? | |
548 | 59100 CALL RSPSUB(454,ODO2) | |
549 | C !NOT ACCESSIBLE. | |
550 | RETURN | |
551 | C | |
552 | 59200 IF(PRSA.EQ.DRINKW) GO TO 59300 | |
553 | C !DRINK FOOD? | |
554 | CALL NEWSTA(PRSO,455,0,0,0) | |
555 | C !NO, IT DISAPPEARS. | |
556 | RETURN | |
557 | C | |
558 | 59300 CALL RSPEAK(456) | |
559 | C !YES, JOKE. | |
560 | RETURN | |
561 | C | |
562 | 59400 IF(.NOT.DRKBLE(PRSO)) GO TO 59600 | |
563 | C !DRINKABLE? | |
564 | IF(OCAN(PRSO).EQ.0) GO TO 59100 | |
565 | C !YES, IN SOMETHING? | |
566 | IF(OADV(OCAN(PRSO)).NE.WINNER) GO TO 59100 | |
567 | IF(QOPEN(OCAN(PRSO))) GO TO 59500 | |
568 | C !CONT OPEN? | |
569 | CALL RSPEAK(457) | |
570 | C !NO, JOKE. | |
571 | RETURN | |
572 | C | |
573 | 59500 CALL NEWSTA(PRSO,458,0,0,0) | |
574 | C !GONE. | |
575 | RETURN | |
576 | C | |
577 | 59600 CALL RSPSUB(453,ODO2) | |
578 | C !NOT FOOD OR DRINK. | |
579 | RETURN | |
580 | C | |
581 | C V137-- BURN. COMPLICATED. | |
582 | C | |
583 | 60000 IF(and(OFLAG1(PRSI),(FLAMBT+LITEBT+ONBT)).NE. | |
584 | & (FLAMBT+LITEBT+ONBT)) GO TO 60400 | |
585 | IF(OBJACT(X)) RETURN | |
586 | C !OBJ HANDLE? | |
587 | IF(OCAN(PRSO).NE.RECEP) GO TO 60050 | |
588 | C !BALLOON? | |
589 | IF(OAPPLI(OACTIO(BALLO),0)) RETURN | |
590 | C !DID IT HANDLE? | |
591 | 60050 IF(and(OFLAG1(PRSO),BURNBT).EQ.0) GO TO 60300 | |
592 | IF(OADV(PRSO).NE.WINNER) GO TO 60100 | |
593 | C !CARRYING IT? | |
594 | CALL RSPSUB(459,ODO2) | |
595 | CALL JIGSUP(460) | |
596 | RETURN | |
597 | C | |
598 | 60100 J=OCAN(PRSO) | |
599 | C !GET CONTAINER. | |
600 | IF(QHERE(PRSO,HERE).OR. ((AV.NE.0).AND.(J.EQ.AV))) | |
601 | & GO TO 60200 | |
602 | IF(J.EQ.0) GO TO 60150 | |
603 | C !INSIDE? | |
604 | IF(.NOT.QOPEN(J)) GO TO 60150 | |
605 | C !OPEN? | |
606 | IF(QHERE(J,HERE).OR.((AV.NE.0).AND.(OCAN(J).EQ.AV))) | |
607 | & GO TO 60200 | |
608 | 60150 CALL RSPEAK(461) | |
609 | C !CANT REACH IT. | |
610 | RETURN | |
611 | C | |
612 | 60200 CALL RSPSUB(462,ODO2) | |
613 | C !BURN IT. | |
614 | CALL NEWSTA(PRSO,0,0,0,0) | |
615 | RETURN | |
616 | C | |
617 | 60300 CALL RSPSUB(463,ODO2) | |
618 | C !CANT BURN IT. | |
619 | RETURN | |
620 | C | |
621 | 60400 CALL RSPSUB(301,ODI2) | |
622 | C !CANT BURN IT WITH THAT. | |
623 | RETURN | |
624 | C VAPPLI, PAGE 9 | |
625 | C | |
626 | C V138-- MUNG. GO TO COMMON ATTACK CODE. | |
627 | C | |
628 | 63000 I=466 | |
629 | C !CHOOSE PHRASE. | |
630 | IF(and(OFLAG2(PRSO),VILLBT).NE.0) GO TO 66100 | |
631 | IF(.NOT.OBJACT(X)) CALL RSPSB2(466,ODO2,RMK) | |
632 | RETURN | |
633 | C | |
634 | C V139-- KILL. GO TO COMMON ATTACK CODE. | |
635 | C | |
636 | 64000 I=467 | |
637 | C !CHOOSE PHRASE. | |
638 | GO TO 66100 | |
639 | C | |
640 | C V140-- SWING. INVERT OBJECTS, FALL THRU TO ATTACK. | |
641 | C | |
642 | 65000 J=PRSO | |
643 | C !INVERT. | |
644 | PRSO=PRSI | |
645 | PRSI=J | |
646 | J=ODO2 | |
647 | ODO2=ODI2 | |
648 | ODI2=J | |
649 | PRSA=ATTACW | |
650 | C !FOR OBJACT. | |
651 | C | |
652 | C V141-- ATTACK. FALL THRU TO ATTACK CODE. | |
653 | C | |
654 | 66000 I=468 | |
655 | C | |
656 | C COMMON MUNG/ATTACK/SWING/KILL CODE. | |
657 | C | |
658 | 66100 IF(PRSO.NE.0) GO TO 66200 | |
659 | C !ANYTHING? | |
660 | CALL RSPEAK(469) | |
661 | C !NO, JOKE. | |
662 | RETURN | |
663 | C | |
664 | 66200 IF(OBJACT(X)) RETURN | |
665 | C !OBJ HANDLE? | |
666 | IF(and(OFLAG2(PRSO),VILLBT).NE.0) GO TO 66300 | |
667 | IF(and(OFLAG1(PRSO),VICTBT).EQ.0) | |
668 | & CALL RSPSUB(470,ODO2) | |
669 | RETURN | |
670 | C | |
671 | 66300 J=471 | |
672 | C !ASSUME NO WEAPON. | |
673 | IF(PRSI.EQ.0) GO TO 66500 | |
674 | IF(and(OFLAG2(PRSI),WEAPBT).EQ.0) GO TO 66400 | |
675 | MELEE=1 | |
676 | C !ASSUME SWORD. | |
677 | IF(PRSI.NE.SWORD) MELEE=2 | |
678 | C !MUST BE KNIFE. | |
679 | I=BLOW(PLAYER,PRSO,MELEE,.TRUE.,0) | |
680 | C !STRIKE BLOW. | |
681 | RETURN | |
682 | C | |
683 | 66400 J=472 | |
684 | C !NOT A WEAPON. | |
685 | 66500 CALL RSPSB2(I,ODO2,J) | |
686 | C !JOKE. | |
687 | RETURN | |
688 | C VAPPLI, PAGE 10 | |
689 | C | |
690 | C V142-- WALK. PROCESSED EXTERNALLY. | |
691 | C | |
692 | 68000 VAPPLI=WALK(X) | |
693 | RETURN | |
694 | C | |
695 | C V143-- TELL. PROCESSED IN GAME. | |
696 | C | |
697 | 69000 CALL RSPEAK(603) | |
698 | RETURN | |
699 | C | |
700 | C V144-- PUT. PROCESSED EXTERNALLY. | |
701 | C | |
702 | 70000 VAPPLI=PUT(.TRUE.) | |
703 | RETURN | |
704 | C | |
705 | C V145,V146,V147,V148-- DROP/GIVE/POUR/THROW | |
706 | C | |
707 | 71000 CONTINUE | |
708 | 72000 CONTINUE | |
709 | 73000 CONTINUE | |
710 | 74000 VAPPLI=DROP(.FALSE.) | |
711 | RETURN | |
712 | C | |
713 | C V149-- SAVE | |
714 | C | |
715 | 77000 IF(and(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 77100 | |
716 | CALL RSPEAK(828) | |
717 | C !NO SAVES IN ENDGAME. | |
718 | RETURN | |
719 | C | |
720 | 77100 CALL SAVEGM | |
721 | RETURN | |
722 | C | |
723 | C V150-- RESTORE | |
724 | C | |
725 | #ifdef PDP | |
726 | 78000 call restor | |
727 | #else | |
728 | 78000 IF(and(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 78100 | |
729 | CALL RSPEAK(829) | |
730 | C !NO RESTORES IN ENDGAME. | |
731 | RETURN | |
732 | C | |
733 | 78100 CALL RSTRGM | |
734 | #endif PDP | |
735 | RETURN | |
736 | C VAPPLI, PAGE 11 | |
737 | C | |
738 | C V151-- HELLO | |
739 | C | |
740 | 80000 IF(PRSO.NE.0) GO TO 80100 | |
741 | C !ANY OBJ? | |
742 | CALL RSPEAK(346+RND(4)) | |
743 | C !NO, VANILLA HELLO. | |
744 | RETURN | |
745 | C | |
746 | 80100 IF(PRSO.NE.AVIAT) GO TO 80200 | |
747 | C !HELLO AVIATOR? | |
748 | CALL RSPEAK(350) | |
749 | C !NOTHING HAPPENS. | |
750 | RETURN | |
751 | C | |
752 | 80200 IF(PRSO.NE.SAILO) GO TO 80300 | |
753 | C !HELLO SAILOR? | |
754 | HS=HS+1 | |
755 | C !COUNT. | |
756 | I=351 | |
757 | C !GIVE NORMAL OR | |
758 | IF(MOD(HS,10).EQ.0) I=352 | |
759 | C !RANDOM MESSAGE. | |
760 | IF(MOD(HS,20).EQ.0) I=353 | |
761 | CALL RSPEAK(I) | |
762 | C !SPEAK UP. | |
763 | RETURN | |
764 | C | |
765 | 80300 IF(OBJACT(X)) RETURN | |
766 | C !OBJ HANDLE? | |
767 | I=354 | |
768 | C !ASSUME VILLAIN. | |
769 | IF(and(OFLAG2(PRSO),(VILLBT+ACTRBT)).EQ.0) I=355 | |
770 | CALL RSPSUB(I,ODO2) | |
771 | C !HELLO THERE | |
772 | C ! | |
773 | RETURN | |
774 | C | |
775 | C V152-- LOOK INTO | |
776 | C | |
777 | 81000 IF(OBJACT(X)) RETURN | |
778 | C !OBJ HANDLE? | |
779 | IF(and(OFLAG1(PRSO),DOORBT).EQ.0) GO TO 81300 | |
780 | IF(.NOT.QOPEN(PRSO)) GO TO 81200 | |
781 | C !OPEN? | |
782 | CALL RSPSUB(628,ODO2) | |
783 | C !OPEN DOOR- UNINTERESTING. | |
784 | RETURN | |
785 | C | |
786 | 81200 CALL RSPSUB(525,ODO2) | |
787 | C !CLOSED DOOR- CANT SEE. | |
788 | RETURN | |
789 | C | |
790 | 81300 IF(and(OFLAG2(PRSO),VEHBT).NE.0) GO TO 81400 | |
791 | IF(QOPEN(PRSO).OR.(and(OFLAG1(PRSO),TRANBT).NE.0)) | |
792 | & GO TO 81400 | |
793 | IF(and(OFLAG1(PRSO),CONTBT).NE.0) GO TO 81200 | |
794 | CALL RSPSUB(630,ODO2) | |
795 | C !CANT LOOK INSIDE. | |
796 | RETURN | |
797 | C | |
798 | 81400 IF(QEMPTY(PRSO)) GO TO 81500 | |
799 | C !VEH OR SEE IN. EMPTY? | |
800 | CALL PRINCO(PRSO,573) | |
801 | C !NO, LIST CONTENTS. | |
802 | RETURN | |
803 | C | |
804 | 81500 CALL RSPSUB(629,ODO2) | |
805 | C !EMPTY. | |
806 | RETURN | |
807 | C | |
808 | C V153-- LOOK UNDER | |
809 | C | |
810 | 82000 IF(.NOT.OBJACT(X)) CALL RSPEAK(631) | |
811 | C !OBJECT HANDLE? | |
812 | RETURN | |
813 | C VAPPLI, PAGE 12 | |
814 | C | |
815 | C V154-- PUMP | |
816 | C | |
817 | 83000 IF((OROOM(PUMP).EQ.HERE).OR.(OADV(PUMP).EQ.WINNER)) | |
818 | & GO TO 83100 | |
819 | CALL RSPEAK(632) | |
820 | C !NO. | |
821 | RETURN | |
822 | C | |
823 | 83100 PRSI=PUMP | |
824 | C !BECOMES INFLATE | |
825 | PRSA=INFLAW | |
826 | C !X WITH PUMP. | |
827 | GO TO 22000 | |
828 | C !DONE. | |
829 | C | |
830 | C V155-- WIND | |
831 | C | |
832 | 84000 IF(.NOT.OBJACT(X)) CALL RSPSUB(634,ODO2) | |
833 | C !OBJ HANDLE? | |
834 | RETURN | |
835 | C | |
836 | C V156-- CLIMB | |
837 | C V157-- CLIMB UP | |
838 | C V158-- CLIMB DOWN | |
839 | C | |
840 | 85000 CONTINUE | |
841 | 86000 CONTINUE | |
842 | 87000 I=XUP | |
843 | C !ASSUME UP. | |
844 | IF(PRSA.EQ.CLMBDW) I=XDOWN | |
845 | C !UNLESS CLIMB DN. | |
846 | F=(and(OFLAG2(PRSO),CLMBBT)).NE.0 | |
847 | IF(F.AND.FINDXT(I,HERE)) GO TO 87500 | |
848 | C !ANYTHING TO CLIMB? | |
849 | IF(OBJACT(X)) RETURN | |
850 | C !OBJ HANDLE? | |
851 | I=657 | |
852 | IF(F) I=524 | |
853 | C !VARIETY OF JOKES. | |
854 | IF(.NOT.F .AND.((PRSO.EQ.WALL).OR. | |
855 | & ((PRSO.GE.WNORT).AND.(PRSO.LE.WNORT+3)))) | |
856 | & I=656 | |
857 | CALL RSPEAK(I) | |
858 | C !JOKE. | |
859 | RETURN | |
860 | C | |
861 | 87500 PRSA=WALKW | |
862 | C !WALK | |
863 | PRSO=I | |
864 | C !IN SPECIFIED DIR. | |
865 | VAPPLI=WALK(X) | |
866 | RETURN | |
867 | C | |
868 | END | |
869 | C CLOCKD- CLOCK DEMON FOR INTERMOVE CLOCK EVENTS | |
870 | C | |
871 | C DECLARATIONS | |
872 | C | |
873 | LOGICAL FUNCTION CLOCKD(X) | |
874 | IMPLICIT INTEGER (A-Z) | |
875 | C | |
876 | C CLOCK INTERRUPTS | |
877 | C | |
878 | #include "clock.h" | |
879 | C | |
880 | CLOCKD=.FALSE. | |
881 | C !ASSUME NO ACTION. | |
882 | DO 100 I=1,CLNT | |
883 | IF(.NOT.CFLAG(I) .OR.(CTICK(I).EQ.0)) GO TO 100 | |
884 | IF(CTICK(I).LT.0) GO TO 50 | |
885 | C !PERMANENT ENTRY? | |
886 | CTICK(I)=CTICK(I)-1 | |
887 | IF(CTICK(I).NE.0) GO TO 100 | |
888 | C !TIMER EXPIRED? | |
889 | 50 CLOCKD=.TRUE. | |
890 | CALL CEVAPP(CACTIO(I)) | |
891 | C !DO ACTION. | |
892 | 100 CONTINUE | |
893 | RETURN | |
894 | C | |
895 | END |