0cd6b2d737
L3-CHKP (чекпойнт уровня 3). Флаг взводится, когда Кид уходит ВЛЕВО ИЗ комнаты 7, а do_startpos по нему подменяет старт на комнату 2, тайл (0,6), лицом влево и снимает loose-плиту (7,0,4). Тонкость, на которой я сначала ошибся: level3_set_chkp (seg002:0665) вызван из leave_room ДО goto_other_room, поэтому `Char.room == 7` — это комната, ИЗ которой уходят, а не в которую входят. Поймал пользователь прогоном в SDLPoP: смерть В комнате 7 вернула его в стартовую 9, а плита осталась цела. Проверено в MAME: вход в 7 флаг не ставит, уход влево — ставит; респавн в комнате 2; после обычной смерти (без чекпойнта) плиты восстанавливаются как раньше. Зацеп ПРЯМО В ПРЫЖКЕ (check_grab_run_jump, seg006:1228) — портирован за выключателем POP_ENABLE_JUMP_GRAB. Это НЕ ваниль: в оригинале зацепиться можно только в начале падения (кадры 102..105), то есть Shift приходится жать уже в полёте; у SDLPoP это enable_jump_grab, и работает он лишь при включённых fixes-and-enhancements. Три точки вызова как у оригинала: check_action и обе ветки check_bumped (зацеп за верх стены вместо удара). pop_tune.h — настраиваемые константы в одном месте (аналог custom_options_type SDLPoP): чекпойнт, выключатель зацепа и отладочная крутилка POP_DBG_GATE_HOLD (сколько кадров решётка держится поднятой; оригинал 5, потолок 30 — таймер связи пятибитный, 31 = «заклинено»). Задача TUNE-1 в TASKS.md: читать это из ini рядом с exe. СБОРКА. --max-allocs-per-node снижен со 100000 (дефолт sprinter-cc) до 3000 (дефолт SDCC) через `make ALLOCS=...`, а pop_trob.c уехал в БАНК 6 — на 3000 резидент иначе не влезает (замер: конец _HOME 0xBC69 при стеке с 0xBB00). Итог: сборка с нуля 1:48 вместо >10 минут, куча 2751 Б вместо 2298. Релизная сборка — make ALLOCS=100000; сравнивать занятость банков можно только при одинаковом ALLOCS. Отдельно (вне git, SDLPoP в .gitignore): из референса вычищена вся наша отладка DBG-GRAB — трасса JMP, GRAB try/probe/fail/OK/skip, автоскриншоты seg003, печати DBG mob/mid/overlay/kidobj и счётчик dbg_shots. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
66 lines
4.1 KiB
C
66 lines
4.1 KiB
C
/*
|
||
* pop_trob.h — P0-каркас: персистентное per-room modifier-состояние +
|
||
* список анимируемых тайлов (trob). Порт SDLPoP seg007 (process_trobs/
|
||
* add_trob/animate_tile) + curr_room_modif.
|
||
*
|
||
* ЗАЧЕМ: тайлы-объекты (пики, ворота, кнопки) имеют состояние (modifier),
|
||
* которое живёт МЕЖДУ входами в комнату и может меняться КРОСС-КОМНАТНО
|
||
* (кнопка в одной комнате открывает ворота в другой). room_modif[room]
|
||
* — единственный источник модификаторов для отрисовки (pop_bg draw_tile
|
||
* читает его как bg), как curr_room_modif в оригинале.
|
||
*
|
||
* Список trob хранит (room, tilepos, type) активных анимаций; каждый кадр
|
||
* pop_process_trobs продвигает их (animate_spike/door/button по коду тайла),
|
||
* пишет результат в room_modif и перерисовывает изменившиеся тайлы ТЕКУЩЕЙ
|
||
* комнаты на back-странице (2-page, как loose). Невидимые комнаты
|
||
* анимируются в состоянии (без отрисовки) — при входе рисуются статически.
|
||
*/
|
||
#ifndef POP_TROB_H
|
||
#define POP_TROB_H
|
||
|
||
#include <stdint.h>
|
||
|
||
#define POP_NROOMS 24
|
||
#define POP_ROOMTILES 30
|
||
|
||
/* Сброс всего состояния (новый уровень / рестарт): забыть все комнаты и
|
||
* очистить список trob. */
|
||
void pop_trob_reset(void) __banked;
|
||
|
||
/* Указатель на persistent modifier-массив комнаты room (1..24), 30 байт.
|
||
* При ПЕРВОМ обращении лениво инициализируется из backtable уровня
|
||
* (pop_level_room_bg). Далее ЖИВЁТ (не перезагружается). room вне
|
||
* диапазона → 0. */
|
||
uint8_t *pop_trob_modif(uint8_t room) __banked;
|
||
|
||
/* Добавить/обновить trob (room, tilepos, type). Если уже есть — сменить
|
||
* type (как SDLPoP add_trob/find_trob). type<0 = будет удалён. */
|
||
void pop_add_trob(uint8_t room, uint8_t tilepos, int8_t type) __banked;
|
||
|
||
/* Продвинуть все trob на кадр (animate_* по коду тайла из уровня), записать
|
||
* modif, перерисовать тайлы ТЕКУЩЕЙ (cur_room) комнаты на back-странице.
|
||
* Звать в основном цикле ПОСЛЕ set_draw_page(back), рядом с loose. */
|
||
void pop_process_trobs(uint8_t cur_room) __banked;
|
||
|
||
/* Кид встал на кнопку (opener/closer): взвести таймер связи + обойти цепочку
|
||
* LINKLOC, добавив trob целям (ворота). Порт seg007 trigger_button.
|
||
* room/tilepos — кнопка; button_type — её тайл-код; modifier — её modif
|
||
* (= индекс в LINKLOC). Звать из check_press (pop_map). */
|
||
void pop_trigger_button(uint8_t room, uint8_t tilepos,
|
||
uint8_t button_type, uint8_t modifier) __banked;
|
||
|
||
/* Есть ли активные trob в комнате room? Для перерисовки ворот соседа через
|
||
* шов (roomtest не дёргает шов, пока сосед не анимируется). */
|
||
uint8_t pop_trob_room_active(uint8_t room) __banked;
|
||
|
||
/* Смена комнаты: сбросить отложенные перерисовки «покоя» текущей комнаты
|
||
* (trob-состояние в room_modif персистентно и НЕ трогается). Звать в
|
||
* enter_room. */
|
||
void pop_trob_room_changed(void) __banked;
|
||
|
||
/* anim_tile_modif (seg000:0B12): завести анимации тайлов комнаты (факелы,
|
||
* зелья) со случайной стартовой фазой. Звать в enter_room. */
|
||
void pop_trob_anim_room(uint8_t room) __banked;
|
||
|
||
#endif
|