ea57a03543
Порт SDLPoP seg004/005/006 «hang state»: - pop_map: check_grab (зацеп за уступ в падении по Shift → seq_15 → вис), can_grab/can_grab_front_above + tile-запросы над/за персонажем; pop_jump_up_seq (check_jump_up: ↑ в стойке = чистый прыжок seq_28/14 ЛИБО прыжок-с-зацепом seq_8/24/16 за уступ выше → запрыгнуть на этаж); pop_hang_* (climb_up seq_10/73, hang_fall seq_23/11, hang-у-стены); pop_down_action (спуск seq_68 у края лицом от края / отступ / присед). - pop_ctrl: control_hanging/can_climb_up/hang_fall, control_jumpup, jump_up через pop_jump_up_seq, down_pressed через pop_down_action; pop_ctrl_shift_held() для check_grab. Ключевой фикс check_bumped (seg004 guard'ы): не бампить при action hang_climb/hang_straight, на кадрах подъёма/спуска 135..148 И на кадрах виса 87..99. Без последнего спуск (seq_68) на кадре frame_91 (action ещё midair, act(hang_climb) идёт следующим опкодом) ловил отскок у стены и рвал цепочку hang→hang_fall→seq_11, приземляя не туда. Проверено в MAME (HDD-тест, покадровая трасса через мост): прыжок-с- зацепом [row2 col4]→вис→подтягивание→[row1 col3]; спуск [row1 col3]→ [row2 col4] с корректной позицией у стены (x=122, совпадает с SDLPoP). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
36 lines
1.9 KiB
C
36 lines
1.9 KiB
C
/*
|
|
* 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);
|
|
|
|
#endif
|