DEADSOFTWARE

Create new game items holder
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / model / dto / GameItemsDto.kt
1 package ru.deadsoftware.cavedroid.game.model.dto
3 import kotlinx.serialization.SerialName
4 import kotlinx.serialization.Serializable
5 import kotlinx.serialization.json.*
7 @Serializable
8 data class GameItemsDto(
9 @SerialName("blocks") val blocks: Map<String, BlockDto>,
10 @SerialName("items") val items: Map<String, ItemDto>,
11 ) {
12 object GameItemsDtoJsonSerializer : JsonTransformingSerializer<GameItemsDto>(GameItemsDto.serializer()) {
13 private val defaultBlockValuesEqualKeyFieldNames = listOf("drop", "texture")
14 private val defaultItemValuesEqualKeyFieldNames = listOf("name", "texture")
16 override fun transformDeserialize(element: JsonElement): JsonElement {
17 val root = element.jsonObject
18 val blocks = root["blocks"]!!.jsonObject
19 val items = root["items"]!!.jsonObject
21 return buildJsonObject {
22 putJsonObject("blocks") {
23 blocks.forEach { (key, blockObj) ->
24 putJsonObject(key) {
25 defaultBlockValuesEqualKeyFieldNames.forEach { fieldName ->
26 put(fieldName, key)
27 }
28 blockObj.jsonObject.forEach { (prop, propValue) ->
29 put(prop, propValue)
30 }
31 }
32 }
33 }
35 putJsonObject("items") {
36 items.forEach { (key, itemObj) ->
37 putJsonObject(key) {
38 defaultItemValuesEqualKeyFieldNames.forEach { fieldName ->
39 put(fieldName, key)
40 }
41 itemObj.jsonObject.forEach { (prop, propValue) ->
42 put(prop, propValue)
43 }
44 }
45 }
46 }
47 }
48 }
49 }
50 }