From 4bc6dd5c1a8822566691b956f679c4f57d9df114 Mon Sep 17 00:00:00 2001 From: ividyon <1077140+ividyon@users.noreply.github.com> Date: Sun, 21 Dec 2025 10:17:57 +0100 Subject: [PATCH 01/15] update to net9 and various fixes --- .github/workflows/artifact.yml | 2 +- .github/workflows/release.yml | 2 +- NOTES.md | 8 +- SoulsFormats | 2 +- SoulsOodleLib/AssetLocator.cs | 78 ++++--- SoulsOodleLib/Oodle.cs | 15 +- SoulsOodleLib/SoulsOodleLib.csproj | 2 +- SoulsOodleLib/packages.lock.json | 16 +- WitchyBND/CliModes/ConfigMode.cs | 30 +-- .../CliModes/ConfigMode/DeferredFormatMode.cs | 219 +++++++++--------- .../CliModes/ConfigMode/IntegrationMode.cs | 6 +- WitchyBND/CliModes/ParseMode.cs | 1 + WitchyBND/Configuration.cs | 4 +- WitchyBND/Parsers/Binder/Special/WANIBND4.cs | 15 +- WitchyBND/Parsers/Binder/WPARAMBND3.cs | 11 +- WitchyBND/Parsers/Binder/WPARAMBND4.cs | 4 +- .../Parsers/Folder/WTAE/WTAE.Folder.Repack.cs | 81 ++++--- .../Parsers/Folder/WTAE/WTAE.Folder.Unpack.cs | 54 +++-- WitchyBND/Parsers/WFolderParser.cs | 7 +- WitchyBND/Parsers/XML/Serialized/WAIP.cs | 24 ++ .../Parsers/XML/WTAE/WTAE.File.Repack.cs | 81 ++++--- .../Parsers/XML/WTAE/WTAE.File.Unpack.cs | 64 ++--- WitchyBND/Program.cs | 1 - WitchyBND/Services/GameService.cs | 15 +- WitchyBND/Services/LinuxOutputService.cs | 71 ------ WitchyBND/Services/OutputService.cs | 116 ++++++---- WitchyBND/Services/SilentOutputService.cs | 33 +-- WitchyBND/Services/UpdateService.cs | 14 +- WitchyBND/WitchyBND.csproj | 30 ++- WitchyBND/packages.lock.json | 170 ++------------ WitchyFormats/Formats/FormatExtensions.cs | 96 ++++++++ WitchyFormats/WitchyFormats.csproj | 2 +- WitchyFormats/packages.lock.json | 16 +- WitchyLib/HexHelpers.cs | 1 - WitchyLib/WBUtil.cs | 36 ++- WitchyLib/WitchyLib.csproj | 4 +- WitchyLib/packages.lock.json | 91 +------- WitchyTests/Services/TestOutputService.cs | 33 +-- WitchyTests/TestBase.cs | 7 +- WitchyTests/WitchyTests.csproj | 2 +- WitchyTests/packages.lock.json | 31 +-- global.json | 2 +- 42 files changed, 682 insertions(+), 815 deletions(-) create mode 100644 WitchyBND/Parsers/XML/Serialized/WAIP.cs delete mode 100644 WitchyBND/Services/LinuxOutputService.cs create mode 100644 WitchyFormats/Formats/FormatExtensions.cs diff --git a/.github/workflows/artifact.yml b/.github/workflows/artifact.yml index 555b9ed3..af2fcd7c 100644 --- a/.github/workflows/artifact.yml +++ b/.github/workflows/artifact.yml @@ -18,7 +18,7 @@ on: branches: [ "main" ] env: - DOTNET_VERSION: '9.0.304' + DOTNET_VERSION: '9.0.306' NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages NEXUSMOD_API_KEY: ${{ secrets.NEXUSMOD_API_KEY }} NEXUSMOD_SESSION_COOKIE: ${{ secrets.NEXUSMOD_SESSION_COOKIE }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3791adcf..969b5c05 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ permissions: contents: write env: - DOTNET_VERSION: '9.0.304' + DOTNET_VERSION: '9.0.306' NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages NEXUSMOD_API_KEY: ${{ secrets.NEXUSMOD_API_KEY }} NEXUSMOD_SESSION_COOKIE: ${{ secrets.NEXUSMOD_SESSION_COOKIE }} diff --git a/NOTES.md b/NOTES.md index 76f4330a..5a690a3f 100644 --- a/NOTES.md +++ b/NOTES.md @@ -1,6 +1,12 @@ * Added basic cross-platform capability with Linux support. * The oo2core binary needs to be provided by the user. See the README for more info. * Some features are unavailable. -* Fixed a crash issue with repacking PS4 TPFs. This updates the TPF parser version. +* Updated PromptPlus to version 5, which should be more cross platform-compatible. +* Added support for the AIP (Auto Invade Point) format, props to Axi for the template. +* Removed the "DCX decompression only" configuration as it has only led to confusion so far. It can still be enabled via command line if needed. +* Fixed some crash issues with repacking PS4 TPFs. This updates the TPF parser version. * Fixed a crash issue when handling FFXBND from different platforms than PC. This updates the FFXBND parser version. +* Fixed an issue with SoulsFormats TAE where certain event parameters would become corrupted when repacked. +* Fixed an issue where the ANIBND parser would ignore duplicately named files and proceed without throwing an error, causing jumbled output. +* Fixed an issue where archives would fail to unpack if they have no file extension. * Added an option in the configuration menu to reset any version skips, so that the auto-updater may once again be ran. diff --git a/SoulsFormats b/SoulsFormats index 55b08a3c..d18af641 160000 --- a/SoulsFormats +++ b/SoulsFormats @@ -1 +1 @@ -Subproject commit 55b08a3c02a03777cf19958d8f6aa18d7af59da1 +Subproject commit d18af64130dd734a8535e1911385e5b6d5c814e0 diff --git a/SoulsOodleLib/AssetLocator.cs b/SoulsOodleLib/AssetLocator.cs index 4a2720e9..3cf0e459 100644 --- a/SoulsOodleLib/AssetLocator.cs +++ b/SoulsOodleLib/AssetLocator.cs @@ -1,10 +1,6 @@ -using System; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices; +using System.Runtime.InteropServices; using Microsoft.Win32; using NativeFileDialogSharp; -using SoulsFormats; namespace SoulsOodleLib { @@ -23,10 +19,10 @@ public enum Game private static readonly Dictionary steamSearchPaths = new() { - { Game.EldenRing, @$"{Path.DirectorySeparatorChar}steamapps{Path.DirectorySeparatorChar}common{Path.DirectorySeparatorChar}ELDEN RING{Path.DirectorySeparatorChar}Game" }, - { Game.ArmoredCore6, @$"{Path.DirectorySeparatorChar}steamapps{Path.DirectorySeparatorChar}common{Path.DirectorySeparatorChar}ARMORED CORE VI FIRES OF RUBICON{Path.DirectorySeparatorChar}Game" }, - { Game.Sekiro, @$"{Path.DirectorySeparatorChar}steamapps{Path.DirectorySeparatorChar}common{Path.DirectorySeparatorChar}Sekiro" }, - { Game.Nightreign, @$"{Path.DirectorySeparatorChar}steamapps{Path.DirectorySeparatorChar}common{Path.DirectorySeparatorChar}ELDEN RING NIGHTREIGN{Path.DirectorySeparatorChar}Game" } + { Game.EldenRing, @$"steamapps{Path.DirectorySeparatorChar}common{Path.DirectorySeparatorChar}ELDEN RING{Path.DirectorySeparatorChar}Game" }, + { Game.ArmoredCore6, @$"steamapps{Path.DirectorySeparatorChar}common{Path.DirectorySeparatorChar}ARMORED CORE VI FIRES OF RUBICON{Path.DirectorySeparatorChar}Game" }, + { Game.Sekiro, @$"steamapps{Path.DirectorySeparatorChar}common{Path.DirectorySeparatorChar}Sekiro" }, + { Game.Nightreign, @$"steamapps{Path.DirectorySeparatorChar}common{Path.DirectorySeparatorChar}ELDEN RING NIGHTREIGN{Path.DirectorySeparatorChar}Game" } }; private static readonly Dictionary installPaths = new(); @@ -39,24 +35,24 @@ private static readonly (string, string)[] winRegistryPathValueTuple = (@"HKEY_LOCAL_MACHINE\SOFTWARE\Valve\Steam", "InstallPath"), }; - public static string? GetSteamInstallPath() - { - - string? installPath = null; - // TODO: Linux support - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + public static string? GetSteamPath(params string[] path) { - foreach ((string Path, string Value) pathValueTuple in winRegistryPathValueTuple) + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { - string registryKey = pathValueTuple.Path; - var regPath = (string?)Registry.GetValue(registryKey, pathValueTuple.Value, null); - if (Directory.Exists(regPath)) + foreach ((string Path, string Value) pathValueTuple in winRegistryPathValueTuple) { - installPath = regPath; - break; + string registryKey = pathValueTuple.Path; + var regPath = (string?)Registry.GetValue(registryKey, pathValueTuple.Value, null); + if (regPath != null) + { + var fullPath = Path.Combine(((string[]) [regPath]).Union(path).ToArray()); + if (Directory.Exists(fullPath) || File.Exists(fullPath)) + { + return fullPath; + } + } } } - } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { var homeDir = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); @@ -81,42 +77,48 @@ private static readonly (string, string)[] winRegistryPathValueTuple = ]; foreach (string possiblePath in possiblePaths) { - if (Directory.Exists(possiblePath)) + string myPath = Path.Combine([possiblePath, .. path]); + if (Directory.Exists(myPath) || File.Exists(myPath)) { - installPath = possiblePath; - break; + return myPath; } } } - return installPath; + return null; } - public static string? TryGetGameInstallLocation(string gamePath) + public static List GetSteamLibraryPaths() { - if (!gamePath.StartsWith("\\") && !gamePath.StartsWith("/")) - return null; - - string? steamPath = GetSteamInstallPath(); - if (string.IsNullOrWhiteSpace(steamPath) || !File.Exists(Path.Combine(steamPath, "SteamApps", "libraryfolders.vdf"))) - return null; + string? librariesPath = GetSteamPath("steamapps", "libraryfolders.vdf"); + if (librariesPath == null || !File.Exists(librariesPath)) + { + Console.WriteLine("Could not find libraryfolders.vdf"); + return new(); + } - string[] libraryFolders = File.ReadAllLines(Path.Combine(steamPath, "SteamApps", "libraryfolders.vdf")); + string[] libraryFolders = File.ReadAllLines(librariesPath); var pathStrings = libraryFolders.Where(str => str.Contains("\"path\"")); var paths = pathStrings.Select(str => { var split = str.Split('"').Where((s, i) => i % 2 == 1).ToList(); if (split.Count == 2) - return split[1]; + return split[1].Replace('\\', Path.DirectorySeparatorChar); return null; - }).ToList(); + }).Where(p => p != null && Directory.Exists(p)).Cast().ToList(); - foreach (string path in paths) + return paths; + } + + public static string? TryGetGameInstallLocation(string gamePath) + { + var libraryPaths = GetSteamLibraryPaths(); + foreach (string path in libraryPaths) { - string libraryPath = path.Replace(@"\\", Path.DirectorySeparatorChar.ToString()) + gamePath; + string libraryPath = Path.Combine(path, gamePath); if (Directory.Exists(libraryPath)) return libraryPath; } diff --git a/SoulsOodleLib/Oodle.cs b/SoulsOodleLib/Oodle.cs index 4b246b16..4d833b06 100644 --- a/SoulsOodleLib/Oodle.cs +++ b/SoulsOodleLib/Oodle.cs @@ -1,6 +1,5 @@ using System.Runtime.InteropServices; using SoulsFormats; -using SoulsFormats.Exceptions; using NativeLibrary = SoulsFormats.NativeLibrary; namespace SoulsOodleLib; @@ -31,12 +30,10 @@ public static IntPtr GrabOodle(Action writeLineFunction, bool useFolderP foreach ((OodleVersion ver, string localOodlePath) in localOodlePaths) { - if (File.Exists(localOodlePath)) - { - _handle = NativeLibrary.LoadLibrary(localOodlePath); - SoulsFormats.Oodle.OodlePtrs[ver] = _handle; - return _handle; - } + if (!File.Exists(localOodlePath)) continue; + _handle = NativeLibrary.LoadLibrary(localOodlePath); + SoulsFormats.Oodle.OodlePtrs[ver] = _handle; + return _handle; } if (gamePath == null) @@ -77,7 +74,7 @@ public static IntPtr GrabOodle(Action writeLineFunction, bool useFolderP foreach ((OodleVersion ver, string gameOodlePath) in gameOodlePaths) { - Console.WriteLine($"Loading oodle {gameOodlePath}"); + if (!File.Exists(gameOodlePath)) continue; _handle = NativeLibrary.LoadLibrary(gameOodlePath); if (copyToAppFolder) File.Copy(gameOodlePath, Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Path.GetFileName(gameOodlePath)), true); @@ -92,7 +89,7 @@ public static IntPtr GrabOodle(Action writeLineFunction, bool useFolderP return IntPtr.Zero; } - private static void KillOodle(IntPtr? oodleHandle) + public static void KillOodle(IntPtr? oodleHandle) { if (oodleHandle != null) NativeLibrary.FreeLibrary(oodleHandle.Value); diff --git a/SoulsOodleLib/SoulsOodleLib.csproj b/SoulsOodleLib/SoulsOodleLib.csproj index 2ac7638b..5a403d96 100644 --- a/SoulsOodleLib/SoulsOodleLib.csproj +++ b/SoulsOodleLib/SoulsOodleLib.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable diff --git a/SoulsOodleLib/packages.lock.json b/SoulsOodleLib/packages.lock.json index 190c99a1..5a4c55fc 100644 --- a/SoulsOodleLib/packages.lock.json +++ b/SoulsOodleLib/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net8.0": { + "net9.0": { "BouncyCastle.Cryptography": { "type": "Direct", "requested": "[2.4.0, )", @@ -19,18 +19,10 @@ "resolved": "1.1.1", "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "3.1.0", - "contentHash": "z7aeg8oHln2CuNulfhiLYxCVMPEwBl3rzicjvIX+4sUuCwvXw5oXQEtbiU2c0z4qYL5L3Kmx0mMA/+t/SbY67w==" - }, "System.Text.Encoding.CodePages": { "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "aeu4FlaUTemuT1qOd1MyU4T516QR4Fy+9yDbwWMPHOHy7U8FD6SgTzdZFO7gHcfAPHtECqInbwklVvUK4RHcNg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "3.1.0" - } + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" }, "System.ValueTuple": { "type": "Transitive", @@ -47,7 +39,7 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.4.0, )", "DrSwizzler": "[1.1.1, )", - "System.Text.Encoding.CodePages": "[4.7.0, )", + "System.Text.Encoding.CodePages": "[8.0.0, )", "System.ValueTuple": "[4.5.0, )", "ZstdNet": "[1.4.5, )" } diff --git a/WitchyBND/CliModes/ConfigMode.cs b/WitchyBND/CliModes/ConfigMode.cs index c5d1588c..d01f4e92 100644 --- a/WitchyBND/CliModes/ConfigMode.cs +++ b/WitchyBND/CliModes/ConfigMode.cs @@ -2,7 +2,6 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Runtime.InteropServices; -using PPlus.Controls; using WitchyBND.Parsers; using WitchyBND.Services; using WitchyLib; @@ -25,10 +24,6 @@ private enum ConfigMenuItem "Enable to extract certain BND types into a custom, user-friendly structure. Disable for standard handling.")] ToggleBnd, - [Display(Name = "DCX decompression only", - Description = "Enable to exclusively decompress DCX files and leave their contents intact.")] - ToggleDcx, - [Display(Name = "Recursive binder processing", Description = "Enable to recursively attempt to process any file inside unpacked binders. Very performance-intensive.")] @@ -112,7 +107,7 @@ directory and select ""WitchyBND"" in the context menu. { output.Clear(); output.DoubleDash("Configuration menu"); - output.WriteLine("This menu is [YELLOW]paged[/]; scroll down to find more options."); + output.WriteLineColor("This menu is [YELLOW]paged[/]; scroll down to find more options."); output.WriteLine(); var select = output.Select("Choose an option") .TextSelector(a => { @@ -123,9 +118,6 @@ directory and select ""WitchyBND"" in the context menu. case ConfigMenuItem.ToggleBnd: toggled = Configuration.Stored.Bnd; break; - case ConfigMenuItem.ToggleDcx: - toggled = Configuration.Stored.Dcx; - break; case ConfigMenuItem.ToggleRecursive: toggled = Configuration.Stored.Recursive; break; @@ -172,16 +164,12 @@ directory and select ""WitchyBND"" in the context menu. if (select.IsAborted) return; - switch (select.Value) + switch (select.Content) { case ConfigMenuItem.ToggleBnd: Configuration.Stored.Bnd = !Configuration.Stored.Bnd; updateConfig(); break; - case ConfigMenuItem.ToggleDcx: - Configuration.Stored.Dcx = !Configuration.Stored.Dcx; - updateConfig(); - break; case ConfigMenuItem.ToggleRecursive: Configuration.Stored.Recursive = !Configuration.Stored.Recursive; updateConfig(); @@ -210,10 +198,10 @@ directory and select ""WitchyBND"" in the context menu. while (true) { var thresholdSelect = output.Input("Input new threshold (between 0.0 and 1.0") - .AddValidators(PromptValidators.IsTypeFloat()) + // .AddValidators(PromptValidators.IsTypeFloat()) .Run(); if (thresholdSelect.IsAborted) break; - var threshold = float.Parse(thresholdSelect.Value); + var threshold = float.Parse(thresholdSelect.Content); if (threshold < 0f) { output.WriteError("Number cannot be less than 0."); @@ -238,7 +226,7 @@ directory and select ""WitchyBND"" in the context menu. var cellSelect = output.Select("Select PARAM field style").Run(); if (!cellSelect.IsAborted) { - Configuration.Stored.ParamCellStyle = cellSelect.Value; + Configuration.Stored.ParamCellStyle = cellSelect.Content; updateConfig(); } break; @@ -246,7 +234,7 @@ directory and select ""WitchyBND"" in the context menu. var backupSelect = output.Select("Select backup method").Run(); if (!backupSelect.IsAborted) { - Configuration.Stored.BackupMethod = backupSelect.Value; + Configuration.Stored.BackupMethod = backupSelect.Content; updateConfig(); } break; @@ -260,12 +248,12 @@ directory and select ""WitchyBND"" in the context menu. case ConfigMenuItem.ConfigureDelay: var input = output.Input("Input new delay (in milliseconds)") .AcceptInput(char.IsNumber) - .AddValidators(PromptValidators.IsTypeUInt16("Input is not within valid range")) - .ValidateOnDemand() + // .AddValidators(PromptValidators.IsTypeUInt16("Input is not within valid range")) + // .ValidateOnDemand() .Run(); if (!input.IsAborted) { - Configuration.Stored.EndDelay = Convert.ToUInt16(input.Value); + Configuration.Stored.EndDelay = Convert.ToUInt16(input.Content); updateConfig(); } break; diff --git a/WitchyBND/CliModes/ConfigMode/DeferredFormatMode.cs b/WitchyBND/CliModes/ConfigMode/DeferredFormatMode.cs index 0910c482..24f4b2dd 100644 --- a/WitchyBND/CliModes/ConfigMode/DeferredFormatMode.cs +++ b/WitchyBND/CliModes/ConfigMode/DeferredFormatMode.cs @@ -3,7 +3,7 @@ using System.IO; using System.Linq; using NativeFileDialogSharp; -using PPlus.Controls; +using PromptPlusLibrary; using WitchyBND.Services; using WitchyLib; @@ -20,95 +20,93 @@ static DeferredFormatMode() public static void Run(CliOptions opt) { - using (output.EscapeColorTokens()) + while (true) { - while (true) + output.Clear(); + output.DoubleDash("Deferred formats"); + + var select = output.Select("Configure deferred tools") + .TextSelector(format => { + var checkbox = Configuration.Stored.DeferTools.ContainsKey(format) ? "[x]" : "[ ]"; + var path = Configuration.Stored.DeferTools.ContainsKey(format) + ? Configuration.Stored.DeferTools[format].Path + : "Not configured"; + return $"{checkbox} {format.GetAttribute().Name}: {path}"; + }) + .Run(); + + if (select.IsAborted) return; + + var format = select.Content; + var name = format.GetAttribute().Name; + output.WriteLine( + @"In the following dialog, please select the executable that will be used to process the given format. +Cancel the dialog to reset the configuration for that format."); + output.KeyPress().Run(); + var openDialog = Dialog.FileOpen("exe"); + if (openDialog.IsError) { - output.Clear(); - output.DoubleDash("Deferred formats"); - - var select = output.Select("Configure deferred tools") - .TextSelector(format => { - var checkbox = Configuration.Stored.DeferTools.ContainsKey(format) ? "[x]" : "[ ]"; - var path = Configuration.Stored.DeferTools.ContainsKey(format) - ? Configuration.Stored.DeferTools[format].Path - : "Not configured"; - return $"{checkbox} {format.GetAttribute().Name}: {path}"; - }) - .Run(); - - if (select.IsAborted) return; + output.WriteError( + $"There was an error while picking the executable: {openDialog.ErrorMessage}"); + output.KeyPress().Run(); + continue; + } - var format = select.Value; - var name = format.GetAttribute().Name; - output.WriteLine( - @"In the following dialog, please select the executable that will be used to process the given format. -Cancel the dialog to reset the configuration for that format."); + if (openDialog.IsCancelled || string.IsNullOrWhiteSpace(openDialog.Path) || + !File.Exists(openDialog.Path)) + { + Configuration.Stored.DeferTools.Remove(format); + Configuration.SaveConfiguration(); + output.WriteLine($"{name} files will no longer be processed."); output.KeyPress().Run(); - var openDialog = Dialog.FileOpen("exe"); - if (openDialog.IsError) - { - output.WriteError( - $"There was an error while picking the executable: {openDialog.ErrorMessage}"); - output.KeyPress().Run(); - continue; - } - - if (openDialog.IsCancelled || string.IsNullOrWhiteSpace(openDialog.Path) || - !File.Exists(openDialog.Path)) - { - Configuration.Stored.DeferTools.Remove(format); - Configuration.SaveConfiguration(); - output.WriteLine($"{name} files will no longer be processed."); - output.KeyPress().Run(); - continue; - } - - - IControlSelect argsSelect = output.Select("Select the arguments provided to the tool"); - - var hasDefArgs = - DeferredFormatHandling.DefaultDeferToolArguments.TryGetValue(format, out var defArgs); - if (hasDefArgs) - { - argsSelect.AddItems(defArgs.Select(a => a.Name)); - } - - argsSelect.AddItems(new List - { - "Default", - "Custom..." - }); - var argsVal = argsSelect.Run(); - - if (argsVal.IsAborted) continue; - - bool breakOut = false; - string unpackArgsDefault = ""; - string repackArgsDefault = ""; - bool hasRepack = true; - switch (argsVal.Value) - { - case "Custom...": - break; - case "Default": - Configuration.Stored.DeferTools[format] = - new DeferConfig(Path.GetFileNameWithoutExtension(openDialog.Path), openDialog.Path); - break; - default: - var myArgs = defArgs!.First(a => a.Name == argsVal.Value); - unpackArgsDefault = myArgs.UnpackArgs; - if (myArgs.RepackArgs == null) - hasRepack = false; - else - repackArgsDefault = myArgs.RepackArgs; - Configuration.Stored.DeferTools[format] = new DeferConfig(myArgs.Name, openDialog.Path, - myArgs.UnpackArgs, myArgs.RepackArgs); - break; - } + continue; + } - output.WriteLine( - @"Please input the arguments provided to the program when unpacking the format. + + ISelectControl argsSelect = output.Select("Select the arguments provided to the tool"); + + var hasDefArgs = + DeferredFormatHandling.DefaultDeferToolArguments.TryGetValue(format, out var defArgs); + if (hasDefArgs) + { + argsSelect.AddItems(defArgs.Select(a => a.Name)); + } + + argsSelect.AddItems(new List + { + "Default", + "Custom..." + }); + var argsVal = argsSelect.Run(); + + if (argsVal.IsAborted) continue; + + bool breakOut = false; + string unpackArgsDefault = ""; + string repackArgsDefault = ""; + bool hasRepack = true; + switch (argsVal.Content) + { + case "Custom...": + break; + case "Default": + Configuration.Stored.DeferTools[format] = + new DeferConfig(Path.GetFileNameWithoutExtension(openDialog.Path), openDialog.Path); + break; + default: + var myArgs = defArgs!.First(a => a.Name == argsVal.Content); + unpackArgsDefault = myArgs.UnpackArgs; + if (myArgs.RepackArgs == null) + hasRepack = false; + else + repackArgsDefault = myArgs.RepackArgs; + Configuration.Stored.DeferTools[format] = new DeferConfig(myArgs.Name, openDialog.Path, + myArgs.UnpackArgs, myArgs.RepackArgs); + break; + } + + output.WriteLine( + @"Please input the arguments provided to the program when unpacking the format. Available placeholders: $path - Full path of file being processed @@ -116,20 +114,20 @@ public static void Run(CliOptions opt) $filename - Filename (without extension) of file being processed $fileext - Extension of file being processed (starts with .)"); - var unpackArgsInput = output.Input("Enter custom unpack arguments") - .Default(unpackArgsDefault) - .Run(); - if (unpackArgsInput.IsAborted) - { - breakOut = true; - break; - } + var unpackArgsInput = output.Input("Enter custom unpack arguments") + .Default(unpackArgsDefault) + .Run(); + if (unpackArgsInput.IsAborted) + { + breakOut = true; + break; + } - string? repackArgs = null; - if (hasRepack) - { - output.WriteLine( - @"Please input the arguments provided to the program when repacking the format. + string? repackArgs = null; + if (hasRepack) + { + output.WriteLine( + @"Please input the arguments provided to the program when repacking the format. Press the Esc key if your program does not support repacking. @@ -139,22 +137,21 @@ public static void Run(CliOptions opt) $dirname - Directory path of file being processed $filename - Filename (without extension) of file being processed $fileext - Extension of file being processed (starts with .)"); - var repackArgsInput = output.Input("Enter custom repack arguments") - .Default(repackArgsDefault) - .Run(); + var repackArgsInput = output.Input("Enter custom repack arguments") + .Default(repackArgsDefault) + .Run(); - repackArgs = !repackArgsInput.IsAborted ? repackArgsInput.Value : null; - } + repackArgs = !repackArgsInput.IsAborted ? repackArgsInput.Content : null; + } - Configuration.Stored.DeferTools[format] = new DeferConfig( - Path.GetFileNameWithoutExtension(openDialog.Path), openDialog.Path, unpackArgsInput.Value, - repackArgs); + Configuration.Stored.DeferTools[format] = new DeferConfig( + Path.GetFileNameWithoutExtension(openDialog.Path), openDialog.Path, unpackArgsInput.Content, + repackArgs); - if (breakOut) continue; - Configuration.SaveConfiguration(); - output.WriteLine($"{name} files will now be processed by program \"{openDialog.Path}\"."); - output.KeyPress().Run(); - } + if (breakOut) continue; + Configuration.SaveConfiguration(); + output.WriteLine($"{name} files will now be processed by program \"{openDialog.Path}\"."); + output.KeyPress().Run(); } } } \ No newline at end of file diff --git a/WitchyBND/CliModes/ConfigMode/IntegrationMode.cs b/WitchyBND/CliModes/ConfigMode/IntegrationMode.cs index 3d1cd202..4cf5e5dc 100644 --- a/WitchyBND/CliModes/ConfigMode/IntegrationMode.cs +++ b/WitchyBND/CliModes/ConfigMode/IntegrationMode.cs @@ -1,7 +1,7 @@ using System; using System.ComponentModel.DataAnnotations; using Microsoft.Win32; -using PPlus; +using PromptPlusLibrary; using WitchyBND.Services; using WitchyLib; @@ -46,7 +46,7 @@ public static void CliShellIntegrationMode(CliOptions opt) var select = output.Select("Select an option") .Run(); if (select.IsAborted) return; - switch (select.Value) + switch (select.Content) { case IntegrationChoices.Register: RegisterContext(); @@ -59,7 +59,7 @@ public static void CliShellIntegrationMode(CliOptions opt) @"Explorer needs to be restarted to complete the process. Your taskbar will briefly disappear for a few seconds. Witchy will try to restore any open Explorer windows."); var choice = output.Confirm("Proceed with restarting the Explorer process?").Run(); - if (choice.Value.IsYesResponseKey()) + if (choice.Content.Value.IsYesResponseKey()) { output.WriteLine("Restarting the Explorer process..."); Shell.RestartExplorer(); diff --git a/WitchyBND/CliModes/ParseMode.cs b/WitchyBND/CliModes/ParseMode.cs index e90ed509..13725cee 100644 --- a/WitchyBND/CliModes/ParseMode.cs +++ b/WitchyBND/CliModes/ParseMode.cs @@ -73,6 +73,7 @@ static ParseMode() new WTAEFolder(), new WTAEFile(), new WMSBEFolder(), + new WAIP(), new WDCX(false) }; } diff --git a/WitchyBND/Configuration.cs b/WitchyBND/Configuration.cs index 465b62f8..64cfef38 100644 --- a/WitchyBND/Configuration.cs +++ b/WitchyBND/Configuration.cs @@ -17,7 +17,6 @@ namespace WitchyBND; public interface IStoredConfig { public bool Bnd { get; set; } - public bool Dcx { get; set; } public float ParamDefaultValueThreshold { get; set; } public WPARAM.CellStyle ParamCellStyle { get; set; } @@ -49,6 +48,7 @@ public interface ITempConfig { public bool UnpackOnly { get; set; } public bool RepackOnly { get; set; } + public bool Dcx { get; set; } public bool Passive { get; set; } public bool Silent { get; set; } @@ -64,7 +64,6 @@ public static class Configuration public class StoredConfig : IStoredConfig, IStoredOnlyConfig { public bool Bnd { get; set; } - public bool Dcx { get; set; } public float ParamDefaultValueThreshold { get; set; } public WPARAM.CellStyle ParamCellStyle { get; set; } @@ -206,7 +205,6 @@ public static void ActivateStoredConfiguration(StoredConfig? stored = null) { stored ??= Stored; Active.Bnd = stored.Bnd; - Active.Dcx = stored.Dcx; Active.ParamDefaultValueThreshold = stored.ParamDefaultValueThreshold; Active.ParamCellStyle = stored.ParamCellStyle; Active.Recursive = stored.Recursive; diff --git a/WitchyBND/Parsers/Binder/Special/WANIBND4.cs b/WitchyBND/Parsers/Binder/Special/WANIBND4.cs index fbfa1aea..9be1df09 100644 --- a/WitchyBND/Parsers/Binder/Special/WANIBND4.cs +++ b/WitchyBND/Parsers/Binder/Special/WANIBND4.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Data; using System.IO; using System.Linq; using System.Text.RegularExpressions; @@ -240,12 +241,22 @@ void FileCallback(string ext, string filePath) void ExtensionCallback(string ext) { + var files = Directory.EnumerateFiles(srcPath, $"*{ext}", SearchOption.AllDirectories).ToList(); + var dupes = files.GroupBy(f => Path.GetFileName(f)).Where(g => g.Count() > 1).ToList(); + if (dupes.Any()) + { + throw new DuplicateNameException(@$"Found the following duplicate files across different folders: + +{String.Join("\n", dupes.SelectMany(g => g.ToList()).Select(f => $"- {f}"))} + +Please address this issue before trying again."); + } if (Configuration.Active.Parallel) - Parallel.ForEach(Directory.EnumerateFiles(srcPath, $"*{ext}", SearchOption.AllDirectories), + Parallel.ForEach(files, filePath => FileCallback(ext, filePath)); else { - foreach (string filePath in Directory.EnumerateFiles(srcPath, $"*{ext}", SearchOption.AllDirectories)) + foreach (string filePath in files) { FileCallback(ext, filePath); } diff --git a/WitchyBND/Parsers/Binder/WPARAMBND3.cs b/WitchyBND/Parsers/Binder/WPARAMBND3.cs index bf33c21b..727d2c4c 100644 --- a/WitchyBND/Parsers/Binder/WPARAMBND3.cs +++ b/WitchyBND/Parsers/Binder/WPARAMBND3.cs @@ -1,7 +1,6 @@ using System.IO; using System.Linq; using System.Xml.Linq; -using PPlus; using SoulsFormats; using WitchyBND.CliModes; using WitchyLib; @@ -17,27 +16,27 @@ public class WPARAMBND3 : WBinderParser private static bool IsPTDEParamBND(BND3 bnd) { - return bnd.Files.FirstOrDefault(f => f.Name.ToLower().Contains("default_aistandardinfobank.param"), null) != null; + return bnd.Files.FirstOrDefault(f => f?.Name.ToLower().Contains("default_aistandardinfobank.param") ?? false, null) != null; } private static bool IsDSRParamBND(BND3 bnd) { - return IsPTDEParamBND(bnd) && bnd.Files.FirstOrDefault(f => f.Name.ToLower().EndsWith("levelsyncparam.param"), null) != null; + return IsPTDEParamBND(bnd) && bnd.Files.FirstOrDefault(f => f?.Name.ToLower().EndsWith("levelsyncparam.param") ?? false, null) != null; } private static bool IsAC4Regulation(BND3 bnd) { - return bnd.Files.FirstOrDefault(f => f.Name.ToLower().EndsWith("comment_uk.fmg"), null) != null; + return bnd.Files.FirstOrDefault(f => f?.Name.ToLower().EndsWith("comment_uk.fmg") ?? false, null) != null; } private static bool IsACFARegulation(BND3 bnd) { - return bnd.Files.FirstOrDefault(f => f.Name.ToLower().EndsWith("comment_es.fmg"), null) != null; + return bnd.Files.FirstOrDefault(f => f?.Name.ToLower().EndsWith("comment_es.fmg") ?? false, null) != null; } private static bool IsACFABoot(BND3 bnd) { - return bnd.Files.FirstOrDefault(f => f.Name.ToLower().EndsWith("ac45_allsound.mgs"), null) != null; + return bnd.Files.FirstOrDefault(f => f?.Name.ToLower().EndsWith("ac45_allsound.mgs") ?? false, null) != null; } public override bool Is(string path, byte[]? data, out ISoulsFile? file) diff --git a/WitchyBND/Parsers/Binder/WPARAMBND4.cs b/WitchyBND/Parsers/Binder/WPARAMBND4.cs index a56e4cf5..e0b207f4 100644 --- a/WitchyBND/Parsers/Binder/WPARAMBND4.cs +++ b/WitchyBND/Parsers/Binder/WPARAMBND4.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Xml; using System.Xml.Linq; -using PPlus; +using PromptPlusLibrary; using SoulsFormats; using SoulsFormats.Cryptography; using WitchyBND.CliModes; @@ -211,7 +211,7 @@ public override void Repack(string srcPath, bool recursive) "DS2 files cannot be re-encrypted, yet, so re-packing this folder might ruin your encrypted bnd."); var confirm = output.Confirm("Proceed to repack BND (without encryption)?") .Run(); - if (confirm.IsAborted || confirm.Value.IsNoResponseKey()) + if (confirm.IsAborted || confirm.Content.Value.IsNoResponseKey()) { return; } diff --git a/WitchyBND/Parsers/Folder/WTAE/WTAE.Folder.Repack.cs b/WitchyBND/Parsers/Folder/WTAE/WTAE.Folder.Repack.cs index 0bd11776..1a9592f7 100644 --- a/WitchyBND/Parsers/Folder/WTAE/WTAE.Folder.Repack.cs +++ b/WitchyBND/Parsers/Folder/WTAE/WTAE.Folder.Repack.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using System.Xml.Linq; using SoulsFormats; +using WitchyFormats; using WitchyLib; namespace WitchyBND.Parsers; @@ -60,7 +61,7 @@ void Callback(string file) animFiles.ForEach(Callback); } - tae.Animations = bag.OrderBy(a => a.ID).ToList(); + tae.Animations = bag.ToList(); tae.ApplyTemplate(gameService.GetTAETemplate(game)); @@ -76,6 +77,7 @@ private TAE.Animation RepackAnim(string file, TAE tae, TAE.Template template) var animName = animXml.Element("name")!.Value; var headerEl = animXml.Element("header")!; var headerType = Enum.Parse(headerEl.Element("type")!.Value); + var headerIsNull = bool.Parse(headerEl.Element("null")?.Value ?? "False"); TAE.Animation.AnimMiniHeader header; switch (headerType) { @@ -96,13 +98,49 @@ private TAE.Animation RepackAnim(string file, TAE tae, TAE.Template template) throw new ArgumentOutOfRangeException(); } + header.IsNullHeader = headerIsNull; + var anim = new TAE.Animation(id, header, animName); anim.Events = new(); anim.EventGroups = new(); - foreach (XElement groupEl in animXml.Element("animGroups")!.Elements("animGroup")) + foreach (XElement evEl in animXml.Element("events")!.Elements("event")) + { + var evType = int.Parse(evEl.Element("type")!.Value); + var unk04 = int.Parse(evEl.Element("unk04")!.Value); + var startTime = float.Parse(evEl.Element("startTime")!.Value); + var endTime = float.Parse(evEl.Element("endTime")!.Value); + var isUnk = bool.Parse(evEl.Element("isUnk")?.Value ?? "False"); + var hasTemplate = template.Any(t => t.Value.ContainsKey(evType)); + if (!hasTemplate) + errorService.RegisterNotice($"Missing template for TAE event type {evType}."); + if (!isUnk && hasTemplate) + { + var ev = new TAE.Event(startTime, endTime, evType, unk04, tae.BigEndian, template.First(t => t.Value.ContainsKey(evType)).Value[evType]); + + var paramsEl = evEl.Element("params"); + if (paramsEl != null) + { + foreach (XElement paramEl in paramsEl.Elements("param")) + { + var key = paramEl.Attribute("name")!.Value; + var value = paramEl.Attribute("value")!.Value; + + ev.Parameters[key] = ev.Parameters.Template[key].StorageToValue(value); + } + } + anim.Events.Add(ev); + } + else + { + var paramBytes = evEl.Element("unkParams")!.Value.Split(",").Select(s => byte.Parse(s)).ToArray(); + var ev = new TAE.Event(startTime, endTime, evType, unk04, paramBytes, tae.BigEndian); + anim.Events.Add(ev); + } + } + foreach (XElement groupEl in animXml.Element("eventGroups")!.Elements("eventGroup")) { - var type = long.Parse(groupEl.Element("type")!.Value); + var type = int.Parse(groupEl.Element("type")!.Value); var group = new TAE.EventGroup(type); var data = new TAE.EventGroup.EventGroupDataStruct(); @@ -122,40 +160,9 @@ private TAE.Animation RepackAnim(string file, TAE tae, TAE.Template template) { foreach (XElement evEl in eventsEl.Elements("event")) { - var evType = int.Parse(evEl.Element("type")!.Value); - var unk04 = int.Parse(evEl.Element("unk04")!.Value); - var startTime = float.Parse(evEl.Element("startTime")!.Value); - var endTime = float.Parse(evEl.Element("endTime")!.Value); - var isUnk = bool.Parse(evEl.Element("isUnk")?.Value ?? "False"); - var hasTemplate = template.Any(t => t.Value.ContainsKey(evType)); - if (!hasTemplate) - errorService.RegisterNotice($"Missing template for TAE event type {evType}."); - if (!isUnk && hasTemplate) - { - var ev = new TAE.Event(startTime, endTime, evType, unk04, tae.BigEndian, template.First(t => t.Value.ContainsKey(evType)).Value[evType]); - ev.Group = group; - - var paramsEl = evEl.Element("params"); - if (paramsEl != null) - { - foreach (XElement paramEl in paramsEl.Elements("param")) - { - var key = paramEl.Attribute("name")!.Value; - var value = paramEl.Attribute("value")!.Value; - - ev.Parameters[key] = ev.Parameters.Template[key].StringToValue(value); - } - } - anim.Events.Add(ev); - } - else - { - var paramBytes = evEl.Element("unkParams")!.Value.Split(",").Select(s => byte.Parse(s)).ToArray(); - var ev = new TAE.Event(startTime, endTime, evType, unk04, paramBytes, tae.BigEndian); - ev.Group = group; - anim.Events.Add(ev); - } - + var idx = int.Parse(evEl.Attribute("index")!.Value); + var ev = anim.Events.ElementAt(idx)!; + ev.Group = group; } } } diff --git a/WitchyBND/Parsers/Folder/WTAE/WTAE.Folder.Unpack.cs b/WitchyBND/Parsers/Folder/WTAE/WTAE.Folder.Unpack.cs index 49237aa3..a4a06cc3 100644 --- a/WitchyBND/Parsers/Folder/WTAE/WTAE.Folder.Unpack.cs +++ b/WitchyBND/Parsers/Folder/WTAE/WTAE.Folder.Unpack.cs @@ -4,6 +4,7 @@ using System.Xml.Linq; using SoulsFormats; using WitchyBND.Services; +using WitchyFormats; using WitchyLib; namespace WitchyBND.Parsers; @@ -70,6 +71,8 @@ public void UnpackAnim(string destDir, TAE tae, TAE.Animation anim, bool addDigi var header = new XElement("header"); root.Add(header); header.AddE("type", anim.MiniHeader.Type); + if (anim.MiniHeader.IsNullHeader) + header.AddE("null", anim.MiniHeader.IsNullHeader); if (anim.MiniHeader is TAE.Animation.AnimMiniHeader.Standard standard) { header.AddE("allowDelayLoad", standard.AllowDelayLoad); @@ -82,8 +85,33 @@ public void UnpackAnim(string destDir, TAE tae, TAE.Animation anim, bool addDigi header.AddE("animId", import.ImportFromAnimID); } - root.AddE("animGroups", anim.EventGroups.Select(group => { - var groupEl = new XElement("animGroup"); + root.AddE("events", anim.Events.Select(ev => { + var eventEl = new XElement("event"); + eventEl.AddE("type", ev.Type); + eventEl.AddE("unk04", ev.Unk04); + eventEl.AddE("startTime", ev.StartTime); + eventEl.AddE("endTime", ev.EndTime); + + if (ev.Parameters != null && ev.Parameters.Template != null) + { + eventEl.AddE("params", ev.Parameters?.Values.Select(p => { + var paramEl = new XElement("param"); + paramEl.SetAttributeValue("name", p.Key); + paramEl.SetAttributeValue("value", ev.Parameters.Template[p.Key].ValueToStorage(p.Value)); + return paramEl; + })); + } + else + { + errorService.RegisterNotice($"Missing template for TAE event type {ev.Type}."); + eventEl.AddE("isUnk", "True"); + eventEl.AddE("unkParams", string.Join(",", ev.GetParameterBytes(tae.BigEndian))); + } + return eventEl; + })); + + root.AddE("eventGroups", anim.EventGroups.Select(group => { + var groupEl = new XElement("eventGroup"); groupEl.AddE("type", group.GroupType); groupEl.AddE("dataType", group.GroupData.DataType); groupEl.AddE("area", group.GroupData.Area); @@ -95,27 +123,9 @@ public void UnpackAnim(string destDir, TAE tae, TAE.Animation anim, bool addDigi if (events.Any()) { groupEl.AddE("events", events.Select(ev => { + var idx = anim.Events.IndexOf(ev); var eventEl = new XElement("event"); - eventEl.AddE("type", ev.Type); - eventEl.AddE("unk04", ev.Unk04); - eventEl.AddE("startTime", ev.StartTime); - eventEl.AddE("endTime", ev.EndTime); - - if (ev.Parameters != null && ev.Parameters.Template != null) - { - eventEl.AddE("params", ev.Parameters?.Values.Select(p => { - var paramEl = new XElement("param"); - paramEl.SetAttributeValue("name", p.Key); - paramEl.SetAttributeValue("value", ev.Parameters.Template[p.Key].ValueToString(p.Value)); - return paramEl; - })); - } - else - { - errorService.RegisterNotice($"Missing template for TAE event type {ev.Type}."); - eventEl.AddE("isUnk", "True"); - eventEl.AddE("unkParams", string.Join(",", ev.GetParameterBytes(tae.BigEndian))); - } + eventEl.SetAttributeValue("index", idx.ToString()); return eventEl; })); } diff --git a/WitchyBND/Parsers/WFolderParser.cs b/WitchyBND/Parsers/WFolderParser.cs index 7b797f6b..15ec6a2b 100644 --- a/WitchyBND/Parsers/WFolderParser.cs +++ b/WitchyBND/Parsers/WFolderParser.cs @@ -48,7 +48,12 @@ public override string GetUnpackDestPath(string srcPath, bool recursive) if (!string.IsNullOrEmpty(location) && !recursive) sourceDir = location; sourceDir = Path.GetFullPath(sourceDir); - return Path.Combine(sourceDir, fileName.Replace('.', '-')); + string tarDir = fileName.Replace('.', '-'); + if (fileName == tarDir) + { + tarDir += "-unpacked"; + } + return Path.Combine(sourceDir, tarDir); } public override XElement PrepareXmlManifest(string srcPath, bool recursive, bool skipFilename, diff --git a/WitchyBND/Parsers/XML/Serialized/WAIP.cs b/WitchyBND/Parsers/XML/Serialized/WAIP.cs new file mode 100644 index 00000000..09eea6ce --- /dev/null +++ b/WitchyBND/Parsers/XML/Serialized/WAIP.cs @@ -0,0 +1,24 @@ +using System; +using System.IO; +using SoulsFormats; +using WitchyLib; + +namespace WitchyBND.Parsers; + +public class WAIP : WSerializedXMLParser +{ + public override string Name => "AIP"; + + public override Type SerializedType => typeof(AIP); + + public override bool Is(string path, byte[]? data, out ISoulsFile? file) + { + return IsRead(path, data, out file); + } + + public override bool? IsSimple(string path) + { + string filename = Path.GetFileName(path).ToLower(); + return filename.EndsWith(".aip"); + } +} \ No newline at end of file diff --git a/WitchyBND/Parsers/XML/WTAE/WTAE.File.Repack.cs b/WitchyBND/Parsers/XML/WTAE/WTAE.File.Repack.cs index 5d4a4fec..7fce3f76 100644 --- a/WitchyBND/Parsers/XML/WTAE/WTAE.File.Repack.cs +++ b/WitchyBND/Parsers/XML/WTAE/WTAE.File.Repack.cs @@ -5,6 +5,7 @@ using System.Xml.Linq; using WitchyLib; using SoulsFormats; +using WitchyFormats; namespace WitchyBND.Parsers; @@ -77,6 +78,7 @@ private TAE.Animation RepackAnim(XElement animEl, TAE tae, TAE.Template template var id = long.Parse(animEl.Element("id")!.Value); var headerEl = animEl.Element("header")!; var headerType = Enum.Parse(headerEl.Element("type")!.Value); + var headerIsNull = bool.Parse(headerEl.Element("null")?.Value ?? "False"); TAE.Animation.AnimMiniHeader header; switch (headerType) { @@ -97,22 +99,55 @@ private TAE.Animation RepackAnim(XElement animEl, TAE tae, TAE.Template template throw new ArgumentOutOfRangeException(); } + header.IsNullHeader = headerIsNull; + var anim = new TAE.Animation(id, header, animName); anim.Events = new(); anim.EventGroups = new(); + foreach (XElement evEl in animEl.Element("events")!.Elements("event")) + { + var evType = int.Parse(evEl.Element("type")!.Value); + var unk04 = int.Parse(evEl.Element("unk04")!.Value); + var startTime = float.Parse(evEl.Element("startTime")!.Value); + var endTime = float.Parse(evEl.Element("endTime")!.Value); + var isUnk = bool.Parse(evEl.Element("isUnk")?.Value ?? "False"); + var hasTemplate = template.Any(t => t.Value.ContainsKey(evType)); + if (!hasTemplate) + errorService.RegisterNotice($"Missing template for TAE event type {evType}."); + if (!isUnk && hasTemplate) + { + var ev = new TAE.Event(startTime, endTime, evType, unk04, tae.BigEndian, template.First(t => t.Value.ContainsKey(evType)).Value[evType]); - foreach (XElement groupEl in animEl.Element("animGroups")!.Elements("animGroup")) + var paramsEl = evEl.Element("params"); + if (paramsEl != null) + { + foreach (XElement paramEl in paramsEl.Elements("param")) + { + var key = paramEl.Attribute("name")!.Value; + var value = paramEl.Attribute("value")!.Value; + + ev.Parameters[key] = ev.Parameters.Template[key].StorageToValue(value); + } + } + anim.Events.Add(ev); + } + else + { + var paramBytes = evEl.Element("unkParams")!.Value.Split(",").Select(s => byte.Parse(s)).ToArray(); + var ev = new TAE.Event(startTime, endTime, evType, unk04, paramBytes, tae.BigEndian); + anim.Events.Add(ev); + } + } + foreach (XElement groupEl in animEl.Element("eventGroups")!.Elements("eventGroup")) { - var type = long.Parse(groupEl.Element("type")!.Value); + var type = int.Parse(groupEl.Element("type")!.Value); var group = new TAE.EventGroup(type); var data = new TAE.EventGroup.EventGroupDataStruct(); data.DataType = Enum.Parse(groupEl.Element("dataType")!.Value); data.Area = sbyte.Parse(groupEl.Element("area")!.Value); data.Block = sbyte.Parse(groupEl.Element("block")!.Value); - data.CutsceneEntityType = - Enum.Parse( - groupEl.Element("cutsceneEntityType")!.Value); + data.CutsceneEntityType = Enum.Parse(groupEl.Element("cutsceneEntityType")!.Value); data.CutsceneEntityIDPart1 = short.Parse(groupEl.Element("cutsceneEntityId1")!.Value); data.CutsceneEntityIDPart2 = short.Parse(groupEl.Element("cutsceneEntityId2")!.Value); @@ -125,39 +160,9 @@ private TAE.Animation RepackAnim(XElement animEl, TAE tae, TAE.Template template { foreach (XElement evEl in eventsEl.Elements("event")) { - var evType = int.Parse(evEl.Element("type")!.Value); - var unk04 = int.Parse(evEl.Element("unk04")!.Value); - var startTime = float.Parse(evEl.Element("startTime")!.Value); - var endTime = float.Parse(evEl.Element("endTime")!.Value); - var isUnk = bool.Parse(evEl.Element("isUnk")?.Value ?? "false"); - if (!isUnk) - { - var ev = new TAE.Event(startTime, endTime, evType, unk04, tae.BigEndian, - template[tae.EventBank][evType]); - ev.Group = group; - - var paramsEl = evEl.Element("params"); - if (paramsEl != null) - { - foreach (XElement paramEl in paramsEl.Elements("param")) - { - var key = paramEl.Attribute("name")!.Value; - var value = paramEl.Attribute("value")!.Value; - - ev.Parameters[key] = ev.Parameters.Template[key].StringToValue(value); - } - } - - anim.Events.Add(ev); - } - else - { - var paramBytes = evEl.Element("unkParams")!.Value.Split(",").Select(s => byte.Parse(s)) - .ToArray(); - var ev = new TAE.Event(startTime, endTime, evType, unk04, paramBytes, tae.BigEndian); - ev.Group = group; - anim.Events.Add(ev); - } + var idx = int.Parse(evEl.Attribute("index")!.Value); + var ev = anim.Events.ElementAt(idx)!; + ev.Group = group; } } } diff --git a/WitchyBND/Parsers/XML/WTAE/WTAE.File.Unpack.cs b/WitchyBND/Parsers/XML/WTAE/WTAE.File.Unpack.cs index b44c38a7..0ef2b2b0 100644 --- a/WitchyBND/Parsers/XML/WTAE/WTAE.File.Unpack.cs +++ b/WitchyBND/Parsers/XML/WTAE/WTAE.File.Unpack.cs @@ -5,6 +5,7 @@ using System.Xml.Linq; using SoulsFormats; using WitchyBND.Services; +using WitchyFormats; using WitchyLib; namespace WitchyBND.Parsers; @@ -72,12 +73,14 @@ void Callback(TAE.Animation anim) public XElement UnpackAnim(TAE tae, TAE.Animation anim) { - XElement animEl = new XElement("anim"); - animEl.AddE("id", anim.ID); - animEl.AddE("name", anim.AnimFileName); + XElement root = new XElement("anim"); + root.AddE("id", anim.ID); + root.AddE("name", anim.AnimFileName); var header = new XElement("header"); - animEl.Add(header); + root.Add(header); header.AddE("type", anim.MiniHeader.Type); + if (anim.MiniHeader.IsNullHeader) + header.AddE("null", anim.MiniHeader.IsNullHeader); if (anim.MiniHeader is TAE.Animation.AnimMiniHeader.Standard standard) { header.AddE("allowDelayLoad", standard.AllowDelayLoad); @@ -90,8 +93,33 @@ public XElement UnpackAnim(TAE tae, TAE.Animation anim) header.AddE("animId", import.ImportFromAnimID); } - animEl.AddE("animGroups", anim.EventGroups.Select(group => { - var groupEl = new XElement("animGroup"); + root.AddE("events", anim.Events.Select(ev => { + var eventEl = new XElement("event"); + eventEl.AddE("type", ev.Type); + eventEl.AddE("unk04", ev.Unk04); + eventEl.AddE("startTime", ev.StartTime); + eventEl.AddE("endTime", ev.EndTime); + + if (ev.Parameters != null && ev.Parameters.Template != null) + { + eventEl.AddE("params", ev.Parameters?.Values.Select(p => { + var paramEl = new XElement("param"); + paramEl.SetAttributeValue("name", p.Key); + paramEl.SetAttributeValue("value", ev.Parameters.Template[p.Key].ValueToStorage(p.Value)); + return paramEl; + })); + } + else + { + errorService.RegisterNotice($"Missing template for TAE event type {ev.Type}."); + eventEl.AddE("isUnk", "True"); + eventEl.AddE("unkParams", string.Join(",", ev.GetParameterBytes(tae.BigEndian))); + } + return eventEl; + })); + + root.AddE("eventGroups", anim.EventGroups.Select(group => { + var groupEl = new XElement("eventGroup"); groupEl.AddE("type", group.GroupType); groupEl.AddE("dataType", group.GroupData.DataType); groupEl.AddE("area", group.GroupData.Area); @@ -103,33 +131,15 @@ public XElement UnpackAnim(TAE tae, TAE.Animation anim) if (events.Any()) { groupEl.AddE("events", events.Select(ev => { + var idx = anim.Events.IndexOf(ev); var eventEl = new XElement("event"); - eventEl.AddE("type", ev.Type); - eventEl.AddE("unk04", ev.Unk04); - eventEl.AddE("startTime", ev.StartTime); - eventEl.AddE("endTime", ev.EndTime); - if (tae.AppliedTemplate[tae.EventBank].ContainsKey(ev.Type)) - { - eventEl.AddE("params", ev.Parameters?.Values.Select(p => { - var paramEl = new XElement("param"); - paramEl.SetAttributeValue("name", p.Key); - paramEl.SetAttributeValue("value", p.Value); - return paramEl; - })); - } - else - { - eventEl.AddE("isUnk", true); - eventEl.AddE("unkParams", string.Join(",", ev.GetParameterBytes(tae.BigEndian))); - } - + eventEl.SetAttributeValue("index", idx.ToString()); return eventEl; })); } - return groupEl; })); - return animEl; + return root; } } \ No newline at end of file diff --git a/WitchyBND/Program.cs b/WitchyBND/Program.cs index b6a84790..33c1d7b6 100644 --- a/WitchyBND/Program.cs +++ b/WitchyBND/Program.cs @@ -261,7 +261,6 @@ private static void PrintConfiguration(CliMode mode) { { "Selected mode", (mode.ToString(), null) }, { "Specialized BND handling", (Configuration.Active.Bnd.ToString(), Configuration.Default.Bnd.ToString()) }, - { "DCX decompression only", (Configuration.Active.Dcx.ToString(), Configuration.Default.Dcx.ToString()) }, { "Store PARAM field default values", (Configuration.ParamDefaultValues.ToString(), true.ToString()) }, { "Recursive binder processing", (Configuration.Active.Recursive.ToString(), Configuration.Default.Recursive.ToString()) }, { "Parallel processing", (Configuration.Active.Parallel.ToString(), Configuration.Default.Parallel.ToString()) }, diff --git a/WitchyBND/Services/GameService.cs b/WitchyBND/Services/GameService.cs index e7cc8529..0f42ef58 100644 --- a/WitchyBND/Services/GameService.cs +++ b/WitchyBND/Services/GameService.cs @@ -7,7 +7,6 @@ using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Xml.Linq; -using PPlus.Controls; using SoulsFormats; using WitchyBND.Errors; using WitchyBND.Parsers; @@ -215,7 +214,7 @@ public void PopulateTentativeAC6Types() throw new Exception("Could not determine PARAM type."); } - game = select.Value; + game = select.Content; knownPath = Path.GetDirectoryName(path); } else @@ -238,20 +237,20 @@ public void PopulateTentativeAC6Types() ""11001000"" for Elden Ring 1.10.1 Enter 0, or leave it empty, to use the latest available paramdef."); var input = output.Input("Input regulation version") - .AddValidators(PromptValidators.IsTypeULong()) - .ValidateOnDemand() + // .AddValidators(PromptValidators.IsTypeULong()) + // .ValidateOnDemand() .DefaultIfEmpty("0") - .Config(config => { - config.EnabledAbortKey(false); + .Options(o => { + o.EnabledAbortKey(false); }) .Run(); - if (input.IsAborted || input.Value == "0") + if (input.IsAborted || input.Content == "0") { output.WriteError("Defaulting to latest paramdef."); } else { - regVer = Convert.ToUInt64(input.Value); + regVer = Convert.ToUInt64(input.Content); } } else diff --git a/WitchyBND/Services/LinuxOutputService.cs b/WitchyBND/Services/LinuxOutputService.cs deleted file mode 100644 index 1bd818a8..00000000 --- a/WitchyBND/Services/LinuxOutputService.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using PPlus; -using PPlus.Controls; - -namespace WitchyBND.Services; - -public class LinuxOutputService : IOutputService -{ - public object ConsoleWriterLock { get; } - public int WriteLine(string? value = null, Style? style = null, bool clearrestofline = true) - { - throw new NotImplementedException(); - } - - public int WriteError(string? value = null, Style? style = null, bool clearrestofline = true) - { - throw new NotImplementedException(); - } - - public int DoubleDash(string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, - Style? style = null) - { - throw new NotImplementedException(); - } - - public IControlSelect Select(string prompt, string? description = null) - { - throw new NotImplementedException(); - } - - public void Clear() - { - throw new NotImplementedException(); - } - - public IDisposable EscapeColorTokens() - { - throw new NotImplementedException(); - } - - public IControlKeyPress Confirm(string prompt, Action config = null) - { - throw new NotImplementedException(); - } - - public int SingleDash(string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, - Style? style = null) - { - throw new NotImplementedException(); - } - - public IControlInput Input(string prompt, Action config = null) - { - throw new NotImplementedException(); - } - - public IControlKeyPress KeyPress() - { - throw new NotImplementedException(); - } - - public IControlKeyPress KeyPress(string prompt, Action config = null) - { - throw new NotImplementedException(); - } - - public ConsoleKeyInfo ReadKey(bool intercept = false) - { - throw new NotImplementedException(); - } -} \ No newline at end of file diff --git a/WitchyBND/Services/OutputService.cs b/WitchyBND/Services/OutputService.cs index f1da17ab..16b2746c 100644 --- a/WitchyBND/Services/OutputService.cs +++ b/WitchyBND/Services/OutputService.cs @@ -1,7 +1,7 @@ using System; using System.Globalization; -using PPlus; -using PPlus.Controls; +using PromptPlusLibrary; +using PromptPlusLibrary.PublicLibrary; using WitchyLib; namespace WitchyBND.Services; @@ -9,35 +9,39 @@ namespace WitchyBND.Services; public interface IOutputService { public object ConsoleWriterLock { get; } - public int WriteLine( + public (int Left, int Top) WriteLine( string? value = null, Style? style = null, bool clearrestofline = true); - public int WriteError( + public (int Left, int Top) WriteLineColor( + string? value = null, + Overflow overflow = Overflow.Crop, + bool clearrestofline = true); + public (int Left, int Top) WriteError( string? value = null, Style? style = null, bool clearrestofline = true); - public int DoubleDash( + public void DoubleDash( string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, Style? style = null); - public IControlSelect Select(string prompt, string? description = null); + public ISelectControl Select(string prompt, string? description = null); public void Clear(); - public IDisposable EscapeColorTokens(); + // public IDisposable EscapeColorTokens(); - public IControlKeyPress Confirm(string prompt, Action config = null); - public int SingleDash( + public IKeyPressControl Confirm(string prompt, Action config = null); + public void SingleDash( string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, Style? style = null); - public IControlInput Input(string prompt, Action config = null); - public IControlKeyPress KeyPress(); - public IControlKeyPress KeyPress(string prompt, Action config = null); + public IInputControl Input(string prompt, Action config = null); + public IKeyPressControl KeyPress(); + public IKeyPressControl KeyPress(string prompt, Action config = null); public ConsoleKeyInfo ReadKey(bool intercept = false); } public class OutputService : IOutputService @@ -47,38 +51,53 @@ public OutputService() PromptPlus.Config.DefaultCulture = new CultureInfo("en-us"); if (!OperatingSystem.IsWindows()) { - PromptPlus.ResetColor(); + PromptPlus.Console.ResetColor(); } } public object ConsoleWriterLock => new(); - public int WriteLine(string? value = null, Style? style = null, bool clearrestofline = true) + public (int Left, int Top) WriteLine(string? value = null, Style? style = null, bool clearrestofline = true) + { + if (Configuration.Active.Silent) return (0, 0); + try + { + (int Left, int Top) outCode; + lock (ConsoleWriterLock) + outCode = PromptPlus.Console.Write(value + Environment.NewLine, style, clearrestofline); + return outCode; + } + catch + { + return (-1, -1); + } + } + public (int Left, int Top) WriteLineColor(string? value = null, Overflow overflow = Overflow.Crop, bool clearrestofline = true) { - if (Configuration.Active.Silent) return 0; + if (Configuration.Active.Silent) return (0, 0); try { - int outCode; + (int Left, int Top) outCode; lock (ConsoleWriterLock) - outCode = PromptPlus.Write(value + Environment.NewLine, style, clearrestofline); + outCode = PromptPlus.Console.WriteColor(value + Environment.NewLine, Overflow.Crop, clearrestofline); return outCode; } catch { - return -1; + return (-1, -1); } } - public int WriteError(string? value = null, Style? style = null, bool clearrestofline = true) + public (int Left, int Top) WriteError(string? value = null, Style? style = null, bool clearrestofline = true) { - if (Configuration.Active.Silent) return 0; + if (Configuration.Active.Silent) return (0, 0); try { - int outCode; + (int Left, int Top) outCode; lock (ConsoleWriterLock) { - using (PromptPlus.OutputError()) + using (PromptPlus.Console.OutputError()) { - outCode = PromptPlus.Write(value + Environment.NewLine, style, clearrestofline); + outCode = PromptPlus.Console.Write(value + Environment.NewLine, style, clearrestofline); } } @@ -86,75 +105,72 @@ public int WriteError(string? value = null, Style? style = null, bool clearresto } catch { - return -1; + return (-1, -1); } } - public int DoubleDash(string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, + public void DoubleDash(string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, Style? style = null) { - if (Configuration.Active.Silent) return 0; - int outCode; + if (Configuration.Active.Silent) return; lock (ConsoleWriterLock) - outCode = PromptPlus.DoubleDash(value, dashOptions, extralines, style); - return outCode; + PromptPlus.Widgets.DoubleDash(value, dashOptions, extralines, style); } - public IControlSelect Select(string prompt, string? description = null) + public ISelectControl Select(string prompt, string? description = null) { lock (ConsoleWriterLock) - return PromptPlus.Select(prompt, description); + return PromptPlus.Controls.Select(prompt, description); } public void Clear() { if (Configuration.Active.Silent) return; lock (ConsoleWriterLock) - PromptPlus.Clear(); + PromptPlus.Console.Clear(); } - public IDisposable EscapeColorTokens() - { - return PromptPlus.EscapeColorTokens(); - } + // public IDisposable EscapeColorTokens() + // { + // return PromptPlus.Config.EscapeColorTokens(); + // } - public IControlKeyPress Confirm(string prompt, Action config = null) + public IKeyPressControl Confirm(string prompt, Action opt = null) { lock (ConsoleWriterLock) - return PromptPlus.Confirm(prompt, config); + return PromptPlus.Controls.Confirm(prompt).Options(opt); } - public int SingleDash(string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, + public void SingleDash(string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, Style? style = null) { - if (Configuration.Active.Silent) return 0; - int outCode; + if (Configuration.Active.Silent) return; lock (ConsoleWriterLock) - outCode = PromptPlus.SingleDash(value, dashOptions, extralines, style); - return outCode; + PromptPlus.Widgets.SingleDash(value, dashOptions, extralines, style); } - public IControlInput Input(string prompt, Action config = null) + public IInputControl Input(string prompt, Action opt = null) { lock (ConsoleWriterLock) - return PromptPlus.Input(prompt, config); + return PromptPlus.Controls.Input(prompt).Options(opt); } - public IControlKeyPress KeyPress() + public IKeyPressControl KeyPress() { lock (ConsoleWriterLock) - return PromptPlus.KeyPress(); + return PromptPlus.Controls.KeyPress(); } - public IControlKeyPress KeyPress(string prompt, Action config = null) + public IKeyPressControl KeyPress(string prompt, Action? opt = null) { + opt ??= _ => { }; lock (ConsoleWriterLock) - return PromptPlus.KeyPress(prompt, config); + return PromptPlus.Controls.KeyPress(prompt).Options(opt); } public ConsoleKeyInfo ReadKey(bool intercept = false) { lock (ConsoleWriterLock) - return PromptPlus.ReadKey(intercept); + return PromptPlus.Console.ReadKey(intercept); } } \ No newline at end of file diff --git a/WitchyBND/Services/SilentOutputService.cs b/WitchyBND/Services/SilentOutputService.cs index 535db970..41000c98 100644 --- a/WitchyBND/Services/SilentOutputService.cs +++ b/WitchyBND/Services/SilentOutputService.cs @@ -1,6 +1,5 @@ using System; -using PPlus; -using PPlus.Controls; +using PromptPlusLibrary; namespace WitchyBND.Services; @@ -8,23 +7,28 @@ public class SilentOutputService : IOutputService { public object ConsoleWriterLock { get; } - public int WriteLine(string? value = null, Style? style = null, bool clearrestofline = true) + public (int, int) WriteLine(string? value = null, Style? style = null, bool clearrestofline = true) { - return -1; + return (-1, -1); } - public int WriteError(string? value = null, Style? style = null, bool clearrestofline = true) + public (int Left, int Top) WriteLineColor(string? value = null, Overflow overflow = Overflow.Crop, + bool clearrestofline = true) { - return -1; + throw new NotImplementedException(); + } + + public (int, int) WriteError(string? value = null, Style? style = null, bool clearrestofline = true) + { + return (-1, -1); } - public int DoubleDash(string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, + public void DoubleDash(string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, Style? style = null) { - return -1; } - public IControlSelect Select(string prompt, string? description = null) + public ISelectControl Select(string prompt, string? description = null) { throw new NotImplementedException(); } @@ -39,28 +43,27 @@ public IDisposable EscapeColorTokens() throw new NotImplementedException(); } - public IControlKeyPress Confirm(string prompt, Action config = null) + public IKeyPressControl Confirm(string prompt, Action opt = null) { throw new NotImplementedException(); } - public int SingleDash(string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, + public void SingleDash(string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, Style? style = null) { - return -1; } - public IControlInput Input(string prompt, Action config = null) + public IInputControl Input(string prompt, Action opt = null) { throw new NotImplementedException(); } - public IControlKeyPress KeyPress() + public IKeyPressControl KeyPress() { throw new NotImplementedException(); } - public IControlKeyPress KeyPress(string prompt, Action config = null) + public IKeyPressControl KeyPress(string prompt, Action opt = null) { throw new NotImplementedException(); } diff --git a/WitchyBND/Services/UpdateService.cs b/WitchyBND/Services/UpdateService.cs index f1a0ead1..7cb3f787 100644 --- a/WitchyBND/Services/UpdateService.cs +++ b/WitchyBND/Services/UpdateService.cs @@ -11,7 +11,7 @@ using System.Threading.Tasks; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -using PPlus; +using PromptPlusLibrary; using WitchyBND.CliModes; using WitchyLib; @@ -97,10 +97,10 @@ public bool CheckForUpdates(string[] args) while (loop) { var select = output.Select("Select an option") - .Config(c => c.EnabledAbortKey(false)) + .Options(c => c.EnabledAbortKey(false)) .Run(); - switch (select.Value) + switch (select.Content) { case UpdateOptions.Update: if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) @@ -118,7 +118,7 @@ public bool CheckForUpdates(string[] args) { output.WriteLine("Automatic updating is currently only supported for Windows. Please download the new version manually."); var downloadConfirm = output.Confirm("Would you like to go to the download page?").Run(); - if (downloadConfirm.Value.IsYesResponseKey()) + if (downloadConfirm.Content.Value.IsYesResponseKey()) { Process.Start(new ProcessStartInfo { FileName = ReleaseNotesUrl, UseShellExecute = true }); @@ -144,7 +144,7 @@ public bool CheckForUpdates(string[] args) var confirm = output.Confirm( "Are you sure? You will not receive any more update prompts for this version, and be unable to use the auto-updater for it.") .Run(); - if (confirm.Value.IsYesResponseKey()) + if (confirm.Content.Value.IsYesResponseKey()) { Configuration.Stored.LastUpdateCheck = DateTime.UtcNow; Configuration.Stored.SkipUpdateVersion = onlineVersion; @@ -415,9 +415,9 @@ async Task downloadLatest(Version onlineVersion, string downloadUrl) var contextMenuQuery = output.Confirm( @"Would you like to enable Windows context menu integration? You'll be able to perform common WitchyBND operations by right-clicking on files and folders.") - .Config(c => c.EnabledAbortKey(false)) + .Options(c => c.EnabledAbortKey(false)) .Run(); - if (contextMenuQuery.Value.IsYesResponseKey()) + if (contextMenuQuery.Content.Value.IsYesResponseKey()) { IntegrationMode.RegisterContext(); output.WriteLine("Windows integration enabled."); diff --git a/WitchyBND/WitchyBND.csproj b/WitchyBND/WitchyBND.csproj index 52f4213b..eaf75af0 100644 --- a/WitchyBND/WitchyBND.csproj +++ b/WitchyBND/WitchyBND.csproj @@ -1,14 +1,13 @@  - net8.0 - x64 + net9.0 win-x64 + x64 Exe true false WitchyBND WitchyBND - ..\bin\publish enable True true @@ -17,7 +16,17 @@ true true true + false + + + + ..\bin\publish\win-x64 + + + + ..\bin\publish\linux-x64 + ..\bin\Debug\ @@ -83,18 +92,21 @@ - + - + + + + + + + - - - - + diff --git a/WitchyBND/packages.lock.json b/WitchyBND/packages.lock.json index d9eaf37b..f0791817 100644 --- a/WitchyBND/packages.lock.json +++ b/WitchyBND/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net8.0": { + "net9.0": { "CommandLineParser": { "type": "Direct", "requested": "[2.9.1, )", @@ -60,9 +60,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.19, )", - "resolved": "8.0.19", - "contentHash": "IhHf+zeZiaE5EXRyxILd4qM+Hj9cxV3sa8MpzZgeEhpvaG3a1VEGF6UCaPFLO44Kua3JkLKluE0SWVamS50PlA==" + "requested": "[9.0.10, )", + "resolved": "9.0.10", + "contentHash": "sseaSJcBxKEpkc59hnB00b3NmJdGvJLfj74HK+nucHxERxbZSUREuWKjC9ywc+HdzJvJyiP2eiyEOROaGSfcPw==" }, "NativeFileDialogSharp": { "type": "Direct", @@ -183,16 +183,6 @@ "resolved": "8.0.0", "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "3.1.0", - "contentHash": "z7aeg8oHln2CuNulfhiLYxCVMPEwBl3rzicjvIX+4sUuCwvXw5oXQEtbiU2c0z4qYL5L3Kmx0mMA/+t/SbY67w==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, "Newtonsoft.Json": { "type": "Transitive", "resolved": "13.0.3", @@ -200,13 +190,10 @@ }, "PromptPlus": { "type": "Transitive", - "resolved": "4.2.0", - "contentHash": "Won6lYBsdKarWafpfMjd81MlI7WPnW8cDQ7ODY5RBqlOaQ2vrHEOc22BMOEHHwJDm777DNLvcTN4Dy22fBrbBQ==", + "resolved": "5.0.0-IB2", + "contentHash": "DPRvXZO2QmUTDDWCSR9vHzyp+/qtgeEnlU9OD02ilvV9q4Fl0ZrPcL+MsdTz0gfg/biyB8c0Ff9OxR+x3E3OPA==", "dependencies": { - "EastAsianWidthDotNet": "1.0.1", - "System.ComponentModel.Annotations": "5.0.0", - "System.IO": "4.3.0", - "System.Text.Json": "7.0.3" + "EastAsianWidthDotNet": "1.0.1" } }, "securifybv.PropertyStore": { @@ -214,54 +201,15 @@ "resolved": "0.1.0", "contentHash": "N7oMyWl3RCbSi8SFK3vVtBpJD3OompLGZOwO2VQpyw6d8Qk8HTxCSuQzeSB4QzUWewQvMoQu5Qr5QgDQ1z5/5g==" }, - "System.ComponentModel.Annotations": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" - }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", "resolved": "8.0.0", "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "System.Text.Encoding.CodePages": { "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "aeu4FlaUTemuT1qOd1MyU4T516QR4Fy+9yDbwWMPHOHy7U8FD6SgTzdZFO7gHcfAPHtECqInbwklVvUK4RHcNg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "3.1.0" - } + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" }, "System.Text.Encodings.Web": { "type": "Transitive", @@ -276,16 +224,6 @@ "System.Text.Encodings.Web": "8.0.0-preview.7.23375.6" } }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "System.ValueTuple": { "type": "Transitive", "resolved": "4.5.0", @@ -301,7 +239,7 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.4.0, )", "DrSwizzler": "[1.1.1, )", - "System.Text.Encoding.CodePages": "[4.7.0, )", + "System.Text.Encoding.CodePages": "[8.0.0, )", "System.ValueTuple": "[4.5.0, )", "ZstdNet": "[1.4.5, )" } @@ -326,107 +264,27 @@ "Microsoft.CSharp": "[4.7.0, )", "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", "Newtonsoft.Json": "[13.0.3, )", - "PromptPlus": "[4.2.0, )", + "PromptPlus": "[5.0.0-IB2, )", "WitchyFormats": "[2.17.0, )" } } }, - "net8.0/win-x64": { + "net9.0/win-x64": { "NativeFileDialogSharp": { "type": "Direct", "requested": "[0.6.0-alpha, )", "resolved": "0.6.0-alpha", "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" }, - "runtime.any.System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" - }, - "runtime.any.System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", - "dependencies": { - "System.Private.Uri": "4.3.0" - } - }, - "runtime.any.System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" - }, - "runtime.any.System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "runtime.any.System.IO": "4.3.0" - } - }, - "System.Private.Uri": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "runtime.any.System.Runtime": "4.3.0" - } - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "runtime.any.System.Text.Encoding": "4.3.0" - } - }, "System.Text.Encoding.CodePages": { "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "aeu4FlaUTemuT1qOd1MyU4T516QR4Fy+9yDbwWMPHOHy7U8FD6SgTzdZFO7gHcfAPHtECqInbwklVvUK4RHcNg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "3.1.0" - } + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" }, "System.Text.Encodings.Web": { "type": "Transitive", "resolved": "8.0.0-preview.7.23375.6", "contentHash": "vCdCGFDzYkDfcnNd5ck7ngX9IUhXoMkfUlLWWw0BWBs/6LOF596LtkoG15pGxLS4s/HuTHsyrQ6USZSZa8blNA==" - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "runtime.any.System.Threading.Tasks": "4.3.0" - } } } } diff --git a/WitchyFormats/Formats/FormatExtensions.cs b/WitchyFormats/Formats/FormatExtensions.cs new file mode 100644 index 00000000..d86fc759 --- /dev/null +++ b/WitchyFormats/Formats/FormatExtensions.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using SoulsFormats; +namespace WitchyFormats; + +public static class FormatExtensions +{ + /// + /// Converts a value to a string based on this ParameterTemplate's type. + /// + public static string ValueToStorage(this TAE.Template.ParameterTemplate template, object val) + { + if (template.EnumEntries != null) + { + if (template.EnumEntries.Values.Contains(val)) + { + return val.ToString(); + } + } + + switch (template.Type) + { + case TAE.Template.ParamType.aob: return string.Join(" ", ((byte[])val).Select(b => b.ToString("X2"))); + case TAE.Template.ParamType.x8: return ((byte)val).ToString("X2"); + case TAE.Template.ParamType.x16: return ((ushort)val).ToString("X4"); + case TAE.Template.ParamType.x32: return ((uint)val).ToString("X8"); + case TAE.Template.ParamType.x64: return ((ulong)val).ToString("X16"); + case TAE.Template.ParamType.b: return ((bool)val) ? "True" : "False"; + case TAE.Template.ParamType.f32grad: + return $"{((System.Numerics.Vector2)val).X}|{((System.Numerics.Vector2)val).Y}"; + default: return val.ToString(); + } + } + + /// + /// Converts a string to a value based on this ParameterTemplate's type. + /// + public static object StorageToValue(this TAE.Template.ParameterTemplate template, string str) + { + if (str == null) + return null; + + IEnumerable GetArrayFromSingleLineString(string s) + { + return s.Split(' ') + .Where(st => !string.IsNullOrWhiteSpace(st)) + .Select(st => st.Trim()); + } + + List GetArrayFromString(string s) + { + List result = new List(); + var lines = s.Split('\n'); + foreach (var l in lines) + result.AddRange(GetArrayFromSingleLineString(l.Replace("\r", "").Replace("\n", "").Replace("\t", ""))); + return result; + } + + switch (template.Type) + { + case TAE.Template.ParamType.aob: + return GetArrayFromString(str).Select(b => byte.Parse(b, System.Globalization.NumberStyles.HexNumber)) + .ToArray(); + case TAE.Template.ParamType.u8: return byte.Parse(str); + case TAE.Template.ParamType.x8: return byte.Parse(str, System.Globalization.NumberStyles.HexNumber); + case TAE.Template.ParamType.s8: return sbyte.Parse(str); + case TAE.Template.ParamType.u16: return ushort.Parse(str); + case TAE.Template.ParamType.x16: return ushort.Parse(str, System.Globalization.NumberStyles.HexNumber); + case TAE.Template.ParamType.s16: return short.Parse(str); + case TAE.Template.ParamType.u32: return uint.Parse(str); + case TAE.Template.ParamType.x32: return uint.Parse(str, System.Globalization.NumberStyles.HexNumber); + case TAE.Template.ParamType.s32: return int.Parse(str); + case TAE.Template.ParamType.u64: return ulong.Parse(str); + case TAE.Template.ParamType.x64: return ulong.Parse(str, System.Globalization.NumberStyles.HexNumber); + case TAE.Template.ParamType.s64: return long.Parse(str); + case TAE.Template.ParamType.f32: return float.Parse(str); + case TAE.Template.ParamType.f32grad: + var floatSplit = str.Split('|'); + float gradStart = float.Parse(floatSplit[0]); + float gradEnd = float.Parse(floatSplit[1]); + return new System.Numerics.Vector2(gradStart, gradEnd); + case TAE.Template.ParamType.f64: return double.Parse(str); + case TAE.Template.ParamType.b: + string toLower = str.ToLower().Trim(); + if (toLower == "true") + return true; + else if (toLower == "false") + return false; + else + throw new FormatException("Boolean value must be either 'True' or 'False', case-insensitive."); + default: throw new Exception($"Invalid ParamTemplate ParamType: {template.Type.ToString()}"); + } + } +} \ No newline at end of file diff --git a/WitchyFormats/WitchyFormats.csproj b/WitchyFormats/WitchyFormats.csproj index 45164e3f..2c0d90dd 100644 --- a/WitchyFormats/WitchyFormats.csproj +++ b/WitchyFormats/WitchyFormats.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 true false WitchyFormats diff --git a/WitchyFormats/packages.lock.json b/WitchyFormats/packages.lock.json index d8dfa697..d178e03f 100644 --- a/WitchyFormats/packages.lock.json +++ b/WitchyFormats/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net8.0": { + "net9.0": { "BouncyCastle.Cryptography": { "type": "Transitive", "resolved": "2.4.0", @@ -12,18 +12,10 @@ "resolved": "1.1.1", "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "3.1.0", - "contentHash": "z7aeg8oHln2CuNulfhiLYxCVMPEwBl3rzicjvIX+4sUuCwvXw5oXQEtbiU2c0z4qYL5L3Kmx0mMA/+t/SbY67w==" - }, "System.Text.Encoding.CodePages": { "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "aeu4FlaUTemuT1qOd1MyU4T516QR4Fy+9yDbwWMPHOHy7U8FD6SgTzdZFO7gHcfAPHtECqInbwklVvUK4RHcNg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "3.1.0" - } + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" }, "System.ValueTuple": { "type": "Transitive", @@ -40,7 +32,7 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.4.0, )", "DrSwizzler": "[1.1.1, )", - "System.Text.Encoding.CodePages": "[4.7.0, )", + "System.Text.Encoding.CodePages": "[8.0.0, )", "System.ValueTuple": "[4.5.0, )", "ZstdNet": "[1.4.5, )" } diff --git a/WitchyLib/HexHelpers.cs b/WitchyLib/HexHelpers.cs index 021fa646..3d4f8044 100644 --- a/WitchyLib/HexHelpers.cs +++ b/WitchyLib/HexHelpers.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using System.Text; -using PPlus; namespace WitchyLib; diff --git a/WitchyLib/WBUtil.cs b/WitchyLib/WBUtil.cs index cb46d176..bc3cef66 100644 --- a/WitchyLib/WBUtil.cs +++ b/WitchyLib/WBUtil.cs @@ -1,7 +1,6 @@ #nullable enable using System; using System.Collections.Generic; -using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.IO; using System.Linq; @@ -12,12 +11,9 @@ using System.Xml.Linq; using System.Xml.Serialization; using Microsoft.Extensions.FileSystemGlobbing; -using Microsoft.Win32; -using Newtonsoft.Json; -using PPlus; +using PromptPlusLibrary; using SoulsFormats; using SoulsFormats.Cryptography; -using SoulsFormats.Exceptions; namespace WitchyLib; @@ -625,28 +621,28 @@ static string UnEscapeString(string src) public static bool ObnoxiousWarning(List lines) { - PromptPlus.WriteLine(""); + PromptPlus.Console.WriteLine(""); foreach (string line in lines) { - PromptPlus.WriteLine(line); - var cursor = PromptPlus.GetCursorPosition(); - PromptPlus.WriteLine(""); - PromptPlus.WaitTimer("Please read carefully, then press any key...", TimeSpan.FromSeconds(1)); - PromptPlus.ClearLine(); - PromptPlus.SetCursorPosition(cursor.Left, cursor.Top); - PromptPlus.WriteLine(""); - PromptPlus.KeyPress("Please read carefully, then press any key...") - .Config(a => a.EnabledAbortKey(false)) + PromptPlus.Console.WriteLine(line); + var cursor = PromptPlus.Console.GetCursorPosition(); + PromptPlus.Console.WriteLine(""); + PromptPlus.Controls.WaitTimer(TimeSpan.FromSeconds(1), "Please read carefully, then press any key..."); + // ClearLine(); + PromptPlus.Console.SetCursorPosition(cursor.Left, cursor.Top); + PromptPlus.Console.WriteLineColor(""); + PromptPlus.Controls.KeyPress("Please read carefully, then press any key...") + .Options(a => a.EnabledAbortKey(false)) .Run(); - PromptPlus.ClearLine(); - PromptPlus.SetCursorPosition(cursor.Left, cursor.Top); + // PromptPlus.Console.ClearLine(); + PromptPlus.Console.SetCursorPosition(cursor.Left, cursor.Top); } - PromptPlus.WriteLine(""); - var confirm = PromptPlus.Confirm(@"Do you still wish to proceed?").Run(); + PromptPlus.Console.WriteLine(""); + var confirm = PromptPlus.Controls.Confirm(@"Do you still wish to proceed?").Run(); - if (confirm.Value.IsNoResponseKey() || confirm.IsAborted) + if (confirm.Content.Value.IsAbortKeyPress() || confirm.IsAborted) return false; return true; diff --git a/WitchyLib/WitchyLib.csproj b/WitchyLib/WitchyLib.csproj index 3960f45a..504e8207 100644 --- a/WitchyLib/WitchyLib.csproj +++ b/WitchyLib/WitchyLib.csproj @@ -1,6 +1,6 @@ - net8.0 + net9.0 true false WitchyLib @@ -16,7 +16,7 @@ - + diff --git a/WitchyLib/packages.lock.json b/WitchyLib/packages.lock.json index a7e24d9c..a7e37b7e 100644 --- a/WitchyLib/packages.lock.json +++ b/WitchyLib/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net8.0": { + "net9.0": { "Microsoft.CSharp": { "type": "Direct", "requested": "[4.7.0, )", @@ -22,14 +22,11 @@ }, "PromptPlus": { "type": "Direct", - "requested": "[4.2.0, )", - "resolved": "4.2.0", - "contentHash": "Won6lYBsdKarWafpfMjd81MlI7WPnW8cDQ7ODY5RBqlOaQ2vrHEOc22BMOEHHwJDm777DNLvcTN4Dy22fBrbBQ==", + "requested": "[5.0.0-IB2, )", + "resolved": "5.0.0-IB2", + "contentHash": "DPRvXZO2QmUTDDWCSR9vHzyp+/qtgeEnlU9OD02ilvV9q4Fl0ZrPcL+MsdTz0gfg/biyB8c0Ff9OxR+x3E3OPA==", "dependencies": { - "EastAsianWidthDotNet": "1.0.1", - "System.ComponentModel.Annotations": "5.0.0", - "System.IO": "4.3.0", - "System.Text.Json": "7.0.3" + "EastAsianWidthDotNet": "1.0.1" } }, "BouncyCastle.Cryptography": { @@ -47,82 +44,10 @@ "resolved": "1.0.1", "contentHash": "vCn17XpsjpqAQvWCa5oUh81d/AVytUcBG9frXoDa+f66iuAiq9T4kDcqQnyp3dbN9cJ0cJA6ML98glpf315haQ==" }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "3.1.0", - "contentHash": "z7aeg8oHln2CuNulfhiLYxCVMPEwBl3rzicjvIX+4sUuCwvXw5oXQEtbiU2c0z4qYL5L3Kmx0mMA/+t/SbY67w==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "System.ComponentModel.Annotations": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "System.Text.Encoding.CodePages": { "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "aeu4FlaUTemuT1qOd1MyU4T516QR4Fy+9yDbwWMPHOHy7U8FD6SgTzdZFO7gHcfAPHtECqInbwklVvUK4RHcNg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "3.1.0" - } - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg==" - }, - "System.Text.Json": { - "type": "Transitive", - "resolved": "7.0.3", - "contentHash": "AyjhwXN1zTFeIibHimfJn6eAsZ7rTBib79JQpzg8WAuR/HKDu9JGNHTuu3nbbXQ/bgI+U4z6HtZmCHNXB1QXrQ==", - "dependencies": { - "System.Text.Encodings.Web": "7.0.0" - } - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" }, "System.ValueTuple": { "type": "Transitive", @@ -139,7 +64,7 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.4.0, )", "DrSwizzler": "[1.1.1, )", - "System.Text.Encoding.CodePages": "[4.7.0, )", + "System.Text.Encoding.CodePages": "[8.0.0, )", "System.ValueTuple": "[4.5.0, )", "ZstdNet": "[1.4.5, )" } diff --git a/WitchyTests/Services/TestOutputService.cs b/WitchyTests/Services/TestOutputService.cs index 1d87cd74..c8f684e3 100644 --- a/WitchyTests/Services/TestOutputService.cs +++ b/WitchyTests/Services/TestOutputService.cs @@ -1,5 +1,4 @@ -using PPlus; -using PPlus.Controls; +using PromptPlusLibrary; using WitchyBND.Services; namespace WitchyTests.Services; @@ -8,25 +7,30 @@ public class TestOutputService : IOutputService { public object ConsoleWriterLock { get; } - public int WriteLine(string? value = null, Style? style = null, bool clearrestofline = true) + public (int, int) WriteLine(string? value = null, Style? style = null, bool clearrestofline = true) { TestContext.WriteLine(value); - return 1; + return (-1, -1); } - public int WriteError(string? value = null, Style? style = null, bool clearrestofline = true) + public (int Left, int Top) WriteLineColor(string? value = null, Overflow overflow = Overflow.Crop, + bool clearrestofline = true) + { + throw new NotImplementedException(); + } + + public (int, int) WriteError(string? value = null, Style? style = null, bool clearrestofline = true) { TestContext.Error.WriteLine(value); - return 1; + return (-1, -1); } - public int DoubleDash(string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, + public void DoubleDash(string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, Style? style = null) { - return 0; } - public IControlSelect Select(string prompt, string? description = null) + public ISelectControl Select(string prompt, string? description = null) { throw new NotImplementedException(); } @@ -40,28 +44,27 @@ public IDisposable EscapeColorTokens() throw new NotImplementedException(); } - public IControlKeyPress Confirm(string prompt, Action config = null) + public IKeyPressControl Confirm(string prompt, Action opt = null) { throw new NotImplementedException(); } - public int SingleDash(string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, + public void SingleDash(string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, Style? style = null) { - return 0; } - public IControlInput Input(string prompt, Action config = null) + public IInputControl Input(string prompt, Action opt = null) { throw new NotImplementedException(); } - public IControlKeyPress KeyPress() + public IKeyPressControl KeyPress() { throw new NotImplementedException(); } - public IControlKeyPress KeyPress(string prompt, Action config = null) + public IKeyPressControl KeyPress(string prompt, Action opt = null) { throw new NotImplementedException(); } diff --git a/WitchyTests/TestBase.cs b/WitchyTests/TestBase.cs index 1f1758a1..fe72ad4f 100644 --- a/WitchyTests/TestBase.cs +++ b/WitchyTests/TestBase.cs @@ -2,7 +2,7 @@ using System.Text; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using PPlus; +using PromptPlusLibrary; using WitchyBND; using WitchyBND.Services; using WitchyLib; @@ -56,9 +56,8 @@ public void StartUp() Configuration.Active.Parallel = Parallel; WBUtil.ExeLocation = TestContext.CurrentContext.TestDirectory; Environment.SetEnvironmentVariable("PromptPlusOverUnitTest", "true"); - PromptPlus.Setup(); - PromptPlus.Reset(); - PromptPlus.Clear(); + // PromptPlus.Reset(); + // PromptPlus.Clear(); Console.OutputEncoding = Encoding.UTF8; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; PromptPlus.Config.DefaultCulture = new CultureInfo("en-us"); diff --git a/WitchyTests/WitchyTests.csproj b/WitchyTests/WitchyTests.csproj index 55fecf71..5eb5b35f 100644 --- a/WitchyTests/WitchyTests.csproj +++ b/WitchyTests/WitchyTests.csproj @@ -1,7 +1,7 @@ - net8.0-windows + net9.0 enable enable diff --git a/WitchyTests/packages.lock.json b/WitchyTests/packages.lock.json index c0fb9ccb..adcf2f2e 100644 --- a/WitchyTests/packages.lock.json +++ b/WitchyTests/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net8.0-windows7.0": { + "net9.0": { "coverlet.collector": { "type": "Direct", "requested": "[3.2.0, )", @@ -207,8 +207,8 @@ }, "Microsoft.NETCore.Platforms": { "type": "Transitive", - "resolved": "3.1.0", - "contentHash": "z7aeg8oHln2CuNulfhiLYxCVMPEwBl3rzicjvIX+4sUuCwvXw5oXQEtbiU2c0z4qYL5L3Kmx0mMA/+t/SbY67w==" + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" }, "Microsoft.NETCore.Targets": { "type": "Transitive", @@ -249,13 +249,10 @@ }, "PromptPlus": { "type": "Transitive", - "resolved": "4.2.0", - "contentHash": "Won6lYBsdKarWafpfMjd81MlI7WPnW8cDQ7ODY5RBqlOaQ2vrHEOc22BMOEHHwJDm777DNLvcTN4Dy22fBrbBQ==", + "resolved": "5.0.0-IB2", + "contentHash": "DPRvXZO2QmUTDDWCSR9vHzyp+/qtgeEnlU9OD02ilvV9q4Fl0ZrPcL+MsdTz0gfg/biyB8c0Ff9OxR+x3E3OPA==", "dependencies": { - "EastAsianWidthDotNet": "1.0.1", - "System.ComponentModel.Annotations": "5.0.0", - "System.IO": "4.3.0", - "System.Text.Json": "7.0.3" + "EastAsianWidthDotNet": "1.0.1" } }, "securifybv.PropertyStore": { @@ -271,11 +268,6 @@ "securifybv.PropertyStore": "0.1.0" } }, - "System.ComponentModel.Annotations": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" - }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", "resolved": "8.0.0", @@ -362,11 +354,8 @@ }, "System.Text.Encoding.CodePages": { "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "aeu4FlaUTemuT1qOd1MyU4T516QR4Fy+9yDbwWMPHOHy7U8FD6SgTzdZFO7gHcfAPHtECqInbwklVvUK4RHcNg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "3.1.0" - } + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" }, "System.Text.Encodings.Web": { "type": "Transitive", @@ -406,7 +395,7 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.4.0, )", "DrSwizzler": "[1.1.1, )", - "System.Text.Encoding.CodePages": "[4.7.0, )", + "System.Text.Encoding.CodePages": "[8.0.0, )", "System.ValueTuple": "[4.5.0, )", "ZstdNet": "[1.4.5, )" } @@ -448,7 +437,7 @@ "Microsoft.CSharp": "[4.7.0, )", "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", "Newtonsoft.Json": "[13.0.3, )", - "PromptPlus": "[4.2.0, )", + "PromptPlus": "[5.0.0-IB2, )", "WitchyFormats": "[2.17.0, )" } } diff --git a/global.json b/global.json index d599efa0..263c7a18 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.304" + "version": "9.0.306" } } \ No newline at end of file From a72995aaaa8a65b078b112886eb12b4eb307bca4 Mon Sep 17 00:00:00 2001 From: ividyon <1077140+ividyon@users.noreply.github.com> Date: Sun, 21 Dec 2025 10:18:11 +0100 Subject: [PATCH 02/15] assets --- .../Assets/Paramdex/ER/Meta/AIAttackParam.xml | 244 +- .../Paramdex/ER/Meta/ActionButtonParam.xml | 182 +- .../Paramdex/ER/Meta/AiAnimTblParam.xml | 639 +++- .../Assets/Paramdex/ER/Meta/AiSoundParam.xml | 104 +- .../Paramdex/ER/Meta/AssetGeometryParam.xml | 428 ++- .../Paramdex/ER/Meta/BonfireWarpParam.xml | 13 +- .../Assets/Paramdex/ER/Meta/BuddyParam.xml | 15 + .../Assets/Paramdex/ER/Meta/BulletParam.xml | 3 +- .../Paramdex/ER/Meta/CalcCorrectGraph.xml | 4 +- .../Paramdex/ER/Meta/CharaInitParam.xml | 2 + .../ER/Meta/ClearCountCorrectParam.xml | 6 +- .../Paramdex/ER/Meta/EquipParamAccessory.xml | 3 +- .../Assets/Paramdex/ER/Meta/EquipParamGem.xml | 3 +- .../Paramdex/ER/Meta/EquipParamGoods.xml | 93 +- .../Paramdex/ER/Meta/EquipParamProtector.xml | 10 +- .../Paramdex/ER/Meta/EquipParamWeapon.xml | 23 +- .../ER/Meta/GameSystemCommonParam.xml | 81 +- .../Assets/Paramdex/ER/Meta/MagicParam.xml | 35 +- .../Paramdex/ER/Meta/MenuCommonParam.xml | 6 + .../Paramdex/ER/Meta/NetworkMsgParam.xml | 5 + .../Assets/Paramdex/ER/Meta/NetworkParam.xml | 16 +- .../Assets/Paramdex/ER/Meta/NpcParam.xml | 12 +- .../Paramdex/ER/Meta/PlayerCommonParam.xml | 16 +- .../ER/Meta/ReinforceParamProtector.xml | 4 +- .../Paramdex/ER/Meta/ReinforceParamWeapon.xml | 4 +- .../Paramdex/ER/Meta/ShopLineupParam.xml | 3 +- .../Assets/Paramdex/ER/Meta/SpEffect.xml | 2583 ++++++++++++++--- .../Paramdex/ER/Meta/WorldMapPointParam.xml | 6 +- .../NR/Defs/AcrossDayCorrectParam.xml | 68 +- .../Paramdex/NR/Defs/ActionButtonParam.xml | 252 +- .../Assets/Paramdex/NR/Defs/AiSoundParam.xml | 117 +- .../Paramdex/NR/Defs/AntiqueStandParam.xml | 28 +- .../NR/Defs/AssetEnvironmentGeometryParam.xml | 943 +++++- .../NR/Defs/AssetMaterialSfxParam.xml | 229 +- .../Paramdex/NR/Defs/AssetModelSfxParam.xml | 196 +- .../Assets/Paramdex/NR/Defs/AtkParam.xml | 1527 +++++++++- .../Defs/AttachEffectFilterCategoryParam.xml | 7 +- .../NR/Defs/AttachEffectFilterParam.xml | 14 +- .../AttachEffectFilterSubCategoryParam.xml | 16 + .../Paramdex/NR/Defs/AttachEffectParam.xml | 58 +- .../NR/Defs/AttachEffectTableParam.xml | 9 +- .../NR/Defs/AttackElementCorrectParam.xml | 522 +++- .../NR/Defs/AutoCreateEnvSoundParam.xml | 87 +- .../Assets/Paramdex/NR/Defs/BehaviorParam.xml | 90 +- .../Paramdex/NR/Defs/BonfireWarpParam.xml | 522 +++- .../Assets/Paramdex/NR/Defs/BuddyParam.xml | 244 +- .../Paramdex/NR/Defs/BuddyStoneParam.xml | 124 +- .../Assets/Paramdex/NR/Defs/BudgetParam.xml | 231 +- WitchyBND/Assets/Paramdex/NR/Defs/Bullet.xml | 925 +++++- .../NR/Defs/BulletCreateLimitParam.xml | 36 +- .../Paramdex/NR/Defs/CalcCorrectGraph.xml | 173 +- .../Paramdex/NR/Defs/CameraFadeParam.xml | 55 +- .../Assets/Paramdex/NR/Defs/Ceremony.xml | 48 +- .../NR/Defs/ChaosMatchingCorrectParam.xml | 16 + .../ChaosMatchingMutationCategoryParam.xml | 21 + .../ChaosMatchingMutationEnemyTableParam.xml | 25 + .../NR/Defs/ChaosMatchingRankControlParam.xml | 21 + .../ChaosMatchingReplaceTreasureCommon.xml | 12 + .../ChaosMatchingReplaceTreasureTable.xml | 30 + .../NR/Defs/CharMakeMenuListItemParam.xml | 36 +- .../Paramdex/NR/Defs/CharMakeMenuTopParam.xml | 110 +- .../Paramdex/NR/Defs/CharaInitParam.xml | 540 +++- .../Assets/Paramdex/NR/Defs/ChrModelParam.xml | 64 +- .../NR/Defs/ChrPhysicsVelocityChangeParam.xml | 23 +- .../NR/Defs/ClearCountCorrectParam.xml | 258 +- .../Paramdex/NR/Defs/CommonSystemParam.xml | 35 +- .../Assets/Paramdex/NR/Defs/CoolTimeParam.xml | 117 +- .../NR/Defs/CutSceneTextureLoadParam.xml | 209 +- .../NR/Defs/CutsceneGparamTimeParam.xml | 107 +- .../NR/Defs/CutsceneGparamWeatherParam.xml | 478 ++- .../Paramdex/NR/Defs/CutsceneMapIdParam.xml | 109 +- .../NR/Defs/CutsceneTimezoneConvertParam.xml | 25 +- ...sceneWeatherOverrideGparamConvertParam.xml | 13 +- .../Assets/Paramdex/NR/Defs/DecalParam.xml | 766 ++++- .../Paramdex/NR/Defs/DefaultKeyAssign.xml | 1173 +++++++- .../Paramdex/NR/Defs/DefeatBossSoulParam.xml | 8 +- .../Paramdex/NR/Defs/DirectionCameraParam.xml | 26 +- .../Paramdex/NR/Defs/EnemyCommonParam.xml | 167 +- .../Paramdex/NR/Defs/EnvObjLotParam.xml | 115 +- .../Paramdex/NR/Defs/EquipMtrlSetParam.xml | 202 +- .../Paramdex/NR/Defs/EquipParamAccessory.xml | 48 +- .../Paramdex/NR/Defs/EquipParamAntique.xml | 40 +- .../NR/Defs/EquipParamCustomWeapon.xml | 33 +- .../Paramdex/NR/Defs/EquipParamGoods.xml | 840 +++++- .../Paramdex/NR/Defs/EquipParamProtector.xml | 1666 ++++++++++- .../Paramdex/NR/Defs/EquipParamWeapon.xml | 2049 +++++++++++-- .../NR/Defs/EstusFlaskRecoveryParam.xml | 123 +- .../Paramdex/NR/Defs/EventFlagUsageParam.xml | 41 + .../Assets/Paramdex/NR/Defs/FaceParam.xml | 1526 +++++++++- .../Paramdex/NR/Defs/FaceRangeParam.xml | 2067 +++++++++++-- .../Paramdex/NR/Defs/FallControlParam.xml | 10 +- .../Paramdex/NR/Defs/FeTextEffectParam.xml | 56 +- .../Assets/Paramdex/NR/Defs/FootSfxParam.xml | 1407 +++++++-- .../NR/Defs/GameSystemCommonParam.xml | 1937 ++++++++++-- .../Paramdex/NR/Defs/Gconfig_AAQuality.xml | 27 +- .../Paramdex/NR/Defs/Gconfig_DOFQuality.xml | 36 +- .../Paramdex/NR/Defs/Gconfig_DecalQuality.xml | 18 +- .../NR/Defs/Gconfig_EffectQuality.xml | 115 +- .../NR/Defs/Gconfig_LightingQuality.xml | 45 +- .../NR/Defs/Gconfig_MotionBlurQuality.xml | 69 +- .../NR/Defs/Gconfig_RaytracingQuality.xml | 24 +- .../NR/Defs/Gconfig_ReflectionQuality.xml | 105 +- .../Paramdex/NR/Defs/Gconfig_SSAOQuality.xml | 45 +- .../NR/Defs/Gconfig_ShaderQuality.xml | 38 +- .../NR/Defs/Gconfig_ShadowQuality.xml | 77 +- .../NR/Defs/Gconfig_TextureFilterQuality.xml | 28 +- .../Defs/Gconfig_VolumetricEffectQuality.xml | 157 +- .../Paramdex/NR/Defs/Gconfig_WaterQuality.xml | 18 +- .../Assets/Paramdex/NR/Defs/GestureParam.xml | 59 +- .../Paramdex/NR/Defs/GparamRefSettings.xml | 46 +- .../Paramdex/NR/Defs/GraphicsCommonParam.xml | 95 +- .../Paramdex/NR/Defs/GraphicsConfig.xml | 122 +- .../Paramdex/NR/Defs/GrassLodRangeParam.xml | 59 +- .../Paramdex/NR/Defs/GrassTypeParam.xml | 296 +- .../Paramdex/NR/Defs/HeroMenuCameraParam.xml | 26 +- .../Assets/Paramdex/NR/Defs/HeroMenuParam.xml | 26 +- .../NR/Defs/HeroOperationExplanationParam.xml | 18 +- .../Assets/Paramdex/NR/Defs/HeroParam.xml | 85 +- .../Paramdex/NR/Defs/HeroStatusParam.xml | 28 +- .../NR/Defs/HitEffectSfxConceptParam.xml | 132 +- .../Paramdex/NR/Defs/HitEffectSfxParam.xml | 165 +- .../Assets/Paramdex/NR/Defs/HitMtrlParam.xml | 247 +- .../Assets/Paramdex/NR/Defs/ItemLotParam.xml | 588 +++- .../Paramdex/NR/Defs/ItemTableParam.xml | 28 +- .../NR/Defs/KeyAssignMenuItemParam.xml | 88 +- .../Paramdex/NR/Defs/KeyAssignParam.xml | 76 +- .../Paramdex/NR/Defs/KnockBackParam.xml | 281 +- .../NR/Defs/KnowledgeLoadScreenItemParam.xml | 47 +- .../LegacyDistantViewPartsReplaceParam.xml | 171 +- .../Paramdex/NR/Defs/LimitedDayAssetParam.xml | 34 +- .../Defs/LoadBalancerDrawDistScaleParam.xml | 213 +- .../LoadBalancerNewDrawDistScaleParam.xml | 101 +- .../Paramdex/NR/Defs/LoadBalancerParam.xml | 314 +- .../Paramdex/NR/Defs/LobbyMenuNpcParam.xml | 15 +- .../Paramdex/NR/Defs/LobbyMenuParam.xml | 20 +- .../Assets/Paramdex/NR/Defs/LockCamParam.xml | 224 +- .../NR/Defs/LotBaseMapPatternFlag.xml | 24 +- .../NR/Defs/LotBaseSmallBaseAndSpot.xml | 25 +- .../NR/Defs/LotResultMapPatternFlag.xml | 21 +- .../NR/Defs/LotResultPlayAreaParam.xml | 28 +- .../NR/Defs/LotResultSmallBaseAndSpot.xml | 20 +- WitchyBND/Assets/Paramdex/NR/Defs/Magic.xml | 835 +++++- .../Paramdex/NR/Defs/MagicTableParam.xml | 13 +- .../NR/Defs/MainScenarioMenuParam.xml | 8 +- .../Paramdex/NR/Defs/ManualMapPattern.xml | 58 +- .../Paramdex/NR/Defs/MapDefaultInfoParam.xml | 225 +- .../Paramdex/NR/Defs/MapGdRegionDrawParam.xml | 37 +- .../Paramdex/NR/Defs/MapGdRegionInfoParam.xml | 45 +- .../MapGridCreateHeightLimitInfoParam.xml | 37 +- .../NR/Defs/MapMimicryEstablishmentParam.xml | 110 +- .../Paramdex/NR/Defs/MapNameTexParam.xml | 65 +- .../Paramdex/NR/Defs/MapPatternCommon.xml | 18 +- .../NR/Defs/MapPatternMapLotCondition.xml | 24 +- .../Assets/Paramdex/NR/Defs/MapPatternSet.xml | 200 +- .../Paramdex/NR/Defs/MapPieceTexParam.xml | 69 +- .../Paramdex/NR/Defs/MaterialExParam.xml | 90 +- .../Paramdex/NR/Defs/MenuColorTableParam.xml | 95 +- .../Paramdex/NR/Defs/MenuCommonParam.xml | 674 ++++- .../Paramdex/NR/Defs/MenuOffscrRendParam.xml | 136 +- .../NR/Defs/MenuPropertyLayoutParam.xml | 41 +- .../NR/Defs/MenuPropertySpecParam.xml | 58 +- .../Paramdex/NR/Defs/MenuValueTableParam.xml | 37 +- .../Paramdex/NR/Defs/MenuWindowParam.xml | 28 +- .../Paramdex/NR/Defs/MessageBoxParam.xml | 4 +- .../NR/Defs/MimicryEstablishmentTexParam.xml | 67 +- .../NR/Defs/MissionManagementParam.xml | 17 +- .../Paramdex/NR/Defs/MixcraftMagicParam.xml | 13 +- .../Assets/Paramdex/NR/Defs/MoveParam.xml | 310 +- .../NR/Defs/MultiEstusFlaskBonusParam.xml | 107 +- .../NR/Defs/MultiPlayCorrectionParam.xml | 67 +- .../NR/Defs/MultiSoulBonusRateParam.xml | 171 +- .../Paramdex/NR/Defs/NPCBotTableParam.xml | 10 +- .../Paramdex/NR/Defs/NetworkMsgParam.xml | 355 ++- .../Assets/Paramdex/NR/Defs/NetworkParam.xml | 1665 +++++++++-- .../Paramdex/NR/Defs/NightBossMenuParam.xml | 40 +- .../Paramdex/NR/Defs/NpcAiActionParam.xml | 80 +- .../NR/Defs/NpcAiBehaviorProbability.xml | 1629 ++++++++++- .../Assets/Paramdex/NR/Defs/NpcParam.xml | 2426 ++++++++++++++-- .../Assets/Paramdex/NR/Defs/NpcThinkParam.xml | 739 ++++- .../Assets/Paramdex/NR/Defs/ObjActParam.xml | 167 +- .../Paramdex/NR/Defs/OperationGuideParam.xml | 18 +- .../Paramdex/NR/Defs/OverlayMaterialParam.xml | 27 +- .../Paramdex/NR/Defs/PartsDrawParam.xml | 375 ++- .../Paramdex/NR/Defs/PermanentBuffParam.xml | 17 +- .../NR/Defs/PersonalScenarioParam.xml | 31 +- .../Assets/Paramdex/NR/Defs/PhantomParam.xml | 256 +- .../Assets/Paramdex/NR/Defs/PinTypeParam.xml | 25 +- .../NR/Defs/PlayAreaCreateCommonParam.xml | 77 +- .../NR/Defs/PlayAreaCreateDefaultParam.xml | 29 +- .../Paramdex/NR/Defs/PlayAreaCreateParam.xml | 45 +- .../NR/Defs/PlayAreaGiantAssetCtrlParam.xml | 34 +- .../Paramdex/NR/Defs/PlayRegionParam.xml | 654 ++++- .../Paramdex/NR/Defs/PlayerCommonParam.xml | 710 ++++- .../NR/Defs/PostureControlParam_Pro.xml | 277 +- .../NR/Defs/PostureControlParam_WepLeft.xml | 92 +- .../NR/Defs/PostureControlParam_WepRight.xml | 160 +- .../Paramdex/NR/Defs/RandomAppearParam.xml | 612 +++- .../Paramdex/NR/Defs/RareMapInfoMenuParam.xml | 10 +- .../NR/Defs/ReinforceParamProtector.xml | 161 +- .../Paramdex/NR/Defs/ReinforceParamWeapon.xml | 322 +- .../Paramdex/NR/Defs/ResistCorrectParam.xml | 105 +- .../NR/Defs/ResultMenuPlaySpeedParam.xml | 8 +- .../NR/Defs/ReverbAuxSendBusParam.xml | 21 +- .../Assets/Paramdex/NR/Defs/RideParam.xml | 118 +- .../Paramdex/NR/Defs/RollingObjLotParam.xml | 136 +- .../NR/Defs/RuntimeBoneControlParam.xml | 64 +- .../NR/Defs/ScenarioPlacementParam.xml | 22 +- .../Paramdex/NR/Defs/ScratchedPartsParam.xml | 15 +- .../NR/Defs/SeActivationRangeParam.xml | 14 +- .../NR/Defs/SeMaterialConvertParam.xml | 17 +- .../SessionRandomAssetTexReplaceParam.xml | 65 +- .../NR/Defs/SessionRewardByModeRankParam.xml | 27 + .../NR/Defs/SessionRewardCommonParam.xml | 27 + .../NR/Defs/SfxBlockResShareParam.xml | 4 +- .../Paramdex/NR/Defs/ShopLineupParam.xml | 171 +- .../Paramdex/NR/Defs/SignPuddleParam.xml | 39 +- .../NR/Defs/SmallBaseAndSpotAttachPoint.xml | 86 +- .../NR/Defs/SmallBaseAndSpotDefine.xml | 76 +- .../SmallBaseEnemyLotMapCombinationParam.xml | 23 +- .../NR/Defs/SmallBaseMapVariationParam.xml | 52 +- .../NR/Defs/SmallBaseSfxLodExclusionList.xml | 4 +- .../NR/Defs/SmallbaseInvationNpcParam.xml | 14 +- .../Paramdex/NR/Defs/SortieStartingPoint.xml | 35 +- .../SoundAssetSoundObjEnableDistParam.xml | 14 +- .../NR/Defs/SoundAutoEnvSoundGroupParam.xml | 46 +- .../SoundAutoReverbEvaluationDistParam.xml | 73 +- .../NR/Defs/SoundAutoReverbSelectParam.xml | 100 +- .../NR/Defs/SoundChrPhysicsSeParam.xml | 235 +- .../NR/Defs/SoundCommonIngameParam.xml | 37 +- .../NR/Defs/SoundCommonSystemParam.xml | 43 +- .../Paramdex/NR/Defs/SoundCutsceneParam.xml | 89 +- .../Assets/Paramdex/NR/Defs/SpEffectParam.xml | 683 +++-- .../Paramdex/NR/Defs/SpEffectSetParam.xml | 41 +- .../Paramdex/NR/Defs/SpEffectVfxParam.xml | 487 +++- .../Paramdex/NR/Defs/SpeedtreeParam.xml | 96 +- .../Paramdex/NR/Defs/SubstoryLinkParam.xml | 6 +- .../Paramdex/NR/Defs/SwordArtsParam.xml | 94 +- .../Paramdex/NR/Defs/SwordArtsTableParam.xml | 10 +- .../Assets/Paramdex/NR/Defs/TalkParam.xml | 136 +- .../Paramdex/NR/Defs/TextEmbedImageParam.xml | 11 +- .../Paramdex/NR/Defs/ThrowCounterParam.xml | 10 +- .../NR/Defs/ThrowDirectionSfxParam.xml | 263 +- .../Assets/Paramdex/NR/Defs/ThrowParam.xml | 350 ++- .../Paramdex/NR/Defs/ToughnessParam.xml | 56 +- .../NR/Defs/TutorialCategoryParam.xml | 10 +- .../Assets/Paramdex/NR/Defs/TutorialParam.xml | 124 +- .../Paramdex/NR/Defs/UserDispLogParam.xml | 19 +- .../Assets/Paramdex/NR/Defs/WaypointParam.xml | 45 +- .../NR/Defs/WeatherAssetCreateParam.xml | 200 +- .../NR/Defs/WeatherAssetReplaceParam.xml | 159 +- .../Paramdex/NR/Defs/WeatherLotParam.xml | 329 ++- .../Paramdex/NR/Defs/WeatherLotTexParam.xml | 66 +- .../Assets/Paramdex/NR/Defs/WeatherParam.xml | 152 +- .../Paramdex/NR/Defs/WepAbsorpPosParam.xml | 400 ++- .../Paramdex/NR/Defs/WetAspectParam.xml | 101 +- .../NR/Defs/WhiteSignCoolTimeParam.xml | 49 +- .../NR/Defs/WorldMapLegacyConvParam.xml | 149 +- .../Paramdex/NR/Defs/WorldMapPieceParam.xml | 150 +- .../NR/Defs/WorldMapPlaceNameParam.xml | 99 +- .../NR/Defs/WorldMapPointIconParam.xml | 4 +- .../Paramdex/NR/Defs/WorldMapPointParam.xml | 221 +- .../Paramdex/NR/Defs/WwiseValueToStrParam.xml | 42 +- .../WwiseValueToStrParam_BgmEnemyType.xml | 44 +- .../Paramdex/NR/Meta/ActionButtonParam.xml | 173 +- .../Assets/Paramdex/NR/Meta/AiSoundParam.xml | 105 +- .../Paramdex/NR/Meta/AntiqueStandParam.xml | 82 +- .../NR/Meta/AssetEnvironmentGeometryParam.xml | 410 ++- .../NR/Meta/AssetMaterialSfxParam.xml | 35 +- .../Paramdex/NR/Meta/AssetModelSfxParam.xml | 28 +- .../Assets/Paramdex/NR/Meta/AtkParam.xml | 499 +++- .../Meta/AttachEffectFilterCategoryParam.xml | 7 + .../NR/Meta/AttachEffectFilterParam.xml | 31 + .../AttachEffectFilterSubCategoryParam.xml | 30 + .../Paramdex/NR/Meta/AttachEffectParam.xml | 147 + .../NR/Meta/AttachEffectTableParam.xml | 12 + .../NR/Meta/AttackElementCorrectParam.xml | 87 +- .../NR/Meta/AutoCreateEnvSoundParam.xml | 11 +- .../Assets/Paramdex/NR/Meta/BehaviorParam.xml | 47 +- .../Paramdex/NR/Meta/BonfireWarpParam.xml | 97 +- .../Assets/Paramdex/NR/Meta/BuddyParam.xml | 60 +- .../Paramdex/NR/Meta/BuddyStoneParam.xml | 19 +- .../Assets/Paramdex/NR/Meta/BudgetParam.xml | 31 +- WitchyBND/Assets/Paramdex/NR/Meta/Bullet.xml | 203 +- .../NR/Meta/BulletCreateLimitParam.xml | 7 +- .../Paramdex/NR/Meta/CalcCorrectGraph.xml | 32 +- .../Paramdex/NR/Meta/CameraFadeParam.xml | 9 +- .../Assets/Paramdex/NR/Meta/Ceremony.xml | 9 +- .../NR/Meta/ChaosMatchingCorrectParam.xml | 36 + .../ChaosMatchingMutationCategoryParam.xml | 12 + .../ChaosMatchingMutationEnemyTableParam.xml | 12 + .../NR/Meta/ChaosMatchingRankControlParam.xml | 19 + .../ChaosMatchingReplaceTreasureCommon.xml | 12 + .../ChaosMatchingReplaceTreasureTable.xml | 12 + .../NR/Meta/CharMakeMenuListItemParam.xml | 7 +- .../Paramdex/NR/Meta/CharMakeMenuTopParam.xml | 48 +- .../Paramdex/NR/Meta/CharaInitParam.xml | 202 +- .../Assets/Paramdex/NR/Meta/ChrModelParam.xml | 20 +- .../NR/Meta/ChrPhysicsVelocityChangeParam.xml | 24 + .../NR/Meta/ClearCountCorrectParam.xml | 35 +- .../Paramdex/NR/Meta/CommonSystemParam.xml | 5 +- .../Assets/Paramdex/NR/Meta/CoolTimeParam.xml | 11 +- .../NR/Meta/CutSceneTextureLoadParam.xml | 23 +- .../NR/Meta/CutsceneGparamTimeParam.xml | 27 +- .../NR/Meta/CutsceneGparamWeatherParam.xml | 62 +- .../Paramdex/NR/Meta/CutsceneMapIdParam.xml | 17 +- .../NR/Meta/CutsceneTimezoneConvertParam.xml | 5 +- ...sceneWeatherOverrideGparamConvertParam.xml | 4 +- .../Assets/Paramdex/NR/Meta/DecalParam.xml | 111 +- .../Paramdex/NR/Meta/DefaultKeyAssign.xml | 140 +- .../Paramdex/NR/Meta/DirectionCameraParam.xml | 6 +- .../Paramdex/NR/Meta/EnemyCommonParam.xml | 12 +- .../Paramdex/NR/Meta/EnvObjLotParam.xml | 20 +- .../Paramdex/NR/Meta/EquipMtrlSetParam.xml | 40 +- .../Paramdex/NR/Meta/EquipParamAccessory.xml | 89 +- .../Paramdex/NR/Meta/EquipParamAntique.xml | 79 + .../NR/Meta/EquipParamCustomWeapon.xml | 80 + .../Paramdex/NR/Meta/EquipParamGoods.xml | 391 ++- .../Paramdex/NR/Meta/EquipParamProtector.xml | 464 ++- .../Paramdex/NR/Meta/EquipParamWeapon.xml | 633 +++- .../NR/Meta/EstusFlaskRecoveryParam.xml | 31 +- .../Paramdex/NR/Meta/EventFlagUsageParam.xml | 19 + .../Assets/Paramdex/NR/Meta/FaceParam.xml | 290 +- .../Paramdex/NR/Meta/FaceRangeParam.xml | 236 +- .../Paramdex/NR/Meta/FallControlParam.xml | 6 + .../Paramdex/NR/Meta/FeTextEffectParam.xml | 17 +- .../Assets/Paramdex/NR/Meta/FootSfxParam.xml | 210 +- .../NR/Meta/GameSystemCommonParam.xml | 375 ++- .../Paramdex/NR/Meta/Gconfig_AAQuality.xml | 13 +- .../Paramdex/NR/Meta/Gconfig_DOFQuality.xml | 14 +- .../Paramdex/NR/Meta/Gconfig_DecalQuality.xml | 12 +- .../NR/Meta/Gconfig_EffectQuality.xml | 24 +- .../NR/Meta/Gconfig_LightingQuality.xml | 15 +- .../NR/Meta/Gconfig_MotionBlurQuality.xml | 17 +- .../NR/Meta/Gconfig_RaytracingQuality.xml | 14 +- .../NR/Meta/Gconfig_ReflectionQuality.xml | 22 +- .../Paramdex/NR/Meta/Gconfig_SSAOQuality.xml | 17 +- .../NR/Meta/Gconfig_ShaderQuality.xml | 14 +- .../NR/Meta/Gconfig_ShadowQuality.xml | 20 +- .../NR/Meta/Gconfig_TextureFilterQuality.xml | 15 +- .../Meta/Gconfig_VolumetricEffectQuality.xml | 33 +- .../Paramdex/NR/Meta/Gconfig_WaterQuality.xml | 12 +- .../Assets/Paramdex/NR/Meta/GestureParam.xml | 18 +- .../Paramdex/NR/Meta/GparamRefSettings.xml | 15 +- .../Paramdex/NR/Meta/GraphicsCommonParam.xml | 14 +- .../Paramdex/NR/Meta/GraphicsConfig.xml | 31 +- .../Paramdex/NR/Meta/GrassLodRangeParam.xml | 16 +- .../Paramdex/NR/Meta/GrassTypeParam.xml | 75 +- .../Assets/Paramdex/NR/Meta/HeroMenuParam.xml | 87 +- .../NR/Meta/HeroOperationExplanationParam.xml | 45 + .../Assets/Paramdex/NR/Meta/HeroParam.xml | 143 + .../Paramdex/NR/Meta/HeroStatusParam.xml | 65 +- .../NR/Meta/HitEffectSfxConceptParam.xml | 26 +- .../Paramdex/NR/Meta/HitEffectSfxParam.xml | 30 +- .../Assets/Paramdex/NR/Meta/HitMtrlParam.xml | 59 +- .../Assets/Paramdex/NR/Meta/ItemLotParam.xml | 188 +- .../Paramdex/NR/Meta/ItemTableParam.xml | 128 + .../NR/Meta/KeyAssignMenuItemParam.xml | 120 +- .../Paramdex/NR/Meta/KeyAssignParam.xml | 176 +- .../Paramdex/NR/Meta/KnockBackParam.xml | 41 +- .../NR/Meta/KnowledgeLoadScreenItemParam.xml | 16 +- .../LegacyDistantViewPartsReplaceParam.xml | 29 +- .../Meta/LoadBalancerDrawDistScaleParam.xml | 32 +- .../LoadBalancerNewDrawDistScaleParam.xml | 21 +- .../Paramdex/NR/Meta/LoadBalancerParam.xml | 43 +- .../Paramdex/NR/Meta/LobbyMenuNpcParam.xml | 23 + .../Paramdex/NR/Meta/LobbyMenuParam.xml | 28 + .../Assets/Paramdex/NR/Meta/LockCamParam.xml | 28 +- .../NR/Meta/LotBaseMapPatternFlag.xml | 31 + .../NR/Meta/LotBaseSmallBaseAndSpot.xml | 6 + .../NR/Meta/LotResultMapPatternFlag.xml | 27 + .../NR/Meta/LotResultPlayAreaParam.xml | 44 + .../NR/Meta/LotResultSmallBaseAndSpot.xml | 25 + WitchyBND/Assets/Paramdex/NR/Meta/Magic.xml | 243 +- .../Paramdex/NR/Meta/MagicTableParam.xml | 19 +- .../Paramdex/NR/Meta/MapDefaultInfoParam.xml | 106 +- .../Paramdex/NR/Meta/MapGdRegionDrawParam.xml | 14 +- .../Paramdex/NR/Meta/MapGdRegionInfoParam.xml | 15 +- .../MapGridCreateHeightLimitInfoParam.xml | 13 +- .../NR/Meta/MapMimicryEstablishmentParam.xml | 59 +- .../Paramdex/NR/Meta/MapNameTexParam.xml | 22 +- .../NR/Meta/MapPatternMapLotCondition.xml | 14 + .../Assets/Paramdex/NR/Meta/MapPatternSet.xml | 130 + .../Paramdex/NR/Meta/MapPieceTexParam.xml | 22 +- .../Paramdex/NR/Meta/MaterialExParam.xml | 18 +- .../Paramdex/NR/Meta/MenuColorTableParam.xml | 25 +- .../Paramdex/NR/Meta/MenuCommonParam.xml | 70 +- .../Paramdex/NR/Meta/MenuOffscrRendParam.xml | 26 +- .../NR/Meta/MenuPropertyLayoutParam.xml | 29 +- .../NR/Meta/MenuPropertySpecParam.xml | 105 +- .../Paramdex/NR/Meta/MenuValueTableParam.xml | 19 +- .../Paramdex/NR/Meta/MenuWindowParam.xml | 26 +- .../NR/Meta/MimicryEstablishmentTexParam.xml | 22 +- .../NR/Meta/MissionManagementParam.xml | 18 + .../Paramdex/NR/Meta/MixcraftMagicParam.xml | 24 + .../Assets/Paramdex/NR/Meta/MoveParam.xml | 49 +- .../NR/Meta/MultiEstusFlaskBonusParam.xml | 27 +- .../NR/Meta/MultiPlayCorrectionParam.xml | 22 +- .../NR/Meta/MultiSoulBonusRateParam.xml | 27 +- .../Paramdex/NR/Meta/NPCBotTableParam.xml | 13 + .../Paramdex/NR/Meta/NetworkMsgParam.xml | 54 +- .../Assets/Paramdex/NR/Meta/NetworkParam.xml | 166 +- .../Paramdex/NR/Meta/NightBossMenuParam.xml | 91 + .../Paramdex/NR/Meta/NpcAiActionParam.xml | 57 +- .../NR/Meta/NpcAiBehaviorProbability.xml | 210 +- .../Assets/Paramdex/NR/Meta/NpcParam.xml | 762 ++++- .../Assets/Paramdex/NR/Meta/NpcThinkParam.xml | 179 +- .../Assets/Paramdex/NR/Meta/ObjActParam.xml | 48 +- .../Paramdex/NR/Meta/OperationGuideParam.xml | 5 +- .../Paramdex/NR/Meta/OverlayMaterialParam.xml | 14 + .../Paramdex/NR/Meta/PartsDrawParam.xml | 65 +- .../Paramdex/NR/Meta/PermanentBuffParam.xml | 32 + .../NR/Meta/PersonalScenarioParam.xml | 37 + .../Assets/Paramdex/NR/Meta/PhantomParam.xml | 53 +- .../NR/Meta/PlayAreaCreateCommonParam.xml | 74 + .../NR/Meta/PlayAreaCreateDefaultParam.xml | 35 + .../Paramdex/NR/Meta/PlayAreaCreateParam.xml | 72 + .../Paramdex/NR/Meta/PlayRegionParam.xml | 95 +- .../Paramdex/NR/Meta/PlayerCommonParam.xml | 308 +- .../NR/Meta/PostureControlParam_Pro.xml | 47 +- .../NR/Meta/PostureControlParam_WepLeft.xml | 27 +- .../NR/Meta/PostureControlParam_WepRight.xml | 117 +- .../Paramdex/NR/Meta/RandomAppearParam.xml | 111 +- .../Paramdex/NR/Meta/RareMapInfoMenuParam.xml | 19 + .../NR/Meta/ReinforceParamProtector.xml | 29 +- .../Paramdex/NR/Meta/ReinforceParamWeapon.xml | 56 +- .../Paramdex/NR/Meta/ResistCorrectParam.xml | 20 +- .../NR/Meta/ResultMenuPlaySpeedParam.xml | 9 +- .../NR/Meta/ReverbAuxSendBusParam.xml | 11 +- .../Assets/Paramdex/NR/Meta/RideParam.xml | 26 +- .../Paramdex/NR/Meta/RollingObjLotParam.xml | 30 +- .../NR/Meta/RuntimeBoneControlParam.xml | 20 +- .../NR/Meta/ScenarioPlacementParam.xml | 9 + .../Paramdex/NR/Meta/ScratchedPartsParam.xml | 27 +- .../NR/Meta/SeActivationRangeParam.xml | 11 +- .../NR/Meta/SeMaterialConvertParam.xml | 105 +- .../NR/Meta/SessionRewardByModeRankParam.xml | 35 + .../NR/Meta/SessionRewardCommonParam.xml | 12 + .../Paramdex/NR/Meta/ShopLineupParam.xml | 107 +- .../Paramdex/NR/Meta/SignPuddleParam.xml | 14 +- .../NR/Meta/SmallBaseAndSpotAttachPoint.xml | 33 + .../NR/Meta/SmallBaseAndSpotDefine.xml | 138 + .../SmallBaseEnemyLotMapCombinationParam.xml | 22 + .../NR/Meta/SmallBaseMapVariationParam.xml | 113 + .../NR/Meta/SmallbaseInvationNpcParam.xml | 13 + .../Paramdex/NR/Meta/SortieStartingPoint.xml | 59 + .../SoundAssetSoundObjEnableDistParam.xml | 11 +- .../NR/Meta/SoundAutoEnvSoundGroupParam.xml | 14 +- .../SoundAutoReverbEvaluationDistParam.xml | 18 +- .../NR/Meta/SoundAutoReverbSelectParam.xml | 21 +- .../NR/Meta/SoundChrPhysicsSeParam.xml | 39 +- .../NR/Meta/SoundCommonIngameParam.xml | 12 +- .../NR/Meta/SoundCommonSystemParam.xml | 12 +- .../Paramdex/NR/Meta/SoundCutsceneParam.xml | 25 +- .../Assets/Paramdex/NR/Meta/SpEffectParam.xml | 2503 +++++++++++++++- .../Paramdex/NR/Meta/SpEffectSetParam.xml | 14 +- .../Paramdex/NR/Meta/SpEffectVfxParam.xml | 128 +- .../Paramdex/NR/Meta/SpeedtreeParam.xml | 20 +- .../Paramdex/NR/Meta/SwordArtsParam.xml | 190 +- .../Paramdex/NR/Meta/SwordArtsTableParam.xml | 7 + .../Assets/Paramdex/NR/Meta/TalkParam.xml | 29 +- .../Paramdex/NR/Meta/ThrowCounterParam.xml | 5 +- .../NR/Meta/ThrowDirectionSfxParam.xml | 42 +- .../Assets/Paramdex/NR/Meta/ThrowParam.xml | 76 +- .../Paramdex/NR/Meta/ToughnessParam.xml | 17 +- .../NR/Meta/TutorialCategoryParam.xml | 5 +- .../Assets/Paramdex/NR/Meta/TutorialParam.xml | 59 +- .../Paramdex/NR/Meta/UserDispLogParam.xml | 8 + .../Assets/Paramdex/NR/Meta/WaypointParam.xml | 22 +- .../NR/Meta/WeatherAssetCreateParam.xml | 38 +- .../NR/Meta/WeatherAssetReplaceParam.xml | 30 +- .../Paramdex/NR/Meta/WeatherLotParam.xml | 56 +- .../Paramdex/NR/Meta/WeatherLotTexParam.xml | 22 +- .../Assets/Paramdex/NR/Meta/WeatherParam.xml | 27 +- .../Paramdex/NR/Meta/WepAbsorpPosParam.xml | 89 +- .../Paramdex/NR/Meta/WetAspectParam.xml | 26 +- .../NR/Meta/WhiteSignCoolTimeParam.xml | 14 +- .../NR/Meta/WorldMapLegacyConvParam.xml | 30 +- .../Paramdex/NR/Meta/WorldMapPieceParam.xml | 26 +- .../NR/Meta/WorldMapPlaceNameParam.xml | 23 +- .../NR/Meta/WorldMapPointIconParam.xml | 4 + .../Paramdex/NR/Meta/WorldMapPointParam.xml | 292 +- .../Paramdex/NR/Meta/WwiseValueToStrParam.xml | 14 +- .../WwiseValueToStrParam_BgmEnemyType.xml | 14 +- .../Assets/Templates/TAE.Template.ER.xml | 8 +- 484 files changed, 61809 insertions(+), 8045 deletions(-) create mode 100644 WitchyBND/Assets/Paramdex/NR/Defs/AttachEffectFilterSubCategoryParam.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Defs/ChaosMatchingCorrectParam.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Defs/ChaosMatchingMutationCategoryParam.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Defs/ChaosMatchingMutationEnemyTableParam.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Defs/ChaosMatchingRankControlParam.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Defs/ChaosMatchingReplaceTreasureCommon.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Defs/ChaosMatchingReplaceTreasureTable.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Defs/EventFlagUsageParam.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Defs/SessionRewardByModeRankParam.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Defs/SessionRewardCommonParam.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Meta/AttachEffectFilterSubCategoryParam.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Meta/ChaosMatchingCorrectParam.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Meta/ChaosMatchingMutationCategoryParam.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Meta/ChaosMatchingMutationEnemyTableParam.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Meta/ChaosMatchingRankControlParam.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Meta/ChaosMatchingReplaceTreasureCommon.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Meta/ChaosMatchingReplaceTreasureTable.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Meta/EventFlagUsageParam.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Meta/SessionRewardByModeRankParam.xml create mode 100644 WitchyBND/Assets/Paramdex/NR/Meta/SessionRewardCommonParam.xml diff --git a/WitchyBND/Assets/Paramdex/ER/Meta/AIAttackParam.xml b/WitchyBND/Assets/Paramdex/ER/Meta/AIAttackParam.xml index 6d10bd94..78480b79 100644 --- a/WitchyBND/Assets/Paramdex/ER/Meta/AIAttackParam.xml +++ b/WitchyBND/Assets/Paramdex/ER/Meta/AIAttackParam.xml @@ -1,57 +1,201 @@  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WitchyBND/Assets/Paramdex/ER/Meta/ActionButtonParam.xml b/WitchyBND/Assets/Paramdex/ER/Meta/ActionButtonParam.xml index e5deb755..9f9554dc 100644 --- a/WitchyBND/Assets/Paramdex/ER/Meta/ActionButtonParam.xml +++ b/WitchyBND/Assets/Paramdex/ER/Meta/ActionButtonParam.xml @@ -1,5 +1,155 @@  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WitchyBND/Assets/Paramdex/ER/Meta/AiAnimTblParam.xml b/WitchyBND/Assets/Paramdex/ER/Meta/AiAnimTblParam.xml index 426cb7ad..9812414d 100644 --- a/WitchyBND/Assets/Paramdex/ER/Meta/AiAnimTblParam.xml +++ b/WitchyBND/Assets/Paramdex/ER/Meta/AiAnimTblParam.xml @@ -1,5 +1,520 @@  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WitchyBND/Assets/Paramdex/ER/Meta/AiSoundParam.xml b/WitchyBND/Assets/Paramdex/ER/Meta/AiSoundParam.xml index 5739e152..00af9c38 100644 --- a/WitchyBND/Assets/Paramdex/ER/Meta/AiSoundParam.xml +++ b/WitchyBND/Assets/Paramdex/ER/Meta/AiSoundParam.xml @@ -1,5 +1,91 @@  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - diff --git a/WitchyBND/Assets/Paramdex/ER/Meta/AssetGeometryParam.xml b/WitchyBND/Assets/Paramdex/ER/Meta/AssetGeometryParam.xml index 5bd05867..e8d29196 100644 --- a/WitchyBND/Assets/Paramdex/ER/Meta/AssetGeometryParam.xml +++ b/WitchyBND/Assets/Paramdex/ER/Meta/AssetGeometryParam.xml @@ -1,5 +1,307 @@  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WitchyBND/Assets/Paramdex/ER/Meta/BonfireWarpParam.xml b/WitchyBND/Assets/Paramdex/ER/Meta/BonfireWarpParam.xml index c4e3ce58..eeef6d91 100644 --- a/WitchyBND/Assets/Paramdex/ER/Meta/BonfireWarpParam.xml +++ b/WitchyBND/Assets/Paramdex/ER/Meta/BonfireWarpParam.xml @@ -15,13 +15,16 @@ - + + - + @@ -86,8 +89,10 @@ - - + + diff --git a/WitchyBND/Assets/Paramdex/ER/Meta/BuddyParam.xml b/WitchyBND/Assets/Paramdex/ER/Meta/BuddyParam.xml index e865bfea..2acbf61a 100644 --- a/WitchyBND/Assets/Paramdex/ER/Meta/BuddyParam.xml +++ b/WitchyBND/Assets/Paramdex/ER/Meta/BuddyParam.xml @@ -36,6 +36,21 @@ + + + + + + + + + + + + + + + diff --git a/WitchyBND/Assets/Paramdex/ER/Meta/BulletParam.xml b/WitchyBND/Assets/Paramdex/ER/Meta/BulletParam.xml index 40a6125f..bb51824e 100644 --- a/WitchyBND/Assets/Paramdex/ER/Meta/BulletParam.xml +++ b/WitchyBND/Assets/Paramdex/ER/Meta/BulletParam.xml @@ -23,7 +23,7 @@ + diff --git a/WitchyTests/Tests/XMLTests.cs b/WitchyTests/Tests/XMLTests.cs index 2283c7fa..6d765ab2 100644 --- a/WitchyTests/Tests/XMLTests.cs +++ b/WitchyTests/Tests/XMLTests.cs @@ -70,33 +70,33 @@ public void FXR3() } } - [Test] - public void GPARAM() - { - IEnumerable paths = GetSamples("GPARAM"); - - var parser = new WGPARAM(); - - foreach (string path in paths.Select(GetCopiedPath)) - { - SetLocation(path); - Assert.That(parser.Exists(path)); - Assert.That(parser.Is(path, null, out var file)); - - parser.Unpack(path, file, false); - string? destPath = parser.GetUnpackDestPath(path, false); - - File.Delete(path); - - Assert.That(File.Exists(destPath)); - Assert.That(parser.ExistsUnpacked(destPath)); - Assert.That(parser.IsUnpacked(destPath)); - parser.Repack(destPath, false); - - var xml = WFileParser.LoadXml(destPath); - Assert.That(File.Exists(parser.GetRepackDestPath(destPath, xml))); - } - } + // [Test] + // public void GPARAM() + // { + // IEnumerable paths = GetSamples("GPARAM"); + // + // var parser = new WGPARAM(); + // + // foreach (string path in paths.Select(GetCopiedPath)) + // { + // SetLocation(path); + // Assert.That(parser.Exists(path)); + // Assert.That(parser.Is(path, null, out var file)); + // + // parser.Unpack(path, file, false); + // string? destPath = parser.GetUnpackDestPath(path, false); + // + // File.Delete(path); + // + // Assert.That(File.Exists(destPath)); + // Assert.That(parser.ExistsUnpacked(destPath)); + // Assert.That(parser.IsUnpacked(destPath)); + // parser.Repack(destPath, false); + // + // var xml = WFileParser.LoadXml(destPath); + // Assert.That(File.Exists(parser.GetRepackDestPath(destPath, xml))); + // } + // } [Test] public void MQB() diff --git a/nuget.config b/nuget.config new file mode 100644 index 00000000..e6e59682 --- /dev/null +++ b/nuget.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/nuget/.gitkeep b/nuget/.gitkeep new file mode 100644 index 00000000..e69de29b From 5c61ef2e39c49826dc7a321a85688d2fc1a29976 Mon Sep 17 00:00:00 2001 From: ividyon <1077140+ividyon@users.noreply.github.com> Date: Mon, 5 Jan 2026 18:06:45 +0100 Subject: [PATCH 04/15] a million fixes to fix github actions --- .github/workflows/artifact-windows.yml | 13 +- .github/workflows/release.yml | 2 +- Directory.Build.props | 8 + SoulsOodleLib/SoulsOodleLib.csproj | 2 + SoulsOodleLib/packages.linux-x64.lock.json | 62 ++++ SoulsOodleLib/packages.win-x64.lock.json | 62 ++++ WitchyBND.Shell/SharpShell.dll | Bin 0 -> 451072 bytes WitchyBND.Shell/WitchyBND.Shell.csproj | 8 +- WitchyBND.Shell/packages.config | 2 +- WitchyBND.Shell/packages.linux-x64.lock.json | 14 + WitchyBND.Shell/packages.lock.json | 8 +- WitchyBND.Shell/packages.win-x64.lock.json | 14 + WitchyBND.sln | 6 + WitchyBND/CliModes/ConfigMode.cs | 2 +- .../CliModes/ConfigMode/DeferredFormatMode.cs | 2 +- .../CliModes/ConfigMode/IntegrationMode.cs | 5 + WitchyBND/DeferredFormats.cs | 4 +- WitchyBND/Parsers/Binder/Special/WANIBND4.cs | 6 +- WitchyBND/Parsers/XML/WDBSUB.cs | 2 - WitchyBND/Properties/launchSettings.json | 10 + WitchyBND/Services/OutputService.cs | 45 +-- WitchyBND/Services/SilentOutputService.cs | 12 +- WitchyBND/WitchyBND.csproj | 10 +- WitchyBND/packages.linux-x64.lock.json | 246 ++++++++++++++ WitchyBND/packages.lock.json | 79 +---- WitchyBND/packages.win-x64.lock.json | 246 ++++++++++++++ WitchyFormats/WitchyFormats.csproj | 2 +- WitchyFormats/packages.linux-x64.lock.json | 31 ++ WitchyFormats/packages.lock.json | 14 +- WitchyFormats/packages.win-x64.lock.json | 31 ++ WitchyLib/CryptographyUtil.cs | 2 +- WitchyLib/Shell.cs | 21 +- WitchyLib/WBUtil.cs | 8 +- WitchyLib/WitchyLib.csproj | 4 +- WitchyLib/packages.linux-x64.lock.json | 66 ++++ WitchyLib/packages.lock.json | 29 +- WitchyLib/packages.win-x64.lock.json | 66 ++++ WitchyTests/Properties/launchSettings.json | 10 + WitchyTests/Services/TestOutputService.cs | 13 +- WitchyTests/TestBase.cs | 1 - WitchyTests/WitchyTests.csproj | 5 +- WitchyTests/packages.linux-x64.lock.json | 310 ++++++++++++++++++ WitchyTests/packages.lock.json | 169 +--------- WitchyTests/packages.win-x64.lock.json | 310 ++++++++++++++++++ global.json | 2 +- nuget.config | 6 - 46 files changed, 1603 insertions(+), 367 deletions(-) create mode 100644 SoulsOodleLib/packages.linux-x64.lock.json create mode 100644 SoulsOodleLib/packages.win-x64.lock.json create mode 100644 WitchyBND.Shell/SharpShell.dll create mode 100644 WitchyBND.Shell/packages.linux-x64.lock.json create mode 100644 WitchyBND.Shell/packages.win-x64.lock.json create mode 100644 WitchyBND/Properties/launchSettings.json create mode 100644 WitchyBND/packages.linux-x64.lock.json create mode 100644 WitchyBND/packages.win-x64.lock.json create mode 100644 WitchyFormats/packages.linux-x64.lock.json create mode 100644 WitchyFormats/packages.win-x64.lock.json create mode 100644 WitchyLib/packages.linux-x64.lock.json create mode 100644 WitchyLib/packages.win-x64.lock.json create mode 100644 WitchyTests/Properties/launchSettings.json create mode 100644 WitchyTests/packages.linux-x64.lock.json create mode 100644 WitchyTests/packages.win-x64.lock.json delete mode 100644 nuget.config diff --git a/.github/workflows/artifact-windows.yml b/.github/workflows/artifact-windows.yml index 10fc83fd..3eb7f3de 100644 --- a/.github/workflows/artifact-windows.yml +++ b/.github/workflows/artifact-windows.yml @@ -18,7 +18,7 @@ on: branches: [ "main" ] env: - DOTNET_VERSION: '9.0.306' + DOTNET_VERSION: '10.0.101' NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages NEXUSMOD_API_KEY: ${{ secrets.NEXUSMOD_API_KEY }} NEXUSMOD_SESSION_COOKIE: ${{ secrets.NEXUSMOD_SESSION_COOKIE }} @@ -37,7 +37,7 @@ jobs: uses: actions/cache@v3 with: path: ${{ github.workspace }}/.dotnet - key: ${{ runner.os }}-dotnet + key: ${{ runner.os }}-dotnet-${{ env.DOTNET_VERSION }} - name: NuGet cache id: cache-nuget @@ -45,6 +45,7 @@ jobs: with: path: | ${{ github.workspace }}/.nuget/packages + ${{ github.workspace }}/packages ${{ github.workspace }}/WitchyBND/**/obj ${{ github.workspace }}/WitchyBND.Shell/**/obj ${{ github.workspace }}/WitchyFormats/**/obj @@ -62,16 +63,16 @@ jobs: - name: Restore packages if: ${{ steps.cache-nuget.outputs.cache-hit != 'true' }} - run: dotnet restore -r win-x64 --locked-mode ./WitchyBND.sln - + run: dotnet restore -r win-x64 --locked-mode ./WitchyBND.sln --lock-file-path packages.win-x64.lock.json + - name: Build run: dotnet build -r win-x64 -c Release --no-restore ./WitchyTests/WitchyTests.csproj # Builds WitchyTests which builds WitchyBND which builds WitchyBND.Shell - name: Install test runner - run: nuget install NUnit.ConsoleRunner -Version 3.17.0 -DirectDownload -OutputDirectory . + run: nuget install NUnit.ConsoleRunner -Version 3.22.0 -DirectDownload -OutputDirectory . - name: Run unit tests - run: ./NUnit.ConsoleRunner.3.17.0/tools/nunit3-console.exe ./WitchyTests/bin/Release/net8.0-windows/WitchyTests.dll --where "cat != SkipOnGitHubAction" + run: ./NUnit.ConsoleRunner.3.22.0/tools/nunit3-console.exe ./WitchyTests/bin/Release/net10.0/win-x64/WitchyTests.dll --where "cat != SkipOnGitHubAction" - name: Publish application run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 969b5c05..f40f54e6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ permissions: contents: write env: - DOTNET_VERSION: '9.0.306' + DOTNET_VERSION: '10.0.101' NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages NEXUSMOD_API_KEY: ${{ secrets.NEXUSMOD_API_KEY }} NEXUSMOD_SESSION_COOKIE: ${{ secrets.NEXUSMOD_SESSION_COOKIE }} diff --git a/Directory.Build.props b/Directory.Build.props index db348240..468ae56b 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -5,4 +5,12 @@ 2.17.0.0 $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)'))=./ + + packages.$(RuntimeIdentifier).lock.json + + + + $(MSBuildThisFileDirectory) + + \ No newline at end of file diff --git a/SoulsOodleLib/SoulsOodleLib.csproj b/SoulsOodleLib/SoulsOodleLib.csproj index 5a403d96..a9c5c830 100644 --- a/SoulsOodleLib/SoulsOodleLib.csproj +++ b/SoulsOodleLib/SoulsOodleLib.csproj @@ -2,8 +2,10 @@ net9.0 + x64 enable enable + true diff --git a/SoulsOodleLib/packages.linux-x64.lock.json b/SoulsOodleLib/packages.linux-x64.lock.json new file mode 100644 index 00000000..05fd96f1 --- /dev/null +++ b/SoulsOodleLib/packages.linux-x64.lock.json @@ -0,0 +1,62 @@ +{ + "version": 1, + "dependencies": { + "net9.0": { + "BouncyCastle.Cryptography": { + "type": "Direct", + "requested": "[2.4.0, )", + "resolved": "2.4.0", + "contentHash": "SwXsAV3sMvAU/Nn31pbjhWurYSjJ+/giI/0n6tCrYoupEK34iIHCuk3STAd9fx8yudM85KkLSVdn951vTng/vQ==" + }, + "NativeFileDialogSharp": { + "type": "Direct", + "requested": "[0.6.0-alpha, )", + "resolved": "0.6.0-alpha", + "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" + }, + "DrSwizzler": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + }, + "System.ValueTuple": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" + }, + "ZstdNet": { + "type": "Transitive", + "resolved": "1.4.5", + "contentHash": "fi9aP1QY3ZenIMUW1pxdSjku6lYAUjScrwfXSXT1qyKtTdLxOIzeBMe+w/hQm0vMsvQnjcFInByMrIT7AlXUHA==" + }, + "soulsformats": { + "type": "Project", + "dependencies": { + "BouncyCastle.Cryptography": "[2.4.0, )", + "DrSwizzler": "[1.1.1, )", + "System.Text.Encoding.CodePages": "[8.0.0, )", + "System.ValueTuple": "[4.5.0, )", + "ZstdNet": "[1.4.5, )" + } + } + }, + "net9.0/linux-x64": { + "NativeFileDialogSharp": { + "type": "Direct", + "requested": "[0.6.0-alpha, )", + "resolved": "0.6.0-alpha", + "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + } + } + } +} \ No newline at end of file diff --git a/SoulsOodleLib/packages.win-x64.lock.json b/SoulsOodleLib/packages.win-x64.lock.json new file mode 100644 index 00000000..5ebde457 --- /dev/null +++ b/SoulsOodleLib/packages.win-x64.lock.json @@ -0,0 +1,62 @@ +{ + "version": 1, + "dependencies": { + "net9.0": { + "BouncyCastle.Cryptography": { + "type": "Direct", + "requested": "[2.4.0, )", + "resolved": "2.4.0", + "contentHash": "SwXsAV3sMvAU/Nn31pbjhWurYSjJ+/giI/0n6tCrYoupEK34iIHCuk3STAd9fx8yudM85KkLSVdn951vTng/vQ==" + }, + "NativeFileDialogSharp": { + "type": "Direct", + "requested": "[0.6.0-alpha, )", + "resolved": "0.6.0-alpha", + "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" + }, + "DrSwizzler": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + }, + "System.ValueTuple": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" + }, + "ZstdNet": { + "type": "Transitive", + "resolved": "1.4.5", + "contentHash": "fi9aP1QY3ZenIMUW1pxdSjku6lYAUjScrwfXSXT1qyKtTdLxOIzeBMe+w/hQm0vMsvQnjcFInByMrIT7AlXUHA==" + }, + "soulsformats": { + "type": "Project", + "dependencies": { + "BouncyCastle.Cryptography": "[2.4.0, )", + "DrSwizzler": "[1.1.1, )", + "System.Text.Encoding.CodePages": "[8.0.0, )", + "System.ValueTuple": "[4.5.0, )", + "ZstdNet": "[1.4.5, )" + } + } + }, + "net9.0/win-x64": { + "NativeFileDialogSharp": { + "type": "Direct", + "requested": "[0.6.0-alpha, )", + "resolved": "0.6.0-alpha", + "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + } + } + } +} \ No newline at end of file diff --git a/WitchyBND.Shell/SharpShell.dll b/WitchyBND.Shell/SharpShell.dll new file mode 100644 index 0000000000000000000000000000000000000000..69ae68e979d582e17c91eefb209897b357f8f913 GIT binary patch literal 451072 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

Ktl3wH38`sD|_6I@g=_ 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�>|*T?vL7fUJ2)cjNpkOJ}ztdd|lS^ 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
*UT1o)OL?s8H;wLtub0001>d5Pv=8}7 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⁣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�hUIxPcyufs`GGof=ZA4oY@P@%g#Rx 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 f?6rH-scrtZ(C#jIBVr9#>A#iae literal 0 HcmV?d00001 diff --git a/WitchyBND.Shell/WitchyBND.Shell.csproj b/WitchyBND.Shell/WitchyBND.Shell.csproj index 20d5f891..b8227982 100644 --- a/WitchyBND.Shell/WitchyBND.Shell.csproj +++ b/WitchyBND.Shell/WitchyBND.Shell.csproj @@ -16,6 +16,8 @@ Key.snk true true + true + true false @@ -41,7 +43,7 @@ - ..\packages\SharpShell.2.7.2\lib\net40-client\SharpShell.dll + SharpShell.dll @@ -56,7 +58,9 @@ - + + + diff --git a/WitchyBND/packages.linux-x64.lock.json b/WitchyBND/packages.linux-x64.lock.json new file mode 100644 index 00000000..ca72764d --- /dev/null +++ b/WitchyBND/packages.linux-x64.lock.json @@ -0,0 +1,246 @@ +{ + "version": 1, + "dependencies": { + "net10.0": { + "CommandLineParser": { + "type": "Direct", + "requested": "[2.9.1, )", + "resolved": "2.9.1", + "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" + }, + "Microsoft.CSharp": { + "type": "Direct", + "requested": "[4.7.0, )", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Direct", + "requested": "[8.0.0-preview.7.23375.6, )", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "8YjROL/QyuNg3++VJ/jCewanY16dW9uCWT3Coick0gPEnyO8yguGxqQ3Dr6cXb0leYMxT0WFJp9Fm3CyOkmAxA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Direct", + "requested": "[8.0.0-preview.7.23375.6, )", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "5QUIOCfDDXiJyp2u1u0e4ri8F8Lw9K3ZdIriMOhGFGhg6nxyZDDdD07ddcmSHtxlj2SNI29SQ/33uUWfaE8fsg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" + } + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[10.0.1, )", + "resolved": "10.0.1", + "contentHash": "ISahzLHsHY7vrwqr2p1YWZ+gsxoBRtH7gWRDK8fDUst9pp2He0GiesaqEfeX0V8QMCJM3eNEHGGpnIcPjFo2NQ==" + }, + "NativeFileDialogSharp": { + "type": "Direct", + "requested": "[0.6.0-alpha, )", + "resolved": "0.6.0-alpha", + "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" + }, + "securifybv.ShellLink": { + "type": "Direct", + "requested": "[0.1.0, )", + "resolved": "0.1.0", + "contentHash": "VjJ8rJi6+yVla8DG1XRthwVneZq2Iojhf0KXwEKqJ+bIgbFTCIMpq33i0/HvPJSS1TdmaoGEnPHmjwP2ibenaA==", + "dependencies": { + "securifybv.PropertyStore": "0.1.0" + } + }, + "BouncyCastle.Cryptography": { + "type": "Transitive", + "resolved": "2.4.0", + "contentHash": "SwXsAV3sMvAU/Nn31pbjhWurYSjJ+/giI/0n6tCrYoupEK34iIHCuk3STAd9fx8yudM85KkLSVdn951vTng/vQ==" + }, + "DrSwizzler": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" + }, + "EastAsianWidthDotNet": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "vCn17XpsjpqAQvWCa5oUh81d/AVytUcBG9frXoDa+f66iuAiq9T4kDcqQnyp3dbN9cJ0cJA6ML98glpf315haQ==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "IBOUkqIQb2VOaLzB6ljWaAqAyW8N1f2cZH34Em1lTfitGYUP18QjedzbW+/v9Gb8YqNTQ6rhL7rBsBi3mZyc1A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Primitives": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "bOysJh+1kLNCpKpJYm28jNVbydpdh7ORLGEkNd9HGV1aEmXve60T65leVsXAUCgByPZObElKsnhnL67jVWBORQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Primitives": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "yeQKItAqoHvCdgE5IIVBiWPnJIWQ7B5dOhmfZ6or+kmDJcdNOWQT45PTzizIBQ2dKT2cB6BaAIK+6jAmMyUU5w==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Primitives": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "DTnRifpgJYjjxGgpTBsfJDK82Cq5algQHOQnd4f7R7R4bMeYcdjyaqd3NAKXn4RU47CfNqB9/dIZS8OlHVgckQ==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "securifybv.PropertyStore": { + "type": "Transitive", + "resolved": "0.1.0", + "contentHash": "N7oMyWl3RCbSi8SFK3vVtBpJD3OompLGZOwO2VQpyw6d8Qk8HTxCSuQzeSB4QzUWewQvMoQu5Qr5QgDQ1z5/5g==" + }, + "ZstdNet": { + "type": "Transitive", + "resolved": "1.4.5", + "contentHash": "fi9aP1QY3ZenIMUW1pxdSjku6lYAUjScrwfXSXT1qyKtTdLxOIzeBMe+w/hQm0vMsvQnjcFInByMrIT7AlXUHA==" + }, + "promptplus": { + "type": "Project", + "dependencies": { + "EastAsianWidthDotNet": "[1.0.1, )" + } + }, + "soulsformats": { + "type": "Project", + "dependencies": { + "BouncyCastle.Cryptography": "[2.4.0, )", + "DrSwizzler": "[1.1.1, )", + "ZstdNet": "[1.4.5, )" + } + }, + "soulsoodlelib": { + "type": "Project", + "dependencies": { + "BouncyCastle.Cryptography": "[2.4.0, )", + "NativeFileDialogSharp": "[0.6.0-alpha, )", + "SoulsFormats": "[2.17.0, )" + } + }, + "witchyformats": { + "type": "Project", + "dependencies": { + "SoulsFormats": "[2.17.0, )" + } + }, + "witchylib": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", + "Newtonsoft.Json": "[13.0.3, )", + "PromptPlus": "[5.0.1, )", + "WitchyFormats": "[2.17.0, )" + } + } + }, + "net10.0/linux-x64": { + "NativeFileDialogSharp": { + "type": "Direct", + "requested": "[0.6.0-alpha, )", + "resolved": "0.6.0-alpha", + "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" + } + } + } +} \ No newline at end of file diff --git a/WitchyBND/packages.lock.json b/WitchyBND/packages.lock.json index f0791817..3c7c1dad 100644 --- a/WitchyBND/packages.lock.json +++ b/WitchyBND/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net9.0": { + "net10.0": { "CommandLineParser": { "type": "Direct", "requested": "[2.9.1, )", @@ -32,8 +32,7 @@ "Microsoft.Extensions.Configuration": "8.0.0-preview.7.23375.6", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6", "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0-preview.7.23375.6", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0-preview.7.23375.6", - "System.Text.Json": "8.0.0-preview.7.23375.6" + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0-preview.7.23375.6" } }, "Microsoft.Extensions.DependencyInjection": { @@ -60,9 +59,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[9.0.10, )", - "resolved": "9.0.10", - "contentHash": "sseaSJcBxKEpkc59hnB00b3NmJdGvJLfj74HK+nucHxERxbZSUREuWKjC9ywc+HdzJvJyiP2eiyEOROaGSfcPw==" + "requested": "[10.0.1, )", + "resolved": "10.0.1", + "contentHash": "ISahzLHsHY7vrwqr2p1YWZ+gsxoBRtH7gWRDK8fDUst9pp2He0GiesaqEfeX0V8QMCJM3eNEHGGpnIcPjFo2NQ==" }, "NativeFileDialogSharp": { "type": "Direct", @@ -134,8 +133,7 @@ "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.0" + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Abstractions": { @@ -188,59 +186,27 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, - "PromptPlus": { - "type": "Transitive", - "resolved": "5.0.0-IB2", - "contentHash": "DPRvXZO2QmUTDDWCSR9vHzyp+/qtgeEnlU9OD02ilvV9q4Fl0ZrPcL+MsdTz0gfg/biyB8c0Ff9OxR+x3E3OPA==", - "dependencies": { - "EastAsianWidthDotNet": "1.0.1" - } - }, "securifybv.PropertyStore": { "type": "Transitive", "resolved": "0.1.0", "contentHash": "N7oMyWl3RCbSi8SFK3vVtBpJD3OompLGZOwO2VQpyw6d8Qk8HTxCSuQzeSB4QzUWewQvMoQu5Qr5QgDQ1z5/5g==" }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0-preview.7.23375.6", - "contentHash": "vCdCGFDzYkDfcnNd5ck7ngX9IUhXoMkfUlLWWw0BWBs/6LOF596LtkoG15pGxLS4s/HuTHsyrQ6USZSZa8blNA==" - }, - "System.Text.Json": { - "type": "Transitive", - "resolved": "8.0.0-preview.7.23375.6", - "contentHash": "xsCKwwq+cK/VwE61P1vr9yZh0p5LEQ+hG1MGKzpheA1gJgSKIQ6ArNp9nIYwoDX5WR+ichovXq117O0wHAZNLA==", - "dependencies": { - "System.Text.Encodings.Web": "8.0.0-preview.7.23375.6" - } - }, - "System.ValueTuple": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" - }, "ZstdNet": { "type": "Transitive", "resolved": "1.4.5", "contentHash": "fi9aP1QY3ZenIMUW1pxdSjku6lYAUjScrwfXSXT1qyKtTdLxOIzeBMe+w/hQm0vMsvQnjcFInByMrIT7AlXUHA==" }, + "promptplus": { + "type": "Project", + "dependencies": { + "EastAsianWidthDotNet": "[1.0.1, )" + } + }, "soulsformats": { "type": "Project", "dependencies": { "BouncyCastle.Cryptography": "[2.4.0, )", "DrSwizzler": "[1.1.1, )", - "System.Text.Encoding.CodePages": "[8.0.0, )", - "System.ValueTuple": "[4.5.0, )", "ZstdNet": "[1.4.5, )" } }, @@ -261,31 +227,12 @@ "witchylib": { "type": "Project", "dependencies": { - "Microsoft.CSharp": "[4.7.0, )", "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", "Newtonsoft.Json": "[13.0.3, )", - "PromptPlus": "[5.0.0-IB2, )", + "PromptPlus": "[5.0.1, )", "WitchyFormats": "[2.17.0, )" } } - }, - "net9.0/win-x64": { - "NativeFileDialogSharp": { - "type": "Direct", - "requested": "[0.6.0-alpha, )", - "resolved": "0.6.0-alpha", - "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0-preview.7.23375.6", - "contentHash": "vCdCGFDzYkDfcnNd5ck7ngX9IUhXoMkfUlLWWw0BWBs/6LOF596LtkoG15pGxLS4s/HuTHsyrQ6USZSZa8blNA==" - } } } } \ No newline at end of file diff --git a/WitchyBND/packages.win-x64.lock.json b/WitchyBND/packages.win-x64.lock.json new file mode 100644 index 00000000..be173c28 --- /dev/null +++ b/WitchyBND/packages.win-x64.lock.json @@ -0,0 +1,246 @@ +{ + "version": 1, + "dependencies": { + "net10.0": { + "CommandLineParser": { + "type": "Direct", + "requested": "[2.9.1, )", + "resolved": "2.9.1", + "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" + }, + "Microsoft.CSharp": { + "type": "Direct", + "requested": "[4.7.0, )", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Direct", + "requested": "[8.0.0-preview.7.23375.6, )", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "8YjROL/QyuNg3++VJ/jCewanY16dW9uCWT3Coick0gPEnyO8yguGxqQ3Dr6cXb0leYMxT0WFJp9Fm3CyOkmAxA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Direct", + "requested": "[8.0.0-preview.7.23375.6, )", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "5QUIOCfDDXiJyp2u1u0e4ri8F8Lw9K3ZdIriMOhGFGhg6nxyZDDdD07ddcmSHtxlj2SNI29SQ/33uUWfaE8fsg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" + } + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[10.0.1, )", + "resolved": "10.0.1", + "contentHash": "ISahzLHsHY7vrwqr2p1YWZ+gsxoBRtH7gWRDK8fDUst9pp2He0GiesaqEfeX0V8QMCJM3eNEHGGpnIcPjFo2NQ==" + }, + "NativeFileDialogSharp": { + "type": "Direct", + "requested": "[0.6.0-alpha, )", + "resolved": "0.6.0-alpha", + "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" + }, + "securifybv.ShellLink": { + "type": "Direct", + "requested": "[0.1.0, )", + "resolved": "0.1.0", + "contentHash": "VjJ8rJi6+yVla8DG1XRthwVneZq2Iojhf0KXwEKqJ+bIgbFTCIMpq33i0/HvPJSS1TdmaoGEnPHmjwP2ibenaA==", + "dependencies": { + "securifybv.PropertyStore": "0.1.0" + } + }, + "BouncyCastle.Cryptography": { + "type": "Transitive", + "resolved": "2.4.0", + "contentHash": "SwXsAV3sMvAU/Nn31pbjhWurYSjJ+/giI/0n6tCrYoupEK34iIHCuk3STAd9fx8yudM85KkLSVdn951vTng/vQ==" + }, + "DrSwizzler": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" + }, + "EastAsianWidthDotNet": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "vCn17XpsjpqAQvWCa5oUh81d/AVytUcBG9frXoDa+f66iuAiq9T4kDcqQnyp3dbN9cJ0cJA6ML98glpf315haQ==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "IBOUkqIQb2VOaLzB6ljWaAqAyW8N1f2cZH34Em1lTfitGYUP18QjedzbW+/v9Gb8YqNTQ6rhL7rBsBi3mZyc1A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Primitives": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "bOysJh+1kLNCpKpJYm28jNVbydpdh7ORLGEkNd9HGV1aEmXve60T65leVsXAUCgByPZObElKsnhnL67jVWBORQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Primitives": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "yeQKItAqoHvCdgE5IIVBiWPnJIWQ7B5dOhmfZ6or+kmDJcdNOWQT45PTzizIBQ2dKT2cB6BaAIK+6jAmMyUU5w==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Primitives": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "DTnRifpgJYjjxGgpTBsfJDK82Cq5algQHOQnd4f7R7R4bMeYcdjyaqd3NAKXn4RU47CfNqB9/dIZS8OlHVgckQ==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "securifybv.PropertyStore": { + "type": "Transitive", + "resolved": "0.1.0", + "contentHash": "N7oMyWl3RCbSi8SFK3vVtBpJD3OompLGZOwO2VQpyw6d8Qk8HTxCSuQzeSB4QzUWewQvMoQu5Qr5QgDQ1z5/5g==" + }, + "ZstdNet": { + "type": "Transitive", + "resolved": "1.4.5", + "contentHash": "fi9aP1QY3ZenIMUW1pxdSjku6lYAUjScrwfXSXT1qyKtTdLxOIzeBMe+w/hQm0vMsvQnjcFInByMrIT7AlXUHA==" + }, + "promptplus": { + "type": "Project", + "dependencies": { + "EastAsianWidthDotNet": "[1.0.1, )" + } + }, + "soulsformats": { + "type": "Project", + "dependencies": { + "BouncyCastle.Cryptography": "[2.4.0, )", + "DrSwizzler": "[1.1.1, )", + "ZstdNet": "[1.4.5, )" + } + }, + "soulsoodlelib": { + "type": "Project", + "dependencies": { + "BouncyCastle.Cryptography": "[2.4.0, )", + "NativeFileDialogSharp": "[0.6.0-alpha, )", + "SoulsFormats": "[2.17.0, )" + } + }, + "witchyformats": { + "type": "Project", + "dependencies": { + "SoulsFormats": "[2.17.0, )" + } + }, + "witchylib": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", + "Newtonsoft.Json": "[13.0.3, )", + "PromptPlus": "[5.0.1, )", + "WitchyFormats": "[2.17.0, )" + } + } + }, + "net10.0/win-x64": { + "NativeFileDialogSharp": { + "type": "Direct", + "requested": "[0.6.0-alpha, )", + "resolved": "0.6.0-alpha", + "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" + } + } + } +} \ No newline at end of file diff --git a/WitchyFormats/WitchyFormats.csproj b/WitchyFormats/WitchyFormats.csproj index 2c0d90dd..922d0da3 100644 --- a/WitchyFormats/WitchyFormats.csproj +++ b/WitchyFormats/WitchyFormats.csproj @@ -1,7 +1,7 @@ - net9.0 + net10.0 true false WitchyFormats diff --git a/WitchyFormats/packages.linux-x64.lock.json b/WitchyFormats/packages.linux-x64.lock.json new file mode 100644 index 00000000..0dbcab0c --- /dev/null +++ b/WitchyFormats/packages.linux-x64.lock.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "dependencies": { + "net10.0": { + "BouncyCastle.Cryptography": { + "type": "Transitive", + "resolved": "2.4.0", + "contentHash": "SwXsAV3sMvAU/Nn31pbjhWurYSjJ+/giI/0n6tCrYoupEK34iIHCuk3STAd9fx8yudM85KkLSVdn951vTng/vQ==" + }, + "DrSwizzler": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" + }, + "ZstdNet": { + "type": "Transitive", + "resolved": "1.4.5", + "contentHash": "fi9aP1QY3ZenIMUW1pxdSjku6lYAUjScrwfXSXT1qyKtTdLxOIzeBMe+w/hQm0vMsvQnjcFInByMrIT7AlXUHA==" + }, + "soulsformats": { + "type": "Project", + "dependencies": { + "BouncyCastle.Cryptography": "[2.4.0, )", + "DrSwizzler": "[1.1.1, )", + "ZstdNet": "[1.4.5, )" + } + } + }, + "net10.0/linux-x64": {} + } +} \ No newline at end of file diff --git a/WitchyFormats/packages.lock.json b/WitchyFormats/packages.lock.json index d178e03f..a2787fc2 100644 --- a/WitchyFormats/packages.lock.json +++ b/WitchyFormats/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net9.0": { + "net10.0": { "BouncyCastle.Cryptography": { "type": "Transitive", "resolved": "2.4.0", @@ -12,16 +12,6 @@ "resolved": "1.1.1", "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" - }, - "System.ValueTuple": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" - }, "ZstdNet": { "type": "Transitive", "resolved": "1.4.5", @@ -32,8 +22,6 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.4.0, )", "DrSwizzler": "[1.1.1, )", - "System.Text.Encoding.CodePages": "[8.0.0, )", - "System.ValueTuple": "[4.5.0, )", "ZstdNet": "[1.4.5, )" } } diff --git a/WitchyFormats/packages.win-x64.lock.json b/WitchyFormats/packages.win-x64.lock.json new file mode 100644 index 00000000..fa5c0104 --- /dev/null +++ b/WitchyFormats/packages.win-x64.lock.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "dependencies": { + "net10.0": { + "BouncyCastle.Cryptography": { + "type": "Transitive", + "resolved": "2.4.0", + "contentHash": "SwXsAV3sMvAU/Nn31pbjhWurYSjJ+/giI/0n6tCrYoupEK34iIHCuk3STAd9fx8yudM85KkLSVdn951vTng/vQ==" + }, + "DrSwizzler": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" + }, + "ZstdNet": { + "type": "Transitive", + "resolved": "1.4.5", + "contentHash": "fi9aP1QY3ZenIMUW1pxdSjku6lYAUjScrwfXSXT1qyKtTdLxOIzeBMe+w/hQm0vMsvQnjcFInByMrIT7AlXUHA==" + }, + "soulsformats": { + "type": "Project", + "dependencies": { + "BouncyCastle.Cryptography": "[2.4.0, )", + "DrSwizzler": "[1.1.1, )", + "ZstdNet": "[1.4.5, )" + } + } + }, + "net10.0/win-x64": {} + } +} \ No newline at end of file diff --git a/WitchyLib/CryptographyUtil.cs b/WitchyLib/CryptographyUtil.cs index f4b4aef3..44d746f5 100644 --- a/WitchyLib/CryptographyUtil.cs +++ b/WitchyLib/CryptographyUtil.cs @@ -92,7 +92,7 @@ private static byte[] DecryptAes(Stream inputStream, BufferedBlockCipher cipher, byte[] input = new byte[paddedLength]; byte[] output = new byte[cipher.GetOutputSize(paddedLength)]; - inputStream.Read(input, 0, inputLength); + inputStream.ReadExactly(input, 0, inputLength); int len = cipher.ProcessBytes(input, 0, input.Length, output, 0); cipher.DoFinal(output, len); return output; diff --git a/WitchyLib/Shell.cs b/WitchyLib/Shell.cs index 81872e5f..184bc9c8 100644 --- a/WitchyLib/Shell.cs +++ b/WitchyLib/Shell.cs @@ -14,14 +14,11 @@ static Shell() Root = Registry.CurrentUser; } - private static readonly string exePath = Path.GetDirectoryName(AppContext.BaseDirectory)!; + private static readonly string ExePath = Path.GetDirectoryName(AppContext.BaseDirectory)!; const int WmUser = 0x0400; //http://msdn.microsoft.com/en-us/library/windows/desktop/ms644931(v=vs.85).aspx - private static RegistryKey Root; - private static string ClassesKey = @"Software\Classes"; - private static string ProgIdQuick = "WitchyBND.A"; - private static string ProgId = "WitchyBND.B"; - public static readonly string WitchyPath = Path.Combine(exePath, "WitchyBND.exe"); + private static readonly RegistryKey Root; + public static readonly string WitchyPath = Path.Combine(ExePath, "WitchyBND.exe"); private const string ClsidRegistryKey = @"Software\Classes\CLSID"; private const string ClassesRegistryKey = @"Software\Classes"; @@ -32,6 +29,7 @@ static Shell() public static bool ComplexContextMenuIsRegistered(string path = null) { + if (!OperatingSystem.IsWindows()) throw new PlatformNotSupportedException(); if (path != null) path = $"file:///{path.Replace(Path.DirectorySeparatorChar, '/').TrimEnd('/')}/WitchyBND.Shell.dll"; var probeKey = string.Join(Path.DirectorySeparatorChar, [ClsidRegistryKey, ComplexMenuGuid, "InprocServer32"]); @@ -41,7 +39,8 @@ public static bool ComplexContextMenuIsRegistered(string path = null) public static void RegisterComplexContextMenu() { - var assemblyPath = $"file:///{exePath.Replace(Path.DirectorySeparatorChar, '/').TrimEnd('/')}/WitchyBND.Shell.dll"; + if (!OperatingSystem.IsWindows()) throw new PlatformNotSupportedException(); + var assemblyPath = $"file:///{ExePath.Replace(Path.DirectorySeparatorChar, '/').TrimEnd('/')}/WitchyBND.Shell.dll"; var runtimeVersion = "v4.0.30319"; var version = "1.0.0.0"; var assemblyFullName = $"WitchyBND.Shell, Version={version}, Culture=neutral, PublicKeyToken=1eff254c75ae9a19"; @@ -115,6 +114,7 @@ public static void RegisterComplexContextMenu() public static void UnregisterComplexContextMenu() { + if (!OperatingSystem.IsWindows()) throw new PlatformNotSupportedException(); using (RegistryKey key = Root.OpenSubKey(ClassesRegistryKey, true)) { if (key != null) @@ -145,6 +145,7 @@ public static void UnregisterComplexContextMenu() public static void RestartExplorer() { + if (!OperatingSystem.IsWindows()) throw new PlatformNotSupportedException(); RestartExplorer restartExplorer = new RestartExplorer(); restartExplorer.Execute(() => { }); @@ -156,7 +157,7 @@ public static void AddToPathVariable() var name = "PATH"; var scope = EnvironmentVariableTarget.User; var oldValue = Environment.GetEnvironmentVariable(name, scope); - var newValue = oldValue + $";{exePath}"; + var newValue = oldValue + $";{ExePath}"; Environment.SetEnvironmentVariable(name, newValue, scope); } @@ -165,12 +166,13 @@ public static void RemoveFromPathVariable() var name = "PATH"; var scope = EnvironmentVariableTarget.User; var oldValue = Environment.GetEnvironmentVariable(name, scope); - var newValue = oldValue.Replace($";{exePath}", ""); + var newValue = oldValue.Replace($";{ExePath}", ""); Environment.SetEnvironmentVariable(name, newValue, scope); } private static RegistryKey EnsureSubKey(RegistryKey root, string name) { + if (!OperatingSystem.IsWindows()) throw new PlatformNotSupportedException(); RegistryKey key = root.OpenSubKey(name, true); if (key != null) return key; @@ -187,6 +189,7 @@ private static RegistryKey EnsureSubKey(RegistryKey root, string name) private static RegistryKey EnsureSubKey(params string[] name) { + if (!OperatingSystem.IsWindows()) throw new PlatformNotSupportedException(); var joinedName = string.Join(Path.DirectorySeparatorChar, name); RegistryKey key = Root.OpenSubKey(joinedName, true); if (key != null) diff --git a/WitchyLib/WBUtil.cs b/WitchyLib/WBUtil.cs index bc3cef66..9dc55fa2 100644 --- a/WitchyLib/WBUtil.cs +++ b/WitchyLib/WBUtil.cs @@ -218,14 +218,10 @@ public static string GetParamdexPath() public static string GetParamdexPath(params string[] parts) { + if (!parts.Any()) return GetParamdexPath(); return Path.Combine(new[] { GetParamdexPath() }.Union(parts).ToArray()); } - public static string GetParamdexPath(string path = null) - { - return path == null ? GetParamdexPath() : Path.Combine(GetParamdexPath(), path); - } - public static string GetParamdexPath(GameType game, params string[]? path) { return path == null @@ -631,7 +627,7 @@ public static bool ObnoxiousWarning(List lines) PromptPlus.Controls.WaitTimer(TimeSpan.FromSeconds(1), "Please read carefully, then press any key..."); // ClearLine(); PromptPlus.Console.SetCursorPosition(cursor.Left, cursor.Top); - PromptPlus.Console.WriteLineColor(""); + PromptPlus.Console.WriteLine(""); PromptPlus.Controls.KeyPress("Please read carefully, then press any key...") .Options(a => a.EnabledAbortKey(false)) .Run(); diff --git a/WitchyLib/WitchyLib.csproj b/WitchyLib/WitchyLib.csproj index 8f2af874..82966760 100644 --- a/WitchyLib/WitchyLib.csproj +++ b/WitchyLib/WitchyLib.csproj @@ -1,6 +1,6 @@ - net9.0 + net10.0 true false WitchyLib @@ -18,7 +18,7 @@ - + diff --git a/WitchyLib/packages.linux-x64.lock.json b/WitchyLib/packages.linux-x64.lock.json new file mode 100644 index 00000000..137fa2ad --- /dev/null +++ b/WitchyLib/packages.linux-x64.lock.json @@ -0,0 +1,66 @@ +{ + "version": 1, + "dependencies": { + "net10.0": { + "Microsoft.CSharp": { + "type": "Direct", + "requested": "[4.7.0, )", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Direct", + "requested": "[8.0.0-preview.2.23128.3, )", + "resolved": "8.0.0-preview.2.23128.3", + "contentHash": "YfBY7fX0WRLa67zWQau09+zh0AQHBb7KmCuNd1OSCQoLGgKcHnu0IXoGm/Ueer0GhHreJFU7Gn3vwZr4YxwciQ==" + }, + "Newtonsoft.Json": { + "type": "Direct", + "requested": "[13.0.3, )", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "BouncyCastle.Cryptography": { + "type": "Transitive", + "resolved": "2.4.0", + "contentHash": "SwXsAV3sMvAU/Nn31pbjhWurYSjJ+/giI/0n6tCrYoupEK34iIHCuk3STAd9fx8yudM85KkLSVdn951vTng/vQ==" + }, + "DrSwizzler": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" + }, + "EastAsianWidthDotNet": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "vCn17XpsjpqAQvWCa5oUh81d/AVytUcBG9frXoDa+f66iuAiq9T4kDcqQnyp3dbN9cJ0cJA6ML98glpf315haQ==" + }, + "ZstdNet": { + "type": "Transitive", + "resolved": "1.4.5", + "contentHash": "fi9aP1QY3ZenIMUW1pxdSjku6lYAUjScrwfXSXT1qyKtTdLxOIzeBMe+w/hQm0vMsvQnjcFInByMrIT7AlXUHA==" + }, + "promptplus": { + "type": "Project", + "dependencies": { + "EastAsianWidthDotNet": "[1.0.1, )" + } + }, + "soulsformats": { + "type": "Project", + "dependencies": { + "BouncyCastle.Cryptography": "[2.4.0, )", + "DrSwizzler": "[1.1.1, )", + "ZstdNet": "[1.4.5, )" + } + }, + "witchyformats": { + "type": "Project", + "dependencies": { + "SoulsFormats": "[2.17.0, )" + } + } + }, + "net10.0/linux-x64": {} + } +} \ No newline at end of file diff --git a/WitchyLib/packages.lock.json b/WitchyLib/packages.lock.json index a7e37b7e..28ec890d 100644 --- a/WitchyLib/packages.lock.json +++ b/WitchyLib/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net9.0": { + "net10.0": { "Microsoft.CSharp": { "type": "Direct", "requested": "[4.7.0, )", @@ -20,15 +20,6 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, - "PromptPlus": { - "type": "Direct", - "requested": "[5.0.0-IB2, )", - "resolved": "5.0.0-IB2", - "contentHash": "DPRvXZO2QmUTDDWCSR9vHzyp+/qtgeEnlU9OD02ilvV9q4Fl0ZrPcL+MsdTz0gfg/biyB8c0Ff9OxR+x3E3OPA==", - "dependencies": { - "EastAsianWidthDotNet": "1.0.1" - } - }, "BouncyCastle.Cryptography": { "type": "Transitive", "resolved": "2.4.0", @@ -44,28 +35,22 @@ "resolved": "1.0.1", "contentHash": "vCn17XpsjpqAQvWCa5oUh81d/AVytUcBG9frXoDa+f66iuAiq9T4kDcqQnyp3dbN9cJ0cJA6ML98glpf315haQ==" }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" - }, - "System.ValueTuple": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" - }, "ZstdNet": { "type": "Transitive", "resolved": "1.4.5", "contentHash": "fi9aP1QY3ZenIMUW1pxdSjku6lYAUjScrwfXSXT1qyKtTdLxOIzeBMe+w/hQm0vMsvQnjcFInByMrIT7AlXUHA==" }, + "promptplus": { + "type": "Project", + "dependencies": { + "EastAsianWidthDotNet": "[1.0.1, )" + } + }, "soulsformats": { "type": "Project", "dependencies": { "BouncyCastle.Cryptography": "[2.4.0, )", "DrSwizzler": "[1.1.1, )", - "System.Text.Encoding.CodePages": "[8.0.0, )", - "System.ValueTuple": "[4.5.0, )", "ZstdNet": "[1.4.5, )" } }, diff --git a/WitchyLib/packages.win-x64.lock.json b/WitchyLib/packages.win-x64.lock.json new file mode 100644 index 00000000..1e90822b --- /dev/null +++ b/WitchyLib/packages.win-x64.lock.json @@ -0,0 +1,66 @@ +{ + "version": 1, + "dependencies": { + "net10.0": { + "Microsoft.CSharp": { + "type": "Direct", + "requested": "[4.7.0, )", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Direct", + "requested": "[8.0.0-preview.2.23128.3, )", + "resolved": "8.0.0-preview.2.23128.3", + "contentHash": "YfBY7fX0WRLa67zWQau09+zh0AQHBb7KmCuNd1OSCQoLGgKcHnu0IXoGm/Ueer0GhHreJFU7Gn3vwZr4YxwciQ==" + }, + "Newtonsoft.Json": { + "type": "Direct", + "requested": "[13.0.3, )", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "BouncyCastle.Cryptography": { + "type": "Transitive", + "resolved": "2.4.0", + "contentHash": "SwXsAV3sMvAU/Nn31pbjhWurYSjJ+/giI/0n6tCrYoupEK34iIHCuk3STAd9fx8yudM85KkLSVdn951vTng/vQ==" + }, + "DrSwizzler": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" + }, + "EastAsianWidthDotNet": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "vCn17XpsjpqAQvWCa5oUh81d/AVytUcBG9frXoDa+f66iuAiq9T4kDcqQnyp3dbN9cJ0cJA6ML98glpf315haQ==" + }, + "ZstdNet": { + "type": "Transitive", + "resolved": "1.4.5", + "contentHash": "fi9aP1QY3ZenIMUW1pxdSjku6lYAUjScrwfXSXT1qyKtTdLxOIzeBMe+w/hQm0vMsvQnjcFInByMrIT7AlXUHA==" + }, + "promptplus": { + "type": "Project", + "dependencies": { + "EastAsianWidthDotNet": "[1.0.1, )" + } + }, + "soulsformats": { + "type": "Project", + "dependencies": { + "BouncyCastle.Cryptography": "[2.4.0, )", + "DrSwizzler": "[1.1.1, )", + "ZstdNet": "[1.4.5, )" + } + }, + "witchyformats": { + "type": "Project", + "dependencies": { + "SoulsFormats": "[2.17.0, )" + } + } + }, + "net10.0/win-x64": {} + } +} \ No newline at end of file diff --git a/WitchyTests/Properties/launchSettings.json b/WitchyTests/Properties/launchSettings.json new file mode 100644 index 00000000..cfc0fe78 --- /dev/null +++ b/WitchyTests/Properties/launchSettings.json @@ -0,0 +1,10 @@ +{ + "profiles": { + "Run Tests": { + "commandName": "Executable", + "executablePath": "dotnet", + "commandLineArgs": "test -v", + "workingDirectory": "$(SolutionDir)" + } + } +} \ No newline at end of file diff --git a/WitchyTests/Services/TestOutputService.cs b/WitchyTests/Services/TestOutputService.cs index c8f684e3..6b290968 100644 --- a/WitchyTests/Services/TestOutputService.cs +++ b/WitchyTests/Services/TestOutputService.cs @@ -5,24 +5,15 @@ namespace WitchyTests.Services; public class TestOutputService : IOutputService { - public object ConsoleWriterLock { get; } - public (int, int) WriteLine(string? value = null, Style? style = null, bool clearrestofline = true) + public void WriteLine(string? value = null, Style? style = null, bool clearrestofline = true) { TestContext.WriteLine(value); - return (-1, -1); - } - - public (int Left, int Top) WriteLineColor(string? value = null, Overflow overflow = Overflow.Crop, - bool clearrestofline = true) - { - throw new NotImplementedException(); } - public (int, int) WriteError(string? value = null, Style? style = null, bool clearrestofline = true) + public void WriteError(string? value = null, Style? style = null, bool clearrestofline = true) { TestContext.Error.WriteLine(value); - return (-1, -1); } public void DoubleDash(string value, DashOptions dashOptions = DashOptions.AsciiSingleBorder, int extralines = 0, diff --git a/WitchyTests/TestBase.cs b/WitchyTests/TestBase.cs index fe72ad4f..24e9ca4c 100644 --- a/WitchyTests/TestBase.cs +++ b/WitchyTests/TestBase.cs @@ -60,7 +60,6 @@ public void StartUp() // PromptPlus.Clear(); Console.OutputEncoding = Encoding.UTF8; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; - PromptPlus.Config.DefaultCulture = new CultureInfo("en-us"); } [SetUp] diff --git a/WitchyTests/WitchyTests.csproj b/WitchyTests/WitchyTests.csproj index 5eb5b35f..419c407b 100644 --- a/WitchyTests/WitchyTests.csproj +++ b/WitchyTests/WitchyTests.csproj @@ -1,13 +1,16 @@ - net9.0 + net10.0 + x64 enable enable false false true + + true diff --git a/WitchyTests/packages.linux-x64.lock.json b/WitchyTests/packages.linux-x64.lock.json new file mode 100644 index 00000000..7941a5fc --- /dev/null +++ b/WitchyTests/packages.linux-x64.lock.json @@ -0,0 +1,310 @@ +{ + "version": 1, + "dependencies": { + "net10.0": { + "coverlet.collector": { + "type": "Direct", + "requested": "[3.2.0, )", + "resolved": "3.2.0", + "contentHash": "xjY8xBigSeWIYs4I7DgUHqSNoGqnHi7Fv7/7RZD02rvZyG3hlsjnQKiVKVWKgr9kRKgmV+dEfu8KScvysiC0Wg==" + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.10.0-preview-24080-01, )", + "resolved": "17.10.0-preview-24080-01", + "contentHash": "nlFDfhAofGR+pHCKCb2fhElVpqnBrsJNlaobrrqFA04H4pgqJEBxsx8QDffg4Jpr9J3aYF3xhZkmdW2xGhQ+SA==", + "dependencies": { + "Microsoft.CodeCoverage": "17.10.0-preview-24080-01", + "Microsoft.TestPlatform.TestHost": "17.10.0-preview-24080-01" + } + }, + "NUnit": { + "type": "Direct", + "requested": "[4.1.0, )", + "resolved": "4.1.0", + "contentHash": "MT/DpAhjtiytzhTgTqIhBuWx4y26PKfDepYUHUM+5uv4TsryHC2jwFo5e6NhWkApCm/G6kZ80dRjdJFuAxq3rg==" + }, + "NUnit.Analyzers": { + "type": "Direct", + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "zhTn0POj5eEA4bi+zbaeIPT6F5HlgM0XH7sAWkNcUihzsl7Pn1J6eLGj/E/tPQiR6spFuh12u1tpWB6+xA0giQ==" + }, + "NUnit3TestAdapter": { + "type": "Direct", + "requested": "[4.5.0, )", + "resolved": "4.5.0", + "contentHash": "s8JpqTe9bI2f49Pfr3dFRfoVSuFQyraTj68c3XXjIS/MRGvvkLnrg6RLqnTjdShX+AdFUCCU/4Xex58AdUfs6A==" + }, + "Pose": { + "type": "Direct", + "requested": "[1.1.0, )", + "resolved": "1.1.0", + "contentHash": "ys5aaP7i4YqNMQmvcAiIlG9QtIUv9II41DDZxP+ZB/AEU1mnez+iIl56FfnXyB2Kk8ITakj9sdjsHNMhn3qTcQ==", + "dependencies": { + "Mono.Reflection": "1.1.0" + } + }, + "BouncyCastle.Cryptography": { + "type": "Transitive", + "resolved": "2.4.0", + "contentHash": "SwXsAV3sMvAU/Nn31pbjhWurYSjJ+/giI/0n6tCrYoupEK34iIHCuk3STAd9fx8yudM85KkLSVdn951vTng/vQ==" + }, + "CommandLineParser": { + "type": "Transitive", + "resolved": "2.9.1", + "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" + }, + "DrSwizzler": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" + }, + "EastAsianWidthDotNet": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "vCn17XpsjpqAQvWCa5oUh81d/AVytUcBG9frXoDa+f66iuAiq9T4kDcqQnyp3dbN9cJ0cJA6ML98glpf315haQ==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.10.0-preview-24080-01", + "contentHash": "GL66nih/QwuyUFUYv76kkojvqvDaVvi3G9K9dQopWFFcVWmisIDIavVek8eBUpxsp4YrMI3dTg6mc5WjsuJYlQ==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "IBOUkqIQb2VOaLzB6ljWaAqAyW8N1f2cZH34Em1lTfitGYUP18QjedzbW+/v9Gb8YqNTQ6rhL7rBsBi3mZyc1A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Primitives": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "8YjROL/QyuNg3++VJ/jCewanY16dW9uCWT3Coick0gPEnyO8yguGxqQ3Dr6cXb0leYMxT0WFJp9Fm3CyOkmAxA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "bOysJh+1kLNCpKpJYm28jNVbydpdh7ORLGEkNd9HGV1aEmXve60T65leVsXAUCgByPZObElKsnhnL67jVWBORQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Primitives": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "5QUIOCfDDXiJyp2u1u0e4ri8F8Lw9K3ZdIriMOhGFGhg6nxyZDDdD07ddcmSHtxlj2SNI29SQ/33uUWfaE8fsg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "yeQKItAqoHvCdgE5IIVBiWPnJIWQ7B5dOhmfZ6or+kmDJcdNOWQT45PTzizIBQ2dKT2cB6BaAIK+6jAmMyUU5w==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Primitives": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "DTnRifpgJYjjxGgpTBsfJDK82Cq5algQHOQnd4f7R7R4bMeYcdjyaqd3NAKXn4RU47CfNqB9/dIZS8OlHVgckQ==" + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.10.0-preview-24080-01", + "contentHash": "c80Y9Ur/Sl5Pb7AHqqZTnLJ/wZGHwbYk1/9SEUMhbHrJJCf3UoDjijqF6fs/F2XimOJlUcPiwEI0usRIQS+uFw==" + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.10.0-preview-24080-01", + "contentHash": "G0da8liGaoZZoaPIKM6pXwxLHc/A6f2JxOIrfyN0S53rrdEgMMq0KwfuKZxjux03upH9BsCIJmSesgxu/EemVQ==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.10.0-preview-24080-01", + "Newtonsoft.Json": "13.0.1" + } + }, + "Mono.Reflection": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "o3AQIRxCMAVhA0hezVgxUxZbIWjLE3TPD056SPb7yqGINQuA9kEZN9NEQ8F4cCu9CCjNufhXbboqRL9+iBvikA==" + }, + "NativeFileDialogSharp": { + "type": "Transitive", + "resolved": "0.6.0-alpha", + "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "securifybv.PropertyStore": { + "type": "Transitive", + "resolved": "0.1.0", + "contentHash": "N7oMyWl3RCbSi8SFK3vVtBpJD3OompLGZOwO2VQpyw6d8Qk8HTxCSuQzeSB4QzUWewQvMoQu5Qr5QgDQ1z5/5g==" + }, + "securifybv.ShellLink": { + "type": "Transitive", + "resolved": "0.1.0", + "contentHash": "VjJ8rJi6+yVla8DG1XRthwVneZq2Iojhf0KXwEKqJ+bIgbFTCIMpq33i0/HvPJSS1TdmaoGEnPHmjwP2ibenaA==", + "dependencies": { + "securifybv.PropertyStore": "0.1.0" + } + }, + "ZstdNet": { + "type": "Transitive", + "resolved": "1.4.5", + "contentHash": "fi9aP1QY3ZenIMUW1pxdSjku6lYAUjScrwfXSXT1qyKtTdLxOIzeBMe+w/hQm0vMsvQnjcFInByMrIT7AlXUHA==" + }, + "promptplus": { + "type": "Project", + "dependencies": { + "EastAsianWidthDotNet": "[1.0.1, )" + } + }, + "soulsformats": { + "type": "Project", + "dependencies": { + "BouncyCastle.Cryptography": "[2.4.0, )", + "DrSwizzler": "[1.1.1, )", + "ZstdNet": "[1.4.5, )" + } + }, + "soulsoodlelib": { + "type": "Project", + "dependencies": { + "BouncyCastle.Cryptography": "[2.4.0, )", + "NativeFileDialogSharp": "[0.6.0-alpha, )", + "SoulsFormats": "[2.17.0, )" + } + }, + "witchybnd": { + "type": "Project", + "dependencies": { + "CommandLineParser": "[2.9.1, )", + "Microsoft.Extensions.Configuration.Binder": "[8.0.0-preview.7.23375.6, )", + "Microsoft.Extensions.Configuration.Json": "[8.0.0-preview.7.23375.6, )", + "Microsoft.Extensions.DependencyInjection": "[8.0.0, )", + "Microsoft.Extensions.Hosting.Abstractions": "[8.0.0, )", + "NativeFileDialogSharp": "[0.6.0-alpha, )", + "PromptPlus": "[5.0.1, )", + "SoulsFormats": "[2.17.0, )", + "SoulsOodleLib": "[2.17.0, )", + "WitchyFormats": "[2.17.0, )", + "WitchyLib": "[2.17.0, )", + "securifybv.ShellLink": "[0.1.0, )" + } + }, + "witchyformats": { + "type": "Project", + "dependencies": { + "SoulsFormats": "[2.17.0, )" + } + }, + "witchylib": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", + "Newtonsoft.Json": "[13.0.3, )", + "PromptPlus": "[5.0.1, )", + "WitchyFormats": "[2.17.0, )" + } + } + }, + "net10.0/linux-x64": { + "NativeFileDialogSharp": { + "type": "Transitive", + "resolved": "0.6.0-alpha", + "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" + } + } + } +} \ No newline at end of file diff --git a/WitchyTests/packages.lock.json b/WitchyTests/packages.lock.json index adcf2f2e..0f7f4c72 100644 --- a/WitchyTests/packages.lock.json +++ b/WitchyTests/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net9.0": { + "net10.0": { "coverlet.collector": { "type": "Direct", "requested": "[3.2.0, )", @@ -42,8 +42,7 @@ "resolved": "1.1.0", "contentHash": "ys5aaP7i4YqNMQmvcAiIlG9QtIUv9II41DDZxP+ZB/AEU1mnez+iIl56FfnXyB2Kk8ITakj9sdjsHNMhn3qTcQ==", "dependencies": { - "Mono.Reflection": "1.1.0", - "System.Reflection.Emit.Lightweight": "4.3.0" + "Mono.Reflection": "1.1.0" } }, "BouncyCastle.Cryptography": { @@ -71,11 +70,6 @@ "resolved": "17.10.0-preview-24080-01", "contentHash": "GL66nih/QwuyUFUYv76kkojvqvDaVvi3G9K9dQopWFFcVWmisIDIavVek8eBUpxsp4YrMI3dTg6mc5WjsuJYlQ==" }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" - }, "Microsoft.Extensions.Configuration": { "type": "Transitive", "resolved": "8.0.0-preview.7.23375.6", @@ -121,8 +115,7 @@ "Microsoft.Extensions.Configuration": "8.0.0-preview.7.23375.6", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6", "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0-preview.7.23375.6", - "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0-preview.7.23375.6", - "System.Text.Json": "8.0.0-preview.7.23375.6" + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0-preview.7.23375.6" } }, "Microsoft.Extensions.DependencyInjection": { @@ -144,8 +137,7 @@ "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.0" + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.FileProviders.Abstractions": { @@ -205,23 +197,10 @@ "resolved": "8.0.0", "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", "resolved": "17.10.0-preview-24080-01", - "contentHash": "c80Y9Ur/Sl5Pb7AHqqZTnLJ/wZGHwbYk1/9SEUMhbHrJJCf3UoDjijqF6fs/F2XimOJlUcPiwEI0usRIQS+uFw==", - "dependencies": { - "System.Reflection.Metadata": "1.6.0" - } + "contentHash": "c80Y9Ur/Sl5Pb7AHqqZTnLJ/wZGHwbYk1/9SEUMhbHrJJCf3UoDjijqF6fs/F2XimOJlUcPiwEI0usRIQS+uFw==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", @@ -247,14 +226,6 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, - "PromptPlus": { - "type": "Transitive", - "resolved": "5.0.0-IB2", - "contentHash": "DPRvXZO2QmUTDDWCSR9vHzyp+/qtgeEnlU9OD02ilvV9q4Fl0ZrPcL+MsdTz0gfg/biyB8c0Ff9OxR+x3E3OPA==", - "dependencies": { - "EastAsianWidthDotNet": "1.0.1" - } - }, "securifybv.PropertyStore": { "type": "Transitive", "resolved": "0.1.0", @@ -268,135 +239,22 @@ "securifybv.PropertyStore": "0.1.0" } }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.ILGeneration": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.Lightweight": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0-preview.7.23375.6", - "contentHash": "vCdCGFDzYkDfcnNd5ck7ngX9IUhXoMkfUlLWWw0BWBs/6LOF596LtkoG15pGxLS4s/HuTHsyrQ6USZSZa8blNA==" - }, - "System.Text.Json": { - "type": "Transitive", - "resolved": "8.0.0-preview.7.23375.6", - "contentHash": "xsCKwwq+cK/VwE61P1vr9yZh0p5LEQ+hG1MGKzpheA1gJgSKIQ6ArNp9nIYwoDX5WR+ichovXq117O0wHAZNLA==", - "dependencies": { - "System.Text.Encodings.Web": "8.0.0-preview.7.23375.6" - } - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.ValueTuple": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" - }, "ZstdNet": { "type": "Transitive", "resolved": "1.4.5", "contentHash": "fi9aP1QY3ZenIMUW1pxdSjku6lYAUjScrwfXSXT1qyKtTdLxOIzeBMe+w/hQm0vMsvQnjcFInByMrIT7AlXUHA==" }, + "promptplus": { + "type": "Project", + "dependencies": { + "EastAsianWidthDotNet": "[1.0.1, )" + } + }, "soulsformats": { "type": "Project", "dependencies": { "BouncyCastle.Cryptography": "[2.4.0, )", "DrSwizzler": "[1.1.1, )", - "System.Text.Encoding.CodePages": "[8.0.0, )", - "System.ValueTuple": "[4.5.0, )", "ZstdNet": "[1.4.5, )" } }, @@ -412,12 +270,12 @@ "type": "Project", "dependencies": { "CommandLineParser": "[2.9.1, )", - "Microsoft.CSharp": "[4.7.0, )", "Microsoft.Extensions.Configuration.Binder": "[8.0.0-preview.7.23375.6, )", "Microsoft.Extensions.Configuration.Json": "[8.0.0-preview.7.23375.6, )", "Microsoft.Extensions.DependencyInjection": "[8.0.0, )", "Microsoft.Extensions.Hosting.Abstractions": "[8.0.0, )", "NativeFileDialogSharp": "[0.6.0-alpha, )", + "PromptPlus": "[5.0.1, )", "SoulsFormats": "[2.17.0, )", "SoulsOodleLib": "[2.17.0, )", "WitchyFormats": "[2.17.0, )", @@ -434,10 +292,9 @@ "witchylib": { "type": "Project", "dependencies": { - "Microsoft.CSharp": "[4.7.0, )", "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", "Newtonsoft.Json": "[13.0.3, )", - "PromptPlus": "[5.0.0-IB2, )", + "PromptPlus": "[5.0.1, )", "WitchyFormats": "[2.17.0, )" } } diff --git a/WitchyTests/packages.win-x64.lock.json b/WitchyTests/packages.win-x64.lock.json new file mode 100644 index 00000000..50229110 --- /dev/null +++ b/WitchyTests/packages.win-x64.lock.json @@ -0,0 +1,310 @@ +{ + "version": 1, + "dependencies": { + "net10.0": { + "coverlet.collector": { + "type": "Direct", + "requested": "[3.2.0, )", + "resolved": "3.2.0", + "contentHash": "xjY8xBigSeWIYs4I7DgUHqSNoGqnHi7Fv7/7RZD02rvZyG3hlsjnQKiVKVWKgr9kRKgmV+dEfu8KScvysiC0Wg==" + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.10.0-preview-24080-01, )", + "resolved": "17.10.0-preview-24080-01", + "contentHash": "nlFDfhAofGR+pHCKCb2fhElVpqnBrsJNlaobrrqFA04H4pgqJEBxsx8QDffg4Jpr9J3aYF3xhZkmdW2xGhQ+SA==", + "dependencies": { + "Microsoft.CodeCoverage": "17.10.0-preview-24080-01", + "Microsoft.TestPlatform.TestHost": "17.10.0-preview-24080-01" + } + }, + "NUnit": { + "type": "Direct", + "requested": "[4.1.0, )", + "resolved": "4.1.0", + "contentHash": "MT/DpAhjtiytzhTgTqIhBuWx4y26PKfDepYUHUM+5uv4TsryHC2jwFo5e6NhWkApCm/G6kZ80dRjdJFuAxq3rg==" + }, + "NUnit.Analyzers": { + "type": "Direct", + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "zhTn0POj5eEA4bi+zbaeIPT6F5HlgM0XH7sAWkNcUihzsl7Pn1J6eLGj/E/tPQiR6spFuh12u1tpWB6+xA0giQ==" + }, + "NUnit3TestAdapter": { + "type": "Direct", + "requested": "[4.5.0, )", + "resolved": "4.5.0", + "contentHash": "s8JpqTe9bI2f49Pfr3dFRfoVSuFQyraTj68c3XXjIS/MRGvvkLnrg6RLqnTjdShX+AdFUCCU/4Xex58AdUfs6A==" + }, + "Pose": { + "type": "Direct", + "requested": "[1.1.0, )", + "resolved": "1.1.0", + "contentHash": "ys5aaP7i4YqNMQmvcAiIlG9QtIUv9II41DDZxP+ZB/AEU1mnez+iIl56FfnXyB2Kk8ITakj9sdjsHNMhn3qTcQ==", + "dependencies": { + "Mono.Reflection": "1.1.0" + } + }, + "BouncyCastle.Cryptography": { + "type": "Transitive", + "resolved": "2.4.0", + "contentHash": "SwXsAV3sMvAU/Nn31pbjhWurYSjJ+/giI/0n6tCrYoupEK34iIHCuk3STAd9fx8yudM85KkLSVdn951vTng/vQ==" + }, + "CommandLineParser": { + "type": "Transitive", + "resolved": "2.9.1", + "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" + }, + "DrSwizzler": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" + }, + "EastAsianWidthDotNet": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "vCn17XpsjpqAQvWCa5oUh81d/AVytUcBG9frXoDa+f66iuAiq9T4kDcqQnyp3dbN9cJ0cJA6ML98glpf315haQ==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.10.0-preview-24080-01", + "contentHash": "GL66nih/QwuyUFUYv76kkojvqvDaVvi3G9K9dQopWFFcVWmisIDIavVek8eBUpxsp4YrMI3dTg6mc5WjsuJYlQ==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "IBOUkqIQb2VOaLzB6ljWaAqAyW8N1f2cZH34Em1lTfitGYUP18QjedzbW+/v9Gb8YqNTQ6rhL7rBsBi3mZyc1A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Primitives": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "8YjROL/QyuNg3++VJ/jCewanY16dW9uCWT3Coick0gPEnyO8yguGxqQ3Dr6cXb0leYMxT0WFJp9Fm3CyOkmAxA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "bOysJh+1kLNCpKpJYm28jNVbydpdh7ORLGEkNd9HGV1aEmXve60T65leVsXAUCgByPZObElKsnhnL67jVWBORQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Primitives": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "5QUIOCfDDXiJyp2u1u0e4ri8F8Lw9K3ZdIriMOhGFGhg6nxyZDDdD07ddcmSHtxlj2SNI29SQ/33uUWfaE8fsg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, + "Microsoft.Extensions.Diagnostics.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JHYCQG7HmugNYUhOl368g+NMxYE/N/AiclCYRNlgCY9eVyiBkOHMwK4x60RYMxv9EL3+rmj1mqHvdCiPpC+D4Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "yeQKItAqoHvCdgE5IIVBiWPnJIWQ7B5dOhmfZ6or+kmDJcdNOWQT45PTzizIBQ2dKT2cB6BaAIK+6jAmMyUU5w==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0-preview.7.23375.6", + "Microsoft.Extensions.Primitives": "8.0.0-preview.7.23375.6" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "8.0.0-preview.7.23375.6", + "contentHash": "DTnRifpgJYjjxGgpTBsfJDK82Cq5algQHOQnd4f7R7R4bMeYcdjyaqd3NAKXn4RU47CfNqB9/dIZS8OlHVgckQ==" + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AG7HWwVRdCHlaA++1oKDxLsXIBxmDpMPb3VoyOoAghEWnkUvEAdYQUwnV4jJbAaa/nMYNiEh5ByoLauZBEiovg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.10.0-preview-24080-01", + "contentHash": "c80Y9Ur/Sl5Pb7AHqqZTnLJ/wZGHwbYk1/9SEUMhbHrJJCf3UoDjijqF6fs/F2XimOJlUcPiwEI0usRIQS+uFw==" + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.10.0-preview-24080-01", + "contentHash": "G0da8liGaoZZoaPIKM6pXwxLHc/A6f2JxOIrfyN0S53rrdEgMMq0KwfuKZxjux03upH9BsCIJmSesgxu/EemVQ==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.10.0-preview-24080-01", + "Newtonsoft.Json": "13.0.1" + } + }, + "Mono.Reflection": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "o3AQIRxCMAVhA0hezVgxUxZbIWjLE3TPD056SPb7yqGINQuA9kEZN9NEQ8F4cCu9CCjNufhXbboqRL9+iBvikA==" + }, + "NativeFileDialogSharp": { + "type": "Transitive", + "resolved": "0.6.0-alpha", + "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "securifybv.PropertyStore": { + "type": "Transitive", + "resolved": "0.1.0", + "contentHash": "N7oMyWl3RCbSi8SFK3vVtBpJD3OompLGZOwO2VQpyw6d8Qk8HTxCSuQzeSB4QzUWewQvMoQu5Qr5QgDQ1z5/5g==" + }, + "securifybv.ShellLink": { + "type": "Transitive", + "resolved": "0.1.0", + "contentHash": "VjJ8rJi6+yVla8DG1XRthwVneZq2Iojhf0KXwEKqJ+bIgbFTCIMpq33i0/HvPJSS1TdmaoGEnPHmjwP2ibenaA==", + "dependencies": { + "securifybv.PropertyStore": "0.1.0" + } + }, + "ZstdNet": { + "type": "Transitive", + "resolved": "1.4.5", + "contentHash": "fi9aP1QY3ZenIMUW1pxdSjku6lYAUjScrwfXSXT1qyKtTdLxOIzeBMe+w/hQm0vMsvQnjcFInByMrIT7AlXUHA==" + }, + "promptplus": { + "type": "Project", + "dependencies": { + "EastAsianWidthDotNet": "[1.0.1, )" + } + }, + "soulsformats": { + "type": "Project", + "dependencies": { + "BouncyCastle.Cryptography": "[2.4.0, )", + "DrSwizzler": "[1.1.1, )", + "ZstdNet": "[1.4.5, )" + } + }, + "soulsoodlelib": { + "type": "Project", + "dependencies": { + "BouncyCastle.Cryptography": "[2.4.0, )", + "NativeFileDialogSharp": "[0.6.0-alpha, )", + "SoulsFormats": "[2.17.0, )" + } + }, + "witchybnd": { + "type": "Project", + "dependencies": { + "CommandLineParser": "[2.9.1, )", + "Microsoft.Extensions.Configuration.Binder": "[8.0.0-preview.7.23375.6, )", + "Microsoft.Extensions.Configuration.Json": "[8.0.0-preview.7.23375.6, )", + "Microsoft.Extensions.DependencyInjection": "[8.0.0, )", + "Microsoft.Extensions.Hosting.Abstractions": "[8.0.0, )", + "NativeFileDialogSharp": "[0.6.0-alpha, )", + "PromptPlus": "[5.0.1, )", + "SoulsFormats": "[2.17.0, )", + "SoulsOodleLib": "[2.17.0, )", + "WitchyFormats": "[2.17.0, )", + "WitchyLib": "[2.17.0, )", + "securifybv.ShellLink": "[0.1.0, )" + } + }, + "witchyformats": { + "type": "Project", + "dependencies": { + "SoulsFormats": "[2.17.0, )" + } + }, + "witchylib": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", + "Newtonsoft.Json": "[13.0.3, )", + "PromptPlus": "[5.0.1, )", + "WitchyFormats": "[2.17.0, )" + } + } + }, + "net10.0/win-x64": { + "NativeFileDialogSharp": { + "type": "Transitive", + "resolved": "0.6.0-alpha", + "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" + } + } + } +} \ No newline at end of file diff --git a/global.json b/global.json index 263c7a18..13727129 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.306" + "version": "10.0.101" } } \ No newline at end of file diff --git a/nuget.config b/nuget.config deleted file mode 100644 index e6e59682..00000000 --- a/nuget.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From a8b459fd7e79adefef795aeb0f56e24ef876a768 Mon Sep 17 00:00:00 2001 From: ividyon <1077140+ividyon@users.noreply.github.com> Date: Mon, 5 Jan 2026 20:59:35 +0100 Subject: [PATCH 05/15] release workflow & linux workflow --- .github/workflows/artifact-windows.yml | 96 ----------- .github/workflows/artifact.yml | 145 ++++++++++++++++ .github/workflows/release.yml | 221 +++++++++++-------------- WitchyTests/Tests/RegulationTests.cs | 6 +- 4 files changed, 247 insertions(+), 221 deletions(-) delete mode 100644 .github/workflows/artifact-windows.yml create mode 100644 .github/workflows/artifact.yml diff --git a/.github/workflows/artifact-windows.yml b/.github/workflows/artifact-windows.yml deleted file mode 100644 index 3eb7f3de..00000000 --- a/.github/workflows/artifact-windows.yml +++ /dev/null @@ -1,96 +0,0 @@ -# This workflow will build a .NET project -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net - -name: Development artifact (Windows) - -concurrency: - group: build - cancel-in-progress: false - -on: - push: - branches: - - 'main' - - 'feat/*' - tags: - - '!**' - pull_request: - branches: [ "main" ] - -env: - DOTNET_VERSION: '10.0.101' - NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages - NEXUSMOD_API_KEY: ${{ secrets.NEXUSMOD_API_KEY }} - NEXUSMOD_SESSION_COOKIE: ${{ secrets.NEXUSMOD_SESSION_COOKIE }} - -jobs: - build: - runs-on: windows-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - submodules: 'true' - - - name: Dotnet cache - id: cache-dotnet-core - uses: actions/cache@v3 - with: - path: ${{ github.workspace }}/.dotnet - key: ${{ runner.os }}-dotnet-${{ env.DOTNET_VERSION }} - - - name: NuGet cache - id: cache-nuget - uses: actions/cache@v3 - with: - path: | - ${{ github.workspace }}/.nuget/packages - ${{ github.workspace }}/packages - ${{ github.workspace }}/WitchyBND/**/obj - ${{ github.workspace }}/WitchyBND.Shell/**/obj - ${{ github.workspace }}/WitchyFormats/**/obj - ${{ github.workspace }}/WitchyLib/**/obj - ${{ github.workspace }}/WitchyTests/**/obj - ${{ github.workspace }}/SoulsFormats/**/obj - ${{ github.workspace }}/SoulsOodleLib/**/obj - key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} - - - name: Setup .NET - if: ${{ steps.cache-dotnet-core.outputs.cache-hit != 'true' }} - uses: actions/setup-dotnet@v3 - with: - dotnet-version: ${{ env.DOTNET_VERSION }} - - - name: Restore packages - if: ${{ steps.cache-nuget.outputs.cache-hit != 'true' }} - run: dotnet restore -r win-x64 --locked-mode ./WitchyBND.sln --lock-file-path packages.win-x64.lock.json - - - name: Build - run: dotnet build -r win-x64 -c Release --no-restore ./WitchyTests/WitchyTests.csproj # Builds WitchyTests which builds WitchyBND which builds WitchyBND.Shell - - - name: Install test runner - run: nuget install NUnit.ConsoleRunner -Version 3.22.0 -DirectDownload -OutputDirectory . - - - name: Run unit tests - run: ./NUnit.ConsoleRunner.3.22.0/tools/nunit3-console.exe ./WitchyTests/bin/Release/net10.0/win-x64/WitchyTests.dll --where "cat != SkipOnGitHubAction" - - - name: Publish application - run: | - cd WitchyBND - dotnet publish -r win-x64 -c Release --no-restore - - # Upload the MSIX package: https://github.com/marketplace/actions/upload-a-build-artifact - - name: Upload build artifacts - uses: actions/upload-artifact@v4 - with: - name: 'WitchyBND-win-x64-SHA${{ github.sha }}' - path: './bin/publish/win-x64' - -# nexus: -# runs-on: windows-latest -# steps: -# - name: Setup mod uploader -# run: dotnet tool install -g Digitalroot.ModUploader -# -# - name: Check mod uploader -# run: drmu nx check \ No newline at end of file diff --git a/.github/workflows/artifact.yml b/.github/workflows/artifact.yml new file mode 100644 index 00000000..74c8a7ba --- /dev/null +++ b/.github/workflows/artifact.yml @@ -0,0 +1,145 @@ +# This workflow will build a .NET project +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net + +name: Development artifact + +concurrency: + group: build + cancel-in-progress: false + +on: + push: + branches: + - 'main' + - 'feat/*' + tags: + - '!**' + pull_request: + branches: [ "main" ] + +env: + DOTNET_VERSION: '10.0.101' + NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages + NEXUSMOD_API_KEY: ${{ secrets.NEXUSMOD_API_KEY }} + NEXUSMOD_SESSION_COOKIE: ${{ secrets.NEXUSMOD_SESSION_COOKIE }} + +jobs: + build-windows: + runs-on: windows-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: 'true' + + - name: Dotnet cache + id: cache-dotnet-core + uses: actions/cache@v3 + with: + path: ${{ github.workspace }}/.dotnet + key: ${{ runner.os }}-dotnet-${{ env.DOTNET_VERSION }} + + - name: NuGet cache + id: cache-nuget + uses: actions/cache@v3 + with: + path: | + ${{ github.workspace }}/.nuget/packages + ${{ github.workspace }}/packages + ${{ github.workspace }}/PromptPlus/**/obj + ${{ github.workspace }}/WitchyBND/**/obj + ${{ github.workspace }}/WitchyBND.Shell/**/obj + ${{ github.workspace }}/WitchyFormats/**/obj + ${{ github.workspace }}/WitchyLib/**/obj + ${{ github.workspace }}/WitchyTests/**/obj + ${{ github.workspace }}/SoulsFormats/**/obj + ${{ github.workspace }}/SoulsOodleLib/**/obj + key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.win-x64.lock.json') }} + + - name: Setup .NET + if: ${{ steps.cache-dotnet-core.outputs.cache-hit != 'true' }} + uses: actions/setup-dotnet@v3 + with: + dotnet-version: ${{ env.DOTNET_VERSION }} + + - name: Restore packages + if: ${{ steps.cache-nuget.outputs.cache-hit != 'true' }} + run: dotnet restore -r win-x64 --locked-mode ./WitchyBND.sln --lock-file-path packages.win-x64.lock.json + + - name: Build + run: dotnet build -r win-x64 -c Release --no-restore ./WitchyTests/WitchyTests.csproj # Builds WitchyTests which builds WitchyBND which builds WitchyBND.Shell + + - name: Run unit tests + run: dotnet test -c Release -r win-x64 --no-build --filter TestCategory!=SkipOnGitHubAction + + - name: Publish application + run: | + cd WitchyBND + dotnet publish -r win-x64 -c Release --no-build + + # Upload the MSIX package: https://github.com/marketplace/actions/upload-a-build-artifact + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: 'WitchyBND-SHA${{ github.sha }}-win-x64' + path: './bin/publish/win-x64' + + build-linux: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: 'true' + + - name: Dotnet cache + id: cache-dotnet-core + uses: actions/cache@v3 + with: + path: ${{ github.workspace }}/.dotnet + key: ${{ runner.os }}-dotnet-${{ env.DOTNET_VERSION }} + + - name: NuGet cache + id: cache-nuget + uses: actions/cache@v3 + with: + path: | + ${{ github.workspace }}/.nuget/packages + ${{ github.workspace }}/packages + ${{ github.workspace }}/PromptPlus/**/obj + ${{ github.workspace }}/WitchyBND/**/obj + ${{ github.workspace }}/WitchyBND.Shell/**/obj + ${{ github.workspace }}/WitchyFormats/**/obj + ${{ github.workspace }}/WitchyLib/**/obj + ${{ github.workspace }}/WitchyTests/**/obj + ${{ github.workspace }}/SoulsFormats/**/obj + ${{ github.workspace }}/SoulsOodleLib/**/obj + key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.linux-x64.lock.json') }} + + - name: Setup .NET + if: ${{ steps.cache-dotnet-core.outputs.cache-hit != 'true' }} + uses: actions/setup-dotnet@v3 + with: + dotnet-version: ${{ env.DOTNET_VERSION }} + + - name: Restore packages + if: ${{ steps.cache-nuget.outputs.cache-hit != 'true' }} + run: dotnet restore -r linux-x64 --locked-mode ./WitchyBND.sln --lock-file-path packages.linux-x64.lock.json + + - name: Build + run: dotnet build -c Release -r linux-x64 --no-restore ./WitchyTests/WitchyTests.csproj # Builds WitchyTests which builds WitchyBND which builds WitchyBND.Shell + + - name: Run unit tests + run: dotnet test -c Release -r linux-x64 --no-build --filter TestCategory!=SkipOnGitHubAction + + - name: Publish application + run: | + cd WitchyBND + dotnet publish -c Release -r linux-x64 --no-build + + # Upload the MSIX package: https://github.com/marketplace/actions/upload-a-build-artifact + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: 'WitchyBND-SHA${{ github.sha }}-linux-x64' + path: './bin/publish/linux-x64' \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f40f54e6..434c51bf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,7 +22,7 @@ env: NEXUSMOD_SESSION_COOKIE: ${{ secrets.NEXUSMOD_SESSION_COOKIE }} jobs: - build: + build-windows: runs-on: windows-latest steps: - name: Checkout code @@ -30,157 +30,134 @@ jobs: with: submodules: 'true' - - name: Setup cache + - name: Dotnet cache + id: cache-dotnet-core uses: actions/cache@v3 with: - path: ${{ github.workspace }}/.nuget/packages - key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} - restore-keys: | - ${{ runner.os }}-nuget- + path: ${{ github.workspace }}/.dotnet + key: ${{ runner.os }}-dotnet-${{ env.DOTNET_VERSION }} + + - name: NuGet cache + id: cache-nuget + uses: actions/cache@v3 + with: + path: | + ${{ github.workspace }}/.nuget/packages + ${{ github.workspace }}/packages + ${{ github.workspace }}/PromptPlus/**/obj + ${{ github.workspace }}/WitchyBND/**/obj + ${{ github.workspace }}/WitchyBND.Shell/**/obj + ${{ github.workspace }}/WitchyFormats/**/obj + ${{ github.workspace }}/WitchyLib/**/obj + ${{ github.workspace }}/WitchyTests/**/obj + ${{ github.workspace }}/SoulsFormats/**/obj + ${{ github.workspace }}/SoulsOodleLib/**/obj + key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.win-x64.lock.json') }} - name: Setup .NET + if: ${{ steps.cache-dotnet-core.outputs.cache-hit != 'true' }} uses: actions/setup-dotnet@v3 with: dotnet-version: ${{ env.DOTNET_VERSION }} - name: Restore packages - run: nuget restore ./WitchyBND.sln -LockedMode + if: ${{ steps.cache-nuget.outputs.cache-hit != 'true' }} + run: dotnet restore -r win-x64 --locked-mode ./WitchyBND.sln --lock-file-path packages.win-x64.lock.json - name: Build - run: dotnet build -c Release --no-restore ./WitchyTests/WitchyTests.csproj # Builds WitchyBND which builds Shell + run: dotnet build -r win-x64 -c Release --no-restore ./WitchyTests/WitchyTests.csproj # Builds WitchyTests which builds WitchyBND which builds WitchyBND.Shell + + - name: Run unit tests + run: dotnet test -c Release -r win-x64 --no-build --filter TestCategory!=SkipOnGitHubAction + + - name: Publish application + run: | + cd WitchyBND + dotnet publish -r win-x64 -c Release --no-build + + - name: Archive release + uses: thedoctor0/zip-release@main + with: + type: 'zip' + filename: '../../WitchyBND-${{ github.ref_name }}-win-x64.zip' + directory: './bin/publish' + path: '.' + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: 'WitchyBND-SHA${{ github.sha }}-win-x64' + path: WitchyBND-${{ github.ref_name }}-win-x64.zip - - name: Install test runner - run: nuget install NUnit.ConsoleRunner -Version 3.17.0 -DirectDownload -OutputDirectory . + build-linux: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: 'true' + + - name: Dotnet cache + id: cache-dotnet-core + uses: actions/cache@v3 + with: + path: ${{ github.workspace }}/.dotnet + key: ${{ runner.os }}-dotnet-${{ env.DOTNET_VERSION }} + + - name: NuGet cache + id: cache-nuget + uses: actions/cache@v3 + with: + path: | + ${{ github.workspace }}/.nuget/packages + ${{ github.workspace }}/packages + ${{ github.workspace }}/PromptPlus/**/obj + ${{ github.workspace }}/WitchyBND/**/obj + ${{ github.workspace }}/WitchyBND.Shell/**/obj + ${{ github.workspace }}/WitchyFormats/**/obj + ${{ github.workspace }}/WitchyLib/**/obj + ${{ github.workspace }}/WitchyTests/**/obj + ${{ github.workspace }}/SoulsFormats/**/obj + ${{ github.workspace }}/SoulsOodleLib/**/obj + key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.linux-x64.lock.json') }} + + - name: Setup .NET + if: ${{ steps.cache-dotnet-core.outputs.cache-hit != 'true' }} + uses: actions/setup-dotnet@v3 + with: + dotnet-version: ${{ env.DOTNET_VERSION }} + + - name: Restore packages + if: ${{ steps.cache-nuget.outputs.cache-hit != 'true' }} + run: dotnet restore -r linux-x64 --locked-mode ./WitchyBND.sln --lock-file-path packages.linux-x64.lock.json + + - name: Build + run: dotnet build -c Release -r linux-x64 --no-restore ./WitchyTests/WitchyTests.csproj # Builds WitchyTests which builds WitchyBND which builds WitchyBND.Shell - name: Run unit tests - run: ./NUnit.ConsoleRunner.3.17.0/tools/nunit3-console.exe ./WitchyTests/bin/Release/net8.0-windows/WitchyTests.dll --where "cat != SkipOnGitHubAction" + run: dotnet test -c Release -r linux-x64 --no-build --filter TestCategory!=SkipOnGitHubAction - name: Publish application run: | cd WitchyBND - dotnet publish -c Release --no-restore + dotnet publish -c Release -r linux-x64 --no-build - name: Archive release uses: thedoctor0/zip-release@main with: type: 'zip' - filename: '../../WitchyBND-${{ github.ref_name }}.zip' + filename: '../../WitchyBND-${{ github.ref_name }}-linux-x64.zip' directory: './bin/publish' path: '.' - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: 'WitchyBND-SHA${{ github.sha }}' - path: WitchyBND-${{ github.ref_name }}.zip - -# nexus: -# needs: build -# runs-on: windows-latest -# steps: -# - name: Setup mod uploader -# run: dotnet tool install -g Digitalroot.ModUploader -# -# - name: Check mod uploader -# run: drmu nx check -# -# - name: Download artifact -# uses: actions/download-artifact@v4 -# with: -# pattern: WitchyBND-SHA* -# -# - name: Upload to Elden Ring Nexus -# run: drmu nexusmods upload -# -f "WitchyBND" -# -v "${{ github.ref_name }}" -# -t Main -# -d "For the list of changes, view the changelog [url=https://github.com/ividyon/WitchyBND]on the GitHub page[/url]." -# -g eldenring -# -ddwm -# 3862 "WitchyBND-SHA${{ github.sha }}\WitchyBND-${{ github.ref_name }}.zip" -# -# - name: Upload to Nightreign Nexus -# run: drmu nexusmods upload -# -f "WitchyBND" -# -v "${{ github.ref_name }}" -# -t Main -# -d "For the list of changes, view the changelog [url=https://github.com/ividyon/WitchyBND]on the GitHub page[/url]." -# -g eldenringnightreign -# -ddwm -# 336 "WitchyBND-SHA${{ github.sha }}\WitchyBND-${{ github.ref_name }}.zip" -# -# - name: Upload to ACVI Nexus -# run: drmu nexusmods upload -# -f "WitchyBND" -# -v "${{ github.ref_name }}" -# -t Main -# -d "For the list of changes, view the changelog [url=https://github.com/ividyon/WitchyBND]on the GitHub page[/url]." -# -g armoredcore6firesofrubicon -# -ddwm -# 20 "WitchyBND-SHA${{ github.sha }}\WitchyBND-${{ github.ref_name }}.zip" -# -# - name: Upload to DS1 Nexus -# run: drmu nexusmods upload -# -f "WitchyBND" -# -v "${{ github.ref_name }}" -# -t Main -# -d "For the list of changes, view the changelog [url=https://github.com/ividyon/WitchyBND]on the GitHub page[/url]." -# -g darksouls -# -ddwm -# 1865 "WitchyBND-SHA${{ github.sha }}\WitchyBND-${{ github.ref_name }}.zip" -# -# - name: Upload to DS1R Nexus -# run: drmu nexusmods upload -# -f "WitchyBND" -# -v "${{ github.ref_name }}" -# -t Main -# -d "For the list of changes, view the changelog [url=https://github.com/ividyon/WitchyBND]on the GitHub page[/url]." -# -g darksoulsremastered -# -ddwm -# 653 "WitchyBND-SHA${{ github.sha }}\WitchyBND-${{ github.ref_name }}.zip" -# -# - name: Upload to DS2 Nexus -# run: drmu nexusmods upload -# -f "WitchyBND" -# -v "${{ github.ref_name }}" -# -t Main -# -d "For the list of changes, view the changelog [url=https://github.com/ividyon/WitchyBND]on the GitHub page[/url]." -# -g darksouls2 -# -ddwm -# 1192 "WitchyBND-SHA${{ github.sha }}\WitchyBND-${{ github.ref_name }}.zip" -# -# - name: Upload to DS3 Nexus -# run: drmu nexusmods upload -# -f "WitchyBND" -# -v "${{ github.ref_name }}" -# -t Main -# -d "For the list of changes, view the changelog [url=https://github.com/ividyon/WitchyBND]on the GitHub page[/url]." -# -g darksouls3 -# -ddwm -# 1676 "WitchyBND-SHA${{ github.sha }}\WitchyBND-${{ github.ref_name }}.zip" -# -# - name: Upload to Sekiro Nexus -# run: drmu nexusmods upload -# -f "WitchyBND" -# -v "${{ github.ref_name }}" -# -t Main -# -d "For the list of changes, view the changelog [url=https://github.com/ividyon/WitchyBND]on the GitHub page[/url]." -# -g sekiro -# -ddwm -# 1633 "WitchyBND-SHA${{ github.sha }}\WitchyBND-${{ github.ref_name }}.zip" -# -# - name: Upload to Bloodborne Nexus -# run: drmu nexusmods upload -# -f "WitchyBND" -# -v "${{ github.ref_name }}" -# -t Main -# -d "For the list of changes, view the changelog [url=https://github.com/ividyon/WitchyBND]on the GitHub page[/url]." -# -g bloodborne -# -ddwm -# 20 "WitchyBND-SHA${{ github.sha }}\WitchyBND-${{ github.ref_name }}.zip" + name: 'WitchyBND-SHA${{ github.sha }}-linux-x64' + path: WitchyBND-${{ github.ref_name }}-linux-x64.zip release: - needs: build + needs: [build-windows, build-linux] runs-on: windows-latest steps: - name: Checkout code @@ -194,6 +171,6 @@ jobs: - name: Upload Release uses: ncipollo/release-action@v1 with: - artifacts: 'WitchyBND-SHA${{ github.sha }}\WitchyBND-${{ github.ref_name }}.zip' + artifacts: 'WitchyBND-SHA${{ github.sha }}-win-x64\WitchyBND-${{ github.ref_name }}-win-x64.zip,WitchyBND-SHA${{ github.sha }}-linux-x64\WitchyBND-${{ github.ref_name }}-linux-x64.zip' bodyFile: "./NOTES.md" token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/WitchyTests/Tests/RegulationTests.cs b/WitchyTests/Tests/RegulationTests.cs index bbd45eab..256a36e5 100644 --- a/WitchyTests/Tests/RegulationTests.cs +++ b/WitchyTests/Tests/RegulationTests.cs @@ -59,7 +59,7 @@ public void PARAMBND3() // [Category("SkipOnGitHubAction")] public void PARAMBND4() { - IEnumerable paths = GetSamples("PARAMBND4\\Correct"); + IEnumerable paths = GetSamples($"PARAMBND4{Path.DirectorySeparatorChar}Correct"); var parser = ParseMode.GetParser(); @@ -101,7 +101,7 @@ public void PARAMBND4() // [Category("SkipOnGitHubAction")] public void PARAMBND4TooHigh() { - IEnumerable paths = GetSamples("PARAMBND4\\TooHigh"); + IEnumerable paths = GetSamples($"PARAMBND4{Path.DirectorySeparatorChar}TooHigh"); var parser = new WPARAMBND4(); @@ -126,7 +126,7 @@ public void PARAMBND4TooHigh() // [Category("SkipOnGitHubAction")] public void PARAMBND4OutdatedParam() { - IEnumerable paths = GetSamples("PARAMBND4\\OutdatedParam"); + IEnumerable paths = GetSamples($"PARAMBND4{Path.DirectorySeparatorChar}OutdatedParam"); var parser = new WPARAMBND4(); From 083f01f4f31b4137923b20a5dc53b254333abeae Mon Sep 17 00:00:00 2001 From: ividyon <1077140+ividyon@users.noreply.github.com> Date: Mon, 5 Jan 2026 21:11:20 +0100 Subject: [PATCH 06/15] linux bugfix --- WitchyBND/Parsers/Binder/WPARAMBND4.cs | 2 +- WitchyTests/Tests/SpecialBinderTests.cs | 6 +++--- dev/RestorePackageLock.BAT | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 dev/RestorePackageLock.BAT diff --git a/WitchyBND/Parsers/Binder/WPARAMBND4.cs b/WitchyBND/Parsers/Binder/WPARAMBND4.cs index e0b207f4..b32249b4 100644 --- a/WitchyBND/Parsers/Binder/WPARAMBND4.cs +++ b/WitchyBND/Parsers/Binder/WPARAMBND4.cs @@ -183,7 +183,7 @@ public override void Repack(string srcPath, bool recursive) var filePaths = files.Select(file => { var path = file.Element("path"); if (path == null) throw new XmlException($"File element {files.ToList().IndexOf(file)} has no path."); - return path.Value; + return path.Value.Replace('\\', Path.DirectorySeparatorChar); }); foreach (string filePath in filePaths) diff --git a/WitchyTests/Tests/SpecialBinderTests.cs b/WitchyTests/Tests/SpecialBinderTests.cs index b2150043..866ca350 100644 --- a/WitchyTests/Tests/SpecialBinderTests.cs +++ b/WitchyTests/Tests/SpecialBinderTests.cs @@ -67,7 +67,7 @@ public void MATBINBND() foreach (BinderFile file in bnd.Files) { string name = Path.Combine(destPath, - !string.IsNullOrEmpty(root) ? Path.GetRelativePath(root, file.Name) : file.Name); + !string.IsNullOrEmpty(root) ? Path.GetRelativePath(root, file.Name).Replace('\\', Path.DirectorySeparatorChar) : file.Name.Replace('\\', Path.DirectorySeparatorChar)); Assert.That(File.Exists(name)); } @@ -106,7 +106,7 @@ public void MTDBND() foreach (BinderFile file in bnd.Files) { string name = Path.Combine(destPath, - !string.IsNullOrEmpty(root) ? Path.GetRelativePath(root, file.Name) : file.Name); + !string.IsNullOrEmpty(root) ? Path.GetRelativePath(root, file.Name).Replace('\\', Path.DirectorySeparatorChar) : file.Name.Replace('\\', Path.DirectorySeparatorChar)); Assert.That(File.Exists(name)); } @@ -145,7 +145,7 @@ public void ANIBND4() foreach (BinderFile file in bnd.Files) { string name = Path.Combine(destPath, - WBUtil.UnrootBNDPath(file.Name, root)); + WBUtil.UnrootBNDPath(file.Name, root).Replace('\\', Path.DirectorySeparatorChar)); Assert.That(File.Exists(name)); } diff --git a/dev/RestorePackageLock.BAT b/dev/RestorePackageLock.BAT new file mode 100644 index 00000000..8fc7730a --- /dev/null +++ b/dev/RestorePackageLock.BAT @@ -0,0 +1,2 @@ +dotnet restore -f --force-evaluate --no-cache -r linux-x64 --lock-file-path packages.linux-x64.lock.json +dotnet restore -f --force-evaluate --no-cache -r win-x64 --lock-file-path packages.win-x64.lock.json \ No newline at end of file From 2a919073444c66cc366625afea4b32e80792469f Mon Sep 17 00:00:00 2001 From: ividyon <1077140+ividyon@users.noreply.github.com> Date: Mon, 5 Jan 2026 21:47:50 +0100 Subject: [PATCH 07/15] properly move libzstd --- WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs | 3 +-- WitchyBND/WitchyBND.csproj | 15 +++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs b/WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs index d0e143c5..30efc2e9 100644 --- a/WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs +++ b/WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs @@ -22,9 +22,8 @@ public class WFFXBNDModern : WBinderParser public override bool Is(string path, byte[]? data, out ISoulsFile? file) { file = null; - path = path.ToLower(); return Configuration.Active.Bnd && - path.Contains(".ffxbnd") && IsRead(path, data, out file); + path.ToLower().Contains(".ffxbnd") && IsRead(path, data, out file); } public override bool? IsSimple(string path) diff --git a/WitchyBND/WitchyBND.csproj b/WitchyBND/WitchyBND.csproj index 17a2b37a..fee997ff 100644 --- a/WitchyBND/WitchyBND.csproj +++ b/WitchyBND/WitchyBND.csproj @@ -91,17 +91,20 @@ + + + + + - - + + - - - + + - From a0e9e39d17c99dbcd05764b45a8247b221fa5ef9 Mon Sep 17 00:00:00 2001 From: ividyon <1077140+ividyon@users.noreply.github.com> Date: Mon, 5 Jan 2026 21:51:39 +0100 Subject: [PATCH 08/15] witchy tests move --- WitchyTests/WitchyTests.csproj | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/WitchyTests/WitchyTests.csproj b/WitchyTests/WitchyTests.csproj index 419c407b..e0852da1 100644 --- a/WitchyTests/WitchyTests.csproj +++ b/WitchyTests/WitchyTests.csproj @@ -46,4 +46,9 @@ + + + + + From d020f169217c684533df4f9971d1ed71b480ccb7 Mon Sep 17 00:00:00 2001 From: ividyon <1077140+ividyon@users.noreply.github.com> Date: Mon, 5 Jan 2026 22:08:17 +0100 Subject: [PATCH 09/15] some linux fixes --- WitchyBND/Parsers/Binder/Special/WANIBND4.cs | 9 ++++----- WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs | 10 +++++----- WitchyTests/Tests/SpecialBinderTests.cs | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/WitchyBND/Parsers/Binder/Special/WANIBND4.cs b/WitchyBND/Parsers/Binder/Special/WANIBND4.cs index ee14a083..ddc40856 100644 --- a/WitchyBND/Parsers/Binder/Special/WANIBND4.cs +++ b/WitchyBND/Parsers/Binder/Special/WANIBND4.cs @@ -32,9 +32,8 @@ public class WANIBND4 : WBinderParser public override bool Is(string path, byte[]? data, out ISoulsFile? file) { file = null; - path = path.ToLower(); return Configuration.Active.Bnd && - path.Contains(".anibnd") && IsRead(path, data, out file); + path.ToLower().Contains(".anibnd") && IsRead(path, data, out file); } public override bool? IsSimple(string path) @@ -85,8 +84,8 @@ void Callback(BinderFile bndFile) var ext = Path.GetExtension(bndFile.Name); if (!ProcessedExtensions.Contains(ext) || bndFile.ID >= 7000000 && bndFile.ID <= 7999999 || // BB behaviors - (bndFile.Name.EndsWith(".hkx") && bndFile.Name.ToLower().Contains("skeleton")) || - (bndFile.Name.EndsWith(".tae") && Path.GetFileName(bndFile.Name).StartsWith("c")) + (bndFile.Name.ToLower().EndsWith(".hkx") && bndFile.Name.ToLower().Contains("skeleton")) || + (bndFile.Name.ToLower().EndsWith(".tae") && Path.GetFileName(bndFile.Name).ToLower().StartsWith("c")) ) { newFiles.Add(bndFile); @@ -240,7 +239,7 @@ void FileCallback(string ext, string filePath) void ExtensionCallback(string ext) { - var files = Directory.EnumerateFiles(srcPath, $"*{ext}", SearchOption.AllDirectories).ToList(); + var files = Directory.EnumerateFiles(srcPath, "*", SearchOption.AllDirectories).Where(f => Path.GetExtension(f).ToLower() == ext).ToList(); files = files.Where(filePath => { var pathDir = filePath.Substring(srcPath.Length + 1); var binderPath = Path.Combine(root, pathDir); diff --git a/WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs b/WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs index 30efc2e9..32d80267 100644 --- a/WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs +++ b/WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs @@ -68,31 +68,31 @@ public override void Unpack(string srcPath, ISoulsFile? file, bool recursive) var rootPath = rootFile.Name.Substring(0, rootFile.Name.IndexOf("\\sfx\\", StringComparison.Ordinal) + 5); xml.Add(new XElement("root", rootPath)); - var firstEffect = bnd.Files.FirstOrDefault(f => f.Name.EndsWith(".fxr")); + var firstEffect = bnd.Files.FirstOrDefault(f => f.Name.ToLower().EndsWith(".fxr")); var effectDir = firstEffect != null ? new DirectoryInfo(Path.GetDirectoryName(firstEffect.Name)!).Name : "effect"; if (firstEffect != null) xml.Add(new XElement("effectDir", effectDir)); var effectTargetDir = Path.Combine(destDir, effectDir); - var firstTexture = bnd.Files.FirstOrDefault(f => f.Name.EndsWith(".tpf")); + var firstTexture = bnd.Files.FirstOrDefault(f => f.Name.ToLower().EndsWith(".tpf")); var textureDir = firstTexture != null ? new DirectoryInfo(Path.GetDirectoryName(firstTexture.Name)!).Name : "texture"; if (firstTexture != null) xml.Add(new XElement("textureDir", textureDir)); var textureTargetDir = Path.Combine(destDir, textureDir); - var firstModel = bnd.Files.FirstOrDefault(f => f.Name.EndsWith(".flver")); + var firstModel = bnd.Files.FirstOrDefault(f => f.Name.ToLower().EndsWith(".flver")); var modelDir = firstModel != null ? new DirectoryInfo(Path.GetDirectoryName(firstModel.Name)!).Name : "model"; if (firstModel != null) xml.Add(new XElement("modelDir", modelDir)); var modelTargetDir = Path.Combine(destDir, modelDir); - var firstAnim = bnd.Files.FirstOrDefault(f => f.Name.EndsWith(".anibnd")); + var firstAnim = bnd.Files.FirstOrDefault(f => f.Name.ToLower().EndsWith(".anibnd")); var animDir = firstAnim != null ? new DirectoryInfo(Path.GetDirectoryName(firstAnim.Name)!).Name : "animation"; if (firstAnim != null) xml.Add(new XElement("animDir", animDir)); var animTargetDir = Path.Combine(destDir, animDir); - var firstRes = bnd.Files.FirstOrDefault(f => f.Name.EndsWith(".ffxreslist")); + var firstRes = bnd.Files.FirstOrDefault(f => f.Name.ToLower().EndsWith(".ffxreslist")); var resDir = firstRes != null ? new DirectoryInfo(Path.GetDirectoryName(firstRes.Name)!).Name : "resource"; if (firstRes != null) xml.Add(new XElement("resDir", resDir)); var resTargetDir = Path.Combine(destDir, resDir); diff --git a/WitchyTests/Tests/SpecialBinderTests.cs b/WitchyTests/Tests/SpecialBinderTests.cs index 866ca350..2628204e 100644 --- a/WitchyTests/Tests/SpecialBinderTests.cs +++ b/WitchyTests/Tests/SpecialBinderTests.cs @@ -156,7 +156,7 @@ public void ANIBND4() Assert.That(File.Exists(repackDestPath)); var bnd2 = BND4.Read(repackDestPath); var mismatches = bnd.Files.Where(f => - !WBUtil.MorphemeExtensions.Contains(Path.GetExtension(f.Name)) && bnd2.Files.FirstOrDefault(f2 => f.ID == f2.ID && f.Name == f2.Name) == null).ToList(); + !WBUtil.MorphemeExtensions.Contains(Path.GetExtension(f.Name).ToLower()) && bnd2.Files.FirstOrDefault(f2 => f.ID == f2.ID && f.Name.ToLower() == f2.Name.ToLower()) == null).ToList(); Assert.That(mismatches.Count, Is.Zero, $"{Path.GetFileName(path)} has {mismatches.Count} mismatches in ID/Name:\n{string.Join("\n",mismatches.Select(a => { return a.Name; }))}"); From 1019b595c9e1605507cd3ebae82f2d9147075232 Mon Sep 17 00:00:00 2001 From: ividyon <1077140+ividyon@users.noreply.github.com> Date: Mon, 5 Jan 2026 23:57:20 +0100 Subject: [PATCH 10/15] OSPath/BndPath split for saner processing of separator chars --- .../CliModes/ConfigMode/DeferredFormatMode.cs | 4 +- WitchyBND/CliModes/ParseMode.cs | 8 +- WitchyBND/CliModes/WatcherMode.cs | 24 +- WitchyBND/Configuration.cs | 6 +- WitchyBND/DeferredFormats.cs | 10 +- WitchyBND/Parsers/Binder/Special/WANIBND4.cs | 28 +- .../Parsers/Binder/Special/WBND4Unsorted.cs | 2 +- .../Parsers/Binder/Special/WFFXBNDModern.cs | 102 +- WitchyBND/Parsers/Binder/WBND3.cs | 2 +- WitchyBND/Parsers/Binder/WBND4.cs | 2 +- WitchyBND/Parsers/Binder/WBXF3.cs | 18 +- WitchyBND/Parsers/Binder/WBXF4.cs | 18 +- WitchyBND/Parsers/Binder/WPARAMBND3.cs | 4 +- WitchyBND/Parsers/Binder/WPARAMBND4.cs | 31 +- WitchyBND/Parsers/Binder/WTPF.cs | 10 +- WitchyBND/Parsers/Binder/WZERO3.cs | 7 +- .../Folder/WMSB/WMSBE.Folder.Repack.cs | 10 +- .../Folder/WMSB/WMSBE.Folder.Unpack.cs | 180 +-- .../Parsers/Folder/WTAE/WTAE.Folder.Repack.cs | 2 +- .../Parsers/Folder/WTAE/WTAE.Folder.Unpack.cs | 4 +- WitchyBND/Parsers/WBinderParser.cs | 58 +- WitchyBND/Parsers/WDCX.cs | 11 +- WitchyBND/Parsers/WFolderParser.cs | 16 +- WitchyBND/Parsers/WParser.cs | 31 +- WitchyBND/Parsers/XML/Serialized/WAIP.cs | 2 +- WitchyBND/Parsers/XML/Serialized/WENFL.cs | 4 +- WitchyBND/Parsers/XML/Serialized/WFXR1.cs | 2 +- WitchyBND/Parsers/XML/Serialized/WFXR3.cs | 2 +- WitchyBND/Parsers/XML/Serialized/WMATBIN.cs | 4 +- WitchyBND/Parsers/XML/Serialized/WMTD.cs | 2 +- WitchyBND/Parsers/XML/WDBSUB.cs | 4 +- WitchyBND/Parsers/XML/WFMG.cs | 2 +- WitchyBND/Parsers/XML/WLUAGNL.cs | 2 +- WitchyBND/Parsers/XML/WLUAINFO.cs | 2 +- WitchyBND/Parsers/XML/WMQB/WMQB.Unpack.cs | 2 +- WitchyBND/Parsers/XML/WPARAM/WPARAM.Unpack.cs | 2 +- WitchyBND/Parsers/XML/WPARAM/WPARAM.cs | 2 +- .../Parsers/XML/WTAE/WTAE.File.Unpack.cs | 2 +- WitchyBND/ProcessHandling.cs | 4 +- WitchyBND/Program.cs | 4 +- WitchyBND/SendTo.cs | 27 +- WitchyBND/Services/GameService.cs | 18 +- WitchyBND/Services/UpdateService.cs | 8 +- WitchyLib/CrossPlatform.cs | 1088 +++++++++++++++++ WitchyLib/Extensions.cs | 17 + WitchyLib/WBUtil.cs | 175 --- WitchyLib/WitchyLib.csproj | 1 + WitchyTests/TestBase.cs | 14 +- WitchyTests/Tests/SpecialBinderTests.cs | 16 +- WitchyTests/WitchyTests.csproj | 4 +- 50 files changed, 1475 insertions(+), 523 deletions(-) create mode 100644 WitchyLib/CrossPlatform.cs diff --git a/WitchyBND/CliModes/ConfigMode/DeferredFormatMode.cs b/WitchyBND/CliModes/ConfigMode/DeferredFormatMode.cs index 1143e85b..25f03bf6 100644 --- a/WitchyBND/CliModes/ConfigMode/DeferredFormatMode.cs +++ b/WitchyBND/CliModes/ConfigMode/DeferredFormatMode.cs @@ -91,7 +91,7 @@ public static void Run(CliOptions opt) break; case "Default": Configuration.Stored.DeferTools[format] = - new DeferConfig(Path.GetFileNameWithoutExtension(openDialog.Path), openDialog.Path, "$name", null); + new DeferConfig(OSPath.GetFileNameWithoutExtension(openDialog.Path), openDialog.Path, "$name", null); break; default: var myArgs = defArgs!.First(a => a.Name == argsVal.Content); @@ -145,7 +145,7 @@ public static void Run(CliOptions opt) } Configuration.Stored.DeferTools[format] = new DeferConfig( - Path.GetFileNameWithoutExtension(openDialog.Path), openDialog.Path, unpackArgsInput.Content, + OSPath.GetFileNameWithoutExtension(openDialog.Path), openDialog.Path, unpackArgsInput.Content, repackArgs); if (breakOut) continue; diff --git a/WitchyBND/CliModes/ParseMode.cs b/WitchyBND/CliModes/ParseMode.cs index e2ff8b5e..f699a214 100644 --- a/WitchyBND/CliModes/ParseMode.cs +++ b/WitchyBND/CliModes/ParseMode.cs @@ -82,7 +82,7 @@ internal static void CliParseMode(CliOptions opt) { var paths = opt.Paths.ToList(); - paths = WBUtil.ProcessPathGlobs(paths).ToList(); + paths = OSPath.ProcessPathGlobs(paths).ToList(); ParseFiles(paths, false); } @@ -198,7 +198,7 @@ public static void PrintParseSuccess(string path, bool parsed, bool error, bool case true: if (Configuration.Active.Parallel) { - string fileName = Path.GetFileName(path); + string fileName = OSPath.GetFileName(path); if (recursive) output.WriteLine($"Successfully parsed {fileName.PromptPlusEscape()} (recursive)."); else @@ -219,7 +219,7 @@ public static void PrintParseSuccess(string path, bool parsed, bool error, bool public static void Unpack(string path, ISoulsFile? file, DCX.CompressionInfo compression, WFileParser? parser, bool recursive) { - string fileName = Path.GetFileName(path); + string fileName = OSPath.GetFileName(path); if (compression.Type > file?.Compression.Type) file.Compression = compression; @@ -246,7 +246,7 @@ public static void Unpack(string path, ISoulsFile? file, DCX.CompressionInfo com public static void Repack(string path, WFileParser parser, bool recursive) { - string fileName = Path.GetFileName(path); + string fileName = OSPath.GetFileName(path); switch (parser.Verb) { diff --git a/WitchyBND/CliModes/WatcherMode.cs b/WitchyBND/CliModes/WatcherMode.cs index 05ee79f8..7b783cb9 100644 --- a/WitchyBND/CliModes/WatcherMode.cs +++ b/WitchyBND/CliModes/WatcherMode.cs @@ -69,7 +69,7 @@ public WatchedFileUnpack(string path, FileSystemWatcher watcher, WFileParser par internal static void CliWatcherMode(CliOptions opt) { var paths = opt.Paths.ToList(); - paths = WBUtil.ProcessPathGlobs(paths); + paths = OSPath.ProcessPathGlobs(paths); WatchFiles(paths); } @@ -93,7 +93,7 @@ public static void WatchFiles(List paths) } } - output.WriteError($"No valid unpacking parser found for {Path.GetFileName(p)}." + output.WriteError($"No valid unpacking parser found for {OSPath.GetFileName(p)}." .PromptPlusEscape()); }); @@ -119,14 +119,14 @@ public static void WatchFiles(List paths) ParseMode.PrintParseSuccess(path, parsed, error, false); var watcher = new FileSystemWatcher(); - watcher.Path = Path.GetDirectoryName(Path.GetFullPath(path))!; - watcher.Filter = Path.GetFileName(path); + watcher.Path = OSPath.GetDirectoryName(OSPath.GetFullPath(path))!; + watcher.Filter = OSPath.GetFileName(path); watcher.NotifyFilter = NotifyFilters.LastWrite; watcher.Changed += WatchUnpack; watcher.Deleted += WatchRemoval; watcher.Renamed += WatchRemoval; - string fullPath = Path.Combine(watcher.Path, watcher.Filter); + string fullPath = OSPath.Combine(watcher.Path, watcher.Filter); output.WriteLine($"Watching path \"{fullPath}\" for unpacking...".PromptPlusEscape()); _watchedFiles.TryAdd(fullPath, new WatchedFileUnpack(fullPath, watcher, parser, file)); @@ -143,14 +143,14 @@ public static void WatchFiles(List paths) ParseMode.PrintParseSuccess(path, parsed, error, false); var watcher = new FileSystemWatcher(); - watcher.Path = Path.GetDirectoryName(Path.GetFullPath(path))!; - watcher.Filter = Path.GetFileName(path); + watcher.Path = OSPath.GetDirectoryName(OSPath.GetFullPath(path))!; + watcher.Filter = OSPath.GetFileName(path); watcher.NotifyFilter = NotifyFilters.LastWrite; watcher.Changed += WatchRepack; watcher.Deleted += WatchRemoval; watcher.Renamed += WatchRemoval; - string fullPath = Path.Combine(watcher.Path, watcher.Filter); + string fullPath = OSPath.Combine(watcher.Path, watcher.Filter); output.WriteLine($"Watching path \"{fullPath}\" for repacking...".PromptPlusEscape()); _watchedFiles.TryAdd(fullPath, new WatchedFile(fullPath, watcher, parser)); @@ -163,9 +163,9 @@ public static void WatchFiles(List paths) XElement xml = WFileParser.LoadXml(folderParser!.GetFolderXmlPath(path)); XElement? filesEl = xml.Element("files"); if (filesEl == null) continue; - var files = WFolderParser.GetFolderFilePaths(filesEl, path).Select(p => Path.GetFullPath(p)).ToList(); + var files = WFolderParser.GetFolderFilePaths(filesEl, path).Select(p => OSPath.GetFullPath(p)).ToList(); var watcher = new FileSystemWatcher(); - watcher.Path = Path.GetFullPath(path); + watcher.Path = OSPath.GetFullPath(path); watcher.Filter = "*.*"; watcher.IncludeSubdirectories = true; watcher.NotifyFilter = NotifyFilters.LastWrite; @@ -190,7 +190,7 @@ public static void WatchFiles(List paths) private static void WatchRemoval(object sender, FileSystemEventArgs e) { output.WriteLine( - $"Path {Path.GetFileName(e.Name)} was renamed or deleted, aborting watch.".PromptPlusEscape()); + $"Path {OSPath.GetFileName(e.Name)} was renamed or deleted, aborting watch.".PromptPlusEscape()); _watchedFiles[e.FullPath].Watcher.EnableRaisingEvents = false; _watchedFiles.Remove(e.FullPath); } @@ -239,7 +239,7 @@ private static void WatchFolder(object sender, FileSystemEventArgs e) return; file.LastChange = DateTime.Now; // In case of exceptions Thread.Sleep(ProcessDelay); - output.WriteLine($"[{DateTime.Now:T}] Detected change in {e.FullPath.Replace(Path.GetDirectoryName(file.Path) + "\\", "")}." + output.WriteLine($"[{DateTime.Now:T}] Detected change in {e.FullPath.Replace(OSPath.GetDirectoryName(file.Path) + Path.DirectorySeparatorChar, "")}." .PromptPlusEscape()); bool parsed = errorService.Catch(() => { ParseMode.Repack(file.Path, file.Parser, false); diff --git a/WitchyBND/Configuration.cs b/WitchyBND/Configuration.cs index 64cfef38..df8a5278 100644 --- a/WitchyBND/Configuration.cs +++ b/WitchyBND/Configuration.cs @@ -121,7 +121,7 @@ public class ActiveConfig : IStoredConfig, ITempConfig public static StoredConfig Default; public static ActiveConfig Active; - public static string AppDataDirectory => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "WitchyBND"); + public static string AppDataDirectory => OSPath.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "WitchyBND"); public static OSPlatform Platform { get; set; } public static bool ParamDefaultValues => Active.ParamDefaultValueThreshold > 0f; @@ -150,7 +150,7 @@ public static void LoadConfiguration() { var builder = new ConfigurationBuilder(); bool breakOut = false; - string userSettingsPath = Path.Combine(AppDataDirectory, "appsettings.user.json"); + string userSettingsPath = OSPath.Combine(AppDataDirectory, "appsettings.user.json"); string defaultSettingsPath = WBUtil.GetExeLocation("appsettings.json"); string debugSettingsPath = WBUtil.GetExeLocation("appsettings.debug.json"); string overrideSettingsPath = WBUtil.GetExeLocation("appsettings.override.json"); @@ -198,7 +198,7 @@ public static void SaveConfiguration() if (IsDebug || IsTest) File.WriteAllText(WBUtil.GetExeLocation("appsettings.debug.json"), newStored); else - File.WriteAllText(Path.Combine(AppDataDirectory, "appsettings.user.json"), newStored); + File.WriteAllText(OSPath.Combine(AppDataDirectory, "appsettings.user.json"), newStored); } public static void ActivateStoredConfiguration(StoredConfig? stored = null) diff --git a/WitchyBND/DeferredFormats.cs b/WitchyBND/DeferredFormats.cs index 22760d90..e3131920 100644 --- a/WitchyBND/DeferredFormats.cs +++ b/WitchyBND/DeferredFormats.cs @@ -91,9 +91,9 @@ static DeferredFormatHandling() public static string BuildArgs(string args, string srcPath) { - var dirname = Path.GetDirectoryName(srcPath); - var filename = WBUtil.GetFileNameWithoutAnyExtensions(srcPath); - var fileext = WBUtil.GetFullExtensions(srcPath); + var dirname = OSPath.GetDirectoryName(srcPath); + var filename = OSPath.GetFileNameWithoutAnyExtensions(srcPath); + var fileext = OSPath.GetFullExtensions(srcPath); return args .Replace("$dirname", dirname) .Replace("$filename", filename) @@ -107,7 +107,7 @@ public static void Unpack(DeferFormat format, string srcPath) output.WriteLine($"Running deferred tool: \"{conf.Path} {args}\""); var process = ProcessHandling.RunProcess(conf.Path, out var text, - out var error, args, Path.GetDirectoryName(srcPath)); + out var error, args, OSPath.GetDirectoryName(srcPath)); output.WriteLine(text); if (process != 0) @@ -124,7 +124,7 @@ public static void Repack(DeferFormat format, string srcPath) output.WriteLine($"Running deferred tool: \"{conf.Path} {args}\""); var process = ProcessHandling.RunProcess(conf.Path, out var text, - out var error, args, Path.GetDirectoryName(srcPath)); + out var error, args, OSPath.GetDirectoryName(srcPath)); output.WriteLine(text); if (process != 0) diff --git a/WitchyBND/Parsers/Binder/Special/WANIBND4.cs b/WitchyBND/Parsers/Binder/Special/WANIBND4.cs index ddc40856..3b311df4 100644 --- a/WitchyBND/Parsers/Binder/Special/WANIBND4.cs +++ b/WitchyBND/Parsers/Binder/Special/WANIBND4.cs @@ -55,7 +55,7 @@ public override void Unpack(string srcPath, ISoulsFile? file, bool recursive) var root = ""; if (Binder.HasNames(bnd.Format)) { - root = WBUtil.FindCommonBndRootPath(bnd.Files.Select(bndFile => bndFile.Name)); + root = BndPath.FindCommonBndRootPath(bnd.Files.Select(bndFile => bndFile.Name)); } var xml = PrepareXmlManifest(srcPath, recursive, false, bnd.Compression, out XDocument xDoc, root); @@ -81,11 +81,11 @@ public override void Unpack(string srcPath, ISoulsFile? file, bool recursive) void Callback(BinderFile bndFile) { - var ext = Path.GetExtension(bndFile.Name); + var ext = BndPath.GetExtension(bndFile.Name).ToLower(); if (!ProcessedExtensions.Contains(ext) || bndFile.ID >= 7000000 && bndFile.ID <= 7999999 || // BB behaviors (bndFile.Name.ToLower().EndsWith(".hkx") && bndFile.Name.ToLower().Contains("skeleton")) || - (bndFile.Name.ToLower().EndsWith(".tae") && Path.GetFileName(bndFile.Name).ToLower().StartsWith("c")) + (bndFile.Name.ToLower().EndsWith(".tae") && BndPath.GetFileName(bndFile.Name).ToLower().StartsWith("c")) ) { newFiles.Add(bndFile); @@ -93,11 +93,11 @@ void Callback(BinderFile bndFile) } byte[] bytes = bndFile.Bytes; - var path = WBUtil.UnrootBNDPath(bndFile.Name, root); - path = path.Replace('\\', Path.DirectorySeparatorChar); - var destPath = Path.Combine(destDir, path); - if (!Directory.Exists(Path.GetDirectoryName(destPath))) - Directory.CreateDirectory(Path.GetDirectoryName(destPath)!); + var path = BndPath.Unroot(bndFile.Name, root); + path = path.ToOSPath(); + var destPath = OSPath.Combine(destDir, path); + if (!Directory.Exists(OSPath.GetDirectoryName(destPath))) + Directory.CreateDirectory(OSPath.GetDirectoryName(destPath)!); File.WriteAllBytes(destPath, bytes); resultingPaths.Push(destPath); } @@ -143,7 +143,7 @@ public override void Repack(string srcPath, bool recursive) if (filesElement != null) ReadBinderFiles(bnd, filesElement, srcPath, root, recursive); var pathsToSkip = filesElement != null - ? filesElement.Elements("file").Select(file => Path.Combine(root, file.Element("path")!.Value)).ToList() + ? filesElement.Elements("file").Select(file => BndPath.Combine(root, file.Element("path")!.Value)).ToList() : new List(); ConcurrentBag fileBag = new(); @@ -151,10 +151,10 @@ public override void Repack(string srcPath, bool recursive) void FileCallback(string ext, string filePath) { var pathDir = filePath.Substring(srcPath.Length + 1); - var binderPath = Path.Combine(root, pathDir); + var binderPath = BndPath.Combine(root, pathDir.ToBndPath()); RecursiveRepackFile(filePath, recursive); - string fileName = Path.GetFileNameWithoutExtension(filePath); + string fileName = OSPath.GetFileNameWithoutExtension(filePath); var regex = Regex.Match(pathDir.ToLower(), "c[1-9][0-9][0-9][0-9]"); bool isEnemy = regex.Success; bool isPlayer = pathDir.ToLower().Contains("c0000"); @@ -239,13 +239,13 @@ void FileCallback(string ext, string filePath) void ExtensionCallback(string ext) { - var files = Directory.EnumerateFiles(srcPath, "*", SearchOption.AllDirectories).Where(f => Path.GetExtension(f).ToLower() == ext).ToList(); + var files = Directory.EnumerateFiles(srcPath, "*", SearchOption.AllDirectories).Where(f => OSPath.GetExtension(f).ToLower() == ext).ToList(); files = files.Where(filePath => { var pathDir = filePath.Substring(srcPath.Length + 1); - var binderPath = Path.Combine(root, pathDir); + var binderPath = BndPath.Combine(root, pathDir.ToBndPath()); return !pathsToSkip.Contains(binderPath); }).ToList(); - var dupes = files.GroupBy(f => Path.GetFileName(f)).Where(g => g.Count() > 1).ToList(); + var dupes = files.GroupBy(f => OSPath.GetFileName(f).ToLower()).Where(g => g.Count() > 1).ToList(); if (dupes.Any()) { throw new DuplicateNameException(@$"Found the following duplicate files across different folders: diff --git a/WitchyBND/Parsers/Binder/Special/WBND4Unsorted.cs b/WitchyBND/Parsers/Binder/Special/WBND4Unsorted.cs index 6942331d..d8b4439c 100644 --- a/WitchyBND/Parsers/Binder/Special/WBND4Unsorted.cs +++ b/WitchyBND/Parsers/Binder/Special/WBND4Unsorted.cs @@ -29,7 +29,7 @@ public override void Unpack(string srcPath, ISoulsFile? file, bool recursive) var root = ""; if (Binder.HasNames(bnd.Format)) { - root = WBUtil.FindCommonBndRootPath(bnd.Files.Select(bndFile => bndFile.Name)); + root = BndPath.FindCommonBndRootPath(bnd.Files.Select(bndFile => bndFile.Name)); } WriteBinderFiles(bnd, destDir, root); diff --git a/WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs b/WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs index 32d80267..299f5245 100644 --- a/WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs +++ b/WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs @@ -28,7 +28,7 @@ public override bool Is(string path, byte[]? data, out ISoulsFile? file) public override bool? IsSimple(string path) { - string filename = Path.GetFileName(path).ToLower(); + string filename = OSPath.GetFileName(path).ToLower(); return filename.EndsWith(".ffxbnd") || filename.EndsWith(".ffxbnd.dcx"); } @@ -70,32 +70,38 @@ public override void Unpack(string srcPath, ISoulsFile? file, bool recursive) var firstEffect = bnd.Files.FirstOrDefault(f => f.Name.ToLower().EndsWith(".fxr")); var effectDir = firstEffect != null - ? new DirectoryInfo(Path.GetDirectoryName(firstEffect.Name)!).Name + ? BndPath.GetFileName(BndPath.GetDirectoryName(firstEffect.Name)) : "effect"; if (firstEffect != null) xml.Add(new XElement("effectDir", effectDir)); - var effectTargetDir = Path.Combine(destDir, effectDir); + var effectTargetDir = OSPath.Combine(destDir, effectDir.ToOSPath()); var firstTexture = bnd.Files.FirstOrDefault(f => f.Name.ToLower().EndsWith(".tpf")); var textureDir = firstTexture != null - ? new DirectoryInfo(Path.GetDirectoryName(firstTexture.Name)!).Name + ? BndPath.GetFileName(BndPath.GetDirectoryName(firstTexture.Name)) : "texture"; if (firstTexture != null) xml.Add(new XElement("textureDir", textureDir)); - var textureTargetDir = Path.Combine(destDir, textureDir); + var textureTargetDir = OSPath.Combine(destDir, textureDir.ToOSPath()); var firstModel = bnd.Files.FirstOrDefault(f => f.Name.ToLower().EndsWith(".flver")); - var modelDir = firstModel != null ? new DirectoryInfo(Path.GetDirectoryName(firstModel.Name)!).Name : "model"; + var modelDir = firstModel != null ? + BndPath.GetFileName(BndPath.GetDirectoryName(firstModel.Name)) + : "model"; if (firstModel != null) xml.Add(new XElement("modelDir", modelDir)); - var modelTargetDir = Path.Combine(destDir, modelDir); + var modelTargetDir = OSPath.Combine(destDir, modelDir.ToOSPath()); var firstAnim = bnd.Files.FirstOrDefault(f => f.Name.ToLower().EndsWith(".anibnd")); - var animDir = firstAnim != null ? new DirectoryInfo(Path.GetDirectoryName(firstAnim.Name)!).Name : "animation"; + var animDir = firstAnim != null + ? BndPath.GetFileName(BndPath.GetDirectoryName(firstAnim.Name)) + : "animation"; if (firstAnim != null) xml.Add(new XElement("animDir", animDir)); - var animTargetDir = Path.Combine(destDir, animDir); + var animTargetDir = OSPath.Combine(destDir, animDir.ToOSPath()); var firstRes = bnd.Files.FirstOrDefault(f => f.Name.ToLower().EndsWith(".ffxreslist")); - var resDir = firstRes != null ? new DirectoryInfo(Path.GetDirectoryName(firstRes.Name)!).Name : "resource"; + var resDir = firstRes != null + ? BndPath.GetFileName(BndPath.GetDirectoryName(firstRes.Name)) + : "resource"; if (firstRes != null) xml.Add(new XElement("resDir", resDir)); - var resTargetDir = Path.Combine(destDir, resDir); + var resTargetDir = OSPath.Combine(destDir, resDir.ToOSPath()); if (firstTexture != null) { @@ -109,8 +115,8 @@ void Callback(BinderFile bndFile) { byte[] bytes = bndFile.Bytes; string fileTargetDir; - string fileTargetName = Path.GetFileName(bndFile.Name); - switch (Path.GetExtension(bndFile.Name)) + string fileTargetName = BndPath.GetFileName(bndFile.Name); + switch (BndPath.GetExtension(fileTargetName)) { case ".fxr": fileTargetDir = effectTargetDir; @@ -118,7 +124,7 @@ void Callback(BinderFile bndFile) case ".tpf": var tpf = TPF.Read(bytes); bytes = tpf.Textures[0].Headerize(); - fileTargetName = $"{Path.GetFileName(tpf.Textures[0].Name)}.dds"; + fileTargetName = $"{BndPath.GetFileName(tpf.Textures[0].Name)}.dds"; fileTargetDir = textureTargetDir; break; case ".flver": @@ -131,13 +137,13 @@ void Callback(BinderFile bndFile) fileTargetDir = resTargetDir; break; default: - fileTargetDir = Path.Combine(destDir, "other"); + fileTargetDir = OSPath.Combine(destDir, "other"); break; } if (!Directory.Exists(fileTargetDir)) Directory.CreateDirectory(fileTargetDir); - File.WriteAllBytes(Path.Combine(fileTargetDir, fileTargetName), bytes); + File.WriteAllBytes(OSPath.Combine(fileTargetDir, fileTargetName.ToOSPath()), bytes); } if (Configuration.Active.Parallel) @@ -169,21 +175,21 @@ public override void Repack(string srcPath, bool recursive) XElement? resDirElement = xml.Element("resDir"); - List effectPaths = Directory.GetFiles(srcPath, "*.fxr", SearchOption.AllDirectories) - .OrderBy(Path.GetFileName).ToList(); - List texturePaths = Directory.GetFiles(srcPath, "*.dds", SearchOption.AllDirectories) - .OrderBy(Path.GetFileName).ToList(); - List modelPaths = Directory.GetFiles(srcPath, "*.flver", SearchOption.AllDirectories) - .OrderBy(Path.GetFileName).ToList(); - List animPaths = Directory.GetFiles(srcPath, "*.anibnd", SearchOption.AllDirectories) - .OrderBy(Path.GetFileName).ToList(); - List resPaths = Directory.GetFiles(srcPath, "*.ffxreslist", SearchOption.AllDirectories) - .OrderBy(Path.GetFileName).ToList(); + List effectPaths = Directory.GetFiles(srcPath, "*.fxr;*.FXR", SearchOption.AllDirectories) + .OrderBy(OSPath.GetFileName).ToList(); + List texturePaths = Directory.GetFiles(srcPath, "*.dds;*.DDS", SearchOption.AllDirectories) + .OrderBy(OSPath.GetFileName).ToList(); + List modelPaths = Directory.GetFiles(srcPath, "*.flver;*.FLVER", SearchOption.AllDirectories) + .OrderBy(OSPath.GetFileName).ToList(); + List animPaths = Directory.GetFiles(srcPath, "*.anibnd;*.ANIBND", SearchOption.AllDirectories) + .OrderBy(OSPath.GetFileName).ToList(); + List resPaths = Directory.GetFiles(srcPath, "*.ffxreslist;*.FFXRESLIST", SearchOption.AllDirectories) + .OrderBy(OSPath.GetFileName).ToList(); // Sanity check duplicate file names bool duplicateCallback(List files) { - var duplicates = files.GroupBy(f => Path.GetFileName(f)).Where(g => g.Count() > 1).ToList(); + var duplicates = files.GroupBy(f => OSPath.GetFileName(f).ToLower()).Where(g => g.Count() > 1).ToList(); if (duplicates.Any()) { var duplicateNames = duplicates.SelectMany(f => f).Select(f => $"- {f.Substring(srcPath.Length)}").ToList(); @@ -209,8 +215,8 @@ bool duplicateCallback(List files) { if (effectPaths.Count > 0) { - var effectNames = new SortedSet(effectPaths.Select(p => Path.GetFileNameWithoutExtension(p))); - var resNames = new SortedSet(resPaths.Select(p => Path.GetFileNameWithoutExtension(p))); + var effectNames = new SortedSet(effectPaths.Select(p => OSPath.GetFileNameWithoutExtension(p))); + var resNames = new SortedSet(resPaths.Select(p => OSPath.GetFileNameWithoutExtension(p))); if (!effectNames.SetEquals(resNames)) { missingReslists = effectNames.Except(resNames).ToList(); @@ -246,7 +252,7 @@ void effectCallback() if (!effectPaths.Any()) return; string dir = xml.Element("effectDir")?.Value ?? ""; - string basePath = Path.Combine(rootPath, dir); + string basePath = BndPath.Combine(rootPath, dir); if (Configuration.Active.Parallel) Parallel.ForEach(effectPaths, inEffectCallback); @@ -259,10 +265,10 @@ void inEffectCallback(string path) var i = effectPaths!.IndexOf(path); var filePath = effectPaths[i]; - var fileName = Path.GetFileName(filePath); + var fileName = OSPath.GetFileName(filePath); RecursiveRepackFile(filePath, recursive, effectParser); var bytes = File.ReadAllBytes(filePath); - var file = new BinderFile(Binder.FileFlags.Flag1, i, Path.Combine(basePath, fileName), + var file = new BinderFile(Binder.FileFlags.Flag1, i, BndPath.Combine(basePath, fileName), bytes); bag.Add(file); } @@ -273,7 +279,7 @@ void textureCallback() if (!texturePaths.Any()) return; string dir = xml.Element("textureDir")?.Value ?? ""; - string basePath = Path.Combine(rootPath, dir); + string basePath = BndPath.Combine(rootPath, dir); if (Configuration.Active.Parallel) Parallel.ForEach(texturePaths, inTextureCallback); @@ -286,7 +292,7 @@ void inTextureCallback(string path) var i = texturePaths!.IndexOf(path); var filePath = texturePaths[i]; - var fileName = Path.GetFileName(filePath); + var fileName = OSPath.GetFileName(filePath); var bytes = File.ReadAllBytes(filePath); var tpf = new TPF(); @@ -296,7 +302,7 @@ void inTextureCallback(string path) tpf.Platform = platform; var tex = new TPF.Texture(); - tex.Name = Path.GetFileNameWithoutExtension(fileName).Trim(); + tex.Name = OSPath.GetFileNameWithoutExtension(fileName).Trim(); tex.Format = 0; if (fileName.ToLower().EndsWith("_m")) { @@ -314,7 +320,7 @@ void inTextureCallback(string path) bytes = tpf.Write(); var file = new BinderFile(Binder.FileFlags.Flag1, 100000 + i, - Path.Combine(basePath, Path.ChangeExtension(fileName, "tpf")), + BndPath.Combine(basePath, BndPath.ChangeExtension(fileName, "tpf")), bytes); bag.Add(file); } @@ -325,7 +331,7 @@ void modelCallback() if (!modelPaths.Any()) return; string dir = xml.Element("modelDir")?.Value ?? ""; - string basePath = Path.Combine(rootPath, dir); + string basePath = BndPath.Combine(rootPath, dir); if (Configuration.Active.Parallel) Parallel.ForEach(modelPaths, inModelCallback); @@ -338,9 +344,9 @@ void inModelCallback(string path) var i = modelPaths!.IndexOf(path); var filePath = modelPaths[i]; - var fileName = Path.GetFileName(filePath); + var fileName = OSPath.GetFileName(filePath); var bytes = File.ReadAllBytes(filePath); - var file = new BinderFile(Binder.FileFlags.Flag1, 200000 + i, Path.Combine(basePath, fileName), + var file = new BinderFile(Binder.FileFlags.Flag1, 200000 + i, BndPath.Combine(basePath, fileName), bytes); bag.Add(file); } @@ -351,7 +357,7 @@ void animCallback() if (!animPaths.Any()) return; string dir = xml.Element("animDir")?.Value ?? ""; - string basePath = Path.Combine(rootPath, dir); + string basePath = BndPath.Combine(rootPath, dir); if (Configuration.Active.Parallel) Parallel.ForEach(animPaths, inAnimCallback); @@ -364,9 +370,9 @@ void inAnimCallback(string path) var i = animPaths!.IndexOf(path); var filePath = animPaths[i]; - var fileName = Path.GetFileName(filePath); + var fileName = OSPath.GetFileName(filePath); var bytes = File.ReadAllBytes(filePath); - var file = new BinderFile(Binder.FileFlags.Flag1, 300000 + i, Path.Combine(basePath, fileName), + var file = new BinderFile(Binder.FileFlags.Flag1, 300000 + i, BndPath.Combine(basePath, fileName), bytes); bag.Add(file); } @@ -377,7 +383,7 @@ void resCallback() if (!resPaths.Any()) return; string dir = xml.Element("resDir")?.Value ?? "ResourceList"; - string basePath = Path.Combine(rootPath, dir); + string basePath = BndPath.Combine(rootPath, dir); if (Configuration.Active.Parallel) Parallel.ForEach(resPaths, inResCallback); @@ -387,7 +393,7 @@ void resCallback() void inResCallback(string path) { - var name = Path.GetFileNameWithoutExtension(path); + var name = OSPath.GetFileNameWithoutExtension(path); var i = effectPaths.IndexOf(effectPaths.FirstOrDefault(a => a.Contains(name))); if (i == -1) { @@ -395,9 +401,9 @@ void inResCallback(string path) return; } - var fileName = Path.GetFileName(path); + var fileName = OSPath.GetFileName(path); var bytes = File.ReadAllBytes(path); - var file = new BinderFile(Binder.FileFlags.Flag1, 400000 + i, Path.Combine(basePath, fileName), + var file = new BinderFile(Binder.FileFlags.Flag1, 400000 + i, BndPath.Combine(basePath, fileName), bytes); bag.Add(file); } @@ -408,7 +414,7 @@ void missingResCallback() if (resDirElement == null || !missingReslists.Any()) return; string dir = resDirElement.Value; - string basePath = Path.Combine(rootPath, dir); + string basePath = BndPath.Combine(rootPath, dir); if (Configuration.Active.Parallel) Parallel.ForEach(missingReslists, inMissingResCallback); @@ -421,7 +427,7 @@ void inMissingResCallback(string effectName) var fileName = $"{effectName}.ffxreslist"; var effect = effectPaths.First(f => f.ToLower().EndsWith($"{effectName.ToLower()}.fxr")); var file = new BinderFile(Binder.FileFlags.Flag1, 400000 + effectPaths.IndexOf(effect), - Path.Combine(basePath, fileName), "\n"u8.ToArray()); + BndPath.Combine(basePath, fileName), "\n"u8.ToArray()); bag.Add(file); } } diff --git a/WitchyBND/Parsers/Binder/WBND3.cs b/WitchyBND/Parsers/Binder/WBND3.cs index cbf8d87d..a3b037e1 100644 --- a/WitchyBND/Parsers/Binder/WBND3.cs +++ b/WitchyBND/Parsers/Binder/WBND3.cs @@ -36,7 +36,7 @@ public void Unpack(string srcPath, ISoulsFile? file, bool recursive, WBUtil.Game var root = ""; if (Binder.HasNames(bnd.Format)) { - root = WBUtil.FindCommonBndRootPath(bnd.Files.Select(bndFile => bndFile.Name)); + root = BndPath.FindCommonBndRootPath(bnd.Files.Select(bndFile => bndFile.Name)); } XElement files = WriteBinderFiles(bnd, destDir, root); diff --git a/WitchyBND/Parsers/Binder/WBND4.cs b/WitchyBND/Parsers/Binder/WBND4.cs index 6e488c16..a3d1ae42 100644 --- a/WitchyBND/Parsers/Binder/WBND4.cs +++ b/WitchyBND/Parsers/Binder/WBND4.cs @@ -35,7 +35,7 @@ public void Unpack(string srcPath, ISoulsFile? file, bool recursive, WBUtil.Game var root = ""; if (Binder.HasNames(bnd.Format)) { - root = WBUtil.FindCommonBndRootPath(bnd.Files.Select(bndFile => bndFile.Name)); + root = BndPath.FindCommonBndRootPath(bnd.Files.Select(bndFile => bndFile.Name)); } XElement files = WriteBinderFiles(bnd, destDir, root); diff --git a/WitchyBND/Parsers/Binder/WBXF3.cs b/WitchyBND/Parsers/Binder/WBXF3.cs index 81c8020b..b99e1a69 100644 --- a/WitchyBND/Parsers/Binder/WBXF3.cs +++ b/WitchyBND/Parsers/Binder/WBXF3.cs @@ -28,27 +28,27 @@ public override void Unpack(string srcPath, ISoulsFile? _, bool recursive) string bdtName; string bhdPath; string bhdName; - string srcDirPath = Path.GetDirectoryName(srcPath); - string nameWithoutExt = Path.GetFileNameWithoutExtension(srcPath); + string srcDirPath = OSPath.GetDirectoryName(srcPath)!; + string nameWithoutExt = OSPath.GetFileNameWithoutExtension(srcPath); string destDir = GetUnpackDestPath(srcPath, recursive); if (BXF3.IsHeader(srcPath)) { bhdPath = srcPath; - bhdName = Path.GetFileName(srcPath); + bhdName = OSPath.GetFileName(srcPath); - string bdtExtension = Path.GetExtension(srcPath).Replace("bhd", "bdt"); + string bdtExtension = OSPath.GetExtension(srcPath).Replace("bhd", "bdt"); bdtName = $"{nameWithoutExt}{bdtExtension}"; - bdtPath = Path.Combine(srcDirPath, bdtName); + bdtPath = OSPath.Combine(srcDirPath, bdtName); } else { bdtPath = srcPath; - bdtName = Path.GetFileName(srcPath); + bdtName = OSPath.GetFileName(srcPath); - string bhdExtension = Path.GetExtension(srcPath).Replace("bdt", "bhd"); + string bhdExtension = OSPath.GetExtension(srcPath).Replace("bdt", "bhd"); bhdName = $"{nameWithoutExt}{bhdExtension}"; - bhdPath = Path.Combine(srcDirPath, bhdName); + bhdPath = OSPath.Combine(srcDirPath, bhdName); } var bxf = BXF3.Read(bhdPath, bdtPath); @@ -57,7 +57,7 @@ public override void Unpack(string srcPath, ISoulsFile? _, bool recursive) var root = ""; if (Binder.HasNames(bxf.Format)) { - root = WBUtil.FindCommonBndRootPath(bxf.Files.Select(bxfFile => bxfFile.Name)); + root = BndPath.FindCommonBndRootPath(bxf.Files.Select(bxfFile => bxfFile.Name)); } XElement files = WriteBinderFiles(bxf, destDir, root); diff --git a/WitchyBND/Parsers/Binder/WBXF4.cs b/WitchyBND/Parsers/Binder/WBXF4.cs index 32b48185..d6c323fc 100644 --- a/WitchyBND/Parsers/Binder/WBXF4.cs +++ b/WitchyBND/Parsers/Binder/WBXF4.cs @@ -28,27 +28,27 @@ public override void Unpack(string srcPath, ISoulsFile? _, bool recursive) string bdtName; string bhdPath; string bhdName; - string srcDirPath = Path.GetDirectoryName(srcPath); - string nameWithoutExt = Path.GetFileNameWithoutExtension(srcPath); + string srcDirPath = OSPath.GetDirectoryName(srcPath)!; + string nameWithoutExt = OSPath.GetFileNameWithoutExtension(srcPath); string destDir = GetUnpackDestPath(srcPath, recursive); if (BXF4.IsHeader(srcPath)) { bhdPath = srcPath; - bhdName = Path.GetFileName(srcPath); + bhdName = OSPath.GetFileName(srcPath); - string bdtExtension = Path.GetExtension(srcPath).Replace("bhd", "bdt"); + string bdtExtension = OSPath.GetExtension(srcPath).Replace("bhd", "bdt"); bdtName = $"{nameWithoutExt}{bdtExtension}"; - bdtPath = Path.Combine(srcDirPath, bdtName); + bdtPath = OSPath.Combine(srcDirPath, bdtName); } else { bdtPath = srcPath; - bdtName = Path.GetFileName(srcPath); + bdtName = OSPath.GetFileName(srcPath); - string bhdExtension = Path.GetExtension(srcPath).Replace("bdt", "bhd"); + string bhdExtension = OSPath.GetExtension(srcPath).Replace("bdt", "bhd"); bhdName = $"{nameWithoutExt}{bhdExtension}"; - bhdPath = Path.Combine(srcDirPath, bhdName); + bhdPath = OSPath.Combine(srcDirPath, bhdName); } var bxf = BXF4.Read(bhdPath, bdtPath); @@ -57,7 +57,7 @@ public override void Unpack(string srcPath, ISoulsFile? _, bool recursive) var root = ""; if (Binder.HasNames(bxf.Format)) { - root = WBUtil.FindCommonBndRootPath(bxf.Files.Select(bxfFile => bxfFile.Name)); + root = BndPath.FindCommonBndRootPath(bxf.Files.Select(bxfFile => bxfFile.Name)); } XElement files = WriteBinderFiles(bxf, destDir, root); diff --git a/WitchyBND/Parsers/Binder/WPARAMBND3.cs b/WitchyBND/Parsers/Binder/WPARAMBND3.cs index 727d2c4c..8dbc2e5d 100644 --- a/WitchyBND/Parsers/Binder/WPARAMBND3.cs +++ b/WitchyBND/Parsers/Binder/WPARAMBND3.cs @@ -63,7 +63,7 @@ public override bool IsUnpacked(string path) { if (!Directory.Exists(path)) return false; - string xmlPath = Path.Combine(path, GetFolderXmlFilename("bnd3")); + string xmlPath = OSPath.Combine(path, GetFolderXmlFilename("bnd3")); if (!File.Exists(xmlPath)) return false; var doc = XDocument.Load(xmlPath); @@ -83,7 +83,7 @@ public override void Unpack(string srcPath, ISoulsFile? file, bool recursive) else if (IsACFARegulation(bnd) || IsACFABoot(bnd)) game = WBUtil.GameType.ACFA; else - throw new InvalidDataException($"Could not determine param type for {Path.GetFileName(srcPath)}."); + throw new InvalidDataException($"Could not determine param type for {OSPath.GetFileName(srcPath)}."); ParseMode.GetParser().Unpack(srcPath, file, recursive, game); } diff --git a/WitchyBND/Parsers/Binder/WPARAMBND4.cs b/WitchyBND/Parsers/Binder/WPARAMBND4.cs index b32249b4..dc526979 100644 --- a/WitchyBND/Parsers/Binder/WPARAMBND4.cs +++ b/WitchyBND/Parsers/Binder/WPARAMBND4.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading.Tasks; using System.Xml; using System.Xml.Linq; using PromptPlusLibrary; @@ -28,19 +29,19 @@ private static bool FilenameIsDS2Regulation(string path) private static bool FilenameIsDS2SRegulation(string path) { - var filename = Path.GetFileName(path).ToLower(); + var filename = OSPath.GetFileName(path).ToLower(); return filename.Contains("enc_regulation") && (filename.EndsWith(".bnd.dcx") || filename.EndsWith(".bnd")); } private static bool FilenameIsDS3Regulation(string path) { - var filename = Path.GetFileName(path).ToLower(); + var filename = OSPath.GetFileName(path).ToLower(); return filename.StartsWith("data0") && filename.EndsWith(".bdt"); } private static bool FilenameIsModernRegulation(string path) { - string filename = Path.GetFileName(path).ToLower(); + string filename = OSPath.GetFileName(path).ToLower(); return filename.Contains("regulation") && filename.EndsWith(".bin"); } @@ -113,7 +114,7 @@ public override bool IsUnpacked(string path) { if (!Directory.Exists(path)) return false; - string xmlPath = Path.Combine(path, GetFolderXmlFilename("bnd4")); + string xmlPath = OSPath.Combine(path, GetFolderXmlFilename("bnd4")); if (!File.Exists(xmlPath)) return false; var doc = XDocument.Load(xmlPath); @@ -183,21 +184,33 @@ public override void Repack(string srcPath, bool recursive) var filePaths = files.Select(file => { var path = file.Element("path"); if (path == null) throw new XmlException($"File element {files.ToList().IndexOf(file)} has no path."); - return path.Value.Replace('\\', Path.DirectorySeparatorChar); + return path.Value.ToOSPath(); }); - foreach (string filePath in filePaths) - { + var sanityCheckCallback = (string filePath) => { + try { - paramParser.Unpack(Path.Combine(srcPath, filePath), null, recursive, true, (game, regVer)); + paramParser.Unpack(OSPath.Combine(srcPath, filePath), null, false, true, (game, regVer)); } catch (Exception e) when (!Configuration.IsDebug) { throw new MalformedBinderException( - @$"The regulation binder is malformed: {Path.GetFileNameWithoutExtension(filePath)} has thrown an exception during read.", + @$"The regulation binder is malformed: {OSPath.GetFileNameWithoutExtension(filePath)} has thrown an exception during read.", e); } + }; + + if (Configuration.Active.Parallel) + { + Parallel.ForEach(filePaths, sanityCheckCallback); + } + else + { + foreach (var filePath in filePaths) + { + sanityCheckCallback(filePath); + } } } diff --git a/WitchyBND/Parsers/Binder/WTPF.cs b/WitchyBND/Parsers/Binder/WTPF.cs index 83f3f007..234db72b 100644 --- a/WitchyBND/Parsers/Binder/WTPF.cs +++ b/WitchyBND/Parsers/Binder/WTPF.cs @@ -39,7 +39,7 @@ public override bool Is(string path, byte[]? data, out ISoulsFile? file) public override bool? IsSimple(string path) { - string filename = Path.GetFileName(path).ToLower(); + string filename = OSPath.GetFileName(path).ToLower(); return filename.EndsWith(".tpf") || filename.EndsWith(".tpf.dcx"); } @@ -81,7 +81,7 @@ public override void Unpack(string srcPath, ISoulsFile? file, bool recursive) texElement.Add(floatStruct); } - File.WriteAllBytes(Path.Combine(destDir, $"{WBUtil.SanitizeFilename(texture.Name)}.dds"), texture.Headerize()); + File.WriteAllBytes(OSPath.Combine(destDir, $"{OSPath.SanitizeFilename(texture.Name.ToOSPath())}.dds"), texture.Headerize()); textures.Add(texElement); } @@ -122,8 +122,8 @@ public override void Repack(string srcPath, bool recursive) foreach (XElement texNode in xml.Element("textures")!.Elements("texture")) { - string inName = Path.GetFileNameWithoutExtension(texNode.GetSanitizedBinderFilePath("name")); - string outName = Path.GetFileNameWithoutExtension(texNode.GetSanitizedBinderFilePath("name", true)); + string inName = BndPath.GetFileNameWithoutExtension(texNode.GetSanitizedBinderFilePath("name")); + string outName = BndPath.GetFileNameWithoutExtension(texNode.GetSanitizedBinderFilePath("name", true)); byte format = Convert.ToByte(texNode.Element("format")!.Value); byte flags1 = Convert.ToByte(texNode.Element("flags1")!.Value, 16); @@ -137,7 +137,7 @@ public override void Repack(string srcPath, bool recursive) floatStruct.Values.Add(float.Parse(valueNode.Value)); } - byte[] bytes = File.ReadAllBytes(Path.Combine(srcPath, $"{outName}.dds")); + byte[] bytes = File.ReadAllBytes(OSPath.Combine(srcPath, $"{outName}.dds")); var texture = new TPF.Texture(inName, format, flags1, bytes, platform); if (platform == TPF.TPFPlatform.PS4) { diff --git a/WitchyBND/Parsers/Binder/WZERO3.cs b/WitchyBND/Parsers/Binder/WZERO3.cs index 7b0d3157..a2f97555 100644 --- a/WitchyBND/Parsers/Binder/WZERO3.cs +++ b/WitchyBND/Parsers/Binder/WZERO3.cs @@ -2,6 +2,7 @@ using System.IO; using SoulsFormats; using SoulsFormats.Other; +using WitchyLib; namespace WitchyBND.Parsers; @@ -12,7 +13,7 @@ public class WZERO3 : WFolderParser public override bool Is(string path, byte[]? _, out ISoulsFile? file) { file = null; - return Path.GetExtension(path) == ".000"; + return OSPath.GetExtension(path) == ".000"; } public override bool? IsSimple(string path) @@ -31,8 +32,8 @@ public override void Unpack(string srcPath, ISoulsFile? _, bool recursive) var targetDir = GetUnpackDestPath(srcPath, recursive); foreach (Zero3.File file in z3.Files) { - string outPath = $@"{targetDir}{Path.DirectorySeparatorChar}{file.Name.Replace('/', Path.DirectorySeparatorChar)}"; - Directory.CreateDirectory(Path.GetDirectoryName(outPath)); + string outPath = OSPath.Combine(targetDir, file.Name.ToOSPath()); + Directory.CreateDirectory(OSPath.GetDirectoryName(outPath)!); File.WriteAllBytes(outPath, file.Bytes); } } diff --git a/WitchyBND/Parsers/Folder/WMSB/WMSBE.Folder.Repack.cs b/WitchyBND/Parsers/Folder/WMSB/WMSBE.Folder.Repack.cs index 0fb57b2c..bf9db13f 100644 --- a/WitchyBND/Parsers/Folder/WMSB/WMSBE.Folder.Repack.cs +++ b/WitchyBND/Parsers/Folder/WMSB/WMSBE.Folder.Repack.cs @@ -94,7 +94,7 @@ public override void Repack(string srcPath, bool recursive) private MSBE.Event RepackEvent(string srcPath, string type, string fileName) { - var filePath = Path.Combine(srcPath, "Event", type, $"{fileName}.xml"); + var filePath = OSPath.Combine(srcPath, "Event", type, $"{fileName}.xml"); switch (type) { case "Generator": @@ -128,7 +128,7 @@ private MSBE.Event RepackEvent(string srcPath, string type, string fileName) private MSBE.Region RepackRegion(string srcPath, string type, string fileName) { - var filePath = Path.Combine(srcPath, "Region", type, $"{fileName}.xml"); + var filePath = OSPath.Combine(srcPath, "Region", type, $"{fileName}.xml"); switch (type) { @@ -219,7 +219,7 @@ private MSBE.Region RepackRegion(string srcPath, string type, string fileName) private MSBE.Model RepackModel(string srcPath, string type, string fileName) { - var filePath = Path.Combine(srcPath, "Model", type, $"{fileName}.xml"); + var filePath = OSPath.Combine(srcPath, "Model", type, $"{fileName}.xml"); switch (type) { @@ -241,7 +241,7 @@ private MSBE.Model RepackModel(string srcPath, string type, string fileName) private MSBE.Part RepackPart(string srcPath, string type, string fileName) { - var filePath = Path.Combine(srcPath, "Part", type, $"{fileName}.xml"); + var filePath = OSPath.Combine(srcPath, "Part", type, $"{fileName}.xml"); switch (type) { @@ -270,7 +270,7 @@ private MSBE.Part RepackPart(string srcPath, string type, string fileName) private MSBE.Route RepackRoute(string srcPath, string type, string fileName) { - var filePath = Path.Combine(srcPath, "Route", type, $"{fileName}.xml"); + var filePath = OSPath.Combine(srcPath, "Route", type, $"{fileName}.xml"); switch (type) { diff --git a/WitchyBND/Parsers/Folder/WMSB/WMSBE.Folder.Unpack.cs b/WitchyBND/Parsers/Folder/WMSB/WMSBE.Folder.Unpack.cs index bca57e83..9e37db73 100644 --- a/WitchyBND/Parsers/Folder/WMSB/WMSBE.Folder.Unpack.cs +++ b/WitchyBND/Parsers/Folder/WMSB/WMSBE.Folder.Unpack.cs @@ -32,21 +32,21 @@ public override void Unpack(string srcPath, ISoulsFile? file, bool recursive) var taskList = new List(); - if (Directory.Exists(Path.Combine(destDir, "Event"))) - Directory.Delete(Path.Combine(destDir, "Event"), true); - Directory.CreateDirectory(Path.Combine(destDir, "Event")); - if (Directory.Exists(Path.Combine(destDir, "Region"))) - Directory.Delete(Path.Combine(destDir, "Region"), true); - Directory.CreateDirectory(Path.Combine(destDir, "Region")); - if (Directory.Exists(Path.Combine(destDir, "Part"))) - Directory.Delete(Path.Combine(destDir, "Part"), true); - Directory.CreateDirectory(Path.Combine(destDir, "Part")); - if (Directory.Exists(Path.Combine(destDir, "Model"))) - Directory.Delete(Path.Combine(destDir, "Model"), true); - Directory.CreateDirectory(Path.Combine(destDir, "Model")); - if (Directory.Exists(Path.Combine(destDir, "Route"))) - Directory.Delete(Path.Combine(destDir, "Route"), true); - Directory.CreateDirectory(Path.Combine(destDir, "Route")); + if (Directory.Exists(OSPath.Combine(destDir, "Event"))) + Directory.Delete(OSPath.Combine(destDir, "Event"), true); + Directory.CreateDirectory(OSPath.Combine(destDir, "Event")); + if (Directory.Exists(OSPath.Combine(destDir, "Region"))) + Directory.Delete(OSPath.Combine(destDir, "Region"), true); + Directory.CreateDirectory(OSPath.Combine(destDir, "Region")); + if (Directory.Exists(OSPath.Combine(destDir, "Part"))) + Directory.Delete(OSPath.Combine(destDir, "Part"), true); + Directory.CreateDirectory(OSPath.Combine(destDir, "Part")); + if (Directory.Exists(OSPath.Combine(destDir, "Model"))) + Directory.Delete(OSPath.Combine(destDir, "Model"), true); + Directory.CreateDirectory(OSPath.Combine(destDir, "Model")); + if (Directory.Exists(OSPath.Combine(destDir, "Route"))) + Directory.Delete(OSPath.Combine(destDir, "Route"), true); + Directory.CreateDirectory(OSPath.Combine(destDir, "Route")); var eventsEl = new XElement("events"); xml.Add(eventsEl); @@ -110,7 +110,7 @@ private void UnpackEntries(XElement parentEl, List entries, string r _ => throw new ArgumentOutOfRangeException(nameof(entry)) }; - string entryDir = Path.Combine(rootDir, entryDirName); + string entryDir = OSPath.Combine(rootDir, entryDirName); var el = new XElement(entryDirName.ToLower()); parentEl.Add(el); @@ -124,368 +124,368 @@ private void UnpackEntries(XElement parentEl, List entries, string r switch (entry) { case MSBE.Event.Generator generator: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, generator.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, generator.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(generator, filePath); el.SetAttributeValue("type", generator.GetType().Name); break; case MSBE.Event.Mount mount: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, mount.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, mount.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(mount, filePath); el.SetAttributeValue("type", mount.GetType().Name); break; case MSBE.Event.Navmesh navmesh: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, navmesh.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, navmesh.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(navmesh, filePath); el.SetAttributeValue("type", navmesh.GetType().Name); break; case MSBE.Event.ObjAct objAct: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, objAct.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, objAct.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(objAct, filePath); el.SetAttributeValue("type", objAct.GetType().Name); break; case MSBE.Event.Other other: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, other.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, other.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(other, filePath); el.SetAttributeValue("type", other.GetType().Name); break; case MSBE.Event.PatrolInfo patrolInfo: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, patrolInfo.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, patrolInfo.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(patrolInfo, filePath); el.SetAttributeValue("type", patrolInfo.GetType().Name); break; case MSBE.Event.PlatoonInfo platoonInfo: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, platoonInfo.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, platoonInfo.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(platoonInfo, filePath); el.SetAttributeValue("type", platoonInfo.GetType().Name); break; case MSBE.Event.PseudoMultiplayer pseudoMultiplayer: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, pseudoMultiplayer.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, pseudoMultiplayer.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(pseudoMultiplayer, filePath); el.SetAttributeValue("type", pseudoMultiplayer.GetType().Name); break; case MSBE.Event.RetryPoint retryPoint: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, retryPoint.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, retryPoint.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(retryPoint, filePath); el.SetAttributeValue("type", retryPoint.GetType().Name); break; case MSBE.Event.SignPool signPool: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, signPool.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, signPool.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(signPool, filePath); el.SetAttributeValue("type", signPool.GetType().Name); break; case MSBE.Event.Treasure treasure: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, treasure.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, treasure.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(treasure, filePath); el.SetAttributeValue("type", treasure.GetType().Name); break; case MSBE.Event.AreaTeam areaTeam: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, areaTeam.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, areaTeam.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(areaTeam, filePath); el.SetAttributeValue("type", areaTeam.GetType().Name); break; case MSBE.Model.Asset asset: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, asset.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, asset.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(asset, filePath); el.SetAttributeValue("type", asset.GetType().Name); break; case MSBE.Model.Collision collision: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, collision.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, collision.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(collision, filePath); el.SetAttributeValue("type", collision.GetType().Name); break; case MSBE.Model.Enemy enemy: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, enemy.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, enemy.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(enemy, filePath); el.SetAttributeValue("type", enemy.GetType().Name); break; case MSBE.Model.MapPiece mapPiece: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, mapPiece.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, mapPiece.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(mapPiece, filePath); el.SetAttributeValue("type", mapPiece.GetType().Name); break; case MSBE.Model.Player player: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, player.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, player.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(player, filePath); el.SetAttributeValue("type", player.GetType().Name); break; case MSBE.Part.Asset asset1: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, asset1.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, asset1.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(asset1, filePath); el.SetAttributeValue("type", asset1.GetType().Name); break; case MSBE.Part.Collision collision1: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, collision1.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, collision1.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(collision1, filePath); el.SetAttributeValue("type", collision1.GetType().Name); break; case MSBE.Part.ConnectCollision connectCollision: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, connectCollision.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, connectCollision.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(connectCollision, filePath); el.SetAttributeValue("type", connectCollision.GetType().Name); break; case MSBE.Part.DummyAsset dummyAsset: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, dummyAsset.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, dummyAsset.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(dummyAsset, filePath); el.SetAttributeValue("type", dummyAsset.GetType().Name); break; case MSBE.Part.DummyEnemy dummyEnemy: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, dummyEnemy.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, dummyEnemy.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(dummyEnemy, filePath); el.SetAttributeValue("type", dummyEnemy.GetType().Name); break; case MSBE.Part.Enemy enemy1: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, enemy1.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, enemy1.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(enemy1, filePath); el.SetAttributeValue("type", enemy1.GetType().Name); break; case MSBE.Part.MapPiece mapPiece1: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, mapPiece1.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, mapPiece1.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(mapPiece1, filePath); el.SetAttributeValue("type", mapPiece1.GetType().Name); break; case MSBE.Part.Player player1: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, player1.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, player1.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(player1, filePath); el.SetAttributeValue("type", player1.GetType().Name); break; case MSBE.Region.AutoDrawGroupPoint autoDrawGroupPoint: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, autoDrawGroupPoint.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, autoDrawGroupPoint.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(autoDrawGroupPoint, filePath); el.SetAttributeValue("type", autoDrawGroupPoint.GetType().Name); break; case MSBE.Region.BuddySummonPoint buddySummonPoint: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, buddySummonPoint.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, buddySummonPoint.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(buddySummonPoint, filePath); el.SetAttributeValue("type", buddySummonPoint.GetType().Name); break; case MSBE.Region.Connection connection: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, connection.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, connection.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(connection, filePath); el.SetAttributeValue("type", connection.GetType().Name); break; case MSBE.Region.DisableTumbleweed disableTumbleweed: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, disableTumbleweed.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, disableTumbleweed.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(disableTumbleweed, filePath); el.SetAttributeValue("type", disableTumbleweed.GetType().Name); break; case MSBE.Region.Dummy dummy: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, dummy.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, dummy.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(dummy, filePath); el.SetAttributeValue("type", dummy.GetType().Name); break; case MSBE.Region.EnvironmentMapEffectBox environmentMapEffectBox: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, environmentMapEffectBox.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, environmentMapEffectBox.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(environmentMapEffectBox, filePath); el.SetAttributeValue("type", environmentMapEffectBox.GetType().Name); break; case MSBE.Region.EnvironmentMapOutput environmentMapOutput: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, environmentMapOutput.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, environmentMapOutput.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(environmentMapOutput, filePath); el.SetAttributeValue("type", environmentMapOutput.GetType().Name); break; case MSBE.Region.EnvironmentMapPoint environmentMapPoint: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, environmentMapPoint.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, environmentMapPoint.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(environmentMapPoint, filePath); el.SetAttributeValue("type", environmentMapPoint.GetType().Name); break; case MSBE.Region.FallPreventionRemoval fallPreventionRemoval: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, fallPreventionRemoval.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, fallPreventionRemoval.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(fallPreventionRemoval, filePath); el.SetAttributeValue("type", fallPreventionRemoval.GetType().Name); break; case MSBE.Region.FastTravelRestriction fastTravelRestriction: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, fastTravelRestriction.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, fastTravelRestriction.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(fastTravelRestriction, filePath); el.SetAttributeValue("type", fastTravelRestriction.GetType().Name); break; case MSBE.Region.GroupDefeatReward groupDefeatReward: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, groupDefeatReward.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, groupDefeatReward.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(groupDefeatReward, filePath); el.SetAttributeValue("type", groupDefeatReward.GetType().Name); break; case MSBE.Region.Hitset hitset: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, hitset.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, hitset.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(hitset, filePath); el.SetAttributeValue("type", hitset.GetType().Name); break; case MSBE.Region.HorseRideOverride horseRideOverride: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, horseRideOverride.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, horseRideOverride.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(horseRideOverride, filePath); el.SetAttributeValue("type", horseRideOverride.GetType().Name); break; case MSBE.Region.LockedMountJump lockedMountJump: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, lockedMountJump.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, lockedMountJump.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(lockedMountJump, filePath); el.SetAttributeValue("type", lockedMountJump.GetType().Name); break; case MSBE.Region.LockedMountJumpFall lockedMountJumpFall: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, lockedMountJumpFall.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, lockedMountJumpFall.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(lockedMountJumpFall, filePath); el.SetAttributeValue("type", lockedMountJumpFall.GetType().Name); break; case MSBE.Region.InvasionPoint invasionPoint: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, invasionPoint.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, invasionPoint.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(invasionPoint, filePath); el.SetAttributeValue("type", invasionPoint.GetType().Name); break; case MSBE.Region.MapNameOverride mapNameOverride: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, mapNameOverride.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, mapNameOverride.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(mapNameOverride, filePath); el.SetAttributeValue("type", mapNameOverride.GetType().Name); break; case MSBE.Region.MapPoint mapPoint: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, mapPoint.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, mapPoint.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(mapPoint, filePath); el.SetAttributeValue("type", mapPoint.GetType().Name); break; case MSBE.Region.MapPointDiscoveryOverride mapPointDiscoveryOverride: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, mapPointDiscoveryOverride.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, mapPointDiscoveryOverride.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(mapPointDiscoveryOverride, filePath); el.SetAttributeValue("type", mapPointDiscoveryOverride.GetType().Name); break; case MSBE.Region.MapPointParticipationOverride mapPointParticipationOverride: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, mapPointParticipationOverride.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, mapPointParticipationOverride.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(mapPointParticipationOverride, filePath); el.SetAttributeValue("type", mapPointParticipationOverride.GetType().Name); break; case MSBE.Region.Message message: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, message.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, message.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(message, filePath); el.SetAttributeValue("type", message.GetType().Name); break; case MSBE.Region.MountJump mountJump: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, mountJump.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, mountJump.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(mountJump, filePath); el.SetAttributeValue("type", mountJump.GetType().Name); break; case MSBE.Region.MountJumpFall mountJumpFall: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, mountJumpFall.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, mountJumpFall.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(mountJumpFall, filePath); el.SetAttributeValue("type", mountJumpFall.GetType().Name); break; case MSBE.Region.MufflingBox mufflingBox: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, mufflingBox.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, mufflingBox.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(mufflingBox, filePath); el.SetAttributeValue("type", mufflingBox.GetType().Name); break; case MSBE.Region.MufflingPlane mufflingPlane: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, mufflingPlane.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, mufflingPlane.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(mufflingPlane, filePath); el.SetAttributeValue("type", mufflingPlane.GetType().Name); break; case MSBE.Region.MufflingPortal mufflingPortal: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, mufflingPortal.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, mufflingPortal.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(mufflingPortal, filePath); el.SetAttributeValue("type", mufflingPortal.GetType().Name); break; case MSBE.Region.NavmeshCutting navmeshCutting: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, navmeshCutting.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, navmeshCutting.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(navmeshCutting, filePath); el.SetAttributeValue("type", navmeshCutting.GetType().Name); break; case MSBE.Region.Other other1: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, other1.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, other1.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(other1, filePath); el.SetAttributeValue("type", other1.GetType().Name); break; case MSBE.Region.PatrolRoute patrolRoute: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, patrolRoute.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, patrolRoute.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(patrolRoute, filePath); el.SetAttributeValue("type", patrolRoute.GetType().Name); break; case MSBE.Region.PatrolRoute22 patrolRoute22: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, patrolRoute22.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, patrolRoute22.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(patrolRoute22, filePath); el.SetAttributeValue("type", patrolRoute22.GetType().Name); break; case MSBE.Region.PlayArea playArea: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, playArea.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, playArea.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(playArea, filePath); el.SetAttributeValue("type", playArea.GetType().Name); break; case MSBE.Region.SFX sfx: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, sfx.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, sfx.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(sfx, filePath); el.SetAttributeValue("type", sfx.GetType().Name); break; case MSBE.Region.Sound sound: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, sound.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, sound.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(sound, filePath); el.SetAttributeValue("type", sound.GetType().Name); break; case MSBE.Region.SoundRegion soundRegion: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, soundRegion.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, soundRegion.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(soundRegion, filePath); el.SetAttributeValue("type", soundRegion.GetType().Name); break; case MSBE.Region.SpawnPoint spawnPoint: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, spawnPoint.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, spawnPoint.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(spawnPoint, filePath); el.SetAttributeValue("type", spawnPoint.GetType().Name); break; case MSBE.Region.WeatherCreateAssetPoint weatherCreateAssetPoint: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, weatherCreateAssetPoint.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, weatherCreateAssetPoint.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(weatherCreateAssetPoint, filePath); el.SetAttributeValue("type", weatherCreateAssetPoint.GetType().Name); break; case MSBE.Region.WeatherOverride weatherOverride: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, weatherOverride.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, weatherOverride.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(weatherOverride, filePath); el.SetAttributeValue("type", weatherOverride.GetType().Name); break; case MSBE.Region.WindArea windArea: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, windArea.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, windArea.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(windArea, filePath); el.SetAttributeValue("type", windArea.GetType().Name); break; case MSBE.Region.WindSFX windSfx: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, windSfx.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, windSfx.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(windSfx, filePath); el.SetAttributeValue("type", windSfx.GetType().Name); break; case MSBE.Route.MufflingBoxLink mufflingBoxLink: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, mufflingBoxLink.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, mufflingBoxLink.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(mufflingBoxLink, filePath); el.SetAttributeValue("type", mufflingBoxLink.GetType().Name); break; case MSBE.Route.MufflingPortalLink mufflingPortalLink: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, mufflingPortalLink.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, mufflingPortalLink.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(mufflingPortalLink, filePath); el.SetAttributeValue("type", mufflingPortalLink.GetType().Name); break; case MSBE.Route.Other other2: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, other2.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, other2.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(other2, filePath); el.SetAttributeValue("type", other2.GetType().Name); break; case MSBE.Event @event: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, @event.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, @event.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(@event, filePath); el.SetAttributeValue("type", @event.GetType().Name); break; case MSBE.Model model: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, model.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, model.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(model, filePath); el.SetAttributeValue("type", model.GetType().Name); break; case MSBE.Part.EnemyBase enemyBase: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, enemyBase.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, enemyBase.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(enemyBase, filePath); el.SetAttributeValue("type", enemyBase.GetType().Name); break; case MSBE.Region region: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, region.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, region.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(region, filePath); el.SetAttributeValue("type", region.GetType().Name); break; case MSBE.Route route: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, route.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, route.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(route, filePath); el.SetAttributeValue("type", route.GetType().Name); break; case MSBE.Part part: - filePath = WBUtil.NextAvailableFilename(Path.Combine(entryDir, part.GetType().Name, $"{fileName}.xml")); + filePath = WBUtil.NextAvailableFilename(OSPath.Combine(entryDir, part.GetType().Name, $"{fileName}.xml")); WBUtil.XmlSerialize(part, filePath); el.SetAttributeValue("type", part.GetType().Name); break; @@ -493,7 +493,7 @@ private void UnpackEntries(XElement parentEl, List entries, string r throw new ArgumentOutOfRangeException(nameof(entry)); } - fileName = Path.GetFileNameWithoutExtension(filePath); + fileName = OSPath.GetFileNameWithoutExtension(filePath); el.SetAttributeValue("name", fileName); } } diff --git a/WitchyBND/Parsers/Folder/WTAE/WTAE.Folder.Repack.cs b/WitchyBND/Parsers/Folder/WTAE/WTAE.Folder.Repack.cs index 1a9592f7..3c8f7089 100644 --- a/WitchyBND/Parsers/Folder/WTAE/WTAE.Folder.Repack.cs +++ b/WitchyBND/Parsers/Folder/WTAE/WTAE.Folder.Repack.cs @@ -72,7 +72,7 @@ void Callback(string file) private TAE.Animation RepackAnim(string file, TAE tae, TAE.Template template) { - var id = int.Parse(new string(Path.GetFileNameWithoutExtension(file).Where(c => char.IsDigit(c)).ToArray())); + var id = int.Parse(new string(OSPath.GetFileNameWithoutExtension(file).Where(c => char.IsDigit(c)).ToArray())); var animXml = XDocument.Load(file).Root!; var animName = animXml.Element("name")!.Value; var headerEl = animXml.Element("header")!; diff --git a/WitchyBND/Parsers/Folder/WTAE/WTAE.Folder.Unpack.cs b/WitchyBND/Parsers/Folder/WTAE/WTAE.Folder.Unpack.cs index a4a06cc3..d9781b51 100644 --- a/WitchyBND/Parsers/Folder/WTAE/WTAE.Folder.Unpack.cs +++ b/WitchyBND/Parsers/Folder/WTAE/WTAE.Folder.Unpack.cs @@ -19,7 +19,7 @@ public override bool Is(string path, byte[]? data, out ISoulsFile? file) public override bool? IsSimple(string path) { - string filename = Path.GetFileName(path).ToLower(); + string filename = OSPath.GetFileName(path).ToLower(); return Configuration.Active.TaeFolder && filename.EndsWith(".tae"); } @@ -133,6 +133,6 @@ public void UnpackAnim(string destDir, TAE tae, TAE.Animation anim, bool addDigi })); var digits = addDigits ? anim.ID.ToString("000000000") : anim.ID.ToString("000000"); - xDoc.Save(Path.Combine(destDir, $"anim-{digits}.xml")); + xDoc.Save(OSPath.Combine(destDir, $"anim-{digits}.xml")); } } \ No newline at end of file diff --git a/WitchyBND/Parsers/WBinderParser.cs b/WitchyBND/Parsers/WBinderParser.cs index 6165e797..d276c83e 100644 --- a/WitchyBND/Parsers/WBinderParser.cs +++ b/WitchyBND/Parsers/WBinderParser.cs @@ -34,22 +34,22 @@ public override bool Preprocess(string srcPath, bool recursive, foreach (var bndFile in bnd.Files) { - string path = GetBinderFilePath(bnd, bndFile, null); + string bndPath = GetBinderFilePath(bnd, bndFile, null); string suffix = ""; - if (pathCounts.ContainsKey(path)) + if (pathCounts.ContainsKey(bndPath)) { - pathCounts[path]++; - suffix = $" ({pathCounts[path]})"; + pathCounts[bndPath]++; + suffix = $" ({pathCounts[bndPath]})"; } else { - pathCounts[path] = 1; + pathCounts[bndPath] = 1; } - path = path.Replace('\\', Path.DirectorySeparatorChar); - string destFilePath = Path.Combine(destDir, Path.GetDirectoryName(path)!, - $"{Path.GetFileNameWithoutExtension(path)}{suffix}{Path.GetExtension(path)}"); + var path = bndPath.ToOSPath(); + string destFilePath = OSPath.Combine(destDir, OSPath.GetDirectoryName(path)!, + $"{OSPath.GetFileNameWithoutExtension(path)}{suffix}{OSPath.GetExtension(path)}"); foreach (var parser in parsers) { bool toBreak = parser.Preprocess(destFilePath, true, ref files); @@ -76,11 +76,11 @@ public override bool Preprocess(string srcPath, bool recursive, protected static string GetBinderFilePath(IBinder bnd, BinderFile file, string? root) { - root ??= WBUtil.FindCommonBndRootPath(bnd.Files.Select(bndFile => bndFile.Name)); + root ??= BndPath.FindCommonBndRootPath(bnd.Files.Select(bndFile => bndFile.Name)); string path; if (Binder.HasNames(bnd.Format)) { - path = WBUtil.UnrootBNDPath(file.Name, root); + path = BndPath.Unroot(file.Name, root); } else if (Binder.HasIDs(bnd.Format)) { @@ -104,7 +104,7 @@ protected static XElement WriteBinderFiles(IBinder bnd, string destDirPath, stri void Callback(BinderFile file) { - string path = GetBinderFilePath(bnd, file, root); + string bndPath = GetBinderFilePath(bnd, file, root); var fileElement = new XElement("file", new XElement("flags", file.Flags.ToString())); @@ -115,28 +115,28 @@ void Callback(BinderFile file) else if (bnd.Format == Binder.Format.Names1 && bnd.Files.Any(f => f.Name.StartsWith("USER_DATA"))) fileElement.Add(new XElement("id", file.ID.ToString())); - fileElement.Add(new XElement("path", path)); + fileElement.Add(new XElement("path", bndPath)); string suffix = ""; - if (pathCounts.ContainsKey(path)) + if (pathCounts.ContainsKey(bndPath)) { - pathCounts[path]++; - suffix = $" ({pathCounts[path]})"; + pathCounts[bndPath]++; + suffix = $" ({pathCounts[bndPath]})"; fileElement.Add(new XElement("suffix", suffix)); } else { - pathCounts[path] = 1; + pathCounts[bndPath] = 1; } if (file.CompressionInfo.Type != DCX.Type.Zlib) WriteCompressionInfoToXml(fileElement, file.CompressionInfo); byte[] bytes = file.Bytes; - path = path.Replace('\\', Path.DirectorySeparatorChar); - string destPath = Path.Combine(destDirPath, Path.GetDirectoryName(path)!, - $"{Path.GetFileNameWithoutExtension(path)}{suffix}{Path.GetExtension(path)}"); - Directory.CreateDirectory(Path.GetDirectoryName(destPath)!); + bndPath = bndPath.ToOSPath(); + string destPath = OSPath.Combine(destDirPath, OSPath.GetDirectoryName(bndPath)!, + $"{OSPath.GetFileNameWithoutExtension(bndPath)}{suffix}{OSPath.GetExtension(bndPath)}"); + Directory.CreateDirectory(OSPath.GetDirectoryName(destPath)!); resultingPaths.Push(destPath); File.WriteAllBytes(destPath, bytes); @@ -193,7 +193,7 @@ protected static void ReadBinderFiles(IBinder bnd, XElement filesElement, string bool recursive) { var bag = new ConcurrentDictionary(); - var nameList = filesElement.Elements("file").Select(file => Path.Combine(root, file.Element("path")!.Value)) + var nameList = filesElement.Elements("file").Select(file => BndPath.Combine(root, file.Element("path")!.Value)) .ToList(); void Callback(XElement file) @@ -204,7 +204,7 @@ void Callback(XElement file) string strFlags = file.Element("flags")?.Value ?? "Flag1"; string strId = file.Element("id")?.Value ?? "-1"; // Edge case for PC save files - string path = file.Element("path")!.Value; + string bndPath = file.Element("path")!.Value; string suffix = file.Element("suffix")?.Value ?? ""; string? strCompression = file.Element("compression")?.Value; DCX.CompressionInfo compression; @@ -216,7 +216,7 @@ void Callback(XElement file) { compression = new DCX.ZlibCompressionInfo(); } - string name = Path.Combine(root, path); + string bndName = BndPath.Combine(root, bndPath); if (!Enum.TryParse(strFlags, out Binder.FileFlags flags)) throw new FriendlyException( @@ -225,17 +225,17 @@ void Callback(XElement file) if (!int.TryParse(strId, out int id)) throw new FriendlyException($"Could not parse file ID: {strId}\nID must be a 32-bit signed integer."); - path = path.Replace('\\', Path.DirectorySeparatorChar); + var path = bndPath.ToOSPath(); - string inPath = Path.Combine(srcDirPath, Path.GetDirectoryName(path)!, - $"{Path.GetFileNameWithoutExtension(path)}{suffix}{Path.GetExtension(path)}"); + string inPath = OSPath.Combine(srcDirPath, OSPath.GetDirectoryName(path)!, + $"{OSPath.GetFileNameWithoutExtension(path)}{suffix}{OSPath.GetExtension(path)}"); if (!File.Exists(inPath)) throw new FriendlyException($"File not found: {inPath}"); RecursiveRepackFile(inPath, recursive); byte[] bytes = File.ReadAllBytes(inPath); - bag.TryAdd(name, new BinderFile(flags, id, name, bytes) + bag.TryAdd(bndName, new BinderFile(flags, id, bndName, bytes) { CompressionInfo = compression }); @@ -291,14 +291,14 @@ protected virtual void ReadUnsortedBinderFiles(IBinder bnd, string srcDirPath, s var i = 0; foreach (string filePath in Directory.GetFiles(srcDirPath, searchPattern, SearchOption.AllDirectories)) { - string filename = Path.GetFileName(filePath); + string filename = OSPath.GetFileName(filePath); UnsortedFileFormat format = PackedFormats.FirstOrDefault(a => FileSystemName.MatchesWin32Expression(a.SearchPattern.AsSpan(), filename)); if (format == null) throw new InvalidDataException( $"File {filename} passed pattern checks, but was not found among formats."); string name = !string.IsNullOrEmpty(root) - ? Path.Combine(root, Path.GetRelativePath(srcDirPath, filePath)) + ? BndPath.Combine(root, BndPath.GetRelativePath(srcDirPath.ToBndPath(), filePath.ToBndPath())) : filePath; RecursiveRepackFile(filePath, recursive); diff --git a/WitchyBND/Parsers/WDCX.cs b/WitchyBND/Parsers/WDCX.cs index 5590f85a..8460cee4 100644 --- a/WitchyBND/Parsers/WDCX.cs +++ b/WitchyBND/Parsers/WDCX.cs @@ -3,6 +3,7 @@ using System.Xml; using System.Xml.Linq; using SoulsFormats; +using WitchyLib; namespace WitchyBND.Parsers; @@ -40,20 +41,20 @@ public override string GetUnpackDestPath(string srcPath, bool recursive) { string sourceDir = new FileInfo(srcPath).Directory?.FullName!; string? location = Configuration.Active.Location; - string fileName = Path.GetFileName(srcPath); + string fileName = OSPath.GetFileName(srcPath); if (!string.IsNullOrEmpty(location) && !recursive) sourceDir = location; - sourceDir = Path.GetFullPath(sourceDir); + sourceDir = OSPath.GetFullPath(sourceDir); if (srcPath.ToLower().EndsWith(".dcx")) - return Path.Combine(sourceDir, Path.GetFileNameWithoutExtension(srcPath)); - return Path.Combine(sourceDir, $"{fileName}.undcx"); + return OSPath.Combine(sourceDir, OSPath.GetFileNameWithoutExtension(srcPath)); + return OSPath.Combine(sourceDir, $"{fileName}.undcx"); } public override string GetRepackDestPath(string srcPath, XElement? xml) { var path = xml?.Element("sourcePath")?.Value; if (path != null) - srcPath = Path.Combine(path.Replace('\\', Path.DirectorySeparatorChar), Path.GetFileName(srcPath)); + srcPath = OSPath.Combine(path.ToOSPath(), OSPath.GetFileName(srcPath)); if (srcPath.ToLower().EndsWith(".undcx")) return srcPath.Substring(0, srcPath.Length - 6); return srcPath + ".dcx"; diff --git a/WitchyBND/Parsers/WFolderParser.cs b/WitchyBND/Parsers/WFolderParser.cs index 15ec6a2b..9af7832f 100644 --- a/WitchyBND/Parsers/WFolderParser.cs +++ b/WitchyBND/Parsers/WFolderParser.cs @@ -44,16 +44,16 @@ public override string GetUnpackDestPath(string srcPath, bool recursive) { string sourceDir = new FileInfo(srcPath).Directory?.FullName!; string? location = Configuration.Active.Location; - string fileName = Path.GetFileName(srcPath); + string fileName = OSPath.GetFileName(srcPath); if (!string.IsNullOrEmpty(location) && !recursive) sourceDir = location; - sourceDir = Path.GetFullPath(sourceDir); + sourceDir = OSPath.GetFullPath(sourceDir); string tarDir = fileName.Replace('.', '-'); if (fileName == tarDir) { tarDir += "-unpacked"; } - return Path.Combine(sourceDir, tarDir); + return OSPath.Combine(sourceDir, tarDir); } public override XElement PrepareXmlManifest(string srcPath, bool recursive, bool skipFilename, @@ -83,10 +83,10 @@ public virtual string GetRepackDestPath(string srcDirPath, XElement xml, string var sourceDir = xml.Element("sourcePath")?.Value; if (sourceDir != null) { - return Path.GetFullPath(Path.Combine(srcDirPath, "..", sourceDir.Replace('\\', Path.DirectorySeparatorChar), filename)); + return OSPath.GetFullPath(OSPath.Combine(srcDirPath, "..", sourceDir.ToOSPath(), filename)); } string targetDir = new DirectoryInfo(srcDirPath).Parent?.FullName!; - return Path.GetFullPath(Path.Combine(targetDir, filename)); + return OSPath.GetFullPath(OSPath.Combine(targetDir, filename)); } // public virtual string GetRepackDestPath(string srcDirPath, string destFileName) // { @@ -108,7 +108,7 @@ public override bool IsUnpacked(string path) { if (!Directory.Exists(path)) return false; - string xmlPath = Path.Combine(path, GetFolderXmlFilename()); + string xmlPath = OSPath.Combine(path, GetFolderXmlFilename()); if (!File.Exists(xmlPath)) return false; var doc = XDocument.Load(xmlPath); @@ -124,7 +124,7 @@ public virtual string GetFolderXmlFilename(string? name = null) public virtual string GetFolderXmlPath(string dir, string? name = null) { name ??= XmlTag.ToLower(); - return Path.Combine(dir, GetFolderXmlFilename(name)); + return OSPath.Combine(dir, GetFolderXmlFilename(name)); } public static List GetFolderFilePaths(XElement filesElement, string srcDirPath) @@ -135,7 +135,7 @@ public static List GetFolderFilePaths(XElement filesElement, string srcD throw new FriendlyException("File node missing path tag."); string path = pathEl.Value; string suffix = file.Element("suffix")?.Value ?? ""; - string inPath = Path.Combine(srcDirPath, Path.GetDirectoryName(path)!, $"{Path.GetFileNameWithoutExtension(path)}{suffix}{Path.GetExtension(path)}"); + string inPath = OSPath.Combine(srcDirPath, OSPath.GetDirectoryName(path)!, $"{OSPath.GetFileNameWithoutExtension(path)}{suffix}{OSPath.GetExtension(path)}"); if (!File.Exists(inPath)) throw new FriendlyException($"File not found: {inPath}"); return inPath; diff --git a/WitchyBND/Parsers/WParser.cs b/WitchyBND/Parsers/WParser.cs index 0767d5eb..ec94d994 100644 --- a/WitchyBND/Parsers/WParser.cs +++ b/WitchyBND/Parsers/WParser.cs @@ -134,26 +134,26 @@ public static void AddLocationToXml(string path, bool recursive, XmlWriter xw, b string? location = Configuration.Active.Location; if (!string.IsNullOrEmpty(location) && !recursive) { - string srcPath = Path.GetDirectoryName(path)!; + string srcPath = OSPath.GetDirectoryName(path)!; if (location.StartsWith(srcPath)) - srcPath = Path.GetRelativePath(location, srcPath); - xw.WriteElementString("sourcePath", srcPath.Replace(Path.DirectorySeparatorChar, '\\')); + srcPath = OSPath.GetRelativePath(location, srcPath); + xw.WriteElementString("sourcePath", srcPath.ToBndPath()); } if (!skipFilename) - xw.WriteElementString("filename", Path.GetFileName(path)); + xw.WriteElementString("filename", OSPath.GetFileName(path)); } public static void AddLocationToXml(string path, bool recursive, XElement xml, bool skipFilename = false) { string? location = Configuration.Active.Location; if (!string.IsNullOrEmpty(location) && !recursive) { - string srcPath = Path.GetDirectoryName(path)!; + string srcPath = OSPath.GetDirectoryName(path)!; if (location.StartsWith(srcPath)) - srcPath = Path.GetRelativePath(location, srcPath); - xml.AddFirst(new XElement("sourcePath", srcPath.Replace(Path.DirectorySeparatorChar, '\\'))); + srcPath = OSPath.GetRelativePath(location, srcPath); + xml.AddFirst(new XElement("sourcePath", srcPath)); } if (!skipFilename) - xml.AddFirst(new XElement("filename", Path.GetFileName(path))); + xml.AddFirst(new XElement("filename", OSPath.GetFileName(path))); } public static WBUtil.GameType GetGameTypeFromXml(XElement xml) @@ -359,7 +359,7 @@ public abstract class WDeferredFileParser : WSingleFileParser public override bool Is(string path, byte[]? _, out ISoulsFile? file) { file = null; - var extension = WBUtil.GetFullExtensions(path).ToLower(); + var extension = OSPath.GetFullExtensions(path).ToLower(); var cond = UnpackExtensions.Contains(extension); if (cond && !Configuration.Active.DeferTools.ContainsKey(DeferFormat)) throw new DeferToolPathException(DeferFormat); @@ -373,7 +373,7 @@ public override bool Is(string path, byte[]? _, out ISoulsFile? file) public override bool IsUnpacked(string path) { - var extension = WBUtil.GetFullExtensions(path).ToLower(); + var extension = OSPath.GetFullExtensions(path).ToLower(); var cond = RepackExtensions.Contains(extension); if (cond && !Configuration.Active.DeferTools.ContainsKey(DeferFormat)) throw new DeferToolPathException(DeferFormat); @@ -411,8 +411,8 @@ public override string GetUnpackDestPath(string srcPath, bool recursive) string? location = Configuration.Active.Location; if (!string.IsNullOrEmpty(location) && !recursive) sourceDir = location; - sourceDir = Path.GetFullPath(sourceDir); - return Path.Combine(sourceDir, $"{Path.GetFileName(srcPath)}.xml"); + sourceDir = OSPath.GetFullPath(sourceDir); + return OSPath.Combine(sourceDir, $"{OSPath.GetFileName(srcPath)}.xml"); } public override string GetRepackDestPath(string srcPath, XElement xml) @@ -420,15 +420,14 @@ public override string GetRepackDestPath(string srcPath, XElement xml) var path = xml.Element("sourcePath")?.Value; if (path != null) { - path = path.Replace('\\', Path.DirectorySeparatorChar); - return Path.Combine(path, Path.GetFileName(srcPath).Replace(".xml", String.Empty)); + return OSPath.Combine(path, OSPath.GetFileName(srcPath).Replace(".xml", String.Empty).Replace(".XML", String.Empty)); } - return srcPath.Replace(".xml", ""); + return srcPath.Replace(".xml", "").Replace(".XML", ""); } public override bool IsUnpacked(string path) { - if (Path.GetExtension(path) != ".xml") + if (OSPath.GetExtension(path).ToLower() != ".xml") return false; var doc = XDocument.Load(path); diff --git a/WitchyBND/Parsers/XML/Serialized/WAIP.cs b/WitchyBND/Parsers/XML/Serialized/WAIP.cs index 09eea6ce..017d63e5 100644 --- a/WitchyBND/Parsers/XML/Serialized/WAIP.cs +++ b/WitchyBND/Parsers/XML/Serialized/WAIP.cs @@ -18,7 +18,7 @@ public override bool Is(string path, byte[]? data, out ISoulsFile? file) public override bool? IsSimple(string path) { - string filename = Path.GetFileName(path).ToLower(); + string filename = OSPath.GetFileName(path).ToLower(); return filename.EndsWith(".aip"); } } \ No newline at end of file diff --git a/WitchyBND/Parsers/XML/Serialized/WENFL.cs b/WitchyBND/Parsers/XML/Serialized/WENFL.cs index 7f759eed..6a7fc864 100644 --- a/WitchyBND/Parsers/XML/Serialized/WENFL.cs +++ b/WitchyBND/Parsers/XML/Serialized/WENFL.cs @@ -1,6 +1,6 @@ using System; -using System.IO; using SoulsFormats; +using WitchyLib; namespace WitchyBND.Parsers; @@ -15,7 +15,7 @@ public override bool Is(string path, byte[]? data, out ISoulsFile? file) public override bool? IsSimple(string path) { - string filename = Path.GetFileName(path).ToLower(); + string filename = OSPath.GetFileName(path).ToLower(); return filename.EndsWith(".entryfilelist"); } diff --git a/WitchyBND/Parsers/XML/Serialized/WFXR1.cs b/WitchyBND/Parsers/XML/Serialized/WFXR1.cs index b26d111d..663743ab 100644 --- a/WitchyBND/Parsers/XML/Serialized/WFXR1.cs +++ b/WitchyBND/Parsers/XML/Serialized/WFXR1.cs @@ -20,7 +20,7 @@ public override bool Is(string path, byte[]? data, out ISoulsFile? file) public override bool? IsSimple(string path) { - string filename = Path.GetFileName(path).ToLower(); + string filename = OSPath.GetFileName(path).ToLower(); return filename.EndsWith(".ffx") ; } diff --git a/WitchyBND/Parsers/XML/Serialized/WFXR3.cs b/WitchyBND/Parsers/XML/Serialized/WFXR3.cs index 9a9803a3..55961609 100644 --- a/WitchyBND/Parsers/XML/Serialized/WFXR3.cs +++ b/WitchyBND/Parsers/XML/Serialized/WFXR3.cs @@ -20,7 +20,7 @@ public override bool Is(string path, byte[]? data, out ISoulsFile? file) public override bool? IsSimple(string path) { - string filename = Path.GetFileName(path).ToLower(); + string filename = OSPath.GetFileName(path).ToLower(); return filename.EndsWith(".fxr") ; } } \ No newline at end of file diff --git a/WitchyBND/Parsers/XML/Serialized/WMATBIN.cs b/WitchyBND/Parsers/XML/Serialized/WMATBIN.cs index 10834237..757df1b7 100644 --- a/WitchyBND/Parsers/XML/Serialized/WMATBIN.cs +++ b/WitchyBND/Parsers/XML/Serialized/WMATBIN.cs @@ -21,13 +21,13 @@ public override bool Is(string path, byte[]? data, out ISoulsFile? file) public override bool? IsSimple(string path) { - string filename = Path.GetFileName(path).ToLower(); + string filename = OSPath.GetFileName(path).ToLower(); return filename.EndsWith(".matbin") || filename.EndsWith(".matbin.dcx"); } public override bool IsUnpacked(string path) { - if (Path.GetExtension(path) != ".xml") + if (OSPath.GetExtension(path).ToLower() != ".xml") return false; var doc = XDocument.Load(path); diff --git a/WitchyBND/Parsers/XML/Serialized/WMTD.cs b/WitchyBND/Parsers/XML/Serialized/WMTD.cs index 36cb749e..bd5765b7 100644 --- a/WitchyBND/Parsers/XML/Serialized/WMTD.cs +++ b/WitchyBND/Parsers/XML/Serialized/WMTD.cs @@ -20,7 +20,7 @@ public override bool Is(string path, byte[]? data, out ISoulsFile? file) public override bool? IsSimple(string path) { - string filename = Path.GetFileName(path); + string filename = OSPath.GetFileName(path).ToLower(); return filename.EndsWith(".mtd") || filename.EndsWith(".mtd.dcx"); } } \ No newline at end of file diff --git a/WitchyBND/Parsers/XML/WDBSUB.cs b/WitchyBND/Parsers/XML/WDBSUB.cs index e0078a72..e376d701 100644 --- a/WitchyBND/Parsers/XML/WDBSUB.cs +++ b/WitchyBND/Parsers/XML/WDBSUB.cs @@ -21,8 +21,8 @@ public override bool Is(string path, byte[]? data, out ISoulsFile? file) public override bool? IsSimple(string path) { - var filename = Path.GetFileName(path).ToLower(); - return Path.GetExtension(filename) == ".bin" && (filename.StartsWith("chapter_") || + var filename = OSPath.GetFileName(path).ToLower(); + return OSPath.GetExtension(filename) == ".bin" && (filename.StartsWith("chapter_") || filename.EndsWith("_b0.bin") || filename.EndsWith("_d0.bin")); } diff --git a/WitchyBND/Parsers/XML/WFMG.cs b/WitchyBND/Parsers/XML/WFMG.cs index 6cf1169b..9e92a21f 100644 --- a/WitchyBND/Parsers/XML/WFMG.cs +++ b/WitchyBND/Parsers/XML/WFMG.cs @@ -14,7 +14,7 @@ public class WFMG : WXMLParser public override bool Is(string path, byte[]? _, out ISoulsFile? file) { file = null; - return Path.GetExtension(path).ToLower() == ".fmg"; + return OSPath.GetExtension(path).ToLower() == ".fmg"; } public override bool? IsSimple(string path) diff --git a/WitchyBND/Parsers/XML/WLUAGNL.cs b/WitchyBND/Parsers/XML/WLUAGNL.cs index d6553ed2..d920a298 100644 --- a/WitchyBND/Parsers/XML/WLUAGNL.cs +++ b/WitchyBND/Parsers/XML/WLUAGNL.cs @@ -14,7 +14,7 @@ public class WLUAGNL : WXMLParser public override bool Is(string path, byte[]? data, out ISoulsFile? file) { file = null; - return Path.GetExtension(path).ToLower() == ".luagnl"; + return OSPath.GetExtension(path).ToLower() == ".luagnl"; } public override bool? IsSimple(string path) diff --git a/WitchyBND/Parsers/XML/WLUAINFO.cs b/WitchyBND/Parsers/XML/WLUAINFO.cs index ef2eee49..64cd414e 100644 --- a/WitchyBND/Parsers/XML/WLUAINFO.cs +++ b/WitchyBND/Parsers/XML/WLUAINFO.cs @@ -18,7 +18,7 @@ public override bool Is(string path, byte[]? data, out ISoulsFile? file) public override bool? IsSimple(string path) { - string filename = Path.GetFileName(path); + string filename = OSPath.GetFileName(path); return filename.EndsWith(".luainfo"); } diff --git a/WitchyBND/Parsers/XML/WMQB/WMQB.Unpack.cs b/WitchyBND/Parsers/XML/WMQB/WMQB.Unpack.cs index 39e35bce..ecaabb62 100644 --- a/WitchyBND/Parsers/XML/WMQB/WMQB.Unpack.cs +++ b/WitchyBND/Parsers/XML/WMQB/WMQB.Unpack.cs @@ -13,7 +13,7 @@ public partial class WMQB public override void Unpack(string srcPath, ISoulsFile? file, bool recursive) { var mqb = (file as MQB)!; - var filename = Path.GetFileName(srcPath); + var filename = OSPath.GetFileName(srcPath); var xml = PrepareXmlManifest(srcPath, recursive, true, mqb.Compression, out XDocument xDoc, null); diff --git a/WitchyBND/Parsers/XML/WPARAM/WPARAM.Unpack.cs b/WitchyBND/Parsers/XML/WPARAM/WPARAM.Unpack.cs index 2196ef51..cc0a25ad 100644 --- a/WitchyBND/Parsers/XML/WPARAM/WPARAM.Unpack.cs +++ b/WitchyBND/Parsers/XML/WPARAM/WPARAM.Unpack.cs @@ -33,7 +33,7 @@ public void Unpack(string srcPath, ISoulsFile? file, bool recursive, bool dry, ( var param = (file as FsParam)!; string? paramTypeToParamdef = param.ParamType; - string paramName = Path.GetFileNameWithoutExtension(srcPath); + string paramName = OSPath.GetFileNameWithoutExtension(srcPath); // Fixed cell style for now. CellStyle cellStyle = Configuration.Active.ParamCellStyle; diff --git a/WitchyBND/Parsers/XML/WPARAM/WPARAM.cs b/WitchyBND/Parsers/XML/WPARAM/WPARAM.cs index 4d51da06..ef70e273 100644 --- a/WitchyBND/Parsers/XML/WPARAM/WPARAM.cs +++ b/WitchyBND/Parsers/XML/WPARAM/WPARAM.cs @@ -60,7 +60,7 @@ public override bool Is(string path, byte[]? _, out ISoulsFile? file) public override bool? IsSimple(string path) { - string filename = Path.GetFileName(path).ToLower(); + string filename = OSPath.GetFileName(path).ToLower(); return filename.EndsWith(".param"); } diff --git a/WitchyBND/Parsers/XML/WTAE/WTAE.File.Unpack.cs b/WitchyBND/Parsers/XML/WTAE/WTAE.File.Unpack.cs index 0ef2b2b0..d8c2f1d0 100644 --- a/WitchyBND/Parsers/XML/WTAE/WTAE.File.Unpack.cs +++ b/WitchyBND/Parsers/XML/WTAE/WTAE.File.Unpack.cs @@ -21,7 +21,7 @@ public override bool Is(string path, byte[]? data, out ISoulsFile? file) public override bool? IsSimple(string path) { - string filename = Path.GetFileName(path).ToLower(); + string filename = OSPath.GetFileName(path).ToLower(); return !Configuration.Active.TaeFolder && filename.EndsWith(".tae"); } diff --git a/WitchyBND/ProcessHandling.cs b/WitchyBND/ProcessHandling.cs index b512ed37..30191009 100644 --- a/WitchyBND/ProcessHandling.cs +++ b/WitchyBND/ProcessHandling.cs @@ -13,8 +13,8 @@ public static int RunProcess(string exePath, out string output, out string error { Process process = new Process(); // Configure the process using the StartInfo properties. - process.StartInfo.FileName = Path.GetFullPath(exePath); - process.StartInfo.WorkingDirectory = workingDir ?? Path.GetDirectoryName(exePath)!; + process.StartInfo.FileName = OSPath.GetFullPath(exePath); + process.StartInfo.WorkingDirectory = workingDir ?? OSPath.GetDirectoryName(exePath)!; process.StartInfo.Arguments = args; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; diff --git a/WitchyBND/Program.cs b/WitchyBND/Program.cs index 33c1d7b6..65c62994 100644 --- a/WitchyBND/Program.cs +++ b/WitchyBND/Program.cs @@ -143,7 +143,7 @@ static int Main(string[] args) if (!string.IsNullOrEmpty(location)) { - location = Path.GetFullPath(location); + location = OSPath.GetFullPath(location); if (!Directory.Exists(location)) { @@ -299,7 +299,7 @@ public static void DisplayHelp(ParserResult result = null, IEnumerab public static void DisplayHelp(ParserResult result = null, IEnumerable errors = null) { var assembly = Assembly.GetExecutingAssembly(); - var versionInfo = FileVersionInfo.GetVersionInfo(Path.Combine(AppContext.BaseDirectory, "WitchyBND.exe")); + var versionInfo = FileVersionInfo.GetVersionInfo(OSPath.Combine(AppContext.BaseDirectory, "WitchyBND.exe")); var companyName = versionInfo.CompanyName; if (result == null) diff --git a/WitchyBND/SendTo.cs b/WitchyBND/SendTo.cs index 918ea6cf..7d74236e 100644 --- a/WitchyBND/SendTo.cs +++ b/WitchyBND/SendTo.cs @@ -1,34 +1,35 @@ using System; using System.IO; using ShellLink; +using WitchyLib; namespace WitchyBND; public static class SendTo { private static readonly string sendToPath = Environment.GetFolderPath(Environment.SpecialFolder.SendTo); - private static readonly string witchyPath = Path.Combine(AppContext.BaseDirectory, "WitchyBND.exe"); - private static readonly string shortcutPath = Path.Combine(sendToPath, "WitchyBND.lnk"); - private static readonly string shortcutPathRecursive = Path.Combine(sendToPath, "WitchyBND (Recursive).lnk"); - private static readonly string shortcutPathDcx = Path.Combine(sendToPath, "WitchyBND (DCX).lnk"); - private static readonly string shortcutPathTo = Path.Combine(sendToPath, "WitchyBND to....lnk"); - private static readonly string shortcutPathRecursiveTo = Path.Combine(sendToPath, "WitchyBND to... (Recursive).lnk"); - private static readonly string shortcutPathDcxTo = Path.Combine(sendToPath, "WitchyBND to... (DCX).lnk"); + private static readonly string witchyPath = OSPath.Combine(AppContext.BaseDirectory, "WitchyBND.exe"); + private static readonly string shortcutPath = OSPath.Combine(sendToPath, "WitchyBND.lnk"); + private static readonly string shortcutPathRecursive = OSPath.Combine(sendToPath, "WitchyBND (Recursive).lnk"); + private static readonly string shortcutPathDcx = OSPath.Combine(sendToPath, "WitchyBND (DCX).lnk"); + private static readonly string shortcutPathTo = OSPath.Combine(sendToPath, "WitchyBND to....lnk"); + private static readonly string shortcutPathRecursiveTo = OSPath.Combine(sendToPath, "WitchyBND to... (Recursive).lnk"); + private static readonly string shortcutPathDcxTo = OSPath.Combine(sendToPath, "WitchyBND to... (DCX).lnk"); public static void AddSendToShortcuts() { DeleteSendToShortcuts(); - Shortcut.CreateShortcut(witchyPath, "", Path.GetDirectoryName(witchyPath)) + Shortcut.CreateShortcut(witchyPath, "", OSPath.GetDirectoryName(witchyPath)) .WriteToFile(shortcutPath); - Shortcut.CreateShortcut(witchyPath, "--recursive", Path.GetDirectoryName(witchyPath), witchyPath, 0) + Shortcut.CreateShortcut(witchyPath, "--recursive", OSPath.GetDirectoryName(witchyPath), witchyPath, 0) .WriteToFile(shortcutPathRecursive); - Shortcut.CreateShortcut(witchyPath, "--dcx", Path.GetDirectoryName(witchyPath), witchyPath, 0) + Shortcut.CreateShortcut(witchyPath, "--dcx", OSPath.GetDirectoryName(witchyPath), witchyPath, 0) .WriteToFile(shortcutPathDcx); - Shortcut.CreateShortcut(witchyPath, "--location prompt", Path.GetDirectoryName(witchyPath)) + Shortcut.CreateShortcut(witchyPath, "--location prompt", OSPath.GetDirectoryName(witchyPath)) .WriteToFile(shortcutPathTo); - Shortcut.CreateShortcut(witchyPath, "--location prompt --recursive", Path.GetDirectoryName(witchyPath), witchyPath, 0) + Shortcut.CreateShortcut(witchyPath, "--location prompt --recursive", OSPath.GetDirectoryName(witchyPath), witchyPath, 0) .WriteToFile(shortcutPathRecursiveTo); - Shortcut.CreateShortcut(witchyPath, "--location prompt --dcx", Path.GetDirectoryName(witchyPath), witchyPath, 0) + Shortcut.CreateShortcut(witchyPath, "--location prompt --dcx", OSPath.GetDirectoryName(witchyPath), witchyPath, 0) .WriteToFile(shortcutPathDcxTo); } diff --git a/WitchyBND/Services/GameService.cs b/WitchyBND/Services/GameService.cs index 0f42ef58..8ecc8322 100644 --- a/WitchyBND/Services/GameService.cs +++ b/WitchyBND/Services/GameService.cs @@ -104,7 +104,7 @@ public GameService(IErrorService errorService, IOutputService outputService) public void PopulateTentativeAC6Types() { - var tentativeTypePath = Path.Combine(WBUtil.GetParamdexPath(), "AC6", "Defs", "TentativeParamType.csv"); + var tentativeTypePath = OSPath.Combine(WBUtil.GetParamdexPath(), "AC6", "Defs", "TentativeParamType.csv"); if (File.Exists(tentativeTypePath)) { @@ -122,7 +122,7 @@ public void PopulateTentativeAC6Types() WBUtil.GameType? game = null, ulong regVer = 0) { UnpackParamdex(); - string knownPath = File.Exists(path) ? Path.GetDirectoryName(path)! : path; + string knownPath = File.Exists(path) ? OSPath.GetDirectoryName(path)! : path; // Determine what kind of PARAM we're dealing with here if (type == IGameService.GameDeterminationType.PARAM || type == IGameService.GameDeterminationType.PARAMBND) @@ -152,7 +152,7 @@ public void PopulateTentativeAC6Types() } } - knownPath = Path.GetDirectoryName(xmlPath); + knownPath = OSPath.GetDirectoryName(xmlPath); } } else @@ -174,7 +174,7 @@ public void PopulateTentativeAC6Types() Regex.Match(s, @"\s*?""GameType"":\s(.*?),")).FirstOrDefault(s => s.Success); var dsmsGameType = Enum.Parse(gameType.Groups[1].Value); game = DsmsGameTypeToWitchyGameType(dsmsGameType); - knownPath = Path.GetDirectoryName(pJsonPath); + knownPath = OSPath.GetDirectoryName(pJsonPath); } catch (Exception e) { @@ -192,7 +192,7 @@ public void PopulateTentativeAC6Types() if (traversePath != null) { game = exeGame; - knownPath = Path.GetDirectoryName(traversePath)!; + knownPath = OSPath.GetDirectoryName(traversePath)!; } } } @@ -215,7 +215,7 @@ public void PopulateTentativeAC6Types() } game = select.Content; - knownPath = Path.GetDirectoryName(path); + knownPath = OSPath.GetDirectoryName(path); } else { @@ -320,7 +320,7 @@ public void PopulateParamdex(WBUtil.GameType game) throw new DirectoryNotFoundException($"Could not locate Assets{Path.DirectorySeparatorChar}Paramdex folder."); var gameName = game.ToString(); - var paramdefPath = Path.Combine(paramdexPath, gameName, "Defs"); + var paramdefPath = OSPath.Combine(paramdexPath, gameName, "Defs"); if (!Directory.Exists(paramdefPath)) { @@ -389,7 +389,7 @@ public void PopulateNames(WBUtil.GameType game, string paramName) return; var gameName = game.ToString(); - var namePath = Path.Combine(WBUtil.GetParamdexPath($@"{gameName}\Names\{paramName}.txt")); + var namePath = OSPath.Combine(WBUtil.GetParamdexPath(OSPath.Combine(gameName, "Names", $"{paramName}.txt"))); if (!File.Exists(namePath)) { @@ -418,7 +418,7 @@ public void PopulateNames(WBUtil.GameType game, string paramName) } catch (Exception e) { - throw new InvalidDataException($"There was something wrong with the Paramdex names at \"{name}\" in {Path.GetFileNameWithoutExtension(namePath)}", + throw new InvalidDataException($"There was something wrong with the Paramdex names at \"{name}\" in {OSPath.GetFileNameWithoutExtension(namePath)}", e); } } diff --git a/WitchyBND/Services/UpdateService.cs b/WitchyBND/Services/UpdateService.cs index 7cb3f787..66a750d2 100644 --- a/WitchyBND/Services/UpdateService.cs +++ b/WitchyBND/Services/UpdateService.cs @@ -192,7 +192,7 @@ public void PostUpdateActions() if (Configuration.Stored.LastLaunchedVersion < new Version(2, 9, 0, 0)) { var userConfig = WBUtil.GetExeLocation("appsettings.user.json"); - var newConfigPath = Path.Combine(Configuration.AppDataDirectory, "appsettings.user.json"); + var newConfigPath = OSPath.Combine(Configuration.AppDataDirectory, "appsettings.user.json"); if (File.Exists(userConfig)) File.Move(userConfig, newConfigPath, true); } @@ -207,7 +207,7 @@ public void PostUpdateActions() // 2.11.0.1: Fix old PATH if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && Configuration.Stored.LastLaunchedVersion < new Version(2, 11, 0, 1)) { - var exePath = Path.GetDirectoryName(AppContext.BaseDirectory)!; + var exePath = OSPath.GetDirectoryName(AppContext.BaseDirectory)!; var name = "PATH"; var scope = EnvironmentVariableTarget.User; var oldValue = Environment.GetEnvironmentVariable(name, scope); @@ -349,9 +349,9 @@ async Task downloadLatest(Version onlineVersion, string downloadUrl) } await using Stream? data = e.Open(); - var filePath = Path.Combine(WBUtil.GetExeLocation(), + var filePath = OSPath.Combine(WBUtil.GetExeLocation(), e.FullName.Replace('/', Path.DirectorySeparatorChar)); - var fileDir = Path.GetDirectoryName(filePath)!; + var fileDir = OSPath.GetDirectoryName(filePath)!; if (File.Exists(filePath)) throw new Exception($"File {filePath} already exists and was not removed properly."); diff --git a/WitchyLib/CrossPlatform.cs b/WitchyLib/CrossPlatform.cs new file mode 100644 index 00000000..0b59e010 --- /dev/null +++ b/WitchyLib/CrossPlatform.cs @@ -0,0 +1,1088 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml.Linq; +using Microsoft.Extensions.FileSystemGlobbing; + +namespace WitchyLib; + +public static class BndPath +{ + + private static readonly Regex DriveRx = new Regex(@"^(\w\:\\)(.+)$"); + private static readonly Regex TraversalRx = new Regex(@"^([(..)\\\/]+)(.+)?$"); + private static readonly Regex SlashRx = new Regex(@"^(\\+)(.+)$"); + + public static string Combine(params string[] paths) + { + ArgumentNullException.ThrowIfNull(paths); + return Combine((ReadOnlySpan)paths); + } + + ///

+ /// Combines a span of strings into a path. + /// + /// A span of parts of the path. + /// The combined paths. + public static string Combine(params ReadOnlySpan paths) + { + int maxSize = 0; + int firstComponent = 0; + + // We have two passes, the first calculates how large a buffer to allocate and does some precondition + // checks on the paths passed in. The second actually does the combination. + + for (int i = 0; i < paths.Length; i++) + { + ArgumentNullException.ThrowIfNull(paths[i], nameof(paths)); + + if (paths[i].Length == 0) + { + continue; + } + + if (IsPathRooted(paths[i])) + { + firstComponent = i; + maxSize = paths[i].Length; + } + else + { + maxSize += paths[i].Length; + } + + char ch = paths[i][^1]; + if (!IsDirectorySeparator(ch)) + maxSize++; + } + + var builder = new StringBuilder(); // MaxShortPath on Windows + builder.EnsureCapacity(maxSize); + + for (int i = firstComponent; i < paths.Length; i++) + { + if (paths[i].Length == 0) + { + continue; + } + + if (builder.Length == 0) + { + builder.Append(paths[i]); + } + else + { + char ch = builder[^1]; + if (!IsDirectorySeparator(ch)) + { + builder.Append('\\'); + } + + builder.Append(paths[i]); + } + } + + return builder.ToString(); + } + + [return: NotNullIfNotNull(nameof(path))] + public static string? GetFileName(string? path) + { + if (path == null) + return null; + + ReadOnlySpan result = GetFileName(path.AsSpan()); + if (path.Length == result.Length) + return path; + + return result.ToString(); + } + + internal static bool IsDirectorySeparator(char c) + { + return c == '\\'; + } + + /// + /// Normalize separators in the given path. Compresses forward slash runs. + /// + [return: NotNullIfNotNull(nameof(path))] + internal static string? NormalizeDirectorySeparators(string? path) + { + if (string.IsNullOrEmpty(path)) + return path; + + // Make a pass to see if we need to normalize so we can potentially skip allocating + bool normalized = true; + + for (int i = 0; i < path.Length; i++) + { + if (IsDirectorySeparator(path[i]) + && (i + 1 < path.Length && IsDirectorySeparator(path[i + 1]))) + { + normalized = false; + break; + } + } + + if (normalized) + return path; + + StringBuilder builder = new StringBuilder(path.Length); + + for (int i = 0; i < path.Length; i++) + { + char current = path[i]; + + // Skip if we have another separator following + if (IsDirectorySeparator(current) + && (i + 1 < path.Length && IsDirectorySeparator(path[i + 1]))) + continue; + + builder.Append(current); + } + + return builder.ToString(); + } + + /// + /// Returns the directory portion of a file path. This method effectively + /// removes the last segment of the given file path, i.e. it returns a + /// string consisting of all characters up to but not including the last + /// backslash ("\") in the file path. The returned value is null if the + /// specified path is null, empty, or a root (such as "\", "C:", or + /// "\\server\share"). + /// + /// + /// Directory separators are normalized in the returned string. + /// + public static string? GetDirectoryName(string? path) + { + if (path == null || IsEffectivelyEmpty(path.AsSpan())) + return null; + + int end = GetDirectoryNameOffset(path.AsSpan()); + return end >= 0 ? NormalizeDirectorySeparators(path.Substring(0, end)) : null; + } + + /// + /// Returns the directory portion of a file path. The returned value is empty + /// if the specified path is null, empty, or a root (such as "\", "C:", or + /// "\\server\share"). + /// + /// + /// Unlike the string overload, this method will not normalize directory separators. + /// + public static ReadOnlySpan GetDirectoryName(ReadOnlySpan path) + { + if (IsEffectivelyEmpty(path)) + return ReadOnlySpan.Empty; + + int end = GetDirectoryNameOffset(path); + return end >= 0 ? path.Slice(0, end) : ReadOnlySpan.Empty; + } + + internal static int GetRootLength(ReadOnlySpan path) + { + return path.Length > 0 && IsDirectorySeparator(path[0]) ? 1 : 0; + } + + internal static int GetDirectoryNameOffset(ReadOnlySpan path) + { + int rootLength = GetRootLength(path); + int end = path.Length; + if (end <= rootLength) + return -1; + + while (end > rootLength && !IsDirectorySeparator(path[--end])) ; + + // Trim off any remaining separators (to deal with C:\foo\\bar) + while (end > rootLength && IsDirectorySeparator(path[end - 1])) + end--; + + return end; + } + + /// + /// Returns true if the path is effectively empty for the current OS. + /// For unix, this is empty or null. For Windows, this is empty, null, or + /// just spaces ((char)32). + /// + internal static bool IsEffectivelyEmpty(string? path) + { + return string.IsNullOrEmpty(path); + } + + internal static bool IsEffectivelyEmpty(ReadOnlySpan path) + { + return path.IsEmpty; + } + + /// + /// Returns the path root or null if path is empty or null. + /// + public static string? GetPathRoot(string? path) + { + if (IsEffectivelyEmpty(path)) return null; + return IsPathRooted(path) ? "\\" : string.Empty; + } + + public static bool IsPathRooted(ReadOnlySpan path) + { + return path.StartsWith('\\'); + } + + public static ReadOnlySpan GetPathRoot(ReadOnlySpan path) + { + return IsPathRooted(path) ? "\\".AsSpan() : ReadOnlySpan.Empty; + } + + /// + /// The returned ReadOnlySpan contains the characters of the path that follows the last separator in path. + /// + public static ReadOnlySpan GetFileName(ReadOnlySpan path) + { + int root = GetPathRoot(path).Length; + + // We don't want to cut off "C:\file.txt:stream" (i.e. should be "file.txt:stream") + // but we *do* want "C:Foo" => "Foo". This necessitates checking for the root. + + int i = path.LastIndexOf("\\"); + + return path.Slice(i < root ? root : i + 1); + } + + private static string RemoveLeadingBackslashes(string path) + { + Match slash = SlashRx.Match(path); + if (slash.Success) + { + path = slash.Groups[2].Value; + } + + return path; + } + + /// + /// Removes common network path roots if present. + /// + public static string Unroot(string path, string root) + { + path = path.Substring(root?.Length ?? 0); + + Match drive = DriveRx.Match(path); + + if (drive.Success) + { + path = drive.Groups[2].Value; + } + + if (string.IsNullOrWhiteSpace(root)) + return RemoveLeadingBackslashes(path); + + Match traversal = TraversalRx.Match(path); + if (traversal.Success) + { + path = traversal.Groups[2].Value; + } + + if (path.Contains("..\\") || path.Contains("../")) + throw new InvalidDataException( + $"the path {path} contains invalid data, attempting to extract to a different folder."); + return RemoveLeadingBackslashes(path); + } + + /// + /// Finds common path prefix in a list of strings. + /// + public static string FindCommonBndRootPath(IEnumerable paths) + { + string root = ""; + + if (paths.Count() == 0) return root; + + var rootPath = new string( + paths.First().Substring(0, paths.Min(s => s.Length)) + .TakeWhile((c, i) => paths.All(s => s[i] == c)).ToArray()); + + // For safety, truncate this shared string down to the last slash/backslash. + var rootPathIndex = Math.Max(rootPath.LastIndexOf('\\'), rootPath.LastIndexOf('/')); + + if (rootPath != "" && rootPathIndex != -1) + { + root = rootPath.Substring(0, rootPathIndex); + } + + return root; + } + + [return: NotNullIfNotNull(nameof(path))] + public static string? GetFileNameWithoutExtension(string? path) + { + if (path == null) + return null; + + ReadOnlySpan result = GetFileNameWithoutExtension(path.AsSpan()); + if (path.Length == result.Length) + return path; + + return result.ToString(); + } + + /// + /// Returns the characters between the last separator and last (.) in the path. + /// + public static ReadOnlySpan GetFileNameWithoutExtension(ReadOnlySpan path) + { + ReadOnlySpan fileName = GetFileName(path); + int lastPeriod = fileName.LastIndexOf('.'); + return lastPeriod < 0 + ? fileName + : // No extension was found + fileName.Slice(0, lastPeriod); + } + + /// + /// Returns the extension of the given path. The returned value includes the period (".") character of the + /// extension except when you have a terminal period when you get string.Empty, such as ".exe" or ".cpp". + /// The returned value is null if the given path is null or empty if the given path does not include an + /// extension. + /// + [return: NotNullIfNotNull(nameof(path))] + public static string? GetExtension(string? path) + { + if (path == null) + return null; + + return GetExtension(path.AsSpan()).ToString(); + } + + /// + /// Returns the extension of the given path. + /// + /// + /// The returned value is an empty ReadOnlySpan if the given path does not include an extension. + /// + public static ReadOnlySpan GetExtension(ReadOnlySpan path) + { + int length = path.Length; + + for (int i = length - 1; i >= 0; i--) + { + char ch = path[i]; + if (ch == '.') + { + if (i != length - 1) + return path.Slice(i, length - i); + else + return ReadOnlySpan.Empty; + } + + if (IsDirectorySeparator(ch)) + break; + } + + return ReadOnlySpan.Empty; + } + + // Changes the extension of a file path. The path parameter + // specifies a file path, and the extension parameter + // specifies a file extension (with a leading period, such as + // ".exe" or ".cs"). + // + // The function returns a file path with the same root, directory, and base + // name parts as path, but with the file extension changed to + // the specified extension. If path is null, the function + // returns null. If path does not contain a file extension, + // the new file extension is appended to the path. If extension + // is null, any existing extension is removed from path. + [return: NotNullIfNotNull(nameof(path))] + public static string? ChangeExtension(string? path, string? extension) + { + if (path == null) + return null; + + int subLength = path.Length; + if (subLength == 0) + return string.Empty; + + for (int i = path.Length - 1; i >= 0; i--) + { + char ch = path[i]; + + if (ch == '.') + { + subLength = i; + break; + } + + if (IsDirectorySeparator(ch)) + { + break; + } + } + + if (extension == null) + { + return path.Substring(0, subLength); + } + + ReadOnlySpan subpath = path.AsSpan(0, subLength); + return extension.StartsWith('.') ? string.Concat(subpath, extension) : string.Concat(subpath, ".", extension); + } + + /// + /// Gets the count of common characters from the left optionally ignoring case + /// + internal static unsafe int EqualStartingCharacterCount(string? first, string? second, bool ignoreCase) + { + if (string.IsNullOrEmpty(first) || string.IsNullOrEmpty(second)) return 0; + + int commonChars = 0; + + fixed (char* f = first) + fixed (char* s = second) + { + char* l = f; + char* r = s; + char* leftEnd = l + first.Length; + char* rightEnd = r + second.Length; + + while (l != leftEnd && r != rightEnd + && (*l == *r || (ignoreCase && char.ToUpperInvariant(*l) == char.ToUpperInvariant(*r)))) + { + commonChars++; + l++; + r++; + } + } + + return commonChars; + } + + /// + /// Get the common path length from the start of the string. + /// + internal static int GetCommonPathLength(string first, string second, bool ignoreCase) + { + int commonChars = EqualStartingCharacterCount(first, second, ignoreCase: ignoreCase); + + // If nothing matches + if (commonChars == 0) + return commonChars; + + // Or we're a full string and equal length or match to a separator + if (commonChars == first.Length + && (commonChars == second.Length || IsDirectorySeparator(second[commonChars]))) + return commonChars; + + if (commonChars == second.Length && IsDirectorySeparator(first[commonChars])) + return commonChars; + + // It's possible we matched somewhere in the middle of a segment e.g. C:\Foodie and C:\Foobar. + while (commonChars > 0 && !IsDirectorySeparator(first[commonChars - 1])) + commonChars--; + + return commonChars; + } + + /// + /// Create a relative path from one path to another. Paths will be resolved before calculating the difference. + /// Default path comparison for the active platform will be used (OrdinalIgnoreCase for Windows or Mac, Ordinal for Unix). + /// + /// The source path the output should be relative to. This path is always considered to be a directory. + /// The destination path. + /// The relative path or if the paths don't share the same root. + /// Thrown if or is null or an empty string. + public static string GetRelativePath(string relativeTo, string path) + { + return GetRelativePath(relativeTo, path, StringComparison.CurrentCulture); + } + + private static string GetRelativePath(string relativeTo, string path, StringComparison comparisonType) + { + ArgumentNullException.ThrowIfNull(relativeTo); + ArgumentNullException.ThrowIfNull(path); + + if (IsEffectivelyEmpty(relativeTo.AsSpan())) + throw new ArgumentException(nameof(relativeTo)); + if (IsEffectivelyEmpty(path.AsSpan())) + throw new ArgumentException(nameof(path)); + + relativeTo = GetFullPath(relativeTo); + path = GetFullPath(path); + + // Need to check if the roots are different- if they are we need to return the "to" path. + if (!AreRootsEqual(relativeTo, path, comparisonType)) + return path; + + int commonLength = GetCommonPathLength(relativeTo, path, + ignoreCase: comparisonType == StringComparison.OrdinalIgnoreCase); + + // If there is nothing in common they can't share the same root, return the "to" path as is. + if (commonLength == 0) + return path; + + // Trailing separators aren't significant for comparison + int relativeToLength = relativeTo.Length; + if (EndsInDirectorySeparator(relativeTo.AsSpan())) + relativeToLength--; + + bool pathEndsInSeparator = EndsInDirectorySeparator(path.AsSpan()); + int pathLength = path.Length; + if (pathEndsInSeparator) + pathLength--; + + // If we have effectively the same path, return "." + if (relativeToLength == pathLength && commonLength >= relativeToLength) return "."; + + // We have the same root, we need to calculate the difference now using the + // common Length and Segment count past the length. + // + // Some examples: + // + // C:\Foo C:\Bar L3, S1 -> ..\Bar + // C:\Foo C:\Foo\Bar L6, S0 -> Bar + // C:\Foo\Bar C:\Bar\Bar L3, S2 -> ..\..\Bar\Bar + // C:\Foo\Foo C:\Foo\Bar L7, S1 -> ..\Bar + + var sb = new StringBuilder(); + sb.EnsureCapacity(Math.Max(relativeTo.Length, path.Length)); + + // Add parent segments for segments past the common on the "from" path + if (commonLength < relativeToLength) + { + sb.Append(".."); + + for (int i = commonLength + 1; i < relativeToLength; i++) + { + if (IsDirectorySeparator(relativeTo[i])) + { + sb.Append('\\'); + sb.Append(".."); + } + } + } + else if (IsDirectorySeparator(path[commonLength])) + { + // No parent segments and we need to eat the initial separator + // (C:\Foo C:\Foo\Bar case) + commonLength++; + } + + // Now add the rest of the "to" path, adding back the trailing separator + int differenceLength = pathLength - commonLength; + if (pathEndsInSeparator) + differenceLength++; + + if (differenceLength > 0) + { + if (sb.Length > 0) + { + sb.Append('\\'); + } + + sb.Append(path.AsSpan(commonLength, differenceLength)); + } + + return sb.ToString(); + } + + /// + /// Returns true if the path ends in a directory separator. + /// + internal static bool EndsInDirectorySeparator([NotNullWhen(true)] string? path) => + !string.IsNullOrEmpty(path) && IsDirectorySeparator(path[^1]); + + /// + /// Trims one trailing directory separator beyond the root of the path. + /// + internal static ReadOnlySpan TrimEndingDirectorySeparator(ReadOnlySpan path) => + EndsInDirectorySeparator(path) && !IsRoot(path) ? path.Slice(0, path.Length - 1) : path; + + /// + /// Returns true if the path ends in a directory separator. + /// + internal static bool EndsInDirectorySeparator(ReadOnlySpan path) => + path.Length > 0 && IsDirectorySeparator(path[^1]); + + internal static bool IsRoot(ReadOnlySpan path) + => path.Length == GetRootLength(path); + + + // Expands the given path to a fully qualified path. + public static string GetFullPath(string path) + { + ArgumentException.ThrowIfNullOrEmpty(path); + + if (path.Contains('\0')) + throw new ArgumentException(nameof(path)); + + return GetFullPathInternal(path); + } + + public static string GetFullPath(string path, string basePath) + { + ArgumentNullException.ThrowIfNull(path); + ArgumentNullException.ThrowIfNull(basePath); + + if (!IsPathFullyQualified(basePath)) + throw new ArgumentException(nameof(basePath)); + + if (basePath.Contains('\0') || path.Contains('\0')) + throw new ArgumentException("null char in path"); + + if (IsPathFullyQualified(path)) + return GetFullPathInternal(path); + + return GetFullPathInternal(CombineInternal(basePath, path)); + } + + // Gets the full path without argument validation + private static string GetFullPathInternal(string path) + { + // Expand with current directory if necessary + if (!IsPathRooted(path)) + { + path = Combine(WBUtil.GetExecutablePath(), path); + } + + // We would ideally use realpath to do this, but it resolves symlinks and requires that the file actually exist. + string collapsedString = RemoveRelativeSegments(path, GetRootLength(path)); + + string result = collapsedString.Length == 0 ? "\\" : collapsedString; + + return result; + } + + public static bool IsPathFullyQualified(string path) + { + ArgumentNullException.ThrowIfNull(path); + + return IsPathFullyQualified(path.AsSpan()); + } + + public static bool IsPathFullyQualified(ReadOnlySpan path) + { + return !IsPartiallyQualified(path); + } + + internal static bool IsPartiallyQualified(ReadOnlySpan path) + { + // This is much simpler than Windows where paths can be rooted, but not fully qualified (such as Drive Relative) + // As long as the path is rooted in Unix it doesn't use the current directory and therefore is fully qualified. + return !IsPathRooted(path); + } + + + /// + /// Try to remove relative segments from the given path (without combining with a root). + /// + /// Input path + /// The length of the root of the given path + internal static string RemoveRelativeSegments(string path, int rootLength) + { + var sb = new StringBuilder(); + + if (RemoveRelativeSegments(path.AsSpan(), rootLength, ref sb)) + { + path = sb.ToString(); + } + + return path; + } + + /// + /// Try to remove relative segments from the given path (without combining with a root). + /// + /// Input path + /// The length of the root of the given path + /// String builder that will store the result + /// "true" if the path was modified + internal static bool RemoveRelativeSegments(ReadOnlySpan path, int rootLength, ref StringBuilder sb) + { + bool flippedSeparator = false; + + int skip = rootLength; + // We treat "\.." , "\." and "\\" as a relative segment. We want to collapse the first separator past the root presuming + // the root actually ends in a separator. Otherwise the first segment for RemoveRelativeSegments + // in cases like "\\?\C:\.\" and "\\?\C:\..\", the first segment after the root will be ".\" and "..\" which is not considered as a relative segment and hence not be removed. + if (IsDirectorySeparator(path[skip - 1])) + skip--; + + // Remove "//", "/./", and "/../" from the path by copying each character to the output, + // except the ones we're removing, such that the builder contains the normalized path + // at the end. + if (skip > 0) + { + sb.Append(path.Slice(0, skip)); + } + + for (int i = skip; i < path.Length; i++) + { + char c = path[i]; + + if (IsDirectorySeparator(c) && i + 1 < path.Length) + { + // Skip this character if it's a directory separator and if the next character is, too, + // e.g. "parent//child" => "parent/child" + if (IsDirectorySeparator(path[i + 1])) + { + continue; + } + + // Skip this character and the next if it's referring to the current directory, + // e.g. "parent/./child" => "parent/child" + if ((i + 2 == path.Length || IsDirectorySeparator(path[i + 2])) && + path[i + 1] == '.') + { + i++; + continue; + } + + // Skip this character and the next two if it's referring to the parent directory, + // e.g. "parent/child/../grandchild" => "parent/grandchild" + if (i + 2 < path.Length && + (i + 3 == path.Length || IsDirectorySeparator(path[i + 3])) && + path[i + 1] == '.' && path[i + 2] == '.') + { + // Unwind back to the last slash (and if there isn't one, clear out everything). + int s; + for (s = sb.Length - 1; s >= skip; s--) + { + if (IsDirectorySeparator(sb[s])) + { + sb.Length = (i + 3 >= path.Length && s == skip) + ? s + 1 + : s; // to avoid removing the complete "\tmp\" segment in cases like \\?\C:\tmp\..\, C:\tmp\.. + break; + } + } + + if (s < skip) + { + sb.Length = skip; + } + + i += 2; + continue; + } + } + + sb.Append(c); + } + + // If we haven't changed the source path, return the original + if (!flippedSeparator && sb.Length == path.Length) + { + return false; + } + + // We may have eaten the trailing separator from the root when we started and not replaced it + if (skip != rootLength && sb.Length < rootLength) + { + sb.Append(path[rootLength - 1]); + } + + return true; + } + + /// + /// Returns true if the two paths have the same root + /// + internal static bool AreRootsEqual(string? first, string? second, StringComparison comparisonType) + { + int firstRootLength = GetRootLength(first.AsSpan()); + int secondRootLength = GetRootLength(second.AsSpan()); + + return firstRootLength == secondRootLength + && string.Compare( + strA: first, + indexA: 0, + strB: second, + indexB: 0, + length: firstRootLength, + comparisonType: comparisonType) == 0; + } + + private static string CombineInternal(string first, string second) + { + if (string.IsNullOrEmpty(first)) + return second; + + if (string.IsNullOrEmpty(second)) + return first; + + if (IsPathRooted(second.AsSpan())) + return second; + + return JoinInternal(first.AsSpan(), second.AsSpan()); + } + + private static string JoinInternal(ReadOnlySpan first, ReadOnlySpan second) + { + bool hasSeparator = IsDirectorySeparator(first[^1]) || IsDirectorySeparator(second[0]); + + return hasSeparator ? string.Concat(first, second) : string.Concat(first, "\\", second); + } + + public static string GetFileNameWithoutAnyExtensions(string path) + { + return GetFileName(path).Split(".").First(); + } + + public static string GetFullExtensions(string path) + { + var split = GetFileName(path).Split("."); + if (split.Length > 1) + return "." + string.Join(".", GetFileName(path).Split(".").Skip(1)); + return ""; + } + + public static void WriteSanitizedBinderFilePath(this XElement element, string path, string pathElementName = "path") + { + string dir = Path.GetDirectoryName(path) ?? ""; + string filename = Path.GetFileName(path); + string sanitized = OSPath.SanitizeFilename(path); + + if (filename == sanitized) + { + element.Add(new XElement(pathElementName, path)); + } + else + { + element.Add(new XElement("in" + pathElementName.FirstCharToUpper(), path)); + element.Add(new XElement("out" + pathElementName.FirstCharToUpper(), Path.Combine(dir, sanitized))); + } + } + + public static string GetSanitizedBinderFilePath(this XElement element, string pathElementName = "path", + bool outName = false) + { + if (element.Element(pathElementName) != null) + return element.Element(pathElementName)!.Value; + var otherName = + outName ? "out" + pathElementName.FirstCharToUpper() : "in" + pathElementName.FirstCharToUpper(); + if (element.Element(otherName) != null) + return element.Element(otherName)!.Value; + + throw new InvalidDataException("File element is missing path."); + } +} + +public static class OSPath +{ + public static string Combine(params string[] paths) + { + return Path.Combine(paths); + } + + /// + /// Returns the name and extension parts of the given path. The resulting string contains + /// the characters of path that follow the last separator in path. The resulting string is + /// null if path is null. + /// + [return: NotNullIfNotNull(nameof(path))] + public static string? GetFileName(string? path) + { + return Path.GetFileName(path); + } + + /// + /// The returned ReadOnlySpan contains the characters of the path that follows the last separator in path. + /// + public static ReadOnlySpan GetFileName(ReadOnlySpan path) + { + return Path.GetFileName(path); + } + + /// + /// Returns the directory portion of a file path. This method effectively + /// removes the last segment of the given file path, i.e. it returns a + /// string consisting of all characters up to but not including the last + /// backslash ("\") in the file path. The returned value is null if the + /// specified path is null, empty, or a root (such as "\", "C:", or + /// "\\server\share"). + /// + /// + /// Directory separators are normalized in the returned string. + /// + public static string? GetDirectoryName(string? path) + { + return Path.GetDirectoryName(path); + } + + /// + /// Returns the directory portion of a file path. The returned value is empty + /// if the specified path is null, empty, or a root (such as "\", "C:", or + /// "\\server\share"). + /// + /// + /// Unlike the string overload, this method will not normalize directory separators. + /// + public static ReadOnlySpan GetDirectoryName(ReadOnlySpan path) + { + return Path.GetDirectoryName(path); + } + + // Expands the given path to a fully qualified path. + public static string GetFullPath(string path) + { + return Path.GetFullPath(path); + } + + public static string GetFullPath(string path, string basePath) + { + return Path.GetFullPath(path, basePath); + } + + [return: NotNullIfNotNull(nameof(path))] + public static string? GetFileNameWithoutExtension(string? path) + { + return Path.GetFileNameWithoutExtension(path); + } + + /// + /// Returns the characters between the last separator and last (.) in the path. + /// + public static ReadOnlySpan GetFileNameWithoutExtension(ReadOnlySpan path) + { + return Path.GetFileNameWithoutExtension(path); + } + + /// + /// Returns the extension of the given path. The returned value includes the period (".") character of the + /// extension except when you have a terminal period when you get string.Empty, such as ".exe" or ".cpp". + /// The returned value is null if the given path is null or empty if the given path does not include an + /// extension. + /// + [return: NotNullIfNotNull(nameof(path))] + public static string? GetExtension(string? path) + { + return Path.GetExtension(path); + } + + /// + /// Returns the extension of the given path. + /// + /// + /// The returned value is an empty ReadOnlySpan if the given path does not include an extension. + /// + public static ReadOnlySpan GetExtension(ReadOnlySpan path) + { + return Path.GetExtension(path); + } + + // Changes the extension of a file path. The path parameter + // specifies a file path, and the extension parameter + // specifies a file extension (with a leading period, such as + // ".exe" or ".cs"). + // + // The function returns a file path with the same root, directory, and base + // name parts as path, but with the file extension changed to + // the specified extension. If path is null, the function + // returns null. If path does not contain a file extension, + // the new file extension is appended to the path. If extension + // is null, any existing extension is removed from path. + [return: NotNullIfNotNull(nameof(path))] + public static string? ChangeExtension(string? path, string? extension) + { + return Path.ChangeExtension(path, extension); + } + + + /// + /// Create a relative path from one path to another. Paths will be resolved before calculating the difference. + /// Default path comparison for the active platform will be used (OrdinalIgnoreCase for Windows or Mac, Ordinal for Unix). + /// + /// The source path the output should be relative to. This path is always considered to be a directory. + /// The destination path. + /// The relative path or if the paths don't share the same root. + /// Thrown if or is null or an empty string. + public static string GetRelativePath(string relativeTo, string path) + { + return Path.GetRelativePath(relativeTo, path); + } + + public static string GetFileNameWithoutAnyExtensions(string path) + { + return GetFileName(path).Split(".").First(); + } + + public static string GetFullExtensions(string path) + { + var split = GetFileName(path).Split("."); + if (split.Length > 1) + return "." + string.Join(".", GetFileName(path).Split(".").Skip(1)); + return ""; + } + + public static string SanitizeFilename(string path) + { + return Path.GetInvalidFileNameChars() + .Aggregate(path, (current, c) => current.Replace(c, '_')); + } + + public static List ProcessPathGlobs(List paths) + { + var processedPaths = new List(); + foreach (string path in paths.Select(p => { + try + { + return Path.GetFullPath(p); + } + catch (Exception e) + { + Console.WriteLine($"Invalid path: {p} ({e.Message})"); + return null; + } + }).Where(p => p != null).Cast()) { + if (path.Contains('*')) + { + var matcher = new Matcher(); + var rootParts = path.Split(Path.DirectorySeparatorChar).TakeWhile(part => !part.Contains('*')).ToList(); + var root = string.Join(Path.DirectorySeparatorChar, rootParts); + var rest = path.Substring(root.Length + 1); + + matcher = matcher.AddInclude(rest.Replace(Path.DirectorySeparatorChar, '/')); + + var rootPath = Path.Combine(Environment.CurrentDirectory, root); + if (!Directory.Exists(rootPath)) + { + Console.Error.WriteLine($"Invalid path: {rootPath}"); + continue; + } + var files = Directory.GetFiles(Path.Combine(Environment.CurrentDirectory, root), "*", + SearchOption.AllDirectories); + var fileMatch = matcher.Match(Path.Combine(Environment.CurrentDirectory, root), files); + if (fileMatch.HasMatches) + { + processedPaths.AddRange(fileMatch.Files.Select(m => Path.Combine(root, m.Path)).Where(globFilter).ToList()); + } + + var dirs = Directory.GetDirectories(Path.Combine(Environment.CurrentDirectory, root), "*", + SearchOption.AllDirectories); + var dirMatch = matcher.Match(Path.Combine(Environment.CurrentDirectory, root), dirs); + if (dirMatch.HasMatches) + { + processedPaths.AddRange(dirMatch.Files.Select(m => Path.Combine(root, m.Path)).Where(globFilter).ToList()); + } + } + else + { + processedPaths.Add(path); + } + } + + return processedPaths.Select(path => Path.GetFullPath(path)).ToList(); + + bool globFilter(string path) + { + return !path.EndsWith(".bak"); + } + } +} \ No newline at end of file diff --git a/WitchyLib/Extensions.cs b/WitchyLib/Extensions.cs index 956ca54f..140821aa 100644 --- a/WitchyLib/Extensions.cs +++ b/WitchyLib/Extensions.cs @@ -3,6 +3,7 @@ using System.ComponentModel; using System.Diagnostics; using System.Globalization; +using System.IO; using System.Linq; using System.Linq.Expressions; using System.Reflection; @@ -104,4 +105,20 @@ public static class WitchyExtensions { return null; } +} + +public static class CrossPlatformExtensions +{ + extension(string path) + { + public string ToOSPath() + { + return path.Replace('\\', Path.DirectorySeparatorChar); + } + + public string ToBndPath() + { + return path.Replace(Path.DirectorySeparatorChar, '\\'); + } + } } \ No newline at end of file diff --git a/WitchyLib/WBUtil.cs b/WitchyLib/WBUtil.cs index 9dc55fa2..0d83f281 100644 --- a/WitchyLib/WBUtil.cs +++ b/WitchyLib/WBUtil.cs @@ -62,100 +62,6 @@ public static string FirstCharToUpper(this string input) => _ => string.Concat(input[0].ToString().ToUpper(), input.AsSpan(1)) }; - public static string SanitizeFilename(string path) - { - return Path.GetInvalidFileNameChars() - .Aggregate(path, (current, c) => current.Replace(c, '_')); - } - - public static void WriteSanitizedBinderFilePath(this XElement element, string path, string pathElementName = "path") - { - string dir = Path.GetDirectoryName(path) ?? ""; - string filename = Path.GetFileName(path); - string sanitized = SanitizeFilename(path); - - if (filename == sanitized) - { - element.Add(new XElement(pathElementName, path)); - } - else - { - element.Add(new XElement("in" + pathElementName.FirstCharToUpper(), path)); - element.Add(new XElement("out" + pathElementName.FirstCharToUpper(), Path.Combine(dir, sanitized))); - } - } - - public static string GetSanitizedBinderFilePath(this XElement element, string pathElementName = "path", - bool outName = false) - { - if (element.Element(pathElementName) != null) - return element.Element(pathElementName)!.Value; - var otherName = - outName ? "out" + pathElementName.FirstCharToUpper() : "in" + pathElementName.FirstCharToUpper(); - if (element.Element(otherName) != null) - return element.Element(otherName)!.Value; - - throw new InvalidDataException("File element is missing path."); - } - public static List ProcessPathGlobs(List paths) - { - var processedPaths = new List(); - foreach (string path in paths.Select(p => { - try - { - return Path.GetFullPath(p); - } - catch (Exception e) - { - Console.WriteLine($"Invalid path: {p} ({e.Message})"); - return null; - } - }).Where(p => p != null).Cast()) { - if (path.Contains('*')) - { - var matcher = new Matcher(); - var rootParts = path.Split(Path.DirectorySeparatorChar).TakeWhile(part => !part.Contains('*')).ToList(); - var root = string.Join(Path.DirectorySeparatorChar, rootParts); - var rest = path.Substring(root.Length + 1); - - matcher = matcher.AddInclude(rest.Replace(Path.DirectorySeparatorChar.ToString(), "/")); - - var rootPath = Path.Combine(Environment.CurrentDirectory, root); - if (!Directory.Exists(rootPath)) - { - Console.Error.WriteLine($"Invalid path: {rootPath}"); - continue; - } - var files = Directory.GetFiles(Path.Combine(Environment.CurrentDirectory, root), "*", - SearchOption.AllDirectories); - var fileMatch = matcher.Match(Path.Combine(Environment.CurrentDirectory, root), files); - if (fileMatch.HasMatches) - { - processedPaths.AddRange(fileMatch.Files.Select(m => Path.Combine(root, m.Path)).Where(globFilter).ToList()); - } - - var dirs = Directory.GetDirectories(Path.Combine(Environment.CurrentDirectory, root), "*", - SearchOption.AllDirectories); - var dirMatch = matcher.Match(Path.Combine(Environment.CurrentDirectory, root), dirs); - if (dirMatch.HasMatches) - { - processedPaths.AddRange(dirMatch.Files.Select(m => Path.Combine(root, m.Path)).Where(globFilter).ToList()); - } - } - else - { - processedPaths.Add(path); - } - } - - return processedPaths.Select(path => Path.GetFullPath(path)).ToList(); - - bool globFilter(string path) - { - return !path.EndsWith(".bak"); - } - } - [DllImport("kernel32.dll")] public static extern IntPtr GetConsoleWindow(); @@ -357,74 +263,6 @@ public static Type TypeForParamDefType(PARAMDEF.DefType type, bool isArray) } } - private static readonly Regex DriveRx = new Regex(@"^(\w\:\\)(.+)$"); - private static readonly Regex TraversalRx = new Regex(@"^([(..)\\\/]+)(.+)?$"); - private static readonly Regex SlashRx = new Regex(@"^(\\+)(.+)$"); - - - /// - /// Finds common path prefix in a list of strings. - /// - public static string FindCommonBndRootPath(IEnumerable paths) - { - string root = ""; - - if (paths.Count() == 0) return root; - - var rootPath = new string( - paths.First().Substring(0, paths.Min(s => s.Length)) - .TakeWhile((c, i) => paths.All(s => s[i] == c)).ToArray()); - - // For safety, truncate this shared string down to the last slash/backslash. - var rootPathIndex = Math.Max(rootPath.LastIndexOf('\\'), rootPath.LastIndexOf('/')); - - if (rootPath != "" && rootPathIndex != -1) - { - root = rootPath.Substring(0, rootPathIndex); - } - - return root; - } - - /// - /// Removes common network path roots if present. - /// - public static string UnrootBNDPath(string path, string? root) - { - path = path.Substring(root?.Length ?? 0); - - Match drive = DriveRx.Match(path); - - if (drive.Success) - { - path = drive.Groups[2].Value; - } - - if (string.IsNullOrWhiteSpace(root)) - return RemoveLeadingBackslashes(path); - - Match traversal = TraversalRx.Match(path); - if (traversal.Success) - { - path = traversal.Groups[2].Value; - } - - if (path.Contains("..\\") || path.Contains("../")) - throw new InvalidDataException( - $"the path {path} contains invalid data, attempting to extract to a different folder."); - return RemoveLeadingBackslashes(path); - } - - private static string RemoveLeadingBackslashes(string path) - { - Match slash = SlashRx.Match(path); - if (slash.Success) - { - path = slash.Groups[2].Value; - } - - return path; - } public static bool IsInGit(string? path) { @@ -700,17 +538,4 @@ static WBUtil() ExeLocation = Path.GetDirectoryName(AppContext.BaseDirectory); LatestKnownRegulationVersions = new(); } - - public static string GetFileNameWithoutAnyExtensions(string path) - { - return Path.GetFileName(path).Split(".").First(); - } - - public static string GetFullExtensions(string path) - { - var split = Path.GetFileName(path).Split("."); - if (split.Length > 1) - return "." + string.Join(".", Path.GetFileName(path).Split(".").Skip(1)); - return ""; - } } \ No newline at end of file diff --git a/WitchyLib/WitchyLib.csproj b/WitchyLib/WitchyLib.csproj index 82966760..bdae1bb1 100644 --- a/WitchyLib/WitchyLib.csproj +++ b/WitchyLib/WitchyLib.csproj @@ -6,6 +6,7 @@ WitchyLib WitchyLib true + true
embedded diff --git a/WitchyTests/TestBase.cs b/WitchyTests/TestBase.cs index 24e9ca4c..26548e26 100644 --- a/WitchyTests/TestBase.cs +++ b/WitchyTests/TestBase.cs @@ -49,7 +49,7 @@ static TestBase() public void StartUp() { Configuration.SwapOutConfig(new ConfigurationBuilder() - .AddJsonFile(Path.Combine(TestContext.CurrentContext.TestDirectory, "appsettings.json")) + .AddJsonFile(OSPath.Combine(TestContext.CurrentContext.TestDirectory, "appsettings.json")) .Build()); Configuration.Active.Passive = true; Configuration.IsTest = true; @@ -66,15 +66,15 @@ public void StartUp() public void Init() { Configuration.Active.Location = null; - if (Directory.Exists(Path.Combine(TestContext.CurrentContext.TestDirectory, "Results"))) - Directory.Delete(Path.Combine(TestContext.CurrentContext.TestDirectory, "Results"), true); + if (Directory.Exists(OSPath.Combine(TestContext.CurrentContext.TestDirectory, "Results"))) + Directory.Delete(OSPath.Combine(TestContext.CurrentContext.TestDirectory, "Results"), true); } protected void SetLocation(string path) { if (Location) { - Configuration.Active.Location = Path.Combine(Path.GetDirectoryName(path)!, "Target"); + Configuration.Active.Location = OSPath.Combine(Path.GetDirectoryName(path)!, "Target"); Directory.CreateDirectory(Configuration.Active.Location); return; } @@ -85,19 +85,19 @@ protected void SetLocation(string path) protected static IEnumerable GetSamples(string sampleDir, string pattern = "*") { - return Directory.GetFiles(Path.Combine(TestContext.CurrentContext.TestDirectory, "Samples", sampleDir), pattern, + return Directory.GetFiles(OSPath.Combine(TestContext.CurrentContext.TestDirectory, "Samples", sampleDir), pattern, SearchOption.AllDirectories); } protected static IEnumerable GetAllSamples(string pattern = "*") { - return Directory.GetFiles(Path.Combine(TestContext.CurrentContext.TestDirectory, "Samples"), pattern, + return Directory.GetFiles(OSPath.Combine(TestContext.CurrentContext.TestDirectory, "Samples"), pattern, SearchOption.AllDirectories); } protected static string GetCopiedPath(string path) { var newPath = path.Replace("Samples", "Results"); - Directory.CreateDirectory(Path.GetDirectoryName(newPath)!); + Directory.CreateDirectory(OSPath.GetDirectoryName(newPath)!); File.Copy(path, newPath, true); return newPath; } diff --git a/WitchyTests/Tests/SpecialBinderTests.cs b/WitchyTests/Tests/SpecialBinderTests.cs index 2628204e..57ca92f1 100644 --- a/WitchyTests/Tests/SpecialBinderTests.cs +++ b/WitchyTests/Tests/SpecialBinderTests.cs @@ -63,12 +63,12 @@ public void MATBINBND() Assert.That(parser.ExistsUnpacked(destPath)); Assert.That(parser.IsUnpacked(destPath)); - var root = WBUtil.FindCommonBndRootPath(bnd.Files.Select(a => a.Name)); + var root = BndPath.FindCommonBndRootPath(bnd.Files.Select(a => a.Name)); foreach (BinderFile file in bnd.Files) { string name = Path.Combine(destPath, - !string.IsNullOrEmpty(root) ? Path.GetRelativePath(root, file.Name).Replace('\\', Path.DirectorySeparatorChar) : file.Name.Replace('\\', Path.DirectorySeparatorChar)); - Assert.That(File.Exists(name)); + !string.IsNullOrEmpty(root) ? Path.GetRelativePath(root.ToOSPath(), file.Name.ToOSPath()) : file.Name.ToOSPath()); + Assert.That(File.Exists(name), Is.True, $"{name} does not exist"); } parser.Repack(destPath, false); @@ -102,12 +102,12 @@ public void MTDBND() Assert.That(parser.ExistsUnpacked(destPath)); Assert.That(parser.IsUnpacked(destPath)); - var root = WBUtil.FindCommonBndRootPath(bnd.Files.Select(a => a.Name)); + var root = BndPath.FindCommonBndRootPath(bnd.Files.Select(a => a.Name)); foreach (BinderFile file in bnd.Files) { string name = Path.Combine(destPath, - !string.IsNullOrEmpty(root) ? Path.GetRelativePath(root, file.Name).Replace('\\', Path.DirectorySeparatorChar) : file.Name.Replace('\\', Path.DirectorySeparatorChar)); - Assert.That(File.Exists(name)); + !string.IsNullOrEmpty(root) ? Path.GetRelativePath(root.ToOSPath(), file.Name.ToOSPath()) : file.Name.ToOSPath()); + Assert.That(File.Exists(name), Is.True, $"{name} does not exist"); } parser.Repack(destPath, false); @@ -141,11 +141,11 @@ public void ANIBND4() Assert.That(parser.ExistsUnpacked(destPath)); Assert.That(parser.IsUnpacked(destPath)); - var root = WBUtil.FindCommonBndRootPath(bnd.Files.Select(a => a.Name)); + var root = BndPath.FindCommonBndRootPath(bnd.Files.Select(a => a.Name)); foreach (BinderFile file in bnd.Files) { string name = Path.Combine(destPath, - WBUtil.UnrootBNDPath(file.Name, root).Replace('\\', Path.DirectorySeparatorChar)); + BndPath.Unroot(file.Name, root).ToOSPath()); Assert.That(File.Exists(name)); } diff --git a/WitchyTests/WitchyTests.csproj b/WitchyTests/WitchyTests.csproj index e0852da1..ca034b2c 100644 --- a/WitchyTests/WitchyTests.csproj +++ b/WitchyTests/WitchyTests.csproj @@ -46,9 +46,9 @@ - + - +
From 6028d944b49dec7061e639ac100d2f0c59cfa17e Mon Sep 17 00:00:00 2001 From: ividyon <1077140+ividyon@users.noreply.github.com> Date: Tue, 6 Jan 2026 00:41:32 +0100 Subject: [PATCH 11/15] more cross-platform progress --- .github/workflows/artifact.yml | 12 ++++------ .github/workflows/release.yml | 12 ++++------ WitchyBND/WitchyBND.csproj | 7 +++--- WitchyBND/packages.linux-x64.lock.json | 7 +----- WitchyBND/packages.lock.json | 23 ++++++++++++++----- WitchyBND/packages.win-x64.lock.json | 7 +----- WitchyLib/WitchyLib.csproj | 5 +++-- WitchyLib/packages.linux-x64.lock.json | 28 +++++++++++++++--------- WitchyLib/packages.lock.json | 19 ++++++++-------- WitchyLib/packages.win-x64.lock.json | 28 +++++++++++++++--------- WitchyTests/Tests/RegulationTests.cs | 14 +++++++++++- WitchyTests/WitchyTests.csproj | 2 +- WitchyTests/packages.linux-x64.lock.json | 1 + WitchyTests/packages.lock.json | 15 +++++++++++++ WitchyTests/packages.win-x64.lock.json | 1 + dev/RestorePackageLock.sh | 3 +++ 16 files changed, 114 insertions(+), 70 deletions(-) create mode 100755 dev/RestorePackageLock.sh diff --git a/.github/workflows/artifact.yml b/.github/workflows/artifact.yml index 74c8a7ba..32204a59 100644 --- a/.github/workflows/artifact.yml +++ b/.github/workflows/artifact.yml @@ -67,15 +67,13 @@ jobs: run: dotnet restore -r win-x64 --locked-mode ./WitchyBND.sln --lock-file-path packages.win-x64.lock.json - name: Build - run: dotnet build -r win-x64 -c Release --no-restore ./WitchyTests/WitchyTests.csproj # Builds WitchyTests which builds WitchyBND which builds WitchyBND.Shell + run: dotnet build -r win-x64 -c Release --no-restore WitchyTests # Builds WitchyTests which builds WitchyBND which builds WitchyBND.Shell - name: Run unit tests run: dotnet test -c Release -r win-x64 --no-build --filter TestCategory!=SkipOnGitHubAction - name: Publish application - run: | - cd WitchyBND - dotnet publish -r win-x64 -c Release --no-build + run: dotnet publish -r win-x64 -c Release --no-build WitchyBND # Upload the MSIX package: https://github.com/marketplace/actions/upload-a-build-artifact - name: Upload build artifacts @@ -127,15 +125,13 @@ jobs: run: dotnet restore -r linux-x64 --locked-mode ./WitchyBND.sln --lock-file-path packages.linux-x64.lock.json - name: Build - run: dotnet build -c Release -r linux-x64 --no-restore ./WitchyTests/WitchyTests.csproj # Builds WitchyTests which builds WitchyBND which builds WitchyBND.Shell + run: dotnet build -c Release -r linux-x64 --no-restore WitchyTests # Builds WitchyTests which builds WitchyBND which builds WitchyBND.Shell - name: Run unit tests run: dotnet test -c Release -r linux-x64 --no-build --filter TestCategory!=SkipOnGitHubAction - name: Publish application - run: | - cd WitchyBND - dotnet publish -c Release -r linux-x64 --no-build + run: dotnet publish -c Release -r linux-x64 --no-build WitchyBND # Upload the MSIX package: https://github.com/marketplace/actions/upload-a-build-artifact - name: Upload build artifacts diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 434c51bf..88b57000 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -65,15 +65,13 @@ jobs: run: dotnet restore -r win-x64 --locked-mode ./WitchyBND.sln --lock-file-path packages.win-x64.lock.json - name: Build - run: dotnet build -r win-x64 -c Release --no-restore ./WitchyTests/WitchyTests.csproj # Builds WitchyTests which builds WitchyBND which builds WitchyBND.Shell + run: dotnet build -r win-x64 -c Release --no-restore WitchyTests # Builds WitchyTests which builds WitchyBND which builds WitchyBND.Shell - name: Run unit tests run: dotnet test -c Release -r win-x64 --no-build --filter TestCategory!=SkipOnGitHubAction - name: Publish application - run: | - cd WitchyBND - dotnet publish -r win-x64 -c Release --no-build + run: dotnet publish -r win-x64 -c Release --no-build WitchyBND - name: Archive release uses: thedoctor0/zip-release@main @@ -132,15 +130,13 @@ jobs: run: dotnet restore -r linux-x64 --locked-mode ./WitchyBND.sln --lock-file-path packages.linux-x64.lock.json - name: Build - run: dotnet build -c Release -r linux-x64 --no-restore ./WitchyTests/WitchyTests.csproj # Builds WitchyTests which builds WitchyBND which builds WitchyBND.Shell + run: dotnet build -c Release -r linux-x64 --no-restore WitchyTests # Builds WitchyTests which builds WitchyBND which builds WitchyBND.Shell - name: Run unit tests run: dotnet test -c Release -r linux-x64 --no-build --filter TestCategory!=SkipOnGitHubAction - name: Publish application - run: | - cd WitchyBND - dotnet publish -c Release -r linux-x64 --no-build + run: dotnet publish -c Release -r linux-x64 --no-build WitchyBND - name: Archive release uses: thedoctor0/zip-release@main diff --git a/WitchyBND/WitchyBND.csproj b/WitchyBND/WitchyBND.csproj index fee997ff..155aaaee 100644 --- a/WitchyBND/WitchyBND.csproj +++ b/WitchyBND/WitchyBND.csproj @@ -2,6 +2,7 @@ net10.0 x64 + win-x64;linux-x64 Exe true false @@ -45,7 +46,6 @@ - @@ -109,12 +109,13 @@ - + + - + diff --git a/WitchyBND/packages.linux-x64.lock.json b/WitchyBND/packages.linux-x64.lock.json index ca72764d..0e402657 100644 --- a/WitchyBND/packages.linux-x64.lock.json +++ b/WitchyBND/packages.linux-x64.lock.json @@ -8,12 +8,6 @@ "resolved": "2.9.1", "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" }, - "Microsoft.CSharp": { - "type": "Direct", - "requested": "[4.7.0, )", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" - }, "Microsoft.Extensions.Configuration.Binder": { "type": "Direct", "requested": "[8.0.0-preview.7.23375.6, )", @@ -227,6 +221,7 @@ "witchylib": { "type": "Project", "dependencies": { + "EastAsianWidthDotNet": "[1.0.1, )", "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", "Newtonsoft.Json": "[13.0.3, )", "PromptPlus": "[5.0.1, )", diff --git a/WitchyBND/packages.lock.json b/WitchyBND/packages.lock.json index 3c7c1dad..db6efd73 100644 --- a/WitchyBND/packages.lock.json +++ b/WitchyBND/packages.lock.json @@ -8,12 +8,6 @@ "resolved": "2.9.1", "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" }, - "Microsoft.CSharp": { - "type": "Direct", - "requested": "[4.7.0, )", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" - }, "Microsoft.Extensions.Configuration.Binder": { "type": "Direct", "requested": "[8.0.0-preview.7.23375.6, )", @@ -227,12 +221,29 @@ "witchylib": { "type": "Project", "dependencies": { + "EastAsianWidthDotNet": "[1.0.1, )", "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", "Newtonsoft.Json": "[13.0.3, )", "PromptPlus": "[5.0.1, )", "WitchyFormats": "[2.17.0, )" } } + }, + "net10.0/linux-x64": { + "NativeFileDialogSharp": { + "type": "Direct", + "requested": "[0.6.0-alpha, )", + "resolved": "0.6.0-alpha", + "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" + } + }, + "net10.0/win-x64": { + "NativeFileDialogSharp": { + "type": "Direct", + "requested": "[0.6.0-alpha, )", + "resolved": "0.6.0-alpha", + "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" + } } } } \ No newline at end of file diff --git a/WitchyBND/packages.win-x64.lock.json b/WitchyBND/packages.win-x64.lock.json index be173c28..aff05765 100644 --- a/WitchyBND/packages.win-x64.lock.json +++ b/WitchyBND/packages.win-x64.lock.json @@ -8,12 +8,6 @@ "resolved": "2.9.1", "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" }, - "Microsoft.CSharp": { - "type": "Direct", - "requested": "[4.7.0, )", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" - }, "Microsoft.Extensions.Configuration.Binder": { "type": "Direct", "requested": "[8.0.0-preview.7.23375.6, )", @@ -227,6 +221,7 @@ "witchylib": { "type": "Project", "dependencies": { + "EastAsianWidthDotNet": "[1.0.1, )", "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", "Newtonsoft.Json": "[13.0.3, )", "PromptPlus": "[5.0.1, )", diff --git a/WitchyLib/WitchyLib.csproj b/WitchyLib/WitchyLib.csproj index bdae1bb1..35c5c023 100644 --- a/WitchyLib/WitchyLib.csproj +++ b/WitchyLib/WitchyLib.csproj @@ -1,6 +1,7 @@ net10.0 + x64 true false WitchyLib @@ -10,13 +11,13 @@ embedded - x64 false - + + diff --git a/WitchyLib/packages.linux-x64.lock.json b/WitchyLib/packages.linux-x64.lock.json index 137fa2ad..5dfbeddf 100644 --- a/WitchyLib/packages.linux-x64.lock.json +++ b/WitchyLib/packages.linux-x64.lock.json @@ -2,11 +2,11 @@ "version": 1, "dependencies": { "net10.0": { - "Microsoft.CSharp": { + "EastAsianWidthDotNet": { "type": "Direct", - "requested": "[4.7.0, )", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + "requested": "[1.0.1, )", + "resolved": "1.0.1", + "contentHash": "vCn17XpsjpqAQvWCa5oUh81d/AVytUcBG9frXoDa+f66iuAiq9T4kDcqQnyp3dbN9cJ0cJA6ML98glpf315haQ==" }, "Microsoft.Extensions.FileSystemGlobbing": { "type": "Direct", @@ -20,6 +20,12 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "System.Text.Encodings.Web": { + "type": "Direct", + "requested": "[10.0.0, )", + "resolved": "10.0.0", + "contentHash": "257hh1ep1Gqm1Lm0ulxf7vVBVMJuGN6EL4xSWjpi46DffXzm1058IiWsfSC06zSm7SniN+Tb5160UnXsSa8rRg==" + }, "BouncyCastle.Cryptography": { "type": "Transitive", "resolved": "2.4.0", @@ -30,11 +36,6 @@ "resolved": "1.1.1", "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" }, - "EastAsianWidthDotNet": { - "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "vCn17XpsjpqAQvWCa5oUh81d/AVytUcBG9frXoDa+f66iuAiq9T4kDcqQnyp3dbN9cJ0cJA6ML98glpf315haQ==" - }, "ZstdNet": { "type": "Transitive", "resolved": "1.4.5", @@ -61,6 +62,13 @@ } } }, - "net10.0/linux-x64": {} + "net10.0/linux-x64": { + "System.Text.Encodings.Web": { + "type": "Direct", + "requested": "[10.0.0, )", + "resolved": "10.0.0", + "contentHash": "257hh1ep1Gqm1Lm0ulxf7vVBVMJuGN6EL4xSWjpi46DffXzm1058IiWsfSC06zSm7SniN+Tb5160UnXsSa8rRg==" + } + } } } \ No newline at end of file diff --git a/WitchyLib/packages.lock.json b/WitchyLib/packages.lock.json index 28ec890d..20c43af7 100644 --- a/WitchyLib/packages.lock.json +++ b/WitchyLib/packages.lock.json @@ -2,11 +2,11 @@ "version": 1, "dependencies": { "net10.0": { - "Microsoft.CSharp": { + "EastAsianWidthDotNet": { "type": "Direct", - "requested": "[4.7.0, )", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + "requested": "[1.0.1, )", + "resolved": "1.0.1", + "contentHash": "vCn17XpsjpqAQvWCa5oUh81d/AVytUcBG9frXoDa+f66iuAiq9T4kDcqQnyp3dbN9cJ0cJA6ML98glpf315haQ==" }, "Microsoft.Extensions.FileSystemGlobbing": { "type": "Direct", @@ -20,6 +20,12 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "System.Text.Encodings.Web": { + "type": "Direct", + "requested": "[10.0.0, )", + "resolved": "10.0.0", + "contentHash": "257hh1ep1Gqm1Lm0ulxf7vVBVMJuGN6EL4xSWjpi46DffXzm1058IiWsfSC06zSm7SniN+Tb5160UnXsSa8rRg==" + }, "BouncyCastle.Cryptography": { "type": "Transitive", "resolved": "2.4.0", @@ -30,11 +36,6 @@ "resolved": "1.1.1", "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" }, - "EastAsianWidthDotNet": { - "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "vCn17XpsjpqAQvWCa5oUh81d/AVytUcBG9frXoDa+f66iuAiq9T4kDcqQnyp3dbN9cJ0cJA6ML98glpf315haQ==" - }, "ZstdNet": { "type": "Transitive", "resolved": "1.4.5", diff --git a/WitchyLib/packages.win-x64.lock.json b/WitchyLib/packages.win-x64.lock.json index 1e90822b..340b5b8c 100644 --- a/WitchyLib/packages.win-x64.lock.json +++ b/WitchyLib/packages.win-x64.lock.json @@ -2,11 +2,11 @@ "version": 1, "dependencies": { "net10.0": { - "Microsoft.CSharp": { + "EastAsianWidthDotNet": { "type": "Direct", - "requested": "[4.7.0, )", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + "requested": "[1.0.1, )", + "resolved": "1.0.1", + "contentHash": "vCn17XpsjpqAQvWCa5oUh81d/AVytUcBG9frXoDa+f66iuAiq9T4kDcqQnyp3dbN9cJ0cJA6ML98glpf315haQ==" }, "Microsoft.Extensions.FileSystemGlobbing": { "type": "Direct", @@ -20,6 +20,12 @@ "resolved": "13.0.3", "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, + "System.Text.Encodings.Web": { + "type": "Direct", + "requested": "[10.0.0, )", + "resolved": "10.0.0", + "contentHash": "257hh1ep1Gqm1Lm0ulxf7vVBVMJuGN6EL4xSWjpi46DffXzm1058IiWsfSC06zSm7SniN+Tb5160UnXsSa8rRg==" + }, "BouncyCastle.Cryptography": { "type": "Transitive", "resolved": "2.4.0", @@ -30,11 +36,6 @@ "resolved": "1.1.1", "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" }, - "EastAsianWidthDotNet": { - "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "vCn17XpsjpqAQvWCa5oUh81d/AVytUcBG9frXoDa+f66iuAiq9T4kDcqQnyp3dbN9cJ0cJA6ML98glpf315haQ==" - }, "ZstdNet": { "type": "Transitive", "resolved": "1.4.5", @@ -61,6 +62,13 @@ } } }, - "net10.0/win-x64": {} + "net10.0/win-x64": { + "System.Text.Encodings.Web": { + "type": "Direct", + "requested": "[10.0.0, )", + "resolved": "10.0.0", + "contentHash": "257hh1ep1Gqm1Lm0ulxf7vVBVMJuGN6EL4xSWjpi46DffXzm1058IiWsfSC06zSm7SniN+Tb5160UnXsSa8rRg==" + } + } } } \ No newline at end of file diff --git a/WitchyTests/Tests/RegulationTests.cs b/WitchyTests/Tests/RegulationTests.cs index 256a36e5..79377252 100644 --- a/WitchyTests/Tests/RegulationTests.cs +++ b/WitchyTests/Tests/RegulationTests.cs @@ -143,7 +143,19 @@ public void PARAMBND4OutdatedParam() Assert.That(Directory.Exists(destPath)); Assert.That(parser.ExistsUnpacked(destPath)); Assert.That(parser.IsUnpacked(destPath)); - Assert.Throws(() => parser.Repack(destPath, false)); + Assert.Throws(() => { + try + { + parser.Repack(destPath, false); + } + catch (AggregateException e) + { + foreach (Exception innerException in e.InnerExceptions) + { + throw innerException; + } + } + }); } } diff --git a/WitchyTests/WitchyTests.csproj b/WitchyTests/WitchyTests.csproj index ca034b2c..a6c71b59 100644 --- a/WitchyTests/WitchyTests.csproj +++ b/WitchyTests/WitchyTests.csproj @@ -1,8 +1,8 @@ - net10.0 x64 + win-x64;linux-x64 enable enable diff --git a/WitchyTests/packages.linux-x64.lock.json b/WitchyTests/packages.linux-x64.lock.json index 7941a5fc..af0fce69 100644 --- a/WitchyTests/packages.linux-x64.lock.json +++ b/WitchyTests/packages.linux-x64.lock.json @@ -292,6 +292,7 @@ "witchylib": { "type": "Project", "dependencies": { + "EastAsianWidthDotNet": "[1.0.1, )", "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", "Newtonsoft.Json": "[13.0.3, )", "PromptPlus": "[5.0.1, )", diff --git a/WitchyTests/packages.lock.json b/WitchyTests/packages.lock.json index 0f7f4c72..ef564fc2 100644 --- a/WitchyTests/packages.lock.json +++ b/WitchyTests/packages.lock.json @@ -292,12 +292,27 @@ "witchylib": { "type": "Project", "dependencies": { + "EastAsianWidthDotNet": "[1.0.1, )", "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", "Newtonsoft.Json": "[13.0.3, )", "PromptPlus": "[5.0.1, )", "WitchyFormats": "[2.17.0, )" } } + }, + "net10.0/linux-x64": { + "NativeFileDialogSharp": { + "type": "Transitive", + "resolved": "0.6.0-alpha", + "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" + } + }, + "net10.0/win-x64": { + "NativeFileDialogSharp": { + "type": "Transitive", + "resolved": "0.6.0-alpha", + "contentHash": "2JvfxgAMWEGA9rIuYw+/vcj8eisBJbb4fzviJU47urU72z7m6BW2SykaMRtQorr06Xh3ZxG+gykiqV3D4crfLA==" + } } } } \ No newline at end of file diff --git a/WitchyTests/packages.win-x64.lock.json b/WitchyTests/packages.win-x64.lock.json index 50229110..6626fde2 100644 --- a/WitchyTests/packages.win-x64.lock.json +++ b/WitchyTests/packages.win-x64.lock.json @@ -292,6 +292,7 @@ "witchylib": { "type": "Project", "dependencies": { + "EastAsianWidthDotNet": "[1.0.1, )", "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", "Newtonsoft.Json": "[13.0.3, )", "PromptPlus": "[5.0.1, )", diff --git a/dev/RestorePackageLock.sh b/dev/RestorePackageLock.sh new file mode 100755 index 00000000..e6059a4c --- /dev/null +++ b/dev/RestorePackageLock.sh @@ -0,0 +1,3 @@ +#/bin/sh +dotnet restore -f --force-evaluate --no-cache -r linux-x64 --lock-file-path packages.linux-x64.lock.json +dotnet restore -f --force-evaluate --no-cache -r win-x64 --lock-file-path packages.win-x64.lock.json \ No newline at end of file From 46971ec255b268d450b2ed0d446d47208699c1ab Mon Sep 17 00:00:00 2001 From: ividyon <1077140+ividyon@users.noreply.github.com> Date: Tue, 6 Jan 2026 01:12:24 +0100 Subject: [PATCH 12/15] make windows build --- WitchyBND/Parsers/WBinderParser.cs | 2 +- WitchyLib/CrossPlatform.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/WitchyBND/Parsers/WBinderParser.cs b/WitchyBND/Parsers/WBinderParser.cs index d276c83e..f4b53801 100644 --- a/WitchyBND/Parsers/WBinderParser.cs +++ b/WitchyBND/Parsers/WBinderParser.cs @@ -298,7 +298,7 @@ protected virtual void ReadUnsortedBinderFiles(IBinder bnd, string srcDirPath, s throw new InvalidDataException( $"File {filename} passed pattern checks, but was not found among formats."); string name = !string.IsNullOrEmpty(root) - ? BndPath.Combine(root, BndPath.GetRelativePath(srcDirPath.ToBndPath(), filePath.ToBndPath())) + ? BndPath.Combine(root, OSPath.GetRelativePath(srcDirPath, filePath).ToBndPath()) : filePath; RecursiveRepackFile(filePath, recursive); diff --git a/WitchyLib/CrossPlatform.cs b/WitchyLib/CrossPlatform.cs index 0b59e010..e42189a3 100644 --- a/WitchyLib/CrossPlatform.cs +++ b/WitchyLib/CrossPlatform.cs @@ -648,7 +648,7 @@ private static string GetFullPathInternal(string path) // Expand with current directory if necessary if (!IsPathRooted(path)) { - path = Combine(WBUtil.GetExecutablePath(), path); + path = Combine(WBUtil.GetExecutablePath().ToBndPath(), path); } // We would ideally use realpath to do this, but it resolves symlinks and requires that the file actually exist. From df17707ae93aabc276598edea7d6183b6dc3c814 Mon Sep 17 00:00:00 2001 From: ividyon <1077140+ividyon@users.noreply.github.com> Date: Mon, 12 Jan 2026 15:35:04 +0100 Subject: [PATCH 13/15] FFXBND fix --- SoulsOodleLib/AssetLocator.cs | 1 - .../Parsers/Binder/Special/WFFXBNDModern.cs | 23 +++++++++--------- WitchyBND/Program.cs | 2 +- WitchyFormats/packages.lock.json | 12 +++++++++ WitchyLib/packages.lock.json | 12 +++++++++ .../BB/frpg_sfxbnd_commoneffects.ffxbnd | Bin 0 -> 975520 bytes WitchyTests/WitchyTests.csproj | 1 - 7 files changed, 36 insertions(+), 15 deletions(-) create mode 100644 WitchyTests/Samples/FFXBNDModern/BB/frpg_sfxbnd_commoneffects.ffxbnd diff --git a/SoulsOodleLib/AssetLocator.cs b/SoulsOodleLib/AssetLocator.cs index 3cf0e459..9c33659f 100644 --- a/SoulsOodleLib/AssetLocator.cs +++ b/SoulsOodleLib/AssetLocator.cs @@ -94,7 +94,6 @@ public static List GetSteamLibraryPaths() string? librariesPath = GetSteamPath("steamapps", "libraryfolders.vdf"); if (librariesPath == null || !File.Exists(librariesPath)) { - Console.WriteLine("Could not find libraryfolders.vdf"); return new(); } diff --git a/WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs b/WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs index 299f5245..d6039e60 100644 --- a/WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs +++ b/WitchyBND/Parsers/Binder/Special/WFFXBNDModern.cs @@ -175,15 +175,15 @@ public override void Repack(string srcPath, bool recursive) XElement? resDirElement = xml.Element("resDir"); - List effectPaths = Directory.GetFiles(srcPath, "*.fxr;*.FXR", SearchOption.AllDirectories) + List effectPaths = Directory.GetFiles(srcPath, "*.fxr", SearchOption.AllDirectories) .OrderBy(OSPath.GetFileName).ToList(); - List texturePaths = Directory.GetFiles(srcPath, "*.dds;*.DDS", SearchOption.AllDirectories) + List texturePaths = Directory.GetFiles(srcPath, "*.dds", SearchOption.AllDirectories) .OrderBy(OSPath.GetFileName).ToList(); - List modelPaths = Directory.GetFiles(srcPath, "*.flver;*.FLVER", SearchOption.AllDirectories) + List modelPaths = Directory.GetFiles(srcPath, "*.flver", SearchOption.AllDirectories) .OrderBy(OSPath.GetFileName).ToList(); - List animPaths = Directory.GetFiles(srcPath, "*.anibnd;*.ANIBND", SearchOption.AllDirectories) + List animPaths = Directory.GetFiles(srcPath, "*.anibnd", SearchOption.AllDirectories) .OrderBy(OSPath.GetFileName).ToList(); - List resPaths = Directory.GetFiles(srcPath, "*.ffxreslist;*.FFXRESLIST", SearchOption.AllDirectories) + List resPaths = Directory.GetFiles(srcPath, "*.ffxreslist", SearchOption.AllDirectories) .OrderBy(OSPath.GetFileName).ToList(); // Sanity check duplicate file names @@ -301,19 +301,18 @@ void inTextureCallback(string path) tpf.Flag2 = 0x03; tpf.Platform = platform; - var tex = new TPF.Texture(); - tex.Name = OSPath.GetFileNameWithoutExtension(fileName).Trim(); - tex.Format = 0; - if (fileName.ToLower().EndsWith("_m")) + string texName = OSPath.GetFileNameWithoutExtension(fileName).Trim(); + byte texFormat = 0; + if (fileName.ToLower().EndsWith("_m") || fileName.ToLower().EndsWith("_r")) { - tex.Format = 103; + texFormat = 103; } else if (fileName.ToLower().EndsWith("_n")) { - tex.Format = 106; + texFormat = 106; } - tex.Bytes = bytes; + var tex = new TPF.Texture(texName, texFormat, 0x0, bytes, platform); tpf.Textures.Add(tex); diff --git a/WitchyBND/Program.cs b/WitchyBND/Program.cs index 65c62994..38ff3a7b 100644 --- a/WitchyBND/Program.cs +++ b/WitchyBND/Program.cs @@ -167,7 +167,7 @@ static int Main(string[] args) Stopwatch watch = new Stopwatch(); watch.Start(); - Oodle.GrabOodle(message => _output.WriteLine(message), false, true); + Oodle.GrabOodle(_ => { }, false, true); ParseMode.CliParseMode(opt); watch.Stop(); diff --git a/WitchyFormats/packages.lock.json b/WitchyFormats/packages.lock.json index a2787fc2..2c6553ba 100644 --- a/WitchyFormats/packages.lock.json +++ b/WitchyFormats/packages.lock.json @@ -12,6 +12,16 @@ "resolved": "1.1.1", "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + }, + "System.ValueTuple": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" + }, "ZstdNet": { "type": "Transitive", "resolved": "1.4.5", @@ -22,6 +32,8 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.4.0, )", "DrSwizzler": "[1.1.1, )", + "System.Text.Encoding.CodePages": "[8.0.0, )", + "System.ValueTuple": "[4.5.0, )", "ZstdNet": "[1.4.5, )" } } diff --git a/WitchyLib/packages.lock.json b/WitchyLib/packages.lock.json index 20c43af7..ec1762cb 100644 --- a/WitchyLib/packages.lock.json +++ b/WitchyLib/packages.lock.json @@ -36,6 +36,16 @@ "resolved": "1.1.1", "contentHash": "9zB7kjdI8CVxNXuMYkoNOr0xwIa9KGWQ/+A0ICAF9J1UQ8SbS8DgYebfSfMsr5JsaRM6PNH1JOSowjvdq/6XPA==" }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + }, + "System.ValueTuple": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" + }, "ZstdNet": { "type": "Transitive", "resolved": "1.4.5", @@ -52,6 +62,8 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.4.0, )", "DrSwizzler": "[1.1.1, )", + "System.Text.Encoding.CodePages": "[8.0.0, )", + "System.ValueTuple": "[4.5.0, )", "ZstdNet": "[1.4.5, )" } }, diff --git a/WitchyTests/Samples/FFXBNDModern/BB/frpg_sfxbnd_commoneffects.ffxbnd b/WitchyTests/Samples/FFXBNDModern/BB/frpg_sfxbnd_commoneffects.ffxbnd new file mode 100644 index 0000000000000000000000000000000000000000..d86e70b85d065c595924d62be6003977637c4a50 GIT binary patch literal 975520 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 z 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%0D@f)~bK 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

oP>nT$W&ho?drF2iJ= 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 H)T6a{%3xD0y?c)A{k0l#dldJhJZz0< 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

F71V~3}mi@^rB5lab(R< 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 - From 93f9c3f178fdd0af11c168a0f900f5ed1cdd3877 Mon Sep 17 00:00:00 2001 From: ividyon <1077140+ividyon@users.noreply.github.com> Date: Mon, 12 Jan 2026 15:36:02 +0100 Subject: [PATCH 14/15] version bump & lock file restore --- Directory.Build.props | 2 +- WitchyBND/packages.linux-x64.lock.json | 6 +++--- WitchyBND/packages.win-x64.lock.json | 6 +++--- WitchyLib/packages.linux-x64.lock.json | 2 +- WitchyLib/packages.win-x64.lock.json | 2 +- WitchyTests/packages.linux-x64.lock.json | 14 +++++++------- WitchyTests/packages.win-x64.lock.json | 14 +++++++------- 7 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 468ae56b..9f5f9747 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,7 +2,7 @@ ividyon ividyon - 2.17.0.0 + 3.0.0.0 $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)'))=./ diff --git a/WitchyBND/packages.linux-x64.lock.json b/WitchyBND/packages.linux-x64.lock.json index 0e402657..b569c592 100644 --- a/WitchyBND/packages.linux-x64.lock.json +++ b/WitchyBND/packages.linux-x64.lock.json @@ -209,13 +209,13 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.4.0, )", "NativeFileDialogSharp": "[0.6.0-alpha, )", - "SoulsFormats": "[2.17.0, )" + "SoulsFormats": "[3.0.0, )" } }, "witchyformats": { "type": "Project", "dependencies": { - "SoulsFormats": "[2.17.0, )" + "SoulsFormats": "[3.0.0, )" } }, "witchylib": { @@ -225,7 +225,7 @@ "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", "Newtonsoft.Json": "[13.0.3, )", "PromptPlus": "[5.0.1, )", - "WitchyFormats": "[2.17.0, )" + "WitchyFormats": "[3.0.0, )" } } }, diff --git a/WitchyBND/packages.win-x64.lock.json b/WitchyBND/packages.win-x64.lock.json index aff05765..477fb899 100644 --- a/WitchyBND/packages.win-x64.lock.json +++ b/WitchyBND/packages.win-x64.lock.json @@ -209,13 +209,13 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.4.0, )", "NativeFileDialogSharp": "[0.6.0-alpha, )", - "SoulsFormats": "[2.17.0, )" + "SoulsFormats": "[3.0.0, )" } }, "witchyformats": { "type": "Project", "dependencies": { - "SoulsFormats": "[2.17.0, )" + "SoulsFormats": "[3.0.0, )" } }, "witchylib": { @@ -225,7 +225,7 @@ "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", "Newtonsoft.Json": "[13.0.3, )", "PromptPlus": "[5.0.1, )", - "WitchyFormats": "[2.17.0, )" + "WitchyFormats": "[3.0.0, )" } } }, diff --git a/WitchyLib/packages.linux-x64.lock.json b/WitchyLib/packages.linux-x64.lock.json index 5dfbeddf..770ce3b0 100644 --- a/WitchyLib/packages.linux-x64.lock.json +++ b/WitchyLib/packages.linux-x64.lock.json @@ -58,7 +58,7 @@ "witchyformats": { "type": "Project", "dependencies": { - "SoulsFormats": "[2.17.0, )" + "SoulsFormats": "[3.0.0, )" } } }, diff --git a/WitchyLib/packages.win-x64.lock.json b/WitchyLib/packages.win-x64.lock.json index 340b5b8c..47652a2a 100644 --- a/WitchyLib/packages.win-x64.lock.json +++ b/WitchyLib/packages.win-x64.lock.json @@ -58,7 +58,7 @@ "witchyformats": { "type": "Project", "dependencies": { - "SoulsFormats": "[2.17.0, )" + "SoulsFormats": "[3.0.0, )" } } }, diff --git a/WitchyTests/packages.linux-x64.lock.json b/WitchyTests/packages.linux-x64.lock.json index af0fce69..ebb0ba54 100644 --- a/WitchyTests/packages.linux-x64.lock.json +++ b/WitchyTests/packages.linux-x64.lock.json @@ -263,7 +263,7 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.4.0, )", "NativeFileDialogSharp": "[0.6.0-alpha, )", - "SoulsFormats": "[2.17.0, )" + "SoulsFormats": "[3.0.0, )" } }, "witchybnd": { @@ -276,17 +276,17 @@ "Microsoft.Extensions.Hosting.Abstractions": "[8.0.0, )", "NativeFileDialogSharp": "[0.6.0-alpha, )", "PromptPlus": "[5.0.1, )", - "SoulsFormats": "[2.17.0, )", - "SoulsOodleLib": "[2.17.0, )", - "WitchyFormats": "[2.17.0, )", - "WitchyLib": "[2.17.0, )", + "SoulsFormats": "[3.0.0, )", + "SoulsOodleLib": "[3.0.0, )", + "WitchyFormats": "[3.0.0, )", + "WitchyLib": "[3.0.0, )", "securifybv.ShellLink": "[0.1.0, )" } }, "witchyformats": { "type": "Project", "dependencies": { - "SoulsFormats": "[2.17.0, )" + "SoulsFormats": "[3.0.0, )" } }, "witchylib": { @@ -296,7 +296,7 @@ "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", "Newtonsoft.Json": "[13.0.3, )", "PromptPlus": "[5.0.1, )", - "WitchyFormats": "[2.17.0, )" + "WitchyFormats": "[3.0.0, )" } } }, diff --git a/WitchyTests/packages.win-x64.lock.json b/WitchyTests/packages.win-x64.lock.json index 6626fde2..667da1b7 100644 --- a/WitchyTests/packages.win-x64.lock.json +++ b/WitchyTests/packages.win-x64.lock.json @@ -263,7 +263,7 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.4.0, )", "NativeFileDialogSharp": "[0.6.0-alpha, )", - "SoulsFormats": "[2.17.0, )" + "SoulsFormats": "[3.0.0, )" } }, "witchybnd": { @@ -276,17 +276,17 @@ "Microsoft.Extensions.Hosting.Abstractions": "[8.0.0, )", "NativeFileDialogSharp": "[0.6.0-alpha, )", "PromptPlus": "[5.0.1, )", - "SoulsFormats": "[2.17.0, )", - "SoulsOodleLib": "[2.17.0, )", - "WitchyFormats": "[2.17.0, )", - "WitchyLib": "[2.17.0, )", + "SoulsFormats": "[3.0.0, )", + "SoulsOodleLib": "[3.0.0, )", + "WitchyFormats": "[3.0.0, )", + "WitchyLib": "[3.0.0, )", "securifybv.ShellLink": "[0.1.0, )" } }, "witchyformats": { "type": "Project", "dependencies": { - "SoulsFormats": "[2.17.0, )" + "SoulsFormats": "[3.0.0, )" } }, "witchylib": { @@ -296,7 +296,7 @@ "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0-preview.2.23128.3, )", "Newtonsoft.Json": "[13.0.3, )", "PromptPlus": "[5.0.1, )", - "WitchyFormats": "[2.17.0, )" + "WitchyFormats": "[3.0.0, )" } } }, From 55b8a46cb7579258daee77933b831b8290a81c59 Mon Sep 17 00:00:00 2001 From: ividyon <1077140+ividyon@users.noreply.github.com> Date: Mon, 12 Jan 2026 15:46:39 +0100 Subject: [PATCH 15/15] updater --- WitchyBND/Services/UpdateService.cs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/WitchyBND/Services/UpdateService.cs b/WitchyBND/Services/UpdateService.cs index 66a750d2..019a796a 100644 --- a/WitchyBND/Services/UpdateService.cs +++ b/WitchyBND/Services/UpdateService.cs @@ -245,19 +245,15 @@ public void UpdateSelf(string[] args, bool dry = false) JObject doc = (JObject)JsonConvert.DeserializeObject(jsonString.Result)!; var version = Version.Parse(String.Concat(doc.Value("tag_name")!.Skip(1))); - var url = doc.Value("assets")!.First(a => a.Value("browser_download_url")!.EndsWith(".zip")) + var url = doc.Value("assets")!.First(a => { + var url = a.Value("browser_download_url")!.ToLower(); + return url.EndsWith(".zip") && url.Contains("win-x64"); + }) .Value("browser_download_url")!; return (version, url); } - Version getLocalVersion() - { - var exePath = WBUtil.GetExeLocation("WitchyBND.exe"); - var exe = FileVersionInfo.GetVersionInfo(exePath); - return Version.Parse(exe.FileVersion!); - } - void unregisterShell() { output.WriteLine("Unregistering WitchyBND context menu (this may take a moment)...");