diff --git a/framework/src/main/java/org/toop/framework/game/gameThreads/ServerThreadBehaviour.java b/framework/src/main/java/org/toop/framework/game/gameThreads/ServerThreadBehaviour.java index 91f9186..a4c5ac5 100644 --- a/framework/src/main/java/org/toop/framework/game/gameThreads/ServerThreadBehaviour.java +++ b/framework/src/main/java/org/toop/framework/game/gameThreads/ServerThreadBehaviour.java @@ -8,6 +8,7 @@ import org.toop.framework.gameFramework.model.game.threadBehaviour.AbstractThrea import org.toop.framework.gameFramework.model.player.Player; import org.toop.framework.gameFramework.view.GUIEvents; import org.toop.framework.utils.ImmutablePair; +import org.toop.framework.utils.Pair; import java.util.function.Consumer; @@ -15,18 +16,29 @@ import static org.toop.framework.gameFramework.GameState.TURN_SKIPPED; import static org.toop.framework.gameFramework.GameState.WIN; public class ServerThreadBehaviour extends AbstractThreadBehaviour implements Runnable { - private Consumer> onPlayerMove; + private final Consumer> onPlayerMove; + private final Consumer> onGameEnd; /** * Creates a new base behaviour for the specified game. * * @param game the turn-based game to control */ - public ServerThreadBehaviour(TurnBasedGame game, Consumer> onPlayerMove) { + public ServerThreadBehaviour(TurnBasedGame game, Consumer> onPlayerMove, Consumer> onGameEnd) { + this.onPlayerMove = onPlayerMove; + this.onGameEnd = onGameEnd; super(game); } private void notifyPlayerMove(ImmutablePair pair) { - onPlayerMove.accept(pair); + if (onPlayerMove != null) { + onPlayerMove.accept(pair); + } + } + + private void notifyGameEnd(ImmutablePair pair) { + if (onGameEnd != null) { + onGameEnd.accept(pair); + } } /** Starts the game loop in a new thread. */ @@ -51,14 +63,12 @@ public class ServerThreadBehaviour extends AbstractThreadBehaviour implements Ru PlayResult result = game.play(move); GameState state = result.state(); - - if (state != TURN_SKIPPED){ - notifyPlayerMove(new ImmutablePair<>(currentPlayer.getName(), Long.numberOfTrailingZeros(move))); - } + notifyPlayerMove(new ImmutablePair<>(currentPlayer.getName(), Long.numberOfTrailingZeros(move))); switch (state) { case WIN, DRAW -> { isRunning.set(false); + notifyGameEnd(new ImmutablePair<>(state, game.getWinner())); } case NORMAL, TURN_SKIPPED -> { /* continue normally */ } default -> { diff --git a/framework/src/main/java/org/toop/framework/game/players/ServerPlayer.java b/framework/src/main/java/org/toop/framework/game/players/ServerPlayer.java index 535a033..519f857 100644 --- a/framework/src/main/java/org/toop/framework/game/players/ServerPlayer.java +++ b/framework/src/main/java/org/toop/framework/game/players/ServerPlayer.java @@ -38,9 +38,4 @@ public class ServerPlayer extends AbstractPlayer { return 0; } } - - @Override - public String getName() { - return ""; - } } diff --git a/framework/src/main/java/org/toop/framework/gameFramework/model/player/AbstractPlayer.java b/framework/src/main/java/org/toop/framework/gameFramework/model/player/AbstractPlayer.java index f643574..8a294e8 100644 --- a/framework/src/main/java/org/toop/framework/gameFramework/model/player/AbstractPlayer.java +++ b/framework/src/main/java/org/toop/framework/gameFramework/model/player/AbstractPlayer.java @@ -21,6 +21,7 @@ public abstract class AbstractPlayer implements Player { private final String name; protected AbstractPlayer(String name) { + System.out.println("Player " + name + " has been created"); this.name = name; } @@ -44,7 +45,7 @@ public abstract class AbstractPlayer implements Player { throw new UnsupportedOperationException("Not supported yet."); } - public String getName(){ + public final String getName(){ return this.name; } } diff --git a/framework/src/main/java/org/toop/framework/networking/server/Game.java b/framework/src/main/java/org/toop/framework/networking/server/Game.java index 2c9a803..6903120 100644 --- a/framework/src/main/java/org/toop/framework/networking/server/Game.java +++ b/framework/src/main/java/org/toop/framework/networking/server/Game.java @@ -1,6 +1,7 @@ package org.toop.framework.networking.server; import org.toop.framework.game.gameThreads.ServerThreadBehaviour; +import org.toop.framework.gameFramework.GameState; import org.toop.framework.gameFramework.model.game.TurnBasedGame; public class Game implements OnlineGame { @@ -12,13 +13,31 @@ public class Game implements OnlineGame { public Game(TurnBasedGame game, User... users) { this.game = game; - this.gameThread = new ServerThreadBehaviour(game, (pair) -> notifyMoveMade(pair.getLeft(), pair.getRight())); + this.gameThread = new ServerThreadBehaviour( + game, + (pair) -> notifyMoveMade(pair.getLeft(), pair.getRight()), + (pair) -> notifyGameEnd(pair.getLeft(), pair.getRight()) + ); this.users = users; } private void notifyMoveMade(String speler, int move){ - users[0].sendMessage(String.format("SVR GAME MOVE {PLAYER: \"%s\", DETAILS: \"\", MOVE: \"%s\"}", speler, move)); - users[1].sendMessage(String.format("SVR GAME MOVE {PLAYER: \"%s\", DETAILS: \"\", MOVE: \"%s\"}", speler, move)); + for (User user : users) { + user.sendMessage(String.format("SVR GAME MOVE {PLAYER: \"%s\", MOVE: \"%s\", DETAILS: \"\"}\n", speler, move)); + } + } + + private void notifyGameEnd(GameState state, int winner){ + if (state == GameState.DRAW){ + for (User user : users) { + user.sendMessage(String.format("SVR GAME DRAW {PLAYERONESCORE: \"\", PLAYERTWOSCORE: \"\", COMMENT: \"Client disconnected\"}\n")); + } + } + else{ + users[winner].sendMessage(String.format("SVR GAME WIN {PLAYERONESCORE: \"\", PLAYERTWOSCORE: \"\", COMMENT: \"Client disconnected\"}\n")); + users[(winner + 1)%2].sendMessage(String.format("SVR GAME LOSS {PLAYERONESCORE: \"\", PLAYERTWOSCORE: \"\", COMMENT: \"Client disconnected\"}\n")); + } + } @Override diff --git a/framework/src/main/java/org/toop/framework/networking/server/User.java b/framework/src/main/java/org/toop/framework/networking/server/User.java index 3078ca5..34c1211 100644 --- a/framework/src/main/java/org/toop/framework/networking/server/User.java +++ b/framework/src/main/java/org/toop/framework/networking/server/User.java @@ -39,6 +39,9 @@ public class User implements ServerUser { @Override public Game game() { + if (this.gamePair == null) { + return null; + } return this.gamePair.getLeft(); }