Merge branch 'dev/model' into dev/client_koppe2
This commit is contained in:
		@@ -1,5 +1,6 @@
 | 
			
		||||
<component name="ProjectRunConfigurationManager">
 | 
			
		||||
  <configuration default="false" name="MdgaApp" type="Application" factoryName="Application" singleton="false" nameIsGenerated="true">
 | 
			
		||||
    <option name="ALTERNATIVE_JRE_PATH" value="temurin-20" />
 | 
			
		||||
    <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
 | 
			
		||||
    <option name="MAIN_CLASS_NAME" value="pp.mdga.client.MdgaApp" />
 | 
			
		||||
    <module name="Projekte.mdga.client.main" />
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@
 | 
			
		||||
import com.jme3.network.serializing.serializers.EnumSerializer;
 | 
			
		||||
import pp.mdga.Resources;
 | 
			
		||||
import pp.mdga.game.*;
 | 
			
		||||
import pp.mdga.game.card.*;
 | 
			
		||||
import pp.mdga.message.client.*;
 | 
			
		||||
import pp.mdga.message.server.*;
 | 
			
		||||
import pp.mdga.server.ServerGameLogic;
 | 
			
		||||
@@ -124,7 +125,7 @@ private void initializeSerializables() {
 | 
			
		||||
        Serializer.registerClass(NoTurnMessage.class);
 | 
			
		||||
        Serializer.registerClass(PauseGameMessage.class);
 | 
			
		||||
        Serializer.registerClass(PlayCardMessage.class);
 | 
			
		||||
        Serializer.registerClass(PossibleCardMessage.class);
 | 
			
		||||
        Serializer.registerClass(PossibleCardsMessage.class);
 | 
			
		||||
        Serializer.registerClass(PossiblePieceMessage.class);
 | 
			
		||||
        Serializer.registerClass(RankingResponseMessage.class);
 | 
			
		||||
        Serializer.registerClass(RankingRollAgainMessage.class);
 | 
			
		||||
@@ -145,10 +146,16 @@ private void initializeSerializables() {
 | 
			
		||||
        Serializer.registerClass(BonusNode.class);
 | 
			
		||||
        Serializer.registerClass(StartNode.class);
 | 
			
		||||
        Serializer.registerClass(HomeNode.class);
 | 
			
		||||
        Serializer.registerClass(PowerCard.class);
 | 
			
		||||
        Serializer.registerClass(TurboCard.class);
 | 
			
		||||
        Serializer.registerClass(SwapCard.class);
 | 
			
		||||
        Serializer.registerClass(ShieldCard.class);
 | 
			
		||||
        Serializer.registerClass(HiddenCard.class);
 | 
			
		||||
 | 
			
		||||
        Serializer.registerClass(Color.class, new EnumSerializer());
 | 
			
		||||
        Serializer.registerClass(PieceState.class, new EnumSerializer());
 | 
			
		||||
        Serializer.registerClass(ShieldState.class, new EnumSerializer());
 | 
			
		||||
        Serializer.registerClass(BonusCard.class, new EnumSerializer());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void registerListeners() {
 | 
			
		||||
 
 | 
			
		||||
@@ -330,7 +330,7 @@ public void received(PlayCardMessage msg) {
 | 
			
		||||
     * @param msg the PossibleCard message received
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(PossibleCardMessage msg) {
 | 
			
		||||
    public void received(PossibleCardsMessage msg) {
 | 
			
		||||
        state.received(msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -413,7 +413,7 @@ public void received(ShutdownMessage msg) {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(IncorrectRequestMessage msg) {
 | 
			
		||||
        state.received(msg);
 | 
			
		||||
        addNotification(new InfoNotification(Resources.stringLookup("incorrect.request." + msg.getId())));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -116,7 +116,7 @@ public void received(PlayCardMessage msg) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(PossibleCardMessage msg) {
 | 
			
		||||
    public void received(PossibleCardsMessage msg) {
 | 
			
		||||
        LOGGER.log(Level.DEBUG, "Received {0} not allowed.", msg.toString());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -241,7 +241,7 @@ public void received(DiceAgainMessage msg){
 | 
			
		||||
     * @param msg the message to be received
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(PossibleCardMessage msg){
 | 
			
		||||
    public void received(PossibleCardsMessage msg){
 | 
			
		||||
        state.received(msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -65,6 +65,7 @@ public void selectStart() {
 | 
			
		||||
        if (logic.isHost() && logic.getGame().areAllReady()) {
 | 
			
		||||
            logic.send(new StartGameMessage());
 | 
			
		||||
        } else {
 | 
			
		||||
            logic.send(new StartGameMessage());
 | 
			
		||||
            LOGGER.log(System.Logger.Level.ERROR, "You are not the host");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -12,25 +12,21 @@
 | 
			
		||||
import pp.mdga.notification.SwapPieceNotification;
 | 
			
		||||
import pp.mdga.notification.ThrowPieceNotification;
 | 
			
		||||
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
public abstract class GameStates extends ClientState {
 | 
			
		||||
    public GameStates(ClientState parent, ClientGameLogic logic) {
 | 
			
		||||
        super(parent, logic);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void handlePowerCard(PlayCardMessage msg) {
 | 
			
		||||
        if (msg.getCard().equals(BonusCard.TURBO)) {
 | 
			
		||||
            //logic.getGame().setDiceModifier(msg.getDiceModifier());
 | 
			
		||||
        } else if (msg.getCard().equals(BonusCard.SHIELD)) {
 | 
			
		||||
            if (logic.getGame().getBoard().getInfieldIndexOfPiece(logic.getGame().getPieceThroughUUID(msg.getPieceIdentifier())) % 10 != 0) {
 | 
			
		||||
                logic.getGame().getPieceThroughUUID(msg.getPieceIdentifier()).setShield(ShieldState.SUPPRESSED);
 | 
			
		||||
                logic.addNotification(new ShieldSuppressedNotification(logic.getGame().getPieceThroughUUID(msg.getPieceIdentifier()).getUuid()));
 | 
			
		||||
            } else {
 | 
			
		||||
                logic.getGame().getPieceThroughUUID(msg.getPieceIdentifier()).setShield(ShieldState.ACTIVE);
 | 
			
		||||
                logic.addNotification(new ShieldActiveNotification(logic.getGame().getPieceThroughUUID(msg.getPieceIdentifier()).getUuid()));
 | 
			
		||||
            }
 | 
			
		||||
        if (msg.getCard().getCard().equals(BonusCard.TURBO)) {
 | 
			
		||||
            logic.getGame().setDiceModifier(msg.getDiceModifier());
 | 
			
		||||
        } else if (msg.getCard().getCard().equals(BonusCard.SHIELD)) {
 | 
			
		||||
            handleShield(msg.getPieces().get(0).getUuid());
 | 
			
		||||
        } else {
 | 
			
		||||
            Piece ownPiece = logic.getGame().getPieceThroughUUID(msg.getPieceIdentifier());
 | 
			
		||||
            Piece enemyPiece = logic.getGame().getPieceThroughUUID(msg.getPieceIdentifierEnemy());
 | 
			
		||||
            Piece ownPiece = logic.getGame().getPieceThroughUUID(msg.getPieces().get(0).getUuid());
 | 
			
		||||
            Piece enemyPiece = logic.getGame().getPieceThroughUUID(msg.getPieces().get(1).getUuid());
 | 
			
		||||
            int ownIndex = logic.getGame().getBoard().getInfieldIndexOfPiece(ownPiece);
 | 
			
		||||
            logic.addNotification(new SwapPieceNotification(ownPiece.getUuid(), enemyPiece.getUuid()));
 | 
			
		||||
            logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(enemyPiece)].setOccupant(ownPiece);
 | 
			
		||||
@@ -47,4 +43,14 @@ protected void throwPiece(Piece piece) {
 | 
			
		||||
        logic.getGame().getGameStatistics().increasePiecesBeingThrown();
 | 
			
		||||
        piece.setState(PieceState.WAITING);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handleShield(UUID uuid) {
 | 
			
		||||
        if (logic.getGame().getBoard().getInfieldIndexOfPiece(logic.getGame().getPieceThroughUUID(uuid)) % 10 != 0) {
 | 
			
		||||
            logic.getGame().getPieceThroughUUID(uuid).setShield(ShieldState.SUPPRESSED);
 | 
			
		||||
            logic.addNotification(new ShieldSuppressedNotification(uuid));
 | 
			
		||||
        } else {
 | 
			
		||||
            logic.getGame().getPieceThroughUUID(uuid).setShield(ShieldState.ACTIVE);
 | 
			
		||||
            logic.addNotification(new ShieldActiveNotification(uuid));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -47,7 +47,7 @@ public void received(DieMessage msg) {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(PlayCardMessage msg) {
 | 
			
		||||
        logic.addNotification(new PlayCardNotification(logic.getGame().getActiveColor(), msg.getCard()));
 | 
			
		||||
        logic.addNotification(new PlayCardNotification(logic.getGame().getActiveColor(), msg.getCard().getCard()));
 | 
			
		||||
        handlePowerCard(msg);
 | 
			
		||||
        logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).getPlayerStatistic().increaseCardsPlayed();
 | 
			
		||||
        logic.getGame().getGameStatistics().increaseCardsPlayed();
 | 
			
		||||
 
 | 
			
		||||
@@ -108,7 +108,7 @@ public void received(DiceAgainMessage msg){
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(PossibleCardMessage msg){
 | 
			
		||||
    public void received(PossibleCardsMessage msg){
 | 
			
		||||
        state.received(msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,8 +40,8 @@ public void received(DiceNowMessage msg) {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(DieMessage msg) {
 | 
			
		||||
//        logic.getGame().setDiceEyes(msg.getDiceEye());
 | 
			
		||||
//        logic.addNotification(new RollDiceNotification(logic.getGame().getActiveColor(), logic.getGame().getDiceEyes(), logic.getGame().getDiceEyes() * logic.getGame().getDiceModifier()));
 | 
			
		||||
        logic.getGame().setDiceEyes(msg.getDiceEye());
 | 
			
		||||
        logic.addNotification(new RollDiceNotification(logic.getGame().getActiveColor(), logic.getGame().getDiceEyes()));
 | 
			
		||||
        if (msg.getDiceEye() == 6) {
 | 
			
		||||
            logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).getPlayerStatistic().increaseDiced6();
 | 
			
		||||
            logic.getGame().getGameStatistics().increaseDiced6();
 | 
			
		||||
@@ -51,7 +51,7 @@ public void received(DieMessage msg) {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(PlayCardMessage msg) {
 | 
			
		||||
        logic.addNotification(new PlayCardNotification(logic.getGame().getActiveColor(), msg.getCard()));
 | 
			
		||||
        logic.addNotification(new PlayCardNotification(logic.getGame().getActiveColor(), msg.getCard().getCard()));
 | 
			
		||||
        handlePowerCard(msg);
 | 
			
		||||
        logic.getGame().getPlayerByColor(logic.getGame().getActiveColor()).getPlayerStatistic().increaseCardsPlayed();
 | 
			
		||||
        logic.getGame().getGameStatistics().increaseCardsPlayed();
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,9 @@
 | 
			
		||||
import pp.mdga.client.gamestate.DetermineStartPlayerState;
 | 
			
		||||
import pp.mdga.game.Player;
 | 
			
		||||
import pp.mdga.message.client.AnimationEndMessage;
 | 
			
		||||
import pp.mdga.notification.AcquireCardNotification;
 | 
			
		||||
import pp.mdga.notification.ActivePlayerNotification;
 | 
			
		||||
import pp.mdga.notification.DrawCardNotification;
 | 
			
		||||
import pp.mdga.notification.MovePieceNotification;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
@@ -46,9 +49,9 @@ public void enter() {
 | 
			
		||||
            logic.getGame().getBoard().getInfield()[entry.getValue().getStartNodeIndex()].setOccupant(entry.getValue().getPieces()[0]);
 | 
			
		||||
            animationCounter++;
 | 
			
		||||
            if(entry.getKey() == logic.getOwnPlayerId()){
 | 
			
		||||
                //logic.addNotification(new AcquireCardNotification(entry.getValue().getHandCards().get(0)));
 | 
			
		||||
                logic.addNotification(new AcquireCardNotification(entry.getValue().getHandCards().get(0).getCard()));
 | 
			
		||||
            } else {
 | 
			
		||||
                //logic.addNotification(new DrawCardNotification(entry.getValue().getColor(), entry.getValue().getHandCards().get(0)));
 | 
			
		||||
                logic.addNotification(new DrawCardNotification(entry.getValue().getColor(), entry.getValue().getHandCards().get(0).getCard()));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -73,8 +76,10 @@ public void selectAnimationEnd(){
 | 
			
		||||
        logic.send(new AnimationEndMessage());
 | 
			
		||||
        if (logic.getGame().getActivePlayerId() == logic.getOwnPlayerId()){
 | 
			
		||||
            parent.getParent().setState(parent.getParent().getTurn());
 | 
			
		||||
            logic.addNotification(new ActivePlayerNotification(logic.getGame().getActiveColor()));
 | 
			
		||||
        } else {
 | 
			
		||||
            parent.getParent().setState(parent.getParent().getWaiting());
 | 
			
		||||
            logic.addNotification(new ActivePlayerNotification(logic.getGame().getActiveColor()));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,21 +4,27 @@
 | 
			
		||||
import pp.mdga.client.ClientState;
 | 
			
		||||
import pp.mdga.client.gamestate.DetermineStartPlayerState;
 | 
			
		||||
import pp.mdga.message.client.AnimationEndMessage;
 | 
			
		||||
import pp.mdga.message.server.ActivePlayerMessage;
 | 
			
		||||
import pp.mdga.message.server.RankingResponseMessage;
 | 
			
		||||
import pp.mdga.message.server.RankingRollAgainMessage;
 | 
			
		||||
import pp.mdga.message.server.*;
 | 
			
		||||
import pp.mdga.notification.ActivePlayerNotification;
 | 
			
		||||
 | 
			
		||||
public class WaitRankingState extends DetermineStartPlayerStates {
 | 
			
		||||
 | 
			
		||||
    private final DetermineStartPlayerState parent;
 | 
			
		||||
    private boolean canTransition = false;
 | 
			
		||||
    private boolean canChange = false;
 | 
			
		||||
 | 
			
		||||
    public WaitRankingState(ClientState parent, ClientGameLogic logic) {
 | 
			
		||||
        super(parent, logic);
 | 
			
		||||
        this.parent = (DetermineStartPlayerState) parent;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void changeToIntro(){
 | 
			
		||||
        if(!canChange){
 | 
			
		||||
            canChange = true;
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        parent.setState(parent.getIntro());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void enter() {
 | 
			
		||||
    }
 | 
			
		||||
@@ -29,33 +35,24 @@ public void exit() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(RankingRollAgainMessage msg){
 | 
			
		||||
    public void received(DiceNowMessage msg){
 | 
			
		||||
        parent.setState(parent.getRollRankingDice());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(RankingResponseMessage msg){
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void selectAnimationEnd(){
 | 
			
		||||
        logic.send(new AnimationEndMessage());
 | 
			
		||||
        changeToIntro();
 | 
			
		||||
        logic.send(new AnimationEndMessage());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(ActivePlayerMessage msg){
 | 
			
		||||
        logic.addNotification(new ActivePlayerNotification(msg.getColor()));
 | 
			
		||||
        logic.getGame().setActiveColor(msg.getColor());
 | 
			
		||||
        changeToIntro();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void changeToIntro(){
 | 
			
		||||
        if (!canTransition){
 | 
			
		||||
            canTransition = true;
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        parent.setState(parent.getIntro());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@ public PlayPowerCardState(ClientState parent, ClientGameLogic logic) {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void enter() {
 | 
			
		||||
        logic.addNotification(new PlayCardNotification(logic.getGame().getActiveColor() , playCardMessage.getCard()));
 | 
			
		||||
        logic.addNotification(new PlayCardNotification(logic.getGame().getActiveColor() , playCardMessage.getCard().getCard()));
 | 
			
		||||
        handlePowerCard(playCardMessage);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@
 | 
			
		||||
import pp.mdga.game.Piece;
 | 
			
		||||
import pp.mdga.message.server.DiceNowMessage;
 | 
			
		||||
import pp.mdga.message.server.PlayCardMessage;
 | 
			
		||||
import pp.mdga.message.server.PossibleCardMessage;
 | 
			
		||||
import pp.mdga.message.server.PossibleCardsMessage;
 | 
			
		||||
import pp.mdga.message.server.PossiblePieceMessage;
 | 
			
		||||
 | 
			
		||||
public class PowerCardState extends TurnStates {
 | 
			
		||||
@@ -48,7 +48,7 @@ public void setState(PowerCardStates state) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(PossibleCardMessage msg){
 | 
			
		||||
    public void received(PossibleCardsMessage msg){
 | 
			
		||||
        state.received(msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,11 @@
 | 
			
		||||
import pp.mdga.client.ClientGameLogic;
 | 
			
		||||
import pp.mdga.client.ClientState;
 | 
			
		||||
import pp.mdga.client.gamestate.TurnState;
 | 
			
		||||
import pp.mdga.message.client.RequestDieMessage;
 | 
			
		||||
import pp.mdga.message.server.DieMessage;
 | 
			
		||||
import pp.mdga.message.server.NoTurnMessage;
 | 
			
		||||
import pp.mdga.notification.DiceNowNotification;
 | 
			
		||||
import pp.mdga.notification.RollDiceNotification;
 | 
			
		||||
 | 
			
		||||
public class RollDiceState extends TurnStates {
 | 
			
		||||
 | 
			
		||||
@@ -17,20 +20,25 @@ public RollDiceState(ClientState parent, ClientGameLogic logic) {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void enter() {
 | 
			
		||||
 | 
			
		||||
        logic.addNotification(new DiceNowNotification());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void exit() {
 | 
			
		||||
        //logic.getGame().setDiceModifier(1);
 | 
			
		||||
        logic.getGame().setDiceModifier(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public TurnState getParent() {
 | 
			
		||||
        return parent;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void selectDice(){
 | 
			
		||||
        logic.send(new RequestDieMessage());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void received(DieMessage msg){
 | 
			
		||||
//        logic.getGame().setDiceEyes(msg.getDiceEye());
 | 
			
		||||
        logic.getGame().setDiceEyes(msg.getDiceEye());
 | 
			
		||||
        parent.setState(parent.getChoosePiece());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -37,8 +37,10 @@ public void setPossiblePieces(ArrayList<Piece> possiblePieces) {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void selectPiece(Piece piece) {
 | 
			
		||||
        if (possiblePieces.contains(piece)) {
 | 
			
		||||
            logic.send(new SelectedPiecesMessage(piece.getUuid()));
 | 
			
		||||
        ArrayList<Piece> pieces = new ArrayList<>();
 | 
			
		||||
        if(possiblePieces.contains(piece)){
 | 
			
		||||
            pieces.add(piece);
 | 
			
		||||
            logic.send(new SelectedPiecesMessage(pieces));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,8 @@
 | 
			
		||||
import pp.mdga.message.client.SelectedPiecesMessage;
 | 
			
		||||
import pp.mdga.message.server.MoveMessage;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
public class StartPieceState extends ChoosePieceStates {
 | 
			
		||||
 | 
			
		||||
    private final ChoosePieceState parent;
 | 
			
		||||
@@ -30,8 +32,10 @@ public void exit() {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void selectPiece(Piece piece){
 | 
			
		||||
        ArrayList<Piece> pieces = new ArrayList<>();
 | 
			
		||||
        if(moveablePiece.equals(piece)){
 | 
			
		||||
            logic.send(new SelectedPiecesMessage(piece.getUuid()));
 | 
			
		||||
            pieces.add(piece);
 | 
			
		||||
            logic.send(new SelectedPiecesMessage(pieces));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,9 @@
 | 
			
		||||
import pp.mdga.message.client.SelectedPiecesMessage;
 | 
			
		||||
import pp.mdga.message.server.MoveMessage;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
public class WaitingPieceState extends ChoosePieceStates {
 | 
			
		||||
 | 
			
		||||
    private final ChoosePieceState parent;
 | 
			
		||||
@@ -29,8 +32,10 @@ public void exit() {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void selectPiece(Piece piece){
 | 
			
		||||
        ArrayList<Piece> pieces = new ArrayList<>();
 | 
			
		||||
        if(moveablePiece.equals(piece)){
 | 
			
		||||
            logic.send(new SelectedPiecesMessage(piece.getUuid()));
 | 
			
		||||
            pieces.add(piece);
 | 
			
		||||
            logic.send(new SelectedPiecesMessage(pieces));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,11 +4,12 @@
 | 
			
		||||
import pp.mdga.client.ClientState;
 | 
			
		||||
import pp.mdga.client.gamestate.turnstate.PowerCardState;
 | 
			
		||||
import pp.mdga.game.BonusCard;
 | 
			
		||||
import pp.mdga.game.card.*;
 | 
			
		||||
import pp.mdga.message.client.NoPowerCardMessage;
 | 
			
		||||
import pp.mdga.message.client.SelectCardMessage;
 | 
			
		||||
import pp.mdga.message.server.DiceNowMessage;
 | 
			
		||||
import pp.mdga.message.server.PlayCardMessage;
 | 
			
		||||
import pp.mdga.message.server.PossibleCardMessage;
 | 
			
		||||
import pp.mdga.message.server.PossibleCardsMessage;
 | 
			
		||||
import pp.mdga.message.server.PossiblePieceMessage;
 | 
			
		||||
import pp.mdga.notification.SelectableCardsNotification;
 | 
			
		||||
 | 
			
		||||
@@ -21,7 +22,7 @@
 | 
			
		||||
public class ChoosePowerCardState extends PowerCardStates {
 | 
			
		||||
 | 
			
		||||
    private final PowerCardState parent;
 | 
			
		||||
    private ArrayList<BonusCard> possibleCards;
 | 
			
		||||
    private ArrayList<PowerCard> possibleCards = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructor
 | 
			
		||||
@@ -38,8 +39,6 @@ public ChoosePowerCardState(ClientState parent, ClientGameLogic logic) {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void enter() {
 | 
			
		||||
        possibleCards = new ArrayList<>();
 | 
			
		||||
        System.out.println("ChoosePowerCardState");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -47,7 +46,7 @@ public void enter() {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void exit() {
 | 
			
		||||
        possibleCards = null;
 | 
			
		||||
        possibleCards = new ArrayList<>();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -55,9 +54,15 @@ public void exit() {
 | 
			
		||||
     * @param msg possible cards message
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(PossibleCardMessage msg){
 | 
			
		||||
        possibleCards = (ArrayList<BonusCard>) msg.getPossibleCards();
 | 
			
		||||
        logic.addNotification(new SelectableCardsNotification(possibleCards));
 | 
			
		||||
    public void received(PossibleCardsMessage msg){
 | 
			
		||||
        possibleCards = (ArrayList<PowerCard>)msg.getPossibleCards();
 | 
			
		||||
        ArrayList<BonusCard> possibleBonusCards = new ArrayList<>();
 | 
			
		||||
        for (PowerCard card : possibleCards) {
 | 
			
		||||
            if (!possibleBonusCards.contains(card.getCard())) {
 | 
			
		||||
                possibleBonusCards.add(card.getCard());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        logic.addNotification(new SelectableCardsNotification(possibleBonusCards));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -67,7 +72,7 @@ public void received(PossibleCardMessage msg){
 | 
			
		||||
    @Override
 | 
			
		||||
    public void selectCard(BonusCard card){
 | 
			
		||||
        if(card != null){
 | 
			
		||||
            logic.send(new SelectCardMessage(card));
 | 
			
		||||
            logic.send(new SelectCardMessage(logic.getGame().getPlayers().get(logic.getOwnPlayerId()).getPowerCardByType(card)));
 | 
			
		||||
        } else {
 | 
			
		||||
            logic.send(new NoPowerCardMessage());
 | 
			
		||||
        }
 | 
			
		||||
@@ -79,10 +84,9 @@ public void selectCard(BonusCard card){
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(PlayCardMessage msg){
 | 
			
		||||
        if(msg.getCard().equals(BonusCard.TURBO)){
 | 
			
		||||
            //logic.getGame().setDiceModifier(msg.getDiceModifier());
 | 
			
		||||
        } else {
 | 
			
		||||
            LOGGER.log(System.Logger.Level.ERROR, "Received card that is not turbo");
 | 
			
		||||
        if(msg.getCard().getCard().equals(BonusCard.TURBO)){
 | 
			
		||||
            parent.getParent().getPlayPowerCard().setPlayCard(msg);
 | 
			
		||||
            parent.getParent().setState(parent.getParent().getPlayPowerCard());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,11 @@
 | 
			
		||||
package pp.mdga.game;
 | 
			
		||||
 | 
			
		||||
import com.jme3.network.serializing.Serializable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Enum representing the different types of bonus cards.
 | 
			
		||||
 */
 | 
			
		||||
@Serializable
 | 
			
		||||
public enum BonusCard {
 | 
			
		||||
    /**
 | 
			
		||||
     * The hidden bonus card.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,10 @@
 | 
			
		||||
package pp.mdga.game;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.game.card.PowerCard;
 | 
			
		||||
import pp.mdga.game.card.ShieldCard;
 | 
			
		||||
import pp.mdga.game.card.SwapCard;
 | 
			
		||||
import pp.mdga.game.card.TurboCard;
 | 
			
		||||
 | 
			
		||||
import java.util.*;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -36,12 +41,12 @@ public class Game {
 | 
			
		||||
    /**
 | 
			
		||||
     * The pile of bonus cards available for drawing.
 | 
			
		||||
     */
 | 
			
		||||
    private List<BonusCard> drawPile = new ArrayList<>();
 | 
			
		||||
    private List<PowerCard> drawPile = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The pile of bonus cards that have been discarded.
 | 
			
		||||
     */
 | 
			
		||||
    private List<BonusCard> discardPile = new ArrayList<>();
 | 
			
		||||
    private List<PowerCard> discardPile = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The game board.
 | 
			
		||||
@@ -63,6 +68,16 @@ public class Game {
 | 
			
		||||
     */
 | 
			
		||||
    private Color activeColor;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The dice modifier.
 | 
			
		||||
     */
 | 
			
		||||
    private int diceModifier;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The number of eyes on the dice.
 | 
			
		||||
     */
 | 
			
		||||
    private int diceEyes;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This constructor creates a new Game object.
 | 
			
		||||
     */
 | 
			
		||||
@@ -77,9 +92,23 @@ public Game() {
 | 
			
		||||
     * This method initializes the draw pile with the predefined number of bonus cards.
 | 
			
		||||
     */
 | 
			
		||||
    private void initializeDrawPile() {
 | 
			
		||||
        addBonusCards(BonusCard.TURBO, AMOUNT_OF_TURBO_CARDS);
 | 
			
		||||
        addBonusCards(BonusCard.SWAP, AMOUNT_OF_SWAP_CARDS);
 | 
			
		||||
        addBonusCards(BonusCard.SHIELD, AMOUNT_OF_SHIELD_CARDS);
 | 
			
		||||
        this.addBonusCards(new TurboCard(), AMOUNT_OF_TURBO_CARDS);
 | 
			
		||||
        this.addBonusCards(new SwapCard(), AMOUNT_OF_SWAP_CARDS);
 | 
			
		||||
        this.addBonusCards(new ShieldCard(), AMOUNT_OF_SHIELD_CARDS);
 | 
			
		||||
        Collections.shuffle(this.drawPile);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to remove the first card of the drawPile attribute of Game class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return first card as a PowerCard enumeration.
 | 
			
		||||
     */
 | 
			
		||||
    public PowerCard draw() {
 | 
			
		||||
        if (!this.drawPile.isEmpty()) {
 | 
			
		||||
            return this.drawPile.remove(0);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -88,7 +117,7 @@ private void initializeDrawPile() {
 | 
			
		||||
     * @param card  the card to add
 | 
			
		||||
     * @param count the number of cards to add
 | 
			
		||||
     */
 | 
			
		||||
    private void addBonusCards(BonusCard card, int count) {
 | 
			
		||||
    private void addBonusCards(PowerCard card, int count) {
 | 
			
		||||
        drawPile.addAll(Collections.nCopies(count, card));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -290,21 +319,21 @@ public Statistic getGameStatistics() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method returns the draw pile.
 | 
			
		||||
     * This method will be used to return drawPile attribute of Game class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the draw pile
 | 
			
		||||
     * @return drawPile as a List of PowerCard objects.
 | 
			
		||||
     */
 | 
			
		||||
    public List<BonusCard> getDrawPile() {
 | 
			
		||||
        return drawPile;
 | 
			
		||||
    public List<PowerCard> getDrawPile() {
 | 
			
		||||
        return this.drawPile;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method returns the discard pile.
 | 
			
		||||
     * This method will be used to return discardPile attribute of Game class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the discard pile
 | 
			
		||||
     * @return discardPile as a List of PowerCard objects.
 | 
			
		||||
     */
 | 
			
		||||
    public List<BonusCard> getDiscardPile() {
 | 
			
		||||
        return discardPile;
 | 
			
		||||
    public List<PowerCard> getDiscardPile() {
 | 
			
		||||
        return this.discardPile;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -362,20 +391,22 @@ public void setGameStatistics(Statistic gameStatistics) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method sets the draw pile.
 | 
			
		||||
     * This method will be used to set drawPile attribute of Game class to the given discardPile parameter.
 | 
			
		||||
     * It will be used to test cases.
 | 
			
		||||
     *
 | 
			
		||||
     * @param drawPile the new draw pile
 | 
			
		||||
     * @param drawPile the new value of drawPile attribute as a List of PowerCards.
 | 
			
		||||
     */
 | 
			
		||||
    public void setDrawPile(List<BonusCard> drawPile) {
 | 
			
		||||
    public void setDrawPile(List<PowerCard> drawPile) {
 | 
			
		||||
        this.drawPile = drawPile;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method sets the discard pile.
 | 
			
		||||
     * This method will be used to set discardPile attribute of Game class to the given discardPile parameter.
 | 
			
		||||
     * It will be used to test cases.
 | 
			
		||||
     *
 | 
			
		||||
     * @param discardPile the new discard pile
 | 
			
		||||
     * @param discardPile the new value of discardPile attribute as a List of PowerCards.
 | 
			
		||||
     */
 | 
			
		||||
    public void setDiscardPile(List<BonusCard> discardPile) {
 | 
			
		||||
    public void setDiscardPile(List<PowerCard> discardPile) {
 | 
			
		||||
        this.discardPile = discardPile;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -414,4 +445,40 @@ public void setDie(Die die) {
 | 
			
		||||
    public void setHost(int host) {
 | 
			
		||||
        this.host = host;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to get the dice eyes.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the dice eyes
 | 
			
		||||
     */
 | 
			
		||||
    public int getDiceEyes() {
 | 
			
		||||
        return diceEyes;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method is used to get the dice modifier.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the dice modifier
 | 
			
		||||
     */
 | 
			
		||||
    public int getDiceModifier() {
 | 
			
		||||
        return diceModifier;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to set the dice eyes.
 | 
			
		||||
     *
 | 
			
		||||
     * @param diceEyes the new dice eyes
 | 
			
		||||
     */
 | 
			
		||||
    public void setDiceEyes(int diceEyes) {
 | 
			
		||||
        this.diceEyes = diceEyes;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method is used to set the dice modifier.
 | 
			
		||||
     *
 | 
			
		||||
     * @param diceModifier the new dice modifier
 | 
			
		||||
     */
 | 
			
		||||
    public void setDiceModifier(int diceModifier) {
 | 
			
		||||
        this.diceModifier = diceModifier;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -121,4 +121,47 @@ public Color getColor() {
 | 
			
		||||
    public UUID getUuid() {
 | 
			
		||||
        return uuid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will return all necessary information of Piece class in a more readable way.
 | 
			
		||||
     *
 | 
			
		||||
     * @return information as a String.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        return "Piece with UUID: %s and color: %s with state: %s".formatted(this.uuid, color, state);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to create the hash code of this Piece class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return hashCode as an Integer.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode() {
 | 
			
		||||
        return this.uuid.hashCode();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to check if the given obj parameter is equal to this object.
 | 
			
		||||
     * It will return false if the obj parameter is null or if the hash codes of both objects are not equal. Otherwise
 | 
			
		||||
     * it will return true.
 | 
			
		||||
     *
 | 
			
		||||
     * @param obj as the object which will be compared as an Object.
 | 
			
		||||
     * @return true or false.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals(Object obj) {
 | 
			
		||||
        if (obj == null) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (obj instanceof Piece) {
 | 
			
		||||
            Piece piece = (Piece) obj;
 | 
			
		||||
 | 
			
		||||
            return this.hashCode() == piece.hashCode();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@
 | 
			
		||||
 | 
			
		||||
import com.jme3.network.serializing.Serializable;
 | 
			
		||||
import pp.mdga.Resources;
 | 
			
		||||
import pp.mdga.game.card.PowerCard;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
@@ -23,7 +24,7 @@ public class Player {
 | 
			
		||||
    /**
 | 
			
		||||
     * The hand cards of the player.
 | 
			
		||||
     */
 | 
			
		||||
    private ArrayList<BonusCard> handCards = new ArrayList<>();
 | 
			
		||||
    private ArrayList<PowerCard> handCards = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The color of the player.
 | 
			
		||||
@@ -93,7 +94,7 @@ public void initialize() {
 | 
			
		||||
     *
 | 
			
		||||
     * @param card the card to be added to the players hand
 | 
			
		||||
     */
 | 
			
		||||
    public void addHandCard(BonusCard card) {
 | 
			
		||||
    public void addHandCard(PowerCard card) {
 | 
			
		||||
        this.handCards.add(card);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -102,7 +103,7 @@ public void addHandCard(BonusCard card) {
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as the card which should be removed from the handCards attribute as a PowerCard object.
 | 
			
		||||
     */
 | 
			
		||||
    public void removeHandCard(BonusCard card) {
 | 
			
		||||
    public void removeHandCard(PowerCard card) {
 | 
			
		||||
        this.handCards.remove(card);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -136,6 +137,21 @@ public boolean isFinished() {
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method returns a PowerCard based on its Type.
 | 
			
		||||
     *
 | 
			
		||||
     * @param bonusCard the card Type to be matched
 | 
			
		||||
     * @return the first PowerCard of this type
 | 
			
		||||
     */
 | 
			
		||||
    public PowerCard getPowerCardByType(BonusCard bonusCard) {
 | 
			
		||||
        for (PowerCard card : this.handCards) {
 | 
			
		||||
            if(card.getCard().equals(bonusCard)) {
 | 
			
		||||
                return card;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method returns the give name of the Player
 | 
			
		||||
     *
 | 
			
		||||
@@ -155,12 +171,12 @@ public Statistic getPlayerStatistic() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method returns the current handCards of the player
 | 
			
		||||
     * This method will be used to return handCards attribute of Player class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the handCards of the player
 | 
			
		||||
     * @return handCards as a List of PowerCard objects.
 | 
			
		||||
     */
 | 
			
		||||
    public ArrayList<BonusCard> getHandCards() {
 | 
			
		||||
        return handCards;
 | 
			
		||||
    public ArrayList<PowerCard> getHandCards() {
 | 
			
		||||
        return this.handCards;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,29 @@
 | 
			
		||||
package pp.mdga.game.card;
 | 
			
		||||
 | 
			
		||||
import com.jme3.network.serializing.Serializable;
 | 
			
		||||
import pp.mdga.game.BonusCard;
 | 
			
		||||
import pp.mdga.visitor.Visitor;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class represents the hidden power card of this application.
 | 
			
		||||
 */
 | 
			
		||||
@Serializable
 | 
			
		||||
public class HiddenCard extends PowerCard {
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructor.
 | 
			
		||||
     */
 | 
			
		||||
    public HiddenCard() {
 | 
			
		||||
        this.card = BonusCard.HIDDEN;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to call the visit method of the given visitor parameter and pass a PowerCard object.
 | 
			
		||||
     *
 | 
			
		||||
     * @param visitor as the visitor which will differentiates between all types of power card types as a Visitor
 | 
			
		||||
     *                interface.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void accept(Visitor visitor) {
 | 
			
		||||
        visitor.visit(this);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,86 @@
 | 
			
		||||
package pp.mdga.game.card;
 | 
			
		||||
 | 
			
		||||
import com.jme3.network.serializing.Serializable;
 | 
			
		||||
import pp.mdga.game.BonusCard;
 | 
			
		||||
import pp.mdga.visitor.Visitor;
 | 
			
		||||
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This abstract class represents the abstract power class which will be used to realize a visitor pattern for all
 | 
			
		||||
 * types of different cards inside the game.
 | 
			
		||||
 */
 | 
			
		||||
@Serializable
 | 
			
		||||
public abstract class PowerCard {
 | 
			
		||||
    /**
 | 
			
		||||
     * Create PowerCard attributes.
 | 
			
		||||
     */
 | 
			
		||||
    private final UUID uuid = UUID.randomUUID();
 | 
			
		||||
    protected BonusCard card;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructor.
 | 
			
		||||
     */
 | 
			
		||||
    public PowerCard() {
 | 
			
		||||
        this.card = BonusCard.HIDDEN;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to call the visit method of the given visitor parameter and pass a PowerCard object.
 | 
			
		||||
     *
 | 
			
		||||
     * @param visitor as the visitor which will differentiates between all types of power card types as a Visitor
 | 
			
		||||
     *                interface.
 | 
			
		||||
     */
 | 
			
		||||
    public abstract void accept(Visitor visitor);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return uuid attribute of abstract PowerCard class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return uuid as a UUID object.
 | 
			
		||||
     */
 | 
			
		||||
    public UUID getUuid() {
 | 
			
		||||
        return this.uuid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return card attribute of abstract PowerCard class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return card as a BonusCard enumeration.
 | 
			
		||||
     */
 | 
			
		||||
    public BonusCard getCard() {
 | 
			
		||||
        return this.card;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to create the hash code of this abstract PowerCard class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return hashCode as an Integer.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public int hashCode() {
 | 
			
		||||
        return this.uuid.hashCode();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to check if the given obj parameter is equal to this object.
 | 
			
		||||
     * It will return false if the obj parameter is null or if the hash codes of both objects are not equal. Otherwise
 | 
			
		||||
     * it will return true.
 | 
			
		||||
     *
 | 
			
		||||
     * @param obj as the object which will be compared as an Object.
 | 
			
		||||
     * @return true or false.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean equals(Object obj) {
 | 
			
		||||
        if (obj == null) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (obj instanceof PowerCard) {
 | 
			
		||||
            PowerCard card = (PowerCard) obj;
 | 
			
		||||
 | 
			
		||||
            return this.hashCode() == card.hashCode();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,28 @@
 | 
			
		||||
package pp.mdga.game.card;
 | 
			
		||||
 | 
			
		||||
import com.jme3.network.serializing.Serializable;
 | 
			
		||||
import pp.mdga.game.BonusCard;
 | 
			
		||||
import pp.mdga.visitor.Visitor;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class represents the shield power card of this application.
 | 
			
		||||
 */
 | 
			
		||||
@Serializable
 | 
			
		||||
public class ShieldCard extends PowerCard {
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructor.
 | 
			
		||||
     */
 | 
			
		||||
    public ShieldCard() {
 | 
			
		||||
        this.card = BonusCard.SHIELD;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to call the visit method of the given visitor parameter and pass a PowerCard object.
 | 
			
		||||
     *
 | 
			
		||||
     * @param visitor as the visitor which will differentiates between all types of power card types as a Visitor
 | 
			
		||||
     *                interface.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void accept(Visitor visitor) {
 | 
			
		||||
        visitor.visit(this);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,29 @@
 | 
			
		||||
package pp.mdga.game.card;
 | 
			
		||||
 | 
			
		||||
import com.jme3.network.serializing.Serializable;
 | 
			
		||||
import pp.mdga.game.BonusCard;
 | 
			
		||||
import pp.mdga.visitor.Visitor;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class represents the swap power card of this application.
 | 
			
		||||
 */
 | 
			
		||||
@Serializable
 | 
			
		||||
public class SwapCard extends PowerCard {
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructor.
 | 
			
		||||
     */
 | 
			
		||||
    public SwapCard() {
 | 
			
		||||
        this.card = BonusCard.SWAP;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to call the visit method of the given visitor parameter and pass a PowerCard object.
 | 
			
		||||
     *
 | 
			
		||||
     * @param visitor as the visitor which will differentiates between all types of power card types as a Visitor
 | 
			
		||||
     *                interface.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void accept(Visitor visitor) {
 | 
			
		||||
        visitor.visit(this);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,29 @@
 | 
			
		||||
package pp.mdga.game.card;
 | 
			
		||||
 | 
			
		||||
import com.jme3.network.serializing.Serializable;
 | 
			
		||||
import pp.mdga.game.BonusCard;
 | 
			
		||||
import pp.mdga.visitor.Visitor;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class represents the turbo power card of this application.
 | 
			
		||||
 */
 | 
			
		||||
@Serializable
 | 
			
		||||
public class TurboCard extends PowerCard {
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructor.
 | 
			
		||||
     */
 | 
			
		||||
    public TurboCard() {
 | 
			
		||||
        this.card = BonusCard.TURBO;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to call the visit method of the given visitor parameter and pass a PowerCard object.
 | 
			
		||||
     *
 | 
			
		||||
     * @param visitor as the visitor which will differentiates between all types of power card types as a Visitor
 | 
			
		||||
     *                interface.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void accept(Visitor visitor) {
 | 
			
		||||
        visitor.visit(this);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -2,6 +2,7 @@
 | 
			
		||||
 | 
			
		||||
import com.jme3.network.serializing.Serializable;
 | 
			
		||||
import pp.mdga.game.BonusCard;
 | 
			
		||||
import pp.mdga.game.card.PowerCard;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A message sent from the client to the server to select a bonus card.
 | 
			
		||||
@@ -11,14 +12,14 @@ public class SelectCardMessage extends ClientMessage {
 | 
			
		||||
    /**
 | 
			
		||||
     * The bonus card to be selected.
 | 
			
		||||
     */
 | 
			
		||||
    private final BonusCard card;
 | 
			
		||||
    private final PowerCard card;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a new SelectCard instance.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card the bonus card to be selected
 | 
			
		||||
     * @param card the power card to be selected
 | 
			
		||||
     */
 | 
			
		||||
    public SelectCardMessage(BonusCard card) {
 | 
			
		||||
    public SelectCardMessage(PowerCard card) {
 | 
			
		||||
        this.card = card;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -30,11 +31,11 @@ private SelectCardMessage() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the bonus card associated with this selection.
 | 
			
		||||
     * Gets the power card associated with this selection.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the bonus card
 | 
			
		||||
     * @return the power card
 | 
			
		||||
     */
 | 
			
		||||
    public BonusCard getCard() {
 | 
			
		||||
    public PowerCard getCard() {
 | 
			
		||||
        return card;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,10 @@
 | 
			
		||||
package pp.mdga.message.client;
 | 
			
		||||
 | 
			
		||||
import com.jme3.network.serializing.Serializable;
 | 
			
		||||
import pp.mdga.game.Piece;
 | 
			
		||||
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A message sent by a client to indicate that a piece has been selected for a bonus cards.
 | 
			
		||||
@@ -10,43 +12,24 @@
 | 
			
		||||
@Serializable
 | 
			
		||||
public class SelectedPiecesMessage extends ClientMessage {
 | 
			
		||||
    /**
 | 
			
		||||
     * The piece identifier.
 | 
			
		||||
     * Create SelectedPiecesMessage attributes.
 | 
			
		||||
     */
 | 
			
		||||
    private final UUID pieceIdentifier;
 | 
			
		||||
    private final List<Piece> pieces;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructor.
 | 
			
		||||
     */
 | 
			
		||||
    private SelectedPiecesMessage() {
 | 
			
		||||
        this.pieces = new ArrayList<>();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructor for SelectedPieces
 | 
			
		||||
     *
 | 
			
		||||
     * @param pieceIdentifier the piece identifier
 | 
			
		||||
     * @param pieces the piece identifier
 | 
			
		||||
     */
 | 
			
		||||
    public SelectedPiecesMessage(UUID pieceIdentifier) {
 | 
			
		||||
        this.pieceIdentifier = pieceIdentifier;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Default constructor for serialization purposes.
 | 
			
		||||
     */
 | 
			
		||||
    private SelectedPiecesMessage() {
 | 
			
		||||
        pieceIdentifier = null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Getter for the piece identifier
 | 
			
		||||
     *
 | 
			
		||||
     * @return the piece identifier
 | 
			
		||||
     */
 | 
			
		||||
    public UUID getPieceIdentifier() {
 | 
			
		||||
        return pieceIdentifier;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns a string representation of this message.
 | 
			
		||||
     *
 | 
			
		||||
     * @return a string representation of this message
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        return "SelectedPieces{pieceIdentifier=" + pieceIdentifier + '}';
 | 
			
		||||
    public SelectedPiecesMessage(List<Piece> pieces) {
 | 
			
		||||
        this.pieces = pieces;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -59,4 +42,30 @@ public String toString() {
 | 
			
		||||
    public void accept(ClientInterpreter interpreter, int from) {
 | 
			
		||||
        interpreter.received(this, from);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return pieces of SelectedPiecesMessage class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return pieces as a List of Piece objects.
 | 
			
		||||
     */
 | 
			
		||||
    public List<Piece> getPieces() {
 | 
			
		||||
        return pieces;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns a string representation of this message.
 | 
			
		||||
     *
 | 
			
		||||
     * @return a string representation of this message
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        StringBuilder stringBuilder = new StringBuilder();
 | 
			
		||||
        stringBuilder.append("SelectedPieces{Number of pieces: ").append(this.pieces.size()).append(" | ");
 | 
			
		||||
        for (Piece piece : this.pieces) {
 | 
			
		||||
            stringBuilder.append(piece).append(", ");
 | 
			
		||||
        }
 | 
			
		||||
        stringBuilder.deleteCharAt(stringBuilder.length() - 1);
 | 
			
		||||
        stringBuilder.deleteCharAt(stringBuilder.length() - 1);
 | 
			
		||||
        return stringBuilder.toString();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,15 @@ public IncorrectRequestMessage() {
 | 
			
		||||
        this.id = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the id of the incorrect request message
 | 
			
		||||
     *
 | 
			
		||||
     * @return the id of the error message
 | 
			
		||||
     */
 | 
			
		||||
    public int getId(){
 | 
			
		||||
        return id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Accepts a visitor to process this message.
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,11 @@
 | 
			
		||||
package pp.mdga.message.server;
 | 
			
		||||
 | 
			
		||||
import com.jme3.network.serializing.Serializable;
 | 
			
		||||
import pp.mdga.game.BonusCard;
 | 
			
		||||
import pp.mdga.game.Piece;
 | 
			
		||||
import pp.mdga.game.card.PowerCard;
 | 
			
		||||
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A message sent by the server to the active player to play a card.
 | 
			
		||||
@@ -13,17 +15,12 @@ public class PlayCardMessage extends ServerMessage {
 | 
			
		||||
    /**
 | 
			
		||||
     * The card that should be played.
 | 
			
		||||
     */
 | 
			
		||||
    private final BonusCard card;
 | 
			
		||||
    private final PowerCard card;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The identifier of the piece that should be moved.
 | 
			
		||||
     * The list of pieces which will be used.
 | 
			
		||||
     */
 | 
			
		||||
    private final UUID ownPieceID;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The identifier of the enemy piece that should be moved.
 | 
			
		||||
     */
 | 
			
		||||
    private final UUID enemyPieceID;
 | 
			
		||||
    private final List<Piece> pieces;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The modifier of the dice.
 | 
			
		||||
@@ -34,15 +31,13 @@ public class PlayCardMessage extends ServerMessage {
 | 
			
		||||
     * Constructs a new PlayCard message.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card         the card that should be played
 | 
			
		||||
     * @param ownPieceID   the identifier of the piece that should be moved
 | 
			
		||||
     * @param enemyPieceID the identifier of the enemy piece that should be moved
 | 
			
		||||
     * @param pieces       as the pieces which should be played as a List of Piece objects.
 | 
			
		||||
     * @param diceModifier the new modifier of the dice
 | 
			
		||||
     */
 | 
			
		||||
    public PlayCardMessage(BonusCard card, UUID ownPieceID, UUID enemyPieceID, int diceModifier) {
 | 
			
		||||
    public PlayCardMessage(PowerCard card, List<Piece> pieces, int diceModifier) {
 | 
			
		||||
        super();
 | 
			
		||||
        this.card = card;
 | 
			
		||||
        this.ownPieceID = ownPieceID;
 | 
			
		||||
        this.enemyPieceID = enemyPieceID;
 | 
			
		||||
        this.pieces = pieces;
 | 
			
		||||
        this.diceModifier = diceModifier;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -50,71 +45,30 @@ public PlayCardMessage(BonusCard card, UUID ownPieceID, UUID enemyPieceID, int d
 | 
			
		||||
     * Default constructor for serialization purposes.
 | 
			
		||||
     */
 | 
			
		||||
    private PlayCardMessage() {
 | 
			
		||||
        ownPieceID = null;
 | 
			
		||||
        card = null;
 | 
			
		||||
        enemyPieceID = null;
 | 
			
		||||
        diceModifier = 1;
 | 
			
		||||
        super();
 | 
			
		||||
        this.card = null;
 | 
			
		||||
        this.pieces = new ArrayList<Piece>();
 | 
			
		||||
        this.diceModifier = 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new PlayCard message for the given card and piece identifier.
 | 
			
		||||
     * This method will be used to return card attribute of PlayCardMessage class.
 | 
			
		||||
     *
 | 
			
		||||
     * @param ownPieceID   the identifier of the piece of the player that should be affected
 | 
			
		||||
     * @param enemyPieceID the identifier of the enemy piece that should be affected
 | 
			
		||||
     * @return a new PlayCard message
 | 
			
		||||
     * @return card as a PowerCard object.
 | 
			
		||||
     */
 | 
			
		||||
    public static PlayCardMessage swap(UUID ownPieceID, UUID enemyPieceID) {
 | 
			
		||||
        return new PlayCardMessage(BonusCard.SWAP, ownPieceID, enemyPieceID, 1);
 | 
			
		||||
    public PowerCard getCard() {
 | 
			
		||||
        return this.card;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new PlayCard message for the given card and piece identifier.
 | 
			
		||||
     * This mehtod will be usd to return pieces attribute of PlayCardMessage class.
 | 
			
		||||
     *
 | 
			
		||||
     * @param ownPieceID the identifier of the piece of the player that should be affected
 | 
			
		||||
     * @return a new PlayCard message
 | 
			
		||||
     * @return pieces as a List of Piece objects.
 | 
			
		||||
     */
 | 
			
		||||
    public static PlayCardMessage shield(UUID ownPieceID) {
 | 
			
		||||
        return new PlayCardMessage(BonusCard.SHIELD, ownPieceID, null, 1);
 | 
			
		||||
    public List<Piece> getPieces() {
 | 
			
		||||
        return this.pieces;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * creates a new PlayCardMessage for a turbo card
 | 
			
		||||
     *
 | 
			
		||||
     * @param diceModifier the new modifier of the dice
 | 
			
		||||
     * @return newly constructed message
 | 
			
		||||
     */
 | 
			
		||||
    public static PlayCardMessage turbo(int diceModifier) {
 | 
			
		||||
        return new PlayCardMessage(BonusCard.TURBO, null, null, diceModifier);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the card that should be played.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the card that should be played
 | 
			
		||||
     */
 | 
			
		||||
    public BonusCard getCard() {
 | 
			
		||||
        return card;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the identifier of the piece that should be moved.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the identifier of the piece that should be moved
 | 
			
		||||
     */
 | 
			
		||||
    public UUID getPieceIdentifier() {
 | 
			
		||||
        return ownPieceID;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the identifier of the enemy piece that should be moved.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the identifier of the enemy piece that should be moved
 | 
			
		||||
     */
 | 
			
		||||
    public UUID getPieceIdentifierEnemy() {
 | 
			
		||||
        return enemyPieceID;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * this method returns the dice modifier
 | 
			
		||||
     *
 | 
			
		||||
@@ -141,6 +95,15 @@ public void accept(ServerInterpreter interpreter) {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        return "PlayCardMessage{" + "card=" + card + ", ownPieceID=" + ownPieceID + ", enemyPieceID=" + enemyPieceID + ", diceModifier=" + diceModifier + '}';
 | 
			
		||||
        StringBuilder stringBuilder = new StringBuilder();
 | 
			
		||||
        stringBuilder.append("PlayCardMessage{card: ").append(this.card).append(" with selected pieces: {");
 | 
			
		||||
        for (Piece piece : this.pieces) {
 | 
			
		||||
            stringBuilder.append(piece).append(", ");
 | 
			
		||||
        }
 | 
			
		||||
        stringBuilder.deleteCharAt(stringBuilder.length() - 1);
 | 
			
		||||
        stringBuilder.deleteCharAt(stringBuilder.length() - 1);
 | 
			
		||||
        stringBuilder.append("} and dice modifier: ").append(this.diceModifier);
 | 
			
		||||
 | 
			
		||||
        return stringBuilder.toString();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
package pp.mdga.message.server;
 | 
			
		||||
 | 
			
		||||
import com.jme3.network.serializing.Serializable;
 | 
			
		||||
import pp.mdga.game.BonusCard;
 | 
			
		||||
import pp.mdga.game.card.PowerCard;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
@@ -10,36 +10,36 @@
 | 
			
		||||
 * A message sent by the server to the client to indicate the possible cards that can be chosen.
 | 
			
		||||
 */
 | 
			
		||||
@Serializable
 | 
			
		||||
public class PossibleCardMessage extends ServerMessage {
 | 
			
		||||
public class PossibleCardsMessage extends ServerMessage {
 | 
			
		||||
    /**
 | 
			
		||||
     * The list of possible cards.
 | 
			
		||||
     */
 | 
			
		||||
    private final List<BonusCard> possibleCards;
 | 
			
		||||
    private final List<PowerCard> possibleCards;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructor for a PossibleCard instance.
 | 
			
		||||
     */
 | 
			
		||||
    public PossibleCardMessage() {
 | 
			
		||||
    public PossibleCardsMessage() {
 | 
			
		||||
        super();
 | 
			
		||||
        possibleCards = new ArrayList<>();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Add a possible card to the list of possible cards
 | 
			
		||||
     * Constructor.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card the possible card to add
 | 
			
		||||
     * @param possibleCards as the list of possible power cards as a List of PowerCard objects.
 | 
			
		||||
     */
 | 
			
		||||
    public void addPossibleCard(BonusCard card) {
 | 
			
		||||
        this.possibleCards.add(card);
 | 
			
		||||
    public PossibleCardsMessage(List<PowerCard> possibleCards) {
 | 
			
		||||
        this.possibleCards = possibleCards;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Getter for the list of possible cards
 | 
			
		||||
     * This method will be used to return possibleCards attribute of PossibleCardMessage class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the list of possible cards
 | 
			
		||||
     * @return possibleCards as a List of PowerCard objects.
 | 
			
		||||
     */
 | 
			
		||||
    public List<BonusCard> getPossibleCards() {
 | 
			
		||||
        return possibleCards;
 | 
			
		||||
    public List<PowerCard> getPossibleCards() {
 | 
			
		||||
        return this.possibleCards;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -2,37 +2,45 @@
 | 
			
		||||
 | 
			
		||||
import com.jme3.network.serializing.Serializable;
 | 
			
		||||
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A message sent by the server to all client to inform them about the current ranking. (only in DetermineStartPlayer)
 | 
			
		||||
 */
 | 
			
		||||
@Serializable
 | 
			
		||||
public class RankingResponseMessage extends ServerMessage {
 | 
			
		||||
 | 
			
		||||
    private final int startingPlayerId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a new RankingResponse instance.
 | 
			
		||||
     * Create RankingResponseMessage attributes.
 | 
			
		||||
     */
 | 
			
		||||
    public RankingResponseMessage(int startingPlayerId) {
 | 
			
		||||
        super();
 | 
			
		||||
        this.startingPlayerId = startingPlayerId;
 | 
			
		||||
    }
 | 
			
		||||
    private final Map<Integer, Integer> rankingResults;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a new RankingResponse instance.
 | 
			
		||||
     * Constructor.
 | 
			
		||||
     */
 | 
			
		||||
    public RankingResponseMessage() {
 | 
			
		||||
        super();
 | 
			
		||||
        this.startingPlayerId = 0;
 | 
			
		||||
        this.rankingResults = new HashMap<Integer, Integer>();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The id of the starting Player.
 | 
			
		||||
     * Constructor.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the id of the starting player as an int
 | 
			
		||||
     * @param rankingResults as the results of all players after the start player was determined as a Map combining
 | 
			
		||||
     *                       Integers and Integers.
 | 
			
		||||
     */
 | 
			
		||||
    public int getStartingPlayerId() {
 | 
			
		||||
        return startingPlayerId;
 | 
			
		||||
    public RankingResponseMessage(Map<Integer, Integer> rankingResults) {
 | 
			
		||||
        super();
 | 
			
		||||
        this.rankingResults = rankingResults;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return rankingResults attribute of RankingResponseMessage class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return rankingResults as a Map combining Integers and Integers.
 | 
			
		||||
     */
 | 
			
		||||
    public Map<Integer, Integer> getRankingResults() {
 | 
			
		||||
        return this.rankingResults;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -52,6 +60,14 @@ public void accept(ServerInterpreter interpreter) {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        return "RankingResponseMessage{" + "startingPlayerId=" + startingPlayerId + '}';
 | 
			
		||||
        StringBuilder stringBuilder = new StringBuilder();
 | 
			
		||||
        stringBuilder.append("RankingResponseMessage{");
 | 
			
		||||
        for (Map.Entry<Integer, Integer> entry : this.rankingResults.entrySet()) {
 | 
			
		||||
            stringBuilder.append("Player with ID: ").append(entry.getKey()).append(" rolled: ").append(entry.getValue()).append(", ");
 | 
			
		||||
        }
 | 
			
		||||
        stringBuilder.deleteCharAt(stringBuilder.length() - 1);
 | 
			
		||||
        stringBuilder.deleteCharAt(stringBuilder.length() - 1);
 | 
			
		||||
        stringBuilder.append("}");
 | 
			
		||||
        return stringBuilder.toString();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -122,7 +122,7 @@ public interface ServerInterpreter {
 | 
			
		||||
     *
 | 
			
		||||
     * @param msg the PossibleCard message received
 | 
			
		||||
     */
 | 
			
		||||
    void received(PossibleCardMessage msg);
 | 
			
		||||
    void received(PossibleCardsMessage msg);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Handles a PossiblePiece message received from the server.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,8 @@
 | 
			
		||||
package pp.mdga.server.automaton;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.game.Color;
 | 
			
		||||
import pp.mdga.game.Piece;
 | 
			
		||||
import pp.mdga.game.PieceState;
 | 
			
		||||
import pp.mdga.game.Player;
 | 
			
		||||
import pp.mdga.message.client.*;
 | 
			
		||||
import pp.mdga.message.server.*;
 | 
			
		||||
@@ -49,6 +51,11 @@ public void exit() {
 | 
			
		||||
    public void initializeGame() {
 | 
			
		||||
        for (var player : this.logic.getGame().getPlayers().values()) {
 | 
			
		||||
            player.initialize();
 | 
			
		||||
            player.addHandCard(this.logic.getGame().draw());
 | 
			
		||||
            Piece piece = player.getWaitingArea()[0];
 | 
			
		||||
            player.getWaitingArea()[0] = null;
 | 
			
		||||
            piece.setState(PieceState.ACTIVE);
 | 
			
		||||
            this.logic.getGame().getBoard().getInfield()[player.getStartNodeIndex()].setOccupant(piece);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -67,8 +74,8 @@ public void received(JoinedLobbyMessage msg, int from) {
 | 
			
		||||
        for (Map.Entry<Integer, Player> entry : this.logic.getGame().getPlayers().entrySet()) {
 | 
			
		||||
            this.logic.getServerSender().broadcast(new LobbyPlayerJoinedMessage(entry.getKey(), entry.getValue(), entry.getKey() == this.logic.getGame().getHost()));
 | 
			
		||||
 | 
			
		||||
            if(entry.getKey() != from) {
 | 
			
		||||
                this.logic.getServerSender().broadcast(new UpdateReadyMessage(entry.getKey(), entry.getValue().isReady()));
 | 
			
		||||
            if (entry.getKey() != from && entry.getValue().isReady()) {
 | 
			
		||||
                this.logic.getServerSender().send(from, new UpdateReadyMessage(entry.getKey(), entry.getValue().isReady()));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -86,7 +93,8 @@ public void received(SelectTSKMessage msg, int from) {
 | 
			
		||||
            this.logic.getServerSender().broadcast(new UpdateTSKMessage(from, Color.NONE, false));
 | 
			
		||||
            this.logic.getGame().getPlayerById(from).setColor(msg.getColor());
 | 
			
		||||
            this.logic.getServerSender().broadcast(new UpdateTSKMessage(from, msg.getColor(), true));
 | 
			
		||||
        } else {
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            this.logic.getServerSender().send(from, new IncorrectRequestMessage(0));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -116,10 +124,11 @@ public void received(LobbyReadyMessage msg, int from) {
 | 
			
		||||
        if (this.logic.getGame().getPlayerById(from).getColor() == Color.NONE) {
 | 
			
		||||
            Color color = this.logic.getGame().getFirstUnusedColor();
 | 
			
		||||
 | 
			
		||||
            if (color != null) {
 | 
			
		||||
            if (color != Color.NONE) {
 | 
			
		||||
                this.logic.getGame().getPlayerById(from).setColor(color);
 | 
			
		||||
                this.logic.getServerSender().broadcast(new UpdateTSKMessage(from, color, true));
 | 
			
		||||
            } else {
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                this.logic.getServerSender().send(from, new IncorrectRequestMessage(1));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -154,5 +163,8 @@ public void received(StartGameMessage msg, int from) {
 | 
			
		||||
            this.logic.getServerSender().broadcast(new ServerStartGameMessage(this.logic.getGame().getPlayersAsList(), this.logic.getGame().getBoard()));
 | 
			
		||||
            this.logic.setCurrentState(this.logic.getGameState());
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            this.logic.getServerSender().send(from, new IncorrectRequestMessage(5));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,14 @@
 | 
			
		||||
package pp.mdga.server.automaton.game;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.message.client.AnimationEndMessage;
 | 
			
		||||
import pp.mdga.message.server.DiceNowMessage;
 | 
			
		||||
import pp.mdga.server.ServerGameLogic;
 | 
			
		||||
import pp.mdga.server.automaton.GameState;
 | 
			
		||||
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class represents the animation state of the game state.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public class AnimationState extends GameAutomatonState {
 | 
			
		||||
    /**
 | 
			
		||||
@@ -18,7 +19,7 @@ public class AnimationState extends GameAutomatonState {
 | 
			
		||||
    /**
 | 
			
		||||
     * Create AnimationState attributes.
 | 
			
		||||
     */
 | 
			
		||||
    private int messageReceived = 0;
 | 
			
		||||
    private final Set<Integer> messageReceived = new HashSet<>();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a server state of the specified game logic.
 | 
			
		||||
@@ -38,7 +39,7 @@ public void enter() {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void exit() {
 | 
			
		||||
        LOGGER.log(System.Logger.Level.DEBUG, "Exited AnimationState state.");
 | 
			
		||||
        this.messageReceived = 0;
 | 
			
		||||
        this.messageReceived.clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -50,11 +51,10 @@ public void exit() {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(AnimationEndMessage msg, int from) {
 | 
			
		||||
        if (this.messageReceived == this.logic.getGame().getPlayers().size()) {
 | 
			
		||||
            this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new DiceNowMessage());
 | 
			
		||||
        this.messageReceived.add(from);
 | 
			
		||||
        if (this.messageReceived.size() == this.logic.getGame().getPlayers().size()) {
 | 
			
		||||
            this.gameAutomaton.setCurrentState(this.gameAutomaton.getTurnState());
 | 
			
		||||
        } else {
 | 
			
		||||
            this.messageReceived++;
 | 
			
		||||
            this.gameAutomaton.getTurnState().setCurrentState(this.gameAutomaton.getTurnState().getPowerCardState());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,24 @@
 | 
			
		||||
package pp.mdga.server.automaton.game;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.game.Player;
 | 
			
		||||
import pp.mdga.game.Color;
 | 
			
		||||
import pp.mdga.message.client.AnimationEndMessage;
 | 
			
		||||
import pp.mdga.message.client.RequestDieMessage;
 | 
			
		||||
import pp.mdga.message.server.ActivePlayerMessage;
 | 
			
		||||
import pp.mdga.message.server.DiceNowMessage;
 | 
			
		||||
import pp.mdga.message.server.DieMessage;
 | 
			
		||||
import pp.mdga.message.server.EndOfTurnMessage;
 | 
			
		||||
import pp.mdga.message.server.RankingResponseMessage;
 | 
			
		||||
import pp.mdga.server.ServerGameLogic;
 | 
			
		||||
import pp.mdga.server.automaton.GameState;
 | 
			
		||||
 | 
			
		||||
import java.lang.System.Logger.Level;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.function.Function;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
public class DetermineStartPlayerState extends GameAutomatonState {
 | 
			
		||||
    /**
 | 
			
		||||
@@ -25,8 +29,9 @@ public class DetermineStartPlayerState extends GameAutomatonState {
 | 
			
		||||
    /**
 | 
			
		||||
     * Create DetermineStartPlayerState attributes.
 | 
			
		||||
     */
 | 
			
		||||
    private Map<Integer, Integer> diceResults = new HashMap<>();
 | 
			
		||||
    private List<Integer> playersHaveToRoll = new ArrayList<>();
 | 
			
		||||
    private final Map<Integer, Integer> diceResults = new HashMap<>();
 | 
			
		||||
    private final List<Integer> playersHaveToRoll = new ArrayList<>();
 | 
			
		||||
    private final Set<Integer> messageReceived = new HashSet<>();;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a server state of the specified game logic.
 | 
			
		||||
@@ -41,16 +46,13 @@ public DetermineStartPlayerState(GameState gameAutomaton, ServerGameLogic logic)
 | 
			
		||||
    @Override
 | 
			
		||||
    public void enter() {
 | 
			
		||||
        LOGGER.log(System.Logger.Level.DEBUG, "Entered DetermineStartPlayerState state.");
 | 
			
		||||
        for (Map.Entry<Integer, Player> entry: this.logic.getGame().getPlayers().entrySet()) {
 | 
			
		||||
            this.playersHaveToRoll.add(entry.getKey());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void exit() {
 | 
			
		||||
        LOGGER.log(System.Logger.Level.DEBUG, "Exited DetermineStartPlayerState state.");
 | 
			
		||||
        this.diceResults.clear();
 | 
			
		||||
        this.playersHaveToRoll.clear();
 | 
			
		||||
        this.messageReceived.clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -67,23 +69,51 @@ public void received(RequestDieMessage msg, int from) {
 | 
			
		||||
        this.diceResults.put(from, roll);
 | 
			
		||||
        if (this.diceResults.size() == this.logic.getGame().getPlayers().size()) {
 | 
			
		||||
            int maximumRoll = 0;
 | 
			
		||||
            for (Map.Entry<Integer, Integer> entry: this.diceResults.entrySet()) {
 | 
			
		||||
                if (maximumRoll <= entry.getValue()) {
 | 
			
		||||
 | 
			
		||||
            for (Map.Entry<Integer, Integer> entry : this.diceResults.entrySet()) {
 | 
			
		||||
                if (maximumRoll == entry.getValue()) {
 | 
			
		||||
                    this.playersHaveToRoll.add(entry.getKey());
 | 
			
		||||
                }
 | 
			
		||||
                else if (maximumRoll < entry.getValue()) {
 | 
			
		||||
                    maximumRoll = entry.getValue();
 | 
			
		||||
                } else {
 | 
			
		||||
                    this.playersHaveToRoll.remove(entry.getKey());
 | 
			
		||||
                    this.playersHaveToRoll.clear();
 | 
			
		||||
                    this.playersHaveToRoll.add(entry.getKey());
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    this.logic.getServerSender().send(entry.getKey(), new EndOfTurnMessage());
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (this.playersHaveToRoll.size() == 1) {
 | 
			
		||||
                this.logic.getServerSender().broadcast(new ActivePlayerMessage(this.logic.getGame().getPlayerById(this.playersHaveToRoll.get(0)).getColor()));
 | 
			
		||||
                this.gameAutomaton.setCurrentState(this.gameAutomaton.getAnimationState());
 | 
			
		||||
            } else {
 | 
			
		||||
                for (Integer id: this.playersHaveToRoll) {
 | 
			
		||||
            for (int id: this.playersHaveToRoll) {
 | 
			
		||||
                this.diceResults.remove(id);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be called whenever the server received an AnimationEndMessage message.
 | 
			
		||||
     * It will also get the client id of the player who send this message.
 | 
			
		||||
     *
 | 
			
		||||
     * @param msg  as the message which was sent by the player as a AnimationEndMessage object.
 | 
			
		||||
     * @param from as the client id of the player as an Integer.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(AnimationEndMessage msg, int from) {
 | 
			
		||||
        this.messageReceived.add(from);
 | 
			
		||||
        if (this.messageReceived.size() == this.logic.getGame().getPlayers().size()) {
 | 
			
		||||
            this.messageReceived.clear();
 | 
			
		||||
            if (this.playersHaveToRoll.size() > 1) {
 | 
			
		||||
                for (Integer id : this.playersHaveToRoll) {
 | 
			
		||||
                    this.logic.getServerSender().send(id, new DiceNowMessage());
 | 
			
		||||
                }
 | 
			
		||||
                diceResults.clear();
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                LOGGER.log(Level.INFO, "Players have to roll: %s".formatted(this.logic.getGame().getPlayerById(this.playersHaveToRoll.get(0))));
 | 
			
		||||
                Color color = this.logic.getGame().getPlayerById(this.playersHaveToRoll.get(0)).getColor();
 | 
			
		||||
                this.logic.getGame().setActiveColor(color);
 | 
			
		||||
                this.logic.getServerSender().broadcast(new RankingResponseMessage(this.diceResults));
 | 
			
		||||
                this.logic.getServerSender().broadcast(new ActivePlayerMessage(color));
 | 
			
		||||
                this.gameAutomaton.setCurrentState(this.gameAutomaton.getAnimationState());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,16 @@
 | 
			
		||||
package pp.mdga.server.automaton.game;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.game.Player;
 | 
			
		||||
import pp.mdga.server.ServerGameLogic;
 | 
			
		||||
import pp.mdga.server.automaton.GameState;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.*;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.ChoosePieceState;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.MovePieceState;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.PlayPowerCardState;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.PowerCardState;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.RollDiceState;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.TurnAutomatonState;
 | 
			
		||||
 | 
			
		||||
import java.lang.System.Logger.Level;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class represents the turn state of the server state automaton.
 | 
			
		||||
@@ -22,6 +30,7 @@ public class TurnState extends GameAutomatonState {
 | 
			
		||||
    private final RollDiceState rollDiceState;
 | 
			
		||||
    private final ChoosePieceState choosePieceState;
 | 
			
		||||
    private final MovePieceState movePieceState;
 | 
			
		||||
    private Player player;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a server state of the specified game logic.
 | 
			
		||||
@@ -36,17 +45,17 @@ public TurnState(GameState gameAutomaton, ServerGameLogic logic) {
 | 
			
		||||
        this.rollDiceState = new RollDiceState(this, logic);
 | 
			
		||||
        this.choosePieceState = new ChoosePieceState(this, logic);
 | 
			
		||||
        this.movePieceState = new MovePieceState(this, logic);
 | 
			
		||||
        this.setCurrentState(this.powerCardState);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void enter() {
 | 
			
		||||
        LOGGER.log(System.Logger.Level.DEBUG, "Entered TurnState state.");
 | 
			
		||||
        LOGGER.log(Level.DEBUG, "Entered TurnState state.");
 | 
			
		||||
        this.player = this.logic.getGame().getPlayerById(this.logic.getGame().getActivePlayerId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void exit() {
 | 
			
		||||
        LOGGER.log(System.Logger.Level.DEBUG, "Exited TurnState state.");
 | 
			
		||||
        LOGGER.log(Level.DEBUG, "Exited TurnState state.");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -103,6 +112,15 @@ public MovePieceState getMovePieceState() {
 | 
			
		||||
        return this.movePieceState;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return player attribute of TurnState class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return player as a Player object.
 | 
			
		||||
     */
 | 
			
		||||
    public Player getPlayer() {
 | 
			
		||||
        return this.player;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 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.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,20 @@
 | 
			
		||||
package pp.mdga.server.automaton.game.turn;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.game.Piece;
 | 
			
		||||
import pp.mdga.game.card.PowerCard;
 | 
			
		||||
import pp.mdga.message.server.DiceNowMessage;
 | 
			
		||||
import pp.mdga.message.server.PossibleCardsMessage;
 | 
			
		||||
import pp.mdga.server.ServerGameLogic;
 | 
			
		||||
import pp.mdga.server.automaton.game.AnimationState;
 | 
			
		||||
import pp.mdga.server.automaton.game.TurnState;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.powercard.ChoosePowerCardState;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.powercard.PowerCardAutomatonState;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.powercard.ShieldCardState;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.powercard.SwapCardState;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.powercard.TurboCardState;
 | 
			
		||||
import pp.mdga.visitor.ServerCardVisitor;
 | 
			
		||||
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
public class PowerCardState extends TurnAutomatonState {
 | 
			
		||||
    /**
 | 
			
		||||
@@ -10,6 +22,22 @@ public class PowerCardState extends TurnAutomatonState {
 | 
			
		||||
     */
 | 
			
		||||
    private static final System.Logger LOGGER = System.getLogger(PowerCardState.class.getName());
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create PowerCardState states.
 | 
			
		||||
     */
 | 
			
		||||
    private PowerCardAutomatonState currentState;
 | 
			
		||||
    private final ChoosePowerCardState choosePowerCardState;
 | 
			
		||||
    private final ShieldCardState shieldCardState;
 | 
			
		||||
    private final SwapCardState swapCardState;
 | 
			
		||||
    private final TurboCardState turboCardState;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create PowerCardState attributes.
 | 
			
		||||
     */
 | 
			
		||||
    private ServerCardVisitor visitor;
 | 
			
		||||
    private PowerCard selectedCard;
 | 
			
		||||
    private final Set<Piece> selectedPieces = new HashSet<>();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a server state of the specified game logic.
 | 
			
		||||
     *
 | 
			
		||||
@@ -18,15 +46,138 @@ public class PowerCardState extends TurnAutomatonState {
 | 
			
		||||
     */
 | 
			
		||||
    public PowerCardState(TurnState turnAutomaton, ServerGameLogic logic) {
 | 
			
		||||
        super(turnAutomaton, logic);
 | 
			
		||||
        this.choosePowerCardState = new ChoosePowerCardState(this, logic);
 | 
			
		||||
        this.shieldCardState = new ShieldCardState(this, logic);
 | 
			
		||||
        this.swapCardState = new SwapCardState(this, logic);
 | 
			
		||||
        this.turboCardState = new TurboCardState(this, logic);
 | 
			
		||||
        this.setCurrentState(this.choosePowerCardState);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void enter() {
 | 
			
		||||
        LOGGER.log(System.Logger.Level.DEBUG, "Exited PowerCardState state.");
 | 
			
		||||
        this.visitor = new ServerCardVisitor(this.logic);
 | 
			
		||||
        for (PowerCard card : this.turnAutomaton.getPlayer().getHandCards()) {
 | 
			
		||||
            card.accept(this.visitor);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (this.visitor.getCards().isEmpty()) {
 | 
			
		||||
            this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new DiceNowMessage());
 | 
			
		||||
            this.turnAutomaton.setCurrentState(this.turnAutomaton.getRollDiceState());
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new PossibleCardsMessage(this.visitor.getCards()));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void exit() {
 | 
			
		||||
        LOGGER.log(System.Logger.Level.DEBUG, "Entered PowerCardState state.");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to add the given piece parameter to the selectedPieces attribute of PowerCardState
 | 
			
		||||
     * class.
 | 
			
		||||
     *
 | 
			
		||||
     * @param piece as the new selected piece as a Piece object.
 | 
			
		||||
     */
 | 
			
		||||
    public void addSelectedPiece(Piece piece) {
 | 
			
		||||
        this.selectedPieces.add(piece);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return currentState attribute of PowerCardState class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return currentState as a PowerCardAutomatonState object.
 | 
			
		||||
     */
 | 
			
		||||
    public PowerCardAutomatonState getCurrentState() {
 | 
			
		||||
        return this.currentState;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return choosePowerCardState attribute of PowerCardState class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return choosePowerCardState as a ChoosePowerCardState object.
 | 
			
		||||
     */
 | 
			
		||||
    public ChoosePowerCardState getChoosePowerCardState() {
 | 
			
		||||
        return this.choosePowerCardState;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return shieldCardState attribute of PowerCardState class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return shieldCardState as a ShieldCardState object.
 | 
			
		||||
     */
 | 
			
		||||
    public ShieldCardState getShieldCardState() {
 | 
			
		||||
        return this.shieldCardState;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return swapCardState attribute of PowerCardState class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return swapCardState as a SwapCardState object.
 | 
			
		||||
     */
 | 
			
		||||
    public SwapCardState getSwapCardState() {
 | 
			
		||||
        return this.swapCardState;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return turboCardState attribute of PowerCardState class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return turboCardState as a TurboCardState object.
 | 
			
		||||
     */
 | 
			
		||||
    public TurboCardState getTurboCardState() {
 | 
			
		||||
        return this.turboCardState;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return visitor attribute of PowerCardState class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return visitor as a ServerCardVisitor object.
 | 
			
		||||
     */
 | 
			
		||||
    public ServerCardVisitor getVisitor() {
 | 
			
		||||
        return this.visitor;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return selectedPieces attribute of PowerCardState class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return selectedCard as a PowerCard object.
 | 
			
		||||
     */
 | 
			
		||||
    public PowerCard getSelectedCard() {
 | 
			
		||||
        return this.selectedCard;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return selectedPieces attribute of PowerCardState class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return selectedPieces as a Set of Piece objects.
 | 
			
		||||
     */
 | 
			
		||||
    public Set<Piece> getSelectedPieces() {
 | 
			
		||||
        return this.selectedPieces;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to set currentState attribute of PowerCardState 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 PowerCardAutomatonState object.
 | 
			
		||||
     */
 | 
			
		||||
    public void setCurrentState(PowerCardAutomatonState state) {
 | 
			
		||||
        if (this.currentState != null) {
 | 
			
		||||
            this.currentState.exit();
 | 
			
		||||
        }
 | 
			
		||||
        this.currentState = state;
 | 
			
		||||
        this.currentState.enter();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to set selectedCard attribute of PowerCardState class to the given selectedCard
 | 
			
		||||
     * parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param selectedCard as the new selectedCard attribute as a PowerCard object.
 | 
			
		||||
     */
 | 
			
		||||
    public void setSelectedCard(PowerCard selectedCard) {
 | 
			
		||||
        this.selectedCard = selectedCard;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package pp.mdga.server.automaton.game.turn;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.message.client.RequestDieMessage;
 | 
			
		||||
import pp.mdga.server.ServerGameLogic;
 | 
			
		||||
import pp.mdga.server.automaton.game.TurnState;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.rolldice.FirstRollState;
 | 
			
		||||
@@ -45,6 +46,18 @@ public void exit() {
 | 
			
		||||
        LOGGER.log(System.Logger.Level.DEBUG, "Exited RollDiceState state.");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be called whenever the server received a RequestDieMessage message.
 | 
			
		||||
     * It will also get the client id of the player who send this message.
 | 
			
		||||
     *
 | 
			
		||||
     * @param msg  as the message which was sent by the player as a RequestDieMessage object.
 | 
			
		||||
     * @param from as the client id of the player as an Integer.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(RequestDieMessage msg, int from) {
 | 
			
		||||
        this.currentState.received(msg, from);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return currentState attribute of RollDiceState class.
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,125 @@
 | 
			
		||||
package pp.mdga.server.automaton.game.turn.powercard;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.game.card.HiddenCard;
 | 
			
		||||
import pp.mdga.game.card.ShieldCard;
 | 
			
		||||
import pp.mdga.game.card.SwapCard;
 | 
			
		||||
import pp.mdga.game.card.TurboCard;
 | 
			
		||||
import pp.mdga.message.client.SelectCardMessage;
 | 
			
		||||
import pp.mdga.message.server.IncorrectRequestMessage;
 | 
			
		||||
import pp.mdga.server.ServerGameLogic;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.PowerCardState;
 | 
			
		||||
import pp.mdga.visitor.Visitor;
 | 
			
		||||
 | 
			
		||||
public class ChoosePowerCardState extends PowerCardAutomatonState implements Visitor {
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a server state of the specified game logic.
 | 
			
		||||
     *
 | 
			
		||||
     * @param powerCardAutomaton as the automaton of the turn state as a PowerCardState object.
 | 
			
		||||
     * @param logic              the game logic
 | 
			
		||||
     */
 | 
			
		||||
    public ChoosePowerCardState(PowerCardState powerCardAutomaton, ServerGameLogic logic) {
 | 
			
		||||
        super(powerCardAutomaton, logic);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used whenever this state will be entered.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void enter() {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used whenever this state will be exited.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void exit() {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(SelectCardMessage msg, int from) {
 | 
			
		||||
        if (this.powerCardAutomaton.getVisitor().getCards().contains(msg.getCard())) {
 | 
			
		||||
            this.powerCardAutomaton.setSelectedCard(msg.getCard());
 | 
			
		||||
            msg.getCard().accept(this);
 | 
			
		||||
        } else {
 | 
			
		||||
            this.logic.getServerSender().send(from, new IncorrectRequestMessage(2));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to change the state of the power card automaton depending on the given card parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as a ShieldCard object.
 | 
			
		||||
     */
 | 
			
		||||
    private void changeState(ShieldCard card) {
 | 
			
		||||
        this.powerCardAutomaton.setCurrentState(this.powerCardAutomaton.getShieldCardState());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to change the state of the power card automaton depending on the given card parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as a SwapCard object.
 | 
			
		||||
     */
 | 
			
		||||
    private void changeState(SwapCard card) {
 | 
			
		||||
        this.powerCardAutomaton.setCurrentState(this.powerCardAutomaton.getSwapCardState());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to change the state of the power card automaton depending on the given card parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as a TurboCard object.
 | 
			
		||||
     */
 | 
			
		||||
    private void changeState(TurboCard card) {
 | 
			
		||||
        this.powerCardAutomaton.setCurrentState(this.powerCardAutomaton.getTurboCardState());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to change the state of the power card automaton depending on the given card parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as a TurboCard object.
 | 
			
		||||
     */
 | 
			
		||||
    private void changeState(HiddenCard card) {
 | 
			
		||||
        this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new IncorrectRequestMessage(5));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to visit the given card parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as a TurboCard object.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void visit(TurboCard card) {
 | 
			
		||||
        this.changeState(card);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to visit the given card parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as a SwapCard object.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void visit(SwapCard card) {
 | 
			
		||||
        this.changeState(card);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to visit the given card parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as a ShieldCard oblect
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void visit(ShieldCard card) {
 | 
			
		||||
        this.changeState(card);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to visit the given card parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as a HiddenCard object.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void visit(HiddenCard card) {
 | 
			
		||||
        this.changeState(card);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,23 @@
 | 
			
		||||
package pp.mdga.server.automaton.game.turn.powercard;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.server.ServerGameLogic;
 | 
			
		||||
import pp.mdga.server.automaton.ServerState;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.PowerCardState;
 | 
			
		||||
 | 
			
		||||
public abstract class PowerCardAutomatonState extends ServerState {
 | 
			
		||||
    /**
 | 
			
		||||
     * Create PowerCardAutomatonState attributes.
 | 
			
		||||
     */
 | 
			
		||||
    protected final PowerCardState powerCardAutomaton;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a server state of the specified game logic.
 | 
			
		||||
     *
 | 
			
		||||
     * @param powerCardAutomaton as the automaton of the turn state as a PowerCardState object.
 | 
			
		||||
     * @param logic the game logic
 | 
			
		||||
     */
 | 
			
		||||
    public PowerCardAutomatonState(PowerCardState powerCardAutomaton, ServerGameLogic logic) {
 | 
			
		||||
        super(logic);
 | 
			
		||||
        this.powerCardAutomaton = powerCardAutomaton;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,64 @@
 | 
			
		||||
package pp.mdga.server.automaton.game.turn.powercard;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.game.Piece;
 | 
			
		||||
import pp.mdga.game.PieceState;
 | 
			
		||||
import pp.mdga.game.ShieldState;
 | 
			
		||||
import pp.mdga.message.client.SelectedPiecesMessage;
 | 
			
		||||
import pp.mdga.message.server.IncorrectRequestMessage;
 | 
			
		||||
import pp.mdga.message.server.PlayCardMessage;
 | 
			
		||||
import pp.mdga.server.ServerGameLogic;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.PowerCardState;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
public class ShieldCardState extends PowerCardAutomatonState {
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a server state of the specified game logic.
 | 
			
		||||
     *
 | 
			
		||||
     * @param powerCardAutomaton as the automaton of the turn state as a PowerCardState object.
 | 
			
		||||
     * @param logic              the game logic
 | 
			
		||||
     */
 | 
			
		||||
    public ShieldCardState(PowerCardState powerCardAutomaton, ServerGameLogic logic) {
 | 
			
		||||
        super(powerCardAutomaton, logic);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used whenever this state will be entered.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void enter() {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used whenever this state will be exited.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void exit() {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be called whenever the server received a SelectedPiecesMessage message.
 | 
			
		||||
     * It will also get the client id of the player who send this message.
 | 
			
		||||
     *
 | 
			
		||||
     * @param msg  as the message which was sent by the player as a SelectedPiecesMessage object.
 | 
			
		||||
     * @param from as the client id of the player as an Integer.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(SelectedPiecesMessage msg, int from) {
 | 
			
		||||
        if (msg.getPieces().size() == 1 && this.powerCardAutomaton.getVisitor().getShieldPieces().contains(msg.getPieces().get(0))) {
 | 
			
		||||
            this.powerCardAutomaton.addSelectedPiece(msg.getPieces().get(0));
 | 
			
		||||
            for (Piece piece : this.logic.getGame().getPlayerByColor(this.logic.getGame().getActiveColor()).getPieces()) {
 | 
			
		||||
                if (piece == msg.getPieces().get(0)) {
 | 
			
		||||
                    piece.setShield(ShieldState.ACTIVE);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new PlayCardMessage(this.powerCardAutomaton.getSelectedCard(), new ArrayList<>(), this.logic.getGame().getDiceModifier()));
 | 
			
		||||
            this.powerCardAutomaton.getTurnAutomaton().setCurrentState(this.powerCardAutomaton.getTurnAutomaton().getPlayPowerCardState());
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            this.logic.getServerSender().send(from, new IncorrectRequestMessage(3));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,60 @@
 | 
			
		||||
package pp.mdga.server.automaton.game.turn.powercard;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.game.Piece;
 | 
			
		||||
import pp.mdga.message.client.SelectedPiecesMessage;
 | 
			
		||||
import pp.mdga.message.server.IncorrectRequestMessage;
 | 
			
		||||
import pp.mdga.server.ServerGameLogic;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.PowerCardState;
 | 
			
		||||
 | 
			
		||||
public class SwapCardState extends PowerCardAutomatonState {
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a server state of the specified game logic.
 | 
			
		||||
     *
 | 
			
		||||
     * @param powerCardAutomaton as the automaton of the turn state as a PowerCardState object.
 | 
			
		||||
     * @param logic              the game logic
 | 
			
		||||
     */
 | 
			
		||||
    public SwapCardState(PowerCardState powerCardAutomaton, ServerGameLogic logic) {
 | 
			
		||||
        super(powerCardAutomaton, logic);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used whenever this state will be entered.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void enter() {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used whenever this state will be exited.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void exit() {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be called whenever the server received a SelectedPiecesMessage message.
 | 
			
		||||
     * It will also get the client id of the player who send this message.
 | 
			
		||||
     *
 | 
			
		||||
     * @param msg  as the message which was sent by the player as a SelectedPiecesMessage object.
 | 
			
		||||
     * @param from as the client id of the player as an Integer.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(SelectedPiecesMessage msg, int from) {
 | 
			
		||||
        if (msg.getPieces().size() == 2) {
 | 
			
		||||
            Piece first = msg.getPieces().get(0);
 | 
			
		||||
            Piece second = msg.getPieces().get(1);
 | 
			
		||||
            if ((this.powerCardAutomaton.getVisitor().getSwapOwnPieces().contains(first)
 | 
			
		||||
                && this.powerCardAutomaton.getVisitor().getSwapOtherPieces().contains(second))
 | 
			
		||||
                || (this.powerCardAutomaton.getVisitor().getSwapOwnPieces().contains(second)
 | 
			
		||||
                && this.powerCardAutomaton.getVisitor().getSwapOtherPieces().contains(first))) {
 | 
			
		||||
                this.powerCardAutomaton.addSelectedPiece(first);
 | 
			
		||||
                this.powerCardAutomaton.addSelectedPiece(second);
 | 
			
		||||
                this.powerCardAutomaton.getTurnAutomaton().setCurrentState(this.powerCardAutomaton.getTurnAutomaton().getPlayPowerCardState());
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            this.logic.getServerSender().send(from, new IncorrectRequestMessage(4));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,51 @@
 | 
			
		||||
package pp.mdga.server.automaton.game.turn.powercard;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.message.client.SelectedPiecesMessage;
 | 
			
		||||
import pp.mdga.message.server.PlayCardMessage;
 | 
			
		||||
import pp.mdga.server.ServerGameLogic;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.PowerCardState;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
public class TurboCardState extends PowerCardAutomatonState {
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a server state of the specified game logic.
 | 
			
		||||
     *
 | 
			
		||||
     * @param powerCardAutomaton as the automaton of the turn state as a PowerCardState object.
 | 
			
		||||
     * @param logic              the game logic
 | 
			
		||||
     */
 | 
			
		||||
    public TurboCardState(PowerCardState powerCardAutomaton, ServerGameLogic logic) {
 | 
			
		||||
        super(powerCardAutomaton, logic);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used whenever this state will be entered.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void enter() {
 | 
			
		||||
        this.logic.getGame().getDie().modify();
 | 
			
		||||
        this.logic.getGame().setDiceModifier(this.logic.getGame().getDiceModifier());
 | 
			
		||||
        this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new PlayCardMessage(this.powerCardAutomaton.getSelectedCard(), new ArrayList<>(), this.logic.getGame().getDiceModifier()));
 | 
			
		||||
        this.powerCardAutomaton.getTurnAutomaton().setCurrentState(this.powerCardAutomaton.getTurnAutomaton().getPlayPowerCardState());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used whenever this state will be exited.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void exit() {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be called whenever the server received a SelectedPiecesMessage message.
 | 
			
		||||
     * It will also get the client id of the player who send this message.
 | 
			
		||||
     *
 | 
			
		||||
     * @param msg  as the message which was sent by the player as a SelectedPiecesMessage object.
 | 
			
		||||
     * @param from as the client id of the player as an Integer.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(SelectedPiecesMessage msg, int from) {
 | 
			
		||||
        // ToDo: We can use this method to catch irregular client messages.
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,8 +1,17 @@
 | 
			
		||||
package pp.mdga.server.automaton.game.turn.rolldice;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.Resources;
 | 
			
		||||
import pp.mdga.game.Piece;
 | 
			
		||||
import pp.mdga.game.PieceState;
 | 
			
		||||
import pp.mdga.message.client.RequestDieMessage;
 | 
			
		||||
import pp.mdga.message.server.DiceAgainMessage;
 | 
			
		||||
import pp.mdga.message.server.DieMessage;
 | 
			
		||||
import pp.mdga.server.ServerGameLogic;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.RollDiceState;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
public class FirstRollState extends RollDiceAutomatonState {
 | 
			
		||||
    /**
 | 
			
		||||
     * Create FirstRollState constants.
 | 
			
		||||
@@ -28,4 +37,37 @@ public void enter() {
 | 
			
		||||
    public void exit() {
 | 
			
		||||
        LOGGER.log(System.Logger.Level.DEBUG, "Exited FirstRollState state.");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be called whenever the server received a RequestDieMessage message.
 | 
			
		||||
     * It will also get the client id of the player who send this message.
 | 
			
		||||
     *
 | 
			
		||||
     * @param msg  as the message which was sent by the player as a RequestDieMessage object.
 | 
			
		||||
     * @param from as the client id of the player as an Integer.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(RequestDieMessage msg, int from) {
 | 
			
		||||
        List<Piece> moveablePieces = new ArrayList<>();
 | 
			
		||||
        for (Piece piece : this.rollDiceAutomaton.getTurnAutomaton().getPlayer().getPieces()) {
 | 
			
		||||
            if (piece.getState() == PieceState.HOME || piece.getState() == PieceState.ACTIVE) {
 | 
			
		||||
                moveablePieces.add(piece);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        int roll = this.logic.getGame().getDie().shuffle();
 | 
			
		||||
        this.logic.getGame().setDiceEyes(roll);
 | 
			
		||||
 | 
			
		||||
        if (!moveablePieces.isEmpty()) {
 | 
			
		||||
            this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new DieMessage(roll));
 | 
			
		||||
            this.rollDiceAutomaton.getTurnAutomaton().setCurrentState(this.rollDiceAutomaton.getTurnAutomaton().getChoosePieceState());
 | 
			
		||||
        } else {
 | 
			
		||||
            if (roll == Resources.MAX_EYES) {
 | 
			
		||||
                this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new DieMessage(roll));
 | 
			
		||||
                this.rollDiceAutomaton.getTurnAutomaton().setCurrentState(this.rollDiceAutomaton.getTurnAutomaton().getChoosePieceState());
 | 
			
		||||
            } else {
 | 
			
		||||
                this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new DiceAgainMessage());
 | 
			
		||||
                this.rollDiceAutomaton.setCurrentState(this.rollDiceAutomaton.getSecondRollState());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,8 @@
 | 
			
		||||
package pp.mdga.server.automaton.game.turn.rolldice;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.message.client.RequestDieMessage;
 | 
			
		||||
import pp.mdga.message.server.DiceAgainMessage;
 | 
			
		||||
import pp.mdga.message.server.DieMessage;
 | 
			
		||||
import pp.mdga.server.ServerGameLogic;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.RollDiceState;
 | 
			
		||||
 | 
			
		||||
@@ -28,4 +31,23 @@ public void enter() {
 | 
			
		||||
    public void exit() {
 | 
			
		||||
        LOGGER.log(System.Logger.Level.DEBUG, "Exited SecondRollState state.");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be called whenever the server received a RequestDieMessage message.
 | 
			
		||||
     * It will also get the client id of the player who send this message.
 | 
			
		||||
     *
 | 
			
		||||
     * @param msg  as the message which was sent by the player as a RequestDieMessage object.
 | 
			
		||||
     * @param from as the client id of the player as an Integer.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(RequestDieMessage msg, int from) {
 | 
			
		||||
        int roll = this.logic.getGame().getDie().shuffle();
 | 
			
		||||
        if (roll == 6) {
 | 
			
		||||
            this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new DieMessage(roll));
 | 
			
		||||
            this.rollDiceAutomaton.getTurnAutomaton().setCurrentState(this.rollDiceAutomaton.getTurnAutomaton().getChoosePieceState());
 | 
			
		||||
        } else {
 | 
			
		||||
            this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new DiceAgainMessage());
 | 
			
		||||
            this.rollDiceAutomaton.setCurrentState(this.rollDiceAutomaton.getThirdRollState());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,11 @@
 | 
			
		||||
package pp.mdga.server.automaton.game.turn.rolldice;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.message.client.RequestDieMessage;
 | 
			
		||||
import pp.mdga.message.server.ActivePlayerMessage;
 | 
			
		||||
import pp.mdga.message.server.CeremonyMessage;
 | 
			
		||||
import pp.mdga.message.server.DieMessage;
 | 
			
		||||
import pp.mdga.message.server.NoTurnMessage;
 | 
			
		||||
import pp.mdga.message.server.SpectatorMessage;
 | 
			
		||||
import pp.mdga.server.ServerGameLogic;
 | 
			
		||||
import pp.mdga.server.automaton.game.turn.RollDiceState;
 | 
			
		||||
 | 
			
		||||
@@ -28,4 +34,34 @@ public void enter() {
 | 
			
		||||
    public void exit() {
 | 
			
		||||
        LOGGER.log(System.Logger.Level.DEBUG, "Entered ThirdRollState state.");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be called whenever the server received a RequestDieMessage message.
 | 
			
		||||
     * It will also get the client id of the player who send this message.
 | 
			
		||||
     *
 | 
			
		||||
     * @param msg  as the message which was sent by the player as a RequestDieMessage object.
 | 
			
		||||
     * @param from as the client id of the player as an Integer.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(RequestDieMessage msg, int from) {
 | 
			
		||||
        int roll = this.logic.getGame().getDie().shuffle();
 | 
			
		||||
        if (roll == 6) {
 | 
			
		||||
            this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new DieMessage(roll));
 | 
			
		||||
            this.rollDiceAutomaton.getTurnAutomaton().setCurrentState(this.rollDiceAutomaton.getTurnAutomaton().getChoosePieceState());
 | 
			
		||||
        } else {
 | 
			
		||||
            this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new NoTurnMessage());
 | 
			
		||||
 | 
			
		||||
            if (this.rollDiceAutomaton.getTurnAutomaton().getPlayer().isFinished()) {
 | 
			
		||||
                this.logic.getServerSender().send(this.logic.getGame().getActivePlayerId(), new SpectatorMessage());
 | 
			
		||||
 | 
			
		||||
                if (this.logic.getGame().getNumberOfActivePlayers() == 1) {
 | 
			
		||||
                    this.logic.getServerSender().broadcast(new CeremonyMessage());
 | 
			
		||||
                } else {
 | 
			
		||||
                    this.logic.getGame().setActiveColor(this.logic.getGame().getActiveColor().next());
 | 
			
		||||
                    this.logic.getServerSender().broadcast(new ActivePlayerMessage(this.logic.getGame().getActiveColor()));
 | 
			
		||||
                    this.rollDiceAutomaton.getTurnAutomaton().getGameAutomaton().setCurrentState(this.rollDiceAutomaton.getTurnAutomaton().getGameAutomaton().getAnimationState());
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,147 @@
 | 
			
		||||
package pp.mdga.visitor;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.game.Piece;
 | 
			
		||||
import pp.mdga.game.PieceState;
 | 
			
		||||
import pp.mdga.game.card.HiddenCard;
 | 
			
		||||
import pp.mdga.game.card.PowerCard;
 | 
			
		||||
import pp.mdga.game.card.ShieldCard;
 | 
			
		||||
import pp.mdga.game.card.SwapCard;
 | 
			
		||||
import pp.mdga.game.card.TurboCard;
 | 
			
		||||
import pp.mdga.server.ServerGameLogic;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class represents the visitor for all types of power cards.
 | 
			
		||||
 */
 | 
			
		||||
public class ServerCardVisitor implements Visitor {
 | 
			
		||||
    /**
 | 
			
		||||
     * Create ServerCardVisitor attributes
 | 
			
		||||
     */
 | 
			
		||||
    private final List<PowerCard> cards = new ArrayList<>();
 | 
			
		||||
    private final List<Piece> shieldPieces = new ArrayList<>();
 | 
			
		||||
    private final List<Piece> swapOwnPieces = new ArrayList<>();
 | 
			
		||||
    private final List<Piece> swapOtherPieces = new ArrayList<>();
 | 
			
		||||
    private final ServerGameLogic logic;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructor.
 | 
			
		||||
     *
 | 
			
		||||
     * @param logic as the logic of this server which holds the model as a ServerGameLogic object.
 | 
			
		||||
     */
 | 
			
		||||
    public ServerCardVisitor(ServerGameLogic logic) {
 | 
			
		||||
        this.logic = logic;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to visit the given card parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as a TurboCard object.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void visit(TurboCard card) {
 | 
			
		||||
        this.cards.add(card);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to visit the given card parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as a SwapCard object.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void visit(SwapCard card) {
 | 
			
		||||
        List<Piece> possibleOwnPieces = new ArrayList<>();
 | 
			
		||||
        for (Piece piece : this.logic.getGame().getPlayerByColor(this.logic.getGame().getActiveColor()).getPieces()) {
 | 
			
		||||
            if (piece.getState() == PieceState.ACTIVE) {
 | 
			
		||||
                if (!possibleOwnPieces.contains(piece)) {
 | 
			
		||||
                    possibleOwnPieces.add(piece);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        List<Piece> possibleOtherPieces = new ArrayList<>();
 | 
			
		||||
        for (var player : this.logic.getGame().getPlayers().values()) {
 | 
			
		||||
            if (player != this.logic.getGame().getPlayerByColor(this.logic.getGame().getActiveColor())) {
 | 
			
		||||
                for (Piece piece : player.getPieces()) {
 | 
			
		||||
                    if (piece.getState() == PieceState.ACTIVE) {
 | 
			
		||||
                        if (!possibleOtherPieces.contains(piece)) {
 | 
			
		||||
                            possibleOtherPieces.add(piece);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!possibleOtherPieces.isEmpty() && !possibleOwnPieces.isEmpty()) {
 | 
			
		||||
            this.swapOwnPieces.addAll(possibleOtherPieces);
 | 
			
		||||
            this.swapOtherPieces.addAll(possibleOwnPieces);
 | 
			
		||||
            this.cards.add(card);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to visit the given card parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as a ShieldCard object.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void visit(ShieldCard card) {
 | 
			
		||||
        for (Piece piece : this.logic.getGame().getPlayerByColor(this.logic.getGame().getActiveColor()).getPieces()) {
 | 
			
		||||
            if (piece.getState() == PieceState.ACTIVE) {
 | 
			
		||||
                if (!this.shieldPieces.contains(piece)) {
 | 
			
		||||
                    this.shieldPieces.add(piece);
 | 
			
		||||
                }
 | 
			
		||||
                if (!this.cards.contains(card)) {
 | 
			
		||||
                    this.cards.add(card);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to visit the given card parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as a HiddenCard object.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void visit(HiddenCard card) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return cards attribute of ServerCardVisitor class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return cards as a List of PowerCard objects.
 | 
			
		||||
     */
 | 
			
		||||
    public List<PowerCard> getCards() {
 | 
			
		||||
        return this.cards;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return shieldPieces attribute of ServerCardVisitor class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return shieldPieces as a List of Piece objects.
 | 
			
		||||
     */
 | 
			
		||||
    public List<Piece> getShieldPieces() {
 | 
			
		||||
        return this.shieldPieces;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return swapOwnPieces attribute of ServerCardVisitor class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return swapOwnPieces as a List of Piece objects.
 | 
			
		||||
     */
 | 
			
		||||
    public List<Piece> getSwapOwnPieces() {
 | 
			
		||||
        return this.swapOwnPieces;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to return swapOtherPieces attribute of ServerCardVisitor class.
 | 
			
		||||
     *
 | 
			
		||||
     * @return swapOtherPieces as a List of Piece objects.
 | 
			
		||||
     */
 | 
			
		||||
    public List<Piece> getSwapOtherPieces() {
 | 
			
		||||
        return this.swapOtherPieces;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,39 @@
 | 
			
		||||
package pp.mdga.visitor;
 | 
			
		||||
 | 
			
		||||
import pp.mdga.game.card.HiddenCard;
 | 
			
		||||
import pp.mdga.game.card.ShieldCard;
 | 
			
		||||
import pp.mdga.game.card.SwapCard;
 | 
			
		||||
import pp.mdga.game.card.TurboCard;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This interface will be used to realize the visitor pattern inside the application.
 | 
			
		||||
 */
 | 
			
		||||
public interface Visitor {
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to visit the given card parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as a TurboCard object.
 | 
			
		||||
     */
 | 
			
		||||
    void visit(TurboCard card);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to visit the given card parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as a SwapCard object.
 | 
			
		||||
     */
 | 
			
		||||
    void visit(SwapCard card);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to visit the given card parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as a ShieldCard oblect
 | 
			
		||||
     */
 | 
			
		||||
    void visit(ShieldCard card);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method will be used to visit the given card parameter.
 | 
			
		||||
     *
 | 
			
		||||
     * @param card as a HiddenCard object.
 | 
			
		||||
     */
 | 
			
		||||
    void visit(HiddenCard card);
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user