summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/Game.kt26
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/Player.kt28
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/api/HandCard.kt16
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/boards/Board.kt16
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/cards/Cards.kt17
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/cards/Hands.kt6
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/cards/Requirements.kt18
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/BonusPerBoardElement.kt13
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/Discount.kt2
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/Effect.kt6
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/EndGameEffect.kt4
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/GoldIncrease.kt2
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/InstantOwnBoardEffect.kt8
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/MilitaryReinforcements.kt2
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/ProductionIncrease.kt2
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/RawPointsIncrease.kt4
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/ScienceProgress.kt2
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/SpecialAbility.kt11
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/SpecialAbilityActivation.kt6
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/BuildWonderMove.kt24
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/CardFromHandMove.kt13
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/CopyGuildMove.kt32
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/DiscardMove.kt14
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/InvalidMoveException.kt3
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/Move.kt20
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/MoveType.kt27
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/PlayCardMove.kt20
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/PlayFreeCardMove.kt31
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/resources/BestPriceCalculator.kt26
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransaction.kt8
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransactions.kt8
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/wonders/Wonder.kt23
-rw-r--r--game-engine/src/main/kotlin/org/luxons/sevenwonders/game/wonders/WonderStage.kt14
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/GameTest.kt5
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/boards/BoardTest.kt37
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/cards/CardTest.kt33
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/cards/HandsTest.kt3
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/cards/RequirementsTest.kt39
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/BonusPerBoardElementTest.kt55
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/DiscountTest.kt16
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/GoldIncreaseTest.kt13
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/MilitaryReinforcementsTest.kt21
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/ProductionIncreaseTest.kt19
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/RawPointsIncreaseTest.kt5
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/ScienceProgressTest.kt2
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/SpecialAbilityActivationTest.kt35
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/moves/BuildWonderMoveTest.kt24
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/resources/BestPriceCalculatorTest.kt47
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/resources/ProductionTest.kt19
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/test/TestUtils.kt22
-rw-r--r--game-engine/src/test/kotlin/org/luxons/sevenwonders/game/wonders/WonderTest.kt14
51 files changed, 409 insertions, 452 deletions
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/Game.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/Game.kt
index 46c4a366..7d77a8cd 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/Game.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/Game.kt
@@ -17,10 +17,7 @@ import org.luxons.sevenwonders.game.moves.Move
import org.luxons.sevenwonders.game.score.ScoreBoard
class Game(
- val id: Long,
- val settings: Settings,
- boards: List<Board>,
- private val decks: Decks
+ val id: Long, val settings: Settings, boards: List<Board>, private val decks: Decks
) {
private val nbPlayers: Int = boards.size
private val table: Table = Table(boards)
@@ -44,7 +41,7 @@ class Game(
}
private fun createPlayerTurnInfo(playerIndex: Int): PlayerTurnInfo {
- val hand = hands.createHand(table, playerIndex)
+ val hand = hands.createHand(player(playerIndex))
val action = determineAction(hand, table.getBoard(playerIndex))
var neighbourGuildCards = emptyList<Card>()
@@ -81,17 +78,12 @@ class Game(
@Throws(InvalidMoveException::class)
fun prepareMove(playerIndex: Int, playerMove: PlayerMove): CardBack {
val card = decks.getCard(table.currentAge, playerMove.cardName)
- val move = playerMove.type.resolve(playerIndex, card, playerMove)
- validate(move)
+ val context = PlayerContext(playerIndex, table, hands[playerIndex])
+ val move = playerMove.type.resolve(playerMove, card, context)
preparedMoves[playerIndex] = move
return card.back
}
- @Throws(InvalidMoveException::class)
- private fun validate(move: Move) {
- move.validate(table, hands[move.playerIndex])
- }
-
fun allPlayersPreparedTheirMove(): Boolean {
val nbExpectedMoves = currentTurnInfo.filter { it.action !== Action.WAIT }.count()
return preparedMoves.size == nbExpectedMoves
@@ -147,8 +139,8 @@ class Game(
private fun placePreparedCards(playedMoves: List<Move>) {
playedMoves.forEach { move ->
- move.place(table, discardedCards, settings)
- hands = hands.remove(move.playerIndex, move.card)
+ move.place(discardedCards, settings)
+ hands = hands.remove(move.playerContext.index, move.card)
}
}
@@ -168,9 +160,11 @@ class Game(
}
private fun activatePlayedCards(playedMoves: List<Move>) =
- playedMoves.forEach { it.activate(table, discardedCards, settings) }
+ playedMoves.forEach { it.activate(discardedCards, settings) }
+
+ fun computeScore(): ScoreBoard = ScoreBoard(table.boards.map { it.computeScore(player(it.playerIndex)) })
- fun computeScore(): ScoreBoard = ScoreBoard(table.boards.map { it.computePoints(table) })
+ private fun player(playerIndex: Int) = SimplePlayer(playerIndex, table)
private class MissingPreparedMoveException internal constructor(playerIndex: Int) :
IllegalStateException("Player $playerIndex has not prepared his move")
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/Player.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/Player.kt
new file mode 100644
index 00000000..1fc34711
--- /dev/null
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/Player.kt
@@ -0,0 +1,28 @@
+package org.luxons.sevenwonders.game
+
+import org.luxons.sevenwonders.game.api.Table
+import org.luxons.sevenwonders.game.boards.Board
+import org.luxons.sevenwonders.game.boards.RelativeBoardPosition
+import org.luxons.sevenwonders.game.cards.Card
+
+interface Player {
+ val index: Int
+ val board: Board
+ fun getBoard(relativePosition: RelativeBoardPosition): Board
+}
+
+data class SimplePlayer(
+ override val index: Int,
+ private val table: Table
+): Player {
+ override val board = table.getBoard(index)
+ override fun getBoard(relativePosition: RelativeBoardPosition) = table.getBoard(index, relativePosition)
+}
+
+data class PlayerContext(
+ override val index: Int,
+ private val table: Table,
+ val hand: List<Card>
+) : Player by SimplePlayer(index, table) {
+ val currentAge = table.currentAge
+}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/api/HandCard.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/api/HandCard.kt
index 1b11edef..22b04953 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/api/HandCard.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/api/HandCard.kt
@@ -1,20 +1,14 @@
package org.luxons.sevenwonders.game.api
+import org.luxons.sevenwonders.game.Player
import org.luxons.sevenwonders.game.cards.Card
/**
* A card with contextual information relative to the hand it is sitting in. The extra information is especially useful
* because it frees the client from a painful business logic implementation.
*/
-class HandCard(val card: Card, table: Table, playerIndex: Int) {
-
- val isChainable: Boolean
- val isFree: Boolean
- val isPlayable: Boolean = card.isPlayable(table, playerIndex)
-
- init {
- val board = table.getBoard(playerIndex)
- this.isChainable = card.isChainableOn(board)
- this.isFree = card.isFreeFor(board)
- }
+class HandCard(val card: Card, player: Player) {
+ val isChainable: Boolean = card.isChainableOn(player.board)
+ val isFree: Boolean = card.isFreeFor(player.board)
+ val isPlayable: Boolean = card.isPlayableBy(player)
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/boards/Board.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/boards/Board.kt
index 77358d03..38a80989 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/boards/Board.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/boards/Board.kt
@@ -1,7 +1,7 @@
package org.luxons.sevenwonders.game.boards
+import org.luxons.sevenwonders.game.Player
import org.luxons.sevenwonders.game.Settings
-import org.luxons.sevenwonders.game.api.Table
import org.luxons.sevenwonders.game.cards.Card
import org.luxons.sevenwonders.game.cards.Color
import org.luxons.sevenwonders.game.data.Age
@@ -74,22 +74,22 @@ class Board(val wonder: Wonder, val playerIndex: Int, settings: Settings) {
consumedFreeCards[age] = true
}
- fun computePoints(table: Table): PlayerScore = PlayerScore(
+ fun computeScore(player: Player): PlayerScore = PlayerScore(
gold, mapOf(
- ScoreCategory.CIVIL to computePointsForCards(table, Color.BLUE),
+ ScoreCategory.CIVIL to computePointsForCards(player, Color.BLUE),
ScoreCategory.MILITARY to military.totalPoints,
ScoreCategory.SCIENCE to science.computePoints(),
- ScoreCategory.TRADE to computePointsForCards(table, Color.YELLOW),
- ScoreCategory.GUILD to computePointsForCards(table, Color.PURPLE),
- ScoreCategory.WONDER to wonder.computePoints(table, playerIndex),
+ ScoreCategory.TRADE to computePointsForCards(player, Color.YELLOW),
+ ScoreCategory.GUILD to computePointsForCards(player, Color.PURPLE),
+ ScoreCategory.WONDER to wonder.computePoints(player),
ScoreCategory.GOLD to computeGoldPoints()
)
)
- private fun computePointsForCards(table: Table, color: Color): Int =
+ private fun computePointsForCards(player: Player, color: Color): Int =
playedCards.filter { it.color === color }
.flatMap { it.effects }
- .map { it.computePoints(table, playerIndex) }
+ .map { it.computePoints(player) }
.sum()
private fun computeGoldPoints(): Int = gold / 3 * pointsPer3Gold
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/cards/Cards.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/cards/Cards.kt
index cf94bef4..2c22ca54 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/cards/Cards.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/cards/Cards.kt
@@ -1,6 +1,6 @@
package org.luxons.sevenwonders.game.cards
-import org.luxons.sevenwonders.game.api.Table
+import org.luxons.sevenwonders.game.Player
import org.luxons.sevenwonders.game.boards.Board
import org.luxons.sevenwonders.game.effects.Effect
import org.luxons.sevenwonders.game.resources.ResourceTransactions
@@ -27,17 +27,16 @@ data class Card(
private fun isFreeWithoutChainingOn(board: Board) =
isAllowedOnBoard(board) && requirements.areMetWithoutNeighboursBy(board) && requirements.gold == 0
- fun isPlayable(table: Table, playerIndex: Int): Boolean {
- val board = table.getBoard(playerIndex)
- return isAllowedOnBoard(board) && (isChainableOn(board) || requirements.areMetBy(table, playerIndex))
+ fun isPlayableBy(player: Player): Boolean {
+ val board = player.board
+ return isAllowedOnBoard(board) && (isChainableOn(board) || requirements.areMetBy(player))
}
- fun applyTo(table: Table, playerIndex: Int, transactions: ResourceTransactions) {
- val playerBoard = table.getBoard(playerIndex)
- if (!isChainableOn(playerBoard)) {
- requirements.pay(table, playerIndex, transactions)
+ fun applyTo(player: Player, transactions: ResourceTransactions) {
+ if (!isChainableOn(player.board)) {
+ requirements.pay(player, transactions)
}
- effects.forEach { e -> e.apply(table, playerIndex) }
+ effects.forEach { it.applyTo(player) }
}
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/cards/Hands.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/cards/Hands.kt
index 50959596..c64e1886 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/cards/Hands.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/cards/Hands.kt
@@ -1,7 +1,7 @@
package org.luxons.sevenwonders.game.cards
+import org.luxons.sevenwonders.game.Player
import org.luxons.sevenwonders.game.api.HandCard
-import org.luxons.sevenwonders.game.api.Table
class Hands internal constructor(private val hands: List<List<Card>>) {
@@ -23,8 +23,8 @@ class Hands internal constructor(private val hands: List<List<Card>>) {
return Hands(mutatedHands)
}
- fun createHand(table: Table, playerIndex: Int): List<HandCard> {
- return hands[playerIndex].map { c -> HandCard(c, table, playerIndex) }
+ fun createHand(player: Player): List<HandCard> {
+ return hands[player.index].map { c -> HandCard(c, player) }
}
fun rotate(direction: HandRotationDirection): Hands {
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/cards/Requirements.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/cards/Requirements.kt
index 4417620f..c253f86c 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/cards/Requirements.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/cards/Requirements.kt
@@ -1,6 +1,6 @@
package org.luxons.sevenwonders.game.cards
-import org.luxons.sevenwonders.game.api.Table
+import org.luxons.sevenwonders.game.Player
import org.luxons.sevenwonders.game.boards.Board
import org.luxons.sevenwonders.game.resources.ResourceTransactions
import org.luxons.sevenwonders.game.resources.Resources
@@ -33,9 +33,7 @@ data class Requirements @JvmOverloads constructor(
if (!hasRequiredGold(board, boughtResources)) {
return false
}
- return if (producesRequiredResources(board)) {
- true
- } else producesRequiredResourcesWithHelp(board, boughtResources)
+ return producesRequiredResources(board) || producesRequiredResourcesWithHelp(board, boughtResources)
}
/**
@@ -47,15 +45,15 @@ data class Requirements @JvmOverloads constructor(
*
* @return true if the given player's board could meet these requirements
*/
- fun areMetBy(table: Table, playerIndex: Int): Boolean {
- val board = table.getBoard(playerIndex)
+ fun areMetBy(player: Player): Boolean {
+ val board = player.board
if (!hasRequiredGold(board)) {
return false
}
if (producesRequiredResources(board)) {
return true
}
- val bestPrice = bestPrice(resources, table, playerIndex)
+ val bestPrice = bestPrice(resources, player)
return bestPrice != null && bestPrice <= board.gold - gold
}
@@ -78,8 +76,8 @@ data class Requirements @JvmOverloads constructor(
return board.production.contains(remainingResources)
}
- fun pay(table: Table, playerIndex: Int, transactions: ResourceTransactions) {
- table.getBoard(playerIndex).removeGold(gold)
- transactions.execute(table, playerIndex)
+ fun pay(player: Player, transactions: ResourceTransactions) {
+ player.board.removeGold(gold)
+ transactions.execute(player)
}
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/BonusPerBoardElement.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/BonusPerBoardElement.kt
index defd896a..bcac2a9c 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/BonusPerBoardElement.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/BonusPerBoardElement.kt
@@ -1,6 +1,6 @@
package org.luxons.sevenwonders.game.effects
-import org.luxons.sevenwonders.game.api.Table
+import org.luxons.sevenwonders.game.Player
import org.luxons.sevenwonders.game.boards.Board
import org.luxons.sevenwonders.game.boards.RelativeBoardPosition
import org.luxons.sevenwonders.game.cards.Color
@@ -19,15 +19,12 @@ data class BonusPerBoardElement (
val colors: List<Color>? = null // only relevant if type=CARD
) : Effect {
- override fun apply(table: Table, playerIndex: Int) {
- val goldGain = gold * nbMatchingElementsIn(table, playerIndex)
- table.getBoard(playerIndex).addGold(goldGain)
- }
+ override fun applyTo(player: Player) = player.board.addGold(gold * nbMatchingElementsFor(player))
- override fun computePoints(table: Table, playerIndex: Int): Int = points * nbMatchingElementsIn(table, playerIndex)
+ override fun computePoints(player: Player): Int = points * nbMatchingElementsFor(player)
- private fun nbMatchingElementsIn(table: Table, playerIndex: Int): Int = boards
- .map { pos -> table.getBoard(playerIndex, pos) }
+ private fun nbMatchingElementsFor(player: Player): Int = boards
+ .map(player::getBoard)
.map(::nbMatchingElementsIn)
.sum()
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/Discount.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/Discount.kt
index b1455397..56e9befb 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/Discount.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/Discount.kt
@@ -10,7 +10,7 @@ data class Discount(
val discountedPrice: Int = 1
) : InstantOwnBoardEffect() {
- public override fun apply(board: Board) {
+ public override fun applyTo(board: Board) {
val rules = board.tradingRules
for (type in resourceTypes) {
providers.forEach { rules.setCost(type, it, discountedPrice) }
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/Effect.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/Effect.kt
index 3bf48086..c3b7b140 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/Effect.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/Effect.kt
@@ -1,6 +1,6 @@
package org.luxons.sevenwonders.game.effects
-import org.luxons.sevenwonders.game.api.Table
+import org.luxons.sevenwonders.game.Player
/**
* Represents an effect than can be applied to a player's board when playing a card or building his wonder. The effect
@@ -9,7 +9,7 @@ import org.luxons.sevenwonders.game.api.Table
*/
interface Effect {
- fun apply(table: Table, playerIndex: Int)
+ fun applyTo(player: Player)
- fun computePoints(table: Table, playerIndex: Int): Int
+ fun computePoints(player: Player): Int
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/EndGameEffect.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/EndGameEffect.kt
index 392f53b9..09b86ab7 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/EndGameEffect.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/EndGameEffect.kt
@@ -1,9 +1,9 @@
package org.luxons.sevenwonders.game.effects
-import org.luxons.sevenwonders.game.api.Table
+import org.luxons.sevenwonders.game.Player
abstract class EndGameEffect : Effect {
// EndGameEffects don't do anything when applied to the board, they simply give more points in the end
- override fun apply(table: Table, playerIndex: Int) = Unit
+ override fun applyTo(player: Player) = Unit
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/GoldIncrease.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/GoldIncrease.kt
index 0d206231..6f5e5b2a 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/GoldIncrease.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/GoldIncrease.kt
@@ -4,5 +4,5 @@ import org.luxons.sevenwonders.game.boards.Board
data class GoldIncrease(val amount: Int) : InstantOwnBoardEffect() {
- public override fun apply(board: Board) = board.addGold(amount)
+ public override fun applyTo(board: Board) = board.addGold(amount)
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/InstantOwnBoardEffect.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/InstantOwnBoardEffect.kt
index fb26dcce..fb0d155c 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/InstantOwnBoardEffect.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/InstantOwnBoardEffect.kt
@@ -1,14 +1,14 @@
package org.luxons.sevenwonders.game.effects
-import org.luxons.sevenwonders.game.api.Table
+import org.luxons.sevenwonders.game.Player
import org.luxons.sevenwonders.game.boards.Board
abstract class InstantOwnBoardEffect : Effect {
- override fun apply(table: Table, playerIndex: Int) = apply(table.getBoard(playerIndex))
+ override fun applyTo(player: Player) = applyTo(player.board)
- protected abstract fun apply(board: Board)
+ protected abstract fun applyTo(board: Board)
// InstantEffects are only important when applied to the board, they don't give extra points in the end
- override fun computePoints(table: Table, playerIndex: Int): Int = 0
+ override fun computePoints(player: Player): Int = 0
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/MilitaryReinforcements.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/MilitaryReinforcements.kt
index ad4d64eb..e01e9481 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/MilitaryReinforcements.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/MilitaryReinforcements.kt
@@ -4,5 +4,5 @@ import org.luxons.sevenwonders.game.boards.Board
data class MilitaryReinforcements(val count: Int) : InstantOwnBoardEffect() {
- public override fun apply(board: Board) = board.military.addShields(count)
+ public override fun applyTo(board: Board) = board.military.addShields(count)
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/ProductionIncrease.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/ProductionIncrease.kt
index aa56705e..e8578eed 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/ProductionIncrease.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/ProductionIncrease.kt
@@ -5,7 +5,7 @@ import org.luxons.sevenwonders.game.resources.Production
data class ProductionIncrease(val production: Production, val isSellable: Boolean) : InstantOwnBoardEffect() {
- public override fun apply(board: Board) {
+ public override fun applyTo(board: Board) {
board.production.addAll(production)
if (isSellable) {
board.publicProduction.addAll(production)
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/RawPointsIncrease.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/RawPointsIncrease.kt
index ed6eb332..f075742e 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/RawPointsIncrease.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/RawPointsIncrease.kt
@@ -1,8 +1,8 @@
package org.luxons.sevenwonders.game.effects
-import org.luxons.sevenwonders.game.api.Table
+import org.luxons.sevenwonders.game.Player
data class RawPointsIncrease(val points: Int) : EndGameEffect() {
- override fun computePoints(table: Table, playerIndex: Int): Int = points
+ override fun computePoints(player: Player): Int = points
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/ScienceProgress.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/ScienceProgress.kt
index 850f8ec3..af4c0d53 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/ScienceProgress.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/ScienceProgress.kt
@@ -5,5 +5,5 @@ import org.luxons.sevenwonders.game.boards.Science
class ScienceProgress(val science: Science) : InstantOwnBoardEffect() {
- public override fun apply(board: Board) = board.science.addAll(science)
+ public override fun applyTo(board: Board) = board.science.addAll(science)
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/SpecialAbility.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/SpecialAbility.kt
index 30d57e27..deddd780 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/SpecialAbility.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/SpecialAbility.kt
@@ -1,8 +1,7 @@
package org.luxons.sevenwonders.game.effects
-import org.luxons.sevenwonders.game.api.Table
+import org.luxons.sevenwonders.game.Player
import org.luxons.sevenwonders.game.boards.Board
-import org.luxons.sevenwonders.game.cards.Card
enum class SpecialAbility {
@@ -27,14 +26,14 @@ enum class SpecialAbility {
* her two neighboring cities.
*/
COPY_GUILD {
- override fun computePoints(table: Table, playerIndex: Int): Int {
- val copiedGuild = table.getBoard(playerIndex).copiedGuild
+ override fun computePoints(player: Player): Int {
+ val copiedGuild = player.board.copiedGuild
?: throw IllegalStateException("The copied Guild has not been chosen, cannot compute points")
- return copiedGuild.effects.stream().mapToInt { e -> e.computePoints(table, playerIndex) }.sum()
+ return copiedGuild.effects.stream().mapToInt { it.computePoints(player) }.sum()
}
};
fun apply(board: Board) = board.addSpecial(this)
- open fun computePoints(table: Table, playerIndex: Int): Int = 0
+ open fun computePoints(player: Player): Int = 0
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/SpecialAbilityActivation.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/SpecialAbilityActivation.kt
index fd83d7fe..136beab1 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/SpecialAbilityActivation.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/effects/SpecialAbilityActivation.kt
@@ -1,10 +1,10 @@
package org.luxons.sevenwonders.game.effects
-import org.luxons.sevenwonders.game.api.Table
+import org.luxons.sevenwonders.game.Player
data class SpecialAbilityActivation(val specialAbility: SpecialAbility) : Effect {
- override fun apply(table: Table, playerIndex: Int) = specialAbility.apply(table.getBoard(playerIndex))
+ override fun applyTo(player: Player) = specialAbility.apply(player.board)
- override fun computePoints(table: Table, playerIndex: Int): Int = specialAbility.computePoints(table, playerIndex)
+ override fun computePoints(player: Player): Int = specialAbility.computePoints(player)
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/BuildWonderMove.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/BuildWonderMove.kt
index bbd9ebab..c4508401 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/BuildWonderMove.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/BuildWonderMove.kt
@@ -1,25 +1,23 @@
package org.luxons.sevenwonders.game.moves
+import org.luxons.sevenwonders.game.PlayerContext
import org.luxons.sevenwonders.game.Settings
import org.luxons.sevenwonders.game.api.PlayerMove
-import org.luxons.sevenwonders.game.api.Table
import org.luxons.sevenwonders.game.cards.Card
-class BuildWonderMove internal constructor(playerIndex: Int, card: Card, move: PlayerMove) :
- CardFromHandMove(playerIndex, card, move) {
+internal class BuildWonderMove(move: PlayerMove, card: Card, player: PlayerContext) :
+ CardFromHandMove(move, card, player) {
- @Throws(InvalidMoveException::class)
- override fun validate(table: Table, playerHand: List<Card>) {
- super.validate(table, playerHand)
- val board = table.getBoard(playerIndex)
- if (!board.wonder.isNextStageBuildable(table, playerIndex, transactions)) {
- throw InvalidMoveException("Player $playerIndex cannot upgrade his wonder with the given resources")
+ private val wonder = player.board.wonder
+
+ init {
+ if (!wonder.isNextStageBuildable(playerContext.board, transactions)) {
+ throw InvalidMoveException(this, "all levels are already built, or the given resources are insufficient")
}
}
- override fun place(table: Table, discardedCards: MutableList<Card>, settings: Settings) =
- table.getBoard(playerIndex).wonder.buildLevel(card.back)
+ override fun place(discardedCards: MutableList<Card>, settings: Settings) = wonder.placeCard(card.back)
- override fun activate(table: Table, discardedCards: List<Card>, settings: Settings) =
- table.getBoard(playerIndex).wonder.activateLastBuiltStage(table, playerIndex, transactions)
+ override fun activate(discardedCards: List<Card>, settings: Settings) =
+ wonder.activateLastBuiltStage(playerContext, transactions)
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/CardFromHandMove.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/CardFromHandMove.kt
index 7b084d43..17d612af 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/CardFromHandMove.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/CardFromHandMove.kt
@@ -1,16 +1,15 @@
package org.luxons.sevenwonders.game.moves
+import org.luxons.sevenwonders.game.PlayerContext
import org.luxons.sevenwonders.game.api.PlayerMove
-import org.luxons.sevenwonders.game.api.Table
import org.luxons.sevenwonders.game.cards.Card
-abstract class CardFromHandMove internal constructor(playerIndex: Int, card: Card, move: PlayerMove) :
- Move(playerIndex, card, move) {
+internal abstract class CardFromHandMove(move: PlayerMove, card: Card, player: PlayerContext) :
+ Move(move, card, player) {
- @Throws(InvalidMoveException::class)
- override fun validate(table: Table, playerHand: List<Card>) {
- if (!playerHand.contains(card)) {
- throw InvalidMoveException("Player $playerIndex does not have the card '${card.name}' in his hand")
+ init {
+ if (!player.hand.contains(card)) {
+ throw InvalidMoveException(this, "card '${card.name}' not in hand")
}
}
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/CopyGuildMove.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/CopyGuildMove.kt
index 5a017e53..3a7fe792 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/CopyGuildMove.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/CopyGuildMove.kt
@@ -1,41 +1,37 @@
package org.luxons.sevenwonders.game.moves
+import org.luxons.sevenwonders.game.PlayerContext
import org.luxons.sevenwonders.game.Settings
import org.luxons.sevenwonders.game.api.PlayerMove
-import org.luxons.sevenwonders.game.api.Table
import org.luxons.sevenwonders.game.boards.RelativeBoardPosition
import org.luxons.sevenwonders.game.cards.Card
import org.luxons.sevenwonders.game.cards.Color
import org.luxons.sevenwonders.game.effects.SpecialAbility
-class CopyGuildMove internal constructor(playerIndex: Int, card: Card, move: PlayerMove) :
- Move(playerIndex, card, move) {
+internal class CopyGuildMove(move: PlayerMove, card: Card, player: PlayerContext) : Move(move, card, player) {
- @Throws(InvalidMoveException::class)
- override fun validate(table: Table, playerHand: List<Card>) {
- val board = table.getBoard(playerIndex)
+ init {
+ val board = player.board
if (!board.hasSpecial(SpecialAbility.COPY_GUILD)) {
- throw InvalidMoveException("Player $playerIndex does not have the ability to copy guild cards")
+ throw InvalidMoveException(this, "no ability to copy guild cards")
}
if (card.color !== Color.PURPLE) {
- throw InvalidMoveException("Player $playerIndex cannot copy card ${card.name} because it is not a guild card")
+ throw InvalidMoveException(this, "card '${card.name}' is not a guild card")
}
- val leftNeighbourHasIt = neighbourHasTheCard(table, RelativeBoardPosition.LEFT)
- val rightNeighbourHasIt = neighbourHasTheCard(table, RelativeBoardPosition.RIGHT)
+ val leftNeighbourHasIt = neighbourHasTheCard(RelativeBoardPosition.LEFT)
+ val rightNeighbourHasIt = neighbourHasTheCard(RelativeBoardPosition.RIGHT)
if (!leftNeighbourHasIt && !rightNeighbourHasIt) {
- throw InvalidMoveException("Player $playerIndex cannot copy card ${card.name} because none of his neighbour has it")
+ throw InvalidMoveException(this, "neighbours don't have card '${card.name}'")
}
}
- private fun neighbourHasTheCard(table: Table, position: RelativeBoardPosition): Boolean {
- val neighbourBoard = table.getBoard(playerIndex, position)
- return neighbourBoard.getPlayedCards().contains(card)
- }
+ private fun neighbourHasTheCard(position: RelativeBoardPosition): Boolean =
+ playerContext.getBoard(position).getPlayedCards().contains(card)
// nothing special to do here
- override fun place(table: Table, discardedCards: MutableList<Card>, settings: Settings) = Unit
+ override fun place(discardedCards: MutableList<Card>, settings: Settings) = Unit
- override fun activate(table: Table, discardedCards: List<Card>, settings: Settings) {
- table.getBoard(playerIndex).copiedGuild = card
+ override fun activate(discardedCards: List<Card>, settings: Settings) {
+ playerContext.board.copiedGuild = card
}
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/DiscardMove.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/DiscardMove.kt
index cf1b69ba..a8cd42a6 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/DiscardMove.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/DiscardMove.kt
@@ -1,20 +1,18 @@
package org.luxons.sevenwonders.game.moves
+import org.luxons.sevenwonders.game.PlayerContext
import org.luxons.sevenwonders.game.Settings
import org.luxons.sevenwonders.game.api.PlayerMove
-import org.luxons.sevenwonders.game.api.Table
-import org.luxons.sevenwonders.game.boards.Board
import org.luxons.sevenwonders.game.cards.Card
-class DiscardMove internal constructor(playerIndex: Int, card: Card, move: PlayerMove) :
- CardFromHandMove(playerIndex, card, move) {
+internal class DiscardMove(move: PlayerMove, card: Card, player: PlayerContext) :
+ CardFromHandMove(move, card, player) {
- override fun place(table: Table, discardedCards: MutableList<Card>, settings: Settings) {
+ override fun place(discardedCards: MutableList<Card>, settings: Settings) {
discardedCards.add(card)
}
- override fun activate(table: Table, discardedCards: List<Card>, settings: Settings) {
- val board = table.getBoard(playerIndex)
- board.addGold(settings.discardedCardGold)
+ override fun activate(discardedCards: List<Card>, settings: Settings) {
+ playerContext.board.addGold(settings.discardedCardGold)
}
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/InvalidMoveException.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/InvalidMoveException.kt
deleted file mode 100644
index d816355d..00000000
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/InvalidMoveException.kt
+++ /dev/null
@@ -1,3 +0,0 @@
-package org.luxons.sevenwonders.game.moves
-
-class InvalidMoveException(message: String) : IllegalArgumentException(message)
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/Move.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/Move.kt
index 885f267f..86b26ca9 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/Move.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/Move.kt
@@ -1,21 +1,25 @@
package org.luxons.sevenwonders.game.moves
+import org.luxons.sevenwonders.game.PlayerContext
import org.luxons.sevenwonders.game.Settings
import org.luxons.sevenwonders.game.api.PlayerMove
-import org.luxons.sevenwonders.game.api.Table
import org.luxons.sevenwonders.game.cards.Card
import org.luxons.sevenwonders.game.resources.ResourceTransactions
-abstract class Move internal constructor(val playerIndex: Int, val card: Card, move: PlayerMove) {
-
+abstract class Move internal constructor(
+ move: PlayerMove,
+ val card: Card,
+ internal val playerContext: PlayerContext
+) {
val type: MoveType = move.type
val transactions: ResourceTransactions = ResourceTransactions(move.transactions)
- @Throws(InvalidMoveException::class)
- abstract fun validate(table: Table, playerHand: List<Card>)
-
- abstract fun place(table: Table, discardedCards: MutableList<Card>, settings: Settings)
+ abstract fun place(discardedCards: MutableList<Card>, settings: Settings)
- abstract fun activate(table: Table, discardedCards: List<Card>, settings: Settings)
+ abstract fun activate(discardedCards: List<Card>, settings: Settings)
}
+
+class InvalidMoveException internal constructor(move: Move, message: String) : IllegalArgumentException(
+ "Player ${move.playerContext.index} cannot perform move ${move.type}: $message"
+)
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/MoveType.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/MoveType.kt
index ced0f3a1..fc859931 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/MoveType.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/MoveType.kt
@@ -1,24 +1,17 @@
package org.luxons.sevenwonders.game.moves
+import org.luxons.sevenwonders.game.PlayerContext
import org.luxons.sevenwonders.game.api.PlayerMove
import org.luxons.sevenwonders.game.cards.Card
-enum class MoveType {
- PLAY {
- override fun resolve(playerIndex: Int, card: Card, move: PlayerMove) = PlayCardMove(playerIndex, card, move)
- },
- PLAY_FREE {
- override fun resolve(playerIndex: Int, card: Card, move: PlayerMove) = PlayFreeCardMove(playerIndex, card, move)
- },
- UPGRADE_WONDER {
- override fun resolve(playerIndex: Int, card: Card, move: PlayerMove) = BuildWonderMove(playerIndex, card, move)
- },
- DISCARD {
- override fun resolve(playerIndex: Int, card: Card, move: PlayerMove) = DiscardMove(playerIndex, card, move)
- },
- COPY_GUILD {
- override fun resolve(playerIndex: Int, card: Card, move: PlayerMove) = CopyGuildMove(playerIndex, card, move)
- };
+enum class MoveType(val create: (move: PlayerMove, card: Card, context: PlayerContext) -> Move) {
+ PLAY(::PlayCardMove),
+ PLAY_FREE(::PlayFreeCardMove),
+ UPGRADE_WONDER(::BuildWonderMove),
+ DISCARD(::DiscardMove),
+ COPY_GUILD(::CopyGuildMove);
- abstract fun resolve(playerIndex: Int, card: Card, move: PlayerMove): Move
+ internal fun resolve(move: PlayerMove, card: Card, context: PlayerContext): Move {
+ return create(move, card, context)
+ }
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/PlayCardMove.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/PlayCardMove.kt
index b87916b1..f0c18bc7 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/PlayCardMove.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/PlayCardMove.kt
@@ -1,25 +1,21 @@
package org.luxons.sevenwonders.game.moves
+import org.luxons.sevenwonders.game.PlayerContext
import org.luxons.sevenwonders.game.Settings
import org.luxons.sevenwonders.game.api.PlayerMove
-import org.luxons.sevenwonders.game.api.Table
import org.luxons.sevenwonders.game.cards.Card
-class PlayCardMove internal constructor(playerIndex: Int, card: Card, move: PlayerMove) :
- CardFromHandMove(playerIndex, card, move) {
+internal class PlayCardMove(move: PlayerMove, card: Card, player: PlayerContext) :
+ CardFromHandMove(move, card, player) {
- @Throws(InvalidMoveException::class)
- override fun validate(table: Table, playerHand: List<Card>) {
- super.validate(table, playerHand)
- val board = table.getBoard(playerIndex)
+ init {
+ val board = player.board
if (!card.isChainableOn(board) && !card.requirements.areMetWithHelpBy(board, transactions)) {
- throw InvalidMoveException("Player $playerIndex cannot play the card ${card.name} with the given resources")
+ throw InvalidMoveException(this, "requirements not met to play the card ${card.name}")
}
}
- override fun place(table: Table, discardedCards: MutableList<Card>, settings: Settings) =
- table.getBoard(playerIndex).addCard(card)
+ override fun place(discardedCards: MutableList<Card>, settings: Settings) = playerContext.board.addCard(card)
- override fun activate(table: Table, discardedCards: List<Card>, settings: Settings) =
- card.applyTo(table, playerIndex, transactions)
+ override fun activate(discardedCards: List<Card>, settings: Settings) = card.applyTo(playerContext, transactions)
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/PlayFreeCardMove.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/PlayFreeCardMove.kt
index 125b34a6..bac185d9 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/PlayFreeCardMove.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/moves/PlayFreeCardMove.kt
@@ -1,34 +1,25 @@
package org.luxons.sevenwonders.game.moves
+import org.luxons.sevenwonders.game.PlayerContext
import org.luxons.sevenwonders.game.Settings
import org.luxons.sevenwonders.game.api.PlayerMove
-import org.luxons.sevenwonders.game.api.Table
-import org.luxons.sevenwonders.game.boards.Board
import org.luxons.sevenwonders.game.cards.Card
-class PlayFreeCardMove internal constructor(playerIndex: Int, card: Card, move: PlayerMove) :
- CardFromHandMove(playerIndex, card, move) {
+internal class PlayFreeCardMove(move: PlayerMove, card: Card, playerContext: PlayerContext) :
+ CardFromHandMove(move, card, playerContext) {
- @Throws(InvalidMoveException::class)
- override fun validate(table: Table, playerHand: List<Card>) {
- super.validate(table, playerHand)
- val board = table.getBoard(playerIndex)
- if (!board.canPlayFreeCard(table.currentAge)) {
- throw InvalidMoveException(
- String.format("Player %d cannot play the card %s for free", playerIndex, card.name)
- )
+ init {
+ val board = playerContext.board
+ if (!board.canPlayFreeCard(playerContext.currentAge)) {
+ throw InvalidMoveException(this, "no free card available for the current age ${playerContext.currentAge}")
}
}
- override fun place(table: Table, discardedCards: MutableList<Card>, settings: Settings) {
- val board = table.getBoard(playerIndex)
- board.addCard(card)
- }
+ override fun place(discardedCards: MutableList<Card>, settings: Settings) = playerContext.board.addCard(card)
- override fun activate(table: Table, discardedCards: List<Card>, settings: Settings) {
+ override fun activate(discardedCards: List<Card>, settings: Settings) {
// only apply effects, without paying the cost
- card.effects.forEach { e -> e.apply(table, playerIndex) }
- val board = table.getBoard(playerIndex)
- board.consumeFreeCard(table.currentAge)
+ card.effects.forEach { it.applyTo(playerContext) }
+ playerContext.board.consumeFreeCard(playerContext.currentAge)
}
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/resources/BestPriceCalculator.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/resources/BestPriceCalculator.kt
index 6e7d76f6..24149e59 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/resources/BestPriceCalculator.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/resources/BestPriceCalculator.kt
@@ -1,19 +1,19 @@
package org.luxons.sevenwonders.game.resources
-import org.luxons.sevenwonders.game.api.Table
+import org.luxons.sevenwonders.game.Player
import java.util.ArrayList
import java.util.EnumSet
-fun bestPrice(resources: Resources, table: Table, playerIndex: Int): Int? {
- return bestSolution(resources, table, playerIndex)?.price
+fun bestPrice(resources: Resources, player: Player): Int? {
+ return bestSolution(resources, player)?.price
}
-fun bestTransaction(resources: Resources, table: Table, playerIndex: Int): ResourceTransactions? {
- return bestSolution(resources, table, playerIndex)?.transactions
+fun bestTransaction(resources: Resources, player: Player): ResourceTransactions? {
+ return bestSolution(resources, player)?.transactions
}
-fun bestSolution(resources: Resources, table: Table, playerIndex: Int): TransactionPlan? {
- val calculator = BestPriceCalculator(resources, table, playerIndex)
+fun bestSolution(resources: Resources, player: Player): TransactionPlan? {
+ val calculator = BestPriceCalculator(resources, player)
return calculator.computeBestSolution()
}
@@ -27,7 +27,7 @@ private class ResourcePool(
fun getCost(type: ResourceType): Int = if (provider == null) 0 else rules.getCost(type, provider)
}
-private class BestPriceCalculator(resourcesToPay: Resources, table: Table, playerIndex: Int) {
+private class BestPriceCalculator(resourcesToPay: Resources, player: Player) {
private val pools: List<ResourcePool>
private val resourcesLeftToPay: Resources
@@ -38,15 +38,15 @@ private class BestPriceCalculator(resourcesToPay: Resources, table: Table, playe
var bestPrice: Int = Integer.MAX_VALUE
init {
- val board = table.getBoard(playerIndex)
+ val board = player.board
this.resourcesLeftToPay = resourcesToPay.minus(board.production.fixedResources)
- this.pools = createResourcePools(table, playerIndex)
+ this.pools = createResourcePools(player)
}
- private fun createResourcePools(table: Table, playerIndex: Int): List<ResourcePool> {
+ private fun createResourcePools(player: Player): List<ResourcePool> {
val providers = Provider.values()
- val board = table.getBoard(playerIndex)
+ val board = player.board
val rules = board.tradingRules
val pools = ArrayList<ResourcePool>(providers.size + 1)
@@ -55,7 +55,7 @@ private class BestPriceCalculator(resourcesToPay: Resources, table: Table, playe
pools.add(ResourcePool(null, rules, ownBoardChoices.map { it.toMutableSet() }.toSet()))
for (provider in providers) {
- val providerBoard = table.getBoard(playerIndex, provider.boardPosition)
+ val providerBoard = player.getBoard(provider.boardPosition)
val pool = ResourcePool(provider, rules, providerBoard.publicProduction.asChoices().map { it.toMutableSet() }.toSet())
pools.add(pool)
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransaction.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransaction.kt
index c500f0d0..30f4d014 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransaction.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransaction.kt
@@ -1,15 +1,15 @@
package org.luxons.sevenwonders.game.resources
-import org.luxons.sevenwonders.game.api.Table
+import org.luxons.sevenwonders.game.Player
data class ResourceTransaction(val provider: Provider, val resources: Resources) {
- internal fun execute(table: Table, playerIndex: Int) {
- val board = table.getBoard(playerIndex)
+ internal fun execute(player: Player) {
+ val board = player.board
val price = board.tradingRules.computeCost(this)
board.removeGold(price)
val providerPosition = provider.boardPosition
- val providerBoard = table.getBoard(playerIndex, providerPosition)
+ val providerBoard = player.getBoard(providerPosition)
providerBoard.addGold(price)
}
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransactions.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransactions.kt
index 24556d19..1f92e764 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransactions.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransactions.kt
@@ -1,6 +1,6 @@
package org.luxons.sevenwonders.game.resources
-import org.luxons.sevenwonders.game.api.Table
+import org.luxons.sevenwonders.game.Player
data class ResourceTransactions(private val resourcesByProvider: MutableMap<Provider, Resources> = mutableMapOf()) {
@@ -13,7 +13,7 @@ data class ResourceTransactions(private val resourcesByProvider: MutableMap<Prov
}
fun remove(provider: Provider, resources: Resources) {
- resourcesByProvider.compute(provider) { p, prevResources ->
+ resourcesByProvider.compute(provider) { _, prevResources ->
if (prevResources == null) {
throw IllegalStateException("Cannot remove resources from resource transactions")
}
@@ -21,8 +21,8 @@ data class ResourceTransactions(private val resourcesByProvider: MutableMap<Prov
}
}
- fun execute(table: Table, playerIndex: Int) {
- asList().forEach { t -> t.execute(table, playerIndex) }
+ fun execute(player: Player) {
+ asList().forEach { it.execute(player) }
}
fun asList(): List<ResourceTransaction> {
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/wonders/Wonder.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/wonders/Wonder.kt
index beb87580..e7b42eca 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/wonders/Wonder.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/wonders/Wonder.kt
@@ -1,6 +1,7 @@
package org.luxons.sevenwonders.game.wonders
-import org.luxons.sevenwonders.game.api.Table
+import org.luxons.sevenwonders.game.Player
+import org.luxons.sevenwonders.game.boards.Board
import org.luxons.sevenwonders.game.cards.CardBack
import org.luxons.sevenwonders.game.resources.ResourceTransactions
import org.luxons.sevenwonders.game.resources.ResourceType
@@ -29,17 +30,17 @@ class Wonder(
return stages[lastLevel]
}
- fun isNextStageBuildable(table: Table, playerIndex: Int, boughtResources: ResourceTransactions): Boolean =
- nbBuiltStages < stages.size && nextStage.isBuildable(table, playerIndex, boughtResources)
+ fun isNextStageBuildable(board: Board, boughtResources: ResourceTransactions): Boolean =
+ nbBuiltStages < stages.size && nextStage.isBuildable(board, boughtResources)
- fun buildLevel(cardBack: CardBack) = nextStage.build(cardBack)
+ fun placeCard(cardBack: CardBack) = nextStage.placeCard(cardBack)
- fun activateLastBuiltStage(table: Table, playerIndex: Int, boughtResources: ResourceTransactions) =
- lastBuiltStage.activate(table, playerIndex, boughtResources)
+ fun activateLastBuiltStage(player: Player, boughtResources: ResourceTransactions) =
+ lastBuiltStage.activate(player, boughtResources)
- fun computePoints(table: Table, playerIndex: Int): Int = stages
- .filter { it.isBuilt }
- .flatMap { c -> c.effects }
- .map { e -> e.computePoints(table, playerIndex) }
- .sum()
+ fun computePoints(player: Player): Int =
+ stages.filter { it.isBuilt }
+ .flatMap { it.effects }
+ .map { it.computePoints(player) }
+ .sum()
}
diff --git a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/wonders/WonderStage.kt b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/wonders/WonderStage.kt
index 6aad135d..04a6de0c 100644
--- a/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/wonders/WonderStage.kt
+++ b/game-engine/src/main/kotlin/org/luxons/sevenwonders/game/wonders/WonderStage.kt
@@ -1,6 +1,7 @@
package org.luxons.sevenwonders.game.wonders
-import org.luxons.sevenwonders.game.api.Table
+import org.luxons.sevenwonders.game.Player
+import org.luxons.sevenwonders.game.boards.Board
import org.luxons.sevenwonders.game.cards.CardBack
import org.luxons.sevenwonders.game.cards.Requirements
import org.luxons.sevenwonders.game.effects.Effect
@@ -14,17 +15,16 @@ class WonderStage(val requirements: Requirements, val effects: List<Effect>) {
val isBuilt: Boolean
get() = cardBack != null
- fun isBuildable(table: Table, playerIndex: Int, boughtResources: ResourceTransactions): Boolean {
- val board = table.getBoard(playerIndex)
+ fun isBuildable(board: Board, boughtResources: ResourceTransactions): Boolean {
return requirements.areMetWithHelpBy(board, boughtResources)
}
- internal fun build(cardBack: CardBack) {
+ internal fun placeCard(cardBack: CardBack) {
this.cardBack = cardBack
}
- internal fun activate(table: Table, playerIndex: Int, boughtResources: ResourceTransactions) {
- effects.forEach { e -> e.apply(table, playerIndex) }
- requirements.pay(table, playerIndex, boughtResources)
+ internal fun activate(player: Player, boughtResources: ResourceTransactions) {
+ effects.forEach { it.applyTo(player) }
+ requirements.pay(player, boughtResources)
}
}
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/GameTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/GameTest.kt
index 6ec279b6..5f76b42e 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/GameTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/GameTest.kt
@@ -85,7 +85,7 @@ class GameTest {
val requiredResources = handCard.card.requirements.resources
val table = turnInfo.table
val playerIndex = turnInfo.playerIndex
- val transactions = bestTransaction(requiredResources, table, playerIndex)
+ val transactions = bestTransaction(requiredResources, PlayerContext(playerIndex, table, listOf()))
// we're supposed to have a best transaction plan because the card is playable
return transactions!!.asList()
}
@@ -100,11 +100,10 @@ class GameTest {
private fun checkLastPlayedMoves(sentMoves: Map<Int, PlayerMove>, table: Table) {
for (move in table.lastPlayedMoves) {
- val sentMove = sentMoves[move.playerIndex]
+ val sentMove = sentMoves[move.playerContext.index]
assertNotNull(sentMove)
assertNotNull(move.card)
assertEquals(sentMove!!.cardName, move.card.name)
- assertSame(sentMove.type, move.type)
}
}
}
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/boards/BoardTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/boards/BoardTest.kt
index 7c23bbd0..68799145 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/boards/BoardTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/boards/BoardTest.kt
@@ -12,7 +12,6 @@ import org.junit.experimental.theories.Theory
import org.junit.rules.ExpectedException
import org.junit.runner.RunWith
import org.luxons.sevenwonders.game.Settings
-import org.luxons.sevenwonders.game.api.Table
import org.luxons.sevenwonders.game.boards.Board.InsufficientFundsException
import org.luxons.sevenwonders.game.cards.Color
import org.luxons.sevenwonders.game.effects.RawPointsIncrease
@@ -24,6 +23,7 @@ import org.luxons.sevenwonders.game.test.addCards
import org.luxons.sevenwonders.game.test.createResources
import org.luxons.sevenwonders.game.test.getDifferentColorFrom
import org.luxons.sevenwonders.game.test.playCardWithEffect
+import org.luxons.sevenwonders.game.test.singleBoardPlayer
import org.luxons.sevenwonders.game.test.testBoard
import org.luxons.sevenwonders.game.test.testCard
import org.luxons.sevenwonders.game.test.testCustomizableSettings
@@ -128,10 +128,9 @@ class BoardTest {
@Theory
fun hasSpecial(applied: SpecialAbility, tested: SpecialAbility) {
val board = testBoard(ResourceType.CLAY)
- val table = Table(listOf(board))
val special = SpecialAbilityActivation(applied)
- special.apply(table, 0)
+ special.applyTo(singleBoardPlayer(board))
assertEquals(applied === tested, board.hasSpecial(tested))
}
@@ -139,10 +138,9 @@ class BoardTest {
@Test
fun canPlayFreeCard() {
val board = testBoard(ResourceType.CLAY)
- val table = Table(listOf(board))
val special = SpecialAbilityActivation(SpecialAbility.ONE_FREE_PER_AGE)
- special.apply(table, 0)
+ special.applyTo(singleBoardPlayer(board))
assertTrue(board.canPlayFreeCard(0))
assertTrue(board.canPlayFreeCard(1))
@@ -171,10 +169,9 @@ class BoardTest {
fun computePoints_gold(@FromDataPoints("gold") gold: Int) {
assumeTrue(gold >= 0)
val board = testBoard(ResourceType.WOOD)
- val table = Table(listOf(board))
board.gold = gold
- val score = board.computePoints(table)
+ val score = board.computeScore(singleBoardPlayer(board))
assertEquals(gold / 3, score.pointsByCategory[ScoreCategory.GOLD])
assertEquals(gold / 3, score.totalPoints)
}
@@ -183,48 +180,38 @@ class BoardTest {
fun computePoints_(@FromDataPoints("gold") gold: Int) {
assumeTrue(gold >= 0)
val board = testBoard(ResourceType.WOOD)
- val table = Table(listOf(board))
board.gold = gold
val effect = RawPointsIncrease(5)
- playCardWithEffect(table, 0, Color.BLUE, effect)
+ playCardWithEffect(singleBoardPlayer(board), Color.BLUE, effect)
- val score = board.computePoints(table)
+ val score = board.computeScore(singleBoardPlayer(board))
assertEquals(gold / 3, score.pointsByCategory[ScoreCategory.GOLD])
assertEquals(5, score.pointsByCategory[ScoreCategory.CIVIL])
assertEquals(5 + gold / 3, score.totalPoints)
}
+
companion object {
@JvmStatic
@DataPoints("gold")
- fun goldAmounts(): IntArray {
- return intArrayOf(-3, -1, 0, 1, 2, 3)
- }
+ fun goldAmounts(): IntArray = intArrayOf(-3, -1, 0, 1, 2, 3)
@JvmStatic
@DataPoints("nbCards")
- fun nbCards(): IntArray {
- return intArrayOf(0, 1, 2)
- }
+ fun nbCards(): IntArray = intArrayOf(0, 1, 2)
@JvmStatic
@DataPoints
- fun resourceTypes(): Array<ResourceType> {
- return ResourceType.values()
- }
+ fun resourceTypes(): Array<ResourceType> = ResourceType.values()
@JvmStatic
@DataPoints
- fun colors(): Array<Color> {
- return Color.values()
- }
+ fun colors(): Array<Color> = Color.values()
@JvmStatic
@DataPoints
- fun specialAbilities(): Array<SpecialAbility> {
- return SpecialAbility.values()
- }
+ fun specialAbilities(): Array<SpecialAbility> = SpecialAbility.values()
}
}
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/cards/CardTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/cards/CardTest.kt
index 783e4c38..e9f95b55 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/cards/CardTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/cards/CardTest.kt
@@ -1,9 +1,9 @@
package org.luxons.sevenwonders.game.cards
-import org.junit.Assert.*
-import org.junit.Before
+import org.junit.Assert.assertEquals
import org.junit.Test
import org.luxons.sevenwonders.game.Settings
+import org.luxons.sevenwonders.game.SimplePlayer
import org.luxons.sevenwonders.game.api.Table
import org.luxons.sevenwonders.game.boards.Board
import org.luxons.sevenwonders.game.effects.ProductionIncrease
@@ -15,12 +15,8 @@ import org.luxons.sevenwonders.game.wonders.Wonder
class CardTest {
- private var table: Table? = null
-
- private var treeFarmCard: Card? = null
-
- @Before
- fun initBoard() {
+ @Test
+ fun playCardCostingMoney() {
val settings = Settings(3)
val boards = listOf(
@@ -28,24 +24,21 @@ class CardTest {
Board(Wonder("TestWonder", ResourceType.STONE, emptyList(), ""), 1, settings),
Board(Wonder("TestWonder", ResourceType.PAPYRUS, emptyList(), ""), 2, settings)
)
- table = Table(boards)
+ val table = Table(boards)
val treeFarmRequirements = Requirements(1)
val treeFarmProduction = Production()
treeFarmProduction.addChoice(ResourceType.WOOD, ResourceType.CLAY)
val treeFarmEffect = ProductionIncrease(treeFarmProduction, false)
- treeFarmCard = testCard("Tree Farm", Color.BROWN, treeFarmEffect, treeFarmRequirements)
- }
+ val treeFarmCard = testCard("Tree Farm", Color.BROWN, treeFarmEffect, treeFarmRequirements)
- @Test
- fun playCardCostingMoney() {
- table!!.getBoard(0).gold = 3
- table!!.getBoard(1).gold = 3
- table!!.getBoard(2).gold = 3
- treeFarmCard!!.applyTo(table!!, 0, ResourceTransactions())
- assertEquals(2, table!!.getBoard(0).gold.toLong())
- assertEquals(3, table!!.getBoard(1).gold.toLong())
- assertEquals(3, table!!.getBoard(2).gold.toLong())
+ table.getBoard(0).gold = 3
+ table.getBoard(1).gold = 3
+ table.getBoard(2).gold = 3
+ treeFarmCard.applyTo(SimplePlayer(0, table), ResourceTransactions())
+ assertEquals(2, table.getBoard(0).gold.toLong())
+ assertEquals(3, table.getBoard(1).gold.toLong())
+ assertEquals(3, table.getBoard(2).gold.toLong())
}
}
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/cards/HandsTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/cards/HandsTest.kt
index 7ba21089..e7c3835a 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/cards/HandsTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/cards/HandsTest.kt
@@ -8,6 +8,7 @@ import org.junit.experimental.theories.FromDataPoints
import org.junit.experimental.theories.Theories
import org.junit.experimental.theories.Theory
import org.junit.runner.RunWith
+import org.luxons.sevenwonders.game.SimplePlayer
import org.luxons.sevenwonders.game.test.sampleCards
import org.luxons.sevenwonders.game.test.testTable
@@ -97,7 +98,7 @@ class HandsTest {
val hands = Hands(listOf(hand0, hand1))
val table = testTable(2)
- val hand = hands.createHand(table, 0)
+ val hand = hands.createHand(SimplePlayer(0, table))
for (handCard in hand) {
assertTrue(hand0.contains(handCard.card))
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/cards/RequirementsTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/cards/RequirementsTest.kt
index 196091a6..95a5e174 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/cards/RequirementsTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/cards/RequirementsTest.kt
@@ -1,26 +1,23 @@
package org.luxons.sevenwonders.game.cards
-import java.util.Arrays
-import java.util.Collections
-
+import org.junit.Assert.*
+import org.junit.Assume.assumeTrue
import org.junit.Test
import org.junit.experimental.theories.DataPoints
import org.junit.experimental.theories.Theories
import org.junit.experimental.theories.Theory
import org.junit.runner.RunWith
+import org.luxons.sevenwonders.game.SimplePlayer
import org.luxons.sevenwonders.game.api.Table
-import org.luxons.sevenwonders.game.boards.Board
import org.luxons.sevenwonders.game.resources.Provider
import org.luxons.sevenwonders.game.resources.ResourceTransactions
import org.luxons.sevenwonders.game.resources.ResourceType
import org.luxons.sevenwonders.game.resources.Resources
-import org.luxons.sevenwonders.game.test.*
-
-import org.junit.Assert.assertEquals
-import org.junit.Assert.assertFalse
-import org.junit.Assert.assertSame
-import org.junit.Assert.assertTrue
-import org.junit.Assume.assumeTrue
+import org.luxons.sevenwonders.game.test.createRequirements
+import org.luxons.sevenwonders.game.test.createTransactions
+import org.luxons.sevenwonders.game.test.singleBoardPlayer
+import org.luxons.sevenwonders.game.test.testBoard
+import java.util.Arrays
@RunWith(Theories::class)
class RequirementsTest {
@@ -43,11 +40,11 @@ class RequirementsTest {
val requirements = Requirements(requiredGold)
val board = testBoard(ResourceType.CLAY, boardGold)
- val table = Table(listOf(board))
+ val player = singleBoardPlayer(board)
assertEquals(boardGold >= requiredGold, requirements.areMetWithoutNeighboursBy(board))
assertEquals(boardGold >= requiredGold, requirements.areMetWithHelpBy(board, ResourceTransactions()))
- assertEquals(boardGold >= requiredGold, requirements.areMetBy(table, 0))
+ assertEquals(boardGold >= requiredGold, requirements.areMetBy(player))
}
@Theory
@@ -55,7 +52,7 @@ class RequirementsTest {
val requirements = createRequirements(requiredResource)
val board = testBoard(initialResource, 0)
- val table = Table(listOf(board))
+ val player = singleBoardPlayer(board)
assertEquals(initialResource == requiredResource, requirements.areMetWithoutNeighboursBy(board))
assertEquals(
@@ -64,7 +61,7 @@ class RequirementsTest {
)
if (initialResource == requiredResource) {
- assertTrue(requirements.areMetBy(table, 0))
+ assertTrue(requirements.areMetBy(player))
}
}
@@ -79,7 +76,7 @@ class RequirementsTest {
val board = testBoard(initialResource, 0)
board.production.addFixedResource(producedResource, 1)
- val table = Table(listOf(board))
+ val player = singleBoardPlayer(board)
assertEquals(producedResource == requiredResource, requirements.areMetWithoutNeighboursBy(board))
assertEquals(
@@ -88,7 +85,7 @@ class RequirementsTest {
)
if (producedResource == requiredResource) {
- assertTrue(requirements.areMetBy(table, 0))
+ assertTrue(requirements.areMetBy(player))
}
}
@@ -105,6 +102,7 @@ class RequirementsTest {
val neighbourBoard = testBoard(initialResource, 0)
neighbourBoard.publicProduction.addFixedResource(boughtResource, 1)
val table = Table(Arrays.asList(board, neighbourBoard))
+ val player = SimplePlayer(0, table)
val resources = createTransactions(Provider.RIGHT_PLAYER, boughtResource)
@@ -112,7 +110,7 @@ class RequirementsTest {
assertEquals(boughtResource == requiredResource, requirements.areMetWithHelpBy(board, resources))
if (boughtResource == requiredResource) {
- assertTrue(requirements.areMetBy(table, 0))
+ assertTrue(requirements.areMetBy(player))
}
}
@@ -125,6 +123,7 @@ class RequirementsTest {
val board = testBoard(initialResource, 2)
val neighbourBoard = testBoard(requiredResource, 0)
val table = Table(Arrays.asList(board, neighbourBoard))
+ val player = SimplePlayer(0, table)
val transactions = createTransactions(
Provider.RIGHT_PLAYER,
@@ -133,9 +132,9 @@ class RequirementsTest {
assertFalse(requirements.areMetWithoutNeighboursBy(board))
assertTrue(requirements.areMetWithHelpBy(board, transactions))
- assertTrue(requirements.areMetBy(table, 0))
+ assertTrue(requirements.areMetBy(player))
- requirements.pay(table, 0, transactions)
+ requirements.pay(player, transactions)
assertEquals(0, board.gold.toLong())
assertEquals(2, neighbourBoard.gold.toLong())
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/BonusPerBoardElementTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/BonusPerBoardElementTest.kt
index 3f0b0aa0..8899eb06 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/BonusPerBoardElementTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/BonusPerBoardElementTest.kt
@@ -1,45 +1,47 @@
package org.luxons.sevenwonders.game.effects
+import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.experimental.theories.DataPoints
import org.junit.experimental.theories.Theories
import org.junit.experimental.theories.Theory
import org.junit.runner.RunWith
+import org.luxons.sevenwonders.game.Player
+import org.luxons.sevenwonders.game.SimplePlayer
import org.luxons.sevenwonders.game.api.Table
import org.luxons.sevenwonders.game.boards.RelativeBoardPosition
import org.luxons.sevenwonders.game.cards.CardBack
import org.luxons.sevenwonders.game.cards.Color
-import org.luxons.sevenwonders.game.test.*
-
-import org.junit.Assert.assertEquals
+import org.luxons.sevenwonders.game.test.addCards
+import org.luxons.sevenwonders.game.test.testTable
@RunWith(Theories::class)
class BonusPerBoardElementTest {
private var table: Table? = null
+ private var player0: Player? = null
@Before
fun setUp() {
table = testTable(4)
+ player0 = SimplePlayer(0, table!!)
}
@Theory
fun computePoints_countsCards(
- boardPosition: RelativeBoardPosition, nbCards: Int, nbOtherCards: Int,
- points: Int, gold: Int, color: Color
+ boardPosition: RelativeBoardPosition, nbCards: Int, nbOtherCards: Int, points: Int, gold: Int, color: Color
) {
val board = table!!.getBoard(0, boardPosition)
addCards(board, nbCards, nbOtherCards, color)
val bonus = BonusPerBoardElement(listOf(boardPosition), BoardElementType.CARD, gold, points, listOf(color))
- assertEquals((nbCards * points).toLong(), bonus.computePoints(table!!, 0).toLong())
+ assertEquals((nbCards * points).toLong(), bonus.computePoints(player0!!).toLong())
}
@Theory
fun computePoints_countsDefeatTokens(
- boardPosition: RelativeBoardPosition, nbDefeatTokens: Int, points: Int,
- gold: Int
+ boardPosition: RelativeBoardPosition, nbDefeatTokens: Int, points: Int, gold: Int
) {
val board = table!!.getBoard(0, boardPosition)
for (i in 0 until nbDefeatTokens) {
@@ -48,29 +50,25 @@ class BonusPerBoardElementTest {
val bonus = BonusPerBoardElement(listOf(boardPosition), BoardElementType.DEFEAT_TOKEN, gold, points, listOf())
- assertEquals((nbDefeatTokens * points).toLong(), bonus.computePoints(table!!, 0).toLong())
+ assertEquals((nbDefeatTokens * points).toLong(), bonus.computePoints(player0!!).toLong())
}
@Theory
- fun computePoints_countsWonderStages(
- boardPosition: RelativeBoardPosition, nbStages: Int, points: Int,
- gold: Int
- ) {
+ fun computePoints_countsWonderStages(boardPosition: RelativeBoardPosition, nbStages: Int, points: Int, gold: Int) {
val board = table!!.getBoard(0, boardPosition)
for (i in 0 until nbStages) {
- board.wonder.buildLevel(CardBack(""))
+ board.wonder.placeCard(CardBack(""))
}
val bonus =
BonusPerBoardElement(listOf(boardPosition), BoardElementType.BUILT_WONDER_STAGES, gold, points, listOf())
- assertEquals((nbStages * points).toLong(), bonus.computePoints(table!!, 0).toLong())
+ assertEquals((nbStages * points).toLong(), bonus.computePoints(player0!!).toLong())
}
@Theory
fun apply_countsCards(
- boardPosition: RelativeBoardPosition, nbCards: Int, nbOtherCards: Int, points: Int,
- gold: Int, color: Color
+ boardPosition: RelativeBoardPosition, nbCards: Int, nbOtherCards: Int, points: Int, gold: Int, color: Color
) {
val board = table!!.getBoard(0, boardPosition)
addCards(board, nbCards, nbOtherCards, color)
@@ -79,14 +77,13 @@ class BonusPerBoardElementTest {
val selfBoard = table!!.getBoard(0)
val initialGold = selfBoard.gold
- bonus.apply(table!!, 0)
+ bonus.applyTo(player0!!)
assertEquals((initialGold + nbCards * gold).toLong(), selfBoard.gold.toLong())
}
@Theory
fun apply_countsDefeatTokens(
- boardPosition: RelativeBoardPosition, nbDefeatTokens: Int, points: Int,
- gold: Int
+ boardPosition: RelativeBoardPosition, nbDefeatTokens: Int, points: Int, gold: Int
) {
val board = table!!.getBoard(0, boardPosition)
for (i in 0 until nbDefeatTokens) {
@@ -97,7 +94,7 @@ class BonusPerBoardElementTest {
val selfBoard = table!!.getBoard(0)
val initialGold = selfBoard.gold
- bonus.apply(table!!, 0)
+ bonus.applyTo(player0!!)
assertEquals((initialGold + nbDefeatTokens * gold).toLong(), selfBoard.gold.toLong())
}
@@ -105,7 +102,7 @@ class BonusPerBoardElementTest {
fun apply_countsWonderStages(boardPosition: RelativeBoardPosition, nbStages: Int, points: Int, gold: Int) {
val board = table!!.getBoard(0, boardPosition)
for (i in 0 until nbStages) {
- board.wonder.buildLevel(CardBack(""))
+ board.wonder.placeCard(CardBack(""))
}
val bonus =
@@ -113,7 +110,7 @@ class BonusPerBoardElementTest {
val selfBoard = table!!.getBoard(0)
val initialGold = selfBoard.gold
- bonus.apply(table!!, 0)
+ bonus.applyTo(player0!!)
assertEquals((initialGold + nbStages * gold).toLong(), selfBoard.gold.toLong())
}
@@ -121,20 +118,14 @@ class BonusPerBoardElementTest {
@JvmStatic
@DataPoints
- fun values(): IntArray {
- return intArrayOf(0, 1, 2, 3)
- }
+ fun values(): IntArray = intArrayOf(0, 1, 2, 3)
@JvmStatic
@DataPoints
- fun colors(): Array<Color> {
- return Color.values()
- }
+ fun colors(): Array<Color> = Color.values()
@JvmStatic
@DataPoints
- fun positions(): Array<RelativeBoardPosition> {
- return RelativeBoardPosition.values()
- }
+ fun positions(): Array<RelativeBoardPosition> = RelativeBoardPosition.values()
}
}
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/DiscountTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/DiscountTest.kt
index e228d585..2cd54b2e 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/DiscountTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/DiscountTest.kt
@@ -18,7 +18,7 @@ class DiscountTest {
fun apply_givesDiscountedPrice(discountedPrice: Int, discountedType: ResourceType, provider: Provider) {
val board = testBoard(ResourceType.CLAY, 3)
val discount = Discount(listOf(discountedType), listOf(provider), discountedPrice)
- discount.apply(board)
+ discount.applyTo(board)
val transactions = createTransactions(provider, discountedType)
assertEquals(discountedPrice.toLong(), board.tradingRules.computeCost(transactions).toLong())
@@ -34,7 +34,7 @@ class DiscountTest {
val board = testBoard(ResourceType.CLAY, 3)
val discount = Discount(listOf(discountedType), listOf(provider), discountedPrice)
- discount.apply(board)
+ discount.applyTo(board)
// this is the default in the settings used by TestUtilsKt.testBoard()
val normalPrice = 2
@@ -53,20 +53,14 @@ class DiscountTest {
@JvmStatic
@DataPoints
- fun discountedPrices(): IntArray {
- return intArrayOf(0, 1, 2)
- }
+ fun discountedPrices(): IntArray = intArrayOf(0, 1, 2)
@JvmStatic
@DataPoints
- fun resourceTypes(): Array<ResourceType> {
- return ResourceType.values()
- }
+ fun resourceTypes(): Array<ResourceType> = ResourceType.values()
@JvmStatic
@DataPoints
- fun providers(): Array<Provider> {
- return Provider.values()
- }
+ fun providers(): Array<Provider> = Provider.values()
}
}
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/GoldIncreaseTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/GoldIncreaseTest.kt
index 175f15ea..897dcf30 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/GoldIncreaseTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/GoldIncreaseTest.kt
@@ -1,13 +1,14 @@
package org.luxons.sevenwonders.game.effects
+import org.junit.Assert.assertEquals
import org.junit.experimental.theories.DataPoints
import org.junit.experimental.theories.Theories
import org.junit.experimental.theories.Theory
import org.junit.runner.RunWith
+import org.luxons.sevenwonders.game.SimplePlayer
import org.luxons.sevenwonders.game.resources.ResourceType
-import org.luxons.sevenwonders.game.test.*
-
-import org.junit.Assert.assertEquals
+import org.luxons.sevenwonders.game.test.testBoard
+import org.luxons.sevenwonders.game.test.testTable
@RunWith(Theories::class)
class GoldIncreaseTest {
@@ -17,7 +18,7 @@ class GoldIncreaseTest {
val board = testBoard(type, initialAmount)
val goldIncrease = GoldIncrease(goldIncreaseAmount)
- goldIncrease.apply(board)
+ goldIncrease.applyTo(board)
assertEquals((initialAmount + goldIncreaseAmount).toLong(), board.gold.toLong())
}
@@ -25,8 +26,8 @@ class GoldIncreaseTest {
@Theory
fun computePoints_isAlwaysZero(gold: Int) {
val goldIncrease = GoldIncrease(gold)
- val table = testTable(5)
- assertEquals(0, goldIncrease.computePoints(table, 0).toLong())
+ val player = SimplePlayer(0, testTable(5))
+ assertEquals(0, goldIncrease.computePoints(player).toLong())
}
companion object {
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/MilitaryReinforcementsTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/MilitaryReinforcementsTest.kt
index a8bd01d6..fce3d2bd 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/MilitaryReinforcementsTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/MilitaryReinforcementsTest.kt
@@ -1,13 +1,14 @@
package org.luxons.sevenwonders.game.effects
+import org.junit.Assert.assertEquals
import org.junit.experimental.theories.DataPoints
import org.junit.experimental.theories.Theories
import org.junit.experimental.theories.Theory
import org.junit.runner.RunWith
+import org.luxons.sevenwonders.game.SimplePlayer
import org.luxons.sevenwonders.game.resources.ResourceType
-import org.luxons.sevenwonders.game.test.*
-
-import org.junit.Assert.assertEquals
+import org.luxons.sevenwonders.game.test.testBoard
+import org.luxons.sevenwonders.game.test.testTable
@RunWith(Theories::class)
class MilitaryReinforcementsTest {
@@ -18,7 +19,7 @@ class MilitaryReinforcementsTest {
board.military.addShields(initialShields)
val reinforcements = MilitaryReinforcements(additionalShields)
- reinforcements.apply(board)
+ reinforcements.applyTo(board)
assertEquals((initialShields + additionalShields).toLong(), board.military.nbShields.toLong())
}
@@ -26,22 +27,18 @@ class MilitaryReinforcementsTest {
@Theory
fun computePoints_isAlwaysZero(shields: Int) {
val reinforcements = MilitaryReinforcements(shields)
- val table = testTable(5)
- assertEquals(0, reinforcements.computePoints(table, 0).toLong())
+ val player = SimplePlayer(0, testTable(5))
+ assertEquals(0, reinforcements.computePoints(player).toLong())
}
companion object {
@JvmStatic
@DataPoints
- fun shieldCounts(): IntArray {
- return intArrayOf(0, 1, 2, 3, 5)
- }
+ fun shieldCounts(): IntArray = intArrayOf(0, 1, 2, 3, 5)
@JvmStatic
@DataPoints
- fun resourceTypes(): Array<ResourceType> {
- return ResourceType.values()
- }
+ fun resourceTypes(): Array<ResourceType> = ResourceType.values()
}
}
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/ProductionIncreaseTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/ProductionIncreaseTest.kt
index 6f8da55d..9d5be34f 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/ProductionIncreaseTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/ProductionIncreaseTest.kt
@@ -1,15 +1,16 @@
package org.luxons.sevenwonders.game.effects
+import org.junit.Assert.*
import org.junit.experimental.theories.DataPoints
import org.junit.experimental.theories.Theories
import org.junit.experimental.theories.Theory
import org.junit.runner.RunWith
+import org.luxons.sevenwonders.game.SimplePlayer
import org.luxons.sevenwonders.game.resources.ResourceType
-import org.luxons.sevenwonders.game.test.*
-
-import org.junit.Assert.assertEquals
-import org.junit.Assert.assertFalse
-import org.junit.Assert.assertTrue
+import org.luxons.sevenwonders.game.test.createResources
+import org.luxons.sevenwonders.game.test.fixedProduction
+import org.luxons.sevenwonders.game.test.testBoard
+import org.luxons.sevenwonders.game.test.testTable
@RunWith(Theories::class)
class ProductionIncreaseTest {
@@ -23,7 +24,7 @@ class ProductionIncreaseTest {
val board = testBoard(initialType)
val effect = ProductionIncrease(fixedProduction(addedType), false)
- effect.apply(board)
+ effect.applyTo(board)
val resources = createResources(initialType, addedType)
assertTrue(board.production.contains(resources))
@@ -43,7 +44,7 @@ class ProductionIncreaseTest {
val board = testBoard(initialType)
val effect = ProductionIncrease(fixedProduction(addedType), true)
- effect.apply(board)
+ effect.applyTo(board)
val resources = createResources(initialType, addedType)
assertTrue(board.production.contains(resources))
@@ -57,8 +58,8 @@ class ProductionIncreaseTest {
@Theory
fun computePoints_isAlwaysZero(addedType: ResourceType) {
val effect = ProductionIncrease(fixedProduction(addedType), false)
- val table = testTable(5)
- assertEquals(0, effect.computePoints(table, 0).toLong())
+ val player = SimplePlayer(0, testTable(5))
+ assertEquals(0, effect.computePoints(player).toLong())
}
companion object {
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/RawPointsIncreaseTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/RawPointsIncreaseTest.kt
index 844c28eb..2cdf6781 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/RawPointsIncreaseTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/RawPointsIncreaseTest.kt
@@ -5,6 +5,7 @@ import org.junit.experimental.theories.DataPoints
import org.junit.experimental.theories.Theories
import org.junit.experimental.theories.Theory
import org.junit.runner.RunWith
+import org.luxons.sevenwonders.game.SimplePlayer
import org.luxons.sevenwonders.game.test.testTable
@RunWith(Theories::class)
@@ -13,8 +14,8 @@ class RawPointsIncreaseTest {
@Theory
fun computePoints_equalsNbOfPoints(points: Int) {
val rawPointsIncrease = RawPointsIncrease(points)
- val table = testTable(5)
- assertEquals(points.toLong(), rawPointsIncrease.computePoints(table, 0).toLong())
+ val player = SimplePlayer(0, testTable(5))
+ assertEquals(points.toLong(), rawPointsIncrease.computePoints(player).toLong())
}
companion object {
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/ScienceProgressTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/ScienceProgressTest.kt
index cbea1581..db13e641 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/ScienceProgressTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/ScienceProgressTest.kt
@@ -24,7 +24,7 @@ class ScienceProgressTest {
board.science.addAll(initialScience)
val effect = createScienceProgress(compasses, wheels, tablets, jokers)
- effect.apply(board)
+ effect.applyTo(board)
assertEquals((initCompasses + compasses).toLong(), board.science.getQuantity(ScienceType.COMPASS).toLong())
assertEquals((initWheels + wheels).toLong(), board.science.getQuantity(ScienceType.WHEEL).toLong())
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/SpecialAbilityActivationTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/SpecialAbilityActivationTest.kt
index 0531022d..eeaa5047 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/SpecialAbilityActivationTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/effects/SpecialAbilityActivationTest.kt
@@ -8,6 +8,7 @@ import org.junit.experimental.theories.DataPoints
import org.junit.experimental.theories.Theories
import org.junit.experimental.theories.Theory
import org.junit.runner.RunWith
+import org.luxons.sevenwonders.game.SimplePlayer
import org.luxons.sevenwonders.game.boards.RelativeBoardPosition
import org.luxons.sevenwonders.game.cards.Card
import org.luxons.sevenwonders.game.cards.Color
@@ -20,12 +21,11 @@ class SpecialAbilityActivationTest {
@Theory
fun apply_addsAbility(ability: SpecialAbility) {
val effect = SpecialAbilityActivation(ability)
- val table = testTable(5)
+ val player = SimplePlayer(0, testTable(5))
- effect.apply(table, 0)
+ effect.applyTo(player)
- val board = table.getBoard(0)
- assertTrue(board.hasSpecial(ability))
+ assertTrue(player.board.hasSpecial(ability))
}
@Theory
@@ -33,46 +33,41 @@ class SpecialAbilityActivationTest {
Assume.assumeTrue(ability !== SpecialAbility.COPY_GUILD)
val effect = SpecialAbilityActivation(ability)
- val table = testTable(5)
+ val player = SimplePlayer(0, testTable(5))
- assertEquals(0, effect.computePoints(table, 0).toLong())
+ assertEquals(0, effect.computePoints(player).toLong())
}
@Theory
fun computePoints_copiedGuild(guildCard: Card, neighbour: RelativeBoardPosition) {
val effect = SpecialAbilityActivation(SpecialAbility.COPY_GUILD)
- val table = testTable(5)
+ val player = SimplePlayer(0, testTable(5))
- val neighbourBoard = table.getBoard(0, neighbour)
+ val neighbourBoard = player.getBoard(neighbour)
neighbourBoard.addCard(guildCard)
- val board = table.getBoard(0)
- board.copiedGuild = guildCard
+ player.board.copiedGuild = guildCard
- val directPointsFromGuildCard = guildCard.effects.stream().mapToInt { e -> e.computePoints(table, 0) }.sum()
- assertEquals(directPointsFromGuildCard.toLong(), effect.computePoints(table, 0).toLong())
+ val directPointsFromGuildCard = guildCard.effects.stream().mapToInt { e -> e.computePoints(player) }.sum()
+ assertEquals(directPointsFromGuildCard.toLong(), effect.computePoints(player).toLong())
}
@Test(expected = IllegalStateException::class)
fun computePoints_copyGuild_failWhenNoChosenGuild() {
val effect = SpecialAbilityActivation(SpecialAbility.COPY_GUILD)
- val table = testTable(5)
- effect.computePoints(table, 0)
+ val player = SimplePlayer(0, testTable(5))
+ effect.computePoints(player)
}
companion object {
@JvmStatic
@DataPoints
- fun abilities(): Array<SpecialAbility> {
- return SpecialAbility.values()
- }
+ fun abilities(): Array<SpecialAbility> = SpecialAbility.values()
@JvmStatic
@DataPoints
- fun neighbours(): Array<RelativeBoardPosition> {
- return arrayOf(RelativeBoardPosition.LEFT, RelativeBoardPosition.RIGHT)
- }
+ fun neighbours(): Array<RelativeBoardPosition> = arrayOf(RelativeBoardPosition.LEFT, RelativeBoardPosition.RIGHT)
@JvmStatic
@DataPoints
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/moves/BuildWonderMoveTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/moves/BuildWonderMoveTest.kt
index ee461e38..d1b380e0 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/moves/BuildWonderMoveTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/moves/BuildWonderMoveTest.kt
@@ -3,6 +3,7 @@ package org.luxons.sevenwonders.game.moves
import org.junit.Assert.assertEquals
import org.junit.Assert.fail
import org.junit.Test
+import org.luxons.sevenwonders.game.PlayerContext
import org.luxons.sevenwonders.game.Settings
import org.luxons.sevenwonders.game.api.Table
import org.luxons.sevenwonders.game.cards.Card
@@ -15,17 +16,16 @@ import org.luxons.sevenwonders.game.test.testTable
class BuildWonderMoveTest {
@Test(expected = InvalidMoveException::class)
- fun validate_failsWhenCardNotInHand() {
+ fun init_failsWhenCardNotInHand() {
val table = testTable(3)
val hand = sampleCards(0, 7)
+ val playerContext = PlayerContext(0, table, hand)
val anotherCard = testCard("Card that is not in the hand")
- val move = createMove(0, anotherCard, MoveType.UPGRADE_WONDER)
-
- move.validate(table, hand)
+ createMove(playerContext, anotherCard, MoveType.UPGRADE_WONDER)
}
@Test(expected = InvalidMoveException::class)
- fun validate_failsWhenWonderIsCompletelyBuilt() {
+ fun init_failsWhenWonderIsCompletelyBuilt() {
val settings = testSettings(3)
val table = testTable(settings)
val hand = sampleCards(0, 7)
@@ -49,10 +49,10 @@ class BuildWonderMoveTest {
private fun buildOneWonderLevel(settings: Settings, table: Table, hand: List<Card>, cardIndex: Int) {
val card = hand[cardIndex]
- val move = createMove(0, card, MoveType.UPGRADE_WONDER)
- move.validate(table, hand)
- move.place(table, mutableListOf(), settings)
- move.activate(table, emptyList(), settings)
+ val playerContext = PlayerContext(0, table, hand)
+ val move = createMove(playerContext, card, MoveType.UPGRADE_WONDER)
+ move.place(mutableListOf(), settings)
+ move.activate(emptyList(), settings)
}
@Test
@@ -61,12 +61,12 @@ class BuildWonderMoveTest {
val table = testTable(settings)
val hand = sampleCards(0, 7)
val cardToUse = hand[0]
- val move = createMove(0, cardToUse, MoveType.UPGRADE_WONDER)
- move.validate(table, hand) // should not fail
+ val playerContext = PlayerContext(0, table, hand)
+ val move = createMove(playerContext, cardToUse, MoveType.UPGRADE_WONDER)
val initialStage = table.getBoard(0).wonder.nbBuiltStages
- move.place(table, mutableListOf(), settings)
+ move.place(mutableListOf(), settings)
val newStage = table.getBoard(0).wonder.nbBuiltStages
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/resources/BestPriceCalculatorTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/resources/BestPriceCalculatorTest.kt
index 005959bc..ca279d97 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/resources/BestPriceCalculatorTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/resources/BestPriceCalculatorTest.kt
@@ -2,6 +2,7 @@ package org.luxons.sevenwonders.game.resources
import org.junit.Assert.assertEquals
import org.junit.Test
+import org.luxons.sevenwonders.game.SimplePlayer
import org.luxons.sevenwonders.game.api.Table
import org.luxons.sevenwonders.game.resources.Provider.LEFT_PLAYER
import org.luxons.sevenwonders.game.resources.Provider.RIGHT_PLAYER
@@ -18,9 +19,10 @@ class BestPriceCalculatorTest {
@Test
fun bestPrice_0forEmptyResources() {
val table = testTable(3)
+ val player0 = SimplePlayer(0, table)
val emptyResources = Resources()
val emptyTransactions = ResourceTransactions()
- assertEquals(TransactionPlan(0, emptyTransactions), bestSolution(emptyResources, table, 0))
+ assertEquals(TransactionPlan(0, emptyTransactions), bestSolution(emptyResources, player0))
}
@Test
@@ -29,6 +31,10 @@ class BestPriceCalculatorTest {
val main = testBoard(STONE)
val right = testBoard(WOOD)
val table = Table(Arrays.asList(main, right, left))
+
+ val player0 = SimplePlayer(0, table)
+ val player1 = SimplePlayer(1, table)
+ val player2 = SimplePlayer(2, table)
val resources = createResources(STONE, STONE)
@@ -39,9 +45,9 @@ class BestPriceCalculatorTest {
val stoneRight = createTransactions(stoneRightSingle)
val stoneLeftAndRight = createTransactions(stoneLeftSingle, stoneRightSingle)
- assertEquals(TransactionPlan(2, stoneLeft), bestSolution(resources, table, 0))
- assertEquals(TransactionPlan(4, stoneLeftAndRight), bestSolution(resources, table, 1))
- assertEquals(TransactionPlan(2, stoneRight), bestSolution(resources, table, 2))
+ assertEquals(TransactionPlan(2, stoneLeft), bestSolution(resources, player0))
+ assertEquals(TransactionPlan(4, stoneLeftAndRight), bestSolution(resources, player1))
+ assertEquals(TransactionPlan(2, stoneRight), bestSolution(resources, player2))
}
@Test
@@ -54,15 +60,20 @@ class BestPriceCalculatorTest {
val opposite = testBoard(GLASS)
val table = Table(Arrays.asList(main, right, opposite, left))
+ val player0 = SimplePlayer(0, table)
+ val player1 = SimplePlayer(1, table)
+ val player2 = SimplePlayer(2, table)
+ val player3 = SimplePlayer(3, table)
+
val resources = createResources(WOOD)
val woodLeft = createTransactions(LEFT_PLAYER, WOOD)
val woodRight = createTransactions(RIGHT_PLAYER, WOOD)
- assertEquals(TransactionPlan(1, woodRight), bestSolution(resources, table, 0))
- assertEquals(TransactionPlan(0, ResourceTransactions()), bestSolution(resources, table, 1))
- assertEquals(TransactionPlan(2, woodLeft), bestSolution(resources, table, 2))
- assertEquals(TransactionPlan(0, ResourceTransactions()), bestSolution(resources, table, 3))
+ assertEquals(TransactionPlan(1, woodRight), bestSolution(resources, player0))
+ assertEquals(TransactionPlan(0, ResourceTransactions()), bestSolution(resources, player1))
+ assertEquals(TransactionPlan(2, woodLeft), bestSolution(resources, player2))
+ assertEquals(TransactionPlan(0, ResourceTransactions()), bestSolution(resources, player3))
}
@Test
@@ -78,12 +89,16 @@ class BestPriceCalculatorTest {
val table = Table(Arrays.asList(main, right, left))
+ val player0 = SimplePlayer(0, table)
+ val player1 = SimplePlayer(1, table)
+ val player2 = SimplePlayer(2, table)
+
val resources = createResources(WOOD)
val woodRight = createTransactions(RIGHT_PLAYER, WOOD)
- assertEquals(TransactionPlan(1, woodRight), bestSolution(resources, table, 0))
- assertEquals(TransactionPlan(0, ResourceTransactions()), bestSolution(resources, table, 1))
- assertEquals(TransactionPlan(0, ResourceTransactions()), bestSolution(resources, table, 2))
+ assertEquals(TransactionPlan(1, woodRight), bestSolution(resources, player0))
+ assertEquals(TransactionPlan(0, ResourceTransactions()), bestSolution(resources, player1))
+ assertEquals(TransactionPlan(0, ResourceTransactions()), bestSolution(resources, player2))
}
@Test
@@ -102,12 +117,16 @@ class BestPriceCalculatorTest {
val table = Table(Arrays.asList(main, right, left))
+ val player0 = SimplePlayer(0, table)
+ val player1 = SimplePlayer(1, table)
+ val player2 = SimplePlayer(2, table)
+
val resources = createResources(ORE, CLAY)
val oreAndClayLeft = createTransactions(LEFT_PLAYER, ORE, CLAY)
val clayRight = createTransactions(RIGHT_PLAYER, CLAY)
- assertEquals(TransactionPlan(1, clayRight), bestSolution(resources, table, 0))
- assertEquals(TransactionPlan(0, ResourceTransactions()), bestSolution(resources, table, 1))
- assertEquals(TransactionPlan(4, oreAndClayLeft), bestSolution(resources, table, 2))
+ assertEquals(TransactionPlan(1, clayRight), bestSolution(resources, player0))
+ assertEquals(TransactionPlan(0, ResourceTransactions()), bestSolution(resources, player1))
+ assertEquals(TransactionPlan(4, oreAndClayLeft), bestSolution(resources, player2))
}
}
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/resources/ProductionTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/resources/ProductionTest.kt
index ab0b22cf..92623a2b 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/resources/ProductionTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/resources/ProductionTest.kt
@@ -1,14 +1,10 @@
package org.luxons.sevenwonders.game.resources
-import java.util.EnumSet
-import java.util.HashSet
-
+import org.junit.Assert.*
import org.junit.Before
import org.junit.Test
-
-import org.junit.Assert.assertEquals
-import org.junit.Assert.assertFalse
-import org.junit.Assert.assertTrue
+import java.util.EnumSet
+import java.util.HashSet
class ProductionTest {
@@ -266,15 +262,6 @@ class ProductionTest {
}
@Test
- fun equals_falseWhenNull() {
- val production = Production()
- production.addFixedResource(ResourceType.GLASS, 1)
- production.addChoice(ResourceType.ORE, ResourceType.WOOD)
-
- assertFalse(production == null)
- }
-
- @Test
fun equals_trueWhenSame() {
val production = Production()
assertEquals(production, production)
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/test/TestUtils.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/test/TestUtils.kt
index feda9423..2208431d 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/test/TestUtils.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/test/TestUtils.kt
@@ -1,10 +1,13 @@
package org.luxons.sevenwonders.game.test
+import org.luxons.sevenwonders.game.Player
+import org.luxons.sevenwonders.game.PlayerContext
import org.luxons.sevenwonders.game.Settings
import org.luxons.sevenwonders.game.api.CustomizableSettings
import org.luxons.sevenwonders.game.api.PlayerMove
import org.luxons.sevenwonders.game.api.Table
import org.luxons.sevenwonders.game.boards.Board
+import org.luxons.sevenwonders.game.boards.RelativeBoardPosition
import org.luxons.sevenwonders.game.boards.Science
import org.luxons.sevenwonders.game.boards.ScienceType
import org.luxons.sevenwonders.game.cards.Card
@@ -203,14 +206,21 @@ fun createScience(compasses: Int, wheels: Int, tablets: Int, jokers: Int): Scien
return science
}
-fun playCardWithEffect(table: Table, playerIndex: Int, color: Color, effect: Effect) {
+fun playCardWithEffect(player: Player, color: Color, effect: Effect) {
val card = testCard(color, effect)
- val board = table.getBoard(playerIndex)
- board.addCard(card)
- card.applyTo(table, playerIndex, ResourceTransactions())
+ player.board.addCard(card)
+ card.applyTo(player, ResourceTransactions())
}
-fun createMove(playerIndex: Int, card: Card, type: MoveType, vararg transactions: ResourceTransaction): Move {
+fun createMove(context: PlayerContext, card: Card, type: MoveType, vararg transactions: ResourceTransaction): Move {
val playerMove = PlayerMove(type, card.name, Arrays.asList(*transactions))
- return type.resolve(playerIndex, card, playerMove)
+ return type.create(playerMove, card, context)
+}
+
+fun singleBoardPlayer(board: Board): Player {
+ return object: Player {
+ override val index=0
+ override val board = board
+ override fun getBoard(relativePosition: RelativeBoardPosition): Board = board
+ }
}
diff --git a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/wonders/WonderTest.kt b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/wonders/WonderTest.kt
index 9270bcca..3d2f3a80 100644
--- a/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/wonders/WonderTest.kt
+++ b/game-engine/src/test/kotlin/org/luxons/sevenwonders/game/wonders/WonderTest.kt
@@ -13,22 +13,22 @@ class WonderTest {
fun buildLevel_increasesNbBuiltStages() {
val wonder = testWonder()
assertEquals(0, wonder.nbBuiltStages.toLong())
- wonder.buildLevel(CardBack("img"))
+ wonder.placeCard(CardBack("img"))
assertEquals(1, wonder.nbBuiltStages.toLong())
- wonder.buildLevel(CardBack("img"))
+ wonder.placeCard(CardBack("img"))
assertEquals(2, wonder.nbBuiltStages.toLong())
- wonder.buildLevel(CardBack("img"))
+ wonder.placeCard(CardBack("img"))
assertEquals(3, wonder.nbBuiltStages.toLong())
}
@Test
fun buildLevel_failsIfFull() {
val wonder = testWonder()
- wonder.buildLevel(CardBack("img"))
- wonder.buildLevel(CardBack("img"))
- wonder.buildLevel(CardBack("img"))
+ wonder.placeCard(CardBack("img"))
+ wonder.placeCard(CardBack("img"))
+ wonder.placeCard(CardBack("img"))
try {
- wonder.buildLevel(CardBack("img"))
+ wonder.placeCard(CardBack("img"))
fail()
} catch (e: IllegalStateException) {
// expected exception because there is no 4th level in this wonder
bgstack15