tfv: enemy can fight back

This commit is contained in:
Vince Weaver 2021-01-19 00:32:10 -05:00
parent 9161646c39
commit 039bd80bc7
6 changed files with 144 additions and 65 deletions

View File

@ -8,8 +8,9 @@ short-term:
- if not enough magic points, grey out? somehow
the ones we can't cast
- adjust color of fight background based on ground color
- enemy can attack
- randomize/generic enemy
- get limit timer working properly
- handle dying properly (game over at bottom of screen)
+ load game support

View File

@ -20,6 +20,7 @@ do_battle:
sta MENU_STATE
sta MENU_POSITION
sta ENEMY_DEAD
sta ENEMY_ATTACKING
; FIXME: set limit break
lda #3
@ -233,7 +234,7 @@ done_battle_handle_dead:
;========================================
; delay for framerate
lda #20
lda #50
jsr WAIT
@ -241,6 +242,9 @@ done_battle_handle_dead:
;========================
; handle enemy attacks
lda ENEMY_DEAD
bne battle_done_enemy_attack
lda ENEMY_COUNT
bne battle_no_enemy_attack
battle_start_enemy_attack:
@ -248,22 +252,11 @@ 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
dec ENEMY_COUNT ; countdown until attack
battle_done_enemy_attack:
;===============================
; handle battle counter

View File

@ -37,17 +37,17 @@ draw_hero_victory:
;============================
; draw hero down
;============================
; draws at HERO_X-2,24
; draws at HERO_X-2,26
draw_hero_down:
; grsim_put_sprite(tfv_defeat,ax-2,24);
; grsim_put_sprite(tfv_defeat,ax-2,26);
lda HERO_X
sec
sbc #2
sta XPOS
lda #24
lda #26
sta YPOS
lda #<tfv_defeat_sprite

View File

@ -217,49 +217,107 @@ damage_enemy_done:
;===============================
enemy_attack:
; int ax=enemy_x;
; int damage=10;
lda #$10
sta DAMAGE_VAL_LO
lda #$00
sta DAMAGE_VAL_HI
; enemy_attacking=1;
lda #1
sta ENEMY_ATTACKING
; while(ax<30) {
enemy_attack_loop:
; put attack name on
; occasionally attack with that enemy's power?
; occasionally heal self?
; put attack name on
; occasionally attack with that enemy's power?
; occasionally heal self?
; gr_copy_to_current(0xc00);
;======================
; copy over background
; draw first so behind enemy
; grsim_put_sprite(tfv_stand_left,tfv_x,20);
; grsim_put_sprite(tfv_led_sword,tfv_x-5,20);
jsr gr_copy_to_current
; if (ax&1) {
; grsim_put_sprite(enemies[enemy_type].sprite,ax,20);
; }
; else {
; grsim_put_sprite(enemies[enemy_type].sprite,ax,20);
; }
; draw hero first so behind enemy
; draw_battle_bottom(enemy_type);
jsr draw_hero_and_sword
; page_flip();
; draw enemy
lda ENEMY_X
sta XPOS
lda #20
sta YPOS
jsr draw_enemy
; ax+=1;
;============
; draw bottom
; usleep(20000);
; }
; enemy_attacking=0;
jsr draw_battle_bottom
; damage_tfv(damage);
; gr_put_num(25,10,damage);
; draw_battle_bottom(enemy_type);
;============
; page flip
; page_flip();
; usleep(250000);
jsr page_flip
; return damage;
;}
;============
; delay a bit
lda #50
jsr WAIT
inc ENEMY_X
lda ENEMY_X
cmp #30
bcc enemy_attack_loop
enemy_done_charging:
; damage the hero
jsr damage_hero
; update limit count
; max out at 5
lda HERO_LIMIT
cmp #5
beq battle_no_inc_limit
inc HERO_LIMIT
battle_no_inc_limit:
; print damage
lda #25
sta XPOS
lda #10
sta YPOS
jsr gr_put_num
; draw bottom
jsr draw_battle_bottom
; flip page
jsr page_flip
; wait 1s
ldx #100
jsr long_wait
done_enemy_attack:
; done attacking
lda #0
sta ENEMY_ATTACKING
; move back to left
lda #0
sta ENEMY_X
; reset enemy time. FIXME: variable?
lda #100
sta ENEMY_COUNT
rts

View File

@ -35,9 +35,18 @@ frame_no_oflo:
; print current enemy attack
; only if attacking
; if (enemy_attacking) {
; print_inverse(enemies[enemy_type].attack_name);
; }
lda ENEMY_ATTACKING
beq done_print_enemy_attack
jsr inverse_text
lda #<battle_enemy_attack_string
sta OUTL
lda #>battle_enemy_attack_string
sta OUTH
jsr move_and_print
jsr normal_text
done_print_enemy_attack:
;=======================
; print hero name string
@ -105,7 +114,7 @@ draw_battle_menu_none:
; make limit label flash if at limit break
lda HERO_LIMIT
cmp #4
cmp #5
bcc plain_limit
jsr flash_text
plain_limit:
@ -174,17 +183,9 @@ draw_battle_menu_main:
; wrap location
lda HERO_LIMIT
cmp #3
bcs limit3_wrap ; bge
limit4_wrap:
lda MENU_POSITION
cmp #4
bcc done_menu_wrap
lda #4
sta MENU_POSITION
bne done_menu_wrap ; bra
limit3_wrap:
bcs limit4_wrap ; bge
limit5_wrap:
lda MENU_POSITION
cmp #5
bcc done_menu_wrap
@ -192,6 +193,14 @@ limit3_wrap:
sta MENU_POSITION
bne done_menu_wrap ; bra
limit4_wrap:
lda MENU_POSITION
cmp #6
bcc done_menu_wrap
lda #6
sta MENU_POSITION
bne done_menu_wrap ; bra
done_menu_wrap:
lda #<battle_menu_main
@ -242,7 +251,7 @@ print_menu_escape:
lda HERO_LIMIT
cmp #4
cmp #5
bcc done_battle_draw_menu_main ; only draw if limit >=4
cpx #MENU_MAIN_LIMIT
@ -867,7 +876,24 @@ update_hero_hp:
sta OUTH
lda HERO_HP_HI
beq update_hero_hp_bottom_byte
bne update_hero_hp_top_byte
lda #' '|$80
ldy #0
sta (OUTL),Y
iny
sta (OUTL),Y
lda OUTL
clc
adc #2
sta OUTL
lda OUTH
adc #0
sta OUTH
jmp update_hero_hp_bottom_byte
update_hero_hp_top_byte:
jsr convert_bcd_to_string
update_hero_hp_bottom_byte:
lda HERO_HP_LO

View File

@ -164,6 +164,7 @@ MAGIC_Y = $D2
FINGER_DIRECTION= $D3
ENEMY_DEAD = $D4
MAGIC_COST = $D5
ENEMY_ATTACKING = $D6
COLOR1 = $E0
COLOR2 = $E1