faec9a7d3a
Последний неозвученный кусок игры. 115 секунд и 1,2 МБ в память не влезают никак, поэтому тема играется кольцом из шести страниц (96 КБ = 9 с): насос идёт по кругу, а pop_music_service дочитывает файл в те страницы, которые насос уже прошёл. Страница звучит 1,5 с и читается 33 мс — запас сорокакратный; дистанция считается без отдельных счётчиков, потому что страница это ровно 128 блоков насоса. Три вещи, всплывшие при живой проверке: - кольцо обязано сниматься при любом обычном запуске трека, иначе следующая тема играет по кругу первых шести страниц (поймано на титрах сразу после победы); - живые сцены комнаты принцессы теперь открывают CBL сами (cut_begin): pop_ending_show глушит звук первым действием, и «arrived to princess» не звучал вовсе; - тема дослушивается до конца с возможностью прервать клавишей — как seg001:637. У оригинала там стоит ввод имени в таблицу рекордов; когда он появится, ожидание переедет за него (задача HOF-ENTRY). Проверено в MAME на сборке LEVEL=14: после встречи с принцессой звучит тема победы (id 56, кольцо 6), курсор уходит далеко за размер кольца — подкачка успевает. Host-тесты: 15 наборов. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
85 lines
3.1 KiB
C
85 lines
3.1 KiB
C
/*
|
|
* pop_music_tbl.h — каталог музыкальных треков, СГЕНЕРИРОВАН.
|
|
* Источник: applications/PoP/PoP1_DOS_music/flac (записи DOS-версии).
|
|
* Генератор: toolchain/pop_pack_music.py. Руками не править.
|
|
*
|
|
* Нумерация id — оригинала (SDLPoP data/music/names.txt). pages —
|
|
* сколько кусков m<id>_<nn>.bin лежит на диске, blocks — длина трека
|
|
* в порциях насоса по 128 байт (в байтах не влезло бы в uint16).
|
|
*/
|
|
#ifndef POP_MUSIC_TBL_H
|
|
#define POP_MUSIC_TBL_H
|
|
|
|
#include <stdint.h>
|
|
|
|
#define POP_MUS_COUNT 57
|
|
#define POP_MUS_BLOCK 128
|
|
#define POP_MUS_MAX_PAGES 78
|
|
|
|
typedef struct {
|
|
uint8_t pages; /* 0 — трека нет */
|
|
uint16_t blocks; /* длина в порциях по 128 байт */
|
|
} pop_mus_ent_t;
|
|
|
|
static const pop_mus_ent_t pop_mus_tbl[POP_MUS_COUNT] = {
|
|
{ 0, 0 }, /* 0 */
|
|
{ 0, 0 }, /* 1 */
|
|
{ 0, 0 }, /* 2 */
|
|
{ 0, 0 }, /* 3 */
|
|
{ 0, 0 }, /* 4 */
|
|
{ 0, 0 }, /* 5 */
|
|
{ 0, 0 }, /* 6 */
|
|
{ 0, 0 }, /* 7 */
|
|
{ 0, 0 }, /* 8 */
|
|
{ 0, 0 }, /* 9 */
|
|
{ 0, 0 }, /* 10 */
|
|
{ 0, 0 }, /* 11 */
|
|
{ 0, 0 }, /* 12 */
|
|
{ 0, 0 }, /* 13 */
|
|
{ 0, 0 }, /* 14 */
|
|
{ 0, 0 }, /* 15 */
|
|
{ 0, 0 }, /* 16 */
|
|
{ 0, 0 }, /* 17 */
|
|
{ 0, 0 }, /* 18 */
|
|
{ 0, 0 }, /* 19 */
|
|
{ 0, 0 }, /* 20 */
|
|
{ 0, 0 }, /* 21 */
|
|
{ 0, 0 }, /* 22 */
|
|
{ 0, 0 }, /* 23 */
|
|
{ 3, 305 }, /* 24 regular_death */
|
|
{ 2, 196 }, /* 25 find_mirror_and_find_shadow */
|
|
{ 9, 1132 }, /* 26 embrace */
|
|
{ 8, 915 }, /* 27 cutscene_before_2_4_6_12 */
|
|
{ 6, 656 }, /* 28 fight_death */
|
|
{ 4, 428 }, /* 29 meet_Jaffar */
|
|
{ 3, 299 }, /* 30 life_potion */
|
|
{ 0, 0 }, /* 31 */
|
|
{ 5, 624 }, /* 32 end_level_4_and_killed_by_shadow */
|
|
{ 2, 205 }, /* 33 potion */
|
|
{ 0, 0 }, /* 34 */
|
|
{ 7, 888 }, /* 35 cutscene_before_8_9 */
|
|
{ 10, 1256 }, /* 36 out_of_time */
|
|
{ 3, 280 }, /* 37 guard_death_and_obtaining_the_sword */
|
|
{ 0, 0 }, /* 38 */
|
|
{ 13, 1591 }, /* 39 floating */
|
|
{ 5, 596 }, /* 40 cutscene_not_much_time_left */
|
|
{ 9, 1043 }, /* 41 story_5_level_end_and_merge_with_shadow */
|
|
{ 0, 0 }, /* 42 */
|
|
{ 3, 285 }, /* 43 killed_Jaffar */
|
|
{ 0, 0 }, /* 44 */
|
|
{ 0, 0 }, /* 45 */
|
|
{ 0, 0 }, /* 46 */
|
|
{ 0, 0 }, /* 47 */
|
|
{ 0, 0 }, /* 48 */
|
|
{ 0, 0 }, /* 49 */
|
|
{ 10, 1184 }, /* 50 story_2_princess */
|
|
{ 0, 0 }, /* 51 */
|
|
{ 20, 2443 }, /* 52 story_4_Jaffar_leaves */
|
|
{ 11, 1403 }, /* 53 story_3_Jaffar_enters */
|
|
{ 17, 2064 }, /* 54 intro_theme */
|
|
{ 11, 1350 }, /* 55 story_1_absence */
|
|
{ 78, 9865 }, /* 56 won */
|
|
};
|
|
|
|
#endif /* POP_MUSIC_TBL_H */
|