diff --git a/OpenRA.Mods.Common/UpdateRules/Rules/ConvertSupportPowerRangesToFootprint.cs b/OpenRA.Mods.Common/UpdateRules/Rules/ConvertSupportPowerRangesToFootprint.cs new file mode 100644 index 0000000000..85c6deeeca --- /dev/null +++ b/OpenRA.Mods.Common/UpdateRules/Rules/ConvertSupportPowerRangesToFootprint.cs @@ -0,0 +1,102 @@ +#region Copyright & License Information +/* + * Copyright 2007-2020 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, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Linq; + +namespace OpenRA.Mods.Common.UpdateRules.Rules +{ + public class ConvertSupportPowerRangesToFootprint : UpdateRule + { + public override string Name { get { return "Convert support power ranges to footprint"; } } + public override string Description + { + get + { + return "ChronoshiftPower and GrantExternalConditionPower use footprint areas\n" + + "instead of a circular range and they no longer have a fallback default area value.\n" + + "The old Range values will be converted to footprints as part of this update."; + } + } + + static readonly string[] AffectedTraits = new string[] { "GrantExternalConditionPower", "ChronoshiftPower" }; + + public override IEnumerable UpdateActorNode(ModData modData, MiniYamlNode actorNode) + { + foreach (var at in AffectedTraits) + foreach (var trait in actorNode.ChildrenMatching(at)) + UpdatePower(trait); + + yield break; + } + + void UpdatePower(MiniYamlNode power) + { + var range = 1; + var rangeNode = power.LastChildMatching("Range"); + if (rangeNode != null) + { + range = rangeNode.NodeValue(); + if (range > 3) + locations.Add("{0} ({1})".F(rangeNode.Key, rangeNode.Location.Filename)); + + power.RemoveNode(rangeNode); + } + + var size = 2 * range + 1; + power.AddNode(new MiniYamlNode("Dimensions", size.ToString() + ", " + size.ToString())); + + var footprint = string.Empty; + + var emptycell = range; + var affectedcell = 1; + + for (var i = 0; i < size; i++) + { + for (var e = 0; e < emptycell; e++) + footprint += '_'; + + for (var a = 0; a < affectedcell; a++) + footprint += 'x'; + + for (var e = 0; e < emptycell; e++) + footprint += '_'; + + if (i < range) + { + emptycell--; + affectedcell += 2; + } + else + { + emptycell++; + affectedcell -= 2; + } + + footprint += ' '; + } + + power.AddNode(new MiniYamlNode("Footprint", footprint)); + } + + readonly List locations = new List(); + + public override IEnumerable AfterUpdate(ModData modData) + { + if (locations.Any()) + yield return "Please check and adjust the new auto-generated dimensions.\n" + + UpdateUtils.FormatMessageList(locations); + + locations.Clear(); + } + } +} diff --git a/OpenRA.Mods.Common/UpdateRules/UpdatePath.cs b/OpenRA.Mods.Common/UpdateRules/UpdatePath.cs index 9578041794..80b4e2e98e 100644 --- a/OpenRA.Mods.Common/UpdateRules/UpdatePath.cs +++ b/OpenRA.Mods.Common/UpdateRules/UpdatePath.cs @@ -63,6 +63,7 @@ namespace OpenRA.Mods.Common.UpdateRules new RenameWithNukeLaunch(), new SpawnActorPowerDefaultEffect(), new RemoveConditionManager(), + new ConvertSupportPowerRangesToFootprint(), }) };