Ворота 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:
@@ -880,7 +880,7 @@ static uint8_t check_grab_run_jump(void)
|
||||
if (grab_col >= 0 && grab_col <= 9 && grab_row >= 0 && grab_row <= 2) {
|
||||
uint8_t tp = (uint8_t)(grab_row * 10 + grab_col);
|
||||
if (grab_tile == TILE_OPENER || grab_tile == TILE_CLOSER)
|
||||
pop_trigger_button(g_room, tp, grab_tile, pop_trob_modif(g_room)[tp]);
|
||||
pop_trigger_button(g_room, tp, grab_tile, pop_trob_modif(g_room)[tp], 1);
|
||||
else if (grab_tile == TILE_LOOSE) {
|
||||
is_guard_notice = 1;
|
||||
make_loose_fall(tp, 1);
|
||||
@@ -2318,7 +2318,7 @@ static void died_on_button(uint8_t room, uint8_t tp, uint8_t code)
|
||||
if (tp % 10 < 9)
|
||||
pop_set_redraw((uint8_t)(tp + 1), POP_RD_FLOOR, 2);
|
||||
}
|
||||
pop_trigger_button(room, tp, button_type, modifier);
|
||||
pop_trigger_button(room, tp, button_type, modifier, 1);
|
||||
}
|
||||
|
||||
/* check_press (seg006:0EC8, упрощ.): Kid стоит на loose → make_loose_fall;
|
||||
@@ -2373,7 +2373,7 @@ static void check_press(void)
|
||||
/* seg006:1707 — ЖИВОЙ жмёт кнопку на 5 кадров, МЁРТВЫЙ ломает её
|
||||
* насовсем. `alive < 0` = жив (соглашение оригинала). */
|
||||
if (Char.alive < 0)
|
||||
pop_trigger_button(btn_room, tp, t, pop_trob_modif(btn_room)[tp]);
|
||||
pop_trigger_button(btn_room, tp, t, pop_trob_modif(btn_room)[tp], 1);
|
||||
else
|
||||
died_on_button(btn_room, tp, t);
|
||||
}
|
||||
@@ -2861,7 +2861,7 @@ void pop_loose_tick(void) __banked
|
||||
if (tt == TILE_OPENER || tt == TILE_CLOSER)
|
||||
pop_trigger_button(g_room, pos,
|
||||
(uint8_t)(tt == TILE_OPENER ? TILE_DEBRIS : tt),
|
||||
pop_trob_modif(g_room)[pos]);
|
||||
pop_trob_modif(g_room)[pos], 1);
|
||||
/* На факеле — отдельный тайл «факел с щебнем» (seg007:1067). */
|
||||
g_fg[pos] = (uint8_t)((tt == TILE_TORCH || tt == TILE_TORCH_DEBRIS)
|
||||
? TILE_TORCH_DEBRIS : TILE_DEBRIS);
|
||||
|
||||
Reference in New Issue
Block a user