diff --git a/kanimal-cli/Options.cs b/kanimal-cli/Options.cs index ed61154..d31b4e8 100644 --- a/kanimal-cli/Options.cs +++ b/kanimal-cli/Options.cs @@ -3,7 +3,7 @@ namespace kanimal_cli { - internal abstract class ProgramOptions + public abstract class ProgramOptions { [Option('v', "verbose", Required = false, HelpText = "Enable debug output.")] public bool Verbose { get; set; } @@ -15,21 +15,21 @@ internal abstract class ProgramOptions public string OutputPath { get; set; } = "output"; } - internal abstract class ConversionOptions : ProgramOptions + public abstract class ConversionOptions : ProgramOptions { [Option('S', "strict", Required = false, HelpText = "When writing to scml, enabling this flag ")] public bool Strict { get; set; } } [Verb("dump", HelpText = "Output a dump of the specified kanim.")] - internal class DumpOptions : ProgramOptions + public class DumpOptions : ProgramOptions { [Value(0)] public IEnumerable Files { get; set; } } // For ones with Output and Input specifiers [Verb("convert", HelpText = "Convert between formats.")] - internal class GenericOptions : ConversionOptions + public class GenericOptions : ConversionOptions { [Option('I', "input-format", Required = true, HelpText = "The input format, from [kanim, scml]")] public string InputFormat { get; set; } @@ -41,19 +41,19 @@ internal class GenericOptions : ConversionOptions } [Verb("scml", HelpText = "Convert kanim to scml. Convenience verb equivalent to 'convert -I kanim -O scml'.")] - internal class KanimToScmlOptions : ConversionOptions + public class KanimToScmlOptions : ConversionOptions { [Value(0)] public IEnumerable Files { get; set; } } [Verb("kanim", HelpText = "Convert scml to kanim. Convenience verb equivalent to 'convert -I scml -O kanim'.")] - internal class ScmlToKanimOptions : ConversionOptions + public class ScmlToKanimOptions : ConversionOptions { [Value(0)] public string ScmlFile { get; set; } } [Verb("batch-convert", HelpText = "Given an Assets/ directory, attempt to batch convert kanim to scml.")] - internal class BatchConvertOptions : ConversionOptions + public class BatchConvertOptions : ConversionOptions { [Value(0)] public string AssetDirectory { get; set; } } diff --git a/kanimal-cli/Program.cs b/kanimal-cli/Program.cs index 266cdee..aec1125 100644 --- a/kanimal-cli/Program.cs +++ b/kanimal-cli/Program.cs @@ -2,25 +2,22 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Runtime.ExceptionServices; -using NLog; using CommandLine; using kanimal; +using NLog; using NLog.Config; -using NLog.Filters; -using NLog.Fluent; +using NLog.Targets; namespace kanimal_cli { - internal class Program + public class Program { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static LoggingConfiguration GetLoggerConfig(ProgramOptions o) { - var config = new NLog.Config.LoggingConfiguration(); - var targetConsole = new NLog.Targets.ConsoleTarget("logconsole"); - targetConsole.Layout = "[${level}] ${message}"; + var config = new LoggingConfiguration(); + var targetConsole = new ConsoleTarget("logconsole") {Layout = "[${level}] ${message}"}; if (o.Verbose && o.Silent) { @@ -37,7 +34,7 @@ private static LoggingConfiguration GetLoggerConfig(ProgramOptions o) return config; } - + private static void SetVerbosity(ProgramOptions o) { LogManager.Configuration = GetLoggerConfig(o); @@ -59,8 +56,10 @@ private static void Convert(string inputFormat, string outputFormat, List path.EndsWith(".scml")); - var scmlreader = new ScmlReader(scml); - scmlreader.AllowMissingSprites = !opt.Strict; + var scmlreader = new ScmlReader(scml) + { + AllowMissingSprites = !opt.Strict + }; scmlreader.Read(); reader = scmlreader; break; @@ -69,6 +68,30 @@ private static void Convert(string inputFormat, string outputFormat, List path.EndsWith("build.bytes")); var anim = files.Find(path => path.EndsWith("anim.bytes")); + var fileNames = new[] {png, build, anim}; + + var nullCount = fileNames.Count(o => o == null); + if (nullCount > 0) + { + Logger.Fatal($"The following file{(nullCount > 1 ? "s were" : "was")} not specified:"); + for (var i = 0; i < 3; ++i) + if (fileNames[i] == null) + switch (i) + { + case 0: + Logger.Fatal(" png"); + break; + case 1: + Logger.Fatal(" build"); + break; + case 2: + Logger.Fatal(" anim"); + break; + } + + Environment.Exit((int) ExitCodes.IncorrectArguments); + } + reader = new KanimReader( new FileStream(build, FileMode.Open), new FileStream(anim, FileMode.Open), @@ -87,8 +110,10 @@ private static void Convert(string inputFormat, string outputFormat, List(args) + Parser.Default + .ParseArguments(args) .WithParsed(o => Convert( "kanim", "scml", @@ -133,15 +160,14 @@ private static void Main(string[] args) .WithParsed(o => Convert( "scml", "kanim", - new List {o.ScmlFile}, + o.ScmlFile == null ? new List() : new List {o.ScmlFile}, o)) .WithParsed(o => Convert(o.InputFormat, o.OutputFormat, o.Files.ToList(), o)) .WithParsed(o => { // Silence Info output from kanimal var config = new LoggingConfiguration(); - var target = new NLog.Targets.ConsoleTarget("logconsole"); - target.Layout = "[${level}] ${message}"; + var target = new ConsoleTarget("logconsole") {Layout = "[${level}] ${message}"}; var loggingRule1 = new LoggingRule("kanimal_cli.*", target); loggingRule1.SetLoggingLevels(LogLevel.Info, LogLevel.Fatal); config.LoggingRules.Add(loggingRule1); @@ -153,12 +179,13 @@ private static void Main(string[] args) if (!Directory.Exists(Path.Join(o.AssetDirectory, "Texture2D"))) { Logger.Fatal($"The path \"{o.AssetDirectory}/Texture2D\" does not exist."); - Environment.Exit((int)ExitCodes.IncorrectArguments); + Environment.Exit((int) ExitCodes.IncorrectArguments); } + if (!Directory.Exists(Path.Join(o.AssetDirectory, "TextAsset"))) { Logger.Fatal($"The path \"{o.AssetDirectory}/TextAsset\" does not exist."); - Environment.Exit((int)ExitCodes.IncorrectArguments); + Environment.Exit((int) ExitCodes.IncorrectArguments); } foreach (var filepath in Directory.GetFiles(Path.Join(o.AssetDirectory, "Texture2D"), "*.png")) @@ -170,24 +197,28 @@ private static void Main(string[] args) Logger.Warn($"Skipping \"{filename}\" as it does not seem to be a valid anim."); continue; } + var png = new FileStream(filepath, FileMode.Open); var animPath = Path.Join(o.AssetDirectory, "TextAsset", $"{basename}_anim.bytes"); var buildPath = Path.Join(o.AssetDirectory, "TextAsset", $"{basename}_build.bytes"); if (!File.Exists(animPath)) { - Logger.Warn($"Skipping \"{basename}\" because it does not have a corresponding anim.bytes file."); + Logger.Warn( + $"Skipping \"{basename}\" because it does not have a corresponding anim.bytes file."); continue; } if (!File.Exists(buildPath)) { - Logger.Warn($"Skipping \"{basename}\" because it does not have a corresponding build.bytes file."); + Logger.Warn( + $"Skipping \"{basename}\" because it does not have a corresponding build.bytes file."); continue; } + var anim = new FileStream(animPath, FileMode.Open); var build = new FileStream(buildPath, FileMode.Open); - + var reader = new KanimReader(build, anim, png); try { @@ -202,6 +233,7 @@ private static void Main(string[] args) Logger.Error("Skipping."); continue; } + Logger.Info($"Exported \"{reader.BuildData.Name}\"."); } });