diff --git a/src/SB/Core/x/xGrid.h b/src/SB/Core/x/xGrid.h index bbfa803fa..f3d9b257d 100644 --- a/src/SB/Core/x/xGrid.h +++ b/src/SB/Core/x/xGrid.h @@ -62,6 +62,7 @@ typedef S32 (*GridEntCallback)(xEnt*, void*); extern volatile S32 gGridIterActive; void xGridBoundInit(xGridBound* gridb, void* data); +void xGridKill(xGrid* grid); void xGridEmpty(xGrid* grid); S32 xGridRemove(xGridBound* gridb); xGridBound** xGridGetCell(xGrid* grid, const xEnt* ent, S32& grx, S32& grz); diff --git a/src/SB/Game/zGrid.cpp b/src/SB/Game/zGrid.cpp index 8e6fcb761..1230141f6 100644 --- a/src/SB/Game/zGrid.cpp +++ b/src/SB/Game/zGrid.cpp @@ -1,3 +1,20 @@ #include "zGrid.h" +#include "xGrid.h" +#include "xString.h" #include + +xGrid colls_grid; +xGrid colls_oso_grid; +xGrid npcs_grid; +static int zGridInitted; + +void zGridExit(zScene* s) +{ + xGridKill(&colls_grid); + xGridKill(&colls_oso_grid); + xGridKill(&npcs_grid); + + gGridIterActive = NULL; + zGridInitted = NULL; +} \ No newline at end of file diff --git a/src/SB/Game/zNPCGoalVillager.h b/src/SB/Game/zNPCGoalVillager.h index bbb0da4c8..e37fb6573 100644 --- a/src/SB/Game/zNPCGoalVillager.h +++ b/src/SB/Game/zNPCGoalVillager.h @@ -167,6 +167,13 @@ struct zNPCGoalBoySwim : zNPCGoalCommon } }; +struct NPCSndProp +{ + en_NPC_SOUND sndtype; + int flg_snd; + float tym_delayNext; +}; + xFactoryInst* GOALCreate_Villager(S32 who, RyzMemGrow* grow, void*); #endif diff --git a/src/SB/Game/zNPCSndTable.cpp b/src/SB/Game/zNPCSndTable.cpp index 8df3d6960..846fd8b49 100644 --- a/src/SB/Game/zNPCSndTable.cpp +++ b/src/SB/Game/zNPCSndTable.cpp @@ -1,7 +1,62 @@ #include "zNPCSndTable.h" +#include "zNPCGoalVillager.h" + +#include "xString.h" #include +static char* g_strz_sndgroup[26]; +static unsigned int g_hash_sndgroup[26]; +static float g_tmrz_sndplay[26]; + +NPCSndProp g_sndProps[]; + +void NPCS_Startup() +{ + for (int i = 0; i < (int)(sizeof(g_strz_sndgroup) / sizeof(char*)); i++) + { + g_hash_sndgroup[i] = xStrHash(g_strz_sndgroup[i]); + } +} + void NPCS_Shutdown() { } + +int NPCS_SndOkToPlay(en_NPC_SOUND sndtype) +{ + if (sndtype == NPC_STYP_BOGUS) + { + return 1; + } + if (sndtype == NPC_STYP_LISTEND) + { + return 0; + } + return g_tmrz_sndplay[sndtype] < 0.0f; +} + +void NPCS_SndTypePlayed(en_NPC_SOUND sndtype, float delayNext) +{ + float tym = 2.0f; + + switch (sndtype) + { + case NPC_STYP_TIKISTACK: + tym = 0.15f; + break; + case NPC_STYP_TIKIEXPLODE: + tym = 2.0f; + break; + default: + tym = -1.0f; + break; + } + + if (delayNext > 0.0f) + { + tym = delayNext; + } + + g_tmrz_sndplay[sndtype] = tym; +}