From 57eec4def41b5bd3cc3ac791ef4bc26b75125b5d Mon Sep 17 00:00:00 2001 From: theo3 Date: Tue, 26 Oct 2021 23:20:12 -0700 Subject: [PATCH] decompile jar portal --- asm/jarPortal.s | 441 ---------------------------------------- include/functions.h | 1 + linker.ld | 1 + src/enemy/doorMimic.c | 1 - src/manager/manager15.c | 2 - src/manager/manager1A.c | 1 - src/manager/manager3.c | 2 +- src/npc/bigGoron.c | 1 - src/object/jarPortal.c | 181 +++++++++++++++++ 9 files changed, 184 insertions(+), 447 deletions(-) create mode 100644 src/object/jarPortal.c diff --git a/asm/jarPortal.s b/asm/jarPortal.s index 8b057fc8..a42aa8ad 100644 --- a/asm/jarPortal.s +++ b/asm/jarPortal.s @@ -6,444 +6,3 @@ .text - - thumb_func_start JarPortal -JarPortal: @ 0x0808BE84 - push {lr} - ldr r2, _0808BE98 @ =gUnk_08121488 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0808BE98: .4byte gUnk_08121488 - - thumb_func_start sub_0808BE9C -sub_0808BE9C: @ 0x0808BE9C - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r1, [r4, #0x10] - movs r0, #0x80 - movs r2, #0 - orrs r0, r1 - strb r0, [r4, #0x10] - adds r0, r4, #0 - adds r0, #0x3f - movs r5, #1 - strb r5, [r0] - adds r1, r4, #0 - adds r1, #0x3c - movs r0, #0x47 - strb r0, [r1] - adds r1, #4 - movs r0, #0x44 - strb r0, [r1] - subs r1, #5 - movs r0, #0x80 - strb r0, [r1] - adds r0, r4, #0 - adds r0, #0x68 - strb r2, [r0] - ldrb r0, [r4, #0xa] - bl CheckLocalFlag - cmp r0, #0 - beq _0808BEEE - adds r0, r4, #0 - adds r0, #0x7c - ldrb r0, [r0] - cmp r0, #0 - bne _0808BEF8 - movs r0, #3 - strb r0, [r4, #0xc] - adds r0, r4, #0 - movs r1, #1 - bl InitAnimationForceUpdate - b _0808BF10 -_0808BEEE: - adds r0, r4, #0 - adds r0, #0x7c - ldrb r0, [r0] - cmp r0, #0 - bne _0808BF04 -_0808BEF8: - strb r5, [r4, #0xc] - adds r0, r4, #0 - movs r1, #0 - bl InitAnimationForceUpdate - b _0808BF10 -_0808BF04: - movs r0, #3 - strb r0, [r4, #0xc] - adds r0, r4, #0 - movs r1, #1 - bl InitAnimationForceUpdate -_0808BF10: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_0808BF14 -sub_0808BF14: @ 0x0808BF14 - push {r4, lr} - adds r4, r0, #0 - bl sub_0808C128 - cmp r0, #0 - beq _0808BF4C - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] - adds r0, r4, #0 - bl sub_0808C13C - adds r0, r4, #0 - adds r0, #0x7c - ldrb r0, [r0] - cmp r0, #0 - bne _0808BF3E - ldrb r0, [r4, #0xa] - bl SetLocalFlag - b _0808BF44 -_0808BF3E: - ldrb r0, [r4, #0xa] - bl ClearLocalFlag -_0808BF44: - adds r0, r4, #0 - movs r1, #0 - bl sub_0808C148 -_0808BF4C: - adds r0, r4, #0 - movs r1, #0 - bl sub_0808C01C - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0808BF58 -sub_0808BF58: @ 0x0808BF58 - push {r4, lr} - adds r4, r0, #0 - movs r1, #0x80 - lsls r1, r1, #6 - bl sub_08003FC4 - ldrb r0, [r4, #0xd] - cmp r0, #1 - beq _0808BF94 - cmp r0, #1 - bgt _0808BF74 - cmp r0, #0 - beq _0808BF7A - b _0808BFD6 -_0808BF74: - cmp r0, #2 - beq _0808BFB0 - b _0808BFD6 -_0808BF7A: - ldr r1, [r4, #0x20] - ldr r0, _0808BF90 @ =0x00017FFF - cmp r1, r0 - bgt _0808BFD6 - movs r0, #1 - strb r0, [r4, #0xd] - adds r0, r4, #0 - movs r1, #2 - bl InitAnimationForceUpdate - b _0808BFD6 - .align 2, 0 -_0808BF90: .4byte 0x00017FFF -_0808BF94: - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - movs r1, #0x36 - ldrsh r0, [r4, r1] - cmp r0, #0 - bne _0808BFD6 - ldrb r0, [r4, #0xd] - adds r0, #1 - strb r0, [r4, #0xd] - movs r0, #0x80 - lsls r0, r0, #8 - str r0, [r4, #0x20] - b _0808BFD6 -_0808BFB0: - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - movs r0, #0x36 - ldrsh r1, [r4, r0] - cmp r1, #0 - bne _0808BFD6 - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] - strb r1, [r4, #0xf] - adds r0, r4, #0 - movs r1, #1 - bl InitAnimationForceUpdate - adds r0, r4, #0 - movs r1, #1 - bl sub_0808C148 -_0808BFD6: - pop {r4, pc} - - thumb_func_start sub_0808BFD8 -sub_0808BFD8: @ 0x0808BFD8 - push {r4, lr} - adds r4, r0, #0 - bl sub_0808C128 - cmp r0, #0 - beq _0808C010 - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] - adds r0, r4, #0 - bl sub_0808C13C - adds r0, r4, #0 - adds r0, #0x7c - ldrb r0, [r0] - cmp r0, #0 - bne _0808C002 - ldrb r0, [r4, #0xa] - bl ClearLocalFlag - b _0808C008 -_0808C002: - ldrb r0, [r4, #0xa] - bl SetLocalFlag -_0808C008: - adds r0, r4, #0 - movs r1, #0 - bl sub_0808C148 -_0808C010: - adds r0, r4, #0 - movs r1, #1 - bl sub_0808C01C - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0808C01C -sub_0808C01C: @ 0x0808C01C - push {r4, r5, r6, lr} - adds r4, r0, #0 - adds r5, r1, #0 - movs r1, #0x2e - ldrsh r0, [r4, r1] - subs r0, #0x18 - movs r2, #0x32 - ldrsh r1, [r4, r2] - subs r1, #0x18 - movs r2, #0x30 - movs r3, #0x30 - bl CheckPlayerProximity - cmp r0, #0 - beq _0808C0A6 - ldr r2, _0808C06C @ =gArea - ldrh r0, [r4, #0x2e] - strh r0, [r2, #0x12] - ldrh r0, [r4, #0x32] - strh r0, [r2, #0x14] - movs r6, #2 - strb r6, [r2, #0x16] - movs r0, #4 - cmp r5, #0 - beq _0808C050 - movs r0, #2 -_0808C050: - strb r0, [r2, #0x17] - cmp r5, #1 - bne _0808C0A6 - ldr r3, _0808C070 @ =gPlayerState - ldr r0, [r3, #0x30] - movs r1, #0x20 - ands r0, r1 - cmp r0, #0 - beq _0808C074 - ldrb r0, [r3, #2] - cmp r0, #0 - bne _0808C074 - strb r6, [r2, #0x18] - b _0808C082 - .align 2, 0 -_0808C06C: .4byte gArea -_0808C070: .4byte gPlayerState -_0808C074: - bl sub_08057810 - cmp r0, #0 - beq _0808C082 - ldr r1, _0808C0A8 @ =gArea - movs r0, #3 - strb r0, [r1, #0x18] -_0808C082: - movs r1, #0x2e - ldrsh r0, [r4, r1] - movs r2, #0x32 - ldrsh r1, [r4, r2] - adds r2, r4, #0 - adds r2, #0x38 - ldrb r2, [r2] - bl sub_080577AC - ldrb r0, [r4, #0xf] - cmp r0, #0 - bne _0808C0A6 - movs r0, #1 - strb r0, [r4, #0xf] - movs r0, #0xa9 - lsls r0, r0, #1 - bl SoundReq -_0808C0A6: - pop {r4, r5, r6, pc} - .align 2, 0 -_0808C0A8: .4byte gArea - - thumb_func_start sub_0808C0AC -sub_0808C0AC: @ 0x0808C0AC - push {r4, lr} - adds r4, r0, #0 - movs r1, #0x80 - lsls r1, r1, #6 - bl sub_08003FC4 - ldrb r0, [r4, #0xd] - cmp r0, #1 - beq _0808C0E8 - cmp r0, #1 - bgt _0808C0C8 - cmp r0, #0 - beq _0808C0CE - b _0808C126 -_0808C0C8: - cmp r0, #2 - beq _0808C104 - b _0808C126 -_0808C0CE: - ldr r1, [r4, #0x20] - ldr r0, _0808C0E4 @ =0x00017FFF - cmp r1, r0 - bgt _0808C126 - movs r0, #1 - strb r0, [r4, #0xd] - adds r0, r4, #0 - movs r1, #3 - bl InitAnimationForceUpdate - b _0808C126 - .align 2, 0 -_0808C0E4: .4byte 0x00017FFF -_0808C0E8: - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - movs r1, #0x36 - ldrsh r0, [r4, r1] - cmp r0, #0 - bne _0808C126 - ldrb r0, [r4, #0xd] - adds r0, #1 - strb r0, [r4, #0xd] - movs r0, #0x80 - lsls r0, r0, #8 - str r0, [r4, #0x20] - b _0808C126 -_0808C104: - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - movs r1, #0x36 - ldrsh r0, [r4, r1] - cmp r0, #0 - bne _0808C126 - movs r0, #1 - strb r0, [r4, #0xc] - adds r0, r4, #0 - movs r1, #0 - bl InitAnimationForceUpdate - adds r0, r4, #0 - movs r1, #1 - bl sub_0808C148 -_0808C126: - pop {r4, pc} - - thumb_func_start sub_0808C128 -sub_0808C128: @ 0x0808C128 - push {lr} - movs r1, #0 - adds r0, #0x41 - ldrb r0, [r0] - cmp r0, #0x9d - bne _0808C136 - movs r1, #1 -_0808C136: - adds r0, r1, #0 - pop {pc} - .align 2, 0 - - thumb_func_start sub_0808C13C -sub_0808C13C: @ 0x0808C13C - movs r1, #0 - strb r1, [r0, #0xd] - movs r1, #0xa0 - lsls r1, r1, #0xa - str r1, [r0, #0x20] - bx lr - - thumb_func_start sub_0808C148 -sub_0808C148: @ 0x0808C148 - push {r4, r5, r6, lr} - adds r6, r0, #0 - movs r2, #0x2e - ldrsh r0, [r6, r2] - ldr r4, _0808C1A4 @ =gRoomControls - ldrh r2, [r4, #6] - subs r0, r0, r2 - asrs r5, r0, #4 - movs r3, #0x3f - ands r5, r3 - movs r2, #0x32 - ldrsh r0, [r6, r2] - ldrh r2, [r4, #8] - subs r0, r0, r2 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r5, r0 - cmp r1, #0 - bne _0808C1B8 - ldr r0, _0808C1A8 @ =0x00004092 - subs r1, r5, #1 - adds r4, r6, #0 - adds r4, #0x38 - ldrb r2, [r4] - bl SetTile - ldr r0, _0808C1AC @ =0x00004093 - ldrb r2, [r4] - adds r1, r5, #0 - bl SetTile - ldr r0, _0808C1B0 @ =0x00004094 - adds r1, r5, #0 - adds r1, #0x3f - ldrb r2, [r4] - bl SetTile - ldr r0, _0808C1B4 @ =0x00004095 - adds r1, r5, #0 - adds r1, #0x40 - ldrb r2, [r4] - bl SetTile - b _0808C1E0 - .align 2, 0 -_0808C1A4: .4byte gRoomControls -_0808C1A8: .4byte 0x00004092 -_0808C1AC: .4byte 0x00004093 -_0808C1B0: .4byte 0x00004094 -_0808C1B4: .4byte 0x00004095 -_0808C1B8: - subs r0, r5, #1 - adds r4, r6, #0 - adds r4, #0x38 - ldrb r1, [r4] - bl sub_0807BA8C - ldrb r1, [r4] - adds r0, r5, #0 - bl sub_0807BA8C - adds r0, r5, #0 - adds r0, #0x3f - ldrb r1, [r4] - bl sub_0807BA8C - adds r0, r5, #0 - adds r0, #0x40 - ldrb r1, [r4] - bl sub_0807BA8C -_0808C1E0: - pop {r4, r5, r6, pc} - .align 2, 0 diff --git a/include/functions.h b/include/functions.h index ad271fa5..662227a4 100644 --- a/include/functions.h +++ b/include/functions.h @@ -58,6 +58,7 @@ extern void DoExitTransition(ScreenTransitionData*); extern void CreateDustAt(u32, u32, u32); extern void PutItemOnSlot(u32 itemID); extern void CreateSpeechBubbleSleep(Entity*, u32, u32); +extern u32 CheckPlayerProximity(u32, u32, u32, u32); // Unidentified extern u32 sub_0806ED78(Entity*); diff --git a/linker.ld b/linker.ld index b1030355..32157850 100644 --- a/linker.ld +++ b/linker.ld @@ -761,6 +761,7 @@ SECTIONS { asm/object35.o(.text); asm/object36.o(.text); asm/object37.o(.text); + src/object/jarPortal.o(.text); asm/jarPortal.o(.text); asm/bossDoor.o(.text); asm/object3A.o(.text); diff --git a/src/enemy/doorMimic.c b/src/enemy/doorMimic.c index ff59c26d..c3fd44ee 100644 --- a/src/enemy/doorMimic.c +++ b/src/enemy/doorMimic.c @@ -5,7 +5,6 @@ extern s16 sub_080001DA(u32, u32); // ? extern void sub_08049CF4(); -extern u32 CheckPlayerProximity(u32, u32, u32, u32); void sub_080221C0(); typedef struct { diff --git a/src/manager/manager15.c b/src/manager/manager15.c index 24b214b5..b0ce0828 100644 --- a/src/manager/manager15.c +++ b/src/manager/manager15.c @@ -253,8 +253,6 @@ void sub_0805A664(Manager15* this) { sub_0805A68C(this); } -extern u32 CheckPlayerProximity(u32, u32, u32, u32); - void sub_0805A68C(Manager15* this) { if (CheckPlayerProximity(this->unk_38 - 0x18, this->unk_3a - 0x18, 0x30, 0x30)) { if (this->unk_2c <= 0x1007) { diff --git a/src/manager/manager1A.c b/src/manager/manager1A.c index 2b4027a2..c006ddaf 100644 --- a/src/manager/manager1A.c +++ b/src/manager/manager1A.c @@ -32,7 +32,6 @@ void Manager1A_Main(Manager1A* this) { } extern void sub_08052D74(void*, void*, void*); -extern u32 CheckPlayerProximity(u32, u32, u32, u32); typedef struct struct_08108764 { u8 unk_00; diff --git a/src/manager/manager3.c b/src/manager/manager3.c index 5652ad89..272baabc 100644 --- a/src/manager/manager3.c +++ b/src/manager/manager3.c @@ -7,6 +7,7 @@ #include "random.h" #include "audio.h" #include "object.h" +#include "functions.h" // Facilitates the usage of minish portals. @@ -25,7 +26,6 @@ typedef struct { } Manager3; extern s8 gUnk_08107C6C[]; -extern u32 CheckPlayerProximity(u32, u32, u32, u32); extern u32 sub_08057810(void); extern u32 sub_080002C0(u16, u16, u8); extern void sub_080577AC(u32, u32, u32); diff --git a/src/npc/bigGoron.c b/src/npc/bigGoron.c index 611f6b24..34a336ff 100644 --- a/src/npc/bigGoron.c +++ b/src/npc/bigGoron.c @@ -34,7 +34,6 @@ extern Hitbox gUnk_080FD180; Entity* sub_0806D00C(Entity* this); void sub_0806D4C0(Entity*, u32); -extern u32 CheckPlayerProximity(u32, u32, u32, u32); void BigGoron(Entity* this) { gUnk_081140D4[this->type](this); diff --git a/src/object/jarPortal.c b/src/object/jarPortal.c new file mode 100644 index 00000000..b625bb1b --- /dev/null +++ b/src/object/jarPortal.c @@ -0,0 +1,181 @@ +#include "global.h" +#include "entity.h" +#include "flags.h" +#include "functions.h" +#include "area.h" +#include "audio.h" + +extern void (*gUnk_08121488[])(Entity*); + +extern u32 sub_08057810(void); +extern void sub_080577AC(u32, u32, u32); + +u32 sub_0808C128(Entity*); +void sub_0808C13C(Entity*); +void sub_0808C148(Entity*, u32); +void sub_0808C01C(Entity*, u32); + +void JarPortal(Entity* this) { + gUnk_08121488[this->action](this); +} + +void sub_0808BE9C(Entity* this) { + this->flags |= 0x80; + this->damageType = 1; + this->field_0x3c = 0x47; + this->field_0x40 = 0x44; + this->flags2 = 0x80; + this->field_0x68.HALF.LO = 0; + if (CheckLocalFlag(this->type)) { + if (this->field_0x7c.BYTES.byte0 != 0) { + this->action = 1; + InitAnimationForceUpdate(this, 0); + } else { + this->action = 3; + InitAnimationForceUpdate(this, 1); + } + } else { + if (this->field_0x7c.BYTES.byte0 == 0) { + this->action = 1; + InitAnimationForceUpdate(this, 0); + } else { + this->action = 3; + InitAnimationForceUpdate(this, 1); + } + } +} + +void sub_0808BF14(Entity* this) { + if (sub_0808C128(this)) { + this->action++; + sub_0808C13C(this); + if (this->field_0x7c.BYTES.byte0 == 0) { + SetLocalFlag(this->type); + } else { + ClearLocalFlag(this->type); + } + sub_0808C148(this, 0); + } + sub_0808C01C(this, 0); +} + +void sub_0808BF58(Entity* this) { + sub_08003FC4(this, 0x2000); + switch (this->subAction) { + case 0: + if (this->field_0x20 <= 98303) { + ++this->subAction; + InitAnimationForceUpdate(this, 2); + } + break; + case 1: + UpdateAnimationSingleFrame(this); + if (!this->height.HALF.HI) { + ++this->subAction; + this->field_0x20 = 0x8000; + } + break; + case 2: + UpdateAnimationSingleFrame(this); + if (!this->height.HALF.HI) { + ++this->action; + this->field_0xf = 0; + InitAnimationForceUpdate(this, 1); + sub_0808C148(this, 1); + } + break; + } +} + +void sub_0808BFD8(Entity* this) { + if (sub_0808C128(this)) { + ++this->action; + sub_0808C13C(this); + if (!this->field_0x7c.BYTES.byte0) + ClearLocalFlag(this->type); + else + SetLocalFlag(this->type); + sub_0808C148(this, 0); + } + sub_0808C01C(this, 1); +} + +void sub_0808C01C(Entity* this, u32 r1) { + if (CheckPlayerProximity(this->x.HALF.HI - 0x18, this->y.HALF.HI - 0x18, 0x30, 0x30)) { + u32 type; + gArea.curPortalX = this->x.HALF.HI; + gArea.curPortalY = this->y.HALF.HI; + gArea.curPortalExitDirection = 2; + type = 4; + if (r1 != 0) + type = 2; + gArea.curPortalType = type; + if (r1 == 1) { + if (((gPlayerState.flags.all & 0x20) != 0) && (gPlayerState.jumpStatus == 0)) { + gArea.field_0x18 = 2; + } else { + if (sub_08057810() != 0) { + gArea.field_0x18 = 3; + } + } + sub_080577AC(this->x.HALF.HI, this->y.HALF.HI, this->collisionLayer); + if (this->field_0xf == 0) { + this->field_0xf = 1; + SoundReq(0x152); + } + } + } +} + +void sub_0808C0AC(Entity* this) { + sub_08003FC4(this, 0x2000); + switch (this->subAction) { + case 0: + if (this->field_0x20 <= 98303) { + this->subAction = 1; + InitAnimationForceUpdate(this, 3); + } + break; + case 1: + UpdateAnimationSingleFrame(this); + if (!this->height.HALF.HI) { + ++this->subAction; + this->field_0x20 = 0x8000; + } + break; + case 2: + UpdateAnimationSingleFrame(this); + if (!this->height.HALF.HI) { + this->action = 1; + InitAnimationForceUpdate(this, 0); + sub_0808C148(this, 1); + } + break; + } +} + +u32 sub_0808C128(Entity* this) { + return this->bitfield == 157; +} + +void sub_0808C13C(Entity* this) { + this->subAction = 0; + this->field_0x20 = 163840; +} + +void sub_0808C148(Entity* this, u32 a2) { + u32 pos; + + pos = COORD_TO_TILE(this); + if (!a2) { + SetTile(16530, pos - 1, this->collisionLayer); + SetTile(16531, pos, this->collisionLayer); + SetTile(16532, pos + 63, this->collisionLayer); + SetTile(16533, pos + 64, this->collisionLayer); + } else { + sub_0807BA8C(pos - 1, this->collisionLayer); + sub_0807BA8C(pos, this->collisionLayer); + sub_0807BA8C(pos + 63, this->collisionLayer); + sub_0807BA8C(pos + 64, this->collisionLayer); + } +}