Add ritual display in spell item & detail.

This commit is contained in:
Thomas Andres Gomez 2023-09-28 16:39:37 +02:00
parent d25246f452
commit 1b5dfe8552
9 changed files with 60 additions and 12 deletions

View file

@ -10,6 +10,7 @@ data class Spell(
val requirement: String,
val duration: String,
val description: String,
val ritual: Boolean,
) {
enum class School(val key: String) {
ABJURATION("Abjuration"),

View file

@ -38,6 +38,7 @@ class SpellBookParser @Inject constructor() {
val requirement = row.parse(REQUIREMENT)
val duration = row.parse(DURATION)
val description = row.parse(DESCRIPTION)
val ritual = row.parse(RITUAL)?.toBoolean() ?: false
if (name != null
&& level != null
&& originalName != null
@ -58,6 +59,7 @@ class SpellBookParser @Inject constructor() {
requirement = requirement,
duration = duration,
description = description,
ritual = ritual,
)
} else {
null
@ -85,6 +87,7 @@ class SpellBookParser @Inject constructor() {
private const val RANGE = "Portée"
private const val REQUIREMENT = "Composantes"
private const val DURATION = "Durée"
private const val RITUAL = "Rituel"
private const val DESCRIPTION = "Description"
private val COLUMNS
@ -97,6 +100,7 @@ class SpellBookParser @Inject constructor() {
RANGE,
REQUIREMENT,
DURATION,
RITUAL,
DESCRIPTION,
)
}

View file

@ -47,6 +47,7 @@ data class SpellUio(
val hit: Dice?,
val effect: Dice?,
val changeWithLevel: Boolean,
val ritual: Boolean,
) {
class Dice(
@DrawableRes val icon: Int,
@ -65,7 +66,9 @@ fun Spell(
onCast: (String) -> Unit,
) {
Row(
modifier = Modifier.clickable { onClick(spell.name) }.then(other = modifier),
modifier = Modifier
.clickable { onClick(spell.name) }
.then(other = modifier),
horizontalArrangement = Arrangement.spacedBy(space = 12.dp),
verticalAlignment = Alignment.CenterVertically,
) {
@ -127,13 +130,33 @@ fun Spell(
)
}
Text(
style = MaterialTheme.typography.labelMedium,
fontStyle = FontStyle.Italic,
overflow = TextOverflow.Ellipsis,
maxLines = 1,
text = spell.range,
)
Row(
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
) {
if (spell.ritual) {
Text(
style = MaterialTheme.typography.labelMedium,
fontStyle = FontStyle.Italic,
overflow = TextOverflow.Ellipsis,
maxLines = 1,
text = stringResource(id = R.string.spell_detail_ritual),
)
Text(
style = MaterialTheme.typography.labelMedium,
fontStyle = FontStyle.Italic,
overflow = TextOverflow.Ellipsis,
maxLines = 1,
text = "-",
)
}
Text(
style = MaterialTheme.typography.labelMedium,
fontStyle = FontStyle.Italic,
overflow = TextOverflow.Ellipsis,
maxLines = 1,
text = spell.range,
)
}
}
spell.hit?.let { dice ->
@ -205,7 +228,8 @@ private class SpellPreviewProvider : PreviewParameterProvider<SpellUio> {
icon = R.drawable.ic_d10_24,
label = "1d10",
),
changeWithLevel = false
changeWithLevel = false,
ritual = false,
),
SpellUio(
icon = Spell.School.ENCHANTMENT.icon,
@ -219,7 +243,8 @@ private class SpellPreviewProvider : PreviewParameterProvider<SpellUio> {
icon = R.drawable.ic_d10_24,
label = "1d4",
),
changeWithLevel = false
changeWithLevel = false,
ritual = false,
),
SpellUio(
icon = Spell.School.EVOCATION.icon,
@ -234,6 +259,7 @@ private class SpellPreviewProvider : PreviewParameterProvider<SpellUio> {
label = "1d8+3",
),
changeWithLevel = true,
ritual = true,
),
)
}

View file

@ -35,7 +35,8 @@ fun rememberSpellListStatePreview(): State<List<Pair<SpellHeaderUio, List<SpellU
icon = R.drawable.ic_d10_24,
label = "1d10",
),
changeWithLevel = false
changeWithLevel = false,
ritual = true,
),
SpellUio(
icon = Spell.School.ENCHANTMENT.icon,
@ -49,7 +50,8 @@ fun rememberSpellListStatePreview(): State<List<Pair<SpellHeaderUio, List<SpellU
icon = R.drawable.ic_d10_24,
label = "1d4",
),
changeWithLevel = false
changeWithLevel = false,
ritual = false,
),
),
SpellHeaderUio(
@ -69,6 +71,7 @@ fun rememberSpellListStatePreview(): State<List<Pair<SpellHeaderUio, List<SpellU
label = "1d8+3",
),
changeWithLevel = true,
ritual = false,
),
),
)

View file

@ -52,6 +52,7 @@ class SpellUioFactory @Inject constructor() {
hit = hit,
effect = effect,
changeWithLevel = assignedSpell.level != null,
ritual = assignedSpell.spell.ritual,
)
}
}

View file

@ -58,6 +58,7 @@ class SpellDetailUio(
val requirement: String,
val duration: String,
val description: String,
val ritual: Boolean,
)
@Composable
@ -146,11 +147,19 @@ private fun SpellDetailContent(
horizontalArrangement = Arrangement.spacedBy(space = 4.dp),
) {
Text(
modifier = Modifier.alignByBaseline(),
style = MaterialTheme.typography.bodyMedium,
fontWeight = FontWeight.Bold,
text = stringResource(id = R.string.spell_detail_school),
)
if (detail.ritual) {
Text(
style = MaterialTheme.typography.bodyMedium,
text = stringResource(id = R.string.spell_detail_ritual),
)
}
Text(
modifier = Modifier.alignByBaseline(),
style = MaterialTheme.typography.bodyMedium,
text = stringResource(id = detail.school),
)
@ -261,6 +270,7 @@ private fun SpellDetailPreview() {
requirement = "V, S",
duration = "instantanée",
description = "La créature que vous touchez récupère un nombre de points de vie égal à 1d8 + votre modificateur de caractéristique d'incantation. Ce sort n'a aucun effet sur les morts-vivants et les créatures artificielles.\nÀ plus haut niveau. Si vous lancez ce sort en utilisant un emplacement de niveau 2 ou supérieur, les soins augmentent de 1d8 par niveau au-delà du niveau 1.",
ritual = true,
)
)
},

View file

@ -41,6 +41,7 @@ class SpellDetailViewModel @Inject constructor(
requirement = it.spell.requirement,
duration = it.spell.duration,
description = it.spell.description,
ritual = it.spell.ritual,
)
}

View file

@ -144,6 +144,7 @@
<string name="spell_detail_range">Portée</string>
<string name="spell_detail_components">Composantes</string>
<string name="spell_detail_duration">Durée</string>
<string name="spell_detail_ritual">Rituel</string>
<string name="spell_detail_description">Description</string>
<string name="spell_level_chooser_label">Sort de niveau %1$s</string>
<string name="spell_level_chooser_available">Disponible : </string>

View file

@ -144,6 +144,7 @@
<string name="spell_detail_range">Range</string>
<string name="spell_detail_components">Components</string>
<string name="spell_detail_duration">Duration</string>
<string name="spell_detail_ritual">Ritual</string>
<string name="spell_detail_description">Description</string>
<string name="spell_level_chooser_label">Spell level %1$s</string>
<string name="spell_level_chooser_available">Available: </string>