summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/luxons/sevenwonders/game/Game.java135
-rw-r--r--src/main/java/org/luxons/sevenwonders/game/Move.java5
-rw-r--r--src/main/java/org/luxons/sevenwonders/game/api/Table.java26
-rw-r--r--src/main/java/org/luxons/sevenwonders/game/cards/Card.java18
4 files changed, 131 insertions, 53 deletions
diff --git a/src/main/java/org/luxons/sevenwonders/game/Game.java b/src/main/java/org/luxons/sevenwonders/game/Game.java
index e9962e10..3e0c2839 100644
--- a/src/main/java/org/luxons/sevenwonders/game/Game.java
+++ b/src/main/java/org/luxons/sevenwonders/game/Game.java
@@ -6,6 +6,7 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
+import org.luxons.sevenwonders.game.api.HandCard;
import org.luxons.sevenwonders.game.api.PlayerTurnInfo;
import org.luxons.sevenwonders.game.api.Table;
import org.luxons.sevenwonders.game.boards.Board;
@@ -56,34 +57,60 @@ public class Game {
hands = decks.deal(currentAge, table.getNbPlayers());
}
- public List<PlayerTurnInfo> startTurn() {
- return hands.entrySet()
- .stream()
- .map(e -> table.createPlayerTurnInfo(e.getKey(), e.getValue()))
- .peek(ptu -> ptu.setCurrentAge(currentAge))
+ public List<PlayerTurnInfo> getTurnInfo() {
+ return hands.entrySet().stream().map(e -> createPlayerTurnInfo(e.getKey(), e.getValue()))
.collect(Collectors.toList());
}
+ private PlayerTurnInfo createPlayerTurnInfo(int playerIndex, List<Card> cards) {
+ PlayerTurnInfo pti = new PlayerTurnInfo(playerIndex, table);
+ pti.setHand(createHand(playerIndex, cards));
+ pti.setCurrentAge(currentAge);
+ return pti;
+ }
+
+ private List<HandCard> createHand(int playerIndex, List<Card> cards) {
+ return cards.stream().map(c -> new HandCard(c, table, playerIndex)).collect(Collectors.toList());
+ }
+
public void prepareCard(Move move) throws InvalidMoveException {
+ validate(move);
+ preparedMoves.put(move.getPlayerIndex(), move);
+ }
+
+ private void validate(Move move) throws InvalidMoveException {
+ List<Card> hand = hands.get(move.getPlayerIndex());
+ if (hand == null) {
+ throw new InvalidMoveException("Invalid player index " + move.getPlayerIndex());
+ }
+ Card card = decks.getCard(move.getCardName());
+ if (!hand.contains(card)) {
+ throw new InvalidMoveException(
+ "Player " + move.getPlayerIndex() + " does not have the card " + move.getCardName());
+ }
if (!move.isValid(table)) {
- throw new InvalidMoveException();
+ throw new InvalidMoveException(
+ "Player " + move.getPlayerIndex() + " cannot play the card " + move.getCardName());
}
- preparedMoves.put(move.getPlayerIndex(), move);
}
public boolean areAllPlayersReady() {
return preparedMoves.size() == players.size();
}
- public List<Move> playTurn() {
+ public void playTurn() {
List<Move> playedMoves = mapToList(preparedMoves);
// cards need to be all placed first as some effects depend on just-played cards
- placePreparedCards();
- playPreparedCards();
+ placePreparedCards(playedMoves);
+ activatePlayedCards(playedMoves);
+ table.setLastPlayedMoves(playedMoves);
preparedMoves.clear();
-
- return playedMoves;
+ if (endOfAgeReached()) {
+ startNewAge();
+ } else {
+ rotateHands();
+ }
}
private static List<Move> mapToList(Map<Integer, Move> movesPerPlayer) {
@@ -98,36 +125,63 @@ public class Game {
return moves;
}
- private void placePreparedCards() {
- preparedMoves.forEach((playerIndex, move) -> {
- switch (move.getType()) {
- case PLAY:
- table.placeCard(playerIndex, decks.getCard(move.getCardName()));
- break;
- case UPGRADE_WONDER:
- table.upgradeWonderStage(playerIndex);
- break;
- case DISCARD:
- discardedCards.add(decks.getCard(move.getCardName()));
- break;
- }
+ private void placePreparedCards(List<Move> playedMoves) {
+ playedMoves.forEach(move -> {
+ placeCard(move);
+ Card card = decks.getCard(move.getCardName());
+ hands.get(move.getPlayerIndex()).remove(card);
});
}
- private void playPreparedCards() {
- preparedMoves.forEach((playerIndex, move) -> {
- switch (move.getType()) {
- case PLAY:
- table.activateCard(playerIndex, decks.getCard(move.getCardName()));
- break;
- case UPGRADE_WONDER:
- table.activateCurrentWonderStage(playerIndex);
- break;
- case DISCARD:
- table.discard(playerIndex, settings.getDiscardedCardGold());
- break;
- }
- });
+ private void placeCard(Move move) {
+ switch (move.getType()) {
+ case PLAY:
+ table.placeCard(move.getPlayerIndex(), decks.getCard(move.getCardName()));
+ break;
+ case UPGRADE_WONDER:
+ table.upgradeWonderStage(move.getPlayerIndex());
+ break;
+ case DISCARD:
+ discardedCards.add(decks.getCard(move.getCardName()));
+ break;
+ }
+ }
+
+ private void activatePlayedCards(List<Move> playedMoves) {
+ playedMoves.forEach(this::activateCard);
+ }
+
+ private void activateCard(Move move) {
+ switch (move.getType()) {
+ case PLAY:
+ table.activateCard(move.getPlayerIndex(), decks.getCard(move.getCardName()));
+ break;
+ case UPGRADE_WONDER:
+ table.activateCurrentWonderStage(move.getPlayerIndex());
+ break;
+ case DISCARD:
+ table.discard(move.getPlayerIndex(), settings.getDiscardedCardGold());
+ break;
+ }
+ }
+
+ private boolean endOfAgeReached() {
+ return hands.get(0).size() == 1;
+ }
+
+ private void rotateHands() {
+ int offset = getHandRotationOffset();
+ Map<Integer, List<Card>> newHands = new HashMap<>(hands.size());
+ for (int i = 0; i < players.size(); i++) {
+ int newIndex = Math.floorMod(i + offset, players.size());
+ newHands.put(newIndex, hands.get(i));
+ }
+ hands = newHands;
+ }
+
+ private int getHandRotationOffset() {
+ // clockwise at age 1, and alternating
+ return currentAge % 2 == 0 ? -1 : 1;
}
private static class MissingPreparedMoveException extends RuntimeException {
@@ -137,5 +191,8 @@ public class Game {
}
private static class InvalidMoveException extends RuntimeException {
+ InvalidMoveException(String message) {
+ super(message);
+ }
}
}
diff --git a/src/main/java/org/luxons/sevenwonders/game/Move.java b/src/main/java/org/luxons/sevenwonders/game/Move.java
index ed9dfa07..f1fa97aa 100644
--- a/src/main/java/org/luxons/sevenwonders/game/Move.java
+++ b/src/main/java/org/luxons/sevenwonders/game/Move.java
@@ -49,7 +49,10 @@ public class Move {
}
public boolean isValid(Table table) {
- // TODO
+ if (moveType == MoveType.DISCARD) {
+ return true;
+ }
+ // TODO create a version of the Move class with actual card data?
return false;
}
}
diff --git a/src/main/java/org/luxons/sevenwonders/game/api/Table.java b/src/main/java/org/luxons/sevenwonders/game/api/Table.java
index 9d33c779..7603f532 100644
--- a/src/main/java/org/luxons/sevenwonders/game/api/Table.java
+++ b/src/main/java/org/luxons/sevenwonders/game/api/Table.java
@@ -1,8 +1,8 @@
package org.luxons.sevenwonders.game.api;
import java.util.List;
-import java.util.stream.Collectors;
+import org.luxons.sevenwonders.game.Move;
import org.luxons.sevenwonders.game.boards.Board;
import org.luxons.sevenwonders.game.boards.RelativeBoardPosition;
import org.luxons.sevenwonders.game.cards.Card;
@@ -17,11 +17,17 @@ public class Table {
private final List<Board> boards;
+ private List<Move> lastPlayedMoves;
+
public Table(List<Board> boards) {
this.nbPlayers = boards.size();
this.boards = boards;
}
+ public int getNbPlayers() {
+ return nbPlayers;
+ }
+
public List<Board> getBoards() {
return boards;
}
@@ -34,8 +40,12 @@ public class Table {
return boards.get(position.getIndexFrom(playerIndex, nbPlayers));
}
- public int getNbPlayers() {
- return nbPlayers;
+ public List<Move> getLastPlayedMoves() {
+ return lastPlayedMoves;
+ }
+
+ public void setLastPlayedMoves(List<Move> lastPlayedMoves) {
+ this.lastPlayedMoves = lastPlayedMoves;
}
public void placeCard(int playerIndex, Card card) {
@@ -61,14 +71,4 @@ public class Table {
Board board = boards.get(playerIndex);
board.setGold(board.getGold() + goldBonus);
}
-
- public PlayerTurnInfo createPlayerTurnInfo(int playerIndex, List<Card> cards) {
- PlayerTurnInfo pti = new PlayerTurnInfo(playerIndex, this);
- pti.setHand(createHand(playerIndex, cards));
- return pti;
- }
-
- private List<HandCard> createHand(int playerIndex, List<Card> cards) {
- return cards.stream().map(c -> new HandCard(c, this, playerIndex)).collect(Collectors.toList());
- }
}
diff --git a/src/main/java/org/luxons/sevenwonders/game/cards/Card.java b/src/main/java/org/luxons/sevenwonders/game/cards/Card.java
index e2d1d940..148d7ed0 100644
--- a/src/main/java/org/luxons/sevenwonders/game/cards/Card.java
+++ b/src/main/java/org/luxons/sevenwonders/game/cards/Card.java
@@ -1,6 +1,7 @@
package org.luxons.sevenwonders.game.cards;
import java.util.List;
+import java.util.Objects;
import org.luxons.sevenwonders.game.api.Table;
import org.luxons.sevenwonders.game.boards.Board;
@@ -81,6 +82,23 @@ public class Card {
}
@Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ Card card = (Card)o;
+ return Objects.equals(name, card.name);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name);
+ }
+
+ @Override
public String toString() {
return "Card{" + "name='" + name + '\'' + ", color=" + color + ", requirements=" + requirements + ", effects="
+ effects + '}';
bgstack15