L9-INVERT: состояние переворота, зелье типа 4 и pop_flip_screen
Шаг II.1 плана. pop_upside/pop_upside_dirty (порт upside_down и need_redraw_because_flipped), ветка case 4 в proc_get_object (только тоггл — ни вспышки, ни урона, как в оригинале), сброс стартом уровня и смертью Кида. pop_flip_screen (банк 8) переворачивает уже нарисованное двумя копиями акселератора: VFLIP в скрытую страницу, показ, DIRECT во вторую; затем инвалидация слотов персонажей, метки фона и полосы HP. Чит-клавиша U — порт seg000:0793 (в оригинале переворот тоже на чите): без неё эффект не проверить, чит-телепорт до зелья в комнате 7 не дотягивается. Проверено в MAME на уровне 9: комната переворачивается целиком за кадр, повторное нажатие возвращает. Персонажи и факелы пока не зеркалятся — это шаги II.3/II.4. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -167,6 +167,16 @@ static uint8_t grab_timer; /* после зацепа (12): блокиру
|
||||
* просто обратный отсчёт кадров (POP_FEATHER_FRAMES, pop_tune.h). Публичный:
|
||||
* его читают play_seq (опкод JMP_IF_FEATHER, pop_kid.c) и приложение. */
|
||||
uint8_t pop_feather;
|
||||
/* upside_down (seg000:15E9 toggle_upside): 1 — картинка перевёрнута вверх
|
||||
* ногами (зелье типа 4, уровень 9). Держим ЗДЕСЬ, рядом с пером: оба
|
||||
* ставятся из одной ветки proc_get_object и оба сбрасываются стартом
|
||||
* уровня. Читает отрисовка (банки 2/4/7) и главный цикл — отсюда
|
||||
* публичность. Смерть Кида снимает эффект (seg000:1224). */
|
||||
uint8_t pop_upside;
|
||||
/* need_redraw_because_flipped (seg000:15E9/1226): переворот ТОЛЬКО ЧТО
|
||||
* переключился, и уже нарисованное надо привести в новый вид. Разбирает
|
||||
* главный цикл (pop_flip_screen) и сам снимает флаг. */
|
||||
uint8_t pop_upside_dirty;
|
||||
/* Состояние edge-триггера бампа — массивы флагов перекрытия по колонкам
|
||||
* (порт prev_coll_flags/curr_row_coll_flags, seg004); объявлены ниже, рядом
|
||||
* с check_collisions. Сброс при смене комнаты — coll_prev_row. */
|
||||
@@ -1260,6 +1270,15 @@ void pop_proc_get_object(void) __banked
|
||||
pop_flash_color = POP_FLASH_GREEN;
|
||||
pop_flash_time = 3;
|
||||
break;
|
||||
case 4: /* ПЕРЕВОРОТ: картинка вверх ногами */
|
||||
/* toggle_upside (seg000:15E9): ВЕСЬ эффект — инверсия флага и
|
||||
* пометка «перерисовать, потому что перевернулись». Ни вспышки,
|
||||
* ни звука, ни урона у этой ветки нет (seg006:1885). Сам
|
||||
* переворот уже нарисованного делает приложение
|
||||
* (pop_flip_screen, roomtest_cold.c). */
|
||||
pop_upside = (uint8_t)!pop_upside;
|
||||
pop_upside_dirty = 1;
|
||||
break;
|
||||
case 5: /* «злое» зелье (синее): −1 HP */
|
||||
/* seg006:1892. Своей вспышки у этой ветки НЕТ (в отличие от
|
||||
* лечебных): красный кадр даёт общий механизм «Кид ранен»
|
||||
@@ -1272,8 +1291,8 @@ void pop_proc_get_object(void) __banked
|
||||
else
|
||||
hitp_delta = -1;
|
||||
break;
|
||||
default: /* 4 переворот / 6 открыть — TODO
|
||||
* вместе с их уровнями (9/13) */
|
||||
default: /* 6 «открыть все ворота» — TODO
|
||||
* вместе с его уровнем (13) */
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -2606,6 +2625,10 @@ static void kid_phys(void)
|
||||
check_spike_below(); /* seg006: над колонкой с пиками → выдвинуть пики */
|
||||
check_spiked(); /* seg006: напоролся на вредные пики → смерть */
|
||||
check_chomped_kid(); /* seg004: перемололо в сомкнутых челюстях → смерть */
|
||||
/* upside_down снимается смертью (seg000:1224: `if (upside_down &&
|
||||
* Char.alive >= 0)`). У нас признак смерти — pop_kid_dead, ставится
|
||||
* там же, где оригинал переводит alive в >= 0. */
|
||||
if (pop_kid_dead && pop_upside) { pop_upside = 0; pop_upside_dirty = 1; }
|
||||
if (pop_kid_dead) return; /* только что умер — без leave/knock в этот кадр */
|
||||
pop_check_knock(); /* seg003: сотрясение приземления → тряска loose в ряду */
|
||||
/* exit_room_timer (seg002 exit_room): 2 кадра ПОСЛЕ входа в комнату любой
|
||||
|
||||
Reference in New Issue
Block a user