diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt index 202a001e..9dd86fb9 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt @@ -66,7 +66,7 @@ object Starbound { if (input[0] == '/') return input - return "$readingFolder/$input" + return assetStringInterner.intern("$readingFolder/$input") } fun readingFolderTransformerNullable(input: String?): String? { @@ -477,8 +477,7 @@ object Starbound { } private fun loadItemDefinitions(callback: (String) -> Unit) { - //val files = listOf(".item", ".currency", ".head", ".chest", ".legs") - val files = listOf(".item", ".currency") + val files = listOf(".item", ".currency", ".head", ".chest", ".legs") for (fs in fileSystems) { for (listedFile in fs.explore().filter { it.isFile }.filter { f -> files.any { f.name.endsWith(it) } }) { diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/ItemDefinition.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/ItemDefinition.kt index ef7c1a8f..53f6f747 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/ItemDefinition.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/ItemDefinition.kt @@ -1,10 +1,15 @@ package ru.dbotthepony.kstarbound.defs.item import com.google.gson.GsonBuilder +import com.google.gson.TypeAdapter +import com.google.gson.stream.JsonReader +import com.google.gson.stream.JsonToken +import com.google.gson.stream.JsonWriter import ru.dbotthepony.kstarbound.Starbound import ru.dbotthepony.kstarbound.io.json.KConcreteTypeAdapter import ru.dbotthepony.kstarbound.io.json.asJsonObject import ru.dbotthepony.kstarbound.io.json.asList +import ru.dbotthepony.kstarbound.io.json.ifString import ru.dbotthepony.kstarbound.registerTypeAdapter import ru.dbotthepony.kvector.vector.ndouble.Vector2d @@ -244,14 +249,15 @@ data class ItemDefinition( data class ArmorFrames( val body: String, - val backSleeve: String, - val frontSleeve: String, + val backSleeve: String?, + val frontSleeve: String?, ) data class StatusEffect( val levelFunction: String, val stat: String, - val baseMultiplier: Double, + val baseMultiplier: Double = 1.0, + val amount: Double = 0.0, ) companion object { @@ -319,14 +325,16 @@ data class ItemDefinition( val ARMOR_FRAMES_ADAPTER = KConcreteTypeAdapter.Builder(ArmorFrames::class) .auto(ArmorFrames::body, transformer = Starbound::readingFolderTransformer) - .auto(ArmorFrames::backSleeve, transformer = Starbound::readingFolderTransformer) - .auto(ArmorFrames::frontSleeve, transformer = Starbound::readingFolderTransformer) + .auto(ArmorFrames::backSleeve, transformer = Starbound::readingFolderTransformerNullable) + .auto(ArmorFrames::frontSleeve, transformer = Starbound::readingFolderTransformerNullable) .build() + .ifString { ArmorFrames(Starbound.readingFolderTransformer(it), null, null) } val STATUS_EFFECT_ADAPTER = KConcreteTypeAdapter.Builder(StatusEffect::class) .auto(StatusEffect::levelFunction) .auto(StatusEffect::stat) .auto(StatusEffect::baseMultiplier) + .auto(StatusEffect::amount) .build() fun registerGson(gsonBuilder: GsonBuilder) { diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/Ext.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/Ext.kt index 100158f6..57e537ed 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/Ext.kt @@ -2,6 +2,7 @@ package ru.dbotthepony.kstarbound.io.json import com.google.gson.TypeAdapter import com.google.gson.stream.JsonReader +import com.google.gson.stream.JsonToken import com.google.gson.stream.JsonWriter fun TypeAdapter.transformRead(transformer: (T) -> T): TypeAdapter { @@ -39,3 +40,19 @@ fun TypeAdapter.transform(transformRead: (T) -> T, transformWrite: (T) -> } } } + +fun TypeAdapter.ifString(reader: (String) -> T): TypeAdapter { + return object : TypeAdapter() { + override fun write(out: JsonWriter, value: T) { + return this@ifString.write(out, value) + } + + override fun read(`in`: JsonReader): T { + if (`in`.peek() == JsonToken.STRING) { + return reader(`in`.nextString()) + } + + return this@ifString.read(`in`) + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/KConcreteTypeAdapter.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/KConcreteTypeAdapter.kt index 69c30fac..4b7c32cf 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/KConcreteTypeAdapter.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/KConcreteTypeAdapter.kt @@ -360,7 +360,7 @@ class KConcreteTypeAdapter private constructor( private val types = ArrayList>() /** - * Принимает ли класс *последним* аргументом JSON объект + * Принимает ли класс *последним* аргументом JSON структуру * * На самом деле, JSON "заворачивается" в [ImmutableMap], или [ImmutableList] если указано [asList]/[inputAsList] *