Files
OpenRA/OpenRA.Mods.Common/UtilityCommands/OutputActorMiniYamlCommand.cs
2016-08-08 22:23:16 +01:00

55 lines
1.5 KiB
C#

using System;
using System.IO;
using System.Linq;
using OpenRA.FileSystem;
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(Utility utility, string[] args)
{
// HACK: The engine code assumes that Game.modData is set.
var modData = Game.ModData = utility.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, new Folder(".")));
}
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());
}
}
}