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 diff --git a/src/SB/Game/zNPCSpawner.cpp b/src/SB/Game/zNPCSpawner.cpp index d818be777..b8c54502a 100644 --- a/src/SB/Game/zNPCSpawner.cpp +++ b/src/SB/Game/zNPCSpawner.cpp @@ -177,3 +177,95 @@ 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->flg_vuln == 1)) + { + XOrdAppend(&this->pendlist, (void*)temp_r29); + temp_r29->flg_vuln = 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 = this->pendlist.cnt; + if (temp_r4 < 1) + { + return NULL; + } + return xUtil_select((SMNPCStatus**)this->pendlist.list, 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 231131d8c..615fa42fa 100644 --- a/src/SB/Game/zNPCSpawner.h +++ b/src/SB/Game/zNPCSpawner.h @@ -5,20 +5,9 @@ #include "xRMemData.h" #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 { @@ -50,8 +39,6 @@ enum en_SM_NPC_STATUS SM_NPC_FORCE = 0x7fffffff }; -struct zNPCCommon; - struct SMDepot { st_XORDEREDARRAY spawners; @@ -84,7 +71,7 @@ struct zNPCSpawner : RyzMemData SMSPStatus sppool[16]; SMNPCStatus npcpool[16]; st_XORDEREDARRAY pendlist; - st_XORDEREDARRAY actvlist; + st_XORDEREDARRAY actvlist; //0x1A4 S32 cnt_cleanup; void Subscribe(zNPCCommon* owner); @@ -103,6 +90,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); 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; 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 {