SOURCE / PINNED RELEASE
Made of little things.
Poly Dogfight
- Release
- b8511ee374e3…
- Author-recorded commit
- 5579434b9d8b…
- License
- LICENSE
- Author’s source reference
- nostr://npub1ye5ptcxfyyxl5vjvdjar2ua3f0hynkjzpx552mu5snj3qmx5pzjscpknpr/wss%3A%2F%2Fgit.napplet.soy%2F/n-44f63e5422b
Archive hash verified: bcadd2430d8ea2bc…. The source-to-build association is the author’s claim; it has not been independently rebuilt.
/** Player preferences, persisted through the optional napplet storage domain. */
import { STORAGE_DOMAIN, storage } from '@napplet/sdk';
import type { CameraMode } from './camera.ts';
import { runtimeHasDomain } from './domain-availability.js';
export type Settings = { beginner: boolean; invertPitch: boolean; muted: boolean; camera: CameraMode };
const KEY = 'poly-dogfight/settings';
export const defaultSettings = (): Settings => ({ beginner: false, invertPitch: false, muted: false, camera: 'chase' });
export async function loadSettings(): Promise<Settings> {
const settings = defaultSettings();
if (!runtimeHasDomain(STORAGE_DOMAIN)) return settings;
try {
const raw = await storage.getItem(KEY);
if (!raw) return settings;
const parsed = JSON.parse(raw) as Partial<Settings>;
if (typeof parsed.beginner === 'boolean') settings.beginner = parsed.beginner;
if (typeof parsed.invertPitch === 'boolean') settings.invertPitch = parsed.invertPitch;
if (typeof parsed.muted === 'boolean') settings.muted = parsed.muted;
if (parsed.camera === 'chase' || parsed.camera === 'far' || parsed.camera === 'cockpit') settings.camera = parsed.camera;
} catch {
// Storage is optional; play with defaults.
}
return settings;
}
/** Returns false when the preference could not be saved. */
export async function saveSettings(settings: Settings): Promise<boolean> {
if (!runtimeHasDomain(STORAGE_DOMAIN)) return false;
try {
await storage.setItem(KEY, JSON.stringify(settings));
return true;
} catch {
return false;
}
}
