mucking around trying to get protoc working. I've finally got a task that downloads the exe...

This commit is contained in:
Adam 2021-10-29 19:14:47 +02:00
parent ebba0bb767
commit 106d7a7923
12 changed files with 982 additions and 53 deletions

View file

@ -0,0 +1,63 @@
package dev.adamko.factorioevents.model
import kotlin.js.JsExport
import kotlin.jvm.JvmInline
//expect sealed interface JsonPrimitive {
// value class JsonString(val string: String) : JsonPrimitive
// value class JsonNumber(val number: Number) : JsonPrimitive
// value class JsonBoolean(val boolean: Boolean) : JsonPrimitive
//}
sealed interface JsonPrimitive {
@JvmInline
value class JsonString(val string: String) : JsonPrimitive
@JvmInline
value class JsonNumber(val number: Number) : JsonPrimitive
@JvmInline
value class JsonBoolean(val boolean: Boolean) : JsonPrimitive
}
class JsonArray<T : JsonPrimitive?>(
private val list: MutableList<T> = mutableListOf()
) : MutableList<T> by list
sealed interface JsonTableValue {
@JvmInline
value class JsonPrimitiveTV(val primitive: JsonPrimitive) : JsonTableValue
@JvmInline
value class JsonArrayTV<T : JsonPrimitive?>(val array: JsonArray<T>) : JsonTableValue
@JvmInline
value class JsonTableTV<T : JsonTable?>(val array: JsonTable) : JsonTableValue
}
//expect class JsonNumber() : JsonPrimitiveType
//expect class JsonArray<T : JsonPrimitive?>
//expect open class JsonTable<K : JsonPrimitive.JsonString, V : JsonTableValue?>
open class JsonTable(
protected val map: MutableMap<JsonPrimitive.JsonString, JsonTableValue?> = mutableMapOf()
) : MutableMap<JsonPrimitive.JsonString, JsonTableValue?> by map {
inline fun <reified T> get2(key: String): T? {
val jKey = JsonPrimitive.JsonString(key)
return when {
T::class is Number -> ((get(jKey) as? JsonTableValue.JsonPrimitiveTV)?.primitive as? JsonPrimitive.JsonNumber)?.number as? T
else -> return get(jKey) as? T
}
}
}
//@JsExport
class FactorioEvent : JsonTable() {
val tick: UInt?
get() = get2("tick")
// set(value) = map.put("tick", value)
}

View file

@ -0,0 +1,31 @@
package dev.adamko.factorioevents.model
//actual sealed interface JsonPrimitive {
// actual value class JsonString(val string: String) : JsonPrimitive
// actual value class JsonNumber(val number: Number) : JsonPrimitive
// actual value class JsonBoolean(val boolean: Boolean) : JsonPrimitive
//}
//actual class JsonArray<T : JsonPrimitive?>(
// private val list: MutableList<T> = mutableListOf()
//) : MutableList<T> by list
//actual sealed interface JsonTableValue {
// actual value class JsonPrimitiveTV(val primitive: JsonPrimitive) : JsonTableValue
// actual value class JsonArrayTV<T : JsonPrimitive?>(val array: JsonArray<T>) : JsonTableValue
//}
//actual open class JsonTable<K : JsonPrimitive.JsonString, V: JsonTableValue?>(
// private val map: MutableMap<K, V> = mutableMapOf()
//) : MutableMap<K, V> by map
fun printMap() {
val f = JsonPrimitive.JsonString("test")
println(f.string)
println(f)
}

View file

@ -0,0 +1,55 @@
interface Identifiable<T> {
val id: T
}
interface IndexedModel {
val index: UInt
}
interface NamedModel {
val name: String
}
data class SurfaceModel(
override val name: String,
override val index: UInt,
val daytime: Float,
val darkness: Float,
val wind_speed: Double,
) : IndexedModel, NamedModel
/** Player/Entity shared props */
interface ControlModel {
val driving: Boolean
val forces: List<ForceModel>
}
//data class PlayerModel(
// val index: UInt,
// val characters: List<EntityModel>
//) : Identifiable<UInt> {
// override val id: UInt = index
//}
//data class EntityModel(
// val unit_number: Int,
// override val name: String,
// val type: String,
// val active: Boolean,
// val minable: Boolean,
// val health: Boolean,
// val speed: Float, override val driving: Boolean,
//) : ControlModel, NamedModel
data class ForceModel(
val index: UInt,
override val name: String,
val research_progress: Double,
) : Identifiable<UInt>, NamedModel {
override val id: UInt = index
}

View file

@ -0,0 +1,94 @@
syntax = "proto3";
option optimize_for = LITE_RUNTIME;
option java_multiple_files = true;
package dev.adamko.factorioevents;
import "google/protobuf/any.proto";
import "google/protobuf/timestamp.proto";
message FactorioServerLogRecord {
string mod_version = 1;
uint32 tick = 2;
string event_type = 3;
FactorioLuaObject data = 4;
}
message FactorioLuaObject {
string object_name = 1;
oneof data {
LuaControl lua_control = 2;
}
}
// https://lua-api.factorio.com/next/LuaControl.html
message LuaControl {
bool is_player = 2;
uint32 surface_index = 3;
Position position = 4;
uint32 force_index = 5;
oneof subtype {
LuaPlayer player = 10;
LuaEntity entity = 11;
}
}
// https://lua-api.factorio.com/next/LuaPlayer.html
message LuaPlayer {
uint32 index = 1; // unique ID
string name = 2;
repeated int32 data = 4 [packed = true];
Colour colour = 8;
bool is_connected = 10;
bool is_admin = 11;
uint32 afk_time_ticks = 100;
uint32 online_time_ticks = 101;
uint32 last_online_ticks = 102;
}
// https://lua-api.factorio.com/next/LuaEntity.html
message LuaEntity {
uint32 unit_number = 1; // (optional) unique ID
string name = 2;
string type = 3;
string status = 4; // https://lua-api.factorio.com/next/defines.html#defines.entity_status
bool is_active = 8;
bool is_moving = 9;
uint32 player_index = 50; // (optional) The player connected to this character or nil if none.
uint32 last_user_index = 51; // (optional) The last player that changed any setting on this entity.
Colour colour = 100; // (optional)
}
message LuaSurface {
uint32 index = 1; // unique ID
string name = 2;
float daytime = 3;
}
message LuaForce {
uint32 index = 1; // unique ID
string force_name = 2;
repeated uint32 player_ids = 100 [packed = true];
}
message Position {
int32 x = 1;
int32 y = 2;
}
message Colour {
float red = 1;
float green = 2;
float blue = 3;
float alpha = 4;
}