diff --git a/asm/manager26.s b/asm/manager26.s deleted file mode 100644 index 7e21f1dd..00000000 --- a/asm/manager26.s +++ /dev/null @@ -1,200 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_0805C6B8 -sub_0805C6B8: @ 0x0805C6B8 - push {lr} - ldr r2, _0805C6CC @ =gUnk_08108D04 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0805C6CC: .4byte gUnk_08108D04 - - thumb_func_start sub_0805C6D0 -sub_0805C6D0: @ 0x0805C6D0 - push {r4, r5, r6, r7, lr} - sub sp, #4 - adds r5, r0, #0 - ldrb r0, [r5, #0xa] - bl GetCurrentRoomProperty - adds r4, r0, #0 - cmp r4, #0 - bne _0805C6EA - adds r0, r5, #0 - bl DeleteManager - b _0805C79A -_0805C6EA: - ldr r3, _0805C784 @ =gRoomControls - ldrh r0, [r3, #8] - ldrb r1, [r5, #0xe] - adds r0, r0, r1 - movs r1, #0 - strh r0, [r5, #0x2a] - strb r1, [r5, #0xe] - adds r0, r5, #0 - adds r0, #0x28 - strb r1, [r0] - adds r2, r5, #0 - adds r2, #0x29 - strb r1, [r2] - ldrb r0, [r4] - cmp r0, #0xff - beq _0805C778 - ldrb r0, [r5, #0xe] - cmp r0, #0x1f - bhi _0805C778 - adds r7, r3, #0 - movs r3, #1 - adds r6, r2, #0 -_0805C716: - ldrb r1, [r4, #1] - ldrb r2, [r4, #2] - movs r0, #0x4c - str r3, [sp] - bl CreateObject - adds r2, r0, #0 - ldr r3, [sp] - cmp r2, #0 - beq _0805C762 - ldrb r0, [r4, #3] - strb r0, [r2, #0xe] - ldrh r0, [r4, #4] - ldrh r1, [r7, #6] - adds r0, r0, r1 - strh r0, [r2, #0x2e] - ldrh r0, [r4, #6] - ldrh r1, [r7, #8] - adds r0, r0, r1 - strh r0, [r2, #0x32] - str r5, [r2, #0x50] - adds r0, r2, #0 - adds r0, #0x38 - strb r3, [r0] - ldrb r0, [r5, #0xe] - adds r1, r2, #0 - adds r1, #0x83 - strb r0, [r1] - ldrb r1, [r4] - adds r0, r2, #0 - adds r0, #0x82 - strb r1, [r0] - adds r0, r3, #0 - ldrb r1, [r5, #0xe] - lsls r0, r1 - ldrb r1, [r6] - orrs r0, r1 - strb r0, [r6] -_0805C762: - adds r4, #8 - ldrb r0, [r5, #0xe] - adds r1, r0, #1 - strb r1, [r5, #0xe] - ldrb r0, [r4] - cmp r0, #0xff - beq _0805C778 - lsls r0, r1, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0x1f - bls _0805C716 -_0805C778: - ldrb r0, [r5, #0xb] - cmp r0, #0xff - bne _0805C788 - movs r0, #2 - b _0805C798 - .align 2, 0 -_0805C784: .4byte gRoomControls -_0805C788: - ldrb r0, [r5, #0xb] - bl CheckLocalFlag - cmp r0, #0 - beq _0805C796 - movs r0, #2 - b _0805C798 -_0805C796: - movs r0, #1 -_0805C798: - strb r0, [r5, #0xc] -_0805C79A: - add sp, #4 - pop {r4, r5, r6, r7, pc} - .align 2, 0 - - thumb_func_start sub_0805C7A0 -sub_0805C7A0: @ 0x0805C7A0 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x28 - adds r1, r4, #0 - adds r1, #0x29 - ldrb r0, [r0] - ldrb r1, [r1] - cmp r0, r1 - bne _0805C7BC - movs r0, #2 - strb r0, [r4, #0xc] - ldrb r0, [r4, #0xb] - bl SetLocalFlag -_0805C7BC: - adds r0, r4, #0 - bl sub_0805C7CC - pop {r4, pc} - - thumb_func_start sub_0805C7C4 -sub_0805C7C4: @ 0x0805C7C4 - push {lr} - bl sub_0805C7CC - pop {pc} - - thumb_func_start sub_0805C7CC -sub_0805C7CC: @ 0x0805C7CC - push {lr} - adds r2, r0, #0 - ldr r0, _0805C7F0 @ =gPlayerState - ldr r0, [r0, #0x30] - movs r1, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0805C7FC - ldr r0, _0805C7F4 @ =gPlayerEntity - movs r3, #0x32 - ldrsh r1, [r0, r3] - ldrh r0, [r2, #0x2a] - adds r0, #0x10 - cmp r1, r0 - bge _0805C7F8 - movs r0, #1 - b _0805C816 - .align 2, 0 -_0805C7F0: .4byte gPlayerState -_0805C7F4: .4byte gPlayerEntity -_0805C7F8: - movs r0, #0 - b _0805C816 -_0805C7FC: - ldr r0, _0805C810 @ =gPlayerEntity - movs r3, #0x32 - ldrsh r1, [r0, r3] - ldrh r0, [r2, #0x2a] - adds r0, #0x28 - cmp r1, r0 - bge _0805C814 - movs r0, #3 - b _0805C816 - .align 2, 0 -_0805C810: .4byte gPlayerEntity -_0805C814: - movs r0, #2 -_0805C816: - strb r0, [r2, #0xd] - pop {pc} - .align 2, 0 diff --git a/linker.ld b/linker.ld index 6343716e..346b4f93 100644 --- a/linker.ld +++ b/linker.ld @@ -508,7 +508,7 @@ SECTIONS { asm/manager23.o(.text); asm/manager24.o(.text); asm/manager25.o(.text); - asm/manager26.o(.text); + src/manager/manager26.o(.text); src/manager/manager27.o(.text); src/manager/manager28.o(.text); asm/manager29.o(.text); diff --git a/src/manager/manager26.c b/src/manager/manager26.c new file mode 100644 index 00000000..885f7f03 --- /dev/null +++ b/src/manager/manager26.c @@ -0,0 +1,98 @@ +#include "global.h" +#include "manager.h" +#include "entity.h" +#include "flags.h" +#include "room.h" +#include "functions.h" + +typedef struct { + Manager manager; + u8 unk_20[0x8]; + u8 unk_28; + u8 unk_29; + u16 unk_2a; +} Manager26; + +typedef struct { + u8 unk_00; + u8 unk_01; + u8 unk_02; + u8 unk_03; + u16 unk_04; + u16 unk_06; +} UnkManager26HelperStruct; + +extern void (* const gUnk_08108D04[])(Manager26*); + +extern void * GetCurrentRoomProperty(u32); + +void sub_0805C7CC(Manager26*); + +void sub_0805C6B8(Manager26* this) { + gUnk_08108D04[this->manager.action](this); +} + +void sub_0805C6D0(Manager26* this) { + UnkManager26HelperStruct* tmp = GetCurrentRoomProperty(this->manager.unk_0a); + if (!tmp) { + DeleteManager(&this->manager); + return; + } + this->unk_2a = gRoomControls.roomOriginY + this->manager.unk_0e; + this->manager.unk_0e = 0; + this->unk_28 = 0; + this->unk_29 = 0; + while (tmp->unk_00 != 0xFF && this->manager.unk_0e < 0x20) { + Entity* obj; + obj = CreateObject(0x4C, tmp->unk_01, tmp->unk_02); + if (obj) { + obj->actionDelay = tmp->unk_03; + obj->x.HALF.HI = gRoomControls.roomOriginX + tmp->unk_04; + obj->y.HALF.HI = gRoomControls.roomOriginY + tmp->unk_06; + obj->parent = (Entity*) this; + obj->collisionLayer = 1; + obj->field_0x82.HALF.HI = this->manager.unk_0e; + obj->field_0x82.HALF.LO = tmp->unk_00; + this->unk_29 |= 1 << this->manager.unk_0e; + } + tmp++; + this->manager.unk_0e++; + } + if (this->manager.unk_0b == 0xFF) { + this->manager.action = 2; + } else { + if (CheckLocalFlag(this->manager.unk_0b)) { + this->manager.action = 2; + } else { + this->manager.action = 1; + } + } +} + +void sub_0805C7A0(Manager26* this) { + if (this->unk_28 == this->unk_29) { + this->manager.action = 2; + SetLocalFlag(this->manager.unk_0b); + } + sub_0805C7CC(this); +} + +void sub_0805C7C4(Manager26* this) { + sub_0805C7CC(this); +} + +void sub_0805C7CC(Manager26* this) { + if (gPlayerState.flags.all & 0x80) { + if (gPlayerEntity.y.HALF.HI < this->unk_2a + 0x10) { + this->manager.unk_0d = 1; + } else { + this->manager.unk_0d = 0; + } + } else { + if (gPlayerEntity.y.HALF.HI < this->unk_2a + 0x28) { + this->manager.unk_0d = 3; + } else { + this->manager.unk_0d = 2; + } + } +}