Бой у шва: смену комнаты запрещают ещё и кадры меча (leave_room, seg002:0490)

Пользователь: при бое на шве (Кид в 18, страж в 24) комната перерисовывается
то одна, то другая — драться невозможно.

leave_room запрещает уход не только на развороте, подъёме-с-зацепа и
вставании из приседа, но и на всей боевой анимации: кадры 150..162 и
166..168.  У нас были только первые три условия, поэтому отступающий и
наступающий Кид пересекал границу почти каждый кадр.

Оригинал пускает смену комнаты только на «легальном» кадре вроде 170.
Известный побочный эффект — Trick 35 «retreat without leaving the room»;
в SDLPoP его чинит FIX_RETREAT_WITHOUT_LEAVING_ROOM, по умолчанию
выключенный, так что портируем оригинал.

Сторона стража проверена отдельно и расхождений не дала: play_guard_frame
(seg000:0F48) ухода из комнаты не содержит вовсе, страж меняет комнату
только через follow_guard (есть, pop_guard_follow) и check_guard_fallout
(есть, pop_guard_fallout).

Банк 3 +10 Б, резидент без изменений.  Host-тесты 5106 проверок чисто.
Сам бой у шва не воспроизводился — проверка за пользователем.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-18 16:35:12 +03:00
parent c40ae3f8f5
commit a498255471
+24 -6
View File
@@ -2799,13 +2799,31 @@ static void check_leave(void)
int fx; int fx;
uint8_t f = Char.frame; uint8_t f = Char.frame;
/* seg002 leave_room: комнату НЕ покидаем во время разворота (action turn), /* seg002 leave_room: комнату НЕ покидаем во время разворота (action turn),
* подъёма-с-зацепа (climb, кадры 135..149) и вставания из приседа * подъёма-с-зацепа (climb, кадры 135..149), вставания из приседа
* (110..119). Без этого гарда разворот у правого шва (взгляд флипается * (110..119) и — ОТДЕЛЬНО ВАЖНОЕ — БОЯ МЕЧОМ (150..162 и 166..168).
* право→лево, char_x_left проскакивает >=198) телепортирует Kid сквозь *
* закрытые ворота в соседнюю комнату (leave_room возвращает 1). */ * Без первых трёх разворот у правого шва (взгляд флипается право→лево,
* char_x_left проскакивает >=198) телепортирует Kid сквозь закрытые
* ворота в соседнюю комнату (leave_room возвращает 1).
*
* Без кадров МЕЧА бой у шва превращается в мельтешение: отступая и
* наступая, Kid пересекает границу почти каждый кадр, и комната
* перерисовывается туда-обратно — драться невозможно (найдено
* пользователем 2026-08-18, уровень 8, шов комнат 24/18). Оригинал
* пускает смену комнаты только на «легальном» кадре вроде 170 (стойка
* с мечом), а вся боевая анимация уход запрещает. Побочный эффект в
* оригинале известен и даже эксплуатируется: Trick 35 «retreat without
* leaving the room» — определённым ритмом «назад» из комнаты можно
* пятиться, не переключая её вовсе (в SDLPoP это чинит опциональный
* FIX_RETREAT_WITHOUT_LEAVING_ROOM, по умолчанию ВЫКЛЮЧЕННЫЙ; мы, как
* обычно, портируем оригинал, а не его исправления).
*
* NB: 135..149 и 150..162 смежны, поэтому слиты в один диапазон —
* условие то же, а сравнений на одно меньше. */
if (Char.action == ACT_TURN || if (Char.action == ACT_TURN ||
(f >= 135 && f < 150) || (f >= 110 && f < 120) ||
(f >= 110 && f < 120)) (f >= 135 && f < 163) || /* подъём-с-зацепа + вся боевая анимация */
(f >= 166 && f < 169)) /* стойка «замер, меч наготове» */
return; return;
/* Передний край — ТОЛЬКО через char_x_forward_edge (obj_x-арифметика /* Передний край — ТОЛЬКО через char_x_forward_edge (obj_x-арифметика
* set_char_collision): в зоне шва (<=57) он на пиксель правее чистого * set_char_collision): в зоне шва (<=57) он на пиксель правее чистого