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
1119void 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
37118void 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
68148void 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}
0 commit comments