From 0dab5bbc99ea7cb82e443a9d9d7b639c44616bad Mon Sep 17 00:00:00 2001 From: Ibot02 Date: Mon, 18 Jan 2021 16:05:52 +0100 Subject: manager28.c: ok --- src/enemy/bladeTrap.c | 1 - src/entity.c | 6 -- src/loadRoom.c | 1 - src/manager/manager28.c | 130 +++++++++++++++++++++++++++++++++++++++++ src/manager/managerB.c | 1 - src/manager/managerE.c | 1 - src/object/houseDoorExterior.c | 1 - src/object/lightableSwitch.c | 1 - src/object/lilypadSmall.c | 1 - src/object/object48.c | 2 +- 10 files changed, 131 insertions(+), 14 deletions(-) create mode 100644 src/manager/manager28.c (limited to 'src') diff --git a/src/enemy/bladeTrap.c b/src/enemy/bladeTrap.c index 54dcfcb7..397afc93 100644 --- a/src/enemy/bladeTrap.c +++ b/src/enemy/bladeTrap.c @@ -4,7 +4,6 @@ extern void sub_080A2CC0(); extern void sub_0806F69C(); extern void EnqueueSFX(); -extern Entity* GetCurrentRoomProperty(); void BladeTrap(Entity* ent) { u16 uVar1; diff --git a/src/entity.c b/src/entity.c index 4327bd42..0f0835c6 100644 --- a/src/entity.c +++ b/src/entity.c @@ -132,12 +132,6 @@ void ClearDeletedEntity(Entity* ent) { gEntCount--; } -typedef struct LinkedList { - Entity* last; - Entity* first; -} LinkedList; - -extern LinkedList gEntityLists[9]; extern EntityType gUnk_03003DB8; void DeleteAllEntities(void) { diff --git a/src/loadRoom.c b/src/loadRoom.c index 3e756c15..f0106fc2 100644 --- a/src/loadRoom.c +++ b/src/loadRoom.c @@ -3,7 +3,6 @@ #include "flags.h" void LoadRoomEntityList(EntityData* dat); -extern EntityData* GetCurrentRoomProperty(u32 unk); extern void sub_0804B058(EntityData* dat); extern void LoadRoomTileEntities(EntityData* dat); extern void sub_0801AC98(); diff --git a/src/manager/manager28.c b/src/manager/manager28.c new file mode 100644 index 00000000..44b33b08 --- /dev/null +++ b/src/manager/manager28.c @@ -0,0 +1,130 @@ +#include "global.h" +#include "manager.h" +#include "entity.h" +#include "room.h" +#include "functions.h" + +typedef struct { + Manager manager; + Entity* unk_20[8]; +} Manager28; + +extern void (* const gUnk_08108D28[])(Manager28*); + +void sub_0805C934(Manager28*); +void sub_0805C94C(Manager28*); +void sub_0805C9BC(Manager28*); +u32 sub_0805CA6C(Manager28*); +Entity* sub_0805CAF0(EntityData*); +void sub_0805CB48(Manager28*); + +void sub_0805C934(Manager28* this) { + gUnk_08108D28[this->manager.action](this); +} + +NONMATCH("asm/non_matching/manager28/sub_0805C94C.inc", void sub_0805C94C(Manager28* this)) { + if (!this->manager.unk_0a) { + s32 tmp2; + int tmp4; + for (tmp4 = 0; tmp4 < 8; tmp4++) { + this->unk_20[tmp4] = 0; + } + tmp2 = sub_0805CA6C(this);//maybe 2 params? + if (tmp2 > 1) { + Manager28* tmp3 = (Manager28*) GetEmptyManager(); + if (tmp3) { + tmp3->manager.type = 9; + tmp3->manager.subtype = 0x28; + tmp3->manager.unk_0a = 1; + tmp3->manager.unk_0e = tmp2; + for (tmp4 = 0; tmp4 < 8; tmp4++) { + tmp3->unk_20[tmp4] = this->unk_20[tmp4]; + } + AppendEntityToList(tmp3, 6); + } + } + DeleteManager(&this->manager); + } else { + this->manager.action = 1; + this->manager.unk_0f = 0; + } +} +END_NONMATCH + +void sub_0805C9BC(Manager28* this) { + s32 n; + s32 i; + s32 j; + Entity* tmp; + sub_0805CB48(this); + n = this->manager.unk_0e - 1; + if ((this->manager.unk_0f++) & 1) { + for (i = 0; i < n; i++) { + tmp = this->unk_20[i]; + for (j = i + 1; j < this->manager.unk_0e; j++) { + sub_08004484(tmp, this->unk_20[j]); + } + } + } else { + for (i = 0; i < n; i++) { + tmp = this->unk_20[i]; + for (j = i + 1; j < this->manager.unk_0e; j++) { + sub_08004484(this->unk_20[j], tmp); + } + } + } +} + +u32 sub_0805CA6C(Manager28* this) { + u32 re = 0; + EntityData * tmp = GetCurrentRoomProperty(this->manager.unk_0b); + if (!tmp) return 0; + for (; *((u8*) tmp) != 0xFF && !(tmp->type == 9 && tmp->subtype == 0x28); tmp++) { + Entity* tmp2; + u32 i; + if (tmp->type != 3) continue; + tmp2 = sub_0805CAF0(tmp); + if (!tmp2) continue; + for (i = 0; i < re; i++) { + if (this->unk_20[i] == tmp2) break; + } + if (i != re) continue; + this->unk_20[re++] = tmp2; + if (re == 8) return 8; + } + return re; +} + +Entity* sub_0805CAF0(EntityData* unk1) { + u32 x, y; + Entity* i; + LinkedList* tmp; + x = unk1->xPos + gRoomControls.roomOriginX; + y = unk1->yPos + gRoomControls.roomOriginY; + tmp = &gUnk_03003D90; + for (i = tmp->first; (u32) i != (u32) tmp; i = i->next) { + if (x == i->x.HALF.HI + && y == i->y.HALF.HI + && unk1->subtype == i->entityType.subtype + && 3 == i->entityType.type + && unk1->form == i->entityType.form) { + return i; + } + } + return 0; +} + +void sub_0805CB48(Manager28* this) { + s32 i; + for (i = 0; i < this->manager.unk_0e; i++) { + if (this->unk_20[i]->next == 0) { + if (this->manager.unk_0e-1 == i) { + this->unk_20[i] = this->unk_20[i]->next; + } else { + this->unk_20[i] = this->unk_20[this->manager.unk_0e-1]; + } + this->manager.unk_0e--; + } + } + if (this->manager.unk_0e <= 1) DeleteThisEntity(); +} diff --git a/src/manager/managerB.c b/src/manager/managerB.c index a63fb8a0..d7bbcee1 100644 --- a/src/manager/managerB.c +++ b/src/manager/managerB.c @@ -83,7 +83,6 @@ void ManagerB_WaitForDone(ManagerB* this) { ManagerBHelper* CreateHelper(Manager*); void ManagerBHelper_Monitor(ManagerBHelper*, Entity*, u32); -extern EntityData* GetCurrentRoomProperty(u8); extern Entity* LoadRoomEntity(EntityData*); void ManagerB_LoadFight(Manager* this) { diff --git a/src/manager/managerE.c b/src/manager/managerE.c index b48c1cc5..e096874f 100644 --- a/src/manager/managerE.c +++ b/src/manager/managerE.c @@ -4,7 +4,6 @@ #include "flags.h" #include "room.h" -extern Entity* GetCurrentRoomProperty(u8); extern void LoadRoomEntityList(Entity*); extern void DeleteThisEntity(void); extern void DeleteManager(Manager*); diff --git a/src/object/houseDoorExterior.c b/src/object/houseDoorExterior.c index c15f94f0..cdee3afe 100644 --- a/src/object/houseDoorExterior.c +++ b/src/object/houseDoorExterior.c @@ -26,7 +26,6 @@ static u8 sub_08086954(Entity*); extern u32 sub_080562CC(u32, u32, u32, u32); extern void sub_08078AC0(u32, u32, u32); -extern void* GetCurrentRoomProperty(u8); extern void (*const gUnk_081206B4[])(Entity*); extern BoundingBox gUnk_081206AC; // TODO: should be const diff --git a/src/object/lightableSwitch.c b/src/object/lightableSwitch.c index ecc6449e..472f9fd4 100644 --- a/src/object/lightableSwitch.c +++ b/src/object/lightableSwitch.c @@ -9,7 +9,6 @@ extern void sub_0809EAD8(Entity*); extern void sub_0809EABC(Entity*); extern void EnqueueSFX(u32); extern void sub_080A2CC0(Entity*, Entity**, u16*); -extern Entity* GetCurrentRoomProperty(u32); extern void SetTile(u32, u32, u32); extern void sub_0806F69C(Entity*); diff --git a/src/object/lilypadSmall.c b/src/object/lilypadSmall.c index 32991f65..7dc35ae2 100644 --- a/src/object/lilypadSmall.c +++ b/src/object/lilypadSmall.c @@ -3,7 +3,6 @@ #include "functions.h" #include "player.h" -extern Entity* GetCurrentRoomProperty(u32); extern void sub_080A2CC0(Entity*, Entity**, u16*); extern u16 gUnk_08123318[]; diff --git a/src/object/object48.c b/src/object/object48.c index f340da1c..e62b174a 100644 --- a/src/object/object48.c +++ b/src/object/object48.c @@ -323,7 +323,7 @@ void sub_0808EBB8(Entity* this) { } static Entity* sub_0808EC80(int form) { - Entity* entityA = &gUnk_03003DA0; + Entity* entityA = (Entity*) &gUnk_03003DA0; Entity* entityB = entityA->next; while (entityB != entityA) { if ((entityB->entityType.type == 0x6 && entityB->entityType.subtype == 0x48) && -- cgit v1.2.3 From bbfd8348559edf9afbd71d0d01013a523997258c Mon Sep 17 00:00:00 2001 From: Ibot02 Date: Mon, 18 Jan 2021 16:39:53 +0100 Subject: manager28.c: split out rodata and rename functions --- src/manager/manager28.c | 53 ++++++++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/manager/manager28.c b/src/manager/manager28.c index 44b33b08..3ea38f38 100644 --- a/src/manager/manager28.c +++ b/src/manager/manager28.c @@ -9,33 +9,46 @@ typedef struct { Entity* unk_20[8]; } Manager28; -extern void (* const gUnk_08108D28[])(Manager28*); - -void sub_0805C934(Manager28*); -void sub_0805C94C(Manager28*); +void Manager28_Main(Manager28*); +void Manager28_Init(Manager28*); void sub_0805C9BC(Manager28*); -u32 sub_0805CA6C(Manager28*); -Entity* sub_0805CAF0(EntityData*); -void sub_0805CB48(Manager28*); +u32 Manager28_FindMatchingEntities(Manager28*); +Entity* Manager28_FindMatchingEntity(EntityData*); +void Manager28_RemoveDeletedEntities(Manager28*); + +void (* const gUnk_08108D28[])(Manager28*) = { + Manager28_Init, + Manager28_Main +}; + +enum Manager28_Action { + Init = 0, + Main = 1 +}; + +enum Manager28_InitState { + DoInit = 0, + DoNotInit = 1 +}; -void sub_0805C934(Manager28* this) { +void Manager28_Entry(Manager28* this) { gUnk_08108D28[this->manager.action](this); } -NONMATCH("asm/non_matching/manager28/sub_0805C94C.inc", void sub_0805C94C(Manager28* this)) { - if (!this->manager.unk_0a) { +NONMATCH("asm/non_matching/manager28/Manager28_Init.inc", void Manager28_Init(Manager28* this)) { + if (this->manager.unk_0a == DoInit) { s32 tmp2; int tmp4; for (tmp4 = 0; tmp4 < 8; tmp4++) { this->unk_20[tmp4] = 0; } - tmp2 = sub_0805CA6C(this);//maybe 2 params? + tmp2 = Manager28_FindMatchingEntities(this); if (tmp2 > 1) { Manager28* tmp3 = (Manager28*) GetEmptyManager(); if (tmp3) { tmp3->manager.type = 9; tmp3->manager.subtype = 0x28; - tmp3->manager.unk_0a = 1; + tmp3->manager.unk_0a = DoNotInit; tmp3->manager.unk_0e = tmp2; for (tmp4 = 0; tmp4 < 8; tmp4++) { tmp3->unk_20[tmp4] = this->unk_20[tmp4]; @@ -45,18 +58,18 @@ NONMATCH("asm/non_matching/manager28/sub_0805C94C.inc", void sub_0805C94C(Manage } DeleteManager(&this->manager); } else { - this->manager.action = 1; + this->manager.action = Main; this->manager.unk_0f = 0; } } END_NONMATCH -void sub_0805C9BC(Manager28* this) { +void Manager28_Main(Manager28* this) { s32 n; s32 i; s32 j; Entity* tmp; - sub_0805CB48(this); + Manager28_RemoveDeletedEntities(this); n = this->manager.unk_0e - 1; if ((this->manager.unk_0f++) & 1) { for (i = 0; i < n; i++) { @@ -75,7 +88,7 @@ void sub_0805C9BC(Manager28* this) { } } -u32 sub_0805CA6C(Manager28* this) { +u32 Manager28_FindMatchingEntities(Manager28* this) { u32 re = 0; EntityData * tmp = GetCurrentRoomProperty(this->manager.unk_0b); if (!tmp) return 0; @@ -83,7 +96,7 @@ u32 sub_0805CA6C(Manager28* this) { Entity* tmp2; u32 i; if (tmp->type != 3) continue; - tmp2 = sub_0805CAF0(tmp); + tmp2 = Manager28_FindMatchingEntity(tmp); if (!tmp2) continue; for (i = 0; i < re; i++) { if (this->unk_20[i] == tmp2) break; @@ -95,7 +108,7 @@ u32 sub_0805CA6C(Manager28* this) { return re; } -Entity* sub_0805CAF0(EntityData* unk1) { +Entity* Manager28_FindMatchingEntity(EntityData* unk1) { u32 x, y; Entity* i; LinkedList* tmp; @@ -114,12 +127,12 @@ Entity* sub_0805CAF0(EntityData* unk1) { return 0; } -void sub_0805CB48(Manager28* this) { +void Manager28_RemoveDeletedEntities(Manager28* this) { s32 i; for (i = 0; i < this->manager.unk_0e; i++) { if (this->unk_20[i]->next == 0) { if (this->manager.unk_0e-1 == i) { - this->unk_20[i] = this->unk_20[i]->next; + this->unk_20[i] = 0; } else { this->unk_20[i] = this->unk_20[this->manager.unk_0e-1]; } -- cgit v1.2.3 From dee308d56d04ad6233784e3395dc8d72c9cf03f8 Mon Sep 17 00:00:00 2001 From: Ibot02 Date: Mon, 18 Jan 2021 16:58:25 +0100 Subject: manager28.c: more renaming --- src/manager/manager28.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/manager/manager28.c b/src/manager/manager28.c index 3ea38f38..382f072f 100644 --- a/src/manager/manager28.c +++ b/src/manager/manager28.c @@ -6,17 +6,17 @@ typedef struct { Manager manager; - Entity* unk_20[8]; + Entity* enemies[8]; } Manager28; -void Manager28_Main(Manager28*); +void Manager28_Entry(Manager28*); void Manager28_Init(Manager28*); -void sub_0805C9BC(Manager28*); +void Manager28_Main(Manager28*); u32 Manager28_FindMatchingEntities(Manager28*); Entity* Manager28_FindMatchingEntity(EntityData*); void Manager28_RemoveDeletedEntities(Manager28*); -void (* const gUnk_08108D28[])(Manager28*) = { +void (* const Manager28_ActionFuncs[])(Manager28*) = { Manager28_Init, Manager28_Main }; @@ -32,7 +32,7 @@ enum Manager28_InitState { }; void Manager28_Entry(Manager28* this) { - gUnk_08108D28[this->manager.action](this); + Manager28_ActionFuncs[this->manager.action](this); } NONMATCH("asm/non_matching/manager28/Manager28_Init.inc", void Manager28_Init(Manager28* this)) { @@ -40,7 +40,7 @@ NONMATCH("asm/non_matching/manager28/Manager28_Init.inc", void Manager28_Init(Ma s32 tmp2; int tmp4; for (tmp4 = 0; tmp4 < 8; tmp4++) { - this->unk_20[tmp4] = 0; + this->enemies[tmp4] = 0; } tmp2 = Manager28_FindMatchingEntities(this); if (tmp2 > 1) { @@ -51,7 +51,7 @@ NONMATCH("asm/non_matching/manager28/Manager28_Init.inc", void Manager28_Init(Ma tmp3->manager.unk_0a = DoNotInit; tmp3->manager.unk_0e = tmp2; for (tmp4 = 0; tmp4 < 8; tmp4++) { - tmp3->unk_20[tmp4] = this->unk_20[tmp4]; + tmp3->enemies[tmp4] = this->enemies[tmp4]; } AppendEntityToList(tmp3, 6); } @@ -73,16 +73,16 @@ void Manager28_Main(Manager28* this) { n = this->manager.unk_0e - 1; if ((this->manager.unk_0f++) & 1) { for (i = 0; i < n; i++) { - tmp = this->unk_20[i]; + tmp = this->enemies[i]; for (j = i + 1; j < this->manager.unk_0e; j++) { - sub_08004484(tmp, this->unk_20[j]); + sub_08004484(tmp, this->enemies[j]); } } } else { for (i = 0; i < n; i++) { - tmp = this->unk_20[i]; + tmp = this->enemies[i]; for (j = i + 1; j < this->manager.unk_0e; j++) { - sub_08004484(this->unk_20[j], tmp); + sub_08004484(this->enemies[j], tmp); } } } @@ -99,10 +99,10 @@ u32 Manager28_FindMatchingEntities(Manager28* this) { tmp2 = Manager28_FindMatchingEntity(tmp); if (!tmp2) continue; for (i = 0; i < re; i++) { - if (this->unk_20[i] == tmp2) break; + if (this->enemies[i] == tmp2) break; } if (i != re) continue; - this->unk_20[re++] = tmp2; + this->enemies[re++] = tmp2; if (re == 8) return 8; } return re; @@ -130,11 +130,11 @@ Entity* Manager28_FindMatchingEntity(EntityData* unk1) { void Manager28_RemoveDeletedEntities(Manager28* this) { s32 i; for (i = 0; i < this->manager.unk_0e; i++) { - if (this->unk_20[i]->next == 0) { + if (this->enemies[i]->next == 0) { if (this->manager.unk_0e-1 == i) { - this->unk_20[i] = 0; + this->enemies[i] = 0; } else { - this->unk_20[i] = this->unk_20[this->manager.unk_0e-1]; + this->enemies[i] = this->enemies[this->manager.unk_0e-1]; } this->manager.unk_0e--; } -- cgit v1.2.3