feat(lobby): surface Doomsday Clock preset + anonymous names as lobby settings (#4616)

## Description:

Public rotation lobbies can run the **Doomsday Clock** at one of four
presets (slow/normal/fast/veryfast), and lobbies can **anonymize player
names**, but the lobby UI surfaced neither: the Doomsday Clock badge was
generic and there were no settings cards for either. Players couldn't
tell what a lobby was actually set to.

This surfaces both as regular lobby settings, matching how the other
modifiers already display:

- **Settings cards** (join/waiting view): adds a "Doomsday Clock" card
showing the active preset name, and an "Anonymous Players" card,
alongside the existing modifier cards.
- **Lobby badge** (home lobby list): the Doomsday Clock badge now reads
"Doomsday Clock: Fast" instead of the generic label. Falls back to the
plain label when no speed is present (older payloads / non-rotation
lobbies).

Client-only. Both `doomsdayClock.speed` and `anonymizeNames` already
ship in the public `GameConfig`, so no server or schema changes are
needed.


## Please complete the following:

- [] I have added screenshots for all UI updates
- [x] I process any text displayed to the user through translateText()
and I've added it to the en.json file
- [x] I have added relevant tests to the test directory

## Please put your Discord username so you can be contacted if a bug or
regression is found:

zixer._
This commit is contained in:
Zixer1
2026-07-16 10:39:55 -07:00
committed by evanpelle
parent 92a0801298
commit 16be9d7c15
5 changed files with 44 additions and 3 deletions
@@ -12,6 +12,17 @@ describe("doomsday clock public modifier", () => {
expect(mods[0].labelKey).toBe("public_game_modifier.doomsday_clock_label");
});
it("names the preset when a speed is provided", () => {
const mods = getActiveModifiers({ isDoomsdayClock: true }, "fast");
expect(mods).toHaveLength(1);
expect(mods[0].badgeKey).toBe(
"public_game_modifier.doomsday_clock_with_speed",
);
expect(mods[0].labelKey).toBe("public_game_modifier.doomsday_clock_label");
// The speed is resolved to its translated label and passed as a badge param.
expect(mods[0].badgeParams?.speed).toBeDefined();
});
it("omits the badge when the modifier is absent", () => {
expect(getActiveModifiers({})).toHaveLength(0);
expect(getActiveModifiers(undefined)).toHaveLength(0);