diff --git a/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/components/charactermodel/DiceRollResultDialog.kt b/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/components/charactermodel/DiceRollResultDialog.kt index 81ce262..833e99d 100644 --- a/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/components/charactermodel/DiceRollResultDialog.kt +++ b/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/components/charactermodel/DiceRollResultDialog.kt @@ -29,7 +29,8 @@ fun DiceRollResultDialog( ) { val ones = diceRoll.result.count { it == 1 } val isGlitch = ones > diceRoll.numberOfDice / 2 - val isCriticalGlitch = isGlitch && diceRoll.numberOfSuccesses == 0 + val successes = diceRoll.numberOfSuccesses ?: 0 + val isCriticalGlitch = isGlitch && successes == 0 AlertDialog( onDismissRequest = onDismiss, @@ -55,19 +56,19 @@ fun DiceRollResultDialog( style = MaterialTheme.typography.bodyMedium ) Text( - text = "${diceRoll.numberOfSuccesses} successes", + text = "$successes successes", modifier = Modifier.testTag(TestTags.DICE_ROLL_SUCCESS_COUNT), style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.Bold, - color = if (diceRoll.numberOfSuccesses > 0) + color = if (successes > 0) Color(0xFF4CAF50) else MaterialTheme.colorScheme.onSurface ) } // Threshold result for simple tests if (threshold != null) { - val success = diceRoll.numberOfSuccesses >= threshold - val netHits = if (success) diceRoll.numberOfSuccesses - threshold else 0 + val success = successes >= threshold + val netHits = if (success) successes - threshold else 0 Surface( color = if (success) Color(0xFF4CAF50).copy(alpha = 0.12f) else MaterialTheme.colorScheme.errorContainer, diff --git a/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/components/charactermodel/ExtendedTestResultDialog.kt b/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/components/charactermodel/ExtendedTestResultDialog.kt index 78d6dd0..11c1827 100644 --- a/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/components/charactermodel/ExtendedTestResultDialog.kt +++ b/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/components/charactermodel/ExtendedTestResultDialog.kt @@ -62,11 +62,11 @@ fun ExtendedTestResultDialog( // Per-round breakdown var runningTotal = 0 result.rolls.forEachIndexed { index, roll -> - runningTotal += roll.numberOfSuccesses + runningTotal += roll.numberOfSuccesses ?: 0 RoundEntry( roundNumber = index + 1, poolSize = roll.numberOfDice, - hits = roll.numberOfSuccesses, + hits = roll.numberOfSuccesses ?: 0, cumulativeHits = runningTotal, results = roll.result, testTag = TestTags.extendedRoundEntry(index) diff --git a/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/components/charactermodel/HealingDialog.kt b/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/components/charactermodel/HealingDialog.kt index 970a5f9..cf383b1 100644 --- a/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/components/charactermodel/HealingDialog.kt +++ b/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/components/charactermodel/HealingDialog.kt @@ -141,7 +141,7 @@ fun HealingDialog( style = MaterialTheme.typography.bodySmall ) Text( - text = "Successes: ${result.diceRoll.numberOfSuccesses}", + text = "Successes: ${result.diceRoll.numberOfSuccesses ?: 0}", style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.Medium ) diff --git a/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/components/charactermodel/OpposedTestResultDialog.kt b/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/components/charactermodel/OpposedTestResultDialog.kt index 3de484d..5b7fcb3 100644 --- a/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/components/charactermodel/OpposedTestResultDialog.kt +++ b/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/components/charactermodel/OpposedTestResultDialog.kt @@ -53,11 +53,11 @@ fun OpposedTestResultDialog( style = MaterialTheme.typography.bodyMedium ) Text( - text = "${result.attackRoll.numberOfSuccesses} hits", + text = "${result.attackRoll.numberOfSuccesses ?: 0} hits", modifier = Modifier.testTag(TestTags.OPPOSED_ATTACK_HITS), style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.Bold, - color = if (result.attackRoll.numberOfSuccesses > 0) + color = if ((result.attackRoll.numberOfSuccesses ?: 0) > 0) Color(0xFF4CAF50) else MaterialTheme.colorScheme.onSurface ) } @@ -80,11 +80,11 @@ fun OpposedTestResultDialog( style = MaterialTheme.typography.bodyMedium ) Text( - text = "${result.defenseRoll.numberOfSuccesses} hits", + text = "${result.defenseRoll.numberOfSuccesses ?: 0} hits", modifier = Modifier.testTag(TestTags.OPPOSED_DEFENSE_HITS), style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.Bold, - color = if (result.defenseRoll.numberOfSuccesses > 0) + color = if ((result.defenseRoll.numberOfSuccesses ?: 0) > 0) Color(0xFF4CAF50) else MaterialTheme.colorScheme.onSurface ) } diff --git a/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/functions/Dice.kt b/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/functions/Dice.kt index 913c176..35aeb7c 100755 --- a/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/functions/Dice.kt +++ b/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/functions/Dice.kt @@ -16,7 +16,7 @@ data class DiceRoll( val numberOfSides: Int = 6, val numberForSuccessOrHigher: Int = 5, val result: List = listOf(), - val numberOfSuccesses: Int = -1 + val numberOfSuccesses: Int? = null ) { fun roll(numberForSuccessOrHigher: Int = 5): DiceRoll { val newResult = rollXDice(sides = this.numberOfSides, numberOfDice = this.numberOfDice) @@ -33,8 +33,9 @@ data class DiceRoll( */ fun performSimpleTest(pool: Int, threshold: Int): SimpleTestResult { val roll = DiceRoll(numberOfDice = pool).roll() - val success = roll.numberOfSuccesses >= threshold - val netHits = if (success) roll.numberOfSuccesses - threshold else 0 + val successes = roll.numberOfSuccesses ?: 0 + val success = successes >= threshold + val netHits = if (success) successes - threshold else 0 return SimpleTestResult( diceRoll = roll, threshold = threshold, @@ -51,7 +52,7 @@ fun performSimpleTest(pool: Int, threshold: Int): SimpleTestResult { fun performOpposedTest(attackPool: Int, defensePool: Int): OpposedTestResult { val attackRoll = DiceRoll(numberOfDice = attackPool).roll() val defenseRoll = DiceRoll(numberOfDice = defensePool).roll() - val netHits = attackRoll.numberOfSuccesses - defenseRoll.numberOfSuccesses + val netHits = (attackRoll.numberOfSuccesses ?: 0) - (defenseRoll.numberOfSuccesses ?: 0) return OpposedTestResult( attackRoll = attackRoll, defenseRoll = defenseRoll, @@ -76,7 +77,7 @@ fun performExtendedTest(pool: Int, targetHits: Int, maxRolls: Int = 10): Extende if (currentPool <= 0) break val roll = DiceRoll(numberOfDice = currentPool).roll() rolls.add(roll) - cumulativeHits += roll.numberOfSuccesses + cumulativeHits += roll.numberOfSuccesses ?: 0 if (cumulativeHits >= targetHits) { return ExtendedTestResult( rolls = rolls.toList(), diff --git a/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/functions/DiceRollHistory.kt b/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/functions/DiceRollHistory.kt index 4b75fc6..f716c57 100644 --- a/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/functions/DiceRollHistory.kt +++ b/sharedUI/src/commonMain/kotlin/org/shahondin1624/lib/functions/DiceRollHistory.kt @@ -41,7 +41,7 @@ class DiceRollHistory(private val maxEntries: Int = 20) { label = label, poolSize = roll.numberOfDice, results = roll.result, - successes = roll.numberOfSuccesses, + successes = roll.numberOfSuccesses ?: 0, sequenceNumber = nextSequence++, rollType = rollType ) diff --git a/sharedUI/src/commonMain/kotlin/org/shahondin1624/model/charactermodel/HealingSystem.kt b/sharedUI/src/commonMain/kotlin/org/shahondin1624/model/charactermodel/HealingSystem.kt index 08bf31e..02ea8a2 100644 --- a/sharedUI/src/commonMain/kotlin/org/shahondin1624/model/charactermodel/HealingSystem.kt +++ b/sharedUI/src/commonMain/kotlin/org/shahondin1624/model/charactermodel/HealingSystem.kt @@ -93,7 +93,7 @@ object HealingSystem { damageTrack = damageTrack, dicePool = dicePool, diceRoll = roll, - boxesHealed = roll.numberOfSuccesses + boxesHealed = roll.numberOfSuccesses ?: 0 ) } diff --git a/sharedUI/src/commonTest/kotlin/org/shahondin1624/DiceTest.kt b/sharedUI/src/commonTest/kotlin/org/shahondin1624/DiceTest.kt index 4a76ee1..91bc90b 100644 --- a/sharedUI/src/commonTest/kotlin/org/shahondin1624/DiceTest.kt +++ b/sharedUI/src/commonTest/kotlin/org/shahondin1624/DiceTest.kt @@ -55,7 +55,7 @@ class DiceTest { // successes from the stale empty result list. val initial = DiceRoll(numberOfDice = 20) assertEquals(listOf(), initial.result, "Initial result should be empty") - assertEquals(-1, initial.numberOfSuccesses, "Initial numberOfSuccesses should be -1") + assertEquals(null, initial.numberOfSuccesses, "Initial numberOfSuccesses should be null") val rolled = initial.roll() assertEquals(20, rolled.result.size, "Rolled result should have 20 dice") diff --git a/sharedUI/src/commonTest/kotlin/org/shahondin1624/RollTypeTest.kt b/sharedUI/src/commonTest/kotlin/org/shahondin1624/RollTypeTest.kt index 3ec3304..e3116a9 100644 --- a/sharedUI/src/commonTest/kotlin/org/shahondin1624/RollTypeTest.kt +++ b/sharedUI/src/commonTest/kotlin/org/shahondin1624/RollTypeTest.kt @@ -23,7 +23,7 @@ class RollTypeTest { atLeastOneSuccess = true assertTrue(result.netHits >= 0, "Net hits should be >= 0 on success") assertEquals( - result.diceRoll.numberOfSuccesses - result.threshold, + result.diceRoll.numberOfSuccesses!! - result.threshold, result.netHits, "Net hits = successes - threshold" ) @@ -46,7 +46,7 @@ class RollTypeTest { val result = performSimpleTest(pool = 5, threshold = 0) assertTrue(result.success, "Zero threshold should always succeed") assertEquals( - result.diceRoll.numberOfSuccesses, + result.diceRoll.numberOfSuccesses!!, result.netHits, "Net hits should equal successes when threshold is 0" ) @@ -61,7 +61,7 @@ class RollTypeTest { val result = performOpposedTest(attackPool = 8, defensePool = 6) assertEquals(8, result.attackRoll.result.size, "Attacker should roll 8 dice") assertEquals(6, result.defenseRoll.result.size, "Defender should roll 6 dice") - val expectedNetHits = result.attackRoll.numberOfSuccesses - result.defenseRoll.numberOfSuccesses + val expectedNetHits = result.attackRoll.numberOfSuccesses!! - result.defenseRoll.numberOfSuccesses!! assertEquals(expectedNetHits, result.netHits, "Net hits = attack successes - defense successes") assertEquals(expectedNetHits > 0, result.attackerWins, "Attacker wins if net hits > 0") } @@ -86,7 +86,7 @@ class RollTypeTest { repeat(20) { val result = performExtendedTest(pool = 10, targetHits = 1, maxRolls = 10) assertTrue(result.rolls.isNotEmpty(), "Should have at least one round") - val manualSum = result.rolls.sumOf { it.numberOfSuccesses } + val manualSum = result.rolls.sumOf { it.numberOfSuccesses ?: 0 } assertEquals(manualSum, result.cumulativeHits, "Cumulative hits should be sum of per-round hits") assertEquals(result.rolls.size, result.roundsUsed, "Rounds used should match number of rolls") }