Back to Poly Dogfight
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.

src/settings.ts
/** 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;
  }
}