SprPoP: падение сквозь стену больше не проходит

Портировано опциональное исправление SDLPoP (fix_glide_through_wall,
seg005 в do_fall).  В ванили персонаж, падающий после разворота в беге,
может оказаться внутри кладки и лететь «в стене» — баг оригинала,
воспроизведённый пользователем в игре и затем на host-тесте.

Решением 2026-08-31 фикс взят в ТЕКУЩИЙ билд: играбельность важнее
буквальности.  Реализация вынесена отдельной функцией
glide_through_wall_guard() в pop_map.c намеренно — при разделении
VANILLA/ENHANCED это готовая точка отвязки, достаточно не звать её в
ванильном режиме.

ПРОВЕРКА.  Набор t_wall был заранее написан так, чтобы сторожить ЧИСЛО
заходов в кладку: до фикса их было ровно два из четырнадцати стартовых
позиций, после — ноль.  Остальные 15 наборов (в том числе phys с 1733
проверками и grab) остались зелёными.  Живая проверка в MAME
пользователем: корректно.

Ожидание в тесте обновлено ОСОЗНАННО, прежнее число сохранено рядом
отдельной константой с пометкой «сколько было до фикса»: оно измерено, и
понадобится, когда появится режим VANILLA — там ожидание станет зависеть
от режима.

ЦЕНА: +57 байт в банке 3 (свободно 3043), резидент и куча не изменились.
По скорости попадание только на кадры падения: пересчёт колонки — одно
деление, дистанция до кромки считается лишь если персонаж действительно
внутри кладки.

Документы: в аудите находка 21 переведена в «портировано» с сохранением
исходного разбора; в vanilla_vs_bugfixed статус фикса стал ВЗЯТ, сводка
пересчитана (5 взято, 32 кандидата в ENHANCED).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011MsUsEFAQfsjjQpJ7RtKVY
This commit is contained in:
2026-08-31 20:52:44 +03:00
parent c218e8b983
commit 4e12aa50d1
4 changed files with 68 additions and 19 deletions
+17 -14
View File
@@ -162,21 +162,24 @@ static char jump_right_from(uint8_t x)
}
}
/* ВАНИЛЬНОЕ ПОВЕДЕНИЕ, А НЕ НАША ОШИБКА.
/* ФИКС ПАДЕНИЯ СКВОЗЬ СТЕНУ ВЗЯТ — ЖДЁМ НОЛЬ.
*
* Прыжок вправо через провал даёт ДВА случая из четырнадцати, где Кид
* оказывается в колонке кладки, будучи в воздухе, — то есть «падает
* частично в стене». Это известный баг оригинального PoP: SDLPoP держит
* для него ОТДЕЛЬНОЕ опциональное исправление (FIX_GLIDE_THROUGH_WALL,
* seg005 do_fall), которое мы намеренно не портировали, повторяя ваниль
* (docs/sdlpop_audit.md, находка 21).
* В ванили прыжок вправо через провал давал ДВА случая из четырнадцати,
* где Кид оказывается в колонке кладки, будучи в воздухе, — «падение
* частично в стене». Это баг оригинального PoP, для которого SDLPoP
* держит опциональное исправление (fix_glide_through_wall, seg005 в
* do_fall).
*
* Поэтому тест не требует нуля, а СТОРОЖИТ ЧИСЛО: пока их ровно два, мы
* ведём себя как оригинал. Стало больше — значит правка сделала хуже
* ванили; стало меньше — кто-то портировал фикс и об этом нужно знать.
* Проверено: фикс 24 (перезагрузка кадра в in_wall) на это число НЕ
* влияет. */
#define WALL_VANILLA_GLIDE_CASES 2
* 2026-08-31 исправление ПОРТИРОВАНО в текущий билд
* (glide_through_wall_guard в pop_map.c), и оба случая исчезли. Поэтому
* ожидание теперь НОЛЬ.
*
* Если когда-нибудь появится режим VANILLA без этого фикса, ожидание
* станет зависеть от режима: 0 в ENHANCED и 2 в ванильном
* (docs/vanilla_vs_bugfixed.md). Число 2 сохранено в имени константы
* именно поэтому — оно измерено, а не выдумано. */
#define WALL_VANILLA_GLIDE_CASES 2 /* сколько их было ДО фикса */
#define WALL_EXPECTED_GLIDE_CASES 0 /* сколько ожидаем СЕЙЧАС */
TC_TEST(wall_stops_jump_from_left_side)
{
@@ -190,7 +193,7 @@ TC_TEST(wall_stops_jump_from_left_side)
if (r != 'R' && r != '.' && r != 'h') bad++;
}
put('\n');
TC_EQ(bad, WALL_VANILLA_GLIDE_CASES);
TC_EQ(bad, WALL_EXPECTED_GLIDE_CASES);
}
int main(void)