Обновлено:

На этой странице

Готовность мира и уведомление хода

Дата: 28 октября 2026. Изменение интерфейса; правила партии, формат сохранений и поток RNG не изменены.

Требования

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

Причина и изменение

Прежний start() скрывал загрузчик сразу после первого синхронного render(). Затем ещё выполнялись расположение камеры, дополнительная отрисовка, загрузка цветного курсора выбранного юнита и спрайтов рабочего/укреплённого юнита. При тёплом кэше последовательность быстрых Promise также не гарантировала браузеру кадр перед чтением JSON, восстановлением сохранения и расчётом видимой карты.

Новая фабрика src/runtime/readiness.mjs отдельно владеет готовностью запуска. Перед тяжёлыми этапами она обновляет подпись и даёт браузеру нарисовать статус через два requestAnimationFrame. В фоновой вкладке и Node используется продолжение через таймер без ожидания приостановленного RAF. Фиксированной многосекундной задержки нет.

Фазы: получение и чтение правил/каталога, восстановление партии, расчёт видимой карты, изображения, интерфейс, камера и первый завершённый кадр. Процент изображений соответствует числу фактически загруженных записей. Остальные проценты обозначают этапы запуска и не являются оценкой оставшегося времени.

После первого render и расположения камеры completeStartup() ждёт текущую презентацию, очереди ImageStore.pending, повторно рисует карту и проверяет новые запросы изображений от самой отрисовки. Необязательный отсутствующий спрайт получает прежнее запасное отображение, а завершившийся отказ не превращается в бесконечную загрузку. Критическая ошибка запуска сохраняет видимое сообщение об ошибке и отклоняет публичный ready.

После последнего кадра фабрика разблокирует интерфейс, выполняет финальный render и скрывает загрузчик. Публичные ready и whenIdle сохраняются. Если сохранение сделано во время ИИ, готовая карта открывается с уведомлением хода, а ready по-прежнему ждёт окончания runAITurn(). Человеческое обязательное решение не удерживает загрузчик.

Уведомление другой стороны

Отдельный #turnStatus имеет role=status, aria-live=polite, aria-atomic=true. Название берётся из текущего state.players, а не запоминается при запуске. Поддерживаются подписи расчёта действий, завершения хода, перемещения, боя и выбора решения. При смене стороны имя/фаза обновляются; при ходе человека и при победе баннер скрывается. Стиль ограничен небольшим блоком сверху по центру, не принимает нажатия и не вводит новую анимацию.

updateTurnStatus() меняет только текст и атрибуты блока. Он не перерисовывает карту и не сбрасывает анимации. В ai-turn.mjs статус получает кадр перед первыми расчётами, перед тяжёлым END_TURN и при смене игрока. Существующие уступки потоку и ожидания презентаций сохранены. Исключение первого render теперь также попадает в очистку флага busy.

Проверки

python3 scripts/run-limited.py -- node tests/readiness.test.mjs: девять проверок проходят на исходных модулях. Подтверждены кадр перед продолжением, ожидание поздней загрузки изображений, запасное отображение после отказа изображения, сохранение загрузчика при ошибке render, имена/фазы без перерисовки, фоновая вкладка, точное равенство фактического хода ИИ чистым командам ядра, освобождение busy при исключении и полнота requiredPorts.

tests/browser-readiness.cjs подготовлен для последовательного запуска интегратором после общей сборки. Сценарии: холодный и тёплый запуск с настоящим кэшем изображений, фактически нарисованные подписи фаз, пустая очередь видимых изображений к готовности, сохранение во время ИИ, импорт такой партии, совпадение activePlayerId баннера с реальной партией, исчезновение баннера, человеческий обязательный выбор, неверный импорт и недоступные правила. Драйвер использует изолированные браузерные хранилища и не меняет пользовательскую партию. Результат после запуска: data/browser-readiness-verification.json.

Статус на момент передачи интегратору: исходники и девять проверок готовы; общий браузерный прогон и публикацию выполняет интегратор. Чекбоксы пользовательского документа заметок отмечаются только интегратором после проверенной публикации.

Границы

Это индикация фактических этапов, а не перенос синхронного движка в Worker. Отдельный очень тяжёлый вызов правил всё ещё занимает главный поток, но до него браузер успевает показать актуальный статус. Прогресс внутри одного синхронного расчёта не выдумывается. Обработка файлов вручную сохраняет прежний контракт импорта; при импорте партии с ИИ используется тот же баннер хода. Звук и музыка не входят в критерий готовности мира.

Итог интеграционной проверки v0.9.0

Опубликовано28.10.2026 в04:32 МСК, код bd5314f4a3a8d843. Соответствующий реальный Chromium-сценарий прошёл локально и на основном HTTPS-сайте. Проверяется выполнение действий и состояние, а не только наличие DOM-элементов. Текущий публичный отчёт. Сверка138 опубликованных файлов не нашла расхождений; восемь статических файлов независимых сервисов сохранены. Совпадение поведения Windows-оригинала за пределами явно перечисленных свидетельств не заявляется.