From 6a91cb4afa645ca0c1712433e212fb654a68da06 Mon Sep 17 00:00:00 2001 From: joffrey-bion Date: Tue, 16 Feb 2021 01:57:13 +0100 Subject: Fix copy-guild move (points are now counted properly) Resolves: https://github.com/joffrey-bion/seven-wonders/issues/126 --- .../org/luxons/sevenwonders/engine/boards/Board.kt | 6 +++- .../luxons/sevenwonders/engine/boards/BoardTest.kt | 39 ++++++++++++++++------ .../luxons/sevenwonders/engine/test/TestUtils.kt | 10 +++--- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/sw-engine/src/main/kotlin/org/luxons/sevenwonders/engine/boards/Board.kt b/sw-engine/src/main/kotlin/org/luxons/sevenwonders/engine/boards/Board.kt index 3a3521ee..2fb5e36c 100644 --- a/sw-engine/src/main/kotlin/org/luxons/sevenwonders/engine/boards/Board.kt +++ b/sw-engine/src/main/kotlin/org/luxons/sevenwonders/engine/boards/Board.kt @@ -87,7 +87,7 @@ internal class Board( ScoreCategory.MILITARY to military.totalPoints, ScoreCategory.SCIENCE to science.computePoints(), ScoreCategory.TRADE to computePointsForCards(player, Color.YELLOW), - ScoreCategory.GUILD to computePointsForCards(player, Color.PURPLE), + ScoreCategory.GUILD to computePointsForCards(player, Color.PURPLE) + copiedGuildPoints(player), ScoreCategory.WONDER to wonder.computePoints(player), ScoreCategory.GOLD to computeGoldPoints(), ), @@ -96,6 +96,10 @@ internal class Board( private fun computePointsForCards(player: Player, color: Color): Int = playedCards.filter { it.color === color }.flatMap { it.effects }.sumBy { it.computePoints(player) } + private fun copiedGuildPoints(player: Player): Int = copiedGuild?.computePoints(player) ?: 0 + + private fun Card.computePoints(player: Player): Int = effects.sumBy { it.computePoints(player) } + private fun computeGoldPoints(): Int = gold / 3 * pointsPer3Gold internal class InsufficientFundsException(current: Int, required: Int) : diff --git a/sw-engine/src/test/kotlin/org/luxons/sevenwonders/engine/boards/BoardTest.kt b/sw-engine/src/test/kotlin/org/luxons/sevenwonders/engine/boards/BoardTest.kt index 909d5e99..821855ba 100644 --- a/sw-engine/src/test/kotlin/org/luxons/sevenwonders/engine/boards/BoardTest.kt +++ b/sw-engine/src/test/kotlin/org/luxons/sevenwonders/engine/boards/BoardTest.kt @@ -9,18 +9,10 @@ import org.junit.experimental.theories.Theories import org.junit.experimental.theories.Theory import org.junit.runner.RunWith import org.luxons.sevenwonders.engine.boards.Board.InsufficientFundsException -import org.luxons.sevenwonders.engine.effects.RawPointsIncrease -import org.luxons.sevenwonders.engine.effects.SpecialAbility -import org.luxons.sevenwonders.engine.effects.SpecialAbilityActivation +import org.luxons.sevenwonders.engine.effects.* import org.luxons.sevenwonders.engine.resources.resourcesOf -import org.luxons.sevenwonders.engine.test.addCards -import org.luxons.sevenwonders.engine.test.getDifferentColorFrom -import org.luxons.sevenwonders.engine.test.playCardWithEffect -import org.luxons.sevenwonders.engine.test.singleBoardPlayer -import org.luxons.sevenwonders.engine.test.testBoard -import org.luxons.sevenwonders.engine.test.testCard -import org.luxons.sevenwonders.engine.test.testSettings -import org.luxons.sevenwonders.engine.test.testWonder +import org.luxons.sevenwonders.engine.test.* +import org.luxons.sevenwonders.model.boards.RelativeBoardPosition import org.luxons.sevenwonders.model.cards.Color import org.luxons.sevenwonders.model.resources.ResourceType import org.luxons.sevenwonders.model.score.ScoreCategory @@ -186,6 +178,31 @@ class BoardTest { assertEquals(5 + gold / 3, score.totalPoints) } + @Theory + fun computePoints_countsCopiedGuild(@FromDataPoints("gold") gold: Int) { + assumeTrue(gold >= 0) + val left = testBoard(initialGold = gold) + val self = testBoard(initialGold = gold) + val right = testBoard(initialGold = gold) + + left.addCard(testCard(color = Color.YELLOW)) + right.addCard(testCard(color = Color.YELLOW)) + right.addCard(testCard(color = Color.YELLOW)) + self.copiedGuild = testCard( + name = "Custom guild for yellows", + color = Color.PURPLE, + effect = BonusPerBoardElement( + boards = listOf(RelativeBoardPosition.LEFT, RelativeBoardPosition.RIGHT), + type = BoardElementType.CARD, + colors = listOf(Color.YELLOW), + points = 1, + ) + ) + + val score = self.computeScore(testPlayer(left, self, right)) + assertEquals(3, score.pointsByCategory[ScoreCategory.GUILD]) + } + companion object { @JvmStatic diff --git a/sw-engine/src/test/kotlin/org/luxons/sevenwonders/engine/test/TestUtils.kt b/sw-engine/src/test/kotlin/org/luxons/sevenwonders/engine/test/TestUtils.kt index 0e8800f3..7a13eccd 100644 --- a/sw-engine/src/test/kotlin/org/luxons/sevenwonders/engine/test/TestUtils.kt +++ b/sw-engine/src/test/kotlin/org/luxons/sevenwonders/engine/test/TestUtils.kt @@ -132,12 +132,14 @@ internal fun playCardWithEffect(player: Player, color: Color, effect: Effect) { internal fun createMove(context: PlayerContext, card: Card, type: MoveType): Move = type.resolve(PlayerMove(type, card.name), card, context, emptyList()) -internal fun singleBoardPlayer(board: Board): Player = object : Player { +internal fun singleBoardPlayer(board: Board): Player = testPlayer(leftBoard = null, selfBoard = board, rightBoard = null) + +internal fun testPlayer(leftBoard: Board?, selfBoard: Board, rightBoard: Board?): Player = object : Player { override val index = 0 - override val board = board + override val board = selfBoard override fun getBoard(relativePosition: RelativeBoardPosition): Board = when (relativePosition) { - RelativeBoardPosition.LEFT -> throw RuntimeException("No LEFT board") + RelativeBoardPosition.LEFT -> leftBoard ?: error("No LEFT board") RelativeBoardPosition.SELF -> this.board - RelativeBoardPosition.RIGHT -> throw RuntimeException("No RIGHT board") + RelativeBoardPosition.RIGHT -> rightBoard ?: error("No RIGHT board") } } -- cgit