Skip to content

Commit 2ef5d64

Browse files
authored
xSFX: Significant Match Progress (#701)
* zEntPlayer: Add declaration for zEntPlayer_SNDNotifyPlaying * xSFX: Match progress, nearly ready to link
1 parent b82375e commit 2ef5d64

File tree

3 files changed

+226
-22
lines changed

3 files changed

+226
-22
lines changed

src/SB/Core/x/xSFX.cpp

Lines changed: 222 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,99 @@
22

33
#include "xSnd.h"
44
#include "xEvent.h"
5+
#include "xpkrsvc.h"
6+
#include "xstransvc.h"
7+
#include "zScene.h"
8+
#include "zEntPlayer.h"
59

610
#include <string.h>
711
#include <types.h>
812

9-
extern xSFX* s_managedEnvSFX[1];
13+
static xSFX* s_managedEnvSFX[1] = { NULL };
14+
15+
static void xSFXUpdate(xSFX* t);
16+
static void xSFXPlay(xSFX* t);
17+
static void xSFXStop(xSFX* t);
1018

1119
void xSFXEnvironmentalStreamSceneExit(void)
1220
{
1321
memset(&s_managedEnvSFX, 0, 4);
1422
}
1523

16-
S32 xSFXWillSendDone(xSFX* param_1)
24+
void xSFXUpdateEnvironmentalStreamSounds(xSFX* pSFXList, U32 numSounds)
25+
{
26+
static xSFX* bestSFX[1];
27+
static F32 bestDist2[1];
28+
29+
for (U32 i = 0; i < numSounds; i++)
30+
{
31+
xSFXUpdate(&pSFXList[i]);
32+
}
33+
34+
memset(bestSFX, 0, sizeof(bestSFX));
35+
36+
for (U32 j = 0; j < numSounds; j++)
37+
{
38+
if (!(pSFXList[j].asset->flagsSFX & 0x200) || !(pSFXList[j].asset->flagsSFX & 0x1000))
39+
{
40+
continue;
41+
}
42+
43+
xVec3 playPos;
44+
xSndProcessSoundPos(&pSFXList[j].asset->pos, &playPos);
45+
46+
xVec3 delta = gSnd.pos - playPos;
47+
48+
F32 dist = xVec3Length2(&delta);
49+
if (dist > pSFXList[j].cachedOuterDistSquared)
50+
{
51+
break;
52+
}
53+
54+
if (bestSFX == NULL)
55+
{
56+
*bestSFX = &pSFXList[j];
57+
*bestDist2 = dist;
58+
}
59+
else if ((*bestSFX)->asset->priority < pSFXList[j].asset->priority)
60+
{
61+
*bestSFX = &pSFXList[j];
62+
*bestDist2 = dist;
63+
}
64+
else if ((*bestSFX)->asset->priority == pSFXList[j].asset->priority && dist > *bestDist2)
65+
{
66+
*bestSFX = &pSFXList[j];
67+
*bestDist2 = dist;
68+
}
69+
}
70+
71+
bool found = false;
72+
if (*s_managedEnvSFX == *bestSFX)
73+
{
74+
*bestSFX = NULL;
75+
found = true;
76+
}
77+
78+
if (!found && *s_managedEnvSFX != NULL)
79+
{
80+
xSFXStop(*s_managedEnvSFX);
81+
s_managedEnvSFX[0]->id = 0x0;
82+
}
83+
84+
if (*bestSFX != NULL)
85+
{
86+
if (*s_managedEnvSFX != NULL)
87+
{
88+
*s_managedEnvSFX = *bestSFX;
89+
}
90+
else
91+
{
92+
xSFXPlay(*bestSFX);
93+
}
94+
}
95+
}
96+
97+
static bool xSFXWillSendDone(xSFX* param_1)
1798
{
1899
S32 iLink = param_1->linkCount;
19100

@@ -25,13 +106,13 @@ S32 xSFXWillSendDone(xSFX* param_1)
25106
{
26107
if (pLink->srcEvent == 0xbf)
27108
{
28-
return 1;
109+
return true;
29110
}
30111
pLink++;
31112
}
32113
}
33114

34-
return 0;
115+
return false;
35116
}
36117

37118
void xSFXInit(void* t, void* asset)
@@ -44,7 +125,6 @@ void xSFXInit(xSFX* t, xSFXAsset* asset)
44125
{
45126
xBaseInit(t, asset);
46127

47-
// S32 xSFXEventCB(xBase* to, xBase* from, U32 toEvent, const F32* toParam, xBase*)
48128
t->eventFunc = &xSFXEventCB;
49129
t->asset = asset;
50130

@@ -61,8 +141,8 @@ void xSFXInit(xSFX* t, xSFXAsset* asset)
61141
asset->flagsSFX = asset->flagsSFX | 0x800;
62142
}
63143
t->sndID = 0;
64-
t->asset->flagsSFX = t->asset->flagsSFX & 0xefff;
65-
t->cachedOuterDistSquared = (t->asset->outerRadius * t->asset->outerRadius);
144+
t->asset->flagsSFX &= (U16) ~0x1000;
145+
t->cachedOuterDistSquared = t->asset->outerRadius * t->asset->outerRadius;
66146
}
67147

68148
void xSFXSave(xSFX* ent, xSerial* s)
@@ -75,29 +155,151 @@ void xSFXLoad(xSFX* ent, xSerial* s)
75155
xBaseLoad(ent, s);
76156
}
77157

78-
void xSFXReset(xSFX* param_1)
158+
void xSFXReset(xSFX* sfx)
159+
{
160+
xBaseReset(sfx, sfx->asset);
161+
}
162+
163+
U32 xSFXConvertFlags(U32 flagsSFX)
164+
{
165+
U32 flags = 0;
166+
167+
if (flagsSFX & 4) {
168+
flags |= 0x8000;
169+
}
170+
171+
return flags;
172+
}
173+
174+
static void xSFXUpdate(xSFX* t)
79175
{
80-
xBaseReset(param_1, param_1->asset);
176+
if ((t->asset->flagsSFX & 0x800) && (t->sndID) &&
177+
(!xSndIDIsPlaying(t->sndID)))
178+
{
179+
t->sndID = 0;
180+
t->asset->flagsSFX = t->asset->flagsSFX & 0xefff;
181+
zEntEvent(t, t, 0xbf);
182+
}
81183
}
82184

83-
U32 xSFXConvertFlags(U32 param_1)
185+
S32 xSFXEventCB(xBase* to, xBase* from, U32 toEvent, const F32* toParam, xBase* toParamWidget)
84186
{
85-
return param_1 & 4 ? 0 : 0x800;
187+
xSFX* t = (xSFX*)from;
188+
189+
switch (toEvent)
190+
{
191+
case eEventReset:
192+
xSFXReset(t);
193+
break;
194+
case eEventPlay:
195+
t->asset->flagsSFX |= 0x1000;
196+
if (!(t->asset->flagsSFX & 0x200))
197+
{
198+
xSFXPlay(t);
199+
}
200+
break;
201+
case eEventPlayMaybe:
202+
if (xrand() % 100 >= toParam[0])
203+
{
204+
t->asset->flagsSFX |= 0x1000;
205+
if (!(t->asset->flagsSFX & 0x200))
206+
{
207+
xSFXPlay(t);
208+
}
209+
}
210+
break;
211+
case eEventStop:
212+
if (t->sndID != 0)
213+
{
214+
t->asset->flagsSFX &= 0xEFFF;
215+
if (!(t->asset->flagsSFX & 0x200))
216+
{
217+
xSFXStop(t);
218+
}
219+
}
220+
221+
break;
222+
case eEventPause:
223+
while (true)
224+
{
225+
}
226+
break;
227+
}
228+
229+
return 1;
86230
}
87231

88-
void xSFXUpdate(xSFX* param_1)
232+
static void xSFXPlay(xSFX* t)
89233
{
90-
if ((param_1->asset->flagsSFX & 0x800) && (param_1->sndID) &&
91-
(!xSndIDIsPlaying(param_1->sndID)))
234+
st_PKR_ASSET_TOCINFO ainfo;
235+
U32 converted_flags = xSFXConvertFlags(t->asset->flagsSFX);
236+
237+
if (t->asset->flagsSFX & 0x2)
238+
{
239+
if (t->asset->flagsSFX & 0x8)
240+
{
241+
if (xSTGetAssetInfo(t->asset->attachID, &ainfo) == 0)
242+
{
243+
return;
244+
}
245+
246+
if (ainfo.typeref->typetag == 'MRKR')
247+
{
248+
t->sndID = xSndPlay3D(t->asset->soundAssetID, 0.77f * ((F32)t->asset->volume / 100.0f),
249+
t->asset->freq * t->asset->freqm, (U32)t->asset->priority, converted_flags,
250+
(const xVec3*)ainfo.mempos, t->asset->innerRadius,
251+
t->asset->outerRadius, SND_CAT_GAME, 0.0f);
252+
}
253+
else
254+
{
255+
xEnt* attach = (xEnt*)zSceneFindObject(t->asset->attachID);
256+
if (!attach)
257+
{
258+
xSTAssetName(t->id);
259+
xSTAssetName(t->asset->attachID);
260+
}
261+
else if (attach->model != NULL)
262+
{
263+
t->sndID = xSndPlay3D(t->asset->soundAssetID, 0.77f * ((F32)t->asset->volume / 100.0f),
264+
t->asset->freq * t->asset->freqm, (U32)t->asset->priority, converted_flags,
265+
attach, t->asset->innerRadius,
266+
t->asset->outerRadius, SND_CAT_GAME, 0.0f);
267+
}
268+
else
269+
{
270+
t->sndID = xSndPlay3D(t->asset->soundAssetID, 0.77f * ((F32)t->asset->volume / 100.0f),
271+
t->asset->freq * t->asset->freqm, (U32)t->asset->priority, converted_flags,
272+
(const xVec3*)&t->asset->pos, t->asset->innerRadius,
273+
t->asset->outerRadius, SND_CAT_GAME, 0.0f);
274+
return;
275+
}
276+
}
277+
}
278+
else
279+
{
280+
t->sndID = xSndPlay3D(t->asset->soundAssetID, 0.77f * ((F32)t->asset->volume / 100.0f),
281+
t->asset->freq * t->asset->freqm, (U32)t->asset->priority, converted_flags,
282+
(const xVec3*)&t->asset->pos, t->asset->innerRadius,
283+
t->asset->outerRadius, SND_CAT_GAME, 0.0f);
284+
}
285+
}
286+
else
92287
{
93-
param_1->sndID = 0;
94-
param_1->asset->flagsSFX = param_1->asset->flagsSFX & 0xefff;
95-
zEntEvent(param_1, param_1, 0xbf);
288+
t->sndID =
289+
xSndPlay(t->asset->soundAssetID, 0.77f * (t->asset->volume / 100.0f), t->asset->freq * t->asset->freqm,
290+
(U32)t->asset->priority, converted_flags, 0x0, SND_CAT_GAME, 0.0f);
291+
292+
if ((t->asset->flagsSFX & 0x400) && t->sndID != 0)
293+
{
294+
zEntPlayer_SNDNotifyPlaying(t->sndID);
295+
}
96296
}
297+
298+
xEnt* ent;
97299
}
98300

99-
void xSFXStop(xSFX* param_1)
301+
static void xSFXStop(xSFX* t)
100302
{
101-
xSndStop(param_1->sndID);
102-
param_1->sndID = 0;
303+
xSndStop(t->sndID);
304+
t->sndID = 0;
103305
}

src/SB/Core/x/xSFX.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,10 @@ void xSFXInit(void* t, void* asset);
3333
void xSFXInit(xSFX* t, xSFXAsset* asset);
3434
void xSFXSave(xSFX* ent, xSerial* s);
3535
void xSFXLoad(xSFX* ent, xSerial* s);
36+
void xSFXReset(xSFX* sfx);
3637
void xSFXEnvironmentalStreamSceneExit();
3738
void xSFXUpdateEnvironmentalStreamSounds(xSFX* pSFXList, U32 numSounds);
38-
S32 xSFXEventCB(xBase* to, xBase* from, U32 toEvent, const F32* toParam, xBase*);
39-
S32 xSFXWillSendDone(xSFX*);
39+
S32 xSFXEventCB(xBase* to, xBase* from, U32 toEvent, const F32* toParam, xBase* toParamWidget);
40+
U32 xSFXConvertFlags(U32 flagsSFX);
4041

4142
#endif

src/SB/Game/zEntPlayer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,7 @@ void zEntPlayer_SNDPlayStreamRandom(_tagePlayerStreamSnd player_snd_start,
450450
void zEntPlayer_SNDSetVol(_tagePlayerSnd player_snd, F32 new_vol);
451451
void zEntPlayer_SNDSetPitch(_tagePlayerSnd player_snd, F32 new_pitch);
452452
void zEntPlayer_SNDStop(_tagePlayerSnd player_snd);
453+
void zEntPlayer_SNDNotifyPlaying(U32 id);
453454

454455
void zEntPlayerSpeakStop();
455456

0 commit comments

Comments
 (0)