d4adbb1e47
build / mod (push) Failing after 18s
Share read-only scene data for smoke and displayed blasts; preserve cold ejection and flight-relative recording samples. Keep finite typed depot inventory, expose per-world smoke readiness through the pinned API26 engine, and invalidate presentation resources on world changes. Validation: core suite 156 unit tests plus 4 scenarios and the new targeted recording regression; adapter 50 unit tests, boundary check and 4 scenarios; real WASM contract 16 steps; asset pipeline and bounds checks; macOS Metal client build and HD frame. Co-Authored-By: Codex <noreply@openai.com>
63 lines
5.5 KiB
Markdown
63 lines
5.5 KiB
Markdown
# Закреплённый движок AirDef
|
||
|
||
Движок: https://gitea.maoniao.team/chexit/horizon-airdef, ветка `airdef`.
|
||
AirDef хранит точный SHA как gitlink `horizon/`; новый push движка не меняет старые сборки мода.
|
||
История upstream и всех 44 прежних патчей сохранена в форке. Старые patch-файлы и HORIZON_COMMIT
|
||
доступны в истории AirDef и больше не являются вторым источником движка. Baseline описан в AIRDEF-FORK.md.
|
||
|
||
## Windows: обновление и запуск
|
||
|
||
```powershell
|
||
git fetch origin
|
||
git switch kimi-work
|
||
git pull --ff-only
|
||
python tools/airdef.py all
|
||
python tools/airdef.py play
|
||
```
|
||
|
||
Первое клонирование: `git clone --recurse-submodules https://gitea.maoniao.team/chexit/airdef.git`.
|
||
Обычный clone тоже поддерживается: `python tools/airdef.py fork` или команда submodule выше.
|
||
`all` инициализирует зависимость сам, включая переход со старой папки `horizon/`.
|
||
Для чистого checkout можно отдельно выполнить `git submodule update --init --recursive`. Нужны Git, Python и Rust согласно INSTALL.md.
|
||
Сборка клиента и мод устанавливаются в обычное место; ресурсы Minecraft готовятся отдельно по INSTALL.md.
|
||
|
||
При первом переходе со старого отдельного clone `horizon/` скрипт сохраняет его Git-историю и ветки,
|
||
переводит в сабмодуль и получает закреплённый SHA. Если там есть изменения при другом SHA,
|
||
обновление останавливается с объяснением: сначала закоммитьте/сохраните свои изменения.
|
||
Скрипт не выполняет reset --hard или clean. Чистый checkout может остаться detached HEAD — это нормально для зависимости.
|
||
|
||
## Изменение движка
|
||
|
||
1. В `horizon/` создать рабочую ветку от закреплённого SHA. Проверить изменение и push в репозиторий движка.
|
||
2. В AirDef выполнить `git add horizon`, проверить мод/игру, коммитить обновление gitlink отдельно.
|
||
3. Push AirDef выполняется после движка. Не коммитить Git URL с токенами.
|
||
4. Для возврата выбрать прежний commit AirDef и выполнить `git submodule update --init --recursive`.
|
||
|
||
Упаковщик собирается repo-local в `.horizon-cache/packer/<engine-identity>/`, глобальный
|
||
`cargo-horizon-mod` не используется. Изменения tracked-исходников движка входят в identity.
|
||
Рядом с airdef.hmod записывается build-identity.json: SHA AirDef, pin/identity движка,
|
||
SHA256 WIT и артефакта. API-диагностика остаётся в `python tools/airdef.py check`.
|
||
Нативные тесты не заменяют отдельную игровую проверку графики, звука и экспорта.
|
||
|
||
## Проверка настоящего WASM
|
||
|
||
`python tools/airdef.py test-wasm` собирает `.hmod` и запускает `tests/*.toml` в настоящем
|
||
runtime закреплённого движка. Используется временное storage; игровые миры не нужны.
|
||
Сценарий проверяет загрузку/регистрацию команды, два комплекса, налёт, tick/frame,
|
||
выход из мира и перезагрузку мода. Действуют лимиты runtime: 64 MiB linear memory,
|
||
300 млн fuel на tick, 10 млн на frame, 1 млрд на event, 2 млрд на init.
|
||
Это проверка ABI и fallback при отсутствии render replies; она не измеряет GPU,
|
||
не подтверждает акустику/MP4 и не заменяет максимальный боевой полигон.
|
||
|
||
В CI проверка assets входит в лёгкий build. Wasmtime tier вынесен в ручной workflow
|
||
`wasm-contract`, чтобы не компилировать тяжёлый runtime на каждом push слабого общего runner.
|
||
|
||
## Готовность объёмного дыма (API 26)
|
||
|
||
`render.smoke-status` разделяет доступность API, включённый режим, принятую отправку этого мода
|
||
и готовность smoke/fog пути последнего подготовленного основного кадра. Возвращаются поколение мира
|
||
и причина (`awaiting-frame`, `disabled`, `path-unavailable`, `ready`). AirDef убирает обычный дым
|
||
только когда выполнены все четыре условия; после смены мира старые сегменты и часы очищаются.
|
||
Это подтверждение выбранного пути рендера, а не завершения GPU или видимости каждого сегмента.
|
||
Для акустики и capture аналогичное подтверждение этим API не реализовано.
|