From ad159c5306cdd21abef7ffdca0b75b69157f14bb Mon Sep 17 00:00:00 2001 From: Lucas Winther Date: Tue, 13 Oct 2026 12:41:51 +0200 Subject: [PATCH] fix(games): give Reverse: 1999's Asia readers the Asia server's clock Reverse: 1999 has an Asia server on UTC+8 alongside Global on UTC-5, both resetting at 05:00. Asia readers were on Global's 10:00 UTC; theirs rolls at 21:00 UTC. Source: Game-Time-Master. Re-labels the game-day of some already-logged ticks for Asia readers. Co-Authored-By: Claude Opus 5.5 --- src/shared/games.ts | 14 ++++++++------ test/daily.test.ts | 15 +++++++++------ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/shared/games.ts b/src/shared/games.ts index 0b4e183..9e34348 100644 --- a/src/shared/games.ts +++ b/src/shared/games.ts @@ -98,12 +98,14 @@ export const GAMES: Record = { // model gets the shared server's clock. The source is Game8 prose with no // clock of its own, so the zone is taken as Game-Time-Master states it. p5x: { id: "p5x", name: "Persona 5: The Phantom X", short: "P5X", hue: "#D62246" , studio: "Perfect World", dailyTasks: "Daily missions, stamina", resetOffsets: { asia: 0, america: 0, europe: 0 }, resetHourLocal: { asia: 20, america: 20, europe: 20 } }, - // Reverse: 1999 runs one global server on a fixed UTC-5 and rolls its day at - // **05:00**, not the 04:00 every other game here uses. Both facts come from - // the source rather than from habit: all 154 rows on the wiki's event list - // state `(UTC-5)`, and every one of them starts at 05:00 and ends at 04:59 — - // an event ending one minute before the reset that the next one begins on. - r1999: { id: "r1999", name: "Reverse: 1999", short: "R1999", hue: "#C9A227" , studio: "Bluepoch", dailyTasks: "Daily missions", resetOffsets: { asia: -5, america: -5, europe: -5 }, resetHourLocal: { asia: 5, america: 5, europe: 5 } }, + // Reverse: 1999 rolls its day at **05:00**, not 04:00, on two servers: Global + // on a fixed UTC-5 for America and Europe, and Asia on UTC+8. The Global half + // comes from the source: all 154 rows on the wiki's event list state + // `(UTC-5)`, and every one of them starts at 05:00 and ends at 04:59 — an + // event ending one minute before the reset that the next one begins on. The + // Asia server is Game-Time-Master's (github.com/cicerakes/Game-Time-Master); + // the wiki only ever describes Global. + r1999: { id: "r1999", name: "Reverse: 1999", short: "R1999", hue: "#C9A227" , studio: "Bluepoch", dailyTasks: "Daily missions", resetOffsets: { america: -5, europe: -5 }, resetHourLocal: { asia: 5, america: 5, europe: 5 } }, // Blue Archive Global runs one worldwide server that resets at 04:00 Japan // time — 19:00 UTC — per Game-Time-Master (github.com/cicerakes/Game-Time-Master), // and guides on Sportskeeda and Deltia's Gaming say the same in JST. The diff --git a/test/daily.test.ts b/test/daily.test.ts index fa61cfb..ae26bf6 100644 --- a/test/daily.test.ts +++ b/test/daily.test.ts @@ -367,8 +367,8 @@ describe("dailiesId", () => { }); describe("a game whose day rolls on a different hour", () => { - // Reverse: 1999 runs one global server on UTC-5 and resets at 05:00 rather - // than 04:00, so its day rolls at 10:00 UTC. Both facts are read off the + // Reverse: 1999's Global server runs UTC-5 and resets at 05:00 rather than + // 04:00, so its day rolls at 10:00 UTC. Both facts are read off the // source: every row of its event list states (UTC-5) and runs 05:00 → 04:59. test("rolls on 10:00 UTC, not the 09:00 a UTC-5 game would", () => { expect(dayKey(at("2026-08-16T09:59:59Z"), "europe", "r1999")).toBe( @@ -382,12 +382,12 @@ describe("a game whose day rolls on a different hour", () => { ); }); - test("every region gets the same answer, because there is one server", () => { + test("America and Europe share the Global server's answer", () => { + // Asia has its own UTC+8 server, so only the two regions on Global must agree. const instant = at("2026-08-16T09:30:00Z"); - const keys = (["asia", "america", "europe"] as const).map((r) => - dayKey(instant, r, "r1999"), + expect(dayKey(instant, "america", "r1999")).toBe( + dayKey(instant, "europe", "r1999"), ); - expect(new Set(keys).size).toBe(1); }); test("resetHourFor defaults to 04:00 for every other game", () => { @@ -529,6 +529,9 @@ describe("reset clocks, per server, as Game-Time-Master states them", () => { ["gfl2", "asia", "21:00", 8], ["gfl2", "america", "05:00", -8], ["gfl2", "europe", "05:00", -8], + ["r1999", "asia", "21:00", 8], + ["r1999", "america", "10:00", -5], + ["r1999", "europe", "10:00", -5], ]; for (const [game, region, utc, offset] of ROWS) {