SprPoP: автономное приложение, выделенное из roomtest
Порт PoP переехал в applications/SprPoP — приложение, которое собирается само: код, оригинальные данные, конверторы ресурсов и сборка внутри одной папки. Наружу знает единственный путь — корень тулчейна (SPRINTER_ROOT, по умолчанию ../..). applications/PoP/roomtest ЗАМОРОЖЕНА и остаётся архивом закрытых задач, багов и исполненных планов. Скопировано из applications/PoP/roomtest@4b74478. Перенос проверен побайтово: собранный sprpop.exe совпал с roomtest.exe того же коммита, все 39 дисковых ресурсов и все 16 генерируемых заголовков — тоже, host- тесты зелёные (15/15). Раскладка: src/ рукописный C (roomtest.c -> sprpop.c) gen/ генерируемые заголовки, в репозитории assets/orig/ оригинальные данные игры, вне репозитория (копирайт) assets/packed/ то, что ложится на диск, в раскладке диска tools/ конверторы; все пути — в одном tools/paths.py build/ выход: exe, каталоги ресурсов, hdd/, промежуточные atl/ Сборка ресурсов: assets/packed и gen — версионируемые ВХОДЫ, а не то, что пересчитывается каждым make. Автоматика построена на ОТСУТСТВИИ файла, а не на таймстемпах: git не хранит времена, и в свежем клоне сравнение по времени превращалось бы в лотерею. Недостающий ресурс или заголовок чинится сам, рекурсивным вызовом в ветку генерации. Музыка собирается из любого из четырёх наборов записей (make music-mp3, music-mt32, ...); набор входит в имя stamp'а, поэтому смена набора сама делает музыку устаревшей. Длины реплик больше не захардкожены: упаковщик печатает их в gen/pop_music_ticks.h, и шкала сцены выражена через них — иначе mt32 (реплики на 6% длиннее) молча ломал катсцену. Тулчейн: в app.mk два обратносовместимых крючка (SRC_DIR/BUILD_DIR), HDD_IMG стал ?=; команда сборки roomtest не изменилась. Корневой make host-tests переключён на SprPoP. Подгонка тайминга катсцены с принцессой (PV_MAGIC_LEAD): сцена render-bound и идёт ~49 тиков/с вместо 60, из-за чего кода реплики приходила раньше молнии. Это обход, а не лечение; разбор с замерами — docs/BUGS_OPEN.md, записи SND-PACE-DEAD, PV-RENDER-BOUND, MUS-LEFT-TEAR. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
/* bg_arc.h — индексы в архиве BG. СГЕНЕРИРОВАН
|
||||
* (toolchain/pop_pack_arc.py), руками не править. */
|
||||
#ifndef BG_ARC_H
|
||||
#define BG_ARC_H
|
||||
|
||||
#define ARC_BG_COUNT 25
|
||||
|
||||
#define ARC_BG_POP_ENV0 0
|
||||
#define ARC_BG_POP_ENV1 1
|
||||
#define ARC_BG_POP_ENV2 2
|
||||
#define ARC_BG_POP_ENV3 3
|
||||
#define ARC_BG_POP_ENV4 4
|
||||
#define ARC_BG_POP_ENV5 5
|
||||
#define ARC_BG_POP_ENV6 6
|
||||
#define ARC_BG_POP_ENV7 7
|
||||
#define ARC_BG_POP_ENV8 8
|
||||
#define ARC_BG_POP_ENV9 9
|
||||
#define ARC_BG_POP_WALL 10
|
||||
#define ARC_BG_POP_FORE 11
|
||||
#define ARC_BG_PAL_ENV0 12
|
||||
#define ARC_BG_PAL_ENV1 13
|
||||
#define ARC_BG_PAL_ENV2 14
|
||||
#define ARC_BG_PAL_ENV3 15
|
||||
#define ARC_BG_PAL_ENV4 16
|
||||
#define ARC_BG_PAL_ENV5 17
|
||||
#define ARC_BG_PAL_ENV6 18
|
||||
#define ARC_BG_PAL_ENV7 19
|
||||
#define ARC_BG_PAL_ENV8 20
|
||||
#define ARC_BG_PAL_ENV9 21
|
||||
#define ARC_BG_PAL_WALL 22
|
||||
#define ARC_BG_PAL_FORE 23
|
||||
#define ARC_BG_POP_POT 24
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,19 @@
|
||||
/* guard_arc.h — индексы в архиве GUARD. СГЕНЕРИРОВАН
|
||||
* (toolchain/pop_pack_arc.py), руками не править. */
|
||||
#ifndef GUARD_ARC_H
|
||||
#define GUARD_ARC_H
|
||||
|
||||
#define ARC_GUARD_COUNT 10
|
||||
|
||||
#define ARC_GUARD_G0 0
|
||||
#define ARC_GUARD_G1 1
|
||||
#define ARC_GUARD_G2 2
|
||||
#define ARC_GUARD_G3 3
|
||||
#define ARC_GUARD_G4 4
|
||||
#define ARC_GUARD_G0_V 5
|
||||
#define ARC_GUARD_G1_V 6
|
||||
#define ARC_GUARD_G2_V 7
|
||||
#define ARC_GUARD_G3_V 8
|
||||
#define ARC_GUARD_G4_V 9
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,67 @@
|
||||
/* kid_arc.h — индексы в архиве KID. СГЕНЕРИРОВАН
|
||||
* (toolchain/pop_pack_arc.py), руками не править. */
|
||||
#ifndef KID_ARC_H
|
||||
#define KID_ARC_H
|
||||
|
||||
#define ARC_KID_COUNT 58
|
||||
|
||||
#define ARC_KID_KID0 0
|
||||
#define ARC_KID_KID1 1
|
||||
#define ARC_KID_KID2 2
|
||||
#define ARC_KID_KID3 3
|
||||
#define ARC_KID_KID4 4
|
||||
#define ARC_KID_KID5 5
|
||||
#define ARC_KID_KID6 6
|
||||
#define ARC_KID_KID7 7
|
||||
#define ARC_KID_KID8 8
|
||||
#define ARC_KID_KID9 9
|
||||
#define ARC_KID_KID10 10
|
||||
#define ARC_KID_KID11 11
|
||||
#define ARC_KID_KID12 12
|
||||
#define ARC_KID_KID13 13
|
||||
#define ARC_KID_KID14 14
|
||||
#define ARC_KID_KID15 15
|
||||
#define ARC_KID_KID16 16
|
||||
#define ARC_KID_KID17 17
|
||||
#define ARC_KID_KID18 18
|
||||
#define ARC_KID_KID19 19
|
||||
#define ARC_KID_KID20 20
|
||||
#define ARC_KID_KID21 21
|
||||
#define ARC_KID_KID22 22
|
||||
#define ARC_KID_KID23 23
|
||||
#define ARC_KID_KID24 24
|
||||
#define ARC_KID_KID25 25
|
||||
#define ARC_KID_KID26 26
|
||||
#define ARC_KID_KID27 27
|
||||
#define ARC_KID_KID0_V 28
|
||||
#define ARC_KID_KID1_V 29
|
||||
#define ARC_KID_KID2_V 30
|
||||
#define ARC_KID_KID3_V 31
|
||||
#define ARC_KID_KID4_V 32
|
||||
#define ARC_KID_KID5_V 33
|
||||
#define ARC_KID_KID6_V 34
|
||||
#define ARC_KID_KID7_V 35
|
||||
#define ARC_KID_KID8_V 36
|
||||
#define ARC_KID_KID9_V 37
|
||||
#define ARC_KID_KID10_V 38
|
||||
#define ARC_KID_KID11_V 39
|
||||
#define ARC_KID_KID12_V 40
|
||||
#define ARC_KID_KID13_V 41
|
||||
#define ARC_KID_KID14_V 42
|
||||
#define ARC_KID_KID15_V 43
|
||||
#define ARC_KID_KID16_V 44
|
||||
#define ARC_KID_KID17_V 45
|
||||
#define ARC_KID_KID18_V 46
|
||||
#define ARC_KID_KID19_V 47
|
||||
#define ARC_KID_KID20_V 48
|
||||
#define ARC_KID_KID21_V 49
|
||||
#define ARC_KID_KID22_V 50
|
||||
#define ARC_KID_KID23_V 51
|
||||
#define ARC_KID_KID24_V 52
|
||||
#define ARC_KID_KID25_V 53
|
||||
#define ARC_KID_KID26_V 54
|
||||
#define ARC_KID_KID27_V 55
|
||||
#define ARC_KID_SWORD 56
|
||||
#define ARC_KID_SWORD_V 57
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,41 @@
|
||||
/* kid_atlas.h — раскладка атласов Kid. Сгенерировано pop_pack_kid.py. */
|
||||
#ifndef KID_ATLAS_H
|
||||
#define KID_ATLAS_H
|
||||
#define KID_SHIFT 3
|
||||
#define KID_MASK 7
|
||||
#define KID_PAGES 28
|
||||
#define KID_PAL 0x70
|
||||
static const char *const kid_atl[KID_PAGES] = {
|
||||
"kid0.atl",
|
||||
"kid1.atl",
|
||||
"kid2.atl",
|
||||
"kid3.atl",
|
||||
"kid4.atl",
|
||||
"kid5.atl",
|
||||
"kid6.atl",
|
||||
"kid7.atl",
|
||||
"kid8.atl",
|
||||
"kid9.atl",
|
||||
"kid10.atl",
|
||||
"kid11.atl",
|
||||
"kid12.atl",
|
||||
"kid13.atl",
|
||||
"kid14.atl",
|
||||
"kid15.atl",
|
||||
"kid16.atl",
|
||||
"kid17.atl",
|
||||
"kid18.atl",
|
||||
"kid19.atl",
|
||||
"kid20.atl",
|
||||
"kid21.atl",
|
||||
"kid22.atl",
|
||||
"kid23.atl",
|
||||
"kid24.atl",
|
||||
"kid25.atl",
|
||||
"kid26.atl",
|
||||
"kid27.atl",
|
||||
};
|
||||
#define KID_PAL_FILE "kid.pal"
|
||||
#define KID_SWORD_ATL "sword.atl" /* chtab_0: меч в руке */
|
||||
#define KID_SWORD_ID0 0 /* индекс в атласе = sword_tbl.id - ID0 */
|
||||
#endif
|
||||
@@ -0,0 +1,77 @@
|
||||
/* kid_data.h — данные анимации Kid (frame_table + seqtbl +
|
||||
* offsets), извлечено toolchain/pop_extract_kid_data.py из
|
||||
* SDLPoP. НЕ править вручную. seqtbl адресуется базой
|
||||
* SEQTBL_BASE: kid_seqtbl[addr - SEQTBL_BASE]. */
|
||||
#ifndef KID_DATA_H
|
||||
#define KID_DATA_H
|
||||
#include <stdint.h>
|
||||
|
||||
#define SEQTBL_BASE 0x196Eu
|
||||
|
||||
/* {image, dx, dy, flags, sword}; chtab = sword>>6 (0=kid).
|
||||
* САМА таблица кадров и seqtbl лежат в kid.ani (EMM-
|
||||
* страница); здесь только тип и размеры. */
|
||||
typedef struct { uint8_t image; int8_t dx, dy; uint8_t flags, sword; } kframe;
|
||||
#define KID_NFRAMES 241
|
||||
#define KID_SEQTBL_LEN 2310
|
||||
|
||||
/* Раскладка kid.ani: кадры (KID_NFRAMES*5), затем seqtbl. */
|
||||
#define KID_BIN_FRAMES_OFF 0
|
||||
#define KID_BIN_SEQTBL_OFF 1205
|
||||
/* Таблица кадров СТРАЖА (frame_tbl_guard, seg006:372): индекс
|
||||
* frame + add_frame - 149 (add_frame=70 для кадров 102..106). */
|
||||
#define KID_NGFRAMES 41
|
||||
#define KID_BIN_GFRAMES_OFF 3515
|
||||
/* Таблица кадров КАТСЦЕН (frame_tbl_cuts, seg006:417):
|
||||
* Princess/Vizier, индекс — номер кадра как есть. Набор
|
||||
* спрайтов выбирает sword>>6 (1 = PV1 res800, 2 = PV2 res900). */
|
||||
#define KID_NCFRAMES 86
|
||||
#define KID_BIN_CFRAMES_OFF 3720
|
||||
|
||||
#define KID_NSEQ 115
|
||||
#define KID_SEQ_OFF_INIT { \
|
||||
0x0000,0x1973,0x19A0,0x1A93,0x1ACD,0x1B39,0x1B5A,0x1BDB, \
|
||||
0x1C54,0x1CA1,0x1D04,0x1D25,0x1D49,0x1D4F,0x1D68,0x1DF6, \
|
||||
0x1C84,0x202B,0x1C1C,0x1C01,0x205A,0x1C38,0x209C,0x1D36, \
|
||||
0x1C69,0x1CD1,0x1B04,0x1B1A,0x1D7D,0x1F9E,0x1F92,0x1F82, \
|
||||
0x1F72,0x1F5D,0x1F48,0x1F33,0x1F19,0x1F13,0x1EF7,0x1EDA, \
|
||||
0x1EBB,0x1E9C,0x1E7D,0x1B53,0x1E59,0x1E06,0x1E3B,0x1DFC, \
|
||||
0x1D9B,0x1FB3,0x1FA7,0x20BE,0x20D1,0x20D4,0x20C9,0x19C4, \
|
||||
0x1A13,0x1A2E,0x1A3C,0x1A7C,0x1A83,0x1A63,0x1A5E,0x1A68, \
|
||||
0x1A6E,0x1A75,0x1A5A,0x19F9,0x1CEC,0x1A54,0x20DD,0x20AE, \
|
||||
0x1E78,0x1CDC,0x19DC,0x1A42,0x1A07,0x19A8,0x2009,0x1B1B, \
|
||||
0x1A8B,0x1B85,0x1BA1,0x1BBF,0x196E,0x20A9,0x1A22,0x19A6, \
|
||||
0x19AC,0x1B2D,0x19C1,0x1FCA,0x1FDA,0x1FFB,0x2195,0x2132, \
|
||||
0x214F,0x2166,0x2199,0x21A8,0x216D,0x226E,0x2136,0x21BC, \
|
||||
0x1BFA,0x2245,0x2253,0x225B,0x21C4,0x21C0,0x21E6,0x21EA, \
|
||||
0x21FC,0x2240,0x2257, \
|
||||
}
|
||||
|
||||
/* sword_tbl (seg006:2047): клинок отдельным спрайтом chtab_0.
|
||||
* Индекс — sword_frame (кадр.sword & 0x3F), id 255 = клинка нет.
|
||||
* Смещения x/y — ЭКРАННЫЕ (применяются после calc_screen_x_coord),
|
||||
* x — «вперёд» по направлению персонажа. */
|
||||
#define KID_NSWORD 51
|
||||
#define KID_SWORD_ID_INIT { \
|
||||
0xFF,0x00,0x05,0x01,0x02,0x06,0x07,0x03,0x04,0x1E,0x08,0x09, \
|
||||
0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x13,0x11, \
|
||||
0x11,0x07,0x01,0x1C,0x08,0x04,0x04,0x0A,0x0D,0x0D,0x0D,0x14, \
|
||||
0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0xFF,0xFF,0x1D,0x08,0x1F, \
|
||||
0x20,0x21,0x08, \
|
||||
}
|
||||
#define KID_SWORD_DX_INIT { \
|
||||
0,0,-9,7,17,7,0,17,16,12,13,7, \
|
||||
10,10,22,28,13,0,0,21,14,21,22,7, \
|
||||
15,0,7,14,7,6,9,11,24,19,21,7, \
|
||||
14,14,14,28,28,21,14,14,21,0,8,14, \
|
||||
14,7,8, \
|
||||
}
|
||||
#define KID_SWORD_DY_INIT { \
|
||||
0,-9,-29,-25,-26,-14,-5,-16,-19,-9,-34,-25, \
|
||||
-16,-11,-21,-23,-35,-38,-29,-19,-23,-22,-23,-13, \
|
||||
-18,-8,-27,-28,-27,-23,-21,-18,-23,-23,-23,-32, \
|
||||
-32,-31,-29,-28,-28,-25,-22,-25,-25,-16,-37,-24, \
|
||||
-24,-14,-37, \
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,47 @@
|
||||
/* pop_bg_atlas.h — раскладка атласов статического фона PoP.
|
||||
* Сгенерировано toolchain/pop_pack_bg.py — НЕ править вручную.
|
||||
*
|
||||
* Прямая адресация (ноль remap-таблиц в W2):
|
||||
* ENV фон id N -> atlas env_bg[N>>4], idx N&15
|
||||
* WALL id N -> atlas wall, idx N
|
||||
* FORE id N -> atlas fore, idx N
|
||||
*
|
||||
* ДВА ТАЙЛСЕТА (порт tbl_envir_ki[tbl_level_type], seg000:1108):
|
||||
* 0 = подземелье (pop_*), 1 = дворец (pal_*). Набор id и раскладка
|
||||
* у них ОДНИ И ТЕ ЖЕ — меняются только файлы и 32 записи палитры
|
||||
* (env 0x50..0x5F, wall 0x60..0x6F), см. *tile.pal.
|
||||
*/
|
||||
#ifndef POP_BG_ATLAS_H
|
||||
#define POP_BG_ATLAS_H
|
||||
|
||||
#define POP_ENV_SHIFT 4
|
||||
#define POP_ENV_MASK 15
|
||||
#define POP_ENV_PAGES 10
|
||||
#define POP_TILESETS 2
|
||||
|
||||
/* Палитра: env-слоты, wall-слоты (спрайт-пиксель i -> база+i). */
|
||||
#define POP_PAL_ENV 0x50
|
||||
#define POP_PAL_WALL 0x60
|
||||
|
||||
/* Имена файлов атласов по тайлсету (грузятся atlas_load). Таблицы
|
||||
* видны только тому, кто попросил POP_BG_ATLAS_NAMES: иначе копия
|
||||
* строк уедет в каждый включивший заголовок модуль. */
|
||||
#ifdef POP_BG_ATLAS_NAMES
|
||||
static const char *const pop_env_atl[POP_TILESETS][POP_ENV_PAGES] = {
|
||||
{ "pop_env0.atl", "pop_env1.atl", "pop_env2.atl", "pop_env3.atl", "pop_env4.atl", "pop_env5.atl", "pop_env6.atl", "pop_env7.atl", "pop_env8.atl", "pop_env9.atl" },
|
||||
{ "pal_env0.atl", "pal_env1.atl", "pal_env2.atl", "pal_env3.atl", "pal_env4.atl", "pal_env5.atl", "pal_env6.atl", "pal_env7.atl", "pal_env8.atl", "pal_env9.atl" },
|
||||
};
|
||||
static const char *const pop_wall_atl[POP_TILESETS] = { "pop_wall.atl", "pal_wall.atl" };
|
||||
static const char *const pop_fore_atl[POP_TILESETS] = { "pop_fore.atl", "pal_fore.atl" };
|
||||
static const char *const pop_tile_pal[POP_TILESETS] = { "pop_tile.pal", "pal_tile.pal" };
|
||||
#endif /* POP_BG_ATLAS_NAMES */
|
||||
#define POP_POT_ATL "pop_pot.atl" /* chtab_1: зелья, от набора не зависит */
|
||||
#define POP_PAL_POT 0x40
|
||||
/* Пузырёк зелья: красный набор = id 16..22 (кадры оригинала),
|
||||
зелёный (перо/переворот) и синий (вред/открыть) = те же кадры
|
||||
под id 30..36 и 40..46 (draw_tile_anim, seg008:652). */
|
||||
#define POP_POT_BUBB_GREEN 30
|
||||
#define POP_POT_BUBB_BLUE 40
|
||||
#define POP_BG_PAL "pop_bg.pal"
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* pop_font.h — контракт FONT\FONT.ATL, СГЕНЕРИРОВАН.
|
||||
* Источник: SDLPoP hc_small_font_data[] и hc_font_data[].
|
||||
* Генератор: toolchain/pop_extract_font.py. Руками не править.
|
||||
*/
|
||||
#ifndef POP_FONT_H
|
||||
#define POP_FONT_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define POP_FONT_COLOR 0x3F
|
||||
#define POP_FONT_DARK_COLOR 0x3E
|
||||
#define POP_FONT_FIRST 32
|
||||
#define POP_FONT_LAST 126
|
||||
#define POP_FONT_SMALL_BASE 0
|
||||
#define POP_FONT_SMALL_ASCENT 5
|
||||
#define POP_FONT_SMALL_SPACE 1
|
||||
#define POP_FONT_BIG_BASE 95
|
||||
#define POP_FONT_BIG_ASCENT 7
|
||||
#define POP_FONT_BIG_SPACE 1
|
||||
/* Тот же КРУПНЫЙ шрифт цветом POP_FONT_DARK_COLOR: тень и текст на светлом.
|
||||
* Набор обрезан по '_' — им пишется только таблица рекордов. */
|
||||
#define POP_FONT_DARK_BASE 190
|
||||
#define POP_FONT_DARK_FIRST 32
|
||||
#define POP_FONT_DARK_LAST 95
|
||||
#define POP_FONT_SNAPSHOT_OFF 0x3C00
|
||||
#define POP_FONT_ATLAS_SIZE 10841
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,36 @@
|
||||
/* pop_guard_pal.h — палитры стражей (guard_palettes из res10.bin).
|
||||
* СГЕНЕРЕНО toolchain/pop_pack_guard.py — НЕ править вручную.
|
||||
*
|
||||
* Индексация как в оригинале: цвет из level.guards_color[room-1]
|
||||
* (младшие 4 бита), 1..7 -> строка [color-1]; 0 = палитру НЕ менять
|
||||
* (seg003:255 при curr_guard_color == 0 set_chtab_palette не зовёт).
|
||||
* Запись — 4 байта (B, G, R, 0), формат gfx_pal_load. */
|
||||
#ifndef POP_GUARD_PAL_H
|
||||
#define POP_GUARD_PAL_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define POP_GUARD_PAL_BASE 0x90 /* слоты Sprinter под chtab_5 */
|
||||
#define POP_GUARD_NPAL 7
|
||||
|
||||
static const uint8_t pop_guard_pal[POP_GUARD_NPAL][64] = {
|
||||
{ 0x00,0x00,0x00,0x00,0xFF,0x91,0x48,0x00,0xB2,0x81,0x69,0x00,0xFF,0xFF,0xFF,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0xD2,0xB6,0xD2,0x00,0x91,0x7D,0x91,0x00,0xFF,0xDA,0xFF,0x00,0x4C,0x81,0xA1,0x00,0x71,0xBA,0xEA,0x00,0x79,0x28,0x81,0x00,0xB2,0x81,0x69,0x00,0xC2,0xC2,0xC2,0x00,0x38,0x00,0xF6,0x00 },
|
||||
{ 0x00,0x00,0x00,0x00,0x00,0x30,0xAA,0x00,0x00,0x24,0x81,0x00,0x79,0x79,0xFF,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0xC2,0x69,0x85,0x00,0xAA,0x5D,0x75,0x00,0xFF,0x89,0xB2,0x00,0x50,0x50,0x79,0x00,0x71,0x71,0xAA,0x00,0xBE,0x28,0xBA,0x00,0x00,0x24,0x81,0x00,0x61,0x61,0xCA,0x00,0x38,0x00,0xF6,0x00 },
|
||||
{ 0x00,0x00,0x00,0x00,0x00,0x50,0xFF,0x00,0x00,0x38,0xBE,0x00,0xFF,0xFF,0xFF,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0x00,0x99,0xD2,0x00,0x00,0x7D,0xAA,0x00,0x00,0xBA,0xFF,0x00,0x4C,0x81,0xA1,0x00,0x71,0xBA,0xEA,0x00,0x99,0x28,0x6D,0x00,0x00,0x38,0xBE,0x00,0xD2,0xCA,0xCA,0x00,0x38,0x00,0xF6,0x00 },
|
||||
{ 0x00,0x00,0x00,0x00,0x00,0x91,0x0C,0x00,0x00,0x71,0x0C,0x00,0xFF,0xD2,0xFF,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0x4C,0xAE,0xCA,0x00,0x38,0x7D,0x91,0x00,0x61,0xDA,0xFF,0x00,0x4C,0x81,0xA1,0x00,0x71,0xBA,0xEA,0x00,0x20,0x00,0x99,0x00,0x00,0x71,0x0C,0x00,0xB2,0x91,0xB2,0x00,0x38,0x00,0xF6,0x00 },
|
||||
{ 0x00,0x00,0x00,0x00,0xFF,0x00,0x61,0x00,0xAA,0x00,0x61,0x00,0xB2,0x3C,0xBE,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0x8D,0xBA,0xCA,0x00,0x6D,0x8D,0x99,0x00,0xB2,0xEA,0xFF,0x00,0x34,0x6D,0x91,0x00,0x40,0x89,0xBA,0x00,0x79,0x28,0x81,0x00,0xAA,0x00,0x61,0x00,0x81,0x2C,0x89,0x00,0x38,0x00,0xF6,0x00 },
|
||||
{ 0x00,0x00,0x00,0x00,0xFF,0x59,0xCA,0x00,0xC2,0x44,0x99,0x00,0xFF,0xAA,0x91,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0xD2,0xB6,0xD2,0x00,0x99,0xB2,0xB2,0x00,0xDA,0xFF,0xFF,0x00,0x4C,0x81,0xA1,0x00,0x71,0xBA,0xEA,0x00,0xA1,0x6D,0x5D,0x00,0xC2,0x44,0x99,0x00,0xD2,0x8D,0x79,0x00,0x38,0x00,0xF6,0x00 },
|
||||
{ 0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0xDA,0xDE,0x00,0xE2,0x30,0xB2,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0x00,0x9D,0xD2,0x00,0x00,0x9D,0xF2,0x00,0x00,0xC2,0xFF,0x00,0xA1,0x4C,0x75,0x00,0xFF,0x79,0xBA,0x00,0xB2,0x00,0x61,0x00,0x00,0xDA,0xDE,0x00,0xAA,0x24,0x85,0x00,0x38,0x00,0xF6,0x00 },
|
||||
};
|
||||
|
||||
/* Скелет (SKEL/res750.pal): свой набор — свой цвет. */
|
||||
static const uint8_t pop_skel_pal[64] = {
|
||||
0x00,0x00,0x00,0x00,0xFF,0xFF,0x55,0x00,0x89,0x79,0xBA,0x00,0xF2,0xFF,0xFF,0x00,0x00,0x00,0xAA,0x00,0xAA,0x00,0xAA,0x00,0x00,0x55,0xAA,0x00,0xDA,0xE6,0xE6,0x00,0x55,0x55,0x55,0x00,0xFF,0x55,0x55,0x00,0x55,0xFF,0x55,0x00,0xFF,0xFF,0x55,0x00,0x55,0x55,0xFF,0x00,0x00,0x00,0x00,0x00,0x55,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,
|
||||
};
|
||||
|
||||
/* Джафар (VIZIER/res750.pal): свой набор — свой цвет. */
|
||||
static const uint8_t pop_vizier_pal[64] = {
|
||||
0x00,0x00,0x00,0x00,0x79,0x69,0xFF,0x00,0x7D,0x4C,0xBE,0x00,0xFF,0xFF,0xFF,0x00,0x38,0x5D,0x79,0x00,0x50,0x6D,0xAA,0x00,0x69,0x89,0xDA,0x00,0xD2,0xB6,0xD2,0x00,0x91,0x7D,0x91,0x00,0xFF,0xDA,0xFF,0x00,0x4C,0x81,0xA1,0x00,0x71,0xBA,0xEA,0x00,0xEA,0x44,0xB2,0x00,0xEA,0x44,0xB2,0x00,0x55,0xFF,0xFF,0x00,0x99,0x2C,0x75,0x00,
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* pop_music_tbl.h — каталог музыкальных треков, СГЕНЕРИРОВАН.
|
||||
* Источник: assets/orig/PoP1_DOS_music/flac (записи DOS-версии).
|
||||
* Генератор: tools/pop_pack_music.py. Руками не править.
|
||||
*
|
||||
* Нумерация id — оригинала (SDLPoP data/music/names.txt). pages —
|
||||
* сколько кусков m<id>_<nn>.bin лежит на диске, blocks — длина трека
|
||||
* в порциях насоса по 128 байт (в байтах не влезло бы в uint16).
|
||||
*
|
||||
* Длительности реплик в тиках вынесены в pop_music_ticks.h: таблица
|
||||
* ниже — 171 байт ДАННЫХ, и модулю, которому нужна одна константа,
|
||||
* платить за неё копией таблицы незачем (поймано на pop_intro.c:
|
||||
* +172 байта в банк 11).
|
||||
*
|
||||
* POP_MUS_TICKS_<id> — та же длина в ТИКАХ СЦЕНЫ (60 Гц оригинала).
|
||||
* Нужна там, где сценарий ждёт окончания реплики: у оригинала это
|
||||
* `do { frame(1) } while (check_sound_playing())`, у нас — пауза
|
||||
* длиной в нашу запись. Считается ЗДЕСЬ, а не в C, по двум
|
||||
* причинам: blocks*40 переполняет uint16 на won (9855 порций), и
|
||||
* число обязано соответствовать НАБОРУ, которым собрали (flac и
|
||||
* mt32 — разные исполнения разной длины).
|
||||
*
|
||||
* Отношение 40/57 — обратное к тому, которым шкала сцены переводит
|
||||
* тики в порции насоса (57/40, см. pop_intro.c). Берём именно его,
|
||||
* а не точное 10937,5/128/60, чтобы длина реплики и ход шкалы
|
||||
* считались одной и той же арифметикой. Округление — к ближайшему
|
||||
* (+28 перед делением): отбрасывание вниз теряло по тику на реплику.
|
||||
*/
|
||||
#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 */
|
||||
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* pop_music_ticks.h — длительности треков в ТИКАХ СЦЕНЫ, СГЕНЕРИРОВАН.
|
||||
* Набор: flac. Генератор: tools/pop_pack_music.py.
|
||||
* Руками не править.
|
||||
*
|
||||
* Нужны там, где сценарий ждёт окончания реплики: у оригинала это
|
||||
* `do { frame(1) } while (check_sound_playing())`, у нас — пауза длиной
|
||||
* в НАШУ запись. Число обязано соответствовать набору, которым собрана
|
||||
* сборка: одна и та же реплика на flac и mt32 разной длины (m53 — 985
|
||||
* тиков против 1044), и захардкоженная константа молча ломает сцену.
|
||||
*
|
||||
* Считается здесь, а не в C: blocks*40 переполняет uint16 на won
|
||||
* (9855 порций). Отношение 40/57 — обратное к тому, которым шкала
|
||||
* сцены переводит тики в порции насоса (57/40, pop_intro.c); берём
|
||||
* именно его, чтобы длина реплики и ход шкалы считались одной
|
||||
* арифметикой. Округление к ближайшему: вниз теряло по тику.
|
||||
*/
|
||||
#ifndef POP_MUSIC_TICKS_H
|
||||
#define POP_MUSIC_TICKS_H
|
||||
|
||||
#define POP_MUS_TICKS_24 214 /* regular_death */
|
||||
#define POP_MUS_TICKS_25 138 /* find_mirror_and_find_shadow */
|
||||
#define POP_MUS_TICKS_26 794 /* embrace */
|
||||
#define POP_MUS_TICKS_27 642 /* cutscene_before_2_4_6_12 */
|
||||
#define POP_MUS_TICKS_28 460 /* fight_death */
|
||||
#define POP_MUS_TICKS_29 300 /* meet_Jaffar */
|
||||
#define POP_MUS_TICKS_30 210 /* life_potion */
|
||||
#define POP_MUS_TICKS_32 438 /* end_level_4_and_killed_by_shadow */
|
||||
#define POP_MUS_TICKS_33 144 /* potion */
|
||||
#define POP_MUS_TICKS_35 623 /* cutscene_before_8_9 */
|
||||
#define POP_MUS_TICKS_36 881 /* out_of_time */
|
||||
#define POP_MUS_TICKS_37 196 /* guard_death_and_obtaining_the_sword */
|
||||
#define POP_MUS_TICKS_39 1116 /* floating */
|
||||
#define POP_MUS_TICKS_40 418 /* cutscene_not_much_time_left */
|
||||
#define POP_MUS_TICKS_41 732 /* story_5_level_end_and_merge_with_shadow */
|
||||
#define POP_MUS_TICKS_43 200 /* killed_Jaffar */
|
||||
#define POP_MUS_TICKS_50 831 /* story_2_princess */
|
||||
#define POP_MUS_TICKS_52 1714 /* story_4_Jaffar_leaves */
|
||||
#define POP_MUS_TICKS_53 985 /* story_3_Jaffar_enters */
|
||||
#define POP_MUS_TICKS_54 1448 /* intro_theme */
|
||||
#define POP_MUS_TICKS_55 947 /* story_1_absence */
|
||||
#define POP_MUS_TICKS_56 6923 /* won */
|
||||
|
||||
#endif /* POP_MUSIC_TICKS_H */
|
||||
@@ -0,0 +1,71 @@
|
||||
/* pop_shadow_atlas.h — раскладка атласа ТЕНИ.
|
||||
* СГЕНЕРЕНО toolchain/pop_pack_shadow.py — НЕ править вручную.
|
||||
*
|
||||
* Две половины, потому что и у оригинала их две (см. шапку
|
||||
* упаковщика): кадры вне боя адресуют chtab_2 (спрайты Кида),
|
||||
* кадры 150..189 — chtab_5, а он на 12-м уровне это SHADOW.DAT.
|
||||
* Какая половина нужна, приложение уже знает — тем же условием,
|
||||
* что выбирает таблицу кадров (pop_frame_tbl_is_guard).
|
||||
*
|
||||
* Спрайт Тени НА ОДИН ПИКСЕЛЬ ШИРЕ исходного: второй проход
|
||||
* оригинала кладётся в x+1, и суммарный след занимает [x, x+w].
|
||||
* Рисовать по тем же координатам, что и Кида — сдвиг уже внутри.
|
||||
*/
|
||||
#ifndef POP_SHADOW_ATLAS_H
|
||||
#define POP_SHADOW_ATLAS_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define POP_SHADOW_SHIFT 3
|
||||
#define POP_SHADOW_MASK 7
|
||||
#define POP_SHADOW_PAL_BASE 0xA0 /* слоты Sprinter под Тень */
|
||||
|
||||
/* Половина «вне боя» — кадры Кида (chtab_2). */
|
||||
#define POP_SHADOW_KID_PAGES 28
|
||||
/* Половина «в бою» — SHADOW.DAT (chtab_5, кадры 150..189). */
|
||||
#define POP_SHADOW_FGT_PAGES 4
|
||||
|
||||
static const char *const pop_shadow_kid_atl[POP_SHADOW_KID_PAGES] = {
|
||||
"SHADOW\\sk0.atl",
|
||||
"SHADOW\\sk1.atl",
|
||||
"SHADOW\\sk2.atl",
|
||||
"SHADOW\\sk3.atl",
|
||||
"SHADOW\\sk4.atl",
|
||||
"SHADOW\\sk5.atl",
|
||||
"SHADOW\\sk6.atl",
|
||||
"SHADOW\\sk7.atl",
|
||||
"SHADOW\\sk8.atl",
|
||||
"SHADOW\\sk9.atl",
|
||||
"SHADOW\\sk10.atl",
|
||||
"SHADOW\\sk11.atl",
|
||||
"SHADOW\\sk12.atl",
|
||||
"SHADOW\\sk13.atl",
|
||||
"SHADOW\\sk14.atl",
|
||||
"SHADOW\\sk15.atl",
|
||||
"SHADOW\\sk16.atl",
|
||||
"SHADOW\\sk17.atl",
|
||||
"SHADOW\\sk18.atl",
|
||||
"SHADOW\\sk19.atl",
|
||||
"SHADOW\\sk20.atl",
|
||||
"SHADOW\\sk21.atl",
|
||||
"SHADOW\\sk22.atl",
|
||||
"SHADOW\\sk23.atl",
|
||||
"SHADOW\\sk24.atl",
|
||||
"SHADOW\\sk25.atl",
|
||||
"SHADOW\\sk26.atl",
|
||||
"SHADOW\\sk27.atl",
|
||||
};
|
||||
|
||||
static const char *const pop_shadow_fgt_atl[POP_SHADOW_FGT_PAGES] = {
|
||||
"SHADOW\\sf0.atl",
|
||||
"SHADOW\\sf1.atl",
|
||||
"SHADOW\\sf2.atl",
|
||||
"SHADOW\\sf3.atl",
|
||||
};
|
||||
|
||||
/* 16 цветов, запись 4 байта (B, G, R, 0) — формат gfx_pal_load. */
|
||||
static const uint8_t pop_shadow_pal[64] = {
|
||||
0x00,0x00,0x00,0x00,0xD8,0xFC,0xFC,0x00,0x6C,0x80,0xDC,0x00,0x78,0x44,0x24,0x00,0xA0,0xB8,0xD8,0x00,0xB5,0x7C,0x21,0x00,0x00,0x90,0xB8,0x00,0x5D,0x6D,0xAB,0x00,0x0C,0xF0,0x6C,0x00,0xCC,0x38,0x05,0x00,0x38,0xCC,0xC0,0x00,0x58,0xDB,0xA7,0x00,0xBB,0x9F,0x54,0x00,0x5D,0x18,0x60,0x00,0x37,0xD7,0x37,0x00,0x2F,0x17,0xD2,0x00,
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,113 @@
|
||||
/* pop_sound_tbl.h — раскладка оцифрованных эффектов PoP.
|
||||
* СГЕНЕРЕНО toolchain/pop_pack_sound.py — НЕ править вручную.
|
||||
*
|
||||
* Данные: 8 бит беззнаковые, МОНО, 10937.5 Гц (CBL_FREQ_10K9) — формат
|
||||
* CBL один в один, конвертировать в рантайме нечего.
|
||||
*
|
||||
* Начало каждого звука кратно 128 — размеру блока запроса CBL, а
|
||||
* страница (16384) кратна ему же. Поэтому НИ ОДИН блок не пересекает
|
||||
* границу страницы. Больше того: с 2026-08-25 каждый звук лежит
|
||||
* ЦЕЛИКОМ в одной странице — не влезает в остаток, значит начинаем
|
||||
* новую (страницы EMM у нас с запасом). Единственное исключение —
|
||||
* эффект, который сам ДЛИННЕЕ страницы: для него насос переключает
|
||||
* страницу на ходу, и эта ветка в pop_sfx_fill остаётся ради него.
|
||||
*
|
||||
* Смещение хранится РАЗОБРАННЫМ на страницу и адрес в окне: на Z80
|
||||
* 32-битная арифметика дорога, а так всё влезает в 8/16 бит.
|
||||
* Длина округлена вверх до блока — неполных блоков не бывает.
|
||||
*/
|
||||
#ifndef POP_SOUND_TBL_H
|
||||
#define POP_SOUND_TBL_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define POP_SND_PAGES 10
|
||||
#define POP_SND_COUNT 57
|
||||
#define POP_SND_BLOCK 128
|
||||
/* Первый блок страницы 0 — тишина для насоса (см. упаковщик). */
|
||||
#define POP_SND_SILENCE_PAGE 0
|
||||
#define POP_SND_SILENCE_OFF 0x0000
|
||||
|
||||
typedef struct { uint8_t page; uint16_t off; uint16_t len; } pop_snd_ent_t;
|
||||
|
||||
/* len == 0 — у звука нет оцифровки (это музыка, см. sound_plan.md). */
|
||||
static const pop_snd_ent_t pop_snd_tbl[POP_SND_COUNT] = {
|
||||
{ 0, 0x0080, 1664 }, /* 0 */
|
||||
{ 0, 0x0700, 12032 }, /* 1 */
|
||||
{ 1, 0x0000, 6272 }, /* 2 */
|
||||
{ 1, 0x1880, 1280 }, /* 3 */
|
||||
{ 1, 0x1D80, 1152 }, /* 4 */
|
||||
{ 1, 0x2200, 1408 }, /* 5 */
|
||||
{ 1, 0x2780, 5504 }, /* 6 */
|
||||
{ 2, 0x0000, 896 }, /* 7 */
|
||||
{ 2, 0x0380, 1664 }, /* 8 */
|
||||
{ 2, 0x0A00, 2816 }, /* 9 */
|
||||
{ 2, 0x1500, 4992 }, /* 10 */
|
||||
{ 2, 0x2880, 1280 }, /* 11 */
|
||||
{ 2, 0x2D80, 1280 }, /* 12 */
|
||||
{ 3, 0x0000, 3840 }, /* 13 */
|
||||
{ 3, 0x0F00, 7552 }, /* 14 */
|
||||
{ 4, 0x0000, 17664 }, /* 15 */
|
||||
{ 5, 0x0500, 4736 }, /* 16 */
|
||||
{ 5, 0x1780, 4224 }, /* 17 */
|
||||
{ 6, 0x0000, 6912 }, /* 18 */
|
||||
{ 6, 0x1B00, 2816 }, /* 19 */
|
||||
{ 6, 0x2600, 1408 }, /* 20 */
|
||||
{ 6, 0x2B80, 1152 }, /* 21 */
|
||||
{ 6, 0x3000, 1280 }, /* 22 */
|
||||
{ 6, 0x3500, 1408 }, /* 23 */
|
||||
{ 0, 0x0000, 0 }, /* 24 */
|
||||
{ 0, 0x0000, 0 }, /* 25 */
|
||||
{ 0, 0x0000, 0 }, /* 26 */
|
||||
{ 0, 0x0000, 0 }, /* 27 */
|
||||
{ 0, 0x0000, 0 }, /* 28 */
|
||||
{ 0, 0x0000, 0 }, /* 29 */
|
||||
{ 0, 0x0000, 0 }, /* 30 */
|
||||
{ 0, 0x0000, 0 }, /* 31 */
|
||||
{ 0, 0x0000, 0 }, /* 32 */
|
||||
{ 0, 0x0000, 0 }, /* 33 */
|
||||
{ 0, 0x0000, 0 }, /* 34 */
|
||||
{ 0, 0x0000, 0 }, /* 35 */
|
||||
{ 0, 0x0000, 0 }, /* 36 */
|
||||
{ 0, 0x0000, 0 }, /* 37 */
|
||||
{ 0, 0x0000, 0 }, /* 38 */
|
||||
{ 0, 0x0000, 0 }, /* 39 */
|
||||
{ 0, 0x0000, 0 }, /* 40 */
|
||||
{ 0, 0x0000, 0 }, /* 41 */
|
||||
{ 0, 0x0000, 0 }, /* 42 */
|
||||
{ 0, 0x0000, 0 }, /* 43 */
|
||||
{ 7, 0x0000, 2688 }, /* 44 */
|
||||
{ 7, 0x0A80, 4224 }, /* 45 */
|
||||
{ 7, 0x1B00, 4608 }, /* 46 */
|
||||
{ 8, 0x0000, 5120 }, /* 47 */
|
||||
{ 8, 0x1400, 5120 }, /* 48 */
|
||||
{ 8, 0x2800, 4480 }, /* 49 */
|
||||
{ 0, 0x0000, 0 }, /* 50 */
|
||||
{ 9, 0x0000, 4864 }, /* 51 */
|
||||
{ 0, 0x0000, 0 }, /* 52 */
|
||||
{ 0, 0x0000, 0 }, /* 53 */
|
||||
{ 0, 0x0000, 0 }, /* 54 */
|
||||
{ 0, 0x0000, 0 }, /* 55 */
|
||||
{ 0, 0x0000, 0 }, /* 56 */
|
||||
};
|
||||
|
||||
/* Имена файлов видит ТОЛЬКО тот, кто попросил POP_SND_FILES (холодная
|
||||
* половина): иначе копия строк уезжает в каждый включивший заголовок
|
||||
* модуль, а в резиденте W1/W2 каждая сотня байт на счету. Тот же
|
||||
* приём, что у POP_BG_ATLAS_NAMES в pop_bg_atlas.h. */
|
||||
#ifdef POP_SND_FILES
|
||||
static const char *const pop_snd_files[POP_SND_PAGES] = {
|
||||
"SND\\s0.bin",
|
||||
"SND\\s1.bin",
|
||||
"SND\\s2.bin",
|
||||
"SND\\s3.bin",
|
||||
"SND\\s4.bin",
|
||||
"SND\\s5.bin",
|
||||
"SND\\s6.bin",
|
||||
"SND\\s7.bin",
|
||||
"SND\\s8.bin",
|
||||
"SND\\s9.bin",
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,92 @@
|
||||
/* pv_arc.h — индексы в архиве PV. СГЕНЕРИРОВАН
|
||||
* (toolchain/pop_pack_arc.py), руками не править. */
|
||||
#ifndef PV_ARC_H
|
||||
#define PV_ARC_H
|
||||
|
||||
#define ARC_PV_COUNT 83
|
||||
|
||||
#define ARC_PV_S0_0 0
|
||||
#define ARC_PV_S0_1 1
|
||||
#define ARC_PV_S0_2 2
|
||||
#define ARC_PV_S0_3 3
|
||||
#define ARC_PV_S0_4 4
|
||||
#define ARC_PV_S1_0 5
|
||||
#define ARC_PV_S1_1 6
|
||||
#define ARC_PV_S1_2 7
|
||||
#define ARC_PV_S1_3 8
|
||||
#define ARC_PV_S1_4 9
|
||||
#define ARC_PV_S2_0 10
|
||||
#define ARC_PV_S2_1 11
|
||||
#define ARC_PV_S2_2 12
|
||||
#define ARC_PV_S2_3 13
|
||||
#define ARC_PV_S2_4 14
|
||||
#define ARC_PV_S3_0 15
|
||||
#define ARC_PV_S3_1 16
|
||||
#define ARC_PV_S3_2 17
|
||||
#define ARC_PV_S3_3 18
|
||||
#define ARC_PV_S3_4 19
|
||||
#define ARC_PV_S4_0 20
|
||||
#define ARC_PV_S4_1 21
|
||||
#define ARC_PV_S4_2 22
|
||||
#define ARC_PV_S4_3 23
|
||||
#define ARC_PV_S4_4 24
|
||||
#define ARC_PV_S5_0 25
|
||||
#define ARC_PV_S5_1 26
|
||||
#define ARC_PV_S5_2 27
|
||||
#define ARC_PV_S5_3 28
|
||||
#define ARC_PV_S5_4 29
|
||||
#define ARC_PV_P0_0 30
|
||||
#define ARC_PV_P0_1 31
|
||||
#define ARC_PV_P0_2 32
|
||||
#define ARC_PV_P0_3 33
|
||||
#define ARC_PV_P0_4 34
|
||||
#define ARC_PV_P1_0 35
|
||||
#define ARC_PV_P1_1 36
|
||||
#define ARC_PV_P1_2 37
|
||||
#define ARC_PV_P1_3 38
|
||||
#define ARC_PV_P1_4 39
|
||||
#define ARC_PV_P2_0 40
|
||||
#define ARC_PV_P2_1 41
|
||||
#define ARC_PV_P2_2 42
|
||||
#define ARC_PV_P2_3 43
|
||||
#define ARC_PV_P2_4 44
|
||||
#define ARC_PV_P3_0 45
|
||||
#define ARC_PV_P3_1 46
|
||||
#define ARC_PV_P3_2 47
|
||||
#define ARC_PV_P3_3 48
|
||||
#define ARC_PV_P3_4 49
|
||||
#define ARC_PV_P4_0 50
|
||||
#define ARC_PV_P4_1 51
|
||||
#define ARC_PV_P4_2 52
|
||||
#define ARC_PV_P4_3 53
|
||||
#define ARC_PV_P4_4 54
|
||||
#define ARC_PV_P5_0 55
|
||||
#define ARC_PV_P5_1 56
|
||||
#define ARC_PV_P5_2 57
|
||||
#define ARC_PV_P5_3 58
|
||||
#define ARC_PV_P5_4 59
|
||||
#define ARC_PV_P6_0 60
|
||||
#define ARC_PV_P6_1 61
|
||||
#define ARC_PV_P6_2 62
|
||||
#define ARC_PV_P6_3 63
|
||||
#define ARC_PV_P6_4 64
|
||||
#define ARC_PV_P7_0 65
|
||||
#define ARC_PV_P7_1 66
|
||||
#define ARC_PV_P7_2 67
|
||||
#define ARC_PV_P7_3 68
|
||||
#define ARC_PV_P7_4 69
|
||||
#define ARC_PV_B0_0 70
|
||||
#define ARC_PV_B0_1 71
|
||||
#define ARC_PV_B0_2 72
|
||||
#define ARC_PV_B0_3 73
|
||||
#define ARC_PV_B0_4 74
|
||||
#define ARC_PV_A0 75
|
||||
#define ARC_PV_A1 76
|
||||
#define ARC_PV_A2 77
|
||||
#define ARC_PV_J0 78
|
||||
#define ARC_PV_J1 79
|
||||
#define ARC_PV_J2 80
|
||||
#define ARC_PV_H0 81
|
||||
#define ARC_PV_T0 82
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,41 @@
|
||||
/* shadow_arc.h — индексы в архиве SHADOW. СГЕНЕРИРОВАН
|
||||
* (toolchain/pop_pack_arc.py), руками не править. */
|
||||
#ifndef SHADOW_ARC_H
|
||||
#define SHADOW_ARC_H
|
||||
|
||||
#define ARC_SHADOW_COUNT 32
|
||||
|
||||
#define ARC_SHADOW_SK0 0
|
||||
#define ARC_SHADOW_SK1 1
|
||||
#define ARC_SHADOW_SK2 2
|
||||
#define ARC_SHADOW_SK3 3
|
||||
#define ARC_SHADOW_SK4 4
|
||||
#define ARC_SHADOW_SK5 5
|
||||
#define ARC_SHADOW_SK6 6
|
||||
#define ARC_SHADOW_SK7 7
|
||||
#define ARC_SHADOW_SK8 8
|
||||
#define ARC_SHADOW_SK9 9
|
||||
#define ARC_SHADOW_SK10 10
|
||||
#define ARC_SHADOW_SK11 11
|
||||
#define ARC_SHADOW_SK12 12
|
||||
#define ARC_SHADOW_SK13 13
|
||||
#define ARC_SHADOW_SK14 14
|
||||
#define ARC_SHADOW_SK15 15
|
||||
#define ARC_SHADOW_SK16 16
|
||||
#define ARC_SHADOW_SK17 17
|
||||
#define ARC_SHADOW_SK18 18
|
||||
#define ARC_SHADOW_SK19 19
|
||||
#define ARC_SHADOW_SK20 20
|
||||
#define ARC_SHADOW_SK21 21
|
||||
#define ARC_SHADOW_SK22 22
|
||||
#define ARC_SHADOW_SK23 23
|
||||
#define ARC_SHADOW_SK24 24
|
||||
#define ARC_SHADOW_SK25 25
|
||||
#define ARC_SHADOW_SK26 26
|
||||
#define ARC_SHADOW_SK27 27
|
||||
#define ARC_SHADOW_SF0 28
|
||||
#define ARC_SHADOW_SF1 29
|
||||
#define ARC_SHADOW_SF2 30
|
||||
#define ARC_SHADOW_SF3 31
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,13 @@
|
||||
/* skel_arc.h — индексы в архиве SKEL. СГЕНЕРИРОВАН
|
||||
* (toolchain/pop_pack_arc.py), руками не править. */
|
||||
#ifndef SKEL_ARC_H
|
||||
#define SKEL_ARC_H
|
||||
|
||||
#define ARC_SKEL_COUNT 4
|
||||
|
||||
#define ARC_SKEL_G0 0
|
||||
#define ARC_SKEL_G1 1
|
||||
#define ARC_SKEL_G2 2
|
||||
#define ARC_SKEL_G3 3
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,29 @@
|
||||
/* title_arc.h — индексы в архиве TITLE. СГЕНЕРИРОВАН
|
||||
* (toolchain/pop_pack_arc.py), руками не править. */
|
||||
#ifndef TITLE_ARC_H
|
||||
#define TITLE_ARC_H
|
||||
|
||||
#define ARC_TITLE_COUNT 20
|
||||
|
||||
#define ARC_TITLE_T0_0 0
|
||||
#define ARC_TITLE_T0_1 1
|
||||
#define ARC_TITLE_T0_2 2
|
||||
#define ARC_TITLE_T0_3 3
|
||||
#define ARC_TITLE_T0_4 4
|
||||
#define ARC_TITLE_T1_0 5
|
||||
#define ARC_TITLE_T1_1 6
|
||||
#define ARC_TITLE_T1_2 7
|
||||
#define ARC_TITLE_T1_3 8
|
||||
#define ARC_TITLE_T1_4 9
|
||||
#define ARC_TITLE_T2_0 10
|
||||
#define ARC_TITLE_T2_1 11
|
||||
#define ARC_TITLE_T2_2 12
|
||||
#define ARC_TITLE_T2_3 13
|
||||
#define ARC_TITLE_T2_4 14
|
||||
#define ARC_TITLE_T3_0 15
|
||||
#define ARC_TITLE_T3_1 16
|
||||
#define ARC_TITLE_T3_2 17
|
||||
#define ARC_TITLE_T3_3 18
|
||||
#define ARC_TITLE_T3_4 19
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,14 @@
|
||||
/* vizier_arc.h — индексы в архиве VIZIER. СГЕНЕРИРОВАН
|
||||
* (toolchain/pop_pack_arc.py), руками не править. */
|
||||
#ifndef VIZIER_ARC_H
|
||||
#define VIZIER_ARC_H
|
||||
|
||||
#define ARC_VIZIER_COUNT 5
|
||||
|
||||
#define ARC_VIZIER_G0 0
|
||||
#define ARC_VIZIER_G1 1
|
||||
#define ARC_VIZIER_G2 2
|
||||
#define ARC_VIZIER_G3 3
|
||||
#define ARC_VIZIER_G4 4
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user