diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationRepository.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationRepository.kt index c144324..0a78484 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/alteration/AlterationRepository.kt @@ -2,6 +2,8 @@ package com.pixelized.desktop.lwa.repository.alteration import com.pixelized.desktop.lwa.repository.campaign.CampaignRepository import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetRepository +import com.pixelized.desktop.lwa.repository.inventory.InventoryRepository +import com.pixelized.desktop.lwa.repository.item.ItemRepository import com.pixelized.shared.lwa.model.alteration.Alteration import com.pixelized.shared.lwa.model.alteration.FieldAlteration import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet @@ -19,6 +21,8 @@ import kotlinx.coroutines.flow.stateIn class AlterationRepository( private val alterationStore: AlterationStore, + private val inventoryRepository: InventoryRepository, + private val itemRepository: ItemRepository, campaignRepository: CampaignRepository, characterRepository: CharacterSheetRepository, ) { @@ -28,17 +32,17 @@ class AlterationRepository( /** * This flow transform the campaign instance (player + npc) into a - * Map>. + * Map> from the CharacterSheet Alteration * It is used by an other flow to build the FieldAlteration cache. */ @OptIn(ExperimentalCoroutinesApi::class) - private val campaignCharactersFlow: Flow>> = + private val campaignCharacterAlterationFlow: Flow>> = campaignRepository.campaignFlow() .flatMapLatest { campaign -> - val flows = campaign.instances.map { + val characters = campaign.instances.map { characterRepository.characterDetailFlow(characterSheetId = it) } - combine(flows) { sheets: Array -> + combine(characters) { sheets: Array -> sheets .asSequence() .filterNotNull() @@ -46,17 +50,46 @@ class AlterationRepository( } } + /** + * This flow transform the campaign instance (player + npc) into a + * Map> from the character inventory items Alteration + * It is used by an other flow to build the FieldAlteration cache. + */ + @OptIn(ExperimentalCoroutinesApi::class) + private val campaignCharacterInventoryAlterationFlow: Flow>> = + campaignRepository.campaignFlow() + .flatMapLatest { campaign -> + val equippedItems = campaign.instances.map { characterSheetId -> + combine( + inventoryRepository.equippedItemsFlow(characterSheetId = characterSheetId), + itemRepository.itemFlow(), + ) { equipments, items -> + characterSheetId to equipments.flatMap { equipment -> + items[equipment.itemId]?.alterations ?: emptyList() + } + } + } + combine(equippedItems) { equipments: Array>> -> + equipments + .asSequence() + .associate { it.first to it.second } + } + } + private val activeAlterationMapFlow: StateFlow>>> = combine( alterationStore.alterationsFlow, - campaignCharactersFlow, - ) { alterations, characters -> - characters.map { (characterSheetId, alterationIds) -> - characterSheetId to transformToAlterationFieldMap( + campaignCharacterAlterationFlow, + campaignCharacterInventoryAlterationFlow, + ) { alterations, characters, inventories -> + val characterSheetIds = characters.keys + inventories.keys + characterSheetIds.associateWith { + transformToAlterationFieldMap( alterations = alterations, - actives = alterationIds, + actives = characters.getOrElse(it) { emptyList() } + + inventories.getOrElse(it) { emptyList() } ) - }.toMap() + } }.stateIn( scope = scope, started = SharingStarted.Eagerly, @@ -96,7 +129,7 @@ class AlterationRepository( ) } - @kotlin.jvm.Throws + @Throws suspend fun deleteAlteration( alterationId: String, ) { diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/inventory/InventoryRepository.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/inventory/InventoryRepository.kt index 665c9cf..8037caa 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/inventory/InventoryRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/inventory/InventoryRepository.kt @@ -3,6 +3,7 @@ package com.pixelized.desktop.lwa.repository.inventory import com.pixelized.shared.lwa.model.inventory.Inventory import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map class InventoryRepository( @@ -30,6 +31,14 @@ class InventoryRepository( .map { it[characterSheetId] ?: Inventory.empty(characterSheetId) } } + fun equippedItemsFlow( + characterSheetId: String, + ): Flow> { + return inventoryStore.inventories + .map { it[characterSheetId] ?: Inventory.empty(characterSheetId) } + .map { inventory -> inventory.items.filter { item -> item.equipped } } + } + @Throws suspend fun updateInventory( inventory: Inventory, diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/item/InventoryItem.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/item/InventoryItem.kt index 0eb5803..3b9d6f7 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/item/InventoryItem.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/item/InventoryItem.kt @@ -199,7 +199,7 @@ fun InventoryItem( .size(size = 64) .build(), contentScale = ContentScale.Crop, - filterQuality = FilterQuality.Low, + filterQuality = FilterQuality.Medium, contentDescription = null, ) if (item.consumable) { diff --git a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/AlteredCharacterSheet.kt b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/AlteredCharacterSheet.kt index 13e1c3f..3845259 100644 --- a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/AlteredCharacterSheet.kt +++ b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/AlteredCharacterSheet.kt @@ -21,6 +21,8 @@ import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.Characterist import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.CharacteristicId.REFLEX import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.CharacteristicId.STR import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet.CharacteristicId.THUMBNAIL +import com.pixelized.shared.lwa.model.inventory.Inventory +import com.pixelized.shared.lwa.model.inventory.Inventory.Item import com.pixelized.shared.lwa.parser.expression.Expression import com.pixelized.shared.lwa.usecase.CharacterSheetUseCase import com.pixelized.shared.lwa.usecase.ExpressionUseCase