diff --git a/common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/domain/character/Character.kt b/common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/domain/character/Character.kt index 6c5390693..c163c30ba 100644 --- a/common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/domain/character/Character.kt +++ b/common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/domain/character/Character.kt @@ -17,6 +17,7 @@ import dev.icerock.moko.parcelize.Parcelize import kotlinx.serialization.Contextual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonClassDiscriminator typealias LocalCharacterId = String @@ -50,6 +51,7 @@ data class Character( val avatarUrl: String? = null, val money: Money = Money.ZERO, val hiddenTabs: Set = emptySet(), + val relationships: Map = emptyMap(), val size: Size? = null, ) : Parcelable { @@ -89,6 +91,18 @@ data class Character( characteristics, ) require(points.wounds <= maxWounds) { "Wounds (${points.wounds} are greater than max Wounds ($maxWounds)" } + require(relationships.count { it.value is Relationship.Mount && it.value.riding } <= 1) { + "Character can ride at most one mount at he mount" + } + } + + @JsonClassDiscriminator("type") + sealed interface Relationship { + @SerialName("FAMILIAR") + object Familiar : Relationship + + @SerialName("MOUNT") + data class Mount(val riding: Boolean) : Relationship } @Parcelize diff --git a/common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/domain/character/CharacterType.kt b/common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/domain/character/CharacterType.kt index 1e3748225..6513f2e7e 100644 --- a/common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/domain/character/CharacterType.kt +++ b/common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/domain/character/CharacterType.kt @@ -3,4 +3,6 @@ package cz.frantisekmasa.wfrp_master.common.core.domain.character enum class CharacterType { PLAYER_CHARACTER, NPC, + FAMILIAR, + HIRELING, } diff --git a/firebase/firestore.rules b/firebase/firestore.rules index 6b2c279d8..6747a3448 100644 --- a/firebase/firestore.rules +++ b/firebase/firestore.rules @@ -539,7 +539,8 @@ service cloud.firestore { "archived", "woundsModifiers", "compendiumCareer", - "encumbranceBonus" + "encumbranceBonus", + "relationships", ].hasAll(character.keys()) && character.id == characterId && ( @@ -614,7 +615,8 @@ service cloud.firestore { character.compendiumCareer.careerId is string && isValidUuid(character.compendiumCareer.careerId) && character.compendiumCareer.levelId is string && isValidUuid(character.compendiumCareer.levelId) )) - && character.encumbranceBonus is number && character.encumbranceBonus >= 0; + && character.encumbranceBonus is number && character.encumbranceBonus >= 0 + && (! ("relationships" in character) || character.relationships is map); } }