Add local attack / skill / spell / alteration icons

This commit is contained in:
Andres Gomez, Thomas (ITDV RL) 2024-06-05 15:16:52 +02:00
parent 1b97560dce
commit ddfc9a4cc6
177 changed files with 283 additions and 34 deletions

View file

@ -16,7 +16,7 @@
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:supportsRtl="false"
android:theme="@style/Theme.Lexicon.NoActionBar"
tools:targetApi="31">

View file

@ -20,7 +20,7 @@ class MainApplication : Application(), ImageLoaderFactory {
.diskCache {
DiskCache.Builder()
.directory(applicationContext.cacheDir.resolve("image_cache"))
.maxSizeBytes(size = 150.Mo)
.maxSizeBytes(size = 250.Mo)
.build()
}
.crossfade(true)

View file

@ -14,7 +14,7 @@ import com.pixelized.rplexicon.ui.theme.typography.LexiconTypography
import com.pixelized.rplexicon.utilitary.annotate
import com.pixelized.rplexicon.utilitary.dropCapRegex
import com.pixelized.rplexicon.utilitary.extentions.local.label
import com.pixelized.rplexicon.utilitary.extentions.prefix
import com.pixelized.rplexicon.utilitary.extentions.string.prefix
import com.pixelized.rplexicon.utilitary.extractSentenceRegex
import com.pixelized.rplexicon.utilitary.extractWordRegex
import com.pixelized.rplexicon.utilitary.highlightRegex

View file

@ -12,7 +12,6 @@ data class Attack(
val damage: Throw?,
val script: Script?,
val icon: Uri?,
val alterations: List<String>,
) {
enum class Type(val key: String) {
PHYSICAL_MELEE_ATTACK("Mêlée"),

View file

@ -38,7 +38,6 @@ class AttackParser @Inject constructor(
script = row.parse(column = SCRIPT)?.let { scriptParser.parse(it) },
hit = throwParser.parse(value = row.parse(column = HIT)),
damage = throwParser.parse(value = row.parse(column = DAMAGE)),
alterations = row.parseList(column = ALTERATION),
)
actions
.getOrPut(characterSheet.name) { mutableListOf() }
@ -65,7 +64,6 @@ class AttackParser @Inject constructor(
private val RANGE = column("Portée")
private val HIT = column("Touché")
private val DAMAGE = column("Dommage")
private val ALTERATION = column("Altérations")
private val ICON = column("Icone")
private val SCRIPT = column("Script")
private val COLUMNS
@ -76,7 +74,6 @@ class AttackParser @Inject constructor(
RANGE,
HIT,
DAMAGE,
ALTERATION,
SCRIPT,
ICON
)

View file

@ -1,7 +1,7 @@
package com.pixelized.rplexicon.data.parser
import android.net.Uri
import com.pixelized.rplexicon.utilitary.extentions.toUriOrNull
import com.pixelized.rplexicon.utilitary.extentions.string.toUriOrNull
import javax.inject.Inject
class IllustrationParser @Inject constructor() {

View file

@ -6,7 +6,7 @@ import com.pixelized.rplexicon.data.database.quest.QuestDataDbo
import com.pixelized.rplexicon.data.database.quest.QuestDbo
import com.pixelized.rplexicon.data.model.Quest
import com.pixelized.rplexicon.data.model.QuestEntry
import com.pixelized.rplexicon.utilitary.extentions.toUriOrNull
import com.pixelized.rplexicon.utilitary.extentions.string.toUriOrNull
import javax.inject.Inject
class QuestParser @Inject constructor(

View file

@ -5,7 +5,7 @@ import com.pixelized.rplexicon.data.database.location.LocationDbo
import com.pixelized.rplexicon.data.database.location.WorldDbo
import com.pixelized.rplexicon.data.model.Location
import com.pixelized.rplexicon.data.parser.IllustrationParser
import com.pixelized.rplexicon.utilitary.extentions.toUriOrNull
import com.pixelized.rplexicon.utilitary.extentions.string.toUriOrNull
import javax.inject.Inject
class LocationParser @Inject constructor(

View file

@ -10,7 +10,7 @@ import androidx.navigation.navArgument
import com.pixelized.rplexicon.ui.navigation.NavigationAnimation
import com.pixelized.rplexicon.ui.navigation.animatedComposable
import com.pixelized.rplexicon.ui.screens.character.CharacterSheetScreen
import com.pixelized.rplexicon.utilitary.extentions.ARG
import com.pixelized.rplexicon.utilitary.extentions.string.ARG
private const val ROUTE = "characterSheet"
private const val CHARACTER_SHEET_NAME = "id"

View file

@ -11,7 +11,7 @@ import androidx.navigation.navArgument
import com.pixelized.rplexicon.ui.navigation.NavigationAnimation
import com.pixelized.rplexicon.ui.navigation.animatedComposable
import com.pixelized.rplexicon.ui.screens.lexicon.detail.LexiconDetailScreen
import com.pixelized.rplexicon.utilitary.extentions.ARG
import com.pixelized.rplexicon.utilitary.extentions.string.ARG
private const val ROUTE = "LexiconDetail"
private const val ARG_ID = "id"

View file

@ -11,7 +11,7 @@ import androidx.navigation.navArgument
import com.pixelized.rplexicon.ui.navigation.NavigationAnimation
import com.pixelized.rplexicon.ui.navigation.animatedComposable
import com.pixelized.rplexicon.ui.screens.search.SearchScreen
import com.pixelized.rplexicon.utilitary.extentions.ARG
import com.pixelized.rplexicon.utilitary.extentions.string.ARG
private const val ROUTE = "search"
private const val ARG_ENABLE_LEXICON = "ARG_ENABLE_LEXICON"

View file

@ -11,7 +11,7 @@ import androidx.navigation.navArgument
import com.pixelized.rplexicon.ui.navigation.NavigationAnimation
import com.pixelized.rplexicon.ui.navigation.animatedComposable
import com.pixelized.rplexicon.ui.screens.location.detail.LocationDetailScreen
import com.pixelized.rplexicon.utilitary.extentions.ARG
import com.pixelized.rplexicon.utilitary.extentions.string.ARG
private const val ROUTE = "LocationDetail"
private const val ARG_ID = "id"

View file

@ -11,7 +11,7 @@ import androidx.navigation.navArgument
import com.pixelized.rplexicon.ui.navigation.NavigationAnimation
import com.pixelized.rplexicon.ui.navigation.animatedComposable
import com.pixelized.rplexicon.ui.screens.quest.detail.QuestDetailScreen
import com.pixelized.rplexicon.utilitary.extentions.ARG
import com.pixelized.rplexicon.utilitary.extentions.string.ARG
private const val ROUTE = "QuestDetail"
private const val ARG_ID = "id"

View file

@ -10,7 +10,7 @@ import androidx.navigation.navArgument
import com.pixelized.rplexicon.ui.navigation.NavigationAnimation
import com.pixelized.rplexicon.ui.navigation.animatedComposable
import com.pixelized.rplexicon.ui.screens.spell.SpellDetailScreen
import com.pixelized.rplexicon.utilitary.extentions.ARG
import com.pixelized.rplexicon.utilitary.extentions.string.ARG
private const val ROUTE = "spellDetail"
private const val ARG_SPELL = "spell"

View file

@ -6,6 +6,7 @@ import com.pixelized.rplexicon.data.model.CharacterSheet
import com.pixelized.rplexicon.data.model.Property
import com.pixelized.rplexicon.data.model.alteration.Alteration
import com.pixelized.rplexicon.ui.screens.character.composable.actions.AttackUio
import com.pixelized.rplexicon.utilitary.extentions.string.attackIcon
import com.pixelized.rplexicon.utilitary.extentions.icon
import com.pixelized.rplexicon.utilitary.extentions.modifier
import com.pixelized.rplexicon.utilitary.extentions.toLabel
@ -74,7 +75,7 @@ class AttackUioFactory @Inject constructor() {
return AttackUio(
id = attack,
icon = attack.icon,
icon = attack.icon ?: attack.title.attackIcon(),
name = attack.title,
type = when (attack.type) {
Attack.Type.PHYSICAL_MELEE_ATTACK -> R.string.attack_type_melee

View file

@ -11,6 +11,7 @@ import com.pixelized.rplexicon.utilitary.extentions.local.base
import com.pixelized.rplexicon.utilitary.extentions.local.primary
import com.pixelized.rplexicon.utilitary.extentions.local.secondary
import com.pixelized.rplexicon.utilitary.extentions.modifier
import com.pixelized.rplexicon.utilitary.extentions.string.skillIcon
import com.pixelized.rplexicon.utilitary.extentions.toLabel
import javax.inject.Inject
@ -44,7 +45,7 @@ class SkillFactoryUioFactory @Inject constructor(
val modifier = effectModifier + effectFlat
SkillItemUio(
icon = skill.icon,
icon = skill.icon ?: skill.name.skillIcon(),
label = skill.name,
translate = description?.original,
rest = skill.rest,

View file

@ -8,6 +8,7 @@ import com.pixelized.rplexicon.data.repository.character.DescriptionRepository
import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellUio
import com.pixelized.rplexicon.utilitary.extentions.icon
import com.pixelized.rplexicon.utilitary.extentions.modifier
import com.pixelized.rplexicon.utilitary.extentions.string.spellIcon
import com.pixelized.rplexicon.utilitary.extentions.toLabel
import javax.inject.Inject
@ -95,7 +96,7 @@ class SpellUioFactory @Inject constructor(
}
}
return SpellUio(
icon = assignedSpell.spell.icon,
icon = assignedSpell.spell.icon ?: assignedSpell.spell.name.spellIcon(),
school = assignedSpell.spell.school,
name = assignedSpell.spell.name,
translated = descriptionRepository.getDescription(name = assignedSpell.spell.name)?.original,

View file

@ -20,6 +20,7 @@ import com.pixelized.rplexicon.ui.screens.character.factory.AttackUioFactory
import com.pixelized.rplexicon.utilitary.extentions.local.toStatus
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@ -50,7 +51,7 @@ class AttacksViewModel @Inject constructor(
.combine(activeAlterationRepository.getActiveAssignedAlterations(character = character)) { _, alterations ->
struct.alterations = alterations.toStatus()
}
.collect {
.collectLatest {
val (sheet, actions, alterations) = struct
if (sheet != null) {
val attacks = actions.map { action ->

View file

@ -28,6 +28,7 @@ import com.pixelized.rplexicon.utilitary.extentions.local.toStatus
import com.pixelized.rplexicon.utilitary.extentions.modifier
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@ -71,7 +72,7 @@ class HeaderViewModel @Inject constructor(
.combine(firebaseRepository.getCharacter(character = character)) { _, fire ->
struct.fire = fire
}
.collect {
.collectLatest {
val (sheet, status, fire) = struct
if (sheet != null) {
val headerCategories = SheetHeaderData(
@ -99,7 +100,9 @@ class HeaderViewModel @Inject constructor(
fireData.value = headerValues
}
} else {
launch { characterRepository.fetchCharacterSheet() }
launch(context = Dispatchers.Default) {
characterRepository.fetchCharacterSheet()
}
}
}
}

View file

@ -10,6 +10,7 @@ import com.pixelized.rplexicon.data.repository.character.DescriptionRepository
import com.pixelized.rplexicon.data.repository.character.ObjectActionRepository
import com.pixelized.rplexicon.ui.navigation.screens.characterSheetArgument
import com.pixelized.rplexicon.ui.screens.character.composable.actions.ObjectItemUio
import com.pixelized.rplexicon.utilitary.extentions.string.objectIcon
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@ -36,7 +37,7 @@ class ObjectsViewModel @Inject constructor(
val data = objects[character]?.map {
ObjectItemUio(
prefix = it.prefix,
icon = it.icon,
icon = it.icon ?: "${it.prefix ?: ""}${it.name}".objectIcon(),
name = it.name,
original = descriptionRepository.getDescription(name = it.name)?.original,
effect = it.effect,

View file

@ -20,6 +20,7 @@ import com.pixelized.rplexicon.ui.screens.character.composable.actions.SkillItem
import com.pixelized.rplexicon.ui.screens.character.factory.SkillFactoryUioFactory
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@ -58,7 +59,7 @@ class SkillsViewModel @Inject constructor(
.combine(firebaseRepository.getCharacter(character = character)) { _, fire ->
data.fire = fire
}
.collect {
.collectLatest {
val (character, fire, values) = data
// Filter out passive skills, theses are display in the Proficiency Page.
val skills = skillFactory.convert(

View file

@ -31,6 +31,7 @@ import com.pixelized.rplexicon.utilitary.extentions.modifier
import com.pixelized.rplexicon.utilitary.extentions.signLabel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@ -71,7 +72,7 @@ class SpellsViewModel @Inject constructor(
characterFire = fire
struct.also { it.fire = fire }
}
.collect { data ->
.collectLatest { data ->
val spells = spellBookUseCase.toSpells(
character = data.sheets[characterName],
fire = data.fire,

View file

@ -23,6 +23,7 @@ import com.pixelized.rplexicon.ui.screens.rolls.factory.AlterationFactory
import com.pixelized.rplexicon.utilitary.extentions.context
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@ -62,7 +63,7 @@ class AlterationViewModel @Inject constructor(
.combine(activeAlterationRepository.getActiveAssignedAlterations(character)) { _, actives ->
data.actives = actives.associate { it.name to true }
}
.collect {
.collectLatest {
val (sheet, descriptions, alterations, actives) = data
val uio = alterations
.groupBy { alteration -> alteration.source }

View file

@ -62,7 +62,7 @@ import com.pixelized.rplexicon.utilitary.annotate
import com.pixelized.rplexicon.utilitary.dropCapRegex
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.modifier.scrollOffset
import com.pixelized.rplexicon.utilitary.extentions.searchCriterion
import com.pixelized.rplexicon.utilitary.extentions.string.searchCriterion
import com.pixelized.rplexicon.utilitary.highlightRegex
import com.pixelized.rplexicon.utilitary.styleWith

View file

@ -90,7 +90,7 @@ import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.dropCapRegex
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.modifier.scrollOffset
import com.pixelized.rplexicon.utilitary.extentions.searchCriterion
import com.pixelized.rplexicon.utilitary.extentions.string.searchCriterion
import com.pixelized.rplexicon.utilitary.highlightRegex
import com.pixelized.rplexicon.utilitary.styleWith
import kotlinx.coroutines.CoroutineScope

View file

@ -68,7 +68,7 @@ import com.pixelized.rplexicon.utilitary.annotate
import com.pixelized.rplexicon.utilitary.dropCapRegex
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.modifier.scrollOffset
import com.pixelized.rplexicon.utilitary.extentions.searchCriterion
import com.pixelized.rplexicon.utilitary.extentions.string.searchCriterion
import com.pixelized.rplexicon.utilitary.highlightRegex
import com.pixelized.rplexicon.utilitary.styleWith

View file

@ -9,6 +9,7 @@ import com.pixelized.rplexicon.data.repository.character.AlterationRepository
import com.pixelized.rplexicon.data.repository.character.SkillRepository
import com.pixelized.rplexicon.data.repository.character.SpellRepository
import com.pixelized.rplexicon.ui.screens.character.composable.actions.AlterationItemUio
import com.pixelized.rplexicon.utilitary.extentions.string.alterationIcon
import kotlinx.coroutines.flow.firstOrNull
import javax.inject.Inject
@ -25,7 +26,7 @@ class AlterationFactory @Inject constructor(
): List<AlterationItemUio> {
return alterations.map {
AlterationItemUio(
icon = it.icon,
icon = it.icon ?: it.name.alterationIcon(),
label = it.name,
source = it.source,
subLabel = description[it.name]?.original,

View file

@ -26,7 +26,7 @@ import com.pixelized.rplexicon.ui.composable.form.TextFieldUio
import com.pixelized.rplexicon.ui.navigation.screens.searchArgument
import com.pixelized.rplexicon.ui.screens.search.item.SearchItemUio
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.searchCriterion
import com.pixelized.rplexicon.utilitary.extentions.string.searchCriterion
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job

View file

@ -51,7 +51,7 @@ import com.pixelized.rplexicon.utilitary.annotate
import com.pixelized.rplexicon.utilitary.dropCapRegex
import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.modifier.scrollOffset
import com.pixelized.rplexicon.utilitary.extentions.searchCriterion
import com.pixelized.rplexicon.utilitary.extentions.string.searchCriterion
import com.pixelized.rplexicon.utilitary.highlightRegex
import com.pixelized.rplexicon.utilitary.styleWith

View file

@ -17,6 +17,7 @@ import com.pixelized.rplexicon.utilitary.extentions.context
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@ -43,7 +44,7 @@ class StatisticViewModel @Inject constructor(
fun showDetail(dice: ClassHeaderSummaryUio.Dice) {
detailJob?.cancel()
detailJob = viewModelScope.launch(Dispatchers.IO) {
firebaseRepository.getThrows().collect {
firebaseRepository.getThrows().collectLatest {
val card = it.details[dice.characterName]?.let { throws ->
throwCardFactory.convert(throws = throws)
}

View file

@ -0,0 +1,239 @@
package com.pixelized.rplexicon.utilitary.extentions.string
import android.net.Uri
import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.utilitary.extentions.uri
fun String.attackIcon(): Uri? {
return ResourcesCache.attacks[this]?.uri?.toUriOrNull()
}
fun String.objectIcon(): Uri? {
return ResourcesCache.objects[this]?.uri?.toUriOrNull()
}
fun String.alterationIcon(): Uri? {
return ResourcesCache.alterations[this]?.uri?.toUriOrNull()
}
fun String.skillIcon(): Uri? {
return ResourcesCache.skills[this]?.uri?.toUriOrNull()
}
fun String.spellIcon(): Uri? {
return ResourcesCache.spells[this]?.uri?.toUriOrNull()
}
private object ResourcesCache {
val alterations = hashMapOf(
"Arme enflammée" to R.drawable.icbg_flaming_blade,
"Critique" to R.drawable.icbg_frenzied_strike,
"Esquiver" to R.drawable.icbg_uncanny_dodge,
"Aspect de la bête" to R.drawable.icbg_aspect_of_the_beast_bear,
"Attaque téméraire" to R.drawable.icbg_reckless_attack,
"Défense sans armure" to R.drawable.icbg_unarmoured_defence_barbarian,
"Instinct sauvage" to R.drawable.icbg_feral_instinct,
"Rage" to R.drawable.icbg_rage_bear_heart,
"Déplacement rapide" to R.drawable.icbg_fast_movement,
"Sens du danger" to R.drawable.icbg_danger_sense,
"Attaques sauvages" to R.drawable.icbg_savage_attacks,
"Dé de supériorité - d6" to R.drawable.icbg_generic_control,
"Dé de supériorité - d8" to R.drawable.icbg_generic_control,
"Inspiration bardique" to R.drawable.icbg_bardic_inspiration,
"Touche à tout" to R.drawable.icbg_jack_of_all_trades,
"Aide" to R.drawable.icbg_aid,
"Assistance" to R.drawable.icbg_guidance,
"Bénédiction" to R.drawable.icbg_bless,
"Discours motivant" to R.drawable.icbg_heroism,
"Frappes épouvantables" to R.drawable.icbg_bolt_of_celestial_light,
"Style de combat: Archerie" to R.drawable.icbg_brace_ranged,
"Volonté astucieuse" to R.drawable.icbg_cutting_words_passive_feature,
"Frappe du zéphyr" to R.drawable.icbg_step_of_the_wind_dash,
"Marque du chasseur" to R.drawable.icbg_hunters_mark,
"Arme magique" to R.drawable.icbg_magic_weapon,
"Passage sans trace" to R.drawable.icbg_pass_without_trace,
"Tireur d'élite" to R.drawable.icbg_crossbow_expert_wounding,
"Forme sauvage : Loup" to R.drawable.icbg_wild_shape_wolf,
"Odorat et ouïe aiguisés" to R.drawable.icbg_wild_shape_wolf,
"Tactique de groupe" to R.drawable.icbg_pack_tactics,
"Forme sauvage : Chat" to R.drawable.icbg_wild_shape_cat,
"Ouïe aiguisés" to R.drawable.icbg_wild_shape_cat,
"Dague" to R.drawable.icbg_dagger_unfaded,
"Hache de guerre en argent" to R.drawable.icbg_battleaxe_plus_one_unfaded,
"Bouclier" to R.drawable.icbg_studded_shield_unfaded,
"Cape de protection" to R.drawable.icbg_cloak_of_protection_unfaded,
"Armure d'écailles" to R.drawable.icbg_scale_mail_unfaded,
"Armure de cuir" to R.drawable.icbg_leather_armour_rogue_unfaded,
"Avantage" to R.drawable.ic_advantage,
"Désavantage" to R.drawable.ic_disadvantage,
"Emphase" to R.drawable.ic_emphase,
"Touché par le néant" to R.drawable.icbg_partial_ceremorphosis,
"Amateurisme retrouvé" to R.drawable.icbg_iron_mind,
"Morsure de vampire" to R.drawable.icbg_bite,
"Abri (partiel)" to R.drawable.icbg_patient_defence,
"Abri (important)" to R.drawable.icbg_multiattack_defense,
"Abri (total)" to R.drawable.icbg_protection_from_missiles,
)
val attacks = hashMapOf(
"Hache de guerre en argent" to R.drawable.icbg_reckless_attack,
"Hache de guerre en argent (2 mains)" to R.drawable.icbg_reckless_attack,
"Dague" to R.drawable.icbg_main_hand_attack,
"Masse d'armes" to R.drawable.icbg_main_hand_attack,
"Attaque à mains nues" to R.drawable.icbg_unarmed_strike,
"Arme improvisée" to R.drawable.icbg_improvised_melee_weapon,
"Lancé de javelot" to R.drawable.icbg_throw_weapon,
"Lancé de dague" to R.drawable.icbg_throw_weapon,
"Masse d'armes" to R.drawable.icbg_main_hand_attack,
"Arme improvisée" to R.drawable.icbg_improvised_melee_weapon,
"Epée courte argentée" to R.drawable.icbg_main_hand_attack,
"Epée courte (main gauche)" to R.drawable.icbg_off_hand_attack_melee,
"Arc long" to R.drawable.icbg_ranged_attack,
"Arme improvisée" to R.drawable.icbg_improvised_melee_weapon,
"Morsure" to R.drawable.icbg_bite_wolf,
"Griffer" to R.drawable.icbg_claws_cat,
"Dague" to R.drawable.icbg_main_hand_attack,
"Dague (main gauche)" to R.drawable.icbg_off_hand_attack_melee,
"Arbalète légère" to R.drawable.icbg_ranged_attack,
"Arme improvisée" to R.drawable.icbg_improvised_melee_weapon,
"Rapière" to R.drawable.icbg_main_hand_attack,
"Épée courte (main gauche)" to R.drawable.icbg_off_hand_attack_melee,
"Arme improvisée" to R.drawable.icbg_improvised_melee_weapon,
"Arbalète légère" to R.drawable.icbg_ranged_attack,
"Arbalète de poing" to R.drawable.icbg_ranged_attack,
"Arbalète de poing (main gauche)" to R.drawable.icbg_off_hand_attack_ranged,
)
val objects = hashMapOf(
"Parchemin de Bénédiction" to R.drawable.icbg_scroll_of_bless_unfaded,
"Parchemin d'Arme spirituelle" to R.drawable.icbg_book_signedtradebisa_unfaded,
"Potion de guérison" to R.drawable.icbg_pot_potion_of_healing_unfaded,
"Eau bénite" to R.drawable.icbg_grn_holy_water_unfaded,
"Baies nourricières" to R.drawable.icbg_food_goodberry_unfaded,
)
val skills = hashMapOf(
"Dé de vie (Barbare)" to R.drawable.icbg_bolstering_magic_boon,
"Dé de vie (Guerrier)" to R.drawable.icbg_bolstering_magic_boon,
"Dé de vie (Rodeur)" to R.drawable.icbg_bolstering_magic_boon,
"Dé de vie (Druide)" to R.drawable.icbg_bolstering_magic_boon,
"Dé de vie" to R.drawable.icbg_bolstering_magic_boon,
"Inspiration" to R.drawable.icbg_indomitable,
"Touché par le néant" to R.drawable.icbg_partial_ceremorphosis,
"C'était inévitable" to R.drawable.icbg_ancient_grudges,
"Rage" to R.drawable.icbg_rage_bear_heart,
"Endurance implacable" to R.drawable.icbg_relentless_endurance,
"Vision dans le noir (Orc)" to R.drawable.icbg_darkvision,
"Menaçant" to R.drawable.icbg_intimidating_presence,
"Attaques sauvages" to R.drawable.icbg_savage_attacks,
"Défense sans armure" to R.drawable.icbg_unarmoured_defence_barbarian,
"Sens du danger" to R.drawable.icbg_danger_sense,
"Second souffle" to R.drawable.icbg_second_wind,
"Technique supérieur" to R.drawable.icbg_wild_magic_teleport_activate_barbarian,
"Dé de supériorité - d6" to R.drawable.icbg_generic_control,
"Croc-en-jambe" to R.drawable.icbg_trip_attack_melee,
"Conduit divin" to R.drawable.icbg_divine_intervention_sunder_the_heretical,
"Illumination protectrice" to R.drawable.icbg_warding_bond_icon,
"Renvoi des morts-vivants" to R.drawable.icbg_turn_undead,
"Radiance de l'aube" to R.drawable.icbg_break_of_dawn,
"Forme sauvage" to R.drawable.icbg_wild_shape,
"Ennemi juré" to R.drawable.icbg_mortal_reminder,
"Explorateur né" to R.drawable.icbg_forest,
"Ascendance féerique" to R.drawable.icbg_draconic_ancestry_copper_acid,
"Cachette naturelle" to R.drawable.icbg_naturally_stealthy,
"Vigilance primitive (variante)" to R.drawable.icbg_bestial_fury,
"Vision dans le noir (Elfe)" to R.drawable.icbg_darkvision,
"Transe" to R.drawable.icbg_focused_conjuration,
"Attaque supplémentaire" to R.drawable.icbg_extra_attack,
"Apanage de la Noblesse" to R.drawable.icbg_natures_ward,
"Druidique" to R.drawable.icbg_class_druid_badge,
"Appel de familier" to R.drawable.icbg_find_familiar_cat,
"Détection de la magie" to R.drawable.icbg_generic_psychic,
"Vision dans le noir (Tieffelin)" to R.drawable.icbg_darkvision,
"Résistance infernale." to R.drawable.icbg_hellish_resistance,
"Ascendance infernale" to R.drawable.icbg_draconic_ancestry_brass_fire,
"Décharge déchirante" to R.drawable.icbg_agonising_blast,
"Vision occulte" to R.drawable.icbg_generic_psychic,
"Sombre présage" to R.drawable.icbg_hex_charisma,
"Malédiction" to R.drawable.icbg_hex_charisma,
"Ténèbres" to R.drawable.icbg_darkvision_spell,
"Représailles infernales" to R.drawable.icbg_hellish_rebuke,
"Inspiration" to R.drawable.icbg_indomitable,
"Inspiration bardique" to R.drawable.icbg_bardic_inspiration,
"Représentation envoûtante" to R.drawable.icbg_psionic_suggestion_hush,
"Apparence inspirante" to R.drawable.icbg_magic_initiate_bard,
"Chant reposant" to R.drawable.icbg_song_of_rest,
"Fléau" to R.drawable.icbg_bane_spell,
"Foulée brumeuse" to R.drawable.icbg_misty_step,
"Amateurisme retrouvé" to R.drawable.icbg_iron_mind,
"Vision dans le noir (Elfe)" to R.drawable.icbg_darkvision,
"Ascendance féerique" to R.drawable.icbg_draconic_ancestry_copper_acid,
"Source d'inspiration" to R.drawable.icbg_bardic_defence,
"Touche à tout" to R.drawable.icbg_jack_of_all_trades,
)
val spells = hashMapOf(
"Aide" to R.drawable.icbg_aid,
"Alarme" to R.drawable.icbg_command_halt,
"Appel de familier" to R.drawable.icbg_find_familiar_cat,
"Arme spirituelle" to R.drawable.icbg_spiritual_weapon_maul,
"Armure d'Agathys" to R.drawable.icbg_armour_of_agathys,
"Assistance" to R.drawable.icbg_guidance,
"Bénédiction" to R.drawable.icbg_bless,
"Charme-personne" to R.drawable.icbg_charm_person,
"Communication avec les animaux" to R.drawable.icbg_speak_with_animals,
"Contact glacial" to R.drawable.icbg_bone_chill,
"Décharge occulte" to R.drawable.icbg_eldritch_blast,
"Détection de la magie" to R.drawable.icbg_generic_psychic,
"Espièglerie de Nathair" to R.drawable.icbg_tashas_hideous_laughter,
"Esprits gardiens" to R.drawable.icbg_spirit_guardians,
"Flamme sacrée" to R.drawable.icbg_sacred_flame,
"Fléau" to R.drawable.icbg_bane_spell,
"Foulée brumeuse" to R.drawable.icbg_misty_step,
"Frappe du zéphyr" to R.drawable.icbg_step_of_the_wind_dash,
"Illusion mineure" to R.drawable.icbg_minor_illusion,
"Image silencieuse" to R.drawable.icbg_blink,
"Immobilisation de personne" to R.drawable.icbg_hold_person,
"Injonction" to R.drawable.icbg_command_flee,
"Invisibilité" to R.drawable.icbg_invisibility,
"Lueurs féeriques" to R.drawable.icbg_faerie_fire,
"Lumière" to R.drawable.icbg_light,
"Main de mage" to R.drawable.icbg_mage_hand,
"Mains brûlantes" to R.drawable.icbg_burning_hands,
"Marque du chasseur" to R.drawable.icbg_hunters_mark,
"Message" to R.drawable.icbg_levitate,
"Moquerie cruelle" to R.drawable.icbg_vicious_mockery,
"Nuée de dagues" to R.drawable.icbg_cloud_of_daggers,
"Prière de guérison" to R.drawable.icbg_prayer_of_healing,
"Rayon ardent" to R.drawable.icbg_scorching_ray,
"Restauration partielle" to R.drawable.icbg_lesser_restoration,
"Sanctuaire" to R.drawable.icbg_sanctuary,
"Sens animal" to R.drawable.icbg_animal_friendship,
"Silence" to R.drawable.icbg_silence,
"Soins" to R.drawable.icbg_cure_wounds,
"Sommeil" to R.drawable.icbg_sleep,
"Sphère de feu" to R.drawable.icbg_flaming_sphere,
"Stabilisation" to R.drawable.icbg_help,
"Suggestion" to R.drawable.icbg_command_approach,
"Thaumaturgie" to R.drawable.icbg_thaumaturgy,
"Vague tonnante" to R.drawable.icbg_thunderwave,
"Passage sans trace" to R.drawable.icbg_pass_without_trace,
"Croissance d'épines" to R.drawable.icbg_spike_growth,
"Arme magique" to R.drawable.icbg_magic_weapon,
"Baies nourricières" to R.drawable.icbg_goodberry,
"Frappe piègeuse" to R.drawable.icbg_ensnaring_strike_ranged,
"Petite hutte de Léomund" to R.drawable.icbg_globe_of_invulnerability,
"Communication avec les plantes" to R.drawable.icbg_plant_growth,
"Boule de feu" to R.drawable.icbg_fireball,
"Lumière du jour" to R.drawable.icbg_daylight_sphere,
"Aura de vitalité" to R.drawable.icbg_healing_radiance,
"Malédiction" to R.drawable.icbg_hex_charisma,
"Toucher du vampire" to R.drawable.icbg_vampiric_touch,
"Amis" to R.drawable.icbg_friends,
"Discours motivant" to R.drawable.icbg_heroism,
"Ténèbres" to R.drawable.icbg_darkvision_spell,
"Représailles infernales" to R.drawable.icbg_hellish_rebuke,
"Mot de guérison" to R.drawable.icbg_healing_word,
"Façonnage de l'eau" to R.drawable.icbg_create_water,
)
}

View file

@ -1,4 +1,4 @@
package com.pixelized.rplexicon.utilitary.extentions
package com.pixelized.rplexicon.utilitary.extentions.string
import android.net.Uri
import androidx.compose.runtime.Stable

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

View file

@ -1,3 +1,4 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="100dp"
android:height="100dp"

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Some files were not shown because too many files have changed in this diff Show more