X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;ds=sidebyside;f=core%2Fsrc%2Fru%2Fdeadsoftware%2Fcavedroid%2Fgame%2FGameItemsHolder.kt;h=832845eb0c11f60f2ae6168661d1a99961b28c37;hb=387ad284ceb79b07cba3726fa7350b7e83916815;hp=23fe4fbe4104977b0f47e1b1523417e7fae2cfc2;hpb=121928e90bdfa3a9d9c8bd708b9f8da28d3807c0;p=cavedroid.git diff --git a/core/src/ru/deadsoftware/cavedroid/game/GameItemsHolder.kt b/core/src/ru/deadsoftware/cavedroid/game/GameItemsHolder.kt index 23fe4fb..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 @@ -49,13 +55,40 @@ class GameItemsHolder @Inject constructor( } dtoMap.forEach { (key, dto) -> - itemsMap[key] = itemMapper.map(key, dto, blocksMap[key]) + try { + itemsMap[key] = itemMapper.map( + key = key, + dto = dto, + block = blocksMap[key], + slabTopBlock = blocksMap[dto.topSlabBlock] as? Block.Slab, + slabBottomBlock = blocksMap[dto.bottomSlabBlock] as? Block.Slab + ) + } catch (e: Exception) { + Gdx.app.error(TAG, "Failed to map item $key. Reason: ${e.message}") + e.printStackTrace() + } } fallbackItem = itemsMap[FALLBACK_ITEM_KEY] ?: 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") @@ -69,6 +102,8 @@ class GameItemsHolder @Inject constructor( loadItems(gameItemsDto.items) _initialized = true + + loadCraftingRecipes() } private fun Map.getOrFallback(key: String, fallback: T, lazyErrorMessage: () -> String): T { @@ -95,19 +130,27 @@ 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 } - fun getItemFromCreativeInventory(position: Int): Item? { + fun getItemFromCreativeInventory(position: Int): Item { return if (position in itemsMap.values.indices) { itemsMap.values.elementAt(position) } else { - null + fallbackItem } } - fun getCreativeScrollAmount(): Int = itemsMap.size / 8 + fun getMaxCreativeScrollAmount(): Int = itemsMap.size / 8 fun getBlocksByType(type: Class): List { return blocksMap.values.filterIsInstance(type)