From 101dcb7213f4ebf759b0aad65f0976b7f78f4a86 Mon Sep 17 00:00:00 2001 From: Joffrey BION Date: Fri, 17 May 2019 00:01:57 +0200 Subject: WIP back to JVM for common module to see if it works --- .../org/luxons/sevenwonders/game/api/Boards.kt | 44 --------------- .../sevenwonders/game/api/CustomizableSettings.kt | 45 --------------- .../luxons/sevenwonders/game/api/PlayerTurnInfo.kt | 35 ------------ .../org/luxons/sevenwonders/game/api/Table.kt | 24 -------- .../game/boards/RelativeBoardPosition.kt | 16 ------ .../org/luxons/sevenwonders/game/cards/Cards.kt | 65 ---------------------- .../game/cards/HandRotationDirection.kt | 11 ---- .../org/luxons/sevenwonders/game/moves/MoveType.kt | 9 --- .../luxons/sevenwonders/game/resources/Provider.kt | 8 --- .../game/resources/ResourceTransactions.kt | 9 --- .../sevenwonders/game/resources/ResourceType.kt | 26 --------- .../org/luxons/sevenwonders/game/wonders/Wonder.kt | 32 ----------- .../org/luxons/sevenwonders/game/api/Boards.kt | 44 +++++++++++++++ .../sevenwonders/game/api/CustomizableSettings.kt | 45 +++++++++++++++ .../luxons/sevenwonders/game/api/PlayerTurnInfo.kt | 35 ++++++++++++ .../org/luxons/sevenwonders/game/api/Table.kt | 24 ++++++++ .../game/boards/RelativeBoardPosition.kt | 16 ++++++ .../org/luxons/sevenwonders/game/cards/Cards.kt | 65 ++++++++++++++++++++++ .../game/cards/HandRotationDirection.kt | 11 ++++ .../org/luxons/sevenwonders/game/moves/MoveType.kt | 9 +++ .../luxons/sevenwonders/game/resources/Provider.kt | 8 +++ .../game/resources/ResourceTransactions.kt | 9 +++ .../sevenwonders/game/resources/ResourceType.kt | 26 +++++++++ .../org/luxons/sevenwonders/game/wonders/Wonder.kt | 32 +++++++++++ 24 files changed, 324 insertions(+), 324 deletions(-) delete mode 100644 sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/api/Boards.kt delete mode 100644 sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/api/CustomizableSettings.kt delete mode 100644 sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/api/PlayerTurnInfo.kt delete mode 100644 sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/api/Table.kt delete mode 100644 sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/boards/RelativeBoardPosition.kt delete mode 100644 sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/cards/Cards.kt delete mode 100644 sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/cards/HandRotationDirection.kt delete mode 100644 sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/moves/MoveType.kt delete mode 100644 sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/resources/Provider.kt delete mode 100644 sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransactions.kt delete mode 100644 sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/resources/ResourceType.kt delete mode 100644 sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/wonders/Wonder.kt create mode 100644 sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/api/Boards.kt create mode 100644 sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/api/CustomizableSettings.kt create mode 100644 sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/api/PlayerTurnInfo.kt create mode 100644 sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/api/Table.kt create mode 100644 sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/boards/RelativeBoardPosition.kt create mode 100644 sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/cards/Cards.kt create mode 100644 sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/cards/HandRotationDirection.kt create mode 100644 sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/moves/MoveType.kt create mode 100644 sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/resources/Provider.kt create mode 100644 sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransactions.kt create mode 100644 sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceType.kt create mode 100644 sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/wonders/Wonder.kt (limited to 'sw-common-model/src') diff --git a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/api/Boards.kt b/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/api/Boards.kt deleted file mode 100644 index 698615e9..00000000 --- a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/api/Boards.kt +++ /dev/null @@ -1,44 +0,0 @@ -package org.luxons.sevenwonders.game.api - -import org.luxons.sevenwonders.game.cards.TableCard -import org.luxons.sevenwonders.game.resources.ResourceType -import org.luxons.sevenwonders.game.wonders.ApiWonder - -data class Board( - val playerIndex: Int, - val wonder: ApiWonder, - val production: ApiProduction, - val publicProduction: ApiProduction, - val science: ApiScience, - val military: ApiMilitary, - val playedCards: List>, - val gold: Int -) - -data class ApiRequirements( - val gold: Int = 0, - val resources: List = emptyList() -) - -data class ApiProduction( - val fixedResources: List, - val alternativeResources: Set> -) - -data class ApiCountedResource( - val count: Int, - val type: ResourceType -) - -data class ApiMilitary( - val nbShields: Int, - val totalPoints: Int, - val nbDefeatTokens: Int -) - -data class ApiScience( - val jokers: Int, - val nbWheels: Int, - val nbCompasses: Int, - val nbTablets: Int -) diff --git a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/api/CustomizableSettings.kt b/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/api/CustomizableSettings.kt deleted file mode 100644 index ac2c2b14..00000000 --- a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/api/CustomizableSettings.kt +++ /dev/null @@ -1,45 +0,0 @@ -package org.luxons.sevenwonders.game.api - -import kotlin.random.Random - -data class CustomizableSettings( - val randomSeedForTests: Long? = null, - val timeLimitInSeconds: Int = 45, - val wonderSidePickMethod: WonderSidePickMethod = WonderSidePickMethod.EACH_RANDOM, - val initialGold: Int = 3, - val discardedCardGold: Int = 3, - val defaultTradingCost: Int = 2, - val pointsPer3Gold: Int = 1, - val lostPointsPerDefeat: Int = 1, - val wonPointsPerVictoryPerAge: Map = mapOf(1 to 1, 2 to 3, 3 to 5) -) - -enum class WonderSide { - A, - B -} - -enum class WonderSidePickMethod { - ALL_A { - override fun pickSide(random: Random, lastPickedSide: WonderSide?): WonderSide { - return WonderSide.A - } - }, - ALL_B { - override fun pickSide(random: Random, lastPickedSide: WonderSide?): WonderSide { - return WonderSide.B - } - }, - EACH_RANDOM { - override fun pickSide(random: Random, lastPickedSide: WonderSide?): WonderSide { - return if (random.nextBoolean()) WonderSide.A else WonderSide.B - } - }, - SAME_RANDOM_FOR_ALL { - override fun pickSide(random: Random, lastPickedSide: WonderSide?): WonderSide { - return lastPickedSide ?: if (random.nextBoolean()) WonderSide.A else WonderSide.B - } - }; - - abstract fun pickSide(random: Random, lastPickedSide: WonderSide?): WonderSide -} diff --git a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/api/PlayerTurnInfo.kt b/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/api/PlayerTurnInfo.kt deleted file mode 100644 index c5feb6c5..00000000 --- a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/api/PlayerTurnInfo.kt +++ /dev/null @@ -1,35 +0,0 @@ -package org.luxons.sevenwonders.game.api - -import org.luxons.sevenwonders.game.cards.HandCard -import org.luxons.sevenwonders.game.cards.TableCard -import org.luxons.sevenwonders.game.moves.MoveType -import org.luxons.sevenwonders.game.resources.ResourceTransactions -import org.luxons.sevenwonders.game.resources.noTransactions -import org.luxons.sevenwonders.game.wonders.WonderBuildability - -enum class Action(val message: String) { - PLAY("Pick the card you want to play or discard."), - PLAY_2("Pick the first card you want to play or discard. Note that you have the ability to play these 2 last cards. You will choose how to play the last one during your next turn."), - PLAY_LAST("You have the special ability to play your last card. Choose how you want to play it."), - PICK_NEIGHBOR_GUILD("Choose a Guild card (purple) that you want to copy from one of your neighbours."), - WAIT("Please wait for other players to perform extra actions.") -} - -data class PlayerTurnInfo( - val playerIndex: Int, - val table: Table, - val action: Action, - val hand: List, - val preparedMove: PlayedMove?, - val neighbourGuildCards: List -) { - val currentAge: Int = table.currentAge - val message: String = action.message - val wonderBuildability: WonderBuildability = table.boards[playerIndex].wonder.buildability -} - -data class PlayerMove( - val type: MoveType, - val cardName: String, - val transactions: ResourceTransactions = noTransactions() -) diff --git a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/api/Table.kt b/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/api/Table.kt deleted file mode 100644 index 23ab6ee2..00000000 --- a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/api/Table.kt +++ /dev/null @@ -1,24 +0,0 @@ -package org.luxons.sevenwonders.game.api - -import org.luxons.sevenwonders.game.cards.HandRotationDirection -import org.luxons.sevenwonders.game.cards.TableCard -import org.luxons.sevenwonders.game.moves.MoveType -import org.luxons.sevenwonders.game.resources.ResourceTransactions - -typealias Age = Int - -data class Table( - val boards: List, - val currentAge: Age, - val handRotationDirection: HandRotationDirection, - val lastPlayedMoves: List -) { - val nbPlayers: Int = boards.size -} - -data class PlayedMove( - val playerIndex: Int, - val type: MoveType, - val card: TableCard, - val transactions: ResourceTransactions -) diff --git a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/boards/RelativeBoardPosition.kt b/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/boards/RelativeBoardPosition.kt deleted file mode 100644 index 3a8387a3..00000000 --- a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/boards/RelativeBoardPosition.kt +++ /dev/null @@ -1,16 +0,0 @@ -package org.luxons.sevenwonders.game.boards - -enum class RelativeBoardPosition(private val offset: Int) { - LEFT(-1), - SELF(0), - RIGHT(1); - - fun getIndexFrom(playerIndex: Int, nbPlayers: Int): Int = (playerIndex + offset) floorMod nbPlayers -} - -fun neighboursPositions() = listOf(RelativeBoardPosition.LEFT, RelativeBoardPosition.RIGHT) - -private infix fun Int.floorMod(divisor: Int): Int { - val rem = this % divisor - return if (rem >= 0) rem else rem + divisor -} diff --git a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/cards/Cards.kt b/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/cards/Cards.kt deleted file mode 100644 index ab0e0297..00000000 --- a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/cards/Cards.kt +++ /dev/null @@ -1,65 +0,0 @@ -package org.luxons.sevenwonders.game.cards - -import org.luxons.sevenwonders.game.api.ApiRequirements -import org.luxons.sevenwonders.game.resources.ResourceTransactions - -data class TableCard( - val name: String, - val color: Color, - val requirements: ApiRequirements, - val chainParent: String?, - val chainChildren: List, - val image: String, - val back: CardBack, - val playedDuringLastMove: Boolean -) - -/** - * 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. - */ -data class HandCard( - val name: String, - val color: Color, - val requirements: ApiRequirements, - val chainParent: String?, - val chainChildren: List, - val image: String, - val back: CardBack, - val playability: CardPlayability -) - -data class CardBack(val image: String) - -enum class PlayabilityLevel { - CHAINABLE, - NO_REQUIREMENTS, - ENOUGH_RESOURCES, - ENOUGH_GOLD, - ENOUGH_GOLD_AND_RES, - REQUIRES_HELP, - MISSING_REQUIRED_GOLD, - MISSING_GOLD_FOR_RES, - UNAVAILABLE_RESOURCES, - INCOMPATIBLE_WITH_BOARD -} - -enum class Color(val isResource: Boolean) { - BROWN(true), - GREY(true), - YELLOW(false), - BLUE(false), - GREEN(false), - RED(false), - PURPLE(false) -} - -data class CardPlayability( - val isPlayable: Boolean, - val isChainable: Boolean = false, - val minPrice: Int = Int.MAX_VALUE, - val cheapestTransactions: Set = emptySet(), - val playabilityLevel: PlayabilityLevel -) { - val isFree: Boolean = minPrice == 0 -} diff --git a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/cards/HandRotationDirection.kt b/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/cards/HandRotationDirection.kt deleted file mode 100644 index a10ec19f..00000000 --- a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/cards/HandRotationDirection.kt +++ /dev/null @@ -1,11 +0,0 @@ -package org.luxons.sevenwonders.game.cards - -enum class HandRotationDirection { - LEFT, - RIGHT; - - companion object { - // clockwise (pass to the left) at age 1, and alternating - fun forAge(age: Int): HandRotationDirection = if (age % 2 == 0) RIGHT else LEFT - } -} diff --git a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/moves/MoveType.kt b/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/moves/MoveType.kt deleted file mode 100644 index d982c100..00000000 --- a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/moves/MoveType.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.luxons.sevenwonders.game.moves - -enum class MoveType { - PLAY, - PLAY_FREE, - UPGRADE_WONDER, - DISCARD, - COPY_GUILD; -} diff --git a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/resources/Provider.kt b/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/resources/Provider.kt deleted file mode 100644 index 5d0f3159..00000000 --- a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/resources/Provider.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.luxons.sevenwonders.game.resources - -import org.luxons.sevenwonders.game.boards.RelativeBoardPosition - -enum class Provider(val boardPosition: RelativeBoardPosition) { - LEFT_PLAYER(RelativeBoardPosition.LEFT), - RIGHT_PLAYER(RelativeBoardPosition.RIGHT) -} diff --git a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransactions.kt b/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransactions.kt deleted file mode 100644 index 77a8670d..00000000 --- a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransactions.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.luxons.sevenwonders.game.resources - -import org.luxons.sevenwonders.game.api.ApiCountedResource - -typealias ResourceTransactions = Collection - -data class ResourceTransaction(val provider: Provider, val resources: List) - -fun noTransactions(): ResourceTransactions = emptySet() diff --git a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/resources/ResourceType.kt b/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/resources/ResourceType.kt deleted file mode 100644 index 5c92b887..00000000 --- a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/resources/ResourceType.kt +++ /dev/null @@ -1,26 +0,0 @@ -package org.luxons.sevenwonders.game.resources - -enum class ResourceType(val symbol: Char) { - WOOD('W'), - STONE('S'), - ORE('O'), - CLAY('C'), - GLASS('G'), - PAPYRUS('P'), - LOOM('L'); - - companion object { - - private val typesPerSymbol = values().map { it.symbol to it }.toMap() - - fun fromSymbol(symbol: String): ResourceType { - if (symbol.length != 1) { - throw IllegalArgumentException("The given symbol must be a valid single-char resource type, got $symbol") - } - return fromSymbol(symbol[0]) - } - - fun fromSymbol(symbol: Char?): ResourceType = - typesPerSymbol[symbol] ?: throw IllegalArgumentException("Unknown resource type symbol '$symbol'") - } -} diff --git a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/wonders/Wonder.kt b/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/wonders/Wonder.kt deleted file mode 100644 index 6480e935..00000000 --- a/sw-common-model/src/commonMain/kotlin/org/luxons/sevenwonders/game/wonders/Wonder.kt +++ /dev/null @@ -1,32 +0,0 @@ -package org.luxons.sevenwonders.game.wonders - -import org.luxons.sevenwonders.game.api.ApiRequirements -import org.luxons.sevenwonders.game.cards.CardBack -import org.luxons.sevenwonders.game.cards.PlayabilityLevel -import org.luxons.sevenwonders.game.resources.ResourceTransactions -import org.luxons.sevenwonders.game.resources.ResourceType - -data class ApiWonder( - val name: String, - val initialResource: ResourceType, - val stages: List, - val image: String, - val nbBuiltStages: Int, - val buildability: WonderBuildability -) - -data class ApiWonderStage( - val cardBack: CardBack?, - val isBuilt: Boolean, - val requirements: ApiRequirements, - val builtDuringLastMove: Boolean -) - -data class WonderBuildability( - val isBuildable: Boolean, - val minPrice: Int = Int.MAX_VALUE, - val cheapestTransactions: Set = emptySet(), - val playabilityLevel: PlayabilityLevel -) { - val isFree: Boolean = minPrice == 0 -} diff --git a/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/api/Boards.kt b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/api/Boards.kt new file mode 100644 index 00000000..698615e9 --- /dev/null +++ b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/api/Boards.kt @@ -0,0 +1,44 @@ +package org.luxons.sevenwonders.game.api + +import org.luxons.sevenwonders.game.cards.TableCard +import org.luxons.sevenwonders.game.resources.ResourceType +import org.luxons.sevenwonders.game.wonders.ApiWonder + +data class Board( + val playerIndex: Int, + val wonder: ApiWonder, + val production: ApiProduction, + val publicProduction: ApiProduction, + val science: ApiScience, + val military: ApiMilitary, + val playedCards: List>, + val gold: Int +) + +data class ApiRequirements( + val gold: Int = 0, + val resources: List = emptyList() +) + +data class ApiProduction( + val fixedResources: List, + val alternativeResources: Set> +) + +data class ApiCountedResource( + val count: Int, + val type: ResourceType +) + +data class ApiMilitary( + val nbShields: Int, + val totalPoints: Int, + val nbDefeatTokens: Int +) + +data class ApiScience( + val jokers: Int, + val nbWheels: Int, + val nbCompasses: Int, + val nbTablets: Int +) diff --git a/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/api/CustomizableSettings.kt b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/api/CustomizableSettings.kt new file mode 100644 index 00000000..ac2c2b14 --- /dev/null +++ b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/api/CustomizableSettings.kt @@ -0,0 +1,45 @@ +package org.luxons.sevenwonders.game.api + +import kotlin.random.Random + +data class CustomizableSettings( + val randomSeedForTests: Long? = null, + val timeLimitInSeconds: Int = 45, + val wonderSidePickMethod: WonderSidePickMethod = WonderSidePickMethod.EACH_RANDOM, + val initialGold: Int = 3, + val discardedCardGold: Int = 3, + val defaultTradingCost: Int = 2, + val pointsPer3Gold: Int = 1, + val lostPointsPerDefeat: Int = 1, + val wonPointsPerVictoryPerAge: Map = mapOf(1 to 1, 2 to 3, 3 to 5) +) + +enum class WonderSide { + A, + B +} + +enum class WonderSidePickMethod { + ALL_A { + override fun pickSide(random: Random, lastPickedSide: WonderSide?): WonderSide { + return WonderSide.A + } + }, + ALL_B { + override fun pickSide(random: Random, lastPickedSide: WonderSide?): WonderSide { + return WonderSide.B + } + }, + EACH_RANDOM { + override fun pickSide(random: Random, lastPickedSide: WonderSide?): WonderSide { + return if (random.nextBoolean()) WonderSide.A else WonderSide.B + } + }, + SAME_RANDOM_FOR_ALL { + override fun pickSide(random: Random, lastPickedSide: WonderSide?): WonderSide { + return lastPickedSide ?: if (random.nextBoolean()) WonderSide.A else WonderSide.B + } + }; + + abstract fun pickSide(random: Random, lastPickedSide: WonderSide?): WonderSide +} diff --git a/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/api/PlayerTurnInfo.kt b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/api/PlayerTurnInfo.kt new file mode 100644 index 00000000..c5feb6c5 --- /dev/null +++ b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/api/PlayerTurnInfo.kt @@ -0,0 +1,35 @@ +package org.luxons.sevenwonders.game.api + +import org.luxons.sevenwonders.game.cards.HandCard +import org.luxons.sevenwonders.game.cards.TableCard +import org.luxons.sevenwonders.game.moves.MoveType +import org.luxons.sevenwonders.game.resources.ResourceTransactions +import org.luxons.sevenwonders.game.resources.noTransactions +import org.luxons.sevenwonders.game.wonders.WonderBuildability + +enum class Action(val message: String) { + PLAY("Pick the card you want to play or discard."), + PLAY_2("Pick the first card you want to play or discard. Note that you have the ability to play these 2 last cards. You will choose how to play the last one during your next turn."), + PLAY_LAST("You have the special ability to play your last card. Choose how you want to play it."), + PICK_NEIGHBOR_GUILD("Choose a Guild card (purple) that you want to copy from one of your neighbours."), + WAIT("Please wait for other players to perform extra actions.") +} + +data class PlayerTurnInfo( + val playerIndex: Int, + val table: Table, + val action: Action, + val hand: List, + val preparedMove: PlayedMove?, + val neighbourGuildCards: List +) { + val currentAge: Int = table.currentAge + val message: String = action.message + val wonderBuildability: WonderBuildability = table.boards[playerIndex].wonder.buildability +} + +data class PlayerMove( + val type: MoveType, + val cardName: String, + val transactions: ResourceTransactions = noTransactions() +) diff --git a/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/api/Table.kt b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/api/Table.kt new file mode 100644 index 00000000..23ab6ee2 --- /dev/null +++ b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/api/Table.kt @@ -0,0 +1,24 @@ +package org.luxons.sevenwonders.game.api + +import org.luxons.sevenwonders.game.cards.HandRotationDirection +import org.luxons.sevenwonders.game.cards.TableCard +import org.luxons.sevenwonders.game.moves.MoveType +import org.luxons.sevenwonders.game.resources.ResourceTransactions + +typealias Age = Int + +data class Table( + val boards: List, + val currentAge: Age, + val handRotationDirection: HandRotationDirection, + val lastPlayedMoves: List +) { + val nbPlayers: Int = boards.size +} + +data class PlayedMove( + val playerIndex: Int, + val type: MoveType, + val card: TableCard, + val transactions: ResourceTransactions +) diff --git a/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/boards/RelativeBoardPosition.kt b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/boards/RelativeBoardPosition.kt new file mode 100644 index 00000000..3a8387a3 --- /dev/null +++ b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/boards/RelativeBoardPosition.kt @@ -0,0 +1,16 @@ +package org.luxons.sevenwonders.game.boards + +enum class RelativeBoardPosition(private val offset: Int) { + LEFT(-1), + SELF(0), + RIGHT(1); + + fun getIndexFrom(playerIndex: Int, nbPlayers: Int): Int = (playerIndex + offset) floorMod nbPlayers +} + +fun neighboursPositions() = listOf(RelativeBoardPosition.LEFT, RelativeBoardPosition.RIGHT) + +private infix fun Int.floorMod(divisor: Int): Int { + val rem = this % divisor + return if (rem >= 0) rem else rem + divisor +} diff --git a/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/cards/Cards.kt b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/cards/Cards.kt new file mode 100644 index 00000000..ab0e0297 --- /dev/null +++ b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/cards/Cards.kt @@ -0,0 +1,65 @@ +package org.luxons.sevenwonders.game.cards + +import org.luxons.sevenwonders.game.api.ApiRequirements +import org.luxons.sevenwonders.game.resources.ResourceTransactions + +data class TableCard( + val name: String, + val color: Color, + val requirements: ApiRequirements, + val chainParent: String?, + val chainChildren: List, + val image: String, + val back: CardBack, + val playedDuringLastMove: Boolean +) + +/** + * 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. + */ +data class HandCard( + val name: String, + val color: Color, + val requirements: ApiRequirements, + val chainParent: String?, + val chainChildren: List, + val image: String, + val back: CardBack, + val playability: CardPlayability +) + +data class CardBack(val image: String) + +enum class PlayabilityLevel { + CHAINABLE, + NO_REQUIREMENTS, + ENOUGH_RESOURCES, + ENOUGH_GOLD, + ENOUGH_GOLD_AND_RES, + REQUIRES_HELP, + MISSING_REQUIRED_GOLD, + MISSING_GOLD_FOR_RES, + UNAVAILABLE_RESOURCES, + INCOMPATIBLE_WITH_BOARD +} + +enum class Color(val isResource: Boolean) { + BROWN(true), + GREY(true), + YELLOW(false), + BLUE(false), + GREEN(false), + RED(false), + PURPLE(false) +} + +data class CardPlayability( + val isPlayable: Boolean, + val isChainable: Boolean = false, + val minPrice: Int = Int.MAX_VALUE, + val cheapestTransactions: Set = emptySet(), + val playabilityLevel: PlayabilityLevel +) { + val isFree: Boolean = minPrice == 0 +} diff --git a/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/cards/HandRotationDirection.kt b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/cards/HandRotationDirection.kt new file mode 100644 index 00000000..a10ec19f --- /dev/null +++ b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/cards/HandRotationDirection.kt @@ -0,0 +1,11 @@ +package org.luxons.sevenwonders.game.cards + +enum class HandRotationDirection { + LEFT, + RIGHT; + + companion object { + // clockwise (pass to the left) at age 1, and alternating + fun forAge(age: Int): HandRotationDirection = if (age % 2 == 0) RIGHT else LEFT + } +} diff --git a/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/moves/MoveType.kt b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/moves/MoveType.kt new file mode 100644 index 00000000..d982c100 --- /dev/null +++ b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/moves/MoveType.kt @@ -0,0 +1,9 @@ +package org.luxons.sevenwonders.game.moves + +enum class MoveType { + PLAY, + PLAY_FREE, + UPGRADE_WONDER, + DISCARD, + COPY_GUILD; +} diff --git a/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/resources/Provider.kt b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/resources/Provider.kt new file mode 100644 index 00000000..5d0f3159 --- /dev/null +++ b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/resources/Provider.kt @@ -0,0 +1,8 @@ +package org.luxons.sevenwonders.game.resources + +import org.luxons.sevenwonders.game.boards.RelativeBoardPosition + +enum class Provider(val boardPosition: RelativeBoardPosition) { + LEFT_PLAYER(RelativeBoardPosition.LEFT), + RIGHT_PLAYER(RelativeBoardPosition.RIGHT) +} diff --git a/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransactions.kt b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransactions.kt new file mode 100644 index 00000000..77a8670d --- /dev/null +++ b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceTransactions.kt @@ -0,0 +1,9 @@ +package org.luxons.sevenwonders.game.resources + +import org.luxons.sevenwonders.game.api.ApiCountedResource + +typealias ResourceTransactions = Collection + +data class ResourceTransaction(val provider: Provider, val resources: List) + +fun noTransactions(): ResourceTransactions = emptySet() diff --git a/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceType.kt b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceType.kt new file mode 100644 index 00000000..5c92b887 --- /dev/null +++ b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/resources/ResourceType.kt @@ -0,0 +1,26 @@ +package org.luxons.sevenwonders.game.resources + +enum class ResourceType(val symbol: Char) { + WOOD('W'), + STONE('S'), + ORE('O'), + CLAY('C'), + GLASS('G'), + PAPYRUS('P'), + LOOM('L'); + + companion object { + + private val typesPerSymbol = values().map { it.symbol to it }.toMap() + + fun fromSymbol(symbol: String): ResourceType { + if (symbol.length != 1) { + throw IllegalArgumentException("The given symbol must be a valid single-char resource type, got $symbol") + } + return fromSymbol(symbol[0]) + } + + fun fromSymbol(symbol: Char?): ResourceType = + typesPerSymbol[symbol] ?: throw IllegalArgumentException("Unknown resource type symbol '$symbol'") + } +} diff --git a/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/wonders/Wonder.kt b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/wonders/Wonder.kt new file mode 100644 index 00000000..6480e935 --- /dev/null +++ b/sw-common-model/src/main/kotlin/org/luxons/sevenwonders/game/wonders/Wonder.kt @@ -0,0 +1,32 @@ +package org.luxons.sevenwonders.game.wonders + +import org.luxons.sevenwonders.game.api.ApiRequirements +import org.luxons.sevenwonders.game.cards.CardBack +import org.luxons.sevenwonders.game.cards.PlayabilityLevel +import org.luxons.sevenwonders.game.resources.ResourceTransactions +import org.luxons.sevenwonders.game.resources.ResourceType + +data class ApiWonder( + val name: String, + val initialResource: ResourceType, + val stages: List, + val image: String, + val nbBuiltStages: Int, + val buildability: WonderBuildability +) + +data class ApiWonderStage( + val cardBack: CardBack?, + val isBuilt: Boolean, + val requirements: ApiRequirements, + val builtDuringLastMove: Boolean +) + +data class WonderBuildability( + val isBuildable: Boolean, + val minPrice: Int = Int.MAX_VALUE, + val cheapestTransactions: Set = emptySet(), + val playabilityLevel: PlayabilityLevel +) { + val isFree: Boolean = minPrice == 0 +} -- cgit