Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{
"[c]": {
"files.encoding": "utf8",
"editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd"
"editor.defaultFormatter": "xaver.clang-format"
},
"[cpp]": {
"files.encoding": "utf8",
"editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd"
"editor.defaultFormatter": "xaver.clang-format"
},
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter"
Expand All @@ -19,5 +19,5 @@
".clangd": "yaml"
},
// Disable C/C++ IntelliSense, use clangd instead
"C_Cpp.intelliSenseEngine": "disabled",
"C_Cpp.intelliSenseEngine": "default",
}
283 changes: 276 additions & 7 deletions src/SB/Game/zNPCSpawner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,18 +130,287 @@ void zNPCSpawner::Reset()

void zNPCSpawner::MapPreferred()
{
for (S32 i = 0; i < 0x10; i++)
for (S32 i = 0; i < 16; i++)
{
SMNPCStatus* npc_stat = &this->npcpool[i];
if (npc_stat->npc != NULL)
{
// FIXME
// zMovePoint* sp = (zMovePoint*)npc_stat->npc->FirstAssigned();
// if (sp != NULL&& /*TODO*/)
// {
// npc_stat->sp_prefer = sp;
// }
zMovePoint* sp = (zMovePoint*)npc_stat->npc->FirstAssigned();
if (sp != NULL)
{
SMSPStatus* sp_stat = StatForSP(sp, 0);
if (sp_stat != NULL)
{
npc_stat->sp_prefer = sp;
sp_stat->npc_prefer = npc_stat->npc;
}
}
}
}
}

void zNPCSpawner::Timestep(F32 dt)
{
if (flg_spawner & 0x8)
{
ChildHeartbeat(dt);
}

if (flg_spawner & 0x10)
{
ChildCleanup(dt);
}

if (!(flg_spawner & 0x4))
{
tmr_wave = -1.0f > tmr_wave - dt ? -1.0f : tmr_wave - dt;

switch (wavemode)
{
case SM_WAVE_DISCREET:
UpdateDiscreet(dt);
break;
case SM_WAVE_CONTINUOUS:
UpdateContinuous(dt);
break;
}
}
}

void zNPCSpawner::UpdateDiscreet(F32 dt)
{
SMSPStatus* spstat = NULL;

switch (wavestat)
{
case SM_STAT_BEGIN:
FillPending();

if (pendlist.cnt > 0)
{
wavestat = SM_STAT_INPROG;
zEntEvent(npc_owner, eEventDuploWaveBegin);

flg_spawner &= ~0x20;
}

tmr_wave = tym_delay;

break;
case SM_STAT_INPROG:
if (pendlist.cnt < 1)
{
wavestat = SM_STAT_MARKTIME;
}
else if (max_spawn > 0 && !(cnt_spawn < max_spawn))
{
wavestat = SM_STAT_ABORT;
}
else if (tmr_wave < 0.0f)
{
SMNPCStatus* npcstat = NextPendingNPC(0);
if (npcstat != NULL)
{
spstat = SelectSP(npcstat);
}

if (!(spstat == NULL))
{
SpawnBeastie(npcstat, spstat);
}

tmr_wave = tym_delay * (0.25f * (xurand() - 0.5f)) + tym_delay;
}

break;
case SM_STAT_MARKTIME:
if (actvlist.cnt < 1)
{
wavestat = SM_STAT_DONE;
}
else if (max_spawn > 0 && !(cnt_spawn < max_spawn))
{
wavestat = SM_STAT_ABORT;
}

break;
case SM_STAT_ABORT:
if (actvlist.cnt < 1)
{
wavestat = SM_STAT_DONE;
}

ClearPending();

break;
case SM_STAT_DONE:
if (!(flg_spawner & 0x20))
{
zEntEvent(npc_owner, eEventDuploWaveComplete);
}

if (max_spawn > 0 && !(cnt_spawn < max_spawn))
{
if (!(flg_spawner & 0x20))
{
flg_spawner |= 0x20;

zEntEvent(npc_owner, eEventDuploExpiredMaxNPC);
zEntEvent(npc_owner, eEventDuploSuperDuperDone);

if (flg_spawner & 0x2)
{
zEntEvent(npc_owner, eEventDuploDuperIsDoner);
}
}
}
else
{
if (flg_spawner & 0x2)
{
if (!(flg_spawner & 0x20))
{
flg_spawner |= 0x20;

zEntEvent(npc_owner, eEventDuploSuperDuperDone);
zEntEvent(npc_owner, eEventDuploDuperIsDoner);
}
}
else
{
wavestat = SM_STAT_BEGIN;
}
}

break;
default:
break;
}
}

void zNPCSpawner::UpdateContinuous(F32 dt)
{
SMSPStatus* spstat = NULL;

switch (wavestat)
{
case SM_STAT_BEGIN:
FillPending();

if (pendlist.cnt > 0)
{
wavestat = SM_STAT_INPROG;
zEntEvent(npc_owner, eEventDuploWaveBegin);

flg_spawner &= ~0x20;
}

tmr_wave = tym_delay;

break;
case SM_STAT_INPROG:
if (pendlist.cnt < 1)
{
wavestat = SM_STAT_MARKTIME;
}
else if (max_spawn > 0 && !(cnt_spawn < max_spawn))
{
wavestat = SM_STAT_ABORT;
}
else if (tmr_wave < 0.0f)
{
SMNPCStatus* npcstat = NextPendingNPC(0);
if (npcstat != NULL)
{
spstat = SelectSP(npcstat);
}

if (!(spstat == NULL))
{
SpawnBeastie(npcstat, spstat);
}

tmr_wave = tym_delay * (0.25f * (xurand() - 0.5f)) + tym_delay;
}

break;
// MarkTime case is the significantly different one between this function and UpdateDiscreet
case SM_STAT_MARKTIME:
if (flg_spawner & 0x2)
{
wavestat = SM_STAT_ABORT;
}
else if (max_spawn > 0 && !(cnt_spawn < max_spawn))
{
wavestat = SM_STAT_ABORT;
}
else
{
if (tmr_wave < 0.0f)
{
tmr_wave = tym_delay * (0.25f * (xurand() - 0.5f)) + tym_delay;

ReFillPending();

if (pendlist.cnt > 0)
{
wavestat = SM_STAT_INPROG;
}
}
else if (pendlist.cnt > 0)
{
wavestat = SM_STAT_INPROG;
}
}

break;
case SM_STAT_ABORT:
if (actvlist.cnt < 1)
{
wavestat = SM_STAT_DONE;
}

ClearPending();

break;
case SM_STAT_DONE:
if (!(flg_spawner & 0x20))
{
zEntEvent(npc_owner, eEventDuploWaveComplete);
}

if (max_spawn > 0 && !(cnt_spawn < max_spawn))
{
if (!(flg_spawner & 0x20))
{
flg_spawner |= 0x20;

zEntEvent(npc_owner, eEventDuploExpiredMaxNPC);
zEntEvent(npc_owner, eEventDuploSuperDuperDone);

if (flg_spawner & 0x2)
{
zEntEvent(npc_owner, eEventDuploDuperIsDoner);
}
}
}
else
{
if (flg_spawner & 0x2)
{
if (!(flg_spawner & 0x20))
{
flg_spawner |= 0x20;

zEntEvent(npc_owner, eEventDuploSuperDuperDone);
zEntEvent(npc_owner, eEventDuploDuperIsDoner);
}
}
}

break;
default:
break;
}
}

Expand Down
4 changes: 3 additions & 1 deletion src/SB/Game/zNPCSpawner.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,16 +90,18 @@ struct zNPCSpawner : RyzMemData
// NextPendingNPC.
void ClearActive();
void ClearPending();
SMNPCStatus* NextPendingNPC( S32 arg0 );
SMNPCStatus* NextPendingNPC(S32 arg0);
st_XORDEREDARRAY* FillPending();
st_XORDEREDARRAY* ReFillPending();

void SetNPCStatus(zNPCCommon* npc, en_SM_NPC_STATUS status);

SMNPCStatus* StatForNPC(zNPCCommon* npc);
SMSPStatus* StatForSP(zMovePoint* mp, S32 arg0);
S32 SpawnBeastie(SMNPCStatus* npcstat, SMSPStatus* spstat);
SMNPCStatus* ToastedBeastie(zNPCCommon* npc);
void ChildHeartbeat(F32 dt);
void ChildCleanup(F32 dt);
};

void zNPCSpawner_Startup();
Expand Down
1 change: 1 addition & 0 deletions src/SB/Game/zNPCTypeCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -449,6 +449,7 @@ struct zNPCCommon : xNPCBasic //Size of zNPCCommon: 0x2A0
int (*)(xGoal*, void*, en_trantype*, float, void*),
int (*)(xGoal*, void*, en_trantype*, float, void*),
int (*)(xGoal*, void*, en_trantype*, float, void*));
zMovePoint* FirstAssigned();

// defined from zNPCGoalRobo.cpp
xVec3* Center();
Expand Down