From 97e28ca0ee1e069745611d80ec1fd91a5f44a686 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Tue, 22 Feb 2022 09:22:43 +0700 Subject: [PATCH] Dungeon json parsing --- .../ru/dbotthepony/kvector/vector/Color.kt | 2 + .../kotlin/ru/dbotthepony/kstarbound/Main.kt | 2 + .../ru/dbotthepony/kstarbound/Starbound.kt | 7 +- .../defs/projectile/Configurable.kt | 2 +- .../kstarbound/defs/world/SkyParameters.kt | 161 ++++++++++++++++++ .../kstarbound/defs/world/SkyType.kt | 24 +++ .../kstarbound/defs/world/WorldProperties.kt | 30 ++++ .../defs/world/dungeon/BeamUpRule.kt | 25 +++ .../defs/world/dungeon/Configurable.kt | 57 +++++++ .../defs/world/dungeon/Configured.kt | 5 + .../defs/world/dungeon/DungeonType.kt | 24 +++ 11 files changed, 337 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/SkyParameters.kt create mode 100644 src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/SkyType.kt create mode 100644 src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/WorldProperties.kt create mode 100644 src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/dungeon/BeamUpRule.kt create mode 100644 src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/dungeon/Configurable.kt create mode 100644 src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/dungeon/Configured.kt create mode 100644 src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/dungeon/DungeonType.kt diff --git a/src/kvector/kotlin/ru/dbotthepony/kvector/vector/Color.kt b/src/kvector/kotlin/ru/dbotthepony/kvector/vector/Color.kt index d27ed965..e101be73 100644 --- a/src/kvector/kotlin/ru/dbotthepony/kvector/vector/Color.kt +++ b/src/kvector/kotlin/ru/dbotthepony/kvector/vector/Color.kt @@ -21,6 +21,8 @@ class Color(r: Float, g: Float, b: Float, a: Float = 1f) : Vector4f(r, g, b, a) } companion object { + val BLACK = Color(0f, 0f, 0f) + val TRANSLUCENT = Color(0f, 0f, 0f, 0f) val WHITE = Color(1f, 1f, 1f) val RED = Color(1f, 0f, 0f) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/Main.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/Main.kt index f840037a..2ccd24b0 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/Main.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/Main.kt @@ -1,5 +1,6 @@ package ru.dbotthepony.kstarbound +import com.google.gson.JsonObject import org.apache.logging.log4j.LogManager import org.lwjgl.Version import org.lwjgl.glfw.GLFW.glfwSetWindowShouldClose @@ -9,6 +10,7 @@ import ru.dbotthepony.kbox2d.collision.shapes.PolygonShape import ru.dbotthepony.kstarbound.client.StarboundClient import ru.dbotthepony.kstarbound.defs.TileDefinition import ru.dbotthepony.kstarbound.defs.projectile.ProjectilePhysics +import ru.dbotthepony.kstarbound.defs.world.dungeon.DungeonWorldDef import ru.dbotthepony.kstarbound.world.CHUNK_SIZE_FF import ru.dbotthepony.kstarbound.world.Chunk import ru.dbotthepony.kstarbound.world.ChunkPos diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt index 1816708c..eeadb111 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt @@ -7,6 +7,9 @@ import ru.dbotthepony.kstarbound.api.PhysicalFS import ru.dbotthepony.kstarbound.api.getPathFolder import ru.dbotthepony.kstarbound.defs.* import ru.dbotthepony.kstarbound.defs.projectile.* +import ru.dbotthepony.kstarbound.defs.world.SkyParameters +import ru.dbotthepony.kstarbound.defs.world.SkyType +import ru.dbotthepony.kstarbound.defs.world.dungeon.DungeonWorldDef import ru.dbotthepony.kstarbound.io.* import ru.dbotthepony.kstarbound.math.* import ru.dbotthepony.kvector.util2d.AABB @@ -54,7 +57,9 @@ object Starbound : IVFS { .registerTypeAdapter(Vector2i::class.java, Vector2iTypeAdapter) .registerTypeAdapter(Poly::class.java, PolyTypeAdapter) - .also(ConfigurableProjectile::regisyterAdapters) + .also(ConfigurableProjectile::registerGson) + .also(SkyParameters::registerGson) + .also(DungeonWorldDef::registerGson) .registerTypeAdapter(DamageType::class.java, CustomEnumTypeAdapter(DamageType.values()).nullSafe()) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/projectile/Configurable.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/projectile/Configurable.kt index 887fb058..34eff4f7 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/projectile/Configurable.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/projectile/Configurable.kt @@ -118,7 +118,7 @@ class ConfigurableProjectile : ConfigurableDefinition() { + override fun write(out: JsonWriter?, value: SkyColoringManifold?) { + TODO("Not yet implemented") + } + + override fun read(reader: JsonReader): SkyColoringManifold { + val instance = SkyColoringManifold() + reader.beginArray() + instance.initial = ColorTypeAdapter.read(reader) + instance.final = ColorTypeAdapter.read(reader) + reader.endArray() + return instance + } + } + } +} + +class SkyColoring { + var mainColor = Color.TRANSLUCENT + + var morningColors = SkyColoringManifold() + var dayColors = SkyColoringManifold() + var eveningColors = SkyColoringManifold() + var nightColors = SkyColoringManifold() + + var morningLightColor = Color.TRANSLUCENT + var dayLightColor = Color.TRANSLUCENT + var eveningLightColor = Color.TRANSLUCENT + var nightLightColor = Color.TRANSLUCENT + + companion object { + val ADAPTER = KTypeAdapter(::SkyColoring, + SkyColoring::mainColor, + SkyColoring::morningColors, + SkyColoring::dayColors, + SkyColoring::eveningColors, + SkyColoring::nightColors, + SkyColoring::morningLightColor, + SkyColoring::dayLightColor, + SkyColoring::eveningLightColor, + SkyColoring::nightLightColor, + ) + } +} + +class SkySatellite { + class Layer { + private inner class ImageDelegate : ReadWriteProperty { + private var value: String? = null + + override fun getValue(thisRef: Layer, property: KProperty<*>): String { + return value ?: throw IllegalStateException("Property is not initialized") + } + + override fun setValue(thisRef: Layer, property: KProperty<*>, value: String) { + val split = value.split('?') + this.value = split[0] + + for (prop in 1 until split.size) { + val splitProp = split[prop].split('=') + + if (splitProp.size == 1) { + throw IllegalArgumentException("Invalid property: ${split[prop]}, near $prop, in $value") + } + + when (val propName = splitProp[0]) { + "hueshift" -> hueShift = splitProp[1].toInt() + "addmask" -> mask = splitProp[1] + else -> LOGGER.warn("Unknown property $propName near $prop in $value") + } + } + } + } + + var scale = 1.0 + var image by ImageDelegate() + var hueShift = 0 + var mask: String? = null + } + + var pos = Vector2d.ZERO + var layers = Array(0) { Layer() } + + companion object { + val ADAPTER = KTypeAdapter(::SkySatellite, + SkySatellite::pos, + SkySatellite::layers, + ) + + val LAYER_ADAPTER = KTypeAdapter(::Layer, + Layer::scale, + Layer::image, + Layer::hueShift, + Layer::mask, + ) + + private val LOGGER = LogManager.getLogger(SkySatellite::class.java) + + fun registerGson(gsonBuilder: GsonBuilder) { + gsonBuilder.registerTypeAdapter(SkySatellite::class.java, ADAPTER) + gsonBuilder.registerTypeAdapter(Layer::class.java, LAYER_ADAPTER) + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/SkyType.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/SkyType.kt new file mode 100644 index 00000000..48376035 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/SkyType.kt @@ -0,0 +1,24 @@ +package ru.dbotthepony.kstarbound.defs.world + +import com.google.gson.stream.JsonWriter +import ru.dbotthepony.kstarbound.io.IStringSerializable + +enum class SkyType(vararg aliases: String) : IStringSerializable { + ATMOSPHERIC, + BARREN, + ; + + private val aliases: Array = Array(aliases.size) { aliases[it].uppercase() } + + override fun match(name: String): Boolean { + for (alias in aliases) + if (name == alias) + return true + + return name == this.name + } + + override fun write(out: JsonWriter) { + out.value(this.name) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/WorldProperties.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/WorldProperties.kt new file mode 100644 index 00000000..3c555b14 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/WorldProperties.kt @@ -0,0 +1,30 @@ +package ru.dbotthepony.kstarbound.defs.world + +import com.google.gson.GsonBuilder +import ru.dbotthepony.kstarbound.io.KTypeAdapter +import ru.dbotthepony.kvector.vector.Color +import kotlin.properties.Delegates + +class WorldProperties { + var nonCombat = false + + fun immutable(): ImmutableWorldProperties { + return ImmutableWorldProperties( + nonCombat = nonCombat + ) + } + + companion object { + val ADAPTER = KTypeAdapter(::WorldProperties, + WorldProperties::nonCombat, + ) + + fun registerGson(gsonBuilder: GsonBuilder) { + gsonBuilder.registerTypeAdapter(WorldProperties::class.java, ADAPTER) + } + } +} + +class ImmutableWorldProperties( + val nonCombat: Boolean +) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/dungeon/BeamUpRule.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/dungeon/BeamUpRule.kt new file mode 100644 index 00000000..fba2bd27 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/dungeon/BeamUpRule.kt @@ -0,0 +1,25 @@ +package ru.dbotthepony.kstarbound.defs.world.dungeon + +import com.google.gson.stream.JsonWriter +import ru.dbotthepony.kstarbound.io.IStringSerializable + +enum class BeamUpRule(vararg aliases: String) : IStringSerializable { + NOWHERE, + ANYWHERE_WITH_WARNING("AnywhereWithWarning"), + ANYWHERE("Anywhere"), + ; + + private val aliases: Array = Array(aliases.size) { aliases[it].uppercase() } + + override fun match(name: String): Boolean { + for (alias in aliases) + if (name == alias) + return true + + return name == this.name + } + + override fun write(out: JsonWriter) { + out.value(this.name) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/dungeon/Configurable.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/dungeon/Configurable.kt new file mode 100644 index 00000000..ba77812e --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/dungeon/Configurable.kt @@ -0,0 +1,57 @@ +package ru.dbotthepony.kstarbound.defs.world.dungeon + +import com.google.gson.GsonBuilder +import ru.dbotthepony.kstarbound.defs.world.SkyParameters +import ru.dbotthepony.kstarbound.defs.world.WorldProperties +import ru.dbotthepony.kstarbound.io.CustomEnumTypeAdapter +import ru.dbotthepony.kstarbound.io.KTypeAdapter +import kotlin.properties.Delegates + +class DungeonWorldDef { + var type by Delegates.notNull() + var dungeonWorld by Delegates.notNull() + var seed by Delegates.notNull() + + var spawningEnabled = false + var beamUpRule by Delegates.notNull() + + var disableDeathDrops = true + + var worldProperties: WorldProperties? = null + var skyParameters = SkyParameters() + + /** + * Milliseconds + */ + var tempWorldDeleteTime = -1L + + var persistent = false + var useUniverseClock = false + + var planetType: String? = null + var planetSize: String? = null + + companion object { + val ADAPTER = KTypeAdapter(::DungeonWorldDef, + DungeonWorldDef::type, + DungeonWorldDef::dungeonWorld, + DungeonWorldDef::seed, + DungeonWorldDef::spawningEnabled, + DungeonWorldDef::beamUpRule, + DungeonWorldDef::disableDeathDrops, + DungeonWorldDef::worldProperties, + DungeonWorldDef::skyParameters, + DungeonWorldDef::tempWorldDeleteTime, + DungeonWorldDef::persistent, + DungeonWorldDef::useUniverseClock, + DungeonWorldDef::planetType, + DungeonWorldDef::planetSize, + ) + + fun registerGson(gsonBuilder: GsonBuilder) { + gsonBuilder.registerTypeAdapter(DungeonWorldDef::class.java, ADAPTER) + gsonBuilder.registerTypeAdapter(BeamUpRule::class.java, CustomEnumTypeAdapter(BeamUpRule.values()).nullSafe()) + gsonBuilder.registerTypeAdapter(DungeonType::class.java, CustomEnumTypeAdapter(DungeonType.values()).nullSafe()) + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/dungeon/Configured.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/dungeon/Configured.kt new file mode 100644 index 00000000..6c2a71ed --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/dungeon/Configured.kt @@ -0,0 +1,5 @@ +package ru.dbotthepony.kstarbound.defs.world.dungeon + +class CDungeonWorldDef { + +} diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/dungeon/DungeonType.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/dungeon/DungeonType.kt new file mode 100644 index 00000000..558ec419 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/world/dungeon/DungeonType.kt @@ -0,0 +1,24 @@ +package ru.dbotthepony.kstarbound.defs.world.dungeon + +import com.google.gson.stream.JsonWriter +import ru.dbotthepony.kstarbound.io.IStringSerializable + +enum class DungeonType(vararg aliases: String) : IStringSerializable { + FLOATING("FloatingDungeon"), + TERRESTRIAL, + ; + + private val aliases: Array = Array(aliases.size) { aliases[it].uppercase() } + + override fun match(name: String): Boolean { + for (alias in aliases) + if (name == alias) + return true + + return name == this.name + } + + override fun write(out: JsonWriter) { + out.value(this.name) + } +}