diff --git a/core/src/ru/deadsoftware/cavedroid/game/GameItemsHolder.kt b/core/src/ru/deadsoftware/cavedroid/game/GameItemsHolder.kt
index 73da0c2cf9ba63ef0540f5af7def55dfe5c73ba4..058e84d7f283a8ab47dc03df09d48a997cb3824e 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]
?: 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
}
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 <T : Block> getBlocksByType(type: Class<T>): List<T> {
+ return blocksMap.values.filterIsInstance(type)
+ }
+
companion object {
private const val TAG = "GameItemsHolder"