From 6f08201b71315ad552ca5413e7e4e15e6873f65d Mon Sep 17 00:00:00 2001 From: theo3 Date: Tue, 7 Jul 2020 19:19:42 -0700 Subject: [PATCH] treeHidingPortal.c --- asm/code_08018500.s | 4 +- asm/treeHidingPortal.s | 196 ----------------------------------------- include/entity.h | 5 ++ linker.ld | 1 + src/treeHidingPortal.c | 88 ++++++++++++++++++ 5 files changed, 96 insertions(+), 198 deletions(-) create mode 100644 src/treeHidingPortal.c diff --git a/asm/code_08018500.s b/asm/code_08018500.s index a730aedc..dd69e0da 100644 --- a/asm/code_08018500.s +++ b/asm/code_08018500.s @@ -925,8 +925,8 @@ _08018C10: _08018C14: .4byte gUnk_080FEAC8 _08018C18: .4byte gUnk_080FE320 - thumb_func_start sub_08018C1C -sub_08018C1C: @ 0x08018C1C + thumb_func_start CreateMinishEntrance +CreateMinishEntrance: @ 0x08018C1C push {r4, r5, r6, r7, lr} mov r7, r8 push {r7} diff --git a/asm/treeHidingPortal.s b/asm/treeHidingPortal.s index fd37c842..e579293c 100644 --- a/asm/treeHidingPortal.s +++ b/asm/treeHidingPortal.s @@ -6,202 +6,6 @@ .text - - thumb_func_start TreeHidingPortal -TreeHidingPortal: @ 0x0809E824 - push {lr} - ldr r2, _0809E838 @ =gUnk_08124354 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0809E838: .4byte gUnk_08124354 - - thumb_func_start sub_0809E83C -sub_0809E83C: @ 0x0809E83C - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - beq _0809E856 - adds r0, r4, #0 - bl sub_0809E96C - bl DeleteThisEntity -_0809E856: - movs r0, #1 - strb r0, [r4, #0xc] - adds r1, r4, #0 - adds r1, #0x38 - movs r0, #2 - strb r0, [r1] - adds r0, r4, #0 - bl UpdateSpriteOrderAndFlip - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0809E86C -sub_0809E86C: @ 0x0809E86C - push {r4, lr} - adds r4, r0, #0 - ldr r1, _0809E8B4 @ =gLinkEntity - movs r2, #0x30 - movs r3, #0x30 - bl sub_0800419C - cmp r0, #0 - beq _0809E89A - movs r0, #0x14 - bl CheckGlobalFlag - cmp r0, #0 - beq _0809E89A - ldr r0, _0809E8B8 @ =gUnk_030010A0 - ldr r0, [r0] - movs r1, #3 - ands r0, r1 - cmp r0, #0 - bne _0809E89A - adds r0, r4, #0 - bl sub_080A2B80 -_0809E89A: - bl sub_0809E9A0 - cmp r0, #0x54 - bne _0809E8B0 - movs r0, #2 - strb r0, [r4, #0xc] - movs r0, #0xf - strb r0, [r4, #0xe] - movs r0, #1 - bl sub_08078A90 -_0809E8B0: - pop {r4, pc} - .align 2, 0 -_0809E8B4: .4byte gLinkEntity -_0809E8B8: .4byte gUnk_030010A0 - - thumb_func_start sub_0809E8BC -sub_0809E8BC: @ 0x0809E8BC - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0809E8E8 - movs r0, #3 - strb r0, [r4, #0xc] - movs r0, #0x3c - strb r0, [r4, #0xe] - ldrb r1, [r4, #0x18] - subs r0, #0x40 - ands r0, r1 - strb r0, [r4, #0x18] - adds r0, r4, #0 - bl sub_0809E96C - adds r0, r4, #0 - bl sub_0809E918 -_0809E8E8: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0809E8EC -sub_0809E8EC: @ 0x0809E8EC - push {lr} - adds r1, r0, #0 - ldrb r0, [r1, #0xe] - subs r0, #1 - strb r0, [r1, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0809E916 - adds r0, r1, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl SetFlag - movs r0, #0 - bl sub_08078A90 - movs r0, #0x73 - bl PlaySFX - bl DeleteThisEntity -_0809E916: - pop {pc} - - thumb_func_start sub_0809E918 -sub_0809E918: @ 0x0809E918 - push {r4, r5, r6, lr} - adds r5, r0, #0 - ldr r4, _0809E964 @ =gUnk_08124364 - movs r1, #0 - ldrsh r0, [r4, r1] - ldr r1, _0809E968 @ =0xFFFFFC18 - cmp r0, r1 - beq _0809E962 - adds r6, r1, #0 -_0809E92A: - adds r0, r5, #0 - movs r1, #3 - movs r2, #0 - bl CreateFx - adds r2, r0, #0 - cmp r2, #0 - beq _0809E958 - ldrh r0, [r4] - ldrh r1, [r2, #0x2e] - adds r0, r0, r1 - strh r0, [r2, #0x2e] - ldrh r0, [r4, #2] - ldrh r1, [r2, #0x32] - adds r0, r0, r1 - strh r0, [r2, #0x32] - adds r1, r2, #0 - adds r1, #0x38 - movs r0, #2 - strb r0, [r1] - adds r0, r2, #0 - bl UpdateSpriteOrderAndFlip -_0809E958: - adds r4, #4 - movs r1, #0 - ldrsh r0, [r4, r1] - cmp r0, r6 - bne _0809E92A -_0809E962: - pop {r4, r5, r6, pc} - .align 2, 0 -_0809E964: .4byte gUnk_08124364 -_0809E968: .4byte 0xFFFFFC18 - - thumb_func_start sub_0809E96C -sub_0809E96C: @ 0x0809E96C - push {r4, r5, lr} - adds r4, r0, #0 - movs r1, #0x2e - ldrsh r0, [r4, r1] - ldr r2, _0809E99C @ =gRoomControls - ldrh r1, [r2, #6] - adds r1, #0x20 - subs r0, r0, r1 - asrs r0, r0, #4 - movs r3, #0x3f - ands r0, r3 - movs r5, #0x32 - ldrsh r1, [r4, r5] - ldrh r2, [r2, #8] - adds r2, #8 - subs r1, r1, r2 - asrs r1, r1, #4 - ands r1, r3 - lsls r1, r1, #6 - orrs r0, r1 - bl sub_08018C1C - pop {r4, r5, pc} - .align 2, 0 -_0809E99C: .4byte gRoomControls - thumb_func_start sub_0809E9A0 sub_0809E9A0: @ 0x0809E9A0 push {r4, r5, r6, lr} diff --git a/include/entity.h b/include/entity.h index a1dc11dd..afa1cc24 100644 --- a/include/entity.h +++ b/include/entity.h @@ -157,6 +157,10 @@ typedef struct Entity { ((((entity->x.HALF.HI - gRoomControls.roomOriginX) >> 4) & 0x3fU) | \ (((entity->y.HALF.HI - gRoomControls.roomOriginY) >> 4) & 0x3fU) << 6) +#define COORD_TO_TILE_OFFSET(entity, xOff, yOff) \ + ((((entity->x.HALF.HI - xOff - gRoomControls.roomOriginX) >> 4) & 0x3fU) | \ + (((entity->y.HALF.HI - yOff - gRoomControls.roomOriginY) >> 4) & 0x3fU) << 6) + extern void InitializeAnimation(Entity*, u32); extern void InitAnimationForceUpdate(Entity*, u32); extern void UpdateAnimationSingleFrame(Entity*); @@ -172,4 +176,5 @@ extern Entity* CreateNPC(u32 subtype, u32 form, u32 parameter); extern Entity* CreateObjectWithParent(Entity* parent, u32 subtype, u32 form, u32 parameter); extern Entity* CreateFx(Entity* parent, u32 form, u32 parameter); +extern void DeleteThisEntity(); #endif diff --git a/linker.ld b/linker.ld index 7586253b..4a36d0c4 100644 --- a/linker.ld +++ b/linker.ld @@ -811,6 +811,7 @@ SECTIONS { asm/object99.o(.text); asm/macroAcorn.o(.text); asm/object9B.o(.text); + src/treeHidingPortal.o(.text); asm/treeHidingPortal.o(.text); src/lightableSwitch.o(.text); asm/object9E.o(.text); diff --git a/src/treeHidingPortal.c b/src/treeHidingPortal.c new file mode 100644 index 00000000..39bc2128 --- /dev/null +++ b/src/treeHidingPortal.c @@ -0,0 +1,88 @@ +#include "global.h" +#include "entity.h" +#include "flags.h" +#include "link.h" +#include "room.h" + +extern void sub_0809E96C(Entity*); +extern u32 sub_0800419C(Entity*, Entity*, u32, u32); +extern void sub_080A2B80(Entity*); +extern u32 sub_0809E9A0(void); +extern void sub_08078A90(u32); +extern void sub_0809E918(Entity*); +extern void PlaySFX(u32); +extern void CreateMinishEntrance(u32 tile); + +extern void (*const gUnk_08124354[])(Entity*); + +extern u32 gUnk_030010A0; +extern s16 gUnk_08124364[]; + +void TreeHidingPortal(Entity* this) { + gUnk_08124354[this->action](this); +} + +void sub_0809E83C(Entity* this) { + if (CheckFlags(this->field_0x86)) { + sub_0809E96C(this); + DeleteThisEntity(); + } + this->action = 1; + this->collisionLayer = 2; + UpdateSpriteOrderAndFlip(this); +} + +void sub_0809E86C(Entity* this) { + + if (sub_0800419C(this, &gLinkEntity, 0x30, 0x30)) { + if (CheckGlobalFlag(0x14)) { + if (((gUnk_030010A0 & 3) == 0)) { + sub_080A2B80(this); + } + } + } + if (sub_0809E9A0() == 0x54) { + this->action = 2; + this->actionDelay = 0xf; + sub_08078A90(1); + } +} + +void sub_0809E8BC(Entity* this) { + if (--this->actionDelay == 0) { + this->action = 3; + this->actionDelay = 0x3c; + this->spriteSettings.b.ss0 = 0; + sub_0809E96C(this); + sub_0809E918(this); + } +} + +void sub_0809E8EC(Entity* this) { + if (--this->actionDelay == 0) { + SetFlag(this->field_0x86); + sub_08078A90(0); + PlaySFX(0x73); + DeleteThisEntity(); + } +} + +void sub_0809E918(Entity* this) { + Entity* fx; + s16* i = gUnk_08124364; + while (*i != -1000) { + fx = CreateFx(this, 3, 0); + if (fx != NULL) { + fx->x.HALF.HI += i[0]; + fx->y.HALF.HI += i[1]; + fx->collisionLayer = 2; + UpdateSpriteOrderAndFlip(fx); + } + i += sizeof(s16); + } +} + +void sub_0809E96C(Entity *this) +{ + CreateMinishEntrance(COORD_TO_TILE_OFFSET(this, 0x20, 0x8)); +} \ No newline at end of file