DIED-ON-BUTTON: найдена вторая половина — физика трупа выключена целиком
Кид гибнет на кнопке открытия решётки (уровень 7, комната 3, тайл 2,1) — в оригинале решётка открыта насовсем, у нас отжимается. Мало того, что died_on_button (seg007:776) не портирован: pop_phys_tick целиком выходит по pop_kid_dead, так что check_press до трупа не доходит вовсе. У оригинала play_kid_frame гейтится только Char.room != 0. Фикса пока нет — запись в BUGS_OPEN. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -329,6 +329,46 @@ if (curr_tile2 == tiles_15_opener || curr_tile2 == tiles_6_closer) {
|
|||||||
Что нужно: сам порт `died_on_button`, константа `TILE_STUCK = 5` и тайл
|
Что нужно: сам порт `died_on_button`, константа `TILE_STUCK = 5` и тайл
|
||||||
заклиненной кнопки в атласе фона (сейчас его там нет).
|
заклиненной кнопки в атласе фона (сейчас его там нет).
|
||||||
|
|
||||||
|
### Вторая половина: до `check_press` труп вообще не доходит (2026-08-18)
|
||||||
|
|
||||||
|
Найдено на живом сценарии (пользователь): уровень 7 начинается падением, и
|
||||||
|
если не зацепиться за кромку, Кид разбивается на `(2,1)` комнаты 3 — а это
|
||||||
|
кнопка открытия решётки. В оригинале решётка после этого открыта НАСОВСЕМ,
|
||||||
|
у нас отжимается.
|
||||||
|
|
||||||
|
Оказалось, порта `died_on_button` мало — до него нет пути:
|
||||||
|
|
||||||
|
```c
|
||||||
|
void pop_phys_tick(void) __banked
|
||||||
|
{
|
||||||
|
if (pop_kid_dead) return; /* <- вся физика трупа выключена */
|
||||||
|
```
|
||||||
|
|
||||||
|
У оригинала `play_kid_frame` (seg000:1231) гейт ровно один — `Char.room != 0`;
|
||||||
|
весь список, включая `check_press`, крутится и на трупе (по `alive` разведены
|
||||||
|
только `check_spiked`/`check_chomped_kid`, и то через `resurrect_time`).
|
||||||
|
|
||||||
|
Отсюда наблюдаемое поведение: кнопка получает РОВНО ОДНО нажатие — в кадре
|
||||||
|
самой смерти, потому что `pop_kid_dead` ставит `land()` уже ВНУТРИ цепочки,
|
||||||
|
после раннего возврата. Решётка успевает приоткрыться и потом закрывается.
|
||||||
|
Снято в MAME: Кид `frame 185, action 5 (bumped), alive 0, (2,1) room 3`,
|
||||||
|
`pop_kid_dead = 1`, тайл `(2,1)` = `0x0F` opener, modif `0x12` (индекс связи),
|
||||||
|
openness ворот `(2,6)` ползёт вниз (146 → 112).
|
||||||
|
|
||||||
|
Кадр смерти проходит проверки `check_press` штатно (`action == ACT_BUMPED`,
|
||||||
|
флаги кадра 185 = `0x49`, бит `FRAME_NEEDS_FLOOR` есть) — то есть после снятия
|
||||||
|
раннего возврата труп начнёт давить кнопку КАЖДЫЙ кадр, как живой. Это ещё
|
||||||
|
не оригинал: там на `alive >= 0` уходит `died_on_button`, который делает
|
||||||
|
эффект ПОСТОЯННЫМ и снимает кнопку с тайла. Значит чинить надо обе половины
|
||||||
|
разом, иначе получится «кнопка держится, пока труп лежит» — поведение,
|
||||||
|
которого нет ни в оригинале, ни сейчас.
|
||||||
|
|
||||||
|
**Побочное наблюдение, НЕ проверено:** openness ворот остановился на 112 и
|
||||||
|
дальше не убывал, хотя `animate_door` (у нас совпадает с seg007:0522) обязан
|
||||||
|
досчитать до 0 и снять trob. Довести проверку не удалось — в сцене залип
|
||||||
|
`frozen` (клавиша фриза осталась в raw-битмапе, `2` перестала сниматься).
|
||||||
|
Если подтвердится — это отдельный баг, к `died_on_button` отношения не имеющий.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<a id="torch-anim-right"></a>
|
<a id="torch-anim-right"></a>
|
||||||
|
|||||||
Reference in New Issue
Block a user