diff --git a/asm/non_matching/manager2/sub_0805754C.inc b/asm/non_matching/manager2/sub_0805754C.inc deleted file mode 100644 index ad1109b3..00000000 --- a/asm/non_matching/manager2/sub_0805754C.inc +++ /dev/null @@ -1,66 +0,0 @@ - .syntax unified - push {r4, r5, r6, lr} - adds r2, r0, #0 - ldr r3, _080575BC @ =gRoomControls - movs r0, #0xc - ldrsh r1, [r3, r0] - ldrh r0, [r3, #8] - subs r1, r1, r0 - asrs r0, r1, #3 - adds r1, r1, r0 - ldr r4, _080575C0 @ =gScreen - movs r6, #0x3f - adds r0, r1, #0 - ands r0, r6 - strh r0, [r4, #0x30] - adds r0, r1, #0 - cmp r1, #0 - bge _08057570 - adds r0, #0x3f -_08057570: - asrs r0, r0, #6 - lsls r0, r0, #9 - ldr r5, _080575C4 @ =gMapDataTopSpecial - adds r1, r0, r5 - str r1, [r4, #0x34] - ldr r0, [r2, #0x38] - cmp r0, r1 - beq _08057586 - str r1, [r2, #0x38] - movs r0, #1 - strh r0, [r4, #0x32] -_08057586: - movs r0, #0xc - ldrsh r1, [r3, r0] - ldrh r0, [r3, #8] - subs r1, r1, r0 - asrs r0, r1, #2 - adds r1, r1, r0 - adds r0, r1, #0 - ands r0, r6 - strh r0, [r4, #0x18] - adds r0, r1, #0 - cmp r0, #0 - bge _080575A0 - adds r0, #0x3f -_080575A0: - asrs r0, r0, #6 - lsls r0, r0, #9 - movs r3, #0x80 - lsls r3, r3, #6 - adds r1, r5, r3 - adds r1, r0, r1 - str r1, [r4, #0x1c] - ldr r0, [r2, #0x3c] - cmp r0, r1 - beq _080575BA - str r1, [r2, #0x3c] - movs r0, #1 - strh r0, [r4, #0x1a] -_080575BA: - pop {r4, r5, r6, pc} - .align 2, 0 -_080575BC: .4byte gRoomControls -_080575C0: .4byte gScreen -_080575C4: .4byte gMapDataTopSpecial - .syntax divided diff --git a/asm/non_matching/manager2/sub_08057688.inc b/asm/non_matching/manager2/sub_08057688.inc deleted file mode 100644 index fae0c509..00000000 --- a/asm/non_matching/manager2/sub_08057688.inc +++ /dev/null @@ -1,12 +0,0 @@ - .syntax unified - ldr r0, _08057694 @ =gScreen - ldr r1, _08057698 @ =0x00001D48 - strh r1, [r0, #0x2c] - ldr r1, _0805769C @ =0x00001E48 - strh r1, [r0, #0x14] - bx lr - .align 2, 0 -_08057694: .4byte gScreen -_08057698: .4byte 0x00001D48 -_0805769C: .4byte 0x00001E48 - .syntax divided diff --git a/asm/non_matching/manager2/sub_080576A0.inc b/asm/non_matching/manager2/sub_080576A0.inc deleted file mode 100644 index 22d3cfc8..00000000 --- a/asm/non_matching/manager2/sub_080576A0.inc +++ /dev/null @@ -1,15 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - ldr r0, _080576BC @ =gRoomVars - ldrb r0, [r0, #0x10] - bl LoadGfxGroup - movs r0, #0 - str r0, [r4, #0x38] - str r0, [r4, #0x3c] - adds r0, r4, #0 - bl sub_0805754C - pop {r4, pc} - .align 2, 0 -_080576BC: .4byte gRoomVars - .syntax divided diff --git a/src/manager/manager2.c b/src/manager/manager2.c index 1198575c..ca71f503 100644 --- a/src/manager/manager2.c +++ b/src/manager/manager2.c @@ -2,13 +2,25 @@ #include "entity.h" #include "screen.h" #include "functions.h" +#include "room.h" + +typedef struct { + Manager manager; + u32 field_0x20[0x6]; + void* field_0x38; + void* field_0x3c; +} Manager2; extern void sub_080576A0(); -extern void sub_0805754C(Entity*); +extern void sub_0805754C(Manager2*); -void Manager2_Main(Entity* this) { - if (this->action == 0) { - this->action = 1; +extern u8 gMapDataTopSpecial[]; + +extern u32 gUnk_0200B650; + +void Manager2_Main(Manager2* this) { + if (this->manager.action == 0) { + this->manager.action = 1; gScreen.affine.bg3Updated = 0; gScreen.bg.bg1Updated = 0; sub_08052D74(this, sub_080576A0, 0); @@ -16,10 +28,63 @@ void Manager2_Main(Entity* this) { sub_0805754C(this); } -ASM_FUNC("asm/non_matching/manager2/sub_0805754C.inc", void sub_0805754C(Entity* this)) +void sub_0805754C(Manager2* this) { + s32 bgOffset; -ASM_FUNC("asm/non_matching/manager2/sub_080575C8.inc", void sub_080575C8(u32 param)) + bgOffset = (gRoomControls.roomScrollY - gRoomControls.roomOriginY); + bgOffset += bgOffset >> 3; + gScreen.affine.bg3yOffset = bgOffset & 0x3f; + gScreen.affine.bg3Tilemap = gMapDataTopSpecial + (bgOffset/0x40) * 0x200; + if (this->field_0x38 != gScreen.affine.bg3Tilemap) { + this->field_0x38 = gScreen.affine.bg3Tilemap; + gScreen.affine.bg3Updated = 1; + } + bgOffset = (gRoomControls.roomScrollY - gRoomControls.roomOriginY); + bgOffset += bgOffset >> 2; + gScreen.bg.bg1yOffset = bgOffset & 0x3f; + gScreen.bg.bg1Tilemap = gMapDataTopSpecial + 0x2000+ (bgOffset/0x40) * 0x200; + if (this->field_0x3c != gScreen.bg.bg1Tilemap) { + this->field_0x3c = gScreen.bg.bg1Tilemap; + gScreen.bg.bg1Updated = 1; + } +} -ASM_FUNC("asm/non_matching/manager2/sub_08057688.inc", void sub_08057688()) +void sub_080575C8(u32 param) { + s32 bgOffset; -ASM_FUNC("asm/non_matching/manager2/sub_080576A0.inc", void sub_080576A0()) + gUnk_0200B650 = 0; + *(u16*)0x4000000 = 0; + LoadGfxGroup(param); + gRoomVars.unk_10 = param; + + bgOffset = (gRoomControls.roomScrollY - gRoomControls.roomOriginY); + bgOffset += bgOffset >> 3; + gScreen.affine.bg3yOffset = bgOffset & 0x3f; + gScreen.affine.bg3xOffset = 0; + gScreen.affine.bg3Tilemap = &gMapDataTopSpecial[(bgOffset / 0x40) * 0x200]; + gScreen.affine.bg3Control = 0x1d49; + gScreen.affine.bg3Updated = 1; + + bgOffset = (gRoomControls.roomScrollY - gRoomControls.roomOriginY); + bgOffset += bgOffset >> 2; + gScreen.bg.bg1yOffset = bgOffset & 0x3f; + gScreen.bg.bg1xOffset = 0; + gScreen.bg.bg1Tilemap = &gMapDataTopSpecial[0x2000 + (bgOffset / 0x40) * 0x200]; + gScreen.bg.bg1Control = 0x1e49; + gScreen.bg.bg1Updated = 1; + gScreen.controls.layerFXControl = 0x3c48; + gScreen.controls.alphaBlend = 0x609; + gScreen.lcd.displayControl |= 0xa00; +} + +void sub_08057688(void) { + gScreen.affine.bg3Control = 0x1d48; + gScreen.bg.bg1Control = 0x1e48; +} + +void sub_080576A0(Manager2* this) { + LoadGfxGroup(gRoomVars.unk_10); + this->field_0x38 = NULL; + this->field_0x3c = NULL; + sub_0805754C(this); +}