L2: падение с мечом, разбег-прыжок через 3 тайла, стартовое состояние ворот
BUG-FALL-SWORD-1 — start_fall (seg006:1044) был портирован не целиком: не хватало трёх веток выбора последовательности и уборки меча в ножны. Из-за seq_7 с set_fall(1,15) (дрейф 1 px/кадр) Кид с мечом уезжал примерно на тайл вбок; в оригинале это seq_81_fightfall — падение строго вниз. Сверено по логу SDLPoP: кадры 102..105 дают x = 155,157,159,160. BUG-RJUMP-1 — run_jump (seg005:0AA8) не выравнивал Кида по кромке пола перед толчком, а был заглушкой «полировка K3». Суммарный dx seq_4 — 62 px при тайле 14, то есть провал ровно в три тайла берётся ТОЛЬКО с кромки: без выравнивания Кид не перепрыгивал его никогда. Порт — pop_run_jump_align() в pop_map (беззнаковое сравнение оригинала = «сдвиг не попал в [-8,-1]»). На харнессе: было — толчок с x=165, кадр 44 в колонке 3 (провал); стало — 5 кадров добега, толчок с x=149, кадр 44 даёт x=87 col=1 row=1. Остальные 8 сценариев не изменились. BUG-GATEMOD-1 — load_alter_mod (seg008:198E) был портирован только для зелий, поэтому ворота с bg=1 («Open» по спецификации DAT, табл. 8) стартовали закрытыми. Добавлены ветки gate (1 -> 188) и loose. Ветка wall намеренно НЕ портируется: связи стен наш pop_bg считает по типам соседей в момент отрисовки. На уровнях 1-3 таких ворот всего двое (ур. 1 комн. 5 (0,9); ур. 2 комн. 13 (1,5)) — у остальных bg=2, а 2 и 0 ведут себя одинаково. Убран временный трассировщик pop_dbg_trace/pop_dbg_draw; pop_dbg_trap() оставлен как многоразовый инструмент. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -23,3 +23,23 @@ uint8_t pop_immortal;
|
||||
* clip_char из pop_map. См. pop_state.h. */
|
||||
int pop_leveldoor_right;
|
||||
int pop_leveldoor_ybottom;
|
||||
|
||||
/* ---- Отладочная «пустышка» для брейкпоинтов из БАНКОВ ---------------- *
|
||||
* Зачем. PC-брейкпоинт видит только логический адрес, а 0xC000+ — это
|
||||
* окно, куда мапятся ВСЕ банки: точка на адресе банковой функции ловит
|
||||
* заодно чужой код, случайно легший по тому же смещению (проверено:
|
||||
* точка на start_fall из банка 3 срабатывала на каждом кадре — попадала
|
||||
* в pop_bg из банка 2). Условные брейкпоинты этот отладчик MAME не
|
||||
* поддерживает («error in assignment expression» на `==`).
|
||||
*
|
||||
* Приём (идея пользователя, 2026-08-04): позвать ЭТУ функцию ровно из
|
||||
* того места банкового кода, которое отлаживаем, и поставить брейкпоинт
|
||||
* на неё — она резидентна в W1, её адрес однозначен. По возврату из неё
|
||||
* читаем что нужно. Условие «когда именно ловить» пишется обычным `if`
|
||||
* в C — это гибче любых выражений отладчика.
|
||||
*
|
||||
* Счётчик нужен, чтобы вызов не выкинул оптимизатор; заодно видно, сколько
|
||||
* раз точка прошла, если ловим не останавливаясь. */
|
||||
uint8_t pop_dbg_hits;
|
||||
|
||||
void pop_dbg_trap(void) { pop_dbg_hits++; }
|
||||
|
||||
Reference in New Issue
Block a user