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