From 55c07e40f6c11f9773a436b2fca41c013ca17dad Mon Sep 17 00:00:00 2001 From: Sam Schumacher <38103916+HerrSammyDE@users.noreply.github.com> Date: Sat, 11 Apr 2026 19:22:22 +0200 Subject: [PATCH 1/6] feat(games): add American Truck Simulator (ats) support Mirrors the Euro Truck Simulator 2 configuration (valve protocol, port 27015 with query port offset +1). --- GAMES_LIST.md | 1 + lib/games.js | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/GAMES_LIST.md b/GAMES_LIST.md index d6d2d95f..4ff3a4da 100644 --- a/GAMES_LIST.md +++ b/GAMES_LIST.md @@ -28,6 +28,7 @@ | asr08 | Arca Sim Racing '08 | | | assettocorsa | Assetto Corsa | | | atlas | Atlas | [Valve Protocol](#valve) | +| ats | American Truck Simulator | [Valve Protocol](#valve) | | avorion | Avorion | [Valve Protocol](#valve) | | avp2 | Aliens versus Predator 2 | | | avp2010 | Aliens vs. Predator 2010 | [Valve Protocol](#valve) | diff --git a/lib/games.js b/lib/games.js index 77a14560..810ce23c 100644 --- a/lib/games.js +++ b/lib/games.js @@ -89,6 +89,15 @@ export const games = { protocol: 'assettocorsa' } }, + ats: { + name: 'American Truck Simulator', + release_year: 2016, + options: { + port: 27015, + port_query_offset: 1, + protocol: 'valve' + } + }, atlas: { name: 'Atlas', release_year: 2018, From a3f77ee5af42649300c466ec25dbede69b26991b Mon Sep 17 00:00:00 2001 From: Sam Schumacher <38103916+HerrSammyDE@users.noreply.github.com> Date: Sat, 11 Apr 2026 19:22:57 +0200 Subject: [PATCH 2/6] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 4687c380..94faaa62 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ /dist # Deno bin/gamedig executable gamedig +/.claude \ No newline at end of file From f14fcf9ae94f1d23c91de8f87f350897ac49c33f Mon Sep 17 00:00:00 2001 From: Sam Schumacher <38103916+HerrSammyDE@users.noreply.github.com> Date: Sat, 11 Apr 2026 21:48:42 +0200 Subject: [PATCH 3/6] feat(games): add The Cenozoic Era, VEIN and Mindustry support - The Cenozoic Era and VEIN use the Valve A2S protocol with a query port offset of +1 (verified live against running servers). - Mindustry is queried via a new protocol module implementing the arc-net discovery ping: a two-byte UDP request (0xFE 0x01) returns the serialized Host struct (name, map, players, wave, version, vertype, gamemode, player limit, description, modeName). --- GAMES_LIST.md | 3 +++ lib/games.js | 26 +++++++++++++++++++++++++ protocols/index.js | 3 ++- protocols/mindustry.js | 44 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 protocols/mindustry.js diff --git a/GAMES_LIST.md b/GAMES_LIST.md index 4ff3a4da..fe9c020c 100644 --- a/GAMES_LIST.md +++ b/GAMES_LIST.md @@ -191,6 +191,7 @@ | mbe | Minecraft: Bedrock Edition | | | medievalengineers | Medieval Engineers | [Valve Protocol](#valve) | | mgm | Mumble - GT Murmur | [Notes](#mumble) | +| mindustry | Mindustry | | | minecraft | Minecraft | [Notes](#minecraft) | | minetest | Minetest | | | mnc | Monday Night Combat | [Valve Protocol](#valve) | @@ -313,6 +314,7 @@ | terminus | Terminus | | | terrariatshock | Terraria - TShock | [Notes](#terraria) | | tfc | Team Fortress Classic | [Valve Protocol](#valve) | +| thecenozoicera | The Cenozoic Era | [Valve Protocol](#valve) | | theforest | The Forest | [Valve Protocol](#valve) | | thefront | The Front | [Valve Protocol](#valve) | | thehidden | The Hidden | [Valve Protocol](#valve) | @@ -346,6 +348,7 @@ | valheim | Valheim | [Notes](#valheim), [Valve Protocol](#valve) | | vampireslayer | Vampire Slayer | [Valve Protocol](#valve) | | vcm | Vice City Multiplayer | | +| vein | VEIN | [Valve Protocol](#valve) | | ventrilo | Ventrilo | | | vietcong | Vietcong | | | vietcong2 | Vietcong 2 | | diff --git a/lib/games.js b/lib/games.js index 810ce23c..6f23d570 100644 --- a/lib/games.js +++ b/lib/games.js @@ -1939,6 +1939,14 @@ export const games = { doc_notes: 'minecraft' } }, + mindustry: { + name: 'Mindustry', + release_year: 2017, + options: { + port: 6567, + protocol: 'mindustry' + } + }, minetest: { name: 'Minetest', release_year: 2010, @@ -3063,6 +3071,15 @@ export const games = { doc_notes: 'terraria' } }, + thecenozoicera: { + name: 'The Cenozoic Era', + release_year: 2024, + options: { + port: 7777, + port_query_offset: 1, + protocol: 'valve' + } + }, theforest: { name: 'The Forest', release_year: 2014, @@ -3315,6 +3332,15 @@ export const games = { doc_notes: 'valheim' } }, + vein: { + name: 'VEIN', + release_year: 2024, + options: { + port: 7777, + port_query_offset: 1, + protocol: 'valve' + } + }, vcm: { name: 'Vice City Multiplayer', release_year: 2015, diff --git a/protocols/index.js b/protocols/index.js index be4fb317..eb018985 100644 --- a/protocols/index.js +++ b/protocols/index.js @@ -33,6 +33,7 @@ import mafia2online from './mafia2online.js' import minecraft from './minecraft.js' import minecraftbedrock from './minecraftbedrock.js' import minecraftvanilla from './minecraftvanilla.js' +import mindustry from './mindustry.js' import minetest from './minetest.js' import mumble from './mumble.js' import mumbleping from './mumbleping.js' @@ -80,7 +81,7 @@ import scpsl from './scpsl.js' export { armagetron, ase, asa, assettocorsa, battlefield, brokeprotocol, brokeprotocolmaster, buildandshoot, cs2d, discord, doom3, eco, epic, factorio, farmingsimulator, ffow, fivem, gamespy1, gamespy2, gamespy3, geneshift, goldsrc, gtasao, hawakening, hawakeningmaster, hexen2, hytale, jc2mp, kspdmp, mafia2mp, mafia2online, minecraft, - minecraftbedrock, minecraftvanilla, minetest, mumble, mumbleping, nadeo, openttd, palworld, quake1, quake2, quake3, renegadex, renegadexmaster, renown, rfactor, ragemp, samp, + minecraftbedrock, minecraftvanilla, mindustry, minetest, mumble, mumbleping, nadeo, openttd, palworld, quake1, quake2, quake3, renegadex, renegadexmaster, renown, rfactor, ragemp, samp, satisfactory, soldat, savage2, squad, starmade, starsiege, teamspeak2, teamspeak3, terraria, toxikk, tribes1, tribes1master, unreal2, ut3, valve, vcmp, ventrilo, warsow, eldewrito, beammpmaster, beammp, dayz, theisleevrima, xonotic, altvmp, vintagestorymaster, vintagestory, sdtd, scpsl } diff --git a/protocols/mindustry.js b/protocols/mindustry.js new file mode 100644 index 00000000..34c04004 --- /dev/null +++ b/protocols/mindustry.js @@ -0,0 +1,44 @@ +import Core from './core.js' + +const GAMEMODES = ['survival', 'sandbox', 'attack', 'pvp', 'editor'] + +export default class mindustry extends Core { + constructor () { + super() + this.encoding = 'utf8' + this.byteorder = 'be' + } + + async run (state) { + if (!this.options.port) this.options.port = 6567 + + // arc-net discovery request: triggers the Mindustry server to reply + // with a serialized Host struct (see Mindustry NetworkIO.writeServerData). + const request = Buffer.from([0xfe, 0x01]) + const buffer = await this.udpSend(request, b => b) + + const reader = this.reader(buffer) + const name = reader.pascalString(1) + const map = reader.pascalString(1) + const players = reader.int(4) + const wave = reader.int(4) + const version = reader.int(4) + const vertype = reader.pascalString(1) + const gamemodeId = reader.uint(1) + const playerLimit = reader.int(4) + const description = reader.pascalString(1) + const modeName = reader.pascalString(1) + + state.name = name + state.map = map + state.password = false + state.numplayers = players + state.maxplayers = playerLimit + state.version = String(version) + state.raw.wave = wave + state.raw.vertype = vertype + state.raw.gamemode = GAMEMODES[gamemodeId] ?? String(gamemodeId) + state.raw.description = description + state.raw.modeName = modeName + } +} From 45c00cafd5e01b6b996581481c5b558dade68da5 Mon Sep 17 00:00:00 2001 From: Sam Schumacher <38103916+HerrSammyDE@users.noreply.github.com> Date: Sat, 11 Apr 2026 21:51:54 +0200 Subject: [PATCH 4/6] fix(games): rename thecenozoicera to tce Satisfies the MoreThanTwoWordsMakeAcronym naming rule enforced by the id-tests CI check: game names with more than two words require an acronym-style id. --- GAMES_LIST.md | 2 +- lib/games.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/GAMES_LIST.md b/GAMES_LIST.md index fe9c020c..16a75bec 100644 --- a/GAMES_LIST.md +++ b/GAMES_LIST.md @@ -305,6 +305,7 @@ | synergy | Synergy | [Valve Protocol](#valve) | | t1s | Tribes 1: Starsiege | | | tacticalops | Tactical Ops | | +| tce | The Cenozoic Era | [Valve Protocol](#valve) | | tcgraw | Tom Clancy's Ghost Recon Advanced Warfighter | | | tcgraw2 | Tom Clancy's Ghost Recon Advanced Warfighter 2 | | | teamfactor | Team Factor | | @@ -314,7 +315,6 @@ | terminus | Terminus | | | terrariatshock | Terraria - TShock | [Notes](#terraria) | | tfc | Team Fortress Classic | [Valve Protocol](#valve) | -| thecenozoicera | The Cenozoic Era | [Valve Protocol](#valve) | | theforest | The Forest | [Valve Protocol](#valve) | | thefront | The Front | [Valve Protocol](#valve) | | thehidden | The Hidden | [Valve Protocol](#valve) | diff --git a/lib/games.js b/lib/games.js index 6f23d570..22163527 100644 --- a/lib/games.js +++ b/lib/games.js @@ -3071,7 +3071,7 @@ export const games = { doc_notes: 'terraria' } }, - thecenozoicera: { + tce: { name: 'The Cenozoic Era', release_year: 2024, options: { From fa37d2e47be5479f24fd25e69e419fb291b0d56b Mon Sep 17 00:00:00 2001 From: Sam Schumacher <38103916+HerrSammyDE@users.noreply.github.com> Date: Tue, 5 May 2026 01:11:06 +0200 Subject: [PATCH 5/6] Update .gitignore --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 94faaa62..2410e66d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,4 @@ /.idea /dist # Deno bin/gamedig executable -gamedig -/.claude \ No newline at end of file +gamedig \ No newline at end of file From 7c0a2e4dbc1c50d9da1a3377c278a37accd6b3ab Mon Sep 17 00:00:00 2001 From: CosminPerRam Date: Tue, 26 May 2026 22:01:49 +0300 Subject: [PATCH 6/6] meta: restore .gitignore endline --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 2410e66d..4687c380 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ /.idea /dist # Deno bin/gamedig executable -gamedig \ No newline at end of file +gamedig