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

  1.       SUBROUTINE KLNGN                                                  2062
  2.  
  3. c    include 'tcommon.for'
  4.     %include tcommon.for
  5.  
  6.       DATA GETHRU/.8/,SKFCTR/1./                                        2088
  7.       DATA WFR,WFRF,WST,WGH,WB,WNE,WDE,WT/5.,4.,4.,3.,2.,7.,8.,4./      2089
  8.       DATA POWER/4./                                                    2090
  9.       DATA SSS1 /9./,sss2/-9./
  10.     sss1=9.**17.
  11.     sss2=-9.**17.
  12. 2600  IF(KLNGNS.EQ.0)GO TO 2700                                         2091
  13. C     ...LOOP ON KLINGON ACTIVITIES.                                    2092
  14.       DO 2680 J=1,KLNGNS                                                2093
  15.       IF(XKL(J,1).EQ.0.)GO TO 2680                                      2094
  16. C     ...CHECK IF UNDER E CONTROL                                       2095
  17.       J1=0                                                              2096
  18.       J2=0                                                              2097
  19.       IF(ICNTL(J+1).NE.1)GO TO 26100                                    2098
  20.       IF(XKL(J,3).NE.XKL(J,5))J1=1                                      2099
  21.       IF(XKL(J,4).NE.XKL(J,6))J2=1                                      2100
  22.       GO TO 2610                                                        2101
  23. C     ...KLINGON MOVEMENT DETERMINATION ROUTINE.                        2102
  24. C     ...XVEC WILL BE X COMPONENT OF NEW BEARING                        2103
  25. C     ...YVEC WILL BE Y COMPONENT OF NEW BEARING                        2104
  26. C     ...ZVEC WILL BE AMOUNT OF VELOCITY REDUCTION FROM MAX (VMXKL)     2105
  27. 26100 XK=XKL(J,1)                                                       2106
  28.       YK=XKL(J,2)                                                       2107
  29.       XVEC=0.                                                           2108
  30.       YVEC=0.                                                           2109
  31.       ZVEC=0.                                                           2110
  32. C     ...AVOID OTHER KLINGONS.                                          2111
  33.       IF(KLNGNS.LE.1)GO TO 4050                                         2112
  34.       DO 4000 K=1,KLNGNS                                                2113
  35.       IF(K.EQ.J)GO TO 4000                                              2114
  36.       IF(XKL(K,1).EQ.0.)GO TO 4000                                      2115
  37.       VPX=XK-XKL(K,1)                                                   2116
  38.       VPY=YK-XKL(K,2)                                                   2117
  39.       DIST=ABS(VPX)**POWER+ABS(VPY)**POWER                              2118
  40.       DIST=ABS(DIST)                                                    2119
  41.       W=WFR                                                             2120
  42. C     ...BETTER TO COLLIDE WITH CAPTURED ONES IF NECESSARY.             2121
  43.       IF(ITRMEN(K+1).NE.0)W=WFRF                                        2122
  44.       XVEC=XVEC+VPX/DIST*W                                              2123
  45.       YVEC=YVEC+VPY/DIST*W                                              2124
  46.       ZVEC=ZVEC+SKFCTR/DIST                                             2125
  47. 4000  CONTINUE                                                          2126
  48. C     ...AVOID ROMULANS.                                                2127
  49. 4050  IF(NROM.EQ.0)GO TO 4150                                           2128
  50.       DO 4100 K=1,NROM                                                  2129
  51.       IF(XROM(K,1).EQ.0.)GO TO 4100                                     2130
  52.       VPX=XK-XROM(K,1)                                                  2131
  53.       VPY=YK-XROM(K,2)                                                  2132
  54.       DIST=ABS(VPX)**POWER+ABS(VPY)**POWER                              2133
  55.       DIST=ABS(DIST)                                                    2134
  56.       W=WFR                                                             2135
  57.       IF(ITRMEN(K+10).NE.0)W=WFRF                                       2136
  58.       XVEC=XVEC+VPX/DIST*W                                              2137
  59.       YVEC=YVEC+VPY/DIST*W                                              2138
  60.       ZVEC=ZVEC+SKFCTR/DIST                                             2139
  61. 4100  CONTINUE                                                          2140
  62. C     ...AVOID STARS.                                                   2141
  63. 4150  IF(NSTARS.EQ.0)GO TO 4250                                         2142
  64.       DO 4200 K=1,NSTARS                                                2143
  65.       IF(STARS(K,1).EQ.0.)GO TO 4200                                    2144
  66.       VPX=XK-STARS(K,1)                                                 2145
  67.       VPY=YK-STARS(K,2)                                                 2146
  68.       DIST=ABS(VPX)**POWER+ABS(VPY)**POWER                              2147
  69.       DIST=ABS(DIST)                                                    2148
  70.       W=WST                                                             2149
  71.       XVEC=XVEC+VPX/DIST*W                                              2150
  72.       YVEC=YVEC+VPY/DIST*W                                              2151
  73.       ZVEC=ZVEC+SKFCTR/DIST                                             2152
  74. 4200  CONTINUE                                                          2153
  75. C     ...AVOID GHOSTSHIPS.                                              2154
  76. 4250  IF(IGH.EQ.0)GO TO 4300                                            2155
  77.       VPX=XK-GHOST(1)                                                   2156
  78.       VPY=YK-GHOST(2)                                                   2157
  79.       DIST=ABS(VPX)**POWER+ABS(VPY)**POWER                              2158
  80.       DIST=ABS(DIST)                                                    2159
  81.       W=WGH                                                             2160
  82.       XVEC=XVEC+VPX/DIST*W                                              2161
  83.       YVEC=YVEC+VPY/DIST*W                                              2162
  84.       ZVEC=ZVEC+SKFCTR/DIST                                             2163
  85. C     ...AVOID STARBASES.                                               2164
  86. 4300  IF(IBASE.EQ.0)GO TO 4350                                          2165
  87.       VPX=XK-BASE(1)                                                    2166
  88.       VPY=YK-BASE(2)                                                    2167
  89.       DIST=ABS(VPX)**POWER+ABS(VPY)**POWER                              2168
  90.       DIST=ABS(DIST)                                                    2169
  91.       W=WB                                                              2170
  92.       XVEC=XVEC+VPX/DIST*W                                              2171
  93.       YVEC=YVEC+VPY/DIST*W                                              2172
  94.       ZVEC=ZVEC+SKFCTR/DIST                                             2173
  95. C     ...STAY CLEAR OF EDGES UNLESS ESCAPING.                           2174
  96. 4350  W=WNE                                                             2175
  97.       IF(XKL(J,7).GE.THITR*XKLHIT.OR.NKL/LEFTK.GE.7)W=-WDE              2176
  98.       VPX=SIGN(AMIN1(10.5-XK,XK-.5),5.5-XK)                             2177
  99.       VPY=SIGN(AMIN1(10.5-YK,YK-.5),5.5-YK)                             2178
  100.       DIST=ABS(VPX)**POWER                                              2179
  101.       DIST=ABS(DIST)                                                    2180
  102.       IF(DIST.LE..1)DIST=.1                                             2181
  103.       XVEC=XVEC+VPX/DIST*W                                              2182
  104.       DIST=ABS(VPY)**POWER                                              2183
  105.       IF(DIST.LT..1)DIST=.1                                             2184
  106.       YVEC=YVEC+VPY/DIST*W                                              2185
  107. C     ...SLOW DOWN FOR EDGES UNLESS ESCAPING.                           2186
  108.       IF(XKL(J,7).LT.THITR)ZVEC=ZVEC+SKFCTR/DIST                        2187
  109. C     ...NEW SPEED REDUCTION DEPENDENT ON HOW MANY NEARBY OBJECTS TO AVO2188
  110. C     D.                                                                2189
  111.       XKL(J,5)=AMAX1(.05,VMXKL-ZVEC)                                    2190
  112. C     ...AVOID TORPEDOS.                                                2191
  113.       IF(NTORPS.EQ.0.OR.LEVEL.EQ.1)GO TO 4550                           2192
  114.       DO 4500 K=1,NTORPS                                                2193
  115. C     ...SELECT ONLY ENEMY TORPS TO AVOID.                              2194
  116.       IF(TORPS(K,1).EQ.0..OR.TORPS(K,4).GE.0..AND.TORPS(K,4).LT.360.)GO 2195
  117.      1TO 4500                                                           2196
  118.       CALL GETBRG(DELTA,XK,TORPS(K,1),YK,TORPS(K,2),VPX,VPY)            2197
  119.       DELV=TORPS(K,4)                                                   2198
  120.       IF(DELV.LT.0.)DELV=DELV+360.                                      2199
  121.       IF(DELV.GE.360.)DELV=DELV-360.                                    2200
  122.       VPX=DELTA+90.                                                     2201
  123.       IF(VPX.GE.360.)VPX=VPX-360.                                       2202
  124.       VPY=DELTA-90.                                                     2203
  125.       IF(VPY.LT.0.)VPY=VPY+360.                                         2204
  126. C     ...SELECT ONLY THOSE ENEMY TORPS HEADED THIS WAY.                 2205
  127.       IF(DELV.LE.VPX.OR.DELV.GE.VPY)GO TO 4500                          2206
  128.       VPX=COSD(DELV)                                                    2207
  129.       VPY=SIND(DELV)                                                    2208
  130. C     ...CALCULATE PERPENDICULAR DISTANCE TO TORPEDO PATH.              2209
  131. c$$$ modified to get aroung microsoft bug
  132.     S=sss1
  133.       IF(VPY.LT.0.)S=ss2                                                2211
  134.       IF(ABS(VPY).GT.1./SS1)S=VPX/VPY                                   2212
  135.       IF(S.LT.0.)GO TO 4510                                             2213
  136.       IF(S.LT.1./SS1)S=1./SS1                                           2214
  137.       GO TO 4520                                                        2215
  138. 4510  IF(S.GT.-1./SS1)S=-1./SS1                                         2216
  139. 4520  C1=TORPS(K,2)-S*TORPS(K,1)                                        2217
  140.       C2=YK+XK/S                                                        2218
  141.       VPX=(C2-C1)/(S+1./S)                                              2219
  142.       VPY=S*VPX+C1                                                      2220
  143.       VPX=XK-VPX                                                        2221
  144.       VPY=YK-VPY                                                        2222
  145. C     ...MOVEMENT WILL BE AT RIGHT ANGLES AWAY FROM TORP PATH.          2223
  146.       DIST=ABS(VPX)**POWER+ABS(VPY)**POWER                              2224
  147.       XVEC=XVEC+VPX/DIST*WT                                             2225
  148.       YVEC=YVEC+VPY/DIST*WT                                             2226
  149. 4500  CONTINUE                                                          2227
  150. 4550  VPY=0.                                                            2228
  151. C     ...THIS WILL BE THE OPTIMUM BEARING TO AVOID MISHAP.              2229
  152.       CALL GETBRG(XKL(J,6),VPY,XVEC,VPY,YVEC,XADD,YADD)                 2230
  153.       IF(ABS(XKL(J,6)-XKL(J,4)).LE.DGKL.OR.ABS(360.-ABS(XKL(J,6)-       2231
  154.      1XKL(J,4))).LE.DGKL)XKL(J,5)=AMIN1(VMXKL,XKL(J,5)*2.)              2232
  155. 2610  CALL OMOVE(XKL(J,1),XKL(J,2),XKL(J,3),XKL(J,4),XKL(J,5),XKL(J,6)  2233
  156.      1  ,DSPKL,DGKL)                                                    2234
  157.       IF(J1.EQ.1.AND.XKL(J,3).EQ.XKL(J,5))WRITE(6,26101)J,XKL(J,3)      2235
  158. 26101 FORMAT(' K',I1,' DESIRED SPEED OF ',F5.3,' ATTAINED')             2236
  159.       IF(J2.EQ.1.AND.XKL(J,4).EQ.XKL(J,6))WRITE(6,26102)J,XKL(J,4)      2237
  160. 26102 FORMAT(' K',I1,' DESIRED BEARING OF ',F4.0,' ATTAINED')           2238
  161. C     ...CHECK IF LEAVING QUADRANT                                      2239
  162.       CALL KLQ(J,IR)                                                    2240
  163.       IF(IR.GE.1)GO TO 2680                                             2241
  164. C     ...K FIRING AREA.                                                 2242
  165.       IF(XKL(J,8).GT.NTSTPS.OR.XKL(J,8).EQ.0.)GO TO 2680                2243
  166. C     ...CHECK IF UNDER E CONTROL.                                      2244
  167.       IF(ICNTL(J+1).EQ.1)GO TO 2800                                     2245
  168.       IF(ICLOAK.LT.0.AND.ION.EQ.1)GO TO 2680                            2246
  169. C     ...CALCULATE HIT ON E                                             2247
  170. 2620  IF(IDOCK.EQ.2)GO TO 2680                                          2248
  171.       CALL GETBRG(VSX,XKL(J,1),XQE,XKL(J,2),YQE,VPX,VPY)                2249
  172.       X=VPX*VPX+VPY*VPY                                                 2250
  173.       VSX=AMAX1(ABS(COSD(VSX)),ABS(SIND(VSX)))**2                       2251
  174.       VSY=VSX*SQRT(X)                                                   2252
  175.       VSY=VSY*(XKLHIT-XKL(J,7))/XKLHIT                                  2253
  176.       VSY=VSY*XKFPE*DISTPK/X/SHLDF                                      2254
  177.       IF(LEVEL.EQ.1)GO TO 2630                                          2255
  178. C     ...MASKED?                                                        2256
  179.       CALL MASKEF(XQE,YQE,XKL(J,1),XKL(J,2),VPY)                        2257
  180.       VSY=VSY-VPY*VSY*GETHRU                                            2258
  181. C     ...CALCULATE EFFECT AND RESET FIRING                              2259
  182. 2630  XKL(J,8)=NTSTPS+1.+RAN(IZZ)*XKFPST                                2260
  183.       WRITE(6,2173)LETR(11),LETR(2),LETR(3),J,XKL(J,1),XKL(J,2)         2261
  184. 2173  FORMAT(1X,A1,' HIT ON ',A1,' FROM ',A1,I1,' AT ',F4.1,',',F4.1)   2262
  185.       CALL HITONE(VSY)                                                  2263
  186.       GO TO 2680                                                        2264
  187. C     ...K UNDER E CONTROL FIRING PHASERS.                              2265
  188. 2800  XKL(J,8)=0.                                                       2266
  189.       WRITE(6,26103)J                                                   2267
  190. 26103 FORMAT(' K',I1,' FIRING PHASERS')                                 2268
  191.       IF(LEVEL.EQ.1)GO TO 2811                                          2269
  192. 2811  IF(KLNGNS.LE.1)GO TO 2320                                         2270
  193. C     ...CALCULTE HITS ON OTHER KLINGONS.                               2271
  194.       DO 2310 K=1,KLNGNS                                                2272
  195.       IF(XKL(K,1).EQ.0.)GO TO 2310                                      2273
  196.       IF(K.EQ.J)GO TO 2310                                              2274
  197.       IF(ICNTL(K+1).EQ.1)GO TO 2310                                     2275
  198.       CALL GETBRG(VSX,XKL(J,1),XKL(K,1),XKL(J,2),XKL(K,2),VPX,VPY)      2276
  199.       X=VPX*VPX+VPY*VPY                                                 2277
  200.       VSX=AMAX1(ABS(COSD(VSX)),ABS(SIND(VSX)))**2                       2278
  201.       VSY=VSX*SQRT(X)                                                   2279
  202.       VSY=VSY*(XKLHIT-XKL(J,7))/XKLHIT                                  2280
  203.       VSY=VSY*XKFPE*DISTPK/X                                            2281
  204.       IF(LEVEL.EQ.1)GO TO 2170                                          2282
  205.       CALL MASKEF(XKL(K,1),XKL(K,2),XKL(J,1),XKL(J,2),VPY)              2283
  206.       VSY=VSY-VPY*VSY*GETHRU                                            2284
  207. 2170  WRITE(6,2174)VSY,LETR(3),K,XKL(K,1),XKL(K,2)                      2285
  208. 2174  FORMAT(1X,F8.2,' UNIT HIT ON ',A1,I1,' AT ',F4.1,',',F4.1)        2286
  209.       XKL(K,7)=XKL(K,7)+VSY                                             2287
  210.       IF(XKL(K,7).LT.XKLHIT)GO TO 2305                                  2288
  211. 2366  CALL DLETE(3,K)                                                   2289
  212.       GO TO 2310                                                        2290
  213. 2305  CONTINUE                                                          2291
  214. C     ...TROOP AND/OR CREW REDUCTIONS DUE TO P HIT.                     2292
  215.       IF(ITRMEN(K+1).EQ.0)GO TO 2356                                    2293
  216.       IX=RAN(IZZ)*2.5*SQRT(VSY)                                         2294
  217.       IF(IX.GT.ITRMEN(K+1))IX=ITRMEN(K+1)                               2295
  218.       ITKL(K)=ITKL(K)+IX                                                2296
  219.       ITRMEN(K+1)=ITRMEN(K+1)-IX                                        2297
  220. 2356  IX=RAN(IZZ)*SQRT(VSY)*2.5                                         2298
  221.       XKL(K,9)=XKL(K,9)-IX                                              2299
  222.       IF(XKL(K,9).GT.0.)GO TO 2309                                      2300
  223.       IF(ITRMEN(K+1).LE.0)GO TO 2366                                    2301
  224. 2309  JTKL(K)=JTKL(K)+IX                                                2302
  225. 2310  CONTINUE                                                          2303
  226. 2320  IF(NROM.EQ.0)GO TO 2340                                           2304
  227. C     ...CALCULATE HIT ON ROMULANS.                                     2305
  228.       DO 2330 K=1,NROM                                                  2306
  229.       IF(XROM(K,1).EQ.0.)GO TO 2330                                     2307
  230.       IF(ICNTL(K+10).EQ.1)GO TO 2330                                    2308
  231.       CALL GETBRG(VSX,XKL(J,1),XROM(K,1),XKL(J,2),XROM(K,2),VPX,VPY)    2309
  232.       X=VPX*VPX+VPY*VPY                                                 2310
  233.       VSX=AMAX1(ABS(COSD(VSX)),ABS(SIND(VSX)))**2                       2311
  234.       VSY=VSX*SQRT(X)                                                   2312
  235.       VSY=VSY*(XKLHIT-XKL(J,7))/XKLHIT                                  2313
  236.       VSY=VSY*XKFPE*DISTPK/X                                            2314
  237.       IF(LEVEL.EQ.1)GO TO 23705                                         2315
  238.       CALL MASKEF(XROM(K,1),XROM(K,2),XKL(J,1),XKL(J,2),VPY)            2316
  239.       VSY=VSY-VPY*VSY*GETHRU                                            2317
  240. 23705 WRITE(6,2174)VSY,LETR(4),K,XROM(K,1),XROM(K,2)                    2318
  241.       XROM(K,3)=XROM(K,3)+VSY                                           2319
  242.       IF(XROM(K,3).LT.XRMHIT)GO TO 2315                                 2320
  243. 2376  CALL DLETE(4,K)                                                   2321
  244.       GO TO 2330                                                        2322
  245. C     ...ROMULAN CREW AND TROOP ON BOARD REDUCTIONS.                    2323
  246. 2315  IF(ITRMEN(K+10).EQ.0)GO TO 2386                                   2324
  247.       IX=RAN(IZZ)*SQRT(VSY)*2.5                                         2325
  248.       IF(IX.GT.ITRMEN(K+10))IX=ITRMEN(K+10)                             2326
  249.       ITKL(K+9)=ITKL(K+9)+IX                                            2327
  250.       ITRMEN(K+10)=ITRMEN(K+10)-IX                                      2328
  251. 2386  IX=RAN(IZZ)*SQRT(VSY)*2.5                                         2329
  252.       CREWR(K)=CREWR(K)-IX                                              2330
  253.       IF(CREWR(K).GT.0.)GO TO 2329                                      2331
  254.       IF(ITRMEN(K+1).LE.0)GO TO 2376                                    2332
  255. 2329  JTKL(K+9)=JTKL(K+9)+IX                                            2333
  256. 2330  CONTINUE                                                          2334
  257. 2340  XKL(J,8)=NTSTPS+1+(CREWK/ITRMEN(J+1)*SKDLAY+RAN(IZZ)*XKFPST)      2335
  258. 2680  CONTINUE                                                          2336
  259. 2700  RETURN                                                            2337
  260.       END                                                               2338
  261.