diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts
index 85dcac3..f7afba7 100644
--- a/composeApp/build.gradle.kts
+++ b/composeApp/build.gradle.kts
@@ -96,3 +96,7 @@ compose.desktop {
}
}
}
+
+compose.resources {
+ generateResClass = auto
+}
\ No newline at end of file
diff --git a/composeApp/src/commonMain/composeResources/drawable/ic_copper_32px.png b/composeApp/src/commonMain/composeResources/drawable/ic_copper_32px.png
new file mode 100644
index 0000000..d5850ed
Binary files /dev/null and b/composeApp/src/commonMain/composeResources/drawable/ic_copper_32px.png differ
diff --git a/composeApp/src/commonMain/composeResources/drawable/ic_description_24dp.xml b/composeApp/src/commonMain/composeResources/drawable/ic_description_24dp.xml
new file mode 100644
index 0000000..7f041a7
--- /dev/null
+++ b/composeApp/src/commonMain/composeResources/drawable/ic_description_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/composeApp/src/commonMain/composeResources/drawable/ic_gold_32px.png b/composeApp/src/commonMain/composeResources/drawable/ic_gold_32px.png
new file mode 100644
index 0000000..602727b
Binary files /dev/null and b/composeApp/src/commonMain/composeResources/drawable/ic_gold_32px.png differ
diff --git a/composeApp/src/commonMain/composeResources/drawable/ic_money_bag_24dp.xml b/composeApp/src/commonMain/composeResources/drawable/ic_money_bag_24dp.xml
new file mode 100644
index 0000000..14f4f40
--- /dev/null
+++ b/composeApp/src/commonMain/composeResources/drawable/ic_money_bag_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/composeApp/src/commonMain/composeResources/drawable/ic_remove_24dp.xml b/composeApp/src/commonMain/composeResources/drawable/ic_remove_24dp.xml
new file mode 100644
index 0000000..2708e4f
--- /dev/null
+++ b/composeApp/src/commonMain/composeResources/drawable/ic_remove_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/composeApp/src/commonMain/composeResources/drawable/ic_silver_32px.png b/composeApp/src/commonMain/composeResources/drawable/ic_silver_32px.png
new file mode 100644
index 0000000..6eb1215
Binary files /dev/null and b/composeApp/src/commonMain/composeResources/drawable/ic_silver_32px.png differ
diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml
index 1824163..b1cf9d7 100644
--- a/composeApp/src/commonMain/composeResources/values/strings.xml
+++ b/composeApp/src/commonMain/composeResources/values/strings.xml
@@ -3,6 +3,28 @@
▸
+ Écu
+ Écusson
+ Liard
+
+
+ - Écu
+ - Écu
+ - Écus
+
+
+
+ - Écusson
+ - Écusson
+ - Écussons
+
+
+
+ - Liard
+ - Liard
+ - Liards
+
+
La feuille de personnage est introuvable
Ok
@@ -162,6 +184,9 @@
Supprimer la feuille de personnage
Êtes-vous sûr de vouloir supprimer "%1$s" ?
+ Ajouter à la bourse
+ Retirer de la bourse
+
Les caractéristiques constituent les aptitudes innées d’un personnage comme son intelligence, sa force, son charisme, etc. Elles ne sont pas acquises, mais peuvent être parfois augmentées par un entraînement ou une utilisation réussie. Les caractéristiques des humains normaux varient de 2 (niveau extrêmement bas) à 20 (maximum du potentiel humain), avec une moyenne de 10 ou 11. Plus une caractéristique est élevée plus le personnage est puissant dans cette aptitude.\nÀ la création de votre personnage, répartissez les valeurs suivantes dans les différentes caractéristiques : 15, 15, 13, 11, 10, 9 et 7.
La Force représente essentiellement la puissance musculaire du personnage. Elle ne décrit pas nécessairement la masse musculaire brute, mais l’efficacité avec laquelle le personnage exerce ses muscles pour accomplir des actions physiques pénibles.\n\n- Bonus aux dégats\n- Réflexe\n- Athlétisme\n- Lancer\n- Saisie
La Constitution est une mesure de la ténacité et de la résilience du personnage. Elle sert à résister aux maladies. Mais son aspect le plus important réside dans la détermination du nombre de dommages qu’un personnage peut supporter avant de succomber.\n\n- Point de vie maximum\n- Athlétisme\n- Acrobatie
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt
index c863b82..2473584 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt
@@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel
import com.pixelized.desktop.lwa.repository.alteration.AlterationRepository
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.desktop.lwa.repository.network.NetworkRepository
import com.pixelized.desktop.lwa.repository.settings.SettingsRepository
@@ -19,6 +20,7 @@ import kotlinx.coroutines.flow.onEach
class DataSyncViewModel(
private val characterRepository: CharacterSheetRepository,
+ private val inventoryRepository: InventoryRepository,
private val alterationRepository: AlterationRepository,
private val itemRepository: ItemRepository,
private val campaignRepository: CampaignRepository,
@@ -65,6 +67,9 @@ class DataSyncViewModel(
characterRepository.updateCharacterSheet(
characterSheetId = characterSheetId,
)
+ inventoryRepository.updateInventoryFlow(
+ characterSheetId = characterSheetId,
+ )
}
}
.launchIn(this)
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt
index 57bff04..520c14d 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/Module.kt
@@ -8,6 +8,8 @@ import com.pixelized.desktop.lwa.repository.campaign.CampaignRepository
import com.pixelized.desktop.lwa.repository.campaign.CampaignStore
import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetRepository
import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetStore
+import com.pixelized.desktop.lwa.repository.inventory.InventoryRepository
+import com.pixelized.desktop.lwa.repository.inventory.InventoryStore
import com.pixelized.desktop.lwa.repository.item.ItemRepository
import com.pixelized.desktop.lwa.repository.item.ItemStore
import com.pixelized.desktop.lwa.repository.network.NetworkRepository
@@ -23,13 +25,17 @@ import com.pixelized.desktop.lwa.ui.composable.character.characteristic.Characte
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogViewModel
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedDialogFactory
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedDialogViewModel
+import com.pixelized.desktop.lwa.ui.composable.character.purse.PurseDialogFactory
+import com.pixelized.desktop.lwa.ui.composable.character.purse.PurseDialogViewModel
import com.pixelized.desktop.lwa.ui.overlay.portrait.PortraitOverlayViewModel
import com.pixelized.desktop.lwa.ui.overlay.roll.RollViewModel
import com.pixelized.desktop.lwa.ui.screen.campaign.network.NetworkFactory
import com.pixelized.desktop.lwa.ui.screen.campaign.network.NetworkViewModel
import com.pixelized.desktop.lwa.ui.screen.campaign.player.CharacterRibbonFactory
-import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailFactory
-import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailViewModel
+import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.sheet.CharacterDetailSheetFactory
+import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailPanelViewModel
+import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.header.CharacterDetailHeaderFactory
+import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.inventory.CharacterDetailInventoryFactory
import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.npc.NpcRibbonViewModel
import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.player.PlayerRibbonViewModel
import com.pixelized.desktop.lwa.ui.screen.campaign.text.CampaignChatViewModel
@@ -112,6 +118,7 @@ val storeDependencies
singleOf(::CampaignStore)
singleOf(::TagStore)
singleOf(::ItemStore)
+ singleOf(::InventoryStore)
}
val repositoryDependencies
@@ -124,6 +131,7 @@ val repositoryDependencies
singleOf(::CampaignRepository)
singleOf(::TagRepository)
singleOf(::ItemRepository)
+ singleOf(::InventoryRepository)
}
val factoryDependencies
@@ -135,10 +143,13 @@ val factoryDependencies
factoryOf(::SettingsFactory)
factoryOf(::CampaignJsonFactory)
factoryOf(::CharacterRibbonFactory)
- factoryOf(::CharacterDetailFactory)
+ factoryOf(::CharacterDetailHeaderFactory)
+ factoryOf(::CharacterDetailSheetFactory)
+ factoryOf(::CharacterDetailInventoryFactory)
factoryOf(::CharacterSheetCharacteristicDialogFactory)
factoryOf(::CharacterSheetDiminishedDialogFactory)
factoryOf(::CharacterSheetAlterationDialogFactory)
+ factoryOf(::PurseDialogFactory)
factoryOf(::TextMessageFactory)
factoryOf(::LevelUpFactory)
factoryOf(::GMTagFactory)
@@ -160,10 +171,11 @@ val viewModelDependencies
viewModelOf(::NetworkViewModel)
viewModelOf(::PlayerRibbonViewModel)
viewModelOf(::NpcRibbonViewModel)
- viewModelOf(::CharacterDetailViewModel)
+ viewModelOf(::CharacterDetailPanelViewModel)
viewModelOf(::CharacterSheetDiminishedDialogViewModel)
viewModelOf(::CharacterSheetCharacteristicDialogViewModel)
viewModelOf(::CharacterSheetAlterationDialogViewModel)
+ viewModelOf(::PurseDialogViewModel)
viewModelOf(::CampaignChatViewModel)
viewModelOf(::SettingsViewModel)
viewModelOf(::LevelUpViewModel)
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClient.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClient.kt
index 2e75a8a..6d70e5d 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClient.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClient.kt
@@ -3,6 +3,8 @@ package com.pixelized.desktop.lwa.network
import com.pixelized.shared.lwa.model.alteration.AlterationJson
import com.pixelized.shared.lwa.model.campaign.CampaignJson
import com.pixelized.shared.lwa.model.characterSheet.CharacterSheetJson
+import com.pixelized.shared.lwa.model.inventory.Inventory
+import com.pixelized.shared.lwa.model.inventory.InventoryJson
import com.pixelized.shared.lwa.model.item.ItemJson
import com.pixelized.shared.lwa.model.tag.TagJson
import com.pixelized.shared.lwa.protocol.rest.APIResponse
@@ -102,6 +104,21 @@ interface LwaClient {
itemId: String,
): APIResponse
+ // Inventory
+
+ suspend fun getInventory(
+ characterSheetId: String,
+ ): APIResponse
+
+ suspend fun putInventory(
+ json: InventoryJson,
+ create: Boolean,
+ ): APIResponse
+
+ suspend fun deleteInventory(
+ characterSheetId: String,
+ ): APIResponse
+
// Tags
suspend fun getAlterationTags(): APIResponse>
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClientImpl.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClientImpl.kt
index 26769f8..0e878bf 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClientImpl.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClientImpl.kt
@@ -4,6 +4,7 @@ import com.pixelized.desktop.lwa.repository.settings.SettingsRepository
import com.pixelized.shared.lwa.model.alteration.AlterationJson
import com.pixelized.shared.lwa.model.campaign.CampaignJson
import com.pixelized.shared.lwa.model.characterSheet.CharacterSheetJson
+import com.pixelized.shared.lwa.model.inventory.InventoryJson
import com.pixelized.shared.lwa.model.item.ItemJson
import com.pixelized.shared.lwa.model.tag.TagJson
import com.pixelized.shared.lwa.protocol.rest.APIResponse
@@ -175,6 +176,27 @@ class LwaClientImpl(
.delete("$root/item/delete?itemId=$itemId")
.body()
+ @Throws
+ override suspend fun getInventory(characterSheetId: String): APIResponse = client
+ .get("$root/inventory/detail?characterSheetId=$characterSheetId")
+ .body()
+
+ @Throws
+ override suspend fun putInventory(
+ inventory: InventoryJson,
+ create: Boolean,
+ ): APIResponse = client
+ .put("$root/inventory/update?create=$create") {
+ contentType(ContentType.Application.Json)
+ setBody(inventory)
+ }
+ .body>()
+
+ @Throws
+ override suspend fun deleteInventory(characterSheetId: String): APIResponse = client
+ .delete("$root/inventory/delete?characterSheetId=$characterSheetId")
+ .body()
+
@Throws
override suspend fun getAlterationTags(): APIResponse> = client
.get("$root/tag/alteration")
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
new file mode 100644
index 0000000..d6f0db2
--- /dev/null
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/inventory/InventoryRepository.kt
@@ -0,0 +1,47 @@
+package com.pixelized.desktop.lwa.repository.inventory
+
+import com.pixelized.shared.lwa.model.inventory.Inventory
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.map
+
+class InventoryRepository(
+ private val inventoryStore: InventoryStore,
+) {
+ val inventoryFlow get() = inventoryStore.inventories
+
+ suspend fun updateInventoryFlow(characterSheetId: String) {
+ inventoryStore.updateInventoryFlow(characterSheetId = characterSheetId)
+ }
+
+ fun inventory(
+ characterSheetId: String?,
+ ): Inventory? {
+ return inventoryFlow.value[characterSheetId]
+ }
+
+ fun inventoryFlow(
+ characterSheetId: String?,
+ ): Flow {
+ return inventoryFlow.map { it[characterSheetId] }
+ }
+
+ @Throws
+ suspend fun updateInventory(
+ inventory: Inventory,
+ create: Boolean,
+ ) {
+ inventoryStore.putInventory(
+ inventory = inventory,
+ create = create,
+ )
+ }
+
+ @Throws
+ suspend fun deleteItem(
+ characterSheetId: String,
+ ) {
+ inventoryStore.deleteInventory(
+ characterSheetId = characterSheetId,
+ )
+ }
+}
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/inventory/InventoryStore.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/inventory/InventoryStore.kt
new file mode 100644
index 0000000..763c243
--- /dev/null
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/inventory/InventoryStore.kt
@@ -0,0 +1,107 @@
+package com.pixelized.desktop.lwa.repository.inventory
+
+import com.pixelized.desktop.lwa.network.LwaClient
+import com.pixelized.desktop.lwa.repository.network.NetworkRepository
+import com.pixelized.shared.lwa.model.inventory.Inventory
+import com.pixelized.shared.lwa.model.inventory.factory.InventoryJsonFactory
+import com.pixelized.shared.lwa.protocol.websocket.ApiSynchronisation
+import com.pixelized.shared.lwa.protocol.websocket.SocketMessage
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.update
+import kotlinx.coroutines.launch
+
+class InventoryStore(
+ private val network: NetworkRepository,
+ private val factory: InventoryJsonFactory,
+ private val client: LwaClient,
+) {
+ private val _inventories = MutableStateFlow