FOnline Engine
Current 2026.1.58-dev GitHub
Документация Docs/ru/reference/changelog.md

История изменений движка

Здесь ведутся значимые для разработчиков изменения FOnline и заметки о миграции на русском и английском. Текущую версию разработки задаёт VERSION. Правила версий и выпусков определяют CalVer, даты выпусков, неизменяемые теги и границы совместимости.

Unreleased

Current - 2026-10-23

Изменено

  • Накопление дельт, проекция цикла, перенос фазы, выбор кадра и визуальная компенсация выделены в AnimationMovement. CritterHexView сохраняет состояние движения и привязки; арифметика, жизненный цикл, скриптовые API и форматы ресурсов прежние.

  • Обычные смещения спрайтов хранятся в SpriteSheet::_sprOffset, покадровые дельты визуального переноса — в _sprMotion. SetFrame(offset, motion) записывает соответствующие поля; нативный GetSprOffset(frame) читает обычное смещение, а GetSprMotion() заменяет прежний span дельт GetSprOffset(). CritterHexView вычисляет накопленный перенос, компенсацию и фазу цикла по дельтам motion. Общие GetSpriteFrameOffset/GetSpriteFrameMotion и явные массивы offsets,motions предоставляют эти значения игровым скриптам.

  • Абсолютные смещения кадров хранятся в SpriteSheet; используются исходные общие спрайты атласа без отдельной обёртки AtlasSprite для каждого смещения. Перемещения кадров, позиция света и логические опоры остаются независимыми.

  • Перенести загрузку спрайтов, фабрики, кеши шаблонов/ошибок и инвалидацию в ResourceManager. Оставить SpriteManager отрисовку; выделить CritterFramesCache и модели превью Mapper. Сохранить независимое воспроизведение, повторные попытки, очистку и скриптовый API.

  • Удалены настройки движка View.GlobalDayColorTime и View.GlobalDayColor: кривые суток принадлежат коду/контенту проекта, вычисленные цвета передаются через Map.SetDayColors.

  • Перенести в проекты выбор воспроизведения и движения анимаций, позы превью, препятствия для пути, плоскую отрисовку персонажей, исторические игровые сообщения и тематические ресурсы/defaults. Native идентификаторы анимаций непрозрачны; параметры контекста/воспроизведения задаются явно. Android сохраняет значок платформы, если проект не указал свой.

  • Перенесены из ResourceManager в скрипты проекта правила имён Fallout, опорных смещений, выбора кадров и склейки. Два специализированных события заменены на OnCritterAnimationSprite и общие операции чтения/создания 2D-спрайтов. Копии источников и кеш handle разделены по атласам.

Исправлено

  • Не отдавать квант планировщику в последнем коротком интервале precise_sleep: другой готовый поток мог задержать возврат на целый квант. Существующие пороги тестов сна сохранены; вытеснение потока ОС всё равно может задержать ожидание.

  • WebSocket-регрессия завершения соединения ожидает callback победившего вызова Disconnect перед проверкой счётчика. Конкурирующие вызовы могут завершиться, пока IO-поток ещё сообщает об отключении; тест по-прежнему требует ровно один callback до и после остановки endpoint. Сетевой код не изменён.

  • Тест вложенной синхронизации ограничивает время отсутствия прогресса и общую длительность, удерживая криттеров до завершения обоих потоков даже при остановке сервера по таймауту. Медленное продвижение больше не считается взаимоблокировкой; реализация синхронизации движка не менялась.

  • Handle спрайта удаляется из активных до остановки ресурса, поэтому исключение Stop не оставляет его действительным. Прямой вызов сохраняет исключение остановки; cleanup резолвера диагностирует его, сохраняя результат резолвера либо исходное исключение.

  • Правки свойств в Mapper применяются через нативные setter и post-setter после проверки всех затронутых предметов. Состояние изменений и история отмены остаются у редактируемой карты, если обработчик переключает карты, выгружает карту или удаляет другой затронутый предмет.

  • Ключ кеша кадров персонажей теперь хранит полный кортеж модели, состояния и действия со штатным хешером; подстановка анимации не меняет ключ исходного запроса. При повторном входе в разрешение анимации возвращается уже вставленная запись кеша, включая сохранённое отсутствие анимации.

  • Область ABI для возврата значений AngelScript сохраняется при исключении нативного вызова; явно освобождаются только принадлежащие вызову результаты-handle.

Миграция

  • Маркер runtime повышен с upstream 0.0.75 до 0.0.76 для переноса игровой политики и API в проект. Клиенты, сервер, metadata и ресурсы пересобираются и устанавливаются согласованным набором; смешанные артефакты должны отклоняться проверкой совместимости. Ниже сохранены миграции upstream 36–57, включая проверку свойств динамических предметов на картах и актуальные контракты файловой системы/сохранения данных.

  • База aafc7fe74bb8fa35e6395e04d8c6d2a66a91831a (2026.1.57-dev), цель 2026.1.58-dev. Полная миграция скриптовых анимаций описывает обе удалённые сигнатуры событий, замену нативного resolver, оба backend, владение, массивы, смещения, единицы длительности, поиск, сборку/bake и откат. Runtime 0.0.76, контейнер sprite v2 и Managed ABI 9 прежние. Преобразование сохранений не нужно; смыслы enum остаются игровыми и не меняются.

2026.1.57-dev - 2026-10-20

Документация

  • Нормализованы нативные комментарии и проверки документации резервирования JSON/SQLite; описана грамматика пути и объединены заметки ClassExtension.

Миграция

  • База 6c88391e77d519885d54f8894d0781a7d0a14ee6 (2026.1.56-dev) → 2026.1.57-dev. Существующие API, конфигурация, форматы данных/ресурсов и значения не меняются; сетевой маркер 0.0.75, Managed ABI 9. Преобразование не требуется. Перегенерируйте и проверьте документацию, пересоберите согласованные нативные метаданные/приложения и перепеките ресурсы. Откат возвращает предыдущие согласованные артефакты.

2026.1.56-dev - 2026-10-20

Добавлено

  • fs::write_file_durable_new эксклюзивно записывает новый файл с flush descriptor через существующие native path и stream primitives. Существующие имена сохраняются; атомарная публикация через stage остаётся контрактом fs::write_file/fs::replace_file.
  • DataBase::TryInsert и типизированный CompareExchange действуют внутри одного экземпляра, видят pending-очередь и сериализуются с обычными мутациями, восстановлением snapshot и очисткой очереди. Game.DbTryInsertRecord и Game.DbCompareExchangeRecordString доступны с целочисленными и строковыми ключами в обоих скриптовых backend.

Удалено

  • Удалена неиспользуемая заготовка ClassExtensionAttribute. Она не связывала глобальную функцию с методом класса; в C# используются языковые extension methods, соответствующий тег AngelScript не планируется.

Исправлено

  • Отвергать встроенный NUL на всех границах файловых путей и неверный UTF-8 до native conversion на каждой платформе. Использовать общую проверку UTF-8 code points за один проход вместе с проверкой NUL, сохраняя запрет маркера ошибки U+FFFD и отвергая суррогатные кодировки; проверять также результат native-to-string. Учитывать ошибки I/O conversion и сохранять буквальные обратные слеши POSIX. Согласовать noexcept всех файловых операций с результатом, локально обрабатывая ошибки native conversion, создания/чтения собственного потока и итераторов. Неожиданные C++-исключения на внутренних границах STL возвращают результат отказа операции. Преобразования путей, standard-stream interop, чужие stream/visitor могут бросать; partial listing и hash до EOF сохраняются.
  • Standalone archive-проба LibreSSL использует lean Windows headers, чтобы макросы WinCrypt не конфликтовали с X509 declarations; проверки AES, TLS, X509 и SRTP сохраняются при включённом и выключенном assembly.
  • Поколения активных чтений БД не дают конкурентному читателю скрыть завершённый commit от более раннего чтения и допустить условную мутацию по устаревшему значению.
  • JSON/SQLite сохраняют внутренние пробелы в каталоге хранилища, разбирая весь остаток после имени провайдера с удалением внешних пробелов, в том числе при внешних пробелах строки подключения.

Миграция

  • База 8af9a71307196a1937c79389e83036d2face5ceb (2026.1.55-dev); обновление 2026.1.56-dev. Существующие файловые helpers, обычные методы БД и допустимые строки подключения сохраняют смысл. Создание нового файла показывает имя во время записи и синхронизирует только содержимое; если читателям нужна готовая публикация, используйте приватный stage и атомарную замену. Успех условной операции ставит мутацию в очередь одного владеющего экземпляра; это не durable commit, межпроцессная транзакция или native backend CAS.
  • Пересоберите native-потребителей/Baker и выпеките все скриптовые роли для согласования generated API/метаданных и assemblies. Потребители могут явно применять два новых метода; переименование существующих вызовов и автоматическое включение игровой функции не требуются. Для внутренних пробелов пути JSON/SQLite escaping не нужен; снятие буквальных кавычек не входит в грамматику подключения. Токены Memory/Mongo и диагностика отключённых провайдеров прежние.
  • Преобразований entity/property, JSON/CBOR/BSON/oplog, snapshot, baked-resource или wire format нет. Ручной runtime marker меняется с 0.0.74 на 0.0.75; Managed ABI 9 прежний; пересоздайте производные API/compatibility-метаданные и выкатывайте согласованные binaries/resources. Откат использует соответствующие прежние build/resources без преобразования данных. Проверьте native contention/pending/restore barriers, обе привязки, повторное открытие local providers с пробелами, файловые успехи и отказы на каждой заявленной платформе.
  • Передавайте в filesystem полные пути без NUL в корректном UTF-8 на каждой платформе. Не-UTF-8 POSIX-имена больше не поддерживаются fs. Чистые преобразования теперь отвергают неверный путь через filesystem_error; результатные примитивы отказывают без обращения к префиксу. Пересоберите native consumers из-за exception specifications read/write/hash/comparison/listing. Операции с результатом теперь передают стандартные interop errors результатом отказа; чрезмерный размер полного чтения отвергается до выделения буфера. Engine terminate-on-OOM policy прежняя. Исключения visitor и потока вызывающего кода продолжают передаваться; корректные пути, пустые пути и гарантии публикации/durability сохраняются.

  • Удалите [ClassExtension]; используйте стандартные extension methods C# и пересоберите скрипты с текущими CoreScripts. Компилятор отвергает удалённый атрибут. Немаркированные вспомогательные методы, атрибуты точек входа, биндинги, форматы данных/ресурсов, сетевой формат и ABI 9 не меняются. Преобразование или дополнительное повышение маркера совместимости не требуются. Откат возвращает предыдущие согласованные CoreScripts/сборки.

2026.1.55-dev - 2026-10-20

Изменено

  • Mapper и MapBaker отклоняют локальные несинхронизируемые переопределения Common или Client у динамических предметов, включая неизменяемые игровые свойства без Persistent. Проверяются серверный и клиентский наборы свойств, в том числе у скрытых предметов. Серверные свойства и контекст размещения разрешены; постоянная геометрия задаётся прототипом. Автоматическое слияние mesh действует только для статических предметов.
  • Изменение NoBlock, ShootThru и LightThru пересчитывает все зарегистрированные клетки клиентского контура предмета.
  • Автономная регрессионная проба LibreSSL выбирает облегчённые Windows-заголовки до заголовков OpenSSL; проверки OtherName, IP/mask и SRTP сохранены.

Миграция

  • База d947827d42ab7a8a6c5f0c168cdea5680423ddf9 (2026.1.54-dev); результат 2026.1.55-dev. Сетевая совместимость остаётся 0.0.74; новых флагов свойств и сетевой раскладки нет.
  • Перенесите отличающиеся несинхронизируемые значения Common или Client динамических размещений в прототипы или наследуемые варианты; для необходимых изменений во время игры используйте существующий канал синхронизации. Пересоберите затронутые нативные цели и ресурсы. Явные ноль, false и пустое значение считаются переопределениями. Статические размещения, серверные поля, имена, типы, умолчания и признаки сохранения не меняют смысла. Существующие сохранённые миры требуют штатного проектного разбора обновления контента; миграция исходника карты не является миграцией БД. Откат возвращает согласованные базовые бинарники и авторские ресурсы.

2026.1.54-dev - 2026-10-19

Исправлено

  • Сериализовано изменение состояния закрытия WebSocket с I/O-циклом backend. Disconnect и уничтожение обёртки ставят close в очередь, захватывая только слабую ссылку: прямой close() из потока движка больше не гоняется с завершением websocketpp. Native-проверка покрывает обрыв peer, повторный disconnect, однократное уведомление и обёртку, пережившую уничтожение listener.
  • Восстановлена полная доставка AI-документации после превышения корпусом предела размера. Бюджетом владеет манифест; описание маршрута и тесты репозитория больше не дублируют его текущее значение. Состав документов, детерминированный UTF-8/LF и отказ при переполнении не меняются.
  • При ошибке упаковки удаляется ZIP текущей target, включая нехватку места при записи ZIP и последующую ошибку установщика. Ошибка удаления выводится в журнал, не подменяя исходное исключение упаковки; поведение общего архива для строк только с SingleZip не меняется.
  • В X509- и SRTP-парсерах встроенного LibreSSL сохраняется const у результатов поиска в строке. Парсер IP-ограничений использует отдельный изменяемый указатель для собственной копии. Устранены предупреждения текущих host headers без приведений, подавления диагностики и изменений crypto/API; нативные пробы проверяют OtherName, IP/mask, SRTP, AES и TLS с ASM и без него.

Миграция

  • База d74075954cbf3742f0f717ff2b23ff309aa735a4 (2026.1.53-dev); обновление 2026.1.54-dev. Перегенерируйте затронутые API-модели и справочники через python BuildTools/docs_api.py --write, python BuildTools/docs_reference.py --write и python BuildTools/docs_public_api.py --write, затем запустите python BuildTools/docs_prepare.py, проверьте через python BuildTools/docs_validate.py, затем соберите сайт через python BuildTools/docs_site_build.py. Бюджет доставки берётся из ai_delivery.full_context.max_bytes в Docs/documentation-manifest.json. BuildTools/tests/test_docs_ai_delivery.py сохраняет независимые проверки переполнения и детерминизма байтов; усекать документы или отключать ограничение нельзя. Файлы доставки остаются игнорируемыми результатами сборки и не требуют дополнительного коммита.
  • Центральный маркер сетевой совместимости повышается с 0.0.73 до 0.0.74 для исправления WebSocket lifecycle. Перегенерируйте метаданные, пересоберите согласованные нативные клиент/сервер, Baker и тесты и перевыпеките scripts/resources; развёртывайте этот согласованный набор вместе. Проверка совместимости должна отклонять смешанные старые/новые артефакты. Нативные/script API, конфигурация, сохранения, схема ресурсов и Managed ABI 9 сохраняют прежний смысл; конверсия сохранений не нужна. Python-правка упаковки действует при следующем запуске; повторяйте его после устранения причины ошибки хранилища или установщика. Откат возвращает весь прежний согласованный набор артефактов, политику доставки и сохранение ZIP после ошибки без конверсии данных.

2026.1.53-dev - 2026-10-19

Исправлено

  • Сохраняются постоянные деревья custom entities при штатной остановке сервера. Runtime teardown освобождает внутренние ссылки singleton и зарегистрированных держателей до сброса родителей и владения реестра; обычное удаление custom entity не вызывается, сохранённые ID держателей не изменяются.

Документация

  • Уточнены компоненты свойств Critter, Location и других владельцев: bool-маркеры, поля с точкой, отключение наследования, Managed Has и миграция сохраняемых имён.

Миграция

  • База 2860bb2755621976d199883e254d66808a659ec1 (2026.1.52-dev) → рабочая правка 2026.1.53-dev. Затронут путь ServerEngine::Shutdown → EntityManager::DestroyAllEntities, общий для скриптовых backend и провайдеров БД. Обычный игровой DestroyCustomEntity по-прежнему удаляет явно уничтоженную сущность и её детей.
  • Callable API, настройки, свойства, идентичности, формат хранения, маркер сетевой совместимости (0.0.73) и Managed ABI (9) прежние; преобразование проектного кода или данных не требуется. Постоянные ID держателей и документы детей должны переживать остановку процесса. После смены версии/ревизии переконфигурируйте и пересоберите затронутые native-роли сервера/тестов, обновите метаданные и согласованно перезапеките ресурсы.
  • Ранее удалённые документы нельзя восстановить по оставшимся вторичным индексам. Если данные уже потеряны, восстановите проверенную резервную копию по процедуре владеющего проекта; не удаляйте индексы, чтобы скрыть отсутствующие сущности. Откат требует согласованных бинарников/ресурсов и проверенной копии; предыдущая сборка сохраняет дефект удаления при остановке.
  • Владелец приёмки: ServerShutdownPreservesPersistentCustomEntityTreesAcrossRestarts в Source/Tests/Test_ServerEngine.cpp. Он должен сохранять точные ID, дерево держателей и контрольные значения через две штатные перезагрузки на реальном JSON-хранилище, включая custom child постоянного NPC. Подключающие проекты также проверяют используемый backend и вход аккаунта на изолированной базе.

2026.1.52-dev - 2026-10-18

Добавлено

  • Серверное readonly-свойство Critter.MapTransfersLocked доступно в обоих скриптовых backend. Оно читает существующий native-счётчик вложенных блокировок под покрытием криттера, позволяя отложить перенос до вызова native-защиты. Хранимого свойства или новой блокировки нет; native-защита сохраняет окончательное решение.

Миграция

  • База 219fbd7568f2388f4a3b47e5a22fb38b8e259a0d (2026.1.51-dev); обновление 2026.1.52-dev. Пересоберите нативных потребителей и заново выпеките скрипты/ресурсы вместе для регенерации метаданных и Managed-привязок методов. Существующие скриптовые вызовы и значения входов сохраняют смысл; сохранённые данные, форматы ресурсов, версия миграции сети 0.0.73 и Managed ABI 9 не изменены. Конверсия сохранённых данных не требуется. Новый экспорт изменяет генерируемые отпечатки клиент/серверной совместимости и Managed-манифеста методов при неизменных версиях их схем. Пересобирайте и развёртывайте согласованные серверные и клиентские бинарники с заново выпеченными скриптами; не смешивайте артефакты базы и обновления. Rollback возвращает согласованные артефакты базы без конверсии данных.
  • Читайте свойство под покрытием живого криттера непосредственно перед переносом, без yield или освобождения покрытия между проверкой и вызовом. Истинное значение временно: перед ожиданием освободите покрытие, после его повторного получения заново проверьте операцию. Getter не резервирует будущий перенос. Проверьте вложенные блокировки через EntityManagerCppApi/MapTransfersLockedExportObservesNestedLocks и продолжение переноса в embedding-проекте.
  • Увеличить проверяемую ёмкость полного контекста документации на 16 КиБ, до 2 342 912 байт, чтобы сохранить полные накопленные примечания миграции. При превышении лимита генератор по-прежнему завершается ошибкой; эта правка ёмкости не усекает и не исключает документы. Runtime и сохранённые данные не затронуты.

2026.1.51-dev - 2026-10-18

Исправлено

  • Документы постоянных NPC и их инвентаря сохраняются при выгрузке криттера и очистке после ошибки восстановления. Явное уничтожение NPC по-прежнему удаляет его документы; принадлежность персонажа игроку больше не определяет удаление документа при снятии регистрации.
  • Нативные регрессии проверяют выгрузку/загрузку постоянного NPC, принадлежность предметов инвентаря, окончательное уничтожение и восстановление после отсутствующего документа предмета.

Миграция

  • База 1f2f8e4e55b51899ba07ad83f9e05287d365a78f (2026.1.50-dev); обновление 2026.1.51-dev. Внутренняя нативная декларация в Source/Server/EntityManager.h меняется с UnregisterCritter(ptr<Critter> cr) на UnregisterCritter(ptr<Critter> cr, bool delete_from_db). Найдите собственные нативные вызовы через rg -n 'UnregisterCritter\(' Source <native-extension-directory>: замените UnregisterCritter(cr) на UnregisterCritter(cr, false) для выгрузки/очистки после ошибки загрузки либо на UnregisterCritter(cr, true) только для окончательного уничтожения NPC. Прежний вызов с одним аргументом не компилируется; аргумента по умолчанию и совместимой перегрузки нет. Сохраните ограничение уничтожения только NPC и порядок очистки инвентаря. Смысл script API и незатронутых нативных вызовов прежний.
  • Повторите конфигурацию и сборку нативного сервера и тестов; обновите метаданные ревизии обычным согласованным процессом Baker/ресурсов. Запустите ServerUnloadLoadKeepsPersistentNpcAndItemRecordsUntilDestroy и ServerFailedNpcLoadKeepsRecoverableRecords, проверяя зафиксированные документы криттера/предметов до выгрузки, после неё, после загрузки и после окончательного уничтожения. NPC уже должен быть явно постоянным; следование за игроком не переводит временную сущность в постоянную. Свойства, конфигурация, авторский контент, формат БД, схема ресурсов, Managed ABI 9 и runtime compatibility 0.0.73 не меняются. Прежние ID, принадлежность предметов и смысл временных сущностей сохраняются; конверсия сохранений не требуется, ранее удалённые документы исправление не восстанавливает.
  • Развёртывайте согласованные пересобранные артефакты. Откат возвращает прежние бинарники/ресурсы без конверсии данных и возвращает дефект удаления документов NPC. Прежняя runtime-приёмка не подтверждает более новую базу Engine; этот локальный перенос истории не означает новую сборку, игровую квалификацию или публикацию.

2026.1.50-dev - 2026-10-18

Исправлено

  • ACM-потоки с нулевым заявленным числом сэмплов отклоняются до декодирования или записи выпеченного результата. Пути эффектов и музыки сохраняют ошибку с именем файла; регрессии загрузчика и Baker проверяют весь пакет и выбранный файл без создания результата для отвергнутого источника.

Миграция

  • База 370b268aa01099e731a2d93a8ae65222eb06c816 (2026.1.49-dev); обновление 2026.1.50-dev. Пересоберите Baker с поддержкой ACM и нативные тесты, выполните AudioBaker и AudioBakerAcm; исправьте источник, отклонённый с ACM stream declares no samples, и повторно запеките затронутый ACM. У корректных непустых потоков сохраняются смысл сэмплов, частоты, выбора каналов по пути и дополнения усечённого тела нулевыми битами. Миграция скриптов, настроек, прототипов, сохранённых данных и схемы ресурсов не нужна. Сетевая совместимость 0.0.73, Managed ABI 9 и границы updater не меняются; новых ограничений смешанных версий и порядка выкатки нет. Откат возвращает соответствующие прежние бинарники/ресурсы без преобразования данных и восстанавливает принятие некорректного пустого потока. Эти инструкции не утверждают, что нативная/runtime-приёмка уже выполнена.

2026.1.49-dev - 2026-10-17

Исправлено

  • Windows console Ctrl+C и Ctrl+Break после инициализации frontend запрашивают обычный выход приложения. Handler только устанавливает общий для процесса атомарный флаг; закрытие консоли, выход из системы, остановка ОС и принудительное завершение сохраняют прежнее поведение.
  • Закреплён существующий read-only контракт startup Common.UserWritablePath: непустое присваивание из config отклоняется до подстановок и append-разбора, а пустое сгенерированное присваивание не сбрасывает разрешённый root.

Миграция

  • База c7a19d2c833c3b16c741fb02cf170c14e5c251c5 (2026.1.48-dev); обновление 2026.1.49-dev. Найдите авторские входы командой rg -n 'Common\.UserWritablePath\s*=' --glob '*.fomain*' --glob '*.cfg'. Удалите каждое непустое присваивание из main/sub-configs, записей local-config cache и исходников упакованного internal config; передавайте --Common.UserWritablePath <path> при запуске процесса. Непустое присваивание теперь вызывает SettingsException: Writable root is resolved before settings при runtime или baking. Просматривайте local cache через владеющий им инструмент конфигурации; непрозрачный cache-файл не является текстовым config. Пустые сгенерированные присваивания остаются допустимыми no-op. Приоритет CLI, *, выбор через installer marker и portable-поведение с пустым root не меняются.
  • Пересоберите нативные приложения и Baker, затем выполните обычную выпечку для обновления метаданных ревизии и проверки упакованных configs. Проверьте разрешение CLI, пустые значения config, отказ main/sub/local-присваиваний и обычный shutdown после обоих console events в отдельном дочернем процессе/консоли. Windows service control и POSIX signals прежние; GUI-приложение без консоли использует обычное действие выхода. Изменений script API, persisted data, map/resource schema, network compatibility marker, runtime 0.0.73 и Managed ABI 9 не требуется. Откат — согласованные binaries/resources без преобразования сохранений.
  • Обработка Windows console Ctrl+C и Ctrl+Break устанавливается безусловно после инициализации frontend. Handler только устанавливает флаг выхода; каждое приложение выбирает безопасные точки выхода, обслуживая IsQuitRequested(). Собственные native-циклы, которым нужен кооперативный ранний выход, должны опрашивать IsQuitRequested(). Batch-инструменты и тесты, не наблюдающие выход, могут завершить текущую работу (без гарантии немедленной отмены). POSIX signal setup и Windows service control не меняются. Subprocess-матрица проверяет оба Windows events для application-loop quit и deferred observation.

2026.1.48-dev - 2026-10-17

Исправлено

  • Первая альфа-маска 3D-спрайта подготавливается при обновлении спрайта до первого наведения или клика. Picking только читает готовую маску и запрашивает обновление; render update запускает последующие копии по запросу не чаще раза в 100 мс и каждый кадр опрашивает готовность незавершённого чтения. Это предотвращает выбор фонового предмета при холодной первой маске и поддерживает актуальность силуэта под курсором без копирования каждый кадр.
  • Сгенерированная запись версии миграции API и справочники согласованы с опубликованным исходником 2026.1.47-dev: Source/Common/Common.h уже объявляет Version 0 0 73, а производная модель ещё содержала 72. Исправление документации не вводит дополнительного изменения совместимости runtime.

Миграция

  • База 617a0d6f1af16a6bcf3da951e5299ddf31c26158 (2026.1.47-dev); обновление 2026.1.48-dev. Пересоберите нативных потребителей клиента/Mapper и тесты; выполните обычную выпечку проекта для обновления метаданных ревизии. Миграция скриптов, настроек, прототипов, выпеченных форматов и сохранённых данных не нужна: точный выбор по альфе и смысл всех прежних входных значений сохраняются. Сетевая совместимость 0.0.73 и Managed ABI 9 не меняются; новых ограничений смешанных версий и порядка выкатки нет. Откат возвращает базовые нативные бинарники без преобразования данных.
  • Проверьте ModelSpritePreparesItsHitMaskDuringRenderUpdate, ModelSpriteHitMaskThrottlesRequestedCopiesButPollsPendingPixels, проверки повторов/перерисовок и первые клики с предварительным наведением и без него в отрисованном клиенте. Ограничьте срок кэша сущности под курсором встраивающей игры, чтобы найденный фоновый предмет не скрывал уже готовую маску. Появление окна взаимодействия проверяйте отдельно от отправки команды. Picking не добавляет выбор по прямоугольнику и ожидание GPU; асинхронный опрос готовности не зависит от интервала копирования 100 мс.

2026.1.47-dev - 2026-10-17

Исправлено

  • Измерение ParseLargeConfig вынесено из функционального ConfigFile в явно выбираемый кейс ConfigFilePerformance ([!benchmark][config]) по соглашению скрытых измерений TextureAtlasLayoutPerformance и PropertiesPerformance. Обычный функциональный запуск больше не повторяет его на каждом из 29 путей SECTION; ConfigFilePerformance сохраняет прежнее измерение ParseLargeConfig на входе 128x12. Ускорение всего CI не измерялось и не заявляется.
  • Незавершённый запрос clear для work_thread подтверждается worker’ом до осмотра очереди, dispatch или wait. Очередь jobs очищается, и clear() возвращается при любой форме очереди, включая пустую и содержащую только future-dated jobs, и через pause/resume; запрос, попавший вокруг раннего уведомления о подтверждении, больше не оставляет clear() спящим на done signal worker’а.

Миграция

  • База d498fcf07d1425cf31e71b060fe8aeae87aeb37d (2026.1.46-dev); следующее обновление 2026.1.47-dev. Пересоберите тестовый исполняемый файл; функциональный фильтр ConfigFile по-прежнему выполняет те же 136 проверок. Для измерения производительности выбирайте ConfigFilePerformance или явный тег benchmark вместо непреднамеренного запуска измерений в ConfigFile. Поведение парсера, API, настройки, скрипты, контент, сохранения, сеть, система обновления, схема ресурсов, Managed ABI 9 и runtime 0.0.73 не изменены; только для этого исправления расписания тестов миграция игры/данных и повторная выпечка не требуются. Откат восстанавливает прежнюю раскладку тестов без преобразования данных. Черновик не означает публикацию.
  • Пересоберите Essentials и нативных потребителей и тесты, которые его линкуют, включая focused-набор WorkThread с новой регрессией живости подтверждения clear. API, настройки, скрипты, контент, сохранения, сеть, система обновления, схема ресурсов, Managed ABI 9 и runtime 0.0.73 не изменены; конверсия данных и миграция формата ресурсов не требуются. Embedding-проекты выполняют обычное обновление revision-metadata и квалификацию bake для этой ревизии Engine: авторский контент не меняется, поэтому квалификация остаётся обычным проверочным шагом, а не миграцией формата. Rollback восстанавливает согласованные предыдущие артефакты без конверсии данных и возвращает дефект подтверждения clear. Черновик не означает публикацию или квалификацию выпуска.

2026.1.46-dev - 2026-10-17

Исправлено

  • Вложенный доступ к настройкам Managed и AngelScript использует общий разбор канонических путей. Полные runtime-ключи сохраняются; built-in настройки остаются read-only, Managed properties — get-only, а custom настройки AngelScript сохраняют setters.
  • Пути групп AngelScript с подчёркиваниями различаются; конфликты property/group отклоняются до использования скриптом. Общий парсер отвергает пустые сегменты; Managed дополнительно проверяет коллизии экранированных C#-имён.
  • Пути environment FO_DOTNET_DIR нормализуются только на Windows, сохраняя символы POSIX-пути и производные каталоги runtime, payload и stamp.
  • Стадия полной записи строится от нативного родителя файлового пути, сохраняя буквальные ведущие пробелы, POSIX backslash и платформенное толкование пути. Обрезание пробелов и нормализация ресурсных разделителей больше не меняют дисковые имена.
  • После успешной публикации cleanup освобождает владение именем стадии: завершившийся писатель не удаляет файл следующего писателя, занявшего то же имя.
  • Добавлены проверки буквальных путей, отказа readonly cache/bootstrap, CRT readers без delete sharing и безопасности загруженных библиотек. Уточнена граница Windows: успешная замена атомарна, но открытый поток или образ может отклонить публикацию без изменения назначения.

Миграция

  • a627da59d2b408e4b618b125bcd7766879c03d41 (2026.1.45-dev) → 2026.1.46-dev: Domain.Name сохраняет Settings.Domain.Name; Android.GradleDependency.Sample теперь порождает вложенный доступ Managed; AngelScript сохраняет вложенный доступ с однозначными типами групп. SettingsPath.A_B.Value и SettingsPath.A.B.Value различаются. Пустые сегменты дают Setting path (Managed baker оборачивает её в Managed setting); исправьте авторский ключ. Конфликты namespace/property после экранирования C# также дают Managed setting. Смысл прежних корректных группированных путей сохраняется; AngelScript по-прежнему принимает корректные негруппированные custom настройки. Одинаковые канонические ключи Managed дедуплицируются.
  • Внутренние типы AngelScript GlobalSettingsGroup_* теперь обрамляют сегменты их длинами. Замените явные сгенерированные типы прямым доступом: GlobalSettingsGroup_Android_GradleDependency group = Settings.Android.GradleDependency; string value = group.Sample; заменяется на string value = Settings.Android.GradleDependency.Sample;. Старые явные имена типов дают ошибку компиляции; алиасов нет. Перед пересборкой найдите GlobalSettingsGroup_ в авторских скриптах.
  • Повторите configure; пересоберите native-компоненты и Baker; регенерируйте и скомпилируйте Server/Client/Mapper, включая весь bytecode AngelScript; выполните полный, затем инкрементальный bake. Разворачивайте согласованные sources/assemblies/bytecode/resources; rollback восстанавливает предыдущий комплект. Переименование конфигурации и конверсия сохранений не нужны. Сигнатуры листовых свойств скриптов, ID, смысл значений конфигурации, save/wire форматы, Managed ABI 9 и runtime 0.0.73 сохраняются. См. конфигурацию и источники данных.
  • Native-сигнатуры строковой/байтовой fs::write_file и fs::replace_file сохраняются; переименование вызывающего кода, backend или роли не требуется. Прежнее написание пути сохраняет нативный смысл. Корректный относительный " dir/data.bin" записывается именно в этот каталог; POSIX "/tmp/back\\slash/data.bin" сохраняет буквальный backslash вместо разделителя.
  • Повторите configure/сборку native-ролей и Baker, затем регенерацию и выпечку всех затронутых сторон с согласованной Engine-ревизией. Проверьте DiskFileSystem, DiskFilePrimitives, CacheStorage, ClientRuntimeBootstrap*, NullRenderer, включённый scripting backend и интеграционные bake/runtime. Windows-only тесты не квалифицируют POSIX-исполнение.
  • false по-прежнему означает, что новый файл не опубликован: сохраняйте прежнее значение/selector, при необходимости закрывайте блокирующих читателей либо используйте delete-sharing fs::disk_read_file. Замена native loaded DLL images и CRT streams не обещается на любой Windows/файловой системе. Не добавляйте delete-then-rename или откат, который сам может отказать.
  • Конверсия settings, properties, prototypes, saves, network, updater и resource schema не нужна; runtime 0.0.73, Managed ABI 9, сохраняемые значения и порядок успешного bake прежние. Атомарная видимость не обещает directory durability при отключении питания. Rollback возвращает согласованные бинарники/ресурсы 45-dev без конверсии сохранений и возвращает её отказ на буквальных путях. См. Essentials и baking.

2026.1.45-dev - 2026-10-16

Исправлено

  • Генератор регистрации Managed C# callbacks свойств приведён к объявленному C++-профилю форматирования. Имена callbacks и байты генерируемого C# сохраняются.
  • Null renderer допускает начало scissor за пределами render target, согласуя обрезку частично скрытых панелей GUI с GPU backend. Отрицательные размеры scissor и выход за границы текстуры при чтении/записи остаются ошибками.

  • Из комментариев Windows-замены файлов убраны завершающие точки по правилам авторского текста; нативное поведение прежнее.

Миграция

  • База 5cc571ef888291d132de3fdab30ac0914a10ef48 (2026.1.44-dev); следующее обновление 2026.1.45-dev. Конверсия API, настроек, скриптов, авторского контента, сохранений, runtime 0.0.73 и Managed ABI 9 не требуется.
  • Переконфигурируйте и пересоберите инструменты и headless-приложения для новой версии Engine и исправления Null scissor; проверьте формат, существующую регрессию имён callbacks и NullRenderer. Откат использует согласованные артефакты 44-dev без преобразования сохранений и возвращает более строгую проверку начала scissor в Null. Черновик не означает публикацию или платформенную приёмку.

2026.1.44-dev - 2026-10-16

Исправлено

  • fs::write_file стал единственным атомарным helper полной записи строк и byte spans, включая NUL и пустой ввод. Эксклюзивный соседний временный файл, flush и атомарная замена сохраняют прежнее назначение при ошибке и поддерживают открытые readers/mapped DLLs. disk_write_mode::create_new отвергает существующий путь; алиаса write_file_atomic нет.
  • Общий helper используется для кэша, managed staging, маркеров клиентской сессии/bootstrap, результатов/отчётов/отпечатков Baker, зависимостей частиц, JSON-записей и SQLite restore scratch. Ошибка публикации сохраняет кэш; явное удаление — RemoveEntry. Windows rename names завершаются NUL, а отдельная path probe не зависит от линковки Engine.
  • Согласованы сводные решения по контрактам без удаления прежних записей аудита. Полные руководства и миграции сохранены в проверенном AI-пакете 2 MiB + 224 KiB; manifest, EN/RU-руководства и policy-тесты используют один предел. Обязательные начальные маршруты, состав и отказ при превышении не изменены.

Миграция

  • База: 1d88ee229d2d5208dd6c4c86814e032598a06e4c (2026.1.43-dev). Это единое неопубликованное обновление объединяет локальные исправления атомарной записи и документацию; перед адаптацией примените опубликованные миграции до 43 включительно. Промежуточные локальные версии не являются этапами выпуска.
  • Native-сигнатуры fs::write_file(path, string_view) и byte-span сохранены; запись теперь заменяет готовый файл целиком вместо обрезания назначения. Проверьте права родителя, symlinks, hard links и метаданные назначения. Для streaming/in-place с сохранением идентичности используйте fs::disk_write_file; проверяйте write и flush. WinApi/Posix open_new_write_file добавляет необязательный exclusive=false, сохраняя вызовы с двумя аргументами. Экспериментальные локальные вызовы write_file_atomic замените на write_file; второго helper и совместимого алиаса нет.
  • Повторите configure/сборку Essentials, Common, Client, Server, Tools и Managed; перегенерируйте bindings, references, EN/RU, site/routes и AI, затем запеките ресурсы новым Baker. Проверьте filesystem/cache/database/selector/baking tests, публикацию с открытыми assembly readers и сохранение назначения при ошибке. SetDataChecked == false означает, что новое значение не зафиксировано; SetString журналирует ошибки. Для отката сохраняйте прежний полный пакет.
  • Относительно опубликованной версии 43 нет преобразования managed callers, settings, prototypes, persisted properties, saves, network, updater или resource schema. Смысл JSON keys/content, selector validation, порядка successful markers и unchanged timestamps сохранён. Совместимость остаётся 0.0.73, managed ABI identity — 9, sprite container — v2. Атомарная видимость не обещает directory durability при потере питания. См. Essentials.

2026.1.43-dev - 2026-10-15

Исправлено

  • При отказе направления в согласовании активной/завершённой остановки отправляется авторитетный CritterDir; позиции прежние.

Миграция

  • 54f4e6393c60aad893dbd60b596a9b7c8088ba0c (2026.1.42-dev) → 2026.1.43-dev; совместимость 0.0.72 → 0.0.73. Пересоберите baker/сервер/клиентов/Mapper; обновите метаданные, запеките и выложите серверные/клиентские ресурсы вместе. Формат и смысл пакетов/API, Managed ABI 9, позиции/направления и сохранения прежние; конверсия не нужна. Откат возвращает согласованные исходные binaries/ресурсы.

2026.1.42-dev - 2026-10-15

Исправлено

  • Серверный поиск пути с gag-проверкой отклоняет статические блокировки, в том числе когда на том же гексе стоит динамический gag. Удаление статики в экземпляре карты учитывается; разрешённые маршруты через динамические gag сохраняются.
  • Проверка равной экранной строки исправлена для hex- и square-геометрии.

Изменено

  • Resize разреженной двумерной сетки обходит сохранённые ячейки вместо площади старой и новой карты; сохраняет значения пересечения и удаляет вышедшие за границы ячейки.

Миграция

  • База eedcaa955ff4be79e43384766f7a47cbda0788d1 (2026.1.41-dev); обновление 2026.1.42-dev. Пересоберите нативные потребители и выполните обычную выпечку для обновления метаданных ревизии. Исходники карт, запечённые форматы, скриптовые сигнатуры, конфигурация, сохранённые данные, runtime 0.0.72 и Managed ABI 9 прежние; преобразование данных не требуется.
  • Смысл статической блокировки сохраняется: gag-предикат может разрешить динамический gag, но не обходит целую статическую преграду. Уберите обходные решения, опирающиеся на ошибочно разрешённые пути через стены; при фактическом удалении статического предмета используйте удаление в экземпляре карты. Проверьте заблокированную точную цель, массовую достижимость, динамические gag и переход после удаления. Откат возвращает согласованные бинарники/ресурсы базы без преобразования сохранений.

2026.1.41-dev - 2026-10-15

Исправлено

  • Исправлены ссылки/границы SPARK, C#-стиль/EOF, локальные типы, DB sort/POSIX startup; описан перенос lock.

Миграция

  • c727e6f549fe54095e21dad4c272b99761083e0f (40-dev) → 41-dev. API/конфигурация/данные, ABI 9, runtime 0.0.72 прежние. Пересоберите роли/runtime cache, перезапеките SPARK, обновите docs. Проверьте эти исправления и порядок эффектов. Откат: согласованные бинарники/docs/пакеты базы.

2026.1.40-dev - 2026-10-14

Изменено

  • Подходящие языковые пакеты добавляются до одной стабильной сортировки; ёмкость растёт геометрически, бинарные размеры ограничены. Сортировка выполняется только при успехе; отказ сохраняет исходное исключение и может оставить неотсортированные записи. Успешный повтор восстанавливает порядок.
  • Нативный TextPack::LoadFromBinaryData и его helper добавления принимают const_span<uint8_t>; декодированные строки владеют своей памятью.
  • Текстовые пакеты явно сортируются после успешной загрузки; единственный путь завершения не требует scope guard.
  • Деструктор scope_success стал условно noexcept: исключение callback передаётся вызывающему коду при успешном выходе; при раскрутке стека callback пропускается.
  • Исправлены документация и комментарии экспортов: безындексный GetText уже выбирает случайный вариант с равными вероятностями; выбор по индексу сохраняет порядок загрузки.
  • Разделители Windows-пути из переменной окружения FO_DOTNET_DIR нормализуются перед обработкой CMake; приоритет кэша сохраняется. Проверки каталога сравнивают пути, а codegen fixtures подключают действующие определения helpers.

Миграция

  • База 92ee4cb67d66e586c026e181e576b830deb7112a (2026.1.39-dev); обновление 2026.1.40-dev. Из-за общего заголовка пересоберите все нативные потребители и Baker, обновите метаданные и выпеките ресурсы. Преобразование скриптов, конфигурации, контента или сохранений не нужно; раскладка текста, языковой фильтр, подстановка коллекции и порядок дублей прежние.
  • Неверные размеры вызывают DataReadingException до выделения памяти; отказ загрузки не сортирует и не откатывает, чтение неотсортированного пакета отклоняется. Проверьте исключение/раскрутку/return guard, пакетную эквивалентность, повтор и настроенные языки. Совместимость 0.0.72, Managed ABI 9 и схемы прежние; откат не требует преобразования сохранений.
  • Перекомпилируйте нативные вызовы TextPack::LoadFromBinaryData; аргументы-векторы преобразуются неявно. Обновите явно типизированные указатели на метод под сигнатуру со span. Закодированные байты и скриптовые API прежние.

2026.1.39-dev - 2026-10-14

Исправлено

  • Отбор клиентских предметов карты учитывает переопределения Static и Hidden размещения. Нативная регрессия обоих направлений проверяет точные ID предметов.
  • Полный корпус документации сохранён с проверенной прибавкой лимита на 32 KiB; состав документов и отказ при превышении сохранены.

Миграция

  • База: 48c437b01e85858e7c702c4be834dd647cd180cb (2026.1.38-dev); следующая версия — 2026.1.39-dev. Пересоберите Baker, заново запеките все карты и распространяйте согласованные серверные и клиентские пары. Сохранённые карты загрузят обновлённую статику. Конверсия API, конфигурации, бинарных/сетевых схем, managed ABI и сохранений не нужна; авторский смысл свойств размещения сохраняется. Откат возвращает прежние Baker/карты без конверсии сохранений.

2026.1.38-dev - 2026-10-14

Исправлено

  • Callbacks Managed C# регистрируют канонические имена компонентов (Weapon.UseMode), сохраняя обычные подчёркивания во всех перегрузках getter и setter.

Миграция

  • 4c594d1bef (2026.1.37-dev) → 2026.1.38-dev: пересоберите Baker; перевыпеките server/client/Mapper. Сигнатуры, IDs, сохранения, сетевые форматы, ABI 9 и runtime 0.0.72 неизменны. Выкатывайте согласованные сгенерированные исходники/сборки; откат возвращает прежний Baker/сборки. Миграция исходников/сохранений не нужна.

2026.1.37-dev - 2026-10-14

Изменено

  • Все исходники тестов зарегистрированы безусловно, а guards бэкендов находятся внутри translation units. Native-проверки движка, сущностей, карт, сети и rendering доступны обоим бэкендам; проверки AS-привязок выделены в Test_AngelScript* с общими header-фикстурами.
  • Добавлены проверки настоящего ManagedScriptBaker/runtime bridge для server, client и Mapper: инициализация, события, передача аргументов и результатов, исключения и изоляция одновременно работающих серверов.

Исправлено

  • Managed-точки входа native-вызовов с Dictionary<K,V> регистрируются через существующий dictionary bridge вместо пропуска их сигнатур как неподдерживаемых; результаты callback-словарей копируются через accessor вызывающего, а managed-объекты удерживаются GC roots во время преобразования.
  • Тест ASIO accept callback захватывает отчёт отдельного потока обработки исключения и ожидает его до восстановления глобального состояния тестов; намеренная диагностика больше не попадает в журнал следующих проверок логирования.
  • CMake отслеживает packed/loose Git refs только файловыми зависимостями.
  • Сторона EntityHolder фильтруется до проверки держателя; заглушки общего держателя сохраняются.
  • Persistent-потомки Game и их постоянные потомки сохраняются; обычные остаются временными.

Миграция

  • База: 91d8bf21ac89e5342db17aab8e25332e049e900e (2026.1.36-dev); следующая версия — 2026.1.37-dev. Повторите конфигурацию сборки тестов после разделения исходников. В инструментах с путями к тестам используйте имена Test_AngelScript*, а в точечных фильтрах Catch2 — имена разделённых AS-cases с этим префиксом. Managed runtime tests требуют .NET SDK для настроенного target framework и комплект managed runtime. Пересоберите все включённые роли и проверьте оба бэкенда; обновите метаданные, справочники и маркеры запекания согласованными бинарниками. Конверсия игровых правил, script API, конфигурации, сохранений и сети не нужна: существующие dictionary-сигнатуры теперь используют свой прежний bridge. Managed ABI 9, runtime 0.0.72, спрайты v2, схемы ресурсов и сети сохраняют идентичность. Развёртывайте согласованные бинарники и runtime payload вместе; откат возвращает предыдущие согласованные бинарники без конверсии сохранений.
  • Пересоберите сервер/baker и запеките метаданные. Согласуйте исторические ID потомков, которые не были сохранены. Декларации, формат документов и протокол не меняются.

2026.1.36-dev - 2026-10-13

Исправлено

  • В проверке аудио названы Test_AudioBaker, Test_AudioBakerAcm и Test_AudioManager; ACM требует FO_AUDIO_ACM.
  • Двуязычный ADR согласован с датированным измерением AI delivery; документы включены целиком, лимит байтов сохранён.
  • Шесть диаграмм переведены на LF без видимых изменений; четыре датированные записи проверки сохранены как исторические доказательства.

Миграция

  • cd5c1168f8f4bdab63a2909ceacb049ba87e070a (2026.1.35-dev) → 2026.1.36-dev: только документация, генераторы и тесты. Конверсия API, скриптов, конфигурации, ресурсов, хранимых данных и БД не нужна. Смысл аудио, ABI 9, runtime 0.0.72, спрайты v2, схемы updater и сети прежние.
  • Запустите docs_audio.py --write, docs_diagrams.py --write, затем docs_prepare.py из BuildTools/. Проверьте тесты документации аудио, диаграммы, хеши EN/RU, версию, site/routes и полный AI delivery. Метаданные кода, сборки и пакетов должны совпадать; принудительная перепечка не нужна. Native audio и слышимые проверки платформ выполняются отдельно. Откат возвращает документацию, генераторы и метаданные базы; сохранения не меняются.

2026.1.35-dev - 2026-10-12

Исправлено

  • Исправлены пустой return теста ImageBaker для GCC и nullable-формат; runtime прежний.
  • API-проверки сохраняют равенство исходникам и явную классификацию: 2573 символа, 2572 experimental, один internal.
  • Сокращены метки URL AI-пакета; полные документы, ссылки, состав и прежний лимит размера сохранены.

Миграция

  • База: d5bef2f554019e4c6c45366a1f422c11e9229878 (2026.1.34-dev); далее 2026.1.35-dev. Сохраните прежнее принятие владения, ACM и Arcanum. API, конфигурация, данные, sprite v2, ABI 9 и runtime 0.0.72 прежние.
  • Пересоберите и запеките все роли; выполните format/API/native-тесты и python BuildTools/docs_prepare.py для ссылок, EN/RU, сайта и AI. Откат использует согласованные код, тесты и metadata базы 34; конверсии игры нет.

2026.1.34-dev - 2026-10-12

Исправлено

  • Первый загруженный sprite sheet независим от cached prototype. Усечение сокращает оба массива кадров; копирование ограничено размером назначения и задаёт размер/привязку нулевого кадра/направления.

Миграция

  • База 5170fa03ccdcc8efb6a592f9aba3baebfd544cb6 (2026.1.33-dev); новая версия 2026.1.34-dev. Пересоберите native clients/Mapper и перезапустите. Конверсия scripts/config/content или БД не нужна: first/last selection, directional deltas, state/action tags и atlas sharing сохраняют смысл.
  • Независимое проигрывание теперь соблюдается с первой загрузки. Усечение не сокращает последующие загрузки; LastFrame по-прежнему суммирует обе оси. Проверьте повторные загрузки, усечённые копии и видимые animation/directions/stop-start.
  • Runtime 0.0.72, Managed ABI 9 и sprite container v2 прежние. Запечённые изображения пригодны; обновите обычные generated metadata/bake markers, выкладывайте согласованные binaries. Откат возвращает baseline binaries без конверсии сохранений.

2026.1.33-dev - 2026-10-12

Добавлено

  • FOFRM Alias сохраняет направления, привязки, смещения и время бинарного источника. ART $r=0..7 выбирает одну ротацию.

Исправлено

  • DAT 2.1 принимает имена с завершающим нулём и без него, нормализует регистр/слеши и читает флаги как биты. ART использует 8-битный заголовок, присутствующие палитры, таблицы по ротациям и ограниченные потоки raw/RLE с исходными правилами привязки.
  • Исключения DAT, ZIP/embedded ZIP, cached-directory и вложенных изображений сохраняют причину и контекст источника. FileReader сообщает границы чтения; DAT отклоняет усечённые записи, неверные распакованные размеры и повреждённые окончания потоков.

  • Пустые HTML-якоря исключены из ключевых слов документационного поиска; видимый текст, стабильные ID и примеры кода индексируются. Пересоберите site/search и AI delivery с прежними лимитами.

Миграция

  • Версия 2026.1.33-dev следует за опубликованной 2026.1.32-dev. База: 6875e109534e94657c37fed55c559550901e9313. Включайте FO_DATA_SOURCE_DAT и FO_IMAGE_ART по необходимости; обе по умолчанию OFF. Выключенные источники указывают нужную опцию. Владельцы — DataSource-Dat и ImageBaker-Art; FOFRM использует ImageImport::Context::Resolve. PNG/TGA/FOFRM, callbacks и существующие опции компонентов прежние.
  • $r3/$R3 по-прежнему выбирают палитру 3. Замените донорский Alias = Actor$r3.art на Alias = Actor$r=3.art; тот же селектор работает в ссылках frm. Обычная композиция не требует конверсии; Alias нужен для полного набора источника. Другой FOFRM нельзя использовать как псевдоним. Руководство по изображениям описывает проверку селектора, выбор запасной палитры, пределы холста/смещений, длительность до 65535 мс, выбор кадров при fps ноль и привязку по категориям; сохраняйте пути art/critter/, art/monster/, art/unique_npc/, art/wall/, art/portal/ и art/roof/.
  • Найдите входы через rg --files -g '*.art' -g '*.dat' -g '*.fofrm' и rg -n 'Alias|\$[rR]=?[0-7]' <source-roots>. Переконфигурируйте/пересоберите baker, затронутый native runtime и метаданные версии; принудительно перезапеките нужные пакеты через BakeResources. Замените outputs, перезапустите клиентов, визуально проверьте палитры, привязки, смещения, псевдонимы и обе геометрии карты.
  • Обрабатывайте DataSourceException при неполном чтении cached-directory; исправьте DAT/ZIP и обновите индексы каталогов. Поиск отсутствующих файлов и владелец логирования прежние. Контейнер спрайта v2, runtime 0.0.72, script ABI identity 9, схемы updater/пакетов, транспорт и хранимые данные не меняются относительно опубликованной базы. Конверсия БД/сохранений и проприетарные ресурсы не нужны. Выкладывайте согласованные ресурсы/бинарные файлы; откат восстанавливает оба набора вместе.

2026.1.32-dev - 2026-10-12

Исправлено

  • Нормализованы комментарии native RefType и bindings; runtime-токены и API прежние.
  • Происхождение FOFRM Count привязано к загрузчику и чтению; ART отклоняется.
  • Governance соблюдает опубликованный лимит 2 MiB + 192 KiB, полноту документов и отказ при превышении.
  • Проверки переводов учитывают 4866 записей: 2576 API, 106 аудио, 79 CMake; пропуски и устаревшие переводы отклоняются.
  • Восстановлены заголовок и якорь optional-archive providers.
  • Исполняемая проверка CMake учитывает 58 опций.
  • Managed bin/obj исключены из сайта; rendered-аудит сохраняет авторские исходники.
  • Аннотации поиска ограничены 224 символами; слова полного документа и лимит байтов сохранены.

Миграция

  • База: 2026.1.31-dev, b197060d30d01ac74d7a203039a6bdb379c17948. Сохраните владение RefType (29), требуемое принятие ACM (30), ограниченный обзор (31): ABI 9, runtime 0.0.72. Новых миграций скриптов, конфигурации, схем ресурсов и данных нет; runtime-семантика прежняя.
  • Выполните python BuildTools/docs_prepare.py для моделей, EN/RU, фрагментов, сайта/маршрутов и AI; проверьте governance, происхождение, переводы и версию. Пересборка/упаковка использует 2026.1.32-dev. Откат возвращает документацию/тесты базы 31 и согласованные сборки без изменения игры и владения.

2026.1.31-dev - 2026-10-11

Добавлено

  • Player.ViewMapArea(map, hex, radius) открывает живой фиксированный обзор области, сохраняя управление персонажем на глобальной карте. Динамические объекты фильтруются гексным расстоянием с включённой границей; появление и уход обновляются событиями движения и предметов. Клиент первоначально центрирует камеру и закрывает внешнюю область независимо от настройки обычного тумана.
  • Player.ReturnFromViewMap() восстанавливает обычное отображение управляемого персонажа. Существующий отсоединённый ViewMap сохраняет полный административный обзор карты.

Исправлено

  • Камера ограниченного обзора поддерживает обычную прокрутку без переноса области видимости. Смена размера сохраняет положение камеры в авторских скролл-границах. Внешняя маска использует переопределяемый primitive-эффект тумана с плавным краем внутрь области и полной непрозрачностью снаружи.
  • Ограниченный обзор карты учитывает авторские границы прокрутки камеры при центрировании, смене масштаба и размера экрана. Область видимости остаётся вокруг центрального гекса, даже когда камера останавливается у края карты.

Миграция

Сетевое сообщение ViewMap теперь содержит int32 радиус после центрального гекса (ноль для прежнего полного обзора). Сетевая совместимость повышена с 0.0.71 до 0.0.72; обе стороны и метаданные скриптов пересобираются вместе. Миграция постоянных данных карты, предметов или персонажей не нужна: подписки и границы обзора существуют только в рантайме. Ограниченный обзор передаёт актуальные позиции при смене гекса и не передаёт будущие маршруты движения. Возврат требует полного графа начальной информации управляемого персонажа; состав глобальной группы отправляет проект под покрытием группы.

При подключении плавного края ограниченного обзора перепеките ресурсы, чтобы включить Effects/Primitive_ViewAreaFog.fofx. Проект может переопределить эффект, сохраняя полную непрозрачность внешней области. Для прокрутки нужны обычные обработчики ввода проекта на экране ограниченного обзора; центр и радиус видимости по-прежнему определяет сервер.

База: e1a3815ff96c7d88f47314984e9d9242e37bc585 (2026.1.30-dev); эта обновлённая правка ограниченного просмотра — 2026.1.31-dev. Сначала выполните предыдущую миграцию владения Managed RefType и пересоберите/перезапеките все роли вместе.

2026.1.30-dev - 2026-10-11

Добавлено

  • Опциональный встроенный импортёр Interplay ACM под FO_AUDIO_ACM, по умолчанию OFF. AudioBaker-Acm.* владеет состоянием unpacker на каждый декодер и соглашением Fallout о каналах; AudioBaker регистрирует загрузчик только при включённой опции. Регрессионные фикстуры декодера перенесены в Engine; проверяются автоматическое запекание Vorbis и запросы при выключенной опции.

Миграция

  • База: 2026.1.29-dev, 3a366761742204d15aa86726cc23168c9b7ec81d; версия этого изменения — 2026.1.30-dev. Defaults WAV/Ogg, точные пути, воспроизведение, громкость и значения существующих исходников сохраняются. Импортёр относится только к Baker и не зависит от backend/platform; новая сторонняя библиотека не требуется.
  • Проекты с локальным ACM-загрузчиком задают SetOptionValues(FO_AUDIO_ACM ON) перед StartProjectGeneration, удаляют его исходники/тесты из AddEngineSources, include и регистрацию audio_baker->AddLoader(LoadAcmAudio, {"acm"}) из SetupBakersHook. Остальные проектные bakers/hooks сохраняются. Прямые пользователи декодера включают AudioBaker-Acm.h и используют AudioBakerAcm::Decoder, AudioBakerAcm::DecoderException и AudioBakerAcm::Load(string_view, FileReader); объявления доступны только при включённой опции. Перед миграцией ищите AcmDecoder, LoadAcmAudio, .acm и FO_AUDIO_ACM в CMake, presets, окружении и нативных расширениях. Проекты только с WAV/Ogg оставляют OFF; миграция их исходников не требуется.
  • Сохраните префикс sound/music/ без учёта регистра для стерео ACM; остальные ACM-пути означают моно даже при стерео-заголовке. Частота исходника положительна, число PCM-сэмплов образует полные непустые кадры. Unpacker сохраняет исходную арифметику переполнения/дополнения; выход остаётся Vorbis по авторскому пути. Добавляйте acm в проектный Audio.SoundFileExtensions, только когда нужен каталог инспекции; default Engine остаётся wav ogg.
  • Выполните реконфигурацию, пересоберите baker и затронутые нативные цели, затем запеките все пакеты с Audio. FO_AUDIO_ACM участвует в FO_BAKING_CONFIG_HASH: отсутствующий/изменённый fingerprint вызывает полное запекание и записывается только после успеха. При OFF запросы ACM для коллекции и отдельного пути падают до incremental skipping с Audio importer is disabled; enable FO_AUDIO_ACM и путём. Проверяйте тесты декодера, enabled/disabled bake, счётчики/пути/каналы реальных ACM-пакетов и воспроизведение в клиенте с активным устройством.
  • Конвертации сохранённых сущностей/БД, migration rule, изменений сетевого marker (upstream 0.0.71), схемы sprite/resource и host/runtime ABI нет. Поставляйте запечённый Vorbis по прежним путям. Откат восстанавливает прежний baker и проектные исходники/регистрацию загрузчика вместе, затем выполняет полное запекание; не смешивайте регистрации двух владельцев.

2026.1.29-dev - 2026-10-11

Исправлено

  • Managed C#-конструкторы с фабрикой создают пригодный нативный объект и разделяют учёт фабрики. Типы без фабрики не имеют публичного конструктора без аргументов; динамические DTO сохраняют обычное создание.
  • Обёртки с подсчётом ссылок автоматически удерживают одну нативную ссылку. Фабрики и PassOwnership передают её; остальные результаты, аргументы callback/событий и элементы коллекций получают собственную. Забытое владение ставится в очередь очистки потока движка; shutdown очищает очередь и живые обёртки до сборки сущностей/unbind. Нативные вызовы удерживают обёртки.

Добавлено

  • Стандартное владение IDisposable/using скрывает __Factory, __AddRef и __Release из публичного managed API. Нативное действие Dispose без аргументов выполняется до возврата ссылки: FogLayer.Dispose() удаляет слой и закрывает обёртку одним вызовом.

Миграция

  • База: 6a1f03880a84e097cfedee6d331178aad89e390d (2026.1.28-dev); сначала примените версии 26–28 ниже. Проверенные более ранние исходники 16f1608794 имеют дефект конструктора с нулевым указателем. Меняются все managed-роли; нативные/AngelScript-сигнатуры, ID, значения по умолчанию и схемы свойств/данных прежние.
  • Замените __Factory() на new, уберите ручной __AddRef(), замените __Release() на Dispose()/using. Полученные от движка обёртки автоматически удерживают нативные объекты. C#-алиасы разделяют освобождение; независимые обёртки имеют собственное владение. Динамические DTO и обёртки без подсчёта ссылок не получают интерфейс.
  • Найдите создание без аргументов SpritePattern, FogLayer, VideoPlayback, TimeEventContext, MovingContext и используйте создающие API. Скомпилируйте все роли для проверки алиасов и target-typed new().
  • Держите holder Map.DrawMapSprite до последнего отрисованного кадра, затем StopDraw() и Dispose(). Область using должна включать этот кадр; срок GC не определён. Прямой fog.Dispose() и using выполняют нативную очистку и закрытие обёртки; уберите прежние два шага. Повторный вызов и освобождение после shutdown безопасны. Получение указателя и boxed/packed-аргументы закрытой обёртки отклоняются. Ошибка очистки сохраняет владение для повторной попытки без повтора выполненного нативного действия.
  • Пересоберите согласованные нативные компоненты и перевыпеките все роли с ABI identity 9. Совместимость runtime меняется с 0.0.70 на 0.0.71; бинарники/ресурсы и клиент/сервер обновляются вместе. Предыдущие неопубликованные ABI 8/runtime 0.0.70 также требуют пересборки. Следуйте порядку пересборки. Конверсия сохранённых данных и резервных копий не нужна.
  • Откат пересобирает/перевыпекает прежние согласованные исходники для всех сторон, возвращая их ручное владение и поведение конструкторов. Прежние требования к компонентам, хранилищу, блокировкам выпечки, миграции документов и серверной сетке ниже сохраняются.
  • Тесты генератора проверяют публичный API; тесты времени жизни — автоматическое получение ссылок, нативную очистку, GC, повторные попытки, алиасы, конструкторы, shutdown и изоляцию backend. Приёмка runtime проверяет свойства, отрисовку, using/освобождение и штатное завершение. См. правила времени жизни и проверки.

2026.1.28-dev - 2026-10-11

Исправлено

  • Удалены лишние завершающие пустые строки из шести native-файлов запросов дисплея; локальные hstring в обработке метаданных и тестах объявлены явно. Оба const-контейнера, выбирающие прокси свойств только для чтения, и пояснения анализатору сохранены.
  • Регрессия фрагментов согласована с проверенным корпусом из 470 примеров и 311 нормативных фрагментов; сокращены формулировки руководства по конфигурации и нормализованы четыре CMake-комментария. Полное нормативное покрытие и проверки отказов сохранены.
  • Ссылки на владельцев импорта изображений и правила переноса пользовательских native-загрузчиков согласованы с выделенными модулями.

Миграция

  • База: 2026.1.27-dev, 5ef9334595f45522c8d580c25e22ed4556ab137b; сначала выполните её миграцию блокировок и сборочного glue. Эта очистка не меняет runtime, API, опции, ABI, форматы ресурсов/сохранений или сетевую совместимость (0.0.70). Повторите конфигурацию и пересоберите согласованные native-хосты и ролевые метаданные/скрипты для 2026.1.28-dev; перегенерируйте EN/RU, фрагменты, сайт/маршруты и AI delivery. Проверьте форматирование, native/process-lock тесты и переход версии.

2026.1.27-dev - 2026-10-11

Добавлено

  • Перемещаемый fs::exclusive_file_lock и неблокирующий fs::try_lock_file: захват без усечения, Unicode/long paths, явное освобождение, передача владения и ненаследуемые native-дескрипторы. Web возвращает недоступную блокировку.

Исправлено

  • Канонический выходной каталог запекания защищён соседним file lock до удаления report/hash и до завершения записи отчётов. Отказ сохраняет прежние outputs даже при повторном использовании MasterBaker. Принудительная пересборка не удаляет inode блокировки.
  • Компиляция ролей AngelScript и пакетов на порядке скриптов последовательна только при AS_DEBUG; diagnostic lock рабочего каталога защищает между Baker-процессами. Release сохраняет заданный параллелизм.
  • Только native baker записывает скомпилированный resource build hash под output lock. Убрана незаблокированная запись CMake после завершения baker; генерация hash native binaries прежняя.

Миграция

  • Версия Engine — 2026.1.27-dev, следующая minor после опубликованного master 2026.1.26-dev. Повторите конфигурацию и сборку native bakers и метаданных версии, затем штатное запекание. Script bindings, network marker, sprite format, БД и сохранения не требуют конверсии.
  • Оставляйте <BakeOutput>.lock рядом с выходным каталогом и AS_DEBUG.lock в рабочем каталоге. Игнорируйте эти производные файлы в проектах: наличие файла безопасно. Не удаляйте их для снятия contention; остановите или дождитесь владельца, проверьте права и повторите запуск. Отказы lock предшествуют изменениям outputs/report/hash; корни файловых систем запрещены как BakeOutput.
  • fs::try_lock_file не создаёт родителей, не усекает содержимое и не ожидает. Незахваченный lock также означает недоступный путь или неподдерживаемый Web, а не только другого владельца. В POSIX exclusion advisory: участники должны использовать один inode. Держите владельца lock до завершения защищённой работы и отчётов.
  • Debug-bake с AngelScript требует доступного для записи diagnostic lock; разные рабочие каталоги допускают независимое debug-запекание. Обычная Release-компиляция остаётся параллельной. Защита относится к MasterBaker, а не произвольным внешним процессам AngelScript.
  • Пользовательские CMake wrappers не должны писать Resources.build-hash после возврата native Baker. Скомпилированный baker записывает его до освобождения lock; сохраняйте WriteBuildHash только для native binary markers. Контракт revision/hash остаётся привязанным к скомпилированным исходникам. При rollback возвращайте старый baker и build glue вместе и завершайте запекание до использования outputs.

2026.1.26-dev - 2026-10-11

Изменено

  • CMake TemporaryCompat задаёт срок ограничениям, включая неактивные ветки. Выбор БД не запрещён для Web.
  • Проекты выбирают соседние модули архивов/БД/изображений под guards через положительные SetOptionValues; регистрация source/header безусловна. Memory и PNG/TGA/FOFRM обязательны. ZAR/TIL разделяют decoder под guard с сохранением порядка каналов.
  • JSON-файлы используют обычный JSON, BLOB SQLite — CBOR, BSON принадлежит только Mongo. Внешние ZIP/BOS опциональны; Embedded/APK сохраняют zlib/minizip. Опции с отметкой влияния на бейкинг инвалидируют ресурсы независимо от ревизии проекта; БД и служебные опции исключены.

Миграция

  • В явных входах temporary_compat.py укажите Engine/BuildTools/cmake и файлы CMake проекта. Ограничения помечайте TemporaryCompat(Id "YYYY-MM-DD"); CI проверяет истечение срока, сохраняя воспроизводимость конфигурации.
  • Предыдущая версия: 2026.1.25-dev, 16f1608794eafeb6c05001b997071105dbc403b9. Выбор компонентов перечисляет опции, роли, зависимости и диагностику; persistence задаёт новую схему/пределы.
  • Удалите FO_DISABLE_MONGO/FO_DISABLE_SQLITE из CMake, presets, окружения и кеша (cmake -UFO_DISABLE_MONGO -UFO_DISABLE_SQLITE ...). Явно включите используемые FO_DATABASE_JSON, FO_DATABASE_SQLITE, FO_DATABASE_MONGO, FO_DATA_SOURCE_DAT, FO_DATA_SOURCE_ZIP, FO_IMAGE_* через SetOptionValues. Все optional defaults OFF; старые опции и выключенные компоненты завершаются ошибкой, без aliases/fallback.
  • Найдите native-вызовы ImageBaker::FrameShot, FrameSequence, FrameCollection, LoadFunc, MAX_DIRS_MINUS_ONE: замените префикс на ImageImport::. Аргумент четыре loader становится const ImageImport::Context&; используйте context.Files, context.Resolve(path). Необязательный аргумент три AddLoader задаёт выходное имя. Подключите соседние DataBase-{Memory,Json,SQLite,Mongo}.h; фабрики теперь DataBaseMemory::Create, DataBaseJson::Create, DataBaseSQLite::Create, DataBaseMongo::Create, инициализация — DataBaseSQLite::InitializeRuntime. BSON-конвертеры/инициализация allocator приватны Mongo.
  • Используйте новые пустые каталоги JSON/SQLite. Для старых Extended JSON/BSON BLOB нет reader и миграции; для отката сохраните старые binaries/storage вместе. Mongo сохраняет представление. Правил преобразования entity/property нет; codecs сохраняют текущие AnyData по owning-документу persistence.
  • Повторите configure, генерацию bindings/metadata, совместную сборку затронутых native-ролей, full bake и упаковку matching outputs. Resources.baking-config-hash/report bakingConfigHash независимы от Resources.build-hash; отсутствие/смена конфигурации бейкинга удаляет stale outputs. Контракт отпечатка учитывает геометрию, модели/эффекты, скрипты и частицы вместе с загрузчиками архивов/изображений. Совместимость 0.0.69 → 0.0.70: смешанные binaries/snapshots запрещены; поставляйте matching client/server metadata, откатывайте полный комплект binaries/resources/storage. Протокол updater, идентификатор client-runtime ABI и версия baked sprites сохраняются.
  • Перегенерируйте contracts/snippets, EN/RU, сайт/routes и AI delivery. Проверьте minimal/full suites БД/архивов/изображений/baker, reopen/recovery и ошибки выключенных компонентов; platform/runtime proof фиксируйте отдельно. Публикация не подразумевается.

2026.1.25-dev - 2026-10-10

Исправлено

  • При уничтожении существа связи снимаются без рассылки снимка attachments от участника, который уже уничтожается. Живые участники получают штатное уведомление, проверки состояния сущностей сохраняются.
  • При финализации клиентского представления существа освобождается кеш идентификаторов прикреплённых существ; живые участники сохраняются, проверки очистки в деструкторе остаются. Native-регрессии охватывают обычное отсоединение, уничтожение любого участника, исходящие уведомления attachments и сообщения об исключениях.

Миграция

  • Повторите конфигурацию и сборку native-клиентов, серверов и unit-тестов, затем выпечку ресурсов проекта перед проверкой. Преобразование вызовов проекта или данных не требуется. Смысл API, настроек, сетевой совместимости 0.0.69, ABI, схем ресурсов и сохранений не изменился; правило миграции не требуется.
  • После интеграции обновления перегенерируйте фрагменты документации, состояние перевода, сайт, поиск, маршруты, оценку материалов для ИИ и AI delivery.

2026.1.24-dev - 2026-10-10

Добавлено

  • Клиентские скрипты получают размер рабочего стола и режимы монитора текущего окна через Game.GetDisplaySize и Game.GetDisplayModes. Из результатов SDL исключаются неверные и повторяющиеся размеры; при недоступности сведений возвращаются нулевые размеры или пустой список. Headless-окна и заглушки возвращают тот же признак недоступности.

Миграция

  • Предыдущая версия — 2026.1.23-dev, ревизия e08ca424e4f24561d6610686b2b9f9548b9365db. Обновление конфигураций примеров сохранено; эти методы дисплея не требуют дополнительных преобразований настроек проекта.
  • Смысл существующих вызовов, настроек и сохранённых данных сохраняется; преобразование вызовов или данных не требуется. Перед использованием двух новых методов перегенерируйте привязки и запеките скрипты. Ограничения разрешения, стандартные варианты и резервный список при недоступных сведениях определяет вызывающий проект.
  • Пересоберите Engine и native-бинарники проекта вместе из-за дополнительных виртуальных методов IAppWindow и поставляйте соответствующие запечённые метаданные. Сетевая совместимость остаётся 0.0.69; сетевые форматы, схемы ресурсов и сохранения не меняются. При переходе на 2026.1.24-dev повторите конфигурацию native-метаданных версии и ревизии, перегенерируйте API-справочники, состояние переводов, сайт, поиск, маршруты и AI-доставку.

2026.1.23-dev - 2026-10-10

Исправлено

  • Пересозданы полные конфигурации MinimalMultiplayer, ContentShowcase и PackagingMatrix после замены серверных настроек сеток. Все три используют Server.ProtoMapGridType = Dynamic и Server.MapInstanceGridType = Dynamic, сохраняя прежний динамический режим по умолчанию. Существующие проверки актуальности и пакетов примеров контролируют эти сгенерированные входы. См. generated content.

Миграция

  • Предыдущая версия — 2026.1.22-dev, ревизия bf673df1818c10aaf77c586077caf60cbd2e904f. Дополнительная миграция проекта не требуется: обновлены конфигурации примеров Engine для настроек, введённых в указанной версии. При переходе с более старого Engine соблюдайте её заметки о миграции. Native-поведение, host/runtime ABI, сетевая совместимость, схемы ресурсов, форматы карт и сохранений, правила базы данных не меняются; преобразование данных не требуется.

2026.1.22-dev - 2026-10-10

Добавлено

  • Скрытые замеры ServerMapGridMemoryDynamic и ServerMapGridMemoryChunked для пустых/населённых карт, растущей истории записей полей, уничтожения и остановки. Сравнение новых процессов сообщает private bytes и проверяет одинаковые число сущностей и поведение полей без лимита памяти. См. тестирование.
  • Скрытый benchmark ServerMapGridOperationsCost для настоящих серверных операций пути, достижимости, трассировки, чтения полей и изменения блокировок во всех девяти сочетаниях плотной, чанковой и хеш-сетки прототипа и экземпляра. Он проверяет одинаковые результаты и сообщает пять прогретых замеров стены и CPU без временных порогов. См. тестирование.
  • Независимые строковые настройки сеток общих прототипов и экземпляров карт: Server.ProtoMapGridType и Server.MapInstanceGridType по умолчанию Dynamic и принимают только Static, Chunked или Dynamic. Неизвестное или пустое значение прерывает запуск сервера. Это три соседние реализации; сетка чанков не наследуется от статической. Сторона блока задаётся через GameSettings::SERVER_MAP_CHUNK_SIDE (16). См. хранение серверных полей.

Исправлено

  • Единый массив полей клиентской карты заменён плотными блоками 16x16 с прямой индексацией, создаваемыми при первой записи. Большая карта больше не требует одного непрерывного выделения для всех полей. Пустое чтение, прокрутка, пересечение координат resize Mapper и unload сохраняют поведение; буферы освещения остаются плотными. Добавлены проверки памяти настоящей большой карты, границ блоков и владения, а также скрытое сравнение стоимости нативного доступа к полям. См. хранение полей клиента. Сторона блока задаётся параметром шаблона; MapView выбирает её через константу времени компиляции GameSettings::CLIENT_MAP_CHUNK_SIDE (16).

Миграция

  • Предыдущая версия — 2026.1.21-dev, ревизия cfa468f17bd5dff82cebc6f05b568620fc34163c. ChunkedTwoDimensionalGrid — новый нативный тип хранения; StaticTwoDimensionalGrid и DynamicTwoDimensionalGrid сохраняют свои контракты. Закрытое поле MapView::_hexField использует новый тип. Native clients, embedded clients и Mapper на всех платформах/backend требуют пересборки всех потребителей заголовков MapView: меняется закрытая C++ компоновка. Преобразование смысла координат, формата карт, сохранений или базы данных не требуется. Старые native objects нельзя смешивать с новыми заголовками.
  • Соблюдайте порядок generated content: configure/codegen, пересборка затронутых native applications и тестов, выпечка соответствующих metadata/resources, переупаковка пары host/runtime. Версия host/runtime ABI, схемы ресурсов, сетевая совместимость 0.0.69 и database MigrationRule не меняются. Замените опубликованные булевы настройки ProtoMapStaticGrid и MapInstanceStaticGrid соответствующими строками ProtoMapGridType и MapInstanceGridType. Для каждого слоя прежние флаги static/chunk переводятся в Dynamic при static=false, в Static при static=true и chunked=false, в Chunked при обоих true. Ранние незакоммиченные ключи ProtoMapChunkedGrid, MapInstanceChunkedGrid, ProtoMapStaticGridChunked и MapInstanceStaticGridChunked удалены; псевдонимов нет. Перегенерируйте bindings и выпеките соответствующие metadata. Нативные вызовы StaticMap теперь передают (size, grid_type); конструктор Map больше не имеет noexcept, неверный выбор вызывает SettingsException. Откат использует целый предыдущий native package; восстановление базы не требуется.
  • Выполните ClientLargeMap*, TwoDimensionalGrid, регрессии client-map/lifetime, ServerMapGridSelectionPreservesFieldBehavior, проверки неверного выбора и освобождения владельца при ошибке конструктора, а также server-map/lifetime, sprite/atlas/roof, сравните повторные запуски ClientMapFieldAccessCost и ServerMapGridOperationsCost и проверьте обычный отрисованный вход на карту в проекте. Заготовки памяти конструктора и стоимости доступа не доказывают отсутствие OOM в долгом 32-битном сеансе, FPS всей игры или пропускную способность тиков сервера. После интеграции перегенерируйте snippets, состояние перевода, сайт/поиск/маршруты, оценку для ИИ и AI delivery.

2026.1.21-dev - 2026-10-10

Исправлено

  • Изменяемые списки и словари Managed-событий записываются через accessor коллекции вызывающей стороны после преобразования записей. Нативные прокси сохраняют адреса элементов контейнера после добавления и роста вектора, обновляют порядок словаря, соблюдают вставку повторного ключа и запрет записи в const-контейнер.
  • Добавлена переиспользуемая native-проба boxed-событий коллекций из исходников Engine: GC, внешний script context, shutdown и тот же отрицательный контроль без обратной записи. Нужны заданная Managed unit-сборка GCC/Clang Ninja и подготовленный runtime хоста; квалификация других payload/toolchain остаётся отдельной.
  • В синхронных контекстах документов базы данных AngelScript и Managed хранятся гарантированно ненулевые заимствования ptr<const AnyData::Document>. Чтение документов, проверки срока жизни callback и поведение миграций не изменились.
  • При восстановлении сущностей и глобального состояния явно отброшен признак наличия изменений миграции документа. Оба вызова по-прежнему сохраняют выходной набор обновлений и пропускают исключения миграции; устранены два предупреждения Clang nodiscard.
  • Применён штатный формат clang-format 20 к include backend AngelScript и Managed-привязкам миграций документов; CI форматирования больше не создаёт diff этих файлов.
  • Проверен полный AI-контекст из 112 документов: версия 20 достигла 2 228 855 байт. Жёсткий лимит увеличен на 32 KiB до 2 260 992 байт; документы целиком, история миграций и действующая политика состава сохранены.

Миграция

  • Пересоберите нативные скриптовые backend и выполните выпечку затронутых ролей. Действующие обработчики событий с ref List<T> и ref Dictionary<K, V> теперь передают итоговые коллекции вызывающей стороне и следующим подписчикам; менять сигнатуры обработчиков и scalar ABI не требуется.
  • Потребители AI delivery должны учитывать увеличение full_context.max_bytes в манифесте с 2 228 224 до 2 260 992 байт. Пересоздайте производные данные командой python BuildTools/docs_prepare.py до тестов исходников и актуальности, затем выполните полные проверки сайта и браузера. Превышение бюджета по-прежнему завершает проверку ошибкой, без обрезания пакета.
  • Script/native API, runtime-конфигурация, сериализованные данные, сеть, ABI, схема ресурсов и сохранения не меняются. Пересоберите метаданные версии для этой ревизии; версии документационных зависимостей и маршруты публикации сохранены.

2026.1.20-dev - 2026-10-09

Исправлено

  • Проверка архитектурной схемы и снятие скриншотов ожидают загрузки ленивых изображений. Задержанный ответ SVG больше не даёт ложного отказа; отсутствующее изображение остаётся ошибкой в каждом профиле.
  • В CI документации добавлена регрессия задержанного и отсутствующего изображения в настоящем браузере.

Миграция

  • Script/native API, конфигурация, сериализованные данные, сеть, ABI, схема ресурсов и сохранения не меняются. При обновлении пересоберите метаданные версии. Версии браузерных зависимостей и полный набор маршрутов/профилей сохранены.
  • После штатной установки закреплённого Chromium запустите npm --prefix BuildTools/docs-browser run test:diagram и полный браузерный аудит. Перегенерируйте документацию, переводы, сайт/поиск/маршруты и AI delivery для новой версии.

2026.1.19-dev - 2026-10-09

Исправлено

  • Исправлена пунктуация комментариев документных миграций.

Миграция

  • Изменены только комментарии; API и сохранения не требуют конвертации. Пересоберите метаданные версии и перегенерируйте документацию.

2026.1.18-dev - 2026-10-09

Добавлено

  • Добавлен MigrationRule Property <Owner> Remove <Old> как постоянный запрет имени. Старое значение в документе/тексте пропускается; живое объявление под этим именем отклоняется, включая поля RefType.
  • Добавлена поддержка документных Property/Proto Transform в AngelScript: [[PropertyMigrator]]/[[ProtoMigrator]], типизированное значение &inout, const DatabaseDocument&inout, автоматическая проверка исходников/байткода и связывание, синхронная атомарная подготовка результатов. Квалифицированное имя функции — Namespace::Function; AngelScript-скрипты нужно перепечь для нового зарегистрированного типа и callbacks. Массивы/словари RefType освобождаются путями своих контейнеров.

  • Добавлены атомарные обработчики Property Transform: native PropertyMigratorCallback, Managed C# [PropertyMigrator], PropertyMigrator<T> и контекст исходного DatabaseDocument. Канонические поля подготавливаются до загрузки сущности.

  • Добавлены документные обработчики [ProtoMigrator] для Proto Transform. Цепочки исходного документа разрешаются до поиска с обнаружением циклов и подготовкой _Proto; обычный lookup и bake применяют только Rename/Remove.

Изменено

  • Правила переименования свойств требуют явного действия Rename и существующего назначения. Transform проверяет существование Persistent-свойства; серверные пользовательские владельцы и их правила следуют фильтрации роли метаданных.

Миграция

  • Для удалённого свойства сохраняйте ///@ MigrationRule Property Owner Remove Old без замены. Rename и Transform остаются формами из пяти частей; Property и Proto Remove имеют четыре. Повторное имя запрещено независимо от нового типа свойства.
  • Замените каждую декларацию ///@ MigrationRule Property Owner Old New на ///@ MigrationRule Property Owner Rename Old New в native/скриптовых исходниках, генераторах, инструментах и фикстурах. Старые имена должны указывать на существующие текущие поля, включая вложенные RefType. Старая форма из четырёх частей отклоняется; Правила Proto также требуют явного действия: Rename Old New, Remove Old или Transform Old QualifiedType.Function. Прежняя замена remove отклоняется; Enum, Entity, EntityHolder и Version сохраняют формы.
  • Для переноса значений задайте ///@ MigrationRule Property Owner Transform Property QualifiedType.Function и статическую синхронную функцию с [PropertyMigrator], результатом bool и параметрами ref T, DatabaseDocument, где T точно соответствует managed-типу свойства. false оставляет исходное представление, true сериализует результат. Нельзя сохранять контекст, менять сущности, выдавать награды или определять тип ссылки по совпадению текста. Проект задаёт смысловые условия, политику коллизий, идемпотентность и фикстуры старых сохранений/перезапуска. Managed C# связывает функции автоматически; несвязанная функция отвергает перенос.
  • Пересоберите native-бинарники и выполните bake метаданных и всех managed-ролей вместе. Правила Property и Proto Rename/Transform содержат пять частей, Remove у обоих видов — четыре; внешний заголовок метаданных не меняется. Ручной маркер совместимости повышен с 68 до 69: смешанные старые/новые бинарники и ресурсы не поддерживаются. Схема БД, типы хранимых полей, сообщения транспорта, состав платформенных пакетов и поведение прочих свойств не меняются; добавленный native callback API требует пересборки встраивающих бинарников.
  • Загрузка БД переносит Game, Player, обычные и пользовательские сущности, включая пакетные пути. Исключение при подготовке оставляет документ и очередь записи нетронутыми; гарантия относится к одному документу, не ко всем документам мира. Сохраняйте правила на поддерживаемый горизонт сохранений и проверьте копию БД перед production. Перегенерируйте API/справочник, snippets, переводы, сайт/поиск и данные для ИИ.

2026.1.17-dev - 2026-10-09

Исправлено

  • Существующие деревья READY, скачанные кэши workspace, готовые входы prebuilt и свежие опубликованные managed runtime проверяются по непустым embedding-заголовкам, основным managed-сборкам и входным архивам линковки выбранной платформы. Неполные деревья восстанавливаются существующим путём кэша/повторной публикации вместо сообщения о готовности runtime без нужных линкеру файлов.

Миграция

  • Миграция скриптового/native API, ключей конфигурации, сериализованных данных, сети, ABI, схем ресурсов и сохранений не требуется: изменение проверяет входы подготовки сборки и сохраняет смысл комплектных runtime. При переходе на эту ревизию Engine повторите конфигурацию и сборку native-метаданных версии и ревизии.
  • Для восстановления неполного дерева READY запустите обычный target SetupManagedRuntime (либо BuildTools setup-mono <os> <arch> <config>). Без workspace-кэша действующие маркеры исходников/объектов позволяют повторить публикацию без перекомпиляции Mono; настроенный кэш принимает комплектные записи и пересобирает неполные попадания. Комплектные деревья сохраняют прежний ключ кэша и имена маркеров.
  • FO_MANAGED_RUNTIME_PREBUILT должен указывать на комплектное дерево выбранной платформы: заголовки managed backend, CoreLib и System.Runtime.dll, статические архивы платформы и JavaScript glue браузера, если он нужен. Замените неполный prebuilt комплектным опубликованным деревом платформы; неполный вход отклоняется до копирования и записи READY. После обновления руководства перегенерируйте локализацию, сайт/поиск/маршруты, оценку ИИ и данные для ИИ.

2026.1.16-dev - 2026-10-09

Изменено

  • Авторская конфигурация Jekyll перенесена в Docs/Site/_config.yml. Файлы зависимостей Ruby/домена и публичные корневые endpoint генерируются в игнорируемом Workspace/Documentation/; docs_site_build.py собирает и экспортирует сайт в Workspace/DocumentationSite/. Публичные URL сохраняются.

  • Индексы доставки документации и каталоги проверок создаются при сборке, а не коммитятся: docs-manifest.json, оба endpoints llms, навигация, поиск и шесть generated-отчётов. Вход сопровождающего с checkout остаётся AGENTS.md; сайт сохраняет публичные URL для получения документации.
  • Документационные outputs подготавливаются перед проверкой CI и рендерингом сайта. Проверенный Pages artifact публикуется только после прохождения проверок версии и документации при push в master.

Исправлено

  • Значения Engine по умолчанию применяются до загрузки обычной конфигурации приложения. Настройки, пропущенные в конфигурации проекта или пакета, получают defaults из Settings.inc; явные значения конфигурации, подконфигурации, локального кэша и командной строки сохраняют прежний приоритет, включая явно заданные нули.

Миграция

  • Замените прямые команды Jekyll на python BuildTools/docs_site_build.py; после подготовки установите зависимости через bundle install --gemfile Workspace/Documentation/Gemfile. Gemfile, .ruby-version и CNAME выводятся из исходного manifest и больше не хранятся в корне как версионируемые копии.

  • Перед локальными проверками документации или Jekyll выполните python BuildTools/docs_prepare.py. Модели публичных контрактов, Markdown, правила, переводы и SVG/PNG остаются версионируемыми и обязаны проходить freshness checks. Игнорируемые результаты доставки не добавляются в индекс.
  • Перед первым push в master с этой правкой выберите GitHub Actions источником сборки Pages; прежняя сборка из ветки не может создать игнорируемые файлы. Проверьте первый опубликованный артефакт и существующие публичные endpoints. Правка рабочего дерева не переключает удалённые настройки и не публикует сайт.
  • Повторите конфигурацию и сборку затронутых нативных приложений, затем bake и проверку профилей запуска встраивающего проекта. Проверьте ранее пропущенные настройки: теперь они получают объявленные defaults вместо нулей от инициализации значением. Имена настроек и объявленные defaults не меняются, явные значения сохраняют смысл.
  • Нативный и скриптовый API, сетевая совместимость 0.0.68, ABI, схемы ресурсов и сохранённые данные не меняются. Преобразование исходников проекта или сохранённых данных не требуется.

2026.1.15-dev - 2026-10-09

Изменено

  • Маршруты и отчёт переводов объединены в docs-manifest.json. Навигация и данные для ИИ ссылаются на VERSION; сборка Jekyll читает его значение вместо хранения копий версии. Поиск исключает технические HTML-комментарии, а полный контекст для ИИ оставляет хэши документов в публичном индексе.

Миграция

  • Потребители документации должны заменить Docs/generated/document-routes.json на docs-manifest.json#/routing, а Docs/generated/translation-status.json — на docs-manifest.json#/translation_status. Это разделы JSON одного файла, а не пути файловой системы. Схема данных для ИИ — 3, схема сайта — 4; смысл полей отчётов и хэши проверки переводов сохраняются. Прежние отдельные отчёты удалены.
  • Перегенерируйте локализацию, сайт/поиск/маршруты, оценку ИИ при необходимости, затем данные для ИИ. Шаблон Jekyll включает VERSION напрямую; сохраняйте includes_dir: . в _config.yml для локальной сборки и GitHub Pages. Публикуйте корневой VERSION побайтно. Миграция native/скриптового API, конфигурации, сериализованных данных, сети, ABI, схем ресурсов и сохранений не нужна.
  • При переходе на эту ревизию Engine повторите конфигурацию и сборку native-метаданных версии и ревизии.

2026.1.14-dev - 2026-10-08

Исправлено

  • Восстановлен выбор моделей после отказа отправки или ожидания SDL_GPU readback. Неуспешный запрос сообщает об ошибке и не отдаёт неподтверждённые пиксели; альфа-маска модели освобождает неуспешный reader и повторяет чтение, сохраняя последнюю готовую маску.

Миграция

  • Миграция конфигурации, вызывающего кода, сериализуемых данных, сетевого или ресурсного формата не требуется. Для восстановления чтения нужно пересобрать клиент. Существующие пороги альфа-канала и результаты успешного чтения сохраняют свой смысл; сетевая совместимость, ABI, схемы ресурсов и сохранения не меняются. При переходе на текущую ревизию Engine повторите конфигурацию и сборку native-метаданных версии и ревизии, затем перегенерируйте состояние перевода, сайт, поиск, маршруты, оценку материалов для ИИ и AI delivery.

2026.1.13-dev - 2026-10-06

Исправлено

  • Руководство Managed C# и диагностика загрузки теперь различают промежуточные файлы компиляции и опубликованные ресурсы сборок. Baker, упаковщик и backend используют описанные здесь каталоги ролей со строчными именами.

Миграция

  • Преобразование вызовов проекта, конфигурации или данных не требуется: исправлена документация существующего расположения ресурсов. Опубликованные DLL остаются в Assemblies/Assemblies-<target>/ (server, client, mapper); Assemblies/<Target>Assemblies/ содержит промежуточные файлы MSBuild. Существующие пакеты сохраняют пригодность. Смысл API, настроек, сетевой совместимости 0.0.68, ABI, схем ресурсов и сохранений не изменился. При переходе на 2026.1.13-dev повторите конфигурацию и сборку native-метаданных версии и ревизии.
  • После интеграции исправленного руководства и этой датированной записи перегенерируйте фрагменты документации, состояние перевода, сайт, поиск, маршруты, оценку материалов для ИИ и AI delivery.

2026.1.12-dev - 2026-10-06

Исправлено

  • Проверка сгенерированной конфигурации только из макросов теперь охватывает версию и ревизию Engine, добавленные контрактом версионирования. Фиксированные значения заготовки исключают зависимость теста от текущей рабочей копии.
  • Существующие проверки codegen и аргументов по умолчанию выполняются в задаче CI engine-update с явной зависимостью от pytest.
  • Объяснение отдельного кеша тестов сокращено по стандарту комментариев Engine; владение кешем и очистка не изменились.

Миграция

  • Преобразование вызовов проекта или данных не требуется. Имена, значения и порядок сгенерированных макросов сохранены; API, настройки, сетевая совместимость 0.0.68, ABI, схемы ресурсов, сохранения и поведение пакетов не изменились. Повторите конфигурацию и сборку native-метаданных версии и ревизии для этого обновления Engine.
  • Задача Ubuntu engine-update устанавливает python3-pytest и выполняет python3 -m pytest -q BuildTools/tests/test_codegen_default_args.py до проверки диапазона публикации. Локальным проверкам исходников требуется pytest; при runtime-изменениях проверки native и использующего движок проекта остаются обязательными. При интеграции этой ревизии перегенерируйте фрагменты документации, состояние перевода, сайт, поиск, маршруты и материалы для ИИ.

2026.1.11-dev - 2026-10-06

Изменено

  • Managed script projects, managed host и принадлежащие движку C#-инструменты компилируются с проверкой целочисленного переполнения. Runtime fragments и live patches используют тот же профиль. Переполнение арифметики и сужающих приведений теперь вызывает OverflowException; результаты, помещающиеся в диапазон, сохраняют смысл.
  • ucolor упаковывает маскированные компоненты цвета беззнаковой арифметикой, сохраняя все прежние значения младших байтов при включённой проверке переполнения.

Миграция

  • Полное руководство по checked-арифметике и заметки о миграции помещаются в существующий проверенный лимит full-context 2,228,224 байта. Потребители AI delivery должны соблюдать объявленный full_context.max_bytes; включение целых документов и fail-closed validation остаются обязательны.
  • Пересоберите managed baker, пересоздайте проекты host и Server/Client/Mapper, скомпилируйте каждую включённую managed-роль, запеките ресурсы и упакуйте новые assemblies. Скопированные проекты C#-инструментов собирайте с CheckForOverflowUnderflow=true; проекты движка уже задают его. Runtime fragments и patches, скомпилированные после обновления, получают checked автоматически.
  • Проверьте намеренное целочисленное оборачивание и битовые приведения signed/unsigned. Найдите в C#-исходниках умножения хешей и приведения упакованных RGBA; используйте локальный unchecked только там, где оборачивание или усечение битов является контрактом алгоритма. Например, замените оборачивающее присваивание хеша hash *= prime на hash = unchecked(hash * prime), а преобразование цвета вершины (int)color.value на unchecked((int)color.value). Обычная игровая арифметика сохраняет checked.
  • Проверьте OverflowException при переполнении сложения и сужающих приведений, оборачивание в явном unchecked и неизменность прежних корректных цветов/хешей. NaN/infinity floating point по-прежнему требуют явной проверки конечности; эта опция компилятора их не отвергает.
  • Конвертация persisted properties, saves, prototypes, native ABI, wire protocol и resource schema не требуется. Ширина числового хранения и runtime compatibility markers этим обновлением не меняются. Поставляйте новые managed assemblies вместе с соответствующей native-сборкой; предыдущий пакет служит границей rollback. Старые API aliases и миграция данных не добавляются.

2026.1.10-dev - 2026-10-05

Исправлено

  • Неопубликованные исправления интеграции TLA перебазированы на опубликованный master b1e3fa58021a171877177a19c3d26127abf486be. Изменения прежних merge-коммитов сведены в один локальный шаг; сохранены опубликованные правила Git, версия и двуязычные записи изменений.
  • Сохранены фактические имена запечённых изображений в нижнем регистре и регрессия композиции кадров, отдельные кеши тестовых процессов, условие 2D/AngelScript для теста и предусловие видимости наземных предметов. Тесты обновления клиента проверяют свободный локальный TCP-порт вместо предположения, что кандидат свободен.
  • Согласованы руководства изображений, запекания и тестирования и производная документация. Полная доставка AI сохраняет проверенный предел 2228224 байта, необходимый для этих локальных пояснений.

Миграция

  • Повторно сконфигурируйте и соберите native-клиенты, серверы и метаданные версии/ревизии вместе. Rebase не вводит преобразований вызовов TLA, настроек, протокола, ABI, схем ресурсов или сохранений; совместимость остаётся 0.0.68. Проверенный native-код не изменился. При обновлении с более раннего опубликованного движка выполните предыдущие миграции временных меток и движения по порядку.
  • Потребители доставки должны учитывать увеличение max_bytes полного контекста с 2195456 до 2228224 байт относительно этой опубликованной базы. Сохраняются включение документов целиком и отказ при превышении бюджета. Тестовые процессы используют отдельные кеши; пользовательские настройки и история маппера остаются целыми.

2026.1.9-dev - 2026-10-05

Исправлено

  • Добавлена версия опубликованной правки правил Git (8697fcd9d9); согласованы проверки и руководство версионирования.

Миграция

  • Получите upstream; переносите rebase только незалитые коммиты, даже при наличии upstream. Разошедшиеся опубликованные истории объединяйте merge; сохраняйте опубликованные предки. Миграция исходников/данных не нужна: API, настройки, протокол 0.0.68, ABI и ресурсы сохранены. Пересконфигурируйте/пересоберите метаданные версии.

2026.1.8-dev - 2026-10-05

Исправлено

  • Восстановлена обязательная запись версии и миграции после удаления значков README в 3904dc3e84.

Миграция

  • Миграция исходников проекта и данных не требуется: входящее изменение затрагивает только документацию. Повторно сконфигурируйте и соберите метаданные 2026.1.8-dev; API, настройки, протокол 0.0.68, ABI и схемы ресурсов сохранены.

2026.1.7-dev - 2026-10-05

Исправлено

  • Оценка задержки отклоняет непредставимые временные метки отправителя до изменения выборки и ограничивает опоздание перед переводом миллисекунд в наносекунды.

Миграция

  • Пересоберите нативные клиенты и серверы. Допустимые метки и настройки сохраняют смысл; формат сообщений, совместимость 0.0.68, ABI, ресурсы и сохранённые данные не меняются. Миграция вызовов или данных не требуется. Недопустимая метка вызывает Sender timestamp is outside the native clock range; проверьте оба предела знакового 64-битного числа и обычные выборки задержки.

2026.1.6-dev - 2026-10-05

Исправлено

  • Даты записи движения EN/RU исправлены на 2026-10-05 UTC.

Миграция

  • Пересоберите метаданные версии; для обновления с 2026.1.4-dev выполните миграцию движения ниже. Выполнение и данные не меняются.

2026.1.5-dev - 2026-10-05

Изменено

  • Движение с удержанием направления трассирует и продлевает планы, меняет их при поворотах и может скользить вдоль препятствий. Пошаговые аренды ограничивают продолжение движения на сервере и у наблюдателей при задержке связи управляющего клиента.
  • Общая синхронизация движения измеряет обычное время передачи, догоняет опоздавшие планы и присоединяет план на уже пройденном шаге. Это затрагивает и движение по клику; поиск пути к выбранной точке сохраняется. Наблюдатель может плавно догонять движение вместо немедленного скачка. См. движение и сетевую модель.
  • Регрессионный тест хеша сборки размещает настоящие CMake helpers рядом с временным проектом и поддерживает checkout и временный каталог Windows на разных дисках.

Миграция

  • Обновите сервер, управляющие клиенты и наблюдателей вместе. SendCritterMoveLease и CritterMoveLease расширяют сетевой протокол; маркер совместимости повышен с 0.0.66 до 0.0.68. Повторно сконфигурируйте и соберите нативные приложения и библиотеки runtime, перепеките обе стороны из одной ревизии исходников. Не обходите проверку совместимости ради смешанных ревизий. Это изменение движения не переименовывает сохраняемые свойства/прототипы и не требует преобразования сохранений.
  • Проверьте новые Network.LinkDelayWindowMs, Network.LinkDelayRebaseMs, Network.MoveLateCatchUpMinMs, Network.MoveLateCatchUpMaxMs и Network.MovePlanJoinMaxSteps во всех затронутых конфигурациях. Смысл прежних настроек сохранён. Ищите точные ключи в исходниках конфигурации; отсутствующий ключ получает документированное значение по умолчанию. Нулевой предел присоединения отключает его.
  • Проверьте новые Client.DirectMoveTraceSteps, Client.DirectMoveExtendAheadSteps, Client.DirectMoveLeaseSteps, Client.DirectMoveLeaseRenewSteps, Client.DirectMoveRetargetMinMs, Client.DirectMoveRetargetImmediateAngle и Client.DirectMoveSlide. Пределы продления/возобновления должны быть меньше пределов трассы/аренды. Переписывать заданные точки движения и обычные вызовы движения по клику не требуется.
  • Проверьте новые Client.MoveCatchUpRate и Client.MoveCatchUpSmoothMaxMs для воспроизведения движения наблюдателем. Перегенерируйте API скриптов и справочник настроек, скомпилируйте затронутые скрипты; все четырнадцать дополнений — настройки только для чтения, а не изменяемое состояние скриптов.
  • Проверьте движение прямо с удержанием направления, повороты, остановку и края препятствий управляющим и наблюдающим клиентами, затем обычные цели по клику и прерывания. Повторите с задержкой, джиттером и зависанием передачи, проверяя истечение аренды и согласование поздних планов. Для диагностики доступна прежняя Network.MoveSyncTrace; вне диагностических запусков она должна быть выключена. Проверка поведения и проверка производительности имеют отдельные результаты.
  • В копии тестового проекта хеша сборки размещайте три настоящих CMake helper-файла рядом с ним вместо относительного пути через границу дисков. Поведение маркеров в производственной сборке не меняется.
  • Перегенерируйте конфигурации MinimalMultiplayer, ContentShowcase и PackagingMatrix их владельцами generate_config.py, чтобы включить четырнадцать настроек движения. Реестр нативных тестов включает Test_LinkDelay.cpp; проверки двуязычной документации и примеров теперь учитывают две страницы политики версий.
  • Потребители поиска документации должны учитывать проверенный max_bytes манифеста для каждой локали, повышенный с 1 835 008 до 1 867 776 байт ради полного корпуса движения/настроек и миграции. Состав документов, правила токенов и отказ при превышении лимита сохранены; лимит полного контекста для ИИ не меняется.

2026.1.4-dev - 2026-10-04

Исправлено

  • Установка POSIX-обработчиков сбоев и повторное возбуждение сигнала с действием по умолчанию компилируются, когда операции над наборами сигналов в Darwin SDK заданы функциональными макросами. Пять вызовов сохраняют маски, флаги и значения сигналов; прежнее поведение функций в Linux сохранено.

Миграция

  • После обновления ревизии движка пересоберите затронутые нативные цели macOS. API проекта, настройки, сохранённые данные, ABI, протокол и формат ресурсов не меняются, поэтому миграция вызывающего кода и данных не требуется.

2026.1.3-dev - 2026-10-04

Исправлено

  • Тест документации конфигурации и инструментов учитывает все 194 обязательных актуальных перевода, включая страницы правил версий и истории изменений. Требования точного списка, отсутствия пропущенных переводов и полной локализации сохранены.
  • Оба руководства по переводу документации показывают тот же актуальный список страниц, что и сгенерированная модель локализации.

Миграция

  • Миграция проекта и преобразование данных не требуются: изменяются только документация и ожидания её теста. API игры, настройки, сохранённые свойства, нативный ABI, совместимость сети и форматы ресурсов сохраняют действующие контракты.

2026.1.2-dev - 2026-10-04

Исправлено

  • Хранилище сохранённого нативного контекста трассировки стека в macOS теперь вмещает контекст libunwind из SDK. Выравнивание на шестнадцать байт сохранено; остальные поддерживаемые платформы сохраняют прежний размер хранилища.
  • Форматирование нативных и управляемых исходников и поясняющие комментарии приведены к действующим проверкам стиля. Английское и русское руководства по отладке описывают границу платформенного контекста.
  • Проверки полноты документации учитывают новые страницы правил версий и истории изменений и их нормативные примеры, сохраняя точный список документов и контроль полноты.

Миграция

  • API игры, настройки, сохранённые свойства, протокол, ABI и формат ресурсов не заменяются. Существующие допустимые входные данные и маркеры совместимости выполнения сохраняют смысл, поэтому миграция данных проекта не требуется.
  • После обновления ревизии движка повторно сконфигурируйте и соберите нативные цели. Компиляция macOS должна использовать её SDK для проверки утверждения о размере сохранённого контекста; тесты Linux не подтверждают эту ветку macOS. Версия проекта и хеши сборок пакетов/обновления клиента остаются под управлением проекта.

2026.1.1-dev - 2026-10-04

Добавлено

  • CalVer движка из VERSION проверяется при конфигурации CMake, встраивается в FO_ENGINE_VERSION и выводится в логах запуска нативных приложений. FO_ENGINE_REVISION содержит SHA Engine и отметку -dirty при изменении отслеживаемых файлов отдельно от хеша сборки игрового проекта.
  • Ссылка версии в документации открывает эту историю изменений на выбранном языке. Данные навигации и маршрутов, а также данные для ИИ получают версию движка из того же исходного файла.
  • Двуязычные заметки и проверки выпуска задают владельца значимых для разработчиков изменений и обязательных инструкций миграции.

Изменено

  • Поддержка только актуального API Engine сохраняет первоначальный смысл существующих значений. Замены удаляют старый API и обеспечивают явные ошибки компиляции/перепекания/валидации и исчерпывающие двуязычные миграции; существующее преобразование сохранённых свойств через MigrationRule остаётся узким исключением.
  • Каждый опубликованный шаг master увеличивает minor и фиксирует год/дату UTC; релизные линии сохраняют год/major/minor среза и увеличивают patch, используя -rc при стабилизации. Правки только документации, CI, тесты и зависимости тоже учитываются.

  • Историческая заглушка 2022.1.0.wip в VERSION заменена идентификатором разработки в формате CalVer. Существующие исторические аннотации API Since сохраняют прежние значения.

Миграция

  • Ограничение полного контекста увеличено с 2 162 688 до 2 195 456 байт, чтобы включить полные обязательные правила обновления/миграции. Потребители данных документации учитывают объявленный full_context.max_bytes, а не фиксированный прежний буфер; включение документов целиком и проверка превышения лимита сохранены.

  • Прежняя черновая нотация YYYY.M.PATCH заменена. Используйте YEAR.MAJOR.MINOR-dev в master и YEAR.MAJOR.MINOR.PATCH[-rc] в release/YEAR.MAJOR; major — номер линии, месяц записан в дате заметки. Первое принятие политики задаёт 2026.1.1-dev. Потребители прежнего синтаксиса версии должны принимать эти точные формы и отвергать прежние суффиксы/окончательные трёхпольные версии; общий парсер — BuildTools/engine_version.py. Перед обновлением выполните полный список обновления, последовательность среза релиза и запись миграции.

  • Политика версий в манифесте документации теперь использует схему версии 3 и объявляет engine: {scheme: calver, source: VERSION, master_format: YEAR.MAJOR.MINOR-dev, release_format: YEAR.MAJOR.MINOR.PATCH[-rc]}. Собственные потребители, перегенерирующие эти артефакты, должны включить эту политику и предоставить файл VERSION движка. Обновляемая документация по-прежнему соответствует master.
  • Повторно сконфигурируйте и соберите нативные бинарники, чтобы получить идентификаторы движка. Версия игры, хеши сборок пакетов и обновления клиента, хеш совместимости выполнения, версии ABI и схем ресурсов сохраняют свои контракты; это изменение не требует миграции данных или повышения версии схемы ресурсов.

Предыдущая история

Поддерживаемый журнал начинается с подключения версии движка. Предыдущая работа доступна в истории репозитория и реестре изменений контрактов конкретных ревизий. Это свидетельства аудита, а не восстановленная последовательность опубликованных выпусков Engine.

Введите запрос.