Annotation of 43BSDReno/games/dungeon/demons.F, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.