Add emphasis alteration.

This commit is contained in:
Thomas Andres Gomez 2024-01-07 19:26:50 +01:00
parent bc7838f8a3
commit aa82fc2347
11 changed files with 85 additions and 9 deletions

View file

@ -22,6 +22,7 @@ import com.pixelized.rplexicon.utilitary.extentions.icon
import com.pixelized.rplexicon.utilitary.extentions.local.advantage
import com.pixelized.rplexicon.utilitary.extentions.local.critical
import com.pixelized.rplexicon.utilitary.extentions.local.disadvantage
import com.pixelized.rplexicon.utilitary.extentions.local.emphasis
import com.pixelized.rplexicon.utilitary.extentions.local.fail
import com.pixelized.rplexicon.utilitary.extentions.local.isBrutalCritical
import com.pixelized.rplexicon.utilitary.extentions.local.isCritical
@ -32,8 +33,10 @@ import com.pixelized.rplexicon.utilitary.extentions.local.toStatus
import com.pixelized.rplexicon.utilitary.extentions.modifier
import com.pixelized.rplexicon.utilitary.extentions.toLabel
import javax.inject.Inject
import kotlin.math.abs
import kotlin.math.max
import kotlin.math.min
import kotlin.random.Random
data class DiceThrowResult(
val dice: RollDiceUio,
@ -546,10 +549,12 @@ class DiceThrowUseCase @Inject constructor(
// check if the roll is affected by some status.
val advantage = status[ability].advantage
val disadvantage = status[ability].disadvantage
val emphasis = status[ability].emphasis
// main roll
val result = roll(
advantage = advantage,
disadvantage = disadvantage,
emphasis = emphasis,
fail = status[ability].fail,
critical = status[ability].critical,
)
@ -659,6 +664,7 @@ class DiceThrowUseCase @Inject constructor(
dice = R.drawable.ic_d20_24,
advantage = advantage,
disadvantage = disadvantage,
emphasis = emphasis,
roll = "1d20",
result = result.label,
),
@ -693,6 +699,7 @@ class DiceThrowUseCase @Inject constructor(
// check if the roll is affected by some status.
val advantage = status[ability].advantage
val disadvantage = status[ability].disadvantage
val emphasis = status[ability].emphasis
// compute the amount of main dice to throw.
val amount = if (status.isCritical) {
@ -712,6 +719,7 @@ class DiceThrowUseCase @Inject constructor(
faces = diceThrow?.faces ?: 20,
advantage = advantage,
disadvantage = disadvantage,
emphasis = emphasis,
fail = status[ability].fail,
critical = status[ability].critical,
)
@ -767,6 +775,7 @@ class DiceThrowUseCase @Inject constructor(
dice = diceThrow?.faces?.icon ?: R.drawable.ic_d20_24,
advantage = advantage,
disadvantage = disadvantage,
emphasis = emphasis,
roll = "${diceThrow?.amount}d${diceThrow?.faces}",
result = result.label,
),
@ -791,12 +800,14 @@ class DiceThrowUseCase @Inject constructor(
val advantage = status[Property.SPELL_EFFECT].advantage
val disadvantage = status[Property.SPELL_EFFECT].disadvantage
val emphasis = status[Property.SPELL_EFFECT].emphasis
// main roll
val result = roll(
amount = spell?.effect?.amount ?: 1,
faces = spell?.effect?.faces ?: 4,
advantage = advantage,
disadvantage = disadvantage,
emphasis = emphasis,
fail = status[Property.SPELL_EFFECT].fail,
critical = status[Property.SPELL_EFFECT].critical,
)
@ -809,6 +820,7 @@ class DiceThrowUseCase @Inject constructor(
faces = spell.level.faces,
advantage = advantage,
disadvantage = disadvantage,
emphasis = emphasis,
fail = status[Property.SPELL_EFFECT].fail,
critical = status[Property.SPELL_EFFECT].critical,
)
@ -819,6 +831,7 @@ class DiceThrowUseCase @Inject constructor(
roll = "${spell.level.amount}d${spell.level.faces}",
advantage = advantage,
disadvantage = disadvantage,
emphasis = emphasis,
result = localRoll.label,
),
result = "${localRoll.value}",
@ -855,6 +868,7 @@ class DiceThrowUseCase @Inject constructor(
roll = "${spell?.effect?.amount ?: 1}d${spell?.effect?.faces ?: 4}",
advantage = advantage,
disadvantage = disadvantage,
emphasis = emphasis,
result = result.label,
),
result = "${result.value}",
@ -877,12 +891,14 @@ class DiceThrowUseCase @Inject constructor(
val advantage = status[Property.SKILL].advantage
val disadvantage = status[Property.SKILL].disadvantage
val emphasis = status[Property.SKILL].emphasis
// main roll
val result = roll(
amount = skill?.effect?.amount ?: 1,
faces = skill?.effect?.faces ?: 4,
advantage = advantage,
disadvantage = disadvantage,
emphasis = emphasis,
fail = status[Property.SKILL].fail,
critical = status[Property.SKILL].critical,
)
@ -920,6 +936,7 @@ class DiceThrowUseCase @Inject constructor(
roll = "${skill?.effect?.amount ?: 1}d${skill?.effect?.faces ?: 4}",
advantage = advantage,
disadvantage = disadvantage,
emphasis = emphasis,
result = result.label,
),
result = "${result.value}",
@ -994,6 +1011,7 @@ class DiceThrowUseCase @Inject constructor(
faces = dice.faces,
advantage = dice.advantage,
disadvantage = dice.disadvantage,
emphasis = dice.emphasis,
fail = status.fail,
critical = status.critical,
)
@ -1003,6 +1021,7 @@ class DiceThrowUseCase @Inject constructor(
dice = dice.faces.icon,
advantage = dice.advantage,
disadvantage = dice.disadvantage,
emphasis = dice.emphasis,
roll = "${dice.count}d${dice.faces}",
result = localRoll.label,
),
@ -1029,17 +1048,25 @@ class DiceThrowUseCase @Inject constructor(
/**
* Make a roll of dices.
* @param amount the number of dice.
* @param faces the number of faces on the dices.
* @param advantage does the throws have advantage (roll 2 keep max)
* @param disadvantage does the throws have disadvantage (roll 2 keep min)
* @param emphasis does the throw have emphasis (roll 2, keep furthest away from 10)
* @param fail force the result to be 1
* @param critical force the result to amount.
*/
fun roll(
amount: Int = 1,
faces: Int = 20,
advantage: Boolean = false,
disadvantage: Boolean = false,
emphasis: Boolean,
fail: Boolean = false,
critical: Boolean = false,
): DiceRollResult {
val result = when {
advantage && !disadvantage -> {
advantage && !disadvantage && !emphasis -> {
val roll = List(amount) {
val first = random(faces = faces, fail = fail, critical = critical)
val second = random(faces = faces, fail = fail, critical = critical)
@ -1051,7 +1078,7 @@ class DiceThrowUseCase @Inject constructor(
)
}
disadvantage && !advantage -> {
!advantage && disadvantage && !emphasis -> {
val roll = List(amount) {
val first = random(faces = faces, fail = fail, critical = critical)
val second = random(faces = faces, fail = fail, critical = critical)
@ -1063,6 +1090,27 @@ class DiceThrowUseCase @Inject constructor(
)
}
!advantage && !disadvantage && emphasis -> {
val roll = List(amount) {
var first: Int
var second: Int
do {
first = random(faces = faces, fail = fail, critical = critical)
second = random(faces = faces, fail = fail, critical = critical)
} while (abs(first - 10) == abs(second - 10))
if (abs(first - 10) < abs(second - 10)) {
second to first
} else {
first to second
}
}
DiceRollResult(
label = roll.joinToString(" + ") { "${it.first}~${it.second}" },
value = roll.sumOf { it.first },
)
}
else -> {
val roll = List(amount) {
random(faces = faces, fail = fail, critical = critical)