From 1cbdcf5a36f09f569e2a0925e050d1a065ff58a9 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Wed, 5 Aug 2020 17:46:53 -0500 Subject: [PATCH] Finish decompiling object49.c --- asm/object49.s | 377 ------------------------------------ include/functions.h | 4 +- include/structures.h | 4 +- linker.ld | 1 - src/enemy/lakitu.c | 8 +- src/enemy/miniFireballGuy.c | 8 +- src/npc/postman.c | 2 +- src/npc/zelda.c | 3 +- src/object/object49.c | 167 ++++++++++++++-- 9 files changed, 165 insertions(+), 409 deletions(-) delete mode 100644 asm/object49.s diff --git a/asm/object49.s b/asm/object49.s deleted file mode 100644 index 968070dd..00000000 --- a/asm/object49.s +++ /dev/null @@ -1,377 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_0808F370 -sub_0808F370: @ 0x0808F370 - push {r4, lr} - adds r4, r0, #0 - ldrb r1, [r4, #0xc] - cmp r1, #0 - bne _0808F388 - ldr r0, [r4, #0x50] - ldrb r0, [r0, #0xd] - cmp r0, #1 - bne _0808F3DA - strb r0, [r4, #0xc] - str r1, [r4, #0x70] - b _0808F3CC -_0808F388: - ldr r0, [r4, #0x50] - ldrb r0, [r0, #0xd] - subs r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #4 - bhi _0808F3D4 - ldr r0, [r4, #0x70] - cmp r0, #0 - bne _0808F3C4 - ldr r0, [r4, #0x74] - subs r0, #1 - str r0, [r4, #0x74] - movs r1, #1 - rsbs r1, r1, #0 - cmp r0, r1 - bne _0808F3DA - bl Random - ldr r2, _0808F3C0 @ =gUnk_08121EA0 - movs r1, #1 - ands r1, r0 - lsls r1, r1, #1 - adds r1, r1, r2 - ldrh r0, [r1] - str r0, [r4, #0x70] - b _0808F3DA - .align 2, 0 -_0808F3C0: .4byte gUnk_08121EA0 -_0808F3C4: - subs r0, #1 - str r0, [r4, #0x70] - cmp r0, #0 - bne _0808F3DA -_0808F3CC: - adds r0, r4, #0 - bl sub_0808F5EC - b _0808F3DA -_0808F3D4: - movs r0, #0 - strb r0, [r4, #0xc] - str r0, [r4, #0x74] -_0808F3DA: - pop {r4, pc} - - thumb_func_start sub_0808F3DC -sub_0808F3DC: @ 0x0808F3DC - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _0808F438 - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - movs r0, #1 - strb r0, [r4, #0xc] - movs r0, #0x78 - strb r0, [r4, #0xe] - ldrb r1, [r4, #0xa] - adds r1, #1 - adds r0, r4, #0 - bl InitializeAnimation - ldrb r0, [r4, #0xa] - cmp r0, #8 - beq _0808F41A - cmp r0, #7 - bne _0808F42E - ldr r0, [r4, #0x54] - adds r1, r4, #0 - bl sub_0806FAD8 - b _0808F494 -_0808F41A: - ldr r0, [r4, #0x54] - adds r0, #0x3f - ldrb r0, [r0] - adds r1, r4, #0 - adds r1, #0x3f - strb r0, [r1] - ldr r0, [r4, #0x54] - adds r0, #0x3f - movs r1, #0x7e - strb r1, [r0] -_0808F42E: - ldr r0, [r4, #0x54] - adds r1, r4, #0 - bl ResolveEntityOnTop - b _0808F494 -_0808F438: - ldr r0, [r4, #0x50] - ldr r0, [r0, #0x74] - cmp r0, #0 - bne _0808F456 - ldrb r0, [r4, #0xa] - cmp r0, #8 - bne _0808F452 - ldr r0, [r4, #0x54] - adds r1, r4, #0 - adds r1, #0x3f - ldrb r1, [r1] - adds r0, #0x3f - strb r1, [r0] -_0808F452: - bl DeleteThisEntity -_0808F456: - ldrb r0, [r4, #0xa] - cmp r0, #5 - bne _0808F486 - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _0808F486 - ldr r0, [r4, #0x54] - movs r1, #0x49 - movs r2, #8 - movs r3, #0 - bl CreateObjectWithParent - adds r1, r0, #0 - cmp r1, #0 - beq _0808F486 - ldr r0, [r4, #0x50] - str r0, [r1, #0x50] - ldr r0, [r4, #0x50] - ldr r0, [r0, #0x50] - str r0, [r1, #0x54] -_0808F486: - adds r0, r4, #0 - bl GetNextFrame - ldr r0, [r4, #0x54] - adds r1, r4, #0 - bl CopyPositionAndSpriteOffset -_0808F494: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0808F498 -sub_0808F498: @ 0x0808F498 - push {r4, r5, r6, lr} - adds r5, r0, #0 - ldrb r0, [r5, #0xc] - cmp r0, #0 - beq _0808F4EC - adds r0, r5, #0 - bl sub_0806F3E4 - cmp r0, #0 - beq _0808F4C2 - ldr r0, _0808F4E4 @ =gScreenTransition - ldr r0, [r0] - movs r1, #0xf - ands r0, r1 - cmp r0, #0 - bne _0808F4BE - movs r0, #0xef - bl PlaySFX -_0808F4BE: - bl DeleteThisEntity -_0808F4C2: - ldrb r0, [r5, #0xe] - subs r0, #1 - strb r0, [r5, #0xe] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0xff - bne _0808F4D4 - bl DeleteThisEntity -_0808F4D4: - ldr r0, _0808F4E8 @ =gLinkState - ldrb r0, [r0, #0x1c] - cmp r0, #1 - beq _0808F550 - bl DeleteThisEntity - b _0808F550 - .align 2, 0 -_0808F4E4: .4byte gScreenTransition -_0808F4E8: .4byte gLinkState -_0808F4EC: - movs r0, #1 - strb r0, [r5, #0xc] - movs r0, #0x40 - strb r0, [r5, #0xe] - ldrb r0, [r5, #0xb] - movs r6, #0x2b - cmp r0, #0 - beq _0808F4FE - movs r6, #0x2c -_0808F4FE: - ldr r0, [r5, #0x50] - ldr r0, [r0, #0x48] - ldrb r1, [r0, #6] - ldrh r0, [r5, #0x2e] - subs r0, r0, r1 - strh r0, [r5, #0x2e] - bl Random - ldr r4, [r5, #0x50] - ldr r1, [r4, #0x48] - ldrb r1, [r1, #6] - lsls r1, r1, #1 - bl __modsi3 - ldrh r1, [r5, #0x2e] - adds r1, r1, r0 - strh r1, [r5, #0x2e] - ldr r0, [r4, #0x48] - ldrb r1, [r0, #7] - ldrh r0, [r5, #0x32] - subs r0, r0, r1 - strh r0, [r5, #0x32] - bl Random - ldr r1, [r5, #0x50] - ldr r1, [r1, #0x48] - ldrb r1, [r1, #7] - lsls r1, r1, #1 - bl __modsi3 - ldrh r1, [r5, #0x32] - adds r1, r1, r0 - strh r1, [r5, #0x32] - adds r0, r5, #0 - adds r1, r6, #0 - bl sub_0801D2B4 - adds r0, r5, #0 - movs r1, #4 - bl InitializeAnimation -_0808F550: - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_0808F554 -sub_0808F554: @ 0x0808F554 - push {r4, r5, lr} - adds r5, r0, #0 - ldr r0, [r5, #0x50] - adds r1, r5, #0 - bl CopyPositionAndSpriteOffset - adds r1, r5, #0 - adds r1, #0x63 - ldrb r0, [r1] - subs r0, #0x18 - strb r0, [r1] - ldr r0, [r5, #0x50] - adds r1, r0, #0 - adds r1, #0x62 - movs r0, #0 - ldrsb r0, [r1, r0] - cmp r0, #0 - beq _0808F588 - adds r2, r5, #0 - adds r2, #0x62 - lsrs r1, r0, #0x1f - adds r0, r0, r1 - asrs r0, r0, #1 - ldrb r1, [r2] - adds r0, r0, r1 - strb r0, [r2] -_0808F588: - ldrb r0, [r5, #0xc] - cmp r0, #0 - beq _0808F5AC - adds r1, r5, #0 - adds r1, #0x84 - ldr r0, [r1] - cmp r0, #0 - beq _0808F5A4 - subs r0, #1 - str r0, [r1] - cmp r0, #0 - bne _0808F5A4 - bl DeleteThisEntity -_0808F5A4: - adds r0, r5, #0 - bl GetNextFrame - b _0808F5E8 -_0808F5AC: - movs r0, #1 - strb r0, [r5, #0xc] - ldr r4, [r5, #0x50] - ldrb r2, [r4, #0x19] - lsrs r2, r2, #6 - lsls r2, r2, #6 - ldrb r3, [r5, #0x19] - movs r1, #0x3f - adds r0, r1, #0 - ands r0, r3 - orrs r0, r2 - strb r0, [r5, #0x19] - ldrb r0, [r4, #0x1b] - lsrs r0, r0, #6 - lsls r0, r0, #6 - ldrb r2, [r5, #0x1b] - ands r1, r2 - orrs r1, r0 - strb r1, [r5, #0x1b] - adds r2, r5, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r2] - adds r0, r5, #0 - movs r1, #3 - bl InitializeAnimation -_0808F5E8: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_0808F5EC -sub_0808F5EC: @ 0x0808F5EC - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #0x54] - movs r1, #0x49 - movs r2, #5 - movs r3, #0 - bl CreateObjectWithParent - adds r1, r0, #0 - cmp r1, #0 - beq _0808F608 - str r4, [r1, #0x50] - ldr r0, [r4, #0x54] - str r0, [r1, #0x54] -_0808F608: - ldr r0, [r4, #0x54] - movs r1, #0x49 - movs r2, #6 - movs r3, #0 - bl CreateObjectWithParent - adds r1, r0, #0 - cmp r1, #0 - beq _0808F620 - str r4, [r1, #0x50] - ldr r0, [r4, #0x54] - str r0, [r1, #0x54] -_0808F620: - ldr r0, [r4, #0x54] - movs r1, #0x49 - movs r2, #7 - movs r3, #0 - bl CreateObjectWithParent - adds r1, r0, #0 - cmp r1, #0 - beq _0808F638 - str r4, [r1, #0x50] - ldr r0, [r4, #0x54] - str r0, [r1, #0x54] -_0808F638: - movs r0, #0x96 - lsls r0, r0, #2 - str r0, [r4, #0x74] - pop {r4, pc} diff --git a/include/functions.h b/include/functions.h index acf20f1f..9796376b 100644 --- a/include/functions.h +++ b/include/functions.h @@ -57,7 +57,7 @@ extern void sub_080791D0(); extern void sub_0805EC9C(); extern void sub_0805EC60(); extern void sub_080873D0(); -extern void sub_080045D4(); +extern u8 sub_080045D4(s16, s16, u16, u16); extern void sub_0806F69C(); extern void sub_0805E3A0(Entity*, u32); extern void sub_0806D0B0(Entity*); @@ -191,7 +191,7 @@ extern void sub_0801E738(u32); extern void sub_080A70AC(void*); extern void sub_080A7114(u32); extern void sub_08001242(void); -extern void sub_08003FC4(Entity*, u32); +extern u32 sub_08003FC4(Entity*, u32); extern u8 sub_080043E8(Entity*); extern void sub_08001290(Entity*, u32); extern void sub_08004488(u32); diff --git a/include/structures.h b/include/structures.h index ff29f0da..69e6e65a 100644 --- a/include/structures.h +++ b/include/structures.h @@ -43,8 +43,8 @@ typedef struct { extern struct_02002A40 gUnk_02002A40; typedef struct { - u16 frameCount; // regular frame count? does anything reset it? - u8 field_0x2[6]; + u32 frameCount; // regular frame count? does anything reset it? + u8 field_0x4[0x4]; bool8 transitioningOut; u8 transitionType; // transition when changing areas u8 field_0xa; // seems to be a tile type diff --git a/linker.ld b/linker.ld index d0de7636..2b36cabf 100644 --- a/linker.ld +++ b/linker.ld @@ -748,7 +748,6 @@ SECTIONS { src/object/heartContainer.o(.text); src/object/object48.o(.text); src/object/object49.o(.text); - asm/object49.o(.text); asm/backgroundCloud.o(.text); asm/object4B.o(.text); asm/pushableFurniture.o(.text); diff --git a/src/enemy/lakitu.c b/src/enemy/lakitu.c index 146523f0..94dbd2f4 100644 --- a/src/enemy/lakitu.c +++ b/src/enemy/lakitu.c @@ -1,12 +1,12 @@ #include "global.h" #include "entity.h" +#include "functions.h" #include "trig.h" #include "random.h" #include "link.h" // Lakitu extern void EnemyFunctionHandler(Entity *, void (*const funcs[])(Entity*)); -extern void SetChildOffset(Entity *, u32, u32, u32); // sub_0803C758 extern void sub_0803CAD0(Entity *); @@ -41,7 +41,6 @@ extern void sub_0803CB64(Entity *); extern void sub_0803CB34(Entity *); // sub_0803CA0C -extern u32 sub_08003FC4(Entity *, u32); extern void sub_0803CC08(Entity *this); // sub_0803CA4C @@ -51,12 +50,7 @@ extern u32 sub_080041A0(Entity *, Entity *, u32, u32); // sub_0803CA84 extern u32 GetFacingDirection(Entity *, Entity *); -// sub_0803CAD0 -extern u8 sub_080045D4(s16, s16, u16, u16); -extern void sub_080AEFE0(Entity *); - // sub_0803CB64 -extern void PositionRelative(Entity *, Entity *, u32, u32); extern void sub_08004488(u32); typedef struct { diff --git a/src/enemy/miniFireballGuy.c b/src/enemy/miniFireballGuy.c index 820381c4..a4c169d7 100644 --- a/src/enemy/miniFireballGuy.c +++ b/src/enemy/miniFireballGuy.c @@ -1,13 +1,11 @@ #include "global.h" #include "entity.h" +#include "functions.h" extern void EnemyFunctionHandler(Entity*, void (*const func[])(Entity*)); -extern void sub_0804AA30(Entity*, void (*const func[][])(Entity*)); extern void sub_0804A7D4(Entity*); extern void sub_0804A720(Entity*); extern void sub_08045678(Entity*); -extern void sub_080AEFE0(void); -extern u32 sub_08003FC4(Entity*, u32); extern void sub_08045678(Entity*); extern void (*const gUnk_080D1868[])(Entity*); @@ -25,7 +23,7 @@ void sub_080455BC(Entity *this) void sub_080455D4(Entity *this) { - sub_0804AA30(this, &gUnk_080D1868); + sub_0804AA30(this, gUnk_080D1868); } void sub_080455E4(Entity *this) @@ -53,7 +51,7 @@ void sub_08045618(Entity *this) void sub_08045654(Entity *this) { - sub_080AEFE0(); + sub_080AEFE0(this); GetNextFrame(this); if (sub_08003FC4(this, 0x1800) == 0) { sub_08045678(this); diff --git a/src/npc/postman.c b/src/npc/postman.c index 6df8f21b..d920cba8 100644 --- a/src/npc/postman.c +++ b/src/npc/postman.c @@ -1,5 +1,6 @@ #include "global.h" #include "entity.h" +#include "functions.h" #include "npc.h" #include "textbox.h" #include "link.h" @@ -28,7 +29,6 @@ extern void sub_080606D8(Entity*); extern void sub_0807DD94(Entity*, u32); extern void sub_080788E0(Entity*); extern void sub_08004488(u32); -extern void sub_08003FC4(Entity*, u32); extern void sub_080606C0(Entity*); extern void sub_0800451C(Entity*); extern void sub_08078784(Entity*, u32); diff --git a/src/npc/zelda.c b/src/npc/zelda.c index 087e8fe8..43a8e36f 100644 --- a/src/npc/zelda.c +++ b/src/npc/zelda.c @@ -1,5 +1,6 @@ #include "global.h" #include "entity.h" +#include "functions.h" #include "room.h" #include "flags.h" @@ -16,10 +17,8 @@ void DeleteThisEntity(void); extern Entity* GetEntityByType(u32, u32); extern void sub_080686C4(Entity*, Entity*); extern void sub_0806F62C(Entity*, u32, u32); -extern u32 sub_08003FC4(Entity*, u32); extern void PlaySFX(u32); extern void SetTileType(u32, u32, u32); -extern void sub_0807BA8C(u16, u32); extern Entity gLinkEntity; extern RoomControls gRoomControls; diff --git a/src/object/object49.c b/src/object/object49.c index a586e520..925e47ea 100644 --- a/src/object/object49.c +++ b/src/object/object49.c @@ -1,19 +1,22 @@ #include "global.h" #include "entity.h" +#include "functions.h" +#include "position.h" +#include "random.h" +#include "structures.h" + +static void sub_0808F2B0(Entity*); +static void sub_0808F14C(Entity*); +static void sub_0808F244(Entity*); -extern u32 Random(void); -extern void sub_0808F2B0(Entity*); -extern u32 sub_08003FC4(Entity*, u32); -void sub_0808F14C(Entity*); -extern void PlaySFX(u32); extern void sub_0806FCF4(Entity*, u32, u32, u32); -extern void sub_0808F244(Entity*); -extern void sub_0805EC9C(Entity*, u32, u32, u32); +extern void sub_0808F5EC(Entity*); +extern bool32 sub_0806F3E4(Entity *); extern void (*const gUnk_08121E5C[])(Entity*); extern void (*const gUnk_08121E88[])(Entity*); extern void (*const gUnk_08121E98[])(Entity*); - +extern const u16 gUnk_08121EA0[]; void Object49(Entity* this) { gUnk_08121E5C[this->entityType.form](this); @@ -52,7 +55,7 @@ void sub_0808F0D0(Entity* this) { sub_0808F14C(this); } -void sub_0808F14C(Entity* this) { +static void sub_0808F14C(Entity* this) { sub_0808F2B0(this); if (sub_08003FC4(this, 0x2000) == 0) { this->action++; @@ -103,7 +106,7 @@ void sub_0808F1F8(Entity *this) sub_0808F244(this); } -void sub_0808F244(Entity *this) +static void sub_0808F244(Entity *this) { this->spriteSettings.b.draw = this->parent->spriteSettings.b.draw; @@ -119,7 +122,7 @@ void sub_0808F244(Entity *this) } } -void sub_0808F2B0(Entity *this) +static void sub_0808F2B0(Entity *this) { sub_0805EC9C(this, *(u32 *)&this->field_0x74, *(u32 *)&this->field_0x78, this->field_0x70.WORD); } @@ -152,4 +155,144 @@ void sub_0808F2C0(Entity *this) if (this->action == 0xff) { DeleteThisEntity(); } -} \ No newline at end of file +} + +void sub_0808F370(Entity* this) { + if (this->action == 0) { + if (this->parent->previousActionFlag == 1) { + this->action = 1; + this->field_0x70.WORD = 0; + sub_0808F5EC(this); + } + } else { + u8 flag = this->parent->previousActionFlag - 1; + if (flag < 5) { + if (this->field_0x70.WORD == 0) { + if (--(*(u32 *)&this->field_0x74) == -1) { + this->field_0x70.WORD = gUnk_08121EA0[Random() & 1]; + } + } else { + if (--this->field_0x70.WORD == 0) { + sub_0808F5EC(this); + } + } + } else { + this->action = 0; + *(u32 *)&this->field_0x74 = 0; + } + } +} + +void sub_0808F3DC(Entity* this) { + if (this->action == 0) { + this->spriteSettings.b.draw = 1; + this->action = 1; + this->actionDelay = 120; + InitializeAnimation(this, this->entityType.form + 1); + // TODO: This block of code might supposed to be a switch statement. + if (this->entityType.form != 8) { + if (this->entityType.form == 7) { + sub_0806FAD8(this->attachedEntity, this); + return; + } + } else { + this->damageType = this->attachedEntity->damageType; + this->attachedEntity->damageType = 0x7E; + } + ResolveEntityOnTop(this->attachedEntity, this); + } else { + if (*(u32 *)&this->parent->field_0x74 == 0) { + if (this->entityType.form == 8) { + this->attachedEntity->damageType = this->damageType; + } + DeleteThisEntity(); + } + + if (this->entityType.form == 5 && this->frames.b.f0) { + Entity* entity = CreateObjectWithParent(this->attachedEntity, 0x49, 8, 0); + if (entity) { + entity->parent = this->parent; + entity->attachedEntity = this->parent->parent; + } + } + + GetNextFrame(this); + CopyPositionAndSpriteOffset(this->attachedEntity, this); + } +} + +void sub_0808F498(Entity* this) { + u32 var0; + + if (this->action != 0) { + if (sub_0806F3E4(this)) { + if (gScreenTransition.frameCount % 16 == 0) { + PlaySFX(0xEF); + } + DeleteThisEntity(); + } + + if (--this->actionDelay == 0xFF) { + DeleteThisEntity(); + } + + if (gLinkState.field_0x1c != 1) { + DeleteThisEntity(); + } + } else { + this->action = 1; + this->actionDelay = 64; + var0 = this->entityType.parameter != 0 ? 44 : 43; + this->x.HALF.HI -= this->parent->boundingBox->field_0x6; + this->x.HALF.HI += (s32)Random() % (this->parent->boundingBox->field_0x6 * 2); + this->y.HALF.HI -= this->parent->boundingBox->field_0x7; + this->y.HALF.HI += (s32)Random() % (this->parent->boundingBox->field_0x7 * 2); + sub_0801D2B4(this, var0); + InitializeAnimation(this, 4); + } +} + +void sub_0808F554(Entity* this) { + CopyPositionAndSpriteOffset(this->parent, this); + this->spriteOffsetY -= 24; + if ((s8)this->parent->spriteOffsetX != 0) { + this->spriteOffsetX += (s8)this->parent->spriteOffsetX / 2; + } + + if (this->action != 0) { + if (*(u32 *)&this->cutsceneBeh) { + if (--(*(u32 *)&this->cutsceneBeh) == 0) { + DeleteThisEntity(); + } + } + GetNextFrame(this); + } else { + this->action = 1; + this->spriteRendering.b3 = this->parent->spriteRendering.b3; + this->spriteOrientation.flipY = this->parent->spriteOrientation.flipY; + this->spritePriority.b0 = 0; + InitializeAnimation(this, 3); + } +} + +void sub_0808F5EC(Entity* this) { + Entity* entity = CreateObjectWithParent(this->attachedEntity, 0x49, 5, 0); + if (entity) { + entity->parent = this; + entity->attachedEntity = this->attachedEntity; + } + + entity = CreateObjectWithParent(this->attachedEntity, 0x49, 6, 0); + if (entity) { + entity->parent = this; + entity->attachedEntity = this->attachedEntity; + } + + entity = CreateObjectWithParent(this->attachedEntity, 0x49, 7, 0); + if (entity) { + entity->parent = this; + entity->attachedEntity = this->attachedEntity; + } + + *(u32 *)&this->field_0x74 = 600; +}