From aa5b9401c33dcfa978ead2ee9e48c4212b2f8806 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Fri, 30 Mar 2018 11:30:53 +0000 Subject: [PATCH] Add Chrome update plumbing. --- OpenRA.Mods.Common/UpdateRules/UpdateRule.cs | 5 ++++ OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/OpenRA.Mods.Common/UpdateRules/UpdateRule.cs b/OpenRA.Mods.Common/UpdateRules/UpdateRule.cs index 9b77bda5fe..d84a9017ff 100644 --- a/OpenRA.Mods.Common/UpdateRules/UpdateRule.cs +++ b/OpenRA.Mods.Common/UpdateRules/UpdateRule.cs @@ -24,8 +24,13 @@ namespace OpenRA.Mods.Common.UpdateRules /// An enumerable of manual steps to be run by the user public delegate IEnumerable TopLevelNodeTransform(ModData modData, MiniYamlNode node); + /// Defines a transformation that is run on each widget node in a chrome yaml file set. + /// An enumerable of manual steps to be run by the user + public delegate IEnumerable ChromeNodeTransform(ModData modData, MiniYamlNode widgetNode); + public virtual IEnumerable UpdateActorNode(ModData modData, MiniYamlNode actorNode) { yield break; } public virtual IEnumerable UpdateWeaponNode(ModData modData, MiniYamlNode weaponNode) { yield break; } + public virtual IEnumerable UpdateChromeNode(ModData modData, MiniYamlNode chromeNode) { yield break; } public virtual IEnumerable UpdateTilesetNode(ModData modData, MiniYamlNode tilesetNode) { yield break; } public virtual IEnumerable BeforeUpdate(ModData modData) { yield break; } diff --git a/OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs b/OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs index 3bdfa160d2..74ebf7c1f1 100644 --- a/OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs +++ b/OpenRA.Mods.Common/UpdateRules/UpdateUtils.cs @@ -109,6 +109,7 @@ namespace OpenRA.Mods.Common.UpdateRules manualSteps.AddRange(ApplyTopLevelTransform(modData, modRules, rule.UpdateActorNode)); manualSteps.AddRange(ApplyTopLevelTransform(modData, modWeapons, rule.UpdateWeaponNode)); manualSteps.AddRange(ApplyTopLevelTransform(modData, modTilesets, rule.UpdateTilesetNode)); + manualSteps.AddRange(ApplyChromeTransform(modData, modChromeLayout, rule.UpdateChromeNode)); manualSteps.AddRange(rule.AfterUpdate(modData)); files = modRules.ToList(); @@ -119,6 +120,29 @@ namespace OpenRA.Mods.Common.UpdateRules return manualSteps; } + static IEnumerable ApplyChromeTransformInner(ModData modData, MiniYamlNode current, UpdateRule.ChromeNodeTransform transform) + { + foreach (var manualStep in transform(modData, current)) + yield return manualStep; + + var childrenNode = current.Value.Nodes.FirstOrDefault(n => n.Key == "Children"); + if (childrenNode != null) + foreach (var node in childrenNode.Value.Nodes) + foreach (var manualStep in ApplyChromeTransformInner(modData, node, transform)) + yield return manualStep; + } + + static IEnumerable ApplyChromeTransform(ModData modData, YamlFileSet files, UpdateRule.ChromeNodeTransform transform) + { + if (transform == null) + yield break; + + foreach (var file in files) + foreach (var node in file.Item3) + foreach (var manualStep in ApplyChromeTransformInner(modData, node, transform)) + yield return manualStep; + } + static IEnumerable ApplyTopLevelTransform(ModData modData, YamlFileSet files, UpdateRule.TopLevelNodeTransform transform) { if (transform == null)