Move PlayVoice and PlayVoiceLocal from Sound to Voiced.

Move HasVoice, HasVoices and GetVoices from WorldUtils to Voiced.
This commit is contained in:
reaperrr
2015-05-12 16:35:31 +02:00
parent 037bd6794c
commit 251d3e6864
9 changed files with 77 additions and 61 deletions

View File

@@ -57,9 +57,10 @@ namespace OpenRA
} }
} }
var voicedActor = actors.FirstOrDefault(a => a.Owner == world.LocalPlayer && a.IsInWorld && a.HasVoices()); var voicedActor = actors.FirstOrDefault(a => a.Owner == world.LocalPlayer && a.IsInWorld && (a.TraitsImplementing<IVoiced>() != null));
if (voicedActor != null) if (voicedActor != null)
Sound.PlayVoice("Select", voicedActor, voicedActor.Owner.Country.Race); foreach (var voice in voicedActor.TraitsImplementing<IVoiced>())
voice.PlayVoice("Select", voicedActor, voicedActor.Owner.Country.Race);
foreach (var a in newSelection) foreach (var a in newSelection)
foreach (var sel in a.TraitsImplementing<INotifySelected>()) foreach (var sel in a.TraitsImplementing<INotifySelected>())

View File

@@ -364,32 +364,6 @@ namespace OpenRA
return true; return true;
} }
public static bool PlayVoice(string phrase, Actor voicedActor, string variant)
{
if (voicedActor == null || phrase == null)
return false;
var mi = voicedActor.TraitOrDefault<IVoiced>();
if (mi == null || mi.VoiceSet == null)
return false;
var type = mi.VoiceSet.ToLowerInvariant();
return PlayPredefined(voicedActor.World.Map.Rules, null, voicedActor, type, phrase, variant, true, WPos.Zero, 1f, true);
}
public static bool PlayVoiceLocal(string phrase, Actor voicedActor, string variant, WPos pos, float volume)
{
if (voicedActor == null || phrase == null)
return false;
var mi = voicedActor.TraitOrDefault<IVoiced>();
if (mi == null || mi.VoiceSet == null)
return false;
var type = mi.VoiceSet.ToLowerInvariant();
return PlayPredefined(voicedActor.World.Map.Rules, null, voicedActor, type, phrase, variant, false, pos, volume, true);
}
public static bool PlayNotification(Ruleset rules, Player player, string type, string notification, string variant) public static bool PlayNotification(Ruleset rules, Player player, string type, string notification, string variant)
{ {
if (rules == null) if (rules == null)

View File

@@ -109,7 +109,15 @@ namespace OpenRA.Traits
public interface ISeedableResource { void Seed(Actor self); } public interface ISeedableResource { void Seed(Actor self); }
public interface IVoiced { string VoiceSet { get; } } public interface IVoiced
{
bool PlayVoice(string phrase, Actor voicedActor, string variant);
bool PlayVoiceLocal(string phrase, Actor voicedActor, string variant, WPos pos, float volume);
bool HasVoices(Actor actor);
bool HasVoice(Actor actor, string voice);
string VoiceSet { get; }
}
public interface IDemolishableInfo { bool IsValidTarget(ActorInfo actorInfo, Actor saboteur); } public interface IDemolishableInfo { bool IsValidTarget(ActorInfo actorInfo, Actor saboteur); }
public interface IDemolishable public interface IDemolishable
{ {

View File

@@ -42,28 +42,6 @@ namespace OpenRA
} }
} }
public static bool HasVoices(this Actor a)
{
var voice = a.TraitOrDefault<IVoiced>();
return voice != null && voice.VoiceSet != null;
}
public static bool HasVoice(this Actor a, string voice)
{
var v = GetVoices(a);
return v != null && v.Voices.ContainsKey(voice);
}
public static SoundInfo GetVoices(this Actor a)
{
var voiced = a.TraitOrDefault<IVoiced>();
if (voiced == null)
return null;
var v = voiced.VoiceSet;
return (v == null) ? null : a.World.Map.Rules.Voices[v.ToLowerInvariant()];
}
public static void PlayVoiceForOrders(this World w, Order[] orders) public static void PlayVoiceForOrders(this World w, Order[] orders)
{ {
// Find an actor with a phrase to say // Find an actor with a phrase to say
@@ -75,13 +53,15 @@ namespace OpenRA
if (o.Subject.Destroyed) if (o.Subject.Destroyed)
continue; continue;
if (!o.Subject.HasVoices()) var hasVoice = o.Subject.TraitsImplementing<IVoiced>();
if (hasVoice == null)
continue; continue;
foreach (var v in o.Subject.TraitsImplementing<IOrderVoice>()) foreach (var v in o.Subject.TraitsImplementing<IOrderVoice>())
if (Sound.PlayVoice(v.VoicePhraseForOrder(o.Subject, o), foreach (var voice in o.Subject.TraitsImplementing<IVoiced>())
o.Subject, o.Subject.Owner.Country.Race)) if (voice.PlayVoice(v.VoicePhraseForOrder(o.Subject, o),
return; o.Subject, o.Subject.Owner.Country.Race))
return;
} }
} }

View File

@@ -207,7 +207,7 @@ namespace OpenRA.Mods.Common.Traits
if (order.OrderString != "Unload" || IsEmpty(self)) if (order.OrderString != "Unload" || IsEmpty(self))
return null; return null;
return self.HasVoice("Unload") ? "Unload" : "Move"; return self.TraitsImplementing<IVoiced>().FirstOrDefault().HasVoice(self, "Unload") ? "Unload" : "Move";
} }
public bool MoveDisabled(Actor self) { return reserves.Any(); } public bool MoveDisabled(Actor self) { return reserves.Any(); }

View File

@@ -19,7 +19,8 @@ namespace OpenRA.Mods.Common.Traits
{ {
public void BuildingComplete(Actor self) public void BuildingComplete(Actor self)
{ {
Sound.PlayVoice("Build", self, self.Owner.Country.Race); foreach (var voiced in self.TraitsImplementing<IVoiced>())
voiced.PlayVoice("Build", self, self.Owner.Country.Race);
} }
} }
} }

View File

@@ -39,7 +39,8 @@ namespace OpenRA.Mods.Common.Traits
if (e.DamageState == DamageState.Dead && damaged != e.Attacker) if (e.DamageState == DamageState.Dead && damaged != e.Attacker)
{ {
if (self.World.WorldTick - lastAnnounce > info.Interval * 25) if (self.World.WorldTick - lastAnnounce > info.Interval * 25)
Sound.PlayVoice("Kill", self, self.Owner.Country.Race); foreach (var voiced in self.TraitsImplementing<IVoiced>())
voiced.PlayVoice("Kill", self, self.Owner.Country.Race);
lastAnnounce = self.World.WorldTick; lastAnnounce = self.World.WorldTick;
} }

View File

@@ -42,9 +42,11 @@ namespace OpenRA.Mods.Common.Traits
var cp = self.CenterPosition; var cp = self.CenterPosition;
if (info.DeathTypes.Contains(e.Warhead.DeathType) || foreach (var voiced in self.TraitsImplementing<IVoiced>())
(!info.DeathTypes.Any() && !self.Info.Traits.WithInterface<DeathSoundsInfo>().Any(dsi => dsi.DeathTypes.Contains(e.Warhead.DeathType)))) if (info.DeathTypes.Contains(e.Warhead.DeathType) ||
Sound.PlayVoiceLocal(info.DeathSound, self, self.Owner.Country.Race, cp, info.VolumeMultiplier); (!info.DeathTypes.Any() && !self.Info.Traits.WithInterface<DeathSoundsInfo>()
.Any(dsi => dsi.DeathTypes.Contains(e.Warhead.DeathType))))
voiced.PlayVoiceLocal(info.DeathSound, self, self.Owner.Country.Race, cp, info.VolumeMultiplier);
} }
} }
} }

View File

@@ -10,6 +10,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.GameRules;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits namespace OpenRA.Mods.Common.Traits
@@ -30,6 +31,54 @@ namespace OpenRA.Mods.Common.Traits
Info = info; Info = info;
} }
public bool PlayVoice(string phrase, Actor voicedActor, string variant)
{
if (voicedActor == null || phrase == null)
return false;
var mi = voicedActor.TraitOrDefault<IVoiced>();
if (mi == null || mi.VoiceSet == null)
return false;
var type = mi.VoiceSet.ToLowerInvariant();
return Sound.PlayPredefined(voicedActor.World.Map.Rules, null, voicedActor, type, phrase, variant, true, WPos.Zero, 1f, true);
}
public bool PlayVoiceLocal(string phrase, Actor voicedActor, string variant, WPos pos, float volume)
{
if (voicedActor == null || phrase == null)
return false;
var mi = voicedActor.TraitOrDefault<IVoiced>();
if (mi == null || mi.VoiceSet == null)
return false;
var type = mi.VoiceSet.ToLowerInvariant();
return Sound.PlayPredefined(voicedActor.World.Map.Rules, null, voicedActor, type, phrase, variant, false, pos, volume, true);
}
public bool HasVoices(Actor actor)
{
var voice = actor.TraitsImplementing<IVoiced>().FirstOrDefault();
return voice != null && voice.VoiceSet != null;
}
public bool HasVoice(Actor actor, string voice)
{
var v = GetVoices(actor);
return v != null && v.Voices.ContainsKey(voice);
}
public SoundInfo GetVoices(Actor actor)
{
var voice = actor.TraitsImplementing<IVoiced>().FirstOrDefault();
if (voice == null)
return null;
var v = voice.VoiceSet;
return (v == null) ? null : actor.World.Map.Rules.Voices[v.ToLowerInvariant()];
}
public string VoiceSet { get { return Info.VoiceSet; } } public string VoiceSet { get { return Info.VoiceSet; } }
} }
} }