From 3777a8bca9e10fa98da693ee9caae80a94c8709f Mon Sep 17 00:00:00 2001 From: reaperrr Date: Thu, 21 May 2015 15:48:30 +0200 Subject: [PATCH] Moved Voice-related extensions to VoiceExts. Note: This is a work-around until Selectable can be moved to Mods.Common, which is when the voice extensions should be moved back to ActorExts. Pulled phrase check before foreach in PlayVoice ActorExts. Removed superflous actor parameter from PlayVoice/PlayVoiceLocal. Simplified PlayVoice extensions. variant is no longer customisable, as all current usages use self.Owner.Country.Race anyway. --- OpenRA.Game/OpenRA.Game.csproj | 1 + OpenRA.Game/Selection.cs | 3 +- OpenRA.Game/VoiceExts.cs | 75 +++++++++++++++++++ OpenRA.Game/WorldUtils.cs | 20 ----- OpenRA.Mods.Common/ActorExts.cs | 33 -------- .../Traits/Sound/AnnounceOnBuild.cs | 2 +- .../Traits/Sound/AnnounceOnKill.cs | 2 +- .../Traits/Sound/DeathSounds.cs | 2 +- 8 files changed, 80 insertions(+), 58 deletions(-) create mode 100644 OpenRA.Game/VoiceExts.cs diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index a1e1d691a3..b211f9c12c 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -179,6 +179,7 @@ + diff --git a/OpenRA.Game/Selection.cs b/OpenRA.Game/Selection.cs index 38bc05cbd6..2700aee20a 100644 --- a/OpenRA.Game/Selection.cs +++ b/OpenRA.Game/Selection.cs @@ -59,8 +59,7 @@ namespace OpenRA var voicedActor = actors.FirstOrDefault(a => a.Owner == world.LocalPlayer && a.IsInWorld && a.HasTrait()); if (voicedActor != null) - foreach (var voice in voicedActor.TraitsImplementing()) - voice.PlayVoice(voicedActor, "Select", voicedActor.Owner.Country.Race); + voicedActor.PlayVoice("Select"); foreach (var a in newSelection) foreach (var sel in a.TraitsImplementing()) diff --git a/OpenRA.Game/VoiceExts.cs b/OpenRA.Game/VoiceExts.cs new file mode 100644 index 0000000000..c63d7a4d69 --- /dev/null +++ b/OpenRA.Game/VoiceExts.cs @@ -0,0 +1,75 @@ +#region Copyright & License Information +/* + * Copyright 2007-2015 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using OpenRA.Traits; + +namespace OpenRA +{ + public static class VoiceExts + { + public static void PlayVoice(this Actor self, string phrase) + { + if (phrase == null) + return; + + foreach (var voiced in self.TraitsImplementing()) + { + if (string.IsNullOrEmpty(voiced.VoiceSet)) + return; + + voiced.PlayVoice(self, phrase, self.Owner.Country.Race); + } + } + + public static void PlayVoiceLocal(this Actor self, string phrase, float volume) + { + if (phrase == null) + return; + + foreach (var voiced in self.TraitsImplementing()) + { + if (string.IsNullOrEmpty(voiced.VoiceSet)) + return; + + voiced.PlayVoiceLocal(self, phrase, self.Owner.Country.Race, volume); + } + } + + public static bool HasVoice(this Actor self, string voice) + { + return self.TraitsImplementing().Any(x => x.HasVoice(self, voice)); + } + + public static void PlayVoiceForOrders(this World w, Order[] orders) + { + // Find an actor with a phrase to say + foreach (var o in orders) + { + if (o == null) + continue; + + var orderSubject = o.Subject; + if (orderSubject.Destroyed) + continue; + + foreach (var voice in orderSubject.TraitsImplementing()) + foreach (var v in orderSubject.TraitsImplementing()) + { + if (voice.PlayVoice(orderSubject, v.VoicePhraseForOrder(orderSubject, o), + orderSubject.Owner.Country.Race)) + return; + } + } + } + } +} diff --git a/OpenRA.Game/WorldUtils.cs b/OpenRA.Game/WorldUtils.cs index ae342a3f9c..d3cd04cda8 100644 --- a/OpenRA.Game/WorldUtils.cs +++ b/OpenRA.Game/WorldUtils.cs @@ -42,26 +42,6 @@ namespace OpenRA } } - public static void PlayVoiceForOrders(this World w, Order[] orders) - { - // Find an actor with a phrase to say - foreach (var o in orders) - { - if (o == null) - continue; - - var orderSubject = o.Subject; - if (orderSubject.Destroyed) - continue; - - foreach (var voice in orderSubject.TraitsImplementing()) - foreach (var v in orderSubject.TraitsImplementing()) - if (voice.PlayVoice(orderSubject, v.VoicePhraseForOrder(orderSubject, o), - orderSubject.Owner.Country.Race)) - return; - } - } - public static void DoTimed(this IEnumerable e, Action a, string text) { // Note - manual enumeration here for performance due to high call volume. diff --git a/OpenRA.Mods.Common/ActorExts.cs b/OpenRA.Mods.Common/ActorExts.cs index 57f19ca1be..4cbe893c74 100644 --- a/OpenRA.Mods.Common/ActorExts.cs +++ b/OpenRA.Mods.Common/ActorExts.cs @@ -80,39 +80,6 @@ namespace OpenRA.Mods.Common return Target.Invalid; } - public static void PlayVoice(this Actor self, Actor actor, string phrase, string variant) - { - foreach (var voiced in self.TraitsImplementing()) - { - if (phrase == null) - return; - - if (string.IsNullOrEmpty(voiced.VoiceSet)) - return; - - voiced.PlayVoice(self, phrase, variant); - } - } - - public static void PlayVoiceLocal(this Actor self, Actor actor, string phrase, string variant, float volume) - { - foreach (var voiced in self.TraitsImplementing()) - { - if (phrase == null) - return; - - if (string.IsNullOrEmpty(voiced.VoiceSet)) - return; - - voiced.PlayVoiceLocal(self, phrase, variant, volume); - } - } - - public static bool HasVoice(this Actor self, string voice) - { - return self.TraitsImplementing().Any(x => x.HasVoice(self, voice)); - } - public static void NotifyBlocker(this Actor self, IEnumerable blockers) { foreach (var blocker in blockers) diff --git a/OpenRA.Mods.Common/Traits/Sound/AnnounceOnBuild.cs b/OpenRA.Mods.Common/Traits/Sound/AnnounceOnBuild.cs index e3ceb5fc64..f2b4188cc9 100644 --- a/OpenRA.Mods.Common/Traits/Sound/AnnounceOnBuild.cs +++ b/OpenRA.Mods.Common/Traits/Sound/AnnounceOnBuild.cs @@ -19,7 +19,7 @@ namespace OpenRA.Mods.Common.Traits { public void BuildingComplete(Actor self) { - self.PlayVoice(self, "Build", self.Owner.Country.Race); + self.PlayVoice("Build"); } } } diff --git a/OpenRA.Mods.Common/Traits/Sound/AnnounceOnKill.cs b/OpenRA.Mods.Common/Traits/Sound/AnnounceOnKill.cs index 43e1a1e4f7..e5d552d2fc 100644 --- a/OpenRA.Mods.Common/Traits/Sound/AnnounceOnKill.cs +++ b/OpenRA.Mods.Common/Traits/Sound/AnnounceOnKill.cs @@ -39,7 +39,7 @@ namespace OpenRA.Mods.Common.Traits if (e.DamageState == DamageState.Dead && damaged != e.Attacker) { if (self.World.WorldTick - lastAnnounce > info.Interval * 25) - self.PlayVoice(self, "Kill", self.Owner.Country.Race); + self.PlayVoice("Kill"); lastAnnounce = self.World.WorldTick; } diff --git a/OpenRA.Mods.Common/Traits/Sound/DeathSounds.cs b/OpenRA.Mods.Common/Traits/Sound/DeathSounds.cs index 92b0068a1b..1f590806ed 100644 --- a/OpenRA.Mods.Common/Traits/Sound/DeathSounds.cs +++ b/OpenRA.Mods.Common/Traits/Sound/DeathSounds.cs @@ -42,7 +42,7 @@ namespace OpenRA.Mods.Common.Traits if (info.DeathTypes.Contains(e.Warhead.DeathType) || (!info.DeathTypes.Any() && !self.Info.Traits.WithInterface().Any(dsi => dsi.DeathTypes.Contains(e.Warhead.DeathType)))) - self.PlayVoiceLocal(self, info.DeathSound, self.Owner.Country.Race, info.VolumeMultiplier); + self.PlayVoiceLocal(info.DeathSound, info.VolumeMultiplier); } } } \ No newline at end of file