' - Gosubs were only used to keep the procedure self contained!!!
Gosub SETUP_BAR
Gosub DUG
Gosub _BAR_TO_D
Gosub _PLAY_ANIM
Gosub BITMAP_D
Gosub D_TO_M
Gosub MATT
Gosub _PLAY_ANIM
Gosub BITMAP_M
Gosub M_TO_R
Gosub _AND_ROB
Gosub _PLAY_ANIM
Gosub BITMAP_R
Gosub R_TO_C
Gosub _OF_CYS
Gosub _PLAY_ANIM
Gosub C_TO_Y
Gosub _PLAY_ANIM
Gosub Y_TO_S
Gosub _PLAY_ANIM
Gosub _S_TO_LINE
Gosub CLR_CYS
Gosub _PLAY_ANIM
Gosub CLR_LINE
' - Clean up
Autoback 2
Synchro On
Bob Update On
Screen Close 0
Screen Close 2
Screen 1
_SCREEN_BRUSH
Erase 7
Erase 8
Erase 10
' - End of part
Pop Proc
_BAR_TO_D:
For X=1 To 12
Channel X To Bob X
Next X
' - Define animations
Amal 1," M 80,0,20 "
Amal 2," M 53,0,20 "
Amal 3," M 26,80,20 "
Amal 4," M -160,160,20 "
Amal 5," M -240,103,20 "
Amal 6," M -240,-54,20 "
Amal 7," M -200,-110,20 "
Amal 8," M -94,-50,20 "
Amal 9," M 43,-50,20 "
Amal 10," M 190,-90,20 "
Amal 11," M 150,-74,20 "
Amal 12," M 80,-17,20 "
Return
D_TO_M:
For X=2 To 12
Channel X To Bob X
Next X
Amal 2," M -40,0,20 "
Amal 3," M -80,-40,20 "
Amal 4," M 40,-160,20 "
Amal 5," M 160,-160,20 "
Amal 6," M 160,100,20 "
Amal 7," M 80,100,20 "
Amal 8," M 80,-40,20 "
Amal 9," M 10,0,20 "
Amal 10," M -70,0,20 "
Amal 11," M -30,120,20 "
Amal 12," M 0,120,20 "
Return
M_TO_R:
For X=2 To 12
Channel X To Bob X
Next X
Amal 2," M 120,0,20 "
Amal 3," M 80,60,20 "
Amal 4," M 0,100,20 "
Amal 5," M 0,160,20 "
Amal 6," M -120,-60,20 "
Amal 7," M -80,0,20 "
Amal 8," M -120,80,20 "
Amal 9," M -80,-60,20 "
Amal 10," M 80,-20,20 "
Amal 11," M 80,-120,20 "
Amal 12," M 0,-120,20 "
Return
R_TO_C:
For X=3 To 12
Channel X To Bob X
Next X
Amal 3," M 0,-40,20 "
Amal 4," M 0,-40,20 "
Amal 5," M -40,-120,20 "
Amal 6," M 0,-60,20 "
Amal 7," M 0,-40,20 "
Amal 8," M 120,-40,20 "
Amal 9," M 120,40,20 "
Amal 10," M 40,40,20 "
Amal 11," M 40,120,20 "
Amal 12," M 0,120,20 "
Return
C_TO_Y:
For X=2 To 12
Channel X To Bob X
Next X
Amal 2," M -120,0,20 "
Amal 3," M -120,-20,20 "
Amal 4," M 0,-20,20 "
Amal 5," M 0,-40,20 "
Amal 6," M 120,-40,20 "
Amal 7," M 120,40,20 "
Amal 8," M -120,40,20 "
Amal 9," M -120,20,20 "
Amal 10," M -40,20,20 "
Amal 11," M -40,-80,20 "
Amal 12," M 0,-80,20 "
Return
Y_TO_S:
For X=2 To 12
Channel X To Bob X
Next X
Amal 2," M 120,0,20 "
Amal 3," M 120,0,20 "
Amal 4," M -80,0,20 "
Amal 5," M -80,60,20 "
Amal 6," M 0,60,20 "
Amal 11," M 0,20,20 "
Amal 12," M 0,20,20 "
Return
_S_TO_LINE:
For X=1 To 12
Channel X To Bob X
Next X
Amal 1," M -80,90,20 "
Amal 2," M -210,90,20 "
Amal 3," M -180,50,20 "
Amal 4," M -30,50,20 "
Amal 5," M 0,30,20 "
Amal 6," M -90,30,20 "
Amal 7," M -60,-70,20 "
Amal 8," M 130,-70,20 "
Amal 9," M 160,-30,20 "
Amal 10," M 70,-30,20 "
Amal 11," M 100,-10,20 "
Amal 12," M 240,-10,20 "
Return
CLR_LINE:
Screen 0
Ink 8
For X=0 To 161
Screen Swap
Draw 0,130 To X,130
Draw 320,130 To 320-X,130
Next X
Return
SETUP_BAR:
Bob 1,0,40,0
Bob 2,107,40,0
Bob 3,214,40,0
Bob 4,320,40,0
Bob 5,320,97,0
Bob 6,320,154,0
Bob 7,320,210,0
Bob 8,214,210,0
Bob 9,107,210,0
Bob 10,0,210,0
Bob 11,0,154,0
Bob 12,0,97,0
For CTR=1 To 12
X(CTR)=X Bob(CTR)
Y(CTR)=Y Bob(CTR)
Next CTR
Polygon X(1),Y(1) To X(2),Y(2) To X(3),Y(3) To X(4),Y(4) To X(5),Y(5) To X(6),Y(6) To X(7),Y(7) To X(8),Y(8) To X(9),Y(9) To X(10),Y(10) To X(11),Y(11) To X(12),Y(12)
Screen Swap
Polygon X(1),Y(1) To X(2),Y(2) To X(3),Y(3) To X(4),Y(4) To X(5),Y(5) To X(6),Y(6) To X(7),Y(7) To X(8),Y(8) To X(9),Y(9) To X(10),Y(10) To X(11),Y(11) To X(12),Y(12)
Screen 1
Fade 2,,,,$FFF,,,,,,,$C11
Wait 30
Screen 0
Return
_PLAY_ANIM:
Amal On
COUNTER=0
Repeat
For CTR=1 To 12
X(CTR)=X Bob(CTR)
Y(CTR)=Y Bob(CTR)
Next CTR
Screen Swap : Wait Vbl : Cls 0
Polygon X(1),Y(1) To X(2),Y(2) To X(3),Y(3) To X(4),Y(4) To X(5),Y(5) To X(6),Y(6) To X(7),Y(7) To X(8),Y(8) To X(9),Y(9) To X(10),Y(10) To X(11),Y(11) To X(12),Y(12)
' - Show Screens (should be done with a fade but I don't know the colours!)
Screen Show 2
Screen Show 1
Screen Show 0
Screen 0
Double Buffer
Get Sprite Palette
' ----- Setup Bobs -----
' - Define channels for ship, bullet and aliens
For CTR=1 To NUM_BOBS
Channel CTR To Bob CTR
Next CTR
' - Position baddies off screen for starters
For ALIEN=3 To NUM_OF_BOBS
Bob ALIEN,340,240,ALIEN_SHIP
Next ALIEN
' - Define Bullet movement and position initial bullet
BULLET$="M 340,0,40 : Let X=800 : Let Y=500"
Bob BULLET,540,-60,BULLET
' - Define Alien death movement
ALIEN_DIE$="M 0,330,30"
' - Define Main Ship death animation
MAIN_DIE$="A 1,(15,3)(16,3)(17,3)(18,3)"
' - Define Text bob
Channel _TEXT_BOB To Bob _TEXT_BOB
_TEXT_ON$="M 0,50,25 ;"
_TEXT_OFF$="M 0,-50,25 ;"
Bob _TEXT_BOB,40,-30,_TEXT
' - Play or Quit text
Channel P_Q To Bob P_Q
P_Q_ON$="M 0,-50,25 ;"
P_Q_OFF$="M 0,50,25 ;"
' ----- Main Loop -----
_PLAYED_AND_DIED=False
Repeat
YOU_DIED_SCUMBAG=False
' - Display Play or Quit message
Bob P_Q,80,130,_PLAY_OR_QUIT
Amal P_Q,P_Q_ON$
Amal On
Wait 25
' - Do you want to play?
CHOSEN=False
Clear Key
Repeat
If Fire(1)
' - They want to play again - Hurrah!
_PLAY=True
CHOSEN=True
End If
If Inkey$=Chr$(27)
' - Oh No! They can't take any more!
_PLAY=False
CHOSEN=True
End If
Until CHOSEN
If _PLAY
Amal P_Q,P_Q_OFF$
If _PLAYED_AND_DIED
' - Remove Game Over text
Amal _TEXT_BOB,_TEXT_OFF$
_PLAYED_AND_DIED=False
End If
Amal On
Wait 25
Bob Off P_Q
' - Define variables - Variables are storage spaces which have been assigned names. The values held by these variables can change.
ALIENS_ALIVE=0
_WAVE_CTR=1
LIVES=_START_LIVES
SCORE=0
_TEXT=_GET_READY
BONUS_STAGE=False
GUARDIAN_STAGE=False
BACKGROUND=7
INERTIA=0
CONST_INERTIA=6
CONST_X_MAX=250
X_MAX=CONST_X_MAX
FINAL_STAGE=False
Gosub SETUP_BACKGROUND
' - Reset status screen
Gosub _UPDATE_SCORE
Gosub _UPDATE_LIVES
Gosub _UPDATE_LEVEL
' - Animate background screen (That's not animation!)
Screen 1 : Shift Down 1,2,7,1 : Screen 0
' ----- Game Loop -----
Repeat
' - Set alien wave - When all aliens are dead
If ALIENS_ALIVE=0
' - Firstly, make sure all aliens are off screen
Wait 10
' - Reset the max x movement
X_MAX=CONST_X_MAX
If GUARDIAN_STAGE
GUARDIAN_STAGE=False
If FINAL_STAGE
Gosub WELL_DONE
End If
Gosub SETUP_BACKGROUND
End If
' - Then test if they can go on the bonus stage
' - Proceed to the next level
On _WAVE_CTR Gosub _WAVE3,_WAVE1,_WAVE4,_WAVE10,_WAVE8,GUARD1,BONUS_WAVE,_WAVE5,_WAVE2,_WAVE7,_WAVE6,_WAVE13,BEAST,BONUS_WAVE,_WAVE14,_WAVE15,_WAVE9,_WAVE11,_WAVE12,GUARD_SKULL
Gosub _UPDATE_LEVEL
' - Then increase the level counter
Add _WAVE_CTR,1,1 To NUM_OF_WAVES
End If
' - Pause Mode
If Key State(25)
' - If they press P or p
Gosub PAUSE
End If
' ----- Ship controls -----
' - Move up
If Jup(1) and Y Bob(MAIN_SHIP)>-5
Bob MAIN_SHIP,,Y Bob(MAIN_SHIP)-SPEED,MAIN_SHIP
LASTDIR=_UP
INERTIA=CONST_INERTIA
End If
' - Move Down
If Jdown(1) and Y Bob(MAIN_SHIP)<100
Bob MAIN_SHIP,,Y Bob(MAIN_SHIP)+SPEED,MAIN_SHIP
LASTDIR=_DOWN
INERTIA=CONST_INERTIA
End If
' - Move Left
If Jleft(1) and X Bob(MAIN_SHIP)>0
Bob MAIN_SHIP,X Bob(MAIN_SHIP)-SPEED,,MAIN_SHIP
LASTDIR=_LEFT
INERTIA=CONST_INERTIA
End If
' - Move Right
If Jright(1) and X Bob(MAIN_SHIP)<X_MAX
Bob MAIN_SHIP,X Bob(MAIN_SHIP)+SPEED,,MAIN_SHIP
LASTDIR=_RIGHT
INERTIA=CONST_INERTIA
End If
' - If the joystick is central - Calculate inertia
If(Joy(1) and $F)=0 and INERTIA>0
Dec INERTIA
If LASTDIR=_UP and Y Bob(MAIN_SHIP)>-5
Bob MAIN_SHIP,,Y Bob(MAIN_SHIP)-1,MAIN_SHIP
Else
If LASTDIR=_DOWN and Y Bob(MAIN_SHIP)<100
Bob MAIN_SHIP,,Y Bob(MAIN_SHIP)+1,MAIN_SHIP
Else
If LASTDIR=_LEFT and X Bob(MAIN_SHIP)>0
Bob MAIN_SHIP,X Bob(MAIN_SHIP)-1,,MAIN_SHIP
Else
If LASTDIR=_RIGHT and X Bob(MAIN_SHIP)<X_MAX
Bob MAIN_SHIP,X Bob(MAIN_SHIP)+1,,MAIN_SHIP
End If
End If
End If
End If
End If
' - Fire bullet
If Fire(1)
If X Bob(BULLET)>320
Wait Vbl
Bob BULLET,X Bob(MAIN_SHIP)+26,Y Bob(MAIN_SHIP)+9,BULLET
Sam Play %1001,MAIN_SHIP_LASER,14000
Amal BULLET,BULLET$
Amal On BULLET
End If
End If
' ----- Test Collision -----
' - Kill Alien
If Bob Col(BULLET,3 To _MAX_KILL+2)
ALIEN=Col(-1)
Wait Vbl
Gosub YEAH_GOT_ONE
End If
' - Kill main ship
If Bob Col(MAIN_SHIP)
ALIEN=Col(-1)
Wait Vbl
Gosub AARRGH_THEY_GOT_ME
End If
Wait Vbl
Until Inkey$=Chr$(27) or YOU_DIED_SCUMBAG
If Not _PLAYED_AND_DIED
' - If they pressed escape...
Gosub GAME_OVER_DUDE
End If
End If
Until Not _PLAY
' ----- Clean up ----
Screen 0
Fade 1
Screen 1
Fade 1
Screen 0
Fade 1
Wait 15
' - Close screens
Screen Close 0
Screen Close 1
Screen Close 2
' - Erase banks (with all those banks you could start a bank!)
Erase 1
Erase 5
Erase 6
Erase 7
Erase 8
Erase 9
Erase 10
Pop Proc
' -------------------- THE END --------------------
' - Until we release the sequel! (Dug's already started it!!!)
' - Alien Wave 13 (Wheeeeeeeeel - Ya know what it is?)
Gosub _DEFINE_NEW_WAVE
' - Set colours
Palette ,,,,$F,$33E,$66D,$88C
' - Define wave direction and speed
ALIEN_MOVE1$="M 0,0,50 ; L: Let X=380 ; M -150,0,50 ; M 50,0,25 ; M -100,0,50 ; M 50,0,25 M -100,0,50 ; M 50,0,25 M -100,0,50 ; M 50,0,25 M -100,0,50 ; M 50,0,25 M -100,0,50 ; M 50,0,25 M -100,0,50 ; M 50,0,25 ; M -100,0,50 ; M 50,0,25 ; J L"
ALIEN_MOVE2$="M 0,0,60 ; L: Let X=380 ; M -150,0,50 ; M 50,0,25 ; M -100,0,50 ; M 50,0,25 M -100,0,50 ; M 50,0,25 M -100,0,50 ; M 50,0,25 M -100,0,50 ; M 50,0,25 M -100,0,50 ; M 50,0,25 M -100,0,50 ; M 50,0,25 ; M -100,0,50 ; M 50,0,25 ; J L"
ALIEN_MOVE3$="M 0,0,70 ; L: Let X=380 ; M -150,0,50 ; M 50,0,25 ; M -100,0,50 ; M 50,0,25 M -100,0,50 ; M 50,0,25 M -100,0,50 ; M 50,0,25 M -100,0,50 ; M 50,0,25 M -100,0,50 ; M 50,0,25 M -100,0,50 ; M 50,0,25 ; M -100,0,50 ; M 50,0,25 ; J L"