diff options
| author | notyourav <65437533+notyourav@users.noreply.github.com> | 2020-12-15 21:01:50 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-12-15 21:01:50 -0800 |
| commit | bf60d346653e2ea42b660e05ec2effea8060fe9a (patch) | |
| tree | 7485b8ca4e2efce9a08b7cff691118def7daf2c0 /src | |
| parent | b876bbc28e3b5804ddda433238e9dac46f11809b (diff) | |
| parent | e7a185298c8833d9124b8d02719cb76b134e81f5 (diff) | |
Merge pull request #105 from Ibot02:managerC
managerC.c: ok
Diffstat (limited to 'src')
| -rw-r--r-- | src/manager/managerC.c | 336 |
1 files changed, 336 insertions, 0 deletions
diff --git a/src/manager/managerC.c b/src/manager/managerC.c new file mode 100644 index 00000000..b2571591 --- /dev/null +++ b/src/manager/managerC.c @@ -0,0 +1,336 @@ +#include "global.h" +#include "manager.h" +#include "flags.h" +#include "structures.h" +#include "room.h" +#include "area.h" +#include "screen.h" +#include "trig.h" +#include "functions.h" + + +typedef struct { + Manager manager; + s32 unk_20; + union SplitWord unk_24; + u32 unk_28; + u32 unk_2c; + u8 unk_30[0x10]; +} ManagerC; + +typedef struct { + u16 unk_0; + u16 unk_2; + u16 unk_4; + u16 unk_6; +} struct_08108228; + +void (* const gUnk_0810821C[])(ManagerC*); +const struct_08108228 gUnk_08108228[6]; +const struct_08108228 gUnk_08108258[6]; +const struct_08108228 gUnk_08108288[6]; +const struct_08108228 gUnk_081082B8[6]; +const u16 gUnk_081082E8[0xC]; +const u16 gUnk_08108300[4]; + +void sub_08058BC8(ManagerC*); +void sub_08058CB0(ManagerC*); +void sub_08058CFC(void); +void sub_08058A04(ManagerC*); +void sub_080588F8(ManagerC*); +u32 sub_08058B08(ManagerC*, u32, u32, const struct_08108228*); +void sub_08058B5C(ManagerC*, u32); +void sub_08058D34(void); + +extern void sub_0805622C(struct BgAffineDstData*, u32, u32); +extern void sub_08052D74(void*, void*, void*); +extern void sub_080044AE(Entity*, u32, u32); +extern void _DmaCopy(const void* src, void* dest, u32 size); + +extern u8 gUnk_03003DE4[0xC]; + +extern struct BgAffineDstData gUnk_02017AA0[]; +extern struct BgAffineDstData gUnk_02017BA0[]; +extern u8 gUnk_02017700[]; +extern u8 gUnk_02000070; +extern u32 gUsedPalettes; + +void sub_08058894(ManagerC*); +void sub_080588CC(ManagerC*); +void nullsub_108(ManagerC*); + +void (* const gUnk_0810821C[])(ManagerC*) = { + sub_08058894, + sub_080588CC, + nullsub_108 +}; + +void sub_0805884C(ManagerC* this) { + u32 tmp; + gUnk_0810821C[this->manager.action](this); + sub_08058BC8(this); + sub_0805622C(&gUnk_02017AA0[gUnk_03003DE4[0] * 0xA0], 0x04000020, 0xA2600008); +} +void sub_08058894(ManagerC* this) { + this->manager.action = 1; + this->unk_28 = 0x1234; + this->manager.unk_0e = CheckLocalFlags(0x15, 0x2) != 0; + sub_08058CB0(this); + sub_08052D74(this, sub_08058D34, 0); +} + +void sub_080588CC(ManagerC* this) { + sub_08058CFC(); + sub_08058A04(this); + if (gScreenTransition.transitioningOut) { + this->manager.action = 2; + } else { + sub_080588F8(this); + } +} + +void nullsub_108(ManagerC* this) {} + +#define ABS_DIFF_GT(a, b, c) (signed) a - b >= 0 ? a - b > c : b - a > c + +void sub_080588F8(ManagerC* this) { + if (this->manager.unk_0f == 0) { + if (ABS_DIFF_GT(this->unk_28, this->unk_24.HALF.HI, 8)) { + this->unk_28 = 0x1234; + switch (this->unk_24.HALF.HI & 0xFFFE) { + case 0x48: + case 0xa0: + case 0xf0: + this->unk_28 = this->unk_24.HALF.HI; + this->manager.unk_0f = 0x2D; + PlaySFX(0x8c); + } + } + } else { + this->manager.unk_0f--; + if (this->manager.unk_0f > 0x29) { + this->unk_24.HALF.HI = this->unk_28 - 2; + } else { + this->unk_24.HALF.HI = this->unk_28; + } + } + if (this->manager.unk_0e) { + s32 tmp = gPlayerEntity.y.HALF.HI - gRoomControls.roomOriginY; + u32 tmp2; + tmp2 = (((unsigned)(tmp - 0x50 < 0 ? 0x50 - tmp : tmp - 0x50) >> 3) * 0x3000) + 0x4000; + if (this->manager.unk_0f == 0) { + if (tmp < 0x49) { + this->unk_24.WORD -= tmp2; + } else if (tmp > 0x57) { + this->unk_24.WORD += tmp2; + } + if (ABS_DIFF_GT(this->unk_2c, this->unk_24.WORD, 0x100000)) { + this->unk_2c = this->unk_24.WORD; + PlaySFX(0x8b); + } + } + } + if ((this->unk_20 = this->unk_24.HALF.HI) < 0) { + this->unk_20 = 0x1FF; + this->unk_24.HALF.HI = 0x1FF; + } else if (this->unk_20 > 0x1FF) { + this->unk_20 = 0; + this->unk_24.HALF.HI = 0; + } +} + +const struct_08108228 gUnk_08108228[6] = { + {0x40, 0x2A, 0x1C, 0x10}, + {0x3C, 0x24, 0x1C, 0x12}, + {0x3C, 0x1C, 0x1A, 0x18}, + {0x38, 0x16, 0x1C, 0x16}, + {0x34, 0x16, 0x1E, 0x0E}, + {0x30, 0x16, 0x20, 0x0A} +}; + +const struct_08108228 gUnk_08108258[6] = { + {0x30, 0x88, 0x20, 0x0A}, + {0x34, 0x7E, 0x1E, 0x12}, + {0x38, 0x78, 0x1A, 0x16}, + {0x3A, 0x70, 0x1A, 0x18}, + {0x3C, 0x64, 0x1E, 0x1E}, + {0x3E, 0x6A, 0x1C, 0x10} +}; + +const struct_08108228 gUnk_08108288[6] = { + {0x98, 0x2A, 0x1C, 0x10}, + {0x98, 0x24, 0x1C, 0x12}, + {0x9C, 0x1C, 0x1A, 0x18}, + {0x9C, 0x16, 0x1C, 0x16}, + {0xA0, 0x16, 0x1E, 0x0E}, + {0xA0, 0x16, 0x20, 0x0A} +}; + +const struct_08108228 gUnk_081082B8[6] = { + {0xA0, 0x88, 0x20, 0x0A}, + {0x9E, 0x7E, 0x1E, 0x12}, + {0x9C, 0x78, 0x1A, 0x16}, + {0x9A, 0x70, 0x1A, 0x18}, + {0x98, 0x64, 0x1E, 0x1E}, + {0x98, 0x6A, 0x1C, 0x10} +}; + +void sub_08058A04(ManagerC* this) { + s32 tmp = gPlayerEntity.x.HALF.HI - gRoomControls.roomOriginX; + s32 tmp2 = gPlayerEntity.y.HALF.HI - gRoomControls.roomOriginY; + if ((this->unk_20 - 0x118 < 0xDu) && + CheckGlobalFlag(LV1TARU_OPEN) && + (tmp - 0x6d < 0x17u) && + (tmp2 - 0x45 < 0x17u) && + (gPlayerEntity.height.HALF.HI == 0)) { + gPlayerState.playerAction = 3; + gPlayerState.field_0x38 = 0; + gPlayerEntity.x.HALF.HI = gRoomControls.roomOriginX + 0x78; + gPlayerEntity.y.HALF.HI = gRoomControls.roomOriginY + 0x50; + return; + } + if (tmp < 0x78) { + if (tmp2 < 0x50) { + if (sub_08058B08(this, 0x88, 0xB0, gUnk_08108228)) { + sub_08058B5C(this, 0); + } + } else { + if (sub_08058B08(this, 0x38, 0x60, gUnk_08108258)) { + sub_08058B5C(this, 1); + } + } + } else { + if (tmp2 < 0x50) { + if (sub_08058B08(this, 0xE0, 0x108, gUnk_08108288)) { + sub_08058B5C(this, 2); + } + } else { + if (sub_08058B08(this, 0x90, 0xB8, gUnk_081082B8)) { + sub_08058B5C(this, 3); + } + } + } +} + +u32 sub_08058B08(ManagerC* this, u32 unk1, u32 unk2, const struct_08108228* unk3) { + u32 tmp = this->unk_20; + if (tmp < unk1 || tmp > unk2) { + return 0; + } else { + u32 tmp2, tmp3; + tmp -= unk1; + tmp >>= 3; + unk3 += tmp; + tmp2 = (gPlayerEntity.x.HALF.HI - gRoomControls.roomOriginX - unk3->unk_0); + tmp3 = (gPlayerEntity.y.HALF.HI - gRoomControls.roomOriginY - unk3->unk_2); + return ((tmp2 < unk3->unk_4) && (tmp3 < unk3->unk_6)); + } +} + +const u16 gUnk_081082E8[0xC] = { + 0xB8, 0x80, 0x0, + 0xB8, 0x110, 0x2, + 0x118, 0x80, 0x2, + 0x118, 0x110, 0x0 +}; + +void sub_08058B5C(ManagerC* this, u32 unk1) { + gScreenTransition.transitioningOut = 1; + gScreenTransition.transitionType = 0; + gScreenTransition.field_0xf = 4; + gScreenTransition.areaID = gRoomControls.areaID; + gScreenTransition.roomID = 6; + gScreenTransition.playerState = unk1 & 1 ? 4 : 0; + gScreenTransition.playerStartPos.HALF.x = gUnk_081082E8[unk1*3]; + gScreenTransition.playerStartPos.HALF.y = gUnk_081082E8[unk1*3+1]; + gUnk_02002A40.unk7 = gUnk_081082E8[unk1*3+2]; + PlaySFX(0x121); +} + +void sub_08058BC8(ManagerC* this) { + struct BgAffineDstData * tmp = &gUnk_02017AA0[gUnk_03003DE4[0]*0xA0]; + struct BgAffineSrcData tmp2; + s32 tmp3; + tmp2.texX = 0x10000; + tmp2.scrX = 0x78; + tmp2.scrY = 0x80; + tmp2.alpha = 0; + tmp2.sy = 0x100; + tmp2.sx = 0x100; + tmp3 = 0; + do { + u32 indx = ((tmp3 << 7) / 0xA0) & 0xFF; + tmp2.sx = 0x100 + ((gSineTable[indx] * 3) >> 2); + tmp2.sy = 0x100 - ((gSineTable[indx * 2] * 2) >> 5);//yes, it makes no sense to multiply first and then shift right, but it's matching this way + tmp2.texY = (this->unk_20 + tmp3) << 8; + BgAffineSet(&tmp2, tmp, 1); + tmp++; + } while (++tmp3<0xA0u); + tmp = &gUnk_02017BA0[gUnk_03003DE4[0]*0xA0]; + gScreen.controls.bg2dx = tmp->pa; + gScreen.controls.bg2dmx = tmp->pb; + gScreen.controls.bg2dy = tmp->pc; + gScreen.controls.bg2dmy = tmp->pd; + gScreen.controls.bg2xPointLeastSig = ((union SplitWord *) &tmp->dx)->HALF.LO; + gScreen.controls.bg2xPointMostSig = ((union SplitWord *) &tmp->dx)->HALF.HI; + gScreen.controls.bg2yPointLeastSig = ((union SplitWord *) &tmp->dy)->HALF.LO; + gScreen.controls.bg2yPointMostSig = ((union SplitWord *) &tmp->dy)->HALF.HI; +} + +const u16 gUnk_08108300[4] = { + 0xA4, 0x4C, 0xF4, 0x9C +}; + +void sub_08058CB0(ManagerC* this) { + u32 tmp = gPlayerEntity.x.HALF.HI - gRoomControls.roomOriginX; + u32 tmp2 = gPlayerEntity.y.HALF.HI - gRoomControls.roomOriginY; + u32 tmp3; + if (tmp < 0x78) { + tmp3 = 1; + if (tmp2 < 0x50) { + tmp3 = 0; + } + } else { + tmp3 = 3; + if (tmp2 < 0x50) { + tmp3 = 2; + } + } + this->unk_24.HALF.HI = this->unk_20 = gUnk_08108300[tmp3]; +} + +void sub_08058CFC() { + u32 tmp = gPlayerEntity.y.HALF.HI - gRoomControls.roomScrollY; + if (tmp < 0x4C) { + sub_080044AE(&gPlayerEntity, 0xC0, 0x10); + } + if (tmp > 0x54) { + sub_080044AE(&gPlayerEntity, 0xC0, 0); + } +} + +#ifdef NON_MATCHING +void sub_08058D34() { + LoadPaletteGroup(0x28); + _DmaCopy(gUnk_02017700, gUnk_02017700 + 0x240, 0x20); + gUsedPalettes |= 0x200000; + LoadGfxGroup(0x16); + gScreen.lcd.displayControl |= 1; + gScreen.affine.bg2Control = 0xBC82; + gScreen.bg.bg1xOffset = 0x5E86; + gScreen.bg.bg1yOffset = 0; + gScreen.bg.bg2xOffset = 0; + gScreen.controls.layerFXControl = 0x3456; + gScreen.controls.alphaBlend = 0x909; + gArea.musicIndex = gArea.pMusicIndex; + gUnk_02000070 = 0; + if (CheckGlobalFlag(LV1TARU_OPEN)) { + LoadGfxGroup(0x4A); + } +} +#else +NAKED +void sub_08058D34() { + asm(".include \"asm/non_matching/managerC/sub_08058D34.inc\""); +} +#endif |
