diff --git a/asm/manager17.s b/asm/manager17.s deleted file mode 100644 index 8db982b7..00000000 --- a/asm/manager17.s +++ /dev/null @@ -1,82 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start Manager17_Main -Manager17_Main: @ 0x0805AD48 - push {lr} - ldr r2, _0805AD5C @ =gUnk_08108654 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0805AD5C: .4byte gUnk_08108654 - - thumb_func_start sub_0805AD60 -sub_0805AD60: @ 0x0805AD60 - push {r4, lr} - adds r4, r0, #0 - movs r0, #1 - strb r0, [r4, #0xc] - ldrh r0, [r4, #0x3c] - bl CheckFlags - cmp r0, #0 - beq _0805AD76 - bl DeleteThisEntity -_0805AD76: - adds r0, r4, #0 - bl sub_0805AD80 - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0805AD80 -sub_0805AD80: @ 0x0805AD80 - push {r4, lr} - adds r4, r0, #0 - ldrh r0, [r4, #0x3e] - bl CheckFlags - cmp r0, #0 - beq _0805ADD0 - ldrb r1, [r4, #0xa] - ldrb r2, [r4, #0xb] - movs r0, #0 - bl CreateObject - adds r2, r0, #0 - cmp r2, #0 - beq _0805ADCC - adds r0, r4, #0 - adds r0, #0x35 - ldrb r0, [r0] - strb r0, [r2, #0xe] - adds r0, r4, #0 - adds r0, #0x36 - ldrb r1, [r0] - adds r0, r2, #0 - adds r0, #0x38 - strb r1, [r0] - ldr r1, _0805ADD4 @ =gRoomControls - ldrh r0, [r1, #6] - ldrh r3, [r4, #0x38] - adds r0, r0, r3 - strh r0, [r2, #0x2e] - ldrh r0, [r1, #8] - ldrh r1, [r4, #0x3a] - adds r0, r0, r1 - strh r0, [r2, #0x32] - ldrh r1, [r4, #0x3c] - adds r0, r2, #0 - adds r0, #0x86 - strh r1, [r0] -_0805ADCC: - bl DeleteThisEntity -_0805ADD0: - pop {r4, pc} - .align 2, 0 -_0805ADD4: .4byte gRoomControls diff --git a/include/manager.h b/include/manager.h index f3a81b46..f368f9f2 100644 --- a/include/manager.h +++ b/include/manager.h @@ -162,7 +162,7 @@ extern void Manager13_Main(Entity*); extern void Manager14_Main(Entity*); extern void Manager15_Main(); extern void Manager16_Main(Entity*); -extern void Manager17_Main(Entity*); +extern void Manager17_Main(); extern void Manager18_Main(); extern void Manager19_Main(Entity*); extern void Manager1A_Main(); diff --git a/linker.ld b/linker.ld index 7c36ca52..12d4cb54 100644 --- a/linker.ld +++ b/linker.ld @@ -523,7 +523,7 @@ SECTIONS { asm/manager14.o(.text); src/manager/manager15.o(.text); asm/manager16.o(.text); - asm/manager17.o(.text); + src/manager/manager17.o(.text); asm/manager18.o(.text); asm/manager19.o(.text); src/manager/manager1A.o(.text); diff --git a/src/manager/manager17.c b/src/manager/manager17.c new file mode 100644 index 00000000..1722da42 --- /dev/null +++ b/src/manager/manager17.c @@ -0,0 +1,47 @@ +#include "manager.h" +#include "flags.h" +#include "room.h" + +typedef struct { + Manager manager; + u8 field_0x20[0x15]; + u8 field_0x35; + u8 field_0x36; + u8 field_0x37; + s16 field_0x38; + s16 field_0x3a; + u16 field_0x3c; + u16 field_0x3e; +} Manager17; + +extern void (*const gUnk_08108654[])(Manager17*); + + +void sub_0805AD80(Manager17*); + + +void Manager17_Main(Manager17* manager) { + gUnk_08108654[manager->manager.action](manager); +} + +void sub_0805AD60(Manager17* manager) { + manager->manager.action = 1; + if (CheckFlags(manager->field_0x3c) != 0) { + DeleteThisEntity(); + } + sub_0805AD80(manager); +} + +void sub_0805AD80(Manager17* manager) { + if (CheckFlags(manager->field_0x3e) != 0) { + Entity* object = CreateObject(0, manager->manager.unk_0a, manager->manager.unk_0b); + if (object != NULL) { + object->actionDelay = manager->field_0x35; + object->collisionLayer = manager->field_0x36; + object->x.HALF.HI = manager->field_0x38 + gRoomControls.roomOriginX; + object->y.HALF.HI = manager->field_0x3a + gRoomControls.roomOriginY; + object->field_0x86.HWORD = manager->field_0x3c; + } + DeleteThisEntity(); + } +}