diff --git a/app/src/main/java/com/pixelized/rplexicon/business/DiceThrowUseCase.kt b/app/src/main/java/com/pixelized/rplexicon/business/DiceThrowUseCase.kt index 5e3545f..955f573 100644 --- a/app/src/main/java/com/pixelized/rplexicon/business/DiceThrowUseCase.kt +++ b/app/src/main/java/com/pixelized/rplexicon/business/DiceThrowUseCase.kt @@ -734,15 +734,7 @@ class DiceThrowUseCase @Inject constructor( val relatedStatBonus = diceThrow.statBonus(name = action) // check for flat dice bonus (ex: healing potion 2d4 + 2) - val flatBonus = diceThrow?.flat?.takeIf { it > 0 }?.let { - allValue.add(it) - listOf( - NetworkThrow.Detail( - title = application.getString(R.string.dice_roll_bonus_detail, action), - result = "$it", - ) - ) - } ?: emptyList() + val relatedFlatBonus = diceThrow.flatBonus(name = action) // compute the final roll result val rollResult = when { @@ -781,7 +773,7 @@ class DiceThrowUseCase @Inject constructor( ), result = "${result.value}", ), - ) + diceAlterationBonus + flatAlterationBonus + relatedStatBonus + flatBonus, + ) + diceAlterationBonus + flatAlterationBonus + relatedStatBonus + relatedFlatBonus, ), ) } @@ -844,6 +836,9 @@ class DiceThrowUseCase @Inject constructor( // fetch and build the associated characteristic val relatedStatBonus = spell?.effect.statBonus(name = spellName) + // fetch and build a list of flat bonus + val relatedFlatBonus = spell?.effect?.flatBonus(name = spellName) ?: emptyList() + // compute the final roll result val rollResult = "${allValue.sum()}" @@ -873,7 +868,7 @@ class DiceThrowUseCase @Inject constructor( ), result = "${result.value}", ), - ) + levelBonus + relatedStatBonus, + ) + levelBonus + relatedStatBonus + relatedFlatBonus, ), ) } @@ -912,6 +907,9 @@ class DiceThrowUseCase @Inject constructor( // fetch and build the associated characteristic, proficiency or level val relatedStatBonus = skill?.effect.statBonus(name = skill?.name) + // fetch and build a list of flat bonus + val relatedFlatBonus = skill?.effect.flatBonus(name = skill?.name) + // compute the final roll result val rollResult = "${allValue.sum()}" @@ -941,7 +939,7 @@ class DiceThrowUseCase @Inject constructor( ), result = "${result.value}", ), - ) + diceAlterationBonus + flatAlterationBonus + relatedStatBonus, + ) + diceAlterationBonus + flatAlterationBonus + relatedStatBonus + relatedFlatBonus, ), ) } @@ -965,7 +963,14 @@ class DiceThrowUseCase @Inject constructor( return this?.modifier?.mapNotNull { it.statBonus(name = name) } ?: emptyList() } - fun Property.statBonus(name: String?): NetworkThrow.Detail? { + /** + * Fetch any flat bonus related to the throw. + */ + fun Throw?.flatBonus(name: String?): List { + return this?.flat?.flatBonus(name)?.let { listOf(it) } ?: emptyList() + } + + private fun Property.statBonus(name: String?): NetworkThrow.Detail? { return when (this) { Property.STRENGTH -> (character.strength + this@ThrowScope.status[this].sum).modifier Property.DEXTERITY -> (character.dexterity + this@ThrowScope.status[this].sum).modifier @@ -1000,6 +1005,18 @@ class DiceThrowUseCase @Inject constructor( } } + private fun Int.flatBonus(name: String?): NetworkThrow.Detail? { + allValue.add(this) + return if (this != 0) { + NetworkThrow.Detail( + title = context.getString(R.string.dice_roll_bonus_detail, name), + result = "$this", + ) + } else { + null + } + } + /** * Fetch any alteration related bonus and build a ThrowsCardUio.Detail for each. */ diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SkillFactoryUioFactory.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SkillFactoryUioFactory.kt index b155938..3b30089 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SkillFactoryUioFactory.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SkillFactoryUioFactory.kt @@ -8,6 +8,7 @@ import com.pixelized.rplexicon.data.repository.character.DescriptionRepository import com.pixelized.rplexicon.ui.screens.character.composable.actions.SkillItemUio import com.pixelized.rplexicon.utilitary.extentions.icon import com.pixelized.rplexicon.utilitary.extentions.modifier +import com.pixelized.rplexicon.utilitary.extentions.toLabel import javax.inject.Inject class SkillFactoryUioFactory @Inject constructor( @@ -21,7 +22,7 @@ class SkillFactoryUioFactory @Inject constructor( // Filter out passive skills, theses are display in the Proficiency Page. return skills.map { skill -> val description = descriptionRepository.find(name = skill.name) - val modifier = skill.effect?.modifier?.sumOf { + val effectModifier = skill.effect?.modifier?.sumOf { when (it) { Property.LEVEL -> character?.level ?: 0 Property.PROFICIENCY -> character?.proficiency ?: 0 @@ -34,6 +35,9 @@ class SkillFactoryUioFactory @Inject constructor( else -> 0 } } ?: 0 + val effectFlat = skill.effect?.flat ?: 0 + val modifier = effectModifier + effectFlat + SkillItemUio( label = skill.name, translate = description?.original, @@ -42,7 +46,7 @@ class SkillFactoryUioFactory @Inject constructor( effect = skill.effect?.let { SkillItemUio.Dice( icon = it.faces.icon, - label = "${skill.effect.amount}d${skill.effect.faces}${if (modifier > 0) "+$modifier" else ""}", + label = "${skill.effect.amount}d${skill.effect.faces}${if (modifier > 0) modifier.toLabel() else ""}", ) }, value = fire?.skills?.get(skill.name) ?: 0,