diff --git a/src/shared/games.ts b/src/shared/games.ts index 26336ea..9ef7b6d 100644 --- a/src/shared/games.ts +++ b/src/shared/games.ts @@ -65,6 +65,8 @@ export const GAMES: Record = { // EU reset at 04:00 UTC+1 confirmed in game by the owner on 2026-10-16: the // Trounce Domains menu reads "every Monday 4AM GMT+1". genshin: { id: "genshin", name: "Genshin Impact", short: "Genshin", hue: "#4EA8DE" , studio: "HoYoverse", dailyTasks: "Commissions, resin" }, + // EU reset at 04:00 UTC+1 (05:00 CEST) confirmed in game by the owner on + // 2026-10-14: at 03:49 CEST on a Wednesday a period read 5d 1h left. hsr: { id: "hsr", name: "Honkai: Star Rail", short: "Star Rail", hue: "#7B8CFF" , studio: "HoYoverse", dailyTasks: "Daily training, Trailblaze Power" }, zzz: { id: "zzz", name: "Zenless Zone Zero", short: "ZZZ", hue: "#F2A03D" , studio: "HoYoverse", dailyTasks: "Daily missions, battery" }, wuwa: { id: "wuwa", name: "Wuthering Waves", short: "Wuwa", hue: "#3DD6A0" , studio: "Kuro Games", dailyTasks: "Daily activity, waveplate" }, diff --git a/src/shared/routines.ts b/src/shared/routines.ts index f80a6c4..29f5b33 100644 --- a/src/shared/routines.ts +++ b/src/shared/routines.ts @@ -137,6 +137,44 @@ export const ROUTINES: readonly Routine[] = [ note: "Confirmed in game, 2026-10-16.", }, + // Honkai: Star Rail. + { + id: "routine:hsr:echo-of-war", + game: "hsr", + title: "Echo of War", + period: { unit: "week", startsOn: 1 }, + measure: { kind: "amount", target: 3, unit: "runs" }, + source: "https://honkai-star-rail.fandom.com/wiki/Echo_of_War", + asOf: "2025-10-17", + checked: "2026-10-14", + note: "Confirmed in game, 2026-10-14.", + }, + { + id: "routine:hsr:nameless-honor-exp", + game: "hsr", + title: "Nameless Honor weekly EXP", + // Monday is Star Rail's weekly reset, as Echo of War's page states it. + period: { unit: "week", startsOn: 1 }, + measure: { kind: "amount", target: 8000, unit: "EXP" }, + source: "https://honkai-star-rail.fandom.com/wiki/Nameless_Honor", + asOf: "2026-08-26", + checked: "2026-10-14", + note: "The pass's weekly EXP cap; the wiki doesn't state it. Confirmed in game, 2026-10-14.", + }, + { + id: "routine:hsr:embers-exchange", + game: "hsr", + title: "Embers Exchange: Star Rail Special Pass", + // The wiki marks the stock as refreshing monthly; the 1st is the owner's + // in-game countdown on 2026-10-14, which ends at the reset on 1 Nov 2026. + period: { unit: "month", startsOn: 1 }, + measure: { kind: "amount", target: 5, unit: "passes" }, + source: "https://honkai-star-rail.fandom.com/wiki/Embers_Exchange", + asOf: "2026-07-12", + checked: "2026-10-14", + note: "Bought with Undying Embers. The wiki says monthly; the 1st is ours. Confirmed in game, 2026-10-14.", + }, + // Zenless Zone Zero. { id: "routine:zzz:ridu-weekly", diff --git a/test/routines.test.ts b/test/routines.test.ts index dbbe69f..99355be 100644 --- a/test/routines.test.ts +++ b/test/routines.test.ts @@ -63,7 +63,11 @@ describe("ROUTINES", () => { ["Spiral Abyss", { unit: "month", startsOn: 16 }, { kind: "days", required: 1 }], ["Imaginarium Theater", { unit: "month", startsOn: 1 }, { kind: "days", required: 1 }], ]); - expect(shape("hsr")).toEqual([]); + expect(shape("hsr")).toEqual([ + ["Echo of War", week, { kind: "amount", target: 3, unit: "runs" }], + ["Nameless Honor weekly EXP", week, { kind: "amount", target: 8000, unit: "EXP" }], + ["Embers Exchange: Star Rail Special Pass", { unit: "month", startsOn: 1 }, { kind: "amount", target: 5, unit: "passes" }], + ]); expect(shape("zzz")).toEqual([ ["Ridu Weekly", week, { kind: "amount", target: 1300, unit: "points" }], ]);