From e20bdddf2f02d2e43017b2112978f9703fe86e20 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Wed, 16 Feb 2022 07:59:57 +0100 Subject: [PATCH 01/10] Temporarily remove static from NONMATCH functions So they are counted correctly in the progress script --- src/main.c | 8 ++++---- src/message.c | 22 +++++++++++----------- src/player.c | 28 ++++++++++++++-------------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/main.c b/src/main.c index 235a8ef9..136ab17d 100644 --- a/src/main.c +++ b/src/main.c @@ -11,7 +11,7 @@ extern u32 gRand; static void InitOverlays(void); static bool32 SoftResetKeysPressed(void); -static u32 CheckHeaderValid(void); +/*static*/ u32 CheckHeaderValid(void); void (*const sTaskHandlers[])(void) = { [TASK_TITLE] = TitleTask, @@ -25,7 +25,7 @@ void (*const sTaskHandlers[])(void) = { [TASK_STAFFROLL] = StaffrollTask, [TASK_DEBUG] = DebugTask, }; -static void sub_080560B8(void); +/*static*/ void sub_080560B8(void); void AgbMain(void) { InitOverlays(); @@ -170,7 +170,7 @@ const Defaults sDefaultSettings = { }; // single misplaced ldr -NONMATCH("asm/non_matching/sub_080560B8.inc", static void sub_080560B8(void)) { +NONMATCH("asm/non_matching/sub_080560B8.inc", /*static*/ void sub_080560B8(void)) { u32 b; if (!CheckHeaderValid()) { @@ -199,7 +199,7 @@ NONMATCH("asm/non_matching/sub_080560B8.inc", static void sub_080560B8(void)) { } END_NONMATCH -static u32 CheckHeaderValid(void) { +/*static*/ u32 CheckHeaderValid(void) { if ((gSaveHeader->signature != SIGNATURE) || (gSaveHeader->saveFileId >= NUM_SAVE_SLOTS) || (gSaveHeader->msg_speed >= MAX_MSG_SPEED) || (gSaveHeader->brightness >= MAX_BRIGHTNESS) #ifdef EU diff --git a/src/message.c b/src/message.c index 4136fb06..b0219506 100644 --- a/src/message.c +++ b/src/message.c @@ -45,8 +45,8 @@ u32 GetFontStrWith(u8*, u32); static void StatusUpdate(u32 status); -static u16 RunTextCommand(TextRender* this); -static void PaletteChange(TextRender* this, u32 id); +/*static*/ u16 RunTextCommand(TextRender* this); +/*static*/ void PaletteChange(TextRender* this, u32 id); static void SwitchChoice(u32 to, u32 from); static void MsgChangeLine(u32 lineNo); @@ -64,9 +64,9 @@ static void sub_08056FBC(TextRender*); typedef u32 (*MessageFunction)(void); static u32 MsgIdle(void); -static u32 MsgInit(void); +/*static*/ u32 MsgInit(void); static u32 MsgUpdate(void); -static u32 MsgOpen(void); +/*static*/ u32 MsgOpen(void); static u32 MsgClose(void); static u32 MsgDie(void); typedef enum { @@ -84,7 +84,7 @@ static void TextDispUpdate(TextRender* this); static void TextDispDie(TextRender* this); static void TextDispWait(TextRender* this); static void TextDispRoll(TextRender* this); -static void TextDispEnquiry(TextRender* this); +/*static*/ void TextDispEnquiry(TextRender* this); typedef enum { RENDER_INIT, RENDER_UPDATE, @@ -228,7 +228,7 @@ u8* const gUnk_08107BE0[] = { }; // regalloc in loop -NONMATCH("asm/non_matching/textbox/MsgInit.inc", static u32 MsgInit(void)) { +NONMATCH("asm/non_matching/textbox/MsgInit.inc", /*static*/ u32 MsgInit(void)) { char* dest; u32 i; @@ -266,7 +266,7 @@ NONMATCH("asm/non_matching/textbox/MsgInit.inc", static u32 MsgInit(void)) { } END_NONMATCH -static u32 MsgOpen(void) { +/*static*/ u32 MsgOpen(void) { if (gTextRender.renderStatus == RENDER_INIT) { gTextRender.renderStatus = RENDER_UPDATE; gTextRender._98.bytes.b1 = 1; @@ -367,7 +367,7 @@ static void TextDispUpdate(TextRender* this) { } } -NONMATCH("asm/non_matching/textbox/RunTextCommand.inc", static u16 RunTextCommand(TextRender* this)) { +NONMATCH("asm/non_matching/textbox/RunTextCommand.inc", /*static*/ u16 RunTextCommand(TextRender* this)) { s32 palette; u32 chr = this->curToken.extended; @@ -492,7 +492,7 @@ NONMATCH("asm/non_matching/textbox/RunTextCommand.inc", static u16 RunTextComman } END_NONMATCH -static void PaletteChange(TextRender* this, u32 id) { +/*static*/ void PaletteChange(TextRender* this, u32 id) { u32 temp = id % 8; this->_8f = temp; this->_50.unk2 = temp; @@ -502,10 +502,10 @@ const u8 gUnk_08107C0F[] = { 0x8, 0x1e, 0x4, 0x12, 0x0 }; const u8 gUnk_08107C14[] = { 0x8, 0x1e, 0x8, 0xFE, 0x0 }; #ifdef EU -ASM_FUNC("asm/non_matching/eu/TextDispEnquiry.inc", static void TextDispEnquiry(TextRender* ctb)) +ASM_FUNC("asm/non_matching/eu/TextDispEnquiry.inc", /*static*/ void TextDispEnquiry(TextRender* ctb)) #else -static void TextDispEnquiry(TextRender* this) { +/*static*/ void TextDispEnquiry(TextRender* this) { s32 nextTextIdx, choiceIdx, lastChoice; u32 doSwitch; const u8* src; diff --git a/src/player.c b/src/player.c index 65076904..6c0463f5 100644 --- a/src/player.c +++ b/src/player.c @@ -113,8 +113,8 @@ static EntityAction PortalStandUpdate; static EntityAction PortalActivateInit; static EntityAction PortalActivateUpdate; static EntityAction PortalShrinkInit; -static EntityAction PortalShrinkUpdate; -static EntityAction PortalEnterUpdate; +/*static*/ EntityAction PortalShrinkUpdate; +/*static*/ EntityAction PortalEnterUpdate; static EntityAction PortalUnknownUpdate; // PLAYER_TALKEZLO @@ -187,8 +187,8 @@ static EntityAction sub_08072C48; // PLAYER_08072C9C static EntityAction sub_08072CC0; static EntityAction sub_08072CFC; -static EntityAction sub_08072D54; -static EntityAction sub_08072F14; +/*static*/ EntityAction sub_08072D54; +/*static*/ EntityAction sub_08072F14; // PLAYER_CLIMB static EntityAction sub_08072F94; @@ -204,8 +204,8 @@ static EntityAction sub_080733BC; static EntityAction sub_08073468; static EntityAction sub_080734D4; static EntityAction sub_08073504; -static EntityAction sub_08073584; -static EntityAction sub_0807379C; +/*static*/ EntityAction sub_08073584; +/*static*/ EntityAction sub_0807379C; static EntityAction sub_080737BC; static EntityAction sub_0807380C; static EntityAction sub_08073884; @@ -226,7 +226,7 @@ static EntityAction sub_08073F4C; static EntityAction sub_08073FD0; static EntityAction sub_08074018; static EntityAction sub_08074060; -static EntityAction sub_080740D8; +/*static*/ EntityAction sub_080740D8; // PLAYER_08074C44 static EntityAction sub_08074C68; @@ -1178,9 +1178,9 @@ static const u8 gUnk_0811BABC[] = { }; // horrible -static ASM_FUNC("asm/non_matching/player/PortalShrinkUpdate.inc", void PortalShrinkUpdate(Entity* this)); +/*static*/ ASM_FUNC("asm/non_matching/player/PortalShrinkUpdate.inc", void PortalShrinkUpdate(Entity* this)); -static void PortalEnterUpdate(Entity* this) { +/*static*/ void PortalEnterUpdate(Entity* this) { if (this->actionDelay == 0) { if (GravityUpdate(this, GRAVITY_RATE)) return; @@ -2311,7 +2311,7 @@ static const u16* const sTileTable[] = { sTiles + 9, }; -static NONMATCH("asm/non_matching/player/sub_08072D54.inc", void sub_08072D54(Entity* this)) { +/*static*/ NONMATCH("asm/non_matching/player/sub_08072D54.inc", void sub_08072D54(Entity* this)) { u32 bVar1; u32 uVar2; @@ -2398,7 +2398,7 @@ static NONMATCH("asm/non_matching/player/sub_08072D54.inc", void sub_08072D54(En } END_NONMATCH -static void sub_08072F14(Entity* this) { +/*static*/ void sub_08072F14(Entity* this) { if (--this->actionDelay != 0xff) { sub_0807921C(); } else { @@ -2729,7 +2729,7 @@ static const u16 gUnk_0811BC30[] = { 0x0720, }; -static NONMATCH("asm/non_matching/player/sub_08073584.inc", void sub_08073584(Entity* this)) { +/*static*/ NONMATCH("asm/non_matching/player/sub_08073584.inc", void sub_08073584(Entity* this)) { u32 state, dir, tmp, tmp2, idx; if ((gPlayerState.field_0x92 & 0x80) || this->iframes > 0 || gPlayerState.field_0x3c[0] || @@ -2821,7 +2821,7 @@ static NONMATCH("asm/non_matching/player/sub_08073584.inc", void sub_08073584(En } END_NONMATCH -static void sub_0807379C(Entity* this) { +/*static*/ void sub_0807379C(Entity* this) { if (this->z.HALF.HI > -32) { this->z.HALF.HI--; } else { @@ -3244,7 +3244,7 @@ static void sub_08074060(Entity* this) { } } -static NONMATCH("asm/non_matching/player/sub_080740D8.inc", void sub_080740D8(Entity* this)) { +/*static*/ NONMATCH("asm/non_matching/player/sub_080740D8.inc", void sub_080740D8(Entity* this)) { int v1; // r5 int v2; // r6 unsigned int v4; // r0 From 9036135c6fa5348cc1ba5cb3dace01a63601d31c Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Sun, 13 Feb 2022 11:55:12 +0100 Subject: [PATCH 02/10] Decompile Object3E --- asm/object/object3E.s | 682 ----------------------------------- assets/assets.json | 15 - data/const/object/object3E.s | 31 -- include/object.h | 2 +- linker.ld | 4 +- src/object/object3E.c | 255 +++++++++++++ 6 files changed, 258 insertions(+), 731 deletions(-) delete mode 100644 asm/object/object3E.s delete mode 100644 data/const/object/object3E.s create mode 100644 src/object/object3E.c diff --git a/asm/object/object3E.s b/asm/object/object3E.s deleted file mode 100644 index e40bcee1..00000000 --- a/asm/object/object3E.s +++ /dev/null @@ -1,682 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object3E -Object3E: @ 0x0808D0C8 - push {lr} - ldr r2, _0808D0DC @ =gUnk_081216DC - ldrb r1, [r0, #0xa] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0808D0DC: .4byte gUnk_081216DC - - thumb_func_start sub_0808D0E0 -sub_0808D0E0: @ 0x0808D0E0 - push {r4, r5, r6, lr} - adds r5, r0, #0 - ldrb r6, [r5, #0xc] - cmp r6, #1 - beq _0808D12C - cmp r6, #1 - bgt _0808D0F4 - cmp r6, #0 - beq _0808D0FA - b _0808D192 -_0808D0F4: - cmp r6, #2 - beq _0808D150 - b _0808D192 -_0808D0FA: - movs r4, #1 - strb r4, [r5, #0xc] - bl Random - movs r1, #0x1f - ands r0, r1 - movs r1, #0x40 - subs r1, r1, r0 - strb r1, [r5, #0xe] - strb r6, [r5, #0x1e] - strb r6, [r5, #0x14] - ldrb r0, [r5, #0x19] - movs r1, #0xc0 - orrs r0, r1 - strb r0, [r5, #0x19] - adds r2, r5, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #7 - orrs r0, r1 - strb r0, [r2] - adds r0, r5, #0 - adds r0, #0x38 - strb r4, [r0] - b _0808D192 -_0808D12C: - ldrb r0, [r5, #0xe] - subs r0, #1 - strb r0, [r5, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0808D192 - movs r0, #8 - strb r0, [r5, #0xe] - movs r0, #4 - strb r0, [r5, #0xf] - movs r0, #2 - strb r0, [r5, #0xc] - bl Random - movs r1, #3 - ands r0, r1 - strb r0, [r5, #0x14] - b _0808D192 -_0808D150: - ldrb r0, [r5, #0xe] - subs r0, #1 - strb r0, [r5, #0xe] - movs r1, #0xff - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0808D192 - ldrb r0, [r5, #0xf] - subs r0, #1 - strb r0, [r5, #0xf] - ands r0, r1 - cmp r0, #0 - bne _0808D180 - strb r0, [r5, #0x1e] - movs r0, #1 - strb r0, [r5, #0xc] - bl Random - movs r1, #0x1f - ands r0, r1 - movs r1, #0x40 - subs r1, r1, r0 - strb r1, [r5, #0xe] - b _0808D192 -_0808D180: - movs r0, #8 - strb r0, [r5, #0xe] - ldrb r1, [r5, #0x14] - ldrb r0, [r5, #0x1e] - movs r2, #0 - cmp r0, r1 - beq _0808D190 - adds r2, r1, #0 -_0808D190: - strb r2, [r5, #0x1e] -_0808D192: - pop {r4, r5, r6, pc} - - thumb_func_start sub_0808D194 -sub_0808D194: @ 0x0808D194 - push {r4, r5, r6, lr} - adds r5, r0, #0 - ldrb r1, [r5, #0xc] - cmp r1, #1 - beq _0808D234 - cmp r1, #1 - bgt _0808D1A8 - cmp r1, #0 - beq _0808D1AE - b _0808D234 -_0808D1A8: - cmp r1, #2 - beq _0808D1FC - b _0808D234 -_0808D1AE: - movs r0, #1 - strb r0, [r5, #0xc] - movs r0, #8 - strb r0, [r5, #0xe] - strb r1, [r5, #0xf] - strb r1, [r5, #0x1e] - adds r2, r5, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #7 - orrs r0, r1 - strb r0, [r2] - ldr r0, _0808D1F4 @ =0x00004069 - movs r2, #0x2e - ldrsh r1, [r5, r2] - ldr r3, _0808D1F8 @ =gRoomControls - ldrh r2, [r3, #6] - subs r1, r1, r2 - asrs r1, r1, #4 - movs r4, #0x3f - ands r1, r4 - movs r6, #0x32 - ldrsh r2, [r5, r6] - ldrh r3, [r3, #8] - subs r2, r2, r3 - asrs r2, r2, #4 - ands r2, r4 - lsls r2, r2, #6 - orrs r1, r2 - subs r1, #0x40 - movs r2, #1 - bl SetTile - b _0808D234 - .align 2, 0 -_0808D1F4: .4byte 0x00004069 -_0808D1F8: .4byte gRoomControls -_0808D1FC: - ldr r0, _0808D274 @ =gRoomTransition - ldr r3, [r0] - movs r0, #3 - ands r3, r0 - cmp r3, #0 - bne _0808D234 - ldr r4, _0808D278 @ =gScreen - ldrb r2, [r5, #0xd] - lsls r1, r2, #8 - movs r0, #0x10 - subs r0, r0, r2 - orrs r1, r0 - adds r0, r4, #0 - adds r0, #0x68 - strh r1, [r0] - ldrb r0, [r5, #0xd] - adds r0, #1 - strb r0, [r5, #0xd] - lsls r1, r1, #0x10 - movs r0, #0x80 - lsls r0, r0, #0x15 - cmp r1, r0 - bne _0808D234 - adds r0, r4, #0 - adds r0, #0x66 - strh r3, [r0] - bl DeleteThisEntity -_0808D234: - ldrb r0, [r5, #0xe] - subs r0, #1 - strb r0, [r5, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0808D272 - movs r0, #8 - strb r0, [r5, #0xe] - ldrb r0, [r5, #0xa] - cmp r0, #9 - bne _0808D24E - movs r0, #2 - strb r0, [r5, #0xe] -_0808D24E: - ldr r4, _0808D27C @ =gUnk_08121704 - ldrb r0, [r5, #0xf] - adds r1, r0, #1 - strb r1, [r5, #0xf] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x17 - adds r0, r0, r4 - ldrh r1, [r0] - adds r0, r5, #0 - bl ChangeObjPalette - ldrb r0, [r5, #0xf] - lsls r0, r0, #1 - adds r0, r0, r4 - ldrh r0, [r0] - cmp r0, #0 - bne _0808D272 - strb r0, [r5, #0xf] -_0808D272: - pop {r4, r5, r6, pc} - .align 2, 0 -_0808D274: .4byte gRoomTransition -_0808D278: .4byte gScreen -_0808D27C: .4byte gUnk_08121704 - - thumb_func_start sub_0808D280 -sub_0808D280: @ 0x0808D280 - push {r4, lr} - sub sp, #4 - movs r4, #0 - str r4, [sp] - movs r0, #6 - movs r1, #0x3e - movs r2, #6 - movs r3, #9 - bl FindEntity - adds r2, r0, #0 - cmp r2, #0 - beq _0808D2C4 - movs r0, #2 - strb r0, [r2, #0xc] - strb r4, [r2, #0xd] - ldrb r1, [r2, #0x19] - subs r0, #0xf - ands r0, r1 - movs r1, #4 - orrs r0, r1 - strb r0, [r2, #0x19] - ldr r1, _0808D2C8 @ =gScreen - adds r2, r1, #0 - adds r2, #0x66 - movs r0, #0xc8 - lsls r0, r0, #3 - strh r0, [r2] - adds r1, #0x68 - movs r0, #0x10 - strh r0, [r1] - movs r0, #0xf6 - bl SoundReq -_0808D2C4: - add sp, #4 - pop {r4, pc} - .align 2, 0 -_0808D2C8: .4byte gScreen - - thumb_func_start sub_0808D2CC -sub_0808D2CC: @ 0x0808D2CC - push {lr} - sub sp, #4 - movs r0, #0 - str r0, [sp] - movs r0, #6 - movs r1, #0x3e - movs r2, #6 - movs r3, #1 - bl FindEntity - adds r1, r0, #0 - cmp r1, #0 - beq _0808D2F2 - movs r0, #9 - strb r0, [r1, #0xa] - adds r0, r1, #0 - movs r1, #2 - bl SetDefaultPriority -_0808D2F2: - add sp, #4 - pop {pc} - .align 2, 0 - - thumb_func_start nullsub_521 -nullsub_521: @ 0x0808D2F8 - bx lr - .align 2, 0 - - thumb_func_start sub_0808D2FC -sub_0808D2FC: @ 0x0808D2FC - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _0808D31C - strb r0, [r4, #0xc] - strb r0, [r4, #0x1e] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #7 - orrs r0, r1 - strb r0, [r2] - adds r0, r4, #0 - bl sub_0807DD64 -_0808D31C: - movs r0, #0x2e - ldrsh r5, [r4, r0] - adds r0, r4, #0 - movs r1, #0 - bl ExecuteScriptForEntity - adds r0, r4, #0 - bl HandleEntity0x82Actions - ldr r0, _0808D354 @ =gRoomControls - ldrh r0, [r0, #0x16] - cmp r0, #0 - beq _0808D350 - movs r1, #0x2e - ldrsh r0, [r4, r1] - cmp r5, r0 - beq _0808D350 - ldr r0, _0808D358 @ =gRoomTransition - ldr r0, [r0] - movs r1, #8 - ands r0, r1 - cmp r0, #0 - bne _0808D350 - ldr r0, _0808D35C @ =0x0000010F - bl SoundReq -_0808D350: - pop {r4, r5, pc} - .align 2, 0 -_0808D354: .4byte gRoomControls -_0808D358: .4byte gRoomTransition -_0808D35C: .4byte 0x0000010F - - thumb_func_start sub_0808D360 -sub_0808D360: @ 0x0808D360 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _0808D382 - strb r0, [r4, #0xc] - movs r0, #1 - strb r0, [r4, #0x1e] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #7 - orrs r0, r1 - strb r0, [r2] - adds r0, r4, #0 - bl sub_0807DD64 -_0808D382: - adds r0, r4, #0 - movs r1, #0 - bl ExecuteScriptForEntity - adds r0, r4, #0 - bl HandleEntity0x82Actions - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0808D394 -sub_0808D394: @ 0x0808D394 - push {r4, r5, lr} - adds r5, r0, #0 - ldrb r0, [r5, #0xc] - cmp r0, #0 - bne _0808D3C4 - movs r0, #1 - strb r0, [r5, #0xc] - movs r0, #8 - strb r0, [r5, #0xe] - adds r2, r5, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #7 - orrs r0, r1 - strb r0, [r2] - ldr r1, _0808D3FC @ =gScreen - adds r2, r1, #0 - adds r2, #0x66 - movs r0, #0xc8 - lsls r0, r0, #3 - strh r0, [r2] - adds r1, #0x68 - ldr r0, _0808D400 @ =0x00001003 - strh r0, [r1] -_0808D3C4: - ldrb r0, [r5, #0xe] - subs r0, #1 - strb r0, [r5, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0808D3F8 - movs r0, #2 - strb r0, [r5, #0xe] - ldr r4, _0808D404 @ =gUnk_08121720 - ldrb r0, [r5, #0xf] - adds r1, r0, #1 - strb r1, [r5, #0xf] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x17 - adds r0, r0, r4 - ldrh r1, [r0] - adds r0, r5, #0 - bl sub_0801D28C - ldrb r0, [r5, #0xf] - lsls r0, r0, #1 - adds r0, r0, r4 - ldrh r0, [r0] - cmp r0, #0 - bne _0808D3F8 - strb r0, [r5, #0xf] -_0808D3F8: - pop {r4, r5, pc} - .align 2, 0 -_0808D3FC: .4byte gScreen -_0808D400: .4byte 0x00001003 -_0808D404: .4byte gUnk_08121720 - - thumb_func_start sub_0808D408 -sub_0808D408: @ 0x0808D408 - push {lr} - adds r3, r0, #0 - ldrb r0, [r3, #0xc] - cmp r0, #0 - bne _0808D458 - movs r1, #1 - strb r1, [r3, #0xc] - ldrb r0, [r3, #0x19] - movs r2, #0xc0 - orrs r0, r2 - strb r0, [r3, #0x19] - movs r0, #0x29 - adds r0, r0, r3 - mov ip, r0 - ldrb r0, [r0] - movs r2, #7 - orrs r0, r2 - mov r2, ip - strb r0, [r2] - ldrb r2, [r3, #0x19] - movs r0, #0xd - rsbs r0, r0, #0 - ands r0, r2 - movs r2, #4 - orrs r0, r2 - strb r0, [r3, #0x19] - ldrb r0, [r3, #0xb] - strb r0, [r3, #0x1e] - ldrb r0, [r3, #0xb] - subs r1, r1, r0 - lsls r1, r1, #9 - movs r0, #0x80 - lsls r0, r0, #1 - adds r1, r1, r0 - movs r2, #0xc0 - rsbs r2, r2, #0 - adds r0, r3, #0 - movs r3, #0 - bl sub_0805EC9C -_0808D458: - pop {pc} - .align 2, 0 - - thumb_func_start sub_0808D45C -sub_0808D45C: @ 0x0808D45C - push {lr} - ldr r2, _0808D470 @ =gUnk_0812172C - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0808D470: .4byte gUnk_0812172C - - thumb_func_start sub_0808D474 -sub_0808D474: @ 0x0808D474 - push {r4, r5, lr} - adds r5, r0, #0 - adds r2, r5, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #7 - orrs r0, r1 - strb r0, [r2] - ldrb r0, [r5, #0xb] - strb r0, [r5, #0x1e] - movs r1, #2 - strb r1, [r5, #0xc] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0808D4D4 - movs r0, #0x7c - bl CheckLocalFlag - adds r1, r0, #0 - cmp r1, #0 - bne _0808D4D4 - movs r0, #1 - strb r0, [r5, #0xc] - strb r1, [r5, #0xe] - ldrb r1, [r5, #0x19] - subs r0, #0xe - ands r0, r1 - movs r1, #4 - orrs r0, r1 - strb r0, [r5, #0x19] - ldr r1, _0808D4CC @ =gScreen - adds r2, r1, #0 - adds r2, #0x66 - movs r0, #0xc8 - lsls r0, r0, #3 - strh r0, [r2] - adds r1, #0x68 - movs r0, #0x80 - lsls r0, r0, #5 - strh r0, [r1] - ldr r0, _0808D4D0 @ =0x00000179 - bl SoundReq - b _0808D50E - .align 2, 0 -_0808D4CC: .4byte gScreen -_0808D4D0: .4byte 0x00000179 -_0808D4D4: - movs r0, #8 - strb r0, [r5, #0xe] - movs r1, #0x2e - ldrsh r0, [r5, r1] - ldr r3, _0808D510 @ =gRoomControls - ldrh r1, [r3, #6] - subs r0, r0, r1 - asrs r4, r0, #4 - movs r2, #0x3f - ands r4, r2 - movs r1, #0x32 - ldrsh r0, [r5, r1] - ldrh r1, [r3, #8] - subs r0, r0, r1 - asrs r0, r0, #4 - ands r0, r2 - lsls r0, r0, #6 - orrs r4, r0 - ldrb r0, [r5, #0xb] - cmp r0, #0 - beq _0808D500 - subs r4, #0x40 -_0808D500: - ldr r0, _0808D514 @ =0x00004069 - adds r1, r5, #0 - adds r1, #0x38 - ldrb r2, [r1] - adds r1, r4, #0 - bl SetTile -_0808D50E: - pop {r4, r5, pc} - .align 2, 0 -_0808D510: .4byte gRoomControls -_0808D514: .4byte 0x00004069 - - thumb_func_start sub_0808D518 -sub_0808D518: @ 0x0808D518 - push {r4, r5, r6, lr} - adds r5, r0, #0 - ldr r0, _0808D58C @ =gRoomTransition - ldr r2, [r0] - movs r0, #3 - ands r2, r0 - cmp r2, #0 - bne _0808D58A - ldr r3, _0808D590 @ =gScreen - ldrb r0, [r5, #0xe] - movs r1, #0x10 - subs r1, r1, r0 - lsls r1, r1, #8 - orrs r1, r0 - adds r0, r3, #0 - adds r0, #0x68 - strh r1, [r0] - ldrb r0, [r5, #0xe] - adds r0, #1 - strb r0, [r5, #0xe] - lsls r1, r1, #0x10 - lsrs r1, r1, #0x10 - cmp r1, #0x10 - bne _0808D58A - movs r0, #2 - strb r0, [r5, #0xc] - movs r0, #8 - strb r0, [r5, #0xe] - ldrb r1, [r5, #0x19] - subs r0, #0x15 - ands r0, r1 - strb r0, [r5, #0x19] - adds r0, r3, #0 - adds r0, #0x66 - strh r2, [r0] - ldr r0, _0808D594 @ =0x00004069 - movs r2, #0x2e - ldrsh r1, [r5, r2] - ldr r3, _0808D598 @ =gRoomControls - ldrh r2, [r3, #6] - subs r1, r1, r2 - asrs r1, r1, #4 - movs r4, #0x3f - ands r1, r4 - movs r6, #0x32 - ldrsh r2, [r5, r6] - ldrh r3, [r3, #8] - subs r2, r2, r3 - asrs r2, r2, #4 - ands r2, r4 - lsls r2, r2, #6 - orrs r1, r2 - adds r2, r5, #0 - adds r2, #0x38 - ldrb r2, [r2] - bl SetTile -_0808D58A: - pop {r4, r5, r6, pc} - .align 2, 0 -_0808D58C: .4byte gRoomTransition -_0808D590: .4byte gScreen -_0808D594: .4byte 0x00004069 -_0808D598: .4byte gRoomControls - - thumb_func_start sub_0808D59C -sub_0808D59C: @ 0x0808D59C - push {r4, r5, lr} - adds r5, r0, #0 - ldrb r0, [r5, #0xe] - subs r0, #1 - strb r0, [r5, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0808D5D4 - movs r0, #8 - strb r0, [r5, #0xe] - ldr r4, _0808D5D8 @ =gUnk_08121738 - ldrb r0, [r5, #0xf] - adds r1, r0, #1 - strb r1, [r5, #0xf] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x17 - adds r0, r0, r4 - ldrh r1, [r0] - adds r0, r5, #0 - bl ChangeObjPalette - ldrb r0, [r5, #0xf] - lsls r0, r0, #1 - adds r0, r0, r4 - ldrh r0, [r0] - cmp r0, #0 - bne _0808D5D4 - strb r0, [r5, #0xf] -_0808D5D4: - pop {r4, r5, pc} - .align 2, 0 -_0808D5D8: .4byte gUnk_08121738 diff --git a/assets/assets.json b/assets/assets.json index 22a13c78..9e7c26d2 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -43640,21 +43640,6 @@ "start": 1185480, "size": 20 }, - { - "path": "object3E/gUnk_08121704.bin", - "start": 1185540, - "size": 28 - }, - { - "path": "object3E/gUnk_08121720.bin", - "start": 1185568, - "size": 12 - }, - { - "path": "object3E/gUnk_08121738.bin", - "start": 1185592, - "size": 24 - }, { "path": "giantLeaf/gUnk_08121750.bin", "start": 1185616, diff --git a/data/const/object/object3E.s b/data/const/object/object3E.s deleted file mode 100644 index b3fda6c5..00000000 --- a/data/const/object/object3E.s +++ /dev/null @@ -1,31 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_081216DC:: @ 081216DC - .4byte sub_0808D0E0 - .4byte sub_0808D194 - .4byte sub_0808D194 - .4byte nullsub_521 - .4byte sub_0808D2FC - .4byte sub_0808D360 - .4byte sub_0808D394 - .4byte sub_0808D408 - .4byte sub_0808D45C - .4byte sub_0808D194 - -gUnk_08121704:: @ 08121704 - .incbin "object3E/gUnk_08121704.bin" - -gUnk_08121720:: @ 08121720 - .incbin "object3E/gUnk_08121720.bin" - -gUnk_0812172C:: @ 0812172C - .4byte sub_0808D474 - .4byte sub_0808D518 - .4byte sub_0808D59C - -gUnk_08121738:: @ 08121738 - .incbin "object3E/gUnk_08121738.bin" diff --git a/include/object.h b/include/object.h index 285addc7..72120f5e 100644 --- a/include/object.h +++ b/include/object.h @@ -288,7 +288,7 @@ void Object3A(Entity*); void MacroMushromStalks(Entity*); void MacroPlayer(Entity*); void Object3D(Entity*); -void Object3E(Entity*); +void Object3E(); void GiantLeaf(Entity*); void Fairy(Entity*); void LadderUp(Entity*); diff --git a/linker.ld b/linker.ld index 55dd7ab7..6d739c7a 100644 --- a/linker.ld +++ b/linker.ld @@ -709,7 +709,7 @@ SECTIONS { asm/object/code_0808C964.o(.text); asm/object/macroPlayer.o(.text); asm/object/object3D.o(.text); - asm/object/object3E.o(.text); + src/object/object3E.o(.text); src/object/giantLeaf.o(.text); asm/object/fairy.o(.text); asm/object/ladderUp.o(.text); @@ -1445,7 +1445,7 @@ SECTIONS { data/const/object/object76.o(.rodata); data/const/object/macroPlayer.o(.rodata); data/const/object/object3D.o(.rodata); - data/const/object/object3E.o(.rodata); + src/object/object3E.o(.rodata); data/const/object/giantLeaf.o(.rodata); data/const/object/fairy.o(.rodata); data/const/object/object42.o(.rodata); diff --git a/src/object/object3E.c b/src/object/object3E.c new file mode 100644 index 00000000..8e083d1e --- /dev/null +++ b/src/object/object3E.c @@ -0,0 +1,255 @@ +/** + * @file object3E.c + * @ingroup Objects + * + * @brief Object3E object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" +#include "screen.h" + +typedef struct { + /*0x00*/ Entity base; +} Object3EEntity; + +void Object3E_Type0(Object3EEntity*); +void Object3E_Type1(Object3EEntity*); +void Object3E_Type3(Object3EEntity*); +void Object3E_Type4(Object3EEntity*); +void Object3E_Type5(Object3EEntity*); +void Object3E_Type6(Object3EEntity*); +void Object3E_Type7(Object3EEntity*); +void Object3E_Type8(Object3EEntity*); +void Object3E_Type8_Init(Object3EEntity*); +void Object3E_Type8_Action1(Object3EEntity*); +void Object3E_Type8_Action2(Object3EEntity*); + +void Object3E(Object3EEntity* this) { + static void (*const Object3E_Types[])(Object3EEntity*) = { + Object3E_Type0, Object3E_Type1, Object3E_Type1, Object3E_Type3, Object3E_Type4, + Object3E_Type5, Object3E_Type6, Object3E_Type7, Object3E_Type8, Object3E_Type1, + }; + Object3E_Types[super->type](this); +} + +void Object3E_Type0(Object3EEntity* this) { + u32 tmp; + u32 tmp2; + switch (super->action) { + case 0: + super->action = 1; + super->actionDelay = 0x40 - (Random() & 0x1f); + super->frameIndex = 0; + super->animationState = 0; + super->spriteRendering.b3 = 3; + super->spritePriority.b0 = 7; + super->collisionLayer = 1; + break; + case 1: + if (--super->actionDelay == 0) { + super->actionDelay = 8; + super->field_0xf = 4; + super->action = 2; + super->animationState = Random() & 3; + } + break; + case 2: + if (--super->actionDelay == 0) { + if (--super->field_0xf == 0) { + super->frameIndex = 0; + super->action = 1; + super->actionDelay = 0x40 - (Random() & 0x1f); + } else { + super->actionDelay = 8; + tmp2 = super->animationState; + if (super->frameIndex != tmp2) { + tmp = tmp2; + } else { + tmp = 0; + } + super->frameIndex = tmp; + } + } + break; + } +} + +void Object3E_Type1(Object3EEntity* this) { + static const u16 gUnk_08121704[] = { + 0x12d, 0x12e, 0x12f, 0x130, 0x131, 0x132, 0x133, 0x132, 0x131, 0x130, 0x12f, 0x12e, 0x12d, 0, + }; + + switch (super->action) { + case 0: + super->action = 1; + super->actionDelay = 8; + super->field_0xf = 0; + super->frameIndex = 0; + super->spritePriority.b0 = 7; + SetTile(0x4069, COORD_TO_TILE(super) - 0x40, 1); + break; + case 2: + if ((gRoomTransition.frameCount & 3U) == 0) { + gScreen.controls.alphaBlend = (super->subAction << 8) | (0x10 - super->subAction); + super->subAction++; + if (gScreen.controls.alphaBlend == 0x1000) { + gScreen.controls.layerFXControl = 0; + DeleteThisEntity(); + } + } + break; + case 1: + break; + } + if (--super->actionDelay == 0) { + super->actionDelay = 8; + if (super->type == 9) { + super->actionDelay = 2; + } + ChangeObjPalette(super, gUnk_08121704[super->field_0xf++]); + if (gUnk_08121704[super->field_0xf] == 0) { + super->field_0xf = 0; + } + } +} + +void sub_0808D280(void) { + Entity* obj = FindEntity(6, OBJECT_3E, 6, 9, 0); + if (obj != NULL) { + obj->action = 2; + obj->subAction = 0; + obj->spriteRendering.alphaBlend = 1; + gScreen.controls.layerFXControl = 0x640; + gScreen.controls.alphaBlend = 0x10; + SoundReq(SFX_EVAPORATE); + } +} + +void sub_0808D2CC(void) { + Entity* obj = FindEntity(6, OBJECT_3E, 6, 1, 0); + if (obj != NULL) { + obj->type = 9; + SetDefaultPriority(obj, 2); + } +} + +void Object3E_Type3(Object3EEntity* this) { +} + +void Object3E_Type4(Object3EEntity* this) { + s32 tmp; + if (super->action == 0) { + super->action = 0; + super->frameIndex = 0; + super->spritePriority.b0 = 7; + sub_0807DD64(super); + } + tmp = super->x.HALF.HI; + ExecuteScriptForEntity(super, NULL); + HandleEntity0x82Actions(super); + if (((gRoomControls.shake_duration != 0) && (tmp != super->x.HALF.HI)) && ((gRoomTransition.frameCount & 8) == 0)) { + SoundReq(SFX_10F); + } +} + +void Object3E_Type5(Object3EEntity* this) { + if (super->action == 0) { + super->action = 0; + super->frameIndex = 1; + super->spritePriority.b0 = 7; + sub_0807DD64(super); + } + ExecuteScriptForEntity(super, NULL); + HandleEntity0x82Actions(super); +} + +void Object3E_Type6(Object3EEntity* this) { + static const u16 gUnk_08121720[] = { 0x149, 0x14a, 0x14b, 0x14a, 0, 0 }; + if (super->action == 0) { + super->action = 1; + super->actionDelay = 8; + super->spritePriority.b0 = 7; + gScreen.controls.layerFXControl = 0x640; + gScreen.controls.alphaBlend = 0x1003; + } + if (--super->actionDelay == 0) { + super->actionDelay = 2; + sub_0801D28C(super, gUnk_08121720[super->field_0xf++]); + if (gUnk_08121720[super->field_0xf] == 0) { + super->field_0xf = 0; + } + } +} + +void Object3E_Type7(Object3EEntity* this) { + if (super->action == 0) { + super->action = 1; + super->spriteRendering.b3 = 3; + super->spritePriority.b0 = 7; + super->spriteRendering.alphaBlend = 1; + super->frameIndex = super->type2; + sub_0805EC9C(super, (1 - super->type2) * 0x200 + 0x100, 0xffffff40, 0); + } +} + +void Object3E_Type8(Object3EEntity* this) { + static void (*const Object3E_Type8_Actions[])(Object3EEntity*) = { + Object3E_Type8_Init, + Object3E_Type8_Action1, + Object3E_Type8_Action2, + }; + + Object3E_Type8_Actions[super->action](this); +} + +void Object3E_Type8_Init(Object3EEntity* this) { + u32 tilePosition; + super->spritePriority.b0 = 7; + super->frameIndex = super->type2; + super->action = 2; + if ((super->type2 == 0) && (CheckLocalFlag(0x7c) == 0)) { + super->action = 1; + super->actionDelay = 0; + super->spriteRendering.alphaBlend = 1; + gScreen.controls.layerFXControl = 0x640; + gScreen.controls.alphaBlend = 0x1000; + SoundReq(SFX_179); + } else { + super->actionDelay = 8; + tilePosition = COORD_TO_TILE(super); + if (super->type2 != 0) { + tilePosition -= 0x40; + } + SetTile(0x4069, tilePosition, super->collisionLayer); + } +} + +void Object3E_Type8_Action1(Object3EEntity* this) { + if ((gRoomTransition.frameCount & 3U) == 0) { + gScreen.controls.alphaBlend = ((0x10 - super->actionDelay) * 0x100) | super->actionDelay; + super->actionDelay++; + if (gScreen.controls.alphaBlend == 0x10) { + super->action = 2; + super->actionDelay = 8; + super->spriteRendering.alphaBlend = 0; + gScreen.controls.layerFXControl = 0; + SetTile(0x4069, COORD_TO_TILE(super), super->collisionLayer); + } + } +} + +void Object3E_Type8_Action2(Object3EEntity* this) { + static const u16 gUnk_08121738[] = { + 0x14c, 0x14d, 0x14e, 0x14f, 0x150, 0x151, 0x150, 0x14f, 0x14e, 0x14d, 0x14c, 0, + }; + if (--super->actionDelay == 0) { + super->actionDelay = 8; + ChangeObjPalette(super, gUnk_08121738[super->field_0xf++]); + if (gUnk_08121738[super->field_0xf] == 0) { + super->field_0xf = 0; + } + } +} From 8d33a5857c3b02c3524a540a0602b4eb2157fc30 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Sun, 13 Feb 2022 11:13:11 +0100 Subject: [PATCH 03/10] Decompile ObjectOnPillar --- asm/non_matching/cuccoChick/sub_0806E7B0.inc | 60 -- .../playerItem12/sub_080701F8.inc | 185 ----- asm/object/objectOnPillar.s | 720 ------------------ assets/assets.json | 15 - data/const/object/objectOnPillar.s | 25 - include/object.h | 2 +- linker.ld | 4 +- src/object/objectOnPillar.c | 303 ++++++++ 8 files changed, 306 insertions(+), 1008 deletions(-) delete mode 100644 asm/non_matching/cuccoChick/sub_0806E7B0.inc delete mode 100644 asm/non_matching/playerItem12/sub_080701F8.inc delete mode 100644 asm/object/objectOnPillar.s delete mode 100644 data/const/object/objectOnPillar.s create mode 100644 src/object/objectOnPillar.c diff --git a/asm/non_matching/cuccoChick/sub_0806E7B0.inc b/asm/non_matching/cuccoChick/sub_0806E7B0.inc deleted file mode 100644 index 5044ade9..00000000 --- a/asm/non_matching/cuccoChick/sub_0806E7B0.inc +++ /dev/null @@ -1,60 +0,0 @@ - .syntax unified - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xd] - cmp r0, #0 - bne _0806E7F2 - adds r0, #1 - strb r0, [r4, #0xd] - bl Random - movs r5, #1 - ands r0, r5 - cmp r0, #0 - beq _0806E7DE - ldrb r0, [r4, #0x18] - lsls r1, r0, #0x19 - lsrs r1, r1, #0x1f - eors r1, r5 - lsls r1, r1, #6 - movs r2, #0x41 - rsbs r2, r2, #0 - ands r2, r0 - orrs r2, r1 - strb r2, [r4, #0x18] -_0806E7DE: - bl Random - movs r1, #3 - ands r0, r1 - adds r0, #1 - strb r0, [r4, #0xe] - movs r0, #0x80 - lsls r0, r0, #9 - str r0, [r4, #0x20] - strb r5, [r4, #0x1e] -_0806E7F2: - movs r1, #0xc0 - lsls r1, r1, #6 - adds r0, r4, #0 - bl GravityUpdate - cmp r0, #0 - bne _0806E81C - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - lsrs r1, r0, #0x18 - cmp r1, #0 - bne _0806E816 - movs r0, #1 - strb r0, [r4, #0xc] - strb r1, [r4, #0xd] - b _0806E81C -_0806E816: - movs r0, #0x80 - lsls r0, r0, #9 - str r0, [r4, #0x20] -_0806E81C: - adds r0, r4, #0 - bl sub_0806E838 - pop {r4, r5, pc} - .syntax divided diff --git a/asm/non_matching/playerItem12/sub_080701F8.inc b/asm/non_matching/playerItem12/sub_080701F8.inc deleted file mode 100644 index 80f1a9ff..00000000 --- a/asm/non_matching/playerItem12/sub_080701F8.inc +++ /dev/null @@ -1,185 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - adds r5, r0, #0 - ldr r0, _08070244 @ =gUnk_0811B9C8 - ldrb r1, [r5, #0x14] - adds r2, r1, r0 - movs r6, #0 - ldrsb r6, [r2, r6] - adds r1, #1 - adds r1, r1, r0 - movs r7, #0 - ldrsb r7, [r1, r7] - adds r0, r5, #0 - movs r1, #0xa - adds r2, r6, #0 - adds r3, r7, #0 - bl sub_08008782 - adds r4, r0, #0 - cmp r4, #0 - beq _08070248 - ldrb r1, [r4, #5] - ldrb r2, [r4, #2] - movs r0, #0x53 - bl CreateObject - adds r1, r0, #0 - cmp r1, #0 - beq _08070260 - ldrb r0, [r4, #3] - strb r0, [r1, #0xe] - ldrh r0, [r5, #0x2e] - adds r0, r0, r6 - strh r0, [r1, #0x2e] - ldrh r0, [r5, #0x32] - adds r0, r0, r7 - strh r0, [r1, #0x32] - b _08070260 - .align 2, 0 -_08070244: .4byte gUnk_0811B9C8 -_08070248: - ldr r0, [r5, #0x74] - subs r0, #1 - str r0, [r5, #0x74] - movs r1, #1 - rsbs r1, r1, #0 - cmp r0, r1 - beq _08070260 - ldr r0, [r5, #0x78] - subs r0, #1 - str r0, [r5, #0x78] - cmp r0, r1 - bne _08070268 -_08070260: - adds r0, r5, #0 - bl sub_08070458 - b _0807037A -_08070268: - adds r0, r5, #0 - bl GetNextFrame - adds r0, r5, #0 - bl LinearMoveUpdate - ldrb r0, [r5, #0xa] - cmp r0, #0 - bne _08070280 - adds r0, r5, #0 - bl sub_0800451C -_08070280: - movs r1, #0x2e - ldrsh r0, [r5, r1] - ldr r7, _08070354 @ =gRoomControls - ldrh r1, [r7, #6] - subs r0, r0, r1 - asrs r0, r0, #4 - movs r6, #0x3f - ands r0, r6 - movs r2, #0x32 - ldrsh r1, [r5, r2] - ldrh r2, [r7, #8] - subs r1, r1, r2 - asrs r1, r1, #4 - ands r1, r6 - lsls r1, r1, #6 - orrs r0, r1 - ldr r1, _08070358 @ =gPlayerEntity - adds r1, #0x38 - ldrb r1, [r1] - movs r2, #0x80 - bl sub_080002F0 - cmp r0, #0 - bne _0807036A - ldr r1, _0807035C @ =gUnk_08003E44 - movs r3, #0x2e - ldrsh r2, [r5, r3] - movs r0, #0x32 - ldrsh r3, [r5, r0] - adds r0, r5, #0 - bl sub_080040D8 - cmp r0, #0 - bne _08070364 - adds r0, r5, #0 - bl sub_080002B8 - cmp r0, #0x19 - bne _0807036A - movs r0, #4 - strb r0, [r5, #0xc] - ldrb r1, [r5, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r5, #0x10] - ldrh r2, [r5, #0x2e] - movs r1, #0x10 - rsbs r1, r1, #0 - adds r0, r1, #0 - ands r0, r2 - movs r2, #8 - orrs r0, r2 - strh r0, [r5, #0x2e] - ldrh r0, [r5, #0x32] - ands r1, r0 - orrs r1, r2 - strh r1, [r5, #0x32] - adds r2, r5, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #7 - orrs r0, r1 - strb r0, [r2] - movs r1, #0x2e - ldrsh r0, [r5, r1] - ldrh r1, [r7, #6] - subs r0, r0, r1 - asrs r0, r0, #4 - ands r0, r6 - movs r2, #0x32 - ldrsh r1, [r5, r2] - ldrh r2, [r7, #8] - subs r1, r1, r2 - asrs r1, r1, #4 - ands r1, r6 - lsls r1, r1, #6 - orrs r0, r1 - adds r4, r5, #0 - adds r4, #0x38 - ldrb r1, [r4] - bl GetTileIndex - str r0, [r5, #0x7c] - adds r0, r5, #0 - movs r1, #0x14 - bl InitializeAnimation - ldr r0, _08070360 @ =0x00004020 - movs r3, #0x2e - ldrsh r1, [r5, r3] - ldrh r2, [r7, #6] - subs r1, r1, r2 - asrs r1, r1, #4 - ands r1, r6 - movs r3, #0x32 - ldrsh r2, [r5, r3] - ldrh r3, [r7, #8] - subs r2, r2, r3 - asrs r2, r2, #4 - ands r2, r6 - lsls r2, r2, #6 - orrs r1, r2 - ldrb r2, [r4] - bl SetTile - b _0807037A - .align 2, 0 -_08070354: .4byte gRoomControls -_08070358: .4byte gPlayerEntity -_0807035C: .4byte gUnk_08003E44 -_08070360: .4byte 0x00004020 -_08070364: - adds r0, r5, #0 - bl sub_08070458 -_0807036A: - adds r0, r5, #0 - adds r0, #0x41 - ldrb r0, [r0] - cmp r0, #0 - beq _0807037A - adds r0, r5, #0 - bl sub_08070458 -_0807037A: - pop {r4, r5, r6, r7, pc} - .syntax divided diff --git a/asm/object/objectOnPillar.s b/asm/object/objectOnPillar.s deleted file mode 100644 index 72b706fa..00000000 --- a/asm/object/objectOnPillar.s +++ /dev/null @@ -1,720 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start ObjectOnPillar -ObjectOnPillar: @ 0x08096E10 - push {lr} - ldr r2, _08096E24 @ =gUnk_08123250 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08096E24: .4byte gUnk_08123250 - - thumb_func_start sub_08096E28 -sub_08096E28: @ 0x08096E28 - push {r4, r5, lr} - adds r4, r0, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - adds r5, r0, #0 - cmp r5, #0 - bne _08096EBC - movs r2, #1 - movs r3, #1 - strb r3, [r4, #0xc] - movs r0, #0x80 - strh r0, [r4, #0x24] - ldrb r1, [r4, #0x11] - subs r0, #0x90 - ands r0, r1 - movs r1, #3 - orrs r0, r1 - strb r0, [r4, #0x11] - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - orrs r0, r2 - strb r0, [r4, #0x18] - 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, #0x10 - orrs r0, r1 - strb r0, [r4, #0x18] - adds r1, r4, #0 - adds r1, #0x63 - movs r0, #4 - strb r0, [r1] - ldr r0, _08096EB4 @ =gUnk_080FD1F4 - str r0, [r4, #0x48] - strb r3, [r4, #0x16] - adds r0, r4, #0 - adds r0, #0x72 - strh r5, [r0] - adds r0, #0xb - ldrb r0, [r0] - lsrs r0, r0, #4 - subs r1, #0x2b - strb r0, [r1] - adds r0, r4, #0 - bl UpdateSpriteForCollisionLayer - adds r0, r4, #0 - bl sub_080970F4 - ldr r1, _08096EB8 @ =gUnk_08123264 - ldrb r0, [r4, #0xa] - adds r0, r0, r1 - ldrb r0, [r0] - strb r0, [r4, #0x1e] - b _08096F04 - .align 2, 0 -_08096EB4: .4byte gUnk_080FD1F4 -_08096EB8: .4byte gUnk_08123264 -_08096EBC: - adds r0, r4, #0 - adds r0, #0x7c - ldrb r2, [r0] - adds r0, #1 - ldrb r3, [r0] - movs r1, #0xf - adds r0, r1, #0 - ands r0, r3 - lsls r0, r0, #8 - ldr r3, _08096F08 @ =gRoomControls - orrs r2, r0 - ldrh r0, [r3, #6] - adds r2, r2, r0 - strh r2, [r4, #0x2e] - adds r0, r4, #0 - adds r0, #0x7e - ldrb r0, [r0] - movs r2, #0x7f - adds r2, r2, r4 - mov ip, r2 - ldrb r2, [r2] - ands r1, r2 - lsls r1, r1, #8 - orrs r0, r1 - ldrh r3, [r3, #8] - adds r0, r0, r3 - strh r0, [r4, #0x32] - mov r5, ip - ldrb r0, [r5] - lsrs r0, r0, #4 - adds r1, r4, #0 - adds r1, #0x38 - strb r0, [r1] - adds r0, r4, #0 - bl sub_080971E0 -_08096F04: - pop {r4, r5, pc} - .align 2, 0 -_08096F08: .4byte gRoomControls - - thumb_func_start sub_08096F0C -sub_08096F0C: @ 0x08096F0C - push {r4, lr} - adds r4, r0, #0 - bl sub_08097194 - cmp r0, #0 - bne _08096F2E - adds r0, r4, #0 - bl sub_08097008 - cmp r0, #0 - beq _08096F28 - movs r0, #3 - strb r0, [r4, #0xc] - b _08096F2E -_08096F28: - adds r0, r4, #0 - bl sub_08078930 -_08096F2E: - pop {r4, pc} - - thumb_func_start sub_08096F30 -sub_08096F30: @ 0x08096F30 - push {lr} - adds r2, r0, #0 - adds r0, #0x76 - ldrh r0, [r0] - cmp r0, #0 - beq _08096F44 - adds r0, r2, #0 - bl sub_08097144 - b _08096F62 -_08096F44: - ldr r0, _08096F64 @ =gPlayerState - ldrb r0, [r0, #5] - cmp r0, #0 - bne _08096F50 - movs r0, #6 - strb r0, [r2, #0xd] -_08096F50: - ldr r0, _08096F68 @ =gUnk_0812326C - ldrb r1, [r2, #0xd] - subs r1, #5 - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r2, #0 - bl _call_via_r1 -_08096F62: - pop {pc} - .align 2, 0 -_08096F64: .4byte gPlayerState -_08096F68: .4byte gUnk_0812326C - - thumb_func_start sub_08096F6C -sub_08096F6C: @ 0x08096F6C - push {r4, lr} - adds r4, r0, #0 - adds r1, r4, #0 - adds r1, #0x72 - ldrh r0, [r1] - cmp r0, #0 - bne _08096F98 - movs r0, #1 - strh r0, [r1] - ldr r1, _08096FD8 @ =gPlayerEntity - ldrb r0, [r1, #0x14] - ldr r2, _08096FDC @ =gUnk_08123274 - adds r0, r0, r2 - movs r2, #0 - ldrsb r2, [r0, r2] - lsls r2, r2, #0x10 - movs r3, #1 - ldrsb r3, [r0, r3] - lsls r3, r3, #0x10 - adds r0, r4, #0 - bl PositionRelative -_08096F98: - adds r0, r4, #0 - bl sub_08097008 - bl sub_080896B0 - cmp r0, #0 - beq _08096FD4 - ldr r2, _08096FE0 @ =gPlayerState - movs r3, #0 - movs r0, #0x10 - strb r0, [r2, #0xc] - adds r1, r2, #0 - adds r1, #0x38 - movs r0, #0x20 - strb r0, [r1] - ldr r0, [r2, #0x30] - movs r1, #1 - orrs r0, r1 - str r0, [r2, #0x30] - ldr r0, _08096FD8 @ =gPlayerEntity - strh r3, [r0, #0x2c] - strh r3, [r0, #0x30] - ldrb r0, [r0, #0x14] - movs r1, #4 - eors r0, r1 - lsls r0, r0, #2 - strb r0, [r4, #0x15] - adds r0, r4, #0 - bl sub_08097098 -_08096FD4: - pop {r4, pc} - .align 2, 0 -_08096FD8: .4byte gPlayerEntity -_08096FDC: .4byte gUnk_08123274 -_08096FE0: .4byte gPlayerState - - thumb_func_start sub_08096FE4 -sub_08096FE4: @ 0x08096FE4 - movs r2, #0 - movs r1, #1 - strb r1, [r0, #0xc] - adds r0, #0x72 - strh r2, [r0] - bx lr - - thumb_func_start sub_08096FF0 -sub_08096FF0: @ 0x08096FF0 - push {r4, lr} - adds r4, r0, #0 - bl sub_08097144 - cmp r0, #0 - beq _08097000 - movs r0, #1 - strb r0, [r4, #0xc] -_08097000: - pop {r4, pc} - .align 2, 0 - - thumb_func_start nullsub_122 -nullsub_122: @ 0x08097004 - bx lr - .align 2, 0 - - thumb_func_start sub_08097008 -sub_08097008: @ 0x08097008 - push {r4, r5, lr} - adds r5, r0, #0 - adds r0, #0x74 - ldrh r0, [r0] - adds r1, r5, #0 - adds r1, #0x38 - ldrb r1, [r1] - bl GetTileType - adds r4, r0, #0 - ldr r0, _08097048 @ =0x00004036 - cmp r4, r0 - beq _08097070 - adds r0, r4, #0 - bl sub_08097074 - cmp r0, #1 - beq _0809704C - cmp r0, #2 - beq _08097062 - movs r0, #0xf - movs r1, #4 - movs r2, #0 - bl CreateObject - adds r1, r0, #0 - cmp r1, #0 - beq _0809706A - adds r0, r5, #0 - bl CopyPosition - b _0809706A - .align 2, 0 -_08097048: .4byte 0x00004036 -_0809704C: - adds r0, r4, #0 - subs r0, #0x37 - movs r1, #3 - ands r0, r1 - lsls r0, r0, #3 - strb r0, [r5, #0x15] - adds r0, r5, #0 - bl sub_08097098 - movs r0, #1 - b _08097072 -_08097062: - adds r0, r5, #0 - adds r0, #0x70 - strh r4, [r0] - b _08097070 -_0809706A: - adds r0, r5, #0 - bl DeleteEntity -_08097070: - movs r0, #0 -_08097072: - pop {r4, r5, pc} - - thumb_func_start sub_08097074 -sub_08097074: @ 0x08097074 - push {lr} - adds r2, r0, #0 - ldr r1, _0809707C @ =gUnk_0812327C - b _0809708C - .align 2, 0 -_0809707C: .4byte gUnk_0812327C -_08097080: - ldrh r0, [r1] - cmp r0, r2 - bne _0809708A - ldrh r0, [r1, #2] - b _08097094 -_0809708A: - adds r1, #4 -_0809708C: - ldrh r0, [r1] - cmp r0, #0 - bne _08097080 - movs r0, #0 -_08097094: - pop {pc} - .align 2, 0 - - thumb_func_start sub_08097098 -sub_08097098: @ 0x08097098 - push {r4, r5, r6, lr} - adds r6, r0, #0 - adds r1, r6, #0 - adds r1, #0x76 - movs r0, #0x20 - strh r0, [r1] - adds r0, #0xef - bl EnqueueSFX - adds r0, r6, #0 - adds r0, #0x70 - ldrh r0, [r0] - adds r5, r6, #0 - adds r5, #0x74 - ldrh r1, [r5] - adds r4, r6, #0 - adds r4, #0x38 - ldrb r2, [r4] - bl SetTile - ldr r1, _080970F0 @ =gUnk_080B4488 - ldrb r0, [r6, #0x15] - lsrs r0, r0, #3 - lsls r0, r0, #1 - adds r0, r0, r1 - movs r1, #0 - ldrsh r0, [r0, r1] - ldrh r5, [r5] - adds r0, r0, r5 - ldrb r1, [r4] - bl GetTileType - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - cmp r0, #0x79 - beq _080970E4 - cmp r0, #0x77 - bne _080970EC -_080970E4: - adds r1, r6, #0 - adds r1, #0x63 - movs r0, #2 - strb r0, [r1] -_080970EC: - pop {r4, r5, r6, pc} - .align 2, 0 -_080970F0: .4byte gUnk_080B4488 - - thumb_func_start sub_080970F4 -sub_080970F4: @ 0x080970F4 - push {r4, r5, r6, lr} - adds r6, r0, #0 - movs r0, #0x2e - ldrsh r1, [r6, r0] - ldr r2, _0809713C @ =gRoomControls - ldrh r0, [r2, #6] - subs r1, r1, r0 - asrs r1, r1, #4 - movs r3, #0x3f - ands r1, r3 - movs r4, #0x32 - ldrsh r0, [r6, r4] - ldrh r2, [r2, #8] - subs r0, r0, r2 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r1, r0 - adds r4, r6, #0 - adds r4, #0x74 - strh r1, [r4] - ldrh r0, [r4] - adds r5, r6, #0 - adds r5, #0x38 - ldrb r1, [r5] - bl GetTileIndex - adds r1, r6, #0 - adds r1, #0x70 - strh r0, [r1] - ldr r0, _08097140 @ =0x00004036 - ldrh r1, [r4] - ldrb r2, [r5] - bl SetTile - pop {r4, r5, r6, pc} - .align 2, 0 -_0809713C: .4byte gRoomControls -_08097140: .4byte 0x00004036 - - thumb_func_start sub_08097144 -sub_08097144: @ 0x08097144 - push {r4, lr} - adds r4, r0, #0 - bl LinearMoveUpdate - adds r0, r4, #0 - bl sub_0800445C - adds r0, r4, #0 - bl sub_080002B8 - cmp r0, #0x19 - bne _08097164 - adds r1, r4, #0 - adds r1, #0x63 - movs r0, #2 - strb r0, [r1] -_08097164: - adds r1, r4, #0 - adds r1, #0x76 - ldrh r0, [r1] - subs r0, #1 - strh r0, [r1] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _08097190 - adds r0, r4, #0 - bl sub_08097194 - cmp r0, #0 - bne _08097190 - adds r1, r4, #0 - adds r1, #0x63 - movs r0, #4 - strb r0, [r1] - adds r0, r4, #0 - bl sub_080970F4 - movs r0, #1 - b _08097192 -_08097190: - movs r0, #0 -_08097192: - pop {r4, pc} - - thumb_func_start sub_08097194 -sub_08097194: @ 0x08097194 - push {r4, lr} - adds r4, r0, #0 - bl sub_0800442E - cmp r0, #0 - beq _080971A4 - movs r0, #1 - b _080971DE -_080971A4: - adds r0, r4, #0 - bl GetTileTypeByEntity - adds r1, r0, #0 - subs r0, #0x71 - cmp r0, #1 - bls _080971B8 - ldr r0, _080971D4 @ =0x00004020 - cmp r1, r0 - bne _080971DC -_080971B8: - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl SetFlag - ldr r0, _080971D8 @ =0x0000010B - bl EnqueueSFX - adds r0, r4, #0 - bl sub_080971E0 - movs r0, #1 - b _080971DE - .align 2, 0 -_080971D4: .4byte 0x00004020 -_080971D8: .4byte 0x0000010B -_080971DC: - movs r0, #0 -_080971DE: - pop {r4, pc} - - thumb_func_start sub_080971E0 -sub_080971E0: @ 0x080971E0 - push {r4, r5, lr} - adds r5, r0, #0 - movs r0, #0xf - movs r1, #0x11 - movs r2, #0x40 - bl CreateObject - adds r4, r0, #0 - cmp r4, #0 - beq _08097202 - ldr r2, _0809727C @ =0xFFF80000 - movs r3, #0x80 - lsls r3, r3, #0xa - adds r0, r5, #0 - adds r1, r4, #0 - bl PositionRelative -_08097202: - movs r0, #0xf - movs r1, #0x11 - movs r2, #0x40 - bl CreateObject - adds r4, r0, #0 - cmp r4, #0 - beq _08097222 - movs r2, #0x80 - lsls r2, r2, #0xc - movs r3, #0x80 - lsls r3, r3, #0xa - adds r0, r5, #0 - adds r1, r4, #0 - bl PositionRelative -_08097222: - ldrb r0, [r5, #0xa] - cmp r0, #1 - beq _08097284 - cmp r0, #1 - ble _08097234 - cmp r0, #2 - beq _080972C4 - cmp r0, #3 - beq _08097304 -_08097234: - movs r0, #4 - strb r0, [r5, #0xc] - movs r0, #1 - strb r0, [r5, #0x1e] - adds r2, r5, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #7 - orrs r0, r1 - strb r0, [r2] - movs r0, #0x2e - ldrsh r1, [r5, r0] - ldr r2, _08097280 @ =gRoomControls - ldrh r0, [r2, #6] - subs r1, r1, r0 - asrs r1, r1, #4 - movs r3, #0x3f - ands r1, r3 - movs r4, #0x32 - ldrsh r0, [r5, r4] - ldrh r2, [r2, #8] - subs r0, r0, r2 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r1, r0 - adds r0, r5, #0 - adds r0, #0x38 - ldrb r2, [r0] - movs r0, #0 - bl SetTile -_08097274: - bl DeleteThisEntity - b _08097346 - .align 2, 0 -_0809727C: .4byte 0xFFF80000 -_08097280: .4byte gRoomControls -_08097284: - movs r1, #0x2e - ldrsh r0, [r5, r1] - ldr r3, _080972C0 @ =gRoomControls - ldrh r1, [r3, #6] - subs r0, r0, r1 - asrs r4, r0, #4 - movs r2, #0x3f - ands r4, r2 - movs r1, #0x32 - ldrsh r0, [r5, r1] - ldrh r1, [r3, #8] - subs r0, r0, r1 - asrs r0, r0, #4 - ands r0, r2 - lsls r0, r0, #6 - orrs r4, r0 - adds r0, r4, #0 - bl sub_08097348 - cmp r0, #0 - bne _08097274 - adds r0, r5, #0 - adds r0, #0x38 - ldrb r2, [r0] - movs r0, #0x73 - adds r1, r4, #0 - bl SetTileType - b _08097274 - .align 2, 0 -_080972C0: .4byte gRoomControls -_080972C4: - movs r0, #0x2f - movs r1, #0 - movs r2, #0 - bl CreateObject - adds r4, r0, #0 - cmp r4, #0 - beq _08097274 - ldrh r2, [r5, #0x2e] - movs r1, #0x10 - rsbs r1, r1, #0 - adds r0, r1, #0 - ands r0, r2 - adds r0, #8 - strh r0, [r4, #0x2e] - ldrh r0, [r5, #0x32] - ands r1, r0 - adds r1, #8 - strh r1, [r4, #0x32] - adds r0, r5, #0 - adds r0, #0x38 - ldrb r1, [r0] - adds r0, r4, #0 - adds r0, #0x38 - strb r1, [r0] - adds r0, r5, #0 - adds r0, #0x84 - ldrh r1, [r0] - adds r0, r4, #0 - adds r0, #0x86 - strh r1, [r0] - b _08097274 -_08097304: - movs r0, #0x2f - movs r1, #1 - movs r2, #0 - bl CreateObject - adds r4, r0, #0 - cmp r4, #0 - beq _08097342 - ldrh r2, [r5, #0x2e] - movs r1, #0x10 - rsbs r1, r1, #0 - adds r0, r1, #0 - ands r0, r2 - adds r0, #8 - strh r0, [r4, #0x2e] - ldrh r0, [r5, #0x32] - ands r1, r0 - adds r1, #8 - strh r1, [r4, #0x32] - adds r0, r5, #0 - adds r0, #0x38 - ldrb r1, [r0] - adds r0, r4, #0 - adds r0, #0x38 - strb r1, [r0] - adds r0, r5, #0 - adds r0, #0x84 - ldrh r1, [r0] - adds r0, r4, #0 - adds r0, #0x86 - strh r1, [r0] -_08097342: - bl DeleteThisEntity -_08097346: - pop {r4, r5, pc} - - thumb_func_start sub_08097348 -sub_08097348: @ 0x08097348 - push {lr} - adds r3, r0, #0 - ldr r1, _08097360 @ =gSmallChests - movs r2, #0 -_08097350: - ldrh r0, [r1, #4] - cmp r0, r3 - bne _08097364 - ldrb r0, [r1, #1] - bl CheckLocalFlag - b _0809736E - .align 2, 0 -_08097360: .4byte gSmallChests -_08097364: - adds r2, #1 - adds r1, #8 - cmp r2, #7 - bls _08097350 - movs r0, #0 -_0809736E: - pop {pc} diff --git a/assets/assets.json b/assets/assets.json index 9e7c26d2..b94cde6d 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -44913,21 +44913,6 @@ "start": 1192372, "size": 6 }, - { - "path": "objectOnPillar/gUnk_08123264.bin", - "start": 1192548, - "size": 8 - }, - { - "path": "objectOnPillar/gUnk_08123274.bin", - "start": 1192564, - "size": 8 - }, - { - "path": "objectOnPillar/gUnk_0812327C.bin", - "start": 1192572, - "size": 28 - }, { "path": "mineralWaterSource/MineralWaterSourceParameters.bin", "start": 1192608, diff --git a/data/const/object/objectOnPillar.s b/data/const/object/objectOnPillar.s deleted file mode 100644 index 40bc4940..00000000 --- a/data/const/object/objectOnPillar.s +++ /dev/null @@ -1,25 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08123250:: @ 08123250 - .4byte sub_08096E28 - .4byte sub_08096F0C - .4byte sub_08096F30 - .4byte sub_08096FF0 - .4byte nullsub_122 - -gUnk_08123264:: @ 08123264 - .incbin "objectOnPillar/gUnk_08123264.bin" - -gUnk_0812326C:: @ 0812326C - .4byte sub_08096F6C - .4byte sub_08096FE4 - -gUnk_08123274:: @ 08123274 - .incbin "objectOnPillar/gUnk_08123274.bin" - -gUnk_0812327C:: @ 0812327C - .incbin "objectOnPillar/gUnk_0812327C.bin" diff --git a/include/object.h b/include/object.h index 72120f5e..b728782f 100644 --- a/include/object.h +++ b/include/object.h @@ -335,7 +335,7 @@ void Object69(Entity*); void Object6A(Entity*); void CrenalBeanSprout(Entity*); void MinecartDoor(Entity*); -void ObjectOnPillar(Entity*); +void ObjectOnPillar(); void MineralWaterSource(Entity*); void MinishSizedArchway(Entity*); void Object70(Entity*); diff --git a/linker.ld b/linker.ld index 6d739c7a..55fa9325 100644 --- a/linker.ld +++ b/linker.ld @@ -757,7 +757,7 @@ SECTIONS { src/object/object6A.o(.text); asm/object/crenalBeanSprout.o(.text); asm/object/minecartDoor.o(.text); - asm/object/objectOnPillar.o(.text); + src/object/objectOnPillar.o(.text); src/object/mineralWaterSource.o(.text); src/object/minishSizedArchway.o(.text); asm/object/object70.o(.text); @@ -1504,7 +1504,7 @@ SECTIONS { data/const/object/crenalBeanSprout.o(.rodata); data/animations/object/crenalBeanSprout.o(.rodata); data/const/object/minecartDoor.o(.rodata); - data/const/object/objectOnPillar.o(.rodata); + src/object/objectOnPillar.o(.rodata); data/const/object/mineralWaterSource.o(.rodata); data/const/object/object70.o(.rodata); src/object/pushableGrave.o(.rodata); diff --git a/src/object/objectOnPillar.c b/src/object/objectOnPillar.c new file mode 100644 index 00000000..2aa53237 --- /dev/null +++ b/src/object/objectOnPillar.c @@ -0,0 +1,303 @@ +/** + * @file objectOnPillar.c + * @ingroup Objects + * + * @brief Object on Pillar object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68[8]; + /*0x70*/ u16 tileIndex; + /*0x72*/ u16 unk_72; + /*0x74*/ u16 tilePosition; + /*0x76*/ u16 unk_76; + /*0x78*/ u8 unk_78[0x4]; + /*0x7c*/ u8 unk_7c; + /*0x7d*/ u8 unk_7d; + /*0x7e*/ u8 unk_7e; + /*0x7f*/ u8 unk_7f; + /*0x80*/ u8 unk_80[0x4]; + /*0x84*/ u16 hitFlag; + /*0x86*/ u16 unk_86; +} ObjectOnPillarEntity; + +extern bool32 sub_080896B0(void); // pushableStatue + +extern Hitbox gUnk_080FD1F4; +extern s16 gUnk_080B4488[]; + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68[10 + 0x14]; + /*0x86*/ u16 hitFlag; +} EntityWithHitFlag; + +typedef struct { + u16 key; + u16 value; +} KeyValuePair; + +void sub_080970F4(ObjectOnPillarEntity*); +void sub_080971E0(ObjectOnPillarEntity*); +bool32 sub_08097194(ObjectOnPillarEntity*); +bool32 sub_08097008(ObjectOnPillarEntity*); +bool32 sub_08097144(ObjectOnPillarEntity*); +void sub_08097098(ObjectOnPillarEntity*); +u32 sub_08097074(u32); +bool32 sub_08097348(u32); +void ObjectOnPillar_Init(ObjectOnPillarEntity*); +void ObjectOnPillar_Action1(ObjectOnPillarEntity*); +void ObjectOnPillar_Action2(ObjectOnPillarEntity*); +void ObjectOnPillar_Action3(ObjectOnPillarEntity*); +void ObjectOnPillar_Action4(ObjectOnPillarEntity*); +void ObjectOnPillar_SubAction0(ObjectOnPillarEntity*); +void ObjectOnPillar_SubAction1(ObjectOnPillarEntity*); + +void ObjectOnPillar(ObjectOnPillarEntity* this) { + static void (*const ObjectOnPillar_Actions[])(ObjectOnPillarEntity*) = { + ObjectOnPillar_Init, ObjectOnPillar_Action1, ObjectOnPillar_Action2, + ObjectOnPillar_Action3, ObjectOnPillar_Action4, + }; + ObjectOnPillar_Actions[super->action](this); +} + +void ObjectOnPillar_Init(ObjectOnPillarEntity* this) { + static const u8 gUnk_08123264[] = { + 0, 2, 4, 3, 7, 5, 0, 0, + }; + if (CheckFlags(this->unk_86) == 0) { + super->action = 1; + super->speed = 0x80; + super->updatePriority = 3; + super->spriteSettings.draw = 1; + super->spritePriority.b1 = 1; + super->spriteSettings.shadow = 1; + super->spriteOffsetY = 4; + super->hitbox = (Hitbox*)&gUnk_080FD1F4; + super->field_0x16 = 1; + this->unk_72 = 0; + super->collisionLayer = this->unk_7d >> 4; + UpdateSpriteForCollisionLayer(super); + sub_080970F4(this); + super->frameIndex = gUnk_08123264[super->type]; + } else { + super->x.HALF.HI = (this->unk_7c | ((this->unk_7d & 0xf) << 8)) + gRoomControls.origin_x; + super->y.HALF.HI = (this->unk_7e | ((this->unk_7f & 0xf) << 8)) + gRoomControls.origin_y; + super->collisionLayer = this->unk_7f >> 4; + sub_080971E0(this); + } +} + +void ObjectOnPillar_Action1(ObjectOnPillarEntity* this) { + if (sub_08097194(this) == FALSE) { + if (sub_08097008(this)) { + super->action = 3; + } else { + sub_08078930(super); + } + } +} + +void ObjectOnPillar_Action2(ObjectOnPillarEntity* this) { + static void (*const ObjectOnPillar_SubActions[])(ObjectOnPillarEntity*) = { + ObjectOnPillar_SubAction0, + ObjectOnPillar_SubAction1, + }; + if (this->unk_76 != 0) { + sub_08097144(this); + } else { + if (gPlayerState.heldObject == 0) { + super->subAction = 6; + } + ObjectOnPillar_SubActions[super->subAction - 5](this); + } +} + +void ObjectOnPillar_SubAction0(ObjectOnPillarEntity* this) { + static const s8 gUnk_08123274[] = { 0, 14, -14, 2, 0, -14, 14, 2 }; + const s8* ptr; + if (this->unk_72 == 0) { + this->unk_72 = 1; + ptr = &gUnk_08123274[gPlayerEntity.animationState]; + PositionRelative(super, &gPlayerEntity, ptr[0] << 0x10, ptr[1] << 0x10); + } + sub_08097008(this); + if (sub_080896B0()) { + gPlayerState.queued_action = 0x10; + gPlayerState.field_0x38 = 0x20; + gPlayerState.flags |= PL_BUSY; + gPlayerEntity.x.HALF.LO = 0; + gPlayerEntity.y.HALF.LO = 0; + super->direction = ((gPlayerEntity.animationState ^ 4) << 2); + sub_08097098(this); + } +} + +void ObjectOnPillar_SubAction1(ObjectOnPillarEntity* this) { + super->action = 1; + this->unk_72 = 0; +} + +void ObjectOnPillar_Action3(ObjectOnPillarEntity* this) { + if (sub_08097144(this)) { + super->action = 1; + } +} + +void ObjectOnPillar_Action4(ObjectOnPillarEntity* this) { +} + +bool32 sub_08097008(ObjectOnPillarEntity* this) { + Entity* effect; + u32 tileType = GetTileType(this->tilePosition, super->collisionLayer); + if (tileType != 0x4036) { + switch (sub_08097074(tileType)) { + case 1: + super->direction = (((tileType - 0x37) & 3) << 3); + sub_08097098(this); + return TRUE; + case 2: + this->tileIndex = tileType; + break; + default: + effect = CreateObject(SPECIAL_FX, 4, 0); + if (effect != NULL) { + CopyPosition(super, effect); + } + DeleteEntity(super); + break; + } + } + return FALSE; +} + +u32 sub_08097074(u32 tileType) { + + static const KeyValuePair gUnk_0812327C[] = { + { 0x4037, 1 }, { 0x4038, 1 }, { 0x4039, 1 }, { 0x403a, 1 }, { 0x7a, 2 }, { 0x78, 2 }, { 0, 0 }, + }; + const KeyValuePair* entry = gUnk_0812327C; + for (; entry->key != 0; entry++) { + if (entry->key == tileType) { + return entry->value; + } + } + return 0; +} + +void sub_08097098(ObjectOnPillarEntity* this) { + u16 tileType; + this->unk_76 = 0x20; + EnqueueSFX(SFX_10F); + SetTile(this->tileIndex, this->tilePosition, super->collisionLayer); + tileType = GetTileType(gUnk_080B4488[super->direction >> 3] + this->tilePosition, super->collisionLayer); + if ((tileType == 0x79) || tileType == 0x77) { + super->spriteOffsetY = 2; + } +} + +void sub_080970F4(ObjectOnPillarEntity* this) { + this->tilePosition = COORD_TO_TILE(super); + this->tileIndex = GetTileIndex(this->tilePosition, super->collisionLayer); + SetTile(0x4036, this->tilePosition, super->collisionLayer); +} + +bool32 sub_08097144(ObjectOnPillarEntity* this) { + LinearMoveUpdate(super); + sub_0800445C(super); + if (sub_080002B8(super) == 0x19) { + super->spriteOffsetY = 2; + } + if ((--this->unk_76 == 0) && sub_08097194(this) == FALSE) { + super->spriteOffsetY = 4; + sub_080970F4(this); + return TRUE; + } else { + return FALSE; + } +} + +bool32 sub_08097194(ObjectOnPillarEntity* this) { + if (sub_0800442E(super)) { + return TRUE; + } else { + u32 tileType = GetTileTypeByEntity(super); + if (tileType == 0x71 || tileType == 0x72 || (tileType == 0x4020)) { + SetFlag(this->unk_86); + EnqueueSFX(SFX_10B); + sub_080971E0(this); + return TRUE; + } else { + return FALSE; + } + } + return FALSE; +} + +void sub_080971E0(ObjectOnPillarEntity* this) { + EntityWithHitFlag* entity; + u32 tilePosition; + + entity = (EntityWithHitFlag*)CreateObject(SPECIAL_FX, 0x11, 0x40); + if (entity != NULL) { + PositionRelative(super, &entity->base, -0x80000, 0x20000); + } + entity = (EntityWithHitFlag*)CreateObject(SPECIAL_FX, 0x11, 0x40); + if (entity != NULL) { + PositionRelative(super, &entity->base, 0x80000, 0x20000); + } + switch (super->type) { + case 0: + default: + super->action = 4; + super->frameIndex = 1; + super->spritePriority.b0 = 7; + SetTile(0, COORD_TO_TILE(super), super->collisionLayer); + DeleteThisEntity(); + break; + case 1: + tilePosition = COORD_TO_TILE(super); + if (sub_08097348(tilePosition) == 0) { + SetTileType(0x73, tilePosition, super->collisionLayer); + } + DeleteThisEntity(); + break; + case 2: + entity = (EntityWithHitFlag*)CreateObject(HITTABLE_LEVER, 0, 0); + if (entity != NULL) { + (entity->base).x.HALF.HI = (super->x.HALF.HI & 0xfff0) + 8; + (entity->base).y.HALF.HI = (super->y.HALF.HI & 0xfff0) + 8; + (entity->base).collisionLayer = super->collisionLayer; + entity->hitFlag = this->hitFlag; + } + DeleteThisEntity(); + break; + case 3: + entity = (EntityWithHitFlag*)CreateObject(HITTABLE_LEVER, 1, 0); + if (entity != NULL) { + (entity->base).x.HALF.HI = (super->x.HALF.HI & 0xfff0) + 8; + (entity->base).y.HALF.HI = (super->y.HALF.HI & 0xfff0) + 8; + (entity->base).collisionLayer = super->collisionLayer; + entity->hitFlag = this->hitFlag; + } + DeleteThisEntity(); + break; + } +} + +bool32 sub_08097348(u32 tilePosition) { + u32 index; + TileEntity* tileEntity = gSmallChests; + for (index = 0; index < 8; index++, tileEntity++) { + if (tileEntity->_4 == tilePosition) { + return CheckLocalFlag(tileEntity->_1); + } + } + return FALSE; +} From 3a27a147ad050ba2eef093d1353e7dd37dff8c8d Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Sun, 13 Feb 2022 19:54:05 +0100 Subject: [PATCH 04/10] Decompile ChestSpawner --- asm/object/chestSpawner.s | 649 ------------------------------- assets/assets.json | 45 --- data/const/object/chestSpawner.s | 64 --- include/functions.h | 8 + include/object.h | 2 +- linker.ld | 3 +- src/enemy/octorokBoss.c | 1 - src/manager/manager3.c | 2 +- src/npc/npc23.c | 1 - src/object/chestSpawner.c | 322 ++++++++++++++- src/object/houseDoorExterior.c | 1 - src/object/jarPortal.c | 1 - 12 files changed, 315 insertions(+), 784 deletions(-) delete mode 100644 asm/object/chestSpawner.s delete mode 100644 data/const/object/chestSpawner.s diff --git a/asm/object/chestSpawner.s b/asm/object/chestSpawner.s deleted file mode 100644 index 24092230..00000000 --- a/asm/object/chestSpawner.s +++ /dev/null @@ -1,649 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_08083E4C -sub_08083E4C: @ 0x08083E4C - push {r4, lr} - adds r4, r0, #0 - ldr r0, _08083E80 @ =gUnk_0811F8B0 - str r0, [r4, #0x48] - ldrb r0, [r4, #0xb] - bl CheckLocalFlag - cmp r0, #0 - beq _08083E84 - 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, #5 - strb r0, [r4, #0xc] - adds r0, r4, #0 - bl sub_080842D8 - adds r0, r4, #0 - movs r1, #1 - bl InitializeAnimation - b _08083EAC - .align 2, 0 -_08083E80: .4byte gUnk_0811F8B0 -_08083E84: - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - bne _08083E98 - ldrb r0, [r4, #0xa] - cmp r0, #4 - bne _08083EA0 -_08083E98: - adds r0, r4, #0 - bl sub_08083E20 - b _08083EA4 -_08083EA0: - movs r0, #1 - strb r0, [r4, #0xc] -_08083EA4: - adds r0, r4, #0 - movs r1, #0 - bl InitializeAnimation -_08083EAC: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08083EB0 -sub_08083EB0: @ 0x08083EB0 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - beq _08083F0A - ldr r1, _08083F0C @ =gScreen - adds r2, r1, #0 - adds r2, #0x66 - movs r3, #0 - movs r0, #0xf4 - lsls r0, r0, #4 - strh r0, [r2] - adds r1, #0x68 - adds r0, #0xc0 - strh r0, [r1] - ldr r1, _08083F10 @ =gUnk_02034490 - movs r2, #1 - movs r0, #1 - strb r0, [r1] - movs r0, #2 - strb r0, [r4, #0xc] - strb r3, [r4, #0xd] - movs r0, #0x1e - strb r0, [r4, #0xf] - ldrb r1, [r4, #0x18] - subs r0, #0x22 - ands r0, r1 - orrs r0, r2 - strb r0, [r4, #0x18] - ldrb r1, [r4, #0x19] - movs r0, #0xd - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #4 - orrs r0, r1 - strb r0, [r4, #0x19] - adds r0, r4, #0 - movs r1, #0x1e - bl RequestPriorityDuration - bl sub_0805BC4C -_08083F0A: - pop {r4, pc} - .align 2, 0 -_08083F0C: .4byte gScreen -_08083F10: .4byte gUnk_02034490 - - thumb_func_start sub_08083F14 -sub_08083F14: @ 0x08083F14 - push {r4, r5, lr} - adds r4, r0, #0 - movs r0, #0x1e - bl SetPriorityTimer - ldrb r0, [r4, #0xd] - cmp r0, #0 - beq _08083F78 - cmp r0, #1 - beq _08083FA4 - adds r0, r4, #0 - bl sub_0800445C - movs r1, #0x2e - ldrsh r0, [r4, r1] - movs r2, #0x32 - ldrsh r1, [r4, r2] - movs r2, #2 - bl CreateMagicSparkles - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - movs r2, #0xff - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08083FE6 - movs r0, #8 - strb r0, [r4, #0xe] - ldrb r0, [r4, #0xf] - adds r0, #1 - strb r0, [r4, #0xf] - ands r2, r0 - ldr r3, _08083F74 @ =gScreen - movs r0, #0x10 - subs r0, r0, r2 - lsls r0, r0, #8 - movs r5, #0xff - lsls r5, r5, #8 - adds r1, r5, #0 - ands r0, r1 - orrs r0, r2 - adds r1, r3, #0 - adds r1, #0x68 - strh r0, [r1] - cmp r0, #0x10 - bne _08083FE6 - b _08083FCC - .align 2, 0 -_08083F74: .4byte gScreen -_08083F78: - ldr r5, _08083FA0 @ =gPlayerEntity - adds r0, r4, #0 - adds r1, r5, #0 - movs r2, #0x10 - movs r3, #8 - bl EntityInRectRadius - cmp r0, #0 - beq _08083F98 - movs r0, #0x10 - movs r1, #0 - movs r2, #0 - bl sub_08078AC0 - movs r0, #0x10 - strb r0, [r5, #0x15] -_08083F98: - movs r0, #1 - strb r0, [r4, #0xd] - b _08083FE6 - .align 2, 0 -_08083FA0: .4byte gPlayerEntity -_08083FA4: - ldrb r0, [r4, #0xa] - cmp r0, #5 - beq _08083FB2 - ldr r0, _08083FC8 @ =gPlayerEntity - ldrb r0, [r0, #0xc] - cmp r0, #1 - bne _08083FE6 -_08083FB2: - movs r1, #0 - movs r0, #2 - strb r0, [r4, #0xd] - movs r0, #8 - strb r0, [r4, #0xe] - strb r1, [r4, #0xf] - movs r0, #0xa5 - lsls r0, r0, #1 - bl SoundReq - b _08083FE6 - .align 2, 0 -_08083FC8: .4byte gPlayerEntity -_08083FCC: - ldr r1, _08083FE8 @ =gUnk_02034490 - movs r0, #0 - strb r0, [r1] - adds r1, r3, #0 - adds r1, #0x66 - movs r0, #0 - strh r0, [r1] - adds r0, r4, #0 - bl sub_08083E20 - movs r0, #0x73 - bl SoundReq -_08083FE6: - pop {r4, r5, pc} - .align 2, 0 -_08083FE8: .4byte gUnk_02034490 - - thumb_func_start sub_08083FEC -sub_08083FEC: @ 0x08083FEC - push {r4, lr} - adds r4, r0, #0 - bl sub_0800445C - adds r0, r4, #0 - adds r0, #0x39 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0 - beq _0808401E - movs r0, #4 - strb r0, [r4, #0xc] - movs r0, #0x1e - strb r0, [r4, #0xf] - adds r0, r4, #0 - bl sub_080788E0 - adds r0, r4, #0 - movs r1, #0x3c - bl RequestPriorityDuration - ldr r0, _08084020 @ =0x0000011B - bl SoundReq -_0808401E: - pop {r4, pc} - .align 2, 0 -_08084020: .4byte 0x0000011B - - thumb_func_start sub_08084024 -sub_08084024: @ 0x08084024 - push {r4, lr} - adds r4, r0, #0 - bl sub_0800445C - adds r0, r4, #0 - bl GetNextFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08084070 - ldrb r0, [r4, #0xf] - subs r0, #1 - strb r0, [r4, #0xf] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0808406A - ldrb r0, [r4, #0xe] - cmp r0, #0x18 - bne _08084060 - movs r0, #6 - strb r0, [r4, #0xc] - movs r0, #8 - strb r0, [r4, #0xe] - movs r0, #0x10 - strb r0, [r4, #0xf] - b _0808406A -_08084060: - movs r0, #5 - strb r0, [r4, #0xc] - ldrb r0, [r4, #0xb] - bl sub_08084074 -_0808406A: - ldrb r0, [r4, #0xb] - bl SetLocalFlag -_08084070: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08084074 -sub_08084074: @ 0x08084074 - push {r4, lr} - adds r4, r0, #0 - movs r0, #3 - bl GetCurrentRoomProperty - adds r1, r0, #0 - cmp r1, #0 - beq _080840A4 - b _0808409E -_08084086: - cmp r0, #3 - bne _0808409C - ldrb r0, [r1, #1] - cmp r4, r0 - bne _0808409C - ldrb r0, [r1, #2] - ldrb r1, [r1, #3] - movs r2, #0 - bl CreateItemEntity - b _080840A4 -_0808409C: - adds r1, #8 -_0808409E: - ldrb r0, [r1] - cmp r0, #0 - bne _08084086 -_080840A4: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_080840A8 -sub_080840A8: @ 0x080840A8 - push {r4, r5, r6, r7, lr} - adds r6, r0, #0 - adds r7, r1, #0 - ldr r4, _0808413C @ =gUnk_0811F838 - bl Random - movs r1, #7 - ands r1, r0 - adds r1, r1, r4 - ldrb r1, [r1] - movs r0, #0 - movs r2, #0 - bl CreateObject - adds r5, r0, #0 - cmp r5, #0 - beq _08084138 - movs r0, #6 - strb r0, [r5, #0xe] - bl Random - movs r1, #7 - ands r0, r1 - adds r0, #0xc - movs r1, #0x80 - orrs r0, r1 - strb r0, [r5, #0x15] - bl Random - movs r1, #0xf - ands r1, r0 - lsls r1, r1, #1 - adds r1, #0x20 - strh r1, [r5, #0x24] - bl Random - ldr r1, _08084140 @ =gUnk_0811F840 - movs r4, #3 - ands r0, r4 - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r0, [r0] - str r0, [r5, #0x20] - bl Random - ldr r1, _08084144 @ =gUnk_0811F850 - ands r0, r4 - adds r0, r0, r1 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - adds r0, r0, r6 - strh r0, [r5, #0x2e] - adds r0, r7, #1 - strh r0, [r5, #0x32] - ldr r0, _08084148 @ =0x0000FFF8 - strh r0, [r5, #0x36] - adds r0, r5, #0 - bl ResolveCollisionLayer - adds r0, r5, #0 - movs r1, #0x11 - movs r2, #0 - bl CreateFx - adds r5, r0, #0 - cmp r5, #0 - beq _08084138 - movs r0, #0x92 - lsls r0, r0, #1 - bl SoundReq -_08084138: - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0808413C: .4byte gUnk_0811F838 -_08084140: .4byte gUnk_0811F840 -_08084144: .4byte gUnk_0811F850 -_08084148: .4byte 0x0000FFF8 - - thumb_func_start sub_0808414C -sub_0808414C: @ 0x0808414C - push {lr} - adds r1, r0, #0 - ldrb r0, [r1, #0xe] - subs r0, #1 - strb r0, [r1, #0xe] - movs r2, #0xff - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08084180 - movs r0, #8 - strb r0, [r1, #0xe] - ldrb r0, [r1, #0xf] - subs r0, #1 - strb r0, [r1, #0xf] - ands r0, r2 - cmp r0, #0 - beq _0808417C - movs r2, #0x2e - ldrsh r0, [r1, r2] - movs r2, #0x32 - ldrsh r1, [r1, r2] - bl sub_080840A8 - b _08084180 -_0808417C: - movs r0, #5 - strb r0, [r1, #0xc] -_08084180: - pop {pc} - .align 2, 0 - - thumb_func_start sub_08084184 -sub_08084184: @ 0x08084184 - push {lr} - bl sub_0800445C - pop {pc} - - thumb_func_start nullsub_114 -nullsub_114: @ 0x0808418C - bx lr - .align 2, 0 - - thumb_func_start sub_08084190 -sub_08084190: @ 0x08084190 - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] - movs r0, #0x2e - ldrsh r1, [r4, r0] - ldr r2, _08084204 @ =gRoomControls - ldrh r0, [r2, #6] - subs r1, r1, r0 - asrs r1, r1, #4 - movs r3, #0x3f - ands r1, r3 - movs r5, #0x32 - ldrsh r0, [r4, r5] - ldrh r2, [r2, #8] - subs r0, r0, r2 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r1, r0 - adds r5, r4, #0 - adds r5, #0x70 - strh r1, [r5] - ldr r0, _08084208 @ =gUnk_0811F8A8 - str r0, [r4, #0x48] - adds r0, r4, #0 - bl GetTileTypeByEntity - cmp r0, #0x74 - bne _080841D2 - bl DeleteThisEntity -_080841D2: - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - beq _08084200 - movs r0, #3 - strb r0, [r4, #0xc] - ldrh r1, [r5] - adds r0, r4, #0 - adds r0, #0x38 - ldrb r2, [r0] - movs r0, #0x73 - bl sub_0807B7D8 - ldrb r1, [r4, #0xa] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - bne _08084200 - bl DeleteThisEntity -_08084200: - pop {r4, r5, pc} - .align 2, 0 -_08084204: .4byte gRoomControls -_08084208: .4byte gUnk_0811F8A8 - - thumb_func_start sub_0808420C -sub_0808420C: @ 0x0808420C - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - beq _08084220 - movs r0, #2 - strb r0, [r4, #0xc] -_08084220: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08084224 -sub_08084224: @ 0x08084224 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x70 - ldrh r1, [r0] - subs r0, #0x38 - ldrb r2, [r0] - movs r0, #0x73 - bl sub_0807B7D8 - ldrb r0, [r4, #0xa] - cmp r0, #7 - bgt _0808424C - cmp r0, #6 - blt _0808424C - ldr r0, _08084248 @ =0x00000215 - bl SoundReq - b _08084258 - .align 2, 0 -_08084248: .4byte 0x00000215 -_0808424C: - movs r0, #0x72 - bl SoundReq - adds r0, r4, #0 - bl CreateDust -_08084258: - movs r0, #3 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0xe] - lsls r0, r1, #4 - subs r0, r0, r1 - lsls r0, r0, #2 - adds r1, r4, #0 - adds r1, #0x72 - strh r0, [r1] - ldrb r1, [r4, #0xa] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - bne _08084278 - bl DeleteThisEntity -_08084278: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0808427C -sub_0808427C: @ 0x0808427C - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xa] - cmp r0, #1 - beq _0808428A - cmp r0, #7 - bne _080842D4 -_0808428A: - adds r0, r4, #0 - bl GetTileTypeByEntity - cmp r0, #0x74 - bne _0808429C - adds r0, r4, #0 - bl DeleteEntity - b _080842D4 -_0808429C: - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - bne _080842D4 - adds r1, r4, #0 - adds r1, #0x72 - ldrh r0, [r1] - cmp r0, #0 - beq _080842BA - subs r0, #1 - strh r0, [r1] - b _080842D4 -_080842BA: - movs r0, #1 - strb r0, [r4, #0xc] - adds r0, r4, #0 - adds r0, #0x70 - ldrh r0, [r0] - adds r1, r4, #0 - adds r1, #0x38 - ldrb r1, [r1] - bl sub_0807BA8C - adds r0, r4, #0 - bl CreateDust -_080842D4: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_080842D8 -sub_080842D8: @ 0x080842D8 - push {r4, r5, r6, lr} - adds r5, r0, #0 - ldrh r2, [r5, #0x2e] - movs r1, #8 - adds r0, r1, #0 - ands r0, r2 - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - rsbs r0, r0, #0 - lsrs r2, r0, #0x1f - ldrh r0, [r5, #0x32] - ands r1, r0 - cmp r1, #0 - beq _080842F6 - adds r2, #2 -_080842F6: - ldr r1, _0808432C @ =gUnk_0811F898 - lsls r0, r2, #2 - adds r0, r0, r1 - ldr r0, [r0] - movs r2, #0x2e - ldrsh r1, [r5, r2] - ldr r3, _08084330 @ =gRoomControls - ldrh r2, [r3, #6] - subs r1, r1, r2 - asrs r1, r1, #4 - movs r4, #0x3f - ands r1, r4 - movs r6, #0x32 - ldrsh r2, [r5, r6] - ldrh r3, [r3, #8] - subs r2, r2, r3 - asrs r2, r2, #4 - ands r2, r4 - lsls r2, r2, #6 - orrs r1, r2 - adds r2, r5, #0 - adds r2, #0x38 - ldrb r2, [r2] - bl sub_0801AF18 - pop {r4, r5, r6, pc} - .align 2, 0 -_0808432C: .4byte gUnk_0811F898 -_08084330: .4byte gRoomControls diff --git a/assets/assets.json b/assets/assets.json index b94cde6d..9ae86a88 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -42272,51 +42272,6 @@ "size": 8, "type": "animation" }, - { - "path": "chestSpawner/gUnk_0811F838.bin", - "start": 1177656, - "size": 8 - }, - { - "path": "chestSpawner/gUnk_0811F840.bin", - "start": 1177664, - "size": 16 - }, - { - "path": "chestSpawner/gUnk_0811F850.bin", - "start": 1177680, - "size": 4 - }, - { - "path": "chestSpawner/gUnk_0811F854.bin", - "start": 1177684, - "size": 18 - }, - { - "path": "chestSpawner/gUnk_0811F866.bin", - "start": 1177702, - "size": 26 - }, - { - "path": "chestSpawner/gUnk_0811F880.bin", - "start": 1177728, - "size": 10 - }, - { - "path": "chestSpawner/gUnk_0811F88A.bin", - "start": 1177738, - "size": 14 - }, - { - "path": "chestSpawner/gUnk_0811F8A8.bin", - "start": 1177768, - "size": 8 - }, - { - "path": "chestSpawner/gUnk_0811F8B0.bin", - "start": 1177776, - "size": 8 - }, { "path": "animations/gSpriteAnimations_ObjectD_0.bin", "start": 1177880, diff --git a/data/const/object/chestSpawner.s b/data/const/object/chestSpawner.s deleted file mode 100644 index 2f8ff71e..00000000 --- a/data/const/object/chestSpawner.s +++ /dev/null @@ -1,64 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_0811F7E8:: @ 0811F7E8 - .4byte sub_08083DF0 - .4byte sub_08083DF0 - .4byte sub_08083E08 - .4byte sub_08083E08 - .4byte sub_08083E08 - .4byte sub_08083E08 - .4byte sub_08083DF0 - .4byte sub_08083DF0 - -gUnk_0811F808:: @ 0811F808 - .4byte sub_08084190 - .4byte sub_0808420C - .4byte sub_08084224 - .4byte sub_0808427C - -gUnk_0811F818:: @ 0811F818 - .4byte sub_08083E4C - .4byte sub_08083EB0 - .4byte sub_08083F14 - .4byte sub_08083FEC - .4byte sub_08084024 - .4byte sub_08084184 - .4byte sub_0808414C - .4byte nullsub_114 - -gUnk_0811F838:: @ 0811F838 - .incbin "chestSpawner/gUnk_0811F838.bin" - -gUnk_0811F840:: @ 0811F840 - .incbin "chestSpawner/gUnk_0811F840.bin" - -gUnk_0811F850:: @ 0811F850 - .incbin "chestSpawner/gUnk_0811F850.bin" - -gUnk_0811F854:: @ 0811F854 - .incbin "chestSpawner/gUnk_0811F854.bin" - -gUnk_0811F866:: @ 0811F866 - .incbin "chestSpawner/gUnk_0811F866.bin" - -gUnk_0811F880:: @ 0811F880 - .incbin "chestSpawner/gUnk_0811F880.bin" - -gUnk_0811F88A:: @ 0811F88A - .incbin "chestSpawner/gUnk_0811F88A.bin" - -gUnk_0811F898:: @ 0811F898 - .4byte gUnk_0811F854 - .4byte gUnk_0811F866 - .4byte gUnk_0811F880 - .4byte gUnk_0811F88A - -gUnk_0811F8A8:: @ 0811F8A8 - .incbin "chestSpawner/gUnk_0811F8A8.bin" - -gUnk_0811F8B0:: @ 0811F8B0 - .incbin "chestSpawner/gUnk_0811F8B0.bin" diff --git a/include/functions.h b/include/functions.h index 64ab6229..ac9efa91 100644 --- a/include/functions.h +++ b/include/functions.h @@ -209,4 +209,12 @@ extern void sub_08027870(Entity*); extern u32 sub_0804A044(Entity*, Entity*, u32); extern void sub_0804AA1C(Entity*); extern void sub_08049CF4(Entity*); +extern void sub_0806FCF4(Entity*, s32, s32, s32); +extern u32 sub_080041DC(Entity*, u32, u32); +extern void sub_080AE58C(Entity*, u32, u32); +extern u32 sub_0800132C(Entity*, Entity*); +extern bool32 sub_080AE4CC(Entity*, u32, u32, u32); +extern void sub_08008796(Entity*, u32, u32, u32); +extern void sub_08078AC0(u32, u32, u32); +extern void CreateMagicSparkles(u32, u32, u32); #endif diff --git a/include/object.h b/include/object.h index b728782f..bd200e9b 100644 --- a/include/object.h +++ b/include/object.h @@ -238,7 +238,7 @@ void LockedDoor(Entity*); void Object9(Entity*); void ObjectA(Entity*); void ObjectB(Entity*); -void ChestSpawner(Entity*); +void ChestSpawner(); void ObjectD(Entity*); void ObjectE(Entity*); void SpecialFx(Entity*); diff --git a/linker.ld b/linker.ld index 55fa9325..16209115 100644 --- a/linker.ld +++ b/linker.ld @@ -656,7 +656,6 @@ SECTIONS { src/object/objectA.o(.text); asm/object/objectB.o(.text); src/object/chestSpawner.o(.text); - asm/object/chestSpawner.o(.text); asm/object/objectD.o(.text); asm/object/objectE.o(.text); src/object/specialFx.o(.text); @@ -1375,7 +1374,7 @@ SECTIONS { data/const/object/object9.o(.rodata); data/animations/object/object9.o(.rodata); data/const/object/objectB.o(.rodata); - data/const/object/chestSpawner.o(.rodata); + src/object/chestSpawner.o(.rodata); data/animations/object/chestSpawner.o(.rodata); data/const/object/objectD.o(.rodata); data/animations/object/objectD.o(.rodata); diff --git a/src/enemy/octorokBoss.c b/src/enemy/octorokBoss.c index 9198342b..4ae0be4e 100644 --- a/src/enemy/octorokBoss.c +++ b/src/enemy/octorokBoss.c @@ -11,7 +11,6 @@ #include "projectile.h" #include "game.h" -extern void sub_08078AC0(u32, u32, u32); extern u32 GetRandomByWeight(const u8*); extern void sub_080792BC(s32, u32, u32); diff --git a/src/manager/manager3.c b/src/manager/manager3.c index 868a2e13..db0f0237 100644 --- a/src/manager/manager3.c +++ b/src/manager/manager3.c @@ -7,6 +7,7 @@ #include "player.h" #include "sound.h" #include "object.h" +#include "functions.h" // Facilitates the usage of minish portals. @@ -27,7 +28,6 @@ typedef struct { extern s8 gUnk_08107C6C[]; extern u32 sub_08057810(void); extern u32 sub_080002C0(u16, u16, u8); -extern void CreateMagicSparkles(u32, u32, u32); void Manager3_Main(Manager3* this) { s8 tmp; diff --git a/src/npc/npc23.c b/src/npc/npc23.c index 9f64b7bb..a0a0c8bf 100644 --- a/src/npc/npc23.c +++ b/src/npc/npc23.c @@ -8,7 +8,6 @@ extern void (*const gUnk_081104C8[])(Entity*); bool32 sub_0806650C(Entity*); -extern void sub_08078AC0(u32, u32, u32); void sub_08066490(Entity*, Entity*); diff --git a/src/object/chestSpawner.c b/src/object/chestSpawner.c index 811817d7..20016663 100644 --- a/src/object/chestSpawner.c +++ b/src/object/chestSpawner.c @@ -1,31 +1,317 @@ +/** + * @file chestSpawner.c + * @ingroup Objects + * + * @brief Chest Spawner object + */ + +#define NENT_DEPRECATED #include "global.h" -#include "entity.h" +#include "object.h" +#include "functions.h" +#include "screen.h" +#include "structures.h" +#include "item.h" -extern void sub_080842D8(Entity*); -extern void sub_08078828(Entity*); -extern void sub_08083E20(Entity*); +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68[8]; + /*0x70*/ u16 tilePosition; + /*0x72*/ u16 unk_72; + /*0x74*/ u8 unk_74[0x12]; + /*0x86*/ u16 unk_86; +} ChestSpawnerEntity; -extern void (*const gUnk_0811F7E8[])(Entity*); -extern void (*const gUnk_0811F808[])(Entity*); -extern void (*const gUnk_0811F818[])(Entity*); +extern const Hitbox gUnk_0811F8A8; +extern const Hitbox gUnk_0811F8B0; -extern u32 gUnk_0811F8B0; -void ChestSpawner(Entity* this) { - gUnk_0811F7E8[this->type](this); +void sub_080842D8(ChestSpawnerEntity*); +void sub_08078828(ChestSpawnerEntity*); +void sub_08083E20(ChestSpawnerEntity*); +void sub_08084074(u32); +void sub_080840A8(s32, s32); +void ChestSpawner_Type0(ChestSpawnerEntity*); +void ChestSpawner_Type2(ChestSpawnerEntity*); +void ChestSpawner_Type0Init(ChestSpawnerEntity*); +void ChestSpawner_Type0Action1(ChestSpawnerEntity*); +void ChestSpawner_Type0Action2(ChestSpawnerEntity*); +void ChestSpawner_Type0Action3(ChestSpawnerEntity*); +void ChestSpawner_Type2Init(ChestSpawnerEntity*); +void ChestSpawner_Type2Action1(ChestSpawnerEntity*); +void ChestSpawner_Type2Action2(ChestSpawnerEntity*); +void ChestSpawner_Type2Action3(ChestSpawnerEntity*); +void ChestSpawner_Type2Action4(ChestSpawnerEntity*); +void ChestSpawner_Type2Action5(ChestSpawnerEntity*); +void ChestSpawner_Type2Action6(ChestSpawnerEntity*); +void ChestSpawner_Type2Action7(ChestSpawnerEntity*); + +void ChestSpawner(ChestSpawnerEntity* this) { + static void (*const ChestSpawner_Types[])(ChestSpawnerEntity*) = { + ChestSpawner_Type0, ChestSpawner_Type0, ChestSpawner_Type2, ChestSpawner_Type2, + ChestSpawner_Type2, ChestSpawner_Type2, ChestSpawner_Type0, ChestSpawner_Type0, + }; + ChestSpawner_Types[super->type](this); } -void sub_08083DF0(Entity* this) { - gUnk_0811F808[this->action](this); +void ChestSpawner_Type0(ChestSpawnerEntity* this) { + static void (*const ChestSpawner_Type0Actions[])(ChestSpawnerEntity*) = { + ChestSpawner_Type0Init, + ChestSpawner_Type0Action1, + ChestSpawner_Type0Action2, + ChestSpawner_Type0Action3, + }; + ChestSpawner_Type0Actions[super->action](this); } -void sub_08083E08(Entity* this) { - gUnk_0811F818[this->action](this); +void ChestSpawner_Type2(ChestSpawnerEntity* this) { + static void (*const ChestSpawner_Type2Actions[])(ChestSpawnerEntity*) = { + ChestSpawner_Type2Init, ChestSpawner_Type2Action1, ChestSpawner_Type2Action2, ChestSpawner_Type2Action3, + ChestSpawner_Type2Action4, ChestSpawner_Type2Action5, ChestSpawner_Type2Action6, ChestSpawner_Type2Action7, + }; + ChestSpawner_Type2Actions[super->action](this); } -void sub_08083E20(Entity* this) { - this->action = 3; - this->spriteSettings.draw = 1; - this->spriteRendering.alphaBlend = 0; +void sub_08083E20(ChestSpawnerEntity* this) { + super->action = 3; + super->spriteSettings.draw = 1; + super->spriteRendering.alphaBlend = 0; sub_080842D8(this); sub_08078828(this); } +void ChestSpawner_Type2Init(ChestSpawnerEntity* this) { + super->hitbox = (Hitbox*)&gUnk_0811F8B0; + if (CheckLocalFlag(super->type2)) { + super->spriteSettings.draw = 1; + super->action = 5; + sub_080842D8(this); + InitializeAnimation(super, 1); + } else { + if (CheckFlags(this->unk_86) || super->type == 4) { + sub_08083E20(this); + } else { + super->action = 1; + } + InitializeAnimation(super, 0); + } +} + +void ChestSpawner_Type2Action1(ChestSpawnerEntity* this) { + if (CheckFlags(this->unk_86)) { + gScreen.controls.layerFXControl = 0xf40; + gScreen.controls.alphaBlend = 0x1000; + gUnk_02034490.unk0 = 1; + super->action = 2; + super->subAction = 0; + super->field_0xf = 0x1e; + super->spriteSettings.draw = 1; + super->spriteRendering.alphaBlend = 1; + RequestPriorityDuration(super, 0x1e); + sub_0805BC4C(); + } +} + +void ChestSpawner_Type2Action2(ChestSpawnerEntity* this) { + u32 tmp; + + SetPriorityTimer(0x1e); + switch (super->subAction) { + case 0: + if (EntityInRectRadius(super, &gPlayerEntity, 0x10, 8)) { + sub_08078AC0(0x10, 0, 0); + gPlayerEntity.direction = 0x10; + } + super->subAction = 1; + break; + case 1: + if ((super->type == 5) || (gPlayerEntity.action == 1)) { + super->subAction = 2; + super->actionDelay = 8; + super->field_0xf = 0; + SoundReq(SFX_14A); + } + break; + default: + sub_0800445C(super); + CreateMagicSparkles(super->x.HALF.HI, super->y.HALF.HI, 2); + if (--super->actionDelay == 0) { + super->actionDelay = 8; + tmp = ++super->field_0xf; + gScreen.controls.alphaBlend = (((0x10 - tmp) * 0x100) & 0xff00) | tmp; + if (gScreen.controls.alphaBlend == 0x10) { + gUnk_02034490.unk0 = 0; + gScreen.controls.layerFXControl = 0; + sub_08083E20(this); + SoundReq(SFX_SECRET_BIG); + } + } + break; + } +} + +void ChestSpawner_Type2Action3(ChestSpawnerEntity* this) { + sub_0800445C(super); + if (super->interactType != 0) { + super->action = 4; + super->field_0xf = 0x1e; + sub_080788E0(super); + RequestPriorityDuration(super, 0x3c); + SoundReq(SFX_CHEST_OPEN); + } +} + +void ChestSpawner_Type2Action4(ChestSpawnerEntity* this) { + sub_0800445C(super); + GetNextFrame(super); + if ((super->frame & 0x80) != 0) { + if (--super->field_0xf == 0) { + if (super->actionDelay == 0x18) { + super->action = 6; + super->actionDelay = 8; + super->field_0xf = 0x10; + } else { + super->action = 5; + sub_08084074(super->type2); + } + } + SetLocalFlag(super->type2); + } +} + +void sub_08084074(u32 param_1) { + u8* arr = (u8*)GetCurrentRoomProperty(3); + if (arr != NULL) { + for (; arr[0] != 0; arr += 8) { + if ((arr[0] == 3) && (param_1 == arr[1])) { + CreateItemEntity(arr[2], arr[3], 0); + return; + } + } + } +} + +void sub_080840A8(s32 param_1, s32 param_2) { + static const u8 gUnk_0811F838[] = { 84, 84, 84, 84, 85, 85, 85, 86 }; + static const s32 gUnk_0811F840[] = { 393216, 458752, 524288, 589824 }; + static const s8 gUnk_0811F850[] = { -6, 0, 0, 6 }; + Entity* obj = CreateObject(GROUND_ITEM, gUnk_0811F838[Random() & 7], 0); + if (obj != NULL) { + obj->actionDelay = 6; + obj->direction = ((Random() & 7) + 0xc) | 0x80; + obj->speed = (Random() & 0xf) * 2 + 0x20; + obj->zVelocity = gUnk_0811F840[Random() & 3]; + obj->x.HALF.HI = gUnk_0811F850[Random() & 3] + param_1; + obj->y.HALF.HI = param_2 + 1; + obj->z.HALF.HI = 0xfff8; + ResolveCollisionLayer(obj); + obj = CreateFx(obj, FX_DASH, 0); + if (obj != NULL) { + SoundReq(SFX_124); + } + } +} + +void ChestSpawner_Type2Action6(ChestSpawnerEntity* this) { + if (--super->actionDelay == 0) { + super->actionDelay = 8; + if (--super->field_0xf != 0) { + sub_080840A8(super->x.HALF.HI, super->y.HALF.HI); + } else { + super->action = 5; + } + } +} + +void ChestSpawner_Type2Action5(ChestSpawnerEntity* this) { + sub_0800445C(super); +} + +void ChestSpawner_Type2Action7(ChestSpawnerEntity* this) { +} + +void ChestSpawner_Type0Init(ChestSpawnerEntity* this) { + super->action++; + this->tilePosition = COORD_TO_TILE(super); + super->hitbox = (Hitbox*)&gUnk_0811F8A8; + if (GetTileTypeByEntity(super) == 0x74) { + DeleteThisEntity(); + } + if (CheckFlags(this->unk_86)) { + super->action = 3; + sub_0807B7D8(0x73, this->tilePosition, super->collisionLayer); + if ((super->type & 1) == 0) { + DeleteThisEntity(); + } + } +} + +void ChestSpawner_Type0Action1(ChestSpawnerEntity* this) { + if (CheckFlags(this->unk_86)) { + super->action = 2; + } +} + +void ChestSpawner_Type0Action2(ChestSpawnerEntity* this) { + sub_0807B7D8(0x73, this->tilePosition, super->collisionLayer); + switch (super->type) { + case 6: + case 7: + SoundReq(SFX_215); + break; + default: + SoundReq(SFX_SECRET); + CreateDust(super); + break; + } + super->action = 3; + this->unk_72 = super->actionDelay * 0x3c; + if ((super->type & 1) == 0) { + DeleteThisEntity(); + } +} + +void ChestSpawner_Type0Action3(ChestSpawnerEntity* this) { + if ((super->type == 1) || (super->type == 7)) { + if (GetTileTypeByEntity(super) == 0x74) { + DeleteEntity(super); + } else { + if (!CheckFlags(this->unk_86)) { + if (this->unk_72 != 0) { + this->unk_72--; + } else { + super->action = 1; + sub_0807BA8C(this->tilePosition, super->collisionLayer); + CreateDust(super); + } + } + } + } +} + +void sub_080842D8(ChestSpawnerEntity* this) { + static const u8 gUnk_0811F854[] = { + 35, 64, 191, 255, 35, 64, 192, 255, 38, 64, 255, 255, 38, 64, 0, 0, 255, 255, + }; + static const u8 gUnk_0811F866[] = { + 39, 64, 191, 255, 35, 64, 192, 255, 40, 64, 193, 255, 41, 64, 255, 255, 38, 64, 0, 0, 42, 64, 1, 0, 255, 255, + }; + static const u8 gUnk_0811F880[] = { + 34, 64, 255, 255, 34, 64, 0, 0, 255, 255, + }; + static const u8 gUnk_0811F88A[] = { + 36, 64, 255, 255, 34, 64, 0, 0, 37, 64, 1, 0, 255, 255, + }; + static const u8* const gUnk_0811F898[] = { + gUnk_0811F854, + gUnk_0811F866, + gUnk_0811F880, + gUnk_0811F88A, + }; + s32 index = -(-(super->x.HALF.HI & 8) >> 0x1f); + if ((super->y.HALF.HI & 8) != 0) { + index += 2; + } + sub_0801AF18((u8*)gUnk_0811F898[index], COORD_TO_TILE(super), super->collisionLayer); +} + +const Hitbox gUnk_0811F8A8 = { 0, -3, { 0, 0, 0, 0 }, 6, 6 }; +const Hitbox gUnk_0811F8B0 = { 0, -3, { 0, 0, 0, 0 }, 12, 6 }; diff --git a/src/object/houseDoorExterior.c b/src/object/houseDoorExterior.c index 92ba70b8..62d0cb95 100644 --- a/src/object/houseDoorExterior.c +++ b/src/object/houseDoorExterior.c @@ -29,7 +29,6 @@ void sub_0808681C(Entity*); static u8 sub_08086954(Entity*); extern u32 CheckRegionOnScreen(u32, u32, u32, u32); -extern void sub_08078AC0(u32, u32, u32); extern void (*const gUnk_081206B4[])(Entity*); extern Hitbox gUnk_081206AC; // TODO: should be const diff --git a/src/object/jarPortal.c b/src/object/jarPortal.c index a482621d..6be250de 100644 --- a/src/object/jarPortal.c +++ b/src/object/jarPortal.c @@ -5,7 +5,6 @@ extern void (*gUnk_08121488[])(Entity*); extern u32 sub_08057810(void); -extern void CreateMagicSparkles(u32, u32, u32); u32 sub_0808C128(Entity*); void sub_0808C13C(Entity*); From a448d222983a89d0a75ac15993db5e01fb5f5359 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Mon, 14 Feb 2022 13:14:34 +0100 Subject: [PATCH 05/10] Decompile LavaPlatform --- asm/object/lavaPlatform.s | 658 ------------------------------- data/const/object/lavaPlatform.s | 20 - include/object.h | 2 +- linker.ld | 4 +- src/object/lavaPlatform.c | 307 ++++++++++++++ 5 files changed, 310 insertions(+), 681 deletions(-) delete mode 100644 asm/object/lavaPlatform.s delete mode 100644 data/const/object/lavaPlatform.s create mode 100644 src/object/lavaPlatform.c diff --git a/asm/object/lavaPlatform.s b/asm/object/lavaPlatform.s deleted file mode 100644 index e4199773..00000000 --- a/asm/object/lavaPlatform.s +++ /dev/null @@ -1,658 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start LavaPlatform -LavaPlatform: @ 0x0809225C - push {lr} - adds r1, r0, #0 - ldrb r0, [r1, #0xa] - cmp r0, #0 - bne _0809226E - adds r0, r1, #0 - bl sub_08092278 - b _08092274 -_0809226E: - adds r0, r1, #0 - bl sub_08092344 -_08092274: - pop {pc} - .align 2, 0 - - thumb_func_start sub_08092278 -sub_08092278: @ 0x08092278 - push {lr} - ldr r2, _0809228C @ =gUnk_08122644 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0809228C: .4byte gUnk_08122644 - - thumb_func_start sub_08092290 -sub_08092290: @ 0x08092290 - push {lr} - movs r1, #1 - strb r1, [r0, #0xc] - bl sub_080925A4 - pop {pc} - - thumb_func_start sub_0809229C -sub_0809229C: @ 0x0809229C - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x70 - ldrb r0, [r0] - cmp r0, #0 - beq _080922E0 - movs r0, #2 - strb r0, [r4, #0xc] - movs r0, #0xb0 - lsls r0, r0, #0xa - str r0, [r4, #0x20] - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - adds r0, r4, #0 - bl UpdateSpriteForCollisionLayer - ldr r0, [r4, #0x54] - ldrb r1, [r0, #0x14] - adds r0, r4, #0 - bl InitAnimationForceUpdate - movs r0, #0xbf - lsls r0, r0, #1 - bl EnqueueSFX - ldr r0, [r4, #0x54] - movs r1, #3 - bl InitializeAnimation -_080922E0: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_080922E4 -sub_080922E4: @ 0x080922E4 - push {r4, lr} - adds r4, r0, #0 - movs r1, #0x90 - lsls r1, r1, #6 - bl GravityUpdate - adds r2, r0, #0 - cmp r2, #0 - bne _08092322 - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x18] - subs r0, #5 - ands r0, r1 - strb r0, [r4, #0x18] - adds r0, r4, #0 - adds r0, #0x70 - strb r2, [r0] - ldr r0, [r4, #0x54] - adds r0, #0x63 - strb r2, [r0] - ldr r0, [r4, #0x54] - ldrb r1, [r0, #0x14] - bl InitializeAnimation - adds r0, r4, #0 - movs r1, #0x36 - movs r2, #0 - bl CreateFx - b _0809233E -_08092322: - ldr r1, [r4, #0x20] - ldr r0, _08092340 @ =0x00017FFF - cmp r1, r0 - bgt _0809233E - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - bne _0809233E - adds r0, r4, #0 - bl UpdateAnimationSingleFrame -_0809233E: - pop {r4, pc} - .align 2, 0 -_08092340: .4byte 0x00017FFF - - thumb_func_start sub_08092344 -sub_08092344: @ 0x08092344 - push {r4, lr} - adds r4, r0, #0 - movs r0, #0 - strb r0, [r4, #0xf] - ldr r1, _08092364 @ =gUnk_08122650 - ldrb r0, [r4, #0xc] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - adds r0, r4, #0 - bl _call_via_r1 - adds r0, r4, #0 - bl sub_080926E4 - pop {r4, pc} - .align 2, 0 -_08092364: .4byte gUnk_08122650 - - thumb_func_start sub_08092368 -sub_08092368: @ 0x08092368 - push {lr} - adds r2, r0, #0 - ldrb r0, [r2, #0xb] - strb r0, [r2, #0x14] - adds r3, r2, #0 - adds r3, #0x29 - ldrb r0, [r3] - movs r1, #7 - orrs r0, r1 - strb r0, [r3] - adds r1, r2, #0 - adds r1, #0x40 - movs r0, #0x48 - strb r0, [r1] - subs r1, #4 - movs r0, #7 - strb r0, [r1] - subs r1, #1 - movs r0, #0x81 - strb r0, [r1] - ldr r0, _0809239C @ =gUnk_080FD280 - str r0, [r2, #0x48] - adds r0, r2, #0 - bl sub_0809264C - pop {pc} - .align 2, 0 -_0809239C: .4byte gUnk_080FD280 - - thumb_func_start sub_080923A0 -sub_080923A0: @ 0x080923A0 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x58 - ldrb r0, [r0] - cmp r0, #3 - beq _080923E2 - ldrb r0, [r4, #0xd] - cmp r0, #0 - bne _080923C6 - movs r1, #1 - movs r0, #1 - strb r0, [r4, #0xd] - ldrb r0, [r4, #0x14] - eors r0, r1 - strb r0, [r4, #0x14] - ldrb r1, [r4, #0x14] - adds r0, r4, #0 - bl InitializeAnimation -_080923C6: - adds r1, r4, #0 - adds r1, #0x63 - ldrb r0, [r1] - subs r0, #1 - strb r0, [r1] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - movs r1, #3 - rsbs r1, r1, #0 - cmp r0, r1 - bne _080923E2 - adds r0, r4, #0 - bl sub_0809264C -_080923E2: - pop {r4, pc} - - thumb_func_start sub_080923E4 -sub_080923E4: @ 0x080923E4 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x41 - ldrb r0, [r0] - cmp r0, #0x9d - bne _080923F8 - adds r0, r4, #0 - bl sub_08092620 - b _0809241A -_080923F8: - adds r0, r4, #0 - bl sub_0809269C - cmp r0, #0 - beq _0809241A - movs r0, #3 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r4, #0x10] - movs r0, #0x14 - strb r0, [r4, #0xe] - ldr r0, _0809241C @ =gPlayerState - adds r0, #0x3f - movs r1, #0xfd - strb r1, [r0] -_0809241A: - pop {r4, pc} - .align 2, 0 -_0809241C: .4byte gPlayerState - - thumb_func_start sub_08092420 -sub_08092420: @ 0x08092420 - push {r4, lr} - adds r4, r0, #0 - bl sub_0809269C - cmp r0, #0 - beq _08092434 - ldr r0, _08092464 @ =gPlayerState - adds r0, #0x3f - movs r1, #0xfd - strb r1, [r0] -_08092434: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08092462 - movs r0, #4 - strb r0, [r4, #0xc] - adds r0, r4, #0 - adds r0, #0x72 - ldrh r1, [r0] - subs r0, #2 - movs r2, #0 - strh r1, [r0] - subs r0, #0xd - strb r2, [r0] - adds r0, r4, #0 - movs r1, #2 - bl InitializeAnimation - ldr r0, _08092468 @ =0x0000017B - bl EnqueueSFX -_08092462: - pop {r4, pc} - .align 2, 0 -_08092464: .4byte gPlayerState -_08092468: .4byte 0x0000017B - - thumb_func_start sub_0809246C -sub_0809246C: @ 0x0809246C - push {r4, r5, lr} - adds r4, r0, #0 - bl sub_0809269C - adds r5, r4, #0 - adds r5, #0x70 - ldrh r0, [r5] - cmp r0, #0 - beq _08092482 - subs r0, #1 - strh r0, [r5] -_08092482: - ldrh r0, [r5] - cmp r0, #0x8c - bhi _080924DC - 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 r0, r0, #0x18 - cmp r0, #0 - beq _080924B8 - movs r0, #5 - strb r0, [r4, #0xc] - adds r0, r4, #0 - adds r0, #0x74 - ldrh r0, [r0] - strh r0, [r5] - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r4, #0x18] - b _080924DC -_080924B8: - movs r2, #1 - ands r2, r1 - cmp r2, #0 - beq _080924CC - strb r0, [r3] - movs r0, #0xbe - lsls r0, r0, #1 - bl EnqueueSFX - b _080924DC -_080924CC: - movs r0, #2 - ands r0, r1 - cmp r0, #0 - beq _080924DC - strb r2, [r3] - ldr r0, _080924E0 @ =0x0000017D - bl EnqueueSFX -_080924DC: - pop {r4, r5, pc} - .align 2, 0 -_080924E0: .4byte 0x0000017D - - thumb_func_start sub_080924E4 -sub_080924E4: @ 0x080924E4 - push {r4, lr} - adds r4, r0, #0 - adds r1, r4, #0 - adds r1, #0x70 - ldrh r0, [r1] - subs r0, #1 - strh r0, [r1] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _0809252C - movs r0, #6 - strb r0, [r4, #0xc] - ldrb r0, [r4, #0xb] - strb r0, [r4, #0x14] - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - adds r1, r4, #0 - adds r1, #0x63 - movs r0, #0 - strb r0, [r1] - ldrb r1, [r4, #0x14] - adds r1, #4 - adds r0, r4, #0 - bl InitializeAnimation - ldrb r0, [r4, #0x14] - cmp r0, #0 - bne _0809252C - adds r0, r4, #0 - bl sub_0809269C -_0809252C: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08092530 -sub_08092530: @ 0x08092530 - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0x14] - cmp r0, #0 - bne _08092544 - adds r0, r4, #0 - bl sub_0809269C - adds r5, r0, #0 - b _08092546 -_08092544: - movs r5, #0 -_08092546: - adds r0, r4, #0 - bl GetNextFrame - adds r2, r4, #0 - adds r2, #0x5a - ldrb r1, [r2] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _08092570 - movs r0, #0 - strb r0, [r2] - ldrb r1, [r4, #0x10] - movs r0, #0x80 - orrs r0, r1 - strb r0, [r4, #0x10] - adds r1, r4, #0 - adds r1, #0x3f - movs r0, #0xac - strb r0, [r1] - b _0809258A -_08092570: - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0809258A - adds r0, r4, #0 - bl sub_0809264C - cmp r5, #0 - beq _0809258A - ldr r0, _0809258C @ =gPlayerState - adds r0, #0x3f - movs r1, #0xfd - strb r1, [r0] -_0809258A: - pop {r4, r5, pc} - .align 2, 0 -_0809258C: .4byte gPlayerState - - thumb_func_start sub_08092590 -sub_08092590: @ 0x08092590 - push {lr} - adds r1, r0, #0 - adds r0, #0x41 - ldrb r0, [r0] - cmp r0, #0x9d - bne _080925A2 - adds r0, r1, #0 - bl sub_08092620 -_080925A2: - pop {pc} - - thumb_func_start sub_080925A4 -sub_080925A4: @ 0x080925A4 - push {r4, r5, r6, r7, lr} - adds r6, r0, #0 - ldrb r0, [r6, #0xb] - bl GetCurrentRoomProperty - adds r5, r0, #0 - ldrb r0, [r5, #9] - cmp r0, #0xff - beq _0809261A - ldr r7, _0809261C @ =gRoomControls -_080925B8: - ldrb r2, [r5, #9] - movs r0, #0x59 - movs r1, #1 - bl CreateObject - adds r4, r0, #0 - cmp r4, #0 - beq _08092612 - movs r0, #0xff - strb r0, [r4, #0x15] - movs r0, #0 - strh r0, [r4, #0x24] - str r6, [r4, #0x50] - ldrh r0, [r7, #6] - ldrh r1, [r5, #4] - adds r0, r0, r1 - strh r0, [r4, #0x2e] - ldrh r0, [r7, #8] - ldrh r1, [r5, #6] - adds r0, r0, r1 - strh r0, [r4, #0x32] - ldrb r1, [r5, #8] - adds r0, r4, #0 - adds r0, #0x38 - strb r1, [r0] - ldrh r0, [r5, #0xa] - adds r1, r4, #0 - adds r1, #0x72 - strh r0, [r1] - ldrh r1, [r5, #0xc] - adds r0, r4, #0 - adds r0, #0x74 - strh r1, [r0] - ldr r0, [r5] - str r0, [r4, #0x78] - adds r0, r4, #0 - bl UpdateSpriteForCollisionLayer - adds r1, r4, #0 - adds r1, #0x78 - adds r2, r4, #0 - adds r2, #0x76 - adds r0, r4, #0 - bl sub_080A2CC0 -_08092612: - adds r5, #0x10 - ldrb r0, [r5, #9] - cmp r0, #0xff - bne _080925B8 -_0809261A: - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0809261C: .4byte gRoomControls - - thumb_func_start sub_08092620 -sub_08092620: @ 0x08092620 - push {r4, r5, r6, lr} - adds r5, r0, #0 - ldr r1, [r5, #0x50] - adds r0, r1, #0 - adds r0, #0x70 - ldrb r6, [r0] - cmp r6, #0 - bne _08092648 - movs r4, #1 - strb r4, [r0] - str r5, [r1, #0x54] - adds r0, r5, #0 - bl CopyPosition - strb r4, [r5, #0xc] - strb r6, [r5, #0xd] - adds r1, r5, #0 - adds r1, #0x3f - movs r0, #0xac - strb r0, [r1] -_08092648: - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_0809264C -sub_0809264C: @ 0x0809264C - push {lr} - adds r2, r0, #0 - ldrb r1, [r2, #0x14] - movs r3, #1 - adds r0, r3, #0 - ands r0, r1 - cmp r0, #0 - beq _0809266A - movs r0, #7 - strb r0, [r2, #0xc] - adds r1, r2, #0 - adds r1, #0x3f - movs r0, #0xac - strb r0, [r1] - b _08092674 -_0809266A: - movs r0, #2 - strb r0, [r2, #0xc] - adds r0, r2, #0 - adds r0, #0x3f - strb r3, [r0] -_08092674: - ldrb r1, [r2, #0x10] - movs r0, #0x80 - orrs r0, r1 - strb r0, [r2, #0x10] - ldrb r1, [r2, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r2, #0x18] - adds r1, r2, #0 - adds r1, #0x63 - movs r0, #0xfd - strb r0, [r1] - ldrb r1, [r2, #0x14] - adds r0, r2, #0 - bl InitializeAnimation - pop {pc} - - thumb_func_start sub_0809269C -sub_0809269C: @ 0x0809269C - push {r4, r5, r6, lr} - adds r4, r0, #0 - ldr r6, _080926D8 @ =gPlayerState - ldr r0, [r6, #0x30] - movs r1, #0x80 - ands r0, r1 - cmp r0, #0 - bne _080926E0 - ldr r5, _080926DC @ =gPlayerEntity - adds r0, r4, #0 - adds r1, r5, #0 - movs r2, #0x10 - movs r3, #0x10 - bl EntityInRectRadius - cmp r0, #0 - beq _080926E0 - bl sub_08079F8C - cmp r0, #0 - beq _080926E0 - movs r1, #1 - strb r1, [r6, #0x14] - movs r2, #0x36 - ldrsh r0, [r5, r2] - cmp r0, #0 - bne _080926E0 - strb r1, [r4, #0xf] - movs r0, #1 - b _080926E2 - .align 2, 0 -_080926D8: .4byte gPlayerState -_080926DC: .4byte gPlayerEntity -_080926E0: - movs r0, #0 -_080926E2: - pop {r4, r5, r6, pc} - - thumb_func_start sub_080926E4 -sub_080926E4: @ 0x080926E4 - push {r4, lr} - adds r4, r0, #0 - ldrb r1, [r4, #0xf] - bl sub_080A2BE4 - ldrb r0, [r4, #0xc] - cmp r0, #1 - bne _08092700 - ldr r1, [r4, #0x50] - ldrh r0, [r4, #0x2e] - strh r0, [r1, #0x2e] - ldr r1, [r4, #0x50] - ldrh r0, [r4, #0x32] - strh r0, [r1, #0x32] -_08092700: - adds r2, r4, #0 - adds r2, #0x76 - ldrh r0, [r2] - subs r0, #1 - strh r0, [r2] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _0809271A - adds r1, r4, #0 - adds r1, #0x78 - adds r0, r4, #0 - bl sub_080A2CC0 -_0809271A: - pop {r4, pc} diff --git a/data/const/object/lavaPlatform.s b/data/const/object/lavaPlatform.s deleted file mode 100644 index a293cccc..00000000 --- a/data/const/object/lavaPlatform.s +++ /dev/null @@ -1,20 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08122644:: @ 08122644 - .4byte sub_08092290 - .4byte sub_0809229C - .4byte sub_080922E4 - -gUnk_08122650:: @ 08122650 - .4byte sub_08092368 - .4byte sub_080923A0 - .4byte sub_080923E4 - .4byte sub_08092420 - .4byte sub_0809246C - .4byte sub_080924E4 - .4byte sub_08092530 - .4byte sub_08092590 diff --git a/include/object.h b/include/object.h index bd200e9b..b1cd0f19 100644 --- a/include/object.h +++ b/include/object.h @@ -315,7 +315,7 @@ void Minecart(Entity*); void ThoughtBubble(Entity*); void HiddenLadderDown(Entity*); void GentariCurtain(Entity*); -void LavaPlatform(Entity*); +void LavaPlatform(); void Paper(Entity*); void Object5B(Entity*); void Mask(Entity*); diff --git a/linker.ld b/linker.ld index 16209115..07381ccd 100644 --- a/linker.ld +++ b/linker.ld @@ -736,7 +736,7 @@ SECTIONS { src/object/thoughtBubble.o(.text); src/object/hiddenLadderDown.o(.text); asm/object/gentariCurtains.o(.text); - asm/object/lavaPlatform.o(.text); + src/object/lavaPlatform.o(.text); asm/object/paper.o(.text); asm/object/object5B.o(.text); src/object/mask.o(.text); @@ -1479,7 +1479,7 @@ SECTIONS { data/const/object/hiddenLadderDown.o(.rodata); data/const/object/gentariCurtains.o(.rodata); data/animations/object/gentariCurtains.o(.rodata); - data/const/object/lavaPlatform.o(.rodata); + src/object/lavaPlatform.o(.rodata); data/animations/object/lavaPlatform.o(.rodata); data/const/object/paper.o(.rodata); data/const/object/object5B.o(.rodata); diff --git a/src/object/lavaPlatform.c b/src/object/lavaPlatform.c new file mode 100644 index 00000000..9fc23de9 --- /dev/null +++ b/src/object/lavaPlatform.c @@ -0,0 +1,307 @@ +/** + * @file lavaPlatform.c + * @ingroup Objects + * + * @brief Lava Platform object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68[8]; + /*0x70*/ u16 timer; + /*0x72*/ u16 wobbleTime; /**< Time the player can stand on the platform. */ + /*0x74*/ u16 respawnTime; /**< Time until the platform respawns after it has sunk. */ + /*0x76*/ u16 unk_76; + /*0x78*/ Entity* unk_78; // Typed same as second argument of sub_080A2CC0 +} LavaPlatformEntity; + +typedef struct { + /*0x00*/ Entity* unk_78; // Typed same as second argument of sub_080A2CC0 + /*0x04*/ s16 x; + /*0x06*/ s16 y; + /*0x08*/ u8 collisionLayer; + /*0x09*/ u8 type2; + /*0x0a*/ u16 wobbleTime; + /*0x0c*/ u16 respawnTime; + /*0x0e*/ u8 unk_e[2]; +} LavaPlatformEntry; + +extern void sub_080A2CC0(Entity*, Entity**, u16*); +extern Hitbox gUnk_080FD280; + +void sub_08092278(LavaPlatformEntity*); +void sub_08092344(LavaPlatformEntity*); +void LavaPlatform_SpawnPlatforms(LavaPlatformEntity*); +void sub_080926E4(LavaPlatformEntity*); +void sub_0809264C(LavaPlatformEntity*); +void sub_08092620(LavaPlatformEntity*); +bool32 LavaPlatform_IsPlayerOnPlatform(LavaPlatformEntity*); +void LavaPlatform_Type0Init(LavaPlatformEntity*); +void LavaPlatform_Type0Action1(LavaPlatformEntity*); +void LavaPlatform_Type0Action2(LavaPlatformEntity*); +void LavaPlatform_Type1Init(LavaPlatformEntity*); +void LavaPlatform_Type1Action1(LavaPlatformEntity*); +void LavaPlatform_Type1Action2(LavaPlatformEntity*); +void LavaPlatform_Type1Action3(LavaPlatformEntity*); +void LavaPlatform_Type1Action4(LavaPlatformEntity*); +void LavaPlatform_Type1Action5(LavaPlatformEntity*); +void LavaPlatform_Type1Action6(LavaPlatformEntity*); +void LavaPlatform_Type1Action7(LavaPlatformEntity*); + +void LavaPlatform(LavaPlatformEntity* this) { + if (super->type == 0) { + sub_08092278(this); + } else { + sub_08092344(this); + } +} + +void sub_08092278(LavaPlatformEntity* this) { + static void (*const LavaPlatform_Type0Actions[])(LavaPlatformEntity*) = { + LavaPlatform_Type0Init, + LavaPlatform_Type0Action1, + LavaPlatform_Type0Action2, + }; + LavaPlatform_Type0Actions[super->action](this); +} + +void LavaPlatform_Type0Init(LavaPlatformEntity* this) { + super->action = 1; + LavaPlatform_SpawnPlatforms(this); +} + +void LavaPlatform_Type0Action1(LavaPlatformEntity* this) { + if (*(u8*)&this->timer != 0) { + // Use this entity to show the platform flipping animation. + super->action = 2; + super->zVelocity = 0x2c000; + super->spriteSettings.draw = 1; + UpdateSpriteForCollisionLayer(super); + InitAnimationForceUpdate(super, (super->child)->animationState); + EnqueueSFX(SFX_LAVA_TILE_FLIP); + InitializeAnimation(super->child, 3); + } +} + +void LavaPlatform_Type0Action2(LavaPlatformEntity* this) { + if (GravityUpdate(super, 0x2400) == 0) { + // Finished flipping platform. + super->action = 1; + super->spriteSettings.draw = 0; + *(u8*)&this->timer = 0; + (super->child)->spriteOffsetY = 0; + InitializeAnimation(super->child, super->child->animationState); + CreateFx(super, FX_LAVA_SPLASH_HUGE, 0); + } else if ((super->zVelocity < 0x18000) && ((super->frame & 0x80) == 0)) { + UpdateAnimationSingleFrame(super); + } +} + +void sub_08092344(LavaPlatformEntity* this) { + static void (*const LavaPlatform_Type1Actions[])(LavaPlatformEntity*) = { + LavaPlatform_Type1Init, LavaPlatform_Type1Action1, LavaPlatform_Type1Action2, LavaPlatform_Type1Action3, + LavaPlatform_Type1Action4, LavaPlatform_Type1Action5, LavaPlatform_Type1Action6, LavaPlatform_Type1Action7, + }; + super->field_0xf = 0; + LavaPlatform_Type1Actions[super->action](this); + sub_080926E4(this); +} + +void LavaPlatform_Type1Init(LavaPlatformEntity* this) { + super->animationState = super->type2; + super->spritePriority.b0 = 7; + super->hurtType = 0x48; + super->field_0x3c = 7; + super->flags2 = 0x81; + super->hitbox = (Hitbox*)&gUnk_080FD280; + sub_0809264C(this); +} + +void LavaPlatform_Type1Action1(LavaPlatformEntity* this) { + if (super->animIndex != 3) { + if (super->subAction == 0) { + super->subAction = 1; + super->animationState ^= 1; + InitializeAnimation(super, (u32)super->animationState); + } + if (--super->spriteOffsetY * 0x1000000 >> 0x18 == -3) { + sub_0809264C(this); + } + } +} + +void LavaPlatform_Type1Action2(LavaPlatformEntity* this) { + if (super->bitfield == 0x9d) { + sub_08092620(this); + } else { + if (LavaPlatform_IsPlayerOnPlatform(this)) { + super->action = 3; + super->flags &= ~ENT_COLLIDE; + super->actionDelay = 0x14; + gPlayerState.field_0x3f = 0xfd; + } + } +} + +/** Player is standing on the platform. */ +void LavaPlatform_Type1Action3(LavaPlatformEntity* this) { + if (LavaPlatform_IsPlayerOnPlatform(this)) { + gPlayerState.field_0x3f = 0xfd; + } + if (--super->actionDelay == 0) { + super->action = 4; + this->timer = this->wobbleTime; + super->spriteOffsetY = 0; + InitializeAnimation(super, 2); + EnqueueSFX(SFX_LAVA_TILE_STEP); + } +} + +/** Platform begins to wobble */ +void LavaPlatform_Type1Action4(LavaPlatformEntity* this) { + u32 tmp; + LavaPlatform_IsPlayerOnPlatform(this); + if (this->timer != 0) { + this->timer--; + } + if (this->timer < 0x8d) { + GetNextFrame(super); + tmp = super->frame & 0x80; + if (tmp) { + // Platform sank + super->action = 5; + this->timer = this->respawnTime; + super->spriteSettings.draw = 0; + } else { + if ((super->frame & 1) != 0) { + super->frame = tmp; + EnqueueSFX(SFX_LAVA_TILE_WOBBLE); + } else { + if ((super->frame & 2) != 0) { + super->frame = super->frame & 1; + EnqueueSFX(SFX_LAVA_TILE_SINK); + } + } + } + } +} + +void LavaPlatform_Type1Action5(LavaPlatformEntity* this) { + if (--this->timer == 0) { + super->action = 6; + super->animationState = super->type2; + super->spriteSettings.draw = 1; + super->spriteOffsetY = 0; + InitializeAnimation(super, super->animationState + 4); + if (super->animationState == 0) { + LavaPlatform_IsPlayerOnPlatform(this); + } + } +} + +void LavaPlatform_Type1Action6(LavaPlatformEntity* this) { + bool32 tmp; + + if (super->animationState == 0) { + tmp = LavaPlatform_IsPlayerOnPlatform(this); + } else { + tmp = FALSE; + } + GetNextFrame(super); + if ((super->frame & 1) != 0) { + super->frame = 0; + super->flags |= ENT_COLLIDE; + super->hitType = 0xac; + } else { + if ((super->frame & 0x80) != 0) { + sub_0809264C(this); + if (tmp) { + gPlayerState.field_0x3f = 0xfd; + } + } + } +} + +void LavaPlatform_Type1Action7(LavaPlatformEntity* this) { + if (super->bitfield == 0x9d) { + sub_08092620(this); + } +} + +void LavaPlatform_SpawnPlatforms(LavaPlatformEntity* this) { + LavaPlatformEntry* entry = (LavaPlatformEntry*)GetCurrentRoomProperty(super->type2); + while (entry->type2 != 0xff) { + LavaPlatformEntity* platform = (LavaPlatformEntity*)CreateObject(LAVA_PLATFORM, 1, entry->type2); + if (platform != NULL) { + (platform->base).direction = 0xff; + (platform->base).speed = 0; + (platform->base).parent = super; + (platform->base).x.HALF.HI = entry->x + gRoomControls.origin_x; + (platform->base).y.HALF.HI = entry->y + gRoomControls.origin_y; + (platform->base).collisionLayer = entry->collisionLayer; + platform->wobbleTime = entry->wobbleTime; + platform->respawnTime = entry->respawnTime; + platform->unk_78 = entry->unk_78; + UpdateSpriteForCollisionLayer((Entity*)platform); + sub_080A2CC0(&platform->base, &platform->unk_78, &platform->unk_76); + } + entry++; + } +} + +void sub_08092620(LavaPlatformEntity* this) { + LavaPlatformEntity* parent = (LavaPlatformEntity*)super->parent; + u32 one; + if (*(u8*)&parent->timer == 0) { + one = 1; + *(u8*)&parent->timer = one; + (parent->base).child = super; + CopyPosition(super, &parent->base); + super->action = one; + super->subAction = 0; + super->hitType = 0xac; + } +} + +void sub_0809264C(LavaPlatformEntity* this) { + if ((super->animationState & 1) != 0) { + super->action = 7; + super->hitType = 0xac; + } else { + super->action = 2; + super->hitType = 1; + } + super->flags |= ENT_COLLIDE; + super->spriteSettings.draw = 1; + super->spriteOffsetY = -3; + InitializeAnimation(super, super->animationState); +} + +bool32 LavaPlatform_IsPlayerOnPlatform(LavaPlatformEntity* this) { + if ((gPlayerState.flags & PL_MINISH) == 0 && EntityInRectRadius(super, &gPlayerEntity, 0x10, 0x10) && + sub_08079F8C()) { + gPlayerState.field_0x14 = 1; + if (gPlayerEntity.z.HALF.HI == 0) { + super->field_0xf = 1; + return TRUE; + } + } + + return FALSE; +} + +void sub_080926E4(LavaPlatformEntity* this) { + sub_080A2BE4(super, super->field_0xf); + if (super->action == 1) { + (super->parent)->x.HALF.HI = super->x.HALF.HI; + (super->parent)->y.HALF.HI = super->y.HALF.HI; + } + if (--this->unk_76 == 0) { + sub_080A2CC0(super, &this->unk_78, &this->unk_76); + } +} From 0aebbae239abcfcd2dce4423a6caa1a706a04f41 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Wed, 16 Feb 2022 17:41:35 +0100 Subject: [PATCH 06/10] Decompile BossDoor --- asm/object/bossDoor.s | 621 --------------------------------- assets/assets.json | 70 ---- data/const/object/bossDoor.s | 23 -- include/functions.h | 54 ++- include/object.h | 2 +- linker.ld | 4 +- src/code_08078778.c | 4 +- src/enemy/octorokBoss.c | 3 - src/npc/beedle.c | 3 +- src/npc/cat.c | 1 - src/npc/drLeft.c | 3 +- src/npc/gregal.c | 3 +- src/npc/mayorHagen.c | 2 +- src/npc/npc4E.c | 4 +- src/npc/rem.c | 1 - src/npc/smallTownMinish.c | 2 +- src/npc/smith.c | 3 +- src/npc/stockwell.c | 2 - src/npc/townMinish.c | 1 - src/npc/townsperson.c | 1 - src/object/bossDoor.c | 225 ++++++++++++ src/object/houseDoorExterior.c | 2 - src/object/lavaPlatform.c | 2 +- src/object/lockedDoor.c | 2 - src/object/object3E.c | 2 +- src/object/object6A.c | 5 - src/object/windcrest.c | 3 +- 27 files changed, 261 insertions(+), 787 deletions(-) delete mode 100644 asm/object/bossDoor.s delete mode 100644 data/const/object/bossDoor.s create mode 100644 src/object/bossDoor.c diff --git a/asm/object/bossDoor.s b/asm/object/bossDoor.s deleted file mode 100644 index 8e1ea6b8..00000000 --- a/asm/object/bossDoor.s +++ /dev/null @@ -1,621 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start BossDoor -BossDoor: @ 0x0808C1E4 - push {lr} - ldr r2, _0808C1F8 @ =gUnk_081214D8 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0808C1F8: .4byte gUnk_081214D8 - - thumb_func_start sub_0808C1FC -sub_0808C1FC: @ 0x0808C1FC - push {r4, r5, r6, lr} - adds r4, r0, #0 - adds r2, r4, #0 - adds r2, #0x84 - ldrh r1, [r2] - ldr r0, _0808C2B0 @ =0x0000FFFF - cmp r1, r0 - beq _0808C21A - adds r0, r1, #0 - bl CheckFlags - cmp r0, #0 - beq _0808C21A - bl DeleteThisEntity -_0808C21A: - adds r1, r4, #0 - adds r1, #0x86 - ldrh r0, [r1] - cmp r0, #0 - beq _0808C230 - bl CheckFlags - cmp r0, #0 - beq _0808C230 - bl DeleteThisEntity -_0808C230: - ldrb r0, [r4, #0xa] - lsrs r0, r0, #2 - strb r0, [r4, #0xb] - movs r0, #0xc0 - lsls r0, r0, #2 - strh r0, [r4, #0x24] - ldrh r1, [r4, #0x2e] - adds r0, r4, #0 - adds r0, #0x70 - strh r1, [r0] - ldrh r0, [r4, #0x32] - adds r1, r4, #0 - adds r1, #0x72 - strh r0, [r1] - ldr r0, _0808C2B4 @ =gHitbox_3 - str r0, [r4, #0x48] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #5 - orrs r0, r1 - strb r0, [r2] - ldrb r1, [r4, #0xa] - movs r0, #3 - ands r0, r1 - adds r5, r4, #0 - adds r5, #0x76 - strh r0, [r5] - movs r0, #0x2e - ldrsh r1, [r4, r0] - ldr r2, _0808C2B8 @ =gRoomControls - ldrh r0, [r2, #6] - subs r1, r1, r0 - asrs r1, r1, #4 - movs r3, #0x3f - ands r1, r3 - movs r6, #0x32 - ldrsh r0, [r4, r6] - ldrh r2, [r2, #8] - subs r0, r0, r2 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r1, r0 - adds r0, r4, #0 - adds r0, #0x74 - strh r1, [r0] - ldrb r0, [r4, #0xa] - movs r1, #0x1f - ands r1, r0 - adds r0, r4, #0 - bl InitializeAnimation - ldrb r0, [r4, #0xb] - cmp r0, #1 - beq _0808C2F8 - cmp r0, #1 - bgt _0808C2BC - cmp r0, #0 - beq _0808C2C2 - b _0808C31C - .align 2, 0 -_0808C2B0: .4byte 0x0000FFFF -_0808C2B4: .4byte gHitbox_3 -_0808C2B8: .4byte gRoomControls -_0808C2BC: - cmp r0, #2 - beq _0808C306 - b _0808C31C -_0808C2C2: - movs r2, #1 - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x18] - subs r0, #5 - ands r0, r1 - orrs r0, r2 - strb r0, [r4, #0x18] - adds r0, r4, #0 - bl sub_0808C500 - adds r0, r4, #0 - bl sub_08078800 - ldr r1, _0808C2F4 @ =gUnk_0811F740 - ldrh r0, [r5] - adds r0, r0, r1 - ldrb r2, [r0] - adds r0, r4, #0 - movs r1, #0 - movs r3, #0 - bl sub_08078850 - b _0808C31C - .align 2, 0 -_0808C2F4: .4byte gUnk_0811F740 -_0808C2F8: - movs r0, #4 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x18] - subs r0, #8 - ands r0, r1 - strb r0, [r4, #0x18] - b _0808C31C -_0808C306: - movs r2, #1 - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x18] - subs r0, #5 - ands r0, r1 - orrs r0, r2 - strb r0, [r4, #0x18] - adds r0, r4, #0 - bl sub_0808C500 -_0808C31C: - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_0808C320 -sub_0808C320: @ 0x0808C320 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x39 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0 - beq _0808C344 - movs r0, #2 - strb r0, [r4, #0xc] - adds r0, r4, #0 - bl sub_080788E0 - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl SetFlag -_0808C344: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0808C348 -sub_0808C348: @ 0x0808C348 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - bne _0808C37C - ldr r0, _0808C374 @ =gRoomTransition - ldr r0, [r0] - movs r1, #3 - ands r0, r1 - cmp r0, #0 - bne _0808C36A - ldr r0, _0808C378 @ =0x00000185 - bl SoundReq -_0808C36A: - adds r0, r4, #0 - bl GetNextFrame - b _0808C382 - .align 2, 0 -_0808C374: .4byte gRoomTransition -_0808C378: .4byte 0x00000185 -_0808C37C: - adds r0, r4, #0 - bl sub_0808C4BC -_0808C382: - pop {r4, pc} - - thumb_func_start sub_0808C384 -sub_0808C384: @ 0x0808C384 - push {r4, lr} - adds r4, r0, #0 - bl LinearMoveUpdate - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0808C3B4 - ldrb r0, [r4, #0xa] - cmp r0, #3 - bhi _0808C3B0 - movs r0, #0x40 - movs r1, #0 - movs r2, #1 - bl sub_08078AC0 - ldr r1, _0808C3B8 @ =gPlayerEntity - ldrb r0, [r4, #0xa] - lsls r0, r0, #3 - strb r0, [r1, #0x15] -_0808C3B0: - bl DeleteThisEntity -_0808C3B4: - pop {r4, pc} - .align 2, 0 -_0808C3B8: .4byte gPlayerEntity - - thumb_func_start sub_0808C3BC -sub_0808C3BC: @ 0x0808C3BC - push {r4, r5, lr} - adds r4, r0, #0 - adds r5, r4, #0 - adds r5, #0x76 - ldrh r1, [r5] - bl sub_08083734 - cmp r0, #0 - beq _0808C40E - movs r0, #5 - strb r0, [r4, #0xc] - movs r0, #0xc - strb r0, [r4, #0xe] - ldrb r1, [r4, #0x18] - subs r0, #0x10 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - ldrb r0, [r5] - lsls r0, r0, #3 - movs r1, #0x10 - eors r0, r1 - strb r0, [r4, #0x15] - ldrh r1, [r5] - lsls r1, r1, #1 - ldr r0, _0808C410 @ =gUnk_081214F4 - adds r1, r1, r0 - movs r0, #0 - ldrsb r0, [r1, r0] - ldrh r2, [r4, #0x2e] - adds r0, r0, r2 - strh r0, [r4, #0x2e] - movs r0, #1 - ldrsb r0, [r1, r0] - ldrh r1, [r4, #0x32] - adds r0, r0, r1 - strh r0, [r4, #0x32] - adds r0, r4, #0 - bl sub_0808C500 -_0808C40E: - pop {r4, r5, pc} - .align 2, 0 -_0808C410: .4byte gUnk_081214F4 - - thumb_func_start sub_0808C414 -sub_0808C414: @ 0x0808C414 - push {r4, r5, lr} - adds r4, r0, #0 - bl LinearMoveUpdate - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - lsrs r1, r0, #0x18 - cmp r1, #0 - bne _0808C49A - movs r0, #6 - strb r0, [r4, #0xc] - strh r1, [r4, #0x36] - adds r0, r4, #0 - adds r0, #0x70 - ldrh r0, [r0] - strh r0, [r4, #0x2e] - adds r0, r4, #0 - adds r0, #0x72 - ldrh r0, [r0] - strh r0, [r4, #0x32] - adds r0, r4, #0 - adds r0, #0x76 - ldrh r0, [r0] - lsls r0, r0, #2 - ldr r1, _0808C49C @ =gUnk_081214FC - adds r5, r0, r1 - adds r0, r4, #0 - movs r1, #0x11 - movs r2, #0x40 - bl CreateFx - adds r1, r0, #0 - cmp r1, #0 - beq _0808C470 - movs r0, #0 - ldrsb r0, [r5, r0] - ldrh r2, [r1, #0x2e] - adds r0, r0, r2 - strh r0, [r1, #0x2e] - movs r0, #1 - ldrsb r0, [r5, r0] - ldrh r2, [r1, #0x32] - adds r0, r0, r2 - strh r0, [r1, #0x32] -_0808C470: - adds r0, r4, #0 - movs r1, #0x11 - movs r2, #0x40 - bl CreateFx - adds r1, r0, #0 - cmp r1, #0 - beq _0808C494 - movs r0, #2 - ldrsb r0, [r5, r0] - ldrh r2, [r1, #0x2e] - adds r0, r0, r2 - strh r0, [r1, #0x2e] - movs r0, #3 - ldrsb r0, [r5, r0] - ldrh r2, [r1, #0x32] - adds r0, r0, r2 - strh r0, [r1, #0x32] -_0808C494: - ldr r0, _0808C4A0 @ =0x0000010B - bl EnqueueSFX -_0808C49A: - pop {r4, r5, pc} - .align 2, 0 -_0808C49C: .4byte gUnk_081214FC -_0808C4A0: .4byte 0x0000010B - - thumb_func_start sub_0808C4A4 -sub_0808C4A4: @ 0x0808C4A4 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - beq _0808C4B8 - movs r0, #2 - strb r0, [r4, #0xc] -_0808C4B8: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0808C4BC -sub_0808C4BC: @ 0x0808C4BC - push {lr} - movs r1, #3 - strb r1, [r0, #0xc] - movs r1, #0xc - strb r1, [r0, #0xe] - adds r2, r0, #0 - adds r2, #0x76 - ldrh r1, [r2] - lsls r1, r1, #3 - strb r1, [r0, #0x15] - ldrh r2, [r2] - lsls r2, r2, #1 - ldr r1, _0808C4F8 @ =gUnk_0812150C - adds r2, r2, r1 - movs r1, #0 - ldrsb r1, [r2, r1] - ldrh r3, [r0, #0x2e] - adds r1, r1, r3 - strh r1, [r0, #0x2e] - movs r1, #1 - ldrsb r1, [r2, r1] - ldrh r2, [r0, #0x32] - adds r1, r1, r2 - strh r1, [r0, #0x32] - bl sub_0808C5D0 - ldr r0, _0808C4FC @ =0x0000010B - bl SoundReq - pop {pc} - .align 2, 0 -_0808C4F8: .4byte gUnk_0812150C -_0808C4FC: .4byte 0x0000010B - - thumb_func_start sub_0808C500 -sub_0808C500: @ 0x0808C500 - push {r4, r5, r6, lr} - adds r4, r0, #0 - adds r0, #0x76 - ldrh r0, [r0] - cmp r0, #0 - beq _0808C510 - cmp r0, #2 - bne _0808C570 -_0808C510: - adds r6, r4, #0 - adds r6, #0x74 - ldrh r0, [r6] - subs r0, #1 - adds r5, r4, #0 - adds r5, #0x38 - ldrb r1, [r5] - bl GetTileIndex - adds r1, r4, #0 - adds r1, #0x78 - strh r0, [r1] - ldrh r0, [r6] - ldrb r1, [r5] - bl GetTileIndex - adds r1, r4, #0 - adds r1, #0x7a - strh r0, [r1] - ldrh r0, [r6] - adds r0, #1 - ldrb r1, [r5] - bl GetTileIndex - adds r1, r4, #0 - adds r1, #0x7c - strh r0, [r1] - ldr r4, _0808C56C @ =0x00004022 - ldrh r1, [r6] - subs r1, #1 - ldrb r2, [r5] - adds r0, r4, #0 - bl SetTile - ldrh r1, [r6] - ldrb r2, [r5] - adds r0, r4, #0 - bl SetTile - ldrh r1, [r6] - adds r1, #1 - ldrb r2, [r5] - adds r0, r4, #0 - bl SetTile - b _0808C5CA - .align 2, 0 -_0808C56C: .4byte 0x00004022 -_0808C570: - adds r6, r4, #0 - adds r6, #0x74 - ldrh r0, [r6] - subs r0, #0x40 - adds r5, r4, #0 - adds r5, #0x38 - ldrb r1, [r5] - bl GetTileIndex - adds r1, r4, #0 - adds r1, #0x78 - strh r0, [r1] - ldrh r0, [r6] - ldrb r1, [r5] - bl GetTileIndex - adds r1, r4, #0 - adds r1, #0x7a - strh r0, [r1] - ldrh r0, [r6] - adds r0, #0x40 - ldrb r1, [r5] - bl GetTileIndex - adds r1, r4, #0 - adds r1, #0x7c - strh r0, [r1] - ldr r4, _0808C5CC @ =0x00004022 - ldrh r1, [r6] - subs r1, #0x40 - ldrb r2, [r5] - adds r0, r4, #0 - bl SetTile - ldrh r1, [r6] - ldrb r2, [r5] - adds r0, r4, #0 - bl SetTile - ldrh r1, [r6] - adds r1, #0x40 - ldrb r2, [r5] - adds r0, r4, #0 - bl SetTile -_0808C5CA: - pop {r4, r5, r6, pc} - .align 2, 0 -_0808C5CC: .4byte 0x00004022 - - thumb_func_start sub_0808C5D0 -sub_0808C5D0: @ 0x0808C5D0 - push {r4, r5, r6, lr} - adds r6, r0, #0 - adds r0, #0x76 - ldrh r0, [r0] - cmp r0, #0 - beq _0808C5E0 - cmp r0, #2 - bne _0808C618 -_0808C5E0: - adds r0, r6, #0 - adds r0, #0x78 - ldrh r0, [r0] - adds r5, r6, #0 - adds r5, #0x74 - ldrh r1, [r5] - subs r1, #1 - adds r4, r6, #0 - adds r4, #0x38 - ldrb r2, [r4] - bl SetTile - adds r0, r6, #0 - adds r0, #0x7a - ldrh r0, [r0] - ldrh r1, [r5] - ldrb r2, [r4] - bl SetTile - adds r0, r6, #0 - adds r0, #0x7c - ldrh r0, [r0] - ldrh r1, [r5] - adds r1, #1 - ldrb r2, [r4] - bl SetTile - b _0808C64E -_0808C618: - adds r0, r6, #0 - adds r0, #0x78 - ldrh r0, [r0] - adds r5, r6, #0 - adds r5, #0x74 - ldrh r1, [r5] - subs r1, #0x40 - adds r4, r6, #0 - adds r4, #0x38 - ldrb r2, [r4] - bl SetTile - adds r0, r6, #0 - adds r0, #0x7a - ldrh r0, [r0] - ldrh r1, [r5] - ldrb r2, [r4] - bl SetTile - adds r0, r6, #0 - adds r0, #0x7c - ldrh r0, [r0] - ldrh r1, [r5] - adds r1, #0x40 - ldrb r2, [r4] - bl SetTile -_0808C64E: - pop {r4, r5, r6, pc} - - thumb_func_start sub_0808C650 -sub_0808C650: @ 0x0808C650 - push {r4, lr} - adds r4, r0, #0 - adds r2, r1, #0 - movs r0, #0x3a - movs r1, #0 - bl CreateObject - cmp r0, #0 - beq _0808C670 - str r4, [r0, #0x50] - ldr r1, _0808C66C @ =gUnk_02036BB8 - movs r0, #0 - b _0808C674 - .align 2, 0 -_0808C66C: .4byte gUnk_02036BB8 -_0808C670: - ldr r1, _0808C678 @ =gUnk_02036BB8 - movs r0, #1 -_0808C674: - str r0, [r1] - pop {r4, pc} - .align 2, 0 -_0808C678: .4byte gUnk_02036BB8 - - thumb_func_start sub_0808C67C -sub_0808C67C: @ 0x0808C67C - ldr r0, _0808C684 @ =gUnk_02036BB8 - ldr r0, [r0] - bx lr - .align 2, 0 -_0808C684: .4byte gUnk_02036BB8 - - thumb_func_start sub_0808C688 -sub_0808C688: @ 0x0808C688 - push {lr} - bl sub_0801E104 - ldr r1, _0808C698 @ =gUnk_02036BB8 - movs r0, #1 - str r0, [r1] - pop {pc} - .align 2, 0 -_0808C698: .4byte gUnk_02036BB8 diff --git a/assets/assets.json b/assets/assets.json index 9ae86a88..6c4394a3 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -43544,21 +43544,6 @@ "size": 4, "type": "animation" }, - { - "path": "bossDoor/gUnk_081214F4.bin", - "start": 1185012, - "size": 8 - }, - { - "path": "bossDoor/gUnk_081214FC.bin", - "start": 1185020, - "size": 16 - }, - { - "path": "bossDoor/gUnk_0812150C.bin", - "start": 1185036, - "size": 8 - }, { "path": "object3A/gUnk_081215E8.bin", "start": 1185256, @@ -47275,61 +47260,6 @@ "EU": -2484 } }, - { - "path": "data_08132B30/gUnk_08133918.bin", - "start": 1259800, - "size": 32 - }, - { - "path": "data_08132B30/gUnk_08133938.bin", - "start": 1259832, - "size": 32 - }, - { - "path": "data_08132B30/gUnk_08133958.bin", - "start": 1259864, - "size": 32 - }, - { - "path": "data_08132B30/gUnk_08133978.bin", - "start": 1259896, - "size": 32 - }, - { - "path": "data_08132B30/gUnk_08133998.bin", - "start": 1259928, - "size": 32 - }, - { - "path": "data_08132B30/gUnk_081339B8.bin", - "start": 1259960, - "size": 32 - }, - { - "path": "data_08132B30/gUnk_081339D8.bin", - "start": 1259992, - "size": 32 - }, - { - "path": "data_08132B30/gUnk_081339F8.bin", - "start": 1260024, - "size": 32 - }, - { - "path": "data_08132B30/gUnk_08133A40.bin", - "start": 1260096, - "size": 26 - }, - { - "path": "data_08132B30/gUnk_08133A5A.bin", - "start": 1260122, - "size": 13 - }, - { - "path": "data_08132B30/gUnk_08133A67.bin", - "start": 1260135, - "size": 1249 - }, { "path": "exit_lists/gExitList_NoExitList.bin", "start": 1261512, diff --git a/data/const/object/bossDoor.s b/data/const/object/bossDoor.s deleted file mode 100644 index 1262046b..00000000 --- a/data/const/object/bossDoor.s +++ /dev/null @@ -1,23 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_081214D8:: @ 081214D8 - .4byte sub_0808C1FC - .4byte sub_0808C320 - .4byte sub_0808C348 - .4byte sub_0808C384 - .4byte sub_0808C3BC - .4byte sub_0808C414 - .4byte sub_0808C4A4 - -gUnk_081214F4:: @ 081214F4 - .incbin "bossDoor/gUnk_081214F4.bin" - -gUnk_081214FC:: @ 081214FC - .incbin "bossDoor/gUnk_081214FC.bin" - -gUnk_0812150C:: @ 0812150C - .incbin "bossDoor/gUnk_0812150C.bin" diff --git a/include/functions.h b/include/functions.h index ac9efa91..7af14697 100644 --- a/include/functions.h +++ b/include/functions.h @@ -14,9 +14,12 @@ // Identified - to be sorted into header files extern void CalculateEntityTileCollisions(Entity*, u32, u32); +extern u32 CheckOnScreen(Entity*); +extern u32 CheckRegionOnScreen(u32, u32, u32, u32); extern void CopyOAM(void); extern void CreateChestSpawner(Entity*); extern void CreateItemOnGround(Entity*); +extern void CreateMagicSparkles(u32, u32, u32); extern void CreateRandomItemDrop(Entity*, s32); extern void DrawDirect(u32, u32); // trampoline to sub_080B27F4 extern void DrawEntities(void); @@ -26,9 +29,9 @@ extern u32 EntityWithinDistance(Entity*, s32, s32, s32); extern void FlushSprites(void); extern void GenericKnockback2(Entity*); extern LayerStruct* GetLayerByIndex(u32); +extern u32 GetRandomByWeight(const u8*); extern u32 GetTileIndex(u32, u32); extern u32 IsColliding(Entity*, Entity*); -extern u32 IsColliding(Entity*, Entity*); extern u32 IsCollidingPlayer(Entity*); extern bool32 IsProjectileOffScreen(Entity*); extern bool32 IsTileCollision(u8*, s32, s32, u32); @@ -38,7 +41,6 @@ extern bool32 LoadFixedGFX(Entity*, u32); extern bool32 LoadSwapGFX(Entity*, u16, u32); extern void MenuFadeIn(u32, u32); extern u32 PlayerInRange(Entity*, u32, u32); -extern u32 PlayerInRange(Entity*, u32, u32); extern bool32 ProcessMovement1(Entity*); extern bool32 ProcessMovement12(Entity*); extern bool32 ProcessMovement2(Entity*); @@ -49,8 +51,6 @@ extern bool32 ProcessMovement6(Entity*); extern bool32 ProcessMovementInternal(Entity*, s32, s32, u32); extern void SetDirtTile(u32); extern void SoundReqClipped(Entity*, u32); -extern void SoundReqClipped(Entity*, u32); -extern void SoundReqClipped(Entity*, u32); extern void TryLoadPrologueHyruleTown(void); extern void UnloadOBJPalette(Entity*); extern void UpdateItemAnim(ItemBehavior*); @@ -65,6 +65,7 @@ extern u32 sub_080002CC(Entity*, s32, s32); extern u32 sub_080002D4(s32, s32, u32); extern u32 sub_080002E0(u32, u32); extern s32 sub_080012DC(Entity*); +extern void sub_08001318(Entity*); extern u32 sub_0800132C(Entity*, Entity*); extern u32 sub_080040A2(Entity*); extern u32 sub_080040D8(Entity*, u8*, s32, s32); @@ -87,6 +88,7 @@ extern void sub_0801AF18(u8*, u32, u32); extern void sub_0801AFE4(void); extern void sub_0801C1D4(void); extern void sub_0801E104(void); +extern void sub_08027870(Entity*); extern void sub_08030118(u32); extern u32 sub_08031E04(Entity*); extern void sub_08031E48(Entity*, Entity*); @@ -95,12 +97,14 @@ extern u32 sub_080322A4(Entity*); extern void sub_080322E8(Entity*); extern void sub_08032338(Entity*); extern void sub_0803C0AC(Entity*); +extern void sub_08049CF4(Entity*); extern Entity* sub_08049DF4(u32); extern u32 sub_08049EE4(Entity*); extern u32 sub_08049F1C(Entity*, Entity*, u32); extern u32 sub_08049F84(Entity*, u32); extern u32 sub_08049FA0(Entity*); extern u32 sub_08049FDC(Entity*, u32); +extern u32 sub_0804A024(Entity*, u32, u32); extern u32 sub_0804A044(Entity*, Entity*, u32); extern void sub_0804A720(Entity*); extern void sub_0804AA1C(Entity*); @@ -149,17 +153,20 @@ extern void sub_08077F50(ItemBehavior* beh, u32 arg1); extern void sub_080784C8(); extern void sub_08078790(Entity*, u32); extern void sub_080787CC(Entity*); +extern s32 sub_08078800(Entity*); +extern void sub_08078850(Entity*, u32, u32, void*); extern s32 sub_0807887C(Entity*, u32, u32); extern void sub_080788E0(Entity*); extern s32 sub_08078904(); extern void sub_08078930(Entity*); -extern void sub_08078930(Entity*); extern void sub_08078954(Entity*); +extern void sub_08078AC0(u32, u32, u32); extern void sub_08078B48(void); extern void sub_08078E84(Entity*, Entity*); extern void sub_08079184(); extern void sub_0807919C(); extern void sub_0807921C(); +extern void sub_080792BC(s32, u32, u32); extern u32 sub_0807953C(void); extern void sub_08079BD8(Entity*); extern u32 sub_08079D48(); @@ -181,40 +188,21 @@ extern void sub_0808091C(const ScreenTransitionData*, u32); extern void sub_080809D4(void); extern void sub_08080CB4(Entity*); extern u32 sub_0808288C(Entity*, u32, u32, u32); +extern bool32 sub_08083734(Entity*, u32); // lockedDoor +extern void sub_08095C48(Entity*); +extern void sub_0809EABC(Entity*); +extern void sub_0809EAD8(Entity*); +extern void sub_0809EB30(Entity*); +extern void sub_080A1ED0(u32, u32, u32); extern Entity* sub_080A2A3C(Entity*, u32, u32, u32); extern Entity* sub_080A2AD4(Entity*); extern void sub_080A2AF4(Entity*, u32, u32); +extern void sub_080A2CC0(Entity*, Entity**, u16*); extern void sub_080A57F4(void); extern void sub_080A71C4(u32, u32, u32, u32); extern void sub_080A7C18(u32, u32, u32); extern void sub_080AE068(Entity*); -extern void sub_080AF284(void); -extern void sub_08078930(Entity*); -extern void sub_08078954(Entity*); -extern void sub_0809EB30(Entity*); -extern void sub_0809EAD8(Entity*); -extern void sub_0809EABC(Entity*); -extern void sub_08079D84(void); -extern void sub_080A2CC0(Entity*, Entity**, u16*); -// extern void sub_080A2CC0(Entity*, void*, void*); -extern void sub_08095C48(Entity*); -extern s32 sub_080012DC(Entity*); -extern u32 sub_0804A024(Entity*, u32, u32); -extern s32 sub_080012DC(Entity*); -extern void sub_08001318(Entity*); -extern void sub_080043A8(Entity*); -extern u32 sub_08049F1C(Entity*, Entity*, u32); -extern void sub_0804AA1C(Entity*); -extern void sub_08027870(Entity*); -extern u32 sub_0804A044(Entity*, Entity*, u32); -extern void sub_0804AA1C(Entity*); -extern void sub_08049CF4(Entity*); -extern void sub_0806FCF4(Entity*, s32, s32, s32); -extern u32 sub_080041DC(Entity*, u32, u32); -extern void sub_080AE58C(Entity*, u32, u32); -extern u32 sub_0800132C(Entity*, Entity*); extern bool32 sub_080AE4CC(Entity*, u32, u32, u32); -extern void sub_08008796(Entity*, u32, u32, u32); -extern void sub_08078AC0(u32, u32, u32); -extern void CreateMagicSparkles(u32, u32, u32); +extern void sub_080AE58C(Entity*, u32, u32); +extern void sub_080AF284(void); #endif diff --git a/include/object.h b/include/object.h index b1cd0f19..93856cbf 100644 --- a/include/object.h +++ b/include/object.h @@ -283,7 +283,7 @@ void Object35(Entity*); void Object36(Entity*); void Object37(Entity*); void JarPortal(Entity*); -void BossDoor(Entity*); +void BossDoor(); void Object3A(Entity*); void MacroMushromStalks(Entity*); void MacroPlayer(Entity*); diff --git a/linker.ld b/linker.ld index 07381ccd..6b20c529 100644 --- a/linker.ld +++ b/linker.ld @@ -700,7 +700,7 @@ SECTIONS { asm/object/object36.o(.text); asm/object/object37.o(.text); src/object/jarPortal.o(.text); - asm/object/bossDoor.o(.text); + src/object/bossDoor.o(.text); asm/object/object3A.o(.text); asm/object/macroMushroomStalks.o(.text); asm/object/object75.o(.text); /* 75 and 76 are mislocated in object table */ @@ -1436,7 +1436,7 @@ SECTIONS { data/const/object/object37.o(.rodata); data/const/object/jarPortal.o(.rodata); data/animations/object/jarPortal.o(.rodata); - data/const/object/bossDoor.o(.rodata); + src/object/bossDoor.o(.rodata); data/animations/object/bossDoor.o(.rodata); data/const/object/object3A.o(.rodata); data/const/object/macroMushroomStalks.o(.rodata); diff --git a/src/code_08078778.c b/src/code_08078778.c index 643cd7bc..4f0f85db 100644 --- a/src/code_08078778.c +++ b/src/code_08078778.c @@ -65,13 +65,13 @@ s32 sub_08078828(Entity* ent) { return iVar1; } -void sub_08078850(u32 arg0, u32 arg1, u32 arg2, u32 arg3) { +void sub_08078850(Entity* arg0, u32 arg1, u32 arg2, void* arg3) { s32 iVar1; iVar1 = sub_08078904(); if (iVar1 >= 0) { gUnk_03003DF0[iVar1].unk[8] = arg1; gUnk_03003DF0[iVar1].unk[10] = arg2; - *(&gUnk_03003DF0[iVar1].unk4 + 1) = arg3; + *(&gUnk_03003DF0[iVar1].unk4 + 1) = (u32)arg3; } } diff --git a/src/enemy/octorokBoss.c b/src/enemy/octorokBoss.c index 4ae0be4e..cd45f7cf 100644 --- a/src/enemy/octorokBoss.c +++ b/src/enemy/octorokBoss.c @@ -11,9 +11,6 @@ #include "projectile.h" #include "game.h" -extern u32 GetRandomByWeight(const u8*); -extern void sub_080792BC(s32, u32, u32); - enum OctorokRotation { ROTATION_CW, ROTATION_CCW, NO_ROTATION = 0xff }; typedef struct HelperStruct { diff --git a/src/npc/beedle.c b/src/npc/beedle.c index 9a9717ab..41c81f2f 100644 --- a/src/npc/beedle.c +++ b/src/npc/beedle.c @@ -5,14 +5,13 @@ #include "script.h" #include "npc.h" #include "game.h" +#include "functions.h" typedef struct { u32 unk_00; s8 unk_04; } gUnk_0810C89C_struct; -extern void sub_08078850(Entity*, u32, s8, gUnk_0810C89C_struct*); - extern u8 gUnk_0810C88C[]; extern Hitbox gUnk_0810C894; extern gUnk_0810C89C_struct gUnk_0810C89C[]; diff --git a/src/npc/cat.c b/src/npc/cat.c index a5cba705..9de7337d 100644 --- a/src/npc/cat.c +++ b/src/npc/cat.c @@ -34,7 +34,6 @@ extern void sub_08067DCC(Entity*, u32); extern u8 gUnk_0811110C[2]; extern u32 gUnk_0811110F; -extern void sub_08078850(Entity*, u32, u8, u32*); extern u16 gUnk_08111104[]; diff --git a/src/npc/drLeft.c b/src/npc/drLeft.c index 65eabde0..0cd15668 100644 --- a/src/npc/drLeft.c +++ b/src/npc/drLeft.c @@ -1,6 +1,5 @@ #include "npc.h" - -extern void sub_08078850(Entity*, u32, u8, u32*); +#include "functions.h" extern u32 gUnk_081133B4; void sub_0806BFD8(Entity* this); diff --git a/src/npc/gregal.c b/src/npc/gregal.c index 34f5dbd6..d503f209 100644 --- a/src/npc/gregal.c +++ b/src/npc/gregal.c @@ -5,7 +5,6 @@ extern void (*gUnk_08113D8C[])(Entity*); -extern void sub_08078850(Entity*, u32, u8, u32*); extern u32 gUnk_08113D84[]; void Gregal(Entity* this) { @@ -32,7 +31,7 @@ void sub_0806CAF4(Entity* this) { } sub_0807DD64(this); sub_08078778(this); - sub_08078850(this, 1, gUnk_08113D84[1], gUnk_08113D84); + sub_08078850(this, 1, (u8)gUnk_08113D84[1], gUnk_08113D84); } ExecuteScriptForEntity(this, NULL); HandleEntity0x82Actions(this); diff --git a/src/npc/mayorHagen.c b/src/npc/mayorHagen.c index 673b2b81..0fad2970 100644 --- a/src/npc/mayorHagen.c +++ b/src/npc/mayorHagen.c @@ -3,8 +3,8 @@ #include "player.h" #include "flags.h" #include "npc.h" +#include "functions.h" -extern void sub_08078850(Entity*, u32, u32, u32*); extern u32 gUnk_08113F44; extern Dialog gUnk_08113F48[]; diff --git a/src/npc/npc4E.c b/src/npc/npc4E.c index b842076f..8e60e1db 100644 --- a/src/npc/npc4E.c +++ b/src/npc/npc4E.c @@ -14,8 +14,6 @@ typedef struct { s8 unk_04; } gUnk_0810C89C_struct; -extern void sub_08078850(Entity*, u32, u8 /* TODO this is a s8 in beedle.c*/, gUnk_0810C89C_struct*); - extern void script_Object3ELeftStoneOpening; // Cutscene data type? extern void script_Object3ERightStoneOpening; // Cutscene data type? @@ -46,7 +44,7 @@ void sub_0806DA04(Entity* this, ScriptExecutionContext* context) { // TODO gUnk_0811415C should be a gUnk_0810C89C_struct[], but then a lot of bytes everywhere are wrong? gUnk_0810C89C_struct* a = (gUnk_0810C89C_struct*)&( (gUnk_0810C89C_struct*)gUnk_0811415C)[context->intVariable]; // cast necessary to no longer make it a const* ? - sub_08078850(this, 1, a->unk_04, a); + sub_08078850(this, 1, (u8)a->unk_04, a); } void sub_0806DA1C(Entity* this, ScriptExecutionContext* context) { diff --git a/src/npc/rem.c b/src/npc/rem.c index 392c8198..8c321d01 100644 --- a/src/npc/rem.c +++ b/src/npc/rem.c @@ -8,7 +8,6 @@ extern void (*gUnk_08112278[])(Entity*); extern void script_Rem; -extern void sub_08078850(Entity*, u32, u32, u32*); extern u32 gUnk_0811229C; extern void sub_0807F950(Entity* this, ScriptExecutionContext* context); diff --git a/src/npc/smallTownMinish.c b/src/npc/smallTownMinish.c index d4e7d1ea..b9526d34 100644 --- a/src/npc/smallTownMinish.c +++ b/src/npc/smallTownMinish.c @@ -4,9 +4,9 @@ #include "script.h" #include "save.h" #include "npc.h" +#include "functions.h" extern Hitbox gUnk_081142FC; -extern void sub_08078850(Entity*, u32, u32, u32*); extern u32 gUnk_08114304; extern Dialog gUnk_08114308[]; diff --git a/src/npc/smith.c b/src/npc/smith.c index 9667b16c..1b922edc 100644 --- a/src/npc/smith.c +++ b/src/npc/smith.c @@ -1,6 +1,5 @@ #include "npc.h" - -extern void sub_08078850(Entity*, u32, u32, u32*); +#include "functions.h" extern void (*const gUnk_08110360[])(Entity*); extern void (*const gUnk_0811036C[])(Entity*); diff --git a/src/npc/stockwell.c b/src/npc/stockwell.c index dced086b..2b02257b 100644 --- a/src/npc/stockwell.c +++ b/src/npc/stockwell.c @@ -14,8 +14,6 @@ extern u16 script_StockwellBuy[]; extern u16 script_StockwellDogFood[]; extern u8 gUnk_0810FDB8[]; -extern void sub_08078850(Entity*, u32, u8, u32*); -extern void InitScriptExecutionContext(ScriptExecutionContext* context, u16* script); extern u32 gUnk_0810FDA0; extern u16 script_Stockwell; diff --git a/src/npc/townMinish.c b/src/npc/townMinish.c index 5b30edc6..fecc3747 100644 --- a/src/npc/townMinish.c +++ b/src/npc/townMinish.c @@ -8,7 +8,6 @@ extern void sub_0806ACC4(Entity*); extern void sub_0806AEA8(Entity*); extern void sub_0806AEE4(Entity*); extern void sub_0806AFE8(Entity*, ScriptExecutionContext*); -extern void sub_08078850(Entity*, u32, u32, u32*); extern u8 gUnk_081125F4[12]; extern SpriteLoadData gUnk_08112674[]; diff --git a/src/npc/townsperson.c b/src/npc/townsperson.c index f888ea21..3de73499 100644 --- a/src/npc/townsperson.c +++ b/src/npc/townsperson.c @@ -13,7 +13,6 @@ extern void (*const gUnk_0810B77C[])(Entity*); extern void sub_08061CB4(Entity*, u32); extern void sub_08061D64(Entity*); extern void sub_08062048(Entity*); -extern void sub_08078850(Entity*, u32, u8, u32*); extern SpriteLoadData* gUnk_0810B6EC[]; extern u8 gUnk_0810B78C[]; diff --git a/src/object/bossDoor.c b/src/object/bossDoor.c new file mode 100644 index 00000000..aebe6edc --- /dev/null +++ b/src/object/bossDoor.c @@ -0,0 +1,225 @@ +/** + * @file bossDoor.c + * @ingroup Objects + * + * @brief Boss Door object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68[8]; + /*0x70*/ u16 unk_70; + /*0x72*/ u16 unk_72; + /*0x74*/ u16 unk_74; + /*0x76*/ u16 unk_76; + /*0x78*/ u16 unk_78; + /*0x7a*/ u16 unk_7a; + /*0x7c*/ u16 unk_7c; + /*0x7e*/ u8 unk_7e[6]; + /*0x84*/ u16 unk_84; + /*0x86*/ u16 unk_86; +} BossDoorEntity; + +extern Hitbox gHitbox_3; +extern bool32 gUnk_02036BB8; +extern const u8 gUnk_0811F740[]; + +void sub_0808C500(BossDoorEntity*); +void sub_0808C4BC(BossDoorEntity*); +void sub_0808C5D0(BossDoorEntity*); +void BossDoor_Init(BossDoorEntity*); +void BossDoor_Action1(BossDoorEntity*); +void BossDoor_Action2(BossDoorEntity*); +void BossDoor_Action3(BossDoorEntity*); +void BossDoor_Action4(BossDoorEntity*); +void BossDoor_Action5(BossDoorEntity*); +void BossDoor_Action6(BossDoorEntity*); + +void BossDoor(BossDoorEntity* this) { + static void (*const BossDoor_Actions[])(BossDoorEntity*) = { + BossDoor_Init, BossDoor_Action1, BossDoor_Action2, BossDoor_Action3, + BossDoor_Action4, BossDoor_Action5, BossDoor_Action6, + }; + BossDoor_Actions[super->action](this); +} + +void BossDoor_Init(BossDoorEntity* this) { + if ((this->unk_84 != 0xffff) && CheckFlags(this->unk_84)) { + DeleteThisEntity(); + } + if ((this->unk_86 != BEGIN) && CheckFlags(this->unk_86)) { + DeleteThisEntity(); + } + super->type2 = super->type >> 2; + super->speed = 0x300; + this->unk_70 = super->x.HALF.HI; + this->unk_72 = super->y.HALF.HI; + super->hitbox = (Hitbox*)&gHitbox_3; + super->spritePriority.b0 = 5; + this->unk_76 = super->type & 3; + this->unk_74 = COORD_TO_TILE(super); + InitializeAnimation(super, super->type & 0x1f); + switch (super->type2) { + case 0: + super->action = 1; + super->spriteSettings.draw = 1; + sub_0808C500(this); + sub_08078800(super); + sub_08078850(super, 0, gUnk_0811F740[this->unk_76], 0); + break; + case 1: + super->action = 4; + super->spriteSettings.draw = 0; + break; + case 2: + super->action = 1; + super->spriteSettings.draw = 1; + sub_0808C500(this); + break; + } +} + +void BossDoor_Action1(BossDoorEntity* this) { + if (super->interactType != 0) { + super->action = 2; + sub_080788E0(super); + SetFlag(this->unk_86); + } +} + +void BossDoor_Action2(BossDoorEntity* this) { + if ((super->frame & 0x80) == 0) { + if ((gRoomTransition.frameCount & 3) == 0) { + SoundReq(SFX_185); + } + GetNextFrame(super); + } else { + sub_0808C4BC(this); + } +} + +void BossDoor_Action3(BossDoorEntity* this) { + LinearMoveUpdate(super); + if (--super->actionDelay == 0) { + if (super->type < 4) { + sub_08078AC0(0x40, 0, 1); + gPlayerEntity.direction = super->type << 3; + } + DeleteThisEntity(); + } +} + +void BossDoor_Action4(BossDoorEntity* this) { + static const s8 gUnk_081214F4[] = { 0, -36, 36, 0, 0, 36, -36, 0 }; + const s8* ptr; + + if (sub_08083734(super, this->unk_76)) { + super->action = 5; + super->actionDelay = 0xc; + super->spriteSettings.draw = 1; + super->direction = *(u8*)&this->unk_76 << 3 ^ 0x10; + ptr = &gUnk_081214F4[this->unk_76 * 2]; + super->x.HALF.HI += ptr[0]; + super->y.HALF.HI += ptr[1]; + sub_0808C500(this); + } +} + +void BossDoor_Action5(BossDoorEntity* this) { + static const s8 gUnk_081214FC[] = { 12, 12, -12, 12, -12, 12, -12, -12, 12, -12, -12, -12, 12, 12, 12, -12 }; + Entity* effect; + const s8* ptr; + + LinearMoveUpdate(super); + if (--super->actionDelay == 0) { + super->action = 6; + super->z.HALF.HI = 0; + super->x.HALF.HI = this->unk_70; + super->y.HALF.HI = this->unk_72; + ptr = &gUnk_081214FC[this->unk_76 * 4]; + effect = CreateFx(super, FX_DASH, 0x40); + if (effect != NULL) { + effect->x.HALF.HI += ptr[0]; + effect->y.HALF.HI += ptr[1]; + } + effect = CreateFx(super, FX_DASH, 0x40); + if (effect != NULL) { + effect->x.HALF.HI += ptr[2]; + effect->y.HALF.HI += ptr[3]; + } + EnqueueSFX(SFX_10B); + } +} + +void BossDoor_Action6(BossDoorEntity* this) { + if (CheckFlags(this->unk_86)) { + super->action = 2; + } +} + +void sub_0808C4BC(BossDoorEntity* this) { + static const s8 gUnk_0812150C[] = { 0, -2, 2, 0, 0, 2, -2, 0 }; + const s8* ptr; + super->action = 3; + super->actionDelay = 0xc; + super->direction = this->unk_76 * 8; + ptr = &gUnk_0812150C[this->unk_76 * 2]; + super->x.HALF.HI += ptr[0]; + super->y.HALF.HI += ptr[1]; + sub_0808C5D0(this); + SoundReq(SFX_10B); +} + +void sub_0808C500(BossDoorEntity* this) { + if ((this->unk_76 == 0) || (this->unk_76 == 2)) { + this->unk_78 = GetTileIndex(this->unk_74 - 1, super->collisionLayer); + this->unk_7a = GetTileIndex(this->unk_74, super->collisionLayer); + this->unk_7c = GetTileIndex(this->unk_74 + 1, super->collisionLayer); + SetTile(0x4022, this->unk_74 - 1, super->collisionLayer); + SetTile(0x4022, this->unk_74, super->collisionLayer); + SetTile(0x4022, this->unk_74 + 1, super->collisionLayer); + } else { + this->unk_78 = GetTileIndex(this->unk_74 - 0x40, super->collisionLayer); + this->unk_7a = GetTileIndex(this->unk_74, super->collisionLayer); + this->unk_7c = GetTileIndex(this->unk_74 + 0x40, super->collisionLayer); + SetTile(0x4022, this->unk_74 - 0x40, super->collisionLayer); + SetTile(0x4022, this->unk_74, super->collisionLayer); + SetTile(0x4022, this->unk_74 + 0x40, super->collisionLayer); + } +} + +void sub_0808C5D0(BossDoorEntity* this) { + if ((this->unk_76 == 0) || (this->unk_76 == 2)) { + SetTile(this->unk_78, this->unk_74 - 1, super->collisionLayer); + SetTile(this->unk_7a, this->unk_74, super->collisionLayer); + SetTile(this->unk_7c, this->unk_74 + 1, super->collisionLayer); + } else { + SetTile(this->unk_78, this->unk_74 - 0x40, super->collisionLayer); + SetTile(this->unk_7a, this->unk_74, super->collisionLayer); + SetTile(this->unk_7c, this->unk_74 + 0x40, super->collisionLayer); + } +} + +void sub_0808C650(Entity* this, u32 param_2) { + Entity* obj = CreateObject(OBJECT_3A, 0, param_2); + if (obj != NULL) { + obj->parent = this; + gUnk_02036BB8 = FALSE; + } else { + gUnk_02036BB8 = TRUE; + } +} + +bool32 sub_0808C67C(void) { + return gUnk_02036BB8; +} + +void sub_0808C688(void) { + sub_0801E104(); + gUnk_02036BB8 = TRUE; +} diff --git a/src/object/houseDoorExterior.c b/src/object/houseDoorExterior.c index 62d0cb95..f7eb966c 100644 --- a/src/object/houseDoorExterior.c +++ b/src/object/houseDoorExterior.c @@ -28,8 +28,6 @@ static bool32 sub_080867CC(u32); void sub_0808681C(Entity*); static u8 sub_08086954(Entity*); -extern u32 CheckRegionOnScreen(u32, u32, u32, u32); - extern void (*const gUnk_081206B4[])(Entity*); extern Hitbox gUnk_081206AC; // TODO: should be const diff --git a/src/object/lavaPlatform.c b/src/object/lavaPlatform.c index 9fc23de9..dbe5856e 100644 --- a/src/object/lavaPlatform.c +++ b/src/object/lavaPlatform.c @@ -14,7 +14,7 @@ typedef struct { /*0x00*/ Entity base; /*0x68*/ u8 unk_68[8]; /*0x70*/ u16 timer; - /*0x72*/ u16 wobbleTime; /**< Time the player can stand on the platform. */ + /*0x72*/ u16 wobbleTime; /**< Time the player can stand on the platform. */ /*0x74*/ u16 respawnTime; /**< Time until the platform respawns after it has sunk. */ /*0x76*/ u16 unk_76; /*0x78*/ Entity* unk_78; // Typed same as second argument of sub_080A2CC0 diff --git a/src/object/lockedDoor.c b/src/object/lockedDoor.c index 74cb0e55..918ba9cf 100644 --- a/src/object/lockedDoor.c +++ b/src/object/lockedDoor.c @@ -37,8 +37,6 @@ void LockedDoor(Entity* this) { extern Hitbox gHitbox_2; -extern void sub_08078850(Entity*, u32, u32, u32); - typedef struct PACKED { s8 x; s8 y; diff --git a/src/object/object3E.c b/src/object/object3E.c index 8e083d1e..672c428e 100644 --- a/src/object/object3E.c +++ b/src/object/object3E.c @@ -29,7 +29,7 @@ void Object3E_Type8_Action2(Object3EEntity*); void Object3E(Object3EEntity* this) { static void (*const Object3E_Types[])(Object3EEntity*) = { - Object3E_Type0, Object3E_Type1, Object3E_Type1, Object3E_Type3, Object3E_Type4, + Object3E_Type0, Object3E_Type1, Object3E_Type1, Object3E_Type3, Object3E_Type4, Object3E_Type5, Object3E_Type6, Object3E_Type7, Object3E_Type8, Object3E_Type1, }; Object3E_Types[super->type](this); diff --git a/src/object/object6A.c b/src/object/object6A.c index 0d2fb68e..ad910be4 100644 --- a/src/object/object6A.c +++ b/src/object/object6A.c @@ -103,11 +103,6 @@ Object6ATypeAction sub_080961F4; Object6ATypeAction sub_08096284; Object6ATypeAction sub_08096290; -extern void sub_08080CB4(Entity*); -extern u32 sub_080002B8(Entity*); -extern u32 CheckOnScreen(Entity*); -extern void sub_08078850(Entity*, u32, u32, u8*); - void sub_08095754(Object6AEntity*); void sub_080957B4(Object6AEntity*); void sub_08095954(Object6AEntity*); diff --git a/src/object/windcrest.c b/src/object/windcrest.c index 15828253..97d88300 100644 --- a/src/object/windcrest.c +++ b/src/object/windcrest.c @@ -4,8 +4,7 @@ #include "save.h" #include "script.h" #include "effects.h" - -extern void sub_08078850(Entity*, u32, u32, u8*); +#include "functions.h" extern u8 gUnk_08125010; From 8d86343827cb79b5ceca4f775cf9aec9732dad30 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Sun, 13 Feb 2022 22:40:25 +0100 Subject: [PATCH 07/10] Decompile Fairy --- asm/object/fairy.s | 642 -------------------------------------- assets/assets.json | 5 - data/const/object/fairy.s | 20 -- include/object.h | 2 +- linker.ld | 4 +- src/object/fairy.c | 259 +++++++++++++++ src/object/itemOnGround.c | 1 - 7 files changed, 262 insertions(+), 671 deletions(-) delete mode 100644 asm/object/fairy.s delete mode 100644 data/const/object/fairy.s create mode 100644 src/object/fairy.c diff --git a/asm/object/fairy.s b/asm/object/fairy.s deleted file mode 100644 index 9ef7cce9..00000000 --- a/asm/object/fairy.s +++ /dev/null @@ -1,642 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Fairy -Fairy: @ 0x0808D674 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x41 - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0808D750 - movs r0, #0x7f - ands r0, r1 - cmp r0, #0x1f - bhi _0808D750 - lsls r0, r0, #2 - ldr r1, _0808D698 @ =_0808D69C - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0808D698: .4byte _0808D69C -_0808D69C: @ jump table - .4byte _0808D740 @ case 0 - .4byte _0808D740 @ case 1 - .4byte _0808D750 @ case 2 - .4byte _0808D750 @ case 3 - .4byte _0808D740 @ case 4 - .4byte _0808D740 @ case 5 - .4byte _0808D740 @ case 6 - .4byte _0808D750 @ case 7 - .4byte _0808D740 @ case 8 - .4byte _0808D740 @ case 9 - .4byte _0808D740 @ case 10 - .4byte _0808D740 @ case 11 - .4byte _0808D740 @ case 12 - .4byte _0808D750 @ case 13 - .4byte _0808D750 @ case 14 - .4byte _0808D750 @ case 15 - .4byte _0808D750 @ case 16 - .4byte _0808D750 @ case 17 - .4byte _0808D750 @ case 18 - .4byte _0808D748 @ case 19 - .4byte _0808D71C @ case 20 - .4byte _0808D750 @ case 21 - .4byte _0808D750 @ case 22 - .4byte _0808D750 @ case 23 - .4byte _0808D750 @ case 24 - .4byte _0808D750 @ case 25 - .4byte _0808D750 @ case 26 - .4byte _0808D750 @ case 27 - .4byte _0808D750 @ case 28 - .4byte _0808D750 @ case 29 - .4byte _0808D740 @ case 30 - .4byte _0808D73C @ case 31 -_0808D71C: - movs r0, #3 - 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 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - ldr r0, [r4, #0x4c] - str r0, [r4, #0x54] - b _0808D750 -_0808D73C: - bl DeleteThisEntity -_0808D740: - adds r0, r4, #0 - bl sub_0808DAD0 - b _0808D750 -_0808D748: - adds r0, r4, #0 - bl sub_0808D76C - b _0808D766 -_0808D750: - ldr r0, _0808D768 @ =gUnk_08121784 - ldrb r1, [r4, #0xc] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r4, #0 - bl _call_via_r1 - adds r0, r4, #0 - bl sub_08080CB4 -_0808D766: - pop {r4, pc} - .align 2, 0 -_0808D768: .4byte gUnk_08121784 - - thumb_func_start sub_0808D76C -sub_0808D76C: @ 0x0808D76C - push {lr} - ldr r2, _0808D780 @ =gUnk_08121798 - ldrb r1, [r0, #0xd] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0808D780: .4byte gUnk_08121798 - - thumb_func_start sub_0808D784 -sub_0808D784: @ 0x0808D784 - movs r3, #1 - movs r1, #1 - strb r1, [r0, #0xd] - strb r1, [r0, #0x1d] - ldrb r2, [r0, #0x18] - subs r1, #5 - ands r1, r2 - orrs r1, r3 - strb r1, [r0, #0x18] - bx lr - - thumb_func_start sub_0808D798 -sub_0808D798: @ 0x0808D798 - push {lr} - bl sub_0806F4E8 - pop {pc} - - thumb_func_start sub_0808D7A0 -sub_0808D7A0: @ 0x0808D7A0 - push {r4, lr} - adds r4, r0, #0 - bl sub_0806F3E4 - cmp r0, #0 - beq _0808D7B2 - adds r0, r4, #0 - bl sub_0808DB2C -_0808D7B2: - pop {r4, pc} - - thumb_func_start sub_0808D7B4 -sub_0808D7B4: @ 0x0808D7B4 - push {r4, lr} - adds r4, r0, #0 - adds r1, r4, #0 - adds r1, #0x38 - movs r0, #3 - strb r0, [r1] - adds r0, r4, #0 - adds r0, #0x3c - movs r2, #0x17 - strb r2, [r0] - adds r1, #8 - movs r0, #0x49 - strb r0, [r1] - subs r1, #1 - movs r0, #7 - strb r0, [r1] - adds r0, r4, #0 - adds r0, #0x3b - strb r2, [r0] - adds r1, #6 - movs r0, #0xff - strb r0, [r1] - ldr r0, _0808D818 @ =gUnk_080FD1A8 - str r0, [r4, #0x48] - movs r0, #1 - strb r0, [r4, #0x1c] - 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] - adds r0, r4, #0 - movs r1, #6 - bl SetDefaultPriority - movs r0, #0x9b - lsls r0, r0, #1 - bl EnqueueSFX - ldrb r0, [r4, #0xb] - cmp r0, #2 - beq _0808D834 - cmp r0, #2 - bgt _0808D81C - cmp r0, #0 - beq _0808D822 - b _0808D82E - .align 2, 0 -_0808D818: .4byte gUnk_080FD1A8 -_0808D81C: - cmp r0, #3 - beq _0808D83C - b _0808D82E -_0808D822: - movs r0, #0xf0 - lsls r0, r0, #9 - str r0, [r4, #0x20] - ldrh r0, [r4, #0x36] - adds r0, #8 - strh r0, [r4, #0x36] -_0808D82E: - movs r0, #1 - strb r0, [r4, #0xc] - b _0808D842 -_0808D834: - adds r0, r4, #0 - bl sub_0808DAD0 - b _0808D842 -_0808D83C: - adds r0, r4, #0 - bl sub_0808DB2C -_0808D842: - pop {r4, pc} - - thumb_func_start sub_0808D844 -sub_0808D844: @ 0x0808D844 - push {lr} - adds r3, r0, #0 - ldr r0, [r3, #0x34] - ldr r1, _0808D870 @ =0xFFFF2000 - adds r0, r0, r1 - str r0, [r3, #0x34] - adds r0, r3, #0 - adds r0, #0x5a - ldrb r0, [r0] - cmp r0, #0 - beq _0808D88A - ldrb r0, [r3, #0xe] - cmp r0, #0 - beq _0808D874 - adds r2, r3, #0 - adds r2, #0x78 - ldrh r1, [r2] - lsls r0, r1, #4 - subs r0, r0, r1 - lsls r0, r0, #1 - strh r0, [r2] - b _0808D87E - .align 2, 0 -_0808D870: .4byte 0xFFFF2000 -_0808D874: - adds r1, r3, #0 - adds r1, #0x78 - movs r0, #0x96 - lsls r0, r0, #2 - strh r0, [r1] -_0808D87E: - movs r0, #2 - strb r0, [r3, #0xc] - movs r0, #1 - strb r0, [r3, #0xf] - movs r0, #0x80 - strh r0, [r3, #0x24] -_0808D88A: - pop {pc} - - thumb_func_start sub_0808D88C -sub_0808D88C: @ 0x0808D88C - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xf] - subs r0, #1 - strb r0, [r4, #0xf] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0808D910 - bl Random - adds r5, r0, #0 - ldrb r0, [r4, #0x10] - movs r1, #0x80 - orrs r0, r1 - strb r0, [r4, #0x10] - movs r0, #0x20 - strb r0, [r4, #0xf] - ldr r2, _0808D8D0 @ =gUnk_081217A4 - lsrs r0, r5, #8 - movs r1, #1 - ands r0, r1 - adds r0, r0, r2 - ldrb r0, [r0] - strh r0, [r4, #0x24] - adds r0, r4, #0 - bl sub_0808DAA0 - cmp r0, #0 - beq _0808D8D4 - movs r0, #0x1f - ands r5, r0 - strb r5, [r4, #0x15] - b _0808D8EE - .align 2, 0 -_0808D8D0: .4byte gUnk_081217A4 -_0808D8D4: - movs r1, #0x2e - ldrsh r0, [r4, r1] - movs r2, #0x32 - ldrsh r1, [r4, r2] - adds r2, r4, #0 - adds r2, #0x74 - ldrh r2, [r2] - adds r3, r4, #0 - adds r3, #0x76 - ldrh r3, [r3] - bl CalculateDirectionTo - strb r0, [r4, #0x15] -_0808D8EE: - ldrb r1, [r4, #0x15] - movs r0, #0xf - ands r0, r1 - cmp r0, #0 - beq _0808D910 - movs r0, #0x10 - eors r1, r0 - lsrs r1, r1, #4 - movs r0, #1 - ands r1, r0 - lsls r1, r1, #6 - ldrb r2, [r4, #0x18] - movs r0, #0x41 - rsbs r0, r0, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x18] -_0808D910: - adds r0, r4, #0 - bl ProcessMovement1 - bl AnyPrioritySet - cmp r0, #0 - bne _0808D954 - ldrb r0, [r4, #0xb] - cmp r0, #0 - bne _0808D954 - adds r5, r4, #0 - adds r5, #0x78 - ldrh r0, [r5] - subs r0, #1 - strh r0, [r5] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _0808D93C - adds r0, r4, #0 - movs r1, #0 - bl sub_08081404 -_0808D93C: - ldrh r0, [r5] - cmp r0, #0x77 - bhi _0808D954 - ldrb r2, [r4, #0x18] - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - movs r0, #1 - eors r1, r0 - subs r0, #5 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x18] -_0808D954: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_0808D958 -sub_0808D958: @ 0x0808D958 - push {r4, lr} - adds r4, r0, #0 - ldr r2, [r4, #0x54] - ldrh r1, [r2, #8] - movs r0, #0xc2 - lsls r0, r0, #2 - cmp r1, r0 - beq _0808D972 - adds r0, r4, #0 - movs r1, #0 - bl sub_08081404 - b _0808D992 -_0808D972: - adds r0, r2, #0 - adds r1, r4, #0 - bl CopyPosition - ldrh r0, [r4, #0x36] - subs r0, #1 - strh r0, [r4, #0x36] - ldr r1, _0808D994 @ =gPlayerEntity - adds r0, r4, #0 - bl IsColliding - cmp r0, #0 - beq _0808D992 - adds r0, r4, #0 - bl sub_0808DB2C -_0808D992: - pop {r4, pc} - .align 2, 0 -_0808D994: .4byte gPlayerEntity - - thumb_func_start sub_0808D998 -sub_0808D998: @ 0x0808D998 - push {r4, r5, r6, lr} - adds r5, r0, #0 - ldr r6, [r5, #0x54] - ldr r2, _0808DA28 @ =gSineTable - ldrb r0, [r5, #0xe] - lsls r0, r0, #1 - adds r0, r0, r2 - movs r3, #0 - ldrsh r1, [r0, r3] - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #9 - cmp r0, #0 - bge _0808D9B8 - ldr r1, _0808DA2C @ =0x0000FFFF - adds r0, r0, r1 -_0808D9B8: - asrs r0, r0, #0x10 - ldrh r3, [r6, #0x2e] - adds r0, r0, r3 - strh r0, [r5, #0x2e] - ldrb r0, [r5, #0xe] - adds r0, #0x40 - lsls r0, r0, #1 - adds r0, r0, r2 - movs r2, #0 - ldrsh r1, [r0, r2] - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #8 - cmp r0, #0 - bge _0808D9DA - ldr r3, _0808DA2C @ =0x0000FFFF - adds r0, r0, r3 -_0808D9DA: - asrs r1, r0, #0x10 - ldrh r0, [r6, #0x32] - subs r0, r0, r1 - strh r0, [r5, #0x32] - ldrb r3, [r5, #0xe] - adds r0, r3, #0 - adds r0, #8 - strb r0, [r5, #0xe] - ldrh r0, [r6, #0x36] - strh r0, [r5, #0x36] - ldrb r2, [r6, #0x1b] - lsrs r2, r2, #6 - lsls r2, r2, #6 - ldrb r4, [r5, #0x1b] - movs r1, #0x3f - adds r0, r1, #0 - ands r0, r4 - orrs r0, r2 - strb r0, [r5, #0x1b] - ldrb r0, [r6, #0x19] - lsrs r0, r0, #6 - lsls r0, r0, #6 - ldrb r2, [r5, #0x19] - ands r1, r2 - orrs r1, r0 - strb r1, [r5, #0x19] - subs r3, #0x39 - lsls r3, r3, #0x18 - lsrs r3, r3, #0x18 - cmp r3, #0x7e - bhi _0808DA30 - adds r2, r5, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #8 - rsbs r1, r1, #0 - ands r1, r0 - movs r0, #3 - b _0808DA3E - .align 2, 0 -_0808DA28: .4byte gSineTable -_0808DA2C: .4byte 0x0000FFFF -_0808DA30: - adds r2, r5, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #8 - rsbs r1, r1, #0 - ands r1, r0 - movs r0, #5 -_0808DA3E: - orrs r1, r0 - strb r1, [r2] - ldrb r0, [r5, #0xf] - subs r0, #1 - strb r0, [r5, #0xf] - lsls r0, r0, #0x18 - adds r4, r5, #0 - adds r4, #0x63 - cmp r0, #0 - bne _0808DA70 - movs r0, #6 - strb r0, [r5, #0xf] - ldrb r0, [r4] - subs r0, #1 - strb r0, [r4] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - movs r1, #0x16 - rsbs r1, r1, #0 - cmp r0, r1 - bge _0808DA70 - adds r0, r5, #0 - movs r1, #1 - bl sub_08081404 -_0808DA70: - movs r1, #0 - ldrsb r1, [r4, r1] - movs r0, #0x11 - rsbs r0, r0, #0 - cmp r1, r0 - bge _0808DA8E - ldrb r2, [r5, #0x18] - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - movs r0, #1 - eors r1, r0 - subs r0, #5 - ands r0, r2 - orrs r0, r1 - strb r0, [r5, #0x18] -_0808DA8E: - adds r1, r5, #0 - adds r1, #0x87 - ldrb r0, [r1] - cmp r0, #0xa - bls _0808DA9C - movs r0, #0xa - strb r0, [r1] -_0808DA9C: - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_0808DAA0 -sub_0808DAA0: @ 0x0808DAA0 - push {lr} - adds r2, r0, #0 - movs r1, #0x2e - ldrsh r0, [r2, r1] - adds r1, r2, #0 - adds r1, #0x74 - ldrh r1, [r1] - subs r0, r0, r1 - adds r0, #0x30 - cmp r0, #0x60 - bhi _0808DACC - movs r1, #0x32 - ldrsh r0, [r2, r1] - adds r1, r2, #0 - adds r1, #0x76 - ldrh r1, [r1] - subs r0, r0, r1 - adds r0, #0x30 - cmp r0, #0x60 - bhi _0808DACC - movs r0, #1 - b _0808DACE -_0808DACC: - movs r0, #0 -_0808DACE: - pop {pc} - - thumb_func_start sub_0808DAD0 -sub_0808DAD0: @ 0x0808DAD0 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x45 - ldrb r0, [r0] - cmp r0, #0 - bne _0808DAE0 - bl DeleteThisEntity -_0808DAE0: - movs r0, #4 - strb r0, [r4, #0xc] - movs r0, #0x80 - strb r0, [r4, #0xe] - movs r0, #6 - strb r0, [r4, #0xf] - 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 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #0x39 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #0x10 - orrs r0, r1 - strb r0, [r2] - adds r1, r4, #0 - adds r1, #0x63 - movs r0, #0xfb - strb r0, [r1] - ldr r0, _0808DB28 @ =gPlayerEntity - str r0, [r4, #0x54] - adds r1, r4, #0 - bl CopyPosition - pop {r4, pc} - .align 2, 0 -_0808DB28: .4byte gPlayerEntity - - thumb_func_start sub_0808DB2C -sub_0808DB2C: @ 0x0808DB2C - push {lr} - adds r1, r0, #0 - movs r2, #0 - movs r0, #2 - strb r0, [r1, #0xc] - strb r2, [r1, #0xd] - ldrb r2, [r1, #0x10] - movs r0, #0x80 - orrs r0, r2 - strb r0, [r1, #0x10] - adds r2, r1, #0 - adds r2, #0x3b - movs r0, #1 - strb r0, [r2] - ldr r0, _0808DB50 @ =gPlayerEntity - bl CopyPosition - pop {pc} - .align 2, 0 -_0808DB50: .4byte gPlayerEntity diff --git a/assets/assets.json b/assets/assets.json index 6c4394a3..73a4cd28 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -43590,11 +43590,6 @@ "start": 1185642, "size": 26 }, - { - "path": "fairy/gUnk_081217A4.bin", - "start": 1185700, - "size": 4 - }, { "path": "object42/gUnk_081217B8.bin", "start": 1185720, diff --git a/data/const/object/fairy.s b/data/const/object/fairy.s deleted file mode 100644 index 5b04aab9..00000000 --- a/data/const/object/fairy.s +++ /dev/null @@ -1,20 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08121784:: @ 08121784 - .4byte sub_0808D7B4 - .4byte sub_0808D844 - .4byte sub_0808D88C - .4byte sub_0808D958 - .4byte sub_0808D998 - -gUnk_08121798:: @ 08121798 - .4byte sub_0808D784 - .4byte sub_0808D798 - .4byte sub_0808D7A0 - -gUnk_081217A4:: @ 081217A4 - .incbin "fairy/gUnk_081217A4.bin" diff --git a/include/object.h b/include/object.h index 93856cbf..655a1bf6 100644 --- a/include/object.h +++ b/include/object.h @@ -290,7 +290,7 @@ void MacroPlayer(Entity*); void Object3D(Entity*); void Object3E(); void GiantLeaf(Entity*); -void Fairy(Entity*); +void Fairy(); void LadderUp(Entity*); void Object42(Entity*); void Object43(Entity*); diff --git a/linker.ld b/linker.ld index 6b20c529..d881f027 100644 --- a/linker.ld +++ b/linker.ld @@ -710,7 +710,7 @@ SECTIONS { asm/object/object3D.o(.text); src/object/object3E.o(.text); src/object/giantLeaf.o(.text); - asm/object/fairy.o(.text); + src/object/fairy.o(.text); asm/object/ladderUp.o(.text); asm/object/object42.o(.text); asm/object/object43.o(.text); @@ -1446,7 +1446,7 @@ SECTIONS { data/const/object/object3D.o(.rodata); src/object/object3E.o(.rodata); data/const/object/giantLeaf.o(.rodata); - data/const/object/fairy.o(.rodata); + src/object/fairy.o(.rodata); data/const/object/object42.o(.rodata); data/const/object/object43.o(.rodata); data/animations/object/object43.o(.rodata); diff --git a/src/object/fairy.c b/src/object/fairy.c new file mode 100644 index 00000000..0b363cc6 --- /dev/null +++ b/src/object/fairy.c @@ -0,0 +1,259 @@ +/** + * @file fairy.c + * @ingroup Objects + * + * @brief Fairy object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" +#include "item.h" + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68[0xc]; + /*0x74*/ u16 unk_74; + /*0x76*/ u16 unk_76; + /*0x78*/ u16 unk_78; + /*0x7a*/ u8 unk_7a[0xd]; + /*0x87*/ u8 unk_87; +} FairyEntity; + +extern Hitbox gUnk_080FD1A8; + +void sub_0808D76C(FairyEntity*); +void sub_0808DAD0(FairyEntity*); +void sub_0808DB2C(FairyEntity*); +bool32 sub_0808DAA0(FairyEntity*); +void Fairy_Init(FairyEntity*); +void Fairy_Action1(FairyEntity*); +void Fairy_Action2(FairyEntity*); +void Fairy_Action3(FairyEntity*); +void Fairy_Action4(FairyEntity*); +void Fairy_SubAction0(FairyEntity*); +void Fairy_SubAction1(FairyEntity*); +void Fairy_SubAction2(FairyEntity*); + +void Fairy(FairyEntity* this) { + static void (*const Fairy_Actions[])(FairyEntity*) = { + Fairy_Init, Fairy_Action1, Fairy_Action2, Fairy_Action3, Fairy_Action4, + }; + + if (((super->bitfield & 0x80) != 0)) { + switch (super->bitfield & 0x7f) { + case 0x14: + super->action = 3; + super->flags &= ~ENT_COLLIDE; + super->spriteSettings.draw = 1; + super->child = super->field_0x4c; + break; + case 0x1f: + DeleteThisEntity(); + case 0: + case 1: + case 4: + case 5: + case 6: + case 8: + case 9: + case 10: + case 0xb: + case 0xc: + case 0x1e: + sub_0808DAD0(this); + break; + case 0x13: + sub_0808D76C(this); + return; + } + } + Fairy_Actions[super->action](this); + sub_08080CB4(super); +} + +void sub_0808D76C(FairyEntity* this) { + static void (*const Fairy_SubActions[])(FairyEntity*) = { + Fairy_SubAction0, + Fairy_SubAction1, + Fairy_SubAction2, + }; + + Fairy_SubActions[super->subAction](this); +} + +void Fairy_SubAction0(FairyEntity* this) { + super->subAction = 1; + super->field_0x1d = 1; + super->spriteSettings.draw = 1; +} + +void Fairy_SubAction1(FairyEntity* this) { + sub_0806F4E8(super); +} + +void Fairy_SubAction2(FairyEntity* this) { + if (sub_0806F3E4(super)) { + sub_0808DB2C(this); + } +} + +void Fairy_Init(FairyEntity* this) { + super->collisionLayer = 3; + super->field_0x3c = 0x17; + super->hurtType = 0x49; + super->hitType = 7; + super->flags2 = 0x17; + super->health = 0xff; + super->hitbox = (Hitbox*)&gUnk_080FD1A8; + super->field_0x1c = 1; + this->unk_74 = super->x.HALF.HI; + this->unk_76 = super->y.HALF.HI; + SetDefaultPriority(super, 6); + EnqueueSFX(SFX_136); + + switch (super->type2) { + case 0: + super->zVelocity = 0x1e000; + super->z.HALF.HI += 8; + // fallthrough + default: + super->action = 1; + break; + case 2: + sub_0808DAD0(this); + break; + case 3: + sub_0808DB2C(this); + break; + } +} + +void Fairy_Action1(FairyEntity* this) { + super->z.WORD -= 0xe000; + if (super->frame != 0) { + if (super->actionDelay != 0) { + this->unk_78 *= 0x1e; + } else { + this->unk_78 = 600; + } + super->action = 2; + super->field_0xf = 1; + super->speed = 0x80; + } +} + +void Fairy_Action2(FairyEntity* this) { + static const u8 gUnk_081217A4[] = { + 128, + 96, + 0, + 0, + }; + if (--super->field_0xf == 0) { + u32 rand = Random(); + super->flags |= ENT_COLLIDE; + super->field_0xf = 0x20; + super->speed = (u16)gUnk_081217A4[rand >> 8 & 1]; + if (sub_0808DAA0(this)) { + super->direction = rand & 0x1f; + } else { + super->direction = CalculateDirectionTo(super->x.HALF.HI, super->y.HALF.HI, this->unk_74, this->unk_76); + } + if ((super->direction & 0xf) != 0) { + super->spriteSettings.flipX = ((super->direction ^ 0x10) >> 4); + } + } + ProcessMovement1(super); + if ((AnyPrioritySet() == 0) && (super->type2 == 0)) { + if (--this->unk_78 == 0) { + sub_08081404(super, 0); + } + if (this->unk_78 < 0x78) { + super->spriteSettings.draw ^= 1; + } + } +} + +void Fairy_Action3(FairyEntity* this) { + if (*(u16*)&super->child->kind != 0x308) { + sub_08081404(super, 0); + } else { + CopyPosition(super->child, super); + super->z.HALF.HI--; + if (IsColliding(super, &gPlayerEntity)) { + sub_0808DB2C(this); + } + } +} + +void Fairy_Action4(FairyEntity* this) { + Entity* child; + s32 tmp; + + child = super->child; + tmp = gSineTable[super->actionDelay] * 0xa00; + if (tmp < 0) { + tmp += 0xffff; + } + super->x.HALF.HI = (tmp >> 0x10) + child->x.HALF.HI; + tmp = gSineTable[super->actionDelay + 0x40] * 0x500; + if (tmp < 0) { + tmp += 0xffff; + } + super->y.HALF.HI = child->y.HALF.HI - (tmp >> 0x10); + super->actionDelay += 8; + super->z.HALF.HI = child->z.HALF.HI; + super->spriteOrientation.flipY = child->spriteOrientation.flipY; + super->spriteRendering.b3 = child->spriteRendering.b3; + if ((u8)(super->actionDelay - 0x41) < 0x7f) { + super->spritePriority.b0 = 3; + } else { + super->spritePriority.b0 = 5; + } + if (--super->field_0xf == 0) { + super->field_0xf = 6; + if (((--super->spriteOffsetY) * 0x1000000) >> 0x18 < -0x16) { + sub_08081404(super, 1); + } + } + if (super->spriteOffsetY < -0x11) { + super->spriteSettings.draw ^= 1; + } + if (this->unk_87 > 10) { + this->unk_87 = 10; + } +} + +bool32 sub_0808DAA0(FairyEntity* this) { + if (((super->x.HALF.HI - (u32)this->unk_74) + 0x30 < 0x61) && + ((super->y.HALF.HI - (u32)this->unk_76) + 0x30 < 0x61)) { + return TRUE; + } else { + return FALSE; + } +} + +void sub_0808DAD0(FairyEntity* this) { + if (super->health == 0) { + DeleteThisEntity(); + } + super->action = 4; + super->actionDelay = 0x80; + super->field_0xf = 6; + super->flags &= ~ENT_COLLIDE; + super->spriteSettings.draw = 1; + super->spritePriority.b1 = 2; + super->spriteOffsetY = -5; + super->child = &gPlayerEntity; + CopyPosition(&gPlayerEntity, super); +} + +void sub_0808DB2C(FairyEntity* this) { + super->action = 2; + super->subAction = 0; + super->flags |= ENT_COLLIDE; + super->flags2 = 1; + CopyPosition(&gPlayerEntity, super); +} diff --git a/src/object/itemOnGround.c b/src/object/itemOnGround.c index 49503916..7921fc39 100644 --- a/src/object/itemOnGround.c +++ b/src/object/itemOnGround.c @@ -19,7 +19,6 @@ void sub_080813BC(Entity*); void sub_080810FC(Entity*); bool32 CheckShouldPlayItemGetCutscene(Entity*); -extern u32 IsColliding(Entity*, Entity*); extern void GiveItem(u32, u32); extern void (*const gUnk_0811E7D4[])(Entity*); From 4a1d2fb406d32a76765f0eff396bebb70ff397cd Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Thu, 17 Feb 2022 16:03:04 +0100 Subject: [PATCH 08/10] Decompile ObjectOnSpinyBeetle --- asm/object/objectOnSpinyBeetle.s | 651 ------------------------ assets/assets.json | 5 - data/const/object/objectOnSpinyBeetle.s | 33 -- include/object.h | 2 +- linker.ld | 4 +- src/object/objectOnSpinyBeetle.c | 305 +++++++++++ 6 files changed, 308 insertions(+), 692 deletions(-) delete mode 100644 asm/object/objectOnSpinyBeetle.s delete mode 100644 data/const/object/objectOnSpinyBeetle.s create mode 100644 src/object/objectOnSpinyBeetle.c diff --git a/asm/object/objectOnSpinyBeetle.s b/asm/object/objectOnSpinyBeetle.s deleted file mode 100644 index f93fa2a3..00000000 --- a/asm/object/objectOnSpinyBeetle.s +++ /dev/null @@ -1,651 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start ObjectOnSpinyBeetle -ObjectOnSpinyBeetle: @ 0x08098544 - push {lr} - ldr r2, _08098558 @ =gUnk_0812350C - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08098558: .4byte gUnk_0812350C - - thumb_func_start sub_0809855C -sub_0809855C: @ 0x0809855C - push {r4, r5, lr} - adds r4, r0, #0 - movs r3, #0 - movs r5, #1 - strb r5, [r4, #0xc] - ldrb r0, [r4, #0x10] - movs r2, #0x80 - orrs r0, r2 - strb r0, [r4, #0x10] - movs r0, #0x29 - adds r0, r0, r4 - mov ip, r0 - ldrb r1, [r0] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #6 - orrs r0, r1 - mov r1, ip - strb r0, [r1] - ldrb r1, [r4, #0x19] - movs r0, #0x3f - ands r0, r1 - orrs r0, r2 - strb r0, [r4, #0x19] - strb r3, [r4, #0xf] - adds r1, r4, #0 - adds r1, #0x3f - movs r0, #0x6e - strb r0, [r1] - subs r1, #4 - movs r0, #0x86 - strb r0, [r1] - strb r3, [r4, #0x16] - ldrb r0, [r4, #0xa] - cmp r0, #0 - beq _080985AC - movs r0, #2 - strb r0, [r4, #0x1c] - b _080985AE -_080985AC: - strb r5, [r4, #0x1c] -_080985AE: - ldr r1, [r4, #0x50] - adds r0, r4, #0 - bl SortEntityBelow - adds r0, r4, #0 - bl sub_08098918 - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_080985C0 -sub_080985C0: @ 0x080985C0 - push {r4, lr} - adds r4, r0, #0 - bl sub_080989E4 - cmp r0, #0 - bne _080985CE - b _080986FC -_080985CE: - ldrb r0, [r0, #0xc] - cmp r0, #4 - bls _080985D6 - b _080986E6 -_080985D6: - adds r0, r4, #0 - adds r0, #0x41 - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - bne _080985E6 - b _080986EE -_080985E6: - movs r0, #0x3f - ands r0, r1 - subs r0, #4 - cmp r0, #0x1c - bls _080985F2 - b _08098702 -_080985F2: - lsls r0, r0, #2 - ldr r1, _080985FC @ =_08098600 - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_080985FC: .4byte _08098600 -_08098600: @ jump table - .4byte _080986C4 @ case 0 - .4byte _080986C4 @ case 1 - .4byte _080986C4 @ case 2 - .4byte _08098702 @ case 3 - .4byte _080986C4 @ case 4 - .4byte _080986C4 @ case 5 - .4byte _080986C4 @ case 6 - .4byte _080986C4 @ case 7 - .4byte _080986C4 @ case 8 - .4byte _080986C4 @ case 9 - .4byte _08098702 @ case 10 - .4byte _0809867E @ case 11 - .4byte _080986C4 @ case 12 - .4byte _080986C4 @ case 13 - .4byte _080986C4 @ case 14 - .4byte _08098674 @ case 15 - .4byte _080986E0 @ case 16 - .4byte _08098702 @ case 17 - .4byte _080986E0 @ case 18 - .4byte _08098702 @ case 19 - .4byte _080986C4 @ case 20 - .4byte _080986C4 @ case 21 - .4byte _080986C4 @ case 22 - .4byte _08098702 @ case 23 - .4byte _08098702 @ case 24 - .4byte _0809867E @ case 25 - .4byte _08098702 @ case 26 - .4byte _08098702 @ case 27 - .4byte _080986E0 @ case 28 -_08098674: - movs r1, #0 - movs r0, #3 - strb r0, [r4, #0xc] - strb r1, [r4, #0xd] - b _08098702 -_0809867E: - movs r2, #0 - movs r0, #4 - strb r0, [r4, #0xc] - movs r0, #0xa8 - lsls r0, r0, #0xa - str r0, [r4, #0x20] - adds r0, r4, #0 - adds r0, #0x63 - strb r2, [r0] - ldrb r1, [r4, #0x18] - movs r0, #0x31 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #0x10 - orrs r0, r1 - strb r0, [r4, #0x18] - adds r3, r4, #0 - adds r3, #0x29 - ldrb r1, [r3] - movs r0, #0x39 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #0x18 - orrs r0, r1 - strb r0, [r3] - ldrb r1, [r4, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r4, #0x10] - ldr r0, [r4, #0x50] - str r2, [r0, #0x54] - adds r0, r4, #0 - bl sub_080988E8 - b _08098702 -_080986C4: - ldrb r0, [r4, #0xa] - cmp r0, #0 - beq _080986E6 - ldr r0, _080986DC @ =gPlayerState - adds r0, #0xac - ldrh r1, [r0] - movs r0, #8 - ands r0, r1 - cmp r0, #0 - beq _08098702 - b _080986E6 - .align 2, 0 -_080986DC: .4byte gPlayerState -_080986E0: - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _08098702 -_080986E6: - adds r0, r4, #0 - bl sub_080989C0 - b _08098702 -_080986EE: - adds r0, r4, #0 - bl sub_08098918 - adds r0, r4, #0 - bl sub_08078930 - b _08098702 -_080986FC: - adds r0, r4, #0 - bl sub_080989C0 -_08098702: - pop {r4, pc} - - thumb_func_start sub_08098704 -sub_08098704: @ 0x08098704 - push {lr} - ldr r2, _08098718 @ =gUnk_08123524 - ldrb r1, [r0, #0xd] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08098718: .4byte gUnk_08123524 - - thumb_func_start sub_0809871C -sub_0809871C: @ 0x0809871C - adds r3, r0, #0 - ldrb r1, [r3, #0x10] - movs r0, #0x80 - movs r2, #0 - orrs r0, r1 - strb r0, [r3, #0x10] - adds r1, r3, #0 - adds r1, #0x3c - movs r0, #7 - strb r0, [r1] - adds r1, #3 - movs r0, #1 - strb r0, [r1] - ldr r0, _08098754 @ =gPlayerEntity - adds r0, #0x3b - ldrb r0, [r0] - subs r1, #4 - strb r0, [r1] - adds r0, r3, #0 - adds r0, #0x63 - strb r2, [r0] - ldr r0, [r3, #0x50] - str r2, [r0, #0x54] - ldrb r0, [r3, #0xd] - adds r0, #1 - strb r0, [r3, #0xd] - bx lr - .align 2, 0 -_08098754: .4byte gPlayerEntity - - thumb_func_start nullsub_533 -nullsub_533: @ 0x08098758 - bx lr - .align 2, 0 - - thumb_func_start sub_0809875C -sub_0809875C: @ 0x0809875C - adds r0, #0x29 - ldrb r2, [r0] - movs r1, #0x39 - rsbs r1, r1, #0 - ands r1, r2 - movs r2, #0x18 - orrs r1, r2 - strb r1, [r0] - bx lr - .align 2, 0 - - thumb_func_start sub_08098770 -sub_08098770: @ 0x08098770 - push {r4, lr} - adds r4, r0, #0 - bl sub_080043E8 - cmp r0, #2 - beq _0809878C - cmp r0, #2 - bhi _08098786 - cmp r0, #1 - beq _08098792 - b _080987A4 -_08098786: - cmp r0, #3 - beq _08098798 - b _080987A4 -_0809878C: - adds r0, r4, #0 - movs r1, #0xb - b _0809879C -_08098792: - adds r0, r4, #0 - movs r1, #0 - b _0809879C -_08098798: - adds r0, r4, #0 - movs r1, #0xc -_0809879C: - movs r2, #0 - bl CreateFx - b _080987AC -_080987A4: - adds r0, r4, #0 - bl sub_080989C0 - b _080987B0 -_080987AC: - bl DeleteThisEntity -_080987B0: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_080987B4 -sub_080987B4: @ 0x080987B4 - push {lr} - bl DeleteThisEntity - pop {pc} - - thumb_func_start sub_080987BC -sub_080987BC: @ 0x080987BC - push {lr} - adds r1, r0, #0 - ldr r0, _080987D0 @ =gPlayerState - ldrb r0, [r0, #5] - cmp r0, #0 - bne _080987CE - adds r0, r1, #0 - bl sub_080987D4 -_080987CE: - pop {pc} - .align 2, 0 -_080987D0: .4byte gPlayerState - - thumb_func_start sub_080987D4 -sub_080987D4: @ 0x080987D4 - movs r2, #0 - movs r1, #1 - strb r1, [r0, #0xc] - strb r2, [r0, #0xd] - bx lr - .align 2, 0 - - thumb_func_start sub_080987E0 -sub_080987E0: @ 0x080987E0 - push {r4, lr} - adds r4, r0, #0 - ldr r1, _0809880C @ =gUnk_08123540 - ldrb r0, [r4, #0xd] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - adds r0, r4, #0 - bl _call_via_r1 - ldrb r0, [r4, #0xd] - cmp r0, #1 - bhi _0809880A - adds r0, r4, #0 - bl sub_080989E4 - cmp r0, #0 - bne _0809880A - adds r0, r4, #0 - bl sub_080989C0 -_0809880A: - pop {r4, pc} - .align 2, 0 -_0809880C: .4byte gUnk_08123540 - - thumb_func_start sub_08098810 -sub_08098810: @ 0x08098810 - movs r2, #0 - movs r1, #1 - strb r1, [r0, #0xd] - movs r1, #0x30 - strb r1, [r0, #0x1d] - strb r2, [r0, #0xe] - bx lr - .align 2, 0 - - thumb_func_start sub_08098820 -sub_08098820: @ 0x08098820 - push {lr} - adds r2, r0, #0 - ldr r0, _0809884C @ =gPlayerState - ldrb r1, [r0, #0x1c] - movs r0, #0xf - ands r0, r1 - cmp r0, #1 - bne _0809883E - adds r0, r2, #0 - adds r0, #0x41 - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0x13 - beq _08098850 -_0809883E: - adds r1, r2, #0 - adds r1, #0x62 - movs r0, #0 - strb r0, [r1] - movs r0, #1 - strb r0, [r2, #0xc] - b _08098856 - .align 2, 0 -_0809884C: .4byte gPlayerState -_08098850: - adds r0, r2, #0 - bl sub_0806F4E8 -_08098856: - pop {pc} - - thumb_func_start sub_08098858 -sub_08098858: @ 0x08098858 - push {r4, lr} - adds r4, r0, #0 - ldrb r1, [r4, #0xe] - cmp r1, #0 - bne _08098878 - movs r0, #1 - strb r0, [r4, #0xe] - adds r0, r4, #0 - adds r0, #0x62 - strb r1, [r0] - adds r2, r4, #0 - adds r2, #0x63 - movs r0, #0xfe - strb r0, [r2] - ldr r0, [r4, #0x50] - str r1, [r0, #0x54] -_08098878: - ldr r0, _0809889C @ =gPlayerState - ldrb r1, [r0, #0x1c] - movs r0, #0xf - ands r0, r1 - cmp r0, #1 - bne _08098892 - adds r0, r4, #0 - adds r0, #0x41 - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0x13 - beq _080988A0 -_08098892: - adds r0, r4, #0 - bl sub_080989C0 - b _080988B4 - .align 2, 0 -_0809889C: .4byte gPlayerState -_080988A0: - adds r0, r4, #0 - bl sub_0806F3E4 - cmp r0, #0 - beq _080988B4 - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _080988B4 - bl DeleteThisEntity -_080988B4: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_080988B8 -sub_080988B8: @ 0x080988B8 - push {lr} - adds r2, r0, #0 - ldr r0, _080988CC @ =gPlayerState - ldrb r0, [r0, #0x1c] - cmp r0, #0 - bne _080988D0 - adds r0, r2, #0 - bl sub_080989C0 - b _080988D8 - .align 2, 0 -_080988CC: .4byte gPlayerState -_080988D0: - ldrb r1, [r2, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r2, #0x10] -_080988D8: - pop {pc} - .align 2, 0 - - thumb_func_start nullsub_123 -nullsub_123: @ 0x080988DC - bx lr - .align 2, 0 - - thumb_func_start sub_080988E0 -sub_080988E0: @ 0x080988E0 - push {lr} - bl sub_080989C0 - pop {pc} - - thumb_func_start sub_080988E8 -sub_080988E8: @ 0x080988E8 - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #0x20] - cmp r0, #0 - bge _080988FA - ldrb r0, [r4, #0x18] - movs r1, #0x80 - orrs r0, r1 - strb r0, [r4, #0x18] -_080988FA: - movs r1, #0x80 - lsls r1, r1, #6 - adds r0, r4, #0 - bl GravityUpdate - cmp r0, #0 - bne _0809890E - adds r0, r4, #0 - bl sub_080989C0 -_0809890E: - pop {r4, pc} - - thumb_func_start sub_08098910 -sub_08098910: @ 0x08098910 - push {lr} - bl sub_080989C0 - pop {pc} - - thumb_func_start sub_08098918 -sub_08098918: @ 0x08098918 - push {r4, r5, r6, lr} - adds r4, r0, #0 - bl sub_080989E4 - adds r6, r0, #0 - cmp r6, #0 - bne _0809892E - adds r0, r4, #0 - bl sub_080989C0 - b _080989BC -_0809892E: - adds r0, r6, #0 - adds r1, r4, #0 - bl CopyPosition - ldrb r1, [r6, #0x10] - movs r0, #0x80 - ands r0, r1 - lsls r0, r0, #0x18 - lsrs r5, r0, #0x18 - cmp r5, #0 - beq _08098990 - ldrb r0, [r4, #0xf] - cmp r0, #0 - bne _08098968 - adds r0, #1 - strb r0, [r4, #0xf] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #3 - orrs r0, r1 - strb r0, [r2] - ldr r1, [r4, #0x50] - adds r0, r4, #0 - bl SortEntityBelow -_08098968: - ldr r2, _0809898C @ =gUnk_08123558 - adds r0, r6, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0xf - ands r0, r1 - adds r0, r0, r2 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - subs r0, #8 - movs r1, #0 - strh r0, [r4, #0x36] - adds r0, r4, #0 - adds r0, #0x63 - strb r1, [r0] - b _080989BC - .align 2, 0 -_0809898C: .4byte gUnk_08123558 -_08098990: - ldrb r0, [r4, #0xf] - cmp r0, #0 - beq _080989B2 - strb r5, [r4, #0xf] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #6 - orrs r0, r1 - strb r0, [r2] - ldr r1, [r4, #0x50] - adds r0, r4, #0 - bl SortEntityBelow -_080989B2: - strh r5, [r4, #0x36] - adds r1, r4, #0 - adds r1, #0x63 - movs r0, #3 - strb r0, [r1] -_080989BC: - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_080989C0 -sub_080989C0: @ 0x080989C0 - push {r4, lr} - adds r4, r0, #0 - bl sub_080989E4 - cmp r0, #0 - beq _080989D2 - ldr r1, [r4, #0x50] - movs r0, #0 - str r0, [r1, #0x54] -_080989D2: - ldrb r1, [r4, #0xa] - adds r1, #3 - adds r0, r4, #0 - movs r2, #0 - bl CreateFx - bl DeleteThisEntity - pop {r4, pc} - - thumb_func_start sub_080989E4 -sub_080989E4: @ 0x080989E4 - push {lr} - ldr r1, [r0, #0x50] - cmp r1, #0 - beq _080989F4 - ldr r0, [r1, #4] - cmp r0, #0 - bne _080989F4 - movs r1, #0 -_080989F4: - adds r0, r1, #0 - pop {pc} diff --git a/assets/assets.json b/assets/assets.json index 73a4cd28..5425bdd7 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -44945,11 +44945,6 @@ "start": 1193212, "size": 8 }, - { - "path": "objectOnSpinyBeetle/gUnk_08123558.bin", - "start": 1193304, - "size": 16 - }, { "path": "animations/gSpriteAnimations_PicoBloom_0.bin", "start": 1193338, diff --git a/data/const/object/objectOnSpinyBeetle.s b/data/const/object/objectOnSpinyBeetle.s deleted file mode 100644 index f457ca8b..00000000 --- a/data/const/object/objectOnSpinyBeetle.s +++ /dev/null @@ -1,33 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_0812350C:: @ 0812350C - .4byte sub_0809855C - .4byte sub_080985C0 - .4byte sub_08098704 - .4byte sub_080987E0 - .4byte sub_080988E8 - .4byte sub_08098910 - -gUnk_08123524:: @ 08123524 - .4byte sub_0809871C - .4byte nullsub_533 - .4byte sub_0809875C - .4byte sub_08098770 - .4byte sub_080987B4 - .4byte sub_080987BC - .4byte sub_080987D4 - -gUnk_08123540:: @ 08123540 - .4byte sub_08098810 - .4byte sub_08098820 - .4byte sub_08098858 - .4byte sub_080988B8 - .4byte nullsub_123 - .4byte sub_080988E0 - -gUnk_08123558:: @ 08123558 - .incbin "objectOnSpinyBeetle/gUnk_08123558.bin" diff --git a/include/object.h b/include/object.h index 655a1bf6..4a4d11f4 100644 --- a/include/object.h +++ b/include/object.h @@ -351,7 +351,7 @@ void Object79(Entity*); void Steam(Entity*); void PushableLever(); void MacroShoes(Entity*); -void ObjectOnSpinyBeetle(Entity*); +void ObjectOnSpinyBeetle(); void Object7E(Entity*); void PicoBloom(Entity*); void Board(Entity*); diff --git a/linker.ld b/linker.ld index d881f027..3569ac23 100644 --- a/linker.ld +++ b/linker.ld @@ -770,7 +770,7 @@ SECTIONS { src/object/steam.o(.text); src/object/pushableLever.o(.text); asm/object/macroShoes.o(.text); - asm/object/objectOnSpinyBeetle.o(.text); + src/object/objectOnSpinyBeetle.o(.text); src/object/object7E.o(.text); asm/object/picoBloom.o(.text); asm/object/board.o(.text); @@ -1519,7 +1519,7 @@ SECTIONS { src/object/pushableLever.o(.rodata); data/animations/object/pushableLever.o(.rodata); data/const/object/macroShoes.o(.rodata); - data/const/object/objectOnSpinyBeetle.o(.rodata); + src/object/objectOnSpinyBeetle.o(.rodata); data/const/object/picoBloom.o(.rodata); data/animations/object/picoBloom.o(.rodata); data/const/object/board.o(.rodata); diff --git a/src/object/objectOnSpinyBeetle.c b/src/object/objectOnSpinyBeetle.c new file mode 100644 index 00000000..56336a0d --- /dev/null +++ b/src/object/objectOnSpinyBeetle.c @@ -0,0 +1,305 @@ +/** + * @file objectOnSpinyBeetle.c + * @ingroup Objects + * + * @brief Object on Spiny Beetle object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" + +typedef struct { + /*0x00*/ Entity base; +} ObjectOnSpinyBeetleEntity; + +extern void (*const ObjectOnSpinyBeetle_Actions[])(ObjectOnSpinyBeetleEntity*); +extern void (*const ObjectOnSpinyBeetle_Action2Subactions[])(ObjectOnSpinyBeetleEntity*); +extern void (*const ObjectOnSpinyBeetle_Action3Subactions[])(ObjectOnSpinyBeetleEntity*); +extern const s8 gUnk_08123558[]; + +void sub_08098918(ObjectOnSpinyBeetleEntity*); +Entity* ObjectOnSpinyBeetle_GetParent(ObjectOnSpinyBeetleEntity*); +void sub_080989C0(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Init(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action1(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action4(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action5(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction0(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction1(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction2(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction3(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction4(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction5(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction6(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction0(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction1(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction2(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction3(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction4(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction5(ObjectOnSpinyBeetleEntity*); + +void ObjectOnSpinyBeetle(ObjectOnSpinyBeetleEntity* this) { + static void (*const ObjectOnSpinyBeetle_Actions[])(ObjectOnSpinyBeetleEntity*) = { + ObjectOnSpinyBeetle_Init, ObjectOnSpinyBeetle_Action1, ObjectOnSpinyBeetle_Action2, + ObjectOnSpinyBeetle_Action3, ObjectOnSpinyBeetle_Action4, ObjectOnSpinyBeetle_Action5, + }; + ObjectOnSpinyBeetle_Actions[super->action](this); +} + +void ObjectOnSpinyBeetle_Init(ObjectOnSpinyBeetleEntity* this) { + super->action = 1; + super->flags |= ENT_COLLIDE; + super->spritePriority.b0 = 6; + super->spriteRendering.b3 = 2; + super->field_0xf = 0; + super->hitType = 0x6e; + super->flags2 = 0x86; + super->field_0x16 = 0; + if (super->type != 0) { + super->field_0x1c = 2; + } else { + super->field_0x1c = 1; + } + SortEntityBelow(super, super->parent); + sub_08098918(this); +} + +void ObjectOnSpinyBeetle_Action1(ObjectOnSpinyBeetleEntity* this) { + Entity* parent = ObjectOnSpinyBeetle_GetParent(this); + if (parent != NULL) { + if (4 < parent->action) { + sub_080989C0(this); + return; + } + if ((super->bitfield & 0x80) != 0) { + switch (super->bitfield & 0x3f) { + case 0x13: + super->action = 3; + super->subAction = 0; + break; + case 0xf: + case 0x1d: + super->action = 4; + super->zVelocity = 0x2a000; + super->spriteOffsetY = 0; + super->spriteSettings.shadow = 1; + super->spritePriority.b1 = 3; + super->flags &= ~ENT_COLLIDE; + (super->parent)->child = NULL; + ObjectOnSpinyBeetle_Action4(this); + break; + case 4: + case 5: + case 6: + case 8: + case 9: + case 10: + case 0xb: + case 0xc: + case 0xd: + case 0x10: + case 0x11: + case 0x12: + case 0x18: + case 0x19: + case 0x1a: + if (super->type == 0 || (gPlayerState.field_0xac & 8) != 0) { + sub_080989C0(this); + } + break; + case 0x14: + case 0x16: + case 0x20: + if (super->type == 0) { + sub_080989C0(this); + } + } + } else { + sub_08098918(this); + sub_08078930(super); + } + } else { + sub_080989C0(this); + } +} + +void ObjectOnSpinyBeetle_Action2(ObjectOnSpinyBeetleEntity* this) { + static void (*const ObjectOnSpinyBeetle_Action2Subactions[])(ObjectOnSpinyBeetleEntity*) = { + ObjectOnSpinyBeetle_Action2Subaction0, ObjectOnSpinyBeetle_Action2Subaction1, + ObjectOnSpinyBeetle_Action2Subaction2, ObjectOnSpinyBeetle_Action2Subaction3, + ObjectOnSpinyBeetle_Action2Subaction4, ObjectOnSpinyBeetle_Action2Subaction5, + ObjectOnSpinyBeetle_Action2Subaction6, + }; + ObjectOnSpinyBeetle_Action2Subactions[super->subAction](this); +} + +void ObjectOnSpinyBeetle_Action2Subaction0(ObjectOnSpinyBeetleEntity* this) { + super->flags |= ENT_COLLIDE; + super->field_0x3c = 7; + super->hitType = 1; + super->flags2 = gPlayerEntity.flags2; + super->spriteOffsetY = 0; + (super->parent)->child = NULL; + super->subAction += 1; +} + +void ObjectOnSpinyBeetle_Action2Subaction1(ObjectOnSpinyBeetleEntity* this) { +} + +void ObjectOnSpinyBeetle_Action2Subaction2(ObjectOnSpinyBeetleEntity* this) { + super->spritePriority.b1 = 3; +} + +void ObjectOnSpinyBeetle_Action2Subaction3(ObjectOnSpinyBeetleEntity* this) { + switch (sub_080043E8(super)) { + case 2: + CreateFx(super, FX_WATER_SPLASH, 0); + break; + case 1: + CreateFx(super, FX_FALL_DOWN, 0); + break; + case 3: + CreateFx(super, FX_LAVA_SPLASH, 0); + break; + default: + sub_080989C0(this); + return; + } + DeleteThisEntity(); +} + +void ObjectOnSpinyBeetle_Action2Subaction4(ObjectOnSpinyBeetleEntity* this) { + DeleteThisEntity(); +} + +void ObjectOnSpinyBeetle_Action2Subaction5(ObjectOnSpinyBeetleEntity* this) { + if (gPlayerState.heldObject == 0) { + ObjectOnSpinyBeetle_Action2Subaction6(this); + } +} + +void ObjectOnSpinyBeetle_Action2Subaction6(ObjectOnSpinyBeetleEntity* this) { + super->action = 1; + super->subAction = 0; +} + +void ObjectOnSpinyBeetle_Action3(ObjectOnSpinyBeetleEntity* this) { + static void (*const ObjectOnSpinyBeetle_Action3Subactions[])(ObjectOnSpinyBeetleEntity*) = { + ObjectOnSpinyBeetle_Action3Subaction0, ObjectOnSpinyBeetle_Action3Subaction1, + ObjectOnSpinyBeetle_Action3Subaction2, ObjectOnSpinyBeetle_Action3Subaction3, + ObjectOnSpinyBeetle_Action3Subaction4, ObjectOnSpinyBeetle_Action3Subaction5, + }; + + ObjectOnSpinyBeetle_Action3Subactions[super->subAction](this); + if ((super->subAction < 2) && (ObjectOnSpinyBeetle_GetParent(this) == NULL)) { + sub_080989C0(this); + } +} + +void ObjectOnSpinyBeetle_Action3Subaction0(ObjectOnSpinyBeetleEntity* this) { + super->subAction = 1; + super->field_0x1d = 0x30; + super->actionDelay = 0; +} + +void ObjectOnSpinyBeetle_Action3Subaction1(ObjectOnSpinyBeetleEntity* this) { + if ((gPlayerState.field_0x1c & 0xf) != 1 || (super->bitfield & 0x7f) != 0x13) { + super->spriteOffsetX = 0; + super->action = 1; + } else { + sub_0806F4E8(super); + } +} + +void ObjectOnSpinyBeetle_Action3Subaction2(ObjectOnSpinyBeetleEntity* this) { + if (super->actionDelay == 0) { + super->actionDelay = 1; + super->spriteOffsetX = 0; + super->spriteOffsetY = -2; + (super->parent)->child = NULL; + } + if ((gPlayerState.field_0x1c & 0xf) != 1 || (super->bitfield & 0x7f) != 0x13) { + sub_080989C0(this); + } else { + if ((sub_0806F3E4(super) != 0) && (super->type == 0)) { + DeleteThisEntity(); + } + } +} + +void ObjectOnSpinyBeetle_Action3Subaction3(ObjectOnSpinyBeetleEntity* this) { + if (gPlayerState.field_0x1c == 0) { + sub_080989C0(this); + } else { + (this->base).flags &= ~ENT_COLLIDE; + } +} + +void ObjectOnSpinyBeetle_Action3Subaction4(ObjectOnSpinyBeetleEntity* this) { +} + +void ObjectOnSpinyBeetle_Action3Subaction5(ObjectOnSpinyBeetleEntity* this) { + sub_080989C0(this); +} + +void ObjectOnSpinyBeetle_Action4(ObjectOnSpinyBeetleEntity* this) { + if (super->zVelocity < 0) { + super->spriteSettings.flipY = 1; + } + if (GravityUpdate(super, 0x2000) == 0) { + sub_080989C0(this); + } +} + +void ObjectOnSpinyBeetle_Action5(ObjectOnSpinyBeetleEntity* this) { + sub_080989C0(this); +} + +void sub_08098918(ObjectOnSpinyBeetleEntity* this) { + static const s8 gUnk_08123558[] = { 1, 2, 2, 2, 0, -3, -3, -4, -3, -4, -3, -3, -3, 0, 0, 0 }; + u16 tmp; + Entity* parent = ObjectOnSpinyBeetle_GetParent(this); + if (parent == NULL) { + sub_080989C0(this); + } else { + CopyPosition(parent, super); + tmp = parent->flags & 0x80; + if ((parent->flags & ENT_COLLIDE) != 0) { + if (super->field_0xf == 0) { + super->field_0xf += 1; + super->spritePriority.b0 = 3; + SortEntityBelow(super, super->parent); + } + super->z.HALF.HI = gUnk_08123558[parent->frame & 0xf] - 8; + super->spriteOffsetY = 0; + } else { + if (super->field_0xf != 0) { + super->field_0xf = tmp; + super->spritePriority.b0 = 6; + SortEntityBelow(super, super->parent); + } + super->z.HALF.HI = tmp; + super->spriteOffsetY = 3; + } + } +} + +void sub_080989C0(ObjectOnSpinyBeetleEntity* this) { + if (ObjectOnSpinyBeetle_GetParent(this) != NULL) { + (super->parent)->child = NULL; + } + CreateFx(super, super->type + FX_BUSH, 0); + DeleteThisEntity(); +} + +Entity* ObjectOnSpinyBeetle_GetParent(ObjectOnSpinyBeetleEntity* this) { + Entity* parent = super->parent; + if ((parent != NULL) && (parent->next == NULL)) { + parent = NULL; + } + return parent; +} From b35a3216dcff8de9203c7b4cb65b10b9dd8248b7 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Thu, 17 Feb 2022 18:10:22 +0100 Subject: [PATCH 09/10] Decompile DoubleBookshelf --- asm/object/doubleBookshelf.s | 560 ---------------------------- assets/assets.json | 5 - data/const/object/doubleBookshelf.s | 14 - include/object.h | 2 +- linker.ld | 4 +- src/object/doubleBookshelf.c | 215 +++++++++++ 6 files changed, 218 insertions(+), 582 deletions(-) delete mode 100644 asm/object/doubleBookshelf.s delete mode 100644 data/const/object/doubleBookshelf.s create mode 100644 src/object/doubleBookshelf.c diff --git a/asm/object/doubleBookshelf.s b/asm/object/doubleBookshelf.s deleted file mode 100644 index 1fdaa0d4..00000000 --- a/asm/object/doubleBookshelf.s +++ /dev/null @@ -1,560 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start DoubleBookshelf -DoubleBookshelf: @ 0x0809AF5C - push {lr} - ldr r2, _0809AF70 @ =gUnk_08123D58 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0809AF70: .4byte gUnk_08123D58 - - thumb_func_start sub_0809AF74 -sub_0809AF74: @ 0x0809AF74 - push {r4, r5, r6, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xa] - strb r0, [r4, #0x1e] - movs r0, #0x2e - ldrsh r2, [r4, r0] - ldr r1, _0809AFBC @ =gRoomControls - ldrh r0, [r1, #6] - subs r2, r2, r0 - asrs r2, r2, #4 - movs r3, #0x3f - ands r2, r3 - movs r5, #0x32 - ldrsh r0, [r4, r5] - ldrh r1, [r1, #8] - subs r0, r0, r1 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r2, r0 - adds r0, r4, #0 - adds r0, #0x80 - movs r6, #0 - strh r2, [r0] - ldrb r0, [r4, #0xa] - cmp r0, #0 - beq _0809AFC4 - movs r1, #1 - strb r1, [r4, #0xc] - adds r0, r4, #0 - adds r0, #0x84 - ldrb r0, [r0] - cmp r0, #0 - bne _0809AFC0 - strb r6, [r4, #0xd] - b _0809B02C - .align 2, 0 -_0809AFBC: .4byte gRoomControls -_0809AFC0: - strb r1, [r4, #0xd] - b _0809B02C -_0809AFC4: - movs r0, #3 - strb r0, [r4, #0xc] - movs r0, #4 - strb r0, [r4, #0xd] - adds r0, r4, #0 - adds r0, #0x84 - strb r6, [r0] - adds r0, r4, #0 - bl UpdateSpriteForCollisionLayer - movs r0, #0x8b - movs r1, #1 - movs r2, #0 - bl CreateObject - adds r5, r0, #0 - cmp r5, #0 - beq _0809B026 - str r4, [r5, #0x50] - str r5, [r4, #0x54] - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - bne _0809B010 - movs r3, #0x80 - lsls r3, r3, #0xd - adds r0, r4, #0 - adds r1, r5, #0 - adds r2, r3, #0 - bl PositionRelative - adds r0, r5, #0 - adds r0, #0x84 - strb r6, [r0] - b _0809B026 -_0809B010: - movs r3, #0x80 - lsls r3, r3, #0xd - adds r0, r4, #0 - adds r1, r5, #0 - movs r2, #0 - bl PositionRelative - adds r1, r5, #0 - adds r1, #0x84 - movs r0, #1 - strb r0, [r1] -_0809B026: - adds r0, r4, #0 - bl sub_0809B334 -_0809B02C: - adds r0, r4, #0 - bl sub_0809B0B0 - pop {r4, r5, r6, pc} - - thumb_func_start sub_0809B034 -sub_0809B034: @ 0x0809B034 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x82 - ldrh r0, [r0] - adds r1, r4, #0 - adds r1, #0x38 - ldrb r1, [r1] - bl GetTileType - adds r0, r4, #0 - bl sub_0809B234 - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0809B050 -sub_0809B050: @ 0x0809B050 - push {r4, r5, lr} - adds r4, r0, #0 - bl LinearMoveUpdate - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0809B0A2 - movs r0, #1 - strb r0, [r4, #0xc] - movs r0, #0x2e - ldrsh r1, [r4, r0] - ldr r2, _0809B0A4 @ =gRoomControls - ldrh r0, [r2, #6] - subs r1, r1, r0 - asrs r1, r1, #4 - movs r3, #0x3f - ands r1, r3 - movs r5, #0x32 - ldrsh r0, [r4, r5] - ldrh r2, [r2, #8] - subs r0, r0, r2 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r1, r0 - adds r0, r4, #0 - adds r0, #0x80 - strh r1, [r0] - movs r0, #0 - bl SetPlayerControl - adds r0, r4, #0 - bl sub_0809B0B0 - movs r0, #0x86 - lsls r0, r0, #1 - bl EnqueueSFX -_0809B0A2: - pop {r4, r5, pc} - .align 2, 0 -_0809B0A4: .4byte gRoomControls - - thumb_func_start sub_0809B0A8 -sub_0809B0A8: @ 0x0809B0A8 - push {lr} - bl sub_0809B234 - pop {pc} - - thumb_func_start sub_0809B0B0 -sub_0809B0B0: @ 0x0809B0B0 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - mov r8, r0 - adds r0, #0x80 - ldrh r0, [r0] - subs r6, r0, #1 - mov r0, r8 - adds r0, #0x38 - ldrb r7, [r0] - mov r1, r8 - ldrb r0, [r1, #0xd] - cmp r0, #4 - bls _0809B0CE - b _0809B228 -_0809B0CE: - lsls r0, r0, #2 - ldr r1, _0809B0D8 @ =_0809B0DC - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0809B0D8: .4byte _0809B0DC -_0809B0DC: @ jump table - .4byte _0809B0F0 @ case 0 - .4byte _0809B130 @ case 1 - .4byte _0809B178 @ case 2 - .4byte _0809B1C0 @ case 3 - .4byte _0809B208 @ case 4 -_0809B0F0: - mov r1, r8 - adds r1, #0x84 - movs r0, #0 - strb r0, [r1] - adds r5, r6, #2 - mov r0, r8 - adds r0, #0x82 - strh r5, [r0] - ldr r0, _0809B128 @ =0x00004082 - subs r1, r6, #1 - adds r2, r7, #0 - bl SetTile - ldr r4, _0809B12C @ =0x00004022 - adds r0, r4, #0 - adds r1, r6, #0 - adds r2, r7, #0 - bl SetTile - adds r1, r6, #1 - adds r0, r4, #0 - adds r2, r7, #0 - bl SetTile - adds r0, r4, #0 - adds r1, r5, #0 - b _0809B162 - .align 2, 0 -_0809B128: .4byte 0x00004082 -_0809B12C: .4byte 0x00004022 -_0809B130: - mov r1, r8 - adds r1, #0x84 - movs r0, #1 - strb r0, [r1] - mov r0, r8 - adds r0, #0x82 - strh r6, [r0] - ldr r0, _0809B16C @ =0x0000405F - adds r1, r6, #0 - adds r2, r7, #0 - bl SetTile - ldr r4, _0809B170 @ =0x00004022 - adds r1, r6, #1 - adds r0, r4, #0 - adds r2, r7, #0 - bl SetTile - adds r1, r6, #2 - adds r0, r4, #0 - adds r2, r7, #0 - bl SetTile - ldr r0, _0809B174 @ =0x00004082 - adds r1, r6, #3 -_0809B162: - adds r2, r7, #0 - bl SetTile - b _0809B228 - .align 2, 0 -_0809B16C: .4byte 0x0000405F -_0809B170: .4byte 0x00004022 -_0809B174: .4byte 0x00004082 -_0809B178: - mov r1, r8 - adds r1, #0x84 - movs r0, #1 - strb r0, [r1] - mov r0, r8 - adds r0, #0x82 - strh r6, [r0] - ldr r0, _0809B1B4 @ =0x00004082 - adds r1, r6, #3 - adds r2, r7, #0 - bl SetTile - ldr r0, _0809B1B8 @ =0x00004022 - adds r1, r6, #2 - adds r2, r7, #0 - bl SetTile - ldr r0, _0809B1BC @ =0x0000405F - adds r1, r6, #0 - adds r2, r7, #0 - bl SetTile - mov r1, r8 - ldr r0, [r1, #0x50] - adds r0, #0x86 - ldrh r0, [r0] - bl SetFlag - b _0809B228 - .align 2, 0 -_0809B1B4: .4byte 0x00004082 -_0809B1B8: .4byte 0x00004022 -_0809B1BC: .4byte 0x0000405F -_0809B1C0: - mov r1, r8 - adds r1, #0x84 - movs r0, #0 - strb r0, [r1] - adds r4, r6, #2 - mov r0, r8 - adds r0, #0x82 - strh r4, [r0] - ldr r0, _0809B1FC @ =0x00004082 - subs r1, r6, #1 - adds r2, r7, #0 - bl SetTile - ldr r0, _0809B200 @ =0x00004022 - adds r1, r6, #0 - adds r2, r7, #0 - bl SetTile - ldr r0, _0809B204 @ =0x0000405F - adds r1, r4, #0 - adds r2, r7, #0 - bl SetTile - mov r1, r8 - ldr r0, [r1, #0x50] - adds r0, #0x86 - ldrh r0, [r0] - bl ClearFlag - b _0809B228 - .align 2, 0 -_0809B1FC: .4byte 0x00004082 -_0809B200: .4byte 0x00004022 -_0809B204: .4byte 0x0000405F -_0809B208: - ldr r4, _0809B230 @ =0x00004022 - adds r0, r4, #0 - adds r1, r6, #0 - adds r2, r7, #0 - bl SetTile - adds r1, r6, #1 - adds r0, r4, #0 - adds r2, r7, #0 - bl SetTile - adds r1, r6, #2 - adds r0, r4, #0 - adds r2, r7, #0 - bl SetTile -_0809B228: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0809B230: .4byte 0x00004022 - - thumb_func_start sub_0809B234 -sub_0809B234: @ 0x0809B234 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xa] - cmp r0, #0 - beq _0809B26A - ldr r2, [r4, #0x50] - ldrb r1, [r2, #0x19] - lsrs r1, r1, #6 - lsls r1, r1, #6 - ldrb r3, [r4, #0x19] - movs r0, #0x3f - ands r0, r3 - orrs r0, r1 - strb r0, [r4, #0x19] - adds r2, #0x29 - ldrb r1, [r2] - lsls r1, r1, #0x1d - adds r3, r4, #0 - adds r3, #0x29 - lsrs r1, r1, #0x1d - ldrb r2, [r3] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r3] - b _0809B270 -_0809B26A: - adds r0, r4, #0 - bl sub_0809B274 -_0809B270: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0809B274 -sub_0809B274: @ 0x0809B274 - push {r4, r5, lr} - adds r4, r0, #0 - ldr r3, _0809B290 @ =gPlayerEntity - adds r2, r4, #0 - adds r2, #0x84 - ldrb r0, [r2] - cmp r0, #1 - beq _0809B2BA - cmp r0, #1 - bgt _0809B294 - cmp r0, #0 - beq _0809B29A - b _0809B332 - .align 2, 0 -_0809B290: .4byte gPlayerEntity -_0809B294: - cmp r0, #2 - beq _0809B30C - b _0809B332 -_0809B29A: - movs r1, #0x32 - ldrsh r0, [r3, r1] - adds r0, #0x14 - movs r3, #0x32 - ldrsh r1, [r4, r3] - cmp r0, r1 - bge _0809B332 - movs r0, #1 - strb r0, [r2] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - subs r0, #9 - ands r0, r1 - movs r1, #5 - b _0809B306 -_0809B2BA: - movs r5, #0x2e - ldrsh r0, [r3, r5] - adds r0, #0x1c - movs r5, #0x2e - ldrsh r1, [r4, r5] - cmp r0, r1 - ble _0809B2E8 - movs r0, #2 - strb r0, [r2] - ldr r0, _0809B2E4 @ =0x00004022 - adds r1, r4, #0 - adds r1, #0x80 - ldrh r1, [r1] - adds r1, #2 - movs r2, #1 - bl SetTile - ldr r0, [r4, #0x54] - bl sub_0809B358 - b _0809B332 - .align 2, 0 -_0809B2E4: .4byte 0x00004022 -_0809B2E8: - movs r1, #0x32 - ldrsh r0, [r3, r1] - adds r0, #0x10 - movs r3, #0x32 - ldrsh r1, [r4, r3] - cmp r0, r1 - ble _0809B332 - movs r0, #0 - strb r0, [r2] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - subs r0, #8 - ands r0, r1 - movs r1, #4 -_0809B306: - orrs r0, r1 - strb r0, [r2] - b _0809B332 -_0809B30C: - movs r5, #0x2e - ldrsh r0, [r3, r5] - adds r0, #0x20 - movs r3, #0x2e - ldrsh r1, [r4, r3] - cmp r0, r1 - bge _0809B332 - movs r0, #1 - strb r0, [r2] - adds r0, r4, #0 - adds r0, #0x80 - ldrh r0, [r0] - adds r0, #2 - movs r1, #1 - bl sub_0807BA8C - ldr r0, [r4, #0x54] - bl sub_0809B38C -_0809B332: - pop {r4, r5, pc} - - thumb_func_start sub_0809B334 -sub_0809B334: @ 0x0809B334 - push {r4, r5, lr} - adds r0, #0x80 - ldrh r0, [r0] - adds r4, r0, #0 - subs r4, #0x81 - movs r5, #2 -_0809B340: - ldr r0, _0809B354 @ =0x00004026 - adds r1, r4, #0 - movs r2, #1 - bl SetTile - subs r5, #1 - adds r4, #1 - cmp r5, #0 - bge _0809B340 - pop {r4, r5, pc} - .align 2, 0 -_0809B354: .4byte 0x00004026 - - thumb_func_start sub_0809B358 -sub_0809B358: @ 0x0809B358 - push {r4, r5, r6, lr} - adds r1, r0, #0 - adds r1, #0x84 - ldrb r1, [r1] - lsls r1, r1, #1 - ldr r2, _0809B388 @ =gUnk_08123D68 - adds r5, r1, r2 - adds r0, #0x80 - ldrh r0, [r0] - adds r4, r0, #0 - subs r4, #0x82 - movs r6, #4 -_0809B370: - ldrh r0, [r5] - adds r1, r4, #0 - movs r2, #1 - bl SetTile - subs r6, #1 - adds r4, #1 - adds r5, #4 - cmp r6, #0 - bge _0809B370 - pop {r4, r5, r6, pc} - .align 2, 0 -_0809B388: .4byte gUnk_08123D68 - - thumb_func_start sub_0809B38C -sub_0809B38C: @ 0x0809B38C - push {r4, r5, lr} - adds r0, #0x80 - ldrh r0, [r0] - adds r4, r0, #0 - subs r4, #0x82 - movs r5, #4 -_0809B398: - adds r0, r4, #0 - movs r1, #1 - bl sub_0807BA8C - subs r5, #1 - adds r4, #1 - cmp r5, #0 - bge _0809B398 - pop {r4, r5, pc} - .align 2, 0 diff --git a/assets/assets.json b/assets/assets.json index 5425bdd7..bbf20b82 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -45126,11 +45126,6 @@ "start": 1195152, "size": 40 }, - { - "path": "doubleBookshelf/gUnk_08123D68.bin", - "start": 1195368, - "size": 20 - }, { "path": "object91/gUnk_08123DDC.bin", "start": 1195484, diff --git a/data/const/object/doubleBookshelf.s b/data/const/object/doubleBookshelf.s deleted file mode 100644 index 9bd699f0..00000000 --- a/data/const/object/doubleBookshelf.s +++ /dev/null @@ -1,14 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08123D58:: @ 08123D58 - .4byte sub_0809AF74 - .4byte sub_0809B034 - .4byte sub_0809B050 - .4byte sub_0809B0A8 - -gUnk_08123D68:: @ 08123D68 - .incbin "doubleBookshelf/gUnk_08123D68.bin" diff --git a/include/object.h b/include/object.h index 4a4d11f4..b2342091 100644 --- a/include/object.h +++ b/include/object.h @@ -365,7 +365,7 @@ void OctorokBossObject(Entity*); void MacroBook(Entity*); void MazaalBossObject(Entity*); void CabinFurniture(Entity*); -void DoubleBookshelf(Entity*); +void DoubleBookshelf(); void Book(Entity*); void Fireplace(Entity*); void Object8E(); diff --git a/linker.ld b/linker.ld index 3569ac23..505a858a 100644 --- a/linker.ld +++ b/linker.ld @@ -784,7 +784,7 @@ SECTIONS { asm/object/macroBook.o(.text); asm/object/mazaalBossObject.o(.text); asm/object/cabinFurniture.o(.text); - asm/object/doubleBookshelf.o(.text); + src/object/doubleBookshelf.o(.text); src/object/book.o(.text); src/object/fireplace.o(.text); src/object/object8E.o(.text); @@ -1539,7 +1539,7 @@ SECTIONS { data/animations/object/macroBook.o(.rodata); data/const/object/mazaalBossObject.o(.rodata); data/const/object/cabinFurniture.o(.rodata); - data/const/object/doubleBookshelf.o(.rodata); + src/object/doubleBookshelf.o(.rodata); src/object/book.o(.rodata); data/const/object/fireplace.o(.rodata); src/object/object8E.o(.rodata); diff --git a/src/object/doubleBookshelf.c b/src/object/doubleBookshelf.c new file mode 100644 index 00000000..f7093e7e --- /dev/null +++ b/src/object/doubleBookshelf.c @@ -0,0 +1,215 @@ +/** + * @file doubleBookshelf.c + * @ingroup Objects + * + * @brief Double Bookshelf object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68[0x18]; + /*0x80*/ u16 unk_80; + /*0x82*/ u16 unk_82; + /*0x84*/ u8 unk_84; + /*0x85*/ u8 unk_85; + /*0x86*/ u16 unk_86; +} DoubleBookshelfEntity; + +void sub_0809B334(DoubleBookshelfEntity*); +void sub_0809B0B0(DoubleBookshelfEntity*); +void sub_0809B234(DoubleBookshelfEntity*); +void sub_0809B274(DoubleBookshelfEntity*); +void sub_0809B358(DoubleBookshelfEntity*); +void sub_0809B38C(DoubleBookshelfEntity*); +void DoubleBookshelf_Init(DoubleBookshelfEntity*); +void DoubleBookshelf_Action1(DoubleBookshelfEntity*); +void DoubleBookshelf_Action2(DoubleBookshelfEntity*); +void DoubleBookshelf_Action3(DoubleBookshelfEntity*); + +void DoubleBookshelf(DoubleBookshelfEntity* this) { + static void (*const DoubleBookshelf_Actions[])(DoubleBookshelfEntity*) = { + DoubleBookshelf_Init, + DoubleBookshelf_Action1, + DoubleBookshelf_Action2, + DoubleBookshelf_Action3, + }; + DoubleBookshelf_Actions[super->action](this); +} + +void DoubleBookshelf_Init(DoubleBookshelfEntity* this) { + DoubleBookshelfEntity* child; + super->frameIndex = super->type; + this->unk_80 = COORD_TO_TILE(super); + if (super->type != 0) { + super->action = 1; + if (this->unk_84 == 0) { + super->subAction = 0; + } else { + super->subAction = 1; + } + } else { + super->action = 3; + super->subAction = 4; + this->unk_84 = 0; + UpdateSpriteForCollisionLayer(super); + child = (DoubleBookshelfEntity*)CreateObject(DOUBLE_BOOKSHELF, 1, 0); + if (child != NULL) { + (child->base).parent = super; + super->child = &child->base; + if (CheckFlags(this->unk_86) == 0) { + PositionRelative(super, &child->base, 0x100000, 0x100000); + child->unk_84 = 0; + } else { + PositionRelative(super, &child->base, 0, 0x100000); + child->unk_84 = 1; + } + } + sub_0809B334(this); + } + sub_0809B0B0(this); +} + +void DoubleBookshelf_Action1(DoubleBookshelfEntity* this) { + GetTileType(this->unk_82, super->collisionLayer); + sub_0809B234(this); +} + +void DoubleBookshelf_Action2(DoubleBookshelfEntity* this) { + LinearMoveUpdate(super); + if (--super->actionDelay == 0) { + super->action = 1; + this->unk_80 = COORD_TO_TILE(super); + SetPlayerControl(CONTROL_ENABLED); + sub_0809B0B0(this); + EnqueueSFX(SFX_BUTTON_PRESS); + } +} + +void DoubleBookshelf_Action3(DoubleBookshelfEntity* this) { + sub_0809B234(this); +} + +void sub_0809B0B0(DoubleBookshelfEntity* this) { + u32 position = this->unk_80 - 1; + u32 layer = super->collisionLayer; + switch (super->subAction) { + case 0: + this->unk_84 = 0; + this->unk_82 = position + 2; + SetTile(0x4082, position - 1, layer); + SetTile(0x4022, position, layer); + SetTile(0x4022, position + 1, layer); + SetTile(0x4022, position + 2, layer); + break; + case 1: + this->unk_84 = 1; + this->unk_82 = position; + SetTile(0x405f, position, layer); + SetTile(0x4022, position + 1, layer); + SetTile(0x4022, position + 2, layer); + SetTile(0x4082, position + 3, layer); + break; + case 2: + this->unk_84 = 1; + this->unk_82 = position; + SetTile(0x4082, position + 3, layer); + SetTile(0x4022, position + 2, layer); + SetTile(0x405f, position, layer); + SetFlag(((DoubleBookshelfEntity*)super->parent)->unk_86); + break; + case 3: + this->unk_84 = 0; + this->unk_82 = position + 2; + SetTile(0x4082, position - 1, layer); + SetTile(0x4022, position, layer); + SetTile(0x405f, position + 2, layer); + ClearFlag(((DoubleBookshelfEntity*)super->parent)->unk_86); + break; + case 4: + SetTile(0x4022, position, layer); + SetTile(0x4022, position + 1, layer); + SetTile(0x4022, position + 2, layer); + break; + } +} + +void sub_0809B234(DoubleBookshelfEntity* this) { + if (super->type != 0) { + super->spriteRendering.b3 = super->parent->spriteRendering.b3; + super->spritePriority.b0 = super->parent->spritePriority.b0; + } else { + sub_0809B274(this); + } +} + +void sub_0809B274(DoubleBookshelfEntity* this) { + Entity* player = &gPlayerEntity; + switch (this->unk_84) { + case 0: + if (player->y.HALF.HI + 0x14 >= super->y.HALF.HI) { + return; + } + this->unk_84 = 1; + super->spritePriority.b0 = 5; + break; + case 1: + if (player->x.HALF.HI + 0x1c > super->x.HALF.HI) { + this->unk_84 = 2; + SetTile(0x4022, this->unk_80 + 2, 1); + sub_0809B358((DoubleBookshelfEntity*)super->child); + return; + } + if (player->y.HALF.HI + 0x10 <= super->y.HALF.HI) { + return; + } + this->unk_84 = 0; + super->spritePriority.b0 = 4; + break; + case 2: + if (player->x.HALF.HI + 0x20 >= super->x.HALF.HI) { + return; + } + this->unk_84 = 1; + sub_0807BA8C(this->unk_80 + 2, 1); + sub_0809B38C((DoubleBookshelfEntity*)super->child); + return; + } +} + +void sub_0809B334(DoubleBookshelfEntity* this) { + s32 index; + u32 position = this->unk_80 - 0x81; + for (index = 2; index >= 0; index--, position++) { + SetTile(0x4026, position, 1); + } +} + +void sub_0809B358(DoubleBookshelfEntity* this) { + static const u16 gUnk_08123D68[] = { + 0x4022, 0x4022, 0x4074, 0x4026, 0x4074, 0x4074, 0x4026, 0x4074, 0x4022, 0x4022 + }; + s32 index; + const u16* array = &gUnk_08123D68[this->unk_84]; + u32 position = this->unk_80 - 0x82; + for (index = 4; index >= 0;) { + SetTile(*array, position, 1); + index--; + position++; + array += 2; + } +} + +void sub_0809B38C(DoubleBookshelfEntity* this) { + s32 index; + u32 uVar1 = this->unk_80 - 0x82; + for (index = 4; index >= 0;) { + sub_0807BA8C(uVar1, 1); + index--; + uVar1++; + } +} From b900556352c4d7fc88be00b51564910ec67166c6 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Thu, 17 Feb 2022 21:03:23 +0100 Subject: [PATCH 10/10] Decompile ObjectA8 --- asm/object/objectA8.s | 573 ----------------------------------- assets/assets.json | 5 - data/const/object/objectA8.s | 22 -- include/functions.h | 5 +- include/object.h | 2 +- linker.ld | 3 +- src/npc/stockwell.c | 1 + src/object/itemOnGround.c | 2 - src/object/objectA8.c | 236 ++++++++++++++- 9 files changed, 231 insertions(+), 618 deletions(-) delete mode 100644 asm/object/objectA8.s delete mode 100644 data/const/object/objectA8.s diff --git a/asm/object/objectA8.s b/asm/object/objectA8.s deleted file mode 100644 index 69bbbe08..00000000 --- a/asm/object/objectA8.s +++ /dev/null @@ -1,573 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_0809FABC -sub_0809FABC: @ 0x0809FABC - push {lr} - adds r3, r0, #0 - movs r0, #1 - strb r0, [r3, #0xc] - ldrb r0, [r3, #0xb] - cmp r0, #0 - beq _0809FAD0 - cmp r0, #2 - beq _0809FADE - b _0809FAE6 -_0809FAD0: - movs r0, #0xf0 - lsls r0, r0, #9 - str r0, [r3, #0x20] - ldrh r0, [r3, #0x36] - adds r0, #8 - strh r0, [r3, #0x36] - b _0809FAE6 -_0809FADE: - adds r0, r3, #0 - bl sub_0809FECC - b _0809FB30 -_0809FAE6: - adds r1, r3, #0 - adds r1, #0x38 - movs r0, #3 - strb r0, [r1] - adds r0, r3, #0 - adds r0, #0x3c - movs r2, #0x17 - strb r2, [r0] - adds r1, #8 - movs r0, #0x48 - strb r0, [r1] - subs r1, #1 - movs r0, #7 - strb r0, [r1] - adds r0, r3, #0 - adds r0, #0x3b - strb r2, [r0] - ldr r0, _0809FB34 @ =gUnk_080FD1A8 - str r0, [r3, #0x48] - movs r0, #1 - strb r0, [r3, #0x1c] - ldrh r1, [r3, #0x2e] - adds r0, r3, #0 - adds r0, #0x74 - strh r1, [r0] - ldrh r0, [r3, #0x32] - adds r1, r3, #0 - adds r1, #0x76 - strh r0, [r1] - adds r0, r3, #0 - movs r1, #3 - bl SetDefaultPriority - movs r0, #0x9b - lsls r0, r0, #1 - bl EnqueueSFX -_0809FB30: - pop {pc} - .align 2, 0 -_0809FB34: .4byte gUnk_080FD1A8 - - thumb_func_start sub_0809FB38 -sub_0809FB38: @ 0x0809FB38 - push {lr} - adds r2, r0, #0 - ldr r0, [r2, #0x34] - ldr r1, _0809FB60 @ =0xFFFF2000 - adds r0, r0, r1 - str r0, [r2, #0x34] - adds r0, r2, #0 - adds r0, #0x5a - ldrb r0, [r0] - cmp r0, #0 - beq _0809FB74 - ldrb r0, [r2, #0xe] - cmp r0, #0 - beq _0809FB64 - adds r1, r0, #0 - lsls r0, r1, #4 - subs r0, r0, r1 - lsls r0, r0, #1 - b _0809FB66 - .align 2, 0 -_0809FB60: .4byte 0xFFFF2000 -_0809FB64: - movs r0, #0xf0 -_0809FB66: - strb r0, [r2, #0xe] - movs r0, #3 - strb r0, [r2, #0xc] - movs r0, #1 - strb r0, [r2, #0xf] - movs r0, #0x80 - strh r0, [r2, #0x24] -_0809FB74: - pop {pc} - .align 2, 0 - - thumb_func_start sub_0809FB78 -sub_0809FB78: @ 0x0809FB78 - push {lr} - ldr r2, _0809FB8C @ =gUnk_08124840 - ldrb r1, [r0, #0xd] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0809FB8C: .4byte gUnk_08124840 - - thumb_func_start sub_0809FB90 -sub_0809FB90: @ 0x0809FB90 - movs r3, #1 - movs r1, #1 - strb r1, [r0, #0xd] - strb r1, [r0, #0x1d] - ldrb r2, [r0, #0x18] - subs r1, #5 - ands r1, r2 - orrs r1, r3 - strb r1, [r0, #0x18] - bx lr - - thumb_func_start sub_0809FBA4 -sub_0809FBA4: @ 0x0809FBA4 - push {lr} - adds r2, r0, #0 - ldr r0, _0809FBC8 @ =gPlayerState - ldrb r1, [r0, #0x1c] - movs r0, #0xf - ands r0, r1 - cmp r0, #1 - bne _0809FBC2 - adds r0, r2, #0 - adds r0, #0x41 - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0x13 - beq _0809FBCC -_0809FBC2: - movs r0, #3 - strb r0, [r2, #0xc] - b _0809FBD2 - .align 2, 0 -_0809FBC8: .4byte gPlayerState -_0809FBCC: - adds r0, r2, #0 - bl sub_0806F4E8 -_0809FBD2: - pop {pc} - - thumb_func_start sub_0809FBD4 -sub_0809FBD4: @ 0x0809FBD4 - push {r4, r5, lr} - adds r4, r0, #0 - ldr r0, _0809FBFC @ =gPlayerState - ldrb r1, [r0, #0x1c] - movs r0, #0xf - ands r0, r1 - cmp r0, #1 - bne _0809FBF4 - adds r0, r4, #0 - adds r0, #0x41 - ldrb r1, [r0] - movs r5, #0x7f - adds r0, r5, #0 - ands r0, r1 - cmp r0, #0x13 - beq _0809FC00 -_0809FBF4: - movs r0, #3 - strb r0, [r4, #0xc] - b _0809FC22 - .align 2, 0 -_0809FBFC: .4byte gPlayerState -_0809FC00: - adds r0, r4, #0 - bl sub_0806F3E4 - cmp r0, #0 - beq _0809FC22 - ldrb r1, [r4, #0x10] - adds r0, r5, #0 - ands r0, r1 - strb r0, [r4, #0x10] - movs r0, #5 - strb r0, [r4, #0xc] - ldr r0, _0809FC24 @ =gPlayerEntity - str r0, [r4, #0x54] - ldrb r0, [r4, #0xa] - movs r1, #0 - bl GiveItem -_0809FC22: - pop {r4, r5, pc} - .align 2, 0 -_0809FC24: .4byte gPlayerEntity - - thumb_func_start sub_0809FC28 -sub_0809FC28: @ 0x0809FC28 - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xf] - subs r0, #1 - strb r0, [r4, #0xf] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0809FCAC - bl Random - adds r5, r0, #0 - ldrb r0, [r4, #0x10] - movs r1, #0x80 - orrs r0, r1 - strb r0, [r4, #0x10] - movs r0, #0x20 - strb r0, [r4, #0xf] - ldr r2, _0809FC6C @ =gUnk_0812484C - lsrs r0, r5, #8 - movs r1, #1 - ands r0, r1 - adds r0, r0, r2 - ldrb r0, [r0] - strh r0, [r4, #0x24] - adds r0, r4, #0 - bl sub_0809FE9C - cmp r0, #0 - beq _0809FC70 - movs r0, #0x1f - ands r5, r0 - strb r5, [r4, #0x15] - b _0809FC8A - .align 2, 0 -_0809FC6C: .4byte gUnk_0812484C -_0809FC70: - movs r1, #0x2e - ldrsh r0, [r4, r1] - movs r2, #0x32 - ldrsh r1, [r4, r2] - adds r2, r4, #0 - adds r2, #0x74 - ldrh r2, [r2] - adds r3, r4, #0 - adds r3, #0x76 - ldrh r3, [r3] - bl CalculateDirectionTo - strb r0, [r4, #0x15] -_0809FC8A: - ldrb r1, [r4, #0x15] - movs r0, #0xf - ands r0, r1 - cmp r0, #0 - beq _0809FCAC - movs r0, #0x10 - eors r1, r0 - lsrs r1, r1, #4 - movs r0, #1 - ands r1, r0 - lsls r1, r1, #6 - ldrb r2, [r4, #0x18] - movs r0, #0x41 - rsbs r0, r0, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x18] -_0809FCAC: - adds r0, r4, #0 - bl ProcessMovement1 - bl AnyPrioritySet - cmp r0, #0 - bne _0809FCF8 - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _0809FCF8 - ldr r0, _0809FCFC @ =gRoomTransition - ldr r0, [r0] - movs r1, #1 - ands r0, r1 - cmp r0, #0 - beq _0809FCE0 - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0809FCE0 - adds r0, r4, #0 - movs r1, #0 - bl sub_08081404 -_0809FCE0: - ldrb r0, [r4, #0xe] - cmp r0, #0x3b - bhi _0809FCF8 - ldrb r2, [r4, #0x18] - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - movs r0, #1 - eors r1, r0 - subs r0, #5 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x18] -_0809FCF8: - pop {r4, r5, pc} - .align 2, 0 -_0809FCFC: .4byte gRoomTransition - - thumb_func_start sub_0809FD00 -sub_0809FD00: @ 0x0809FD00 - push {r4, lr} - adds r4, r0, #0 - ldr r2, [r4, #0x54] - ldrh r1, [r2, #8] - ldr r0, _0809FD18 @ =0x00000B08 - cmp r1, r0 - beq _0809FD1C - adds r0, r4, #0 - movs r1, #0 - bl sub_08081404 - b _0809FD44 - .align 2, 0 -_0809FD18: .4byte 0x00000B08 -_0809FD1C: - adds r0, r2, #0 - adds r1, r4, #0 - bl CopyPosition - ldrh r0, [r4, #0x36] - subs r0, #1 - strh r0, [r4, #0x36] - ldr r1, _0809FD48 @ =gPlayerEntity - adds r0, r4, #0 - bl IsColliding - cmp r0, #0 - beq _0809FD44 - adds r0, r4, #0 - bl sub_0809FECC - ldrb r0, [r4, #0xa] - movs r1, #0 - bl GiveItem -_0809FD44: - pop {r4, pc} - .align 2, 0 -_0809FD48: .4byte gPlayerEntity - - thumb_func_start sub_0809FD4C -sub_0809FD4C: @ 0x0809FD4C - push {lr} - adds r1, r0, #0 - movs r2, #6 - strb r2, [r1, #0xc] - movs r0, #0x80 - strb r0, [r1, #0xe] - strb r2, [r1, #0xf] - ldrb r2, [r1, #0x10] - movs r0, #0x7f - ands r0, r2 - strb r0, [r1, #0x10] - ldrb r2, [r1, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r2 - movs r2, #1 - orrs r0, r2 - strb r0, [r1, #0x18] - adds r3, r1, #0 - adds r3, #0x29 - ldrb r2, [r3] - movs r0, #0x39 - rsbs r0, r0, #0 - ands r0, r2 - movs r2, #0x10 - orrs r0, r2 - strb r0, [r3] - adds r2, r1, #0 - adds r2, #0x63 - movs r0, #0xfb - strb r0, [r2] - ldr r0, [r1, #0x54] - bl CopyPosition - pop {pc} - .align 2, 0 - - thumb_func_start sub_0809FD94 -sub_0809FD94: @ 0x0809FD94 - push {r4, r5, r6, lr} - adds r5, r0, #0 - ldr r6, [r5, #0x54] - ldr r2, _0809FE24 @ =gSineTable - ldrb r0, [r5, #0xe] - lsls r0, r0, #1 - adds r0, r0, r2 - movs r3, #0 - ldrsh r1, [r0, r3] - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #9 - cmp r0, #0 - bge _0809FDB4 - ldr r1, _0809FE28 @ =0x0000FFFF - adds r0, r0, r1 -_0809FDB4: - asrs r0, r0, #0x10 - ldrh r3, [r6, #0x2e] - adds r0, r0, r3 - strh r0, [r5, #0x2e] - ldrb r0, [r5, #0xe] - adds r0, #0x40 - lsls r0, r0, #1 - adds r0, r0, r2 - movs r2, #0 - ldrsh r1, [r0, r2] - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #8 - cmp r0, #0 - bge _0809FDD6 - ldr r3, _0809FE28 @ =0x0000FFFF - adds r0, r0, r3 -_0809FDD6: - asrs r1, r0, #0x10 - ldrh r0, [r6, #0x32] - subs r0, r0, r1 - strh r0, [r5, #0x32] - ldrb r3, [r5, #0xe] - adds r0, r3, #0 - adds r0, #8 - strb r0, [r5, #0xe] - ldrh r0, [r6, #0x36] - strh r0, [r5, #0x36] - ldrb r2, [r6, #0x1b] - lsrs r2, r2, #6 - lsls r2, r2, #6 - ldrb r4, [r5, #0x1b] - movs r1, #0x3f - adds r0, r1, #0 - ands r0, r4 - orrs r0, r2 - strb r0, [r5, #0x1b] - ldrb r0, [r6, #0x19] - lsrs r0, r0, #6 - lsls r0, r0, #6 - ldrb r2, [r5, #0x19] - ands r1, r2 - orrs r1, r0 - strb r1, [r5, #0x19] - subs r3, #0x39 - lsls r3, r3, #0x18 - lsrs r3, r3, #0x18 - cmp r3, #0x7e - bhi _0809FE2C - adds r2, r5, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #8 - rsbs r1, r1, #0 - ands r1, r0 - movs r0, #3 - b _0809FE3A - .align 2, 0 -_0809FE24: .4byte gSineTable -_0809FE28: .4byte 0x0000FFFF -_0809FE2C: - adds r2, r5, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #8 - rsbs r1, r1, #0 - ands r1, r0 - movs r0, #5 -_0809FE3A: - orrs r1, r0 - strb r1, [r2] - ldrb r0, [r5, #0xf] - subs r0, #1 - strb r0, [r5, #0xf] - lsls r0, r0, #0x18 - adds r4, r5, #0 - adds r4, #0x63 - cmp r0, #0 - bne _0809FE6C - movs r0, #6 - strb r0, [r5, #0xf] - ldrb r0, [r4] - subs r0, #1 - strb r0, [r4] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - movs r1, #0x16 - rsbs r1, r1, #0 - cmp r0, r1 - bge _0809FE6C - adds r0, r5, #0 - movs r1, #1 - bl sub_08081404 -_0809FE6C: - movs r1, #0 - ldrsb r1, [r4, r1] - movs r0, #0x11 - rsbs r0, r0, #0 - cmp r1, r0 - bge _0809FE8A - ldrb r2, [r5, #0x18] - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - movs r0, #1 - eors r1, r0 - subs r0, #5 - ands r0, r2 - orrs r0, r1 - strb r0, [r5, #0x18] -_0809FE8A: - adds r1, r5, #0 - adds r1, #0x87 - ldrb r0, [r1] - cmp r0, #0xa - bls _0809FE98 - movs r0, #0xa - strb r0, [r1] -_0809FE98: - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_0809FE9C -sub_0809FE9C: @ 0x0809FE9C - push {lr} - adds r2, r0, #0 - movs r1, #0x2e - ldrsh r0, [r2, r1] - adds r1, r2, #0 - adds r1, #0x74 - ldrh r1, [r1] - subs r0, r0, r1 - adds r0, #0x48 - cmp r0, #0x90 - bhi _0809FEC8 - movs r1, #0x32 - ldrsh r0, [r2, r1] - adds r1, r2, #0 - adds r1, #0x76 - ldrh r1, [r1] - subs r0, r0, r1 - adds r0, #0x30 - cmp r0, #0x60 - bhi _0809FEC8 - movs r0, #1 - b _0809FECA -_0809FEC8: - movs r0, #0 -_0809FECA: - pop {pc} - - thumb_func_start sub_0809FECC -sub_0809FECC: @ 0x0809FECC - ldr r1, _0809FEDC @ =gPlayerEntity - str r1, [r0, #0x54] - movs r2, #0 - movs r1, #5 - strb r1, [r0, #0xc] - strb r2, [r0, #0xd] - bx lr - .align 2, 0 -_0809FEDC: .4byte gPlayerEntity diff --git a/assets/assets.json b/assets/assets.json index bbf20b82..88035533 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -45396,11 +45396,6 @@ "size": 20, "type": "animation" }, - { - "path": "objectA8/gUnk_0812484C.bin", - "start": 1198156, - "size": 4 - }, { "path": "objectA9/gUnk_0812485C.bin", "start": 1198172, diff --git a/data/const/object/objectA8.s b/data/const/object/objectA8.s deleted file mode 100644 index 56b4ea9d..00000000 --- a/data/const/object/objectA8.s +++ /dev/null @@ -1,22 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08124824:: @ 08124824 - .4byte sub_0809FABC - .4byte sub_0809FB38 - .4byte sub_0809FB78 - .4byte sub_0809FC28 - .4byte sub_0809FD00 - .4byte sub_0809FD4C - .4byte sub_0809FD94 - -gUnk_08124840:: @ 08124840 - .4byte sub_0809FB90 - .4byte sub_0809FBA4 - .4byte sub_0809FBD4 - -gUnk_0812484C:: @ 0812484C - .incbin "objectA8/gUnk_0812484C.bin" diff --git a/include/functions.h b/include/functions.h index 7af14697..ecc89b87 100644 --- a/include/functions.h +++ b/include/functions.h @@ -31,8 +31,9 @@ extern void GenericKnockback2(Entity*); extern LayerStruct* GetLayerByIndex(u32); extern u32 GetRandomByWeight(const u8*); extern u32 GetTileIndex(u32, u32); -extern u32 IsColliding(Entity*, Entity*); -extern u32 IsCollidingPlayer(Entity*); +extern void GiveItem(u32, u32); +extern bool32 IsColliding(Entity*, Entity*); +extern bool32 IsCollidingPlayer(Entity*); extern bool32 IsProjectileOffScreen(Entity*); extern bool32 IsTileCollision(u8*, s32, s32, u32); extern void LinearMoveAngle(Entity*, u32, u32); diff --git a/include/object.h b/include/object.h index b2342091..96637608 100644 --- a/include/object.h +++ b/include/object.h @@ -394,7 +394,7 @@ void MinishLight(Entity*); void FireballChain(Entity*); void ObjectA6(Entity*); void ObjectA7(Entity*); -void ObjectA8(Entity*); +void ObjectA8(); void ObjectA9(Entity*); void WaterfallOpening(Entity*); void ObjectAB(Entity*); diff --git a/linker.ld b/linker.ld index 505a858a..380e052c 100644 --- a/linker.ld +++ b/linker.ld @@ -817,7 +817,6 @@ SECTIONS { asm/object/objectA6.o(.text); asm/object/objectA7.o(.text); src/object/objectA8.o(.text); - asm/object/objectA8.o(.text); asm/object/objectA9.o(.text); asm/object/waterfallOpening.o(.text); asm/object/objectAB.o(.text); @@ -1571,7 +1570,7 @@ SECTIONS { data/const/object/minishLight.o(.rodata); data/const/object/objectA6.o(.rodata); data/animations/object/objectA6.o(.rodata); - data/const/object/objectA8.o(.rodata); + src/object/objectA8.o(.rodata); data/const/object/objectA9.o(.rodata); data/const/object/waterfallOpening.o(.rodata); data/const/object/objectAB.o(.rodata); diff --git a/src/npc/stockwell.c b/src/npc/stockwell.c index 2b02257b..e72cb9c0 100644 --- a/src/npc/stockwell.c +++ b/src/npc/stockwell.c @@ -14,6 +14,7 @@ extern u16 script_StockwellBuy[]; extern u16 script_StockwellDogFood[]; extern u8 gUnk_0810FDB8[]; +extern void InitScriptExecutionContext(ScriptExecutionContext* context, u16* script); extern u32 gUnk_0810FDA0; extern u16 script_Stockwell; diff --git a/src/object/itemOnGround.c b/src/object/itemOnGround.c index 7921fc39..fd09e1e8 100644 --- a/src/object/itemOnGround.c +++ b/src/object/itemOnGround.c @@ -19,8 +19,6 @@ void sub_080813BC(Entity*); void sub_080810FC(Entity*); bool32 CheckShouldPlayItemGetCutscene(Entity*); -extern void GiveItem(u32, u32); - extern void (*const gUnk_0811E7D4[])(Entity*); extern void (*const gUnk_0811E7E8[])(Entity*); extern void (*const gUnk_0811E814[])(Entity*); diff --git a/src/object/objectA8.c b/src/object/objectA8.c index 8a347a1f..66385cb9 100644 --- a/src/object/objectA8.c +++ b/src/object/objectA8.c @@ -1,13 +1,47 @@ -#include "entity.h" -#include "player.h" +/** + * @file objectA8.c + * @ingroup Objects + * + * @brief ObjectA8 object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" #include "functions.h" #include "item.h" -extern void (*gUnk_08124824[])(Entity*); +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68[0xc]; + /*0x74*/ u16 unk_74; + /*0x76*/ u16 unk_76; + /*0x78*/ u8 unk_78[0xf]; + /*0x87*/ u8 unk_87; +} ObjectA8Entity; -void ObjectA8(Entity* this) { - if ((this->bitfield & 0x80) != 0) { - switch (this->bitfield & 0x7f) { +extern Hitbox gUnk_080FD1A8; + +void sub_0809FECC(ObjectA8Entity*); +bool32 sub_0809FE9C(ObjectA8Entity*); +void ObjectA8_Init(ObjectA8Entity*); +void ObjectA8_Action1(ObjectA8Entity*); +void ObjectA8_Action2(ObjectA8Entity*); +void ObjectA8_Action3(ObjectA8Entity*); +void ObjectA8_Action4(ObjectA8Entity*); +void ObjectA8_Action5(ObjectA8Entity*); +void ObjectA8_Action6(ObjectA8Entity*); +void ObjectA8_Action2Subaction0(ObjectA8Entity*); +void ObjectA8_Action2Subaction1(ObjectA8Entity*); +void ObjectA8_Action2Subaction2(ObjectA8Entity*); + +void ObjectA8(ObjectA8Entity* this) { + static void (*const ObjectA8_Actions[])(ObjectA8Entity*) = { + ObjectA8_Init, ObjectA8_Action1, ObjectA8_Action2, ObjectA8_Action3, + ObjectA8_Action4, ObjectA8_Action5, ObjectA8_Action6, + }; + if ((super->bitfield & 0x80) != 0) { + switch (super->bitfield & 0x7f) { case 0: case 1: case 4: @@ -20,12 +54,192 @@ void ObjectA8(Entity* this) { case 0xc: case 0x1e: case 0x1f: - this->action = 5; - this->child = &gPlayerEntity; - CreateItemEntity(this->type, 0, 0); + super->action = 5; + super->child = &gPlayerEntity; + CreateItemEntity(super->type, 0, 0); DeleteThisEntity(); } } - gUnk_08124824[this->action](this); - sub_08080CB4(this); + ObjectA8_Actions[super->action](this); + sub_08080CB4(super); +} +void ObjectA8_Init(ObjectA8Entity* this) { + super->action = 1; + switch (super->type2) { + case 0: + super->zVelocity = 0x1e000; + super->z.HALF.HI += 8; + break; + case 2: + sub_0809FECC(this); + return; + } + super->collisionLayer = 3; + super->field_0x3c = 0x17; + super->hurtType = 0x48; + super->hitType = 7; + super->flags2 = 0x17; + super->hitbox = (Hitbox*)&gUnk_080FD1A8; + super->field_0x1c = 1; + this->unk_74 = super->x.HALF.HI; + this->unk_76 = super->y.HALF.HI; + SetDefaultPriority(super, 3); + EnqueueSFX(SFX_136); +} + +void ObjectA8_Action1(ObjectA8Entity* this) { + super->z.WORD -= 0xe000; + if (super->frame != 0) { + if (super->actionDelay != 0) { + super->actionDelay *= 0x1e; + } else { + super->actionDelay = 0xf0; + } + super->action = 3; + super->field_0xf = 1; + super->speed = 0x80; + } +} + +void ObjectA8_Action2(ObjectA8Entity* this) { + static void (*const ObjectA8_Action2Subactions[])(ObjectA8Entity*) = { + ObjectA8_Action2Subaction0, + ObjectA8_Action2Subaction1, + ObjectA8_Action2Subaction2, + }; + ObjectA8_Action2Subactions[super->subAction](this); +} + +void ObjectA8_Action2Subaction0(ObjectA8Entity* this) { + super->subAction = 1; + super->field_0x1d = 1; + super->spriteSettings.draw = 1; +} + +void ObjectA8_Action2Subaction1(ObjectA8Entity* this) { + if ((gPlayerState.field_0x1c & 0xf) != 1 || (super->bitfield & 0x7f) != 0x13) { + super->action = 3; + } else { + sub_0806F4E8(super); + } +} + +void ObjectA8_Action2Subaction2(ObjectA8Entity* this) { + if ((gPlayerState.field_0x1c & 0xf) != 1 || (super->bitfield & 0x7f) != 0x13) { + super->action = 3; + } else { + if (sub_0806F3E4(super)) { + super->flags &= ~ENT_COLLIDE; + super->action = 5; + super->child = &gPlayerEntity; + GiveItem(super->type, 0); + } + } +} + +void ObjectA8_Action3(ObjectA8Entity* this) { + static const u8 gUnk_0812484C[] = { + 128, + 96, + 0, + 0, + }; + if (--super->field_0xf == 0) { + u32 rand = Random(); + super->flags |= ENT_COLLIDE; + super->field_0xf = 0x20; + super->speed = gUnk_0812484C[rand >> 8 & 1]; + if (sub_0809FE9C(this)) { + super->direction = rand & 0x1f; + } else { + super->direction = CalculateDirectionTo(super->x.HALF.HI, super->y.HALF.HI, this->unk_74, this->unk_76); + } + if ((super->direction & 0xf) != 0) { + super->spriteSettings.flipX = ((super->direction ^ 0x10) >> 4); + } + } + ProcessMovement1(super); + if ((AnyPrioritySet() == 0) && (super->type == 0)) { + if (((gRoomTransition.frameCount & 1) != 0) && (--super->actionDelay == 0)) { + sub_08081404(super, 0); + } + if (super->actionDelay < 0x3c) { + super->spriteSettings.draw ^= 1; + } + } +} + +void ObjectA8_Action4(ObjectA8Entity* this) { + if (*(u16*)&super->child->kind != 0xb08) { + sub_08081404(super, 0); + } else { + CopyPosition(super->child, super); + super->z.HALF.HI--; + if (IsColliding(super, &gPlayerEntity)) { + sub_0809FECC(this); + GiveItem(super->type, 0); + } + } +} + +void ObjectA8_Action5(ObjectA8Entity* this) { + super->action = 6; + super->actionDelay = 0x80; + super->field_0xf = 6; + super->flags &= ~ENT_COLLIDE; + super->spriteSettings.draw = 1; + super->spritePriority.b1 = 2; + super->spriteOffsetY = -5; + CopyPosition(super->child, super); +} + +void ObjectA8_Action6(ObjectA8Entity* this) { + s32 tmp; + Entity* child = super->child; + tmp = gSineTable[super->actionDelay] * 0xa00; + if (tmp < 0) { + tmp += 0xffff; + } + super->x.HALF.HI = (s16)(tmp >> 0x10) + child->x.HALF.HI; + tmp = gSineTable[super->actionDelay + 0x40] * 0x500; + if (tmp < 0) { + tmp += 0xffff; + } + super->y.HALF.HI = super->child->y.HALF.HI - (tmp >> 0x10); + super->actionDelay += 8; + super->z.HALF.HI = super->child->z.HALF.HI; + super->spriteOrientation.flipY = super->child->spriteOrientation.flipY; + super->spriteRendering.b3 = super->child->spriteRendering.b3; + if ((u8)(super->actionDelay - 0x41) < 0x7f) { + super->spritePriority.b0 = 3; + } else { + super->spritePriority.b0 = 5; + } + if (--super->field_0xf == 0) { + super->field_0xf = 6; + if (((--super->spriteOffsetY) * 0x1000000) >> 0x18 < -0x16) { + sub_08081404(super, 1); + } + } + if (super->spriteOffsetY < -0x11) { + super->spriteSettings.draw ^= 1; + } + if (this->unk_87 > 10) { + this->unk_87 = 0xa; + } +} + +bool32 sub_0809FE9C(ObjectA8Entity* this) { + if (((super->x.HALF.HI - (u32)this->unk_74) + 0x48 < 0x91) && + ((super->y.HALF.HI - (u32)this->unk_76) + 0x30 < 0x61)) { + return TRUE; + } else { + return FALSE; + } +} + +void sub_0809FECC(ObjectA8Entity* this) { + super->child = &gPlayerEntity; + super->action = 5; + super->subAction = 0; }