/* * pop_ctrl.h — управление Kid (Фаза K2b): порт диспетчера control() * (SDLPoP seg005.c) + модель ввода read_user_control/user_control * (seg006.c) поверх held-state клавиатуры . * * Kid-only подмножество: без меча и стражи. Map-запросы (стена/край/ * захват) ЗАСТАБЛЕНЫ «открытый пол» — реальная коллизия (стоп у стены, * падение в ямы, повисание) приходит в K3/K4. Даёт отклик на клавиши: * бег влево/вправо, разворот, стоп, присед, прыжок с места, прыжок в * беге, присед-прыжок. * * Раскладка (kbd_raw, PS/2 Set 2): ←/→ = движение, ↓ = присед, ↑ = * прыжок вверх (с →), Shift = осторожный шаг (K3). ESC — выход (проверяет * приложение сам, канал raw забирает весь ввод у DSS). */ #ifndef POP_CTRL_H #define POP_CTRL_H #include /* Открыть raw-канал клавиатуры и обнулить память авто-повтора. * 0 — OK, -1 — ошибка (EBUSY и пр., см. kbd_raw_open). */ int pop_ctrl_init(void); void pop_ctrl_close(void); /* Один кадр ввода: прочитать клавиши -> обновить control_* -> прогнать * диспетчер control() (может сменить Kid.curr_seq). Звать ПЕРЕД * kid_tick() (play_seq продолжит с новой последовательности). */ void pop_ctrl_tick(void); /* control_shift зажат ПРЯМО СЕЙЧАС? — для check_grab в физике (pop_map): * зацеп за уступ в падении по Shift. Валидно после pop_ctrl_tick. */ int8_t pop_ctrl_shift_held(void); /* ---- Шина синтетического ввода (порт глобалов control_* из seg005) ---- * В оригинале ИИ соперника (autocontrol_*, seg002) не имеет своего * диспетчера: он ВЫСТАВЛЯЕТ эти переменные, а дальше исполняется тот же * control(), что и для игрока. Значения — CONTROL_RELEASED/IGNORE/HELD. */ #define POP_CONTROL_RELEASED 0 #define POP_CONTROL_IGNORE 1 #define POP_CONTROL_HELD (-1) /* Оси ЭТОГО кадра (абсолютные): X = -1 влево / +1 вправо, Y = -1 вверх / * +1 вниз. Для ИИ «вперёд/назад» уже в системе персонажа, поэтому оси он * заполняет как есть, без flip_control_x. */ extern int8_t control_x, control_y, control_shift; #define POP_CONTROL_HELD_FORWARD (-1) #define POP_CONTROL_HELD_BACKWARD 1 #define POP_CONTROL_HELD_UP (-1) #define POP_CONTROL_HELD_DOWN 1 extern int8_t control_forward, control_backward, control_up, control_down, control_shift2; /* Диспетчер (seg005:252) для АКТИВНОГО персонажа Char. Игрок идёт через * pop_ctrl_tick (тот делает user_control с зеркалом «вперёд»), страж — из * своего тика напрямую. */ void pop_control(void); #endif