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:
@@ -60,6 +60,7 @@
|
||||
#define SEQ_14_JUMP_INTO_CEILING 14 /* прыжок вверх: сверху стена/пол */
|
||||
#define SEQ_28_JUMP_NOTHING_ABOVE 28 /* прыжок вверх: сверху пусто */
|
||||
#define SEQ_25_HANG_AGAINST_WALL 25 /* вис у стены (Shift в висе) */
|
||||
#define SEQ_GO_UP_LEVELDOOR 70 /* seq_70_go_up_on_level_door */
|
||||
|
||||
#define FRAME_7_RUN 7
|
||||
#define FRAME_11_RUN 11
|
||||
@@ -187,8 +188,15 @@ static void jump_up(void)
|
||||
|
||||
static void up_pressed(void)
|
||||
{
|
||||
/* (дверь уровня/телепорт — нет в тесте.) ↑+forward = прыжок с места;
|
||||
* иначе вертикальный прыжок вверх. */
|
||||
/* Дверь уровня рядом и открыта → войти в неё: постановку в проём
|
||||
* (go_up_leveldoor) делает pop_leveldoor_enter, здесь остаётся только
|
||||
* последовательность подъёма по лестнице. Телепортов у нас нет — это
|
||||
* модификация SDLPoP, а не оригинал.
|
||||
* Иначе: ↑+forward = прыжок с места, иначе вертикальный прыжок вверх. */
|
||||
if (pop_leveldoor_enter()) {
|
||||
seqtbl_offset_char(SEQ_GO_UP_LEVELDOOR);
|
||||
return;
|
||||
}
|
||||
if (control_x == CONTROL_HELD_FORWARD)
|
||||
standing_jump();
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user