From 2e90eaf7d7220f43d8369ec93e3912bd393bbf0a Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Thu, 30 Jul 2026 18:51:49 +0300 Subject: [PATCH] =?UTF-8?q?PoP=20roomtest:=20=D0=BE=D0=BA=D0=BD=D0=BE=20Ch?= =?UTF-8?q?ar=20=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=B7=D0=B0=D1=82=D0=B8=D1=80=D0=B0=D0=B5=D1=82=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D0=B8=20pop=5Fmap=20(=D1=81=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D0=BA=20=D1=81=20=D1=83=D1=81=D1=82=D1=83=D0=BF=D0=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Регрессия от окна Char вокруг control() (cf06896): диспетчер работает с копией Char, а часть его действий у нас исполняет pop_map (pop_down_action, pop_jump_up_seq, safe_step, зацеп) — и пишет ПРЯМО в Kid, потому что на Char он ещё не переведён. Завершающее `Kid = Char` затирало эти правки: выравнивание x и ряд терялись, и спуск с уступа через вис не срабатывал — Кид просто приседал. pop_savekid_state теперь копирует только то, что диспетчер реально меняет у персонажа: curr_seq и sword. Когда pop_map переведём на Char, вернётся полное копирование — в комментарии это зафиксировано. Co-Authored-By: Claude Opus 5 --- applications/PoP/roomtest/pop_kid.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/applications/PoP/roomtest/pop_kid.c b/applications/PoP/roomtest/pop_kid.c index 3fe2d56..6ed375f 100644 --- a/applications/PoP/roomtest/pop_kid.c +++ b/applications/PoP/roomtest/pop_kid.c @@ -206,9 +206,20 @@ pop_char_t Opp; void pop_loadkid(void) { Char = Kid; } void pop_savekid(void) { Kid = Char; } -/* Выгрузка БЕЗ кадра: control() кадр не трогает, а cur_frame в этот - * момент принадлежит тому, кто последним крутил play_seq. */ -void pop_savekid_state(void) { Kid = Char; } +/* Выгрузка после control(): копируем ТОЛЬКО то, что диспетчер реально + * меняет у активного персонажа — последовательность и состояние меча. + * + * Почему не `Kid = Char`, как делает savekid оригинала: у нас часть + * действий control() исполняет pop_map (pop_down_action, pop_jump_up_seq, + * safe_step...), и он пишет ПРЯМО в Kid — там ещё не портирован переход на + * Char. Полное копирование затирало эти правки: Kid терял выравнивание x + * и ряд, и спуск с уступа через вис не срабатывал — персонаж просто + * приседал. Когда pop_map переведём на Char, здесь вернётся Kid = Char. */ +void pop_savekid_state(void) +{ + Kid.curr_seq = Char.curr_seq; + Kid.sword = Char.sword; +} void pop_loadshad(void) { Char = Guard; } void pop_saveshad(void) { Guard = Char; } void pop_loadshad_and_opp(void) { Char = Guard; Opp = Kid; }