Катсцены: тайминги, часы и «время вышло» — по оригиналу; тумблер музыки
ТАЙМИНГИ. Треки заставок между уровнями длиннее самих сцен (27 — 10,7 с против 2,6 с картинки), и оригинал их не обрывает: load_intro гасит экран и возвращает управление, а звук продолжает играть поверх загрузки уровня и первых секунд игры (seg001:690). Мы глушили CBL на выходе — музыка обрывалась на полуслове. Больше не глушим. «ВРЕМЯ ВЫШЛО». Оригинал (seg001:04D3) не зовёт ни одного init_*: на экране пустая комната и ОСТАНОВИВШИЕСЯ часы (state 7, струйки песка нет). Мы показывали готовую композицию с принцессой и полными часами — противоположное по смыслу. Теперь это живая сцена без персонажей, 102 кадра, и трек 36 дослушивается под чёрным экраном, как в оригинале. ПЕСОЧНЫЕ ЧАСЫ. Сцена «времени мало» (cutscene_12) шла статической композицией, куда упаковщик запёк res953 — ПОЛНЫЕ часы. Отсюда и наблюдение «чем меньше времени, тем полнее часы»: картинка была одна и та же независимо от таймера. Сделана живой (cut_scene_12_short: принцесса стоит правее, через два кадра оборачивается), часы берутся от pre_hourglass_state. Заодно: при state 7 струйка песка не рисуется. МУЗЫКА — СВОЙ ТУМБЛЕР. Settings -> MUSIC, Ctrl+M и статус в debug bar. Флаг pop_mus_want отдельный от звукового: музыка у нас поток с диска, и выключают её по другим причинам, чем эффекты; выключение обрывает текущий трек, эффекты продолжают звучать. Строка-заглушка GAMEPLAY PROFILE («VANILLA ONLY») уступила место MUSIC — на десятую строку экрана не хватает. Подписи тумблеров в debug bar сокращены до S:/M:/I:. БАГИ. После меню персонаж оставался невидимым до первого движения: снимок слота продолжал утверждать, что кадр на странице уже нарисован. Общая pop_cd_forget() теперь зовётся после меню, QuickLoad и переворота экрана. «QUICKLOAD» мигал через кадр — pop_status_show_now снимал бит видимой страницы, а её успевало переписать восстановление комнаты. Host-тесты: 15 наборов. Проверено в MAME: debug bar, выход из меню. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -73,6 +73,8 @@ static const char * const status_text[POP_MSG_N] = {
|
||||
"NO QUICKLOAD",
|
||||
"SOUND ON",
|
||||
"SOUND OFF",
|
||||
"MUSIC ON",
|
||||
"MUSIC OFF",
|
||||
"", /* LEVEL N — собирается с номером */
|
||||
"", /* N MINUTES LEFT */
|
||||
"", /* N SECONDS LEFT */
|
||||
@@ -113,10 +115,15 @@ static uint8_t st_arg; /* номер уровня для POP_MSG_LEVEL
|
||||
#define R_VAL_ROOM 84 /* зона 71..83 */
|
||||
#define X_LBL_SPEED 84 /* ", Speed:" 84..116 */
|
||||
#define R_VAL_SPEED 152 /* зона 117..151 */
|
||||
#define X_LBL_SOUND 152 /* ", Sound:" 152..184 */
|
||||
#define R_VAL_SOUND 202 /* зона 185..201 */
|
||||
#define X_LBL_IMM 202 /* ", Immortal" 202..243 */
|
||||
#define R_VAL_IMM 253 /* зона 244..252: цифре нужен зазор в пробел */
|
||||
/* Три тумблера подряд — звук, музыка, бессмертие. Подписи сокращены до
|
||||
* буквы с двоеточием: полные слова («Sound», «Immortal») занимали столько,
|
||||
* что на музыку места уже не оставалось, а смысл и так читается. */
|
||||
#define X_LBL_SOUND 152 /* ", S:" 152..168 */
|
||||
#define R_VAL_SOUND 185 /* зона 169..184 */
|
||||
#define X_LBL_MUS 185 /* ", M:" 185..201 */
|
||||
#define R_VAL_MUS 218 /* зона 202..217 */
|
||||
#define X_LBL_IMM 218 /* ", I:" 218..234 */
|
||||
#define R_VAL_IMM 245 /* зона 235..244: цифре нужен зазор в пробел */
|
||||
/* Оставшееся время ##:## — отдельным полем у правого края, подписи не
|
||||
* требует: формат читается сам. */
|
||||
#define R_VAL_TIME 310 /* зона 284..309 */
|
||||
@@ -125,7 +132,7 @@ static uint8_t st_arg; /* номер уровня для POP_MSG_LEVEL
|
||||
/* Ширина зоны значения — под самый длинный вариант плюс воздух. */
|
||||
#define W_VAL_NUM 13 /* две цифры */
|
||||
#define W_VAL_SPEED 35 /* FASTEST */
|
||||
#define W_VAL_SOUND 17 /* OFF */
|
||||
#define W_VAL_SOUND 16 /* OFF */
|
||||
#define W_VAL_IMM 9 /* одна цифра */
|
||||
|
||||
enum { /* биты маски «что перерисовать» */
|
||||
@@ -135,12 +142,13 @@ enum { /* биты маски «что перерис
|
||||
DBG_F_SOUND = 0x08,
|
||||
DBG_F_IMM = 0x10,
|
||||
DBG_F_TIME = 0x20,
|
||||
DBG_F_ALL = 0x3F /* + подписи: см. dbg_labels */
|
||||
DBG_F_MUS = 0x40,
|
||||
DBG_F_ALL = 0x7F /* + подписи: см. dbg_labels */
|
||||
};
|
||||
|
||||
static const char * const speed_text[] = { "NORMAL", "FAST", "FASTEST" };
|
||||
|
||||
static uint8_t dbg_lvl, dbg_room, dbg_spd, dbg_snd, dbg_imm;
|
||||
static uint8_t dbg_lvl, dbg_room, dbg_spd, dbg_snd, dbg_mus, dbg_imm;
|
||||
static uint8_t dbg_tmin, dbg_tsec; /* показанное время ##:## */
|
||||
static uint8_t dbg_phase; /* кадры до пересчёта секунд */
|
||||
static uint8_t dbg_dirty[2]; /* маска по странице; DBG_F_ALL => и подписи */
|
||||
@@ -308,7 +316,11 @@ void pop_status_show_now(uint8_t msg) __banked
|
||||
saved_bank = gfx_get_bank();
|
||||
gfx_set_draw_page(visible);
|
||||
status_draw();
|
||||
st_dirty = (uint8_t)(st_dirty & ~(1 << visible));
|
||||
/* Бит видимой страницы НЕ снимаем. За время дисковой операции ту же
|
||||
* страницу успевает переписать восстановление комнаты, и снятый бит
|
||||
* означал бы «здесь уже нарисовано» — надпись оставалась ровно на одной
|
||||
* странице и мигала через кадр (поймано на QUICKLOAD). Лишняя
|
||||
* перерисовка строки стоит дешевле мигания. */
|
||||
gfx_set_draw_page(saved_page);
|
||||
gfx_set_bank(saved_bank);
|
||||
}
|
||||
@@ -334,8 +346,9 @@ static void dbg_labels(void)
|
||||
pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_LEVEL, DBG_BASE, "Level");
|
||||
pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_ROOM, DBG_BASE, ", Room");
|
||||
pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_SPEED, DBG_BASE, ", Speed:");
|
||||
pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_SOUND, DBG_BASE, ", Sound:");
|
||||
pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_IMM, DBG_BASE, ", Immortal");
|
||||
pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_SOUND, DBG_BASE, ", S:");
|
||||
pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_MUS, DBG_BASE, ", M:");
|
||||
pop_text_draw_mapped(POP_TEXT_SMALL, X_LBL_IMM, DBG_BASE, ", I:");
|
||||
pop_text_unmap();
|
||||
}
|
||||
|
||||
@@ -359,6 +372,8 @@ static void dbg_draw(uint8_t mask)
|
||||
speed_text[dbg_spd < 3 ? dbg_spd : 0]);
|
||||
if (mask & DBG_F_SOUND)
|
||||
dbg_value(R_VAL_SOUND, W_VAL_SOUND, dbg_snd ? "ON" : "OFF");
|
||||
if (mask & DBG_F_MUS)
|
||||
dbg_value(R_VAL_MUS, W_VAL_SOUND, dbg_mus ? "ON" : "OFF");
|
||||
if (mask & DBG_F_IMM) {
|
||||
buf[0] = (char)('0' + (dbg_imm < 10 ? dbg_imm : 9));
|
||||
buf[1] = 0;
|
||||
@@ -377,7 +392,7 @@ static void dbg_draw(uint8_t mask)
|
||||
static void dbg_scan(uint8_t room)
|
||||
{
|
||||
uint8_t prev_lvl = dbg_lvl, prev_room = dbg_room, prev_spd = dbg_spd;
|
||||
uint8_t prev_snd = dbg_snd, prev_imm = dbg_imm;
|
||||
uint8_t prev_snd = dbg_snd, prev_mus = dbg_mus, prev_imm = dbg_imm;
|
||||
uint8_t prev_tmin = dbg_tmin, prev_tsec = dbg_tsec;
|
||||
uint8_t mask = 0;
|
||||
|
||||
@@ -402,11 +417,13 @@ static void dbg_scan(uint8_t room)
|
||||
dbg_room = room;
|
||||
dbg_spd = pop_speed_mode;
|
||||
dbg_snd = pop_snd_want;
|
||||
dbg_mus = pop_mus_want;
|
||||
dbg_imm = pop_immortal;
|
||||
if (dbg_lvl != prev_lvl) mask |= DBG_F_LEVEL;
|
||||
if (dbg_room != prev_room) mask |= DBG_F_ROOM;
|
||||
if (dbg_spd != prev_spd) mask |= DBG_F_SPEED;
|
||||
if (dbg_snd != prev_snd) mask |= DBG_F_SOUND;
|
||||
if (dbg_mus != prev_mus) mask |= DBG_F_MUS;
|
||||
if (dbg_imm != prev_imm) mask |= DBG_F_IMM;
|
||||
if (dbg_tmin != prev_tmin || dbg_tsec != prev_tsec) mask |= DBG_F_TIME;
|
||||
if (mask) {
|
||||
|
||||
Reference in New Issue
Block a user