From ba16f2e135c22d18699f352afd4ebe060118d2c6 Mon Sep 17 00:00:00 2001 From: lieght Date: Fri, 19 Sep 2025 17:31:37 +0200 Subject: [PATCH] Local tic tac toe thread --- src/main/java/org/toop/Main.java | 13 +- .../java/org/toop/UI/LocalGameSelector.java | 139 -------------- .../{server => }/backend/ServerManager.java | 4 +- .../toop/{server => }/backend/TcpServer.java | 5 +- .../backend/tictactoe/ParsedCommand.java | 3 +- .../backend/tictactoe/TicTacToeServer.java | 4 +- .../tictactoe/TicTacToeServerCommand.java | 2 +- .../tictactoe/TicTacToeServerMessage.java | 2 +- src/main/java/org/toop/core/Window.java | 2 +- src/main/java/org/toop/eventbus/Events.java | 2 +- .../org/toop/eventbus/GlobalEventBus.java | 36 ++-- .../frontend/ConnectionManager.java | 2 +- .../frontend/ServerConnection.java | 13 +- .../toop/{server => }/frontend/TcpClient.java | 2 +- .../{ => frontend}/UI/BackgroundPanel.java | 2 +- .../{ => frontend}/UI/LocalGameSelector.form | 2 +- .../toop/frontend/UI/LocalGameSelector.java | 83 +++++++++ .../UI/LocalServerSelector.form | 2 +- .../UI/LocalServerSelector.java | 2 +- .../{ => frontend}/UI/RemoteGameSelector.form | 2 +- .../{ => frontend}/UI/RemoteGameSelector.java | 2 +- .../org/toop/{ => frontend}/UI/Services.form | 2 +- .../org/toop/{ => frontend}/UI/Services.java | 2 +- .../toop/{ => frontend}/UI/UIGameBoard.form | 2 +- .../toop/{ => frontend}/UI/UIGameBoard.java | 20 +-- .../toop/frontend/games/LocalTicTacToe.java | 170 ++++++++++++++++++ .../{ => frontend}/graphics/Renderer.java | 4 +- .../toop/{ => frontend}/graphics/Shader.java | 4 +- .../{ => frontend}/graphics/node/Button.java | 4 +- .../{ => frontend}/graphics/node/Node.java | 5 +- .../graphics/node/NodeManager.java | 4 +- .../{ => frontend}/graphics/node/Widget.java | 4 +- .../org/toop/{ => frontend}/math/Bounds.java | 2 +- .../org/toop/{ => frontend}/math/Color.java | 2 +- .../platform/core/glfw/GlfwWindow.java | 2 +- .../graphics/opengl/OpenglRenderer.java | 5 +- .../graphics/opengl/OpenglShader.java | 4 +- .../org/toop/game/tictactoe/TicTacToe.java | 3 +- 38 files changed, 327 insertions(+), 236 deletions(-) delete mode 100644 src/main/java/org/toop/UI/LocalGameSelector.java rename src/main/java/org/toop/{server => }/backend/ServerManager.java (97%) rename src/main/java/org/toop/{server => }/backend/TcpServer.java (98%) rename src/main/java/org/toop/{server => }/backend/tictactoe/ParsedCommand.java (99%) rename src/main/java/org/toop/{server => }/backend/tictactoe/TicTacToeServer.java (98%) rename src/main/java/org/toop/{server => }/backend/tictactoe/TicTacToeServerCommand.java (97%) rename src/main/java/org/toop/{server => }/backend/tictactoe/TicTacToeServerMessage.java (96%) rename src/main/java/org/toop/{server => }/frontend/ConnectionManager.java (99%) rename src/main/java/org/toop/{server => }/frontend/ServerConnection.java (94%) rename src/main/java/org/toop/{server => }/frontend/TcpClient.java (98%) rename src/main/java/org/toop/{ => frontend}/UI/BackgroundPanel.java (93%) rename src/main/java/org/toop/{ => frontend}/UI/LocalGameSelector.form (96%) create mode 100644 src/main/java/org/toop/frontend/UI/LocalGameSelector.java rename src/main/java/org/toop/{ => frontend}/UI/LocalServerSelector.form (96%) rename src/main/java/org/toop/{ => frontend}/UI/LocalServerSelector.java (96%) rename src/main/java/org/toop/{ => frontend}/UI/RemoteGameSelector.form (99%) rename src/main/java/org/toop/{ => frontend}/UI/RemoteGameSelector.java (99%) rename src/main/java/org/toop/{ => frontend}/UI/Services.form (90%) rename src/main/java/org/toop/{ => frontend}/UI/Services.java (62%) rename src/main/java/org/toop/{ => frontend}/UI/UIGameBoard.form (94%) rename src/main/java/org/toop/{ => frontend}/UI/UIGameBoard.java (75%) create mode 100644 src/main/java/org/toop/frontend/games/LocalTicTacToe.java rename src/main/java/org/toop/{ => frontend}/graphics/Renderer.java (89%) rename src/main/java/org/toop/{ => frontend}/graphics/Shader.java (80%) rename src/main/java/org/toop/{ => frontend}/graphics/node/Button.java (85%) rename src/main/java/org/toop/{ => frontend}/graphics/node/Node.java (74%) rename src/main/java/org/toop/{ => frontend}/graphics/node/NodeManager.java (93%) rename src/main/java/org/toop/{ => frontend}/graphics/node/Widget.java (90%) rename src/main/java/org/toop/{ => frontend}/math/Bounds.java (95%) rename src/main/java/org/toop/{ => frontend}/math/Color.java (89%) rename src/main/java/org/toop/{ => frontend}/platform/core/glfw/GlfwWindow.java (98%) rename src/main/java/org/toop/{ => frontend}/platform/graphics/opengl/OpenglRenderer.java (92%) rename src/main/java/org/toop/{ => frontend}/platform/graphics/opengl/OpenglShader.java (93%) diff --git a/src/main/java/org/toop/Main.java b/src/main/java/org/toop/Main.java index 01bed37..473e604 100644 --- a/src/main/java/org/toop/Main.java +++ b/src/main/java/org/toop/Main.java @@ -1,14 +1,15 @@ package org.toop; -import org.toop.UI.LocalServerSelector; +import org.toop.frontend.UI.LocalServerSelector; import org.toop.eventbus.EventRegistry; import org.toop.eventbus.Events; import org.toop.eventbus.GlobalEventBus; -import org.toop.server.backend.ServerManager; +import org.toop.backend.ServerManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; -import org.toop.server.frontend.ConnectionManager; +import org.toop.frontend.ConnectionManager; +import org.toop.frontend.games.LocalTicTacToe; import java.util.concurrent.ExecutionException; @@ -18,7 +19,7 @@ public class Main { public static void main(String[] args) throws ExecutionException, InterruptedException { // Logging.disableAllLogs(); - Logging.disableLogsForClass(EventRegistry.class); +// Logging.enableAllLogsForClass(LocalTicTacToe.class); // Logging.enableLogsForClass(ServerManager.class, Level.ALL); // Logging.enableLogsForClass(TicTacToeServer.class, Level.ALL); // Logging.enableLogsForClass(TcpClient.class, Level.ALL); @@ -40,10 +41,6 @@ public class Main { } - /** - * Returns false if any event could not be initialized. - */ - private static void registerEvents() { GlobalEventBus.subscribeAndRegister(Events.WindowEvents.OnQuitRequested.class, event -> { quit(); diff --git a/src/main/java/org/toop/UI/LocalGameSelector.java b/src/main/java/org/toop/UI/LocalGameSelector.java deleted file mode 100644 index f4ed81b..0000000 --- a/src/main/java/org/toop/UI/LocalGameSelector.java +++ /dev/null @@ -1,139 +0,0 @@ -package org.toop.UI; - -import jdk.jfr.Event; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.toop.Main; -import org.toop.eventbus.Events; -import org.toop.eventbus.GlobalEventBus; - -import javax.swing.*; -import java.awt.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutionException; - -public class LocalGameSelector extends JFrame { - private static final Logger logger = LogManager.getLogger(LocalGameSelector.class); - - private JPanel panel1; - private JComboBox gameSelectionComboBox; - private JButton startGame; - private JComboBox playerTypeSelectionBox; - - private JPanel cards; // CardLayout panel - private CardLayout cardLayout; - - private UIGameBoard tttBoard; - - public LocalGameSelector() { - setTitle("Local Game Selector"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setSize(1920, 1080); - setLocationRelativeTo(null); - - // Setup CardLayout - cardLayout = new CardLayout(); - cards = new JPanel(cardLayout); - setContentPane(cards); - - // --- Main menu panel --- - panel1 = new JPanel(); - panel1.setLayout(new FlowLayout()); - gameSelectionComboBox = new JComboBox<>(); - gameSelectionComboBox.addItem("Tic Tac Toe"); - gameSelectionComboBox.addItem("Reversi"); - - playerTypeSelectionBox = new JComboBox<>(); - playerTypeSelectionBox.addItem("Player vs Player"); - playerTypeSelectionBox.addItem("Player vs AI"); - playerTypeSelectionBox.addItem("AI vs Player"); - - panel1.add(gameSelectionComboBox); - panel1.add(playerTypeSelectionBox); - - startGame = new JButton("Start Game"); - panel1.add(startGame); - - cards.add(panel1, "MainMenu"); - - // Start button action - startGame.addActionListener(e -> startGameClicked()); - - setVisible(true); - } - - private String createServer() { - CompletableFuture serverIdFuture = new CompletableFuture<>(); - GlobalEventBus.post(new Events.ServerEvents.StartServerRequest("5001", "tictactoe", serverIdFuture)); // TODO: what if 5001 is in use - try { - return serverIdFuture.get(); - } catch (Exception e) { - logger.error("Error getting server ID", e); - } - return null; - } - - private String createConnection() { - CompletableFuture connectionIdFuture = new CompletableFuture<>(); - GlobalEventBus.post(new Events.ServerEvents.StartConnectionRequest("127.0.0.1", "5001", connectionIdFuture)); // TODO: what if server couldn't be started with port. - try { - return connectionIdFuture.get(); - } catch (InterruptedException | ExecutionException e) { - logger.error("Error getting connection ID", e); - } - return null; - } - - private void startGameClicked() { - String playerTypes = (String) playerTypeSelectionBox.getSelectedItem(); - String selectedGame = (String) gameSelectionComboBox.getSelectedItem(); - - String serverId = createServer(); - String connectionId = createConnection(); - final String[] gameId = new String[1]; - - if ("Player vs AI".equalsIgnoreCase(playerTypes)) { - GlobalEventBus.post(new Events.ServerEvents.SendCommand(connectionId, "create_game", "Player", "AI")); - } else if ("AI vs Player".equalsIgnoreCase(playerTypes)) { - GlobalEventBus.post(new Events.ServerEvents.SendCommand(connectionId, "create_game", "Player", "AI")); - } else { // Player vs Player is default - GlobalEventBus.post(new Events.ServerEvents.SendCommand(connectionId, "create_game", "Player1", "Player2")); - } - - CountDownLatch latch = new CountDownLatch(1); // TODO: This is bad, fix later - - new Thread(() -> { - GlobalEventBus.subscribeAndRegister(Events.ServerEvents.ReceivedMessage.class, event -> { - logger.info(event.message()); - if (event.message().toLowerCase().startsWith("game created successfully")) { - String[] parts = event.message().split("\\|"); - String gameIdPart = parts[1]; - gameId[0] = gameIdPart.split(" ")[1]; - latch.countDown(); - } - }); - }).start(); - - try { - latch.await(); // TODO: Bad, fix later - - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - - GlobalEventBus.post(new Events.ServerEvents.SendCommand(connectionId, "START_GAME", gameId[0])); - - if ("Tic Tac Toe".equalsIgnoreCase(selectedGame)) { - if (tttBoard == null) { - tttBoard = new UIGameBoard("tic tac toe", connectionId, serverId, gameId[0], this); - cards.add(tttBoard.getTTTPanel(), "TicTacToe"); - } - cardLayout.show(cards, "TicTacToe"); - } - } - - public void showMainMenu() { - cardLayout.show(cards, "MainMenu"); - } -} diff --git a/src/main/java/org/toop/server/backend/ServerManager.java b/src/main/java/org/toop/backend/ServerManager.java similarity index 97% rename from src/main/java/org/toop/server/backend/ServerManager.java rename to src/main/java/org/toop/backend/ServerManager.java index 583a48d..d05a876 100644 --- a/src/main/java/org/toop/server/backend/ServerManager.java +++ b/src/main/java/org/toop/backend/ServerManager.java @@ -1,11 +1,11 @@ -package org.toop.server.backend; +package org.toop.backend; import org.toop.eventbus.Events; import org.toop.eventbus.GlobalEventBus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.toop.server.backend.tictactoe.TicTacToeServer; +import org.toop.backend.tictactoe.TicTacToeServer; import java.util.ArrayList; import java.util.Map; diff --git a/src/main/java/org/toop/server/backend/TcpServer.java b/src/main/java/org/toop/backend/TcpServer.java similarity index 98% rename from src/main/java/org/toop/server/backend/TcpServer.java rename to src/main/java/org/toop/backend/TcpServer.java index cc6ecc9..205e968 100644 --- a/src/main/java/org/toop/server/backend/TcpServer.java +++ b/src/main/java/org/toop/backend/TcpServer.java @@ -1,8 +1,8 @@ -package org.toop.server.backend; +package org.toop.backend; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.toop.server.backend.tictactoe.ParsedCommand; +import org.toop.backend.tictactoe.ParsedCommand; import java.io.BufferedReader; import java.io.IOException; @@ -10,7 +10,6 @@ import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; -import java.util.HashMap; import java.util.Map; import java.util.concurrent.*; diff --git a/src/main/java/org/toop/server/backend/tictactoe/ParsedCommand.java b/src/main/java/org/toop/backend/tictactoe/ParsedCommand.java similarity index 99% rename from src/main/java/org/toop/server/backend/tictactoe/ParsedCommand.java rename to src/main/java/org/toop/backend/tictactoe/ParsedCommand.java index 558a9b4..e639323 100644 --- a/src/main/java/org/toop/server/backend/tictactoe/ParsedCommand.java +++ b/src/main/java/org/toop/backend/tictactoe/ParsedCommand.java @@ -1,8 +1,7 @@ -package org.toop.server.backend.tictactoe; +package org.toop.backend.tictactoe; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.toop.Main; import java.util.ArrayList; import java.util.regex.Matcher; diff --git a/src/main/java/org/toop/server/backend/tictactoe/TicTacToeServer.java b/src/main/java/org/toop/backend/tictactoe/TicTacToeServer.java similarity index 98% rename from src/main/java/org/toop/server/backend/tictactoe/TicTacToeServer.java rename to src/main/java/org/toop/backend/tictactoe/TicTacToeServer.java index 9685589..77b9854 100644 --- a/src/main/java/org/toop/server/backend/tictactoe/TicTacToeServer.java +++ b/src/main/java/org/toop/backend/tictactoe/TicTacToeServer.java @@ -1,9 +1,9 @@ -package org.toop.server.backend.tictactoe; +package org.toop.backend.tictactoe; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.toop.game.tictactoe.TicTacToe; -import org.toop.server.backend.TcpServer; +import org.toop.backend.TcpServer; import java.io.IOException; import java.net.Socket; diff --git a/src/main/java/org/toop/server/backend/tictactoe/TicTacToeServerCommand.java b/src/main/java/org/toop/backend/tictactoe/TicTacToeServerCommand.java similarity index 97% rename from src/main/java/org/toop/server/backend/tictactoe/TicTacToeServerCommand.java rename to src/main/java/org/toop/backend/tictactoe/TicTacToeServerCommand.java index 7786cc3..c7dfc6b 100644 --- a/src/main/java/org/toop/server/backend/tictactoe/TicTacToeServerCommand.java +++ b/src/main/java/org/toop/backend/tictactoe/TicTacToeServerCommand.java @@ -1,4 +1,4 @@ -package org.toop.server.backend.tictactoe; +package org.toop.backend.tictactoe; import java.util.EnumSet; diff --git a/src/main/java/org/toop/server/backend/tictactoe/TicTacToeServerMessage.java b/src/main/java/org/toop/backend/tictactoe/TicTacToeServerMessage.java similarity index 96% rename from src/main/java/org/toop/server/backend/tictactoe/TicTacToeServerMessage.java rename to src/main/java/org/toop/backend/tictactoe/TicTacToeServerMessage.java index 0574dd9..bb9f2e1 100644 --- a/src/main/java/org/toop/server/backend/tictactoe/TicTacToeServerMessage.java +++ b/src/main/java/org/toop/backend/tictactoe/TicTacToeServerMessage.java @@ -1,4 +1,4 @@ -package org.toop.server.backend.tictactoe; +package org.toop.backend.tictactoe; import java.util.EnumSet; diff --git a/src/main/java/org/toop/core/Window.java b/src/main/java/org/toop/core/Window.java index eb7c2b6..856e5f9 100644 --- a/src/main/java/org/toop/core/Window.java +++ b/src/main/java/org/toop/core/Window.java @@ -1,6 +1,6 @@ package org.toop.core; -import org.toop.platform.core.glfw.*; +import org.toop.frontend.platform.core.glfw.GlfwWindow; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; diff --git a/src/main/java/org/toop/eventbus/Events.java b/src/main/java/org/toop/eventbus/Events.java index 7a02d0c..2ef7d97 100644 --- a/src/main/java/org/toop/eventbus/Events.java +++ b/src/main/java/org/toop/eventbus/Events.java @@ -1,7 +1,7 @@ package org.toop.eventbus; import org.toop.core.Window; -import org.toop.server.backend.tictactoe.TicTacToeServer; +import org.toop.backend.tictactoe.TicTacToeServer; import java.lang.reflect.Constructor; import java.util.Arrays; diff --git a/src/main/java/org/toop/eventbus/GlobalEventBus.java b/src/main/java/org/toop/eventbus/GlobalEventBus.java index db2e7ba..3cf4d80 100644 --- a/src/main/java/org/toop/eventbus/GlobalEventBus.java +++ b/src/main/java/org/toop/eventbus/GlobalEventBus.java @@ -50,13 +50,13 @@ public class GlobalEventBus { * @param action The function, or lambda to run when fired. * @return Object to be used for registering an event. */ - private static Object subscribe(Class type, Consumer action) { + public static Object subscribe(Class type, Consumer action) { return new Object() { @Subscribe public void handle(Object event) { - if (type.isInstance(event)) { - action.accept(type.cast(event)); - } + if (type.isInstance(event)) { + action.accept(type.cast(event)); + } } }; } @@ -68,18 +68,10 @@ public class GlobalEventBus { * @param action The function, or lambda to run when fired. * @return Object to be used for registering an event. */ - public static EventMeta subscribeAndRegister(Class type, Consumer action) { - Object listener = new Object() { - @Subscribe - public void handle(Object event) { - if (type.isInstance(event)) { - action.accept(type.cast(event)); - } - } - }; - var re = new EventMeta<>(type, listener); - register(re); - return re; + public static Object subscribeAndRegister(Class type, Consumer action) { + var listener = subscribe(type, action); + register(listener); + return listener; } @@ -88,10 +80,8 @@ public class GlobalEventBus { * * @param event The ready event to add to register. */ - public static void register(EventMeta event) { - GlobalEventBus.get().register(event.getEvent()); - event.setReady(true); - EventRegistry.markReady(event.getType()); + public static void register(Object listener) { + GlobalEventBus.get().register(listener); } /** @@ -99,10 +89,8 @@ public class GlobalEventBus { * * @param event The ready event to unregister. */ - public static void unregister(EventMeta event) { - EventRegistry.markNotReady(event.getType()); - event.setReady(false); - GlobalEventBus.get().unregister(event.getEvent()); + public static void unregister(Object listener) { + GlobalEventBus.get().unregister(listener); } /** diff --git a/src/main/java/org/toop/server/frontend/ConnectionManager.java b/src/main/java/org/toop/frontend/ConnectionManager.java similarity index 99% rename from src/main/java/org/toop/server/frontend/ConnectionManager.java rename to src/main/java/org/toop/frontend/ConnectionManager.java index 84ea2af..8a6e242 100644 --- a/src/main/java/org/toop/server/frontend/ConnectionManager.java +++ b/src/main/java/org/toop/frontend/ConnectionManager.java @@ -1,4 +1,4 @@ -package org.toop.server.frontend; +package org.toop.frontend; import org.toop.eventbus.Events; import org.toop.eventbus.GlobalEventBus; diff --git a/src/main/java/org/toop/server/frontend/ServerConnection.java b/src/main/java/org/toop/frontend/ServerConnection.java similarity index 94% rename from src/main/java/org/toop/server/frontend/ServerConnection.java rename to src/main/java/org/toop/frontend/ServerConnection.java index b4ee4c3..be8205f 100644 --- a/src/main/java/org/toop/server/frontend/ServerConnection.java +++ b/src/main/java/org/toop/frontend/ServerConnection.java @@ -1,10 +1,9 @@ -package org.toop.server.frontend; - -import org.toop.eventbus.Events; -import org.toop.eventbus.GlobalEventBus; +package org.toop.frontend; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.toop.eventbus.Events; +import org.toop.eventbus.GlobalEventBus; import java.io.IOException; import java.net.InetAddress; @@ -59,8 +58,7 @@ public final class ServerConnection extends TcpClient implements Runnable { } } - private void initEvents() { - } + private void initEvents() {} private void startWorkers() { running = true; @@ -87,7 +85,8 @@ public final class ServerConnection extends TcpClient implements Runnable { String received = this.readLine(); // blocks if (received != null) { logger.info("Connection: {} received: '{}'", this.uuid, received); - this.addReceivedMessageToQueue(received); + // this.addReceivedMessageToQueue(received); // TODO: Will never go empty + GlobalEventBus.post(new Events.ServerEvents.ReceivedMessage(this.uuid, received)); // TODO: mb change } else { break; } diff --git a/src/main/java/org/toop/server/frontend/TcpClient.java b/src/main/java/org/toop/frontend/TcpClient.java similarity index 98% rename from src/main/java/org/toop/server/frontend/TcpClient.java rename to src/main/java/org/toop/frontend/TcpClient.java index ff2bebc..3e2458c 100644 --- a/src/main/java/org/toop/server/frontend/TcpClient.java +++ b/src/main/java/org/toop/frontend/TcpClient.java @@ -1,4 +1,4 @@ -package org.toop.server.frontend; +package org.toop.frontend; import java.io.BufferedReader; import java.io.IOException; diff --git a/src/main/java/org/toop/UI/BackgroundPanel.java b/src/main/java/org/toop/frontend/UI/BackgroundPanel.java similarity index 93% rename from src/main/java/org/toop/UI/BackgroundPanel.java rename to src/main/java/org/toop/frontend/UI/BackgroundPanel.java index 4bd1caf..8b27b71 100644 --- a/src/main/java/org/toop/UI/BackgroundPanel.java +++ b/src/main/java/org/toop/frontend/UI/BackgroundPanel.java @@ -1,4 +1,4 @@ -package org.toop.UI; +package org.toop.frontend.UI; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/org/toop/UI/LocalGameSelector.form b/src/main/java/org/toop/frontend/UI/LocalGameSelector.form similarity index 96% rename from src/main/java/org/toop/UI/LocalGameSelector.form rename to src/main/java/org/toop/frontend/UI/LocalGameSelector.form index 217c38a..d9f3f18 100644 --- a/src/main/java/org/toop/UI/LocalGameSelector.form +++ b/src/main/java/org/toop/frontend/UI/LocalGameSelector.form @@ -1,5 +1,5 @@ -
+ diff --git a/src/main/java/org/toop/frontend/UI/LocalGameSelector.java b/src/main/java/org/toop/frontend/UI/LocalGameSelector.java new file mode 100644 index 0000000..a5c1bad --- /dev/null +++ b/src/main/java/org/toop/frontend/UI/LocalGameSelector.java @@ -0,0 +1,83 @@ +package org.toop.frontend.UI; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.toop.eventbus.Events; +import org.toop.eventbus.GlobalEventBus; +import org.toop.frontend.games.LocalTicTacToe; + +import javax.swing.*; +import java.awt.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; + +public class LocalGameSelector extends JFrame { + private static final Logger logger = LogManager.getLogger(LocalGameSelector.class); + + private JPanel panel1; + private JComboBox gameSelectionComboBox; + private JButton startGame; + private JComboBox playerTypeSelectionBox; + + private JPanel cards; // CardLayout panel + private CardLayout cardLayout; + + private UIGameBoard tttBoard; + + public LocalGameSelector() { + setTitle("Local Game Selector"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setSize(1920, 1080); + setLocationRelativeTo(null); + + // Setup CardLayout + cardLayout = new CardLayout(); + cards = new JPanel(cardLayout); + setContentPane(cards); + + // --- Main menu panel --- + panel1 = new JPanel(); + panel1.setLayout(new FlowLayout()); + gameSelectionComboBox = new JComboBox<>(); + gameSelectionComboBox.addItem("Tic Tac Toe"); + gameSelectionComboBox.addItem("Reversi"); + + playerTypeSelectionBox = new JComboBox<>(); + playerTypeSelectionBox.addItem("Player vs Player"); + playerTypeSelectionBox.addItem("Player vs AI"); + playerTypeSelectionBox.addItem("AI vs Player"); + + panel1.add(gameSelectionComboBox); + panel1.add(playerTypeSelectionBox); + + startGame = new JButton("Start Game"); + panel1.add(startGame); + + cards.add(panel1, "MainMenu"); + + // Start button action + startGame.addActionListener(e -> startGameClicked()); + + setVisible(true); + } + + private void startGameClicked() { + String playerTypes = (String) playerTypeSelectionBox.getSelectedItem(); + String selectedGame = (String) gameSelectionComboBox.getSelectedItem(); + + LocalTicTacToe lttt = new LocalTicTacToe(true, "127.0.0.1", "5001"); + + if ("Tic Tac Toe".equalsIgnoreCase(selectedGame)) { + if (tttBoard == null) { + tttBoard = new UIGameBoard(lttt, this); + cards.add(tttBoard.getTTTPanel(), "TicTacToe"); + } + cardLayout.show(cards, "TicTacToe"); + } + } + + public void showMainMenu() { + cardLayout.show(cards, "MainMenu"); + } +} diff --git a/src/main/java/org/toop/UI/LocalServerSelector.form b/src/main/java/org/toop/frontend/UI/LocalServerSelector.form similarity index 96% rename from src/main/java/org/toop/UI/LocalServerSelector.form rename to src/main/java/org/toop/frontend/UI/LocalServerSelector.form index be26eaf..73dbbb4 100644 --- a/src/main/java/org/toop/UI/LocalServerSelector.form +++ b/src/main/java/org/toop/frontend/UI/LocalServerSelector.form @@ -1,5 +1,5 @@ - + diff --git a/src/main/java/org/toop/UI/LocalServerSelector.java b/src/main/java/org/toop/frontend/UI/LocalServerSelector.java similarity index 96% rename from src/main/java/org/toop/UI/LocalServerSelector.java rename to src/main/java/org/toop/frontend/UI/LocalServerSelector.java index fefbac9..14b0d10 100644 --- a/src/main/java/org/toop/UI/LocalServerSelector.java +++ b/src/main/java/org/toop/frontend/UI/LocalServerSelector.java @@ -1,4 +1,4 @@ -package org.toop.UI; +package org.toop.frontend.UI; import javax.swing.*; diff --git a/src/main/java/org/toop/UI/RemoteGameSelector.form b/src/main/java/org/toop/frontend/UI/RemoteGameSelector.form similarity index 99% rename from src/main/java/org/toop/UI/RemoteGameSelector.form rename to src/main/java/org/toop/frontend/UI/RemoteGameSelector.form index 902cb76..1bb35ab 100644 --- a/src/main/java/org/toop/UI/RemoteGameSelector.form +++ b/src/main/java/org/toop/frontend/UI/RemoteGameSelector.form @@ -1,5 +1,5 @@ - + diff --git a/src/main/java/org/toop/UI/RemoteGameSelector.java b/src/main/java/org/toop/frontend/UI/RemoteGameSelector.java similarity index 99% rename from src/main/java/org/toop/UI/RemoteGameSelector.java rename to src/main/java/org/toop/frontend/UI/RemoteGameSelector.java index d01a52c..9ce9d4a 100644 --- a/src/main/java/org/toop/UI/RemoteGameSelector.java +++ b/src/main/java/org/toop/frontend/UI/RemoteGameSelector.java @@ -1,4 +1,4 @@ -package org.toop.UI; +package org.toop.frontend.UI; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.toop.eventbus.Events; diff --git a/src/main/java/org/toop/UI/Services.form b/src/main/java/org/toop/frontend/UI/Services.form similarity index 90% rename from src/main/java/org/toop/UI/Services.form rename to src/main/java/org/toop/frontend/UI/Services.form index 82187e2..c04ea22 100644 --- a/src/main/java/org/toop/UI/Services.form +++ b/src/main/java/org/toop/frontend/UI/Services.form @@ -1,5 +1,5 @@ - + diff --git a/src/main/java/org/toop/UI/Services.java b/src/main/java/org/toop/frontend/UI/Services.java similarity index 62% rename from src/main/java/org/toop/UI/Services.java rename to src/main/java/org/toop/frontend/UI/Services.java index e1c8ae3..29d3e0d 100644 --- a/src/main/java/org/toop/UI/Services.java +++ b/src/main/java/org/toop/frontend/UI/Services.java @@ -1,4 +1,4 @@ -package org.toop.UI; +package org.toop.frontend.UI; import javax.swing.*; diff --git a/src/main/java/org/toop/UI/UIGameBoard.form b/src/main/java/org/toop/frontend/UI/UIGameBoard.form similarity index 94% rename from src/main/java/org/toop/UI/UIGameBoard.form rename to src/main/java/org/toop/frontend/UI/UIGameBoard.form index 09a9ed6..6f76e01 100644 --- a/src/main/java/org/toop/UI/UIGameBoard.form +++ b/src/main/java/org/toop/frontend/UI/UIGameBoard.form @@ -1,5 +1,5 @@ - + diff --git a/src/main/java/org/toop/UI/UIGameBoard.java b/src/main/java/org/toop/frontend/UI/UIGameBoard.java similarity index 75% rename from src/main/java/org/toop/UI/UIGameBoard.java rename to src/main/java/org/toop/frontend/UI/UIGameBoard.java index f103c53..0162f25 100644 --- a/src/main/java/org/toop/UI/UIGameBoard.java +++ b/src/main/java/org/toop/frontend/UI/UIGameBoard.java @@ -1,7 +1,8 @@ -package org.toop.UI; +package org.toop.frontend.UI; import org.toop.eventbus.Events; import org.toop.eventbus.GlobalEventBus; +import org.toop.frontend.games.LocalTicTacToe; import javax.swing.*; import java.awt.*; @@ -16,18 +17,12 @@ public class UIGameBoard { private JButton[] cells; private String currentPlayer = "X"; - private String gameConnectionId; - private String serverId; - private String gameId; - private LocalGameSelector parentSelector; + private LocalTicTacToe localTicTacToe; - public UIGameBoard(String gameType, String gameConnectionId, String serverId, String gameId, LocalGameSelector parent) { + public UIGameBoard(LocalTicTacToe lttt, LocalGameSelector parent) { this.parentSelector = parent; - - this .gameConnectionId = gameConnectionId; - this.serverId = serverId; - this.gameId = gameId; + this.localTicTacToe = lttt; // Root panel tttPanel = new JPanel(new BorderLayout()); @@ -59,10 +54,7 @@ public class UIGameBoard { cells[index].setText(currentPlayer); if (Objects.equals(currentPlayer, "X")) { currentPlayer = "O"; } else { currentPlayer = "X"; } - GlobalEventBus.post(new Events.ServerEvents.SendCommand(this.gameConnectionId, - "gameid ", this.gameId, - "player ", this.currentPlayer, // TODO: Actual player names - "MOVE", "" + index)); + this.localTicTacToe.move(index); System.out.println("Cell clicked: " + index); }); } diff --git a/src/main/java/org/toop/frontend/games/LocalTicTacToe.java b/src/main/java/org/toop/frontend/games/LocalTicTacToe.java new file mode 100644 index 0000000..0b31739 --- /dev/null +++ b/src/main/java/org/toop/frontend/games/LocalTicTacToe.java @@ -0,0 +1,170 @@ +package org.toop.frontend.games; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.toop.eventbus.Events; +import org.toop.eventbus.GlobalEventBus; + +import java.util.concurrent.*; + +public class LocalTicTacToe { // TODO: Implement runnable + private static final Logger logger = LogManager.getLogger(LocalTicTacToe.class); + + private final ExecutorService executor = Executors.newSingleThreadExecutor(); + private final BlockingQueue receivedQueue = new LinkedBlockingQueue<>(); + + Object receivedMessageListener; + + volatile String gameId; + volatile String connectionId; + volatile String serverId; + + /** + * Is either 1 or 2. + */ + private int playersTurn = 1; + +// LocalTicTacToe(String gameId, String connectionId, String serverId) { +// this.gameId = gameId; +// this.connectionId = connectionId; +// this.serverId = serverId; +// this.receivedMessageListener = GlobalEventBus.subscribe(Events.ServerEvents.ReceivedMessage.class, this::receiveMessageAction); +// GlobalEventBus.register(this.receivedMessageListener); +// +// +// this.executor.submit(this::gameThread); +// } TODO: If remote server + + public LocalTicTacToe(boolean isLocalServer, String ip, String port) { + this.receivedMessageListener = GlobalEventBus.subscribe(Events.ServerEvents.ReceivedMessage.class, this::receiveMessageAction); + GlobalEventBus.register(this.receivedMessageListener); + + // TODO: Is blocking + if (isLocalServer) { this.serverId = this.createServer(port); } + else { this.serverId = null; } // TODO: What if null? + this.connectionId = this.createConnection(ip, port); + this.createGame(ip, port); + + this.executor.submit(this::gameThread); + } + + private String createServer(String port) { + CompletableFuture serverIdFuture = new CompletableFuture<>(); + GlobalEventBus.post(new Events.ServerEvents.StartServerRequest(port, "tictactoe", serverIdFuture)); + try { + return serverIdFuture.get(); + } catch (Exception e) { + logger.error("Error getting server ID", e); + } + return null; + } + + private String createConnection(String ip, String port) { + CompletableFuture connectionIdFuture = new CompletableFuture<>(); + GlobalEventBus.post(new Events.ServerEvents.StartConnectionRequest(ip, port, connectionIdFuture)); // TODO: what if server couldn't be started with port. + try { + return connectionIdFuture.get(); + } catch (InterruptedException | ExecutionException e) { + logger.error("Error getting connection ID", e); + } + return null; + } + + private void createGame(String nameA, String nameB) { + nameA = nameA.trim().replace(" ", "-"); + nameB = nameB.trim().replace(" ", "-"); + this.sendCommand("create_game", nameA, nameB); + } + + private void startGame() { + if (this.gameId == null) { return; } + this.sendCommand("start_game", this.gameId); + } + + void gameThread() { + logger.info("Starting local game thread, connection: {}, server: {}", this.connectionId, this.serverId); + + CountDownLatch latch = new CountDownLatch(1); // TODO: This is bad, fix later + + new Thread(() -> { + while(true) { + String msg = this.receivedQueue.poll(); + if (msg == null) {continue;} + if (msg.toLowerCase().startsWith("game created successfully")) { + String[] parts = msg.split("\\|"); + String gameIdPart = parts[1]; + this.gameId = gameIdPart.split(" ")[1]; + latch.countDown(); + break; + } + } + }).start(); + + try { + latch.await(); // TODO: Bad, fix later + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + startGame(); // TODO: Actually need to wait, but is fine for now. + boolean running = true; + while (running) { + try { + String rec = this.receivedQueue.take(); + if (rec.equalsIgnoreCase("ok")) {continue;} + else if (rec.equalsIgnoreCase("svr game yourturn")) { + if (this.playersTurn == 1) { + this.playersTurn += 1; + } else { + this.playersTurn -= 1; + } + logger.info("Player turn: {}", this.playersTurn); + } + else if (rec.equalsIgnoreCase("svr game win")) { + endListeners(); + } + + } catch (InterruptedException e) { + throw new RuntimeException(e); // TODO: Error handling + } + } + + this.endListeners(); + + } + + public void endGame() { + sendCommand("gameid", "end_game"); // TODO: Command is a bit wrong. + } + + public void move(int index) { + sendCommand("gameid", this.gameId, "player", "test", "move", String.valueOf(index)); + } + + private void endTheGame() { + this.sendCommand("end_game", this.gameId); + this.endListeners(); + } + + void receiveMessageAction(Events.ServerEvents.ReceivedMessage receivedMessage) { + if (!receivedMessage.ConnectionUuid().equals(this.connectionId)) { + return; + } + + try { + logger.info("Received message from " + this.connectionId + ": " + receivedMessage.message()); + this.receivedQueue.put(receivedMessage.message()); + } catch (InterruptedException e) { + logger.error("Error waiting for received Message", e); + } + } + + void sendCommand(String... args) { + GlobalEventBus.post(new Events.ServerEvents.SendCommand(this.connectionId, args)); + } + + void endListeners() { + GlobalEventBus.unregister(this.receivedMessageListener); + } + +} diff --git a/src/main/java/org/toop/graphics/Renderer.java b/src/main/java/org/toop/frontend/graphics/Renderer.java similarity index 89% rename from src/main/java/org/toop/graphics/Renderer.java rename to src/main/java/org/toop/frontend/graphics/Renderer.java index f0e13d8..66a4bf0 100644 --- a/src/main/java/org/toop/graphics/Renderer.java +++ b/src/main/java/org/toop/frontend/graphics/Renderer.java @@ -1,6 +1,6 @@ -package org.toop.graphics; +package org.toop.frontend.graphics; -import org.toop.platform.graphics.opengl.*; +import org.toop.frontend.platform.graphics.opengl.OpenglRenderer; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; diff --git a/src/main/java/org/toop/graphics/Shader.java b/src/main/java/org/toop/frontend/graphics/Shader.java similarity index 80% rename from src/main/java/org/toop/graphics/Shader.java rename to src/main/java/org/toop/frontend/graphics/Shader.java index 11e62a3..fa007a6 100644 --- a/src/main/java/org/toop/graphics/Shader.java +++ b/src/main/java/org/toop/frontend/graphics/Shader.java @@ -1,6 +1,6 @@ -package org.toop.graphics; +package org.toop.frontend.graphics; -import org.toop.platform.graphics.opengl.*; +import org.toop.frontend.platform.graphics.opengl.OpenglShader; public abstract class Shader { public static Shader create(String vertexPath, String fragmentPath) { diff --git a/src/main/java/org/toop/graphics/node/Button.java b/src/main/java/org/toop/frontend/graphics/node/Button.java similarity index 85% rename from src/main/java/org/toop/graphics/node/Button.java rename to src/main/java/org/toop/frontend/graphics/node/Button.java index 3ee74ac..9bc1f3f 100644 --- a/src/main/java/org/toop/graphics/node/Button.java +++ b/src/main/java/org/toop/frontend/graphics/node/Button.java @@ -1,7 +1,7 @@ -package org.toop.graphics.node; +package org.toop.frontend.graphics.node; import org.toop.core.*; -import org.toop.math.*; +import org.toop.frontend.math.Color; public class Button extends Node { ICallable onHover; diff --git a/src/main/java/org/toop/graphics/node/Node.java b/src/main/java/org/toop/frontend/graphics/node/Node.java similarity index 74% rename from src/main/java/org/toop/graphics/node/Node.java rename to src/main/java/org/toop/frontend/graphics/node/Node.java index 929738c..493ccca 100644 --- a/src/main/java/org/toop/graphics/node/Node.java +++ b/src/main/java/org/toop/frontend/graphics/node/Node.java @@ -1,6 +1,7 @@ -package org.toop.graphics.node; +package org.toop.frontend.graphics.node; -import org.toop.math.*; +import org.toop.frontend.math.Bounds; +import org.toop.frontend.math.Color; public abstract class Node { protected Bounds bounds; diff --git a/src/main/java/org/toop/graphics/node/NodeManager.java b/src/main/java/org/toop/frontend/graphics/node/NodeManager.java similarity index 93% rename from src/main/java/org/toop/graphics/node/NodeManager.java rename to src/main/java/org/toop/frontend/graphics/node/NodeManager.java index f59adaf..f278d0c 100644 --- a/src/main/java/org/toop/graphics/node/NodeManager.java +++ b/src/main/java/org/toop/frontend/graphics/node/NodeManager.java @@ -1,7 +1,7 @@ -package org.toop.graphics.node; +package org.toop.frontend.graphics.node; import org.toop.eventbus.*; -import org.toop.graphics.*; +import org.toop.frontend.graphics.Shader; import java.util.*; diff --git a/src/main/java/org/toop/graphics/node/Widget.java b/src/main/java/org/toop/frontend/graphics/node/Widget.java similarity index 90% rename from src/main/java/org/toop/graphics/node/Widget.java rename to src/main/java/org/toop/frontend/graphics/node/Widget.java index aa3b3f1..c63575f 100644 --- a/src/main/java/org/toop/graphics/node/Widget.java +++ b/src/main/java/org/toop/frontend/graphics/node/Widget.java @@ -1,6 +1,6 @@ -package org.toop.graphics.node; +package org.toop.frontend.graphics.node; -import org.toop.math.*; +import org.toop.frontend.math.Bounds; import java.util.*; diff --git a/src/main/java/org/toop/math/Bounds.java b/src/main/java/org/toop/frontend/math/Bounds.java similarity index 95% rename from src/main/java/org/toop/math/Bounds.java rename to src/main/java/org/toop/frontend/math/Bounds.java index 7b7769a..fdef983 100644 --- a/src/main/java/org/toop/math/Bounds.java +++ b/src/main/java/org/toop/frontend/math/Bounds.java @@ -1,4 +1,4 @@ -package org.toop.math; +package org.toop.frontend.math; public class Bounds { private int x; diff --git a/src/main/java/org/toop/math/Color.java b/src/main/java/org/toop/frontend/math/Color.java similarity index 89% rename from src/main/java/org/toop/math/Color.java rename to src/main/java/org/toop/frontend/math/Color.java index 322bc16..99823d3 100644 --- a/src/main/java/org/toop/math/Color.java +++ b/src/main/java/org/toop/frontend/math/Color.java @@ -1,4 +1,4 @@ -package org.toop.math; +package org.toop.frontend.math; public class Color { private float r; diff --git a/src/main/java/org/toop/platform/core/glfw/GlfwWindow.java b/src/main/java/org/toop/frontend/platform/core/glfw/GlfwWindow.java similarity index 98% rename from src/main/java/org/toop/platform/core/glfw/GlfwWindow.java rename to src/main/java/org/toop/frontend/platform/core/glfw/GlfwWindow.java index 3b02a74..1abc037 100644 --- a/src/main/java/org/toop/platform/core/glfw/GlfwWindow.java +++ b/src/main/java/org/toop/frontend/platform/core/glfw/GlfwWindow.java @@ -1,4 +1,4 @@ -package org.toop.platform.core.glfw; +package org.toop.frontend.platform.core.glfw; import org.toop.core.*; import org.toop.eventbus.*; diff --git a/src/main/java/org/toop/platform/graphics/opengl/OpenglRenderer.java b/src/main/java/org/toop/frontend/platform/graphics/opengl/OpenglRenderer.java similarity index 92% rename from src/main/java/org/toop/platform/graphics/opengl/OpenglRenderer.java rename to src/main/java/org/toop/frontend/platform/graphics/opengl/OpenglRenderer.java index 6b0a963..53fbc6c 100644 --- a/src/main/java/org/toop/platform/graphics/opengl/OpenglRenderer.java +++ b/src/main/java/org/toop/frontend/platform/graphics/opengl/OpenglRenderer.java @@ -1,7 +1,8 @@ -package org.toop.platform.graphics.opengl; +package org.toop.frontend.platform.graphics.opengl; import org.toop.eventbus.*; -import org.toop.graphics.*; +import org.toop.frontend.graphics.Renderer; +import org.toop.frontend.graphics.Shader; import org.lwjgl.opengl.*; import org.lwjgl.system.*; diff --git a/src/main/java/org/toop/platform/graphics/opengl/OpenglShader.java b/src/main/java/org/toop/frontend/platform/graphics/opengl/OpenglShader.java similarity index 93% rename from src/main/java/org/toop/platform/graphics/opengl/OpenglShader.java rename to src/main/java/org/toop/frontend/platform/graphics/opengl/OpenglShader.java index 1d0dd8d..bbd686a 100644 --- a/src/main/java/org/toop/platform/graphics/opengl/OpenglShader.java +++ b/src/main/java/org/toop/frontend/platform/graphics/opengl/OpenglShader.java @@ -1,7 +1,7 @@ -package org.toop.platform.graphics.opengl; +package org.toop.frontend.platform.graphics.opengl; import org.toop.core.*; -import org.toop.graphics.*; +import org.toop.frontend.graphics.Shader; import org.lwjgl.opengl.*; diff --git a/src/main/java/org/toop/game/tictactoe/TicTacToe.java b/src/main/java/org/toop/game/tictactoe/TicTacToe.java index 6838c87..17881d9 100644 --- a/src/main/java/org/toop/game/tictactoe/TicTacToe.java +++ b/src/main/java/org/toop/game/tictactoe/TicTacToe.java @@ -2,8 +2,9 @@ package org.toop.game.tictactoe; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.toop.backend.tictactoe.ParsedCommand; +import org.toop.backend.tictactoe.TicTacToeServerCommand; import org.toop.game.*; -import org.toop.server.backend.tictactoe.*; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue;