date and time created 91/03/14 15:26:35 by donn
[unix-history] / usr / src / contrib / dungeon / verbs.F
CommitLineData
8b22683c
KB
1C VAPPLI- MAIN VERB PROCESSING ROUTINE
2C
3C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
4C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
5C WRITTEN BY R. M. SUPNIK
6C
7C DECLARATIONS
8C
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"
19C
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"
30C
31C FUNCTIONS AND DATA
32C
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/
37C VAPPLI, PAGE 2
38C
39 VAPPLI=.TRUE.
40C !ASSUME WINS.
41C
42 IF(PRSO.GT.220) GO TO 5
43C
44 IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
45C !SET UP DESCRIPTORS.
465 IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
47 AV=AVEHIC(WINNER)
48 RMK=372+RND(6)
49C !REMARK FOR HACK-HACKS.
50C
51 IF(RI.EQ.0) GO TO 10
52C !ZERO IS FALSE.
53 IF(RI.LE.MXNOP) RETURN
54C !NOP?
55 IF(RI.LE.MXSMP) GO TO 100
56C !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)
67C
68C ALL VERB PROCESSORS RETURN HERE TO DECLARE FAILURE.
69C
7010 VAPPLI=.FALSE.
71C !LOSE.
72 RETURN
73C
74C SIMPLE VERBS ARE HANDLED EXTERNALLY.
75C
76100 VAPPLI=SVERBS(RI)
77 RETURN
78C VAPPLI, PAGE 3
79C
80C V100-- READ. OUR FIRST REAL VERB.
81C
8218000 IF(LIT(HERE)) GO TO 18100
83C !ROOM LIT?
84 CALL RSPEAK(356)
85C !NO, CANT READ.
86 RETURN
87C
8818100 IF(PRSI.EQ.0) GO TO 18200
89C !READ THROUGH OBJ?
90 IF(and(OFLAG1(PRSI),TRANBT).NE.0) GO TO 18200
91 CALL RSPSUB(357,ODI2)
92C !NOT TRANSPARENT.
93 RETURN
94C
9518200 IF(and(OFLAG1(PRSO),READBT).NE.0) GO TO 18300
96 CALL RSPSUB(358,ODO2)
97C !NOT READABLE.
98 RETURN
99C
10018300 IF(.NOT.OBJACT(X)) CALL RSPEAK(OREAD(PRSO))
101 RETURN
102C
103C V101-- MELT. UNLESS OBJECT HANDLES, JOKE.
104C
10520000 IF(.NOT.OBJACT(X)) CALL RSPSUB(361,ODO2)
106 RETURN
107C
108C V102-- INFLATE. WORKS ONLY WITH BOATS.
109C
11022000 IF(.NOT.OBJACT(X)) CALL RSPEAK(368)
111C !OBJ HANDLE?
112 RETURN
113C
114C V103-- DEFLATE.
115C
11623000 IF(.NOT.OBJACT(X)) CALL RSPEAK(369)
117C !OBJ HANDLE?
118 RETURN
119C VAPPLI, PAGE 4
120C
121C V104-- ALARM. IF SLEEPING, WAKE HIM UP.
122C
12324000 IF(and(OFLAG2(PRSO),SLEPBT).EQ.0) GO TO 24100
124 VAPPLI=OBJACT(X)
125C !SLEEPING, LET OBJ DO.
126 RETURN
127C
12824100 CALL RSPSUB(370,ODO2)
129C !JOKE.
130 RETURN
131C
132C V105-- EXORCISE. OBJECTS HANDLE.
133C
13425000 F=OBJACT(X)
135C !OBJECTS HANDLE.
136 RETURN
137C
138C V106-- PLUG. LET OBJECTS HANDLE.
139C
14026000 IF(.NOT.OBJACT(X)) CALL RSPEAK(371)
141 RETURN
142C
143C V107-- KICK. IF OBJECT IGNORES, JOKE.
144C
14527000 IF(.NOT.OBJACT(X)) CALL RSPSB2(378,ODO2,RMK)
146 RETURN
147C
148C V108-- WAVE. SAME.
149C
15028000 IF(.NOT.OBJACT(X)) CALL RSPSB2(379,ODO2,RMK)
151 RETURN
152C
153C V109,V110-- RAISE, LOWER. SAME.
154C
15529000 CONTINUE
15630000 IF(.NOT.OBJACT(X)) CALL RSPSB2(380,ODO2,RMK)
157 RETURN
158C
159C V111-- RUB. SAME.
160C
16131000 IF(.NOT.OBJACT(X)) CALL RSPSB2(381,ODO2,RMK)
162 RETURN
163C
164C V112-- PUSH. SAME.
165C
16632000 IF(.NOT.OBJACT(X)) CALL RSPSB2(382,ODO2,RMK)
167 RETURN
168C VAPPLI, PAGE 5
169C
170C V113-- UNTIE. IF OBJECT IGNORES, JOKE.
171C
17233000 IF(OBJACT(X)) RETURN
173C !OBJECT HANDLE?
174 I=383
175C !NO, NOT TIED.
176 IF(and(OFLAG2(PRSO),TIEBT).EQ.0) I=384
177 CALL RSPEAK(I)
178 RETURN
179C
180C V114-- TIE. NEVER REALLY WORKS.
181C
18234000 IF(and(OFLAG2(PRSO),TIEBT).NE.0) GO TO 34100
183 CALL RSPEAK(385)
184C !NOT TIEABLE.
185 RETURN
186C
18734100 IF(.NOT.OBJACT(X)) CALL RSPSUB(386,ODO2)
188C !JOKE.
189 RETURN
190C
191C V115-- TIE UP. NEVER REALLY WORKS.
192C
19335000 IF(and(OFLAG2(PRSI),TIEBT).NE.0) GO TO 35100
194 CALL RSPSUB(387,ODO2)
195C !NOT TIEABLE.
196 RETURN
197C
19835100 I=388
199C !ASSUME VILLAIN.
200 IF(and(OFLAG2(PRSO),VILLBT).EQ.0) I=389
201 CALL RSPSUB(I,ODO2)
202C !JOKE.
203 RETURN
204C
205C V116-- TURN. OBJECT MUST HANDLE.
206C
20736000 IF(and(OFLAG1(PRSO),TURNBT).NE.0) GO TO 36100
208 CALL RSPEAK(390)
209C !NOT TURNABLE.
210 RETURN
211C
21236100 IF(and(OFLAG1(PRSI),TOOLBT).NE.0) GO TO 36200
213 CALL RSPSUB(391,ODI2)
214C !NOT A TOOL.
215 RETURN
216C
21736200 VAPPLI=OBJACT(X)
218C !LET OBJECT HANDLE.
219 RETURN
220C
221C V117-- BREATHE. BECOMES INFLATE WITH LUNGS.
222C
22338000 PRSA=INFLAW
224 PRSI=LUNGS
225 GO TO 22000
226C !HANDLE LIKE INFLATE.
227C
228C V118-- KNOCK. MOSTLY JOKE.
229C
23039000 IF(OBJACT(X)) RETURN
231C !OBJ HANDLE?
232 I=394
233C !JOKE FOR DOOR.
234 IF(and(OFLAG1(PRSO),DOORBT).EQ.0) I=395
235 CALL RSPSUB(I,ODO2)
236C !JOKE FOR NONDOORS TOO.
237 RETURN
238C
239C V119-- LOOK.
240C
24140000 IF(PRSO.NE.0) GO TO 41500
242C !SOMETHING TO LOOK AT?
243 VAPPLI=RMDESC(3)
244C !HANDLED BY RMDESC.
245 RETURN
246C
247C V120-- EXAMINE.
248C
24941000 IF(PRSO.NE.0) GO TO 41500
250C !SOMETHING TO EXAMINE?
251 VAPPLI=RMDESC(0)
252C !HANDLED BY RMDESC.
253 RETURN
254C
25541500 IF(OBJACT(X)) RETURN
256C !OBJ HANDLE?
257 I=OREAD(PRSO)
258C !GET READING MATERIAL.
259 IF(I.NE.0) CALL RSPEAK(I)
260C !OUTPUT IF THERE,
261 IF(I.EQ.0) CALL RSPSUB(429,ODO2)
262C !OTHERWISE DEFAULT.
263 PRSA=FOOW
264C !DEFUSE ROOM PROCESSORS.
265 RETURN
266C
267C V121-- SHAKE. IF HOLLOW OBJECT, SOME ACTION.
268C
26942000 IF(OBJACT(X)) RETURN
270C !OBJECT HANDLE?
271 IF(and(OFLAG2(PRSO),VILLBT).EQ.0) GO TO 42100
272 CALL RSPEAK(371)
273C !JOKE FOR VILLAINS.
274 RETURN
275C
27642100 IF(QEMPTY(PRSO).OR.(and(OFLAG1(PRSO),TAKEBT).EQ.0))
277& GO TO 10
278 IF(QOPEN(PRSO)) GO TO 42300
279C !OPEN? SPILL.
280 CALL RSPSUB(396,ODO2)
281C !NO, DESCRIBE NOISE.
282 RETURN
283C
28442300 CALL RSPSUB(397,ODO2)
285C !SPILL THE WORKS.
286 DO 42500 I=1,OLNT
287C !SPILL CONTENTS.
288 IF(OCAN(I).NE.PRSO) GO TO 42500
289C !INSIDE?
290 OFLAG2(I)=or(OFLAG2(I),TCHBT)
291 IF(AV.EQ.0) GO TO 42400
292C !IN VEHICLE?
293 CALL NEWSTA(I,0,0,AV,0)
294C !YES, SPILL IN THERE.
295 GO TO 42500
296C
29742400 CALL NEWSTA(I,0,HERE,0,0)
298C !NO, SPILL ON FLOOR,
299 IF(I.EQ.WATER) CALL NEWSTA(I,133,0,0,0)
300C !BUT WATER DISAPPEARS.
30142500 CONTINUE
302 RETURN
303C
304C V122-- MOVE. MOSTLY JOKES.
305C
30643000 IF(OBJACT(X)) RETURN
307C !OBJ HANDLE?
308 I=398
309C !ASSUME NOT HERE.
310 IF(QHERE(PRSO,HERE)) I=399
311 CALL RSPSUB(I,ODO2)
312C !JOKE.
313 RETURN
314C VAPPLI, PAGE 6
315C
316C V123-- TURN ON.
317C
31844000 F=LIT(HERE)
319C !RECORD IF LIT.
320 IF(OBJACT(X)) GO TO 44300
321C !OBJ HANDLE?
322 IF((and(OFLAG1(PRSO),LITEBT).NE.0).AND.
323& (OADV(PRSO).EQ.WINNER)) GO TO 44100
324 CALL RSPEAK(400)
325C !CANT DO IT.
326 RETURN
327C
32844100 IF(and(OFLAG1(PRSO),ONBT).EQ.0) GO TO 44200
329 CALL RSPEAK(401)
330C !ALREADY ON.
331 RETURN
332C
33344200 OFLAG1(PRSO)=or(OFLAG1(PRSO),ONBT)
334 CALL RSPSUB(404,ODO2)
33544300 IF(.NOT.F .AND.LIT(HERE)) F=RMDESC(0)
336C !ROOM NEWLY LIT.
337 RETURN
338C
339C V124-- TURN OFF.
340C
34145000 IF(OBJACT(X)) GO TO 45300
342C !OBJ HANDLE?
343 IF((and(OFLAG1(PRSO),LITEBT).NE.0).AND.
344& (OADV(PRSO).EQ.WINNER)) GO TO 45100
345 CALL RSPEAK(402)
346C !CANT DO IT.
347 RETURN
348C
34945100 IF(and(OFLAG1(PRSO),ONBT).NE.0) GO TO 45200
350 CALL RSPEAK(403)
351C !ALREADY OFF.
352 RETURN
353C
35445200 OFLAG1(PRSO)=and(OFLAG1(PRSO), not(ONBT))
355 CALL RSPSUB(405,ODO2)
35645300 IF(.NOT.LIT(HERE)) CALL RSPEAK(406)
357C !MAY BE DARK.
358 RETURN
359C
360C V125-- OPEN. A FINE MESS.
361C
36246000 IF(OBJACT(X)) RETURN
363C !OBJ HANDLE?
364 IF(and(OFLAG1(PRSO),CONTBT).NE.0) GO TO 46100
36546050 CALL RSPSUB(407,ODO2)
366C !NOT OPENABLE.
367 RETURN
368C
36946100 IF(OCAPAC(PRSO).NE.0) GO TO 46200
370 CALL RSPSUB(408,ODO2)
371C !NOT OPENABLE.
372 RETURN
373C
37446200 IF(.NOT.QOPEN(PRSO)) GO TO 46225
375 CALL RSPEAK(412)
376C !ALREADY OPEN.
377 RETURN
378C
37946225 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)
383C !PRINT CONTENTS.
384 RETURN
385C
38646300 CALL RSPEAK(409)
387C !DONE
388 RETURN
389C
390C V126-- CLOSE.
391C
39247000 IF(OBJACT(X)) RETURN
393C !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)
397C !NOT CLOSABLE.
398 RETURN
399C
40047100 IF(QOPEN(PRSO)) GO TO 47200
401C !OPEN?
402 CALL RSPEAK(413)
403C !NO, JOKE.
404 RETURN
405C
40647200 OFLAG2(PRSO)=and(OFLAG2(PRSO), not(OPENBT))
407 CALL RSPEAK(414)
408C !DONE.
409 RETURN
410C VAPPLI, PAGE 7
411C
412C V127-- FIND. BIG MEGILLA.
413C
41448000 IF(OBJACT(X)) RETURN
415C !OBJ HANDLE?
416 I=415
417C !DEFAULT CASE.
418 IF(QHERE(PRSO,HERE)) GO TO 48300
419C !IN ROOM?
420 IF(OADV(PRSO).EQ.WINNER) GO TO 48200
421C !ON WINNER?
422 J=OCAN(PRSO)
423C !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
429C !ASSUME IN ROOM.
430 IF(QHERE(J,HERE)) GO TO 48100
431 IF(OADV(J).NE.WINNER) GO TO 10
432C !NOT HERE OR ON PERSON.
433 I=418
43448100 CALL RSPSUB(I,ODESC2(J))
435C !DESCRIBE FINDINGS.
436 RETURN
437C
43848200 I=416
43948300 CALL RSPSUB(I,ODO2)
440C !DESCRIBE FINDINGS.
441 RETURN
442C
443C V128-- WAIT. RUN CLOCK DEMON.
444C
44549000 CALL RSPEAK(419)
446C !TIME PASSES.
447 DO 49100 I=1,3
448 IF(CLOCKD(X)) RETURN
44949100 CONTINUE
450 RETURN
451C
452C V129-- SPIN.
453C V159-- TURN TO.
454C
45550000 CONTINUE
45688000 IF(.NOT.OBJACT(X)) CALL RSPEAK(663)
457C !IF NOT OBJ, JOKE.
458 RETURN
459C
460C V130-- BOARD. WORKS WITH VEHICLES.
461C
46251000 IF(and(OFLAG2(PRSO),VEHBT).NE.0) GO TO 51100
463 CALL RSPSUB(421,ODO2)
464C !NOT VEHICLE, JOKE.
465 RETURN
466C
46751100 IF(QHERE(PRSO,HERE)) GO TO 51200
468C !HERE?
469 CALL RSPSUB(420,ODO2)
470C !NO, JOKE.
471 RETURN
472C
47351200 IF(AV.EQ.0) GO TO 51300
474C !ALREADY GOT ONE?
475 CALL RSPSUB(422,ODO2)
476C !YES, JOKE.
477 RETURN
478C
47951300 IF(OBJACT(X)) RETURN
480C !OBJ HANDLE?
481 CALL RSPSUB(423,ODO2)
482C !DESCRIBE.
483 AVEHIC(WINNER)=PRSO
484 IF(WINNER.NE.PLAYER) OCAN(AOBJ(WINNER))=PRSO
485 RETURN
486C
487C V131-- DISEMBARK.
488C
48952000 IF(AV.EQ.PRSO) GO TO 52100
490C !FROM VEHICLE?
491 CALL RSPEAK(424)
492C !NO, JOKE.
493 RETURN
494C
49552100 IF(OBJACT(X)) RETURN
496C !OBJ HANDLE?
497 IF(and(RFLAG(HERE),RLAND).NE.0) GO TO 52200
498 CALL RSPEAK(425)
499C !NOT ON LAND.
500 RETURN
501C
50252200 AVEHIC(WINNER)=0
503 CALL RSPEAK(426)
504 IF(WINNER.NE.PLAYER) CALL NEWSTA(AOBJ(WINNER),0,HERE,0,0)
505 RETURN
506C
507C V132-- TAKE. HANDLED EXTERNALLY.
508C
50953000 VAPPLI=TAKE(.TRUE.)
510 RETURN
511C
512C V133-- INVENTORY. PROCESSED EXTERNALLY.
513C
51455000 CALL INVENT(WINNER)
515 RETURN
516C VAPPLI, PAGE 8
517C
518C V134-- FILL. STRANGE DOINGS WITH WATER.
519C
52056000 IF(PRSI.NE.0) GO TO 56050
521C !ANY OBJ SPECIFIED?
522 IF(and(RFLAG(HERE),(RWATER+RFILL)).NE.0) GO TO 56025
523 CALL RSPEAK(516)
524C !NOTHING TO FILL WITH.
525 PRSWON=.FALSE.
526C !YOU LOSE.
527 RETURN
528C
52956025 PRSI=GWATE
530C !USE GLOBAL WATER.
53156050 IF(OBJACT(X)) RETURN
532C !OBJ HANDLE?
533 IF((PRSI.NE.GWATE).AND.(PRSI.NE.WATER))
534& CALL RSPSB2(444,ODI2,ODO2)
535 RETURN
536C
537C V135,V136-- EAT/DRINK
538C
53958000 CONTINUE
54059000 IF(OBJACT(X)) RETURN
541C !OBJ HANDLE?
542 IF(PRSO.EQ.GWATE) GO TO 59500
543C !DRINK GLOBAL WATER?
544 IF(.NOT.EDIBLE(PRSO)) GO TO 59400
545C !EDIBLE?
546 IF(OADV(PRSO).EQ.WINNER) GO TO 59200
547C !YES, ON WINNER?
54859100 CALL RSPSUB(454,ODO2)
549C !NOT ACCESSIBLE.
550 RETURN
551C
55259200 IF(PRSA.EQ.DRINKW) GO TO 59300
553C !DRINK FOOD?
554 CALL NEWSTA(PRSO,455,0,0,0)
555C !NO, IT DISAPPEARS.
556 RETURN
557C
55859300 CALL RSPEAK(456)
559C !YES, JOKE.
560 RETURN
561C
56259400 IF(.NOT.DRKBLE(PRSO)) GO TO 59600
563C !DRINKABLE?
564 IF(OCAN(PRSO).EQ.0) GO TO 59100
565C !YES, IN SOMETHING?
566 IF(OADV(OCAN(PRSO)).NE.WINNER) GO TO 59100
567 IF(QOPEN(OCAN(PRSO))) GO TO 59500
568C !CONT OPEN?
569 CALL RSPEAK(457)
570C !NO, JOKE.
571 RETURN
572C
57359500 CALL NEWSTA(PRSO,458,0,0,0)
574C !GONE.
575 RETURN
576C
57759600 CALL RSPSUB(453,ODO2)
578C !NOT FOOD OR DRINK.
579 RETURN
580C
581C V137-- BURN. COMPLICATED.
582C
58360000 IF(and(OFLAG1(PRSI),(FLAMBT+LITEBT+ONBT)).NE.
584& (FLAMBT+LITEBT+ONBT)) GO TO 60400
585 IF(OBJACT(X)) RETURN
586C !OBJ HANDLE?
587 IF(OCAN(PRSO).NE.RECEP) GO TO 60050
588C !BALLOON?
589 IF(OAPPLI(OACTIO(BALLO),0)) RETURN
590C !DID IT HANDLE?
59160050 IF(and(OFLAG1(PRSO),BURNBT).EQ.0) GO TO 60300
592 IF(OADV(PRSO).NE.WINNER) GO TO 60100
593C !CARRYING IT?
594 CALL RSPSUB(459,ODO2)
595 CALL JIGSUP(460)
596 RETURN
597C
59860100 J=OCAN(PRSO)
599C !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
603C !INSIDE?
604 IF(.NOT.QOPEN(J)) GO TO 60150
605C !OPEN?
606 IF(QHERE(J,HERE).OR.((AV.NE.0).AND.(OCAN(J).EQ.AV)))
607& GO TO 60200
60860150 CALL RSPEAK(461)
609C !CANT REACH IT.
610 RETURN
611C
61260200 CALL RSPSUB(462,ODO2)
613C !BURN IT.
614 CALL NEWSTA(PRSO,0,0,0,0)
615 RETURN
616C
61760300 CALL RSPSUB(463,ODO2)
618C !CANT BURN IT.
619 RETURN
620C
62160400 CALL RSPSUB(301,ODI2)
622C !CANT BURN IT WITH THAT.
623 RETURN
624C VAPPLI, PAGE 9
625C
626C V138-- MUNG. GO TO COMMON ATTACK CODE.
627C
62863000 I=466
629C !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
633C
634C V139-- KILL. GO TO COMMON ATTACK CODE.
635C
63664000 I=467
637C !CHOOSE PHRASE.
638 GO TO 66100
639C
640C V140-- SWING. INVERT OBJECTS, FALL THRU TO ATTACK.
641C
64265000 J=PRSO
643C !INVERT.
644 PRSO=PRSI
645 PRSI=J
646 J=ODO2
647 ODO2=ODI2
648 ODI2=J
649 PRSA=ATTACW
650C !FOR OBJACT.
651C
652C V141-- ATTACK. FALL THRU TO ATTACK CODE.
653C
65466000 I=468
655C
656C COMMON MUNG/ATTACK/SWING/KILL CODE.
657C
65866100 IF(PRSO.NE.0) GO TO 66200
659C !ANYTHING?
660 CALL RSPEAK(469)
661C !NO, JOKE.
662 RETURN
663C
66466200 IF(OBJACT(X)) RETURN
665C !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
670C
67166300 J=471
672C !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
676C !ASSUME SWORD.
677 IF(PRSI.NE.SWORD) MELEE=2
678C !MUST BE KNIFE.
679 I=BLOW(PLAYER,PRSO,MELEE,.TRUE.,0)
680C !STRIKE BLOW.
681 RETURN
682C
68366400 J=472
684C !NOT A WEAPON.
68566500 CALL RSPSB2(I,ODO2,J)
686C !JOKE.
687 RETURN
688C VAPPLI, PAGE 10
689C
690C V142-- WALK. PROCESSED EXTERNALLY.
691C
69268000 VAPPLI=WALK(X)
693 RETURN
694C
695C V143-- TELL. PROCESSED IN GAME.
696C
69769000 CALL RSPEAK(603)
698 RETURN
699C
700C V144-- PUT. PROCESSED EXTERNALLY.
701C
70270000 VAPPLI=PUT(.TRUE.)
703 RETURN
704C
705C V145,V146,V147,V148-- DROP/GIVE/POUR/THROW
706C
70771000 CONTINUE
70872000 CONTINUE
70973000 CONTINUE
71074000 VAPPLI=DROP(.FALSE.)
711 RETURN
712C
713C V149-- SAVE
714C
71577000 IF(and(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 77100
716 CALL RSPEAK(828)
717C !NO SAVES IN ENDGAME.
718 RETURN
719C
72077100 CALL SAVEGM
721 RETURN
722C
723C V150-- RESTORE
724C
725#ifdef PDP
72678000 call restor
727#else
72878000 IF(and(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 78100
729 CALL RSPEAK(829)
730C !NO RESTORES IN ENDGAME.
731 RETURN
732C
73378100 CALL RSTRGM
734#endif PDP
735 RETURN
736C VAPPLI, PAGE 11
737C
738C V151-- HELLO
739C
74080000 IF(PRSO.NE.0) GO TO 80100
741C !ANY OBJ?
742 CALL RSPEAK(346+RND(4))
743C !NO, VANILLA HELLO.
744 RETURN
745C
74680100 IF(PRSO.NE.AVIAT) GO TO 80200
747C !HELLO AVIATOR?
748 CALL RSPEAK(350)
749C !NOTHING HAPPENS.
750 RETURN
751C
75280200 IF(PRSO.NE.SAILO) GO TO 80300
753C !HELLO SAILOR?
754 HS=HS+1
755C !COUNT.
756 I=351
757C !GIVE NORMAL OR
758 IF(MOD(HS,10).EQ.0) I=352
759C !RANDOM MESSAGE.
760 IF(MOD(HS,20).EQ.0) I=353
761 CALL RSPEAK(I)
762C !SPEAK UP.
763 RETURN
764C
76580300 IF(OBJACT(X)) RETURN
766C !OBJ HANDLE?
767 I=354
768C !ASSUME VILLAIN.
769 IF(and(OFLAG2(PRSO),(VILLBT+ACTRBT)).EQ.0) I=355
770 CALL RSPSUB(I,ODO2)
771C !HELLO THERE
772C !
773 RETURN
774C
775C V152-- LOOK INTO
776C
77781000 IF(OBJACT(X)) RETURN
778C !OBJ HANDLE?
779 IF(and(OFLAG1(PRSO),DOORBT).EQ.0) GO TO 81300
780 IF(.NOT.QOPEN(PRSO)) GO TO 81200
781C !OPEN?
782 CALL RSPSUB(628,ODO2)
783C !OPEN DOOR- UNINTERESTING.
784 RETURN
785C
78681200 CALL RSPSUB(525,ODO2)
787C !CLOSED DOOR- CANT SEE.
788 RETURN
789C
79081300 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)
795C !CANT LOOK INSIDE.
796 RETURN
797C
79881400 IF(QEMPTY(PRSO)) GO TO 81500
799C !VEH OR SEE IN. EMPTY?
800 CALL PRINCO(PRSO,573)
801C !NO, LIST CONTENTS.
802 RETURN
803C
80481500 CALL RSPSUB(629,ODO2)
805C !EMPTY.
806 RETURN
807C
808C V153-- LOOK UNDER
809C
81082000 IF(.NOT.OBJACT(X)) CALL RSPEAK(631)
811C !OBJECT HANDLE?
812 RETURN
813C VAPPLI, PAGE 12
814C
815C V154-- PUMP
816C
81783000 IF((OROOM(PUMP).EQ.HERE).OR.(OADV(PUMP).EQ.WINNER))
818& GO TO 83100
819 CALL RSPEAK(632)
820C !NO.
821 RETURN
822C
82383100 PRSI=PUMP
824C !BECOMES INFLATE
825 PRSA=INFLAW
826C !X WITH PUMP.
827 GO TO 22000
828C !DONE.
829C
830C V155-- WIND
831C
83284000 IF(.NOT.OBJACT(X)) CALL RSPSUB(634,ODO2)
833C !OBJ HANDLE?
834 RETURN
835C
836C V156-- CLIMB
837C V157-- CLIMB UP
838C V158-- CLIMB DOWN
839C
84085000 CONTINUE
84186000 CONTINUE
84287000 I=XUP
843C !ASSUME UP.
844 IF(PRSA.EQ.CLMBDW) I=XDOWN
845C !UNLESS CLIMB DN.
846 F=(and(OFLAG2(PRSO),CLMBBT)).NE.0
847 IF(F.AND.FINDXT(I,HERE)) GO TO 87500
848C !ANYTHING TO CLIMB?
849 IF(OBJACT(X)) RETURN
850C !OBJ HANDLE?
851 I=657
852 IF(F) I=524
853C !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)
858C !JOKE.
859 RETURN
860C
86187500 PRSA=WALKW
862C !WALK
863 PRSO=I
864C !IN SPECIFIED DIR.
865 VAPPLI=WALK(X)
866 RETURN
867C
868 END
869C CLOCKD- CLOCK DEMON FOR INTERMOVE CLOCK EVENTS
870C
871C DECLARATIONS
872C
873 LOGICAL FUNCTION CLOCKD(X)
874 IMPLICIT INTEGER (A-Z)
875C
876C CLOCK INTERRUPTS
877C
878#include "clock.h"
879C
880 CLOCKD=.FALSE.
881C !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
885C !PERMANENT ENTRY?
886 CTICK(I)=CTICK(I)-1
887 IF(CTICK(I).NE.0) GO TO 100
888C !TIMER EXPIRED?
88950 CLOCKD=.TRUE.
890 CALL CEVAPP(CACTIO(I))
891C !DO ACTION.
892100 CONTINUE
893 RETURN
894C
895 END