From 0937ac9e05784283d171ddea0678d01a2652c898 Mon Sep 17 00:00:00 2001 From: chexit Date: Wed, 4 Nov 2026 20:37:26 +0300 Subject: [PATCH] fix: keep the P1-SUN motor voice at its played 1.6 pitch The old engine_voice returned early for flame == 0 with (DRONE_LANCET, 0.8, 1.6), so the later `P1sun => 1.7` match arm was unreachable. The catalog migration mistook that arm for the played value and stored 1.7, which changed the interceptor drone's flight sound. specs.json is back to 1.6 and specs_generated.rs is regenerated. Adds missile_engine_voices_keep_their_played_values, pinning P1-SUN to (DRONE_LANCET, 0.8, 1.6) and M48N6 to (MISSILE_FLIGHT, 1.0, 0.88). The continuation and handoff text now describe the early return instead of the dead arm, and tools/airdef_assets/catalog.py gets its final newline back. Verified: gen_catalog --check and test_gen_assets, core release 195 passed + 8 scenarios (7 ignored), adapter 64 unit + 1 boundary + 5 scenarios, WASM contract 27 steps. --- airdef-mod/src/sim/specs_generated.rs | 2 +- airdef-mod/src/sim/voices.rs | 14 ++++++++++++++ catalog/specs.json | 2 +- docs/CODEX-HANDOFF.md | 6 +++--- docs/CONTINUATION-2026-11-04.md | 12 +++++++----- tools/airdef_assets/catalog.py | 2 +- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/airdef-mod/src/sim/specs_generated.rs b/airdef-mod/src/sim/specs_generated.rs index 527d53c..7822424 100644 --- a/airdef-mod/src/sim/specs_generated.rs +++ b/airdef-mod/src/sim/specs_generated.rs @@ -452,7 +452,7 @@ const MISSILE_SPEC_P1SUN: MissileSpec = MissileSpec { rear: 10.0, seeker: 60.0, launch_sound: sound::DRONE_LANCET, - voice: (sound::DRONE_LANCET, 0.8, 1.7), + voice: (sound::DRONE_LANCET, 0.8, 1.6), }; impl DroneKind { diff --git a/airdef-mod/src/sim/voices.rs b/airdef-mod/src/sim/voices.rs index d15d6dd..71eeec4 100644 --- a/airdef-mod/src/sim/voices.rs +++ b/airdef-mod/src/sim/voices.rs @@ -25,3 +25,17 @@ impl MissileKind { self.spec().cold } } + +#[cfg(test)] +mod tests { + use super::*; + use super::super::catalog::sound; + + /// The catalog holds the voice that is actually played. P1-SUN has no flame, so it uses the + /// Lancet voice at 1.6; its old `P1sun => 1.7` match arm was unreachable behind `flame == 0`. + #[test] + fn missile_engine_voices_keep_their_played_values() { + assert_eq!(MissileKind::P1sun.engine_voice(), (sound::DRONE_LANCET, 0.8, 1.6)); + assert_eq!(MissileKind::M48n6.engine_voice(), (sound::MISSILE_FLIGHT, 1.0, 0.88)); + } +} diff --git a/catalog/specs.json b/catalog/specs.json index 38c3450..356285a 100644 --- a/catalog/specs.json +++ b/catalog/specs.json @@ -831,7 +831,7 @@ "rear": 10.0, "seeker": 60.0, "launch_sound": "drone.lancet", - "voice": {"event": "drone.lancet", "gain": 0.8, "pitch": 1.7} + "voice": {"event": "drone.lancet", "gain": 0.8, "pitch": 1.6} } ], "named": { diff --git a/docs/CODEX-HANDOFF.md b/docs/CODEX-HANDOFF.md index 4a8421e..8b6e036 100644 --- a/docs/CODEX-HANDOFF.md +++ b/docs/CODEX-HANDOFF.md @@ -12,9 +12,9 @@ След #91 продолжен: `catalog/specs.json` — единственная копия числовых строк дронов, ракет и комплексов; `python3 tools/gen_catalog.py` генерирует `specs_generated.rs` и -`unit_specs_generated.rs`, `--check` (CI) валит расхождение. Числа не менялись; при сверке с -литералами найден и исправлен только голос P1-SUN в JSON (1.6 → 1.7). Остаток: варианты -комплексов и игровая приёмка. +`unit_specs_generated.rs`, `--check` (CI) валит расхождение. Числа не менялись; сверка с литералами +подтвердила 1.6 как фактический голос P1-SUN (недостижимый `P1sun => 1.7` в старом match не в счёт); +на это добавлена Rust-регрессия. Остаток: варианты комплексов и игровая приёмка. ### Контрольная точка 3 ноября diff --git a/docs/CONTINUATION-2026-11-04.md b/docs/CONTINUATION-2026-11-04.md index 153161b..098b720 100644 --- a/docs/CONTINUATION-2026-11-04.md +++ b/docs/CONTINUATION-2026-11-04.md @@ -57,11 +57,13 @@ именованные части и то, что каждая строка кем-то используется; `gen_catalog.py --check` уже в CI-шаге «Проверка generated assets», поэтому расхождение JSON и Rust валит сборку. -Сверка перед переносом: JSON сравнивался с литералами `632061d` по всем полям. Найдено одно -расхождение — голос P1-SUN был записан с pitch 1.6 вместо фактического 1.7 (ветка `flame == 0` -в `voices.rs`); JSON исправлен, поведение не менялось. После генерации строки сверены с прежними -литералами поле-в-поле (включая части моделей и именованные refs) — расхождений нет. Порядок -raid/save, ключи `sam`/дронов, RNG и тексты не менялись. +Сверка перед переносом: JSON сравнивался с литералами `632061d` по всем полям. Голос P1-SUN — +тонкое место: фактически играет ранний возврат `flame == 0` в старом `voices.rs` +(`(DRONE_LANCET, 0.8, 1.6)`), а `P1sun => 1.7` в `match` недостижим. Первая версия сверки ошибочно +приняла недостижимую ветку за факт и поставила в JSON 1.7 — это меняло звук перехватчика; fixup +вернул 1.6 и добавил регрессию `missile_engine_voices_keep_their_played_values` (P1-SUN и M48N6). +После генерации строки сверены с прежними литералами поле-в-поле (включая части моделей и +именованные refs) — расхождений нет. Порядок raid/save, ключи `sam`/дронов, RNG и тексты не менялись. Проверки этого этапа: `cargo test --release` ядра — **194 passed, 7 ignored** + **8 сценариев**; адаптер — **64 unit**, **1 boundary**, **5 сценариев**; `gen_catalog.py --check`, `gen_models.py --check`, diff --git a/tools/airdef_assets/catalog.py b/tools/airdef_assets/catalog.py index ddb9463..117d392 100644 --- a/tools/airdef_assets/catalog.py +++ b/tools/airdef_assets/catalog.py @@ -375,4 +375,4 @@ def sound_events(entries): events[event] = {"sounds": [{"name": f"airdef:{name}", "attenuation_distance": distance}]} if entry["far"]: events[event + "_far"] = {"sounds": [{"name": f"airdef:{name}_far", "attenuation_distance": int(distance * 1.6)}]} - return events \ No newline at end of file + return events