From 6e61e77e9ede919543ba3f92e1fc6b976b4db964 Mon Sep 17 00:00:00 2001 From: Behemoth Date: Sun, 30 Aug 2020 00:34:41 +0200 Subject: [PATCH] decompile moldorm --- asm/moldorm.s | 558 ---------------------- asm/non_matching/moldorm/sub_08022E40.inc | 62 +++ asm/non_matching/moldorm/sub_08022EAC.inc | 60 +++ data/data_080CBB90.s | 15 - linker.ld | 3 +- src/enemy/moldorm.c | 211 ++++++++ 6 files changed, 335 insertions(+), 574 deletions(-) delete mode 100644 asm/moldorm.s create mode 100644 asm/non_matching/moldorm/sub_08022E40.inc create mode 100644 asm/non_matching/moldorm/sub_08022EAC.inc create mode 100644 src/enemy/moldorm.c diff --git a/asm/moldorm.s b/asm/moldorm.s deleted file mode 100644 index 24d0838f..00000000 --- a/asm/moldorm.s +++ /dev/null @@ -1,558 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Moldorm -Moldorm: @ 0x08022B88 - push {lr} - ldr r2, _08022B9C @ =gUnk_080CBB90 - ldrb r1, [r0, #0xa] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08022B9C: .4byte gUnk_080CBB90 - - thumb_func_start sub_08022BA0 -sub_08022BA0: @ 0x08022BA0 - push {r4, lr} - adds r4, r0, #0 - adds r1, r4, #0 - adds r1, #0x79 - ldrb r0, [r1] - adds r0, #1 - strb r0, [r1] - ldrh r1, [r4, #0x2e] - adds r0, r4, #0 - adds r0, #0x74 - strh r1, [r0] - ldrh r0, [r4, #0x32] - adds r1, r4, #0 - adds r1, #0x76 - strh r0, [r1] - ldr r1, _08022BD0 @ =gUnk_080CBBA0 - adds r0, r4, #0 - bl EnemyFunctionHandler - adds r0, r4, #0 - bl sub_08022EAC - pop {r4, pc} - .align 2, 0 -_08022BD0: .4byte gUnk_080CBBA0 - - thumb_func_start sub_08022BD4 -sub_08022BD4: @ 0x08022BD4 - push {lr} - ldr r2, _08022BE8 @ =gUnk_080CBBB4 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08022BE8: .4byte gUnk_080CBBB4 - - thumb_func_start sub_08022BEC -sub_08022BEC: @ 0x08022BEC - push {lr} - adds r2, r0, #0 - movs r0, #0x7a - adds r0, r0, r2 - mov ip, r0 - adds r3, r2, #0 - adds r3, #0x45 - ldrb r0, [r0] - ldrb r1, [r3] - cmp r0, r1 - beq _08022C0A - adds r1, r2, #0 - adds r1, #0x7b - movs r0, #0x1e - strb r0, [r1] -_08022C0A: - ldrb r0, [r3] - mov r1, ip - strb r0, [r1] - movs r0, #1 - strb r0, [r2, #0xe] - adds r0, r2, #0 - adds r0, #0x3e - ldrb r0, [r0] - strb r0, [r2, #0x15] - ldrb r0, [r2, #0x15] - adds r0, #2 - movs r1, #0x1c - ands r0, r1 - asrs r0, r0, #2 - strb r0, [r2, #0x14] - strb r0, [r2, #0x1e] - ldr r0, [r2, #0x54] - adds r3, r2, #0 - adds r3, #0x3d - ldrb r1, [r3] - adds r0, #0x3d - strb r1, [r0] - ldr r0, [r2, #0x7c] - ldrb r1, [r3] - adds r0, #0x3d - strb r1, [r0] - adds r0, r2, #0 - adds r0, #0x80 - ldr r0, [r0] - ldrb r1, [r3] - adds r0, #0x3d - strb r1, [r0] - ldr r1, _08022C54 @ =gUnk_080CBBA0 - adds r0, r2, #0 - bl sub_0804AA30 - pop {pc} - .align 2, 0 -_08022C54: .4byte gUnk_080CBBA0 - - thumb_func_start sub_08022C58 -sub_08022C58: @ 0x08022C58 - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - adds r7, r0, #0 - ldrb r1, [r7, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r7, #0x10] - ldr r0, _08022D3C @ =gEntCount - ldrb r0, [r0] - cmp r0, #0x44 - bhi _08022D34 - movs r0, #0xd - movs r1, #1 - bl CreateEnemy - mov sb, r0 - str r0, [r7, #0x54] - mov r2, sb - adds r2, #0x29 - ldrb r1, [r2] - movs r4, #8 - rsbs r4, r4, #0 - adds r0, r4, #0 - ands r0, r1 - movs r1, #5 - mov r8, r1 - mov r1, r8 - orrs r0, r1 - strb r0, [r2] - mov r0, sb - str r7, [r0, #0x50] - adds r0, r7, #0 - mov r1, sb - bl CopyPosition - movs r0, #0xd - movs r1, #2 - bl CreateEnemy - adds r6, r0, #0 - mov r1, sb - str r6, [r1, #0x54] - adds r2, r6, #0 - adds r2, #0x29 - ldrb r1, [r2] - adds r0, r4, #0 - ands r0, r1 - mov r1, r8 - orrs r0, r1 - strb r0, [r2] - str r7, [r6, #0x50] - adds r0, r7, #0 - adds r1, r6, #0 - bl CopyPosition - movs r0, #0xd - movs r1, #3 - bl CreateEnemy - adds r5, r0, #0 - str r5, [r6, #0x54] - adds r1, r5, #0 - adds r1, #0x29 - ldrb r0, [r1] - ands r4, r0 - mov r0, r8 - orrs r4, r0 - strb r4, [r1] - str r7, [r5, #0x50] - adds r0, r7, #0 - adds r1, r5, #0 - bl CopyPosition - adds r0, r7, #0 - bl sub_0804A720 - movs r0, #1 - strb r0, [r7, #0xc] - strb r0, [r7, #0xe] - strb r0, [r7, #0xf] - ldrb r0, [r7, #0x10] - movs r1, #0x80 - orrs r0, r1 - strb r0, [r7, #0x10] - str r7, [r7, #0x50] - mov r1, sb - str r1, [r7, #0x54] - str r6, [r7, #0x7c] - adds r0, r7, #0 - adds r0, #0x80 - str r5, [r0] - bl Random - movs r1, #0x1f - ands r0, r1 - strb r0, [r7, #0x15] - ldrb r0, [r7, #0x15] - adds r0, #2 - movs r1, #0x1c - ands r0, r1 - asrs r0, r0, #2 - strb r0, [r7, #0x14] - strb r0, [r7, #0x1e] - adds r0, r7, #0 - adds r0, #0x45 - ldrb r1, [r0] - adds r0, #0x35 - strb r1, [r0] -_08022D34: - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08022D3C: .4byte gEntCount - - thumb_func_start sub_08022D40 -sub_08022D40: @ 0x08022D40 - push {r4, lr} - adds r4, r0, #0 - adds r2, r4, #0 - adds r2, #0x7b - ldrb r1, [r2] - cmp r1, #0 - beq _08022D66 - adds r0, r1, #0 - adds r0, #0xff - strb r0, [r2] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _08022D8E - ldrb r0, [r4, #0x14] - adds r0, #1 - movs r1, #7 - ands r0, r1 - b _08022D8A -_08022D66: - adds r0, r4, #0 - bl sub_08022F14 - adds r0, r4, #0 - bl sub_080AEF88 - ldrh r0, [r4, #0x2a] - cmp r0, #0 - beq _08022D8E - adds r1, r0, #0 - adds r0, r4, #0 - bl sub_0800417E - ldrb r0, [r4, #0x15] - adds r0, #2 - movs r1, #0x1c - ands r0, r1 - asrs r0, r0, #2 -_08022D8A: - strb r0, [r4, #0x14] - strb r0, [r4, #0x1e] -_08022D8E: - pop {r4, pc} - - thumb_func_start sub_08022D90 -sub_08022D90: @ 0x08022D90 - push {r4, r5, lr} - adds r5, r0, #0 - ldr r0, [r5, #0x50] - ldr r0, [r0, #4] - cmp r0, #0 - beq _08022DE0 - ldr r1, _08022DDC @ =gUnk_080CBBBC - ldrb r0, [r5, #0xc] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - adds r0, r5, #0 - bl _call_via_r1 - ldr r4, [r5, #0x50] - ldrb r2, [r4, #0x1b] - lsrs r2, r2, #6 - lsls r2, r2, #6 - ldrb r3, [r5, #0x1b] - movs r1, #0x3f - adds r0, r1, #0 - ands r0, r3 - orrs r0, r2 - strb r0, [r5, #0x1b] - ldrb r0, [r4, #0x19] - lsrs r0, r0, #6 - lsls r0, r0, #6 - ldrb r2, [r5, #0x19] - ands r1, r2 - orrs r1, r0 - strb r1, [r5, #0x19] - adds r4, #0x38 - ldrb r1, [r4] - adds r0, r5, #0 - adds r0, #0x38 - strb r1, [r0] - b _08022DE6 - .align 2, 0 -_08022DDC: .4byte gUnk_080CBBBC -_08022DE0: - adds r0, r5, #0 - bl DeleteEntity -_08022DE6: - pop {r4, r5, pc} - - thumb_func_start sub_08022DE8 -sub_08022DE8: @ 0x08022DE8 - push {lr} - adds r3, r0, #0 - movs r0, #1 - strb r0, [r3, #0xc] - adds r0, r3, #0 - adds r0, #0x7c - movs r1, #0x88 - strb r1, [r0] - adds r0, #1 - strb r1, [r0] - adds r0, #1 - strb r1, [r0] - adds r0, #1 - strb r1, [r0] - adds r0, #1 - strb r1, [r0] - adds r0, #1 - strb r1, [r0] - adds r0, #1 - strb r1, [r0] - adds r0, #1 - strb r1, [r0] - ldr r0, [r3, #0x50] - ldrb r0, [r0, #0x14] - strb r0, [r3, #0x14] - adds r2, r3, #0 - adds r2, #0x84 - ldrb r1, [r3, #0x14] - lsls r0, r1, #4 - adds r0, r0, r1 - lsls r1, r0, #8 - adds r0, r0, r1 - lsls r1, r0, #0x10 - adds r0, r0, r1 - str r0, [r2] - ldrb r0, [r3, #0xa] - cmp r0, #3 - beq _08022E38 - adds r0, #7 - b _08022E3C -_08022E38: - ldrb r0, [r3, #0x14] - adds r0, #0xa -_08022E3C: - strb r0, [r3, #0x1e] - pop {pc} - - thumb_func_start sub_08022E40 -sub_08022E40: @ 0x08022E40 - push {r4, r5, lr} - adds r4, r0, #0 - ldrh r1, [r4, #0x2e] - adds r0, #0x74 - strh r1, [r0] - ldrh r0, [r4, #0x32] - adds r1, r4, #0 - adds r1, #0x76 - strh r0, [r1] - ldr r2, [r4, #0x50] - adds r2, #0x79 - ldrb r0, [r2] - adds r0, #1 - movs r3, #7 - ands r0, r3 - adds r0, #0x7c - adds r0, r4, r0 - ldrb r1, [r0] - movs r0, #0xf - ands r0, r1 - subs r0, #8 - lsrs r1, r1, #4 - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - ldrh r5, [r4, #0x2e] - adds r0, r0, r5 - strh r0, [r4, #0x2e] - subs r1, #8 - ldrh r0, [r4, #0x32] - adds r1, r1, r0 - strh r1, [r4, #0x32] - adds r1, r4, #0 - adds r1, #0x84 - ldrb r0, [r2] - adds r0, #1 - ands r0, r3 - lsls r0, r0, #2 - ldr r1, [r1] - lsrs r1, r0 - movs r0, #7 - ands r1, r0 - strb r1, [r4, #0x14] - ldrb r0, [r4, #0xa] - cmp r0, #3 - bne _08022EA2 - adds r0, r1, #0 - adds r0, #0xa - strb r0, [r4, #0x1e] - b _08022EA8 -_08022EA2: - adds r0, r4, #0 - bl sub_08022EAC -_08022EA8: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_08022EAC -sub_08022EAC: @ 0x08022EAC - push {r4, r5, lr} - mov ip, r0 - ldr r1, [r0, #0x54] - cmp r1, #0 - beq _08022F12 - ldr r0, [r0, #0x50] - adds r0, #0x79 - ldrb r0, [r0] - movs r4, #7 - adds r3, r4, #0 - ands r3, r0 - adds r3, r3, r1 - adds r3, #0x7c - mov r0, ip - ldrh r1, [r0, #0x2e] - adds r0, #0x74 - ldrb r0, [r0] - subs r1, r1, r0 - adds r1, #8 - movs r5, #0xf - ands r1, r5 - mov r2, ip - ldrh r0, [r2, #0x32] - adds r2, #0x76 - ldrb r2, [r2] - subs r0, r0, r2 - adds r0, #8 - ands r0, r5 - lsls r0, r0, #4 - adds r1, r1, r0 - strb r1, [r3] - mov r1, ip - ldr r0, [r1, #0x50] - adds r0, #0x79 - ldrb r1, [r0] - adds r0, r4, #0 - ands r0, r1 - lsls r0, r0, #2 - mov r2, ip - ldrb r1, [r2, #0x14] - ands r4, r1 - lsls r4, r0 - movs r2, #0xf - lsls r2, r0 - mov r0, ip - ldr r1, [r0, #0x54] - adds r1, #0x84 - ldr r0, [r1] - bics r0, r2 - orrs r4, r0 - str r4, [r1] -_08022F12: - pop {r4, r5, pc} - - thumb_func_start sub_08022F14 -sub_08022F14: @ 0x08022F14 - push {r4, r5, lr} - adds r4, r0, #0 - bl sub_08049FA0 - cmp r0, #0 - bne _08022F4E - adds r0, r4, #0 - bl sub_08049EE4 - ldrb r1, [r4, #0x15] - subs r2, r0, r1 - movs r1, #0x1f - ands r2, r1 - adds r0, r2, #4 - ands r0, r1 - cmp r0, #8 - bls _08022F4E - movs r0, #8 - strb r0, [r4, #0xf] - cmp r2, #0xf - bhi _08022F46 - adds r1, r4, #0 - adds r1, #0x78 - movs r0, #1 - b _08022F4C -_08022F46: - adds r1, r4, #0 - adds r1, #0x78 - movs r0, #0xff -_08022F4C: - strb r0, [r1] -_08022F4E: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - movs r1, #0xff - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08022F9E - movs r0, #4 - strb r0, [r4, #0xe] - ldrb r0, [r4, #0xf] - subs r0, #1 - strb r0, [r4, #0xf] - ands r0, r1 - adds r5, r4, #0 - adds r5, #0x78 - cmp r0, #0 - bne _08022F84 - movs r0, #8 - strb r0, [r4, #0xf] - bl Random - ldr r2, _08022FA0 @ =gUnk_080CBBC4 - movs r1, #1 - ands r1, r0 - adds r1, r1, r2 - ldrb r0, [r1] - strb r0, [r5] -_08022F84: - ldrb r0, [r5] - ldrb r1, [r4, #0x15] - adds r0, r0, r1 - movs r1, #0x1f - ands r0, r1 - strb r0, [r4, #0x15] - ldrb r0, [r4, #0x15] - adds r0, #2 - movs r1, #0x1c - ands r0, r1 - asrs r0, r0, #2 - strb r0, [r4, #0x14] - strb r0, [r4, #0x1e] -_08022F9E: - pop {r4, r5, pc} - .align 2, 0 -_08022FA0: .4byte gUnk_080CBBC4 diff --git a/asm/non_matching/moldorm/sub_08022E40.inc b/asm/non_matching/moldorm/sub_08022E40.inc new file mode 100644 index 00000000..a4f2d937 --- /dev/null +++ b/asm/non_matching/moldorm/sub_08022E40.inc @@ -0,0 +1,62 @@ + + .syntax unified + + .text + + push {r4, r5, lr} + adds r4, r0, #0 + ldrh r1, [r4, #0x2e] + adds r0, #0x74 + strh r1, [r0] + ldrh r0, [r4, #0x32] + adds r1, r4, #0 + adds r1, #0x76 + strh r0, [r1] + ldr r2, [r4, #0x50] + adds r2, #0x79 + ldrb r0, [r2] + adds r0, #1 + movs r3, #7 + ands r0, r3 + adds r0, #0x7c + adds r0, r4, r0 + ldrb r1, [r0] + movs r0, #0xf + ands r0, r1 + subs r0, #8 + lsrs r1, r1, #4 + lsls r0, r0, #0x18 + asrs r0, r0, #0x18 + ldrh r5, [r4, #0x2e] + adds r0, r0, r5 + strh r0, [r4, #0x2e] + subs r1, #8 + ldrh r0, [r4, #0x32] + adds r1, r1, r0 + strh r1, [r4, #0x32] + adds r1, r4, #0 + adds r1, #0x84 + ldrb r0, [r2] + adds r0, #1 + ands r0, r3 + lsls r0, r0, #2 + ldr r1, [r1] + lsrs r1, r0 + movs r0, #7 + ands r1, r0 + strb r1, [r4, #0x14] + ldrb r0, [r4, #0xa] + cmp r0, #3 + bne _08022EA2 + adds r0, r1, #0 + adds r0, #0xa + strb r0, [r4, #0x1e] + b _08022EA8 +_08022EA2: + adds r0, r4, #0 + bl sub_08022EAC +_08022EA8: + pop {r4, r5, pc} + .align 2, 0 + + .syntax divided diff --git a/asm/non_matching/moldorm/sub_08022EAC.inc b/asm/non_matching/moldorm/sub_08022EAC.inc new file mode 100644 index 00000000..ca3bce96 --- /dev/null +++ b/asm/non_matching/moldorm/sub_08022EAC.inc @@ -0,0 +1,60 @@ + + .syntax unified + + .text + + push {r4, r5, lr} + mov ip, r0 + ldr r1, [r0, #0x54] + cmp r1, #0 + beq _08022F12 + ldr r0, [r0, #0x50] + adds r0, #0x79 + ldrb r0, [r0] + movs r4, #7 + adds r3, r4, #0 + ands r3, r0 + adds r3, r3, r1 + adds r3, #0x7c + mov r0, ip + ldrh r1, [r0, #0x2e] + adds r0, #0x74 + ldrb r0, [r0] + subs r1, r1, r0 + adds r1, #8 + movs r5, #0xf + ands r1, r5 + mov r2, ip + ldrh r0, [r2, #0x32] + adds r2, #0x76 + ldrb r2, [r2] + subs r0, r0, r2 + adds r0, #8 + ands r0, r5 + lsls r0, r0, #4 + adds r1, r1, r0 + strb r1, [r3] + mov r1, ip + ldr r0, [r1, #0x50] + adds r0, #0x79 + ldrb r1, [r0] + adds r0, r4, #0 + ands r0, r1 + lsls r0, r0, #2 + mov r2, ip + ldrb r1, [r2, #0x14] + ands r4, r1 + lsls r4, r0 + movs r2, #0xf + lsls r2, r0 + mov r0, ip + ldr r1, [r0, #0x54] + adds r1, #0x84 + ldr r0, [r1] + bics r0, r2 + orrs r4, r0 + str r4, [r1] +_08022F12: + pop {r4, r5, pc} + + .syntax divided diff --git a/data/data_080CBB90.s b/data/data_080CBB90.s index 3c1631e4..f40cf851 100644 --- a/data/data_080CBB90.s +++ b/data/data_080CBB90.s @@ -3,21 +3,6 @@ .section .rodata -gUnk_080CBB90:: @ 080CBB90 - .incbin "baserom.gba", 0x0CBB90, 0x0000010 - -gUnk_080CBBA0:: @ 080CBBA0 - .incbin "baserom.gba", 0x0CBBA0, 0x0000014 - -gUnk_080CBBB4:: @ 080CBBB4 - .incbin "baserom.gba", 0x0CBBB4, 0x0000008 - -gUnk_080CBBBC:: @ 080CBBBC - .incbin "baserom.gba", 0x0CBBBC, 0x0000008 - -gUnk_080CBBC4:: @ 080CBBC4 - .incbin "baserom.gba", 0x0CBBC4, 0x0000004 - gUnk_080CBBC8:: @ 080CBBC8 .incbin "baserom.gba", 0x0CBBC8, 0x0000014 diff --git a/linker.ld b/linker.ld index 43caeca1..fa911b12 100644 --- a/linker.ld +++ b/linker.ld @@ -338,7 +338,7 @@ SECTIONS { src/enemy/rockChuchu.o(.text); src/enemy/spinyChuchu.o(.text); src/enemy/cuccoChickAggr.o(.text); - asm/moldorm.o(.text); + src/enemy/moldorm.o(.text); asm/enemyE.o(.text); asm/moldworm.o(.text); asm/sluggula.o(.text); @@ -929,6 +929,7 @@ SECTIONS { src/enemy/spinyChuchu.o(.rodata); data/animations/spinyChuchu.o(.rodata); src/enemy/cuccoChickAggr.o(.rodata); + src/enemy/moldorm.o(.rodata); data/data_080CBB90.o(.rodata); src/enemy.o(.rodata); data/data_080D3D94.o(.rodata); diff --git a/src/enemy/moldorm.c b/src/enemy/moldorm.c new file mode 100644 index 00000000..530eeae1 --- /dev/null +++ b/src/enemy/moldorm.c @@ -0,0 +1,211 @@ +#include "enemy.h" +#include "entity.h" +#include "functions.h" + +void sub_08022EAC(Entity*); +void sub_08022F14(Entity*); + +extern void (*const gUnk_080CBB90[])(Entity*); +extern void (*const gUnk_080CBBA0[])(Entity*); +extern void (*const gUnk_080CBBB4[])(Entity*); +extern void (*const gUnk_080CBBBC[])(Entity*); + +extern u8 gEntCount; +extern const s8 gUnk_080CBBC4[]; + +void Moldorm(Entity* this) { + gUnk_080CBB90[this->entityType.form](this); +} + +void sub_08022BA0(Entity* this) { + this->field_0x78.HALF.HI++; + this->field_0x74.HWORD = this->x.HALF.HI; + this->field_0x76.HWORD = this->y.HALF.HI; + EnemyFunctionHandler(this, gUnk_080CBBA0); + sub_08022EAC(this); +} + +void sub_08022BD4(Entity* this) { + gUnk_080CBBB4[this->action](this); +} + +void sub_08022BEC(Entity* this) { + if (this->field_0x7a.HALF.LO != this->currentHealth) + this->field_0x7a.HALF.HI = 30; + + this->field_0x7a.HALF.LO = this->currentHealth; + this->actionDelay = 1; + this->direction = this->field_0x3e; + + this->animationState = ((this->direction + 2) & 0x1c) >> 2; + this->frameIndex = this->animationState; + + this->attachedEntity->hurtBlinkTime = this->hurtBlinkTime; + (*(Entity**)&this->field_0x7c)->hurtBlinkTime = this->hurtBlinkTime; + (*(Entity**)&this->field_0x80)->hurtBlinkTime = this->hurtBlinkTime; + sub_0804AA30(this, gUnk_080CBBA0); +} + +void sub_08022C58(Entity* this) { + Entity *tail0, *tail1, *tail2; + + this->flags &= ~0x80; + + if (gEntCount >= 0x45) + return; + + tail0 = CreateEnemy(0xd, 1); + this->attachedEntity = tail0; + tail0->spritePriority.b0 = 5; + tail0->parent = this; + CopyPosition(this, tail0); + + tail1 = CreateEnemy(0xd, 2); + tail0->attachedEntity = tail1; + tail1->spritePriority.b0 = 5; + tail1->parent = this; + CopyPosition(this, tail1); + + tail2 = CreateEnemy(0xd, 3); + tail1->attachedEntity = tail2; + tail2->spritePriority.b0 = 5; + tail2->parent = this; + CopyPosition(this, tail2); + + sub_0804A720(this); + this->action = 1; + this->actionDelay = 1; + this->field_0xf = 1; + this->flags = this->flags | 0x80; + this->parent = this; + this->attachedEntity = tail0; + *(Entity**)&this->field_0x7c = tail1; + *(Entity**)&this->field_0x80 = tail2; + + this->direction = Random() & 0x1f; + this->animationState = ((this->direction + 2) & 0x1c) >> 2; + this->frameIndex = this->animationState; + this->field_0x7a.HALF.LO = this->currentHealth; +} + +void sub_08022D40(Entity* this) { + if (this->field_0x7a.HALF.HI) { + if (this->field_0x7a.HALF.HI-- & 1) { + this->animationState = (this->animationState + 1) & 7; + this->frameIndex = this->animationState; + } + } else { + sub_08022F14(this); + sub_080AEF88(this); + + if (this->collisions) { + sub_0800417E(this, this->collisions); + this->animationState = ((this->direction + 2) & 0x1c) >> 2; + this->frameIndex = this->animationState; + } + } +} + +void sub_08022D90(Entity* this) { + if (this->parent->next) { + Entity* parent; + + gUnk_080CBBBC[this->action](this); + parent = this->parent; + this->spriteOrientation.flipY = parent->spriteOrientation.flipY; + this->spriteRendering.b3 = parent->spriteRendering.b3; + this->collisionLayer = parent->collisionLayer; + } else { + DeleteEntity(this); + } +} + +void sub_08022DE8(Entity* this) { + this->action = 1; + this->field_0x7c.BYTES.byte0 = 0x88; + this->field_0x7c.BYTES.byte1 = 0x88; + this->field_0x7c.BYTES.byte2 = 0x88; + this->field_0x7c.BYTES.byte3 = 0x88; + this->field_0x80.HALF.LO = 0x88; + this->field_0x80.HALF.HI = 0x88; + this->field_0x82.HALF.LO = 0x88; + this->field_0x82.HALF.HI = 0x88; + this->animationState = this->parent->animationState; + *(u32*)&this->cutsceneBeh = this->animationState * 0x11111111; + + if (this->entityType.form != 3) { + this->frameIndex = this->entityType.form + 7; + } else { + this->frameIndex = this->animationState + 10; + } +} + +NAKED +void sub_08022E40(Entity* this) { + asm(".include \"asm/non_matching/moldorm/sub_08022E40.inc\""); +} + +NAKED +void sub_08022EAC(Entity* this) { + asm(".include \"asm/non_matching/moldorm/sub_08022EAC.inc\""); +} + +void sub_08022F14(Entity* this) { + if (sub_08049FA0(this) == 0) { + u32 bVar6 = (sub_08049EE4(this) - this->direction) & 0x1f; + if (8 < ((bVar6 + 4) & 0x1f)) { + this->field_0xf = 8; + if (bVar6 < 0x10) { + this->field_0x78.HALF.LO = 1; + } else { + this->field_0x78.HALF.LO = -1; + } + } + } + + if (--this->actionDelay == 0) { + this->actionDelay = 4; + + if (--this->field_0xf == 0) { + this->field_0xf = 8; + this->field_0x78.HALF.LO = gUnk_080CBBC4[Random() & 1]; + } + + this->direction += this->field_0x78.HALF.LO; + this->direction &= 0x1f; + + this->animationState = ((this->direction + 2) & 0x1c) >> 2; + this->frameIndex = this->animationState; + } +} + +// clang-format off +void (*const gUnk_080CBB90[])(Entity*) = { + sub_08022BA0, + sub_08022D90, + sub_08022D90, + sub_08022D90, +}; + +void (*const gUnk_080CBBA0[])(Entity*) = { + sub_08022BD4, + sub_08022BEC, + sub_08001324, + sub_0804A7D4, + sub_08001242, +}; + +void (*const gUnk_080CBBB4[])(Entity*) = { + sub_08022C58, + sub_08022D40, +}; + +void (*const gUnk_080CBBBC[])(Entity*) = { + sub_08022DE8, + sub_08022E40, +}; + +const s8 gUnk_080CBBC4[] = { + 1, -1, 0, 0, +}; +// clang-format off