From b52f9a9f362e18c6b704875f68dcc3076ebac35f Mon Sep 17 00:00:00 2001 From: meikpiep Date: Thu, 27 Feb 2025 19:47:05 +0100 Subject: [PATCH] refactoring: get rid of GameDifficulty, use DifficultySetting instead --- .../MainGameDifficultyLevelBalloon.kt | 4 +- .../MainGameDifficultyLevelFragment.kt | 67 +++++++++------- .../gauguin/ui/main/GameTopFragment.kt | 16 ++-- .../ui/newgame/GridCellOptionsFragment.kt | 2 +- .../gauguin/creation/TestGridCreator.kt | 79 ++++++++++--------- ...stMergingCageGridCalculatorDistribution.kt | 21 ++--- .../TestGridDifficultyCalculationPossible.kt | 48 +++++------ ...estGridDifficultyCalculationPossibleTwo.kt | 51 ++++++------ .../TestGridDifficultyMassCalculation.kt | 40 +++++----- .../piepmeyer/gauguin/creation/GridCreator.kt | 2 +- .../DisplayableGameDifficultyThreshold.kt | 3 +- .../gauguin/difficulty/GameDifficulty.kt | 9 --- .../gauguin/difficulty/GameDifficultyRater.kt | 25 ++---- .../difficulty/GameDifficultyRating.kt | 26 +++--- .../gauguin/options/DifficultySetting.kt | 16 ++-- 15 files changed, 199 insertions(+), 210 deletions(-) delete mode 100644 gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/difficulty/GameDifficulty.kt diff --git a/gauguin-app/src/main/kotlin/org/piepmeyer/gauguin/ui/difficulty/MainGameDifficultyLevelBalloon.kt b/gauguin-app/src/main/kotlin/org/piepmeyer/gauguin/ui/difficulty/MainGameDifficultyLevelBalloon.kt index b6a5e45c..9e1e138e 100644 --- a/gauguin-app/src/main/kotlin/org/piepmeyer/gauguin/ui/difficulty/MainGameDifficultyLevelBalloon.kt +++ b/gauguin-app/src/main/kotlin/org/piepmeyer/gauguin/ui/difficulty/MainGameDifficultyLevelBalloon.kt @@ -9,11 +9,11 @@ import com.skydoves.balloon.ArrowPositionRules import com.skydoves.balloon.BalloonAnimation import com.skydoves.balloon.BalloonSizeSpec import com.skydoves.balloon.createBalloon -import org.piepmeyer.gauguin.difficulty.GameDifficulty +import org.piepmeyer.gauguin.options.DifficultySetting import org.piepmeyer.gauguin.options.GameVariant class MainGameDifficultyLevelBalloon( - private val difficulty: GameDifficulty?, + private val difficulty: DifficultySetting?, private val variant: GameVariant, ) { fun showBalloon( diff --git a/gauguin-app/src/main/kotlin/org/piepmeyer/gauguin/ui/difficulty/MainGameDifficultyLevelFragment.kt b/gauguin-app/src/main/kotlin/org/piepmeyer/gauguin/ui/difficulty/MainGameDifficultyLevelFragment.kt index 05e23bd3..5a0cd41f 100644 --- a/gauguin-app/src/main/kotlin/org/piepmeyer/gauguin/ui/difficulty/MainGameDifficultyLevelFragment.kt +++ b/gauguin-app/src/main/kotlin/org/piepmeyer/gauguin/ui/difficulty/MainGameDifficultyLevelFragment.kt @@ -16,15 +16,15 @@ import com.google.android.material.textview.MaterialTextView import org.piepmeyer.gauguin.R import org.piepmeyer.gauguin.databinding.FragmentGameDifficultyLevelBinding import org.piepmeyer.gauguin.difficulty.DisplayableGameDifficultyThreshold -import org.piepmeyer.gauguin.difficulty.GameDifficulty import org.piepmeyer.gauguin.difficulty.GameDifficultyRater import org.piepmeyer.gauguin.difficulty.GameDifficultyRating +import org.piepmeyer.gauguin.options.DifficultySetting import org.piepmeyer.gauguin.options.GameVariant import java.math.BigDecimal import java.text.DecimalFormat class MainGameDifficultyLevelFragment( - private val difficulty: GameDifficulty?, + private val difficulty: DifficultySetting?, private val variant: GameVariant, ) : Fragment(R.layout.fragment_game_difficulty_level) { private lateinit var binding: FragmentGameDifficultyLevelBinding @@ -41,7 +41,7 @@ class MainGameDifficultyLevelFragment( if (rating != null) { layoutWithRating(rating) - if (difficulty != null) { + if (difficulty != null && difficulty != DifficultySetting.ANY) { layoutWithDifficulty(difficulty, parent) } else { layoutWithoutDifficulty() @@ -71,34 +71,39 @@ class MainGameDifficultyLevelFragment( private fun layoutWithRating(rating: GameDifficultyRating) { val uiRating = DisplayableGameDifficultyThreshold(rating) - binding.veryEasyMaximumValue.text = formatDifficulty(uiRating.thresholdText(GameDifficulty.EASY)) - binding.easyMinimumValue.text = formatDifficulty(uiRating.thresholdText(GameDifficulty.EASY)) - binding.easyMaximumValue.text = formatDifficulty(uiRating.thresholdText(GameDifficulty.MEDIUM)) - binding.mediumMinimumValue.text = formatDifficulty(uiRating.thresholdText(GameDifficulty.MEDIUM)) - binding.mediumMaximumValue.text = formatDifficulty(uiRating.thresholdText(GameDifficulty.HARD)) - binding.hardMinimumValue.text = formatDifficulty(uiRating.thresholdText(GameDifficulty.HARD)) - binding.hardMaximumValue.text = formatDifficulty(uiRating.thresholdText(GameDifficulty.EXTREME)) - binding.extremeMinimumValue.text = formatDifficulty(uiRating.thresholdText(GameDifficulty.EXTREME)) + binding.veryEasyMaximumValue.text = + formatDifficulty( + uiRating.thresholdText( + DifficultySetting.EASY, + ), + ) + binding.easyMinimumValue.text = formatDifficulty(uiRating.thresholdText(DifficultySetting.EASY)) + binding.easyMaximumValue.text = formatDifficulty(uiRating.thresholdText(DifficultySetting.MEDIUM)) + binding.mediumMinimumValue.text = formatDifficulty(uiRating.thresholdText(DifficultySetting.MEDIUM)) + binding.mediumMaximumValue.text = formatDifficulty(uiRating.thresholdText(DifficultySetting.HARD)) + binding.hardMinimumValue.text = formatDifficulty(uiRating.thresholdText(DifficultySetting.HARD)) + binding.hardMaximumValue.text = formatDifficulty(uiRating.thresholdText(DifficultySetting.EXTREME)) + binding.extremeMinimumValue.text = formatDifficulty(uiRating.thresholdText(DifficultySetting.EXTREME)) } private fun layoutWithDifficulty( - difficulty: GameDifficulty, + difficulty: DifficultySetting, parent: ViewGroup?, ) { val referenceId = when (difficulty) { - GameDifficulty.VERY_EASY -> R.id.veryEasy - GameDifficulty.EASY -> R.id.easy - GameDifficulty.MEDIUM -> R.id.medium - GameDifficulty.HARD -> R.id.hard - GameDifficulty.EXTREME -> R.id.extreme + DifficultySetting.VERY_EASY -> R.id.veryEasy + DifficultySetting.EASY -> R.id.easy + DifficultySetting.MEDIUM -> R.id.medium + DifficultySetting.HARD -> R.id.hard + DifficultySetting.EXTREME, DifficultySetting.ANY -> R.id.extreme } setHighlighterConstraintsToMatch(difficulty, referenceId, parent) } private fun setHighlighterConstraintsToMatch( - difficulty: GameDifficulty?, + difficulty: DifficultySetting?, referenceId: Int, parent: ViewGroup?, ) { @@ -141,52 +146,54 @@ class MainGameDifficultyLevelFragment( constraintSet.applyTo(binding.mainGameDifficultyLevelConstaintLayout) } - private fun hightlightedTextViews(difficulty: GameDifficulty): List = + private fun hightlightedTextViews(difficulty: DifficultySetting): List = when (difficulty) { - GameDifficulty.VERY_EASY -> listOf(binding.veryEasy, binding.veryEasyMinimumValue, binding.veryEasyMaximumValue) - GameDifficulty.EASY -> listOf(binding.easy, binding.easyMinimumValue, binding.easyMaximumValue) - GameDifficulty.MEDIUM -> listOf(binding.medium, binding.mediumMinimumValue, binding.mediumMaximumValue) - GameDifficulty.HARD -> listOf(binding.hard, binding.hardMinimumValue, binding.hardMaximumValue) - GameDifficulty.EXTREME -> listOf(binding.extreme, binding.extremeMinimumValue, binding.extremeMaximumValue) + DifficultySetting.VERY_EASY -> listOf(binding.veryEasy, binding.veryEasyMinimumValue, binding.veryEasyMaximumValue) + DifficultySetting.EASY -> listOf(binding.easy, binding.easyMinimumValue, binding.easyMaximumValue) + DifficultySetting.MEDIUM -> listOf(binding.medium, binding.mediumMinimumValue, binding.mediumMaximumValue) + DifficultySetting.HARD -> listOf(binding.hard, binding.hardMinimumValue, binding.hardMaximumValue) + DifficultySetting.EXTREME -> listOf(binding.extreme, binding.extremeMinimumValue, binding.extremeMaximumValue) + DifficultySetting.ANY -> emptyList() } - private fun hightlightedImageViews(difficulty: GameDifficulty): List = + private fun hightlightedImageViews(difficulty: DifficultySetting): List = when (difficulty) { - GameDifficulty.VERY_EASY -> + DifficultySetting.VERY_EASY -> listOf( binding.ratingStarVeryEasyOne, binding.ratingStarVeryEasyTwo, binding.ratingStarVeryEasyThree, binding.ratingStarVeryEasyFour, ) - GameDifficulty.EASY -> + DifficultySetting.EASY -> listOf( binding.ratingStarEasyOne, binding.ratingStarEasyTwo, binding.ratingStarEasyThree, binding.ratingStarEasyFour, ) - GameDifficulty.MEDIUM -> + DifficultySetting.MEDIUM -> listOf( binding.ratingStarMediumOne, binding.ratingStarMediumTwo, binding.ratingStarMediumThree, binding.ratingStarMediumFour, ) - GameDifficulty.HARD -> + DifficultySetting.HARD -> listOf( binding.ratingStarHardOne, binding.ratingStarHardTwo, binding.ratingStarHardThree, binding.ratingStarHardFour, ) - GameDifficulty.EXTREME -> + DifficultySetting.EXTREME -> listOf( binding.ratingStarExtremeOne, binding.ratingStarExtremeTwo, binding.ratingStarExtremeThree, binding.ratingStarExtremeFour, ) + DifficultySetting.ANY -> emptyList() } private fun layoutWithoutDifficulty() { diff --git a/gauguin-app/src/main/kotlin/org/piepmeyer/gauguin/ui/main/GameTopFragment.kt b/gauguin-app/src/main/kotlin/org/piepmeyer/gauguin/ui/main/GameTopFragment.kt index 984a21ae..8b57122d 100644 --- a/gauguin-app/src/main/kotlin/org/piepmeyer/gauguin/ui/main/GameTopFragment.kt +++ b/gauguin-app/src/main/kotlin/org/piepmeyer/gauguin/ui/main/GameTopFragment.kt @@ -18,12 +18,12 @@ import org.piepmeyer.gauguin.R import org.piepmeyer.gauguin.Utils import org.piepmeyer.gauguin.databinding.FragmentMainGameTopBinding import org.piepmeyer.gauguin.difficulty.DisplayableGameDifficulty -import org.piepmeyer.gauguin.difficulty.GameDifficulty import org.piepmeyer.gauguin.difficulty.GameDifficultyRater import org.piepmeyer.gauguin.difficulty.human.HumanDifficultyCalculator import org.piepmeyer.gauguin.game.Game import org.piepmeyer.gauguin.game.GameLifecycle import org.piepmeyer.gauguin.game.PlayTimeListener +import org.piepmeyer.gauguin.options.DifficultySetting import org.piepmeyer.gauguin.preferences.ApplicationPreferences import org.piepmeyer.gauguin.ui.difficulty.MainGameDifficultyLevelBalloon import org.piepmeyer.gauguin.ui.difficulty.MainGameDifficultyLevelFragment @@ -172,35 +172,35 @@ class GameTopFragment : } } - private fun setStarsByDifficulty(difficulty: GameDifficulty?) { + private fun setStarsByDifficulty(difficulty: DifficultySetting?) { if (difficulty == null) return setStarByDifficulty( binding.ratingStarOne, difficulty, - GameDifficulty.EASY, + DifficultySetting.EASY, ) setStarByDifficulty( binding.ratingStarTwo, difficulty, - GameDifficulty.MEDIUM, + DifficultySetting.MEDIUM, ) setStarByDifficulty( binding.ratingStarThree, difficulty, - GameDifficulty.HARD, + DifficultySetting.HARD, ) setStarByDifficulty( binding.ratingStarFour, difficulty, - GameDifficulty.EXTREME, + DifficultySetting.EXTREME, ) } private fun setStarByDifficulty( view: ImageView, - difficulty: GameDifficulty, - minimumDifficulty: GameDifficulty, + difficulty: DifficultySetting, + minimumDifficulty: DifficultySetting, ) { if (difficulty >= minimumDifficulty) { view.setImageResource(R.drawable.filled_star_20) diff --git a/gauguin-app/src/main/kotlin/org/piepmeyer/gauguin/ui/newgame/GridCellOptionsFragment.kt b/gauguin-app/src/main/kotlin/org/piepmeyer/gauguin/ui/newgame/GridCellOptionsFragment.kt index 48cb9672..b18e81d2 100644 --- a/gauguin-app/src/main/kotlin/org/piepmeyer/gauguin/ui/newgame/GridCellOptionsFragment.kt +++ b/gauguin-app/src/main/kotlin/org/piepmeyer/gauguin/ui/newgame/GridCellOptionsFragment.kt @@ -61,7 +61,7 @@ class GridCellOptionsFragment : val difficultyOrNull = if (variant.variant.options.difficultySetting != DifficultySetting.ANY) { - variant.variant.options.difficultySetting.gameDifficulty + variant.variant.options.difficultySetting } else { null } diff --git a/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/creation/TestGridCreator.kt b/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/creation/TestGridCreator.kt index fac47b0e..0774cca1 100644 --- a/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/creation/TestGridCreator.kt +++ b/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/creation/TestGridCreator.kt @@ -12,51 +12,52 @@ import org.piepmeyer.gauguin.options.GridCageOperation import org.piepmeyer.gauguin.options.NumeralSystem import org.piepmeyer.gauguin.options.SingleCageUsage -class TestGridCreator : FunSpec({ - test("3x3GridCreationWithoutRandomValues") { - val creator = - GridCreator( - GameVariant( - GridSize(3, 3), - GameOptionsVariant( - true, - GridCageOperation.OPERATIONS_ALL, - DigitSetting.FIRST_DIGIT_ONE, - DifficultySetting.ANY, - SingleCageUsage.FIXED_NUMBER, - NumeralSystem.Decimal, +class TestGridCreator : + FunSpec({ + test("3x3GridCreationWithoutRandomValues") { + val creator = + GridCreator( + GameVariant( + GridSize(3, 3), + GameOptionsVariant( + true, + GridCageOperation.OPERATIONS_ALL, + DigitSetting.FIRST_DIGIT_ONE, + DifficultySetting.ANY, + SingleCageUsage.FIXED_NUMBER, + NumeralSystem.Decimal, + ), ), - ), - OnlyZeroRandomizerMock(), - ShufflerStub(), - ) + OnlyZeroRandomizerMock(), + ShufflerStub(), + ) - val grid = creator.createRandomizedGridWithCages() + val grid = creator.createRandomizedGridWithCages() - grid.getValidCellAt(0, 0).value shouldBe 1 - grid.getValidCellAt(0, 1).value shouldBe 2 - grid.getValidCellAt(0, 2).value shouldBe 3 - grid.getValidCellAt(1, 0).value shouldBe 2 - grid.getValidCellAt(1, 1).value shouldBe 3 - grid.getValidCellAt(1, 2).value shouldBe 1 - grid.getValidCellAt(2, 0).value shouldBe 3 - grid.getValidCellAt(2, 1).value shouldBe 1 - grid.getValidCellAt(2, 2).value shouldBe 2 - } + grid.getValidCellAt(0, 0).value shouldBe 1 + grid.getValidCellAt(0, 1).value shouldBe 2 + grid.getValidCellAt(0, 2).value shouldBe 3 + grid.getValidCellAt(1, 0).value shouldBe 2 + grid.getValidCellAt(1, 1).value shouldBe 3 + grid.getValidCellAt(1, 2).value shouldBe 1 + grid.getValidCellAt(2, 0).value shouldBe 3 + grid.getValidCellAt(2, 1).value shouldBe 1 + grid.getValidCellAt(2, 2).value shouldBe 2 + } - test("deterministic random number generator leads to deterministic grids") { - val variant = - GameVariant( - GridSize(10, 10), - GameOptionsVariant.createClassic(), - ) + test("deterministic random number generator leads to deterministic grids") { + val variant = + GameVariant( + GridSize(10, 10), + GameOptionsVariant.createClassic(), + ) - val gridOne = calculateGrid(variant) - val gridTwo = calculateGrid(variant) + val gridOne = calculateGrid(variant) + val gridTwo = calculateGrid(variant) - gridOne.toString() shouldBe gridTwo.toString() - } -}) + gridOne.toString() shouldBe gridTwo.toString() + } + }) private suspend fun calculateGrid(variant: GameVariant): Grid { val randomizer = SeedRandomizerMock(1) diff --git a/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/creation/TestMergingCageGridCalculatorDistribution.kt b/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/creation/TestMergingCageGridCalculatorDistribution.kt index 964a2f00..33b1d688 100644 --- a/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/creation/TestMergingCageGridCalculatorDistribution.kt +++ b/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/creation/TestMergingCageGridCalculatorDistribution.kt @@ -19,15 +19,16 @@ import org.piepmeyer.gauguin.options.SingleCageUsage private val logger = KotlinLogging.logger {} -class TestMergingCageGridCalculatorDistribution : FunSpec({ - xtest("calculateValues 6x6") { - testHundredGrids(6) - } +class TestMergingCageGridCalculatorDistribution : + FunSpec({ + xtest("calculateValues 6x6") { + testHundredGrids(6) + } - xtest("calculateValues 9x9") { - testHundredGrids(9) - } -}) { + xtest("calculateValues 9x9") { + testHundredGrids(9) + } + }) { companion object { private fun testHundredGrids(size: Int) { val difficultiesAndSingles = @@ -59,7 +60,9 @@ class TestMergingCageGridCalculatorDistribution : FunSpec({ "maximum ${sortedSingles.max()}" } - sortedSingles.groupingBy { it }.eachCount() + sortedSingles + .groupingBy { it } + .eachCount() .forEach { (singles, count) -> logger.info { "singles $singles: $count" } } diff --git a/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/difficulty/TestGridDifficultyCalculationPossible.kt b/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/difficulty/TestGridDifficultyCalculationPossible.kt index bff54d84..014e667f 100644 --- a/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/difficulty/TestGridDifficultyCalculationPossible.kt +++ b/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/difficulty/TestGridDifficultyCalculationPossible.kt @@ -24,37 +24,37 @@ import kotlin.time.Duration.Companion.minutes private val logger = KotlinLogging.logger {} -class TestGridDifficultyCalculationPossible : FunSpec({ - xtest("calculateValues") { - runBlocking(Dispatchers.Default) { - - val groupedItems = - calculateDifficulties() - .map { - logger.info { "waiting for $it" } - val value = it.await() - logger.info { "finished: $it" } - value - } - .groupBy({ it.first }, { it.second }) - .map { - val success = it.value.count { it } +class TestGridDifficultyCalculationPossible : + FunSpec({ + xtest("calculateValues") { + runBlocking(Dispatchers.Default) { + + val groupedItems = + calculateDifficulties() + .map { + logger.info { "waiting for $it" } + val value = it.await() + logger.info { "finished: $it" } + value + }.groupBy({ it.first }, { it.second }) + .map { + val success = it.value.count { it } - val item = GameVariantPossibleItem(it.key, success) + val item = GameVariantPossibleItem(it.key, success) - logger.info { "Possible: $success, ${it.key}" } + logger.info { "Possible: $success, ${it.key}" } - item - }.sortedBy { it.calculatedDifficulties } + item + }.sortedBy { it.calculatedDifficulties } - logger.info { "calculated difficulties ${groupedItems.size}." } + logger.info { "calculated difficulties ${groupedItems.size}." } - val result = Json { prettyPrint = true }.encodeToString(groupedItems) + val result = Json { prettyPrint = true }.encodeToString(groupedItems) - File("possibles.yml").writeText(result) + File("possibles.yml").writeText(result) + } } - } -}) { + }) { companion object { suspend fun calculateDifficulties(): List>> = kotlinx.coroutines.coroutineScope { diff --git a/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/difficulty/TestGridDifficultyCalculationPossibleTwo.kt b/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/difficulty/TestGridDifficultyCalculationPossibleTwo.kt index e2a24bac..7585fa03 100644 --- a/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/difficulty/TestGridDifficultyCalculationPossibleTwo.kt +++ b/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/difficulty/TestGridDifficultyCalculationPossibleTwo.kt @@ -16,40 +16,39 @@ import org.piepmeyer.gauguin.options.GameVariant import org.piepmeyer.gauguin.options.NumeralSystem import java.io.File -class TestGridDifficultyCalculationPossibleTwo : FunSpec({ - xtest("calculateValues") { - runBlocking(Dispatchers.Default) { - - val fileData = - this::class.java - .getResource("/org/piepmeyer/gauguin/difficulty/possibles-to-10.yml")!! - .readText() - - val possibles = Json.decodeFromString>(fileData) - - val groupedItems = - calculateDifficulties( - possibles.filter { it.calculatedDifficulties == 10 }.map { it.variant }, - ) - .map { +class TestGridDifficultyCalculationPossibleTwo : + FunSpec({ + xtest("calculateValues") { + runBlocking(Dispatchers.Default) { + + val fileData = + this::class.java + .getResource("/org/piepmeyer/gauguin/difficulty/possibles-to-10.yml")!! + .readText() + + val possibles = Json.decodeFromString>(fileData) + + val groupedItems = + calculateDifficulties( + possibles.filter { it.calculatedDifficulties == 10 }.map { it.variant }, + ).map { println("waiting for $it") val value = it.await() println("finished: $it") value - } - .groupBy({ it.first }, { it.second }) - .map { - GameVariantMassDifficultyItem(it.key, it.value.sorted()) - } + }.groupBy({ it.first }, { it.second }) + .map { + GameVariantMassDifficultyItem(it.key, it.value.sorted()) + } - println("calculated difficulties ${groupedItems.size}.") + println("calculated difficulties ${groupedItems.size}.") - val result = Json { prettyPrint = true }.encodeToString(groupedItems) + val result = Json { prettyPrint = true }.encodeToString(groupedItems) - File("mass-difficulties-10-10.yml").writeText(result) + File("mass-difficulties-10-10.yml").writeText(result) + } } - } -}) { + }) { companion object { suspend fun calculateDifficulties(variants: List): List>> = kotlinx.coroutines.coroutineScope { diff --git a/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/difficulty/TestGridDifficultyMassCalculation.kt b/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/difficulty/TestGridDifficultyMassCalculation.kt index efc9a83a..77fbcad3 100644 --- a/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/difficulty/TestGridDifficultyMassCalculation.kt +++ b/gauguin-core/src/integrationTest/kotlin/org/piepmeyer/gauguin/difficulty/TestGridDifficultyMassCalculation.kt @@ -20,31 +20,31 @@ import org.piepmeyer.gauguin.options.NumeralSystem import org.piepmeyer.gauguin.options.SingleCageUsage import java.io.File -class TestGridDifficultyMassCalculation : FunSpec({ - xtest("calculateValues") { - runBlocking(Dispatchers.Default) { +class TestGridDifficultyMassCalculation : + FunSpec({ + xtest("calculateValues") { + runBlocking(Dispatchers.Default) { - val groupedItems = - calculateDifficulties() - .map { - println("waiting for $it") - val value = it.await() - println("finished: $it") - value - } - .groupBy({ it.first }, { it.second }) - .map { - GameVariantMassDifficultyItem(it.key, it.value.sorted()) - } + val groupedItems = + calculateDifficulties() + .map { + println("waiting for $it") + val value = it.await() + println("finished: $it") + value + }.groupBy({ it.first }, { it.second }) + .map { + GameVariantMassDifficultyItem(it.key, it.value.sorted()) + } - println("calculated difficulties ${groupedItems.size}.") + println("calculated difficulties ${groupedItems.size}.") - val result = Json { prettyPrint = true }.encodeToString(groupedItems) + val result = Json { prettyPrint = true }.encodeToString(groupedItems) - File("mass-difficulties.yml").writeText(result) + File("mass-difficulties.yml").writeText(result) + } } - } -}) { + }) { companion object { suspend fun calculateDifficulties(): List>> = kotlinx.coroutines.coroutineScope { diff --git a/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/creation/GridCreator.kt b/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/creation/GridCreator.kt index 4bfff471..2963b1db 100644 --- a/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/creation/GridCreator.kt +++ b/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/creation/GridCreator.kt @@ -36,7 +36,7 @@ class GridCreator( return if (!rater.isSupported(grid.variant)) { true } else { - rater.difficulty(variantRating, grid) == variant.options.difficultySetting.gameDifficulty + rater.difficulty(variantRating, grid) == variant.options.difficultySetting } } diff --git a/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/difficulty/DisplayableGameDifficultyThreshold.kt b/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/difficulty/DisplayableGameDifficultyThreshold.kt index b4e68dde..0f9c40eb 100644 --- a/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/difficulty/DisplayableGameDifficultyThreshold.kt +++ b/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/difficulty/DisplayableGameDifficultyThreshold.kt @@ -1,11 +1,12 @@ package org.piepmeyer.gauguin.difficulty +import org.piepmeyer.gauguin.options.DifficultySetting import java.math.BigDecimal class DisplayableGameDifficultyThreshold( private val rating: GameDifficultyRating, ) { - fun thresholdText(difficulty: GameDifficulty): BigDecimal { + fun thresholdText(difficulty: DifficultySetting): BigDecimal { val threshold = rating.threshold(difficulty) return DisplayableGameDifficulty(rating).displayableDifficultyValue(threshold) diff --git a/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/difficulty/GameDifficulty.kt b/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/difficulty/GameDifficulty.kt deleted file mode 100644 index 0330f69e..00000000 --- a/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/difficulty/GameDifficulty.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.piepmeyer.gauguin.difficulty - -enum class GameDifficulty { - VERY_EASY, - EASY, - MEDIUM, - HARD, - EXTREME, -} diff --git a/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/difficulty/GameDifficultyRater.kt b/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/difficulty/GameDifficultyRater.kt index f7cc50ed..247665aa 100644 --- a/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/difficulty/GameDifficultyRater.kt +++ b/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/difficulty/GameDifficultyRater.kt @@ -1,41 +1,30 @@ package org.piepmeyer.gauguin.difficulty import org.piepmeyer.gauguin.grid.Grid +import org.piepmeyer.gauguin.options.DifficultySetting import org.piepmeyer.gauguin.options.GameVariant class GameDifficultyRater { private val difficultyLoader = GameDifficultyLoader.loadDifficulties() - fun difficulty(grid: Grid): GameDifficulty? { - return difficulty(grid, GridDifficultyCalculator(grid).calculate()) - } + fun difficulty(grid: Grid): DifficultySetting? = difficulty(grid, GridDifficultyCalculator(grid).calculate()) fun difficulty( gameRating: GameDifficultyRating?, grid: Grid, - ): GameDifficulty? { - return difficulty(gameRating, GridDifficultyCalculator(grid).calculate()) - } + ): DifficultySetting? = difficulty(gameRating, GridDifficultyCalculator(grid).calculate()) private fun difficulty( grid: Grid, difficultyValue: Double, - ): GameDifficulty? { - return difficulty(difficultyLoader.byVariant(grid.variant), difficultyValue) - } + ): DifficultySetting? = difficulty(difficultyLoader.byVariant(grid.variant), difficultyValue) private fun difficulty( gameRating: GameDifficultyRating?, difficultyValue: Double, - ): GameDifficulty? { - return gameRating?.getDifficulty(difficultyValue) - } + ): DifficultySetting? = gameRating?.getDifficulty(difficultyValue) - fun isSupported(variant: GameVariant): Boolean { - return difficultyLoader.isSupported(variant) - } + fun isSupported(variant: GameVariant): Boolean = difficultyLoader.isSupported(variant) - fun byVariant(variant: GameVariant): GameDifficultyRating? { - return difficultyLoader.byVariant(variant) - } + fun byVariant(variant: GameVariant): GameDifficultyRating? = difficultyLoader.byVariant(variant) } diff --git a/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/difficulty/GameDifficultyRating.kt b/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/difficulty/GameDifficultyRating.kt index 747bbd56..40051402 100644 --- a/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/difficulty/GameDifficultyRating.kt +++ b/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/difficulty/GameDifficultyRating.kt @@ -1,6 +1,7 @@ package org.piepmeyer.gauguin.difficulty import kotlinx.serialization.Serializable +import org.piepmeyer.gauguin.options.DifficultySetting @Serializable data class GameDifficultyRating( @@ -10,30 +11,29 @@ data class GameDifficultyRating( val thresholdHard: Double, val thresholdExtreme: Double, ) { - fun threshold(difficulty: GameDifficulty): Double { - return when (difficulty) { - GameDifficulty.EASY -> thresholdEasy - GameDifficulty.MEDIUM -> thresholdMedium - GameDifficulty.HARD -> thresholdHard - GameDifficulty.EXTREME -> thresholdExtreme + fun threshold(difficulty: DifficultySetting): Double = + when (difficulty) { + DifficultySetting.EASY -> thresholdEasy + DifficultySetting.MEDIUM -> thresholdMedium + DifficultySetting.HARD -> thresholdHard + DifficultySetting.EXTREME -> thresholdExtreme else -> throw IllegalArgumentException("Threshold of difficulty $difficulty is not implemented.") } - } - fun getDifficulty(difficultyValue: Double): GameDifficulty { + fun getDifficulty(difficultyValue: Double): DifficultySetting { if (difficultyValue >= thresholdExtreme) { - return GameDifficulty.EXTREME + return DifficultySetting.EXTREME } if (difficultyValue >= thresholdHard) { - return GameDifficulty.HARD + return DifficultySetting.HARD } if (difficultyValue >= thresholdMedium) { - return GameDifficulty.MEDIUM + return DifficultySetting.MEDIUM } return if (difficultyValue >= thresholdEasy) { - GameDifficulty.EASY + DifficultySetting.EASY } else { - GameDifficulty.VERY_EASY + DifficultySetting.VERY_EASY } } } diff --git a/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/options/DifficultySetting.kt b/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/options/DifficultySetting.kt index 1252a1fd..2e33f819 100644 --- a/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/options/DifficultySetting.kt +++ b/gauguin-core/src/main/kotlin/org/piepmeyer/gauguin/options/DifficultySetting.kt @@ -1,12 +1,10 @@ package org.piepmeyer.gauguin.options -import org.piepmeyer.gauguin.difficulty.GameDifficulty - -enum class DifficultySetting(val gameDifficulty: GameDifficulty?) { - ANY(null), - VERY_EASY(GameDifficulty.VERY_EASY), - EASY(GameDifficulty.EASY), - MEDIUM(GameDifficulty.MEDIUM), - HARD(GameDifficulty.HARD), - EXTREME(GameDifficulty.EXTREME), +enum class DifficultySetting { + ANY, + VERY_EASY, + EASY, + MEDIUM, + HARD, + EXTREME, }