diff options
| author | Ibot02 <jtp.jtp@gmx.de> | 2021-01-21 20:04:35 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-01-21 20:04:35 +0100 |
| commit | 02632295f2280366b1fbcd9d3015bed4eb4f8d37 (patch) | |
| tree | 8f4354161a08190f18e047a35b19a06fdc31ec00 /src | |
| parent | 9dc15ba3807bfa637630df388be2ceba8b34f0d0 (diff) | |
| parent | dee308d56d04ad6233784e3395dc8d72c9cf03f8 (diff) | |
Merge pull request #111 from Ibot02/manager28
Manager28.c: ok
Diffstat (limited to 'src')
| -rw-r--r-- | src/enemy/bladeTrap.c | 1 | ||||
| -rw-r--r-- | src/entity.c | 6 | ||||
| -rw-r--r-- | src/loadRoom.c | 1 | ||||
| -rw-r--r-- | src/manager/manager28.c | 143 | ||||
| -rw-r--r-- | src/manager/managerB.c | 1 | ||||
| -rw-r--r-- | src/manager/managerE.c | 1 | ||||
| -rw-r--r-- | src/object/houseDoorExterior.c | 1 | ||||
| -rw-r--r-- | src/object/lightableSwitch.c | 1 | ||||
| -rw-r--r-- | src/object/lilypadSmall.c | 1 | ||||
| -rw-r--r-- | src/object/object48.c | 2 |
10 files changed, 144 insertions, 14 deletions
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..382f072f --- /dev/null +++ b/src/manager/manager28.c @@ -0,0 +1,143 @@ +#include "global.h" +#include "manager.h" +#include "entity.h" +#include "room.h" +#include "functions.h" + +typedef struct { + Manager manager; + Entity* enemies[8]; +} Manager28; + +void Manager28_Entry(Manager28*); +void Manager28_Init(Manager28*); +void Manager28_Main(Manager28*); +u32 Manager28_FindMatchingEntities(Manager28*); +Entity* Manager28_FindMatchingEntity(EntityData*); +void Manager28_RemoveDeletedEntities(Manager28*); + +void (* const Manager28_ActionFuncs[])(Manager28*) = { + Manager28_Init, + Manager28_Main +}; + +enum Manager28_Action { + Init = 0, + Main = 1 +}; + +enum Manager28_InitState { + DoInit = 0, + DoNotInit = 1 +}; + +void Manager28_Entry(Manager28* this) { + Manager28_ActionFuncs[this->manager.action](this); +} + +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->enemies[tmp4] = 0; + } + 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 = DoNotInit; + tmp3->manager.unk_0e = tmp2; + for (tmp4 = 0; tmp4 < 8; tmp4++) { + tmp3->enemies[tmp4] = this->enemies[tmp4]; + } + AppendEntityToList(tmp3, 6); + } + } + DeleteManager(&this->manager); + } else { + this->manager.action = Main; + this->manager.unk_0f = 0; + } +} +END_NONMATCH + +void Manager28_Main(Manager28* this) { + s32 n; + s32 i; + s32 j; + Entity* tmp; + Manager28_RemoveDeletedEntities(this); + n = this->manager.unk_0e - 1; + if ((this->manager.unk_0f++) & 1) { + for (i = 0; i < n; i++) { + tmp = this->enemies[i]; + for (j = i + 1; j < this->manager.unk_0e; j++) { + sub_08004484(tmp, this->enemies[j]); + } + } + } else { + for (i = 0; i < n; i++) { + tmp = this->enemies[i]; + for (j = i + 1; j < this->manager.unk_0e; j++) { + sub_08004484(this->enemies[j], tmp); + } + } + } +} + +u32 Manager28_FindMatchingEntities(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 = Manager28_FindMatchingEntity(tmp); + if (!tmp2) continue; + for (i = 0; i < re; i++) { + if (this->enemies[i] == tmp2) break; + } + if (i != re) continue; + this->enemies[re++] = tmp2; + if (re == 8) return 8; + } + return re; +} + +Entity* Manager28_FindMatchingEntity(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 Manager28_RemoveDeletedEntities(Manager28* this) { + s32 i; + for (i = 0; i < this->manager.unk_0e; i++) { + if (this->enemies[i]->next == 0) { + if (this->manager.unk_0e-1 == i) { + this->enemies[i] = 0; + } else { + this->enemies[i] = this->enemies[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) && |
