xref: /original-bsd/contrib/dungeon/verbs.F (revision 4aa23bb2)
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
896