L4-MIRROR шаг 4: прыжок сквозь зеркало и рождение тени
Порт seg003:0798..08A9 + seg004:0239 + seg002:081D/1131 + seg006:1945. - is_obstacle (pop_map.c): ветка зеркала — Кид, кадры бегового прыжка 39..43, направление ВЛЕВО -> modif = 0x56, pop_jumped_mirror = -1, препятствия нет (пролетает насквозь). - mirror_image / jump_through_mirror / pop_check_mirror (pop_map.c): отражённый Char уходит в слот Guard как CHARID_1_SHADOW, guardhp = hitp_max, у Кида hitp_curr = 1. savekid НЕ делается — как в оригинале, отражается только копия. Полосы HP перерисует pop_hp_draw сам. - pop_check_mirror() зовётся из главного цикла ПЕРЕД отрисовкой персонажей (в оригинале — первая строка draw_people, seg008:228A). - autocontrol_shadow + autocontrol_shadow_level4 + clear_char (guards.c): тень идёт СВОЕЙ веткой целиком, к стражьему ИИ не сводится — на уровне 4 она не дерётся, а бежит влево и при x < 80 исчезает. АТЛАС ТЕНИ — вскрылось при чтении seg006:0532. Тень вне боевых кадров 150..189 ходит по таблице КИДА, и image оттуда индексирует спрайты Кида, а не стража. Выбор атласа в pop_cdraw шёл по СЛОТУ, то есть тень рисовалась бы спрайтами стража. Условие вынесено в pop_frame_tbl_is_guard() (pop_kid.c) — его теперь читают и load_frame, и отрисовка, разъехаться не могут. Заодно из pop_load_fram_det_col выделен pop_load_frame() без determine_col: jump_through_mirror берёт ось отражения из curr_col, и пересчёт колонки по x там был бы вреден. Константы MIRROR_* и DIR_56_NONE переехали в pop_guard.h — нужны и постановке тайла (банк 6), и ИИ тени (банк 1). Звука sound_45_jump_through_mirror в порте нет, пропущен. Шаг 5 (клип тени слева от зеркала) НЕ сделан и оказался не однострочником: в pop_cdraw есть клип сверху/снизу/справа, левого нет вовсе — нужен новый примитив либо срез исходных колонок. Расписано в TASKS_OPEN. Цена: _CODE +18 Б, банк 1 2311 -> 2367, банк 3 10328 -> 10551, банк 4 8243 -> 8267. tests-host: все 5 наборов прошли. НЕ ПРОВЕРЕНО В MAME — сценарий проверки записан в TASKS_OPEN. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -750,24 +750,53 @@ loose-плиту (7, кол 4, ряд 0).
|
||||
`MIRROR_ENV_IDS = {75, 77}` в `pop_pack_bg.py`, 77 — ещё и в
|
||||
`FORE_ENV_IDS`. Оба набора переупакованы: fore 17 -> 18 спрайтов, все
|
||||
страницы EMM в пределах 16 КБ.
|
||||
2. **ПОСТАНОВКА ТАЙЛА — СДЕЛАНО 2026-08-10, НЕ ПРОВЕРЕНО В MAME.**
|
||||
2. **ПОСТАНОВКА ТАЙЛА — СДЕЛАНО И ПРОВЕРЕНО ПОЛЬЗОВАТЕЛЕМ 2026-08-10.**
|
||||
`place_mirror()` в `pop_trob.c`, вызывается из `animate_leveldoor` по
|
||||
переходу `pop_leveldoor_open` 0/2 -> 1 (условие оригинала — иначе тайл
|
||||
ставился бы заново каждый кадр открытой двери). Если комната зеркала уже
|
||||
на экране, ставится `POP_RD_FLOOR` на обе страницы.
|
||||
**Что проверить:** нажать плиту выхода на ур. 4, дойти до комнаты 4 —
|
||||
зеркало должно быть нарисовано. Отдельно посмотреть, не устарел ли
|
||||
`g_fg` коллизии, если игрок окажется в комнате 4 в момент постановки.
|
||||
Зеркало появляется, спрайты из атласа читаются. Остался незакрытый
|
||||
краевой вопрос: не устареет ли `g_fg` коллизии, если игрок окажется в
|
||||
комнате 4 ровно в момент постановки (в обычном прохождении дверь в другой
|
||||
комнате).
|
||||
3. **ОТРАЖЕНИЕ.** Самый дорогой шаг: это ЧЕТВЁРТЫЙ рисуемый Char помимо
|
||||
Кида и соперника, со своим клипом. Отрисовка у нас уже общая
|
||||
(`pop_cdraw.c`, слоты — memory `pop_char_draw_unified`), вопрос в числе
|
||||
слотов и в том, что отражение меняется вместе с Кидом каждый кадр, то
|
||||
есть `pop_char_skip_mask` на нём не сработает. ЧИСТО КОСМЕТИКА —
|
||||
делается последним.
|
||||
4. **ПРЫЖОК СКВОЗЬ + РОЖДЕНИЕ ТЕНИ.** Слот Guard уже умеет держать
|
||||
не-стража (скелет ур. 3), `charid_1_shadow` встаёт рядом.
|
||||
`autocontrol_shadow_level4` — десяток строк.
|
||||
5. **КЛИП ТЕНИ** (seg008:1699).
|
||||
4. **ПРЫЖОК СКВОЗЬ + РОЖДЕНИЕ ТЕНИ — СДЕЛАНО 2026-08-10, НЕ ПРОВЕРЕНО В MAME.**
|
||||
- `is_obstacle` (`pop_map.c`): ветка зеркала (seg004:0239) — Кид, кадры
|
||||
бегового прыжка 39..43, направление влево -> `modif = 0x56`,
|
||||
`pop_jumped_mirror = -1`, препятствия нет.
|
||||
- `mirror_image` / `jump_through_mirror` / `pop_check_mirror`
|
||||
(`pop_map.c`, порт seg003:0798..08A9). Отражённый Char уходит в слот
|
||||
Guard как `CHARID_1_SHADOW`; `guardhp = hitp_max`, у Кида `hitp_curr = 1`.
|
||||
`savekid` НЕ делается — как в оригинале.
|
||||
- `pop_check_mirror()` зовётся из главного цикла ПЕРЕД отрисовкой
|
||||
персонажей (в оригинале — первая строка `draw_people`).
|
||||
- `autocontrol_shadow` + `autocontrol_shadow_level4` + `clear_char`
|
||||
(`guards.c`, seg002:081D/1131/seg006:1945). Тень идёт СВОЕЙ веткой
|
||||
целиком: к стражьему ИИ она не сводится, на ур. 4 не дерётся вовсе.
|
||||
- **АТЛАС ТЕНИ.** Вскрылось при чтении seg006:0532: тень вне боевых
|
||||
кадров 150..189 ходит по таблице КИДА, и `image` оттуда индексирует
|
||||
спрайты Кида, а не стража. Выбор атласа в `pop_cdraw` шёл по СЛОТУ —
|
||||
тень рисовалась бы спрайтами стража. Условие вынесено в
|
||||
`pop_frame_tbl_is_guard()` (`pop_kid.c`), его теперь читают и
|
||||
`load_frame`, и отрисовка — разъехаться не могут.
|
||||
- Звука (`sound_45_jump_through_mirror`) в порте нет, пропущен.
|
||||
Цена: `_CODE` +18 Б, банк 1 2311 -> 2367, банк 3 10328 -> 10551,
|
||||
банк 4 8243 -> 8267.
|
||||
**Что проверить в MAME:** на ур. 4 открыть дверь выхода, дойти до
|
||||
комнаты 4, разбежаться СПРАВА НАЛЕВО и прыгнуть в зеркало — должна
|
||||
появиться тень (спрайтами Кида, зеркально) и убежать влево, растворившись
|
||||
при `x < 80`. У Кида после этого 1 HP, у тени полная полоса.
|
||||
5. **КЛИП ТЕНИ** (seg008:1699): `obj_clip_left = 137 + (mirror_column-4)*32`
|
||||
— тень видна только СПРАВА от зеркала. **Не сделано и не однострочник:**
|
||||
в `pop_cdraw` есть клип сверху, снизу и СПРАВА (`vis_w`), а левого нет
|
||||
вовсе — `gfx_blit_cols_part_w` умеет ограничить ширину, но не пропустить
|
||||
колонки слева. Нужен либо новый примитив, либо сдвиг `bx` со срезом
|
||||
исходных колонок. Пока без него тень будет вылезать левее зеркала.
|
||||
|
||||
Порядок: 1 -> 2 -> 4 -> 5 -> 3. После 4 и 5 уровень уже проходится, потому
|
||||
что сюжетно достаточно прыгнуть сквозь зеркало.
|
||||
|
||||
Reference in New Issue
Block a user