Merge pull request #8012 from reaperrr/voiceset

Extracted actor Voices from Selectable into own Voiced trait
This commit is contained in:
Matthias Mailänder
2015-05-23 21:59:34 +02:00
33 changed files with 376 additions and 165 deletions

View File

@@ -179,6 +179,7 @@
<Compile Include="Traits\World\Shroud.cs" /> <Compile Include="Traits\World\Shroud.cs" />
<Compile Include="World.cs" /> <Compile Include="World.cs" />
<Compile Include="WorldUtils.cs" /> <Compile Include="WorldUtils.cs" />
<Compile Include="VoiceExts.cs" />
<Compile Include="Network\ReplayRecorderConnection.cs" /> <Compile Include="Network\ReplayRecorderConnection.cs" />
<Compile Include="Traits\DebugPauseState.cs" /> <Compile Include="Traits\DebugPauseState.cs" />
<Compile Include="Network\UPnP.cs" /> <Compile Include="Network\UPnP.cs" />

View File

@@ -57,9 +57,9 @@ namespace OpenRA
} }
} }
var voicedUnit = actors.FirstOrDefault(a => a.Owner == world.LocalPlayer && a.IsInWorld && a.HasVoices()); var voicedActor = actors.FirstOrDefault(a => a.Owner == world.LocalPlayer && a.IsInWorld && a.HasTrait<IVoiced>());
if (voicedUnit != null) if (voicedActor != null)
Sound.PlayVoice("Select", voicedUnit, voicedUnit.Owner.Country.Race); voicedActor.PlayVoice("Select");
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

@@ -300,7 +300,7 @@ namespace OpenRA
} }
// Returns true if played successfully // Returns true if played successfully
public static bool PlayPredefined(Ruleset ruleset, Player p, Actor voicedUnit, string type, string definition, string variant, public static bool PlayPredefined(Ruleset ruleset, Player p, Actor voicedActor, string type, string definition, string variant,
bool relative, WPos pos, float volumeModifier, bool attenuateVolume) bool relative, WPos pos, float volumeModifier, bool attenuateVolume)
{ {
if (ruleset == null) if (ruleset == null)
@@ -312,17 +312,17 @@ namespace OpenRA
if (ruleset.Voices == null || ruleset.Notifications == null) if (ruleset.Voices == null || ruleset.Notifications == null)
return false; return false;
var rules = (voicedUnit != null) ? ruleset.Voices[type] : ruleset.Notifications[type]; var rules = (voicedActor != null) ? ruleset.Voices[type] : ruleset.Notifications[type];
if (rules == null) if (rules == null)
return false; return false;
var id = voicedUnit != null ? voicedUnit.ActorID : 0; var id = voicedActor != null ? voicedActor.ActorID : 0;
string clip; string clip;
var suffix = rules.DefaultVariant; var suffix = rules.DefaultVariant;
var prefix = rules.DefaultPrefix; var prefix = rules.DefaultPrefix;
if (voicedUnit != null) if (voicedActor != null)
{ {
if (!rules.VoicePools.Value.ContainsKey("Attack")) if (!rules.VoicePools.Value.ContainsKey("Attack"))
rules.VoicePools.Value.Add("Attack", rules.VoicePools.Value["Move"]); rules.VoicePools.Value.Add("Attack", rules.VoicePools.Value["Move"]);
@@ -364,32 +364,6 @@ namespace OpenRA
return true; return true;
} }
public static bool PlayVoice(string phrase, Actor voicedUnit, string variant)
{
if (voicedUnit == null || phrase == null)
return false;
var mi = voicedUnit.Info.Traits.GetOrDefault<SelectableInfo>();
if (mi == null || mi.Voice == null)
return false;
var type = mi.Voice.ToLowerInvariant();
return PlayPredefined(voicedUnit.World.Map.Rules, null, voicedUnit, type, phrase, variant, true, WPos.Zero, 1f, true);
}
public static bool PlayVoiceLocal(string phrase, Actor voicedUnit, string variant, WPos pos, float volume)
{
if (voicedUnit == null || phrase == null)
return false;
var mi = voicedUnit.Info.Traits.GetOrDefault<SelectableInfo>();
if (mi == null || mi.Voice == null)
return false;
var type = mi.Voice.ToLowerInvariant();
return PlayPredefined(voicedUnit.World.Map.Rules, null, voicedUnit, 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

@@ -20,7 +20,6 @@ namespace OpenRA.Traits
public readonly bool Selectable = true; public readonly bool Selectable = true;
public readonly int Priority = 10; public readonly int Priority = 10;
public readonly int[] Bounds = null; public readonly int[] Bounds = null;
[VoiceReference] public readonly string Voice = null;
public object Create(ActorInitializer init) { return new Selectable(init.Self, this); } public object Create(ActorInitializer init) { return new Selectable(init.Self, this); }
} }

View File

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

75
OpenRA.Game/VoiceExts.cs Normal file
View File

@@ -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<IVoiced>())
{
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<IVoiced>())
{
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<IVoiced>().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<IVoiced>())
foreach (var v in orderSubject.TraitsImplementing<IOrderVoice>())
{
if (voice.PlayVoice(orderSubject, v.VoicePhraseForOrder(orderSubject, o),
orderSubject.Owner.Country.Race))
return;
}
}
}
}
}

View File

@@ -42,44 +42,6 @@ namespace OpenRA
} }
} }
public static bool HasVoices(this Actor a)
{
var selectable = a.Info.Traits.GetOrDefault<SelectableInfo>();
return selectable != null && selectable.Voice != 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 selectable = a.Info.Traits.GetOrDefault<SelectableInfo>();
if (selectable == null) return null;
var v = selectable.Voice;
return (v == null) ? null : a.World.Map.Rules.Voices[v.ToLowerInvariant()];
}
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;
if (o.Subject.Destroyed)
continue;
foreach (var v in o.Subject.TraitsImplementing<IOrderVoice>())
if (Sound.PlayVoice(v.VoicePhraseForOrder(o.Subject, o),
o.Subject, o.Subject.Owner.Country.Race))
return;
}
}
public static void DoTimed<T>(this IEnumerable<T> e, Action<T> a, string text) public static void DoTimed<T>(this IEnumerable<T> e, Action<T> a, string text)
{ {
// Note - manual enumeration here for performance due to high call volume. // Note - manual enumeration here for performance due to high call volume.

View File

@@ -443,6 +443,7 @@
<Compile Include="Traits\Upgrades\UpgradeActorsNear.cs" /> <Compile Include="Traits\Upgrades\UpgradeActorsNear.cs" />
<Compile Include="Traits\Upgrades\UpgradeManager.cs" /> <Compile Include="Traits\Upgrades\UpgradeManager.cs" />
<Compile Include="Traits\Valued.cs" /> <Compile Include="Traits\Valued.cs" />
<Compile Include="Traits\Voiced.cs" />
<Compile Include="Traits\Wanders.cs" /> <Compile Include="Traits\Wanders.cs" />
<Compile Include="Traits\World\BridgeLayer.cs" /> <Compile Include="Traits\World\BridgeLayer.cs" />
<Compile Include="Traits\World\CrateSpawner.cs" /> <Compile Include="Traits\World\CrateSpawner.cs" />

View File

@@ -39,6 +39,9 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Terrain types that this actor is allowed to eject actors onto. Leave empty for all terrain types.")] [Desc("Terrain types that this actor is allowed to eject actors onto. Leave empty for all terrain types.")]
public readonly string[] UnloadTerrainTypes = { }; public readonly string[] UnloadTerrainTypes = { };
[Desc("Voice to play when ordered to unload the passengers.")]
public readonly string UnloadVoice = "Unload";
[Desc("Which direction the passenger will face (relative to the transport) when unloading.")] [Desc("Which direction the passenger will face (relative to the transport) when unloading.")]
public readonly int PassengerFacing = 128; public readonly int PassengerFacing = 128;
@@ -204,10 +207,10 @@ namespace OpenRA.Mods.Common.Traits
public string VoicePhraseForOrder(Actor self, Order order) public string VoicePhraseForOrder(Actor self, Order order)
{ {
if (order.OrderString != "Unload" || IsEmpty(self)) if (order.OrderString != "Unload" || IsEmpty(self) || !self.HasVoice(Info.UnloadVoice))
return null; return null;
return self.HasVoice("Unload") ? "Unload" : "Move"; return Info.UnloadVoice;
} }
public bool MoveDisabled(Actor self) { return reserves.Any(); } public bool MoveDisabled(Actor self) { return reserves.Any(); }

View File

@@ -13,13 +13,26 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits namespace OpenRA.Mods.Common.Traits
{ {
[Desc("Play the Build voice of this actor when trained.")] [Desc("Play the Build voice of this actor when trained.")]
public class AnnounceOnBuildInfo : TraitInfo<AnnounceOnBuild> { } public class AnnounceOnBuildInfo : ITraitInfo
{
[Desc("Voice to use when built/trained.")]
public readonly string BuildVoice = "Build";
public object Create(ActorInitializer init) { return new AnnounceOnBuild(init.Self, this); }
}
public class AnnounceOnBuild : INotifyBuildComplete public class AnnounceOnBuild : INotifyBuildComplete
{ {
readonly AnnounceOnBuildInfo info;
public AnnounceOnBuild(Actor self, AnnounceOnBuildInfo info)
{
this.info = info;
}
public void BuildingComplete(Actor self) public void BuildingComplete(Actor self)
{ {
Sound.PlayVoice("Build", self, self.Owner.Country.Race); self.PlayVoice(info.BuildVoice);
} }
} }
} }

View File

@@ -18,6 +18,9 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Minimum duration (in seconds) between sound events.")] [Desc("Minimum duration (in seconds) between sound events.")]
public readonly int Interval = 5; public readonly int Interval = 5;
[Desc("Voice to use when killing something.")]
public readonly string KillVoice = "Kill";
public object Create(ActorInitializer init) { return new AnnounceOnKill(init.Self, this); } public object Create(ActorInitializer init) { return new AnnounceOnKill(init.Self, this); }
} }
@@ -39,7 +42,7 @@ 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); self.PlayVoice(info.KillVoice);
lastAnnounce = self.World.WorldTick; lastAnnounce = self.World.WorldTick;
} }

View File

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

View File

@@ -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.Linq;
using OpenRA.GameRules;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
{
[Desc("This actor has a voice.")]
public class VoicedInfo : ITraitInfo
{
[Desc("Which voice set to use.")]
[VoiceReference] public readonly string VoiceSet = null;
[Desc("Multiply volume with this factor.")]
public readonly float Volume = 1f;
public object Create(ActorInitializer init) { return new Voiced(init.Self, this); }
}
public class Voiced : IVoiced
{
public readonly VoicedInfo Info;
public Voiced(Actor self, VoicedInfo info)
{
Info = info;
}
public string VoiceSet { get { return Info.VoiceSet; } }
public bool PlayVoice(Actor self, string phrase, string variant)
{
if (phrase == null)
return false;
if (string.IsNullOrEmpty(Info.VoiceSet))
return false;
var type = Info.VoiceSet.ToLowerInvariant();
var volume = Info.Volume;
return Sound.PlayPredefined(self.World.Map.Rules, null, self, type, phrase, variant, true, WPos.Zero, volume, true);
}
public bool PlayVoiceLocal(Actor self, string phrase, string variant, float volume)
{
if (phrase == null)
return false;
if (string.IsNullOrEmpty(Info.VoiceSet))
return false;
var type = Info.VoiceSet.ToLowerInvariant();
return Sound.PlayPredefined(self.World.Map.Rules, null, self, type, phrase, variant, false, self.CenterPosition, volume, true);
}
public bool HasVoice(Actor self, string voice)
{
if (string.IsNullOrEmpty(Info.VoiceSet))
return false;
var voices = self.World.Map.Rules.Voices[Info.VoiceSet.ToLowerInvariant()];
return voices != null && voices.Voices.ContainsKey(voice);
}
}
}

View File

@@ -943,6 +943,28 @@ namespace OpenRA.Mods.Common.UtilityCommands
node.Key = node.Key.Replace("ProvidesCustomPrerequisite", "ProvidesPrerequisite"); node.Key = node.Key.Replace("ProvidesCustomPrerequisite", "ProvidesPrerequisite");
} }
if (engineVersion < 20150509)
{
if (depth == 0 && node.Value.Nodes.Exists(n => n.Key == "Selectable"))
{
var selectable = node.Value.Nodes.FirstOrDefault(n => n.Key == "Selectable");
var selectableNodes = selectable.Value.Nodes;
var voice = selectableNodes.FirstOrDefault(n => n.Key == "Voice");
var selectableVoice = voice != null ? FieldLoader.GetValue<string>("Voice", voice.Value.Value) : "";
if (voice != null)
{
node.Value.Nodes.Add(new MiniYamlNode("Voiced", "", new List<MiniYamlNode>
{
new MiniYamlNode("VoiceSet", selectableVoice),
}));
}
}
if (node.Key.StartsWith("Selectable"))
node.Value.Nodes.RemoveAll(p => p.Key == "Voice");
}
UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1); UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1);
} }
} }

View File

@@ -18,6 +18,7 @@ VehicleVoice:
Voices: Voices:
Select: vehic1,yessir1,report1,await1,unit1 Select: vehic1,yessir1,report1,await1,unit1
Move: ackno,affirm1,movout1 Move: ackno,affirm1,movout1
Unload: movout1
CivilianMaleVoice: CivilianMaleVoice:
Voices: Voices:

View File

@@ -381,12 +381,14 @@ BRIDGEHUT:
C1: C1:
Inherits: ^CivInfantry Inherits: ^CivInfantry
Selectable: Selectable:
Voice: CivilianMaleVoice Voiced:
VoiceSet: CivilianMaleVoice
C2: C2:
Inherits: ^CivInfantry Inherits: ^CivInfantry
Selectable: Selectable:
Voice: CivilianFemaleVoice Voiced:
VoiceSet: CivilianFemaleVoice
C3: C3:
Inherits: ^CivInfantry Inherits: ^CivInfantry
@@ -394,7 +396,8 @@ C3:
C4: C4:
Inherits: ^CivInfantry Inherits: ^CivInfantry
Selectable: Selectable:
Voice: CivilianFemaleVoice Voiced:
VoiceSet: CivilianFemaleVoice
C5: C5:
Inherits: ^CivInfantry Inherits: ^CivInfantry
@@ -402,7 +405,8 @@ C5:
C6: C6:
Inherits: ^CivInfantry Inherits: ^CivInfantry
Selectable: Selectable:
Voice: CivilianFemaleVoice Voiced:
VoiceSet: CivilianFemaleVoice
C7: C7:
Inherits: ^CivInfantry Inherits: ^CivInfantry
@@ -410,7 +414,8 @@ C7:
C8: C8:
Inherits: ^CivInfantry Inherits: ^CivInfantry
Selectable: Selectable:
Voice: CivilianFemaleVoice Voiced:
VoiceSet: CivilianFemaleVoice
C9: C9:
Inherits: ^CivInfantry Inherits: ^CivInfantry
@@ -418,7 +423,8 @@ C9:
C10: C10:
Inherits: ^CivInfantry Inherits: ^CivInfantry
Selectable: Selectable:
Voice: CivilianFemaleVoice Voiced:
VoiceSet: CivilianFemaleVoice
VICE: VICE:
AppearsOnRadar: AppearsOnRadar:
@@ -439,7 +445,6 @@ VICE:
BlueTiberium: 100 BlueTiberium: 100
Beach: 60 Beach: 60
Selectable: Selectable:
Voice: DinoVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground TargetTypes: Ground
AutoTarget: AutoTarget:
@@ -472,4 +477,6 @@ VICE:
QuantizedFacings: 8 QuantizedFacings: 8
PoisonedByTiberium: PoisonedByTiberium:
Weapon: Heal Weapon: Heal
Voiced:
VoiceSet: DinoVoice

View File

@@ -12,7 +12,6 @@
ROT: 5 ROT: 5
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Voice: VehicleVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground, Vehicle TargetTypes: Ground, Vehicle
Repairable: Repairable:
@@ -51,6 +50,8 @@
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1
UpgradeManager: UpgradeManager:
MustBeDestroyed: MustBeDestroyed:
Voiced:
VoiceSet: VehicleVoice
^Tank: ^Tank:
AppearsOnRadar: AppearsOnRadar:
@@ -66,7 +67,6 @@
ROT: 5 ROT: 5
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Voice: VehicleVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground, Vehicle TargetTypes: Ground, Vehicle
Repairable: Repairable:
@@ -108,6 +108,8 @@
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1
UpgradeManager: UpgradeManager:
MustBeDestroyed: MustBeDestroyed:
Voiced:
VoiceSet: VehicleVoice
^Helicopter: ^Helicopter:
AppearsOnRadar: AppearsOnRadar:
@@ -117,7 +119,6 @@
GroundedTargetTypes: Ground GroundedTargetTypes: Ground
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Voice: VehicleVoice
Helicopter: Helicopter:
RepairBuildings: hpad RepairBuildings: hpad
RearmBuildings: RearmBuildings:
@@ -152,6 +153,8 @@
WithShadow: WithShadow:
Hovers: Hovers:
MustBeDestroyed: MustBeDestroyed:
Voiced:
VoiceSet: VehicleVoice
^Infantry: ^Infantry:
AppearsOnRadar: AppearsOnRadar:
@@ -177,7 +180,6 @@
Beach: 80 Beach: 80
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Voice: GenericVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground, Infantry TargetTypes: Ground, Infantry
TakeCover: TakeCover:
@@ -241,6 +243,8 @@
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1
UpgradeManager: UpgradeManager:
MustBeDestroyed: MustBeDestroyed:
Voiced:
VoiceSet: GenericVoice
^CivInfantry: ^CivInfantry:
Inherits: ^Infantry Inherits: ^Infantry
@@ -249,7 +253,6 @@
AppearsOnRadar: AppearsOnRadar:
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Voice: CivilianMaleVoice
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Valued: Valued:
Cost: 70 Cost: 70
@@ -271,6 +274,8 @@
ScaredyCat: ScaredyCat:
Crushable: Crushable:
CrushSound: squish2.aud CrushSound: squish2.aud
Voiced:
VoiceSet: CivilianMaleVoice
^DINO: ^DINO:
AppearsOnRadar: AppearsOnRadar:
@@ -299,7 +304,6 @@
BlueTiberium: 70 BlueTiberium: 70
Beach: 80 Beach: 80
Selectable: Selectable:
Voice: DinoVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground, Infantry TargetTypes: Ground, Infantry
HiddenUnderFog: HiddenUnderFog:
@@ -321,13 +325,14 @@
DeathSounds: DeathSounds:
RenderSprites: RenderSprites:
Palette: terrain Palette: terrain
Voiced:
VoiceSet: DinoVoice
^Plane: ^Plane:
AppearsOnRadar: AppearsOnRadar:
UseLocation: yes UseLocation: yes
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Voice: GenericVoice
TargetableUnit: TargetableUnit:
TargetTypes: Air TargetTypes: Air
HiddenUnderFog: HiddenUnderFog:
@@ -350,6 +355,8 @@
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1
UpgradeManager: UpgradeManager:
WithShadow: WithShadow:
Voiced:
VoiceSet: GenericVoice
^Ship: ^Ship:
AppearsOnRadar: AppearsOnRadar:
@@ -359,7 +366,6 @@
Water: 100 Water: 100
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Voice: VehicleVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground, Water TargetTypes: Ground, Water
HiddenUnderFog: HiddenUnderFog:
@@ -384,6 +390,8 @@
UpgradeTypes: selfheal UpgradeTypes: selfheal
UpgradeMinEnabledLevel: 1 UpgradeMinEnabledLevel: 1
UpgradeManager: UpgradeManager:
Voiced:
VoiceSet: VehicleVoice
^Building: ^Building:
AppearsOnRadar: AppearsOnRadar:

View File

@@ -185,7 +185,6 @@ RMBO:
Queue: Infantry.GDI Queue: Infantry.GDI
Selectable: Selectable:
Bounds: 12,17,0,-6 Bounds: 12,17,0,-6
Voice: CommandoVoice
Mobile: Mobile:
Speed: 71 Speed: 71
Health: Health:
@@ -206,6 +205,8 @@ RMBO:
StandSequences: stand, stand2 StandSequences: stand, stand2
AnnounceOnBuild: AnnounceOnBuild:
AnnounceOnKill: AnnounceOnKill:
Voiced:
VoiceSet: CommandoVoice
PVICE: PVICE:
Inherits: VICE Inherits: VICE

View File

@@ -13,7 +13,6 @@
ROT: 5 ROT: 5
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Voice: VehicleVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground, C4 TargetTypes: Ground, C4
Passenger: Passenger:
@@ -52,6 +51,8 @@
MustBeDestroyed: MustBeDestroyed:
AnnounceOnSeen: AnnounceOnSeen:
Notification: EnemyUnitsDetected Notification: EnemyUnitsDetected
Voiced:
VoiceSet: VehicleVoice
^Tank: ^Tank:
AppearsOnRadar: AppearsOnRadar:
@@ -68,7 +69,6 @@
ROT: 5 ROT: 5
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Voice: VehicleVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground, C4 TargetTypes: Ground, C4
Passenger: Passenger:
@@ -107,6 +107,8 @@
MustBeDestroyed: MustBeDestroyed:
AnnounceOnSeen: AnnounceOnSeen:
Notification: EnemyUnitsDetected Notification: EnemyUnitsDetected
Voiced:
VoiceSet: VehicleVoice
^Husk: ^Husk:
Health: Health:
@@ -190,7 +192,6 @@
Rough: 70 Rough: 70
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Voice: InfantryVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground TargetTypes: Ground
RenderSprites: RenderSprites:
@@ -241,13 +242,14 @@
TerrainModifiesDamage: TerrainModifiesDamage:
TerrainModifier: TerrainModifier:
Rough: 80 Rough: 80
Voiced:
VoiceSet: InfantryVoice
^Plane: ^Plane:
AppearsOnRadar: AppearsOnRadar:
UseLocation: yes UseLocation: yes
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Voice: GenericVoice
TargetableAircraft: TargetableAircraft:
TargetTypes: Air TargetTypes: Air
GroundedTargetTypes: Ground GroundedTargetTypes: Ground
@@ -277,6 +279,8 @@
AnnounceOnSeen: AnnounceOnSeen:
Notification: EnemyUnitsDetected Notification: EnemyUnitsDetected
RenderUnit: RenderUnit:
Voiced:
VoiceSet: GenericVoice
^Helicopter: ^Helicopter:
Inherits: ^Plane Inherits: ^Plane

View File

@@ -37,7 +37,6 @@ engineer:
Description: Infiltrates and captures enemy structures\n Strong vs Buildings\n Weak vs Everything Description: Infiltrates and captures enemy structures\n Strong vs Buildings\n Weak vs Everything
Selectable: Selectable:
Bounds: 12,17,0,0 Bounds: 12,17,0,0
Voice: EngineerVoice
Health: Health:
HP: 25 HP: 25
Mobile: Mobile:
@@ -52,6 +51,8 @@ engineer:
-AutoTarget: -AutoTarget:
AttractsWorms: AttractsWorms:
Intensity: 180 Intensity: 180
Voiced:
VoiceSet: EngineerVoice
bazooka: bazooka:
Inherits: ^Infantry Inherits: ^Infantry
@@ -94,7 +95,6 @@ medic:
Description: Heals nearby infantry\n Strong vs Nothing\n Weak vs Everything Description: Heals nearby infantry\n Strong vs Nothing\n Weak vs Everything
Selectable: Selectable:
Bounds: 12,17,0,0 Bounds: 12,17,0,0
Voice: EngineerVoice
Health: Health:
HP: 60 HP: 60
Mobile: Mobile:
@@ -112,6 +112,8 @@ medic:
-AutoTarget: -AutoTarget:
AttractsWorms: AttractsWorms:
Intensity: 180 Intensity: 180
Voiced:
VoiceSet: EngineerVoice
fremen: fremen:
Inherits: ^Infantry Inherits: ^Infantry
@@ -126,7 +128,6 @@ fremen:
Prerequisites: ~barracks.atreides, palace, ~techlevel.high Prerequisites: ~barracks.atreides, palace, ~techlevel.high
Selectable: Selectable:
Bounds: 12,17,0,0 Bounds: 12,17,0,0
Voice: FremenVoice
Mobile: Mobile:
Speed: 53 Speed: 53
Health: Health:
@@ -151,6 +152,8 @@ fremen:
CloakSound: STEALTH1.WAV CloakSound: STEALTH1.WAV
UncloakSound: STEALTH2.WAV UncloakSound: STEALTH2.WAV
-MustBeDestroyed: -MustBeDestroyed:
Voiced:
VoiceSet: FremenVoice
grenadier: grenadier:
Inherits: ^Infantry Inherits: ^Infantry
@@ -199,7 +202,6 @@ sardaukar:
Description: Elite asssault infantry\n Strong vs Infantry, Vehicles\n Weak vs Artillery Description: Elite asssault infantry\n Strong vs Infantry, Vehicles\n Weak vs Artillery
Selectable: Selectable:
Bounds: 12,17,0,0 Bounds: 12,17,0,0
Voice: GenericVoice
Health: Health:
HP: 100 HP: 100
Mobile: Mobile:
@@ -217,6 +219,8 @@ sardaukar:
AttackFrontal: AttackFrontal:
AttractsWorms: AttractsWorms:
Intensity: 180 Intensity: 180
Voiced:
VoiceSet: GenericVoice
saboteur: saboteur:
Inherits: ^Infantry Inherits: ^Infantry
@@ -230,7 +234,6 @@ saboteur:
Name: Saboteur Name: Saboteur
Description: Sneaky infantry, armed with explosives\n Strong vs Buildings\n Weak vs Everything\n Special Ability: destroy buildings Description: Sneaky infantry, armed with explosives\n Strong vs Buildings\n Weak vs Everything\n Special Ability: destroy buildings
Selectable: Selectable:
Voice: SaboteurVoice
Bounds: 12,17,0,0 Bounds: 12,17,0,0
Health: Health:
HP: 100 HP: 100
@@ -243,4 +246,6 @@ saboteur:
-AutoTarget: -AutoTarget:
AttractsWorms: AttractsWorms:
Intensity: 120 Intensity: 120
Voiced:
VoiceSet: SaboteurVoice

View File

@@ -27,6 +27,7 @@ VehicleVoice:
Voices: Voices:
Select: vehic1,yessir1,report1,await1 Select: vehic1,yessir1,report1,await1
Move: ackno,affirm1 Move: ackno,affirm1
Unload: ackno,affirm1
EngineerVoice: EngineerVoice:
Voices: Voices:

View File

@@ -4,7 +4,8 @@ C1:
C2: C2:
Inherits: ^CivInfantry Inherits: ^CivInfantry
Selectable: Selectable:
Voice: CivilianFemaleVoice Voiced:
VoiceSet: CivilianFemaleVoice
C3: C3:
Inherits: ^CivInfantry Inherits: ^CivInfantry
@@ -12,10 +13,11 @@ C3:
C4: C4:
Inherits: ^CivInfantry Inherits: ^CivInfantry
Selectable: Selectable:
Voice: CivilianFemaleVoice
WithInfantryBody: WithInfantryBody:
RenderSprites: RenderSprites:
Image: C2 Image: C2
Voiced:
VoiceSet: CivilianFemaleVoice
C5: C5:
Inherits: ^CivInfantry Inherits: ^CivInfantry
@@ -26,10 +28,11 @@ C5:
C6: C6:
Inherits: ^CivInfantry Inherits: ^CivInfantry
Selectable: Selectable:
Voice: CivilianFemaleVoice
WithInfantryBody: WithInfantryBody:
RenderSprites: RenderSprites:
Image: C2 Image: C2
Voiced:
VoiceSet: CivilianFemaleVoice
C7: C7:
Inherits: ^CivInfantry Inherits: ^CivInfantry
@@ -40,10 +43,11 @@ C7:
C8: C8:
Inherits: ^CivInfantry Inherits: ^CivInfantry
Selectable: Selectable:
Voice: CivilianFemaleVoice
WithInfantryBody: WithInfantryBody:
RenderSprites: RenderSprites:
Image: C2 Image: C2
Voiced:
VoiceSet: CivilianFemaleVoice
C9: C9:
Inherits: ^CivInfantry Inherits: ^CivInfantry
@@ -54,10 +58,11 @@ C9:
C10: C10:
Inherits: ^CivInfantry Inherits: ^CivInfantry
Selectable: Selectable:
Voice: CivilianFemaleVoice
WithInfantryBody: WithInfantryBody:
RenderSprites: RenderSprites:
Image: C2 Image: C2
Voiced:
VoiceSet: CivilianFemaleVoice
FCOM: FCOM:
Inherits: ^TechBuilding Inherits: ^TechBuilding

View File

@@ -48,7 +48,6 @@
ROT: 5 ROT: 5
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Voice: VehicleVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground, Repair, Vehicle TargetTypes: Ground, Repair, Vehicle
Repairable: Repairable:
@@ -83,6 +82,8 @@
MustBeDestroyed: MustBeDestroyed:
AnnounceOnSeen: AnnounceOnSeen:
Notification: EnemyDetected Notification: EnemyDetected
Voiced:
VoiceSet: VehicleVoice
^Tank: ^Tank:
Inherits@1: ^ExistsInWorld Inherits@1: ^ExistsInWorld
@@ -101,7 +102,6 @@
ROT: 5 ROT: 5
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Voice: VehicleVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground, C4, Repair, Tank TargetTypes: Ground, C4, Repair, Tank
Repairable: Repairable:
@@ -145,6 +145,8 @@
WaterCorpsePalette: WaterCorpsePalette:
AnnounceOnSeen: AnnounceOnSeen:
Notification: EnemyDetected Notification: EnemyDetected
Voiced:
VoiceSet: VehicleVoice
^Infantry: ^Infantry:
Inherits@1: ^ExistsInWorld Inherits@1: ^ExistsInWorld
@@ -168,7 +170,6 @@
Beach: 80 Beach: 80
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Voice: GenericVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground, Infantry, Disguise TargetTypes: Ground, Infantry, Disguise
RenderSprites: RenderSprites:
@@ -221,6 +222,8 @@
MustBeDestroyed: MustBeDestroyed:
AnnounceOnSeen: AnnounceOnSeen:
Notification: EnemyDetected Notification: EnemyDetected
Voiced:
VoiceSet: GenericVoice
^Ship: ^Ship:
Inherits@1: ^ExistsInWorld Inherits@1: ^ExistsInWorld
@@ -232,7 +235,6 @@
Water: 100 Water: 100
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Voice: VehicleVoice
TargetableUnit: TargetableUnit:
TargetTypes: Ground, Water, Repair TargetTypes: Ground, Water, Repair
HiddenUnderFog: HiddenUnderFog:
@@ -254,6 +256,8 @@
Notification: EnemyDetected Notification: EnemyDetected
EditorTilesetFilter: EditorTilesetFilter:
ExcludeTilesets: INTERIOR ExcludeTilesets: INTERIOR
Voiced:
VoiceSet: VehicleVoice
^Plane: ^Plane:
Inherits@1: ^ExistsInWorld Inherits@1: ^ExistsInWorld
@@ -263,7 +267,6 @@
UseLocation: true UseLocation: true
SelectionDecorations: SelectionDecorations:
Selectable: Selectable:
Voice: GenericVoice
TargetableAircraft: TargetableAircraft:
TargetTypes: Air TargetTypes: Air
GroundedTargetTypes: Ground, Repair GroundedTargetTypes: Ground, Repair
@@ -290,6 +293,8 @@
MustBeDestroyed: MustBeDestroyed:
AnnounceOnSeen: AnnounceOnSeen:
Notification: EnemyDetected Notification: EnemyDetected
Voiced:
VoiceSet: GenericVoice
^Helicopter: ^Helicopter:
Inherits: ^Plane Inherits: ^Plane
@@ -446,7 +451,6 @@
^CivInfantry: ^CivInfantry:
Inherits: ^Infantry Inherits: ^Infantry
Selectable: Selectable:
Voice: CivilianMaleVoice
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Valued: Valued:
Cost: 70 Cost: 70
@@ -466,6 +470,8 @@
Types: CivilianInfantry Types: CivilianInfantry
WithInfantryBody: WithInfantryBody:
ScaredyCat: ScaredyCat:
Voiced:
VoiceSet: CivilianMaleVoice
^CivBuilding: ^CivBuilding:
Inherits: ^TechBuilding Inherits: ^TechBuilding

View File

@@ -11,7 +11,6 @@ DOG:
Name: Attack Dog Name: Attack Dog
Description: Anti-infantry unit.\nCan detect cloaked units and spies.\n Strong vs Infantry\n Weak vs Vehicles Description: Anti-infantry unit.\nCan detect cloaked units and spies.\n Strong vs Infantry\n Weak vs Vehicles
Selectable: Selectable:
Voice: DogVoice
Bounds: 12,17,-1,-4 Bounds: 12,17,-1,-4
Health: Health:
HP: 12 HP: 12
@@ -29,6 +28,8 @@ DOG:
IgnoresDisguise: IgnoresDisguise:
DetectCloaked: DetectCloaked:
Range: 5 Range: 5
Voiced:
VoiceSet: DogVoice
E1: E1:
Inherits: ^Infantry Inherits: ^Infantry
@@ -184,7 +185,6 @@ E6:
Name: Engineer Name: Engineer
Description: Infiltrates and captures enemy structures.\n Strong vs Nothing\n Weak vs Everything Description: Infiltrates and captures enemy structures.\n Strong vs Nothing\n Weak vs Everything
Selectable: Selectable:
Voice: EngineerVoice
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Health: Health:
HP: 25 HP: 25
@@ -204,6 +204,8 @@ E6:
WithInfantryBody: WithInfantryBody:
IdleSequences: idle1,idle2 IdleSequences: idle1,idle2
StandSequences: stand,stand2 StandSequences: stand,stand2
Voiced:
VoiceSet: EngineerVoice
SPY: SPY:
Inherits: ^Infantry Inherits: ^Infantry
@@ -220,7 +222,6 @@ SPY:
GenericName: Soldier GenericName: Soldier
Description: Infiltrates enemy structures for intel or\nsabotage. Exact effect depends on the\nbuilding infiltrated.\n Strong vs Nothing\n Weak vs Everything\n Special Ability: Disguised Description: Infiltrates enemy structures for intel or\nsabotage. Exact effect depends on the\nbuilding infiltrated.\n Strong vs Nothing\n Weak vs Everything\n Special Ability: Disguised
Selectable: Selectable:
Voice: SpyVoice
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Health: Health:
HP: 25 HP: 25
@@ -245,6 +246,8 @@ SPY:
Armament: Armament:
Weapon: SilencedPPK Weapon: SilencedPPK
AttackFrontal: AttackFrontal:
Voiced:
VoiceSet: SpyVoice
SPY.England: SPY.England:
Inherits: SPY Inherits: SPY
@@ -272,7 +275,6 @@ E7:
Name: Tanya Name: Tanya
Description: Elite commando infantry. Armed with\ndual pistols and C4.\n Strong vs Infantry, Buildings\n Weak vs Vehicles\n Special Ability: Destroy Building with C4\n\nMaximum 1 can be trained Description: Elite commando infantry. Armed with\ndual pistols and C4.\n Strong vs Infantry, Buildings\n Weak vs Vehicles\n Special Ability: Destroy Building with C4\n\nMaximum 1 can be trained
Selectable: Selectable:
Voice: TanyaVoice
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Health: Health:
HP: 100 HP: 100
@@ -302,6 +304,8 @@ E7:
IdleSequences: idle1,idle2 IdleSequences: idle1,idle2
AnnounceOnBuild: AnnounceOnBuild:
AnnounceOnKill: AnnounceOnKill:
Voiced:
VoiceSet: TanyaVoice
MEDI: MEDI:
Inherits: ^Infantry Inherits: ^Infantry
@@ -316,7 +320,6 @@ MEDI:
Name: Medic Name: Medic
Description: Heals nearby infantry.\n Strong vs Nothing\n Weak vs Everything Description: Heals nearby infantry.\n Strong vs Nothing\n Weak vs Everything
Selectable: Selectable:
Voice: MedicVoice
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Health: Health:
HP: 80 HP: 80
@@ -340,6 +343,8 @@ MEDI:
WithInfantryBody: WithInfantryBody:
IdleSequences: idle1,idle2 IdleSequences: idle1,idle2
AttackSequence: heal AttackSequence: heal
Voiced:
VoiceSet: MedicVoice
MECH: MECH:
Inherits: ^Infantry Inherits: ^Infantry
@@ -354,7 +359,6 @@ MECH:
Name: Mechanic Name: Mechanic
Description: Repairs nearby vehicles and restores\nhusks to working condition.\n Strong vs Nothing\n Weak vs Everything Description: Repairs nearby vehicles and restores\nhusks to working condition.\n Strong vs Nothing\n Weak vs Everything
Selectable: Selectable:
Voice: MechanicVoice
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Health: Health:
HP: 80 HP: 80
@@ -380,11 +384,12 @@ MECH:
WithInfantryBody: WithInfantryBody:
IdleSequences: idle1,idle2 IdleSequences: idle1,idle2
AttackSequence: heal AttackSequence: heal
Voiced:
VoiceSet: MechanicVoice
EINSTEIN: EINSTEIN:
Inherits: ^Infantry Inherits: ^Infantry
Selectable: Selectable:
Voice: EinsteinVoice
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Valued: Valued:
Cost: 10 Cost: 10
@@ -401,11 +406,12 @@ EINSTEIN:
Types: CivilianInfantry Types: CivilianInfantry
WithInfantryBody: WithInfantryBody:
ScaredyCat: ScaredyCat:
Voiced:
VoiceSet: EinsteinVoice
DELPHI: DELPHI:
Inherits: ^Infantry Inherits: ^Infantry
Selectable: Selectable:
Voice: CivilianMaleVoice
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Valued: Valued:
Cost: 10 Cost: 10
@@ -422,6 +428,8 @@ DELPHI:
Types: CivilianInfantry Types: CivilianInfantry
WithInfantryBody: WithInfantryBody:
ScaredyCat: ScaredyCat:
Voiced:
VoiceSet: CivilianMaleVoice
CHAN: CHAN:
Inherits: ^CivInfantry Inherits: ^CivInfantry
@@ -433,7 +441,8 @@ GNRL:
Tooltip: Tooltip:
Name: General Name: General
Selectable: Selectable:
Voice: StavrosVoice Voiced:
VoiceSet: StavrosVoice
THF: THF:
Inherits: ^Infantry Inherits: ^Infantry
@@ -443,7 +452,6 @@ THF:
Name: Thief Name: Thief
Description: Steals enemy credits.\n Strong vs Nothing\n Weak vs Everything\n Description: Steals enemy credits.\n Strong vs Nothing\n Weak vs Everything\n
Selectable: Selectable:
Voice: ThiefVoice
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Health: Health:
HP: 25 HP: 25
@@ -460,6 +468,8 @@ THF:
Prone50Percent: 50 Prone50Percent: 50
DamageTriggers: TriggerProne DamageTriggers: TriggerProne
-AutoTarget: -AutoTarget:
Voiced:
VoiceSet: ThiefVoice
HIJACKER: HIJACKER:
Inherits: ^Infantry Inherits: ^Infantry
@@ -474,7 +484,6 @@ HIJACKER:
Name: Hijacker Name: Hijacker
Description: Hijacks enemy vehicles. Unarmed\n Strong vs Tanks\n Weak vs Infantry, Aircraft Description: Hijacks enemy vehicles. Unarmed\n Strong vs Tanks\n Weak vs Infantry, Aircraft
Selectable: Selectable:
Voice: ThiefVoice
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Health: Health:
HP: 50 HP: 50
@@ -487,6 +496,8 @@ HIJACKER:
Captures: Captures:
CaptureTypes: vehicle CaptureTypes: vehicle
-AutoTarget: -AutoTarget:
Voiced:
VoiceSet: ThiefVoice
SHOK: SHOK:
Inherits: ^Infantry Inherits: ^Infantry
@@ -501,7 +512,6 @@ SHOK:
Name: Shock Trooper Name: Shock Trooper
Description: Elite infantry with portable tesla coils.\n Strong vs Infantry\n Weak vs Aircraft Description: Elite infantry with portable tesla coils.\n Strong vs Infantry\n Weak vs Aircraft
Selectable: Selectable:
Voice: ShokVoice
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Health: Health:
HP: 100 HP: 100
@@ -523,6 +533,8 @@ SHOK:
WithInfantryBody: WithInfantryBody:
IdleSequences: idle1,idle2 IdleSequences: idle1,idle2
StandSequences: stand,stand2 StandSequences: stand,stand2
Voiced:
VoiceSet: ShokVoice
SNIPER: SNIPER:
Inherits: ^Infantry Inherits: ^Infantry
@@ -584,7 +596,6 @@ Zombie:
BuildPaletteOrder: 200 BuildPaletteOrder: 200
Prerequisites: ~bio Prerequisites: ~bio
Selectable: Selectable:
Voice: AntVoice
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Health: Health:
HP: 250 HP: 250
@@ -595,6 +606,8 @@ Zombie:
AttackFrontal: AttackFrontal:
Armament: Armament:
Weapon: claw Weapon: claw
Voiced:
VoiceSet: AntVoice
Ant: Ant:
Inherits: ^Infantry Inherits: ^Infantry
@@ -608,7 +621,6 @@ Ant:
BuildPaletteOrder: 1954 BuildPaletteOrder: 1954
Prerequisites: ~bio Prerequisites: ~bio
Selectable: Selectable:
Voice: AntVoice
Bounds: 30,30,0,-2 Bounds: 30,30,0,-2
Health: Health:
HP: 750 HP: 750
@@ -626,4 +638,6 @@ Ant:
TargetTypes: Ground, Infantry TargetTypes: Ground, Infantry
WithDeathAnimation: WithDeathAnimation:
UseDeathTypeSuffix: false UseDeathTypeSuffix: false
Voiced:
VoiceSet: AntVoice

View File

@@ -161,6 +161,7 @@ Vehicle:
Select: 25-I000, 25-I002, 25-I004, 25-I006 Select: 25-I000, 25-I002, 25-I004, 25-I006
Move: 25-I012, 25-I014, 25-I016, 25-I018, 25-I022 Move: 25-I012, 25-I014, 25-I016, 25-I018, 25-I022
Attack: 25-I014, 25-I022, 25-I024, 25-I026 Attack: 25-I014, 25-I022, 25-I024, 25-I026
Unload: 25-I018
Mech: Mech:
Voices: Voices:

View File

@@ -207,7 +207,8 @@ SCRIN:
Prerequisites: ~nahpad, natech Prerequisites: ~nahpad, natech
Selectable: Selectable:
Bounds: 30,24 Bounds: 30,24
Voice: Scrin Voiced:
VoiceSet: Scrin
Plane: Plane:
MaximumPitch: 90 MaximumPitch: 90
ROT: 3 ROT: 3

View File

@@ -6,7 +6,8 @@ WEEDGUY:
Name: Chem Spray Infantry Name: Chem Spray Infantry
Selectable: Selectable:
Bounds: 12,17,0,-6 Bounds: 12,17,0,-6
Voice: Weed Voiced:
VoiceSet: Weed
Mobile: Mobile:
Speed: 42 Speed: 42
Health: Health:
@@ -35,7 +36,8 @@ UMAGON:
Name: Umagon Name: Umagon
Selectable: Selectable:
Bounds: 12,17,0,-6 Bounds: 12,17,0,-6
Voice: Umagon Voiced:
VoiceSet: Umagon
Mobile: Mobile:
Speed: 71 Speed: 71
Health: Health:
@@ -65,8 +67,9 @@ CHAMSPY:
Cost: 700 Cost: 700
DisguiseToolTip: DisguiseToolTip:
Name: Chameleon Spy Name: Chameleon Spy
Voiced:
VoiceSet: Spy
Selectable: Selectable:
Voice: Spy
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Health: Health:
HP: 120 HP: 120
@@ -99,7 +102,8 @@ MUTANT:
Name: Mutant Name: Mutant
Selectable: Selectable:
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Voice: Mutant Voiced:
VoiceSet: Mutant
Health: Health:
HP: 50 HP: 50
PoisonedByTiberium: PoisonedByTiberium:
@@ -130,7 +134,8 @@ MWMN:
Name: Mutant Soldier Name: Mutant Soldier
Selectable: Selectable:
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Voice: CivilianFemale Voiced:
VoiceSet: CivilianFemale
Health: Health:
HP: 50 HP: 50
PoisonedByTiberium: PoisonedByTiberium:
@@ -161,7 +166,8 @@ MUTANT3:
Name: Mutant Sergeant Name: Mutant Sergeant
Selectable: Selectable:
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Voice: Mutant Voiced:
VoiceSet: Mutant
Health: Health:
HP: 50 HP: 50
PoisonedByTiberium: PoisonedByTiberium:
@@ -192,7 +198,8 @@ TRATOS:
Name: Tratos Name: Tratos
Selectable: Selectable:
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Voice: Tratos Voiced:
VoiceSet: Tratos
Health: Health:
HP: 200 HP: 200
PoisonedByTiberium: PoisonedByTiberium:
@@ -221,7 +228,8 @@ OXANNA:
Name: Oxanna Name: Oxanna
Selectable: Selectable:
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Voice: Oxanna Voiced:
VoiceSet: Oxanna
Health: Health:
HP: 50 HP: 50
Mobile: Mobile:
@@ -248,7 +256,8 @@ SLAV:
Name: Slavick Name: Slavick
Selectable: Selectable:
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Voice: Slavick Voiced:
VoiceSet: Slavick
Health: Health:
HP: 300 HP: 300
Mobile: Mobile:
@@ -284,8 +293,8 @@ DOGGIE:
Range: 4c0 Range: 4c0
Mobile: Mobile:
Speed: 113 Speed: 113
Selectable: Voiced:
Voice: Fiend VoiceSet: Fiend
TargetableUnit: TargetableUnit:
TargetTypes: Ground TargetTypes: Ground
Armament: Armament:
@@ -314,8 +323,8 @@ VISSML:
Speed: 113 Speed: 113
ROT: 16 ROT: 16
-Crushable: -Crushable:
Selectable: Voiced:
Voice: Fiend VoiceSet: Fiend
TargetableUnit: TargetableUnit:
TargetTypes: Ground TargetTypes: Ground
-AutoTarget: -AutoTarget:
@@ -342,8 +351,8 @@ VISLRG:
Speed: 113 Speed: 113
ROT: 16 ROT: 16
-Crushable: -Crushable:
Selectable: Voiced:
Voice: Fiend VoiceSet: Fiend
TargetableUnit: TargetableUnit:
TargetTypes: Ground TargetTypes: Ground
Armament: Armament:

View File

@@ -185,7 +185,8 @@
SelectionDecorations: SelectionDecorations:
Palette: pips Palette: pips
Selectable: Selectable:
Voice: Infantry Voiced:
VoiceSet: Infantry
TargetableUnit: TargetableUnit:
TargetTypes: Ground, Infantry TargetTypes: Ground, Infantry
RenderSprites: RenderSprites:
@@ -250,8 +251,9 @@
^CivilianInfantry: ^CivilianInfantry:
Inherits: ^Infantry Inherits: ^Infantry
Selectable: Selectable:
Voice: Civilian
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Voiced:
VoiceSet: Civilian
Valued: Valued:
Cost: 10 Cost: 10
Tooltip: Tooltip:
@@ -281,10 +283,11 @@
Tiberium: 80 Tiberium: 80
BlueTiberium: 80 BlueTiberium: 80
ROT: 5 ROT: 5
Selectable:
SelectionDecorations: SelectionDecorations:
Palette: pips Palette: pips
Selectable: Voiced:
Voice: Vehicle VoiceSet: Vehicle
TargetableUnit: TargetableUnit:
TargetTypes: Ground, Vehicle TargetTypes: Ground, Vehicle
Repairable: Repairable:
@@ -365,10 +368,11 @@
Tiberium: 80 Tiberium: 80
BlueTiberium: 80 BlueTiberium: 80
ROT: 5 ROT: 5
Selectable:
SelectionDecorations: SelectionDecorations:
Palette: pips Palette: pips
Selectable: Voiced:
Voice: Vehicle VoiceSet: Vehicle
TargetableUnit: TargetableUnit:
TargetTypes: Ground, Vehicle TargetTypes: Ground, Vehicle
Repairable: Repairable:
@@ -442,10 +446,11 @@
TargetableAircraft: TargetableAircraft:
TargetTypes: Air TargetTypes: Air
GroundedTargetTypes: Ground GroundedTargetTypes: Ground
Selectable:
SelectionDecorations: SelectionDecorations:
Palette: pips Palette: pips
Selectable: Voiced:
Voice: Heli VoiceSet: Heli
Helicopter: Helicopter:
RepairBuildings: gadept RepairBuildings: gadept
RearmBuildings: RearmBuildings:

View File

@@ -44,7 +44,8 @@ MEDIC:
Prerequisites: ~gapile Prerequisites: ~gapile
Selectable: Selectable:
Bounds: 12,17,0,-6 Bounds: 12,17,0,-6
Voice: Medic Voiced:
VoiceSet: Medic
Mobile: Mobile:
Speed: 56 Speed: 56
Health: Health:

View File

@@ -106,8 +106,9 @@ SMECH:
Weapon: AssaultCannon Weapon: AssaultCannon
RenderSprites: RenderSprites:
WithInfantryBody: WithInfantryBody:
Voiced:
VoiceSet: Mech
Selectable: Selectable:
Voices: Mech
Bounds: 20, 32, 0, -8 Bounds: 20, 32, 0, -8
MMCH: MMCH:

View File

@@ -11,7 +11,8 @@ E3:
Description: Anti-tank infantry.\n Strong vs Vehicles, Aircraft, Buildings\n Weak vs Infantry Description: Anti-tank infantry.\n Strong vs Vehicles, Aircraft, Buildings\n Weak vs Infantry
Selectable: Selectable:
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Voice: Rocket Voiced:
VoiceSet: Rocket
Health: Health:
HP: 100 HP: 100
Mobile: Mobile:
@@ -47,7 +48,8 @@ CYBORG:
-Crushable: -Crushable:
Selectable: Selectable:
Bounds: 14,30,0,-7 Bounds: 14,30,0,-7
Voice: Cyborg Voiced:
VoiceSet: Cyborg
Mobile: Mobile:
Speed: 56 Speed: 56
Health: Health:
@@ -88,7 +90,8 @@ CYC2:
-Crushable: -Crushable:
Selectable: Selectable:
Bounds: 14,30,0,-7 Bounds: 14,30,0,-7
Voice: CyborgCommando Voiced:
VoiceSet: CyborgCommando
Mobile: Mobile:
Speed: 56 Speed: 56
Health: Health:
@@ -126,7 +129,8 @@ MHIJACK:
Description: Hijacks enemy vehicles.\n Unarmed Description: Hijacks enemy vehicles.\n Unarmed
Selectable: Selectable:
Bounds: 12,17,0,-9 Bounds: 12,17,0,-9
Voice: Hijacker Voiced:
VoiceSet: Hijacker
Health: Health:
HP: 300 HP: 300
PoisonedByTiberium: PoisonedByTiberium:

View File

@@ -165,6 +165,8 @@ GATICK:
Type: Concrete Type: Concrete
RevealsShroud: RevealsShroud:
Range: 5c0 Range: 5c0
Voiced:
VoiceSet: Vehicle
Turreted: Turreted:
ROT: 6 ROT: 6
InitialFacing: 128 InitialFacing: 128
@@ -215,8 +217,8 @@ GAARTY:
Type: Light Type: Light
RevealsShroud: RevealsShroud:
Range: 9c0 Range: 9c0
Selectable: Voiced:
Voice: Vehicle VoiceSet: Vehicle
Turreted: Turreted:
ROT: 5 ROT: 5
InitialFacing: 128 InitialFacing: 128

View File

@@ -49,7 +49,8 @@ ENGINEER:
Prerequisites: ~barracks Prerequisites: ~barracks
Selectable: Selectable:
Bounds: 12,17,0,-6 Bounds: 12,17,0,-6
Voice: Engineer Voiced:
VoiceSet: Engineer
Mobile: Mobile:
Speed: 56 Speed: 56
Health: Health: