Commit | Line | Data |
---|---|---|
8b22683c KB |
1 | C FIGHTD- INTERMOVE FIGHT DEMON |
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 | SUBROUTINE FIGHTD | |
10 | IMPLICIT INTEGER (A-Z) | |
11 | LOGICAL PROB,OAPPLI | |
12 | #include "parser.h" | |
13 | #include "gamestate.h" | |
14 | #include "objects.h" | |
15 | #include "oflags.h" | |
16 | #include "oindex.h" | |
17 | #include "villians.h" | |
18 | #include "advers.h" | |
19 | #include "verbs.h" | |
20 | #include "flags.h" | |
21 | C | |
22 | LOGICAL F | |
23 | C | |
24 | C FUNCTIONS AND DATA | |
25 | C | |
26 | DATA ROUT/1/ | |
27 | C FIGHTD, PAGE 2 | |
28 | C | |
29 | DO 2400 I=1,VLNT | |
30 | C !LOOP THRU VILLAINS. | |
31 | VOPPS(I)=0 | |
32 | C !CLEAR OPPONENT SLOT. | |
33 | OBJ=VILLNS(I) | |
34 | C !GET OBJECT NO. | |
35 | RA=OACTIO(OBJ) | |
36 | C !GET HIS ACTION. | |
37 | IF(HERE.NE.OROOM(OBJ)) GO TO 2200 | |
38 | C !ADVENTURER STILL HERE? | |
39 | IF((OBJ.EQ.THIEF).AND.THFENF) GO TO 2400 | |
40 | C !THIEF ENGROSSED? | |
41 | IF(OCAPAC(OBJ).GE.0) GO TO 2050 | |
42 | C !YES, VILL AWAKE? | |
43 | IF((VPROB(I).EQ.0).OR..NOT.PROB(VPROB(I),VPROB(I))) | |
44 | & GO TO 2025 | |
45 | OCAPAC(OBJ)=IABS(OCAPAC(OBJ)) | |
46 | VPROB(I)=0 | |
47 | IF(RA.EQ.0) GO TO 2400 | |
48 | C !ANYTHING TO DO? | |
49 | PRSA=INXW | |
50 | C !YES, WAKE HIM UP. | |
51 | F=OAPPLI(RA,0) | |
52 | GO TO 2400 | |
53 | C !NOTHING ELSE HAPPENS. | |
54 | C | |
55 | 2025 VPROB(I)=VPROB(I)+10 | |
56 | C !INCREASE WAKEUP PROB. | |
57 | GO TO 2400 | |
58 | C !NOTHING ELSE. | |
59 | C | |
60 | 2050 IF((and(OFLAG2(OBJ),FITEBT)).EQ.0) GO TO 2100 | |
61 | VOPPS(I)=OBJ | |
62 | C !FIGHTING, SET UP OPP. | |
63 | GO TO 2400 | |
64 | C | |
65 | 2100 IF(RA.EQ.0) GO TO 2400 | |
66 | C !NOT FIGHTING, | |
67 | PRSA=FRSTQW | |
68 | C !SET UP PROBABILITY | |
69 | IF(.NOT.OAPPLI(RA,0)) GO TO 2400 | |
70 | C !OF FIGHTING. | |
71 | OFLAG2(OBJ)=or(OFLAG2(OBJ),FITEBT) | |
72 | VOPPS(I)=OBJ | |
73 | C !SET UP OPP. | |
74 | GO TO 2400 | |
75 | C | |
76 | 2200 IF((and(OFLAG2(OBJ),FITEBT).EQ.0).OR.(RA.EQ.0)) | |
77 | & GO TO 2300 | |
78 | PRSA=FIGHTW | |
79 | C !HAVE A FIGHT. | |
80 | F=OAPPLI(RA,0) | |
81 | 2300 IF(OBJ.EQ.THIEF) THFENF=.FALSE. | |
82 | C !TURN OFF ENGROSSED. | |
83 | AFLAG(PLAYER)=and(AFLAG(PLAYER), not(ASTAG)) | |
84 | OFLAG2(OBJ)=and(OFLAG2(OBJ), not(STAGBT+FITEBT)) | |
85 | IF((OCAPAC(OBJ).GE.0).OR.(RA.EQ.0)) | |
86 | & GO TO 2400 | |
87 | PRSA=INXW | |
88 | C !WAKE HIM UP. | |
89 | F=OAPPLI(RA,0) | |
90 | OCAPAC(OBJ)=IABS(OCAPAC(OBJ)) | |
91 | 2400 CONTINUE | |
92 | C FIGHTD, PAGE 3 | |
93 | C | |
94 | C NOW DO ACTUAL COUNTERBLOWS. | |
95 | C | |
96 | OUT=0 | |
97 | C !ASSUME HERO OK. | |
98 | 2600 DO 2700 I=1,VLNT | |
99 | C !LOOP THRU OPPS. | |
100 | J=VOPPS(I) | |
101 | IF(J.EQ.0) GO TO 2700 | |
102 | C !SLOT EMPTY? | |
103 | PRSCON=1 | |
104 | C !STOP CMD STREAM. | |
105 | RA=OACTIO(J) | |
106 | IF(RA.EQ.0) GO TO 2650 | |
107 | C !VILLAIN ACTION? | |
108 | PRSA=FIGHTW | |
109 | C !SEE IF | |
110 | IF(OAPPLI(RA,0)) GO TO 2700 | |
111 | C !SPECIAL ACTION. | |
112 | 2650 RES=BLOW(PLAYER,J,VMELEE(I),.FALSE.,OUT) | |
113 | C !STRIKE BLOW. | |
114 | IF(RES.LT.0) RETURN | |
115 | C !IF HERO DEAD, EXIT. | |
116 | IF(RES.EQ.ROUT) OUT=2+RND(3) | |
117 | C !IF HERO OUT, SET FLG. | |
118 | 2700 CONTINUE | |
119 | OUT=OUT-1 | |
120 | C !DECREMENT OUT COUNT. | |
121 | IF(OUT.GT.0) GO TO 2600 | |
122 | C !IF STILL OUT, GO AGAIN. | |
123 | RETURN | |
124 | C | |
125 | END | |
126 | C BLOW- STRIKE BLOW | |
127 | C | |
128 | C DECLARATIONS | |
129 | C | |
130 | INTEGER FUNCTION BLOW(H,V,RMK,HFLG,OUT) | |
131 | IMPLICIT INTEGER (A-Z) | |
132 | LOGICAL HFLG,OAPPLI,PROB | |
133 | INTEGER DEF1R(3),DEF2R(4),DEF3R(5) | |
134 | INTEGER RVECTR(66),RSTATE(45) | |
135 | #include "gamestate.h" | |
136 | #include "debug.h" | |
137 | C | |
138 | C PARSE VECTOR | |
139 | C | |
140 | LOGICAL PRSWON | |
141 | #include "parser.h" | |
142 | C | |
143 | C MISCELLANEOUS VARIABLES | |
144 | C | |
145 | COMMON /STAR/ MBASE,STRBIT | |
146 | #include "objects.h" | |
147 | #include "oflags.h" | |
148 | C | |
149 | #include "clock.h" | |
150 | ||
151 | #include "advers.h" | |
152 | #include "verbs.h" | |
153 | C | |
154 | LOGICAL F | |
155 | C | |
156 | C FUNCTIONS AND DATA | |
157 | C | |
158 | DATA RMISS/0/,ROUT/1/,RKILL/2/,RLIGHT/3/ | |
159 | DATA RSER/4/,RSTAG/5/,RLOSE/6/,RHES/7/,RSIT/8/ | |
160 | DATA DEF1R/1,2,3/ | |
161 | DATA DEF2R/13,23,24,25/ | |
162 | DATA DEF3R/35,36,46,47,57/ | |
163 | C | |
164 | DATA RVECTR/0,0,0,0,5,5,1,1,2,2,2,2, | |
165 | & 0,0,0,0,0,5,5,3,3,1, | |
166 | & 0,0,0,5,5,3,3,3,1,2,2,2, | |
167 | & 0,0,0,0,0,5,5,3,3,4,4, | |
168 | & 0,0,0,5,5,3,3,3,4,4,4, | |
169 | & 0,5,5,3,3,3,3,4,4,4/ | |
170 | DATA RSTATE/5000,3005,3008,4011,3015,3018,1021,0,0, | |
171 | & 5022,3027,3030,4033,3037,3040,1043,0,0, | |
172 | & 4044,2048,4050,4054,5058,4063,4067,3071,1074, | |
173 | & 4075,1079,4080,4084,4088,4092,4096,4100,1104, | |
174 | & 4105,2109,4111,4115,4119,4123,4127,3131,3134/ | |
175 | C BLOW, PAGE 3 | |
176 | C | |
177 | RA=OACTIO(V) | |
178 | C !GET VILLAIN ACTION, | |
179 | DV=ODESC2(V) | |
180 | C !DESCRIPTION. | |
181 | BLOW=RMISS | |
182 | C !ASSUME NO RESULT. | |
183 | #ifdef debug | |
184 | IF(DFLAG) PRINT 10,H,V,RMK,HFLG,OUT | |
185 | #ifdef NOCC | |
186 | 10 FORMAT('BLOW 10-- ',3I7,L7,I7) | |
187 | #else NOCC | |
188 | 10 FORMAT(' BLOW 10-- ',3I7,L7,I7) | |
189 | #endif NOCC | |
190 | #endif debug | |
191 | IF(.NOT.HFLG) GO TO 1000 | |
192 | C !HERO STRIKING BLOW? | |
193 | C | |
194 | C HERO IS ATTACKER, VILLAIN IS DEFENDER. | |
195 | C | |
196 | PBLOSE=10 | |
197 | C !BAD LK PROB. | |
198 | OFLAG2(V)=or(OFLAG2(V),FITEBT) | |
199 | IF(and(AFLAG(H),ASTAG).EQ.0) GO TO 100 | |
200 | CALL RSPEAK(591) | |
201 | C !YES, CANT FIGHT. | |
202 | AFLAG(H)=and(AFLAG(H), not(ASTAG)) | |
203 | RETURN | |
204 | C | |
205 | 100 ATT=FIGHTS(H,.TRUE.) | |
206 | C !GET HIS STRENGTH. | |
207 | OA=ATT | |
208 | DEF=VILSTR(V) | |
209 | C !GET VILL STRENGTH. | |
210 | OD=DEF | |
211 | DWEAP=0 | |
212 | C !ASSUME NO WEAPON. | |
213 | DO 200 I=1,OLNT | |
214 | C !SEARCH VILLAIN. | |
215 | IF((OCAN(I).EQ.V).AND.(and(OFLAG2(I),WEAPBT).NE.0)) | |
216 | & DWEAP=I | |
217 | 200 CONTINUE | |
218 | IF(V.EQ.AOBJ(PLAYER)) GO TO 300 | |
219 | C !KILLING SELF? | |
220 | IF(DEF.NE.0) GO TO 2000 | |
221 | C !DEFENDER ALIVE? | |
222 | CALL RSPSUB(592,DV) | |
223 | C !VILLAIN DEAD. | |
224 | RETURN | |
225 | C | |
226 | 300 CALL JIGSUP(593) | |
227 | C !KILLING SELF. | |
228 | RETURN | |
229 | C | |
230 | C VILLAIN IS ATTACKER, HERO IS DEFENDER. | |
231 | C | |
232 | 1000 PBLOSE=50 | |
233 | C !BAD LK PROB. | |
234 | AFLAG(H)=and(AFLAG(H),not(ASTAG)) | |
235 | IF(and(OFLAG2(V),STAGBT).EQ.0) GO TO 1200 | |
236 | OFLAG2(V)=and(OFLAG2(V), not(STAGBT)) | |
237 | CALL RSPSUB(594,DV) | |
238 | C !DESCRIBE. | |
239 | RETURN | |
240 | C | |
241 | 1200 ATT=VILSTR(V) | |
242 | C !SET UP ATT, DEF. | |
243 | OA=ATT | |
244 | DEF=FIGHTS(H,.TRUE.) | |
245 | IF(DEF.LE.0) RETURN | |
246 | C !DONT ALLOW DEAD DEF. | |
247 | OD=FIGHTS(H,.FALSE.) | |
248 | DWEAP=IABS(FWIM(0,WEAPBT,0,0,H,.TRUE.)) | |
249 | C !FIND A WEAPON. | |
250 | C BLOW, PAGE 4 | |
251 | C | |
252 | C PARTIES ARE NOW EQUIPPED. DEF CANNOT BE ZERO. | |
253 | C ATT MUST BE > 0. | |
254 | C | |
255 | 2000 CONTINUE | |
256 | #ifdef debug | |
257 | IF(DFLAG) PRINT 2050,ATT,OA,DEF,OD,DWEAP | |
258 | #ifdef NOCC | |
259 | 2050 FORMAT('BLOW 2050-- ',5I7) | |
260 | #else NOCC | |
261 | 2050 FORMAT(' BLOW 2050-- ',5I7) | |
262 | #endif NOCC | |
263 | #endif debug | |
264 | IF(DEF.GT.0) GO TO 2100 | |
265 | C !DEF ALIVE? | |
266 | RES=RKILL | |
267 | IF(HFLG) CALL RSPSUB(595,DV) | |
268 | C !DEADER. | |
269 | GO TO 3000 | |
270 | C | |
271 | 2100 IF(DEF-2) 2200,2300,2400 | |
272 | C !DEF <2,=2,>2 | |
273 | 2200 ATT=MIN0(ATT,3) | |
274 | C !SCALE ATT. | |
275 | TBL=DEF1R(ATT) | |
276 | C !CHOOSE TABLE. | |
277 | GO TO 2500 | |
278 | C | |
279 | 2300 ATT=MIN0(ATT,4) | |
280 | C !SCALE ATT. | |
281 | TBL=DEF2R(ATT) | |
282 | C !CHOOSE TABLE. | |
283 | GO TO 2500 | |
284 | C | |
285 | 2400 ATT=ATT-DEF | |
286 | C !SCALE ATT. | |
287 | ATT=MIN0(2,MAX0(-2,ATT))+3 | |
288 | TBL=DEF3R(ATT) | |
289 | C | |
290 | 2500 RES=RVECTR(TBL+RND(10)) | |
291 | C !GET RESULT. | |
292 | IF(OUT.EQ.0) GO TO 2600 | |
293 | C !WAS HE OUT? | |
294 | IF(RES.EQ.RSTAG) GO TO 2550 | |
295 | C !YES, STAG--> HES. | |
296 | RES=RSIT | |
297 | C !OTHERWISE, SITTING. | |
298 | GO TO 2600 | |
299 | 2550 RES=RHES | |
300 | 2600 IF((RES.EQ.RSTAG).AND.(DWEAP.NE.0).AND.PROB(25,PBLOSE)) | |
301 | & RES=RLOSE | |
302 | C | |
303 | MI=RSTATE(((RMK-1)*9)+RES+1) | |
304 | C !CHOOSE TABLE ENTRY. | |
305 | IF(MI.EQ.0) GO TO 3000 | |
306 | I=(MOD(MI,1000)+RND(MI/1000))+MBASE+1 | |
307 | J=DV | |
308 | IF(.NOT.HFLG .AND.(DWEAP.NE.0)) J=ODESC2(DWEAP) | |
309 | #ifdef debug | |
310 | IF(DFLAG) PRINT 2650,RES,MI,I,J,MBASE | |
311 | #ifdef NOCC | |
312 | 2650 FORMAT('BLOW 2650-- ',5I7) | |
313 | #else NOCC | |
314 | 2650 FORMAT(' BLOW 2650-- ',5I7) | |
315 | #endif NOCC | |
316 | #endif debug | |
317 | CALL RSPSUB(I,J) | |
318 | C !PRESENT RESULT. | |
319 | C BLOW, PAGE 5 | |
320 | C | |
321 | C NOW APPLY RESULT | |
322 | C | |
323 | 3000 GO TO (4000,3100,3200,3300,3400,3500,3600,4000,3200),RES+1 | |
324 | C | |
325 | 3100 IF(HFLG) DEF=-DEF | |
326 | C !UNCONSCIOUS. | |
327 | GO TO 4000 | |
328 | C | |
329 | 3200 DEF=0 | |
330 | C !KILLED OR SITTING DUCK. | |
331 | GO TO 4000 | |
332 | C | |
333 | 3300 DEF=MAX0(0,DEF-1) | |
334 | C !LIGHT WOUND. | |
335 | GO TO 4000 | |
336 | C | |
337 | 3400 DEF=MAX0(0,DEF-2) | |
338 | C !SERIOUS WOUND. | |
339 | GO TO 4000 | |
340 | C | |
341 | 3500 IF(HFLG) GO TO 3550 | |
342 | C !STAGGERED. | |
343 | AFLAG(H)=or(AFLAG(H),ASTAG) | |
344 | GO TO 4000 | |
345 | C | |
346 | 3550 OFLAG2(V)=or(OFLAG2(V),STAGBT) | |
347 | GO TO 4000 | |
348 | C | |
349 | 3600 CALL NEWSTA(DWEAP,0,HERE,0,0) | |
350 | C !LOSE WEAPON. | |
351 | DWEAP=0 | |
352 | IF(HFLG) GO TO 4000 | |
353 | C !IF HERO, DONE. | |
354 | DWEAP=IABS(FWIM(0,WEAPBT,0,0,H,.TRUE.)) | |
355 | C !GET NEW. | |
356 | IF(DWEAP.NE.0) CALL RSPSUB(605,ODESC2(DWEAP)) | |
357 | C BLOW, PAGE 6 | |
358 | C | |
359 | 4000 BLOW=RES | |
360 | C !RETURN RESULT. | |
361 | IF(.NOT.HFLG) GO TO 4500 | |
362 | C !HERO? | |
363 | OCAPAC(V)=DEF | |
364 | C !STORE NEW CAPACITY. | |
365 | IF(DEF.NE.0) GO TO 4100 | |
366 | C !DEAD? | |
367 | OFLAG2(V)=and(OFLAG2(V), not(FITEBT)) | |
368 | CALL RSPSUB(572,DV) | |
369 | C !HE DIES. | |
370 | CALL NEWSTA(V,0,0,0,0) | |
371 | C !MAKE HIM DISAPPEAR. | |
372 | IF(RA.EQ.0) RETURN | |
373 | C !IF NX TO DO, EXIT. | |
374 | PRSA=DEADXW | |
375 | C !LET HIM KNOW. | |
376 | F=OAPPLI(RA,0) | |
377 | RETURN | |
378 | C | |
379 | 4100 IF((RES.NE.ROUT).OR.(RA.EQ.0)) RETURN | |
380 | PRSA=OUTXW | |
381 | C !LET HIM BE OUT. | |
382 | F=OAPPLI(RA,0) | |
383 | RETURN | |
384 | C | |
385 | 4500 ASTREN(H)=-10000 | |
386 | C !ASSUME DEAD. | |
387 | IF(DEF.NE.0) ASTREN(H)=DEF-OD | |
388 | IF(DEF.GE.OD) GO TO 4600 | |
389 | CTICK(CEVCUR)=30 | |
390 | CFLAG(CEVCUR)=.TRUE. | |
391 | 4600 IF(FIGHTS(H,.TRUE.).GT.0) RETURN | |
392 | ASTREN(H)=1-FIGHTS(H,.FALSE.) | |
393 | C !HE'S DEAD. | |
394 | CALL JIGSUP(596) | |
395 | BLOW=-1 | |
396 | RETURN | |
397 | C | |
398 | END | |
399 | C SWORDD- SWORD INTERMOVE DEMON | |
400 | C | |
401 | C DECLARATIONS | |
402 | C | |
403 | SUBROUTINE SWORDD | |
404 | IMPLICIT INTEGER(A-Z) | |
405 | LOGICAL INFEST,FINDXT | |
406 | #include "gamestate.h" | |
407 | #include "curxt.h" | |
408 | #include "xsrch.h" | |
409 | #include "objects.h" | |
410 | #include "oindex.h" | |
411 | #include "villians.h" | |
412 | #include "advers.h" | |
413 | C SWORDD, PAGE 2 | |
414 | C | |
415 | IF(OADV(SWORD).NE.PLAYER) GO TO 500 | |
416 | C !HOLDING SWORD? | |
417 | NG=2 | |
418 | C !ASSUME VILL CLOSE. | |
419 | IF(INFEST(HERE)) GO TO 300 | |
420 | C !VILL HERE? | |
421 | NG=1 | |
422 | DO 200 I=XMIN,XMAX,XMIN | |
423 | C !NO, SEARCH ROOMS. | |
424 | IF(.NOT.FINDXT(I,HERE)) GO TO 200 | |
425 | C !ROOM THAT WAY? | |
426 | GO TO (50,200,50,50),XTYPE | |
427 | C !SEE IF ROOM AT ALL. | |
428 | 50 IF(INFEST(XROOM1)) GO TO 300 | |
429 | C !CHECK ROOM. | |
430 | 200 CONTINUE | |
431 | NG=0 | |
432 | C !NO GLOW. | |
433 | C | |
434 | 300 IF(NG.EQ.SWDSTA) RETURN | |
435 | C !ANY STATE CHANGE? | |
436 | CALL RSPEAK(NG+495) | |
437 | C !YES, TELL NEW STATE. | |
438 | SWDSTA=NG | |
439 | RETURN | |
440 | C | |
441 | 500 SWDACT=.FALSE. | |
442 | C !DROPPED SWORD, | |
443 | RETURN | |
444 | C !DISABLE DEMON. | |
445 | END | |
446 | C INFEST- SUBROUTINE TO TEST FOR INFESTED ROOM | |
447 | C | |
448 | C DECLARATIONS | |
449 | C | |
450 | LOGICAL FUNCTION INFEST(R) | |
451 | IMPLICIT INTEGER(A-Z) | |
452 | C | |
453 | C ROOMS | |
454 | #include "rindex.h" | |
455 | #include "objects.h" | |
456 | #include "oindex.h" | |
457 | #include "villians.h" | |
458 | #include "flags.h" | |
459 | C | |
460 | IF(.NOT.ENDGMF) INFEST=(OROOM(CYCLO).EQ.R).OR. | |
461 | & (OROOM(TROLL).EQ.R).OR. | |
462 | & ((OROOM(THIEF).EQ.R).AND.THFACT) | |
463 | IF(ENDGMF) INFEST=(R.EQ.MRG).OR.(R.EQ.MRGE).OR. | |
464 | & (R.EQ.MRGW).OR. | |
465 | & ((R.EQ.INMIR).AND.(MLOC.EQ.MRG)) | |
466 | RETURN | |
467 | END |