diff --git a/asm/manager2C.s b/asm/manager2C.s deleted file mode 100644 index c5a0f5d3..00000000 --- a/asm/manager2C.s +++ /dev/null @@ -1,76 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start Manager2C_Main -Manager2C_Main: @ 0x0805D174 - push {r4, r5, lr} - adds r5, r0, #0 - ldrb r1, [r5, #0xc] - cmp r1, #0 - bne _0805D184 - movs r0, #1 - strb r0, [r5, #0xc] - strh r1, [r5, #0x3a] -_0805D184: - movs r1, #0x38 - ldrsh r0, [r5, r1] - movs r2, #0x3a - ldrsh r1, [r5, r2] - movs r2, #0x14 - movs r3, #0x40 - bl CheckPlayerInRegion - cmp r0, #0 - beq _0805D1EE - ldr r0, _0805D1F0 @ =gPlayerEntity - movs r4, #0x32 - ldrsh r1, [r0, r4] - ldr r3, _0805D1F4 @ =gRoomControls - ldrh r2, [r3, #8] - subs r1, r1, r2 - movs r4, #0x36 - ldrsh r0, [r0, r4] - adds r1, r1, r0 - cmp r1, #0 - bge _0805D1EE - movs r1, #0xc - ldrsh r0, [r3, r1] - cmp r0, r2 - bne _0805D1EE - ldr r4, _0805D1F8 @ =gUnk_030010AC - adds r0, r4, #0 - movs r1, #0x20 - bl MemClear - subs r4, #0xc - movs r1, #0 - movs r0, #1 - strb r0, [r4, #8] - strb r1, [r4, #9] - movs r0, #0xb - strb r0, [r4, #0xf] - ldrb r0, [r5, #0xb] - strb r0, [r4, #0xc] - ldrb r0, [r5, #0xe] - strb r0, [r4, #0xd] - adds r0, r5, #0 - adds r0, #0x37 - ldrb r0, [r0] - strb r0, [r4, #0xe] - ldrh r0, [r5, #0x3c] - strh r0, [r4, #0x10] - ldrh r0, [r5, #0x3e] - strh r0, [r4, #0x12] - adds r0, r5, #0 - adds r0, #0x36 - ldrb r0, [r0] - strb r0, [r4, #0x14] -_0805D1EE: - pop {r4, r5, pc} - .align 2, 0 -_0805D1F0: .4byte gPlayerEntity -_0805D1F4: .4byte gRoomControls -_0805D1F8: .4byte gUnk_030010AC diff --git a/include/manager.h b/include/manager.h index 3e0f070a..9273e8e8 100644 --- a/include/manager.h +++ b/include/manager.h @@ -183,7 +183,7 @@ extern void Manager28_Main(); extern void Manager29_Main(Entity*); extern void Manager2A_Main(Manager*); extern void Manager2B_Main(Entity*); -extern void Manager2C_Main(Entity*); +extern void Manager2C_Main(); extern void Manager2D_Main(Entity*); extern void Manager2E_Main(); extern void Manager2F_Main(); diff --git a/linker.ld b/linker.ld index 94503545..b14d320a 100644 --- a/linker.ld +++ b/linker.ld @@ -544,7 +544,7 @@ SECTIONS { asm/manager29.o(.text); src/manager/manager2A.o(.text); asm/manager2B.o(.text); - asm/manager2C.o(.text); + src/manager/manager2C.o(.text); src/manager/manager2D.o(.text); src/manager/manager2E.o(.text); asm/manager2E.o(.text); diff --git a/src/manager/manager2C.c b/src/manager/manager2C.c new file mode 100644 index 00000000..ba66443d --- /dev/null +++ b/src/manager/manager2C.c @@ -0,0 +1,35 @@ +#include "manager.h" +#include "functions.h" +#include "utils.h" + +typedef struct { + struct Manager manager; + u8 field_0x20[0x16]; + u8 field_0x36; + u8 field_0x37; + s16 field_0x38; + s16 field_0x3a; + u16 field_0x3c; + u16 field_0x3e; +} Manager2C; + +void Manager2C_Main(Manager2C* manager) { + if (manager->manager.action == 0) { + manager->manager.action = 1; + manager->field_0x3a = 0; + } + if (((CheckPlayerInRegion(manager->field_0x38, manager->field_0x3a, 0x14, 0x40) != 0) && + (((gPlayerEntity.y.HALF.HI - gRoomControls.roomOriginY) +gPlayerEntity.height.HALF.HI) < 0)) && + (gRoomControls.roomScrollY == gRoomControls.roomOriginY)) { + MemClear(&gScreenTransition.areaID, 0x20); + gScreenTransition.transitioningOut = 1; + gScreenTransition.transitionType = 0; + gScreenTransition.field_0xf = 0xb; + gScreenTransition.areaID = manager->manager.unk_0b; + gScreenTransition.roomID = manager->manager.unk_0e; + gScreenTransition.playerState = manager->field_0x37; + gScreenTransition.playerStartPos.HALF.x = manager->field_0x3c; + gScreenTransition.playerStartPos.HALF.y = manager->field_0x3e; + gScreenTransition.playerLayer = manager->field_0x36; + } +}