L4-MIRROR шаги 3 и 5 + левый клип колонок в libbgi
libbgi: новая gfx_blit_cols_part_wx — обрезка СЛЕВА (skipw) в дополнение к верхней (skip/rows) и правой (maxw). По подсказке пользователя сделано примитивом, а не обходным путём «нарисовать и вернуть фон поверх лишнего»: для column-major левая обрезка стоит ровно столько же, сколько правая — колонка это непрерывный кусок ОЗУ, меняется стартовая колонка источника и экранная X. Внутри это уже было (так клипается левый край экрана), наружу не было выведено. Полное тело блита колонками переехало туда, gfx_blit_cols_part_w стала обёрткой (skipw=0). size-check: OK, роста нет (62 программы, -22..-33 Б на пользователей блита). Шаг 5 — клип ТЕНИ (seg008:1699): на уровне зеркала она показывается только СПРАВА от него, obj_clip_left = 137 + (mirror_column-4)*32. Шаг 3 — ОТРАЖЕНИЕ (check_mirror, seg003:0798): пока Кид стоит на тайле зеркала, каждый кадр рисуется его зеркальная копия с клипом left = (curr_col<<5)+9 и top = y_clip[curr_row+1]. Отдельной функцией pop_mirror_draw, а НЕ третьим слотом Char — это структура самого оригинала: отражение идёт сокращённым путём load_frame_to_obj + add_objtable(4), без клинка, брызг, fore-прохода и пропуска кадра; гейтить всё это в общем теле значило бы добавить ветки в самый горячий путь. Свой heal (pop_mirror_heal) рядом с pop_char_heal, в skip-маске не участвует. tests-host: заглушки pop_mirror_draw/pop_mirror_heal (pop_map теперь на них ссылается), все 5 наборов прошли. Цена: _CODE 24501 -> 24629, банк 3 10551, банк 4 8267 -> 9590. НЕ ПРОВЕРЕНО В MAME. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -142,6 +142,20 @@ void gfx_blit_cols_part(int x, int y, const void *img, uint8_t flip,
|
||||
void gfx_blit_cols_part_w(int x, int y, const void *img, uint8_t flip,
|
||||
int skip, int rows, uint8_t maxw);
|
||||
|
||||
/* То же + ОБРЕЗКА СЛЕВА: рисуются только колонки [skipw, skipw+maxw)
|
||||
* футпринта, считая от x (skipw = 0 — от левого края, maxw = 0 — до правого
|
||||
* края кадра). Для column-major левая обрезка стоит столько же, сколько
|
||||
* правая: колонка — непрерывный кусок ОЗУ, меняется стартовая колонка
|
||||
* источника и экранная X. Работает и при flip: НАРИСОВАННЫЕ колонки всегда
|
||||
* идут слева направо по футпринту, независимо от направления чтения.
|
||||
*
|
||||
* Мотивация — зеркало в PoP (obj_clip_left, seg003:0798 / seg008:1699):
|
||||
* отражение Кида видно только внутри проёма, тень уровня 4 — только справа
|
||||
* от зеркала. Здесь живёт ПОЛНОЕ тело блита колонками, остальные три
|
||||
* варианта — обёртки. */
|
||||
void gfx_blit_cols_part_wx(int x, int y, const void *img, uint8_t flip,
|
||||
int skip, int rows, uint8_t skipw, uint8_t maxw);
|
||||
|
||||
/* То же БЕЗ клипа по экрану — пара к gfx_blit_cols_part так же, как
|
||||
* gfx_blit_part_noclip к gfx_blit_part. Вызывающий гарантирует: спрайт
|
||||
* целиком на экране, ширина/высота кадра и y <= 255, skip < высоты.
|
||||
|
||||
Reference in New Issue
Block a user