diff --git a/app/src/main/java/com/pixelized/rplexicon/LauncherViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/LauncherViewModel.kt index 042dcea..11af982 100644 --- a/app/src/main/java/com/pixelized/rplexicon/LauncherViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/LauncherViewModel.kt @@ -10,7 +10,6 @@ import com.pixelized.rplexicon.data.repository.character.ActionRepository import com.pixelized.rplexicon.data.repository.character.AlterationRepository import com.pixelized.rplexicon.data.repository.character.CharacterSheetRepository import com.pixelized.rplexicon.data.repository.character.DescriptionRepository -import com.pixelized.rplexicon.data.repository.character.EquipmentRepository import com.pixelized.rplexicon.data.repository.character.ItemsRepository import com.pixelized.rplexicon.data.repository.character.SkillRepository import com.pixelized.rplexicon.data.repository.character.SpellRepository @@ -44,7 +43,6 @@ class LauncherViewModel @Inject constructor( skillRepository: SkillRepository, descriptionRepository: DescriptionRepository, itemsRepository: ItemsRepository, - equipmentRepository: EquipmentRepository, removeConRepository: RemoteConfigRepository // Unused but injected to initialize it. ) : ViewModel() { @@ -112,14 +110,6 @@ class LauncherViewModel @Inject constructor( _error.emit(FetchErrorUio.Structure(type = Type.INVENTORY)) } } - val equipment = async { - try { - equipmentRepository.fetchEquipment() - } catch (exception: Exception) { - Log.e(TAG, exception.message, exception) - _error.emit(FetchErrorUio.Structure(type = Type.EQUIPMENT)) - } - } awaitAll(characterSheet) val alteration = async { @@ -156,7 +146,7 @@ class LauncherViewModel @Inject constructor( } awaitAll(order, lexicon, location, quest) - awaitAll(description, inventory, equipment, alteration, action, spell, skill) + awaitAll(description, inventory, alteration, action, spell, skill) withContext(Dispatchers.Main) { isLoading = false diff --git a/app/src/main/java/com/pixelized/rplexicon/data/model/CharacterSheet.kt b/app/src/main/java/com/pixelized/rplexicon/data/model/CharacterSheet.kt index 45472e9..cfed188 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/model/CharacterSheet.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/model/CharacterSheet.kt @@ -5,6 +5,7 @@ import androidx.annotation.StringRes import com.pixelized.rplexicon.R data class CharacterSheet( + val active: Boolean, val name: String, val race: String?, val proficiency: Int, // Bonus de maîtrise @@ -22,7 +23,7 @@ data class CharacterSheet( val spell9: Int?, // level 9 spell slot val dC: Int?, // offensive saving throw. val armorClass: Int, // Classe d'armure - val speed: Int, // Vitesse + val speed: Float, // Vitesse val strength: Int, // Force val dexterity: Int, // Dextérité val constitution: Int, // Constitution diff --git a/app/src/main/java/com/pixelized/rplexicon/data/parser/characterSheet/CharacterSheetParser.kt b/app/src/main/java/com/pixelized/rplexicon/data/parser/characterSheet/CharacterSheetParser.kt index c3d028e..dfaf46c 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/parser/characterSheet/CharacterSheetParser.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/parser/characterSheet/CharacterSheetParser.kt @@ -33,6 +33,7 @@ class CharacterSheetParser @Inject constructor( val name = item.parse(column = NAME) if (name != null) { CharacterSheet( + active = item.parseBool(column = ACTIVE) ?: false, name = name, race = item.parse(column = RACE), proficiency = item.parseInt(column = MASTERY) ?: 2, @@ -50,7 +51,7 @@ class CharacterSheetParser @Inject constructor( spell9 = item.parseInt(column = SPELL_LEVEL_9), dC = item.parseInt(column = DD_SAVE_THROW), armorClass = item.parseInt(column = ARMOR_CLASS) ?: 10, - speed = item.parseInt(column = SPEED) ?: 10, + speed = item.parseFloat(column = SPEED) ?: 10f, strength = item.parseInt(column = STRENGTH) ?: 10, dexterity = item.parseInt(column = DEXTERITY) ?: 10, constitution = item.parseInt(column = CONSTITUTION) ?: 10, @@ -103,6 +104,7 @@ class CharacterSheetParser @Inject constructor( } companion object { + private val ACTIVE = column("Actif") private val NAME = column("Nom") private val RACE = column("Race") private val LEVEL = column("Niveau") @@ -157,6 +159,7 @@ class CharacterSheetParser @Inject constructor( private val ROWS get() = listOf( + ACTIVE, NAME, RACE, LEVEL, diff --git a/app/src/main/java/com/pixelized/rplexicon/data/parser/inventory/EquipmentParser.kt b/app/src/main/java/com/pixelized/rplexicon/data/parser/inventory/EquipmentParser.kt deleted file mode 100644 index 717f3ea..0000000 --- a/app/src/main/java/com/pixelized/rplexicon/data/parser/inventory/EquipmentParser.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.pixelized.rplexicon.data.parser.inventory - -import com.google.api.services.sheets.v4.model.ValueRange -import com.pixelized.rplexicon.data.model.Equipment -import com.pixelized.rplexicon.data.parser.parserScope -import com.pixelized.rplexicon.utilitary.exceptions.IncompatibleSheetStructure -import javax.inject.Inject - -class EquipmentParser @Inject constructor() { - - @Throws(IncompatibleSheetStructure::class) - fun parse(data: ValueRange): Map = parserScope { - lateinit var characters: List - val equipments = hashMapOf() - - data.forEachRowIndexed { index, row -> - when (index) { - // ignore the first column - 0 -> characters = row.drop(1).map { it.toString() } - - else -> row.drop(1).forEachIndexed { column, item -> - val character = characters[column] - equipments.getEquipment(name = character).let { - when (row[0]) { - BACKGROUND -> it.background = item.toItem() - HEAD -> it.head = item.toItem() - FACE -> it.face = item.toItem() - NECK -> it.neck = item.toItem() - SHOULDER -> it.shoulder = item.toItem() - BODY -> it.body = item.toItem() - CHEST -> it.chest = item.toItem() - ARM -> it.arm = item.toItem() - HAND -> it.hand = item.toItem() - RING_1 -> it.ring1 = item.toItem() - RING_2 -> it.ring2 = item.toItem() - WAIST -> it.waist = item.toItem() - FOOT -> it.foot = item.toItem() - MAIN_HAND -> it.mainHand = item.toItem() - OFF_HAND -> it.offHand = item.toItem() - } - } - } - } - } - - return@parserScope characters.associateWith { - equipments.getEquipment(name = it).build() - } - } - - private fun HashMap.getEquipment(name: String) = - this.getOrPut(name) { Equipment.Builder() } - - companion object { - private const val BACKGROUND = "Silhouette" - private const val HEAD = "Tête" - private const val FACE = "Visage" - private const val NECK = "Gorge" - private const val SHOULDER = "Épaules" - private const val BODY = "Corp" - private const val CHEST = "Torse" - private const val ARM = "Bras" - private const val HAND = "Mains" - private const val RING_1 = "Anneau 1" - private const val RING_2 = "Anneau 2" - private const val WAIST = "Taille" - private const val FOOT = "Pieds" - private const val MAIN_HAND = "Main droite" - private const val OFF_HAND = "Main gauche" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/data/repository/character/EquipmentRepository.kt b/app/src/main/java/com/pixelized/rplexicon/data/repository/character/EquipmentRepository.kt deleted file mode 100644 index ef0a4db..0000000 --- a/app/src/main/java/com/pixelized/rplexicon/data/repository/character/EquipmentRepository.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.pixelized.rplexicon.data.repository.character - -import com.pixelized.rplexicon.data.model.Equipment -import com.pixelized.rplexicon.data.parser.inventory.EquipmentParser -import com.pixelized.rplexicon.data.repository.CharacterBinder -import com.pixelized.rplexicon.data.repository.GoogleSheetServiceRepository -import com.pixelized.rplexicon.utilitary.Update -import com.pixelized.rplexicon.utilitary.exceptions.IncompatibleSheetStructure -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class EquipmentRepository @Inject constructor( - private val googleRepository: GoogleSheetServiceRepository, - private val equipmentParser: EquipmentParser, -) { - private val _data = MutableStateFlow>(emptyMap()) - val data: StateFlow> get() = _data - - var lastSuccessFullUpdate: Update = Update.INITIAL - private set - - fun find(name: String?): Equipment? = _data.value[name] - - @Throws(IncompatibleSheetStructure::class, Exception::class) - suspend fun fetchEquipment() { - googleRepository.fetch { sheet -> - val request = sheet.get(CharacterBinder.ID, CharacterBinder.EQUIPMENT) - val data = equipmentParser.parse(data = request.execute()) - _data.tryEmit(data) - lastSuccessFullUpdate = Update.currentTime() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/authentication/AuthenticationScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/authentication/AuthenticationScreen.kt index 8ebb5e7..0fe3b71 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/authentication/AuthenticationScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/authentication/AuthenticationScreen.kt @@ -320,7 +320,10 @@ private fun rememberPortrait(): List = rememberSaveable { listOf( R.drawable.im_brulkhai, R.drawable.im_leandre, - R.drawable.im_nelia, +// listOf( +// R.drawable.im_nelia, + R.drawable.im_nam, +// ).shuffled().first(), R.drawable.im_tigrane, R.drawable.im_unathana, ).shuffled() diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetScreen.kt index 91a6d69..8e70cee 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetScreen.kt @@ -105,10 +105,7 @@ enum class CharacterTabUio(@StringRes val label: Int) { Proficiency(R.string.character_sheet_tab_proficiency), } -@OptIn( - ExperimentalMaterialApi::class, - ExperimentalFoundationApi::class, -) +@OptIn(ExperimentalMaterialApi::class) @Composable fun CharacterSheetScreen( viewModel: CharacterSheetViewModel = hiltViewModel(), @@ -490,7 +487,6 @@ private fun CharacterScreenPreview( } } -@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterialApi::class) @Composable private fun BackHandler( sheetState: ModalBottomSheetState, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetViewModel.kt index 00561b0..769eb20 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetViewModel.kt @@ -10,7 +10,6 @@ import com.pixelized.rplexicon.data.repository.character.ActionRepository import com.pixelized.rplexicon.data.repository.character.AlterationRepository import com.pixelized.rplexicon.data.repository.character.CharacterSheetRepository import com.pixelized.rplexicon.data.repository.character.DescriptionRepository -import com.pixelized.rplexicon.data.repository.character.EquipmentRepository import com.pixelized.rplexicon.data.repository.character.ItemsRepository import com.pixelized.rplexicon.data.repository.character.SkillRepository import com.pixelized.rplexicon.data.repository.character.SpellRepository @@ -33,7 +32,6 @@ class CharacterSheetViewModel @Inject constructor( private val descriptionRepository: DescriptionRepository, private val alterationRepository: AlterationRepository, private val itemsRepository: ItemsRepository, - private val equipmentRepository: EquipmentRepository, private val actionRepository: ActionRepository, private val spellRepository: SpellRepository, private val skillRepository: SkillRepository, @@ -93,16 +91,6 @@ class CharacterSheetViewModel @Inject constructor( } } } - val equipment = async { - if (force || equipmentRepository.lastSuccessFullUpdate.shouldUpdate()) { - try { - equipmentRepository.fetchEquipment() - } catch (exception: Exception) { - Log.e(TAG, exception.message, exception) - _error.emit(FetchErrorUio.Structure(type = Type.EQUIPMENT)) - } - } - } awaitAll(characters) val alterations = async { if (force || alterationRepository.lastSuccessFullUpdate.shouldUpdate()) { @@ -144,7 +132,7 @@ class CharacterSheetViewModel @Inject constructor( } } } - awaitAll(description, alterations, inventory, equipment, actions, spells, skills) + awaitAll(description, alterations, inventory, actions, spells, skills) _isLoading.value = false } diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/CharacterSheetUioFactory.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/CharacterSheetUioFactory.kt index 6d2cb7a..d48640b 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/CharacterSheetUioFactory.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/CharacterSheetUioFactory.kt @@ -281,7 +281,7 @@ class CharacterSheetUioFactory @Inject constructor() { ), speed = LabelPointUio( label = R.string.character_sheet_title_speed, - value = "${max(sheet.speed + status[Property.SPEED].sum, 0)}m", + value = "${max(sheet.speed + status[Property.SPEED].sum.toFloat(), 0f)}m", ), masteries = MasteriesUio( martial = sheet.martial, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SpellUioFactory.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SpellUioFactory.kt index 49d592c..23245ff 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SpellUioFactory.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SpellUioFactory.kt @@ -25,6 +25,9 @@ class SpellUioFactory @Inject constructor( val modifier = diceThrow.modifier.sumOf { when (it) { 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.WISDOM -> characterSheet.wisdom.modifier Property.CHARISMA -> characterSheet.charisma.modifier diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/summary/pages/statistic/SummaryFactory.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/summary/pages/statistic/SummaryFactory.kt index 1005ad8..009979a 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/summary/pages/statistic/SummaryFactory.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/summary/pages/statistic/SummaryFactory.kt @@ -146,7 +146,7 @@ class SummaryFactory @Inject constructor( val data = DataStruct() characterSheetRepository.data .combine(activeAlterationRepository.getActiveAlterations()) { sheets, alterations -> - data.sheets = sheets + data.sheets = sheets.filter { entry -> entry.value.active } data.alterations = alterations } .combine(firebaseRepository.getCharacters()) { _, fire -> @@ -216,7 +216,7 @@ class SummaryFactory @Inject constructor( label = (dexterity.modifier + status[Property.INITIATIVE].sum).toLabel() ) val speed = label( - label = "${max(sheet.speed + status[Property.SPEED].sum, 0)}m", + label = "${max(sheet.speed + status[Property.SPEED].sum.toFloat(), 0f)}m", ) val inspiration = proficiency( label = null, diff --git a/app/src/main/res/drawable/im_nam.webp b/app/src/main/res/drawable/im_nam.webp new file mode 100644 index 0000000..b126536 Binary files /dev/null and b/app/src/main/res/drawable/im_nam.webp differ diff --git a/settings.gradle.kts b/settings.gradle.kts index 6cb3e50..c3e15c8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,10 +6,6 @@ pluginManagement { } } -plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version "0.6.0" -} - dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories {