From 4d4323fc540977418c9210243414ccc570fbcab2 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Sat, 8 Aug 2026 19:11:24 +0300 Subject: [PATCH] =?UTF-8?q?L3-CHOMP:=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B7=D1=83=D0=B1=D1=8C=D1=8F=20=D1=87?= =?UTF-8?q?=D0=BE=D0=BC=D0=BF=D0=B5=D1=80=D0=B0=20=E2=80=94=20=D0=B1=D0=BB?= =?UTF-8?q?=D0=B8=D1=82=20pop=5Ffore=5Fb=20=D0=B8=20=D0=B2=D0=B5=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B2=20draw=5Ftile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Две ошибки в одном месте. 1) Кадры 106..110 и передняя кровь 119..123 упакованы в pop_fore.atl (FORE_ENV_IDS в pop_pack_bg.py), а блитились через pop_env_b — id уходил в env-страницу 3 по индексу 10, где записи нет, и передний слой не рисовался вовсе: Кид, стоящий ЗА челюстями, был виден целиком. 2) В draw_tile была только backtable-часть; у оригинала фронт чомпера рисует отдельная ветка draw_tile_fore (через таблицу он не идёт — у записи 0x12 fore_id нулевой), поэтому передние зубья появлялись лишь там, где по тайлу прошёлся fore-проход персонажа. --- applications/PoP/roomtest/pop_bg.c | 7 +++++-- applications/PoP/roomtest/pop_room.c | 13 +++++++++++++ applications/PoP/roomtest/pop_tile.h | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/applications/PoP/roomtest/pop_bg.c b/applications/PoP/roomtest/pop_bg.c index f45b223..27458b6 100644 --- a/applications/PoP/roomtest/pop_bg.c +++ b/applications/PoP/roomtest/pop_bg.c @@ -335,9 +335,12 @@ static void fore_only_tile(int row, int col) if (code == 0x12) { /* чомпер: передний слой челюстей */ uint8_t cm = pop_tile_mod(row, col); uint8_t pose = pop_chomp_pose(cm); - pop_env_b(POP_CHOMP_FRAM_FOR[pose], x, dmy); + /* Передние куски чомпера и его кровь лежат в pop_fore.atl + * (FORE_ENV_IDS в pop_pack_bg.py), а НЕ в env-страницах: блит + * обязан быть pop_fore_b, иначе id уходит в чужую страницу. */ + pop_fore_b(POP_CHOMP_FRAM_FOR[pose], x, dmy); if (cm & 0x80) /* кровь поверх переднего слоя */ - pop_env_b((uint8_t)(pose + 119), x + 8, dmy - 6); + pop_fore_b((uint8_t)(pose + 119), x + 8, dmy - 6); } if (code == 10) { /* зелье: склянка (пузырёк — динамика) */ pop_potion_flask(row, col, pop_tile_mod(row, col)); diff --git a/applications/PoP/roomtest/pop_room.c b/applications/PoP/roomtest/pop_room.c index 8f95248..59de686 100644 --- a/applications/PoP/roomtest/pop_room.c +++ b/applications/PoP/roomtest/pop_room.c @@ -300,6 +300,19 @@ static void draw_tile(int row, int col) pop_wall_b(POP_WALL_FRAM_MAIN[wmod], x, dmy); /* основная грань */ pop_wall_pattern_b(row, col, 1); } + if (code == 0x12) { /* чомпер: передние зубья + кровь. + * Отдельной веткой, как в оригинале: + * у записи 0x12 fore_id == 0, и через + * таблицу этот слой не идёт. */ + uint8_t cm = pop_tile_mod(row, col); + uint8_t pose = pop_chomp_pose(cm); + /* Передние куски чомпера и его кровь лежат в pop_fore.atl + * (FORE_ENV_IDS в pop_pack_bg.py), а НЕ в env-страницах: блит + * обязан быть pop_fore_b, иначе id уходит в чужую страницу. */ + pop_fore_b(POP_CHOMP_FRAM_FOR[pose], x, dmy); + if (cm & 0x80) + pop_fore_b((uint8_t)(pose + 119), x + 8, dmy - 6); + } if (code == 10) { /* зелье: chtab_1, не env fore_id. * Пузырёк — динамика (pop_potion_draw). */ pop_potion_flask(row, col, pop_tile_mod(row, col)); diff --git a/applications/PoP/roomtest/pop_tile.h b/applications/PoP/roomtest/pop_tile.h index 7ba4b79..64fb517 100644 --- a/applications/PoP/roomtest/pop_tile.h +++ b/applications/PoP/roomtest/pop_tile.h @@ -79,7 +79,7 @@ extern const uint8_t POP_WALL_FRAM_MAIN[4]; /* основная грань extern const uint8_t POP_SPIKES_FRAM_LEFT[10]; /* кадр пик в своей ячейке */ extern const uint8_t POP_LOOSE_FRAM_LEFT[12]; /* верх дрожащей плиты */ extern const uint8_t POP_LOOSE_FRAM_BOTTOM[12]; /* низ дрожащей плиты */ -extern const uint8_t POP_CHOMP_FRAM_FOR[5]; /* чомпер: передний слой */ +extern const uint8_t POP_CHOMP_FRAM_FOR[5]; /* чомпер: перед (pop_fore!) */ /* Режим ЗАПЕЧКИ статического фона (запись идёт и в ОЗУ-копию акселератора, * из которой потом восстанавливает heal). В этом режиме дрожащие кадры