Skip to content

Commit

Permalink
add xml to se hkx
Browse files Browse the repository at this point in the history
  • Loading branch information
ret2end committed Jan 7, 2023
1 parent 4580f72 commit 86adec1
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 18 deletions.
2 changes: 1 addition & 1 deletion HKX2Library
Submodule HKX2Library updated 600 files
4 changes: 3 additions & 1 deletion hkxconv/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,15 @@ static async Task<int> Main(string[] args)

var convertFormatOpt = new Option<ConvertFormat>(name: "-v", description: "Convert format.", getDefaultValue: () => ConvertFormat.xml);
var verboseOpt = new Option<bool>(name: "--verbose", description: "verbose", getDefaultValue: () => false);
//var ignoreErrorOpt = new Option<bool>(name: "--quiet", description: "ingore non-fatal error(content will be different from original)", getDefaultValue: () => false);
var inputDirArg = new Argument<FileSystemInfo>("Input dir or file");
var outputDirArg = new Argument<FileSystemInfo>("Output dir or file", getDefaultValue: () => new DirectoryInfo("."));

var convertCommand = new Command("convert", "Convert hkx file to other format")
{
convertFormatOpt,
verboseOpt,
//ignoreErrorOpt,
inputDirArg,
outputDirArg,
};
Expand All @@ -28,7 +30,7 @@ static async Task<int> Main(string[] args)

convertCommand.SetHandler((format, verbose, input, output) =>
{
cmd.Convert.ToFormat(input, output, format, verbose);
cmd.Convert.ToFormat(input, output, format, verbose, false);
}, convertFormatOpt, verboseOpt, inputDirArg, outputDirArg);

return await rootCommand.InvokeAsync(args);
Expand Down
47 changes: 31 additions & 16 deletions hkxconv/cmd/Convert.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ namespace hkxconv.cmd
public enum ConvertFormat
{
xml = 0,
//amd64 = 1,
hkx = 1,
//win32 = 2,
}
public class Convert
{
public static int ToFormat(FileSystemInfo input, FileSystemInfo output, ConvertFormat format, bool verbose)
public static int ToFormat(FileSystemInfo input, FileSystemInfo output, ConvertFormat format, bool verbose, bool ignoreError)
{
if (!input.Exists)
{
Expand All @@ -21,13 +21,13 @@ public static int ToFormat(FileSystemInfo input, FileSystemInfo output, ConvertF
switch ((input, output))
{
case (FileInfo inFile, FileInfo outFile):
retCode = ConvertHKX(inFile, outFile, format, verbose);
retCode = ConvertTo(inFile, outFile, format, verbose, ignoreError);
break;
case (FileInfo inFile, DirectoryInfo outDir):
retCode = ConvertHKX(inFile, outDir, format, verbose);
retCode = TraverseDir(inFile, outDir, format, verbose, ignoreError);
break;
case (DirectoryInfo inDir, DirectoryInfo outDir):
retCode = ConvertHKX(inDir, outDir, format, verbose);
retCode = TraverseDir(inDir, outDir, format, verbose, ignoreError);

break;
default:
Expand All @@ -36,19 +36,19 @@ public static int ToFormat(FileSystemInfo input, FileSystemInfo output, ConvertF
return retCode;
}

public static int ConvertHKX(DirectoryInfo inDir, DirectoryInfo outDir, ConvertFormat format, bool verbose)
public static int TraverseDir(DirectoryInfo inDir, DirectoryInfo outDir, ConvertFormat format, bool verbose, bool ignoreError)
{
if (!outDir.Exists)
Directory.CreateDirectory(outDir.Name);

int retCode;
foreach (var item in Directory.EnumerateFiles(inDir.ToString(), "*.hkx", SearchOption.AllDirectories))
foreach (var item in Directory.EnumerateFiles(inDir.ToString(), "*", SearchOption.AllDirectories))
{
var relativePath = Path.GetRelativePath(inDir.FullName, item);
var inFile = new FileInfo(Path.Combine(inDir.ToString(), relativePath));
var outFile = new FileInfo(Path.Combine(outDir.ToString(), Path.ChangeExtension(relativePath, format.ToString())));

retCode = ConvertHKX(inFile, outFile, format, verbose);
retCode = ConvertTo(inFile, outFile, format, verbose, ignoreError);
if (retCode != 0)
{
return retCode;
Expand All @@ -58,17 +58,18 @@ public static int ConvertHKX(DirectoryInfo inDir, DirectoryInfo outDir, ConvertF
return 0;
}

public static int ConvertHKX(FileInfo inFile, DirectoryInfo outDir, ConvertFormat format, bool verbose)
public static int TraverseDir(FileInfo inFile, DirectoryInfo outDir, ConvertFormat format, bool verbose, bool ignoreError)
{
if (!outDir.Exists)
Directory.CreateDirectory(outDir.Name);

var outFile = new FileInfo(Path.Combine(outDir.ToString(), Path.ChangeExtension(inFile.Name, format.ToString())));
return ConvertHKX(inFile, outFile, format, verbose);
return ConvertTo(inFile, outFile, format, verbose, ignoreError);
}

public static int ConvertHKX(FileInfo inFile, FileInfo outFile, ConvertFormat format, bool verbose)
public static int ConvertTo(FileInfo inFile, FileInfo outFile, ConvertFormat format, bool verbose, bool ignoreError)
{

if (verbose)
Console.WriteLine($"Convert {inFile} to {outFile}");
if (!outFile.Exists)
Expand All @@ -80,16 +81,30 @@ public static int ConvertHKX(FileInfo inFile, FileInfo outFile, ConvertFormat fo
HKXHeader header = (format) switch
{
ConvertFormat.xml => HKXHeader.SkyrimSE(),
ConvertFormat.hkx => HKXHeader.SkyrimSE(),
_ => throw new NotImplementedException("no format found"),
};

var br = new BinaryReaderEx(inFile.OpenRead());
var des = new PackFileDeserializer();
IHavokObject rootObject = des.Deserialize(br);
if (format == ConvertFormat.xml && Path.HasExtension(".hkx"))
{
var br = new BinaryReaderEx(inFile.OpenRead());
var des = new PackFileDeserializer();
IHavokObject rootObject = des.Deserialize(br, ignoreError);

var xs = new XmlSerializer();
var xs = new XmlSerializer();
xs.Serialize(rootObject, header, outFile.Create());
return 0;
}
else if (format == ConvertFormat.hkx && Path.HasExtension(".xml"))
{
var xd = new XmlDeserializer();
IHavokObject rootObject = xd.Deserialize(inFile.OpenRead(), header);

xs.Serialize(rootObject, header, outFile.Create());
var bw = new BinaryWriterEx(outFile.Create());
var s = new PackFileSerializer();
s.Serialize(rootObject, bw, header);
return 0;
}

return 0;
}
Expand Down

0 comments on commit 86adec1

Please sign in to comment.