Фикс чистки факелов при перевороте: чистим в СТАРОЙ системе координат

На скриншоте пользователя после U остался чёрный квадрат в стороне от
факела, а у двух факелов пропало пламя.  Причина — система координат:
pop_upside переключается в главном цикле ДО pop_flip_screen, а картинка на
экране к этому моменту нарисована ещё в прежней.  pop_torch_wipe считала
координаты уже зеркально, поэтому чёрный бар ложился в отражённое место
(там и остался квадрат), а само пламя не стиралось.

Чистка теперь идёт при временно возвращённом старом значении pop_upside —
то есть ровно по той картинке, что на экране.
This commit is contained in:
2026-08-12 23:44:22 +03:00
parent c9aa6d9c16
commit 7f5c99ba4f
@@ -530,12 +530,19 @@ void pop_flip_screen(void) __banked
* прямую копию уже чистой картинки. Дешевле полной перерисовки комнаты
* на порядок: 0..4 тайла против 6.2 млн тактов (14.5 кадра, замер MAME
* 2026-08-12) — а копия отражения стоит всего 2.1 кадра. */
/* ВНИМАНИЕ на систему координат: pop_upside к этому моменту УЖЕ
* переключён (главный цикл делает это перед вызовом), а картинка на
* экране нарисована ещё в СТАРОЙ. Чистить её надо по старым
* координатам, иначе чёрный бар ложится в зеркальное место — на экране
* оставался чёрный квадрат, а пламя так и не стиралось. */
pop_upside = (uint8_t)!pop_upside; /* временно: система ЭКРАНА */
gfx_set_draw_page(front);
for (i = 0; i < 30; i++) {
uint8_t t = room_fg[i];
if (t == 19 || t == 30) /* факел / факел с щебнем */
pop_torch_wipe(i / 10, i % 10);
}
pop_upside = (uint8_t)!pop_upside; /* вернуть новое состояние */
gfx_set_draw_page(back);
gfx_copy_page(&area, GFX_COPY_VFLIP); /* источник — видимая страница */