diff --git a/core/src/ru/deadsoftware/cavedroid/game/GameItemsHolder.kt b/core/src/ru/deadsoftware/cavedroid/game/GameItemsHolder.kt
index 73da0c2cf9ba63ef0540f5af7def55dfe5c73ba4..7a7ccabb3651cc27b61996a67da991d9ee3f50db 100644 (file)
@GameScope
class GameItemsHolder @Inject constructor(
+ private val assetLoader: AssetLoader,
private val blockMapper: BlockMapper,
private val itemMapper: ItemMapper,
) {
private val blocksMap = LinkedHashMap<String, Block>()
private val itemsMap = LinkedHashMap<String, Item>()
- 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<String, BlockDto>) {
dtoMap.forEach { (key, dto) ->
blocksMap[key] = blockMapper.map(key, dto)
+ .apply(Block::initialize)
}
fallbackBlock = blocksMap[FALLBACK_BLOCK_KEY]
}
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<GameItemsDto>(jsonString)
loadBlocks(gameItemsDto.blocks)
loadItems(gameItemsDto.items)
}
private fun <T> Map<String, T>.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
}
}
+ fun getAllItems(): Collection<Item> {
+ return itemsMap.values
+ }
+
+ fun getItemFromCreativeInventory(position: Int): Item {
+ return if (position in itemsMap.values.indices) {
+ itemsMap.values.elementAt(position)
+ } else {
+ fallbackItem
+ }
+ }
+
+ fun getCreativeScrollAmount(): Int = itemsMap.size / 8
+
+ fun <T : Block> getBlocksByType(type: Class<T>): List<T> {
+ return blocksMap.values.filterIsInstance(type)
+ }
+
companion object {
private const val TAG = "GameItemsHolder"