Таблица рекордов на титрах проявляется собранной

Строки дорисовывались уже после полосового перехода: он копирует страницу
акселератором, а тот читает ОЗУ-копию, куда GFX_BANK_SPRITE (NOSHADOW +
TRANSPARENT) не пишет. Банк GFX_BANK_TRANSPARENT даёт ту же прозрачность
0xFF, но обновляет и копию, поэтому страницу можно собрать целиком до
показа — как offscreen оригинала (draw_full_image + show_hof, и только
потом transition_ltr).

Проверено в MAME: на промежуточных кадрах перехода строка рекорда видна в
уже проявившейся части экрана вместе с логотипом.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-26 17:18:58 +03:00
parent 747783c422
commit 4b74478d19
3 changed files with 24 additions and 20 deletions
+5 -4
View File
@@ -3589,10 +3589,11 @@ FIRST_LEVEL`. Рестарт ТОГО ЖЕ уровня (смерть, чекп
титры. титры.
**Грабля, которая стоила отладки.** Переход копирует страницу **Грабля, которая стоила отладки.** Переход копирует страницу
акселератором, а тот читает ОЗУ-копию — прозрачный (спрайтовый) блит туда не акселератором, а тот читает ОЗУ-копию. `GFX_BANK_SPRITE` (NOSHADOW +
пишет. Всё, что нарисовано текстом, обязано рисоваться ПОСЛЕ перехода, иначе TRANSPARENT) в неё не пишет, поэтому переезжал один фон без текста (так вышла
переезжает только фон (так вышла пустая таблица рекордов, см. пустая таблица рекордов, см. [HOF-ENTRY](TASKS_CLOSED.md#hof-entry)). Всё,
[HOF-ENTRY](TASKS_CLOSED.md#hof-entry)). что должно проявляться ВМЕСТЕ с фоном, рисовать банком
`GFX_BANK_TRANSPARENT` — прозрачность та же, но копия обновляется.
--- ---
+5 -3
View File
@@ -1344,9 +1344,11 @@ make-бита для кода `0x6C`. Скратч-байты — хвост `o
`POP_FONT_COLOR`) в ней ЧЁРНАЯ. Текст рисовался, но был не виден. `POP_FONT_COLOR`) в ней ЧЁРНАЯ. Текст рисовался, но был не виден.
Теперь генератор кладёт в 0x3F золотой 0xB7 оригинала. Теперь генератор кладёт в 0x3F золотой 0xB7 оригинала.
2. Полосовой переход копирует страницу АКСЕЛЕРАТОРОМ, а тот читает ОЗУ-копию 2. Полосовой переход копирует страницу АКСЕЛЕРАТОРОМ, а тот читает ОЗУ-копию
(`gfx_copy_page`: «копируется чистый фон без спрайтов»), куда прозрачный (`gfx_copy_page`: «копируется чистый фон без спрайтов»). `GFX_BANK_SPRITE`
блит текста не пишет. Поэтому на титрах фон переезжал, а строки — нет. — это NOSHADOW + TRANSPARENT, то есть в копию он не пишет, и на титрах
Строки теперь рисуются ПОСЛЕ перехода, прямо в видимую страницу. переезжал один фон без строк. Лечится банком `GFX_BANK_TRANSPARENT`
(0x58): та же прозрачность 0xFF, но с записью в копию — страница
собирается ЦЕЛИКОМ до показа, как offscreen оригинала.
**Что появилось попутно.** **Что появилось попутно.**
+14 -13
View File
@@ -285,16 +285,18 @@ static void hof_edit_bar(uint8_t row)
bar(HOF_EDIT_LEFT, top, HOF_EDIT_RIGHT, top + HOF_ROW_H - 1); bar(HOF_EDIT_LEFT, top, HOF_EDIT_RIGHT, top + HOF_ROW_H - 1);
} }
/* Строки таблицы в ТЕКУЩУЮ draw-страницу. Отделены от фона потому, что /* Строки таблицы в ТЕКУЩУЮ draw-страницу.
* полосовой переход НЕ ПЕРЕНОСИТ их: gfx_copy_page работает акселератором, *
* а тот читает ОЗУ-копию страницы, куда прозрачный (спрайтовый) блит не * БАНК ЗДЕСЬ TRANSPARENT, А НЕ SPRITE. Полосовой переход копирует страницу
* пишет. Поэтому на титрах строки рисуются уже после перехода, прямо в * акселератором, а тот читает ОЗУ-копию (gfx_copy_page); SPRITE — это
* видимую страницу. */ * NOSHADOW + TRANSPARENT, то есть в копию он не пишет, и на титрах
* переезжал бы один фон без строк. TRANSPARENT даёт ту же прозрачность
* 0xFF, но обновляет и копию, поэтому таблица проявляется уже собранной. */
static void hof_draw_rows(uint8_t edit_row) static void hof_draw_rows(uint8_t edit_row)
{ {
uint8_t i; uint8_t i;
gfx_set_bank(GFX_BANK_SPRITE); gfx_set_bank(GFX_BANK_TRANSPARENT);
pop_text_map(); pop_text_map();
for (i = 0; i < HOF_COUNT; i++) { for (i = 0; i < HOF_COUNT; i++) {
char value[12]; char value[12];
@@ -333,7 +335,7 @@ static void hof_edit_draw(uint8_t row, const char *name, uint8_t cursor)
gfx_set_draw_page(gfx_get_visible_page()); gfx_set_draw_page(gfx_get_visible_page());
hof_edit_bar(row); hof_edit_bar(row);
gfx_set_bank(GFX_BANK_SPRITE); gfx_set_bank(GFX_BANK_TRANSPARENT);
pop_text_map(); pop_text_map();
/* Тёмный набор: на золотой полосе оригинал пишет цветом 0xBE. */ /* Тёмный набор: на золотой полосе оригинал пишет цветом 0xBE. */
if (name[0]) { if (name[0]) {
@@ -518,12 +520,11 @@ uint8_t pop_hof_show_title(void) __banked
hof_load(); hof_load();
if (!hof_has_entries()) return 0; if (!hof_has_entries()) return 0;
page = pop_screen_begin(); page = pop_screen_begin();
/* Ни fade, ни смены палитры: экран проявляется полосами прямо поверх /* Страница собирается ЦЕЛИКОМ до показа — как offscreen оригинала:
* credits, на той же story.pal (seg000:2063). Переход несёт ТОЛЬКО * draw_full_image + show_hof, и только потом transition_ltr
* фон — строки дорисовываются следом в видимую страницу. */ * (seg000:2063). Ни fade, ни смены палитры: экран проявляется прямо
if (pop_intro_hof_bg(page) != 0) return 0; * поверх credits, на той же story.pal. */
if (hof_page_build(page, HOF_NO_ROW) != 0) return 0;
pop_screen_present_ltr(); pop_screen_present_ltr();
gfx_set_draw_page(gfx_get_visible_page());
hof_draw_rows(HOF_NO_ROW);
return hof_wait_frames(HOF_TITLE_TICKS); return hof_wait_frames(HOF_TITLE_TICKS);
} }