3dbad6120c
Шаги 1-2 из плана стражей: 1. Спрайты (chtab_5_guard, база 750). Новый упаковщик pop_pack_guard.py: data/GUARD/res751..784 -> GUARD\g0..g4.atl (5 EMM-страниц, адресация id>>3 / id&7, как у Kid). Палитра берётся НЕ из PNG, а из res10.bin (guard_palettes: 7 палитр по 16 цветов, 6-бит) по level.guards_color — на уровне 1 у обоих стражей color = 2; группа слотов 0x90..0x9F добавлена в общий kid.pal. 2. Таблица кадров стража у оригинала СВОЯ (frame_tbl_guard, seg006:372, 41 запись) и индексируется как frame + add_frame - 149, где add_frame = 70 для кадров 102..106. Она дописана в kid_data.bin (3515 -> 3720 Б, смещение в KID_BIN_GFRAMES_OFF); pop_kid получил pop_kid_data_frame() — чтение кадра из ЛЮБОЙ таблицы страницы данных. 3. Появление: pop_level_guard() читает guards_tile/dir/color/skill из уровня, pop_guard_enter() ставит стража по enter_guard (seg002:0112) + pos_guards (seg003): row из тайла, y = y_land[row+1], x из колонки, charid = guard, sword сложен, alive = -1, HP = 3. Отрисовка pop_guard_draw() — та же математика, что kid_draw (load_frame_to_obj + calc_screen_x_coord), но атлас стража и своя таблица кадров; heal по странице дабл-буфера, как у Kid. Интерпретатора последовательностей у стража ПОКА НЕТ: кадр ставится напрямую (166 = frame_166_stand_inactive, что и даёт seq_77 при входе в комнату). play_seq для произвольного персонажа + ИИ — следующая фаза. Проверено в MAME: в комнате 3 страж появляется на своём месте (ряд 1, кол 7) и рисуется; цвета совпадают с эталонным рендером спрайта в палитре color=2. ВНИМАНИЕ по памяти: куча W2 просела до 805 Б (было 2349). Перед ИИ стражей нужен шаг 5 плана (данные: room_modif 720 Б, dl1/dl2 512 Б, _kbdraw_down 512 Б) либо вынос кода отрисовки стража в резидент W3. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
46 lines
2.0 KiB
C
46 lines
2.0 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
|
|
|
|
#define KID_NSEQ 115
|
|
static const uint16_t kid_seq_off[KID_NSEQ] = {
|
|
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,
|
|
};
|
|
|
|
#endif
|