applications/PoP/roomtest: пол-оверлей при подъёме (draw_floor_overlay)
Проблема из динамики: при подъёме [1,2]→[0,3] нижняя часть Kid, которая
физически за полом назначения, просвечивала.
Порт SDLPoP draw_floor_overlay (seg008:1457): на кадрах подъёма 137..144,
если тайл-назначения floor-подобный (floor/pillar/stuck/torch) И тайл СЛЕВА
пуст (кромка), передний край пола (floor_left_overlay[frame-137] =
{32,151,151,150,150,151,32,32}) + низ пола рисуются ПОВЕРХ нижней части Kid.
- pop_bg: climb_overlay_tile + доп-проход в pop_fore_over_kid (новый параметр
frame) на кадрах 137..144.
- pop_pack_bg.py: CLIMB_OVERLAY_ENV_IDS={32,150,151} явно добавлены в env-фон
(не попадают в used render_room — рантайм-анимация); env4 count 16→24.
- roomtest: передача Kid.frame в pop_fore_over_kid.
Проверено в MAME (кадр 137): при подтягивании видна только голова/плечи Kid
над кромкой [0,3], нижняя часть скрыта за полом.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -429,7 +429,30 @@ static void fore_tile(int row, int col) /* передний слой одно
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void pop_fore_over_kid(int obj_x, int obj_y, uint16_t w, uint16_t h, int8_t dir)
|
/* Пол-оверлей при подъёме (draw_floor_overlay, seg008:1457): когда Kid
|
||||||
|
* подтягивается на floor-подобный тайл назначения (floor/pillar/stuck/torch),
|
||||||
|
* а тайл СЛЕВА пуст (т.е. кромка), передний край пола перекрывает нижнюю
|
||||||
|
* часть Kid — иначе видна часть, что должна быть за полом. Кадр подъёма
|
||||||
|
* 137..144 индексирует floor_left_overlay. */
|
||||||
|
static const uint8_t FLOOR_LEFT_OVERLAY[8] = {32, 151, 151, 150, 150, 151, 32, 32};
|
||||||
|
|
||||||
|
static void climb_overlay_tile(int row, int col, uint8_t fidx)
|
||||||
|
{
|
||||||
|
uint8_t code = tile_code(row, col);
|
||||||
|
int x, dmy, dby;
|
||||||
|
const piece *t;
|
||||||
|
if (code != 1 && code != 3 && code != 5 && code != 19) return; /* не floor-тайл */
|
||||||
|
if (tile_code(row, col - 1) != 0) return; /* слева не пусто → не кромка */
|
||||||
|
x = COL_XH[col] * 8;
|
||||||
|
dmy = 63 * row + 62;
|
||||||
|
dby = dmy + 3;
|
||||||
|
t = &tile_table[code];
|
||||||
|
env_b(FLOOR_LEFT_OVERLAY[fidx], x, dmy + (code == 5 ? 1 : 0));
|
||||||
|
if (t->bottom_id) env_b(t->bottom_id, x, dby); /* draw_tile_bottom */
|
||||||
|
}
|
||||||
|
|
||||||
|
void pop_fore_over_kid(int obj_x, int obj_y, uint16_t w, uint16_t h,
|
||||||
|
int8_t dir, uint8_t frame)
|
||||||
{
|
{
|
||||||
int wh = (int)((w + 1) >> 1); /* char_width_half */
|
int wh = (int)((w + 1) >> 1); /* char_width_half */
|
||||||
int xl = obj_x / 2 + 58; /* char_x_left (58-база) */
|
int xl = obj_x / 2 + 58; /* char_x_left (58-база) */
|
||||||
@@ -445,5 +468,11 @@ void pop_fore_over_kid(int obj_x, int obj_y, uint16_t w, uint16_t h, int8_t dir)
|
|||||||
for (r = rT; r <= rB; r++)
|
for (r = rT; r <= rB; r++)
|
||||||
for (c = cL; c <= cR; c++)
|
for (c = cL; c <= cR; c++)
|
||||||
fore_tile(r, c);
|
fore_tile(r, c);
|
||||||
|
if (frame >= 137 && frame <= 144) { /* подъём: пол назначения поверх Kid */
|
||||||
|
uint8_t fidx = (uint8_t)(frame - 137);
|
||||||
|
for (r = rT; r <= rB; r++)
|
||||||
|
for (c = cL; c <= cR; c++)
|
||||||
|
climb_overlay_tile(r, c, fidx);
|
||||||
|
}
|
||||||
gfx_set_bank(GFX_BANK_NORMAL);
|
gfx_set_bank(GFX_BANK_NORMAL);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ void pop_room_draw(uint8_t room_num,
|
|||||||
* звать ПОСЛЕ kid_draw. obj_x — ЛОГИЧЕСКАЯ X кадра (до ×8/7), obj_y — низ
|
* звать ПОСЛЕ kid_draw. obj_x — ЛОГИЧЕСКАЯ X кадра (до ×8/7), obj_y — низ
|
||||||
* спрайта, w/h — размер кадра, dir — направление Kid (<0 влево). Метрики
|
* спрайта, w/h — размер кадра, dir — направление Kid (<0 влево). Метрики
|
||||||
* берутся из pop_kid (kid_fp_*). См. redraw_at_char/set_char_collision. */
|
* берутся из pop_kid (kid_fp_*). См. redraw_at_char/set_char_collision. */
|
||||||
void pop_fore_over_kid(int obj_x, int obj_y, uint16_t w, uint16_t h, int8_t dir);
|
void pop_fore_over_kid(int obj_x, int obj_y, uint16_t w, uint16_t h,
|
||||||
|
int8_t dir, uint8_t frame);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ int main(void)
|
|||||||
kid_init(SEQ_STAND, 1, 1, 0);
|
kid_init(SEQ_STAND, 1, 1, 0);
|
||||||
kid_draw();
|
kid_draw();
|
||||||
pop_fore_over_kid(kid_fp_obj_x(), kid_fp_obj_y(),
|
pop_fore_over_kid(kid_fp_obj_x(), kid_fp_obj_y(),
|
||||||
kid_fp_width(), kid_fp_height(), Kid.direction);
|
kid_fp_width(), kid_fp_height(), Kid.direction, Kid.frame);
|
||||||
|
|
||||||
if (pop_ctrl_init() != 0) { /* raw-канал клавиатуры (забирает ввод у DSS) */
|
if (pop_ctrl_init() != 0) { /* raw-канал клавиатуры (забирает ввод у DSS) */
|
||||||
closegraph();
|
closegraph();
|
||||||
@@ -72,7 +72,7 @@ int main(void)
|
|||||||
}
|
}
|
||||||
kid_draw(); /* нарисовать новый кадр */
|
kid_draw(); /* нарисовать новый кадр */
|
||||||
pop_fore_over_kid(kid_fp_obj_x(), kid_fp_obj_y(),
|
pop_fore_over_kid(kid_fp_obj_x(), kid_fp_obj_y(),
|
||||||
kid_fp_width(), kid_fp_height(), Kid.direction);
|
kid_fp_width(), kid_fp_height(), Kid.direction, Kid.frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
pop_ctrl_close();
|
pop_ctrl_close();
|
||||||
|
|||||||
@@ -45,6 +45,11 @@ OUT_DIR = os.path.join(HERE, "..", "poc", "res", "bg")
|
|||||||
# столбов, ворот, дебриса. См. tile_table.fore_id + анализ pop_background_strategy.
|
# столбов, ворот, дебриса. См. tile_table.fore_id + анализ pop_background_strategy.
|
||||||
FORE_ENV_IDS = {9, 12, 49, 88, 91, 95, 100}
|
FORE_ENV_IDS = {9, 12, 49, 88, 91, 95, 100}
|
||||||
|
|
||||||
|
# Пол-оверлей подъёма (floor_left_overlay, draw_floor_overlay seg008): рисуется
|
||||||
|
# рантаймом поверх нижней части Kid при подтягивании на пол у кромки — НЕ
|
||||||
|
# попадает в used render_room, добавляем явно в env-фон. (32 обычно уже есть.)
|
||||||
|
CLIMB_OVERLAY_ENV_IDS = {32, 150, 151}
|
||||||
|
|
||||||
ENV_SHIFT = 5 # env фон: страница = id>>5, idx = id&31
|
ENV_SHIFT = 5 # env фон: страница = id>>5, idx = id&31
|
||||||
ENV_MASK = (1 << ENV_SHIFT) - 1
|
ENV_MASK = (1 << ENV_SHIFT) - 1
|
||||||
|
|
||||||
@@ -235,7 +240,8 @@ def write_header(out_path, env_pages, wall_name, fore_name):
|
|||||||
def main():
|
def main():
|
||||||
os.makedirs(OUT_DIR, exist_ok=True)
|
os.makedirs(OUT_DIR, exist_ok=True)
|
||||||
used = collect_used()
|
used = collect_used()
|
||||||
env_ids = sorted(id for ch, id in used if ch != R.CHTAB_WALL)
|
env_ids = sorted(set(id for ch, id in used if ch != R.CHTAB_WALL)
|
||||||
|
| CLIMB_OVERLAY_ENV_IDS) # + пол-оверлей подъёма
|
||||||
wall_ids = sorted(id for ch, id in used if ch == R.CHTAB_WALL)
|
wall_ids = sorted(id for ch, id in used if ch == R.CHTAB_WALL)
|
||||||
|
|
||||||
env_bg = [i for i in env_ids if i not in FORE_ENV_IDS]
|
env_bg = [i for i in env_ids if i not in FORE_ENV_IDS]
|
||||||
|
|||||||
Reference in New Issue
Block a user