44 lines
1.4 KiB
Kotlin
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.defs.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()))
|
|
}
|
|
}
|
|
}
|