tfv: split off hero drawing code

This commit is contained in:
Vince Weaver 2021-01-17 16:12:06 -05:00
parent 403cd5a3b4
commit a7725fd35b
8 changed files with 325 additions and 221 deletions

View File

@ -75,9 +75,10 @@ TFV_WORLD: tfv_world.o
ld65 -o TFV_WORLD tfv_world.o -C ../../linker_scripts/apple2_2000.inc ld65 -o TFV_WORLD tfv_world.o -C ../../linker_scripts/apple2_2000.inc
tfv_world.o: tfv_world.s zp.inc \ tfv_world.o: tfv_world.s zp.inc \
long_wait.s \
tfv_overworld.s tfv_drawmap.s \ tfv_overworld.s tfv_drawmap.s \
tfv_battle.s tfv_battle_menu.s tfv_battle_limit.s tfv_battle_summons.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 \ tfv_battle_boss.s \
help_overworld.s rotate_intro.s \ help_overworld.s rotate_intro.s \
sound_effects.s speaker_tone.s \ sound_effects.s speaker_tone.s \

16
games/tfv/long_wait.s Normal file
View File

@ -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

View File

@ -47,6 +47,27 @@ done_menu_error_noise:
rts 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
;====================== ;======================

View File

@ -1,3 +1,7 @@
;
; handle battles
;
;================================ ;================================
; do battle ; do battle
;================================ ;================================
@ -6,6 +10,8 @@ do_battle:
lda #34 lda #34
sta HERO_X sta HERO_X
lda #20
sta HERO_Y
lda #0 lda #0
sta HERO_STATE sta HERO_STATE
@ -15,15 +21,22 @@ do_battle:
lda #3 lda #3
sta HERO_LIMIT sta HERO_LIMIT
jsr rotate_intro
lda #20 lda #20
sta BATTLE_COUNT sta BATTLE_COUNT
;========================
; rotate intro
jsr rotate_intro
;========================
; zoom to battlefield
; jsr zoom_battlefield
;============================= ;=============================
; Init Enemy ; Init Enemy
;=============================
jsr init_enemy jsr init_enemy
@ -84,13 +97,20 @@ battle_ground_inner:
; update bottom of screen ; update bottom of screen
jsr draw_battle_bottom jsr draw_battle_bottom
;========================================
; main battle loop
;========================================
main_battle_loop: main_battle_loop:
;============================
; copy background into place
jsr gr_copy_to_current jsr gr_copy_to_current
;======================================== ;========================================
; draw our hero ; draw our hero
;========================================
lda HERO_HP lda HERO_HP
beq battle_draw_hero_down beq battle_draw_hero_down
@ -102,20 +122,8 @@ main_battle_loop:
jmp battle_draw_normal_hero jmp battle_draw_normal_hero
battle_draw_hero_down: battle_draw_hero_down:
; grsim_put_sprite(tfv_defeat,ax-2,24);
lda HERO_X jsr draw_hero_down
sec
sbc #2
sta XPOS
lda #24
sta YPOS
lda #<tfv_defeat_sprite
sta INL
lda #>tfv_defeat_sprite
sta INH
jsr put_sprite_crop
jmp battle_done_draw_hero jmp battle_done_draw_hero
battle_draw_hero_running: battle_draw_hero_running:
@ -160,7 +168,6 @@ battle_done_draw_hero:
;=========================== ;===========================
; draw enemy ; draw enemy
;===========================
battle_draw_enemy: battle_draw_enemy:
; grsim_put_sprite(enemies[enemy_type].sprite,enemy_x,20); ; grsim_put_sprite(enemies[enemy_type].sprite,enemy_x,20);
@ -184,15 +191,20 @@ battle_done_draw_enemy:
jsr page_flip jsr page_flip
; pause if dead ;=======================================
; handle if dead
; if (hp==0) { lda HERO_HP
; for(i=0;i<15;i++) usleep(100000); bne done_battle_handle_dead
; break;
; } ; pause for 1.5s
ldx #15
jsr long_wait
jsr battle_game_over
done_battle_handle_dead:
; delay for framerate
; usleep(100000);
;======================= ;=======================
; handle keypresses ; handle keypresses
@ -202,6 +214,14 @@ battle_done_draw_enemy:
cmp #'Q' cmp #'Q'
beq done_battle beq done_battle
;========================================
; delay for framerate
; lda #10
; jsr WAIT
;======================== ;========================
; handle enemy attacks ; handle enemy attacks
@ -239,17 +259,19 @@ update_battle_counter:
; battle timer expired, take action ; battle timer expired, take action
; If running, escape ; If running, escape
; TODO: randomly fail at running? */ ; TODO: randomly fail at running?
lda HERO_STATE lda HERO_STATE
and #HERO_STATE_RUNNING and #HERO_STATE_RUNNING
beq battle_no_escape beq battle_open_menu
; we bravely ran away ; we bravely ran away
jmp done_battle jmp done_battle
battle_no_escape:
;======================
; activate menu ; activate menu
battle_open_menu:
lda MENU_STATE lda MENU_STATE
cmp #MENU_NONE cmp #MENU_NONE
@ -258,6 +280,7 @@ battle_no_escape:
; move to main menu ; move to main menu
lda #MENU_MAIN lda #MENU_MAIN
sta MENU_STATE sta MENU_STATE
jsr menu_ready_noise
menu_activated: menu_activated:
@ -288,10 +311,12 @@ done_battle:
jsr clear_bottoms jsr clear_bottoms
; running=0; ?
rts 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 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 INL
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 INL
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 INL
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 INL
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

View File

@ -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 INL
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 INL
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 INL
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 INL
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 INL
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

View File

@ -208,7 +208,7 @@ magic_happens_loop:
jmp done_magic_damage jmp done_magic_damage
was_heal_magic: was_heal_magic:
jsr heal_self jsr heal_hero
done_magic_damage: done_magic_damage:
jsr draw_battle_bottom jsr draw_battle_bottom

View File

@ -1,44 +1,56 @@
;
; draw the bottom status/battle bar
; and associated menus
;
;======================== ;========================
; draw_battle_bottom ; draw_battle_bottom
;======================== ;========================
; static int draw_battle_bottom(int enemy_type) {
draw_battle_bottom: draw_battle_bottom:
jsr clear_bottom jsr clear_bottom
jsr normal_text jsr normal_text
; print(enemies[enemy_type].name); ;=========================
; print current enemy name
lda #<battle_enemy_string lda #<battle_enemy_string
sta OUTL sta OUTL
lda #>battle_enemy_string lda #>battle_enemy_string
sta OUTH sta OUTH
jsr move_and_print jsr move_and_print
;===========================
; print current enemy attack
; only if attacking
; if (enemy_attacking) { ; if (enemy_attacking) {
; print_inverse(enemies[enemy_type].attack_name); ; print_inverse(enemies[enemy_type].attack_name);
; } ; }
; print name string ;=======================
; print hero name string
lda #<battle_name_string lda #<battle_name_string
sta OUTL sta OUTL
lda #>battle_name_string lda #>battle_name_string
sta OUTH sta OUTH
jsr move_and_print jsr move_and_print
; if (susie_out) { ;=============================
; vtab(23); ; print susie name if in party
; htab(15);
; move_cursor(); ; if (susie_out) {
; print("SUSIE"); ; vtab(23);
; } ; htab(15);
; move_cursor();
; print("SUSIE");
;========================
; jump to current menu ; jump to current menu
; set up jump table fakery ; set up jump table fakery
@ -65,6 +77,9 @@ battle_menu_jump_table_h:
.byte >(draw_battle_menu_limit-1) .byte >(draw_battle_menu_limit-1)
;=============================
; just draw stats, not menu
;=============================
draw_battle_menu_none: draw_battle_menu_none:
;====================== ;======================
; TFV Stats ; TFV Stats
@ -122,37 +137,29 @@ plain_limit:
jsr draw_bargraph jsr draw_bargraph
; ; Susie Stats ;========================
; if (susie_out) { ; draw susie stats if in party
; vtab(23);
; htab(24); ; Susie Stats
; move_cursor(); ;if (susie_out) {
; print_byte(255); ; vtab(23);
; ; htab(24);
; vtab(23); ; move_cursor();
; htab(27); ; print_byte(255);
; move_cursor(); ; vtab(23);
; print_byte(0); ; htab(27);
; ; move_cursor();
; ; Draw Time bargraph ; print_byte(0);
; ram[COLOR]=0xa0; ;
; hlin_double(ram[DRAW_PAGE],30,34,42); ; Draw Time bargraph
; ram[COLOR]=0x20; ; Draw Limit break bargraph
; 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);
jmp done_draw_battle_menu jmp done_draw_battle_menu
;====================== ;======================
; draw main battle menu ; draw main battle menu
;======================
draw_battle_menu_main: draw_battle_menu_main:
; wrap location ; wrap location
@ -235,12 +242,14 @@ print_menu_limit:
jsr move_and_print jsr move_and_print
jsr normal_text jsr normal_text
done_battle_draw_menu_main: done_battle_draw_menu_main:
jmp done_draw_battle_menu jmp done_draw_battle_menu
;========================= ;=========================
; menu summon ; draw summon menu
;=========================
draw_battle_menu_summon: draw_battle_menu_summon:
lda #<battle_menu_summons lda #<battle_menu_summons
@ -274,8 +283,10 @@ print_menu_vortex:
jmp done_draw_battle_menu jmp done_draw_battle_menu
;=======================
; draw magic menu
;======================= ;=======================
; menu magic
draw_battle_menu_magic: draw_battle_menu_magic:
lda #<battle_menu_magic lda #<battle_menu_magic
@ -331,8 +342,10 @@ print_menu_malaise:
jmp done_draw_battle_menu jmp done_draw_battle_menu
;===============================
; draw limit break menu
;=============================== ;===============================
; menu limit
draw_battle_menu_limit: draw_battle_menu_limit:
@ -374,6 +387,9 @@ print_menu_zap:
jsr normal_text jsr normal_text
;============================
; tidy up after drawing menu
;============================
done_draw_battle_menu: done_draw_battle_menu:
@ -403,6 +419,7 @@ done_draw_separator:
rts rts
;=========================== ;===========================
; draw bargraph ; draw bargraph
;=========================== ;===========================
@ -447,6 +464,7 @@ done_bar:
;========================= ;=========================
; battle menu keypress ; battle menu keypress
;========================= ;=========================
; FIXME: help, toggle-sound?
battle_menu_keypress: battle_menu_keypress:
@ -464,11 +482,14 @@ battle_menu_keypress:
cmp #' ' cmp #' '
beq keypress_action beq keypress_action
cmp #13 cmp #13 ; return key
beq keypress_action beq keypress_action
rts rts
;=====================
; pressed escape
keypress_escape: keypress_escape:
lda #MENU_MAIN lda #MENU_MAIN
sta MENU_STATE sta MENU_STATE
@ -528,10 +549,15 @@ done_keypress_left:
jsr menu_move_noise jsr menu_move_noise
rts rts
;===================
; pressed action key
keypress_action: keypress_action:
jsr menu_move_noise jsr menu_move_noise
; handle action based on current menu
lda MENU_STATE lda MENU_STATE
cmp #MENU_MAIN cmp #MENU_MAIN
beq keypress_main_action beq keypress_main_action
@ -542,6 +568,9 @@ keypress_action:
cmp #MENU_SUMMON cmp #MENU_SUMMON
beq keypress_summon_action beq keypress_summon_action
;============================
; handle action on main menu
keypress_main_action: keypress_main_action:
lda MENU_POSITION lda MENU_POSITION
cmp #MENU_MAIN_ATTACK cmp #MENU_MAIN_ATTACK
@ -613,6 +642,23 @@ keypress_summon_action:
rts rts
;=============================
; done attack
;=============================
done_attack:
lda #0
sta BATTLE_COUNT
lda #MENU_NONE
sta MENU_STATE
rts
;========================= ;=========================
; menu strings ; menu strings
;========================= ;=========================

View File

@ -45,13 +45,13 @@
.include "gr_pageflip.s" .include "gr_pageflip.s"
.include "keyboard.s" .include "keyboard.s"
.include "joystick.s" .include "joystick.s"
;.include "gr_putsprite.s"
.include "gr_putsprite_crop.s" .include "gr_putsprite_crop.s"
.include "text_print.s" .include "text_print.s"
.include "gr_copy.s" .include "gr_copy.s"
.include "decompress_fast_v2.s" .include "decompress_fast_v2.s"
.include "gr_offsets.s" .include "gr_offsets.s"
.include "wait_keypressed.s" .include "wait_keypressed.s"
.include "long_wait.s"
;=============================================== ;===============================================
; Battle ; Battle
@ -64,6 +64,7 @@
.include "tfv_battle_limit.s" .include "tfv_battle_limit.s"
.include "tfv_battle_summons.s" .include "tfv_battle_summons.s"
.include "tfv_battle_boss.s" .include "tfv_battle_boss.s"
.include "tfv_battle_draw_hero.s"
.include "rotate_intro.s" .include "rotate_intro.s"