Катсцены: тайминги, часы и «время вышло» — по оригиналу; тумблер музыки
ТАЙМИНГИ. Треки заставок между уровнями длиннее самих сцен (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:
@@ -87,13 +87,13 @@
|
||||
9 * SET_STEP + SEL_BOT_DY + 1)
|
||||
#define SET_TITLE_BASE (UI_CENTER_TOP(SET_BLOCK_H) + POP_FONT_BIG_ASCENT)
|
||||
#define SET_HEAD1 (SET_TITLE_BASE + SET_HEAD_GAP)
|
||||
#define SET_HEAD2 (SET_HEAD1 + 3 * SET_STEP + SET_HEAD_GAP)
|
||||
#define SET_HEAD3 (SET_HEAD2 + 4 * SET_STEP + SET_HEAD_GAP)
|
||||
#define SET_HEAD2 (SET_HEAD1 + 4 * SET_STEP + SET_HEAD_GAP)
|
||||
#define SET_HEAD3 (SET_HEAD2 + 3 * SET_STEP + SET_HEAD_GAP)
|
||||
|
||||
/* CONTROLS: число строк зависит от того, включены ли читы, поэтому верх
|
||||
* блока считается в рантайме. */
|
||||
#define CTRL_TITLE_GAP 20
|
||||
#define CTRL_N_BASE 6 /* общие клавиши */
|
||||
#define CTRL_N_BASE 7 /* общие клавиши */
|
||||
#define CTRL_N_CHEAT 5 /* дополнительные строки читов */
|
||||
#define CTRL_COL_KEY 45
|
||||
#define CTRL_COL_DESC 145
|
||||
@@ -267,9 +267,9 @@ static void menu_draw(uint8_t sel)
|
||||
* значение помещается (на голом литерале 218 — молчит). */
|
||||
static const uint8_t settings_y[SETTINGS_N_ITEMS] = {
|
||||
(uint8_t)(SET_HEAD1 + 1 * SET_STEP), (uint8_t)(SET_HEAD1 + 2 * SET_STEP),
|
||||
(uint8_t)(SET_HEAD1 + 3 * SET_STEP),
|
||||
(uint8_t)(SET_HEAD1 + 3 * SET_STEP), (uint8_t)(SET_HEAD1 + 4 * SET_STEP),
|
||||
(uint8_t)(SET_HEAD2 + 1 * SET_STEP), (uint8_t)(SET_HEAD2 + 2 * SET_STEP),
|
||||
(uint8_t)(SET_HEAD2 + 3 * SET_STEP), (uint8_t)(SET_HEAD2 + 4 * SET_STEP),
|
||||
(uint8_t)(SET_HEAD2 + 3 * SET_STEP),
|
||||
(uint8_t)(SET_HEAD3 + 1 * SET_STEP), (uint8_t)(SET_HEAD3 + 2 * SET_STEP)
|
||||
};
|
||||
|
||||
@@ -293,15 +293,15 @@ static void settings_draw(uint8_t sel)
|
||||
"SETTINGS");
|
||||
pop_text_draw_mapped(POP_TEXT_SMALL, 60, SET_HEAD1, "GENERAL");
|
||||
settings_line(0, "SOUND", pop_settings.sound_enabled ? "ON" : "OFF", sel == 0);
|
||||
settings_line(1, "DEBUG BAR",
|
||||
pop_settings.show_debug_bar ? "ON" : "OFF", sel == 1);
|
||||
settings_line(2, "RESTORE DEFAULTS...", 0, sel == 2);
|
||||
settings_line(1, "MUSIC", pop_settings.music_enabled ? "ON" : "OFF", sel == 1);
|
||||
settings_line(2, "DEBUG BAR",
|
||||
pop_settings.show_debug_bar ? "ON" : "OFF", sel == 2);
|
||||
settings_line(3, "RESTORE DEFAULTS...", 0, sel == 3);
|
||||
pop_text_draw_mapped(POP_TEXT_SMALL, 60, SET_HEAD2, "GAMEPLAY");
|
||||
settings_line(3, "TIME LIMIT",
|
||||
settings_line(4, "TIME LIMIT",
|
||||
pop_settings.time_limit_enabled ? "60 MIN" : "UNLIMITED",
|
||||
sel == 3);
|
||||
settings_line(4, "SPEED", speed_text[pop_settings.speed_mode], sel == 4);
|
||||
settings_line(5, "GAMEPLAY PROFILE", "VANILLA", sel == 5);
|
||||
sel == 4);
|
||||
settings_line(5, "SPEED", speed_text[pop_settings.speed_mode], sel == 5);
|
||||
settings_line(6, "CHEATS", pop_settings.cheats_enabled ? "ON" : "OFF", sel == 6);
|
||||
pop_text_draw_mapped(POP_TEXT_SMALL, 60, SET_HEAD3, "CONTROLS");
|
||||
settings_line(7, "SHOW KEY BINDINGS", 0, sel == 7);
|
||||
@@ -313,12 +313,13 @@ static void settings_draw(uint8_t sel)
|
||||
/* Две колонки «клавиша — что делает». Первые CTRL_N_BASE строк общие, за
|
||||
* ними идут читовые: их показываем, только когда читы включены. */
|
||||
static const char * const ctrl_key[CTRL_N_BASE + CTRL_N_CHEAT] = {
|
||||
"ARROWS", "SHIFT", "ESC", "F6 / F9", "CTRL+S", "P",
|
||||
"ARROWS", "SHIFT", "ESC", "F6 / F9", "CTRL+S", "CTRL+M", "P",
|
||||
"K", "I", "SHIFT+L", "U", "F7 / F8"
|
||||
};
|
||||
|
||||
static const char * const ctrl_desc[CTRL_N_BASE + CTRL_N_CHEAT] = {
|
||||
"MOVE / JUMP", "ACTION", "PAUSE MENU", "SAVE / LOAD", "SOUND", "SPEED",
|
||||
"MOVE / JUMP", "ACTION", "PAUSE MENU", "SAVE / LOAD", "SOUND", "MUSIC",
|
||||
"SPEED",
|
||||
"KILL GUARD", "IMMORTAL", "NEXT LEVEL", "FLIP SCREEN", "TIME - / +"
|
||||
};
|
||||
|
||||
@@ -521,25 +522,25 @@ static uint8_t settings_process(void)
|
||||
/* Left/right принадлежат только числовой настройке скорости;
|
||||
* остальные строки меняются Enter либо Space, чтобы стрелкой не
|
||||
* открыть случайно Controls и не сбросить параметры. */
|
||||
if ((ent && !ent_prev) || (sel == 4 && delta)) {
|
||||
if ((ent && !ent_prev) || (sel == 5 && delta)) {
|
||||
if (sel == 0) {
|
||||
pop_settings.sound_enabled ^= 1; change = 1;
|
||||
} else if (sel == 1) {
|
||||
pop_settings.show_debug_bar ^= 1; change = 1;
|
||||
pop_settings.music_enabled ^= 1; change = 1;
|
||||
} else if (sel == 2) {
|
||||
pop_settings.show_debug_bar ^= 1; change = 1;
|
||||
} else if (sel == 3) {
|
||||
if (ui_confirm("RESTORE DEFAULTS?")) {
|
||||
pop_settings_defaults(); change = 1;
|
||||
}
|
||||
redraw = 1; sound = MENU_SND_SELECT;
|
||||
} else if (sel == 3) {
|
||||
pop_settings.time_limit_enabled ^= 1; change = 1;
|
||||
} else if (sel == 4) {
|
||||
pop_settings.time_limit_enabled ^= 1; change = 1;
|
||||
} else if (sel == 5) {
|
||||
uint8_t speed = pop_settings.speed_mode;
|
||||
if (delta < 0) speed = (uint8_t)(speed ? speed - 1 : POP_SPEED_FASTEST);
|
||||
else speed = (uint8_t)(speed == POP_SPEED_FASTEST ? POP_SPEED_NORMAL : speed + 1);
|
||||
pop_settings.speed_mode = speed; change = 1;
|
||||
} else if (sel == 5) {
|
||||
ui_notice("VANILLA ONLY"); redraw = 1; sound = MENU_SND_SELECT;
|
||||
} else if (sel == 6) {
|
||||
pop_settings.cheats_enabled ^= 1; change = 1;
|
||||
} else if (sel == 7) {
|
||||
|
||||
Reference in New Issue
Block a user