edjames@ic.Berkeley.EDU (Ed James) (12/21/86)
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 ibefor = -100 do 100 i = 1, 9 i1 = z6 + arrow ( i ) ab = rmap ( i1 ) if ( ab .eq. pmap ( i1 )) goto 100 pmap ( i1 ) = ab if ( jector .eq. -1 ) goto 100 if ( isec .eq. -1 ) goto 100 line = kline ( ki, isec ) iy = ( i1 - 1 ) / 100 * 100 ix = i1 - iy if (( iy .lt. line ) .or. ( iy .gt. line + 1900 ) .or. * ( ix .le. ki ) .or. (ix .gt. ki + 70 )) goto 100 i1 = i1 - line - ki if ( ibefor + 1 .ne. i1 ) call cursor ( i1 + 300 ) ibefor = i1 call putc ( ab ) 100 continue call flush return end FUNCTION SET(XPOS,YPOS,AREA,LS,LIMIT) IMPLICIT INTEGER(A-Z) PARAMETER WIDTH=100,HEIGHT=60 BYTE MAP(WIDTH,HEIGHT) BYTE OWNER(WIDTH,HEIGHT) BYTE XSTACK(12000) BYTE YSTACK(12000) BYTE CSTACK(12000) BYTE LS INTEGER XADDS(8),YADDS(8) DATA XADDS/-1,0,1,-1,1,-1,0,1/ DATA YADDS/-1,-1,-1,0,0,1,1,1/ 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)) OWNER(XPOS,YPOS)=AREA LEVEL=1 X=XPOS Y=YPOS 100 K=1 200 IF ((X+XADDS(K).LT.2).OR.(X+XADDS(K).GT.99)) GOTO 300 IF ((Y+YADDS(K).LT.2).OR.(Y+YADDS(K).GT.59)) GOTO 300 IF (MAP(X+XADDS(K),Y+YADDS(K)).NE.LS) GOTO 300 IF (OWNER(X+XADDS(K),Y+YADDS(K)).NE.0) GOTO 300 OWNER(X+XADDS(K),Y+YADDS(K))=AREA XSTACK(LEVEL)=X YSTACK(LEVEL)=Y CSTACK(LEVEL)=K LEVEL=LEVEL+1 IF (LEVEL.GT.LIMIT) THEN SET=0 RETURN ENDIF X=X+XADDS(K) Y=Y+YADDS(K) GOTO 100 300 K=K+1 IF (K.LE.8) GOTO 200 LEVEL=LEVEL-1 IF (LEVEL.EQ.0) THEN SET=1 RETURN ENDIF X=XSTACK(LEVEL) Y=YSTACK(LEVEL) K=CSTACK(LEVEL) GOTO 300 END ccc shipmv - this subroutine handles player's ship moves subroutine shipmv ( acraloc, acrahit, num, own1, hitmax ) c c synopsis 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 do 2600 y=1,limit(num) loc=acraloc+y if (movedflag(loc).ne.0) goto 2600 z6=rlmap(loc) if (z6.eq.0) goto 2600 if ((mode.eq.1).and.(poschk(z6,own1).eq.0)) goto 2600 movedflag(loc)=1 do 2500 iturn=1,2 loc=acraloc+y z6=rlmap(loc) if (z6.eq.0) goto 2600 jit=acrahit+y h1=j1ts(jit) if ((iturn.eq.2).and.(h1.le.hitmax/2)) goto 2600 z7=z6 ab=rmap(z6) c c Check to see if ship was destroyed becuase the city c it was in was captured c if ((ab.eq.own1).or.(ab.eq.'O')) goto 100 call head ( own1, y, loc, z6, h1 ) call topmsg ( 2, 'was destroyed' ) call flush call delay(30) goto 1500 100 if ((iturn.eq.1).and.(ab.eq.'O')) h1=h1+1 ! repair if in port if (h1.gt.hitmax) h1=hitmax call stasis(z6,loc) 200 mycod=mycode(loc) ! get my function code if (mycod.eq.0) goto 900 ! if zero, skip ahead if ((mycod.ne.9997).or.((own1.ne.'T').and.(own1.ne.'C'))) 1 goto 500 ! check transports and carriers n = 0 ! for overloading nt = 2 ia = 1 ib=limit(1) if (own1.ne.'C') goto 300 nt=1 ia=501 ib=limit(2)+500 300 do 400 j=ia,ib 400 if (rlmap(j).eq.z6) n=n+1 if (n.lt.nt*h1) goto 500 mycode(loc)=0 goto 900 500 if ((mycod.lt.101).or.(mycod.gt.6108)) goto 1100 if (mycod.le.6000) goto 600 if (mycod.gt.6100) goto 700 goto 1100 600 z6=z6+iarrow(mov(z6,mycod)+1) !destination move goto 800 700 z6=z6+iarrow(mycod-6100+1) !directional move 800 ad=rmap(z6) if (((ad.eq.'.').or.(ad.eq.'O')).and.(order(z6).eq.0)) goto 1100 z6=z7 900 call sector(pmap(1)) 1000 call ltr(z6,iturn) call mve ( own1, mdate, y, loc, jit, z6, z7, disas, z6-iadjst ) if (disas.eq.-2) goto 200 c c Move evaluation. z6 = to, z7 = from, check out new location c 1100 if (omap(z7).ne.'*') rmap(z7)=omap(z7) ! remove unit from map ac = rmap ( z6 ) ao = omap ( z6 ) if (z6.eq.mycode(loc)) mycode(loc)=0 ! arrived at destination if ( ac .ne. 'O' ) goto 1200 ! is it our city? call topmsg ( 3, 'Ship is docked' ) ! ship is in city call flush call delay(30) goto 1800 1200 if ( ao .eq. '.' ) goto 1600 ! if sea, skip ahead 1300 if (.not. fatal(4)) goto 2700 if ((ac.ne.'+').and.(ao.ne.'*')) goto 2400 !check for enemy to fight 1400 continue ptr = 0 call addidt ( own1, jnkbuf, ptr ) call addstr( ' broke up on the shore', jnkbuf, ptr ) jnkbuf ( ptr + 1 ) = 0 call topmsg ( 2, jnkbuf ) call flush call delay(30) goto 1500 1600 if (ac.ne.'.') goto 2400 rmap(z6)=own1 ! normal move 1800 rlmap(loc)=z6 j1ts(jit)=h1 1900 if ((own1.ne.'T').and.(own1.ne.'C')) goto 2500 n=0 ! if we're carring something, bring it along ia=0 ! set up for transport ib=limit(1) nt=2 if (own1.ne.'C') goto 2000 ia=500 ! set up for carrier ib=limit(2) nt=1 2000 do 2300 i=ia+1,ia+ib ! find pieces and move them if (rlmap(i).ne.z7) goto 2300 if (n+1.gt.nt*h1) goto 2050 rlmap(i)=z6 n=n+1 goto 2300 2050 if (rmap(z7).eq.'O') goto 2300 rlmap(i)=0 c c Tell about peices lost when ship went down c ptr = 0 if (own1.eq.'C') goto 2100 call addstr ( 'Army # ', jnkbuf, ptr ) goto 2200 2100 continue call addstr ( 'Fighter # ', jnkbuf, ptr ) 2200 continue call addint ( i - ia, jnkbuf, ptr ) call addstr ( ' was sunk', jnkbuf, ptr ) jnkbuf ( ptr + 1 ) = 0 call topmsg ( 2, jnkbuf ) call flush call delay(30) 2300 continue goto 2500 2400 if ((ac.ge.'A').and.(ac.le.'T')) then if (.not.fatal(2)) goto 2700 endif h2=30 ! going to fight another unit own2=ac call find(own2,z6,z8,h2) call fght(z6,h1,h2,own1,own2) call find(own2,z6,z8,h2) if (h1.le.0) goto 1500 rmap(z6)=own1 ! put us on the map if ((own2.ge.'a').and.(own2.le.'t')) call sonar(z6) if (ao.eq.'.') goto 1800 rmap(z6)=ao ! won the battle, but... if ((own2.ge.'a').and.(own2.le.'t')) call sonar(z6) call topmsg ( 2, 'Your ship successfully clears the * enemy from the beach before, CRUNCH!, grounding itself' ) call flush call delay(30) 1500 rlmap(loc)=0 ! kill my unit mycode(loc)=0 call sensor(z6) h1=0 goto 1900 2500 call sensor(z6) 2600 continue return c c Recover from fatal moves c 2700 z6=z7 ! restore old location rmap(z6)=ab ! restore map goto 900 ! try again end SUBROUTINE SONAR(Z6) C C UPDATES COMPUTER'S MAP AROUND LOCATION 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 C DO 1300 I=1,8 LOCUS=Z6+IARROW(I+1) !** AB=RMAP(LOCUS) IF (AB.NE.EMAP(LOCUS)) EMAP(LOCUS)=AB IF ((AB.NE.'*').AND.(AB.NE.'O')) GOTO 400 DO 100 I1=1,70 100 IF (TARGET(I1).EQ.LOCUS) GOTO 1300 DO 200 I1=1,70 200 IF (TARGET(I1).EQ.0) GOTO 300 300 TARGET(I1)=LOCUS 400 IF ((AB.LT.'A').OR.(AB.GT.'T')) GOTO 1300 IF (AB.NE.'A'.AND.AB.NE.'O') GOTO 1100 C C WE MUST NOW FIGURE OUT IF THE ARMY IS A THREAT TO ANY OF THE COMPUTER'S C CITIES, I.E. IF IT IS ON THE CONTINENT WITH ANY OF THEM. IF SO, PUT C THE ARMY IN THE LOCI ARRAY. THE FIRST INDEX IS THE CONTINENT, THE C SECOND IS THE NTH ARMY DISCOVERED ON THAT CONTINENT - 1. THE (N,1) C ARGUMENT IS THE DATE OF THE LAST ARMY DISCOVERED ON THE C NTH CONTINENT. THUS WE HAVE A MEANS OF DETERMINING THE AGE OF THE DATA C ARMDEF=0 DO 480 Y=1,LIMIT(9) IF (RLMAP(IAR2+Y).EQ.0) GOTO 480 IF (IDIST(LOCUS,RLMAP(IAR2+Y)).GT.14) GOTO 480 MOVE=PATH(RLMAP(IAR2+Y),LOCUS,1,OKA,FLAG) IF (FLAG.NE.0) ARMDEF=ARMDEF+1 480 CONTINUE IF (ARMDEF.GE.7) GOTO 520 DO 500 K=1,70 IF ((OWNER(K).NE.2).OR.(PHASE(K).EQ.1)) GOTO 500 IF (FOUND(K)-MDATE-5.LE.0) GOTO 500 IF (IDIST(X(K),LOCUS).GT.18) GOTO 500 MOVE=PATH(X(K),LOCUS,1,OKA,FLAG) IF (FLAG.NE.0) PHASE(K)=-1 500 CONTINUE C 520 IF (AB.EQ.'O') GOTO 1300 DO 600 K=1,10 IF (LOCI(K,2).EQ.0) GOTO 600 DO 550 J=2,11 IF (LOCI(K,J).EQ.LOCUS) GOTO 800 550 CONTINUE MOVE=PATH(LOCUS,LOCI(K,2),1,OKA,FLAG) J=11 IF (FLAG.NE.0) GOTO 800 600 CONTINUE DO 700 K=1,10 700 IF (LOCI(K,2).EQ.0) GOTO 760 OLDEST=10000 DO 750 J=1,10 IF (LOCI(J,1).LT.OLDEST) THEN OLDEST=LOCI(J,1) K=J ENDIF 750 CONTINUE 760 DO 770 J=2,11 770 LOCI(K,J)=0 GOTO 1000 800 DO 900 J=J,3,-1 900 LOCI(K,J)=LOCI(K,J-1) !SHIFT EVERYTHING UP THE ARRAY 1000 LOCI(K,1)=MDATE LOCI(K,2)=LOCUS GOTO 1300 C 1100 ISHIPT=0 IF (AB.EQ.'D') ISHIPT=1 IF (AB.EQ.'S') ISHIPT=2 IF (AB.EQ.'T') ISHIPT=3 IF (AB.EQ.'R') ISHIPT=4 IF (AB.EQ.'C') ISHIPT=5 IF (AB.EQ.'B') ISHIPT=6 IF (ISHIPT.EQ.0) GOTO 1300 DO 1200 IB=1,4 1200 TROOPT(ISHIPT,IB)=TROOPT(ISHIPT,IB+1) TROOPT(ISHIPT,5)=LOCUS 1300 CONTINUE EMAP(Z6)=RMAP(Z6) IF (CODER.EQ.10) CALL SENSOR(Z6) RETURN END SUBROUTINE STASIS(Z6,LOC) C C CHECK IF ARMY #LOC, AT Z6, IS NEAR THE ENEMY, IF SO WAKE HIM UP 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 DO 200 I=1,8 AB=RMAP(Z6+IARROW(I+1)) !** IF ((AB.GE.'a').AND.(AB.LE.'t')) GOTO 100 IF (AB.EQ.'X') GOTO 100 IF (AB.NE.'*') GOTO 200 IF (RMAP(Z6).EQ.'F') GOTO 200 100 MYCODE(LOC)=0 GOTO 300 200 CONTINUE 300 RETURN END subroutine test4(z6,flag,dir,move1,movnum,beg,end,ag2,flag2) c c Test subroutine for path, displays current path progress 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 INTEGER AG2(100) C CALL CURSOR(Z6-IADJST) IF (FLAG.NE.1001) E=GETCHX() !WAIT FOR CHAR IF TRACE MODE IX='G' !DISPLAY CURRENT MOVE ON MAP IF (FLAG2.EQ.1) TYPE 999,IX IX='H' IF (FLAG2.EQ.2) TYPE 999,IX IF (FLAG.EQ.1001) RETURN C PROCESS THIS CHAR IF (E.EQ.' ') RETURN !SPACE, CONTINUE IF (E.EQ.'G') GOTO 100 !G, DISPLAY G2 ARRAY CALL tpos(1,1) !IF NOT SPACE OR "G", SHOW PATH VARIABLES TYPE 998,Z6,MOVE1,MOVNUM 999 FORMAT('+',A1$) 998 FORMAT(' Z6:',I4,' MOVE1:',I1,' MOVNUM:',I3) CALL tpos(2,1) TYPE 997,BEG,END,IADJST,DIR,FLAG 997 FORMAT(' BEG:'I4' END:'I4' IADJST:'I4' TDIR:'I2' FLAG:'I4) IF (FLAG2 .EQ. 1) TYPE 996 996 FORMAT(' FLAG2: MOVE ') IF (FLAG2 .EQ. 2) TYPE 995 995 FORMAT(' FLAG2: SHORE') RETURN 100 CALL tpos(1,1) TYPE 994,AG2 994 FORMAT(1X,16I5) RETURN END ccc addcnt - add to number of characters on a top line ccc topini - zero top end of line counts ccc topmsg - put a message on a top line subroutine topmsg ( line, string ) integer line byte string ( 80 ) c c synopsis c c call topmsg ( line, string ) c c line - line to put message (1, 2, or 3) c string - zero byte terminated array containing message c parameter topsiz = 3 integer strlen, j integer eolpos ( topsiz ), msglen, i data eolpos / topsiz*0 / if (( line .le. 0 ) .or. ( line .gt. topsiz )) line = 1 msglen = strlen ( string ) call bufpos ( line, 1, string, msglen ) call clreol ( line, msglen + 1, eolpos ( line )) eolpos ( line ) = msglen goto 100 c c Add to end of line count c entry addcnt ( line, i ) if (( line .le. 0 ) .or. ( line .gt. topsiz )) line = 1 eolpos ( line ) = eolpos ( line ) + i goto 100 c c Handle screen clear c entry topini do 100 j = 1, topsiz eolpos ( j ) = 0 100 continue return end ccc tran - translate old enemy units to new characters subroutine tran ( ab ) byte ab c c synopsis c c call tran ( ab ) c c ab - byte to translate c byte olde ( 8 ), newe ( 8 ) data olde / '1', '2', '3', '4', '5', '6', '7', '8' / data newe / 'a', 'f', 'd', 's', 't', 'r', 'c', 'b' / do 10 i = 1, 8 10 if ( ab .eq. olde ( i )) ab = newe ( i ) return end subroutine troopm c c This subroutine handles enemy troop transport 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 integer tttc(-1:20,0:50) monkey = 0 number ( 5 ) = 0 if ( coder .eq. 5 ) type 999 999 format(' Troop transport codes') do 2300 y=1,limit(13) z6=rlmap(itt2+y) if (z6.eq.0) goto 2300 monkey=y dir=mod(y,2)*2-1 ! set dir to 1 or -1 consistently ab=rmap(z6) h1=j1ts(itt2h+y) if (ab.eq.'X') h1=h1+1 if (h1.gt.3) h1=3 c c Now compute the number of armies aboard the troop transport c numarm=0 do 100 i=1,limit(9) 100 if (z6.eq.rlmap(iar2+i)) numarm=numarm+1 if (numarm.gt.6) numarm=6 ! max # armies = 6 orig=z6 do 2200 iturn=1,2 p=0 z7=z6 ab=rmap(z6) if ((iturn.eq.2).and.(h1.le.1)) goto 2300 c c Move selection c ifo=codefu(y+itt2-1500) ila=codela(y+itt2-1500) c c 300 is the statement number where the ifo and ila are c processed to come up with a move, which is then fed thru movcor c to come up with a final move. c c take care of damaged ships or just repaired ships. c (damaged ships will have an ifo of 8) c if (h1.lt.3) goto 200 if (ifo.eq.8) ifo=0 goto 300 200 ifo=8 if (ila.eq.0) goto 250 if (rmap(ila).eq.'X') goto 1300 250 ila=iport(z6) goto 1300 c c ifo=10 move toward unexplored territory, location specified by ila c ifo=7 move in a constant direction specified by ila c ifo=9 move toward an unowned city specified by ila c ifo=0-6 ila specifies location of where to move, either c an army producing city or an army looking for a 't'. c it could also be a direction. ifo is the number of armies on c board the troop transport. c 300 if (ifo.lt.7) ifo=numarm if (numarm.eq.0) ifo=0 if ((ifo.eq.10).and.(emap(ila).ne.' ')) goto 1000 if (ifo.eq.10) goto 1300 if (ifo.eq.7) goto 1350 if (ifo.ne.9) goto 500 c c ifo=9 c do 400 i=1,70 if (target(i).ne.ila) goto 400 move=0 if ((iturn.eq.2).and.(idist(z6,ila).eq.1)) goto 1600 goto 1300 400 continue if ((idist(z6,ila).lt.10).and.(edger(ila).lt.8).and.(irand(100).gt.10)) 1 goto 1300 c c It seems that it's target is no longer on the hit list, c meaning it was captured. c 500 if (ifo.le.2) goto 600 if (ifo.eq.3) then if (irand(100).lt.96) goto 600 endif if (ifo.eq.4) then if (irand(100).lt.90) goto 600 endif goto 800 ! select a target c c Select an army producing city and move towards it. c pick the closest one. c 600 if (ila.eq.0.or.ila.gt.500) goto 650 if ((codefu(ila).eq.3).and.(rlmap(iar2+ila).ne.0)) goto 1200 650 aflag=0 id=35 670 do 700 i=1,70 if ((x(i).eq.0).or.(owner(i).ne.2)) goto 700 if (edger(x(i)).eq.0) goto 700 if ((aflag.eq.0).and.(phase(i).ne.1)) goto 700 if (idist(z6,x(i)).ge.id) goto 700 do 680 j=1,limit(13) if (j.eq.y) goto 680 if (codela(j+itt2-1500).ne.x(i)) goto 680 if (idist(rlmap(j+itt2),x(i)).le.2) goto 700 680 continue id=idist(z6,x(i)) ila=x(i) 700 continue if (id.ne.35) goto 1300 if (aflag.eq.1) goto 1000 aflag=1 goto 670 c c Perform troop transport to target city assignment c 800 if (number(10).eq.0) goto 1000 tm=0 do 820 i=1,limit(13) if (rlmap(itt2+i).eq.0) goto 820 if (i.eq.y) goto 810 if (codefu(itt2-1500+i).eq.8) goto 820 if (codefu(itt2-1500+i).le.3) goto 820 810 tm=tm+1 if (codefu(itt2-1500+i).eq.9) codefu(itt2-1500+i)=0 tttc(tm,0)=i 820 continue cm=0 do 840 i=1,number(10) if (target(i).eq.0) goto 840 ila=target(i) if (edger(ila).eq.0) goto 840 cm=cm+1 tttc(0,cm)=ila tttc(-1,cm)=-1 if (rmap(ila).eq.'O') tttc(-1,cm)=1 840 continue do 850 i=1,tm do 850 j=1,cm tttc(i,j)=idist(rlmap(itt2+tttc(i,0)),tttc(0,j)) 850 continue ac='*' 860 min=1000 do 880 i=1,tm if (tttc(i,0).eq.0) goto 880 do 880 j=1,cm if (emap(tttc(0,j)).ne.ac) goto 880 if (tttc(i,j).ge.min) goto 880 if (tttc(-1,j).eq.0) then do 870 k=1,cm if (tttc(-1,k).eq.-1) goto 880 870 continue endif move=path(rlmap(itt2+tttc(i,0)),tttc(0,j),1,okc,flag) if (flag.eq.0) then tttc(i,j)=1000 goto 880 endif min=tttc(i,j) ir=i ic=j 880 continue if (min.ne.1000) then ! don't change function if dest is <3 from old? codefu(itt2-1500+tttc(ir,0))=9 codela(itt2-1500+tttc(ir,0))=tttc(0,ic) call dist(rlmap(itt2+tttc(ir,0)),tttc(0,ic)) tttc(ir,0)=0 tttc(ir,ic)=1001 tttc(-1,ic)=0 goto 860 endif ifo=codefu(itt2-1500+y) ila=codela(itt2-1500+y) if (number(9)+number(10).le.38) then if (ifo.eq.9) goto 1500 goto 1000 endif if (ac.eq.'*') then ac='o' goto 860 endif if (ifo.eq.9) goto 1500 c c Move towards unknown territory c 1000 ifo=10 ila=expl() if (ila.eq.0) goto 1100 call dist(z6,ila) goto 1300 c c Move in specified direction (ila specifies which) c 1100 ifo=7 ila=irand(8)+1 !** goto 1400 c c Now pick a move according to ifo and ila c 1200 move=0 if (idist(z6,rlmap(iar2+ila)).eq.1) goto 1600 move=mov(z6,rlmap(iar2+ila)) goto 1500 1300 move=path(z6,ila,dir,okc,flag) if (flag.eq.0) goto 1100 goto 1500 1350 if (number(10).eq.0) goto 1400 if (irand(100).lt.40) goto 800 1400 move=ila 1500 aggr=-numarm if ((number(5).gt.10).and.(numarm.eq.0)) aggr=aggr+2 explor=0 if (ifo.gt.6) explor=1 move=move*dir dest=-1 if ((ifo.eq.9).or.(ifo.eq.10)) dest=ila move=movcor(ifo,iturn,z6,move,h1,1,aggr,'t',explor,dir,dest,orig,3) move=iabs(move) if (ifo.eq.7) ila=move 1600 codefu(itt2-1500+y)=ifo codela(itt2-1500+y)=ila z6=z6+iarrow(move+1) !** if (coder.eq.5) type 997, ifo,ila 997 format(1x,i) c if (omap(z7).ne.'*') rmap(z7)=omap(z7) if (rmap(z6).eq.'.') goto 1700 if (rmap(z6).eq.'X') goto 1800 if ((rmap(z6).eq.'+').or.(omap(z6).eq.'*')) goto 1900 ab=rmap(z6) if (coder.eq.5) type 996,ab !fix this conditional, kludged 996 format(' attacking ',a1) if (ab.eq.'.') goto 1700 p=1 h2=30 own1='t' own2=rmap(z6) call find(own2,z6,z8,h2) call fght(z6,h1,h2,own1,own2) call find(own2,z6,z8,h2) if (h1.le.0) goto 1900 if (omap(z6).eq.'+') goto 1900 j1ts(itt2h+y)=h1 1700 rmap(z6)='t' 1800 rlmap(itt2+y)=z6 j1ts(itt2h+y)=h1 if (iturn.eq.1) number(5)=number(5)+1 goto 2000 1900 rlmap(itt2+y)=0 j1ts(itt2h+y)=0 2000 n=0 if (p.eq.1) call sensor(z6) do 2100 u=iar2+1,iar2+limit(9) if (rlmap(u).ne.z7) goto 2100 if (n+1.gt.h1*2) then if (rmap(z7).ne.'X') rlmap(u)=0 goto 2100 endif n=n+1 rlmap(u)=z6 2100 continue if (numarm.gt.2*h1) numarm=2*h1 call sonar(z6) 2200 continue 2300 continue limit(13)=monkey return end subroutine write ( beg, lim, num ) 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 do 100 j = beg + 1, beg + lim k = rlmap ( j ) write ( 1 ) k if ( num .lt. 9 ) write ( 1 ) mycode(j) if ( num .gt. 8 ) write ( 1 ) codefu(j-1500),codela(j-1500) if ( num .eq. 9 ) write ( 1 ) ar2s(j-1500) if ( num .eq. 2 ) write ( 1 ) range(j-500) if ( num .eq. 10 ) write ( 1 ) rang(j-2000) 100 continue return end c c Input-output routines using qio's c Terminal dependent cursor addressing c String manuplitation routines c c Modify routines ttinit, tpos, and clear for your terminal c ccc addint - convert integer to string subroutine addint(num, string, ptr) integer num byte string(80) integer ptr c c synopsis c c call addint(num, string, ptr) c c num - integer to convert to string c string - byte array to put string into c ptr - current length of string c parameter buf_size = 10 integer status, ots$cvt_l_ti, dsc(2) byte junk(buf_size) data dsc /buf_size, 0/ if (num .ne. 0) goto 100 ptr = ptr + 1 string(ptr) = '0' goto 200 100 continue dsc(2) = %loc(junk) status = ots$cvt_l_ti(num, dsc, , %val(4), ) do 200 i = 1, buf_size if (junk(i) .eq. ' ') goto 200 ptr = ptr + 1 string(ptr) = junk(i) 200 continue string(ptr + 1) = 0 return end ccc addrel - convert real to string subroutine addrel(num, width, string, ptr) real num integer width byte string(80) integer ptr c c synopsis c c call addrel(num, width, string, ptr) c c num - integer to convert to string c width - width of digits to right of decimal point c string - byte array to put string into c ptr - current length of string c parameter buf_size = 20 integer status, for$cvt_d_tf, dsc(2) byte junk(buf_size) data dsc /buf_size, 0/ dsc(2) = %loc(junk) status = for$cvt_d_tf(num, dsc, %val(width), , , , ) do 200 i = 1, buf_size if (junk(i) .eq. ' ') goto 200 ptr = ptr + 1 string(ptr) = junk(i) 200 continue if (string(ptr) .eq. '.') ptr = ptr - 1 ! remove trailing dot string(ptr + 1) = 0 return end ccc addstr - copy one string onto another subroutine addstr(one, two, ptr) byte one(80), two(80) integer ptr c c synopsis c c call addstr(one, two, ptr) c c one - string to add c two - string to add onto c ptr - current length of line c integer i i = 1 100 continue if (one(i) .eq. 0) return ptr = ptr + 1 two(ptr) = one(i) i = i + 1 goto 100 end ccc bell - output a bell subroutine bell c c synopsis c c call bell c call bufout(7, 1) return end ccc bufout - output characters subroutine bufout(string, count) byte string(80) integer count c c synopsis c c call bufout(string, count) c c string - byte array of characters c count - number of chararcters to output 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 integer i if ((tt_bufsiz - 1 - tt_nbuf) .le. count) call flush do 100 i = 1, count tt_nbuf = tt_nbuf + 1 tt_buf(tt_nbuf) = string(i) 100 continue if (tt_flag) call flush return end ccc bufpos - position the cursor and output the buffer subroutine bufpos(irow, icol, string, size) integer irow, icol, size byte string(80) c c synopsis c c irow - line to position cursor c icol - column to position cursor c string - byte array containing characters c size - number of characters to output c call tpos(irow, icol) call bufout(string, size) return end ccc clear - clear screen subroutine clear c c synopsis c c call clear 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 admclr, annclr (3), vt52clr (4) byte vt100clr (6), hz15clr(2) data admclr /"32/ data annclr /"14, 0, 0/ data vt52clr /"33, 'H', "33, 'J'/ data vt100clr /"33, '[', 'H', "33, '[', 'J'/ data hz15clr /'~', "34/ if (tt_type .eq. TT_VT52) goto 1000 if (tt_type .eq. TT_ANN) goto 2000 if (tt_type .eq. TT_ADM) goto 3000 if (tt_type .eq. TT_VT100) goto 4000 if (tt_type .eq. TT_HP) goto 1000 if (tt_type .eq. TT_HZ15) goto 6000 c c If we don't know the terminal, do nothing c return c c Handle vt52 and hp2621 c 1000 call bufout(vt52clr, 4) return c c Handle ann arbor c 2000 call bufout(annclr, 3) return c c Handle adm 3a c 3000 call bufout(admclr, 1) return c c Handle vt100 c 4000 call bufout(vt100clr, 6) return c c Handle Hazeltine 1500 c 6000 call bufout(hz15clr, 2) return end ccc cr - output a carrige return and line feed subroutine cr c c synopsis c c call cr c c Null characters are added for some terminals 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 integer i byte string(5) data string /"15, "12, 0, 0, 0/ i = 2 if (tt_type .eq. TT_ANN) i = 5 call bufout(string, i) return end ccc flush - output the output buffer subroutine flush 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 integer status, sys$qiow external SS$_NORMAL, IO$_WRITEVBLK, IO$M_NOFORMAT if (tt_nbuf .le. 0) return status = sys$qiow( , %val(out_chan), * %val(%loc(IO$_WRITEVBLK) .or. %loc(IO$M_NOFORMAT)), * , , , tt_buf, %val(tt_nbuf), , %val(0), , ) tt_nbuf = 0 if (status .eq. %loc(SS$_NORMAL)) return write(6, 10) status 10 format (' Error in flush; status is', z9) return end ccc getc - input a single character subroutine getc(char) byte char c c synopsis c c call getc(char) c c char - character input c integer count call flush call getstr(char, 1, count) return end ccc getcq - input a single character without echo subroutine getcq(char) byte char c c synopsis c c call getcq(char) c c char - character input c integer count call flush call getstrq(char, 1, count) return end ccc getif - read a single character, if one is ready subroutine getif(ch) byte ch c c synopsis c c call getif(ch) c c ch - character c c If a character is available, it is returned. If a character is not, c then -1 is returned. 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 integer ierr, junk, sys$qiow, count integer*2 iosb(4), status byte tc equivalence (status, iosb(1)) equivalence (tc, iosb(3)) external IO$_READVBLK, IO$M_TIMED, IO$M_NOECHO, IO$M_NOFILTR external SS$_CONTROLY, SS$_NORMAL, SS$_TIMEOUT call flush junk = sys$qiow ( , %val (in_chan), %val(%loc(IO$_READVBLK) .or. * %loc(IO$M_TIMED) .or. %loc(IO$M_NOECHO) .or. %loc(IO$M_NOFILTR)), * iosb, , , ch, %val(1), %val(0), , , ) ierr = status if (tc .ne. 0) ch = tc if (ierr .eq. %loc(SS$_NORMAL)) return if (ierr .eq. %loc(SS$_CONTROLY)) return if (ierr .ne. %loc(SS$_TIMEOUT)) goto 900 ch = -1 return 900 write(6, 10) isw 10 format(' Error in getif; status is', z9) return end ccc getstr - read characters from terminal subroutine getstr(buffer, size, count) byte buffer(80) integer size, count c c synopsis c c call getstr(buffer, size, count) c c buffer - buffer to accept input c size - length of this buffer c count - number of characters read 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 integer status, sys$qiow, junk integer*2 iosb(4), ierr byte tc equivalence (ierr, iosb(1)) equivalence (tc, iosb(3)) external SS$_CONTROLY, SS$_NORMAL, IO$_READVBLK call flush junk = sys$qiow( , %val (in_chan), %val(%loc(IO$_READVBLK)), * iosb, , , buffer, %val(size), , , , ) status = ierr count = iosb(2) if (tc .ne. 0) buffer(count + 1) = tc if (count .eq. 0) count = 1 if (status .eq. %loc(SS$_NORMAL)) return if (status .eq. %loc(SS$_CONTROLY)) return 900 write(6, 10) status, junk 10 format(' Error in getstr; status is', 2z9) return end ccc getstrq - read characters from terminal without echo subroutine getstrq(buffer, size, count) byte buffer(80) integer size, count c c synopsis c c call getstrq(buffer, size, count) c c buffer - buffer to accept input c size - length of this buffer c count - number of characters read 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 integer status, sys$qiow, junk integer*2 iosb(4), ierr byte tc equivalence (ierr, iosb(1)) equivalence (tc, iosb(3)) external IO$_READVBLK, IO$M_NOFILTR, IO$M_NOECHO external SS$_CONTROLY, SS$_NORMAL call flush junk = sys$qiow ( , %val (in_chan), %val(%loc(IO$_READVBLK) .or. * %loc(IO$M_NOFILTR) .or. %loc(IO$M_NOECHO)), iosb, * , , buffer, %val(size), , , , ) status = ierr count = iosb(2) if (tc .ne. 0) buffer(count + 1) = tc if (count .eq. 0) count = 1 if (status .eq. %loc(SS$_NORMAL)) return if (status .eq. %loc(SS$_CONTROLY)) return 900 write(6, 10) status 10 format(' Error in getstrq; status is', z9) return end ccc putc - output a single character subroutine putc(char) byte char c c synopsis c c call putc(char) c c char - character to output c call bufout(char, 1) return end ccc strlen - return size of zero byte terminated string integer function strlen(string) byte string(80) c c synopsis c c status = strlen(string) c c status - size of string c string - byte array terminated with a zero byte c integer i i = 0 1000 i = i + 1 if (string(i) .ne. 0) goto 1000 strlen = i - 1 return end ccc strout - output a zero byte terminated string subroutine strout(string) byte string(80) c c synopsis c c call strout(string) c c string - a byte array with a zero byte terminator c integer i, strlen i = strlen(string) call bufout(string, i) return end ccc strpos - position cursor and output string subroutine strpos(irow, icol, string) integer irow, icol byte string(80) c c synopsis c c call strpos(irow, icol, string) c c irow - line to position cursor c icol - column to position cursor c string - a byte array with a zero byte terminator c integer strlen call tpos(irow, icol) call bufout(string, strlen(string)) return end ccc tpos - position cursor subroutine tpos(irow, icol) integer irow, icol c c synopsis c c call tpos(irow, icol) c c irow - line to position cursor c icol - column to position cursor 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 annv(3), admv(4), vt52v(4) byte vt100v(11), vhp(11), hz15v(4) data admv /"33, '=', 0, 0/ data annv /"17, 0, 0/ data vt52v /"33, 'Y', 0, 0/ data vt100v /"33, '[', 9*' '/ data vhp /"33, '&', 9*' '/ data hz15v /'~', "21, 0, 0/ if (tt_type .eq. TT_VT52) goto 1000 if (tt_type .eq. TT_ANN) goto 2000 if (tt_type .eq. TT_ADM) goto 3000 if (tt_type .eq. TT_VT100) goto 4000 if (tt_type .eq. TT_HP) goto 5000 if (tt_type .eq. TT_HZ15) goto 6000 c c Simply return if we don't know the terminal type c return c c Handle vt52 c 1000 vt52v(3) = irow + 31 vt52v(4) = icol + 31 call bufout(vt52v, 4) return c c Handle ann arbor c 2000 annv(2) = icol - 1 + ((icol - 1) / 10 * 6) annv(3) = irow + "77 + ((irow - 1) / 20 * 12) call bufout(annv, 3) return c c Handle adm 3a c 3000 admv(3) = irow + 31 admv(4) = icol + 31 call bufout(admv, 4) return c c Handle vt100 c 4000 i = 2 call addint(irow, vt100v, i) i = i + 1 vt100v(i) = ';' call addint(icol, vt100v, i) i = i + 1 vt100v(i) = 'H' call bufout(vt100v, i) return c c Handle hp2621 c 5000 i = 1 call addint(irow, vhp, i) i = i + 1 vhp(i) = ';' call addint(icol, vhp, i) i = i + 1 vhp(i) = 'a' call bufout(vhp, i) return c c Handle Hazeltine 1500 c 6000 hz15v(3) = icol hz15v(4) = irow call bufout(hz15v, 4) return end ccc ttinit - initiliaze for i/o subroutine ttinit c c synopsis c c call ttinit 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 integer status, in_len, out_len integer sys$assign, sys$trnlog, sys$getchn integer*2 prilen character*63 in_name, out_name character*100 pribuf byte info(8), iosb(8) external SS$_NORMAL, SS$_NOTRAN external TT$_VT52, TT$_VT100, TT$_FT1, TT$_FT2, TT$_FT3, TT$_FT4 c c Figure out values for terminal types c TT_VT52 = %loc(TT$_VT52) TT_VT100 = %loc(TT$_VT100) TT_ANN = %loc(TT$_FT1) TT_HP = %loc(TT$_FT2) TT_ADM = %loc(TT$_FT3) TT_HZ15 = %loc(TT$_FT4) c c Set default to do buffered i/o c tt_flag = .false. c c Translate device names for input and output c cc status = sys$trnlog('SYS$INPUT', in_len, in_name, , , ) cc if (status .eq. %loc(SS$_NOTRAN)) goto 100 cc status = sys$trnlog('SYS$OUTPUT', out_len, out_name, , , ) cc if (status .ne. %loc(SS$_NOTRAN)) goto 200 c c Translation of sys$input or sys$output failed; translate 'TT' instead c 100 continue status = sys$trnlog('TT', in_len, in_name, , , ) out_name = in_name out_len = in_len c c Now assign channels for input and output c 200 continue cc status = sys$assign(in_name(5:in_len), in_chan, , ) cc status = sys$assign(out_name(5:out_len), out_chan, , ) status = sys$assign(in_name, in_chan, , ) status = sys$assign(out_name, out_chan, , ) c c Get terminal characteristics c status = sys$getchn(%val(out_chan), prilen, pribuf, , ) status = ichar(pribuf(6:6)) tt_type = -1 if (status .eq. TT_ADM) tt_type = TT_ADM if (status .eq. TT_ANN) tt_type = TT_ANN if (status .eq. TT_VT52) tt_type = TT_VT52 if (status .eq. TT_VT100) tt_type = TT_VT100 if (status .eq. TT_HZ15) tt_type = TT_HZ15 c c Zero output buffer c tt_nbuf = 0 return end ccc ittype - return terminal type subroutine ittype(term) integer term c c synopsis c c call ittype(term) c c term - integer containing terminal type 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 term = tt_type return end ccc upper - convert string to upper case subroutine tupper(string, leng) byte string(80) integer leng c c synopsis c c call upper(string, leng) c c string - byte array with string c leng - length of the string c integer i do 100 i = 1, leng if ((string(i) .lt. 'a') .or. (string(i) .gt. 'z')) goto 100 string(i) = string(i) - "40 100 continue return end SHAR_EOF if test 290280 -ne "`wc -c < 'empire.for'`" then echo shar: error transmitting "'empire.for'" '(should have been 290280 characters)' fi fi # end of overwriting check if test -f 'getnow.for' then echo shar: will not over-write existing file "'getnow.for'" else cat << \SHAR_EOF > 'getnow.for' subroutine getnow ( now ) implicit none integer now(7) integer i, status, sys$numtim integer*2 vmsnow(7) status = sys$numtim ( vmsnow, ) i = 1 23000 if (.not.(i .le. 6))goto 23002 now(i) = vmsnow(i) 23001 i = i + 1 goto 23000 23002 continue now(7) = vmsnow(7) * 10 return end SHAR_EOF if test 349 -ne "`wc -c < 'getnow.for'`" then echo shar: error transmitting "'getnow.for'" '(should have been 349 characters)' fi fi # end of overwriting check if test -f 'link.com' then echo shar: will not over-write existing file "'link.com'" else cat << \SHAR_EOF > 'link.com' $ del empire.exe;* $ link empire,rndlb,getnow SHAR_EOF if test 46 -ne "`wc -c < 'link.com'`" then echo shar: error transmitting "'link.com'" '(should have been 46 characters)' fi fi # end of overwriting check if test -f 'rndlb.for' then echo shar: will not over-write existing file "'rndlb.for'" else cat << \SHAR_EOF > 'rndlb.for' subroutine rndseq ( value, multiplier, increment, modulus ) integer*4 value, multiplier, increment, modulus value = mod ( value * multiplier + increment, modulus ) return end subroutine rndini ( seed1, seed2 ) integer seed1, seed2 integer idx integer now(7) integer*4 value1, value2, mult1, mult2, inc1, inc2, modu1, modu2, *table common /rndcom/ value1, value2, mult1, mult2, inc1, inc2,modu1, *modu2, table(200) mult1 = 1541 inc1 = 3501 modu1 = 16384 mult2 = 5146 inc2 = 4100 modu2 = 19683 call getnow ( now ) if (.not.( seed1 .ne. 0 ))goto 23000 value1 = seed1 goto 23001 23000 continue value1 = ( ( now(3) * 10 + now(4) ) * 10 + now(5) ) * 10 + now(6) 23001 continue value1 = mod ( value1, modu1 ) if (.not.( seed2 .ne. 0 ))goto 23002 value2 = seed2 goto 23003 23002 continue value2 = ( ( now(6) * 10 + now(5) ) * 10 + now(4) ) * 10 + now(3) 23003 continue value2 = mod ( value2, modu2 ) idx=1 23004 if (.not.(idx .le. 200))goto 23006 call rndseq ( value2, mult2, inc2, modu2 ) table(idx) = value2 23005 idx=idx+1 goto 23004 23006 continue return end real function rnd ( dummy ) integer dummy integer idx integer*4 value1, value2, mult1, mult2, inc1, inc2, modu1, modu2, *table common /rndcom/ value1, value2, mult1, mult2, inc1, inc2,modu1, *modu2, table(200) call rndseq ( value1, mult1, inc1, modu1 ) idx = ifix ( float(value1) / float(modu1) * 200 ) + 1 rnd = float(table(idx)) / float(modu2) call rndseq ( value2, mult2, inc2, modu2 ) table(idx) = value2 return end real function rnduni ( rlow, rhigh ) real rlow, rhigh real rnd rnduni = rnd(0) * (rhigh-rlow) + rlow return end integer function rndint ( ilow, ihigh ) integer ilow, ihigh real rnd rndint = ifix ( rnd(0) * float(ihigh-ilow+1) ) + ilow return end real function rndnor ( mean, stddev ) real mean, stddev real rnd, v1, v2, z 23007 continue v1 = -alog(1.0-rnd(0)) v2 = -alog(1.0-rnd(0)) 23008 if (.not.( 2.0*v1 .ge. (v2-1.0)**2 ))goto 23007 23009 continue if (.not.( rnd(0) .gt. 0.5 ))goto 23010 z = 1.0 goto 23011 23010 continue z = -1.0 23011 continue rndnor = stddev * z * v2 + mean return end real function rndexp ( mean ) real mean real rnd rndexp = - alog ( 1.0 - rnd(0) ) * mean return end real function rndchi ( v ) integer v integer k, x real rndexp, rndnor k = v / 2 rndchi = 0.0 x=1 23012 if (.not.(x .le. k))goto 23014 rndchi = rndchi + rndexp ( 1.0 ) 23013 x=x+1 goto 23012 23014 continue rndchi = rndchi * 2.0 if (.not.( k * 2 + 1 .eq. v ))goto 23015 rndchi = rndchi + rndnor(0.0,1.0)**2 23015 continue return end real function rndbta ( v1, v2 ) integer v1, v2 real y1, y2, rndchi y1 = rndchi ( v1 ) y2 = rndchi ( v2 ) rndbta = y1 / (y1+y2) return end real function rndF ( v1, v2 ) integer v1, v2 real y1, y2, rndchi y1 = rndchi ( v1 ) y2 = rndchi ( v2 ) rndF = (y1*v2) / (y2*v1) return end real function rndt ( v ) integer v real y1, y2, rndnor, rndchi y1 = rndnor ( 0.0, 1.0 ) y2 = rndchi ( v ) rndt = y1 / sqrt ( y2/v ) return end integer function rndgeo ( prob ) real prob real rnd if (.not.( prob .lt. 0.0 .or. prob .gt. 1.0 ))goto 23017 rndgeo = 0 goto 23018 23017 continue if (.not.( prob .eq. 1.0 ))goto 23019 rndgeo = 1 goto 23020 23019 continue rndgeo = aint ( alog(1.0-rnd(0)) / alog(1.0-prob) + 0.999999 ) 23020 continue 23018 continue return end integer function rndbin ( trials, prob ) integer trials real prob integer i real rnd rndbin = 0 i=1 23021 if (.not.(i .le. trials))goto 23023 if (.not.( rnd(0) .le. prob ))goto 23024 rndbin = rndbin + 1 23024 continue 23022 i=i+1 goto 23021 23023 continue return end integer function rndpoi ( mean ) real mean real p, q, rnd p = exp ( -mean ) rndpoi = 0 q = 1.0 23026 continue q = q * rnd(0) if (.not.( q .lt. p ))goto 23029 goto 23028 23029 continue rndpoi = rndpoi + 1 23027 goto 23026 23028 continue return end SHAR_EOF if test 4685 -ne "`wc -c < 'rndlb.for'`" then echo shar: error transmitting "'rndlb.for'" '(should have been 4685 characters)' fi fi # end of overwriting check cd .. # End of shell archive exit 0