diff --git a/Semesterprojekt/src/main/java/thb/jeanluc/adventure/App.java b/Semesterprojekt/src/main/java/thb/jeanluc/adventure/App.java index ae19bfc..da51382 100644 --- a/Semesterprojekt/src/main/java/thb/jeanluc/adventure/App.java +++ b/Semesterprojekt/src/main/java/thb/jeanluc/adventure/App.java @@ -67,8 +67,7 @@ public final class App { SaveService saves = new SaveService(); SettingsStore settingsStore = new SettingsStore(); Settings settings = settingsStore.load(); - ConsoleIO consoleIo = io instanceof ConsoleIO c ? c : null; - SettingsMenu.apply(settings, consoleIo); + SettingsMenu.apply(settings, io); boolean running = true; while (running) { @@ -84,7 +83,7 @@ public final class App { } } } - case SETTINGS -> settings = SettingsMenu.show(io, settings, settingsStore, consoleIo); + case SETTINGS -> settings = SettingsMenu.show(io, settings, settingsStore); case QUIT -> running = false; } } diff --git a/Semesterprojekt/src/main/java/thb/jeanluc/adventure/menu/SettingsMenu.java b/Semesterprojekt/src/main/java/thb/jeanluc/adventure/menu/SettingsMenu.java index 3661505..ecd6299 100644 --- a/Semesterprojekt/src/main/java/thb/jeanluc/adventure/menu/SettingsMenu.java +++ b/Semesterprojekt/src/main/java/thb/jeanluc/adventure/menu/SettingsMenu.java @@ -2,50 +2,47 @@ package thb.jeanluc.adventure.menu; import thb.jeanluc.adventure.io.ConsoleIO; import thb.jeanluc.adventure.io.GameIO; +import thb.jeanluc.adventure.io.MusicLevel; import thb.jeanluc.adventure.save.Settings; import thb.jeanluc.adventure.save.SettingsStore; import java.util.List; -/** Minimal settings screen: toggle colour and glyph mode; persists + applies. */ +/** Settings screen: cycle colour, glyph, and music level; persists + applies. */ public final class SettingsMenu { private SettingsMenu() { } - /** - * Loops the settings screen until the player picks "Back", persisting and - * applying each change. Returns the final settings. - * - * @param io active IO - * @param current starting settings - * @param store where to persist - * @param consoleIo the console IO to apply changes to live, or null if not console - */ - public static Settings show(GameIO io, Settings current, SettingsStore store, ConsoleIO consoleIo) { + /** Loops the settings screen until "Back", persisting + applying each change. */ + public static Settings show(GameIO io, Settings current, SettingsStore store) { Settings s = current; while (true) { int i = io.choose("SETTINGS", List.of( "Colour: " + s.colorMode(), "Glyphs: " + s.glyphMode(), + "Music: " + s.musicLevel(), "Back")); if (i == 0) { - s = new Settings(nextColor(s.colorMode()), s.glyphMode()); + s = new Settings(nextColor(s.colorMode()), s.glyphMode(), s.musicLevel()); } else if (i == 1) { - s = new Settings(s.colorMode(), nextGlyph(s.glyphMode())); + s = new Settings(s.colorMode(), nextGlyph(s.glyphMode()), s.musicLevel()); + } else if (i == 2) { + s = new Settings(s.colorMode(), s.glyphMode(), s.musicLevel().next()); } else { return s; } store.save(s); - apply(s, consoleIo); + apply(s, io); } } - /** Applies colour/glyph settings to the console IO (no-op if null). */ - public static void apply(Settings s, ConsoleIO consoleIo) { - if (consoleIo != null) { - consoleIo.setColorMode(s.colorMode()); - consoleIo.setGlyphMode(s.glyphMode()); + /** Applies settings to the IO: music level always; colour/glyph only on the console. */ + public static void apply(Settings s, GameIO io) { + io.setMusicLevel(s.musicLevel()); + if (io instanceof ConsoleIO c) { + c.setColorMode(s.colorMode()); + c.setGlyphMode(s.glyphMode()); } } diff --git a/Semesterprojekt/src/main/java/thb/jeanluc/adventure/save/Settings.java b/Semesterprojekt/src/main/java/thb/jeanluc/adventure/save/Settings.java index cebac84..a46411b 100644 --- a/Semesterprojekt/src/main/java/thb/jeanluc/adventure/save/Settings.java +++ b/Semesterprojekt/src/main/java/thb/jeanluc/adventure/save/Settings.java @@ -1,11 +1,23 @@ package thb.jeanluc.adventure.save; import thb.jeanluc.adventure.io.ConsoleIO; +import thb.jeanluc.adventure.io.MusicLevel; -/** Persisted user preferences (minimal: colour + glyph fidelity). */ -public record Settings(ConsoleIO.ColorMode colorMode, ConsoleIO.GlyphMode glyphMode) { +/** Persisted user preferences (colour + glyph fidelity + music level). */ +public record Settings(ConsoleIO.ColorMode colorMode, ConsoleIO.GlyphMode glyphMode, MusicLevel musicLevel) { + + public Settings { + if (musicLevel == null) { + musicLevel = MusicLevel.MEDIUM; // backward-compat: old saves lack this field + } + } + + /** Backward-compatible constructor for callers that don't set music. */ + public Settings(ConsoleIO.ColorMode colorMode, ConsoleIO.GlyphMode glyphMode) { + this(colorMode, glyphMode, MusicLevel.MEDIUM); + } public static Settings defaults() { - return new Settings(ConsoleIO.ColorMode.AUTO, ConsoleIO.GlyphMode.UNICODE); + return new Settings(ConsoleIO.ColorMode.AUTO, ConsoleIO.GlyphMode.UNICODE, MusicLevel.MEDIUM); } } diff --git a/Semesterprojekt/src/test/java/thb/jeanluc/adventure/menu/MenuTest.java b/Semesterprojekt/src/test/java/thb/jeanluc/adventure/menu/MenuTest.java index 3088e3b..69af6c6 100644 --- a/Semesterprojekt/src/test/java/thb/jeanluc/adventure/menu/MenuTest.java +++ b/Semesterprojekt/src/test/java/thb/jeanluc/adventure/menu/MenuTest.java @@ -10,6 +10,7 @@ import thb.jeanluc.adventure.save.SaveSlotInfo; import thb.jeanluc.adventure.save.Settings; import thb.jeanluc.adventure.save.SettingsStore; import thb.jeanluc.adventure.io.ConsoleIO; +import thb.jeanluc.adventure.io.MusicLevel; import java.nio.file.Path; @@ -64,11 +65,18 @@ class MenuTest { @Test void settingsMenuTogglesGlyphAndPersists(@TempDir Path dir) { SettingsStore store = new SettingsStore(dir.resolve("settings.json")); - // choose "Glyph mode" (assume option 2) → its toggle, then "Back" (last) - TestIO io = new TestIO().enqueue("2").enqueue("3"); - Settings result = SettingsMenu.show(io, Settings.defaults(), store, new ConsoleIO()); - // UNICODE default toggles to ASCII; persisted + TestIO io = new TestIO().enqueue("2").enqueue("4"); // toggle Glyphs, then Back + Settings result = SettingsMenu.show(io, Settings.defaults(), store); assertThat(result.glyphMode()).isEqualTo(ConsoleIO.GlyphMode.ASCII); assertThat(store.load().glyphMode()).isEqualTo(ConsoleIO.GlyphMode.ASCII); } + + @Test + void settingsMenuCyclesMusicLevelAndPersists(@TempDir Path dir) { + SettingsStore store = new SettingsStore(dir.resolve("settings.json")); + TestIO io = new TestIO().enqueue("3").enqueue("4"); // cycle Music once, then Back + Settings result = SettingsMenu.show(io, Settings.defaults(), store); + assertThat(result.musicLevel()).isEqualTo(MusicLevel.MEDIUM.next()); // HIGH + assertThat(store.load().musicLevel()).isEqualTo(MusicLevel.MEDIUM.next()); + } } diff --git a/Semesterprojekt/src/test/java/thb/jeanluc/adventure/save/SettingsStoreTest.java b/Semesterprojekt/src/test/java/thb/jeanluc/adventure/save/SettingsStoreTest.java index 9cca9fd..ccf26ab 100644 --- a/Semesterprojekt/src/test/java/thb/jeanluc/adventure/save/SettingsStoreTest.java +++ b/Semesterprojekt/src/test/java/thb/jeanluc/adventure/save/SettingsStoreTest.java @@ -3,6 +3,7 @@ package thb.jeanluc.adventure.save; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import thb.jeanluc.adventure.io.ConsoleIO; +import thb.jeanluc.adventure.io.MusicLevel; import java.io.IOException; import java.nio.file.Files; @@ -34,4 +35,18 @@ class SettingsStoreTest { Settings loaded = new SettingsStore(file).load(); assertThat(loaded).isEqualTo(Settings.defaults()); } + + @Test + void musicLevelRoundTrips(@TempDir Path dir) { + SettingsStore store = new SettingsStore(dir.resolve("settings.json")); + store.save(new Settings(ConsoleIO.ColorMode.AUTO, ConsoleIO.GlyphMode.UNICODE, MusicLevel.HIGH)); + assertThat(store.load().musicLevel()).isEqualTo(MusicLevel.HIGH); + } + + @Test + void oldSettingsWithoutMusicDefaultToMedium(@TempDir Path dir) throws Exception { + Path file = dir.resolve("settings.json"); + Files.writeString(file, "{\"colorMode\":\"ON\",\"glyphMode\":\"ASCII\"}"); + assertThat(new SettingsStore(file).load().musicLevel()).isEqualTo(MusicLevel.MEDIUM); + } }