L3-CHOMP: передние зубья чомпера — блит pop_fore_b и ветка в draw_tile

Две ошибки в одном месте.  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-проход персонажа.
This commit is contained in:
2026-08-08 19:11:24 +03:00
parent dc0bd47368
commit 4d4323fc54
3 changed files with 19 additions and 3 deletions
+5 -2
View File
@@ -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));
+13
View File
@@ -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));
+1 -1
View File
@@ -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). В этом режиме дрожащие кадры