|
|
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.