animations: Added new attack animations to all unit types
authorLukas Krickl <lukas@krickl.dev>
Sun, 14 Sep 2025 03:40:57 +0000 (05:40 +0200)
committerLukas Krickl <lukas@krickl.dev>
Sun, 14 Sep 2025 03:40:57 +0000 (05:40 +0200)
Currently there seems to be an issue where the animations play longer than the timer.

src/animation.s
src/attack.s
src/unit_demo.s

index d90224a9366923392ad67d42f30f1cb758036c26..54f6ebe4c6bd2a9299ebf8c30b6407a15ca3b5bc 100644 (file)
@@ -1,3 +1,5 @@
+#define ATTACK_ANIM_LEN 32
+
 player_anim_table:
        anim_header 32, player_anim_table_f2
        anim_ent 0, 8, 0x8C, OAM_FXFLIP 
@@ -11,25 +13,25 @@ player_anim_table_f2:
        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 
@@ -60,37 +62,37 @@ anim_list_guard:
        ; 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
index 8dd23ad535e757b59c9ad325706dea4be73b4a89..292f1dd8128de14ab8d86453163a6b14cd930c73 100644 (file)
@@ -69,34 +69,14 @@ unit_action_attack_decide_animation:
        ;               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
@@ -105,6 +85,10 @@ unit_action_attack:
        ;       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]
@@ -150,6 +134,6 @@ st_action_attack_init:
 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
index d301171be8ff8147417d76f11279d09c9b2a637f..593a96db1b6edb98829ebc44064bc926e3a71699 100644 (file)
@@ -4,18 +4,92 @@ unit_demo_guard_anim_table:
        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