L2: падение с мечом, разбег-прыжок через 3 тайла, стартовое состояние ворот
BUG-FALL-SWORD-1 — start_fall (seg006:1044) был портирован не целиком: не хватало трёх веток выбора последовательности и уборки меча в ножны. Из-за seq_7 с set_fall(1,15) (дрейф 1 px/кадр) Кид с мечом уезжал примерно на тайл вбок; в оригинале это seq_81_fightfall — падение строго вниз. Сверено по логу SDLPoP: кадры 102..105 дают x = 155,157,159,160. BUG-RJUMP-1 — run_jump (seg005:0AA8) не выравнивал Кида по кромке пола перед толчком, а был заглушкой «полировка K3». Суммарный dx seq_4 — 62 px при тайле 14, то есть провал ровно в три тайла берётся ТОЛЬКО с кромки: без выравнивания Кид не перепрыгивал его никогда. Порт — pop_run_jump_align() в pop_map (беззнаковое сравнение оригинала = «сдвиг не попал в [-8,-1]»). На харнессе: было — толчок с x=165, кадр 44 в колонке 3 (провал); стало — 5 кадров добега, толчок с x=149, кадр 44 даёт x=87 col=1 row=1. Остальные 8 сценариев не изменились. BUG-GATEMOD-1 — load_alter_mod (seg008:198E) был портирован только для зелий, поэтому ворота с bg=1 («Open» по спецификации DAT, табл. 8) стартовали закрытыми. Добавлены ветки gate (1 -> 188) и loose. Ветка wall намеренно НЕ портируется: связи стен наш pop_bg считает по типам соседей в момент отрисовки. На уровнях 1-3 таких ворот всего двое (ур. 1 комн. 5 (0,9); ур. 2 комн. 13 (1,5)) — у остальных bg=2, а 2 и 0 ведут себя одинаково. Убран временный трассировщик pop_dbg_trace/pop_dbg_draw; pop_dbg_trap() оставлен как многоразовый инструмент. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -21,6 +21,7 @@
|
||||
#define TILE_DEBRIS 0x0E /* button_type для «насовсем открыть» (died_on_button) */
|
||||
#define TILE_OPENER 0x0F
|
||||
#define TILE_POTION 0x0A
|
||||
#define TILE_LOOSE 0x0B /* проваливающийся пол (фаза тряски в modif) */
|
||||
#define TILE_SWORD 0x16 /* меч-предмет на полу */
|
||||
#define TILE_LEVELDOOR 0x10 /* левая половина двери уровня (на ней modif) */
|
||||
#define TILE_TORCH 0x13
|
||||
@@ -67,12 +68,31 @@ uint8_t *pop_trob_modif(uint8_t room)
|
||||
if (!room_seen[room - 1]) {
|
||||
uint8_t i;
|
||||
pop_level_room_bg(room, room_modif[room - 1]);
|
||||
/* seg009 load_level: у ЗЕЛЬЯ модификатор сдвигается влево на 3 —
|
||||
* старшие биты = тип зелья, младшие 3 = фаза пузырька. */
|
||||
/* load_alter_mod (seg008:198E): модификатор В ФАЙЛЕ уровня и
|
||||
* модификатор В РАНТАЙМЕ — разные величины, оригинал переводит их
|
||||
* при загрузке. Порт того, что нас касается:
|
||||
*
|
||||
* ворота 1 = «открыты» (Table 8 спецификации DAT) -> 188, то есть
|
||||
* рабочая высота подъёма; ЛЮБОЕ другое значение -> 0
|
||||
* (закрыты). Без этого перевода ворота, которые в
|
||||
* уровне открыты, стартуют закрытыми, и кнопка-closer
|
||||
* рядом с ними теряет смысл (ур. 2, комн. 13).
|
||||
* loose -> 0: фаза тряски всегда начинается с нуля.
|
||||
* зелье -> <<3: старшие биты = тип, младшие 3 = фаза пузырька.
|
||||
*
|
||||
* Ветка стен (blue-line/связи кладки) НЕ портируется намеренно: у
|
||||
* нас pop_bg считает связи по типам СОСЕДЕЙ прямо при отрисовке
|
||||
* (wall_modifier), сохранённый модификатор стены не читается вовсе. */
|
||||
pop_level_access_begin();
|
||||
for (i = 0; i < POP_ROOMTILES; i++)
|
||||
if ((pop_level_tile_raw(room, i) & 0x1F) == TILE_POTION)
|
||||
room_modif[room - 1][i] = (uint8_t)(room_modif[room - 1][i] << 3);
|
||||
for (i = 0; i < POP_ROOMTILES; i++) {
|
||||
uint8_t *m = &room_modif[room - 1][i];
|
||||
switch (pop_level_tile_raw(room, i) & 0x1F) {
|
||||
case TILE_GATE: *m = (uint8_t)((*m == 1) ? 188 : 0); break;
|
||||
case TILE_LOOSE: *m = 0; break;
|
||||
case TILE_POTION: *m = (uint8_t)(*m << 3); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
pop_level_access_end();
|
||||
room_seen[room - 1] = 1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user