diff options
author | Joffrey BION <joffrey.bion@gmail.com> | 2016-12-15 00:41:18 +0100 |
---|---|---|
committer | Joffrey BION <joffrey.bion@gmail.com> | 2016-12-15 00:43:51 +0100 |
commit | 5c937e0fb48332f0a3e5114423359ccc9869154b (patch) | |
tree | 7868c241429a0ba9b6b63c0bfcde82791a6e21e1 /src/main | |
parent | Add deal() method to the Decks (diff) | |
download | seven-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')
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() { |