DEADSOFTWARE

Add tools
[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 javax.inject.Inject
13 @Reusable
14 class BlockMapper @Inject constructor() {
16 fun map(key: String, dto: BlockDto): Block {
17 val commonBlockParams = mapCommonParams(key, dto)
19 return when (dto.meta) {
20 "water" -> Water(commonBlockParams, requireNotNull(dto.state))
21 "lava" -> Lava(commonBlockParams, requireNotNull(dto.state))
22 "slab" -> Slab(commonBlockParams, requireNotNull(dto.fullBlock), requireNotNull(dto.otherPart))
23 "none" -> None(commonBlockParams)
24 else -> Normal(commonBlockParams)
25 }
26 }
28 private fun mapCommonParams(key: String, dto: BlockDto): CommonBlockParams {
29 return CommonBlockParams(
30 id = dto.id,
31 key = key,
32 collisionMargins = BlockMargins(
33 left = dto.left,
34 top = dto.top,
35 right = dto.right,
36 bottom = dto.bottom
37 ),
38 hitPoints = dto.hp,
39 dropInfo = mapBlockDropInfo(dto),
40 hasCollision = dto.collision,
41 isBackground = dto.background,
42 isTransparent = dto.transparent,
43 requiresBlock = dto.blockRequired,
44 animationInfo = mapBlockAnimationInfo(dto),
45 texture = getTexture(dto.texture),
46 spriteMargins = BlockMargins(
47 left = dto.spriteLeft,
48 top = dto.spriteTop,
49 right = dto.spriteRight,
50 bottom = dto.spriteBottom,
51 ),
52 toolLevel = dto.toolLevel,
53 toolType = mapToolType(dto),
54 )
55 }
57 private fun mapToolType(dto: BlockDto): Class<out Item.Tool>? {
58 return when(dto.toolType) {
59 "shovel" -> Item.Shovel::class.java
60 "sword" -> Item.Sword::class.java
61 "pickaxe" -> Item.Pickaxe::class.java
62 "axe" -> Item.Axe::class.java
63 "shears" -> Item.Shears::class.java
65 else -> null
66 }
67 }
69 private fun mapBlockDropInfo(dto: BlockDto): BlockDropInfo? {
70 val drop = dto.drop
71 val dropCount = dto.dropCount
73 if (drop == GameItemsHolder.FALLBACK_ITEM_KEY || dropCount == 0) {
74 return null
75 }
77 return BlockDropInfo(
78 itemKey = drop,
79 count = dropCount,
80 )
81 }
83 private fun mapBlockAnimationInfo(dto: BlockDto): BlockAnimationInfo? {
84 if (!dto.animated) {
85 return null
86 }
88 return BlockAnimationInfo(
89 framesCount = dto.frames,
90 )
91 }
93 private fun getTexture(textureName: String): Texture? {
94 if (textureName == GameItemsHolder.FALLBACK_BLOCK_KEY) {
95 return null
96 }
98 return Assets.blockTextures[textureName]
99 }