summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBehemoth <Luisscheurenbrand@gmail.com>2020-09-19 01:37:43 +0200
committerBehemoth <Luisscheurenbrand@gmail.com>2020-09-19 01:37:43 +0200
commit0316bb142635ca21cecbece596ee675e0ae4492e (patch)
tree5f4b49be7bd2d209e4e4f21f2f9098d58d858615
parent0299272ba5b000cf4e569127fc02075b12ae056a (diff)
decompile WallMaster
-rw-r--r--asm/wallMaster.s538
-rw-r--r--data/animations/wallMaster.s16
-rw-r--r--data/data_080CC6FC.s21
-rw-r--r--include/area.h1
-rw-r--r--linker.ld4
-rw-r--r--src/enemy/wallMaster.c219
6 files changed, 239 insertions, 560 deletions
diff --git a/asm/wallMaster.s b/asm/wallMaster.s
deleted file mode 100644
index c2a51fea..00000000
--- a/asm/wallMaster.s
+++ /dev/null
@@ -1,538 +0,0 @@
- .include "asm/macros.inc"
-
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
-
- thumb_func_start WallMaster
-WallMaster: @ 0x0802A408
- push {r4, r5, lr}
- adds r4, r0, #0
- ldr r5, _0802A430 @ =gUnk_080CD07C
- bl GetNextFunction
- lsls r0, r0, #2
- adds r0, r0, r5
- ldr r1, [r0]
- adds r0, r4, #0
- bl _call_via_r1
- movs r3, #0x10
- rsbs r3, r3, #0
- adds r0, r4, #0
- movs r1, #0
- movs r2, #1
- bl SetChildOffset
- pop {r4, r5, pc}
- .align 2, 0
-_0802A430: .4byte gUnk_080CD07C
-
- thumb_func_start sub_0802A434
-sub_0802A434: @ 0x0802A434
- push {r4, lr}
- adds r4, r0, #0
- bl sub_0802A78C
- ldr r1, _0802A450 @ =gUnk_080CD094
- ldrb r0, [r4, #0xc]
- lsls r0, r0, #2
- adds r0, r0, r1
- ldr r1, [r0]
- adds r0, r4, #0
- bl _call_via_r1
- pop {r4, pc}
- .align 2, 0
-_0802A450: .4byte gUnk_080CD094
-
- thumb_func_start sub_0802A454
-sub_0802A454: @ 0x0802A454
- push {r4, lr}
- adds r4, r0, #0
- adds r0, #0x3f
- ldrb r0, [r0]
- cmp r0, #0x75
- beq _0802A4A8
- adds r0, r4, #0
- adds r0, #0x41
- ldrb r0, [r0]
- movs r2, #0x7f
- adds r1, r2, #0
- ands r1, r0
- cmp r1, #0
- beq _0802A474
- cmp r1, #0x1e
- bne _0802A4A8
-_0802A474:
- movs r0, #5
- strb r0, [r4, #0xc]
- ldrb r1, [r4, #0x10]
- adds r0, r2, #0
- ands r0, r1
- strb r0, [r4, #0x10]
- ldr r1, _0802A4D8 @ =gPlayerEntity
- ldrh r0, [r1, #0x2e]
- adds r2, r4, #0
- adds r2, #0x7e
- strh r0, [r2]
- ldrh r2, [r1, #0x32]
- adds r0, r4, #0
- adds r0, #0x80
- strh r2, [r0]
- ldrh r0, [r1, #0x36]
- adds r1, r4, #0
- adds r1, #0x82
- strh r0, [r1]
- ldrb r0, [r4, #0xc]
- cmp r0, #3
- beq _0802A4A8
- adds r0, r4, #0
- movs r1, #1
- bl InitializeAnimation
-_0802A4A8:
- adds r2, r4, #0
- adds r2, #0x42
- ldrb r0, [r2]
- adds r1, r0, #0
- cmp r1, #0
- beq _0802A4BC
- cmp r1, #4
- bls _0802A4BC
- subs r0, #4
- strb r0, [r2]
-_0802A4BC:
- adds r0, r4, #0
- adds r0, #0x43
- ldrb r0, [r0]
- cmp r0, #0
- beq _0802A4CE
- adds r0, r4, #0
- movs r1, #0x1c
- bl sub_0804A9FC
-_0802A4CE:
- ldr r1, _0802A4DC @ =gUnk_080CD07C
- adds r0, r4, #0
- bl sub_0804AA30
- pop {r4, pc}
- .align 2, 0
-_0802A4D8: .4byte gPlayerEntity
-_0802A4DC: .4byte gUnk_080CD07C
-
- thumb_func_start nullsub_142
-nullsub_142: @ 0x0802A4E0
- bx lr
- .align 2, 0
-
- thumb_func_start sub_0802A4E4
-sub_0802A4E4: @ 0x0802A4E4
- push {r4, lr}
- adds r4, r0, #0
- bl sub_0804A720
- movs r0, #1
- strb r0, [r4, #0xc]
- adds r1, r4, #0
- adds r1, #0x38
- movs r0, #3
- strb r0, [r1]
- bl Random
- adds r1, r4, #0
- adds r1, #0x7d
- strb r0, [r1]
- ldrb r1, [r4, #0xb]
- lsls r0, r1, #4
- subs r0, r0, r1
- lsls r0, r0, #2
- adds r1, r4, #0
- adds r1, #0x7a
- strh r0, [r1]
- ldrb r1, [r4, #0xe]
- adds r0, r4, #0
- adds r0, #0x7c
- strb r1, [r0]
- ldrb r1, [r4, #0xe]
- lsls r0, r1, #4
- subs r0, r0, r1
- lsls r0, r0, #2
- adds r1, r4, #0
- adds r1, #0x78
- strh r0, [r1]
- adds r0, r4, #0
- bl UpdateSpriteForCollisionLayer
- adds r0, r4, #0
- bl sub_0802A7D0
- pop {r4, pc}
-
- thumb_func_start sub_0802A534
-sub_0802A534: @ 0x0802A534
- push {r4, lr}
- adds r4, r0, #0
- adds r1, r4, #0
- adds r1, #0x78
- ldrh r0, [r1]
- cmp r0, #0
- beq _0802A548
- subs r0, #1
- strh r0, [r1]
- b _0802A5B0
-_0802A548:
- adds r0, r4, #0
- adds r0, #0x7a
- ldrh r0, [r0]
- cmp r0, #0
- bne _0802A5B0
- movs r0, #1
- bl sub_08049DF4
- adds r2, r0, #0
- cmp r2, #0
- beq _0802A5B0
- movs r0, #2
- strb r0, [r4, #0xc]
- movs r0, #0x5a
- strb r0, [r4, #0xe]
- ldrb r1, [r4, #0x10]
- movs r0, #0x80
- orrs r0, r1
- strb r0, [r4, #0x10]
- ldrb r0, [r4, #0x18]
- movs r1, #3
- orrs r0, r1
- strb r0, [r4, #0x18]
- ldrh r0, [r2, #0x2e]
- strh r0, [r4, #0x2e]
- ldrh r0, [r2, #0x32]
- strh r0, [r4, #0x32]
- ldr r0, _0802A5B4 @ =0x0000FF80
- strh r0, [r4, #0x36]
- adds r2, r4, #0
- adds r2, #0x29
- ldrb r1, [r2]
- movs r0, #0x39
- rsbs r0, r0, #0
- ands r0, r1
- movs r1, #8
- orrs r0, r1
- strb r0, [r2]
- ldrb r1, [r4, #0x18]
- movs r0, #0x31
- rsbs r0, r0, #0
- ands r0, r1
- movs r1, #0x20
- orrs r0, r1
- strb r0, [r4, #0x18]
- adds r0, r4, #0
- movs r1, #2
- bl InitializeAnimation
- adds r0, r4, #0
- bl sub_0802A7D0
-_0802A5B0:
- pop {r4, pc}
- .align 2, 0
-_0802A5B4: .4byte 0x0000FF80
-
- thumb_func_start sub_0802A5B8
-sub_0802A5B8: @ 0x0802A5B8
- push {r4, lr}
- adds r4, r0, #0
- bl sub_0802A7D0
- ldrb r0, [r4, #0xe]
- adds r2, r0, #0
- cmp r2, #0
- beq _0802A5E8
- subs r0, #1
- strb r0, [r4, #0xe]
- lsls r0, r0, #0x18
- cmp r0, #0
- bne _0802A60E
- ldr r0, _0802A5E4 @ =0x0000012D
- bl EnqueueSFX
- adds r0, r4, #0
- movs r1, #0
- bl InitializeAnimation
- b _0802A60E
- .align 2, 0
-_0802A5E4: .4byte 0x0000012D
-_0802A5E8:
- ldrh r0, [r4, #0x36]
- adds r0, #3
- strh r0, [r4, #0x36]
- lsls r0, r0, #0x10
- cmp r0, #0
- blt _0802A60E
- movs r0, #3
- strb r0, [r4, #0xc]
- ldrb r1, [r4, #0x18]
- subs r0, #7
- ands r0, r1
- movs r1, #1
- orrs r0, r1
- strb r0, [r4, #0x18]
- strh r2, [r4, #0x36]
- adds r0, r4, #0
- movs r1, #1
- bl InitializeAnimation
-_0802A60E:
- pop {r4, pc}
-
- thumb_func_start sub_0802A610
-sub_0802A610: @ 0x0802A610
- push {r4, lr}
- adds r4, r0, #0
- bl GetNextFrame
- adds r0, r4, #0
- bl sub_0802A7D0
- adds r3, r4, #0
- adds r3, #0x5a
- ldrb r1, [r3]
- movs r0, #0x80
- ands r0, r1
- lsls r0, r0, #0x18
- lsrs r2, r0, #0x18
- cmp r2, #0
- beq _0802A63A
- movs r0, #4
- strb r0, [r4, #0xc]
- movs r0, #0x1e
- strb r0, [r4, #0xe]
- b _0802A64C
-_0802A63A:
- movs r0, #1
- ands r0, r1
- cmp r0, #0
- beq _0802A64C
- strb r2, [r3]
- adds r1, r4, #0
- adds r1, #0x3f
- movs r0, #0x75
- strb r0, [r1]
-_0802A64C:
- pop {r4, pc}
- .align 2, 0
-
- thumb_func_start sub_0802A650
-sub_0802A650: @ 0x0802A650
- push {r4, lr}
- adds r4, r0, #0
- bl sub_0802A7D0
- ldrh r0, [r4, #0x36]
- subs r0, #2
- strh r0, [r4, #0x36]
- lsls r0, r0, #0x10
- asrs r0, r0, #0x10
- movs r1, #0xa0
- rsbs r1, r1, #0
- cmp r0, r1
- bge _0802A69A
- movs r0, #1
- strb r0, [r4, #0xc]
- ldrb r1, [r4, #0x10]
- movs r0, #0x7f
- ands r0, r1
- strb r0, [r4, #0x10]
- ldrb r1, [r4, #0x18]
- movs r0, #4
- rsbs r0, r0, #0
- ands r0, r1
- strb r0, [r4, #0x18]
- adds r1, r4, #0
- adds r1, #0x3f
- movs r0, #0x74
- strb r0, [r1]
- adds r0, r4, #0
- adds r0, #0x7c
- ldrb r1, [r0]
- lsls r0, r1, #4
- subs r0, r0, r1
- lsls r0, r0, #2
- adds r1, r4, #0
- adds r1, #0x78
- strh r0, [r1]
-_0802A69A:
- pop {r4, pc}
-
- thumb_func_start sub_0802A69C
-sub_0802A69C: @ 0x0802A69C
- push {r4, lr}
- adds r4, r0, #0
- bl sub_0802A7D0
- ldr r2, _0802A6E4 @ =gPlayerState
- ldrb r1, [r2, #0xa]
- movs r0, #0x80
- orrs r1, r0
- strb r1, [r2, #0xa]
- ldrb r1, [r2, #0x1a]
- orrs r0, r1
- strb r0, [r2, #0x1a]
- ldr r1, _0802A6E8 @ =gPlayerEntity
- adds r0, r4, #0
- adds r0, #0x7e
- ldrh r0, [r0]
- strh r0, [r1, #0x2e]
- adds r0, r4, #0
- adds r0, #0x80
- ldrh r0, [r0]
- strh r0, [r1, #0x32]
- adds r0, r4, #0
- adds r0, #0x82
- ldrh r0, [r0]
- strh r0, [r1, #0x36]
- lsls r0, r0, #0x10
- asrs r0, r0, #0x10
- ldrh r2, [r4, #0x36]
- movs r3, #0x36
- ldrsh r1, [r4, r3]
- cmp r0, r1
- beq _0802A6F0
- cmp r0, r1
- bge _0802A6EC
- subs r0, r2, #1
- b _0802A6EE
- .align 2, 0
-_0802A6E4: .4byte gPlayerState
-_0802A6E8: .4byte gPlayerEntity
-_0802A6EC:
- adds r0, r2, #1
-_0802A6EE:
- strh r0, [r4, #0x36]
-_0802A6F0:
- adds r0, r4, #0
- bl GetNextFrame
- adds r3, r4, #0
- adds r3, #0x5a
- ldrb r1, [r3]
- movs r0, #0x80
- ands r0, r1
- lsls r0, r0, #0x18
- lsrs r2, r0, #0x18
- cmp r2, #0
- beq _0802A712
- movs r0, #6
- strb r0, [r4, #0xc]
- movs r0, #0x1e
- strb r0, [r4, #0xe]
- b _0802A72E
-_0802A712:
- movs r0, #1
- ands r0, r1
- cmp r0, #0
- beq _0802A72E
- strb r2, [r3]
- adds r1, r4, #0
- adds r1, #0x63
- movs r0, #3
- strb r0, [r1]
- ldr r2, _0802A730 @ =gPlayerEntity
- ldrb r1, [r2, #0x18]
- subs r0, #7
- ands r0, r1
- strb r0, [r2, #0x18]
-_0802A72E:
- pop {r4, pc}
- .align 2, 0
-_0802A730: .4byte gPlayerEntity
-
- thumb_func_start sub_0802A734
-sub_0802A734: @ 0x0802A734
- push {r4, lr}
- adds r4, r0, #0
- bl sub_0802A7D0
- ldrb r0, [r4, #0xe]
- subs r0, #1
- strb r0, [r4, #0xe]
- lsls r0, r0, #0x18
- cmp r0, #0
- bne _0802A768
- bl sub_0805E5A8
- ldr r1, _0802A760 @ =gUnk_0813AB1C
- ldr r0, _0802A764 @ =gArea
- ldrb r0, [r0, #3]
- lsls r0, r0, #2
- adds r0, r0, r1
- ldr r0, [r0]
- bl DoExitTransition
- b _0802A780
- .align 2, 0
-_0802A760: .4byte gUnk_0813AB1C
-_0802A764: .4byte gArea
-_0802A768:
- ldr r0, [r4, #0x34]
- ldr r1, _0802A784 @ =0xFFFE0000
- adds r0, r0, r1
- str r0, [r4, #0x34]
- ldr r1, _0802A788 @ =gPlayerState
- ldrb r0, [r1, #0xa]
- movs r2, #0x80
- orrs r0, r2
- strb r0, [r1, #0xa]
- ldrb r0, [r1, #0x1a]
- orrs r0, r2
- strb r0, [r1, #0x1a]
-_0802A780:
- pop {r4, pc}
- .align 2, 0
-_0802A784: .4byte 0xFFFE0000
-_0802A788: .4byte gPlayerState
-
- thumb_func_start sub_0802A78C
-sub_0802A78C: @ 0x0802A78C
- push {r4, lr}
- adds r4, r0, #0
- ldrb r0, [r4, #0xc]
- cmp r0, #0
- beq _0802A7CC
- adds r0, r4, #0
- movs r1, #1
- bl sub_08049FDC
- cmp r0, #0
- beq _0802A7BC
- adds r0, r4, #0
- adds r0, #0x78
- ldrh r0, [r0]
- cmp r0, #0
- bne _0802A7CC
- adds r1, r4, #0
- adds r1, #0x7a
- ldrh r0, [r1]
- cmp r0, #0
- beq _0802A7CC
- subs r0, #1
- strh r0, [r1]
- b _0802A7CC
-_0802A7BC:
- ldrb r0, [r4, #0xb]
- lsls r1, r0, #4
- subs r1, r1, r0
- lsls r1, r1, #2
- adds r1, #1
- adds r0, r4, #0
- adds r0, #0x7a
- strh r1, [r0]
-_0802A7CC:
- pop {r4, pc}
- .align 2, 0
-
- thumb_func_start sub_0802A7D0
-sub_0802A7D0: @ 0x0802A7D0
- push {r4, lr}
- ldr r3, _0802A800 @ =gUnk_080CD0B0
- movs r1, #0x7d
- adds r1, r1, r0
- mov ip, r1
- ldrb r1, [r1]
- adds r2, r1, #1
- mov r4, ip
- strb r2, [r4]
- lsls r1, r1, #0x18
- lsrs r1, r1, #0x1b
- movs r2, #7
- ands r1, r2
- adds r1, r1, r3
- movs r2, #0
- ldrsb r2, [r1, r2]
- movs r1, #0x80
- lsls r1, r1, #1
- adds r2, r2, r1
- adds r1, r2, #0
- movs r3, #0
- bl sub_0805EC9C
- pop {r4, pc}
- .align 2, 0
-_0802A800: .4byte gUnk_080CD0B0
diff --git a/data/animations/wallMaster.s b/data/animations/wallMaster.s
new file mode 100644
index 00000000..277880d6
--- /dev/null
+++ b/data/animations/wallMaster.s
@@ -0,0 +1,16 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+
+ .section .rodata
+
+gUnk_080CD0B8:: @ 080CD0B8
+ .incbin "baserom.gba", 0x0CD0B8, 0x000000D
+
+gUnk_080CD0C5:: @ 080CD0C5
+ .incbin "baserom.gba", 0x0CD0C5, 0x0000015
+
+gUnk_080CD0DA:: @ 080CD0DA
+ .incbin "baserom.gba", 0x0CD0DA, 0x0000006
+
+gUnk_080CD0E0:: @ 080CD0E0
+ .incbin "baserom.gba", 0x0CD0E0, 0x0000010
diff --git a/data/data_080CC6FC.s b/data/data_080CC6FC.s
index 21a355af..af2f52c1 100644
--- a/data/data_080CC6FC.s
+++ b/data/data_080CC6FC.s
@@ -3,27 +3,6 @@
.section .rodata
-gUnk_080CD07C:: @ 080CD07C
- .incbin "baserom.gba", 0x0CD07C, 0x0000018
-
-gUnk_080CD094:: @ 080CD094
- .incbin "baserom.gba", 0x0CD094, 0x000001C
-
-gUnk_080CD0B0:: @ 080CD0B0
- .incbin "baserom.gba", 0x0CD0B0, 0x0000008
-
-gUnk_080CD0B8:: @ 080CD0B8
- .incbin "baserom.gba", 0x0CD0B8, 0x000000D
-
-gUnk_080CD0C5:: @ 080CD0C5
- .incbin "baserom.gba", 0x0CD0C5, 0x0000015
-
-gUnk_080CD0DA:: @ 080CD0DA
- .incbin "baserom.gba", 0x0CD0DA, 0x0000006
-
-gUnk_080CD0E0:: @ 080CD0E0
- .incbin "baserom.gba", 0x0CD0E0, 0x0000010
-
gUnk_080CD0F0:: @ 080CD0F0
.incbin "baserom.gba", 0x0CD0F0, 0x0000018
diff --git a/include/area.h b/include/area.h
index a683cb2a..a3f27b93 100644
--- a/include/area.h
+++ b/include/area.h
@@ -8,6 +8,7 @@ typedef struct {
u8 areaMetadata;
u8 locationIndex;
u8 unk;
+ u8 regret;
u16 localFlagOffset;
u8 filler[10];
u16 field_0x10;
diff --git a/linker.ld b/linker.ld
index 1da5b46e..b0643af3 100644
--- a/linker.ld
+++ b/linker.ld
@@ -351,7 +351,7 @@ SECTIONS {
src/enemy/rupeeLike.o(.text);
src/enemy/madderpillar.o(.text);
src/enemy/waterDrop.o(.text);
- asm/wallMaster.o(.text);
+ src/enemy/wallMaster.o(.text);
src/enemy/bombPeahat.o(.text);
asm/bombPeahat.o(.text);
asm/spark.o(.text);
@@ -955,6 +955,8 @@ SECTIONS {
data/animations/madderpillar.o(.rodata);
src/enemy/waterDrop.o(.rodata);
data/animations/waterDrop.o(.rodata);
+ src/enemy/wallMaster.o(.rodata);
+ data/animations/wallMaster.o(.rodata);
data/data_080CC6FC.o(.rodata);
src/enemy.o(.rodata);
data/data_080D3D94.o(.rodata);
diff --git a/src/enemy/wallMaster.c b/src/enemy/wallMaster.c
new file mode 100644
index 00000000..8f359f31
--- /dev/null
+++ b/src/enemy/wallMaster.c
@@ -0,0 +1,219 @@
+#include "enemy.h"
+#include "entity.h"
+#include "functions.h"
+#include "area.h"
+
+extern void sub_08001328(Entity*);
+extern Entity* sub_08049DF4(u32);
+extern void DoExitTransition(u32*);
+
+extern u32* gUnk_0813AB1C[];
+
+void sub_0802A78C(Entity*);
+void sub_0802A7D0(Entity*);
+
+extern void (*const gUnk_080CD07C[])(Entity*);
+extern void (*const gUnk_080CD094[])(Entity*);
+extern const s8 gUnk_080CD0B0[];
+
+void WallMaster(Entity* this) {
+ gUnk_080CD07C[GetNextFunction(this)](this);
+ SetChildOffset(this, 0, 1, -0x10);
+}
+
+void sub_0802A434(Entity* this) {
+ sub_0802A78C(this);
+ gUnk_080CD094[this->action](this);
+}
+
+void sub_0802A454(Entity* this) {
+ if (this->damageType != 0x75 && ((this->bitfield & 0x7f) == 0 || (this->bitfield & 0x7f) == 0x1e)) {
+ this->action = 5;
+ this->flags &= ~0x80;
+ this->field_0x7c.HALF.HI = gPlayerEntity.x.HALF.HI;
+ this->field_0x80.HWORD = gPlayerEntity.y.HALF.HI;
+ this->field_0x82.HWORD = gPlayerEntity.height.HALF.HI;
+ if (this->action != 3) {
+ InitializeAnimation(this, 1);
+ }
+ }
+
+ if (this->field_0x42)
+ if (this->field_0x42 > 4)
+ this->field_0x42 -= 4;
+
+ if (this->field_0x43 != 0) {
+ sub_0804A9FC(this, 0x1c);
+ }
+
+ sub_0804AA30(this, gUnk_080CD07C);
+}
+
+void nullsub_142(Entity* this) {
+ /* ... */
+}
+
+void sub_0802A4E4(Entity* this) {
+ sub_0804A720(this);
+ this->action = 1;
+ this->collisionLayer = 3;
+ this->field_0x7c.BYTES.byte1 = Random();
+ this->field_0x7a.HWORD = this->entityType.parameter * 0x3c;
+ this->field_0x7c.BYTES.byte0 = this->actionDelay;
+ this->field_0x78.HWORD = this->actionDelay * 0x3c;
+ UpdateSpriteForCollisionLayer(this);
+ sub_0802A7D0(this);
+}
+
+void sub_0802A534(Entity* this) {
+ if (this->field_0x78.HWORD) {
+ this->field_0x78.HWORD--;
+ } else if (this->field_0x7a.HWORD == 0) {
+ Entity* ent = sub_08049DF4(1);
+ if (ent != NULL) {
+ this->action = 2;
+ this->actionDelay = 0x5a;
+ this->flags |= 0x80;
+ this->spriteSettings.b.draw = 3;
+ this->x.HALF.HI = ent->x.HALF.HI;
+ this->y.HALF.HI = ent->y.HALF.HI;
+ this->height.HALF.HI = -0x80;
+ this->spritePriority.b1 = 1;
+ this->spriteSettings.b.shadow = 2;
+ InitializeAnimation(this, 2);
+ sub_0802A7D0(this);
+ }
+ }
+}
+
+void sub_0802A5B8(Entity* this) {
+ sub_0802A7D0(this);
+ if (this->actionDelay) {
+ if (--this->actionDelay == 0) {
+ EnqueueSFX(0x12d);
+ InitializeAnimation(this, 0);
+ }
+ } else {
+ this->height.HALF.HI += 3;
+ if (-1 < this->height.HALF.HI) {
+ this->action = 3;
+ this->spriteSettings.b.draw = 1;
+ this->height.HALF.HI = 0;
+ InitializeAnimation(this, 1);
+ }
+ }
+}
+
+/* Kids... don't try to optimize code like this... */
+void sub_0802A610(Entity* this) {
+ u32 flags;
+
+ GetNextFrame(this);
+ sub_0802A7D0(this);
+ flags = this->frames.all & 0x80;
+ if (flags) {
+ this->action = 4;
+ this->actionDelay = 0x1e;
+ } else if (this->frames.all & 1) {
+ this->frames.all = flags;
+ this->damageType = 0x75;
+ }
+}
+
+void sub_0802A650(Entity* this) {
+ sub_0802A7D0(this);
+ this->height.HALF.HI -= 2;
+ if (-0xa0 > this->height.HALF.HI) {
+ this->action = 1;
+ this->flags &= ~0x80;
+ this->spriteSettings.b.draw = 0;
+ this->damageType = 0x74;
+ this->field_0x78.HWORD = this->field_0x7c.BYTES.byte0 * 0x3c;
+ }
+}
+
+void sub_0802A69C(Entity* this) {
+ u32 flags;
+
+ sub_0802A7D0(this);
+ gPlayerState.field_0xa |= 0x80;
+ gPlayerState.field_0x1a[0] |= 0x80;
+ gPlayerEntity.x.HALF.HI = this->field_0x7c.HALF.HI;
+ gPlayerEntity.y.HALF.HI = this->field_0x80.HWORD;
+ gPlayerEntity.height.HALF.HI = this->field_0x82.HWORD;
+
+ if (gPlayerEntity.height.HALF.HI != this->height.HALF.HI) {
+ if (gPlayerEntity.height.HALF.HI < this->height.HALF.HI) {
+ this->height.HALF.HI--;
+ } else {
+ this->height.HALF.HI++;
+ }
+ }
+
+ /* sigh... */
+ GetNextFrame(this);
+ flags = this->frames.all & 0x80;
+ if (flags) {
+ this->action = 6;
+ this->actionDelay = 0x1e;
+ } else if (this->frames.all & 0x1) {
+ this->frames.all = flags;
+ this->spriteOffsetY = 3;
+ gPlayerEntity.spriteSettings.b.draw = 0;
+ }
+}
+
+void sub_0802A734(Entity* this) {
+ sub_0802A7D0(this);
+ if (--this->actionDelay == 0) {
+ sub_0805E5A8();
+ DoExitTransition(gUnk_0813AB1C[gArea.regret]);
+ } else {
+ this->height.WORD -= 0x20000;
+ gPlayerState.field_0xa |= 0x80;
+ gPlayerState.field_0x1a[0] |= 0x80;
+ }
+}
+
+void sub_0802A78C(Entity* this) {
+ if (this->action != 0) {
+ if (sub_08049FDC(this, 1)) {
+ if (this->field_0x78.HWORD == 0) {
+ if (this->field_0x7a.HWORD) {
+ this->field_0x7a.HWORD--;
+ }
+ }
+ } else {
+ this->field_0x7a.HWORD = this->entityType.parameter * 0x3c + 1;
+ }
+ }
+}
+
+void sub_0802A7D0(Entity* this) {
+ u32 unk = gUnk_080CD0B0[(this->field_0x7c.BYTES.byte1++ >> 3) & 7] + 0x100;
+ sub_0805EC9C(this, unk, unk, 0);
+}
+// clang-format off
+void (*const gUnk_080CD07C[])(Entity*) = {
+ sub_0802A434,
+ sub_0802A454,
+ sub_08001328,
+ sub_0804A7D4,
+ sub_08001242,
+ nullsub_142,
+};
+
+void (*const gUnk_080CD094[])(Entity*) = {
+ sub_0802A4E4,
+ sub_0802A534,
+ sub_0802A5B8,
+ sub_0802A610,
+ sub_0802A650,
+ sub_0802A69C,
+ sub_0802A734,
+};
+
+const s8 gUnk_080CD0B0[] = {
+ -2, -4, -2, 0, 2, 4, 2, 0,
+};
+// clang-format on