edjames@ic.Berkeley.EDU (Ed James) (12/21/86)
BYTE PAMELA(8),REEED(9) byte jnkbuf ( 80 ) INTEGER RLMAP(3000) LOGICAL AUTOMV COMMON/AB9/AB9,PRIOR,NSHPRF COMMON/ARMTOT/ARMTOT COMMON/CHRT/COMMAN,COMM,COMSCN,KBTBL COMMON/CHR2/IFILE,KILL,TTY COMMON/CITY/FOUND(70),OWNER(70),PHASE(70) COMMON/CMYTBL/CMYTBL,KBFUDG COMMON/COD/CODER COMMON/CODE/CODEFU,CODELA COMMON/CRAHL/HITS,TIPE,CRAHIT,CRALOC COMMON/FIPATH/FIPATH(70) COMMON/G2/G2 COMMON/IARROW/IARROW(10),ARROW,INDEX,LOPMAX COMMON/IOTAB/IOTAB COMMON/J1TS/J1TS COMMON/KXK/IADJST COMMON/MAP/D COMMON/MAPBLK/EMAP,RMAP,PMAP,RLMAP COMMON/OMAP/OMAP COMMON/MISC1/TARGET,AR2S,RANGE,RANG COMMON/MISC2/LOCI(10,11),NUMBER(18),LIMIT,MDATE,VERSION COMMON/MODE/MODE,JECTOR,ISEC,NEWRND COMMON/MFLAGS/MOVEDFLAG COMMON/MYCOD/D2,MYCODE COMMON/OKS/OKA,OKB,OKC COMMON/OVRPOP/OVRPOP COMMON/P1/PHAZE,PHAZEE,PH COMMON/DAYTIM/PAMELA,REEED COMMON/PASS/PASS,SPECAL,AUTOMV COMMON/SAVBUF/SAVBUF COMMON/SPS/STEP,POSIT,START COMMON/TEST2/SUCCES,FAILUR,FULL COMMON/TROOP/TROOPT(6,5) COMMON/X/X(70) common /jnkbuf/ jnkbuf, ptr C C AGGR: THIS IS A MEASURE OF THE ENEMY SHIPS AGGRESSIVENESS, C THIS VALUE IS ADDED TO THE COST-EFFECTIVENESS OF ATTACKING AN C ENEMY UNIT TO DETERMINE IF THE SHIP WILL ATTACK OR RUN FROM THE C ENEMY. C ALL CITIES ARE REFERENCED BY CITY NUMBER, AS IN X(N)=LOC OF CITY #N C CODFU/CODELA: CONTAINS A NUMBER THAT DETERMINES WHAT THAT COMPUTER CRAFT C IS ASSIGNED TO DO, IS SEPERATED INTO 2 NUMBERS, IFO AND ILA. IFO C GIVES THE FUNCTION, ILA GIVES DETAILS. C CODER: USED FOR DEBUG FLAG C CROWD: USED IF CITY IS SURROUNDED BY ARMIES C D: ORIGINAL MAP, ENCODED IN MOD 3 C EXPLOR: THIS IS SET TO 1 IF THE ENEMY SHIP IS TO EXPLORE UNKNOWN C TERRITORY ADJACENT TO IT, 0 IF NOT. C FIPATH: STASIS # TO BE GIVEN TO FIGHTER IN THAT CITY C FOUND: COMPLETION DATES FOR CITIES C IADJST: SUBTRACTED FROM Z6 SO CURSOR WILL NOT BE MOVED OFF SCREEN C IARROW: ADDED TO Z6 SO MOVES [1,2,3,4,5,6,7,8,9] ARE CONVERTED C TO [+1,-99,-100,-101,ETC.] C ISEC: SECTOR TERMINAL IS SHOWING C IZAP: .TRUE.=SAVE GAME, .FALSE.=INITIALIZE C JECTOR: SECTOR PROGRAM IS LOOKING AT C KURSOR: SET TO POSITION OF CURSOR C MODE: 1=IN MODE 2, 0=IN MODE 1 C OWNER: WHO OWNS THE CITY: 0>NOBODY, 1>PLAYER, 2>COMPUTER C PASS: SET TO .TRUE. IF IT IS A PRIVILEGED USER C PHASE: PHASE OF CITY C X: LOCATIONS OF CITIES C C C NUMBER(1-8): NUMBERS OF UNITS C NUMBER(11-18): NUMBERS OF CITIES WITH EACH PHASE C NUMBER(9): NUMBER OF CITIES C NUMBER(10): NUMBER OF TARGET CITIES C INT=PHASE(I) IF (PHASE(I).NE.-1) GOTO 100 PHASE(I)=1 GOTO 1400 100 EDGE=EDGER(X(I)) C C IF WE HAVE A PHASE OF 0, MAKE SOMETHING! C IF (PHASE(I).EQ.0) GOTO 600 C C IF CITY IS SURROUNDED BY ARMIES, MAKE SOMETHING ELSE C IF (PHASE(I).NE.1) GOTO 300 DO 200 J=1,8 200 IF (RMAP(X(I)+IARROW(J+1)).EQ.'+') GOTO 300 !** GOTO 600 C C IF CRAFT NUMBERS ARE GETTING GROSSLY LARGE, PRODUCE SOMETHING ELSE C 300 IF (NUMBER(OVRPOP(PHASE(I)+1,1)).GT. 1 OVRPOP(PHASE(I)+1,2)) GOTO 600 !** C IF (EDGE.NE.8) GOTO 400 IF ((NUMBER(9).GT.1).AND.(PHASE(I).EQ.1)) GOTO 1100 IF (NUMBER(9).GT.1) GOTO 1400 IF (NUMBER(5).LT.1) PHASE(I)=6 IF (NUMBER(5).GT.0) PHASE(I)=1 GOTO 1400 C 400 IF (PHASE(I).NE.1) GOTO 600 N=0 DO 500 J=IAR2+1,IAR2+LIMIT(9) Z=RLMAP(J) IF (Z.EQ.0) GOTO 500 IF (IDIST(X(I),Z).GT.6) GOTO 500 IF (EMAP(Z).EQ.'t') GOTO 500 MOVE=PATH(X(I),Z,1,OKA,FLAG) IF (FLAG.EQ.0) GOTO 500 N=N+1 IF ((N.GT.6).AND.(NUMBER(11).GT.1)) GOTO 800 500 CONTINUE IF ((N.GT.3).AND.(NUMBER(11).GT.1)) GOTO 600 GOTO 1400 C C SELECT A NEW PHASE FOR THE CITY C 600 CONTINUE C C IF THERE ARE ENEMY ARMIES ON THE CONTINENT, PRODUCE ARMIES! C IF (EDGE.EQ.8) GOTO 1050 DO 700 J=1,10 IF (LOCI(J,2).EQ.0) GOTO 700 MOVE=PATH(X(I),LOCI(J,2),1,OKA,FLAG) IF (FLAG.EQ.0) GOTO 700 PHASE(I)=1 GOTO 1300 700 CONTINUE C 800 PHASE(I)=2 IF (EDGE.GT.0) GOTO 900 !IF NOT LANDLOCKED IF (NUMBER(1).LE.3*NUMBER(2)) PHASE(I)=1 !IF SMALL .NE. OF ARMIES GOTO 1300 C 900 PHASE(I)=1 N=0 DO 1000 J=IAR2+1,IAR2+LIMIT(9) Z=RLMAP(J) IF (Z.EQ.0) GOTO 1000 IF (IDIST(X(I),Z).GT.6) GOTO 1000 IF (EMAP(Z).EQ.'t') GOTO 1000 !IF ON TROOP TRANSPORT MOVE=PATH(X(I),Z,1,OKA,FLAG) IF (FLAG.EQ.0) GOTO 1000 N=N+1 1000 CONTINUE IF (N.LT.3) GOTO 1300 1050 PHASE(I)=2 IF (NUMBER(2)*2.GT.NUMBER(9)) GOTO 1100 IF ((NUMBER(5).LT.3).AND.(NUMBER(15).LT.2)) GOTO 1100 IF (NUMBER(2)*4.LT.NUMBER(9)) GOTO 1300 IF (INT.EQ.2) GOTO 1300 IF (INT.GT.2) GOTO 1100 IF (irand(100).LT.50) GOTO 1300 C C SELECT A SHIP, GUARANTEEING AT LEAST TWO CITIES PRODUCING TROOP TRANSPORTS C 1100 PHASE(I)=PH(8) DO 1200 J=8,4,-1 1200 IF (NUMBER(J+10).GE.NUMBER(J+9)) PHASE(I)=PH(J-1) IF (INT.GT.2) PHASE(I)=INT IF (NUMBER(17).EQ.0) PHASE(I)=12 IF (NUMBER(15).LT.2) PHASE(I)=6 C 1300 IF ((NUMBER(9).GT.1).AND.(NUMBER(15).EQ.0).AND.(EDGE.GT.0)) 1 PHASE(I)=6 1400 FOUND(I)=5*PHASE(I)+MDATE IF (INT.EQ.PHASE(I)) GOTO 1500 FOUND(I)=6*PHASE(I)+MDATE CALL CITYCT IF (CODER.NE.9) GOTO 1500 CALL tpos(2,1) TYPE 999,X(I),INT,PHASE(I),EDGE 999 FORMAT('+CITY:',I4,' FROM:',I2,' TO:',I2,' EDGE:',I1,3X,$) CALL GETCHX(E) 1500 RETURN END ccc clreol - clear to end of the line subroutine clreol(line, icol, eolpos) integer line, icol, eolpos c c synopsis c c call clreol(line, icol, eolpos) c c line - line c icol - column to clear c eolpos - postion of the last character on this line c (or zero if position is not known) c c This routine assumes that the cursor is positioned and c positions it it the same place c c c Common terminal c parameter tt_bufsiz = 750 ! size of buffer in bytes common /ioempire/ TT_VT52, TT_VT100, $ TT_ANN, TT_HP, TT_ADM, TT_HZ15, $ in_chan, out_chan, tt_nbuf, tt_type, tt_flag, tt_buf integer TT_VT52, TT_VT100 integer TT_ANN, TT_HP, TT_ADM, TT_HZ15 integer in_chan ! input channel integer out_chan ! output channel integer tt_nbuf ! number of characters to output integer tt_type ! terminal type logical tt_flag ! flag for non-buffered i/o byte tt_buf(tt_bufsiz) ! the buffer byte blank(80) byte vt52l(2), vt100l(3) data blank /80*' '/ data vt52l /"33, 'K'/ data vt100l /"33, '[', 'K'/ if (icol .gt. eolpos) return if (tt_type .eq. TT_VT52) goto 1000 if (tt_type .eq. TT_VT100) goto 2000 c c Handle dumb terminals here c call bufout(blank, eolpos - icol + 1) call tpos(line, icol) return c c Handle vt52 c 1000 call bufout(vt52l, 2) return c c Handle vt100 c 2000 call bufout(vt100l, 3) return end FUNCTION COMPAR(AB,Z62,OKVECT) C C USED BY PATH, CHECKS IF AB OR LOCATION Z62 IS A TYPE CONTAINED IN OKVECT C IMPLICIT INTEGER(A-Z) BYTE OKVECT(5),AB BYTE OMAP(6000) COMMON/OMAP/OMAP C COMPAR = 1 IF (AB .EQ. OKVECT(1)) RETURN IF (OMAP(Z62) .EQ. OKVECT(1)) RETURN IF (AB .EQ. OKVECT(2)) RETURN IF (AB .EQ. OKVECT(3)) RETURN IF (AB .EQ. OKVECT(4)) RETURN IF (AB .EQ. OKVECT(5)) RETURN COMPAR = 0 RETURN END function cost(own,h) implicit integer(a-z) integer cosval ( 14 ) byte costab ( 14 ), own data cosval / 0, 2, 4, 6, 3, 5, 4, 1, 3, 3, 7, * 5, 11, 11/ data costab /'F','D','S','T','R','C','B','f','d','s','t', * 'r','c','b'/ do 100 i = 1, 14 100 if ( own .eq. costab ( i )) goto 200 pause 'BAD CALL TO FUNCTION COST!' cost = 0 return 200 cost = cosval ( i ) if ( i .ge. 9 ) cost = cost - h return end ccc cursor - position cursor to map location subroutine cursor ( n ) integer n c c synopsis c c call cursor ( n ) c c n - map location c integer i, j i = n / 100 + 1 j = mod ( n, 100 ) + 1 call tpos ( i, j ) call flush return end subroutine data c c Block data for empire c IMPLICIT INTEGER(A-Z) PARAMETER IAR=0,IFI=500,IDE=700,ISU=900,ITT=1100, 1 ICR=1200,ICA=1300,IBA=1400 PARAMETER IAR2=1500,IFI2=2000,IDE2=2200,ISU2=2400,ITT2=2600, 1 ICR2=2700,ICA2=2800,IBA2=2900 PARAMETER IDEH=0,ISUH=200,ITTH=400,ICRH=500,ICAH=600,IBAH=700 PARAMETER IDE2H=800,ISU2H=1000,ITT2H=1200,ICR2H=1300, 1 ICA2H=1400,IBA2H=1500 INTEGER G2(100) INTEGER HITS(15),TIPE(15),CRAHIT(15),CRALOC(15) INTEGER INDEX(15) INTEGER CMYTBL(9),KBFUDG(9) INTEGER LOPMAX(15),COMSCN(40) INTEGER NSHPRF(4,6) INTEGER PH(8),OVRPOP(16,2) INTEGER PRIOR(7) INTEGER RANGE(200),AR2S(500) INTEGER ARMTOT(20),CODEFU(1500),CODELA(1500),TARGET(70),LIMIT(16) INTEGER ARROW(9) INTEGER D2(3) INTEGER*2 D(667) INTEGER MYCODE(1500) INTEGER RANG(200) INTEGER IOTAB(16) INTEGER PHAZEE(8) integer ptr BYTE SPECAL,PASS BYTE AB,AC,AD,AO,E,OWN1,OWN2,OWN !AVOID WORD REFERENCES TO THESE BYTE KBTBL(9),AB9(9) BYTE COMM(30),PHAZE(8) BYTE IFILE(11),KILL BYTE COMMAN(20),OKA(5),OKB(5),OKC(5) BYTE TTY(20) BYTE MOVEDFLAG(1500) BYTE J1TS(1600) BYTE EMAP(6000),RMAP(6000),PMAP(6000),OMAP(6000) BYTE PAMELA(8),REEED(9) byte jnkbuf ( 80 ) INTEGER RLMAP(3000) LOGICAL AUTOMV COMMON/AB9/AB9,PRIOR,NSHPRF COMMON/ARMTOT/ARMTOT COMMON/CHRT/COMMAN,COMM,COMSCN,KBTBL COMMON/CHR2/IFILE,KILL,TTY COMMON/CITY/FOUND(70),OWNER(70),PHASE(70) COMMON/CMYTBL/CMYTBL,KBFUDG COMMON/COD/CODER COMMON/CODE/CODEFU,CODELA COMMON/CRAHL/HITS,TIPE,CRAHIT,CRALOC COMMON/FIPATH/FIPATH(70) COMMON/G2/G2 COMMON/IARROW/IARROW(10),ARROW,INDEX,LOPMAX COMMON/IOTAB/IOTAB COMMON/J1TS/J1TS COMMON/KXK/IADJST COMMON/MAP/D COMMON/MAPBLK/EMAP,RMAP,PMAP,RLMAP COMMON/OMAP/OMAP COMMON/MISC1/TARGET,AR2S,RANGE,RANG COMMON/MISC2/LOCI(10,11),NUMBER(18),LIMIT,MDATE,VERSION COMMON/MODE/MODE,JECTOR,ISEC,NEWRND COMMON/MFLAGS/MOVEDFLAG COMMON/MYCOD/D2,MYCODE COMMON/OKS/OKA,OKB,OKC COMMON/OVRPOP/OVRPOP COMMON/P1/PHAZE,PHAZEE,PH COMMON/DAYTIM/PAMELA,REEED COMMON/PASS/PASS,SPECAL,AUTOMV COMMON/SAVBUF/SAVBUF COMMON/SPS/STEP,POSIT,START COMMON/TEST2/SUCCES,FAILUR,FULL COMMON/TROOP/TROOPT(6,5) COMMON/X/X(70) common /jnkbuf/ jnkbuf, ptr C C AGGR: THIS IS A MEASURE OF THE ENEMY SHIPS AGGRESSIVENESS, C THIS VALUE IS ADDED TO THE COST-EFFECTIVENESS OF ATTACKING AN C ENEMY UNIT TO DETERMINE IF THE SHIP WILL ATTACK OR RUN FROM THE C ENEMY. C ALL CITIES ARE REFERENCED BY CITY NUMBER, AS IN X(N)=LOC OF CITY #N C CODFU/CODELA: CONTAINS A NUMBER THAT DETERMINES WHAT THAT COMPUTER CRAFT C IS ASSIGNED TO DO, IS SEPERATED INTO 2 NUMBERS, IFO AND ILA. IFO C GIVES THE FUNCTION, ILA GIVES DETAILS. C CODER: USED FOR DEBUG FLAG C CROWD: USED IF CITY IS SURROUNDED BY ARMIES C D: ORIGINAL MAP, ENCODED IN MOD 3 C EXPLOR: THIS IS SET TO 1 IF THE ENEMY SHIP IS TO EXPLORE UNKNOWN C TERRITORY ADJACENT TO IT, 0 IF NOT. C FIPATH: STASIS # TO BE GIVEN TO FIGHTER IN THAT CITY C FOUND: COMPLETION DATES FOR CITIES C IADJST: SUBTRACTED FROM Z6 SO CURSOR WILL NOT BE MOVED OFF SCREEN C IARROW: ADDED TO Z6 SO MOVES [1,2,3,4,5,6,7,8,9] ARE CONVERTED C TO [+1,-99,-100,-101,ETC.] C ISEC: SECTOR TERMINAL IS SHOWING C IZAP: .TRUE.=SAVE GAME, .FALSE.=INITIALIZE C JECTOR: SECTOR PROGRAM IS LOOKING AT C KURSOR: SET TO POSITION OF CURSOR C MODE: 1=IN MODE 2, 0=IN MODE 1 C OWNER: WHO OWNS THE CITY: 0>NOBODY, 1>PLAYER, 2>COMPUTER C PASS: SET TO .TRUE. IF IT IS A PRIVILEGED USER C PHASE: PHASE OF CITY C X: LOCATIONS OF CITIES C data comman/'S','R','I','K','O','L','F','G','P','H', 1 'Y','T','V','J','?',0,0,'U','N','+'/ data comm/'D','E','W','Q','A','Z','X','C','S', 1 'L','B','F','T','G','V','J','U',-1,-1, 2 'O','P','R','I','M','K','N', 3 'S','?','Y','H'/ data iotab/0,500,700,900,1100,1200,1300,1400,1500,2000, 1 2200,2400,2600,2700,2800,2900/ data ovrpop/ 1 9,001,002,9,003,004,05,9,9,9,06,9,07,9,9,08, 2 0,499,199,0,199,199,83,0,0,0,99,0,99,0,0,99/ data comscn/'M','N','O','S','T','V','P','Y','C','L','H','J', 1 '1','R','@','Q','+','A',0,0, 2 'LO','NU','LI','TR','AR','TA','PA','A1', 3 'T3','A0','CO','CH','Q0','Q1','JE','CY','EX',0,0,0/ data arrow/-101,-100,-99,-1,0,1,99,100,101/ data cmytbl/6104,6103,6102,6105,6101,6106,6107,6108,0/ data crahit/0,0,0,0, 200, 400,0,0,0, 500,0, 600,0,0, 700/ data craloc/0,500,0,700,900,1100,0,0,0,1200,0,1300,0,0,1400/ data hits/1,1,0,3,2,3,0,0,0,8,0,8,0,0,12/ data iarrow/0,1,-99,-100,-101,-1,99,100,101,0/ data index/11,12,0,13,14,15,0,0,0,16,0,17,0,0,18/ data kbfudg/-101,-100,-99,-1,1,99,100,101,0/ data kbtbl/'Q','W','E','A','D','Z','X','C',' '/ data lopmax/500,200,0,200,200,100,0,0,0,100,0,100,0,0,100/ data oka/'+',' ','*','X','O'/ data okb/'+',' ','O','t','*'/ data okc/'.',' ','O','*','X'/ data ph/1,2,4,5,6,10,12,15/ data phaze/'A','F','D','S','T','R','C','B'/ data phazee/1,2,4,5,6,10,12,15/ data step/37/,posit/65/,start/102/ data tipe/1,2,0,3,4,5,0,0,0,6,0,7,0,0,8/ end BYTE FUNCTION DECODE(Z6) C C UNPACK MAP DEFINITION FILE C D() = MAP DEFINITION FROM MAP FILE C Z6 = LOCATION C DECODE = CHARACTER AT Z6 C C MAPS ARE ENCODED USING MOD 3 ARITHMETIC TO FIT 9 CHARACTERS INTO ONE 16-BIT C WORD. C IMPLICIT INTEGER(A-Z) INTEGER MSKTAB(9) INTEGER*2 D(667) BYTE ASCII(3) DATA ASCII/'.','+','*'/ DATA MSKTAB/1,3,9,27,81,243,729,2187,6561/ COMMON/MAP/D C IX=((Z6-1)/9)+1 IY=MOD(Z6-1,9)+1 DECODE=ASCII(MOD(D(IX)/MSKTAB(IY),3)+1) RETURN END ccc delay - wait for 1/60's of a second subroutine delay ( ticks ) integer ticks parameter efn = 4 integer status, sys$setimr, sys$waitfr integer*4 delta ( 2 ) data delta/ 0, -1 / delta ( 1 ) = - ticks * 166667 status = sys$setimr ( %val ( efn ), delta, , ) status = sys$waitfr ( %val ( efn )) return end subroutine direc call topmsg ( 2, 'H for Help!' ) end SUBROUTINE DIST(Z6,ILA) C C THIS SUBROUTINE SETS AR2S SO THAT THE ARMY WON'T GET C OFF THE TROOP TRANSPORT PREMATURELY C IMPLICIT INTEGER(A-Z) PARAMETER IAR=0,IFI=500,IDE=700,ISU=900,ITT=1100, 1 ICR=1200,ICA=1300,IBA=1400 PARAMETER IAR2=1500,IFI2=2000,IDE2=2200,ISU2=2400,ITT2=2600, 1 ICR2=2700,ICA2=2800,IBA2=2900 PARAMETER IDEH=0,ISUH=200,ITTH=400,ICRH=500,ICAH=600,IBAH=700 PARAMETER IDE2H=800,ISU2H=1000,ITT2H=1200,ICR2H=1300, 1 ICA2H=1400,IBA2H=1500 INTEGER G2(100) INTEGER HITS(15),TIPE(15),CRAHIT(15),CRALOC(15) INTEGER INDEX(15) INTEGER CMYTBL(9),KBFUDG(9) INTEGER LOPMAX(15),COMSCN(40) INTEGER NSHPRF(4,6) INTEGER PH(8),OVRPOP(16,2) INTEGER PRIOR(7) INTEGER RANGE(200),AR2S(500) INTEGER ARMTOT(20),CODEFU(1500),CODELA(1500),TARGET(70),LIMIT(16) INTEGER ARROW(9) INTEGER D2(3) INTEGER*2 D(667) INTEGER MYCODE(1500) INTEGER RANG(200) INTEGER IOTAB(16) INTEGER PHAZEE(8) integer ptr BYTE SPECAL,PASS BYTE AB,AC,AD,AO,E,OWN1,OWN2,OWN !AVOID WORD REFERENCES TO THESE BYTE KBTBL(9),AB9(9) BYTE COMM(30),PHAZE(8) BYTE IFILE(11),KILL BYTE COMMAN(20),OKA(5),OKB(5),OKC(5) BYTE TTY(20) BYTE MOVEDFLAG(1500) BYTE J1TS(1600) BYTE EMAP(6000),RMAP(6000),PMAP(6000),OMAP(6000) BYTE PAMELA(8),REEED(9) byte jnkbuf ( 80 ) INTEGER RLMAP(3000) LOGICAL AUTOMV COMMON/AB9/AB9,PRIOR,NSHPRF COMMON/ARMTOT/ARMTOT COMMON/CHRT/COMMAN,COMM,COMSCN,KBTBL COMMON/CHR2/IFILE,KILL,TTY COMMON/CITY/FOUND(70),OWNER(70),PHASE(70) COMMON/CMYTBL/CMYTBL,KBFUDG COMMON/COD/CODER COMMON/CODE/CODEFU,CODELA COMMON/CRAHL/HITS,TIPE,CRAHIT,CRALOC COMMON/FIPATH/FIPATH(70) COMMON/G2/G2 COMMON/IARROW/IARROW(10),ARROW,INDEX,LOPMAX COMMON/IOTAB/IOTAB COMMON/J1TS/J1TS COMMON/KXK/IADJST COMMON/MAP/D COMMON/MAPBLK/EMAP,RMAP,PMAP,RLMAP COMMON/OMAP/OMAP COMMON/MISC1/TARGET,AR2S,RANGE,RANG COMMON/MISC2/LOCI(10,11),NUMBER(18),LIMIT,MDATE,VERSION COMMON/MODE/MODE,JECTOR,ISEC,NEWRND COMMON/MFLAGS/MOVEDFLAG COMMON/MYCOD/D2,MYCODE COMMON/OKS/OKA,OKB,OKC COMMON/OVRPOP/OVRPOP COMMON/P1/PHAZE,PHAZEE,PH COMMON/DAYTIM/PAMELA,REEED COMMON/PASS/PASS,SPECAL,AUTOMV COMMON/SAVBUF/SAVBUF COMMON/SPS/STEP,POSIT,START COMMON/TEST2/SUCCES,FAILUR,FULL COMMON/TROOP/TROOPT(6,5) COMMON/X/X(70) common /jnkbuf/ jnkbuf, ptr C C AGGR: THIS IS A MEASURE OF THE ENEMY SHIPS AGGRESSIVENESS, C THIS VALUE IS ADDED TO THE COST-EFFECTIVENESS OF ATTACKING AN C ENEMY UNIT TO DETERMINE IF THE SHIP WILL ATTACK OR RUN FROM THE C ENEMY. C ALL CITIES ARE REFERENCED BY CITY NUMBER, AS IN X(N)=LOC OF CITY #N C CODFU/CODELA: CONTAINS A NUMBER THAT DETERMINES WHAT THAT COMPUTER CRAFT C IS ASSIGNED TO DO, IS SEPERATED INTO 2 NUMBERS, IFO AND ILA. IFO C GIVES THE FUNCTION, ILA GIVES DETAILS. C CODER: USED FOR DEBUG FLAG C CROWD: USED IF CITY IS SURROUNDED BY ARMIES C D: ORIGINAL MAP, ENCODED IN MOD 3 C EXPLOR: THIS IS SET TO 1 IF THE ENEMY SHIP IS TO EXPLORE UNKNOWN C TERRITORY ADJACENT TO IT, 0 IF NOT. C FIPATH: STASIS # TO BE GIVEN TO FIGHTER IN THAT CITY C FOUND: COMPLETION DATES FOR CITIES C IADJST: SUBTRACTED FROM Z6 SO CURSOR WILL NOT BE MOVED OFF SCREEN C IARROW: ADDED TO Z6 SO MOVES [1,2,3,4,5,6,7,8,9] ARE CONVERTED C TO [+1,-99,-100,-101,ETC.] C ISEC: SECTOR TERMINAL IS SHOWING C IZAP: .TRUE.=SAVE GAME, .FALSE.=INITIALIZE C JECTOR: SECTOR PROGRAM IS LOOKING AT C KURSOR: SET TO POSITION OF CURSOR C MODE: 1=IN MODE 2, 0=IN MODE 1 C OWNER: WHO OWNS THE CITY: 0>NOBODY, 1>PLAYER, 2>COMPUTER C PASS: SET TO .TRUE. IF IT IS A PRIVILEGED USER C PHASE: PHASE OF CITY C X: LOCATIONS OF CITIES C C ID=2*IDIST(Z6,ILA)+1 DO 100 L=1+IAR2,LIMIT(9)+IAR2 100 IF (RLMAP(L).EQ.Z6) AR2S(L-IAR2)=ID RETURN END FUNCTION EDGER(I) C C RETURN NUMBER OF SEA SQUARES THAT ARE ADJACENT TO LOCATION I C IMPLICIT INTEGER(A-Z) PARAMETER IAR=0,IFI=500,IDE=700,ISU=900,ITT=1100, 1 ICR=1200,ICA=1300,IBA=1400 PARAMETER IAR2=1500,IFI2=2000,IDE2=2200,ISU2=2400,ITT2=2600, 1 ICR2=2700,ICA2=2800,IBA2=2900 PARAMETER IDEH=0,ISUH=200,ITTH=400,ICRH=500,ICAH=600,IBAH=700 PARAMETER IDE2H=800,ISU2H=1000,ITT2H=1200,ICR2H=1300, 1 ICA2H=1400,IBA2H=1500 INTEGER G2(100) INTEGER HITS(15),TIPE(15),CRAHIT(15),CRALOC(15) INTEGER INDEX(15) INTEGER CMYTBL(9),KBFUDG(9) INTEGER LOPMAX(15),COMSCN(40) INTEGER NSHPRF(4,6) INTEGER PH(8),OVRPOP(16,2) INTEGER PRIOR(7) INTEGER RANGE(200),AR2S(500) INTEGER ARMTOT(20),CODEFU(1500),CODELA(1500),TARGET(70),LIMIT(16) INTEGER ARROW(9) INTEGER D2(3) INTEGER*2 D(667) INTEGER MYCODE(1500) INTEGER RANG(200) INTEGER IOTAB(16) INTEGER PHAZEE(8) integer ptr BYTE SPECAL,PASS BYTE AB,AC,AD,AO,E,OWN1,OWN2,OWN !AVOID WORD REFERENCES TO THESE BYTE KBTBL(9),AB9(9) BYTE COMM(30),PHAZE(8) BYTE IFILE(11),KILL BYTE COMMAN(20),OKA(5),OKB(5),OKC(5) BYTE TTY(20) BYTE MOVEDFLAG(1500) BYTE J1TS(1600) BYTE EMAP(6000),RMAP(6000),PMAP(6000),OMAP(6000) BYTE PAMELA(8),REEED(9) byte jnkbuf ( 80 ) INTEGER RLMAP(3000) LOGICAL AUTOMV COMMON/AB9/AB9,PRIOR,NSHPRF COMMON/ARMTOT/ARMTOT COMMON/CHRT/COMMAN,COMM,COMSCN,KBTBL COMMON/CHR2/IFILE,KILL,TTY COMMON/CITY/FOUND(70),OWNER(70),PHASE(70) COMMON/CMYTBL/CMYTBL,KBFUDG COMMON/COD/CODER COMMON/CODE/CODEFU,CODELA COMMON/CRAHL/HITS,TIPE,CRAHIT,CRALOC COMMON/FIPATH/FIPATH(70) COMMON/G2/G2 COMMON/IARROW/IARROW(10),ARROW,INDEX,LOPMAX COMMON/IOTAB/IOTAB COMMON/J1TS/J1TS COMMON/KXK/IADJST COMMON/MAP/D COMMON/MAPBLK/EMAP,RMAP,PMAP,RLMAP COMMON/OMAP/OMAP COMMON/MISC1/TARGET,AR2S,RANGE,RANG COMMON/MISC2/LOCI(10,11),NUMBER(18),LIMIT,MDATE,VERSION COMMON/MODE/MODE,JECTOR,ISEC,NEWRND COMMON/MFLAGS/MOVEDFLAG COMMON/MYCOD/D2,MYCODE COMMON/OKS/OKA,OKB,OKC COMMON/OVRPOP/OVRPOP COMMON/P1/PHAZE,PHAZEE,PH COMMON/DAYTIM/PAMELA,REEED COMMON/PASS/PASS,SPECAL,AUTOMV COMMON/SAVBUF/SAVBUF COMMON/SPS/STEP,POSIT,START COMMON/TEST2/SUCCES,FAILUR,FULL COMMON/TROOP/TROOPT(6,5) COMMON/X/X(70) common /jnkbuf/ jnkbuf, ptr C C AGGR: THIS IS A MEASURE OF THE ENEMY SHIPS AGGRESSIVENESS, C THIS VALUE IS ADDED TO THE COST-EFFECTIVENESS OF ATTACKING AN C ENEMY UNIT TO DETERMINE IF THE SHIP WILL ATTACK OR RUN FROM THE C ENEMY. C ALL CITIES ARE REFERENCED BY CITY NUMBER, AS IN X(N)=LOC OF CITY #N C CODFU/CODELA: CONTAINS A NUMBER THAT DETERMINES WHAT THAT COMPUTER CRAFT C IS ASSIGNED TO DO, IS SEPERATED INTO 2 NUMBERS, IFO AND ILA. IFO C GIVES THE FUNCTION, ILA GIVES DETAILS. C CODER: USED FOR DEBUG FLAG C CROWD: USED IF CITY IS SURROUNDED BY ARMIES C D: ORIGINAL MAP, ENCODED IN MOD 3 C EXPLOR: THIS IS SET TO 1 IF THE ENEMY SHIP IS TO EXPLORE UNKNOWN C TERRITORY ADJACENT TO IT, 0 IF NOT. C FIPATH: STASIS # TO BE GIVEN TO FIGHTER IN THAT CITY C FOUND: COMPLETION DATES FOR CITIES C IADJST: SUBTRACTED FROM Z6 SO CURSOR WILL NOT BE MOVED OFF SCREEN C IARROW: ADDED TO Z6 SO MOVES [1,2,3,4,5,6,7,8,9] ARE CONVERTED C TO [+1,-99,-100,-101,ETC.] C ISEC: SECTOR TERMINAL IS SHOWING C IZAP: .TRUE.=SAVE GAME, .FALSE.=INITIALIZE C JECTOR: SECTOR PROGRAM IS LOOKING AT C KURSOR: SET TO POSITION OF CURSOR C MODE: 1=IN MODE 2, 0=IN MODE 1 C OWNER: WHO OWNS THE CITY: 0>NOBODY, 1>PLAYER, 2>COMPUTER C PASS: SET TO .TRUE. IF IT IS A PRIVILEGED USER C PHASE: PHASE OF CITY C X: LOCATIONS OF CITIES C C EDGER=0 DO 100 IA=1,8 100 IF (OMAP(I+IARROW(IA+1)).EQ.'.') EDGER=EDGER+1 RETURN END subroutine edit(z5) c c Edit mode command subroutine c test routines for path c IMPLICIT INTEGER(A-Z) PARAMETER IAR=0,IFI=500,IDE=700,ISU=900,ITT=1100, 1 ICR=1200,ICA=1300,IBA=1400 PARAMETER IAR2=1500,IFI2=2000,IDE2=2200,ISU2=2400,ITT2=2600, 1 ICR2=2700,ICA2=2800,IBA2=2900 PARAMETER IDEH=0,ISUH=200,ITTH=400,ICRH=500,ICAH=600,IBAH=700 PARAMETER IDE2H=800,ISU2H=1000,ITT2H=1200,ICR2H=1300, 1 ICA2H=1400,IBA2H=1500 INTEGER G2(100) INTEGER HITS(15),TIPE(15),CRAHIT(15),CRALOC(15) INTEGER INDEX(15) INTEGER CMYTBL(9),KBFUDG(9) INTEGER LOPMAX(15),COMSCN(40) INTEGER NSHPRF(4,6) INTEGER PH(8),OVRPOP(16,2) INTEGER PRIOR(7) INTEGER RANGE(200),AR2S(500) INTEGER ARMTOT(20),CODEFU(1500),CODELA(1500),TARGET(70),LIMIT(16) INTEGER ARROW(9) INTEGER D2(3) INTEGER*2 D(667) INTEGER MYCODE(1500) INTEGER RANG(200) INTEGER IOTAB(16) INTEGER PHAZEE(8) integer ptr BYTE SPECAL,PASS BYTE AB,AC,AD,AO,E,OWN1,OWN2,OWN !AVOID WORD REFERENCES TO THESE BYTE KBTBL(9),AB9(9) BYTE COMM(30),PHAZE(8) BYTE IFILE(11),KILL BYTE COMMAN(20),OKA(5),OKB(5),OKC(5) BYTE TTY(20) BYTE MOVEDFLAG(1500) BYTE J1TS(1600) BYTE EMAP(6000),RMAP(6000),PMAP(6000),OMAP(6000) BYTE PAMELA(8),REEED(9) byte jnkbuf ( 80 ) INTEGER RLMAP(3000) LOGICAL AUTOMV COMMON/AB9/AB9,PRIOR,NSHPRF COMMON/ARMTOT/ARMTOT COMMON/CHRT/COMMAN,COMM,COMSCN,KBTBL COMMON/CHR2/IFILE,KILL,TTY COMMON/CITY/FOUND(70),OWNER(70),PHASE(70) COMMON/CMYTBL/CMYTBL,KBFUDG COMMON/COD/CODER COMMON/CODE/CODEFU,CODELA COMMON/CRAHL/HITS,TIPE,CRAHIT,CRALOC COMMON/FIPATH/FIPATH(70) COMMON/G2/G2 COMMON/IARROW/IARROW(10),ARROW,INDEX,LOPMAX COMMON/IOTAB/IOTAB COMMON/J1TS/J1TS COMMON/KXK/IADJST COMMON/MAP/D COMMON/MAPBLK/EMAP,RMAP,PMAP,RLMAP COMMON/OMAP/OMAP COMMON/MISC1/TARGET,AR2S,RANGE,RANG COMMON/MISC2/LOCI(10,11),NUMBER(18),LIMIT,MDATE,VERSION COMMON/MODE/MODE,JECTOR,ISEC,NEWRND COMMON/MFLAGS/MOVEDFLAG COMMON/MYCOD/D2,MYCODE COMMON/OKS/OKA,OKB,OKC COMMON/OVRPOP/OVRPOP COMMON/P1/PHAZE,PHAZEE,PH COMMON/DAYTIM/PAMELA,REEED COMMON/PASS/PASS,SPECAL,AUTOMV COMMON/SAVBUF/SAVBUF COMMON/SPS/STEP,POSIT,START COMMON/TEST2/SUCCES,FAILUR,FULL COMMON/TROOP/TROOPT(6,5) COMMON/X/X(70) common /jnkbuf/ jnkbuf, ptr C C AGGR: THIS IS A MEASURE OF THE ENEMY SHIPS AGGRESSIVENESS, C THIS VALUE IS ADDED TO THE COST-EFFECTIVENESS OF ATTACKING AN C ENEMY UNIT TO DETERMINE IF THE SHIP WILL ATTACK OR RUN FROM THE C ENEMY. C ALL CITIES ARE REFERENCED BY CITY NUMBER, AS IN X(N)=LOC OF CITY #N C CODFU/CODELA: CONTAINS A NUMBER THAT DETERMINES WHAT THAT COMPUTER CRAFT C IS ASSIGNED TO DO, IS SEPERATED INTO 2 NUMBERS, IFO AND ILA. IFO C GIVES THE FUNCTION, ILA GIVES DETAILS. C CODER: USED FOR DEBUG FLAG C CROWD: USED IF CITY IS SURROUNDED BY ARMIES C D: ORIGINAL MAP, ENCODED IN MOD 3 C EXPLOR: THIS IS SET TO 1 IF THE ENEMY SHIP IS TO EXPLORE UNKNOWN C TERRITORY ADJACENT TO IT, 0 IF NOT. C FIPATH: STASIS # TO BE GIVEN TO FIGHTER IN THAT CITY C FOUND: COMPLETION DATES FOR CITIES C IADJST: SUBTRACTED FROM Z6 SO CURSOR WILL NOT BE MOVED OFF SCREEN C IARROW: ADDED TO Z6 SO MOVES [1,2,3,4,5,6,7,8,9] ARE CONVERTED C TO [+1,-99,-100,-101,ETC.] C ISEC: SECTOR TERMINAL IS SHOWING C IZAP: .TRUE.=SAVE GAME, .FALSE.=INITIALIZE C JECTOR: SECTOR PROGRAM IS LOOKING AT C KURSOR: SET TO POSITION OF CURSOR C MODE: 1=IN MODE 2, 0=IN MODE 1 C OWNER: WHO OWNS THE CITY: 0>NOBODY, 1>PLAYER, 2>COMPUTER C PASS: SET TO .TRUE. IF IT IS A PRIVILEGED USER C PHASE: PHASE OF CITY C X: LOCATIONS OF CITIES C byte char z6=z5 whtflg=0 movflg=0 oldj=jector call sector(pmap(1)) 100 line=kline(ki,jector) iadjst=line+ki-300 if (z6.eq.0) z6=iadjst+1240 dir=1 200 call cursor(z6-iadjst) e=getchx() z7 = z6 do 300 i=1,8 300 if (e.eq.comm(i)) z6=z6+iarrow(i+1) ! if cursor move, change location if ((scrchk(z6).eq.1).and.(order(z6).eq.0)) goto 400 z6=z7 ! if not on screen, get back goto 4500 400 if (z6.eq.z7) goto 500 goto 200 500 do 600 i=10,30 j=i 600 if (e.eq.comm(i)) goto 700 goto 4500 c c l, b, f, t, g, v, j, u,-1,-1 priv cmds c 700 if (pass) goto (800,900,1000,1100,1200,1400,1500,1600,1700,1800) j-9 c c o, p, r, i, m, k, n, s, ?, y, h normal cmds c goto (1300,1900,4300,2100,2500,2700,2900,3100,3200,4200,4400) j-19 goto 4500 800 isec=-1 !n - display enemy sector call sector(emap(1)) goto 200 900 beg=z6 !b - set beg ix='B' type 999,ix 999 format('+',a1,$) goto 200 1000 end=z6 !f - set end ix='E' type 999,ix goto 200 1100 flag=1000 !t - single step & trace path call path(beg,end,dir,okc,flag) goto 200 1200 flag=1001 !g - show path chosen call path(beg,end,dir,okc,flag) goto 200 1300 continue !o - return to caller jector=oldj !restore sector number line=kline(ki,jector) iadjst=line+ki-300 call sector(pmap(1)) ! refresh our map return 1400 dir=-dir !v - reverse direction goto 200 1500 h2=30 !j - display code values for own2=rmap(z6) ! enemy units if (own2.lt.'a' .or. own2.gt.'9') goto 4500 call find(own2,z6,z8,h2) ptr = 0 call addstr ( 'Code: ', jnkbuf, ptr ) call addint ( codefu ( z8 - 1500 ), jnkbuf, ptr ) call addstr ( ' ', jnkbuf, ptr ) call addint ( codela ( z8 - 1500 ), jnkbuf, ptr ) call bufpos ( 1, 50, jnkbuf, ptr ) call flush goto 200 1600 isec=-1 !u - display reference sector call sector(rmap(1)) goto 200 1700 continue ! shouldn't happen 1800 continue stop c c p: print out new sector c 1900 isec=-1 call topmsg ( 3, 0 ) call topmsg ( 2, 0 ) call topmsg ( 1, 'New Sector: ') call flush jector = iphase(getchx()) call addcnt ( 1, 1 ) if ( jector .lt. 0 .or. jector .gt. 9 ) goto 1900 call sector ( pmap ( 1 )) isec = -1 z6 = 0 goto 100 c c r: print out the round number c c2000 call TPOS(2,50) c call SSTROUT ( ' Round #',12) c call decprt(mdate) c call eol c goto 200 c c i: directional stasis c 2100 ab=rmap(z6) if ((ab.lt.'A').or.(ab.gt.'T')) goto 4500 e=getchx() do 2200 i=1,8 j=i 2200 if (comm(i).eq.e) goto 2300 goto 4500 2300 if (ab.ne.'O') goto 2400 fipath(citfnd(z6))=j+6100 goto 200 2400 h2=30 call find(ab,z6,movflg,h2) mycode(movflg)=j+6100 goto 200 c c m: say we want to move to a location c 2500 ab=rmap(z6) if ((ab.lt.'A').or.(ab.gt.'T')) goto 4500 if (ab.ne.'O') goto 2600 whtflg='CI' movflg=citfnd(z6) goto 200 2600 h2=30 call find(ab,z6,movflg,h2) whtflg='UN' goto 200 c c k: wake up anything and everything c 2700 ab=rmap(z6) if ((ab.lt.'A').or.(ab.gt.'T')) goto 4500 if (ab.ne.'O') goto 2800 fipath(citfnd(z6))=0 !if city, kill flight path do 2750 i=501,1500 !wake any fighters or ships if (rlmap(i).eq.z6) mycode(i)=0 2750 continue goto 200 2800 h2=30 !not a city, find the unit call find(ab,z6,movflg,h2) mycode(movflg)=0 !zero any function code if (ab.ne.'T') goto 2817 !if transport, wake armies aboard do 2816 j=1,500 2816 if (rlmap(j).eq.z6) mycode(j)=0 goto 200 2817 if (ab.ne.'C') goto 200 !if carrier, wake fighters aboard do 2818 j=501,700 2818 if (rlmap(j).eq.z6) mycode(j)=0 goto 200 c c n: go here c 2900 if (whtflg.ne.'CI') goto 3000 fipath(movflg)=z6 goto 200 3000 if (whtflg.ne.'UN') goto 4500 mycode(movflg)=z6 goto 200 c c s: goto sleep c 3100 ab=rmap(z6) if ((ab.lt.'A').or.(ab.gt.'T')) goto 4500 if (ab.eq.'O') goto 4500 h2=30 call find(ab,z6,movflg,h2) mycode(movflg)=50 goto 200 c c ?: request info c 3200 ab = rmap ( z6 ) if (ab.eq.'O') goto 3800 if ((ab.eq.'X').and.(pass)) goto 3800 if ((ab.ge.'A').and.(ab.le.'T')) goto 3250 if ((ab.ge.'a').and.(ab.le.'t').and.(pass)) goto 3250 goto 4500 3250 h2=30 call find(ab,z6,movflg,h2) if (movflg.le.1500) then do 3300 i=1,8 3300 if (ab.eq. phaze(i)) relnum=movflg-craloc(phazee(i)) call topmsg ( 3, 0 ) call topmsg ( 2, 0 ) ! clear line call head (ab, relnum, movflg, z6, h2 ) ! display standard header else call tpos ( 1, 1 ) type 989,movflg,codefu(movflg-1500),codela(movflg-1500),h2 989 format ( '+ unit=',i5,' function=',i5,' sub func=',i5, 1 ' hits=',i2,$) endif if ((ab.eq.'A').or.(ab.eq.'F').or.(ab.eq.'a').or.(ab.eq.'f')) goto 200 n=0 base=0 if (movflg.gt.1500) base=1500 if ((ab.ne.'T').and.(ab.ne.'t')) goto 3500 do 3400 i=1,500 !count armies 3400 if (rlmap(i+base).eq.z6) n=n+1 if (n.eq.0) goto 3700 ptr = 0 call addint ( n, jnkbuf, ptr ) if ( n .eq. 1 ) call addstr ( ' army', jnkbuf, ptr ) if ( n .gt. 1 ) call addstr ( ' armies', jnkbuf, ptr ) call addstr ( ' aboard', jnkbuf, ptr ) jnkbuf ( ptr + 1 ) = 0 call topmsg ( 3, jnkbuf ) call flush goto 200 3500 if ((ab.ne.'C').and.(ab.ne.'c')) goto 200 do 3600 i=1,200 ! count fighters 3600 if (rlmap(i+500+base).eq.z6) n=n+1 if (n.eq.0) goto 3700 cc if (mode.eq.1) call TPOS(3,1) ptr = 0 call addint ( n, jnkbuf, ptr ) call addstr ( ' fighter', jnkbuf, ptr ) if ( n .gt. 1 ) call addstr ( 's', jnkbuf, ptr ) call addstr ( ' aboard', jnkbuf, ptr ) jnkbuf ( ptr + 1 ) = 0 call topmsg ( 3, jnkbuf ) call flush goto 200 3700 continue ! nothing there cc if (mode.eq.1) call TPOS(3,1) call topmsg ( 3, 'Nothing aboard' ) call flush goto 200 c c Display info on city c 3800 continue call topmsg ( 2, 0 ) ! clear line j=citfnd(z6) ! find city base=0 if (owner(j).eq.2) base=1500 n=0 do 3900 i=base+501,base+700 ! count fighters 3900 if (rlmap(i).eq.z6) n=n+1 cc call tpos(2,1) ptr = 0 call addint ( n, jnkbuf, ptr ) call addstr ( ' fighter', jnkbuf, ptr ) if ( n .ne. 1 ) call addstr ( 's', jnkbuf, ptr ) call addstr ( ' landed, ', jnkbuf, ptr ) n=0 do 4000 i=base+701,base+1500 ! count ships 4000 if (rlmap(i).eq.z6) n=n+1 call addint ( n, jnkbuf, ptr ) call addstr ( ' ship', jnkbuf, ptr ) if ( n .ne. 1 ) call addstr ( 's', jnkbuf, ptr ) call addstr ( ' docked', jnkbuf, ptr ) jnkbuf ( ptr + 1 ) = 0 call topmsg ( 3, jnkbuf ) 4150 continue ! explain production ptr = 0 call addstr ( 'City at location ', jnkbuf, ptr ) call addint ( z6, jnkbuf, ptr ) call addstr ( ', will complete a', jnkbuf, ptr ) do 4100 i=1,8 if (phase(j) .eq. phazee(i)) char = phaze ( i ) 4100 continue if (( char .eq. 'A') .or. ( char .eq. 'a' )) * call addstr ( 'n', jnkbuf, ptr ) call addstr ( ' ', jnkbuf, ptr ) call addpei ( char, jnkbuf, ptr ) call addstr ( ' on ', jnkbuf, ptr ) call addint ( found ( j ), jnkbuf, ptr ) call addstr ( ', fpath: ', jnkbuf, ptr ) if (fipath(j).lt.100) call addstr ( 'sit', jnkbuf, ptr ) if ((fipath(j).gt.100).and.(fipath(j).lt.6000)) * call addint ( fipath ( j ), jnkbuf, ptr ) if ( fipath ( j ) .le. 6100 ) goto 4126 ptr = ptr + 1 jnkbuf ( ptr ) = comm ( fipath ( j ) - 6100 ) 4126 continue jnkbuf ( ptr + 1 ) = 0 call topmsg ( 1, jnkbuf ) call flush goto 200 c c y: enter new city production c 4200 ab = rmap ( z6 ) if ( ab .ne. 'O' ) goto 4500 j = citfnd ( z6 ) call topmsg ( 3, 0 ) call topmsg ( 2, 0 ) call topmsg ( 1, 'New Production: ' ) call flush call phasin ( j, e ) call addcnt ( 1, 1 ) call putc ( e ) call flush goto 4150 c c r: set army to move at random c 4300 ab = rmap ( z6 ) if ( ab .ne. 'A' ) goto 4500 h2 = 30 call find ( ab, z6, movflg, h2 ) mycode ( movflg ) = 100 goto 200 c c h: get help c 4400 call help e = getchx() isec = -1 call sector(pmap(1)) isec = -1 goto 100 c c Default mistake message c 4500 call huh goto 200 end subroutine empend CC call gamend CC call endst(0) call exit end SUBROUTINE ENEMYM(OWN1,HITMAX,ACRAHIT,ACRALOC,NUM) C C THIS SUBROUTINE HANDLES ENEMY SHIP MOVES OTHER THAN T'S AND C'S C IMPLICIT INTEGER(A-Z) PARAMETER IAR=0,IFI=500,IDE=700,ISU=900,ITT=1100, 1 ICR=1200,ICA=1300,IBA=1400 PARAMETER IAR2=1500,IFI2=2000,IDE2=2200,ISU2=2400,ITT2=2600, 1 ICR2=2700,ICA2=2800,IBA2=2900 PARAMETER IDEH=0,ISUH=200,ITTH=400,ICRH=500,ICAH=600,IBAH=700 PARAMETER IDE2H=800,ISU2H=1000,ITT2H=1200,ICR2H=1300, 1 ICA2H=1400,IBA2H=1500 INTEGER G2(100) INTEGER HITS(15),TIPE(15),CRAHIT(15),CRALOC(15) INTEGER INDEX(15) INTEGER CMYTBL(9),KBFUDG(9) INTEGER LOPMAX(15),COMSCN(40) INTEGER NSHPRF(4,6) INTEGER PH(8),OVRPOP(16,2) INTEGER PRIOR(7) INTEGER RANGE(200),AR2S(500) INTEGER ARMTOT(20),CODEFU(1500),CODELA(1500),TARGET(70),LIMIT(16) INTEGER ARROW(9) INTEGER D2(3) INTEGER*2 D(667) INTEGER MYCODE(1500) INTEGER RANG(200) INTEGER IOTAB(16) INTEGER PHAZEE(8) integer ptr BYTE SPECAL,PASS BYTE AB,AC,AD,AO,E,OWN1,OWN2,OWN !AVOID WORD REFERENCES TO THESE BYTE KBTBL(9),AB9(9) BYTE COMM(30),PHAZE(8) BYTE IFILE(11),KILL BYTE COMMAN(20),OKA(5),OKB(5),OKC(5) BYTE TTY(20) BYTE MOVEDFLAG(1500) BYTE J1TS(1600) BYTE EMAP(6000),RMAP(6000),PMAP(6000),OMAP(6000) BYTE PAMELA(8),REEED(9) byte jnkbuf ( 80 ) INTEGER RLMAP(3000) LOGICAL AUTOMV COMMON/AB9/AB9,PRIOR,NSHPRF COMMON/ARMTOT/ARMTOT COMMON/CHRT/COMMAN,COMM,COMSCN,KBTBL COMMON/CHR2/IFILE,KILL,TTY COMMON/CITY/FOUND(70),OWNER(70),PHASE(70) COMMON/CMYTBL/CMYTBL,KBFUDG COMMON/COD/CODER COMMON/CODE/CODEFU,CODELA COMMON/CRAHL/HITS,TIPE,CRAHIT,CRALOC COMMON/FIPATH/FIPATH(70) COMMON/G2/G2 COMMON/IARROW/IARROW(10),ARROW,INDEX,LOPMAX COMMON/IOTAB/IOTAB COMMON/J1TS/J1TS COMMON/KXK/IADJST COMMON/MAP/D COMMON/MAPBLK/EMAP,RMAP,PMAP,RLMAP COMMON/OMAP/OMAP COMMON/MISC1/TARGET,AR2S,RANGE,RANG COMMON/MISC2/LOCI(10,11),NUMBER(18),LIMIT,MDATE,VERSION COMMON/MODE/MODE,JECTOR,ISEC,NEWRND COMMON/MFLAGS/MOVEDFLAG COMMON/MYCOD/D2,MYCODE COMMON/OKS/OKA,OKB,OKC COMMON/OVRPOP/OVRPOP COMMON/P1/PHAZE,PHAZEE,PH COMMON/DAYTIM/PAMELA,REEED COMMON/PASS/PASS,SPECAL,AUTOMV COMMON/SAVBUF/SAVBUF COMMON/SPS/STEP,POSIT,START COMMON/TEST2/SUCCES,FAILUR,FULL COMMON/TROOP/TROOPT(6,5) COMMON/X/X(70) common /jnkbuf/ jnkbuf, ptr C C AGGR: THIS IS A MEASURE OF THE ENEMY SHIPS AGGRESSIVENESS, C THIS VALUE IS ADDED TO THE COST-EFFECTIVENESS OF ATTACKING AN C ENEMY UNIT TO DETERMINE IF THE SHIP WILL ATTACK OR RUN FROM THE C ENEMY. C ALL CITIES ARE REFERENCED BY CITY NUMBER, AS IN X(N)=LOC OF CITY #N C CODFU/CODELA: CONTAINS A NUMBER THAT DETERMINES WHAT THAT COMPUTER CRAFT C IS ASSIGNED TO DO, IS SEPERATED INTO 2 NUMBERS, IFO AND ILA. IFO C GIVES THE FUNCTION, ILA GIVES DETAILS. C CODER: USED FOR DEBUG FLAG C CROWD: USED IF CITY IS SURROUNDED BY ARMIES C D: ORIGINAL MAP, ENCODED IN MOD 3 C EXPLOR: THIS IS SET TO 1 IF THE ENEMY SHIP IS TO EXPLORE UNKNOWN C TERRITORY ADJACENT TO IT, 0 IF NOT. C FIPATH: STASIS # TO BE GIVEN TO FIGHTER IN THAT CITY C FOUND: COMPLETION DATES FOR CITIES C IADJST: SUBTRACTED FROM Z6 SO CURSOR WILL NOT BE MOVED OFF SCREEN C IARROW: ADDED TO Z6 SO MOVES [1,2,3,4,5,6,7,8,9] ARE CONVERTED C TO [+1,-99,-100,-101,ETC.] C ISEC: SECTOR TERMINAL IS SHOWING C IZAP: .TRUE.=SAVE GAME, .FALSE.=INITIALIZE C JECTOR: SECTOR PROGRAM IS LOOKING AT C KURSOR: SET TO POSITION OF CURSOR C MODE: 1=IN MODE 2, 0=IN MODE 1 C OWNER: WHO OWNS THE CITY: 0>NOBODY, 1>PLAYER, 2>COMPUTER C PASS: SET TO .TRUE. IF IT IS A PRIVILEGED USER C PHASE: PHASE OF CITY C X: LOCATIONS OF CITIES C C C NSHPRF IS AN ARRAY WHICH IS REFERENCED TO DETERMINE C WHETHER A CERTAIN SHIP (D=1,S=2,R=3,B=4) WANTS TO ATTACK C ANOTHER CERTAIN TYPE OF SHIP. 1 MEANS YES, 0 MEANS NO. C SECOND VARIABLE: 1=D,2=S,3=T,4=R,5=C,6=B C DATA NSHPRF/1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1/ C CTHE FOLLOWING NUMBERS ARE IFO VARIABLES RELATING TO C CERTAIN TYPES OF MOVEMENT (CODES) C 7: RANDOM DIRECTION C 3: CITY TARGET LOC. C 4: TT NUMBER ESCORT C 5: TARGET C 8: DAMAGED C 10: LOOK AT UNEXPLORED TERRITORY C IF (NUM.EQ.3) NUMSHP=1 IF (NUM.EQ.4) NUMSHP=2 IF (NUM.EQ.6) NUMSHP=3 IF (NUM.EQ.8) NUMSHP=4 C NUMBER(NUM)=0 IF (CODER.EQ.NUM) TYPE 999,OWN1 999 FORMAT(1X,A1,' CODES') MONKEY=0 C DO 2400 Y=1,LIMIT(NUM+8) Z6=RLMAP(Y+ACRALOC) IF (Z6.EQ.0) GOTO 2400 DIR=MOD(Y,2)*2-1 H1=J1TS(Y+ACRAHIT) AB=RMAP(Z6) IF (AB.EQ.'X') H1=H1+1 IF (H1.GT.HITMAX) H1=HITMAX C ORIG=Z6 DO 2300 ITURN=1,2 P='NS' IF ((ITURN.EQ.2).AND.(H1.LE.HITMAX/2)) GOTO 2400 Z7=Z6 C C MOVE SELECTION C IFO=CODEFU(Y+ACRALOC-1500) ILA=CODELA(Y+ACRALOC-1500) C C DOES A NEW CODE NEED TO BE SELECTED? 800:YES, 1600:NO C IF ((IFO.EQ.8).AND.(H1.EQ.HITMAX)) IFO=0 IF (IFO.EQ.8) GOTO 1600 IF (H1.EQ.HITMAX) GOTO 100 IFO=8 ILA=IPORT(Z6) GOTO 1600 100 GOTO (800,200,300,400,500,800,800,800,800,700) IFO GOTO 800 C 200 GOTO 800 C 300 IF (RMAP(ILA).EQ.'X') GOTO 800 IF (IDIST(Z6,ILA).EQ.1) GOTO 800 GOTO 1600 C 400 IF (RLMAP(2600+ILA).EQ.0) GOTO 800 IF (CODEFU(1100+ILA).LT.7) GOTO 800 GOTO 1600 C 500 IF (ILA.NE.Z6) GOTO 1600 DO 600 I1=1,6 DO 600 I2=1,5 IF (TROOPT(I1,I2).NE.ILA) GOTO 600 TROOPT(I1,I2)=0 600 CONTINUE GOTO 800 C 700 IF (EMAP(ILA).NE.' ') GOTO 800 GOTO 1600 C C NEW CODE SELECTION C 5:TARGET C 800 ID=500 DO 900 N=1,6 IF (NSHPRF(NUMSHP,N).EQ.0) GOTO 900 DO 900 N2=1,5 IF (TROOPT(N,N2).EQ.0) GOTO 900 IF (IDIST(Z6,TROOPT(N,N2)).GE.ID) GOTO 900 ID=IDIST(Z6,TROOPT(N,N2)) ILA=TROOPT(N,N2) IFO=5 900 CONTINUE IF (ID.NE.500) GOTO 1600 IF (irand(100).GT.40) GOTO 1200 !** C C 3:CITY TARGET LOC. C IA=irand(20)+1 !** IB=IA+70 DO 1100 IC=IA,IB I=IC IF (I.GT.70) I=IC-70 IF (TARGET(I).EQ.0) GOTO 1100 IF (RMAP(TARGET(I)).NE.'O') GOTO 1100 IF (EDGER(TARGET(I)).EQ.0) GOTO 1100 IFO=3 ILA=TARGET(I) GOTO 1600 1100 CONTINUE C C 4:TT NUMBER ESCORT C 1200 IA=irand(LIMIT(13))+1 !** IB=IA+LIMIT(13) DO 1300 IC=IA,IB I=IC IF (I.GT.LIMIT(13)) I=IC-LIMIT(13) IF (RLMAP(2600+I).EQ.0) GOTO 1300 IF (CODEFU(1100+I).LT.9) GOTO 1300 IFO=4 ILA=I GOTO 1600 1300 CONTINUE C C 10: EXPLORE C 1400 I1=EXPL() IF (I1.EQ.0) GOTO 1500 ILA=I1 IFO=10 GOTO 1600 C C 1: RANDOM DIRECTION C 1500 IF (IFO.EQ.7) GOTO 1600 ILA=irand(8)+1 !** IFO=7 C C MOVE CORRECTION C 1600 IF (IFO.EQ.7) MOOV=ILA FLAG=1 IF ((IFO.EQ.8).OR.(IFO.EQ.3).OR.(IFO.EQ.5)) 1 MOOV=PATH(Z6,ILA,DIR,OKC,FLAG) IF (IFO.EQ.4) MOOV=PATH(Z6,RLMAP(ITT2+ILA),DIR,OKC,FLAG) IF (FLAG.EQ.0) GOTO 1400 IF (IFO.EQ.10) MOOV=PATH(Z6,ILA,DIR,OKC,FLAG) IF (FLAG.EQ.0) GOTO 1500 IF (IFO.NE.2) GOTO 1700 MOOV=0 IF (IDIST(Z6,ILA).GT.4) MOOV=MOV(Z6,ILA) IF (IDIST(Z6,ILA).LT.4) MOOV=ICORR(MOV(Z6,ILA)-4) 1700 AGGR=0 IS1=1 IF (OWN1.EQ.'s') IS1=2 MOOV=MOOV*DIR MOOV=MOVCOR(IFO,ITURN,Z6,MOOV,H1,IS1,AGGR,OWN1,1,DIR,-1,ORIG,HITMAX) IF (IFO.EQ.7) ILA=IABS(MOOV) CODEFU(Y+ACRALOC-1500)=IFO CODELA(Y+ACRALOC-1500)=ILA MOOV=IABS(MOOV) IF (CODER.EQ.NUM) TYPE 998,IFO,ILA 998 FORMAT(I) C C MOVE EVALUATION C Z6=Z6+IARROW(MOOV+1) !** IF (OMAP(Z7).NE.'*') RMAP(Z7)=OMAP(Z7) AD=RMAP(Z6) IF (AD.EQ.'.') GOTO 1900 IF (AD.EQ.'X') GOTO 2000 IF ((AD.GE.'A').AND.(AD.LE.'T')) GOTO 1800 TYPE 997,OWN1,Z6,AD 997 FORMAT(' ENEMY ',A1,' AT ',I4,' RAN AGROUND ON ',A1) GOTO 2100 1800 H2=30 P='SE' OWN2=AD CALL FIND(OWN2,Z6,Z8,H2) CALL FGHT(Z6,H1,H2,OWN1,OWN2) CALL FIND(OWN2,Z6,Z8,H2) IF (H1.LE.0) GOTO 2100 1900 RMAP(Z6)=OWN1 2000 RLMAP(Y+ACRALOC)=Z6 J1TS(Y+ACRAHIT)=H1 IF (ITURN.EQ.1) NUMBER(NUM)=NUMBER(NUM)+1 MONKEY=Y GOTO 2200 2100 RLMAP(Y+ACRALOC)=0 CODEFU(Y+ACRALOC-1500)=0 CODELA(Y+ACRALOC-1500)=0 J1TS(Y+ACRAHIT)=0 2200 CALL SONAR(Z6) IF (P.EQ.'SE') CALL SENSOR(Z6) 2300 CONTINUE 2400 CONTINUE LIMIT(NUM+8)=MONKEY RETURN END FUNCTION EXPL C C THIS SUBROUTINE SEARCHES FOR UNKNOWN TERRITORY AND RETURNS A VALUE C IN EXPL. C IMPLICIT INTEGER(A-Z) PARAMETER IAR=0,IFI=500,IDE=700,ISU=900,ITT=1100, 1 ICR=1200,ICA=1300,IBA=1400 PARAMETER IAR2=1500,IFI2=2000,IDE2=2200,ISU2=2400,ITT2=2600, 1 ICR2=2700,ICA2=2800,IBA2=2900 PARAMETER IDEH=0,ISUH=200,ITTH=400,ICRH=500,ICAH=600,IBAH=700 PARAMETER IDE2H=800,ISU2H=1000,ITT2H=1200,ICR2H=1300, 1 ICA2H=1400,IBA2H=1500 INTEGER G2(100) INTEGER HITS(15),TIPE(15),CRAHIT(15),CRALOC(15) INTEGER INDEX(15) INTEGER CMYTBL(9),KBFUDG(9) INTEGER LOPMAX(15),COMSCN(40) INTEGER NSHPRF(4,6) INTEGER PH(8),OVRPOP(16,2) INTEGER PRIOR(7) INTEGER RANGE(200),AR2S(500) INTEGER ARMTOT(20),CODEFU(1500),CODELA(1500),TARGET(70),LIMIT(16) INTEGER ARROW(9) INTEGER D2(3) INTEGER*2 D(667) INTEGER MYCODE(1500) INTEGER RANG(200) INTEGER IOTAB(16) INTEGER PHAZEE(8) integer ptr BYTE SPECAL,PASS BYTE AB,AC,AD,AO,E,OWN1,OWN2,OWN !AVOID WORD REFERENCES TO THESE BYTE KBTBL(9),AB9(9) BYTE COMM(30),PHAZE(8) BYTE IFILE(11),KILL BYTE COMMAN(20),OKA(5),OKB(5),OKC(5) BYTE TTY(20) BYTE MOVEDFLAG(1500) BYTE J1TS(1600) BYTE EMAP(6000),RMAP(6000),PMAP(6000),OMAP(6000) BYTE PAMELA(8),REEED(9) byte jnkbuf ( 80 ) INTEGER RLMAP(3000) LOGICAL AUTOMV COMMON/AB9/AB9,PRIOR,NSHPRF COMMON/ARMTOT/ARMTOT COMMON/CHRT/COMMAN,COMM,COMSCN,KBTBL COMMON/CHR2/IFILE,KILL,TTY COMMON/CITY/FOUND(70),OWNER(70),PHASE(70) COMMON/CMYTBL/CMYTBL,KBFUDG COMMON/COD/CODER COMMON/CODE/CODEFU,CODELA COMMON/CRAHL/HITS,TIPE,CRAHIT,CRALOC COMMON/FIPATH/FIPATH(70) COMMON/G2/G2 COMMON/IARROW/IARROW(10),ARROW,INDEX,LOPMAX COMMON/IOTAB/IOTAB COMMON/J1TS/J1TS COMMON/KXK/IADJST COMMON/MAP/D COMMON/MAPBLK/EMAP,RMAP,PMAP,RLMAP COMMON/OMAP/OMAP COMMON/MISC1/TARGET,AR2S,RANGE,RANG COMMON/MISC2/LOCI(10,11),NUMBER(18),LIMIT,MDATE,VERSION COMMON/MODE/MODE,JECTOR,ISEC,NEWRND COMMON/MFLAGS/MOVEDFLAG COMMON/MYCOD/D2,MYCODE COMMON/OKS/OKA,OKB,OKC COMMON/OVRPOP/OVRPOP COMMON/P1/PHAZE,PHAZEE,PH COMMON/DAYTIM/PAMELA,REEED COMMON/PASS/PASS,SPECAL,AUTOMV COMMON/SAVBUF/SAVBUF COMMON/SPS/STEP,POSIT,START COMMON/TEST2/SUCCES,FAILUR,FULL COMMON/TROOP/TROOPT(6,5) COMMON/X/X(70) common /jnkbuf/ jnkbuf, ptr C C AGGR: THIS IS A MEASURE OF THE ENEMY SHIPS AGGRESSIVENESS, C THIS VALUE IS ADDED TO THE COST-EFFECTIVENESS OF ATTACKING AN C ENEMY UNIT TO DETERMINE IF THE SHIP WILL ATTACK OR RUN FROM THE C ENEMY. C ALL CITIES ARE REFERENCED BY CITY NUMBER, AS IN X(N)=LOC OF CITY #N C CODFU/CODELA: CONTAINS A NUMBER THAT DETERMINES WHAT THAT COMPUTER CRAFT C IS ASSIGNED TO DO, IS SEPERATED INTO 2 NUMBERS, IFO AND ILA. IFO C GIVES THE FUNCTION, ILA GIVES DETAILS. C CODER: USED FOR DEBUG FLAG C CROWD: USED IF CITY IS SURROUNDED BY ARMIES C D: ORIGINAL MAP, ENCODED IN MOD 3 C EXPLOR: THIS IS SET TO 1 IF THE ENEMY SHIP IS TO EXPLORE UNKNOWN C TERRITORY ADJACENT TO IT, 0 IF NOT. C FIPATH: STASIS # TO BE GIVEN TO FIGHTER IN THAT CITY C FOUND: COMPLETION DATES FOR CITIES C IADJST: SUBTRACTED FROM Z6 SO CURSOR WILL NOT BE MOVED OFF SCREEN C IARROW: ADDED TO Z6 SO MOVES [1,2,3,4,5,6,7,8,9] ARE CONVERTED C TO [+1,-99,-100,-101,ETC.] C ISEC: SECTOR TERMINAL IS SHOWING C IZAP: .TRUE.=SAVE GAME, .FALSE.=INITIALIZE C JECTOR: SECTOR PROGRAM IS LOOKING AT C KURSOR: SET TO POSITION OF CURSOR C MODE: 1=IN MODE 2, 0=IN MODE 1 C OWNER: WHO OWNS THE CITY: 0>NOBODY, 1>PLAYER, 2>COMPUTER C PASS: SET TO .TRUE. IF IT IS A PRIVILEGED USER C PHASE: PHASE OF CITY C X: LOCATIONS OF CITIES C C IF (FULL.EQ.2) GOTO 300 BEGPOS=START GOTO 200 100 IF ((EMAP(POSIT).EQ.' ').AND.(ORDER(POSIT).EQ.0)) GOTO 400 200 POSIT=POSIT+STEP IF (POSIT.LT.5900) GOTO 100 START=START+1 POSIT=START IF (START.EQ.BEGPOS+37) GOTO 300 GOTO 100 300 EXPL=0 FULL=2 C CALL tpos(1,1) C TYPE 999,POSIT,STEP,START,BEGPOS,KNOWN C999 FORMAT('+POSIT,STEP,START,BEGPOS,KNOWN:',5I5$) RETURN 400 EXPL=POSIT RETURN END logical function fatal ( dummy ) c c Ask player if wants to reconsider c implicit integer(a-z) logical fat byte char goto ( 100, 200, 300, 400, 500, 600 ) dummy 100 call topmsg ( 2, 'The troops cannot swim too well, Sir! * Are you sure you want to GOTO sea? ' ) goto 700 200 call topmsg ( 2, 'SIR! Those are OUR men! * Do you really want to attack them? ' ) goto 700 300 call topmsg ( 2, 'That''s NEVER worked before, Sir! * Are sure you want to try? ' ) goto 700 400 call topmsg ( 2, 'Ships need SEA to float, Sir! * Do you really want go on shore? ' ) goto 700 500 call topmsg ( 2, 'That''s OUR city, Sir! * Do you really want to attack the garrison? ' ) goto 700 600 call topmsg ( 2, 'Sorry Sir, there is no room * left on the transport. Do you insist? ' ) 700 continue call flush char = getchx() call topmsg ( 2, 0 ) ! clear the line fat = .false. if (( char .eq. 'Y') .or. ( char .eq. 'y' )) fat = .true. fatal = fat return end subroutine fght(z6,h1,h2,own1,own2) IMPLICIT INTEGER(A-Z) PARAMETER IAR=0,IFI=500,IDE=700,ISU=900,ITT=1100, 1 ICR=1200,ICA=1300,IBA=1400 PARAMETER IAR2=1500,IFI2=2000,IDE2=2200,ISU2=2400,ITT2=2600, 1 ICR2=2700,ICA2=2800,IBA2=2900 PARAMETER IDEH=0,ISUH=200,ITTH=400,ICRH=500,ICAH=600,IBAH=700 PARAMETER IDE2H=800,ISU2H=1000,ITT2H=1200,ICR2H=1300, 1 ICA2H=1400,IBA2H=1500 INTEGER G2(100) INTEGER HITS(15),TIPE(15),CRAHIT(15),CRALOC(15) INTEGER INDEX(15) INTEGER CMYTBL(9),KBFUDG(9) INTEGER LOPMAX(15),COMSCN(40) INTEGER NSHPRF(4,6) INTEGER PH(8),OVRPOP(16,2) INTEGER PRIOR(7) INTEGER RANGE(200),AR2S(500) INTEGER ARMTOT(20),CODEFU(1500),CODELA(1500),TARGET(70),LIMIT(16) INTEGER ARROW(9) INTEGER D2(3) INTEGER*2 D(667) INTEGER MYCODE(1500) INTEGER RANG(200) INTEGER IOTAB(16) INTEGER PHAZEE(8) integer ptr BYTE SPECAL,PASS BYTE AB,AC,AD,AO,E,OWN1,OWN2,OWN !AVOID WORD REFERENCES TO THESE BYTE KBTBL(9),AB9(9) BYTE COMM(30),PHAZE(8) BYTE IFILE(11),KILL BYTE COMMAN(20),OKA(5),OKB(5),OKC(5) BYTE TTY(20) BYTE MOVEDFLAG(1500) BYTE J1TS(1600) BYTE EMAP(6000),RMAP(6000),PMAP(6000),OMAP(6000) BYTE PAMELA(8),REEED(9) byte jnkbuf ( 80 ) INTEGER RLMAP(3000) LOGICAL AUTOMV COMMON/AB9/AB9,PRIOR,NSHPRF COMMON/ARMTOT/ARMTOT COMMON/CHRT/COMMAN,COMM,COMSCN,KBTBL COMMON/CHR2/IFILE,KILL,TTY COMMON/CITY/FOUND(70),OWNER(70),PHASE(70) COMMON/CMYTBL/CMYTBL,KBFUDG COMMON/COD/CODER COMMON/CODE/CODEFU,CODELA COMMON/CRAHL/HITS,TIPE,CRAHIT,CRALOC COMMON/FIPATH/FIPATH(70) COMMON/G2/G2 COMMON/IARROW/IARROW(10),ARROW,INDEX,LOPMAX COMMON/IOTAB/IOTAB COMMON/J1TS/J1TS COMMON/KXK/IADJST COMMON/MAP/D COMMON/MAPBLK/EMAP,RMAP,PMAP,RLMAP COMMON/OMAP/OMAP COMMON/MISC1/TARGET,AR2S,RANGE,RANG COMMON/MISC2/LOCI(10,11),NUMBER(18),LIMIT,MDATE,VERSION COMMON/MODE/MODE,JECTOR,ISEC,NEWRND COMMON/MFLAGS/MOVEDFLAG COMMON/MYCOD/D2,MYCODE COMMON/OKS/OKA,OKB,OKC COMMON/OVRPOP/OVRPOP COMMON/P1/PHAZE,PHAZEE,PH COMMON/DAYTIM/PAMELA,REEED COMMON/PASS/PASS,SPECAL,AUTOMV COMMON/SAVBUF/SAVBUF COMMON/SPS/STEP,POSIT,START COMMON/TEST2/SUCCES,FAILUR,FULL COMMON/TROOP/TROOPT(6,5) COMMON/X/X(70) common /jnkbuf/ jnkbuf, ptr C C AGGR: THIS IS A MEASURE OF THE ENEMY SHIPS AGGRESSIVENESS, C THIS VALUE IS ADDED TO THE COST-EFFECTIVENESS OF ATTACKING AN C ENEMY UNIT TO DETERMINE IF THE SHIP WILL ATTACK OR RUN FROM THE C ENEMY. C ALL CITIES ARE REFERENCED BY CITY NUMBER, AS IN X(N)=LOC OF CITY #N C CODFU/CODELA: CONTAINS A NUMBER THAT DETERMINES WHAT THAT COMPUTER CRAFT C IS ASSIGNED TO DO, IS SEPERATED INTO 2 NUMBERS, IFO AND ILA. IFO C GIVES THE FUNCTION, ILA GIVES DETAILS. C CODER: USED FOR DEBUG FLAG C CROWD: USED IF CITY IS SURROUNDED BY ARMIES C D: ORIGINAL MAP, ENCODED IN MOD 3 C EXPLOR: THIS IS SET TO 1 IF THE ENEMY SHIP IS TO EXPLORE UNKNOWN C TERRITORY ADJACENT TO IT, 0 IF NOT. C FIPATH: STASIS # TO BE GIVEN TO FIGHTER IN THAT CITY C FOUND: COMPLETION DATES FOR CITIES C IADJST: SUBTRACTED FROM Z6 SO CURSOR WILL NOT BE MOVED OFF SCREEN C IARROW: ADDED TO Z6 SO MOVES [1,2,3,4,5,6,7,8,9] ARE CONVERTED C TO [+1,-99,-100,-101,ETC.] C ISEC: SECTOR TERMINAL IS SHOWING C IZAP: .TRUE.=SAVE GAME, .FALSE.=INITIALIZE C JECTOR: SECTOR PROGRAM IS LOOKING AT C KURSOR: SET TO POSITION OF CURSOR C MODE: 1=IN MODE 2, 0=IN MODE 1 C OWNER: WHO OWNS THE CITY: 0>NOBODY, 1>PLAYER, 2>COMPUTER C PASS: SET TO .TRUE. IF IT IS A PRIVILEGED USER C PHASE: PHASE OF CITY C X: LOCATIONS OF CITIES C if ((own2.lt.'A').or.(own2.gt.'T')) goto 100 cc if (mode.eq.1) call TPOS(2,1) ptr = 0 call addidt ( own2, jnkbuf, ptr ) call addstr ( ' is under attack at ', jnkbuf, ptr ) call addint ( z6, jnkbuf, ptr ) jnkbuf ( ptr + 1 ) = 0 call topmsg ( 2, jnkbuf ) call flush 100 continue s1=1 s2=1 if ((own1.eq.'S').or.(own1.eq.'s')) s1=3 if ((own2.eq.'S').or.(own2.eq.'s')) s2=3 ptr = 0 if (h2.eq.0) goto 300 200 if (irand(100).le.50) goto 300 !** h1=h1-s2 h=h2 if (h1.gt.0) goto 200 own=own1 call addidt ( own, jnkbuf, ptr ) own=own2 call addstr ( ' destroyed, ', jnkbuf, ptr ) goto 400 300 h2=h2-s1 h=h1 if (h2.gt.0) goto 200 own=own2 call addidt ( own, jnkbuf, ptr ) own=own1 call addstr ( ' destroyed, ', jnkbuf, ptr ) 400 continue call addidt ( own, jnkbuf, ptr ) call addstr ( ' has ', jnkbuf, ptr ) call addint ( h, jnkbuf, ptr ) call addstr ( ' hit', jnkbuf, ptr ) if ( h .gt. 1 ) call addstr ( 's', jnkbuf, ptr ) call addstr ( ' left', jnkbuf, ptr ) jnkbuf ( ptr + 1 ) = 0 call topmsg ( 3, jnkbuf ) call flush call delay(30) return end subroutine fighmv c c This subroutine handles player's fighter moves c IMPLICIT INTEGER(A-Z) PARAMETER IAR=0,IFI=500,IDE=700,ISU=900,ITT=1100, 1 ICR=1200,ICA=1300,IBA=1400 PARAMETER IAR2=1500,IFI2=2000,IDE2=2200,ISU2=2400,ITT2=2600, 1 ICR2=2700,ICA2=2800,IBA2=2900 PARAMETER IDEH=0,ISUH=200,ITTH=400,ICRH=500,ICAH=600,IBAH=700 PARAMETER IDE2H=800,ISU2H=1000,ITT2H=1200,ICR2H=1300, 1 ICA2H=1400,IBA2H=1500 INTEGER G2(100) INTEGER HITS(15),TIPE(15),CRAHIT(15),CRALOC(15) INTEGER INDEX(15) INTEGER CMYTBL(9),KBFUDG(9) INTEGER LOPMAX(15),COMSCN(40) INTEGER NSHPRF(4,6) INTEGER PH(8),OVRPOP(16,2) INTEGER PRIOR(7) INTEGER RANGE(200),AR2S(500) INTEGER ARMTOT(20),CODEFU(1500),CODELA(1500),TARGET(70),LIMIT(16) INTEGER ARROW(9) INTEGER D2(3) INTEGER*2 D(667) INTEGER MYCODE(1500) INTEGER RANG(200) INTEGER IOTAB(16) INTEGER PHAZEE(8) integer ptr BYTE SPECAL,PASS BYTE AB,AC,AD,AO,E,OWN1,OWN2,OWN !AVOID WORD REFERENCES TO THESE BYTE KBTBL(9),AB9(9) BYTE COMM(30),PHAZE(8) BYTE IFILE(11),KILL BYTE COMMAN(20),OKA(5),OKB(5),OKC(5) BYTE TTY(20) BYTE MOVEDFLAG(1500) BYTE J1TS(1600) BYTE EMAP(6000),RMAP(6000),PMAP(6000),OMAP(6000) BYTE PAMELA(8),REEED(9) byte jnkbuf ( 80 ) INTEGER RLMAP(3000) LOGICAL AUTOMV COMMON/AB9/AB9,PRIOR,NSHPRF COMMON/ARMTOT/ARMTOT COMMON/CHRT/COMMAN,COMM,COMSCN,KBTBL COMMON/CHR2/IFILE,KILL,TTY COMMON/CITY/FOUND(70),OWNER(70),PHASE(70) COMMON/CMYTBL/CMYTBL,KBFUDG COMMON/COD/CODER COMMON/CODE/CODEFU,CODELA COMMON/CRAHL/HITS,TIPE,CRAHIT,CRALOC COMMON/FIPATH/FIPATH(70) COMMON/G2/G2 COMMON/IARROW/IARROW(10),ARROW,INDEX,LOPMAX COMMON/IOTAB/IOTAB COMMON/J1TS/J1TS COMMON/KXK/IADJST COMMON/MAP/D COMMON/MAPBLK/EMAP,RMAP,PMAP,RLMAP COMMON/OMAP/OMAP COMMON/MISC1/TARGET,AR2S,RANGE,RANG COMMON/MISC2/LOCI(10,11),NUMBER(18),LIMIT,MDATE,VERSION COMMON/MODE/MODE,JECTOR,ISEC,NEWRND COMMON/MFLAGS/MOVEDFLAG COMMON/MYCOD/D2,MYCODE COMMON/OKS/OKA,OKB,OKC COMMON/OVRPOP/OVRPOP COMMON/P1/PHAZE,PHAZEE,PH COMMON/DAYTIM/PAMELA,REEED COMMON/PASS/PASS,SPECAL,AUTOMV COMMON/SAVBUF/SAVBUF COMMON/SPS/STEP,POSIT,START COMMON/TEST2/SUCCES,FAILUR,FULL COMMON/TROOP/TROOPT(6,5) COMMON/X/X(70) common /jnkbuf/ jnkbuf, ptr C C AGGR: THIS IS A MEASURE OF THE ENEMY SHIPS AGGRESSIVENESS, C THIS VALUE IS ADDED TO THE COST-EFFECTIVENESS OF ATTACKING AN C ENEMY UNIT TO DETERMINE IF THE SHIP WILL ATTACK OR RUN FROM THE C ENEMY. C ALL CITIES ARE REFERENCED BY CITY NUMBER, AS IN X(N)=LOC OF CITY #N C CODFU/CODELA: CONTAINS A NUMBER THAT DETERMINES WHAT THAT COMPUTER CRAFT C IS ASSIGNED TO DO, IS SEPERATED INTO 2 NUMBERS, IFO AND ILA. IFO C GIVES THE FUNCTION, ILA GIVES DETAILS. C CODER: USED FOR DEBUG FLAG C CROWD: USED IF CITY IS SURROUNDED BY ARMIES C D: ORIGINAL MAP, ENCODED IN MOD 3 C EXPLOR: THIS IS SET TO 1 IF THE ENEMY SHIP IS TO EXPLORE UNKNOWN C TERRITORY ADJACENT TO IT, 0 IF NOT. C FIPATH: STASIS # TO BE GIVEN TO FIGHTER IN THAT CITY C FOUND: COMPLETION DATES FOR CITIES C IADJST: SUBTRACTED FROM Z6 SO CURSOR WILL NOT BE MOVED OFF SCREEN C IARROW: ADDED TO Z6 SO MOVES [1,2,3,4,5,6,7,8,9] ARE CONVERTED C TO [+1,-99,-100,-101,ETC.] C ISEC: SECTOR TERMINAL IS SHOWING C IZAP: .TRUE.=SAVE GAME, .FALSE.=INITIALIZE C JECTOR: SECTOR PROGRAM IS LOOKING AT C KURSOR: SET TO POSITION OF CURSOR C MODE: 1=IN MODE 2, 0=IN MODE 1 C OWNER: WHO OWNS THE CITY: 0>NOBODY, 1>PLAYER, 2>COMPUTER C PASS: SET TO .TRUE. IF IT IS A PRIVILEGED USER C PHASE: PHASE OF CITY C X: LOCATIONS OF CITIES C logical fatal do 2100 y = 1, limit ( 2 ) loc = 500 + y if (movedflag(loc).ne.0) goto 2100 z6=rlmap(loc) if (z6.eq.0) goto 2100 if ((mode.eq.1).and.(poschk(z6,'F').eq.0)) goto 2100 movedflag(loc)=1 z3=min(range(y),4) if (z3.eq.0) z3=4 do 1900 iturn=1,z3 loc=500+y z6=rlmap(loc) if (z6.eq.0) goto 2100 ab=rmap(z6) c c Now check to see if fighter is in a city, if it is change the c stasis number of the fighter to that specified by fipath(i) c if ( ab .ne. 'O' ) goto 300 ! if fighter not in city do 100 i = 1, 70 100 if ( x ( i ) .eq. z6 ) goto 200 ! find city at z6 200 mycode(loc)=fipath(i) ! change statis of fighter c c Check for fighters destroyed along with carrier or city c 300 if ((ab.eq.'C').or.(ab.eq.'F').or.(ab.eq.'O')) goto 400 ptr = 0 call addstr ( 'Fighter # ', jnkbuf, ptr ) call addint ( y, jnkbuf, ptr ) call addstr ( ' destroyed', jnkbuf, ptr ) jnkbuf ( ptr + 1 ) = 0 call topmsg ( 3, jnkbuf ) call flush call delay(30) goto 1700 400 z7 = z6 call stasis ( z6, loc ) 500 if ( range ( y ) .ne. 0 ) goto 600 ! check for fuel call head ( 'F', y, loc, z6, 1 ) call topmsg ( 3, 'Ran out of fuel and crashed' ) call flush call delay(30) if (( ab .ne. 'C').and.(omap(z6).ne.'*')) rmap(z6)=omap(z6) goto 1700 600 mycod=mycode(loc) ! get my function code if (mycod.eq.0) goto 1100 ! none, skip ahead if ((mycod.lt.101).or.(mycod.gt.6108)) goto 1300 if (mycod.le.6000) goto 700 if (mycod.gt.6100) goto 800 goto 1300 700 z6=z6+iarrow(mov(z6,mycod)+1) ! destination function if ((range(y).eq.10).and.(idist(z6,mycod).le.10)) goto 902 goto 900 800 z6=z6+iarrow(mycod-6100+1) !directional functions 900 if (range(y).eq.10) goto 1000 902 if (order(z6).ne.0) goto 1000 ad=rmap(z6) !check new location if ((ad.eq.'C').or.(ad.eq.'O')) goto 1300 if ((ad.eq.'+').or.(ad.eq.'.')) goto 1300 1000 z6=z7 1100 call sector(pmap(1)) call ltr(z6,iturn) 1200 call mve('F',mdate,y,loc,1,z6,z7,disas,z6-iadjst) if (disas.eq.-2) goto 500 c c Move evaluation c 1300 ac=rmap(z6) ao=omap(z6) if (z6.eq.mycode(loc)) mycode(loc)=0 ! arrived at destination if ((ac.ne.'O').and.(ac.ne.'C')) range(y)=range(y)-1 if (z7.eq.z6) goto 2000 !didnt go anywhere, end move if ((ab.ne.'C').and.(omap(z7).ne.'*')) rmap(z7)=omap(z7) ! change prev loc if (ao.eq.'*') goto 1400 ! check on cities if (ac.eq.'C') goto 1500 ! landing on a carrier if ((ac .ne. '.') .and. (ac .ne. '+')) goto 1800 ! attack any other units rmap ( z6 ) = 'F' ! normal move rlmap ( loc ) = z6 goto 1900 1400 if (ac.ne.'O') goto 1600 ! is it my city? 1500 continue ! landed in a city or carrier if (mycode(loc) .ne. 0) goto 1313 call topmsg ( 3, 'Landing confirmed' ) call flush call delay(30) 1313 continue mycode ( loc ) = 0 ! zero my function rlmap(loc)=z6 range(y)=20 goto 2000 1600 if (.not.fatal(3)) goto 2200 ! ask about flying over enemy city call topmsg ( 3, 'Fighter shot down' ) call flush call delay(30) 1700 rlmap ( loc ) = 0 goto 2000 c c Attacking a unit c 1800 if ((ac .lt. 'A') .or. (ac .gt. 'T')) goto 1314 if (.not.fatal(2)) goto 2200 1314 continue h1=1 own1='F' 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 1700 rmap(z6)='F' rlmap(loc)=z6 if ((own2.ge.'a').and.(own2.le.'t')) call sonar(z6) 1900 call sensor(z6) ! bottom of per turn loop 2000 call sensor(z6) ! bottom of per unit loop 2100 continue return c c Recover from fatal move c 2200 z6 = z7 ! go back to old location rmap(z6) = ab ! restore map to previous range(y) = range(y)+1 ! get your fuel back goto 1200 end SUBROUTINE FIGHTR C C THIS SUBROUTINE HANDLES ENEMY FIGHTER MOVES C IMPLICIT INTEGER(A-Z) PARAMETER IAR=0,IFI=500,IDE=700,ISU=900,ITT=1100, 1 ICR=1200,ICA=1300,IBA=1400 PARAMETER IAR2=1500,IFI2=2000,IDE2=2200,ISU2=2400,ITT2=2600, 1 ICR2=2700,ICA2=2800,IBA2=2900 PARAMETER IDEH=0,ISUH=200,ITTH=400,ICRH=500,ICAH=600,IBAH=700 PARAMETER IDE2H=800,ISU2H=1000,ITT2H=1200,ICR2H=1300, 1 ICA2H=1400,IBA2H=1500 INTEGER G2(100) INTEGER HITS(15),TIPE(15),CRAHIT(15),CRALOC(15) INTEGER INDEX(15) INTEGER CMYTBL(9),KBFUDG(9) INTEGER LOPMAX(15),COMSCN(40) INTEGER NSHPRF(4,6) INTEGER PH(8),OVRPOP(16,2) INTEGER PRIOR(7) INTEGER RANGE(200),AR2S(500) INTEGER ARMTOT(20),CODEFU(1500),CODELA(1500),TARGET(70),LIMIT(16) INTEGER ARROW(9) INTEGER D2(3) INTEGER*2 D(667) INTEGER MYCODE(1500) INTEGER RANG(200) INTEGER IOTAB(16) INTEGER PHAZEE(8) integer ptr BYTE SPECAL,PASS BYTE AB,AC,AD,AO,E,OWN1,OWN2,OWN !AVOID WORD REFERENCES TO THESE BYTE KBTBL(9),AB9(9) BYTE COMM(30),PHAZE(8) BYTE IFILE(11),KILL BYTE COMMAN(20),OKA(5),OKB(5),OKC(5) BYTE TTY(20) BYTE MOVEDFLAG(1500) BYTE J1TS(1600) BYTE EMAP(6000),RMAP(6000),PMAP(6000),OMAP(6000) BYTE PAMELA(8),REEED(9) byte jnkbuf ( 80 ) INTEGER RLMAP(3000) LOGICAL AUTOMV COMMON/AB9/AB9,PRIOR,NSHPRF COMMON/ARMTOT/ARMTOT COMMON/CHRT/COMMAN,COMM,COMSCN,KBTBL COMMON/CHR2/IFILE,KILL,TTY COMMON/CITY/FOUND(70),OWNER(70),PHASE(70) COMMON/CMYTBL/CMYTBL,KBFUDG COMMON/COD/CODER COMMON/CODE/CODEFU,CODELA COMMON/CRAHL/HITS,TIPE,CRAHIT,CRALOC COMMON/FIPATH/FIPATH(70) COMMON/G2/G2 COMMON/IARROW/IARROW(10),ARROW,INDEX,LOPMAX COMMON/IOTAB/IOTAB COMMON/J1TS/J1TS COMMON/KXK/IADJST COMMON/MAP/D COMMON/MAPBLK/EMAP,RMAP,PMAP,RLMAP COMMON/OMAP/OMAP COMMON/MISC1/TARGET,AR2S,RANGE,RANG COMMON/MISC2/LOCI(10,11),NUMBER(18),LIMIT,MDATE,VERSION COMMON/MODE/MODE,JECTOR,ISEC,NEWRND COMMON/MFLAGS/MOVEDFLAG COMMON/MYCOD/D2,MYCODE COMMON/OKS/OKA,OKB,OKC COMMON/OVRPOP/OVRPOP COMMON/P1/PHAZE,PHAZEE,PH COMMON/DAYTIM/PAMELA,REEED COMMON/PASS/PASS,SPECAL,AUTOMV COMMON/SAVBUF/SAVBUF COMMON/SPS/STEP,POSIT,START COMMON/TEST2/SUCCES,FAILUR,FULL COMMON/TROOP/TROOPT(6,5) COMMON/X/X(70) common /jnkbuf/ jnkbuf, ptr C C AGGR: THIS IS A MEASURE OF THE ENEMY SHIPS AGGRESSIVENESS, C THIS VALUE IS ADDED TO THE COST-EFFECTIVENESS OF ATTACKING AN C ENEMY UNIT TO DETERMINE IF THE SHIP WILL ATTACK OR RUN FROM THE C ENEMY. C ALL CITIES ARE REFERENCED BY CITY NUMBER, AS IN X(N)=LOC OF CITY #N C CODFU/CODELA: CONTAINS A NUMBER THAT DETERMINES WHAT THAT COMPUTER CRAFT C IS ASSIGNED TO DO, IS SEPERATED INTO 2 NUMBERS, IFO AND ILA. IFO C GIVES THE FUNCTION, ILA GIVES DETAILS. C CODER: USED FOR DEBUG FLAG C CROWD: USED IF CITY IS SURROUNDED BY ARMIES C D: ORIGINAL MAP, ENCODED IN MOD 3 C EXPLOR: THIS IS SET TO 1 IF THE ENEMY SHIP IS TO EXPLORE UNKNOWN C TERRITORY ADJACENT TO IT, 0 IF NOT. C FIPATH: STASIS # TO BE GIVEN TO FIGHTER IN THAT CITY C FOUND: COMPLETION DATES FOR CITIES C IADJST: SUBTRACTED FROM Z6 SO CURSOR WILL NOT BE MOVED OFF SCREEN C IARROW: ADDED TO Z6 SO MOVES [1,2,3,4,5,6,7,8,9] ARE CONVERTED C TO [+1,-99,-100,-101,ETC.] C ISEC: SECTOR TERMINAL IS SHOWING C IZAP: .TRUE.=SAVE GAME, .FALSE.=INITIALIZE C JECTOR: SECTOR PROGRAM IS LOOKING AT C KURSOR: SET TO POSITION OF CURSOR C MODE: 1=IN MODE 2, 0=IN MODE 1 C OWNER: WHO OWNS THE CITY: 0>NOBODY, 1>PLAYER, 2>COMPUTER C PASS: SET TO .TRUE. IF IT IS A PRIVILEGED USER C PHASE: PHASE OF CITY C X: LOCATIONS OF CITIES C C C IFO=7: CITY LOCATION C IFO=6: CARRIER NUMBER C IFO=5: TARGET LOCATION C IFO=4: TARGET LOCATION, KAMIKAZE MISSION C IFO=3: DIRECTIONAL C IFO=2: DIRECTIONAL, KAMIKAZE MISSION C MONKEY=0 NUMBER(2)=0 IF (CODER.EQ.2) TYPE 999 999 FORMAT(' FIGHTER CODES') DO 3600 Y=1,LIMIT(10) DO 3500 I1=1,4 Z6=RLMAP(2000+Y) IF (Z6.EQ.0) GOTO 3600 C DIR=MOD(Y,2)*2-1 !UNUSED MONKEY=Y STOPF=1 P=0 Z7=Z6 AB=RMAP(Z6) DO 100 IA=1,6 DO 100 IB=1,5 100 IF (TROOPT(IA,IB).EQ.Z6) TROOPT(IA,IB)=0 IF ((AB.NE.'f').AND.(AB.NE.'X').AND.(AB.NE.'c')) GOTO 3400 IF ((AB.EQ.'X').OR.(AB.EQ.'c')) RANG(Y)=20 IF (RANG(Y).NE.0) GOTO 200 RMAP(Z6)=OMAP(Z6) GOTO 3400 C C MOVE SELECTION C 200 IF (CODELA(Y+IFI2-1500).EQ.Z6) GOTO 1100 IFO=CODEFU(Y+IFI2-1500) ILA=CODELA(Y+IFI2-1500) C C DOES A NEW CODE NEED TO BE SELECTED? 1100:YES, 2600:NO C GOTO (1100,300,600,700,800,900,1000) IFO GOTO 1100 C 300 IF (irand(100).LT.5) ILA=ICORR(ILA+1) !** IF (RANG(Y).GT.10) GOTO 2600 DO 400 I=1,70 IF (X(I).EQ.0.OR.OWNER(I).NE.2) GOTO 400 IF (IDIST(Z6,X(I)).GT.RANG(Y)) GOTO 400 IFO=7 ILA=X(I) GOTO 2600 400 CONTINUE C 600 IF (irand(100).LT.10) ILA=ICORR(ILA+1) !** IF (RANG(Y).LE.11) GOTO 1100 GOTO 2600 C 700 IF (ILA.EQ.Z6) GOTO 1100 GOTO 2600 C 800 IF ((ILA.EQ.Z6).OR.(RANG(Y).LE.11)) GOTO 1100 GOTO 2600 C 900 IF (Z6.EQ.RLMAP(ILA+2800)) GOTO 1100 !IF LANDED IF (RLMAP(ILA+2800).EQ.0) GOTO 1100 !IF CARRIER DOESN'T EXIST IF (IDIST(Z6,RLMAP(ILA+2800)).GT.RANG(Y)) GOTO 1100 !IF OUT OF RANG GOTO 2600 C 1000 IF (Z6.EQ.ILA) GOTO 1100 !IF LANDED IF (IDIST(Z6,ILA).GT.RANG(Y)) GOTO 1100 !IF OUT OF RANG GOTO 2600 C C NEW CODE SELECTION C 1200 FUEL=RANG(Y) !NO CHOICE BUT BE KAMIKAZE GOTO 1400 !START LOOKING FOR ENEMY TROOP TRANS. 1100 IF (AB.EQ.'f') GOTO 2100 !IF FIGHTER IS AIRBORNE ID=0 1300 FUEL=RANG(Y)/2 !DO THIS SO CRAFT CAN RETURN TO REFUEL IF (irand(100).LT.5) FUEL=RANG(Y) !** 1 IN 20 IS KAMIKAZE 1400 ISHIPT=3 !ENEMY TROOP TRANSPORTS C C LOOK FOR ENEMY TROOP TRANSPORTS, THEN SUBMARINES C 1500 DO 1600 I=1,5 IF (TROOPT(ISHIPT,I).EQ.0) GOTO 1600 IF (IDIST(Z6,TROOPT(ISHIPT,I)).GT.FUEL) GOTO 1600 !OUT OF RANG IFO=5 IF (FUEL.EQ.RANG(Y)) IFO=4 ILA=TROOPT(ISHIPT,I) GOTO 2600 !PROCEED TO MOVE CORRECTION 1600 CONTINUE IF (ISHIPT.EQ.2) GOTO 1700 !IF ALREADY LOOKED FOR SUBS ISHIPT=2 GOTO 1500 !NOW LOOK FOR SUBS 1700 IF (ID.EQ.1000) GOTO 1900 !IF NO REFUELING SPOT WITHIN RANG IF (irand(100).LT.33) GOTO 1900 !** LOOK FOR ENEMY CONCENTRATIONS IF (irand(100).LT.50) GOTO 2100 !** MOVE TOWARDS CITY OR CARRIER C C MOVE IN A RANDOM DIRECTION C 1800 IFO=3 ILA=irand(8)+1 IF (irand(100).LT.5) IFO=2 !** ONE OUT OF 20 WILL BE KAMIKAZE IF (NUMBER(2).LE.2) IFO=3 GOTO 2600 !PROCEED TO MOVE CORRECTION C C MOVE TOWARD AN ENEMY CONCENTRATION WITHIN RANG C 1900 DO 2000 I=1,10 DO 2000 J=2,11 IF (LOCI(I,J).EQ.0) GOTO 2000 IF (IDIST(Z6,LOCI(I,J)).GT.FUEL) GOTO 2000 !IF OUT OF RANG IFO=5 IF (FUEL.EQ.RANG(Y)) IFO=4 !KAMIKAZE ILA=LOCI(I,J) GOTO 2600 !PROCEED TO MOVE CORRECTION 2000 CONTINUE IF (ID.EQ.1000) GOTO 1800 !IF NO CITY OR CARRIER IS WITHIN RANG C C NOW MOVE TOWARDS A CITY CLOSEST TO ENEMY CONCENTRATION C 2100 IA=MOD(Y,10)+1 DO 2200 IB=IA,IA+9 I=IB IF (I.GT.10) I=I-10 IF (LOCI(I,2).EQ.0) GOTO 2200 LOC=LOCI(I,2) ID=IDIST(Z6,LOCI(I,2)) GOTO 2300 2200 CONTINUE LOC=EXPL() 2300 ID=1000 IGARBG=irand(70+LIMIT(15))+1 !** DO 2500 ILOOP=IGARBG,IGARBG+70+LIMIT(15) IA=ILOOP IF (IA.GT.70+LIMIT(15)) IA=IA-70-LIMIT(15) IF (IA.GT.70) GOTO 2400 IF (OWNER(IA).NE.2) GOTO 2500 IF (IDIST(Z6,X(IA)).GT.RANG(Y)) GOTO 2500 IF (IDIST(X(IA),LOC).GE.ID) GOTO 2500 IFO=7 ILA=X(IA) ID=IDIST(X(IA),LOC) GOTO 2500 2400 IB=IA-70 IF (RLMAP(2800+IB).EQ.0) GOTO 2500 IF (IDIST(Z6,RLMAP(2800+IB)).GT.RANG(Y)) GOTO 2500 IF (IDIST(RLMAP(2800+IB),LOC).GE.ID) GOTO 2500 IF ((RANG(Y).EQ.20).AND.(IDIST(Z6,RLMAP(2800+IB)).GT.12) 1 .AND.(CODEFU(1300+IB).NE.9)) GOTO 2500 IFO=6 ILA=IB ID=IDIST(RLMAP(2800+IB),LOC) 2500 CONTINUE IF (ID.EQ.1000) GOTO 1200 GOTO 2600 C C MOVE CORRECTION C 2600 IZOT=0 MOOV=0 IF (ILA.GT.100) IZOT=MOV(Z6,ILA) IF (ILA.LT.10) IZOT=ILA IF (IFO.EQ.6) IZOT=MOV(Z6,RLMAP(2800+ILA)) IF ((IFO.LT.4).AND.(irand(100).LT.5)) IZOT=ICORR(IZOT+1) !** DO 2700 I=1,8 AC=RMAP(Z6+IARROW(I+1)) !** IF ((AC.NE.'D').AND.(AC.NE.'S').AND.(AC.NE.'T') 1 .AND.(AC.NE.'F').AND.(AC.NE.'A')) GOTO 2700 MOOV=I GOTO 3100 2700 CONTINUE C C LOOK FOR TERRITORY TO EXPLOR IN FRONT C IF (RANG(Y).LE.10) GOTO 2900 !IF LOW ON FUEL IZOT2=IZOT !STORE IZOT A MOMENT Z62=Z6+IARROW(ICORR(IZOT2+1)+1) !** IF (ORDER(Z62).NE.0) GOTO 2800 !IF ON THE EDGE OF THE MAP IF (EMAP(Z62).EQ.' ') IZOT=ICORR(IZOT2+1) !IF Z62 IS UNEXPLORED 2800 Z62=Z6+IARROW(ICORR(IZOT2-1)+1) !**TRY OTHER SIDE IF (ORDER(Z62).NE.0) GOTO 2900 !IF ON THE EDGE OF THE MAP IF (EMAP(Z62).EQ.' ') IZOT=ICORR(IZOT2-1) !IF Z62 IS UNEXPLORED C 2900 DESTIN=ILA IF (IFO.EQ.6) DESTIN=RLMAP(2800+ILA) ID=IZOT DO 3000 I=0,7 IZOT=ICORR(ID+I) NEWLOC=Z6+IARROW(IZOT+1) !** IF (IFO.GT.3) THEN IF (IDIST(Z6,DESTIN).LE.IDIST(NEWLOC,DESTIN)) GOTO 3000 ENDIF AC=RMAP(NEWLOC) IF ((((AC.GE.'A').AND.(AC.LE.'T')).OR. 1 (AC.EQ.'X').OR.(AC.EQ.'.').OR. 1 (AC.EQ.'c').OR.(AC.EQ.'+')).AND.(ORDER(NEWLOC).EQ.0)) 1 GOTO 3100 3000 CONTINUE IZOT=0 3100 CODEFU(IFI2-1500+Y)=IFO CODELA(IFI2-1500+Y)=ILA IF (IFO.LT.4) CODELA(IFI2-1500+Y)=IZOT IF (CODER.EQ.2) TYPE 998,IFO,CODELA(IFI2-1500+Y) 998 FORMAT(I) IF (MOOV.NE.0) IZOT=MOOV Z6=Z6+IARROW(IZOT+1) !** C C MOVE EVALUATION C IF (AB.EQ.'f') RMAP(Z7)=OMAP(Z7) AB=RMAP(Z6) IF ((AB.EQ.'.').OR.(AB.EQ.'+')) GOTO 3200 IF ((AB.EQ.'X').OR.(AB.EQ.'c')) GOTO 3300 IF (OMAP(Z6).EQ.'*') GOTO 3400 H2=30 P=1 H1=1 OWN1='f' OWN2=AB CALL FIND(OWN2,Z6,Z8,H2) CALL FGHT(Z6,H1,H2,OWN1,OWN2) CALL FIND(OWN2,Z6,Z8,H2) IF (H1.LE.0) GOTO 3400 3200 RMAP(Z6)='f' STOPF=0 3300 RANG(Y)=RANG(Y)-1 IF (I1.EQ.1) NUMBER(2)=NUMBER(2)+1 RLMAP(2000+Y)=Z6 CALL SONAR(Z6) IF (P.EQ.1) CALL SENSOR(Z6) IF (STOPF.EQ.1) GOTO 3600 3500 CONTINUE GOTO 3600 3400 RLMAP(2000+Y)=0 CALL SONAR(Z6) IF (P.EQ.1) CALL SENSOR(Z6) 3600 CONTINUE RETURN END subroutine find(own, z6, z8, h2) c c Cross-reference subroutine, it finds data on whatever c craft is at point z6. c IMPLICIT INTEGER(A-Z) PARAMETER IAR=0,IFI=500,IDE=700,ISU=900,ITT=1100, 1 ICR=1200,ICA=1300,IBA=1400 PARAMETER IAR2=1500,IFI2=2000,IDE2=2200,ISU2=2400,ITT2=2600, 1 ICR2=2700,ICA2=2800,IBA2=2900 PARAMETER IDEH=0,ISUH=200,ITTH=400,ICRH=500,ICAH=600,IBAH=700 PARAMETER IDE2H=800,ISU2H=1000,ITT2H=1200,ICR2H=1300, 1 ICA2H=1400,IBA2H=1500 INTEGER G2(100) INTEGER HITS(15),TIPE(15),CRAHIT(15),CRALOC(15) INTEGER INDEX(15) INTEGER CMYTBL(9),KBFUDG(9) INTEGER LOPMAX(15),COMSCN(40) INTEGER NSHPRF(4,6) INTEGER PH(8),OVRPOP(16,2) INTEGER PRIOR(7) INTEGER RANGE(200),AR2S(500) INTEGER ARMTOT(20),CODEFU(1500),CODELA(1500),TARGET(70),LIMIT(16) INTEGER ARROW(9) INTEGER D2(3) INTEGER*2 D(667) INTEGER MYCODE(1500) INTEGER RANG(200) INTEGER IOTAB(16) INTEGER PHAZEE(8) integer ptr BYTE SPECAL,PASS BYTE AB,AC,AD,AO,E,OWN1,OWN2,OWN !AVOID WORD REFERENCES TO THESE BYTE KBTBL(9),AB9(9) BYTE COMM(30),PHAZE(8) BYTE IFILE(11),KILL BYTE COMMAN(20),OKA(5),OKB(5),OKC(5) BYTE TTY(20) BYTE MOVEDFLAG(1500) BYTE J1TS(1600) BYTE EMAP(6000),RMAP(6000),PMAP(6000),OMAP(6000) BYTE PAMELA(8),REEED(9) byte jnkbuf ( 80 ) INTEGER RLMAP(3000) LOGICAL AUTOMV COMMON/AB9/AB9,PRIOR,NSHPRF COMMON/ARMTOT/ARMTOT COMMON/CHRT/COMMAN,COMM,COMSCN,KBTBL COMMON/CHR2/IFILE,KILL,TTY COMMON/CITY/FOUND(70),OWNER(70),PHASE(70) COMMON/CMYTBL/CMYTBL,KBFUDG COMMON/COD/CODER COMMON/CODE/CODEFU,CODELA COMMON/CRAHL/HITS,TIPE,CRAHIT,CRALOC COMMON/FIPATH/FIPATH(70) COMMON/G2/G2 COMMON/IARROW/IARROW(10),ARROW,INDEX,LOPMAX COMMON/IOTAB/IOTAB COMMON/J1TS/J1TS COMMON/KXK/IADJST COMMON/MAP/D COMMON/MAPBLK/EMAP,RMAP,PMAP,RLMAP COMMON/OMAP/OMAP COMMON/MISC1/TARGET,AR2S,RANGE,RANG COMMON/MISC2/LOCI(10,11),NUMBER(18),LIMIT,MDATE,VERSION COMMON/MODE/MODE,JECTOR,ISEC,NEWRND COMMON/MFLAGS/MOVEDFLAG COMMON/MYCOD/D2,MYCODE COMMON/OKS/OKA,OKB,OKC COMMON/OVRPOP/OVRPOP COMMON/P1/PHAZE,PHAZEE,PH COMMON/DAYTIM/PAMELA,REEED COMMON/PASS/PASS,SPECAL,AUTOMV COMMON/SAVBUF/SAVBUF COMMON/SPS/STEP,POSIT,START COMMON/TEST2/SUCCES,FAILUR,FULL COMMON/TROOP/TROOPT(6,5) COMMON/X/X(70) common /jnkbuf/ jnkbuf, ptr C C AGGR: THIS IS A MEASURE OF THE ENEMY SHIPS AGGRESSIVENESS, C THIS VALUE IS ADDED TO THE COST-EFFECTIVENESS OF ATTACKING AN C ENEMY UNIT TO DETERMINE IF THE SHIP WILL ATTACK OR RUN FROM THE C ENEMY. C ALL CITIES ARE REFERENCED BY CITY NUMBER, AS IN X(N)=LOC OF CITY #N C CODFU/CODELA: CONTAINS A NUMBER THAT DETERMINES WHAT THAT COMPUTER CRAFT C IS ASSIGNED TO DO, IS SEPERATED INTO 2 NUMBERS, IFO AND ILA. IFO C GIVES THE FUNCTION, ILA GIVES DETAILS. C CODER: USED FOR DEBUG FLAG C CROWD: USED IF CITY IS SURROUNDED BY ARMIES C D: ORIGINAL MAP, ENCODED IN MOD 3 C EXPLOR: THIS IS SET TO 1 IF THE ENEMY SHIP IS TO EXPLORE UNKNOWN C TERRITORY ADJACENT TO IT, 0 IF NOT. C FIPATH: STASIS # TO BE GIVEN TO FIGHTER IN THAT CITY C FOUND: COMPLETION DATES FOR CITIES C IADJST: SUBTRACTED FROM Z6 SO CURSOR WILL NOT BE MOVED OFF SCREEN C IARROW: ADDED TO Z6 SO MOVES [1,2,3,4,5,6,7,8,9] ARE CONVERTED C TO [+1,-99,-100,-101,ETC.] C ISEC: SECTOR TERMINAL IS SHOWING C IZAP: .TRUE.=SAVE GAME, .FALSE.=INITIALIZE C JECTOR: SECTOR PROGRAM IS LOOKING AT C KURSOR: SET TO POSITION OF CURSOR C MODE: 1=IN MODE 2, 0=IN MODE 1 C OWNER: WHO OWNS THE CITY: 0>NOBODY, 1>PLAYER, 2>COMPUTER C PASS: SET TO .TRUE. IF IT IS A PRIVILEGED USER C PHASE: PHASE OF CITY C X: LOCATIONS OF CITIES C if (h2 .gt. 0) goto 1100 c c Now we must destroy own c first of all, update troopt c ishp = 0 if (own .eq. 'D') ishp = 1 if (own .eq. 'S') ishp = 2 if (own .eq. 'T') ishp = 3 if (own .eq. 'R') ishp = 4 if (own .eq. 'C') ishp = 5 if (own .eq. 'B') ishp = 6 if (ishp .eq. 0) goto 200 do 100 z = 1, 5 100 if (troopt(ishp, z) .eq. z6) troopt(ishp, z) = 0 c c Now destroy the craft, set rlmap(n)=0 c 200 if (own .ne. 'C') goto 400 do 300 z = 1, 200 if (rlmap(500 + z) .ne. z6) goto 300 rlmap(500 + z) = 0 if (mode .eq. 1) call tpos(2, 60) type 999, z 999 format('+Fighter #'I3' sunk'$) 300 continue 400 if (own .ne. 'T') goto 600 do 500 z = 1, 500 if (rlmap(z) .ne. z6) goto 500 rlmap(z) = 0 if (mode .eq. 1) call tpos(2, 60) type 998, z 998 format('+Army #'I3' sunk'$) 500 continue 600 if (own .ne. 't') goto 800 do 700 z = 1501, 2000 700 if (rlmap(z) .eq. z6) rlmap(z) = 0 800 if (own .ne. 'c') goto 1000 do 900 z = 2001, 2200 900 if (rlmap(z) .eq. z6) rlmap(z) = 0 1000 rlmap(z8) = 0 if ((own .ge. 'a') .and. (own .le. 't')) call sonar(z6) if ((own .ge. 'A') .and. (own .le. 'T')) call sensor(z6) return 1100 if (h2 .eq. 30) goto 1200 if ((own .eq. 'A') .or. (own .eq. 'F') .or. (own .eq. 'a') .or. $ (own .eq. 'f')) return if ((own .ge. 'A') .and. (own .le. 'T')) j1ts(z8 - 700) = h2 if ((own .ge. 'a') .and. (own .le. 't')) j1ts(z8 - 1400) = h2 return 1200 h2 = 0 ia = 1 if (own .eq. 'T') ia = 1101 if (own .eq. 'O') ia = 1101 ! special hack for docking if (own .eq. 'C') ia = 1301 if (own .eq. 'a') ia = 1501 if (own .eq. 'f') ia = 2001 if (own .eq. 't') ia = 2601 if (own .eq. 'c') ia = 2801 do 1300 z8 = ia, 3000 if (rlmap(z8) .eq. z6) goto 1400 1300 continue pause ' Error in subroutine find, "CONTINUE" to continue' 997 format(' ERROR IN SUB. FIND') return 1400 if ((own .eq. 'A') .or. (own .eq. 'F') .or. (own .eq. 'a') .or. $ (own .eq. 'f')) h2 = 1 if (h2 .eq. 1) return if ((own .ge. 'A') .and. (own .le. 'T')) h2 = j1ts(z8 - 700) if ((own .ge. 'a') .and. (own .le. 't')) h2 = j1ts(z8 - 1400) return end subroutine game ( icode, num ) c c This subroutine reads in the game map and initializes the c map arrays it also saves and restores the game from the c save file using the codes: -1 = restore, 0 = init, 1 = save c IMPLICIT INTEGER(A-Z) PARAMETER IAR=0,IFI=500,IDE=700,ISU=900,ITT=1100, 1 ICR=1200,ICA=1300,IBA=1400 PARAMETER IAR2=1500,IFI2=2000,IDE2=2200,ISU2=2400,ITT2=2600, 1 ICR2=2700,ICA2=2800,IBA2=2900 PARAMETER IDEH=0,ISUH=200,ITTH=400,ICRH=500,ICAH=600,IBAH=700 PARAMETER IDE2H=800,ISU2H=1000,ITT2H=1200,ICR2H=1300, 1 ICA2H=1400,IBA2H=1500 INTEGER G2(100) INTEGER HITS(15),TIPE(15),CRAHIT(15),CRALOC(15) INTEGER INDEX(15) INTEGER CMYTBL(9),KBFUDG(9) INTEGER LOPMAX(15),COMSCN(40) INTEGER NSHPRF(4,6) INTEGER PH(8),OVRPOP(16,2) INTEGER PRIOR(7) INTEGER RANGE(200),AR2S(500) INTEGER ARMTOT(20),CODEFU(1500),CODELA(1500),TARGET(70),LIMIT(16) INTEGER ARROW(9) INTEGER D2(3) INTEGER*2 D(667) INTEGER MYCODE(1500) INTEGER RANG(200) INTEGER IOTAB(16) INTEGER PHAZEE(8) integer ptr BYTE SPECAL,PASS BYTE AB,AC,AD,AO,E,OWN1,OWN2,OWN !AVOID WORD REFERENCES TO THESE BYTE KBTBL(9),AB9(9) BYTE COMM(30),PHAZE(8) BYTE IFILE(11),KILL BYTE COMMAN(20),OKA(5),OKB(5),OKC(5) BYTE TTY(20) BYTE MOVEDFLAG(1500) BYTE J1TS(1600) BYTE EMAP(6000),RMAP(6000),PMAP(6000),OMAP(6000) BYTE PAMELA(8),REEED(9) byte jnkbuf ( 80 ) INTEGER RLMAP(3000) LOGICAL AUTOMV COMMON/AB9/AB9,PRIOR,NSHPRF COMMON/ARMTOT/ARMTOT COMMON/CHRT/COMMAN,COMM,COMSCN,KBTBL COMMON/CHR2/IFILE,KILL,TTY COMMON/CITY/FOUND(70),OWNER(70),PHASE(70) COMMON/CMYTBL/CMYTBL,KBFUDG COMMON/COD/CODER COMMON/CODE/CODEFU,CODELA COMMON/CRAHL/HITS,TIPE,CRAHIT,CRALOC COMMON/FIPATH/FIPATH(70) COMMON/G2/G2 COMMON/IARROW/IARROW(10),ARROW,INDEX,LOPMAX COMMON/IOTAB/IOTAB COMMON/J1TS/J1TS COMMON/KXK/IADJST COMMON/MAP/D COMMON/MAPBLK/EMAP,RMAP,PMAP,RLMAP COMMON/OMAP/OMAP COMMON/MISC1/TARGET,AR2S,RANGE,RANG COMMON/MISC2/LOCI(10,11),NUMBER(18),LIMIT,MDATE,VERSION COMMON/MODE/MODE,JECTOR,ISEC,NEWRND COMMON/MFLAGS/MOVEDFLAG COMMON/MYCOD/D2,MYCODE COMMON/OKS/OKA,OKB,OKC COMMON/OVRPOP/OVRPOP COMMON/P1/PHAZE,PHAZEE,PH COMMON/DAYTIM/PAMELA,REEED COMMON/PASS/PASS,SPECAL,AUTOMV COMMON/SAVBUF/SAVBUF COMMON/SPS/STEP,POSIT,START COMMON/TEST2/SUCCES,FAILUR,FULL COMMON/TROOP/TROOPT(6,5) COMMON/X/X(70) common /jnkbuf/ jnkbuf, ptr C C AGGR: THIS IS A MEASURE OF THE ENEMY SHIPS AGGRESSIVENESS, C THIS VALUE IS ADDED TO THE COST-EFFECTIVENESS OF ATTACKING AN C ENEMY UNIT TO DETERMINE IF THE SHIP WILL ATTACK OR RUN FROM THE C ENEMY. C ALL CITIES ARE REFERENCED BY CITY NUMBER, AS IN X(N)=LOC OF CITY #N C CODFU/CODELA: CONTAINS A NUMBER THAT DETERMINES WHAT THAT COMPUTER CRAFT C IS ASSIGNED TO DO, IS SEPERATED INTO 2 NUMBERS, IFO AND ILA. IFO C GIVES THE FUNCTION, ILA GIVES DETAILS. C CODER: USED FOR DEBUG FLAG C CROWD: USED IF CITY IS SURROUNDED BY ARMIES C D: ORIGINAL MAP, ENCODED IN MOD 3 C EXPLOR: THIS IS SET TO 1 IF THE ENEMY SHIP IS TO EXPLORE UNKNOWN C TERRITORY ADJACENT TO IT, 0 IF NOT. C FIPATH: STASIS # TO BE GIVEN TO FIGHTER IN THAT CITY C FOUND: COMPLETION DATES FOR CITIES C IADJST: SUBTRACTED FROM Z6 SO CURSOR WILL NOT BE MOVED OFF SCREEN C IARROW: ADDED TO Z6 SO MOVES [1,2,3,4,5,6,7,8,9] ARE CONVERTED C TO [+1,-99,-100,-101,ETC.] C ISEC: SECTOR TERMINAL IS SHOWING C IZAP: .TRUE.=SAVE GAME, .FALSE.=INITIALIZE C JECTOR: SECTOR PROGRAM IS LOOKING AT C KURSOR: SET TO POSITION OF CURSOR C MODE: 1=IN MODE 2, 0=IN MODE 1 C OWNER: WHO OWNS THE CITY: 0>NOBODY, 1>PLAYER, 2>COMPUTER C PASS: SET TO .TRUE. IF IT IS A PRIVILEGED USER C PHASE: PHASE OF CITY C X: LOCATIONS OF CITIES C common / cities / cities ( 128 ) data ifile /'G','A','M','E','S',':','E','M','R','A',0/ if ( icode ) 1800, 100, 1500 ! -1/0/+1 = restore/init/save c c Here to initialize the game c 100 do 200 i = 1, 70 ! clear arrays x ( i ) = 0 found ( i ) = 0 owner ( i ) = 0 phase ( i ) = 0 target ( i ) = 0 fipath ( i ) = 0 200 continue do 300 i=1,1500 codefu ( i ) = 0 codela ( i ) = 0 mycode ( i ) = 0 300 continue do 400 i = 1, 200 range ( i ) = 0 rang ( i ) = 0 400 continue do 500 i = 1, 500 500 ar2s ( i ) = 0 do 600 i = 1, 3000 rlmap ( i ) = 0 600 continue do 700 i = 1, 6000 emap ( i ) = ' ' pmap ( i ) = ' ' 700 continue mode = 1 isec = -1 call time ( pamela ) call date ( reeed ) reeed ( 5 ) = reeed ( 5 ) + "40 ! make lower case reeed ( 6 ) = reeed ( 6 ) + "40 version = 6 ! version of data within emsave.dat ib=1 c c Map selection. Pick one of the maps randomly. Maps are in files a-f c try = 0 ! try again 900 try = try + 1 ifile ( 10 ) = 'a' ifile ( 10 ) = ifile ( 10 ) + irand ( 10 ) ! currently six maps, allow 4 extra if ( try .le. 8 ) goto 1000 ! try again if you don't have them all call cr call strout ( 'Generating new map...') call flush call gen try = 0 goto 1100 1000 open ( unit=1, name=ifile, access = 'SEQUENTIAL', * form = 'UNFORMATTED', type = 'OLD', readonly, err=900 ) read ( 1 ) ( d ( I ), i = 1, 223 ) read ( 1 ) ( d ( I ), i = 224, 446 ) read ( 1 ) ( d ( I ), i = 447, 667 ) close ( unit = 1 ) c c City and a-map initialization c 1100 call initia ( try ) ! transfer map from d() into mapbuf 1200 c = irand ( 70 ) + 1 ! ** pick our city id = irand ( 70 ) + 1 ! pick enemy city if (x(c) .eq. 0 .or. x(id) .eq. 0) goto 1200 if (x(c) .eq. x(id)) goto 1200 if ((edger(x(c)) .eq. 8) .or. (edger(x(id)) .eq. 8)) goto 1200 if ( try .ne. 0 ) goto 1300 1250 pcon = cities(rmap(x(id))) econ = cities(rmap(x(c))) if (pcon.le.100) goto 1200 ! note rmap is really owner if (econ.le.100) goto 1200 ! from map generator ptot=pcon/100+mod(pcon,100) etot=econ/100+mod(econ,100) if (ptot.le.etot) goto 1275 i = c c = id id = i goto 1250 1275 diff=min(11,((etot*2*100+45)/ptot)/100)-1 if ( pcon .eq. econ ) diff = 3 call cr ptr = 0 call addstr ( 'Difficulty estimate: ', jnkbuf, ptr ) call addint ( diff, jnkbuf, ptr ) call addstr ( ' where 1 is easy and 10 is most challenging.', * jnkbuf, ptr ) jnkbuf ( ptr + 1 ) = 0 call cr call strout ( jnkbuf ) 1300 z6 = x ( id ) ptr = 0 call addstr ( 'Your city is at ', jnkbuf, ptr ) call addint ( x ( id ), jnkbuf, ptr ) jnkbuf ( ptr + 1 ) = 0 call cr call cr call strout ( jnkbuf ) call cr do 1400 i=1,6000 1400 rmap ( i ) = omap ( i ) rmap(z6) = 'O' ! mark it on map rmap(x(c)) = 'X' call sonar(x(c)) ! do sensor scans call sensor(z6) mode = 0 call ltr ( z6, 0 ) ! show the city mode=1 call strout ( 'What do you demand that this city produce? ' ) call flush owner(id)=1 mdate = 0 call phasin(id,e) call putc ( e ) call flush owner ( c ) = 2 phase ( c ) = 1 found ( c ) = 5 z6 = x ( id ) return ! return to orders mode c c Here to save a game c 1500 if (mode .ne. 0) goto 1600 call cr call strout ( 'A few moments please...' ) call cr call flush 1600 continue call time ( pamela ) call date ( reeed ) reeed ( 5 ) = reeed ( 5 ) + "40 ! make lower case reeed ( 6 ) = reeed ( 6 ) + "40 open ( unit=1, name='EMSAVE', access='SEQUENTIAL', * form='UNFORMATTED', status='UNKNOWN' ) write ( 1 ) limit, mdate, version, pamela, reeed write ( 1 ) emap, rmap, pmap, omap write ( 1 ) rlmap write ( 1 ) troopt write ( 1 ) number write ( 1 ) x, target, found write ( 1 ) owner, phase do 1700 i = 1, 16 1700 call write ( iotab ( I ), limit ( I ), i ) write ( 1 ) j1ts write ( 1 ) num write ( 1 ) loci write ( 1 ) nshift, fipath close ( unit=1 ) return c c Here to restore a game c 1800 continue call cr call strout ( 'A few moments please...' ) call flush open ( unit=1, name='EMSAVE', access='SEQUENTIAL', * form='UNFORMATTED', status='OLD',err=2200) read(1) limit,mdate,version,pamela,reeed read(1) emap,rmap,pmap,omap if(version.ge.6) goto 1850 version=6 ! translate to new version do 1850 i=1,6000 if((emap ( I ).ge.'1').and.(emap ( I ).le.'8')) call tran(emap ( I )) if((rmap ( I ).ge.'1').and.(rmap ( I ).le.'8')) call tran(rmap ( I )) if((pmap ( I ).ge.'1').and.(pmap ( I ).le.'8')) call tran(pmap ( I )) 1850 continue read(1) rlmap read(1) troopt read(1) number read(1) x,target,found read(1) owner,phase do 1900 i=1,16 1900 call read ( iotab ( i ), limit ( i ), i ) if (version.le.4) read(1) (j1ts ( I ),i=1,1500) if (version.ge.5) read(1) j1ts read(1) num read(1) loci read(1) nshift,fipath 2000 close(unit=1) ptr = 59 encode ( ptr, 996, jnkbuf ) pamela, reeed 996 FORMAT('Ready to resume game terminated at ', 8A1, * ' on ', 7a1, '19', 2a1 ) call cr call bufout ( jnkbuf, ptr ) mode=1 isec=-1 return 2200 continue call cr call strout ( 'Unable to open save file, EMSAVE.DAT, * Starting new game.' ) call flush goto 100 end C C RANDOM MAP GENERATION SUBROUTINES C SUBROUTINE GEN IMPLICIT INTEGER(A-Z) PARAMETER WIDTH=100,HEIGHT=60 BYTE MAP(WIDTH,HEIGHT) BYTE SUBMAP(39,39) BYTE OWNER(WIDTH,HEIGHT) INTEGER SIZES(128) COMMON/CITIES/CITIES(128) COMMON/SMAP/SUBMAP BYTE EMAP(6000),RMAP(6000),PMAP(6000),OMAP(6000) INTEGER RLMAP(3000) COMMON/MAPBLK/EMAP,RMAP,PMAP,RLMAP COMMON/OMAP/OMAP EQUIVALENCE (MAP(1,1),OMAP(1)),(OWNER(1,1),RMAP(1)) 100 DO 200 I=1,WIDTH DO 200 J=1,HEIGHT 200 MAP(I,J)='.' HSECTS=3+irand(4) VSECTS=3+irand(3) HSPACE=WIDTH/HSECTS VSPACE=HEIGHT/VSECTS DO 400 I=1,HSECTS DO 400 J=1,VSECTS DO 400 K=1,irand(2)+irand(3) CALL MAKELAND YPOS=(J-1)*VSPACE+irand(VSPACE) XPOS=(I-1)*HSPACE+irand(HSPACE) DO 300 L=1,39 DO 300 M=1,39 IF (SUBMAP(L,M).EQ.' ') GOTO 300 IF (((XPOS+L-20).LE.0).OR.((XPOS+L-20).GT.100)) GOTO 300 IF (((YPOS+M-20).LE.0).OR.((YPOS+M-20).GT.60)) GOTO 300 MAP(XPOS+L-20,YPOS+M-20)=SUBMAP(L,M) 300 CONTINUE 400 CONTINUE COUNT=0 DO 500 I=1,100 DO 500 J=1,60 IF (MAP(I,J).EQ.'.') COUNT=COUNT+1 500 CONTINUE IF (COUNT.LT.4000.AND.COUNT.GT.2500) GOTO 600 C TYPE 999,COUNT C WRITE (1,999) COUNT C999 FORMAT(' FAILED SEA CHECK, COUNT=',I5) GOTO 100 C600 TYPE 998,COUNT C WRITE (1,998) COUNT C998 FORMAT(' COUNT=',I5) 600 DO 800 I=1,100 DO 800 J=1,60 OWNER(I,J)=0 800 CONTINUE LAREA=1 WAREA=33 DO 1000 I=2,99 DO 1000 J=2,59 IF (OWNER(I,J).NE.0) GOTO 1000 IF (MAP(I,J).EQ.'.') THEN IF (SET(I,J,WAREA,'.',12000).EQ.0) GOTO 100 WAREA=WAREA+1