/** * Deterministic 32-bit FNV-1a hash of a string → unsigned int. Same text, same number, on every * platform — the stable seed behind per-id jitter, spread offsets, and content-addressed variation. */ export declare function hashString(text: string): number; /** * Opaque, serializable PRNG cursor for state machines that must persist their own random stream * (a spawn director, a heat/pursuit meter) instead of holding a closure — the state round-trips * through save/load and multiplayer sync, so it can't carry a function. Never read or do * arithmetic on the raw value directly; thread it through {@link stepRandomSeed} only. */ export type RandomSeed = number & { readonly __randomSeed: unique symbol; }; /** Wraps an already-integer seed (e.g. a `config.seed`) as a {@link RandomSeed} — no hashing. */ export declare function randomSeedFrom(seed: number): RandomSeed; /** * One step of the {@link seededRng} recurrence in pure (seed in, seed out) form — the same * mulberry32-style generator, shared by every state machine that persists its own PRNG cursor * instead of closing over a generator. */ export declare function stepRandomSeed(seed: RandomSeed): readonly [value: number, next: RandomSeed]; /** A {@link seededRng} stream: callable like any `() => number`, with its cursor readable and restorable for snapshots and replay. */ export interface SeededRng { (): number; /** The current cursor; feed it back to {@link restore} (or a fresh stream's `restore`) to resume the exact sequence. */ state(): number; restore(cursor: number): void; } /** Deterministic pseudo-random generator seeded from a string or number — same seed, same sequence. * * @capability seeded-random injected deterministic randomness for game logic — never `Math.random` in a simulation */ export declare function seededRng(seed: string | number): SeededRng; /** The cursor of a seeded stream, or `null` for a generator that carries no state (an injected closure, `Math.random`). */ export declare function rngStateOf(rng: () => number): number | null; /** Restore a seeded stream's cursor; a no-op for generators that carry no state. */ export declare function restoreRng(rng: () => number, cursor: number): void; /** Derives independent, deterministic {@link seededRng} streams from one base seed, keyed by stream name. */ export declare function seededStreams(seed: string | number): (stream: string) => () => number;