From 78ef7b56fd60cbd390fcb502989e280e56770150 Mon Sep 17 00:00:00 2001 From: Zixer1 <99333209+Zixer1@users.noreply.github.com> Date: Thu, 2 Jul 2026 21:42:03 -0400 Subject: [PATCH] feat(doomsday-clock): battle-royale style zone gamemode (#4469) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves Issue #4463 ## Description: An optional game mode that (almost) guarantees a finish instead of letting late-game stalemates drag on. Originally called sudden death, renamed to Doomsday clock Once enabled, every side (each player in FFA, each whole team in team modes) must hold a rising share of the map. A side below the bar is skulled; after a short warn its troops bleed to zero, forcing consolidation to a winner. ### How it works - **Rising zone:** a grace period, then the required share ramps up linearly to each level with 30s pauses between (a battle-royale "zone"). Levels track the ofstats FFA territory median (3/5/10/20/30%). - **Four speed presets** (slow / normal / fast / very fast) change only the pace: normal ends ~30 min, very fast ~15. - **Troop decay:** a linear ramp as a % of max capacity, ~50s from caught to zero (10s warn + ~50s ≈ 1 min total). - **UI:** a HUD panel (live share vs target, wave/decay countdowns, red/orange cues) and an on-map skull above flagged players (blinks in danger, steady while draining). ### Notes for review - Off by default; no effect on existing games. However, as discussed we can add it to the modifier pool for public games to see how popular the gamemode is vs normal play. - Sim is deterministic (integer-only, in `src/core`), covered by unit + integration tests. - One-line addition to `GameServer.updateGameConfig` so the setting survives the host → server → client round-trip. - Status is packed into the existing name-pass data slot (`pd4.w`: 0/1/2 = none/danger/draining); the skull is composited into the icon atlas at load. ### Testing `npm test`, `npm run lint`, `npx prettier --check .`, `npm run build-prod` all pass. ### UI: Image Dropdown between slow, normal, fast, very fast Before zone: Image Zone started, player not affected the pannel also blinks orange for 10s: Image Player affected, grace period (Danger): Image Skull icon blinking over player (everyone sees it) - older screenshot, the clipping has been fixed Image Player affected, grace period ended (Draining): Image Skull icon no longer blinking, everyone can see you are in a state of decay, and troops are draining: image Skull is visible like alliances icon also on player tab Image (just UI example, best way to see it is to hop on a solo game and play against AI) ## Please complete the following: - [x] 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._ --- resources/atlases/status-atlas-meta.json | 3 +- resources/atlases/status-atlas.png | Bin 93709 -> 100965 bytes resources/images/DoomsdayClockSkull.svg | 19 + resources/lang/en.json | 21 + src/client/HostLobbyModal.ts | 28 + src/client/SinglePlayerModal.ts | 35 + src/client/components/DoomsdayClockPanel.ts | 245 +++++++ src/client/components/GameConfigSettings.ts | 64 +- src/client/hud/PlayerIcons.ts | 14 +- src/client/hud/layers/GameRightSidebar.ts | 12 + .../render/frame/derive/PlayerStatus.ts | 16 + .../gl/passes/name-pass/StatusIconProgram.ts | 8 +- .../render/gl/passes/name-pass/Types.ts | 2 + .../render/gl/passes/name-pass/index.ts | 20 +- .../gl/shaders/name/status-icon.vert.glsl | 27 +- src/client/render/types/Renderer.ts | 4 + src/client/view/GameView.ts | 2 + src/client/view/PlayerView.ts | 10 + src/core/GameRunner.ts | 4 + src/core/Schemas.ts | 11 + src/core/configuration/Config.ts | 31 + src/core/execution/DoomsdayClockExecution.ts | 132 ++++ src/core/game/DoomsdayClock.ts | 228 +++++++ src/core/game/Game.ts | 5 + src/core/game/GameUpdateUtils.ts | 13 + src/core/game/GameUpdates.ts | 2 + src/core/game/PlayerImpl.ts | 27 + src/server/GameServer.ts | 3 + tests/DoomsdayClockExecution.test.ts | 617 ++++++++++++++++++ tests/GameUpdateUtils.test.ts | 2 + .../frame/derive/nuke-telegraphs.test.ts | 2 + .../render/frame/derive/player-status.test.ts | 2 + tests/util/viewStubs.ts | 1 + 33 files changed, 1593 insertions(+), 17 deletions(-) create mode 100644 resources/images/DoomsdayClockSkull.svg create mode 100644 src/client/components/DoomsdayClockPanel.ts create mode 100644 src/core/execution/DoomsdayClockExecution.ts create mode 100644 src/core/game/DoomsdayClock.ts create mode 100644 tests/DoomsdayClockExecution.test.ts diff --git a/resources/atlases/status-atlas-meta.json b/resources/atlases/status-atlas-meta.json index 32cebd1cc..9f93da03c 100644 --- a/resources/atlases/status-atlas-meta.json +++ b/resources/atlases/status-atlas-meta.json @@ -14,6 +14,7 @@ "embargo": 6, "nukeRed": 7, "nukeWhite": 8, - "allianceFaded": 9 + "allianceFaded": 9, + "doomsdayClock": 10 } } diff --git a/resources/atlases/status-atlas.png b/resources/atlases/status-atlas.png index 944dbf20487269de50f51fd188d1def305aa6069..67bc65db92ffbf150ce8a46f6aafb4b9f5f27269 100644 GIT binary patch delta 37478 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 S?uwof0iT1d6OMuPOZf-0nC#>L delta 30181 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 diff --git a/resources/images/DoomsdayClockSkull.svg b/resources/images/DoomsdayClockSkull.svg new file mode 100644 index 000000000..e644cae15 --- /dev/null +++ b/resources/images/DoomsdayClockSkull.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + diff --git a/resources/lang/en.json b/resources/lang/en.json index bb908775f..3c5b5a299 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -400,6 +400,25 @@ "discord_user_header": { "avatar_alt": "Avatar" }, + "doomsday_clock": { + "collapsing": "Collapsing -{rate}/s", + "decay_in": "Decay in {secs}s", + "final": "Final zone, hold {pct}%", + "growing": "Rising to {pct}%", + "hold": "Hold ≥ {pct}%", + "next_wave": "Next {pct}% in {time}", + "stable": "Stable", + "title": "Doomsday Clock", + "unstable": "Unstable", + "you": "You {pct}%", + "your_team": "{team}: {pct}%" + }, + "doomsday_clock_speed": { + "fast": "Fast", + "normal": "Normal", + "slow": "Slow", + "veryfast": "Very Fast" + }, "effects": { "button_title": "Pick an effect!", "nukeType": { @@ -740,6 +759,7 @@ "disable_alliances": "Disable alliances", "donate_gold": "Donate gold", "donate_troops": "Donate troops", + "doomsday_clock": "Doomsday Clock", "empty_team": "Empty", "empty_teams": "Empty Teams", "enables_title": "Disable Units", @@ -1244,6 +1264,7 @@ "bots_disabled": "Disabled", "compact_map": "Compact Map", "disable_alliances": "Disable alliances", + "doomsday_clock": "Doomsday Clock", "enables_title": "Disable Units", "gold_multiplier": "Gold multiplier", "gold_multiplier_placeholder": "2.0x", diff --git a/src/client/HostLobbyModal.ts b/src/client/HostLobbyModal.ts index d7f9257c9..969cf8620 100644 --- a/src/client/HostLobbyModal.ts +++ b/src/client/HostLobbyModal.ts @@ -8,6 +8,7 @@ import { translateText, } from "../client/Utils"; import { EventBus } from "../core/EventBus"; +import { DoomsdayClockSpeed } from "../core/game/DoomsdayClock"; import { Difficulty, GameMapSize, @@ -79,6 +80,8 @@ export class HostLobbyModal extends BaseModal { @state() private startingGold: boolean = false; @state() private startingGoldValue: number | undefined = undefined; @state() private disableAlliances: boolean = false; + @state() private doomsdayClock: boolean = false; + @state() private doomsdayClockSpeed: DoomsdayClockSpeed = "normal"; @state() private anonymizeNames: boolean = false; @state() private nameReveals: string[] = []; @state() private whitelistEnabled: boolean = false; @@ -423,6 +426,11 @@ export class HostLobbyModal extends BaseModal { labelKey: "host_modal.water_nukes", checked: this.waterNukes, }, + { + labelKey: "host_modal.doomsday_clock", + checked: this.doomsdayClock, + doomsdayClockSpeed: this.doomsdayClockSpeed, + }, { labelKey: "host_modal.host_cheats", checked: this.hostCheatsEnabled, @@ -453,6 +461,8 @@ export class HostLobbyModal extends BaseModal { @map-selected=${this.handleConfigMapSelected} @random-map-selected=${this.handleConfigRandomMapSelected} @difficulty-selected=${this.handleConfigDifficultySelected} + @doomsday-clock-speed-selected=${this + .handleConfigDoomsdayClockSpeedSelected} @game-mode-selected=${this.handleConfigGameModeSelected} @team-count-selected=${this.handleConfigTeamCountSelected} @bots-changed=${this.handleBotsChange} @@ -603,6 +613,8 @@ export class HostLobbyModal extends BaseModal { this.startingGold = false; this.startingGoldValue = undefined; this.disableAlliances = false; + this.doomsdayClock = false; + this.doomsdayClockSpeed = "normal"; this.anonymizeNames = false; this.nameReveals = []; this.whitelistEnabled = false; @@ -652,6 +664,12 @@ export class HostLobbyModal extends BaseModal { void this.handleDifficultySelection(customEvent.detail.difficulty); }; + private handleConfigDoomsdayClockSpeedSelected = (e: Event) => { + const customEvent = e as CustomEvent<{ speed: DoomsdayClockSpeed }>; + this.doomsdayClockSpeed = customEvent.detail.speed; + this.putGameConfig(); + }; + private handleConfigGameModeSelected = (e: Event) => { const customEvent = e as CustomEvent<{ mode: GameMode }>; void this.handleGameModeSelection(customEvent.detail.mode); @@ -703,6 +721,10 @@ export class HostLobbyModal extends BaseModal { this.waterNukes = checked; this.putGameConfig(); break; + case "host_modal.doomsday_clock": + this.doomsdayClock = checked; + this.putGameConfig(); + break; case "host_modal.host_cheats": this.hostCheatsEnabled = checked; this.putGameConfig(); @@ -1086,6 +1108,12 @@ export class HostLobbyModal extends BaseModal { ? Math.round(this.startingGoldValue * 1_000_000) : null, disableAlliances: this.disableAlliances || null, + // Send {enabled:false} (not undefined) when off: undefined is dropped + // by JSON.stringify, so the server's "!== undefined" merge would keep a + // previously-enabled config and the toggle could never turn off. + doomsdayClock: this.doomsdayClock + ? { enabled: true, speed: this.doomsdayClockSpeed } + : { enabled: false }, anonymizeNames: this.anonymizeNames, nameReveals: this.nameReveals, allowedPublicIds: this.whitelistEnabled diff --git a/src/client/SinglePlayerModal.ts b/src/client/SinglePlayerModal.ts index f79ef39b9..1457ef688 100644 --- a/src/client/SinglePlayerModal.ts +++ b/src/client/SinglePlayerModal.ts @@ -3,6 +3,7 @@ import { customElement, state } from "lit/decorators.js"; import { translateText } from "../client/Utils"; import { UserMeResponse } from "../core/ApiSchemas"; import { assetUrl } from "../core/AssetUrls"; +import { DoomsdayClockSpeed } from "../core/game/DoomsdayClock"; import { Difficulty, GameMapSize, @@ -61,6 +62,8 @@ const DEFAULT_OPTIONS = { disabledUnits: [] as UnitType[], disableAlliances: false, waterNukes: false, + doomsdayClock: false, + doomsdayClockSpeed: "normal" as DoomsdayClockSpeed, } as const; // A map earns achievements only if it has nations to conquer — the same rule @@ -144,6 +147,9 @@ export class SinglePlayerModal extends BaseModal { ]; @state() private disableAlliances: boolean = DEFAULT_OPTIONS.disableAlliances; @state() private waterNukes: boolean = DEFAULT_OPTIONS.waterNukes; + @state() private doomsdayClock: boolean = DEFAULT_OPTIONS.doomsdayClock; + @state() private doomsdayClockSpeed: DoomsdayClockSpeed = + DEFAULT_OPTIONS.doomsdayClockSpeed; private mapLoader = terrainMapFileLoader; @@ -442,6 +448,11 @@ export class SinglePlayerModal extends BaseModal { labelKey: "single_modal.water_nukes", checked: this.waterNukes, }, + { + labelKey: "single_modal.doomsday_clock", + checked: this.doomsdayClock, + doomsdayClockSpeed: this.doomsdayClockSpeed, + }, ], inputCards, }, @@ -453,6 +464,8 @@ export class SinglePlayerModal extends BaseModal { @map-selected=${this.handleConfigMapSelected} @random-map-selected=${this.handleConfigRandomMapSelected} @difficulty-selected=${this.handleConfigDifficultySelected} + @doomsday-clock-speed-selected=${this + .handleConfigDoomsdayClockSpeedSelected} @game-mode-selected=${this.handleConfigGameModeSelected} @team-count-selected=${this.handleConfigTeamCountSelected} @bots-changed=${this.handleBotsChange} @@ -499,6 +512,10 @@ export class SinglePlayerModal extends BaseModal { this.startingGold !== DEFAULT_OPTIONS.startingGold || this.disableAlliances !== DEFAULT_OPTIONS.disableAlliances || this.waterNukes !== DEFAULT_OPTIONS.waterNukes || + this.doomsdayClock !== DEFAULT_OPTIONS.doomsdayClock || + // Pace only matters when the mode is on (startGame drops it when off). + (this.doomsdayClock && + this.doomsdayClockSpeed !== DEFAULT_OPTIONS.doomsdayClockSpeed) || this.disabledUnits.length > 0 ); } @@ -527,6 +544,8 @@ export class SinglePlayerModal extends BaseModal { this.startingGoldValue = DEFAULT_OPTIONS.startingGoldValue; this.disableAlliances = DEFAULT_OPTIONS.disableAlliances; this.waterNukes = DEFAULT_OPTIONS.waterNukes; + this.doomsdayClock = DEFAULT_OPTIONS.doomsdayClock; + this.doomsdayClockSpeed = DEFAULT_OPTIONS.doomsdayClockSpeed; } protected onOpen(): void { @@ -563,6 +582,11 @@ export class SinglePlayerModal extends BaseModal { this.handleDifficultySelection(customEvent.detail.difficulty); }; + private handleConfigDoomsdayClockSpeedSelected = (e: Event) => { + const customEvent = e as CustomEvent<{ speed: DoomsdayClockSpeed }>; + this.doomsdayClockSpeed = customEvent.detail.speed; + }; + private handleConfigGameModeSelected = (e: Event) => { const customEvent = e as CustomEvent<{ mode: GameMode }>; this.handleGameModeSelection(customEvent.detail.mode); @@ -612,6 +636,9 @@ export class SinglePlayerModal extends BaseModal { case "single_modal.water_nukes": this.waterNukes = checked; break; + case "single_modal.doomsday_clock": + this.doomsdayClock = checked; + break; default: break; } @@ -820,6 +847,14 @@ export class SinglePlayerModal extends BaseModal { : {}), ...(this.disableAlliances ? { disableAlliances: true } : {}), ...(this.waterNukes ? { waterNukes: true } : {}), + ...(this.doomsdayClock + ? { + doomsdayClock: { + enabled: true, + speed: this.doomsdayClockSpeed, + }, + } + : {}), }, lobbyCreatedAt: Date.now(), // ms; server should be authoritative in MP }, diff --git a/src/client/components/DoomsdayClockPanel.ts b/src/client/components/DoomsdayClockPanel.ts new file mode 100644 index 000000000..6c483da26 --- /dev/null +++ b/src/client/components/DoomsdayClockPanel.ts @@ -0,0 +1,245 @@ +import { html, LitElement } from "lit"; +import { customElement, property } from "lit/decorators.js"; +import { assetUrl } from "../../core/AssetUrls"; +import { + doomsdayClockDrain, + doomsdayClockSideRequiredTiles, + doomsdayClockWaveState, +} from "../../core/game/DoomsdayClock"; +import { GameMode, PlayerType, Team } from "../../core/game/Game"; +import { themeProvider } from "../theme/ThemeProvider"; +import { renderTroops, translateText } from "../Utils"; +import { GameView } from "../view"; + +const doomsdayClockIcon = assetUrl("images/DoomsdayClockSkull.svg"); + +/** + * The Doomsday Clock readout: a self-contained panel showing the rising bar, the + * side's share vs the threshold, the stage (Stable/Unstable/Collapsing) and the + * wave countdown. Embedded by game-right-sidebar so it stacks (centered) under + * the game timer; it hides itself when the mode is off, after a winner, or for a + * spectator/eliminated player. + */ +@customElement("doomsday-clock-panel") +export class DoomsdayClockPanel extends LitElement { + @property({ attribute: false }) game!: GameView; + @property({ attribute: false }) hasWinner = false; + // Bumped by the parent each tick so the countdown + bar advance every second. + @property({ attribute: false }) refreshKey = 0; + + // Light DOM so Tailwind classes apply and it stacks in the parent's flex. + createRenderRoot() { + return this; + } + + private secondsToHms(d: number): string { + const pad = (n: number) => (n < 10 ? `0${n}` : n); + const h = Math.floor(d / 3600); + const m = Math.floor((d % 3600) / 60); + const s = Math.floor((d % 3600) % 60); + return h !== 0 ? `${pad(h)}:${pad(m)}:${pad(s)}` : `${pad(m)}:${pad(s)}`; + } + + // The player's "side" (matching the sim): themselves in FFA, their whole team + // otherwise. Returns the combined tiles and the headcount (the sim scales the + // threshold by headcount, so the HUD needs it too). + private sideStats(me: ReturnType): { + tiles: number; + size: number; + } { + if (!me) return { tiles: 0, size: 1 }; + const ffa = this.game.config().gameConfig().gameMode === GameMode.FFA; + const myTeam = me.team(); + if (ffa || myTeam === null) return { tiles: me.numTilesOwned(), size: 1 }; + const mates = this.game + .playerViews() + .filter( + (p) => + p.team() === myTeam && p.isAlive() && p.type() !== PlayerType.Bot, + ); + return { + tiles: mates.reduce((sum, p) => sum + p.numTilesOwned(), 0), + size: mates.length, + }; + } + + // Localized team name (e.g. "Red"), matching TeamStats; falls back to the raw + // team id for numbered teams. + private teamDisplayName(team: Team): string { + const key = `team_colors.${team.toLowerCase()}`; + const translated = translateText(key); + return translated !== key ? translated : team; + } + + // The team's on-map color as a hex string, for the readout label. + private teamColor(team: Team): string { + return themeProvider.current().teamColor(team).toHex(); + } + + render() { + const sd = this.game?.config().doomsdayClockConfig(); + const me = this.game?.myPlayer(); + // Personal readout: no meaning when off, after a winner, or for a spectator + // / eliminated player (a 0-tile "me" would also pulse red-alert forever). + const visible = + !!sd?.enabled && !this.hasWinner && (me?.isAlive() ?? false); + this.style.display = visible ? "block" : "none"; + if (!visible || !me || !sd) return html``; + + const elapsed = Math.floor(this.game.elapsedGameSeconds()); + const land = this.game.numLandTiles() - this.game.numTilesWithFallout(); + const myTeam = me.team() ?? null; + const { tiles: yourTiles, size: mySize } = this.sideStats(me); + // Threshold is scaled by the side's headcount (same as the sim). + const requiredTiles = doomsdayClockSideRequiredTiles( + sd.speed, + land, + elapsed, + mySize, + ); + const wave = doomsdayClockWaveState(sd.speed, elapsed); + // Wave readout percentages scale by headcount too (capped at the whole map). + const scalePct = (p: number) => Math.min(100, p * mySize); + // Match the sim: no land -> no bar, no percentages (avoid div-by-zero / >100%). + const requiredPct = land > 0 ? (requiredTiles / land) * 100 : 0; + const yourPct = land > 0 ? (yourTiles / land) * 100 : 0; + const flagged = me?.inDoomsdayClock() ?? false; + const secondsUnder = Math.floor((me?.doomsdayClockTicks() ?? 0) / 10); + const draining = flagged && secondsUnder >= sd.warnSeconds; + // Safe but within 10% (relative) of the bar: e.g. at 9% when the bar is 10%, + // or 0.9% when it's 1%. About to be caught, so it blinks red too. + const nearDanger = + !flagged && requiredTiles > 0 && yourPct <= requiredPct * 1.1; + // In danger (caught/draining) or about to be: everything red. + const redAlert = flagged || nearDanger; + + // The zone's own progress, independent of your status. Shown while stable + // AND while collapsing, so you can still see the bar rising as you bleed. + const zoneDetail = wave.done + ? translateText("doomsday_clock.final", { + pct: scalePct(wave.currentPercent), + }) + : wave.growing + ? translateText("doomsday_clock.growing", { + pct: scalePct(wave.targetPercent), + }) + : translateText("doomsday_clock.next_wave", { + pct: scalePct(wave.targetPercent), + time: this.secondsToHms(wave.secondsToNextGrowth), + }); + + // Status word + detail line. + let status: string; + let statusClass: string; + let detail: string; + if (draining && me) { + // Drain is a % of max-troop capacity, capped at current troops; show the + // actual per-second loss (renderTroops handles the /10 display unit). + const chunk = doomsdayClockDrain( + this.game.config().maxTroops(me), + secondsUnder - sd.warnSeconds, + sd, + ); + status = translateText("doomsday_clock.collapsing", { + rate: renderTroops(Math.min(me.troops(), chunk)), + }); + statusClass = "text-red-400 font-bold"; + detail = zoneDetail; // keep the zone readout visible while collapsing + } else if (flagged) { + // Caught below a wave: count down the cooldown before decay begins. + status = translateText("doomsday_clock.unstable"); + statusClass = "text-red-400 font-bold"; + detail = translateText("doomsday_clock.decay_in", { + secs: Math.max(0, sd.warnSeconds - secondsUnder), + }); + } else { + status = translateText("doomsday_clock.stable"); + statusClass = nearDanger ? "text-orange-300 font-bold" : "text-green-400"; + detail = zoneDetail; + } + + // Panel edge cue: red pulse when in/near danger, orange pulse in the 10s + // window around a wave firing. + const edge = redAlert + ? "sd-pulse-red" + : wave.waveFlash + ? "sd-pulse-orange" + : ""; + const panel = + "w-fit flex flex-col gap-1.5 py-2 px-4 bg-gray-800/92 backdrop-blur-sm shadow-xs min-[1200px]:rounded-lg rounded-bl-lg text-white text-sm"; + + return html` + +
+
+ + + ${translateText("doomsday_clock.title")} + + ${status} +
+
+ +
+
+
+
+ + ${translateText("doomsday_clock.hold", { + pct: requiredPct.toFixed(1), + })} + + ${myTeam !== null + ? html` + ${translateText("doomsday_clock.your_team", { + team: this.teamDisplayName(myTeam), + pct: yourPct.toFixed(1), + })} + ` + : html` + ${translateText("doomsday_clock.you", { + pct: yourPct.toFixed(1), + })} + `} +
+ ${detail + ? html`
${detail}
` + : ""} +
+ `; + } +} diff --git a/src/client/components/GameConfigSettings.ts b/src/client/components/GameConfigSettings.ts index 414807297..fccde571b 100644 --- a/src/client/components/GameConfigSettings.ts +++ b/src/client/components/GameConfigSettings.ts @@ -7,6 +7,10 @@ import { svg, } from "lit"; import { customElement, property, state } from "lit/decorators.js"; +import { + DOOMSDAY_CLOCK_SPEEDS, + DoomsdayClockSpeed, +} from "../../core/game/DoomsdayClock"; import { Difficulty, Duos, @@ -65,7 +69,13 @@ function renderTextCardButton( cardExtraClass: string, ): TemplateResult { return html` -