DEADSOFTWARE

Update version script
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / model / mapper / BlockMapper.kt
1 package ru.deadsoftware.cavedroid.game.model.mapper
3 import com.badlogic.gdx.graphics.Texture
4 import dagger.Reusable
5 import ru.deadsoftware.cavedroid.game.GameItemsHolder
6 import ru.deadsoftware.cavedroid.game.model.block.*
7 import ru.deadsoftware.cavedroid.game.model.block.Block.*
8 import ru.deadsoftware.cavedroid.game.model.dto.BlockDto
9 import ru.deadsoftware.cavedroid.game.model.item.Item
10 import ru.deadsoftware.cavedroid.misc.Assets
11 import ru.deadsoftware.cavedroid.misc.utils.AssetLoader
12 import javax.inject.Inject
14 @Reusable
15 class BlockMapper @Inject constructor(
16 private val assetLoader: AssetLoader,
17 ) {
19 fun map(key: String, dto: BlockDto): Block {
20 val commonBlockParams = mapCommonParams(key, dto)
22 return when (dto.meta) {
23 "water" -> Water(commonBlockParams, requireNotNull(dto.state))
24 "lava" -> Lava(commonBlockParams, requireNotNull(dto.state))
25 "slab" -> Slab(commonBlockParams, requireNotNull(dto.fullBlock), requireNotNull(dto.otherPart))
26 "furnace" -> Furnace(commonBlockParams)
27 "chest" -> Chest(commonBlockParams)
28 "none" -> None(commonBlockParams)
29 else -> Normal(commonBlockParams)
30 }
31 }
33 private fun mapCommonParams(key: String, dto: BlockDto): CommonBlockParams {
34 return CommonBlockParams(
35 key = key,
36 collisionMargins = BlockMargins(
37 left = dto.left,
38 top = dto.top,
39 right = dto.right,
40 bottom = dto.bottom
41 ),
42 hitPoints = dto.hp,
43 dropInfo = mapBlockDropInfo(dto),
44 hasCollision = dto.collision,
45 isBackground = dto.background,
46 isTransparent = dto.transparent,
47 requiresBlock = dto.blockRequired,
48 animationInfo = mapBlockAnimationInfo(dto),
49 texture = getTexture(dto.texture),
50 spriteMargins = BlockMargins(
51 left = dto.spriteLeft,
52 top = dto.spriteTop,
53 right = dto.spriteRight,
54 bottom = dto.spriteBottom,
55 ),
56 toolLevel = dto.toolLevel,
57 toolType = mapToolType(dto),
58 damage = dto.damage,
59 tint = dto.tint,
60 isFallable = dto.fallable,
61 )
62 }
64 private fun mapToolType(dto: BlockDto): Class<out Item.Tool>? {
65 return when(dto.toolType) {
66 "shovel" -> Item.Shovel::class.java
67 "sword" -> Item.Sword::class.java
68 "pickaxe" -> Item.Pickaxe::class.java
69 "axe" -> Item.Axe::class.java
70 "shears" -> Item.Shears::class.java
72 else -> null
73 }
74 }
76 private fun mapBlockDropInfo(dto: BlockDto): BlockDropInfo? {
77 val drop = dto.drop
78 val dropCount = dto.dropCount
80 if (drop == GameItemsHolder.FALLBACK_ITEM_KEY || dropCount == 0) {
81 return null
82 }
84 return BlockDropInfo(
85 itemKey = drop,
86 count = dropCount,
87 )
88 }
90 private fun mapBlockAnimationInfo(dto: BlockDto): BlockAnimationInfo? {
91 if (!dto.animated) {
92 return null
93 }
95 return BlockAnimationInfo(
96 framesCount = dto.frames,
97 )
98 }
100 private fun getTexture(textureName: String): Texture? {
101 if (textureName == GameItemsHolder.FALLBACK_BLOCK_KEY) {
102 return null
105 return Assets.resolveBlockTexture(assetLoader, textureName)