From affa2ecd7e8b163de0f8869e6741215e35f09d44 Mon Sep 17 00:00:00 2001 From: Daniel Grigencha Date: Fri, 6 Dec 2024 02:11:32 +0100 Subject: [PATCH] Added 'ChoosePowerCardState', 'ShieldCardState', 'SwapCardState' and 'TurboCardState' classes. Updated the 'ChoosePowerCardState', 'ShieldCardState', 'SwapCardState' and 'TurboCardState' classes to this project. They will be used inside the power card state. In Addition, the abstract 'PowerCardAutomatonState' class was added. --- .../turn/powercard/ChoosePowerCardState.java | 125 ++++++++++++++++++ .../powercard/PowerCardAutomatonState.java | 23 ++++ .../game/turn/powercard/ShieldCardState.java | 64 +++++++++ .../game/turn/powercard/SwapCardState.java | 60 +++++++++ .../game/turn/powercard/TurboCardState.java | 51 +++++++ 5 files changed, 323 insertions(+) create mode 100644 Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ChoosePowerCardState.java create mode 100644 Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/PowerCardAutomatonState.java create mode 100644 Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ShieldCardState.java create mode 100644 Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/SwapCardState.java create mode 100644 Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/TurboCardState.java diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ChoosePowerCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ChoosePowerCardState.java new file mode 100644 index 00000000..04f24f3c --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ChoosePowerCardState.java @@ -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); + } +} diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/PowerCardAutomatonState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/PowerCardAutomatonState.java new file mode 100644 index 00000000..da8c83a7 --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/PowerCardAutomatonState.java @@ -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; + } +} diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ShieldCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ShieldCardState.java new file mode 100644 index 00000000..77a2b75d --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/ShieldCardState.java @@ -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)); + } + } +} diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/SwapCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/SwapCardState.java new file mode 100644 index 00000000..51aad9e3 --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/SwapCardState.java @@ -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)); + } + } +} diff --git a/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/TurboCardState.java b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/TurboCardState.java new file mode 100644 index 00000000..093aacb9 --- /dev/null +++ b/Projekte/mdga/model/src/main/java/pp/mdga/server/automaton/game/turn/powercard/TurboCardState.java @@ -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. + } +}