L3-CHOMP: перед чомпером Кид разбегается сразу, без осторожного шага
forward_pressed (seg005:0577) исключает чомпер из правила «у стены шагаем, а не бежим»: `edge_type == EDGE_TYPE_WALL && curr_tile2 != tiles_18_chomper && distance < 8`. У нас исключения не было, а wall_type(18) = 3 — чомпер считается стеной, — поэтому из позиции вплотную к челюстям Кид сначала делал safe_step на 1-2 px и только потом бежал. Лишние кадры шага не дают проскочить между челюстями (поймано на приёмке, комната 3.22). Добавлен pop_edge_tile() — порт curr_tile2 после get_edge_distance. control_turning не трогаем: у нас он ванильный, а второе такое исключение в SDLPoP сидит под фиксом fix_turn_running_near_wall.
This commit is contained in:
@@ -101,6 +101,8 @@ static int8_t release_arrows(void)
|
|||||||
return CONTROL_IGNORE; /* seg006: return 1 */
|
return CONTROL_IGNORE; /* seg006: return 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define TILE_CHOMPER 18 /* tiles_18_chomper (исключение в forward_pressed) */
|
||||||
|
|
||||||
/* Край/стена впереди — из pop_map (get_edge_distance): pop_edge_distance()
|
/* Край/стена впереди — из pop_map (get_edge_distance): pop_edge_distance()
|
||||||
* возвращает дистанцию и ставит pop_edge_type() = EDGE_WALL/FLOOR/CLOSER. */
|
* возвращает дистанцию и ставит pop_edge_type() = EDGE_WALL/FLOOR/CLOSER. */
|
||||||
|
|
||||||
@@ -158,8 +160,14 @@ static void draw_sword(void); /* fwd: нужен в control_standing */
|
|||||||
static void forward_pressed(void)
|
static void forward_pressed(void)
|
||||||
{
|
{
|
||||||
int distance = pop_edge_distance();
|
int distance = pop_edge_distance();
|
||||||
if (pop_edge_type() == EDGE_WALL && distance < 8) {
|
/* seg005:0577 — «у стены шагаем, а не бежим», НО чомпер из этого правила
|
||||||
/* рядом стена — вместо бега осторожный шаг (в стену не разбежится) */
|
* ЯВНО исключён (`curr_tile2 != tiles_18_chomper`). Он проходим в
|
||||||
|
* разомкнутой фазе, и оригинал даёт разбежаться сразу: без исключения
|
||||||
|
* Кид перед чомпером делает лишний осторожный шаг, а это кадры — и он
|
||||||
|
* не успевает проскочить между челюстями (поймано на приёмке
|
||||||
|
* 2026-08-08, комната 3.22). */
|
||||||
|
if (pop_edge_type() == EDGE_WALL && pop_edge_tile() != TILE_CHOMPER &&
|
||||||
|
distance < 8) {
|
||||||
if (control_forward == CONTROL_HELD)
|
if (control_forward == CONTROL_HELD)
|
||||||
safe_step();
|
safe_step();
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -846,6 +846,11 @@ int pop_edge_distance(void) __banked
|
|||||||
|
|
||||||
uint8_t pop_edge_type(void) __banked { return g_edge_type; }
|
uint8_t pop_edge_type(void) __banked { return g_edge_type; }
|
||||||
|
|
||||||
|
/* Тайл, на котором закончился разбор края (порт curr_tile2 после
|
||||||
|
* get_edge_distance). Нужен control'у: правило «у стены шагаем, а не
|
||||||
|
* бежим» в оригинале ЯВНО исключает чомпер (seg005:0577). */
|
||||||
|
uint8_t pop_edge_tile(void) __banked { return g_curr_tile; }
|
||||||
|
|
||||||
/* ---- Прыжок вверх с зацепом (seg005 check_jump_up и производные) --- *
|
/* ---- Прыжок вверх с зацепом (seg005 check_jump_up и производные) --- *
|
||||||
* pop_jump_up_seq выбирает seq для ↑ в стойке: чистый прыжок (seq_28 в
|
* pop_jump_up_seq выбирает seq для ↑ в стойке: чистый прыжок (seq_28 в
|
||||||
* пустоту / seq_14 в потолок) ЛИБО прыжок-и-зацеп за уступ выше (seq_8/
|
* пустоту / seq_14 в потолок) ЛИБО прыжок-и-зацеп за уступ выше (seq_8/
|
||||||
|
|||||||
@@ -175,6 +175,8 @@ int pop_clip_char_right(void) __banked;
|
|||||||
/* Расстояние до края/стены впереди + побочно g_edge_type (pop_edge_type). */
|
/* Расстояние до края/стены впереди + побочно g_edge_type (pop_edge_type). */
|
||||||
int pop_edge_distance(void) __banked;
|
int pop_edge_distance(void) __banked;
|
||||||
uint8_t pop_edge_type(void) __banked;
|
uint8_t pop_edge_type(void) __banked;
|
||||||
|
/* Тайл, на котором остановился разбор края (curr_tile2 оригинала). */
|
||||||
|
uint8_t pop_edge_tile(void) __banked;
|
||||||
|
|
||||||
/* Стена впереди в пределах стопа? Если да — прижимает Kid.x к корректной
|
/* Стена впереди в пределах стопа? Если да — прижимает Kid.x к корректной
|
||||||
* позиции (передний край у стены, симметрично) и возвращает 1. Для
|
* позиции (передний край у стены, симметрично) и возвращает 1. Для
|
||||||
|
|||||||
Reference in New Issue
Block a user