diff --git a/asm/non_matching/manager23/Manager23_Main.inc b/asm/non_matching/manager23/Manager23_Main.inc deleted file mode 100644 index 7bd09747..00000000 --- a/asm/non_matching/manager23/Manager23_Main.inc +++ /dev/null @@ -1,12 +0,0 @@ - .syntax unified - push {lr} - ldr r2, _0805BC88 @ =gUnk_08108CCC - ldrb r1, [r0, #0xa] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0805BC88: .4byte gUnk_08108CCC - .syntax divided diff --git a/asm/non_matching/manager23/sub_0805BC8C.inc b/asm/non_matching/manager23/sub_0805BC8C.inc deleted file mode 100644 index 84fa7a8e..00000000 --- a/asm/non_matching/manager23/sub_0805BC8C.inc +++ /dev/null @@ -1,35 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _0805BCAE - movs r0, #1 - strb r0, [r4, #0xc] - movs r0, #0x1e - strb r0, [r4, #0xf] - ldrh r0, [r4, #0x3e] - bl CheckFlags - cmp r0, #0 - beq _0805BCAE - adds r0, r4, #0 - bl sub_0805BE94 -_0805BCAE: - ldrh r0, [r4, #0x3e] - bl CheckFlags - cmp r0, #0 - beq _0805BCD0 - ldrb r0, [r4, #0xf] - subs r0, #1 - strb r0, [r4, #0xf] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0805BCD0 - adds r0, r4, #0 - bl sub_0805BEC4 - adds r0, r4, #0 - bl sub_0805BE94 -_0805BCD0: - pop {r4, pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/manager23/sub_0805BCD4.inc b/asm/non_matching/manager23/sub_0805BCD4.inc deleted file mode 100644 index 7a11186d..00000000 --- a/asm/non_matching/manager23/sub_0805BCD4.inc +++ /dev/null @@ -1,68 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #1 - beq _0805BD0E - cmp r0, #1 - bgt _0805BCE8 - cmp r0, #0 - beq _0805BCEE - b _0805BD5A -_0805BCE8: - cmp r0, #2 - beq _0805BD38 - b _0805BD5A -_0805BCEE: - movs r0, #1 - strb r0, [r4, #0xc] - movs r0, #0x1e - strb r0, [r4, #0xf] - ldrh r0, [r4, #0x3e] - bl CheckFlags - cmp r0, #0 - beq _0805BD5A - adds r0, r4, #0 - movs r1, #0x75 - bl sub_0805BE70 - movs r0, #2 - strb r0, [r4, #0xc] - b _0805BD5A -_0805BD0E: - ldrh r0, [r4, #0x3e] - bl CheckFlags - cmp r0, #0 - beq _0805BD5A - ldrb r0, [r4, #0xf] - subs r0, #1 - strb r0, [r4, #0xf] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0805BD5A - movs r0, #0x1e - strb r0, [r4, #0xf] - adds r0, r4, #0 - bl sub_0805BEC4 - adds r0, r4, #0 - movs r1, #0x76 - bl sub_0805BE70 - b _0805BD5A -_0805BD38: - ldrh r0, [r4, #0x3e] - bl CheckFlags - cmp r0, #0 - bne _0805BD5A - ldrb r0, [r4, #0xf] - subs r0, #1 - strb r0, [r4, #0xf] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0805BD5A - movs r0, #0x1e - strb r0, [r4, #0xf] - adds r0, r4, #0 - movs r1, #0x75 - bl sub_0805BE70 -_0805BD5A: - pop {r4, pc} - .syntax divided diff --git a/asm/non_matching/manager23/sub_0805BD5C.inc b/asm/non_matching/manager23/sub_0805BD5C.inc deleted file mode 100644 index 404857fd..00000000 --- a/asm/non_matching/manager23/sub_0805BD5C.inc +++ /dev/null @@ -1,43 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _0805BD94 - ldrh r0, [r4, #0x3e] - bl CheckFlags - cmp r0, #0 - beq _0805BD76 - adds r0, r4, #0 - bl sub_0805BE94 -_0805BD76: - ldrh r1, [r4, #0x38] - lsls r1, r1, #0x10 - asrs r1, r1, #0x14 - movs r2, #0x3f - ands r1, r2 - ldrh r0, [r4, #0x3a] - lsls r0, r0, #0x10 - asrs r0, r0, #0x14 - ands r0, r2 - lsls r0, r0, #6 - orrs r1, r0 - strh r1, [r4, #0x20] - movs r0, #1 - strb r0, [r4, #0xc] - b _0805BDB0 -_0805BD94: - ldrh r0, [r4, #0x20] - ldrb r1, [r4, #0xb] - bl GetTileType - cmp r0, #0x76 - bne _0805BDB0 - ldrh r0, [r4, #0x3e] - bl SetFlag - ldrb r0, [r4, #0xe] - bl sub_0805308C - bl DeleteThisEntity -_0805BDB0: - pop {r4, pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/manager23/sub_0805BDB4.inc b/asm/non_matching/manager23/sub_0805BDB4.inc deleted file mode 100644 index 9e1ee204..00000000 --- a/asm/non_matching/manager23/sub_0805BDB4.inc +++ /dev/null @@ -1,90 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #0 - beq _0805BDF4 - cmp r0, #1 - beq _0805BE2C - ldrh r0, [r4, #0x22] - subs r0, #1 - strh r0, [r4, #0x22] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _0805BE58 - movs r1, #0x38 - ldrsh r0, [r4, r1] - movs r2, #0x3a - ldrsh r1, [r4, r2] - ldrb r2, [r4, #0xb] - bl CreateDustAt - ldrh r0, [r4, #0x3e] - bl ClearFlag - ldrh r0, [r4, #0x20] - ldrb r1, [r4, #0xb] - bl sub_0807BA8C - ldrb r0, [r4, #0xe] - rsbs r0, r0, #0 - bl sub_0805308C - b _0805BE26 -_0805BDF4: - ldrh r0, [r4, #0x3e] - bl CheckFlags - cmp r0, #0 - bne _0805BE08 - ldrh r0, [r4, #0x3c] - bl CheckFlags - cmp r0, #0 - beq _0805BE0E -_0805BE08: - adds r0, r4, #0 - bl sub_0805BE94 -_0805BE0E: - ldrh r1, [r4, #0x38] - lsls r1, r1, #0x10 - asrs r1, r1, #0x14 - movs r2, #0x3f - ands r1, r2 - ldrh r0, [r4, #0x3a] - lsls r0, r0, #0x10 - asrs r0, r0, #0x14 - ands r0, r2 - lsls r0, r0, #6 - orrs r1, r0 - strh r1, [r4, #0x20] -_0805BE26: - movs r0, #1 - strb r0, [r4, #0xc] - b _0805BE6C -_0805BE2C: - ldrh r0, [r4, #0x20] - ldrb r1, [r4, #0xb] - bl GetTileType - cmp r0, #0x76 - bne _0805BE6C - ldrh r0, [r4, #0x3e] - bl SetFlag - ldrb r0, [r4, #0xe] - bl sub_0805308C - movs r0, #2 - strb r0, [r4, #0xc] - adds r0, r4, #0 - adds r0, #0x36 - ldrb r1, [r0] - lsls r0, r1, #4 - subs r0, r0, r1 - lsls r0, r0, #2 - strh r0, [r4, #0x22] - b _0805BE6C -_0805BE58: - ldrh r0, [r4, #0x3c] - bl CheckFlags - cmp r0, #0 - beq _0805BE6C - adds r0, r4, #0 - bl sub_0805BEC4 - bl DeleteThisEntity -_0805BE6C: - pop {r4, pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/manager23/sub_0805BE70.inc b/asm/non_matching/manager23/sub_0805BE70.inc deleted file mode 100644 index 18b92284..00000000 --- a/asm/non_matching/manager23/sub_0805BE70.inc +++ /dev/null @@ -1,19 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r1, #0 - ldrh r1, [r0, #0x38] - lsls r1, r1, #0x10 - asrs r1, r1, #0x14 - movs r3, #0x3f - ands r1, r3 - ldrh r2, [r0, #0x3a] - lsls r2, r2, #0x10 - asrs r2, r2, #0x14 - ands r2, r3 - lsls r2, r2, #6 - orrs r1, r2 - ldrb r2, [r0, #0xb] - adds r0, r4, #0 - bl SetTileType - pop {r4, pc} - .syntax divided diff --git a/asm/non_matching/manager23/sub_0805BE94.inc b/asm/non_matching/manager23/sub_0805BE94.inc deleted file mode 100644 index a4e34a14..00000000 --- a/asm/non_matching/manager23/sub_0805BE94.inc +++ /dev/null @@ -1,23 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - ldrh r1, [r4, #0x38] - lsls r1, r1, #0x10 - asrs r1, r1, #0x14 - movs r2, #0x3f - ands r1, r2 - ldrh r0, [r4, #0x3a] - lsls r0, r0, #0x10 - asrs r0, r0, #0x14 - ands r0, r2 - lsls r0, r0, #6 - orrs r1, r0 - ldrb r2, [r4, #0xb] - movs r0, #0x76 - bl SetTileType - ldrb r0, [r4, #0xe] - bl sub_0805308C - bl DeleteThisEntity - pop {r4, pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/manager23/sub_0805BEC4.inc b/asm/non_matching/manager23/sub_0805BEC4.inc deleted file mode 100644 index daf91631..00000000 --- a/asm/non_matching/manager23/sub_0805BEC4.inc +++ /dev/null @@ -1,43 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - movs r0, #0x2a - movs r1, #1 - movs r2, #0 - bl CreateObject - adds r2, r0, #0 - cmp r2, #0 - beq _0805BF10 - ldrb r1, [r2, #0x11] - movs r0, #0x10 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #3 - orrs r0, r1 - strb r0, [r2, #0x11] - ldr r1, _0805BF14 @ =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] - ldrb r1, [r4, #0xb] - adds r0, r2, #0 - adds r0, #0x38 - strb r1, [r0] - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #2 - orrs r0, r1 - strb r0, [r2] -_0805BF10: - pop {r4, pc} - .align 2, 0 -_0805BF14: .4byte gRoomControls - .syntax divided diff --git a/include/textbox.h b/include/textbox.h index 3eca4242..e85590b9 100644 --- a/include/textbox.h +++ b/include/textbox.h @@ -32,7 +32,8 @@ typedef struct { u16 _22; u16 _24; u16 _26; - u8 _28[0x4]; + u16 _28; + u8 _2a[0x2]; void* _2c; u8 _30[0x20]; WStruct _50; diff --git a/src/manager/manager23.c b/src/manager/manager23.c index 8fcba071..f38c3831 100644 --- a/src/manager/manager23.c +++ b/src/manager/manager23.c @@ -1,18 +1,161 @@ #include "manager.h" +#include "room.h" +#include "functions.h" +#include "flags.h" +#include "object.h" -ASM_FUNC("asm/non_matching/manager23/Manager23_Main.inc", void Manager23_Main()) +extern void (*const gUnk_08108CCC[])(Manager*); -ASM_FUNC("asm/non_matching/manager23/sub_0805BC8C.inc", void sub_0805BC8C()) +typedef struct { + Manager manager; + u16 field_0x20; + u16 field_0x22; + u8 field_0x24[0x12]; + u8 field_0x36; + u8 field_0x37; + u16 field_0x38; + u16 field_0x3a; + u16 field_0x3c; + u16 field_0x3e; +} Manager23; -ASM_FUNC("asm/non_matching/manager23/sub_0805BCD4.inc", void sub_0805BCD4()) +void sub_0805BE94(Manager23*); +void sub_0805BEC4(Manager23*); -ASM_FUNC("asm/non_matching/manager23/sub_0805BD5C.inc", void sub_0805BD5C()) +void sub_0805BE70(Manager23*, u32); -ASM_FUNC("asm/non_matching/manager23/sub_0805BDB4.inc", void sub_0805BDB4()) +extern void CreateDustAt(s32, s32, u32); -ASM_FUNC("asm/non_matching/manager23/sub_0805BE70.inc", void sub_0805BE70()) +void Manager23_Main(Manager* this) { + gUnk_08108CCC[this->unk_0a](this); +} -ASM_FUNC("asm/non_matching/manager23/sub_0805BE94.inc", void sub_0805BE94()) +void sub_0805BC8C(Manager23* this) { + if (this->manager.action == 0) { + this->manager.action = 1; + this->manager.unk_0f = 0x1e; + if (CheckFlags(this->field_0x3e) != 0) { + sub_0805BE94(this); + } + } + if ((CheckFlags(this->field_0x3e) != 0) && (--this->manager.unk_0f == 0)) { + sub_0805BEC4(this); + sub_0805BE94(this); + } +} -ASM_FUNC("asm/non_matching/manager23/sub_0805BEC4.inc", void sub_0805BEC4()) +void sub_0805BCD4(Manager23* this) { + switch(this->manager.action) { + case 0: + this->manager.action = 1; + this->manager.unk_0f = 0x1e; + if (CheckFlags(this->field_0x3e) != 0) { + sub_0805BE70(this, 0x75); + this->manager.action = 2; + } + break; + case 1: + if (CheckFlags(this->field_0x3e) != 0 && --this->manager.unk_0f == 0) { + this->manager.unk_0f = 0x1e; + sub_0805BEC4(this); + sub_0805BE70(this, 0x76); + } + break; + case 2: + if (CheckFlags(this->field_0x3e) == 0 && --this->manager.unk_0f == 0) { + this->manager.unk_0f = 0x1e; + sub_0805BE70(this, 0x75); + } + break; + } +} + +void sub_0805BD5C(Manager23* this) { + if (this->manager.action == 0) { + if (CheckFlags(this->field_0x3e) != 0) { + sub_0805BE94(this); + } + this->field_0x20 = ((s16)this->field_0x38 >> 4 & 0x3fU) | + ((s32)((this->field_0x3a << 0x10) >> 0x14 & 0x3fU) << 6); + this->manager.action = 1; + } else { + if (GetTileType(this->field_0x20, this->manager.unk_0b) == 0x76) { + SetFlag(this->field_0x3e); + sub_0805308C(this->manager.unk_0e); + DeleteThisEntity(); + } + } +} + + +void sub_0805BDB4(Manager23* this) { + u8 bVar1; + u16 uVar2; + u32 uVar3; + + switch (this->manager.action) { + case 0: + if (CheckFlags(this->field_0x3e) != 0 || CheckFlags(this->field_0x3c) != 0) { + sub_0805BE94(this); + } + this->field_0x20 = ((s16)this->field_0x38 >> 4 & 0x3fU) | + (((s32)(this->field_0x3a << 0x10) >> 0x14 & 0x3fU) << 6); + this->manager.action = 1; + break; + + case 1: + if (GetTileType(this->field_0x20, this->manager.unk_0b) != 0x76) { + return; + } + SetFlag(this->field_0x3e); + sub_0805308C(this->manager.unk_0e); + this->manager.action = 2; + this->field_0x22 = this->field_0x36 * 0x3c; + return; + break; + + default: + if (--this->field_0x22 == 0) { + CreateDustAt(*(s16*)&this->field_0x38, *(s16*)&this->field_0x3a, this->manager.unk_0b); + ClearFlag(this->field_0x3e); + sub_0807BA8C(this->field_0x20, this->manager.unk_0b); + sub_0805308C(-this->manager.unk_0e); + this->manager.action = 1; + } else { + if (CheckFlags(this->field_0x3c) == 0) { + return; + } + sub_0805BEC4(this); + DeleteThisEntity(); + } + break; + } +} + +void sub_0805BE70(Manager23* this, u32 param_2) { + SetTileType(param_2, + ((this->field_0x38 << 0x10) >> 0x14 & 0x3fU) | + ((this->field_0x3a << 0x10) >> 0x14 & 0x3fU) << 6, + this->manager.unk_0b); +} + +void sub_0805BE94(Manager23* this) { + SetTileType(0x76, + ((this->field_0x38 << 0x10) >> 0x14 & 0x3fU) | + ((this->field_0x3a << 0x10) >> 0x14 & 0x3fU) << 6, + this->manager.unk_0b); + sub_0805308C(this->manager.unk_0e); + DeleteThisEntity(); +} + +void sub_0805BEC4(Manager23* this) { + Entity* object = CreateObject(OBJECT_2A, 1, 0); + if (object != NULL) { + *(s8*)(&object->flags+1) = ((*(s8*)(&object->flags+1)) & (-0x10)) | 3; + object->x.HALF.HI = this->field_0x38 + gRoomControls.roomOriginX; + object->y.HALF.HI = this->field_0x3a + gRoomControls.roomOriginY; + object->collisionLayer = this->manager.unk_0b; + object->spritePriority.b0 = 2; + } +}