Skip to content

Commit bf94e55

Browse files
committed
Increase maximum Encumbrance from Strong Back and Sturdy talents
1 parent 7fc9f8e commit bf94e55

File tree

5 files changed

+57
-3
lines changed

5 files changed

+57
-3
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package cz.frantisekmasa.wfrp_master.common.character.effects
2+
3+
import cz.frantisekmasa.wfrp_master.common.core.domain.character.Character
4+
import cz.frantisekmasa.wfrp_master.common.core.domain.trappings.Encumbrance
5+
import cz.frantisekmasa.wfrp_master.common.core.domain.trappings.sum
6+
7+
class AdditionalEncumbrance(
8+
private val bonus: Encumbrance,
9+
) : CharacterEffect {
10+
11+
override fun apply(character: Character, otherEffects: List<CharacterEffect>): Character {
12+
return character.modifyEncumbranceBonus(
13+
bonus + otherEffects.filterIsInstance<AdditionalEncumbrance>()
14+
.map { it.bonus }
15+
.sum()
16+
)
17+
}
18+
19+
override fun revert(character: Character, otherEffects: List<CharacterEffect>): Character {
20+
return character.modifyEncumbranceBonus(
21+
otherEffects.filterIsInstance<AdditionalEncumbrance>()
22+
.map { it.bonus }
23+
.sum()
24+
)
25+
}
26+
27+
companion object {
28+
fun fromTalentOrNull(name: String, timesTaken: Int): AdditionalEncumbrance? {
29+
if (name.equals("strong back", ignoreCase = true)) {
30+
return AdditionalEncumbrance(Encumbrance(timesTaken.toDouble()))
31+
}
32+
33+
if (name.equals("sturdy", ignoreCase = true)) {
34+
return AdditionalEncumbrance(Encumbrance((timesTaken * 2).toDouble()))
35+
}
36+
37+
return null
38+
}
39+
}
40+
}

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/character/effects/EffectFactory.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class EffectFactory {
1919
listOfNotNull(
2020
HardyWoundsModification.fromTalentOrNull(name, item.talent.taken),
2121
CharacteristicChange.fromTalentNameOrNull(name),
22+
AdditionalEncumbrance.fromTalentOrNull(name, item.talent.taken),
2223
)
2324
}
2425
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class TrappingsScreenModel(
5555
.distinctUntilChanged()
5656

5757
val maxEncumbrance: Flow<Encumbrance> = character
58-
.map { Encumbrance.maximumForCharacter(it.characteristics) }
58+
.map { it.maxEncumbrance }
5959
.distinctUntilChanged()
6060

6161
val totalEncumbrance: Flow<Encumbrance?> =

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/domain/character/Character.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import cz.frantisekmasa.wfrp_master.common.core.domain.Ambitions
77
import cz.frantisekmasa.wfrp_master.common.core.domain.Money
88
import cz.frantisekmasa.wfrp_master.common.core.domain.Size
99
import cz.frantisekmasa.wfrp_master.common.core.domain.Stats
10+
import cz.frantisekmasa.wfrp_master.common.core.domain.trappings.Encumbrance
1011
import cz.frantisekmasa.wfrp_master.common.core.shared.Parcelable
1112
import cz.frantisekmasa.wfrp_master.common.core.shared.Parcelize
1213
import cz.frantisekmasa.wfrp_master.common.encounters.domain.Wounds
@@ -40,6 +41,7 @@ data class Character(
4041
val note: String = "",
4142
@SerialName("hardyTalent") val hasHardyTalent: Boolean = false,
4243
val woundsModifiers: WoundsModifiers = WoundsModifiers(),
44+
val encumbranceBonus: Encumbrance = Encumbrance.Zero,
4345
@SerialName("archived") val isArchived: Boolean = false,
4446
val avatarUrl: String? = null,
4547
val money: Money = Money.zero(),
@@ -53,6 +55,9 @@ data class Character(
5355
calculateMaxWounds(size ?: race?.size, points, hasHardyTalent, woundsModifiers, characteristics),
5456
)
5557

58+
val maxEncumbrance: Encumbrance
59+
get() = Encumbrance.maximumForCharacter(characteristics) + encumbranceBonus
60+
5661
init {
5762
require(userId == null || type == CharacterType.PLAYER_CHARACTER) {
5863
"Only Player Characters can have associated user"
@@ -141,6 +146,10 @@ data class Character(
141146
)
142147
}
143148

149+
fun modifyEncumbranceBonus(bonus: Encumbrance): Character {
150+
return copy(encumbranceBonus = bonus)
151+
}
152+
144153
fun updateCareer(
145154
careerName: String,
146155
socialClass: String,

firebase/firestore.rules

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,8 @@ service cloud.firestore {
438438
"avatarUrl",
439439
"archived",
440440
"woundsModifiers",
441-
"compendiumCareer"
441+
"compendiumCareer",
442+
"encumbranceBonus"
442443
].hasAll(character.keys())
443444
&& character.id == characterId
444445
&& (
@@ -511,7 +512,10 @@ service cloud.firestore {
511512
character.compendiumCareer.keys().toSet() == ["careerId", "levelId"].toSet() &&
512513
character.compendiumCareer.careerId is string && isValidUuid(character.compendiumCareer.careerId) &&
513514
character.compendiumCareer.levelId is string && isValidUuid(character.compendiumCareer.levelId)
514-
));
515+
))
516+
&& (! ("encumbranceBonus" in character) ||
517+
(character.encumbranceBonus is number && character.encumbranceBonus >= 0)
518+
);
515519
}
516520
}
517521

0 commit comments

Comments
 (0)