diff --git a/README.md b/README.md index 3771a97..56d7f2d 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,18 @@ import { DemoParser } from "sdfz-demo-parser"; console.log(demo.info.spectators[1].name); // [Fx]Jazcash })(); ``` +Header Infos Only +```ts +import { DemoParser } from "sdfz-demo-parser"; + +(async () => { + const demoPath = "./example/20201219_003920_Altored Divide Bar Remake 1_104.0.1-1707-gc0fc18e BAR.sdfz"; + + const meta = await DemoParser.getHeaders(demoPath); + + console.log(meta.header.gameId); +})(); +``` ## Development diff --git a/src/demo-parser.ts b/src/demo-parser.ts index 1d93a20..1b4b51a 100644 --- a/src/demo-parser.ts +++ b/src/demo-parser.ts @@ -1,3 +1,6 @@ +import {createReadStream} from "node:fs"; +import {createGunzip} from "node:zlib"; + import { promises as fs } from "fs"; import { ungzip } from "node-gzip"; import * as path from "path"; @@ -94,7 +97,7 @@ export class DemoParser { this.bufferStream = new BufferStream(sdf); - this.header = this.parseHeader(); + this.header = DemoParser.parseHeader(this.bufferStream); const script = this.bufferStream.read(this.header.scriptSize); @@ -159,26 +162,115 @@ export class DemoParser { }; } - protected parseHeader() : DemoModel.Header { + public static getHeaders(demoFilePath: string): Promise { + return new Promise((resolve, reject) => { + const HEADER_SIZE = 352; + const chunks: Buffer[] = []; + let totalLength = 0; + let header: DemoModel.Header | null = null; + let requiredBytes = HEADER_SIZE; + let resolved = false; + + const fileStream = createReadStream(demoFilePath); + const gunzip = createGunzip(); + + const cleanup = () => { + gunzip.removeAllListeners(); + fileStream.removeAllListeners(); + gunzip.destroy(); + fileStream.destroy(); + }; + + gunzip.on("data", (chunk: Buffer) => { + if (resolved) { + return; + } + + chunks.push(chunk); + totalLength += chunk.length; + + if (!header && totalLength >= HEADER_SIZE) { + const buffer = Buffer.concat(chunks); + header = DemoParser.parseHeader(new BufferStream(buffer)); + requiredBytes = HEADER_SIZE + header.scriptSize; + } + + if (header && totalLength >= requiredBytes) { + resolved = true; + cleanup(); + + const buffer = Buffer.concat(chunks); + const script = buffer.subarray(HEADER_SIZE, HEADER_SIZE + header.scriptSize); + const scriptParser = new ScriptParser({}); + const scriptInfo = scriptParser.parseScript(script); + + const meta: Omit = { + gameId: header.gameId, + engine: header.versionString, + game: scriptInfo.hostSettings.gametype, + map: scriptInfo.hostSettings.mapname, + startTime: header.startTime, + durationMs: header.wallclockTime * 1000, + fullDurationMs: header.wallclockTime * 1000, + startPosType: parseInt(scriptInfo.hostSettings.startpostype) + }; + + resolve({ + info: { meta, ...scriptInfo }, + header, + script: script.toString(), + }); + } + }); + + gunzip.on("error", (err) => { + if (!resolved) { + resolved = true; + cleanup(); + reject(err); + } + }); + + gunzip.on("end", () => { + if (!resolved) { + resolved = true; + cleanup(); + reject(new Error("Unexpected end of gzip stream before reading complete header and script")); + } + }); + + fileStream.on("error", (err) => { + if (!resolved) { + resolved = true; + cleanup(); + reject(err); + } + }); + + fileStream.pipe(gunzip); + }); + } + + protected static parseHeader(bufferStream: BufferStream) : DemoModel.Header { return { - magic: this.bufferStream.readString(16), - version: this.bufferStream.readInt(), - headerSize: this.bufferStream.readInt(), - versionString: this.bufferStream.readString(256, true), - gameId: this.bufferStream.read(16).toString("hex"), - startTime: new Date(Number(this.bufferStream.readBigInt()) * 1000), - scriptSize: this.bufferStream.readInt(), - demoStreamSize: this.bufferStream.readInt(), - gameTime: this.bufferStream.readInt(), - wallclockTime: this.bufferStream.readInt(), - numPlayers: this.bufferStream.readInt(), - playerStatSize: this.bufferStream.readInt(), - playerStatElemSize: this.bufferStream.readInt(), - numTeams: this.bufferStream.readInt(), - teamStatSize: this.bufferStream.readInt(), - teamStatElemSize: this.bufferStream.readInt(), - teamStatPeriod: this.bufferStream.readInt(), - winningAllyTeamsSize: this.bufferStream.readInt(), + magic: bufferStream.readString(16), + version: bufferStream.readInt(), + headerSize: bufferStream.readInt(), + versionString: bufferStream.readString(256, true), + gameId: bufferStream.read(16).toString("hex"), + startTime: new Date(Number(bufferStream.readBigInt()) * 1000), + scriptSize: bufferStream.readInt(), + demoStreamSize: bufferStream.readInt(), + gameTime: bufferStream.readInt(), + wallclockTime: bufferStream.readInt(), + numPlayers: bufferStream.readInt(), + playerStatSize: bufferStream.readInt(), + playerStatElemSize: bufferStream.readInt(), + numTeams: bufferStream.readInt(), + teamStatSize: bufferStream.readInt(), + teamStatElemSize: bufferStream.readInt(), + teamStatPeriod: bufferStream.readInt(), + winningAllyTeamsSize: bufferStream.readInt(), }; } diff --git a/src/model/demo-model.ts b/src/model/demo-model.ts index 96c7dfe..52f3781 100644 --- a/src/model/demo-model.ts +++ b/src/model/demo-model.ts @@ -161,6 +161,12 @@ export namespace DemoModel { } } + export type HeadersOnly = { + info: Omit & { meta: Omit }; + header: Header; + script: string; + } + export type ChatMessage = { timeMs: number; playerId: number; diff --git a/test/__snapshots__/20201219_003920_Altored Divide Bar Remake 1_104.0.1-1707-gc0fc18e BAR.headers.json b/test/__snapshots__/20201219_003920_Altored Divide Bar Remake 1_104.0.1-1707-gc0fc18e BAR.headers.json new file mode 100644 index 0000000..4cffab2 --- /dev/null +++ b/test/__snapshots__/20201219_003920_Altored Divide Bar Remake 1_104.0.1-1707-gc0fc18e BAR.headers.json @@ -0,0 +1,308 @@ +{ + "info": { + "meta": { + "gameId": "b44bdd5f15aa52d5f2b60c3bf84a62b8", + "engine": "104.0.1-1707-gc0fc18e BAR", + "game": "Beyond All Reason test-15077-b342469", + "map": "Altored Divide Bar Remake 1.55", + "startTime": "2020-12-19T00:39:20.000Z", + "durationMs": 860000, + "fullDurationMs": 860000, + "startPosType": 2 + }, + "hostSettings": { + "autohostrank": "4", + "numplayers": "11", + "gametype": "Beyond All Reason test-15077-b342469", + "autohostport": "53108", + "hostip": "", + "ishost": "1", + "mapname": "Altored Divide Bar Remake 1.55", + "startpostype": "2", + "numrestrictions": "0", + "autohostaccountid": "3125", + "autohostname": "[teh]host08", + "autohostcountrycode": "HU", + "hostport": "53208", + "numallyteams": "2", + "hosttype": "SPADS", + "numteams": "8" + }, + "gameSettings": { + "disablemapdamage": "0", + "maxunits": "2000", + "chicken_custom_spawnchance": "33", + "chicken_custom_lobberemp": "4", + "newbie_placer": "0", + "transportenemy": "notcoms", + "allowmapmutators": "1", + "fixedallies": "1", + "chicken_custom_chickenspawn": "90", + "chicken_maxchicken": "300", + "startmetal": "1000", + "chicken_queendifficulty": "n_chickenq", + "armageddontime": "0", + "allowuserwidgets": "1", + "deathmode": "com", + "map_terraintype": "enabled", + "chicken_custom_minchicken": "8", + "ffa_mode": "0", + "chicken_chickenstart": "alwaysbox", + "chicken_custom_angerbonus": "0.15", + "scavtechcurve": "normal", + "startenergy": "1000", + "custom_expstep": "1.5", + "chicken_custom_damagemod": "100", + "chicken_queenanger": "1", + "coop": "0", + "scavbosshealth": "normal", + "scavevents": "enabled", + "critters": "1", + "maxspeed": "10", + "chicken_graceperiod": "300", + "shareddynamicalliancevictory": "0", + "minspeed": "0.3", + "scavendless": "disabled", + "map_tidal": "unchanged", + "map_waterlevel": "0", + "scaveventsamount": "normal", + "ruins": "disabled", + "scavdifficulty": "easy", + "chicken_custom_queenspawnmult": "1", + "chicken_queentime": "40", + "lootboxes": "0", + "chicken_custom_burrowspawn": "120" + }, + "mapSettings": {}, + "spadsSettings": {}, + "restrictions": {}, + "allyTeams": [ + { + "allyTeamId": 1, + "startBox": { + "bottom": 1, + "left": 0, + "top": 0.8, + "right": 1 + }, + "playerCount": 4 + }, + { + "allyTeamId": 0, + "startBox": { + "bottom": 0.2, + "left": 0, + "top": 0, + "right": 1 + }, + "playerCount": 4 + } + ], + "players": [ + { + "playerId": 5, + "userId": 131, + "name": "Zecrus", + "countryCode": "US", + "rank": 4, + "skillclass": 3, + "skill": "~30", + "teamId": 5, + "rgbColor": { + "r": 255, + "g": 255, + "b": 0 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 6, + "userId": 4487, + "name": "TankTank", + "countryCode": "??", + "rank": 1, + "skillclass": 5, + "skillUncertainty": 3, + "skill": "~16", + "teamId": 6, + "rgbColor": { + "r": 0, + "g": 0, + "b": 0 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 2, + "userId": 2154, + "name": "[WxN]PHILmyCrack", + "countryCode": "DE", + "rank": 3, + "skillclass": 4, + "skillUncertainty": 2, + "skill": "~25", + "teamId": 2, + "rgbColor": { + "r": 255, + "g": 0, + "b": 255 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 4, + "userId": 26, + "name": "[Fx]ShoX", + "countryCode": "GB", + "rank": 4, + "skillclass": 2, + "skill": "35.68", + "teamId": 4, + "rgbColor": { + "r": 140.00009999999997, + "g": 140.00009999999997, + "b": 255 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 7, + "userId": 2834, + "name": "raphael972", + "countryCode": "FR", + "rank": 4, + "skillclass": 5, + "skillUncertainty": 1, + "skill": "~16", + "teamId": 7, + "rgbColor": { + "r": 0, + "g": 255, + "b": 255 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 3, + "userId": 4676, + "name": "badosu", + "countryCode": "BR", + "rank": 3, + "skillclass": 5, + "skillUncertainty": 3, + "skill": "~10", + "teamId": 3, + "rgbColor": { + "r": 140.00009999999997, + "g": 255, + "b": 140.00009999999997 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 1, + "userId": 2708, + "name": "[Fx]HappyFace", + "countryCode": "GB", + "rank": 3, + "skillclass": 5, + "skillUncertainty": 3, + "skill": "26.87", + "teamId": 1, + "rgbColor": { + "r": 0, + "g": 255, + "b": 0 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 0, + "userId": 2697, + "name": "[Fx]Drone", + "countryCode": "GB", + "rank": 4, + "skillclass": 2, + "skillUncertainty": 2, + "skill": "36.68", + "teamId": 0, + "rgbColor": { + "r": 0, + "g": 0, + "b": 255 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + } + ], + "ais": [], + "spectators": [ + { + "playerId": 9, + "userId": 35, + "name": "Raffeh", + "countryCode": "GB", + "rank": 3, + "skillclass": 4, + "skillUncertainty": 2, + "skill": "~25" + }, + { + "playerId": 8, + "userId": 36, + "name": "[Fx]Jazcash", + "countryCode": "GB", + "rank": 4, + "skillclass": 2, + "skillUncertainty": 1, + "skill": "37.70" + }, + { + "playerId": 10, + "userId": 3, + "name": "Floris", + "countryCode": "NL", + "rank": 5, + "skillclass": 5, + "skillUncertainty": 3, + "skill": "22.14" + } + ] + }, + "header": { + "magic": "spring demofile", + "version": 5, + "headerSize": 352, + "versionString": "104.0.1-1707-gc0fc18e BAR", + "gameId": "b44bdd5f15aa52d5f2b60c3bf84a62b8", + "startTime": "2020-12-19T00:39:20.000Z", + "scriptSize": 3781, + "demoStreamSize": 1889772, + "gameTime": 782, + "wallclockTime": 860, + "numPlayers": 11, + "playerStatSize": 220, + "playerStatElemSize": 20, + "numTeams": 8, + "teamStatSize": 34592, + "teamStatElemSize": 80, + "teamStatPeriod": 15, + "winningAllyTeamsSize": 1 + }, + "script": "[game]\n{\n[allyteam1]\n{\nnumallies=0;\nstartrectbottom=1;\nstartrectleft=0;\nstartrecttop=0.8;\nstartrectright=1;\n}\n[restrict]\n{\n}\n[mapoptions]\n{\n}\n[team1]\n{\nteamleader=1;\nrgbcolor=0.00000 1.00000 0.00000;\nallyteam=0;\nhandicap=0;\nside=Armada;\n}\n[player5]\n{\nskillclass=3;\naccountid=131;\nname=Zecrus;\nspectator=0;\ncountrycode=US;\nteam=5;\nskilluncertainty=0;\nrank=4;\nskill=~30;\n}\n[player6]\n{\nskillclass=5;\naccountid=4487;\nname=TankTank;\nspectator=0;\ncountrycode=??;\nteam=6;\nskilluncertainty=3;\nrank=1;\nskill=~16;\n}\n[team4]\n{\nteamleader=4;\nrgbcolor=0.54902 0.54902 1.00000;\nallyteam=1;\nhandicap=0;\nside=Armada;\n}\n[player9]\n{\nskillclass=4;\naccountid=35;\nname=Raffeh;\nspectator=1;\ncountrycode=GB;\nskilluncertainty=2;\nrank=3;\nskill=~25;\n}\n[team7]\n{\nteamleader=7;\nrgbcolor=0.00000 1.00000 1.00000;\nallyteam=1;\nhandicap=0;\nside=Armada;\n}\n[player2]\n{\nskillclass=4;\naccountid=2154;\nname=[WxN]PHILmyCrack;\nspectator=0;\ncountrycode=DE;\nteam=2;\nskilluncertainty=2;\nrank=3;\nskill=~25;\n}\n[team3]\n{\nteamleader=3;\nrgbcolor=0.54902 1.00000 0.54902;\nallyteam=0;\nhandicap=0;\nside=Armada;\n}\n[player4]\n{\nskillclass=2;\naccountid=26;\nname=[Fx]ShoX;\nspectator=0;\ncountrycode=GB;\nteam=4;\nskilluncertainty=0;\nrank=4;\nskill=35.68;\n}\n[allyteam0]\n{\nnumallies=0;\nstartrectbottom=0.2;\nstartrectleft=0;\nstartrecttop=0;\nstartrectright=1;\n}\n[player7]\n{\nskillclass=5;\naccountid=2834;\nname=raphael972;\nspectator=0;\ncountrycode=FR;\nteam=7;\nskilluncertainty=1;\nrank=4;\nskill=~16;\n}\n[player8]\n{\nskillclass=2;\naccountid=36;\nname=[Fx]Jazcash;\nspectator=1;\ncountrycode=GB;\nskilluncertainty=1;\nrank=4;\nskill=37.70;\n}\n[player3]\n{\nskillclass=5;\naccountid=4676;\nname=badosu;\nspectator=0;\ncountrycode=BR;\nteam=3;\nskilluncertainty=3;\nrank=3;\nskill=~10;\n}\n[team6]\n{\nteamleader=6;\nrgbcolor=0.00000 0.00000 0.00000;\nallyteam=1;\nhandicap=0;\nside=Armada;\n}\n[team2]\n{\nteamleader=2;\nrgbcolor=1.00000 0.00000 1.00000;\nallyteam=0;\nhandicap=0;\nside=Armada;\n}\n[modoptions]\n{\ndisablemapdamage=0;\nmaxunits=2000;\nchicken_custom_spawnchance=33;\nchicken_custom_lobberemp=4;\nnewbie_placer=0;\ntransportenemy=notcoms;\nallowmapmutators=1;\nfixedallies=1;\nchicken_custom_chickenspawn=90;\nchicken_maxchicken=300;\nstartmetal=1000;\nchicken_queendifficulty=n_chickenq;\narmageddontime=0;\nallowuserwidgets=1;\ndeathmode=com;\nmap_terraintype=enabled;\nchicken_custom_minchicken=8;\nffa_mode=0;\nchicken_chickenstart=alwaysbox;\nchicken_custom_angerbonus=0.15;\nscavtechcurve=normal;\nstartenergy=1000;\ncustom_expstep=1.5;\nchicken_custom_damagemod=100;\nchicken_queenanger=1;\ncoop=0;\nscavbosshealth=normal;\nscavevents=enabled;\ncritters=1;\nmaxspeed=10;\nchicken_graceperiod=300;\nshareddynamicalliancevictory=0;\nminspeed=0.3;\nscavendless=disabled;\nmap_tidal=unchanged;\nmap_waterlevel=0;\nscaveventsamount=normal;\nruins=disabled;\nscavdifficulty=easy;\nchicken_custom_queenspawnmult=1;\nchicken_queentime=40;\nlootboxes=0;\nchicken_custom_burrowspawn=120;\n}\n[team0]\n{\nteamleader=0;\nrgbcolor=0.00000 0.00000 1.00000;\nallyteam=0;\nhandicap=0;\nside=Armada;\n}\n[player1]\n{\nskillclass=5;\naccountid=2708;\nname=[Fx]HappyFace;\nspectator=0;\ncountrycode=GB;\nteam=1;\nskilluncertainty=3;\nrank=3;\nskill=26.87;\n}\n[player10]\n{\nskillclass=5;\naccountid=3;\nname=Floris;\nspectator=1;\ncountrycode=NL;\nskilluncertainty=3;\nrank=5;\nskill=22.14;\n}\n[player0]\n{\nskillclass=2;\naccountid=2697;\nname=[Fx]Drone;\nspectator=0;\ncountrycode=GB;\nteam=0;\nskilluncertainty=2;\nrank=4;\nskill=36.68;\n}\n[team5]\n{\nteamleader=5;\nrgbcolor=1.00000 1.00000 0.00000;\nallyteam=1;\nhandicap=0;\nside=Armada;\n}\nautohostrank=4;\nnumplayers=11;\ngametype=Beyond All Reason test-15077-b342469;\nautohostport=53108;\nhostip=;\nishost=1;\nmapname=Altored Divide Bar Remake 1.55;\nstartpostype=2;\nnumrestrictions=0;\nautohostaccountid=3125;\nautohostname=[teh]host08;\nautohostcountrycode=HU;\nhostport=53208;\nnumallyteams=2;\nhosttype=SPADS;\nnumteams=8;\n}\n" +} \ No newline at end of file diff --git a/test/__snapshots__/2025-08-08_10-25-43-160_Supreme Isthmus v2_2025.04.08.headers.json b/test/__snapshots__/2025-08-08_10-25-43-160_Supreme Isthmus v2_2025.04.08.headers.json new file mode 100644 index 0000000..a3faff1 --- /dev/null +++ b/test/__snapshots__/2025-08-08_10-25-43-160_Supreme Isthmus v2_2025.04.08.headers.json @@ -0,0 +1,549 @@ +{ + "info": { + "meta": { + "gameId": "a7d0956891e1ffa229f3ffac6d8b25ac", + "engine": "2025.04.08", + "game": "Beyond All Reason test-28438-3f3eceb", + "map": "Supreme Isthmus v2.1", + "startTime": "2025-08-08T10:25:43.000Z", + "durationMs": 937000, + "fullDurationMs": 937000, + "startPosType": 2 + }, + "hostSettings": { + "ishost": "1", + "hostip": "", + "numallyteams": "2", + "server_match_id": "6503429", + "numteams": "16", + "startpostype": "2", + "gametype": "Beyond All Reason test-28438-3f3eceb", + "hosttype": "SPADS", + "mapname": "Supreme Isthmus v2.1", + "autohostport": "54206", + "numrestrictions": "0", + "autohostname": "Host[US4][006]", + "autohostrank": "0", + "autohostaccountid": "235166", + "numplayers": "16", + "autohostcountrycode": "US", + "hostport": "53206" + }, + "gameSettings": { + "transportenemy": "notcoms", + "tweakunits3": "", + "experimentalextraunits": "0", + "map_lavahighdwell": "60", + "maxunits": "2000", + "unit_restrictions_noair": "0", + "raptor_firstwavesboost": "1", + "raptor_raptorstart": "initialbox", + "assistdronescount": "10", + "disablemapdamage": "0", + "nowasting": "default", + "scav_spawntimemult": "1", + "draft_mode": "skill", + "unit_restrictions_noendgamelrpc": "0", + "tweakunits": "", + "debugcommands": "", + "allowpausegameplay": "1", + "multiplier_energyproduction": "1", + "unit_restrictions_nonukes": "0", + "evocomleveluptime": "5", + "factory_costs": "0", + "scav_spawncountmult": "1", + "multiplier_builddistance": "1", + "tweakdefs3": "", + "assistdronesair": "1", + "startenergy": "1000", + "junorework": "0", + "tweakdefs2": "", + "ruins_civilian_disable": "0", + "startmetal": "1000", + "teamffa_start_boxes_shuffle": "1", + "forceallunits": "0", + "raptor_spawncountmult": "1", + "mapmetadata_startpos": "eJyNksFqhDAQht9lzkIzk4mTeO0LeOit7EFaS4WtLsalXRbfvTgxy4IL7kUk3zf5k1-vcBpiN3VDH6G6Qo3L8w8qQSzgApUQ-rmAGs0KENmVijAYVJRn0CAFRY4ToZUEKVkBWxuU2Jwj6wh765RwJhRIiRUSJS6TQE4JOWOUlJnwOoNESvIBvJW0btjoZjmf0KW9EIWV5HxyaFMFwdsF5Hh2IY0Is4bkdA4hpXgnCiQDK2ki-HRgn4FHXtONaHq41exk7dKUdp4LmNrmB6r3K5yOzaUdY92Ob7rkC4jdZxsVxqkZp_Q6DscWKohtAwXEU_Pb10PXT1AtX3kubsLUfnxvDLo3mm7cCPZe-BqHftoovK-4faXcKC8PTyz33qNLe5gPi_JcRWG3IjR7HSHuXw_pCeeJsnHb9uOe0O0VheXS1CH9cq_DeVml-TD_A7ALNtk", + "splittiers": "0", + "lootboxes": "scav_only", + "ffa_wreckage": "0", + "factionlimiter": "0", + "animationcleanup": "0", + "multiplier_weaponrange": "1", + "multiplier_maxvelocity": "1", + "raptor_queentimemult": "1", + "tax_resource_sharing_amount": "0", + "tweakunits9": "", + "ruins_density": "normal", + "assistdronesenabled": "disabled", + "tweakdefs7": "", + "map_waterlevel": "0", + "scav_difficulty": "normal", + "unit_restrictions_notech3": "0", + "comrespawn": "evocom", + "unit_restrictions_notech2": "0", + "dummyboolfeelfreetotouch": "0", + "disable_unit_sharing": "0", + "multiplier_shieldpower": "1", + "tweakdefs5": "", + "commanderbuildersenabled": "disabled", + "tweakdefs": "", + "unit_restrictions_noconverters": "0", + "emprework": "0", + "pushresistant": "0", + "raptor_graceperiodmult": "1", + "evocomlevelcap": "10", + "evocomlevelupmethod": "dynamic", + "map_lavatidemode": "lavastartlow", + "tweakdefs9": "", + "temp_enable_territorial_domination": "0", + "tweakunits4": "", + "multiplier_buildpower": "1", + "unit_restrictions_nodefence": "0", + "teamcolors_icon_dev_mode": "disabled", + "scav_scavstart": "initialbox", + "assistdronesbuildpowermultiplier": "1", + "ruins": "scav_only", + "ruins_only_t1": "0", + "shieldsrework": "0", + "proposed_unit_reworks": "0", + "map_lavalowlevel": "0", + "map_lavahighlevel": "0", + "multiplier_resourceincome": "1", + "scavunitsforplayers": "0", + "evocomlevelupmultiplier": "1", + "tweakdefs8": "", + "map_tidal": "unchanged", + "unit_restrictions_nolrpc": "0", + "evocomxpmultiplier": "1", + "unit_restrictions_noextractors": "0", + "multiplier_turnrate": "1", + "tweakdefs1": "", + "map_lavalowdwell": "300", + "norushtimer": "0", + "raptor_spawntimemult": "1", + "skyshift": "0", + "tweakunits2": "", + "tweakunits8": "", + "lootboxes_density": "normal", + "multiplier_energyconversion": "1", + "allowuserwidgets": "1", + "shareddynamicalliancevictory": "0", + "tweakunits5": "", + "evocom": "0", + "unit_restrictions_notacnukes": "0", + "experimentallegionfaction": "0", + "experimentalshields": "unchanged", + "startenergystorage": "1000", + "raptor_queen_count": "1", + "unit_restrictions_nofusion": "0", + "startmetalstorage": "1000", + "scav_boss_count": "1", + "map_atmosphere": "1", + "lategame_rebalance": "0", + "map_lavatiderhythm": "default", + "multiplier_metalextraction": "1", + "tweakunits6": "", + "multiplier_losrange": "1", + "tweakdefs4": "", + "scav_endless": "0", + "disable_fogofwar": "0", + "tweakunits1": "", + "unit_restrictions_noantinuke": "0", + "ranked_game": "1", + "unit_restrictions_notech15": "0", + "fixedallies": "1", + "coop": "0", + "territorial_domination_config": "default", + "dynamiccheats": "1", + "scav_bosstimemult": "1", + "critters": "1", + "tweakunits7": "", + "commanderbuildersrange": "1000", + "defaultdecals": "1", + "multiplier_weapondamage": "1", + "releasecandidates": "0", + "multiplier_radarrange": "1", + "map_waterislava": "0", + "commanderbuildersbuildpower": "400", + "disable_assist_ally_construction": "0", + "raptor_difficulty": "normal", + "unit_market": "0", + "raptor_endless": "0", + "tweakdefs6": "", + "teamcolors_anonymous_mode": "disabled", + "ai_incomemultiplier": "1", + "deathmode": "com", + "air_rework": "0" + }, + "mapSettings": { + "dry": "0" + }, + "spadsSettings": { + "clanmode": "tag(5):pref(5)", + "autobalance": "advanced", + "colorsensitivity": "-1", + "nbplayerbyid": "1", + "rankmode": "account", + "minplayers": "1", + "botsrank": "3", + "extrabox": "0", + "forcestarted": "0", + "maxspecs": "", + "autostop": "gameOver", + "nospecdraw": "0", + "autoaddbotnb": "0", + "springservertype": "dedicated", + "autostart": "off", + "speedcontrol": "2", + "autofixcolors": "off", + "autospecextraplayers": "1", + "skillmode": "rank", + "minteamsize": "1", + "autoblockcolors": "0", + "teamsize": "8", + "idsharemode": "off", + "autoblockbalance": "1", + "nbteams": "2", + "spadsversion": "0.13.43", + "nospecchat": "0", + "balancemode": "clan:skill" + }, + "restrictions": {}, + "allyTeams": [ + { + "allyTeamId": 1, + "startBox": { + "bottom": 1, + "left": 0, + "top": 0.6, + "right": 0.4 + }, + "playerCount": 8 + }, + { + "allyTeamId": 0, + "startBox": { + "bottom": 0.4, + "left": 0.6, + "top": 0, + "right": 1 + }, + "playerCount": 8 + } + ], + "players": [ + { + "playerId": 10, + "userId": 354015, + "name": "Svinpals", + "countryCode": "SE", + "rank": 4, + "skillUncertainty": 3.1, + "skill": "[19.53]", + "teamId": 10, + "rgbColor": { + "r": 178.9998, + "g": 44.00025, + "b": 147.99945 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Cortex" + }, + { + "playerId": 6, + "userId": 427343, + "name": "zaGeneral", + "countryCode": "RO", + "rank": 2, + "skillUncertainty": 4.66, + "skill": "[8.91]", + "teamId": 6, + "rgbColor": { + "r": 166.9995, + "g": 104.9988, + "b": 167.9991 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 8, + "userId": 171361, + "name": "RighteousRacoon", + "countryCode": "DE", + "rank": 2, + "skillUncertainty": 7.42, + "skill": "[23.37]", + "teamId": 8, + "rgbColor": { + "r": 174.99885, + "g": 69.00045, + "b": 45.999449999999996 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 14, + "userId": 315054, + "name": "Wittmann", + "countryCode": "DE", + "rank": 3, + "skillUncertainty": 3.98, + "skill": "[13.54]", + "teamId": 14, + "rgbColor": { + "r": 108.00015, + "g": 210.99975, + "b": 52.9992 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Cortex" + }, + { + "playerId": 4, + "userId": 356043, + "name": "Brotato69", + "countryCode": "AU", + "rank": 4, + "skillUncertainty": 3.42, + "skill": "[14.39]", + "teamId": 4, + "rgbColor": { + "r": 99.0012, + "g": 214.00109999999998, + "b": 163.0011 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 7, + "userId": 427052, + "name": "GoGorilla", + "countryCode": "SE", + "rank": 2, + "skillUncertainty": 5, + "skill": "[6.16]", + "teamId": 7, + "rgbColor": { + "r": 57.999750000000006, + "g": 49.0008, + "b": 70.00004999999999 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 1, + "userId": 390075, + "name": "spanky23", + "countryCode": "AU", + "rank": 1, + "skillUncertainty": 7.84, + "skill": "[21.78]", + "teamId": 1, + "rgbColor": { + "r": 21.99885, + "g": 140.00009999999997, + "b": 216.0003 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 9, + "userId": 63982, + "name": "CanIhavesomeshoes", + "countryCode": "AU", + "rank": 4, + "skillUncertainty": 4.24, + "skill": "[22.42]", + "teamId": 9, + "rgbColor": { + "r": 52.9992, + "g": 12.9999, + "b": 6.00015 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Cortex" + }, + { + "playerId": 2, + "userId": 90793, + "name": "Dawn005", + "countryCode": "AU", + "rank": 5, + "skillUncertainty": 2.98, + "skill": "[19.11]", + "teamId": 2, + "rgbColor": { + "r": 120.00045, + "g": 115.99950000000001, + "b": 44.999849999999995 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 15, + "userId": 404701, + "name": "Nixha", + "countryCode": "US", + "rank": 2, + "skillUncertainty": 6.99, + "skill": "[3.06]", + "teamId": 15, + "rgbColor": { + "r": 144.00105000000002, + "g": 178.9998, + "b": 87.0009 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 12, + "userId": 405087, + "name": "Eggnstein", + "countryCode": "AU", + "rank": 2, + "skillUncertainty": 5.25, + "skill": "[16.57]", + "teamId": 12, + "rgbColor": { + "r": 204.9996, + "g": 153.99960000000002, + "b": 150.00119999999998 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 13, + "userId": 383408, + "name": "SethAlamut", + "countryCode": "DE", + "rank": 2, + "skillUncertainty": 5.21, + "skill": "[13.86]", + "teamId": 13, + "rgbColor": { + "r": 70.00004999999999, + "g": 1.9991999999999999, + "b": 51 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 11, + "userId": 382001, + "name": "scoobydoob", + "countryCode": "GB", + "rank": 2, + "skillUncertainty": 4.21, + "skill": "[17.82]", + "teamId": 11, + "rgbColor": { + "r": 230.9994, + "g": 152.0004, + "b": 76.0002 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Cortex" + }, + { + "playerId": 3, + "userId": 363234, + "name": "AzurePure", + "countryCode": "SG", + "rank": 3, + "skillUncertainty": 3.58, + "skill": "[16.73]", + "teamId": 3, + "rgbColor": { + "r": 229.9998, + "g": 70.00004999999999, + "b": 235.00035 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 0, + "userId": 358687, + "name": "Feathers", + "countryCode": "AU", + "rank": 3, + "skillUncertainty": 3.4, + "skill": "[22.92]", + "teamId": 0, + "rgbColor": { + "r": 48.0012, + "g": 214.00109999999998, + "b": 152.0004 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Cortex" + }, + { + "playerId": 5, + "userId": 145817, + "name": "[OWL]leobase", + "countryCode": "DE", + "rank": 4, + "skillUncertainty": 4.04, + "skill": "[12.96]", + "teamId": 5, + "rgbColor": { + "r": 235.99995, + "g": 173.99925, + "b": 118.00125 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + } + ], + "ais": [], + "spectators": [] + }, + "header": { + "magic": "spring demofile", + "version": 5, + "headerSize": 352, + "versionString": "2025.04.08", + "gameId": "a7d0956891e1ffa229f3ffac6d8b25ac", + "startTime": "2025-08-08T10:25:43.000Z", + "scriptSize": 8469, + "demoStreamSize": 3038824, + "gameTime": 768, + "wallclockTime": 937, + "numPlayers": 19, + "playerStatSize": 380, + "playerStatElemSize": 20, + "numTeams": 15, + "teamStatSize": 60, + "teamStatElemSize": 80, + "teamStatPeriod": 15, + "winningAllyTeamsSize": 1 + }, + "script": "[game]\n{\n[player10]\n{\nteam=10;\ncountrycode=SE;\naccountid=354015;\nname=Svinpals;\nrank=4;\nskill=[19.53];\nspectator=0;\nskilluncertainty=3.1;\n}\n[player6]\n{\nteam=6;\ncountrycode=RO;\naccountid=427343;\nname=zaGeneral;\nrank=2;\nskill=[8.91];\nspectator=0;\nskilluncertainty=4.66;\n}\n[team13]\n{\nallyteam=1;\nteamleader=13;\nrgbcolor=0.27451 0.00784 0.20000;\nside=Armada;\nhandicap=0;\n}\n[player8]\n{\nteam=8;\ncountrycode=DE;\naccountid=171361;\nname=RighteousRacoon;\nrank=2;\nskill=[23.37];\nspectator=0;\nskilluncertainty=7.42;\n}\n[modoptions]\n{\ntransportenemy=notcoms;\ntweakunits3=;\nexperimentalextraunits=0;\nmap_lavahighdwell=60;\nmaxunits=2000;\nunit_restrictions_noair=0;\nraptor_firstwavesboost=1;\nraptor_raptorstart=initialbox;\nassistdronescount=10;\ndisablemapdamage=0;\nnowasting=default;\nscav_spawntimemult=1;\ndraft_mode=skill;\nunit_restrictions_noendgamelrpc=0;\ntweakunits=;\ndebugcommands=;\nallowpausegameplay=1;\nmultiplier_energyproduction=1;\nunit_restrictions_nonukes=0;\nevocomleveluptime=5;\nfactory_costs=0;\nscav_spawncountmult=1;\nmultiplier_builddistance=1;\ntweakdefs3=;\nassistdronesair=1;\nstartenergy=1000;\njunorework=0;\ntweakdefs2=;\nruins_civilian_disable=0;\nstartmetal=1000;\nteamffa_start_boxes_shuffle=1;\nforceallunits=0;\nraptor_spawncountmult=1;\nmapmetadata_startpos=eJyNksFqhDAQht9lzkIzk4mTeO0LeOit7EFaS4WtLsalXRbfvTgxy4IL7kUk3zf5k1-vcBpiN3VDH6G6Qo3L8w8qQSzgApUQ-rmAGs0KENmVijAYVJRn0CAFRY4ToZUEKVkBWxuU2Jwj6wh765RwJhRIiRUSJS6TQE4JOWOUlJnwOoNESvIBvJW0btjoZjmf0KW9EIWV5HxyaFMFwdsF5Hh2IY0Is4bkdA4hpXgnCiQDK2ki-HRgn4FHXtONaHq41exk7dKUdp4LmNrmB6r3K5yOzaUdY92Ob7rkC4jdZxsVxqkZp_Q6DscWKohtAwXEU_Pb10PXT1AtX3kubsLUfnxvDLo3mm7cCPZe-BqHftoovK-4faXcKC8PTyz33qNLe5gPi_JcRWG3IjR7HSHuXw_pCeeJsnHb9uOe0O0VheXS1CH9cq_DeVml-TD_A7ALNtk;\nsplittiers=0;\nlootboxes=scav_only;\nffa_wreckage=0;\nfactionlimiter=0;\nanimationcleanup=0;\nmultiplier_weaponrange=1;\nmultiplier_maxvelocity=1;\nraptor_queentimemult=1;\ntax_resource_sharing_amount=0;\ntweakunits9=;\nruins_density=normal;\nassistdronesenabled=disabled;\ntweakdefs7=;\nmap_waterlevel=0;\nscav_difficulty=normal;\nunit_restrictions_notech3=0;\ncomrespawn=evocom;\nunit_restrictions_notech2=0;\ndummyboolfeelfreetotouch=0;\ndisable_unit_sharing=0;\nmultiplier_shieldpower=1;\ntweakdefs5=;\ncommanderbuildersenabled=disabled;\ntweakdefs=;\nunit_restrictions_noconverters=0;\nemprework=0;\npushresistant=0;\nraptor_graceperiodmult=1;\nevocomlevelcap=10;\nevocomlevelupmethod=dynamic;\nmap_lavatidemode=lavastartlow;\ntweakdefs9=;\ntemp_enable_territorial_domination=0;\ntweakunits4=;\nmultiplier_buildpower=1;\nunit_restrictions_nodefence=0;\nteamcolors_icon_dev_mode=disabled;\nscav_scavstart=initialbox;\nassistdronesbuildpowermultiplier=1;\nruins=scav_only;\nruins_only_t1=0;\nshieldsrework=0;\nproposed_unit_reworks=0;\nmap_lavalowlevel=0;\nmap_lavahighlevel=0;\nmultiplier_resourceincome=1;\nscavunitsforplayers=0;\nevocomlevelupmultiplier=1;\ntweakdefs8=;\nmap_tidal=unchanged;\nunit_restrictions_nolrpc=0;\nevocomxpmultiplier=1;\nunit_restrictions_noextractors=0;\nmultiplier_turnrate=1;\ntweakdefs1=;\nmap_lavalowdwell=300;\nnorushtimer=0;\nraptor_spawntimemult=1;\nskyshift=0;\ntweakunits2=;\ntweakunits8=;\nlootboxes_density=normal;\nmultiplier_energyconversion=1;\nallowuserwidgets=1;\nshareddynamicalliancevictory=0;\ntweakunits5=;\nevocom=0;\nunit_restrictions_notacnukes=0;\nexperimentallegionfaction=0;\nexperimentalshields=unchanged;\nstartenergystorage=1000;\nraptor_queen_count=1;\nunit_restrictions_nofusion=0;\nstartmetalstorage=1000;\nscav_boss_count=1;\nmap_atmosphere=1;\nlategame_rebalance=0;\nmap_lavatiderhythm=default;\nmultiplier_metalextraction=1;\ntweakunits6=;\nmultiplier_losrange=1;\ntweakdefs4=;\nscav_endless=0;\ndisable_fogofwar=0;\ntweakunits1=;\nunit_restrictions_noantinuke=0;\nranked_game=1;\nunit_restrictions_notech15=0;\nfixedallies=1;\ncoop=0;\nterritorial_domination_config=default;\ndynamiccheats=1;\nscav_bosstimemult=1;\ncritters=1;\ntweakunits7=;\ncommanderbuildersrange=1000;\ndefaultdecals=1;\nmultiplier_weapondamage=1;\nreleasecandidates=0;\nmultiplier_radarrange=1;\nmap_waterislava=0;\ncommanderbuildersbuildpower=400;\ndisable_assist_ally_construction=0;\nraptor_difficulty=normal;\nunit_market=0;\nraptor_endless=0;\ntweakdefs6=;\nteamcolors_anonymous_mode=disabled;\nai_incomemultiplier=1;\ndeathmode=com;\nair_rework=0;\n}\n[team4]\n{\nallyteam=0;\nteamleader=4;\nrgbcolor=0.38824 0.83922 0.63922;\nside=Armada;\nhandicap=0;\n}\n[player14]\n{\nteam=14;\ncountrycode=DE;\naccountid=315054;\nname=Wittmann;\nrank=3;\nskill=[13.54];\nspectator=0;\nskilluncertainty=3.98;\n}\n[team8]\n{\nallyteam=1;\nteamleader=8;\nrgbcolor=0.68627 0.27059 0.18039;\nside=Armada;\nhandicap=0;\n}\n[player4]\n{\nteam=4;\ncountrycode=AU;\naccountid=356043;\nname=Brotato69;\nrank=4;\nskill=[14.39];\nspectator=0;\nskilluncertainty=3.42;\n}\n[player7]\n{\nteam=7;\ncountrycode=SE;\naccountid=427052;\nname=GoGorilla;\nrank=2;\nskill=[6.16];\nspectator=0;\nskilluncertainty=5;\n}\n[restrict]\n{\n}\n[player1]\n{\nteam=1;\ncountrycode=AU;\naccountid=390075;\nname=spanky23;\nrank=1;\nskill=[21.78];\nspectator=0;\nskilluncertainty=7.84;\n}\n[mapoptions]\n{\ndry=0;\n}\n[player9]\n{\nteam=9;\ncountrycode=AU;\naccountid=63982;\nname=CanIhavesomeshoes;\nrank=4;\nskill=[22.42];\nspectator=0;\nskilluncertainty=4.24;\n}\n[team15]\n{\nallyteam=1;\nteamleader=15;\nrgbcolor=0.56471 0.70196 0.34118;\nside=Armada;\nhandicap=0;\n}\n[team0]\n{\nallyteam=0;\nteamleader=0;\nrgbcolor=0.18824 0.83922 0.59608;\nside=Cortex;\nhandicap=0;\n}\n[team3]\n{\nallyteam=0;\nteamleader=3;\nrgbcolor=0.90196 0.27451 0.92157;\nside=Armada;\nhandicap=0;\n}\n[player2]\n{\nteam=2;\ncountrycode=AU;\naccountid=90793;\nname=Dawn005;\nrank=5;\nskill=[19.11];\nspectator=0;\nskilluncertainty=2.98;\n}\n[team5]\n{\nallyteam=0;\nteamleader=5;\nrgbcolor=0.92549 0.68235 0.46275;\nside=Armada;\nhandicap=0;\n}\n[team10]\n{\nallyteam=1;\nteamleader=10;\nrgbcolor=0.70196 0.17255 0.58039;\nside=Cortex;\nhandicap=0;\n}\n[player15]\n{\nteam=15;\ncountrycode=US;\naccountid=404701;\nname=Nixha;\nrank=2;\nskill=[3.06];\nspectator=0;\nskilluncertainty=6.99;\n}\n[player12]\n{\nteam=12;\ncountrycode=AU;\naccountid=405087;\nname=Eggnstein;\nrank=2;\nskill=[16.57];\nspectator=0;\nskilluncertainty=5.25;\n}\n[team11]\n{\nallyteam=1;\nteamleader=11;\nrgbcolor=0.90588 0.59608 0.29804;\nside=Cortex;\nhandicap=0;\n}\n[player13]\n{\nteam=13;\ncountrycode=DE;\naccountid=383408;\nname=SethAlamut;\nrank=2;\nskill=[13.86];\nspectator=0;\nskilluncertainty=5.21;\n}\n[allyteam1]\n{\nstartrectleft=0;\nstartrectright=0.4;\nstartrectbottom=1;\nnumallies=0;\nstartrecttop=0.6;\n}\n[hostoptions]\n{\nclanmode=tag(5):pref(5);\nautobalance=advanced;\ncolorsensitivity=-1;\nnbplayerbyid=1;\nrankmode=account;\nminplayers=1;\nbotsrank=3;\nextrabox=0;\nforcestarted=0;\nmaxspecs=;\nautostop=gameOver;\nnospecdraw=0;\nautoaddbotnb=0;\nspringservertype=dedicated;\nautostart=off;\nspeedcontrol=2;\nautofixcolors=off;\nautospecextraplayers=1;\nskillmode=rank;\nminteamsize=1;\nautoblockcolors=0;\nteamsize=8;\nidsharemode=off;\nautoblockbalance=1;\nnbteams=2;\nspadsversion=0.13.43;\nnospecchat=0;\nbalancemode=clan:skill;\n}\n[player11]\n{\nteam=11;\ncountrycode=GB;\naccountid=382001;\nname=scoobydoob;\nrank=2;\nskill=[17.82];\nspectator=0;\nskilluncertainty=4.21;\n}\n[player3]\n{\nteam=3;\ncountrycode=SG;\naccountid=363234;\nname=AzurePure;\nrank=3;\nskill=[16.73];\nspectator=0;\nskilluncertainty=3.58;\n}\n[team2]\n{\nallyteam=0;\nteamleader=2;\nrgbcolor=0.47059 0.45490 0.17647;\nside=Armada;\nhandicap=0;\n}\n[allyteam0]\n{\nstartrectleft=0.6;\nstartrectright=1;\nstartrectbottom=0.4;\nnumallies=0;\nstartrecttop=0;\n}\n[team12]\n{\nallyteam=1;\nteamleader=12;\nrgbcolor=0.80392 0.60392 0.58824;\nside=Armada;\nhandicap=0;\n}\n[team6]\n{\nallyteam=0;\nteamleader=6;\nrgbcolor=0.65490 0.41176 0.65882;\nside=Armada;\nhandicap=0;\n}\n[team9]\n{\nallyteam=1;\nteamleader=9;\nrgbcolor=0.20784 0.05098 0.02353;\nside=Cortex;\nhandicap=0;\n}\n[player0]\n{\nteam=0;\ncountrycode=AU;\naccountid=358687;\nname=Feathers;\nrank=3;\nskill=[22.92];\nspectator=0;\nskilluncertainty=3.4;\n}\n[player5]\n{\nteam=5;\ncountrycode=DE;\naccountid=145817;\nname=[OWL]leobase;\nrank=4;\nskill=[12.96];\nspectator=0;\nskilluncertainty=4.04;\n}\n[team14]\n{\nallyteam=1;\nteamleader=14;\nrgbcolor=0.42353 0.82745 0.20784;\nside=Cortex;\nhandicap=0;\n}\n[team7]\n{\nallyteam=0;\nteamleader=7;\nrgbcolor=0.22745 0.19216 0.27451;\nside=Armada;\nhandicap=0;\n}\n[team1]\n{\nallyteam=0;\nteamleader=1;\nrgbcolor=0.08627 0.54902 0.84706;\nside=Armada;\nhandicap=0;\n}\nishost=1;\nhostip=;\nnumallyteams=2;\nserver_match_id=6503429;\nnumteams=16;\nstartpostype=2;\ngametype=Beyond All Reason test-28438-3f3eceb;\nhosttype=SPADS;\nmapname=Supreme Isthmus v2.1;\nautohostport=54206;\nnumrestrictions=0;\nautohostname=Host[US4][006];\nautohostrank=0;\nautohostaccountid=235166;\nnumplayers=16;\nautohostcountrycode=US;\nhostport=53206;\n}\n" +} \ No newline at end of file diff --git a/test/__snapshots__/2025-10-01_00-00-22-859_Supreme Isthmus v2_2025.04.08.headers.json b/test/__snapshots__/2025-10-01_00-00-22-859_Supreme Isthmus v2_2025.04.08.headers.json new file mode 100644 index 0000000..f881bc1 --- /dev/null +++ b/test/__snapshots__/2025-10-01_00-00-22-859_Supreme Isthmus v2_2025.04.08.headers.json @@ -0,0 +1,767 @@ +{ + "info": { + "meta": { + "gameId": "166fdc68dbe75b0037ef61854610b339", + "engine": "2025.04.08", + "game": "Beyond All Reason test-28600-f2bff33", + "map": "Supreme Isthmus v2.1", + "startTime": "2025-10-01T00:00:22.000Z", + "durationMs": 758000, + "fullDurationMs": 758000, + "startPosType": 2 + }, + "hostSettings": { + "ishost": "1", + "hostip": "", + "numallyteams": "2", + "server_match_id": "7131547", + "numteams": "16", + "startpostype": "2", + "gametype": "Beyond All Reason test-28600-f2bff33", + "hosttype": "SPADS", + "mapname": "Supreme Isthmus v2.1", + "autohostport": "54206", + "numrestrictions": "0", + "autohostname": "Host[EU8][006]", + "autohostrank": "0", + "autohostaccountid": "340467", + "numplayers": "40", + "autohostcountrycode": "CH", + "hostport": "53206" + }, + "gameSettings": { + "transportenemy": "notcoms", + "tweakunits3": "", + "experimentalextraunits": "0", + "map_lavahighdwell": "60", + "maxunits": "2000", + "unit_restrictions_noair": "0", + "raptor_firstwavesboost": "1", + "raptor_raptorstart": "initialbox", + "assistdronescount": "10", + "disablemapdamage": "0", + "nowasting": "default", + "scav_spawntimemult": "1", + "draft_mode": "skill", + "unit_restrictions_noendgamelrpc": "0", + "tweakunits": "", + "debugcommands": "", + "allowpausegameplay": "1", + "multiplier_energyproduction": "1", + "unit_restrictions_nonukes": "0", + "evocomleveluptime": "5", + "factory_costs": "0", + "scav_spawncountmult": "1", + "multiplier_builddistance": "1", + "tweakdefs3": "", + "assistdronesair": "1", + "startenergy": "1000", + "junorework": "0", + "techsplit": "0", + "tweakdefs2": "", + "ruins_civilian_disable": "0", + "startmetal": "1000", + "teamffa_start_boxes_shuffle": "1", + "forceallunits": "0", + "raptor_spawncountmult": "1", + "mapmetadata_startpos": "eJyNksFqhDAQht9lzkIzk4mTeO0LeOit7EFaS4WtLsalXRbfvTgxy4IL7kUk3zf5k1-vcBpiN3VDH6G6Qo3L8w8qQSzgApUQ-rmAGs0KENmVijAYVJRn0CAFRY4ToZUEKVkBWxuU2Jwj6wh765RwJhRIiRUSJS6TQE4JOWOUlJnwOoNESvIBvJW0btjoZjmf0KW9EIWV5HxyaFMFwdsF5Hh2IY0Is4bkdA4hpXgnCiQDK2ki-HRgn4FHXtONaHq41exk7dKUdp4LmNrmB6r3K5yOzaUdY92Ob7rkC4jdZxsVxqkZp_Q6DscWKohtAwXEU_Pb10PXT1AtX3kubsLUfnxvDLo3mm7cCPZe-BqHftoovK-4faXcKC8PTyz33qNLe5gPi_JcRWG3IjR7HSHuXw_pCeeJsnHb9uOe0O0VheXS1CH9cq_DeVml-TD_A7ALNtk", + "lootboxes": "scav_only", + "ffa_wreckage": "0", + "factionlimiter": "0", + "animationcleanup": "0", + "multiplier_weaponrange": "1", + "multiplier_maxvelocity": "1", + "raptor_queentimemult": "1", + "tax_resource_sharing_amount": "0", + "tweakunits9": "", + "ruins_density": "normal", + "assistdronesenabled": "disabled", + "tweakdefs7": "", + "map_waterlevel": "0", + "scav_difficulty": "normal", + "unit_restrictions_notech3": "0", + "comrespawn": "evocom", + "unit_restrictions_notech2": "0", + "dummyboolfeelfreetotouch": "0", + "disable_unit_sharing": "0", + "multiplier_shieldpower": "1", + "tweakdefs5": "", + "commanderbuildersenabled": "disabled", + "tweakdefs": "", + "unit_restrictions_noconverters": "0", + "emprework": "0", + "pushresistant": "0", + "raptor_graceperiodmult": "1", + "evocomlevelcap": "10", + "evocomlevelupmethod": "dynamic", + "map_lavatidemode": "lavastartlow", + "tweakdefs9": "", + "temp_enable_territorial_domination": "0", + "tweakunits4": "", + "multiplier_buildpower": "1", + "unit_restrictions_nodefence": "0", + "teamcolors_icon_dev_mode": "disabled", + "scav_scavstart": "initialbox", + "assistdronesbuildpowermultiplier": "1", + "ruins": "scav_only", + "ruins_only_t1": "0", + "shieldsrework": "0", + "proposed_unit_reworks": "0", + "map_lavalowlevel": "0", + "techsplit_balance": "0", + "map_lavahighlevel": "0", + "multiplier_resourceincome": "1", + "scavunitsforplayers": "0", + "evocomlevelupmultiplier": "1", + "tweakdefs8": "", + "map_tidal": "unchanged", + "unit_restrictions_nolrpc": "0", + "evocomxpmultiplier": "1", + "unit_restrictions_noextractors": "0", + "multiplier_turnrate": "1", + "tweakdefs1": "", + "map_lavalowdwell": "300", + "norushtimer": "0", + "raptor_spawntimemult": "1", + "skyshift": "0", + "tweakunits2": "", + "tweakunits8": "", + "lootboxes_density": "normal", + "multiplier_energyconversion": "1", + "allowuserwidgets": "0", + "shareddynamicalliancevictory": "0", + "tweakunits5": "", + "evocom": "0", + "unit_restrictions_notacnukes": "0", + "experimentallegionfaction": "0", + "experimentalshields": "unchanged", + "startenergystorage": "1000", + "raptor_queen_count": "1", + "unit_restrictions_nofusion": "0", + "startmetalstorage": "1000", + "scav_boss_count": "1", + "map_atmosphere": "1", + "lategame_rebalance": "0", + "map_lavatiderhythm": "default", + "multiplier_metalextraction": "1", + "tweakunits6": "", + "multiplier_losrange": "1", + "tweakdefs4": "", + "scav_endless": "0", + "disable_fogofwar": "0", + "tweakunits1": "", + "unit_restrictions_noantinuke": "0", + "ranked_game": "1", + "unit_restrictions_notech15": "0", + "fixedallies": "1", + "coop": "0", + "territorial_domination_config": "default", + "dynamiccheats": "1", + "scav_bosstimemult": "1", + "critters": "1", + "tweakunits7": "", + "commanderbuildersrange": "1000", + "defaultdecals": "1", + "multiplier_weapondamage": "1", + "releasecandidates": "0", + "multiplier_radarrange": "1", + "map_waterislava": "0", + "commanderbuildersbuildpower": "400", + "disable_assist_ally_construction": "0", + "raptor_difficulty": "normal", + "raptor_endless": "0", + "tweakdefs6": "", + "teamcolors_anonymous_mode": "disabled", + "ai_incomemultiplier": "1", + "deathmode": "com", + "air_rework": "0" + }, + "mapSettings": { + "dry": "0" + }, + "spadsSettings": { + "clanmode": "tag(5):pref(5)", + "autobalance": "advanced", + "colorsensitivity": "-1", + "nbplayerbyid": "1", + "rankmode": "account", + "minplayers": "1", + "botsrank": "3", + "extrabox": "0", + "forcestarted": "0", + "maxspecs": "", + "autostop": "gameOver", + "nospecdraw": "0", + "autoaddbotnb": "0", + "springservertype": "dedicated", + "autostart": "off", + "speedcontrol": "2", + "autofixcolors": "off", + "autospecextraplayers": "1", + "skillmode": "rank", + "minteamsize": "1", + "autoblockcolors": "0", + "teamsize": "8", + "idsharemode": "off", + "autoblockbalance": "1", + "nbteams": "2", + "spadsversion": "0.13.44", + "nospecchat": "0", + "balancemode": "clan:skill" + }, + "restrictions": {}, + "allyTeams": [ + { + "allyTeamId": 1, + "startBox": { + "bottom": 1, + "left": 0, + "top": 0.6, + "right": 0.4 + }, + "playerCount": 8 + }, + { + "allyTeamId": 0, + "startBox": { + "bottom": 0.4, + "left": 0.6, + "top": 0, + "right": 1 + }, + "playerCount": 8 + } + ], + "players": [ + { + "playerId": 8, + "userId": 126426, + "name": "Immort", + "countryCode": "RU", + "rank": 5, + "skillUncertainty": 2.61, + "skill": "[53.59]", + "teamId": 8, + "rgbColor": { + "r": 176.001, + "g": 235.00035, + "b": 250.99905 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 14, + "userId": 212587, + "name": "Potato37", + "countryCode": "GB", + "rank": 5, + "skillUncertainty": 2.65, + "skill": "[34.86]", + "teamId": 14, + "rgbColor": { + "r": 215.0007, + "g": 224.99925, + "b": 21.99885 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Cortex" + }, + { + "playerId": 4, + "userId": 124452, + "name": "SentientWaffle", + "countryCode": "US", + "rank": 5, + "skillUncertainty": 2.55, + "skill": "[37.85]", + "teamId": 4, + "rgbColor": { + "r": 80.00115, + "g": 179.99939999999998, + "b": 61.001099999999994 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 2, + "userId": 345841, + "name": "mazuki", + "countryCode": "FR", + "rank": 5, + "skillUncertainty": 2.57, + "skill": "[42.65]", + "teamId": 2, + "rgbColor": { + "r": 108.99975, + "g": 36.0009, + "b": 157.00095 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 15, + "userId": 256817, + "name": "CLANKER", + "countryCode": "US", + "rank": 4, + "skillUncertainty": 2.94, + "skill": "[27.21]", + "teamId": 15, + "rgbColor": { + "r": 164.00070000000002, + "g": 166.9995, + "b": 38.0001 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 12, + "userId": 190816, + "name": "Naigel", + "countryCode": "CH", + "rank": 3, + "skillUncertainty": 2.98, + "skill": "[38.97]", + "teamId": 12, + "rgbColor": { + "r": 196.00065, + "g": 250.99905, + "b": 133.00035 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 13, + "userId": 360669, + "name": "TheMicroManager", + "countryCode": "US", + "rank": 4, + "skillUncertainty": 2.87, + "skill": "[35.38]", + "teamId": 13, + "rgbColor": { + "r": 63.0003, + "g": 36.0009, + "b": 39.9993 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 3, + "userId": 110751, + "name": "Shieo", + "countryCode": "VN", + "rank": 4, + "skillUncertainty": 2.69, + "skill": "[39.64]", + "teamId": 3, + "rgbColor": { + "r": 0.9995999999999999, + "g": 254.00039999999998, + "b": 240.0009 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 10, + "userId": 17199, + "name": "ibeSleepy", + "countryCode": "DE", + "rank": 3, + "skillUncertainty": 3.01, + "skill": "[41.35]", + "teamId": 10, + "rgbColor": { + "r": 114.00030000000001, + "g": 231.99900000000002, + "b": 63.0003 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Cortex" + }, + { + "playerId": 6, + "userId": 13733, + "name": "AnyGothBaddiesInHere", + "countryCode": "US", + "rank": 4, + "skillUncertainty": 3.08, + "skill": "[28.75]", + "teamId": 6, + "rgbColor": { + "r": 38.0001, + "g": 152.0004, + "b": 58.99935 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 7, + "userId": 422826, + "name": "FacelessDude", + "countryCode": "DE", + "rank": 4, + "skillUncertainty": 3.13, + "skill": "[23.57]", + "teamId": 7, + "rgbColor": { + "r": 78.99900000000001, + "g": 235.00035, + "b": 204.9996 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Cortex" + }, + { + "playerId": 1, + "userId": 71485, + "name": "UsurpeR", + "countryCode": "NL", + "rank": 5, + "skillUncertainty": 2.59, + "skill": "[44.18]", + "teamId": 1, + "rgbColor": { + "r": 93.00104999999999, + "g": 123.99884999999999, + "b": 77.9994 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Cortex" + }, + { + "playerId": 9, + "userId": 318933, + "name": "[Cookie]Baby_Evis", + "countryCode": "FR", + "rank": 5, + "skillUncertainty": 2.59, + "skill": "[43.02]", + "teamId": 9, + "rgbColor": { + "r": 223.99965, + "g": 147.99945, + "b": 158.00055 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Random" + }, + { + "playerId": 11, + "userId": 76593, + "name": "Xeaner", + "countryCode": "GB", + "rank": 5, + "skillUncertainty": 2.58, + "skill": "[39.15]", + "teamId": 11, + "rgbColor": { + "r": 69.00045, + "g": 179.99939999999998, + "b": 83.99955 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 0, + "userId": 51, + "name": "Malady", + "countryCode": "??", + "rank": 7, + "skillUncertainty": 2.86, + "skill": "[60.22]", + "teamId": 0, + "rgbColor": { + "r": 254.00039999999998, + "g": 206.99880000000002, + "b": 129.999 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 5, + "userId": 335689, + "name": "Duke_of_Stars", + "countryCode": "AU", + "rank": 4, + "skillUncertainty": 2.63, + "skill": "[32.94]", + "teamId": 5, + "rgbColor": { + "r": 221.00085, + "g": 93.00104999999999, + "b": 10.0011 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Cortex" + } + ], + "ais": [], + "spectators": [ + { + "playerId": 32, + "userId": 410064, + "name": "SillyGoops", + "countryCode": "US", + "rank": 2, + "skillUncertainty": 5.79, + "skill": "[17.24]" + }, + { + "playerId": 21, + "userId": 69237, + "name": "Gav", + "countryCode": "US", + "rank": 5, + "skillUncertainty": 3.04, + "skill": "[35.02]" + }, + { + "playerId": 35, + "userId": 146561, + "name": "Tetrarch", + "countryCode": "DK", + "rank": 4, + "skillUncertainty": 4.89, + "skill": "[16.32]" + }, + { + "playerId": 29, + "userId": 79214, + "name": "Leemon", + "countryCode": "CA", + "rank": 3, + "skillUncertainty": 2.94, + "skill": "[27.7]" + }, + { + "playerId": 22, + "userId": 22418, + "name": "TOWNS", + "countryCode": "US", + "rank": 5, + "skillUncertainty": 2.9, + "skill": "[34.17]" + }, + { + "playerId": 30, + "userId": 85070, + "name": "beardedcoder", + "countryCode": "US", + "rank": 5, + "skillUncertainty": 3.19, + "skill": "[26.43]" + }, + { + "playerId": 25, + "userId": 397477, + "name": "[55]prawnography", + "countryCode": "DZ", + "rank": 4, + "skillUncertainty": 3.58, + "skill": "[30.54]" + }, + { + "playerId": 31, + "userId": 441421, + "name": "Solarpotato", + "countryCode": "GB", + "rank": 3, + "skillUncertainty": 4.75, + "skill": "[25.9]" + }, + { + "playerId": 39, + "userId": 469385, + "name": "Hadigel", + "countryCode": "TR", + "rank": 2, + "skillUncertainty": 5.22, + "skill": "[6.14]" + }, + { + "playerId": 24, + "userId": 62198, + "name": "Tink3r", + "countryCode": "US", + "rank": 5, + "skillUncertainty": 2.63, + "skill": "[30.65]" + }, + { + "playerId": 37, + "userId": 415104, + "name": "XenoTheSlayer", + "countryCode": "US", + "rank": 2, + "skillUncertainty": 7.63, + "skill": "[14.03]" + }, + { + "playerId": 34, + "userId": 474081, + "name": "JoeJo", + "countryCode": "DE", + "rank": 2, + "skillUncertainty": 8.33, + "skill": "[16.67]" + }, + { + "playerId": 28, + "userId": 68558, + "name": "[TOPGUN]Commander", + "countryCode": "GB", + "rank": 4, + "skillUncertainty": 2.67, + "skill": "[28.19]" + }, + { + "playerId": 16, + "userId": 38787, + "name": "Baby_N2G", + "countryCode": "FR", + "rank": 5, + "skillUncertainty": 2.62, + "skill": "[48.05]" + }, + { + "playerId": 23, + "userId": 1813, + "name": "resopmok", + "countryCode": "US", + "rank": 6, + "skillUncertainty": 3.52, + "skill": "[32.42]" + }, + { + "playerId": 18, + "userId": 189393, + "name": "[Grump]Glorp_TTV", + "countryCode": "GY", + "rank": 5, + "skillUncertainty": 2.77, + "skill": "[38.54]" + }, + { + "playerId": 19, + "userId": 318106, + "name": "Smoked2Much", + "countryCode": "DE", + "rank": 4, + "skillUncertainty": 2.69, + "skill": "[36.83]", + "clanId": "1" + }, + { + "playerId": 26, + "userId": 235238, + "name": "LasagnaMan", + "countryCode": "PT", + "rank": 3, + "skillUncertainty": 4.12, + "skill": "[30.51]" + }, + { + "playerId": 33, + "userId": 452073, + "name": "rt100", + "countryCode": "US", + "rank": 1, + "skillUncertainty": 8.11, + "skill": "[16.76]" + }, + { + "playerId": 20, + "userId": 164394, + "name": "[Grump]Grumpiness", + "countryCode": "GB", + "rank": 5, + "skillUncertainty": 2.59, + "skill": "[36.5]" + }, + { + "playerId": 36, + "userId": 53359, + "name": "biologix", + "countryCode": "US", + "rank": 2, + "skillUncertainty": 8.33, + "skill": "[15.12]" + }, + { + "playerId": 27, + "userId": 425545, + "name": "Royden", + "countryCode": "CA", + "rank": 4, + "skillUncertainty": 5.52, + "skill": "[29.43]" + }, + { + "playerId": 38, + "userId": 464819, + "name": "ADNAN", + "countryCode": "PK", + "rank": 2, + "skillUncertainty": 4.64, + "skill": "[11.82]" + }, + { + "playerId": 17, + "userId": 211892, + "name": "Sunshines", + "countryCode": "US", + "rank": 5, + "skillUncertainty": 2.58, + "skill": "[40.55]" + } + ] + }, + "header": { + "magic": "spring demofile", + "version": 5, + "headerSize": 352, + "versionString": "2025.04.08", + "gameId": "166fdc68dbe75b0037ef61854610b339", + "startTime": "2025-10-01T00:00:22.000Z", + "scriptSize": 11457, + "demoStreamSize": 4376985, + "gameTime": 616, + "wallclockTime": 758, + "numPlayers": 42, + "playerStatSize": 840, + "playerStatElemSize": 20, + "numTeams": 15, + "teamStatSize": 60, + "teamStatElemSize": 80, + "teamStatPeriod": 15, + "winningAllyTeamsSize": 1 + }, + "script": "[game]\n{\n[player32]\n{\ncountrycode=US;\naccountid=410064;\nname=SillyGoops;\nrank=2;\nskill=[17.24];\nspectator=1;\nskilluncertainty=5.79;\n}\n[player21]\n{\ncountrycode=US;\naccountid=69237;\nname=Gav;\nrank=5;\nskill=[35.02];\nspectator=1;\nskilluncertainty=3.04;\n}\n[player35]\n{\ncountrycode=DK;\naccountid=146561;\nname=Tetrarch;\nrank=4;\nskill=[16.32];\nspectator=1;\nskilluncertainty=4.89;\n}\n[player8]\n{\nteam=8;\ncountrycode=RU;\naccountid=126426;\nname=Immort;\nrank=5;\nskill=[53.59];\nspectator=0;\nskilluncertainty=2.61;\n}\n[modoptions]\n{\ntransportenemy=notcoms;\ntweakunits3=;\nexperimentalextraunits=0;\nmap_lavahighdwell=60;\nmaxunits=2000;\nunit_restrictions_noair=0;\nraptor_firstwavesboost=1;\nraptor_raptorstart=initialbox;\nassistdronescount=10;\ndisablemapdamage=0;\nnowasting=default;\nscav_spawntimemult=1;\ndraft_mode=skill;\nunit_restrictions_noendgamelrpc=0;\ntweakunits=;\ndebugcommands=;\nallowpausegameplay=1;\nmultiplier_energyproduction=1;\nunit_restrictions_nonukes=0;\nevocomleveluptime=5;\nfactory_costs=0;\nscav_spawncountmult=1;\nmultiplier_builddistance=1;\ntweakdefs3=;\nassistdronesair=1;\nstartenergy=1000;\njunorework=0;\ntechsplit=0;\ntweakdefs2=;\nruins_civilian_disable=0;\nstartmetal=1000;\nteamffa_start_boxes_shuffle=1;\nforceallunits=0;\nraptor_spawncountmult=1;\nmapmetadata_startpos=eJyNksFqhDAQht9lzkIzk4mTeO0LeOit7EFaS4WtLsalXRbfvTgxy4IL7kUk3zf5k1-vcBpiN3VDH6G6Qo3L8w8qQSzgApUQ-rmAGs0KENmVijAYVJRn0CAFRY4ToZUEKVkBWxuU2Jwj6wh765RwJhRIiRUSJS6TQE4JOWOUlJnwOoNESvIBvJW0btjoZjmf0KW9EIWV5HxyaFMFwdsF5Hh2IY0Is4bkdA4hpXgnCiQDK2ki-HRgn4FHXtONaHq41exk7dKUdp4LmNrmB6r3K5yOzaUdY92Ob7rkC4jdZxsVxqkZp_Q6DscWKohtAwXEU_Pb10PXT1AtX3kubsLUfnxvDLo3mm7cCPZe-BqHftoovK-4faXcKC8PTyz33qNLe5gPi_JcRWG3IjR7HSHuXw_pCeeJsnHb9uOe0O0VheXS1CH9cq_DeVml-TD_A7ALNtk;\nlootboxes=scav_only;\nffa_wreckage=0;\nfactionlimiter=0;\nanimationcleanup=0;\nmultiplier_weaponrange=1;\nmultiplier_maxvelocity=1;\nraptor_queentimemult=1;\ntax_resource_sharing_amount=0;\ntweakunits9=;\nruins_density=normal;\nassistdronesenabled=disabled;\ntweakdefs7=;\nmap_waterlevel=0;\nscav_difficulty=normal;\nunit_restrictions_notech3=0;\ncomrespawn=evocom;\nunit_restrictions_notech2=0;\ndummyboolfeelfreetotouch=0;\ndisable_unit_sharing=0;\nmultiplier_shieldpower=1;\ntweakdefs5=;\ncommanderbuildersenabled=disabled;\ntweakdefs=;\nunit_restrictions_noconverters=0;\nemprework=0;\npushresistant=0;\nraptor_graceperiodmult=1;\nevocomlevelcap=10;\nevocomlevelupmethod=dynamic;\nmap_lavatidemode=lavastartlow;\ntweakdefs9=;\ntemp_enable_territorial_domination=0;\ntweakunits4=;\nmultiplier_buildpower=1;\nunit_restrictions_nodefence=0;\nteamcolors_icon_dev_mode=disabled;\nscav_scavstart=initialbox;\nassistdronesbuildpowermultiplier=1;\nruins=scav_only;\nruins_only_t1=0;\nshieldsrework=0;\nproposed_unit_reworks=0;\nmap_lavalowlevel=0;\ntechsplit_balance=0;\nmap_lavahighlevel=0;\nmultiplier_resourceincome=1;\nscavunitsforplayers=0;\nevocomlevelupmultiplier=1;\ntweakdefs8=;\nmap_tidal=unchanged;\nunit_restrictions_nolrpc=0;\nevocomxpmultiplier=1;\nunit_restrictions_noextractors=0;\nmultiplier_turnrate=1;\ntweakdefs1=;\nmap_lavalowdwell=300;\nnorushtimer=0;\nraptor_spawntimemult=1;\nskyshift=0;\ntweakunits2=;\ntweakunits8=;\nlootboxes_density=normal;\nmultiplier_energyconversion=1;\nallowuserwidgets=0;\nshareddynamicalliancevictory=0;\ntweakunits5=;\nevocom=0;\nunit_restrictions_notacnukes=0;\nexperimentallegionfaction=0;\nexperimentalshields=unchanged;\nstartenergystorage=1000;\nraptor_queen_count=1;\nunit_restrictions_nofusion=0;\nstartmetalstorage=1000;\nscav_boss_count=1;\nmap_atmosphere=1;\nlategame_rebalance=0;\nmap_lavatiderhythm=default;\nmultiplier_metalextraction=1;\ntweakunits6=;\nmultiplier_losrange=1;\ntweakdefs4=;\nscav_endless=0;\ndisable_fogofwar=0;\ntweakunits1=;\nunit_restrictions_noantinuke=0;\nranked_game=1;\nunit_restrictions_notech15=0;\nfixedallies=1;\ncoop=0;\nterritorial_domination_config=default;\ndynamiccheats=1;\nscav_bosstimemult=1;\ncritters=1;\ntweakunits7=;\ncommanderbuildersrange=1000;\ndefaultdecals=1;\nmultiplier_weapondamage=1;\nreleasecandidates=0;\nmultiplier_radarrange=1;\nmap_waterislava=0;\ncommanderbuildersbuildpower=400;\ndisable_assist_ally_construction=0;\nraptor_difficulty=normal;\nraptor_endless=0;\ntweakdefs6=;\nteamcolors_anonymous_mode=disabled;\nai_incomemultiplier=1;\ndeathmode=com;\nair_rework=0;\n}\n[player14]\n{\nteam=14;\ncountrycode=GB;\naccountid=212587;\nname=Potato37;\nrank=5;\nskill=[34.86];\nspectator=0;\nskilluncertainty=2.65;\n}\n[team8]\n{\nallyteam=1;\nteamleader=8;\nrgbcolor=0.69020 0.92157 0.98431;\nside=Armada;\nhandicap=0;\n}\n[player29]\n{\ncountrycode=CA;\naccountid=79214;\nname=Leemon;\nrank=3;\nskill=[27.7];\nspectator=1;\nskilluncertainty=2.94;\n}\n[player4]\n{\nteam=4;\ncountrycode=US;\naccountid=124452;\nname=SentientWaffle;\nrank=5;\nskill=[37.85];\nspectator=0;\nskilluncertainty=2.55;\n}\n[restrict]\n{\n}\n[player22]\n{\ncountrycode=US;\naccountid=22418;\nname=TOWNS;\nrank=5;\nskill=[34.17];\nspectator=1;\nskilluncertainty=2.9;\n}\n[player30]\n{\ncountrycode=US;\naccountid=85070;\nname=beardedcoder;\nrank=5;\nskill=[26.43];\nspectator=1;\nskilluncertainty=3.19;\n}\n[mapoptions]\n{\ndry=0;\n}\n[player25]\n{\ncountrycode=DZ;\naccountid=397477;\nname=[55]prawnography;\nrank=4;\nskill=[30.54];\nspectator=1;\nskilluncertainty=3.58;\n}\n[player31]\n{\ncountrycode=GB;\naccountid=441421;\nname=Solarpotato;\nrank=3;\nskill=[25.9];\nspectator=1;\nskilluncertainty=4.75;\n}\n[team15]\n{\nallyteam=1;\nteamleader=15;\nrgbcolor=0.64314 0.65490 0.14902;\nside=Armada;\nhandicap=0;\n}\n[player39]\n{\ncountrycode=TR;\naccountid=469385;\nname=Hadigel;\nrank=2;\nskill=[6.14];\nspectator=1;\nskilluncertainty=5.22;\n}\n[team0]\n{\nallyteam=0;\nteamleader=0;\nrgbcolor=0.99608 0.81176 0.50980;\nside=Armada;\nhandicap=0;\n}\n[team5]\n{\nallyteam=0;\nteamleader=5;\nrgbcolor=0.86667 0.36471 0.03922;\nside=Cortex;\nhandicap=0;\n}\n[player2]\n{\nteam=2;\ncountrycode=FR;\naccountid=345841;\nname=mazuki;\nrank=5;\nskill=[42.65];\nspectator=0;\nskilluncertainty=2.57;\n}\n[player24]\n{\ncountrycode=US;\naccountid=62198;\nname=Tink3r;\nrank=5;\nskill=[30.65];\nspectator=1;\nskilluncertainty=2.63;\n}\n[player37]\n{\ncountrycode=US;\naccountid=415104;\nname=XenoTheSlayer;\nrank=2;\nskill=[14.03];\nspectator=1;\nskilluncertainty=7.63;\n}\n[player15]\n{\nteam=15;\ncountrycode=US;\naccountid=256817;\nname=CLANKER;\nrank=4;\nskill=[27.21];\nspectator=0;\nskilluncertainty=2.94;\n}\n[player12]\n{\nteam=12;\ncountrycode=CH;\naccountid=190816;\nname=Naigel;\nrank=3;\nskill=[38.97];\nspectator=0;\nskilluncertainty=2.98;\n}\n[team11]\n{\nallyteam=1;\nteamleader=11;\nrgbcolor=0.27059 0.70588 0.32941;\nside=Armada;\nhandicap=0;\n}\n[player34]\n{\ncountrycode=DE;\naccountid=474081;\nname=JoeJo;\nrank=2;\nskill=[16.67];\nspectator=1;\nskilluncertainty=8.33;\n}\n[player13]\n{\nteam=13;\ncountrycode=US;\naccountid=360669;\nname=TheMicroManager;\nrank=4;\nskill=[35.38];\nspectator=0;\nskilluncertainty=2.87;\n}\n[allyteam1]\n{\nstartrectleft=0;\nstartrectright=0.4;\nstartrectbottom=1;\nnumallies=0;\nstartrecttop=0.6;\n}\n[hostoptions]\n{\nclanmode=tag(5):pref(5);\nautobalance=advanced;\ncolorsensitivity=-1;\nnbplayerbyid=1;\nrankmode=account;\nminplayers=1;\nbotsrank=3;\nextrabox=0;\nforcestarted=0;\nmaxspecs=;\nautostop=gameOver;\nnospecdraw=0;\nautoaddbotnb=0;\nspringservertype=dedicated;\nautostart=off;\nspeedcontrol=2;\nautofixcolors=off;\nautospecextraplayers=1;\nskillmode=rank;\nminteamsize=1;\nautoblockcolors=0;\nteamsize=8;\nidsharemode=off;\nautoblockbalance=1;\nnbteams=2;\nspadsversion=0.13.44;\nnospecchat=0;\nbalancemode=clan:skill;\n}\n[player3]\n{\nteam=3;\ncountrycode=VN;\naccountid=110751;\nname=Shieo;\nrank=4;\nskill=[39.64];\nspectator=0;\nskilluncertainty=2.69;\n}\n[team2]\n{\nallyteam=0;\nteamleader=2;\nrgbcolor=0.42745 0.14118 0.61569;\nside=Armada;\nhandicap=0;\n}\n[allyteam0]\n{\nstartrectleft=0.6;\nstartrectright=1;\nstartrectbottom=0.4;\nnumallies=0;\nstartrecttop=0;\n}\n[team6]\n{\nallyteam=0;\nteamleader=6;\nrgbcolor=0.14902 0.59608 0.23137;\nside=Armada;\nhandicap=0;\n}\n[team14]\n{\nallyteam=1;\nteamleader=14;\nrgbcolor=0.84314 0.88235 0.08627;\nside=Cortex;\nhandicap=0;\n}\n[team1]\n{\nallyteam=0;\nteamleader=1;\nrgbcolor=0.36471 0.48627 0.30588;\nside=Cortex;\nhandicap=0;\n}\n[player10]\n{\nteam=10;\ncountrycode=DE;\naccountid=17199;\nname=ibeSleepy;\nrank=3;\nskill=[41.35];\nspectator=0;\nskilluncertainty=3.01;\n}\n[player28]\n{\ncountrycode=GB;\naccountid=68558;\nname=[TOPGUN]Commander;\nrank=4;\nskill=[28.19];\nspectator=1;\nskilluncertainty=2.67;\n}\n[player16]\n{\ncountrycode=FR;\naccountid=38787;\nname=Baby_N2G;\nrank=5;\nskill=[48.05];\nspectator=1;\nskilluncertainty=2.62;\n}\n[player23]\n{\ncountrycode=US;\naccountid=1813;\nname=resopmok;\nrank=6;\nskill=[32.42];\nspectator=1;\nskilluncertainty=3.52;\n}\n[player6]\n{\nteam=6;\ncountrycode=US;\naccountid=13733;\nname=AnyGothBaddiesInHere;\nrank=4;\nskill=[28.75];\nspectator=0;\nskilluncertainty=3.08;\n}\n[team13]\n{\nallyteam=1;\nteamleader=13;\nrgbcolor=0.24706 0.14118 0.15686;\nside=Armada;\nhandicap=0;\n}\n[player18]\n{\ncountrycode=GY;\naccountid=189393;\nname=[Grump]Glorp_TTV;\nrank=5;\nskill=[38.54];\nspectator=1;\nskilluncertainty=2.77;\n}\n[player19]\n{\ncountrycode=DE;\naccountid=318106;\nname=Smoked2Much;\nclanid=1;\nrank=4;\nskill=[36.83];\nspectator=1;\nskilluncertainty=2.69;\n}\n[player26]\n{\ncountrycode=PT;\naccountid=235238;\nname=LasagnaMan;\nrank=3;\nskill=[30.51];\nspectator=1;\nskilluncertainty=4.12;\n}\n[team4]\n{\nallyteam=0;\nteamleader=4;\nrgbcolor=0.31373 0.70588 0.23922;\nside=Armada;\nhandicap=0;\n}\n[player7]\n{\nteam=7;\ncountrycode=DE;\naccountid=422826;\nname=FacelessDude;\nrank=4;\nskill=[23.57];\nspectator=0;\nskilluncertainty=3.13;\n}\n[player1]\n{\nteam=1;\ncountrycode=NL;\naccountid=71485;\nname=UsurpeR;\nrank=5;\nskill=[44.18];\nspectator=0;\nskilluncertainty=2.59;\n}\n[player33]\n{\ncountrycode=US;\naccountid=452073;\nname=rt100;\nrank=1;\nskill=[16.76];\nspectator=1;\nskilluncertainty=8.11;\n}\n[player20]\n{\ncountrycode=GB;\naccountid=164394;\nname=[Grump]Grumpiness;\nrank=5;\nskill=[36.5];\nspectator=1;\nskilluncertainty=2.59;\n}\n[player36]\n{\ncountrycode=US;\naccountid=53359;\nname=biologix;\nrank=2;\nskill=[15.12];\nspectator=1;\nskilluncertainty=8.33;\n}\n[player27]\n{\ncountrycode=CA;\naccountid=425545;\nname=Royden;\nrank=4;\nskill=[29.43];\nspectator=1;\nskilluncertainty=5.52;\n}\n[player38]\n{\ncountrycode=PK;\naccountid=464819;\nname=ADNAN;\nrank=2;\nskill=[11.82];\nspectator=1;\nskilluncertainty=4.64;\n}\n[player17]\n{\ncountrycode=US;\naccountid=211892;\nname=Sunshines;\nrank=5;\nskill=[40.55];\nspectator=1;\nskilluncertainty=2.58;\n}\n[player9]\n{\nteam=9;\ncountrycode=FR;\naccountid=318933;\nname=[Cookie]Baby_Evis;\nrank=5;\nskill=[43.02];\nspectator=0;\nskilluncertainty=2.59;\n}\n[team3]\n{\nallyteam=0;\nteamleader=3;\nrgbcolor=0.00392 0.99608 0.94118;\nside=Armada;\nhandicap=0;\n}\n[team10]\n{\nallyteam=1;\nteamleader=10;\nrgbcolor=0.44706 0.90980 0.24706;\nside=Cortex;\nhandicap=0;\n}\n[player11]\n{\nteam=11;\ncountrycode=GB;\naccountid=76593;\nname=Xeaner;\nrank=5;\nskill=[39.15];\nspectator=0;\nskilluncertainty=2.58;\n}\n[team12]\n{\nallyteam=1;\nteamleader=12;\nrgbcolor=0.76863 0.98431 0.52157;\nside=Armada;\nhandicap=0;\n}\n[team9]\n{\nallyteam=1;\nteamleader=9;\nrgbcolor=0.87843 0.58039 0.61961;\nside=Random;\nhandicap=0;\n}\n[player0]\n{\nteam=0;\ncountrycode=??;\naccountid=51;\nname=Malady;\nrank=7;\nskill=[60.22];\nspectator=0;\nskilluncertainty=2.86;\n}\n[player5]\n{\nteam=5;\ncountrycode=AU;\naccountid=335689;\nname=Duke_of_Stars;\nrank=4;\nskill=[32.94];\nspectator=0;\nskilluncertainty=2.63;\n}\n[team7]\n{\nallyteam=0;\nteamleader=7;\nrgbcolor=0.30980 0.92157 0.80392;\nside=Cortex;\nhandicap=0;\n}\nishost=1;\nhostip=;\nnumallyteams=2;\nserver_match_id=7131547;\nnumteams=16;\nstartpostype=2;\ngametype=Beyond All Reason test-28600-f2bff33;\nhosttype=SPADS;\nmapname=Supreme Isthmus v2.1;\nautohostport=54206;\nnumrestrictions=0;\nautohostname=Host[EU8][006];\nautohostrank=0;\nautohostaccountid=340467;\nnumplayers=40;\nautohostcountrycode=CH;\nhostport=53206;\n}\n" +} \ No newline at end of file diff --git a/test/__snapshots__/2026-02-07_20-28-00-916_Comet Catcher Remake 1.8_2025.06.12.headers.json b/test/__snapshots__/2026-02-07_20-28-00-916_Comet Catcher Remake 1.8_2025.06.12.headers.json new file mode 100644 index 0000000..8da2d35 --- /dev/null +++ b/test/__snapshots__/2026-02-07_20-28-00-916_Comet Catcher Remake 1.8_2025.06.12.headers.json @@ -0,0 +1,335 @@ +{ + "info": { + "meta": { + "gameId": "50a0876977497180efafab4d5e108e25", + "engine": "2025.06.12", + "game": "Beyond All Reason test-29422-87225c3", + "map": "Comet Catcher Remake 1.8", + "startTime": "2026-02-07T20:28:00.000Z", + "durationMs": 462000, + "fullDurationMs": 462000, + "startPosType": 2 + }, + "hostSettings": { + "ishost": "1", + "hostip": "", + "numallyteams": "2", + "server_match_id": "8658436", + "numteams": "3", + "startpostype": "2", + "gametype": "Beyond All Reason test-29422-87225c3", + "hosttype": "SPADS", + "mapname": "Comet Catcher Remake 1.8", + "autohostport": "54208", + "numrestrictions": "0", + "autohostname": "Host[EU8][008]", + "autohostrank": "0", + "autohostaccountid": "340469", + "numplayers": "2", + "autohostcountrycode": "CH", + "hostport": "53208" + }, + "gameSettings": { + "zombies": "disabled", + "experimentalextraunits": "0", + "unit_restrictions_noair": "0", + "community_balance_commando": "0", + "raptor_firstwavesboost": "1", + "experimental_low_priority_pacifists": "0", + "raptor_raptorstart": "initialbox", + "assistdronescount": "10", + "disablemapdamage": "0", + "draft_mode": "random", + "community_balance_corjamt": "0", + "unit_restrictions_nonukes": "0", + "evocomleveluptime": "5", + "factory_costs": "0", + "multiplier_builddistance": "1", + "tech_blocking": "0", + "tweakdefs3": "", + "assistdronesair": "1", + "startenergy": "1000", + "allowunitcontrolwidgets": "1", + "techsplit": "0", + "startmetal": "1000", + "tweakdefs2": "", + "override_quick_start_range": "600", + "raptor_spawncountmult": "1", + "mapmetadata_startpos": "", + "allow_enemy_ai_spawn_placement": "0", + "ffa_wreckage": "0", + "raptor_queentimemult": "1", + "multiplier_weaponrange": "1", + "multiplier_maxvelocity": "1", + "tech_blocking_per_team": "1", + "assistdronesenabled": "disabled", + "tweakdefs7": "", + "unit_restrictions_notech3": "0", + "naval_balance_tweaks": "0", + "dummyboolfeelfreetotouch": "0", + "multiplier_shieldpower": "1", + "commanderbuildersenabled": "disabled", + "tweakdefs": "", + "easytax": "0", + "unit_restrictions_noconverters": "0", + "community_balance_patch": "disabled", + "emprework": "0", + "pushresistant": "0", + "raptor_graceperiodmult": "1", + "tweakdefs9": "", + "tweakunits4": "", + "teamcolors_icon_dev_mode": "disabled", + "scav_scavstart": "initialbox", + "assistdronesbuildpowermultiplier": "1", + "ruins": "scav_only", + "ruins_only_t1": "0", + "techsplit_balance": "0", + "holiday_events": "1", + "scavunitsforplayers": "0", + "multiplier_resourceincome": "1", + "evocomlevelupmultiplier": "1", + "tweakdefs8": "", + "unit_restrictions_noextractors": "0", + "map_lavalowdwell": "300", + "raptor_spawntimemult": "1", + "skyshift": "0", + "tweakunits8": "", + "multiplier_energyconversion": "1", + "allowuserwidgets": "1", + "tweakunits5": "", + "experimentalshields": "unchanged", + "raptor_queen_count": "1", + "map_tweaklava": "", + "scav_boss_count": "1", + "map_atmosphere": "1", + "multiplier_losrange": "1", + "tweakdefs4": "", + "scav_endless": "0", + "disable_fogofwar": "0", + "tweakunits1": "", + "unit_restrictions_noantinuke": "0", + "coop": "0", + "commanderbuildersrange": "1000", + "defaultdecals": "1", + "multiplier_radarrange": "1", + "disable_assist_ally_construction": "0", + "raptor_endless": "0", + "tweakdefs6": "", + "tweakunits3": "", + "air_rework": "0", + "map_lavahighdwell": "60", + "maxunits": "2000", + "community_balance_armfast": "0", + "nowasting": "default", + "scav_spawntimemult": "1", + "unit_restrictions_noendgamelrpc": "0", + "tweakunits": "", + "enable_quickstart_overrides": "0", + "quick_start": "default", + "debugcommands": "", + "allowpausegameplay": "1", + "multiplier_energyproduction": "1", + "scav_spawncountmult": "1", + "quick_start_amount": "default", + "junorework": "0", + "date_year": "2026", + "date_hour": "20", + "ruins_civilian_disable": "0", + "teamffa_start_boxes_shuffle": "1", + "forceallunits": "0", + "lootboxes": "scav_only", + "factionlimiter": "0", + "animationcleanup": "0", + "tax_resource_sharing_amount": "0", + "tweakunits9": "", + "ruins_density": "normal", + "map_waterlevel": "0", + "scav_difficulty": "normal", + "community_balance_armwar": "0", + "comrespawn": "evocom", + "unit_restrictions_notech2": "0", + "disable_unit_sharing": "0", + "community_balance_cortermite": "0", + "tweakdefs5": "", + "t2_tech_threshold": "720", + "evocomlevelcap": "10", + "evocomlevelupmethod": "dynamic", + "map_lavatidemode": "lavastartlow", + "unit_creation_reward_multiplier": "0", + "multiplier_buildpower": "1", + "unit_restrictions_nodefence": "0", + "territorial_domination_elimination_threshold_multiplier": "1.2", + "proposed_unit_reworks": "0", + "map_lavalowlevel": "0", + "t3_tech_threshold": "4920", + "map_lavahighlevel": "0", + "map_tidal": "unchanged", + "unit_restrictions_nolrpc": "0", + "evocomxpmultiplier": "1", + "multiplier_turnrate": "1", + "tweakdefs1": "", + "date_day": "7", + "norushtimer": "0", + "tweakunits2": "", + "lootboxes_density": "normal", + "shareddynamicalliancevictory": "0", + "evocom": "0", + "unit_restrictions_notacnukes": "0", + "experimentallegionfaction": "0", + "startenergystorage": "1000", + "bonusstartresourcemultiplier": "0", + "unit_restrictions_nofusion": "0", + "startmetalstorage": "1000", + "map_lavatiderhythm": "default", + "lategame_rebalance": "0", + "multiplier_metalextraction": "1", + "tweakunits6": "", + "pip": "0", + "ranked_game": "1", + "unit_restrictions_notech15": "0", + "fixedallies": "1", + "territorial_domination_config": "25_minutes", + "dynamiccheats": "1", + "scav_bosstimemult": "1", + "critters": "1", + "tweakunits7": "", + "multiplier_weapondamage": "1", + "raptor_difficulty": "normal", + "releasecandidates": "0", + "map_waterislava": "0", + "commanderbuildersbuildpower": "400", + "override_quick_start_budget": "1200", + "date_month": "2", + "teamcolors_anonymous_mode": "disabled", + "transportenemy": "notcoms", + "ai_incomemultiplier": "1", + "deathmode": "com" + }, + "mapSettings": {}, + "spadsSettings": { + "clanmode": "tag(5):pref(5)", + "autobalance": "off", + "colorsensitivity": "-1", + "nbplayerbyid": "1", + "rankmode": "account", + "minplayers": "1", + "botsrank": "3", + "extrabox": "0", + "forcestarted": "1", + "maxspecs": "", + "autostop": "gameOver", + "nospecdraw": "0", + "autoaddbotnb": "0", + "springservertype": "dedicated", + "autostart": "off", + "speedcontrol": "2", + "autofixcolors": "off", + "autospecextraplayers": "1", + "skillmode": "rank", + "minteamsize": "1", + "autoblockcolors": "0", + "teamsize": "4", + "idsharemode": "off", + "autoblockbalance": "1", + "nbteams": "2", + "spadsversion": "0.13.48", + "nospecchat": "0", + "balancemode": "clan:skill" + }, + "restrictions": {}, + "allyTeams": [ + { + "allyTeamId": 1, + "startBox": { + "bottom": 1, + "left": 0.8, + "top": 0, + "right": 1 + }, + "playerCount": 1 + }, + { + "allyTeamId": 0, + "startBox": { + "bottom": 1, + "left": 0, + "top": 0, + "right": 0.2 + }, + "playerCount": 2 + } + ], + "players": [ + { + "playerId": 1, + "userId": 543806, + "name": "Zepek_75", + "countryCode": "FR", + "rank": 0, + "skillUncertainty": 8.33, + "skill": "[16.67]", + "teamId": 1, + "rgbColor": { + "r": 110.99895000000001, + "g": 23.001, + "b": 234.00074999999998 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 0, + "userId": 426216, + "name": "pikterra", + "countryCode": "FR", + "rank": 1, + "skillUncertainty": 8.03, + "skill": "[13.08]", + "teamId": 0, + "rgbColor": { + "r": 39.9993, + "g": 191.99970000000002, + "b": 70.00004999999999 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Armada" + } + ], + "ais": [ + { + "aiId": 0, + "shortName": "SimpleAI", + "name": "SimpleAI(1)", + "host": false, + "teamId": 2, + "allyTeamId": 1, + "handicap": 0, + "faction": "Armada" + } + ], + "spectators": [] + }, + "header": { + "magic": "spring demofile", + "version": 5, + "headerSize": 352, + "versionString": "2025.06.12", + "gameId": "50a0876977497180efafab4d5e108e25", + "startTime": "2026-02-07T20:28:00.000Z", + "scriptSize": 5706, + "demoStreamSize": 264859, + "gameTime": 399, + "wallclockTime": 462, + "numPlayers": 2, + "playerStatSize": 40, + "playerStatElemSize": 20, + "numTeams": 2, + "teamStatSize": 8, + "teamStatElemSize": 80, + "teamStatPeriod": 15, + "winningAllyTeamsSize": 1 + }, + "script": "[game]\n{\n[team0]\n{\nallyteam=0;\nteamleader=0;\nrgbcolor=0.15686 0.75294 0.27451;\nside=Armada;\nhandicap=0;\n}\n[modoptions]\n{\nzombies=disabled;\nexperimentalextraunits=0;\nunit_restrictions_noair=0;\ncommunity_balance_commando=0;\nraptor_firstwavesboost=1;\nexperimental_low_priority_pacifists=0;\nraptor_raptorstart=initialbox;\nassistdronescount=10;\ndisablemapdamage=0;\ndraft_mode=random;\ncommunity_balance_corjamt=0;\nunit_restrictions_nonukes=0;\nevocomleveluptime=5;\nfactory_costs=0;\nmultiplier_builddistance=1;\ntech_blocking=0;\ntweakdefs3=;\nassistdronesair=1;\nstartenergy=1000;\nallowunitcontrolwidgets=1;\ntechsplit=0;\nstartmetal=1000;\ntweakdefs2=;\noverride_quick_start_range=600;\nraptor_spawncountmult=1;\nmapmetadata_startpos=;\nallow_enemy_ai_spawn_placement=0;\nffa_wreckage=0;\nraptor_queentimemult=1;\nmultiplier_weaponrange=1;\nmultiplier_maxvelocity=1;\ntech_blocking_per_team=1;\nassistdronesenabled=disabled;\ntweakdefs7=;\nunit_restrictions_notech3=0;\nnaval_balance_tweaks=0;\ndummyboolfeelfreetotouch=0;\nmultiplier_shieldpower=1;\ncommanderbuildersenabled=disabled;\ntweakdefs=;\neasytax=0;\nunit_restrictions_noconverters=0;\ncommunity_balance_patch=disabled;\nemprework=0;\npushresistant=0;\nraptor_graceperiodmult=1;\ntweakdefs9=;\ntweakunits4=;\nteamcolors_icon_dev_mode=disabled;\nscav_scavstart=initialbox;\nassistdronesbuildpowermultiplier=1;\nruins=scav_only;\nruins_only_t1=0;\ntechsplit_balance=0;\nholiday_events=1;\nscavunitsforplayers=0;\nmultiplier_resourceincome=1;\nevocomlevelupmultiplier=1;\ntweakdefs8=;\nunit_restrictions_noextractors=0;\nmap_lavalowdwell=300;\nraptor_spawntimemult=1;\nskyshift=0;\ntweakunits8=;\nmultiplier_energyconversion=1;\nallowuserwidgets=1;\ntweakunits5=;\nexperimentalshields=unchanged;\nraptor_queen_count=1;\nmap_tweaklava=;\nscav_boss_count=1;\nmap_atmosphere=1;\nmultiplier_losrange=1;\ntweakdefs4=;\nscav_endless=0;\ndisable_fogofwar=0;\ntweakunits1=;\nunit_restrictions_noantinuke=0;\ncoop=0;\ncommanderbuildersrange=1000;\ndefaultdecals=1;\nmultiplier_radarrange=1;\ndisable_assist_ally_construction=0;\nraptor_endless=0;\ntweakdefs6=;\ntweakunits3=;\nair_rework=0;\nmap_lavahighdwell=60;\nmaxunits=2000;\ncommunity_balance_armfast=0;\nnowasting=default;\nscav_spawntimemult=1;\nunit_restrictions_noendgamelrpc=0;\ntweakunits=;\nenable_quickstart_overrides=0;\nquick_start=default;\ndebugcommands=;\nallowpausegameplay=1;\nmultiplier_energyproduction=1;\nscav_spawncountmult=1;\nquick_start_amount=default;\njunorework=0;\ndate_year=2026;\ndate_hour=20;\nruins_civilian_disable=0;\nteamffa_start_boxes_shuffle=1;\nforceallunits=0;\nlootboxes=scav_only;\nfactionlimiter=0;\nanimationcleanup=0;\ntax_resource_sharing_amount=0;\ntweakunits9=;\nruins_density=normal;\nmap_waterlevel=0;\nscav_difficulty=normal;\ncommunity_balance_armwar=0;\ncomrespawn=evocom;\nunit_restrictions_notech2=0;\ndisable_unit_sharing=0;\ncommunity_balance_cortermite=0;\ntweakdefs5=;\nt2_tech_threshold=720;\nevocomlevelcap=10;\nevocomlevelupmethod=dynamic;\nmap_lavatidemode=lavastartlow;\nunit_creation_reward_multiplier=0;\nmultiplier_buildpower=1;\nunit_restrictions_nodefence=0;\nterritorial_domination_elimination_threshold_multiplier=1.2;\nproposed_unit_reworks=0;\nmap_lavalowlevel=0;\nt3_tech_threshold=4920;\nmap_lavahighlevel=0;\nmap_tidal=unchanged;\nunit_restrictions_nolrpc=0;\nevocomxpmultiplier=1;\nmultiplier_turnrate=1;\ntweakdefs1=;\ndate_day=7;\nnorushtimer=0;\ntweakunits2=;\nlootboxes_density=normal;\nshareddynamicalliancevictory=0;\nevocom=0;\nunit_restrictions_notacnukes=0;\nexperimentallegionfaction=0;\nstartenergystorage=1000;\nbonusstartresourcemultiplier=0;\nunit_restrictions_nofusion=0;\nstartmetalstorage=1000;\nmap_lavatiderhythm=default;\nlategame_rebalance=0;\nmultiplier_metalextraction=1;\ntweakunits6=;\npip=0;\nranked_game=1;\nunit_restrictions_notech15=0;\nfixedallies=1;\nterritorial_domination_config=25_minutes;\ndynamiccheats=1;\nscav_bosstimemult=1;\ncritters=1;\ntweakunits7=;\nmultiplier_weapondamage=1;\nraptor_difficulty=normal;\nreleasecandidates=0;\nmap_waterislava=0;\ncommanderbuildersbuildpower=400;\noverride_quick_start_budget=1200;\ndate_month=2;\nteamcolors_anonymous_mode=disabled;\ntransportenemy=notcoms;\nai_incomemultiplier=1;\ndeathmode=com;\n}\n[team2]\n{\nallyteam=1;\nteamleader=0;\nrgbcolor=0.00000 0.50980 0.00000;\nside=Armada;\nhandicap=0;\n}\n[allyteam1]\n{\nstartrectleft=0.8;\nstartrectright=1;\nstartrectbottom=1;\nnumallies=0;\nstartrecttop=0;\n}\n[hostoptions]\n{\nclanmode=tag(5):pref(5);\nautobalance=off;\ncolorsensitivity=-1;\nnbplayerbyid=1;\nrankmode=account;\nminplayers=1;\nbotsrank=3;\nextrabox=0;\nforcestarted=1;\nmaxspecs=;\nautostop=gameOver;\nnospecdraw=0;\nautoaddbotnb=0;\nspringservertype=dedicated;\nautostart=off;\nspeedcontrol=2;\nautofixcolors=off;\nautospecextraplayers=1;\nskillmode=rank;\nminteamsize=1;\nautoblockcolors=0;\nteamsize=4;\nidsharemode=off;\nautoblockbalance=1;\nnbteams=2;\nspadsversion=0.13.48;\nnospecchat=0;\nbalancemode=clan:skill;\n}\n[allyteam0]\n{\nstartrectleft=0;\nstartrectright=0.2;\nstartrectbottom=1;\nnumallies=0;\nstartrecttop=0;\n}\n[restrict]\n{\n}\n[player1]\n{\nteam=1;\ncountrycode=FR;\naccountid=543806;\nname=Zepek_75;\nrank=0;\nskill=[16.67];\nspectator=0;\nskilluncertainty=8.33;\n}\n[player0]\n{\nteam=0;\ncountrycode=FR;\naccountid=426216;\nname=pikterra;\nrank=1;\nskill=[13.08];\nboss=1;\nskilluncertainty=8.03;\nspectator=0;\n}\n[ai0]\n{\nteam=2;\nhost=0;\nname=SimpleAI(1);\nshortname=SimpleAI;\n}\n[mapoptions]\n{\n}\n[team1]\n{\nallyteam=0;\nteamleader=1;\nrgbcolor=0.43529 0.09020 0.91765;\nside=Armada;\nhandicap=0;\n}\nishost=1;\nhostip=;\nnumallyteams=2;\nserver_match_id=8658436;\nnumteams=3;\nstartpostype=2;\ngametype=Beyond All Reason test-29422-87225c3;\nhosttype=SPADS;\nmapname=Comet Catcher Remake 1.8;\nautohostport=54208;\nnumrestrictions=0;\nautohostname=Host[EU8][008];\nautohostrank=0;\nautohostaccountid=340469;\nnumplayers=2;\nautohostcountrycode=CH;\nhostport=53208;\n}\n" +} \ No newline at end of file diff --git a/test/__snapshots__/2026-02-07_21-42-11-265_Isidis crack 1.1_2025.06.12.headers.json b/test/__snapshots__/2026-02-07_21-42-11-265_Isidis crack 1.1_2025.06.12.headers.json new file mode 100644 index 0000000..74b4f31 --- /dev/null +++ b/test/__snapshots__/2026-02-07_21-42-11-265_Isidis crack 1.1_2025.06.12.headers.json @@ -0,0 +1,360 @@ +{ + "info": { + "meta": { + "gameId": "b3b18769e8fafac3f461b2ca17f80940", + "engine": "2025.06.12", + "game": "Beyond All Reason test-29422-87225c3", + "map": "Isidis crack 1.1", + "startTime": "2026-02-07T21:42:11.000Z", + "durationMs": 679000, + "fullDurationMs": 679000, + "startPosType": 2 + }, + "hostSettings": { + "ishost": "1", + "hostip": "", + "numallyteams": "2", + "server_match_id": "8659877", + "numteams": "4", + "startpostype": "2", + "gametype": "Beyond All Reason test-29422-87225c3", + "hosttype": "SPADS", + "mapname": "Isidis crack 1.1", + "autohostport": "54232", + "numrestrictions": "0", + "autohostname": "Host[US1][032]", + "autohostrank": "0", + "autohostaccountid": "242372", + "numplayers": "4", + "autohostcountrycode": "US", + "hostport": "53232" + }, + "gameSettings": { + "zombies": "disabled", + "experimentalextraunits": "0", + "unit_restrictions_noair": "0", + "community_balance_commando": "0", + "raptor_firstwavesboost": "1", + "experimental_low_priority_pacifists": "0", + "raptor_raptorstart": "initialbox", + "assistdronescount": "10", + "disablemapdamage": "0", + "draft_mode": "random", + "community_balance_corjamt": "0", + "unit_restrictions_nonukes": "0", + "evocomleveluptime": "5", + "factory_costs": "0", + "multiplier_builddistance": "1", + "tech_blocking": "0", + "tweakdefs3": "", + "assistdronesair": "1", + "startenergy": "1000", + "allowunitcontrolwidgets": "1", + "techsplit": "0", + "startmetal": "1000", + "tweakdefs2": "", + "override_quick_start_range": "600", + "raptor_spawncountmult": "1", + "mapmetadata_startpos": "", + "allow_enemy_ai_spawn_placement": "0", + "ffa_wreckage": "0", + "raptor_queentimemult": "1", + "multiplier_weaponrange": "1", + "multiplier_maxvelocity": "1", + "tech_blocking_per_team": "1", + "assistdronesenabled": "disabled", + "tweakdefs7": "", + "unit_restrictions_notech3": "0", + "naval_balance_tweaks": "0", + "dummyboolfeelfreetotouch": "0", + "multiplier_shieldpower": "1", + "commanderbuildersenabled": "disabled", + "tweakdefs": "", + "easytax": "0", + "unit_restrictions_noconverters": "0", + "community_balance_patch": "disabled", + "emprework": "0", + "pushresistant": "0", + "raptor_graceperiodmult": "1", + "tweakdefs9": "", + "tweakunits4": "", + "teamcolors_icon_dev_mode": "disabled", + "scav_scavstart": "initialbox", + "assistdronesbuildpowermultiplier": "1", + "ruins": "scav_only", + "ruins_only_t1": "0", + "techsplit_balance": "0", + "holiday_events": "1", + "scavunitsforplayers": "0", + "multiplier_resourceincome": "1", + "evocomlevelupmultiplier": "1", + "tweakdefs8": "", + "unit_restrictions_noextractors": "0", + "map_lavalowdwell": "300", + "raptor_spawntimemult": "1", + "skyshift": "0", + "tweakunits8": "", + "multiplier_energyconversion": "1", + "allowuserwidgets": "1", + "tweakunits5": "", + "experimentalshields": "unchanged", + "raptor_queen_count": "1", + "map_tweaklava": "", + "scav_boss_count": "1", + "map_atmosphere": "1", + "multiplier_losrange": "1", + "tweakdefs4": "", + "scav_endless": "0", + "disable_fogofwar": "0", + "tweakunits1": "", + "unit_restrictions_noantinuke": "0", + "coop": "0", + "commanderbuildersrange": "1000", + "defaultdecals": "1", + "multiplier_radarrange": "1", + "disable_assist_ally_construction": "0", + "raptor_endless": "0", + "tweakdefs6": "", + "tweakunits3": "", + "air_rework": "0", + "map_lavahighdwell": "60", + "maxunits": "2000", + "community_balance_armfast": "0", + "nowasting": "default", + "scav_spawntimemult": "1", + "unit_restrictions_noendgamelrpc": "0", + "tweakunits": "", + "enable_quickstart_overrides": "0", + "quick_start": "default", + "debugcommands": "", + "allowpausegameplay": "1", + "multiplier_energyproduction": "1", + "scav_spawncountmult": "1", + "quick_start_amount": "default", + "junorework": "0", + "date_year": "2026", + "date_hour": "21", + "ruins_civilian_disable": "0", + "teamffa_start_boxes_shuffle": "1", + "forceallunits": "0", + "lootboxes": "scav_only", + "factionlimiter": "0", + "animationcleanup": "0", + "tax_resource_sharing_amount": "0", + "tweakunits9": "", + "ruins_density": "normal", + "map_waterlevel": "0", + "scav_difficulty": "normal", + "community_balance_armwar": "0", + "comrespawn": "evocom", + "unit_restrictions_notech2": "0", + "disable_unit_sharing": "0", + "community_balance_cortermite": "0", + "tweakdefs5": "", + "t2_tech_threshold": "720", + "evocomlevelcap": "10", + "evocomlevelupmethod": "dynamic", + "map_lavatidemode": "lavastartlow", + "unit_creation_reward_multiplier": "0", + "multiplier_buildpower": "1", + "unit_restrictions_nodefence": "0", + "territorial_domination_elimination_threshold_multiplier": "1.2", + "proposed_unit_reworks": "0", + "map_lavalowlevel": "0", + "t3_tech_threshold": "4920", + "map_lavahighlevel": "0", + "map_tidal": "unchanged", + "unit_restrictions_nolrpc": "0", + "evocomxpmultiplier": "1", + "multiplier_turnrate": "1", + "tweakdefs1": "", + "date_day": "7", + "norushtimer": "0", + "tweakunits2": "", + "lootboxes_density": "normal", + "shareddynamicalliancevictory": "0", + "evocom": "0", + "unit_restrictions_notacnukes": "0", + "experimentallegionfaction": "0", + "startenergystorage": "1000", + "bonusstartresourcemultiplier": "0", + "unit_restrictions_nofusion": "0", + "startmetalstorage": "1000", + "map_lavatiderhythm": "default", + "lategame_rebalance": "0", + "multiplier_metalextraction": "1", + "tweakunits6": "", + "pip": "0", + "ranked_game": "0", + "unit_restrictions_notech15": "0", + "fixedallies": "1", + "territorial_domination_config": "25_minutes", + "dynamiccheats": "1", + "scav_bosstimemult": "1", + "critters": "1", + "tweakunits7": "", + "multiplier_weapondamage": "1", + "raptor_difficulty": "normal", + "releasecandidates": "0", + "map_waterislava": "0", + "commanderbuildersbuildpower": "400", + "override_quick_start_budget": "1200", + "date_month": "2", + "teamcolors_anonymous_mode": "disabled", + "transportenemy": "notcoms", + "ai_incomemultiplier": "1", + "deathmode": "com" + }, + "mapSettings": {}, + "spadsSettings": { + "clanmode": "tag(5):pref(5)", + "autobalance": "advanced", + "colorsensitivity": "-1", + "nbplayerbyid": "1", + "rankmode": "account", + "minplayers": "1", + "botsrank": "3", + "extrabox": "0", + "forcestarted": "0", + "maxspecs": "", + "autostop": "gameOver", + "nospecdraw": "0", + "autoaddbotnb": "0", + "springservertype": "dedicated", + "autostart": "off", + "speedcontrol": "2", + "autofixcolors": "off", + "autospecextraplayers": "1", + "skillmode": "rank", + "minteamsize": "1", + "autoblockcolors": "0", + "teamsize": "2", + "idsharemode": "off", + "autoblockbalance": "1", + "nbteams": "2", + "spadsversion": "0.13.48", + "nospecchat": "0", + "balancemode": "clan:skill" + }, + "restrictions": {}, + "allyTeams": [ + { + "allyTeamId": 1, + "startBox": { + "bottom": 1, + "left": 0, + "top": 0.665, + "right": 0.33 + }, + "playerCount": 2 + }, + { + "allyTeamId": 0, + "startBox": { + "bottom": 0.33, + "left": 0.665, + "top": 0, + "right": 1 + }, + "playerCount": 2 + } + ], + "players": [ + { + "playerId": 2, + "userId": 522737, + "name": "Tim_", + "countryCode": "US", + "rank": 2, + "skillUncertainty": 5.73, + "skill": "[26.57]", + "teamId": 2, + "rgbColor": { + "r": 151.0008, + "g": 82.00035000000001, + "b": 248.99984999999998 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 3, + "userId": 522789, + "name": "Gurthang", + "countryCode": "US", + "rank": 2, + "skillUncertainty": 5.96, + "skill": "[23.52]", + "teamId": 3, + "rgbColor": { + "r": 26.9994, + "g": 204, + "b": 36.0009 + }, + "allyTeamId": 1, + "handicap": 0, + "faction": "Armada" + }, + { + "playerId": 1, + "userId": 400837, + "name": "Kububdub", + "countryCode": "GB", + "rank": 4, + "skillUncertainty": 4.91, + "skill": "[11.35]", + "teamId": 1, + "rgbColor": { + "r": 164.00070000000002, + "g": 202.0008, + "b": 123.99884999999999 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Cortex" + }, + { + "playerId": 0, + "userId": 58228, + "name": "RiachuXGamer", + "countryCode": "US", + "rank": 3, + "skillUncertainty": 4.1, + "skill": "[27.39]", + "teamId": 0, + "rgbColor": { + "r": 236.99955, + "g": 116.9991, + "b": 224.99925 + }, + "allyTeamId": 0, + "handicap": 0, + "faction": "Cortex" + } + ], + "ais": [], + "spectators": [] + }, + "header": { + "magic": "spring demofile", + "version": 5, + "headerSize": 352, + "versionString": "2025.06.12", + "gameId": "b3b18769e8fafac3f461b2ca17f80940", + "startTime": "2026-02-07T21:42:11.000Z", + "scriptSize": 5996, + "demoStreamSize": 808013, + "gameTime": 526, + "wallclockTime": 679, + "numPlayers": 5, + "playerStatSize": 100, + "playerStatElemSize": 20, + "numTeams": 3, + "teamStatSize": 12, + "teamStatElemSize": 80, + "teamStatPeriod": 15, + "winningAllyTeamsSize": 1 + }, + "script": "[game]\n{\n[team0]\n{\nallyteam=0;\nteamleader=0;\nrgbcolor=0.92941 0.45882 0.88235;\nside=Cortex;\nhandicap=0;\n}\n[team3]\n{\nallyteam=1;\nteamleader=3;\nrgbcolor=0.10588 0.80000 0.14118;\nside=Armada;\nhandicap=0;\n}\n[player2]\n{\nteam=2;\ncountrycode=US;\naccountid=522737;\nname=Tim_;\nrank=2;\nskill=[26.57];\nspectator=0;\nskilluncertainty=5.73;\n}\n[modoptions]\n{\nzombies=disabled;\nexperimentalextraunits=0;\nunit_restrictions_noair=0;\ncommunity_balance_commando=0;\nraptor_firstwavesboost=1;\nexperimental_low_priority_pacifists=0;\nraptor_raptorstart=initialbox;\nassistdronescount=10;\ndisablemapdamage=0;\ndraft_mode=random;\ncommunity_balance_corjamt=0;\nunit_restrictions_nonukes=0;\nevocomleveluptime=5;\nfactory_costs=0;\nmultiplier_builddistance=1;\ntech_blocking=0;\ntweakdefs3=;\nassistdronesair=1;\nstartenergy=1000;\nallowunitcontrolwidgets=1;\ntechsplit=0;\nstartmetal=1000;\ntweakdefs2=;\noverride_quick_start_range=600;\nraptor_spawncountmult=1;\nmapmetadata_startpos=;\nallow_enemy_ai_spawn_placement=0;\nffa_wreckage=0;\nraptor_queentimemult=1;\nmultiplier_weaponrange=1;\nmultiplier_maxvelocity=1;\ntech_blocking_per_team=1;\nassistdronesenabled=disabled;\ntweakdefs7=;\nunit_restrictions_notech3=0;\nnaval_balance_tweaks=0;\ndummyboolfeelfreetotouch=0;\nmultiplier_shieldpower=1;\ncommanderbuildersenabled=disabled;\ntweakdefs=;\neasytax=0;\nunit_restrictions_noconverters=0;\ncommunity_balance_patch=disabled;\nemprework=0;\npushresistant=0;\nraptor_graceperiodmult=1;\ntweakdefs9=;\ntweakunits4=;\nteamcolors_icon_dev_mode=disabled;\nscav_scavstart=initialbox;\nassistdronesbuildpowermultiplier=1;\nruins=scav_only;\nruins_only_t1=0;\ntechsplit_balance=0;\nholiday_events=1;\nscavunitsforplayers=0;\nmultiplier_resourceincome=1;\nevocomlevelupmultiplier=1;\ntweakdefs8=;\nunit_restrictions_noextractors=0;\nmap_lavalowdwell=300;\nraptor_spawntimemult=1;\nskyshift=0;\ntweakunits8=;\nmultiplier_energyconversion=1;\nallowuserwidgets=1;\ntweakunits5=;\nexperimentalshields=unchanged;\nraptor_queen_count=1;\nmap_tweaklava=;\nscav_boss_count=1;\nmap_atmosphere=1;\nmultiplier_losrange=1;\ntweakdefs4=;\nscav_endless=0;\ndisable_fogofwar=0;\ntweakunits1=;\nunit_restrictions_noantinuke=0;\ncoop=0;\ncommanderbuildersrange=1000;\ndefaultdecals=1;\nmultiplier_radarrange=1;\ndisable_assist_ally_construction=0;\nraptor_endless=0;\ntweakdefs6=;\ntweakunits3=;\nair_rework=0;\nmap_lavahighdwell=60;\nmaxunits=2000;\ncommunity_balance_armfast=0;\nnowasting=default;\nscav_spawntimemult=1;\nunit_restrictions_noendgamelrpc=0;\ntweakunits=;\nenable_quickstart_overrides=0;\nquick_start=default;\ndebugcommands=;\nallowpausegameplay=1;\nmultiplier_energyproduction=1;\nscav_spawncountmult=1;\nquick_start_amount=default;\njunorework=0;\ndate_year=2026;\ndate_hour=21;\nruins_civilian_disable=0;\nteamffa_start_boxes_shuffle=1;\nforceallunits=0;\nlootboxes=scav_only;\nfactionlimiter=0;\nanimationcleanup=0;\ntax_resource_sharing_amount=0;\ntweakunits9=;\nruins_density=normal;\nmap_waterlevel=0;\nscav_difficulty=normal;\ncommunity_balance_armwar=0;\ncomrespawn=evocom;\nunit_restrictions_notech2=0;\ndisable_unit_sharing=0;\ncommunity_balance_cortermite=0;\ntweakdefs5=;\nt2_tech_threshold=720;\nevocomlevelcap=10;\nevocomlevelupmethod=dynamic;\nmap_lavatidemode=lavastartlow;\nunit_creation_reward_multiplier=0;\nmultiplier_buildpower=1;\nunit_restrictions_nodefence=0;\nterritorial_domination_elimination_threshold_multiplier=1.2;\nproposed_unit_reworks=0;\nmap_lavalowlevel=0;\nt3_tech_threshold=4920;\nmap_lavahighlevel=0;\nmap_tidal=unchanged;\nunit_restrictions_nolrpc=0;\nevocomxpmultiplier=1;\nmultiplier_turnrate=1;\ntweakdefs1=;\ndate_day=7;\nnorushtimer=0;\ntweakunits2=;\nlootboxes_density=normal;\nshareddynamicalliancevictory=0;\nevocom=0;\nunit_restrictions_notacnukes=0;\nexperimentallegionfaction=0;\nstartenergystorage=1000;\nbonusstartresourcemultiplier=0;\nunit_restrictions_nofusion=0;\nstartmetalstorage=1000;\nmap_lavatiderhythm=default;\nlategame_rebalance=0;\nmultiplier_metalextraction=1;\ntweakunits6=;\npip=0;\nranked_game=0;\nunit_restrictions_notech15=0;\nfixedallies=1;\nterritorial_domination_config=25_minutes;\ndynamiccheats=1;\nscav_bosstimemult=1;\ncritters=1;\ntweakunits7=;\nmultiplier_weapondamage=1;\nraptor_difficulty=normal;\nreleasecandidates=0;\nmap_waterislava=0;\ncommanderbuildersbuildpower=400;\noverride_quick_start_budget=1200;\ndate_month=2;\nteamcolors_anonymous_mode=disabled;\ntransportenemy=notcoms;\nai_incomemultiplier=1;\ndeathmode=com;\n}\n[team2]\n{\nallyteam=1;\nteamleader=2;\nrgbcolor=0.59216 0.32157 0.97647;\nside=Armada;\nhandicap=0;\n}\n[allyteam1]\n{\nstartrectleft=0;\nstartrectright=0.33;\nstartrectbottom=1;\nnumallies=0;\nstartrecttop=0.665;\n}\n[hostoptions]\n{\nclanmode=tag(5):pref(5);\nautobalance=advanced;\ncolorsensitivity=-1;\nnbplayerbyid=1;\nrankmode=account;\nminplayers=1;\nbotsrank=3;\nextrabox=0;\nforcestarted=0;\nmaxspecs=;\nautostop=gameOver;\nnospecdraw=0;\nautoaddbotnb=0;\nspringservertype=dedicated;\nautostart=off;\nspeedcontrol=2;\nautofixcolors=off;\nautospecextraplayers=1;\nskillmode=rank;\nminteamsize=1;\nautoblockcolors=0;\nteamsize=2;\nidsharemode=off;\nautoblockbalance=1;\nnbteams=2;\nspadsversion=0.13.48;\nnospecchat=0;\nbalancemode=clan:skill;\n}\n[player3]\n{\nteam=3;\ncountrycode=US;\naccountid=522789;\nname=Gurthang;\nrank=2;\nskill=[23.52];\nspectator=0;\nskilluncertainty=5.96;\n}\n[allyteam0]\n{\nstartrectleft=0.665;\nstartrectright=1;\nstartrectbottom=0.33;\nnumallies=0;\nstartrecttop=0;\n}\n[restrict]\n{\n}\n[player1]\n{\nteam=1;\ncountrycode=GB;\naccountid=400837;\nname=Kububdub;\nrank=4;\nskill=[11.35];\nspectator=0;\nskilluncertainty=4.91;\n}\n[player0]\n{\nteam=0;\ncountrycode=US;\naccountid=58228;\nname=RiachuXGamer;\nrank=3;\nskill=[27.39];\nspectator=0;\nskilluncertainty=4.1;\n}\n[mapoptions]\n{\n}\n[team1]\n{\nallyteam=0;\nteamleader=1;\nrgbcolor=0.64314 0.79216 0.48627;\nside=Cortex;\nhandicap=0;\n}\nishost=1;\nhostip=;\nnumallyteams=2;\nserver_match_id=8659877;\nnumteams=4;\nstartpostype=2;\ngametype=Beyond All Reason test-29422-87225c3;\nhosttype=SPADS;\nmapname=Isidis crack 1.1;\nautohostport=54232;\nnumrestrictions=0;\nautohostname=Host[US1][032];\nautohostrank=0;\nautohostaccountid=242372;\nnumplayers=4;\nautohostcountrycode=US;\nhostport=53232;\n}\n" +} \ No newline at end of file diff --git a/test/packet-snapshot.integration.test.ts b/test/packet-snapshot.integration.test.ts index 06b94cc..fc531cf 100644 --- a/test/packet-snapshot.integration.test.ts +++ b/test/packet-snapshot.integration.test.ts @@ -34,6 +34,28 @@ it.each(replayFiles)("%s skip-packets", async (name, demoPath) => { expectMatchesJsonSnapshot(demo, path.join(snapshotsDir, `${name}.skip-packets.json`)); }); +it.each(replayFiles)("%s headers", async (name, demoPath) => { + const headersOnly = await DemoParser.getHeaders(demoPath); + expectMatchesJsonSnapshot(headersOnly, path.join(snapshotsDir, `${name}.headers.json`)); +}); + +it.each(replayFiles)("%s getHeaders matches skipPackets", async (name, demoPath) => { + const parser = new DemoParser({ skipPackets: true }); + const skipResult: any = await parser.parseDemo(demoPath); + const headersResult: any = await DemoParser.getHeaders(demoPath); + + expect(headersResult.header).toEqual(skipResult.header); + expect(headersResult.script).toEqual(skipResult.script); + + const { winningAllyTeamIds: _w, ...skipMeta } = skipResult.info.meta; + const { winningAllyTeamIds: _h, ...headersMeta } = headersResult.info.meta; + expect(headersMeta).toEqual(skipMeta); + + const { meta: _sm, ...skipInfoRest } = skipResult.info; + const { meta: _hm, ...headersInfoRest } = headersResult.info; + expect(headersInfoRest).toEqual(skipInfoRest); +}); + const packetNames = Object.keys(DemoModel.Packet.ID).filter(k => isNaN(Number(k))); describe.each(replayFiles)("%s packets", (name, demoPath) => {