applications/PoP/roomtest: K4 — зацеп/вис/подтягивание/спуск
Порт 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>
This commit is contained in:
@@ -50,6 +50,7 @@
|
||||
#define SEQ_44_STEP_ON_EDGE 44
|
||||
#define SEQ_14_JUMP_INTO_CEILING 14 /* прыжок вверх: сверху стена/пол */
|
||||
#define SEQ_28_JUMP_NOTHING_ABOVE 28 /* прыжок вверх: сверху пусто */
|
||||
#define SEQ_25_HANG_AGAINST_WALL 25 /* вис у стены (Shift в висе) */
|
||||
|
||||
#define FRAME_7_RUN 7
|
||||
#define FRAME_11_RUN 11
|
||||
@@ -131,20 +132,19 @@ static void back_pressed(void)
|
||||
static void down_pressed(void)
|
||||
{
|
||||
control_down = CONTROL_IGNORE; /* без авто-повтора */
|
||||
/* climb-down у края (seq_68) — K4 (зацеп/спуск); пока просто присед. */
|
||||
crouch();
|
||||
/* У края пола (край сзади) со зацепом снизу — спуск на этаж (seq_68);
|
||||
* у передней кромки — отступ; иначе присед. Решает pop_down_action. */
|
||||
if (!pop_down_action())
|
||||
crouch();
|
||||
}
|
||||
|
||||
/* Вертикальный прыжок вверх (seg005 jump_up, упрощённо): сверху сплошное
|
||||
* (стена/пол) → seq_14 (в потолок), иначе seq_28 (пусто сверху). Зацеп за
|
||||
* уступ сверху-впереди (can_grab) — K4.2, пока чистый вертикальный прыжок. */
|
||||
/* Прыжок вверх в стойке (seg005 check_jump_up): чистый вертикальный прыжок
|
||||
* ЛИБО прыжок-с-зацепом за уступ выше (запрыгнуть на этаж вверх). Выбор seq
|
||||
* + выравнивание Kid.x — в pop_jump_up_seq (pop_map). */
|
||||
static void jump_up(void)
|
||||
{
|
||||
control_up = release_arrows();
|
||||
if (pop_above_solid())
|
||||
seqtbl_offset_char(SEQ_14_JUMP_INTO_CEILING);
|
||||
else
|
||||
seqtbl_offset_char(SEQ_28_JUMP_NOTHING_ABOVE);
|
||||
seqtbl_offset_char(pop_jump_up_seq());
|
||||
}
|
||||
|
||||
static void up_pressed(void)
|
||||
@@ -250,6 +250,43 @@ static void control_running(void)
|
||||
}
|
||||
}
|
||||
|
||||
/* ---- Вис (seg005 control_hanging/can_climb_up/hang_fall) ---------- *
|
||||
* Тайловые решения (можно ли подтянуться, куда сорваться) — в pop_map;
|
||||
* здесь управление осями control_*. */
|
||||
static void hang_fall(void)
|
||||
{
|
||||
control_down = release_arrows();
|
||||
seqtbl_offset_char(pop_hang_fall_seq()); /* seq_23/seq_11 (+ выравнивание x) */
|
||||
}
|
||||
|
||||
static void can_climb_up(void)
|
||||
{
|
||||
control_up = control_shift2 = release_arrows();
|
||||
seqtbl_offset_char(pop_hang_climb_up_seq()); /* seq_10 / seq_73 */
|
||||
}
|
||||
|
||||
static void control_hanging(void)
|
||||
{
|
||||
if (control_y == CONTROL_HELD && pop_hang_grab_ready()) {
|
||||
can_climb_up(); /* ↑ — подтянуться */
|
||||
} else if (control_shift == CONTROL_HELD) {
|
||||
int8_t w = pop_hang_wall();
|
||||
if (w > 0) seqtbl_offset_char(SEQ_25_HANG_AGAINST_WALL); /* у стены */
|
||||
else if (w < 0) hang_fall(); /* сорваться */
|
||||
/* w==0: сверху пол — держимся (ничего) */
|
||||
} else {
|
||||
hang_fall(); /* отпустил Shift — сорваться */
|
||||
}
|
||||
}
|
||||
|
||||
/* control_jumpup (seg005): в старте прыжка вверх ←/→ или forward → перевести
|
||||
* в прыжок с места. */
|
||||
static void control_jumpup(void)
|
||||
{
|
||||
if (control_x == CONTROL_HELD_FORWARD || control_forward == CONTROL_HELD)
|
||||
standing_jump();
|
||||
}
|
||||
|
||||
/* control() — диспетчер по кадру (seg005.c:252), Kid жив, без меча. */
|
||||
static void control(void)
|
||||
{
|
||||
@@ -261,11 +298,11 @@ static void control(void)
|
||||
else if (f < 4)
|
||||
control_startrun();
|
||||
else if (f >= FRAME_67_JUMPUP1 && f < FRAME_70_JUMPHANG)
|
||||
; /* control_jumpup — K4 */
|
||||
control_jumpup();
|
||||
else if (f < FRAME_15_STAND)
|
||||
control_running();
|
||||
else if (f >= FRAME_87_HANG1 && f < 100)
|
||||
; /* control_hanging — K4 */
|
||||
control_hanging();
|
||||
else if (f == FRAME_109_CROUCH)
|
||||
control_crouched();
|
||||
}
|
||||
@@ -358,6 +395,11 @@ void pop_ctrl_close(void)
|
||||
kbd_raw_close();
|
||||
}
|
||||
|
||||
int8_t pop_ctrl_shift_held(void)
|
||||
{
|
||||
return (int8_t)(control_shift == CONTROL_HELD);
|
||||
}
|
||||
|
||||
void pop_ctrl_tick(void)
|
||||
{
|
||||
rest_ctrl_1();
|
||||
|
||||
Reference in New Issue
Block a user