it is literally working

This commit is contained in:
Adam 2022-01-04 15:09:50 +01:00
parent 841f07c847
commit a0c330384a
17 changed files with 499 additions and 63 deletions

View file

@ -11,13 +11,18 @@ import kotlinx.serialization.json.JsonClassDiscriminator
@Serializable
data class FactorioEvent<out T : FactorioObjectData>(
/** the initial Factorio event ({defines.events}) trigger */
@SerialName("event_type") val eventType: String,
@SerialName("event_type")
val eventType: String,
/** Schema versioning */
@SerialName("mod_version") val modVersion: String,
@SerialName("factorio_version") val factorioVersion: String,
@SerialName("mod_version")
val modVersion: String,
@SerialName("factorio_version")
val factorioVersion: String,
/** game time */
@SerialName("tick") val tick: UInt,
@SerialName("data") val data: T
@SerialName("tick")
val tick: UInt,
@SerialName("data")
val data: T
)
@ -53,10 +58,20 @@ sealed class FactorioObjectData {
@SerialName("LuaPlayer")
data class PlayerData(
@Serializable(with = ListAsObjectSerializer::class)
@SerialName("associated_characters_unit_numbers") val associatedCharactersUnitNumbers: List<UInt>,
@SerialName("character_unit_number") val characterUnitNumber: UInt?,
@SerialName("name") val name: String,
@SerialName("position") val position: PositionData,
@SerialName("associated_characters_unit_numbers")
val associatedCharactersUnitNumbers: List<UInt>,
@SerialName("character_unit_number")
val characterUnitNumber: UInt?,
@SerialName("name")
val name: String,
@SerialName("position")
val position: PositionData,
@SerialName("colour")
val colour: Colour,
@SerialName("chat_colour")
val chatColour: Colour,
@SerialName("last_online")
val lastOnline: UInt,
) : FactorioObjectData() {
@Transient
override val objectName: String = "LuaPlayer"
@ -65,16 +80,25 @@ data class PlayerData(
@Serializable
@SerialName("LuaEntity")
data class EntityData(
@SerialName("active") val active: Boolean,
@SerialName("health") val health: Double?,
@SerialName("health_ratio") val healthRatio: Double,
@SerialName("name") val name: String,
@SerialName("position") val position: PositionData,
@SerialName("surface_index") val surfaceIndex: Int,
@SerialName("type") val type: String,
@SerialName("unit_number") val unitNumber: UInt? = null,
@SerialName("active")
val active: Boolean,
@SerialName("health")
val health: Double?,
@SerialName("health_ratio")
val healthRatio: Double,
@SerialName("name")
val name: String,
@SerialName("position")
val position: PositionData,
@SerialName("surface_index")
val surfaceIndex: Int,
@SerialName("type")
val type: String,
@SerialName("unit_number")
val unitNumber: UInt? = null,
@SerialName("player_index") val playerIndex: UInt? = null,
@SerialName("player_index")
val playerIndex: UInt? = null,
) : FactorioObjectData() {
@Transient
override val objectName: String = "LuaEntity"
@ -83,9 +107,12 @@ data class EntityData(
@Serializable
@SerialName("LuaSurface")
data class SurfaceData(
@SerialName("daytime") val daytime: Double,
@SerialName("index") val index: UInt,
@SerialName("name") val name: String,
@SerialName("daytime")
val daytime: Double,
@SerialName("index")
val index: UInt,
@SerialName("name")
val name: String,
) : FactorioObjectData() {
@Transient
override val objectName: String = "LuaSurface"
@ -93,6 +120,32 @@ data class SurfaceData(
@Serializable
data class PositionData(
@SerialName("x") val x: Double,
@SerialName("y") val y: Double,
val x: Double,
val y: Double,
)
/**
* Red, green, blue and alpha values, all in range `[0, 1]` or all in range `[0, 255]` if any
* value is > 1.
*
* All values here are optional. Color channels default to 0, the alpha channel defaults to 1.
*/
@Serializable
data class Colour(
val red: Float = 0f,
val green: Float = 0f,
val blue: Float = 0f,
val alpha: Float = 1f,
) {
/** True if any value is greater than 1, so the values are hexadecimal. */
fun isDecimal(): Boolean {
return red > 1f
|| green > 1f
|| blue > 1f
|| alpha > 1f
}
/** True if all values are between `[0..1]`. */
fun isPercentage(): Boolean = !isDecimal()
}

View file

@ -21,7 +21,8 @@ class FactorioEventTest : BehaviorSpec({
"position": {
"x": -3.5703125,
"y": 29.75
}
},
"last_online": 123
},
"event_type": "on_player_joined_game",
"mod_version": "0.0.4",
@ -41,7 +42,10 @@ class FactorioEventTest : BehaviorSpec({
position = PositionData(
x = -3.5703125,
y = 29.75
)
),
colour = Colour(),
chatColour = Colour(),
lastOnline = 123u
),
eventType = "on_player_joined_game",
modVersion = "0.0.4",