diff --git a/applications/PoP/roomtest/pop_map.c b/applications/PoP/roomtest/pop_map.c index 1b504b0..48b05e9 100644 --- a/applications/PoP/roomtest/pop_map.c +++ b/applications/PoP/roomtest/pop_map.c @@ -2799,13 +2799,31 @@ static void check_leave(void) int fx; uint8_t f = Char.frame; /* seg002 leave_room: комнату НЕ покидаем во время разворота (action turn), - * подъёма-с-зацепа (climb, кадры 135..149) и вставания из приседа - * (110..119). Без этого гарда разворот у правого шва (взгляд флипается - * право→лево, char_x_left проскакивает >=198) телепортирует Kid сквозь - * закрытые ворота в соседнюю комнату (leave_room возвращает −1). */ + * подъёма-с-зацепа (climb, кадры 135..149), вставания из приседа + * (110..119) и — ОТДЕЛЬНО ВАЖНОЕ — БОЯ МЕЧОМ (150..162 и 166..168). + * + * Без первых трёх разворот у правого шва (взгляд флипается право→лево, + * 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 || - (f >= 135 && f < 150) || - (f >= 110 && f < 120)) + (f >= 110 && f < 120) || + (f >= 135 && f < 163) || /* подъём-с-зацепа + вся боевая анимация */ + (f >= 166 && f < 169)) /* стойка «замер, меч наготове» */ return; /* Передний край — ТОЛЬКО через char_x_forward_edge (obj_x-арифметика * set_char_collision): в зоне шва (<=57) он на пиксель правее чистого