roomtest: обломки упавшего loose в комнате снизу (debris)

Loose-пол room1(2,6) при падении даёт кусок, который в оригинале улетает в
комнату снизу (links.down) и приземляется на первый floor, превращая его в
debris (порт move_loose/loose_land seg007).  Для room1(2,6): room2(0,6)=empty
пролёт → room2(1,6)=floor приземление → debris.

Минимальная реализация (без анимации полёта куска, только персистентный
результат — мини-версия P0 из docs/gates_spikes_plan.md):
- pop_map: сигнал pop_loose_fell (tilepos+1 упавшего loose).
- pop_level: pop_room_col_landing(room,col) — ряд первого floor сверху вниз
  (пустые ряды пролетаются), иначе -1.
- roomtest: при pop_loose_fell вычисляет debris-приземление в комнате снизу →
  персистентный override (dbr_room/dbr_pos, живёт между переходами) →
  enter_room применяет поверх загруженных тайлов (floor→debris 0x0E).

Проверено в MAME: провал loose room1(2,6) → debris в room2(1,6), сохраняется
при повторных входах.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-20 21:26:21 +03:00
parent bf7ddfd4da
commit d1bc97c589
5 changed files with 58 additions and 1 deletions
+17
View File
@@ -137,6 +137,23 @@ int pop_room_load(uint8_t room, uint8_t *fg, uint8_t *bg,
return 0;
}
int8_t pop_room_col_landing(uint8_t room, uint8_t col)
{
const uint8_t *rf;
int8_t row, res = -1;
if (!lvl_ok || room < 1 || room > 24 || col > 9) return -1;
gfx_w0_map(lvl_page);
rf = room_fg_ptr(room);
for (row = 0; row < 3; row++) { /* кусок пролетает пустые ряды */
uint8_t t = (uint8_t)(rf[row * 10 + col] & 0x1F);
if (t == 0) continue; /* empty — дальше вниз */
if (t == 1) res = row; /* floor — приземление → debris */
break; /* первый не-пустой тайл — стоп */
}
gfx_w0_unmap();
return res;
}
uint8_t pop_room_link(uint8_t room, uint8_t side)
{
uint8_t v;