home *** CD-ROM | disk | FTP | other *** search
/ AMOS PD CD / amospdcd.iso / authors / stephan_scholz / dogfight.amos / dogfight.amosSourceCode
AMOS Source Code  |  1986-08-03  |  8KB  |  290 lines

  1. '       **********************************************************       
  2. '       *  LA OROYA                                 written by   *             
  3. '       *    1993                                 Stephan Scholz *             
  4. '       *                  >>>  DOGFIGHT  <<<                    *   
  5. '       *                                                        *           
  6. '       *   An elementary shooting game between two tiny ships.  *                           
  7. '       *                                                        * 
  8. '       *   4 Cursor keys:  left, right, speed up, break.        *           
  9. '       *   Space bar    :  fire.                                *   
  10. '       *                                                        *           
  11. '       *   Features 360 degree movement, Plot and Draw being    *   
  12. '       *   used to draw the ships - no Bobs or Sprites...       *     
  13. '       *   Trigonometrical values are pre-calculated and stored *       
  14. '       *   in tables for direct access when ships are drawn.    *             
  15. '       *                                                        *     
  16. '       **********************************************************     
  17. '
  18. Set Buffer 40
  19. Screen Open 0,320,256,16,Lowres
  20. Degree 
  21. Curs Off : Cls 0 : Hide On 
  22. Locate 0,6
  23. Paper 0 : Pen 4
  24. Print "          LA OROYA"; : Pen 2 : Print " presents: " : Pen 3
  25. Print : Print : Print "          >>>  DOGFIGHT  <<<" : Pen 2
  26. Print : Print : 
  27. Print : Print "      Ship Controls:"
  28. Print : Print "      The Four Cursor Arrows:"
  29. Print : Print "      Left-Right-Acceletate-Break"
  30. Print : Print "      and Spacebar to Fire" : Pen 5
  31. Print : Print 
  32. Print : Print "      Please wait, reading datas..."
  33. Dim H#(360,8)
  34. Dim S#(360,3,2)
  35. X#=70
  36. X2#=250
  37. Y#=180
  38. Y2#=180
  39. VELOZ#=0
  40. V2#=0
  41. RUMBO=180
  42. R2=180
  43. BODY=-8
  44. MILI#=5
  45. Proc DATOS
  46. Bell 
  47. Locate 0,23
  48. Pen 3
  49. Print "      O.K.  Press any key to start       "
  50. Wait Key 
  51. Cls 0 : Pen 5
  52. 'ship control variables for straightening, turning and speeding up   
  53. CORR#=0.1
  54. RCH#=0.2
  55. VCH#=0.02
  56. Do 
  57. 'reads keyboard
  58.    If Key State(76) Then If SP<3 Then VELOZ#=VELOZ#+VCH# : SP=VELOZ#
  59.    If Key State(78) Then If CHRUMBO#>-3 Then CHRUMBO#=CHRUMBO#-RCH#
  60.    If Key State(77) Then If SP>0 Then VELOZ#=VELOZ#-VCH# : SP=VELOZ#
  61.    If Key State(79) Then If CHRUMBO#<3 Then CHRUMBO#=CHRUMBO#+RCH#
  62.    If Key State(64) Then If DISPARO=0 Then Proc DISPARO
  63. 'changes your heading if you are turning 
  64.    RUMBO=RUMBO+CHRUMBO#
  65. 'changes red ship�s course sometimes   
  66.    If Rnd(200)=0 Then CH2#=Rnd(2.0)-1.0
  67. 'accelerates red ship
  68.    If V2#<3 Then V2#=V2#+VCH# : SP2=Int(V2#)
  69. 'changes red ship�s heading if it�s turning
  70.    R2=R2+CH2#
  71. 'straightens you out 
  72.    CHRUMBO#=CHRUMBO#-Sgn(Int(CHRUMBO#*10))*CORR#
  73. 'straightens red ship out
  74.    CH2#=CH2#-Sgn(Int(CH2#*10))*CORR#
  75. 'factor corrections
  76.    If RUMBO<1 Then Add RUMBO,360
  77.    If R2<1 Then Add R2,360
  78.    If RUMBO>360 Then Add RUMBO,-360
  79.    If R2>360 Then Add R2,-360
  80. 'selects speed (sp=0 to 3) 
  81.    X#=X#+S#(RUMBO,SP,1)
  82.    X2#=X2#+S#(R2,SP2,1)
  83.    Y#=Y#+S#(RUMBO,SP,2)
  84.    Y2#=Y2#+S#(R2,SP2,2)
  85. 'converts to integers
  86.     X=X#
  87.     Y=Y#
  88.     X2=X2#
  89.     Y2=Y2#
  90. 'erases previous position and draws ships at new positions 
  91.    Plot X1,Y1,0 : Draw To X1+H#(RUMBO1,3),Y1+H#(RUMBO1,4)
  92.    Plot X1,Y1 : Draw To X1+H#(RUMBO1,5),Y1+H#(RUMBO1,6)
  93.    Plot X,Y,2 : Draw To X+H#(RUMBO,3),Y+H#(RUMBO,4)
  94.    Plot X,Y : Draw To X+H#(RUMBO,5),Y+H#(RUMBO,6)
  95.    Plot X3,Y3,0 : Draw To X3+H#(R3,3),Y3+H#(R3,4)
  96.    Plot X3,Y3 : Draw To X3+H#(R3,5),Y3+H#(R3,6)
  97.    Plot X2,Y2,4 : Draw To X2+H#(R2,3),Y2+H#(R2,4)
  98.    Plot X2,Y2 : Draw To X2+H#(R2,5),Y2+H#(R2,6)
  99. 'if you've fired 
  100.    If DISPARO
  101. 'give bullet your heading
  102.       DX#=DX#+H#(MUMBO,1)
  103.       DY#=DY#+H#(MUMBO,2)
  104.       DX=DX#
  105.       DY=DY#
  106. 'erase previous bullet position and draw new one 
  107.       Plot DX1,DY1,0
  108.       Plot DX,DY,2
  109. 'if bullet nears other ship, score a hit.  
  110. 'The 15 can be reduced to increase difficulty.   
  111.       If Abs(DX-X2)<15
  112.        If Abs(DY-Y2)<15 : Proc HIT : End If 
  113.       End If 
  114. 'decrease missile counter so if 0 make bullet disappear  
  115.       Dec MISS
  116.       If MISS<1
  117.          DISPARO=0
  118.          Plot DX,DY,0
  119.       End If 
  120.    End If 
  121. 'if red ship has fired 
  122.    If FEUER
  123. 'give bullet red ship�s heading
  124.       DX2#=DX2#+H#(M2,1)
  125.       DY2#=DY2#+H#(M2,2)
  126.       DX2=DX2#
  127.       DY2=DY2#
  128. 'draw it 
  129.       Plot DX3,DY3,0
  130.       Plot DX2,DY2,2
  131. 'if near you, score a hit
  132.       If Abs(DX2-X)<15
  133.        If Abs(DY2-Y)<15 : Proc DADO : End If 
  134.       End If 
  135. 'decrease bullet counter, if 0 make it disappear 
  136.       Dec MS2
  137.       If MS2<1
  138.          FEUER=0
  139.          Plot DX2,DY2,0
  140.       End If 
  141.    End If 
  142. 'if red ship is near your ship, and if it hasn't fired, it 
  143. 'will turn either away or towards you, and fire (evasive or
  144. 'offensive action) 
  145.    If Abs(X-X2)<100
  146.    If Abs(Y-Y2)<100
  147.       If Not FEUER
  148.        CH2#=CH2#+Rnd(2.0)-1.0
  149.        Proc FEUER
  150.       End If 
  151.    End If 
  152.    End If 
  153. 'register previous data to free variables for new data   
  154.   RUMBO1=RUMBO
  155.   R3=R2
  156.   DX1=DX
  157.   DX3=DX2
  158.   DY1=DY
  159.   DY3=DY2
  160.   X1=X
  161.   Y1=Y
  162.   R3=R2
  163.   X3=X2
  164.   Y3=Y2
  165. 'wrap around for your ship 
  166.      If X#>319 Then X#=0
  167.      If Y#>254 Then Y#=0
  168.      If Y#<0 Then Y#=254
  169.      If X#<0 Then X#=319
  170. 'wrap around for red ship
  171.      If X2#>319 Then X2#=0
  172.      If Y2#>254 Then Y2#=0
  173.      If Y2#<0 Then Y2#=254
  174.      If X2#<0 Then X2#=319
  175. 'wrap around for your bullet   
  176.      If DX#>319 Then DX#=0
  177.      If DY#>254 Then DY#=0
  178.      If DY#<0 Then DY#=254
  179.      If DX#<0 Then DX#=319
  180. 'wrap around for red ship�s bullet   
  181.      If DX2#>319 Then DX2#=0
  182.      If DY2#>254 Then DY2#=0
  183.      If DY2#<0 Then DY2#=254
  184.      If DX2#<0 Then DX2#=319
  185. 'the bullet wrap-arounds can be eliminated to  
  186. 'get more program speed - you save 8 If's...   
  187. 'decrease missle counters  
  188. Dec MC1
  189. Dec MC2
  190. Loop 
  191. Procedure DISPARO
  192.    Shared X#,Y#,RUMBO,DX#,DY#,MISS,DISPARO,MUMBO,MC1,H#()
  193. 'if time for next shot has not expired, don't shoot
  194.    If MC1>0 Then Pop Proc
  195.    Shoot 
  196. 'time counter to avoid too frequent shots  
  197.    MC1=35
  198. 'shot flag 
  199.    DISPARO=1
  200. 'distance counter
  201. 'bullet travels 12*speed (12)=144 pixels 
  202.    MISS=12
  203. 'heading for bullet
  204.    MUMBO=RUMBO
  205. 'speed for bullet
  206.    DX#=X#+H#(MUMBO,7)
  207.    DY#=Y#+H#(MUMBO,8)
  208. End Proc
  209. Procedure FEUER
  210. 'same comments as previous procedure, but for red ship�s bullet
  211.    Shared X2#,Y2#,R2,DX2#,DY2#,MS2,FEUER,M2,MC2,H#()
  212.    If MC2>0 Then Pop Proc
  213.    Shoot 
  214.    MC2=35
  215.    FEUER=1
  216.    MS2=12
  217.    M2=R2
  218.    DX2#=X2#+H#(M2,7)
  219.    DY2#=Y2#+H#(M2,8)
  220. End Proc
  221. Procedure DADO
  222. 'if you have been hit
  223. Shared X,Y,MS2,DADO,VELOZ#,SP
  224. Boom 
  225. 'slows you down  
  226. If Int(VELOZ#)>0 Then VELOZ#=VELOZ#-1 : SP=Int(VELOZ#)
  227. 'increases damage counter
  228. Inc DADO
  229. 'stops red ship�s bullet�s distance counter
  230. MS2=0
  231. 'draws "explosion" 
  232. For M=1 To 0 Step -1
  233. For N=1 To 20 Step 4
  234. Ink M
  235. Circle X,Y,N
  236. Next N
  237. Next M
  238. 'register the damage 
  239. Locate 30,28
  240. Print DADO
  241. End Proc
  242. Procedure HIT
  243. 'same comments as above, but if you hit oyther ship, 
  244. 'so hits are scored as hit points for you.   
  245. Shared X2,Y2,MISS,HIT,V2#,SP2
  246. Boom 
  247. If Int(V2#)>0 Then V2#=V2#-1 : SP2=Int(V2#)
  248. Inc HIT
  249. MISS=0
  250. For M=1 To 0 Step -1
  251. For N=1 To 20 Step 4
  252. Ink M
  253. Circle X2,Y2,N
  254. Next N
  255. Next M
  256. Locate 2,28
  257. Print HIT
  258. End Proc
  259. Procedure DATOS
  260. 'trigonometrical data to draw ship and bullet positions  
  261. Shared BODY#,H#(),S#()
  262. 'size
  263. BODY#=-8
  264. 'all the angles
  265. For N=1 To 360
  266. K=N
  267. If N-15<0 Then K=N+360
  268. If N+15>360 Then K=N-360
  269. 'bullet speed
  270. H#(N,1)=12*Sin(N)
  271. H#(N,2)=12*Cos(N)
  272. 'both sides of the "V" of the ships
  273. H#(N,3)=BODY#*Sin(K+15)
  274. H#(N,4)=BODY#*Cos(K+15)
  275. H#(N,5)=BODY#*Sin(K-15)
  276. H#(N,6)=BODY#*Cos(K-15)
  277. 'full speed
  278. S#(N,3,1)=3*Sin(N)
  279. S#(N,3,2)=3*Cos(N)
  280. 'cruising speed
  281. S#(N,2,1)=2*Sin(N)
  282. S#(N,2,2)=2*Cos(N)
  283. 'slow speed  
  284. S#(N,1,1)=Sin(N)
  285. S#(N,1,2)=Cos(N)
  286. 'no speed
  287. S#(N,0,1)=0
  288. S#(N,0,2)=0
  289. Next N
  290. End Proc