/**
 * Ввод: клавиши, клик мыши, режим курсора.
 */
declare namespace game {
    /**
     * Каждый кадр render-loop'а. dt — секунды с предыдущего кадра.
     * @example
     * game.onTick((dt) => {
     *     const p = game.player.position;
     *     game.ui.set('xz', `x=${p.x.toFixed(1)} z=${p.z.toFixed(1)}`);
     * });
     */
    function onTick(fn: (dt: number) => void): void;

    /**
     * Подписаться на нажатие клавиши.
     * @param key 'w'|'a'|'s'|'d'|'space'|'shift'|'enter'|'escape'|'arrowup'|'1'|...
     *            Не указано → срабатывает на любую клавишу.
     * @example
     * game.onKey('space', () => game.player.boostJump(2));
     */
    function onKey(key: string, fn: (event: {
        type: 'keydown'; key: string; code: string;
    }) => void): void;
    function onKey(fn: (event: {
        type: 'keydown'; key: string; code: string;
    }) => void): void;

    /** Подписаться на отпускание клавиши. */
    function onKeyUp(key: string, fn: (event: {
        type: 'keyup'; key: string; code: string;
    }) => void): void;
    function onKeyUp(fn: (event: {
        type: 'keyup'; key: string; code: string;
    }) => void): void;

    /**
     * Глобальный клик мышью в Play-режиме.
     * event.target = объект под прицелом (или null), event.point = точка попадания луча.
     */
    function onClick(fn: (event: {
        type: 'click';
        point: game.Vector3 | null;
        target: { kind: string; ref?: any; id?: number } | null;
    }) => void): void;

    /** Игрок коснулся объекта (с привязанным скриптом — глобальное событие). */
    function onPlayerTouch(fn: (event: {
        type: 'playerTouch';
        target: { kind: string; ref?: any; id?: number };
    }) => void): void;

    interface InputApi {
        /**
         * Режим курсора: 'ui' (виден и кликабелен) или 'game' (скрыт, для FPS).
         */
        setCursorMode(mode: 'ui' | 'game'): void;
    }
    const input: InputApi;
}
