summaryrefslogtreecommitdiff
path: root/src/manager
diff options
context:
space:
mode:
authornotyourav <65437533+notyourav@users.noreply.github.com>2022-02-09 15:46:53 -0800
committerGitHub <noreply@github.com>2022-02-09 15:46:53 -0800
commit8f76bdda649e66ae060f85ab9892843ef041d2bc (patch)
treed05401f97a3cc99f9dadb475d046cc503b9078fd /src/manager
parentd920a577961faaed1698bdaca4e353e10044b61c (diff)
parent51feb090e987d04880aef41f22510767489b0c1b (diff)
Merge pull request #363 from hatal175/manager22
Diffstat (limited to 'src/manager')
-rw-r--r--src/manager/manager22.c202
-rw-r--r--src/manager/managerF.c2
2 files changed, 195 insertions, 9 deletions
diff --git a/src/manager/manager22.c b/src/manager/manager22.c
index 5faa1a2c..4d6130cc 100644
--- a/src/manager/manager22.c
+++ b/src/manager/manager22.c
@@ -1,18 +1,204 @@
#include "manager.h"
+#include "area.h"
+#include "main.h"
+#include "screen.h"
+#include "player.h"
+#include "room.h"
+#include "coord.h"
+#include "functions.h"
+#include "common.h"
-ASM_FUNC("asm/non_matching/manager22/Manager22_Main.inc", void Manager22_Main())
+typedef struct {
+ Manager manager;
+ s32 unk20;
+} Manager22;
-ASM_FUNC("asm/non_matching/manager22/sub_0805BA78.inc", void sub_0805BA78())
+extern void sub_0801E120(void);
+extern void sub_0801E154(u32);
+extern u32 CheckRectOnScreen(s32, s32, u32, u32);
+extern void sub_0801E160(u32, u32, u32);
-ASM_FUNC("asm/non_matching/manager22/sub_0805BAD4.inc", void sub_0805BAD4())
+u32 sub_0805BA78();
+void sub_0805BAD4();
-ASM_FUNC("asm/non_matching/manager22/sub_0805BB00.inc", void sub_0805BB00())
+void Manager22_Main(Manager22* this) {
+ s32 sVar1;
+ u32 uVar3;
-ASM_FUNC("asm/non_matching/manager22/sub_0805BB74.inc", void sub_0805BB74())
+ if (gArea.unk_0b == 0) {
+ sub_0801E104();
+ gScreen.lcd.displayControl &= ~(DISPCNT_BG3_ON | DISPCNT_WIN0_ON);
+ DeleteThisEntity();
+ }
+ if (this->manager.action == 0) {
+ this->manager.action = 1;
+ this->manager.unk_10 |= 0x20;
+ this->manager.unk_0e = 17;
+ this->unk20 = 0;
+ SetDefaultPriority((Entity*)this, 6);
+ sub_0801E120();
+ sub_0801E154(this->manager.unk_0e);
+ }
+ if (gMain.substate == 2) {
+ gScreen.lcd.displayControl |= DISPCNT_BG3_ON;
+ sub_0805BA78();
+ sub_0805BAD4();
+ }
+ if (gArea.unk_0b == 2) {
+ gScreen.lcd.displayControl &= ~DISPCNT_WIN0_ON;
+ } else {
+ if (CheckRectOnScreen(gPlayerEntity.x.HALF.HI - gRoomControls.origin_x,
+ gPlayerEntity.y.HALF.HI - gRoomControls.origin_y, 0, 0)) {
+ gScreen.lcd.displayControl |= DISPCNT_WIN0_ON;
+ } else {
+ gScreen.lcd.displayControl &= ~DISPCNT_WIN0_ON;
+ }
+ uVar3 = this->manager.unk_0e;
+ if (((gPlayerState.flags & PL_USE_LANTERN)) && (gArea.unk_0b)) {
+ if (uVar3 < 0x48) {
+ uVar3 += 4;
+ sub_0801E154(uVar3);
+ this->unk20 = 0;
+ } else if ((gRoomTransition.frameCount & 3) == 0) {
+ this->manager.unk_0f += 0x10;
+ sVar1 = gSineTable[this->manager.unk_0f];
+ this->unk20 = sVar1 >> 7;
+ sub_0801E154(uVar3 + this->unk20);
+ }
+ } else {
+ this->unk20 = 0;
+ if (0x11 < uVar3) {
+ uVar3 -= 4;
+ if (uVar3 < 0x11) {
+ uVar3 = 0x11;
+ }
+ sub_0801E154(uVar3);
+ }
+ }
-ASM_FUNC("asm/non_matching/manager22/UpdateLightLevel.inc", void UpdateLightLevel())
+ this->manager.unk_0e = uVar3;
+ sub_0801E160(gPlayerEntity.x.HALF.HI - gRoomControls.scroll_x,
+ gPlayerEntity.y.HALF.HI - gRoomControls.scroll_y - 9 + gPlayerEntity.z.HALF.HI,
+ uVar3 + this->unk20);
+ }
+}
-ASM_FUNC("asm/non_matching/manager22/sub_0805BC04.inc", void sub_0805BC04())
+#define ABS(x) ((unsigned)(x < 0 ? -(x) : x))
-ASM_FUNC("asm/non_matching/manager22/sub_0805BC4C.inc", void sub_0805BC4C())
+u32 sub_0805BA78() {
+ u32 uVar1;
+ s32 iVar1;
+ s32 iVar2;
+
+ iVar2 = (short)gArea.lightLevel;
+ iVar1 = gRoomVars.lightLevel;
+
+ if (iVar1 < 0) {
+ iVar1 = 0;
+ }
+
+ if (0x100 < iVar1) {
+ iVar1 = 0x100;
+ }
+
+ if (iVar2 != iVar1) {
+ if (ABS(iVar1 - iVar2) <= 4) {
+ iVar2 = iVar1;
+ } else {
+ if (iVar1 < iVar2) {
+ iVar2 = iVar2 - 4;
+ } else {
+ if (iVar1 > iVar2) {
+ iVar2 = iVar2 + 4;
+ }
+ }
+ }
+ gArea.lightLevel = iVar2;
+ } else {
+ return 0;
+ }
+ return 1;
+}
+
+extern u16 gUnk_08108CA8[];
+
+void sub_0805BAD4() {
+ static const u16 gUnk_08108CA8[] = { 0x10, 0x10f, 0x20e, 0x30d, 0x40c, 0x50b, 0x60a, 0x709, 0x808,
+ 0x907, 0xa06, 0xb05, 0xc04, 0xd03, 0xe02, 0xf01, 0x1000, 0x00 };
+ if (gArea.unk_0b) {
+ gScreen.controls.alphaBlend = gUnk_08108CA8[(gArea.lightLevel << 0x10) >> 0x14];
+ }
+}
+
+void sub_0805BB00(s32 lightLevel, s32 param_2) {
+ if (gArea.unk_0b == 0) {
+ Manager* pManager = GetEmptyManager();
+ if (pManager != 0) {
+ pManager->type = 9;
+ pManager->subtype = 34;
+ AppendEntityToList((Entity*)pManager, 0);
+ }
+ }
+ MemFill16(0xf, BG_SCREEN_ADDR(0x1E), BG_SCREEN_SIZE);
+ gScreen.bg3.control = 0x1e0c;
+ gScreen.controls.layerFXControl = 0x3e48;
+ gRoomVars.lightLevel = lightLevel;
+ if (param_2) {
+ gArea.unk_0b = 1;
+ } else {
+ gArea.unk_0b = 2;
+ }
+}
+
+void sub_0805BB74(s32 lightLevel) {
+ Manager22* manager;
+
+ if (lightLevel < 0) {
+ lightLevel = gRoomVars.lightLevel;
+ }
+ gArea.lightLevel = lightLevel;
+ gRoomVars.lightLevel = gArea.lightLevel;
+ manager = (Manager22*)DeepFindEntityByID(9, 0x22);
+ if (manager) {
+ Manager22_Main(manager);
+ gScreen.lcd.displayControl |= DISPCNT_BG3_ON;
+ sub_0805BA78();
+ sub_0805BAD4();
+ }
+}
+
+s32 UpdateLightLevel() {
+ s32 iVar1;
+
+ iVar1 = 0;
+ if (gArea.unk_0b && gRoomVars.lightLevel < (s16)gArea.lightLevel) {
+ gScreen.lcd.displayControl |= DISPCNT_BG3_ON;
+ iVar1 = sub_0805BA78();
+ if (iVar1) {
+ sub_0805BAD4();
+ }
+ }
+ return iVar1;
+}
+
+s32 sub_0805BC04(void) {
+ s32 iVar1;
+
+ iVar1 = 0;
+ if (gArea.unk_0b && gRoomVars.lightLevel > (short)gArea.lightLevel) {
+ gScreen.lcd.displayControl |= DISPCNT_BG3_ON;
+ iVar1 = sub_0805BA78();
+ if (iVar1) {
+ sub_0805BAD4();
+ }
+ }
+ return iVar1;
+}
+
+void sub_0805BC4C() {
+ if (gArea.unk_0b != 0) {
+ gArea.unk_0b = 0;
+ gScreen.lcd.displayControl &= ~(DISPCNT_BG3_ON | DISPCNT_WIN0_ON);
+ }
+}
diff --git a/src/manager/managerF.c b/src/manager/managerF.c
index 39f3ca47..f1cc1aca 100644
--- a/src/manager/managerF.c
+++ b/src/manager/managerF.c
@@ -280,7 +280,7 @@ void sub_08059220(ManagerF* this) {
}
if (!this->manager.action) {
this->manager.action = 1;
- gArea.unk_0a = gRoomVars.lightLevel;
+ gArea.lightLevel = gRoomVars.lightLevel;
}
}