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.
This commit is contained in:
2026-11-04 20:37:26 +03:00
parent ead87343d2
commit 0937ac9e05
6 changed files with 27 additions and 11 deletions
+1 -1
View File
@@ -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 {
+14
View File
@@ -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));
}
}
+1 -1
View File
@@ -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": {
+3 -3
View File
@@ -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 ноября
+7 -5
View File
@@ -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`,
+1 -1
View File
@@ -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
return events