package ru.dbotthepony.kstarbound.defs.image import com.google.gson.TypeAdapter import com.google.gson.stream.JsonReader import com.google.gson.stream.JsonWriter import ru.dbotthepony.kstarbound.Starbound import ru.dbotthepony.kstarbound.util.SBPattern /** * Хранит данные (пару) вида "/example/image.png:sprite.name" */ data class SpriteReference( val image: String, val atlas: AtlasConfiguration, val sprite: SBPattern ) { val stateless by lazy { resolve { null } } fun resolve(with: (String) -> String?): AtlasConfiguration.Sprite { val resolved = sprite.resolve(with) ?: return atlas.any() return atlas[resolved] ?: atlas.any() } companion object : TypeAdapter() { fun parse(input: String): SpriteReference { val grid = AtlasConfiguration.get(input.substringBefore(':')) return when (input.count { it == ':' }) { 0 -> SpriteReference(input, grid, SBPattern.raw(grid.any().name)) 1 -> SpriteReference(input.substringBefore(':'), grid, SBPattern.of(input.substringAfter(':'))) else -> throw IllegalArgumentException("Invalid sprite reference: $input") } } override fun write(out: JsonWriter, value: SpriteReference) { out.value(value.image + ":" + value.sprite.raw) } override fun read(`in`: JsonReader): SpriteReference { return parse(Starbound.assetFolder(`in`.nextString())) } } }