/*
 * pop_ctrl.h — управление Kid (Фаза K2b): порт диспетчера control()
 * (SDLPoP seg005.c) + модель ввода read_user_control/user_control
 * (seg006.c) поверх held-state клавиатуры <kbd_raw.h>.
 *
 * 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 <stdint.h>

/* Открыть 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
