home *** CD-ROM | disk | FTP | other *** search
/ AMOS PD CD / amospdcd.iso / 451-475 / apd473 / amos_invaders.amos / amos_invaders.amosSourceCode
AMOS Source Code  |  1993-03-07  |  9KB  |  281 lines

  1. Rem ##### intro screen 
  2. Dir$="df0:"
  3. Load Iff "intro.iff",0
  4. Hide : Print : Centre "PRESS THE FIRE BUTTON"
  5. LLOOP: If Fire(1)<>-1 Then Goto LLOOP
  6. Fade 10
  7. Wait 10*15
  8. Rem ##### set up screen
  9. Screen Open 0,320,256,16,LORES
  10. Curs Off : Cls 0 : Flash 3,"(fff,40)(bb0,30)"
  11. Rem ##### load aliens
  12. Load "spacenasties.abk",1
  13. Double Buffer 
  14. Get Sprite Palette 
  15. Rem ##### give sprites a mask
  16. Make Mask 5 : Make Mask 6
  17. Rem ##### set up variables 
  18. Dim X(20),Y(20),ALIENDEAD(20)
  19. Global X(),Y(),WHERETO,SPEED,SEP,X,N0,S0,ALIENDEAD(),ALIVE,SHIELDS,SCORE$
  20. Global LEVEL,SCORE,ALIENSHOT,SHOT,SHOTY,SHOTX,HISORMINE,LIVES
  21. Global NEWSHOT,ALIENSHOTX,ALIENSHOTY,SHIELD1,SHIELD2,SHIELD3
  22. N0=1 : X=150 : S0=5 : SHOTX=0 : SHOTY=240 : SHOT=0 : SCORE$="0" : LIVES=3
  23. LEVEL=0 : SCORE=0 : ALIENSHOTX=0 : NEWSHOT=0 : ALIENSHOT=0 : ALIENSHOTY=0
  24. Ink 3,0 : Paper 0 : Pen 3
  25. Rem ##### make sure all hot spots are central
  26. For COUNT=1 To 20
  27.    Hot Spot COUNT,$11
  28. Next COUNT
  29. Proc _MAIN
  30. '
  31. Procedure _MAIN
  32.    Rem ##### set up variables specific to each new level
  33.    SHIELDS=-1 : SEP=0 : ALIVE=20 : SPEED=1 : WHERETO=5 : Add LEVEL,1
  34.    MOVE=0 : SHIELD1=0 : SHIELD2=0 : SHIELD3=0 : HISORMINE=0
  35.    Rem ##### calculate positions for aliens 
  36.    For COUNT=1 To 20
  37.       Read X(COUNT),Y(COUNT) : ALIENDEAD(COUNT)=COUNT
  38.       If LEVEL<=12
  39.          Y(COUNT)=Y(COUNT)+((LEVEL-1)*10)
  40.       Else Y(COUNT)=Y(COUNT)+110
  41.       End If 
  42.    Next COUNT
  43.    Rem ##### give shields to levels 1 to 11 
  44.    If LEVEL<=12 Then Bob 23,50,215,11 : Bob 24,150,215,11 : Bob 25,250,215,11
  45.    Locate 12,0 : Print "LEVEL";LEVEL;" SCORE ";SCORE$
  46.    '
  47.    Rem ##### position data
  48.    Data 20,20,40,20,60,20,80,20,100,20
  49.    Data 20,40,40,40,60,40,80,40,100,40
  50.    Data 20,60,40,60,60,60,80,60,100,60
  51.    Data 20,80,40,80,60,80,80,80,100,80
  52.    '
  53.    Do 
  54.       Bob Update Off 
  55.       Rem ##### rotate alien legs
  56.       Add N0,1,1 To 4
  57.       Rem ##### control alien shots
  58.       If ALIENSHOT=1 Then Proc _ALIENSHOT
  59.       If ALIENSHOT=0 Then NEWSHOT=1 : Proc _ALIENSHOT
  60.       Rem ##### control my ship
  61.       If Jleft(1) Then Add X,-10 : S0=5
  62.       If Jright(1) Then Add X,10 : S0=6
  63.       If S0=6
  64.          S0=5
  65.       Else S0=6
  66.       End If 
  67.       If X<15 Then X=15
  68.       If X>290 Then X=290
  69.       Sprite 0,X Hard(X),Y Hard(240),S0
  70.       Rem ##### display lives left 
  71.       If LIVES>=3
  72.          Sprite 2,X Hard(10),Y Hard(10),S0
  73.       End If 
  74.       If LIVES>=2
  75.          Sprite 4,X Hard(30),Y Hard(10),S0
  76.       End If 
  77.       If LIVES>=1
  78.          Sprite 6,X Hard(50),Y Hard(10),S0
  79.       End If 
  80.       '
  81.       Rem ##### check for collisions 
  82.       Bob Update 
  83.       If Bob Col(21,1 To 20) Then SHOT=0 : SHOTY=0 : Bob Off 21 : Proc _GOTONE
  84.       If Spritebob Col(0,1 To 20) Then LIVES=0 : Proc _DEAD
  85.       If Spritebob Col(0,22 To 22) Then Proc _DEAD
  86.       If Bob Col(22,23 To 25) Then Proc _GOTSHIELD
  87.       If Bob Col(21,23 To 25) Then HISORMINE=-1 : Proc _GOTSHIELD
  88.       Rem ##### move aliens
  89.       Proc _XMOVE
  90.       Rem ##### control my shot
  91.       If Fire(1) Then Shoot : SHOT=1
  92.       If SHOT=1 Then Proc _MYSHOT
  93.       If SHOT=0 Then SHOTX=X
  94.    Loop 
  95. End Proc
  96. '
  97. Procedure _XMOVE
  98.    Rem ##### increment speed if whereto=5 or decrement if whereto=-5
  99.    For COUNT=1 To 20
  100.       If WHERETO=5
  101.          Add X(COUNT),SPEED
  102.       Else Add X(COUNT),-SPEED
  103.       End If 
  104.       Rem ##### check to see that only live aliens 'bounce' of edges and move down 
  105.       If ALIENDEAD(COUNT)<>0 and X(COUNT)>=310 Then MOVE=-1
  106.       If ALIENDEAD(COUNT)<>0 and X(COUNT)<=10 Then MOVE=-1
  107.       Rem ##### display only aliens still alive
  108.       If ALIENDEAD(COUNT)<>0 Then Bob COUNT,X(COUNT),Y(COUNT),N0
  109.    Next COUNT
  110.    Rem ##### if an alive alien touched the edge then move down
  111.    If MOVE Then MOVE=0 : Proc _YMOVE
  112. End Proc
  113. '
  114. Procedure _YMOVE
  115.    Rem ##### make aliens move opposite way
  116.    If WHERETO=5
  117.       WHERETO=-5
  118.    Else WHERETO=5
  119.    End If 
  120.    Rem ##### increment height of aliens 
  121.    For COUNT=1 To 20
  122.       Add Y(COUNT),5
  123.    Next COUNT
  124.    Rem ##### check to see if shields still exist, if so destroy if aliens are low enough
  125.    If SHIELDS
  126.       For COUNT=1 To 20
  127.          If ALIENDEAD(COUNT)<>0 and Y(COUNT)>180
  128.             If SHIELDS
  129.                Rem ##### blow up shields
  130.                For COUNT1=1 To 5
  131.                   If SHIELD1<>0
  132.                      Boom : Bob 23,50,215,COUNT1+14
  133.                   End If 
  134.                   If SHIELD2<>0
  135.                      Boom : Bob 24,150,215,COUNT1+14
  136.                   End If 
  137.                   If SHIELD3<>0
  138.                      Boom : Bob 25,250,215,COUNT1+14
  139.                   End If 
  140.                   Bob Update : Wait 15
  141.                Next COUNT1
  142.                Rem ##### turn shields off 
  143.                Bob Off 23 : Bob Off 24 : Bob Off 25 : SHIELDS=0
  144.             End If 
  145.          End If 
  146.       Next COUNT
  147.    End If 
  148. End Proc
  149. '
  150. Procedure _DEAD
  151.    Wait 15 : Dec LIVES
  152.    Sprite Off 0 : Bob Off 22
  153.    Rem ##### display ship blowing up
  154.    For DEAD=7 To 10
  155.       Bob 21,X+10,230,DEAD : Wait 2 : Wait Vbl 
  156.       Bob Update 
  157.    Next DEAD
  158.    Rem ##### make ship blowing up noise 
  159.    For NOISE=62 To 0 Step -2
  160.       Volume NOISE : Boom : Wait 1
  161.    Next NOISE
  162.    Volume 63 : Sprite Off 
  163.    Rem ##### if dead execute game over sequence 
  164.    If LIVES=<0
  165.       Bob Off : Cls 0 : Locate 15,13 : Print "GAME OVER"
  166.       Locate 13,15 : Print "YOU SCORED ";SCORE$ : Wait 150 : Locate 15,17
  167.       Print "PLAY AGAIN" : Locate 16,19 : Print "Y OR N"
  168.       Clear Key 
  169.       TEST:
  170.       If Inkey$="y"
  171.          Cls 0 : LEVEL=0 : LIVES=3 : Proc _MAIN
  172.       End If 
  173.       If Inkey$="n"
  174.          End 
  175.       End If 
  176.       Goto TEST
  177.    Else Bob Off 21
  178.    End If 
  179. End Proc
  180. '
  181. Procedure _GOTONE
  182.    Rem ##### check to find which alien was hit. then decrement amount left alive
  183.    For COUNT=1 To 20
  184.       If Col(COUNT)
  185.          Bob COUNT,X(COUNT),Y(COUNT),14 : Boom 
  186.          Bob Update : ALIENDEAD(COUNT)=0 : Bob Off COUNT
  187.       End If 
  188.    Next COUNT
  189.    Dec ALIVE : SCORE=Val(SCORE$)+50
  190.    Rem ##### increase score. strings were used because they diplayed quicker
  191.    SCORE$=Str$(SCORE) : Text 208,6,SCORE$
  192.    Rem ##### work out new speed, according to aliens alive
  193.    SPEED=Int(Abs(ALIVE-20)/2+1)
  194.    Rem ##### check to see if level has been completed 
  195.    If ALIVE=0
  196.       Sprite Off 0 : Bob Off : Cls 0 : Locate 13,13 : Print "WHAT A SHOW OFF"
  197.       Locate 13,15 : Print "CURRENT SCORE";SCORE$ : Wait 150
  198.       Cls 0 : ALIENSHOT=0 : Proc _MAIN
  199.    End If 
  200. End Proc
  201. '
  202. Procedure _GOTSHIELD
  203.    Rem ##### find out who hit the shield, so you can turn off the shot
  204.    If HISORMINE
  205.       HISORMINE=0 : GOB=21 : SHOT=0 : SHOTY=-1
  206.    Else GOB=22
  207.    End If 
  208.    Rem ##### find out which shield was hit
  209.    If Bob Col(23)
  210.       Inc SHIELD1 : Bob 23,50,215,SHIELD1+14 : Bob Off GOB : NEWSHOT=1
  211.       Boom 
  212.       Rem ##### check to see if shot was fatal. if so blow up shield 
  213.       If SHIELD1=5
  214.          Bob 23,50,215,19 : Boom : Bob Update : Wait 10 : Bob 23,50,215,20
  215.          Boom : Bob Update : Wait 10 : Bob Off 23 : SHIELD1=0 : Bob Off GOB
  216.          NEWSHOT=1
  217.       End If 
  218.    End If 
  219.    If Bob Col(24)
  220.       Inc SHIELD2 : Bob 24,150,215,SHIELD2+14 : Bob Off GOB : NEWSHOT=1
  221.       Boom 
  222.       Rem ##### check to see if shot was fatal. if so blow up shield 
  223.       If SHIELD2=5
  224.          Bob 24,150,215,19 : Boom : Bob Update : Wait 10 : Bob 24,150,215,20
  225.          Boom : Bob Update : Wait 10 : Bob Off 24 : SHIELD2=0 : Bob Off GOB
  226.          NEWSHOT=1
  227.       End If 
  228.    End If 
  229.    If Bob Col(25)
  230.       Inc SHIELD3 : Bob 25,250,215,SHIELD3+14 : Bob Off GOB : NEWSHOT=1
  231.       Boom 
  232.       Rem ##### check to see if shot was fatal. if so blow up shield 
  233.       If SHIELD3=5
  234.          Bob 25,250,215,19 : Boom : Bob Update : Wait 10 : Bob 25,250,215,20
  235.          Boom : Bob Update : Wait 10 : Bob Off 25 : SHIELD3=0 : Bob Off GOB
  236.          NEWSHOT=1
  237.       End If 
  238.    End If 
  239.    If SHIELD1=0 and SHIELD2=0 and SHIELD3=0 Then SHIELDS=0
  240. End Proc
  241. '
  242. Procedure _ALIENSHOT
  243.    Rem ##### if the shot is a new one determine which alien fired. then see if
  244.    Rem ##### that alien is alive, if not check for an alien above it. 
  245.    If NEWSHOT=1
  246.       NEWSHOT=0 : ALIEN=(Rnd(4))+16
  247.       If ALIENDEAD(ALIEN)=0
  248.          If ALIENDEAD(ALIEN-5)=0
  249.             Add ALIEN,-10
  250.          End If 
  251.          If ALIENDEAD(ALIEN)=0
  252.             Add ALIEN,-5
  253.          End If 
  254.          If ALIENDEAD(ALIEN)=0
  255.             ALIENSHOT=0 : ALIEN=0
  256.          End If 
  257.       End If 
  258.       Rem ##### if the alien selected is alive create new shot 
  259.       If ALIEN<>0
  260.          ALIENSHOTX=X(ALIEN) : ALIENSHOTY=Y(ALIEN)+5
  261.          ALIENSHOT=1
  262.       End If 
  263.    End If 
  264.    Rem ##### increase alien shot height if it has not yet reached the bottom
  265.    If ALIENSHOTY<=240 and ALIENSHOT=1
  266.       Bob 22,ALIENSHOTX,ALIENSHOTY,13
  267.       Add ALIENSHOTY,10
  268.       Rem ##### if the shot has reached the bottom turn off shot 
  269.    Else Bob Off 22 : ALIENSHOT=0
  270.    End If 
  271. End Proc
  272. '
  273. Procedure _MYSHOT
  274.    Rem ##### increase my shot height
  275.    SHOTY=SHOTY-20
  276.    Bob 21,SHOTX,SHOTY,12
  277.    Rem ##### check to see that my shot has not reached the top
  278.    If SHOTY<=0
  279.       SHOTX=0 : SHOTY=250 : SHOT=0 : Bob Off 21
  280.    End If 
  281. End Proc