Бой у шва: смену комнаты запрещают ещё и кадры меча (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:
@@ -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) он на пиксель правее чистого
|
||||
|
||||
Reference in New Issue
Block a user