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:
@@ -263,11 +263,7 @@ void pop_cd_clear(uint8_t p)
|
||||
* платили и блиты БЕЗ клипа (`ld -n(ix)` = 19 тактов номинала, у нас ~46).
|
||||
* А блитов без клипа большинство: весь фон вне fore-прохода — факелы, зелья,
|
||||
* перерисовка тайлов — идёт с pop_t_fclip_on == 0. */
|
||||
/* Экранный y при ПЕРЕВОРОТЕ (зелье инверсии): поле отражается внутри себя,
|
||||
* борта не трогаются. Одна формула на весь слой фона — если её продублируют
|
||||
* где-то ещё, получим двойной переворот (см. l9_invert_plan.md §II.2:
|
||||
* зеркалит ТОЛЬКО вызывающий, у примитивов семантика не меняется). */
|
||||
#define FLIP_TOP(top, h) (2 * POP_YOFF + POP_PLAYFIELD_H - (top) - (int)(h))
|
||||
#define FLIP_TOP(top, h) POP_FLIP_TOP(top, h) /* формула — в pop_bg.h */
|
||||
|
||||
static void blit_b_clip(const uint8_t *img, int x, int top, int w, int h)
|
||||
{
|
||||
@@ -371,6 +367,15 @@ void pop_pot_b(uint8_t id, int x, int yb) { pop_blit_b(&pop_pot_at, id, x, yb)
|
||||
* обязан отразиться ровно так же, как сам тайл, — иначе heal чистит одно
|
||||
* место, а рисует в другое: именно так «ломалась анимация чомперов»
|
||||
* (найдено пользователем на первом же прогоне зеркального фона). */
|
||||
void pop_bar_black(int x, int top, int w, int h)
|
||||
{
|
||||
if (pop_upside) top = FLIP_TOP(top, h);
|
||||
gfx_set_bank(GFX_BANK_NORMAL);
|
||||
setfillstyle(SOLID_FILL, BLACK);
|
||||
bar(x, top, x + w - 1, top + h - 1);
|
||||
pop_cd_touch(x, top, w, h); /* bar идёт мимо pop_blit_b (DRAW-COST) */
|
||||
}
|
||||
|
||||
void pop_heal_off(int x, int y, int w, int h)
|
||||
{
|
||||
int top = y + POP_YOFF;
|
||||
|
||||
Reference in New Issue
Block a user