aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAstatin <[email protected]>2025-05-09 17:44:37 +0200
committerAstatin <[email protected]>2025-05-09 17:44:37 +0200
commitb0f9e2e6d53983faa9d213b40d2bd6a23473e134 (patch)
treee8bf5eedd762203972afa10c6be79692767a3d2f
parent507a9876b85f47ff81cc9150bea858eec064ba05 (diff)
Refactoring the animations/directions + entities turn function with macros + finishing froge
-rw-r--r--definitions.gbasm23
-rw-r--r--enemiesattacks/basic.gbasm18
-rw-r--r--enemiesattacks/freeze.gbasm40
-rw-r--r--enemiesattacks/grab.gbasm73
-rw-r--r--enemiesattacks/laser.gbasm75
-rw-r--r--enemiesattacks/walk.gbasm12
-rw-r--r--enemiesattacks/walkaway.gbasm8
-rw-r--r--entity/actions.gbasm5
-rw-r--r--entity/bunny.gbasm35
-rw-r--r--entity/cat.gbasm159
-rw-r--r--entity/display.gbasm48
-rw-r--r--entity/fimsh.gbasm91
-rw-r--r--entity/fox.gbasm228
-rw-r--r--entity/frog.gbasm163
-rw-r--r--entity/init.gbasm19
-rw-r--r--entity/mouse.gbasm169
-rw-r--r--entity/penguin.gbasm192
-rw-r--r--entity/questgoal.gbasm5
-rw-r--r--entity/utils.gbasm116
-rw-r--r--map/objects.gbasm16
-rw-r--r--modes/dungeon.gbasm4
-rw-r--r--playerattacks.gbasm5
-rw-r--r--playerattacks/hop.gbasm15
23 files changed, 653 insertions, 866 deletions
diff --git a/definitions.gbasm b/definitions.gbasm
index afec299..e8fdd5f 100644
--- a/definitions.gbasm
+++ b/definitions.gbasm
@@ -40,6 +40,7 @@
.DEFINE mem_bunny_flags ($cb07)
.DEFINE mem_bunny_status ($cb08)
.DEFINE mem_bunny_mana ($cb09)
+.DEFINE mem_bunny_animation ($cb0a)
.DEFINE mem_viewport_x ($c008)
.DEFINE mem_viewport_y ($c009)
@@ -243,15 +244,8 @@
; sprite: u8,
; x: u8,
; y: u8,
-; direction: u8 (animation = bit 7-4, bit 3 = is_moving, bit 2-0: direction),
-; aaaamddd: a = animation, m = is_moving, d = direction
-; animations:
-; nothing = 0
-; action = 1
-; death = 2
-; superjump = 3
-; shaking = 4
-; doubleseed = 5
+; direction: u8 (facing = bit 6-4, bit 3 = is_moving, bit 2-0: direction moving),
+; 0aaamddd: f = facing direction, m = is_moving, d = moving direction
; turn_function_jump_table_index: u8
; action_function_jump_table_index: u8
; health: u8 (DAA decimal !!)
@@ -267,7 +261,16 @@
; ; 02: invincible
; ; 04: end of freeze
; mana: u8
-; _padding: u48
+; animation: u8
+; animations:
+; nothing = 0
+; action = 1
+; death = 2
+; superjump = 3
+; shaking = 4
+; doubleseed = 5
+; slide (forcing no hops on move) = 6
+; _padding: u40
;
; # SANTA CHRISTMAS LIST PLEASE #
; health, max health, list of possible attacks, maybe remaining attacks ? AI status (blind, scared, slow, etc..)
diff --git a/enemiesattacks/basic.gbasm b/enemiesattacks/basic.gbasm
index 103ebc5..984029c 100644
--- a/enemiesattacks/basic.gbasm
+++ b/enemiesattacks/basic.gbasm
@@ -1,4 +1,8 @@
Basic_Enemy_Attack: ; Direction to face in E. Result in BC (XY), Direction in D
+ LD A, D
+ AND $f0
+ SWAP A
+ LD D, A
LD A, E
DEC A
DEC D
@@ -10,12 +14,24 @@ Basic_Enemy_Attack: ; Direction to face in E. Result in BC (XY), Direction in D
JR NZ, =.attack
LD D, E
+ LD A, D
+ SWAP A
+ AND $70
+ OR D
+ LD D, A
RET
.attack:
LD A, E
- OR $10
+ SWAP A
+ AND $70
+ OR E
LD D, A
+ LD A, L
+ AND $f0
+ OR $0a
+ LD L, A
+ LD (HL), $01
PUSH BC
LD A, $mem_bunny_direction
diff --git a/enemiesattacks/freeze.gbasm b/enemiesattacks/freeze.gbasm
index b5b6319..e5ce309 100644
--- a/enemiesattacks/freeze.gbasm
+++ b/enemiesattacks/freeze.gbasm
@@ -1,4 +1,20 @@
+Freeze_sight_check: ; BC = XY of the enemy. D = direction (must be unchanged). Direction to face in E (or 0 if not)
+ LD E, $00
+
+ LD A, L
+ AND $f0
+ ADD $09
+ LD L, A
+ LD A, $00
+ CP (HL)
+ RET Z
+ JP =Check_player_next_to
+
Freeze_Enemy_Attack: ; Direction to face in E. Result in BC (XY), Direction in D
+ LD A, D
+ AND $f0
+ SWAP A
+ LD D, A
LD A, E
DEC A
DEC D
@@ -10,12 +26,24 @@ Freeze_Enemy_Attack: ; Direction to face in E. Result in BC (XY), Direction in D
JR NZ, =.attack
LD D, E
+ LD A, D
+ SWAP A
+ AND $70
+ OR D
+ LD D, A
RET
.attack:
LD A, E
- OR $10
+ SWAP A
+ AND $70
+ OR E
LD D, A
+ LD A, L
+ AND $f0
+ OR $0a
+ LD L, A
+ LD (HL), $01
PUSH BC
LD A, $mem_bunny_direction
@@ -33,8 +61,10 @@ Freeze_Enemy_Attack: ; Direction to face in E. Result in BC (XY), Direction in D
LD A, $02
LD $mem_bunny_flags, A
LD A, $mem_bunny_direction
- AND $07
+ RES 3, A
LD $mem_bunny_direction, A
+ LD A, $00
+ LD $mem_bunny_animation, A
LD A, $mem_bunny_x
LD $mem_bunny_predicted_x, A
LD A, $mem_bunny_y
@@ -48,4 +78,10 @@ Freeze_Enemy_Attack: ; Direction to face in E. Result in BC (XY), Direction in D
LD A, $enum_dungeon_mode
LD $mem_requested_mode, A
+ LD A, L
+ AND $f0
+ ADD $09
+ LD L, A
+ DEC (HL)
+
RET
diff --git a/enemiesattacks/grab.gbasm b/enemiesattacks/grab.gbasm
index e69334e..8ad2d57 100644
--- a/enemiesattacks/grab.gbasm
+++ b/enemiesattacks/grab.gbasm
@@ -1,4 +1,14 @@
Grab_sight_check: ; BC = XY of the enemy. D = direction (must be unchanged). Direction to face in E (or 0 if not)
+ LD E, $00
+
+ LD A, L
+ AND $f0
+ ADD $09
+ LD L, A
+ LD A, $00
+ CP (HL)
+ JR Z, =.end
+
.vertical:
LD A, $mem_bunny_x
CP B
@@ -9,41 +19,64 @@ Grab_sight_check: ; BC = XY of the enemy. D = direction (must be unchanged). Dir
SUB $02
CP C
LD E, $enum_direction_down
- RET Z
+ JR Z, =.end
; down
ADD $04
CP C
LD E, $enum_direction_up
- RET Z
+ JR Z, =.end
LD E, $00
- RET
+ JR =.end
.horizontal:
LD A, $mem_bunny_y
CP C
LD E, $00
- RET NZ
+ JR NZ, =.end
; left
LD A, $mem_bunny_x
SUB $02
CP B
LD E, $enum_direction_right
- RET Z
+ JR Z, =.end
; right
ADD $04
CP B
LD E, $enum_direction_left
+ JR Z, =.end
+
+ LD E, $00
+
+ LD A, E
+ CP $00
+ RET Z
+
+ .end:
+ PUSH BC
+ PUSH DE
+ LD D, E
+ LD A, $01
+ .ADD_A_TO_DIRECTION_BC
+ CALL =Is_Collisionable
+ POP DE
+ POP BC
+
+ CP $00
RET Z
LD E, $00
RET
-Grab_Enemy_Attack: ; Direction to face in E. Result in BC (XY), Direction in D
+Grab_Enemy_Attack: ; Entity in HL (whatever alignment), Direction to face in E. Result in BC (XY), Direction in D
+ LD A, D
+ AND $f0
+ SWAP A
+ LD D, A
LD A, E
DEC A
DEC D
@@ -55,12 +88,24 @@ Grab_Enemy_Attack: ; Direction to face in E. Result in BC (XY), Direction in D
JR NZ, =.attack
LD D, E
+ LD A, D
+ SWAP A
+ AND $70
+ OR D
+ LD D, A
RET
.attack:
LD A, E
- OR $10
+ SWAP A
+ AND $70
+ OR E
LD D, A
+ LD A, L
+ AND $f0
+ OR $0a
+ LD L, A
+ LD (HL), $01
PUSH BC
LD A, $mem_bunny_direction
@@ -82,8 +127,22 @@ Grab_Enemy_Attack: ; Direction to face in E. Result in BC (XY), Direction in D
XOR $01
INC A
OR $08
+ AND $0f
+ LD B, A
+ LD A, $mem_bunny_direction
+ AND $f0
+ OR B
LD $mem_bunny_direction, A
+ LD A, $06
+ LD $mem_bunny_animation, A
POP BC
POP DE
+
+ LD A, L
+ AND $f0
+ ADD $09
+ LD L, A
+ DEC (HL)
+
RET
diff --git a/enemiesattacks/laser.gbasm b/enemiesattacks/laser.gbasm
index 648c5f7..18ce73e 100644
--- a/enemiesattacks/laser.gbasm
+++ b/enemiesattacks/laser.gbasm
@@ -1,6 +1,14 @@
Laser_sight_check: ; BC = XY of the enemy. D = direction (must be unchanged). Direction to face in E (or 0 if not)
LD E, $00
+ LD A, L
+ AND $f0
+ ADD $09
+ LD L, A
+ LD A, $00
+ CP (HL)
+ RET Z
+
; straight line + distance <= 4
LD A, $mem_bunny_predicted_x
CP B
@@ -48,7 +56,64 @@ Laser_sight_check: ; BC = XY of the enemy. D = direction (must be unchanged). Di
LD E, $enum_direction_up
RET
-Laser_Enemy_Attack: ; Direction to face in E. Result in BC (XY), Direction in D
+Laser_Prepare_Attack:
+ LD A, D
+ AND $f0
+ SWAP A
+ LD D, A
+ LD A, E
+ DEC A
+ DEC D
+ XOR D
+ INC D
+ CP $00
+ JR Z, =.attack
+ BIT 1, A
+ JR NZ, =.attack
+
+ LD D, E
+ LD A, D
+ SWAP A
+ AND $70
+ OR D
+ LD D, A
+ RET
+
+ .attack:
+ LD A, E
+ SWAP A
+ AND $70
+ OR E
+ LD D, A
+ LD A, L
+ AND $f0
+ ADD $07
+ LD L, A
+
+ SET 2, (HL)
+
+ RET
+
+Apply_Prepared_Laser_Enemy_Attack: ; Entity (whatever alignment) in HL Direction to face in E. Result in BC (XY), Direction in D
+ LD A, $mem_moving_animation_step
+ CP $0f
+ RET NZ
+
+ LD A, L
+ AND $f0
+ ADD $07
+ LD L, A
+ BIT 2, (HL)
+ RES 2, (HL)
+ RET Z
+
+ CALL =Laser_sight_check
+ LD A, D
+ AND $70
+ SWAP A
+ CP E
+ RET NZ
+
PUSH DE
PUSH BC
@@ -111,4 +176,12 @@ Laser_Enemy_Attack: ; Direction to face in E. Result in BC (XY), Direction in D
LD $mem_bunny_health, A
.Skip_health_underflow_fix:
+ ; Mana
+ LD A, L
+ AND $f0
+ ADD $09
+ LD L, A
+
+ DEC (HL)
+
RET
diff --git a/enemiesattacks/walk.gbasm b/enemiesattacks/walk.gbasm
index 5de471f..a11b32f 100644
--- a/enemiesattacks/walk.gbasm
+++ b/enemiesattacks/walk.gbasm
@@ -1,4 +1,4 @@
-Walking: ; entity XY in BC, Breaks DE
+Walking: ; entity XY in BC, Breaks E, Direction result in D
; Is Bunny close enough to follow
LD A, $mem_bunny_x
SUB B
@@ -24,6 +24,10 @@ Walking: ; entity XY in BC, Breaks DE
INC A
OR E
LD D, A
+ AND $07
+ SWAP A
+ OR D
+ LD D, A
JP =.Check_Collision
.Follow_bunny:
@@ -123,6 +127,12 @@ Walking: ; entity XY in BC, Breaks DE
LD C, E
.skip_invert_axis2:
+ LD A, D
+ AND $07
+ SWAP A
+ OR D
+ LD D, A
+
.Check_Collision:
PUSH BC
LD A, $01
diff --git a/enemiesattacks/walkaway.gbasm b/enemiesattacks/walkaway.gbasm
index 2fc21fe..60851a4 100644
--- a/enemiesattacks/walkaway.gbasm
+++ b/enemiesattacks/walkaway.gbasm
@@ -24,6 +24,10 @@ Walking_Away: ; entity XY in BC, Breaks DE
INC A
OR E
LD D, A
+ AND $07
+ SWAP A
+ OR D
+ LD D, A
JP =.Check_Collision
.Follow_bunny:
@@ -109,6 +113,10 @@ Walking_Away: ; entity XY in BC, Breaks DE
INC A
OR $08
LD D, A
+ AND $07
+ SWAP A
+ OR D
+ LD D, A
; Check collision
diff --git a/entity/actions.gbasm b/entity/actions.gbasm
index 58ae380..92c2c5f 100644
--- a/entity/actions.gbasm
+++ b/entity/actions.gbasm
@@ -121,9 +121,10 @@ Enemy_Interaction:
AND $f0
LD $mem_entity_being_attacked_low, A
LD A, $mem_bunny_direction
- AND $07
- OR $10
+ RES 3, A
LD $mem_bunny_direction, A
+ LD A, $01
+ LD $mem_bunny_animation, A
LD A, $mem_map_loading_flags
SET 4, A
diff --git a/entity/bunny.gbasm b/entity/bunny.gbasm
index c58a645..dc04535 100644
--- a/entity/bunny.gbasm
+++ b/entity/bunny.gbasm
@@ -25,8 +25,10 @@ Move_Bunny:
CP $01
JR NZ, =.Freeze_shiver.end
LD A, $mem_bunny_direction
- AND $07
+ RES 3, A
LD $mem_bunny_direction, A
+ LD A, $00
+ LD $mem_bunny_animation, A
LD A, $mem_bunny_status_clear_turn_counter
DEC A
@@ -37,9 +39,8 @@ Move_Bunny:
CALL =RNG_Step
CP $55
JP NC, =.Skip_turn
- LD A, $mem_bunny_direction
- OR $40
- LD $mem_bunny_direction, A
+ LD A, $04
+ LD $mem_bunny_animation, A
CALL =RNG_Step
CP $55
@@ -75,11 +76,21 @@ Move_Bunny:
BIT 3, A
JP NZ, =.Start_action_or_movement.end
+ LD A, $mem_bunny_direction
+ AND $70
+ LD D, A
+ SWAP A
+ OR D
+ LD $mem_bunny_direction, A
+
.Start_action_or_movement.test_movement:
LD A, $mem_button_direction
CP $00
JP Z, =.Start_action_or_movement.end
+ LD D, A
+ SWAP A
+ OR D
SET 3, A
LD D, A
@@ -176,9 +187,11 @@ Move_Bunny:
JP NZ, =.End_movement.end
LD A, $mem_bunny_direction
LD D, A
- AND $07
+ RES 3, A
BIT 3, D
LD $mem_bunny_direction, A
+ LD A, $00
+ LD $mem_bunny_animation, A
JP Z, =.End_movement.end
LD A, $mem_bunny_x
@@ -291,7 +304,7 @@ Move_Bunny:
LD A, $mem_bunny_y
LD C, A
LD A, $mem_bunny_direction
- OR $08
+ SET 3, A
AND $0f
LD D, A
LD A, $01
@@ -337,9 +350,10 @@ Move_Bunny:
.Interaction.for_else:
LD A, $mem_bunny_direction
- AND $07
- OR $10
+ RES 3, A
LD $mem_bunny_direction, A
+ LD A, $01
+ LD $mem_bunny_animation, A
LD A, $mem_map_loading_flags
SET 4, A
@@ -347,9 +361,8 @@ Move_Bunny:
.Interaction.end:
.Check_End_Action:
- LD A, $mem_bunny_direction
- AND $f0
- CP $10
+ LD A, $mem_bunny_animation
+ CP $01
JR NZ, =.Check_End_Action.end
.Check_End_Action.end:
diff --git a/entity/cat.gbasm b/entity/cat.gbasm
index 655fd1b..13f7be3 100644
--- a/entity/cat.gbasm
+++ b/entity/cat.gbasm
@@ -1,3 +1,31 @@
+Cat_Drop:
+ PUSH DE
+ LD E, $02
+ CALL =Check_attack_already_learnt
+ CP $01
+ JR Z, =.drops.hp_regen_item
+
+ .drops.attack_item:
+ LD D, $6C
+ LD E, $04
+ CALL =RNG_Step
+ AND $03
+ CP $00
+ CALL Z, =Spawn_object
+ JR =.drops.end
+
+ .drops.hp_regen_item:
+ LD D, $64
+ LD E, $02
+ CALL =RNG_Step
+ AND $03
+ CP $00
+ CALL Z, =Spawn_object
+
+ .drops.end:
+ POP DE
+ RET
+
Cat_Turn:
LD A, $mem_map_loading_flags
BIT 3, A
@@ -14,132 +42,17 @@ Cat_Turn:
LD A, (HL+)
LD D, A
- .Health_check:
- LD A, L
- AND $f0
- ADD $06
- LD L, A
-
- LD A, (HL)
- CP $00
- JR NZ, =.Health_check.end
-
- LD A, L
- AND $f0
- LD L, A
-
- LD (HL), $00
- LD A, $mem_enemies_alive_count
- DEC A
- LD $mem_enemies_alive_count, A
-
- ; Drop when deadged
- PUSH DE
- LD E, $02
- CALL =Check_attack_already_learnt
- CP $01
- JR Z, =.drops.hp_regen_item
-
- .drops.attack_item:
- LD D, $6C
- LD E, $04
- CALL =RNG_Step
- AND $03
- CP $00
- CALL Z, =Spawn_object
- JR =.drops.end
-
- .drops.hp_regen_item:
- LD D, $64
- LD E, $02
- CALL =RNG_Step
- AND $03
- CP $00
- CALL Z, =Spawn_object
-
- .drops.end:
- POP DE
-
- JP =.Skip_turn
- .Health_check.end:
-
- .Freeze_shiver:
- LD A, $mem_moving_animation_step
- CP $00
- JP NZ, =.Freeze_shiver.end
- LD A, L
- AND $f0
- ADD $08
- LD L, A
- LD A, $01
- CP (HL)
- JR NZ, =.Freeze_shiver.end
- LD A, D
- AND $07
- LD D, A
- CALL =RNG_Step
- CP $55
- JP NC, =.Skip_turn
- LD A, D
- OR $40
- LD D, A
-
- CALL =RNG_Step
- CP $55
- JP NC, =.Skip_turn
-
- LD A, $00
- LD (HL-), A
- RES 1, (HL)
- JP =.Skip_turn
- .Freeze_shiver.end:
-
- .Should_turn_be_skipped:
- LD A, L
- AND $f0
- ADD $08
- LD L, A
-
- BIT 0, (HL)
- JP NZ, =.Skip_turn
-
- .Start_action_or_movement:
- LD A, $mem_moving_animation_step
- CP $00
- JP NZ, =.Start_action_or_movement.end
-
- LD A, L
- AND $f0
- OR $07
- LD L, A
- RES 3, (HL)
-
- .Try_Basic_Attack:
- CALL =Check_player_next_to
- LD A, E
- CP $00
- JR Z, =.Try_Walking
- CALL =Basic_Enemy_Attack
-
- JR =.Start_action_or_movement.end
+ .ENTITY_HEALTH_CHECK =.Skip_turn =Cat_Drop
+ .ENTITY_FREEZE_SHIVER =.Skip_turn
+ .ENTITY_STATUS_SKIP_TURN =.Skip_turn
- .Try_Walking:
- CALL =Walking
- .Start_action_or_movement.end:
+ .RESET_BLINKING_MODE
- .End_movement:
- LD A, $mem_moving_animation_step
- CP $0f
- JP NZ, =.End_movement.end
+ .ENTITY_TRY_ATTACK =Check_player_next_to =Basic_Enemy_Attack =.attack_end
+ CALL =Walking
+ .attack_end:
- LD A, D
- AND $07
- BIT 3, D
- LD D, A
- JR Z, =.End_movement.end
- LD A, $01
- .ADD_A_TO_DIRECTION_BC
- .End_movement.end:
+ CALL =Entity_End_movement
.Skip_Turn:
LD A, L
diff --git a/entity/display.gbasm b/entity/display.gbasm
index 42f4740..6477ca2 100644
--- a/entity/display.gbasm
+++ b/entity/display.gbasm
@@ -118,9 +118,12 @@ Display_Entity:
.Action_Animation:
- LD A, D
+ LD A, L
AND $f0
- CP $10
+ OR $0a
+ LD L, A
+ LD A, $01
+ CP (HL)
JR NZ, =.Action_Animation.end
LD A, $mem_moving_animation_step
@@ -147,9 +150,12 @@ Display_Entity:
.Action_Animation.end:
.SuperJump_Animation:
- LD A, D
+ LD A, L
AND $f0
- CP $30
+ OR $0a
+ LD L, A
+ LD A, $03
+ CP (HL)
JR NZ, =.SuperJump_Animation.end
LD A, $mem_moving_animation_step
@@ -170,9 +176,12 @@ Display_Entity:
.SuperJump_Animation.end:
.Shaking_Animation:
- LD A, D
+ LD A, L
AND $f0
- CP $40
+ OR $0a
+ LD L, A
+ LD A, $04
+ CP (HL)
JR NZ, =.Shaking_Animation.end
LD A, $mem_moving_animation_step
@@ -192,9 +201,12 @@ Display_Entity:
.Shaking_Animation.end:
.Moving_2x:
- LD A, D
+ LD A, L
AND $f0
- CP $50
+ OR $0a
+ LD L, A
+ LD A, $05
+ CP (HL)
JR NZ, =.Moving_2x.end
LD A, $mem_moving_animation_step
@@ -225,9 +237,15 @@ Display_Entity:
.Moving_2x.end:
.Moving_Hops:
- LD A, D
- AND $f8
- CP $08
+ BIT 3, D
+ JR Z, =.Moving_Hops.end
+ LD A, L
+ AND $f0
+ OR $0a
+ LD L, A
+ LD A, (HL)
+ LD A, $00
+ CP (HL)
JR NZ, =.Moving_Hops.end
LD A, $mem_moving_animation_step
@@ -245,6 +263,7 @@ Display_Entity:
.Moving_Hops.end:
LD A, D
+ SWAP A
AND $07
CP $enum_direction_left
@@ -328,9 +347,12 @@ Display_Entity:
RET
Flags_From_Animation: ; Expect entity in HL (offset doesn't matter) + breaks D (but result in A)
- LD A, D
+ LD A, L
AND $f0
- CP $20
+ OR $0a
+ LD L, A
+ LD A, $02
+ CP (HL)
LD D, $00
JR NZ, =Flags_From_Animation.Shadow_Palette
LD D, $40
diff --git a/entity/fimsh.gbasm b/entity/fimsh.gbasm
index 49c4f53..e5f6190 100644
--- a/entity/fimsh.gbasm
+++ b/entity/fimsh.gbasm
@@ -1,3 +1,11 @@
+Fimsh_Drop:
+ PUSH DE
+ LD D, $6C
+ LD E, $07
+ CALL =Spawn_object
+ POP DE
+ RET
+
Fimsh_Turn:
LD A, $mem_map_loading_flags
BIT 3, A
@@ -14,86 +22,13 @@ Fimsh_Turn:
LD A, (HL+)
LD D, A
- .Health_check:
- LD A, L
- AND $f0
- ADD $06
- LD L, A
-
- LD A, (HL)
- CP $00
- JR NZ, =.Health_check.end
-
- LD A, L
- AND $f0
- LD L, A
-
- LD (HL), $00
- LD A, $mem_enemies_alive_count
- DEC A
- LD $mem_enemies_alive_count, A
-
- PUSH DE
- LD D, $6C
- LD E, $07
- CALL =Spawn_object
- POP DE
-
- JP =.Skip_turn
- .Health_check.end:
-
- .Freeze_shiver:
- LD A, $mem_moving_animation_step
- CP $00
- JP NZ, =.Freeze_shiver.end
- LD A, L
- AND $f0
- ADD $08
- LD L, A
- LD A, $01
- CP (HL)
- JR NZ, =.Freeze_shiver.end
- LD A, D
- AND $07
- LD D, A
- CALL =RNG_Step
- CP $55
- JP NC, =.Skip_turn
- LD A, D
- OR $40
- LD D, A
-
- CALL =RNG_Step
- CP $55
- JP NC, =.Skip_turn
-
- LD A, $00
- LD (HL-), A
- RES 1, (HL)
- JP =.Skip_turn
- .Freeze_shiver.end:
-
- .Should_turn_be_skipped:
- LD A, L
- AND $f0
- ADD $08
- LD L, A
+ .ENTITY_HEALTH_CHECK =.Skip_turn =Fimsh_Drop
+ .ENTITY_FREEZE_SHIVER =.Skip_turn
+ .ENTITY_STATUS_SKIP_TURN =.Skip_turn
- BIT 0, (HL)
- JP NZ, =.Skip_turn
+ .RESET_BLINKING_MODE
- .End_movement:
- LD A, $mem_moving_animation_step
- CP $0f
- JP NZ, =.End_movement.end
- LD A, D
- AND $07
- BIT 3, D
- LD D, A
- JR Z, =.End_movement.end
- LD A, $01
- .ADD_A_TO_DIRECTION_BC
- .End_movement.end:
+ CALL =Entity_End_movement
.Skip_Turn:
LD A, L
diff --git a/entity/fox.gbasm b/entity/fox.gbasm
index 8e72ab4..4d5bd02 100644
--- a/entity/fox.gbasm
+++ b/entity/fox.gbasm
@@ -1,3 +1,31 @@
+Fox_Drop:
+ PUSH DE
+ LD E, $04
+ CALL =Check_attack_already_learnt
+ CP $01
+ JR Z, =.drops.ep_regen_item
+
+ .drops.attack_item:
+ LD D, $6C
+ LD E, $06
+ CALL =RNG_Step
+ AND $03
+ CP $00
+ CALL Z, =Spawn_object
+ JR =.drops.end
+
+ .drops.ep_regen_item:
+ LD D, $68
+ LD E, $03
+ CALL =RNG_Step
+ AND $03
+ CP $00
+ CALL Z, =Spawn_object
+
+ .drops.end:
+ POP DE
+ RET
+
Fox_Turn:
LD A, $mem_map_loading_flags
BIT 3, A
@@ -14,200 +42,20 @@ Fox_Turn:
LD A, (HL+)
LD D, A
- .Health_check:
- LD A, L
- AND $f0
- ADD $06
- LD L, A
-
- LD A, (HL)
- CP $00
- JR NZ, =.Health_check.end
-
- LD A, L
- AND $f0
- LD L, A
-
- LD (HL), $00
- LD A, $mem_enemies_alive_count
- DEC A
- LD $mem_enemies_alive_count, A
-
- ; Drop when deadged
- PUSH DE
- LD E, $04
- CALL =Check_attack_already_learnt
- CP $01
- JR Z, =.drops.ep_regen_item
-
- .drops.attack_item:
- LD D, $6C
- LD E, $06
- CALL =RNG_Step
- AND $03
- CP $00
- CALL Z, =Spawn_object
- JR =.drops.end
-
- .drops.ep_regen_item:
- LD D, $68
- LD E, $03
- CALL =RNG_Step
- AND $03
- CP $00
- CALL Z, =Spawn_object
-
- .drops.end:
- POP DE
-
- JP NZ, =.Skip_turn
- .Health_check.end:
-
- .Freeze_shiver:
- LD A, $mem_moving_animation_step
- CP $00
- JP NZ, =.Freeze_shiver.end
- LD A, L
- AND $f0
- ADD $08
- LD L, A
- LD A, $01
- CP (HL)
- JR NZ, =.Freeze_shiver.end
- LD A, D
- AND $07
- LD D, A
- CALL =RNG_Step
- CP $55
- JP NC, =.Skip_turn
- LD A, D
- OR $40
- LD D, A
-
- CALL =RNG_Step
- CP $55
- JP NC, =.Skip_turn
-
- LD A, $00
- LD (HL-), A
- RES 1, (HL)
- JP =.Skip_turn
- .Freeze_shiver.end:
-
- .Should_turn_be_skipped:
- LD A, L
- AND $f0
- ADD $08
- LD L, A
-
- BIT 0, (HL)
- JP NZ, =.Skip_turn
-
- .Start_action_or_movement:
- LD A, $mem_moving_animation_step
- CP $00
- JP NZ, =.Start_action_or_movement.end
-
- LD A, L
- AND $f0
- OR $07
- LD L, A
- RES 3, (HL)
-
- LD A, L
- AND $f0
- ADD $09
- LD L, A
- XOR A
- CP (HL)
- JR Z, =.Try_Basic_Attack
-
- CALL =Laser_sight_check
- LD A, E
- CP $00
- JR Z, =.Try_Basic_Attack
-
- LD A, E
- DEC A
- DEC D
- XOR D
- INC D
- CP $00
- JR Z, =.attack
- BIT 1, A
- JR NZ, =.attack
-
- LD D, E
- JR =.Start_action_or_movement.end
-
- .attack:
- LD D, E
- LD A, L
- AND $f0
- ADD $07
- LD L, A
-
- SET 2, (HL)
-
- JR =.Start_action_or_movement.end
-
- .Try_Basic_Attack:
-
- CALL =Check_player_next_to
- LD A, E
- CP $00
- JR Z, =.Try_Walking
-
- CALL =Basic_Enemy_Attack
-
- JR =.Start_action_or_movement.end
-
- .Try_Walking:
-
- CALL =Walking
- .Start_action_or_movement.end:
-
- .End_movement:
- LD A, $mem_moving_animation_step
- CP $0f
- JP NZ, =.End_movement.end
- LD A, D
- AND $07
- BIT 3, D
- LD D, A
- JR Z, =.End_movement.check_end_of_turn_mode_attack
- LD A, $01
- .ADD_A_TO_DIRECTION_BC
-
- .End_movement.check_end_of_turn_mode_attack:
-
- LD A, L
- AND $f0
- ADD $07
- LD L, A
-
- BIT 2, (HL)
- RES 2, (HL)
- JR Z, =.End_movement.end
-
- CALL =Laser_sight_check
- LD A, D
- AND $07
- CP E
- JR NZ, =.laser_sight_check_fail
-
- CALL =Laser_Enemy_Attack
+ .ENTITY_HEALTH_CHECK =.Skip_turn =Fox_Drop
+ .ENTITY_FREEZE_SHIVER =.Skip_turn
+ .ENTITY_STATUS_SKIP_TURN =.Skip_turn
- LD A, L
- AND $f0
- ADD $09
- LD L, A
+ .RESET_BLINKING_MODE
- DEC (HL)
+ .ENTITY_TRY_ATTACK =Laser_sight_check =Laser_Prepare_Attack =.attack_end
+ .ENTITY_TRY_ATTACK =Check_player_next_to =Basic_Enemy_Attack =.attack_end
+ CALL =Walking
+ .attack_end:
- .laser_sight_check_fail:
+ CALL =Entity_End_movement
- .End_movement.end:
+ CALL =Apply_Prepared_Laser_Enemy_Attack
.Skip_Turn:
LD A, L
diff --git a/entity/frog.gbasm b/entity/frog.gbasm
index c08d68f..268e473 100644
--- a/entity/frog.gbasm
+++ b/entity/frog.gbasm
@@ -1,3 +1,22 @@
+Frog_Drops: ; XY in (BC)
+ PUSH DE
+ LD E, $02
+ CALL =Check_attack_already_learnt
+ CP $01
+ JR Z, =.drops.hp_regen_item
+
+ .drops.hp_regen_item:
+ LD D, $64
+ LD E, $02
+ CALL =RNG_Step
+ AND $03
+ CP $00
+ CALL Z, =Spawn_object
+
+ .drops.end:
+ POP DE
+ RET
+
Frog_Turn:
LD A, $mem_map_loading_flags
BIT 3, A
@@ -14,144 +33,18 @@ Frog_Turn:
LD A, (HL+)
LD D, A
- .Health_check:
- LD A, L
- AND $f0
- ADD $06
- LD L, A
-
- LD A, (HL)
- CP $00
- JR NZ, =.Health_check.end
-
- LD A, L
- AND $f0
- LD L, A
-
- LD (HL), $00
- LD A, $mem_enemies_alive_count
- DEC A
- LD $mem_enemies_alive_count, A
-
- ; Drop when deadged
- PUSH DE
- LD E, $02
- CALL =Check_attack_already_learnt
- CP $01
- JR Z, =.drops.hp_regen_item
-
- .drops.hp_regen_item:
- LD D, $64
- LD E, $02
- CALL =RNG_Step
- AND $03
- CP $00
- CALL Z, =Spawn_object
-
- .drops.end:
- POP DE
-
- JP =.Skip_turn
- .Health_check.end:
-
- .Freeze_shiver:
- LD A, $mem_moving_animation_step
- CP $00
- JP NZ, =.Freeze_shiver.end
- LD A, L
- AND $f0
- ADD $08
- LD L, A
- LD A, $01
- CP (HL)
- JR NZ, =.Freeze_shiver.end
- LD A, D
- AND $07
- LD D, A
- CALL =RNG_Step
- CP $55
- JP NC, =.Skip_turn
- LD A, D
- OR $40
- LD D, A
-
- CALL =RNG_Step
- CP $55
- JP NC, =.Skip_turn
-
- LD A, $00
- LD (HL-), A
- RES 1, (HL)
- JP =.Skip_turn
- .Freeze_shiver.end:
-
- .Should_turn_be_skipped:
- LD A, L
- AND $f0
- ADD $08
- LD L, A
-
- BIT 0, (HL)
- JP NZ, =.Skip_turn
-
- .Start_action_or_movement:
- LD A, $mem_moving_animation_step
- CP $00
- JP NZ, =.Start_action_or_movement.end
-
- LD A, L
- AND $f0
- OR $07
- LD L, A
- RES 3, (HL)
-
- LD A, L
- AND $f0
- ADD $09
- LD L, A
- XOR A
- CP (HL)
- JR Z, =.Try_Basic_Attack
-
- CALL =Grab_sight_check
- LD A, E
- CP $00
- JR Z, =.Try_Basic_Attack
-
- CALL =Grab_Enemy_Attack
-
- JR =.Start_action_or_movement.end
-
- .Try_Basic_Attack:
-
- CALL =Check_player_next_to
- LD A, E
- CP $00
- JR Z, =.Try_Walking
-
- CALL =Basic_Enemy_Attack
-
- JR =.Start_action_or_movement.end
-
- .Try_Walking:
-
- CALL =Walking
+ .ENTITY_HEALTH_CHECK =.Skip_turn =Frog_Drops
+ .ENTITY_FREEZE_SHIVER =.Skip_turn
+ .ENTITY_STATUS_SKIP_TURN =.Skip_turn
- .Start_action_or_movement.end:
+ .RESET_BLINKING_MODE
- .End_movement:
- LD A, $mem_moving_animation_step
- CP $0f
- JP NZ, =.End_movement.end
+ .ENTITY_TRY_ATTACK =Grab_sight_check =Grab_Enemy_Attack =.attack_end
+ .ENTITY_TRY_ATTACK =Check_player_next_to =Basic_Enemy_Attack =.attack_end
+ CALL =Walking
+ .attack_end:
- LD A, D
- AND $07
- BIT 3, D
- LD D, A
- JR Z, =.End_movement.end
- LD A, $01
- .ADD_A_TO_DIRECTION_BC
- .End_movement.end:
+ CALL =Entity_End_movement
.Skip_Turn:
LD A, L
diff --git a/entity/init.gbasm b/entity/init.gbasm
index 80e3848..38d3141 100644
--- a/entity/init.gbasm
+++ b/entity/init.gbasm
@@ -65,6 +65,9 @@ Initialize_Entities:
INC HL
LD A, $enum_direction_down
+ LD (HL), A
+ SWAP A
+ OR (HL)
LD (HL+), A
; Turn
@@ -128,22 +131,6 @@ Initialize_Entities:
OR $08
LD $mem_prepared_viewport_y, A
- LD A, $mem_bunny_direction
- BIT 3, A
- RET Z
-
- LD A, $mem_bunny_direction
- DEC A
- XOR $01
- INC A
- LD D, A
- LD A, $mem_viewport_x
- LD B, A
- LD A, $mem_viewport_y
- LD C, A
- LD A, $mem_moving_animation_step
- .ADD_A_TO_DIRECTION_BC
-
RET
Initialize_Enemy: ; HL => pointer to entity struct
diff --git a/entity/mouse.gbasm b/entity/mouse.gbasm
index ebf54ff..75f84ab 100644
--- a/entity/mouse.gbasm
+++ b/entity/mouse.gbasm
@@ -1,3 +1,14 @@
+Mouse_Drop:
+ PUSH DE
+ LD D, $64
+ LD E, $02
+ CALL =RNG_Step
+ AND $03
+ CP $00
+ CALL Z, =Spawn_object
+ POP DE
+ RET
+
Mouse_Turn:
LD A, $mem_map_loading_flags
BIT 3, A
@@ -14,146 +25,72 @@ Mouse_Turn:
LD A, (HL+)
LD D, A
- .Health_check:
- LD A, L
- AND $f0
- ADD $06
- LD L, A
+ .ENTITY_HEALTH_CHECK =.Skip_turn =Mouse_Drop
+ .ENTITY_FREEZE_SHIVER =.Skip_turn
+ .ENTITY_STATUS_SKIP_TURN =.Skip_turn
- LD A, (HL)
- CP $00
- JR NZ, =.Health_check.end
+ .RESET_BLINKING_MODE
- LD A, L
- AND $f0
- LD L, A
-
- LD (HL), $00
- LD A, $mem_enemies_alive_count
- DEC A
- LD $mem_enemies_alive_count, A
-
- PUSH DE
- LD D, $64
- LD E, $02
- CALL =RNG_Step
- AND $03
- CP $00
- CALL Z, =Spawn_object
- POP DE
-
- JP =.Skip_turn
- .Health_check.end:
+ .ENTITY_TRY_ATTACK =Check_player_next_to =Basic_Enemy_Attack =.attack_end
+ CALL =Walking
+ BIT 3, D
+ JR Z, =.attack_end
+ LD A, L
+ AND $f0
+ OR $0a
+ LD L, A
+ LD (HL), $05
+ LD A, (HL)
+ DBG
+ .attack_end:
- .Freeze_shiver:
+ .Mid_movement:
LD A, $mem_moving_animation_step
- CP $00
- JP NZ, =.Freeze_shiver.end
- LD A, L
- AND $f0
- ADD $08
- LD L, A
- LD A, $01
- CP (HL)
- JR NZ, =.Freeze_shiver.end
- LD A, D
- AND $07
- LD D, A
- CALL =RNG_Step
- CP $55
- JP NC, =.Skip_turn
- LD A, D
- OR $40
- LD D, A
-
- CALL =RNG_Step
- CP $55
- JP NC, =.Skip_turn
+ CP $07
+ JR NZ, =.Mid_movement.end
- LD A, $00
- LD (HL-), A
- RES 1, (HL)
- JP =.Skip_turn
- .Freeze_shiver.end:
+ BIT 3, D
+ JR Z, =.Mid_movement.end
- .Should_turn_be_skipped:
LD A, L
AND $f0
- ADD $08
+ OR $0a
LD L, A
-
- BIT 0, (HL)
- JP NZ, =.Skip_turn
-
- .Start_action_or_movement:
- LD A, $mem_moving_animation_step
- CP $00
- JP NZ, =.Start_action_or_movement.end
+ LD A, $05
+ CP (HL)
+ LD A, (HL)
+ JR NZ, =.Mid_movement.end
LD A, L
AND $f0
- OR $07
+ OR $0a
LD L, A
- RES 3, (HL)
-
- .Try_Basic_Attack:
- CALL =Check_player_next_to
- LD A, E
- CP $00
- JR Z, =.Try_Walking
- CALL =Basic_Enemy_Attack
-
- JR =.Start_action_or_movement.end
-
- .Try_Walking:
- CALL =Walking
- BIT 3, D
- JR Z, =.Start_action_or_movement.end
- LD A, D
- OR $50
- LD D, A
- .Start_action_or_movement.end:
-
- .Mid_movement:
- LD A, $mem_moving_animation_step
- CP $07
- JR NZ, =.Mid_movement.end
-
- LD A, D
- AND $f0
- CP $50
- JR NZ, =.Mid_movement.end
+ LD (HL), $00
LD A, D
- AND $07
- BIT 3, D
+ RES 3, A
LD D, A
- JR Z, =.Mid_movement.end
LD A, $01
.ADD_A_TO_DIRECTION_BC
.Mid_movement.Try_Walking:
+ PUSH DE
CALL =Walking
BIT 3, D
- JR Z, =.Mid_movement.end
- LD A, D
- OR $50
- LD D, A
+ JR Z, =.Mid_movement.Walk_cancelled
+ LD A, L
+ AND $f0
+ OR $0a
+ LD L, A
+ LD (HL), $05
+ ADD SP, $02
+ JR =.Mid_movement.end
+ .Mid_movement.Walk_cancelled:
+ POP DE
+ RES 3, D
.Mid_movement.end:
- .End_movement:
- LD A, $mem_moving_animation_step
- CP $0f
- JR NZ, =.End_movement.end
-
- LD A, D
- AND $07
- BIT 3, D
- LD D, A
- JR Z, =.End_movement.end
- LD A, $01
- .ADD_A_TO_DIRECTION_BC
- .End_movement.end:
+ CALL =Entity_End_movement
.Skip_Turn:
LD A, L
diff --git a/entity/penguin.gbasm b/entity/penguin.gbasm
index 353af8e..a3b4937 100644
--- a/entity/penguin.gbasm
+++ b/entity/penguin.gbasm
@@ -1,3 +1,31 @@
+Penguin_Drop:
+ PUSH DE
+ LD E, $03
+ CALL =Check_attack_already_learnt
+ CP $01
+ JR Z, =.drops.ep_regen_item
+
+ .drops.attack_item:
+ LD D, $6C
+ LD E, $05
+ CALL =RNG_Step
+ AND $03
+ CP $00
+ CALL Z, =Spawn_object
+ JR =.drops.end
+
+ .drops.ep_regen_item:
+ LD D, $68
+ LD E, $03
+ CALL =RNG_Step
+ AND $03
+ CP $00
+ CALL Z, =Spawn_object
+
+ .drops.end:
+ POP DE
+ RET
+
Penguin_Turn:
LD A, $mem_map_loading_flags
BIT 3, A
@@ -14,157 +42,31 @@ Penguin_Turn:
LD A, (HL+)
LD D, A
- .Health_check:
- LD A, L
- AND $f0
- ADD $06
- LD L, A
-
- LD A, (HL)
- CP $00
- JR NZ, =.Health_check.end
-
- LD A, L
- AND $f0
- LD L, A
-
- LD (HL), $00
- LD A, $mem_enemies_alive_count
- DEC A
- LD $mem_enemies_alive_count, A
-
- ; Drop when deadged
- PUSH DE
- LD E, $03
- CALL =Check_attack_already_learnt
- CP $01
- JR Z, =.drops.ep_regen_item
-
- .drops.attack_item:
- LD D, $6C
- LD E, $05
- CALL =RNG_Step
- AND $03
- CP $00
- CALL Z, =Spawn_object
- JR =.drops.end
-
- .drops.ep_regen_item:
- LD D, $68
- LD E, $03
- CALL =RNG_Step
- AND $03
- CP $00
- CALL Z, =Spawn_object
-
- .drops.end:
- POP DE
-
- JP =.Skip_turn
- .Health_check.end:
-
- .Freeze_shiver:
- LD A, $mem_moving_animation_step
- CP $00
- JP NZ, =.Freeze_shiver.end
- LD A, L
- AND $f0
- ADD $08
- LD L, A
- LD A, $01
- CP (HL)
- JR NZ, =.Freeze_shiver.end
- LD A, D
- AND $07
- LD D, A
- CALL =RNG_Step
- CP $55
- JP NC, =.Skip_turn
- LD A, D
- OR $40
- LD D, A
-
- CALL =RNG_Step
- CP $55
- JP NC, =.Skip_turn
-
- LD A, $00
- LD (HL-), A
- RES 1, (HL)
- JP =.Skip_turn
- .Freeze_shiver.end:
-
- .Should_turn_be_skipped:
- LD A, L
- AND $f0
- ADD $08
- LD L, A
-
- BIT 0, (HL)
- JP NZ, =.Skip_turn
-
- .Start_action_or_movement:
- LD A, $mem_moving_animation_step
- CP $00
- JP NZ, =.Start_action_or_movement.end
-
- LD A, L
- AND $f0
- OR $07
- LD L, A
- RES 3, (HL)
-
- LD A, $mem_bunny_status
- CP $01
- JR Z, =.Run_away
- CP $04
- JR Z, =.Run_away
-
- .Try_Freeze_Attack:
- LD A, L
- AND $f0
- ADD $09
- LD L, A
- XOR A
- CP (HL)
- JR Z, =.Try_Walking
-
- CALL =Check_player_next_to
- LD A, E
- CP $00
- JR Z, =.Try_Walking
- CALL =Freeze_Enemy_Attack
-
- LD A, L
- AND $f0
- ADD $09
- LD L, A
+ .ENTITY_HEALTH_CHECK =.Skip_turn =Cat_Drop
+ .ENTITY_FREEZE_SHIVER =.Skip_turn
+ .ENTITY_STATUS_SKIP_TURN =.Skip_turn
- DEC (HL)
+ .RESET_BLINKING_MODE
- JR =.Start_action_or_movement.end
+ LD A, $mem_moving_animation_step
+ CP $00
+ JR NZ, =.attack_end
+ LD A, $mem_bunny_status
+ CP $01
+ JR Z, =.Run_away
+ CP $04
+ JR Z, =.Run_away
- .Run_away:
- CALL =Walking_Away
+ .ENTITY_TRY_ATTACK =Freeze_sight_check =Freeze_Enemy_Attack =.attack_end
+ CALL =Walking
+ JR =.attack_end
- JR =.Start_action_or_movement.end
+ .Run_away:
+ CALL =Walking_Away
- .Try_Walking:
- CALL =Walking
- .Start_action_or_movement.end:
+ .attack_end:
- .End_movement:
- LD A, $mem_moving_animation_step
- CP $0f
- JP NZ, =.End_movement.end
- LD A, D
- AND $07
- BIT 3, D
- LD D, A
- JR Z, =.End_movement.end
- LD A, $01
- .ADD_A_TO_DIRECTION_BC
- .End_movement.end:
+ CALL =Entity_End_movement
.Skip_Turn:
LD A, L
diff --git a/entity/questgoal.gbasm b/entity/questgoal.gbasm
index 9885cea..445f56c 100644
--- a/entity/questgoal.gbasm
+++ b/entity/questgoal.gbasm
@@ -41,9 +41,8 @@ Open_Dialogue:
.START_SCRIPT =Demo_quest_bunny
- LD A, $mem_bunny_direction
- AND $0f
- LD $mem_bunny_direction, A
+ LD A, $00
+ LD $mem_bunny_animation, A
LD A, $enum_dungeon_dialogue_mode
LD $mem_requested_mode, A
diff --git a/entity/utils.gbasm b/entity/utils.gbasm
index 944faa8..8dea589 100644
--- a/entity/utils.gbasm
+++ b/entity/utils.gbasm
@@ -141,3 +141,119 @@ Spawn_object: ; Texture in D, XY in BC, jump table thingy in E
POP HL
.skip_spawn_loot:
RET
+
+.MACRODEF ENTITY_HEALTH_CHECK Skip_turn Drop_Function
+ LD A, L
+ AND $f0
+ ADD $06
+ LD L, A
+
+ LD A, (HL)
+ CP $00
+ JR NZ, =$end
+
+ LD A, L
+ AND $f0
+ LD L, A
+
+ LD (HL), $00
+ LD A, $mem_enemies_alive_count
+ DEC A
+ LD $mem_enemies_alive_count, A
+
+ CALL $Drop_Function
+
+ JP $Skip_turn
+ $end:
+.END
+
+.MACRODEF ENTITY_FREEZE_SHIVER Skip_turn
+ LD A, $mem_moving_animation_step
+ CP $00
+ JP NZ, =$end
+ LD A, L
+ AND $f0
+ ADD $08
+ LD L, A
+ LD A, $01
+ CP (HL)
+ JR NZ, =$end
+ RES 3, D
+ CALL =RNG_Step
+ CP $55
+ JP NC, $Skip_turn
+ LD A, L
+ AND $f0
+ OR $0a
+ LD L, A
+ LD (HL), $04
+
+ CALL =RNG_Step
+ CP $55
+ JP NC, $Skip_turn
+
+ LD A, $00
+ LD (HL-), A
+ RES 1, (HL)
+ JP $Skip_turn
+ $end:
+.END
+
+.MACRODEF ENTITY_STATUS_SKIP_TURN Skip_Turn
+ LD A, L
+ AND $f0
+ ADD $08
+ LD L, A
+
+ BIT 0, (HL)
+ JP NZ, $Skip_turn
+.END
+
+Entity_End_movement:
+ LD A, $mem_moving_animation_step
+ CP $0f
+ RET NZ
+
+ LD A, L
+ AND $f0
+ OR $0a
+ LD L, A
+ LD (HL), $00
+ LD A, D
+ RES 3, A
+ BIT 3, D
+ LD D, A
+ RET Z
+ LD A, $01
+ .ADD_A_TO_DIRECTION_BC
+ RET
+
+.MACRODEF RESET_BLINKING_MODE
+ LD A, $mem_moving_animation_step
+ CP $00
+ JP NZ, =$end
+
+ LD A, L
+ AND $f0
+ OR $07
+ LD L, A
+ RES 3, (HL)
+
+ $end:
+.END
+
+.MACRODEF ENTITY_TRY_ATTACK Sight_check Attack_Function Attack_end
+ LD A, $mem_moving_animation_step
+ CP $00
+ JP NZ, $Attack_end
+
+ CALL $Sight_check
+ LD A, $00
+ CP E
+ JR Z, =$next
+
+ CALL $Attack_Function
+ JP $Attack_end
+
+ $next:
+.END
diff --git a/map/objects.gbasm b/map/objects.gbasm
index 7cdd5c4..a89a88d 100644
--- a/map/objects.gbasm
+++ b/map/objects.gbasm
@@ -258,8 +258,10 @@ Heal_Attack_Box_Action:
LD $mem_requested_mode, A
LD $mem_current_mode, A
LD A, $mem_bunny_direction
- AND $07
+ RES 3, A
LD $mem_bunny_direction, A
+ LD A, $00
+ LD $mem_bunny_animation, A
LD A, $mem_map_loading_flags
SET 5, A
RES 3, A
@@ -280,8 +282,10 @@ Freeze_Attack_Box_Action:
LD $mem_requested_mode, A
LD $mem_current_mode, A
LD A, $mem_bunny_direction
- AND $07
+ RES 3, A
LD $mem_bunny_direction, A
+ LD A, $00
+ LD $mem_bunny_animation, A
LD A, $mem_map_loading_flags
SET 5, A
RES 3, A
@@ -302,8 +306,10 @@ Earcopter_Attack_Box_Action:
LD $mem_requested_mode, A
LD $mem_current_mode, A
LD A, $mem_bunny_direction
- AND $07
+ RES 3, A
LD $mem_bunny_direction, A
+ LD A, $00
+ LD $mem_bunny_animation, A
LD A, $mem_map_loading_flags
SET 5, A
RES 3, A
@@ -324,8 +330,10 @@ Fimsh_Attack_Box_Action:
LD $mem_requested_mode, A
LD $mem_current_mode, A
LD A, $mem_bunny_direction
- AND $07
+ RES 3, A
LD $mem_bunny_direction, A
+ LD A, $00
+ LD $mem_bunny_animation, A
LD A, $mem_map_loading_flags
SET 5, A
RES 3, A
diff --git a/modes/dungeon.gbasm b/modes/dungeon.gbasm
index cbe1110..3d5b609 100644
--- a/modes/dungeon.gbasm
+++ b/modes/dungeon.gbasm
@@ -50,8 +50,10 @@ Update_Animation_Steps:
.Dead_mode:
- LD A, $20
+ LD A, $00
LD $mem_bunny_direction, A
+ LD A, $02
+ LD $mem_bunny_animation, A
LD A, $enum_dead_mode
LD $mem_current_mode, A
diff --git a/playerattacks.gbasm b/playerattacks.gbasm
index 598dbb8..1d937b9 100644
--- a/playerattacks.gbasm
+++ b/playerattacks.gbasm
@@ -68,9 +68,8 @@ Canceled_Attack:
SET 3, A
LD $mem_map_loading_flags, A
- LD A, $mem_bunny_direction
- OR $40
- LD $mem_bunny_direction, A
+ LD A, $04
+ LD $mem_bunny_animation, A
LD A, $mem_bunny_mana
LD B, A
diff --git a/playerattacks/hop.gbasm b/playerattacks/hop.gbasm
index 111fb72..d8b280d 100644
--- a/playerattacks/hop.gbasm
+++ b/playerattacks/hop.gbasm
@@ -52,6 +52,7 @@ Hop_Attack_Loading_VBlank:
CALL =Display_Main_Prepared_Block
LD A, $mem_bunny_direction
+ SWAP A
AND $07
LD D, A
LD A, $mem_viewport_x
@@ -68,6 +69,7 @@ Hop_Attack_Loading_VBlank:
CALL =Display_Object
LD A, $mem_bunny_direction
+ SWAP A
AND $07
LD D, A
LD A, $mem_viewport_x
@@ -100,8 +102,10 @@ Hop_Attack_Loading_Regular:
LD $mem_requested_mode, A
CALL =Update_VBlank_Handler
LD A, $mem_bunny_direction
- OR $38
+ OR $08
LD $mem_bunny_direction, A
+ LD A, $03
+ LD $mem_bunny_animation, A
LD A, $mem_map_loading_flags
SET 3, A
LD $mem_map_loading_flags, A
@@ -125,6 +129,7 @@ Hop_Attack_Loading_Regular:
LD $mem_prepared_loading_block_position_2, A
LD A, $mem_bunny_direction
+ SWAP A
AND $07
LD D, A
LD A, $mem_viewport_x
@@ -141,6 +146,7 @@ Hop_Attack_Loading_Regular:
CALL =Preload_Map_Hop
LD A, $mem_bunny_direction
+ SWAP A
AND $07
LD D, A
LD A, $mem_viewport_x
@@ -158,7 +164,10 @@ Hop_Attack_Loading_Regular:
Hop_Attack:
LD A, $mem_bunny_direction
- AND $07
+ AND $70
+ LD D, A
+ SWAP A
+ OR D
LD D, A
LD A, $mem_bunny_x
@@ -192,5 +201,3 @@ Hop_Attack:
LD A, $00
LD $mem_loading_step, A
RET
-
-