Skip to content

Commit 36763a5

Browse files
authored
Merge pull request #64 from fmasa/feat/more-types
More trapping types
2 parents 7fc9f8e + 4fb4aa6 commit 36763a5

File tree

15 files changed

+253
-17
lines changed

15 files changed

+253
-17
lines changed

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/character/trappings/InventoryItemDialog.kt

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,9 @@ private fun TrappingTypeForm(formData: TrappingTypeFormData, validate: Boolean)
163163
formData.armourFlaws,
164164
)
165165
}
166+
TrappingTypeOption.CLOTHING_OR_ACCESSORY -> {
167+
WornCheckbox(formData)
168+
}
166169
TrappingTypeOption.CONTAINER -> {
167170
TextInput(
168171
label = strings.trappings.labelCarries,
@@ -209,7 +212,14 @@ private fun TrappingTypeForm(formData: TrappingTypeFormData, validate: Boolean)
209212
WeaponQualitiesPicker(formData)
210213
WeaponFlawsPicker(formData)
211214
}
212-
TrappingTypeOption.MISCELLANEOUS -> {}
215+
TrappingTypeOption.BOOK_OR_DOCUMENT,
216+
TrappingTypeOption.DRUG_OR_POISON,
217+
TrappingTypeOption.MISCELLANEOUS,
218+
TrappingTypeOption.FOOD_OR_DRINK,
219+
TrappingTypeOption.HERB_OR_DRAUGHT,
220+
TrappingTypeOption.SPELL_INGREDIENT,
221+
TrappingTypeOption.TOOL_OR_KIT,
222+
TrappingTypeOption.TRADE_TOOLS -> {}
213223
}
214224
}
215225

@@ -397,7 +407,15 @@ private class TrappingTypeFormData(
397407
TrappingTypeOption.CONTAINER -> carries.isValid()
398408
TrappingTypeOption.MELEE_WEAPON -> damage.isValid()
399409
TrappingTypeOption.RANGED_WEAPON -> damage.isValid() && weaponRange.isValid()
400-
TrappingTypeOption.MISCELLANEOUS -> true
410+
TrappingTypeOption.BOOK_OR_DOCUMENT,
411+
TrappingTypeOption.CLOTHING_OR_ACCESSORY,
412+
TrappingTypeOption.DRUG_OR_POISON,
413+
TrappingTypeOption.FOOD_OR_DRINK,
414+
TrappingTypeOption.HERB_OR_DRAUGHT,
415+
TrappingTypeOption.MISCELLANEOUS,
416+
TrappingTypeOption.SPELL_INGREDIENT,
417+
TrappingTypeOption.TOOL_OR_KIT,
418+
TrappingTypeOption.TRADE_TOOLS -> true
401419
}
402420

403421
override fun toValue(): TrappingType? = when (type.value) {
@@ -416,10 +434,17 @@ private class TrappingTypeFormData(
416434
qualities = armourQualities.toMap(),
417435
flaws = armourFlaws.toMap(),
418436
)
437+
TrappingTypeOption.BOOK_OR_DOCUMENT -> TrappingType.BookOrDocument
438+
TrappingTypeOption.CLOTHING_OR_ACCESSORY -> TrappingType.ClothingOrAccessory(
439+
worn = worn.value,
440+
)
419441
TrappingTypeOption.CONTAINER -> TrappingType.Container(
420442
carries = Encumbrance(carries.toDouble()),
421443
worn = worn.value,
422444
)
445+
TrappingTypeOption.DRUG_OR_POISON -> TrappingType.DrugOrPoison
446+
TrappingTypeOption.FOOD_OR_DRINK -> TrappingType.FoodOrDrink
447+
TrappingTypeOption.HERB_OR_DRAUGHT -> TrappingType.HerbOrDraught
423448
TrappingTypeOption.MELEE_WEAPON -> TrappingType.MeleeWeapon(
424449
group = meleeWeaponGroup.value,
425450
reach = weaponReach.value,
@@ -436,7 +461,10 @@ private class TrappingTypeFormData(
436461
flaws = weaponFlaws.toMap(),
437462
equipped = weaponEquipped.value,
438463
)
464+
TrappingTypeOption.SPELL_INGREDIENT -> TrappingType.SpellIngredient
439465
TrappingTypeOption.MISCELLANEOUS -> null
466+
TrappingTypeOption.TOOL_OR_KIT -> TrappingType.ToolOrKit
467+
TrappingTypeOption.TRADE_TOOLS -> TrappingType.TradeTools
440468
}
441469

442470
companion object {
@@ -461,11 +489,18 @@ private class TrappingTypeFormData(
461489
armourFlaws = type.flaws,
462490
worn = type.worn,
463491
)
492+
is TrappingType.BookOrDocument -> fromDefaults(TrappingTypeOption.BOOK_OR_DOCUMENT)
493+
is TrappingType.ClothingOrAccessory -> fromDefaults(
494+
type = TrappingTypeOption.CLOTHING_OR_ACCESSORY,
495+
worn = type.worn,
496+
)
464497
is TrappingType.Container -> fromDefaults(
465498
type = TrappingTypeOption.CONTAINER,
466499
carries = type.carries,
467500
worn = type.worn,
468501
)
502+
is TrappingType.DrugOrPoison -> fromDefaults(TrappingTypeOption.DRUG_OR_POISON)
503+
is TrappingType.HerbOrDraught -> fromDefaults(TrappingTypeOption.HERB_OR_DRAUGHT)
469504
is TrappingType.MeleeWeapon -> fromDefaults(
470505
type = TrappingTypeOption.MELEE_WEAPON,
471506
damage = type.damage,
@@ -484,6 +519,10 @@ private class TrappingTypeFormData(
484519
weaponFlaws = type.flaws,
485520
weaponEquipped = type.equipped,
486521
)
522+
is TrappingType.SpellIngredient -> fromDefaults(TrappingTypeOption.SPELL_INGREDIENT)
523+
TrappingType.FoodOrDrink -> fromDefaults(TrappingTypeOption.FOOD_OR_DRINK)
524+
TrappingType.ToolOrKit -> fromDefaults(TrappingTypeOption.TOOL_OR_KIT)
525+
TrappingType.TradeTools -> fromDefaults(TrappingTypeOption.TRADE_TOOLS)
487526
}
488527
}
489528

@@ -556,8 +595,16 @@ private enum class TrappingTypeOption(override val nameResolver: (strings: Strin
556595
NamedEnum {
557596
AMMUNITION({ it.trappings.types.ammunition }),
558597
ARMOUR({ it.trappings.types.armour }),
598+
BOOK_OR_DOCUMENT({ it.trappings.types.bookOrDocument }),
599+
CLOTHING_OR_ACCESSORY({ it.trappings.types.clothingOrAccessory }),
559600
CONTAINER({ it.trappings.types.container }),
601+
DRUG_OR_POISON({ it.trappings.types.drugOrPoison }),
602+
FOOD_OR_DRINK({ it.trappings.types.foodOrDrink }),
603+
HERB_OR_DRAUGHT({ it.trappings.types.herbOrDraught }),
560604
MELEE_WEAPON({ it.trappings.types.meleeWeapon }),
561605
MISCELLANEOUS({ it.trappings.types.miscellaneous }),
562606
RANGED_WEAPON({ it.trappings.types.rangedWeapon }),
607+
SPELL_INGREDIENT({ it.trappings.types.spellIngredient }),
608+
TOOL_OR_KIT({ it.trappings.types.toolOrKit }),
609+
TRADE_TOOLS({ it.trappings.types.tradeTools }),
563610
}

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/character/trappings/TrappingDetailScreen.kt

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@ import cafe.adriel.voyager.navigator.LocalNavigator
1515
import cafe.adriel.voyager.navigator.currentOrThrow
1616
import cz.frantisekmasa.wfrp_master.common.character.trappings.detail.AmmunitionDetail
1717
import cz.frantisekmasa.wfrp_master.common.character.trappings.detail.ArmourDetail
18+
import cz.frantisekmasa.wfrp_master.common.character.trappings.detail.ClothingOrAccessoryDetail
1819
import cz.frantisekmasa.wfrp_master.common.character.trappings.detail.ContainerDetail
1920
import cz.frantisekmasa.wfrp_master.common.character.trappings.detail.MeleeWeaponDetail
20-
import cz.frantisekmasa.wfrp_master.common.character.trappings.detail.MiscellaneousTrappingDetail
2121
import cz.frantisekmasa.wfrp_master.common.character.trappings.detail.RangedWeaponDetail
22+
import cz.frantisekmasa.wfrp_master.common.character.trappings.detail.SimpleTrappingDetail
2223
import cz.frantisekmasa.wfrp_master.common.core.domain.identifiers.CharacterId
2324
import cz.frantisekmasa.wfrp_master.common.core.domain.trappings.InventoryItem
2425
import cz.frantisekmasa.wfrp_master.common.core.domain.trappings.InventoryItemId
@@ -120,6 +121,13 @@ private fun TrappingDetail(
120121
onSaveRequest = screenModel::saveInventoryItem,
121122
)
122123
}
124+
TrappingType.BookOrDocument -> {
125+
SimpleTrappingDetail(
126+
trapping = trapping,
127+
trappingType = LocalStrings.current.trappings.types.bookOrDocument,
128+
onSaveRequest = screenModel::saveInventoryItem,
129+
)
130+
}
123131
is TrappingType.Container -> {
124132
ContainerDetail(
125133
trapping = trapping,
@@ -134,6 +142,34 @@ private fun TrappingDetail(
134142
}
135143
)
136144
}
145+
is TrappingType.ClothingOrAccessory -> {
146+
ClothingOrAccessoryDetail(
147+
trapping = trapping,
148+
clothingOrAccessory = type,
149+
onSaveRequest = screenModel::saveInventoryItem,
150+
)
151+
}
152+
TrappingType.DrugOrPoison -> {
153+
SimpleTrappingDetail(
154+
trapping = trapping,
155+
trappingType = LocalStrings.current.trappings.types.drugOrPoison,
156+
onSaveRequest = screenModel::saveInventoryItem,
157+
)
158+
}
159+
TrappingType.FoodOrDrink -> {
160+
SimpleTrappingDetail(
161+
trapping = trapping,
162+
trappingType = LocalStrings.current.trappings.types.foodOrDrink,
163+
onSaveRequest = screenModel::saveInventoryItem,
164+
)
165+
}
166+
TrappingType.HerbOrDraught -> {
167+
SimpleTrappingDetail(
168+
trapping = trapping,
169+
trappingType = LocalStrings.current.trappings.types.herbOrDraught,
170+
onSaveRequest = screenModel::saveInventoryItem,
171+
)
172+
}
137173
is TrappingType.MeleeWeapon -> {
138174
MeleeWeaponDetail(
139175
trapping = trapping,
@@ -151,8 +187,30 @@ private fun TrappingDetail(
151187
)
152188
}
153189
null -> {
154-
MiscellaneousTrappingDetail(
190+
SimpleTrappingDetail(
191+
trapping = trapping,
192+
trappingType = LocalStrings.current.trappings.types.miscellaneous,
193+
onSaveRequest = screenModel::saveInventoryItem,
194+
)
195+
}
196+
TrappingType.SpellIngredient -> {
197+
SimpleTrappingDetail(
198+
trapping = trapping,
199+
trappingType = LocalStrings.current.trappings.types.spellIngredient,
200+
onSaveRequest = screenModel::saveInventoryItem,
201+
)
202+
}
203+
TrappingType.ToolOrKit -> {
204+
SimpleTrappingDetail(
205+
trapping = trapping,
206+
trappingType = LocalStrings.current.trappings.types.toolOrKit,
207+
onSaveRequest = screenModel::saveInventoryItem,
208+
)
209+
}
210+
TrappingType.TradeTools -> {
211+
SimpleTrappingDetail(
155212
trapping = trapping,
213+
trappingType = LocalStrings.current.trappings.types.tradeTools,
156214
onSaveRequest = screenModel::saveInventoryItem,
157215
)
158216
}

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/character/trappings/TrappingIcon.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,17 @@ import cz.frantisekmasa.wfrp_master.common.core.shared.Resources
99
@Stable
1010
fun trappingIcon(trappingType: TrappingType?) = when (trappingType) {
1111
is TrappingType.Ammunition -> Resources.Drawable.TrappingAmmunition
12-
is TrappingType.Armour -> Resources.Drawable.Armour
12+
is TrappingType.Armour -> Resources.Drawable.TrappingArmour
13+
is TrappingType.BookOrDocument -> Resources.Drawable.TrappingBookOrDocument
1314
is TrappingType.MeleeWeapon -> Resources.Drawable.WeaponSkill
15+
is TrappingType.ClothingOrAccessory -> Resources.Drawable.TrappingClothingOrAccessory
1416
is TrappingType.Container -> Resources.Drawable.TrappingContainer
17+
is TrappingType.DrugOrPoison -> Resources.Drawable.TrappingDrugOrPoison
18+
is TrappingType.FoodOrDrink -> Resources.Drawable.TrappingFoodOrDrink
19+
is TrappingType.HerbOrDraught -> Resources.Drawable.TrappingHerbOrDraught
1520
is TrappingType.RangedWeapon -> Resources.Drawable.BallisticSkill
21+
is TrappingType.SpellIngredient -> Resources.Drawable.Spell
22+
is TrappingType.ToolOrKit -> Resources.Drawable.TrappingTool
23+
is TrappingType.TradeTools -> Resources.Drawable.TrappingTool
1624
null -> Resources.Drawable.TrappingMiscellaneous
1725
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package cz.frantisekmasa.wfrp_master.common.character.trappings.detail
2+
3+
import androidx.compose.foundation.layout.Column
4+
import androidx.compose.foundation.layout.padding
5+
import androidx.compose.foundation.rememberScrollState
6+
import androidx.compose.foundation.verticalScroll
7+
import androidx.compose.runtime.Composable
8+
import androidx.compose.ui.Modifier
9+
import cz.frantisekmasa.wfrp_master.common.core.domain.trappings.InventoryItem
10+
import cz.frantisekmasa.wfrp_master.common.core.domain.trappings.TrappingType
11+
import cz.frantisekmasa.wfrp_master.common.core.ui.primitives.Spacing
12+
import cz.frantisekmasa.wfrp_master.common.core.ui.text.SingleLineTextValue
13+
import cz.frantisekmasa.wfrp_master.common.localization.LocalStrings
14+
15+
@Composable
16+
fun ClothingOrAccessoryDetail(
17+
trapping: InventoryItem,
18+
clothingOrAccessory: TrappingType.ClothingOrAccessory,
19+
onSaveRequest: suspend (InventoryItem) -> Unit,
20+
) {
21+
Column(Modifier.verticalScroll(rememberScrollState())) {
22+
WornBar(trapping, clothingOrAccessory, onSaveRequest)
23+
24+
Column(Modifier.padding(Spacing.bodyPadding)) {
25+
val strings = LocalStrings.current
26+
27+
SingleLineTextValue(
28+
strings.trappings.labelType,
29+
strings.trappings.types.clothingOrAccessory,
30+
)
31+
32+
EncumbranceBox(trapping)
33+
34+
TrappingDescription(trapping)
35+
}
36+
}
37+
}

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/character/trappings/detail/MiscellaneousTrappingDetail.kt

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,16 @@ import cz.frantisekmasa.wfrp_master.common.core.ui.text.SingleLineTextValue
1212
import cz.frantisekmasa.wfrp_master.common.localization.LocalStrings
1313

1414
@Composable
15-
fun MiscellaneousTrappingDetail(
15+
fun SimpleTrappingDetail(
1616
trapping: InventoryItem,
17+
trappingType: String,
1718
onSaveRequest: suspend (InventoryItem) -> Unit,
1819
) {
1920
Column(Modifier.verticalScroll(rememberScrollState())) {
2021
QuantityBar(trapping, onSaveRequest)
2122

2223
Column(Modifier.padding(Spacing.bodyPadding)) {
23-
val strings = LocalStrings.current
24-
25-
SingleLineTextValue(
26-
strings.trappings.labelType,
27-
strings.trappings.types.miscellaneous,
28-
)
24+
SingleLineTextValue(LocalStrings.current.trappings.labelType, trappingType)
2925

3026
EncumbranceBox(trapping)
3127

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/domain/trappings/TrappingType.kt

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,49 @@ sealed class TrappingType : Parcelable {
104104
override fun takeOff(): Container = copy(worn = false)
105105
override fun takeOn(): Container = copy(worn = true)
106106
}
107+
108+
@Parcelize
109+
@Serializable
110+
@SerialName("CLOTHING_OR_ACCESSORY")
111+
data class ClothingOrAccessory(
112+
override val worn: Boolean,
113+
) : WearableTrapping() {
114+
override fun takeOff(): ClothingOrAccessory = copy(worn = false)
115+
override fun takeOn(): ClothingOrAccessory = copy(worn = true)
116+
}
117+
118+
@Parcelize
119+
@Serializable
120+
@SerialName("FOOD_OR_DRINK")
121+
object FoodOrDrink : TrappingType()
122+
123+
@Parcelize
124+
@Serializable
125+
@SerialName("TOOL_OR_KIT")
126+
object ToolOrKit : TrappingType()
127+
128+
@Parcelize
129+
@Serializable
130+
@SerialName("BOOKS_OR_DOCUMENT")
131+
object BookOrDocument : TrappingType()
132+
133+
@Parcelize
134+
@Serializable
135+
@SerialName("TRADE_TOOLS")
136+
object TradeTools : TrappingType()
137+
138+
@Parcelize
139+
@Serializable
140+
@SerialName("DRUG_OR_POISON")
141+
object DrugOrPoison : TrappingType()
142+
143+
@Parcelize
144+
@Serializable
145+
@SerialName("HERB_OR_DRAUGHT")
146+
object HerbOrDraught : TrappingType()
147+
148+
@Parcelize
149+
@Serializable
150+
@SerialName("SPELL_INGREDIENT")
151+
object SpellIngredient : TrappingType()
107152
}

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/shared/Resources.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,18 @@ object Resources {
4949
ConditionUnconscious("drawable/ic_condition_unconscious.xml"),
5050

5151
// Trappings
52+
TrappingArmour("drawable/ic_armour.xml"),
5253
TrappingAmmunition("drawable/ic_ammunition.xml"),
54+
TrappingBookOrDocument("drawable/ic_book_or_document.xml"),
55+
TrappingClothingOrAccessory("drawable/ic_clothing_or_accessory.xml"),
5356
TrappingCoins("drawable/ic_coins.xml"),
57+
TrappingDrugOrPoison("drawable/ic_drug_or_poison.xml"),
5458
TrappingContainer("drawable/ic_container.xml"),
59+
TrappingFoodOrDrink("drawable/ic_food_or_drink.xml"),
60+
TrappingHerbOrDraught("drawable/ic_herb_or_draught.xml"),
5561
TrappingMiscellaneous("drawable/ic_miscellaneous.xml"),
5662
TrappingEncumbrance("drawable/ic_encumbrance.xml"),
57-
Armour("drawable/ic_armour.xml"),
63+
TrappingTool("drawable/ic_tool.xml"),
5864

5965
// Raster images
6066
GoogleLogo("drawable/google_logo.png"),

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/ui/forms/SelectBox.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ inline fun <reified T : NamedEnum> SelectBox(
4444
label = label,
4545
value = value,
4646
onValueChange = onValueChange,
47-
items = remember(items) { items.map { it to it.nameResolver(strings) } }
47+
items = remember(items) {
48+
items.map { it to it.nameResolver(strings) }.sortedBy { it.second }
49+
}
4850
)
4951
}
5052
}

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/localization/Strings.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -815,10 +815,18 @@ data class MiracleMessageStrings(
815815
data class TrappingTypeStrings(
816816
val ammunition: String = "Ammunition",
817817
val armour: String = "Armour",
818-
val container: String = "Container",
819-
val meleeWeapon: String = "Melee Weapon",
818+
val bookOrDocument: String = "Books and Documents",
819+
val clothingOrAccessory: String = "Clothing and Accessories",
820+
val container: String = "Containers",
821+
val drugOrPoison: String = "Drugs and Poisons",
822+
val foodOrDrink: String = "Food and Drink",
823+
val herbOrDraught: String = "Herbs and Draughts",
824+
val meleeWeapon: String = "Melee Weapons",
820825
val miscellaneous: String = "Miscellaneous",
821-
val rangedWeapon: String = "Ranged Weapon",
826+
val rangedWeapon: String = "Ranged Weapons",
827+
val spellIngredient: String = "Spell Ingredients",
828+
val toolOrKit: String = "Tools and Kits",
829+
val tradeTools: String = "Trade tools",
822830
)
823831

824832
@Immutable

0 commit comments

Comments
 (0)