From cded2e9d865f3c6ffa4b1793035b91a3f8b17ae0 Mon Sep 17 00:00:00 2001 From: Thomas Andres Gomez Date: Wed, 26 Mar 2025 19:31:09 +0100 Subject: [PATCH] Add Reflex and Initiative sub characteristic --- .../composeResources/drawable/ic_azm_24dp.xml | 9 +++ .../drawable/ic_directions_run_24dp.xml | 9 +++ .../drawable/ic_pan_tool_24dp.xml | 9 +++ .../composeResources/values/strings.xml | 10 +++- .../campaign/player/detail/CharacterDetail.kt | 11 ++++ .../player/detail/CharacterDetailFactory.kt | 20 +++++++ .../detail/header/CharacterDetailHeader.kt | 59 ++++++++++++++++++- .../shared/lwa/model/AlteredCharacterSheet.kt | 24 ++++++-- .../model/characterSheet/CharacterSheet.kt | 2 + .../lwa/usecase/CharacterSheetUseCase.kt | 14 +++++ 10 files changed, 155 insertions(+), 12 deletions(-) create mode 100644 composeApp/src/commonMain/composeResources/drawable/ic_azm_24dp.xml create mode 100644 composeApp/src/commonMain/composeResources/drawable/ic_directions_run_24dp.xml create mode 100644 composeApp/src/commonMain/composeResources/drawable/ic_pan_tool_24dp.xml diff --git a/composeApp/src/commonMain/composeResources/drawable/ic_azm_24dp.xml b/composeApp/src/commonMain/composeResources/drawable/ic_azm_24dp.xml new file mode 100644 index 0000000..8e24054 --- /dev/null +++ b/composeApp/src/commonMain/composeResources/drawable/ic_azm_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/composeApp/src/commonMain/composeResources/drawable/ic_directions_run_24dp.xml b/composeApp/src/commonMain/composeResources/drawable/ic_directions_run_24dp.xml new file mode 100644 index 0000000..ea2ffe1 --- /dev/null +++ b/composeApp/src/commonMain/composeResources/drawable/ic_directions_run_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/composeApp/src/commonMain/composeResources/drawable/ic_pan_tool_24dp.xml b/composeApp/src/commonMain/composeResources/drawable/ic_pan_tool_24dp.xml new file mode 100644 index 0000000..af796f6 --- /dev/null +++ b/composeApp/src/commonMain/composeResources/drawable/ic_pan_tool_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index 262bad7..f577fbb 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -153,6 +153,8 @@ Armure Bonus d'apprentissage Bonus de PV + Réflexe + Initiative Compétences communes Compétences spéciales Compétences magiques @@ -160,12 +162,12 @@ Êtes-vous sûr de vouloir supprimer "%1$s" ? Les caractéristiques constituent les aptitudes innées d’un personnage comme son intelligence, sa force, son charisme, etc. Elles ne sont pas acquises, mais peuvent être parfois augmentées par un entraînement ou une utilisation réussie. Les caractéristiques des humains normaux varient de 2 (niveau extrêmement bas) à 20 (maximum du potentiel humain), avec une moyenne de 10 ou 11. Plus une caractéristique est élevée plus le personnage est puissant dans cette aptitude.\nÀ la création de votre personnage, répartissez les valeurs suivantes dans les différentes caractéristiques : 15, 15, 13, 11, 10, 9 et 7. - La Force représente essentiellement la puissance musculaire du personnage. Elle ne décrit pas nécessairement la masse musculaire brute, mais l’efficacité avec laquelle le personnage exerce ses muscles pour accomplir des actions physiques pénibles.\n\n- Bonus aux dégats\n- Athlétisme\n- Lancer\n- Saisie + La Force représente essentiellement la puissance musculaire du personnage. Elle ne décrit pas nécessairement la masse musculaire brute, mais l’efficacité avec laquelle le personnage exerce ses muscles pour accomplir des actions physiques pénibles.\n\n- Bonus aux dégats\n- Réflexe\n- Athlétisme\n- Lancer\n- Saisie La Constitution est une mesure de la ténacité et de la résilience du personnage. Elle sert à résister aux maladies. Mais son aspect le plus important réside dans la détermination du nombre de dommages qu’un personnage peut supporter avant de succomber.\n\n- Point de vie maximum\n- Athlétisme\n- Acrobatie La Taille est une mesure de la masse du personnage. Elle ne représente pas forcément la taille en centimètres, mais une idée générale de sa masse physique. Un personnage à la TAI élevée peut être très grand et mince, ou petit et massif, ou de taille moyenne en surpoids.\n\n- Bonus aux dégats\n- Point de vie maximum\n- Saisie\n- Intimidation\n- Discrétion (impact négatif) - L’Intelligence représente la capacité de discernement du personnage. Elle ne mesure pas nécessairement la somme d’informations mémorisées, mais l’aptitude au raisonnement, l’acuité intellectuelle, la capacité à résoudre des problèmes et l’intuition.\n\n- Bonus d'apprentissage\n- Perception\n- Recherche\n- Empathie\n- Baratin\n- Premiers soins + L’Intelligence représente la capacité de discernement du personnage. Elle ne mesure pas nécessairement la somme d’informations mémorisées, mais l’aptitude au raisonnement, l’acuité intellectuelle, la capacité à résoudre des problèmes et l’intuition.\n\n- Bonus d'apprentissage\n- Réflexe\n- Perception\n- Recherche\n- Empathie\n- Baratin\n- Premiers soins Le Pouvoir est une mesure presque intangible de la force de volonté, du dynamisme intérieur et de l’énergie spirituelle. Il représente également le potentiel magique du personnage.\n\n- Points de pouvoir maximum\n- Intimidation - La Dextérité mesure la coordination œil-main, la vitesse physique et l’agilité générale. La DEX détermine à quelle vitesse un personnage peut agir en combat.\n\n- Initiative\n- Bagarre\n- Esquive\n- Lancer\n- Acrobatie\n- Discrétion\n- Escamotage\n- Premiers soins + La Dextérité mesure la coordination œil-main, la vitesse physique et l’agilité générale. La DEX détermine à quelle vitesse un personnage peut agir en combat.\n\n- Initiative\n- Réflexe\n- Bagarre\n- Esquive\n- Lancer\n- Acrobatie\n- Discrétion\n- Escamotage\n- Premiers soins Il représente plusieurs aspects allant de la grâce à la beauté en passant par l’attraction que le personnage exerce sur les autres. Un personnage avec un CHA élevé se remarque dans une foule en raison d’une intangible combinaison de charme et de présence.\n\n- Empathie\n- Persuasion\n- Persuasion\n- Intimidation\n- Baratin\n- Marchandage\n- Discrétion Le Déplacement (DEP) est une valeur de jeu qui détermine la distance que peut parcourir un personnage en un round de combat. Tous les humains ont un DEP de 10. Le DEP a une valeur réelle flexible, mais généralement, chaque point de DEP équivaut à un déplacement d’un mètre. En course, un point équivaut à trois mètres. Les points de vie (PV) sont égaux à la somme CON+TAI du personnage, divisée par deux (arrondie au supérieur). Ils sont soustraits lorsque le personnage subit des dommages. Quand les points de vie tombent à 0, le personnage sombre dans l’inconscience. S'il reste inconscient trop longtemps, il meurt. Tous les points de vie régénèrent naturellement après une nuit de repos. @@ -174,6 +176,8 @@ Une armure protège son porteur des blessures. Lorsqu’un personnage est touché en combat par une attaque non magique, soustrayez les points d’armure aux points de dégâts infligés. Les dommages au-delà de la protection de l’armure surpassent celle-ci et sont infligés au personnage, réduisant ses points de vie actuels. Plus un personnage est intelligent, plus il assimile rapidement les connaissances et plus il digère son expérience efficacement. Ce modificateur s'applique au score des compétences nouvellement acquises et aux jets d'expériences. Il est égal à (INT - 10) x 2 avec une valeur minimale de zéro. Plus un personnage est de bonne constitution, plus son corps se renforce rapidement. Ce modificateur indique le nombre de "PV" maximum que le personnage gagne à chaque progression. Il est égal à CON / 3, arrondi à l'inférieur. + Les réflexes représentent la capacité d'un personnage à réagir promptement. Ils ont pour valeur : (FOR+DEX+INT)/3 (arrondis à l'inférieur). + L'initiative est la valeur qui détermine l'ordre dans lequel les participants d'un combat jouent. Par défaut elle est égale à leur Dextérité. Configuration de la table Nom du joueur diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetail.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetail.kt index 7f98fdd..ca2f729 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetail.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetail.kt @@ -35,6 +35,7 @@ import com.pixelized.desktop.lwa.ui.composable.blur.BlurContentController import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterDetailCharacteristicDialogViewModel import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogUio import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedViewModel +import com.pixelized.desktop.lwa.ui.overlay.roll.RollAction import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.header.CharacterDetailHeader import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.header.CharacterDetailHeaderUio import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.sheet.CharacterDetailSheet @@ -99,6 +100,12 @@ fun CharacterDetailPanel( ) } }, + onReflex = { + scope.launch { + val result = roll.showRollOverlay(roll = it) + println("result: $result") + } + }, onCharacteristic = { scope.launch { val result = roll.showRollOverlay(roll = it.roll) @@ -137,6 +144,7 @@ fun CharacterDetailAnimatedPanel( onDiminished: (characterSheetId: String) -> Unit, onHp: (characterSheetId: String) -> Unit, onPp: (characterSheetId: String) -> Unit, + onReflex: (RollAction.Uio) -> Unit, onCharacteristic: (CharacterDetailSheetCharacteristicUio) -> Unit, onSkill: (CharacterDetailSheetSkillUio) -> Unit, onUseSkill: (CharacterDetailSheetSkillUio) -> Unit, @@ -167,6 +175,7 @@ fun CharacterDetailAnimatedPanel( onDiminished = { onDiminished(it.characterSheetId) }, onHp = { onHp(it.characterSheetId) }, onPp = { onPp(it.characterSheetId) }, + onReflex = onReflex, onCharacteristic = onCharacteristic, onSkill = onSkill, onUseSkill = onUseSkill, @@ -189,6 +198,7 @@ fun CharacterDetailContent( onDiminished: () -> Unit, onHp: () -> Unit, onPp: () -> Unit, + onReflex: (RollAction.Uio) -> Unit, onCharacteristic: (CharacterDetailSheetCharacteristicUio) -> Unit, onSkill: (CharacterDetailSheetSkillUio) -> Unit, onUseSkill: (CharacterDetailSheetSkillUio) -> Unit, @@ -210,6 +220,7 @@ fun CharacterDetailContent( onDiminished = onDiminished, onHp = onHp, onPp = onPp, + onReflex = onReflex, ) CharacterDetailSheet( modifier = Modifier diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetailFactory.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetailFactory.kt index e446675..662cc0f 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetailFactory.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetailFactory.kt @@ -24,9 +24,11 @@ import lwacharactersheet.composeapp.generated.resources.character_sheet__sub_cha import lwacharactersheet.composeapp.generated.resources.character_sheet__sub_characteristics__damage_bonus import lwacharactersheet.composeapp.generated.resources.character_sheet__sub_characteristics__hit_point import lwacharactersheet.composeapp.generated.resources.character_sheet__sub_characteristics__hp_grow +import lwacharactersheet.composeapp.generated.resources.character_sheet__sub_characteristics__initiative import lwacharactersheet.composeapp.generated.resources.character_sheet__sub_characteristics__learning import lwacharactersheet.composeapp.generated.resources.character_sheet__sub_characteristics__movement import lwacharactersheet.composeapp.generated.resources.character_sheet__sub_characteristics__power_point +import lwacharactersheet.composeapp.generated.resources.character_sheet__sub_characteristics__reflex import lwacharactersheet.composeapp.generated.resources.tooltip__characteristics__charisma import lwacharactersheet.composeapp.generated.resources.tooltip__characteristics__constitution import lwacharactersheet.composeapp.generated.resources.tooltip__characteristics__dexterity @@ -38,9 +40,11 @@ import lwacharactersheet.composeapp.generated.resources.tooltip__sub_characteris import lwacharactersheet.composeapp.generated.resources.tooltip__sub_characteristics__bonus_damage import lwacharactersheet.composeapp.generated.resources.tooltip__sub_characteristics__hit_point import lwacharactersheet.composeapp.generated.resources.tooltip__sub_characteristics__hp_grow +import lwacharactersheet.composeapp.generated.resources.tooltip__sub_characteristics__initiative import lwacharactersheet.composeapp.generated.resources.tooltip__sub_characteristics__learning import lwacharactersheet.composeapp.generated.resources.tooltip__sub_characteristics__movement import lwacharactersheet.composeapp.generated.resources.tooltip__sub_characteristics__power_point +import lwacharactersheet.composeapp.generated.resources.tooltip__sub_characteristics__reflex import org.jetbrains.compose.resources.getString import java.text.Collator @@ -106,6 +110,22 @@ class CharacterDetailFactory( title = getString(Res.string.character_sheet__sub_characteristics__learning), description = getString(Res.string.tooltip__sub_characteristics__learning) ), + reflex = "${alteredCharacterSheet.reflex}", + reflexTooltip = TooltipUio( + title = getString(Res.string.character_sheet__sub_characteristics__reflex), + description = getString(Res.string.tooltip__sub_characteristics__reflex) + ), + reflexRoll = RollAction.Uio.BoundedRollActionUio( + characterSheetId = characterSheetId, + label = getString(Res.string.character_sheet__sub_characteristics__reflex), + rollAction = "1d100", + rollSuccessValue = alteredCharacterSheet.reflex * 5, + ), + initiative = "${alteredCharacterSheet.initiative}", + initiativeTooltip = TooltipUio( + title = getString(Res.string.character_sheet__sub_characteristics__initiative), + description = getString(Res.string.tooltip__sub_characteristics__initiative) + ), ) } diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/header/CharacterDetailHeader.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/header/CharacterDetailHeader.kt index 8e7aeb2..dbf8705 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/header/CharacterDetailHeader.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/header/CharacterDetailHeader.kt @@ -35,8 +35,8 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.pixelized.desktop.lwa.ui.composable.tooltip.TooltipLayout import com.pixelized.desktop.lwa.ui.composable.tooltip.TooltipUio +import com.pixelized.desktop.lwa.ui.overlay.roll.RollAction import com.pixelized.desktop.lwa.ui.theme.lwa -import com.pixelized.shared.lwa.model.campaign.Campaign import lwacharactersheet.composeapp.generated.resources.Res import lwacharactersheet.composeapp.generated.resources.character_sheet__level import lwacharactersheet.composeapp.generated.resources.ic_close_24dp @@ -48,6 +48,9 @@ import lwacharactersheet.composeapp.generated.resources.ic_shield_24dp import lwacharactersheet.composeapp.generated.resources.ic_skull_24dp import lwacharactersheet.composeapp.generated.resources.ic_swords_24dp import lwacharactersheet.composeapp.generated.resources.ic_water_drop_24dp +import lwacharactersheet.composeapp.generated.resources.ic_pan_tool_24dp +import lwacharactersheet.composeapp.generated.resources.ic_azm_24dp +import lwacharactersheet.composeapp.generated.resources.ic_directions_run_24dp import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource @@ -74,6 +77,11 @@ data class CharacterDetailHeaderUio( val growTooltip: TooltipUio, val learn: String, val learnTooltip: TooltipUio, + val reflex: String, + val reflexTooltip: TooltipUio, + val reflexRoll: RollAction.Uio, + val initiative: String, + val initiativeTooltip: TooltipUio, ) @OptIn(ExperimentalFoundationApi::class) @@ -86,6 +94,7 @@ fun CharacterDetailHeader( onDiminished: () -> Unit, onHp: () -> Unit, onPp: () -> Unit, + onReflex: (RollAction.Uio) -> Unit, ) { Column( modifier = modifier, @@ -157,7 +166,7 @@ fun CharacterDetailHeader( } Row( modifier = Modifier.padding(horizontal = 16.dp), - horizontalArrangement = Arrangement.spacedBy(space = 16.dp), + horizontalArrangement = Arrangement.spacedBy(space = 10.dp), ) { TooltipLayout( tooltip = header.value?.hpTooltip, @@ -220,6 +229,50 @@ fun CharacterDetailHeader( Spacer(modifier = Modifier.weight(1f)) + TooltipLayout( + tooltip = header.value?.reflexTooltip, + ) { + Row( + modifier = Modifier + .clip(shape = CircleShape) + .clickable { header.value?.reflexRoll?.let(onReflex) }, + verticalAlignment = Alignment.Bottom, + ) { + Icon( + modifier = Modifier + .padding(bottom = 4.dp, end = 2.dp) + .size(size = iconSize), + painter = painterResource(Res.drawable.ic_pan_tool_24dp), + contentDescription = null + ) + Text( + modifier = Modifier.alignByBaseline(), + style = MaterialTheme.typography.h6, + color = MaterialTheme.lwa.colorScheme.base.primary, + text = header.value?.reflex ?: "", + ) + } + } + TooltipLayout( + tooltip = header.value?.initiativeTooltip, + ) { + Row( + verticalAlignment = Alignment.Bottom, + ) { + Icon( + modifier = Modifier + .padding(bottom = 4.dp, end = 2.dp) + .size(size = iconSize), + painter = painterResource(Res.drawable.ic_azm_24dp), + contentDescription = null + ) + Text( + modifier = Modifier.alignByBaseline(), + style = MaterialTheme.typography.h6, + text = header.value?.initiative ?: "", + ) + } + } TooltipLayout( tooltip = header.value?.movTooltip, ) { @@ -230,7 +283,7 @@ fun CharacterDetailHeader( modifier = Modifier .padding(bottom = 4.dp, end = 2.dp) .size(size = iconSize), - painter = painterResource(Res.drawable.ic_near_me), + painter = painterResource(Res.drawable.ic_directions_run_24dp), contentDescription = null, ) Text( diff --git a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/AlteredCharacterSheet.kt b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/AlteredCharacterSheet.kt index 304c4c2..13e1c3f 100644 --- a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/AlteredCharacterSheet.kt +++ b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/AlteredCharacterSheet.kt @@ -10,6 +10,7 @@ import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.Characterist import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.CharacteristicId.GHP import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.CharacteristicId.HEI import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.CharacteristicId.HP +import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.CharacteristicId.INITIATIVE import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.CharacteristicId.INT import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.CharacteristicId.LB import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.CharacteristicId.LVL @@ -17,6 +18,7 @@ import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.Characterist import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.CharacteristicId.PORTRAIT import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.CharacteristicId.POW import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.CharacteristicId.PP +import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.CharacteristicId.REFLEX import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.CharacteristicId.STR import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.CharacteristicId.THUMBNAIL import com.pixelized.shared.lwa.parser.expression.Expression @@ -86,12 +88,6 @@ class AlteredCharacterSheet( val charisma: Int get() = sheet.charisma + fieldAlterations[CHA].sum() - val movement: Int - get() = sheetUseCase.movement() + fieldAlterations[MOV].sum() - - val armor: Int - get() = sheetUseCase.armor() + fieldAlterations[ARMOR].sum() - val maxHp: Int get() = sheetUseCase.maxHp( constitution = constitution, @@ -116,6 +112,22 @@ class AlteredCharacterSheet( val alterations: List get() = sheet.alterations + val movement: Int + get() = sheetUseCase.movement() + fieldAlterations[MOV].sum() + + val armor: Int + get() = sheetUseCase.armor() + fieldAlterations[ARMOR].sum() + + val reflex: Int + get() = sheetUseCase.reflex( + strength = strength, + dexterity = dexterity, + intelligence = intelligence, + ) + fieldAlterations[REFLEX].sum() + + val initiative: Int + get() = sheetUseCase.initiative(dexterity = dexterity) + fieldAlterations[INITIATIVE].sum() + val damageBonus: String get() { val initial = sheetUseCase.meleeBonusDamage( diff --git a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/characterSheet/CharacterSheet.kt b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/characterSheet/CharacterSheet.kt index b304fac..ba0536e 100644 --- a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/characterSheet/CharacterSheet.kt +++ b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/characterSheet/CharacterSheet.kt @@ -64,6 +64,8 @@ data class CharacterSheet( const val PP = "PP" const val DMG = "DMG" const val ARMOR = "ARMOR" + const val REFLEX = "REFLEX" + const val INITIATIVE = "INITIATIVE" const val LB = "LEARNING" const val GHP = "HP_GROW" } diff --git a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/usecase/CharacterSheetUseCase.kt b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/usecase/CharacterSheetUseCase.kt index 88152ac..5e88eac 100644 --- a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/usecase/CharacterSheetUseCase.kt +++ b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/usecase/CharacterSheetUseCase.kt @@ -11,6 +11,20 @@ class CharacterSheetUseCase { fun movement(): Int = 10 + fun reflex( + strength: Int, + dexterity: Int, + intelligence: Int, + ): Int { + return (strength + dexterity + intelligence) / 3 + } + + fun initiative( + dexterity: Int, + ): Int { + return dexterity + } + fun maxHp( constitution: Int, height: Int,