Fix skill throw bonus.
This commit is contained in:
		
							parent
							
								
									bb1575ea84
								
							
						
					
					
						commit
						81b74cd03f
					
				
					 11 changed files with 178 additions and 25 deletions
				
			
		| 
						 | 
					@ -442,6 +442,8 @@ class DiceThrowUseCase @Inject constructor(
 | 
				
			||||||
                        skill = diceThrow.skill,
 | 
					                        skill = diceThrow.skill,
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
                    skillThrow(
 | 
					                    skillThrow(
 | 
				
			||||||
 | 
					                        character = sheet,
 | 
				
			||||||
 | 
					                        alterations = alterations,
 | 
				
			||||||
                        skill = skill,
 | 
					                        skill = skill,
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
| 
						 | 
					@ -908,6 +910,8 @@ class DiceThrowUseCase @Inject constructor(
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private fun skillThrow(
 | 
					    private fun skillThrow(
 | 
				
			||||||
 | 
					        character: CharacterSheet,
 | 
				
			||||||
 | 
					        alterations: Map<Property, List<Alteration.Status>>,
 | 
				
			||||||
        skill: Skill?,
 | 
					        skill: Skill?,
 | 
				
			||||||
    ): DiceThrowResult {
 | 
					    ): DiceThrowResult {
 | 
				
			||||||
        // retrieve some wording.
 | 
					        // retrieve some wording.
 | 
				
			||||||
| 
						 | 
					@ -924,6 +928,40 @@ class DiceThrowUseCase @Inject constructor(
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        allValue.add(result.value)
 | 
					        allValue.add(result.value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // fetch and build the associated characteristic
 | 
				
			||||||
 | 
					        val relatedStatBonus = skill?.effect?.modifier?.mapNotNull { property ->
 | 
				
			||||||
 | 
					            when (property) {
 | 
				
			||||||
 | 
					                Property.STRENGTH -> (character.strength + alterations[property].sum).modifier
 | 
				
			||||||
 | 
					                Property.DEXTERITY -> (character.dexterity + alterations[property].sum).modifier
 | 
				
			||||||
 | 
					                Property.CONSTITUTION -> (character.constitution + alterations[property].sum).modifier
 | 
				
			||||||
 | 
					                Property.INTELLIGENCE -> (character.intelligence + alterations[property].sum).modifier
 | 
				
			||||||
 | 
					                Property.WISDOM -> (character.wisdom + alterations[property].sum).modifier
 | 
				
			||||||
 | 
					                Property.CHARISMA -> (character.charisma + alterations[property].sum).modifier
 | 
				
			||||||
 | 
					                Property.PROFICIENCY -> character.proficiency
 | 
				
			||||||
 | 
					                else -> null
 | 
				
			||||||
 | 
					            }?.let { value ->
 | 
				
			||||||
 | 
					                val titleLabel = if (property == Property.PROFICIENCY) {
 | 
				
			||||||
 | 
					                    application.getString(R.string.dice_roll_mastery_proficiency, skill)
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    val label = when (property) {
 | 
				
			||||||
 | 
					                        Property.STRENGTH -> application.getString(R.string.character_sheet_stat_strength)
 | 
				
			||||||
 | 
					                        Property.DEXTERITY -> application.getString(R.string.character_sheet_stat_dexterity)
 | 
				
			||||||
 | 
					                        Property.CONSTITUTION -> application.getString(R.string.character_sheet_stat_constitution)
 | 
				
			||||||
 | 
					                        Property.INTELLIGENCE -> application.getString(R.string.character_sheet_stat_intelligence)
 | 
				
			||||||
 | 
					                        Property.WISDOM -> application.getString(R.string.character_sheet_stat_wisdom)
 | 
				
			||||||
 | 
					                        Property.CHARISMA -> application.getString(R.string.character_sheet_stat_charisma)
 | 
				
			||||||
 | 
					                        else -> ""
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    application.getString(R.string.dice_roll_bonus_detail, label)
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                allValue.add(value)
 | 
				
			||||||
 | 
					                ThrowsCardUio.Detail(
 | 
				
			||||||
 | 
					                    title = titleLabel,
 | 
				
			||||||
 | 
					                    result = "$value",
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } ?: emptyList()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // build the result.
 | 
					        // build the result.
 | 
				
			||||||
        return DiceThrowResult(
 | 
					        return DiceThrowResult(
 | 
				
			||||||
            dice = RollDiceUio(
 | 
					            dice = RollDiceUio(
 | 
				
			||||||
| 
						 | 
					@ -946,7 +984,7 @@ class DiceThrowUseCase @Inject constructor(
 | 
				
			||||||
                        ),
 | 
					                        ),
 | 
				
			||||||
                        result = "${result.value}",
 | 
					                        result = "${result.value}",
 | 
				
			||||||
                    ),
 | 
					                    ),
 | 
				
			||||||
                ),
 | 
					                ) + relatedStatBonus,
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,74 @@
 | 
				
			||||||
 | 
					package com.pixelized.rplexicon.ui.screens.character.composable.actions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.content.res.Configuration.UI_MODE_NIGHT_NO
 | 
				
			||||||
 | 
					import android.content.res.Configuration.UI_MODE_NIGHT_YES
 | 
				
			||||||
 | 
					import androidx.compose.foundation.layout.Column
 | 
				
			||||||
 | 
					import androidx.compose.foundation.layout.PaddingValues
 | 
				
			||||||
 | 
					import androidx.compose.foundation.layout.fillMaxWidth
 | 
				
			||||||
 | 
					import androidx.compose.foundation.layout.padding
 | 
				
			||||||
 | 
					import androidx.compose.material3.Divider
 | 
				
			||||||
 | 
					import androidx.compose.material3.MaterialTheme
 | 
				
			||||||
 | 
					import androidx.compose.material3.Surface
 | 
				
			||||||
 | 
					import androidx.compose.material3.Text
 | 
				
			||||||
 | 
					import androidx.compose.runtime.Composable
 | 
				
			||||||
 | 
					import androidx.compose.ui.Modifier
 | 
				
			||||||
 | 
					import androidx.compose.ui.res.stringResource
 | 
				
			||||||
 | 
					import androidx.compose.ui.text.AnnotatedString
 | 
				
			||||||
 | 
					import androidx.compose.ui.text.font.FontWeight
 | 
				
			||||||
 | 
					import androidx.compose.ui.text.style.TextOverflow
 | 
				
			||||||
 | 
					import androidx.compose.ui.tooling.preview.Preview
 | 
				
			||||||
 | 
					import androidx.compose.ui.unit.dp
 | 
				
			||||||
 | 
					import com.pixelized.rplexicon.R
 | 
				
			||||||
 | 
					import com.pixelized.rplexicon.ui.theme.LexiconTheme
 | 
				
			||||||
 | 
					import com.pixelized.rplexicon.utilitary.extentions.lexicon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Composable
 | 
				
			||||||
 | 
					fun AlterationHeader(
 | 
				
			||||||
 | 
					    modifier: Modifier = Modifier,
 | 
				
			||||||
 | 
					    padding: PaddingValues = PaddingValues(horizontal = 16.dp),
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					    Column(
 | 
				
			||||||
 | 
					        modifier = modifier,
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					        Surface(
 | 
				
			||||||
 | 
					            modifier = Modifier.fillMaxWidth(),
 | 
				
			||||||
 | 
					        ) {
 | 
				
			||||||
 | 
					            Text(
 | 
				
			||||||
 | 
					                modifier = Modifier.padding(paddingValues = padding),
 | 
				
			||||||
 | 
					                style = MaterialTheme.typography.bodyMedium,
 | 
				
			||||||
 | 
					                fontWeight = FontWeight.Bold,
 | 
				
			||||||
 | 
					                overflow = TextOverflow.Ellipsis,
 | 
				
			||||||
 | 
					                maxLines = 1,
 | 
				
			||||||
 | 
					                text = stringResource(id = R.string.character_sheet_title_alteration).let {
 | 
				
			||||||
 | 
					                    AnnotatedString(
 | 
				
			||||||
 | 
					                        text = it,
 | 
				
			||||||
 | 
					                        spanStyles = listOf(
 | 
				
			||||||
 | 
					                            AnnotatedString.Range(
 | 
				
			||||||
 | 
					                                item = MaterialTheme.lexicon.typography.bodyDropCapSpan,
 | 
				
			||||||
 | 
					                                start = 0,
 | 
				
			||||||
 | 
					                                end = Integer.min(1, it.length),
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        Divider(
 | 
				
			||||||
 | 
					            modifier = Modifier.padding(paddingValues = padding),
 | 
				
			||||||
 | 
					            color = MaterialTheme.lexicon.colorScheme.placeholder,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Composable
 | 
				
			||||||
 | 
					@Preview(uiMode = UI_MODE_NIGHT_NO)
 | 
				
			||||||
 | 
					@Preview(uiMode = UI_MODE_NIGHT_YES)
 | 
				
			||||||
 | 
					private fun AlterationPreview() {
 | 
				
			||||||
 | 
					    LexiconTheme {
 | 
				
			||||||
 | 
					        Surface {
 | 
				
			||||||
 | 
					            AlterationHeader()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -40,7 +40,7 @@ fun AttackHeader(
 | 
				
			||||||
                fontWeight = FontWeight.Bold,
 | 
					                fontWeight = FontWeight.Bold,
 | 
				
			||||||
                overflow = TextOverflow.Ellipsis,
 | 
					                overflow = TextOverflow.Ellipsis,
 | 
				
			||||||
                maxLines = 1,
 | 
					                maxLines = 1,
 | 
				
			||||||
                text = stringResource(id = R.string.character_sheet_attack_title).let {
 | 
					                text = stringResource(id = R.string.character_sheet_title_attacks).let {
 | 
				
			||||||
                    AnnotatedString(
 | 
					                    AnnotatedString(
 | 
				
			||||||
                        text = it,
 | 
					                        text = it,
 | 
				
			||||||
                        spanStyles = listOf(
 | 
					                        spanStyles = listOf(
 | 
				
			||||||
| 
						 | 
					@ -65,7 +65,7 @@ fun AttackHeader(
 | 
				
			||||||
@Composable
 | 
					@Composable
 | 
				
			||||||
@Preview(uiMode = UI_MODE_NIGHT_NO)
 | 
					@Preview(uiMode = UI_MODE_NIGHT_NO)
 | 
				
			||||||
@Preview(uiMode = UI_MODE_NIGHT_YES)
 | 
					@Preview(uiMode = UI_MODE_NIGHT_YES)
 | 
				
			||||||
private fun SkillHeaderPreview() {
 | 
					private fun AttackHeaderPreview() {
 | 
				
			||||||
    LexiconTheme {
 | 
					    LexiconTheme {
 | 
				
			||||||
        Surface {
 | 
					        Surface {
 | 
				
			||||||
            SkillHeader()
 | 
					            SkillHeader()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,18 +2,15 @@ package com.pixelized.rplexicon.ui.screens.character.composable.actions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import android.content.res.Configuration.UI_MODE_NIGHT_NO
 | 
					import android.content.res.Configuration.UI_MODE_NIGHT_NO
 | 
				
			||||||
import android.content.res.Configuration.UI_MODE_NIGHT_YES
 | 
					import android.content.res.Configuration.UI_MODE_NIGHT_YES
 | 
				
			||||||
import androidx.compose.foundation.layout.Box
 | 
					 | 
				
			||||||
import androidx.compose.foundation.layout.Column
 | 
					import androidx.compose.foundation.layout.Column
 | 
				
			||||||
import androidx.compose.foundation.layout.PaddingValues
 | 
					import androidx.compose.foundation.layout.PaddingValues
 | 
				
			||||||
import androidx.compose.foundation.layout.fillMaxWidth
 | 
					import androidx.compose.foundation.layout.fillMaxWidth
 | 
				
			||||||
import androidx.compose.foundation.layout.heightIn
 | 
					 | 
				
			||||||
import androidx.compose.foundation.layout.padding
 | 
					import androidx.compose.foundation.layout.padding
 | 
				
			||||||
import androidx.compose.material3.Divider
 | 
					import androidx.compose.material3.Divider
 | 
				
			||||||
import androidx.compose.material3.MaterialTheme
 | 
					import androidx.compose.material3.MaterialTheme
 | 
				
			||||||
import androidx.compose.material3.Surface
 | 
					import androidx.compose.material3.Surface
 | 
				
			||||||
import androidx.compose.material3.Text
 | 
					import androidx.compose.material3.Text
 | 
				
			||||||
import androidx.compose.runtime.Composable
 | 
					import androidx.compose.runtime.Composable
 | 
				
			||||||
import androidx.compose.ui.Alignment
 | 
					 | 
				
			||||||
import androidx.compose.ui.Modifier
 | 
					import androidx.compose.ui.Modifier
 | 
				
			||||||
import androidx.compose.ui.res.stringResource
 | 
					import androidx.compose.ui.res.stringResource
 | 
				
			||||||
import androidx.compose.ui.text.AnnotatedString
 | 
					import androidx.compose.ui.text.AnnotatedString
 | 
				
			||||||
| 
						 | 
					@ -43,7 +40,7 @@ fun SkillHeader(
 | 
				
			||||||
                fontWeight = FontWeight.Bold,
 | 
					                fontWeight = FontWeight.Bold,
 | 
				
			||||||
                overflow = TextOverflow.Ellipsis,
 | 
					                overflow = TextOverflow.Ellipsis,
 | 
				
			||||||
                maxLines = 1,
 | 
					                maxLines = 1,
 | 
				
			||||||
                text = stringResource(id = R.string.character_sheet_skill_title).let {
 | 
					                text = stringResource(id = R.string.character_sheet_title_skills).let {
 | 
				
			||||||
                    AnnotatedString(
 | 
					                    AnnotatedString(
 | 
				
			||||||
                        text = it,
 | 
					                        text = it,
 | 
				
			||||||
                        spanStyles = listOf(
 | 
					                        spanStyles = listOf(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,6 +31,9 @@ class SpellUioFactory @Inject constructor() {
 | 
				
			||||||
            val modifier = dice.modifier.sumOf {
 | 
					            val modifier = dice.modifier.sumOf {
 | 
				
			||||||
                when (it) {
 | 
					                when (it) {
 | 
				
			||||||
                    Property.PROFICIENCY -> characterSheet.proficiency
 | 
					                    Property.PROFICIENCY -> characterSheet.proficiency
 | 
				
			||||||
 | 
					                    Property.STRENGTH -> characterSheet.strength.modifier
 | 
				
			||||||
 | 
					                    Property.DEXTERITY -> characterSheet.dexterity.modifier
 | 
				
			||||||
 | 
					                    Property.CONSTITUTION -> characterSheet.constitution.modifier
 | 
				
			||||||
                    Property.INTELLIGENCE -> characterSheet.intelligence.modifier
 | 
					                    Property.INTELLIGENCE -> characterSheet.intelligence.modifier
 | 
				
			||||||
                    Property.WISDOM -> characterSheet.wisdom.modifier
 | 
					                    Property.WISDOM -> characterSheet.wisdom.modifier
 | 
				
			||||||
                    Property.CHARISMA -> characterSheet.charisma.modifier
 | 
					                    Property.CHARISMA -> characterSheet.charisma.modifier
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,14 +6,20 @@ import androidx.compose.runtime.mutableStateOf
 | 
				
			||||||
import androidx.lifecycle.AndroidViewModel
 | 
					import androidx.lifecycle.AndroidViewModel
 | 
				
			||||||
import androidx.lifecycle.SavedStateHandle
 | 
					import androidx.lifecycle.SavedStateHandle
 | 
				
			||||||
import androidx.lifecycle.viewModelScope
 | 
					import androidx.lifecycle.viewModelScope
 | 
				
			||||||
 | 
					import com.pixelized.rplexicon.model.CharacterSheet
 | 
				
			||||||
 | 
					import com.pixelized.rplexicon.model.CharacterSheetFire
 | 
				
			||||||
import com.pixelized.rplexicon.model.DiceThrow
 | 
					import com.pixelized.rplexicon.model.DiceThrow
 | 
				
			||||||
 | 
					import com.pixelized.rplexicon.model.Property
 | 
				
			||||||
 | 
					import com.pixelized.rplexicon.model.Skill
 | 
				
			||||||
import com.pixelized.rplexicon.repository.authentication.FirebaseRepository
 | 
					import com.pixelized.rplexicon.repository.authentication.FirebaseRepository
 | 
				
			||||||
 | 
					import com.pixelized.rplexicon.repository.data.CharacterSheetRepository
 | 
				
			||||||
import com.pixelized.rplexicon.repository.data.DescriptionRepository
 | 
					import com.pixelized.rplexicon.repository.data.DescriptionRepository
 | 
				
			||||||
import com.pixelized.rplexicon.repository.data.SkillRepository
 | 
					import com.pixelized.rplexicon.repository.data.SkillRepository
 | 
				
			||||||
import com.pixelized.rplexicon.ui.composable.edit.SkillEditDialogUio
 | 
					import com.pixelized.rplexicon.ui.composable.edit.SkillEditDialogUio
 | 
				
			||||||
import com.pixelized.rplexicon.ui.navigation.screens.characterSheetArgument
 | 
					import com.pixelized.rplexicon.ui.navigation.screens.characterSheetArgument
 | 
				
			||||||
import com.pixelized.rplexicon.ui.screens.character.composable.actions.SkillItemUio
 | 
					import com.pixelized.rplexicon.ui.screens.character.composable.actions.SkillItemUio
 | 
				
			||||||
import com.pixelized.rplexicon.utilitary.extentions.icon
 | 
					import com.pixelized.rplexicon.utilitary.extentions.icon
 | 
				
			||||||
 | 
					import com.pixelized.rplexicon.utilitary.extentions.modifier
 | 
				
			||||||
import dagger.hilt.android.lifecycle.HiltViewModel
 | 
					import dagger.hilt.android.lifecycle.HiltViewModel
 | 
				
			||||||
import kotlinx.coroutines.Dispatchers
 | 
					import kotlinx.coroutines.Dispatchers
 | 
				
			||||||
import kotlinx.coroutines.flow.combine
 | 
					import kotlinx.coroutines.flow.combine
 | 
				
			||||||
| 
						 | 
					@ -23,6 +29,7 @@ import javax.inject.Inject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@HiltViewModel
 | 
					@HiltViewModel
 | 
				
			||||||
class SkillsViewModel @Inject constructor(
 | 
					class SkillsViewModel @Inject constructor(
 | 
				
			||||||
 | 
					    private val sheetRepository: CharacterSheetRepository,
 | 
				
			||||||
    private val skillRepository: SkillRepository,
 | 
					    private val skillRepository: SkillRepository,
 | 
				
			||||||
    private val firebaseRepository: FirebaseRepository,
 | 
					    private val firebaseRepository: FirebaseRepository,
 | 
				
			||||||
    private val descriptionRepository: DescriptionRepository,
 | 
					    private val descriptionRepository: DescriptionRepository,
 | 
				
			||||||
| 
						 | 
					@ -43,15 +50,30 @@ class SkillsViewModel @Inject constructor(
 | 
				
			||||||
    init {
 | 
					    init {
 | 
				
			||||||
        viewModelScope.launch {
 | 
					        viewModelScope.launch {
 | 
				
			||||||
            launch(Dispatchers.IO) {
 | 
					            launch(Dispatchers.IO) {
 | 
				
			||||||
                skillRepository.skills
 | 
					                sheetRepository.data
 | 
				
			||||||
                    .combine(firebaseRepository.getCharacter(character = character)) { sheets, fire ->
 | 
					                    .combine(skillRepository.skills) { sheets, skills ->
 | 
				
			||||||
                        sheets[character] to fire
 | 
					                        Struct(sheet = sheets[character], skill = skills[character] ?: emptyList())
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    .combine(firebaseRepository.getCharacter(character = character)) { data, fire ->
 | 
				
			||||||
 | 
					                        data.apply { this.fire = fire }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    .collect { data ->
 | 
					                    .collect { data ->
 | 
				
			||||||
                        val (values, fire) = data
 | 
					                        val (character, values, fire) = data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        val skills = values?.map { skill ->
 | 
					                        val skills = values.map { skill ->
 | 
				
			||||||
                            val description = descriptionRepository.find(name = skill.name)
 | 
					                            val description = descriptionRepository.find(name = skill.name)
 | 
				
			||||||
 | 
					                            val modifier = skill.effect?.modifier?.sumOf {
 | 
				
			||||||
 | 
					                                when (it) {
 | 
				
			||||||
 | 
					                                    Property.PROFICIENCY -> character?.proficiency ?: 0
 | 
				
			||||||
 | 
					                                    Property.STRENGTH -> character?.strength?.modifier ?: 0
 | 
				
			||||||
 | 
					                                    Property.DEXTERITY -> character?.dexterity?.modifier ?: 0
 | 
				
			||||||
 | 
					                                    Property.CONSTITUTION -> character?.constitution?.modifier ?: 0
 | 
				
			||||||
 | 
					                                    Property.INTELLIGENCE -> character?.intelligence?.modifier ?: 0
 | 
				
			||||||
 | 
					                                    Property.WISDOM -> character?.wisdom?.modifier ?: 0
 | 
				
			||||||
 | 
					                                    Property.CHARISMA -> character?.charisma?.modifier ?: 0
 | 
				
			||||||
 | 
					                                    else -> 0
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            } ?: 0
 | 
				
			||||||
                            SkillItemUio(
 | 
					                            SkillItemUio(
 | 
				
			||||||
                                label = skill.name,
 | 
					                                label = skill.name,
 | 
				
			||||||
                                translate = description?.original,
 | 
					                                translate = description?.original,
 | 
				
			||||||
| 
						 | 
					@ -60,14 +82,14 @@ class SkillsViewModel @Inject constructor(
 | 
				
			||||||
                                effect = skill.effect?.let {
 | 
					                                effect = skill.effect?.let {
 | 
				
			||||||
                                    SkillItemUio.Dice(
 | 
					                                    SkillItemUio.Dice(
 | 
				
			||||||
                                        icon = it.faces.icon,
 | 
					                                        icon = it.faces.icon,
 | 
				
			||||||
                                        label = "${it.amount}d${it.faces}",
 | 
					                                        label = "${skill.effect.amount}d${skill.effect.faces}${if (modifier > 0) "+$modifier" else ""}",
 | 
				
			||||||
                                    )
 | 
					                                    )
 | 
				
			||||||
                                },
 | 
					                                },
 | 
				
			||||||
                                value = fire.skills[skill.name],
 | 
					                                value = fire?.skills?.get(skill.name) ?: 0,
 | 
				
			||||||
                                max = skill.amount,
 | 
					                                max = skill.amount,
 | 
				
			||||||
                                haveDetail = description?.description != null,
 | 
					                                haveDetail = description?.description != null,
 | 
				
			||||||
                            )
 | 
					                            )
 | 
				
			||||||
                        } ?: emptyList()
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        withContext(Dispatchers.Main) {
 | 
					                        withContext(Dispatchers.Main) {
 | 
				
			||||||
                            _skills.value = skills
 | 
					                            _skills.value = skills
 | 
				
			||||||
| 
						 | 
					@ -116,4 +138,10 @@ class SkillsViewModel @Inject constructor(
 | 
				
			||||||
        firebaseRepository.setSkill(character = character, name = id, value = value)
 | 
					        firebaseRepository.setSkill(character = character, name = id, value = value)
 | 
				
			||||||
        hideSkillEditDialog()
 | 
					        hideSkillEditDialog()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    data class Struct(
 | 
				
			||||||
 | 
					        val sheet: CharacterSheet?,
 | 
				
			||||||
 | 
					        val skill: List<Skill>,
 | 
				
			||||||
 | 
					        var fire: CharacterSheetFire? = null
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,7 @@ package com.pixelized.rplexicon.ui.screens.character.pages.alteration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import android.content.res.Configuration.UI_MODE_NIGHT_NO
 | 
					import android.content.res.Configuration.UI_MODE_NIGHT_NO
 | 
				
			||||||
import android.content.res.Configuration.UI_MODE_NIGHT_YES
 | 
					import android.content.res.Configuration.UI_MODE_NIGHT_YES
 | 
				
			||||||
 | 
					import androidx.compose.foundation.ExperimentalFoundationApi
 | 
				
			||||||
import androidx.compose.foundation.layout.PaddingValues
 | 
					import androidx.compose.foundation.layout.PaddingValues
 | 
				
			||||||
import androidx.compose.foundation.layout.fillMaxWidth
 | 
					import androidx.compose.foundation.layout.fillMaxWidth
 | 
				
			||||||
import androidx.compose.foundation.lazy.LazyColumn
 | 
					import androidx.compose.foundation.lazy.LazyColumn
 | 
				
			||||||
| 
						 | 
					@ -17,6 +18,7 @@ import androidx.compose.ui.unit.dp
 | 
				
			||||||
import androidx.compose.ui.window.Dialog
 | 
					import androidx.compose.ui.window.Dialog
 | 
				
			||||||
import androidx.compose.ui.window.DialogProperties
 | 
					import androidx.compose.ui.window.DialogProperties
 | 
				
			||||||
import androidx.hilt.navigation.compose.hiltViewModel
 | 
					import androidx.hilt.navigation.compose.hiltViewModel
 | 
				
			||||||
 | 
					import com.pixelized.rplexicon.ui.screens.character.composable.actions.AlterationHeader
 | 
				
			||||||
import com.pixelized.rplexicon.ui.screens.character.composable.actions.AlterationItem
 | 
					import com.pixelized.rplexicon.ui.screens.character.composable.actions.AlterationItem
 | 
				
			||||||
import com.pixelized.rplexicon.ui.screens.character.composable.actions.AlterationItemUio
 | 
					import com.pixelized.rplexicon.ui.screens.character.composable.actions.AlterationItemUio
 | 
				
			||||||
import com.pixelized.rplexicon.ui.screens.rolls.preview.rememberRollAlterations
 | 
					import com.pixelized.rplexicon.ui.screens.rolls.preview.rememberRollAlterations
 | 
				
			||||||
| 
						 | 
					@ -48,6 +50,7 @@ fun AlterationPage(
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@OptIn(ExperimentalFoundationApi::class)
 | 
				
			||||||
@Composable
 | 
					@Composable
 | 
				
			||||||
fun AlterationPageContent(
 | 
					fun AlterationPageContent(
 | 
				
			||||||
    modifier: Modifier = Modifier,
 | 
					    modifier: Modifier = Modifier,
 | 
				
			||||||
| 
						 | 
					@ -59,6 +62,9 @@ fun AlterationPageContent(
 | 
				
			||||||
        modifier = modifier,
 | 
					        modifier = modifier,
 | 
				
			||||||
        contentPadding = PaddingValues(top = 8.dp, bottom = 16.dp),
 | 
					        contentPadding = PaddingValues(top = 8.dp, bottom = 16.dp),
 | 
				
			||||||
    ) {
 | 
					    ) {
 | 
				
			||||||
 | 
					        stickyHeader {
 | 
				
			||||||
 | 
					            AlterationHeader()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        items(items = alterations.value) {
 | 
					        items(items = alterations.value) {
 | 
				
			||||||
            AlterationItem(
 | 
					            AlterationItem(
 | 
				
			||||||
                modifier = Modifier.fillMaxWidth(),
 | 
					                modifier = Modifier.fillMaxWidth(),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -164,7 +164,7 @@ private fun RollOverlayContent(
 | 
				
			||||||
                    Text(
 | 
					                    Text(
 | 
				
			||||||
                        modifier = Modifier.padding(horizontal = 16.dp),
 | 
					                        modifier = Modifier.padding(horizontal = 16.dp),
 | 
				
			||||||
                        style = MaterialTheme.typography.titleMedium,
 | 
					                        style = MaterialTheme.typography.titleMedium,
 | 
				
			||||||
                        text = stringResource(id = R.string.dice_roll_alteraton_action).let {
 | 
					                        text = stringResource(id = R.string.dice_roll_alteration_action).let {
 | 
				
			||||||
                            AnnotatedString(
 | 
					                            AnnotatedString(
 | 
				
			||||||
                                text = it,
 | 
					                                text = it,
 | 
				
			||||||
                                spanStyles = listOf(
 | 
					                                spanStyles = listOf(
 | 
				
			||||||
| 
						 | 
					@ -246,7 +246,7 @@ private fun RollOverlayContent(
 | 
				
			||||||
                            TextButton(onClick = onMenu) {
 | 
					                            TextButton(onClick = onMenu) {
 | 
				
			||||||
                                Text(
 | 
					                                Text(
 | 
				
			||||||
                                    modifier = Modifier.padding(horizontal = 8.dp),
 | 
					                                    modifier = Modifier.padding(horizontal = 8.dp),
 | 
				
			||||||
                                    text = stringResource(id = R.string.dice_roll_alteraton_action),
 | 
					                                    text = stringResource(id = R.string.dice_roll_alteration_action),
 | 
				
			||||||
                                )
 | 
					                                )
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,6 +3,7 @@ package com.pixelized.rplexicon.ui.screens.rolls.factory
 | 
				
			||||||
import com.pixelized.rplexicon.R
 | 
					import com.pixelized.rplexicon.R
 | 
				
			||||||
import com.pixelized.rplexicon.model.DiceThrow
 | 
					import com.pixelized.rplexicon.model.DiceThrow
 | 
				
			||||||
import com.pixelized.rplexicon.repository.data.ActionRepository
 | 
					import com.pixelized.rplexicon.repository.data.ActionRepository
 | 
				
			||||||
 | 
					import com.pixelized.rplexicon.repository.data.SkillRepository
 | 
				
			||||||
import com.pixelized.rplexicon.repository.data.SpellRepository
 | 
					import com.pixelized.rplexicon.repository.data.SpellRepository
 | 
				
			||||||
import com.pixelized.rplexicon.ui.screens.rolls.composable.RollDiceUio
 | 
					import com.pixelized.rplexicon.ui.screens.rolls.composable.RollDiceUio
 | 
				
			||||||
import com.pixelized.rplexicon.utilitary.extentions.icon
 | 
					import com.pixelized.rplexicon.utilitary.extentions.icon
 | 
				
			||||||
| 
						 | 
					@ -10,6 +11,7 @@ import javax.inject.Inject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DiceFactory @Inject constructor(
 | 
					class DiceFactory @Inject constructor(
 | 
				
			||||||
    private val actionRepository: ActionRepository,
 | 
					    private val actionRepository: ActionRepository,
 | 
				
			||||||
 | 
					    private val skillRepository: SkillRepository,
 | 
				
			||||||
    private val spellRepository: SpellRepository,
 | 
					    private val spellRepository: SpellRepository,
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
    fun convertDiceThrow(diceThrow: DiceThrow) = when (diceThrow) {
 | 
					    fun convertDiceThrow(diceThrow: DiceThrow) = when (diceThrow) {
 | 
				
			||||||
| 
						 | 
					@ -27,6 +29,13 @@ class DiceFactory @Inject constructor(
 | 
				
			||||||
            RollDiceUio(icon = it)
 | 
					            RollDiceUio(icon = it)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        is DiceThrow.Skill -> skillRepository.find(
 | 
				
			||||||
 | 
					            character = diceThrow.character,
 | 
				
			||||||
 | 
					            skill = diceThrow.skill
 | 
				
			||||||
 | 
					        )?.effect?.faces?.icon?.let {
 | 
				
			||||||
 | 
					            RollDiceUio(icon = it)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        is DiceThrow.SpellDamage -> spellRepository.find(
 | 
					        is DiceThrow.SpellDamage -> spellRepository.find(
 | 
				
			||||||
            character = diceThrow.character,
 | 
					            character = diceThrow.character,
 | 
				
			||||||
            spell = diceThrow.spell
 | 
					            spell = diceThrow.spell
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -82,7 +82,8 @@
 | 
				
			||||||
    <string name="character_sheet_title_initiative">Initiative</string>
 | 
					    <string name="character_sheet_title_initiative">Initiative</string>
 | 
				
			||||||
    <string name="character_sheet_title_saving_throws">Jet de sauvegarde</string>
 | 
					    <string name="character_sheet_title_saving_throws">Jet de sauvegarde</string>
 | 
				
			||||||
    <string name="character_sheet_title_proficiencies">Maîtrises</string>
 | 
					    <string name="character_sheet_title_proficiencies">Maîtrises</string>
 | 
				
			||||||
    <string name="character_sheet_title_actions">Actions</string>
 | 
					    <string name="character_sheet_title_skills">Capacités</string>
 | 
				
			||||||
 | 
					    <string name="character_sheet_title_attacks">Attaques</string>
 | 
				
			||||||
    <string name="character_sheet_title_alteration">Altérations</string>
 | 
					    <string name="character_sheet_title_alteration">Altérations</string>
 | 
				
			||||||
    <string name="character_sheet_stat_strength">Force</string>
 | 
					    <string name="character_sheet_stat_strength">Force</string>
 | 
				
			||||||
    <string name="character_sheet_stat_strength_short">FOR</string>
 | 
					    <string name="character_sheet_stat_strength_short">FOR</string>
 | 
				
			||||||
| 
						 | 
					@ -118,8 +119,6 @@
 | 
				
			||||||
    <string name="character_sheet_action_spell_cast">Lancer</string>
 | 
					    <string name="character_sheet_action_spell_cast">Lancer</string>
 | 
				
			||||||
    <string name="character_sheet_action_spell_level_0">Sorts mineurs</string>
 | 
					    <string name="character_sheet_action_spell_level_0">Sorts mineurs</string>
 | 
				
			||||||
    <string name="character_sheet_action_spell_level_X">Sorts de niveau %1$s</string>
 | 
					    <string name="character_sheet_action_spell_level_X">Sorts de niveau %1$s</string>
 | 
				
			||||||
    <string name="character_sheet_skill_title">Capacités</string>
 | 
					 | 
				
			||||||
    <string name="character_sheet_attack_title">Attaques</string>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <string name="dice_roll_mastery_proficiency">Maîtrise \"%1$s\" </string>
 | 
					    <string name="dice_roll_mastery_proficiency">Maîtrise \"%1$s\" </string>
 | 
				
			||||||
    <string name="dice_roll_mastery_expertise">Expertise \"%1$s\" </string>
 | 
					    <string name="dice_roll_mastery_expertise">Expertise \"%1$s\" </string>
 | 
				
			||||||
| 
						 | 
					@ -135,7 +134,7 @@
 | 
				
			||||||
    <string name="dice_roll_spell_hit_title">Jet de sort : \"%1$s"</string>
 | 
					    <string name="dice_roll_spell_hit_title">Jet de sort : \"%1$s"</string>
 | 
				
			||||||
    <string name="dice_roll_spell_damage_title">Jet de dommage : \"%1$s\"</string>
 | 
					    <string name="dice_roll_spell_damage_title">Jet de dommage : \"%1$s\"</string>
 | 
				
			||||||
    <string name="dice_roll_critical_label">Critique</string>
 | 
					    <string name="dice_roll_critical_label">Critique</string>
 | 
				
			||||||
    <string name="dice_roll_alteraton_action">Alterations</string>
 | 
					    <string name="dice_roll_alteration_action">Alterations</string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <string name="dice_roll_saving_throw_title">Jet de sauvegarde : %1$s</string>
 | 
					    <string name="dice_roll_saving_throw_title">Jet de sauvegarde : %1$s</string>
 | 
				
			||||||
    <string name="dice_roll_saving_throw_detail">Sauvegarde de \"%1$s\"</string>
 | 
					    <string name="dice_roll_saving_throw_detail">Sauvegarde de \"%1$s\"</string>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -82,7 +82,8 @@
 | 
				
			||||||
    <string name="character_sheet_title_initiative">Initiative</string>
 | 
					    <string name="character_sheet_title_initiative">Initiative</string>
 | 
				
			||||||
    <string name="character_sheet_title_saving_throws">Saving Throws</string>
 | 
					    <string name="character_sheet_title_saving_throws">Saving Throws</string>
 | 
				
			||||||
    <string name="character_sheet_title_proficiencies">Proficiencies</string>
 | 
					    <string name="character_sheet_title_proficiencies">Proficiencies</string>
 | 
				
			||||||
    <string name="character_sheet_title_actions">Actions</string>
 | 
					    <string name="character_sheet_title_attacks">Attacks</string>
 | 
				
			||||||
 | 
					    <string name="character_sheet_title_skills">Skills</string>
 | 
				
			||||||
    <string name="character_sheet_title_alteration">Alterations</string>
 | 
					    <string name="character_sheet_title_alteration">Alterations</string>
 | 
				
			||||||
    <string name="character_sheet_stat_strength">Strength</string>
 | 
					    <string name="character_sheet_stat_strength">Strength</string>
 | 
				
			||||||
    <string name="character_sheet_stat_strength_short">STR</string>
 | 
					    <string name="character_sheet_stat_strength_short">STR</string>
 | 
				
			||||||
| 
						 | 
					@ -118,8 +119,6 @@
 | 
				
			||||||
    <string name="character_sheet_action_spell_cast">Cast</string>
 | 
					    <string name="character_sheet_action_spell_cast">Cast</string>
 | 
				
			||||||
    <string name="character_sheet_action_spell_level_0">Cantrip</string>
 | 
					    <string name="character_sheet_action_spell_level_0">Cantrip</string>
 | 
				
			||||||
    <string name="character_sheet_action_spell_level_X">Spell level %1$s</string>
 | 
					    <string name="character_sheet_action_spell_level_X">Spell level %1$s</string>
 | 
				
			||||||
    <string name="character_sheet_skill_title">Skills</string>
 | 
					 | 
				
			||||||
    <string name="character_sheet_attack_title">Attacks</string>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <string name="dice_roll_mastery_proficiency">%1$s proficiency</string>
 | 
					    <string name="dice_roll_mastery_proficiency">%1$s proficiency</string>
 | 
				
			||||||
    <string name="dice_roll_mastery_expertise">%1$s expertise</string>
 | 
					    <string name="dice_roll_mastery_expertise">%1$s expertise</string>
 | 
				
			||||||
| 
						 | 
					@ -135,7 +134,7 @@
 | 
				
			||||||
    <string name="dice_roll_spell_hit_title">%1$s hit</string>
 | 
					    <string name="dice_roll_spell_hit_title">%1$s hit</string>
 | 
				
			||||||
    <string name="dice_roll_spell_damage_title">%1$s damage</string>
 | 
					    <string name="dice_roll_spell_damage_title">%1$s damage</string>
 | 
				
			||||||
    <string name="dice_roll_critical_label">Critical</string>
 | 
					    <string name="dice_roll_critical_label">Critical</string>
 | 
				
			||||||
    <string name="dice_roll_alteraton_action">Altérations</string>
 | 
					    <string name="dice_roll_alteration_action">Alterations</string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <string name="dice_roll_saving_throw_title">%1$s saving throw</string>
 | 
					    <string name="dice_roll_saving_throw_title">%1$s saving throw</string>
 | 
				
			||||||
    <string name="dice_roll_saving_throw_detail">%1$s save</string>
 | 
					    <string name="dice_roll_saving_throw_detail">%1$s save</string>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue