|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T t
Length: 6379 (0x18eb) Types: TextFile Names: »troopm.f«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Empire/troopm.f«
subroutine troopm c c This subroutine handles enemy troop transport moves c IMPLICIT INTEGER(A-Z) include 'common.h' C integer tttc(-1:20,0:50) monkey = 0 number ( 5 ) = 0 if ( coder .eq. 5 ) print 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 comment 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 comment 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 comment 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 comment 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 comment ** 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) comment ** if (coder.eq.5) print 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) print 996,ab comment 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