import type { Vec2, Color } from '../core/types';
export declare class SeededRandom {
    private s;
    constructor(seed?: number);
    /** Returns [0, 1). */
    next(): number;
    /** Returns integer in [min, max] (inclusive). */
    int(min: number, max: number): number;
    /** Returns float in [min, max). */
    float(min: number, max: number): number;
    /** Returns true with given probability (0-1). */
    chance(probability: number): boolean;
    /** Pick a random element from an array. */
    pick<T>(arr: readonly T[]): T;
    /** Shuffle array in-place (Fisher-Yates). */
    shuffle<T>(arr: T[]): T[];
    /** Weighted random pick. Returns index. */
    weighted(weights: number[]): number;
    /** Random color. */
    color(alpha?: number): Color;
    /** Random unit vector. */
    unitVec2(): Vec2;
    /** Random point inside a circle. */
    insideCircle(radius: number): Vec2;
}
export declare class PerlinNoise {
    private perm;
    constructor(seed?: number);
    /** Get noise value at (x, y) → [-1, 1]. */
    noise2D(x: number, y: number): number;
    /** Fractal Brownian Motion (layered noise). */
    fbm(x: number, y: number, octaves?: number, lacunarity?: number, gain?: number): number;
}
export interface WaveEntry {
    type: string;
    count: number;
    delay: number;
    spawnInterval: number;
}
export interface WaveConfig {
    baseEnemyCount: number;
    countGrowth: number;
    typeProbabilities: {
        type: string;
        weight: number;
        minWave: number;
    }[];
    groupSize: [number, number];
    groupDelay: [number, number];
    spawnInterval: [number, number];
}
export declare class WaveGenerator {
    private rng;
    constructor(seed?: number);
    generateWave(waveNumber: number, config: WaveConfig): WaveEntry[];
}
export interface LootDrop {
    id: string;
    weight: number;
    /** Drop quantity range. */
    quantity: [number, number];
    /** Minimum level to be eligible. */
    minLevel?: number;
    /** Maximum number of times this can drop per roll session. */
    maxPerRoll?: number;
}
export declare class LootTable {
    private rng;
    private drops;
    constructor(drops: LootDrop[], seed?: number);
    /** Roll N items from the table. */
    roll(count: number, level?: number): {
        id: string;
        quantity: number;
    }[];
    /** Simple yes/no chance to drop each item independently. */
    rollEach(level?: number): {
        id: string;
        quantity: number;
    }[];
}
export declare class ProceduralSprite {
    private rng;
    constructor(seed?: number);
    /**
     * Generate a symmetrical pixel art sprite as ImageData.
     * Good for enemies, ships, items.
     */
    generate(width: number, height: number, palette: Color[], symmetry?: 'none' | 'horizontal' | 'vertical' | 'both'): ImageData;
}
