diff --git a/games/tfv/Makefile b/games/tfv/Makefile index b00dafef..cbf4076e 100644 --- a/games/tfv/Makefile +++ b/games/tfv/Makefile @@ -75,9 +75,10 @@ TFV_WORLD: tfv_world.o ld65 -o TFV_WORLD tfv_world.o -C ../../linker_scripts/apple2_2000.inc tfv_world.o: tfv_world.s zp.inc \ + long_wait.s \ tfv_overworld.s tfv_drawmap.s \ tfv_battle.s tfv_battle_menu.s tfv_battle_limit.s tfv_battle_summons.s \ - tfv_battle_magic.s tfv_battle_enemy.s \ + tfv_battle_magic.s tfv_battle_enemy.s tfv_battle_draw_hero.s \ tfv_battle_boss.s \ help_overworld.s rotate_intro.s \ sound_effects.s speaker_tone.s \ diff --git a/games/tfv/long_wait.s b/games/tfv/long_wait.s new file mode 100644 index 00000000..939afebb --- /dev/null +++ b/games/tfv/long_wait.s @@ -0,0 +1,16 @@ + ;===================== + ;===================== + ; long(er) wait + ; waits approximately 10ms * X + ;===================== + ;===================== +long_wait: + lda #64 + jsr WAIT ; delay 1/2(26+27A+5A^2) us, 11,117 + dex + bne long_wait + rts + + + + diff --git a/games/tfv/sound_effects.s b/games/tfv/sound_effects.s index a8ca8ba7..3c58692f 100644 --- a/games/tfv/sound_effects.s +++ b/games/tfv/sound_effects.s @@ -47,6 +47,27 @@ done_menu_error_noise: rts + ;====================== + ; noise when battle counter ready +menu_ready_noise: + + lda SOUND_STATUS + bmi done_menu_ready_noise + + lda #NOTE_A4 + sta speaker_frequency + lda #5 + sta speaker_duration + jsr speaker_tone + + lda #NOTE_A5 + sta speaker_frequency + lda #5 + sta speaker_duration + jsr speaker_tone + +done_menu_ready_noise: + rts ;====================== diff --git a/games/tfv/tfv_battle.s b/games/tfv/tfv_battle.s index b41fadfd..b3c2f212 100644 --- a/games/tfv/tfv_battle.s +++ b/games/tfv/tfv_battle.s @@ -1,3 +1,7 @@ +; +; handle battles +; + ;================================ ; do battle ;================================ @@ -6,6 +10,8 @@ do_battle: lda #34 sta HERO_X + lda #20 + sta HERO_Y lda #0 sta HERO_STATE @@ -15,15 +21,22 @@ do_battle: lda #3 sta HERO_LIMIT - jsr rotate_intro - lda #20 sta BATTLE_COUNT + ;======================== + ; rotate intro + + jsr rotate_intro + + ;======================== + ; zoom to battlefield + + ; jsr zoom_battlefield + ;============================= ; Init Enemy - ;============================= jsr init_enemy @@ -84,13 +97,20 @@ battle_ground_inner: ; 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 @@ -102,20 +122,8 @@ main_battle_loop: jmp battle_draw_normal_hero battle_draw_hero_down: - ; grsim_put_sprite(tfv_defeat,ax-2,24); - lda HERO_X - sec - sbc #2 - sta XPOS - lda #24 - sta YPOS - - lda #tfv_defeat_sprite - sta INH - jsr put_sprite_crop + jsr draw_hero_down jmp battle_done_draw_hero battle_draw_hero_running: @@ -160,7 +168,6 @@ battle_done_draw_hero: ;=========================== ; draw enemy - ;=========================== battle_draw_enemy: ; grsim_put_sprite(enemies[enemy_type].sprite,enemy_x,20); @@ -184,15 +191,20 @@ battle_done_draw_enemy: jsr page_flip - ; pause if dead + ;======================================= + ; handle if dead - ; if (hp==0) { - ; for(i=0;i<15;i++) usleep(100000); - ; break; - ; } + 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: - ; delay for framerate - ; usleep(100000); ;======================= ; handle keypresses @@ -202,6 +214,14 @@ battle_done_draw_enemy: cmp #'Q' beq done_battle + ;======================================== + ; delay for framerate + +; lda #10 +; jsr WAIT + + + ;======================== ; handle enemy attacks @@ -239,17 +259,19 @@ update_battle_counter: ; battle timer expired, take action ; If running, escape - ; TODO: randomly fail at running? */ + ; TODO: randomly fail at running? + lda HERO_STATE and #HERO_STATE_RUNNING - beq battle_no_escape + beq battle_open_menu ; we bravely ran away jmp done_battle -battle_no_escape: + ;====================== ; activate menu +battle_open_menu: lda MENU_STATE cmp #MENU_NONE @@ -258,6 +280,7 @@ battle_no_escape: ; move to main menu lda #MENU_MAIN sta MENU_STATE + jsr menu_ready_noise menu_activated: @@ -288,10 +311,12 @@ done_battle: jsr clear_bottoms - ; running=0; ? - rts +battle_game_over: + rts + + ;****** ** **** **** ** ** ****** **** ****** ****** ****** ;** ** **** ** ** ** ** ** ** ** ** ** ** ** @@ -362,51 +387,6 @@ gr_put_num_ones: - ;=================== - ; heal self - ;=================== - ; heal amount in DAMAGE_VAL (yes, I know) - -heal_self: - clc - lda HERO_HP - adc DAMAGE_VAL - - ; check if HP went down, if so we wrapped - - cmp HERO_HP - bcc heal_self_max ; blt - bcs heal_self_update - -heal_self_max: - lda HERO_HP_MAX - -heal_self_update: - sta HERO_HP - - rts - - ;======================== - ; damage TFV - ;======================== - ; value in DAMAGE_VAL -damage_tfv: - lda DAMAGE_VAL - cmp HERO_HP - bcs damage_hero_too_much ; bge - - sec - lda HERO_HP - sbc DAMAGE_VAL - jmp damage_hero_update - -damage_hero_too_much: - lda #0 - -damage_hero_update: - sta HERO_HP - - rts ;========================= @@ -591,105 +571,3 @@ victory_draw_done: rts - ;============================= - ; done attack - ;============================= - -done_attack: - lda #0 - sta BATTLE_COUNT - - lda #MENU_NONE - sta MENU_STATE - - rts - - - - - - ;============================ - ; draw hero victory - ;============================ - ; draws at HERO_X,HERO_Y - -draw_hero_victory: - lda HERO_X - sta XPOS - lda HERO_Y - sta YPOS - - lda #tfv_victory_sprite - sta INH - jsr put_sprite_crop - - lda HERO_X - sec - sbc #2 - sta XPOS - lda #14 - sta YPOS - - lda #tfv_led_sword_sprite - sta INH - jsr put_sprite_crop - - rts - - - ;============================ - ; draw hero and sword - ;============================ - ; draws at HERO_X,HERO_Y - -draw_hero_and_sword: - - lda HERO_X - sta XPOS - lda HERO_Y - sta YPOS - - lda #tfv_stand_left_sprite - sta INH - - jsr put_sprite_crop - - ; grsim_put_sprite(tfv_led_sword,ax-5,20); - lda HERO_X - sec - sbc #5 - sta XPOS - lda HERO_Y - sta YPOS - - lda #tfv_led_sword_sprite - sta INH - jsr put_sprite_crop - - rts - - - ;===================== - ;===================== - ; long(er) wait - ; waits approximately 10ms * X - ;===================== - ;===================== -long_wait: - lda #64 - jsr WAIT ; delay 1/2(26+27A+5A^2) us, 11,117 - dex - bne long_wait - rts - - - - diff --git a/games/tfv/tfv_battle_draw_hero.s b/games/tfv/tfv_battle_draw_hero.s new file mode 100644 index 00000000..026c9a77 --- /dev/null +++ b/games/tfv/tfv_battle_draw_hero.s @@ -0,0 +1,141 @@ + + + + + + ;============================ + ; draw hero victory + ;============================ + ; draws at HERO_X,HERO_Y + +draw_hero_victory: + lda HERO_X + sta XPOS + lda HERO_Y + sta YPOS + + lda #tfv_victory_sprite + sta INH + jsr put_sprite_crop + + lda HERO_X + sec + sbc #2 + sta XPOS + lda #14 + sta YPOS + + lda #tfv_led_sword_sprite + sta INH + jmp put_sprite_crop ; tail call + + + ;============================ + ; draw hero down + ;============================ + ; draws at HERO_X-2,24 + +draw_hero_down: + + ; grsim_put_sprite(tfv_defeat,ax-2,24); + + lda HERO_X + sec + sbc #2 + sta XPOS + lda #24 + sta YPOS + + lda #tfv_defeat_sprite + sta INH + + jmp put_sprite_crop ; tail call + + + ;============================ + ; draw hero and sword + ;============================ + ; draws at HERO_X,HERO_Y + +draw_hero_and_sword: + + lda HERO_X + sta XPOS + lda HERO_Y + sta YPOS + + lda #tfv_stand_left_sprite + sta INH + + jsr put_sprite_crop + + ; grsim_put_sprite(tfv_led_sword,ax-5,20); + lda HERO_X + sec + sbc #5 + sta XPOS + lda HERO_Y + sta YPOS + + lda #tfv_led_sword_sprite + sta INH + + jmp put_sprite_crop ; tail call + + + + ;=================== + ; heal hero + ;=================== + ; heal amount in DAMAGE_VAL (yes, I know) + +heal_hero: + clc + lda HERO_HP + adc DAMAGE_VAL + + ; check if HP went down, if so we wrapped + + cmp HERO_HP + bcc heal_self_max ; blt + bcs heal_self_update + +heal_self_max: + lda HERO_HP_MAX + +heal_self_update: + sta HERO_HP + + rts + + ;======================== + ; damage hero + ;======================== + ; value in DAMAGE_VAL +damage_hero: + lda DAMAGE_VAL + cmp HERO_HP + bcs damage_hero_too_much ; bge + + sec + lda HERO_HP + sbc DAMAGE_VAL + jmp damage_hero_update + +damage_hero_too_much: + lda #0 + +damage_hero_update: + sta HERO_HP + + rts diff --git a/games/tfv/tfv_battle_magic.s b/games/tfv/tfv_battle_magic.s index a114d93a..93dc16b4 100644 --- a/games/tfv/tfv_battle_magic.s +++ b/games/tfv/tfv_battle_magic.s @@ -208,7 +208,7 @@ magic_happens_loop: jmp done_magic_damage was_heal_magic: - jsr heal_self + jsr heal_hero done_magic_damage: jsr draw_battle_bottom diff --git a/games/tfv/tfv_battle_menu.s b/games/tfv/tfv_battle_menu.s index 6c640724..8549d8e2 100644 --- a/games/tfv/tfv_battle_menu.s +++ b/games/tfv/tfv_battle_menu.s @@ -1,44 +1,56 @@ - +; +; draw the bottom status/battle bar +; and associated menus +; ;======================== ; draw_battle_bottom ;======================== -; static int draw_battle_bottom(int enemy_type) { draw_battle_bottom: jsr clear_bottom jsr normal_text - ; print(enemies[enemy_type].name); + ;========================= + ; print current enemy name + lda #battle_enemy_string sta OUTH jsr move_and_print + ;=========================== + ; print current enemy attack + ; only if attacking ; if (enemy_attacking) { ; print_inverse(enemies[enemy_type].attack_name); ; } - ; print name string + ;======================= + ; print hero name string + lda #battle_name_string sta OUTH jsr move_and_print -; if (susie_out) { -; vtab(23); -; htab(15); -; move_cursor(); -; print("SUSIE"); -; } + ;============================= + ; print susie name if in party + + ; if (susie_out) { + ; vtab(23); + ; htab(15); + ; move_cursor(); + ; print("SUSIE"); + ;======================== ; jump to current menu ; set up jump table fakery @@ -65,6 +77,9 @@ battle_menu_jump_table_h: .byte >(draw_battle_menu_limit-1) + ;============================= + ; just draw stats, not menu + ;============================= draw_battle_menu_none: ;====================== ; TFV Stats @@ -122,37 +137,29 @@ plain_limit: jsr draw_bargraph -; ; Susie Stats -; if (susie_out) { -; vtab(23); -; htab(24); -; move_cursor(); -; print_byte(255); -; -; vtab(23); -; htab(27); -; move_cursor(); -; print_byte(0); -; -; ; Draw Time bargraph -; ram[COLOR]=0xa0; -; hlin_double(ram[DRAW_PAGE],30,34,42); -; ram[COLOR]=0x20; -; if (battle_bar) { -; hlin_double(ram[DRAW_PAGE],30,30+(battle_bar-1),42); -; } -; -; ; Draw Limit break bargraph -; ram[COLOR]=0xa0; -; hlin_double(ram[DRAW_PAGE],35,39,42); -; -; ram[COLOR]=0x20; -; if (limit) hlin_double(ram[DRAW_PAGE],35,35+limit,42); + ;======================== + ; draw susie stats if in party + + ; Susie Stats + ;if (susie_out) { + ; vtab(23); + ; htab(24); + ; move_cursor(); + ; print_byte(255); + ; vtab(23); + ; htab(27); + ; move_cursor(); + ; print_byte(0); + ; + ; Draw Time bargraph + ; Draw Limit break bargraph jmp done_draw_battle_menu + ;====================== ; draw main battle menu + ;====================== draw_battle_menu_main: ; wrap location @@ -235,12 +242,14 @@ print_menu_limit: jsr move_and_print jsr normal_text - done_battle_draw_menu_main: jmp done_draw_battle_menu + ;========================= - ; menu summon + ; draw summon menu + ;========================= + draw_battle_menu_summon: lda #