X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=core%2Fsrc%2Fru%2Fdeadsoftware%2Fcavedroid%2Fgame%2FGameItemsHolder.kt;h=23fe4fbe4104977b0f47e1b1523417e7fae2cfc2;hb=121928e90bdfa3a9d9c8bd708b9f8da28d3807c0;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..23fe4fb 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] @@ -50,14 +56,14 @@ class GameItemsHolder @Inject constructor( ?: 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 +72,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 +95,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 { + null + } + } + + fun getCreativeScrollAmount(): Int = itemsMap.size / 8 + + fun getBlocksByType(type: Class): List { + return blocksMap.values.filterIsInstance(type) + } + companion object { private const val TAG = "GameItemsHolder"