summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIbot02 <jtp.jtp@gmx.de>2021-01-21 20:04:35 +0100
committerGitHub <noreply@github.com>2021-01-21 20:04:35 +0100
commit02632295f2280366b1fbcd9d3015bed4eb4f8d37 (patch)
tree8f4354161a08190f18e047a35b19a06fdc31ec00 /src
parent9dc15ba3807bfa637630df388be2ceba8b34f0d0 (diff)
parentdee308d56d04ad6233784e3395dc8d72c9cf03f8 (diff)
Merge pull request #111 from Ibot02/manager28
Manager28.c: ok
Diffstat (limited to 'src')
-rw-r--r--src/enemy/bladeTrap.c1
-rw-r--r--src/entity.c6
-rw-r--r--src/loadRoom.c1
-rw-r--r--src/manager/manager28.c143
-rw-r--r--src/manager/managerB.c1
-rw-r--r--src/manager/managerE.c1
-rw-r--r--src/object/houseDoorExterior.c1
-rw-r--r--src/object/lightableSwitch.c1
-rw-r--r--src/object/lilypadSmall.c1
-rw-r--r--src/object/object48.c2
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) &&