diff --git a/asm/non_matching/manager21/Manager21_Main.inc b/asm/non_matching/manager21/Manager21_Main.inc deleted file mode 100644 index 87823c86..00000000 --- a/asm/non_matching/manager21/Manager21_Main.inc +++ /dev/null @@ -1,88 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r5, r0, #0 - ldrb r1, [r5, #0xc] - cmp r1, #0 - bne _0805B834 - movs r0, #1 - strb r0, [r5, #0xc] - str r1, [r5, #0x20] -_0805B834: - ldrb r0, [r5, #0xa] - bl GetCurrentRoomProperty - adds r4, r0, #0 - movs r7, #0 - ldrh r0, [r4] - cmp r0, #0 - beq _0805B8C4 - ldr r0, _0805B8A8 @ =gRoomControls - mov r8, r0 -_0805B848: - ldrh r0, [r4] - ldrh r1, [r4, #2] - movs r2, #4 - movs r3, #4 - bl CheckRectOnScreen - cmp r0, #0 - beq _0805B8AC - movs r6, #1 - lsls r6, r7 - ldr r0, [r5, #0x20] - ands r0, r6 - cmp r0, #0 - bne _0805B8B6 - ldrh r0, [r4, #4] - bl sub_0805B8CC - cmp r0, #0 - beq _0805B8B6 - movs r0, #0x4e - movs r1, #1 - movs r2, #0 - bl CreateObject - adds r1, r0, #0 - cmp r1, #0 - beq _0805B8B6 - ldrh r0, [r4, #6] - strb r0, [r1, #0xe] - strb r7, [r1, #0xf] - ldrh r0, [r4] - mov r2, r8 - ldrh r2, [r2, #6] - adds r0, r0, r2 - strh r0, [r1, #0x2e] - ldrh r0, [r4, #2] - mov r3, r8 - ldrh r3, [r3, #8] - adds r0, r0, r3 - strh r0, [r1, #0x32] - str r5, [r1, #0x50] - adds r0, r1, #0 - bl sub_08016A30 - ldr r0, [r5, #0x20] - orrs r0, r6 - b _0805B8B4 - .align 2, 0 -_0805B8A8: .4byte gRoomControls -_0805B8AC: - movs r1, #1 - lsls r1, r7 - ldr r0, [r5, #0x20] - bics r0, r1 -_0805B8B4: - str r0, [r5, #0x20] -_0805B8B6: - adds r4, #8 - adds r7, #1 - ldrh r0, [r4] - cmp r0, #0 - beq _0805B8C4 - cmp r7, #0x1f - bls _0805B848 -_0805B8C4: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/manager21/sub_0805B8CC.inc b/asm/non_matching/manager21/sub_0805B8CC.inc deleted file mode 100644 index d06a5b37..00000000 --- a/asm/non_matching/manager21/sub_0805B8CC.inc +++ /dev/null @@ -1,20 +0,0 @@ - .syntax unified - push {lr} - cmp r0, #4 - bne _0805B8DA - movs r0, #0x18 - bl CheckGlobalFlag - b _0805B8E8 -_0805B8DA: - cmp r0, #4 - bls _0805B8E6 - cmp r0, #6 - bhi _0805B8E6 - movs r0, #0 - b _0805B8E8 -_0805B8E6: - movs r0, #1 -_0805B8E8: - pop {pc} - .align 2, 0 - .syntax divided diff --git a/include/flags.h b/include/flags.h index c68be93e..e6261771 100644 --- a/include/flags.h +++ b/include/flags.h @@ -28,7 +28,7 @@ void SetRoomFlag(u32); extern u32 gGlobalFlags; extern u32 gRoomFlags; -enum { +typedef enum { FLAG_NONE, /*0x01*/ LV0_CLEAR, /* */ /*0x02*/ LV1_CLEAR, /* */ @@ -130,6 +130,6 @@ enum { /*0x62*/ MAZE_CLEAR, /* Cleared Castle maze */ /*0x63*/ TINY_ENTRANCE, /* Ezlo described entrances */ /*0x64*/ CASTLE_BGM, /* Castle intro BGM */ -}; +} Flags; #endif diff --git a/src/manager/manager21.c b/src/manager/manager21.c index 32c217d4..586fedd6 100644 --- a/src/manager/manager21.c +++ b/src/manager/manager21.c @@ -1,6 +1,68 @@ #include "manager.h" +#include "room.h" +#include "object.h" +#include "functions.h" +#include "flags.h" -ASM_FUNC("asm/non_matching/manager21/Manager21_Main.inc", void Manager21_Main()) +extern bool32 CheckRectOnScreen(u16, u16, u32, u32); -ASM_FUNC("asm/non_matching/manager21/sub_0805B8CC.inc", void sub_0805B8CC()) +typedef struct { + Manager manager; + u32 field_0x20; +} Manager21; + +typedef struct { + u16 x; + u16 y; + u16 field_0x4; + u16 actionDelay; +} MinishEntranceSpawnData; + +bool32 sub_0805B8CC(u32); + +/* +Spawns MINISH_SIZED_ENTRANCE at the locations in the room property this->manager.unk_0a when they are visible on the screen. +*/ +void Manager21_Main(Manager21* this) { + MinishEntranceSpawnData* spawnData; + u32 count; + if (this->manager.action == 0) { + this->manager.action = 1; + this->field_0x20 = 0; + } + spawnData = (MinishEntranceSpawnData*)GetCurrentRoomProperty(this->manager.unk_0a); + + for (count = 0; (spawnData->x != 0) && (count < 0x20); ++count) { + if (CheckRectOnScreen(spawnData->x, spawnData->y, 4, 4) != 0) { + if (((this->field_0x20 & (1 << count)) == 0) && (sub_0805B8CC(spawnData->field_0x4) != 0)) { + Entity* object = CreateObject(MINISH_SIZED_ENTRANCE, 1, 0); + if (object != NULL) { + object->actionDelay = spawnData->actionDelay; + object->field_0xf = count; + object->x.HALF.HI = gRoomControls.roomOriginX + spawnData->x; + object->y.HALF.HI = gRoomControls.roomOriginY + spawnData->y; + object->parent = (Entity*)this; + sub_08016A30(object); + this->field_0x20 |= 1 << count; + } + } + } else { + this->field_0x20 &= ~(1 << count); + } + spawnData += 1; + } +} + +bool32 sub_0805B8CC(u32 param_1) { + if (param_1 == 4) { + return CheckGlobalFlag(TATEKAKE_HOUSE); + } + if (param_1 < 5) { + return TRUE; + } + if (param_1 > 6) { + return TRUE; + } + return FALSE; +}