- adapted Blood's sound engine to using actors.

Note: Savegames won't work on this commit for the other games!
This commit is contained in:
Christoph Oelckers 2021-11-28 10:24:42 +01:00
parent 75b36cbd1c
commit 97b19a5cb1
19 changed files with 173 additions and 174 deletions

View file

@ -249,9 +249,6 @@ public:
blockNewSounds = on; blockNewSounds = on;
} }
virtual int SoundSourceIndex(FSoundChan* chan) { return 0; }
virtual void SetSource(FSoundChan* chan, int index) {}
virtual void StopChannel(FSoundChan* chan); virtual void StopChannel(FSoundChan* chan);
sfxinfo_t* LoadSound(sfxinfo_t* sfx); sfxinfo_t* LoadSound(sfxinfo_t* sfx);
const sfxinfo_t* GetSfx(unsigned snd) const sfxinfo_t* GetSfx(unsigned snd)

View file

@ -44,6 +44,7 @@
#include "cmdlib.h" #include "cmdlib.h"
#include "gamecontrol.h" #include "gamecontrol.h"
#include "build.h" #include "build.h"
#include "coreactor.h"
extern ReverbContainer* ForcedEnvironment; extern ReverbContainer* ForcedEnvironment;
static int LastReverb; static int LastReverb;
@ -181,18 +182,25 @@ static FSerializer& Serialize(FSerializer& arc, const char* key, FSoundChan& cha
("userdata", chan.UserData) ("userdata", chan.UserData)
.Array("point", chan.Point, 3); .Array("point", chan.Point, 3);
int SourceIndex = 0; assert(dynamic_cast<RazeSoundEngine*>(soundEngine));
if (arc.isWriting())
auto eng = static_cast<RazeSoundEngine*>(soundEngine);
// Let's handle actor sources here becaue they are the same for all games.
if (eng->SourceIsActor(&chan))
{ {
if (chan.SourceType == SOURCE_Actor) SourceIndex = int((spritetype*)(chan.Source) - sprite); DCoreActor* SourceIndex = nullptr;
else SourceIndex = soundEngine->SoundSourceIndex(&chan); if (arc.isWriting()) SourceIndex = const_cast<DCoreActor*>(reinterpret_cast<const DCoreActor*>(chan.Source));
arc("Source", SourceIndex);
if (arc.isReading()) chan.Source = SourceIndex;
} }
arc("Source", SourceIndex); else
if (arc.isReading())
{ {
if (chan.SourceType == SOURCE_Actor) chan.Source = &sprite[SourceIndex]; int SourceIndex = 0;
else soundEngine->SetSource(&chan, SourceIndex); if (arc.isWriting()) SourceIndex = eng->SoundSourceIndex(&chan);
arc("Source", SourceIndex);
if (arc.isReading()) eng->SetSource(&chan, SourceIndex);
} }
arc.EndObject(); arc.EndObject();
} }
return arc; return arc;

View file

@ -38,3 +38,11 @@ inline void FX_SetReverbDelay(int delay)
int S_LookupSound(const char* fn); int S_LookupSound(const char* fn);
class FSerializer; class FSerializer;
void S_SerializeSounds(FSerializer& arc); void S_SerializeSounds(FSerializer& arc);
class RazeSoundEngine : public SoundEngine
{
public:
virtual bool SourceIsActor(FSoundChan* chan) { return chan->SourceType == SOURCE_Actor; }
virtual int SoundSourceIndex(FSoundChan* chan) { return 0; }
virtual void SetSource(FSoundChan* chan, int index) {}
};

View file

@ -3746,7 +3746,7 @@ static int actDamageThing(DBloodActor* source, DBloodActor* actor, int damage, D
case kThingZombieHead: case kThingZombieHead:
if (damageType == 3 && pSourcePlayer && PlayClock > pSourcePlayer->laughCount && Chance(0x4000)) if (damageType == 3 && pSourcePlayer && PlayClock > pSourcePlayer->laughCount && Chance(0x4000))
{ {
sfxPlay3DSound(pSourcePlayer->pSprite, gPlayerGibThingComments[Random(10)], 0, 2); sfxPlay3DSound(pSourcePlayer->actor, gPlayerGibThingComments[Random(10)], 0, 2);
pSourcePlayer->laughCount = PlayClock + 3600; pSourcePlayer->laughCount = PlayClock + 3600;
} }
break; break;
@ -3914,7 +3914,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
if (missileActor->hasX()) if (missileActor->hasX())
{ {
actPostSprite(missileActor, kStatDecoration); actPostSprite(missileActor, kStatDecoration);
if (pMissile->ang == 1024) sfxPlay3DSound(pMissile, 307, -1, 0); if (pMissile->ang == 1024) sfxPlay3DSound(missileActor, 307, -1, 0);
pMissile->type = kSpriteDecoration; pMissile->type = kSpriteDecoration;
seqSpawn(9, missileActor, -1); seqSpawn(9, missileActor, -1);
} }
@ -3952,7 +3952,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
break; break;
case kMissileArcGargoyle: case kMissileArcGargoyle:
sfxKill3DSound(pMissile, -1, -1); sfxKill3DSound(missileActor, -1, -1);
sfxPlay3DSound(pMissile->x, pMissile->y, pMissile->z, 306, pMissile->sector()); sfxPlay3DSound(pMissile->x, pMissile->y, pMissile->z, 306, pMissile->sector());
GibSprite(missileActor, GIBTYPE_6, NULL, NULL); GibSprite(missileActor, GIBTYPE_6, NULL, NULL);
@ -3966,7 +3966,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
case kMissileLifeLeechAltNormal: case kMissileLifeLeechAltNormal:
case kMissileLifeLeechAltSmall: case kMissileLifeLeechAltSmall:
sfxKill3DSound(pMissile, -1, -1); sfxKill3DSound(missileActor, -1, -1);
sfxPlay3DSound(pMissile->x, pMissile->y, pMissile->z, 306, pMissile->sector()); sfxPlay3DSound(pMissile->x, pMissile->y, pMissile->z, 306, pMissile->sector());
if (hitCode == 3 && pSpriteHit && (pThingInfo || pDudeInfo)) if (hitCode == 3 && pSpriteHit && (pThingInfo || pDudeInfo))
@ -3992,12 +3992,12 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
break; break;
case kMissileFlareAlt: case kMissileFlareAlt:
sfxKill3DSound(pMissile, -1, -1); sfxKill3DSound(missileActor, -1, -1);
actExplodeSprite(missileActor); actExplodeSprite(missileActor);
break; break;
case kMissileFlareRegular: case kMissileFlareRegular:
sfxKill3DSound(pMissile, -1, -1); sfxKill3DSound(missileActor, -1, -1);
if ((hitCode == 3 && pSpriteHit) && (pThingInfo || pDudeInfo)) if ((hitCode == 3 && pSpriteHit) && (pThingInfo || pDudeInfo))
{ {
if ((pThingInfo && pThingInfo->dmgControl[kDamageBurn] != 0) || (pDudeInfo && pDudeInfo->damageVal[kDamageBurn] != 0)) if ((pThingInfo && pThingInfo->dmgControl[kDamageBurn] != 0) || (pDudeInfo && pDudeInfo->damageVal[kDamageBurn] != 0))
@ -4080,7 +4080,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
break; break;
case kMissileEctoSkull: case kMissileEctoSkull:
sfxKill3DSound(pMissile, -1, -1); sfxKill3DSound(missileActor, -1, -1);
sfxPlay3DSound(pMissile->x, pMissile->y, pMissile->z, 522, pMissile->sector()); sfxPlay3DSound(pMissile->x, pMissile->y, pMissile->z, 522, pMissile->sector());
actPostSprite(missileActor, kStatDebris); actPostSprite(missileActor, kStatDebris);
seqSpawn(20, missileActor, -1); seqSpawn(20, missileActor, -1);
@ -4113,7 +4113,7 @@ static void actImpactMissile(DBloodActor* missileActor, int hitCode)
break; break;
case kMissileTeslaRegular: case kMissileTeslaRegular:
sfxKill3DSound(pMissile, -1, -1); sfxKill3DSound(missileActor, -1, -1);
sfxPlay3DSound(pMissile->x, pMissile->y, pMissile->z, 518, pMissile->sector()); sfxPlay3DSound(pMissile->x, pMissile->y, pMissile->z, 518, pMissile->sector());
GibSprite(missileActor, (hitCode == 2) ? GIBTYPE_23 : GIBTYPE_22, NULL, NULL); GibSprite(missileActor, (hitCode == 2) ? GIBTYPE_23 : GIBTYPE_22, NULL, NULL);
evKillActor(missileActor); evKillActor(missileActor);
@ -5457,7 +5457,7 @@ void actExplodeSprite(DBloodActor* actor)
//auto Owner = actor->GetOwner(); //auto Owner = actor->GetOwner();
if (pSprite->statnum == kStatExplosion) return; if (pSprite->statnum == kStatExplosion) return;
sfxKill3DSound(pSprite, -1, -1); sfxKill3DSound(actor, -1, -1);
evKillActor(actor); evKillActor(actor);
int nType = kExplosionStandard; int nType = kExplosionStandard;
@ -6590,19 +6590,19 @@ void actBuildMissile(DBloodActor* spawned, DBloodActor* actor)
pMissile->cstat |= 16; pMissile->cstat |= 16;
break; break;
case kMissileTeslaRegular: case kMissileTeslaRegular:
sfxPlay3DSound(pMissile, 251, 0, 0); sfxPlay3DSound(spawned, 251, 0, 0);
break; break;
case kMissileEctoSkull: case kMissileEctoSkull:
seqSpawn(2, spawned, -1); seqSpawn(2, spawned, -1);
sfxPlay3DSound(pMissile, 493, 0, 0); sfxPlay3DSound(spawned, 493, 0, 0);
break; break;
case kMissileFireballNapalm: case kMissileFireballNapalm:
seqSpawn(61, spawned, nNapalmClient); seqSpawn(61, spawned, nNapalmClient);
sfxPlay3DSound(pMissile, 441, 0, 0); sfxPlay3DSound(spawned, 441, 0, 0);
break; break;
case kMissileFireball: case kMissileFireball:
seqSpawn(22, spawned, nFireballClient); seqSpawn(22, spawned, nFireballClient);
sfxPlay3DSound(pMissile, 441, 0, 0); sfxPlay3DSound(spawned, 441, 0, 0);
break; break;
case kMissileFlameHound: case kMissileFlameHound:
seqSpawn(27, spawned, -1); seqSpawn(27, spawned, -1);
@ -6612,7 +6612,7 @@ void actBuildMissile(DBloodActor* spawned, DBloodActor* actor)
break; break;
case kMissileFireballCerberus: case kMissileFireballCerberus:
seqSpawn(61, spawned, dword_2192E0); seqSpawn(61, spawned, dword_2192E0);
sfxPlay3DSound(pMissile, 441, 0, 0); sfxPlay3DSound(spawned, 441, 0, 0);
break; break;
case kMissileFireballTchernobog: case kMissileFireballTchernobog:
seqSpawn(23, spawned, dword_2192D8); seqSpawn(23, spawned, dword_2192D8);
@ -6630,17 +6630,17 @@ void actBuildMissile(DBloodActor* spawned, DBloodActor* actor)
case kMissileFlareAlt: case kMissileFlareAlt:
evPostActor(spawned, 30, kCallbackFXFlareBurst); evPostActor(spawned, 30, kCallbackFXFlareBurst);
evPostActor(spawned, 0, kCallbackFXFlareSpark); evPostActor(spawned, 0, kCallbackFXFlareSpark);
sfxPlay3DSound(pMissile, 422, 0, 0); sfxPlay3DSound(spawned, 422, 0, 0);
break; break;
case kMissileFlareRegular: case kMissileFlareRegular:
evPostActor(spawned, 0, kCallbackFXFlareSpark); evPostActor(spawned, 0, kCallbackFXFlareSpark);
sfxPlay3DSound(pMissile, 422, 0, 0); sfxPlay3DSound(spawned, 422, 0, 0);
break; break;
case kMissileLifeLeechAltSmall: case kMissileLifeLeechAltSmall:
evPostActor(spawned, 0, kCallbackFXArcSpark); evPostActor(spawned, 0, kCallbackFXArcSpark);
break; break;
case kMissileArcGargoyle: case kMissileArcGargoyle:
sfxPlay3DSound(pMissile, 252, 0, 0); sfxPlay3DSound(spawned, 252, 0, 0);
break; break;
} }
} }

View file

@ -1453,7 +1453,7 @@ void removeLeech(DBloodActor* actLeech, bool delSprite)
pEffect->yrepeat = repeat; pEffect->yrepeat = repeat;
} }
sfxPlay3DSoundCP(pLeech, 490, -1, 0,60000); sfxPlay3DSoundCP(actLeech, 490, -1, 0,60000);
if (actLeech->GetOwner()) if (actLeech->GetOwner())
actLeech->GetOwner()->genDudeExtra.pLifeLeech = nullptr; actLeech->GetOwner()->genDudeExtra.pLifeLeech = nullptr;

View file

@ -74,7 +74,7 @@ void HackSeqCallback(int, DBloodActor* actor)
int dz = height - height2; int dz = height - height2;
int dx = bcos(nAngle); int dx = bcos(nAngle);
int dy = bsin(nAngle); int dy = bsin(nAngle);
sfxPlay3DSound(pSprite, 1101, 1, 0); sfxPlay3DSound(actor, 1101, 1, 0);
actFireVector(actor, 0, 0, dx, dy, dz, kVectorAxe); actFireVector(actor, 0, 0, dx, dy, dz, kVectorAxe);
} }
@ -197,7 +197,7 @@ static void zombaThinkPonder(DBloodActor* actor)
{ {
if (abs(nDeltaAngle) < 85) if (abs(nDeltaAngle) < 85)
{ {
sfxPlay3DSound(pSprite, 1101, 1, 0); sfxPlay3DSound(actor, 1101, 1, 0);
aiNewState(actor, &zombieAHack); aiNewState(actor, &zombieAHack);
} }
return; return;
@ -277,7 +277,7 @@ static void entryEStand(DBloodActor* actor)
{ {
auto pXSprite = &actor->x(); auto pXSprite = &actor->x();
auto pSprite = &actor->s(); auto pSprite = &actor->s();
sfxPlay3DSound(pSprite, 1100, -1, 0); sfxPlay3DSound(actor, 1100, -1, 0);
pSprite->ang = getangle(pXSprite->targetX - pSprite->x, pXSprite->targetY - pSprite->y); pSprite->ang = getangle(pXSprite->targetX - pSprite->x, pXSprite->targetY - pSprite->y);
} }

View file

@ -74,7 +74,7 @@ void PukeSeqCallback(int, DBloodActor* actor)
int nAngle = getangle(tx, ty); int nAngle = getangle(tx, ty);
int dx = bcos(nAngle); int dx = bcos(nAngle);
int dy = bsin(nAngle); int dy = bsin(nAngle);
sfxPlay3DSound(pSprite, 1203, 1, 0); sfxPlay3DSound(actor, 1203, 1, 0);
actFireMissile(actor, 0, -(height - height2), dx, dy, 0, kMissilePukeGreen); actFireMissile(actor, 0, -(height - height2), dx, dy, 0, kMissilePukeGreen);
} }

View file

@ -185,19 +185,6 @@ inline void GetActorExtents(DBloodActor* actor, int* top, int* bottom)
GetSpriteExtents(&actor->s(), top, bottom); GetSpriteExtents(&actor->s(), top, bottom);
} }
inline void sfxPlay3DSound(DBloodActor* pSprite, int soundId, int a3 = -1, int a4 = 0)
{
sfxPlay3DSound(&pSprite->s(), soundId, a3, a4);
}
inline void sfxPlay3DSoundCP(DBloodActor* pSprite, int soundId, int a3 = -1, int a4 = 0, int pitch = 0, int volume = 0)
{
sfxPlay3DSoundCP(&pSprite->s(), soundId, a3, a4, pitch, volume);
}
inline void sfxKill3DSound(DBloodActor* pSprite, int a2 = -1, int a3 = -1)
{
sfxKill3DSound(&pSprite->s(), a2, a3);
}
inline void ChangeActorStat(DBloodActor* actor, int stat) inline void ChangeActorStat(DBloodActor* actor, int stat)
{ {
ChangeSpriteStat(actor->GetSpriteIndex(), stat); ChangeSpriteStat(actor->GetSpriteIndex(), stat);

View file

@ -287,7 +287,7 @@ void Respawn(DBloodActor* actor, sectortype*) // 9
} }
gFX.fxSpawnActor(FX_29, pSprite->sector(), pSprite->x, pSprite->y, pSprite->z, 0); gFX.fxSpawnActor(FX_29, pSprite->sector(), pSprite->x, pSprite->y, pSprite->z, 0);
sfxPlay3DSound(pSprite, 350, -1, 0); sfxPlay3DSound(actor, 350, -1, 0);
break; break;
} }
} }
@ -402,7 +402,7 @@ void fxBloodBits(DBloodActor* actor, sectortype*) // 14
if (pSprite->ang == 1024) if (pSprite->ang == 1024)
{ {
int nChannel = 28 + (actor->GetIndex() & 2); // this is a little stupid... int nChannel = 28 + (actor->GetIndex() & 2); // this is a little stupid...
sfxPlay3DSound(pSprite, 385, nChannel, 1); sfxPlay3DSound(actor, 385, nChannel, 1);
} }
if (Chance(0x5000)) if (Chance(0x5000))
{ {
@ -459,11 +459,11 @@ void fxBouncingSleeve(DBloodActor* actor, sectortype*) // 16
// tommy sleeve // tommy sleeve
if (pSprite->type >= 37 && pSprite->type <= 39) { if (pSprite->type >= 37 && pSprite->type <= 39) {
Random(3); Random(3);
sfxPlay3DSound(pSprite, 608 + Random(2), nChannel, 1); sfxPlay3DSound(actor, 608 + Random(2), nChannel, 1);
// sawed-off sleeve // sawed-off sleeve
} else { } else {
sfxPlay3DSound(pSprite, sawedOffSleeveSnd[Random(2)], nChannel, 1); sfxPlay3DSound(actor, sawedOffSleeveSnd[Random(2)], nChannel, 1);
} }
} }
@ -475,7 +475,7 @@ void sleeveStopBouncing(DBloodActor* actor)
auto pSprite = &actor->s(); auto pSprite = &actor->s();
actor->xvel = actor->yvel = actor->zvel = 0; actor->xvel = actor->yvel = actor->zvel = 0;
if (actor->hasX()) seqKill(actor); if (actor->hasX()) seqKill(actor);
sfxKill3DSound(pSprite, -1, -1); sfxKill3DSound(actor, -1, -1);
switch (pSprite->type) { switch (pSprite->type) {
case 37: case 37:
@ -559,7 +559,7 @@ void fxPodBloodSplat(DBloodActor* actor, sectortype*) // 19
{ {
int nChannel = 28 + (actor->GetIndex() & 2); int nChannel = 28 + (actor->GetIndex() & 2);
assert(nChannel < 32); assert(nChannel < 32);
sfxPlay3DSound(pSprite, 385, nChannel, 1); sfxPlay3DSound(actor, 385, nChannel, 1);
} }
DBloodActor *pFX = NULL; DBloodActor *pFX = NULL;
if (pSprite->type == 53 || pSprite->type == kThingPodGreenBall) if (pSprite->type == 53 || pSprite->type == kThingPodGreenBall)
@ -596,17 +596,18 @@ void LeechStateTimer(DBloodActor* actor, sectortype*) // 20
} }
} }
void sub_76A08(DBloodActor *actor, spritetype *pSprite2, PLAYER *pPlayer) // ??? void sub_76A08(DBloodActor *actor, DBloodActor *actor2, PLAYER *pPlayer) // ???
{ {
int top, bottom; int top, bottom;
auto pSprite = &actor->s(); auto pSprite = &actor->s();
auto pSprite2 = &actor2->s();
GetSpriteExtents(pSprite, &top, &bottom); GetSpriteExtents(pSprite, &top, &bottom);
pSprite->x = pSprite2->x; pSprite->x = pSprite2->x;
pSprite->y = pSprite2->y; pSprite->y = pSprite2->y;
pSprite->z = pSprite2->sector()->floorz-(bottom-pSprite->z); pSprite->z = pSprite2->sector()->floorz-(bottom-pSprite->z);
pSprite->ang = pSprite2->ang; pSprite->ang = pSprite2->ang;
ChangeActorSect(actor, pSprite2->sector()); ChangeActorSect(actor, pSprite2->sector());
sfxPlay3DSound(pSprite2, 201, -1, 0); sfxPlay3DSound(actor2, 201, -1, 0);
actor->xvel = actor->yvel = actor->zvel = 0; actor->xvel = actor->yvel = actor->zvel = 0;
viewBackupSpriteLoc(actor); viewBackupSpriteLoc(actor);
if (pPlayer) if (pPlayer)
@ -678,7 +679,7 @@ void DropVoodooCb(DBloodActor* actor, sectortype*) // unused
{ {
int nDmg = actDamageSprite(actor, actor2, kDamageSpirit, pXSprite->data1<<4); int nDmg = actDamageSprite(actor, actor2, kDamageSpirit, pXSprite->data1<<4);
pXSprite->data1 = ClipLow(pXSprite->data1-nDmg, 0); pXSprite->data1 = ClipLow(pXSprite->data1-nDmg, 0);
sub_76A08(actor2, pSprite, pPlayer2); sub_76A08(actor2, actor, pPlayer2);
evPostActor(actor, 0, kCallbackRemove); evPostActor(actor, 0, kCallbackRemove);
return; return;
} }
@ -719,7 +720,7 @@ void DropVoodooCb(DBloodActor* actor, sectortype*) // unused
} }
if (vd && (Chance(vd) || nextactor == nullptr)) if (vd && (Chance(vd) || nextactor == nullptr))
{ {
sub_76A08(actor2, pSprite, NULL); sub_76A08(actor2, actor, NULL);
evPostActor(actor, 0, kCallbackRemove); evPostActor(actor, 0, kCallbackRemove);
return; return;
} }

View file

@ -1789,7 +1789,7 @@ void debrisMove(int listIndex)
case kMarkerUpWater: case kMarkerUpWater:
case kMarkerUpGoo: case kMarkerUpGoo:
int pitch = (150000 - (actor->spriteMass.mass << 9)) + Random3(8192); int pitch = (150000 - (actor->spriteMass.mass << 9)) + Random3(8192);
sfxPlay3DSoundCP(pSprite, 720, -1, 0, pitch, 75 - Random(40)); sfxPlay3DSoundCP(actor, 720, -1, 0, pitch, 75 - Random(40));
if (!spriteIsUnderwater(actor)) if (!spriteIsUnderwater(actor))
{ {
evKillActor(actor, kCallbackEnemeyBubble); evKillActor(actor, kCallbackEnemeyBubble);
@ -3111,7 +3111,7 @@ void useTeleportTarget(DBloodActor* sourceactor, DBloodActor* actor)
viewBackupSpriteLoc(actor); viewBackupSpriteLoc(actor);
if (pXSource->data4 > 0) if (pXSource->data4 > 0)
sfxPlay3DSound(pSource, pXSource->data4, -1, 0); sfxPlay3DSound(sourceactor, pXSource->data4, -1, 0);
if (pPlayer) if (pPlayer)
{ {
@ -5770,12 +5770,12 @@ bool modernTypeOperateSprite(DBloodActor* actor, const EVENT& event)
{ {
case kCmdSpriteProximity: case kCmdSpriteProximity:
if (pXSprite->state) break; if (pXSprite->state) break;
sfxPlay3DSound(pSprite, 452, 0, 0); sfxPlay3DSound(actor, 452, 0, 0);
evPostActor(actor, 30, kCmdOff); evPostActor(actor, 30, kCmdOff);
pXSprite->state = 1; pXSprite->state = 1;
[[fallthrough]]; [[fallthrough]];
case kCmdOn: case kCmdOn:
sfxPlay3DSound(pSprite, 451, 0, 0); sfxPlay3DSound(actor, 451, 0, 0);
pXSprite->Proximity = 1; pXSprite->Proximity = 1;
break; break;
default: default:
@ -8309,18 +8309,17 @@ DBloodActor* aiPatrolSearchTargets(DBloodActor* actor)
sectortype* searchsect = nullptr; sectortype* searchsect = nullptr;
if (chan->SourceType == SOURCE_Actor) if (chan->SourceType == SOURCE_Actor)
{ {
auto emitter = (spritetype*)chan->Source; auto emitterActor = (DBloodActor*)chan->Source;
if (emitter < sprite || emitter >= sprite + MAXSPRITES || emitter->statnum == kStatFree) return false; // not a valid source. if (emitterActor == nullptr) return false; // not a valid source.
sndx = emitter->x; sndx = emitterActor->s().x;
sndy = emitter->y; sndy = emitterActor->s().y;
// sound attached to the sprite // sound attached to the sprite
auto emitterActor = &bloodActors[emitter - sprite]; if (pPlayer->actor != emitterActor && emitterActor->GetOwner() != actor)
if (pSpr != emitter && emitterActor->GetOwner() != actor)
{ {
if (!emitter->insector()) return false; if (!emitterActor->s().insector()) return false;
searchsect = emitter->sector(); searchsect = emitterActor->s().sector();
} }
} }
else if (chan->SourceType == SOURCE_Unattached) else if (chan->SourceType == SOURCE_Unattached)

View file

@ -299,7 +299,7 @@ bool powerupActivate(PLAYER *pPlayer, int nPowerUp)
WeaponRaise(pPlayer); WeaponRaise(pPlayer);
break; break;
} }
sfxPlay3DSound(pPlayer->pSprite, 776, -1, 0); sfxPlay3DSound(pPlayer->actor, 776, -1, 0);
return 1; return 1;
} }
@ -1109,7 +1109,7 @@ bool PickupAmmo(PLAYER* pPlayer, DBloodActor* ammoactor)
pPlayer->ammoCount[nAmmoType] = ClipHigh(pPlayer->ammoCount[nAmmoType]+pAmmoItemData->count, gAmmoInfo[nAmmoType].max); pPlayer->ammoCount[nAmmoType] = ClipHigh(pPlayer->ammoCount[nAmmoType]+pAmmoItemData->count, gAmmoInfo[nAmmoType].max);
if (pAmmoItemData->weaponType) pPlayer->hasWeapon[pAmmoItemData->weaponType] = 1; if (pAmmoItemData->weaponType) pPlayer->hasWeapon[pAmmoItemData->weaponType] = 1;
sfxPlay3DSound(pPlayer->pSprite, 782, -1, 0); sfxPlay3DSound(pPlayer->actor, 782, -1, 0);
return 1; return 1;
} }
@ -1137,7 +1137,7 @@ bool PickupWeapon(PLAYER *pPlayer, DBloodActor* weaponactor)
pPlayer->weaponState = 0; pPlayer->weaponState = 0;
pPlayer->nextWeapon = nNewWeapon; pPlayer->nextWeapon = nNewWeapon;
} }
sfxPlay3DSound(pPlayer->pSprite, 777, -1, 0); sfxPlay3DSound(pPlayer->actor, 777, -1, 0);
return 1; return 1;
} }
@ -1149,7 +1149,7 @@ bool PickupWeapon(PLAYER *pPlayer, DBloodActor* weaponactor)
else else
pPlayer->ammoCount[nAmmoType] = ClipHigh(pPlayer->ammoCount[nAmmoType]+pWeaponItemData->count, gAmmoInfo[nAmmoType].max); pPlayer->ammoCount[nAmmoType] = ClipHigh(pPlayer->ammoCount[nAmmoType]+pWeaponItemData->count, gAmmoInfo[nAmmoType].max);
sfxPlay3DSound(pPlayer->pSprite, 777, -1, 0); sfxPlay3DSound(pPlayer->actor, 777, -1, 0);
return 1; return 1;
} }
@ -1488,7 +1488,7 @@ void ProcessInput(PLAYER *pPlayer)
#ifdef NOONE_EXTENSIONS #ifdef NOONE_EXTENSIONS
if ((packItemActive(pPlayer, 4) && pPosture->pwupJumpZ != 0) || pPosture->normalJumpZ != 0) if ((packItemActive(pPlayer, 4) && pPosture->pwupJumpZ != 0) || pPosture->normalJumpZ != 0)
#endif #endif
sfxPlay3DSound(pSprite, 700, 0, 0); sfxPlay3DSound(actor, 700, 0, 0);
if (packItemActive(pPlayer, 4)) actor->zvel = pPosture->pwupJumpZ; //-0x175555; if (packItemActive(pPlayer, 4)) actor->zvel = pPosture->pwupJumpZ; //-0x175555;
else actor->zvel = pPosture->normalJumpZ; //-0xbaaaa; else actor->zvel = pPosture->normalJumpZ; //-0xbaaaa;
@ -1951,7 +1951,7 @@ int playerDamageSprite(DBloodActor* source, PLAYER *pPlayer, DAMAGE_TYPE nDamage
{ {
case kDamageSpirit: case kDamageSpirit:
nDeathSeqID = 18; nDeathSeqID = 18;
sfxPlay3DSound(pSprite, 716, 0, 0); sfxPlay3DSound(pPlayer->actor, 716, 0, 0);
break; break;
case kDamageExplode: case kDamageExplode:
GibSprite(pActor, GIBTYPE_7, NULL, NULL); GibSprite(pActor, GIBTYPE_7, NULL, NULL);
@ -1995,10 +1995,10 @@ int playerDamageSprite(DBloodActor* source, PLAYER *pPlayer, DAMAGE_TYPE nDamage
nSound = pDamageInfo->Kills[Random(3)]; nSound = pDamageInfo->Kills[Random(3)];
if (nDamageType == kDamageDrown && pXSprite->medium == kMediumWater && !pPlayer->hand) if (nDamageType == kDamageDrown && pXSprite->medium == kMediumWater && !pPlayer->hand)
nSound = 714; nSound = 714;
sfxPlay3DSound(pSprite, nSound, 0, 6); sfxPlay3DSound(pPlayer->actor, nSound, 0, 6);
return nDamage; return nDamage;
} }
sfxKill3DSound(pPlayer->pSprite, -1, 441); sfxKill3DSound(pPlayer->actor, -1, 441);
if (gGameOptions.nGameType == 3 && pPlayer->hasFlag) { if (gGameOptions.nGameType == 3 && pPlayer->hasFlag) {
if (pPlayer->hasFlag&1) flagDropped(pPlayer, kItemFlagA); if (pPlayer->hasFlag&1) flagDropped(pPlayer, kItemFlagA);
if (pPlayer->hasFlag&2) flagDropped(pPlayer, kItemFlagB); if (pPlayer->hasFlag&2) flagDropped(pPlayer, kItemFlagB);
@ -2013,14 +2013,14 @@ int playerDamageSprite(DBloodActor* source, PLAYER *pPlayer, DAMAGE_TYPE nDamage
switch (nDamageType) switch (nDamageType)
{ {
case kDamageExplode: case kDamageExplode:
sfxPlay3DSound(pSprite, 717, 0, 0); sfxPlay3DSound(pPlayer->actor, 717, 0, 0);
GibSprite(pActor, GIBTYPE_7, NULL, NULL); GibSprite(pActor, GIBTYPE_7, NULL, NULL);
GibSprite(pActor, GIBTYPE_15, NULL, NULL); GibSprite(pActor, GIBTYPE_15, NULL, NULL);
pPlayer->pSprite->cstat |= 32768; pPlayer->pSprite->cstat |= 32768;
nDeathSeqID = 2; nDeathSeqID = 2;
break; break;
case kDamageBurn: case kDamageBurn:
sfxPlay3DSound(pSprite, 718, 0, 0); sfxPlay3DSound(pPlayer->actor, 718, 0, 0);
nDeathSeqID = 3; nDeathSeqID = 3;
break; break;
case kDamageDrown: case kDamageDrown:
@ -2030,7 +2030,7 @@ int playerDamageSprite(DBloodActor* source, PLAYER *pPlayer, DAMAGE_TYPE nDamage
if (nHealth < -20 && gGameOptions.nGameType >= 2 && Chance(0x4000)) if (nHealth < -20 && gGameOptions.nGameType >= 2 && Chance(0x4000))
{ {
DAMAGEINFO *pDamageInfo = &damageInfo[nDamageType]; DAMAGEINFO *pDamageInfo = &damageInfo[nDamageType];
sfxPlay3DSound(pSprite, pDamageInfo->at10[0], 0, 2); sfxPlay3DSound(pPlayer->actor, pDamageInfo->at10[0], 0, 2);
nDeathSeqID = 16; nDeathSeqID = 16;
nKneelingPlayer = nPlayerKneelClient; nKneelingPlayer = nPlayerKneelClient;
powerupActivate(pPlayer, kPwUpDeliriumShroom); powerupActivate(pPlayer, kPwUpDeliriumShroom);
@ -2039,7 +2039,7 @@ int playerDamageSprite(DBloodActor* source, PLAYER *pPlayer, DAMAGE_TYPE nDamage
} }
else else
{ {
sfxPlay3DSound(pSprite, 716, 0, 0); sfxPlay3DSound(pPlayer->actor, 716, 0, 0);
nDeathSeqID = 1; nDeathSeqID = 1;
} }
break; break;
@ -2149,7 +2149,7 @@ void playerLandingSound(PLAYER *pPlayer)
return; return;
int nSurf = tileGetSurfType(pHit->florhit); int nSurf = tileGetSurfType(pHit->florhit);
if (nSurf) if (nSurf)
sfxPlay3DSound(pSprite, surfaceSound[nSurf], -1, 0); sfxPlay3DSound(pPlayer->actor, surfaceSound[nSurf], -1, 0);
} }
} }
@ -2160,7 +2160,7 @@ void PlayerSurvive(int, DBloodActor* actor)
actHealDude(actor, 1, 2); actHealDude(actor, 1, 2);
if (gGameOptions.nGameType > 0 && numplayers > 1) if (gGameOptions.nGameType > 0 && numplayers > 1)
{ {
sfxPlay3DSound(pSprite, 3009, 0, 6); sfxPlay3DSound(actor, 3009, 0, 6);
if (IsPlayerSprite(pSprite)) if (IsPlayerSprite(pSprite))
{ {
PLAYER *pPlayer = &gPlayer[pSprite->type-kDudePlayer1]; PLAYER *pPlayer = &gPlayer[pSprite->type-kDudePlayer1];

View file

@ -380,7 +380,7 @@ void SEQINST::Update()
{ {
auto udata = soundEngine->GetUserData(snd); auto udata = soundEngine->GetUserData(snd);
int relVol = udata ? udata[2] : 255; int relVol = udata ? udata[2] : 255;
sfxPlay3DSoundCP(pSprite, sndId, -1, 0, 0, (surfSfxMove[surf][2] != relVol) ? relVol : surfSfxMove[surf][3]); sfxPlay3DSoundCP(actor, sndId, -1, 0, 0, (surfSfxMove[surf][2] != relVol) ? relVol : surfSfxMove[surf][3]);
} }
} }
break; break;

View file

@ -29,7 +29,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
BEGIN_BLD_NS BEGIN_BLD_NS
class BloodSoundEngine : public SoundEngine class BloodSoundEngine : public RazeSoundEngine
{ {
// client specific parts of the sound engine go in this class. // client specific parts of the sound engine go in this class.
void CalcPosVel(int type, const void* source, const float pt[3], int channum, int chanflags, FSoundID chanSound, FVector3* pos, FVector3* vel, FSoundChan *channel) override; void CalcPosVel(int type, const void* source, const float pt[3], int channum, int chanflags, FSoundID chanSound, FVector3* pos, FVector3* vel, FSoundChan *channel) override;
@ -45,9 +45,9 @@ public:
void StopChannel(FSoundChan* chan) override void StopChannel(FSoundChan* chan) override
{ {
if (chan && chan->SysChannel != NULL && !(chan->ChanFlags & CHANF_EVICTED) && chan->SourceType == SOURCE_Actor) if (chan && chan->SysChannel != nullptr && !(chan->ChanFlags & CHANF_EVICTED) && chan->SourceType == SOURCE_Actor)
{ {
chan->Source = NULL; chan->Source = nullptr;
chan->SourceType = SOURCE_Unattached; chan->SourceType = SOURCE_Unattached;
} }
SoundEngine::StopChannel(chan); SoundEngine::StopChannel(chan);
@ -88,13 +88,12 @@ void BloodSoundEngine::CalcPosVel(int type, const void* source, const float pt[3
} }
else if (type == SOURCE_Actor) else if (type == SOURCE_Actor)
{ {
auto sprt = (spritetype*)source; assert(source != nullptr);
assert(sprt != nullptr); auto actor = (DBloodActor*)source;
auto actor = &bloodActors[sprt - sprite];
// Engine expects velocity in units per second, not units per tic. // Engine expects velocity in units per second, not units per tic.
if (vel) *vel = { actor->xvel * (30 / 65536.f), actor->zvel * (-30 / 65536.f), actor->yvel * (-30 / 65536.f) }; if (vel) *vel = { actor->xvel * (30 / 65536.f), actor->zvel * (-30 / 65536.f), actor->yvel * (-30 / 65536.f) };
*pos = GetSoundPos(&sprt->pos); *pos = GetSoundPos(&actor->s().pos);
} }
else if (type == SOURCE_Ambient) else if (type == SOURCE_Ambient)
{ {
@ -169,13 +168,13 @@ void sfxPlay3DSound(int x, int y, int z, int soundId, sectortype* pSector)
if (chan) chan->UserData = sectnum(pSector); if (chan) chan->UserData = sectnum(pSector);
} }
void sfxPlay3DSoundCP(spritetype* pSprite, int soundId, int playchannel, int playflags, int pitch, int volume) void sfxPlay3DSoundCP(DBloodActor* pActor, int soundId, int playchannel, int playflags, int pitch, int volume)
{ {
if (!SoundEnabled() || soundId < 0 || !pSprite) return; if (!SoundEnabled() || soundId < 0 || !pActor) return;
auto sid = soundEngine->FindSoundByResID(soundId); auto sid = soundEngine->FindSoundByResID(soundId);
if (sid == 0) return; if (sid == 0) return;
auto svec = GetSoundPos(&pSprite->pos); auto svec = GetSoundPos(&pActor->s().pos);
float attenuation; float attenuation;
sid = getSfx(sid, attenuation, pitch, volume); sid = getSfx(sid, attenuation, pitch, volume);
@ -187,7 +186,7 @@ void sfxPlay3DSoundCP(spritetype* pSprite, int soundId, int playchannel, int pla
if (soundEngine->EnumerateChannels([=](FSoundChan* chan) -> int if (soundEngine->EnumerateChannels([=](FSoundChan* chan) -> int
{ {
if (chan->SourceType != SOURCE_Actor) return false; // other source types are not our business. if (chan->SourceType != SOURCE_Actor) return false; // other source types are not our business.
if (chan->EntChannel == playchannel && (chan->Source == pSprite || (playflags & FX_GlobalChannel) != 0)) if (chan->EntChannel == playchannel && (chan->Source == pActor || (playflags & FX_GlobalChannel) != 0))
{ {
if ((playflags & FX_ChannelMatch) != 0 && chan->EntChannel == playchannel) if ((playflags & FX_ChannelMatch) != 0 && chan->EntChannel == playchannel)
return true; return true;
@ -209,25 +208,25 @@ void sfxPlay3DSoundCP(spritetype* pSprite, int soundId, int playchannel, int pla
flags &= ~CHANF_OVERLAP; flags &= ~CHANF_OVERLAP;
} }
soundEngine->StartSound(SOURCE_Actor, pSprite, &svec, playchannel, flags, sid, volume * (0.8f / 80.f), attenuation, nullptr, pitch / 65536.f); soundEngine->StartSound(SOURCE_Actor, pActor, &svec, playchannel, flags, sid, volume * (0.8f / 80.f), attenuation, nullptr, pitch / 65536.f);
} }
void sfxPlay3DSound(spritetype* pSprite, int soundId, int a3, int a4) void sfxPlay3DSound(DBloodActor* pActor, int soundId, int a3, int a4)
{ {
sfxPlay3DSoundCP(pSprite, soundId, a3, a4, -1); sfxPlay3DSoundCP(pActor, soundId, a3, a4, -1);
} }
void sfxKill3DSound(spritetype *pSprite, int a2, int a3) void sfxKill3DSound(DBloodActor *pActor, int a2, int a3)
{ {
if (!pSprite) if (!pActor)
return; return;
if (a2 >= 0) a2++; if (a2 >= 0) a2++;
auto sid = soundEngine->FindSoundByResID(a3); auto sid = soundEngine->FindSoundByResID(a3);
soundEngine->EnumerateChannels([=](FSoundChan* channel) soundEngine->EnumerateChannels([=](FSoundChan* channel)
{ {
if (channel->SourceType == SOURCE_Actor && channel->Source == pSprite && (a2 < 0 || a2 == channel->EntChannel) && (a3 < 0 || sid == channel->OrgID)) if (channel->SourceType == SOURCE_Actor && channel->Source == pActor && (a2 < 0 || a2 == channel->EntChannel) && (a3 < 0 || sid == channel->OrgID))
{ {
soundEngine->StopChannel(channel); soundEngine->StopChannel(channel);
} }

View file

@ -51,9 +51,9 @@ void sndTerm(void);
void sndInit(void); void sndInit(void);
void sfxPlay3DSound(int x, int y, int z, int soundId, sectortype* pSector); void sfxPlay3DSound(int x, int y, int z, int soundId, sectortype* pSector);
void sfxPlay3DSound(spritetype *pSprite, int soundId, int a3 = -1, int a4 = 0); void sfxPlay3DSound(DBloodActor *pSprite, int soundId, int a3 = -1, int a4 = 0);
void sfxPlay3DSoundCP(spritetype* pSprite, int soundId, int a3 = -1, int a4 = 0, int pitch = 0, int volume = 0); void sfxPlay3DSoundCP(DBloodActor* pSprite, int soundId, int a3 = -1, int a4 = 0, int pitch = 0, int volume = 0);
void sfxKill3DSound(spritetype *pSprite, int a2 = -1, int a3 = -1); void sfxKill3DSound(DBloodActor *pSprite, int a2 = -1, int a3 = -1);
void sfxKillAllSounds(void); void sfxKillAllSounds(void);
void sfxSetReverb(bool toggle); void sfxSetReverb(bool toggle);
void sfxSetReverb2(bool toggle); void sfxSetReverb2(bool toggle);

View file

@ -361,12 +361,12 @@ void OperateSprite(DBloodActor* actor, EVENT event)
case kCmdOff: case kCmdOff:
if (!SetSpriteState(actor, 0)) break; if (!SetSpriteState(actor, 0)) break;
seqSpawn(40, actor, -1); seqSpawn(40, actor, -1);
sfxKill3DSound(pSprite, 0, -1); sfxKill3DSound(actor, 0, -1);
break; break;
case kCmdOn: case kCmdOn:
if (!SetSpriteState(actor, 1)) break; if (!SetSpriteState(actor, 1)) break;
seqSpawn(38, actor, -1); seqSpawn(38, actor, -1);
sfxPlay3DSound(pSprite, 441, 0, 0); sfxPlay3DSound(actor, 441, 0, 0);
break; break;
} }
break; break;
@ -389,16 +389,16 @@ void OperateSprite(DBloodActor* actor, EVENT event)
switch (event.cmd) { switch (event.cmd) {
case kCmdOff: case kCmdOff:
if (!SetSpriteState(actor, 0)) break; if (!SetSpriteState(actor, 0)) break;
sfxPlay3DSound(pSprite, pXSprite->data2, 0, 0); sfxPlay3DSound(actor, pXSprite->data2, 0, 0);
break; break;
case kCmdOn: case kCmdOn:
if (!SetSpriteState(actor, 1)) break; if (!SetSpriteState(actor, 1)) break;
sfxPlay3DSound(pSprite, pXSprite->data1, 0, 0); sfxPlay3DSound(actor, pXSprite->data1, 0, 0);
break; break;
default: default:
if (!SetSpriteState(actor, pXSprite->state ^ 1)) break; if (!SetSpriteState(actor, pXSprite->state ^ 1)) break;
if (pXSprite->state) sfxPlay3DSound(pSprite, pXSprite->data1, 0, 0); if (pXSprite->state) sfxPlay3DSound(actor, pXSprite->data1, 0, 0);
else sfxPlay3DSound(pSprite, pXSprite->data2, 0, 0); else sfxPlay3DSound(actor, pXSprite->data2, 0, 0);
break; break;
} }
break; break;
@ -406,16 +406,16 @@ void OperateSprite(DBloodActor* actor, EVENT event)
switch (event.cmd) { switch (event.cmd) {
case kCmdOff: case kCmdOff:
if (!SetSpriteState(actor, 0)) break; if (!SetSpriteState(actor, 0)) break;
sfxPlay3DSound(pSprite, pXSprite->data2, 0, 0); sfxPlay3DSound(actor, pXSprite->data2, 0, 0);
break; break;
case kCmdOn: case kCmdOn:
if (!SetSpriteState(actor, 1)) break; if (!SetSpriteState(actor, 1)) break;
sfxPlay3DSound(pSprite, pXSprite->data1, 0, 0); sfxPlay3DSound(actor, pXSprite->data1, 0, 0);
break; break;
default: default:
if (!SetSpriteState(actor, pXSprite->restState ^ 1)) break; if (!SetSpriteState(actor, pXSprite->restState ^ 1)) break;
if (pXSprite->state) sfxPlay3DSound(pSprite, pXSprite->data1, 0, 0); if (pXSprite->state) sfxPlay3DSound(actor, pXSprite->data1, 0, 0);
else sfxPlay3DSound(pSprite, pXSprite->data2, 0, 0); else sfxPlay3DSound(actor, pXSprite->data2, 0, 0);
break; break;
} }
break; break;
@ -433,7 +433,7 @@ void OperateSprite(DBloodActor* actor, EVENT event)
break; break;
} }
sfxPlay3DSound(pSprite, pXSprite->data4, -1, 0); sfxPlay3DSound(actor, pXSprite->data4, -1, 0);
if (pXSprite->command == kCmdLink && pXSprite->txID > 0) if (pXSprite->command == kCmdLink && pXSprite->txID > 0)
evSendActor(actor, pXSprite->txID, kCmdLink); evSendActor(actor, pXSprite->txID, kCmdLink);
@ -505,7 +505,7 @@ void OperateSprite(DBloodActor* actor, EVENT event)
if (pSprite->statnum != kStatRespawn) { if (pSprite->statnum != kStatRespawn) {
if (event.cmd != kCmdOn) actExplodeSprite(actor); if (event.cmd != kCmdOn) actExplodeSprite(actor);
else { else {
sfxPlay3DSound(pSprite, 454, 0, 0); sfxPlay3DSound(actor, 454, 0, 0);
evPostActor(actor, 18, kCmdOff); evPostActor(actor, 18, kCmdOff);
} }
} }
@ -515,12 +515,12 @@ void OperateSprite(DBloodActor* actor, EVENT event)
switch (event.cmd) { switch (event.cmd) {
case kCmdSpriteProximity: case kCmdSpriteProximity:
if (pXSprite->state) break; if (pXSprite->state) break;
sfxPlay3DSound(pSprite, 452, 0, 0); sfxPlay3DSound(actor, 452, 0, 0);
evPostActor(actor, 30, kCmdOff); evPostActor(actor, 30, kCmdOff);
pXSprite->state = 1; pXSprite->state = 1;
[[fallthrough]]; [[fallthrough]];
case kCmdOn: case kCmdOn:
sfxPlay3DSound(pSprite, 451, 0, 0); sfxPlay3DSound(actor, 451, 0, 0);
pXSprite->Proximity = 1; pXSprite->Proximity = 1;
break; break;
default: default:
@ -712,12 +712,12 @@ void SectorStartSound(sectortype* pSector, int nState)
if (nState) if (nState)
{ {
if (pXSprite->data3) if (pXSprite->data3)
sfxPlay3DSound(pSprite, pXSprite->data3, 0, 0); sfxPlay3DSound(actor, pXSprite->data3, 0, 0);
} }
else else
{ {
if (pXSprite->data1) if (pXSprite->data1)
sfxPlay3DSound(pSprite, pXSprite->data1, 0, 0); sfxPlay3DSound(actor, pXSprite->data1, 0, 0);
} }
} }
} }
@ -735,12 +735,12 @@ void SectorEndSound(sectortype* pSector, int nState)
if (nState) if (nState)
{ {
if (pXSprite->data2) if (pXSprite->data2)
sfxPlay3DSound(pSprite, pXSprite->data2, 0, 0); sfxPlay3DSound(actor, pXSprite->data2, 0, 0);
} }
else else
{ {
if (pXSprite->data4) if (pXSprite->data4)
sfxPlay3DSound(pSprite, pXSprite->data4, 0, 0); sfxPlay3DSound(actor, pXSprite->data4, 0, 0);
} }
} }
} }
@ -1393,9 +1393,9 @@ void OperateTeleport(sectortype* pSector)
{ {
assert(pSector); assert(pSector);
auto pXSector = &pSector->xs(); auto pXSector = &pSector->xs();
auto nDest = pXSector->marker0; auto destactor = pXSector->marker0;
assert(nDest != nullptr); assert(destactor != nullptr);
spritetype *pDest = &nDest->s(); spritetype *pDest = &destactor->s();
assert(pDest->statnum == kStatMarker); assert(pDest->statnum == kStatMarker);
assert(pDest->type == kMarkerWarpDest); assert(pDest->type == kMarkerWarpDest);
assert(pDest->insector()); assert(pDest->insector());
@ -1422,7 +1422,7 @@ void OperateTeleport(sectortype* pSector)
pSprite->z += pDest->sector()->floorz - pSector->floorz; pSprite->z += pDest->sector()->floorz - pSector->floorz;
pSprite->ang = pDest->ang; pSprite->ang = pDest->ang;
ChangeActorSect(actor, pDest->sector()); ChangeActorSect(actor, pDest->sector());
sfxPlay3DSound(pDest, 201, -1, 0); sfxPlay3DSound(destactor, 201, -1, 0);
actor->xvel = actor->yvel = actor->zvel = 0; actor->xvel = actor->yvel = actor->zvel = 0;
actor->interpolated = false; actor->interpolated = false;
viewBackupSpriteLoc(actor); viewBackupSpriteLoc(actor);
@ -2177,7 +2177,7 @@ void ActivateGenerator(DBloodActor* actor)
break; break;
} }
case kGenSound: case kGenSound:
sfxPlay3DSound(pSprite, pXSprite->data2, -1, 0); sfxPlay3DSound(actor, pXSprite->data2, -1, 0);
break; break;
case kGenMissileFireball: case kGenMissileFireball:
switch (pXSprite->data2) { switch (pXSprite->data2) {
@ -2230,7 +2230,7 @@ void MGunFireSeqCallback(int, DBloodActor* actor)
int dy = bsin(pSprite->ang)+Random2(1000); int dy = bsin(pSprite->ang)+Random2(1000);
int dz = Random2(1000); int dz = Random2(1000);
actFireVector(actor, 0, 0, dx, dy, dz, kVectorBullet); actFireVector(actor, 0, 0, dx, dy, dz, kVectorBullet);
sfxPlay3DSound(pSprite, 359, -1, 0); sfxPlay3DSound(actor, 359, -1, 0);
} }
} }

View file

@ -666,7 +666,7 @@ void WeaponLower(PLAYER *pPlayer)
StartQAV(pPlayer, kQAVFORKDOWN); StartQAV(pPlayer, kQAVFORKDOWN);
break; break;
case kWeapSpraycan: case kWeapSpraycan:
sfxKill3DSound(pPlayer->pSprite, -1, 441); sfxKill3DSound(pPlayer->actor, -1, 441);
switch (prevState) switch (prevState)
{ {
case 1: case 1:
@ -886,7 +886,7 @@ void WeaponUpdateState(PLAYER *pPlayer)
pPlayer->weaponState = 1; pPlayer->weaponState = 1;
StartQAV(pPlayer, kQAVCANDOWN); StartQAV(pPlayer, kQAVCANDOWN);
} }
sfxKill3DSound(pPlayer->pSprite, -1, 441); sfxKill3DSound(pPlayer->actor, -1, 441);
break; break;
} }
break; break;
@ -965,7 +965,7 @@ void WeaponUpdateState(PLAYER *pPlayer)
case 1: case 1:
if (CheckAmmo(pPlayer, 2, 1)) if (CheckAmmo(pPlayer, 2, 1))
{ {
sfxPlay3DSound(pPlayer->pSprite, 410, 3, 2); sfxPlay3DSound(pPlayer->actor, 410, 3, 2);
StartQAV(pPlayer, kQAVSHOTL1, nClientEjectShell); StartQAV(pPlayer, kQAVSHOTL1, nClientEjectShell);
if (gInfiniteAmmo || pPlayer->ammoCount[2] > 1) if (gInfiniteAmmo || pPlayer->ammoCount[2] > 1)
pPlayer->weaponState = 3; pPlayer->weaponState = 3;
@ -1073,16 +1073,16 @@ void FireSpray(int, PLAYER *pPlayer)
playerFireMissile(pPlayer, 0, pPlayer->aim.dx, pPlayer->aim.dy, pPlayer->aim.dz, kMissileFlameSpray); playerFireMissile(pPlayer, 0, pPlayer->aim.dx, pPlayer->aim.dy, pPlayer->aim.dz, kMissileFlameSpray);
UseAmmo(pPlayer, 6, 4); UseAmmo(pPlayer, 6, 4);
if (CheckAmmo(pPlayer, 6, 1)) if (CheckAmmo(pPlayer, 6, 1))
sfxPlay3DSound(pPlayer->pSprite, 441, 1, 2); sfxPlay3DSound(pPlayer->actor, 441, 1, 2);
else else
sfxKill3DSound(pPlayer->pSprite, -1, 441); sfxKill3DSound(pPlayer->actor, -1, 441);
} }
void ThrowCan(int, PLAYER *pPlayer) void ThrowCan(int, PLAYER *pPlayer)
{ {
sfxKill3DSound(pPlayer->pSprite, -1, 441); sfxKill3DSound(pPlayer->actor, -1, 441);
int nSpeed = MulScale(pPlayer->throwPower, 0x177777, 16)+0x66666; int nSpeed = MulScale(pPlayer->throwPower, 0x177777, 16)+0x66666;
sfxPlay3DSound(pPlayer->pSprite, 455, 1, 0); sfxPlay3DSound(pPlayer->actor, 455, 1, 0);
auto spawned = playerFireThing(pPlayer, 0, -9460, kThingArmedSpray, nSpeed); auto spawned = playerFireThing(pPlayer, 0, -9460, kThingArmedSpray, nSpeed);
if (spawned) if (spawned)
{ {
@ -1096,7 +1096,7 @@ void ThrowCan(int, PLAYER *pPlayer)
void DropCan(int, PLAYER *pPlayer) void DropCan(int, PLAYER *pPlayer)
{ {
sfxKill3DSound(pPlayer->pSprite, -1, 441); sfxKill3DSound(pPlayer->actor, -1, 441);
auto spawned = playerFireThing(pPlayer, 0, 0, kThingArmedSpray, 0); auto spawned = playerFireThing(pPlayer, 0, 0, kThingArmedSpray, 0);
if (spawned) if (spawned)
{ {
@ -1107,7 +1107,7 @@ void DropCan(int, PLAYER *pPlayer)
void ExplodeCan(int, PLAYER *pPlayer) void ExplodeCan(int, PLAYER *pPlayer)
{ {
sfxKill3DSound(pPlayer->pSprite, -1, 441); sfxKill3DSound(pPlayer->actor, -1, 441);
auto spawned = playerFireThing(pPlayer, 0, 0, kThingArmedSpray, 0); auto spawned = playerFireThing(pPlayer, 0, 0, kThingArmedSpray, 0);
if (spawned) if (spawned)
{ {
@ -1121,9 +1121,9 @@ void ExplodeCan(int, PLAYER *pPlayer)
void ThrowBundle(int, PLAYER *pPlayer) void ThrowBundle(int, PLAYER *pPlayer)
{ {
sfxKill3DSound(pPlayer->pSprite, 16, -1); sfxKill3DSound(pPlayer->actor, 16, -1);
int nSpeed = MulScale(pPlayer->throwPower, 0x177777, 16)+0x66666; int nSpeed = MulScale(pPlayer->throwPower, 0x177777, 16)+0x66666;
sfxPlay3DSound(pPlayer->pSprite, 455, 1, 0); sfxPlay3DSound(pPlayer->actor, 455, 1, 0);
auto spawned = playerFireThing(pPlayer, 0, -9460, kThingArmedTNTBundle, nSpeed); auto spawned = playerFireThing(pPlayer, 0, -9460, kThingArmedTNTBundle, nSpeed);
if (spawned) if (spawned)
{ {
@ -1138,7 +1138,7 @@ void ThrowBundle(int, PLAYER *pPlayer)
void DropBundle(int, PLAYER *pPlayer) void DropBundle(int, PLAYER *pPlayer)
{ {
sfxKill3DSound(pPlayer->pSprite, 16, -1); sfxKill3DSound(pPlayer->actor, 16, -1);
auto spawned = playerFireThing(pPlayer, 0, 0, kThingArmedTNTBundle, 0); auto spawned = playerFireThing(pPlayer, 0, 0, kThingArmedTNTBundle, 0);
if (spawned) if (spawned)
{ {
@ -1149,7 +1149,7 @@ void DropBundle(int, PLAYER *pPlayer)
void ExplodeBundle(int, PLAYER *pPlayer) void ExplodeBundle(int, PLAYER *pPlayer)
{ {
sfxKill3DSound(pPlayer->pSprite, 16, -1); sfxKill3DSound(pPlayer->actor, 16, -1);
auto spawned = playerFireThing(pPlayer, 0, 0, kThingArmedTNTBundle, 0); auto spawned = playerFireThing(pPlayer, 0, 0, kThingArmedTNTBundle, 0);
if (spawned) if (spawned)
{ {
@ -1164,7 +1164,7 @@ void ExplodeBundle(int, PLAYER *pPlayer)
void ThrowProx(int, PLAYER *pPlayer) void ThrowProx(int, PLAYER *pPlayer)
{ {
int nSpeed = MulScale(pPlayer->throwPower, 0x177777, 16)+0x66666; int nSpeed = MulScale(pPlayer->throwPower, 0x177777, 16)+0x66666;
sfxPlay3DSound(pPlayer->pSprite, 455, 1, 0); sfxPlay3DSound(pPlayer->actor, 455, 1, 0);
auto spawned = playerFireThing(pPlayer, 0, -9460, kThingArmedProxBomb, nSpeed); auto spawned = playerFireThing(pPlayer, 0, -9460, kThingArmedProxBomb, nSpeed);
if (spawned) if (spawned)
{ {
@ -1187,7 +1187,7 @@ void DropProx(int, PLAYER *pPlayer)
void ThrowRemote(int, PLAYER *pPlayer) void ThrowRemote(int, PLAYER *pPlayer)
{ {
int nSpeed = MulScale(pPlayer->throwPower, 0x177777, 16)+0x66666; int nSpeed = MulScale(pPlayer->throwPower, 0x177777, 16)+0x66666;
sfxPlay3DSound(pPlayer->pSprite, 455, 1, 0); sfxPlay3DSound(pPlayer->actor, 455, 1, 0);
auto spawned = playerFireThing(pPlayer, 0, -9460, kThingArmedRemoteBomb, nSpeed); auto spawned = playerFireThing(pPlayer, 0, -9460, kThingArmedRemoteBomb, nSpeed);
if (spawned) if (spawned)
{ {
@ -1220,13 +1220,13 @@ void FireShotgun(int nTrigger, PLAYER *pPlayer)
assert(nTrigger > 0 && nTrigger <= kMaxShotgunBarrels); assert(nTrigger > 0 && nTrigger <= kMaxShotgunBarrels);
if (nTrigger == 1) if (nTrigger == 1)
{ {
sfxPlay3DSound(pPlayer->pSprite, 411, 2, 0); sfxPlay3DSound(pPlayer->actor, 411, 2, 0);
pPlayer->tiltEffect = 30; pPlayer->tiltEffect = 30;
pPlayer->visibility = 20; pPlayer->visibility = 20;
} }
else else
{ {
sfxPlay3DSound(pPlayer->pSprite, 412, 2, 0); sfxPlay3DSound(pPlayer->actor, 412, 2, 0);
pPlayer->tiltEffect = 50; pPlayer->tiltEffect = 50;
pPlayer->visibility = 40; pPlayer->visibility = 40;
} }
@ -1265,7 +1265,7 @@ void FireTommy(int nTrigger, PLAYER *pPlayer)
{ {
auto actor = pPlayer->actor; auto actor = pPlayer->actor;
Aim *aim = &pPlayer->aim; Aim *aim = &pPlayer->aim;
sfxPlay3DSound(pPlayer->pSprite, 431, -1, 0); sfxPlay3DSound(pPlayer->actor, 431, -1, 0);
switch (nTrigger) switch (nTrigger)
{ {
case 1: case 1:
@ -1308,7 +1308,7 @@ void FireSpread(int nTrigger, PLAYER *pPlayer)
int angle = (getangle(aim->dx, aim->dy)+((112*(nTrigger-1))/14-56))&2047; int angle = (getangle(aim->dx, aim->dy)+((112*(nTrigger-1))/14-56))&2047;
int dx = bcos(angle); int dx = bcos(angle);
int dy = bsin(angle); int dy = bsin(angle);
sfxPlay3DSound(pPlayer->pSprite, 431, -1, 0); sfxPlay3DSound(pPlayer->actor, 431, -1, 0);
int r1, r2, r3; int r1, r2, r3;
r1 = Random3(300); r1 = Random3(300);
r2 = Random3(600); r2 = Random3(600);
@ -1330,7 +1330,7 @@ void AltFireSpread(int nTrigger, PLAYER *pPlayer)
int angle = (getangle(aim->dx, aim->dy)+((112*(nTrigger-1))/14-56))&2047; int angle = (getangle(aim->dx, aim->dy)+((112*(nTrigger-1))/14-56))&2047;
int dx = bcos(angle); int dx = bcos(angle);
int dy = bsin(angle); int dy = bsin(angle);
sfxPlay3DSound(pPlayer->pSprite, 431, -1, 0); sfxPlay3DSound(pPlayer->actor, 431, -1, 0);
int r1, r2, r3; int r1, r2, r3;
r1 = Random3(300); r1 = Random3(300);
r2 = Random3(600); r2 = Random3(600);
@ -1360,7 +1360,7 @@ void AltFireSpread2(int nTrigger, PLAYER *pPlayer)
int angle = (getangle(aim->dx, aim->dy)+((112*(nTrigger-1))/14-56))&2047; int angle = (getangle(aim->dx, aim->dy)+((112*(nTrigger-1))/14-56))&2047;
int dx = bcos(angle); int dx = bcos(angle);
int dy = bsin(angle); int dy = bsin(angle);
sfxPlay3DSound(pPlayer->pSprite, 431, -1, 0); sfxPlay3DSound(pPlayer->actor, 431, -1, 0);
if (powerupCheck(pPlayer, kPwUpTwoGuns) && checkAmmo2(pPlayer, 3, 2)) if (powerupCheck(pPlayer, kPwUpTwoGuns) && checkAmmo2(pPlayer, 3, 2))
{ {
int r1, r2, r3; int r1, r2, r3;
@ -1419,7 +1419,7 @@ void FireFlare(int nTrigger, PLAYER *pPlayer)
} }
playerFireMissile(pPlayer, offset, pPlayer->aim.dx, pPlayer->aim.dy, pPlayer->aim.dz, kMissileFlareRegular); playerFireMissile(pPlayer, offset, pPlayer->aim.dx, pPlayer->aim.dy, pPlayer->aim.dz, kMissileFlareRegular);
UseAmmo(pPlayer, 1, 1); UseAmmo(pPlayer, 1, 1);
sfxPlay3DSound(pSprite, 420, 2, 0); sfxPlay3DSound(pPlayer->actor, 420, 2, 0);
pPlayer->visibility = 30; pPlayer->visibility = 30;
pPlayer->flashEffect = 1; pPlayer->flashEffect = 1;
} }
@ -1439,7 +1439,7 @@ void AltFireFlare(int nTrigger, PLAYER *pPlayer)
} }
playerFireMissile(pPlayer, offset, pPlayer->aim.dx, pPlayer->aim.dy, pPlayer->aim.dz, kMissileFlareAlt); playerFireMissile(pPlayer, offset, pPlayer->aim.dx, pPlayer->aim.dy, pPlayer->aim.dz, kMissileFlareAlt);
UseAmmo(pPlayer, 1, 8); UseAmmo(pPlayer, 1, 8);
sfxPlay3DSound(pSprite, 420, 2, 0); sfxPlay3DSound(pPlayer->actor, 420, 2, 0);
pPlayer->visibility = 45; pPlayer->visibility = 45;
pPlayer->flashEffect = 1; pPlayer->flashEffect = 1;
} }
@ -1463,7 +1463,7 @@ void FireVoodoo(int nTrigger, PLAYER *pPlayer)
{ {
case 0: case 0:
{ {
sfxPlay3DSound(pSprite, 460, 2, 0); sfxPlay3DSound(actor, 460, 2, 0);
fxSpawnBlood(targetactor, 17<<4); fxSpawnBlood(targetactor, 17<<4);
int nDamage = actDamageSprite(actor, targetactor, kDamageSpirit, 17<<4); int nDamage = actDamageSprite(actor, targetactor, kDamageSpirit, 17<<4);
UseAmmo(pPlayer, 9, nDamage/4); UseAmmo(pPlayer, 9, nDamage/4);
@ -1471,7 +1471,7 @@ void FireVoodoo(int nTrigger, PLAYER *pPlayer)
} }
case 1: case 1:
{ {
sfxPlay3DSound(pSprite, 460, 2, 0); sfxPlay3DSound(actor, 460, 2, 0);
fxSpawnBlood(targetactor, 17<<4); fxSpawnBlood(targetactor, 17<<4);
int nDamage = actDamageSprite(actor, targetactor, kDamageSpirit, 9<<4); int nDamage = actDamageSprite(actor, targetactor, kDamageSpirit, 9<<4);
if (IsPlayerSprite(pTarget)) if (IsPlayerSprite(pTarget))
@ -1481,7 +1481,7 @@ void FireVoodoo(int nTrigger, PLAYER *pPlayer)
} }
case 3: case 3:
{ {
sfxPlay3DSound(pSprite, 463, 2, 0); sfxPlay3DSound(actor, 463, 2, 0);
fxSpawnBlood(targetactor, 17<<4); fxSpawnBlood(targetactor, 17<<4);
int nDamage = actDamageSprite(actor, targetactor, kDamageSpirit, 49<<4); int nDamage = actDamageSprite(actor, targetactor, kDamageSpirit, 49<<4);
UseAmmo(pPlayer, 9, nDamage/4); UseAmmo(pPlayer, 9, nDamage/4);
@ -1489,7 +1489,7 @@ void FireVoodoo(int nTrigger, PLAYER *pPlayer)
} }
case 2: case 2:
{ {
sfxPlay3DSound(pSprite, 460, 2, 0); sfxPlay3DSound(actor, 460, 2, 0);
fxSpawnBlood(targetactor, 17<<4); fxSpawnBlood(targetactor, 17<<4);
int nDamage = actDamageSprite(actor, targetactor, kDamageSpirit, 11<<4); int nDamage = actDamageSprite(actor, targetactor, kDamageSpirit, 11<<4);
if (IsPlayerSprite(pTarget)) if (IsPlayerSprite(pTarget))
@ -1585,7 +1585,7 @@ void AltFireVoodoo(int nTrigger, PLAYER *pPlayer)
void DropVoodoo(int , PLAYER *pPlayer) void DropVoodoo(int , PLAYER *pPlayer)
{ {
sfxPlay3DSound(pPlayer->pSprite, 455, 2, 0); sfxPlay3DSound(pPlayer->actor, 455, 2, 0);
auto spawned = playerFireThing(pPlayer, 0, -4730, kThingVoodooHead, 0xccccc); auto spawned = playerFireThing(pPlayer, 0, -4730, kThingVoodooHead, 0xccccc);
if (spawned) if (spawned)
{ {
@ -1636,7 +1636,7 @@ void FireTesla(int nTrigger, PLAYER *pPlayer)
} }
playerFireMissile(pPlayer, pMissile->offset, pPlayer->aim.dx, pPlayer->aim.dy, pPlayer->aim.dz, pMissile->id); playerFireMissile(pPlayer, pMissile->offset, pPlayer->aim.dx, pPlayer->aim.dy, pPlayer->aim.dz, pMissile->id);
UseAmmo(pPlayer, 7, pMissile->ammouse); UseAmmo(pPlayer, 7, pMissile->ammouse);
sfxPlay3DSound(pSprite, pMissile->sound, 1, 0); sfxPlay3DSound(pPlayer->actor, pMissile->sound, 1, 0);
pPlayer->visibility = pMissile->light; pPlayer->visibility = pMissile->light;
pPlayer->flashEffect = pMissile->flash; pPlayer->flashEffect = pMissile->flash;
} }
@ -1647,7 +1647,7 @@ void AltFireTesla(int , PLAYER *pPlayer)
spritetype *pSprite = pPlayer->pSprite; spritetype *pSprite = pPlayer->pSprite;
playerFireMissile(pPlayer, 0, pPlayer->aim.dx, pPlayer->aim.dy, pPlayer->aim.dz, kMissileTeslaAlt); playerFireMissile(pPlayer, 0, pPlayer->aim.dx, pPlayer->aim.dy, pPlayer->aim.dz, kMissileTeslaAlt);
UseAmmo(pPlayer, pPlayer->weaponAmmo, 35); UseAmmo(pPlayer, pPlayer->weaponAmmo, 35);
sfxPlay3DSound(pSprite, 471, 2, 0); sfxPlay3DSound(pPlayer->actor, 471, 2, 0);
pPlayer->visibility = 40; pPlayer->visibility = 40;
pPlayer->flashEffect = 1; pPlayer->flashEffect = 1;
} }
@ -1666,7 +1666,7 @@ void FireNapalm(int nTrigger, PLAYER *pPlayer)
break; break;
} }
playerFireMissile(pPlayer, offset, pPlayer->aim.dx, pPlayer->aim.dy, pPlayer->aim.dz, kMissileFireballNapalm); playerFireMissile(pPlayer, offset, pPlayer->aim.dx, pPlayer->aim.dy, pPlayer->aim.dz, kMissileFireballNapalm);
sfxPlay3DSound(pSprite, 480, 2, 0); sfxPlay3DSound(pPlayer->actor, 480, 2, 0);
UseAmmo(pPlayer, 4, 1); UseAmmo(pPlayer, 4, 1);
pPlayer->flashEffect = 1; pPlayer->flashEffect = 1;
} }
@ -1676,7 +1676,7 @@ void FireNapalm2(int , PLAYER *pPlayer)
spritetype *pSprite = pPlayer->pSprite; spritetype *pSprite = pPlayer->pSprite;
playerFireMissile(pPlayer, -120, pPlayer->aim.dx, pPlayer->aim.dy, pPlayer->aim.dz, kMissileFireballNapalm); playerFireMissile(pPlayer, -120, pPlayer->aim.dx, pPlayer->aim.dy, pPlayer->aim.dz, kMissileFireballNapalm);
playerFireMissile(pPlayer, 120, pPlayer->aim.dx, pPlayer->aim.dy, pPlayer->aim.dz, kMissileFireballNapalm); playerFireMissile(pPlayer, 120, pPlayer->aim.dx, pPlayer->aim.dy, pPlayer->aim.dz, kMissileFireballNapalm);
sfxPlay3DSound(pSprite, 480, 2, 0); sfxPlay3DSound(pPlayer->actor, 480, 2, 0);
UseAmmo(pPlayer, 4, 2); UseAmmo(pPlayer, 4, 2);
pPlayer->flashEffect = 1; pPlayer->flashEffect = 1;
} }
@ -1723,7 +1723,7 @@ void FireLifeLeech(int nTrigger, PLAYER *pPlayer)
void AltFireLifeLeech(int , PLAYER *pPlayer) void AltFireLifeLeech(int , PLAYER *pPlayer)
{ {
auto actor = pPlayer->actor; auto actor = pPlayer->actor;
sfxPlay3DSound(pPlayer->pSprite, 455, 2, 0); sfxPlay3DSound(pPlayer->actor, 455, 2, 0);
auto missile = playerFireThing(pPlayer, 0, -4730, kThingDroppedLifeLeech, 0x19999); auto missile = playerFireThing(pPlayer, 0, -4730, kThingDroppedLifeLeech, 0x19999);
if (missile) if (missile)
{ {
@ -2048,7 +2048,7 @@ void WeaponProcess(PLAYER *pPlayer) {
if (pPlayer->pXSprite->health == 0) if (pPlayer->pXSprite->health == 0)
{ {
pPlayer->qavLoop = 0; pPlayer->qavLoop = 0;
sfxKill3DSound(pPlayer->pSprite, 1, -1); sfxKill3DSound(pPlayer->actor, 1, -1);
} }
if (pPlayer->isUnderwater && BannedUnderwater(pPlayer->curWeapon)) if (pPlayer->isUnderwater && BannedUnderwater(pPlayer->curWeapon))
{ {
@ -2135,7 +2135,7 @@ void WeaponProcess(PLAYER *pPlayer) {
{ {
if (pPlayer->nextWeapon) if (pPlayer->nextWeapon)
{ {
sfxKill3DSound(pPlayer->pSprite, -1, 441); sfxKill3DSound(pPlayer->actor, -1, 441);
pPlayer->weaponState = 0; pPlayer->weaponState = 0;
pPlayer->newWeapon = pPlayer->nextWeapon; pPlayer->newWeapon = pPlayer->nextWeapon;
pPlayer->nextWeapon = kWeapNone; pPlayer->nextWeapon = kWeapNone;
@ -2221,7 +2221,7 @@ void WeaponProcess(PLAYER *pPlayer) {
{ {
if (pPlayer->nextWeapon) if (pPlayer->nextWeapon)
{ {
sfxKill3DSound(pPlayer->pSprite, -1, 441); sfxKill3DSound(pPlayer->actor, -1, 441);
pPlayer->newWeapon = pPlayer->nextWeapon; pPlayer->newWeapon = pPlayer->nextWeapon;
pPlayer->nextWeapon = kWeapNone; pPlayer->nextWeapon = kWeapNone;
} }
@ -2489,7 +2489,7 @@ void WeaponProcess(PLAYER *pPlayer) {
StartQAV(pPlayer, kQAVNAPFIRE, nClientFireNapalm); StartQAV(pPlayer, kQAVNAPFIRE, nClientFireNapalm);
return; return;
case kWeapLifeLeech: case kWeapLifeLeech:
sfxPlay3DSound(pPlayer->pSprite, 494, 2, 0); sfxPlay3DSound(pPlayer->actor, 494, 2, 0);
StartQAV(pPlayer, kQAVSTAFIRE4, nClientFireLifeLeech); StartQAV(pPlayer, kQAVSTAFIRE4, nClientFireLifeLeech);
return; return;
case kWeapBeast: case kWeapBeast:
@ -2586,7 +2586,7 @@ void WeaponProcess(PLAYER *pPlayer) {
StartQAV(pPlayer, kQAVTOMSPRED, nClientAltFireSpread2); StartQAV(pPlayer, kQAVTOMSPRED, nClientAltFireSpread2);
return; return;
case kWeapVoodooDoll: case kWeapVoodooDoll:
sfxPlay3DSound(pPlayer->pSprite, 461, 2, 0); sfxPlay3DSound(pPlayer->actor, 461, 2, 0);
StartQAV(pPlayer, kQAVVDSPEL1, nClientAltFireVoodoo); StartQAV(pPlayer, kQAVVDSPEL1, nClientAltFireVoodoo);
return; return;
#if 0 #if 0
@ -2640,7 +2640,7 @@ void WeaponProcess(PLAYER *pPlayer) {
case kWeapLifeLeech: case kWeapLifeLeech:
if (gGameOptions.nGameType <= 1 && !checkAmmo2(pPlayer, 8, 1) && pPlayer->pXSprite->health < (25 << 4)) if (gGameOptions.nGameType <= 1 && !checkAmmo2(pPlayer, 8, 1) && pPlayer->pXSprite->health < (25 << 4))
{ {
sfxPlay3DSound(pPlayer->pSprite, 494, 2, 0); sfxPlay3DSound(pPlayer->actor, 494, 2, 0);
StartQAV(pPlayer, kQAVSTAFIRE4, nClientFireLifeLeech); StartQAV(pPlayer, kQAVSTAFIRE4, nClientFireLifeLeech);
} }
else else

View file

@ -92,7 +92,7 @@ void MuteSounds()
}); });
} }
class DukeSoundEngine : public SoundEngine class DukeSoundEngine : public RazeSoundEngine
{ {
// client specific parts of the sound engine go in this class. // client specific parts of the sound engine go in this class.
void CalcPosVel(int type, const void* source, const float pt[3], int channum, int chanflags, FSoundID chanSound, FVector3* pos, FVector3* vel, FSoundChan* chan) override; void CalcPosVel(int type, const void* source, const float pt[3], int channum, int chanflags, FSoundID chanSound, FVector3* pos, FVector3* vel, FSoundChan* chan) override;

View file

@ -134,7 +134,7 @@ int nLocalChan = 0;
// //
//========================================================================== //==========================================================================
class EXSoundEngine : public SoundEngine class EXSoundEngine : public RazeSoundEngine
{ {
// client specific parts of the sound engine go in this class. // client specific parts of the sound engine go in this class.
void CalcPosVel(int type, const void* source, const float pt[3], int channum, int chanflags, FSoundID chanSound, FVector3* pos, FVector3* vel, FSoundChan* chan) override; void CalcPosVel(int type, const void* source, const float pt[3], int channum, int chanflags, FSoundID chanSound, FVector3* pos, FVector3* vel, FSoundChan* chan) override;

View file

@ -416,7 +416,7 @@ static void UpdateAmbients()
// //
//========================================================================== //==========================================================================
class SWSoundEngine : public SoundEngine class SWSoundEngine : public RazeSoundEngine
{ {
// client specific parts of the sound engine go in this class. // client specific parts of the sound engine go in this class.
void CalcPosVel(int type, const void* source, const float pt[3], int channum, int chanflags, FSoundID chanSound, FVector3* pos, FVector3* vel, FSoundChan* chan) override; void CalcPosVel(int type, const void* source, const float pt[3], int channum, int chanflags, FSoundID chanSound, FVector3* pos, FVector3* vel, FSoundChan* chan) override;
@ -430,10 +430,14 @@ public:
S_Rolloff.MaxDistance = 1187; S_Rolloff.MaxDistance = 1187;
} }
bool SourceIsActor(FSoundChan* chan) override
{
return chan->SourceType == SOURCE_Actor || chan->SourceType == SOURCE_Unattached;
}
int SoundSourceIndex(FSoundChan* chan) override int SoundSourceIndex(FSoundChan* chan) override
{ {
if (chan->SourceType == SOURCE_Player) return int(PLAYERp(chan->Source) - Player); if (chan->SourceType == SOURCE_Player) return int(PLAYERp(chan->Source) - Player);
if (chan->SourceType == SOURCE_Unattached && chan->Source) return int(SPRITEp(chan->Source) - sprite);
return 0; return 0;
} }
@ -444,10 +448,6 @@ public:
if (index < 0 || index >= MAX_SW_PLAYERS_REG) index = 0; if (index < 0 || index >= MAX_SW_PLAYERS_REG) index = 0;
chan->Source = &Player[index]; chan->Source = &Player[index];
} }
else if (chan->SourceType == SOURCE_Unattached && index >= 0)
{
chan->Source = &sprite[index];
}
else chan->Source = nullptr; else chan->Source = nullptr;
} }