47a4b084c4
Эта сессия (меню + текст в служебных полосах):
* Меню: рамка выделения считается от силуэта текста (SEL_PAD сверху и
снизу), а не «на глаз»; все экраны центрируются в игровых 200 строках
(UI_CENTER_TOP/UI_CENTER_FIELD) и в них помещаются; Enter и Space —
равноправные клавиши действия (ui_action_down).
* Settings: убраны SHOW SPRINTER SCREEN и BACK, добавлены DEBUG BAR и
ABOUT. About показывает тот же текст, что стартовый Sprinter screen,
минус строка про клавиши — общий about_text(), чтобы экраны не
разъехались. CONTROLS собирается таблицей и центрируется по
фактическому числу строк.
* GAME PAUSED переехала в нижнюю статус-строку, как в оригинале
(SDLPoP rect_bottom_text = {193,70,202,250}): это состояние программы,
а не пункт меню. POP_HP_Y вынесен в pop_cdraw.h — полосу делят два
модуля.
* pop_status.c (банк 9) — текст в обеих служебных полосах. Нижняя:
порт display_text_bottom + таймера (QUICKSAVE/QUICKLOAD/SOUND ON/OFF,
24 тика). Верхняя отладочная переведена с палочек на текст
«Level ##, Room ##, Speed: …, Sound: …, Immortal #» малым шрифтом, с
своим форматированием чисел (без printf и без деления).
Заявка сообщения — запись одного байта pop_status_msg: резидент W1/W2
не растёт, весь рендер в банке. Бюджет после правок не изменился
(_CODE 23981, куча 267 Б).
* Цена вывода: блит глифа ~4,6 тыс. тактов независимо от размера, поэтому
всё change-driven, отладочная строка перерисовывается ПО ПОЛЯМ, пробелы
не блитятся вовсе, а вход в комнату заливает только игровое поле
(pop_screen_fill_field) — борта от комнаты к комнате не меняются.
* Интро: в PV-сцене зазвучали пропавшие эффекты оригинала — закрытие
ворот (4) и открытие двери покоев (51), из которой входит Джафар.
* docs/status_line_text.md — полная инвентаризация ВСЕХ текстов SDLPoP в
статус-строке: геометрия, семантика text_time_total как идентификатора
сообщения, мигание, рестарт по истечении 36/288.
Вместе с этим выкладывается накопленная работа по оболочке полной игры:
автомат состояний (pop_app), title, intro/PV и cutscene, attract-demo,
Hall of Fame, глобальный таймер, настройки и POP.CFG, модуль палитр и
fade, звуковой набор, host-тесты на новые швы.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
78 lines
3.4 KiB
C
78 lines
3.4 KiB
C
/* 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_data.bin (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_data.bin: кадры (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
|