L2: переход между уровнями и игра уровня 2
Порт levels_plan.md §2 (шаг 1) — машинерия смены уровня целиком. - Номер уровня стал состоянием: pop_current_level (порт current_level), pop_next_level больше не флаг, а НОМЕР; главный цикл срабатывает по расхождению next != current (порт play_level_2, seg003:0386). - pop_level_load_num(n): LEVELS\res20NN.bin (fallback a:\), старая EMM-страница отпускается только после успешной загрузки новой. На диск кладутся все 15 уровней (34 КБ). - Потабличные различия (data.h:840..848) — таблицы по 16 в pop_level.c: tbl_entry_pose, tbl_guard_hp (HP стража ушло из хардкода 3), tbl_guard_type (−1 = стражей на уровне нет), tbl_level_type. - find_start_level_door (seg003:02E6): на уровне 2 стартовый тайл — правая половина двери уровня, без modif=43 + add_trob(...,3) Кид материализуется внутри глухой створки. Тип 3 = дверь захлопывается за спиной, как в оригинале. - HP через уровень: hitp_beg_lev (seg003) — рестарт уровня откатывает HP к нему, пройденный уровень подтягивает его к hitp_max. Заодно большая склянка add_life (тип зелья 2: +1 к потолку HP до 10) — на уровне 2 она есть, комната 20. - have_sword = level >= 2 (play_level, seg003:106). - Чит Shift+L — следующий уровень (seg000:698). Проверено в MAME: уровень 1 → Shift+L → уровень 2 (комната 5, новые для нас тайлы 8/9 «большая колонна» на месте, дверь захлопнута, HP 3) → влево в комнату 4 со стражем → Shift+L → уровень 3. Вход в стартовую дверь уровня 2 по Up не срабатывает — как и должно (start_room-гард). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -26,6 +26,36 @@
|
||||
int pop_level_load(const char *path);
|
||||
void pop_level_free(void);
|
||||
|
||||
/* ---- Номер уровня и потабличные различия (levels_plan.md §1) -------- */
|
||||
|
||||
/* Порт current_level (seg000 load_lev_spr: current_level = next_level =
|
||||
* level). Уровень 1..15; 0 — демо-уровень, в скоуп не входит. Читают
|
||||
* потабличные функции ниже, стражи (HP/тип) и стартовая логика. */
|
||||
extern uint8_t pop_current_level;
|
||||
|
||||
/* Загрузить уровень НОМЕРОМ: освободить страницу прошлого, взять
|
||||
* `LEVELS\res20NN.bin` (fallback `a:\res20NN.bin`) и выставить
|
||||
* pop_current_level. 0 — OK, -1 — файла нет / не влез (тогда
|
||||
* pop_current_level и страница НЕ тронуты — играем дальше на старом).
|
||||
* Порт связки load_lev_spr + load_level (seg000:1098/1169). */
|
||||
int pop_level_load_num(uint8_t n);
|
||||
|
||||
/* tbl_entry_pose (data.h:848): 1 — падение внутрь (ур. 1), 2 — вбегание
|
||||
* (ур. 13), 0 — разворот на месте. Индекс — номер уровня. */
|
||||
uint8_t pop_level_entry_pose(uint8_t n);
|
||||
|
||||
/* tbl_guard_hp (data.h:846) — база HP стража на уровне (get_guard_hp,
|
||||
* seg002:0044: extrastrength[skill] + tbl_guard_hp[level]). */
|
||||
uint8_t pop_level_guard_hp(uint8_t n);
|
||||
|
||||
/* tbl_guard_type (data.h:844): 0 обычный, 1 толстый, 2 скелет, 3 визирь,
|
||||
* 4 тень, −1 — стражей на уровне НЕТ (уровни 14/15). */
|
||||
int8_t pop_level_guard_type(uint8_t n);
|
||||
|
||||
/* tbl_level_type (data.h:840): 0 = dungeon, 1 = palace. Пока читается
|
||||
* только для контроля — второй тайлсет это levels_plan.md §3. */
|
||||
uint8_t pop_level_tileset(uint8_t n);
|
||||
|
||||
/* Извлечь комнату room (1..24) в массивы приложения (W2):
|
||||
* fg[30], bg[30] — тайлы комнаты (fg маскирован &0x1F, bg raw);
|
||||
* lcol_fg[6], lcol_bg[3] — [0..2] правый столбец (col9) комнаты СЛЕВА
|
||||
|
||||
Reference in New Issue
Block a user