# Ход ИИ, город, настройки и версии

Опубликовано в основной игре: **v0.3.0**, 28.10.2026 00:48 МСК, код `45a48324f9eb65da`. Патч v0.1.2 в 00:30 убрал лишние запятые из вертикального списка ресурсов. Предыдущий пакет v0.1.0 опубликован в 00:22 МСК. Эти изменения продолжают основной план; полный MVP и сходство всех экранов с Windows ещё не завершены.

## Измеренная задержка хода

На фиксированном сохранении двух цивилизаций выполнены два одинаковых прогона до и после изменения. В каждом ИИ исполняет девять команд, включая пять перемещений; четыре из них видны человеку. Состояние мира и PRNG после браузерного хода точно сравнивается с исполнением тех же команд ядром.

| Величина | До | После, локальный повтор |
|---|---:|---:|
| Полный ход ИИ, холодный прогон | 3046 мс | 1072 мс |
| Повтор с загруженными ресурсами | 2979 мс | 1077 мс |
| Ожидание представления | 2647–2661 мс | 727–747 мс |
| Выбор команды + исполнение | 256–296 мс | 247–264 мс |

Основная задержка этого случая — последовательное ожидание полных циклов Run, а не повторный расчёт партии или загрузка JSON. Для движений ИИ показ одного шага ограничен 180 мс; время кадров масштабируется, чтобы показать весь исходный цикл. Собственные ручные перемещения и бой сохраняют прежнюю длительность. Во время движения обновление идёт примерно 30 раз/с вместо прежних восьми. Результат партии не зависит от анимации. Это замер конкретной небольшой партии на сервере с ограничением CPU, а не обещание трёхкратного ускорения любой карты.

Скрытые перемещения не создают представление и не загружают Run. Прогон пяти перемещений за туманом занял 277 мс, на неизвестной территории — 365 мс; ожидание представления составило 0–0,2 мс, число показанных перемещений и боёв — ноль. Для чужого боя добавлена проверка текущей видимости обоих участников: одного факта разведанной местности недостаточно. Скрытый бой не вызывает подготовку изображений/звука и центрирование камеры. Собственный участник позволяет показывать бой даже после его гибели в итоговом состоянии.

В модуле приложения доступен `lastAITurnProfile()`: выбор команд, исполнение, запись сохранения, отрисовка, ожидание представления, число показанных шагов/боёв и полная длительность. Диагностика не пишет в игровые правила или PRNG.

## Город и строительство

Городской экран теперь содержит большую карту окрестностей, исходные головы жителей, здания и ресурсы, пищу/щиты/бюджет и картинку заказа. Текстура бумаги и атлас 160 голов извлечены из исходной поставки. Щелчки по обрабатываемой клетке и головам выполняют общую команду назначения жителей; прежние производство, очередь, ускорение, призыв и губернатор сохранены в нижних панелях. Пол и ряд сопротивляющихся голов пока оформительские: их точное соответствие Windows отдельно не подтверждено.

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

В губернаторе появился пункт **«К этому и новым городам»**. Настройки применяются только к выбранному существующему городу и сохраняются в личном шаблоне игрока. Их наследуют основанные и присоединённые города, включая военный захват и культурное присоединение. Копии независимы; изменение одного города не переписывает шаблон или соседние города. Шаблон входит в собственное сохранение; старые партии без него загружаются как прежде. Это обратимо совместимое необязательное поле схемы 27 с явной проверкой содержимого, без изменения старых данных при загрузке.

## Графика и звук

Для 126 поддерживаемых наземных типов проверены Default/Run во всех четырёх эпохах через исходные привязки INI. Повторно используются точные исходные файлы, когда один тип ссылается на графику другого. Браузерный локальный прогон проверил 234 уникальных атласа, восемь направлений и две палитры. Это не поддержка всех действий всех 413 типов; нестандартный INI Leclerc остаётся в явной диагностике. В v0.1.1 каталог содержал 745 основных графических ресурсов, 343 атласа анимации, 688 цветовых вариантов и 672 WAV. Загружаются по потребности.

Дороги заменены линиями из исходного **Art/Terrain/ROADS.PCX** на 256 вариантов 128×64 с маской NE/E/SE/S/SW/W/NW/N. В базовой и Conquests-поставках этот файл побайтово одинаков. На железной дороге дорожный слой подавлен. Проверены шов зацикленной карты и запрет соединения с неизвестной клеткой. Исходная графика сохранена без перерисовки.

Выбор «звук включён/выключен» хранится отдельно в браузере и восстанавливается после перезагрузки. Ограничение браузера на автоматический звук снимается следующим действием пользователя; оно не задерживает загрузку мира.

## Публикация

В шапке показаны SemVer и время публикации по Москве. `version-game.py --bump patch|minor|major` задаёт повышение версии; новый код при случайном повторении опубликованного номера автоматически повышает patch. Внутренний хеш сохранён отдельно для кэширования. Публикатор ставит время; повторная выкладка той же версии сохраняет исходное время и ETag неизменённых файлов.

Проверены DOM, шесть случаев представления движения/видимости, 23 проверки управления городом, три проверки картографического слоя, браузер города с точными командами и браузерные прогоны хода/звука. Публичные итоговые проверки и полная партия выполняются отдельно и сохраняются в отчётах; исторические 664 проверки не выдаются за свежий прогон новой сборки.

- [Ход ИИ, скрытые шаги и звук](data/browser-interturn-performance-verification.json)
- [Город и фильтр строительства](data/browser-native-city-verification.json)
- [Полное покрытие подготовленных Default/Run](data/browser-native-unit-coverage-verification.json)

![Исходные дороги на карте](data/native-road-network.png)

![Городской экран](data/native-city-overview.png)

Дерево технологий с позициями BIQ и новый торговый экран остаются следующими пользовательскими задачами.


## v0.2.0: правая панель производства и выработка клеток

Нижний блок выбора производства удалён. Кнопка в правой панели открывает список вверх. Строка содержит исходную маленькую иконку, название, стоимость в щитах и число ходов при текущей выработке; при беспорядках/нуле щитов показано отсутствие выработки. Щелчок выполняет обычную команду производства и закрывает список. Клавиатурный фокус позволяет проверить характеристики перед подтверждением, Shift+щелчок добавляет заказ в очередь. Категории, очередь, ускорение и призыв сохранены справа. По Escape и щелчку вне списка он закрывается.

Подготовлены 126 маленьких исходных Civilopedia-иконок без перерисовки; список не декодирует большие полные атласы Run/Default ради каждой строки. Каталог теперь содержит 871 основной графический ресурс. Пользовательские типы используют подходящую иконку исходного графического типа при наличии.

На городской карте видны еда, щиты и торговля на центре и реально обрабатываемых клетках. Исправлена причина пустого рисунка: прежние HTML-изображения не попадали в canvas-хранилище. Семь маленьких изображений теперь готовы вместе с картой, а значки увеличены. Браузер сверяет суммы клеток с общей городской экономикой и проверяет число фактически нарисованных значков. Назначение/освобождение жителя по клетке обновляет выработку через ядро.

Городская плашка и политический пунктир берут один цвет `player.color`; правило одинаково для собственных и известных чужих городов. Чужие рост и заказ по-прежнему не раскрываются.

Добавлены логи консоли с префиксом `[Civ3]`: старт/готовность, команды/отказы/события, ход ИИ и его время, ошибки изображений и необработанные ошибки страницы. Нет вывода на каждый кадр или полного содержимого сохранения. Подробные команды ИИ используют уровень debug. `civilizationDebug.history()` возвращает последние 200 записей, `.snapshot()` — компактное состояние и использование ресурсов, `.setEnabled(false)` отключает журнал с сохранением предпочтения.

В v0.1.1 прошли все **643 JS-проверки**, DOM и шесть публичных сценариев, включая полную партию: 53 команды человека, победа на 18-м ходу, точная загрузка результата. Патч v0.1.2 повторно проверен DOM и Chromium; 66 файлов ядра/представления совпали с v0.1.1 после нормализации импортов. Повторная публикация v0.1.2 изменила ноль файлов, сохранила номер и время. Для v0.2.0 прошли DOM и локальный/публичный городской сценарий; полная партия через новое меню тоже пройдена: 53 команды человека, победа на 18-м ходу, точное продолжение после сохранения.

![Правое меню производства](data/city-production-upward-menu.png)

![Ресурсы без лишних запятых](data/city-resources-without-commas.png)


## v0.3.0: карточка текущего заказа и справка о постройках

Отдельная кнопка изменения заказа удалена. Меню вверх открывает сама карточка текущего заказа, включая изображение и запасы щитов. В видимой стоимости и текущем заказе вместо «щ.» используются исходные значки щита.

Исправлено отсутствие картинки здания: крупное исходное изображение лениво загружается в canvas-хранилище и затем рисуется в карточке. При позднем завершении загрузки прежнего заказа проверяется актуальный город, поэтому старая картинка не подменяет новый заказ. Подготовлены восемь исходных крупных портретов; всего в каталоге 879 основных графических ресурсов.

В построенных зданиях слева, строках меню и карточке здания есть подсказки о действии постройки. Правый щелчок открывает справочную статью: исходное изображение, производство/культура/настроение/защита и другие используемые признаки, содержание, технологические и прочие требования, устаревание. Текст извлекается из текущего профиля Atlants. Это справка по исполняемым данным, а не полный импорт оригинальной Civilopedia. Для юнитов в меню доступна краткая статья с базовыми характеристиками и требуемой технологией.

Локальная проверка Chromium подтверждает действие карточки, фактическую прорисовку портрета кузницы, замену сокращения значком, подсказку +25% производства и справку правой кнопкой без изменения партии. Выполняется повтор на основном сайте и полная партия через новый элемент управления.

![Карточка здания с изображением и щитами](data/city-building-production-card.png)

![Справка о кузнице](data/building-encyclopedia.png)


## v0.3.1: измерение долгой партии

Пользователь прислал профиль настоящего хода: всего 76420 мс, выбор команд 65517 мс, исполнение 790 мс, сохранение 198 мс, отрисовка 7627 мс, представление 747 мс. На большой карте воспроизведены дорогие HOLD. Профиль V8 выявил поиск мест поселений и обход целого континента в общих эффектах зданий при отсутствии соответствующих способностей, а также повторную расшифровку всех флагов для каждого отдельного флага.

Выполнение сделано ленивым: континент вычисляется только при континентальном эффекте, поиск поселений — когда возможен поселенец. Признаки здания вычисляются один раз на набор. Команда HOLD не вызывает полную перерисовку интерфейса; сохранение каждой команды и итоговое обновление сохранены. На отдельной карте 60×60 с 41 боевым юнитом ИИ последовательность десяти команд сократилась с 34252 до 7352 мс при ограниченном CPU. Полное итоговое состояние и PRNG совпали. Это отдельный воспроизводимый случай, а не замер пользовательского сохранения после исправления. Пройдены 44 целевые проверки и DOM; идёт весь набор JS.

Логи теперь текстовые: одна JSON-строка после метки [Civ3], без раскрываемого объекта. `copy(civilizationDebug.text())` в DevTools копирует последние 200 записей. Для каждой команды ИИ журнал содержит отдельные времена choose/execute/save/render/presentation; итог содержит число команд и пропущенных перерисовок.

Новые пользовательские задачи: подсказка местности/ресурсов/улучшений/выработки и занятого жителя при наведении на городскую карту; убрать координатный список; дерево технологий по BIQ и понятные справочные объяснения открываемых возможностей. Работы продолжаются на основном сайте.


## 28 октября, v0.4.0–v0.5.0: наука, клетки и автоматические приказы

Дерево науки использует координаты и требования TECH из BIQ, четыре эпохи, исходные значки, состояния и связи. «?» и правая кнопка объясняют предпосылки и открываемые юниты, здания и возможности. Это реализация браузерного представления, а не подтверждение точного поведения Windows-версии. На городских клетках видны подсказки по местности, ресурсам, улучшениям, занятости и общей выработке; список координат скрыт. Числа населения автоматически получают тёмный шрифт на светлом цвете владельца.

В v0.5.0 появились BUILD_ROAD_TO и EXPLORE. Приказ через туман использует предположение о проходимости неизвестных клеток, не читает скрытую местность и останавливается при обнаружении препятствия. Назначение маршрута возможно без оставшихся шагов. Рабочие сохраняют текущую работу, общий вклад и прогресс складываются; панель показывает число работников, скорость и срок. Схема сохранений 28 мигрирует прежнюю 27 только метаданными движения.

Проверены 649 JS-тестов и DOM. Локальный и публичный Chromium проверили неизвестный маршрут, нулевые шаги, два рабочих, сохранение и разведку; полная партия на основном сайте завершилась победой на 18-м ходу после 53 команд человека. Отчёт: [автоматические приказы](data/browser-automation-verification.json). Снимки: [маршрут будущего хода](data/deferred-route-into-fog.png), [совместная работа](data/cooperative-worker-progress.png).

## v0.5.1 — пакетный прогноз бюджета, опубликовано 01:41 МСК

В пользовательском ходе 135 версии v0.5.0: 96 приказов, всего 16,70 с, выбор команд 13,74 с, исполнение 0,68 с, сохранение 0,27 с, рендер 0,51 с. Анимаций не было. Даже HOLD каждый раз заново готовил все варианты бюджета.

Новый пакетный прогноз делает общее завершение работ, начисление культуры, границы и проверку торговли один раз. Распределение жителей и производство по-прежнему отдельно рассчитываются при каждом бюджете: выбор специалиста зависит от налогов и науки. Независимый прежний прогноз сохранён как эталон тестов. В одном сравнении десяти одинаковых команд опубликованной v0.5.0 и кандидата на карте 60×60 время выбора составило 5,72 и 2,57 с, полное вычисление с исполнением — 7,05 и 4,41 с. Все команды, итоговый мир и PRNG совпали; тест запускается с ограничением CPU. Это отдельная контрольная карта, не сохранение пользователя.

Повторное измерение процессорного времени выбора десяти команд: 2405,62 → 1289,69 мс (−46,4%); полное время 7020 → 4629 мс. Время ожидания ограничителя CPU в процессорное измерение не входит. [Полный отчёт сравнения](data/batched-budget-ai-comparison.json) содержит все десять приказов и времена; перед сохранением отчёта проверено глубокое равенство команд и всего итогового состояния, включая PRNG.

Все **651 JS-тест и DOM** пройдены. Пакетный прогноз побайтово не меняет исходное сохранение и совпадает с независимыми одиночными прогнозами, включая бюджетный выбор специалистов, общий прогресс рабочих, переход уровня культуры, автоматическое производство, активные/истёкшие/оборванные договоры. Локальный и публичный Chromium подтвердили точное состояние после хода, отсутствие анимации скрытых действий и сохранение звука в обоих состояниях после перезагрузки. Начальная загрузка больше не пытается запустить AudioContext до действия пользователя.

Публичная полная партия v0.5.1 также завершилась на 18-м ходу после 53 команд человека; импорт и перезагрузка законченной партии совпали точно. Проверены 80 опубликованных файлов кода/интерфейса/версии — расхождений с локальными нет.


## v0.5.2 — готовый ход и длительность своих перемещений

По скриншоту пользователя надпись пустой панели заменена на «Завершите ход», когда общее состояние хода ready; осмотр выбранного города и сведения выбранного юнита сохраняются. Готовность теперь использует ту же canReceiveOrders, что и очередь юнитов: разведка и дорога до точки считаются уже полученными приказами. Проверены и положительные остатки движения при этих автоматических приказах.

Свои автоматические перемещения при возвращении хода больше не используют ускоренный лимит 180 мс. Полный исходный Run для рабочего — 10 кадров × 66 мс = 660 мс; он также применяется к собственному маршруту при окончании хода ИИ. Чужие видимые движения сохраняют ускорение, скрытые не проигрываются. Показ не влияет на уже рассчитанный мир. Диагностика resourceUsage().movement теперь содержит владельца и фактическую/исходную длительности.

Версия опубликована в 01:47 МСК, код c9c778bcbcf26341. Пройдены 36 затронутых проверок движения/управления/показа, DOM и два локальных сценария Chromium. Проверка перехода хода сравнивает весь мир/PRNG, видимость и сохранение звука; дополнительно наблюдает собственный автоматический маршрут и проверяет 660 мс. Управление проверяет реальную надпись после последнего Hold. Публичный повтор обоих сценариев на основном сайте пройден без ошибок страницы и запросов.


## v0.5.3 — снятие выбора и панель только выбранного стека

По скриншоту 28042a22 убран режим, в котором пустой выбор разворачивал всю армию под картой. Когда юнит не выбран, контейнер приказов скрыт, список пуст; при выборе остаются юниты только его клетки. Щелчок по пустой клетке в режиме обзора устанавливает selectedId=null, не отправляя игровую команду и не меняя работу/маршрут. В режиме перемещения назначение по клетке остаётся приказом. Escape в режиме обзора также снимает выбор; прежняя отмена назначения/автоматического маршрута сохраняется. Сведения о клетке и подсказка готового хода работают независимо.

Версия 0.5.3/847a87d704fca985 опубликована в 01:50 МСК. DOM и два локальных Chromium прошли: управление теперь дополнительно проверяет пустую клетку, Escape, отсутствие списка всей армии, исчезновение/возврат кнопок и неизменность мира. Сценарий автоматических приказов подтвердил сохранённые маршруты в туман без шагов, завершение маршрута, дорогу и совместную работу, разведку и загрузку. Публичные управление и полная партия пройдены: 53 команды человека, победа на 18-м ходу, импорт и перезагрузка результата совпали точно. Ошибок страницы/запросов нет. [Снимок пустого выбора](data/empty-unit-selection.png).
