summaryrefslogtreecommitdiff
path: root/sw-client/src
diff options
context:
space:
mode:
Diffstat (limited to 'sw-client/src')
-rw-r--r--sw-client/src/commonMain/kotlin/org/luxons/sevenwonders/client/GameState.kt47
1 files changed, 47 insertions, 0 deletions
diff --git a/sw-client/src/commonMain/kotlin/org/luxons/sevenwonders/client/GameState.kt b/sw-client/src/commonMain/kotlin/org/luxons/sevenwonders/client/GameState.kt
new file mode 100644
index 00000000..e8a393f7
--- /dev/null
+++ b/sw-client/src/commonMain/kotlin/org/luxons/sevenwonders/client/GameState.kt
@@ -0,0 +1,47 @@
+package org.luxons.sevenwonders.client
+
+import org.luxons.sevenwonders.model.Age
+import org.luxons.sevenwonders.model.PlayerMove
+import org.luxons.sevenwonders.model.TurnAction
+import org.luxons.sevenwonders.model.api.PlayerDTO
+import org.luxons.sevenwonders.model.boards.Board
+import org.luxons.sevenwonders.model.boards.RelativeBoardPosition
+import org.luxons.sevenwonders.model.cards.CardBack
+import org.luxons.sevenwonders.model.cards.HandCard
+import org.luxons.sevenwonders.model.cards.HandRotationDirection
+
+data class GameState(
+ val gameId: Long,
+ val playerIndex: Int,
+ val currentAge: Age,
+ val players: List<PlayerDTO>,
+ val boards: List<Board>,
+ val handRotationDirection: HandRotationDirection,
+ val action: TurnAction,
+ val preparedCardsByUsername: Map<String, CardBack?> = emptyMap(),
+ val currentPreparedMove: PlayerMove? = null,
+) {
+ val currentPreparedCard: HandCard?
+ get() {
+ val hand = (action as? TurnAction.PlayFromHand)?.hand
+ return hand?.firstOrNull { it.name == currentPreparedMove?.cardName }
+ }
+
+ val RelativeBoardPosition.absoluteIndex: Int
+ get() = getIndexFrom(playerIndex, boards.size)
+}
+
+fun GameState.getOwnBoard(): Board = boards[playerIndex]
+
+fun GameState.getBoard(position: RelativeBoardPosition): Board = boards[position.absoluteIndex]
+
+fun GameState.getNonNeighbourBoards(): List<Board> {
+ val nPlayers = boards.size
+ if (nPlayers <= 3) {
+ return emptyList()
+ }
+ val first = (playerIndex + 2) % nPlayers
+ val last = (playerIndex - 2 + nPlayers) % nPlayers
+ val range = if (first <= last) first..last else ((first until nPlayers) + (0..last))
+ return range.map { boards[it] }
+}
bgstack15