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

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
;======================
; 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
;================================
@ -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 INL
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 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
was_heal_magic:
jsr heal_self
jsr heal_hero
done_magic_damage:
jsr draw_battle_bottom

View File

@ -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 OUTL
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 OUTL
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 #<battle_menu_summons
@ -274,8 +283,10 @@ print_menu_vortex:
jmp done_draw_battle_menu
;=======================
; draw magic menu
;=======================
; menu magic
draw_battle_menu_magic:
lda #<battle_menu_magic
@ -331,8 +342,10 @@ print_menu_malaise:
jmp done_draw_battle_menu
;===============================
; draw limit break menu
;===============================
; menu limit
draw_battle_menu_limit:
@ -374,6 +387,9 @@ print_menu_zap:
jsr normal_text
;============================
; tidy up after drawing menu
;============================
done_draw_battle_menu:
@ -403,6 +419,7 @@ done_draw_separator:
rts
;===========================
; draw bargraph
;===========================
@ -447,6 +464,7 @@ done_bar:
;=========================
; battle menu keypress
;=========================
; FIXME: help, toggle-sound?
battle_menu_keypress:
@ -464,11 +482,14 @@ battle_menu_keypress:
cmp #' '
beq keypress_action
cmp #13
cmp #13 ; return key
beq keypress_action
rts
;=====================
; pressed escape
keypress_escape:
lda #MENU_MAIN
sta MENU_STATE
@ -528,10 +549,15 @@ done_keypress_left:
jsr menu_move_noise
rts
;===================
; pressed action key
keypress_action:
jsr menu_move_noise
; handle action based on current menu
lda MENU_STATE
cmp #MENU_MAIN
beq keypress_main_action
@ -542,6 +568,9 @@ keypress_action:
cmp #MENU_SUMMON
beq keypress_summon_action
;============================
; handle action on main menu
keypress_main_action:
lda MENU_POSITION
cmp #MENU_MAIN_ATTACK
@ -613,6 +642,23 @@ keypress_summon_action:
rts
;=============================
; done attack
;=============================
done_attack:
lda #0
sta BATTLE_COUNT
lda #MENU_NONE
sta MENU_STATE
rts
;=========================
; menu strings
;=========================

View File

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