From 13593618327e7cbee5a2cb7e62e3b22dec39953e Mon Sep 17 00:00:00 2001 From: Taryn Hill Date: Sun, 3 Apr 2016 08:03:49 -0500 Subject: [PATCH] Add a utility command to output an actor's MiniYaml tree Possibly taking in a path (to a .zip/.oramap/directory). --- OpenRA.Mods.Common/OpenRA.Mods.Common.csproj | 1 + .../OutputActorMiniYamlCommand.cs | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 OpenRA.Mods.Common/UtilityCommands/OutputActorMiniYamlCommand.cs diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index dc9cfbffbb..27170c8382 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -755,6 +755,7 @@ + diff --git a/OpenRA.Mods.Common/UtilityCommands/OutputActorMiniYamlCommand.cs b/OpenRA.Mods.Common/UtilityCommands/OutputActorMiniYamlCommand.cs new file mode 100644 index 0000000000..f4c39ff1ae --- /dev/null +++ b/OpenRA.Mods.Common/UtilityCommands/OutputActorMiniYamlCommand.cs @@ -0,0 +1,51 @@ +using System; +using System.IO; +using System.Linq; + +namespace OpenRA.Mods.Common.UtilityCommands +{ + public class OutputActorMiniYamlCommand : IUtilityCommand + { + string IUtilityCommand.Name { get { return "--actor-yaml"; } } + + bool IUtilityCommand.ValidateArguments(string[] args) + { + return args.Length == 2 || args.Length == 3; + } + + [Desc("ACTOR-TYPE [PATH/TO/MAP]", "Display the finalized, merged MiniYaml tree for the given actor type. Input values are case-sensitive.")] + void IUtilityCommand.Run(ModData modData, string[] args) + { + // HACK: The engine code assumes that Game.modData is set. + Game.ModData = modData; + + var actorType = args[1]; + string mapPath = null; + + Map map = null; + if (args.Length == 3) + try + { + mapPath = args[2]; + map = new Map(modData, modData.ModFiles.OpenPackage(mapPath)); + } + catch (InvalidDataException) + { + Console.WriteLine("Could not load map '{0}'.", mapPath); + Environment.Exit(2); + } + + var fs = map ?? modData.DefaultFileSystem; + var topLevelNodes = MiniYaml.Load(fs, modData.Manifest.Rules, map == null ? null : map.RuleDefinitions); + + var result = topLevelNodes.FirstOrDefault(n => n.Key == actorType); + if (result == null) + { + Console.WriteLine("Could not find actor '{0}' (name is case-sensitive).", actorType); + Environment.Exit(1); + } + + Console.WriteLine(result.Value.Nodes.WriteToString()); + } + } +}