This commit is contained in:
Hanno Fleischer
2024-12-06 02:13:08 +01:00
5 changed files with 323 additions and 0 deletions

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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));
}
}
}

View File

@@ -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));
}
}
}

View File

@@ -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.
}
}