Обновлено:

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

Исходная музыка и favicon

Дата подготовки: 2026-10-28. Изменения предназначены для интеграции в 0.9; отдельная публикация агентом не выполнялась.

Дополнение после 0.9.0: общий переключатель заменяется независимыми ползунками в окне «Параметры». Ниже сохранено описание первоначальной интеграции; актуальный контракт хранения, громкости, жестов и сетки — Параметры: громкость и сетка карты.

Ресурсы и происхождение

scripts/prepare-native-music.py копирует 17 MP3 из установленной игры Original Sources/CIV3ATL2/Sounds/build/ без перекодирования, нормализации или изменения байтов: пять из ancient, пять из Middle Ages и семь из IndModern. Общий объём — 87 182 160 байт. Для каждой записи манифест содержит исходный относительный путь, размер, SHA-256, эпохи и проверенный заголовок MPEG-1 Layer III. Заголовок проверяется по двум последовательным кадрам. Полное декодирование всех файлов этой проверкой не утверждается.

Исходные папки определяют эпохи: ancient → 0, Middle Ages → 1, IndModern → 2 и 3. В этой поставке отдельной базовой папки современной эпохи нет. Конкретный порядок воспроизведения детерминирован именами файлов; оригинальный Windows-порядок и правила выбора музыки по культурной группе не воспроизводятся. Сценарные и дипломатические треки Conquests не смешиваются с фоновой музыкой базовой партии.

В поставке также есть папки Заменённые/ с 836-байтными заменителями. Они не используются. Экспортёр отвергает слишком короткие записи. WAV остаются звуковыми эффектами существующего Web Audio проигрывателя, AMB — описаниями событий с ссылками на WAV; их не пытаются проигрывать как музыку. MP3 уже пригодны для потокового HTMLAudio, поэтому перекодирование и новые зависимости не требуются.

Favicon упакован из настоящей группы RT_GROUP_ICON и соответствующих RT_ICON в Civilization3.exe: исходные изображения 16×16 и 32×32, 8 бит. Экспортёр только переводит ссылки группы на ICO-смещения, копируя сами изображения без изменения. Результат — земной шар и золотая III из исходной игры. Перерисовки и генерации изображения нет. Манифест содержит SHA-256 исполнимого файла, группу/язык ресурсов, размеры изображений и SHA-256 результата. Иконка Conquests в этой поставке имеет лишь 32×32/4-bit, поэтому выбрана базовая, содержащая собственный 16px вариант.

Поведение в браузере

src/media/background-music.mjs владеет одним HTMLAudio на время страницы. При запуске запрашивается только небольшой JSON-манифест; экземпляр Audio, запрос MP3 и вызов play отсутствуют до жеста пользователя. Сохранённое civilization-sound-enabled читается существующим runtime/resources.mjs; общая кнопка звука управляет и эффектами, и музыкой. Исходное значение остаётся выключенным. Для включённого сохранённого предпочтения музыка начинается после первого pointerdown/keydown. Громкость музыки — 0.12.

Браузер получает только текущий MP3; preload=none, скачивания всех 17 файлов, JS-декодирования музыки в большой PCM-массив и отдельного параллельного музыкального кеша нет. Воспроизведение не связано с render, ходом, показом города и другими окнами. Повторные жесты не переустанавливают src и не сбрасывают время. Mute ставит текущую запись на паузу, включение продолжает её с той же позиции. Защита поколения не позволяет позднему завершению play включить звук после mute.

После ended выбирается следующая запись актуальной эпохи человека, а в конце списка воспроизведение повторяется. При смене эпохи текущая музыка доигрывает, следующая запись относится уже к новой эпохе. Переход между MP3 может иметь короткий сетевой промежуток: точный gapless Windows-оригинала не заявлен. При новой загрузке страницы/сохранения позиция музыки не сохраняется; игровые сохранения и PRNG не затрагиваются.

Ошибки manifest, MediaError и rejected play обработаны без остановки игры. Ошибочная/неподдерживаемая запись исключается до конца страницы, при исчерпании подходящей эпохи разрешён переход к другим имеющимся оригинальным трекам. При исчерпании всего набора проигрыватель молчит, бесконечного цикла запросов нет. NotAllowedError сохраняет запись и допускает повтор только при новом жесте. Совместимость фактического декодера и слышимая громкость зависят от браузера; проверка в браузере интегратором выполняется отдельно.

Интеграция и проверки

Экспорт ресурсов выполняется интегратором вне чужого браузерного прогона:

python3 scripts/run-limited.py -- python3 scripts/prepare-native-music.py --output-dir dist/assets/native-music

Ресурсы находятся в assets/native-music/, поэтому существующий игровой публикатор включает MP3, ICO и manifest без добавления их в список юнитных эффектов original-assets.json. В src/index.html требуется:

<link rel="icon" type="image/x-icon" href="./assets/native-music/civ3.ico">

Изолированные проверки исходников и экспортёра:

python3 scripts/run-limited.py -- node tests/background-music.test.mjs
python3 scripts/run-limited.py -- python3 -m unittest discover -s tests -p test_native_music.py

Семь JS-проверок охватывают первый жест/ленивую загрузку, сохранность текущей записи и времени, mute/resume, цикл и смену эпохи, отсутствующие и неподдерживаемые файлы, autoplay rejection, гонки mute с pending play/manifest и неправильные URL. Три Python-проверки сверяют все 17 файлов побайтово и по SHA-256, MPEG-заголовки, настоящее содержимое PE-ресурсов в ICO, чтение 16/32px ICO через Pillow, отбрасывание повреждённых PE и короткого заменителя.

Краткий вывод фактического runtime доступен через существующий resourceUsage().music: enabled/unlocked/playing, текущая запись и время, число неудачных записей, громкость, блокировка autoplay и число успешных запусков. Полный браузерный прогон и публичная проверка относятся к общей интеграции.

Для интегратора подготовлен tests/browser-native-music.cjs; агент его не запускал. Команда: python3 scripts/run-limited.py -- node tests/browser-native-music.cjs, для публичной проверки передать CIV3_BROWSER_URL=https://vm.ya-erm.ru/civilization/. Драйвер проверяет настоящее декодирование MP3/ICO, исходный SHA-256 ICO, один текущий MP3, рост времени при неизменном треке после команды/рендера, mute/resume, обе сохранённые настройки после reload, новый обязательный жест и отсутствие предупреждений autoplay. Отчёт сохраняется в research/original-game/data/browser-native-music-verification.json. Прерывание HTTP-запроса MP3 при навигации учитывается отдельно как ожидаемое; остальные неудачные запросы и ошибки страницы отклоняют проверку. Локальный сервер поддерживает Range и передаёт MP3 потоком.

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

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