diff --git a/Assets/archive/starting-background-pre-2026-11-06.jpg b/Assets/archive/starting-background-pre-2026-11-06.jpg new file mode 100644 index 0000000..4a5feb0 Binary files /dev/null and b/Assets/archive/starting-background-pre-2026-11-06.jpg differ diff --git a/Assets/starting-background.jpg b/Assets/starting-background.jpg index 4a5feb0..e23965e 100644 Binary files a/Assets/starting-background.jpg and b/Assets/starting-background.jpg differ diff --git a/Services/LayoutStore.Settings.cs b/Services/LayoutStore.Settings.cs index fcdaf09..2ff1d56 100644 --- a/Services/LayoutStore.Settings.cs +++ b/Services/LayoutStore.Settings.cs @@ -63,6 +63,12 @@ public partial class LayoutStore : IDisposable public void SaveShowMonetaryMetrics(bool show) => UpsertSetting("Metrics.ShowMonetary", show ? "1" : "0"); + /// Which vintage of the shipped default scene art this layout was stamped with. Bumped when + /// a bundled background is replaced, so existing layouts re-seed instead of keeping the old art. + public int LoadDefaultArtVersion() => int.TryParse(GetSetting("Art.DefaultVersion"), out var v) ? v : 1; + + public void SaveDefaultArtVersion(int version) => UpsertSetting("Art.DefaultVersion", version.ToString()); + public bool LoadAutoChromaScreen() => GetSetting("Video.AutoChromaScreen") == "1"; public void SaveAutoChromaScreen(bool enabled) => UpsertSetting("Video.AutoChromaScreen", enabled ? "1" : "0"); diff --git a/ViewModels/MainViewModel.Background.cs b/ViewModels/MainViewModel.Background.cs index dd53414..37135bb 100644 --- a/ViewModels/MainViewModel.Background.cs +++ b/ViewModels/MainViewModel.Background.cs @@ -427,9 +427,30 @@ public partial class MainViewModel /// Heals every scene to the locked Background model after a layout /// load: keeps the correct flavor per scene at index 0 named "Background", /// drops duplicates/stale rows, re-seeds missing ones. + /// Bump when a bundled background image is replaced. Layouts stamped with an older version + /// re-seed their DEFAULT art on next load; a creator's own custom background is never touched. + private const int CurrentDefaultArtVersion = 2; + + /// Re-stamp the shipped art for scenes still using the default. Without this, a replaced + /// starting-background.jpg reaches new installs only: the asset is hash-keyed into the layout + /// database on first seed, so an existing profile keeps showing the old image forever. + private void HealDefaultArtVersion() + { + if (_layoutStore.LoadDefaultArtVersion() >= CurrentDefaultArtVersion) return; + + foreach (var background in AllBackgrounds()) + { + if (!background.UseDefaultBackground) continue; // the creator chose their own art + background.AssetId = null; // seed re-stamps it below + } + + _layoutStore.SaveDefaultArtVersion(CurrentDefaultArtVersion); + } + private void HealBackgrounds() { NormalizeBackgrounds(Scenes); + HealDefaultArtVersion(); foreach (var scene in Scenes) { _sceneGraph.InvalidateBake(scene);