Merge remote-tracking branch 'origin/development' into development

This commit is contained in:
Daniel Grigencha
2024-11-26 18:12:32 +01:00
24 changed files with 309 additions and 271 deletions

View File

@@ -1,16 +1,9 @@
package pp.mdga.client;
import pp.mdga.client.ceremonyState.CeremonyStateMachine;
public class Ceremony extends ClientState {
private final CeremonyStateMachine ceremonyStateMachine;
public Ceremony(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
this.ceremonyStateMachine = new CeremonyStateMachine(parent, logic);
}
public CeremonyStateMachine getCeremonyStateMachine() {
return ceremonyStateMachine;
}
}

View File

@@ -1,24 +0,0 @@
package pp.mdga.client;
public class ClientAutomaton extends ClientStateMachine {
private Dialogs dialogs;
private Ceremony ceremony;
private Game game;
private Interrupt interrupt;
public ClientAutomaton(ClientGameLogic logic){
super(null, logic);
dialogs = new Dialogs(this, logic);
ceremony = new Ceremony(this, logic);
game = new Game(this, logic);
entry();
}
@Override
public Dialogs initialState(){
return dialogs;
}
}

View File

@@ -1,21 +1,27 @@
package pp.mdga.client;
import pp.mdga.client.gameState.turnState.choosePieceState.StartPiece;
import pp.mdga.game.BonusCard;
import pp.mdga.game.Color;
import pp.mdga.game.Game;
import pp.mdga.game.Piece;
import pp.mdga.message.client.ClientMessage;
import pp.mdga.message.server.*;
import java.util.Map;
import java.util.UUID;
public class ClientGameLogic implements ServerInterpreter {
static final System.Logger LOGGER = System.getLogger(ClientGameLogic.class.getName());
private Game game;
private final ClientSender clientSender;
private ClientState state;
private Map<UUID, Piece> pieces;
private Map<UUID, BonusCard> cards;
public ClientGameLogic(Game game, ClientSender clientSender) {
this.game = game;
this.clientSender = clientSender;
state = new ClientAutomaton(this);
}
public void send(ClientMessage msg){
@@ -169,4 +175,46 @@ public void received(UpdateTSK msg) {
public void received(WaitPiece msg) {
}
public void selectPiece(UUID pieceId){
//TODO
}
public void selectCard(UUID cardId){
//TODO
}
public void selectTsk(Color color){
//TODO
}
public void selectDice(){
//TODO
}
public void selectName(String name){
//TODO
}
public void selectReady(boolean ready){
//TODO
}
public void selectHost(){
//TODO
}
public void selectLeave(){
//TODO
}
public void selectJoin(){
//TODO
}
public void selectStart(){
//TODO
}
}

View File

@@ -1,6 +1,10 @@
package pp.mdga.client;
public abstract class ClientState implements Observer {
import pp.mdga.message.server.*;
import java.lang.System.Logger.Level;
public abstract class ClientState implements Observer, ServerInterpreter {
protected static final System.Logger LOGGER = System.getLogger(ClientState.class.getName());
protected ClientState parent;
@@ -12,13 +16,9 @@ protected ClientState(ClientState parent, ClientGameLogic logic){
this.logic = logic;
}
public void entry(){/* do nothing */}
public abstract void enter();
public void exit() {/* do nothing*/}
public void gotoState(ClientState newState){
throw new IllegalStateException("not in a statemachine");
}
public abstract void exit();
public ClientState getParent(){
return parent;
@@ -30,4 +30,139 @@ public void update() {/* do nothing */}
public String toString(){
return getClass().getSimpleName();
}
@Override
public void received(ActivePlayer msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(AnyPiece msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(Briefing msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(CeremonyMessage msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(Dice msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(DiceAgain msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(DiceNow msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(EndOfTurn msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(LobbyAccept msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(LobbyDeny msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(LobbyPlayerJoin msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(LobbyPlayerLeave msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(MoveMessage msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(NoTurn msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(PauseGame msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(PlayCard msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(PossibleCard msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(PossiblePiece msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(RankingResponse msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(RankingRollAgain msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(ReconnectBriefing msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(ResumeGame msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(ServerStartGame msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(StartPiece msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(UpdateReady msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(UpdateTSK msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
@Override
public void received(WaitPiece msg) {
LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg);
}
}

View File

@@ -1,44 +0,0 @@
package pp.mdga.client;
public abstract class ClientStateMachine extends ClientState {
private ClientState state;
protected ClientStateMachine(ClientState parent, ClientGameLogic logic){
super(parent, logic);
}
public abstract ClientState initialState();
@Override
public void gotoState(ClientState newState){
LOGGER.log(System.Logger.Level.DEBUG, "{0}: {1} --> {2}", this, state, newState);
enter(newState);
}
@Override
public void entry(){
final ClientState newState = initialState();
LOGGER.log(System.Logger.Level.DEBUG, "{0}: initial state={1}", this, newState);
enter(newState);
}
private void enter(ClientState newState){
if(newState.parent != this)
throw new IllegalArgumentException("Wrong state: " + newState + " belongs to " + newState.parent + " instead of " + this);
state = newState;
state.entry();
}
@Override
public void exit(){state.exit();}
@Override
public String toString(){
return super.toString() + "(in " + state + ")";
}
public ClientState getState(){
return state;
}
}

View File

@@ -1,16 +1,48 @@
package pp.mdga.client;
import pp.mdga.client.dialogState.DialogsStateMachine;
import pp.mdga.client.dialogState.DialogStates;
import pp.mdga.client.dialogState.Lobby;
import pp.mdga.client.dialogState.NetworkDialog;
import pp.mdga.client.dialogState.StartDialog;
public class Dialogs extends ClientState {
private final DialogsStateMachine dialogsStateMachine;
private DialogStates currentState;
private final Lobby lobby = new Lobby(this, logic);
private final NetworkDialog networkDialog = new NetworkDialog(this, logic);
private final StartDialog startDialog = new StartDialog(this, logic);
public Dialogs(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
this.dialogsStateMachine = new DialogsStateMachine(parent, logic);
}
public DialogsStateMachine getDialogsStateMachine() {
return dialogsStateMachine;
@Override
public void exit(){
currentState.exit();
}
@Override
public void enter(){
currentState = startDialog;
}
public void setState(DialogStates newState){
currentState.exit();
currentState = newState;
currentState.enter();
}
public Lobby getLobby() {
return lobby;
}
public NetworkDialog getNetworkDialog() {
return networkDialog;
}
public StartDialog getStartDialog() {
return startDialog;
}
}

View File

@@ -1,16 +1,8 @@
package pp.mdga.client;
import pp.mdga.client.gameState.GameStateMachine;
public class Game extends ClientState {
private final GameStateMachine gameStateMachine;
public Game(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
this.gameStateMachine = new GameStateMachine(parent, logic);
}
public GameStateMachine getGameStateMachine() {
return gameStateMachine;
}
}

View File

@@ -1,16 +1,8 @@
package pp.mdga.client;
import pp.mdga.client.settingsState.SettingsStateMachine;
public class Settings extends ClientState {
private final SettingsStateMachine settingsStateMachine;
public Settings(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
this.settingsStateMachine = new SettingsStateMachine(parent, logic);
}
public SettingsStateMachine getSettingsStateMachine() {
return settingsStateMachine;
}
}

View File

@@ -1,18 +0,0 @@
package pp.mdga.client.ceremonyState;
import pp.mdga.client.ClientGameLogic;
import pp.mdga.client.ClientState;
import pp.mdga.client.ClientStateMachine;
public class CeremonyStateMachine extends ClientStateMachine {
public CeremonyStateMachine(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
}
@Override
public Podium initialState() {
return new Podium(this, logic);
}
}

View File

@@ -1,16 +0,0 @@
package pp.mdga.client.dialogState;
import pp.mdga.client.ClientGameLogic;
import pp.mdga.client.ClientState;
import pp.mdga.client.ClientStateMachine;
public class DialogsStateMachine extends ClientStateMachine {
public DialogsStateMachine(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
}
@Override
public StartDialog initialState() {
return new StartDialog(this, logic);
}
}

View File

@@ -2,9 +2,61 @@
import pp.mdga.client.ClientGameLogic;
import pp.mdga.client.ClientState;
import pp.mdga.client.Dialogs;
public class NetworkDialog extends DialogStates {
private final Dialogs parent;
public NetworkDialog(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
this.parent = (Dialogs) parent;
}
private boolean checkIP(String IP){
String[] parts = IP.split("\\.");
// Step 2: Check if there are exactly 4 parts
if (parts.length != 4) {
return false;
}
// Step 3: Check each part for valid number
for (String part : parts) {
try {
// Step 4: Convert each part into a number
int num = Integer.parseInt(part);
// Step 5: Check whether the number lies in between 0 and 255
if (num < 0 || num > 255) {
return false;
}
} catch (NumberFormatException e) {
// If parsing fails, it's not a valid number
return false;
}
}
// If all checks passed, return true
return true;
}
@Override
public void enter() {
}
@Override
public void exit() {
}
public void selectBack() {
parent.setState(parent.getStartDialog());
}
public void selectJoin(String IP) {
if(checkIP(IP)){
parent.setState(parent.getLobby());
}
}
}

View File

@@ -2,9 +2,36 @@
import pp.mdga.client.ClientGameLogic;
import pp.mdga.client.ClientState;
import pp.mdga.client.Dialogs;
public class StartDialog extends DialogStates {
private final Dialogs parent;
public StartDialog(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
this.parent = (Dialogs) parent;
}
@Override
public void enter() {
}
@Override
public void exit() {
}
public void selectJoin() {
parent.setState(parent.getNetworkDialog());
}
public void selectHost() {
parent.setState(parent.getLobby());
}
public void selectLeave() {
parent.exit();
}
}

View File

@@ -2,17 +2,10 @@
import pp.mdga.client.ClientGameLogic;
import pp.mdga.client.ClientState;
import pp.mdga.client.gameState.determineStartPlayer.DetermineStartPlayerStateMachine;
public class DetermineStartPlayer extends GameStates {
private final DetermineStartPlayerStateMachine determineStartPlayerStateMachine;
public DetermineStartPlayer(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
this.determineStartPlayerStateMachine = new DetermineStartPlayerStateMachine(parent, logic);
}
public DetermineStartPlayerStateMachine getDetermineStartPlayerStateMachine() {
return determineStartPlayerStateMachine;
}
}

View File

@@ -1,16 +0,0 @@
package pp.mdga.client.gameState;
import pp.mdga.client.ClientGameLogic;
import pp.mdga.client.ClientState;
import pp.mdga.client.ClientStateMachine;
public class GameStateMachine extends ClientStateMachine {
public GameStateMachine(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
}
@Override
public ClientState initialState() {
return null;
}
}

View File

@@ -2,17 +2,10 @@
import pp.mdga.client.ClientGameLogic;
import pp.mdga.client.ClientState;
import pp.mdga.client.gameState.turnState.TurnStateMachine;
public class Turn extends GameStates {
private final TurnStateMachine turnStateMachine;
public Turn(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
this.turnStateMachine = new TurnStateMachine(parent, logic);
}
public TurnStateMachine getTurnStateMachine() {
return turnStateMachine;
}
}

View File

@@ -1,17 +0,0 @@
package pp.mdga.client.gameState.determineStartPlayer;
import pp.mdga.client.ClientGameLogic;
import pp.mdga.client.ClientState;
import pp.mdga.client.ClientStateMachine;
import pp.mdga.client.RollRankingDice;
public class DetermineStartPlayerStateMachine extends ClientStateMachine {
public DetermineStartPlayerStateMachine(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
}
@Override
public RollRankingDice initialState() {
return new RollRankingDice(this, logic);
}
}

View File

@@ -2,7 +2,6 @@
import pp.mdga.client.ClientGameLogic;
import pp.mdga.client.ClientState;
import pp.mdga.client.gameState.determineStartPlayer.DetermineStartPlayerStates;
public class RollRankingDice extends DetermineStartPlayerStates {
public RollRankingDice(ClientState parent, ClientGameLogic logic) {

View File

@@ -1,19 +1,11 @@
package pp.mdga.client.gameState.turnState;
import pp.mdga.client.gameState.turnState.choosePieceState.ChoosePieceStateMachine;
import pp.mdga.client.ClientGameLogic;
import pp.mdga.client.ClientState;
public class ChoosePiece extends TurnStates {
private final ChoosePieceStateMachine choosePieceStateMachine;
public ChoosePiece(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
this.choosePieceStateMachine = new ChoosePieceStateMachine(parent, logic);
}
public ChoosePieceStateMachine getChoosePieceStateMachine() {
return choosePieceStateMachine;
}
}

View File

@@ -2,17 +2,10 @@
import pp.mdga.client.ClientGameLogic;
import pp.mdga.client.ClientState;
import pp.mdga.client.gameState.turnState.powerCardState.PowerCardStateMachine;
public class PowerCard extends TurnStates {
private final PowerCardStateMachine powerCardStateMachine;
public PowerCard(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
this.powerCardStateMachine = new PowerCardStateMachine(parent, logic);
}
public PowerCardStateMachine getPowerCardStateMachine() {
return powerCardStateMachine;
}
}

View File

@@ -1,16 +0,0 @@
package pp.mdga.client.gameState.turnState;
import pp.mdga.client.ClientGameLogic;
import pp.mdga.client.ClientState;
import pp.mdga.client.ClientStateMachine;
public class TurnStateMachine extends ClientStateMachine {
public TurnStateMachine(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
}
@Override
public PowerCard initialState() {
return new PowerCard(this, logic);
}
}

View File

@@ -1,16 +0,0 @@
package pp.mdga.client.gameState.turnState.choosePieceState;
import pp.mdga.client.ClientGameLogic;
import pp.mdga.client.ClientState;
import pp.mdga.client.ClientStateMachine;
public class ChoosePieceStateMachine extends ClientStateMachine {
public ChoosePieceStateMachine(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
}
@Override
public NoPiece initialState() {
return new NoPiece(this, logic);
}
}

View File

@@ -1,16 +0,0 @@
package pp.mdga.client.gameState.turnState.powerCardState;
import pp.mdga.client.ClientGameLogic;
import pp.mdga.client.ClientState;
import pp.mdga.client.ClientStateMachine;
public class PowerCardStateMachine extends ClientStateMachine {
public PowerCardStateMachine(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
}
@Override
public ChoosePowerCard initialState() {
return new ChoosePowerCard(this, logic);
}
}

View File

@@ -1,16 +0,0 @@
package pp.mdga.client.settingsState;
import pp.mdga.client.ClientGameLogic;
import pp.mdga.client.ClientState;
import pp.mdga.client.ClientStateMachine;
public class SettingsStateMachine extends ClientStateMachine {
public SettingsStateMachine(ClientState parent, ClientGameLogic logic) {
super(parent, logic);
}
@Override
public ClientState initialState() {
return null;
}
}

View File

@@ -4,10 +4,8 @@
import org.junit.Test;
import pp.mdga.client.*;
import pp.mdga.client.Ceremony;
import pp.mdga.client.ceremonyState.CeremonyStateMachine;
import pp.mdga.client.ceremonyState.Podium;
import pp.mdga.client.ceremonyState.Statistics;
import pp.mdga.client.dialogState.DialogsStateMachine;
import pp.mdga.client.dialogState.Lobby;
import pp.mdga.client.dialogState.NetworkDialog;
import pp.mdga.client.dialogState.StartDialog;
@@ -16,13 +14,11 @@
import pp.mdga.client.gameState.determineStartPlayer.DetermineStartPlayerStateMachine;
import pp.mdga.client.gameState.turnState.*;
import pp.mdga.client.gameState.turnState.powerCardState.ChoosePowerCard;
import pp.mdga.client.gameState.turnState.powerCardState.PowerCardStateMachine;
import pp.mdga.client.gameState.turnState.powerCardState.Shield;
import pp.mdga.client.gameState.turnState.powerCardState.Swap;
import pp.mdga.client.Settings;
import pp.mdga.client.settingsState.AudioSettings;
import pp.mdga.client.settingsState.MainSettings;
import pp.mdga.client.settingsState.SettingsStateMachine;
import pp.mdga.client.settingsState.VideoSettings;
import pp.mdga.game.BonusCard;
import pp.mdga.game.Color;