diff --git a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj index 3da40b5047..c2b9a91125 100644 --- a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj +++ b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj @@ -86,7 +86,6 @@ - diff --git a/OpenRA.Mods.Cnc/Traits/SpawnViceroid.cs b/OpenRA.Mods.Cnc/Traits/SpawnViceroid.cs deleted file mode 100644 index cdeaf5444c..0000000000 --- a/OpenRA.Mods.Cnc/Traits/SpawnViceroid.cs +++ /dev/null @@ -1,59 +0,0 @@ -#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.Linq; -using OpenRA.Mods.Common.Warheads; -using OpenRA.Primitives; -using OpenRA.Traits; - -namespace OpenRA.Mods.Cnc.Traits -{ - class SpawnViceroidInfo : ITraitInfo - { - [ActorReference] public readonly string ViceroidActor = "vice"; - public readonly int Probability = 10; - public readonly string Owner = "Creeps"; - public readonly string DeathType = "TiberiumDeath"; - - public object Create(ActorInitializer init) { return new SpawnViceroid(this); } - } - - class SpawnViceroid : INotifyKilled - { - readonly SpawnViceroidInfo info; - - public SpawnViceroid(SpawnViceroidInfo info) { this.info = info; } - - public void Killed(Actor self, AttackInfo e) - { - if (!self.World.LobbyInfo.GlobalSettings.Creeps) return; - if (self.World.SharedRandom.Next(100) > info.Probability) return; - - var warhead = e.Warhead as DamageWarhead; - if (warhead == null || !warhead.DamageTypes.Contains(info.DeathType)) - return; - - self.World.AddFrameEndTask(w => - { - var td = new TypeDictionary - { - new LocationInit(self.Location), - new OwnerInit(self.World.Players.First(p => p.InternalName == info.Owner)) - }; - - var facing = self.TraitOrDefault(); - if (facing != null) - td.Add(new FacingInit(facing.Facing)); - - w.CreateActor(info.ViceroidActor, td); - }); - } - } -} diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs index 7a410b164a..a1d1637986 100644 --- a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs +++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs @@ -527,7 +527,7 @@ namespace OpenRA.Mods.Common.UtilityCommands if (depth == 2 && parentKey.StartsWith("DeathSounds") && node.Key == "InfDeaths") node.Key = "DeathTypes"; - if (depth == 2 && parentKey == "SpawnsViceroid" && node.Key == "InfDeath") + if (depth == 2 && parentKey == "SpawnViceroid" && node.Key == "InfDeath") node.Key = "DeathType"; if (depth == 2 && parentKey == "Explodes" && node.Key == "InfDeath") @@ -1409,7 +1409,7 @@ namespace OpenRA.Mods.Common.UtilityCommands var modifier = trait.Value.Nodes.FirstOrDefault(n => n.Key == type + "Modifier"); if (upgradeTypes == null || !string.IsNullOrEmpty(upgradeTypes.Value.Value) || modifier == null || - !string.IsNullOrEmpty(modifier.Value.Value)) + !string.IsNullOrEmpty(modifier.Value.Value)) { var yaml = new MiniYaml(null); if (modifier == null) @@ -1687,6 +1687,27 @@ namespace OpenRA.Mods.Common.UtilityCommands node.Key = "Sequences"; } + // SpawnViceroid was replaced by LeavesHusk + if (engineVersion < 20150719) + { + if (node.Key == "SpawnViceroid") + { + node.Key = "LeavesHusk"; + + var actor = node.Value.Nodes.FirstOrDefault(n => n.Key == "ViceroidActor"); + if (actor != null) + actor.Key = "HuskActor"; + // The default value of ViceroidActor was "vice" + else + node.Value.Nodes.Add(new MiniYamlNode("HuskActor", "vice")); + + var probability = node.Value.Nodes.FirstOrDefault(n => n.Key == "Probability"); + // The default value of Probability was 10 + if (probability == null) + node.Value.Nodes.Add(new MiniYamlNode("Probability", "10")); + } + } + UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1); } } diff --git a/OpenRA.Mods.RA/Traits/LeavesHusk.cs b/OpenRA.Mods.RA/Traits/LeavesHusk.cs index 50d0568b4c..4f3c174a81 100644 --- a/OpenRA.Mods.RA/Traits/LeavesHusk.cs +++ b/OpenRA.Mods.RA/Traits/LeavesHusk.cs @@ -10,17 +10,38 @@ using System.Linq; using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Warheads; using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.RA.Traits { + public enum OwnerType { Victim, Killer, InternalName } + [Desc("Spawn another actor immediately upon death.")] public class LeavesHuskInfo : ITraitInfo { [ActorReference, FieldLoader.Require] + [Desc("Actor to spawn on death.")] public readonly string HuskActor = null; + [Desc("Probability the husk actor spawns.")] + public readonly int Probability = 100; + + [Desc("Owner of the husk actor. Allowed keywords:" + + "'Victim', 'Killer' and 'InternalName'.")] + public readonly OwnerType OwnerType = OwnerType.Victim; + + [Desc("Map player to use when 'InternalName' is defined on 'OwnerType'.")] + public readonly string InternalOwner = null; + + [Desc("DeathType that triggers the husk actor spawn." + + "Leave empty to spawn a husk actor ignoring the DeathTypes.")] + public readonly string DeathType = null; + + [Desc("Skips the husk actor's make animations if true.")] + public readonly bool SkipMakeAnimations = true; + public object Create(ActorInitializer init) { return new LeavesHusk(init, this); } } @@ -41,6 +62,13 @@ namespace OpenRA.Mods.RA.Traits if (!self.IsInWorld) return; + if (self.World.SharedRandom.Next(100) > info.Probability) + return; + + var warhead = e.Warhead as DamageWarhead; + if (info.DeathType != null && warhead != null && !warhead.DamageTypes.Contains(info.DeathType)) + return; + self.World.AddFrameEndTask(w => { var td = new TypeDictionary @@ -48,11 +76,19 @@ namespace OpenRA.Mods.RA.Traits new ParentActorInit(self), new LocationInit(self.Location), new CenterPositionInit(self.CenterPosition), - new OwnerInit(self.Owner), - new FactionInit(race), - new SkipMakeAnimsInit() + new FactionInit(race) }; + if (info.OwnerType == OwnerType.Victim) + td.Add(new OwnerInit(self.Owner)); + else if (info.OwnerType == OwnerType.Killer) + td.Add(new OwnerInit(e.Attacker.Owner)); + else + td.Add(new OwnerInit(self.World.Players.First(p => p.InternalName == info.InternalOwner))); + + if (info.SkipMakeAnimations) + td.Add(new SkipMakeAnimsInit()); + // Allows the husk to drag to its final position var mobile = self.TraitOrDefault(); if (mobile != null) @@ -71,7 +107,8 @@ namespace OpenRA.Mods.RA.Traits if (turreted != null) td.Add(new TurretFacingInit(turreted.TurretFacing)); - var chronoshiftable = self.TraitOrDefault(); // TODO: untie this and move to Mods.Common + // TODO: untie this and move to Mods.Common + var chronoshiftable = self.TraitOrDefault(); if (chronoshiftable != null && chronoshiftable.ReturnTicks > 0) { td.Add(new ChronoshiftOriginInit(chronoshiftable.Origin));