Merge commit
This commit is contained in:
@@ -1,195 +1,25 @@
|
||||
package pp.mdga.server;
|
||||
|
||||
import pp.mdga.game.Color;
|
||||
import pp.mdga.game.Node;
|
||||
import pp.mdga.game.Piece;
|
||||
import pp.mdga.game.PieceState;
|
||||
import pp.mdga.game.PlayerData;
|
||||
import pp.mdga.message.client.*;
|
||||
import pp.mdga.message.server.EndOfTurn;
|
||||
import pp.mdga.message.server.PossibleCard;
|
||||
import java.lang.System.Logger;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
/**
|
||||
* Defines the behavior and state transitions for the server-side game logic.
|
||||
* Different states of the game logic implement this interface to handle various game events and actions.
|
||||
*/
|
||||
public class ServerState {
|
||||
/**
|
||||
* The server logic object.
|
||||
*/
|
||||
private final ServerGameLogic logic;
|
||||
|
||||
public abstract class ServerState implements Observer{
|
||||
protected static final Logger LOGGER = System.getLogger(ServerState.class.getName());
|
||||
protected ServerState parent;
|
||||
protected ServerGameLogic logic;
|
||||
|
||||
public ServerState(ServerState parent, ServerGameLogic logic) {
|
||||
this.parent = parent;
|
||||
/**
|
||||
* Constructs a server state of the specified game logic.
|
||||
*
|
||||
* @param logic the game logic
|
||||
*/
|
||||
public ServerState(ServerGameLogic logic) {
|
||||
this.logic = logic;
|
||||
}
|
||||
|
||||
public void entry() { /* do nothing */ }
|
||||
|
||||
public void receivedAnimationEnd(AnimationEnd msg) { /* do nothing */ }
|
||||
|
||||
// todo piece?
|
||||
public void receivedConfirmPiece(Piece piece) { /* do nothing */ }
|
||||
|
||||
public void receivedDeselectTSK(DeselectTSK msg) { /* do nothing */ }
|
||||
|
||||
public void receivedNoPowerCard(NoPowerCard msg) { /* do nothing */ }
|
||||
|
||||
public void receivedNotReady(LobbyNotReady msg) { /* do nothing */ }
|
||||
|
||||
public void receivedReady(LobbyReady msg) { /* do nothing */ }
|
||||
|
||||
public void receivedRequestDice(RequestDice msg) { /* do nothing */ }
|
||||
|
||||
// todo msg?
|
||||
public void receivedRollRankingDice() { /* do nothing */ }
|
||||
|
||||
public void receivedSelectCard(SelectCard msg) { /* do nothing */ }
|
||||
|
||||
public void receivedSelectTSK(SelectTSK msg) { /* do nothing */ }
|
||||
|
||||
public void receivedSelectedPieces(SelectedPieces msg) { /* do nothing */ }
|
||||
|
||||
public void receivedStartGame(ClientStartGame msg) { /* do nothing */ }
|
||||
|
||||
public void sentEndOfTurn(EndOfTurn msg) { /* do nothing */ }
|
||||
|
||||
public void sentPossibleCard(PossibleCard msg) { /* do nothing */ }
|
||||
|
||||
// todo msg?, sent to everyone?
|
||||
public void sentRankingResponse() { /* do nothing */ }
|
||||
|
||||
public void gotoState(ServerState state) {
|
||||
throw new IllegalStateException("not in a statemachine");
|
||||
}
|
||||
|
||||
public ServerState getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
public void update() { /* do nothing */ }
|
||||
|
||||
/**
|
||||
* This method is used to calculate the steps a piece can move
|
||||
*
|
||||
* @return the steps a piece can move
|
||||
*/
|
||||
private int calculateSteps(){
|
||||
return logic.getGame().getDiceEyes() * logic.getGame().getDiceModifier();
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is used to test if u can move a piece
|
||||
*
|
||||
* @param piece the piece to be moved
|
||||
* @return true if the piece can be moved, false otherwise
|
||||
*/
|
||||
protected boolean tryMove(Piece piece) {
|
||||
if (piece.getState() == PieceState.HOME){
|
||||
return tryHomeMove(piece, calculateSteps());
|
||||
} else {
|
||||
int homeMoves = getHomeMoves(piece, calculateSteps());
|
||||
if (homeMoves > 0){
|
||||
return tryHomeMove(piece, homeMoves);
|
||||
} else {
|
||||
return tryInfieldMove(piece, calculateSteps());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is used to determine if a piece would move into the home area.
|
||||
*
|
||||
* @param piece the piece to be moved
|
||||
* @param steps the steps the piece would move
|
||||
* @return the number of steps the piece would move into the home area
|
||||
*/
|
||||
protected int getHomeMoves(Piece piece, int steps) {
|
||||
int figureIndex = logic.getGame().getBoard().getInfieldIndexOfPiece(piece);
|
||||
Color col = piece.getColor();
|
||||
int startIndex = logic.getGame().getBoard().getPlayerData().get(col).getStartNodeIndex();
|
||||
int moveIndex = startIndex + steps;
|
||||
if (moveIndex > logic.getGame().getBoard().getInfield().length){
|
||||
moveIndex %= logic.getGame().getBoard().getInfield().length;
|
||||
if(moveIndex >= startIndex){
|
||||
return moveIndex - startIndex + 1;
|
||||
}
|
||||
} else if (figureIndex < startIndex && moveIndex >= startIndex){
|
||||
return moveIndex - startIndex + 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is used to determine if a piece can move in the infield
|
||||
*
|
||||
* @param piece the piece to be moved
|
||||
* @param steps the steps the piece would move
|
||||
* @return true if the piece can move in the infield, false otherwise
|
||||
*/
|
||||
protected boolean tryInfieldMove(Piece piece, int steps){
|
||||
int figureIndex = logic.getGame().getBoard().getInfieldIndexOfPiece(piece);
|
||||
int moveIndex = (figureIndex + steps) % logic.getGame().getBoard().getInfield().length;
|
||||
Piece occupant = logic.getGame().getBoard().getInfield()[moveIndex].getOccupant();
|
||||
if(occupant != null){
|
||||
return occupant.getColor() != piece.getColor();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is used to determine if a piece can move inside the home area
|
||||
*
|
||||
* @param piece the piece to be moved
|
||||
* @param steps the steps the piece would move
|
||||
* @return true if the piece can move into the home area, false otherwise
|
||||
*/
|
||||
protected boolean tryHomeMove(Piece piece, int steps){
|
||||
Color col = piece.getColor();
|
||||
PlayerData playerData = logic.getGame().getBoard().getPlayerData().get(col);
|
||||
Node[] homeNodes = playerData.getHomeNodes();
|
||||
int index;
|
||||
|
||||
if (playerData.homeIncludes(piece)){
|
||||
index = playerData.getIndexInHome(piece);
|
||||
} else {
|
||||
index = 0;
|
||||
}
|
||||
if(index + steps >= homeNodes.length){
|
||||
return false;
|
||||
} else {
|
||||
for(int i = index; i <= index + steps; i++){
|
||||
if(homeNodes[i].getOccupant() != null){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is used to get the pieces that can be moved
|
||||
*
|
||||
* @param color the color of the pieces
|
||||
* @return the pieces that can be moved
|
||||
*/
|
||||
protected List<Piece> getMoveablePieces(Color color) {
|
||||
ArrayList<Piece> moveablePieces = new ArrayList<>();
|
||||
ArrayList<Piece> pieces = new ArrayList<>();
|
||||
for (Piece piece : logic.getGame().getBoard().getPlayerData().get(color).getPieces()) {
|
||||
if(piece.getState() == PieceState.ACTIVE || piece.getState() == PieceState.HOME){
|
||||
pieces.add(piece);
|
||||
}
|
||||
}
|
||||
for (Piece piece : pieces) {
|
||||
if (tryMove(piece)) {
|
||||
moveablePieces.add(piece);
|
||||
}
|
||||
}
|
||||
return moveablePieces;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getClass().getSimpleName();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user