/**
 * Таймеры и плавные переходы (твининг). Главная фича Фазы 1.
 */
declare namespace game {
    /**
     * Выполнить fn один раз через `seconds` секунд.
     * @returns id — отменяется через game.cancel(id).
     * @example
     * game.after(3, () => game.ui.showText('Прошло 3 секунды'));
     */
    function after(seconds: number, fn: () => void): number;

    /**
     * Повторять fn каждые `seconds` секунд.
     * @returns id — остановить через game.cancel(id).
     * @example
     * const tickerId = game.every(1, () => game.log('тик'));
     * game.after(10, () => game.cancel(tickerId));
     */
    function every(seconds: number, fn: () => void): number;

    /** Отменить отложенный after/every по id. */
    function cancel(id: number): void;

    /**
     * Плавный переход свойств объекта или GUI.
     * @param ref ref 3D-объекта или id GUI-элемента.
     * @param props что менять: { x, y, z, rotationY, sx, sy, sz, color, opacity }.
     * @param opts длительность, easing, повторы.
     * @returns tweenId — можно отменить через game.cancelTween(id).
     * @example
     * // плавное открытие двери:
     * game.tween(door, { rotationY: Math.PI / 2 }, {
     *     duration: 1, easing: 'ease',
     * });
     * // пульсирующая монета:
     * game.tween(coin, { sx: 1.3, sy: 1.3, sz: 1.3 }, {
     *     duration: 0.5, easing: 'ease', repeat: -1, yoyo: true,
     * });
     */
    function tween(
        ref: game.Ref | string,
        props: {
            x?: number; y?: number; z?: number;
            rotationX?: number; rotationY?: number; rotationZ?: number;
            sx?: number; sy?: number; sz?: number;
            color?: game.Color;
            opacity?: number;
        },
        opts: {
            duration: number;
            easing?: game.Easing;
            delay?: number;
            repeat?: number; // -1 = бесконечно
            yoyo?: boolean;
            onDone?: () => void;
        }
    ): number;

    /** Отменить активный твин по id. */
    function cancelTween(id: number): void;
}
