import type { Vec2 } from '../core/types';
export interface RPGConfig {
    moveSpeed: number;
    tileSize: number;
    gridMovement: boolean;
    maxPartySize: number;
    baseStats: RPGStats;
    xpCurve: 'linear' | 'quadratic' | 'cubic';
    xpBase: number;
    xpScale: number;
    maxLevel: number;
    battleSystem: 'action' | 'turn-based' | 'atb';
    encounterRate: number;
    inventorySlots: number;
}
export interface RPGStats {
    hp: number;
    mp: number;
    attack: number;
    defense: number;
    magic: number;
    speed: number;
    luck: number;
}
export declare const DEFAULT_RPG_CONFIG: RPGConfig;
export declare function xpForLevel(level: number, config: RPGConfig): number;
export interface RPGCharacter {
    id: string;
    name: string;
    level: number;
    xp: number;
    stats: RPGStats;
    currentHp: number;
    currentMp: number;
    equipment: Record<string, string | null>;
    skills: string[];
    statusEffects: StatusEffect[];
}
export interface StatusEffect {
    id: string;
    name: string;
    duration: number;
    statMod: Partial<RPGStats>;
    dot: number;
    hot: number;
}
export interface ItemDef {
    id: string;
    name: string;
    description: string;
    type: 'weapon' | 'armor' | 'accessory' | 'consumable' | 'key' | 'material';
    slot?: string;
    stackable: boolean;
    maxStack: number;
    statBonus: Partial<RPGStats>;
    price: number;
    rarity: 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary';
    effectId?: string;
}
export interface Inventory {
    slots: Array<{
        itemId: string;
        count: number;
    } | null>;
    gold: number;
}
export declare function createInventory(capacity: number): Inventory;
export declare function addItem(inv: Inventory, itemId: string, count: number, itemDefs: Map<string, ItemDef>): boolean;
export interface VisualNovelConfig {
    textSpeed: number;
    autoAdvanceDelay: number;
    skipSpeed: number;
    historyLength: number;
    saveSlots: number;
    maxCharactersOnScreen: number;
    transitionDuration: number;
}
export declare const DEFAULT_VISUAL_NOVEL_CONFIG: VisualNovelConfig;
export type VNCommandType = 'dialog' | 'choice' | 'show' | 'hide' | 'scene' | 'music' | 'sfx' | 'wait' | 'set' | 'if' | 'jump' | 'end';
export interface VNCommand {
    type: VNCommandType;
    character?: string;
    text?: string;
    choices?: VNChoice[];
    asset?: string;
    position?: string;
    expression?: string;
    variable?: string;
    value?: string | number | boolean;
    condition?: string;
    label?: string;
    duration?: number;
}
export interface VNChoice {
    text: string;
    label: string;
    condition?: string;
}
export interface VNScript {
    id: string;
    name: string;
    commands: VNCommand[];
    labels: Record<string, number>;
}
export declare function parseVNLabels(commands: VNCommand[]): Record<string, number>;
export interface VNState {
    scriptId: string;
    commandIndex: number;
    variables: Record<string, string | number | boolean>;
    history: VNCommand[];
    visibleCharacters: Array<{
        id: string;
        position: string;
        expression: string;
    }>;
    currentBackground: string;
    textProgress: number;
    waitingForChoice: boolean;
}
export declare function createVNState(scriptId: string): VNState;
export interface PointAndClickConfig {
    walkSpeed: number;
    doubleClickRun: boolean;
    runMultiplier: number;
    interactionDistance: number;
    inventoryPosition: 'top' | 'bottom' | 'sidebar';
    cursorTypes: string[];
    verbCoin: boolean;
    hotspotHighlight: boolean;
}
export declare const DEFAULT_POINT_AND_CLICK_CONFIG: PointAndClickConfig;
export interface Hotspot {
    id: string;
    name: string;
    x: number;
    y: number;
    width: number;
    height: number;
    actions: Record<string, string>;
    description: string;
    enabled: boolean;
}
export interface RoomDef {
    id: string;
    name: string;
    background: string;
    walkableArea: Array<{
        x: number;
        y: number;
    }>;
    hotspots: Hotspot[];
    exits: Array<{
        targetRoom: string;
        position: Vec2;
        direction: string;
    }>;
}
export interface RoguelikeConfig {
    mapWidth: number;
    mapHeight: number;
    roomMinSize: number;
    roomMaxSize: number;
    maxRooms: number;
    fovRadius: number;
    turnBased: boolean;
    permadeath: boolean;
    metaProgression: boolean;
    floorCount: number;
    itemDropRate: number;
    eliteChance: number;
    bossEveryNFloors: number;
}
export declare const DEFAULT_ROGUELIKE_CONFIG: RoguelikeConfig;
export type TileType = 'wall' | 'floor' | 'door' | 'stairs_up' | 'stairs_down' | 'water' | 'lava';
export interface DungeonRoom {
    x: number;
    y: number;
    width: number;
    height: number;
    connected: boolean;
}
/** BSP dungeon generator. */
export declare function generateDungeon(config: RoguelikeConfig): {
    tiles: TileType[];
    rooms: DungeonRoom[];
};
/** Simple FOV (field of view) via raycasting. */
export declare function computeFOV(tiles: TileType[], mapWidth: number, cx: number, cy: number, radius: number): Set<number>;
export interface DungeonCrawlerConfig {
    /** First-person or top-down perspective. */
    perspective: 'first-person' | 'top-down';
    gridSize: number;
    partySize: number;
    automap: boolean;
    trapChance: number;
    secretWallChance: number;
    encounterRate: number;
    lootQualityScale: number;
    puzzleFrequency: number;
}
export declare const DEFAULT_DUNGEON_CRAWLER_CONFIG: DungeonCrawlerConfig;
export interface DungeonFloorDef {
    floor: number;
    theme: string;
    width: number;
    height: number;
    encounters: string[];
    boss: string | null;
    lootTable: string;
}
