cd8d566d82
Порт PoP на Sprinter. Текущий PoC — applications/PoP/roomtest/: комната 1 (фон-композиция тайлов) + Kid с управлением на raw-клавиатуре и коллизией с картой. - roomtest — pop_bg (фон), pop_kid (спрайты Kid, column-major флип, seqtbl-анимация), pop_ctrl (порт control() PoP на held-state kbd_raw), pop_map (коллизия seg004/005: бег/стоп у стены, падение/приземление, отскок seq_47, вертикальный прыжок K4.1). MEMORY=small (DATA сразу за CODE, ~23КБ кода не лезет в huge). - toolchain (PoP) — pop_pack_kid/pop_pack_bg/render_room/extract — распаковка res-графики MSDOS в атласы + композиция комнат. - toolchain/ (корень) — make_hdd.sh (быстрый HDD-тест вместо FDD), png_strip.py / room_compose.py (ассет-пайплайн). - docs — PORT_PLAN, KID_PLAN, форматы ресурсов (Apple II / MSDOS / DAT). - bgtest/coltest/poc — ранние PoC (фон, коллизия, первый прототип). .gitignore: build-артефакты applications/*/*/*; исключены внешние референс-репозитории (SDLPoP/mininim/PR/Apple-II — свои git-клоны) и оригинальные game-данные MSDOS/ (копирайт, только для реверса форматов). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
64 lines
2.7 KiB
C
64 lines
2.7 KiB
C
/*
|
|
* pop_kid.h — движок анимации/движения Kid (Фаза K1): интерпретатор
|
|
* seqtbl (play_seq) + frame_table. Порт SDLPoP seg006.c. Данные —
|
|
* kid_data.h (pop_extract_kid_data.py).
|
|
*
|
|
* K1: только проигрывание последовательностей кадров с авторскими
|
|
* смещениями (движение = SEQ_DX/DY + frame.dx/dy). Управление (K2) и
|
|
* коллизия карты (K3) — отдельно.
|
|
*/
|
|
#ifndef POP_KID_H
|
|
#define POP_KID_H
|
|
|
|
#include <stdint.h>
|
|
|
|
/* Состояние персонажа (подмножество char_type, types.h). */
|
|
typedef struct {
|
|
uint8_t frame;
|
|
uint8_t x, y;
|
|
int8_t direction; /* -1 влево, 0 вправо */
|
|
int8_t curr_col, curr_row;
|
|
uint8_t action;
|
|
int8_t fall_x, fall_y;
|
|
uint8_t repeat;
|
|
uint16_t curr_seq; /* адрес в seqtbl (база SEQTBL_BASE) */
|
|
} kid_t;
|
|
|
|
extern kid_t Kid;
|
|
|
|
/* Загрузить npages атласов Kid (kid0..kid{npages-1}.atl). ДО initgraph.
|
|
* 0 — OK, -1 — ошибка. */
|
|
int pop_kid_load(uint8_t npages);
|
|
void pop_kid_free(void);
|
|
|
|
/* Инициализировать Kid: последовательность seq_id, клетка col/row,
|
|
* направление dir (-1/0). Ставит x/y по x_bump/y_land. */
|
|
void kid_init(uint8_t seq_id, int8_t col, int8_t row, int8_t dir);
|
|
|
|
/* Один логический тик: play_seq() — продвинуть последовательность до
|
|
* следующего кадра (применить SEQ_DX/DY/ACTION/...). */
|
|
void kid_tick(void);
|
|
|
|
/* play_seq напрямую (для pop_map start_fall — переход в fall-seq в тот же
|
|
* physics-шаг, как оригинал). */
|
|
void play_seq(void);
|
|
|
|
/* Поля текущего кадра kid_frames[Kid.frame] (pop_map, без дублирования
|
|
* таблицы во втором TU). */
|
|
int8_t kid_cur_dx(void);
|
|
uint8_t kid_cur_flags(void);
|
|
|
|
/* Сменить последовательность (Kid.curr_seq = kid_seq_off[seq_id]) — единая
|
|
* точка для pop_ctrl/pop_map (иначе каждый дублировал бы kid_seqtbl ~2.3КБ). */
|
|
void kid_set_seq(uint8_t seq_id);
|
|
|
|
/* Нарисовать текущий кадр Kid (банк GFX_BANK_SPRITE — видео-ОЗУ, без
|
|
* теневой копии; запоминает прямоугольник для kid_heal). */
|
|
void kid_draw(void);
|
|
|
|
/* Восстановить фон (из теневой копии) на месте ПРЕДЫДУЩЕГО кадра Kid —
|
|
* вместо перерисовки всего экрана. Звать ПЕРЕД kid_tick/kid_draw. */
|
|
void kid_heal(void);
|
|
|
|
#endif
|