From 614778e99962b3f056b64be7fa0753f8715152c2 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Sun, 17 Jan 2021 15:22:30 -0500 Subject: [PATCH] tfv: split off summons --- games/tfv/Makefile | 3 +- games/tfv/tfv_battle.s | 531 --------------------------------- games/tfv/tfv_battle_boss.s | 148 +++++++++ games/tfv/tfv_battle_summons.s | 389 ++++++++++++++++++++++++ games/tfv/tfv_world.s | 3 + 5 files changed, 542 insertions(+), 532 deletions(-) create mode 100644 games/tfv/tfv_battle_boss.s create mode 100644 games/tfv/tfv_battle_summons.s diff --git a/games/tfv/Makefile b/games/tfv/Makefile index cd8fd032..e0509f6b 100644 --- a/games/tfv/Makefile +++ b/games/tfv/Makefile @@ -76,7 +76,8 @@ TFV_WORLD: tfv_world.o tfv_world.o: tfv_world.s zp.inc \ tfv_overworld.s tfv_drawmap.s \ - tfv_battle.s tfv_battle_menu.s tfv_battle_limit.s \ + tfv_battle.s tfv_battle_menu.s tfv_battle_limit.s tfv_battle_summons.s \ + tfv_battle_boss.s \ help_overworld.s rotate_intro.s \ sound_effects.s speaker_tone.s \ graphics_map/tfv_backgrounds.inc \ diff --git a/games/tfv/tfv_battle.s b/games/tfv/tfv_battle.s index 36e93ffe..cfbb8448 100644 --- a/games/tfv/tfv_battle.s +++ b/games/tfv/tfv_battle.s @@ -1098,390 +1098,6 @@ done_magic_damage: - ;======================== - ; summon metrocat - ;======================== -summon_metrocat: - - lda #$17 - sta DAMAGE_VAL - - lda #28 - sta MAGIC_X - lda #2 - sta MAGIC_Y - - ;=========================== - ; draw looming metrocat head - - lda #30 - sta ANIMATE_LOOP -looming_metrocat_loop: - - jsr gr_copy_to_current - - ; draw hero - lda #34 - sta HERO_X - jsr draw_hero_and_sword - - ; draw enemy - lda ENEMY_X - sta XPOS - lda #20 - sta YPOS - jsr draw_enemy - - ; draw metrocat's head - - lda MAGIC_X - sta XPOS - lda MAGIC_Y - sta YPOS - - lda #metrocat_sprite - sta INH - - jsr put_sprite_crop - - ; draw battle bottom - - jsr draw_battle_bottom - - jsr page_flip - - lda #75 - jsr WAIT ; delay a bit - - dec ANIMATE_LOOP - bne looming_metrocat_loop - -move_metrocat_loop: - - jsr gr_copy_to_current - - jsr draw_hero_and_sword - - ; draw enemy - lda ENEMY_X - sta XPOS - lda #20 - sta YPOS - jsr draw_enemy - - ; draw metrocat's head - - lda MAGIC_X - sta XPOS - lda MAGIC_Y - sta YPOS - - lda #metrocat_sprite - sta INH - - jsr put_sprite_crop - - ; draw battle bottom - - jsr draw_battle_bottom - - jsr page_flip - - lda #50 ; delay - jsr WAIT - - dec MAGIC_X - lda MAGIC_X - - cmp #15 - bcs metrocat_no_move_y - - ; have to keep even - - and #1 - bne metrocat_no_move_y - - inc MAGIC_Y - inc MAGIC_Y - -metrocat_no_move_y: - lda MAGIC_X - cmp #5 ; move until X=5 - bcs move_metrocat_loop - - - lda #30 - sta ANIMATE_LOOP - -metrocat_damage_loop: - jsr gr_copy_to_current - - jsr draw_hero_and_sword - - ; draw enemy - lda ENEMY_X - sta XPOS - lda #20 - sta YPOS - jsr draw_enemy - - ; draw metrocat's head - - lda MAGIC_X - sta XPOS - lda MAGIC_Y - sta YPOS - - lda #metrocat_sprite - sta INH - - jsr put_sprite_crop - - jsr draw_battle_bottom - - jsr page_flip - - lda #50 - jsr WAIT - - dec ANIMATE_LOOP - bne metrocat_damage_loop - - jsr gr_copy_to_current - - ; draw enemy - - lda ENEMY_X - sta XPOS - lda #20 - sta YPOS - jsr draw_enemy - - ; draw hero - - jsr draw_hero_and_sword - - ; draw bottom - - jsr draw_battle_bottom - - jsr damage_enemy - - lda #2 - sta XPOS - lda #10 - sta YPOS - - jsr gr_put_num - - jsr page_flip - - ; long wait (2s?) - ldx #200 - jsr long_wait - - rts - - - - ;========================= - ; Vortex Cannon - ;========================= - -summon_vortex_cannon: - - lda #5 - sta DAMAGE_VAL - - lda #20 - sta MAGIC_X - sta MAGIC_Y - - - ; draw the cannon - - lda #30 - sta ANIMATE_LOOP - -vortex_setup_loop: - jsr gr_copy_to_current - - - ; draw hero - lda #34 - sta HERO_X - jsr draw_hero_and_sword - - ; draw enemy - lda ENEMY_X - sta XPOS - lda #20 - sta YPOS - jsr draw_enemy - - ; grsim_put_sprite(vortex_cannon,ax,ay); - - ; draw vortex_cannon - - lda #20 - sta XPOS - lda #20 - sta YPOS - - lda #vortex_cannon_sprite - sta INH - - jsr put_sprite_crop - - ; draw bottom - - jsr draw_battle_bottom - - jsr page_flip - - lda #50 - jsr WAIT - - dec ANIMATE_LOOP - bne vortex_setup_loop - - - ; Fire vortices - - - lda #5 - sta ANIMATE_LOOP - -vortex_cannon_fire_loop: - - lda #20 - sta MAGIC_X - -vortex_cannon_move_loop: - - jsr gr_copy_to_current - - ; draw hero - jsr draw_hero_and_sword - - ; draw enemy - lda ENEMY_X - sta XPOS - lda #20 - sta YPOS - jsr draw_enemy - - ; draw vortex_cannon - - lda #20 - sta XPOS - lda #20 - sta YPOS - - lda #vortex_cannon_sprite - sta INH - - jsr put_sprite_crop - - ; draw vortex - - lda MAGIC_X - sta XPOS - lda #24 - sta YPOS - - lda #vortex_sprite - sta INH - - jsr put_sprite_crop - - jsr draw_battle_bottom - - - ; print damage if < 10 - lda MAGIC_X - cmp #10 - bcs vortex_no_print_damage - - lda #2 - sta XPOS - lda #10 - sta YPOS - - jsr gr_put_num - -vortex_no_print_damage: - - jsr page_flip - - lda #100 - jsr WAIT - - dec MAGIC_X - - lda MAGIC_X - cmp #5 - bcs vortex_cannon_move_loop - - ; damage enemy - jsr damage_enemy - - dec ANIMATE_LOOP - bne vortex_cannon_fire_loop - - - ; end of summon - - - jsr gr_copy_to_current - - ; draw enemy - lda ENEMY_X - sta XPOS - lda #20 - sta YPOS - jsr draw_enemy - - ; draw hero - jsr draw_hero_and_sword - - jsr draw_battle_bottom - - jsr page_flip - - ; wait 2s - ldx #200 - jsr long_wait - - rts - - ;========================= - ; summon - ;========================= -summon: - lda MENU_POSITION - beq do_summon_metrocat - bne do_summon_vortex_cannon - -do_summon_metrocat: - jmp summon_metrocat -do_summon_vortex_cannon: - jmp summon_vortex_cannon - - rts - ;============================= ; done attack @@ -1601,151 +1217,4 @@ long_wait: - ;==================== - ;==================== - ; Boss Battle - ;==================== - ;==================== - -boss_battle: - -; int i,ch; - -; int saved_drawpage; - -; int ax=34; -; int enemy_count=30; -; int old; - - -; susie_out=1; - -; rotate_intro(); - -; battle_count=20; - -; enemy_type=8; - -; enemy_hp=255; - -; saved_drawpage=ram[DRAW_PAGE]; - -; ram[DRAW_PAGE]=PAGE2; - - ;===================== - ; Draw background - - ; Draw sky */ -; color_equals(COLOR_BLACK); -; for(i=0;i<20;i++) { -; hlin_double(ram[DRAW_PAGE],0,39,i); -; } - -; color_equals(COLOR_ORANGE); -; for(i=20;i<39;i++) { -; hlin_double(ram[DRAW_PAGE],0,39,i); -; } - - ; Draw horizon */ -; color_equals(COLOR_GREY); -; hlin_double(ram[DRAW_PAGE],0,39,10); - -; ram[DRAW_PAGE]=saved_drawpage; - -; draw_battle_bottom(enemy_type); - -; while(1) { - -; gr_copy_to_current(0xc00); -; -; if (hp==0) { -; grsim_put_sprite(tfv_defeat,ax-2,24); -; } -; else if (running) { -; if (battle_count%2) { -; grsim_put_sprite(tfv_stand_right,ax,20); -; } -; else { -; grsim_put_sprite(tfv_walk_right,ax,20); -; } -; } -; else { -; grsim_put_sprite(tfv_stand_left,ax,20); -; grsim_put_sprite(tfv_led_sword,ax-5,20); -; } -; -; grsim_put_sprite(susie_left,28,30); -; -; if ((enemy_count&0xf)<4) { -; grsim_put_sprite(roboknee1,enemy_x,16); -; } -; else { -; grsim_put_sprite(roboknee2,enemy_x,16); -; } -; -; draw_battle_bottom(enemy_type); -; -; page_flip(); -; -; if (hp==0) { -; for(i=0;i<15;i++) usleep(100000); -; break; -; } -; -; usleep(100000); -; -; ch=grsim_input(); -; if (ch=='q') return 0; -; -; if (enemy_count==0) { -; ; attack and decrement HP -; enemy_attack(ax); -; ; update limit count -; if (limit<4) limit++; -; -; ; reset enemy time. FIXME: variable? -; enemy_count=50; -; } -; else { -; enemy_count--; -; } -; -; if (battle_count>=64) { -; -; ; TODO: randomly fail at running? */ -; if (running) { -; break; -; } -; -; if (menu_state==MENU_NONE) menu_state=MENU_MAIN; -; menu_keypress(ch); -; -; } else { -; battle_count++; -; } -; -; old=battle_bar; -; battle_bar=(battle_count/16); -; if (battle_bar!=old) draw_battle_bottom(enemy_type); -; -; -; if (enemy_hp==0) { -; ; FIXME? -; victory_dance(); -; break; -; } -; -; -; } -; -; ram[DRAW_PAGE]=PAGE0; -; clear_bottom(); -; ram[DRAW_PAGE]=PAGE1; -; clear_bottom(); -; -; running=0; -; -; return 0; -;} - diff --git a/games/tfv/tfv_battle_boss.s b/games/tfv/tfv_battle_boss.s new file mode 100644 index 00000000..d0b74625 --- /dev/null +++ b/games/tfv/tfv_battle_boss.s @@ -0,0 +1,148 @@ + + ;==================== + ;==================== + ; Boss Battle + ;==================== + ;==================== + +boss_battle: + +; int i,ch; + +; int saved_drawpage; + +; int ax=34; +; int enemy_count=30; +; int old; + + +; susie_out=1; + +; rotate_intro(); + +; battle_count=20; + +; enemy_type=8; + +; enemy_hp=255; + +; saved_drawpage=ram[DRAW_PAGE]; + +; ram[DRAW_PAGE]=PAGE2; + + ;===================== + ; Draw background + + ; Draw sky */ +; color_equals(COLOR_BLACK); +; for(i=0;i<20;i++) { +; hlin_double(ram[DRAW_PAGE],0,39,i); +; } + +; color_equals(COLOR_ORANGE); +; for(i=20;i<39;i++) { +; hlin_double(ram[DRAW_PAGE],0,39,i); +; } + + ; Draw horizon */ +; color_equals(COLOR_GREY); +; hlin_double(ram[DRAW_PAGE],0,39,10); + +; ram[DRAW_PAGE]=saved_drawpage; + +; draw_battle_bottom(enemy_type); + +; while(1) { + +; gr_copy_to_current(0xc00); +; +; if (hp==0) { +; grsim_put_sprite(tfv_defeat,ax-2,24); +; } +; else if (running) { +; if (battle_count%2) { +; grsim_put_sprite(tfv_stand_right,ax,20); +; } +; else { +; grsim_put_sprite(tfv_walk_right,ax,20); +; } +; } +; else { +; grsim_put_sprite(tfv_stand_left,ax,20); +; grsim_put_sprite(tfv_led_sword,ax-5,20); +; } +; +; grsim_put_sprite(susie_left,28,30); +; +; if ((enemy_count&0xf)<4) { +; grsim_put_sprite(roboknee1,enemy_x,16); +; } +; else { +; grsim_put_sprite(roboknee2,enemy_x,16); +; } +; +; draw_battle_bottom(enemy_type); +; +; page_flip(); +; +; if (hp==0) { +; for(i=0;i<15;i++) usleep(100000); +; break; +; } +; +; usleep(100000); +; +; ch=grsim_input(); +; if (ch=='q') return 0; +; +; if (enemy_count==0) { +; ; attack and decrement HP +; enemy_attack(ax); +; ; update limit count +; if (limit<4) limit++; +; +; ; reset enemy time. FIXME: variable? +; enemy_count=50; +; } +; else { +; enemy_count--; +; } +; +; if (battle_count>=64) { +; +; ; TODO: randomly fail at running? */ +; if (running) { +; break; +; } +; +; if (menu_state==MENU_NONE) menu_state=MENU_MAIN; +; menu_keypress(ch); +; +; } else { +; battle_count++; +; } +; +; old=battle_bar; +; battle_bar=(battle_count/16); +; if (battle_bar!=old) draw_battle_bottom(enemy_type); +; +; +; if (enemy_hp==0) { +; ; FIXME? +; victory_dance(); +; break; +; } +; +; +; } +; +; ram[DRAW_PAGE]=PAGE0; +; clear_bottom(); +; ram[DRAW_PAGE]=PAGE1; +; clear_bottom(); +; +; running=0; +; +; return 0; +;} + rts diff --git a/games/tfv/tfv_battle_summons.s b/games/tfv/tfv_battle_summons.s new file mode 100644 index 00000000..30844949 --- /dev/null +++ b/games/tfv/tfv_battle_summons.s @@ -0,0 +1,389 @@ + + + ;======================== + ; summon metrocat + ;======================== +summon_metrocat: + + lda #$17 + sta DAMAGE_VAL + + lda #28 + sta MAGIC_X + lda #2 + sta MAGIC_Y + + ;=========================== + ; draw looming metrocat head + + lda #30 + sta ANIMATE_LOOP +looming_metrocat_loop: + + jsr gr_copy_to_current + + ; draw hero + lda #34 + sta HERO_X + jsr draw_hero_and_sword + + ; draw enemy + lda ENEMY_X + sta XPOS + lda #20 + sta YPOS + jsr draw_enemy + + ; draw metrocat's head + + lda MAGIC_X + sta XPOS + lda MAGIC_Y + sta YPOS + + lda #metrocat_sprite + sta INH + + jsr put_sprite_crop + + ; draw battle bottom + + jsr draw_battle_bottom + + jsr page_flip + + lda #75 + jsr WAIT ; delay a bit + + dec ANIMATE_LOOP + bne looming_metrocat_loop + +move_metrocat_loop: + + jsr gr_copy_to_current + + jsr draw_hero_and_sword + + ; draw enemy + lda ENEMY_X + sta XPOS + lda #20 + sta YPOS + jsr draw_enemy + + ; draw metrocat's head + + lda MAGIC_X + sta XPOS + lda MAGIC_Y + sta YPOS + + lda #metrocat_sprite + sta INH + + jsr put_sprite_crop + + ; draw battle bottom + + jsr draw_battle_bottom + + jsr page_flip + + lda #50 ; delay + jsr WAIT + + dec MAGIC_X + lda MAGIC_X + + cmp #15 + bcs metrocat_no_move_y + + ; have to keep even + + and #1 + bne metrocat_no_move_y + + inc MAGIC_Y + inc MAGIC_Y + +metrocat_no_move_y: + lda MAGIC_X + cmp #5 ; move until X=5 + bcs move_metrocat_loop + + + lda #30 + sta ANIMATE_LOOP + +metrocat_damage_loop: + jsr gr_copy_to_current + + jsr draw_hero_and_sword + + ; draw enemy + lda ENEMY_X + sta XPOS + lda #20 + sta YPOS + jsr draw_enemy + + ; draw metrocat's head + + lda MAGIC_X + sta XPOS + lda MAGIC_Y + sta YPOS + + lda #metrocat_sprite + sta INH + + jsr put_sprite_crop + + jsr draw_battle_bottom + + jsr page_flip + + lda #50 + jsr WAIT + + dec ANIMATE_LOOP + bne metrocat_damage_loop + + jsr gr_copy_to_current + + ; draw enemy + + lda ENEMY_X + sta XPOS + lda #20 + sta YPOS + jsr draw_enemy + + ; draw hero + + jsr draw_hero_and_sword + + ; draw bottom + + jsr draw_battle_bottom + + jsr damage_enemy + + lda #2 + sta XPOS + lda #10 + sta YPOS + + jsr gr_put_num + + jsr page_flip + + ; long wait (2s?) + ldx #200 + jsr long_wait + + rts + + + + ;========================= + ; Vortex Cannon + ;========================= + +summon_vortex_cannon: + + lda #5 + sta DAMAGE_VAL + + lda #20 + sta MAGIC_X + sta MAGIC_Y + + + ; draw the cannon + + lda #30 + sta ANIMATE_LOOP + +vortex_setup_loop: + jsr gr_copy_to_current + + + ; draw hero + lda #34 + sta HERO_X + jsr draw_hero_and_sword + + ; draw enemy + lda ENEMY_X + sta XPOS + lda #20 + sta YPOS + jsr draw_enemy + + ; grsim_put_sprite(vortex_cannon,ax,ay); + + ; draw vortex_cannon + + lda #20 + sta XPOS + lda #20 + sta YPOS + + lda #vortex_cannon_sprite + sta INH + + jsr put_sprite_crop + + ; draw bottom + + jsr draw_battle_bottom + + jsr page_flip + + lda #50 + jsr WAIT + + dec ANIMATE_LOOP + bne vortex_setup_loop + + + ; Fire vortices + + + lda #5 + sta ANIMATE_LOOP + +vortex_cannon_fire_loop: + + lda #20 + sta MAGIC_X + +vortex_cannon_move_loop: + + jsr gr_copy_to_current + + ; draw hero + jsr draw_hero_and_sword + + ; draw enemy + lda ENEMY_X + sta XPOS + lda #20 + sta YPOS + jsr draw_enemy + + ; draw vortex_cannon + + lda #20 + sta XPOS + lda #20 + sta YPOS + + lda #vortex_cannon_sprite + sta INH + + jsr put_sprite_crop + + ; draw vortex + + lda MAGIC_X + sta XPOS + lda #24 + sta YPOS + + lda #vortex_sprite + sta INH + + jsr put_sprite_crop + + jsr draw_battle_bottom + + + ; print damage if < 10 + lda MAGIC_X + cmp #10 + bcs vortex_no_print_damage + + lda #2 + sta XPOS + lda #10 + sta YPOS + + jsr gr_put_num + +vortex_no_print_damage: + + jsr page_flip + + lda #100 + jsr WAIT + + dec MAGIC_X + + lda MAGIC_X + cmp #5 + bcs vortex_cannon_move_loop + + ; damage enemy + jsr damage_enemy + + dec ANIMATE_LOOP + bne vortex_cannon_fire_loop + + + ; end of summon + + + jsr gr_copy_to_current + + ; draw enemy + lda ENEMY_X + sta XPOS + lda #20 + sta YPOS + jsr draw_enemy + + ; draw hero + jsr draw_hero_and_sword + + jsr draw_battle_bottom + + jsr page_flip + + ; wait 2s + ldx #200 + jsr long_wait + + rts + + ;========================= + ; summon + ;========================= +summon: + lda MENU_POSITION + beq do_summon_metrocat + bne do_summon_vortex_cannon + +do_summon_metrocat: + jmp summon_metrocat +do_summon_vortex_cannon: + jmp summon_vortex_cannon + + rts + + + + diff --git a/games/tfv/tfv_world.s b/games/tfv/tfv_world.s index 25e15640..d6035204 100644 --- a/games/tfv/tfv_world.s +++ b/games/tfv/tfv_world.s @@ -60,6 +60,9 @@ .include "tfv_battle.s" .include "tfv_battle_menu.s" .include "tfv_battle_limit.s" +.include "tfv_battle_summons.s" +.include "tfv_battle_boss.s" + .include "rotate_intro.s" ;===============================================