summaryrefslogtreecommitdiff
path: root/src/main/java/org/luxons/sevenwonders
diff options
context:
space:
mode:
authorJoffrey BION <joffrey.bion@gmail.com>2016-12-15 00:41:18 +0100
committerJoffrey BION <joffrey.bion@gmail.com>2016-12-15 00:43:51 +0100
commit5c937e0fb48332f0a3e5114423359ccc9869154b (patch)
tree7868c241429a0ba9b6b63c0bfcde82791a6e21e1 /src/main/java/org/luxons/sevenwonders
parentAdd deal() method to the Decks (diff)
downloadseven-wonders-5c937e0fb48332f0a3e5114423359ccc9869154b.tar.gz
seven-wonders-5c937e0fb48332f0a3e5114423359ccc9869154b.tar.bz2
seven-wonders-5c937e0fb48332f0a3e5114423359ccc9869154b.zip
Improve card requirements management
- Add chain-related fields to the Card - Add helpers methods isAffordable, isPlayable and the likes - Remove the card addition to the board as it is supposed to be separately from applying the effect of the card
Diffstat (limited to 'src/main/java/org/luxons/sevenwonders')
-rw-r--r--src/main/java/org/luxons/sevenwonders/game/boards/Board.java4
-rw-r--r--src/main/java/org/luxons/sevenwonders/game/cards/Card.java42
-rw-r--r--src/main/java/org/luxons/sevenwonders/game/cards/Requirements.java12
-rw-r--r--src/main/java/org/luxons/sevenwonders/game/data/definitions/CardDefinition.java2
4 files changed, 50 insertions, 10 deletions
diff --git a/src/main/java/org/luxons/sevenwonders/game/boards/Board.java b/src/main/java/org/luxons/sevenwonders/game/boards/Board.java
index d2fe5c7d..08bedb89 100644
--- a/src/main/java/org/luxons/sevenwonders/game/boards/Board.java
+++ b/src/main/java/org/luxons/sevenwonders/game/boards/Board.java
@@ -53,6 +53,10 @@ public class Board {
return (int) playedCards.stream().filter(c -> colorFilter.contains(c.getColor())).count();
}
+ public boolean isPlayed(String cardName) {
+ return getPlayedCards().stream().map(Card::getName).filter(name -> name.equals(cardName)).count() > 0;
+ }
+
public Production getProduction() {
return production;
}
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 9840e260..cc2275a2 100644
--- a/src/main/java/org/luxons/sevenwonders/game/cards/Card.java
+++ b/src/main/java/org/luxons/sevenwonders/game/cards/Card.java
@@ -13,13 +13,20 @@ public class Card {
private final Requirements requirements;
+ private final String chainParent;
+
private final List<Effect> effects;
- public Card(String name, Color color, Requirements requirements, List<Effect> effects) {
+ private final List<String> chainChildren;
+
+ public Card(String name, Color color, Requirements requirements, String chainParent, List<Effect> effects,
+ List<String> chainChildren) {
this.name = name;
this.color = color;
this.requirements = requirements;
+ this.chainParent = chainParent;
this.effects = effects;
+ this.chainChildren = chainChildren;
}
public String getName() {
@@ -30,6 +37,10 @@ public class Card {
return color;
}
+ public String getChainParent() {
+ return chainParent;
+ }
+
public Requirements getRequirements() {
return requirements;
}
@@ -38,12 +49,29 @@ public class Card {
return effects;
}
- public void play(Board board, Board leftNeighbourBoard, Board rightNeighbourBoard) {
- // adding the card must be done first, as some effects count the number of cards
- // FIXME this is actually broken as ALL cards in the turn need to be added to the board before any effect
- board.addCard(this);
- requirements.pay(board);
- effects.forEach(e -> e.apply(board, leftNeighbourBoard, rightNeighbourBoard));
+ public List<String> getChainChildren() {
+ return chainChildren;
+ }
+
+ public boolean isChainableOn(Board board) {
+ return board.isPlayed(chainParent);
+ }
+
+ public boolean isAffordedBy(Board board) {
+ return requirements.isAffordedBy(board);
+ }
+
+ public boolean isPlayable(Board board, Board left, Board right) {
+ return !board.isPlayed(name) && (isChainableOn(board) || requirements.isAffordedBy(board, left, right));
+ }
+
+ public void applyTo(Board board, Board left, Board right) {
+ // TODO add paid resources cost deduction
+ if (!isChainableOn(board)) {
+ // TODO add paid resources exemption
+ requirements.pay(board);
+ }
+ effects.forEach(e -> e.apply(board, left, right));
}
@Override
diff --git a/src/main/java/org/luxons/sevenwonders/game/cards/Requirements.java b/src/main/java/org/luxons/sevenwonders/game/cards/Requirements.java
index 99b8da69..644eefd6 100644
--- a/src/main/java/org/luxons/sevenwonders/game/cards/Requirements.java
+++ b/src/main/java/org/luxons/sevenwonders/game/cards/Requirements.java
@@ -25,11 +25,19 @@ public class Requirements {
this.resources = resources;
}
- public boolean isAffordedBy(Board board) {
+ boolean isAffordedBy(Board board) {
return board.getGold() >= gold && board.getProduction().contains(resources);
}
- public void pay(Board board) {
+ boolean isAffordedBy(Board board, Board left, Board right) {
+ if (isAffordedBy(board)) {
+ return true;
+ }
+ // TODO take into account resources buyable from neighbours
+ return false;
+ }
+
+ void pay(Board board) {
board.setGold(board.getGold() - gold);
}
}
diff --git a/src/main/java/org/luxons/sevenwonders/game/data/definitions/CardDefinition.java b/src/main/java/org/luxons/sevenwonders/game/data/definitions/CardDefinition.java
index a23db2fc..f46e4b4f 100644
--- a/src/main/java/org/luxons/sevenwonders/game/data/definitions/CardDefinition.java
+++ b/src/main/java/org/luxons/sevenwonders/game/data/definitions/CardDefinition.java
@@ -28,7 +28,7 @@ public class CardDefinition implements Definition<Card> {
@Override
public Card create(Settings settings) {
- return new Card(name, color, requirements, effect.create(settings));
+ return new Card(name, color, requirements, chainParent, effect.create(settings), chainChildren);
}
public String getName() {
bgstack15