/**
 * FX, теги, constraints, камера, кат-сцены.
 */
declare namespace game {
    interface FxApi {
        /** Beam — линия-молния между двумя точками или объектами. */
        beam(from: game.Vector3 | game.Ref, to: game.Vector3 | game.Ref, opts?: {
            color?: game.Color; width?: number; duration?: number;
        }): string;

        /** Trail — след за движущимся объектом. */
        trail(ref: game.Ref, opts?: {
            color?: game.Color; length?: number; lifetime?: number;
        }): string;

        /** Остановить FX по handle. */
        stop(handle: string): void;
    }
    const fx: FxApi;

    /** Теги — группировка объектов для массовых операций. */
    namespace tags {
        function add(ref: game.Ref, tag: string): void;
        function untag(ref: game.Ref, tag: string): void;
        function hasTag(ref: game.Ref, tag: string): boolean;
        function getTagged(tag: string): game.Ref[];
    }

    /**
     * Constraints — связи между объектами (Фаза 5).
     * Сейчас кинематические; в Фазе 6.5 станут физическими.
     */
    interface ConstraintsApi {
        /**
         * Phase 6.5: настоящая физ-петля Rapier между двумя rigid bodies.
         * Оба тела должны быть в Rapier-режиме (physics.setBodyType).
         */
        physicsHinge(refA: game.Ref, refB: game.Ref, opts?: {
            anchorA?: game.Vector3;
            anchorB?: game.Vector3;
            axis?: game.Vector3;
        }): { ref: string; remove(): void };

        /** Phase 6.5: жёсткая дистанция между rigid bodies (верёвка). */
        physicsDistance(refA: game.Ref, refB: game.Ref, opts?: {
            anchorA?: game.Vector3;
            anchorB?: game.Vector3;
        }): { ref: string; remove(): void };

        /** Жёсткая склейка двух объектов. */
        weld(a: game.Ref, b: game.Ref): string;
        /** Шарнир (петля) — A может вращаться вокруг оси относительно B. */
        hinge(a: game.Ref, b: game.Ref, opts?: {
            axis?: game.Vector3; limits?: { min: number; max: number };
        }): string;
        /** Пружина. */
        spring(a: game.Ref, b: game.Ref, opts?: {
            stiffness?: number; damping?: number; restLength?: number;
        }): string;
        /** Удалить constraint. */
        remove(handle: string): void;
    }
    const constraints: ConstraintsApi;

    /**
     * Камера в Play.
     */
    interface CameraApi {
        /** FOV в градусах (по умолчанию 60). */
        setFov(fov: number): void;
        /** Привязать камеру к объекту. */
        focusOn(ref: game.Ref, opts?: { offset?: game.Vector3; smooth?: number }): void;
        /** Кат-сцена — облёт камеры по точкам. onDone — game.onCutsceneDone. */
        cutscene(points: Array<game.Vector3 & { look?: game.Vector3; duration?: number }>): void;
        /** Сбросить камеру на игрока. */
        reset(): void;
        /** Тряска камеры на N секунд. */
        shake(strength: number, seconds: number): void;
    }
    const camera: CameraApi;

    /** Кат-сцена завершилась. */
    function onCutsceneDone(fn: () => void): void;

    /** Победа команды (мультиплеер). */
    function onTeamWin(teamName: string, fn: () => void): void;
}
