/**
 * Утилиты: логирование, математика, broadcast, require.
 */
declare namespace game {
    /**
     * Вывести значения в Консоль скриптов (аналог console.log).
     * @example
     * game.log('игрок:', game.player.position);
     */
    function log(...args: any[]): void;

    /** Предупреждение (жёлтое в консоли). */
    function warn(...args: any[]): void;

    /** Ошибка (красное в консоли). */
    function error(...args: any[]): void;

    /**
     * Случайное число.
     * - random() — 0..1
     * - random(max) — 0..max
     * - random(min, max) — min..max
     * - random(min, max, true) — целое min..max включительно
     * @example
     * const dmg = game.random(10, 20, true); // 10..20 целое
     */
    function random(): number;
    function random(max: number): number;
    function random(min: number, max: number, integer?: boolean): number;

    /** Расстояние между двумя точками или ref'ами. */
    function distance(
        a: game.Vector3 | game.Ref,
        b: game.Vector3 | game.Ref
    ): number;

    /** Зажать значение в диапазоне. */
    function clamp(value: number, min: number, max: number): number;

    /** Линейная интерполяция: lerp(a, b, 0)=a, lerp(a, b, 1)=b. */
    function lerp(a: number, b: number, t: number): number;

    /**
     * Отправить именованное сообщение всем скриптам (включая себя).
     * Для обмена данными между скриптами в разных Worker'ах.
     * @example
     * // в одном скрипте:
     * game.broadcast('checkpoint_reached', { num: 2 });
     * // в другом:
     * game.onMessage('checkpoint_reached', (data) => game.log(data.num));
     */
    function broadcast(name: string, data?: any): void;

    /** Подписаться на broadcast-сообщение. */
    function onMessage(name: string, fn: (data: any) => void): void;

    /**
     * Подключить переиспользуемый код из другого скрипта (ModuleScript).
     * В целевом скрипте экспорт через `exports.foo = ...`.
     * @example
     * // в скрипте 'utils':
     * exports.greet = (name) => game.ui.showText('Привет, ' + name);
     * // в обычном скрипте:
     * const utils = game.require('utils');
     * utils.greet('Стив');
     */
    function require(scriptName: string): Record<string, any>;

    interface AppApi {
        /** Перейти в другую игру на платформе. */
        navigate(gameId: number | string): void;
    }
    const app: AppApi;
}

/**
 * Глобальный объект exports — для скриптов-модулей (ModuleScript).
 * Любые поля, присвоенные exports, видны при game.require() из другого скрипта.
 */
declare const exports: Record<string, any>;
