Sparse Invaders Source Invaders Baddies.txt - simondotm/stardot-wiki GitHub Wiki

Sparse Invaders Source - Invaders_Baddies.txt

   ;-------------------------------------------------------------------------------    ;

   ;  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 <http://www.gnu.org/licenses/>.

   ;

   ;

   ;   Notes:

   ;

   ;-------------------------------------------------------------------------------

   

   .require "Constands"

   .require "Macros"

   

   ;-------------------------------------------------------------------------------

   

   .alias  FRAME_UPDATESTARTDELAY   25

   .alias  MOTHER_DELAYMOVE         2

   

   .alias  MOTHER_STATE_INACTIVE    0

   .alias  MOTHER_STATE_MOVE        1

   .alias  MOTHER_STATE_END         2

   .alias  MOTHER_STATE_SHOT        3

   

   ;-------------------------------------------------------------------------------

   

   ;-------------------------------------------------------------------------------

   ;  BaddiesNewGame:

   ;    initializes at the start of game...

   ;-------------------------------------------------------------------------------

   BaddiesNewGame:

   

      LDA  #40

      STA  BadStartHeight

      LDA  #FRAME_UPDATESTARTDELAY  

      STA  INVADER_RESTARTDELAY

   

      JSR  ScreenFunctionality.ClearScore

      

      ; setup graphic details for sprite 1

      LDA  #2

      JSR  SpriteController.SpriteRetreiveDetails

      STA  BadGfxWidth

      STX  BadGfxHeight   

      LDA  CURRENTSPRITEDATA

      STA  BadGfx1

      STA  BadGfx3

      LDA  CURRENTSPRITEDATA+1

      STA  BadGfx1+1

      STA  BadGfx3+1

   

      ; setup graphic details for sprite 2

      LDA  #3

      JSR  SpriteController.SpriteRetreiveDetails

      LDA  CURRENTSPRITEDATA

      STA  BadGfx2

      LDA  CURRENTSPRITEDATA+1

      STA  BadGfx2+1

   

      ; setup graphic details for mother ship

      LDA  #4

      STA  BadMotherGfxNum

      JSR  SpriteController.SpriteRetreiveDetails

      LDA  CURRENTSPRITEDATA

      STA  BadMotherGfx

      LDA  CURRENTSPRITEDATA+1

      STA  BadMotherGfx+1

    

      ; setup the details for the mother ship...

   

      LDA  #MOTHER_STATE_INACTIVE

      STA  BadMotherState

      LDA  #$ff

      STA  BadMotherCount

      LDA  #2

      STA  BadMotherXPos

   

   

   

      ; setup the bullet system for the invaders

      JMP  Invader_Bullets.Init

   

   

        

   ;-------------------------------------------------------------------------------

   ;  BaddiesInit:

   ;    initializes the baddies at the start of the level and game...

   ;-------------------------------------------------------------------------------

   BaddiesInit:

   

      LDA  #24

      STA  TOTAL_INVADERS

   

      ; setup the details for positioning of the baddies...

      LDA  #3

      STA  XPOS

      STA  BadXPos

      LDA  BadStartHeight

      STA  YPOS

      STA  BadYPos

   

   BI_reposition:

   

      LDX  #0      ; first sprite ...

      LDY  #2      ; starting frame ...

      LDA  #6  ; TEst was 6

      STA  SCRATCH1

      LDA  #4  ; TEST was 4

      STA  SCRATCH2

   

   BI_SetupBaddies:   

   

      LDA  BadXPos

      STA  XPOS

      LDA  BadYPos

      STA  YPOS

   

      ; adjust Y pos to bottom of sprite,

      LDA  BadGfxHeight

      CLC

      ADC  YPOS

      SEC

      SBC  #1

      STA  YPOS

   

      ; adjust the YPOS to character based and store the offset in x for indexing

      AND  #$07

      STA  XOFFSET

      LDA  YPOS

      AND  #$f8

      STA  YPOS

   

      TXA

      PHA

      TYA

      PHA

      JSR  SpriteController.SpriteCalcScreenPos

      PLA

      TAY

      PLA

      TAX

   

      ;store all the details...

      LDA  SCREENADD

      STA  BaddieData,X

      INX

      LDA  SCREENADD+1

      STA  BaddieData,X

      INX

      LDA  XOFFSET

      STA  BaddieData,X   

      INX

      LDA  BadXPos

      STA  BaddieData,X

      INX

      LDA  BadYPos

      STA  BaddieData,X

      INX

      LDA  #INV_STATE_ACTIVE

      STA  BaddieData,X

      INX

   

   

   

      ; calc the new baddies position...

      LDA  BadXPos

      CLC

      ADC  #6

      STA  BadXPos

   

      DEC  SCRATCH1

      BNE  BI_SetupBaddies

   

   

      LDA  #3

      STA  BadXPos

      LDA  BadYPos

      CLC

      ADC  #12

      STA  BadYPos

      LDA  #6

      STA  SCRATCH1

      

      DEC  SCRATCH2

      BNE  BI_SetupBaddies

   

      LDA  #1

      STA  INV_MOVDIR

      LDA  #INV_MODE_STARTUP

      STA  BadMode

   

      ; speed the bullet rate up on 

      LDA  #150

      STA  BULLET_DELAY

   

      LDA  BULLET_REFRESHDELAY

      SEC

      SBC  #10

      CMP  #10

      BPL  BI_Cont

      LDA  #10

   

   BI_cont:

   

      STA  BULLET_REFRESHDELAY

   

      ; finally sort out the frame delay ...

      LDA  INVADER_RESTARTDELAY

      STA  INV_DELAYCOUNT

      STA  INV_DELAYUPDATE

   

   

      jsr  Invader_Bases.Init

   

      RTS

      

   

      

   ;-------------------------------------------------------------------------------

   ;  BaddiesDraw:

   ;    draws all the invaders to screen at start of level...

   ;-------------------------------------------------------------------------------

   BaddiesDraw:

   

      LDY  #24

      LDX  #0

   

   DB_DrawInvaders:

   

      TYA

      PHA

      

      TXA

      CLC

      ADC  #5

      TAY

      

      LDA  BaddieData,Y

      CMP  #INV_STATE_ACTIVE

      BEQ  DB_draw

      CMP  #INV_STATE_DEAD

      BEQ  DB_SkipRemove

   

      LDA  #INV_STATE_DEAD

      STA  BaddieData,Y

      

      TXA

      PHA

      JSR  Baddies_RemoveInvader

      PLA

      TAX

   

   DB_skipRemove:   

      

      TXA

      CLC

      ADC  #6

      TAX

      JMP  DB_SkipDraw

   

   DB_draw:   

   

      TAY

      

      LDA  BaddieData,X

      STA  SCREENADD

      INX   

      LDA  BaddieData,X

      STA  SCREENADD+1

      INX   

      LDA  BaddieData,X

      STA  XOFFSET

      INX   

      INX   

      INX

      INX

      

   

      LDA  BadGfx1

      STA  CURRENTSPRITEDATA

      LDA  BadGfx1+1

      STA  CURRENTSPRITEDATA+1

   

      LDA  BadGfxWidth

      STA  WIDTH

      LDA  BadGfxHeight

      STA  HEIGHT

   

      TXA

      PHA

      JSR  SpriteController.SpriteNoMaskDraw

      PLA

      TAX   

   

   DB_SkipDraw:

   

      PLA

      TAY

      

      DEY

      BNE  DB_DrawInvaders

      

      RTS

   

   

   BaddieSound:

   

       LDA MISSFIRSTSOUND

       BEQ over

   

       LDA BadMotherState

       CMP  #1

       BEQ  over2

   

       LDA #9     ;invader step sound

       JSR Sound._MAKE_SOUND

   

   over:

     LDA #1

       STA MissFirstSound

   

   over2:

     RTS

   

   ;-------------------------------------------------------------------------------

   ;  BaddiesUpdate:

   ;    Updates the invaders ...

   ;-------------------------------------------------------------------------------

   BaddiesUpdate:

   

      LDA  INV_DELAYCOUNT

      BEQ  BU_Update

   

      DEC  INV_DELAYCOUNT

      BEQ  BU_jump

      RTS

   

   BU_jump:

   

      jsr BaddieSound

   

      LDA  BadMode

      ASL

      TAX

      LDA  BadModeJump,X

      STA  TEMPPTR

      INX

      LDA  BadModeJump,X

      STA  TEMPPTR+1

      JMP  (TEMPPTR)

             

   

   BadModeJump:

   

      .word BadddiesUpdate_Mode_startup

      .word BadddiesUpdate_Mode_WalkLeft

      .word BadddiesUpdate_Mode_WalkRight

      .word BadddiesUpdate_Mode_WalkDown

      .word BadddiesUpdate_Mode_Invaded

   

   

   ;-------------------------------------------------------------------------------

   ;  BadddiesUpdate_Mode_startup:

   ;    initializes the baddies, starting them ...

   ;-------------------------------------------------------------------------------

   BadddiesUpdate_Mode_startup:

   

      LDA  INV_DELAYUPDATE

      ASL

      ASL

      STA  INV_DELAYCOUNT

      LDA  #INV_MODE_WALKRIGHT

      STA  BadMode

      LDA  #2

      STA  INV_FRAME

      LDA  #0

      STA  INV_YMOVDIR

      RTS

   

   ;-------------------------------------------------------------------------------

   ;  BadddiesUpdate_Mode_WalkLeft:

   ;    Walks the baddies left - this checks for the left limit then makes them 

   ;    go down...

   ;-------------------------------------------------------------------------------

   BadddiesUpdate_Mode_WalkLeft:

   

      LDA  #$ff

      STA  INV_MOVDIR

      JMP  BU_Update

   

   ;-------------------------------------------------------------------------------

   ;  BadddiesUpdate_Mode_WalkRight:

   ;    Walks the baddies right - this checks for the right limit then makes them 

   ;    go down...

   ;-------------------------------------------------------------------------------

   BadddiesUpdate_Mode_WalkRight:

   

      LDA  #1

      STA  INV_MOVDIR

      JMP  BU_Update

   

   ;-------------------------------------------------------------------------------

   ;  BadddiesUpdate_Mode_WalkDown:

   ;    Walks the baddies down 8 pixels - then starts invaders going left or right 

   ;-------------------------------------------------------------------------------

   BadddiesUpdate_Mode_WalkDown:

   

      DEC  BadInvYRef

      BNE  BU_godown

   

      LDA  INV_DELAYUPDATE

      STA  INV_DELAYCOUNT

      LDA  #2

      STA  INV_FRAME

    

      LDA  #0

      STA  INV_YMOVDIR

      LDA  BadFLag+2

      STA  BadMode

      RTS

      

   BU_godown:

   

      LDA  #1

      STA  INV_YMOVDIR

      LDA  #0

      STA  INV_MOVDIR

      JMP  BU_Update

   

   

   ;-------------------------------------------------------------------------------

   ;  BadddiesUpdate_Mode_Invaded:

   ;    Invaders have won - sigh

   ;-------------------------------------------------------------------------------

   BadddiesUpdate_Mode_Invaded:

   

      LDA  INV_DELAYUPDATE

      STA  INV_DELAYCOUNT

      LDA  #0

      STA  INV_YMOVDIR

   

      jsr  Invader_Player.Player_GameOver

      jsr  ScreenFunctionality.Screen_Clear  ; clear the screen...

   

      JMP  Main.main_restart

   

   

   ;-------------------------------------------------------------------------------

   ;  BU_Update:

   ;    Moves the invader according to mode, checks limits then draws them

   ;-------------------------------------------------------------------------------

   BU_Update:

   

       DEC  INV_FRAME

       BNE  BU_checkGroup  

       LDA  #2

       STA  INV_FRAME

   

   BU_checkGroup:

      

      LDA  #0

      LDX  INV_FRAME

      CPX  #1

      BEQ  BU_dotop

      

      LDA  #72

   

      ; move the top row of invaders one place

   BU_dotop:

   

      LDY  #12

      STA  SCRATCH1

   

   BU_Loop:

   

      PHA

   

      CLC

      ADC  #3

      TAX

   

      TYA

      PHA

   

      TXA

      CLC

      ADC  #2

      TAY

   

      LDA  BaddieData,Y

      CMP  #INV_STATE_ACTIVE

      BEQ  BU_CalcMove

      

      PLA

      TAY

   

      TXA

      CLC

      ADC  #3

      TAX

   

      PLA

      CLC

      ADC  #6

   

      JMP BU_SkipInvader

   

      

   BU_CalcMove:   

   

      PLA

      TAY

      

      LDA  BaddieData,X

      CLC

      ADC  INV_MOVDIR

      STA  XPOS

      STA  BadXPos

   

      INX

      LDA  BaddieData,X  

      CLC

      ADC  INV_YMOVDIR

      STA  YPOS

      STA  BadYPos

   

   

      ; adjust Y pos to bottom of sprite,

      LDA  BadGfxHeight

      CLC

      ADC  YPOS

      SEC

      SBC  #1

      STA  YPOS

   

      ; adjust the YPOS to character based and store the offset in x for indexing

      AND  #$07

      STA  XOFFSET

      LDA  YPOS

      AND  #$f8

      STA  YPOS

   

      TYA

      PHA

      JSR  SpriteController.SpriteCalcScreenPos

      PLA

      TAY

   

      PLA

      TAX

      

      ;store all the details...

   

      LDA  SCREENADD

      STA  BaddieData,X

      INX

      LDA  SCREENADD+1

      STA  BaddieData,X

      INX

      LDA  XOFFSET

      STA  BaddieData,X   

      INX

      LDA  BadXPos

      STA  BaddieData,X

      INX

      LDA  BadYPos

      STA  BaddieData,X

      INX

      INX   

   

      ; skip leftright check if going down...

      LDA  BadMode

      CMP  #INV_MODE_WALKDOWN

      BEQ  BU_SkipChange

      

      ; check and change direction...

      LDA  BadMode

      CMP  #INV_MODE_WALKLEFT

      BEQ  BU_CheckLeft

      LDA  BadXPos

      CMP  #74

      BCC  BU_CheckLeft

   

      LDA  BadInvYRef

      BNE  BU_CheckLeft

      LDA  #INV_MODE_WALKLEFT

      STA  BadFlag+2

      LDA  #INV_MODE_WALKDOWN

      STA  BadFlag+1

      LDA  #8

      STA  BadInvYRef

      JMP  BU_skipChange   

   

   BU_checkLeft:

   

      LDA  BadMode

      CMP  #INV_MODE_WALKRIGHT

      BEQ  BU_skipChange

      LDA  BadXPos

      CMP  #2

      BCS  BU_skipChange

   

      

      LDA  BadInvYRef

      BNE  BU_skipChange

      LDA  #INV_MODE_WALKRIGHT

      STA  BadFlag+2

      LDA  #INV_MODE_WALKDOWN

      STA  BadFlag+1

      LDA  #8

      STA  BadInvYRef

   

   BU_skipChange:

   

      TXA

   

   BU_skipInvader:

      

      DEY

      BEQ  BU_DoDraw

      JMP  BU_Loop         

   

   BU_DoDraw: 

   

      ; if needed - blank the base line when invader reaches it

      PHA

      LDA SCRATCH1

      PHA

   

      ; calc the Y height in blocks - reference the bottom of the last invader

      ; calculated .... 

      LDA  BadYPos

      CLC

      ADC  #6

      LSR

      LSR

      LSR

      TAY

      JSR  Invader_Bases.BlankLine

   

      PLA

      STA  SCRATCH1

      PLA

   

      LDX  SCRATCH1

      LDY  #12

      JSR  DB_DrawInvaders

   

      LDA  SCRATCH1

      BEQ  BU_Cont

   

      LDA  INV_DELAYUPDATE

      STA  INV_DELAYCOUNT

      LDA  #2

      STA  INV_FRAME

   

      LDA  BadYPos

      CMP  #215

      BCC  BU_ChangeGfx

      

      LDA  #INV_MODE_INVADED  

      STA  BadMode

   

      RTS

   

   BU_ChangeGfx:

   

      LDA  BadGfx3

      STA  BadGfx1

      LDA  BadGfx3+1

      STA  BadGfx1+1

      LDA  BadFLag

      EOR  #1

      STA  BadFlag

      BEQ  BU_cont

   

      LDA  BadGfx2

      STA  BadGfx1

      LDA  BadGfx2+1

      STA  BadGfx1+1

   

      LDA  BadFlag+1

      BEQ  BU_cont

      STA  BadMode

      LDA  #0

      STA  BadFlag+1

     

   

   BU_cont:

   

      RTS

   

   ;-------------------------------------------------------------------------------

   ;  Check Various Game states

   ;-------------------------------------------------------------------------------

   ;-------------------------------------------------------------------------------

   ;  BaddiesGeneralUpdate:

   ;    General updates and checks

   ;-------------------------------------------------------------------------------

   BaddiesGeneralUpdate:

   

      ; These should be impemented as states or flagged for process...

      ; Will no doubt revisit later...

      

      ; ok - monitor explosion here ... sigh!

      LDA  EXPLOSION_COUNT

      BEQ  BGU_Checkexp2

   

      LDA  #EXPLOSION_SPRITE_SLOT*16

      LDX  #SPRFLAG_REDRAW

      JSR  SpriteController.Sprite_SetFlag

   

      DEC  EXPLOSION_COUNT

      BNE  BGU_End

   

      LDA  #EXPLOSION_SPRITE_SLOT*16

      LDX  #SPRFLAG_KILL + SPRFLAG_REDRAW

      JSR  SpriteController.Sprite_SetFlag

   

   BGU_Checkexp2:

   

      LDA  EXPLOSION2_COUNT

      BEQ  BGU_Checkend

   

      LDA  #EXPLOSION2_SPRITE_SLOT*16

      LDX  #SPRFLAG_REDRAW

      JSR  SpriteController.Sprite_SetFlag

   

      DEC  EXPLOSION2_COUNT

      BNE  BGU_End

   

      LDA  #EXPLOSION2_SPRITE_SLOT*16

      LDX  #SPRFLAG_KILL + SPRFLAG_REDRAW

      JSR  SpriteController.Sprite_SetFlag

   

   BGU_Checkend:

   

   

      ; check for end of game

      LDA  TOTAL_INVADERS

      BNE  BGU_End

   

      JSR  Invader_Bullets.RemoveBullets

      JSR  Invader_Player.PBM_killBullet

      LDA  #EXPLOSION_SPRITE_SLOT * 16

      JSR  SpriteController.SpriteClear

      LDA  #EXPLOSION2_SPRITE_SLOT * 16

      JSR  SpriteController.SpriteClear

      jsr  SpriteController.SpritesWipeActive 

   

      INC  GAME_LEVEL

      jsr  Invader_Player.Player_StartLevel

      jsr  ScreenFunctionality.Screen_Clear  ; clear the screen...

      jsr  ScreenFunctionality.DrawScore

      LDA  #PLAYER_SPRITE_SLOT*16

      LDX  #SPRFLAG_REDRAW

      JSR  SpriteController.Sprite_SetFlag

      LDA   #100

      STA   FIREBUTTON_DELAY

      

      ; new level ...

      LDA  BadStartHeight

      CLC

      ADC  #12

      STA  BadStartHeight

   

      LDX  INVADER_RESTARTDELAY

      DEX

      DEX

      STX  INVADER_RESTARTDELAY     

   

   

      JSR  BaddiesInit

   

      jsr  Invader_Bases.DrawBases

   

   BGU_End:

   

      LDA  FIREBUTTON_DELAY

      BEQ  BGU_term

      DEC  FIREBUTTON_DELAY

   

   BGU_term:

   

     RTS

   

   ;-------------------------------------------------------------------------------

   ;  Mother Ship Functionality

   ;-------------------------------------------------------------------------------

   

   

   ;-------------------------------------------------------------------------------

   ;  BaddiesUpdateMother:

   ;    Control for the mother ship...

   ;-------------------------------------------------------------------------------

   BaddiesUpdateMother:

   

      LDA  BadMotherCount

      BEQ  BU_Mother

   

      DEC  BadMotherCount

      RTS

   

   BU_Mother:

   

      LDA  BadMotherState

      ASL

      TAX

      LDA  BadMotherJump,X

      STA  TEMPPTR

      INX

      LDA  BadMotherJump,X

      STA  TEMPPTR+1

      JMP  (TEMPPTR)

   

   BadMotherJump:

   

      .word BadMother_inactive

      .word BadMother_move

      .word BadMother_end

      .word BadMother_shot

      

   

   ;-------------------------------------------------------------------------------

   ;  BadMother_inactive:

   ;    pause before activating the mother ship...

   ;-------------------------------------------------------------------------------

   BadMother_inactive:

   

       LDA #7

       jsr Sound._MAKE_SOUND   ;;;//top alien loop sound

      LDA  #MOTHER_DELAYMOVE

      STA  BadMotherCount

      LDA  #MOTHER_STATE_MOVE

      STA  BadMotherState

      RTs  

   

   ;-------------------------------------------------------------------------------

   ;  BadMother_move:

   ;    moves the mother ship from left to right

   ;-------------------------------------------------------------------------------

   BadMother_Move:

   

      LDA  #MOTHER_DELAYMOVE

      STA  BadMotherCount

   

      LDA  BadMotherXPos

      CLC

      ADC  #1

      STA  BadMotherXPos

   

      PHA

      

      AND  #3

      BNE  BM_Move2  

   

      ; Every time the mother ship reaches on a position div'ed by 4 ...

      ; swap the image of the mother ship, to give the impression of life!

      ; Well, nearly. Sprite frames are 4 and 7, so XOR 3 to initial value

      ; of 4 - flips then between the two images ...

      LDA  BadMotherGfxNum

      EOR  #3

      STA  BadMotherGfxNum

      JSR  SpriteController.SpriteRetreiveDetails

      LDA  CURRENTSPRITEDATA

      STA  BadMotherGfx

      LDA  CURRENTSPRITEDATA+1

      STA  BadMotherGfx+1

   

   BM_Move2:

      

      PLA

   

      CLC

      CMP  #74

      BCC  BadMother_DraW 

   

   

      LDA  #255

      STA  BadMotherCount

      LDA  #MOTHER_STATE_INACTIVE

      STA  BadMotherState

   

      JSR  BadMother_Clear

      LDA  #2

      STA  BadMotherXPos

      RTS

      

   ;-------------------------------------------------------------------------------

   ;  BadMother_end:

   ;    mother ship has reached it's end stop...

   ;-------------------------------------------------------------------------------

   BadMother_end:

      RTS

      

   ;-------------------------------------------------------------------------------

   ;  BadMother_shot:

   ;    the mother ship has been shot...

   ;-------------------------------------------------------------------------------

   BadMother_shot:

   

      JSR  BadMother_Clear

   

      LDA  #MOTHER_STATE_INACTIVE

      STA  BadMotherState

      LDA  #$ff

      STA  BadMotherCount

      LDA  #2

      STA  BadMotherXPos

      

      RTS 

   

   ;-------------------------------------------------------------------------------

   ;  BadMother_Draw:

   ;    calculte the screen position then draw the mother ship...

   ;-------------------------------------------------------------------------------

   BadMother_Draw:

   

      LDA  BadMotherXPos

      STA  XPOS

   

      LDA  #10  

      STA  YPOS

   

   

      ; adjust Y pos to bottom of sprite,

      LDA  #10

      CLC

      ADC  YPOS

      SEC

      SBC  #1

      STA  YPOS

   

      ; adjust the YPOS to character based and store the offset in x for indexing

      AND  #$07

      STA  XOFFSET

      LDA  YPOS

      AND  #$f8

      STA  YPOS

   

      JSR  SpriteController.SpriteCalcScreenPos

   

      LDA  BadMotherGfx

      STA  CURRENTSPRITEDATA

      LDA  BadMotherGfx+1

      STA  CURRENTSPRITEDATA+1

      LDA  #5

      STA  WIDTH

      LDA  #10

      STA  HEIGHT

   

      JMP  SpriteController.SpriteNoMaskDraw

   

   ;-------------------------------------------------------------------------------

   ;  BadMother_Clear:

   ;    Screen clear, block clear the size of the sprite...

   ;-------------------------------------------------------------------------------

   BadMother_Clear:

   

      LDA  BadMotherXPos

      STA  XPOS

   

      LDA  #10  

      STA  YPOS

   

   

      ; adjust Y pos to bottom of sprite,

      LDA  #10

      CLC

      ADC  YPOS

      SEC

      SBC  #1

      STA  YPOS

   

      ; adjust the YPOS to character based and store the offset in x for indexing

      AND  #$07

      STA  XOFFSET

      LDA  YPOS

      AND  #$f8

      STA  YPOS

   

      JSR  SpriteController.SpriteCalcScreenPos

   

      LDA  #5

      STA  WIDTH

      LDA  #10

      STA  HEIGHT

   

      JMP  SpriteController.Sprite_Blank

   

   ;-------------------------------------------------------------------------------

   ;  Misc Baddie Functionality

   ;-------------------------------------------------------------------------------

   

   ;-------------------------------------------------------------------------------

   ;  Baddie_CheckKill:

   ;    Checks the bullet with the invaders that are active...

   ;    X - Xpos

   ;    Y - Ypos

   ;    Returns - 

   ;    A - -1 or offset for baddie to kill... 

   ;-------------------------------------------------------------------------------

   Baddie_CheckKill:

   

      STX  XPOS

      STY  YPOS

   

      ; check the mother ship ...

      LDA  BadMotherState

      CMP  #MOTHER_STATE_MOVE

      BNE  BCK_CheckInvaders   

   

   

      CPY  #15

      BCS  BCK_CheckInvaders

      LDA  BadMotherXPos

      CMP  XPOS

      BCS  BCK_CHeckInvaders

      CLC

      ADC  #5

      CMP  XPOS

      BCC  BCK_CheckInvaders   

   

   

      ; Hit the mother ship, award points and remove ship

      LDX  BadMotherXPos

      LDY  #10

      JSR  Invader_Player.Player_MotherExplosionStart

    

     LDA #8  ;;//stop loop

       JSR Sound._MAKE_SOUND

   

       LDA #3  ;;//long exp

       JSR Sound._MAKE_SOUND

   

      LDA  SCORE_ADDITION

      CLC

      ADC  #25

      STA  SCORE_ADDITION  

   

      LDA  #25

      `ADDTO16BIT  SCORE_LO   

   

      ; check the bonus and see if we need another life 

   

   BCK_DEBUG:

   

      LDA  SCORE_HI

      CMP  BONUSSCORE_HI

      BCC  BCK_Cont

      LDA  SCORE_LO

      CMP  BONUSSCORE_LO

      BCC  BCK_Cont

   

      INC  PLAYER_LIFES

      LDA  #<500

      CLC

      ADC  BONUSSCORE_LO

      STA  BONUSSCORE_LO

      LDA  #>500

      ADC  BONUSSCORE_HI

      STA  BONUSSCORE_HI      

   

   BCK_Cont:

   

      LDA  #MOTHER_STATE_SHOT   

      STA  BadMotherState

      

   BCK_CheckInvaders:

   

      LDA  #0

      STA  SCRATCH1

   

      LDX  #0 + 3      ; index to xpos

      LDY  #0 + 5      ; index to active state   

   

   BCK_loop:

   

      STX  SCRATCH2

      STY  SCRATCH3

   

      LDA  BaddieData,Y

      BEQ  BCK_Skip

   

      

      ; check left, right 

      LDA  BaddieData,X

      CMP  XPOS  

      BCS  BCK_Skip

      CLC

      ADC  #3     

      CMP  XPOS

      BCC  BCK_Skip

   

      ; check top, bottom 

      INX

      LDA  BaddieData,X

      CMP  YPOS  

      BCS  BCK_Skip

      CLC

      ADC  #6     

      CMP  YPOS

      BCC  BCK_Skip

   

      ; hit invader ...

      

      INX

       TXA

       PHA

       LDA #4  ;;//exp

       JSR Sound._MAKE_SOUND

       PLA

       TAX

   

   

      LDA  #INV_STATE_REMOVE

      STA  BaddieData,X

   

   ;

   ;  ; store the bullet details...

   ;   LDA  SCRATCH1

   ;   LDX  #$ff

   ;   CMP  INV_PICKED1

   ;   BNE  C_try2

   ;   STX  INV_PICKED1

   ;   JMP  C_cont;;

   ;

   ;C_try2:

   ;   CMP  INV_PICKED2

   ;   BNE  C_try3

   ;   STX  INV_PICKED2

   ;   JMP  C_cont

   ;  

   ;C_try3:

   ;   CMP  INV_PICKED3

   ;   BNE  C_cont

   ;   STX  INV_PICKED3;;

   

   ;C_cont:

   

   ;   JSR  Invader_bullets.RemoveFromLink

   

      ; set off the explosion ...

      LDX  SCRATCH2

      LDA  BaddieData,X

      INX

      LDY  BaddieData,X

      TAX   

      

      JMP  Invader_Player.Player_ExplosionStart

      

   BCK_Skip:

   

      LDX  SCRATCH2

      LDY  SCRATCH3

   

      TXA

      CLC

      ADC  #6

      TAX

       

      TYA

      CLC

      ADC  #6

      TAY

       

         

      INC  SCRATCH1

      LDA  SCRATCH1

      CMP  #24

      BNE  BCK_loop

   

      LDA  #$ff

      RTS

   

   

   

   ;-------------------------------------------------------------------------------

   ;  Baddies_RemoveInvader:

   ;    Draws an blank where the invader used to be...

   ;    X - index to invader data

   ;-------------------------------------------------------------------------------

   Baddies_RemoveInvader:

   

      ; adjust the score - here seems a good enough place as any

      LDA  SCORE_ADDITION

      CLC

      ADC  #10

      STA  SCORE_ADDITION

   

      LDA  #10

      `ADDTO16BIT SCORE_LO

   

      LDA  SCORE_HI

      CMP  BONUSSCORE_HI

      BCC  BIV_skipbonuscheck

      LDA  SCORE_LO

      CMP  BONUSSCORE_LO

      BCC  BIV_skipbonuscheck

   

   BIV_debug:

   

   

      INC  PLAYER_LIFES

      LDA  #<500

      CLC

      ADC  BONUSSCORE_LO

      STA  BONUSSCORE_LO

      LDA  #>500

      ADC  BONUSSCORE_HI

      STA  BONUSSCORE_HI      

   

   BIV_skipbonuscheck:

   

   

   

      DEC  TOTAL_INVADERS

   

      LDA  INV_DELAYUPDATE

      CMP  #1

      BEQ  BIV_cont

   

      DEC  INV_DELAYUPDATE ; slightly speed things up a little

   

   BIV_cont:

   

   

      LDA  BaddieData,X

      STA  SCREENADD

      INX   

      LDA  BaddieData,X

      STA  SCREENADD+1

      INX   

      LDA  BaddieData,X

      STA  XOFFSET

      INX   

      LDA  BaddieData,X

      INX   

      LDY  BaddieData,X

      INX   

      INX   

   

      

   ;   TAX

   ;   LDA  SCRATCH1

   ;   PHA

   ;   JSR  Invader_Player.Player_ExplosionStart

   ;   PLA

   ;   STA  SCRATCH1

      

      LDA  BadGfx1

      STA  CURRENTSPRITEDATA

      LDA  BadGfx1+1

      STA  CURRENTSPRITEDATA+1

      LDA  BadGfxWidth

      STA  WIDTH

      LDA  BadGfxHeight

      STA  HEIGHT

   

      JMP  SpriteController.Sprite_Blank

   

   

   

   ;-------------------------------------------------------------------------------

   ;  Baddies_GetInvader:

   ;    a - index start position - the search is in reverse order

   ;    Returns the invader data in USERPTR

   ;    a - number of invader picked...

   ;-------------------------------------------------------------------------------

   Baddies_GetInvader:

   

      STA  SCRATCH1

      LDA  #1

      STA  SCRATCH2

   

   BGI_Loop:

   

   

   

      LDA  SCRATCH1

   

      CMP  INV_PICKED1

      BEQ  BGI_Skip

      CMP  INV_PICKED2

      BEQ  BGI_Skip

      CMP  INV_PICKED3

      BEQ  BGI_Skip

      

         

      `MUL6 TEMP  ; multipy A by 6 and store in TEMP 

      LDA  TEMP

      CLC

      ADC  #5

      TAY

      

      LDA  BaddieData,Y

      BNE  BGI_FOund

   

   

   BGI_Skip:

   

      DEC  SCRATCH1

      BPL  BGI_Loop

   

      DEC  SCRATCH2

      BMI  BGI_failed  

      LDA  #24-1

      STA  SCRATCH1

      JMP  BGI_Loop

   

   BGI_Found:

   

      LDA  #<BaddieData

   CLC

   ADC  TEMP

   STA  USERPTR

   LDA  #>`BaddieData`

      ADC  #0

      STA  USERPTR+1   

   

      LDA  SCRATCH1

   

      RTS

   

   BGI_failed:

   

      LDA  #$ff

      RTS

   

   

   

   ;-------------------------------------------------------------------------------

   

   BaddieData:

   

      .byte 0,0,0,0,0,0     ; 01 screen add (2 bytes), Xoffset, xpos, ypos, State   

      .byte 0,0,0,0,0,0     ; 02

      .byte 0,0,0,0,0,0     ; 03

      .byte 0,0,0,0,0,0     ; 04

      .byte 0,0,0,0,0,0     ; 05

      .byte 0,0,0,0,0,0     ; 06

      .byte 0,0,0,0,0,0     ; 07

      .byte 0,0,0,0,0,0     ; 08

      .byte 0,0,0,0,0,0     ; 09

      .byte 0,0,0,0,0,0     ; 10

      .byte 0,0,0,0,0,0     ; 11

      .byte 0,0,0,0,0,0     ; 12

      .byte 0,0,0,0,0,0     ; 13

      .byte 0,0,0,0,0,0     ; 14

      .byte 0,0,0,0,0,0     ; 15

      .byte 0,0,0,0,0,0     ; 16

      .byte 0,0,0,0,0,0     ; 17

      .byte 0,0,0,0,0,0     ; 18

      .byte 0,0,0,0,0,0     ; 19

      .byte 0,0,0,0,0,0     ; 20

      .byte 0,0,0,0,0,0     ; 21

      .byte 0,0,0,0,0,0     ; 22

      .byte 0,0,0,0,0,0     ; 23

      .byte 0,0,0,0,0,0     ; 24

   

   

   

   

   

   ;-------------------------------------------------------------------------------

   

   BadStartHeight:    .byte 0

   BadGfx1:           .byte 0,0

   BadGfx2:           .byte 0,0

   BadGfx3:           .byte 0,0

   BadGfxWidth:       .byte 0

   BadGfxHeight:      .byte 0

   BadXpos:           .byte 0

   BadYpos:           .byte 0

   BadFlag:           .byte 0,0,0

   BadMode:           .byte 0

   BadInvYRef:        .byte 0

   BadMotherGfx:      .byte 0,0

   BadMotherXPos:     .byte 0

   BadMotherCount:    .byte 0         

   BadMotherState:    .byte 0         

   BadMotherGfxNum:   .byte 0

   

   

   ;-------------------------------------------------------------------------------

   ; End of Invader_Baddies

   ;-------------------------------------------------------------------------------

⚠️ **GitHub.com Fallback** ⚠️