From a096aef11559d73e6cf9959d72cbd78b72ee7f38 Mon Sep 17 00:00:00 2001 From: daft7 Date: Sat, 15 Feb 2025 22:25:40 -0600 Subject: [PATCH 01/11] Add template function xUtil_select to xutil.h. --- src/SB/Core/x/xutil.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/SB/Core/x/xutil.h b/src/SB/Core/x/xutil.h index 7f61cce7d..2b6311124 100644 --- a/src/SB/Core/x/xutil.h +++ b/src/SB/Core/x/xutil.h @@ -11,4 +11,7 @@ U32 xUtil_crc_update(U32 crc_accum, char* data, S32 datasize); S32 xUtil_yesno(F32 wt_yes); void xUtil_wtadjust(F32* wts, S32 cnt, F32 arbref); +template +T* xUtil_select(T** arg0, S32 arg1, const F32* arg3); + #endif From ad9d0b3a5f84eda26d93280260cf75c28012a0e5 Mon Sep 17 00:00:00 2001 From: daft7 Date: Sat, 15 Feb 2025 22:37:53 -0600 Subject: [PATCH 02/11] Filled in zNPCCommon struct with information from m2c decompiler. --- src/SB/Game/zNPCSpawner.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/SB/Game/zNPCSpawner.h b/src/SB/Game/zNPCSpawner.h index 231131d8c..3e0306d1a 100644 --- a/src/SB/Game/zNPCSpawner.h +++ b/src/SB/Game/zNPCSpawner.h @@ -50,7 +50,10 @@ enum en_SM_NPC_STATUS SM_NPC_FORCE = 0x7fffffff }; -struct zNPCCommon; +struct zNPCCommon { + /* 0x000 */ char pad0[0x1B8]; + /* 0x1B8 */ void *unk1B8; /* inferred */ +}; /* size >= 0x1BC */ struct SMDepot { From 4a06066646fa86d8a719f8c7079baaeae2b184c2 Mon Sep 17 00:00:00 2001 From: daft7 Date: Sat, 15 Feb 2025 22:39:51 -0600 Subject: [PATCH 03/11] Edited pendlist and actvlist types to pointers. --- src/SB/Game/zNPCSpawner.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SB/Game/zNPCSpawner.h b/src/SB/Game/zNPCSpawner.h index 3e0306d1a..dfc083504 100644 --- a/src/SB/Game/zNPCSpawner.h +++ b/src/SB/Game/zNPCSpawner.h @@ -86,8 +86,8 @@ struct zNPCSpawner : RyzMemData S32 cnt_spawn; SMSPStatus sppool[16]; SMNPCStatus npcpool[16]; - st_XORDEREDARRAY pendlist; - st_XORDEREDARRAY actvlist; + st_XORDEREDARRAY* pendlist; + st_XORDEREDARRAY* actvlist; //0x1A4 S32 cnt_cleanup; void Subscribe(zNPCCommon* owner); From 4c836515c5b890d95be7a4f7cb89237199afbffe Mon Sep 17 00:00:00 2001 From: daft7 Date: Sat, 15 Feb 2025 22:42:20 -0600 Subject: [PATCH 04/11] Modified existing functions to smooth additions. --- src/SB/Game/zNPCSpawner.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SB/Game/zNPCSpawner.cpp b/src/SB/Game/zNPCSpawner.cpp index d818be777..1f7f79b83 100644 --- a/src/SB/Game/zNPCSpawner.cpp +++ b/src/SB/Game/zNPCSpawner.cpp @@ -70,8 +70,8 @@ void zNPCSpawner::Subscribe(zNPCCommon* owner) this->tym_delay = _805_Spawner; this->max_spawn = -1; this->wavestat = SM_STAT_BEGIN; - XOrdInit(&this->pendlist, 0x10, 0); - XOrdInit(&this->actvlist, 0x10, 0); + XOrdInit(this->pendlist, 0x10, 0); + XOrdInit(this->actvlist, 0x10, 0); } void zNPCSpawner::SetWaveMode(en_SM_WAVE_MODE mode, F32 delay, S32 lifemax) @@ -164,7 +164,7 @@ void zNPCSpawner::SetNPCStatus(zNPCCommon* npc, en_SM_NPC_STATUS status) SMNPCStatus* zNPCSpawner::ToastedBeastie(zNPCCommon* npc) { SMNPCStatus* ret = this->StatForNPC(npc); - XOrdRemove(&this->actvlist, ret, -1); + XOrdRemove(this->actvlist, ret, -1); zEntEvent((xBase*)this->npc_owner, eEventDuploNPCKilled); return ret; } From 2e09055e0b67cfceedcd3923d7a63fa0873a5f8f Mon Sep 17 00:00:00 2001 From: daft7 Date: Sat, 15 Feb 2025 22:45:20 -0600 Subject: [PATCH 05/11] Added partial matches for FillPending, ReFillPending, NextPendingNPC, and StatforNPC. Also have outline for ClearActive in comments. --- src/SB/Game/zNPCSpawner.cpp | 91 +++++++++++++++++++++++++++++++++++++ src/SB/Game/zNPCSpawner.h | 4 ++ 2 files changed, 95 insertions(+) diff --git a/src/SB/Game/zNPCSpawner.cpp b/src/SB/Game/zNPCSpawner.cpp index 1f7f79b83..716849667 100644 --- a/src/SB/Game/zNPCSpawner.cpp +++ b/src/SB/Game/zNPCSpawner.cpp @@ -177,3 +177,94 @@ U8 zMovePoint::IsOn() { return this->on; } + + +st_XORDEREDARRAY* zNPCSpawner::FillPending() +{ + ClearPending(); + ReFillPending(); + return this->actvlist; +} + +st_XORDEREDARRAY* zNPCSpawner::ReFillPending() +{ + s32 var_r28; + zNPCCommon *temp_r29; + zNPCSpawner *var_r30; + + var_r28 = 0; + var_r30 = this; + do { + temp_r29 = var_r30->npc_owner; + if (((zNPCCommon*)var_r30->npc_owner != NULL) && ((s32) temp_r29->pad0[4] == 1)) + { + XOrdAppend(this->pendlist, (void*) temp_r29); + temp_r29->pad0[4] = 2; + } + var_r28 += 1; + var_r30 += 0xC; + } while (var_r28 < 0x10); + return this->actvlist; +} + + +// void zNPCSpawner::ClearActive() +// { +// s32 var_r6; +// s32 var_r7; +// void *temp_r5; + +// var_r7 = 0; +// var_r6 = 0; +// loop_4: +// if (var_r7 < (s32) this->cnt_cleanup) { +// temp_r5 = *(this->pendlist->list + var_r6); +// if (temp_r5 != NULL) { +// (u32) temp_r5[1] = 1; +// } +// var_r6 += 4; +// var_r7 += 1; +// goto loop_4; +// } +// XOrdReset__FP16st_XORDEREDARRAY(&this->unk1B0); +// } + +SMNPCStatus* zNPCSpawner::NextPendingNPC( s32 arg0 ) +{ + S32 temp_r4; + const F32* temp_ptr = NULL; + + temp_r4 = (S32) this->actvlist; + if (temp_r4 < 1) { + return NULL; + } + return xUtil_select((SMNPCStatus **) this->pendlist, temp_r4, temp_ptr); +} + +/* zNPCSpawner::StatForNPC (zNPCCommon *) */ +SMNPCStatus* zNPCSpawner::StatForNPC(zNPCCommon *npc) { + s32 var_ctr; + SMNPCStatus *var_r6; + zNPCCommon *temp_r0; + zNPCCommon *temp_r0_2; + zNPCCommon *temp_r0_3; + zNPCCommon *temp_r0_4; + zNPCCommon *temp_r0_5; + zNPCCommon *temp_r0_6; + zNPCCommon *temp_r0_7; + zNPCCommon *temp_r0_8; + + var_r6 = NULL; + var_ctr = 2; + + for (var_ctr = 0; var_ctr < 16; var_ctr++) + { + temp_r0 = this->npcpool[var_ctr].npc; + if ((temp_r0 != NULL) && (temp_r0 == npc)) + { + var_r6 = &this->npcpool[var_ctr]; + } + } + + return var_r6; +} diff --git a/src/SB/Game/zNPCSpawner.h b/src/SB/Game/zNPCSpawner.h index dfc083504..339b51d82 100644 --- a/src/SB/Game/zNPCSpawner.h +++ b/src/SB/Game/zNPCSpawner.h @@ -5,6 +5,7 @@ #include "xRMemData.h" #include "xordarray.h" +#include "xutil.h" enum en_SM_NOTICES { @@ -106,6 +107,9 @@ struct zNPCSpawner : RyzMemData // NextPendingNPC. void ClearActive(); void ClearPending(); + SMNPCStatus* NextPendingNPC( s32 arg0 ); + st_XORDEREDARRAY* FillPending(); + st_XORDEREDARRAY* ReFillPending(); void SetNPCStatus(zNPCCommon* npc, en_SM_NPC_STATUS status); From 8396a3d971b2a0f199c22d95cde738afccb79cab Mon Sep 17 00:00:00 2001 From: daft7 Date: Sun, 16 Feb 2025 14:11:04 -0600 Subject: [PATCH 06/11] zNPCCommon definition removed, now included from zNPCTypeCommon. Moved en_SM_NOTICES to zNPCTypeCommon to avoid recursive include. --- src/SB/Game/zNPCSpawner.h | 19 +------------------ src/SB/Game/zNPCTypeCommon.h | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/SB/Game/zNPCSpawner.h b/src/SB/Game/zNPCSpawner.h index 339b51d82..c309d09ed 100644 --- a/src/SB/Game/zNPCSpawner.h +++ b/src/SB/Game/zNPCSpawner.h @@ -7,19 +7,7 @@ #include "xordarray.h" #include "xutil.h" -enum en_SM_NOTICES -{ - SM_NOTE_NPCDIED, - SM_NOTE_NPCSTANDBY, - SM_NOTE_NPCALIVE, - SM_NOTE_DUPPAUSE, - SM_NOTE_DUPRESUME, - SM_NOTE_DUPSETDELAY, - SM_NOTE_DUPDEAD, - SM_NOTE_KILLKIDS, - SM_NOTE_NOMORE, - SM_NOTE_FORCE = 0x7fffffff -}; +#include "zNPCTypeCommon.h" enum en_SM_WAVE_MODE { @@ -51,11 +39,6 @@ enum en_SM_NPC_STATUS SM_NPC_FORCE = 0x7fffffff }; -struct zNPCCommon { - /* 0x000 */ char pad0[0x1B8]; - /* 0x1B8 */ void *unk1B8; /* inferred */ -}; /* size >= 0x1BC */ - struct SMDepot { st_XORDEREDARRAY spawners; diff --git a/src/SB/Game/zNPCTypeCommon.h b/src/SB/Game/zNPCTypeCommon.h index bb1e19f1f..af36bac10 100644 --- a/src/SB/Game/zNPCTypeCommon.h +++ b/src/SB/Game/zNPCTypeCommon.h @@ -10,7 +10,6 @@ #include "xSFX.h" #include "zNPCSndTable.h" -#include "zNPCSpawner.h" #include "zMovePoint.h" #include "zShrapnel.h" @@ -340,6 +339,20 @@ enum en_NPC_MSG_DATA NPC_MDAT_FORCE = 0x7fffffff }; +enum en_SM_NOTICES +{ + SM_NOTE_NPCDIED, + SM_NOTE_NPCSTANDBY, + SM_NOTE_NPCALIVE, + SM_NOTE_DUPPAUSE, + SM_NOTE_DUPRESUME, + SM_NOTE_DUPSETDELAY, + SM_NOTE_DUPDEAD, + SM_NOTE_KILLKIDS, + SM_NOTE_NOMORE, + SM_NOTE_FORCE = 0x7fffffff +}; + struct zNPCLassoInfo { en_LASSO_STATUS stage; From c1660b71fb89a927143ca0e5f55ccf5868006d3f Mon Sep 17 00:00:00 2001 From: daft7 Date: Sun, 16 Feb 2025 14:15:01 -0600 Subject: [PATCH 07/11] zNPCTypeDuplotron now pulls zNPCSpawner definition directly from zNPCSpawner instead of transitively via zNPCTypeCommon. --- src/SB/Game/zNPCTypeDuplotron.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SB/Game/zNPCTypeDuplotron.h b/src/SB/Game/zNPCTypeDuplotron.h index 6aa351884..d39fb3a5f 100644 --- a/src/SB/Game/zNPCTypeDuplotron.h +++ b/src/SB/Game/zNPCTypeDuplotron.h @@ -1,7 +1,7 @@ #ifndef ZNPCTYPEDUPLOTRON_H #define ZNPCTYPEDUPLOTRON_H -#include "zNPCTypeCommon.h" +#include "zNPCSpawner.h" struct zNPCDuplotron : zNPCCommon { From 1e4b5644bc59c0505631374003132759fd2ddec0 Mon Sep 17 00:00:00 2001 From: daft7 Date: Sun, 16 Feb 2025 14:16:17 -0600 Subject: [PATCH 08/11] Quick patches to data types after using more detailed definition of zNPCCommon. --- src/SB/Game/zNPCSpawner.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SB/Game/zNPCSpawner.cpp b/src/SB/Game/zNPCSpawner.cpp index 716849667..780e60940 100644 --- a/src/SB/Game/zNPCSpawner.cpp +++ b/src/SB/Game/zNPCSpawner.cpp @@ -196,10 +196,10 @@ st_XORDEREDARRAY* zNPCSpawner::ReFillPending() var_r30 = this; do { temp_r29 = var_r30->npc_owner; - if (((zNPCCommon*)var_r30->npc_owner != NULL) && ((s32) temp_r29->pad0[4] == 1)) + if (((zNPCCommon*)var_r30->npc_owner != NULL) && ((s32) temp_r29->flg_vuln == 1)) { XOrdAppend(this->pendlist, (void*) temp_r29); - temp_r29->pad0[4] = 2; + temp_r29->flg_vuln = 2; } var_r28 += 1; var_r30 += 0xC; From 7197929abf1b376101ddad963525abdb1ae62051 Mon Sep 17 00:00:00 2001 From: daft7 Date: Sun, 16 Feb 2025 15:08:56 -0600 Subject: [PATCH 09/11] Revert pendlist and actvllist to not being pointers. --- src/SB/Game/zNPCSpawner.cpp | 12 ++++++------ src/SB/Game/zNPCSpawner.h | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/SB/Game/zNPCSpawner.cpp b/src/SB/Game/zNPCSpawner.cpp index 780e60940..d314d54f2 100644 --- a/src/SB/Game/zNPCSpawner.cpp +++ b/src/SB/Game/zNPCSpawner.cpp @@ -70,8 +70,8 @@ void zNPCSpawner::Subscribe(zNPCCommon* owner) this->tym_delay = _805_Spawner; this->max_spawn = -1; this->wavestat = SM_STAT_BEGIN; - XOrdInit(this->pendlist, 0x10, 0); - XOrdInit(this->actvlist, 0x10, 0); + XOrdInit(&this->pendlist, 0x10, 0); + XOrdInit(&this->actvlist, 0x10, 0); } void zNPCSpawner::SetWaveMode(en_SM_WAVE_MODE mode, F32 delay, S32 lifemax) @@ -164,7 +164,7 @@ void zNPCSpawner::SetNPCStatus(zNPCCommon* npc, en_SM_NPC_STATUS status) SMNPCStatus* zNPCSpawner::ToastedBeastie(zNPCCommon* npc) { SMNPCStatus* ret = this->StatForNPC(npc); - XOrdRemove(this->actvlist, ret, -1); + XOrdRemove(&this->actvlist, ret, -1); zEntEvent((xBase*)this->npc_owner, eEventDuploNPCKilled); return ret; } @@ -183,7 +183,7 @@ st_XORDEREDARRAY* zNPCSpawner::FillPending() { ClearPending(); ReFillPending(); - return this->actvlist; + return &this->actvlist; } st_XORDEREDARRAY* zNPCSpawner::ReFillPending() @@ -198,13 +198,13 @@ st_XORDEREDARRAY* zNPCSpawner::ReFillPending() temp_r29 = var_r30->npc_owner; if (((zNPCCommon*)var_r30->npc_owner != NULL) && ((s32) temp_r29->flg_vuln == 1)) { - XOrdAppend(this->pendlist, (void*) temp_r29); + XOrdAppend(&this->pendlist, (void*) temp_r29); temp_r29->flg_vuln = 2; } var_r28 += 1; var_r30 += 0xC; } while (var_r28 < 0x10); - return this->actvlist; + return &this->actvlist; } diff --git a/src/SB/Game/zNPCSpawner.h b/src/SB/Game/zNPCSpawner.h index c309d09ed..d3d7b8f58 100644 --- a/src/SB/Game/zNPCSpawner.h +++ b/src/SB/Game/zNPCSpawner.h @@ -70,8 +70,8 @@ struct zNPCSpawner : RyzMemData S32 cnt_spawn; SMSPStatus sppool[16]; SMNPCStatus npcpool[16]; - st_XORDEREDARRAY* pendlist; - st_XORDEREDARRAY* actvlist; //0x1A4 + st_XORDEREDARRAY pendlist; + st_XORDEREDARRAY actvlist; //0x1A4 S32 cnt_cleanup; void Subscribe(zNPCCommon* owner); From 3c2b0c56d546fe1e8a153e9f02aceb8a5137c908 Mon Sep 17 00:00:00 2001 From: daft7 Date: Sun, 16 Feb 2025 15:09:41 -0600 Subject: [PATCH 10/11] Implemented suggested fixes to NextPendingNPC. --- src/SB/Game/zNPCSpawner.cpp | 9 +++++---- src/SB/Game/zNPCSpawner.h | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/SB/Game/zNPCSpawner.cpp b/src/SB/Game/zNPCSpawner.cpp index d314d54f2..146bcffdb 100644 --- a/src/SB/Game/zNPCSpawner.cpp +++ b/src/SB/Game/zNPCSpawner.cpp @@ -229,16 +229,17 @@ st_XORDEREDARRAY* zNPCSpawner::ReFillPending() // XOrdReset__FP16st_XORDEREDARRAY(&this->unk1B0); // } -SMNPCStatus* zNPCSpawner::NextPendingNPC( s32 arg0 ) +SMNPCStatus* zNPCSpawner::NextPendingNPC(S32 arg0) { S32 temp_r4; const F32* temp_ptr = NULL; - temp_r4 = (S32) this->actvlist; - if (temp_r4 < 1) { + temp_r4 = this->pendlist.cnt; + if (temp_r4 < 1) + { return NULL; } - return xUtil_select((SMNPCStatus **) this->pendlist, temp_r4, temp_ptr); + return xUtil_select((SMNPCStatus**)this->pendlist.list, temp_r4, temp_ptr); } /* zNPCSpawner::StatForNPC (zNPCCommon *) */ diff --git a/src/SB/Game/zNPCSpawner.h b/src/SB/Game/zNPCSpawner.h index d3d7b8f58..615fa42fa 100644 --- a/src/SB/Game/zNPCSpawner.h +++ b/src/SB/Game/zNPCSpawner.h @@ -90,7 +90,7 @@ struct zNPCSpawner : RyzMemData // NextPendingNPC. void ClearActive(); void ClearPending(); - SMNPCStatus* NextPendingNPC( s32 arg0 ); + SMNPCStatus* NextPendingNPC( S32 arg0 ); st_XORDEREDARRAY* FillPending(); st_XORDEREDARRAY* ReFillPending(); From 8b9b2703fb8ac806caac34ca1685e41d6fc791d4 Mon Sep 17 00:00:00 2001 From: daft7 Date: Sun, 16 Feb 2025 15:10:51 -0600 Subject: [PATCH 11/11] Used Clang to format. --- src/SB/Game/zNPCSpawner.cpp | 38 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/SB/Game/zNPCSpawner.cpp b/src/SB/Game/zNPCSpawner.cpp index 146bcffdb..b8c54502a 100644 --- a/src/SB/Game/zNPCSpawner.cpp +++ b/src/SB/Game/zNPCSpawner.cpp @@ -178,27 +178,27 @@ U8 zMovePoint::IsOn() return this->on; } - st_XORDEREDARRAY* zNPCSpawner::FillPending() { ClearPending(); ReFillPending(); - return &this->actvlist; + return &this->actvlist; } st_XORDEREDARRAY* zNPCSpawner::ReFillPending() { s32 var_r28; - zNPCCommon *temp_r29; - zNPCSpawner *var_r30; + zNPCCommon* temp_r29; + zNPCSpawner* var_r30; var_r28 = 0; var_r30 = this; - do { + do + { temp_r29 = var_r30->npc_owner; - if (((zNPCCommon*)var_r30->npc_owner != NULL) && ((s32) temp_r29->flg_vuln == 1)) + if (((zNPCCommon*)var_r30->npc_owner != NULL) && ((s32)temp_r29->flg_vuln == 1)) { - XOrdAppend(&this->pendlist, (void*) temp_r29); + XOrdAppend(&this->pendlist, (void*)temp_r29); temp_r29->flg_vuln = 2; } var_r28 += 1; @@ -207,7 +207,6 @@ st_XORDEREDARRAY* zNPCSpawner::ReFillPending() return &this->actvlist; } - // void zNPCSpawner::ClearActive() // { // s32 var_r6; @@ -243,17 +242,18 @@ SMNPCStatus* zNPCSpawner::NextPendingNPC(S32 arg0) } /* zNPCSpawner::StatForNPC (zNPCCommon *) */ -SMNPCStatus* zNPCSpawner::StatForNPC(zNPCCommon *npc) { +SMNPCStatus* zNPCSpawner::StatForNPC(zNPCCommon* npc) +{ s32 var_ctr; - SMNPCStatus *var_r6; - zNPCCommon *temp_r0; - zNPCCommon *temp_r0_2; - zNPCCommon *temp_r0_3; - zNPCCommon *temp_r0_4; - zNPCCommon *temp_r0_5; - zNPCCommon *temp_r0_6; - zNPCCommon *temp_r0_7; - zNPCCommon *temp_r0_8; + SMNPCStatus* var_r6; + zNPCCommon* temp_r0; + zNPCCommon* temp_r0_2; + zNPCCommon* temp_r0_3; + zNPCCommon* temp_r0_4; + zNPCCommon* temp_r0_5; + zNPCCommon* temp_r0_6; + zNPCCommon* temp_r0_7; + zNPCCommon* temp_r0_8; var_r6 = NULL; var_ctr = 2; @@ -266,6 +266,6 @@ SMNPCStatus* zNPCSpawner::StatForNPC(zNPCCommon *npc) { var_r6 = &this->npcpool[var_ctr]; } } - + return var_r6; }