From 6243211a1ea79ee5a11f753ac262464e3ea65b1e Mon Sep 17 00:00:00 2001 From: Danielle Date: Thu, 10 Sep 2026 22:19:10 +1000 Subject: [PATCH 1/5] FFXIV 7.56: Beastmaster support, Sharlayan 9.2.3, dependency refresh (v4.3.36 -> v4.4.0) Fixes CHROMATICS-1P Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 7 ++ .../Chromatics.DecoratorHarnessUI.csproj | 8 +-- Chromatics.Tests/Chromatics.Tests.csproj | 4 +- Chromatics.Tests/Models/JobCoverageTests.cs | 65 +++++++++++++++++++ Chromatics/Chromatics.csproj | 30 ++++----- .../Decorators/AudioVisualizerEffect.cs | 31 +++++++-- Chromatics/Helpers/GameHelper.cs | 9 +++ .../Layers/DynamicLayers/ExperienceTracker.cs | 2 + Chromatics/Models/PaletteColorModel.cs | 4 ++ Chromatics/Program.cs | 18 +++++ Chromatics/locale/de.json | 4 +- Chromatics/locale/en.json | 2 + Chromatics/locale/es.json | 4 +- Chromatics/locale/fr.json | 4 +- Chromatics/locale/ja.json | 4 +- Chromatics/locale/ko.json | 4 +- Chromatics/locale/zh_CN.json | 4 +- 17 files changed, 170 insertions(+), 34 deletions(-) create mode 100644 Chromatics.Tests/Models/JobCoverageTests.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 29cee641..909102c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to Chromatics are documented here. +## 4.4.0 + +- Added support for FFXIV patch 7.56. +- **New:** Beastmaster support. BST gets its own base and highlight colours in the Palette tab, and the Experience Tracker layer follows its levelling. Like Blue Mage, Beastmaster has no job gauge, so the Job Gauge layers stay blank for it. +- Chromatics no longer closes with a crash dialog when a smart light or SDK server refuses a connection in the background. The device is named in the console tab and the rest of your lighting carries on. +- Updated Avalonia, NAudio, Sentry, the Hue libraries, and the rest of the bundled components to their current releases. + ## 4.3.36 - Updated to Sharlayan 9.2.1. diff --git a/Chromatics.DecoratorHarnessUI/Chromatics.DecoratorHarnessUI.csproj b/Chromatics.DecoratorHarnessUI/Chromatics.DecoratorHarnessUI.csproj index 27349f03..e911f0f3 100644 --- a/Chromatics.DecoratorHarnessUI/Chromatics.DecoratorHarnessUI.csproj +++ b/Chromatics.DecoratorHarnessUI/Chromatics.DecoratorHarnessUI.csproj @@ -50,10 +50,10 @@ - - - - + + + + diff --git a/Chromatics.Tests/Chromatics.Tests.csproj b/Chromatics.Tests/Chromatics.Tests.csproj index 8b58cfa7..695e0f1b 100644 --- a/Chromatics.Tests/Chromatics.Tests.csproj +++ b/Chromatics.Tests/Chromatics.Tests.csproj @@ -12,7 +12,7 @@ - + @@ -38,7 +38,7 @@ - + diff --git a/Chromatics.Tests/Models/JobCoverageTests.cs b/Chromatics.Tests/Models/JobCoverageTests.cs new file mode 100644 index 00000000..10b314b7 --- /dev/null +++ b/Chromatics.Tests/Models/JobCoverageTests.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Chromatics.Models; +using Sharlayan.Core.Enums; + +namespace Chromatics.Tests.Models; + +public class JobCoverageTests +{ + // Base classes upgrade into a job and are shown in that job's colours, so + // they carry no palette entry of their own. Unknown is the enum's sentinel + // for "no job read yet" and is never painted. + private static readonly HashSet NotPainted = + ["GLD", "PGL", "MRD", "LNC", "ARC", "CNJ", "THM", "ACN", "ROG", "Unknown"]; + + private static IEnumerable Jobs() + => Enum.GetNames().Where(name => !NotPainted.Contains(name)); + + [Fact] + public void EveryJobHasBaseAndHighlightColours() + { + // Guards the job-addition checklist: a new job in Sharlayan without + // palette entries here paints from whatever the switch falls through + // to, which is silent and easy to miss (BST arrived in 7.56 this way). + var fields = typeof(PaletteColorModel) + .GetFields(BindingFlags.Public | BindingFlags.Instance) + .Select(f => f.Name) + .ToHashSet(StringComparer.Ordinal); + + var missing = Jobs() + .Where(job => !fields.Contains($"Job{job}Base") || !fields.Contains($"Job{job}Highlight")) + .ToList(); + + Assert.True(missing.Count == 0, "Missing: " + string.Join(", ", missing)); + } + + [Fact] + public void EveryJobColourRoundTripsThroughTheLegacyPaletteFile() + { + // Legacy palette files map by name over reflection, so a job whose + // entry exists on the model but not here loads back as its default and + // quietly discards what the user picked. + var dtoProperties = typeof(LegacyColorMappings) + .GetProperties(BindingFlags.Public | BindingFlags.Instance) + .Select(p => p.Name) + .ToHashSet(StringComparer.Ordinal); + + var missing = Jobs() + .Where(job => !dtoProperties.Contains($"ColorMappingJob{job}Base") + || !dtoProperties.Contains($"ColorMappingJob{job}Highlight")) + .ToList(); + + Assert.True(missing.Count == 0, "Missing: " + string.Join(", ", missing)); + } + + [Fact] + public void BeastmasterIsRegistered() + { + Assert.Contains("BST", Enum.GetNames()); + Assert.NotNull(new PaletteColorModel().JobBSTBase); + Assert.NotNull(new PaletteColorModel().JobBSTHighlight); + } +} diff --git a/Chromatics/Chromatics.csproj b/Chromatics/Chromatics.csproj index c7302bd4..85be1080 100644 --- a/Chromatics/Chromatics.csproj +++ b/Chromatics/Chromatics.csproj @@ -10,7 +10,7 @@ net10.0-windows10.0.19041.0 10.0.17763.0 Chromatics.Program - 4.3.36.0 + 4.4.0.0 Danielle Thompson