From 4b74478d19fd991d8c5d096d9823aca114eaf864 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Wed, 26 Aug 2026 17:18:58 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B0=20?= =?UTF-8?q?=D1=80=D0=B5=D0=BA=D0=BE=D1=80=D0=B4=D0=BE=D0=B2=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D1=82=D0=B8=D1=82=D1=80=D0=B0=D1=85=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=8F=D0=B2=D0=BB=D1=8F=D0=B5=D1=82=D1=81=D1=8F=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=BD=D0=BD=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Строки дорисовывались уже после полосового перехода: он копирует страницу акселератором, а тот читает ОЗУ-копию, куда GFX_BANK_SPRITE (NOSHADOW + TRANSPARENT) не пишет. Банк GFX_BANK_TRANSPARENT даёт ту же прозрачность 0xFF, но обновляет и копию, поэтому страницу можно собрать целиком до показа — как offscreen оригинала (draw_full_image + show_hof, и только потом transition_ltr). Проверено в MAME: на промежуточных кадрах перехода строка рекорда видна в уже проявившейся части экрана вместе с логотипом. Co-Authored-By: Claude Opus 5 --- applications/PoP/roomtest/BUGS_CLOSED.md | 9 ++++---- applications/PoP/roomtest/TASKS_CLOSED.md | 8 ++++--- applications/PoP/roomtest/pop_hof.c | 27 ++++++++++++----------- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/applications/PoP/roomtest/BUGS_CLOSED.md b/applications/PoP/roomtest/BUGS_CLOSED.md index b83936f..ac12419 100644 --- a/applications/PoP/roomtest/BUGS_CLOSED.md +++ b/applications/PoP/roomtest/BUGS_CLOSED.md @@ -3589,10 +3589,11 @@ FIRST_LEVEL`. Рестарт ТОГО ЖЕ уровня (смерть, чекп титры. **Грабля, которая стоила отладки.** Переход копирует страницу -акселератором, а тот читает ОЗУ-копию — прозрачный (спрайтовый) блит туда не -пишет. Всё, что нарисовано текстом, обязано рисоваться ПОСЛЕ перехода, иначе -переезжает только фон (так вышла пустая таблица рекордов, см. -[HOF-ENTRY](TASKS_CLOSED.md#hof-entry)). +акселератором, а тот читает ОЗУ-копию. `GFX_BANK_SPRITE` (NOSHADOW + +TRANSPARENT) в неё не пишет, поэтому переезжал один фон без текста (так вышла +пустая таблица рекордов, см. [HOF-ENTRY](TASKS_CLOSED.md#hof-entry)). Всё, +что должно проявляться ВМЕСТЕ с фоном, рисовать банком +`GFX_BANK_TRANSPARENT` — прозрачность та же, но копия обновляется. --- diff --git a/applications/PoP/roomtest/TASKS_CLOSED.md b/applications/PoP/roomtest/TASKS_CLOSED.md index bb8e66f..b5a8e42 100644 --- a/applications/PoP/roomtest/TASKS_CLOSED.md +++ b/applications/PoP/roomtest/TASKS_CLOSED.md @@ -1344,9 +1344,11 @@ make-бита для кода `0x6C`. Скратч-байты — хвост `o `POP_FONT_COLOR`) в ней ЧЁРНАЯ. Текст рисовался, но был не виден. Теперь генератор кладёт в 0x3F золотой 0xB7 оригинала. 2. Полосовой переход копирует страницу АКСЕЛЕРАТОРОМ, а тот читает ОЗУ-копию - (`gfx_copy_page`: «копируется чистый фон без спрайтов»), куда прозрачный - блит текста не пишет. Поэтому на титрах фон переезжал, а строки — нет. - Строки теперь рисуются ПОСЛЕ перехода, прямо в видимую страницу. + (`gfx_copy_page`: «копируется чистый фон без спрайтов»). `GFX_BANK_SPRITE` + — это NOSHADOW + TRANSPARENT, то есть в копию он не пишет, и на титрах + переезжал один фон без строк. Лечится банком `GFX_BANK_TRANSPARENT` + (0x58): та же прозрачность 0xFF, но с записью в копию — страница + собирается ЦЕЛИКОМ до показа, как offscreen оригинала. **Что появилось попутно.** diff --git a/applications/PoP/roomtest/pop_hof.c b/applications/PoP/roomtest/pop_hof.c index 36de92f..778838a 100644 --- a/applications/PoP/roomtest/pop_hof.c +++ b/applications/PoP/roomtest/pop_hof.c @@ -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); } -/* Строки таблицы в ТЕКУЩУЮ draw-страницу. Отделены от фона потому, что - * полосовой переход НЕ ПЕРЕНОСИТ их: gfx_copy_page работает акселератором, - * а тот читает ОЗУ-копию страницы, куда прозрачный (спрайтовый) блит не - * пишет. Поэтому на титрах строки рисуются уже после перехода, прямо в - * видимую страницу. */ +/* Строки таблицы в ТЕКУЩУЮ draw-страницу. + * + * БАНК ЗДЕСЬ TRANSPARENT, А НЕ SPRITE. Полосовой переход копирует страницу + * акселератором, а тот читает ОЗУ-копию (gfx_copy_page); SPRITE — это + * NOSHADOW + TRANSPARENT, то есть в копию он не пишет, и на титрах + * переезжал бы один фон без строк. TRANSPARENT даёт ту же прозрачность + * 0xFF, но обновляет и копию, поэтому таблица проявляется уже собранной. */ static void hof_draw_rows(uint8_t edit_row) { uint8_t i; - gfx_set_bank(GFX_BANK_SPRITE); + gfx_set_bank(GFX_BANK_TRANSPARENT); pop_text_map(); for (i = 0; i < HOF_COUNT; i++) { 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()); hof_edit_bar(row); - gfx_set_bank(GFX_BANK_SPRITE); + gfx_set_bank(GFX_BANK_TRANSPARENT); pop_text_map(); /* Тёмный набор: на золотой полосе оригинал пишет цветом 0xBE. */ if (name[0]) { @@ -518,12 +520,11 @@ uint8_t pop_hof_show_title(void) __banked hof_load(); if (!hof_has_entries()) return 0; page = pop_screen_begin(); - /* Ни fade, ни смены палитры: экран проявляется полосами прямо поверх - * credits, на той же story.pal (seg000:2063). Переход несёт ТОЛЬКО - * фон — строки дорисовываются следом в видимую страницу. */ - if (pop_intro_hof_bg(page) != 0) return 0; + /* Страница собирается ЦЕЛИКОМ до показа — как offscreen оригинала: + * draw_full_image + show_hof, и только потом transition_ltr + * (seg000:2063). Ни fade, ни смены палитры: экран проявляется прямо + * поверх credits, на той же story.pal. */ + if (hof_page_build(page, HOF_NO_ROW) != 0) return 0; 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); }