Sparse Invaders Source - Invaders Bullets.txt

Sparse Invaders Source - Invaders_Bullets.txt
;---   ;  Invader_Bullets ; Written by Neil Beresford. ;   ;  Copyright 2008,2009 Neil Beresford ;   ;    This file is part of Sparse Invaders. ;   Sparse Invaders is free software: you can redistribute it and/or modify ;   it under the terms of the GNU General Public License as published by    ;    the Free Software Foundation, either version 3 of the License, or    ;    (at your option) any later version. ;   ;    Sparse Invaders is distributed in the hope that it will be useful, ;   but WITHOUT ANY WARRANTY; without even the implied warranty of    ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;   GNU General Public License for more details. ;   ;    You should have received a copy of the GNU General Public License ;   along with Sparse Invaders. If not, see . ;   ;    ;   Notes: ;   Controls the bullet rate, speed and also collision. ;   ;---    .require "Constands" .require "Macros" ;---   .alias INIT_BULLETDELAY     60   ; initial delay between bullets .alias MAX_BULLETS         3    ; limited to three as want to keep in a frame - plus the complex sprite controller ... hmmm! .alias BULLET_SPEED        2    ; pixel speed of the bullet ;---   ; Init: ;  initializes the bullet system ;---   Init: LDA #0 STA BULLET_COUNT LDA #$ff STA INV_PICKED1 STA INV_PICKED2 STA INV_PICKED3 LDA #INIT_BULLETDELAY STA BULLET_DELAY STA BULLET_REFRESHDELAY LDA #24-1     ; total invaders - starts at the bottom... STA BULLETINVLAST RTS ;---   ; Control: ;  controls the spawning of the bullets ... ;---   Control: LDA GAME_STATE CMP GAME_STATE_PLAYING BNE C_end DEC BULLET_DELAY BNE C_end LDA BULLET_REFRESHDELAY STA BULLET_DELAY ; check number of active bullets ... LDA BULLET_COUNT CMP #MAX_BULLETS BEQ C_end ; start bullet off ... LDA BULLETINVLAST JSR Invader_Baddies.Baddies_GetInvader CMP #$ff BEQ C_end ; store the bullet details... LDX #$ff CPX INV_PICKED1 BNE C_try2 STA INV_PICKED1 LDX #0 STX SCRATCH3 JMP C_cont C_try2: CPX INV_PICKED2 BNE C_try3 STA INV_PICKED2 LDX #1 STX SCRATCH3 JMP C_cont C_try3: CPX INV_PICKED3 BNE C_end STA INV_PICKED3 LDX #2 STX SCRATCH3 C_cont: STA SCRATCH4 LDY #3 LDA (USERPTR),Y TAX INX INX INY LDA (USERPTR),Y CLC ADC #6 TAY LDA #Bullet_SprControl STA CALLPARAM2 LDA #1 STA SPRITE INC BULLET_COUNT LDA #INVBULLET1_SPRITE_SLOT CLC ADC SCRATCH3 JSR SpriteController.SpriteStart LDX CURRENT_SPRITE LDA SCRATCH4 STA Bullet_InvaderLink,X C_end: RTS ;---   ; Bullet_SprControl: ;  control for the sprite routine...    ;   TEMPPTR is set ot point to the sprite data. ;---   Bullet_SprControl: LDA GAME_STATE CMP GAME_STATE_PLAYING BNE BCS_Kill ; store the position for reference ... LDY #SPRBLK_X LDA (TEMPPTR),Y STA XPOS INY LDA (TEMPPTR),Y ; move the position of the bullet ... CLC ADC #BULLET_SPEED STA (TEMPPTR),Y STA YPOS CMP #PLAYER_STARTY+8 BCS BCS_kill CMP #PLAYER_STARTY BCC BCS_end ; check x position for hitting the player LDA PLAYER_X SEC SBC #1 CMP XPOS BCS BCS_end CLC ADC #3 CMP XPOS BCS BCS_hitplayer BCS_end: ; check for base collison ... LDX XPOS LDY YPOS JSR Invader_Bases.CheckCollison BCS BCS_kill ; flag sprite for redraw and continue... LDY #SPRBLK_FLAG LDA (TEMPPTR),Y ORA #SPRFLAG_REDRAW STA (TEMPPTR),Y LDA ACTIVEINDEX STA SCRATCH1 JMP SpriteController.SpriteMoveSpr BCS_hitplayer: ; sort out the player ... LDA #3			;long exp JSR Sound._MAKE_SOUND DEC PLAYER_LIFES BNE BCS_startexplosion JSR Invader_Bullets.RemoveBullets JSR Invader_Player.PBM_killBullet JSR SpriteController.SpritesWipeActive JSR Invader_Player.Player_GameOver JSR ScreenFunctionality.Screen_Clear  ; clear the screen... JMP Main.main_restart BCS_startexplosion: LDA #1 STA SCREEN_UPDATE ; try and start an explosion off LDA TEMPPTR PHA LDA TEMPPTR+1 PHA LDA ACTIVEINDEX PHA LDX PLAYER_X DEX LDY PLAYER_Y JSR Invader_Player.Player_ExplosionStart PLA STA ACTIVEINDEX PLA STA TEMPPTR+1 PLA STA TEMPPTR BCS_Kill: DEC BULLET_COUNT LDY #SPRBLK_FLAG LDA (TEMPPTR),Y ORA #SPRFLAG_REDRAW + SPRFLAG_KILL STA (TEMPPTR),Y LDY ACTIVEINDEX LDX Bullet_InvaderLink,Y LDA #$ff STA Bullet_InvaderLink,Y TXA LDX #$ff CMP INV_PICKED1 BNE BCS_try2 STX INV_PICKED1 RTS BCS_try2: CMP INV_PICKED2 BNE BCS_try3 STX INV_PICKED2 RTS BCS_try3: CMP INV_PICKED3 BNE BCS_skip3 STX INV_PICKED3 BCS_skip3: RTS ;---   ; RemoveFromLink: ;  Removes the invader from the link data...    ;   A - invader to remove. ;---   RemoveFromLink: LDY #INVBULLET1_SPRITE_SLOT CMP Bullet_InvaderLink,Y BNE RFL_try2 LDA #$ff STA Bullet_InvaderLink,Y RTS RFL_try2: INY CMP Bullet_InvaderLink,Y BNE RFL_try3 LDA #$ff STA Bullet_InvaderLink,Y RTS RFL_try3: INY CMP Bullet_InvaderLink,Y BNE RFL_end LDA #$ff STA Bullet_InvaderLink,Y RFL_end: RTS ;---   ; RemoveFromLink: ;  Removes the invader bullets, this is end of level or game... ;---   RemoveBullets: ; clear the bullet count LDA #0 STA BULLET_COUNT ; clear the buffers ... LDY #INVBULLET1_SPRITE_SLOT LDA #$ff STA Bullet_InvaderLink,Y INY STA Bullet_InvaderLink,Y INY STA Bullet_InvaderLink,Y STA INV_PICKED1 STA INV_PICKED2 STA INV_PICKED3 ; clear the sprite bank... LDA #INVBULLET1_SPRITE_SLOT*16 LDX #SPRFLAG_KILL + SPRFLAG_REDRAW JSR SpriteController.Sprite_SetFlag LDA #INVBULLET2_SPRITE_SLOT*16 LDX #SPRFLAG_KILL + SPRFLAG_REDRAW JSR SpriteController.Sprite_SetFlag LDA #INVBULLET3_SPRITE_SLOT*16 LDX #SPRFLAG_KILL + SPRFLAG_REDRAW JMP SpriteController.Sprite_SetFlag ;---   Bullet_InvaderLink: .byte 0,0,0,0,0,0,0,0  ; linked to the 8 possible active sprites...                              ; to be honest, this could be 3 bytes! ;---   ;  End of Invader_Bullets ;---