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