L1-START + L1-EXIT: старт по данным уровня и выход через дверь уровня
L1-START. Старт и оба рестарта (смерть, выпадение из уровня) сведены в pop_start_level() — порт start_level + do_startpos + set_start_pos (seg003). Комната/тайл/направление берутся из pop_level_start_*, направление инвертируется (~start_dir), поза входа — из tbl_entry_pose: у уровня 1 это падение внутрь (seq_7_fall) плюс нажатие кнопки room5(0,2), то самое, что захлопывает решётку за спиной. Жёсткие START_ROOM/COL/ROW убраны. Проверено в MAME: старт даёт room 1, col 0, падение на row 1 — как по данным. L1-EXIT. Ветка двери уровня из up_pressed + go_up_leveldoor (seg005:0482/ 0574): тайлы и геометрия — pop_leveldoor_enter() в pop_map, последовательность seq_70 — в pop_ctrl. Опкод 0xF1 END_LEVEL в play_seq инкрементит pop_next_level (порт next_level), главный цикл по нему перезапускает уровень — ровно та точка, куда levels_plan §2.2 подключит загрузку уровня 2. Открытость двери проверяется по modifier >= 42 (ветка fix_exit_door), а не по ванильному leveldoor_open: иначе можно войти в ещё ползущую створку. Отдельно стоило разбора: go_up_leveldoor сначала писал Char.x/Char.direction, и оба присваивания молча терялись — окно Char вокруг диспетчера возвращает назад только curr_seq и sword (pop_savekid_state). Направление оставалось «вправо», а все DX в seq_70 отрицательные, поэтому Кид уходил ИЗ проёма влево (поймано стоп-кадром). Геометрию персонажа в этом порте меняет pop_map, пишет в Kid — как pop_down_action и pop_jump_up_seq. Известный остаток — BUG-DOOR-CLIP в bug_list.md: нет обрезки силуэта правым косяком проёма (недопортирован obj_clip_right в clip_char); нужен вариант колоночного блита с ограничением ширины. ROOMNAV пока оставлен включённым — он нужен, чтобы попадать в комнату 9 для этой работы. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -6,11 +6,11 @@
|
||||
а то, **что берём в работу сейчас и в каком порядке**. Каждая запись: что
|
||||
сделать, почему именно сейчас, чем подтверждать результат.
|
||||
|
||||
**Открытых багов нет** (ревизия 2026-08-01): в [`bug_list.md`](bug_list.md)
|
||||
остались только незакрытые оптимизации [T-1](bug_list.md#t-1),
|
||||
**Открытые баги** ([`bug_list.md`](bug_list.md)):
|
||||
[BUG-DOOR-CLIP](bug_list.md#bug-door-clip) (Кид не обрезается правым косяком
|
||||
двери уровня) + незакрытые оптимизации [T-1](bug_list.md#t-1),
|
||||
[T-2](bug_list.md#t-2) и незаконченная
|
||||
[таблица обхода 24 комнат](bug_list.md#обход-всех-24-комнат-уровня-1).
|
||||
Следующая порция багов придёт оттуда и из L1-PASS.
|
||||
|
||||
Правило проекта в силе: механику сверять с `../SDLPoP/src/` ДО кодинга;
|
||||
диагноз платформы подтверждать артефактом (брейкпоинт/дамп/.asm), а не
|
||||
@@ -364,19 +364,41 @@
|
||||
|
||||
## P1 — сразу после P0 (закрываем уровень 1 как ИГРУ, а не стенд)
|
||||
|
||||
### L1-START. Старт по данным уровня
|
||||
`roomtest.c` жёстко стартует `START_ROOM 1 / COL 3 / ROW 0`, хотя
|
||||
`pop_level_start_room()` / `pop_level_start_pos()` / `pop_level_start_dir()`
|
||||
в `pop_level.h` уже реализованы и НИКЕМ не вызываются. Перевести старт и
|
||||
респавн на них; `#define ROOMNAV` оставить, но выключенным по умолчанию.
|
||||
### L1-START. Старт по данным уровня — **СДЕЛАНО 2026-08-01**
|
||||
Старт и оба рестарта (смерть, выпадение из уровня) сведены в один
|
||||
`pop_start_level()` — порт `start_level` + `do_startpos` + `set_start_pos`
|
||||
(seg003): комната/тайл/направление берутся из `pop_level_start_*`, направление
|
||||
инвертируется (`~start_dir`), поза входа — из `tbl_entry_pose`. У уровня 1
|
||||
это «падение внутрь» плюс нажатие кнопки room5(0,2) — то самое, что
|
||||
захлопывает решётку за спиной. Проверено: старт даёт room 1, col 0, падение
|
||||
на row 1 — как по данным уровня.
|
||||
|
||||
### L1-EXIT. Выход с уровня (дверь уровня)
|
||||
Сейчас: дверь открывается (`animate_leveldoor`), но войти в неё нельзя —
|
||||
`up_pressed()` (`pop_ctrl.c:188`) не проверяет `tiles_16_level_door_left`, а
|
||||
опкод `0xF1 END_LEVEL` в `play_seq` (`pop_kid.c:418`) пустой. Портировать
|
||||
`up_pressed`-ветку + `go_up_leveldoor()` (`seg005.c:410..500`) и завести
|
||||
`pop_next_level`, который взводит `END_LEVEL` (`seg006.c:662`). **Это же
|
||||
первый шаг плана следующих уровней** — см. `../docs/levels_plan.md`.
|
||||
⏳ **Остаток:** `#define ROOMNAV` пока ВКЛЮЧЁН — он нужен, чтобы попадать в
|
||||
комнату 9 для работы над [BUG-DOOR-CLIP](bug_list.md#bug-door-clip).
|
||||
Выключить перед L1-PASS.
|
||||
|
||||
### L1-EXIT. Выход с уровня (дверь уровня) — **СДЕЛАНО 2026-08-01**
|
||||
Портированы: ветка двери уровня из `up_pressed` + `go_up_leveldoor`
|
||||
(seg005:0482/0574) — в `pop_leveldoor_enter()` (`pop_map.c`, тайлы и
|
||||
геометрия) и `up_pressed()` (`pop_ctrl.c`, только последовательность);
|
||||
опкод `0xF1 END_LEVEL` в `play_seq` теперь инкрементит `pop_next_level`
|
||||
(порт `next_level`), а главный цикл по нему перезапускает уровень — ровно
|
||||
та точка, куда `levels_plan.md` §2.2 подключит загрузку уровня 2.
|
||||
|
||||
Открытость двери проверяем по `modifier >= 42` (ветка `fix_exit_door`), а не
|
||||
по ванильному `leveldoor_open`: с ванильным условием можно войти в ещё
|
||||
ползущую створку.
|
||||
|
||||
**Грабли, которые стоили отдельного разбора:** `go_up_leveldoor` сначала
|
||||
писал `Char.x`/`Char.direction`, и оба присваивания молча терялись — окно
|
||||
`Char` вокруг диспетчера возвращает назад ТОЛЬКО `curr_seq` и `sword`
|
||||
(`pop_savekid_state`). Направление оставалось «вправо», а все `DX`
|
||||
последовательности seq_70 отрицательные, поэтому Кид уходил ИЗ проёма влево.
|
||||
Вывод на будущее: геометрию персонажа в этом порте меняет `pop_map` (пишет в
|
||||
`Kid`), а не диспетчер.
|
||||
|
||||
⏳ Косметика: [BUG-DOOR-CLIP](bug_list.md#bug-door-clip) — нет обрезки силуэта
|
||||
правым косяком проёма.
|
||||
|
||||
### L1-TRIAGE. Ревизия багов — **ЧАСТЬ 1 СДЕЛАНА 2026-08-01**
|
||||
|
||||
|
||||
Reference in New Issue
Block a user