From d7420415bcd3e3d8af08b27ca29e3e72f0d1ef1b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Oliver=20R=C3=BCmpelein?= <oli_r@fg4f.de>
Date: Sat, 18 Sep 2021 12:58:25 +0200
Subject: [PATCH] Add option for initial Points, remove second color data
 constructor (not supported by serialize), formatting

---
 game.json                                        |  3 ++-
 src/main/kotlin/Main.kt                          |  2 +-
 src/main/kotlin/components/PlayerCard.kt         |  2 +-
 src/main/kotlin/components/Question.kt           |  4 ++--
 src/main/kotlin/components/QuestionGrid.kt       |  4 ++--
 src/main/kotlin/components/TopicRow.kt           | 10 +++++++---
 src/main/kotlin/components/endcard/EndCard.kt    |  4 ++--
 .../components/questiondialog/QuestionDialog.kt  |  2 +-
 .../questiondialog/QuestionDialogContent.kt      |  2 +-
 .../components/questiondialog/assets/HintText.kt |  2 +-
 .../questiondialog/buttons/DismissButton.kt      |  4 +++-
 .../player/DeferredDoubleQuestionDialogPlayer.kt |  2 +-
 .../player/QuestionDialogPlayer.kt               |  3 +--
 src/main/kotlin/data/ColorData.kt                | 16 ++--------------
 src/main/kotlin/data/Game.kt                     |  2 +-
 src/main/kotlin/data/Player.kt                   |  3 ++-
 src/main/kotlin/data/QuestionData.kt             |  2 +-
 src/main/kotlin/data/Topic.kt                    |  2 +-
 18 files changed, 32 insertions(+), 37 deletions(-)

diff --git a/game.json b/game.json
index cba23c5..b83a974 100644
--- a/game.json
+++ b/game.json
@@ -98,7 +98,8 @@
       }
     },
     {
-      "name": "Playerererer"
+      "name": "Playerererer",
+      "initialPoints": 1000
     },
     {
       "name": "P3"
diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt
index 7986658..b92305f 100644
--- a/src/main/kotlin/Main.kt
+++ b/src/main/kotlin/Main.kt
@@ -40,7 +40,7 @@ fun graphicalApplication(gameDataJson: String) = application {
 
         MaterialTheme {
             val playerPointMap: MutableMap<Player, Long> = remember {
-                loadedGame.players.map { it to 0L }.toMutableStateMap()
+                loadedGame.players.map { it to it.initialPoints }.toMutableStateMap()
             }
 
             val questionsResolved: MutableMap<QuestionData, QuestionResolution> = remember {
diff --git a/src/main/kotlin/components/PlayerCard.kt b/src/main/kotlin/components/PlayerCard.kt
index ea4c33f..dec08b7 100644
--- a/src/main/kotlin/components/PlayerCard.kt
+++ b/src/main/kotlin/components/PlayerCard.kt
@@ -18,7 +18,7 @@ import data.toColorOrDefault
 fun PlayerCard(
     player: Player,
     maxHeightFraction: Float,
-    points: Long
+    points: Long,
 ) {
     Surface(
         color = player.color.toColorOrDefault(),
diff --git a/src/main/kotlin/components/Question.kt b/src/main/kotlin/components/Question.kt
index 85b538c..bf17895 100644
--- a/src/main/kotlin/components/Question.kt
+++ b/src/main/kotlin/components/Question.kt
@@ -22,7 +22,7 @@ private fun Modifier.setButtonSize(heightFraction: Float) = this.fillMaxWidth(1f
 
 data class QuestionResolution(
     val answered: Boolean,
-    val player: Player?
+    val player: Player?,
 )
 
 @Composable
@@ -36,7 +36,7 @@ fun Question(
     heightFraction: Float,
     color: Color,
     onPointsChange: (Player, Long) -> Unit,
-    onResolve: (QuestionData, QuestionResolution) -> Unit
+    onResolve: (QuestionData, QuestionResolution) -> Unit,
 ) {
     var questionVisible by remember { mutableStateOf(false) }
     var pointsButtonActive by remember { mutableStateOf(false) }
diff --git a/src/main/kotlin/components/QuestionGrid.kt b/src/main/kotlin/components/QuestionGrid.kt
index 434d061..594d96a 100644
--- a/src/main/kotlin/components/QuestionGrid.kt
+++ b/src/main/kotlin/components/QuestionGrid.kt
@@ -1,7 +1,7 @@
 package components
 
 import androidx.compose.foundation.layout.Row
-import androidx.compose.runtime.*
+import androidx.compose.runtime.Composable
 import data.Game
 import data.Player
 import data.QuestionData
@@ -13,7 +13,7 @@ fun QuestionGrid(
     secondRoundDouble: Boolean,
     questionResolved: Map<QuestionData, QuestionResolution>,
     onPointsChange: (player: Player, points: Long) -> Unit,
-    onResolveQuestion: (QuestionData, QuestionResolution) -> Unit
+    onResolveQuestion: (QuestionData, QuestionResolution) -> Unit,
 ) {
     val users = game.players
     val numberOfColumns = game.topics.size
diff --git a/src/main/kotlin/components/TopicRow.kt b/src/main/kotlin/components/TopicRow.kt
index 57432d2..1d79001 100644
--- a/src/main/kotlin/components/TopicRow.kt
+++ b/src/main/kotlin/components/TopicRow.kt
@@ -9,7 +9,10 @@ import androidx.compose.runtime.Composable
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.em
-import data.*
+import data.Player
+import data.QuestionData
+import data.Topic
+import data.toColorOrDefault
 
 @Composable
 @Suppress("FunctionName")
@@ -20,7 +23,7 @@ fun TopicRow(
     columnFraction: Float,
     questionsResolved: Map<QuestionData, QuestionResolution>,
     onPointsChange: (Player, Long) -> Unit,
-    onResolveQuestion: (QuestionData, QuestionResolution) -> Unit
+    onResolveQuestion: (QuestionData, QuestionResolution) -> Unit,
 ) {
     val topicColor = topic.color.toColorOrDefault()
     Column(
@@ -50,7 +53,8 @@ fun TopicRow(
                     topic = topic,
                     secondRoundDouble = secondRoundDouble,
                     players = users,
-                    questionResolved = questionsResolved[question] ?: error("No resolution found for question ${question.hint}"),
+                    questionResolved = questionsResolved[question]
+                        ?: error("No resolution found for question ${question.hint}"),
                     heightFraction = buttonHeightFraction,
                     color = topicColor,
                     onPointsChange = onPointsChange,
diff --git a/src/main/kotlin/components/endcard/EndCard.kt b/src/main/kotlin/components/endcard/EndCard.kt
index 0135737..7359cec 100644
--- a/src/main/kotlin/components/endcard/EndCard.kt
+++ b/src/main/kotlin/components/endcard/EndCard.kt
@@ -22,7 +22,7 @@ import data.toColorOrDefault
 fun EndCard(
     playerPointMap: Map<Player, Long>,
     reviewBoard: () -> Unit,
-    close: () -> Unit
+    close: () -> Unit,
 ) {
     val sortedPlayersPoints = playerPointMap.entries
         .sortedByDescending { it.value }
@@ -68,7 +68,7 @@ fun HighScoreListEntry(
     player: Player,
     rank: Int,
     points: Long,
-    fontSize: TextUnit
+    fontSize: TextUnit,
 ) {
     Box(
         modifier = Modifier.border(border = BorderStroke(5.dp, player.color.toColorOrDefault()))
diff --git a/src/main/kotlin/components/questiondialog/QuestionDialog.kt b/src/main/kotlin/components/questiondialog/QuestionDialog.kt
index 66552ad..e6fafcc 100644
--- a/src/main/kotlin/components/questiondialog/QuestionDialog.kt
+++ b/src/main/kotlin/components/questiondialog/QuestionDialog.kt
@@ -21,7 +21,7 @@ fun QuestionDialogue(
     players: List<Player>,
     secondRoundDouble: Boolean,
     onResolve: (QuestionResolution) -> Unit,
-    onPointsChange: (Player, Long) -> Unit
+    onPointsChange: (Player, Long) -> Unit,
 ) {
     AlertDialog(
         dialogProvider = UndecoratedWindowAlertDialogProvider,
diff --git a/src/main/kotlin/components/questiondialog/QuestionDialogContent.kt b/src/main/kotlin/components/questiondialog/QuestionDialogContent.kt
index 47f3d93..208efc8 100644
--- a/src/main/kotlin/components/questiondialog/QuestionDialogContent.kt
+++ b/src/main/kotlin/components/questiondialog/QuestionDialogContent.kt
@@ -26,7 +26,7 @@ fun QuestionDialogContent(
     players: List<Player>,
     onPointsChange: (Player, Long) -> Unit,
     onResolve: (QuestionResolution) -> Unit,
-    secondRoundDouble: Boolean
+    secondRoundDouble: Boolean,
 ) {
     val fontSize = 5.em
     var showAnswer by remember { mutableStateOf(false) }
diff --git a/src/main/kotlin/components/questiondialog/assets/HintText.kt b/src/main/kotlin/components/questiondialog/assets/HintText.kt
index e86f411..2b4eba9 100644
--- a/src/main/kotlin/components/questiondialog/assets/HintText.kt
+++ b/src/main/kotlin/components/questiondialog/assets/HintText.kt
@@ -16,7 +16,7 @@ fun HintText(
     points: UInt,
     hint: String,
     deferredDouble: Boolean = false,
-    doubleJeopardy: Boolean = false
+    doubleJeopardy: Boolean = false,
 ) {
     Row(
         verticalAlignment = Alignment.Top,
diff --git a/src/main/kotlin/components/questiondialog/buttons/DismissButton.kt b/src/main/kotlin/components/questiondialog/buttons/DismissButton.kt
index 2074390..49f8bb4 100644
--- a/src/main/kotlin/components/questiondialog/buttons/DismissButton.kt
+++ b/src/main/kotlin/components/questiondialog/buttons/DismissButton.kt
@@ -1,6 +1,8 @@
 package components.questiondialog.buttons
 
-import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.material.Button
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
diff --git a/src/main/kotlin/components/questiondialog/player/DeferredDoubleQuestionDialogPlayer.kt b/src/main/kotlin/components/questiondialog/player/DeferredDoubleQuestionDialogPlayer.kt
index 5c49197..9e993c6 100644
--- a/src/main/kotlin/components/questiondialog/player/DeferredDoubleQuestionDialogPlayer.kt
+++ b/src/main/kotlin/components/questiondialog/player/DeferredDoubleQuestionDialogPlayer.kt
@@ -22,7 +22,7 @@ fun DeferredDoubleQuestionDialogPlayer(
     onPointsChange: (Player, Long) -> Unit,
     onQuestionDone: () -> Unit,
     onQuestionAnswered: (Player) -> Unit,
-    questionPoints: Long
+    questionPoints: Long,
 ) {
     Row(
         modifier = Modifier.fillMaxWidth(),
diff --git a/src/main/kotlin/components/questiondialog/player/QuestionDialogPlayer.kt b/src/main/kotlin/components/questiondialog/player/QuestionDialogPlayer.kt
index 36642c1..10f840c 100644
--- a/src/main/kotlin/components/questiondialog/player/QuestionDialogPlayer.kt
+++ b/src/main/kotlin/components/questiondialog/player/QuestionDialogPlayer.kt
@@ -20,7 +20,7 @@ fun QuestionDialogPlayer(
     fontSize: TextUnit,
     onPointsChange: (Player, Long) -> Unit,
     questionPoints: Long,
-    onQuestionAnswered: (Player) -> Unit
+    onQuestionAnswered: (Player) -> Unit,
 ) {
     Row(
         modifier = Modifier.fillMaxWidth(),
@@ -37,7 +37,6 @@ fun QuestionDialogPlayer(
         if (hadFail) {
             DisabledButton(maxWidthFraction = 1f, fontSize = fontSize)
         } else {
-            // TODO: Implement "answer" view
             BadAnswerButton(
                 fontSize = fontSize,
                 onClick = {
diff --git a/src/main/kotlin/data/ColorData.kt b/src/main/kotlin/data/ColorData.kt
index 67ead34..509b7ff 100644
--- a/src/main/kotlin/data/ColorData.kt
+++ b/src/main/kotlin/data/ColorData.kt
@@ -7,20 +7,8 @@ import kotlinx.serialization.Serializable
 class ColorData(
     val red: Int,
     val green: Int,
-    val blue: Int
-) {
-
-    constructor(rgbHexString: String) : this(
-        red = rgbHexString.redFromHex(),
-        green = rgbHexString.greenFromHex(),
-        blue = rgbHexString.blueFromHex()
-    )
-}
-
-internal fun String.colorFromHex(startPos: Int) = ("0x" + this[startPos] + this[startPos + 1]).toInt()
-internal fun String.redFromHex() = colorFromHex(2)
-internal fun String.greenFromHex() = colorFromHex(4)
-internal fun String.blueFromHex() = colorFromHex(6)
+    val blue: Int,
+)
 
 fun ColorData?.toColorOrNull() = this?.toColor()
 fun ColorData?.toColorOrDefault() = this?.toColor() ?: Color.Blue
diff --git a/src/main/kotlin/data/Game.kt b/src/main/kotlin/data/Game.kt
index 1061072..e0259cc 100644
--- a/src/main/kotlin/data/Game.kt
+++ b/src/main/kotlin/data/Game.kt
@@ -9,5 +9,5 @@ class Game(
     val players: List<Player>,
     val headerColor: ColorData? = null,
     val doubleAfter: Long = Long.MAX_VALUE,
-    val endGameAfter: Long = Long.MAX_VALUE
+    val endGameAfter: Long = Long.MAX_VALUE,
 )
diff --git a/src/main/kotlin/data/Player.kt b/src/main/kotlin/data/Player.kt
index 089760f..97da38b 100644
--- a/src/main/kotlin/data/Player.kt
+++ b/src/main/kotlin/data/Player.kt
@@ -5,5 +5,6 @@ import kotlinx.serialization.Serializable
 @Serializable
 class Player(
     val name: String,
-    val color: ColorData? = null
+    val color: ColorData? = null,
+    val initialPoints: Long = 0,
 )
diff --git a/src/main/kotlin/data/QuestionData.kt b/src/main/kotlin/data/QuestionData.kt
index 3e778ba..4e3a771 100644
--- a/src/main/kotlin/data/QuestionData.kt
+++ b/src/main/kotlin/data/QuestionData.kt
@@ -8,7 +8,7 @@ class QuestionData(
     val answer: String,
     val points: UInt,
     val isDouble: Boolean = false,
-    val isDeferredDouble: Boolean = false
+    val isDeferredDouble: Boolean = false,
 ) {
     fun actualDisplayPoints(double: Boolean) = points * (if (double) 2u else 1u)
     fun actualUsagePoints(double: Boolean) = points * (if (double) 2u else 1u) * (if (isDouble) 2u else 1u)
diff --git a/src/main/kotlin/data/Topic.kt b/src/main/kotlin/data/Topic.kt
index 3e27156..fa83de4 100644
--- a/src/main/kotlin/data/Topic.kt
+++ b/src/main/kotlin/data/Topic.kt
@@ -6,5 +6,5 @@ import kotlinx.serialization.Serializable
 class Topic(
     val topic: String,
     val questions: List<QuestionData>,
-    val color: ColorData? = null
+    val color: ColorData? = null,
 )