Трасса kidobj для сверки с SDLPoP + разбор боя у шва
Инструмент: pop_dbg_kidobj печатает то же, что вывод, добавленный
пользователем в SDLPoP add_kid_to_objtable — tilepos/frame/act/col/cols/rows
(+ наша комната). Считает по set_char_collision и set_objtile_at_char.
Выключен по умолчанию (DBG_KIDOBJ 0), включается одним define; вывод
забирает брейкпоинт MAME на резидентном pop_dbg_trap.
Сверка подтвердила фикс a498255: окно перехода совпало кадр в кадр, за бой
на уровне 1 комната сменилась один раз, на уровне 8 у шва 24/18 — четыре
раза на 387 кадров боя, и все четыре на РАЗРЕШЁННЫХ кадрах (170/164/170/165).
Смен на запрещённых кадрах во всей трассе нет.
Разбор целиком — BUGS_CLOSED.md#seam-fight-flicker, включая невыясненное
расхождение поля cols.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -499,6 +499,49 @@ static void objtile_at_char(int8_t *row, int8_t *col,
|
||||
*row = r; *col = c;
|
||||
}
|
||||
|
||||
/* ВРЕМЕННО: трасса kidobj — порт отладочного вывода, добавленного
|
||||
* пользователем в SDLPoP add_kid_to_objtable (seg008:1679):
|
||||
*
|
||||
* DBG kidobj tilepos=%d frame=%d act=%d col=%d cols=%d..%d rows=%d..%d
|
||||
*
|
||||
* Считаем ровно то же, что set_char_collision (seg006:0723) +
|
||||
* set_objtile_at_char (seg006:13F3): габарит НЕутоньшённый (THIN правит
|
||||
* только *_coll, а колонки берутся по «толстой» границе), колонки
|
||||
* клампятся в 0..9, нижний ряд −1 читается как 3. Звать ПОСЛЕ отрисовки
|
||||
* Кида: ширину/высоту кадра (fpw/fph) заполняет она.
|
||||
*
|
||||
* Вывод забирает брейкпоинт MAME на резидентном pop_dbg_trap — сама
|
||||
* функция банковая, её адрес в W3 неоднозначен. */
|
||||
void pop_dbg_kidobj(void) __banked
|
||||
{
|
||||
int8_t dx = kid_cur_dx(), dy = kid_cur_dy();
|
||||
uint8_t fl = kid_cur_flags();
|
||||
uint16_t w = pop_cd[POP_CH_KID].fpw;
|
||||
uint16_t h = pop_cd[POP_CH_KID].fph;
|
||||
int xl = char_x_left_of(Kid.x, Kid.direction, dx, fl, w);
|
||||
int xr = xl + (int)((w + 1) >> 1); /* + char_width_half */
|
||||
int oy = (int)Kid.y + dy;
|
||||
int ty = oy - (int)h + 1;
|
||||
int8_t r, c, tr, br, cl, cr;
|
||||
objtile_at_char(&r, &c, &Kid, dx, dy, fl, w);
|
||||
br = pop_y_to_row((int16_t)oy);
|
||||
if (br == -1) br = 3;
|
||||
if (ty >= 192) ty = 0;
|
||||
tr = pop_y_to_row((int16_t)ty);
|
||||
cl = tile_div_mod(xl); if (cl < 0) cl = 0;
|
||||
cr = tile_div_mod(xr); if (cr > 9) cr = 9;
|
||||
pop_dbg_obj[0] = (int8_t)(r * 10 + c);
|
||||
pop_dbg_obj[1] = (int8_t)Kid.frame;
|
||||
pop_dbg_obj[2] = (int8_t)Kid.action;
|
||||
pop_dbg_obj[3] = Kid.curr_col;
|
||||
pop_dbg_obj[4] = cl;
|
||||
pop_dbg_obj[5] = cr;
|
||||
pop_dbg_obj[6] = tr;
|
||||
pop_dbg_obj[7] = br;
|
||||
pop_dbg_obj[8] = (int8_t)cur_room;
|
||||
pop_dbg_trap();
|
||||
}
|
||||
|
||||
/* 1 = страж рисуется ПОСЛЕ Кида (поверх). __banked: зовётся раз в кадр,
|
||||
* то есть один трамплин — а 500 Б кода в резиденте дороже. */
|
||||
uint8_t guard_over_kid(void) __banked
|
||||
|
||||
Reference in New Issue
Block a user