From fe3369491957a34673e47dfecd46d8d14e208a2d Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Mon, 31 Jan 2022 20:01:32 +0200 Subject: [PATCH] Decompile scissorsBeetle --- asm/enemy/scissorsBeetle.s | 531 ------------------------------ assets/assets.json | 15 - data/const/enemy/scissorsBeetle.s | 29 -- linker.ld | 4 +- src/enemy/scissorsBeetle.c | 245 ++++++++++++++ 5 files changed, 247 insertions(+), 577 deletions(-) delete mode 100644 asm/enemy/scissorsBeetle.s delete mode 100644 data/const/enemy/scissorsBeetle.s create mode 100644 src/enemy/scissorsBeetle.c diff --git a/asm/enemy/scissorsBeetle.s b/asm/enemy/scissorsBeetle.s deleted file mode 100644 index 010a9ff0..00000000 --- a/asm/enemy/scissorsBeetle.s +++ /dev/null @@ -1,531 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start ScissorsBeetle -ScissorsBeetle: @ 0x080388B4 - push {r4, lr} - adds r4, r0, #0 - ldr r1, _080388D0 @ =gUnk_080CF600 - bl EnemyFunctionHandler - movs r3, #0x10 - rsbs r3, r3, #0 - adds r0, r4, #0 - movs r1, #0 - movs r2, #1 - bl SetChildOffset - pop {r4, pc} - .align 2, 0 -_080388D0: .4byte gUnk_080CF600 - - thumb_func_start sub_080388D4 -sub_080388D4: @ 0x080388D4 - push {lr} - ldr r2, _080388E8 @ =gUnk_080CF618 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_080388E8: .4byte gUnk_080CF618 - - thumb_func_start sub_080388EC -sub_080388EC: @ 0x080388EC - push {r4, r5, r6, lr} - adds r4, r0, #0 - adds r6, r4, #0 - adds r6, #0x43 - ldrb r0, [r6] - cmp r0, #0 - beq _08038902 - adds r0, r4, #0 - movs r1, #0x1c - bl sub_0804A9FC -_08038902: - ldr r1, _08038948 @ =gUnk_080CF600 - adds r0, r4, #0 - bl sub_0804AA30 - adds r0, r4, #0 - adds r0, #0x41 - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0803897E - ldrb r0, [r4, #0xc] - cmp r0, #4 - beq _0803897E - ldr r5, [r4, #0x54] - adds r0, r4, #0 - adds r0, #0x3d - ldrb r0, [r0] - adds r1, r5, #0 - adds r1, #0x3d - strb r0, [r1] - adds r2, r4, #0 - adds r2, #0x3e - ldrb r1, [r2] - adds r0, r5, #0 - adds r0, #0x3e - strb r1, [r0] - ldrb r0, [r6] - cmp r0, #0 - beq _0803894C - ldrb r1, [r5, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r5, #0x10] - b _0803897E - .align 2, 0 -_08038948: .4byte gUnk_080CF600 -_0803894C: - ldrb r0, [r4, #0xc] - cmp r0, #1 - bne _0803897E - adds r0, r1, #0 - adds r0, #0x12 - movs r1, #0x1c - ands r0, r1 - strb r0, [r5, #0x15] - lsrs r0, r0, #2 - strb r0, [r5, #0x14] - ldrb r0, [r2] - adds r0, #0x14 - movs r1, #0x18 - ands r0, r1 - strb r0, [r4, #0x15] - lsrs r0, r0, #2 - strb r0, [r4, #0x14] - adds r0, r4, #0 - movs r1, #0 - bl sub_08038C84 - adds r0, r5, #0 - movs r1, #1 - bl sub_08038C84 -_0803897E: - pop {r4, r5, r6, pc} - - thumb_func_start nullsub_164 -nullsub_164: @ 0x08038980 - bx lr - .align 2, 0 - - thumb_func_start sub_08038984 -sub_08038984: @ 0x08038984 - push {r4, r5, r6, lr} - adds r5, r0, #0 - movs r0, #0x13 - bl CreateProjectile - adds r6, r0, #0 - cmp r6, #0 - beq _080389E6 - adds r0, r5, #0 - bl sub_0804A720 - movs r4, #0 - movs r2, #1 - movs r0, #1 - strb r0, [r5, #0xc] - ldrb r1, [r5, #0x18] - subs r0, #5 - ands r0, r1 - orrs r0, r2 - strb r0, [r5, #0x18] - ldrb r1, [r5, #0x10] - movs r0, #0x80 - orrs r0, r1 - strb r0, [r5, #0x10] - str r6, [r5, #0x54] - bl Random - movs r1, #6 - ands r0, r1 - strb r0, [r5, #0x14] - adds r0, r5, #0 - adds r0, #0x80 - movs r1, #0 - strh r4, [r0] - subs r0, #6 - strb r1, [r0] - str r5, [r6, #0x50] - strb r1, [r6, #0xa] - movs r0, #0xff - strb r0, [r6, #0x14] - adds r0, r5, #0 - adds r0, #0x38 - ldrb r1, [r0] - adds r0, r6, #0 - adds r0, #0x38 - strb r1, [r0] - adds r0, r5, #0 - bl sub_08038BA8 -_080389E6: - pop {r4, r5, r6, pc} - - thumb_func_start sub_080389E8 -sub_080389E8: @ 0x080389E8 - push {r4, r5, r6, lr} - adds r4, r0, #0 - ldr r6, [r4, #0x54] - adds r1, r4, #0 - adds r1, #0x80 - ldrh r0, [r1] - cmp r0, #0 - beq _08038A08 - subs r0, #1 - strh r0, [r1] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _08038A68 - movs r0, #0x80 - strh r0, [r4, #0x24] - b _08038A68 -_08038A08: - ldrb r0, [r4, #0xf] - subs r0, #1 - strb r0, [r4, #0xf] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08038A22 - adds r0, r4, #0 - bl sub_08038BA8 - adds r0, r6, #0 - bl sub_08038C2C - b _08038A68 -_08038A22: - ldrb r0, [r4, #0xe] - cmp r0, #0 - beq _08038A2E - subs r0, #1 - strb r0, [r4, #0xe] - b _08038A68 -_08038A2E: - ldrh r0, [r4, #0x2a] - cmp r0, #0 - beq _08038A68 - movs r0, #0xc - strb r0, [r4, #0xe] - ldrb r1, [r6, #0x14] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - bne _08038A5C - ldrb r5, [r6, #0x14] - bl Random - movs r1, #0x20 - ands r1, r0 - cmp r1, #0 - beq _08038A54 - adds r1, r5, #1 - b _08038A56 -_08038A54: - adds r1, r5, #7 -_08038A56: - movs r0, #7 - ands r0, r1 - strb r0, [r6, #0x14] -_08038A5C: - adds r0, r4, #0 - bl sub_08038BA8 - adds r0, r6, #0 - bl sub_08038C2C -_08038A68: - adds r0, r4, #0 - bl sub_08038B90 - pop {r4, r5, r6, pc} - - thumb_func_start sub_08038A70 -sub_08038A70: @ 0x08038A70 - push {r4, r5, r6, r7, lr} - adds r5, r0, #0 - ldr r6, [r5, #0x54] - adds r1, r5, #0 - adds r1, #0x80 - ldrh r0, [r1] - subs r0, #1 - strh r0, [r1] - lsls r0, r0, #0x10 - lsrs r7, r0, #0x10 - cmp r7, #0 - bne _08038AC0 - movs r1, #3 - strb r1, [r5, #0xc] - adds r2, r5, #0 - adds r2, #0x82 - movs r0, #4 - strb r0, [r2] - movs r0, #0x80 - strh r0, [r5, #0x24] - movs r4, #0x20 - strb r4, [r5, #0xf] - strb r1, [r6, #0xc] - adds r1, r6, #0 - adds r1, #0x82 - movs r0, #2 - strb r0, [r1] - movs r0, #0xff - strb r0, [r6, #0x14] - adds r0, r5, #0 - movs r1, #0 - bl sub_08038C84 - adds r0, r6, #0 - bl sub_08038C2C - strb r4, [r6, #0xf] - str r7, [r6, #0x50] - str r5, [r6, #0x54] - b _08038AFE -_08038AC0: - ldrb r0, [r5, #0xf] - subs r0, #1 - strb r0, [r5, #0xf] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08038AFE - movs r0, #0x10 - strb r0, [r5, #0xf] - adds r0, r5, #0 - movs r1, #0 - bl sub_08049F84 - strb r0, [r5, #0x15] - ldrb r0, [r5, #0x15] - adds r0, #4 - movs r1, #0x1c - ands r0, r1 - lsrs r1, r0, #2 - strb r1, [r6, #0x14] - movs r1, #0x18 - ands r0, r1 - lsrs r0, r0, #2 - strb r0, [r5, #0x14] - adds r0, r5, #0 - movs r1, #0 - bl sub_08038C84 - adds r0, r6, #0 - movs r1, #1 - bl sub_08038C84 -_08038AFE: - adds r0, r5, #0 - bl sub_08038B90 - pop {r4, r5, r6, r7, pc} - .align 2, 0 - - thumb_func_start sub_08038B08 -sub_08038B08: @ 0x08038B08 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xf] - cmp r0, #0 - beq _08038B18 - subs r0, #1 - strb r0, [r4, #0xf] - b _08038B5E -_08038B18: - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r2, #0x80 - adds r0, r2, #0 - ands r0, r1 - cmp r0, #0 - beq _08038B5E - movs r0, #4 - strb r0, [r4, #0xc] - adds r1, r4, #0 - adds r1, #0x82 - movs r0, #3 - strb r0, [r1] - movs r0, #0x32 - strb r0, [r4, #0xe] - movs r0, #2 - strb r0, [r4, #0xf] - ldrb r0, [r4, #0x14] - lsls r0, r0, #2 - adds r0, #0x10 - movs r1, #0x1f - ands r0, r1 - strb r0, [r4, #0x15] - strh r2, [r4, #0x24] - adds r0, r4, #0 - movs r1, #0 - bl sub_08038C84 - ldr r0, _08038B60 @ =0x0000015B - bl EnqueueSFX -_08038B5E: - pop {r4, pc} - .align 2, 0 -_08038B60: .4byte 0x0000015B - - thumb_func_start sub_08038B64 -sub_08038B64: @ 0x08038B64 - push {r4, lr} - adds r4, r0, #0 - bl ProcessMovement - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - ldrb r0, [r4, #0xf] - subs r0, #1 - strb r0, [r4, #0xf] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08038B8C - movs r0, #2 - strb r0, [r4, #0xf] - ldrb r0, [r4, #0x15] - adds r0, #0x1f - movs r1, #0x1f - ands r0, r1 - strb r0, [r4, #0x15] -_08038B8C: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08038B90 -sub_08038B90: @ 0x08038B90 - push {r4, lr} - adds r4, r0, #0 - bl UpdateAnimationSingleFrame - adds r0, r4, #0 - bl ProcessMovement - adds r0, r4, #0 - bl sub_0800445C - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08038BA8 -sub_08038BA8: @ 0x08038BA8 - push {r4, r5, lr} - adds r4, r0, #0 - bl Random - ldr r1, _08038BEC @ =gUnk_080CF62C - movs r5, #7 - ands r0, r5 - adds r0, r0, r1 - ldrb r0, [r0] - movs r1, #0 - strb r0, [r4, #0xf] - adds r0, r4, #0 - adds r0, #0x82 - movs r3, #1 - strb r3, [r0] - ldr r0, [r4, #0x54] - adds r0, #0x82 - strb r1, [r0] - adds r1, r4, #0 - adds r1, #0x7a - ldrb r0, [r1] - cmp r0, #0 - bne _08038BF0 - adds r0, #1 - strb r0, [r1] - ldrb r0, [r4, #0x14] - lsls r0, r0, #2 - strb r0, [r4, #0x15] - adds r0, r4, #0 - movs r1, #0 - bl sub_08038C84 - b _08038C2A - .align 2, 0 -_08038BEC: .4byte gUnk_080CF62C -_08038BF0: - ldr r2, [r4, #0x54] - ldrb r1, [r2, #0x14] - adds r0, r3, #0 - ands r0, r1 - cmp r0, #0 - beq _08038C14 - ldrb r2, [r2, #0x14] - ldrb r1, [r4, #0x14] - adds r0, r1, #1 - ands r0, r5 - movs r3, #6 - cmp r2, r0 - bne _08038C0C - movs r3, #2 -_08038C0C: - adds r3, r3, r1 - movs r0, #6 - ands r3, r0 - b _08038C18 -_08038C14: - ldrb r3, [r2, #0x14] - ldrb r1, [r4, #0x14] -_08038C18: - cmp r3, r1 - beq _08038C2A - strb r3, [r4, #0x14] - lsls r0, r3, #2 - strb r0, [r4, #0x15] - adds r0, r4, #0 - movs r1, #0 - bl sub_08038C84 -_08038C2A: - pop {r4, r5, pc} - - thumb_func_start sub_08038C2C -sub_08038C2C: @ 0x08038C2C - push {r4, r5, r6, lr} - adds r5, r0, #0 - bl Random - ldr r1, _08038C58 @ =gUnk_080CF634 - movs r6, #7 - ands r0, r6 - adds r0, r0, r1 - ldrb r0, [r0] - strb r0, [r5, #0xf] - ldr r0, [r5, #0x50] - ldrb r4, [r0, #0x14] - ldrb r0, [r5, #0x14] - cmp r0, #0xff - bne _08038C5C - strb r4, [r5, #0x14] - adds r0, r5, #0 - movs r1, #1 - bl sub_08038C84 - b _08038C7C - .align 2, 0 -_08038C58: .4byte gUnk_080CF634 -_08038C5C: - bl Random - ldr r1, _08038C80 @ =gUnk_080CF63C - ands r0, r6 - adds r0, r0, r1 - ldrb r0, [r0] - adds r4, r0, r4 - ands r4, r6 - ldrb r0, [r5, #0x14] - cmp r4, r0 - beq _08038C7C - strb r4, [r5, #0x14] - adds r0, r5, #0 - movs r1, #1 - bl sub_08038C84 -_08038C7C: - pop {r4, r5, r6, pc} - .align 2, 0 -_08038C80: .4byte gUnk_080CF63C - - thumb_func_start sub_08038C84 -sub_08038C84: @ 0x08038C84 - push {lr} - adds r3, r0, #0 - ldrb r2, [r3, #0x14] - adds r0, #0x82 - ldrb r0, [r0] - lsls r0, r0, #3 - orrs r2, r0 - cmp r1, #0 - bne _08038C98 - lsrs r2, r2, #1 -_08038C98: - adds r0, r3, #0 - adds r1, r2, #0 - bl InitAnimationForceUpdate - pop {pc} - .align 2, 0 diff --git a/assets/assets.json b/assets/assets.json index bac7cd65..7a288971 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -26582,21 +26582,6 @@ "size": 12, "type": "animation" }, - { - "path": "scissorsBeetle/gUnk_080CF62C.bin", - "start": 849452, - "size": 8 - }, - { - "path": "scissorsBeetle/gUnk_080CF634.bin", - "start": 849460, - "size": 8 - }, - { - "path": "scissorsBeetle/gUnk_080CF63C.bin", - "start": 849468, - "size": 8 - }, { "path": "animations/gSpriteAnimations_CuccoAggr_0.bin", "start": 849969, diff --git a/data/const/enemy/scissorsBeetle.s b/data/const/enemy/scissorsBeetle.s deleted file mode 100644 index 4e2777a6..00000000 --- a/data/const/enemy/scissorsBeetle.s +++ /dev/null @@ -1,29 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_080CF600:: @ 080CF600 - .4byte sub_080388D4 - .4byte sub_080388EC - .4byte sub_08001324 - .4byte sub_0804A7D4 - .4byte sub_08001242 - .4byte nullsub_164 - -gUnk_080CF618:: @ 080CF618 - .4byte sub_08038984 - .4byte sub_080389E8 - .4byte sub_08038A70 - .4byte sub_08038B08 - .4byte sub_08038B64 - -gUnk_080CF62C:: @ 080CF62C - .incbin "scissorsBeetle/gUnk_080CF62C.bin" - -gUnk_080CF634:: @ 080CF634 - .incbin "scissorsBeetle/gUnk_080CF634.bin" - -gUnk_080CF63C:: @ 080CF63C - .incbin "scissorsBeetle/gUnk_080CF63C.bin" diff --git a/linker.ld b/linker.ld index ded45e35..bc42e2d6 100644 --- a/linker.ld +++ b/linker.ld @@ -387,7 +387,7 @@ SECTIONS { src/enemy/tektiteGolden.o(.text); src/enemy/ropeGolden.o(.text); asm/enemy/cloudPiranha.o(.text); - asm/enemy/scissorsBeetle.o(.text); + src/enemy/scissorsBeetle.o(.text); src/enemy/cuccoAggr.o(.text); asm/enemy/stalfos.o(.text); src/enemy/flyingSkull.o(.text); @@ -1054,7 +1054,7 @@ SECTIONS { data/const/enemy/ropeGolden.o(.rodata); data/const/enemy/cloudPiranha.o(.rodata); data/animations/enemy/cloudPiranha.o(.rodata); - data/const/enemy/scissorsBeetle.o(.rodata); + src/enemy/scissorsBeetle.o(.rodata); data/animations/enemy/scissorsBeetle.o(.rodata); src/enemy/cuccoAggr.o(.rodata); data/animations/enemy/cuccoAggr.o(.rodata); diff --git a/src/enemy/scissorsBeetle.c b/src/enemy/scissorsBeetle.c new file mode 100644 index 00000000..bfea7718 --- /dev/null +++ b/src/enemy/scissorsBeetle.c @@ -0,0 +1,245 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "enemy.h" +#include "functions.h" + +typedef struct { + Entity base; + u8 filler[0x12]; + u8 unk_7a; + u8 filler2[5]; + u16 unk_80; + u8 unk_82; +} ScissorsBeetleEntity; + +void (*const ScissorsBeetle_Functions[])(Entity*); +void (*const ScissorsBeetle_Actions[])(ScissorsBeetleEntity*); +const u8 gUnk_080CF62C[]; +const u8 gUnk_080CF634[]; +const u8 gUnk_080CF63C[]; + +void sub_08038C84(ScissorsBeetleEntity*, u32); +void sub_08038BA8(ScissorsBeetleEntity*); +void sub_08038C2C(ScissorsBeetleEntity*); +void sub_08038B90(ScissorsBeetleEntity*); + +void ScissorsBeetle(Entity* this) { + EnemyFunctionHandler(this, ScissorsBeetle_Functions); + SetChildOffset(this, 0, 1, -0x10); +} + +void sub_080388D4(ScissorsBeetleEntity* this) { + ScissorsBeetle_Actions[super->action](this); +} + +void sub_080388EC(ScissorsBeetleEntity* this) { + Entity* child; + if (super->field_0x43) { + sub_0804A9FC(super, 0x1c); + } + + sub_0804AA30(super, ScissorsBeetle_Functions); + if ((super->bitfield & 0x80) && super->action != 4) { + u32 knockbackDir; + child = super->child; + child->iframes = super->iframes; + knockbackDir = super->knockbackDirection; + child->knockbackDirection = knockbackDir; + if (super->field_0x43) { + COLLISION_OFF(child); + } else if (super->action == 1) { + child->direction = Direction8Round(knockbackDir + 0x12); + child->animationState = Direction8ToAnimationState(child->direction); + super->direction = DirectionRound(super->knockbackDirection + 0x14); + super->animationState = Direction8ToAnimationState(super->direction); + sub_08038C84(this, 0); + sub_08038C84((ScissorsBeetleEntity*)child, 1); + } + } +} + +void nullsub_164(ScissorsBeetleEntity* this) { +} + +void ScissorsBeetle_Init(ScissorsBeetleEntity* this) { + Entity* ent = CreateProjectile(MANDIBLES_PROJECTILE); + if (!ent) + return; + + sub_0804A720(super); + super->action = 1; + super->spriteSettings.draw = 1; + COLLISION_ON(super); + super->child = ent; + super->animationState = Random() & 6; + this->unk_80 = 0; + this->unk_7a = 0; + ent->parent = super; + ent->type = 0; + ent->animationState = 0xff; + ent->collisionLayer = super->collisionLayer; + sub_08038BA8(this); +} + +void sub_080389E8(ScissorsBeetleEntity* this) { + Entity* child = super->child; + if (this->unk_80) { + if (--this->unk_80 == 0) { + super->speed = 0x80; + } + } else if (--super->field_0xf == 0) { + sub_08038BA8(this); + sub_08038C2C((ScissorsBeetleEntity*)child); + } else if (super->actionDelay) { + super->actionDelay--; + } else if (super->collisions) { + ; + super->actionDelay = 0xc; + if ((child->animationState & 1) == 0) { + child->animationState += Random() & 0x20 ? 1 : 7; + child->animationState &= 7; + } + + sub_08038BA8(this); + sub_08038C2C((ScissorsBeetleEntity*)child); + } + + sub_08038B90(this); +} + +void sub_08038A70(ScissorsBeetleEntity* this) { + Entity* child = super->child; + if (--this->unk_80 == 0) { + super->action = 3; + this->unk_82 = 4; + super->speed = 0x80; + super->field_0xf = 0x20; + child->action = 3; + ((ScissorsBeetleEntity*)child)->unk_82 = 2; + child->animationState = 0xff; + sub_08038C84(this, 0); + sub_08038C2C((ScissorsBeetleEntity*)child); + child->field_0xf = 0x20; + child->parent = NULL; + child->child = super; + } else if (--super->field_0xf == 0) { + u32 dir; + super->field_0xf = 0x10; + super->direction = sub_08049F84(super, 0); + dir = (super->direction + 4) & 0x1c; + child->animationState = dir >> 2; + super->animationState = (dir & 0x18) >> 2; + sub_08038C84(this, 0); + sub_08038C84((ScissorsBeetleEntity*)child, 1); + } + + sub_08038B90(this); +} + +void sub_08038B08(ScissorsBeetleEntity* this) { + if (super->field_0xf) { + super->field_0xf--; + return; + } + + UpdateAnimationSingleFrame(super); + if (super->frame & 0x80) { + super->action = 4; + this->unk_82 = 3; + super->actionDelay = 0x32; + super->field_0xf = 2; + super->direction = ((super->animationState << 2) + 0x10) & 0x1f; + super->speed = 0x80; + sub_08038C84(this, 0); + EnqueueSFX(SFX_15B); + } +} + +void sub_08038B64(ScissorsBeetleEntity* this) { + ProcessMovement(super); + UpdateAnimationSingleFrame(super); + if (--super->field_0xf == 0) { + super->field_0xf = 2; + super->direction = DirectionNormalize(super->direction + 0x1f); + } +} + +void sub_08038B90(ScissorsBeetleEntity* this) { + UpdateAnimationSingleFrame(super); + ProcessMovement(super); + sub_0800445C(super); +} + +void sub_08038BA8(ScissorsBeetleEntity* this) { + Entity* child; + u32 r3; + u32 animationState; + super->field_0xf = gUnk_080CF62C[Random() & 7]; + this->unk_82 = 1; + ((ScissorsBeetleEntity*)super->child)->unk_82 = 0; + + if (this->unk_7a == 0) { + this->unk_7a++; + super->direction = Direction8FromAnimationState(super->animationState); + sub_08038C84(this, 0); + return; + } + + child = super->child; + if (child->animationState & 1) { + if (child->animationState == ((super->animationState + 1) & 7)) { + r3 = 2; + } else { + r3 = 6; + } + + r3 = (r3 + super->animationState) & 6; + } else { + r3 = child->animationState; + } + + if (r3 != super->animationState) { + super->animationState = r3; + super->direction = Direction8FromAnimationState(r3); + sub_08038C84(this, 0); + } +} + +void sub_08038C2C(ScissorsBeetleEntity* this) { + u32 parentAnimState; + super->field_0xf = gUnk_080CF634[Random() & 7]; + parentAnimState = super->parent->animationState; + if (super->animationState == 0xff) { + super->animationState = parentAnimState; + sub_08038C84(this, 1); + return; + } + + parentAnimState = (gUnk_080CF63C[Random() & 7] + parentAnimState) & 7; + if (parentAnimState != super->animationState) { + super->animationState = parentAnimState; + sub_08038C84(this, 1); + } +} + +void sub_08038C84(ScissorsBeetleEntity* this, u32 arg2) { + u32 animationState = super->animationState | (this->unk_82 << 3); + if (arg2 == 0) { + animationState >>= 1; + } + + InitAnimationForceUpdate(super, animationState); +} + +void (*const ScissorsBeetle_Functions[])(Entity*) = { + (EntityActionPtr)sub_080388D4, (EntityActionPtr)sub_080388EC, sub_08001324, sub_0804A7D4, sub_08001242, + (EntityActionPtr)nullsub_164, +}; + +void (*const ScissorsBeetle_Actions[])(ScissorsBeetleEntity*) = { + ScissorsBeetle_Init, sub_080389E8, sub_08038A70, sub_08038B08, sub_08038B64, +}; + +const u8 gUnk_080CF62C[] = { 0x2d, 0x5a, 0x3c, 0x2d, 0x5a, 0x4b, 0x3c, 0x5a }; +const u8 gUnk_080CF634[] = { 0x18, 0x24, 0x34, 0x20, 0x3c, 0x1c, 0x2c, 0x28 }; +const u8 gUnk_080CF63C[] = { 1, 0, 7, 1, 0, 7, 0, 0 };