home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / FORTRAN / SUPERT87.ZIP / ROMLN.FOR < prev    next >
Encoding:
Text File  |  1986-12-15  |  18.0 KB  |  242 lines

  1.  
  2.       SUBROUTINE ROMLN                                                  3827
  3.  
  4. c    include 'tcommon.for'
  5.     %include tcommon.for
  6.  
  7.       DIMENSION RMOVES(3,3)                                             3855
  8.       DATA PRRMV/.111/                                                  3856
  9.       DATA WNDESC,WEDGEM,WT,WGH,WK,WKO/-20.,10.,8.,15.,10.,10./         3857
  10.       DATA WSAMSQ/5./                                                   3858
  11. C     ...JSCAN WILL BE USED TO ASSURE THAT WE DON'T CALL SCAN           3859
  12. C     ...MORE THAN ONCE.                                                3860
  13.       DO 2750  J=1,NROM                                                 3861
  14.       IF(XROM(J,1).EQ.0.)GO TO 2750                                     3862
  15. C     ...R MOVES (JUMPS) IN INCREMENTS OF 1 PARSEC IN ANY OF 8          3863
  16. C     ...DIRECTIONS.                                                    3864
  17. 2710  IF(ICNTL(J+10).EQ.1)GO TO 2725                                    3865
  18. C     ...ROMULAN MOVEMENT. MOVES TO 1 OF 8 ADJACENT POINTS IN QUAD.     3866
  19.       IF(RAN(IZZ).GT.PRRMV.OR.LEVEL.EQ.1)GO TO 2725                     3867
  20.       IF(JSCAN.EQ.1)GO TO 27101                                         3868
  21.       IHERE=2                                                           3869
  22. C     ...SET UP IPQ SO WE CAN TELL WHICH POINTS ARE OCCUPIED.           3870
  23.       CALL SCAN                                                         3871
  24. 27101 IX=XROM(J,1)                                                      3872
  25.       IY=XROM(J,2)                                                      3873
  26. C     ...RMOVES USED TO SELECTIVELY WEIGHT EACH OF THE 9 POINTS.        3874
  27.       IDIR=-2                                                           3875
  28.       DO 1000 K=1,3                                                     3876
  29.       IDIR=IDIR+1                                                       3877
  30.       JDIR=-2                                                           3878
  31.       DO 990 L=1,3                                                      3879
  32.       JDIR=JDIR+1                                                       3880
  33.       RMOVES(K,L)=0.                                                    3881
  34.       MM=IX+IDIR                                                        3882
  35.       NN=IY+JDIR                                                        3883
  36.       XK=MM                                                             3884
  37.       YK=NN                                                             3885
  38.       IF(MM.GE.1.AND.MM.LE.10)GO TO 980                                 3886
  39. C     ...DO NOT LEAVE QUAD UNLESS DAMAGED OR TO AVOID TORPS.            3887
  40. 985   RMOVES(K,L)=WNDESC                                                3888
  41.       IF(XROM(J,3).LT.THITR*XRMHIT.AND.MROM/LEFTR.LT.7)GO TO 990        3889
  42.       KCE=2*MM/11-1+ICE                                                 3890
  43.       IF(KCE.GE.1.AND.KCE.LE.NQUAD)GO TO 987                            3891
  44. C     ...BIG PENALTY FOR LEAVING GALAXY.                                3892
  45. 988   RMOVES(K,L)=-1000.                                                3893
  46.       GO TO 990                                                         3894
  47. 986   RMOVES(K,L)=WNDESC                                                3895
  48.       IF(XROM(J,3).LT.THITR*XRMHIT.AND.MROM/LEFTR.LT.7)GO TO 990        3896
  49.       KCE=2*NN/11-1+JCE                                                 3897
  50.       IF(KCE.LT.1.OR.KCE.GT.NQUAD)GO TO 988                             3898
  51. 987   RMOVES(K,L)=1000.                                                 3899
  52.       GO TO 990                                                         3900
  53. 980   IF(NN.LT.1.OR.NN.GT.10)GO TO 986                                  3901
  54. C     ...DON'T GO THERE IF OCCUPIED UNLESS BY SELF.                     3902
  55.       IF(IPQ(MM,NN).EQ.LETR(8).AND.(ICLOAK.NE.2.OR.(MM.NE.XROM(1,1).AND.3903
  56.      1NN.NE.XROM(1,2))))GO TO 970                                       3904
  57.       IF(IDIR.EQ.0.AND.JDIR.EQ.0)GO TO 975                              3905
  58.       RMOVES(K,L)=-1.E13                                                3906
  59.       GO TO 990                                                         3907
  60. C     ...TENDS NOT TO SIT STILL IF NO OTHER CONSIDERATIONS.             3908
  61. 975   RMOVES(K,L)=WSAMSQ                                                3909
  62. C     ...AVOID KLINGONS.                                                3910
  63. 970   IF(KLNGNS.EQ.0)GO TO 950                                          3911
  64.       DO 960 M=1,KLNGNS                                                 3912
  65.       IF(XKL(M,1).EQ.0.)GO TO 960                                       3913
  66.       W=WK                                                              3914
  67. C     ...BETTER TO HIT THEM IF CAPTURED OR ABOUT TO BE.                 3915
  68.       IF(ITRMEN(K+1).GE.50)W=WKO                                        3916
  69.       RMOVES(K,L)=RMOVES(K,L)-W/RANGE(XK,XKL(M,1),YK,XKL(M,2))          3917
  70. 960   CONTINUE                                                          3918
  71. C     ...AVOID TORPS BY CALCULATING EACH SQUARE'S DISTANCE FROM         3919
  72. C     ...ALL ENEMY TORPEDO PATHS HEADED THIS WAY.                       3920
  73. 950   IF(NTORPS.EQ.0)GO TO 930                                          3921
  74.       DO 940 M=1,NTORPS                                                 3922
  75.       IF(TORPS(M,1).EQ.0..OR.TORPS(M,4).GE.0..AND.TORPS(M,4).LT.360.)GO 3923
  76.      1TO 940                                                            3924
  77.       CALL GETBRG(DELTA,XK,TORPS(M,1),YK,TORPS(M,2),VPX,VPY)            3925
  78.       DELV=TORPS(M,4)                                                   3926
  79.       IF(DELV.LT.0.)DELV=DELV+360.                                      3927
  80.       IF(DELV.GE.360.)DELV=DELV-360.                                    3928
  81.       VPX=DELTA+90.                                                     3929
  82.       IF(VPX.GE.360.)VPX=VPX-360.                                       3930
  83.       VPY=DELTA-90.                                                     3931
  84.       IF(VPY.LT.0.)VPY=VPY+360.                                         3932
  85.       IF(DELV.LE.VPX.OR.DELV.GE.VPY)GO TO 940                           3933
  86.       VPX=COSD(DELV)                                                    3934
  87.       VPY=SIND(DELV)                                                    3935
  88.       S=9.E17                                                           3936
  89.       IF(VPY.LT.0.)S=-9.E17                                             3937
  90.       IF(ABS(VPY).GT.1./9.E17)S=VPX/VPY                                 3938
  91.       IF(S.LT.0.)GO TO 4510                                             3939
  92.       IF(S.LT.1./9.E17)S=1./9.E17                                       3940
  93.       GO TO 4520                                                        3941
  94. 4510  IF(S.GT.-1./9.E17)S=-1./9.E17                                     3942
  95. 4520  C1=TORPS(M,2)-S*TORPS(M,1)                                        3943
  96.       C2=YK+XK/S                                                        3944
  97.       VPX=(C2-C1)/(S+1./S)                                              3945
  98.       VPY=S*VPX+C1                                                      3946
  99.       RMOVES(K,L)=RMOVES(K,L)-WT/RANGE(XK,VPX,YK,VPY)                   3947
  100. 940   CONTINUE                                                          3948
  101. C     ...AVOID GHOSTSHIPS.                                              3949
  102. 930   IF(IGH.EQ.0)GO TO 920                                             3950
  103.       RMOVES(K,L)=RMOVES(K,L)-WGH/RANGE(XK,GHOST(1),YK,GHOST(2))        3951
  104. C     ...BONUS FOR MOVING TOWARDS EDGE IF DAMAGED.                      3952
  105. 920   IF(XROM(J,3).LT.THITR*XRMHIT/3.)GO TO 990                         3953
  106.       IF(IX.GT.5.AND.MM.LE.IX.OR.IX.LE.5.AND.MM.GE.IX)GO TO 910         3954
  107. 915   R  MOVES(K,L)=RMOVES(K,L)+WEDGEM                                  3955
  108.       GO TO 990                                                         3956
  109. 910   IF(IY.GT.5.AND.NN.LE.IY.OR.IY.LE.5.AND.NN.GE.IY)GO TO 990         3957
  110.       GO TO 915                                                         3958
  111. 990   CONTINUE                                                          3959
  112. 1000  CONTINUE                                                          3960
  113. C     ...BEST SQ. TO MOVE TO WILL BE ONE WITH HIGHEST TOTAL WEIGHT.     3961
  114.       WMAX=-1.E13                                                       3962
  115.       JJ=2                                                              3963
  116.       KK=2                                                              3964
  117.       DO 800 K=1,3                                                      3965
  118.       DO 800 L=1,3                                                      3966
  119.       IF(RMOVES(K,L).LT.WMAX)GO TO 800                                  3967
  120.       WMAX=RMOVES(K,L)                                                  3968
  121.       JJ=K                                                              3969
  122.       KK=L                                                              3970
  123. 800   CONTINUE                                                          3971
  124.       K=IX                                                              3972
  125.       L=IY                                                              3973
  126.       IX=IX+JJ-2                                                        3974
  127.       IY=IY+KK-2                                                        3975
  128.       XROM(J,1)=IX                                                      3976
  129.       XROM(J,2)=IY                                                      3977
  130.       IF(IX.GE.1.AND.IX.LE.10.AND.IY.GE.1.AND.IY.LE.10)GO TO 27248      3978
  131. C     ...LEAVING QUADRANT AND/OR GALAXY.                                3979
  132. 2720  JX=0                                                              3980
  133.       IF(IX.LT.1)JX=-1                                                  3981
  134.       IF(IX.GT.10)JX=1                                                  3982
  135.       JY=0                                                              3983
  136.       IF(IY.LT.1)JY=-1                                                  3984
  137.       IF(IY.GT.10)JY=1                                                  3985
  138.       KCE=ICE+JX                                                        3986
  139.       LCE=JCE+JY                                                        3987
  140.       IRG=(JGAL(KCE,LCE))                                               3988
  141.       IF(IRG.GE.9000)GO TO 27260                                        3989
  142.       IF(IPQ(K,L).EQ.LETR(4))IPQ(K,L)=LETR(8)                           3990
  143.       JSCAN=1                                                           3991
  144.       IF(KCE.LE.NQUAD.AND.KCE.GE.1.AND.LCE.LE.NQUAD.AND.LCE.GE.1)GO TO 23992
  145.      1722                                                               3993
  146.       WRITE(*,2721)LETR(4),J                                            3994
  147. 2721  FORMAT(1X,A1,I1,' LEAVING GALAXY')                                3995
  148.       CALL DLETE(4,J)                                                   3996
  149.       GO TO 2750                                                        3997
  150. 2722  WRITE(*,2723)LETR(4),J,KCE,LCE                                    3998
  151. 2723  FORMAT(1X,A1,I1,' ESCAPED TO QUADRANT ',I2,',',I2)                3999
  152. 27245 JGAL(ICE,JCE)=JGAL(ICE,JCE)-1000                                  4000
  153.       IF(IGAL(ICE,JCE).NE.-1.AND.(IDMG(6).NE.0.OR.IDMG(7).NE.0))IGAL(ICE4001
  154.      1,JCE)=JGAL(ICE,JCE)                                               4002
  155.       JGAL(KCE,LCE)=JGAL(KCE,LCE)+1000                                  4003
  156.       ICNTL(J+10)=0                                                     4004
  157.       IF(ITRMEN(J+10).EQ.0)GO TO 27232                                  4005
  158.       IF(XROM(J,1).EQ.0.)GO TO 27244                                    4006
  159.       WRITE(*,101)ITRMEN(J+10)                                          4007
  160. 101   FORMAT(I4,' TROOPS CAPTURED BY ENEMY')                            4008
  161.       GO TO 27243                                                       4009
  162. 27244 WRITE(*,29242)ITRMEN(J+10)                                        4010
  163. 29242 FORMAT(I4,' TROOPS ON BOARD LOST')                                4011
  164. 27243 ITRMEN(J+10)=0                                                    4012
  165. 27232 XROM(J,1)=0.                                                      4013
  166.       IF(ISTAT.EQ.0)GO TO 2750                                          4014
  167.       IF(JUP.EQ.4.AND.JFROM.EQ.J.OR.JDOWN.EQ.4.AND.JTO.EQ.J)ISTAT=9999  4015
  168.       IF(NROM.GT.1)GO TO 2750                                           4016
  169.       GO TO 2999                                                        4017
  170. 27260 IF(XROM(J,1).LT.1)XROM(J,1)=1                                     4018
  171.       IF(XROM(J,2).LT.1)XROM(J,2)=1                                     4019
  172.       IF(XROM(J,1).GT.10)XROM(J,1)=10                                   4020
  173.       IF(XROM(J,2).GT.10)XROM(J,2)=10                                   4021
  174. C     ...ENTERING HOLE?                                                 4022
  175. 27248 IF(LEVEL.NE.3.OR.IHOLE.EQ.0)GO TO 27242                           4023
  176.       IF(IX.NE.IHOLE.OR.IY.NE.JHOLE)GO TO 27242                         4024
  177. 27249 KCE=IBL(ICE,JCE)/100                                              4025
  178.       LCE=IBL(ICE,JCE)-KCE*100                                          4026
  179.       IF(JGAL(KCE,LCE).GE.9000)GO TO 27247                              4027
  180.       GO TO 2722                                                        4028
  181. 27247 WRITE(*,27246)LETR(4),J                                           4029
  182. 27246 FORMAT(1X,A1,I1,' CAPTURED BY BLACK HOLE')                        4030
  183.       CALL DLETE(4,J)                                                   4031
  184.       GO TO 2750                                                        4032
  185. 27242 GO TO 2724                                                        4033
  186. C     ...CHANGE IPQ ARRAY IF MOVED TO SAVE CALL TO SCAN.                4034
  187. 2724  JSCAN=1                                                           4035
  188.       IF(K.EQ.IX.AND.L.EQ.IY)GO TO 2725                                 4036
  189. 27252 IF(IPQ(K,L).EQ.LETR(4))IPQ(K,L)=LETR(8)                           4037
  190. 27255 IF(IPQ(IX,IY).EQ.LETR(8))IPQ(IX,IY)=LETR(4)                       4038
  191. C     ...R FIRES T.                                                     4039
  192. 2725  IF(XROM(J,4).GT.NTSTPS.OR.XROM(J,4).EQ.0.)GO TO 2750              4040
  193.       IF(ICLOAK.LT.0.AND.ION.EQ.1)GO TO 2750                            4041
  194.       IF(ICNTL(J+10).NE.1)GO TO 2760                                    4042
  195. C     ...R UNDER E CONTROL FIRES T.                                     4043
  196.       WRITE(*,38644)J                                                   4044
  197. 38644 FORMAT(' R',I1,' LAUNCHED TORPEDO')                               4045
  198.       DELTA=RTBRG(1)-360.                                               4046
  199.       RTBRG(1)=-1.                                                      4047
  200.       XROM(J,4)=0.                                                      4048
  201.       IF(RTBRG(2).LT.0.)GO TO 2730                                      4049
  202.       XROM(J,4)=NTSTPS+1+(SCREWR/ITRMEN(J+10)*SRDLY+RAN      (IZZ)*XRFTS4050
  203.      1)*XRMHIT/(XRMHIT-XROM(J,3))                                       4051
  204.       DO 2758 K=1,4                                                     4052
  205. 2758  RTBRG(K)=RTBRG(K+1)                                               4053
  206.       RTBRG(5)=-1.                                                      4054
  207.       GO TO 2730                                                        4055
  208. 2760  CALL GETBRG(DELTA,XROM(J,1),XQE,XROM(J,2),YQE,VPX,VPY)            4056
  209.       IF(PSP.EQ.0.)GO TO 2730                                           4057
  210. C     ...CALCULATE ANGLE FOR FIRING TO REACH E IF IT IS MOVING.         4058
  211.       DX=SIND(PDEG-DELTA)*PSP/RTV                                       4059
  212.       IF(DX*DX.GT.1.)GO TO 2740                                         4060
  213.       DY=SQRT(1.-DX*DX)                                                 4061
  214.       DX=ATAN2(DX,DY)*RADEGC                                            4062
  215.       DELTA=DX+DELTA                                                    4063
  216.       IF(DELTA.LT.0.)DELTA=DELTA+360.                                   4064
  217.       IF(DELTA.GE.360.)DELTA=DELTA-360.                                 4065
  218. C     ...FIND SPOT IN TORPS ARRAY TO PUT THE NEW ONE.                   4066
  219. 2730  IF(NTORPS.NE.0)GO TO 2732                                         4067
  220.       NT=1                                                              4068
  221.       NTORPS=30                                                         4069
  222.       GO TO 2735                                                        4070
  223. 2732  DO 2733 K=1,NTORPS                                                4071
  224.       IF(TORPS(K,1).EQ.0.)GO TO 2734                                    4072
  225. 2733  CONTINUE                                                          4073
  226.       GO TO 2750                                                        4074
  227. 2734  NT=K                                                              4075
  228. 2735  TORPS(NT,3)=RTV                                                   4076
  229.       TORPS(NT,4)=DELTA                                                 4077
  230.       VSX=COSD(DELTA)*RTV+XROM(J,1)                                     4078
  231.       VSY=SIND(DELTA)*RTV+XROM(J,2)                                     4079
  232. 2739  TORPS(NT,1)= VSX                                                  4080
  233.       TORPS(NT,2)= VSY                                                  4081
  234.       IF(ICNTL(J+10).EQ.1)GO TO 2750                                    4082
  235. C     ...RESET FIRING                                                   4083
  236. 2740  XROM(J,4)=NTSTPS+RAN(IZZ)*XRFTS*XRMHIT/(XRMHIT-XROM(J,3))+1.      4084
  237. 2750  CONTINUE                                                          4085
  238. 2800  RETURN                                                            4086
  239. 2999  NROM=0                                                            4087
  240.       GO TO 2800                                                        4088
  241.       END                                                               4089
  242.