summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornotyourav <65437533+notyourav@users.noreply.github.com>2022-08-04 11:44:01 -0700
committerGitHub <noreply@github.com>2022-08-04 11:44:01 -0700
commitbbcea04f9ef17002bb98f1793ff058dc34b4f235 (patch)
treedaf0e58fe58d5f4d46d678ab044b5e1b80fefaad
parent7f3bc829e91af0b15fd2d969bcc93b348931b92e (diff)
parentb20c9cb98c33feef7ec6c82c9231987ed238615e (diff)
Merge pull request #547 from hatal175/DelayedEntityLoadManager_Main
-rw-r--r--asm/non_matching/delayedEntityLoadManager/DelayedEntityLoadManager_Main.inc184
-rw-r--r--include/asm.h1
-rw-r--r--include/npc.h13
-rw-r--r--include/script.h2
-rw-r--r--src/manager/delayedEntityLoadManager.c74
-rw-r--r--src/manager/houseSignManager.c3
-rw-r--r--src/manager/lightManager.c2
-rw-r--r--src/manager/minishSizedEntranceManager.c3
-rw-r--r--src/npc.c9
-rw-r--r--src/object/houseSign.c5
-rw-r--r--src/script.c1
11 files changed, 94 insertions, 203 deletions
diff --git a/asm/non_matching/delayedEntityLoadManager/DelayedEntityLoadManager_Main.inc b/asm/non_matching/delayedEntityLoadManager/DelayedEntityLoadManager_Main.inc
deleted file mode 100644
index 24da0211..00000000
--- a/asm/non_matching/delayedEntityLoadManager/DelayedEntityLoadManager_Main.inc
+++ /dev/null
@@ -1,184 +0,0 @@
- .syntax unified
- push {r4, r5, r6, r7, lr}
- mov r7, sl
- mov r6, sb
- mov r5, r8
- push {r5, r6, r7}
- adds r6, r0, #0
- ldrb r0, [r6, #0xa]
- bl GetCurrentRoomProperty
- adds r4, r0, #0
- cmp r4, #0
- bne _0805AB68
- bl DeleteThisEntity
-_0805AB68:
- ldrb r0, [r6, #0xc]
- movs r1, #0x20
- adds r1, r1, r6
- mov r8, r1
- cmp r0, #0
- bne _0805ABC8
- adds r0, #1
- strb r0, [r6, #0xc]
- ldr r0, _0805ABF0 @ =gArea
- ldrb r0, [r0, #8]
- strb r0, [r1]
- adds r0, r6, #0
- movs r1, #6
- bl SetDefaultPriority
- ldr r2, _0805ABF4 @ =gNPCData
- ldrb r0, [r6, #0xb]
- mov r3, r8
- ldrb r1, [r3]
- adds r0, r0, r1
- lsls r0, r0, #4
- adds r2, r0, r2
- movs r5, #0
- mov sl, r5
- ldrb r0, [r4]
- movs r7, #0x21
- adds r7, r7, r6
- mov ip, r7
- cmp r0, #0xff
- beq _0805ABBE
-_0805ABA4:
- adds r1, r2, #0
- adds r0, r4, #0
- ldm r0!, {r3, r5, r7}
- stm r1!, {r3, r5, r7}
- ldr r0, [r0]
- str r0, [r1]
- movs r0, #1
- add sl, r0
- adds r4, #0x10
- adds r2, #0x10
- ldrb r0, [r4]
- cmp r0, #0xff
- bne _0805ABA4
-_0805ABBE:
- movs r0, #0xff
- strb r0, [r2]
- mov r2, sl
- mov r1, ip
- strb r2, [r1]
-_0805ABC8:
- ldr r4, _0805ABF4 @ =gNPCData
- ldrb r2, [r6, #0xb]
- mov r3, r8
- ldrb r1, [r3]
- adds r0, r2, r1
- lsls r0, r0, #4
- adds r4, r0, r4
- ldr r0, _0805ABF8 @ =gSave
- movs r5, #1
- mov sl, r5
- mov r7, sl
- ldrb r0, [r0, #8]
- lsls r7, r0
- mov sl, r7
- adds r0, r1, #7
- asrs r0, r0, #3
- ldr r1, _0805ABFC @ =gUnk_020342F8
- adds r7, r0, r1
- adds r5, r2, #0
- b _0805ACAA
- .align 2, 0
-_0805ABF0: .4byte gArea
-_0805ABF4: .4byte gNPCData
-_0805ABF8: .4byte gSave
-_0805ABFC: .4byte gUnk_020342F8
-_0805AC00:
- ldrh r0, [r4, #4]
- ldrh r1, [r4, #6]
- movs r2, #0x18
- movs r3, #0x20
- bl CheckRectOnScreen
- cmp r0, #0
- bne _0805AC1A
- adds r0, r7, #0
- adds r1, r5, #0
- bl ClearBit
- b _0805ACA6
-_0805AC1A:
- ldrh r0, [r4, #0xe]
- mov r1, sl
- ands r0, r1
- cmp r0, #0
- beq _0805ACA6
- ldr r0, _0805AC5C @ =gEntCount
- ldrb r0, [r0]
- cmp r0, #0x46
- bhi _0805ACA6
- adds r0, r7, #0
- adds r1, r5, #0
- bl WriteBit
- cmp r0, #0
- bne _0805ACA6
- ldr r0, [r4, #8]
- cmp r0, #0
- beq _0805AC48
- bl CreateScriptExecutionContext
- mov sb, r0
- cmp r0, #0
- beq _0805ACA6
-_0805AC48:
- ldrb r0, [r6, #0xe]
- cmp r0, #0
- bne _0805AC60
- ldrb r0, [r4]
- ldrb r1, [r4, #1]
- ldrb r2, [r4, #2]
- bl CreateNPC
- b _0805AC6A
- .align 2, 0
-_0805AC5C: .4byte gEntCount
-_0805AC60:
- ldrb r0, [r4]
- ldrb r1, [r4, #1]
- ldrb r2, [r4, #2]
- bl CreateObject
-_0805AC6A:
- adds r3, r0, #0
- mov r2, r8
- ldrb r0, [r2]
- adds r0, #1
- adds r0, r5, r0
- adds r1, r3, #0
- adds r1, #0x45
- strb r0, [r1]
- ldrh r0, [r4, #0xc]
- strb r0, [r3, #0xe]
- ldr r1, _0805ACBC @ =gRoomControls
- ldrh r0, [r1, #6]
- ldrh r2, [r4, #4]
- adds r0, r0, r2
- strh r0, [r3, #0x2e]
- ldrh r0, [r1, #8]
- ldrh r1, [r4, #6]
- adds r0, r0, r1
- strh r0, [r3, #0x32]
- ldrb r1, [r4, #3]
- adds r0, r3, #0
- adds r0, #0x38
- strb r1, [r0]
- ldr r2, [r4, #8]
- cmp r2, #0
- beq _0805ACA6
- adds r0, r3, #0
- mov r1, sb
- bl InitScriptForEntity
-_0805ACA6:
- adds r4, #0x10
- adds r5, #1
-_0805ACAA:
- ldrb r0, [r4]
- cmp r0, #0xff
- bne _0805AC00
- pop {r3, r4, r5}
- mov r8, r3
- mov sb, r4
- mov sl, r5
- pop {r4, r5, r6, r7, pc}
- .align 2, 0
-_0805ACBC: .4byte gRoomControls
- .syntax divided
diff --git a/include/asm.h b/include/asm.h
index f14e6f01..7a05b9b7 100644
--- a/include/asm.h
+++ b/include/asm.h
@@ -46,5 +46,6 @@ extern u32 sub_0800445C(struct Entity_*);
extern u32 sub_080B1AF0(struct Entity_*, s32, s32);
extern u32 GetRelativeCollisionTile(struct Entity_*, u32, u32);
extern bool32 sub_080B1B54(u32);
+extern u32 CheckRectOnScreen(s32, s32, u32, u32);
#endif // ASM_H
diff --git a/include/npc.h b/include/npc.h
index 05ee9e36..6f719154 100644
--- a/include/npc.h
+++ b/include/npc.h
@@ -51,6 +51,19 @@ typedef struct {
} data;
} Dialog;
+typedef struct {
+ /*0x00*/ u8 id;
+ /*0x01*/ u8 type;
+ /*0x02*/ u8 type2;
+ /*0x03*/ u8 collisionLayer;
+ /*0x04*/ u16 x;
+ /*0x06*/ u16 y;
+ /*0x08*/ u16* script;
+ /*0x0c*/ u16 timer;
+ /*0x0e*/ u16 progressBitfield; /**< For which gSave.global_process this NPC should appear. */
+} NPCStruct;
+extern NPCStruct gNPCData[50];
+
void sub_0806EC20(Entity* ent);
void sub_0806EC38(void);
u32 sub_0806ED78(Entity* ent);
diff --git a/include/script.h b/include/script.h
index 4591ac27..0c1c4ed5 100644
--- a/include/script.h
+++ b/include/script.h
@@ -29,6 +29,8 @@ typedef struct {
} ActiveScriptInfo;
extern ActiveScriptInfo gActiveScriptInfo;
+ScriptExecutionContext* CreateScriptExecutionContext(void);
+void InitScriptForEntity(Entity*, ScriptExecutionContext*, u16*);
void ExecuteScript(Entity* entity, ScriptExecutionContext* context);
extern u32 GetNextScriptCommandHalfword(u16*);
diff --git a/src/manager/delayedEntityLoadManager.c b/src/manager/delayedEntityLoadManager.c
index a878d70e..f113330a 100644
--- a/src/manager/delayedEntityLoadManager.c
+++ b/src/manager/delayedEntityLoadManager.c
@@ -6,9 +6,79 @@
*/
#include "manager/delayedEntityLoadManager.h"
#include "room.h"
+#include "npc.h"
+#include "area.h"
+#include "asm.h"
-ASM_FUNC("asm/non_matching/delayedEntityLoadManager/DelayedEntityLoadManager_Main.inc",
- void DelayedEntityLoadManager_Main())
+typedef struct {
+ Manager base;
+ u8 unk_20;
+ u8 spawnedCount; /**< Count of entities spawned by this manager */
+} DelayedEntityLoadManager;
+
+extern u8 gUnk_020342F8[];
+
+void DelayedEntityLoadManager_Main(DelayedEntityLoadManager* this) {
+ NPCStruct* properties;
+ NPCStruct* npcPtr;
+ NPCStruct* npcPtr2;
+ Entity* entity;
+ u32 index1;
+ u32 index2;
+ u32 tmp;
+ u32 progressMask;
+ u8* bitfield;
+ ScriptExecutionContext* context;
+
+ properties = GetCurrentRoomProperty(super->type);
+ if (properties == NULL) {
+ DeleteThisEntity();
+ }
+ if (super->action == 0) {
+ super->action++;
+ this->unk_20 = gArea.filler[2];
+ SetDefaultPriority((Entity*)this, 6);
+ npcPtr = gNPCData;
+ npcPtr += (super->type2 + this->unk_20);
+ index1 = 0;
+ while (properties->id != 0xff) {
+ *npcPtr = *properties;
+ index1++;
+ properties++;
+ npcPtr++;
+ }
+ npcPtr->id = 0xff;
+ this->spawnedCount = index1;
+ }
+ npcPtr2 = gNPCData;
+ npcPtr2 = &npcPtr2[(super->type2 + this->unk_20)];
+ progressMask = 1 << gSave.global_progress;
+ bitfield = &gUnk_020342F8[(this->unk_20 + 7) / 8];
+ index2 = super->type2;
+ while (npcPtr2->id != 0xff) {
+ if (!CheckRectOnScreen(npcPtr2->x, npcPtr2->y, 0x18, 0x20)) {
+ ClearBit(bitfield, index2);
+ } else if ((npcPtr2->progressBitfield & progressMask) && gEntCount < 0x47 && !WriteBit(bitfield, index2) &&
+ (npcPtr2->script == NULL || (context = CreateScriptExecutionContext(), context != NULL))) {
+ if (super->timer == 0) {
+ entity = CreateNPC(npcPtr2->id, npcPtr2->type, npcPtr2->type2);
+ } else {
+ entity = CreateObject(npcPtr2->id, npcPtr2->type, npcPtr2->type2);
+ }
+ tmp = this->unk_20 + 1;
+ entity->health = index2 + tmp;
+ entity->timer = npcPtr2->timer;
+ entity->x.HALF.HI = npcPtr2->x + gRoomControls.origin_x;
+ entity->y.HALF.HI = npcPtr2->y + gRoomControls.origin_y;
+ entity->collisionLayer = npcPtr2->collisionLayer;
+ if (npcPtr2->script != NULL) {
+ InitScriptForEntity(entity, context, npcPtr2->script);
+ }
+ }
+ npcPtr2++;
+ index2++;
+ }
+}
u32 sub_0805ACC0(Entity* param_1) {
u16* ptr;
diff --git a/src/manager/houseSignManager.c b/src/manager/houseSignManager.c
index 6478310e..8722de83 100644
--- a/src/manager/houseSignManager.c
+++ b/src/manager/houseSignManager.c
@@ -11,6 +11,7 @@
#include "area.h"
#include "object.h"
#include "room.h"
+#include "asm.h"
typedef struct {
u16 x;
@@ -21,8 +22,6 @@ typedef struct {
u8 _padding;
} SpawnData;
-extern u32 CheckRectOnScreen(u16, u16, u32, u32);
-
void HouseSignManager_Main(HouseSignManager* this) {
static const SpawnData gUnk_081084C8[] = {
{ 0x48, 0x90, 0x0, 0x0, 0x2, 0x0 }, { 0x138, 0x30, 0x1, 0x1, 0x2, 0x0 },
diff --git a/src/manager/lightManager.c b/src/manager/lightManager.c
index 9aa3df2c..edad0b7d 100644
--- a/src/manager/lightManager.c
+++ b/src/manager/lightManager.c
@@ -14,10 +14,10 @@
#include "player.h"
#include "room.h"
#include "screen.h"
+#include "asm.h"
extern void sub_0801E120(void);
extern void sub_0801E154(u32);
-extern u32 CheckRectOnScreen(s32, s32, u32, u32);
extern void sub_0801E160(u32, u32, u32);
bool32 sub_0805BA78();
diff --git a/src/manager/minishSizedEntranceManager.c b/src/manager/minishSizedEntranceManager.c
index de5a1969..3cac2f1f 100644
--- a/src/manager/minishSizedEntranceManager.c
+++ b/src/manager/minishSizedEntranceManager.c
@@ -9,8 +9,7 @@
#include "functions.h"
#include "object.h"
#include "room.h"
-
-extern bool32 CheckRectOnScreen(u16, u16, u32, u32);
+#include "asm.h"
typedef struct {
u16 x;
diff --git a/src/npc.c b/src/npc.c
index 244749f0..99c07fee 100644
--- a/src/npc.c
+++ b/src/npc.c
@@ -4,13 +4,6 @@
#include "npc.h"
extern u32 gUnk_020342F8;
-typedef struct {
- u16 unk0;
- u16 unk1;
- u16 x;
- u16 y;
-} NPCStruct;
-extern NPCStruct gNPCData[100];
extern void InitNPC(Entity*);
@@ -29,7 +22,7 @@ void NPCUpdate(Entity* this) {
if (this->health % 0x80) {
NPCStruct* npc = gNPCData;
- npc += (this->health * 2 - 2);
+ npc += (this->health - 1);
npc->x = this->x.HALF.HI - gRoomControls.origin_x;
npc->y = this->y.HALF.HI - gRoomControls.origin_y;
}
diff --git a/src/object/houseSign.c b/src/object/houseSign.c
index 7e5413b0..b8972164 100644
--- a/src/object/houseSign.c
+++ b/src/object/houseSign.c
@@ -5,8 +5,7 @@
* @brief HouseSign object
*/
#include "entity.h"
-
-extern u32 CheckRectOnScreen(s16, s16, u32, u32);
+#include "asm.h"
/*
This object is created by HouseSignManager.
@@ -17,7 +16,7 @@ void HouseSign(Entity* this) {
if (this->action == 0) {
this->action = 1;
}
- if (CheckRectOnScreen(this->field_0x80.HWORD, this->field_0x82.HWORD, 0x10, 0x10) == 0) {
+ if (CheckRectOnScreen((s16)this->field_0x80.HWORD, (s16)this->field_0x82.HWORD, 0x10, 0x10) == 0) {
this->parent->zVelocity &= ~(1 << this->type2);
DeleteThisEntity();
}
diff --git a/src/script.c b/src/script.c
index ed3d67e4..a8725c7d 100644
--- a/src/script.c
+++ b/src/script.c
@@ -10,7 +10,6 @@
#include "item.h"
#include "ui.h"
-void InitScriptForEntity(Entity*, ScriptExecutionContext*, u16*);
void InitScriptExecutionContext(ScriptExecutionContext* context, u16* script);
void sub_0807DE80(Entity*);
void DisablePauseMenu(void);