Skip to content

fix: remove Red Orchestra and update legacy ids to an array#784

Open
podrivo wants to merge 4 commits into
gamedig:masterfrom
podrivo:fix-red-orchestra
Open

fix: remove Red Orchestra and update legacy ids to an array#784
podrivo wants to merge 4 commits into
gamedig:masterfrom
podrivo:fix-red-orchestra

Conversation

@podrivo

@podrivo podrivo commented Jun 20, 2026

Copy link
Copy Markdown
Contributor

Closes #616

Problem

lib/games.js had two entries for what is the same game:

  • roo4145 — "Red Orchestra: Ostfront 41-45" (2006), gamespy1, query offset +10
  • redorchestra — "Red Orchestra" (2018), unreal2, query offset +1

As reported in #616, there is no standalone game called "Red Orchestra". Maintainer @CosminPerRam confirmed in the thread that the 2018 release year is bogus (no such game exists) and that the redorchestra entry "was added as an alternative query method, not necessarily as being another game." His live testing showed unreal2 with a +1 offset responded on both test servers, while gamespy1 responded on only one and valve on none — i.e. unreal2/+1 (the same family as Killing Floor 1) is the reliable query, not gamespy1.

Fix

  • Removed the duplicate redorchestra entry.
  • Kept roo4145 as the canonical id (it has the correct full name + release year and was already the MIGRATE_IDS.md target for redorchestraost), and switched it to the protocol/offset that actually works.
  • Preserved both legacy ids (redorchestraost and redorchestra) via extra.old_id, which now accepts a string or an array.
roo4145: {
  name: 'Red Orchestra: Ostfront 41-45',
  release_year: 2006,
  options: {
    port: 7757,
    port_query_offset: 1,
    protocol: 'unreal2'
  },
  extra: {
    old_id: ['redorchestraost', 'redorchestra']
  }
},

Supporting changes for the array old_id:

// lib/game-resolver.js
if (options.checkOldIDs) {
  Object.keys(games).forEach((id) => {
    const oldId = games[id]?.extra?.old_id
    const oldIds = Array.isArray(oldId) ? oldId : [oldId]
    if (oldIds.includes(type)) {
      game = games[id]
    }
  })
}

// tools/find_id_duplicates.js
if (games[key].extra && games[key].extra.old_id) {
  const idOld = games[key].extra.old_id
  const idsOld = Array.isArray(idOld) ? idOld : [idOld]
  ids.push(...idsOld)
}

Also: added redorchestra → roo4145 to MIGRATE_IDS.md, regenerated GAMES_LIST.md via tools/generate_games_list.js (drops the redorchestra row), and added a CHANGELOG.md entry under "To Be Released".

Examples

roo4145                          -> {"port":7757,"port_query_offset":1,"protocol":"unreal2"}
redorchestra                     -> Invalid game: redorchestra        (deprecated; requires checkOldIDs)
redorchestra     (checkOldIDs)   -> {"port":7757,"port_query_offset":1,"protocol":"unreal2"}
redorchestraost  (checkOldIDs)   -> {"port":7757,"port_query_offset":1,"protocol":"unreal2"}

Compatibility

  • roo4145 continues to work; its query is now unreal2/+1 (more reliable across servers per the issue testing).
  • redorchestra and redorchestraost keep working when checkOldIDs: true (or --checkOldIDs) is passed — the project's standard deprecation path, now documented in MIGRATE_IDS.md.
  • The old_id schema is backwards compatible: existing single-string old_id values are untouched; only roo4145 uses the array form.

Note: a single game entry only supports one protocol, so this picks the reliably-responding unreal2 method. Supporting gamespy1 as a fallback for servers that only answer it would need the per-game multi-query feature tracked in #608.

Testing

  • node tools/find_id_duplicates.js → "No duplicates found."
  • Resolver spot-check (see Examples above) confirms roo4145 resolves to unreal2/+1, and both legacy ids resolve only with checkOldIDs.
  • npm run lint:check: the edited files (lib/games.js, lib/game-resolver.js, tools/find_id_duplicates.js) are clean. The other files eslint flags are pre-existing and untouched by this change.
  • tools/run-id-tests.js requires the external gamedig-id-tests binary (not available here), so it was not run; find_id_duplicates.js covers the id-collision check locally.

podrivo added 4 commits June 20, 2026 11:52
…urations

- Removed the Red Orchestra entry from GAMES_LIST.md and the games.js file.
- Updated the configuration for Red Orchestra: Ostfront 41-45 to include both old IDs for better compatibility.
- Updated the game resolution logic to support multiple old IDs by converting single old ID values into an array.
- Modified the duplicate ID finding tool to accommodate the new array structure for old IDs, ensuring all relevant IDs are captured.
…stra entries

- Merged the old `redorchestra` entry into `Red Orchestra: Ostfront 41-45` and updated the protocol to `unreal2`.
- Retained `redorchestra` as an old ID for compatibility.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug: Red Orchestra and Red Orchestra: Ostfront 41-45 should be the same game

1 participant