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:
@@ -436,6 +436,35 @@ static void autocontrol_guard_active(void)
|
||||
autocontrol_guard_kid_far();
|
||||
}
|
||||
|
||||
/* clear_char (seg006:1945): персонажа со сцены — направление «никуда»,
|
||||
* не жив, действие 0, HP обнулены. Полосу перерисует pop_hp_draw сам. */
|
||||
static void clear_char(void)
|
||||
{
|
||||
Char.direction = DIR_56_NONE;
|
||||
Char.alive = 0;
|
||||
Char.action = 0;
|
||||
guardhp_curr = 0;
|
||||
}
|
||||
|
||||
/* autocontrol_shadow_level4 (seg002:1131). Вся «логика» тени на уровне 4:
|
||||
* в комнате зеркала она бежит вперёд (то есть ВЛЕВО — её направление
|
||||
* зеркально Киду) и при x < 80 исчезает. Ни боя, ни преследования: она
|
||||
* просто убегает за левый край и растворяется. */
|
||||
static void autocontrol_shadow_level4(void)
|
||||
{
|
||||
if (Char.room != MIRROR_ROOM) return;
|
||||
if (Char.x < 80) clear_char();
|
||||
else move_1_forward();
|
||||
}
|
||||
|
||||
/* autocontrol_shadow (seg002:081D) — по уровням. У нас пока только ур. 4;
|
||||
* ветки 5 (крадёт зелье), 6 (шагает по плите) и 12 появятся со своими
|
||||
* уровнями. */
|
||||
static void autocontrol_shadow(void)
|
||||
{
|
||||
if (pop_current_level == MIRROR_LEVEL) autocontrol_shadow_level4();
|
||||
}
|
||||
|
||||
/* autocontrol_guard (seg002:701) + autocontrol_opponent (seg002:628). */
|
||||
static void autocontrol_opponent(void)
|
||||
{
|
||||
@@ -447,6 +476,9 @@ static void autocontrol_opponent(void)
|
||||
/* autocontrol_skeleton (seg002:685): у скелета меч вынут ВСЕГДА — он не
|
||||
* бывает «неактивным», поэтому ветка inactive ему недоступна. */
|
||||
if (Char.charid == CHARID_4_SKELETON) Char.sword = SWORD_2_DRAWN;
|
||||
/* ТЕНЬ идёт своей веткой ЦЕЛИКОМ (seg002:0647): к стражьему ИИ она не
|
||||
* сводится — на уровне 4 не дерётся вовсе. */
|
||||
if (Char.charid == CHARID_1_SHADOW) { autocontrol_shadow(); return; }
|
||||
if (Char.sword < SWORD_2_DRAWN) autocontrol_guard_inactive();
|
||||
else autocontrol_guard_active();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user