L9-INVERT: чёрные плиты слоя фона тоже зеркалятся (баг решётки)

Найдено пользователем: поднимающаяся решётка анимировалась неправильно, а в
углу (0,0) оставался чёрный прямоугольник — заливки шли голым bar по
НЕПЕРЕВЁРНУТЫМ экранным координатам.

Формула переворота вынесена в pop_bg.h (POP_FLIP_TOP) — одна на весь порт,
и добавлен pop_bar_black: чёрная плита банком 0x50 с учётом переворота и с
пометкой области (bar идёт мимо pop_blit_b).  На неё переведены все четыре
стирания слоя фона: решётка, полоса потолка, floor_bake, loose_bake_empty.

Проверено в MAME: перевёрнутая комната чистая, артефакта в углу нет.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-12 17:59:18 +03:00
parent abc7ff88ed
commit c60415a322
4 changed files with 29 additions and 14 deletions
+8
View File
@@ -26,6 +26,14 @@
/* Экранный y нижней границы поля (ниже — статус-полоса + борт → клип). */
#define POP_CLIP_BOTTOM (POP_YOFF + POP_PLAYFIELD_H)
/* Экранный верх прямоугольника при ПЕРЕВОРОТЕ (зелье инверсии): поле
* отражается внутри себя, борта не трогаются. ОДНА формула на весь порт —
* блит тайла, heal точечных перерисовок и чёрные плиты обязаны считать
* одинаково, иначе стираем в одном месте, а рисуем в другом (именно так
* ломались чомперы и решётка). Зеркалит ВЫЗЫВАЮЩИЙ; у примитивов libbgi
* семантика координат не меняется. */
#define POP_FLIP_TOP(top, h) (2 * POP_YOFF + POP_PLAYFIELD_H - (top) - (int)(h))
/* Выбор ядра libbgi (pop_onscreen_cols / pop_heal_fast) переехал в
* `_pop_draw.h` — его включают только три рисующих модуля. Из общего
* заголовка SDCC размножал мёртвые копии этих inline'ов по всем TU: см.