X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=core%2Fsrc%2Fru%2Fdeadsoftware%2Fcavedroid%2Fgame%2FGameItemsHolder.kt;h=832845eb0c11f60f2ae6168661d1a99961b28c37;hb=387ad284ceb79b07cba3726fa7350b7e83916815;hp=1fbcd3dbfe8313c8beaccd390b10b89041c01518;hpb=fb34c4a469190cbcd436a10c8cf3102562d97faf;p=cavedroid.git diff --git a/core/src/ru/deadsoftware/cavedroid/game/GameItemsHolder.kt b/core/src/ru/deadsoftware/cavedroid/game/GameItemsHolder.kt index 1fbcd3d..832845e 100644 --- a/core/src/ru/deadsoftware/cavedroid/game/GameItemsHolder.kt +++ b/core/src/ru/deadsoftware/cavedroid/game/GameItemsHolder.kt @@ -3,13 +3,18 @@ package ru.deadsoftware.cavedroid.game import com.badlogic.gdx.Gdx import kotlinx.serialization.json.Json import ru.deadsoftware.cavedroid.game.model.block.Block +import ru.deadsoftware.cavedroid.game.model.craft.CraftingRecipe +import ru.deadsoftware.cavedroid.game.model.craft.CraftingResult import ru.deadsoftware.cavedroid.game.model.dto.BlockDto +import ru.deadsoftware.cavedroid.game.model.dto.CraftingDto import ru.deadsoftware.cavedroid.game.model.dto.GameItemsDto import ru.deadsoftware.cavedroid.game.model.dto.ItemDto +import ru.deadsoftware.cavedroid.game.model.item.InventoryItem import ru.deadsoftware.cavedroid.game.model.item.Item import ru.deadsoftware.cavedroid.game.model.mapper.BlockMapper import ru.deadsoftware.cavedroid.game.model.mapper.ItemMapper import ru.deadsoftware.cavedroid.misc.utils.AssetLoader +import java.util.LinkedList import javax.inject.Inject @GameScope @@ -23,6 +28,7 @@ class GameItemsHolder @Inject constructor( private val blocksMap = LinkedHashMap() private val itemsMap = LinkedHashMap() + private val craftingRecipes = LinkedList() lateinit var fallbackBlock: Block private set @@ -67,6 +73,22 @@ class GameItemsHolder @Inject constructor( ?: throw IllegalArgumentException("Fallback item key '$FALLBACK_ITEM_KEY' not found") } + private fun loadCraftingRecipes() { + val jsonString = assetLoader.getAssetHandle("json/crafting.json").readString() + val jsonMap = JsonFormat.decodeFromString>(jsonString) + + if (jsonMap.isNotEmpty() && itemsMap.isEmpty()) { + throw IllegalStateException("items should be loaded before crafting") + } + + jsonMap.forEach { (key, value) -> + craftingRecipes += CraftingRecipe( + input = value.input.map(::getItem), + output = CraftingResult(getItem(key), value.count) + ) + } + } + fun initialize() { if (_initialized) { Gdx.app.debug(TAG, "Attempted to init when already initialized") @@ -80,6 +102,8 @@ class GameItemsHolder @Inject constructor( loadItems(gameItemsDto.items) _initialized = true + + loadCraftingRecipes() } private fun Map.getOrFallback(key: String, fallback: T, lazyErrorMessage: () -> String): T { @@ -106,6 +130,14 @@ class GameItemsHolder @Inject constructor( } } + fun craftItem(input: List): InventoryItem? { + return try { + craftingRecipes.first { rec -> rec.input == input}.output.toInventoryItem() + } catch (e: NoSuchElementException) { + null + } + } + fun getAllItems(): Collection { return itemsMap.values }