The family list knows the hall: about panels link to gamehall.kestrelsnest.social, and a new game gets a card there

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
This commit is contained in:
Eric Wagoner
2026-09-23 21:04:30 -04:00
co-authored by Claude Fable 5.1
parent bcbd1c4429
commit 38e5f8b28d
3 changed files with 21 additions and 9 deletions
+13 -6
View File
@@ -1,6 +1,7 @@
// The other games of Kestrel's Hall, from the family list the kit keeps
// (family.json, one copy shipped with every game), so a player who liked one
// table can find the next. This game is left out of its own list.
// table can find the next, and the hall's front door. This game is left out
// of its own list.
export interface FamilyGame {
slug: string;
@@ -11,13 +12,19 @@ export interface FamilyGame {
origin: string;
}
export async function otherGames(self: string): Promise<FamilyGame[]> {
/** The family list: the hall's front door and every game but this one. */
export interface Family {
hall: string;
games: FamilyGame[];
}
export async function loadFamily(self: string): Promise<Family> {
try {
const res = await fetch('/family.json', { cache: 'no-cache' });
if (!res.ok) return [];
const data = (await res.json()) as { games?: FamilyGame[] };
return (data.games ?? []).filter((g) => g.slug !== self);
if (!res.ok) return { hall: '', games: [] };
const data = (await res.json()) as { hall?: string; games?: FamilyGame[] };
return { hall: data.hall ?? '', games: (data.games ?? []).filter((g) => g.slug !== self) };
} catch {
return [];
return { hall: '', games: [] };
}
}