diff --git a/src/SB/Game/zNPCMessenger.h b/src/SB/Game/zNPCMessenger.h index 0252a9c89..9f73d480e 100644 --- a/src/SB/Game/zNPCMessenger.h +++ b/src/SB/Game/zNPCMessenger.h @@ -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 diff --git a/src/SB/Game/zNPCMgr.cpp b/src/SB/Game/zNPCMgr.cpp index c9c260faa..dc3333ee6 100644 --- a/src/SB/Game/zNPCMgr.cpp +++ b/src/SB/Game/zNPCMgr.cpp @@ -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" @@ -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++) { @@ -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; +} diff --git a/src/SB/Game/zNPCMgr.h b/src/SB/Game/zNPCMgr.h index 044fcb3bc..91ae85fad 100644 --- a/src/SB/Game/zNPCMgr.h +++ b/src/SB/Game/zNPCMgr.h @@ -3,6 +3,7 @@ #include "xFactory.h" #include "xBehaveMgr.h" +#include "zNPCTypes.h" #include @@ -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(); diff --git a/src/SB/Game/zNPCTypeCommon.h b/src/SB/Game/zNPCTypeCommon.h index 3e7a5d806..c58f1d8c0 100644 --- a/src/SB/Game/zNPCTypeCommon.h +++ b/src/SB/Game/zNPCTypeCommon.h @@ -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(); diff --git a/src/SB/Game/zNPCTypeRobot.h b/src/SB/Game/zNPCTypeRobot.h index af03cb791..d0d8f9770 100644 --- a/src/SB/Game/zNPCTypeRobot.h +++ b/src/SB/Game/zNPCTypeRobot.h @@ -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(); diff --git a/src/SB/Game/zNPCTypeTiki.h b/src/SB/Game/zNPCTypeTiki.h index 79e76f518..36cd4ba3a 100644 --- a/src/SB/Game/zNPCTypeTiki.h +++ b/src/SB/Game/zNPCTypeTiki.h @@ -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(); diff --git a/src/SB/Game/zNPCTypeVillager.h b/src/SB/Game/zNPCTypeVillager.h index 1f9ad3232..b29b15146 100644 --- a/src/SB/Game/zNPCTypeVillager.h +++ b/src/SB/Game/zNPCTypeVillager.h @@ -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; diff --git a/src/SB/Game/zNPCTypes.h b/src/SB/Game/zNPCTypes.h index 40110c4f1..c9baca042 100644 --- a/src/SB/Game/zNPCTypes.h +++ b/src/SB/Game/zNPCTypes.h @@ -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; @@ -88,4 +88,4 @@ void zNPCTypes_StartupTypes(); void zNPCTypes_ShutdownTypes(); void zNPCTypes_RegisterTypes(xFactory* fac); -#endif \ No newline at end of file +#endif