From a498255471f44082a3df2183ba868acaf599ffaf Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Tue, 18 Aug 2026 16:35:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=BE=D0=B9=20=D1=83=20=D1=88=D0=B2?= =?UTF-8?q?=D0=B0:=20=D1=81=D0=BC=D0=B5=D0=BD=D1=83=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BD=D0=B0=D1=82=D1=8B=20=D0=B7=D0=B0=D0=BF=D1=80=D0=B5=D1=89?= =?UTF-8?q?=D0=B0=D1=8E=D1=82=20=D0=B5=D1=89=D1=91=20=D0=B8=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=B4=D1=80=D1=8B=20=D0=BC=D0=B5=D1=87=D0=B0=20(leave=5Froom,?= =?UTF-8?q?=20seg002:0490)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Пользователь: при бое на шве (Кид в 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 --- applications/PoP/roomtest/pop_map.c | 30 +++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) 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) он на пиксель правее чистого