d438a1d3da
Меч в оригинале ОДИН на всех: и Кид, и страж рисуют клинок из chtab_0 (add_sword_to_objtable, seg006:1798). Раньше sword.atl содержал только кадры подъёма/ножен (sword_tbl 35..42), поэтому у стража меча не было видно вовсе. - pop_pack_kid.py пакует chtab_0 целиком (id 0..33, 5168 Б), индекс в атласе = id; - pop_extract_kid_data.py вытаскивает sword_tbl (53 строки) в kid_data.h макро-инициализаторами — таблица ложится в один TU, а не в каждый; - pop_sword_draw (pop_kid.c) — общая точка отрисовки клинка с полным условием оригинала (кадры 229..237 ИЛИ меч обнажён ИЛИ живой страж); зовут и kid_draw, и pop_guard_draw. Раздельный heal накладных спрайтов. Клинок и брызги урона раньше объединялись в один прямоугольник с персонажем, а объединение почти вдвое больше суммы двух (клинок уходит вперёд-вверх) — heal же стоит ровно по площади. Теперь у накладных свой прямоугольник и свой gfx_heal, а объединение осталось ТОЛЬКО для окна fore-клипа: там это 4 сравнения без рисования, но покрыть клинок обязано, иначе он полезет поверх столба. Отладка: DEBUG_SWORD_ROOM — Киду выдаётся меч при входе в комнату 3 (там страж), чтобы не бегать за ним в комнату 15. Бюджет (225 кадров, комната 3): 415 284 – 416 370 = 0.966–0.968 кадра. Против 384 168 – 384 636 до этого шага, то есть +31 700. Разложение по фазам (медианы): process_trobs 83 190, pop_guard_draw 92 483 (спрайт 28 763 + клинок 23 820 + fore_over_char 39 906), kid_draw 59 089, fore поверх Кида + борта 47 483, heal 40 068, логика 76 338, ввод 13 050. Видно, что клинок 21x8 стоит почти как спрайт стража — это фиксированные накладные расходы клипающего блита, а не пиксели; лечится noclip-путём для column-major (см. gfx_blit_noclip_fast). Отдельным шагом. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
42 lines
943 B
C
42 lines
943 B
C
/* kid_atlas.h — раскладка атласов Kid. Сгенерировано pop_pack_kid.py. */
|
|
#ifndef KID_ATLAS_H
|
|
#define KID_ATLAS_H
|
|
#define KID_SHIFT 3
|
|
#define KID_MASK 7
|
|
#define KID_PAGES 28
|
|
#define KID_PAL 0x70
|
|
static const char *const kid_atl[KID_PAGES] = {
|
|
"kid0.atl",
|
|
"kid1.atl",
|
|
"kid2.atl",
|
|
"kid3.atl",
|
|
"kid4.atl",
|
|
"kid5.atl",
|
|
"kid6.atl",
|
|
"kid7.atl",
|
|
"kid8.atl",
|
|
"kid9.atl",
|
|
"kid10.atl",
|
|
"kid11.atl",
|
|
"kid12.atl",
|
|
"kid13.atl",
|
|
"kid14.atl",
|
|
"kid15.atl",
|
|
"kid16.atl",
|
|
"kid17.atl",
|
|
"kid18.atl",
|
|
"kid19.atl",
|
|
"kid20.atl",
|
|
"kid21.atl",
|
|
"kid22.atl",
|
|
"kid23.atl",
|
|
"kid24.atl",
|
|
"kid25.atl",
|
|
"kid26.atl",
|
|
"kid27.atl",
|
|
};
|
|
#define KID_PAL_FILE "kid.pal"
|
|
#define KID_SWORD_ATL "sword.atl" /* chtab_0: меч в руке */
|
|
#define KID_SWORD_ID0 0 /* индекс в атласе = sword_tbl.id - ID0 */
|
|
#endif
|