[lobby-svn] SF.net SVN: lobby:[1055] trunk/src_server/net/yura/lobby/server
Brought to you by:
yuranet
From: <yu...@us...> - 2025-05-05 12:10:50
|
Revision: 1055 http://sourceforge.net/p/lobby/code/1055 Author: yuranet Date: 2025-05-05 12:10:33 +0000 (Mon, 05 May 2025) Log Message: ----------- ClientLogicTurnBasedGame added Modified Paths: -------------- trunk/src_server/net/yura/lobby/server/AbstractTurnBasedServerGame.java trunk/src_server/net/yura/lobby/server/TurnBasedGame.java Added Paths: ----------- trunk/src_server/net/yura/lobby/server/ClientLogicTurnBasedGame.java Modified: trunk/src_server/net/yura/lobby/server/AbstractTurnBasedServerGame.java =================================================================== --- trunk/src_server/net/yura/lobby/server/AbstractTurnBasedServerGame.java 2025-05-05 11:43:17 UTC (rev 1054) +++ trunk/src_server/net/yura/lobby/server/AbstractTurnBasedServerGame.java 2025-05-05 12:10:33 UTC (rev 1055) @@ -145,7 +145,6 @@ objectFromPlayer(username, object); } - // TODO should be synchronized with something? @Override public final void midgameLogin(String oldser,String newuser) { midgamePlayerLogin(oldser, newuser); @@ -168,7 +167,7 @@ } @Override - public void destroyServerGame() { + public final void destroyServerGame() { killFuture(); destroyGame(); } Added: trunk/src_server/net/yura/lobby/server/ClientLogicTurnBasedGame.java =================================================================== --- trunk/src_server/net/yura/lobby/server/ClientLogicTurnBasedGame.java (rev 0) +++ trunk/src_server/net/yura/lobby/server/ClientLogicTurnBasedGame.java 2025-05-05 12:10:33 UTC (rev 1055) @@ -0,0 +1,123 @@ +package net.yura.lobby.server; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * A very simple turn based game where the entire state of the game is sent as a byte[] + * + * player1 ready, player2 ready (depending on who goes first, either play 2 also takes a turn or its passed to player1) + * + */ +public class ClientLogicTurnBasedGame extends AbstractTurnBasedServerGame { + + List<String> players; + byte[] gameState; + + @Override + public void startGame(String[] players) { + this.players = new ArrayList(Arrays.asList(players)); + gameState = new byte[0]; + getInputFromClient(players[0]); + } + + @Override + public void loadGame(byte[] gameData) { + gameState = gameData; + // TODO how do we know this list of players? + // TODO or whos turn it is? + } + + @Override + public byte[] saveGameState() { + // TODO maybe also save players and currentPlayer so it can be all restored + return gameState; + } + + @Override + public void clientHasJoined(LobbySession session) { + listoner.messageFromGame(gameState, Collections.singleton(session)); + } + + @Override + public void setOptions(String startGameOptions) { + // we do not need this, the client will create the game object from the options + } + + @Override + public boolean isSupportedClient(LobbySession session) { + // its up to the client for force an update if it recieves data object it does not support + return true; + } + + @Override + public void destroyGame() { + // nothing to do as all logic on the client + } + + @Override + public void objectFromPlayer(String player, Object message) { + if (!player.equals(whoiwantinputfrom)) { + throw new IllegalArgumentException("not your turn " + player); + } + + // TurnBasedMultiplayerClient finishMatch + if ("finishMatch".equals(message)) { // TODO we need to know the winner + gameFinished("TODO"); + return; + } + + gameState = (byte[])message; + listoner.messageFromGame(gameState, spectators); + moveToNextPlayer(); + } + + private void moveToNextPlayer() { + int index = players.indexOf(whoiwantinputfrom); + if (index < 0) { + throw new IllegalStateException("current player not in " + players); + } + index++; + if (index == players.size()) { + index = 0; + } + getInputFromClient(players.get(index)); + } + + @Override + public void playerJoins(String player) { + //players.add(player); + throw new UnsupportedOperationException(); + } + + @Override + public boolean playerResigns(String player) { + players.remove(player); + if (players.size() == 1) { + // if the current player has resigned + //if (whoiwantinputfrom == null) { + // no point in calling this as gameFinished will set current player to null anyway + //getInputFromClient(players.get(0)); + //} + return gameFinished(players.get(0)); + } + if (players.isEmpty()) { + // TODO this is kind of meaninless, as the game is already over by now + return listoner.gameFinished(null); + } + return false; + } + + @Override + public void midgamePlayerLogin(String oldPlayer, String newPlayer) { + players.set(players.indexOf(oldPlayer), newPlayer); + } + + @Override + public void playerTimedOut(String username) { + listoner.sendChatroomMessage(username + " has timed out and has been resigned from the game."); + listoner.resignPlayer(username); + } +} Modified: trunk/src_server/net/yura/lobby/server/TurnBasedGame.java =================================================================== --- trunk/src_server/net/yura/lobby/server/TurnBasedGame.java 2025-05-05 11:43:17 UTC (rev 1054) +++ trunk/src_server/net/yura/lobby/server/TurnBasedGame.java 2025-05-05 12:10:33 UTC (rev 1055) @@ -30,7 +30,7 @@ @Override public abstract void startGame(String[] players); @Override public abstract void loadGame(byte[] gameData); - public abstract void renamePlayer(String oldser,String newuser); + public abstract void renamePlayer(String oldser, String newuser); //comunication public abstract void clientHasJoined(String username); @@ -43,15 +43,15 @@ public final void playerTimedOut(String username) { // when MAX_SKIPS turns have been skipped, the player is resigned - int skip = skips.get(username)==null?1:skips.get(username)+1; + int skip = skips.get(username) == null ? 1 : skips.get(username) + 1; skips.put(username, skip); if (skip >= MAX_SKIPS) { - listoner.sendChatroomMessage(username+" has timed out "+MAX_SKIPS+" times and has been resigned from the game."); + listoner.sendChatroomMessage(username + " has timed out " + MAX_SKIPS + " times and has been resigned from the game."); listoner.resignPlayer(username); } else { - listoner.sendChatroomMessage(username+" has timed out on their turn"); + listoner.sendChatroomMessage(username + " has timed out on their turn"); doBasicGo(username); } } @@ -58,7 +58,7 @@ private Collection<LobbySession> usernameToLobbySessionArray(String username) { List<LobbySession> sessions = new ArrayList(); - for (LobbySession session:spectators) { + for (LobbySession session : spectators) { if (username.equals(session.getUsername())) { sessions.add(session); } @@ -67,7 +67,7 @@ } public final void sendStringToClient(String a, String username) { - listoner.messageFromGame(a, usernameToLobbySessionArray(username) ); + listoner.messageFromGame(a, usernameToLobbySessionArray(username)); } public final void sendStringToAllClient(String a) { @@ -75,11 +75,11 @@ } public final void sendObjectToClient(Serializable a,String username) { - listoner.messageFromGame( serializableToByteArray(a) , usernameToLobbySessionArray(username) ); + listoner.messageFromGame(serializableToByteArray(a), usernameToLobbySessionArray(username)); } public final void sendObjectToAllClient(Serializable a) { - listoner.messageFromGame( serializableToByteArray(a), spectators ); + listoner.messageFromGame(serializableToByteArray(a), spectators); } private static byte[] serializableToByteArray(Serializable a) { @@ -107,13 +107,14 @@ skips.put(username, 0); // if someone does something reset skips counter stringFromPlayer(username, (String) obj); } - + + // TODO should be synchronized with something? @Override public final void midgamePlayerLogin(String oldser, String newuser) { renamePlayer(oldser, newuser); Integer skip = skips.remove(oldser); - if (skip!=null) { + if (skip != null) { skips.put(newuser, skip); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |