;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; File Name    : invvict.asm
; Purpose      : Space Invaders Application State Handler for destroying all alien in current wave
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Module Name : invVictoryStateManager
; Description : Space Invaders Application Ship Victory 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  invVictoryStateManager

invVictoryStateManager:

                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

                cp      A, #COREEVENT_END_OF_SCROLLING_MESS
                jr      Z, invMessageScrollCompletedEvent

                ;cp      A, #COREEVENT_CW_EDGE_TRAILING
                ;jr      Z, invMessageScrollCompletedEvent

                ;cp      A, #COREEVENT_CCW_EDGE_TRAILING
                ;jr      Z, invMessageScrollCompletedEvent

                ;cp      A, #COREEVENT_CCW_EDGE_TRAILING
                ;jr      Z, invMessageScrollCompletedEvent

                cp      A, #COREEVENT_STARTSPLITDEPRESS
                jr      Z, invCancelScrollingMessage

                cp      A, #COREEVENT_STOPRESETDEPRESS
                jr      Z, invCancelScrollingMessage

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

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

                ret


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

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

invVictoryPulledCrownEvent:

                ld      B, #INVYOUROCKSETSTATE
                CORE_REQ_STATE_CHANGE
                ret

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


invDefaultStateStateEntryEvent:

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

                ;allow only mode switch
                CORE_ALLOW_KEYS (bCOREModeSwitch|bCOREStopResetSwitch|bCOREStartSplitSwitch)

                ;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

                ;clear main dm region
                LCD_CLEAR_MAIN_DM

                ;display scrolling message
                LCD_SET_SCROLLING_CONTRAST
                ld      IY, #invScrollMessage
                LCD_SCROLL_RAM_OR_ROM_MSG_MAIN_DM_LINE1 EVENT_ON
                ret


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


invDefaultStateModeDepressEvent:

                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; MODE DEPRESS
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                CORE_REQ_MODE_CHANGE_NEXT
                ret


                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ; START/SPLIT DEPRESS
                ; STOP/RESET DEPRESS
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

invCancelScrollingMessage:

                ;clear main dm region
                LCD_CLEAR_MAIN_DM


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

invMessageScrollCompletedEvent:


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

                ;may be we could change the y position of the aliens here

                ld      A, [INVAlien0PosY]
                inc     A
                cp      A, #6
                jr      C, okayokay
                ld      A, #6
okayokay:
                ld      [INVAlien0PosY], A
                ld      [INVAlien1PosY], A        
                ld      [INVAlien2PosY], A        

                ;if row is less than 3. step rate is normal
                ld      A, [INVAlien0PosY]
                cp      A, #3
                jr      NC, checknextrate11

                ld      A, #INVALIENSTEPRATE        
                ld      [INVAlienShipStepRate], A   
                ld      A, #INVALIENSTEPRATE
                ld      [INVAlienShipStepRateCurrent], A    
                jr      checknextrate2

checknextrate11:

                ;if row is 3, step rate is faster by 1
                ld      A, [INVAlien0PosY]
                cp      A, #5
                jr      NC, checknextrate1

                ld      A, #INVALIENSTEPRATE-1        
                ld      [INVAlienShipStepRate], A   
                ld      A, #INVALIENSTEPRATE-1
                ld      [INVAlienShipStepRateCurrent], A    
                jr      checknextrate2

checknextrate1:

                ld      A, #INVALIENSTEPRATE-2        
                ld      [INVAlienShipStepRate], A   
                ld      A, #INVALIENSTEPRATE-2
                ld      [INVAlienShipStepRateCurrent], A    

checknextrate2:

                ld      A, #30
                ld      [INVAlienMaxXPosition], A

                ld      A, #1
                ld      [INVAlienMinXPosition], A


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

                ;return to default state
                ld      B, #COREDEFAULTSTATE
                CORE_REQ_STATE_CHANGE_NO_CLEAR_DISPLAY
                ret


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

invScrollMessage:

                db      DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE,  DM5_SPACE,  DM5_SPACE,  DM5_SPACE
                db      DM5_P , DM5_R , DM5_E , DM5_P , DM5_A , DM5_R , DM5_E , DM5_SPACE
                db      DM5_F , DM5_O , DM5_R , DM5_SPACE
                db      DM5_N , DM5_E , DM5_X , DM5_T , DM5_SPACE
                db      DM5_W , DM5_A , DM5_V , DM5_E , DM5_SPACE
                db      DM5_PERIOD  , DM5_PERIOD  , DM5_PERIOD  
                db      DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE
                db      DM5_SPACE, DM5_SPACE, DM5_SPACE, DM5_SPACE
                db      DM5_SENTINEL

