From 0c02643ef4ecd01c390e4867a0ac8fa8596bb349 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 9 Jan 2022 01:57:53 +0200 Subject: [PATCH] Decompile octorokGolden --- asm/enemy/octorokGolden.s | 337 -------------------------------------- linker.ld | 2 +- src/enemy/octorokGolden.c | 146 +++++++++++++++++ 3 files changed, 147 insertions(+), 338 deletions(-) delete mode 100644 asm/enemy/octorokGolden.s create mode 100644 src/enemy/octorokGolden.c diff --git a/asm/enemy/octorokGolden.s b/asm/enemy/octorokGolden.s deleted file mode 100644 index 35b51f7e..00000000 --- a/asm/enemy/octorokGolden.s +++ /dev/null @@ -1,337 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start OctorokGolden -OctorokGolden: @ 0x08037C3C - push {r4, r5, lr} - adds r5, r0, #0 - bl sub_080012DC - cmp r0, #0 - beq _08037C5C - ldr r0, _08037C58 @ =gUnk_080012C8 - lsls r1, r4, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r5, #0 - bl _call_via_r1 - b _08037C7E - .align 2, 0 -_08037C58: .4byte gUnk_080012C8 -_08037C5C: - ldr r4, _08037C80 @ =gUnk_080CF46C - adds r0, r5, #0 - bl GetNextFunction - lsls r0, r0, #2 - adds r0, r0, r4 - ldr r1, [r0] - adds r0, r5, #0 - bl _call_via_r1 - movs r3, #0x10 - rsbs r3, r3, #0 - adds r0, r5, #0 - movs r1, #0 - movs r2, #1 - bl SetChildOffset -_08037C7E: - pop {r4, r5, pc} - .align 2, 0 -_08037C80: .4byte gUnk_080CF46C - - thumb_func_start sub_08037C84 -sub_08037C84: @ 0x08037C84 - push {lr} - ldr r2, _08037C98 @ =gUnk_080CF484 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08037C98: .4byte gUnk_080CF484 - - thumb_func_start sub_08037C9C -sub_08037C9C: @ 0x08037C9C - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x43 - ldrb r0, [r0] - cmp r0, #0 - beq _08037CB0 - adds r0, r4, #0 - movs r1, #0x1c - bl sub_0804A9FC -_08037CB0: - ldr r1, _08037CBC @ =gUnk_080CF46C - adds r0, r4, #0 - bl sub_0804AA30 - pop {r4, pc} - .align 2, 0 -_08037CBC: .4byte gUnk_080CF46C - - thumb_func_start sub_08037CC0 -sub_08037CC0: @ 0x08037CC0 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x3a - ldrb r1, [r0] - movs r0, #2 - ands r0, r1 - cmp r0, #0 - bne _08037CD6 - ldrb r0, [r4, #0xb] - bl SetGlobalFlag -_08037CD6: - adds r0, r4, #0 - movs r1, #0xff - movs r2, #0x58 - bl CreateDeathFx - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08037CE4 -sub_08037CE4: @ 0x08037CE4 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xb] - bl CheckGlobalFlag - cmp r0, #0 - beq _08037CF6 - bl DeleteThisEntity -_08037CF6: - adds r0, r4, #0 - bl sub_0804A720 - movs r0, #1 - strb r0, [r4, #0xc] - movs r0, #0xff - strb r0, [r4, #0x14] - adds r0, r4, #0 - bl sub_08037E14 - pop {r4, pc} - - thumb_func_start sub_08037D0C -sub_08037D0C: @ 0x08037D0C - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xf] - cmp r0, #0 - beq _08037D1C - subs r0, #1 - strb r0, [r4, #0xf] - b _08037D26 -_08037D1C: - adds r0, r4, #0 - bl sub_08037E90 - cmp r0, #0 - bne _08037D52 -_08037D26: - adds r0, r4, #0 - movs r1, #2 - bl UpdateAnimationVariableFrames - adds r0, r4, #0 - bl ProcessMovement - cmp r0, #0 - bne _08037D40 - adds r0, r4, #0 - bl sub_08037E14 - b _08037D52 -_08037D40: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08037D52 - adds r0, r4, #0 - bl sub_08037E14 -_08037D52: - pop {r4, pc} - - thumb_func_start sub_08037D54 -sub_08037D54: @ 0x08037D54 - push {r4, lr} - adds r4, r0, #0 - movs r1, #2 - bl UpdateAnimationVariableFrames - adds r2, r4, #0 - adds r2, #0x5a - ldrb r1, [r2] - movs r3, #1 - adds r0, r3, #0 - ands r0, r1 - cmp r0, #0 - beq _08037DC4 - movs r0, #2 - eors r0, r1 - strb r0, [r2] - movs r1, #2 - ands r0, r1 - cmp r0, #0 - beq _08037E0C - adds r0, r4, #0 - movs r1, #1 - movs r2, #0 - bl CreateProjectileWithParent - adds r2, r0, #0 - cmp r2, #0 - beq _08037E0C - ldrb r0, [r4, #0x15] - strb r0, [r2, #0x15] - ldrb r1, [r4, #0x15] - lsrs r1, r1, #2 - ldr r0, _08037DBC @ =gUnk_080CF490 - adds r1, r1, r0 - movs r0, #0 - ldrsb r0, [r1, r0] - ldrh r3, [r2, #0x2e] - adds r0, r0, r3 - strh r0, [r2, #0x2e] - movs r0, #1 - ldrsb r0, [r1, r0] - ldrh r1, [r2, #0x32] - adds r0, r0, r1 - strh r0, [r2, #0x32] - ldr r0, _08037DC0 @ =0x0000FFFD - strh r0, [r2, #0x36] - movs r0, #0x92 - lsls r0, r0, #1 - bl EnqueueSFX - b _08037E0C - .align 2, 0 -_08037DBC: .4byte gUnk_080CF490 -_08037DC0: .4byte 0x0000FFFD -_08037DC4: - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08037E0C - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - movs r1, #0xff - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08037DEE - strb r3, [r4, #0xc] - movs r0, #0x3c - strb r0, [r4, #0xf] - ldrb r0, [r4, #0x14] - orrs r0, r1 - strb r0, [r4, #0x14] - adds r0, r4, #0 - bl sub_08037E14 - b _08037E0C -_08037DEE: - ldr r1, _08037E10 @ =gPlayerEntity - adds r0, r4, #0 - bl GetFacingDirection - adds r0, #4 - movs r1, #0x18 - ands r0, r1 - strb r0, [r4, #0x15] - lsrs r0, r0, #3 - strb r0, [r4, #0x14] - ldrb r1, [r4, #0x14] - adds r1, #4 - adds r0, r4, #0 - bl InitializeAnimation -_08037E0C: - pop {r4, pc} - .align 2, 0 -_08037E10: .4byte gPlayerEntity - - thumb_func_start sub_08037E14 -sub_08037E14: @ 0x08037E14 - push {r4, r5, r6, lr} - adds r5, r0, #0 - movs r0, #8 - strb r0, [r5, #0xe] - ldr r1, _08037E6C @ =gPlayerEntity - adds r0, r5, #0 - bl GetFacingDirection - adds r4, r0, #4 - movs r0, #0x18 - ands r4, r0 - adds r0, r5, #0 - adds r0, #0x38 - ldrb r0, [r0] - bl GetLayerByIndex - ldr r1, _08037E70 @ =0x00002004 - adds r0, r0, r1 - lsrs r3, r4, #2 - ldr r1, _08037E74 @ =gUnk_080CF498 - adds r3, r3, r1 - movs r2, #0x2e - ldrsh r1, [r5, r2] - movs r2, #0 - ldrsb r2, [r3, r2] - adds r1, r1, r2 - movs r6, #0x32 - ldrsh r2, [r5, r6] - ldrb r3, [r3, #1] - lsls r3, r3, #0x18 - asrs r3, r3, #0x18 - adds r2, r2, r3 - movs r3, #0 - bl sub_080AE4CC - cmp r0, #0 - beq _08037E78 - bl Random - movs r1, #0x18 - ands r0, r1 - strb r0, [r5, #0x15] - b _08037E7A - .align 2, 0 -_08037E6C: .4byte gPlayerEntity -_08037E70: .4byte 0x00002004 -_08037E74: .4byte gUnk_080CF498 -_08037E78: - strb r4, [r5, #0x15] -_08037E7A: - ldrb r0, [r5, #0x15] - lsrs r4, r0, #3 - ldrb r0, [r5, #0x14] - cmp r4, r0 - beq _08037E8E - strb r4, [r5, #0x14] - adds r0, r5, #0 - adds r1, r4, #0 - bl InitializeAnimation -_08037E8E: - pop {r4, r5, r6, pc} - - thumb_func_start sub_08037E90 -sub_08037E90: @ 0x08037E90 - push {r4, lr} - adds r4, r0, #0 - ldr r1, _08037EA8 @ =gPlayerEntity - movs r2, #8 - bl sub_0804A044 - adds r1, r0, #0 - cmp r1, #0xff - bne _08037EAC - movs r0, #0 - b _08037EC6 - .align 2, 0 -_08037EA8: .4byte gPlayerEntity -_08037EAC: - movs r0, #2 - strb r0, [r4, #0xc] - movs r0, #3 - strb r0, [r4, #0xe] - strb r1, [r4, #0x15] - lsrs r0, r1, #3 - strb r0, [r4, #0x14] - ldrb r1, [r4, #0x14] - adds r1, #4 - adds r0, r4, #0 - bl InitializeAnimation - movs r0, #1 -_08037EC6: - pop {r4, pc} diff --git a/linker.ld b/linker.ld index 7f8c90dd..3693370c 100644 --- a/linker.ld +++ b/linker.ld @@ -381,7 +381,7 @@ SECTIONS { src/enemy/octorokBoss.o(.text); asm/enemy/flyingPot.o(.text); src/enemy/gibdo.o(.text); - asm/enemy/octorokGolden.o(.text); + src/enemy/octorokGolden.o(.text); src/enemy/tektiteGolden.o(.text); src/enemy/ropeGolden.o(.text); asm/enemy/cloudPiranha.o(.text); diff --git a/src/enemy/octorokGolden.c b/src/enemy/octorokGolden.c new file mode 100644 index 00000000..c98817c4 --- /dev/null +++ b/src/enemy/octorokGolden.c @@ -0,0 +1,146 @@ +#include "entity.h" +#include "enemy.h" +#include "functions.h" + +extern void (*const gUnk_080012C8[])(Entity*); +extern void (*const gUnk_080CF46C[])(Entity*); +extern void (*const gUnk_080CF484[])(Entity*); +extern s8 gUnk_080CF490[]; +extern u8 gUnk_080CF498[]; + +extern u16* GetLayerByIndex(u32); +extern s32 sub_080012DC(Entity*); +extern bool32 sub_080AE4CC(Entity*, u32, u32, u32); +extern u32 sub_0804A044(Entity*, Entity*, u32); + +void sub_08037E14(Entity* this); +bool32 sub_08037E90(Entity* this); + +void OctorokGolden(Entity* this) { + u32 index; + if (sub_080012DC(this)) { + //! @bug index (r4) is uninitialized + gUnk_080012C8[index](this); + } else { + gUnk_080CF46C[GetNextFunction(this)](this); + SetChildOffset(this, 0, 1, -0x10); + } +} + +void sub_08037C84(Entity* this) { + gUnk_080CF484[this->action](this); +} + +void sub_08037C9C(Entity* this) { + if (this->field_0x43 != 0) { + sub_0804A9FC(this, 0x1c); + } + + sub_0804AA30(this, gUnk_080CF46C); +} + +void sub_08037CC0(Entity* this) { + if ((this->field_0x3a & 0x2) == 0) { + SetGlobalFlag(this->type2); + } + + CreateDeathFx(this, 0xff, 0x58); +} + +void sub_08037CE4(Entity* this) { + if (CheckGlobalFlag(this->type2)) { + DeleteThisEntity(); + } + + sub_0804A720(this); + this->action = 1; + this->animationState = 0xff; + sub_08037E14(this); +} + +void sub_08037D0C(Entity* this) { + if (this->field_0xf) { + this->field_0xf--; + } else if (sub_08037E90(this)) { + return; + } + + UpdateAnimationVariableFrames(this, 2); + if (ProcessMovement(this) == 0) { + sub_08037E14(this); + } else if (--this->actionDelay == 0) { + sub_08037E14(this); + } +} + +void sub_08037D54(Entity* this) { + UpdateAnimationVariableFrames(this, 2); + + if (this->frame & 0x1) { + this->frame ^= 2; + + if (this->frame & 0x2) { + Entity* proj = CreateProjectileWithParent(this, 1, 0); + if (proj) { + s8* ptr; + s32 dir; + proj->direction = this->direction; + ptr = gUnk_080CF490 + (this->direction >> 2); + proj->x.HALF.HI += *ptr; + proj->y.HALF.HI += *(ptr + 1); + proj->z.HALF.HI = 0xfffd; + EnqueueSFX(SFX_124); + } + } + } else if (this->frame & 0x80) { + if (--this->actionDelay == 0) { + this->action = 1; + this->field_0xf = 0x3c; + this->animationState |= 0xff; + sub_08037E14(this); + } else { + u32 dir = GetFacingDirection(this, &gPlayerEntity); + this->direction = (dir + 4) & 0x18; + this->animationState = this->direction >> 3; + InitializeAnimation(this, this->animationState + 4); + } + } +} + +void sub_08037E14(Entity* this) { + u32 dir; + u16* pLayer; + s8* ptr; + s32 x, y; + this->actionDelay = 0x8; + dir = (GetFacingDirection(this, &gPlayerEntity) + 4) & 0x18; + pLayer = GetLayerByIndex(this->collisionLayer) + 0x1002; + ptr = gUnk_080CF498 + (dir >> 2); + x = this->x.HALF.HI + *ptr; + y = this->y.HALF.HI + *(ptr + 1); + if (sub_080AE4CC((Entity*)pLayer, x, y, 0)) { + this->direction = Random() & 0x18; + } else { + this->direction = dir; + } + + dir = this->direction >> 3; + if ((dir) != this->animationState) { + this->animationState = dir; + InitializeAnimation(this, dir); + } +} + +bool32 sub_08037E90(Entity* this) { + u32 dir = sub_0804A044(this, &gPlayerEntity, 8); + if (dir != 0xff) { + this->action = 2; + this->actionDelay = 3; + this->direction = dir; + this->animationState = dir >> 3; + InitializeAnimation(this, this->animationState + 4); + return 1; + } + + return 0; +}