Compare commits

...
2 Commits
Author SHA1 Message Date
Danielv123 7e39b587df 2.1 map exchange strings 2026-01-27 17:00:21 +01:00
Danielv123 e28789c1c0 Fix crash in prometheus logging 2026-01-27 15:57:35 +01:00
2 changed files with 57 additions and 4 deletions

No files matched your search

+54 -4
View File
@@ -1,10 +1,13 @@
import zlib from "zlib"; import zlib from "zlib";
type FactorioVersion = [number, number, number, number];
class MapReaderState { class MapReaderState {
pos = 0; pos = 0;
last_position = { x: 0, y: 0 }; last_position = { x: 0, y: 0 };
/** True when a version greater than 2.0.0 is detected */ /** True when a version greater than 2.0.0 is detected */
v2 = false; v2 = false;
version: FactorioVersion | null = null;
constructor( constructor(
public buf: Buffer public buf: Buffer
) { } ) { }
@@ -110,7 +113,7 @@ function readDict<K, V>(
return mapping; return mapping;
} }
function readVersion(state: MapReaderState) { function readVersion(state: MapReaderState): FactorioVersion {
let major = readUInt16(state); let major = readUInt16(state);
let minor = readUInt16(state); let minor = readUInt16(state);
let patch = readUInt16(state); let patch = readUInt16(state);
@@ -118,6 +121,24 @@ function readVersion(state: MapReaderState) {
return [major, minor, patch, developer]; return [major, minor, patch, developer];
} }
function isVersionAtLeast(state: MapReaderState, major: number, minor: number, patch: number, developer: number) {
if (!state.version) {
return false;
}
const [vMajor, vMinor, vPatch, vDeveloper] = state.version;
if (vMajor !== major) {
return vMajor > major;
}
if (vMinor !== minor) {
return vMinor > minor;
}
if (vPatch !== patch) {
return vPatch > patch;
}
return vDeveloper >= developer;
}
function readFrequencySizeRichness(state: MapReaderState) { function readFrequencySizeRichness(state: MapReaderState) {
return { return {
frequency: readFloat(state), frequency: readFloat(state),
@@ -262,7 +283,8 @@ function readEnemyEvolution(state: MapReaderState) {
} }
function readEnemyExpansion(state: MapReaderState) { function readEnemyExpansion(state: MapReaderState) {
return { let evolutionGroupSizeFactor: number | null | undefined;
const settings = {
enabled: readOptional(state, readBool), enabled: readOptional(state, readBool),
max_expansion_distance: readOptional(state, readUInt32), max_expansion_distance: readOptional(state, readUInt32),
friendly_base_influence_radius: readOptional(state, readUInt32), friendly_base_influence_radius: readOptional(state, readUInt32),
@@ -274,9 +296,36 @@ function readEnemyExpansion(state: MapReaderState) {
max_colliding_tiles_coefficient: readOptional(state, readDouble), max_colliding_tiles_coefficient: readOptional(state, readDouble),
settler_group_min_size: readOptional(state, readUInt32), settler_group_min_size: readOptional(state, readUInt32),
settler_group_max_size: readOptional(state, readUInt32), settler_group_max_size: readOptional(state, readUInt32),
min_expansion_cooldown: readOptional(state, readUInt32), min_expansion_cooldown: null,
max_expansion_cooldown: readOptional(state, readUInt32), max_expansion_cooldown: null,
} as {
enabled: boolean | null;
max_expansion_distance: number | null;
friendly_base_influence_radius: number | null;
enemy_building_influence_radius: number | null;
building_coefficient: number | null;
other_base_coefficient: number | null;
neighbouring_chunk_coefficient: number | null;
neighbouring_base_chunk_coefficient: number | null;
max_colliding_tiles_coefficient: number | null;
settler_group_min_size: number | null;
settler_group_max_size: number | null;
min_expansion_cooldown: number | null;
max_expansion_cooldown: number | null;
evolution_group_size_factor?: number;
}; };
if (isVersionAtLeast(state, 2, 1, 0, 0)) {
evolutionGroupSizeFactor = readOptional(state, readDouble);
}
settings.min_expansion_cooldown = readOptional(state, readUInt32);
settings.max_expansion_cooldown = readOptional(state, readUInt32);
if (evolutionGroupSizeFactor !== undefined) {
settings.evolution_group_size_factor = evolutionGroupSizeFactor ?? 4.0;
}
return settings;
} }
function readUnitGroup(state: MapReaderState) { function readUnitGroup(state: MapReaderState) {
@@ -427,6 +476,7 @@ export function readMapExchangeString(exchangeString: string) {
try { try {
const version = readVersion(state); const version = readVersion(state);
state.v2 = version[0] >= 2; state.v2 = version[0] >= 2;
state.version = version;
data = { data = {
version: version, version: version,
unknown: readUInt8(state), unknown: readUInt8(state),
+3
View File
@@ -275,6 +275,9 @@ function keyToLabels(key: string) {
if (key !== "") { if (key !== "") {
for (let pair of key.split(",")) { for (let pair of key.split(",")) {
let [name, value] = pair.split("=", 2); let [name, value] = pair.split("=", 2);
if (!name || value === undefined) {
continue;
}
labels.set(name, value labels.set(name, value
.slice(1, -1) .slice(1, -1)
.replace(/\\"/g, "\"") .replace(/\\"/g, "\"")