diff --git a/src/game/magic/Spell.h b/src/game/magic/Spell.h index 0c51103fa7..366a6e26a9 100644 --- a/src/game/magic/Spell.h +++ b/src/game/magic/Spell.h @@ -159,6 +159,10 @@ class alignas(16) Spell { m_duration = 0; } + bool emitsSound() { + return (m_flags & SPELLCAST_FLAG_NOSOUND) == 0; + } + [[nodiscard]] std::string_view className() const noexcept; [[nodiscard]] std::string idString() const noexcept; diff --git a/src/game/magic/spells/SpellsLvl01.cpp b/src/game/magic/spells/SpellsLvl01.cpp index d3c9f78c67..224659bd88 100644 --- a/src/game/magic/spells/SpellsLvl01.cpp +++ b/src/game/magic/spells/SpellsLvl01.cpp @@ -56,11 +56,15 @@ void MagicSightSpell::Launch() { m_hasDuration = m_launchDuration >= 0; m_duration = m_hasDuration ? m_launchDuration : 0; - ARX_SOUND_PlaySFX(g_snd.SPELL_VISION_START, &m_caster_pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_VISION_START, &m_caster_pos); + } if(m_caster == EntityHandle_Player) { player.m_improve = true; - m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_VISION_LOOP, &m_caster_pos, 1.f); + if(emitsSound()) { + m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_VISION_LOOP, &m_caster_pos, 1.f); + } } } @@ -70,24 +74,26 @@ void MagicSightSpell::End() { player.m_improve = false; } - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); - - Entity * caster = entities.get(m_caster); - if(caster) { - ARX_SOUND_PlaySFX(g_snd.SPELL_VISION_START, &caster->pos); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + + Entity * caster = entities.get(m_caster); + if(caster) { + ARX_SOUND_PlaySFX(g_snd.SPELL_VISION_START, &caster->pos); + } } } void MagicSightSpell::Update() { - if(m_caster == EntityHandle_Player) { + if(emitsSound() && m_caster == EntityHandle_Player) { Vec3f pos = ARX_PLAYER_FrontPos(); ARX_SOUND_RefreshPosition(m_snd_loop, pos); } } -static void LaunchMagicMissileExplosion(const Vec3f & _ePos, bool mrCheat) { +static void LaunchMagicMissileExplosion(const Vec3f & _ePos, bool mrCheat, bool emitsSound) { std::unique_ptr particles = std::make_unique(); if(mrCheat) { @@ -112,7 +118,9 @@ static void LaunchMagicMissileExplosion(const Vec3f & _ePos, bool mrCheat) { light->duration = 1500ms; } - ARX_SOUND_PlaySFX(g_snd.SPELL_MM_HIT, &_ePos); + if(emitsSound) { + ARX_SOUND_PlaySFX(g_snd.SPELL_MM_HIT, &_ePos); + } } @@ -223,9 +231,11 @@ void MagicMissileSpell::Launch() { missile.SetDuration(lTime); } - ARX_SOUND_PlaySFX(g_snd.SPELL_MM_CREATE, &startPos); - ARX_SOUND_PlaySFX(g_snd.SPELL_MM_LAUNCH, &startPos); - snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_MM_LOOP, &startPos, 1.f); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_MM_CREATE, &startPos); + ARX_SOUND_PlaySFX(g_snd.SPELL_MM_LAUNCH, &startPos); + snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_MM_LOOP, &startPos, 1.f); + } m_duration = lMax + 1s; } @@ -238,8 +248,10 @@ void MagicMissileSpell::End() { m_missiles.clear(); - ARX_SOUND_Stop(snd_loop); - snd_loop = audio::SourcedSample(); + if(emitsSound()) { + ARX_SOUND_Stop(snd_loop); + snd_loop = audio::SourcedSample(); + } } void MagicMissileSpell::Update() { @@ -255,7 +267,7 @@ void MagicMissileSpell::Update() { Entity * caster = entities.get(m_caster); if(CheckAnythingInSphere(sphere, caster, CAS_NO_SAME_GROUP)) { - LaunchMagicMissileExplosion(missile.eCurPos, m_mrCheat); + LaunchMagicMissileExplosion(missile.eCurPos, m_mrCheat, emitsSound()); if(caster) { spawnAudibleSound(missile.eCurPos, *caster); } @@ -287,7 +299,10 @@ void MagicMissileSpell::Update() { } averageMissilePos /= float(m_missiles.size()); - ARX_SOUND_RefreshPosition(snd_loop, averageMissilePos); + + if(emitsSound()) { + ARX_SOUND_RefreshPosition(snd_loop, averageMissilePos); + } arx_assert(m_lights.size() == m_missiles.size()); @@ -399,7 +414,9 @@ void IgnitSpell::End() { for(T_LINKLIGHTTOFX & entry : m_lights) { EERIE_LIGHT * light = &g_staticLights[entry.m_targetLight]; light->m_ignitionStatus = true; - ARX_SOUND_PlaySFX(g_snd.SPELL_IGNITE, &light->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_IGNITE, &light->pos); + } lightHandleDestroy(entry.m_effectLight); } @@ -502,7 +519,9 @@ void DouseSpell::End() { for(size_t index : m_lights) { EERIE_LIGHT * light = &g_staticLights[index]; light->m_ignitionStatus = false; - ARX_SOUND_PlaySFX(g_snd.SPELL_DOUSE, &light->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_DOUSE, &light->pos); + } } } @@ -513,7 +532,9 @@ void DouseSpell::Update() { void ActivatePortalSpell::Launch() { - ARX_SOUND_PlayInterface(g_snd.SPELL_ACTIVATE_PORTAL); + if(emitsSound()) { + ARX_SOUND_PlayInterface(g_snd.SPELL_ACTIVATE_PORTAL); + } m_duration = 20ms; m_hasDuration = true; diff --git a/src/game/magic/spells/SpellsLvl02.cpp b/src/game/magic/spells/SpellsLvl02.cpp index 544077a535..d959f9640a 100644 --- a/src/game/magic/spells/SpellsLvl02.cpp +++ b/src/game/magic/spells/SpellsLvl02.cpp @@ -47,7 +47,7 @@ bool HealSpell::CanLaunch() { void HealSpell::Launch() { - if(!(m_flags & SPELLCAST_FLAG_NOSOUND)) { + if(emitsSound()) { ARX_SOUND_PlaySFX(g_snd.SPELL_HEALING, &m_caster_pos); } @@ -148,7 +148,7 @@ void DetectTrapSpell::Launch() { if(m_caster == EntityHandle_Player) { m_target = m_caster; - if(!(m_flags & SPELLCAST_FLAG_NOSOUND)) { + if(emitsSound()) { ARX_SOUND_PlayInterface(g_snd.SPELL_DETECT_TRAP); m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_DETECT_TRAP_LOOP, &m_caster_pos, 1.f); } @@ -163,15 +163,17 @@ void DetectTrapSpell::Launch() { void DetectTrapSpell::End() { - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + } m_targets.clear(); } void DetectTrapSpell::Update() { - if(m_caster == EntityHandle_Player) { + if(emitsSound() && m_caster == EntityHandle_Player) { Vec3f pos = ARX_PLAYER_FrontPos(); ARX_SOUND_RefreshPosition(m_snd_loop, pos); } @@ -189,12 +191,11 @@ void ArmorSpell::Launch() m_target = m_caster; } - if(!(m_flags & SPELLCAST_FLAG_NOSOUND)) { + if(emitsSound()) { ARX_SOUND_PlaySFX(g_snd.SPELL_ARMOR_START, &entities[m_target]->pos); + m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_ARMOR_LOOP, &entities[m_target]->pos, 1.f); } - m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_ARMOR_LOOP, &entities[m_target]->pos, 1.f); - if(m_caster == EntityHandle_Player) { m_duration = 0; m_hasDuration = false; @@ -217,12 +218,16 @@ void ArmorSpell::Launch() void ArmorSpell::End() { - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + } Entity * target = entities.get(m_target); if(target) { - ARX_SOUND_PlaySFX(g_snd.SPELL_ARMOR_END, &target->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_ARMOR_END, &target->pos); + } ARX_HALO_SetToNative(target); } @@ -238,7 +243,9 @@ void ArmorSpell::Update() { io->halo.radius = 45.f; } - ARX_SOUND_RefreshPosition(m_snd_loop, entities[m_target]->pos); + if(emitsSound()) { + ARX_SOUND_RefreshPosition(m_snd_loop, entities[m_target]->pos); + } } Vec3f ArmorSpell::getPosition() const { @@ -258,7 +265,7 @@ void LowerArmorSpell::Launch() { spells.endByCaster(m_caster, SPELL_FIRE_PROTECTION); spells.endByCaster(m_caster, SPELL_COLD_PROTECTION); - if(!(m_flags & SPELLCAST_FLAG_NOSOUND)) { + if(emitsSound()) { ARX_SOUND_PlaySFX(g_snd.SPELL_LOWER_ARMOR, &entities[m_target]->pos); } @@ -290,7 +297,9 @@ void LowerArmorSpell::Launch() { void LowerArmorSpell::End() { - ARX_SOUND_PlaySFX(g_snd.SPELL_LOWER_ARMOR_END); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_LOWER_ARMOR_END); + } if(m_haloCreated) { Entity * io = entities.get(m_target); @@ -316,7 +325,9 @@ void LowerArmorSpell::Update() { } } - ARX_SOUND_RefreshPosition(m_snd_loop, entities[m_target]->pos); + if(emitsSound()) { + ARX_SOUND_RefreshPosition(m_snd_loop, entities[m_target]->pos); + } } Vec3f LowerArmorSpell::getPosition() const { @@ -325,12 +336,11 @@ Vec3f LowerArmorSpell::getPosition() const { void HarmSpell::Launch() { - if(!(m_flags & SPELLCAST_FLAG_NOSOUND)) { + if(emitsSound()) { ARX_SOUND_PlaySFX(g_snd.SPELL_HARM, &m_caster_pos); + m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_MAGICAL_SHIELD_LOOP, &m_caster_pos, 1.f); } - m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_MAGICAL_SHIELD_LOOP, &m_caster_pos, 1.f); - spells.endByCaster(m_caster, SPELL_LIFE_DRAIN); spells.endByCaster(m_caster, SPELL_MANA_DRAIN); @@ -366,8 +376,10 @@ void HarmSpell::End() { m_cabal.end(); - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + } } void HarmSpell::Update() { @@ -388,5 +400,8 @@ void HarmSpell::Update() { casterPos = entities[m_caster]->pos; } Vec3f cabalPos = m_cabal.update(casterPos); - ARX_SOUND_RefreshPosition(m_snd_loop, cabalPos); + + if(emitsSound()) { + ARX_SOUND_RefreshPosition(m_snd_loop, cabalPos); + } } diff --git a/src/game/magic/spells/SpellsLvl03.cpp b/src/game/magic/spells/SpellsLvl03.cpp index 2f4b8bbc1d..a2dab8cd30 100644 --- a/src/game/magic/spells/SpellsLvl03.cpp +++ b/src/game/magic/spells/SpellsLvl03.cpp @@ -61,10 +61,11 @@ void SpeedSpell::Launch() { m_target = m_caster; } - ARX_SOUND_PlaySFX(g_snd.SPELL_SPEED_START, &entities[m_target]->pos); - - if(m_target == EntityHandle_Player) { - m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_SPEED_LOOP, &entities[m_target]->pos, 1.f); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_SPEED_START, &entities[m_target]->pos); + if(m_target == EntityHandle_Player) { + m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_SPEED_LOOP, &entities[m_target]->pos, 1.f); + } } if(m_caster == EntityHandle_Player) { @@ -92,12 +93,14 @@ void SpeedSpell::End() { m_targets.clear(); - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); - - Entity * target = entities.get(m_target); - if(target) { - ARX_SOUND_PlaySFX(g_snd.SPELL_SPEED_END, &target->pos); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + + Entity * target = entities.get(m_target); + if(target) { + ARX_SOUND_PlaySFX(g_snd.SPELL_SPEED_END, &target->pos); + } } m_trails.clear(); @@ -106,8 +109,9 @@ void SpeedSpell::End() { void SpeedSpell::Update() { - if(m_caster == EntityHandle_Player) + if(emitsSound() && m_caster == EntityHandle_Player) { ARX_SOUND_RefreshPosition(m_snd_loop, entities[m_target]->pos); + } for(SpeedTrail & trail : m_trails) { Vec3f pos = entities[m_target]->obj->vertexWorldPositions[trail.vertexIndex].v; @@ -128,7 +132,9 @@ Vec3f SpeedSpell::getPosition() const { void DispellIllusionSpell::Launch() { - ARX_SOUND_PlaySFX(g_snd.SPELL_DISPELL_ILLUSION); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_DISPELL_ILLUSION); + } m_duration = 1s; m_hasDuration = true; @@ -203,14 +209,19 @@ void FireballSpell::Launch() { eMove = angleToVector(Anglef(anglea, angleb, 0.f)) * 80.f; - ARX_SOUND_PlaySFX(g_snd.SPELL_FIRE_LAUNCH, &m_caster_pos); - m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_FIRE_WIND_LOOP, &m_caster_pos, 1.f); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_FIRE_LAUNCH, &m_caster_pos); + m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_FIRE_WIND_LOOP, &m_caster_pos, 1.f); + } + } void FireballSpell::End() { - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + } endLightDelayed(m_light, 500ms); } @@ -292,14 +303,20 @@ void FireballSpell::Update() { doSphericDamage(Sphere(eCurPos, 30.f * m_level), 3.f * m_level, DAMAGE_AREA, this, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL, caster); - ARX_SOUND_PlaySFX(g_snd.SPELL_FIRE_HIT, &sphere.origin); + + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_FIRE_HIT, &sphere.origin); + } + if(caster) { spawnAudibleSound(sphere.origin, *caster); } requestEnd(); } - ARX_SOUND_RefreshPosition(m_snd_loop, eCurPos); + if(emitsSound()) { + ARX_SOUND_RefreshPosition(m_snd_loop, eCurPos); + } } Vec3f FireballSpell::getPosition() const { @@ -312,7 +329,9 @@ CreateFoodSpell::CreateFoodSpell() void CreateFoodSpell::Launch() { - ARX_SOUND_PlaySFX(g_snd.SPELL_CREATE_FOOD, &m_caster_pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_CREATE_FOOD, &m_caster_pos); + } m_duration = (m_launchDuration >= 0) ? m_launchDuration : 3500ms; m_hasDuration = true; @@ -368,7 +387,9 @@ IceProjectileSpell::IceProjectileSpell() void IceProjectileSpell::Launch() { - ARX_SOUND_PlaySFX(g_snd.SPELL_ICE_PROJECTILE_LAUNCH, &m_caster_pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_ICE_PROJECTILE_LAUNCH, &m_caster_pos); + } m_duration = 4200ms; m_hasDuration = true; diff --git a/src/game/magic/spells/SpellsLvl04.cpp b/src/game/magic/spells/SpellsLvl04.cpp index 208161447b..ac0f786765 100644 --- a/src/game/magic/spells/SpellsLvl04.cpp +++ b/src/game/magic/spells/SpellsLvl04.cpp @@ -58,7 +58,9 @@ void BlessSpell::Launch() { spells.endByCaster(m_target, SPELL_BLESS); - ARX_SOUND_PlaySFX(g_snd.SPELL_BLESS); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_BLESS); + } // TODO m_launchDuration is not used // m_duration = (m_launchDuration > -1) ? m_launchDuration : 2000000; @@ -209,10 +211,12 @@ void DispellFieldSpell::Launch() { ANIM_TALK_NEUTRAL, ARX_SPEECH_FLAG_NOTEXT); } - if(dispelled > 0) { - ARX_SOUND_PlaySFX(g_snd.SPELL_DISPELL_FIELD); - } else { - ARX_SOUND_PlaySFX(g_snd.MAGIC_FIZZLE, &m_caster_pos); + if(emitsSound()) { + if(dispelled > 0) { + ARX_SOUND_PlaySFX(g_snd.SPELL_DISPELL_FIELD); + } else { + ARX_SOUND_PlaySFX(g_snd.MAGIC_FIZZLE, &m_caster_pos); + } } } @@ -236,7 +240,9 @@ void FireProtectionSpell::Launch() { m_target = EntityHandle_Player; } - ARX_SOUND_PlaySFX(g_snd.SPELL_FIRE_PROTECTION, &entities[m_target]->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_FIRE_PROTECTION, &entities[m_target]->pos); + } m_fManaCostPerSecond = 1.f; @@ -249,17 +255,23 @@ void FireProtectionSpell::Launch() { m_targets.push_back(m_target); - m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_FIRE_PROTECTION_LOOP, &entities[m_target]->pos, 1.f); + if(emitsSound()) { + m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_FIRE_PROTECTION_LOOP, &entities[m_target]->pos, 1.f); + } } void FireProtectionSpell::End() { - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + } Entity * target = entities.get(m_target); if(target) { - ARX_SOUND_PlaySFX(g_snd.SPELL_FIRE_PROTECTION_END, &target->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_FIRE_PROTECTION_END, &target->pos); + } ARX_HALO_SetToNative(target); } @@ -274,7 +286,9 @@ void FireProtectionSpell::Update() { io->halo.color = Color3f(0.5f, 0.3f, 0.f); io->halo.radius = 45.f; - ARX_SOUND_RefreshPosition(m_snd_loop, io->pos); + if(emitsSound()) { + ARX_SOUND_RefreshPosition(m_snd_loop, io->pos); + } } } @@ -293,7 +307,9 @@ void ColdProtectionSpell::Launch() { m_target = EntityHandle_Player; } - ARX_SOUND_PlaySFX(g_snd.SPELL_COLD_PROTECTION_START, &entities[m_target]->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_COLD_PROTECTION_START, &entities[m_target]->pos); + } if(m_caster == EntityHandle_Player) { m_duration = 0; @@ -312,19 +328,25 @@ void ColdProtectionSpell::Launch() { io->halo.radius = 45.f; } - m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_COLD_PROTECTION_LOOP, &entities[m_target]->pos, 1.f); + if(emitsSound()) { + m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_COLD_PROTECTION_LOOP, &entities[m_target]->pos, 1.f); + } m_targets.push_back(m_target); } void ColdProtectionSpell::End() { - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + } Entity * target = entities.get(m_target); if(target) { - ARX_SOUND_PlaySFX(g_snd.SPELL_COLD_PROTECTION_END, &target->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_COLD_PROTECTION_END, &target->pos); + } ARX_HALO_SetToNative(target); } @@ -339,7 +361,9 @@ void ColdProtectionSpell::Update() { io->halo.color = Color3f(0.2f, 0.2f, 0.45f); io->halo.radius = 45.f; - ARX_SOUND_RefreshPosition(m_snd_loop, io->pos); + if(emitsSound()) { + ARX_SOUND_RefreshPosition(m_snd_loop, io->pos); + } } } @@ -361,17 +385,22 @@ void TelekinesisSpell::Launch() { player.m_telekinesis = true; } - ARX_SOUND_PlaySFX(g_snd.SPELL_TELEKINESIS_START, &m_caster_pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_TELEKINESIS_START, &m_caster_pos); + } } void TelekinesisSpell::End() { - if(m_caster == EntityHandle_Player) + if(m_caster == EntityHandle_Player) { player.m_telekinesis = false; + } - Entity * caster = entities.get(m_caster); - if(caster) { - ARX_SOUND_PlaySFX(g_snd.SPELL_TELEKINESIS_END, &caster->pos); + if(emitsSound()) { + Entity * caster = entities.get(m_caster); + if(caster) { + ARX_SOUND_PlaySFX(g_snd.SPELL_TELEKINESIS_END, &caster->pos); + } } } @@ -385,7 +414,9 @@ void CurseSpell::Launch() { spells.endByCaster(m_target, SPELL_CURSE); - ARX_SOUND_PlaySFX(g_snd.SPELL_CURSE, &entities[m_target]->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_CURSE, &entities[m_target]->pos); + } m_hasDuration = m_launchDuration >= 0; m_duration = m_hasDuration ? m_launchDuration : 0; diff --git a/src/game/magic/spells/SpellsLvl05.cpp b/src/game/magic/spells/SpellsLvl05.cpp index b20b2a3e0d..b36ac1ddae 100644 --- a/src/game/magic/spells/SpellsLvl05.cpp +++ b/src/game/magic/spells/SpellsLvl05.cpp @@ -58,7 +58,9 @@ void RuneOfGuardingSpell::Launch() { spells.endByCaster(m_caster, SPELL_RUNE_OF_GUARDING); - ARX_SOUND_PlaySFX(g_snd.SPELL_RUNE_OF_GUARDING); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_RUNE_OF_GUARDING); + } m_hasDuration = m_launchDuration >= 0; m_duration = m_hasDuration ? m_launchDuration : 0; @@ -152,7 +154,9 @@ void RuneOfGuardingSpell::Update() { LaunchFireballBoom(m_pos, m_level); doSphericDamage(Sphere(m_pos, 30.f * m_level), 4.f * m_level, DAMAGE_AREA, this, DAMAGE_TYPE_FIRE | DAMAGE_TYPE_MAGICAL, caster); - ARX_SOUND_PlaySFX(g_snd.SPELL_RUNE_OF_GUARDING_END, &m_pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_RUNE_OF_GUARDING_END, &m_pos); + } requestEnd(); } @@ -175,7 +179,9 @@ void LevitateSpell::Launch() { m_target = EntityHandle_Player; } - ARX_SOUND_PlaySFX(g_snd.SPELL_LEVITATE_START, &entities[m_target]->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_LEVITATE_START, &entities[m_target]->pos); + } m_fManaCostPerSecond = 1.f; @@ -200,19 +206,23 @@ void LevitateSpell::Launch() { cone2.Init(m_baseRadius, rhaut * 1.5f, hauteur * 0.5f); m_stones.Init(m_baseRadius); - m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_LEVITATE_LOOP, &entities[m_target]->pos, 0.7f); + if(emitsSound()) { + m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_LEVITATE_LOOP, &entities[m_target]->pos, 0.7f); + } m_targets.push_back(m_target); } void LevitateSpell::End() { - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); - - Entity * target = entities.get(m_target); - if(target) { - ARX_SOUND_PlaySFX(g_snd.SPELL_LEVITATE_END, &target->pos); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + + Entity * target = entities.get(m_target); + if(target) { + ARX_SOUND_PlaySFX(g_snd.SPELL_LEVITATE_END, &target->pos); + } } m_targets.clear(); @@ -258,7 +268,9 @@ void LevitateSpell::Update() { cone2.Render(); m_stones.DrawStone(); - ARX_SOUND_RefreshPosition(m_snd_loop, entities[m_target]->pos); + if(emitsSound()) { + ARX_SOUND_RefreshPosition(m_snd_loop, entities[m_target]->pos); + } } void LevitateSpell::createDustParticle() { @@ -297,12 +309,16 @@ void CurePoisonSpell::Launch() { float cure = m_level * 10; if(m_target == EntityHandle_Player) { player.poison -= std::min(player.poison, cure); - ARX_SOUND_PlaySFX(g_snd.SPELL_CURE_POISON); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_CURE_POISON); + } } else if(Entity * io = entities.get(m_target)) { if(io->ioflags & IO_NPC) { io->_npcdata->poisonned -= std::min(io->_npcdata->poisonned, cure); } - ARX_SOUND_PlaySFX(g_snd.SPELL_CURE_POISON, &io->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_CURE_POISON, &io->pos); + } } m_duration = 3500ms; @@ -380,9 +396,11 @@ void RepelUndeadSpell::Launch() { m_target = EntityHandle_Player; } - ARX_SOUND_PlaySFX(g_snd.SPELL_REPEL_UNDEAD, &entities[m_target]->pos); - if(m_target == EntityHandle_Player) { - m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_REPEL_UNDEAD_LOOP, &entities[m_target]->pos, 1.f); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_REPEL_UNDEAD, &entities[m_target]->pos); + if(m_target == EntityHandle_Player) { + m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_REPEL_UNDEAD_LOOP, &entities[m_target]->pos, 1.f); + } } m_hasDuration = m_launchDuration >= 0; @@ -396,8 +414,10 @@ void RepelUndeadSpell::Launch() { void RepelUndeadSpell::End() { - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + } endLightDelayed(m_light, 500ms); } @@ -459,7 +479,7 @@ void RepelUndeadSpell::Update() { light->creationTime = g_gameTime.now(); } - if(m_target == EntityHandle_Player) { + if(emitsSound() && m_target == EntityHandle_Player) { ARX_SOUND_RefreshPosition(m_snd_loop, entities[m_target]->pos); } @@ -476,8 +496,9 @@ PoisonProjectileSpell::~PoisonProjectileSpell() { void PoisonProjectileSpell::Launch() { - ARX_SOUND_PlaySFX(g_snd.SPELL_POISON_PROJECTILE_LAUNCH, - &m_caster_pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_POISON_PROJECTILE_LAUNCH, &m_caster_pos); + } Vec3f srcPos(0.f); float afBeta = 0.f; diff --git a/src/game/magic/spells/SpellsLvl06.cpp b/src/game/magic/spells/SpellsLvl06.cpp index 21cccea297..205f94524a 100644 --- a/src/game/magic/spells/SpellsLvl06.cpp +++ b/src/game/magic/spells/SpellsLvl06.cpp @@ -69,7 +69,9 @@ bool RaiseDeadSpell::CanLaunch() { GetTargetAndBeta(target, beta); if(!ARX_INTERACTIVE_ConvertToValidPosForIO(nullptr, &target)) { - ARX_SOUND_PlaySFX(g_snd.MAGIC_FIZZLE); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.MAGIC_FIZZLE); + } return false; } @@ -84,7 +86,10 @@ void RaiseDeadSpell::Launch() { GetTargetAndBeta(target, beta); m_targetPos = target; - ARX_SOUND_PlaySFX(g_snd.SPELL_RAISE_DEAD, &m_targetPos); + + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_RAISE_DEAD, &m_targetPos); + } m_hasDuration = m_launchDuration >= 0; m_duration = m_hasDuration ? m_launchDuration : 0; @@ -117,7 +122,9 @@ void RaiseDeadSpell::End() { Entity * entity = entities.get(m_entity); if(entity) { - ARX_SOUND_PlaySFX(g_snd.SPELL_ELECTRIC, &entity->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_ELECTRIC, &entity->pos); + } if(entity->scriptload && (entity->ioflags & IO_NOSAVE)) { AddRandomSmoke(*entity, 100); @@ -168,7 +175,9 @@ void RaiseDeadSpell::Update() { GameDuration tim = m_fissure.m_elapsed; if(tim > 3s && m_entity == EntityHandle()) { - ARX_SOUND_PlaySFX(g_snd.SPELL_ELECTRIC, &m_targetPos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_ELECTRIC, &m_targetPos); + } Cylinder phys = Cylinder(m_targetPos, 50, -200); @@ -205,7 +214,9 @@ void RaiseDeadSpell::Update() { } else { - ARX_SOUND_PlaySFX(g_snd.MAGIC_FIZZLE); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.MAGIC_FIZZLE); + } m_creationFailed = true; requestEnd(); @@ -221,7 +232,9 @@ void RaiseDeadSpell::Update() { void ParalyseSpell::Launch() { - ARX_SOUND_PlaySFX(g_snd.SPELL_PARALYSE, &entities[m_target]->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_PARALYSE, &entities[m_target]->pos); + } m_duration = (m_launchDuration >= 0) ? m_launchDuration : 5s; m_hasDuration = true; @@ -251,7 +264,9 @@ void ParalyseSpell::End() { target->ioflags &= ~IO_FREEZESCRIPT; } - ARX_SOUND_PlaySFX(g_snd.SPELL_PARALYSE_END); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_PARALYSE_END); + } } Vec3f ParalyseSpell::getPosition() const { @@ -293,7 +308,7 @@ void CreateFieldSpell::Launch() { } // Don't play sound for persistent fields - if(!(m_flags & SPELLCAST_FLAG_RESTORE)) { + if(!(m_flags & SPELLCAST_FLAG_RESTORE) && emitsSound()) { ARX_SOUND_PlaySFX(g_snd.SPELL_CREATE_FIELD, &target); } @@ -360,7 +375,9 @@ Vec3f CreateFieldSpell::getPosition() const { void DisarmTrapSpell::Launch() { - ARX_SOUND_PlaySFX(g_snd.SPELL_DISARM_TRAP); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_DISARM_TRAP); + } m_duration = 1ms; m_hasDuration = true; @@ -397,7 +414,9 @@ bool SlowDownSpell::CanLaunch() { void SlowDownSpell::Launch() { - ARX_SOUND_PlaySFX(g_snd.SPELL_SLOW_DOWN, &entities[m_target]->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_SLOW_DOWN, &entities[m_target]->pos); + } if(m_caster == EntityHandle_Player) { m_duration = 0; @@ -414,7 +433,10 @@ void SlowDownSpell::Launch() { void SlowDownSpell::End() { - ARX_SOUND_PlaySFX(g_snd.SPELL_SLOW_DOWN_END); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_SLOW_DOWN_END); + } + m_targets.clear(); } diff --git a/src/game/magic/spells/SpellsLvl07.cpp b/src/game/magic/spells/SpellsLvl07.cpp index 528e0aef91..e255a70f18 100644 --- a/src/game/magic/spells/SpellsLvl07.cpp +++ b/src/game/magic/spells/SpellsLvl07.cpp @@ -72,7 +72,9 @@ bool FlyingEyeSpell::CanLaunch() { void FlyingEyeSpell::Launch() { - ARX_SOUND_PlaySFX(g_snd.SPELL_EYEBALL_IN); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_EYEBALL_IN); + } m_lastupdate = m_timcreation; m_duration = 0; @@ -109,14 +111,16 @@ void FlyingEyeSpell::End() { return; } - Entity * caster = entities.get(m_caster); - if(caster) { - ARX_SOUND_PlaySFX(g_snd.MAGIC_FIZZLE, &caster->pos); + if(emitsSound()) { + Entity * caster = entities.get(m_caster); + if(caster) { + ARX_SOUND_PlaySFX(g_snd.MAGIC_FIZZLE, &caster->pos); + } + + ARX_SOUND_PlaySFX(g_snd.SPELL_EYEBALL_OUT); + eyeball.end(); } - ARX_SOUND_PlaySFX(g_snd.SPELL_EYEBALL_OUT); - eyeball.end(); - for(long n = 0; n < 12; n++) { PARTICLE_DEF * pd = createParticle(true); if(!pd) { @@ -205,7 +209,9 @@ void FireFieldSpell::Launch() { spells.endByCaster(m_caster, SPELL_FIRE_FIELD); - ARX_SOUND_PlaySFX(g_snd.SPELL_FIRE_FIELD_START); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_FIRE_FIELD_START); + } m_duration = (m_launchDuration >= 0) ? m_launchDuration : 100s; m_hasDuration = true; @@ -257,10 +263,12 @@ void FireFieldSpell::End() { DamageRequestEnd(m_damage); - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); - - ARX_SOUND_PlaySFX(g_snd.SPELL_FIRE_FIELD_END); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + + ARX_SOUND_PlaySFX(g_snd.SPELL_FIRE_FIELD_END); + } } void FireFieldSpell::Update() { @@ -332,7 +340,9 @@ void IceFieldSpell::Launch() { spells.endByCaster(m_caster, SPELL_ICE_FIELD); - ARX_SOUND_PlaySFX(g_snd.SPELL_ICE_FIELD); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_ICE_FIELD); + } m_duration = (m_launchDuration >= 0) ? m_launchDuration : 100s; m_hasDuration = true; @@ -400,17 +410,21 @@ void IceFieldSpell::Launch() { } } - m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_ICE_FIELD_LOOP, &target, 1.f); + if(emitsSound()) { + m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_ICE_FIELD_LOOP, &target, 1.f); + } } void IceFieldSpell::End() { DamageRequestEnd(m_damage); - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); - - ARX_SOUND_PlaySFX(g_snd.SPELL_ICE_FIELD_END); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + + ARX_SOUND_PlaySFX(g_snd.SPELL_ICE_FIELD_END); + } } void IceFieldSpell::Update() { @@ -516,20 +530,24 @@ void LightningStrikeSpell::Launch() { m_duration = m_lightning.m_duration; m_hasDuration = true; - ARX_SOUND_PlaySFX(g_snd.SPELL_LIGHTNING_START, &m_caster_pos); - - m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_LIGHTNING_LOOP, &m_caster_pos, 1.f); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_LIGHTNING_START, &m_caster_pos); + + m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_LIGHTNING_LOOP, &m_caster_pos, 1.f); + } } void LightningStrikeSpell::End() { - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); - - Entity * caster = entities.get(m_caster); - if(caster) { - ARX_SOUND_PlaySFX(g_snd.SPELL_ELECTRIC, &caster->pos); - ARX_SOUND_PlaySFX(g_snd.SPELL_LIGHTNING_END, &caster->pos); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + + Entity * caster = entities.get(m_caster); + if(caster) { + ARX_SOUND_PlaySFX(g_snd.SPELL_ELECTRIC, &caster->pos); + ARX_SOUND_PlaySFX(g_snd.SPELL_LIGHTNING_END, &caster->pos); + } } } @@ -593,7 +611,7 @@ void LightningStrikeSpell::Update() { m_lightning.Update(g_gameTime.lastFrameDuration()); m_lightning.Render(); - if(caster) { + if(caster && emitsSound()) { ARX_SOUND_RefreshPosition(m_snd_loop, caster->pos); } } @@ -611,7 +629,9 @@ void ConfuseSpell::Launch() { return; } - ARX_SOUND_PlaySFX(g_snd.SPELL_CONFUSE, &target->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_CONFUSE, &target->pos); + } m_hasDuration = true; m_fManaCostPerSecond = 1.5f; diff --git a/src/game/magic/spells/SpellsLvl08.cpp b/src/game/magic/spells/SpellsLvl08.cpp index ffc9233982..b1b807ca4d 100644 --- a/src/game/magic/spells/SpellsLvl08.cpp +++ b/src/game/magic/spells/SpellsLvl08.cpp @@ -53,7 +53,9 @@ void InvisibilitySpell::Launch() { entities[m_target]->gameFlags |= GFLAG_INVISIBILITY; entities[m_target]->invisibility = 0.f; - ARX_SOUND_PlaySFX(g_snd.SPELL_INVISIBILITY_START, &m_caster_pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_INVISIBILITY_START, &m_caster_pos); + } m_targets.push_back(m_target); } @@ -62,7 +64,9 @@ void InvisibilitySpell::End() { Entity * target = entities.get(m_target); if(target) { target->gameFlags &= ~GFLAG_INVISIBILITY; - ARX_SOUND_PlaySFX(g_snd.SPELL_INVISIBILITY_END, &target->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_INVISIBILITY_END, &target->pos); + } m_targets.clear(); } } @@ -98,7 +102,9 @@ void ManaDrainSpell::Launch() { m_duration = m_hasDuration ? m_launchDuration : 0; m_fManaCostPerSecond = 2.f; - m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_MAGICAL_SHIELD_LOOP, &m_caster_pos, 1.2f); + if(emitsSound()) { + m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_MAGICAL_SHIELD_LOOP, &m_caster_pos, 1.2f); + } DamageParameters damage; damage.radius = 150.f; @@ -126,8 +132,10 @@ void ManaDrainSpell::End() { m_cabal.end(); - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + } } void ManaDrainSpell::Update() { @@ -150,7 +158,10 @@ void ManaDrainSpell::Update() { m_cabal.setOffset(offset); Vec3f cabalPos = m_cabal.update(casterPos); - ARX_SOUND_RefreshPosition(m_snd_loop, cabalPos); + + if(emitsSound()) { + ARX_SOUND_RefreshPosition(m_snd_loop, cabalPos); + } } Vec3f ManaDrainSpell::getPosition() const { @@ -159,7 +170,10 @@ Vec3f ManaDrainSpell::getPosition() const { void ExplosionSpell::Launch() { - ARX_SOUND_PlaySFX(g_snd.SPELL_EXPLOSION); + + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_EXPLOSION); + } m_duration = 2s; m_hasDuration = true; @@ -205,7 +219,9 @@ void ExplosionSpell::Launch() { } } - ARX_SOUND_PlaySFX(g_snd.SPELL_FIRE_WIND_LOOP); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_FIRE_WIND_LOOP); + } } void ExplosionSpell::Update() { @@ -243,7 +259,6 @@ void EnchantWeaponSpell::End() { } void EnchantWeaponSpell::Update() { } - bool LifeDrainSpell::CanLaunch() { return spells.getSpellByCaster(m_caster, m_type) == nullptr; } @@ -256,7 +271,9 @@ void LifeDrainSpell::Launch() { m_duration = m_hasDuration ? m_launchDuration : 0; m_fManaCostPerSecond = 12.f; - m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_MAGICAL_SHIELD_LOOP, &m_caster_pos, 0.8f); + if(emitsSound()) { + m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_MAGICAL_SHIELD_LOOP, &m_caster_pos, 0.8f); + } DamageParameters damage; damage.radius = 150.f; @@ -282,8 +299,10 @@ void LifeDrainSpell::Launch() { void LifeDrainSpell::End() { DamageRequestEnd(m_damage); - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + } m_cabal.end(); } @@ -308,7 +327,10 @@ void LifeDrainSpell::Update() { m_cabal.setOffset(offset); Vec3f cabalPos = m_cabal.update(casterPos); - ARX_SOUND_RefreshPosition(m_snd_loop, cabalPos); + + if(emitsSound()) { + ARX_SOUND_RefreshPosition(m_snd_loop, cabalPos); + } } Vec3f LifeDrainSpell::getPosition() const { diff --git a/src/game/magic/spells/SpellsLvl09.cpp b/src/game/magic/spells/SpellsLvl09.cpp index 9c9e6a232f..65ed51867e 100644 --- a/src/game/magic/spells/SpellsLvl09.cpp +++ b/src/game/magic/spells/SpellsLvl09.cpp @@ -68,7 +68,9 @@ bool SummonCreatureSpell::CanLaunch() { GetTargetAndBeta(target, beta); if(!ARX_INTERACTIVE_ConvertToValidPosForIO(nullptr, &target)) { - ARX_SOUND_PlaySFX(g_snd.MAGIC_FIZZLE); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.MAGIC_FIZZLE); + } return false; } @@ -89,7 +91,10 @@ void SummonCreatureSpell::Launch() { m_megaCheat = (m_caster == EntityHandle_Player && cur_mega == 10); m_targetPos = target; - ARX_SOUND_PlaySFX(g_snd.SPELL_SUMMON_CREATURE, &m_targetPos); + + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_SUMMON_CREATURE, &m_targetPos); + } m_fissure.Create(target, MAKEANGLE(player.angle.getYaw())); m_fissure.SetDuration(2s, 500ms, 1500ms); @@ -114,7 +119,9 @@ void SummonCreatureSpell::End() { Entity * io = entities.get(m_summonedEntity); if(io) { - ARX_SOUND_PlaySFX(g_snd.SPELL_ELECTRIC, &io->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_ELECTRIC, &io->pos); + } if(io->scriptload && (io->ioflags & IO_NOSAVE)) { @@ -162,7 +169,10 @@ void SummonCreatureSpell::Update() { lightHandleDestroy(m_light); m_requestSummon = false; - ARX_SOUND_PlaySFX(g_snd.SPELL_ELECTRIC, &m_targetPos); + + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_ELECTRIC, &m_targetPos); + } Cylinder phys = Cylinder(m_targetPos, 50, -200); @@ -267,7 +277,10 @@ void FakeSummonSpell::Launch() { target.y += player.baseHeight(); } m_targetPos = target; - ARX_SOUND_PlaySFX(g_snd.SPELL_SUMMON_CREATURE, &m_targetPos); + + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_SUMMON_CREATURE, &m_targetPos); + } m_fissure.Create(target, MAKEANGLE(player.angle.getYaw())); m_fissure.SetDuration(2s, 500ms, 1500ms); @@ -286,7 +299,10 @@ void FakeSummonSpell::Launch() { } void FakeSummonSpell::End() { - ARX_SOUND_PlaySFX(g_snd.SPELL_ELECTRIC, &m_targetPos); + + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_ELECTRIC, &m_targetPos); + } lightHandleDestroy(m_light); } @@ -316,7 +332,9 @@ void NegateMagicSpell::Launch() { m_target = EntityHandle_Player; } - ARX_SOUND_PlaySFX(g_snd.SPELL_NEGATE_MAGIC, &entities[m_target]->pos); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_NEGATE_MAGIC, &entities[m_target]->pos); + } m_fManaCostPerSecond = 2.f; m_hasDuration = m_launchDuration >= 0; @@ -416,9 +434,10 @@ void IncinerateSpell::Launch() { Entity * tio = entities[m_target]; - ARX_SOUND_PlaySFX(g_snd.SPELL_INCINERATE, &tio->pos); - - m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_INCINERATE_LOOP, &tio->pos, 1.f); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_INCINERATE, &tio->pos); + m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_INCINERATE_LOOP, &tio->pos, 1.f); + } m_duration = 20s; m_hasDuration = true; @@ -433,17 +452,21 @@ void IncinerateSpell::End() { m_targets.clear(); - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); - - ARX_SOUND_PlaySFX(g_snd.SPELL_INCINERATE_END); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + + ARX_SOUND_PlaySFX(g_snd.SPELL_INCINERATE_END); + } } void IncinerateSpell::Update() { - Entity * target = entities.get(m_target); - if(target) { - ARX_SOUND_RefreshPosition(m_snd_loop, target->pos); + if(emitsSound()) { + Entity * target = entities.get(m_target); + if(target) { + ARX_SOUND_RefreshPosition(m_snd_loop, target->pos); + } } } @@ -455,7 +478,9 @@ Vec3f IncinerateSpell::getPosition() const { void MassParalyseSpell::Launch() { - ARX_SOUND_PlaySFX(g_snd.SPELL_MASS_PARALYSE); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_MASS_PARALYSE); + } m_duration = (m_launchDuration >= 0) ? m_launchDuration : 10s; m_hasDuration = true; @@ -487,6 +512,7 @@ void MassParalyseSpell::End() { m_targets.clear(); - ARX_SOUND_PlaySFX(g_snd.SPELL_PARALYSE_END); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_PARALYSE_END); + } } - diff --git a/src/game/magic/spells/SpellsLvl10.cpp b/src/game/magic/spells/SpellsLvl10.cpp index bf87b19c08..649d4a155c 100644 --- a/src/game/magic/spells/SpellsLvl10.cpp +++ b/src/game/magic/spells/SpellsLvl10.cpp @@ -99,8 +99,10 @@ void MassLightningStrikeSpell::Launch() { light->pos = m_pos; } - ARX_SOUND_PlaySFX(g_snd.SPELL_LIGHTNING_START); - m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_LIGHTNING_LOOP, &m_pos, 1.f); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_LIGHTNING_START); + m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_LIGHTNING_LOOP, &m_pos, 1.f); + } // Draws White Flash on Screen UseRenderState state(render2D().blend(BlendOne, BlendOne)); @@ -111,10 +113,12 @@ void MassLightningStrikeSpell::End() { endLightDelayed(m_light, 200ms); - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); - - ARX_SOUND_PlaySFX(g_snd.SPELL_LIGHTNING_END); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + + ARX_SOUND_PlaySFX(g_snd.SPELL_LIGHTNING_END); + } m_arcs.clear(); @@ -130,24 +134,27 @@ void MassLightningStrikeSpell::Update() { arc.Render(); } - Vec3f position = m_pos + arx::randomVec(-250.f, 250.f); - ARX_SOUND_RefreshPosition(m_snd_loop, position); - ARX_SOUND_RefreshVolume(m_snd_loop, 1.f); - ARX_SOUND_RefreshPitch(m_snd_loop, Random::getf(0.8f, 1.2f)); - - if(Random::getf() > 0.62f) { - position = m_pos + arx::randomVec(-250.f, 250.f); - ARX_SOUND_PlaySFX(g_snd.SPELL_SPARK, &position, Random::getf(0.8f, 1.2f)); - } - - if(Random::getf() > 0.82f) { - position = m_pos + arx::randomVec(-250.f, 250.f); - ARX_SOUND_PlaySFX(g_snd.SPELL_ELECTRIC, &position, Random::getf(0.8f, 1.2f)); - } - - if(0 > m_duration - 1800ms && !m_soundEffectPlayed) { - m_soundEffectPlayed = true; - ARX_SOUND_PlaySFX(g_snd.SPELL_ELECTRIC, nullptr, Random::getf(0.8f, 1.2f)); + if(emitsSound()) { + Vec3f position = m_pos + arx::randomVec(-250.f, 250.f); + + ARX_SOUND_RefreshPosition(m_snd_loop, position); + ARX_SOUND_RefreshVolume(m_snd_loop, 1.f); + ARX_SOUND_RefreshPitch(m_snd_loop, Random::getf(0.8f, 1.2f)); + + if(Random::getf() > 0.62f) { + position = m_pos + arx::randomVec(-250.f, 250.f); + ARX_SOUND_PlaySFX(g_snd.SPELL_SPARK, &position, Random::getf(0.8f, 1.2f)); + } + + if(Random::getf() > 0.82f) { + position = m_pos + arx::randomVec(-250.f, 250.f); + ARX_SOUND_PlaySFX(g_snd.SPELL_ELECTRIC, &position, Random::getf(0.8f, 1.2f)); + } + + if(0 > m_duration - 1800ms && !m_soundEffectPlayed) { + m_soundEffectPlayed = true; + ARX_SOUND_PlaySFX(g_snd.SPELL_ELECTRIC, nullptr, Random::getf(0.8f, 1.2f)); + } } EERIE_LIGHT * light = lightHandleGet(m_light); @@ -215,7 +222,9 @@ void ControlTargetSpell::Launch() { } - ARX_SOUND_PlaySFX(g_snd.SPELL_CONTROL_TARGET); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_CONTROL_TARGET); + } m_duration = 1s; m_hasDuration = true; @@ -306,7 +315,10 @@ bool FreezeTimeSpell::CanLaunch() { } void FreezeTimeSpell::Launch() { - ARX_SOUND_PlaySFX(g_snd.SPELL_FREEZETIME); + + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_FREEZETIME); + } float max_slowdown = std::max(0.f, g_gameTime.speed() - 0.01f); m_slowdown = glm::clamp(m_level * 0.08f, 0.f, max_slowdown); @@ -320,15 +332,19 @@ void FreezeTimeSpell::Launch() { void FreezeTimeSpell::End() { g_gameTime.setSpeed(g_gameTime.speed() + m_slowdown); - Entity * caster = entities.get(m_caster); - if(caster) { - ARX_SOUND_PlaySFX(g_snd.SPELL_TELEKINESIS_END, &caster->pos); + if(emitsSound()) { + Entity * caster = entities.get(m_caster); + if(caster) { + ARX_SOUND_PlaySFX(g_snd.SPELL_TELEKINESIS_END, &caster->pos); + } } } void MassIncinerateSpell::Launch() { - ARX_SOUND_PlaySFX(g_snd.SPELL_MASS_INCINERATE); + if(emitsSound()) { + ARX_SOUND_PlaySFX(g_snd.SPELL_MASS_INCINERATE); + } m_duration = 20s; m_hasDuration = true; @@ -350,7 +366,7 @@ void MassIncinerateSpell::Launch() { } - if(!m_targets.empty()) { + if(!m_targets.empty() && emitsSound()) { m_snd_loop = ARX_SOUND_PlaySFX_loop(g_snd.SPELL_INCINERATE_LOOP, &m_caster_pos, 1.f); } } @@ -358,16 +374,20 @@ void MassIncinerateSpell::Launch() { void MassIncinerateSpell::End() { m_targets.clear(); - ARX_SOUND_Stop(m_snd_loop); - m_snd_loop = audio::SourcedSample(); - - ARX_SOUND_PlaySFX(g_snd.SPELL_INCINERATE_END); + if(emitsSound()) { + ARX_SOUND_Stop(m_snd_loop); + m_snd_loop = audio::SourcedSample(); + + ARX_SOUND_PlaySFX(g_snd.SPELL_INCINERATE_END); + } } void MassIncinerateSpell::Update() { - Entity * caster = entities.get(m_caster); - if(caster) { - ARX_SOUND_RefreshPosition(m_snd_loop, caster->pos); + if(emitsSound()) { + Entity * caster = entities.get(m_caster); + if(caster) { + ARX_SOUND_RefreshPosition(m_snd_loop, caster->pos); + } } }