make the data being output by the events-mod more generalised, to include more than just events (mod config, prototypes)
This commit is contained in:
parent
58233c9343
commit
ed4d42a2ef
26 changed files with 524 additions and 379 deletions
|
|
@ -6,7 +6,7 @@ plugins {
|
||||||
}
|
}
|
||||||
|
|
||||||
group = "dev.adamko.kafkatorio"
|
group = "dev.adamko.kafkatorio"
|
||||||
version = "0.1.7"
|
version = "0.2.0"
|
||||||
|
|
||||||
val licenseFile: RegularFile by extra(layout.projectDirectory.file("LICENSE"))
|
val licenseFile: RegularFile by extra(layout.projectDirectory.file("LICENSE"))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ import org.jetbrains.kotlin.util.parseSpaceSeparatedArgs
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
idea
|
idea
|
||||||
id("dev.adamko.kafkatorio.lang.node")
|
dev.adamko.kafkatorio.lang.node
|
||||||
distribution
|
distribution
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -60,7 +60,7 @@ val typescriptToLua by tasks.registering(NpmTask::class) {
|
||||||
description = "Convert Typescript To Lua"
|
description = "Convert Typescript To Lua"
|
||||||
group = project.name
|
group = project.name
|
||||||
|
|
||||||
dependsOn(tasks.npmInstall, installEventsTsSchema)
|
dependsOn(tasks.npmInstall, installEventsTsSchema, tasks.updatePackageJson)
|
||||||
|
|
||||||
execOverrides { standardOutput = System.out }
|
execOverrides { standardOutput = System.out }
|
||||||
|
|
||||||
|
|
@ -214,5 +214,3 @@ tasks.assemble { dependsOn(installEventsTsSchema, tasks.updatePackageJson) }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
tasks.npmInstall
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,5 @@
|
||||||
import {emitTiles} from "./prototypes/emitPrototypes";
|
import {handleConfigurationUpdate} from "./main/config-update/handleConfigurationUpdate";
|
||||||
|
|
||||||
require("events")
|
require("events")
|
||||||
|
|
||||||
// on startup, push out prototypes
|
script.on_configuration_changed(handleConfigurationUpdate)
|
||||||
script.on_configuration_changed((e: ConfigurationChangedData) => {
|
|
||||||
emitTiles()
|
|
||||||
})
|
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,8 @@ export function emitEvent<T extends FactorioObjectData>(eventData: T, tick: uint
|
||||||
|
|
||||||
let event: FactorioEvent<T> = {
|
let event: FactorioEvent<T> = {
|
||||||
data: eventData,
|
data: eventData,
|
||||||
event_type: eventType,
|
eventType: eventType,
|
||||||
mod_version: MOD_VERSION,
|
modVersion: MOD_VERSION,
|
||||||
factorio_version: FACTORIO_VERSION,
|
|
||||||
tick: tick
|
tick: tick
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,10 +50,12 @@ export function handleConsoleChat(
|
||||||
|
|
||||||
const CHUNK_SIZE = 32
|
const CHUNK_SIZE = 32
|
||||||
|
|
||||||
export function handleChunkUpdate(tick: uint,
|
export function handleChunkUpdate(
|
||||||
|
tick: uint,
|
||||||
eventType: string,
|
eventType: string,
|
||||||
surfaceIndex: uint,
|
surfaceIndex: uint,
|
||||||
position: ChunkPosition) {
|
position: ChunkPosition
|
||||||
|
) {
|
||||||
|
|
||||||
let surface = game.get_surface(surfaceIndex)
|
let surface = game.get_surface(surfaceIndex)
|
||||||
|
|
||||||
|
|
@ -69,14 +71,13 @@ export function handleChunkUpdate(tick: uint,
|
||||||
|
|
||||||
let tilePositionMap = new Map<PositionData, FactorioTile>();
|
let tilePositionMap = new Map<PositionData, FactorioTile>();
|
||||||
for (let tile of tiles) {
|
for (let tile of tiles) {
|
||||||
let position = Serdes.positionTableToTable(tile.position)
|
let position = Serdes.convertMapPosition(tile.position)
|
||||||
tilePositionMap.set(position, Serdes.convertTile(tile))
|
tilePositionMap.set(position, Serdes.convertTile(tile))
|
||||||
}
|
}
|
||||||
let mapChunk: FactorioTilesMap = {
|
let mapChunk: FactorioTilesMap = {
|
||||||
object_name: "FactorioTilesMap",
|
objectName: "FactorioTilesMap",
|
||||||
tiles: tilePositionMap,
|
tiles: tilePositionMap,
|
||||||
}
|
}
|
||||||
|
|
||||||
emitEvent(mapChunk, tick, eventType)
|
emitEvent(mapChunk, tick, eventType)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,15 +3,15 @@ export namespace Serdes {
|
||||||
export function playerToTable(player: LuaPlayer): PlayerData {
|
export function playerToTable(player: LuaPlayer): PlayerData {
|
||||||
let charIds = entitiesToUnitNumbers(player.get_associated_characters())
|
let charIds = entitiesToUnitNumbers(player.get_associated_characters())
|
||||||
return {
|
return {
|
||||||
object_name: player.object_name,
|
objectName: player.object_name,
|
||||||
|
|
||||||
name: player.name,
|
name: player.name,
|
||||||
character_unit_number: player.character?.unit_number ?? null,
|
characterUnitNumber: player.character?.unit_number ?? null,
|
||||||
associated_characters_unit_numbers: charIds,
|
associatedCharactersUnitNumbers: charIds,
|
||||||
position: positionTableToTable(player.position),
|
position: convertMapPosition(player.position),
|
||||||
colour: mapColour(player.color),
|
colour: mapColour(player.color),
|
||||||
chat_colour: mapColour(player.chat_color),
|
chatColour: mapColour(player.chat_color),
|
||||||
last_online: player.last_online
|
lastOnline: player.last_online
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -20,20 +20,20 @@ export namespace Serdes {
|
||||||
let player: LuaPlayer | null = entity.is_player() ? entity.player!! : null
|
let player: LuaPlayer | null = entity.is_player() ? entity.player!! : null
|
||||||
|
|
||||||
return {
|
return {
|
||||||
object_name: entity.object_name,
|
objectName: entity.object_name,
|
||||||
|
|
||||||
// entity data
|
// entity data
|
||||||
name: entity.name,
|
name: entity.name,
|
||||||
type: entity.type,
|
type: entity.type,
|
||||||
active: entity.active,
|
active: entity.active,
|
||||||
health: entity.health ?? null,
|
health: entity.health ?? null,
|
||||||
health_ratio: entity.get_health_ratio(),
|
healthRatio: entity.get_health_ratio(),
|
||||||
surface_index: entity.surface.index,
|
surfaceIndex: entity.surface.index,
|
||||||
unit_number: entity.unit_number ?? null,
|
unitNumber: entity.unit_number ?? null,
|
||||||
position: positionTableToTable(entity.position),
|
position: convertMapPosition(entity.position),
|
||||||
|
|
||||||
// player data
|
// player data
|
||||||
player_index: player?.index ?? null
|
playerIndex: player?.index ?? null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -49,7 +49,7 @@ export namespace Serdes {
|
||||||
|
|
||||||
export function surfaceToTable(surface: LuaSurface): SurfaceData {
|
export function surfaceToTable(surface: LuaSurface): SurfaceData {
|
||||||
return {
|
return {
|
||||||
object_name: surface.object_name,
|
objectName: surface.object_name,
|
||||||
|
|
||||||
name: surface.name,
|
name: surface.name,
|
||||||
index: surface.index,
|
index: surface.index,
|
||||||
|
|
@ -57,10 +57,11 @@ export namespace Serdes {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function positionTableToTable(positionTable: PositionTable): PositionData {
|
export function convertMapPosition(mapPos: MapPositionTable): PositionData {
|
||||||
return {
|
return {
|
||||||
x: positionTable.x,
|
type: "MAP",
|
||||||
y: positionTable.y,
|
x: mapPos.x,
|
||||||
|
y: mapPos.y,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -75,20 +76,20 @@ export namespace Serdes {
|
||||||
|
|
||||||
export function consoleChat(content: string, playerIndex?: uint): ConsoleChatMessage {
|
export function consoleChat(content: string, playerIndex?: uint): ConsoleChatMessage {
|
||||||
return {
|
return {
|
||||||
object_name: "ConsoleChatMessage",
|
objectName: "ConsoleChatMessage",
|
||||||
|
|
||||||
author_player_index: playerIndex ?? null,
|
authorPlayerIndex: playerIndex ?? null,
|
||||||
content: content
|
content: content
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function convertTile(tile: LuaTile): FactorioTile {
|
export function convertTile(tile: LuaTile): FactorioTile {
|
||||||
return {
|
return {
|
||||||
object_name: tile.object_name,
|
objectName: tile.object_name,
|
||||||
|
|
||||||
position: tile.position,
|
position: convertMapPosition(tile.position),
|
||||||
prototype_name: tile.prototype.name,
|
prototypeName: tile.prototype.name,
|
||||||
surface_index: tile.surface.index
|
surfaceIndex: tile.surface.index
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
import {emitPacket} from "../emitKafkatorioPacket";
|
||||||
|
import {convertPrototypes} from "../../prototypes/emitPrototypes";
|
||||||
|
|
||||||
|
export function handleConfigurationUpdate(changeData: ConfigurationChangedData) {
|
||||||
|
|
||||||
|
emitPacket<FactorioConfigurationUpdate>({
|
||||||
|
modVersion: global.MOD_VERSION,
|
||||||
|
allMods: allMods(changeData),
|
||||||
|
factorioData: factorioData(changeData),
|
||||||
|
prototypes: convertPrototypes()
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function factorioData(changeData: ConfigurationChangedData): FactorioGameDataUpdate {
|
||||||
|
return {
|
||||||
|
oldVersion: changeData.old_version ?? null,
|
||||||
|
newVersion: changeData.new_version ?? null,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function allMods(e: ConfigurationChangedData): FactorioModInfo[] {
|
||||||
|
|
||||||
|
let namesOfChangedMods: string[] = Object.keys(e.mod_changes)
|
||||||
|
let namesOfCurrentMods: string[] = Object.keys(script.active_mods)
|
||||||
|
|
||||||
|
let modNames = [...new Set<string>(
|
||||||
|
namesOfChangedMods.concat(namesOfCurrentMods)
|
||||||
|
)]
|
||||||
|
|
||||||
|
return modNames.map((modName) => {
|
||||||
|
|
||||||
|
let currentVer = script.active_mods[modName] ?? e.mod_changes[modName].new_version
|
||||||
|
let previousVer = e.mod_changes[modName].old_version
|
||||||
|
|
||||||
|
return <FactorioModInfo>{
|
||||||
|
modName: modName,
|
||||||
|
currentVersion: currentVer,
|
||||||
|
previousVersion: previousVer,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
export function updateGlobal() {
|
||||||
|
global.MOD_VERSION = script.active_mods[script.mod_name][1]
|
||||||
|
global.FACTORIO_VERSION = script.active_mods["base"][1]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
/** Emit a serialised KafkatorioPacket */
|
||||||
|
export function emitPacket<T extends KafkatorioPacket>(packet: T) {
|
||||||
|
let data = game.table_to_json(packet)
|
||||||
|
localised_print(`KafkatorioPacket: ${data}`)
|
||||||
|
// rcon.print(`KafkatorioPacket: ${data}`)
|
||||||
|
}
|
||||||
4
modules/events-mod/src/main/typescript/main/global.d.ts
vendored
Normal file
4
modules/events-mod/src/main/typescript/main/global.d.ts
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
declare const global: {
|
||||||
|
MOD_VERSION: string
|
||||||
|
FACTORIO_VERSION: string
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "kafkatorio-events-mod",
|
"name": "kafkatorio-events-mod",
|
||||||
"version": "0.1.7",
|
"version": "0.2.0",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "kafkatorio-events-mod",
|
"name": "kafkatorio-events-mod",
|
||||||
"version": "0.1.7",
|
"version": "0.2.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tstl",
|
"build": "tstl",
|
||||||
|
|
|
||||||
|
|
@ -1,42 +1,36 @@
|
||||||
import {Serdes} from "../events/serdes";
|
import {Serdes} from "../events/serdes";
|
||||||
|
|
||||||
export function emitTiles() {
|
export function convertPrototypes (): FactorioPrototype[] {
|
||||||
|
let prototypes = new Array<FactorioPrototype>()
|
||||||
|
|
||||||
let tilePrototypes = new LuaTable<string, FactorioMapTilePrototype>()
|
prototypes.push(...getMapTilePrototypes())
|
||||||
|
|
||||||
for (const [_, tile] of pairs(game.tile_prototypes)) {
|
return prototypes
|
||||||
// let ttttt = game.tile_prototypes[tileName]
|
|
||||||
tilePrototypes.set(tile.name, mapTilePrototype(tile))
|
|
||||||
}
|
|
||||||
|
|
||||||
// for (let tileName in game.tile_prototypes) {
|
|
||||||
// const tile = game.tile_prototypes[tileName]
|
|
||||||
// tilePrototypes.set(tileName, mapTilePrototype(tile))
|
|
||||||
// }
|
|
||||||
|
|
||||||
// for (const [id, player] of pairs(game.players)) {
|
|
||||||
// const num: number = id
|
|
||||||
// const p: LuaPlayer = player
|
|
||||||
// }
|
|
||||||
emitPrototypes(tilePrototypes)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function mapTilePrototype(tile: LuaTilePrototype): FactorioMapTilePrototype {
|
function getMapTilePrototypes(): FactorioMapTilePrototype[] {
|
||||||
return {
|
let tiles: FactorioMapTilePrototype[] = []
|
||||||
object_name: tile.object_name,
|
for (let [_, tile] of pairs(game.tile_prototypes)) {
|
||||||
|
tiles.push(
|
||||||
|
<FactorioMapTilePrototype>{
|
||||||
|
objectName: tile.object_name,
|
||||||
|
|
||||||
name: tile.name,
|
name: tile.name,
|
||||||
order: tile.order,
|
order: tile.order,
|
||||||
layer: tile.layer,
|
layer: tile.layer,
|
||||||
collision_masks: [],
|
collisionMasks: convertCollisionMaskToNames(tile.collision_mask),
|
||||||
map_color: Serdes.mapColour(tile.map_color),
|
mapColor: Serdes.mapColour(tile.map_color),
|
||||||
can_be_mined: tile.mineable_properties.minable,
|
canBeMined: tile.mineable_properties.minable,
|
||||||
}
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return tiles
|
||||||
}
|
}
|
||||||
|
|
||||||
function emitPrototypes<T extends FactorioPrototype>(prototypes: LuaTable<string, T>) {
|
function convertCollisionMaskToNames(cm: CollisionMask): string[] {
|
||||||
|
let masks: string[] = []
|
||||||
let data = game.table_to_json(prototypes)
|
for (let [name, _] of pairs(cm)) {
|
||||||
|
masks.push(name)
|
||||||
localised_print(`FactorioPrototype: ${data}`)
|
}
|
||||||
|
return masks
|
||||||
}
|
}
|
||||||
|
|
|
||||||
19
modules/events-mod/src/main/typescript/schema/config-update.d.ts
vendored
Normal file
19
modules/events-mod/src/main/typescript/schema/config-update.d.ts
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
// Generated by TypeScriptGenerator - do not edit this file manually
|
||||||
|
|
||||||
|
interface FactorioModInfo {
|
||||||
|
currentVersion: string | null;
|
||||||
|
modName: string;
|
||||||
|
previousVersion: string | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface FactorioGameDataUpdate {
|
||||||
|
newVersion: string | null;
|
||||||
|
oldVersion: string | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface FactorioConfigurationUpdate extends KafkatorioPacket {
|
||||||
|
allMods: FactorioModInfo[];
|
||||||
|
factorioData: FactorioGameDataUpdate;
|
||||||
|
modVersion: string;
|
||||||
|
prototypes: FactorioPrototype[];
|
||||||
|
}
|
||||||
|
|
@ -1,92 +0,0 @@
|
||||||
// Generated by TypeScriptGenerator - do not edit this file manually
|
|
||||||
interface FactorioObjectData {
|
|
||||||
object_name: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface FactorioEvent<T extends FactorioObjectData> {
|
|
||||||
data: T;
|
|
||||||
event_type: string;
|
|
||||||
factorio_version: string;
|
|
||||||
mod_version: string;
|
|
||||||
tick: uint;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Colour {
|
|
||||||
alpha: float;
|
|
||||||
blue: float;
|
|
||||||
green: float;
|
|
||||||
red: float;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface PositionData {
|
|
||||||
x: double;
|
|
||||||
y: double;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface PlayerData extends FactorioObjectData {
|
|
||||||
associated_characters_unit_numbers: uint[];
|
|
||||||
character_unit_number: uint | null;
|
|
||||||
chat_colour: Colour;
|
|
||||||
colour: Colour;
|
|
||||||
last_online: uint;
|
|
||||||
name: string;
|
|
||||||
object_name: string;
|
|
||||||
position: PositionData;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface EntityData extends FactorioObjectData {
|
|
||||||
active: boolean;
|
|
||||||
health: double | null;
|
|
||||||
health_ratio: double;
|
|
||||||
name: string;
|
|
||||||
object_name: string;
|
|
||||||
player_index: uint | null;
|
|
||||||
position: PositionData;
|
|
||||||
surface_index: int;
|
|
||||||
type: string;
|
|
||||||
unit_number: uint | null;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface SurfaceData extends FactorioObjectData {
|
|
||||||
daytime: double;
|
|
||||||
index: uint;
|
|
||||||
name: string;
|
|
||||||
object_name: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ConsoleChatMessage extends FactorioObjectData {
|
|
||||||
author_player_index: uint | null;
|
|
||||||
content: string;
|
|
||||||
object_name: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface FactorioTile extends FactorioObjectData {
|
|
||||||
object_name: string;
|
|
||||||
position: PositionData;
|
|
||||||
prototype_name: string;
|
|
||||||
surface_index: int;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface FactorioTilesMap extends FactorioObjectData {
|
|
||||||
object_name: string;
|
|
||||||
tiles: Map<PositionData, FactorioTile>;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface FactorioTiles extends FactorioObjectData {
|
|
||||||
object_name: string;
|
|
||||||
tiles: FactorioTile[];
|
|
||||||
}
|
|
||||||
|
|
||||||
interface FactorioPrototype {
|
|
||||||
object_name: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface FactorioMapTilePrototype extends FactorioPrototype {
|
|
||||||
can_be_mined: boolean;
|
|
||||||
collision_masks: string[];
|
|
||||||
layer: uint;
|
|
||||||
map_color: Colour;
|
|
||||||
name: string;
|
|
||||||
object_name: string;
|
|
||||||
order: string;
|
|
||||||
}
|
|
||||||
61
modules/events-mod/src/main/typescript/schema/object-data.d.ts
vendored
Normal file
61
modules/events-mod/src/main/typescript/schema/object-data.d.ts
vendored
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
// Generated by TypeScriptGenerator - do not edit this file manually
|
||||||
|
|
||||||
|
interface FactorioObjectData {
|
||||||
|
objectName: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface FactorioEvent<T extends FactorioObjectData> extends KafkatorioPacket {
|
||||||
|
data: T;
|
||||||
|
eventType: string;
|
||||||
|
modVersion: string;
|
||||||
|
tick: uint;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface PlayerData extends FactorioObjectData {
|
||||||
|
associatedCharactersUnitNumbers: uint[];
|
||||||
|
characterUnitNumber: uint | null;
|
||||||
|
chatColour: Colour;
|
||||||
|
colour: Colour;
|
||||||
|
lastOnline: uint;
|
||||||
|
name: string;
|
||||||
|
objectName: string;
|
||||||
|
position: PositionData;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface EntityData extends FactorioObjectData {
|
||||||
|
active: boolean;
|
||||||
|
health: double | null;
|
||||||
|
healthRatio: double;
|
||||||
|
name: string;
|
||||||
|
objectName: string;
|
||||||
|
playerIndex: uint | null;
|
||||||
|
position: PositionData;
|
||||||
|
surfaceIndex: int;
|
||||||
|
type: string;
|
||||||
|
unitNumber: uint | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SurfaceData extends FactorioObjectData {
|
||||||
|
daytime: double;
|
||||||
|
index: uint;
|
||||||
|
name: string;
|
||||||
|
objectName: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface FactorioTile extends FactorioObjectData {
|
||||||
|
objectName: string;
|
||||||
|
position: PositionData;
|
||||||
|
prototypeName: string;
|
||||||
|
surfaceIndex: int;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface FactorioTilesMap extends FactorioObjectData {
|
||||||
|
objectName: string;
|
||||||
|
tiles: Map<PositionData, FactorioTile>;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ConsoleChatMessage extends FactorioObjectData {
|
||||||
|
authorPlayerIndex: uint | null;
|
||||||
|
content: string;
|
||||||
|
objectName: string;
|
||||||
|
}
|
||||||
20
modules/events-mod/src/main/typescript/schema/prototype.d.ts
vendored
Normal file
20
modules/events-mod/src/main/typescript/schema/prototype.d.ts
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
// Generated by TypeScriptGenerator - do not edit this file manually
|
||||||
|
|
||||||
|
interface FactorioPrototype {
|
||||||
|
objectName: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface FactorioPrototypes<T extends FactorioPrototype> extends KafkatorioPacket {
|
||||||
|
modVersion: string;
|
||||||
|
prototypes: T[];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface FactorioMapTilePrototype extends FactorioPrototype {
|
||||||
|
canBeMined: boolean;
|
||||||
|
collisionMasks: string[];
|
||||||
|
layer: uint;
|
||||||
|
mapColor: Colour;
|
||||||
|
name: string;
|
||||||
|
objectName: string;
|
||||||
|
order: string;
|
||||||
|
}
|
||||||
20
modules/events-mod/src/main/typescript/schema/schema.d.ts
vendored
Normal file
20
modules/events-mod/src/main/typescript/schema/schema.d.ts
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
// Generated by TypeScriptGenerator - do not edit this file manually
|
||||||
|
|
||||||
|
interface KafkatorioPacket {
|
||||||
|
modVersion: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Colour {
|
||||||
|
alpha: float;
|
||||||
|
blue: float;
|
||||||
|
green: float;
|
||||||
|
red: float;
|
||||||
|
}
|
||||||
|
|
||||||
|
type PositionType = "MAP" | "CHUNK" | "TILE";
|
||||||
|
|
||||||
|
interface PositionData {
|
||||||
|
type: PositionType | null;
|
||||||
|
x: double;
|
||||||
|
y: double;
|
||||||
|
}
|
||||||
|
|
@ -80,8 +80,8 @@ val generateTypescript by tasks.registering(JavaExec::class) {
|
||||||
|
|
||||||
mainClass.set("dev.adamko.kafkatorio.events.schema.Kt2tsKt")
|
mainClass.set("dev.adamko.kafkatorio.events.schema.Kt2tsKt")
|
||||||
|
|
||||||
val generatedFile = file("$temporaryDir/${project.name}.ts")
|
val tempOutputDirectory = file("$temporaryDir")
|
||||||
args(generatedFile)
|
args(tempOutputDirectory)
|
||||||
|
|
||||||
val buildOutput = layout.buildDirectory.dir("generated/typescript")
|
val buildOutput = layout.buildDirectory.dir("generated/typescript")
|
||||||
outputs.dir(buildOutput)
|
outputs.dir(buildOutput)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
package dev.adamko.kafkatorio.events.schema
|
||||||
|
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class PositionData(
|
||||||
|
val x: Double,
|
||||||
|
val y: Double,
|
||||||
|
val type: PositionType?,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
enum class PositionType {
|
||||||
|
MAP, CHUNK, TILE,
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//@Serializable
|
||||||
|
//@SerialName("FactorioTiles")
|
||||||
|
//data class FactorioTiles(
|
||||||
|
// val tiles: List<FactorioTile>,
|
||||||
|
//) : FactorioObjectData() {
|
||||||
|
// @Transient
|
||||||
|
// override val objectName: String = "FactorioTiles"
|
||||||
|
//}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
package dev.adamko.kafkatorio.events.schema
|
||||||
|
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class FactorioConfigurationUpdate(
|
||||||
|
override val modVersion: String,
|
||||||
|
val factorioData: FactorioGameDataUpdate,
|
||||||
|
val allMods: List<FactorioModInfo>,
|
||||||
|
val prototypes: List<FactorioPrototype>,
|
||||||
|
) : KafkatorioPacket
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class FactorioGameDataUpdate(
|
||||||
|
val oldVersion: String?,
|
||||||
|
val newVersion: String?,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class FactorioModInfo(
|
||||||
|
val modName: String,
|
||||||
|
val currentVersion: String?,
|
||||||
|
val previousVersion: String?,
|
||||||
|
)
|
||||||
|
|
@ -1,192 +1,16 @@
|
||||||
package dev.adamko.kafkatorio.events.schema
|
package dev.adamko.kafkatorio.events.schema
|
||||||
|
|
||||||
|
|
||||||
import kotlinx.serialization.SerialName
|
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
import kotlinx.serialization.Transient
|
|
||||||
import kotlinx.serialization.json.JsonClassDiscriminator
|
|
||||||
|
|
||||||
|
|
||||||
//@Serializable(with = FactorioEventSerializer::class)
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class FactorioEvent<out T : FactorioObjectData>(
|
data class FactorioEvent<out T : FactorioObjectData>(
|
||||||
|
override val modVersion: String,
|
||||||
|
|
||||||
/** the initial Factorio event ({defines.events}) trigger */
|
/** the initial Factorio event ({defines.events}) trigger */
|
||||||
@SerialName("event_type")
|
|
||||||
val eventType: String,
|
val eventType: String,
|
||||||
/** Schema versioning */
|
|
||||||
@SerialName("mod_version")
|
|
||||||
val modVersion: String,
|
|
||||||
@SerialName("factorio_version")
|
|
||||||
val factorioVersion: String,
|
|
||||||
/** game time */
|
/** game time */
|
||||||
@SerialName("tick")
|
|
||||||
val tick: UInt,
|
val tick: UInt,
|
||||||
@SerialName("data")
|
val data: T,
|
||||||
val data: T
|
) : KafkatorioPacket
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
/** The [JsonClassDiscriminator] for [FactorioEvent] */
|
|
||||||
const val FactorioObjectDataDiscriminatorKey: String = "object_name"
|
|
||||||
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
@JsonClassDiscriminator(FactorioObjectDataDiscriminatorKey)
|
|
||||||
sealed class FactorioObjectData {
|
|
||||||
|
|
||||||
abstract val objectName: String
|
|
||||||
|
|
||||||
// workaround - https://github.com/Kotlin/kotlinx.serialization/issues/1664
|
|
||||||
// val objectName: String by lazy {
|
|
||||||
// serializer().descriptor.serialName
|
|
||||||
// }
|
|
||||||
|
|
||||||
// val objectName: String by lazy {
|
|
||||||
// kotlinx.serialization.serializer(this::class.starProjectedType).descriptor.serialName
|
|
||||||
// }
|
|
||||||
|
|
||||||
// alternative: find the @SerialName annotation
|
|
||||||
// Again it must be delegated so there's no backing field and kxs ignores it
|
|
||||||
// val objectName: String by lazy {
|
|
||||||
// requireNotNull(this::class.findAnnotation<SerialName>()?.value) {
|
|
||||||
// "Couldn't find @SerialName for ${this::class}!"
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
@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("colour")
|
|
||||||
val colour: Colour,
|
|
||||||
@SerialName("chat_colour")
|
|
||||||
val chatColour: Colour,
|
|
||||||
@SerialName("last_online")
|
|
||||||
val lastOnline: UInt,
|
|
||||||
) : FactorioObjectData() {
|
|
||||||
@Transient
|
|
||||||
override val objectName: String = "LuaPlayer"
|
|
||||||
}
|
|
||||||
|
|
||||||
@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("player_index")
|
|
||||||
val playerIndex: UInt? = null,
|
|
||||||
) : FactorioObjectData() {
|
|
||||||
@Transient
|
|
||||||
override val objectName: String = "LuaEntity"
|
|
||||||
}
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
@SerialName("LuaSurface")
|
|
||||||
data class SurfaceData(
|
|
||||||
@SerialName("daytime")
|
|
||||||
val daytime: Double,
|
|
||||||
@SerialName("index")
|
|
||||||
val index: UInt,
|
|
||||||
@SerialName("name")
|
|
||||||
val name: String,
|
|
||||||
) : FactorioObjectData() {
|
|
||||||
@Transient
|
|
||||||
override val objectName: String = "LuaSurface"
|
|
||||||
}
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
data class PositionData(
|
|
||||||
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()
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
data class ConsoleChatMessage(
|
|
||||||
@SerialName("author_player_index")
|
|
||||||
val authorPlayerIndex: UInt?,
|
|
||||||
val content: String,
|
|
||||||
) : FactorioObjectData() {
|
|
||||||
@Transient
|
|
||||||
override val objectName: String = "ConsoleChatMessage"
|
|
||||||
}
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
@SerialName("FactorioTilesMap")
|
|
||||||
data class FactorioTilesMap(
|
|
||||||
val tiles: Map<PositionData, FactorioTile>,
|
|
||||||
) : FactorioObjectData() {
|
|
||||||
@Transient
|
|
||||||
override val objectName: String = "FactorioTilesMap"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
@SerialName("FactorioTiles")
|
|
||||||
data class FactorioTiles(
|
|
||||||
val tiles: List<FactorioTile>,
|
|
||||||
) : FactorioObjectData() {
|
|
||||||
@Transient
|
|
||||||
override val objectName: String = "FactorioTiles"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
@SerialName("LuaTile")
|
|
||||||
data class FactorioTile(
|
|
||||||
val prototypeName: String,
|
|
||||||
val position: PositionData,
|
|
||||||
val surfaceIndex: Int,
|
|
||||||
) : FactorioObjectData() {
|
|
||||||
@Transient
|
|
||||||
override val objectName: String = "LuaTile"
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,108 @@
|
||||||
|
package dev.adamko.kafkatorio.events.schema
|
||||||
|
|
||||||
|
import kotlinx.serialization.SerialName
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
import kotlinx.serialization.Transient
|
||||||
|
import kotlinx.serialization.json.JsonClassDiscriminator
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
@JsonClassDiscriminator(FactorioObjectData.discriminatorKey)
|
||||||
|
sealed class FactorioObjectData {
|
||||||
|
|
||||||
|
abstract val objectName: String
|
||||||
|
|
||||||
|
// workaround - https://github.com/Kotlin/kotlinx.serialization/issues/1664
|
||||||
|
// val objectName: String by lazy {
|
||||||
|
// serializer().descriptor.serialName
|
||||||
|
// }
|
||||||
|
|
||||||
|
// val objectName: String by lazy {
|
||||||
|
// kotlinx.serialization.serializer(this::class.starProjectedType).descriptor.serialName
|
||||||
|
// }
|
||||||
|
|
||||||
|
// alternative: find the @SerialName annotation
|
||||||
|
// Again it must be delegated so there's no backing field and kxs ignores it
|
||||||
|
// val objectName: String by lazy {
|
||||||
|
// requireNotNull(this::class.findAnnotation<SerialName>()?.value) {
|
||||||
|
// "Couldn't find @SerialName for ${this::class}!"
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
/** The [JsonClassDiscriminator] for [FactorioEvent] */
|
||||||
|
const val discriminatorKey: String = "objectName"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
@SerialName("LuaPlayer")
|
||||||
|
data class PlayerData(
|
||||||
|
@Serializable(with = ListAsObjectSerializer::class)
|
||||||
|
val associatedCharactersUnitNumbers: List<UInt>,
|
||||||
|
val characterUnitNumber: UInt?,
|
||||||
|
val name: String,
|
||||||
|
val position: PositionData,
|
||||||
|
val colour: Colour,
|
||||||
|
val chatColour: Colour,
|
||||||
|
val lastOnline: UInt,
|
||||||
|
) : FactorioObjectData() {
|
||||||
|
@Transient
|
||||||
|
override val objectName: String = "LuaPlayer"
|
||||||
|
}
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
@SerialName("LuaEntity")
|
||||||
|
data class EntityData(
|
||||||
|
val active: Boolean,
|
||||||
|
val health: Double?,
|
||||||
|
val healthRatio: Double,
|
||||||
|
val name: String,
|
||||||
|
val position: PositionData,
|
||||||
|
val surfaceIndex: Int,
|
||||||
|
val type: String,
|
||||||
|
val unitNumber: UInt? = null,
|
||||||
|
val playerIndex: UInt? = null,
|
||||||
|
) : FactorioObjectData() {
|
||||||
|
@Transient
|
||||||
|
override val objectName: String = "LuaEntity"
|
||||||
|
}
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
@SerialName("LuaSurface")
|
||||||
|
data class SurfaceData(
|
||||||
|
val daytime: Double,
|
||||||
|
val index: UInt,
|
||||||
|
val name: String,
|
||||||
|
) : FactorioObjectData() {
|
||||||
|
@Transient
|
||||||
|
override val objectName: String = "LuaSurface"
|
||||||
|
}
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
@SerialName("FactorioTilesMap")
|
||||||
|
data class FactorioTilesMap(
|
||||||
|
val tiles: Map<PositionData, FactorioTile>,
|
||||||
|
) : FactorioObjectData() {
|
||||||
|
@Transient
|
||||||
|
override val objectName: String = "FactorioTilesMap"
|
||||||
|
}
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
@SerialName("LuaTile")
|
||||||
|
data class FactorioTile(
|
||||||
|
val prototypeName: String,
|
||||||
|
val position: PositionData,
|
||||||
|
val surfaceIndex: Int,
|
||||||
|
) : FactorioObjectData() {
|
||||||
|
@Transient
|
||||||
|
override val objectName: String = "LuaTile"
|
||||||
|
}
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class ConsoleChatMessage(
|
||||||
|
val authorPlayerIndex: UInt?,
|
||||||
|
val content: String,
|
||||||
|
) : FactorioObjectData() {
|
||||||
|
@Transient
|
||||||
|
override val objectName: String = "ConsoleChatMessage"
|
||||||
|
}
|
||||||
|
|
@ -6,9 +6,19 @@ import kotlinx.serialization.Transient
|
||||||
import kotlinx.serialization.json.JsonClassDiscriminator
|
import kotlinx.serialization.json.JsonClassDiscriminator
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@JsonClassDiscriminator(FactorioObjectDataDiscriminatorKey)
|
class FactorioPrototypes<T : FactorioPrototype>(
|
||||||
|
override val modVersion: String,
|
||||||
|
val prototypes: List<T>,
|
||||||
|
) : KafkatorioPacket
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
@JsonClassDiscriminator(FactorioPrototype.discriminatorKey)
|
||||||
sealed class FactorioPrototype {
|
sealed class FactorioPrototype {
|
||||||
abstract val objectName: String
|
abstract val objectName: String
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val discriminatorKey: String = "objectName"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
|
|
@ -20,7 +30,7 @@ data class FactorioMapTilePrototype(
|
||||||
val collisionMasks: List<String>,
|
val collisionMasks: List<String>,
|
||||||
val order: String,
|
val order: String,
|
||||||
|
|
||||||
/** Is this tile mineable at all? */
|
/** Can the tile be mined for resources? */
|
||||||
val canBeMined: Boolean,
|
val canBeMined: Boolean,
|
||||||
) : FactorioPrototype() {
|
) : FactorioPrototype() {
|
||||||
@Transient
|
@Transient
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
package dev.adamko.kafkatorio.events.schema;
|
||||||
|
|
||||||
|
|
||||||
|
//@Serializable
|
||||||
|
sealed interface KafkatorioPacket {
|
||||||
|
/** Schema versioning */
|
||||||
|
val modVersion: String
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//enum class PacketDataType {
|
||||||
|
// EVENT, PROTOTYPE, CONFIG_DATA,
|
||||||
|
// ;
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
//@Serializable
|
||||||
|
//@JsonClassDiscriminator(KafkatorioPacketData.discriminatorKey)
|
||||||
|
//sealed class KafkatorioPacketData(
|
||||||
|
// @SerialName(discriminatorKey)
|
||||||
|
// val dataType: PacketDataType
|
||||||
|
//) {
|
||||||
|
// companion object {
|
||||||
|
// const val discriminatorKey: String = "dataType"
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
@ -1,11 +1,8 @@
|
||||||
package dev.adamko.kafkatorio.events.schema
|
package dev.adamko.kafkatorio.events.schema
|
||||||
|
|
||||||
import java.io.File
|
import kotlin.io.path.Path
|
||||||
import kotlin.reflect.KClass
|
import kotlin.io.path.createDirectories
|
||||||
import kotlin.reflect.KProperty
|
|
||||||
import me.ntrrgc.tsGenerator.ClassTransformer
|
|
||||||
import me.ntrrgc.tsGenerator.TypeScriptGenerator
|
import me.ntrrgc.tsGenerator.TypeScriptGenerator
|
||||||
import me.ntrrgc.tsGenerator.camelCaseToSnakeCase
|
|
||||||
import org.intellij.lang.annotations.Language
|
import org.intellij.lang.annotations.Language
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -15,9 +12,8 @@ fun main(args: Array<String>) {
|
||||||
|
|
||||||
val gen =
|
val gen =
|
||||||
TypeScriptGenerator(
|
TypeScriptGenerator(
|
||||||
rootClasses =
|
rootClasses = buildSet {
|
||||||
buildSet {
|
addAll(KafkatorioPacket::class.sealedSubclasses)
|
||||||
add(FactorioEvent::class)
|
|
||||||
addAll(FactorioObjectData::class.sealedSubclasses)
|
addAll(FactorioObjectData::class.sealedSubclasses)
|
||||||
addAll(FactorioPrototype::class.sealedSubclasses)
|
addAll(FactorioPrototype::class.sealedSubclasses)
|
||||||
},
|
},
|
||||||
|
|
@ -33,7 +29,7 @@ fun main(args: Array<String>) {
|
||||||
ULong::class to "uint64",
|
ULong::class to "uint64",
|
||||||
),
|
),
|
||||||
classTransformers = listOf(
|
classTransformers = listOf(
|
||||||
PropertyNameTransformer,
|
// PropertyNameTransformer,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -44,14 +40,45 @@ fun main(args: Array<String>) {
|
||||||
println(definitions)
|
println(definitions)
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
val out = File(filename)
|
|
||||||
out.parentFile.mkdirs()
|
val outPath = Path(filename)
|
||||||
out.printWriter().use {
|
outPath.createDirectories()
|
||||||
|
|
||||||
|
splitDefinitions(definitions)
|
||||||
|
.forEach { (defFile, def) ->
|
||||||
|
val outFile = outPath.resolve(defFile).toFile()
|
||||||
|
outFile.printWriter().use {
|
||||||
it.print(header)
|
it.print(header)
|
||||||
it.print(definitions)
|
it.print(def)
|
||||||
}
|
}
|
||||||
println("Generated file: $out")
|
println("Generated file: $outFile")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Split the TypeScript interfaces into different files */
|
||||||
|
private fun splitDefinitions(definitions: String): Map<String, String> {
|
||||||
|
return definitions
|
||||||
|
.split("\n\n")
|
||||||
|
.groupBy { def ->
|
||||||
|
when {
|
||||||
|
"extends FactorioObjectData" in def ||
|
||||||
|
"interface FactorioObjectData" in def -> "object-data.d.ts"
|
||||||
|
"extends FactorioPrototype" in def ||
|
||||||
|
"interface FactorioPrototype" in def -> "prototype.d.ts"
|
||||||
|
"extends FactorioConfigurationUpdate" in def ||
|
||||||
|
"interface FactorioConfigurationUpdate" in def ||
|
||||||
|
"FactorioGameDataUpdate" in def ||
|
||||||
|
"FactorioModInfo" in def -> "config-update.d.ts"
|
||||||
|
else -> "schema.d.ts"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.mapValues { (_, def) ->
|
||||||
|
def
|
||||||
|
.joinToString("\n\n", postfix = "\n")
|
||||||
|
.replace(" ", " ")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -59,14 +86,14 @@ fun main(args: Array<String>) {
|
||||||
val header = """
|
val header = """
|
||||||
|// Generated by TypeScriptGenerator - do not edit this file manually
|
|// Generated by TypeScriptGenerator - do not edit this file manually
|
||||||
|
|
|
|
||||||
""".trimMargin()
|
""".trimMargin() + "\n"
|
||||||
|
|
||||||
object PropertyNameTransformer : ClassTransformer {
|
//object PropertyNameTransformer : ClassTransformer {
|
||||||
override fun transformPropertyName(
|
// override fun transformPropertyName(
|
||||||
propertyName: String,
|
// propertyName: String,
|
||||||
property: KProperty<*>,
|
// property: KProperty<*>,
|
||||||
klass: KClass<*>
|
// klass: KClass<*>
|
||||||
): String {
|
// ): String {
|
||||||
return camelCaseToSnakeCase(propertyName)
|
// return camelCaseToSnakeCase(propertyName)
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue