KStarbound/src/main/kotlin/ru/dbotthepony/kstarbound/defs/image/SpriteReference.kt

44 lines
1.4 KiB
Kotlin

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<SpriteReference>() {
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()))
}
}
}