Музыка звучала там, где оригинал играет эффекты

Три места, все — наши заявки на треки, поставленные без условий оригинала.

Вступление первого уровня (25) оказалось не «звуком при приседе», а
автоматом (seg005:02EB): пока need_level1_music не ноль, control_crouched
НЕ читает управление — Кид сидит, играет тема, и только когда она смолкла,
он встаёт. Мы играли трек при любом первом приседе, и тема догоняла игрока
посреди уровня: пробежал, спрыгнул, присел — заиграла. Теперь автомат
портирован целиком, а «ещё звучит» спрашивается у курсора насоса
pop_mus_left (если музыка выключена, курсор нулевой и Кид просто встаёт).

Демо-уровень: оригинал молчит музыкой и там, где играет её в игре. Смерть
Кида — прямое условие `current_level != 0 && != 15` (seg006:1366), убитый
страж — отдельная ветка «беги из комнаты» без звука (seg006:1929). Плюс
общий гейт в pop_music_service: заставочная демка озвучена одними
эффектами, и любой новый музыкальный повод (меч, зелье) звучал бы там, где
оригинал их не играет.

Гейт живёт в банке, а не в главном цикле: в резиденте W1 оставалось
27 байт.

Host-тесты: 15 наборов. Проверено в MAME: на старте первого уровня тема 25
отыгрывает целиком, курсор доходит до нуля.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-26 10:41:07 +03:00
parent 06a1772011
commit e5179af9d8
5 changed files with 66 additions and 16 deletions
@@ -156,6 +156,9 @@ void tk_key_down(uint16_t code)
* проверяют их игровую логику, поэтому здесь достаточно no-op контрактов. */
void pop_beam_sample(void) __preserves_regs(b, c, d, e) { }
void pop_sfx_play(uint8_t id) { (void)id; }
/* Курсор насоса: в тестах звука нет вовсе, значит «ничего не звучит» — и
* автомат вступительной темы первого уровня сразу отпускает управление. */
volatile uint16_t pop_mus_left;
void pop_sfx_stop(void) { }
/* ---- 2. соседние модули движка -------------------------------------- */