diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs index 8f0da268e0..36a817efa8 100644 --- a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs +++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs @@ -45,6 +45,12 @@ namespace OpenRA.Mods.Common.UtilityCommands } } + internal static string MultiplyByFactor(int oldValue, int factor) + { + oldValue = oldValue * factor; + return oldValue.ToString(); + } + internal static void UpgradeActorRules(ModData modData, int engineVersion, ref List nodes, MiniYamlNode parent, int depth) { var addNodes = new List(); @@ -1295,6 +1301,78 @@ namespace OpenRA.Mods.Common.UtilityCommands } } + // Multiply all health and damage in the RA mod by 100 to avoid issues caused by rounding + if (engineVersion < 20171212) + { + var mod = modData.Manifest.Id; + if (mod == "ra") + { + if (node.Key == "HP" && parent.Key == "Health") + { + var oldValue = FieldLoader.GetValue(node.Key, node.Value.Value); + node.Value.Value = MultiplyByFactor(oldValue, 100); + } + + if (node.Key.StartsWith("SelfHealing")) + { + var step = node.Value.Nodes.FirstOrDefault(n => n.Key == "Step"); + if (step == null) + node.Value.Nodes.Add(new MiniYamlNode("Step", "500")); + else if (step != null) + { + var oldValue = FieldLoader.GetValue(step.Key, step.Value.Value); + step.Value.Value = MultiplyByFactor(oldValue, 100); + } + } + + if (node.Key == "RepairsUnits") + { + var step = node.Value.Nodes.FirstOrDefault(n => n.Key == "HpPerStep"); + if (step == null) + node.Value.Nodes.Add(new MiniYamlNode("HpPerStep", "1000")); + else if (step != null) + { + var oldValue = FieldLoader.GetValue(step.Key, step.Value.Value); + step.Value.Value = MultiplyByFactor(oldValue, 100); + } + } + + if (node.Key == "RepairableBuilding") + { + var step = node.Value.Nodes.FirstOrDefault(n => n.Key == "RepairStep"); + if (step == null) + node.Value.Nodes.Add(new MiniYamlNode("RepairStep", "700")); + else if (step != null) + { + var oldValue = FieldLoader.GetValue(step.Key, step.Value.Value); + step.Value.Value = MultiplyByFactor(oldValue, 100); + } + } + + if (node.Key == "Burns") + { + var step = node.Value.Nodes.FirstOrDefault(n => n.Key == "Damage"); + if (step == null) + node.Value.Nodes.Add(new MiniYamlNode("Damage", "100")); + else if (step != null) + { + var oldValue = FieldLoader.GetValue(step.Key, step.Value.Value); + step.Value.Value = MultiplyByFactor(oldValue, 100); + } + } + + if (node.Key == "DamagedByTerrain") + { + var step = node.Value.Nodes.FirstOrDefault(n => n.Key == "Damage"); + if (step != null) + { + var oldValue = FieldLoader.GetValue(step.Key, step.Value.Value); + step.Value.Value = MultiplyByFactor(oldValue, 100); + } + } + } + } + UpgradeActorRules(modData, engineVersion, ref node.Value.Nodes, node, depth + 1); } @@ -1439,6 +1517,20 @@ namespace OpenRA.Mods.Common.UtilityCommands if (node.Key == "BurstDelay") node.Key = "BurstDelays"; + // Multiply all health and damage in the RA mod by 100 to avoid issues caused by rounding + if (engineVersion < 20171212) + { + var mod = modData.Manifest.Id; + if (mod == "ra") + { + if (node.Key == "Damage" && (parent.Value.Value == "SpreadDamage" || parent.Value.Value == "TargetDamage")) + { + var oldValue = FieldLoader.GetValue(node.Key, node.Value.Value); + node.Value.Value = MultiplyByFactor(oldValue, 100); + } + } + } + UpgradeWeaponRules(modData, engineVersion, ref node.Value.Nodes, node, depth + 1); } }