Files
Sprinter-SDCC/applications/PoP/roomtest/pop_ui.h
T
snark13 0db4f94707 Катсцены: fade длиной как в оригинале, музыка дослушивается до уровня
ДЛИТЕЛЬНОСТЬ. fade_in_1/fade_out_1 у оригинала — 64 шага палитры по два
тика, то есть 128 тиков = 2,13 с каждый; сцена перед уровнем 2 идёт с ними
около семи секунд. Наши четыре кадра укладывались в восемь сотых секунды,
и сцена выходила втрое короче. INTRO_FADE и TITLE_FADE теперь POP_T60(128).

Ступеней яркости стало восемь вместо четырёх (7/8, 3/4, 5/8, 1/2, 3/8,
1/4, 1/8, 0 — каждая парой сдвигов, умножения на Z80 не нужно): растянуть
четыре ступени на две секунды значило бы получить четыре скачка яркости.

МУЗЫКА. Прошлый коммит отдавал трек доигрывать уже в игре — так делает
оригинал. На слух вышло хуже: музыка спотыкается, потому что загрузка
уровня не даёт насосу долить блок вовремя (у DOS-версии такой проблемы
нет). Дослушиваем под чёрным экраном, до отрисовки уровня — тем более что
следующий load_intro у оригинала всё равно начинается с ожидания тишины
(seg001:681). Пропуск сцены обрывает и музыку.

Заодно: WAIT перед PV пересчитан (584 вместо 707 — наш fade больше не
короче), а тема титров пускается ПОСЛЕ fade_in, как в show_title.

Host-тесты: 15 наборов. Проверено в MAME: плавное появление титров.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 09:47:16 +03:00

90 lines
5.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* pop_ui.h — общий экранный слой PoP (FG5, банк 9).
*
* Здесь только примитивы: исходный SDLPoP-шрифт, палитровый fade и сборка
* полной страницы. Menu, title и cutscene держат собственные автоматы и
* строки, но не дублируют формат FONT.ATL или опасную работу с W0.
*/
#ifndef POP_UI_H
#define POP_UI_H
#include <stdint.h>
typedef enum {
POP_TEXT_SMALL = 0,
POP_TEXT_BIG = 1
} pop_text_font_t;
/* Жизненный цикл единственного FONT\FONT.ATL. Загрузка — в холодном boot,
* освобождение — после закрытия графики; повторные вызовы безопасны. */
int pop_ui_init(void) __banked;
void pop_ui_free(void) __banked;
uint8_t pop_ui_ready(void);
/* Группа text_*_mapped требует активного pop_text_map() и не вызывает
* BIOS/ESTEX. Для прозрачных букв установить GFX_BANK_SPRITE до рисования. */
void pop_text_map(void);
void pop_text_unmap(void);
uint8_t pop_text_width_mapped(pop_text_font_t font, const char *s);
void pop_text_draw_mapped(pop_text_font_t font, int x, int baseline,
const char *s);
void pop_text_center_mapped(pop_text_font_t font, int center, int baseline,
const char *s);
void pop_text_right_mapped(pop_text_font_t font, int right, int baseline,
const char *s);
/* Снимок обеих (идентичных по контракту) палитр хранится в свободном хвосте
* FONT.ATL. dim_step: 0 — исходная, POP_PAL_DIM_BLACK — чёрная; между ними
* восемь равных ступеней (7/8, 3/4, 5/8, 1/2, 3/8, 1/4, 1/8). Восемь, а не
* четыре, потому что fade оригинала длится 2,13 с: на четырёх ступенях это
* четыре заметных скачка яркости.
* keep_ui сохраняет диапазон 0x37..0x3F ярким для текста/рамки меню. */
void pop_ui_palette_snapshot(void) __banked;
#define POP_PAL_DIM_BLACK 8
void pop_ui_palette_dim(uint8_t dim_step, uint8_t keep_ui) __banked;
void pop_ui_palette_restore(void) __banked;
/* Немедленно погасить все 256 цветов обеих страниц. В отличие от dim(),
* не требует загруженного FONT.ATL: это ранний экран запуска, когда в VRAM
* ещё может лежать картинка предыдущей программы. */
void pop_ui_palette_black(void) __banked;
/* Пошаговый fade к снимку: fade_out сначала делает снимок, fade_in требует
* его сохранить. Каждый шаг показывается на следующем фронте. */
void pop_ui_fade_out(uint8_t steps) __banked;
void pop_ui_fade_in(uint8_t steps) __banked;
/* Полная экранная страница: begin выбирает скрытую страницу, fill рисует
* непрозрачный фон и present делает ГОТОВУЮ страницу видимой на фронте.
* Текст на второй странице надо нарисовать заново — GFX_BANK_SPRITE не
* меняет shadow-копию, и это сознательный контракт временного UI. */
uint8_t pop_screen_begin(void) __banked;
void pop_screen_fill(uint8_t color) __banked;
/* Индекс палитры для всего, что ВНЕ игрового поля 320x192 (борта, полоса
* HP). В палитре он чёрный, но НЕ нулевой — поэтому вспышки, которые
* подменяют цвет 0, не задевают рамку и жизни. */
#define POP_COL_OUTSIDE 1
/* Подготовить экран под игру: вне поля POP_COL_OUTSIDE, внутри — цвет 0.
* Звать на СТАРТЕ и смене уровня; заодно сбрасывает служебные полосы. */
void pop_screen_fill_game(void) __banked;
/* Только игровое поле (борта и всё, что на них, не трогает) — это путь
* входа в комнату. */
void pop_screen_fill_field(void) __banked;
void pop_screen_present(uint8_t page) __banked;
/* Нарисовать в уже выбранную draw-страницу набор вертикальных полос SPA1.
* Полоса загружается, блитится и тут же освобождается; функция не вызывает
* BIOS/vsync, поэтому её можно безопасно применять в title и cutscene.
* Возвращает -1 при ошибке чтения очередной полосы. */
int pop_screen_blit_atlas_strips(const char * const *parts,
uint8_t count, int x, int y) __banked;
/* Те же полосы, но из архива ресурсов: элементы base..base+count-1.
* Один `open` на экран вместо одного на полосу. */
int pop_screen_blit_atlas_arc(struct pop_arc_s *arc, const uint8_t *tbl,
uint8_t base, uint8_t count,
int x, int y) __banked;
#endif /* POP_UI_H */