3983fa4513
Боёвка (порт seg002/seg006): - check_sword_hurting / check_hurting / check_sword_hurt / hurt_by_sword / take_hp через дельты; do_delta_hp сводит их раз в кадр; - парирование (justblocked), refractimer после ранения стража; - смерть по seq_71_dying — через неё же теперь работает чит K: страж действительно погибает, а не замирает на месте; - парные окна Char/Opp: loadkid_and_opp / savekid_and_opp / saveshad_and_opp. Индикаторы HP (порт draw_kid_hp / draw_guard_hp): Кид слева, страж справа. Перерисовка ТОЛЬКО при изменении числа и тогда на ОБЕИХ страницах дабл-буфера (счётчик hp_todo, иначе на второй странице осталось бы старое значение и мерцало через кадр); pop_hp_invalidate при входе в комнату, где фон перерисован целиком. Чит I — бессмертие Кида (нашего изобретения, в оригинале его нет). Перекрывает и путь «безоружного закалывают насмерть»: тот идёт мимо HP, и без этого чит бесполезен ровно там, где нужен. ДВА НАЙДЕННЫХ БАГА: 1. Полосу HP блитил row-major примитивом, а атласы Кида и стража хранятся COLUMN-major (ради бесплатного флипа) — марки выходили транспонированными. Теперь колоночный блит, стрелки как в оригинале. 2. Кэш кадра для ОТРИСОВКИ заполняли pop_savekid/pop_saveshad. Любое окно Char БЕЗ play_seq — а это оба окна боёвки — записывало Киду кадр, который принадлежал СТРАЖУ, и kid_draw искал этот image в атласе Кида, рисуя произвольную позу. Владельцем кэша стал load_frame: он один знает, чей кадр загружен (по Char.charid). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
20 lines
1.3 KiB
C
20 lines
1.3 KiB
C
/*
|
||
* pop_state.c — данные, которые читают ОБЕ стороны банковой границы.
|
||
*
|
||
* Зачем отдельный модуль: sprinter-cc собирает банковый модуль с
|
||
* --dataseg BANKn, поэтому ВСЯ его писучая память (глобалы, file-static,
|
||
* статики внутри функций) линкуется В СТРАНИЦУ БАНКА и снаружи не читается
|
||
* — проверено на .map (2026-07-30: глобал банкового модуля лёг по
|
||
* 0x0001C000, а не в _DATA). Значит любую переменную, к которой нужен
|
||
* доступ и из банка, и снаружи, надо держать в НЕбанковом модуле — здесь.
|
||
*
|
||
* Модуль обязан оставаться в W1/W2: его читают и главный цикл, и банки.
|
||
*/
|
||
#include "pop_state.h"
|
||
|
||
uint8_t pop_loose_landed;
|
||
|
||
/* Чит «бессмертие» (клавиша I). Отладочный: Кид получает анимацию удара,
|
||
* но HP не теряет — иначе проверять боёвку приходится с трёх попаданий. */
|
||
uint8_t pop_immortal;
|