From 1f10ad0608903a6c2455f91e9e520da1ab4bcdc6 Mon Sep 17 00:00:00 2001 From: Pedro Ivo Hudson Date: Mon, 22 Jan 2024 17:16:58 -0300 Subject: [PATCH] feat: add checking for older GIDs (#496) * feat: add new games.extra.old_id * add extra.old_id; standard release_year * add option dontCheckOldIDs * update naming, README, CHANGELOG * Update CONTRIBUTING.md * fix games.js * add tool for checking duplicates * update GAMES_LIST * fix anchor links * fix notes in generated game list * Update GAMES_LIST.md * Update GAMES_LIST.md * add Game Object Example in CONTRIBUTING * Update find_id_duplicates.js * check skipOldIDs only once * remove old ids; tweaks GAMES_LIST * add MIGRATION document WIP * Update GAMES_LIST.md * update Halo Online name * revert changes tool/generate * remove extra line * Update GAMES_LIST.md * roll back GAME_LIST * Update GAMES_LIST.md * OMG * WAT * ok... hopefully the last change * Update GAMES_LIST.md * add MIGRATION ids * roll back CONTRIBUTING * Update CHANGELOG.md * update skipOldIDs to checkOldIDs * Update MIGRATION.md * add migration note on README --- CHANGELOG.md | 4 +- MIGRATION.md | 152 +++++ README.md | 3 + bin/gamedig.js | 2 +- lib/QueryRunner.js | 2 +- lib/game-resolver.js | 14 +- lib/games.js | 1085 ++++++++++++++++++++++++----------- tools/find_id_duplicates.js | 30 + 8 files changed, 943 insertions(+), 349 deletions(-) create mode 100644 MIGRATION.md create mode 100644 tools/find_id_duplicates.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 045e729..679c6f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ * Modified exports, now the library exports `games` and `protocols` alongside the `GameDig` class. * A game always has these fields: `name`, `release_year` and `options` (which always contains `port`/`port_query`/`port_query_offset` and `protocol`). * `maxAttempts` has been renamed to `maxRetries`. +* Updated `games` with new naming system, with new option field `options.extra.old_id` with the older ID #### Games * Almost all games ids have been changed to follow a standard, see [CONTRIBUTING.md#naming](https://github.com/gamedig/node-gamedig/blob/5ae12dd494c927abcbe43352609d9aa34a54753c/CONTRIBUTING.md?plain=1#L27C3-L27C3). @@ -38,7 +39,8 @@ * `stripColors` (defaults to `true`) for protocols that strips colors: unreal2, savage2, quake3, nadeo, gamespy2, doom3, armagetron. * `requestRulesRequired` (defaults to `false`) Valve games only. `requestRules` is always required to have a response or the query will timeout. * `requestPlayersRequired` (defaults to `false`) Valve games only. Querying players is always required to have a response or the query will timeout. Some [games](GAMES_LIST.md) may not provide a players response. - * `noBreadthOrder` (defaults to `false`). If multiple attempts are to be made, disable doing one of each type until reaching the retry count. + * `noBreadthOrder` (defaults to `false`). If multiple attempts are to be made, disable doing one of each type until reaching the retry count. + * `checkOldIDs` (defaults to `false`). Query will check for older game type IDs. See [migration](MIGRATION.md) document. * Now documented: `address` (defaults to `undefined`) Override the IP address of the server skipping DNS resolution. When set, host will not be resolved, instead address will be connected to. However, some protocols still use host for other reasons e.g. as part of the query. #### Games diff --git a/MIGRATION.md b/MIGRATION.md new file mode 100644 index 0000000..d49bd01 --- /dev/null +++ b/MIGRATION.md @@ -0,0 +1,152 @@ +# Migrating from v4 to v5 + +## Game Type IDs + +The naming system used to determine the Game Type IDs have been updated in GameDig v5 and some IDs have been changed. This means you should also update your queries. + +Make sure you check if your game's ID is in the table below. If not, then nothing to worry about. If it is, make sure to update. You can still use the older ID for now, but we strongly recommend that you update your queries, as older IDs will eventually not be supported anymore. + +## Optional Field + +| Field | Type | Default | Description | +|:---------------------------|:--------|:----------|:------------------------------------------| +| **checkOldIDs** | boolean | false | Query will check for older game type IDs. | + +### Old IDs Table + +| v4 | | v5 +|:---|:---|:--- +| americasarmypg | → | aapg +| 7d2d | → | sdtd +| americasarmypg | → | aapg +| as | → | actionsource +| ageofchivalry | → | aoc +| arkse | → | ase +| arcasimracing | → | asr08 +| arma | → | aaa +| arma2oa | → | a2oa +| armacwa | → | acwa +| armar | → | armaresistance +| armare | → | armareforger +| armagetron | → | armagetronadvanced +| bat1944 | → | battalion1944 +| bf1942 | → | battlefield1942 +| bfv | → | battlefieldvietnam +| bf2 | → | battlefield2 +| bf2142 | → | battlefield2142 +| bfbc2 | → | bbc2 +| bf3 | → | battlefield3 +| bf4 | → | battlefield4 +| bfh | → | battlefieldhardline +| bd | → | basedefense +| bs | → | bladesymphony +| buildandshoot | → | bas +| cod4 | → | cod4mw +| callofjuarez | → | coj +| chivalry | → | cmw +| commandos3 | → | c3db +| cacrenegade | → | cacr +| contactjack | → | contractjack +| cs15 | → | counterstrike15 +| cs16 | → | counterstrike16 +| cs2 | → | counterstrike2 +| crossracing | → | crce +| darkesthour | → | dhe4445 +| daysofwar | → | dow +| deadlydozenpt | → | ddpt +| dh2005 | → | deerhunter2005 +| dinodday | → | ddd +| dirttrackracing2 | → | dtr2 +| dmc | → | deathmatchclassic +| dnl | → | dal +| drakan | → | dootf +| dys | → | dystopia +| em | → | empiresmod +| empyrion | → | egs +| f12002 | → | formulaone2002 +| flashpointresistance | → | ofr +| fivem | → | gta5f +| forrest | → | theforrest +| graw | → | tcgraw +| graw2 | → | tcgraw2 +| giantscitizenkabuto | → | gck +| ges | → | goldeneyesource +| gore | → | gus +| hldm | → | hld +| hldms | → | hlds +| hlopfor | → | hlof +| hl2dm | → | hl2d +| hidden | → | thehidden +| had2 | → | hiddendangerous2 +| igi2 | → | i2cs +| il2 | → | il2sturmovik +| insurgencymic | → | imic +| isle | → | theisle +| jamesbondnightfire | → | jb007n +| jc2mp | → | jc2m +| jc3mp | → | jc3m +| kingpin | → | kloc +| kisspc | → | kpctnc +| kspdmp | → | kspd +| kzmod | → | kreedzclimbing +| left4dead | → | l4d +| left4dead2 | → | l4d2 +| m2mp | → | m2m +| mohsh | → | mohaas +| mohbt | → | mohaab +| mohab | → | moha +| moh2010 | → | moh +| mohwf | → | mohw +| minecraftbe | → | mbe +| mtavc | → | gtavcmta +| mtasa | → | gtasamta +| ns | → | naturalselection +| ns2 | → | naturalselection2 +| nwn | → | neverwinternights +| nwn2 | → | neverwinternights2 +| nolf | → | tonolf +| nolf2 | → | nolf2asihw +| pvkii | → | pvak2 +| ps | → | postscriptum +| primalcarnage | → | pce +| pc | → | projectcars +| pc2 | → | projectcars2 +| prbf2 | → | prb2 +| przomboid | → | projectzomboid +| quake1 | → | quake +| quake3 | → | q3a +| ragdollkungfu | → | rdkf +| r6 | → | rainbowsix +| r6roguespear | → | rs2rs +| r6ravenshield | → | rs3rs +| redorchestraost | → | roo4145 +| redm | → | rdr2r +| riseofnations | → | ron +| rs2 | → | rs2v +| samp | → | gtasam +| saomp | → | gtasao +| savage2 | → | s2ats +| ss | → | serioussam +| ss2 | → | serioussam2 +| ship | → | theship +| sinep | → | sinepisodes +| sonsoftheforest | → | sotf +| swbf | → | swb +| swbf2 | → | swb2 +| swjk | → | swjkja +| swjk2 | → | swjk2jo +| takeonhelicopters | → | toh +| tf2 | → | teamfortress2 +| terraria | → | terrariatshosck +| tribes1 | → | t1s +| ut | → | unrealtournament +| ut2003 | → | unrealtournament2003 +| ut2004 | → | unrealtournament2004 +| ut3 | → | unrealtournament3 +| v8supercar | → | v8sc +| vcmp | → | vcm +| vs | → | vampireslayer +| wheeloftime | → | wot +| wolfenstein2009 | → | wolfenstein +| wolfensteinet | → | wet +| wurm | → | wurmunlimited \ No newline at end of file diff --git a/README.md b/README.md index 309defb..2f60dc7 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,9 @@ If a server makes its status publically available, GameDig can fetch it for you. Support is available on the [Discord](https://discord.gg/NVCMn3tnxH) for questions, or [GitHub](https://github.com/gamedig/node-gamedig/issues) for bugs. +## Migration from v4 to v5 +Game Type IDs have been updated in GameDig v5. Make sure to check if your game's ID is in the [migration document](MIGRATION.md). + ## Games List **node-GameDig** can query over 310 games + a few services! See the [GAMES_LIST.md](GAMES_LIST.md) file for the currently supported titles, not yet supported titles and notes about some of them. diff --git a/bin/gamedig.js b/bin/gamedig.js index e4d294a..8609d95 100644 --- a/bin/gamedig.js +++ b/bin/gamedig.js @@ -6,7 +6,7 @@ import Minimist from 'minimist' import { GameDig } from './../lib/index.js' const argv = Minimist(process.argv.slice(2), { - boolean: ['pretty', 'debug', 'givenPortOnly', 'requestRules', 'requestRulesRequired', 'requestPlayersRequired', 'stripColors', 'portCache', 'noBreadthOrder'], + boolean: ['pretty', 'debug', 'givenPortOnly', 'requestRules', 'requestRulesRequired', 'requestPlayersRequired', 'stripColors', 'portCache', 'noBreadthOrder', 'checkOldIDs'], string: ['guildId', 'listenUdpPort', 'ipFamily'], default: { stripColors: true, diff --git a/lib/QueryRunner.js b/lib/QueryRunner.js index 11288b6..b193704 100644 --- a/lib/QueryRunner.js +++ b/lib/QueryRunner.js @@ -32,7 +32,7 @@ export default class QueryRunner { port_query: gameQueryPort, port_query_offset: gameQueryPortOffset, ...gameOptions - } = lookup(userOptions.type) + } = lookup(userOptions) const attempts = [] const optionsCollection = { diff --git a/lib/game-resolver.js b/lib/game-resolver.js index 0e6d13f..d875c99 100644 --- a/lib/game-resolver.js +++ b/lib/game-resolver.js @@ -1,6 +1,8 @@ import { games } from './games.js' -export const lookup = (type) => { +export const lookup = (options) => { + const type = options.type + if (!type) { throw Error('No game specified') } if (type.startsWith('protocol-')) { @@ -9,7 +11,15 @@ export const lookup = (type) => { } } - const game = games[type] + let game = games[type] + + if (options.checkOldIDs) { + Object.keys(games).forEach((id) => { + if (games[id]?.extra.old_id) { + game = games[id] + } + }) + } if (!game) { throw Error('Invalid game: ' + type) } diff --git a/lib/games.js b/lib/games.js index de80704..2cb1621 100644 --- a/lib/games.js +++ b/lib/games.js @@ -5,6 +5,9 @@ export const games = { options: { port: 27015, protocol: 'valve' + }, + extra: { + old_id: 'as' } }, ahl: { @@ -21,6 +24,9 @@ export const games = { options: { port: 27015, protocol: 'valve' + }, + extra: { + old_id: 'ageofchivalry' } }, aoe2: { @@ -54,6 +60,9 @@ export const games = { port: 7777, port_query: 27015, protocol: 'valve' + }, + extra: { + old_id: 'arkse' } }, asa: { @@ -140,6 +149,9 @@ export const games = { port: 8777, port_query: 27020, protocol: 'valve' + }, + extra: { + old_id: 'americasarmypg' } }, asr08: { @@ -149,6 +161,9 @@ export const games = { port: 34397, port_query_offset: -100, protocol: 'rfactor' + }, + extra: { + old_id: 'arcasimracing' } }, aaa: { @@ -157,6 +172,9 @@ export const games = { options: { port: 2302, protocol: 'gamespy2' + }, + extra: { + old_id: 'arma' } }, arma2: { @@ -175,6 +193,9 @@ export const games = { port: 2302, port_query_offset: 1, protocol: 'valve' + }, + extra: { + old_id: 'arma2oa' } }, acwa: { @@ -184,6 +205,9 @@ export const games = { port: 2302, port_query_offset: 1, protocol: 'gamespy1' + }, + extra: { + old_id: 'armacwa' } }, armaresistance: { @@ -193,6 +217,9 @@ export const games = { port: 2302, port_query_offset: 1, protocol: 'gamespy1' + }, + extra: { + old_id: 'armar' } }, arma3: { @@ -211,6 +238,9 @@ export const games = { port: 2001, port_query: 17777, protocol: 'valve' + }, + extra: { + old_id: 'armare' } }, armagetronadvanced: { @@ -219,6 +249,9 @@ export const games = { options: { port: 4534, protocol: 'armagetron' + }, + extra: { + old_id: 'armagetron' } }, baldursgate: { @@ -255,6 +288,9 @@ export const games = { port: 7777, port_query_offset: 3, protocol: 'valve' + }, + extra: { + old_id: 'bat1944' } }, beammp: { @@ -271,6 +307,9 @@ export const games = { port: 14567, port_query: 23000, protocol: 'gamespy1' + }, + extra: { + old_id: 'bf1942' } }, battlefieldvietnam: { @@ -280,6 +319,9 @@ export const games = { port: 15567, port_query: 23000, protocol: 'gamespy2' + }, + extra: { + old_id: 'bfv' } }, battlefield2: { @@ -289,6 +331,9 @@ export const games = { port: 16567, port_query: 29900, protocol: 'gamespy3' + }, + extra: { + old_id: 'bf2' } }, battlefield2142: { @@ -298,6 +343,9 @@ export const games = { port: 16567, port_query: 29900, protocol: 'gamespy3' + }, + extra: { + old_id: 'bf2142' } }, bbc2: { @@ -307,6 +355,9 @@ export const games = { port: 19567, port_query: 48888, protocol: 'battlefield' + }, + extra: { + old_id: 'bfbc2' } }, battlefield3: { @@ -316,6 +367,9 @@ export const games = { port: 25200, port_query_offset: 22000, protocol: 'battlefield' + }, + extra: { + old_id: 'bf3' } }, battlefield4: { @@ -325,6 +379,9 @@ export const games = { port: 25200, port_query_offset: 22000, protocol: 'battlefield' + }, + extra: { + old_id: 'bf4' } }, battlefieldhardline: { @@ -334,6 +391,9 @@ export const games = { port: 25200, port_query_offset: 22000, protocol: 'battlefield' + }, + extra: { + old_id: 'bfh' } }, blackmesa: { @@ -390,6 +450,9 @@ export const games = { options: { port: 27015, protocol: 'valve' + }, + extra: { + old_id: 'bd' } }, bladesymphony: { @@ -398,25 +461,31 @@ export const games = { options: { port: 27015, protocol: 'valve' + }, + extra: { + old_id: 'bs' } }, bas: { name: 'Build and Shoot', + release_year: 2012, options: { port: 32887, port_query_offset: -1, protocol: 'buildandshoot' }, - release_year: 2012 + extra: { + old_id: 'buildandshoot' + } }, aosc: { name: 'Ace of Spades Classic', + release_year: 2012, options: { port: 32887, port_query_offset: -1, protocol: 'buildandshoot' - }, - release_year: 2012 + } }, cod: { name: 'Call of Duty', @@ -452,11 +521,14 @@ export const games = { }, cod4mw: { name: 'Call of Duty 4: Modern Warfare', + release_year: 2007, options: { port: 28960, protocol: 'quake3' }, - release_year: 2007 + extra: { + old_id: 'cod4' + } }, codbo3: { name: 'Call of Duty: Black Ops 3', @@ -496,6 +568,9 @@ export const games = { options: { port_query: 26000, protocol: 'ase' + }, + extra: { + old_id: 'callofjuarez' } }, chaser: { @@ -514,6 +589,9 @@ export const games = { port: 7777, port_query_offset: 2, protocol: 'valve' + }, + extra: { + old_id: 'chivalry' } }, chrome: { @@ -555,6 +633,9 @@ export const games = { options: { port_query: 6500, protocol: 'gamespy1' + }, + extra: { + old_id: 'commandos3' } }, cacr: { @@ -564,6 +645,9 @@ export const games = { port: 4848, port_query: 25300, protocol: 'gamespy1' + }, + extra: { + old_id: 'cacrenegade' } }, conanexiles: { @@ -592,6 +676,9 @@ export const games = { options: { port_query: 27888, protocol: 'gamespy1' + }, + extra: { + old_id: 'contactjack' } }, corekeeper: { @@ -609,6 +696,9 @@ export const games = { options: { port: 27015, protocol: 'goldsrc' + }, + extra: { + old_id: 'cs15' } }, counterstrike16: { @@ -617,6 +707,9 @@ export const games = { options: { port: 27015, protocol: 'valve' + }, + extra: { + old_id: 'cs16' } }, cs2d: { @@ -660,6 +753,9 @@ export const games = { options: { port: 27015, protocol: 'valve' + }, + extra: { + old_id: 'cs2' } }, creativerse: { @@ -678,6 +774,9 @@ export const games = { port: 12321, port_query_offset: 123, protocol: 'ase' + }, + extra: { + old_id: 'crossracing' } }, crysis: { @@ -736,6 +835,9 @@ export const games = { port: 7757, port_query_offset: 1, protocol: 'unreal2' + }, + extra: { + old_id: 'darkesthour' } }, dayofdragons: { @@ -753,6 +855,9 @@ export const games = { options: { port: 27015, protocol: 'valve' + }, + extra: { + old_id: 'daysofwar' } }, dayz: { @@ -782,6 +887,9 @@ export const games = { options: { port_query: 25300, protocol: 'gamespy1' + }, + extra: { + old_id: 'deadlydozenpt' } }, deerhunter2005: { @@ -791,6 +899,9 @@ export const games = { port: 23459, port_query: 34567, protocol: 'gamespy2' + }, + extra: { + old_id: 'dh2005' } }, descent3: { @@ -826,6 +937,9 @@ export const games = { options: { port: 27015, protocol: 'valve' + }, + extra: { + old_id: 'dinodday' } }, dtr2: { @@ -835,6 +949,9 @@ export const games = { port: 32240, port_query_offset: -100, protocol: 'gamespy1' + }, + extra: { + old_id: 'dirttrackracing2' } }, discord: { @@ -853,6 +970,9 @@ export const games = { options: { port: 27015, protocol: 'valve' + }, + extra: { + old_id: 'dmc' } }, dal: { @@ -862,6 +982,9 @@ export const games = { port: 7777, port_query: 27015, protocol: 'valve' + }, + extra: { + old_id: 'dnl' } }, dod: { @@ -911,6 +1034,9 @@ export const games = { port: 27045, port_query_offset: 1, protocol: 'gamespy1' + }, + extra: { + old_id: 'drakan' } }, dst: { @@ -928,6 +1054,9 @@ export const games = { options: { port: 27015, protocol: 'valve' + }, + extra: { + old_id: 'dys' } }, eco: { @@ -940,7 +1069,7 @@ export const games = { } }, eldewrito: { - name: 'Halo Online (ElDewrito)', + name: 'Halo Online - ElDewrito', options: { port: 11775, protocol: 'eldewrito' @@ -952,381 +1081,444 @@ export const games = { options: { port: 27015, protocol: 'valve' + }, + extra: { + old_id: 'em' } }, egs: { name: 'Empyrion - Galactic Survival', + release_year: 2015, options: { port: 30000, port_query_offset: 1, protocol: 'valve' }, - release_year: 2015 + extra: { + old_id: 'empyrion' + } }, etqw: { name: 'Enemy Territory: Quake Wars', + release_year: 2007, options: { port: 3074, port_query: 27733, protocol: 'doom3' - }, - release_year: 2007 + } }, fear: { name: 'F.E.A.R.', + release_year: 2005, options: { port_query: 27888, protocol: 'gamespy2' - }, - release_year: 2005 + } }, formulaone2002: { name: 'Formula One 2002', + release_year: 2002, options: { port_query: 3297, protocol: 'gamespy1' }, - release_year: 2002 + extra: { + old_id: 'f12002' + } }, f1c9902: { name: "F1 Challenge '99-'02", + release_year: 2002, options: { port_query: 34397, protocol: 'gamespy1' - }, - release_year: 2002 + } }, farcry: { name: 'Far Cry', + release_year: 2004, options: { port: 49001, port_query_offset: 123, protocol: 'ase' - }, - release_year: 2004 + } }, farcry2: { name: 'Far Cry 2', + release_year: 2008, options: { port_query: 14001, protocol: 'ase' - }, - release_year: 2008 + } }, fof: { name: 'Fistful of Frags', + release_year: 2014, options: { port: 27015, protocol: 'valve' - }, - release_year: 2014 + } }, fortressforever: { name: 'Fortress Forever', + release_year: 2007, options: { port: 27015, protocol: 'valve' - }, - release_year: 2007 + } }, ofcwc: { name: 'Operation Flashpoint: Cold War Crisis', + release_year: 2001, options: { port: 2302, port_query_offset: 1, protocol: 'gamespy1' - }, - release_year: 2001 + } }, ofr: { name: 'Operation Flashpoint: Resistance', + release_year: 2002, options: { port: 2302, port_query_offset: 1, protocol: 'gamespy1' }, - release_year: 2002 + extra: { + old_id: 'flashpointresistance' + } }, ffow: { name: 'Frontlines: Fuel of War', + release_year: 2008, options: { port: 5476, port_query_offset: 2, protocol: 'ffow' - }, - release_year: 2008 + } }, gta5f: { name: 'Grand Theft Auto V - FiveM', + release_year: 2013, options: { port: 30120, protocol: 'fivem' }, - release_year: 2013 + extra: { + old_id: 'fivem' + } }, theforrest: { name: 'The Forrest', + release_year: 2014, options: { port: 27015, port_query_offset: 1, protocol: 'valve' }, - release_year: 2014 + extra: { + old_id: 'forrest' + } }, garrysmod: { name: "Garry's Mod", + release_year: 2004, options: { port: 27015, protocol: 'valve' - }, - release_year: 2004 + } }, tcgraw: { name: "Tom Clancy's Ghost Recon Advanced Warfighter", + release_year: 2006, options: { port_query: 15250, protocol: 'gamespy2' }, - release_year: 2006 + extra: { + old_id: 'graw' + } }, tcgraw2: { name: "Tom Clancy's Ghost Recon Advanced Warfighter 2", + release_year: 2007, options: { port_query: 16250, protocol: 'gamespy2' }, - release_year: 2007 + extra: { + old_id: 'graw2' + } }, gck: { name: 'Giants: Citizen Kabuto', + release_year: 2000, options: { port_query: 8911, protocol: 'gamespy1' }, - release_year: 2000 + extra: { + old_id: 'giantscitizenkabuto' + } }, globaloperations: { name: 'Global Operations', + release_year: 2002, options: { port_query: 28672, protocol: 'gamespy1' - }, - release_year: 2002 + } }, geneshift: { name: 'Geneshift', + release_year: 2017, options: { port: 11235, protocol: 'geneshift' - }, - release_year: 2017 + } }, goldeneyesource: { name: 'GoldenEye: Source', + release_year: 2010, options: { port: 27015, protocol: 'valve' }, - release_year: 2010 + extra: { + old_id: 'ges' + } }, gus: { name: 'Gore: Ultimate Soldier', + release_year: 2002, options: { port: 27777, port_query_offset: 1, protocol: 'gamespy1' }, - release_year: 2002 + extra: { + old_id: 'gore' + } }, groundbreach: { name: 'Ground Breach', + release_year: 2018, options: { port: 27015, protocol: 'valve' - }, - release_year: 2018 + } }, gunmanchronicles: { name: 'Gunman Chronicles', + release_year: 2000, options: { port: 27015, protocol: 'valve' - }, - release_year: 2000 + } }, hld: { name: 'Half-Life Deathmatch', + release_year: 1998, options: { port: 27015, protocol: 'valve' }, - release_year: 1998 + extra: { + old_id: 'hldm' + } }, hlds: { name: 'Half-Life Deathmatch: Source', + release_year: 2005, options: { port: 27015, protocol: 'valve' }, - release_year: 2005 + extra: { + old_id: 'hldms' + } }, hlof: { name: 'Half-Life: Opposing Force', + release_year: 1999, options: { port: 27015, protocol: 'valve' }, - release_year: 1999 + extra: { + old_id: 'hlopfor' + } }, hl2d: { name: 'Half-Life 2: Deathmatch', + release_year: 2004, options: { port: 27015, protocol: 'valve' }, - release_year: 2004 + extra: { + old_id: 'hl2dm' + } }, halo: { name: 'Halo', + release_year: 2003, options: { port: 2302, protocol: 'gamespy2' - }, - release_year: 2003 + } }, halo2: { name: 'Halo 2', + release_year: 2007, options: { port: 2302, protocol: 'gamespy2' - }, - release_year: 2007 + } }, heretic2: { name: 'Heretic II', + release_year: 1998, options: { port: 27900, port_query_offset: 1, protocol: 'gamespy1' - }, - release_year: 1998 + } }, hexen2: { name: 'Hexen II', + release_year: 1997, options: { port: 26900, port_query_offset: 50, protocol: 'hexen2' - }, - release_year: 1997 + } }, thehidden: { name: 'The Hidden', + release_year: 2005, options: { port: 27015, protocol: 'valve' }, - release_year: 2005 + extra: { + old_id: 'hidden' + } }, hll: { name: 'Hell Let Loose', + release_year: 2019, options: { port: 27015, protocol: 'valve' - }, - release_year: 2019 + } }, hiddendangerous2: { name: 'Hidden & Dangerous 2', + release_year: 2003, options: { port: 11001, port_query_offset: 3, protocol: 'gamespy1' }, - release_year: 2003 + extra: { + old_id: 'had2' + } }, homefront: { name: 'Homefront', + release_year: 2011, options: { port: 27015, protocol: 'valve' - }, - release_year: 2011 + } }, homeworld2: { name: 'Homeworld 2', + release_year: 2003, options: { port_query: 6500, protocol: 'gamespy1' - }, - release_year: 2003 + } }, hurtworld: { name: 'Hurtworld', + release_year: 2015, options: { port: 12871, port_query: 12881, protocol: 'valve' - }, - release_year: 2015 + } }, i2cs: { name: 'IGI 2: Covert Strike', + release_year: 2003, options: { port_query: 26001, protocol: 'gamespy1' }, - release_year: 2003 + extra: { + old_id: 'igi2' + } }, il2sturmovik: { name: 'IL-2 Sturmovik', + release_year: 2001, options: { port_query: 21000, protocol: 'gamespy1' }, - release_year: 2001 + extra: { + old_id: 'il2' + } }, insurgency: { name: 'Insurgency', + release_year: 2014, options: { port: 27015, protocol: 'valve' - }, - release_year: 2014 + } }, imic: { name: 'Insurgency: Modern Infantry Combat', + release_year: 2007, options: { port: 27015, protocol: 'valve' }, - release_year: 2007 + extra: { + old_id: 'insurgencymic' + } }, insurgencysandstorm: { name: 'Insurgency: Sandstorm', + release_year: 2018, options: { port: 27015, port_query_offset: 1, protocol: 'valve' - }, - release_year: 2018 + } }, ironstorm: { name: 'Iron Storm', + release_year: 2002, options: { port_query: 3505, protocol: 'gamespy1' - }, - release_year: 2002 + } }, theisle: { name: 'The Isle', + release_year: 2015, options: { port: 7707, port_query_offset: 1, protocol: 'valve' }, - release_year: 2015 + extra: { + old_id: 'isle' + } }, tie: { name: 'The Isle Evrima', @@ -1338,244 +1530,299 @@ export const games = { }, jb007n: { name: 'James Bond 007: Nightfire', + release_year: 2002, options: { port_query: 6550, protocol: 'gamespy1' }, - release_year: 2002 + extra: { + old_id: 'jamesbondnightfire' + } }, jc2m: { name: 'Just Cause 2 - Multiplayer', + release_year: 2010, options: { port: 7777, protocol: 'jc2mp' }, - release_year: 2010 + extra: { + old_id: 'jc2mp' + } }, jc3m: { name: 'Just Cause 3 - Multiplayer', + release_year: 2017, options: { port: 4200, port_query_offset: 1, protocol: 'valve' }, - release_year: 2017 + extra: { + old_id: 'jc3mp' + } }, killingfloor: { name: 'Killing Floor', + release_year: 2009, options: { port: 7707, port_query_offset: 1, protocol: 'unreal2' - }, - release_year: 2009 + } }, killingfloor2: { name: 'Killing Floor 2', + release_year: 2016, options: { port: 7777, port_query: 27015, protocol: 'valve' - }, - release_year: 2016 + } }, kloc: { name: 'Kingpin: Life of Crime', + release_year: 1999, options: { port: 31510, port_query_offset: -10, protocol: 'gamespy1' }, - release_year: 1999 + extra: { + old_id: 'kingpin' + } }, kpctnc: { name: 'Kiss: Psycho Circus: The Nightmare Child', + release_year: 2000, options: { port: 7777, port_query_offset: 1, protocol: 'gamespy1' }, - release_year: 2000 + extra: { + old_id: 'kisspc' + } }, kspd: { name: 'Kerbal Space Program - DMP', + release_year: 2015, options: { port: 6702, port_query_offset: 1, protocol: 'kspdmp' }, - release_year: 2015 + extra: { + old_id: 'kspdmp' + } }, kreedzclimbing: { name: 'Kreedz Climbing', + release_year: 2017, options: { port: 27015, protocol: 'valve' }, - release_year: 2017 + extra: { + old_id: 'kzmod' + } }, l4d: { name: 'Left 4 Dead', + release_year: 2008, options: { port: 27015, protocol: 'valve' }, - release_year: 2008 + extra: { + old_id: 'left4dead' + } }, l4d2: { name: 'Left 4 Dead 2', + release_year: 2009, options: { port: 27015, protocol: 'valve' }, - release_year: 2009 + extra: { + old_id: 'left4dead2' + } }, m2m: { name: 'Mafia II - Multiplayer', + release_year: 2010, options: { port: 27016, port_query_offset: 1, protocol: 'mafia2mp' }, - release_year: 2010 + extra: { + old_id: 'm2mp' + } }, m2o: { name: 'Mafia II - Online', + release_year: 2010, options: { port: 27015, port_query_offset: 1, protocol: 'mafia2online' - }, - release_year: 2010 + } }, medievalengineers: { name: 'Medieval Engineers', + release_year: 2015, options: { port: 27015, protocol: 'valve' - }, - release_year: 2015 + } }, mohaa: { name: 'Medal of Honor: Allied Assault', + release_year: 2002, options: { port: 12203, port_query_offset: 97, protocol: 'gamespy1' - }, - release_year: 2002 + } }, mohaas: { name: 'Medal of Honor: Allied Assault Spearhead', + release_year: 2002, options: { port: 12203, port_query_offset: 97, protocol: 'gamespy1' }, - release_year: 2002 + extra: { + old_id: 'mohsh' + } }, mohaab: { name: 'Medal of Honor: Allied Assault Breakthrough', + release_year: 2003, options: { port: 12203, port_query_offset: 97, protocol: 'gamespy1' }, - release_year: 2003 + extra: { + old_id: 'mohbt' + } }, mohpa: { name: 'Medal of Honor: Pacific Assault', + release_year: 2004, options: { port: 13203, port_query_offset: 97, protocol: 'gamespy1' - }, - release_year: 2004 + } }, moha: { name: 'Medal of Honor: Airborne', + release_year: 2007, options: { port: 12203, port_query_offset: 97, protocol: 'gamespy1' }, - release_year: 2007 + extra: { + old_id: 'mohab' + } }, moh: { name: 'Medal of Honor', + release_year: 2010, options: { port: 7673, port_query: 48888, protocol: 'battlefield' }, - release_year: 2010 + extra: { + old_id: 'moh2010' + } }, mohw: { name: 'Medal of Honor: Warfighter', + release_year: 2012, options: { port: 25200, port_query_offset: 22000, protocol: 'battlefield' }, - release_year: 2012 + extra: { + old_id: 'mohwf' + } }, minecraft: { name: 'Minecraft', + release_year: 2009, options: { port: 25565, protocol: 'minecraft' }, extra: { doc_notes: 'minecraft' - }, - release_year: 2009 + } }, mbe: { name: 'Minecraft: Bedrock Edition', + release_year: 2011, options: { port: 19132, protocol: 'minecraft' }, - release_year: 2011 + extra: { + old_id: 'minecraftbe' + } }, mnc: { name: 'Monday Night Combat', + release_year: 2011, options: { port: 7777, port_query: 27016, protocol: 'valve' - }, - release_year: 2011 + } }, mordhau: { name: 'Mordhau', + release_year: 2019, options: { port: 7777, port_query: 27015, protocol: 'valve' - }, - release_year: 2019 + } }, gtavcmta: { name: 'Grand Theft Auto: Vice City - Multi Theft Auto', + release_year: 2002, options: { port: 22003, port_query_offset: 123, protocol: 'ase' }, - release_year: 2002 + extra: { + old_id: 'mtavc' + } }, gtasamta: { name: 'Grand Theft Auto: San Andreas - Multi Theft Auto', + release_year: 2004, options: { port: 22003, port_query_offset: 123, protocol: 'ase' }, - release_year: 2004 + extra: { + old_id: 'mtasa' + } }, mgm: { name: 'Mumble - GT Murmur', + release_year: 2005, options: { port: 64738, port_query: 27800, @@ -1583,184 +1830,201 @@ export const games = { }, extra: { doc_notes: 'mumble' - }, - release_year: 2005 + } }, mumble: { name: 'Mumble', + release_year: 2005, options: { port: 64738, protocol: 'mumbleping' }, extra: { doc_notes: 'mumble' - }, - release_year: 2005 + } }, mutantfactions: { name: 'Mutant Factions', + release_year: 2009, options: { port: 11235, protocol: 'geneshift' - }, - release_year: 2009 + } }, nascarthunder2004: { name: 'NASCAR Thunder 2004', + release_year: 2003, options: { port_query: 13333, protocol: 'gamespy2' - }, - release_year: 2003 + } }, netpanzer: { name: 'netPanzer', + release_year: 2002, options: { port: 3030, protocol: 'gamespy1' - }, - release_year: 2002 + } }, nmrih: { name: 'No More Room in Hell', + release_year: 2011, options: { port: 27015, protocol: 'valve' - }, - release_year: 2011 + } }, naturalselection: { name: 'Natural Selection', + release_year: 2002, options: { port: 27015, protocol: 'valve' }, - release_year: 2002 + extra: { + old_id: 'ns' + } }, naturalselection2: { name: 'Natural Selection 2', + release_year: 2012, options: { port_query_offset: 1, protocol: 'valve' }, - release_year: 2012 + extra: { + old_id: 'ns2' + } }, nfshp2: { name: 'Need for Speed: Hot Pursuit 2', + release_year: 2002, options: { port_query: 61220, protocol: 'gamespy1' - }, - release_year: 2002 + } }, nab: { name: 'Nerf Arena Blast', + release_year: 1999, options: { port: 4444, port_query_offset: 1, protocol: 'gamespy1' - }, - release_year: 1999 + } }, neverwinternights: { name: 'Neverwinter Nights', + release_year: 2002, options: { port_query: 5121, protocol: 'gamespy2' }, - release_year: 2002 + extra: { + old_id: 'nwn' + } }, neverwinternights2: { name: 'Neverwinter Nights 2', + release_year: 2006, options: { port: 5121, port_query: 6500, protocol: 'gamespy2' }, - release_year: 2006 + extra: { + old_id: 'nwn2' + } }, nexuiz: { name: 'Nexuiz', + release_year: 2005, options: { port_query: 26000, protocol: 'quake3' - }, - release_year: 2005 + } }, nitrofamily: { name: 'Nitro Family', + release_year: 2004, options: { port_query: 25601, protocol: 'gamespy1' - }, - release_year: 2004 + } }, tonolf: { name: 'The Operative: No One Lives Forever', + release_year: 2000, options: { port_query: 27888, protocol: 'gamespy1' }, - release_year: 2000 + extra: { + old_id: 'nolf' + } }, nolf2asihw: { name: "No One Lives Forever 2: A Spy in H.A.R.M.'s Way", + release_year: 2002, options: { port_query: 27890, protocol: 'gamespy1' }, - release_year: 2002 + extra: { + old_id: 'nolf2' + } }, nucleardawn: { name: 'Nuclear Dawn', + release_year: 2011, options: { port: 27015, protocol: 'valve' - }, - release_year: 2011 + } }, ohd: { name: 'Operation: Harsh Doorstop', + release_year: 2023, options: { port: 7777, port_query: 27005, protocol: 'valve' - }, - release_year: 2023 + } }, onset: { name: 'Onset', + release_year: 2019, options: { port: 7777, port_query_offset: -1, protocol: 'valve' - }, - release_year: 2019 + } }, openarena: { name: 'OpenArena', + release_year: 2005, options: { port_query: 27960, protocol: 'quake3' - }, - release_year: 2005 + } }, openttd: { name: 'OpenTTD', + release_year: 2004, options: { port: 3979, protocol: 'openttd' - }, - release_year: 2004 + } }, painkiller: { name: 'Painkiller', + release_year: 2004, options: { port: 3455, port_query_offset: 123, protocol: 'ase' - }, - release_year: 2004 + } }, palworld: { name: 'Palworld', @@ -1772,382 +2036,455 @@ export const games = { }, pvak2: { name: 'Pirates, Vikings, and Knights II', + release_year: 2007, options: { port: 27015, protocol: 'valve' }, - release_year: 2007 + extra: { + old_id: 'pvkii' + } }, pixark: { name: 'PixARK', + release_year: 2018, options: { port: 7777, port_query: 27015, protocol: 'valve' - }, - release_year: 2018 + } }, postscriptum: { name: 'Post Scriptum', + release_year: 2018, options: { port: 10037, protocol: 'valve' }, - release_year: 2018 + extra: { + old_id: 'ps' + } }, postal2: { name: 'Postal 2', + release_year: 2003, options: { port: 7777, port_query_offset: 1, protocol: 'gamespy1' - }, - release_year: 2003 + } }, prey: { name: 'Prey', + release_year: 2017, options: { port: 27719, protocol: 'doom3' - }, - release_year: 2017 + } }, pce: { name: 'Primal Carnage: Extinction', + release_year: 2015, options: { port: 7777, port_query: 27015, protocol: 'valve' }, - release_year: 2015 + extra: { + old_id: 'primalcarnage' + } }, projectcars: { name: 'Project Cars', + release_year: 2015, options: { port: 27015, query_port: 1, protocol: 'valve' }, - release_year: 2015 + extra: { + old_id: 'pc' + } }, projectcars2: { name: 'Project Cars 2', + release_year: 2017, options: { port: 27015, query_port: 1, protocol: 'valve' }, - release_year: 2017 + extra: { + old_id: 'pc2' + } }, prb2: { name: 'Project Reality: Battlefield 2', + release_year: 2005, options: { port: 16567, port_query: 29900, protocol: 'gamespy3' }, - release_year: 2005 + extra: { + old_id: 'prbf2' + } }, projectzomboid: { name: 'Project Zomboid', + release_year: 2013, options: { port: 16261, protocol: 'valve' }, - release_year: 2013 + extra: { + old_id: 'przomboid' + } }, quake: { name: 'Quake', + release_year: 1996, options: { port: 27500, protocol: 'quake1' }, - release_year: 1996 + extra: { + old_id: 'quake1' + } }, quake2: { name: 'Quake 2', + release_year: 1997, options: { port: 27910, protocol: 'quake2' - }, - release_year: 1997 + } }, q3a: { name: 'Quake 3: Arena', + release_year: 1999, options: { port: 27960, protocol: 'quake3' }, - release_year: 1999 + extra: { + old_id: 'quake3' + } }, quake4: { name: 'Quake 4', + release_year: 2005, options: { port: 28004, protocol: 'doom3' - }, - release_year: 2005 + } }, quakelive: { name: 'Quake Live', + release_year: 2010, options: { port: 27960, protocol: 'valve' - }, - release_year: 2010 + } }, rdkf: { name: 'Rag Doll Kung Fu', + release_year: 2005, options: { port: 27015, protocol: 'valve' }, - release_year: 2005 + extra: { + old_id: 'ragdollkungfu' + } }, rainbowsix: { name: 'Rainbow Six', + release_year: 1998, options: { port_query: 2348, protocol: 'gamespy1' }, - release_year: 1998 + extra: { + old_id: 'r6' + } }, rs2rs: { name: 'Rainbow Six 2: Rogue Spear', + release_year: 1999, options: { port_query: 2346, protocol: 'gamespy1' }, - release_year: 1999 + extra: { + old_id: 'r6roguespear' + } }, rs3rs: { name: 'Rainbow Six 3: Raven Shield', + release_year: 2003, options: { port: 7777, port_query_offset: 1000, protocol: 'gamespy1' }, - release_year: 2003 + extra: { + old_id: 'r6ravenshield' + } }, rallisportchallenge: { name: 'RalliSport Challenge', + release_year: 2002, options: { port_query: 17500, protocol: 'gamespy1' - }, - release_year: 2002 + } }, rallymasters: { name: 'Rally Masters', + release_year: 2000, options: { port_query: 16666, protocol: 'gamespy1' - }, - release_year: 2000 + } }, redorchestra: { name: 'Red Orchestra', + release_year: 2018, options: { port: 7758, port_query_offset: 1, protocol: 'unreal2' - }, - release_year: 2018 + } }, roo4145: { name: 'Red Orchestra: Ostfront 41-45', + release_year: 2006, options: { port: 7757, port_query_offset: 10, protocol: 'gamespy1' }, - release_year: 2006 + extra: { + old_id: 'redorchestraost' + } }, redorchestra2: { name: 'Red Orchestra 2', + release_year: 2011, options: { port: 7777, port_query: 27015, protocol: 'valve' - }, - release_year: 2011 + } }, redline: { name: 'Redline', + release_year: 2010, options: { port_query: 25252, protocol: 'gamespy1' - }, - release_year: 2010 + } }, rdr2r: { name: 'Red Dead Redemption 2 - RedM', + release_year: 2018, options: { port: 30120, protocol: 'fivem' }, - release_year: 2018 + extra: { + old_id: 'redm' + } }, rtcw: { name: 'Return to Castle Wolfenstein', + release_year: 2001, options: { port_query: 27960, protocol: 'quake3' - }, - release_year: 2001 + } }, rfactor: { name: 'rFactor', + release_year: 2018, options: { port: 34397, port_query_offset: -100, protocol: 'rfactor' - }, - release_year: 2018 + } }, ricochet: { name: 'Ricochet', + release_year: 2005, options: { port: 27015, protocol: 'valve' - }, - release_year: 2005 + } }, ron: { name: 'Rise of Nations', + release_year: 2003, options: { port_query: 6501, protocol: 'gamespy1' }, - release_year: 2003 + extra: { + old_id: 'riseofnations' + } }, risingworld: { name: 'Rising World', + release_year: 2014, options: { port: 4255, port_query_offset: -1, protocol: 'valve' - }, - release_year: 2014 + } }, ror2: { name: 'Risk of Rain 2', + release_year: 2020, options: { port: 27015, port_query_offset: 1, protocol: 'valve' - }, - release_year: 2020 + } }, rs2v: { name: 'Rising Storm 2: Vietnam', + release_year: 2017, options: { port: 27015, protocol: 'valve' }, - release_year: 2017 + extra: { + old_id: 'rs2' + } }, rune: { name: 'Rune', + release_year: 2000, options: { port: 7777, port_query_offset: 1, protocol: 'gamespy1' - }, - release_year: 2000 + } }, rust: { name: 'Rust', + release_year: 2013, options: { port: 28015, protocol: 'valve' - }, - release_year: 2013 + } }, gtasam: { name: 'Grand Theft Auto: San Andreas Multiplayer', + release_year: 2006, options: { port: 7777, protocol: 'samp' }, - release_year: 2006 + extra: { + old_id: 'samp' + } }, gtasao: { name: 'Grand Theft Auto: San Andreas OpenMP', + release_year: 2019, options: { port: 7777, protocol: 'samp' }, - release_year: 2019 + extra: { + old_id: 'saomp' + } }, s2ats: { name: 'Savage 2: A Tortured Soul', + release_year: 2008, options: { port_query: 11235, protocol: 'savage2' }, - release_year: 2008 + extra: { + old_id: 'savage2' + } }, sdtd: { name: '7 Days to Die', + release_year: 2013, options: { port: 26900, port_query_offset: 1, protocol: 'valve' }, - release_year: 2013 + extra: { + old_id: '7d2d' + } }, spaceengineers: { name: 'Space Engineers', + release_year: 2019, options: { port: 27015, protocol: 'valve' - }, - release_year: 2019 + } }, serioussam: { name: 'Serious Sam', + release_year: 2001, options: { port: 25600, port_query_offset: 1, protocol: 'gamespy1' }, - release_year: 2001 + extra: { + old_id: 'ss' + } }, serioussam2: { name: 'Serious Sam 2', + release_year: 2005, options: { port: 25600, protocol: 'gamespy2' }, - release_year: 2005 + extra: { + old_id: 'ss2' + } }, shatteredhorizon: { name: 'Shattered Horizon', + release_year: 2009, options: { port: 27015, protocol: 'valve' - }, - release_year: 2009 + } }, theship: { name: 'The Ship', + release_year: 2006, options: { port: 27015, protocol: 'valve' }, - release_year: 2006 + extra: { + old_id: 'ship' + } }, shogo: { name: 'Shogo', + release_year: 1998, options: { port_query: 27888, protocol: 'gamespy1' - }, - release_year: 1998 + } }, shootmania: { name: 'Shootmania', + release_year: 2013, options: { port: 2350, port_query: 5000, @@ -2155,340 +2492,365 @@ export const games = { }, extra: { doc_notes: 'nadeo-shootmania--trackmania--etc' - }, - release_year: 2013 + } }, sin: { name: 'SiN', + release_year: 1998, options: { port_query: 22450, protocol: 'gamespy1' - }, - release_year: 1998 + } }, sinepisodes: { name: 'SiN Episodes', + release_year: 2006, options: { port: 27015, protocol: 'valve' }, - release_year: 2006 + extra: { + old_id: 'sinep' + } }, soldat: { name: 'Soldat', + release_year: 2002, options: { port: 13073, port_query_offset: 123, protocol: 'ase' - }, - release_year: 2002 + } }, sof: { name: 'Soldier of Fortune', + release_year: 2000, options: { port_query: 28910, protocol: 'quake1' - }, - release_year: 2000 + } }, sof2: { name: 'Soldier of Fortune 2', + release_year: 2002, options: { port_query: 20100, protocol: 'quake3' - }, - release_year: 2002 + } }, sotf: { name: 'Sons Of The Forest', + release_year: 2023, options: { port: 8766, port_query: 27016, protocol: 'valve' }, - release_year: 2023 + extra: { + old_id: 'sonsoftheforest' + } }, stalker: { name: 'S.T.A.L.K.E.R.', + release_year: 2007, options: { port: 5445, port_query_offset: 2, protocol: 'gamespy3' - }, - release_year: 2007 + } }, stn: { name: 'Survive the Nights', + release_year: 2017, options: { port: 7950, port_query_offset: 1, protocol: 'valve' - }, - release_year: 2017 + } }, stbc: { name: 'Star Trek: Bridge Commander', + release_year: 2002, options: { port_query: 22101, protocol: 'gamespy1' - }, - release_year: 2002 + } }, stvef: { name: 'Star Trek: Voyager - Elite Force', + release_year: 2000, options: { port_query: 27960, protocol: 'quake3' - }, - release_year: 2000 + } }, stvef2: { name: 'Star Trek: Voyager - Elite Force 2', + release_year: 2003, options: { port_query: 29253, protocol: 'quake3' - }, - release_year: 2003 + } }, squad: { name: 'Squad', + release_year: 2020, options: { port: 7787, port_query: 27165, protocol: 'valve' - }, - release_year: 2020 + } }, swb: { name: 'Star Wars: Battlefront', + release_year: 2004, options: { port_query: 3658, protocol: 'gamespy2' }, - release_year: 2004 + extra: { + old_id: 'swbf' + } }, swb2: { name: 'Star Wars: Battlefront 2', + release_year: 2005, options: { port_query: 3658, protocol: 'gamespy2' }, - release_year: 2005 + extra: { + old_id: 'swbf2' + } }, swjkja: { name: 'Star Wars Jedi Knight: Jedi Academy', + release_year: 2003, options: { port_query: 29070, protocol: 'quake3' }, - release_year: 2003 + extra: { + old_id: 'swjk' + } }, swjk2jo: { name: 'Star Wars Jedi Knight II: Jedi Outcast', + release_year: 2002, options: { port_query: 28070, protocol: 'quake3' }, - release_year: 2002 + extra: { + old_id: 'swjk2' + } }, swrc: { name: 'Star Wars: Republic Commando', + release_year: 2005, options: { port: 7777, port_query: 11138, protocol: 'gamespy2' - }, - release_year: 2005 + } }, starbound: { name: 'Starbound', + release_year: 2016, options: { port: 21025, protocol: 'valve' - }, - release_year: 2016 + } }, starmade: { name: 'StarMade', + release_year: 2012, options: { port: 4242, protocol: 'starmade' - }, - release_year: 2012 + } }, starsiege: { name: 'Starsiege', + release_year: 2009, options: { port: 29001, protocol: 'starsiege' - }, - release_year: 2009 + } }, suicidesurvival: { name: 'Suicide Survival', + release_year: 2008, options: { port: 27015, protocol: 'valve' - }, - release_year: 2008 + } }, swat4: { name: 'SWAT 4', + release_year: 2005, options: { port: 10480, port_query_offset: 2, protocol: 'gamespy2' - }, - release_year: 2005 + } }, svencoop: { name: 'Sven Coop', + release_year: 1999, options: { port: 27015, protocol: 'valve' - }, - release_year: 1999 + } }, synergy: { name: 'Synergy', + release_year: 2005, options: { port: 27015, protocol: 'valve' - }, - release_year: 2005 + } }, tacticalops: { name: 'Tactical Ops', + release_year: 1999, options: { port: 7777, port_query_offset: 1, protocol: 'gamespy1' - }, - release_year: 1999 + } }, toh: { name: 'Take On Helicopters', + release_year: 2011, options: { port: 2302, port_query_offset: 1, protocol: 'gamespy1' }, - release_year: 2011 + extra: { + old_id: 'takeonhelicopters' + } }, teamfactor: { name: 'Team Factor', + release_year: 2002, options: { port_query: 57778, protocol: 'gamespy1' - }, - release_year: 2002 + } }, tfc: { name: 'Team Fortress Classic', + release_year: 1999, options: { port: 27015, protocol: 'valve' - }, - release_year: 1999 + } }, teamfortress2: { name: 'Team Fortress 2', + release_year: 2007, options: { port: 27015, protocol: 'valve' }, - release_year: 2007 + extra: { + old_id: 'tf2' + } }, teamspeak2: { name: 'Teamspeak 2', + release_year: 2001, options: { port: 8767, protocol: 'teamspeak2' - }, - release_year: 2001 + } }, teamspeak3: { name: 'Teamspeak 3', + release_year: 2011, options: { port: 9987, protocol: 'teamspeak3' }, extra: { doc_notes: 'teamspeak3' - }, - release_year: 2011 + } }, terminus: { name: 'Terminus', + release_year: 2000, options: { port_query: 12286, protocol: 'gamespy1' - }, - release_year: 2000 + } }, terrariatshosck: { name: 'Terraria - TShock', + release_year: 2011, options: { port: 7777, port_query_offset: 101, protocol: 'terraria' }, extra: { + old_id: 'terraria', doc_notes: 'terraria' }, - release_year: 2011 }, theforest: { name: 'The Forest', + release_year: 2014, options: { port: 27015, port_query_offset: 1, protocol: 'valve' - }, - release_year: 2014 + } }, thefront: { name: 'The Front', + release_year: 2023, options: { port_query: 27015, protocol: 'valve' - }, - release_year: 2023 + } }, thps3: { name: "Tony Hawk's Pro Skater 3", + release_year: 2001, options: { port_query: 6500, protocol: 'gamespy1' - }, - release_year: 2001 + } }, thps4: { name: "Tony Hawk's Pro Skater 4", + release_year: 2002, options: { port_query: 6500, protocol: 'gamespy1' - }, - release_year: 2002 + } }, thu2: { name: "Tony Hawk's Underground 2", + release_year: 2004, options: { port_query: 5153, protocol: 'gamespy1' - }, - release_year: 2004 + } }, towerunite: { name: 'Tower Unite', + release_year: 2016, options: { port: 27015, protocol: 'valve' - }, - release_year: 2016 + } }, trackmania2: { name: 'Trackmania 2', + release_year: 2011, options: { port: 2350, port_query: 5000, @@ -2496,11 +2858,11 @@ export const games = { }, extra: { doc_notes: 'nadeo-shootmania--trackmania--etc' - }, - release_year: 2011 + } }, trackmaniaforever: { name: 'Trackmania Forever', + release_year: 2008, options: { port: 2350, port_query: 5000, @@ -2508,148 +2870,166 @@ export const games = { }, extra: { doc_notes: 'nadeo-shootmania--trackmania--etc' - }, - release_year: 2008 + } }, tremulous: { name: 'Tremulous', + release_year: 2006, options: { port_query: 30720, protocol: 'quake3' - }, - release_year: 2006 + } }, t1s: { name: 'Tribes 1: Starsiege', + release_year: 1998, options: { port: 28001, protocol: 'tribes1' }, - release_year: 1998 + extra: { + old_id: 'tribes1' + } }, tribesvengeance: { name: 'Tribes: Vengeance', + release_year: 2004, options: { port: 7777, port_query_offset: 1, protocol: 'gamespy2' - }, - release_year: 2004 + } }, tron20: { name: 'Tron 2.0', + release_year: 2003, options: { port_query: 27888, protocol: 'gamespy2' - }, - release_year: 2003 + } }, thespecialists: { name: 'The Specialists', + release_year: 2002, options: { port: 27015, protocol: 'valve' - }, - release_year: 2002 + } }, turok2: { name: 'Turok 2', + release_year: 1998, options: { port_query: 12880, protocol: 'gamespy1' - }, - release_year: 1998 + } }, u2tax: { name: 'Unreal 2: The Awakening - XMP', + release_year: 2003, options: { port: 7777, port_query_offset: 1, protocol: 'unreal2' - }, - release_year: 2003 + } }, universalcombat: { name: 'Universal Combat', + release_year: 2004, options: { port: 1135, port_query_offset: 123, protocol: 'ase' - }, - release_year: 2004 + } }, unreal: { name: 'Unreal', + release_year: 1998, options: { port: 7777, port_query_offset: 1, protocol: 'gamespy1' - }, - release_year: 1998 + } }, unturned: { name: 'unturned', + release_year: 2014, options: { port: 27015, port_query_offset: 1, protocol: 'valve' - }, - release_year: 2014 + } }, unrealtournament: { name: 'Unreal Tournament', + release_year: 1993, options: { port: 7777, port_query_offset: 1, protocol: 'gamespy1' }, - release_year: 1993 + extra: { + old_id: 'ut' + } }, unrealtournament2003: { name: 'Unreal Tournament 2003', + release_year: 2003, options: { port: 7757, port_query_offset: 1, protocol: 'unreal2' }, - release_year: 2003 + extra: { + old_id: 'ut2003' + } }, unrealtournament2004: { name: 'Unreal Tournament 2004', + release_year: 2004, options: { port: 7777, port_query_offset: 1, protocol: 'unreal2' }, - release_year: 2004 + extra: { + old_id: 'ut2004' + } }, unrealtournament3: { name: 'Unreal Tournament 3', + release_year: 2007, options: { port: 7777, port_query_offset: -1277, protocol: 'ut3' }, - release_year: 2007 + extra: { + old_id: 'ut3' + } }, urbanterror: { name: 'Urban Terror', + release_year: 2000, options: { port_query: 27960, protocol: 'quake3' - }, - release_year: 2000 + } }, v8sc: { name: 'V8 Supercar Challenge', + release_year: 2002, options: { port_query: 16700, protocol: 'gamespy1' }, - release_year: 2002 + extra: { + old_id: 'v8supercar' + } }, valheim: { name: 'Valheim', + release_year: 2021, options: { port: 2456, port_query_offset: 1, @@ -2657,141 +3037,158 @@ export const games = { }, extra: { doc_notes: 'valheim' - }, - release_year: 2021 + } }, vcm: { name: 'Vice City Multiplayer', + release_year: 2015, options: { port: 8192, protocol: 'vcmp' }, - release_year: 2015 + extra: { + old_id: 'vcmp' + } }, ventrilo: { name: 'Ventrilo', + release_year: 2002, options: { port: 3784, protocol: 'ventrilo' - }, - release_year: 2002 + } }, vietcong: { name: 'Vietcong', + release_year: 2003, options: { port: 5425, port_query: 15425, protocol: 'gamespy1' - }, - release_year: 2003 + } }, vietcong2: { name: 'Vietcong 2', + release_year: 2005, options: { port: 5001, port_query: 19967, protocol: 'gamespy2' - }, - release_year: 2005 + } }, vrising: { name: 'V Rising', + release_year: 2022, options: { port: 27015, port_query_offset: [1, 15], protocol: 'valve' - }, - release_year: 2022 + } }, vampireslayer: { name: 'Vampire Slayer', + release_year: 2000, options: { port: 27015, protocol: 'valve' }, - release_year: 2000 + extra: { + old_id: 'vs' + } }, warsow: { name: 'Warsow', + release_year: 2012, options: { port: 44400, protocol: 'warsow' - }, - release_year: 2012 + } }, warfork: { name: 'Warfork', + release_year: 2019, options: { port_query: 44400, protocol: 'warsow' - }, - release_year: 2019 + } }, wot: { name: 'Wheel of Time', + release_year: 1999, options: { port: 7777, port_query_offset: 1, protocol: 'gamespy1' }, - release_year: 1999 + extra: { + old_id: 'wheeloftime' + } }, wolfenstein: { name: 'Wolfenstein', + release_year: 2009, options: { port: 27666, protocol: 'doom3' }, - release_year: 2009 + extra: { + old_id: 'wolfenstein2009' + } }, wet: { name: 'Wolfenstein: Enemy Territory', + release_year: 2003, options: { port_query: 27960, protocol: 'quake3' }, - release_year: 2003 + extra: { + old_id: 'wolfensteinet' + } }, wurmunlimited: { name: 'Wurm Unlimited', + release_year: 2006, options: { port: 3724, query_port: 27016, protocol: 'valve' }, - release_year: 2006 + extra: { + old_id: 'wurm' + } }, xonotic: { name: 'Xonotic', + release_year: 2011, options: { port: 26000, protocol: 'quake3' - }, - release_year: 2011 + } }, xpandrally: { name: 'Xpand Rally', + release_year: 2004, options: { port: 28015, port_query_offset: 123, protocol: 'ase' - }, - release_year: 2004 + } }, zombiemaster: { name: 'Zombie Master', + release_year: 2007, options: { port: 27015, protocol: 'valve' - }, - release_year: 2007 + } }, zps: { name: 'Zombie Panic: Source', + release_year: 2007, options: { port: 27015, protocol: 'valve' - }, - release_year: 2007 + } } } diff --git a/tools/find_id_duplicates.js b/tools/find_id_duplicates.js new file mode 100644 index 0000000..9139181 --- /dev/null +++ b/tools/find_id_duplicates.js @@ -0,0 +1,30 @@ +import { games } from '../lib/games.js' + +const ids = Object.keys(games) + +Object.keys(games).forEach((key) => { + if (games[key].extra && games[key].extra.old_id) { + const idOld = games[key].extra.old_id + ids.push(idOld) + } +}) + +function hasDuplicates(obj) { + const uniqueSet = new Set() + + for (const item of obj) { + if (uniqueSet.has(item)) { + console.log('Duplicate:', item) + return true + } + uniqueSet.add(item) + } + + return false +} + +if (hasDuplicates(ids)) { + console.log('Duplicates found.') +} else { + console.log('No duplicates found.') +}