From aa6a47fff9a9904f49553e0c8f9b940453bd5df3 Mon Sep 17 00:00:00 2001 From: jzitnik-dev Date: Wed, 2 Apr 2025 20:53:54 +0200 Subject: [PATCH] feat(ui): Implemented "Save and Exit" in Escape --- .../game/threads/list/InputHandlerThread.java | 5 +-- src/main/java/cz/jzitnik/game/ui/Escape.java | 37 +++++++++++++++++-- src/main/java/cz/jzitnik/game/ui/Window.java | 2 +- .../java/cz/jzitnik/tui/ScreenRenderer.java | 4 +- 4 files changed, 39 insertions(+), 9 deletions(-) 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 851b581..093d970 100644 --- a/src/main/java/cz/jzitnik/game/threads/list/InputHandlerThread.java +++ b/src/main/java/cz/jzitnik/game/threads/list/InputHandlerThread.java @@ -56,6 +56,7 @@ public class InputHandlerThread extends Thread { .toList().getFirst().getData()).click(game, mouseEvent, terminal, screenRenderer); case ESC -> game.getGameStates().dependencies.escape.mouse(mouseEvent, terminal, screenRenderer); + case SAVE_EXIT -> {} } } } @@ -93,10 +94,6 @@ public class InputHandlerThread extends Thread { game.getGameStates().dependencies.escape.reset(); } screenRenderer.render(game); - // System.out.println("Exiting game..."); - // isRunning[0] = false; - // game.getGameStates().dependencies.gameSaver.save(game); - // System.exit(0); } default -> { } diff --git a/src/main/java/cz/jzitnik/game/ui/Escape.java b/src/main/java/cz/jzitnik/game/ui/Escape.java index 73c1d68..024122d 100644 --- a/src/main/java/cz/jzitnik/game/ui/Escape.java +++ b/src/main/java/cz/jzitnik/game/ui/Escape.java @@ -24,7 +24,27 @@ public class Escape { this.game = game; } - public void render(StringBuilder buffer, Terminal terminal, Game game) { + public void renderSave(StringBuilder buffer, Terminal terminal) { + var font = game.getGameStates().dependencies.font; + var savingText = font.line(terminal, "Saving", Size.LARGE, Align.CENTER); + + int top = (terminal.getHeight() - savingText.getHeight()) / 2; + + buffer.append("\n".repeat(top)); + buffer.append(savingText.getData()); + } + + public void renderSaved(StringBuilder buffer, Terminal terminal) { + var font = game.getGameStates().dependencies.font; + var savingText = font.line(terminal, "Saved", Size.LARGE, Align.CENTER); + + int top = (terminal.getHeight() - savingText.getHeight()) / 2; + + buffer.append("\n".repeat(top)); + buffer.append(savingText.getData()); + } + + public void render(StringBuilder buffer, Terminal terminal) { var font = game.getGameStates().dependencies.font; var width = terminal.getWidth(); var height = terminal.getHeight(); @@ -65,6 +85,7 @@ public class Escape { boolean changed = false; if (buttonx > 0 && buttonx <= btnWidth) { + // Continue if (buttony > 0 && buttony < buttonHeight) { if (type == MouseEvent.Type.Pressed) { game.setWindow(Window.WORLD); @@ -81,6 +102,7 @@ public class Escape { changed = true; } + // Options if (buttony > buttonHeight + margin && buttony < 2 * buttonHeight + margin) { if (type == MouseEvent.Type.Pressed) { return; @@ -95,9 +117,19 @@ public class Escape { changed = true; } + // Save and exit if (buttony > 2 * (buttonHeight + margin) && buttony < buttonHeight + 2 * (buttonHeight + margin)) { if (type == MouseEvent.Type.Pressed) { - return; + game.setWindow(Window.SAVE_EXIT); + screenRenderer.render(game); + + // Save game + game.getGameStates().dependencies.gameSaver.save(game); + + game.setWindow(Window.SAVED); + screenRenderer.render(game); + + System.exit(0); } if (buttonsHover[2] == false) { @@ -108,7 +140,6 @@ public class Escape { buttonsHover[2] = false; changed = true; } - } if (changed) { diff --git a/src/main/java/cz/jzitnik/game/ui/Window.java b/src/main/java/cz/jzitnik/game/ui/Window.java index 660cb70..ebd5d9e 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 + WORLD, INVENTORY, CRAFTING_TABLE, CHEST, FURNACE, ESC, SAVE_EXIT, SAVED } diff --git a/src/main/java/cz/jzitnik/tui/ScreenRenderer.java b/src/main/java/cz/jzitnik/tui/ScreenRenderer.java index 72bb276..f5022d5 100644 --- a/src/main/java/cz/jzitnik/tui/ScreenRenderer.java +++ b/src/main/java/cz/jzitnik/tui/ScreenRenderer.java @@ -80,7 +80,9 @@ public class ScreenRenderer { case FURNACE -> ((Furnace) game.getWorld()[game.getGameStates().clickY][game.getGameStates().clickX] .stream().filter(i -> i.getBlockId().equals("furnace")).toList().getFirst().getData()).render(game, main, terminal, spriteList); - case ESC -> game.getGameStates().dependencies.escape.render(main, terminal, game); + case ESC -> game.getGameStates().dependencies.escape.render(main, terminal); + case SAVE_EXIT -> game.getGameStates().dependencies.escape.renderSave(main, terminal); + case SAVED -> game.getGameStates().dependencies.escape.renderSaved(main, terminal); case WORLD -> { // World