Уровень 2 принят; в README — оговорка, что иммортал только в бою

Обход уровней после оптимизации фаз: уровни 1 и 2 пройдены, критичных
багов не осталось.  Найденное по дороге закрыто и перечислено в шапке
TASKS_OPEN.md, чтобы регресс-база была видна одним взглядом.

README раньше читы не перечислял вовсе.  Теперь у бессмертия явно записано
главное ограничение — работает ТОЛЬКО с мечом в руке — и почему оно не
косметическое: кадры seq_74 все с мечом, и подмена смерти на эту анимацию
оставляла Кида в стойке при sword == 0, где у control() нет ни одной ветки.
На физику (падения/пики/чомперы) бессмертие действует всегда.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-17 22:42:06 +03:00
parent 18f58439a3
commit ec1f384688
2 changed files with 29 additions and 0 deletions
+14
View File
@@ -27,6 +27,20 @@ ESC выход.
проблемный кадр на `1`, спокойно рассмотреть/снять пиксели — в т.ч. проблемный кадр на `1`, спокойно рассмотреть/снять пиксели — в т.ч.
удалённо из MAME MCP-моста, пока анимация стоит. удалённо из MAME MCP-моста, пока анимация стоит.
**Читы** (`pop_cheat.h`; в релизной сборке выключаются через `pop_cheats`):
- **I** — бессмертие Кида (toggle). **Работает ТОЛЬКО в бою, то есть с
мечом в руке.** Удар по безоружному Киду остаётся смертельным — ровно как
в оригинале (seg002 `hurt_by_sword`: *«Being hurt when not in fighting pose
means death»*, `take_hp(100)`). Ограничение не косметическое: анимация
«получил удар» (`seq_74`) состоит из кадров 150..179, которые ВСЕ с мечом,
и подмена смерти на неё оставляла Кида в боевой стойке при `sword == 0`
состоянии, для которого у диспетчера `control()` нет ни одной ветки, то
есть с намертво зависшим управлением
([BUG-CHEAT-IMM-1](BUGS_CLOSED.md#bug-cheat-imm-1)). На физику (падения,
пики, чомперы) бессмертие действует всегда, независимо от меча.
- **K** — убить стража, **S** — выдать меч, **Shift+L** — следующий уровень,
**+/−** — обход комнат.
Эталон вида комнаты — `../toolchain/1.1-2.png`. Эталон вида комнаты — `../toolchain/1.1-2.png`.
## Модули ## Модули
+15
View File
@@ -29,6 +29,21 @@
- **libbgi:** блочные AND/OR/XOR/NOT акселератора (2026-08-11, `tests/accop`) - **libbgi:** блочные AND/OR/XOR/NOT акселератора (2026-08-11, `tests/accop`)
— задел под вид тени и под любые эффекты «поверх того, что уже нарисовано». — задел под вид тени и под любые эффекты «поверх того, что уже нарисовано».
**Обход уровней после оптимизации фаз — идёт сейчас (начат 2026-08-17).**
Оптимизация зелёной/циан фаз тронула порядок пометок и перерисовок, поэтому
уровни проходятся заново подряд:
| уровень | статус | что нашлось и закрыто по дороге |
|---|---|---|
| 1 | **принят** (2026-08-17) | мерцание торцов плит/полов/кнопок (запечка шире копируемого прямоугольника); потолочный fore поверх падающей плиты (не было ряда −1 в проходе foretable); соседний пол под плитой (потерянная половина `draw_mob``set_redraw2`); залипший блеск меча (`trob_drawn` не совпадал с тем, что нарисует полная отрисовка) |
| 2 | **принят** (2026-08-17) | чёрные бары поверх стража — `bar` с `x + w > 320` заворачивался в соседнюю страницу видеопамяти (`dd40c24`); [BUG-CHEAT-IMM-1](BUGS_CLOSED.md#bug-cheat-imm-1) — боевая стойка без меча под читом бессмертия |
| 3+ | не начат | |
Критичных багов на уровнях 1 и 2 не осталось. Следом — регресс тактов на
23/13 (документы фаз: [`../docs/perf_green_phase.md`](../docs/perf_green_phase.md),
[`../docs/perf_cyan_phase.md`](../docs/perf_cyan_phase.md), сцена и метод —
[`../docs/perf_l13_room23.md`](../docs/perf_l13_room23.md)).
Правило проекта в силе: механику сверять с `../SDLPoP/src/` ДО кодинга; Правило проекта в силе: механику сверять с `../SDLPoP/src/` ДО кодинга;
диагноз платформы подтверждать артефактом (брейкпоинт/дамп/.asm), а не диагноз платформы подтверждать артефактом (брейкпоинт/дамп/.asm), а не
гипотезой (memory `defer_unexplained_quirks`). гипотезой (memory `defer_unexplained_quirks`).