diff --git a/build.gradle.kts b/build.gradle.kts index 1d51ecb..f3a3cac 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "dev.adamko.factoriowebmap" -version = "0.0.3" +version = "0.0.4" tasks.wrapper { gradleVersion = "7.3" diff --git a/modules/factorio-events-data-model/src/main/kotlin/dev/adamko/factorioevents/model/factorioEvents.kt b/modules/factorio-events-data-model/src/main/kotlin/dev/adamko/factorioevents/model/factorioEvents.kt index 4f7865e..2648afc 100644 --- a/modules/factorio-events-data-model/src/main/kotlin/dev/adamko/factorioevents/model/factorioEvents.kt +++ b/modules/factorio-events-data-model/src/main/kotlin/dev/adamko/factorioevents/model/factorioEvents.kt @@ -6,14 +6,14 @@ import kotlinx.serialization.json.JsonClassDiscriminator @Serializable -data class FactorioEvent( +data class FactorioEvent( + /** the initial Factorio event ({defines.events}) trigger */ + val eventType: String, /** Schema versioning */ val modVersion: String, /** game time */ val tick: UInt, - /** the initial Factorio event ({defines.events}) trigger */ - val eventType: String, - val data: FactorioObjectData, + val data: T, ) @JsonClassDiscriminator("object_name") @@ -21,34 +21,40 @@ sealed interface FactorioObjectData { val objectName: String } -@SerialName("player") +@SerialName("LuaPlayer") data class PlayerData( override val objectName: String, - val characterUnitNumber: UInt, - val associatedCharacterUnitNumbers: List, - val positionData: PositionData, + val associatedCharactersUnitNumbers: List, + val characterUnitNumber: UInt?, + val name: String, + val position: PositionData, ) : FactorioObjectData +@SerialName("LuaEntity") data class EntityData( override val objectName: String, - val name: String, - val type: String, + val active: Boolean, - val healthRatio: Float, val health: Float?, - val surfaceIndex: Int, - val unitNumber: UInt?, + val healthRatio: Float, + val name: String, val position: PositionData, + val surfaceIndex: Int, + val type: String, + val unitNumber: UInt?, + val playerIndex: UInt?, ) : FactorioObjectData +@SerialName("LuaSurface") data class SurfaceData( override val objectName: String, - val name: String, - val index: UInt, val daytime: Float, + val index: UInt, + val name: String, ) : FactorioObjectData +@Serializable data class PositionData( val x: Int, val y: Int, diff --git a/modules/mod/infra/docker-compose.yml b/modules/mod/infra/docker-compose.yml index 3ee1c60..3b42704 100644 --- a/modules/mod/infra/docker-compose.yml +++ b/modules/mod/infra/docker-compose.yml @@ -3,7 +3,7 @@ version: "3.9" services: factorio-server: - image: factoriotools/factorio:1.1.46 + image: factoriotools/factorio:1.1.48 # logging: # driver: "json-file" container_name: "factorio-server" diff --git a/modules/mod/src/main/typescript/events.ts b/modules/mod/src/main/typescript/events.ts index c7744a7..e63cf1f 100644 --- a/modules/mod/src/main/typescript/events.ts +++ b/modules/mod/src/main/typescript/events.ts @@ -6,7 +6,10 @@ import {Serdes} from "./serdes/serdes" -import {FactorioEvent, JsonTable} from "./model/model"; +// import {FactorioEvent, JsonTable} from "./model/model"; + + +const MOD_VERSION = script.active_mods["factorio-web-map"] const mapEventIdToName = new LuaTable() for (const [k, v] of pairs(defines.events)) { @@ -16,8 +19,7 @@ for (const [k, v] of pairs(defines.events)) { function handlePlayerUpdate(tick: uint, playerIndex: uint, eventType: string) { let player: LuaPlayer = game.players[playerIndex] let table = Serdes.Player.playerToTable(player) - let event = FactorioEvent(tick, eventType, table) - emitEvent(event) + emitEvent(table, tick, eventType) handleCharactersEvent(tick, playerIndex, eventType) } @@ -38,22 +40,28 @@ function handleCharactersEvent(tick: uint, playerIndex: uint, eventType: string) function handleEntityUpdate(tick: uint, entity: LuaEntity, eventType: string) { let table = Serdes.Entity.entityToTable(entity) - let event = FactorioEvent(tick, eventType, table) - emitEvent(event) + emitEvent(table, tick, eventType) } function surfaceEvent(tick: uint, surface: LuaSurface, eventType: string) { let table = Serdes.Surface.surfaceToTable(surface) - let event = FactorioEvent(tick, eventType, table) - emitEvent(event) + emitEvent(table, tick, eventType) } // const SERVER_ID: uint = 0 // const EVENT_FILE_DIR: string = "events" /** Emit a serialised event */ -function emitEvent(event: JsonTable) { +function emitEvent(eventData: T, tick: uint, eventType: string) { + + let event: FactorioEvent = { + data: eventData, + event_type: eventType, + mod_version: MOD_VERSION, + tick: tick + } + let data = game.table_to_json(event) - // game.write_file(EVENT_FILE_DIR + "/" + filename, data, false, SERVER_ID) + localised_print(`FactorioEvent: ${data}`) } diff --git a/modules/mod/src/main/typescript/generated/data-model.ts b/modules/mod/src/main/typescript/generated/data-model.ts index cf85b17..f6b435d 100644 --- a/modules/mod/src/main/typescript/generated/data-model.ts +++ b/modules/mod/src/main/typescript/generated/data-model.ts @@ -5,8 +5,8 @@ interface FactorioObjectData { object_name: string; } -interface FactorioEvent { - data: FactorioObjectData; +interface FactorioEvent { + data: T; event_type: string; mod_version: string; tick: uint; @@ -18,10 +18,11 @@ interface PositionData { } interface PlayerData extends FactorioObjectData { - associated_character_unit_numbers: uint[]; - character_unit_number: uint; + associated_characters_unit_numbers: uint[]; + character_unit_number: uint | null; + name: string; object_name: string; - position_data: PositionData; + position: PositionData; } interface EntityData extends FactorioObjectData { diff --git a/modules/mod/src/main/typescript/model/model.ts b/modules/mod/src/main/typescript/model/model.ts index 125a27c..29909f4 100644 --- a/modules/mod/src/main/typescript/model/model.ts +++ b/modules/mod/src/main/typescript/model/model.ts @@ -1,47 +1,46 @@ -import {Serdes} from "../serdes/serdes"; -import FactorioObjectData = Serdes.FactorioObjectData; +// import {Serdes} from "../serdes/serdes"; +// import FactorioObjectData = Serdes.FactorioObjectData; +// +// export type JsonPrimitiveType = number | string | boolean | undefined | null | void +// +// export type JsonArray = T[] +// +// export type JsonTableValueType = +// JsonPrimitiveType +// | JsonTable +// | JsonArray +// | undefined +// | null +// +// export interface JsonTable { +// [key: string]: JsonTableValueType +// } -export type JsonPrimitiveType = number | string | boolean | undefined | null | void -export type JsonArray = T[] - -export type JsonTableValueType = - JsonPrimitiveType - | JsonTable - | JsonArray - | undefined - | null - -export interface JsonTable { - [key: string]: JsonTableValueType -} - -const MOD_VERSION = script.active_mods["factorio-web-map"] - -export interface FactorioEvent extends JsonTable { - /** Schema versioning */ - mod_version: string, - /** game time */ - tick: uint, - /** the initial Factorio event ({defines.events}) trigger */ - event_type: string, - data: FactorioObjectData, -} - -export const FactorioEvent = - (( - tick: uint, - eventType: string, - data: DataType - ) => { - return { - mod_version: MOD_VERSION, - tick: tick, - event_type: eventType, - data: data, - } as FactorioEvent - } - ) +// export interface FactorioEvent extends JsonTable { +// /** Schema versioning */ +// mod_version: string, +// /** game time */ +// tick: uint, +// /** the initial Factorio event ({defines.events}) trigger */ +// event_type: string, +// data: FactorioObjectData, +// } +// +// export const FactorioEvent = +// (( +// tick: uint, +// eventType: string, +// data: DataType +// ) => { +// return { +// mod_version: MOD_VERSION, +// tick: tick, +// event_type: eventType, +// data: data, +// } as FactorioEvent +// } +// ) // export type JsonArray = TValue[] diff --git a/modules/mod/src/main/typescript/package-lock.json b/modules/mod/src/main/typescript/package-lock.json index e7eaaf1..0a1276e 100644 --- a/modules/mod/src/main/typescript/package-lock.json +++ b/modules/mod/src/main/typescript/package-lock.json @@ -1,6 +1,6 @@ { "name": "factorio-web-map-mod", - "version": "0.0.3", + "version": "0.0.4", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -74,18 +74,18 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, "typed-factorio": { - "version": "0.11.0-packagetypes-1", - "resolved": "https://registry.npmjs.org/typed-factorio/-/typed-factorio-0.11.0-packagetypes-1.tgz", - "integrity": "sha512-oiN9XjODry434DPcgx3MNyC22/cOrbeU5/q0uM+Tj8BjJ7B42DYH+SR21tEtrHaWHNUJNX5iXD8h1Bk0N3Qvmw==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/typed-factorio/-/typed-factorio-0.12.0.tgz", + "integrity": "sha512-7SeZX7TvWjtO+V5buWEgHUbhi7tSNZsHGveh5uPQ6Vvr7BDEhHre9DP3OrdD+L7cpAtvJ2w9OwaMnDm2P5dvng==", "requires": { "lua-types": "^2.10.1", "typescript-to-lua": "^1.0.0" } }, "typescript": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", - "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==" + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", + "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==" }, "typescript-to-lua": { "version": "1.1.1", diff --git a/modules/mod/src/main/typescript/package.json b/modules/mod/src/main/typescript/package.json index 076d3ae..91aa84e 100644 --- a/modules/mod/src/main/typescript/package.json +++ b/modules/mod/src/main/typescript/package.json @@ -1,6 +1,6 @@ { "name": "factorio-web-map-mod", - "version": "0.0.3", + "version": "0.0.4", "private": true, "scripts": { "build": "tstl", @@ -14,8 +14,8 @@ "lua-types": "^2.11.0", "@types/node": "^12.0.8", "typescript-to-lua": "1.1.1", - "typed-factorio": "0.11.0-packagetypes-1", - "typescript": "4.4.4" + "typed-factorio": "0.12.0", + "typescript": "4.5.2" }, "//": { "typed-factorio": "0.10.0" diff --git a/modules/mod/src/main/typescript/serdes/serdes.ts b/modules/mod/src/main/typescript/serdes/serdes.ts index b3de4be..b33e595 100644 --- a/modules/mod/src/main/typescript/serdes/serdes.ts +++ b/modules/mod/src/main/typescript/serdes/serdes.ts @@ -1,28 +1,20 @@ -import {JsonTable, JsonArray} from "../model/model"; +// import {JsonTable, JsonArray} from "../model/model"; -import PositionData = Serdes.DataClasses.PositionData; export namespace Serdes { - export interface FactorioObjectData extends JsonTable { - object_name: string - } + // export interface FactorioObjectData extends JsonTable { + // object_name: string + // } export namespace Player { - export interface PlayerData extends FactorioObjectData { - name: string - character_unit_number?: uint - associated_characters_unit_numbers: JsonArray - position: PositionData - } - export function playerToTable(player: LuaPlayer): PlayerData { let charIds = Entity.entitiesToUnitNumbers(player.get_associated_characters()) return { object_name: player.object_name, name: player.name, - character_unit_number: player.character?.unit_number, + character_unit_number: player.character?.unit_number ?? null, associated_characters_unit_numbers: charIds, position: DataClasses.positionTableToTable(player.position), } @@ -32,40 +24,28 @@ export namespace Serdes { export namespace Entity { - interface EntityData extends FactorioObjectData { - name: string - type: string - active: boolean - health?: number - surface_index: int - unit_number?: number - position: PositionData - player_index?: number - } - export function entityToTable(entity: LuaEntity): EntityData { - let data: EntityData = { + let player: LuaPlayer | null = entity.is_player() ? entity.player!! : null + + return { object_name: entity.object_name, name: entity.name, type: entity.type, active: entity.active, - health: entity.health, + health: entity.health ?? null, + health_ratio: entity.get_health_ratio(), surface_index: entity.surface.index, - unit_number: entity.unit_number, + unit_number: entity.unit_number ?? null, position: DataClasses.positionTableToTable(entity.position), - } - if (entity.is_player()) { - let player = entity.player!! - data.player_index = player.index + // player data: + player_index: player?.index ?? null } - - return data } - export function entitiesToUnitNumbers(entities: LuaEntity[]): JsonArray { - let result: (number) [] = [] + export function entitiesToUnitNumbers(entities: LuaEntity[]): uint[] { + let result: (uint) [] = [] for (let entity of entities) { if (entity.unit_number != null) { result[result.length] = entity.unit_number @@ -78,12 +58,6 @@ export namespace Serdes { export namespace Surface { - interface SurfaceData extends FactorioObjectData { - name: string - index: uint - daytime: number - } - export function surfaceToTable(surface: LuaSurface): SurfaceData { return { object_name: surface.object_name, @@ -97,11 +71,6 @@ export namespace Serdes { export namespace DataClasses { - export interface PositionData extends JsonTable { - x: int - y: int - } - export function positionTableToTable(positionTable: PositionTable): PositionData { return { x: positionTable.x,