X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=core%2Fsrc%2Fru%2Fdeadsoftware%2Fcavedroid%2Fgame%2FGameItemsHolder.kt;h=1fbcd3dbfe8313c8beaccd390b10b89041c01518;hb=969518fd0bbde98b81c885c62f973d74ff5f61bb;hp=73da0c2cf9ba63ef0540f5af7def55dfe5c73ba4;hpb=63ffd8af5e9788f36fc75b6d5c29ae525eb74692;p=cavedroid.git diff --git a/core/src/ru/deadsoftware/cavedroid/game/GameItemsHolder.kt b/core/src/ru/deadsoftware/cavedroid/game/GameItemsHolder.kt index 73da0c2..1fbcd3d 100644 --- a/core/src/ru/deadsoftware/cavedroid/game/GameItemsHolder.kt +++ b/core/src/ru/deadsoftware/cavedroid/game/GameItemsHolder.kt @@ -14,6 +14,7 @@ import javax.inject.Inject @GameScope class GameItemsHolder @Inject constructor( + private val assetLoader: AssetLoader, private val blockMapper: BlockMapper, private val itemMapper: ItemMapper, ) { @@ -23,14 +24,19 @@ class GameItemsHolder @Inject constructor( private val blocksMap = LinkedHashMap() private val itemsMap = LinkedHashMap() - private lateinit var fallbackBlock: Block - private lateinit var fallbackItem: Item - + lateinit var fallbackBlock: Block + private set + lateinit var fallbackItem: Item + private set + init { + initialize() + } private fun loadBlocks(dtoMap: Map) { dtoMap.forEach { (key, dto) -> blocksMap[key] = blockMapper.map(key, dto) + .apply(Block::initialize) } fallbackBlock = blocksMap[FALLBACK_BLOCK_KEY] @@ -43,21 +49,32 @@ 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") } - fun initialize(assetLoader: AssetLoader) { + fun initialize() { if (_initialized) { Gdx.app.debug(TAG, "Attempted to init when already initialized") return } val jsonString = assetLoader.getAssetHandle("json/game_items.json").readString() - val gameItemsDto = JsonFormat.decodeFromString(GameItemsDto.GameItemsDtoJsonSerializer, jsonString) + val gameItemsDto = JsonFormat.decodeFromString(jsonString) loadBlocks(gameItemsDto.blocks) loadItems(gameItemsDto.items) @@ -66,6 +83,10 @@ class GameItemsHolder @Inject constructor( } private fun Map.getOrFallback(key: String, fallback: T, lazyErrorMessage: () -> String): T { + if (!_initialized) { + throw IllegalStateException("GameItemsHolder was not initialized before use") + } + val t = this[key] ?: run { Gdx.app.error(TAG, lazyErrorMessage.invoke()) return fallback @@ -85,6 +106,24 @@ class GameItemsHolder @Inject constructor( } } + fun getAllItems(): Collection { + return itemsMap.values + } + + fun getItemFromCreativeInventory(position: Int): Item { + return if (position in itemsMap.values.indices) { + itemsMap.values.elementAt(position) + } else { + fallbackItem + } + } + + fun getMaxCreativeScrollAmount(): Int = itemsMap.size / 8 + + fun getBlocksByType(type: Class): List { + return blocksMap.values.filterIsInstance(type) + } + companion object { private const val TAG = "GameItemsHolder"