diff --git a/applications/PoP/roomtest/pop_map.c b/applications/PoP/roomtest/pop_map.c index ef46da3..819e92d 100644 --- a/applications/PoP/roomtest/pop_map.c +++ b/applications/PoP/roomtest/pop_map.c @@ -34,6 +34,8 @@ #define TILE_DEBRIS 14 /* щебень (упавший loose) */ #define TILE_SPIKE 2 /* пики */ #define TILE_CLOSER 6 /* кнопка-закрывалка (DROP) */ +#define TILE_POTION 10 /* зелье */ +#define TILE_SWORD 22 /* меч на полу */ #define TILE_OPENER 15 /* кнопка-открывалка (RAISE, 0x0F) */ #define ACT_STAND 0 #define ACT_RUNJUMP 1 @@ -575,10 +577,33 @@ int pop_edge_distance(void) if (d >= 0) return edge_classify(d); } t = get_tile_infrontof_char(); + /* Верх двери лицом ВПРАВО — кромка (в оригинале ПЕРВОЙ проверкой, до + * wall_type: у doortop wall_type != 0). */ + if (t == TILE_DOORTOP && Kid.direction >= 0) { + g_edge_type = EDGE_CLOSER; + return distance_to_edge_weight(); + } if (wall_type(t)) { d = dist_from_wall_forward(t, g_infrontx); if (d >= 0) return edge_classify(d); } + /* ПРОВАЛИВАЮЩИЙСЯ пол впереди — КРОМКА, хотя tile_is_floor считает его + * полом. Это и есть механизм «проверки ногой»: осторожный шаг доводит + * Kid ровно до границы плиты (distance -> 0), там safe_step играет + * seq_44 (testfoot) — Kid щупает плиту ногой, та трясётся (SEQ_KNOCK_DOWN), + * и он остаётся на месте; шаг НА плиту — только со второго нажатия + * (Kid.repeat). Без этой ветки плита читалась как обычный пол, и Kid + * заходил на неё первым же осторожным шагом и падал вместе с ней. */ + if (t == TILE_LOOSE) { + g_edge_type = EDGE_CLOSER; + return distance_to_edge_weight(); + } + /* Кнопка-закрывалка/меч/зелье: кромка, пока до границы есть зазор. */ + if (t == TILE_CLOSER || t == TILE_SWORD || t == TILE_POTION) { + d = distance_to_edge_weight(); + if (d) { g_edge_type = EDGE_CLOSER; return d; } + g_edge_type = EDGE_FLOOR; return 11; + } if (tile_is_floor(t)) { g_edge_type = EDGE_FLOOR; return 11; } g_edge_type = EDGE_CLOSER; /* яма впереди — до кромки уступа */ return distance_to_edge_weight();