diff options
| author | 21aslade <21aslade@go.dsdmail.net> | 2020-11-07 15:22:02 -0700 |
|---|---|---|
| committer | 21aslade <21aslade@go.dsdmail.net> | 2020-11-07 15:22:02 -0700 |
| commit | d04dc143fbbef8feef61daf39d110703f4dfda9b (patch) | |
| tree | 626b7ee4279b2224aa06bef8231fd6daa4363998 /src/manager | |
| parent | 4b6f822829d6dd771ed995030f1bf1d24f204536 (diff) | |
| parent | f1bfe499de0afdd8e93c5e3e0e6c9e12b3343e1b (diff) | |
Merge branch 'master' of https://github.com/zeldaret/tmc
Diffstat (limited to 'src/manager')
| -rw-r--r-- | src/manager/manager15.c | 495 | ||||
| -rw-r--r-- | src/manager/manager1A.c | 223 | ||||
| -rw-r--r-- | src/manager/manager20.c | 38 | ||||
| -rw-r--r-- | src/manager/manager30.c | 98 | ||||
| -rw-r--r-- | src/manager/manager5.c | 129 | ||||
| -rw-r--r-- | src/manager/manager7.c | 166 | ||||
| -rw-r--r-- | src/manager/manager8.c | 137 | ||||
| -rw-r--r-- | src/manager/managerB.c | 119 |
8 files changed, 1366 insertions, 39 deletions
diff --git a/src/manager/manager15.c b/src/manager/manager15.c new file mode 100644 index 00000000..c4d1f8b0 --- /dev/null +++ b/src/manager/manager15.c @@ -0,0 +1,495 @@ +#include "global.h" +#include "flags.h" +#include "screen.h" +#include "manager.h" +#include "functions.h" + +typedef struct { + Manager manager; + u8 unk_20; + u8 unk_21; + u8 unk_22; + u8 unk_23;//used + u16 unk_24; + u16 unk_26; + void* unk_28; + u16 unk_2c; + u8 unk_2e[0x6]; + s16 unk_34; + s16 unk_36; + s16 unk_38; + s16 unk_3a; + u16 unk_3c; + u16 unk_3e;//used +} Manager15; + +extern void (*const gUnk_081085D8[])(Manager*); + +void sub_0805A280(Manager* this) { + gUnk_081085D8[this->unk_0a](this); +} + + +void sub_0805A89C(Manager15*); +void sub_0805A8EC(Manager15*); +void sub_0805AAF0(u32); + +void sub_0805A298(Manager15* this) { + if (this->manager.action == 0) { + sub_0805A89C(this); + if (!CheckLocalFlag(this->unk_3e)) { + this->unk_23 = 1; + } else { + this->unk_23 = 2; + } + sub_0805AAF0(this->unk_23); + gScreen.lcd.displayControl |= 0x4800; + } + sub_0805A8EC(this); +} + +extern void (*const gUnk_081085F8[])(Manager15*); + +void sub_0805A2E4(Manager15* this) { + if (this->manager.action == 0) { + sub_0805A89C(this); + this->unk_23 = 1; + sub_0805AAF0(1); + if (!CheckLocalFlag(this->unk_3e)) { + this->manager.action = 1; + gScreen.lcd.displayControl &= 0xB7FF; + } else { + if (CheckLocalFlag(0x48)) { + this->manager.action = 4; + } else { + this->manager.action = 3; + } + gScreen.lcd.displayControl |= 0x4800; + } + } else { + gUnk_081085F8[this->manager.action](this); + } + if (this->manager.next) { + sub_0805A8EC(this); + } +} + +extern Entity gUnk_080E4C08; + +void sub_0805A370(Manager15* this) { + if (this->manager.unk_0d) { + LoadRoomEntityList(&gUnk_080E4C08); + this->manager.action = 3; + PlaySFX(0x80100000); + } +} + +void sub_0805A394(Manager15* this) { + Entity* ent; + if ((ent = FindEntityInListBySubtype(0x3,0x13,0x4))) { + if (ent->entityType.form != 4) { + return; + } + } + SetLocalFlag(0x48); + ClearRoomFlag(0); + gScreen.lcd.displayControl &= 0xB7FF; + DeleteThisEntity(); +} + +void nullsub_496(Manager15* this) { +} + +extern void (*const gUnk_0810860C[])(Manager15*); + +void sub_0805A3D4(Manager15* this) { + if (this->manager.action == 0) { + sub_0805A89C(this); + if (this->manager.unk_0a == 3) { + this->unk_23 = 2; + } else { + this->unk_23 = 1; + } + sub_0805AAF0(this->unk_23); + if (!CheckLocalFlag(this->unk_3e)) { + ClearFlag(this->unk_3c); + this->manager.action = 1; + gScreen.lcd.displayControl &= 0xB7FF; + } else { + SetFlag(this->unk_3c); + this->manager.action = 3; + gScreen.lcd.displayControl |= 0x4800; + } + } else { + gUnk_0810860C[this->manager.action](this); + } + sub_0805A8EC(this); +} + +void sub_0805A4CC(Manager15*, u32); + +void sub_0805A464(Manager15* this) { + if (CheckLocalFlag(this->unk_3e)) { + this->manager.action = 2; + sub_0805A4CC(this, 0); + } +} + +void sub_0805A480(Manager15* this) { + if (this->manager.unk_0d != 0) { + this->manager.action = 3; + SetFlag(this->unk_3c); + } +} + +void sub_0805A498(Manager15* this) { + if (!CheckLocalFlag(this->unk_3e)) { + this->manager.action = 4; + sub_0805A4CC(this, 1); + } +} + +void sub_0805A4B4(Manager15* this) { + if (this->manager.unk_0d != 0) { + this->manager.action = 1; + ClearFlag(this->unk_3c); + } +} + +void sub_0805A4CC(Manager15* this, u32 unk_0) { + Entity* tmp; + tmp = CreateObject(0x8e, unk_0, 0); + if (tmp) { + tmp->x.HALF.HI = this->unk_38 + gRoomControls.roomOriginX; + tmp->y.HALF.HI = this->unk_3a + gRoomControls.roomOriginY - 0x30; + tmp->parent = (Entity*) this; + this->manager.unk_0d = 0; + } +} + +extern void (*const gUnk_08108620[])(Manager15*); +void sub_0805AA58(Manager15*); +void sub_0805A9CC(Manager15*); + +void sub_0805A500(Manager15* this) { + if (this->manager.action == 0) { + sub_0805A89C(this); + this->unk_28 = 0; + if (CheckLocalFlag(0x36)) { + this->unk_23 = 3; + this->manager.action = 5; + gScreen.lcd.displayControl |= 0x4800; + } else { + if (CheckLocalFlag(0x34)) { + this->unk_23 = 4; + this->manager.action = 3; + gScreen.lcd.displayControl |= 0x4800; + } else { + this->unk_23 = 4; + this->manager.action = 1; + gScreen.lcd.displayControl &= 0xB7FF; + } + } + sub_0805AAF0(this->unk_23); + } else { + gUnk_08108620[this->manager.action](this); + } + sub_0805AA58(this); + sub_0805A9CC(this); + if (gRoomControls.unk2 == 1) { + gScreen.lcd.displayControl |= 0x80<<7; + this->manager.unk_0d = 1; + return; + } + if (!this->manager.unk_0d) return; + this->manager.unk_0d = 0; + if (this->unk_20 == gRoomControls.roomID) return; + gScreen.lcd.displayControl &= 0xB7FF; + DeleteThisEntity(); +} + +void sub_0805A5FC(Manager15* this) { + if (CheckLocalFlag(0x34)) { + this->manager.action = 2; + sub_0805A4CC(this,2); + } +} + +void sub_0805A618(Manager15* this) { + if (this->manager.unk_0d) { + this->manager.action = 3; + } +} + +void sub_0805A628(Manager15* this) { + if (CheckLocalFlag(0x36)) { + this->manager.action = 4; + this->unk_23 = 3; + sub_0805A4CC(this,3); + } +} + +void sub_0805A64C(Manager15* this) { + if (this->manager.unk_0d) { + this->manager.action = 5; + } +} + +void sub_0805A65C(Manager15* this) {} +void sub_0805A660(Manager15* this) {} + +extern void (*const gUnk_08108638[])(Manager15*); +void sub_0805A68C(Manager15*); + +void sub_0805A664(Manager15* this) { + gUnk_08108638[this->manager.action](this); + sub_0805A8EC(this); + sub_0805A68C(this); +} + +extern u32 sub_0806FBFC(u32, u32, u32, u32); + +void sub_0805A68C(Manager15* this) { + if (sub_0806FBFC(this->unk_38 - 0x18, this->unk_3a - 0x18, 0x30, 0x30)) { + if (this->unk_2c <= 0x1007) { + gScreen.controls.alphaBlend = ++this->unk_2c; + this->unk_22 = 0; + } + } else { + if (this->unk_2c > 0x1000) { + this->unk_2c--; + } + gScreen.controls.alphaBlend=this->unk_2c; + } +} + +u32 sub_0805A73C(Manager15*); + +void sub_0805A6E8(Manager15* this) { + u16 tmp; + sub_0805A89C(this); + this->unk_23 = 0; + sub_0805AAF0(0); + this->unk_38 += gRoomControls.roomOriginX; + this->unk_3a += gRoomControls.roomOriginY; + if (!sub_0805A73C(this)) { + this->manager.action++; + } + this->unk_2c = 0x1000; + tmp = gScreen.lcd.displayControl | 0x4800; + gScreen.lcd.displayControl = tmp; +} + +u32 sub_0805A73C(Manager15* this) { + return sub_0806FBFC(this->unk_38 - 0x6, this->unk_3a - 0x6, 0xC, 0xC); +} + +void sub_0805A758(Manager15* this) { + if (!sub_0805A73C(this)) { + this->manager.action++; + } +} + +extern u8 gUnk_02034490; +extern void sub_0805E4E0(Manager*, u32); +extern void sub_08077B20(void); + +void sub_0805A76C(Manager15* this) { + if ((gPlayerEntity.currentHealth != 0) + && (gPlayerEntity.height.HALF.HI == 0) + && (!gPlayerState.field_0x2c) + ) { + switch (gPlayerState.field_0xa9) { + case 1: + case 0: + if (sub_0805A73C(this)) { + this->manager.action++; + sub_08004168(&gPlayerEntity); + gPlayerEntity.animationState = 4; + sub_0805E4E0(&this->manager, 0x258); + sub_08078A90(0xFF); + gUnk_02034490 = 1; + gRoomControls.cameraTarget = 0; + sub_08077B20(); + } + } + } +} + +void sub_0805A7E4(Manager15* this) { + if (gPlayerState.playerAction != 0x12) { + gPlayerState.playerAction = 0x12; + gPlayerState.field_0x38 = 0; + gPlayerState.field_0x39 = 0; + } +} + +void sub_0805A804(Manager15* this) { + switch (this->manager.action) { + case 0: + if (CheckLocalFlag(this->unk_3e)) { + this->manager.action = 1; + } else { + this->manager.action = 2; + } + this->manager.unk_0d = 1; + this->manager.unk_10 |= 0x20; + sub_0805E3A0(this, 6); + break; + case 1: + if (CheckLocalFlag(this->unk_3e)) break; + this->manager.action = 2; + sub_0805A4CC(this,4); + break; + case 2: + if (this->manager.unk_0d) { + this->manager.action = 3; + } + break; + case 3: + if (!CheckLocalFlag(this->unk_3e)) break; + this->manager.action = 4; + sub_0805A4CC(this,4); + break; + case 4: + if (this->manager.unk_0d) { + this->manager.action = 1; + } + break; + default: + DeleteThisEntity(); + } +} + +void sub_0805AAC8(Manager15*); +extern void sub_08052D74(void*, void*, void*); + +void sub_0805A89C(Manager15* this) { + sub_0805E3A0(this, 6); + this->manager.action = 1; + this->manager.unk_10 |= 0x20; + this->manager.unk_0e = 8; + this->manager.unk_0f = 0x10; + this->unk_21 = 0; + this->unk_22 = 0; + this->unk_20 = gRoomControls.roomID; + this->unk_24 = gRoomControls.roomOriginX; + this->unk_26 = gRoomControls.roomOriginY; + sub_08052D74(this, sub_0805AAC8, 0); +} + +void sub_0805A94C(Manager15* this); + +void sub_0805A8EC(Manager15* this) { + sub_0805AA58(this); + sub_0805A94C(this); + if (gRoomControls.unk2 == 1) { + gScreen.lcd.displayControl |= 0x4000; + this->manager.unk_0d = 1; + } else { + if (!this->manager.unk_0d) return; + this->manager.unk_0d = 0; + if (this->unk_20 == gRoomControls.roomID) return; + gScreen.lcd.displayControl &= 0xB7FF; + DeleteThisEntity(); + } +} + +void sub_0805A94C(Manager15* this) { + int tmp1, tmp2; + gScreen.affine.bg3xOffset = gRoomControls.roomScrollX - this->unk_24 + this->unk_34; + gScreen.affine.bg3yOffset = gRoomControls.roomScrollY - this->unk_26 + this->unk_36; + tmp1 = -gScreen.affine.bg3xOffset; + tmp2 = tmp1 + 0x100; + if (tmp1 < 0) tmp1 = 0; + if (tmp1 > 0xF0) tmp1 = 0xF0; + if (tmp2 < 0) tmp2 = 0; + if (tmp2 > 0xF0) tmp2 = 0xF0; + gScreen.controls.window1HorizontalDimensions = (tmp1 << 8 | tmp2); + tmp1 = -gScreen.affine.bg3yOffset; + tmp2 = tmp1 + 0x100; + if (tmp1 < 0) tmp1 = 0; + if (tmp1 > 0xA0) tmp1 = 0xA0; + if (tmp2 < 0) tmp2 = 0; + if (tmp2 > 0xA0) tmp2 = 0xA0; + gScreen.controls.window1VerticalDimensions = (tmp1 << 8 | tmp2); +} + +extern u8 gUnk_02001A40[]; + +#ifdef NON_MATCHING +void sub_0805A9CC(Manager15* this) { + int tmp1, tmp2; + void* tmp3; + gScreen.affine.bg3xOffset = gRoomControls.roomScrollX - this->unk_24 + this->unk_34; + tmp1 = -gScreen.affine.bg3xOffset; + tmp2 = tmp1 + 0x100; + if (tmp1 < 0) tmp1 = 0; + if (tmp1 > 0xF0) tmp1 = 0xF0; + if (tmp2 < 0) tmp2 = 0; + if (tmp2 > 0xF0) tmp2 = 0xF0; + gScreen.controls.window1HorizontalDimensions = tmp1 << 8 | tmp2; + tmp1 = gRoomControls.roomScrollY - this->unk_26 + this->unk_36; + gScreen.affine.bg3yOffset = tmp1 & 0x3F; + if (tmp1 < 0) tmp1 += 0x3F; + tmp3 = (&gUnk_02001A40[(tmp1 >> 6 << 9)]); + gScreen.affine.unk5 = (u32) tmp3; + gScreen.controls.window1VerticalDimensions = 0xa0; + if (this->unk_28 == tmp3) return; + this->unk_28 = tmp3; + gScreen.affine.unk4 = 1; +} +#else +NAKED +void sub_0805A9CC(Manager15* this) { + asm(".include \"asm/non_matching/manager15/sub_0805A9CC.inc\""); +} +#endif + +extern struct { + u8 unk_00[0x20]; +} gUnk_085A97A0[]; +extern u16 gUnk_081085B8[]; +extern void LoadPalettes(const u8*, u32, u32); + +void sub_0805AA58(Manager15* this) { + if (--this->manager.unk_0e == 0) { + this->manager.unk_0e = 8; + this->unk_21 += 1; + this->unk_21 &= 3; + LoadPalettes(gUnk_085A97A0[this->unk_21].unk_00,5,1); + } + if (--this->manager.unk_0f == 0) { + this->manager.unk_0f = 0x10; + this->unk_22 += 1; + this->unk_22 &= 0xF; + gScreen.controls.alphaBlend = gUnk_081085B8[this->unk_22]; + } +} + +void sub_0805AAC8(Manager15* this) { + sub_0805AAF0(this->unk_23); + sub_0805A280(&this->manager); +} + + +extern u16 gUnk_08108648[]; + +void sub_0805AADC(u32 unk0) { + LoadGfxGroup(gUnk_08108648[unk0]); +} + +void sub_0805AAF0(u32 unk0) { + sub_0805AADC(unk0); + gScreen.controls.layerFXControl = 0x3E48; + gScreen.controls.alphaBlend = 0x1008; + gScreen.affine.bg3Control = 0x1E04; + gScreen.affine.unk5 = &gUnk_02001A40; + gScreen.affine.bg3xOffset = 0; + gScreen.affine.bg3yOffset = 0; + gScreen.affine.unk4 = 1; + gScreen.controls.windowInsideControl = 0x3F3F; + gScreen.controls.windowOutsideControl = 0x37; + gScreen.controls.window1HorizontalDimensions = 0xF0; + gScreen.controls.window1VerticalDimensions = 0xA0; +} diff --git a/src/manager/manager1A.c b/src/manager/manager1A.c new file mode 100644 index 00000000..ff6d8afe --- /dev/null +++ b/src/manager/manager1A.c @@ -0,0 +1,223 @@ +#include "global.h" +#include "manager.h" +#include "flags.h" +#include "entity.h" +#include "room.h" +#include "screen.h" +#include "functions.h" + + +typedef struct { + Manager manager; + s16 unk_20; + s16 unk_22; + u16 unk_24; + u16 unk_26; + u8 unk_28[8]; + u16 unk_30; + u16 unk_32; + u16 unk_34; + u16 unk_36; + u8 unk_38[7]; + u8 unk_3f; +} Manager1A; + +extern void (*const gUnk_08108668[])(Manager1A*); + +extern u8 gGlobalGfxAndPalettes[]; + +void sub_0805B030(Manager1A* this) { + gUnk_08108668[this->manager.action](this); +} + +extern void sub_08052D74(void*, void*, void*); +extern u32 sub_0806FBFC(u32, u32, u32, u32); + +typedef struct struct_08108764 { + u8 unk_00; + u8 unk_01;//area ID? + u8 unk_02;//room ID? + u8 unk_03;//layer? + u16 unk_04; + u16 unk_06; + u8 unk_08; + u8 unk_09; + u8 unk_0a; + u8 unk_0b; + struct { + u32 unk_00; + u16 unk_04; + u16 unk_06; + u16 unk_08; + u16 unk_0a; + }* unk_0c; + struct { + u8 unk_00; + u8 unk_01; + u8 unk_02[2]; + u16 unk_04; + u16 unk_06; + }* unk_10; +} struct_08108764; + +extern struct_08108764 gUnk_08108764[]; + +u32 sub_0805B1CC(Manager1A*); +void sub_0805B210(Manager1A*); +void sub_0805B2B0(Manager1A*); +void sub_0805B328(Manager1A*); +void sub_0805BC4C(void); + +void sub_0805B048(Manager1A* this) { + struct_08108764* tmp; + Entity* obj; + sub_0805E3A0(&this->manager, 6); + _DmaZero(&this->unk_20, 0x20); + this->manager.action = 1; + this->unk_3f = gRoomControls.roomID; + tmp = &gUnk_08108764[this->manager.unk_0a]; + if (!tmp->unk_0a) { + this->unk_20 = gRoomControls.roomOriginX; + this->unk_22 = gRoomControls.roomOriginY; + this->unk_24 = gRoomControls.width; + this->unk_26 = gRoomControls.height; + } else { + this->unk_20 = (tmp->unk_08 << 4) + gRoomControls.roomOriginX; + this->unk_22 = (tmp->unk_09 << 4) + gRoomControls.roomOriginY; + this->unk_24 = (tmp->unk_0a << 4); + this->unk_26 = (tmp->unk_0b << 4); + } + this->manager.unk_0b = tmp->unk_0c != 0; + if (this->manager.unk_0b) { + this->manager.unk_10 |= 0x20; + this->unk_34 = tmp->unk_0c->unk_04; + this->unk_36 = tmp->unk_0c->unk_06; + this->unk_30 = tmp->unk_0c->unk_08; + this->unk_32 = tmp->unk_0c->unk_0a; + sub_0805BC4C(); + sub_0805B2B0(this); + sub_0805B328(this); + sub_08052D74(this, sub_0805B328, 0); + } + if (!tmp->unk_10) return; + obj = CreateObject(0x28, tmp->unk_10->unk_00, tmp->unk_10->unk_01); + if (obj) { + obj->x.HALF.HI = tmp->unk_10->unk_04 + gRoomControls.roomOriginX; + obj->y.HALF.HI = tmp->unk_10->unk_06 + gRoomControls.roomOriginY; + } + if (this->manager.unk_0a != 0xa + || CheckLocalFlag(0x4B)) return; + obj = CreateObject(0x28, 3, 3); + if (obj) { + obj->x.HALF.HI = tmp->unk_10->unk_04 + gRoomControls.roomOriginX; + obj->y.HALF.HI = tmp->unk_10->unk_06 + gRoomControls.roomOriginY; + } +} + +void sub_0805B168(Manager1A* this) { + if (sub_0805B1CC(this)) { + sub_0805B210(this); + DeleteThisEntity(); + return; + } + sub_0805B2B0(this); + if (gRoomControls.unk2 == 1) { + this->manager.unk_0d = 1; + return; + } + if (!this->manager.unk_0d) return; + this->manager.unk_0d = 0; + if (this->unk_3f == gRoomControls.roomID) return; + if (this->manager.unk_0b) { + gScreen.lcd.displayControl &= ~0x800; + } + DeleteThisEntity(); +} + +u32 sub_0805B1CC(Manager1A* this) { + u32 re = 0; + if (sub_0806FBFC(this->unk_20, this->unk_22, this->unk_24, this->unk_26)) { + if ((gPlayerState.flags.all & 0x4) && (gPlayerState.flags.all & 0x1)) { + gPlayerState.flags.all |= 0x8000; + } else if (gPlayerState.flags.all & 0x8000) { + re = 1; + } + } + return re; +} + +void sub_0805B210(Manager1A* this) { + struct_08108764 *tmp; + gScreenTransition.transitioningOut = 1; + gScreenTransition.transitionType = 1; + gScreenTransition.playerState = 4; + tmp = &gUnk_08108764[this->manager.unk_0a]; + gScreenTransition.areaID = tmp->unk_01; + gScreenTransition.roomID = tmp->unk_02; + gScreenTransition.playerLayer = tmp->unk_03; + if (gPlayerState.flags.all & 0x80) { + gScreenTransition.field_0xf = 6; + } else { + gScreenTransition.field_0xf = 2; + } + switch (tmp->unk_00) { + case 0: + gScreenTransition.playerStartPos.HALF.x = tmp->unk_04; + gScreenTransition.playerStartPos.HALF.y = tmp->unk_06; + break; + case 1: + gScreenTransition.playerStartPos.HALF.x = gPlayerEntity.x.HALF.HI - gRoomControls.roomOriginX + tmp->unk_04; + gScreenTransition.playerStartPos.HALF.y = gPlayerEntity.y.HALF.HI - gRoomControls.roomOriginY + tmp->unk_06; + break; + case 2: + gScreenTransition.playerStartPos.HALF.x = tmp->unk_04; + gScreenTransition.playerStartPos.HALF.y = tmp->unk_06; + gScreenTransition.field_0xf = 6; + break; + } +} + +void sub_0805B2B0(Manager1A* this) { + s32 tmp, tmp2; + if (!this->manager.unk_0b) return; + tmp = (this->unk_30 - gRoomControls.roomScrollX) / 4; + tmp2 = (this->unk_32 - gRoomControls.roomScrollY) / 4; + if (tmp < -12) { + tmp = -12; + } + if (tmp > 12) { + tmp = 12; + } + if (tmp2 < -12) { + tmp2 = -12; + } + if (tmp2 > 12) { + tmp2 = 12; + } + gScreen.lcd.displayControl |= 0x800; + gRoomControls.bg3OffsetX.HALF.HI = gRoomControls.roomScrollX + this->unk_34 + tmp; + gScreen.affine.bg3xOffset = gRoomControls.roomScrollX + this->unk_34 + tmp; + gRoomControls.bg3OffsetY.HALF.HI = gRoomControls.roomScrollY + this->unk_36 + tmp2; + gScreen.affine.bg3yOffset = gRoomControls.roomScrollY + this->unk_36 + tmp2; +} + +void sub_0805B328(Manager1A* this) { + struct_08108764 *tmp; + if (!this->manager.unk_0b) return; + tmp = &gUnk_08108764[this->manager.unk_0a]; + LoadAssetAsync(&gGlobalGfxAndPalettes[tmp->unk_0c->unk_00], 0x0600F000, 0x800); + gScreen.affine.bg3Control = 0x1E07; + gScreen.lcd.displayControl |= 0x800; + gScreen.affine.bg3xOffset = gRoomControls.bg3OffsetX.HALF.HI; + gScreen.affine.bg3yOffset = gRoomControls.bg3OffsetY.HALF.HI; + gScreen.controls.layerFXControl &= ~0x8; +} + +void sub_0805B390(u32 unk1) { + Manager* tmp = GetEmptyManager(); + if (!tmp) return; + tmp->type = 0x9; + tmp->subtype = 0x1A; + tmp->unk_0a = unk1; + AppendEntityToList(tmp, 6); +} diff --git a/src/manager/manager20.c b/src/manager/manager20.c new file mode 100644 index 00000000..fe50967e --- /dev/null +++ b/src/manager/manager20.c @@ -0,0 +1,38 @@ +#include "global.h" +#include "manager.h" +#include "flags.h" +#include "entity.h" +#include "room.h" + +typedef struct { + Manager manager; + u8 unk_20[0x12]; + u16 unk_32; + u8 unk_34[2]; + u8 unk_36; + u8 unk_37; + u16 unk_38; + u16 unk_3a; + u16 unk_3c; + u16 unk_3e; +} Manager20; + +extern void DeleteManager(Manager20*); + +void sub_0805B7A0(Manager20* this) { + Entity* tmp = CreateObject(this->manager.unk_0e, this->manager.unk_0a, this->manager.unk_0b); + if (!tmp) return; + tmp->field_0x86.HWORD = this->unk_3e; + if (CheckFlags(this->unk_3e)) { + tmp->x.HALF.HI = this->unk_36 | (this->unk_37&0xF)<<8;//r1 + tmp->y.HALF.HI = this->unk_3c & 0xFFF; + tmp->collisionLayer = this->unk_3c >> 0xC; + } else { + tmp->x.HALF.HI = this->unk_38; + tmp->y.HALF.HI = this->unk_3a; + tmp->collisionLayer = this->unk_37>>4; + } + tmp->x.HALF.HI += gRoomControls.roomOriginX; + tmp->y.HALF.HI += gRoomControls.roomOriginY; + DeleteManager(this); +} diff --git a/src/manager/manager30.c b/src/manager/manager30.c new file mode 100644 index 00000000..5f5ead82 --- /dev/null +++ b/src/manager/manager30.c @@ -0,0 +1,98 @@ +#include "global.h" +#include "manager.h" +#include "flags.h" +#include "functions.h" + +typedef struct Manager30 { + Manager manager; + u8 unk_20[8];//unused + u16 own_tile; + u8 unk_2a[0x2];//unused + u16 player_previous_tile; + u16 player_current_tile; + u8 unk_30[0x6];//unused + u8 width; + u8 height; + s16 x; + s16 y; + u16 flag_succeeded; + u16 flag_reset; +} Manager30; + +extern void sub_0807B7D8(u32, u32, u32); + +enum { + INIT, + IN_PROGRESS, + FAILED, + SUCCEEDED +}; + +/* + * Tile puzzles (step on all blue tiles exactly once). + * + * The Manager's field 0xe is used for the remaining number of tiles to be changed. + * field 0xf is used for the total number of tiles to be changed. +*/ +void Manager30_Main(Manager30* this) { + u32 i, j, tmp, tmp2; + switch (this->manager.action) { + default: + break; + case INIT: + this->manager.action = IN_PROGRESS; + this->manager.unk_0f = this->manager.unk_0e; + this->own_tile = (((this->x >> 4) & 0x3fU) | + ((this->y >> 4) & 0x3fU) << 6); + this->player_previous_tile = this->player_current_tile = COORD_TO_TILE((&gPlayerEntity)); + break; + case 1: + this->player_current_tile = COORD_TO_TILE((&gPlayerEntity)); + if (this->player_current_tile != this->player_previous_tile) { + this->player_previous_tile = this->player_current_tile; + switch (GetTileType(this->player_current_tile, this->manager.unk_0b)) { + case 0x317: + //stepped on a red tile again + this->manager.action = FAILED; + PlaySFX(0x6d); + break; + case 0x318: + //stepped on a blue tile + //turn the tile into a red tile + sub_0807B7D8(0x317, this->player_current_tile, this->manager.unk_0b); + PlaySFX(0x6b); + //decrease the number of remaining tiles and check if we're done + if (--this->manager.unk_0e == 0) { + this->manager.action = SUCCEEDED; + //set up delay for setting the flag/playing the success sfx + this->manager.unk_0e = 0x40; + } + break; + } + } + //fall through, can be reset in-progress + case FAILED: + if (!this->flag_reset) return;//can't be reset + if (!CheckFlags(this->flag_reset)) return;//wait for the flag telling it to reset + ClearFlag(this->flag_reset);//make sure the puzzle can be reset again later + this->manager.action = IN_PROGRESS; + this->manager.unk_0e = this->manager.unk_0f; + for (i = 0; i < this->height; i++) { + tmp = this->own_tile + (i << 6); + for (j = 0; j < this->width; j++) { + sub_0807BA8C(tmp + j, this->manager.unk_0b); + } + } + break; + case SUCCEEDED: + if (this->manager.unk_0e == 0) return; + tmp2 = --this->manager.unk_0e; + if (tmp2) { + if (tmp2 == 0x20) { + SetFlag(this->flag_succeeded); + } + } else { + PlaySFX(0x72); + } + } +} diff --git a/src/manager/manager5.c b/src/manager/manager5.c new file mode 100644 index 00000000..de4e08b9 --- /dev/null +++ b/src/manager/manager5.c @@ -0,0 +1,129 @@ +#include "global.h" +#include "manager.h" +#include "flags.h" +#include "functions.h" + + +typedef struct { + Manager manager; + u8 unk_20[0x08]; + u16 unk_28; + u16 unk_2a; + u16 unk_2c; + u16 unk_2e; + u16 unk_30; + u16 unk_32; + u8 unk_34[0x04]; + s16 unk_38; + s16 unk_3a; + u16 unk_3c; + u16 unk_3e; +} Manager5; + +void sub_08057AE8(Manager5*); +void sub_08057BA4(Manager5*); +void sub_08057C28(Manager5*); + +const u16 gUnk_08108024[] = { + 0, + -1, + 1, + 0, + 0, + 1, + -1, + 0 +}; +const u16 gUnk_08108034[] = { + 0, + 1, + -1, + 0, + 0, + -1, + 1, + 0 +}; + +void (*const gUnk_08108044[])(Manager5*) = { + sub_08057AE8, + sub_08057BA4, + sub_08057C28 +}; + +void sub_08057AD0(Manager5* this) { + gUnk_08108044[this->manager.action](this); +} + +void sub_08057CA4(Manager5*, u32, u32); + +extern void DeleteManager(Manager*); + +void sub_08057AE8(Manager5* this) { + u32 tmp; + tmp = (this->manager.unk_0b & 0x3)<<1; + if (this->manager.unk_0e == 1) { + this->unk_30 = 0x323; + } else { + this->unk_30 = tmp & 2 ? 0x37 : 0x36; + } + this->unk_28 = gUnk_08108024[tmp]; + this->unk_2a = gUnk_08108024[tmp+1]; + this->unk_2c = gUnk_08108034[tmp]; + this->unk_2e = gUnk_08108034[tmp+1]; + this->unk_32 = ((this->manager.unk_0b>>2)&0xF)+1; + this->manager.unk_0e = 0x1C; + this->manager.unk_0f = 0; + this->manager.action = (this->manager.unk_0b & 0x80)?2:1; + if (this->manager.action != 2 + || !CheckFlags(this->unk_3e)) return; + for (;this->unk_32;this->unk_32--) { + sub_08057CA4(this, this->unk_28, this->unk_2a); + sub_0807B7D8(this->unk_30, this->unk_38 | (this->unk_3a << 6),this->unk_3c); + } + DeleteManager(&this->manager); +} + +void sub_08057BA4(Manager5* this) { + if (--this->manager.unk_0e) return; + this->manager.unk_0e = 8; + if (CheckFlags(this->unk_3e)) { + if (this->unk_32 == this->manager.unk_0f) return; + sub_08057CA4(this, this->unk_28, this->unk_2a); + sub_0807B7D8(this->unk_30, this->unk_38 | (this->unk_3a << 6), this->unk_3c); + this->manager.unk_0f++; + PlaySFX(0x71); + } else { + if (!this->manager.unk_0f) return; + sub_0807BA8C(this->unk_38 | (this->unk_3a << 6), this->unk_3c); + sub_08057CA4(this, this->unk_2c, this->unk_2e); + this->manager.unk_0f--; + PlaySFX(0x71); + } +} + +void sub_08057C28(Manager5* this) { + if (!this->manager.unk_0d) { + if (!CheckFlags(this->unk_3e)) return; + this->manager.unk_0d++; + } else { + if (--this->manager.unk_0e) return; + this->manager.unk_0e = 8; + if (this->unk_32 != this->manager.unk_0f) { + sub_08057CA4(this, this->unk_28, this->unk_2a); + sub_0807B7D8(this->unk_30, this->unk_38 | (this->unk_3a << 6), this->unk_3c); + this->manager.unk_0f++; + PlaySFX(0x71); + } else { + if (this->unk_30 != 0x323) { + PlaySFX(0x72); + } + DeleteManager(&this->manager); + } + } +} + +void sub_08057CA4(Manager5* this, u32 unk1, u32 unk2) { + this->unk_38 += unk1; + this->unk_3a += unk2; +} diff --git a/src/manager/manager7.c b/src/manager/manager7.c new file mode 100644 index 00000000..14557946 --- /dev/null +++ b/src/manager/manager7.c @@ -0,0 +1,166 @@ +#include "global.h" +#include "manager.h" +#include "functions.h" +#include "gba/gba.h" + + +typedef struct { + Manager manager; + u8 unk_20; + u8 unk_21[0x1F]; +} Manager7; + +void sub_08057E30(); +u32 sub_08057E40(); +void sub_08057E64(); +void sub_08057E7C(u32); + +extern void sub_08052D74(); +extern u32 sub_08056300(const u16*); +extern void sub_0805E3A0(); + +extern u8 gUnk_02034490; +extern const u8 gGlobalGfxAndPalettes[]; + +const u16 gUnk_08108050[0x2A] = { + 0, 0, 0x20, 0xE0, + 0xE0, 1, 0, 0x1D0, + 0x80, 0x60, 2, 0x170, + 0x278, 0xF8, 0xA0, 3, + 0x310, 0x178, 0xC0, 0x150, + 3, 0x340, 0x2C8, 0x60, + 0x90, 4, 0x1D0, 0, + 0x200, 0xE0, 1, 0x108, + 0x188, 0xD0, 0x80, 2, + 0x1E8, 0x338, 0x50, 0xC0, + 0xFF, 0 +}; + +const u32 gUnk_081080A4[0x50] = { + 0x001095E0, 0x06000000, + 0x0010A5E0, 0x06001000, + 0x0010B5E0, 0x06002000, + 0x0010C5E0, 0x06003000, + 0x0010D5E0, 0x06008000, + 0x0010E5E0, 0x06009000, + 0x0010F5E0, 0x0600A000, + 0x001105E0, 0x0600B000, + 0x001115E0, 0x06000000, + 0x001125E0, 0x06001000, + 0x001135E0, 0x06002000, + 0x001145E0, 0x06003000, + 0x001155E0, 0x06008000, + 0x001165E0, 0x06009000, + 0x001175E0, 0x0600A000, + 0x001185E0, 0x0600B000, + 0x001195E0, 0x06000000, + 0x0011A5E0, 0x06001000, + 0x0011B5E0, 0x06002000, + 0x0011C5E0, 0x06003000, + 0x0011D5E0, 0x06008000, + 0x0011E5E0, 0x06009000, + 0x0011F5E0, 0x0600A000, + 0x001205E0, 0x0600B000, + 0x001215E0, 0x06000000, + 0x001225E0, 0x06001000, + 0x001235E0, 0x06002000, + 0x001245E0, 0x06003000, + 0x001255E0, 0x06008000, + 0x001265E0, 0x06009000, + 0x001275E0, 0x0600A000, + 0x001285E0, 0x0600B000, + 0x001295E0, 0x06000000, + 0x0012A5E0, 0x06001000, + 0x0012B5E0, 0x06002000, + 0x0012C5E0, 0x06003000, + 0x0012D5E0, 0x06008000, + 0x0012E5E0, 0x06009000, + 0x0012F5E0, 0x0600A000, + 0x001305E0, 0x0600B000 +}; + +const u8 gUnk_081081E4[] = { + 0x16, + 0x17, + 0x17, + 0x18, + 0x18 +}; + +void Manager7_Main(Manager7* this) { + u32 tmp; + const u32 * tmp2; + if (!this->manager.action) { + this->manager.action = 1; + this->manager.unk_0e = 8; + this->unk_20 = 0xFF; + sub_0805E3A0(this, 6); + sub_08052D74(this, sub_08057E30, 0); + } + if (sub_08057E40(this)) { + tmp = gRoomVars.unk_10; + if (this->unk_20 != tmp) { + this->unk_20 = tmp; + this->manager.unk_0e = 0; + } + } + if (gRoomControls.unk2) return; + tmp = this->unk_20; + tmp2 = &gUnk_081080A4[tmp<<4]; + switch (this->manager.unk_0e) { + case 0: + gUnk_02034490 = 1; + LoadAssetAsync(&gGlobalGfxAndPalettes[tmp2[0]], tmp2[1], 0x1000); + LoadPaletteGroup(gUnk_081081E4[tmp]); + this->manager.unk_0e++; + break; + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + LoadAssetAsync(&gGlobalGfxAndPalettes[tmp2[(this->manager.unk_0e << 1)]], tmp2[(this->manager.unk_0e << 1)+1], 0x1000); + this->manager.unk_0e++; + break; + case 8: + gUnk_02034490 = 0; + this->manager.unk_0e++; + break; + } +} + +void sub_08057E30(Manager7* this) { + sub_08057E7C(gRoomVars.unk_10); +} + +u32 sub_08057E40(Manager7* this) { + u32 tmp = sub_08056300(gUnk_08108050); + if (tmp != 0xFF) { + gRoomVars.unk_10 = tmp; + return 1; + } else { + return 0; + } +} + +void sub_08057E64() { + u32 tmp; + tmp = sub_08056300(gUnk_08108050); + if (tmp != 0xFF) { + sub_08057E7C(tmp); + } +} + +void sub_08057E7C(u32 unk1) { + u32 tmp; + const u32* tmp2; + if (unk1 > 4) return; + LoadPaletteGroup(gUnk_081081E4[unk1]); + tmp2 = &gUnk_081080A4[unk1<<4]; + for (tmp = 0; tmp < 8; tmp++, tmp2 += 2) { + DmaSet(3,&gGlobalGfxAndPalettes[tmp2[0]],tmp2[1],0x84000400); + } + gRoomVars.unk_10 = unk1; +} diff --git a/src/manager/manager8.c b/src/manager/manager8.c new file mode 100644 index 00000000..2688bc42 --- /dev/null +++ b/src/manager/manager8.c @@ -0,0 +1,137 @@ +#include "global.h" +#include "manager.h" +#include "screen.h" +#include "functions.h" +#include "gba/gba.h" + +typedef struct { + Manager manager; + u8 unk_20; + u8 unk_21[0x17]; + u32 unk_38; + u32 unk_3c; +} Manager8; + +void sub_08057F20(Manager8*); +void sub_08057EFC(); +void sub_08058034(void); +void sub_08058084(u16*, u16*); + +extern void sub_08052D74(void*, void*, void*); + +extern u16 gMapDataTopSpecial[]; + +void sub_08057ED0(Manager8* this) { + sub_08057F20(this); + if (!this->manager.action) { + this->manager.action = 1; + gScreen.bg.bg2yOffset = 0; + gScreen.affine.unk4 = 0; + sub_08052D74(this, sub_08057EFC, 0); + } +} + +void sub_08057EFC(Manager8* this) { + LoadGfxGroup(gRoomVars.unk_10); + sub_08058034(); + this->unk_3c = 0; + this->unk_38 = 0; + sub_08057F20(this); +} + +void sub_08058004(u32, void*, void*); + +extern u8 gUnk_02001A40[]; +extern u8 gUnk_02006F00[]; + +void sub_08057F20(Manager8* this) { + u32 tmp; + tmp = gRoomControls.roomScrollX - gRoomControls.roomOriginX; + tmp = tmp + (tmp >> 3) + ((0x400 - gRoomControls.width)/2); + gScreen.affine.bg3xOffset = tmp&0xF; + gScreen.affine.bg3yOffset = 0x30 - ((0x30 - (gRoomControls.roomScrollY - gRoomControls.roomOriginY))>>2); + gScreen.affine.unk5 = gUnk_02001A40; + sub_08058004(tmp, gUnk_02006F00, gUnk_02001A40); + tmp = ((tmp>>4)<<1); + if (this->unk_38 != tmp) { + this->unk_38 = tmp; + gScreen.affine.unk4 = 1; + } + tmp = (gRoomControls.roomScrollX - gRoomControls.roomOriginX); + tmp = tmp + (tmp >> 2) + ((0x400 - gRoomControls.width)/2); + gScreen.bg.bg1yOffset = tmp&0xF; + gScreen.bg.bg2xOffset = 0x30 - ((0x30 - (gRoomControls.roomScrollY - gRoomControls.roomOriginY))>>1); + gScreen.bg.unk_14 = gUnk_02001A40 + 0x800; + sub_08058004(tmp, gUnk_02006F00 + 0x2000, gUnk_02001A40 + 0x800); + tmp = ((tmp>>4)<<1); + if (this->unk_3c != tmp) { + this->unk_3c = tmp; + gScreen.bg.bg2yOffset = 1; + } +} + +void sub_08058004(u32 unk1, void* unk2, void* unk3) { + u32 tmp = 0x20; + unk2 += (unk1 >> 4) << 2; + for (tmp; tmp != 0; tmp--) { + DmaSet(3, unk2, unk3, 0x80000020); + unk2 += 0x100; + unk3 += 0x40; + } +} + +void sub_08058034() { + u32 tmp; + u16 *tmp2, *tmp3; + tmp2 = gMapDataTopSpecial; + tmp3 = gMapDataTopSpecial + 0x2000; + for (tmp = 0; tmp < 4; tmp++) { + sub_08058084(tmp2, tmp3); + tmp2 += 0x400; + tmp3 += 0x20; + } + tmp2 = gMapDataTopSpecial + 0x1000; + tmp3 = gMapDataTopSpecial + 0x3000; + for (tmp = 0; tmp < 4; tmp++) { + sub_08058084(tmp2, tmp3); + tmp2 += 0x400; + tmp3 += 0x20; + } +} + +void sub_08058084(u16* unk1, u16* unk2) { + u32 tmp; + for (tmp = 0; tmp < 0x20; tmp++, unk1+=0x20, unk2+=0x80) { + DmaSet(3,unk1,unk2,0x80000020); + } +} + +extern u32 gUnk_0200B650; + +void sub_080580B0(u32 unk1) { + s32 tmp; + gUnk_0200B650 = 0; + REG_DISPCNT = 0; + LoadGfxGroup(unk1); + gRoomVars.unk_10 = unk1; + sub_08058034(); + tmp = gRoomControls.roomScrollX - gRoomControls.roomOriginX;//r7 + tmp = tmp + (tmp >> 3) + (0x400 - gRoomControls.width) / 2; + sub_08058004(tmp, gUnk_02006F00, gUnk_02001A40); + gScreen.affine.bg3xOffset = tmp & 0xF; + gScreen.affine.bg3yOffset = 0x30 - ((0x30 - (gRoomControls.roomScrollY - gRoomControls.roomOriginY))>>1);//? + gScreen.affine.bg3Control = 0x1D09; + gScreen.affine.unk5 = gUnk_02001A40; + gScreen.affine.unk4 = 1; + tmp = gRoomControls.roomScrollX - gRoomControls.roomOriginX;//r7 + tmp = tmp + (tmp >> 2) + (0x400 - gRoomControls.width) / 2; + sub_08058004(tmp, gUnk_02006F00 + 0x2000, gUnk_02001A40 + 0x800); + gScreen.bg.bg1yOffset = tmp & 0xF; + gScreen.bg.bg2xOffset = 0x30 - ((0x30 - (gRoomControls.roomScrollY - gRoomControls.roomOriginY))>>1);//? + gScreen.bg.bg1xOffset = 0x1E09; + gScreen.bg.unk_14 = gUnk_02001A40 + 0x800; + gScreen.bg.bg2yOffset = 1; + gScreen.controls.layerFXControl = 0x3C48; + gScreen.controls.alphaBlend = 0x609; + gScreen.lcd.displayControl |= 0xa00; +} diff --git a/src/manager/managerB.c b/src/manager/managerB.c index 763e89ea..a23faacf 100644 --- a/src/manager/managerB.c +++ b/src/manager/managerB.c @@ -6,25 +6,42 @@ #include "area.h" #include "functions.h" -extern void (*(gUnk_08108208[]))(Manager*); +/* + * Manager B is used to create fights: + * It possibly waits for an inhibitor flag to be set, then spawns a bunch of entities (based on room data). + * Once all enemies created this way are dead, it sets a flag. + * (There is also a part about changing the music and setting it back when the fight is done, which is song 0x33 (a fight theme) by default but can be overridden through room data) +*/ + +void (*const ManagerB_ActionFuncs[])(Manager*); void sub_080585F0(Manager* this) { - gUnk_08108208[this->unk_0a](this); + //make a distincion if this is a controller (unk_0a = 0) or a helper (unk_0a = 1) + ManagerB_ActionFuncs[this->unk_0a](this); } -extern void (*(gUnk_08108210[]))(Manager*); +enum ManagerB_State { + Init, + WaitForFlag, + WaitForDone +}; + +void (*const ManagerB_StateFuncs[])(ManagerB*); -void sub_08058608(Manager* this) { - gUnk_08108210[this->action](this); +void ManagerB_Main(ManagerB* this) { + //make a distinction based on the state of this controller + ManagerB_StateFuncs[this->manager.action](this); } -void sub_080586EC(Manager*); +void ManagerB_LoadFight(Manager*); -void sub_08058620(ManagerB* this) { +void ManagerB_Init(ManagerB* this) { + //check if the fight was already completed previously (checks the flag that gets set after the fight is done) if (!CheckFlags(this->unk_3e)) { - this->manager.action = 1; + this->manager.action = WaitForFlag; + //if there is no flag that needs to be set before the fight is started, start it immediately if (!this->unk_3c) { - sub_080586EC(&this->manager); + ManagerB_LoadFight(&this->manager); } sub_0805E3A0(this, 3); } else { @@ -33,10 +50,10 @@ void sub_08058620(ManagerB* this) { } extern void sub_080186C0(u32); -void sub_08058650(ManagerB* this) { +void ManagerB_WaitForFlag(ManagerB* this) { int tmp; if (CheckFlags(this->unk_3c)) { - sub_080586EC(&this->manager); + ManagerB_LoadFight(&this->manager); if (!this->unk_35) { tmp = gRoomVars.field_0x9 ? gRoomVars.field_0x9 : 0x33; this->unk_20 = gArea.musicIndex; @@ -49,9 +66,12 @@ void sub_08058650(ManagerB* this) { extern void sub_0801855C(void); -void sub_080586A8(ManagerB* this) { +void ManagerB_WaitForDone(ManagerB* this) { + //check if all helpers are done if (this->manager.unk_0e) return; + //set the completion flag for the fight SetFlag(this->unk_3e); + //restore music (if it was set, which apparently is only possible if there's a flag the fight waited for) if (this->unk_3c) { if (!this->unk_35) { gArea.musicIndex = this->unk_20; @@ -62,40 +82,45 @@ void sub_080586A8(ManagerB* this) { DeleteThisEntity(); } -ManagerBHelper* sub_08058760(Manager*); -void sub_08058798(ManagerBHelper*, Entity*, u32); +ManagerBHelper* CreateHelper(Manager*); +void ManagerBHelper_Monitor(ManagerBHelper*, Entity*, u32); extern EntityData* GetCurrentRoomProperty(u8); extern Entity* LoadRoomEntity(EntityData*); -void sub_080586EC(Manager* this) { - ManagerBHelper* tmp; +void ManagerB_LoadFight(Manager* this) { + ManagerBHelper* monitor; EntityData* prop; Entity* ent; u32 counter; this->action = 2; this->unk_0e = 0; counter = 0; - tmp = sub_08058760(this); - if (!tmp) DeleteThisEntity(); + //Create a helper to keep track of the created entities. + monitor = CreateHelper(this); + if (!monitor) DeleteThisEntity(); prop = (EntityData*) GetCurrentRoomProperty(this->unk_0b); if (prop) { while (*((u8*)prop) != 0xFF) { ent = LoadRoomEntity(prop++); if (ent && (ent->entityType.type == 3)) { ent->field_0x6c.HALF.HI |= 0x40; - sub_08058798(tmp, ent, counter++); + ManagerBHelper_Monitor(monitor, ent, counter++); } if (counter >= 7) { counter = 0; - tmp = sub_08058760(this); - if (!tmp) return; + monitor = CreateHelper(this); + if (!monitor) return; } } } } -ManagerBHelper* sub_08058760(Manager* this) { +/* + * Create a helper and increment the counter for the number of helpers (unk_0e). + * The helper will decrease said counter when it deletes itself (when none of the enemies it monitors remain). +*/ +ManagerBHelper* CreateHelper(Manager* this) { ManagerBHelper* extra; extra = (ManagerBHelper*) GetEmptyManager(); if (extra) { @@ -110,51 +135,67 @@ ManagerBHelper* sub_08058760(Manager* this) { return extra; } -void sub_08058798(ManagerBHelper* this, Entity* value, u32 index) { - this->enemies[index]=value; +void ManagerBHelper_Monitor(ManagerBHelper* this, Entity* ent, u32 index) { + this->enemies[index]=ent; this->manager.unk_0e++; } -void sub_080587AC(ManagerBHelper* this) { - u8 i, tmp; +//case unk_0a is 1: The manager is a helper + +void ManagerBHelper_Main(Manager* this) { + u8 i, anyRemaining; Entity* current; - if (this->manager.action == 0) { - this->manager.action = 1; + if (this->action == 0) { + this->action = 1; sub_0805E3A0(this,3); } - tmp = 0; + //go through and check all monitored enemies. + anyRemaining = 0; for (i = 0; i < 8; i++) { - if ((current = this->enemies[i])) { + if ((current = ((ManagerBHelper*)this)->enemies[i])) { if (!current->next) { - this->enemies[i] = 0; + ((ManagerBHelper*) this)->enemies[i] = 0; } else { - tmp = 1; + anyRemaining = 1; } } } - if (!tmp) { - if (((ManagerB*) this->manager.parent)->manager.unk_0e) { - ((ManagerB*) this->manager.parent)->manager.unk_0e--; + if (!anyRemaining) { + //inform the parent that we're done + if (((ManagerB*) this->parent)->manager.unk_0e) { + ((ManagerB*) this->parent)->manager.unk_0e--; } - DeleteThisEntity(); + DeleteThisEntity(); } } extern Manager gUnk_03003DB0; -void sub_08058800(Entity* this, Entity* unk1) { +/* + * Replace an entity that is currently being monitored with a new one +*/ +void ReplaceMonitoredEntity(Entity* old, Entity* new) { ManagerBHelper* current; Manager* end = &gUnk_03003DB0; u32 i; for (current = (ManagerBHelper*) end->next; (Manager*)current != end; current=(ManagerBHelper*)current->manager.next) { if (current->manager.type != 0x9 || current->manager.subtype != 0xB) continue; for (i = 0; i < 8; i++) { - if (this == current->enemies[i]) { - current->enemies[i] = unk1; + if (old == current->enemies[i]) { + current->enemies[i] = new; return; } } } } +void (*const ManagerB_ActionFuncs[])(Manager*) = { + (void (*)(Manager*)) ManagerB_Main, + (void (*)(Manager*)) ManagerBHelper_Main +}; +void (*const ManagerB_StateFuncs[])(ManagerB*) = { + ManagerB_Init, + ManagerB_WaitForFlag, + ManagerB_WaitForDone +}; |
