src/util/storage.ts (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
import type { SetId } from "../board/pieces";
export interface Prefs {
pieceSet: SetId;
theme: "paper" | "crt";
sound: boolean;
reactions: boolean;
coords: boolean;
personality: string;
side: "w" | "b" | "random";
clock: string;
clockBase: number; // custom base, seconds
clockInc: number; // custom increment, seconds
threats: boolean;
blunder: boolean;
}
const DEFAULTS: Prefs = {
pieceSet: "kingdom",
theme: "paper",
sound: true,
reactions: false,
coords: true,
personality: "beginner",
side: "w",
clock: "none",
clockBase: 300,
clockInc: 0,
threats: false,
blunder: false,
};
const PREFS_KEY = "emchess.prefs";
const SAVE_KEY = "emchess.save";
export function loadPrefs(): Prefs {
try {
const raw = localStorage.getItem(PREFS_KEY);
if (!raw) return { ...DEFAULTS };
return { ...DEFAULTS, ...JSON.parse(raw) };
} catch {
return { ...DEFAULTS };
}
}
export function savePrefs(prefs: Prefs) {
try {
localStorage.setItem(PREFS_KEY, JSON.stringify(prefs));
} catch {
/* private mode, no storage — the game still works, it just won't remember. */
}
}
export interface SavedGame {
pgn: string;
side: "w" | "b";
personality: string;
savedAt: number;
}
export function saveGame(game: SavedGame) {
try {
localStorage.setItem(SAVE_KEY, JSON.stringify(game));
} catch {
/* ignore */
}
}
export function loadGame(): SavedGame | null {
try {
const raw = localStorage.getItem(SAVE_KEY);
return raw ? (JSON.parse(raw) as SavedGame) : null;
} catch {
return null;
}
}
export function clearGame() {
try {
localStorage.removeItem(SAVE_KEY);
} catch {
/* ignore */
}
}
|