home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AMOS PD CD
/
amospdcd.iso
/
451-475
/
apd473
/
amos_invaders.amos
/
amos_invaders.amosSourceCode
Wrap
AMOS Source Code
|
1993-03-07
|
9KB
|
281 lines
Rem ##### intro screen
Dir$="df0:"
Load Iff "intro.iff",0
Hide : Print : Centre "PRESS THE FIRE BUTTON"
LLOOP: If Fire(1)<>-1 Then Goto LLOOP
Fade 10
Wait 10*15
Rem ##### set up screen
Screen Open 0,320,256,16,LORES
Curs Off : Cls 0 : Flash 3,"(fff,40)(bb0,30)"
Rem ##### load aliens
Load "spacenasties.abk",1
Double Buffer
Get Sprite Palette
Rem ##### give sprites a mask
Make Mask 5 : Make Mask 6
Rem ##### set up variables
Dim X(20),Y(20),ALIENDEAD(20)
Global X(),Y(),WHERETO,SPEED,SEP,X,N0,S0,ALIENDEAD(),ALIVE,SHIELDS,SCORE$
Global LEVEL,SCORE,ALIENSHOT,SHOT,SHOTY,SHOTX,HISORMINE,LIVES
Global NEWSHOT,ALIENSHOTX,ALIENSHOTY,SHIELD1,SHIELD2,SHIELD3
N0=1 : X=150 : S0=5 : SHOTX=0 : SHOTY=240 : SHOT=0 : SCORE$="0" : LIVES=3
LEVEL=0 : SCORE=0 : ALIENSHOTX=0 : NEWSHOT=0 : ALIENSHOT=0 : ALIENSHOTY=0
Ink 3,0 : Paper 0 : Pen 3
Rem ##### make sure all hot spots are central
For COUNT=1 To 20
Hot Spot COUNT,$11
Next COUNT
Proc _MAIN
'
Procedure _MAIN
Rem ##### set up variables specific to each new level
SHIELDS=-1 : SEP=0 : ALIVE=20 : SPEED=1 : WHERETO=5 : Add LEVEL,1
MOVE=0 : SHIELD1=0 : SHIELD2=0 : SHIELD3=0 : HISORMINE=0
Rem ##### calculate positions for aliens
For COUNT=1 To 20
Read X(COUNT),Y(COUNT) : ALIENDEAD(COUNT)=COUNT
If LEVEL<=12
Y(COUNT)=Y(COUNT)+((LEVEL-1)*10)
Else Y(COUNT)=Y(COUNT)+110
End If
Next COUNT
Rem ##### give shields to levels 1 to 11
If LEVEL<=12 Then Bob 23,50,215,11 : Bob 24,150,215,11 : Bob 25,250,215,11
Locate 12,0 : Print "LEVEL";LEVEL;" SCORE ";SCORE$
'
Rem ##### position data
Data 20,20,40,20,60,20,80,20,100,20
Data 20,40,40,40,60,40,80,40,100,40
Data 20,60,40,60,60,60,80,60,100,60
Data 20,80,40,80,60,80,80,80,100,80
'
Do
Bob Update Off
Rem ##### rotate alien legs
Add N0,1,1 To 4
Rem ##### control alien shots
If ALIENSHOT=1 Then Proc _ALIENSHOT
If ALIENSHOT=0 Then NEWSHOT=1 : Proc _ALIENSHOT
Rem ##### control my ship
If Jleft(1) Then Add X,-10 : S0=5
If Jright(1) Then Add X,10 : S0=6
If S0=6
S0=5
Else S0=6
End If
If X<15 Then X=15
If X>290 Then X=290
Sprite 0,X Hard(X),Y Hard(240),S0
Rem ##### display lives left
If LIVES>=3
Sprite 2,X Hard(10),Y Hard(10),S0
End If
If LIVES>=2
Sprite 4,X Hard(30),Y Hard(10),S0
End If
If LIVES>=1
Sprite 6,X Hard(50),Y Hard(10),S0
End If
'
Rem ##### check for collisions
Bob Update
If Bob Col(21,1 To 20) Then SHOT=0 : SHOTY=0 : Bob Off 21 : Proc _GOTONE
If Spritebob Col(0,1 To 20) Then LIVES=0 : Proc _DEAD
If Spritebob Col(0,22 To 22) Then Proc _DEAD
If Bob Col(22,23 To 25) Then Proc _GOTSHIELD
If Bob Col(21,23 To 25) Then HISORMINE=-1 : Proc _GOTSHIELD
Rem ##### move aliens
Proc _XMOVE
Rem ##### control my shot
If Fire(1) Then Shoot : SHOT=1
If SHOT=1 Then Proc _MYSHOT
If SHOT=0 Then SHOTX=X
Loop
End Proc
'
Procedure _XMOVE
Rem ##### increment speed if whereto=5 or decrement if whereto=-5
For COUNT=1 To 20
If WHERETO=5
Add X(COUNT),SPEED
Else Add X(COUNT),-SPEED
End If
Rem ##### check to see that only live aliens 'bounce' of edges and move down
If ALIENDEAD(COUNT)<>0 and X(COUNT)>=310 Then MOVE=-1
If ALIENDEAD(COUNT)<>0 and X(COUNT)<=10 Then MOVE=-1
Rem ##### display only aliens still alive
If ALIENDEAD(COUNT)<>0 Then Bob COUNT,X(COUNT),Y(COUNT),N0
Next COUNT
Rem ##### if an alive alien touched the edge then move down
If MOVE Then MOVE=0 : Proc _YMOVE
End Proc
'
Procedure _YMOVE
Rem ##### make aliens move opposite way
If WHERETO=5
WHERETO=-5
Else WHERETO=5
End If
Rem ##### increment height of aliens
For COUNT=1 To 20
Add Y(COUNT),5
Next COUNT
Rem ##### check to see if shields still exist, if so destroy if aliens are low enough
If SHIELDS
For COUNT=1 To 20
If ALIENDEAD(COUNT)<>0 and Y(COUNT)>180
If SHIELDS
Rem ##### blow up shields
For COUNT1=1 To 5
If SHIELD1<>0
Boom : Bob 23,50,215,COUNT1+14
End If
If SHIELD2<>0
Boom : Bob 24,150,215,COUNT1+14
End If
If SHIELD3<>0
Boom : Bob 25,250,215,COUNT1+14
End If
Bob Update : Wait 15
Next COUNT1
Rem ##### turn shields off
Bob Off 23 : Bob Off 24 : Bob Off 25 : SHIELDS=0
End If
End If
Next COUNT
End If
End Proc
'
Procedure _DEAD
Wait 15 : Dec LIVES
Sprite Off 0 : Bob Off 22
Rem ##### display ship blowing up
For DEAD=7 To 10
Bob 21,X+10,230,DEAD : Wait 2 : Wait Vbl
Bob Update
Next DEAD
Rem ##### make ship blowing up noise
For NOISE=62 To 0 Step -2
Volume NOISE : Boom : Wait 1
Next NOISE
Volume 63 : Sprite Off
Rem ##### if dead execute game over sequence
If LIVES=<0
Bob Off : Cls 0 : Locate 15,13 : Print "GAME OVER"
Locate 13,15 : Print "YOU SCORED ";SCORE$ : Wait 150 : Locate 15,17
Print "PLAY AGAIN" : Locate 16,19 : Print "Y OR N"
Clear Key
TEST:
If Inkey$="y"
Cls 0 : LEVEL=0 : LIVES=3 : Proc _MAIN
End If
If Inkey$="n"
End
End If
Goto TEST
Else Bob Off 21
End If
End Proc
'
Procedure _GOTONE
Rem ##### check to find which alien was hit. then decrement amount left alive
For COUNT=1 To 20
If Col(COUNT)
Bob COUNT,X(COUNT),Y(COUNT),14 : Boom
Bob Update : ALIENDEAD(COUNT)=0 : Bob Off COUNT
End If
Next COUNT
Dec ALIVE : SCORE=Val(SCORE$)+50
Rem ##### increase score. strings were used because they diplayed quicker
SCORE$=Str$(SCORE) : Text 208,6,SCORE$
Rem ##### work out new speed, according to aliens alive
SPEED=Int(Abs(ALIVE-20)/2+1)
Rem ##### check to see if level has been completed
If ALIVE=0
Sprite Off 0 : Bob Off : Cls 0 : Locate 13,13 : Print "WHAT A SHOW OFF"
Locate 13,15 : Print "CURRENT SCORE";SCORE$ : Wait 150
Cls 0 : ALIENSHOT=0 : Proc _MAIN
End If
End Proc
'
Procedure _GOTSHIELD
Rem ##### find out who hit the shield, so you can turn off the shot
If HISORMINE
HISORMINE=0 : GOB=21 : SHOT=0 : SHOTY=-1
Else GOB=22
End If
Rem ##### find out which shield was hit
If Bob Col(23)
Inc SHIELD1 : Bob 23,50,215,SHIELD1+14 : Bob Off GOB : NEWSHOT=1
Boom
Rem ##### check to see if shot was fatal. if so blow up shield
If SHIELD1=5
Bob 23,50,215,19 : Boom : Bob Update : Wait 10 : Bob 23,50,215,20
Boom : Bob Update : Wait 10 : Bob Off 23 : SHIELD1=0 : Bob Off GOB
NEWSHOT=1
End If
End If
If Bob Col(24)
Inc SHIELD2 : Bob 24,150,215,SHIELD2+14 : Bob Off GOB : NEWSHOT=1
Boom
Rem ##### check to see if shot was fatal. if so blow up shield
If SHIELD2=5
Bob 24,150,215,19 : Boom : Bob Update : Wait 10 : Bob 24,150,215,20
Boom : Bob Update : Wait 10 : Bob Off 24 : SHIELD2=0 : Bob Off GOB
NEWSHOT=1
End If
End If
If Bob Col(25)
Inc SHIELD3 : Bob 25,250,215,SHIELD3+14 : Bob Off GOB : NEWSHOT=1
Boom
Rem ##### check to see if shot was fatal. if so blow up shield
If SHIELD3=5
Bob 25,250,215,19 : Boom : Bob Update : Wait 10 : Bob 25,250,215,20
Boom : Bob Update : Wait 10 : Bob Off 25 : SHIELD3=0 : Bob Off GOB
NEWSHOT=1
End If
End If
If SHIELD1=0 and SHIELD2=0 and SHIELD3=0 Then SHIELDS=0
End Proc
'
Procedure _ALIENSHOT
Rem ##### if the shot is a new one determine which alien fired. then see if
Rem ##### that alien is alive, if not check for an alien above it.
If NEWSHOT=1
NEWSHOT=0 : ALIEN=(Rnd(4))+16
If ALIENDEAD(ALIEN)=0
If ALIENDEAD(ALIEN-5)=0
Add ALIEN,-10
End If
If ALIENDEAD(ALIEN)=0
Add ALIEN,-5
End If
If ALIENDEAD(ALIEN)=0
ALIENSHOT=0 : ALIEN=0
End If
End If
Rem ##### if the alien selected is alive create new shot
If ALIEN<>0
ALIENSHOTX=X(ALIEN) : ALIENSHOTY=Y(ALIEN)+5
ALIENSHOT=1
End If
End If
Rem ##### increase alien shot height if it has not yet reached the bottom
If ALIENSHOTY<=240 and ALIENSHOT=1
Bob 22,ALIENSHOTX,ALIENSHOTY,13
Add ALIENSHOTY,10
Rem ##### if the shot has reached the bottom turn off shot
Else Bob Off 22 : ALIENSHOT=0
End If
End Proc
'
Procedure _MYSHOT
Rem ##### increase my shot height
SHOTY=SHOTY-20
Bob 21,SHOTX,SHOTY,12
Rem ##### check to see that my shot has not reached the top
If SHOTY<=0
SHOTX=0 : SHOTY=250 : SHOT=0 : Bob Off 21
End If
End Proc