Currently there seems to be an issue where the animations play longer than the timer.
+#define ATTACK_ANIM_LEN 32
+
player_anim_table:
anim_header 32, player_anim_table_f2
anim_ent 0, 8, 0x8C, OAM_FXFLIP
anim_ent 0, 0, 0x00, 0
player_anim_table_attack_up:
- anim_header 32, player_anim_table
+ anim_header ATTACK_ANIM_LEN, player_anim_table
anim_ent 1, 8, 0x8C, OAM_FXFLIP
anim_ent 1, 0, 0x8E, OAM_FXFLIP
anim_ent -12, 0, ACTION_ATTACK_SPRITE1, 0
player_anim_table_attack_down:
- anim_header 32, player_anim_table
+ anim_header ATTACK_ANIM_LEN, player_anim_table
anim_ent 1, 8, 0x8C, OAM_FXFLIP
anim_ent 1, 0, 0x8E, OAM_FXFLIP
anim_ent 12, 0, ACTION_ATTACK_SPRITE1, 0
player_anim_table_attack_left:
- anim_header 32, player_anim_table
+ anim_header ATTACK_ANIM_LEN, player_anim_table
anim_ent 1, 8, 0x8C, OAM_FXFLIP
anim_ent 1, 0, 0x8E, OAM_FXFLIP
anim_ent 0, -12, ACTION_ATTACK_SPRITE1, 0
player_anim_table_attack_right:
- anim_header 32, player_anim_table
+ anim_header ATTACK_ANIM_LEN, player_anim_table
anim_ent 1, 8, 0x8C, OAM_FXFLIP
anim_ent 1, 0, 0x8E, OAM_FXFLIP
anim_ent 0, 12, ACTION_ATTACK_SPRITE1, 0
; IDLE NEUTRAL
dw unit_demo_guard_anim_table
; ATTACK LEFT
- dw unit_demo_guard_anim_table
+ dw unit_demo_guard_attack_left
; ATTACK RIGHT
- dw unit_demo_guard_anim_table
+ dw unit_demo_guard_attack_right
; ATTACK UP
- dw unit_demo_guard_anim_table
+ dw unit_demo_guard_attack_up
; ATTACK DOWN
- dw unit_demo_guard_anim_table
+ dw unit_demo_guard_attack_down
anim_list_dog:
; idle neutral
dw unit_demo_dog_anim_table
; attack left
- dw unit_demo_dog_anim_table
+ dw unit_demo_dog_attack_left
; attack right
- dw unit_demo_dog_anim_table
+ dw unit_demo_dog_attack_right
; attack up
- dw unit_demo_dog_anim_table
+ dw unit_demo_dog_attack_up
; attack down
- dw unit_demo_dog_anim_table
+ dw unit_demo_dog_attack_down
anim_list_hazmat:
; idle
dw unit_demo_hazmat_anim_table
; attack left
- dw unit_demo_hazmat_anim_table
+ dw unit_demo_hazmat_attack_left
; attack right
- dw unit_demo_hazmat_anim_table
+ dw unit_demo_hazmat_attack_right
; attack up
- dw unit_demo_hazmat_anim_table
+ dw unit_demo_hazmat_attack_up
; attack down
- dw unit_demo_hazmat_anim_table
+ dw unit_demo_hazmat_attack_down
; translates tile to screen
; de: unit
; returns:
; bc: next action
-unit_action_attack:
- push de
- call unit_action_attack_decide_animation
- pop de
-
- push de
+unit_action_attack_finish:
- ; check anim length
- pop de
- ld hl, act_rt_action_dat2 ; dat2 = animation frame count
- add hl, de
- ld a, [hl]
- inc a
- ld [hl], a
- cp a, UNIT_ACTION_ATTACK_ANIM_LEN
- jr z, @done REL
-
- ; otherwsie keep going
- ldnull bc
- ret
-@done:
; unset flag
ld a, [gpf_attack_ongoing]
dec a
ld [gpf_attack_ongoing], a
-
- ; set animation timer and delay
- ld bc, st_unit_delay_to_active_template
+
+ ldnull bc
ret
; performs damage calculations based on the attacked location
; returns:
; bc: new state
unit_action_attack_damage_calc:
+ ; play animation
+ push de
+ call unit_action_attack_decide_animation
+ pop de
; set flag
ld a, [gpf_attack_ongoing]
st_action_attack_pick_direction:
st_def 0x00, unit_action_attack_pick_direction, st_action_attack_pick_direction
st_action_attack_direction_picked:
- st_def 0x00, unit_action_attack, st_action_attack_direction_picked
+ st_def ATTACK_ANIM_LEN, unit_action_attack_finish, st_unit_delay_to_active_fast
st_action_attack_damage_actor:
st_def 0x00, unit_action_attack_damage_calc, st_action_attack_direction_picked
anim_ent 0, 8, 0x8A, 0
anim_ent 0, 0, 0x00, 0
+unit_demo_guard_attack_up:
+ anim_header ATTACK_ANIM_LEN, unit_demo_guard_anim_table
+ anim_ent 0, 0, 0x88, 0
+ anim_ent 0, 8, 0x8A, 0
+ anim_ent -12, 0, ACTION_ATTACK_SPRITE1, 0
+
+unit_demo_guard_attack_down:
+ anim_header ATTACK_ANIM_LEN, unit_demo_guard_anim_table
+ anim_ent 0, 0, 0x88, 0
+ anim_ent 0, 8, 0x8A, 0
+ anim_ent 12, 0, ACTION_ATTACK_SPRITE1, 0
+
+unit_demo_guard_attack_left:
+ anim_header ATTACK_ANIM_LEN, unit_demo_guard_anim_table
+ anim_ent 0, 0, 0x88, 0
+ anim_ent 0, 8, 0x8A, 0
+ anim_ent 0, -12, ACTION_ATTACK_SPRITE1, 0
+
+
+unit_demo_guard_attack_right:
+ anim_header ATTACK_ANIM_LEN, unit_demo_guard_anim_table
+ anim_ent 0, 0, 0x88, 0
+ anim_ent 0, 8, 0x8A, 0
+ anim_ent 0, 12, ACTION_ATTACK_SPRITE1, 0
+
unit_demo_dog_anim_table:
anim_header 0, unit_demo_dog_anim_table
anim_ent 0, 0, 0x90, 0
anim_ent 0, 8, 0x92, 0
anim_ent 0, 0, 0x00, 0
+unit_demo_dog_attack_up:
+ anim_header ATTACK_ANIM_LEN, unit_demo_dog_anim_table
+ anim_ent 0, 0, 0x90, 0
+ anim_ent 0, 8, 0x92, 0
+ anim_ent -12, 0, ACTION_ATTACK_SPRITE1, 0
+
+unit_demo_dog_attack_down:
+ anim_header ATTACK_ANIM_LEN, unit_demo_dog_anim_table
+ anim_ent 0, 0, 0x90, 0
+ anim_ent 0, 8, 0x92, 0
+ anim_ent 12, 0, ACTION_ATTACK_SPRITE1, 0
+
+unit_demo_dog_attack_left:
+ anim_header ATTACK_ANIM_LEN, unit_demo_dog_anim_table
+ anim_ent 0, 0, 0x90, 0
+ anim_ent 0, 8, 0x92, 0
+ anim_ent 0, -12, ACTION_ATTACK_SPRITE1, 0
+
+
+unit_demo_dog_attack_right:
+ anim_header ATTACK_ANIM_LEN, unit_demo_dog_anim_table
+ anim_ent 0, 0, 0x90, 0
+ anim_ent 0, 8, 0x92, 0
+ anim_ent 0, 12, ACTION_ATTACK_SPRITE1, 0
+
unit_demo_hazmat_anim_table:
anim_header 0, unit_demo_hazmat_anim_table
anim_ent 0, 0, 0x94, 0
anim_ent 0, 8, 0x96, 0
anim_ent 0, 0, 0x00, 0
+unit_demo_hazmat_attack_up:
+ anim_header ATTACK_ANIM_LEN, unit_demo_hazmat_anim_table
+ anim_ent 0, 0, 0x94, 0
+ anim_ent 0, 8, 0x96, 0
+ anim_ent -12, 0, ACTION_ATTACK_SPRITE1, 0
+
+unit_demo_hazmat_attack_down:
+ anim_header ATTACK_ANIM_LEN, unit_demo_hazmat_anim_table
+ anim_ent 0, 0, 0x94, 0
+ anim_ent 0, 8, 0x96, 0
+ anim_ent 12, 0, ACTION_ATTACK_SPRITE1, 0
+
+unit_demo_hazmat_attack_left:
+ anim_header ATTACK_ANIM_LEN, unit_demo_hazmat_anim_table
+ anim_ent 0, 0, 0x94, 0
+ anim_ent 0, 8, 0x96, 0
+ anim_ent 0, -12, ACTION_ATTACK_SPRITE1, 0
+
+unit_demo_hazmat_attack_right:
+ anim_header ATTACK_ANIM_LEN, unit_demo_hazmat_anim_table
+ anim_ent 0, 0, 0x94, 0
+ anim_ent 0, 8, 0x96, 0
+ anim_ent 0, 12, ACTION_ATTACK_SPRITE1, 0
+
unit_demo_1_init:
ldnull bc
ret