From 0904b6a1a4d51c59b4fdfb5eedf028e21849ebc0 Mon Sep 17 00:00:00 2001 From: UberWaffe Date: Tue, 5 Aug 2014 16:27:22 +0200 Subject: [PATCH] Fixed UpgradeRules for #6030. --- OpenRA.Utility/UpgradeRules.cs | 90 +++++++++++++++++++++++++++------- 1 file changed, 72 insertions(+), 18 deletions(-) diff --git a/OpenRA.Utility/UpgradeRules.cs b/OpenRA.Utility/UpgradeRules.cs index bb6ef61b7c..ff15610213 100644 --- a/OpenRA.Utility/UpgradeRules.cs +++ b/OpenRA.Utility/UpgradeRules.cs @@ -475,6 +475,9 @@ namespace OpenRA.Utility // Split out the warheads to individual warhead types. if (depth == 0) { + var validTargets = node.Value.Nodes.FirstOrDefault(n => n.Key == "ValidTargets"); // Weapon's ValidTargets need to be copied to the warheads, so find it + var invalidTargets = node.Value.Nodes.FirstOrDefault(n => n.Key == "InvalidTargets"); // Weapon's InvalidTargets need to be copied to the warheads, so find it + var warheadCounter = 0; foreach(var curNode in node.Value.Nodes.ToArray()) { @@ -493,14 +496,27 @@ namespace OpenRA.Utility var newYaml = new List(); - var keywords = new List{ "Size","Damage","InfDeath","PreventProne","ProneModifier","Delay","ValidTargets","InvalidTargets" }; + var temp = curNode.Value.Nodes.FirstOrDefault(n => n.Key == "Size"); // New PerCell warhead allows 2 sizes, as opposed to 1 size + if (temp != null) + { + var newValue = temp.Value.Value.Split(',').First(); + newYaml.Add(new MiniYamlNode("Size", newValue)); + } + + var keywords = new List{ "Damage", "InfDeath", "PreventProne", "ProneModifier", "Delay" }; + foreach(var keyword in keywords) { - var temp = curNode.Value.Nodes.FirstOrDefault(n => n.Key == keyword); - if (temp != null) - newYaml.Add(new MiniYamlNode(keyword, temp.Value.Value)); + var temp2 = curNode.Value.Nodes.FirstOrDefault(n => n.Key == keyword); + if (temp2 != null) + newYaml.Add(new MiniYamlNode(keyword, temp2.Value.Value)); } + if (validTargets != null) + newYaml.Add(validTargets); + if (invalidTargets != null) + newYaml.Add(invalidTargets); + var tempVersus = curNode.Value.Nodes.FirstOrDefault(n => n.Key == "Versus"); if (tempVersus != null) newYaml.Add(new MiniYamlNode("Versus", tempVersus.Value)); @@ -516,17 +532,15 @@ namespace OpenRA.Utility var newYaml = new List(); - var temp = curNode.Value.Nodes.FirstOrDefault(n => n.Key == "Size"); // New HealthPercentage warhead allows spreads, as opposed to size + var temp = curNode.Value.Nodes.FirstOrDefault(n => n.Key == "Size"); // New HealthPercentage warhead allows 2 spreads, as opposed to 1 size if (temp != null) { var newValue = temp.Value.Value.Split(',').First() + "c0"; - if (temp.Value.Value.Contains(',')) - newValue = newValue + "," + temp.Value.Value.Split(',')[1] + "c0"; ; - newYaml.Add(new MiniYamlNode("Spread", newValue)); } - var keywords = new List{ "Damage","InfDeath","PreventProne","ProneModifier","Delay","ValidTargets","InvalidTargets" }; + var keywords = new List{ "Damage", "InfDeath", "PreventProne", "ProneModifier", "Delay" }; + foreach(var keyword in keywords) { var temp2 = curNode.Value.Nodes.FirstOrDefault(n => n.Key == keyword); @@ -534,6 +548,11 @@ namespace OpenRA.Utility newYaml.Add(new MiniYamlNode(keyword, temp2.Value.Value)); } + if (validTargets != null) + newYaml.Add(validTargets); + if (invalidTargets != null) + newYaml.Add(invalidTargets); + var tempVersus = curNode.Value.Nodes.FirstOrDefault(n => n.Key == "Versus"); if (tempVersus != null) newYaml.Add(new MiniYamlNode("Versus", tempVersus.Value)); @@ -547,7 +566,8 @@ namespace OpenRA.Utility var newYaml = new List(); - var keywords = new List{ "Spread","Damage","InfDeath","PreventProne","ProneModifier","Delay","ValidTargets","InvalidTargets" }; + var keywords = new List{ "Spread", "Damage", "InfDeath", "PreventProne", "ProneModifier", "Delay" }; + foreach(var keyword in keywords) { var temp = curNode.Value.Nodes.FirstOrDefault(n => n.Key == keyword); @@ -555,6 +575,11 @@ namespace OpenRA.Utility newYaml.Add(new MiniYamlNode(keyword, temp.Value.Value)); } + if (validTargets != null) + newYaml.Add(validTargets); + if (invalidTargets != null) + newYaml.Add(invalidTargets); + var tempVersus = curNode.Value.Nodes.FirstOrDefault(n => n.Key == "Versus"); if (tempVersus != null) newYaml.Add(new MiniYamlNode("Versus", tempVersus.Value)); @@ -570,7 +595,7 @@ namespace OpenRA.Utility var newYaml = new List(); - var keywords = new List{ "Size","Delay","ValidTargets","InvalidTargets" }; + var keywords = new List{ "Size", "Delay", "ValidTargets", "InvalidTargets" }; foreach(var keyword in keywords) { var temp = curNode.Value.Nodes.FirstOrDefault(n => n.Key == keyword); @@ -588,7 +613,8 @@ namespace OpenRA.Utility var newYaml = new List(); - var keywords = new List{ "AddsResourceType","Size","Delay","ValidTargets","InvalidTargets" }; + var keywords = new List{ "AddsResourceType", "Size", "Delay", "ValidTargets", "InvalidTargets" }; + foreach(var keyword in keywords) { var temp = curNode.Value.Nodes.FirstOrDefault(n => n.Key == keyword); @@ -606,7 +632,8 @@ namespace OpenRA.Utility var newYaml = new List(); - var keywords = new List{ "SmudgeType","Size","Delay","ValidTargets","InvalidTargets" }; + var keywords = new List{ "SmudgeType", "Size", "Delay", "ValidTargets", "InvalidTargets" }; + foreach(var keyword in keywords) { var temp = curNode.Value.Nodes.FirstOrDefault(n => n.Key == keyword); @@ -617,23 +644,50 @@ namespace OpenRA.Utility newNodes.Add(new MiniYamlNode("Warhead@" + warheadCounter.ToString() + "Smu" + oldNodeAtName, "LeaveSmudge", newYaml)); } - // CreateEffect + // CreateEffect - Explosion if (curNode.Value.Nodes.Where(n => n.Key.Contains("Explosion") || - n.Key.Contains("WaterExplosion") || - n.Key.Contains("ImpactSound") || - n.Key.Contains("WaterImpactSound")).Any()) + n.Key.Contains("ImpactSound")).Any()) { warheadCounter++; var newYaml = new List(); - var keywords = new List{ "Explosion","WaterExplosion","ImpactSound","WaterImpactSound","Delay","ValidTargets","InvalidTargets" }; + var keywords = new List{ "Explosion", "ImpactSound", "Delay", "ValidTargets", "InvalidTargets", "ValidImpactTypes", "InvalidImpactTypes" }; + foreach(var keyword in keywords) { var temp = curNode.Value.Nodes.FirstOrDefault(n => n.Key == keyword); if (temp != null) newYaml.Add(new MiniYamlNode(keyword, temp.Value.Value)); } + newYaml.Add(new MiniYamlNode("InvalidImpactTypes", "Water")); + + newNodes.Add(new MiniYamlNode("Warhead@" + warheadCounter.ToString() + "Eff" + oldNodeAtName, "CreateEffect", newYaml)); + } + + // CreateEffect - Water Explosion + if (curNode.Value.Nodes.Where(n => n.Key.Contains("WaterExplosion") || + n.Key.Contains("WaterImpactSound")).Any()) + { + warheadCounter++; + + var newYaml = new List(); + + var keywords = new List{ "WaterExplosion", "WaterImpactSound", "Delay", "ValidTargets", "InvalidTargets", "ValidImpactTypes", "InvalidImpactTypes" }; + + foreach(var keyword in keywords) + { + var temp = curNode.Value.Nodes.FirstOrDefault(n => n.Key == keyword); + if (temp != null) + { + if (temp.Key == "WaterExplosion") + temp.Key = "Explosion"; + if (temp.Key == "WaterImpactSound") + temp.Key = "ImpactSound"; + newYaml.Add(new MiniYamlNode(temp.Key, temp.Value.Value)); + } + } + newYaml.Add(new MiniYamlNode("ValidImpactTypes", "Water")); newNodes.Add(new MiniYamlNode("Warhead@" + warheadCounter.ToString() + "Eff" + oldNodeAtName, "CreateEffect", newYaml)); }