xref: /original-bsd/contrib/dungeon/villns.F (revision 3b6250d9)
1C TROLLP-	TROLL FUNCTION
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 TROLLP(ARG)
10	IMPLICIT INTEGER (A-Z)
11	LOGICAL QHERE,PROB
12#include "parser.h"
13#include "gamestate.h"
14#include "objects.h"
15#include "oflags.h"
16#include "oindex.h"
17#include "verbs.h"
18#include "flags.h"
19C TROLLP, PAGE 2
20C
21	TROLLP=.TRUE.
22C						!ASSUME WINS.
23	IF(PRSA.NE.FIGHTW) GO TO 1100
24C						!FIGHT?
25	IF(OCAN(AXE).EQ.TROLL) GO TO 10
26C						!GOT AXE?  NOTHING.
27	I=433
28C						!ASSUME CANT GET.
29	IF(.NOT.QHERE(AXE,HERE)) GO TO 1050
30C						!HERE?
31	I=434
32C						!YES, RECOVER.
33	CALL NEWSTA(AXE,0,0,TROLL,0)
341050	IF(QHERE(TROLL,HERE)) CALL RSPEAK(I)
35C						!IF PLAYER HERE.
36	RETURN
37C
381100	IF(PRSA.NE.DEADXW) GO TO 1200
39C						!DEAD?
40	TROLLF=.TRUE.
41C						!PERMIT EXITS.
42	RETURN
43C
441200	IF(PRSA.NE.OUTXW) GO TO 1300
45C						!OUT?
46	TROLLF=.TRUE.
47C						!PERMIT EXITS.
48	OFLAG1(AXE)=and(OFLAG1(AXE), not(VISIBT))
49	ODESC1(TROLL)=435
50C						!TROLL OUT.
51	RETURN
52C
531300	IF(PRSA.NE.INXW) GO TO 1400
54C						!WAKE UP?
55	TROLLF=.FALSE.
56C						!FORBID EXITS.
57	OFLAG1(AXE)=or(OFLAG1(AXE),VISIBT)
58	ODESC1(TROLL)=436
59C						!TROLL IN.
60	IF(QHERE(TROLL,HERE)) CALL RSPEAK(437)
61	RETURN
62C
631400	IF(PRSA.NE.FRSTQW) GO TO 1500
64C						!FIRST ENCOUNTER?
65	TROLLP=PROB(33,66)
66C						!33% TRUE UNLESS BADLK.
67	RETURN
68C
691500	IF((PRSA.NE.MOVEW).AND.(PRSA.NE.TAKEW).AND.(PRSA.NE.MUNGW)
70&		.AND.(PRSA.NE.THROWW).AND.(PRSA.NE.GIVEW)) GO TO 2000
71	IF(OCAPAC(TROLL).GE.0) GO TO 1550
72C						!TROLL OUT?
73	OCAPAC(TROLL)=-OCAPAC(TROLL)
74C						!YES, WAKE HIM.
75	OFLAG1(AXE)=or(OFLAG1(AXE),VISIBT)
76	TROLLF=.FALSE.
77	ODESC1(TROLL)=436
78	CALL RSPEAK(437)
79C
801550	IF((PRSA.NE.TAKEW).AND.(PRSA.NE.MOVEW)) GO TO 1600
81	CALL RSPEAK(438)
82C						!JOKE.
83	RETURN
84C
851600	IF(PRSA.NE.MUNGW) GO TO 1700
86C						!MUNG?
87	CALL RSPEAK(439)
88C						!JOKE.
89	RETURN
90C
911700	IF(PRSO.EQ.0) GO TO 10
92C						!NO OBJECT?
93	I=440
94C						!ASSUME THROW.
95	IF(PRSA.EQ.GIVEW) I=441
96C						!GIVE?
97	CALL RSPSUB(I,ODESC2(PRSO))
98C						!TROLL TAKES.
99	IF(PRSO.EQ.KNIFE) GO TO 1900
100C						!OBJ KNIFE?
101	CALL NEWSTA(PRSO,442,0,0,0)
102C						!NO, EATS IT.
103	RETURN
104C
1051900	CALL RSPEAK(443)
106C						!KNIFE, THROWS IT BACK
107	OFLAG2(TROLL)=or(OFLAG2(TROLL),FITEBT)
108	RETURN
109C
1102000	IF(.NOT.TROLLF.OR.(PRSA.NE.HELLOW)) GO TO 10
111	CALL RSPEAK(366)
112C						!TROLL OUT.
113	RETURN
114C
11510	TROLLP=.FALSE.
116C						!COULDNT HANDLE IT.
117	RETURN
118	END
119C CYCLOP-	CYCLOPS FUNCTION
120C
121C DECLARATIONS
122C
123	LOGICAL FUNCTION CYCLOP(ARG)
124	IMPLICIT INTEGER (A-Z)
125#include "parser.h"
126#include "gamestate.h"
127#include "objects.h"
128#include "oflags.h"
129#include "oindex.h"
130#include "verbs.h"
131#include "flags.h"
132C CYCLOP, PAGE 2
133C
134	CYCLOP=.TRUE.
135C						!ASSUME WINS.
136	IF(.NOT.CYCLOF) GO TO 100
137C						!ASLEEP?
138	IF((PRSA.NE.ALARMW).AND.(PRSA.NE.MUNGW).AND.(PRSA.NE.HELLOW).AND.
139&		(PRSA.NE.BURNW).AND.(PRSA.NE.KILLW).AND.(PRSA.NE.ATTACW))
140&		 GO TO 10
141	CYCLOF=.FALSE.
142C						!WAKE CYCLOPS.
143	CALL RSPEAK(187)
144C						!DESCRIBE.
145	RVCYC=IABS(RVCYC)
146	OFLAG2(CYCLO)=and(or(OFLAG2(CYCLO),FITEBT),not(SLEPBT))
147	RETURN
148C
149100	IF((PRSA.EQ.FIGHTW).OR.(PRSA.EQ.FRSTQW)) GO TO 10
150	IF(IABS(RVCYC).LE.5) GO TO 200
151C						!ANNOYED TOO MUCH?
152	RVCYC=0
153C						!RESTART COUNT.
154	CALL JIGSUP(188)
155C						!YES, EATS PLAYER.
156	RETURN
157C
158200	IF(PRSA.NE.GIVEW) GO TO 500
159C						!GIVE?
160	IF((PRSO.NE.FOOD).OR.(RVCYC.LT.0)) GO TO 300
161C						!FOOD WHEN HUNGRY?
162	CALL NEWSTA(FOOD,189,0,0,0)
163C						!EATS PEPPERS.
164	RVCYC=MIN0(-1,-RVCYC)
165C						!GETS THIRSTY.
166	RETURN
167C
168300	IF(PRSO.NE.WATER) GO TO 400
169C						!DRINK WHEN THIRSTY?
170	IF(RVCYC.GE.0) GO TO 350
171	CALL NEWSTA(PRSO,190,0,0,0)
172C						!DRINKS AND
173	CYCLOF=.TRUE.
174C						!FALLS ASLEEP.
175	OFLAG2(CYCLO)=and(or(OFLAG2(CYCLO),SLEPBT),not(FITEBT))
176	RETURN
177C
178350	CALL RSPEAK(191)
179C						!NOT THIRSTY.
18010	CYCLOP=.FALSE.
181C						!FAILS.
182	RETURN
183C
184400	I=192
185C						!ASSUME INEDIBLE.
186	IF(PRSO.EQ.GARLI) I=193
187C						!GARLIC IS JOKE.
188450	CALL RSPEAK(I)
189C						!DISDAIN IT.
190	IF(RVCYC.LT.0) RVCYC=RVCYC-1
191	IF(RVCYC.GE.0) RVCYC=RVCYC+1
192	IF(.NOT.CYCLOF) CALL RSPEAK(193+IABS(RVCYC))
193	RETURN
194C
195500	I=0
196C						!ASSUME NOT HANDLED.
197	IF(PRSA.EQ.HELLOW) GO TO 450
198C						!HELLO IS NO GO.
199	IF((PRSA.EQ.THROWW).OR.(PRSA.EQ.MUNGW)) I=200+RND(2)
200	IF(PRSA.EQ.TAKEW) I=202
201	IF(PRSA.EQ.TIEW) I=203
202	IF(I) 10,10,450
203C						!SEE IF HANDLED.
204C
205	END
206C THIEFP-	THIEF FUNCTION
207C
208C DECLARATIONS
209C
210	LOGICAL FUNCTION THIEFP(ARG)
211	IMPLICIT INTEGER (A-Z)
212	LOGICAL QHERE,PROB
213#include "parser.h"
214#include "gamestate.h"
215C
216C ROOMS
217#include "rindex.h"
218#include "objects.h"
219#include "oflags.h"
220#include "oindex.h"
221#include "clock.h"
222
223#include "villians.h"
224#include "verbs.h"
225#include "flags.h"
226C THIEFP, PAGE 2
227C
228	THIEFP=.TRUE.
229C						!ASSUME WINS.
230	IF(PRSA.NE.FIGHTW) GO TO 100
231C						!FIGHT?
232	IF(OCAN(STILL).EQ.THIEF) GO TO 10
233C						!GOT STILLETTO?  F.
234	IF(QHERE(STILL,THFPOS)) GO TO 50
235C						!CAN HE RECOVER IT?
236	CALL NEWSTA(THIEF,0,0,0,0)
237C						!NO, VANISH.
238	IF(QHERE(THIEF,HERE)) CALL RSPEAK(498)
239C						!IF HERO, TELL.
240	RETURN
241C
24250	CALL NEWSTA(STILL,0,0,THIEF,0)
243C						!YES, RECOVER.
244	IF(QHERE(THIEF,HERE)) CALL RSPEAK(499)
245C						!IF HERO, TELL.
246	RETURN
247C
248100	IF(PRSA.NE.DEADXW) GO TO 200
249C						!DEAD?
250	THFACT=.FALSE.
251C						!DISABLE DEMON.
252	OFLAG1(CHALI)=or(OFLAG1(CHALI),TAKEBT)
253	J=0
254	DO 125 I=1,OLNT
255C						!CARRYING ANYTHING?
256125	  IF(OADV(I).EQ.-THIEF) J=500
257	CALL RSPEAK(J)
258C						!TELL IF BOOTY REAPPEARS.
259C
260	J=501
261	DO 150 I=1,OLNT
262C						!LOOP.
263	  IF((I.EQ.CHALI).OR.(I.EQ.THIEF).OR.(HERE.NE.TREAS)
264&		.OR. .NOT.QHERE(I,HERE)) GO TO 135
265	  OFLAG1(I)=or(OFLAG1(I),VISIBT)
266	  CALL RSPSUB(J,ODESC2(I))
267C						!DESCRIBE.
268	  J=502
269	  GO TO 150
270C
271135	  IF(OADV(I).EQ.-THIEF) CALL NEWSTA(I,0,HERE,0,0)
272150	CONTINUE
273	RETURN
274C
275200	IF(PRSA.NE.FRSTQW) GO TO 250
276C						!FIRST ENCOUNTER?
277	THIEFP=PROB(20,75)
278	RETURN
279C
280250	IF((PRSA.NE.HELLOW).OR.(ODESC1(THIEF).NE.504))
281&		GO TO 300
282	CALL RSPEAK(626)
283	RETURN
284C
285300	IF(PRSA.NE.OUTXW) GO TO 400
286C						!OUT?
287	THFACT=.FALSE.
288C						!DISABLE DEMON.
289	ODESC1(THIEF)=504
290C						!CHANGE DESCRIPTION.
291	OFLAG1(STILL)=and(OFLAG1(STILL),not(VISIBT))
292	OFLAG1(CHALI)=or(OFLAG1(CHALI),TAKEBT)
293	RETURN
294C
295400	IF(PRSA.NE.INXW) GO TO 500
296C						!IN?
297	IF(QHERE(THIEF,HERE)) CALL RSPEAK(505)
298C						!CAN HERO SEE?
299	THFACT=.TRUE.
300C						!ENABLE DEMON.
301	ODESC1(THIEF)=503
302C						!CHANGE DESCRIPTION.
303	OFLAG1(STILL)=or(OFLAG1(STILL),VISIBT)
304	IF((HERE.EQ.TREAS).AND.QHERE(CHALI,HERE))
305&		OFLAG1(CHALI)=and(OFLAG1(CHALI),not(TAKEBT))
306	RETURN
307C
308500	IF(PRSA.NE.TAKEW) GO TO 600
309C						!TAKE?
310	CALL RSPEAK(506)
311C						!JOKE.
312	RETURN
313C
314600	IF((PRSA.NE.THROWW).OR.(PRSO.NE.KNIFE).OR.
315&		(and(OFLAG2(THIEF),FITEBT).NE.0)) GO TO 700
316	IF(PROB(10)) GO TO 650
317C						!THREW KNIFE, 10%?
318	CALL RSPEAK(507)
319C						!NO, JUST MAKES
320	OFLAG2(THIEF)=or(OFLAG2(THIEF),FITEBT)
321	RETURN
322C
323650	J=508
324C						!THIEF DROPS STUFF.
325	DO 675 I=1,OLNT
326	  IF(OADV(I).NE.-THIEF) GO TO 675
327C						!THIEF CARRYING?
328	  J=509
329	  CALL NEWSTA(I,0,HERE,0,0)
330675	CONTINUE
331	CALL NEWSTA(THIEF,J,0,0,0)
332C						!THIEF VANISHES.
333	RETURN
334C
335700	IF(((PRSA.NE.THROWW).AND.(PRSA.NE.GIVEW)).OR.(PRSO.EQ.0).OR.
336&		(PRSO.EQ.THIEF)) GO TO 10
337	IF(OCAPAC(THIEF).GE.0) GO TO 750
338C						!WAKE HIM UP.
339	OCAPAC(THIEF)=-OCAPAC(THIEF)
340	THFACT=.TRUE.
341	OFLAG1(STILL)=or(OFLAG1(STILL),VISIBT)
342	ODESC1(THIEF)=503
343	CALL RSPEAK(510)
344C
345750	IF((PRSO.NE.BRICK).OR.(OCAN(FUSE).NE.BRICK).OR.
346&		(CTICK(CEVFUS).EQ.0)) GO TO 800
347	CALL RSPEAK(511)
348C						!THIEF REFUSES BOMB.
349	RETURN
350C
351800	CALL NEWSTA(PRSO,0,0,0,-THIEF)
352C						!THIEF TAKES GIFT.
353	IF(OTVAL(PRSO).GT.0) GO TO 900
354C						!A TREASURE?
355	CALL RSPSUB(512,ODESC2(PRSO))
356	RETURN
357C
358900	CALL RSPSUB(627,ODESC2(PRSO))
359C						!THIEF ENGROSSED.
360	THFENF=.TRUE.
361	RETURN
362C
36310	THIEFP=.FALSE.
364	RETURN
365	END
366