;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; File Name    : invhit.asm
; Purpose      : Space Invaders Application State Handler fo ship being hit
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;DO NOT MODIFY THE FOLLOWING SUBROUTINE DEFINITION;;;;;;;;;;;;;;;;;

                IF @DEF('SUBROUTINE')
                    UNDEF SUBROUTINE
                ENDIF
                DEFINE  SUBROUTINE      "'invhit'"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Module Name : invHitStateManager
; Description : Space Invaders Application Ship Hit State Manager.
; Assumptions : Display is cleared on first time entry into the state.
; Input(s)    : CORECurrentEvent  - system event to be processed
;               COREEventArgument - event extra information
; Output(s)   : None
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                GLOBAL  invHitStateManager

invHitStateManager:

                ld      A, [CORECurrentEvent]

                cp      A, #COREEVENT_DISPLAY_UPDATE_STPRES
                jr      Z, invBackgroundMovement

                ; Check if state entry event.
                cp      A, #INV_STATEENTRY
                jr      Z, invDefaultStateStateEntryEvent

                ; Check if mode depress event.
                ;cp      A, #INV_MODEDEPRESS
                ;jr      Z, invDefaultStateModeDepressEvent

                ; Check if timeout done
                cp      A, #COREEVENT_TIMEOUTDONE_LOWRES
                jr      Z, invHitTimeoutDoneEvent

                ; Check if crown set event.
                cp      A, #INV_CROWNSET
                jr      Z, invHitPulledCrownEvent

                ;; Check if crown set event.
                ;cp      A, #INV_CROWNHOME
                ;jr      Z, invHitCrownHomeEvent

                ;cp      A, #COREEVENT_CW_EDGE_TRAILING
                ;jr      Z, invMoveShipRight

                ;cp      A, #COREEVENT_CCW_EDGE_TRAILING
                ;jr      Z, invMoveShipLeft

                ;cp      A, #COREEVENT_CCW_EDGE_TRAILING
                ;jr      Z, invMoveShipLeft

                ;cp      A, #COREEVENT_STARTSPLITDEPRESS
                ;jr      Z, invFireMissile

                ;cp      A, #COREEVENT_STOPRESETDEPRESS
                ;jr      Z, invTestAlienMissile

                ;TODO: Add more events detection here
                ;There are more events, add your own as needed

                ret


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EVENT HANDLERS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

               ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
               ; CROWN SET
               ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

invHitPulledCrownEvent:

				car		invHitTimeoutDoneEvent
                ld      B, #INVYOUROCKSETSTATE
                CORE_REQ_STATE_CHANGE
                ret


;invDefaultStateModeDepressEvent:
;
;               ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;               ; MODE DEPRESS
;               ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;                CORE_REQ_MODE_CHANGE_NEXT
;                ret


invDefaultStateStateEntryEvent:

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; STATE ENTRY
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ;allow only mode switch
                CORE_ALLOW_KEYS 0 


                ;display number of ship available/left
                ld      L, #DM5_S
                ld      IX, #LCDUPPERDMCOL1
                LCD_DISP_SMALL_PROP_WIDTH_DM_CHAR

                ld      HL, [CORECurrentASDAddress]
                add     HL, #INVSHIPAVAILABLEOFFSET
                ld      L, [HL]
                ld      IX, #LCDUPPERDMCOL9
                LCD_DISP_SMALL_PROP_WIDTH_DM_CHAR

                ; start our background timing generator
                ld      HL, [CORECurrentASDAddress]
                ld      A, [HL]
                KSTP_ENABLE_DISP_UPD_EVENT

                ;request for a timeout for the blast animation
                CORE_REQ_TIMEOUT_LORES  5
                ret

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


            GLOBAL invBackgroundMovement
invBackgroundMovement:



invContinueWithBackgroundEvent:


                ;update new positions of the hero ship and alien ships
                car     invUpdatePositions

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; display ship being blasted
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      A, [INVShipStepRate]
                cp      A, #1
                jr      NZ, checknextblastpattern1

                ld      IY, #INVShipPosX
                car     invDisplayShip


                car     DisplayAp0Bp0
                LCD_DISPLAY_MAIN_DM_PIXEL

                car     DisplayAp2Bp0
                LCD_DISPLAY_MAIN_DM_PIXEL

                car     DisplayAp1Bm1
                LCD_DISPLAY_MAIN_DM_PIXEL

                car     DisplayAp0Bm1
                LCD_CLEAR_MAIN_DM_PIXEL

                jr      dispShipExit


checknextblastpattern1:
                cp      A, #2
                jr      NZ, checknextblastpattern2

                car     DisplayAp0Bp0
                LCD_CLEAR_MAIN_DM_PIXEL

                car     DisplayAp2Bp0
                LCD_CLEAR_MAIN_DM_PIXEL

                car     DisplayAp1Bm1
                LCD_CLEAR_MAIN_DM_PIXEL

                car     DisplayAp1Bp0
                LCD_DISPLAY_MAIN_DM_PIXEL

                car     DisplayAp2Bm1
                LCD_DISPLAY_MAIN_DM_PIXEL

                jr      dispShipExit


checknextblastpattern2:
                cp      A, #3
                jr      NZ, checknextblastpattern3

                car     DisplayAp1Bp0
                LCD_CLEAR_MAIN_DM_PIXEL

                car     DisplayAp2Bm1
                LCD_CLEAR_MAIN_DM_PIXEL

                car     DisplayAp0Bm1
                LCD_DISPLAY_MAIN_DM_PIXEL

                ;car     DisplayAp2Bp0
                ;LCD_DISPLAY_MAIN_DM_PIXEL

                jr      dispShipExit


checknextblastpattern3:
dispShipExit:

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;display enemy 1
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVAlien0State
                jr      Z, dispAlien0Exit

                ld      IY, #INVAlien0PosX
                car     invDisplayAlien

dispAlien0Exit:

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;display enemy 2
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVAlien1State
                jr      Z, dispAlien1Exit

                ld      IY, #INVAlien1PosX
                car     invDisplayAlien

dispAlien1Exit:

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;display enemy 3
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVAlien2State
                jr      Z, dispAlien2Exit

                ld      IY, #INVAlien2PosX
                car     invDisplayAlien

dispAlien2Exit:



                ; update missile positions
                car     invUpdateMissilePosition

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;display ship missile
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVShipMissleState
                jr      Z, dispMissileExit

                ld      IY, #INVShipMissilePosX
                car     invDisplayMissile

dispMissileExit:

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;display alien missile 0
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVAlienMissle0State
                jr      Z, dispAlienMissile0Exit

                ld      IY, #INVAlien0MissilePosX
                car     invDisplayMissile
                
dispAlienMissile0Exit:              

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;display alien missile 1
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVAlienMissle1State
                jr      Z, dispAlienMissile1Exit

                ld      IY, #INVAlien1MissilePosX
                car     invDisplayMissile
                
dispAlienMissile1Exit:              


                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;display alien missile 2
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ld      HL, #INVDisplayStatus
                bit     [HL], #bINVAlienMissle2State
                jr      Z, dispAlienMissile2Exit

                ld      IY, #INVAlien2MissilePosX
                car     invDisplayMissile
                
dispAlienMissile2Exit:              

                ret


invHitTimeoutDoneEvent:

                ;clear artifacts of blasting ship
                car     DisplayAp0Bp0
                LCD_CLEAR_MAIN_DM_PIXEL
                car     DisplayAp2Bp0
                LCD_CLEAR_MAIN_DM_PIXEL
                car     DisplayAp1Bm1
                LCD_CLEAR_MAIN_DM_PIXEL
                car     DisplayAp1Bp0
                LCD_CLEAR_MAIN_DM_PIXEL
                car     DisplayAp2Bm1
                LCD_CLEAR_MAIN_DM_PIXEL
                car     DisplayAp0Bm1
                LCD_CLEAR_MAIN_DM_PIXEL

                ld      HL, [CORECurrentASDAddress]
                add     HL, #INVSHIPAVAILABLEOFFSET
                cp      [HL], #0
                jr      NZ, invcontinuegame

                ; got to game over state
                ld      B, #INVGAMEOVERSTATE
                jr      invGotoNewState


invcontinuegame:

                ;setup new ship position
                ld      A, #21
                ld      [INVShipPosX], A
                ld      A, #11          
                ld      [INVShipPosY], A
                ld      A, #1
                ld      [INVShipDirection], A       
    
                ;prepare new ship for war
                ld      HL, #INVDisplayStatus
                or      [HL], #bINVShipState

                ld      B, #COREDEFAULTSTATE
invGotoNewState:
                CORE_REQ_STATE_CHANGE_NO_CLEAR_DISPLAY
                ret


                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DisplayAp0Bp0:

                ld      A, [INVShipPosX]
                jr      DisplayLoadB

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DisplayAp2Bp0:

                ld      A, [INVShipPosX]
                inc     A
                inc     A
                jr      DisplayLoadB

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DisplayAp1Bm1:

                ld      A, [INVShipPosX]
                inc     A
                jr      DispWithDecB

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DisplayAp1Bp0:

                ld      A, [INVShipPosX]
                inc     A

DisplayLoadB:
                ld      B, [INVShipPosY]
                ret

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DisplayAp2Bm1:

                ld      A, [INVShipPosX]
                inc     A
                inc     A
                jr      DispWithDecB

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DisplayAp0Bm1:

                ld      A, [INVShipPosX]

DispWithDecB:
                ld      B, [INVShipPosY]
                dec     B
                ret


                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

