date and time created 88/12/14 15:30:08 by sklower
[unix-history] / usr / src / contrib / dungeon / villns.F
CommitLineData
8b22683c
KB
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