Падающие плиты: передний слой по пометкам, честные спрайты, замер кадра
Слой fore переведён на пометки ОБЪЕКТОВ вместо окна вокруг персонажа — порт set_redraw_fore/redraw_frames_fore (seg007:0550, seg008:214): pop_set_redraw_fore + pop_fore_needed + pop_fore_tile_b, пометки ставит падающий кусок вокруг себя (draw_mob, seg007:1147). Ключевая правка: пометки соседа считаются в ПРОХОДЕ ОТРИСОВКИ, а не в тике. Стояли в цикле тика — то есть по позиции ДО mob_tick_one, а кусок рисовался уже по новой; пока он летит внутри ряда, тайлы совпадают, но в кадр пересечения границы пометка указывала на прежний тайл и колонна кусок не перекрывала. Ровно один кадр, как и наблюдалось. Спрайты падающего куска: obj_id = 10 (add_mob_to_objtable, seg007:1170), части берутся по этому индексу — 70/74/72, а не 41/43/42 (плита В ПОКОЕ). Отсюда была «цельная ровная плита» вместо двух половин со сдвигом. Убрана подпорка «перерисовать соседний тайл поверх куска»: тащила на плиту чужой узор и окно и стоила по полной отрисовке тайла на кусок за кадр. Коридор heal сужен по высоте 32 -> 24 (реальный след спрайта 16 px). gfx_set_bank вынесен из потайлового цикла в обрамление прохода. Выяснено и зафиксировано: clip.right = 40 в add_mob_to_objtable — МЁРТВЫЕ данные. set_clip_rect вызывается под chtab_flip_clip[chtab_id], а для окружения флаг равен нулю — оригинал падающие куски не клипует вовсе. Портировать нечего; две попытки это сделать были ошибочны. Замер кадра (маркеры m1..m4, оставлены временно для проверки правок): покой 196 614 тактов (15,2 % кадра при периоде 1 290 000), во время падения гряды среднее 222 667, пик 1 428 990 — то есть 111 % кадра, шесть кадров подряд за пределом. Логика неизменна (88 020), растут фон (до 887 376) и спрайты (до 660 792). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -18,6 +18,10 @@ static uint8_t rda_kind[NCOLS], rda_cnt[NCOLS];
|
||||
/* Сколько всего непустых пометок: без него проход по 40 ячейкам крутился бы
|
||||
* КАЖДЫЙ кадр впустую (замер 2026-07-27 на прежнем rest-цикле: ~12 % кадра). */
|
||||
static uint8_t rd_pending;
|
||||
/* Пометки ПЕРЕДНЕГО слоя — однокадровые, отдельно от rd_*: те живут по
|
||||
* страницам дабл-буфера (запекают фон), а эти транзиентны. */
|
||||
static uint8_t rdf[NTILES];
|
||||
static uint8_t rdf_pending;
|
||||
|
||||
void pop_redraw_reset(void) __banked
|
||||
{
|
||||
@@ -25,6 +29,31 @@ void pop_redraw_reset(void) __banked
|
||||
for (i = 0; i < NTILES; i++) { rd_kind[i] = 0; rd_cnt[i] = 0; }
|
||||
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;
|
||||
pop_fore_pass_end();
|
||||
rdf_pending = 0;
|
||||
}
|
||||
|
||||
void pop_set_redraw_fore(uint8_t tilepos) __banked
|
||||
{
|
||||
if (tilepos >= NTILES) return;
|
||||
if (!rdf[tilepos]) rdf_pending++;
|
||||
rdf[tilepos] = 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;
|
||||
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;
|
||||
}
|
||||
|
||||
void pop_set_redraw(uint8_t tilepos, uint8_t kind, uint8_t pages) __banked
|
||||
|
||||
Reference in New Issue
Block a user