Commit | Line | Data |
---|---|---|
8b22683c KB |
1 | C TROLLP- TROLL FUNCTION |
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 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" | |
19 | C TROLLP, PAGE 2 | |
20 | C | |
21 | TROLLP=.TRUE. | |
22 | C !ASSUME WINS. | |
23 | IF(PRSA.NE.FIGHTW) GO TO 1100 | |
24 | C !FIGHT? | |
25 | IF(OCAN(AXE).EQ.TROLL) GO TO 10 | |
26 | C !GOT AXE? NOTHING. | |
27 | I=433 | |
28 | C !ASSUME CANT GET. | |
29 | IF(.NOT.QHERE(AXE,HERE)) GO TO 1050 | |
30 | C !HERE? | |
31 | I=434 | |
32 | C !YES, RECOVER. | |
33 | CALL NEWSTA(AXE,0,0,TROLL,0) | |
34 | 1050 IF(QHERE(TROLL,HERE)) CALL RSPEAK(I) | |
35 | C !IF PLAYER HERE. | |
36 | RETURN | |
37 | C | |
38 | 1100 IF(PRSA.NE.DEADXW) GO TO 1200 | |
39 | C !DEAD? | |
40 | TROLLF=.TRUE. | |
41 | C !PERMIT EXITS. | |
42 | RETURN | |
43 | C | |
44 | 1200 IF(PRSA.NE.OUTXW) GO TO 1300 | |
45 | C !OUT? | |
46 | TROLLF=.TRUE. | |
47 | C !PERMIT EXITS. | |
48 | OFLAG1(AXE)=and(OFLAG1(AXE), not(VISIBT)) | |
49 | ODESC1(TROLL)=435 | |
50 | C !TROLL OUT. | |
51 | RETURN | |
52 | C | |
53 | 1300 IF(PRSA.NE.INXW) GO TO 1400 | |
54 | C !WAKE UP? | |
55 | TROLLF=.FALSE. | |
56 | C !FORBID EXITS. | |
57 | OFLAG1(AXE)=or(OFLAG1(AXE),VISIBT) | |
58 | ODESC1(TROLL)=436 | |
59 | C !TROLL IN. | |
60 | IF(QHERE(TROLL,HERE)) CALL RSPEAK(437) | |
61 | RETURN | |
62 | C | |
63 | 1400 IF(PRSA.NE.FRSTQW) GO TO 1500 | |
64 | C !FIRST ENCOUNTER? | |
65 | TROLLP=PROB(33,66) | |
66 | C !33% TRUE UNLESS BADLK. | |
67 | RETURN | |
68 | C | |
69 | 1500 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 | |
72 | C !TROLL OUT? | |
73 | OCAPAC(TROLL)=-OCAPAC(TROLL) | |
74 | C !YES, WAKE HIM. | |
75 | OFLAG1(AXE)=or(OFLAG1(AXE),VISIBT) | |
76 | TROLLF=.FALSE. | |
77 | ODESC1(TROLL)=436 | |
78 | CALL RSPEAK(437) | |
79 | C | |
80 | 1550 IF((PRSA.NE.TAKEW).AND.(PRSA.NE.MOVEW)) GO TO 1600 | |
81 | CALL RSPEAK(438) | |
82 | C !JOKE. | |
83 | RETURN | |
84 | C | |
85 | 1600 IF(PRSA.NE.MUNGW) GO TO 1700 | |
86 | C !MUNG? | |
87 | CALL RSPEAK(439) | |
88 | C !JOKE. | |
89 | RETURN | |
90 | C | |
91 | 1700 IF(PRSO.EQ.0) GO TO 10 | |
92 | C !NO OBJECT? | |
93 | I=440 | |
94 | C !ASSUME THROW. | |
95 | IF(PRSA.EQ.GIVEW) I=441 | |
96 | C !GIVE? | |
97 | CALL RSPSUB(I,ODESC2(PRSO)) | |
98 | C !TROLL TAKES. | |
99 | IF(PRSO.EQ.KNIFE) GO TO 1900 | |
100 | C !OBJ KNIFE? | |
101 | CALL NEWSTA(PRSO,442,0,0,0) | |
102 | C !NO, EATS IT. | |
103 | RETURN | |
104 | C | |
105 | 1900 CALL RSPEAK(443) | |
106 | C !KNIFE, THROWS IT BACK | |
107 | OFLAG2(TROLL)=or(OFLAG2(TROLL),FITEBT) | |
108 | RETURN | |
109 | C | |
110 | 2000 IF(.NOT.TROLLF.OR.(PRSA.NE.HELLOW)) GO TO 10 | |
111 | CALL RSPEAK(366) | |
112 | C !TROLL OUT. | |
113 | RETURN | |
114 | C | |
115 | 10 TROLLP=.FALSE. | |
116 | C !COULDNT HANDLE IT. | |
117 | RETURN | |
118 | END | |
119 | C CYCLOP- CYCLOPS FUNCTION | |
120 | C | |
121 | C DECLARATIONS | |
122 | C | |
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" | |
132 | C CYCLOP, PAGE 2 | |
133 | C | |
134 | CYCLOP=.TRUE. | |
135 | C !ASSUME WINS. | |
136 | IF(.NOT.CYCLOF) GO TO 100 | |
137 | C !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. | |
142 | C !WAKE CYCLOPS. | |
143 | CALL RSPEAK(187) | |
144 | C !DESCRIBE. | |
145 | RVCYC=IABS(RVCYC) | |
146 | OFLAG2(CYCLO)=and(or(OFLAG2(CYCLO),FITEBT),not(SLEPBT)) | |
147 | RETURN | |
148 | C | |
149 | 100 IF((PRSA.EQ.FIGHTW).OR.(PRSA.EQ.FRSTQW)) GO TO 10 | |
150 | IF(IABS(RVCYC).LE.5) GO TO 200 | |
151 | C !ANNOYED TOO MUCH? | |
152 | RVCYC=0 | |
153 | C !RESTART COUNT. | |
154 | CALL JIGSUP(188) | |
155 | C !YES, EATS PLAYER. | |
156 | RETURN | |
157 | C | |
158 | 200 IF(PRSA.NE.GIVEW) GO TO 500 | |
159 | C !GIVE? | |
160 | IF((PRSO.NE.FOOD).OR.(RVCYC.LT.0)) GO TO 300 | |
161 | C !FOOD WHEN HUNGRY? | |
162 | CALL NEWSTA(FOOD,189,0,0,0) | |
163 | C !EATS PEPPERS. | |
164 | RVCYC=MIN0(-1,-RVCYC) | |
165 | C !GETS THIRSTY. | |
166 | RETURN | |
167 | C | |
168 | 300 IF(PRSO.NE.WATER) GO TO 400 | |
169 | C !DRINK WHEN THIRSTY? | |
170 | IF(RVCYC.GE.0) GO TO 350 | |
171 | CALL NEWSTA(PRSO,190,0,0,0) | |
172 | C !DRINKS AND | |
173 | CYCLOF=.TRUE. | |
174 | C !FALLS ASLEEP. | |
175 | OFLAG2(CYCLO)=and(or(OFLAG2(CYCLO),SLEPBT),not(FITEBT)) | |
176 | RETURN | |
177 | C | |
178 | 350 CALL RSPEAK(191) | |
179 | C !NOT THIRSTY. | |
180 | 10 CYCLOP=.FALSE. | |
181 | C !FAILS. | |
182 | RETURN | |
183 | C | |
184 | 400 I=192 | |
185 | C !ASSUME INEDIBLE. | |
186 | IF(PRSO.EQ.GARLI) I=193 | |
187 | C !GARLIC IS JOKE. | |
188 | 450 CALL RSPEAK(I) | |
189 | C !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 | |
194 | C | |
195 | 500 I=0 | |
196 | C !ASSUME NOT HANDLED. | |
197 | IF(PRSA.EQ.HELLOW) GO TO 450 | |
198 | C !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 | |
203 | C !SEE IF HANDLED. | |
204 | C | |
205 | END | |
206 | C THIEFP- THIEF FUNCTION | |
207 | C | |
208 | C DECLARATIONS | |
209 | C | |
210 | LOGICAL FUNCTION THIEFP(ARG) | |
211 | IMPLICIT INTEGER (A-Z) | |
212 | LOGICAL QHERE,PROB | |
213 | #include "parser.h" | |
214 | #include "gamestate.h" | |
215 | C | |
216 | C 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" | |
226 | C THIEFP, PAGE 2 | |
227 | C | |
228 | THIEFP=.TRUE. | |
229 | C !ASSUME WINS. | |
230 | IF(PRSA.NE.FIGHTW) GO TO 100 | |
231 | C !FIGHT? | |
232 | IF(OCAN(STILL).EQ.THIEF) GO TO 10 | |
233 | C !GOT STILLETTO? F. | |
234 | IF(QHERE(STILL,THFPOS)) GO TO 50 | |
235 | C !CAN HE RECOVER IT? | |
236 | CALL NEWSTA(THIEF,0,0,0,0) | |
237 | C !NO, VANISH. | |
238 | IF(QHERE(THIEF,HERE)) CALL RSPEAK(498) | |
239 | C !IF HERO, TELL. | |
240 | RETURN | |
241 | C | |
242 | 50 CALL NEWSTA(STILL,0,0,THIEF,0) | |
243 | C !YES, RECOVER. | |
244 | IF(QHERE(THIEF,HERE)) CALL RSPEAK(499) | |
245 | C !IF HERO, TELL. | |
246 | RETURN | |
247 | C | |
248 | 100 IF(PRSA.NE.DEADXW) GO TO 200 | |
249 | C !DEAD? | |
250 | THFACT=.FALSE. | |
251 | C !DISABLE DEMON. | |
252 | OFLAG1(CHALI)=or(OFLAG1(CHALI),TAKEBT) | |
253 | J=0 | |
254 | DO 125 I=1,OLNT | |
255 | C !CARRYING ANYTHING? | |
256 | 125 IF(OADV(I).EQ.-THIEF) J=500 | |
257 | CALL RSPEAK(J) | |
258 | C !TELL IF BOOTY REAPPEARS. | |
259 | C | |
260 | J=501 | |
261 | DO 150 I=1,OLNT | |
262 | C !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)) | |
267 | C !DESCRIBE. | |
268 | J=502 | |
269 | GO TO 150 | |
270 | C | |
271 | 135 IF(OADV(I).EQ.-THIEF) CALL NEWSTA(I,0,HERE,0,0) | |
272 | 150 CONTINUE | |
273 | RETURN | |
274 | C | |
275 | 200 IF(PRSA.NE.FRSTQW) GO TO 250 | |
276 | C !FIRST ENCOUNTER? | |
277 | THIEFP=PROB(20,75) | |
278 | RETURN | |
279 | C | |
280 | 250 IF((PRSA.NE.HELLOW).OR.(ODESC1(THIEF).NE.504)) | |
281 | & GO TO 300 | |
282 | CALL RSPEAK(626) | |
283 | RETURN | |
284 | C | |
285 | 300 IF(PRSA.NE.OUTXW) GO TO 400 | |
286 | C !OUT? | |
287 | THFACT=.FALSE. | |
288 | C !DISABLE DEMON. | |
289 | ODESC1(THIEF)=504 | |
290 | C !CHANGE DESCRIPTION. | |
291 | OFLAG1(STILL)=and(OFLAG1(STILL),not(VISIBT)) | |
292 | OFLAG1(CHALI)=or(OFLAG1(CHALI),TAKEBT) | |
293 | RETURN | |
294 | C | |
295 | 400 IF(PRSA.NE.INXW) GO TO 500 | |
296 | C !IN? | |
297 | IF(QHERE(THIEF,HERE)) CALL RSPEAK(505) | |
298 | C !CAN HERO SEE? | |
299 | THFACT=.TRUE. | |
300 | C !ENABLE DEMON. | |
301 | ODESC1(THIEF)=503 | |
302 | C !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 | |
307 | C | |
308 | 500 IF(PRSA.NE.TAKEW) GO TO 600 | |
309 | C !TAKE? | |
310 | CALL RSPEAK(506) | |
311 | C !JOKE. | |
312 | RETURN | |
313 | C | |
314 | 600 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 | |
317 | C !THREW KNIFE, 10%? | |
318 | CALL RSPEAK(507) | |
319 | C !NO, JUST MAKES | |
320 | OFLAG2(THIEF)=or(OFLAG2(THIEF),FITEBT) | |
321 | RETURN | |
322 | C | |
323 | 650 J=508 | |
324 | C !THIEF DROPS STUFF. | |
325 | DO 675 I=1,OLNT | |
326 | IF(OADV(I).NE.-THIEF) GO TO 675 | |
327 | C !THIEF CARRYING? | |
328 | J=509 | |
329 | CALL NEWSTA(I,0,HERE,0,0) | |
330 | 675 CONTINUE | |
331 | CALL NEWSTA(THIEF,J,0,0,0) | |
332 | C !THIEF VANISHES. | |
333 | RETURN | |
334 | C | |
335 | 700 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 | |
338 | C !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) | |
344 | C | |
345 | 750 IF((PRSO.NE.BRICK).OR.(OCAN(FUSE).NE.BRICK).OR. | |
346 | & (CTICK(CEVFUS).EQ.0)) GO TO 800 | |
347 | CALL RSPEAK(511) | |
348 | C !THIEF REFUSES BOMB. | |
349 | RETURN | |
350 | C | |
351 | 800 CALL NEWSTA(PRSO,0,0,0,-THIEF) | |
352 | C !THIEF TAKES GIFT. | |
353 | IF(OTVAL(PRSO).GT.0) GO TO 900 | |
354 | C !A TREASURE? | |
355 | CALL RSPSUB(512,ODESC2(PRSO)) | |
356 | RETURN | |
357 | C | |
358 | 900 CALL RSPSUB(627,ODESC2(PRSO)) | |
359 | C !THIEF ENGROSSED. | |
360 | THFENF=.TRUE. | |
361 | RETURN | |
362 | C | |
363 | 10 THIEFP=.FALSE. | |
364 | RETURN | |
365 | END |