This repository has been archived by the owner on Oct 13, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 25
/
villns.for
365 lines (364 loc) · 7.53 KB
/
villns.for
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
C TROLLP- TROLL FUNCTION
C
C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
C WRITTEN BY R. M. SUPNIK
C
C DECLARATIONS
C
LOGICAL FUNCTION TROLLP(ARG)
IMPLICIT INTEGER (A-Z)
LOGICAL QHERE,PROB
include 'parser.h'
include 'gamestat.h'
include 'objects.h'
include 'oflags.h'
include 'oindex.h'
include 'verbs.h'
include 'flags.h'
C TROLLP, PAGE 2
C
TROLLP=.TRUE.
C !ASSUME WINS.
IF(PRSA.NE.FIGHTW) GO TO 1100
C !FIGHT?
IF(OCAN(AXE).EQ.TROLL) GO TO 10
C !GOT AXE? NOTHING.
I=433
C !ASSUME CANT GET.
IF(.NOT.QHERE(AXE,HERE)) GO TO 1050
C !HERE?
I=434
C !YES, RECOVER.
CALL NEWSTA(AXE,0,0,TROLL,0)
1050 IF(QHERE(TROLL,HERE)) CALL RSPEAK(I)
C !IF PLAYER HERE.
RETURN
C
1100 IF(PRSA.NE.DEADXW) GO TO 1200
C !DEAD?
TROLLF=.TRUE.
C !PERMIT EXITS.
RETURN
C
1200 IF(PRSA.NE.OUTXW) GO TO 1300
C !OUT?
TROLLF=.TRUE.
C !PERMIT EXITS.
OFLAG1(AXE)=IAND(OFLAG1(AXE), not(VISIBT))
ODESC1(TROLL)=435
C !TROLL OUT.
RETURN
C
1300 IF(PRSA.NE.INXW) GO TO 1400
C !WAKE UP?
TROLLF=.FALSE.
C !FORBID EXITS.
OFLAG1(AXE)=IOR(OFLAG1(AXE),VISIBT)
ODESC1(TROLL)=436
C !TROLL IN.
IF(QHERE(TROLL,HERE)) CALL RSPEAK(437)
RETURN
C
1400 IF(PRSA.NE.FRSTQW) GO TO 1500
C !FIRST ENCOUNTER?
TROLLP=PROB(33,66)
C !33% TRUE UNLESS BADLK.
RETURN
C
1500 IF((PRSA.NE.MOVEW).AND.(PRSA.NE.TAKEW).AND.(PRSA.NE.MUNGW)
& .AND.(PRSA.NE.THROWW).AND.(PRSA.NE.GIVEW)) GO TO 2000
IF(OCAPAC(TROLL).GE.0) GO TO 1550
C !TROLL OUT?
OCAPAC(TROLL)=-OCAPAC(TROLL)
C !YES, WAKE HIM.
OFLAG1(AXE)=IOR(OFLAG1(AXE),VISIBT)
TROLLF=.FALSE.
ODESC1(TROLL)=436
CALL RSPEAK(437)
C
1550 IF((PRSA.NE.TAKEW).AND.(PRSA.NE.MOVEW)) GO TO 1600
CALL RSPEAK(438)
C !JOKE.
RETURN
C
1600 IF(PRSA.NE.MUNGW) GO TO 1700
C !MUNG?
CALL RSPEAK(439)
C !JOKE.
RETURN
C
1700 IF(PRSO.EQ.0) GO TO 10
C !NO OBJECT?
I=440
C !ASSUME THROW.
IF(PRSA.EQ.GIVEW) I=441
C !GIVE?
CALL RSPSUB(I,ODESC2(PRSO))
C !TROLL TAKES.
IF(PRSO.EQ.KNIFE) GO TO 1900
C !OBJ KNIFE?
CALL NEWSTA(PRSO,442,0,0,0)
C !NO, EATS IT.
RETURN
C
1900 CALL RSPEAK(443)
C !KNIFE, THROWS IT BACK
OFLAG2(TROLL)=IOR(OFLAG2(TROLL),FITEBT)
RETURN
C
2000 IF(.NOT.TROLLF.OR.(PRSA.NE.HELLOW)) GO TO 10
CALL RSPEAK(366)
C !TROLL OUT.
RETURN
C
10 TROLLP=.FALSE.
C !COULDNT HANDLE IT.
RETURN
END
C CYCLOP- CYCLOPS FUNCTION
C
C DECLARATIONS
C
LOGICAL FUNCTION CYCLOP(ARG)
IMPLICIT INTEGER (A-Z)
include 'parser.h'
include 'gamestat.h'
include 'objects.h'
include 'oflags.h'
include 'oindex.h'
include 'verbs.h'
include 'flags.h'
C CYCLOP, PAGE 2
C
CYCLOP=.TRUE.
C !ASSUME WINS.
IF(.NOT.CYCLOF) GO TO 100
C !ASLEEP?
IF((PRSA.NE.ALARMW).AND.(PRSA.NE.MUNGW).AND.(PRSA.NE.HELLOW).AND.
& (PRSA.NE.BURNW).AND.(PRSA.NE.KILLW).AND.(PRSA.NE.ATTACW))
& GO TO 10
CYCLOF=.FALSE.
C !WAKE CYCLOPS.
CALL RSPEAK(187)
C !DESCRIBE.
RVCYC=IABS(RVCYC)
OFLAG2(CYCLO)=IAND(IOR(OFLAG2(CYCLO),FITEBT),not(SLEPBT))
RETURN
C
100 IF((PRSA.EQ.FIGHTW).OR.(PRSA.EQ.FRSTQW)) GO TO 10
IF(IABS(RVCYC).LE.5) GO TO 200
C !ANNOYED TOO MUCH?
RVCYC=0
C !RESTART COUNT.
CALL JIGSUP(188)
C !YES, EATS PLAYER.
RETURN
C
200 IF(PRSA.NE.GIVEW) GO TO 500
C !GIVE?
IF((PRSO.NE.FOOD).OR.(RVCYC.LT.0)) GO TO 300
C !FOOD WHEN HUNGRY?
CALL NEWSTA(FOOD,189,0,0,0)
C !EATS PEPPERS.
RVCYC=MIN0(-1,-RVCYC)
C !GETS THIRSTY.
RETURN
C
300 IF(PRSO.NE.WATER) GO TO 400
C !DRINK WHEN THIRSTY?
IF(RVCYC.GE.0) GO TO 350
CALL NEWSTA(PRSO,190,0,0,0)
C !DRINKS AND
CYCLOF=.TRUE.
C !FALLS ASLEEP.
OFLAG2(CYCLO)=IAND(IOR(OFLAG2(CYCLO),SLEPBT),not(FITEBT))
RETURN
C
350 CALL RSPEAK(191)
C !NOT THIRSTY.
10 CYCLOP=.FALSE.
C !FAILS.
RETURN
C
400 I=192
C !ASSUME INEDIBLE.
IF(PRSO.EQ.GARLI) I=193
C !GARLIC IS JOKE.
450 CALL RSPEAK(I)
C !DISDAIN IT.
IF(RVCYC.LT.0) RVCYC=RVCYC-1
IF(RVCYC.GE.0) RVCYC=RVCYC+1
IF(.NOT.CYCLOF) CALL RSPEAK(193+IABS(RVCYC))
RETURN
C
500 I=0
C !ASSUME NOT HANDLED.
IF(PRSA.EQ.HELLOW) GO TO 450
C !HELLO IS NO GO.
IF((PRSA.EQ.THROWW).OR.(PRSA.EQ.MUNGW)) I=200+RND(2)
IF(PRSA.EQ.TAKEW) I=202
IF(PRSA.EQ.TIEW) I=203
IF(I) 10,10,450
C !SEE IF HANDLED.
C
END
C THIEFP- THIEF FUNCTION
C
C DECLARATIONS
C
LOGICAL FUNCTION THIEFP(ARG)
IMPLICIT INTEGER (A-Z)
LOGICAL QHERE,PROB
include 'parser.h'
include 'gamestat.h'
C
C ROOMS
include 'rindex.h'
include 'objects.h'
include 'oflags.h'
include 'oindex.h'
include 'clock.h'
include 'villians.h'
include 'verbs.h'
include 'flags.h'
C THIEFP, PAGE 2
C
THIEFP=.TRUE.
C !ASSUME WINS.
IF(PRSA.NE.FIGHTW) GO TO 100
C !FIGHT?
IF(OCAN(STILL).EQ.THIEF) GO TO 10
C !GOT STILLETTO? F.
IF(QHERE(STILL,THFPOS)) GO TO 50
C !CAN HE RECOVER IT?
CALL NEWSTA(THIEF,0,0,0,0)
C !NO, VANISH.
IF(QHERE(THIEF,HERE)) CALL RSPEAK(498)
C !IF HERO, TELL.
RETURN
C
50 CALL NEWSTA(STILL,0,0,THIEF,0)
C !YES, RECOVER.
IF(QHERE(THIEF,HERE)) CALL RSPEAK(499)
C !IF HERO, TELL.
RETURN
C
100 IF(PRSA.NE.DEADXW) GO TO 200
C !DEAD?
THFACT=.FALSE.
C !DISABLE DEMON.
OFLAG1(CHALI)=IOR(OFLAG1(CHALI),TAKEBT)
J=0
DO 125 I=1,OLNT
C !CARRYING ANYTHING?
125 IF(OADV(I).EQ.-THIEF) J=500
CALL RSPEAK(J)
C !TELL IF BOOTY REAPPEARS.
C
J=501
DO 150 I=1,OLNT
C !LOOP.
IF((I.EQ.CHALI).OR.(I.EQ.THIEF).OR.(HERE.NE.TREAS)
& .OR. .NOT.QHERE(I,HERE)) GO TO 135
OFLAG1(I)=IOR(OFLAG1(I),VISIBT)
CALL RSPSUB(J,ODESC2(I))
C !DESCRIBE.
J=502
GO TO 150
C
135 IF(OADV(I).EQ.-THIEF) CALL NEWSTA(I,0,HERE,0,0)
150 CONTINUE
RETURN
C
200 IF(PRSA.NE.FRSTQW) GO TO 250
C !FIRST ENCOUNTER?
THIEFP=PROB(20,75)
RETURN
C
250 IF((PRSA.NE.HELLOW).OR.(ODESC1(THIEF).NE.504))
& GO TO 300
CALL RSPEAK(626)
RETURN
C
300 IF(PRSA.NE.OUTXW) GO TO 400
C !OUT?
THFACT=.FALSE.
C !DISABLE DEMON.
ODESC1(THIEF)=504
C !CHANGE DESCRIPTION.
OFLAG1(STILL)=IAND(OFLAG1(STILL),not(VISIBT))
OFLAG1(CHALI)=IOR(OFLAG1(CHALI),TAKEBT)
RETURN
C
400 IF(PRSA.NE.INXW) GO TO 500
C !IN?
IF(QHERE(THIEF,HERE)) CALL RSPEAK(505)
C !CAN HERO SEE?
THFACT=.TRUE.
C !ENABLE DEMON.
ODESC1(THIEF)=503
C !CHANGE DESCRIPTION.
OFLAG1(STILL)=IOR(OFLAG1(STILL),VISIBT)
IF((HERE.EQ.TREAS).AND.QHERE(CHALI,HERE))
& OFLAG1(CHALI)=IAND(OFLAG1(CHALI),not(TAKEBT))
RETURN
C
500 IF(PRSA.NE.TAKEW) GO TO 600
C !TAKE?
CALL RSPEAK(506)
C !JOKE.
RETURN
C
600 IF((PRSA.NE.THROWW).OR.(PRSO.NE.KNIFE).OR.
& (IAND(OFLAG2(THIEF),FITEBT).NE.0)) GO TO 700
IF(PROB(10,10)) GO TO 650
C !THREW KNIFE, 10%?
CALL RSPEAK(507)
C !NO, JUST MAKES
OFLAG2(THIEF)=IOR(OFLAG2(THIEF),FITEBT)
RETURN
C
650 J=508
C !THIEF DROPS STUFF.
DO 675 I=1,OLNT
IF(OADV(I).NE.-THIEF) GO TO 675
C !THIEF CARRYING?
J=509
CALL NEWSTA(I,0,HERE,0,0)
675 CONTINUE
CALL NEWSTA(THIEF,J,0,0,0)
C !THIEF VANISHES.
RETURN
C
700 IF(((PRSA.NE.THROWW).AND.(PRSA.NE.GIVEW)).OR.(PRSO.EQ.0).OR.
& (PRSO.EQ.THIEF)) GO TO 10
IF(OCAPAC(THIEF).GE.0) GO TO 750
C !WAKE HIM UP.
OCAPAC(THIEF)=-OCAPAC(THIEF)
THFACT=.TRUE.
OFLAG1(STILL)=IOR(OFLAG1(STILL),VISIBT)
ODESC1(THIEF)=503
CALL RSPEAK(510)
C
750 IF((PRSO.NE.BRICK).OR.(OCAN(FUSE).NE.BRICK).OR.
& (CTICK(CEVFUS).EQ.0)) GO TO 800
CALL RSPEAK(511)
C !THIEF REFUSES BOMB.
RETURN
C
800 CALL NEWSTA(PRSO,0,0,0,-THIEF)
C !THIEF TAKES GIFT.
IF(OTVAL(PRSO).GT.0) GO TO 900
C !A TREASURE?
CALL RSPSUB(512,ODESC2(PRSO))
RETURN
C
900 CALL RSPSUB(627,ODESC2(PRSO))
C !THIEF ENGROSSED.
THFENF=.TRUE.
RETURN
C
10 THIEFP=.FALSE.
RETURN
END