|
- .include "skirmish.inc"
-
- .export INIT_GAME
- .export UPDATE_GAME
- .export REBUILD_OCCUPANCY
- .export UNIT_ATTACK
- .export ENSURE_SELECTED_UNIT
-
- .import ENEMY_AI_TURN
-
- .importzp input_flags
- .importzp game_state
- .importzp selected_unit
- .importzp turn_counter
- .importzp player_units
- .importzp enemy_units
- .importzp move_dx
- .importzp move_dy
- .importzp action_result
- .importzp temp0
- .importzp temp1
- .importzp temp2
- .importzp temp3
- .importzp temp4
- .importzp temp5
-
- .import unit_x
- .import unit_y
- .import unit_hp
- .import unit_team
- .import grid_occupancy
-
- .segment "CODE"
- INIT_GAME:
- lda #STATE_PLAYER
- sta game_state
- lda #0
- sta turn_counter
- sta action_result
- lda #0
- sta selected_unit
-
- lda #PLAYER_COUNT
- sta player_units
- lda #ENEMY_COUNT
- sta enemy_units
-
- ldx #0
- clear_units:
- lda #0
- sta unit_x,x
- sta unit_y,x
- sta unit_hp,x
- sta unit_team,x
- inx
- cpx #UNIT_COUNT
- bne clear_units
-
- lda #0
- sta unit_x+0
- sta unit_x+1
- sta unit_x+2
- lda #7
- sta unit_x+3
- sta unit_x+4
- sta unit_x+5
-
- lda #1
- sta unit_y+0
- lda #3
- sta unit_y+1
- lda #5
- sta unit_y+2
- lda #1
- sta unit_y+3
- lda #3
- sta unit_y+4
- lda #5
- sta unit_y+5
-
- lda #3
- ldx #0
- hp_loop:
- sta unit_hp,x
- inx
- cpx #UNIT_COUNT
- bne hp_loop
-
- lda #TEAM_PLAYER
- sta unit_team+0
- sta unit_team+1
- sta unit_team+2
- lda #TEAM_ENEMY
- sta unit_team+3
- sta unit_team+4
- sta unit_team+5
-
- jsr REBUILD_OCCUPANCY
- rts
-
- UPDATE_GAME:
- jsr REBUILD_OCCUPANCY
-
- lda game_state
- cmp #STATE_PLAYER
- beq update_player
- cmp #STATE_ENEMY
- beq update_enemy
- cmp #STATE_CHECK
- beq update_check
- jmp update_end
-
- update_player:
- jsr ENSURE_SELECTED_UNIT
-
- lda input_flags
- and #INPUT_NEXT
- beq :+
- jsr CYCLE_SELECTED_UNIT
- rts
- :
- lda input_flags
- and #INPUT_FIRE
- beq :+
- jsr CYCLE_SELECTED_UNIT
- rts
- :
- lda input_flags
- and #INPUT_WAIT
- beq :+
- lda #STATE_ENEMY
- sta game_state
- rts
- :
- lda #0
- sta move_dx
- sta move_dy
-
- lda input_flags
- and #INPUT_UP
- beq :+
- lda #$FF
- sta move_dy
- jmp do_player_action
- :
- lda input_flags
- and #INPUT_DOWN
- beq :+
- lda #1
- sta move_dy
- jmp do_player_action
- :
- lda input_flags
- and #INPUT_LEFT
- beq :+
- lda #$FF
- sta move_dx
- jmp do_player_action
- :
- lda input_flags
- and #INPUT_RIGHT
- beq :+
- lda #1
- sta move_dx
- jmp do_player_action
- :
- rts
-
- do_player_action:
- jsr UNIT_TRY_ACTION
- lda action_result
- beq :+
- lda #STATE_ENEMY
- sta game_state
- :
- rts
-
- update_enemy:
- jsr ENEMY_AI_TURN
- inc turn_counter
- lda #STATE_CHECK
- sta game_state
- rts
-
- update_check:
- jsr CHECK_WIN_LOSE
- lda game_state
- cmp #STATE_CHECK
- bne :+
- lda #STATE_PLAYER
- sta game_state
- :
- rts
-
- update_end:
- lda input_flags
- and #INPUT_RESTART
- beq :+
- jsr INIT_GAME
- :
- rts
-
- UNIT_TRY_ACTION:
- lda #0
- sta action_result
-
- ldx selected_unit
- cpx #PLAYER_COUNT
- bcs unit_try_done
- lda unit_hp,x
- beq unit_try_done
-
- lda unit_x,x
- clc
- adc move_dx
- sta temp0
- cmp #8
- bcs unit_try_done
-
- lda unit_y,x
- clc
- adc move_dy
- sta temp1
- cmp #8
- bcs unit_try_done
-
- lda temp1
- asl
- asl
- asl
- clc
- adc temp0
- tay
- lda grid_occupancy,y
- cmp #EMPTY_CELL
- beq move_player
-
- tay
- lda unit_team,y
- cmp #TEAM_ENEMY
- bne unit_try_done
-
- ldx selected_unit
- jsr UNIT_ATTACK_XY
- lda #1
- sta action_result
- jmp unit_try_done
-
- move_player:
- ldx selected_unit
- lda temp0
- sta unit_x,x
- lda temp1
- sta unit_y,x
- lda #1
- sta action_result
-
- unit_try_done:
- rts
-
- REBUILD_OCCUPANCY:
- ldx #0
- clear_grid:
- lda #EMPTY_CELL
- sta grid_occupancy,x
- inx
- cpx #64
- bne clear_grid
-
- ldx #0
- grid_loop:
- lda unit_hp,x
- beq next_grid_unit
- lda unit_y,x
- asl
- asl
- asl
- clc
- adc unit_x,x
- tay
- txa
- sta grid_occupancy,y
- next_grid_unit:
- inx
- cpx #UNIT_COUNT
- bne grid_loop
- rts
-
- CHECK_WIN_LOSE:
- lda enemy_units
- bne :+
- lda #STATE_WIN
- sta game_state
- rts
- :
- lda player_units
- bne :+
- lda #STATE_LOSE
- sta game_state
- rts
- :
- lda #STATE_CHECK
- sta game_state
- rts
-
- ENSURE_SELECTED_UNIT:
- lda selected_unit
- cmp #PLAYER_COUNT
- bcs choose_first_player
- tax
- lda unit_hp,x
- bne ensure_done
-
- choose_first_player:
- ldx #0
- find_alive_player:
- lda unit_hp,x
- bne found_player
- inx
- cpx #PLAYER_COUNT
- bne find_alive_player
- lda #$FF
- sta selected_unit
- rts
-
- found_player:
- stx selected_unit
- ensure_done:
- rts
-
- CYCLE_SELECTED_UNIT:
- lda player_units
- beq no_cycle_target
-
- lda selected_unit
- cmp #PLAYER_COUNT
- bcc :+
- lda #$FF
- :
- clc
- adc #1
- cmp #PLAYER_COUNT
- bcc :+
- lda #0
- :
- sta temp0
- ldx #PLAYER_COUNT
- cycle_search:
- ldy temp0
- lda unit_hp,y
- bne cycle_found
- inc temp0
- lda temp0
- cmp #PLAYER_COUNT
- bcc :+
- lda #0
- sta temp0
- :
- dex
- bne cycle_search
-
- no_cycle_target:
- lda #$FF
- sta selected_unit
- rts
-
- cycle_found:
- sty selected_unit
- rts
-
- UNIT_ATTACK:
- jsr UNIT_ATTACK_XY
- rts
-
- UNIT_ATTACK_XY:
- lda unit_hp,y
- beq attack_done
- sec
- sbc #1
- sta unit_hp,y
- bne attack_done
- lda unit_team,y
- beq dead_player
- dec enemy_units
- jmp attack_done
-
- dead_player:
- dec player_units
-
- attack_done:
- rts
|