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
25 changes: 14 additions & 11 deletions src/SB/Game/zNPCMessenger.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,26 @@ void zNPCMsg_Startup();
void zNPCMsg_Shutdown();
void zNPCMsg_AreaNotify(zNPCCommon* sender, en_NPC_MSG_ID msgid, F32 rad, S32 filter,
en_NPCTYPES toNPCType);
void zNPCMsg_Timestep(xScene* xscn, F32 dt);

struct NPCPSClt {
struct NPCPSClt
{
// total size: 0x10
void (* notify)(void *, class NPCMsg *); // offset 0x0, size 0x4
void * notedata; // offset 0x4, size 0x4
void (*notify)(void*, NPCMsg*); // offset 0x0, size 0x4
void* notedata; // offset 0x4, size 0x4
signed int flg_filter; // offset 0x8, size 0x4
class NPCPSClt * next; // offset 0xC, size 0x4
NPCPSClt* next; // offset 0xC, size 0x4
};

struct NPCPSData {
struct NPCPSData
{
// total size: 0x30
NPCPSClt * cltblob; // offset 0x0, size 0x4
NPCPSClt * cltfree; // offset 0x4, size 0x4
st_XORDEREDARRAY cltlist; // offset 0x8, size 0x10
NPCMsg * msgblob; // offset 0x18, size 0x4
NPCMsg * msgfree; // offset 0x1C, size 0x4
st_XORDEREDARRAY quelist; // offset 0x20, size 0x10
NPCPSClt* cltblob; // offset 0x0, size 0x4
NPCPSClt* cltfree; // offset 0x4, size 0x4
st_XORDEREDARRAY cltlist; // offset 0x8, size 0x10
NPCMsg* msgblob; // offset 0x18, size 0x4
NPCMsg* msgfree; // offset 0x1C, size 0x4
st_XORDEREDARRAY quelist; // offset 0x20, size 0x10
};

#endif
94 changes: 93 additions & 1 deletion src/SB/Game/zNPCMgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "zNPCSpawner.h"
#include "zNPCMessenger.h"
#include "zNPCGoals.h"
#include "zNPCTypeTiki.h"
#include "zGlobals.h"
#include "xFactory.h"
#include "zRenderState.h"
Expand Down Expand Up @@ -303,7 +304,7 @@ void zNPCCommon::RenderExtraPostParticles()
void zNPCMgr::ScenePostRender()
{
xLightKit_Enable(globals.player.ent.lightKit, globals.currWorld);
enum _SDRenderState old_rendstat = zRenderStateCurrent();
_SDRenderState old_rendstat = zRenderStateCurrent();
zRenderState(SDRS_NPCVisual);
for (int i = 0; i < npclist.cnt; i++)
{
Expand All @@ -330,3 +331,94 @@ void zNPCMgr::ScenePostRender()
xLightKit_Enable(0, globals.currWorld);
zRenderState(old_rendstat);
}

void zNPCMgr::ScenePostParticleRender()
{
xLightKit_Enable(globals.player.ent.lightKit, globals.currWorld);
_SDRenderState old_rendstat = zRenderStateCurrent();
zRenderState(SDRS_NPCVisual);
for (int i = 0; i < npclist.cnt; i++)
{
zNPCCommon* npc = (zNPCCommon*)npclist.list[i];
if (npc->flg_xtrarend & 0x2)
{
npc->flg_xtrarend &= ~0x2;
}
else
{
continue;
}

if (npc->baseFlags & 0x40)
{
continue;
}

if (npc->model == NULL || !(npc->model->Flags & 0x400))
{
npc->RenderExtraPostParticles();
}
}
xLightKit_Enable(0, globals.currWorld);
zRenderState(old_rendstat);
}

void zNPCMgr::SceneTimestep(xScene* xscn, F32 dt)
{
DBG_PerfTrack();
if (g_firstFrameUpdateAllNPC != 0)
{
BackdoorUpdateAllNPCsOnce(xscn, dt);
g_firstFrameUpdateAllNPC = 0;
}
zNPCMsg_Timestep(xscn, dt);
zNPCTiki_Timestep(xscn, dt);
zNPCCommon_Timestep(xscn, dt);
zNPCRobot_Timestep(xscn, dt);
zNPCVillager_SceneTimestep(xscn, dt);
}

void zNPCMgr::BackdoorUpdateAllNPCsOnce(xScene* xscn, F32 dt)
{
for (int i = 0; i < npclist.cnt; i++)
{
zNPCCommon* npc = (zNPCCommon*)npclist.list[i];
xSceneID2Name(globals.sceneCur, npc->id);

if (npc->baseFlags & 0x40 && npc->update != NULL)
{
npc->update(npc, xscn, 1.0f / 60);
}
}
}

en_NPCTYPES zNPCMgr::NPCTypeForModel(U32 brainID, U32 mdl_hash)
{
if (brainID != NULL)
{
for (int i = 0; i < sizeof(g_brainTable) / sizeof(g_brainTable[0]); i++)
{
if (brainID == g_brainTable[i].id)
{
return g_brainTable[i].type;
}
}
}

en_NPCTYPES usetype = NPC_TYPE_UNKNOWN;
for (NPCMTypeTable* rec = g_tbltype; rec->useNPCType != NPC_TYPE_UNKNOWN; rec++)
{
if (rec->hashOfName == mdl_hash)
{
usetype = rec->useNPCType;
break;
}
}

if (usetype == NPC_TYPE_UNKNOWN)
{
usetype = NPC_TYPE_COMMON;
}

return usetype;
}
3 changes: 2 additions & 1 deletion src/SB/Game/zNPCMgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include "xFactory.h"
#include "xBehaveMgr.h"
#include "zNPCTypes.h"

#include <types.h>

Expand All @@ -14,7 +15,7 @@ struct zNPCMgr : RyzMemData
xBase selfbase;

zNPCMgr();
S32 NPCTypeForModel(U32, U32);
enum en_NPCTYPES NPCTypeForModel(U32 brainID, U32 mdl_hash);
void BackdoorUpdateAllNPCsOnce(xScene*, F32);
void PrepTypeTable();
void 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 @@ -640,6 +640,7 @@ void zNPCCommon_WonderReset();
void ZNPC_Common_Shutdown();
void NPCC_BuildStandardAnimTran(xAnimTable* table, char** namelist, S32* ourAnims, S32 idx_dflt,
F32 blend);
void zNPCCommon_Timestep(xScene* xscn, F32 dt);

xAnimTable* ZNPC_AnimTable_Common();
xAnimTable* ZNPC_AnimTable_LassoGuide();
Expand Down
1 change: 1 addition & 0 deletions src/SB/Game/zNPCTypeRobot.h
Original file line number Diff line number Diff line change
Expand Up @@ -542,6 +542,7 @@ void ZNPC_Destroy_Robot(xFactoryInst* inst);
void ROBO_KillEffects();
void zNPCFodBzzt_ResetDanceParty();
void ROBO_InitEffects();
void zNPCRobot_Timestep(xScene* xscn, F32 dt);
xAnimTable* ZNPC_AnimTable_ArfArf();
xAnimTable* ZNPC_AnimTable_ArfDog();
xAnimTable* ZNPC_AnimTable_Chuck();
Expand Down
1 change: 1 addition & 0 deletions src/SB/Game/zNPCTypeTiki.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ void zNPCTiki_InitFX(zScene*);
void zNPCTiki_ExplodeFX(zNPCTiki* tiki);
xFactoryInst* ZNPC_Create_Tiki(S32 who, RyzMemGrow* grow, void*);
void ZNPC_Destroy_Tiki(xFactoryInst* inst);
void zNPCTiki_Timestep(xScene* xscn, F32 dt);

xAnimTable* ZNPC_AnimTable_Tiki();

Expand Down
1 change: 1 addition & 0 deletions src/SB/Game/zNPCTypeVillager.h
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,7 @@ NPCSndTrax g_sndTrax_Villager;
S32 zParamGetFloatList(xModelAssetParam* parmdata, U32 pdatsize, const char* str32, S32 found,
F32* non_choices, F32 len_mvptspline);
void zNPCVillager_SceneFinish();
void zNPCVillager_SceneTimestep(xScene* xscn, F32 dt);

extern NPCSndTrax g_sndTrax_VillagerMale;
extern NPCSndTrax g_sndTrax_VillagerFemale;
Expand Down
136 changes: 68 additions & 68 deletions src/SB/Game/zNPCTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,83 +3,83 @@

enum en_NPCTYPES
{
NPC_TYPE_UNKNOWN,
NPC_TYPE_UNKNOWN = 0,
NPC_TYPE_BASIC = 'NT00',
NPC_TYPE_COMMON,
NPC_TYPE_COMMON = 'NT01',
NPC_TYPE_AMBIENT = 'NTS0',
NPC_TYPE_VILLAGER,
NPC_TYPE_ROBOT,
NPC_TYPE_BOSS,
NPC_TYPE_TEST,
NPC_TYPE_BADGUY,
NPC_TYPE_VILLAGER = 'NTS1',
NPC_TYPE_ROBOT = 'NTS2',
NPC_TYPE_BOSS = 'NTS3',
NPC_TYPE_TEST = 'NTS4',
NPC_TYPE_BADGUY = 'NTS5',
NPC_TYPE_JELLYPINK = 'NTA0',
NPC_TYPE_JELLYBLUE,
NPC_TYPE_KINGNEPTUNE,
NPC_TYPE_MIMEFISH,
NPC_TYPE_COW,
NPC_TYPE_JELLYBLUE = 'NTA1',
NPC_TYPE_KINGNEPTUNE = 'NTA2',
NPC_TYPE_MIMEFISH = 'NTA3',
NPC_TYPE_COW = 'NTA4',
NPC_TYPE_TIKI_WOOD = 'NTT0',
NPC_TYPE_TIKI_LOVEY,
NPC_TYPE_TIKI_QUIET,
NPC_TYPE_TIKI_THUNDER,
NPC_TYPE_TIKI_STONE,
NPC_TYPE_TIKI_LOVEY = 'NTT1',
NPC_TYPE_TIKI_QUIET = 'NTT2',
NPC_TYPE_TIKI_THUNDER = 'NTT3',
NPC_TYPE_TIKI_STONE = 'NTT4',
NPC_TYPE_FISH = 'NTF0',
NPC_TYPE_FISH_MALE,
NPC_TYPE_FISH_FEMALE,
NPC_TYPE_FISH_ELDER,
NPC_TYPE_FISH_ELDESS,
NPC_TYPE_FISH_BOY,
NPC_TYPE_FISH_GIRL,
NPC_TYPE_BALLOONBOY,
NPC_TYPE_GARY,
NPC_TYPE_SQUIDWARD,
NPC_TYPE_SQUIDWARD_MUSIC,
NPC_TYPE_SQUIDWARD_BANDAID,
NPC_TYPE_DUTCHMAN_NSB,
NPC_TYPE_SANDYBIKINI,
NPC_TYPE_SANDYNPC,
NPC_TYPE_PATNPC,
NPC_TYPE_BOBNPC,
NPC_TYPE_PLANKNPC,
NPC_TYPE_MRKRABS,
NPC_TYPE_MSPUFFS,
NPC_TYPE_LARRY,
NPC_TYPE_BUBBUDDY,
NPC_TYPE_NEWSFISH,
NPC_TYPE_NEWSFISHTV,
NPC_TYPE_MOTORIST,
NPC_TYPE_MERMANCHAIR,
NPC_TYPE_MERMAN,
NPC_TYPE_BARNACLEBOY,
NPC_TYPE_WORM,
NPC_TYPE_FISH_MALE = 'NTF1',
NPC_TYPE_FISH_FEMALE = 'NTF2',
NPC_TYPE_FISH_ELDER = 'NTF3',
NPC_TYPE_FISH_ELDESS = 'NTF4',
NPC_TYPE_FISH_BOY = 'NTF5',
NPC_TYPE_FISH_GIRL = 'NTF6',
NPC_TYPE_BALLOONBOY = 'NTF7',
NPC_TYPE_GARY = 'NTF8',
NPC_TYPE_SQUIDWARD = 'NTF9',
NPC_TYPE_SQUIDWARD_MUSIC = 'NTF:',
NPC_TYPE_SQUIDWARD_BANDAID = 'NTF;',
NPC_TYPE_DUTCHMAN_NSB = 'NTF<',
NPC_TYPE_SANDYBIKINI = 'NTF=',
NPC_TYPE_SANDYNPC = 'NTF>',
NPC_TYPE_PATNPC = 'NTF?',
NPC_TYPE_BOBNPC = 'NTF@',
NPC_TYPE_PLANKNPC = 'NTFA',
NPC_TYPE_MRKRABS = 'NTFB',
NPC_TYPE_MSPUFFS = 'NTFC',
NPC_TYPE_LARRY = 'NTFD',
NPC_TYPE_BUBBUDDY = 'NTFE',
NPC_TYPE_NEWSFISH = 'NTFF',
NPC_TYPE_NEWSFISHTV = 'NTFG',
NPC_TYPE_MOTORIST = 'NTFH',
NPC_TYPE_MERMANCHAIR = 'NTFI',
NPC_TYPE_MERMAN = 'NTFJ',
NPC_TYPE_BARNACLEBOY = 'NTFK',
NPC_TYPE_WORM = 'NTFL',
NPC_TYPE_HAMMER = 'NTR0',
NPC_TYPE_HAMSPIN,
NPC_TYPE_TARTAR,
NPC_TYPE_GLOVE,
NPC_TYPE_MONSOON,
NPC_TYPE_SLEEPY,
NPC_TYPE_ARFDOG,
NPC_TYPE_ARFARF,
NPC_TYPE_CHUCK,
NPC_TYPE_TUBELET,
NPC_TYPE_TUBESLAVE,
NPC_TYPE_SLICK,
NPC_TYPE_FODDER,
NPC_TYPE_FODBOMB,
NPC_TYPE_FODBZZT,
NPC_TYPE_CHOMPER,
NPC_TYPE_CRITTER,
NPC_TYPE_HAMSPIN = 'NTR1',
NPC_TYPE_TARTAR = 'NTR2',
NPC_TYPE_GLOVE = 'NTR3',
NPC_TYPE_MONSOON = 'NTR4',
NPC_TYPE_SLEEPY = 'NTR5',
NPC_TYPE_ARFDOG = 'NTR6',
NPC_TYPE_ARFARF = 'NTR7',
NPC_TYPE_CHUCK = 'NTR8',
NPC_TYPE_TUBELET = 'NTR9',
NPC_TYPE_TUBESLAVE = 'NTR:',
NPC_TYPE_SLICK = 'NTR;',
NPC_TYPE_FODDER = 'NTR<',
NPC_TYPE_FODBOMB = 'NTR=',
NPC_TYPE_FODBZZT = 'NTR>',
NPC_TYPE_CHOMPER = 'NTR?',
NPC_TYPE_CRITTER = 'NTR@',
NPC_TYPE_DUPLOTRON = 'NTD0',
NPC_TYPE_KINGJELLY = 'NTH0',
NPC_TYPE_DUTCHMAN,
NPC_TYPE_PRAWN,
NPC_TYPE_DUTCHMAN = 'NTH1',
NPC_TYPE_PRAWN = 'NTH2',
NPC_TYPE_BOSSSANDY = 'NTB0',
NPC_TYPE_BOSSPAT,
NPC_TYPE_BOSS_SB1,
NPC_TYPE_BOSSBOBBY,
NPC_TYPE_BOSSPLANKTON,
NPC_TYPE_BOSSPAT = 'NTB1',
NPC_TYPE_BOSS_SB1 = 'NTB2',
NPC_TYPE_BOSSBOBBY = 'NTB3',
NPC_TYPE_BOSSPLANKTON = 'NTB4',
NPC_TYPE_BADGUYMEDIUM = 'NBG0',
NPC_TYPE_NOMORE,
NPC_TYPE_FORCE = 0x7fffffff
NPC_TYPE_NOMORE = 'NBG1',
NPC_TYPE_FORCE = 0x7fffffff,
};

struct xFactory;
Expand All @@ -88,4 +88,4 @@ void zNPCTypes_StartupTypes();
void zNPCTypes_ShutdownTypes();
void zNPCTypes_RegisterTypes(xFactory* fac);

#endif
#endif