|
|
1.1 root 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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.