C FIGHTD- INTERMOVE FIGHT DEMON
C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
C WRITTEN BY R. M. SUPNIK
IF(HERE.NE.OROOM(OBJ)) GO TO 2200
C !ADVENTURER STILL HERE?
IF((OBJ.EQ.THIEF).AND.THFENF) GO TO 2400
IF(OCAPAC(OBJ).GE.0) GO TO 2050
IF((VPROB(I).EQ.0).OR..NOT.PROB(VPROB(I),VPROB(I)))
OCAPAC(OBJ)=IABS(OCAPAC(OBJ))
2025 VPROB(I)=VPROB(I)+10
2050 IF((and(OFLAG2(OBJ),FITEBT)).EQ.0) GO TO 2100
2100 IF(RA.EQ.0) GO TO 2400
IF(.NOT.OAPPLI(RA,0)) GO TO 2400
OFLAG2(OBJ)=or(OFLAG2(OBJ),FITEBT)
2200 IF((and(OFLAG2(OBJ),FITEBT).EQ.0).OR.(RA.EQ.0))
2300 IF(OBJ.EQ.THIEF) THFENF=.FALSE.
AFLAG(PLAYER)=and(AFLAG(PLAYER), not(ASTAG))
OFLAG2(OBJ)=and(OFLAG2(OBJ), not(STAGBT+FITEBT))
IF((OCAPAC(OBJ).GE.0).OR.(RA.EQ.0))
OCAPAC(OBJ)=IABS(OCAPAC(OBJ))
C NOW DO ACTUAL COUNTERBLOWS.
IF(OAPPLI(RA,0)) GO TO 2700
2650 RES=BLOW(PLAYER,J,VMELEE(I),.FALSE.,OUT)
IF(RES.EQ.ROUT) OUT=2+RND(3)
C !IF STILL OUT, GO AGAIN.
INTEGER FUNCTION BLOW(H,V,RMK,HFLG,OUT)
INTEGER DEF1R(3),DEF2R(4),DEF3R(5)
INTEGER RVECTR(66),RSTATE(45)
C MISCELLANEOUS VARIABLES
COMMON /STAR/ MBASE,STRBIT
DATA RMISS/0/,ROUT/1/,RKILL/2/,RLIGHT/3/
DATA RSER/4/,RSTAG/5/,RLOSE/6/,RHES/7/,RSIT/8/
DATA DEF3R/35,36,46,47,57/
DATA RVECTR/0,0,0,0,5,5,1,1,2,2,2,2,
& 0,0,0,0,0,5,5,3,3,1,
& 0,0,0,5,5,3,3,3,1,2,2,2,
& 0,0,0,0,0,5,5,3,3,4,4,
& 0,0,0,5,5,3,3,3,4,4,4,
DATA RSTATE/5000,3005,3008,4011,3015,3018,1021,0,0,
& 5022,3027,3030,4033,3037,3040,1043,0,0,
& 4044,2048,4050,4054,5058,4063,4067,3071,1074,
& 4075,1079,4080,4084,4088,4092,4096,4100,1104,
& 4105,2109,4111,4115,4119,4123,4127,3131,3134/
IF(DFLAG) PRINT 10,H,V,RMK,HFLG,OUT
10 FORMAT('BLOW 10-- ',3I7,L7,I7)
10 FORMAT(' BLOW 10-- ',3I7,L7,I7)
C HERO IS ATTACKER, VILLAIN IS DEFENDER.
OFLAG2(V)=or(OFLAG2(V),FITEBT)
IF(and(AFLAG(H),ASTAG).EQ.0) GO TO 100
AFLAG(H)=and(AFLAG(H), not(ASTAG))
IF((OCAN(I).EQ.V).AND.(and(OFLAG2(I),WEAPBT).NE.0))
IF(V.EQ.AOBJ(PLAYER)) GO TO 300
C VILLAIN IS ATTACKER, HERO IS DEFENDER.
AFLAG(H)=and(AFLAG(H),not(ASTAG))
IF(and(OFLAG2(V),STAGBT).EQ.0) GO TO 1200
OFLAG2(V)=and(OFLAG2(V), not(STAGBT))
DWEAP=IABS(FWIM(0,WEAPBT,0,0,H,.TRUE.))
C PARTIES ARE NOW EQUIPPED. DEF CANNOT BE ZERO.
IF(DFLAG) PRINT 2050,ATT,OA,DEF,OD,DWEAP
2050 FORMAT('BLOW 2050-- ',5I7)
2050 FORMAT(' BLOW 2050-- ',5I7)
IF(HFLG) CALL RSPSUB(595,DV)
2100 IF(DEF-2) 2200,2300,2400
ATT=MIN0(2,MAX0(-2,ATT))+3
2500 RES=RVECTR(TBL+RND(10))
IF(RES.EQ.RSTAG) GO TO 2550
2600 IF((RES.EQ.RSTAG).AND.(DWEAP.NE.0).AND.PROB(25,PBLOSE))
MI=RSTATE(((RMK-1)*9)+RES+1)
I=(MOD(MI,1000)+RND(MI/1000))+MBASE+1
IF(.NOT.HFLG .AND.(DWEAP.NE.0)) J=ODESC2(DWEAP)
IF(DFLAG) PRINT 2650,RES,MI,I,J,MBASE
2650 FORMAT('BLOW 2650-- ',5I7)
2650 FORMAT(' BLOW 2650-- ',5I7)
3000 GO TO (4000,3100,3200,3300,3400,3500,3600,4000,3200),RES+1
C !KILLED OR SITTING DUCK.
AFLAG(H)=or(AFLAG(H),ASTAG)
3550 OFLAG2(V)=or(OFLAG2(V),STAGBT)
3600 CALL NEWSTA(DWEAP,0,HERE,0,0)
DWEAP=IABS(FWIM(0,WEAPBT,0,0,H,.TRUE.))
IF(DWEAP.NE.0) CALL RSPSUB(605,ODESC2(DWEAP))
OFLAG2(V)=and(OFLAG2(V), not(FITEBT))
4100 IF((RES.NE.ROUT).OR.(RA.EQ.0)) RETURN
IF(DEF.NE.0) ASTREN(H)=DEF-OD
4600 IF(FIGHTS(H,.TRUE.).GT.0) RETURN
ASTREN(H)=1-FIGHTS(H,.FALSE.)
C SWORDD- SWORD INTERMOVE DEMON
IF(OADV(SWORD).NE.PLAYER) GO TO 500
IF(INFEST(HERE)) GO TO 300
IF(.NOT.FINDXT(I,HERE)) GO TO 200
GO TO (50,200,50,50),XTYPE
50 IF(INFEST(XROOM1)) GO TO 300
300 IF(NG.EQ.SWDSTA) RETURN
C INFEST- SUBROUTINE TO TEST FOR INFESTED ROOM
LOGICAL FUNCTION INFEST(R)
IF(.NOT.ENDGMF) INFEST=(OROOM(CYCLO).EQ.R).OR.
& (OROOM(TROLL).EQ.R).OR.
& ((OROOM(THIEF).EQ.R).AND.THFACT)
IF(ENDGMF) INFEST=(R.EQ.MRG).OR.(R.EQ.MRGE).OR.
& ((R.EQ.INMIR).AND.(MLOC.EQ.MRG))