; ; handle battles ; ;================================ ; do battle ;================================ do_battle: lda #34 sta HERO_X lda #20 sta HERO_Y lda #0 sta HERO_STATE sta MENU_STATE sta MENU_POSITION lda #3 sta HERO_LIMIT lda #20 sta BATTLE_COUNT ;======================== ; rotate intro jsr rotate_intro ;======================== ; 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 lda HERO_HP beq battle_draw_hero_down lda HERO_STATE and #HERO_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_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 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 #10 ; jsr WAIT ;======================== ; handle enemy attacks lda ENEMY_COUNT bne battle_no_enemy_attack battle_start_enemy_attack: ; attack and decrement HP jsr enemy_attack ; update limit count ; max out at 4 lda HERO_LIMIT cmp #4 beq battle_no_inc_limit inc HERO_LIMIT battle_no_inc_limit: ; reset enemy time. FIXME: variable? lda #50 sta ENEMY_COUNT battle_no_enemy_attack: dec ENEMY_COUNT ;=============================== ; 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 HERO_STATE and #HERO_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 lda ENEMY_HP bne end_battle_loop jsr victory_dance jmp done_battle end_battle_loop: jmp main_battle_loop done_battle: jsr clear_bottoms rts battle_game_over: rts ;****** ** **** **** ** ** ****** **** ****** ****** ****** ;** ** **** ** ** ** ** ** ** ** ** ** ** ** ;** ** ** **** **** ****** **** ****** ** ****** ****** ;** ** ** ** ** ** ** ** ** ** ** ** ** ;****** ****** ****** **** ** **** ****** ** ****** ** ;=========================== ; gr put num ;=========================== ; damage in DAMAGE_VAL (BCD) ; location in XPOS,YPOS gr_put_num: ; digit=number/100; ; if ((digit) && (digit<10)) { ; grsim_put_sprite(numbers[digit],xt,yy); ; xt+=4; ; } ; hundreds=digit; ; left=number%100; gr_put_num_tens: ; print tens digit lda DAMAGE_VAL lsr lsr lsr lsr ; leading zero suppression beq gr_put_num_ones asl tay lda number_sprites,Y sta INL lda number_sprites+1,Y sta INH jsr put_sprite_crop ; point to next lda XPOS clc adc #4 sta XPOS gr_put_num_ones: ; print tens digit lda DAMAGE_VAL and #$f asl tay lda number_sprites,Y sta INL lda number_sprites+1,Y sta INH jsr put_sprite_crop rts victory_string: .byte 13,21,"EXPERIENCE +2",0 .byte 16,22,"MONEY +1",0 ;==================================== ; 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