Fore потолка поверх падающей плиты: в разборе пометок не было ряда -1
Найдено пользователем (2026-08-17, уровень 1 комната 6): падающая плита (-1,5) перекрывает собой кромку потолка (-1,6), чего физически быть не может. Дыра архитектурная: pop_fore_needed обходил только ряды 0..2, ряда -1 в переднем слое не было вовсе. Сверено с оригиналом. redraw_needed_tiles (seg008:1B06) обходит ряды 2,1,0, а ПОТОМ отдельным проходом ряд 2 комнаты сверху (redraw_needed_above), и его draw_tile_fore кладёт куски в FOREtable. Падающая плита идёт в MIDtable (draw_mobs). draw_tables рисует back -> mid -> fore (seg008:1373), поэтому у оригинала кромка потолка оказывается поверх плиты сама собой. Порт: - pop_fore_needed: проход по ряду -1 добавлен и идёт ПОСЛЕДНИМ, как в оригинале. Свой набор пометок (rdfa/rdfa_pending) — как и у самих перерисовок ряда -1 (rda_*), это отдельный проход, а не 11-я колонка; - новый лист pop_ceil_fore_tile_b (pop_bg.c) — тот же redraw_needed_above, что уже рисовался над персонажем (ceil_over_kid_tile), плюс окно клипа ровно на полосу столбца и ov_mark (полоса идёт банком без тени, на второй странице её восстановит pop_fore_heal); - mob_mark_neighbour помечает ряд -1, пока кусок достаёт до кромки. Кромка живёт в трёх верхних строках поля (dby = 2 при клипе по POP_YOFF), спрайт куска занимает mob_y-16 .. mob_y, отсюда условие mob_y <= 18 — три кадра после отрыва (y = 2, 5, 11 при ускорении 3). Помечаются ОБА столбца, которые кусок накрывает по x (mob_x .. mob_x+62 = col и col+1); именно поэтому страдал сосед. По бюджету работа появляется только в эти три кадра на кусок и попадает в циановую фазу, где сейчас запас (270 тыс. из 400 тыс.). Замер на ур.13 — следующим шагом. 8 наборов tests-host зелёные. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -23,6 +23,13 @@ static uint8_t rd_pending;
|
||||
* страницам дабл-буфера (запекают фон), а эти транзиентны. */
|
||||
static uint8_t rdf[NTILES];
|
||||
static uint8_t rdf_pending;
|
||||
/* Передний слой РЯДА −1 (полоса кладки у потолка). Отдельным набором, как и
|
||||
* сами перерисовки ряда −1 (rda_*): у оригинала это вообще другой проход —
|
||||
* redraw_needed_tiles сначала обходит ряды 2,1,0, а ПОТОМ ряд 2 комнаты сверху
|
||||
* (seg008:1B06), и его draw_tile_fore кладёт куски в foretable, то есть поверх
|
||||
* midtable, где лежат падающие плиты, и поверх объектов. */
|
||||
static uint8_t rdfa[NCOLS];
|
||||
static uint8_t rdfa_pending;
|
||||
|
||||
void pop_redraw_reset(void) __banked
|
||||
{
|
||||
@@ -31,8 +38,10 @@ void pop_redraw_reset(void) __banked
|
||||
for (i = 0; i < NCOLS; i++) { rda_kind[i] = 0; rda_cnt[i] = 0; }
|
||||
rd_pending = 0;
|
||||
for (i = 0; i < NTILES; i++) rdf[i] = 0;
|
||||
for (i = 0; i < NCOLS; i++) rdfa[i] = 0;
|
||||
pop_fore_pass_end();
|
||||
rdf_pending = 0;
|
||||
rdfa_pending = 0;
|
||||
}
|
||||
|
||||
void pop_set_redraw_fore(uint8_t tilepos) __banked
|
||||
@@ -42,19 +51,36 @@ void pop_set_redraw_fore(uint8_t tilepos) __banked
|
||||
rdf[tilepos] = 1;
|
||||
}
|
||||
|
||||
/* То же для полосы кладки У ПОТОЛКА (ряд −1). Ставит падающий кусок, когда
|
||||
* его спрайт достаёт до кромки потолка: иначе кусок накрывает эту кромку
|
||||
* собой, чего быть не может (найдено пользователем 2026-08-17, ур.1 к.6 —
|
||||
* плита (−1,5) перекрывала потолок (−1,6)). */
|
||||
void pop_set_redraw_fore_above(uint8_t col) __banked
|
||||
{
|
||||
if (col >= NCOLS) return;
|
||||
if (!rdfa[col]) rdfa_pending++;
|
||||
rdfa[col] = 1;
|
||||
}
|
||||
|
||||
/* Разбор пометок переднего слоя: тайлы обходятся в том же порядке, что и
|
||||
* фон, и рисуются ПОСЛЕ всех объектов кадра — как foretable у оригинала
|
||||
* (draw_tables, seg008:1373: back -> mid -> fore). */
|
||||
void pop_fore_needed(void) __banked
|
||||
{
|
||||
uint8_t i, row = 0, col = 0;
|
||||
if (!rdf_pending) return;
|
||||
if (!rdf_pending && !rdfa_pending) return;
|
||||
pop_fore_pass_begin();
|
||||
for (i = 0; i < NTILES; i++) {
|
||||
if (rdf[i]) { rdf[i] = 0; pop_fore_tile_b(row, col); }
|
||||
if (++col == 10) { col = 0; row++; }
|
||||
}
|
||||
rdf_pending = 0;
|
||||
/* Ряд −1 — ПОСЛЕДНИМ, как в redraw_needed_tiles (seg008:1B06). */
|
||||
if (rdfa_pending) {
|
||||
for (i = 0; i < NCOLS; i++)
|
||||
if (rdfa[i]) { rdfa[i] = 0; pop_ceil_fore_tile_b(i); }
|
||||
rdfa_pending = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void pop_set_redraw(uint8_t tilepos, uint8_t kind, uint8_t pages) __banked
|
||||
|
||||
Reference in New Issue
Block a user