From bcfae17450cb30ed57ec1a65f5170679b6bc7620 Mon Sep 17 00:00:00 2001 From: Ibot02 Date: Fri, 21 Aug 2020 18:59:11 +0200 Subject: [PATCH] Manager3.c: ok --- asm/manager3.s | 216 ----------------------------------------- include/area.h | 9 +- include/manager.h | 3 +- include/player.h | 6 +- linker.ld | 2 +- src/code_0804AA84.c | 4 +- src/item.c | 4 +- src/manager/manager3.c | 102 +++++++++++++++++++ src/manager/managerA.c | 2 +- src/sub_08070680.c | 4 +- 10 files changed, 123 insertions(+), 229 deletions(-) delete mode 100644 asm/manager3.s create mode 100644 src/manager/manager3.c diff --git a/asm/manager3.s b/asm/manager3.s deleted file mode 100644 index 7bd5a45c..00000000 --- a/asm/manager3.s +++ /dev/null @@ -1,216 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_080576C0 -sub_080576C0: @ 0x080576C0 - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _080576EC - movs r0, #1 - strb r0, [r4, #0xc] - ldrh r0, [r4, #0x38] - ldr r2, _080576E8 @ =gRoomControls - ldrh r1, [r2, #6] - adds r0, r0, r1 - subs r0, #0x20 - str r0, [r4, #0x20] - ldrh r0, [r4, #0x3a] - ldrh r1, [r2, #8] - adds r0, r0, r1 - subs r0, #0x20 - str r0, [r4, #0x24] - b _080577AA - .align 2, 0 -_080576E8: .4byte gRoomControls -_080576EC: - ldr r0, [r4, #0x20] - ldr r1, [r4, #0x24] - movs r2, #0x40 - movs r3, #0x40 - bl sub_0806FBFC - cmp r0, #0 - beq _080577A8 - ldr r5, _08057738 @ =gArea - ldr r0, [r4, #0x20] - adds r0, #0x20 - strh r0, [r5, #0x12] - ldr r1, [r4, #0x24] - ldr r2, _0805773C @ =gUnk_08107C6C - ldrb r0, [r4, #0xa] - adds r0, r0, r2 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - adds r0, #0x20 - adds r1, r1, r0 - strh r1, [r5, #0x14] - adds r0, r4, #0 - adds r0, #0x34 - ldrb r0, [r0] - strb r0, [r5, #0x16] - ldrb r0, [r4, #0xa] - strb r0, [r5, #0x17] - movs r0, #0x14 - bl CheckGlobalFlag - cmp r0, #0 - bne _08057740 - movs r0, #1 - strb r0, [r5, #0x18] - movs r0, #5 - strb r0, [r5, #0x17] - b _080577AA - .align 2, 0 -_08057738: .4byte gArea -_0805773C: .4byte gUnk_08107C6C -_08057740: - ldr r2, _08057758 @ =gPlayerState - ldr r0, [r2, #0x30] - movs r1, #0x20 - ands r0, r1 - cmp r0, #0 - beq _0805775C - ldrb r0, [r2, #2] - cmp r0, #0 - bne _0805775C - movs r0, #2 - strb r0, [r5, #0x18] - b _0805776A - .align 2, 0 -_08057758: .4byte gPlayerState -_0805775C: - bl sub_08057810 - cmp r0, #0 - beq _0805776A - ldr r1, _080577A0 @ =gArea - movs r0, #3 - strb r0, [r1, #0x18] -_0805776A: - ldrh r0, [r4, #0x38] - ldrh r1, [r4, #0x3a] - ldrb r2, [r4, #0xe] - bl sub_080002C0 - cmp r0, #0x3d - bne _080577AA - ldrh r0, [r4, #0x38] - ldr r2, _080577A4 @ =gRoomControls - ldrh r1, [r2, #6] - adds r0, r0, r1 - ldrh r1, [r4, #0x3a] - ldrh r2, [r2, #8] - adds r1, r1, r2 - ldrb r2, [r4, #0xe] - bl sub_080577AC - ldrb r0, [r4, #0xf] - cmp r0, #0 - bne _080577AA - movs r0, #1 - strb r0, [r4, #0xf] - movs r0, #0xa9 - lsls r0, r0, #1 - bl PlaySFX - b _080577AA - .align 2, 0 -_080577A0: .4byte gArea -_080577A4: .4byte gRoomControls -_080577A8: - strb r0, [r4, #0xf] -_080577AA: - pop {r4, r5, pc} - - thumb_func_start sub_080577AC -sub_080577AC: @ 0x080577AC - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r6, r0, #0 - adds r7, r1, #0 - mov r8, r2 - bl Random - adds r5, r0, #0 - movs r0, #7 - ands r0, r5 - cmp r0, #0 - bne _08057808 - movs r0, #0xf - movs r1, #0x26 - movs r2, #0 - bl CreateObject - adds r4, r0, #0 - cmp r4, #0 - beq _08057808 - lsrs r3, r5, #8 - movs r0, #0xf - ands r3, r0 - lsrs r2, r5, #0x10 - ands r2, r0 - cmp r2, #4 - ble _080577E6 - rsbs r2, r2, #0 -_080577E6: - lsrs r0, r5, #0x18 - movs r1, #1 - ands r0, r1 - cmp r0, #0 - beq _080577F2 - rsbs r3, r3, #0 -_080577F2: - adds r0, r6, r3 - strh r0, [r4, #0x2e] - adds r0, r7, r2 - strh r0, [r4, #0x32] - adds r0, r4, #0 - adds r0, #0x38 - mov r1, r8 - strb r1, [r0] - adds r0, r4, #0 - bl UpdateSpriteForCollisionLayer -_08057808: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 - - thumb_func_start sub_08057810 -sub_08057810: @ 0x08057810 - push {lr} - ldr r2, _08057848 @ =gPlayerState - ldr r0, [r2, #0x30] - movs r1, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08057850 - adds r0, r2, #0 - adds r0, #0xaa - ldrb r0, [r0] - cmp r0, #0 - bne _08057850 - ldr r0, _0805784C @ =gArea - ldrb r0, [r0, #0x17] - cmp r0, #6 - beq _08057850 - ldrb r0, [r2, #5] - cmp r0, #0 - bne _08057850 - adds r0, r2, #0 - adds r0, #0xa8 - ldrb r0, [r0] - cmp r0, #1 - bgt _08057850 - cmp r0, #0 - blt _08057850 - movs r0, #1 - b _08057852 - .align 2, 0 -_08057848: .4byte gPlayerState -_0805784C: .4byte gArea -_08057850: - movs r0, #0 -_08057852: - pop {pc} diff --git a/include/area.h b/include/area.h index e705944d..a683cb2a 100644 --- a/include/area.h +++ b/include/area.h @@ -11,7 +11,12 @@ typedef struct { u16 localFlagOffset; u8 filler[10]; u16 field_0x10; - u8 filler3[7]; + u16 field_0x12; + u16 field_0x14; + u8 field_0x16; + u8 field_0x17; + u8 field_0x18; + //u8 filler3[7]; u8 fadeOut; u8 filler2[14]; u8 filler4[0x835]; @@ -25,4 +30,4 @@ typedef struct { extern Area gArea; -#endif \ No newline at end of file +#endif diff --git a/include/manager.h b/include/manager.h index c2646dfb..bd97c1c3 100644 --- a/include/manager.h +++ b/include/manager.h @@ -21,7 +21,8 @@ typedef struct Manager { /*0x0c*/ u8 action; /*0x0d*/ u8 unk_0d; /*0x0e*/ u8 unk_0e; - /*0x0f*/ u8 unk_0f[0x5]; + /*0x0f*/ u8 unk_0f; + /*0x10*/ u8 unk_10[0x4]; /*0x14*/ struct Manager * parent; /*0x18*/ u8 unk_18[0x8]; // union SplitHWord unk_20; diff --git a/include/player.h b/include/player.h index 1abc8491..c3b69e43 100644 --- a/include/player.h +++ b/include/player.h @@ -57,7 +57,9 @@ typedef struct { /*0x8c*/ u32 field_0x8c; /*0x90*/ union SplitWord field_0x90; /*0x94*/ u32 field_0x94[5]; - /*0xa8*/ u8 field_0xa8[3]; + /*0xa8*/ u8 field_0xa8; + /*0xa9*/ u8 field_0xa9; + /*0xaa*/ u8 field_0xaa; /*0xab*/ u8 field_0xab; /*0xac*/ u32 field_0xac; } PlayerState; @@ -108,4 +110,4 @@ extern s32 ModHealth(s32); extern void ModRupees(s32); #endif -// clang-format on \ No newline at end of file +// clang-format on diff --git a/linker.ld b/linker.ld index 949a7d89..46227a68 100644 --- a/linker.ld +++ b/linker.ld @@ -474,7 +474,7 @@ SECTIONS { asm/manager1.o(.text); src/manager/manager2.o(.text); asm/manager2.o(.text); - asm/manager3.o(.text); + src/manager/manager3.o(.text); src/manager/manager4.o(.text); asm/manager5.o(.text); src/manager/manager6.o(.text); diff --git a/src/code_0804AA84.c b/src/code_0804AA84.c index 27e6bf1d..d3eff465 100644 --- a/src/code_0804AA84.c +++ b/src/code_0804AA84.c @@ -45,7 +45,7 @@ void sub_0804AAD4(void) _DmaZero((void *)&gUnk_02018EB0, 0x28); gUnk_02018EB0.unk = 0; EraseAllEntities(); - CreateObject(0x3d, gArea.filler3[5], 0); + CreateObject(0x3d, gArea.field_0x17, 0); gArea.filler[8]++; } @@ -73,4 +73,4 @@ void sub_0804AB24(void) void sub_0804AB54(void) { gUnk_080D412C[gArea.filler[8]](); -} \ No newline at end of file +} diff --git a/src/item.c b/src/item.c index 8d3e0f72..52b94c07 100644 --- a/src/item.c +++ b/src/item.c @@ -155,6 +155,6 @@ void sub_08076D94(ItemBehavior *beh, u32 arg1) void GustJar(ItemBehavior *beh, u32 arg1) { - gPlayerState.field_0xa8[0] = 3; + gPlayerState.field_0xa8 = 3; gUnk_0811BDF4[beh->stateID](beh, arg1); -} \ No newline at end of file +} diff --git a/src/manager/manager3.c b/src/manager/manager3.c new file mode 100644 index 00000000..d22dbb25 --- /dev/null +++ b/src/manager/manager3.c @@ -0,0 +1,102 @@ +#include "global.h" +#include "manager.h" +#include "flags.h" +#include "area.h" +#include "room.h" +#include "player.h" +#include "functions.h" + +typedef struct { + Manager manager; + u32 unk_20; + u32 unk_24; + u8 unk_28[0xC]; + u8 unk_34; + u8 unk_35; + u16 unk_36; + u16 unk_38; + u16 unk_3a; + u16 unk_3c; + u16 unk_3e; +} Manager3; + +extern s8 gUnk_08107C6C[]; +extern u32 sub_0806FBFC(u32, u32, u32, u32); +extern u32 sub_08057810(void); +extern u32 sub_080002C0(u16, u16, u8); +extern void sub_080577AC(u32, u32, u32); + +void sub_080576C0(Manager3* this) { + s8 tmp; + if (this->manager.action == 0) { + this->manager.action = 1; + this->unk_20 = this->unk_38 + gRoomControls.roomOriginX - 0x20; + this->unk_24 = this->unk_3a + gRoomControls.roomOriginY - 0x20; + return; + } + if (sub_0806FBFC(this->unk_20, this->unk_24, 0x40, 0x40)) { + gArea.field_0x12 = this->unk_20 + 0x20; + gArea.field_0x14 = this->unk_24 + 0x20 + gUnk_08107C6C[this->manager.unk_0a]; + gArea.field_0x16 = this->unk_34; + gArea.field_0x17 = this->manager.unk_0a; + if (!CheckGlobalFlag(EZERO_1ST)) { + gArea.field_0x18 = 1; + gArea.field_0x17 = 5; + } else { + if ((gPlayerState.flags.all & 0x20) && gPlayerState.jumpStatus == 0) { + gArea.field_0x18 = 2; + } else { + if (sub_08057810()) { + gArea.field_0x18 = 3; + } + } + if (sub_080002C0(this->unk_38, this->unk_3a, this->manager.unk_0e) == 0x3d) { + sub_080577AC(this->unk_38 + gRoomControls.roomOriginX, this->unk_3a + gRoomControls.roomOriginY, this->manager.unk_0e); + if (!this->manager.unk_0f) { + this->manager.unk_0f = 1; + PlaySFX(0x152); + } + } + } + + } else { + this->manager.unk_0f = 0; + } + +} + +void sub_080577AC(u32 baseX, u32 baseY, u32 layer) { + u32 r; + int offsetX, offsetY; + Entity* spark; + r = Random(); + if ((r & 0x7) != 0) return; + spark = CreateObject(0xF, 0x26, 0); + if (!spark) return; + offsetX = (r >> 0x8) & 0xF; + offsetY = ((r >> 0x10) & 0xF); + if (offsetY > 0x4) { + offsetY = -offsetY; + } + if ((r >> 0x18) & 0x1) { + offsetX = -offsetX; + } + spark->x.HALF.HI = baseX + offsetX; + spark->y.HALF.HI = baseY + offsetY; + spark->collisionLayer = layer; + UpdateSpriteForCollisionLayer(spark); +} + +u32 sub_08057810(void) { + if ((gPlayerState.flags.all & 0x80) + && !gPlayerState.field_0xaa + && (gArea.field_0x17 != 0x6) + && (gPlayerState.heldObject == 0)) { + switch (gPlayerState.field_0xa8) { + case 0: + case 1: + return 1; + } + } + return 0; +} diff --git a/src/manager/managerA.c b/src/manager/managerA.c index 27e4224b..1fd78227 100644 --- a/src/manager/managerA.c +++ b/src/manager/managerA.c @@ -85,7 +85,7 @@ void sub_08058408(ManagerA* this){ u32 sub_0805848C(ManagerA* this) { - switch (gPlayerState.field_0xa8[0]-5) { + switch (gPlayerState.field_0xa8-5) { case 0: case 2: case 3: diff --git a/src/sub_08070680.c b/src/sub_08070680.c index 566bfd7b..623b992d 100644 --- a/src/sub_08070680.c +++ b/src/sub_08070680.c @@ -51,7 +51,7 @@ void sub_08070698(Entity *this) if (gPlayerState.swimState != 0) { gPlayerState.swimState = 1; sub_08079938(); - gPlayerState.field_0xa8[0] = 7; + gPlayerState.field_0xa8 = 7; sub_0807ACCC(this); ent = FindEntityInListByForm(0x6, 0xf, 0x6, 0xb, 0x0); if (ent != NULL) { @@ -59,4 +59,4 @@ void sub_08070698(Entity *this) } } } -} \ No newline at end of file +}