Ворота PoP: правильный гейт слышимости, звук «решётка встала», playsound кнопки
Проверка на сцене 9/9 (кнопка 1,8; челюсти 1,2; ворота — в комнате 4, тайл 1,9) вскрыла три расхождения. 1. Гейт слышимости стоял как «ворота в текущей комнате», а у оригинала (play_door_sound_if_visible, seg007:1239) слышны ещё и ворота в комнате СЛЕВА, если они в колонке 9; и НЕ слышны в колонке 9 своей комнаты; плюс особый случай «уровень 3, комната 2». Сцена 9/9 — ровно первый пункт, поэтому спуск решётки молчал. Подъём совпадал, потому что звук открытия идёт без гейта — эта асимметрия и была подсказкой. 2. Потерян звук 7 «решётка встала»: gate_stop (seg007:05E3) зовётся из трёх мест animate_door и каждый раз играет его через гейт. У нас во всех трёх стояло только type = -1. 3. У trigger_button оригинала есть параметр playsound, нулевой в трёх местах (вход на уровень, выход Джаффара, зелье «открыть»). Добавлен. Щелчок кнопки слышен через раз — это НЕ баг: prio 0x66 против 0x10 у челюстей, а укус занимает 465 мс из цикла 1229 мс (замерено). Разбор с цифрами — sound_plan.md §12. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -579,3 +579,65 @@ play_next_sound() seg000:1304 — раз в кадр решает, зап
|
||||
|
||||
Цена: резидент +~250 Б (таблицы + логика), куча ужалась с 347 до 134 Б —
|
||||
довод в пользу давно назревшей реорганизации базовой памяти.
|
||||
|
||||
## 12. Ворота: гейт слышимости и «решётка встала» (2026-08-20)
|
||||
|
||||
Проверка на сцене, которую предложил пользователь — уровень 9, комната 9:
|
||||
кнопка (1,8), челюсти (1,2), а ворота **в комнате 4, тайл (1,9)**, то есть
|
||||
в комнате СЛЕВА. Нашлись три расхождения сразу.
|
||||
|
||||
### 12.1 Гейт слышимости был неверный
|
||||
|
||||
У нас стояло `audible = (room == cur_room)`. У оригинала
|
||||
(`play_door_sound_if_visible`, seg007:1239) правило другое:
|
||||
|
||||
- ворота в комнате СЛЕВА и в колонке 9 — СЛЫШНЫ (створка видна в шве);
|
||||
- ворота в отрисованной комнате и НЕ в колонке 9 — слышны;
|
||||
- особый случай: уровень 3, комната 2 — слышны всегда.
|
||||
|
||||
Сцена 9/9 попадает ровно в первый пункт, поэтому спуск решётки у нас
|
||||
молчал. Подъём при этом совпадал с оригиналом — потому что звук открытия
|
||||
(5) идёт БЕЗ гейта (seg007:386, прямой `play_sound`). Эта асимметрия и была
|
||||
подсказкой.
|
||||
|
||||
Взят вариант под `FIX_GATE_SOUNDS` (условия через ИЛИ): в config.h SDLPoP
|
||||
он определён безусловно.
|
||||
|
||||
### 12.2 Потерян звук «решётка встала» (7)
|
||||
|
||||
`gate_stop()` (seg007:05E3) зовётся из ТРЁХ мест `animate_door` и каждый раз
|
||||
играет звук 7 через гейт слышимости: конец закрытия, открытие насовсем и
|
||||
ветка «уже 0xFF». У нас во всех трёх стояло только `*type = -1` без звука.
|
||||
Добавлено. Лязг после ОБЫЧНОГО открытия (seg007:395) остаётся без гейта —
|
||||
там оригинал зовёт `play_sound` напрямую.
|
||||
|
||||
### 12.3 Кнопка: у оригинала есть параметр playsound
|
||||
|
||||
`trigger_button(playsound, ...)` — в трёх местах он нулевой: вход на уровень
|
||||
(seg003:170), выход Джаффара (seg002:520) и зелье «открыть» (seg006:1890, у
|
||||
нас не портировано). Мы играли щелчок всегда. Добавлен параметр `snd`.
|
||||
|
||||
### 12.4 Почему щелчок кнопки слышно через раз — это НЕ баг
|
||||
|
||||
Бюджет сцены 9/9 (длительности после пересчёта на 10 937,5 Гц):
|
||||
|
||||
| звук | длительность | prio |
|
||||
|---|---:|---:|
|
||||
| челюсти (47) | 465 мс | 0x10 |
|
||||
| решётка вниз (4) | 97 мс | 0x32 |
|
||||
| решётка вверх (5) | 123 мс | 0x37 |
|
||||
| решётка встала (7) | 75 мс | 0x30 |
|
||||
| кнопка (3) | 106 мс | 0x66 |
|
||||
|
||||
Цикл челюстей — 15 кадров = 1229 мс (замерено брейкпоинтом на номинации:
|
||||
25 805 000 тактов между укусами). Значит укус занимает 465 мс, пауза 764 мс.
|
||||
Кнопка (prio 0x66) перебить челюсти не может (0x66 > 0x10), поэтому слышна
|
||||
только если нажатие попало в паузу — примерно в 6 случаях из 10.
|
||||
Подтверждено пользователем на живой сцене.
|
||||
|
||||
### 12.5 Грабли сцены
|
||||
|
||||
Если игра стартует ПРЯМО в комнате с челюстями, они не заводятся сами:
|
||||
нужно сходить Кидом на левую кнопку и вернуться. Это поведение оригинала
|
||||
(trob челюстей создаётся событием), а не наш дефект — учитывать при
|
||||
постановке автотестов.
|
||||
|
||||
Reference in New Issue
Block a user