SUBROUTINE ARMYEN C C THIS SUBROUTINE HANDLES ENEMY ARMY MOVES C INCLUDE 'EMPIRE.INC/NOLIST' INTEGER I20 BYTE I100 C MONKEY=0 NUMBER(1)=0 C C START ARMY MOVE LOOP C DO 4200 Y=1,LIMIT(9) CALL MAP(4) Z6=RLMAP(IAR2+Y) IF (Z6.EQ.0) GOTO 4200 C IF (CODER.EQ.0) GOTO 200 C CALL LIBCUR(1,50) C CALL DECPRT(Y) C CALL LIBCUR(1,60) C CALL DECPRT(NPATH) C NPATH=0 200 Z7=Z6 MONKEY=Y DIR=MOD(Y,2)*2-1 !SET DIR TO 1 OR -1 P=0 CALL MAP(2) AB=RMAP(Z6) !SET AB=WHAT IS SHOWING WHERE THE ARMY IS AC=0 IF ((AB.NE.'a').AND.(AB.NE.'t').AND.(AB.NE.'X')) GOTO 3700 C C AGE AR2S C CALL MAP(8) IF ((AR2S(Y).LE.100).OR.(AR2S(Y).GT.1000)) AR2S(Y)=AR2S(Y)-1 IF ((AR2S(Y).LT.0).OR.(AR2S(Y).EQ.1000)) AR2S(Y)=0 IF (AB.EQ.'a') GOTO 300 IF (AB.EQ.'X') THEN CALL MAP(4) DO 250 I=1,LIMIT(13) IF (RLMAP(ITT2+I).EQ.Z6) GOTO 270 250 CONTINUE GOTO 300 ENDIF 270 CALL MAP(8) I20=AR2S(Y) IF (ARMJMP(Z6,I20).EQ.0) GOTO 4150 C C MOVE SELECTION C 300 CALL MAP(6) IFO=CODEFU(Y) ILA=CODELA(Y) C C IF A PRIORITY MOVE EXISTS, PICK IT AND DON'T BOTHER SLUGGING C THHROUGH CODE SELECTION AND MOVE SELECTION C MOVE1=PRIORI(Z6,IFO,ILA,DIR,AB) IF (MOVE1.NE.0) GOTO 2400 C CIFO=0: MOVE IN CERTAIN DIRECTION, OR FOLLOW SHORE CIFO=1: MOVE TOWARDS TARGET CITY CIFO=2: MOVE TOWARDS AN ENEMY ARMY CIFO=3: MOVE TOWARDS A TROOP TRANSPORT C GOTO (400,500,600,700) IFO+1 C 400 GOTO 800 !LOOK FOR TARGETS, LOCI, TT'S C 500 CALL MAP(2) IF (RMAP(ILA).EQ.'X') GOTO 800 !CITY HAS BEEN CAPTURED GOTO 1600 !MOVE C 600 IF (ILA.EQ.Z6) GOTO 800 !ARRIVED AT ENEMY CONCENTRATION GOTO 1600 !MOVE C 700 IF (ILA.GT.100) GOTO 800 !INVALID VALUE FOR ILA CALL MAP(6) IF (CODEFU(ILA+ITT2-1500).GE.6) GOTO 1200 CALL MAP(4) IF (RLMAP(ILA+ITT2).EQ.0) GOTO 1200 !TT SUNK CALL MAP(8) IF (J1TS(ILA+ITT2H).LT.3) GOTO 1200 !TT DAMAGED GOTO 1700 C C SELECT A NEW CODE C 800 CONTINUE C C LOOK FOR TARGET CITY C IF (NUMBER(10).EQ.0) GOTO 1050 IA=RND(NUMBER(10))+1 IB=IA+NUMBER(10)-1 DO 1000 IC=IA,IB I=IC IF (I.GT.NUMBER(10)) I=I-NUMBER(10) IF (TARGET(I).EQ.0) GOTO 1000 IF (IDIST(Z6,TARGET(I)).GT.14) GOTO 1000 MOVE=PATH(Z6,TARGET(I),DIR,OKB,FLAG) NPATH=NPATH+1 IF (FLAG.EQ.0) GOTO 1000 !CAN'T GET TO IT IFO=1 ILA=TARGET(I) GOTO 1800 !MOVE 1000 CONTINUE C C LOOK FOR AN ARMY THAT IS ON YOUR CONTINENT C 1050 IF (LOCI(10,11).NE.0) LOCI(10,11)=0 DO 1100 I=1,10 TEMP=RND(10)+2 !** IF (LOCI(I,TEMP).EQ.0) TEMP=2 IF (LOCI(I,TEMP).EQ.0) GOTO 1100 TEMP=LOCI(I,TEMP) MOVE=PATH(Z6,TEMP,DIR,OKB,FLAG) NPATH=NPATH+1 IF (FLAG.EQ.0) GOTO 1100 IFO=2 ILA=TEMP GOTO 1800 1100 CONTINUE C C LOOK FOR TT THAT IS SHORT OF ARMIES C 1200 CALL MAP(8) IF (AR2S(Y).NE.0) GOTO 1400 !INELIGIBLE TO GET ON A TT IA=RND(LIMIT(13))+1 !** DO 1300 IC=IA,IA+LIMIT(13) I=IC IF (I.GT.LIMIT(13)) I=I-LIMIT(13) CALL MAP(4) IF (RLMAP(ITT2+I).EQ.0) GOTO 1300 !TT DOESN'T EXIST CALL MAP(8) IF (J1TS(ITT2H+I).LT.3) GOTO 1300 !DAMAGED, I.E. UNSUITABLE CALL MAP(6) IF (IABS(CODEFU(ITT2+I-1500)).GE.6) GOTO 1300 CALL MAP(4) IF (IDIST(Z6,RLMAP(ITT2+I)).GT.20) GOTO 1300 !TOO FAR AWAY MOVE=PATH(Z6,RLMAP(ITT2+I),DIR,OKB,FLAG) NPATH=NPATH+1 IF (FLAG.EQ.0) GOTO 1300 !CAN'T GET TO IT CALL MAP(4) MOVE=MOV(Z6,RLMAP(ITT2+I)) IFO=3 ILA=I CALL MAP(6) CODELA(ITT2+I-1500)=Y GOTO 1800 1300 CONTINUE C C PICK A RANDOM DIRECTION (IFO=0) C 1400 IF ((IFO.EQ.0).AND.(ILA.NE.0)) GOTO 1500 !IF ALREADY ASS'D DIREC IFO=0 ILA=RND(8)+1 !** C 1500 MOVE=ILA I1=ICORR(MOVE-DIR*3) CALL MAP(2) IF (RMAP(Z6+IARROW(I1+1)).NE.'+') MOVE=I1 !** GOTO 1800 1600 MOVE=PATH(Z6,ILA,DIR,OKB,FLAG) NPATH=NPATH+1 IF (FLAG.EQ.0) GOTO 1400 GOTO 1800 1700 CALL MAP(4) MOVE=PATH(Z6,RLMAP(ILA+ITT2),DIR,OKB,FLAG) NPATH=NPATH+1 C 1800 DO 2300 I=0,7*DIR,DIR MOVE1=ICORR(MOVE+I) LOC=Z6+IARROW(MOVE1+1) !** CALL MAP(2) AC=RMAP(LOC) IF (AC.NE.'t') GOTO 2200 IF (IFO.EQ.3) IFO=0 CALL MAP(8) IF (AR2S(Y).NE.0) GOTO 2300 NUMARM=0 CALL MAP(4) DO 1900 IZ=ITT2+1,LIMIT(13)+ITT2 1900 IF (RLMAP(IZ).EQ.LOC) GOTO 2000 2000 CALL MAP(8) IF (J1TS(ITT2H-ITT2+IZ).LT.3) GOTO 2300 CALL MAP(4) DO 2100 IY=IAR2+1,LIMIT(9)+IAR2 IF (RLMAP(IY).EQ.LOC) NUMARM=NUMARM+1 2100 IF (NUMARM.GE.6) GOTO 2300 GOTO 2400 2200 IF ((AC.EQ.'+').AND.(ORDER(LOC).EQ.0)) GOTO 2400 2300 CONTINUE MOVE1=0 C 2400 IF (IFO.EQ.0) ILA=IABS(MOVE1) CALL MAP(6) CODEFU(Y)=IFO CODELA(Y)=ILA C IF (CODER.EQ.1) TYPE 998,IFO,ILA C998 FORMAT(1X,7I,3X) Z6=Z6+IARROW(MOVE1+1) !** C CALL MAP(2) AC=RMAP(Z6) IF (AB.NE.'t') GOTO 2500 IF (AC.EQ.'t') GOTO 3600 CALL MAP(6) CODEFU(Y)=0 CODELA(Y)=0 CALL MAP(8) AR2S(Y)=1020 GOTO 2600 2500 CALL MAP(3) I100=OMAP(Z7) CALL MAP(2) IF (I100.NE.'*') RMAP(Z7)=I100 IF (AC.NE.'t') GOTO 2600 CALL MAP(8) AR2S(Y)=100 GOTO 3600 2600 IF (AC.EQ.'+') GOTO 3500 IF ((AC.EQ.'X').OR.(AC.EQ.'.')) GOTO 3700 CALL MAP(3) IF (OMAP(Z6).NE.'*') GOTO 3400 IF (RND(100).LT.50) THEN ID=10 DO 2650 I=1,LIMIT(9) CALL MAP(6) IF (CODEFU(I).NE.0) GOTO 2650 CALL MAP(4) IF (RLMAP(IAR2+I).EQ.0) GOTO 2650 IF (I.EQ.Y) GOTO 2650 IF (IDIST(RLMAP(IAR2+I),Z6).GE.ID) GOTO 2650 MOVE=PATH(RLMAP(IAR2+I),Z6,1,OKB,FLAG) NPATH=NPATH+1 IF (FLAG.EQ.0) GOTO 2650 !CAN'T GET TO IT CALL MAP(4) ID=IDIST(RLMAP(IAR2+I),Z6) IY=I 2650 CONTINUE IF (ID.LT.10) THEN IFO=1 ILA=Z6 ENDIF GOTO 3700 ENDIF DO 2700 I=1,70 2700 IF (TARGET(I).EQ.Z6) TARGET(I)=0 CALL MAP(6) DO 2800 I=1,LIMIT(9) 2800 IF (CODEFU(I).NE.1.OR.CODELA(I).NE.Z6) GOTO 2900 CODEFU(I)=0 CODELA(I)=0 2900 DO 3000 I=1,100 3000 IF (X(I).EQ.Z6) GOTO 3100 3100 OWNER(I)=2 PHASE(I)=0 CALL MAP(8) I20=AR2S(Y) IF (((AC.EQ.'O').OR.(I20.GT.0)).AND.(EDGER(Z6).LT.8)) 1 PHASE(I)=-1 IF (AC.NE.'O') GOTO 3200 CALL LIBCUR(3,1) CALL STROUT('City at',10) CALL DECPRT(Z6) CALL STROUT(' surrendered to enemy forces.',1) CALL MAP(2) RMAP(Z6)='X' CALL SENSOR(Z6) GOTO 3700 3200 CALL MAP(2) RMAP(Z6)='X' GOTO 3700 3300 CALL MAP(8) AR2S(Y)=100 GOTO 3600 3400 H1=1 IF (Z7.EQ.Z6) GOTO 3600 C997 FORMAT(1H+,/,'ERROR: ATTACKED',A1,4I,1X) P=1 OWN1='a' OWN2=AC H2=30 CALL FIND(OWN2,Z6,Z8,H2) CALL FGHT(Z6,H1,H2,OWN1,OWN2) CALL FIND(OWN2,Z6,Z8,H2) IF (H1.LE.0) GOTO 3700 CALL MAP(3) I100=OMAP(Z6) CALL MAP(2) RMAP(Z6)=I100 IF (I100.EQ.'.') GOTO 3700 3500 CALL MAP(2) RMAP(Z6)='a' 3600 CALL MAP(4) RLMAP(IAR2+Y)=Z6 IF (P.EQ.1) CALL SENSOR(Z6) GOTO 4100 3700 CALL MAP(4) RLMAP(IAR2+Y)=0 IF (AC.NE.'X') GOTO 3900 DO 3800 I=1,70 3800 IF (X(I).EQ.Z6) PHASE(I)=0 3900 IF (P.EQ.1) CALL SENSOR(Z6) CALL MAP(2) IF (RMAP(Z6).NE.'O') GOTO 4000 CALL LIBCUR(3,1) CALL STROUT('City at',10) CALL DECPRT(Z6) CALL STROUT(' repelled enemy invasion.',1) 4000 CALL MAP(6) CODEFU(Y)=0 CODELA(Y)=0 CALL MAP(8) AR2S(Y)=0 4100 CALL SONAR(Z6) 4150 CALL MAP(4) IF (RLMAP(IAR2+Y).NE.0) NUMBER(1)=NUMBER(1)+1 4200 CONTINUE LIMIT(9)=MONKEY RETURN END FUNCTION ARMJMP(Z6,AR2SC) C C THIS SUBROUTINE DETERMINES WHETHER OR NOT AN ARMY SHOULD GET OFF C THE TROOP TRANSPORT IT IS ON. 0=NO, 1=YES C INCLUDE 'EMPIRE.INC/NOLIST' C CALL MAP(3) ARMJMP=0 DO 100 I=1,8 100 IF (OMAP(Z6+IARROW(I+1)).NE.'.') GOTO 200 !** NOT ALL SEA SURROUND RETURN C 200 IF (AR2SC.EQ.0) GOTO 400 !BEEN ON TROOP TRANSPORT C !FOR A LONG TIME DO 300 I=1,8 LOC=Z6+IARROW(I+1) !** CALL MAP(3) IF (OMAP(LOC).EQ.'.') GOTO 300 IF (ORDER(LOC).NE.0) GOTO 300 CALL MAP(2) AB=RMAP(LOC) IF ((AB.EQ.'A').OR.(AB.EQ.'F')) GOTO 400 IF ((AB.EQ.'*').OR.(AB.EQ.'O')) GOTO 400 LOC=Z6+2*IARROW(I+1) !** CALL MAP(1) AB=EMAP(LOC) IF (AB.EQ.' ') GOTO 400 300 CONTINUE RETURN !DON'T JUMP 400 ARMJMP=1 RETURN !JUMP END C FUNCTION PRIORI(Z6,IFO,ILA,DIR,AC) C INCLUDE 'EMPIRE.INC/NOLIST' BYTE GROUND,OK C DO 100 I=1,7 100 PRIOR(I)=0 EXPMAX=0 C C NOW MAKE A GUESS AS TO WHAT THE MOVE WILL BE C MOVE1=ILA IF (IFO.EQ.1.OR.IFO.EQ.2) MOVE1=MOV(Z6,ILA) CALL MAP(4) IF (IFO.EQ.3) MOVE1=MOV(Z6,RLMAP(ITT2+ILA)) C C NOW SEE IF ANY PRIORITY MOVES EXIST C DO 200 I=0,7*DIR,DIR MOVE=ICORR(MOVE1+I) LOC=Z6+IARROW(MOVE+1) !** IF (ORDER(LOC).NE.0) GOTO 200 CALL MAP(2) AB=RMAP(LOC) C C CHECK IF ARMY CAN ATTACK SOMETHING OVER WATER C CALL MAP(3) GROUND=OMAP(LOC) OK='Y' IF ((AC.EQ.'t').AND.(GROUND.EQ.'.')) OK='N' C IF (AB.EQ.'O') PRIOR(1)=MOVE IF ((AB.EQ.'T').AND.(OK.EQ.'Y')) PRIOR(3)=MOVE IF (AB.EQ.'*') PRIOR(2)=MOVE IF (AB.EQ.'A') PRIOR(5)=MOVE IF ((AB.EQ.'S').AND.(OK.EQ.'Y')) PRIOR(6)=MOVE IF ((IFO.EQ.0).AND.(AB.GE.'A').AND.(AB.LE.'T').AND.(OK.EQ.'Y')) 1 PRIOR(7)=MOVE C IF (GROUND.NE.'+') GOTO 200 N=0 CALL MAP(1) IF (EMAP(LOC+IARROW(ICORR(MOVE-2)+1)).EQ.' ') N=1 !** IF (EMAP(LOC+IARROW(ICORR(MOVE-1)+1)).EQ.' ') N=N+1 !** IF (EMAP(LOC+IARROW(MOVE+1)).EQ.' ') N=N+1 !** IF (EMAP(LOC+IARROW(ICORR(MOVE+1)+1)).EQ.' ') N=N+1 !** IF (EMAP(LOC+IARROW(ICORR(MOVE+2)+1)).EQ.' ') N=N+1 !** C TYPE 999,N,EXPMAX C999 FORMAT(' N:',I2,' EXPMAX:',I2) IF (N.LE.EXPMAX) GOTO 200 PRIOR(4)=MOVE EXPMAX=N 200 CONTINUE C TYPE 998 C998 FORMAT(' XXXXXXXXXXXXXXXX') C C NOW SELECT THE HIGHEST PRIORITY MOVE C DO 300 I=1,7 300 IF (PRIOR(I).NE.0) GOTO 400 PRIORI=0 RETURN 400 PRIORI=PRIOR(I) RETURN END