From a6708e5fff08bc914ef43dc984a8fab48a84df73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 7 Nov 2026 11:57:22 +0100 Subject: [PATCH] launcher: interrupted apply recovers cd-active.new (completion marker) or cd-active.old, config.json merged field by field on save across windows, wine version check with warning below 5.0, mirror worlds as check boxes (new multi option type, old values still load), copy progress in mb in the wizard, saves table fits 1280x720 --- docs/manual/18-mods.md | 2 +- notes/bug-review-launcher.md | 13 +- notes/img/app/mirror-worlds-ingame.jpg | Bin 0 -> 38407 bytes notes/img/app/mirror-worlds-option.jpg | Bin 0 -> 77210 bytes notes/img/app/saves-1280x720.jpg | Bin 0 -> 92771 bytes notes/img/app/wizard-copy-mb.jpg | Bin 0 -> 11354 bytes notes/llamamod-app.md | 27 +++- notes/ux-review-launcher.md | 6 +- .../java/com/eliasmueller/llamamod/Main.java | 8 +- .../editor/tools/help/ManualContent.java | 5 + .../llamamod/mods/ModManager.java | 61 +++++++- .../eliasmueller/llamamod/mods/ModOption.java | 74 ++++++++- .../llamamod/mods/mirror/MirrorMod.java | 66 +++----- .../llamamod/platform/Config.java | 148 +++++++++++++++--- .../llamamod/platform/GameLauncher.java | 68 ++++++++ .../llamamod/platform/Installer.java | 23 ++- .../eliasmueller/llamamod/ui/AppState.java | 3 + .../eliasmueller/llamamod/ui/MainFrame.java | 24 ++- .../eliasmueller/llamamod/ui/ModsPanel.java | 34 +++- .../eliasmueller/llamamod/ui/SavesPanel.java | 51 +++--- .../llamamod/ui/SettingsPanel.java | 13 +- .../llamamod/ui/messages.properties | 7 +- .../llamamod/mods/InterruptedApplyTest.java | 123 +++++++++++++++ .../llamamod/mods/ModOptionMultiTest.java | 60 +++++++ .../llamamod/mods/mirror/MirrorTest.java | 1 + .../llamamod/platform/ConfigTest.java | 85 ++++++++++ .../platform/InstallerProgressTest.java | 15 ++ .../llamamod/platform/WineVersionTest.java | 38 +++++ 28 files changed, 843 insertions(+), 112 deletions(-) create mode 100644 notes/img/app/mirror-worlds-ingame.jpg create mode 100644 notes/img/app/mirror-worlds-option.jpg create mode 100644 notes/img/app/saves-1280x720.jpg create mode 100644 notes/img/app/wizard-copy-mb.jpg create mode 100644 src/test/java/com/eliasmueller/llamamod/mods/InterruptedApplyTest.java create mode 100644 src/test/java/com/eliasmueller/llamamod/mods/ModOptionMultiTest.java create mode 100644 src/test/java/com/eliasmueller/llamamod/platform/InstallerProgressTest.java create mode 100644 src/test/java/com/eliasmueller/llamamod/platform/WineVersionTest.java diff --git a/docs/manual/18-mods.md b/docs/manual/18-mods.md index f14b8aa..d3f0a12 100644 --- a/docs/manual/18-mods.md +++ b/docs/manual/18-mods.md @@ -119,7 +119,7 @@ Plays every level mirrored left to right, like the mirror mode of racing games. | Option | Values | Default | Description | |---|---|---|---| -| Worlds | text | all | "all", or the numbers of the worlds to mirror, e.g. "1,3" (1 = Village, 9 = TestLevel). | +| Worlds | any of 1 Village, 2 Jungle at Night, 3 River, 4 Jungle by Day, 5 Mountain, 6 City, 7 Catacombs, 8 Lab, 9 TestLevel | all | The worlds whose levels are mirrored. | | Readable textures | on / off | off | Flips writing and pictures back so they read normally. Some textures (water edges, paths) then show seams. Off: a true mirror image. | | Mirror object models | on / off | off | Also mirrors the shape of objects such as huts and crates (characters stay as they are). Off: objects are only placed mirrored. | diff --git a/notes/bug-review-launcher.md b/notes/bug-review-launcher.md index dbf8f07..2264eb1 100644 --- a/notes/bug-review-launcher.md +++ b/notes/bug-review-launcher.md @@ -82,10 +82,9 @@ Test World with all mods; boot-to-level + all exe mods (River loading card); pra NoClassDefFoundError. * **OneDrive / redirected Documents** (decided: no warning) as data folder: hard links inside a synced folder and on-demand files are fragile; the wizard could warn when the chosen folder is under `%OneDrive%`. -* **Interrupted apply** (app killed between the two renames of `buildActive`): `cd-active` is - missing until the next apply; the GUI then restores the original (dropping the mods), CLI - `--launch` says "CD folder missing". `cd-active.new` is complete at that point and could be moved - in instead. -* A `config.json` saved by a stale window after another instance applied still overwrites - activeMods/gameExeSha256 (L3 only covers the check); a merge-on-save would be needed. -* Old Wine versions are not detected (no version check); missing Wine gives a clear message. +* ~~**Interrupted apply**~~ – fixed 2026-11-07: `cd-active.new.complete` marker + + `ModManager.recoverInterruptedApply()` (GUI start, Play, `--launch`), see llamamod-app.md. +* ~~A `config.json` saved by a stale window overwrites activeMods/gameExeSha256~~ – fixed + 2026-11-07: field-level merge-on-save under `.config.lock` (`Config.save`). +* ~~Old Wine versions are not detected~~ – 2026-11-07: `wine --version` in Settings, warning below + Wine 5.0 (Settings in red, once before Play); missing Wine gives a clear message. diff --git a/notes/img/app/mirror-worlds-ingame.jpg b/notes/img/app/mirror-worlds-ingame.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2ff77a50ff6f85d5b6c6006a2337c8b7f4d7afd3 GIT binary patch literal 38407 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 Qu8{~tk_h`h|8M610j#GgumAu6 literal 0 HcmV?d00001 diff --git a/notes/img/app/mirror-worlds-option.jpg b/notes/img/app/mirror-worlds-option.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92401e052201fec88995fed59c0cea4fdad99811 GIT binary patch literal 77210 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≠v#~ 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⪚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 literal 0 HcmV?d00001 diff --git a/notes/img/app/saves-1280x720.jpg b/notes/img/app/saves-1280x720.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf7bdff1258bff7f4fceb9a985b031eadff30c9b GIT binary patch literal 92771 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

6Oy8ww9OzQUb3{Ma<3*x` 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

B|j*BP@2FLIW0Cgatke{RhJa0DUxF_ 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 literal 0 HcmV?d00001 diff --git a/notes/img/app/wizard-copy-mb.jpg b/notes/img/app/wizard-copy-mb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a443b9e5f3f07201f16c6a31ad03972dd3a0a55 GIT binary patch literal 11354 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 literal 0 HcmV?d00001 diff --git a/notes/llamamod-app.md b/notes/llamamod-app.md index 56e8659..29fd728 100644 --- a/notes/llamamod-app.md +++ b/notes/llamamod-app.md @@ -56,6 +56,7 @@ different folder chosen in the wizard is remembered via `java.util.prefs`. | Path | Content | |---|---| | `config.json` | settings, enabled/active mods, mod option values (`modOptions`), CD fingerprint | +| `.config.lock`, `.apply.lock` | file locks: config merge-on-save, apply/restore | | `original/hd`, `original/cd` | pristine copy of `Setup//Hd` and `…/Cd` from the ISO | | `game/` | copy of the HD part the game runs from: **patched** `groove.exe`, DLLs, music, save games | | `cd-active/` | what the game sees as its CD: hard links to originals + mod outputs | @@ -66,6 +67,13 @@ different folder chosen in the wizard is remembered via `java.util.prefs`. | `wine/` | own Wine prefix (Linux) | | `logs/` | game.log, wineboot.log, registry.log | +**Config merge-on-save**: `Config.save` takes a file lock on `.config.lock` (plus a JVM-wide +monitor), re-reads config.json and three-way merges field by field against the values this +instance last loaded/saved: fields it did not change keep what another window/CLI/editor wrote +meanwhile (mod options merge per mod and key; unknown keys of newer versions are kept); a field +changed on both sides = last writer wins. The object then holds the merged values. A `new +Config()` that never touched a file overwrites everything (installer, tests). + ## First start The wizard takes an ISO file, an extracted folder or a mounted CD. ISO 9660 is read in pure Java @@ -125,7 +133,10 @@ Windows the launcher refuses other paths with a message (choose a folder like `C Wine cannot create win32 prefixes; system.reg only appears after `wineserver -w`). `WINEDLLOVERRIDES=winemenubuilder.exe=d;mscoree=d;mshtml=d` (no menu entries, no Mono/Gecko prompts). Optional virtual desktop: `wine explorer /desktop=LlamaMod,WxH Z:\…\groove.exe`. - Wine missing → clear error message. Running instances are detected via `/proc/*/environ` + Wine missing → clear error message. `wine --version` (cached per command) is shown in Settings; + below `GameLauncher.MIN_WINE` = 5.0 the line turns red and Play warns once per session ("Play + anyway"); unparsable output never warns or blocks. Only Wine 6.0.3 is actually tested; 5.0 is a + guess at the oldest usable version. Running instances are detected via `/proc/*/environ` (`WINEPREFIX=`), so two games never share the prefix. ## Mods @@ -140,7 +151,13 @@ SHA-256(CD fingerprint (names and sizes) | app version+build id | `ExePatcher.RE skips the mod, and an app update re-runs every mod once (a changed mod without a `version()` bump never serves stale output). Manifests store `"app"`; after each apply, cache entries of other app builds (including all of 0.1.0, which have no `"app"`) are deleted. Then `cd-active` is rebuilt in -`cd-active.new` and swapped in (hard link → symlink (not Windows) → copy). Applying (and restoring) +`cd-active.new` and swapped in (hard link → symlink (not Windows) → copy). Once `cd-active.new` is +complete, `cd-active.new.complete` (content: the activeKey of that build) is written; it is removed +after the swap. If the app is killed between the two renames, `ModManager.recoverInterruptedApply()` +(GUI start, Play, CLI `--launch`) moves `cd-active.new` in when its marker matches config.json's +activeKey (exe and config are only written after the swap, so they still describe the previous +selection), otherwise moves `cd-active.old` back; without either nothing is touched (Play then +restores the original as before). Applying (and restoring) is refused while the game runs (`GameLauncher.isRunning()`) and holds an exclusive lock on `/.apply.lock` (a second window/CLI/editor gets "Another LlamaMod window or command is applying mods"); every run is logged to `logs/apply.log`. @@ -163,7 +180,11 @@ above, collapsible headers with "n of m on") and sorts them by name inside a gro **Options** (`mods/ModOption`, record `(key, label, description, type, defaultValue, min, max, choices)`): factories `ModOption.bool(key, label, desc, def)`, `integer(key, label, desc, def, min, max)`, `string(…, def)`, `choice(key, label, desc, def, ModOption.of(value, label)…)`, `seed(key, -label, desc, def)` (empty default = a random seed is chosen on first use and saved). In `apply`: +label, desc, def)` (empty default = a random seed is chosen on first use and saved), `multi(key, label, +desc, def, ModOption.of(value, label)…)` (any subset; value `all`, `none` or the chosen values +comma-separated in choice order, e.g. `1,3`; empty reads as `all`, so a former STRING option holding +"all"/"1,3" keeps its value and cache key; `o.selected(value)` → list of chosen values; UI: a grid of +check boxes; first user: mirror `worlds`). In `apply`: `ctx.option(key)` (normalized string), `ctx.optionBool`, `ctx.optionInt`, `ctx.optionSeed` (long: numeric text as is, other text hashed). Values live in config.json (`modOptions..`, only user-set values and generated seeds); invalid stored values fall back to the default. The UI shows diff --git a/notes/ux-review-launcher.md b/notes/ux-review-launcher.md index 1ed50cf..09b7f28 100644 --- a/notes/ux-review-launcher.md +++ b/notes/ux-review-launcher.md @@ -75,9 +75,9 @@ Severity: **H** = blocks or seriously misleads; **M** = friction every session; | 22 | L | Mods intro | Fixed 640 px wrap; long technical sentence. | **Fixed**: "Tick the mods you want, then click Apply and Play…" | | 23 | L | Wizard done | "Choose mods on the Mods tab, edit save games…". | **Fixed**: "Next: tick the mods you like on the Mods tab, click Apply, then Play. The Save games tab can unlock worlds." | | 24 | L | Launcher edition | No help/manual at all (the manual window lives in the editor plugin and needs an editor context). | Open – a Help button would need `ManualWindow` without `EditorContext` | -| 25 | L | Mirror mode | *Worlds* is free text ("all" / "1,3"); a list of checkboxes would be friendlier. | Open – now explained inline; changing the option type would change saved configs | -| 26 | L | Wizard | The copy page shows the file name, not "123 of 568 MB" or a time. | Open (copy takes seconds from an ISO) | -| 27 | L | Save games | The chapter table shows 4–5 rows at 720 px height. | Partly – the lower header gives it 46 px more | +| 25 | L | Mirror mode | *Worlds* is free text ("all" / "1,3"); a list of checkboxes would be friendlier. | **Fixed** 2026-11-07: check boxes per world (new `ModOption.Type.MULTI`; stored "all"/"1,3" still load) | +| 26 | L | Wizard | The copy page shows the file name, not "123 of 568 MB" or a time. | **Fixed** 2026-11-07: "Copying 123 of 568 MB (file)" | +| 27 | L | Save games | The chapter table shows 4–5 rows at 720 px height. | **Fixed** 2026-11-07: lives moved into the world-map section (one header less), narrower number/check columns, centered coins – 6 rows at 1280×720 and 840×720 (was 4.5) | ## Changes (files) diff --git a/src/main/java/com/eliasmueller/llamamod/Main.java b/src/main/java/com/eliasmueller/llamamod/Main.java index de57455..0776f4a 100644 --- a/src/main/java/com/eliasmueller/llamamod/Main.java +++ b/src/main/java/com/eliasmueller/llamamod/Main.java @@ -183,7 +183,11 @@ public final class Main { case "--launch" -> { requireInstalled(cfg); new SaveStore(paths).migrateNullSaves().forEach(System.out::println); - checkExe(new ModManager(paths, cfg), paths); + ModManager mm = new ModManager(paths, cfg); + if (mm.recoverInterruptedApply()) { + System.out.println("Repaired the CD folder of an interrupted apply."); + } + checkExe(mm, paths); GameLauncher gl = new GameLauncher(paths, cfg); Process p; try { @@ -262,7 +266,7 @@ public final class Main { String range = switch (o.type()) { case INT -> " " + o.min() + ".." + o.max(); - case CHOICE -> " " + case CHOICE, MULTI -> (o.type() == ModOption.Type.MULTI ? " all, none or list of " : " ") + o.choices().stream() .map(ModOption.Choice::value) .toList(); diff --git a/src/main/java/com/eliasmueller/llamamod/editor/tools/help/ManualContent.java b/src/main/java/com/eliasmueller/llamamod/editor/tools/help/ManualContent.java index 9843c8f..231fc84 100644 --- a/src/main/java/com/eliasmueller/llamamod/editor/tools/help/ManualContent.java +++ b/src/main/java/com/eliasmueller/llamamod/editor/tools/help/ManualContent.java @@ -342,6 +342,11 @@ public final class ManualContent { o.choices().forEach(ch -> c.add(ch.label())); yield String.join(", ", c); } + case MULTI -> { + List c = new ArrayList<>(); + o.choices().forEach(ch -> c.add(ch.label())); + yield "any of " + String.join(", ", c); + } case SEED -> "any text"; case STRING -> "text"; }; diff --git a/src/main/java/com/eliasmueller/llamamod/mods/ModManager.java b/src/main/java/com/eliasmueller/llamamod/mods/ModManager.java index c8155e2..1c8751d 100644 --- a/src/main/java/com/eliasmueller/llamamod/mods/ModManager.java +++ b/src/main/java/com/eliasmueller/llamamod/mods/ModManager.java @@ -437,7 +437,7 @@ public final class ModManager { // than writing the exe, and a new exe must not run against the old CD folder p.update(0.92, "Building CD folder …"); long t0 = System.nanoTime(); - Map kinds = buildActive(ov, p.sub(0.92, 1)); + Map kinds = buildActive(ov, order.isEmpty() ? "" : key, p.sub(0.92, 1)); log.line(String.format(Locale.ROOT, "CD folder: %s in %.1f s", kinds, (System.nanoTime() - t0) / 1e9)); writeExe(exe, log, notes); if (exe != null) { @@ -673,11 +673,17 @@ public final class ModManager { return notes; } - private Map buildActive(Overlay ov, Progress p) throws IOException { + /** + * {@code key}: the activeKey of this build, written to {@code cd-active.new.complete} once the + * folder is complete so {@link #recoverInterruptedApply()} can tell which state it holds. + */ + private Map buildActive(Overlay ov, String key, Progress p) throws IOException { Map kinds = new EnumMap<>(FileOps.LinkKind.class); Path active = paths.cdActive(); Path next = active.resolveSibling("cd-active.new"); Path old = active.resolveSibling("cd-active.old"); + Path marker = completeMarker(); + Files.deleteIfExists(marker); FileOps.deleteTree(next); FileOps.deleteTree(old); Files.createDirectories(next); @@ -691,14 +697,65 @@ public final class ModManager { p.update((double) n / all.size(), "Building CD folder (" + n + "/" + all.size() + ") …"); } } + Files.writeString(marker, key, StandardCharsets.UTF_8); if (Files.exists(active)) { FileOps.move(active, old); } FileOps.move(next, active); + Files.deleteIfExists(marker); FileOps.deleteTree(old); return kinds; } + private Path completeMarker() { + return paths.cdActive().resolveSibling("cd-active.new.complete"); + } + + /** + * Repairs a {@code cd-active} that is missing because an apply was killed between its two + * renames: {@code cd-active.new} is moved in if it is complete and built for the selection + * config.json records (activeKey, which matches game/groove.exe because both are written only + * after the swap); otherwise {@code cd-active.old}, the folder of that recorded selection, is + * moved back. Returns false if nothing was repaired (no interruption, another apply running). + */ + public boolean recoverInterruptedApply() { + Path active = paths.cdActive(); + if (Files.exists(active)) { + return false; + } + Path next = active.resolveSibling("cd-active.new"); + Path old = active.resolveSibling("cd-active.old"); + if (!Files.isDirectory(next) && !Files.isDirectory(old)) { + return false; + } + // no ApplyLog: it would truncate apply.log, which tells what the interrupted apply did + try (DataLock lock = DataLock.acquire(paths)) { + if (Files.exists(active)) { + return false; + } + Path marker = completeMarker(); + String built = Files.isRegularFile(marker) ? Files.readString(marker, StandardCharsets.UTF_8) : null; + String recorded = Config.load(paths.config()).activeKey; + Path use; + if (built != null && built.equals(recorded) && Files.isDirectory(next)) { + use = next; + } else if (Files.isDirectory(old)) { + use = old; + } else { + System.err.println("interrupted apply: cd-active missing, cd-active.new " + + (built == null ? "incomplete" : "built for another selection") + " – not recovered"); + return false; + } + FileOps.move(use, active); + Files.deleteIfExists(marker); + FileOps.deleteTree(use == next ? old : next); + System.err.println("interrupted apply: recovered cd-active from " + use.getFileName()); + return true; + } catch (IOException e) { + return false; + } + } + public long cacheSize() throws IOException { if (!Files.isDirectory(paths.cache())) { return 0; diff --git a/src/main/java/com/eliasmueller/llamamod/mods/ModOption.java b/src/main/java/com/eliasmueller/llamamod/mods/ModOption.java index 1a6de4c..d1ac432 100644 --- a/src/main/java/com/eliasmueller/llamamod/mods/ModOption.java +++ b/src/main/java/com/eliasmueller/llamamod/mods/ModOption.java @@ -1,8 +1,11 @@ package com.eliasmueller.llamamod.mods; +import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Objects; +import java.util.Set; /** * A user-settable option of a mod. Values are stored as canonical strings (see {@link @@ -10,6 +13,10 @@ import java.util.Objects; * *

SEED options hold any text; {@link ModContext#optionSeed(String)} turns it into a number. An * empty SEED default means "pick a random seed when the mod is first used" (then persisted). + * + *

MULTI options pick any subset of their choices; the value is {@code "all"}, {@code "none"} or + * the chosen values comma-separated in choice order (an empty value reads as "all", so a former + * STRING option holding "all" or "1,3" keeps its meaning and cache key). */ public record ModOption( String key, @@ -26,9 +33,13 @@ public record ModOption( INT, STRING, CHOICE, - SEED + SEED, + MULTI } + public static final String ALL = "all"; + public static final String NONE = "none"; + /** A CHOICE value and its UI label. */ public record Choice(String value, String label) {} @@ -42,8 +53,15 @@ public record ModOption( description = description == null ? "" : description; choices = choices == null ? List.of() : List.copyOf(choices); defaultValue = defaultValue == null ? "" : defaultValue; - if (type == Type.CHOICE && choices.isEmpty()) { - throw new IllegalArgumentException("CHOICE option without choices: " + key); + if ((type == Type.CHOICE || type == Type.MULTI) && choices.isEmpty()) { + throw new IllegalArgumentException(type + " option without choices: " + key); + } + if (type == Type.MULTI + && choices.stream() + .anyMatch(c -> c.value().equalsIgnoreCase(ALL) + || c.value().equalsIgnoreCase(NONE) + || !c.value().matches("[^,;\\s]+"))) { + throw new IllegalArgumentException("MULTI choice values must be single words other than all/none: " + key); } if (type != Type.SEED || !defaultValue.isEmpty()) { defaultValue = normalize(key, type, min, max, choices, defaultValue); @@ -66,6 +84,25 @@ public record ModOption( return new ModOption(key, label, description, Type.CHOICE, def, 0, 0, List.of(choices)); } + /** Any subset of {@code choices}; {@code def} e.g. "all", "none" or "1,3". */ + public static ModOption multi(String key, String label, String description, String def, Choice... choices) { + return new ModOption(key, label, description, Type.MULTI, def, 0, 0, List.of(choices)); + } + + /** The choice values a normalized MULTI value stands for, in choice order. */ + public List selected(String value) { + String v = normalize(value); + if (v.equals(ALL)) { + return choices.stream().map(Choice::value).toList(); + } + return v.equals(NONE) ? List.of() : List.of(v.split(",")); + } + + /** Normalized MULTI value for the chosen values. */ + public String multiValue(Collection chosen) { + return chosen.isEmpty() ? NONE : normalize(String.join(",", chosen)); + } + /** {@code def} empty = random seed on first use. */ public static ModOption seed(String key, String label, String description, String def) { return new ModOption(key, label, description, Type.SEED, def, 0, 0, List.of()); @@ -111,6 +148,37 @@ public record ModOption( raw, "expected one of " + choices.stream().map(Choice::value).toList()); } + case MULTI -> { + String lower = v.toLowerCase(Locale.ROOT); + if (lower.isEmpty() || lower.equals(ALL)) { + yield ALL; + } + if (lower.equals(NONE)) { + yield NONE; + } + Set picked = new HashSet<>(); + for (String part : lower.split("[,;\\s]+")) { + if (part.isEmpty()) { + continue; + } + Choice c = choices.stream() + .filter(x -> x.value().equalsIgnoreCase(part)) + .findFirst() + .orElseThrow(() -> invalid( + key, + raw, + "expected all, none or a list of " + + choices.stream() + .map(Choice::value) + .toList())); + picked.add(c.value()); + } + List inOrder = choices.stream() + .map(Choice::value) + .filter(picked::contains) + .toList(); + yield inOrder.size() == choices.size() ? ALL : inOrder.isEmpty() ? NONE : String.join(",", inOrder); + } case STRING -> v; case SEED -> { if (v.isEmpty()) { diff --git a/src/main/java/com/eliasmueller/llamamod/mods/mirror/MirrorMod.java b/src/main/java/com/eliasmueller/llamamod/mods/mirror/MirrorMod.java index a22490e..c4167df 100644 --- a/src/main/java/com/eliasmueller/llamamod/mods/mirror/MirrorMod.java +++ b/src/main/java/com/eliasmueller/llamamod/mods/mirror/MirrorMod.java @@ -6,13 +6,14 @@ import com.eliasmueller.llamamod.mods.LevelWads; import com.eliasmueller.llamamod.mods.Mod; import com.eliasmueller.llamamod.mods.ModContext; import com.eliasmueller.llamamod.mods.ModOption; +import com.eliasmueller.llamamod.save.Worlds; import java.io.IOException; import java.util.HashSet; import java.util.List; -import java.util.Locale; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.IntStream; /** Mirror mode: every level is mirrored left-right (see {@link Mirror}). */ public final class MirrorMod implements Mod { @@ -42,55 +43,40 @@ public final class MirrorMod implements Mod { @Override public List options() { - return List.of( - ModOption.string( - "worlds", - "Worlds", - "\"all\", or the numbers of the worlds to mirror, e.g. \"1,3\" (1 = Village, 9 = TestLevel).", - "all"), - ModOption.bool( - "readableTextures", - "Readable textures", - "Flips writing and pictures back so they read normally. Some textures (water edges, paths)" - + " then show seams. Off: a true mirror image.", - false), - ModOption.bool( - "objects", - "Mirror object models", - "Also mirrors the shape of objects such as huts and crates (characters stay as they are)." - + " Off: objects are only placed mirrored.", - false)); + return OPTIONS; } + private static final ModOption.Choice[] WORLDS = IntStream.rangeClosed(1, Worlds.COUNT) + .mapToObj(w -> ModOption.of(Integer.toString(w), w + " " + Worlds.name(w))) + .toArray(ModOption.Choice[]::new); + + private static final List OPTIONS = List.of( + ModOption.multi("worlds", "Worlds", "The worlds whose levels are mirrored.", ModOption.ALL, WORLDS), + ModOption.bool( + "readableTextures", + "Readable textures", + "Flips writing and pictures back so they read normally. Some textures (water edges, paths)" + + " then show seams. Off: a true mirror image.", + false), + ModOption.bool( + "objects", + "Mirror object models", + "Also mirrors the shape of objects such as huts and crates (characters stay as they are)." + + " Off: objects are only placed mirrored.", + false)); + /** After the test world (50) so it is mirrored too; before the debug wireframe (100) so the overlay matches. */ @Override public int order() { return 75; } + /** World numbers of a "worlds" value ("all", "none", "1,3"; formerly free text, still accepted). */ static Set worlds(String spec) { + ModOption o = OPTIONS.getFirst(); Set out = new HashSet<>(); - String s = spec.trim().toLowerCase(Locale.ROOT); - if (s.isEmpty() || s.equals("all")) { - for (int i = 1; i <= 9; i++) { - out.add(i); - } - return out; - } - for (String p : s.split("[,; ]+")) { - if (p.isEmpty()) { - continue; - } - int w; - try { - w = Integer.parseInt(p); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("Mirror mode: invalid world \"" + p + "\""); - } - if (w < 1 || w > 9) { - throw new IllegalArgumentException("Mirror mode: world " + w + " is not 1-9"); - } - out.add(w); + for (String w : o.selected(spec)) { + out.add(Integer.parseInt(w)); } return out; } diff --git a/src/main/java/com/eliasmueller/llamamod/platform/Config.java b/src/main/java/com/eliasmueller/llamamod/platform/Config.java index ea174b9..f4e58a3 100644 --- a/src/main/java/com/eliasmueller/llamamod/platform/Config.java +++ b/src/main/java/com/eliasmueller/llamamod/platform/Config.java @@ -1,13 +1,19 @@ package com.eliasmueller.llamamod.platform; import java.io.IOException; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardOpenOption; import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.TreeMap; public final class Config { @@ -42,38 +48,49 @@ public final class Config { return layout >= LAYOUT; } + /** + * Values as last loaded or saved by this instance ({@link #snapshot()} form); null for a + * Config that never touched a file. {@link #save} merges against it. + */ + private Map base; + public static Config load(Path file) { Config c = new Config(); if (!Files.isRegularFile(file)) { + c.base = c.snapshot(); return c; } try { - Object o = Json.parse(Files.readString(file, StandardCharsets.UTF_8)); - if (o instanceof Map m) { - c.layout = num(m.get("layout"), 0); - c.source = str(m.get("source"), ""); - c.exeSha256 = str(m.get("exeSha256"), ""); - c.cdFingerprint = str(m.get("cdFingerprint"), ""); - c.enabledMods = list(m.get("enabledMods")); - c.modOptions = options(m.get("modOptions")); - c.activeKey = str(m.get("activeKey"), ""); - c.activeMods = list(m.get("activeMods")); - c.screenW = num(m.get("screenW"), 0); - c.screenH = num(m.get("screenH"), 0); - c.virtualDesktop = !Boolean.FALSE.equals(m.get("virtualDesktop")); - c.wineCommand = str(m.get("wineCommand"), ""); - c.theme = str(m.get("theme"), "light"); - c.gameExeSha256 = str(m.get("gameExeSha256"), ""); - c.exeMods = list(m.get("exeMods")); - c.antivirusNoticeDismissed = Boolean.TRUE.equals(m.get("antivirusNoticeDismissed")); + if (Json.parse(Files.readString(file, StandardCharsets.UTF_8)) instanceof Map m) { + c.read(m); } } catch (IOException | RuntimeException e) { System.err.println("config.json unreadable, using defaults: " + e.getMessage()); recover(file, c); } + c.base = c.snapshot(); return c; } + private void read(Map m) { + layout = num(m.get("layout"), 0); + source = str(m.get("source"), ""); + exeSha256 = str(m.get("exeSha256"), ""); + cdFingerprint = str(m.get("cdFingerprint"), ""); + enabledMods = list(m.get("enabledMods")); + modOptions = options(m.get("modOptions")); + activeKey = str(m.get("activeKey"), ""); + activeMods = list(m.get("activeMods")); + screenW = num(m.get("screenW"), 0); + screenH = num(m.get("screenH"), 0); + virtualDesktop = !Boolean.FALSE.equals(m.get("virtualDesktop")); + wineCommand = str(m.get("wineCommand"), ""); + theme = str(m.get("theme"), "light"); + gameExeSha256 = str(m.get("gameExeSha256"), ""); + exeMods = list(m.get("exeMods")); + antivirusNoticeDismissed = Boolean.TRUE.equals(m.get("antivirusNoticeDismissed")); + } + /** * Damaged config.json (e.g. cut off by a crash): keeps a copy as config.json.broken (the next * save overwrites the file) and, if the data folder holds an installation, keeps it usable @@ -96,7 +113,7 @@ public final class Config { } } - public void save(Path file) throws IOException { + private Map toMap() { Map m = new LinkedHashMap<>(); m.put("layout", layout); m.put("source", source); @@ -114,7 +131,98 @@ public final class Config { m.put("gameExeSha256", gameExeSha256); m.put("exeMods", exeMods); m.put("antivirusNoticeDismissed", antivirusNoticeDismissed); - FileOps.writeAtomic(file, Json.write(m).getBytes(StandardCharsets.UTF_8)); + return m; + } + + /** Deep copy in the types {@link Json#parse} returns, so it compares equal to re-read files. */ + @SuppressWarnings("unchecked") + private Map snapshot() { + return (Map) Json.parse(Json.write(toMap())); + } + + /** + * Saves under a lock file and merges with what is on disk: fields this instance did not change + * since it loaded or last saved the file keep the value another window or command wrote + * meanwhile (mod options per mod and key). Afterwards this object holds the merged values. + */ + public void save(Path file) throws IOException { + synchronized (Config.class) { // FileLock is per process; threads of this JVM wait here + Path dir = file.toAbsolutePath().getParent(); + Files.createDirectories(dir); + try (FileChannel ch = FileChannel.open( + dir.resolve(".config.lock"), StandardOpenOption.CREATE, StandardOpenOption.WRITE); + FileLock lock = ch.lock()) { + Map merged = merge(base, snapshot(), readMap(file)); + read(merged); + FileOps.writeAtomic(file, Json.write(merged).getBytes(StandardCharsets.UTF_8)); + base = snapshot(); + } + } + } + + private static Map readMap(Path file) { + try { + if (Files.isRegularFile(file) + && Json.parse(Files.readString(file, StandardCharsets.UTF_8)) instanceof Map m) { + Map out = new LinkedHashMap<>(); + m.forEach((k, v) -> out.put(k.toString(), v)); + return out; + } + } catch (IOException | RuntimeException e) { + // unreadable: overwritten with this instance's values + } + return null; + } + + /** Field-level three-way merge; keys only on disk (written by a newer version) are kept. */ + static Map merge(Map base, Map mine, Map disk) { + if (base == null || disk == null) { + return mine; + } + Map out = new LinkedHashMap<>(disk); + for (Map.Entry e : mine.entrySet()) { + String k = e.getKey(); + Object v = e.getValue(); + if (k.equals("modOptions") && v instanceof Map mo && base.get(k) instanceof Map bo) { + out.put(k, mergeOptions(bo, mo, disk.get(k) instanceof Map d ? d : Map.of())); + } else if (!Objects.equals(v, base.get(k)) || !disk.containsKey(k)) { + out.put(k, v); + } + } + return out; + } + + private static Map mergeOptions(Map base, Map mine, Map disk) { + Map> out = new TreeMap<>(); + disk.forEach((mod, vals) -> { + if (vals instanceof Map vm) { + Map copy = new TreeMap<>(); + vm.forEach((k, v) -> copy.put(k.toString(), v)); + out.put(mod.toString(), copy); + } + }); + Set mods = new HashSet<>(base.keySet()); + mods.addAll(mine.keySet()); + for (Object mod : mods) { + Map b = base.get(mod) instanceof Map x ? x : Map.of(); + Map m = mine.get(mod) instanceof Map x ? x : Map.of(); + Set keys = new HashSet<>(b.keySet()); + keys.addAll(m.keySet()); + for (Object key : keys) { + Object mv = m.get(key); + if (Objects.equals(mv, b.get(key))) { + continue; + } + Map target = out.computeIfAbsent(mod.toString(), x -> new TreeMap<>()); + if (mv == null) { + target.remove(key.toString()); + } else { + target.put(key.toString(), mv); + } + } + } + out.values().removeIf(Map::isEmpty); + return new TreeMap<>(out); } private static int num(Object o, int def) { diff --git a/src/main/java/com/eliasmueller/llamamod/platform/GameLauncher.java b/src/main/java/com/eliasmueller/llamamod/platform/GameLauncher.java index ab22dd0..3789bad 100644 --- a/src/main/java/com/eliasmueller/llamamod/platform/GameLauncher.java +++ b/src/main/java/com/eliasmueller/llamamod/platform/GameLauncher.java @@ -17,7 +17,11 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Stream; /** @@ -253,6 +257,70 @@ public final class GameLauncher { return null; } + /** + * Oldest Wine we expect to run the game. Only Wine 6.0.3 was actually tested; older builds lack + * fixes the JDK and DirectX 6/7 games rely on, so below this the UI warns (it never blocks). + */ + public static final int[] MIN_WINE = {5, 0}; + + private static final Map> WINE_VERSIONS = new ConcurrentHashMap<>(); + + /** {major, minor} from {@code wine --version} output ("wine-6.0.3 (Ubuntu …)"), null if unknown. */ + public static int[] parseWineVersion(String out) { + if (out == null) { + return null; + } + Matcher m = Pattern.compile("(?i)\\bwine[- ]?(\\d+)\\.(\\d+)").matcher(out); + if (!m.find()) { + return null; + } + try { + return new int[] {Integer.parseInt(m.group(1)), Integer.parseInt(m.group(2))}; + } catch (NumberFormatException e) { + return null; + } + } + + public static boolean wineTooOld(int[] v) { + return v != null && (v[0] < MIN_WINE[0] || v[0] == MIN_WINE[0] && v[1] < MIN_WINE[1]); + } + + /** First line of {@code wine --version} (cached per command), null if it cannot be run. */ + public String wineVersion() { + String wine = wineCommand(); + if (wine == null || Os.isWindows()) { + return null; + } + return WINE_VERSIONS + .computeIfAbsent(wine, w -> { + try { + Process p = new ProcessBuilder(w, "--version") + .redirectErrorStream(true) + .start(); + p.getOutputStream().close(); + if (!p.waitFor(5, TimeUnit.SECONDS)) { + p.destroyForcibly(); + return Optional.empty(); + } + String out = new String(p.getInputStream().readAllBytes(), StandardCharsets.UTF_8).strip(); + int nl = out.indexOf('\n'); + return Optional.of(nl < 0 ? out : out.substring(0, nl)); + } catch (IOException e) { + return Optional.empty(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return Optional.empty(); + } + }) + .orElse(null); + } + + /** The detected Wine version if it is older than {@link #MIN_WINE}, else null (also if unknown). */ + public String tooOldWine() { + String v = wineVersion(); + return wineTooOld(parseWineVersion(v)) ? v : null; + } + /** True if {@code cmd} is an executable file (a path) or found on the PATH (a plain name). */ public static boolean isCommand(String cmd) { if (cmd.contains("/") || cmd.contains(File.separator)) { diff --git a/src/main/java/com/eliasmueller/llamamod/platform/Installer.java b/src/main/java/com/eliasmueller/llamamod/platform/Installer.java index 0b7678c..ed51fa7 100644 --- a/src/main/java/com/eliasmueller/llamamod/platform/Installer.java +++ b/src/main/java/com/eliasmueller/llamamod/platform/Installer.java @@ -131,15 +131,32 @@ public final class Installer { continue; // already copied (resume after cancel) } double all = Math.max(1, total); - String msg = "Copying " + f.path(); + long before = done[0]; + Progress fileP = new Progress() { + @Override + public void update(double fraction, String message) { + long bytes = before + Math.round(f.size() * Math.max(0, Math.min(1, fraction))); + p.update(bytes / all, copyMessage(bytes, total, f.path())); + } + + @Override + public boolean cancelled() { + return p.cancelled(); + } + }; try (InputStream in = src.open(f)) { - FileOps.copy(in, t, f.size(), p.sub(done[0] / all, (done[0] + f.size()) / all), msg); + FileOps.copy(in, t, f.size(), fileP, ""); } done[0] += f.size(); - p.update(done[0] / all, msg); + p.update(done[0] / all, copyMessage(done[0], total, f.path())); } } + /** "Copying 123 of 568 MB (wads/t1l1m001.wad)". */ + static String copyMessage(long done, long total, String file) { + return String.format(Locale.ROOT, "Copying %d of %d MB (%s)", done >> 20, total >> 20, file); + } + private static Path target(Path dest, GameSource.SrcFile f) { return dest.resolve(f.path().replace('/', File.separatorChar)).normalize(); } diff --git a/src/main/java/com/eliasmueller/llamamod/ui/AppState.java b/src/main/java/com/eliasmueller/llamamod/ui/AppState.java index 45ab0f4..931ba0b 100644 --- a/src/main/java/com/eliasmueller/llamamod/ui/AppState.java +++ b/src/main/java/com/eliasmueller/llamamod/ui/AppState.java @@ -31,6 +31,9 @@ final class AppState { launcher = new GameLauncher(p, cfg); saves = new SaveStore(p); modManager = new ModManager(p, cfg); + if (cfg.installed()) { + modManager.recoverInterruptedApply(); + } } void reloadMods() { diff --git a/src/main/java/com/eliasmueller/llamamod/ui/MainFrame.java b/src/main/java/com/eliasmueller/llamamod/ui/MainFrame.java index 2f914ed..f782a73 100644 --- a/src/main/java/com/eliasmueller/llamamod/ui/MainFrame.java +++ b/src/main/java/com/eliasmueller/llamamod/ui/MainFrame.java @@ -59,6 +59,7 @@ final class MainFrame extends JFrame { private volatile boolean cancelRequested; private boolean gameRunning; private boolean crashReported; + private boolean oldWineAccepted; MainFrame(AppState state) { super("LlamaMod"); @@ -458,6 +459,26 @@ final class MainFrame extends JFrame { return false; } + /** Warns once per session before playing with a Wine older than GameLauncher.MIN_WINE. */ + private boolean confirmOldWine() { + String v = oldWineAccepted ? null : state.launcher.tooOldWine(); + if (v == null) { + return true; + } + Object[] options = {Strings.t("play.wineTooOld.play"), Strings.t("cancel")}; + int r = JOptionPane.showOptionDialog( + this, + Strings.t("play.wineTooOld", v, GameLauncher.MIN_WINE[0] + "." + GameLauncher.MIN_WINE[1]), + "LlamaMod", + JOptionPane.DEFAULT_OPTION, + JOptionPane.WARNING_MESSAGE, + null, + options, + options[1]); + oldWineAccepted = r == 0; + return oldWineAccepted; + } + /** Re-applies the active mods, which writes game/groove.exe again. */ void rebuildExe(Runnable after) { var active = state.activeMods(); @@ -470,13 +491,14 @@ final class MainFrame extends JFrame { } private void launchGame() { - if (!checkGameExe(this::launchGame)) { + if (!checkGameExe(this::launchGame) || !confirmOldWine()) { return; } runTask( Strings.t("task.launch"), p -> { state.saves.migrateNullSaves(); + state.modManager.recoverInterruptedApply(); if (!Files.isDirectory(state.paths.cdActive())) { state.modManager.restoreOriginal(p.sub(0, 0.3)); } diff --git a/src/main/java/com/eliasmueller/llamamod/ui/ModsPanel.java b/src/main/java/com/eliasmueller/llamamod/ui/ModsPanel.java index 4814dc2..3a5b6b7 100644 --- a/src/main/java/com/eliasmueller/llamamod/ui/ModsPanel.java +++ b/src/main/java/com/eliasmueller/llamamod/ui/ModsPanel.java @@ -15,6 +15,7 @@ import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; +import java.awt.GridLayout; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; @@ -499,6 +500,10 @@ final class ModsPanel extends JPanel { l.setToolTipText(tip); l.setLabelFor(input); g.gridx = 0; + if (o.type() == ModOption.Type.MULTI) { + g.anchor = GridBagConstraints.NORTHWEST; + g.insets = new Insets(6, 0, 2, 12); + } p.add(l, g); g = (GridBagConstraints) g.clone(); g.gridx = 1; @@ -512,8 +517,8 @@ final class ModsPanel extends JPanel { h.gridy = row++; h.weightx = 1; h.fill = GridBagConstraints.HORIZONTAL; - h.anchor = GridBagConstraints.WEST; - h.insets = new Insets(2, 16, 2, 0); + h.anchor = o.type() == ModOption.Type.MULTI ? GridBagConstraints.NORTHWEST : GridBagConstraints.WEST; + h.insets = new Insets(o.type() == ModOption.Type.MULTI ? 6 : 2, 16, 2, 0); p.add(tip == null ? Box.createHorizontalGlue() : hintText(tip), h); } return p; @@ -572,6 +577,31 @@ final class ModsPanel extends JPanel { optionInputs.add(c); return c; } + case MULTI -> { + // a grid of check boxes, three per row when there are many choices + JPanel p = new JPanel(new GridLayout( + 0, o.choices().size() > 4 ? 3 : o.choices().size(), 12, 0)); + p.setOpaque(false); + List on = o.selected(value); + List boxes = new ArrayList<>(); + for (ModOption.Choice c : o.choices()) { + JCheckBox b = new JCheckBox(c.label(), on.contains(c.value())); + b.setOpaque(false); + boxes.add(b); + b.addActionListener(e -> { + List chosen = new ArrayList<>(); + for (int i = 0; i < boxes.size(); i++) { + if (boxes.get(i).isSelected()) { + chosen.add(o.choices().get(i).value()); + } + } + setOption(m, o, o.multiValue(chosen), p); + }); + optionInputs.add(b); + p.add(b); + } + return p; + } case SEED -> { JTextField t = textInput(m, o, value, 12); JButton random = new JButton(Strings.t("mods.option.random")); diff --git a/src/main/java/com/eliasmueller/llamamod/ui/SavesPanel.java b/src/main/java/com/eliasmueller/llamamod/ui/SavesPanel.java index 57cfa94..6681c1e 100644 --- a/src/main/java/com/eliasmueller/llamamod/ui/SavesPanel.java +++ b/src/main/java/com/eliasmueller/llamamod/ui/SavesPanel.java @@ -29,9 +29,11 @@ import javax.swing.JSpinner; import javax.swing.JTable; import javax.swing.JToggleButton; import javax.swing.SpinnerNumberModel; +import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.table.AbstractTableModel; +import javax.swing.table.DefaultTableCellRenderer; final class SavesPanel extends JPanel { private final MainFrame frame; @@ -86,7 +88,7 @@ final class SavesPanel extends JPanel { GridBagConstraints g = new GridBagConstraints(); g.gridx = 0; g.gridy = 0; - g.gridwidth = 4; + g.gridwidth = 7; g.anchor = GridBagConstraints.WEST; g.fill = GridBagConstraints.HORIZONTAL; slotTitle.setFont(slotTitle.getFont().deriveFont(Font.BOLD, 17f)); @@ -112,16 +114,15 @@ final class SavesPanel extends JPanel { GridBagConstraints q = new GridBagConstraints(); q.gridx = 1; q.gridy = g.gridy; - q.gridwidth = 3; + q.gridwidth = 6; q.anchor = GridBagConstraints.WEST; q.insets = new Insets(2, 0, 6, 0); ed.add(quick, q); g.gridy++; - ed.add(section(Strings.t("saves.map")), g); + // map and lives share a section: at 720 px window height every row counts for the table + ed.add(section(Strings.t("saves.mapAndLlama")), g); row(ed, ++g.gridy, Strings.t("saves.cursor"), cursorWorld, Strings.t("saves.chapter"), cursorChapter); - g.gridy++; - ed.add(section(Strings.t("saves.llama")), g); - row(ed, ++g.gridy, Strings.t("saves.lives"), lives, null, null); + row(ed, ++g.gridy, Strings.t("saves.lives"), lives); g.gridy++; ed.add(section(Strings.t("saves.chapters")), g); g.gridy++; @@ -131,7 +132,14 @@ final class SavesPanel extends JPanel { table.setRowHeight(24); table.setFillsViewportHeight(true); table.getTableHeader().setReorderingAllowed(false); - table.getColumnModel().getColumn(0).setPreferredWidth(170); + // the level name gets the room; numbers and check boxes need little + table.getColumnModel().getColumn(0).setPreferredWidth(260); + for (int c = 1; c < 4; c++) { + table.getColumnModel().getColumn(c).setPreferredWidth(90); + } + DefaultTableCellRenderer centered = new DefaultTableCellRenderer(); + centered.setHorizontalAlignment(SwingConstants.CENTER); + table.getColumnModel().getColumn(1).setCellRenderer(centered); JScrollPane sp = new JScrollPane(table); sp.setPreferredSize(new Dimension(420, 180)); ed.add(sp, g); @@ -192,24 +200,25 @@ final class SavesPanel extends JPanel { return l; } - private static void row(JPanel p, int y, String l1, JComponent c1, String l2, JComponent c2) { + /** Label/input pairs (at most three) in one row; one row must fit the 820 px minimum window width. */ + private static void row(JPanel p, int y, Object... labelsAndInputs) { GridBagConstraints g = new GridBagConstraints(); g.gridy = y; - g.insets = new Insets(3, 0, 3, 8); g.anchor = GridBagConstraints.WEST; - g.gridx = 0; - p.add(new JLabel(l1), g); - g.gridx = 1; - c1.setPreferredSize(new Dimension(c1 instanceof JSpinner ? 70 : 200, c1.getPreferredSize().height)); - p.add(c1, g); - if (l2 != null) { - g.gridx = 2; - p.add(new JLabel(l2), g); - g.gridx = 3; - g.weightx = 1; - c2.setPreferredSize(new Dimension(70, c2.getPreferredSize().height)); - p.add(c2, g); + for (int i = 0; i < labelsAndInputs.length; i += 2) { + g.insets = new Insets(3, i == 0 ? 0 : 8, 3, 8); + g.gridx = i; + p.add(new JLabel((String) labelsAndInputs[i]), g); + JComponent c = (JComponent) labelsAndInputs[i + 1]; + c.setPreferredSize(new Dimension(c instanceof JSpinner ? 70 : 200, c.getPreferredSize().height)); + g.insets = new Insets(3, 0, 3, 8); + g.gridx = i + 1; + p.add(c, g); } + // the rest of the width goes to an empty last column, so the pairs stay together + g.gridx = 6; + g.weightx = 1; + p.add(Box.createHorizontalGlue(), g); } private void limitChapter(JComboBox world, JSpinner chapter) { diff --git a/src/main/java/com/eliasmueller/llamamod/ui/SettingsPanel.java b/src/main/java/com/eliasmueller/llamamod/ui/SettingsPanel.java index ddd2f64..1efecff 100644 --- a/src/main/java/com/eliasmueller/llamamod/ui/SettingsPanel.java +++ b/src/main/java/com/eliasmueller/llamamod/ui/SettingsPanel.java @@ -219,11 +219,20 @@ final class SettingsPanel extends JPanel { if (!Os.isWindows()) { String w = frame.state.launcher.wineCommand(); boolean ok = w != null && GameLauncher.isCommand(w); + String version = ok ? frame.state.launcher.wineVersion() : null; + boolean tooOld = GameLauncher.wineTooOld(GameLauncher.parseWineVersion(version)); + String min = GameLauncher.MIN_WINE[0] + "." + GameLauncher.MIN_WINE[1]; wineInfo.setText( w == null ? Strings.t("settings.wineMissing") - : ok ? Strings.t("settings.wineFound", w) : Strings.t("settings.wineNotFound", w)); - wineInfo.setForeground(ok ? UIManager.getColor("Label.foreground") : App.ERROR); + : !ok + ? Strings.t("settings.wineNotFound", w) + : tooOld + ? Strings.t("settings.wineTooOld", w, version, min) + : version != null + ? Strings.t("settings.wineFoundVersion", w, version) + : Strings.t("settings.wineFound", w)); + wineInfo.setForeground(ok && !tooOld ? UIManager.getColor("Label.foreground") : App.ERROR); } updateCache(); loading = false; diff --git a/src/main/resources/com/eliasmueller/llamamod/ui/messages.properties b/src/main/resources/com/eliasmueller/llamamod/ui/messages.properties index e82aaa4..04f0d00 100644 --- a/src/main/resources/com/eliasmueller/llamamod/ui/messages.properties +++ b/src/main/resources/com/eliasmueller/llamamod/ui/messages.properties @@ -102,9 +102,8 @@ saves.unlockedUpTo=Unlocked up to saves.chapter=Chapter saves.unlockAll=Unlock all worlds saves.unlockTest=Unlock TestLevel (world 9) -saves.map=World map saves.cursor=Opens at -saves.llama=Llama +saves.mapAndLlama=World map and llama saves.lives=Lives saves.chapters=Chapters saves.col.level=Level @@ -140,6 +139,8 @@ settings.wine=Wine settings.wineCommand=Wine command settings.wineHint=Leave empty to use the installed Wine. Only fill in to use a different Wine program. settings.wineFound=Found: {0} +settings.wineFoundVersion=Found: {0} ({1}) +settings.wineTooOld=Found: {0} ({1}) – too old, the game may not run. Please install Wine {2} or newer. settings.wineMissing=Wine not found – please install Wine to play. settings.wineNotFound=Not found: {0} – correct the command or leave the field empty. settings.data=Data @@ -177,3 +178,5 @@ wizard.copying=Copying and checking game data… wizard.doneTitle=All set! wizard.done=The game data is in {0}.

Next: tick the mods you like on the Mods tab, click Apply, then Play. The Save games tab can unlock worlds. wizard.finish=Finish +play.wineTooOld=Your Wine is too old ({0}).\nThe game may not start or may crash. Please install Wine {1} or newer. +play.wineTooOld.play=Play anyway diff --git a/src/test/java/com/eliasmueller/llamamod/mods/InterruptedApplyTest.java b/src/test/java/com/eliasmueller/llamamod/mods/InterruptedApplyTest.java new file mode 100644 index 0000000..b58c1bc --- /dev/null +++ b/src/test/java/com/eliasmueller/llamamod/mods/InterruptedApplyTest.java @@ -0,0 +1,123 @@ +package com.eliasmueller.llamamod.mods; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.eliasmueller.llamamod.platform.AppPaths; +import com.eliasmueller.llamamod.platform.Config; +import com.eliasmueller.llamamod.platform.Progress; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +/** The app killed between the two renames of ModManager.buildActive. */ +class InterruptedApplyTest { + @TempDir + Path tmp; + + private static final class Two implements Mod { + @Override + public String id() { + return "two"; + } + + @Override + public String name() { + return "Two"; + } + + @Override + public String description() { + return ""; + } + + @Override + public void apply(ModContext ctx) throws IOException { + ctx.write("wads/t1l1m001.wad", new byte[] {2}); + } + } + + private AppPaths paths; + private Path next; + private Path old; + private Path marker; + + private ModManager install() throws IOException { + paths = new AppPaths(tmp); + Files.createDirectories(paths.originalCd().resolve("wads")); + Files.write(paths.originalCd().resolve("wads/t1l1m001.wad"), new byte[] {1}); + next = tmp.resolve("cd-active.new"); + old = tmp.resolve("cd-active.old"); + marker = tmp.resolve("cd-active.new.complete"); + Config cfg = new Config(); + cfg.layout = Config.LAYOUT; + cfg.save(paths.config()); + return new ModManager(paths, Config.load(paths.config()), () -> false); + } + + private byte wad() throws IOException { + return Files.readAllBytes(paths.cdActive().resolve("wads/t1l1m001.wad"))[0]; + } + + private void folder(Path dir, int value) throws IOException { + Files.createDirectories(dir.resolve("wads")); + Files.write(dir.resolve("wads/t1l1m001.wad"), new byte[] {(byte) value}); + } + + @Test + void completeNewFolderOfTheRecordedSelectionIsMovedIn() throws Exception { + ModManager mm = install(); + mm.apply(List.of(new Two()), Progress.NONE); + String key = Config.load(paths.config()).activeKey; + assertFalse(Files.exists(marker)); + // same selection applied again, killed after cd-active -> cd-active.old + Files.move(paths.cdActive(), next); + Files.writeString(marker, key); + folder(old, 9); + assertTrue(mm.recoverInterruptedApply()); + assertEquals(2, wad()); + assertFalse(Files.exists(next)); + assertFalse(Files.exists(old)); + assertFalse(Files.exists(marker)); + assertFalse(mm.recoverInterruptedApply(), "nothing left to repair"); + } + + @Test + void newFolderOfAnotherSelectionFallsBackToTheOldOne() throws Exception { + ModManager mm = install(); + mm.restoreOriginal(Progress.NONE); + // applying "two" was killed between the renames: config and exe still describe the original + Files.move(paths.cdActive(), old); + folder(next, 2); + Files.writeString(marker, mm.selectionKey(List.of(new Two()))); + assertTrue(mm.recoverInterruptedApply()); + assertEquals(1, wad()); + assertFalse(Files.exists(next)); + assertFalse(Files.exists(marker)); + } + + @Test + void firstApplyKilledWithCompleteFolderIsRecovered() throws Exception { + ModManager mm = install(); + folder(next, 1); + Files.writeString(marker, ""); // restoring the original; config.json activeKey is "" too + assertTrue(mm.recoverInterruptedApply()); + assertEquals(1, wad()); + } + + @Test + void incompleteNewFolderIsNotUsed() throws Exception { + ModManager mm = install(); + folder(next, 2); // killed while building: no marker + assertFalse(mm.recoverInterruptedApply()); + assertFalse(Files.exists(paths.cdActive())); + // the next apply builds everything again + mm.apply(List.of(new Two()), Progress.NONE); + assertEquals(2, wad()); + assertFalse(Files.exists(next)); + } +} diff --git a/src/test/java/com/eliasmueller/llamamod/mods/ModOptionMultiTest.java b/src/test/java/com/eliasmueller/llamamod/mods/ModOptionMultiTest.java new file mode 100644 index 0000000..63e9c38 --- /dev/null +++ b/src/test/java/com/eliasmueller/llamamod/mods/ModOptionMultiTest.java @@ -0,0 +1,60 @@ +package com.eliasmueller.llamamod.mods; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import com.eliasmueller.llamamod.mods.mirror.MirrorMod; +import com.eliasmueller.llamamod.platform.Config; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import org.junit.jupiter.api.Test; + +class ModOptionMultiTest { + private static final ModOption O = ModOption.multi( + "w", "W", "", "all", ModOption.of("1", "One"), ModOption.of("2", "Two"), ModOption.of("3", "Three")); + + @Test + void normalizesToChoiceOrder() { + assertEquals("all", O.normalize("ALL")); + assertEquals("all", O.normalize("")); + assertEquals("all", O.normalize("3,2,1")); + assertEquals("none", O.normalize("none")); + assertEquals("1,3", O.normalize("3, 1")); + assertEquals("1,3", O.normalize("1;3;3")); + assertEquals("2", O.normalize(" 2 ")); + assertThrows(IllegalArgumentException.class, () -> O.normalize("1,4")); + assertEquals(List.of("1", "2", "3"), O.selected("all")); + assertEquals(List.of(), O.selected("none")); + assertEquals(List.of("1", "3"), O.selected("3,1")); + assertEquals("none", O.multiValue(List.of())); + assertEquals("all", O.multiValue(List.of("1", "2", "3"))); + assertEquals("2,3", O.multiValue(List.of("3", "2"))); + assertThrows( + IllegalArgumentException.class, () -> ModOption.multi("x", "X", "", "all", ModOption.of("all", "All"))); + } + + @Test + void mirrorWorldsFromOldFreeTextConfigs() { + MirrorMod mirror = new MirrorMod(); + ModOption worlds = ModOptions.find(mirror, "worlds"); + assertEquals(ModOption.Type.MULTI, worlds.type()); + // values the former STRING option stored keep their meaning (and their cache key) + Map expected = Map.of( + "all", "all", + "1,3", "1,3", + " 1, 3", "1,3", + "", "all", + "9", "9", + "3,1", "1,3", + "1,2,3,4,5,6,7,8,9", "all", + "1,x", "all" /* invalid: default */); + for (Map.Entry e : expected.entrySet()) { + Config cfg = new Config(); + cfg.modOptions.put("mirror", new TreeMap<>(Map.of("worlds", e.getKey()))); + assertEquals(e.getValue(), ModOptions.resolve(mirror, cfg).get("worlds"), "stored " + e.getKey()); + } + assertEquals("1 Village", worlds.choices().getFirst().label()); + assertEquals("9 TestLevel", worlds.choices().getLast().label()); + } +} diff --git a/src/test/java/com/eliasmueller/llamamod/mods/mirror/MirrorTest.java b/src/test/java/com/eliasmueller/llamamod/mods/mirror/MirrorTest.java index 516a8d8..cc04457 100644 --- a/src/test/java/com/eliasmueller/llamamod/mods/mirror/MirrorTest.java +++ b/src/test/java/com/eliasmueller/llamamod/mods/mirror/MirrorTest.java @@ -22,6 +22,7 @@ class MirrorTest { void worldsOption() { assertEquals(9, MirrorMod.worlds("all").size()); assertEquals(Set.of(1, 3), MirrorMod.worlds(" 1, 3")); + assertEquals(Set.of(), MirrorMod.worlds("none")); } @Test diff --git a/src/test/java/com/eliasmueller/llamamod/platform/ConfigTest.java b/src/test/java/com/eliasmueller/llamamod/platform/ConfigTest.java index 3844301..feae2b3 100644 --- a/src/test/java/com/eliasmueller/llamamod/platform/ConfigTest.java +++ b/src/test/java/com/eliasmueller/llamamod/platform/ConfigTest.java @@ -42,4 +42,89 @@ class ConfigTest { assertTrue(w.enabledMods.isEmpty()); assertEquals(800, w.screenW); } + + @Test + void staleInstanceKeepsWhatAnotherInstanceSaved() throws Exception { + AppPaths p = new AppPaths(tmp); + Config first = new Config(); + first.layout = Config.LAYOUT; + first.modOptions.put("fog", new java.util.TreeMap<>(java.util.Map.of("strength", "2", "color", "red"))); + first.save(p.config()); + + Config window = Config.load(p.config()); + Config cli = Config.load(p.config()); + // the CLI applies mods and changes an option + cli.activeMods = new java.util.ArrayList<>(java.util.List.of("fog")); + cli.activeKey = "k1"; + cli.gameExeSha256 = "abc"; + cli.modOptions.get("fog").put("strength", "3"); + cli.save(p.config()); + // the stale window only changes the theme and another option of the same mod + window.theme = "dark"; + window.modOptions.get("fog").put("color", "blue"); + window.save(p.config()); + + Config r = Config.load(p.config()); + assertEquals("dark", r.theme); + assertEquals(java.util.List.of("fog"), r.activeMods); + assertEquals("k1", r.activeKey); + assertEquals("abc", r.gameExeSha256); + assertEquals(java.util.Map.of("strength", "3", "color", "blue"), r.modOptions.get("fog")); + // the stale window now holds the merged values + assertEquals("abc", window.gameExeSha256); + assertEquals(java.util.List.of("fog"), window.activeMods); + + // a field both changed: the last writer wins + window.screenW = 800; + window.save(p.config()); + cli.screenW = 1024; + cli.save(p.config()); + assertEquals(1024, Config.load(p.config()).screenW); + assertEquals("dark", cli.theme); + // removing an option value (reset to default) is kept too + window.modOptions.get("fog").remove("color"); + window.save(p.config()); + assertEquals( + java.util.Map.of("strength", "3"), + Config.load(p.config()).modOptions.get("fog")); + } + + @Test + void unknownFieldsOfANewerVersionSurviveASave() throws Exception { + AppPaths p = new AppPaths(tmp); + Files.writeString(p.config(), "{\"layout\": 1, \"futureField\": [1, 2], \"theme\": \"dark\"}"); + Config c = Config.load(p.config()); + c.screenW = 800; + c.save(p.config()); + String s = Files.readString(p.config()); + assertTrue(s.contains("futureField"), s); + assertEquals("dark", Config.load(p.config()).theme); + } + + @Test + void concurrentSavesFromThreadsDoNotFail() throws Exception { + AppPaths p = new AppPaths(tmp); + new Config().save(p.config()); + Config a = Config.load(p.config()); + Config b = Config.load(p.config()); + Thread t = new Thread(() -> { + for (int i = 0; i < 50; i++) { + a.screenW = i; + try { + a.save(p.config()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + }); + t.start(); + for (int i = 0; i < 50; i++) { + b.screenH = i; + b.save(p.config()); + } + t.join(); + Config r = Config.load(p.config()); + assertEquals(49, r.screenW); + assertEquals(49, r.screenH); + } } diff --git a/src/test/java/com/eliasmueller/llamamod/platform/InstallerProgressTest.java b/src/test/java/com/eliasmueller/llamamod/platform/InstallerProgressTest.java new file mode 100644 index 0000000..4165dfa --- /dev/null +++ b/src/test/java/com/eliasmueller/llamamod/platform/InstallerProgressTest.java @@ -0,0 +1,15 @@ +package com.eliasmueller.llamamod.platform; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +class InstallerProgressTest { + @Test + void copyMessageShowsMegabytes() { + assertEquals( + "Copying 123 of 568 MB (wads/t1l1m001.wad)", + Installer.copyMessage(123L << 20, 568L << 20, "wads/t1l1m001.wad")); + assertEquals("Copying 0 of 1 MB (a)", Installer.copyMessage(1000, (1L << 20) + 5, "a")); + } +} diff --git a/src/test/java/com/eliasmueller/llamamod/platform/WineVersionTest.java b/src/test/java/com/eliasmueller/llamamod/platform/WineVersionTest.java new file mode 100644 index 0000000..e85d227 --- /dev/null +++ b/src/test/java/com/eliasmueller/llamamod/platform/WineVersionTest.java @@ -0,0 +1,38 @@ +package com.eliasmueller.llamamod.platform; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +class WineVersionTest { + @Test + void parsesCommonVersionStrings() { + assertArrayEquals(new int[] {6, 0}, GameLauncher.parseWineVersion("wine-6.0.3 (Ubuntu 6.0.3~repack-1)")); + assertArrayEquals(new int[] {9, 0}, GameLauncher.parseWineVersion("wine-9.0")); + assertArrayEquals(new int[] {10, 12}, GameLauncher.parseWineVersion("wine-10.12 (Staging)")); + assertArrayEquals(new int[] {8, 0}, GameLauncher.parseWineVersion("wine-8.0-rc3")); + assertArrayEquals(new int[] {1, 6}, GameLauncher.parseWineVersion("wine-1.6.2")); + assertArrayEquals(new int[] {7, 22}, GameLauncher.parseWineVersion("Wine 7.22")); + } + + @Test + void unknownOutputIsNotAWarning() { + assertNull(GameLauncher.parseWineVersion(null)); + assertNull(GameLauncher.parseWineVersion("")); + assertNull(GameLauncher.parseWineVersion("CrossOver 23")); + assertNull(GameLauncher.parseWineVersion("wine-99999999999.0")); + assertFalse(GameLauncher.wineTooOld(null)); + } + + @Test + void tooOldBelowTheMinimum() { + assertTrue(GameLauncher.wineTooOld(new int[] {4, 21})); + assertTrue(GameLauncher.wineTooOld(new int[] {1, 6})); + assertFalse(GameLauncher.wineTooOld(new int[] {5, 0})); + assertFalse(GameLauncher.wineTooOld(new int[] {6, 0})); + assertFalse(GameLauncher.wineTooOld(new int[] {10, 0})); + } +}