Merge branch 'development' into 'dev/test'

merge Development into test

See merge request progproj/gruppen-ht24/Gruppe-01!27
This commit was merged in pull request #27.
This commit is contained in:
Benjamin Feyer
2024-12-01 20:56:49 +00:00
73 changed files with 908 additions and 212 deletions

View File

@@ -6,6 +6,10 @@
import pp.mdga.client.animation.AnimationHandler; import pp.mdga.client.animation.AnimationHandler;
import com.jme3.system.AppSettings; import com.jme3.system.AppSettings;
import pp.mdga.client.view.*; import pp.mdga.client.view.*;
import pp.mdga.message.server.ServerInterpreter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/** /**
* Main application class for the MdgaApp game. * Main application class for the MdgaApp game.
@@ -49,6 +53,18 @@ public class MdgaApp extends SimpleApplication {
/** The ceremony view. */ /** The ceremony view. */
private MdgaView ceremonyView; private MdgaView ceremonyView;
/** The client game logic. */
private final ClientGameLogic clientGameLogic;
private ExecutorService executor;
private ServerConnection networkConnection;
private MdgaApp() {
networkConnection = new NetworkSupport(this);
this.clientGameLogic = new ClientGameLogic(networkConnection);
}
/** /**
* Main entry point for the application. * Main entry point for the application.
* Configures settings and starts the application. * Configures settings and starts the application.
@@ -59,8 +75,8 @@ public static void main(String[] args) {
AppSettings settings = new AppSettings(true); AppSettings settings = new AppSettings(true);
settings.setSamples(128); settings.setSamples(128);
settings.setCenterWindow(true); settings.setCenterWindow(true);
settings.setWidth(1920); settings.setWidth(1080);
settings.setHeight(1080); settings.setHeight(720);
settings.setVSync(false); settings.setVSync(false);
MdgaApp app = new MdgaApp(); MdgaApp app = new MdgaApp();
@@ -219,5 +235,22 @@ public NotificationSynchronizer getNotificationSynchronizer() {
public void setup() { public void setup() {
} }
public ClientGameLogic getGameLogic() {
return clientGameLogic;
}
public ExecutorService getExecutor() {
if (this.executor == null) {
this.executor = Executors.newCachedThreadPool();
}
return this.executor;
}
public ServerConnection getNetworkSupport() {
return networkConnection;
}
} }

View File

@@ -1,6 +1,7 @@
package pp.mdga.client; package pp.mdga.client;
import pp.mdga.client.acoustic.MdgaSound; import pp.mdga.client.acoustic.MdgaSound;
import pp.mdga.client.server.MdgaServer;
import pp.mdga.client.view.CeremonyView; import pp.mdga.client.view.CeremonyView;
import pp.mdga.client.view.GameView; import pp.mdga.client.view.GameView;
import pp.mdga.client.view.LobbyView; import pp.mdga.client.view.LobbyView;
@@ -31,7 +32,7 @@ public class ModelSynchronizer {
private int test = 0; private int test = 0;
public void animationEnd() { public void animationEnd() {
app.getGameLogic().selectAnimationEnd();
} }
public void selectSwap(UUID a, UUID b) { public void selectSwap(UUID a, UUID b) {
@@ -82,13 +83,14 @@ public void confirm() {
GameView gameView = (GameView) app.getView(); GameView gameView = (GameView) app.getView();
if(a != null && b != null) { if(a != null && b != null) {
//swap selectPiece(a);
selectPiece(b);
gameView.getBoardHandler().clearSelectable(); gameView.getBoardHandler().clearSelectable();
} else if (a != null) { } else if (a != null) {
//piece selectPiece(a);
gameView.getBoardHandler().clearSelectable(); gameView.getBoardHandler().clearSelectable();
} else if (card != null){ } else if (card != null){
//card selectCard(card);
gameView.getGuiHandler().clearSelectableCards(); gameView.getGuiHandler().clearSelectableCards();
} else { } else {
throw new RuntimeException("nothing to confirm"); throw new RuntimeException("nothing to confirm");
@@ -98,50 +100,33 @@ public void confirm() {
} }
public void selectTsk(Color color) { public void selectTsk(Color color) {
// TODO call from somewhere app.getGameLogic().selectTsk(color);
LOGGER.log(Level.INFO, "selectTsk: {0}", color);
LobbyView view = (LobbyView) app.getView();
view.setTaken(color, true, true, "OwnPlayerName");
testColor = color;
} }
public void unselectTsk() { public void unselectTsk() {
// TODO call from somewhere app.getGameLogic().selectTsk(Color.NONE);
LOGGER.log(Level.INFO, "unselectTsk");
} }
public void rolledDice() { public void rolledDice() {
// TODO call from somewhere app.getGameLogic().selectDice();
LOGGER.log(Level.INFO, "rolledDice");
} }
public void setName(String name) { public void setName(String name) {
// TODO call from somewhere // TODO call from somewhere
LOGGER.log(Level.INFO, "setName: {0}", name); LOGGER.log(Level.INFO, "setName: {0}", name);
app.getGameLogic().selectName(name);
} }
public void setReady(boolean ready) { public void setReady(boolean ready) {
LOGGER.log(Level.INFO, "setReady"); app.getGameLogic().selectReady(ready);
LobbyView view = (LobbyView) app.getView();
view.setReady(testColor, ready);
test++;
if(test > 2) {
test = 0;
enter(MdgaState.GAME);
}
} }
public void setHost(int port) { public void setHost(int port) {
// TODO call from somewhere app.getGameLogic().selectJoin("");
LOGGER.log(Level.INFO, "setHost: {0}", port);
enter(MdgaState.LOBBY);
} }
public void setJoin(String ip, int port) { public void setJoin(String ip, int port) {
// TODO call from somewhere app.getGameLogic().selectJoin(ip);
LOGGER.log(Level.INFO, "setJoin with IP: {0}, Port: {1}", new Object[]{ip, port});
enter(MdgaState.LOBBY);
} }
public void leave() { public void leave() {

View File

@@ -0,0 +1,91 @@
package pp.mdga.client;
import com.jme3.network.*;
import pp.mdga.message.client.ClientMessage;
import pp.mdga.message.server.ServerMessage;
import java.io.IOException;
public class NetworkSupport implements MessageListener<Client>, ClientStateListener, ServerConnection {
private static final System.Logger LOGGER = System.getLogger(NetworkSupport.class.getName());
private final MdgaApp app;
private Client client;
public NetworkSupport(MdgaApp app) {
this.app = app;
}
public MdgaApp getApp() {
return this.app;
}
public boolean isConnected() {
return this.client != null && this.client.isConnected();
}
public void connect() {
if (this.client != null) {
throw new IllegalStateException("trying to join a game again");
} else {
try {
this.initNetwork("localhost", 2345);
} catch (IOException e) {
LOGGER.log(System.Logger.Level.ERROR, "could not connect to server", e);
}
}
}
public void disconnect() {
if (this.client != null) {
this.client.close();
this.client = null;
LOGGER.log(System.Logger.Level.INFO, "client closed");
}
}
public void initNetwork(String host, int port) throws IOException {
if (this.client != null) {
throw new IllegalStateException("trying to join a game again");
} else {
this.client = Network.connectToServer(host, port);
this.client.start();
this.client.addMessageListener(this);
this.client.addClientStateListener(this);
}
}
public void messageReceived(Client client, Message message) {
LOGGER.log(System.Logger.Level.INFO, "message received from server: {0}", new Object[]{message});
if (message instanceof ServerMessage serverMessage) {
this.app.enqueue(() -> serverMessage.accept(this.app.getGameLogic()));
}
}
public void clientConnected(Client client) {
LOGGER.log(System.Logger.Level.INFO, "Client connected: {0}", new Object[]{client});
}
public void clientDisconnected(Client client, ClientStateListener.DisconnectInfo disconnectInfo) {
LOGGER.log(System.Logger.Level.INFO, "Client {0} disconnected: {1}", new Object[]{client, disconnectInfo});
if (this.client != client) {
throw new IllegalArgumentException("parameter value must be client");
} else {
LOGGER.log(System.Logger.Level.INFO, "client still connected: {0}", new Object[]{client.isConnected()});
this.client = null;
this.disconnect();
}
}
@Override
public void send(ClientMessage message) {
LOGGER.log(System.Logger.Level.INFO, "sending {0}", new Object[]{message});
if (this.client == null) {
LOGGER.log(System.Logger.Level.WARNING, "client not connected");
} else {
this.client.send(message);
}
}
}

View File

@@ -24,8 +24,8 @@ public void addTestNotification(Notification n) {
} }
public void update() { public void update() {
//TODO fetch model notifications Notification n = app.getGameLogic().getNotification();
for (Notification n : notifications) { if(n != null) {
switch (app.getState()) { switch (app.getState()) {
case MAIN: case MAIN:
handleMain(n); handleMain(n);
@@ -43,14 +43,13 @@ public void update() {
throw new RuntimeException("no notification expected: " + n.toString()); throw new RuntimeException("no notification expected: " + n.toString());
} }
} }
notifications.clear();
} }
private void handleMain(Notification notification) { private void handleMain(Notification notification) {
if (notification instanceof LobbyDialogNotification) { if (notification instanceof LobbyDialogNotification) {
app.enter(MdgaState.LOBBY); app.enter(MdgaState.LOBBY);
} else { } else {
throw new RuntimeException("notification not expected: " + notification.toString()); throw new RuntimeException("notification not expected: ");
} }
} }
@@ -62,8 +61,8 @@ private void handleLobby(Notification notification) {
lobbyView.setTaken(n.getColor(), true, false, n.getName()); lobbyView.setTaken(n.getColor(), true, false, n.getName());
} else if (notification instanceof TskUnselectNotification n) { } else if (notification instanceof TskUnselectNotification n) {
lobbyView.setTaken(n.getColor(), false, false, null); lobbyView.setTaken(n.getColor(), false, false, null);
//} else if(notification instanceof LobbyReadyNotification lobbyReadyNotification) { } else if(notification instanceof LobbyReadyNotification lobbyReadyNotification) {
//lobbyView.setReady(lobbyReadyNotification.getColor(), lobbyReadyNotification.isReady()): lobbyView.setReady(lobbyReadyNotification.getColor(), lobbyReadyNotification.isReady());
} else if (notification instanceof GameNotification) { } else if (notification instanceof GameNotification) {
app.enter(MdgaState.GAME); app.enter(MdgaState.GAME);
} else { } else {
@@ -165,7 +164,7 @@ private void handleGame(Notification notification) {
} else if (notification instanceof WaitMoveNotification) { } else if (notification instanceof WaitMoveNotification) {
//TODO ??? //TODO ???
} else if (notification instanceof SelectableMoveNotification n) { } else if (notification instanceof SelectableMoveNotification n) {
boardHandler.outlineMove(n.getPieces(), n.getMoveIndexe(), n.getHomeMoves()); boardHandler.outlineMove(n.getPieces(), n.getMoveIndices(), n.getHomeMoves());
} else if (notification instanceof SelectableSwapNotification n) { } else if (notification instanceof SelectableSwapNotification n) {
boardHandler.outlineSwap(n.getOwnPieces(), n.getEnemyPieces()); boardHandler.outlineSwap(n.getOwnPieces(), n.getEnemyPieces());
// } //else if (notification instanceof SelectableShieldNotification n) { // } //else if (notification instanceof SelectableShieldNotification n) {

View File

@@ -317,7 +317,6 @@ public void setTaken(Taken taken, String name) {
} else { } else {
label.setText(name); label.setText(name);
} }
onUnHover(); onUnHover();
} }

View File

@@ -3,6 +3,7 @@
import com.jme3.math.Vector2f; import com.jme3.math.Vector2f;
import com.jme3.scene.Node; import com.jme3.scene.Node;
import pp.mdga.client.MdgaApp; import pp.mdga.client.MdgaApp;
import pp.mdga.client.NetworkSupport;
import pp.mdga.client.button.ButtonLeft; import pp.mdga.client.button.ButtonLeft;
import pp.mdga.client.button.ButtonRight; import pp.mdga.client.button.ButtonRight;
import pp.mdga.client.button.InputButton; import pp.mdga.client.button.InputButton;
@@ -11,7 +12,7 @@
import java.util.prefs.Preferences; import java.util.prefs.Preferences;
public class HostDialog extends Dialog { public class HostDialog extends NetworkDialog {
private InputButton portInput; private InputButton portInput;
private ButtonRight hostButton; private ButtonRight hostButton;
@@ -22,7 +23,7 @@ public class HostDialog extends Dialog {
private Preferences prefs = Preferences.userNodeForPackage(JoinDialog.class); private Preferences prefs = Preferences.userNodeForPackage(JoinDialog.class);
public HostDialog(MdgaApp app, Node node, MainView view) { public HostDialog(MdgaApp app, Node node, MainView view) {
super(app, node); super(app, node, (NetworkSupport) app.getNetworkSupport());
this.view = view; this.view = view;
@@ -58,6 +59,7 @@ public void update() {
public String getPort() { public String getPort() {
prefs.put("hostPort", portInput.getString()); prefs.put("hostPort", portInput.getString());
setPortNumber(Integer.parseInt(portInput.getString()));
return portInput.getString(); return portInput.getString();
} }
@@ -65,4 +67,13 @@ public void resetPort() {
portInput.reset(); portInput.reset();
prefs.put("hostPort", "11111"); prefs.put("hostPort", "11111");
} }
public void hostServer() {
startServer();
}
public void connectServerAsClient() {
connectServer();
}
} }

View File

@@ -3,6 +3,7 @@
import com.jme3.math.Vector2f; import com.jme3.math.Vector2f;
import com.jme3.scene.Node; import com.jme3.scene.Node;
import pp.mdga.client.MdgaApp; import pp.mdga.client.MdgaApp;
import pp.mdga.client.NetworkSupport;
import pp.mdga.client.acoustic.AcousticHandler; import pp.mdga.client.acoustic.AcousticHandler;
import pp.mdga.client.button.ButtonLeft; import pp.mdga.client.button.ButtonLeft;
import pp.mdga.client.button.ButtonRight; import pp.mdga.client.button.ButtonRight;
@@ -12,7 +13,7 @@
import java.util.prefs.Preferences; import java.util.prefs.Preferences;
public class JoinDialog extends Dialog { public class JoinDialog extends NetworkDialog {
private InputButton ipInput; private InputButton ipInput;
private InputButton portInput; private InputButton portInput;
@@ -24,7 +25,7 @@ public class JoinDialog extends Dialog {
private Preferences prefs = Preferences.userNodeForPackage(JoinDialog.class); private Preferences prefs = Preferences.userNodeForPackage(JoinDialog.class);
public JoinDialog(MdgaApp app, Node node, MainView view) { public JoinDialog(MdgaApp app, Node node, MainView view) {
super(app, node); super(app, node, (NetworkSupport) app.getNetworkSupport());
this.view = view; this.view = view;
@@ -68,6 +69,7 @@ public void update() {
public String getIpt() { public String getIpt() {
prefs.put("joinIp", ipInput.getString()); prefs.put("joinIp", ipInput.getString());
setHostname(ipInput.getString());
return ipInput.getString(); return ipInput.getString();
} }
@@ -78,6 +80,7 @@ public void resetIp() {
public String getPort() { public String getPort() {
prefs.put("joinPort", portInput.getString()); prefs.put("joinPort", portInput.getString());
setPortNumber(Integer.parseInt(portInput.getString()));
return portInput.getString(); return portInput.getString();
} }
@@ -85,4 +88,8 @@ public void resetPort() {
portInput.reset(); portInput.reset();
prefs.put("joinPort", "11111"); prefs.put("joinPort", "11111");
} }
public void connectToServer() {
connectServer();
}
} }

View File

@@ -0,0 +1,73 @@
package pp.mdga.client.dialog;
import com.jme3.scene.Node;
import pp.mdga.client.MdgaApp;
import pp.mdga.client.NetworkSupport;
import pp.mdga.client.server.MdgaServer;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
public abstract class NetworkDialog extends Dialog {
private NetworkSupport network;
private String hostname;
private int portNumber;
private Future<Object> connectionFuture;
public NetworkDialog(MdgaApp app, Node node, NetworkSupport network) {
super(app, node);
this.network = network;
}
public void setHostname(String hostname) {
this.hostname = hostname;
}
public void setPortNumber(int portNumber) {
this.portNumber = portNumber;
}
protected Object initNetwork() {
try {
this.network.initNetwork(this.hostname, this.portNumber);
return null;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
protected void connectServer() {
try {
connectionFuture = this.network.getApp().getExecutor().submit(this::initNetwork);
} catch (NumberFormatException var2) {
throw new NumberFormatException("Port must be a number");
}
}
protected void startServer() {
(new Thread(() -> {
try {
MdgaServer mdgaServer = new MdgaServer(portNumber);
mdgaServer.run();
} catch (Exception e) {
throw new RuntimeException(e);
}
})).start();
}
public void update(float delta) {
if (this.connectionFuture != null && this.connectionFuture.isDone()) {
try {
this.connectionFuture.get();
} catch (ExecutionException ignored) {
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}

View File

@@ -7,6 +7,7 @@
import com.jme3.texture.Texture2D; import com.jme3.texture.Texture2D;
import pp.mdga.client.MdgaApp; import pp.mdga.client.MdgaApp;
import pp.mdga.game.Color; import pp.mdga.game.Color;
import pp.mdga.game.BonusCard;
import java.util.List; import java.util.List;
@@ -70,7 +71,7 @@ public void hideDice() {
cardLayerHandler.hideDice(); cardLayerHandler.hideDice();
} }
public void addCard(pp.mdga.game.BonusCard card) { public void addCard(BonusCard card) {
cardLayerHandler.addCard(card); cardLayerHandler.addCard(card);
} }
@@ -78,7 +79,7 @@ public void clearSelectableCards() {
cardLayerHandler.clearSelectableCards(); cardLayerHandler.clearSelectableCards();
} }
public void setSelectableCards(List<pp.mdga.game.BonusCard> select) { public void setSelectableCards(List<BonusCard> select) {
cardLayerHandler.setSelectableCards(select); cardLayerHandler.setSelectableCards(select);
} }

View File

@@ -4,6 +4,7 @@
import com.jme3.network.serializing.Serializer; import com.jme3.network.serializing.Serializer;
import pp.mdga.game.Game; import pp.mdga.game.Game;
import pp.mdga.game.Player; import pp.mdga.game.Player;
import pp.mdga.game.Statistic;
import pp.mdga.message.client.*; import pp.mdga.message.client.*;
import pp.mdga.message.server.*; import pp.mdga.message.server.*;
import pp.mdga.server.ServerGameLogic; import pp.mdga.server.ServerGameLogic;
@@ -13,8 +14,8 @@
import java.io.IOException; import java.io.IOException;
import java.lang.System.Logger; import java.lang.System.Logger;
import java.lang.System.Logger.Level; import java.lang.System.Logger.Level;
import java.sql.Connection;
import java.util.Map; import java.util.Map;
import java.util.UUID;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.LogManager; import java.util.logging.LogManager;
@@ -51,7 +52,6 @@ public MdgaServer(int port) {
LOGGER.log(Level.INFO, "Creating MdgaServer"); //NON-NLS LOGGER.log(Level.INFO, "Creating MdgaServer"); //NON-NLS
logic = new ServerGameLogic(this, new Game()); logic = new ServerGameLogic(this, new Game());
} }
/** /**
* *
*/ */
@@ -89,6 +89,7 @@ private void processNextMessage() {
} }
private void initializeSerializables() { private void initializeSerializables() {
Serializer.registerClass(UUID.class, new UUIDSerializer());
Serializer.registerClass(AnimationEndMessage.class); Serializer.registerClass(AnimationEndMessage.class);
Serializer.registerClass(ClientStartGameMessage.class); Serializer.registerClass(ClientStartGameMessage.class);
Serializer.registerClass(DeselectTSKMessage.class); Serializer.registerClass(DeselectTSKMessage.class);
@@ -106,7 +107,6 @@ private void initializeSerializables() {
Serializer.registerClass(SelectCardMessage.class); Serializer.registerClass(SelectCardMessage.class);
Serializer.registerClass(SelectedPiecesMessage.class); Serializer.registerClass(SelectedPiecesMessage.class);
Serializer.registerClass(SelectTSKMessage.class); Serializer.registerClass(SelectTSKMessage.class);
Serializer.registerClass(ActivePlayerMessage.class); Serializer.registerClass(ActivePlayerMessage.class);
Serializer.registerClass(AnyPieceMessage.class); Serializer.registerClass(AnyPieceMessage.class);
Serializer.registerClass(BriefingMessage.class); Serializer.registerClass(BriefingMessage.class);
@@ -134,12 +134,15 @@ private void initializeSerializables() {
Serializer.registerClass(UpdateReadyMessage.class); Serializer.registerClass(UpdateReadyMessage.class);
Serializer.registerClass(UpdateTSKMessage.class); Serializer.registerClass(UpdateTSKMessage.class);
Serializer.registerClass(WaitPieceMessage.class); Serializer.registerClass(WaitPieceMessage.class);
Serializer.registerClass(Player.class);
Serializer.registerClass(Statistic.class);
} }
private void registerListeners() { private void registerListeners() {
myServer.addMessageListener(this, AnimationEndMessage.class); myServer.addMessageListener(this, AnimationEndMessage.class);
myServer.addMessageListener(this, ClientStartGameMessage.class); myServer.addMessageListener(this, ClientStartGameMessage.class);
myServer.addMessageListener(this, DeselectTSKMessage.class); myServer.addMessageListener(this, DeselectTSKMessage.class);
myServer.addMessageListener(this, DisconnectedMessage.class);
myServer.addMessageListener(this, ForceContinueGameMessage.class); myServer.addMessageListener(this, ForceContinueGameMessage.class);
myServer.addMessageListener(this, StartGameMessage.class); myServer.addMessageListener(this, StartGameMessage.class);
myServer.addMessageListener(this, JoinedLobbyMessage.class); myServer.addMessageListener(this, JoinedLobbyMessage.class);
@@ -187,7 +190,7 @@ private void messageReceived(HostedConnection source, ClientMessage message) {
@Override @Override
public void connectionAdded(Server server, HostedConnection hostedConnection) { public void connectionAdded(Server server, HostedConnection hostedConnection) {
LOGGER.log(Level.INFO, "new connection {0}", hostedConnection); //NON-NLS LOGGER.log(Level.DEBUG, "new connection {0}", hostedConnection); //NON-NLS
} }
@Override @Override

View File

@@ -0,0 +1,26 @@
package pp.mdga.client.server;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.UUID;
import com.jme3.network.serializing.Serializer;
public class UUIDSerializer extends Serializer
{
@Override
public <T> T readObject(ByteBuffer data, Class<T> c) throws IOException
{
byte[] uuid = new byte[36];
data.get(uuid);
return (T) UUID.fromString(new String(uuid));
}
@Override
public void writeObject(ByteBuffer buffer, Object object) throws IOException
{
UUID uuid = (UUID) object;
buffer.put(uuid.toString().getBytes());
}
}

View File

@@ -7,6 +7,9 @@
import pp.mdga.client.dialog.JoinDialog; import pp.mdga.client.dialog.JoinDialog;
import pp.mdga.client.dialog.StartDialog; import pp.mdga.client.dialog.StartDialog;
import java.net.Inet4Address;
import java.net.UnknownHostException;
public class MainView extends MdgaView { public class MainView extends MdgaView {
private enum SubState { private enum SubState {
HOST, HOST,
@@ -99,12 +102,25 @@ private void tryHost() {
if(port >= 1 && port <= 65535) { if(port >= 1 && port <= 65535) {
app.getModelSynchronize().setName(startDialog.getName()); app.getModelSynchronize().setName(startDialog.getName());
hostDialog.setHostname(Inet4Address.getLocalHost().getHostAddress());
hostDialog.hostServer();
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
}
hostDialog.connectServerAsClient();
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
}
app.getModelSynchronize().setHost(port); app.getModelSynchronize().setHost(port);
//app.getAcousticHandler().playSound(MdgaSound.WRONG_INPUT); //app.getAcousticHandler().playSound(MdgaSound.WRONG_INPUT);
return; return;
} }
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
//nothing //nothing
} catch (UnknownHostException e) {
throw new RuntimeException(e);
} }
hostDialog.resetPort(); hostDialog.resetPort();
@@ -127,6 +143,7 @@ private void tryJoin() {
if (isValidIpAddress(ip)) { if (isValidIpAddress(ip)) {
app.getModelSynchronize().setName(startDialog.getName()); app.getModelSynchronize().setName(startDialog.getName());
app.getModelSynchronize().setJoin(ip, port); app.getModelSynchronize().setJoin(ip, port);
joinDialog.connectToServer();
return; return;
} }
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {

View File

@@ -28,9 +28,10 @@ public class ClientGameLogic implements ServerInterpreter {
private final InterruptState interruptState = new InterruptState(null, this); private final InterruptState interruptState = new InterruptState(null, this);
private final SettingsState settingsState = new SettingsState(null, this); private final SettingsState settingsState = new SettingsState(null, this);
public ClientGameLogic(Game game, ClientSender clientSender) { public ClientGameLogic(ClientSender clientSender) {
this.game = game; this.game = new Game();
this.clientSender = clientSender; this.clientSender = clientSender;
dialogsState.enter();
state = dialogsState; state = dialogsState;
} }
@@ -244,7 +245,11 @@ public void selectName(String name){
} }
public void selectReady(boolean ready){ public void selectReady(boolean ready){
state.selectReady(ready); if(ready){
state.selectReady();
} else {
state.selectUnready();
}
} }
public void selectHost(String name){ public void selectHost(String name){
@@ -304,7 +309,11 @@ public SettingsState getSettings(){
} }
public Notification getNotification(){ public Notification getNotification(){
if(!notifications.isEmpty()){
return notifications.remove(0); return notifications.remove(0);
} else {
return null;
}
} }
public void addNotification(Notification notification){ public void addNotification(Notification notification){

View File

@@ -200,7 +200,7 @@ public void setName(String name) {
LOGGER.log(Level.DEBUG, "Setting name not allowed."); LOGGER.log(Level.DEBUG, "Setting name not allowed.");
} }
public void selectReady(boolean ready) { public void selectReady() {
LOGGER.log(Level.DEBUG, "Selecting ready not allowed."); LOGGER.log(Level.DEBUG, "Selecting ready not allowed.");
} }

View File

@@ -37,7 +37,7 @@ public void enter(){
public void setState(DialogStates newState){ public void setState(DialogStates newState){
currentState.exit(); currentState.exit();
currentState.enter(); newState.enter();
currentState = newState; currentState = newState;
} }
@@ -75,6 +75,11 @@ public void selectLeave(){
currentState.selectLeave(); currentState.selectLeave();
} }
@Override
public void setName(String name){
currentState.setName(name);
}
@Override @Override
public void selectTSK(Color color){ public void selectTSK(Color color){
currentState.selectTSK(color); currentState.selectTSK(color);
@@ -86,8 +91,8 @@ public void deselectTSK(Color color){
} }
@Override @Override
public void selectReady(boolean ready){ public void selectReady(){
currentState.selectReady(ready); currentState.selectReady();
} }
@Override @Override

View File

@@ -8,10 +8,19 @@ public class InterruptState extends ClientState {
private ClientState previousState; private ClientState previousState;
/**
* Creates a new InterruptState
*
* @param parent the parent state
* @param logic the game logic
*/
public InterruptState(ClientState parent, ClientGameLogic logic) { public InterruptState(ClientState parent, ClientGameLogic logic) {
super(parent, logic); super(parent, logic);
} }
/**
* Enters the new state machine
*/
@Override @Override
public void enter() { public void enter() {
previousState = null; previousState = null;

View File

@@ -0,0 +1,9 @@
package pp.mdga.client;
public interface ServerConnection extends ClientSender {
boolean isConnected();
void connect();
void disconnect();
}

View File

@@ -7,26 +7,44 @@
public class SettingsState extends ClientState { public class SettingsState extends ClientState {
/**
* The current state of the settings
*/
private SettingStates currentState; private SettingStates currentState;
private final MainSettingsState mainSettingsState = new MainSettingsState(this, logic); private final MainSettingsState mainSettingsState = new MainSettingsState(this, logic);
private final AudioSettingsState audioSettingsState = new AudioSettingsState(this, logic); private final AudioSettingsState audioSettingsState = new AudioSettingsState(this, logic);
private final VideoSettingsState videoSettingsState = new VideoSettingsState(this, logic); private final VideoSettingsState videoSettingsState = new VideoSettingsState(this, logic);
/**
* Creates a new SettingsState
*
* @param parent the parent state
* @param logic the game logic
*/
public SettingsState(ClientState parent, ClientGameLogic logic) { public SettingsState(ClientState parent, ClientGameLogic logic) {
super(parent, logic); super(parent, logic);
} }
/**
* Enters the current state
*/
@Override @Override
public void enter() { public void enter() {
currentState = mainSettingsState; currentState = mainSettingsState;
} }
/**
* Exits the current state
*/
@Override @Override
public void exit() { public void exit() {
currentState.exit(); currentState.exit();
} }
/**
* Changes the current state
*/
public SettingStates getState(){ public SettingStates getState(){
return currentState; return currentState;
} }

View File

@@ -11,6 +11,7 @@
import pp.mdga.message.server.ServerStartGameMessage; import pp.mdga.message.server.ServerStartGameMessage;
import pp.mdga.message.server.UpdateReadyMessage; import pp.mdga.message.server.UpdateReadyMessage;
import pp.mdga.message.server.UpdateTSKMessage; import pp.mdga.message.server.UpdateTSKMessage;
import pp.mdga.notification.LobbyReadyNotification;
import pp.mdga.notification.TskSelectNotification; import pp.mdga.notification.TskSelectNotification;
import pp.mdga.notification.TskUnselectNotification; import pp.mdga.notification.TskUnselectNotification;
@@ -35,6 +36,7 @@ public void exit() {
@Override @Override
public void selectLeave() { public void selectLeave() {
parent.setState(parent.getStartDialog()); parent.setState(parent.getStartDialog());
logic.send(new LeaveGameMessage());
} }
@Override @Override
@@ -48,7 +50,7 @@ public void deselectTSK(Color color) {
} }
@Override @Override
public void selectReady(boolean ready) { public void selectReady() {
logic.send(new LobbyReadyMessage()); logic.send(new LobbyReadyMessage());
} }
@@ -75,6 +77,7 @@ public void received(ServerStartGameMessage msg){
@Override @Override
public void received(LobbyPlayerJoinedMessage msg){ public void received(LobbyPlayerJoinedMessage msg){
logic.addNotification(new TskSelectNotification(msg.getPlayer().getColor(), msg.getPlayer().getName(), parent.getOwnPlayerId()== msg.getId()));
logic.getGame().getPlayers().put(msg.getId(), msg.getPlayer()); logic.getGame().getPlayers().put(msg.getId(), msg.getPlayer());
} }
@@ -93,6 +96,7 @@ public void received(LobbyPlayerLeaveMessage msg){
@Override @Override
public void received(UpdateReadyMessage msg){ public void received(UpdateReadyMessage msg){
logic.addNotification(new LobbyReadyNotification(logic.getGame().getPlayers().get(msg.getPlayerId()).getColor(), msg.isReady()));
logic.getGame().getPlayers().get(msg.getPlayerId()).setReady(msg.isReady()); logic.getGame().getPlayers().get(msg.getPlayerId()).setReady(msg.isReady());
} }
} }

View File

@@ -3,6 +3,7 @@
import pp.mdga.client.ClientGameLogic; import pp.mdga.client.ClientGameLogic;
import pp.mdga.client.ClientState; import pp.mdga.client.ClientState;
import pp.mdga.client.DialogsState; import pp.mdga.client.DialogsState;
import pp.mdga.notification.LobbyDialogNotification;
public class NetworkDialogState extends DialogStates { public class NetworkDialogState extends DialogStates {
@@ -55,9 +56,7 @@ public void selectLeave() {
} }
public void selectJoin(String IP) { public void selectJoin(String IP) {
if(checkIP(IP)){
parent.setState(parent.getLobby()); parent.setState(parent.getLobby());
} logic.addNotification(new LobbyDialogNotification());
} }
} }

View File

@@ -37,6 +37,12 @@ public void selectHost(String name) {
logic.setHost(true); logic.setHost(true);
} }
@Override
public void setName(String name) {
parent.setState(parent.getNetworkDialog());
parent.setOwnPlayerName(name);
}
@Override @Override
public void selectLeave() { public void selectLeave() {
parent.exit(); parent.exit();

View File

@@ -11,6 +11,8 @@
import pp.mdga.notification.WaitMoveNotification; import pp.mdga.notification.WaitMoveNotification;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class NoPieceState extends ChoosePieceStates { public class NoPieceState extends ChoosePieceStates {
@@ -49,7 +51,13 @@ public void received(WaitPieceMessage msg){
@Override @Override
public void received(StartPieceMessage msg){ public void received(StartPieceMessage msg){
Piece piece = logic.getGame().getPieceThroughUUID(msg.getPieceIdentifier()); Piece piece = logic.getGame().getPieceThroughUUID(msg.getPieceIdentifier());
//TODO: logic.addNotification(null); List<UUID> listPiece = new ArrayList<>();
List<Integer> listIndex = new ArrayList<>();
List<Boolean> homeMove = new ArrayList<>();
listPiece.add(piece.getUuid());
listIndex.add(msg.getTargetIndex());
homeMove.add(false);
logic.addNotification(new SelectableMoveNotification(listPiece, listIndex, homeMove));
parent.setState(parent.getStartPiece()); parent.setState(parent.getStartPiece());
} }

View File

@@ -1,10 +1,13 @@
package pp.mdga.game; package pp.mdga.game;
import com.jme3.network.serializing.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
/** /**
* This class will be used to handle general PlayerData * This class will be used to handle general PlayerData
*/ */
@Serializable
public class Player { public class Player {
/** /**
* The name of the player. * The name of the player.

View File

@@ -1,8 +1,11 @@
package pp.mdga.game; package pp.mdga.game;
import com.jme3.network.serializing.Serializable;
/** /**
* This class will be used to store Statistics during the Game; * This class will be used to store Statistics during the Game;
*/ */
@Serializable
public class Statistic { public class Statistic {
/** /**
* The number of cards played. * The number of cards played.

View File

@@ -18,7 +18,7 @@ public StartGameMessage(boolean forceStartGame){
/** /**
* Constructs a new ForceStartGame message. * Constructs a new ForceStartGame message.
*/ */
public StartGameMessage() { private StartGameMessage() {
super(); super();
forceStartGame = false; forceStartGame = false;
} }

View File

@@ -7,13 +7,20 @@
/** /**
* Notification that is sent when a card is acquired. * Notification that is sent when a card is acquired.
*/ */
public class AcquireCardNotification extends Notification{ public class AcquireCardNotification extends Notification {
/**
* The id of the card that was acquired.
*/
private final UUID cardId;
private UUID cardId; /**
private BonusCard bonusCard; * The bonus card that was acquired.
*/
private final BonusCard bonusCard;
/** /**
* Constructor. * Constructor.
*
* @param cardId The id of the card that was acquired. * @param cardId The id of the card that was acquired.
*/ */
public AcquireCardNotification(BonusCard bonusCard, UUID cardId) { public AcquireCardNotification(BonusCard bonusCard, UUID cardId) {
@@ -23,6 +30,7 @@ public AcquireCardNotification(BonusCard bonusCard, UUID cardId) {
/** /**
* Get the id of the card that was acquired. * Get the id of the card that was acquired.
*
* @return The id of the card that was acquired. * @return The id of the card that was acquired.
*/ */
public UUID getCardId() { public UUID getCardId() {

View File

@@ -6,12 +6,16 @@
* Notification that the active player has changed * Notification that the active player has changed
*/ */
public class ActivePlayerNotification extends Notification { public class ActivePlayerNotification extends Notification {
/** /**
* The color of the active player * The color of the active player
*/ */
private Color color; private final Color color;
/**
* Constructor.
*
* @param color the color of the active player
*/
public ActivePlayerNotification(Color color) { public ActivePlayerNotification(Color color) {
this.color = color; this.color = color;
} }

View File

@@ -7,7 +7,7 @@
/** /**
* Class CeremonyNotification * Class CeremonyNotification
* Represents a notification for a ceremony in the game. * Represents a notification for a ceremony in the game.
* * <p>
* Index mapping: * Index mapping:
* index = 0 ==> winner * index = 0 ==> winner
* index = 1 ==> 2nd * index = 1 ==> 2nd
@@ -16,6 +16,9 @@
* index = 4 ==> total * index = 4 ==> total
*/ */
public class CeremonyNotification extends Notification { public class CeremonyNotification extends Notification {
/**
* Attributes.
*/
private ArrayList<Color> colors; private ArrayList<Color> colors;
private ArrayList<String> names; private ArrayList<String> names;
private ArrayList<Integer> piecesThrown; private ArrayList<Integer> piecesThrown;
@@ -40,8 +43,6 @@ public CeremonyNotification() {
this.bonusNodes = new ArrayList<>(); this.bonusNodes = new ArrayList<>();
} }
// Getters and Setters
/** /**
* @return the list of colors * @return the list of colors
*/ */

View File

@@ -4,7 +4,6 @@
* Notification that the dice is now. * Notification that the dice is now.
*/ */
public class DiceNowNotification extends Notification { public class DiceNowNotification extends Notification {
/** /**
* Constructor. * Constructor.
*/ */

View File

@@ -5,12 +5,15 @@
/** /**
* Notification that is sent when a player has diced. * Notification that is sent when a player has diced.
*/ */
public class DicingNotification extends Notification{ public class DicingNotification extends Notification {
/**
private Color color; * The color of the player that diced.
*/
private final Color color;
/** /**
* Constructor. * Constructor.
*
* @param color The color of the player that diced. * @param color The color of the player that diced.
*/ */
public DicingNotification(Color color) { public DicingNotification(Color color) {
@@ -19,6 +22,7 @@ public DicingNotification(Color color) {
/** /**
* Get the color of the player that diced. * Get the color of the player that diced.
*
* @return The color of the player that diced. * @return The color of the player that diced.
*/ */
public Color getColor() { public Color getColor() {

View File

@@ -7,9 +7,15 @@
* Notification that a card has been drawn * Notification that a card has been drawn
*/ */
public class DrawCardNotification extends Notification { public class DrawCardNotification extends Notification {
/**
* The color of the player who drew the card
*/
private final Color color;
private Color color; /**
private BonusCard card; * The card that was drawn
*/
private final BonusCard card;
/** /**
* @param color the color of the player who drew the card * @param color the color of the player who drew the card

View File

@@ -3,7 +3,7 @@
/** /**
* GameNotification class * GameNotification class
*/ */
public class GameNotification extends Notification{ public class GameNotification extends Notification {
/** /**
* Constructor * Constructor
*/ */

View File

@@ -6,9 +6,15 @@
* Notification that a piece has moved to a home. * Notification that a piece has moved to a home.
*/ */
public class HomeMoveNotification extends Notification { public class HomeMoveNotification extends Notification {
/**
* The unique identifier of the piece.
*/
private final UUID pieceId;
private UUID pieceId; /**
private int homeIndex; * The index of the home position.
*/
private final int homeIndex;
/** /**
* Constructor. * Constructor.

View File

@@ -6,8 +6,10 @@
* Notification that a card has been drawn * Notification that a card has been drawn
*/ */
public class InterruptNotification extends Notification { public class InterruptNotification extends Notification {
/**
private Color color; * The color of the player who disconnected
*/
private final Color color;
/** /**
* @param color the color of the player who disconnected * @param color the color of the player who disconnected

View File

@@ -3,10 +3,5 @@
/** /**
* Notification that a dialog has been started * Notification that a dialog has been started
*/ */
public class LobbyDialogNotification extends Notification{ public class LobbyDialogNotification extends Notification {
/**
* Constructor
*/
public LobbyDialogNotification() {
}
} }

View File

@@ -0,0 +1,43 @@
package pp.mdga.notification;
import pp.mdga.game.Color;
public class LobbyReadyNotification extends Notification{
/**
* The color of the player.
*/
private Color color;
/**
* Indicates if the player is ready.
*/
private boolean ready;
/**
* Constructor
*/
public LobbyReadyNotification(Color color, boolean ready) {
this.color = color;
this.ready = ready;
}
/**
* This method is used to get the color of the player
*
* @return the color of the player
*/
public Color getColor() {
return color;
}
/**
* This method is used to get the ready state of the player
*
* @return the ready state of the player
*/
public boolean isReady() {
return ready;
}
}

View File

@@ -1,14 +1,11 @@
package pp.mdga.notification; package pp.mdga.notification;
import pp.mdga.game.Color;
import java.util.UUID; import java.util.UUID;
/** /**
* Notification that a piece has been moved. * Notification that a piece has been moved.
*/ */
public class MovePieceNotification extends Notification { public class MovePieceNotification extends Notification {
/** /**
* The unique identifier of the piece being moved. * The unique identifier of the piece being moved.
*/ */

View File

@@ -6,8 +6,10 @@
* Notification that a piece has no shield. * Notification that a piece has no shield.
*/ */
public class NoShieldNotification extends Notification{ public class NoShieldNotification extends Notification{
/**
private UUID pieceId; * The id of the piece that has no shield.
*/
private final UUID pieceId;
/** /**
* Constructor. * Constructor.

View File

@@ -1,4 +1,7 @@
package pp.mdga.notification; package pp.mdga.notification;
/**
* Represents a notification that can be sent to a player.
*/
public abstract class Notification { public abstract class Notification {
} }

View File

@@ -7,12 +7,19 @@
* Notification that a card has been played. * Notification that a card has been played.
*/ */
public class PlayCardNotification extends Notification { public class PlayCardNotification extends Notification {
/**
* The color of the player that played the card.
*/
private final Color color;
private Color color; /**
private BonusCard card; * The card that was played.
*/
private final BonusCard card;
/** /**
* Constructor. * Constructor.
*
* @param color the color of the player that played the card. * @param color the color of the player that played the card.
* @param card the card that was played. * @param card the card that was played.
*/ */
@@ -23,6 +30,7 @@ public PlayCardNotification(Color color, BonusCard card) {
/** /**
* Get the color of the player that played the card. * Get the color of the player that played the card.
*
* @return the color of the player that played the card. * @return the color of the player that played the card.
*/ */
public Color getColor() { public Color getColor() {
@@ -31,6 +39,7 @@ public Color getColor() {
/** /**
* Get the card that was played. * Get the card that was played.
*
* @return the card that was played. * @return the card that was played.
*/ */
public BonusCard getCard() { public BonusCard getCard() {

View File

@@ -9,13 +9,24 @@
* Notification that a player is in the game. * Notification that a player is in the game.
*/ */
public class PlayerInGameNotification extends Notification { public class PlayerInGameNotification extends Notification {
/**
* The color of the player that is in the game.
*/
private final Color color;
private Color color; /**
private String name; * The name of the player that is in the game.
private List<UUID> piecesList; */
private final String name;
/**
* The list of piece IDs associated with the player.
*/
private final List<UUID> piecesList;
/** /**
* Constructor. * Constructor.
*
* @param color the color of the player that is in the game. * @param color the color of the player that is in the game.
* @param name the name of the player that is in the game. * @param name the name of the player that is in the game.
*/ */
@@ -27,6 +38,7 @@ public PlayerInGameNotification(Color color, List<UUID> piecesList, String name
/** /**
* Get the color of the player that is in the game. * Get the color of the player that is in the game.
*
* @return the color of the player that is in the game. * @return the color of the player that is in the game.
*/ */
public Color getColor() { public Color getColor() {
@@ -35,12 +47,18 @@ public Color getColor() {
/** /**
* Get the name of the player that is in the game. * Get the name of the player that is in the game.
*
* @return the name of the player that is in the game. * @return the name of the player that is in the game.
*/ */
public String getName() { public String getName() {
return name; return name;
} }
/**
* Get the list of piece IDs associated with the player.
*
* @return the list of piece IDs associated with the player.
*/
public List<UUID> getPiecesList() { public List<UUID> getPiecesList() {
return piecesList; return piecesList;
} }

View File

@@ -6,11 +6,14 @@
* Notification that a player is in the game. * Notification that a player is in the game.
*/ */
public class ResumeNotification extends Notification { public class ResumeNotification extends Notification {
/**
private Color color; * The color of the player that is in the game.
*/
private final Color color;
/** /**
* Constructor. * Constructor.
*
* @param color the color of the player that is in the game. * @param color the color of the player that is in the game.
*/ */
public ResumeNotification(Color color) { public ResumeNotification(Color color) {
@@ -19,6 +22,7 @@ public ResumeNotification(Color color) {
/** /**
* Get the color of the player that is in the game. * Get the color of the player that is in the game.
*
* @return the color of the player that is in the game. * @return the color of the player that is in the game.
*/ */
public Color getColor() { public Color getColor() {

View File

@@ -5,14 +5,25 @@
/** /**
* Notification that a die has been rolled. * Notification that a die has been rolled.
*/ */
public class RollDiceNotification extends Notification{ public class RollDiceNotification extends Notification {
/**
* The color of the player that rolled the die.
*/
private final Color color;
private Color color; /**
private int eyes; * The number of eyes that were rolled.
private int moveNumber; */
private final int eyes;
/**
* The number of the move that was made.
*/
private final int moveNumber;
/** /**
* Constructor. * Constructor.
*
* @param color the color of the player that rolled the die. * @param color the color of the player that rolled the die.
* @param eyes the number of eyes that were rolled. * @param eyes the number of eyes that were rolled.
* @param moveNumber the number of the move that was made. * @param moveNumber the number of the move that was made.
@@ -25,6 +36,7 @@ public RollDiceNotification(Color color, int eyes, int moveNumber) {
/** /**
* Get the color of the player that rolled the die. * Get the color of the player that rolled the die.
*
* @return the color of the player that rolled the die. * @return the color of the player that rolled the die.
*/ */
public Color getColor() { public Color getColor() {
@@ -33,6 +45,7 @@ public Color getColor() {
/** /**
* Get the number of eyes that were rolled. * Get the number of eyes that were rolled.
*
* @return the number of eyes that were rolled. * @return the number of eyes that were rolled.
*/ */
public int getEyes() { public int getEyes() {
@@ -41,6 +54,7 @@ public int getEyes() {
/** /**
* Get the number of the move that was made. * Get the number of the move that was made.
*
* @return the number of the move that was made. * @return the number of the move that was made.
*/ */
public int getMoveNumber() { public int getMoveNumber() {

View File

@@ -7,8 +7,10 @@
* Notification that contains a list of cards that the player can choose from. * Notification that contains a list of cards that the player can choose from.
*/ */
public class SelectableCardsNotification extends Notification { public class SelectableCardsNotification extends Notification {
/**
private List<BonusCard> cards; * The list of cards that the player can choose from.
*/
private final List<BonusCard> cards;
/** /**
* Constructor. * Constructor.

View File

@@ -6,8 +6,7 @@
/** /**
* Notification for selecting pieces and their possible moves. * Notification for selecting pieces and their possible moves.
*/ */
public class SelectableMoveNotification extends Notification{ public class SelectableMoveNotification extends Notification {
/** /**
* List of UUIDs representing the pieces that can be moved based on the dice roll. * List of UUIDs representing the pieces that can be moved based on the dice roll.
*/ */
@@ -16,7 +15,7 @@ public class SelectableMoveNotification extends Notification{
/** /**
* List of integers representing the target nodes the pieces can move to. * List of integers representing the target nodes the pieces can move to.
*/ */
private final List<Integer> moveIndexe; private final List<Integer> moveIndices;
/** /**
* List of booleans indicating whether the corresponding target nodes are in the home area. * List of booleans indicating whether the corresponding target nodes are in the home area.
@@ -28,12 +27,12 @@ public class SelectableMoveNotification extends Notification{
* Constructs a notification for selectable piece moves. * Constructs a notification for selectable piece moves.
* *
* @param pieces the list of pieces that can be moved * @param pieces the list of pieces that can be moved
* @param moveIndexe the list of target nodes for the moves * @param moveIndices the list of target nodes for the moves
* @param homeMoves the list indicating if the target nodes are in the home area * @param homeMoves the list indicating if the target nodes are in the home area
*/ */
public SelectableMoveNotification(List<UUID> pieces, List<Integer> moveIndexe, List<Boolean> homeMoves) { public SelectableMoveNotification(List<UUID> pieces, List<Integer> moveIndices, List<Boolean> homeMoves) {
this.pieces = pieces; this.pieces = pieces;
this.moveIndexe = moveIndexe; this.moveIndices = moveIndices;
this.homeMoves = homeMoves; this.homeMoves = homeMoves;
} }
@@ -51,8 +50,8 @@ public List<UUID> getPieces() {
* *
* @return a list of integers representing the target nodes * @return a list of integers representing the target nodes
*/ */
public List<Integer> getMoveIndexe() { public List<Integer> getMoveIndices() {
return moveIndexe; return moveIndices;
} }
/** /**

View File

@@ -6,8 +6,7 @@
/** /**
* Notification for selecting pieces for swapcard. * Notification for selecting pieces for swapcard.
*/ */
public class SelectableSwapNotification extends Notification{ public class SelectableSwapNotification extends Notification {
/** /**
* List of UUIDs representing the player's own pieces available for selection. * List of UUIDs representing the player's own pieces available for selection.
*/ */

View File

@@ -5,9 +5,11 @@
/** /**
* This class will be used to hold all ShieldActiveNotification relevant data. * This class will be used to hold all ShieldActiveNotification relevant data.
*/ */
public class ShieldActiveNotification extends Notification{ public class ShieldActiveNotification extends Notification {
/**
private UUID pieceId; * The pieceId
*/
private final UUID pieceId;
/** /**
* This constructor is used to create a new ShieldActiveNotification * This constructor is used to create a new ShieldActiveNotification

View File

@@ -6,8 +6,10 @@
* This class will be used to hold all ShieldSuppressedNotification relevant data. * This class will be used to hold all ShieldSuppressedNotification relevant data.
*/ */
public class ShieldSuppressedNotification extends Notification { public class ShieldSuppressedNotification extends Notification {
/**
private UUID pieceId; * The pieceId
*/
private final UUID pieceId;
/** /**
* This constructor is used to create a new ShieldSuppressedNotification * This constructor is used to create a new ShieldSuppressedNotification

View File

@@ -3,10 +3,5 @@
/** /**
* Notification that a dialog has been started * Notification that a dialog has been started
*/ */
public class StartDialogNotification extends Notification{ public class StartDialogNotification extends Notification {
/**
* Constructor
*/
public StartDialogNotification() {
}
} }

View File

@@ -6,23 +6,31 @@
* Notification that two pieces have been swapped. * Notification that two pieces have been swapped.
*/ */
public class SwapPieceNotification extends Notification { public class SwapPieceNotification extends Notification {
/**
* The UUID of the first piece that has been swapped.
*/
private final UUID firstPiece;
private UUID firstPiece; /**
private UUID secondPiece; * The UUID of the second piece that has been swapped.
*/
private final UUID secondPiece;
/** /**
* Constructor. * Constructor.
*
* @param firstPiece the UUID of the first piece that has been swapped. * @param firstPiece the UUID of the first piece that has been swapped.
* @param secondPiece the UUID of the second piece that has been swapped. * @param secondPiece the UUID of the second piece that has been swapped.
*/ */
public SwapPieceNotification(UUID firstPiece, UUID secondPiece) { public SwapPieceNotification(UUID firstPiece, UUID secondPiece) {
assert(!firstPiece.equals(secondPiece)); assert (!firstPiece.equals(secondPiece));
this.firstPiece = firstPiece; this.firstPiece = firstPiece;
this.secondPiece = secondPiece; this.secondPiece = secondPiece;
} }
/** /**
* Get the UUID of the first piece that has been swapped. * Get the UUID of the first piece that has been swapped.
*
* @return the UUID of the first piece that has been swapped. * @return the UUID of the first piece that has been swapped.
*/ */
public UUID getFirstPiece() { public UUID getFirstPiece() {
@@ -31,6 +39,7 @@ public UUID getFirstPiece() {
/** /**
* Get the UUID of the second piece that has been swapped. * Get the UUID of the second piece that has been swapped.
*
* @return the UUID of the second piece that has been swapped. * @return the UUID of the second piece that has been swapped.
*/ */
public UUID getSecondPiece() { public UUID getSecondPiece() {

View File

@@ -1,12 +1,15 @@
package pp.mdga.notification; package pp.mdga.notification;
import pp.mdga.game.Color;
import java.util.UUID; import java.util.UUID;
public class ThrowPieceNotification extends Notification{ /**
* Notification that is sent when a piece is thrown.
private UUID pieceId; */
public class ThrowPieceNotification extends Notification {
/**
* The id of the piece that was thrown.
*/
private final UUID pieceId;
/** /**
* This constructor is used to create a new ThrowPieceNotification * This constructor is used to create a new ThrowPieceNotification
@@ -15,6 +18,11 @@ public ThrowPieceNotification(UUID pieceId) {
this.pieceId = pieceId; this.pieceId = pieceId;
} }
/**
* Get the id of the piece that was thrown.
*
* @return The id of the piece that was thrown.
*/
public UUID getPieceId() { public UUID getPieceId() {
return pieceId; return pieceId;
} }

View File

@@ -5,14 +5,25 @@
/** /**
* Class TskSelectNotification * Class TskSelectNotification
*/ */
public class TskSelectNotification extends Notification{ public class TskSelectNotification extends Notification {
/**
* The color of the player that is in the game.
*/
private final Color color; private final Color color;
/**
* The name of the player that is in the game.
*/
private final String name; private final String name;
/**
* Indicates if the select notification affects the own user.
*/
private final boolean isSelf; private final boolean isSelf;
/** /**
* Constructor. * Constructor.
*
* @param color the color of the player that is in the game. * @param color the color of the player that is in the game.
* @param name the name of the player that is in the game. * @param name the name of the player that is in the game.
*/ */
@@ -24,6 +35,7 @@ public TskSelectNotification(Color color, String name, boolean isSelf) {
/** /**
* Get the color of the player that is in the game. * Get the color of the player that is in the game.
*
* @return the color of the player that is in the game. * @return the color of the player that is in the game.
*/ */
public Color getColor() { public Color getColor() {
@@ -32,6 +44,7 @@ public Color getColor() {
/** /**
* Get the name of the player that is in the game. * Get the name of the player that is in the game.
*
* @return the name of the player that is in the game. * @return the name of the player that is in the game.
*/ */
public String getName() { public String getName() {

View File

@@ -2,20 +2,27 @@
import pp.mdga.game.Color; import pp.mdga.game.Color;
public class TskUnselectNotification extends Notification{ /**
* Notification for unselecting a player
private Color color; */
public class TskUnselectNotification extends Notification {
/**
* The color of the player
*/
private final Color color;
/** /**
* Constructor * Constructor
* @param color *
* @param color the color of the player
*/ */
public TskUnselectNotification(Color color){ public TskUnselectNotification(Color color) {
this.color = color; this.color = color;
} }
/** /**
* Get the color * Get the color
*
* @return color * @return color
*/ */
public Color getColor() { public Color getColor() {

View File

@@ -5,12 +5,15 @@
/** /**
* Notification to inform the player that he has to wait for the other player to move. * Notification to inform the player that he has to wait for the other player to move.
*/ */
public class WaitMoveNotification extends Notification{ public class WaitMoveNotification extends Notification {
/**
private UUID pieceId; * The id of the piece that has to move.
*/
private final UUID pieceId;
/** /**
* Constructor. * Constructor.
*
* @param pieceId the id of the piece that has to move. * @param pieceId the id of the piece that has to move.
*/ */
public WaitMoveNotification(UUID pieceId) { public WaitMoveNotification(UUID pieceId) {
@@ -19,6 +22,7 @@ public WaitMoveNotification(UUID pieceId) {
/** /**
* Get the id of the piece that has to move. * Get the id of the piece that has to move.
*
* @return the id of the piece that has to move. * @return the id of the piece that has to move.
*/ */
public UUID getPieceId() { public UUID getPieceId() {

View File

@@ -25,10 +25,10 @@ public class ServerGameLogic implements ClientInterpreter {
* States * States
*/ */
private ServerState currentState; private ServerState currentState;
private final ServerState lobbyState; private final LobbyState lobbyState;
private final ServerState gameState; private final GameState gameState;
private final ServerState interruptState; private final InterruptState interruptState;
private final ServerState ceremonyState; private final CeremonyState ceremonyState;
/** /**
* Constructor. * Constructor.
@@ -167,36 +167,36 @@ public ServerState getCurrentState() {
/** /**
* This method will be used to return lobbyState attribute of ServerGameLogic class. * This method will be used to return lobbyState attribute of ServerGameLogic class.
* *
* @return lobbyState as a ServerState object. * @return lobbyState as a LobbyState object.
*/ */
public ServerState getLobbyState() { public LobbyState getLobbyState() {
return this.lobbyState; return this.lobbyState;
} }
/** /**
* This method will be used to return gameState attribute of ServerGameLogic class. * This method will be used to return gameState attribute of ServerGameLogic class.
* *
* @return gameState as a ServerState object. * @return gameState as a GameState object.
*/ */
public ServerState getGameState() { public GameState getGameState() {
return this.gameState; return this.gameState;
} }
/** /**
* This method will be used to return interruptState attribute of ServerGameLogic class. * This method will be used to return interruptState attribute of ServerGameLogic class.
* *
* @return interruptState as a ServerState object. * @return interruptState as a InterruptState object.
*/ */
public ServerState getInterruptState() { public InterruptState getInterruptState() {
return this.interruptState; return this.interruptState;
} }
/** /**
* This method will be used to return ceremonyState attribute of ServerGameLogic class. * This method will be used to return ceremonyState attribute of ServerGameLogic class.
* *
* @return ceremonyState as a ServerState object. * @return ceremonyState as a CeremonyState object.
*/ */
public ServerState getCeremonyState() { public CeremonyState getCeremonyState() {
return this.ceremonyState; return this.ceremonyState;
} }

View File

@@ -2,8 +2,23 @@
import pp.mdga.server.ServerGameLogic; import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.GameState; import pp.mdga.server.automaton.GameState;
import pp.mdga.server.automaton.game.turn.*;
/**
* This class represents the turn state of the server state automaton.
* It will also be used as the turn automaton.
*/
public class TurnState extends GameAutomatonState { public class TurnState extends GameAutomatonState {
/**
* Create TurnState states.
*/
private TurnAutomatonState currentState;
private final PowerCardState powerCardState;
private final PlayPowerCardState playPowerCardState;
private final RollDiceState rollDiceState;
private final ChoosePieceState choosePieceState;
private final MovePieceState movePieceState;
/** /**
* Constructs a server state of the specified game logic. * Constructs a server state of the specified game logic.
* *
@@ -12,6 +27,11 @@ public class TurnState extends GameAutomatonState {
*/ */
public TurnState(GameState gameAutomaton, ServerGameLogic logic) { public TurnState(GameState gameAutomaton, ServerGameLogic logic) {
super(gameAutomaton, logic); super(gameAutomaton, logic);
this.powerCardState = new PowerCardState(this, logic);
this.playPowerCardState = new PlayPowerCardState(this, logic);
this.rollDiceState = new RollDiceState(this, logic);
this.choosePieceState = new ChoosePieceState(this, logic);
this.movePieceState = new MovePieceState(this, logic);
} }
@Override @Override
@@ -23,4 +43,72 @@ public void enter() {
public void exit() { public void exit() {
} }
/**
* This method will be used to return currentState attribute of TurnState class.
*
* @return currentState as a TurnAutomatonState object.
*/
public TurnAutomatonState getCurrentState() {
return this.currentState;
}
/**
* This method will be used to return powerCardState attribute of TurnState class.
*
* @return powerCardState as a PowerCardState object.
*/
public PowerCardState getPowerCardState() {
return this.powerCardState;
}
/**
* This method will be used to return playPowerCardState attribute of TurnState class.
*
* @return playPowerState as a PlayPowerCardState object.
*/
public PlayPowerCardState getPlayPowerCardState() {
return this.playPowerCardState;
}
/**
* This method will be used to return rollDiceState attribute of TurnState class.
*
* @return rollDiceState as a RollDiceState object.
*/
public RollDiceState getRollDiceState() {
return this.rollDiceState;
}
/**
* This method will be used to return choosePieceState attribute of TurnState class.
*
* @return choosePieceState as a ChoosePieceState object.
*/
public ChoosePieceState getChoosePieceState() {
return this.choosePieceState;
}
/**
* This method will be used to return movePieceState attribute of TurnState class.
*
* @return movePieceState as a MovePieceState object.
*/
public MovePieceState getMovePieceState() {
return this.movePieceState;
}
/**
* This method will be used to set currentState attribute of TurnState class to the given state parameter.
* In Addition, the currentState will be exited, changed and entered.
*
* @param state as the new currentState attribute as a TurnAutomatonState object.
*/
public void setCurrentState(TurnAutomatonState state) {
if (this.currentState != null) {
this.currentState.exit();
}
this.currentState = state;
this.currentState.enter();
}
} }

View File

@@ -3,8 +3,24 @@
import pp.mdga.server.ServerGameLogic; import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.TurnState; import pp.mdga.server.automaton.game.TurnState;
public class ChoosePieceState extends TurnState { public class ChoosePieceState extends TurnAutomatonState {
public ChoosePieceState(ServerGameLogic logic) { /**
super(logic); * Constructs a server state of the specified game logic.
*
* @param turnAutomaton as the automaton of the turn state as a GameState object.
* @param logic the game logic
*/
public ChoosePieceState(TurnState turnAutomaton, ServerGameLogic logic) {
super(turnAutomaton, logic);
}
@Override
public void enter() {
}
@Override
public void exit() {
} }
} }

View File

@@ -3,8 +3,25 @@
import pp.mdga.server.ServerGameLogic; import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.TurnState; import pp.mdga.server.automaton.game.TurnState;
public class MovePieceState extends TurnState { public class MovePieceState extends TurnAutomatonState {
public MovePieceState(ServerGameLogic logic) {
super(logic); /**
* Constructs a server state of the specified game logic.
*
* @param turnAutomaton as the automaton of the turn state as a GameState object.
* @param logic the game logic
*/
public MovePieceState(TurnState turnAutomaton, ServerGameLogic logic) {
super(turnAutomaton, logic);
}
@Override
public void enter() {
}
@Override
public void exit() {
} }
} }

View File

@@ -0,0 +1,26 @@
package pp.mdga.server.automaton.game.turn;
import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.TurnState;
public class PlayPowerCardState extends TurnAutomatonState {
/**
* Constructs a server state of the specified game logic.
*
* @param turnAutomaton as the automaton of the turn state as a GameState object.
* @param logic the game logic
*/
public PlayPowerCardState(TurnState turnAutomaton, ServerGameLogic logic) {
super(turnAutomaton, logic);
}
@Override
public void enter() {
}
@Override
public void exit() {
}
}

View File

@@ -3,8 +3,24 @@
import pp.mdga.server.ServerGameLogic; import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.TurnState; import pp.mdga.server.automaton.game.TurnState;
public class PowerCardState extends TurnState { public class PowerCardState extends TurnAutomatonState {
public PowerCardState(ServerGameLogic logic) { /**
super(logic); * Constructs a server state of the specified game logic.
*
* @param turnAutomaton as the automaton of the turn state as a GameState object.
* @param logic the game logic
*/
public PowerCardState(TurnState turnAutomaton, ServerGameLogic logic) {
super(turnAutomaton, logic);
}
@Override
public void enter() {
}
@Override
public void exit() {
} }
} }

View File

@@ -3,8 +3,24 @@
import pp.mdga.server.ServerGameLogic; import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.TurnState; import pp.mdga.server.automaton.game.TurnState;
public class RollDiceState extends TurnState { public class RollDiceState extends TurnAutomatonState {
public RollDiceState(ServerGameLogic logic) { /**
super(logic); * Constructs a server state of the specified game logic.
*
* @param turnAutomaton as the automaton of the turn state as a GameState object.
* @param logic the game logic
*/
public RollDiceState(TurnState turnAutomaton, ServerGameLogic logic) {
super(turnAutomaton, logic);
}
@Override
public void enter() {
}
@Override
public void exit() {
} }
} }

View File

@@ -0,0 +1,23 @@
package pp.mdga.server.automaton.game.turn;
import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.ServerState;
import pp.mdga.server.automaton.game.TurnState;
public abstract class TurnAutomatonState extends ServerState {
/**
* Create TurnAutomatonState attributes.
*/
protected final TurnState turnAutomaton;
/**
* Constructs a server state of the specified game logic.
*
* @param turnAutomaton as the automaton of the turn state as a GameState object.
* @param logic the game logic
*/
public TurnAutomatonState(TurnState turnAutomaton, ServerGameLogic logic) {
super(logic);
this.turnAutomaton = turnAutomaton;
}
}

View File

@@ -0,0 +1,22 @@
package pp.mdga.server.automaton.game.turn.choosepiece;
import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.ServerState;
import pp.mdga.server.automaton.game.turn.ChoosePieceState;
public abstract class ChoosePieceAutomatonState extends ServerState {
/**
* Create ChoosePieceAutomatonState attributes.
*/
protected final ChoosePieceState choosePieceAutomaton;
/**
* Constructs a server state of the specified game logic.
*
* @param logic the game logic
*/
public ChoosePieceAutomatonState(ChoosePieceState choosePieceAutomaton, ServerGameLogic logic) {
super(logic);
this.choosePieceAutomaton = choosePieceAutomaton;
}
}

View File

@@ -3,8 +3,5 @@
import pp.mdga.server.ServerGameLogic; import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.turn.ChoosePieceState; import pp.mdga.server.automaton.game.turn.ChoosePieceState;
public class NoPieceState extends ChoosePieceState { public class NoPieceState {
public NoPieceState(ServerGameLogic logic) {
super(logic);
}
} }

View File

@@ -3,8 +3,5 @@
import pp.mdga.server.ServerGameLogic; import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.turn.ChoosePieceState; import pp.mdga.server.automaton.game.turn.ChoosePieceState;
public class NoTurnState extends ChoosePieceState { public class NoTurnState {
public NoTurnState(ServerGameLogic logic) {
super(logic);
}
} }

View File

@@ -3,8 +3,6 @@
import pp.mdga.server.ServerGameLogic; import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.turn.ChoosePieceState; import pp.mdga.server.automaton.game.turn.ChoosePieceState;
public class SelectPieceState extends ChoosePieceState { public class SelectPieceState {
public SelectPieceState(ServerGameLogic logic) {
super(logic);
}
} }

View File

@@ -3,8 +3,5 @@
import pp.mdga.server.ServerGameLogic; import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.turn.ChoosePieceState; import pp.mdga.server.automaton.game.turn.ChoosePieceState;
public class StartPieceState extends ChoosePieceState { public class StartPieceState {
public StartPieceState(ServerGameLogic logic) {
super(logic);
}
} }

View File

@@ -3,8 +3,5 @@
import pp.mdga.server.ServerGameLogic; import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.turn.ChoosePieceState; import pp.mdga.server.automaton.game.turn.ChoosePieceState;
public class WaitingPieceState extends ChoosePieceState { public class WaitingPieceState {
public WaitingPieceState(ServerGameLogic logic) {
super(logic);
}
} }

View File

@@ -3,8 +3,5 @@
import pp.mdga.server.ServerGameLogic; import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.turn.RollDiceState; import pp.mdga.server.automaton.game.turn.RollDiceState;
public class FirstRollStateState extends RollDiceState { public class FirstRollStateState {
public FirstRollStateState(ServerGameLogic logic) {
super(logic);
}
} }

View File

@@ -0,0 +1,22 @@
package pp.mdga.server.automaton.game.turn.rolldice;
import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.ServerState;
import pp.mdga.server.automaton.game.turn.RollDiceState;
public abstract class RollDiceAutomatonState extends ServerState {
/**
* Create RollDiceAutomatonState attributes.
*/
protected final RollDiceState rollDiceAutomaton;
/**
* Constructs a server state of the specified game logic.
*
* @param logic the game logic
*/
public RollDiceAutomatonState(RollDiceState rollDiceAutomaton, ServerGameLogic logic) {
super(logic);
this.rollDiceAutomaton = rollDiceAutomaton;
}
}

View File

@@ -3,8 +3,5 @@
import pp.mdga.server.ServerGameLogic; import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.turn.RollDiceState; import pp.mdga.server.automaton.game.turn.RollDiceState;
public class SecondRollState extends RollDiceState { public class SecondRollState {
public SecondRollState(ServerGameLogic logic) {
super(logic);
}
} }

View File

@@ -3,8 +3,5 @@
import pp.mdga.server.ServerGameLogic; import pp.mdga.server.ServerGameLogic;
import pp.mdga.server.automaton.game.turn.RollDiceState; import pp.mdga.server.automaton.game.turn.RollDiceState;
public class ThirdRollState extends RollDiceState { public class ThirdRollState {
public ThirdRollState(ServerGameLogic logic) {
super(logic);
}
} }