diff --git a/src/main/java/cz/jzitnik/game/Game.java b/src/main/java/cz/jzitnik/game/Game.java index a323dbb..ca01f20 100644 --- a/src/main/java/cz/jzitnik/game/Game.java +++ b/src/main/java/cz/jzitnik/game/Game.java @@ -55,6 +55,7 @@ public class Game extends AutoTransientSupport { private transient GameStates gameStates = new GameStates(this); @Setter private int daytime = 0; // 0-600 + // private Configuration configuration = new Configuration(); public Game() { diff --git a/src/main/java/cz/jzitnik/game/entities/Dependencies.java b/src/main/java/cz/jzitnik/game/entities/Dependencies.java index db9a9ed..233f2c0 100644 --- a/src/main/java/cz/jzitnik/game/entities/Dependencies.java +++ b/src/main/java/cz/jzitnik/game/entities/Dependencies.java @@ -12,6 +12,7 @@ import cz.jzitnik.game.mobs.EntityKill; import cz.jzitnik.game.smelting.Smelting; import cz.jzitnik.game.sprites.ui.Font; import cz.jzitnik.game.ui.Escape; +import cz.jzitnik.game.ui.Options; public class Dependencies { public PlaceHandler placeHandler = new PlaceHandler(); @@ -25,8 +26,10 @@ public class Dependencies { public Sound sound = new Sound(); public Font font = new Font(); public Escape escape; + public Options options; public Dependencies(Game game) { escape = new Escape(game); + options = new Options(game); } } diff --git a/src/main/java/cz/jzitnik/game/sprites/ui/Font.java b/src/main/java/cz/jzitnik/game/sprites/ui/Font.java index 62ddf96..626f404 100644 --- a/src/main/java/cz/jzitnik/game/sprites/ui/Font.java +++ b/src/main/java/cz/jzitnik/game/sprites/ui/Font.java @@ -207,7 +207,6 @@ public class Font { for (int i = 0; i < lines.length; i++) { buffer.append("\033").append(background); buffer.append(" ".repeat(leftPad)).append(lines[i]); - log.debug("Ansi escape codes: {}", Arrays.asList(lines[i].split("\033"))); buffer.append("\033").append(background); buffer.append(" ".repeat(rightPad)); buffer.append("\033[0m\n"); diff --git a/src/main/java/cz/jzitnik/game/threads/list/InputHandlerThread.java b/src/main/java/cz/jzitnik/game/threads/list/InputHandlerThread.java index 093d970..536e105 100644 --- a/src/main/java/cz/jzitnik/game/threads/list/InputHandlerThread.java +++ b/src/main/java/cz/jzitnik/game/threads/list/InputHandlerThread.java @@ -57,6 +57,8 @@ public class InputHandlerThread extends Thread { screenRenderer); case ESC -> game.getGameStates().dependencies.escape.mouse(mouseEvent, terminal, screenRenderer); case SAVE_EXIT -> {} + case OPTIONS -> game.getGameStates().dependencies.options.handleMouse(mouseEvent, terminal, screenRenderer); + case SAVED -> {} } } } diff --git a/src/main/java/cz/jzitnik/game/ui/Escape.java b/src/main/java/cz/jzitnik/game/ui/Escape.java index ae43160..9ea3505 100644 --- a/src/main/java/cz/jzitnik/game/ui/Escape.java +++ b/src/main/java/cz/jzitnik/game/ui/Escape.java @@ -5,9 +5,8 @@ import org.jline.terminal.Terminal; import cz.jzitnik.game.Game; import cz.jzitnik.game.sprites.ui.Font.*; import cz.jzitnik.tui.ScreenRenderer; -import lombok.extern.slf4j.Slf4j; +import cz.jzitnik.tui.utils.Menu; -@Slf4j public class Escape { private Game game; private Menu menu; @@ -36,7 +35,7 @@ public class Escape { game.setWindow(Window.WORLD); break; case 1: - // Options logic placeholder + game.setWindow(Window.OPTIONS); break; case 2: game.setWindow(Window.SAVE_EXIT); diff --git a/src/main/java/cz/jzitnik/game/ui/Options.java b/src/main/java/cz/jzitnik/game/ui/Options.java new file mode 100644 index 0000000..dac9886 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/ui/Options.java @@ -0,0 +1,85 @@ +package cz.jzitnik.game.ui; + +import org.jline.terminal.MouseEvent; +import org.jline.terminal.Terminal; +import cz.jzitnik.game.Game; +import cz.jzitnik.game.sprites.ui.Font.*; +import cz.jzitnik.tui.ScreenRenderer; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class Options { + private Game game; + private int top; + private int sliderWidth; + private int sliderLeftpad; + + public Options(Game game) { + this.game = game; + } + + + public void render(StringBuilder buffer, Terminal terminal) { + var buf = new StringBuilder(); + var font = game.getGameStates().dependencies.font; + var config = game.getConfiguration(); + + var mainText = font.line(terminal, "Options", Align.CENTER, Size.LARGE); + buf.append(mainText.getData()); + + buf.append("\n".repeat(15)); + + var sounds = font.line(terminal, "Sounds", Align.CENTER, Size.MEDIUM); + buf.append(sounds.getData()); + + buf.append("\n".repeat(10)); + + top = mainText.getHeight() + 15 + sounds.getHeight() + 10; + + renderSlider(buf, terminal, config.getSoundVolume()); + + buffer.append(buf); + } + + private void renderSlider(StringBuilder buffer, Terminal terminal, int percentage) { + var defaultColor = "\033[48;2;116;115;113m"; + var fullColor = "\033[48;2;70;70;70m"; + int width = Math.min(550, (int) (terminal.getWidth() * (3.0 / 4))); + int leftPad = (terminal.getWidth() - width) / 2; + sliderLeftpad= leftPad; + sliderWidth = width; + + for (int i = 0; i < 8; i++) { + buffer.append(" ".repeat(leftPad)); + + for (int j = 0; j < width; j++) { + if (((double) j / width) * 100 <= percentage) { + buffer.append(fullColor).append(" "); + } else { + buffer.append(defaultColor).append(" "); + } + } + + buffer.append("\033[0m").append("\n"); + } + } + + public void handleMouse(MouseEvent mouseEvent, Terminal terminal, ScreenRenderer screenRenderer) { + int x = mouseEvent.getX(); + int y = mouseEvent.getY() - top; + + if (x > sliderLeftpad && x <= sliderLeftpad + sliderWidth) { + if (y > 0 && y <= 8) { + if (mouseEvent.getType() == MouseEvent.Type.Pressed || mouseEvent.getType() == MouseEvent.Type.Dragged) { + int sliderX = x - sliderLeftpad; + int percentage = (int) Math.round((((double) sliderX / sliderWidth) * 100)); + + game.getConfiguration().setSoundVolume(percentage); + log.info("Sound volume was changed to: {}% ", percentage); + + screenRenderer.render(game); + } + } + } + } +} diff --git a/src/main/java/cz/jzitnik/game/ui/Window.java b/src/main/java/cz/jzitnik/game/ui/Window.java index ebd5d9e..6e8cfac 100644 --- a/src/main/java/cz/jzitnik/game/ui/Window.java +++ b/src/main/java/cz/jzitnik/game/ui/Window.java @@ -1,5 +1,5 @@ package cz.jzitnik.game.ui; public enum Window { - WORLD, INVENTORY, CRAFTING_TABLE, CHEST, FURNACE, ESC, SAVE_EXIT, SAVED + WORLD, INVENTORY, CRAFTING_TABLE, CHEST, FURNACE, ESC, SAVE_EXIT, SAVED, OPTIONS } diff --git a/src/main/java/cz/jzitnik/tui/ScreenRenderer.java b/src/main/java/cz/jzitnik/tui/ScreenRenderer.java index 899907c..4daf23f 100644 --- a/src/main/java/cz/jzitnik/tui/ScreenRenderer.java +++ b/src/main/java/cz/jzitnik/tui/ScreenRenderer.java @@ -81,6 +81,7 @@ public class ScreenRenderer { .stream().filter(i -> i.getBlockId().equals("furnace")).toList().getFirst().getData()).render(game, main, terminal, spriteList); case ESC -> game.getGameStates().dependencies.escape.render(main, terminal); + case OPTIONS -> game.getGameStates().dependencies.options.render(main, terminal); case SAVE_EXIT -> game.getGameStates().dependencies.escape.renderSave(main, terminal); case SAVED -> game.getGameStates().dependencies.escape.renderSaved(main, terminal); case WORLD -> { diff --git a/src/main/java/cz/jzitnik/game/ui/Menu.java b/src/main/java/cz/jzitnik/tui/utils/Menu.java similarity index 98% rename from src/main/java/cz/jzitnik/game/ui/Menu.java rename to src/main/java/cz/jzitnik/tui/utils/Menu.java index 1b1d6bc..d21aceb 100644 --- a/src/main/java/cz/jzitnik/game/ui/Menu.java +++ b/src/main/java/cz/jzitnik/tui/utils/Menu.java @@ -1,4 +1,5 @@ -package cz.jzitnik.game.ui; +package cz.jzitnik.tui.utils; + import org.jline.terminal.MouseEvent; import org.jline.terminal.Terminal; @@ -108,7 +109,7 @@ public class Menu { } } - interface ButtonClickHandler { + public interface ButtonClickHandler { void onClick(int index, ScreenRenderer screenRenderer); } diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 1d6a60c..52ec92f 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -10,7 +10,7 @@ 30 - 20MB + 30MB