BUG-CTRL-FRAME-1: геометрия Кида считалась по кадру стража
cur_frame — один глобал на всех персонажей (как в оригинале), владелец — тот, кто последним прошёл load_frame. Последним в кадре тикает страж, поэтому к моменту control() Кида там лежал кадр СТРАЖА, а через kid_cur_dx/dy/flags по нему считается вся геометрия управления: dx_weight -> determine_col -> distance_to_edge_weight -> get_edge_distance -> выбор ветки в check_jump_up. Оригинал зовёт load_fram_det_col() (seg006:0144) сразу после loadkid/loadshad и ДО control() — play_kid_frame (seg000:1211) и play_guard_frame (seg000:1248). У нас этого не было. Замерено брейкпоинтом на pop_jump_up_seq: Kid x=156 col=6 кадр 15 (dx=0 weight_x=3) при кадре стража image17 (dx=-1 weight_x=8) дал curr_col=7 и distance=2 вместо 6 и 10 — то есть jump_up_plain (вернулось A=28, пустой прыжок) вместо «шаг назад на x=160 + зацеп». Предсказание по кадру стража совпало с намеренным до единицы. Отсюда же плавающее поведение: кадр стража меняется каждый тик, distance Кида скакал через порог 6 — то прыжок, то попытка зацепа с неверной X. И «голова Кида поверх плиты (1,6)» — не баг отрисовки, а следствие позы, которой в оригинале в этом месте не бывает. Фикс: pop_load_fram_det_col() (pop_kid.c) + вызовы в pop_ctrl_tick и pop_guard_tick. determine_col — только на ветке Кида: у нас он существует лишь для него (pop_map работает с Kid, а не с Char). Разбор с числами — bug_closed.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -707,9 +707,16 @@ void pop_ctrl_tick(void)
|
||||
read_user_control();
|
||||
/* Окно Char вокруг диспетчера: control() работает с АКТИВНЫМ
|
||||
* персонажем (как в оригинале), поэтому ввод игрока применяется к
|
||||
* Киду только внутри loadkid/savekid. Кадр не перезагружаем —
|
||||
* play_seq в kid_tick сделает это следующим шагом. */
|
||||
* Киду только внутри loadkid/savekid.
|
||||
*
|
||||
* load_fram_det_col ОБЯЗАТЕЛЕН здесь — порт play_kid_frame
|
||||
* (seg000:1209), где он стоит ровно между loadkid_and_opp() и
|
||||
* play_kid(). cur_frame один на всех персонажей, и в кадре последним
|
||||
* его перезаписывает страж; без перезагрузки диспетчер считает
|
||||
* геометрию Кида (dx_weight -> determine_col -> distance_to_edge_weight
|
||||
* -> get_edge_distance) по кадру СТРАЖА. Замерено: BUG-CTRL-FRAME-1. */
|
||||
pop_loadkid();
|
||||
pop_load_fram_det_col();
|
||||
user_control(); /* -> pop_control(): может сменить Char.curr_seq */
|
||||
pop_savekid_state();
|
||||
save_ctrl_1();
|
||||
|
||||
Reference in New Issue
Block a user