From d84bc9bbef2dbddbd4bd1a37dd509ac8fd78bfef Mon Sep 17 00:00:00 2001 From: Thomas Andres Gomez Date: Mon, 10 Feb 2025 09:10:05 +0100 Subject: [PATCH] Add an alteration feature to alterate dynamically a character sheet. --- .../com/pixelized/desktop/lwa/Module.kt | 4 + .../desktop/lwa/business/ExpressionUseCase.kt | 18 ++- .../alteration/AlterationRepository.kt | 63 +++++++++ .../repository/alteration/AlterationStore.kt | 81 +++++++++++ .../repository/alteration/model/Alteration.kt | 14 ++ .../alteration/model/AlterationMetadata.kt | 6 + .../alteration/model/FieldAlteration.kt | 9 ++ .../detail/CharacterSheetFactory.kt | 41 +++--- .../detail/CharacterSheetPage.kt | 51 ++++--- .../detail/CharacterSheetViewModel.kt | 11 +- .../rememberCharacterSheetPagePreview.kt | 126 ++++++++++++++++++ 11 files changed, 387 insertions(+), 37 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationRepository.kt create mode 100644 composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationStore.kt create mode 100644 composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/model/Alteration.kt create mode 100644 composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/model/AlterationMetadata.kt create mode 100644 composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/model/FieldAlteration.kt create mode 100644 composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/screen/characterSheet/detail/preview/rememberCharacterSheetPagePreview.kt diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt index 21d005d..6e4165d 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt @@ -13,6 +13,8 @@ import com.pixelized.desktop.lwa.repository.network.NetworkRepository import com.pixelized.desktop.lwa.repository.roll_history.RollHistoryRepository import com.pixelized.desktop.lwa.repository.settings.SettingsFactory import com.pixelized.desktop.lwa.repository.settings.SettingsRepository +import com.pixelized.desktop.lwa.repository.alteration.AlterationStore +import com.pixelized.desktop.lwa.repository.alteration.AlterationRepository import com.pixelized.desktop.lwa.repository.settings.SettingsStore import com.pixelized.desktop.lwa.screen.characterSheet.detail.CharacterSheetFactory import com.pixelized.desktop.lwa.screen.characterSheet.detail.CharacterSheetViewModel @@ -53,6 +55,7 @@ val storeDependencies get() = module { singleOf(::CharacterSheetStore) singleOf(::SettingsStore) + singleOf(::AlterationStore) } val repositoryDependencies @@ -61,6 +64,7 @@ val repositoryDependencies singleOf(::CharacterSheetRepository) singleOf(::RollHistoryRepository) singleOf(::SettingsRepository) + singleOf(::AlterationRepository) } val factoryDependencies diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/business/ExpressionUseCase.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/business/ExpressionUseCase.kt index 0015978..21829c3 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/business/ExpressionUseCase.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/business/ExpressionUseCase.kt @@ -4,6 +4,7 @@ package com.pixelized.desktop.lwa.business import com.pixelized.desktop.lwa.parser.expression.Expression import com.pixelized.desktop.lwa.parser.expression.ExpressionParser import com.pixelized.desktop.lwa.parser.word.Word +import com.pixelized.desktop.lwa.repository.alteration.model.FieldAlteration import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet import kotlin.math.max import kotlin.math.min @@ -15,7 +16,7 @@ class ExpressionUseCase( fun computeSkillValue( sheet: CharacterSheet, skill: CharacterSheet.Skill, - diminished: Int, + alterations: Int, ): Int { val context = Context( sheet = sheet, @@ -36,12 +37,21 @@ class ExpressionUseCase( expression = skill.level?.let(expressionParser::parse), ) - return max(base + bonus + level - diminished, 0) + return max(base + bonus + level + alterations, 0) } fun computeRoll( sheet: CharacterSheet, expression: String, + ): Int { + return expressionParser.parse(input = expression)?.let { + computeExpression(sheet = sheet, expression = it) + } ?: 0 + } + + fun computeExpression( + sheet: CharacterSheet, + expression: Expression, ): Int { val context = Context( sheet = sheet, @@ -49,7 +59,7 @@ class ExpressionUseCase( ) print("Evaluate:\"$expression\"") return context.evaluate( - expression = expressionParser.parse(input = expression), + expression = expression, ).also { println(" > $it") } } @@ -73,7 +83,7 @@ class ExpressionUseCase( } is Expression.Inversion -> { - -evaluate(expression) + -evaluate(expression.expression) } is Expression.Maximum -> { diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationRepository.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationRepository.kt new file mode 100644 index 0000000..f460541 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationRepository.kt @@ -0,0 +1,63 @@ +package com.pixelized.desktop.lwa.repository.alteration + +import com.pixelized.desktop.lwa.repository.alteration.model.FieldAlteration +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.map + +// Theses typealias are there for readability only. +private typealias CharacterId = String +private typealias AlterationId = String + +class AlterationRepository( + private val store: AlterationStore, +) { + private val activeAlterationIdMapFlow: HashMap>> = + hashMapOf("0f2117e9-e077-4354-8d77-20150df1c462" to MutableStateFlow(listOf("7c00dafa-a67d-4351-8ea9-67d933012cde", "65e37d32-3031-4bf8-9369-d2c45d2efac0"))) + + fun alterations(characterId: String): Flow>> { + return activeAlterationIdMapFlow + .getOrPut(characterId) { MutableStateFlow(emptyList()) } + .map { activeAlterationIds -> + val fieldAlterations = hashMapOf>() + + activeAlterationIds.forEach { id: AlterationId -> + store.alteration(alterationId = id)?.let { alteration -> + alteration.fields.forEach { field -> + fieldAlterations.getOrPut(field.fieldId) { mutableListOf() } + .add( + FieldAlteration( + alterationId = alteration.id, + metadata = alteration.metadata, + expression = field.expression, + ) + ) + } + } + } + + fieldAlterations + } + } + + fun toggle(characterId: String, alterationId: String) { + + // check if the alteration is currently active of inactive. + val active = activeAlterationIdMapFlow[characterId] + ?.value + ?.contains(alterationId) + ?: false + + // alteration was active for the character toggle it off. + activeAlterationIdMapFlow[characterId]?.value = activeAlterationIdMapFlow[characterId] + ?.value + ?.toMutableList() + ?.also { list -> + when (active) { + true -> list.remove(alterationId) + else -> list.add(alterationId) + } + } + ?: emptyList() + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationStore.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationStore.kt new file mode 100644 index 0000000..9d28db8 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationStore.kt @@ -0,0 +1,81 @@ +package com.pixelized.desktop.lwa.repository.alteration + +import com.pixelized.desktop.lwa.parser.expression.Expression +import com.pixelized.desktop.lwa.parser.expression.ExpressionParser +import com.pixelized.desktop.lwa.repository.alteration.model.Alteration +import com.pixelized.desktop.lwa.repository.alteration.model.AlterationMetadata +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CharacteristicId +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CharacteristicId.ARMOR +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CharacteristicId.DEX +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CharacteristicId.HEI +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CharacteristicId.MOV +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CharacteristicId.STR +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CommonSkillId.ACROBATICS_ID +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CommonSkillId.AID_ID +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CommonSkillId.ATHLETICS_ID +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CommonSkillId.BARGAIN_ID +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CommonSkillId.COMBAT_ID +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CommonSkillId.DISCRETION_ID +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CommonSkillId.INTIMIDATION_ID +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CommonSkillId.PERCEPTION_ID +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CommonSkillId.PERSUASION_ID +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CommonSkillId.SLEIGHT_OF_HAND_ID +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CommonSkillId.SPIEL_ID +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CommonSkillId.THROW_ID + +class AlterationStore( + private val expressionParser: ExpressionParser, +) { + private val alterations = mapOf( + "7c00dafa-a67d-4351-8ea9-67d933012cde" to Alteration( + id = "7c00dafa-a67d-4351-8ea9-67d933012cde", + metadata = AlterationMetadata( + name = "Tatouage Mak", + description = "Tatouage des Mak permettant la transformation en loup.", + ), + fields = listOf( + Alteration.Field(fieldId = CharacteristicId.PP, expression = "-2".parse()), + ) + ), + "65e37d32-3031-4bf8-9369-d2c45d2efac0" to Alteration( + id = "65e37d32-3031-4bf8-9369-d2c45d2efac0", + metadata = AlterationMetadata( + name = "Forme de loup", + description = "Capacité spécial des maks de la tribue Palok.", + ), + fields = listOf( + Alteration.Field(fieldId = STR, expression = "+1".parse()), + Alteration.Field(fieldId = DEX, expression = "-1".parse()), + Alteration.Field(fieldId = HEI, expression = "-1".parse()), + Alteration.Field(fieldId = MOV, expression = "+5".parse()), + Alteration.Field(fieldId = ARMOR, expression = "+1".parse()), + + Alteration.Field(fieldId = COMBAT_ID, expression = "+10".parse()), + Alteration.Field(fieldId = THROW_ID, expression = "-100".parse()), + Alteration.Field(fieldId = ATHLETICS_ID, expression = "+20".parse()), + Alteration.Field(fieldId = ACROBATICS_ID, expression = "-10".parse()), + Alteration.Field(fieldId = PERCEPTION_ID, expression = "+20".parse()), + Alteration.Field(fieldId = PERSUASION_ID, expression = "-20".parse()), + Alteration.Field(fieldId = INTIMIDATION_ID, expression = "+20".parse()), + Alteration.Field(fieldId = SPIEL_ID, expression = "-20".parse()), + Alteration.Field(fieldId = BARGAIN_ID, expression = "-20".parse()), + Alteration.Field(fieldId = DISCRETION_ID, expression = "+20".parse()), + Alteration.Field(fieldId = SLEIGHT_OF_HAND_ID, expression = "-100".parse()), + Alteration.Field(fieldId = AID_ID, expression = "-100".parse()), + + Alteration.Field( + fieldId = "40a4dcca-7010-4522-9d58-0cfac0a586e8", // Pistage + expression = "+20".parse() + ), + ) + ) + ) + + fun alterations(): Collection = alterations.values + + fun alteration(alterationId: String): Alteration? = alterations[alterationId] + + private fun String.parse(): Expression { + return expressionParser.parse(this)!! + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/model/Alteration.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/model/Alteration.kt new file mode 100644 index 0000000..ba0cf75 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/model/Alteration.kt @@ -0,0 +1,14 @@ +package com.pixelized.desktop.lwa.repository.alteration.model + +import com.pixelized.desktop.lwa.parser.expression.Expression + +data class Alteration( + val id: String, + val metadata: AlterationMetadata, + val fields: List, +) { + data class Field( + val fieldId: String, // this id is not the id of the instance but the id of the impacted characteristic in the character sheet. + val expression: Expression, + ) +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/model/AlterationMetadata.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/model/AlterationMetadata.kt new file mode 100644 index 0000000..d4e0640 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/model/AlterationMetadata.kt @@ -0,0 +1,6 @@ +package com.pixelized.desktop.lwa.repository.alteration.model + +data class AlterationMetadata( + val name: String, + val description: String, +) \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/model/FieldAlteration.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/model/FieldAlteration.kt new file mode 100644 index 0000000..c6cfe6d --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/model/FieldAlteration.kt @@ -0,0 +1,9 @@ +package com.pixelized.desktop.lwa.repository.alteration.model + +import com.pixelized.desktop.lwa.parser.expression.Expression + +data class FieldAlteration( + val alterationId: String, + val metadata: AlterationMetadata, + val expression: Expression, +) \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/screen/characterSheet/detail/CharacterSheetFactory.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/screen/characterSheet/detail/CharacterSheetFactory.kt index 73e5d6e..cff3f60 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/screen/characterSheet/detail/CharacterSheetFactory.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/screen/characterSheet/detail/CharacterSheetFactory.kt @@ -2,6 +2,7 @@ package com.pixelized.desktop.lwa.screen.characterSheet.detail import com.pixelized.desktop.lwa.business.ExpressionUseCase import com.pixelized.desktop.lwa.composable.tooltip.TooltipUio +import com.pixelized.desktop.lwa.repository.alteration.model.FieldAlteration import com.pixelized.desktop.lwa.repository.characterSheet.SkillDescriptionFactory import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CharacteristicId @@ -40,15 +41,23 @@ import org.jetbrains.compose.resources.getString class CharacterSheetFactory( private val skillUseCase: ExpressionUseCase, + private val expressionUseCase: ExpressionUseCase, private val skillDescriptionFactory: SkillDescriptionFactory, ) { suspend fun convertToUio( sheet: CharacterSheet?, diminished: Int, + alterations: Map>, ): CharacterSheetPageUio? { if (sheet == null) return null + fun List?.sum(): Int { + return this?.sumOf { + expressionUseCase.computeExpression(sheet = sheet, expression = it.expression) + } ?: 0 + } + return CharacterSheetPageUio( id = sheet.id, name = sheet.name, @@ -56,7 +65,7 @@ class CharacterSheetFactory( Characteristic( id = CharacteristicId.STR, label = getString(Res.string.character_sheet__characteristics__str), - value = "${sheet.strength}", + value = "${sheet.strength + alterations[CharacteristicId.STR].sum()}", tooltips = TooltipUio( title = getString(Res.string.character_sheet__characteristics__str), description = getString(Res.string.tooltip__characteristics__strength), @@ -66,7 +75,7 @@ class CharacterSheetFactory( Characteristic( id = CharacteristicId.DEX, label = getString(Res.string.character_sheet__characteristics__dex), - value = "${sheet.dexterity}", + value = "${sheet.dexterity + alterations[CharacteristicId.DEX].sum()}", tooltips = TooltipUio( title = getString(Res.string.character_sheet__characteristics__dex), description = getString(Res.string.tooltip__characteristics__dexterity), @@ -76,7 +85,7 @@ class CharacterSheetFactory( Characteristic( id = CharacteristicId.CON, label = getString(Res.string.character_sheet__characteristics__con), - value = "${sheet.constitution}", + value = "${sheet.constitution + alterations[CharacteristicId.CON].sum()}", tooltips = TooltipUio( title = getString(Res.string.character_sheet__characteristics__con), description = getString(Res.string.tooltip__characteristics__constitution), @@ -86,7 +95,7 @@ class CharacterSheetFactory( Characteristic( id = CharacteristicId.HEI, label = getString(Res.string.character_sheet__characteristics__hei), - value = "${sheet.height}", + value = "${sheet.height + alterations[CharacteristicId.HEI].sum()}", tooltips = TooltipUio( title = getString(Res.string.character_sheet__characteristics__hei), description = getString(Res.string.tooltip__characteristics__height), @@ -96,7 +105,7 @@ class CharacterSheetFactory( Characteristic( id = CharacteristicId.INT, label = getString(Res.string.character_sheet__characteristics__int), - value = "${sheet.intelligence}", + value = "${sheet.intelligence + alterations[CharacteristicId.INT].sum()}", tooltips = TooltipUio( title = getString(Res.string.character_sheet__characteristics__int), description = getString(Res.string.tooltip__characteristics__intelligence), @@ -106,7 +115,7 @@ class CharacterSheetFactory( Characteristic( id = CharacteristicId.POW, label = getString(Res.string.character_sheet__characteristics__pow), - value = "${sheet.power}", + value = "${sheet.power + alterations[CharacteristicId.POW].sum()}", tooltips = TooltipUio( title = getString(Res.string.character_sheet__characteristics__pow), description = getString(Res.string.tooltip__characteristics__power), @@ -116,7 +125,7 @@ class CharacterSheetFactory( Characteristic( id = CharacteristicId.CHA, label = getString(Res.string.character_sheet__characteristics__cha), - value = "${sheet.charisma}", + value = "${sheet.charisma + alterations[CharacteristicId.CHA].sum()}", tooltips = TooltipUio( title = getString(Res.string.character_sheet__characteristics__cha), description = getString(Res.string.tooltip__characteristics__charisma), @@ -128,7 +137,7 @@ class CharacterSheetFactory( Characteristic( id = CharacteristicId.MOV, label = getString(Res.string.character_sheet__sub_characteristics__movement), - value = "${sheet.movement}", + value = "${sheet.movement + alterations[CharacteristicId.MOV].sum()}", tooltips = TooltipUio( title = getString(Res.string.character_sheet__sub_characteristics__movement), description = getString(Res.string.tooltip__sub_characteristics__movement), @@ -138,7 +147,7 @@ class CharacterSheetFactory( Characteristic( id = CharacteristicId.HP, label = getString(Res.string.character_sheet__sub_characteristics__hit_point), - value = "${sheet.currentHp}/${sheet.maxHp}", + value = "${sheet.currentHp}/${sheet.maxHp + alterations[CharacteristicId.HP].sum()}", tooltips = TooltipUio( title = getString(Res.string.character_sheet__sub_characteristics__hit_point), description = getString(Res.string.tooltip__sub_characteristics__hit_point), @@ -148,7 +157,7 @@ class CharacterSheetFactory( Characteristic( id = CharacteristicId.PP, label = getString(Res.string.character_sheet__sub_characteristics__power_point), - value = "${sheet.currentPp}/${sheet.maxPp}", + value = "${sheet.currentPp}/${sheet.maxPp + alterations[CharacteristicId.PP].sum()}", tooltips = TooltipUio( title = getString(Res.string.character_sheet__sub_characteristics__power_point), description = getString(Res.string.tooltip__sub_characteristics__power_point), @@ -168,7 +177,7 @@ class CharacterSheetFactory( Characteristic( id = CharacteristicId.ARMOR, label = getString(Res.string.character_sheet__sub_characteristics__armor), - value = "${sheet.armor}", + value = "${sheet.armor + alterations[CharacteristicId.ARMOR].sum()}", tooltips = TooltipUio( title = getString(Res.string.character_sheet__sub_characteristics__armor), description = getString(Res.string.tooltip__sub_characteristics__armor), @@ -178,7 +187,7 @@ class CharacterSheetFactory( Characteristic( id = CharacteristicId.LB, label = getString(Res.string.character_sheet__sub_characteristics__learning), - value = "${sheet.learning}", + value = "${sheet.learning + alterations[CharacteristicId.LB].sum()}", tooltips = TooltipUio( title = getString(Res.string.character_sheet__sub_characteristics__learning), description = getString(Res.string.tooltip__sub_characteristics__learning), @@ -188,7 +197,7 @@ class CharacterSheetFactory( Characteristic( id = CharacteristicId.GHP, label = getString(Res.string.character_sheet__sub_characteristics__hp_grow), - value = "${sheet.hpGrow}", + value = "${sheet.hpGrow + alterations[CharacteristicId.GHP].sum()}", tooltips = TooltipUio( title = getString(Res.string.character_sheet__sub_characteristics__hp_grow), description = getString(Res.string.tooltip__sub_characteristics__hp_grow), @@ -202,7 +211,7 @@ class CharacterSheetFactory( value = skillUseCase.computeSkillValue( sheet = sheet, skill = skill, - diminished = diminished, + alterations = alterations[skill.id].sum(), ), tooltips = skillDescriptionFactory.baseSkillDescription(id = skill.id)?.let { TooltipUio( @@ -225,7 +234,7 @@ class CharacterSheetFactory( value = skillUseCase.computeSkillValue( sheet = sheet, skill = skill, - diminished = diminished, + alterations = alterations[skill.id].sum(), ), used = skill.used, ) @@ -242,7 +251,7 @@ class CharacterSheetFactory( value = skillUseCase.computeSkillValue( sheet = sheet, skill = skill, - diminished = diminished, + alterations = alterations[skill.id].sum(), ), used = skill.used, ) diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/screen/characterSheet/detail/CharacterSheetPage.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/screen/characterSheet/detail/CharacterSheetPage.kt index c0dc63e..6ba533f 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/screen/characterSheet/detail/CharacterSheetPage.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/screen/characterSheet/detail/CharacterSheetPage.kt @@ -8,6 +8,7 @@ import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically import androidx.compose.animation.togetherWith +import androidx.compose.desktop.ui.tooling.preview.Preview import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.ScrollState import androidx.compose.foundation.clickable @@ -49,13 +50,10 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.min import com.pixelized.desktop.lwa.LocalWindowController import com.pixelized.desktop.lwa.composable.blur.BlurContent import com.pixelized.desktop.lwa.composable.blur.BlurContentController @@ -65,11 +63,14 @@ import com.pixelized.desktop.lwa.composable.tooltip.TooltipUio import com.pixelized.desktop.lwa.navigation.screen.LocalScreenController import com.pixelized.desktop.lwa.navigation.window.LocalWindow import com.pixelized.desktop.lwa.navigation.window.destination.navigateToCharacterSheetEdit +import com.pixelized.desktop.lwa.screen.characterSheet.detail.CharacterSheetPageUio.Characteristic import com.pixelized.desktop.lwa.screen.characterSheet.detail.dialog.CharacterSheetDeleteConfirmationDialog import com.pixelized.desktop.lwa.screen.characterSheet.detail.dialog.CharacterSheetStatDialog import com.pixelized.desktop.lwa.screen.characterSheet.detail.dialog.DiminishedStatDialog +import com.pixelized.desktop.lwa.screen.characterSheet.detail.preview.rememberCharacterSheetPreview import com.pixelized.desktop.lwa.screen.roll.RollPage import com.pixelized.desktop.lwa.screen.roll.RollViewModel +import com.pixelized.desktop.lwa.utils.preview.ContentPreview import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import lwacharactersheet.composeapp.generated.resources.Res @@ -86,7 +87,6 @@ import org.jetbrains.compose.resources.getString import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource import org.koin.compose.viewmodel.koinViewModel -import java.awt.Toolkit @Stable data class CharacterSheetPageUio( @@ -131,7 +131,6 @@ fun CharacterSheetPage( val windowController = LocalWindowController.current val screen = LocalScreenController.current val window = LocalWindow.current - val density = LocalDensity.current val scope = rememberCoroutineScope() val blurController = remember { BlurContentController() } @@ -147,10 +146,11 @@ fun CharacterSheetPage( characterSheet = sheet, diminishedValue = viewModel.diminishedValue, onDiminished = { - blurController.show() - scope.launch { - viewModel.showDiminishedDialog() - } +// blurController.show() +// scope.launch { +// viewModel.showDiminishedDialog() +// } + viewModel.toggleWolf() }, onEdit = { windowController.navigateToCharacterSheetEdit( @@ -273,8 +273,8 @@ fun CharacterSheetPageContent( onDiminished: () -> Unit, onEdit: () -> Unit, onDelete: () -> Unit, - onCharacteristic: (characteristic: CharacterSheetPageUio.Characteristic) -> Unit, - onSubCharacteristic: (characteristic: CharacterSheetPageUio.Characteristic) -> Unit, + onCharacteristic: (characteristic: Characteristic) -> Unit, + onSubCharacteristic: (characteristic: Characteristic) -> Unit, onSkill: (skill: CharacterSheetPageUio.Node) -> Unit, onUseSkill: (skill: CharacterSheetPageUio.Node) -> Unit, onRoll: (roll: CharacterSheetPageUio.Roll) -> Unit, @@ -520,7 +520,7 @@ fun CharacterSheetPageContent( private fun Stat( modifier: Modifier = Modifier, paddingValues: PaddingValues = PaddingValues(all = 8.dp), - characteristic: CharacterSheetPageUio.Characteristic, + characteristic: Characteristic, onClick: () -> Unit, ) { TooltipLayout( @@ -557,8 +557,8 @@ private fun Stat( private fun SubCharacteristics( modifier: Modifier = Modifier, paddingValues: PaddingValues = PaddingValues(horizontal = 8.dp), - characteristic: CharacterSheetPageUio.Characteristic, - onCharacteristic: ((characteristic: CharacterSheetPageUio.Characteristic) -> Unit)?, + characteristic: Characteristic, + onCharacteristic: ((characteristic: Characteristic) -> Unit)?, ) { TooltipLayout( tooltip = characteristic.tooltips, @@ -667,4 +667,25 @@ private fun Roll( } } -private fun Modifier.cell(): Modifier = this.fillMaxWidth().height(height = 32.dp) \ No newline at end of file +private fun Modifier.cell(): Modifier = this.fillMaxWidth().height(height = 32.dp) + +@Composable +@Preview +private fun DecoratedBoxPreview() { + ContentPreview { + CharacterSheetPageContent( + modifier = Modifier.fillMaxSize(), + scrollState = rememberScrollState(), + characterSheet = rememberCharacterSheetPreview(), + diminishedValue = remember { mutableStateOf(null) }, + onDiminished = { }, + onEdit = { }, + onDelete = { }, + onCharacteristic = { }, + onSubCharacteristic = { }, + onSkill = { }, + onUseSkill = { }, + onRoll = { }, + ) + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/screen/characterSheet/detail/CharacterSheetViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/screen/characterSheet/detail/CharacterSheetViewModel.kt index 26a001a..a8a3252 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/screen/characterSheet/detail/CharacterSheetViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/screen/characterSheet/detail/CharacterSheetViewModel.kt @@ -10,6 +10,7 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.pixelized.desktop.lwa.navigation.screen.destination.CharacterSheetDestination +import com.pixelized.desktop.lwa.repository.alteration.AlterationRepository import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetRepository import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet import com.pixelized.desktop.lwa.screen.characterSheet.detail.dialog.CharacterSheetDeleteConfirmationDialogUio @@ -29,6 +30,7 @@ private typealias CSDCDialogUio = CharacterSheetDeleteConfirmationDialogUio class CharacterSheetViewModel( private val repository: CharacterSheetRepository, + private val alteration: AlterationRepository, private val factory: CharacterSheetFactory, savedStateHandle: SavedStateHandle, ) : ViewModel() { @@ -57,8 +59,9 @@ class CharacterSheetViewModel( private val sheetFlow = combine( repository.characterSheetFlow(id = argument.id), repository.characterDiminishedFlow(id = argument.id), - transform = { sheet, diminished -> - factory.convertToUio(sheet = sheet, diminished = diminished) + alteration.alterations(characterId = argument.id), + transform = { sheet, diminished, alterations -> + factory.convertToUio(sheet = sheet, diminished = diminished, alterations = alterations) }, ) val sheet: State @@ -68,6 +71,10 @@ class CharacterSheetViewModel( context = viewModelScope.coroutineContext, ) + fun toggleWolf() { + alteration.toggle(argument.id, "65e37d32-3031-4bf8-9369-d2c45d2efac0") + } + fun deleteCharacter(id: String) { repository.delete(id = id) } diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/screen/characterSheet/detail/preview/rememberCharacterSheetPagePreview.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/screen/characterSheet/detail/preview/rememberCharacterSheetPagePreview.kt new file mode 100644 index 0000000..8d8c100 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/screen/characterSheet/detail/preview/rememberCharacterSheetPagePreview.kt @@ -0,0 +1,126 @@ +package com.pixelized.desktop.lwa.screen.characterSheet.detail.preview + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.remember +import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CharacteristicId +import com.pixelized.desktop.lwa.screen.characterSheet.detail.CharacterSheetPageUio +import com.pixelized.desktop.lwa.screen.characterSheet.detail.CharacterSheetPageUio.Characteristic + + +@Composable +@Stable +fun rememberCharacterSheetPreview(): CharacterSheetPageUio { + return remember { + CharacterSheetPageUio( + id = "Koryas_Id", + name = "Koryas", + characteristics = listOf( + Characteristic( + id = CharacteristicId.STR, + label = "Force", + value = "10", + tooltips = null, + editable = false, + ), + Characteristic( + id = CharacteristicId.DEX, + label = "Dexterité", + value = "10", + tooltips = null, + editable = false, + ), + Characteristic( + id = CharacteristicId.CON, + label = "Constitution", + value = "10", + tooltips = null, + editable = false, + ), + Characteristic( + id = CharacteristicId.HEI, + label = "Taille", + value = "10", + tooltips = null, + editable = false, + ), + Characteristic( + id = CharacteristicId.INT, + label = "Intelligence", + value = "10", + tooltips = null, + editable = false, + ), + Characteristic( + id = CharacteristicId.POW, + label = "Pouvoir", + value = "10", + tooltips = null, + editable = false, + ), + Characteristic( + id = CharacteristicId.CHA, + label = "Charisme", + value = "10", + tooltips = null, + editable = false, + ), + ), + subCharacteristics = listOf( + Characteristic( + id = CharacteristicId.MOV, + label = "Mouvement", + value = "10", + tooltips = null, + editable = false, + ), + Characteristic( + id = CharacteristicId.HP, + label = "Point de vie", + value = "20/20", + tooltips = null, + editable = true, + ), + Characteristic( + id = CharacteristicId.PP, + label = "Point de pouvoir", + value = "15/15", + tooltips = null, + editable = true, + ), + Characteristic( + id = CharacteristicId.DMG, + label = "Domage bonus", + value = "1d4", + tooltips = null, + editable = false, + ), + Characteristic( + id = CharacteristicId.ARMOR, + label = "Armure", + value = "0", + tooltips = null, + editable = false, + ), + Characteristic( + id = CharacteristicId.LB, + label = "Apprentissage", + value = "0", + tooltips = null, + editable = false, + ), + Characteristic( + id = CharacteristicId.GHP, + label = "Bonus de PV", + value = "5", + tooltips = null, + editable = false, + ), + ), + commonSkills = emptyList(), + specialSKills = emptyList(), + magicsSkills = emptyList(), + actions = emptyList(), + ) + } +} \ No newline at end of file