From d51dab683d881a8ed686e843907f000c3d24e6a1 Mon Sep 17 00:00:00 2001 From: Benito Palacios Sanchez Date: Thu, 14 May 2026 00:56:48 +0200 Subject: [PATCH 1/5] feat: migrate Yarhl, Texim and Ekona --- nuget.config | 2 +- src/Directory.Packages.props | 11 +++++------ src/JUS.CLI/JUS/Graphics/DigCommands.cs | 6 +++--- src/JUS.Tool/BatchConverters/Demo2Alar3.cs | 4 ++-- src/JUS.Tool/BatchConverters/Png2Alar3.cs | 4 ++-- src/JUS.Tool/Graphics/ALMT.cs | 6 +++--- src/JUS.Tool/Graphics/Converters/Almt2Binary.cs | 3 ++- src/JUS.Tool/Graphics/Converters/Binary2Almt.cs | 6 ++++-- src/JUS.Tool/Graphics/Converters/BinaryDig2Bitmap.cs | 2 +- src/JUS.Tool/Graphics/Dig.cs | 9 +++------ 10 files changed, 26 insertions(+), 27 deletions(-) diff --git a/nuget.config b/nuget.config index 9cc47fe..8292bd9 100644 --- a/nuget.config +++ b/nuget.config @@ -14,7 +14,7 @@ - + diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index d3fb91f..132b2de 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -1,12 +1,11 @@ - - - - - - + + + + + diff --git a/src/JUS.CLI/JUS/Graphics/DigCommands.cs b/src/JUS.CLI/JUS/Graphics/DigCommands.cs index 4381c6a..7450a73 100644 --- a/src/JUS.CLI/JUS/Graphics/DigCommands.cs +++ b/src/JUS.CLI/JUS/Graphics/DigCommands.cs @@ -20,9 +20,9 @@ using JUS.Tool.Graphics; using JUS.Tool.Graphics.Converters; using JUS.Tool.Utils; -using Texim.Games.Nitro.Backgrounds.ScreenMaps; using Texim.Images; using Texim.Images.Standard; +using Texim.TileMaps; using Yarhl.FileSystem; using Yarhl.IO; @@ -99,7 +99,7 @@ public static void ImportDig(string input, bool insertTransparent, string dig, s Height = compressed.Tiles.Length / 8, Pixels = compressed.Tiles, }; - IScreenMap map = compressed.Map; + ITileMap map = compressed.Map; var newDig = new Dig(originalDig, newImage); @@ -158,7 +158,7 @@ public static void MergeDig(string[] input, bool insertTransparent, string dig, Height = compressed.Tiles.Length / 8, Pixels = compressed.Tiles, }; - IScreenMap map = compressed.Map; + ITileMap map = compressed.Map; // 3 - Clone original mergedImage = new Dig(mergedImage, newImage); diff --git a/src/JUS.Tool/BatchConverters/Demo2Alar3.cs b/src/JUS.Tool/BatchConverters/Demo2Alar3.cs index ff46f54..705b87a 100644 --- a/src/JUS.Tool/BatchConverters/Demo2Alar3.cs +++ b/src/JUS.Tool/BatchConverters/Demo2Alar3.cs @@ -21,9 +21,9 @@ using JUS.Tool.Graphics; using JUS.Tool.Graphics.Converters; using JUS.Tool.Utils; -using Texim.Games.Nitro.Backgrounds.ScreenMaps; using Texim.Images; using Texim.Images.Standard; +using Texim.TileMaps; using Yarhl.FileFormat; using Yarhl.FileSystem; using Yarhl.IO; @@ -144,7 +144,7 @@ private void Transform(Node[] pngs, Node dig, Node[] atms) Pixels = compressed.Tiles, }; - IScreenMap map = compressed.Map; + ITileMap map = compressed.Map; // 3 - Clone original mergedImage = new Dig(mergedImage, newImage); diff --git a/src/JUS.Tool/BatchConverters/Png2Alar3.cs b/src/JUS.Tool/BatchConverters/Png2Alar3.cs index 8cb92fc..0d9911e 100644 --- a/src/JUS.Tool/BatchConverters/Png2Alar3.cs +++ b/src/JUS.Tool/BatchConverters/Png2Alar3.cs @@ -21,9 +21,9 @@ using JUS.Tool.Graphics; using JUS.Tool.Graphics.Converters; using JUS.Tool.Utils; -using Texim.Games.Nitro.Backgrounds.ScreenMaps; using Texim.Images; using Texim.Images.Standard; +using Texim.TileMaps; using Yarhl.FileFormat; using Yarhl.FileSystem; using Yarhl.IO; @@ -154,7 +154,7 @@ private void Transform(Node png, Node dig, Node atm) Height = compressed.Tiles.Length / 8, Pixels = compressed.Tiles, }; - IScreenMap map = compressed.Map; + ITileMap map = compressed.Map; // New Dig: original dig changing height, width and pixels var newDig = new Dig(originalDig, newImage); diff --git a/src/JUS.Tool/Graphics/ALMT.cs b/src/JUS.Tool/Graphics/ALMT.cs index 2643d03..d9abca7 100644 --- a/src/JUS.Tool/Graphics/ALMT.cs +++ b/src/JUS.Tool/Graphics/ALMT.cs @@ -1,4 +1,4 @@ -using Texim.Games.Nitro.Backgrounds.ScreenMaps; +using Texim.TileMaps; namespace JUS.Tool.Graphics { @@ -26,7 +26,7 @@ public enum NitroBackgroundMode /// /// Screen map with format Almt. /// - public class Almt : IScreenMap + public class Almt : ITileMap { /// /// Initializes a new instance of the class. @@ -61,7 +61,7 @@ public Almt(Almt atm) /// /// Almt object to clone. /// ScreenMap object to clone. - public Almt(Almt atm, IScreenMap screenMap) + public Almt(Almt atm, ITileMap screenMap) : this(atm) { Width = screenMap.Width; diff --git a/src/JUS.Tool/Graphics/Converters/Almt2Binary.cs b/src/JUS.Tool/Graphics/Converters/Almt2Binary.cs index 8e8c871..6b10c9c 100644 --- a/src/JUS.Tool/Graphics/Converters/Almt2Binary.cs +++ b/src/JUS.Tool/Graphics/Converters/Almt2Binary.cs @@ -17,7 +17,8 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -using Texim.Games.Nitro.Backgrounds.ScreenMaps; +using Texim.Games.Nitro.TileMaps; +using Texim.TileMaps; using Yarhl.FileFormat; using Yarhl.IO; diff --git a/src/JUS.Tool/Graphics/Converters/Binary2Almt.cs b/src/JUS.Tool/Graphics/Converters/Binary2Almt.cs index 6e9fb5a..dc4d7cf 100644 --- a/src/JUS.Tool/Graphics/Converters/Binary2Almt.cs +++ b/src/JUS.Tool/Graphics/Converters/Binary2Almt.cs @@ -17,7 +17,9 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -using Texim.Games.Nitro.Backgrounds.ScreenMaps; + +using Texim.Games.Nitro.TileMaps; +using Texim.TileMaps; using Yarhl.FileFormat; using Yarhl.IO; @@ -61,7 +63,7 @@ public Almt Convert(IBinary source) almt.Maps = new MapInfo[numInfos]; for (int i = 0; i < almt.Maps.Length; i++) { - almt.Maps[i] = almt.BgMode == NitroBackgroundMode.Affine ? new MapInfo(reader.ReadByte()) : new MapInfo(reader.ReadUInt16()); + almt.Maps[i] = almt.BgMode == NitroBackgroundMode.Affine ? new MapInfo(reader.ReadByte()) : MapInfo.FromUInt16(reader.ReadUInt16()); } return almt; diff --git a/src/JUS.Tool/Graphics/Converters/BinaryDig2Bitmap.cs b/src/JUS.Tool/Graphics/Converters/BinaryDig2Bitmap.cs index 6246c04..93752af 100644 --- a/src/JUS.Tool/Graphics/Converters/BinaryDig2Bitmap.cs +++ b/src/JUS.Tool/Graphics/Converters/BinaryDig2Bitmap.cs @@ -18,9 +18,9 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. using JUS.Tool.Utils; -using Texim.Games.Nitro.Backgrounds.ScreenMaps; using Texim.Images; using Texim.Images.Standard; +using Texim.TileMaps; using Yarhl.FileFormat; using Yarhl.FileSystem; using Yarhl.IO; diff --git a/src/JUS.Tool/Graphics/Dig.cs b/src/JUS.Tool/Graphics/Dig.cs index 4758f26..6b7a331 100644 --- a/src/JUS.Tool/Graphics/Dig.cs +++ b/src/JUS.Tool/Graphics/Dig.cs @@ -1,11 +1,8 @@ -using System; -using System.Diagnostics.CodeAnalysis; -using System.Security.Cryptography.X509Certificates; -using Texim.Games.Nitro.Backgrounds.ScreenMaps; +using System.Diagnostics.CodeAnalysis; using Texim.Images; using Texim.Palettes; using Texim.Pixels; -using Yarhl.FileFormat; +using Texim.TileMaps; namespace JUS.Tool.Graphics { @@ -217,7 +214,7 @@ public void PasteImage(Dig subimage, int xPos, int yPos, bool horizontalFlip, bo /// /// Map to modify. /// The with the transparent tile. - public Dig InsertTransparentTile(IScreenMap map) + public Dig InsertTransparentTile(ITileMap map) { var dig = new Dig(this) { Pixels = new IndexedPixel[this.Pixels.Length + 64], From dc8aa641adda38998ca2612502ba0175b5be87c3 Mon Sep 17 00:00:00 2001 From: Benito Palacios Sanchez Date: Thu, 14 May 2026 00:58:11 +0200 Subject: [PATCH 2/5] feat: migrate to Yarhl converter discovery Remove scenegate plugin library as no additional dependencies are required. --- JUSToolkit.slnx | 1 - docs/articles/tool/install.md | 4 +-- docs/articles/tool/scenegate.md | 3 +-- docs/images/icon_128.png | Bin 0 -> 13496 bytes src/Directory.Build.props | 2 +- .../JUS.SceneGatePlugin.csproj | 25 ------------------ .../JusBinaryHeaderConverterMatcher.cs | 13 ++++----- .../JusPathBinaryConverterMatcher.cs | 11 ++++---- .../JusRegexPathBinaryConverterMatcher.cs | 11 ++++---- .../Discovery}/SupportedSoftware.cs | 2 +- src/JUS.Tool/JUS.Tool.csproj | 4 ++- 11 files changed, 26 insertions(+), 50 deletions(-) create mode 100644 docs/images/icon_128.png delete mode 100644 src/JUS.SceneGatePlugin/JUS.SceneGatePlugin.csproj rename src/{JUS.SceneGatePlugin => JUS.Tool/Discovery}/JusBinaryHeaderConverterMatcher.cs (90%) rename src/{JUS.SceneGatePlugin => JUS.Tool/Discovery}/JusPathBinaryConverterMatcher.cs (93%) rename src/{JUS.SceneGatePlugin => JUS.Tool/Discovery}/JusRegexPathBinaryConverterMatcher.cs (90%) rename src/{JUS.SceneGatePlugin => JUS.Tool/Discovery}/SupportedSoftware.cs (95%) diff --git a/JUSToolkit.slnx b/JUSToolkit.slnx index 4594463..94588d6 100644 --- a/JUSToolkit.slnx +++ b/JUSToolkit.slnx @@ -13,7 +13,6 @@ - diff --git a/docs/articles/tool/install.md b/docs/articles/tool/install.md index 559431e..dc635d7 100644 --- a/docs/articles/tool/install.md +++ b/docs/articles/tool/install.md @@ -18,6 +18,4 @@ Download the latest stable version from the Preview versions can be downloaded from the project [_Actions pipeline artifacts_](https://github.com/priverop/JUSToolkit/actions/workflows/build-and-release.yml). -But they expire after a few days. You may want to follow the -[source code README file](https://github.com/priverop/JUSToolkit) to build the -latest version yourself. +But they expire after a few days, so you may need to build it locally. diff --git a/docs/articles/tool/scenegate.md b/docs/articles/tool/scenegate.md index 351d6c3..b0d3459 100644 --- a/docs/articles/tool/scenegate.md +++ b/docs/articles/tool/scenegate.md @@ -11,8 +11,7 @@ In this guide we'll see how to import the JUSToolkit converters. 1. Download the [latest SceneGate release](https://code.pleonex.dev/SceneGate/SceneGate/releases). 2. Compile this tool (JUSToolkit) and copy `src/JUS.Tool/bin/Debug/net10.0/JUS.Tool.dll`, -and `src/JUS.SceneGatePlugin/bin/Debug/net10.0/JUS.SceneGatePlugin.dll`, to the -downloaded `SceneGate` folder, with the rest of .dll. + to the downloaded `SceneGate` folder, with the rest of .dll. 3. Run `SceneGate.Destktop`, open your legal dump of the game, select it, and double click in the Suggested Converter `Binary2NitroRom`. diff --git a/docs/images/icon_128.png b/docs/images/icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..14f4bf297ea5bf64bf231265785eca1b51c15f8e GIT binary patch literal 13496 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 literal 0 HcmV?d00001 diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 070bb6f..a810155 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -18,7 +18,7 @@ MIT https://github.com/priverop/JUSToolkit https://github.com/priverop/JUSToolkit - + icon.png videogames;romhacking;translating README.md diff --git a/src/JUS.SceneGatePlugin/JUS.SceneGatePlugin.csproj b/src/JUS.SceneGatePlugin/JUS.SceneGatePlugin.csproj deleted file mode 100644 index 89af50b..0000000 --- a/src/JUS.SceneGatePlugin/JUS.SceneGatePlugin.csproj +++ /dev/null @@ -1,25 +0,0 @@ - - - - SceneGate UI plugin for the JUS game formats. - - net10.0 - - enable - enable - false - - - - - - - - - - - - - - - diff --git a/src/JUS.SceneGatePlugin/JusBinaryHeaderConverterMatcher.cs b/src/JUS.Tool/Discovery/JusBinaryHeaderConverterMatcher.cs similarity index 90% rename from src/JUS.SceneGatePlugin/JusBinaryHeaderConverterMatcher.cs rename to src/JUS.Tool/Discovery/JusBinaryHeaderConverterMatcher.cs index b10fd38..3a84f7b 100644 --- a/src/JUS.SceneGatePlugin/JusBinaryHeaderConverterMatcher.cs +++ b/src/JUS.Tool/Discovery/JusBinaryHeaderConverterMatcher.cs @@ -2,11 +2,12 @@ using JUS.Tool.Containers.Converters; using JUS.Tool.Graphics.Converters; using JUS.Tool.Utils; -using SceneGate.UI.Formats.Discovery; +using Yarhl.FileFormat; +using Yarhl.FileFormat.Discovery; using Yarhl.FileSystem; using Yarhl.IO; -namespace JUS.SceneGatePlugin; +namespace JUS.Tool.Discovery; [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] public sealed class JusBinaryHeaderConverterMatcher : IConverterMatcher @@ -45,7 +46,7 @@ public ConverterMatcherResult Match(Node input, ConverterMatcherContext context) // "should be" if header match, but we can't verify the game code MatchingConfidence level = compatibleSoftware == true ? MatchingConfidence.Confident : MatchingConfidence.ShouldBe; - object converter = compatibleFormat.ConverterFactory(); + IConverter converter = compatibleFormat.ConverterFactory(); return new ConverterMatcherResult(level, compatibleFormat.ConverterType, converter); } @@ -60,7 +61,7 @@ private static bool MatchFormat(ConverterMatcherContext context, HeaderFormat fo return false; } - if (context.Header.ReadAsciiString(0, 4) != format.Id) { + if (context.Header.ReadAscii(0, 4) != format.Id) { return false; } @@ -80,10 +81,10 @@ private sealed record HeaderFormat( byte? Version, byte? Flags, Type ConverterType, - Func ConverterFactory) + Func ConverterFactory) { public static HeaderFormat Create(string id, byte? version, byte? flags) - where T : class, new() + where T : class, IConverter, new() { return new HeaderFormat(id, version, flags, typeof(T), () => new T()); } diff --git a/src/JUS.SceneGatePlugin/JusPathBinaryConverterMatcher.cs b/src/JUS.Tool/Discovery/JusPathBinaryConverterMatcher.cs similarity index 93% rename from src/JUS.SceneGatePlugin/JusPathBinaryConverterMatcher.cs rename to src/JUS.Tool/Discovery/JusPathBinaryConverterMatcher.cs index ab92445..bc1c85c 100644 --- a/src/JUS.SceneGatePlugin/JusPathBinaryConverterMatcher.cs +++ b/src/JUS.Tool/Discovery/JusPathBinaryConverterMatcher.cs @@ -1,11 +1,12 @@ using System.Diagnostics.CodeAnalysis; using JUS.Tool.Graphics.Converters; using JUS.Tool.Texts.Converters; -using SceneGate.UI.Formats.Discovery; +using Yarhl.FileFormat; +using Yarhl.FileFormat.Discovery; using Yarhl.FileSystem; using Yarhl.IO; -namespace JUS.SceneGatePlugin; +namespace JUS.Tool.Discovery; [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] public sealed class JusPathBinaryConverterMatcher : IConverterMatcher @@ -60,14 +61,14 @@ public ConverterMatcherResult Match(Node input, ConverterMatcherContext context) // "should be" if header match, but we can't verify the game code MatchingConfidence level = compatibleSoftware == true ? MatchingConfidence.Confident : MatchingConfidence.ShouldBe; - object converter = compatibleFormat.ConverterFactory(); + IConverter converter = compatibleFormat.ConverterFactory(); return new ConverterMatcherResult(level, compatibleFormat.ConverterType, converter); } - private sealed record FormatLocation(string Path, Type ConverterType, Func ConverterFactory) + private sealed record FormatLocation(string Path, Type ConverterType, Func ConverterFactory) { public static FormatLocation Create(string path) - where T : class, new() + where T : class, IConverter, new() { return new FormatLocation(path, typeof(T), () => new T()); } diff --git a/src/JUS.SceneGatePlugin/JusRegexPathBinaryConverterMatcher.cs b/src/JUS.Tool/Discovery/JusRegexPathBinaryConverterMatcher.cs similarity index 90% rename from src/JUS.SceneGatePlugin/JusRegexPathBinaryConverterMatcher.cs rename to src/JUS.Tool/Discovery/JusRegexPathBinaryConverterMatcher.cs index df191ec..e3c1cac 100644 --- a/src/JUS.SceneGatePlugin/JusRegexPathBinaryConverterMatcher.cs +++ b/src/JUS.Tool/Discovery/JusRegexPathBinaryConverterMatcher.cs @@ -1,11 +1,12 @@ using System.Diagnostics.CodeAnalysis; using System.Text.RegularExpressions; using JUS.Tool.Texts.Converters; -using SceneGate.UI.Formats.Discovery; +using Yarhl.FileFormat; +using Yarhl.FileFormat.Discovery; using Yarhl.FileSystem; using Yarhl.IO; -namespace JUS.SceneGatePlugin; +namespace JUS.Tool.Discovery; [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] public sealed class JusRegexPathBinaryConverterMatcher : IConverterMatcher @@ -42,14 +43,14 @@ public ConverterMatcherResult Match(Node input, ConverterMatcherContext context) // "should be" if header match, but we can't verify the game code MatchingConfidence level = compatibleSoftware == true ? MatchingConfidence.Confident : MatchingConfidence.ShouldBe; - object converter = compatibleFormat.ConverterFactory(); + IConverter converter = compatibleFormat.ConverterFactory(); return new ConverterMatcherResult(level, compatibleFormat.ConverterType, converter); } - private sealed record FormatLocation(Regex Regex, Type ConverterType, Func ConverterFactory) + private sealed record FormatLocation(Regex Regex, Type ConverterType, Func ConverterFactory) { public static FormatLocation Create(string pattern) - where T : class, new() + where T : class, IConverter, new() { Regex regex = new(pattern, RegexOptions.Compiled); return new FormatLocation(regex, typeof(T), () => new T()); diff --git a/src/JUS.SceneGatePlugin/SupportedSoftware.cs b/src/JUS.Tool/Discovery/SupportedSoftware.cs similarity index 95% rename from src/JUS.SceneGatePlugin/SupportedSoftware.cs rename to src/JUS.Tool/Discovery/SupportedSoftware.cs index c2ae2d9..9cd7951 100644 --- a/src/JUS.SceneGatePlugin/SupportedSoftware.cs +++ b/src/JUS.Tool/Discovery/SupportedSoftware.cs @@ -1,7 +1,7 @@ using SceneGate.Ekona.Containers.Rom; using Yarhl.FileSystem; -namespace JUS.SceneGatePlugin; +namespace JUS.Tool.Discovery; public static class SupportedSoftware { diff --git a/src/JUS.Tool/JUS.Tool.csproj b/src/JUS.Tool/JUS.Tool.csproj index 63c747c..d16bb50 100644 --- a/src/JUS.Tool/JUS.Tool.csproj +++ b/src/JUS.Tool/JUS.Tool.csproj @@ -7,12 +7,14 @@ - + + + From fd716c8e31a6950bf4b5d04228ab7cdb8a2a8df2 Mon Sep 17 00:00:00 2001 From: Benito Palacios Sanchez Date: Thu, 14 May 2026 01:12:27 +0200 Subject: [PATCH 3/5] ci: update build system and .NET SDK --- .config/dotnet-tools.json | 10 +-- .github/workflows/build-and-release.yml | 29 ++------- .gitignore | 3 +- GitVersion.yml | 8 +-- build.cs | 85 ++++++++++--------------- nuget.config | 1 - 6 files changed, 47 insertions(+), 89 deletions(-) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index d906aee..8df9796 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -10,32 +10,32 @@ "rollForward": false }, "gitversion.tool": { - "version": "5.12.0", + "version": "6.7.0", "commands": [ "dotnet-gitversion" ], "rollForward": false }, "thirdlicense": { - "version": "1.4.0", + "version": "1.4.1", "commands": [ "thirdlicense" ], "rollForward": false }, "dotnet-reportgenerator-globaltool": { - "version": "5.5.1", + "version": "5.5.10", "commands": [ "reportgenerator" ], "rollForward": false }, "docfx": { - "version": "2.78.4", + "version": "2.78.5", "commands": [ "docfx" ], "rollForward": false } } -} +} \ No newline at end of file diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index 049828a..8e5da28 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -11,8 +11,7 @@ on: tags: [ "v*" ] env: - TEST_RESOURCES_NAME: 'resources-0.zip' - DOTNET_VERSIONS: 10.0.203 + DOTNET_VERSIONS: 10.0.300 DOTNET_INSTALL_DIR: '/tmp/dotnet/' jobs: @@ -31,29 +30,11 @@ jobs: with: dotnet-version: ${{ env.DOTNET_VERSIONS }} - # Full test for master builds and PR of repo owners - - name: "[Full] Build, test, and bundle" - if: ${{ env.TEST_RESOURCES_URI != '' }} - run: > - dotnet run build.cs -- - --target=Default - --target=Bundle - --dotnet-configuration=Release - --resource-uri=${{ env.TEST_RESOURCES_URI }} - --resource-name=${{ env.TEST_RESOURCES_NAME }} - --resource-usr=${{ env.TEST_RESOURCES_USR }} - --resource-pwd=${{ env.TEST_RESOURCES_PWD }} + - name: "Build, test, and bundle" + run: dotnet run build.cs -- --target=Build-Bundle --dotnet-configuration=Release env: - TEST_RESOURCES_URI: ${{ secrets.TEST_RESOURCES_URI }} - TEST_RESOURCES_USR: ${{ secrets.TEST_RESOURCES_USR }} - TEST_RESOURCES_PWD: ${{ secrets.TEST_RESOURCES_PWD }} - - # Tests without resources for PR of external contributors - - name: "[Basic] Build, test, and bundle" - if: ${{ env.TEST_RESOURCES_URI == '' }} - run: dotnet run build.cs -- --target=Default --target=Bundle --dotnet-configuration=Release - env: - TEST_RESOURCES_URI: ${{ secrets.TEST_RESOURCES_URI }} + PLEOPS_RESOURCES_URL: ${{ secrets.TEST_RESOURCES_URI }} + PLEOPS_RESOURCES_PWD: ${{ secrets.TEST_RESOURCES_PWD }} - name: "Publish artifacts to CI" uses: actions/upload-artifact@v7 diff --git a/.gitignore b/.gitignore index 6e22c5c..6eed833 100644 --- a/.gitignore +++ b/.gitignore @@ -4,8 +4,7 @@ # Build outputs obj/ bin/ -build/artifacts/ -build/temp/ +build/ /CHANGELOG.md /CHANGELOG.NEXT.md diff --git a/GitVersion.yml b/GitVersion.yml index 1785a95..fabd68e 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -1,6 +1,6 @@ -mode: ContinuousDeployment +workflow: GitHubFlow/v1 +mode: ContinuousDelivery branches: - master: - regex: ^master$ - tag: preview + main: + label: preview increment: Patch diff --git a/build.cs b/build.cs index e8d715b..df05ac3 100644 --- a/build.cs +++ b/build.cs @@ -1,6 +1,6 @@ #!/usr/bin/env dotnet run #:property PublishAot=false -#:package Cake.Frosting.PleOps.Recipe@1.0.4-preview.37 +#:package Cake.Frosting.PleOps.Recipe@1.0.4-preview.62 using System.Diagnostics.CodeAnalysis; using Cake.Common.IO; @@ -9,64 +9,36 @@ using Cake.Core.Diagnostics; using Cake.Frosting; using Cake.Frosting.PleOps.Recipe; -using Cake.Frosting.PleOps.Recipe.Dotnet; +using Cake.Frosting.PleOps.Recipe.Common; return new CakeHost() .AddAssembly(typeof(PleOpsBuildContext).Assembly) - .UseContext() + .UseContext() .UseLifetime() .Run(args); -public sealed class BuildContext : PleOpsBuildContext -{ - public BuildContext(ICakeContext context) - : base(context) - { - } - - public string? TestResourceUri { get; private set; } - - public string? TestResourceName { get; private set; } - - [LogIgnore] - public string? TestResourceUsername { get; private set; } - - [LogIgnore] - public string? TestResourcePassword { get; private set; } - - public override void ReadArguments() - { - base.ReadArguments(); - - Arguments.SetIfPresent("resource-uri", x => TestResourceUri = x); - Arguments.SetIfPresent("resource-name", x => TestResourceName = x); - Arguments.SetIfPresent("resource-usr", x => TestResourceUsername = x); - Arguments.SetIfPresent("resource-pwd", x => TestResourcePassword = x); - } -} - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] -public sealed class BuildLifetime : FrostingLifetime +public sealed class BuildLifetime : FrostingLifetime { - public override void Setup(BuildContext context, ISetupContext info) + public override void Setup(PleOpsBuildContext context, ISetupContext info) { context.WarningsAsErrors = false; context.DotNetContext.CoverageTarget = 0; - context.DotNetContext.ApplicationProjects.Add( - new ProjectPublicationInfo( - "./src/JUS.CLI", - [ "win-x64", "linux-x64", "osx-x64" ], - "net10.0")); - context.ReadArguments(); context.DotNetContext.PreviewNuGetFeed = "https://pkgs.dev.azure.com/SceneGate/SceneGate/_packaging/SceneGate-Preview/nuget/v3/index.json"; + context.DotNetContext.AddApplication("./src/JUS.CLI", [ "win-x64", "linux-x64", "osx-x64" ]); + + context.ResourcesContext.ResourcesDirectory = Path.GetFullPath(Path.Combine("src", "JUS.Tests")); + context.ResourcesContext.DownloadUser = "not_needed"; + context.ResourcesContext.DownloadFormat = ResourcesDownloadFormat.ZipBundle; + context.ResourcesContext.DownloadId = "resources-0.zip"; context.Print(); } - public override void Teardown(BuildContext context, ITeardownContext info) + public override void Teardown(PleOpsBuildContext context, ITeardownContext info) { context.DeliveriesContext.Save(); } @@ -75,6 +47,7 @@ public override void Teardown(BuildContext context, ITeardownContext info) [TaskName("Default")] [IsDependentOn(typeof(Cake.Frosting.PleOps.Recipe.Common.SetGitVersionTask))] [IsDependentOn(typeof(Cake.Frosting.PleOps.Recipe.Common.CleanArtifactsTask))] +[IsDependentOn(typeof(DownloadJusTestFilesTask))] [IsDependentOn(typeof(Cake.Frosting.PleOps.Recipe.Dotnet.DotnetTasks.BuildProjectTask))] public sealed class DefaultTask : FrostingTask { @@ -89,6 +62,13 @@ public sealed class BundleTask : FrostingTask { } +[TaskName("Build-Bundle")] +[IsDependentOn(typeof(DefaultTask))] +[IsDependentOn(typeof(BundleTask))] +public sealed class BuildBundleTask : FrostingTask +{ +} + [TaskName("Deploy")] [IsDependentOn(typeof(Cake.Frosting.PleOps.Recipe.Common.SetGitVersionTask))] [IsDependentOn(typeof(Cake.Frosting.PleOps.Recipe.Dotnet.DotnetTasks.DeployProjectTask))] @@ -97,24 +77,23 @@ public sealed class DeployTask : FrostingTask { } -[TaskName("Download-TestFiles")] +[TaskName("Download-JusTestFiles")] [TaskDescription("Download the test resource files")] -[IsDependeeOf(typeof(Cake.Frosting.PleOps.Recipe.Dotnet.TestTask))] [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] -public class DownloadTestFilesTask : FrostingTask +public class DownloadJusTestFilesTask : FrostingTask { - public override bool ShouldRun(BuildContext context) => - !string.IsNullOrEmpty(context.TestResourceUri); + public override bool ShouldRun(PleOpsBuildContext context) => + !string.IsNullOrEmpty(context.ResourcesContext.DownloadAddress); - public override void Run(BuildContext context) + public override void Run(PleOpsBuildContext context) { - string resourcesPath = Path.GetFullPath(Path.Combine("src", "JUS.Tests")); - - string resourceUri = string.Format(context.TestResourceUri!, context.TestResourceName); + ResourcesContext resourceInfo = context.ResourcesContext; + string resourceUri = string.Format(resourceInfo.DownloadAddress!, resourceInfo.DownloadId); var downloadSettings = new DownloadFileSettings { - Username = context.TestResourceUsername, - Password = context.TestResourcePassword, - UseDefaultCredentials = string.IsNullOrWhiteSpace(context.TestResourceUsername) || string.IsNullOrWhiteSpace(context.TestResourcePassword), + Username = resourceInfo.DownloadUser, + Password = resourceInfo.DownloadPassword, + UseDefaultCredentials = string.IsNullOrWhiteSpace(resourceInfo.DownloadUser) + || string.IsNullOrWhiteSpace(resourceInfo.DownloadPassword), }; context.Log.Information(downloadSettings.UseDefaultCredentials ? "Download without credentials" @@ -124,6 +103,6 @@ public override void Run(BuildContext context) var compressedResources = context.DownloadFile(resourceUri, downloadSettings); context.Log.Debug("Unzipping resource"); - context.Unzip(compressedResources, resourcesPath, true); + context.Unzip(compressedResources, context.ResourcesContext.ResourcesDirectory, true); } } diff --git a/nuget.config b/nuget.config index 8292bd9..81bc27b 100644 --- a/nuget.config +++ b/nuget.config @@ -19,7 +19,6 @@ - From c51b0a09a5edde979b0ec3b1af59abc1bbae1989 Mon Sep 17 00:00:00 2001 From: Benito Palacios Sanchez Date: Thu, 14 May 2026 01:19:53 +0200 Subject: [PATCH 4/5] ci: fix NuGet source for Ekona --- nuget.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nuget.config b/nuget.config index 81bc27b..cf53fa8 100644 --- a/nuget.config +++ b/nuget.config @@ -15,7 +15,7 @@ - + From aa0f9cca4114f34256da8ca3c2c871892ee8811c Mon Sep 17 00:00:00 2001 From: Benito Palacios Sanchez Date: Thu, 14 May 2026 01:26:49 +0200 Subject: [PATCH 5/5] fix: code warnings due to doc, enable warning as error --- build.cs | 2 +- .../Discovery/JusBinaryHeaderConverterMatcher.cs | 4 ++++ .../Discovery/JusPathBinaryConverterMatcher.cs | 4 ++++ .../Discovery/JusRegexPathBinaryConverterMatcher.cs | 4 ++++ src/JUS.Tool/Discovery/SupportedSoftware.cs | 12 ++++++++++++ 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/build.cs b/build.cs index df05ac3..cd0a3ad 100644 --- a/build.cs +++ b/build.cs @@ -22,7 +22,7 @@ public sealed class BuildLifetime : FrostingLifetime { public override void Setup(PleOpsBuildContext context, ISetupContext info) { - context.WarningsAsErrors = false; + context.WarningsAsErrors = true; context.DotNetContext.CoverageTarget = 0; context.ReadArguments(); diff --git a/src/JUS.Tool/Discovery/JusBinaryHeaderConverterMatcher.cs b/src/JUS.Tool/Discovery/JusBinaryHeaderConverterMatcher.cs index 3a84f7b..525354c 100644 --- a/src/JUS.Tool/Discovery/JusBinaryHeaderConverterMatcher.cs +++ b/src/JUS.Tool/Discovery/JusBinaryHeaderConverterMatcher.cs @@ -9,6 +9,9 @@ namespace JUS.Tool.Discovery; +/// +/// Discover compatible converters for binary formats based on their header bytes. +/// [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] public sealed class JusBinaryHeaderConverterMatcher : IConverterMatcher { @@ -25,6 +28,7 @@ public sealed class JusBinaryHeaderConverterMatcher : IConverterMatcher HeaderFormat.Create("DSTX", 1, 4), ]; + /// public ConverterMatcherResult Match(Node input, ConverterMatcherContext context) { if (input.Format is not IBinary) { diff --git a/src/JUS.Tool/Discovery/JusPathBinaryConverterMatcher.cs b/src/JUS.Tool/Discovery/JusPathBinaryConverterMatcher.cs index bc1c85c..31e36a7 100644 --- a/src/JUS.Tool/Discovery/JusPathBinaryConverterMatcher.cs +++ b/src/JUS.Tool/Discovery/JusPathBinaryConverterMatcher.cs @@ -8,6 +8,9 @@ namespace JUS.Tool.Discovery; +/// +/// Discover compatible converters for binary formats based on their path. +/// [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] public sealed class JusPathBinaryConverterMatcher : IConverterMatcher { @@ -38,6 +41,7 @@ public sealed class JusPathBinaryConverterMatcher : IConverterMatcher FormatLocation.Create("data/jquiz/jquiz_pack.aar/jquiz/jquiz.bin"), ]; + /// public ConverterMatcherResult Match(Node input, ConverterMatcherContext context) { if (input.Format is not IBinary) { diff --git a/src/JUS.Tool/Discovery/JusRegexPathBinaryConverterMatcher.cs b/src/JUS.Tool/Discovery/JusRegexPathBinaryConverterMatcher.cs index e3c1cac..7182d33 100644 --- a/src/JUS.Tool/Discovery/JusRegexPathBinaryConverterMatcher.cs +++ b/src/JUS.Tool/Discovery/JusRegexPathBinaryConverterMatcher.cs @@ -8,6 +8,9 @@ namespace JUS.Tool.Discovery; +/// +/// Discover compatible converters for binary formats based a regex for their paths. +/// [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] public sealed class JusRegexPathBinaryConverterMatcher : IConverterMatcher { @@ -20,6 +23,7 @@ public sealed class JusRegexPathBinaryConverterMatcher : IConverterMatcher FormatLocation.Create(@"data/deck/Deck\.aar/deck/\w+/p\d{3}.bin"), ]; + /// public ConverterMatcherResult Match(Node input, ConverterMatcherContext context) { if (input.Format is not IBinary) { diff --git a/src/JUS.Tool/Discovery/SupportedSoftware.cs b/src/JUS.Tool/Discovery/SupportedSoftware.cs index 9cd7951..d97c093 100644 --- a/src/JUS.Tool/Discovery/SupportedSoftware.cs +++ b/src/JUS.Tool/Discovery/SupportedSoftware.cs @@ -3,10 +3,22 @@ namespace JUS.Tool.Discovery; +/// +/// Defines the supported software of this library. +/// public static class SupportedSoftware { + /// + /// Gets the game code for the supported version. + /// public static string GameCode => "AJUJ"; + /// + /// Gets a value indicating whether the node belongs to a compatible software version. + /// + /// The node to test. + /// The node representing the root of the game from the input node. + /// Value indicating whether the node belongs to a compatible software, or null if it cannot be determined. public static bool? IsFromCompatibleSoftware(Node assetNode, out Node root) { ProgramInfo? info = GetProgramInfo(assetNode);