; ; handle battles ; ;================================ ; do battle ;================================ do_battle: ;======================== ; rotate intro ; this happens first as it stomps on zero page jsr rotate_intro ; set start position lda #34 sta HERO_X lda #20 sta HERO_Y ; reset state lda #0 sta BATTLE_STATE sta MENU_STATE sta MENU_POSITION sta ENEMY_DEAD sta ENEMY_ATTACKING ; FIXME: set limit break ; lda #3 ; sta HERO_LIMIT ; start battle count part-way in lda #20 sta BATTLE_COUNT ;====================== ; update hp and mp jsr update_hero_hp jsr update_hero_mp ;======================== ; zoom to battlefield ; jsr zoom_battlefield ;============================= ; Init Enemy jsr init_enemy ;========================== ; Draw background ;========================== ; Draw sky ldx #0 ; blue from 0 .. 10 battle_sky_loop: lda gr_offsets,X sta GBASL lda gr_offsets+1,X clc adc #$8 ; store to $C00 sta GBASH lda #$66 ; COLOR_MEDIUMBLUE ldy #0 battle_sky_inner: sta (GBASL),Y iny cpy #40 bne battle_sky_inner inx inx cpx #10 bne battle_sky_loop ; green from 10 .. 40 battle_ground_loop: lda gr_offsets,X sta GBASL lda gr_offsets+1,X clc adc #$8 ; store to $C00 sta GBASH lda #$CC ; COLOR_LIGHTGREEN ; FIXME: should be GROUNDCOLOR ldy #0 battle_ground_inner: sta (GBASL),Y iny cpy #40 bne battle_ground_inner inx inx cpx #40 bne battle_ground_loop ; Draw some background images for variety? ; update bottom of screen jsr draw_battle_bottom ;======================================== ; main battle loop ;======================================== main_battle_loop: ;============================ ; copy background into place jsr gr_copy_to_current ;======================================== ; draw our hero ; check if hero deal lda HERO_HP_HI bne hero_not_dead ; hitpoint hi not zero lda HERO_HP_LO beq battle_draw_hero_down ; hitpoint hi && lo zero ; not dead, so draw running or standing hero_not_dead: lda BATTLE_STATE and #BATTLE_STATE_RUNNING bne battle_draw_hero_running jmp battle_draw_normal_hero battle_draw_hero_down: jsr draw_hero_down jmp battle_done_draw_hero battle_draw_hero_running: ; grsim_put_sprite(tfv_stand_right,ax,20); ; grsim_put_sprite(tfv_walk_right,ax,20); lda HERO_X sta XPOS lda #20 sta YPOS lda BATTLE_COUNT and #$8 beq battle_draw_running_walk battle_draw_running_stand: lda #tfv_stand_right_sprite sta INH jsr put_sprite_crop jmp battle_done_draw_hero battle_draw_running_walk: lda #tfv_walk_right_sprite sta INH jsr put_sprite_crop jmp battle_done_draw_hero battle_draw_normal_hero: ; grsim_put_sprite(tfv_stand_left,ax,20); lda #20 sta HERO_Y jsr draw_battle_hero_and_sword battle_done_draw_hero: ;=========================== ; draw enemy battle_draw_enemy: ; grsim_put_sprite(enemies[enemy_type].sprite,enemy_x,20); lda ENEMY_X sta XPOS lda #20 sta YPOS jsr draw_enemy battle_done_draw_enemy: ;======================================= ; draw bottom status jsr draw_battle_bottom ;======================================= ; page_flip jsr page_flip ;======================================= ; handle if dead lda HERO_HP_HI bne done_battle_handle_dead lda HERO_HP_LO bne done_battle_handle_dead ; pause for 1.5s ldx #15 jsr long_wait jsr battle_game_over done_battle_handle_dead: ;======================= ; handle keypresses jsr get_keypress sta LAST_KEY cmp #'Q' beq done_battle ;======================================== ; delay for framerate lda #50 jsr WAIT ;======================== ; handle enemy attacks lda ENEMY_DEAD bne battle_done_enemy_attack lda ENEMY_COUNT bne battle_no_enemy_attack battle_start_enemy_attack: ; attack and decrement HP jsr enemy_attack battle_no_enemy_attack: dec ENEMY_COUNT ; countdown until attack battle_done_enemy_attack: ;=============================== ; handle battle counter update_battle_counter: lda BATTLE_COUNT cmp #64 bcc inc_battle_count ; blt ; battle timer expired, take action ; If running, escape ; TODO: randomly fail at running? lda BATTLE_STATE and #BATTLE_STATE_RUNNING beq battle_open_menu ; we bravely ran away jmp done_battle ;====================== ; activate menu battle_open_menu: lda MENU_STATE cmp #MENU_NONE bne menu_activated ; move to main menu lda #MENU_MAIN sta MENU_STATE jsr menu_ready_noise menu_activated: jsr battle_menu_keypress jmp done_battle_count inc_battle_count: inc BATTLE_COUNT done_battle_count: ;======================== ; check enemy defeated ; if enemy_hp zero and enemy dead < 10 lda ENEMY_DEAD beq battle_enemy_is_not_dead_yet battle_enemy_is_dead: inc ENEMY_DEAD lda ENEMY_DEAD cmp #15 bne end_battle_loop jsr victory_dance jmp done_battle battle_enemy_is_not_dead_yet: lda ENEMY_HP_HI bne end_battle_loop lda ENEMY_HP_LO bne end_battle_loop ; make enemy dead inc ENEMY_DEAD end_battle_loop: jmp main_battle_loop done_battle: jsr clear_bottoms rts battle_game_over: rts ;==================================== ; victory dance ;==================================== victory_dance: lda #34 sta HERO_X lda #20 sta HERO_Y ; update XP and money inc HERO_XP inc HERO_XP inc HERO_MONEY ldx #25 stx ANIMATE_LOOP victory_dance_loop: jsr gr_copy_to_current jsr clear_bottom lda #victory_string sta OUTH jsr move_and_print jsr move_and_print txa and #1 beq victory_wave victory_stand: jsr draw_hero_and_sword jmp victory_draw_done victory_wave: jsr draw_hero_victory victory_draw_done: jsr page_flip ; delay lda #255 jsr WAIT dec ANIMATE_LOOP bne victory_dance_loop rts victory_string: .byte 13,21,"EXPERIENCE +2",0 .byte 16,22,"MONEY +1",0