;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; File Name    : invover.asm
; Purpose      : Space Invaders Application State Handler for game over
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Module Name : invGameOverStateManager
; Description : Space Invaders Application Ship Game Over 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  invGameOverStateManager

invGameOverStateManager:

                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, invGameOverPulledCrownEvent

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

                ;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, invStartNewGame

                ;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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

invGameOverPulledCrownEvent:

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

;                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 (bCOREModeSwitch|bCOREStartSplitSwitch)
                CORE_SET_AUTORETURN

                ;setup alien row
                ld      A, #1
                ld      [INVAlien0PosY], A
                ld      [INVAlien1PosY], A        
                ld      [INVAlien2PosY], A        

                ;clear display
                LCD_CLR_DISPLAY

                ;display message GAME OVER
                ld IY, #invGameOverMessage
                LCD_DISP_BANNER_MSG

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

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

invGameOverMessage:

                db        LCDBANNER_COL1
                db        LCDBANNER_COL1, DM5_G, DM5_A, DM5_M, DM5_E, DM5_O, DM5_V, DM5_E, DM5_R 
                db        LCD_END_BANNER

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


            GLOBAL invBackgroundMovement
invBackgroundMovement:



invContinueWithBackgroundEvent:


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

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; display other demo stuff
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

                ld      A, #41
                ld      B, #5
                LCD_CLEAR_MAIN_DM_PIXEL

                ld      A, #42
                ld      B, #5
                LCD_CLEAR_MAIN_DM_PIXEL

                ld      A, #1
                ld      B, #5
                LCD_DISPLAY_MAIN_DM_PIXEL

                ld      A, #2
                ld      B, #5
                LCD_DISPLAY_MAIN_DM_PIXEL

                jr      dispShipExit


checknextblastpattern1:
                cp      A, #2
                jr      NZ, checknextblastpattern2

                ld      A, #1
                ld      B, #5
                LCD_CLEAR_MAIN_DM_PIXEL

                ld      A, #2
                ld      B, #5
                LCD_CLEAR_MAIN_DM_PIXEL

                ld      A, #21
                ld      B, #5
                LCD_DISPLAY_MAIN_DM_PIXEL

                ld      A, #22
                ld      B, #5
                LCD_DISPLAY_MAIN_DM_PIXEL

                jr      dispShipExit


checknextblastpattern2:
                cp      A, #3
                jr      NZ, checknextblastpattern3

                ld      A, #21
                ld      B, #5
                LCD_CLEAR_MAIN_DM_PIXEL

                ld      A, #22
                ld      B, #5
                LCD_CLEAR_MAIN_DM_PIXEL

                ld      A, #41
                ld      B, #5
                LCD_DISPLAY_MAIN_DM_PIXEL

                ld      A, #42
                ld      B, #5
                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:

                ret


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


invStartNewGame:

                ;setup new number of ships
                ld      HL, [CORECurrentASDAddress]
                add     HL, #INVSHIPAVAILABLEOFFSET
                ld      [HL], #INVNUMSHIPSAVAILABLE
                car     invDisplayShipsAvailable


                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;update new ship position
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ld      A, #21
                ld      [INVShipPosX], A
                ld      A, #11          
                ld      [INVShipPosY], A
                ld      A, #1
                ld      [INVShipDirection], A       

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;update new alien ship position
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ; setup the correct x positions for the aliens
                ld      A, #1
                ld      [INVAlien0PosX], A
                add     A, #5
                ld      [INVAlien1PosX], A        
                add     A, #5
                ld      [INVAlien2PosX], A        

                ld      A, #1
                ld      [INVAlien0Direction], A     

                ;setup alien row
                ld      A, #1
                ld      [INVAlien0PosY], A
                ld      [INVAlien1PosY], A        
                ld      [INVAlien2PosY], A        

                ld      A, #30
                ld      [INVAlienMaxXPosition], A

                ld      A, #1
                ld      [INVAlienMinXPosition], A

                ;update display states
                ld      A, #(bINVAlien0State|bINVAlien1State|bINVAlien2State|bINVShipState)
                ld      [INVDisplayStatus], A

                ;clear main dm region
                LCD_CLEAR_MAIN_DM

                ld      B, #COREDEFAULTSTATE
                CORE_REQ_STATE_CHANGE_NO_CLEAR_DISPLAY
                ret



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

invDisplayShipsAvailable:

                ;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
                ret
