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:
2026-08-27 12:12:28 +03:00
parent 4b74478d19
commit 31b82661eb
235 changed files with 51293 additions and 10 deletions
+34
View File
@@ -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
+19
View File
@@ -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
+67
View File
@@ -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
+41
View File
@@ -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
+77
View File
@@ -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
+47
View File
@@ -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
+29
View File
@@ -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
+36
View File
@@ -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
+104
View File
@@ -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 */
+44
View File
@@ -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
+113
View File
@@ -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
+92
View File
@@ -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
+41
View File
@@ -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
+13
View File
@@ -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
+29
View File
@@ -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
+14
View File
@@ -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