From c218e8b9838d9049073a46e133071208cac43866 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Mon, 31 Aug 2026 20:34:19 +0300 Subject: [PATCH] =?UTF-8?q?SprPoP:=20=D0=B8=D0=BD=D0=B2=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B2=D1=81?= =?UTF-8?q?=D0=B5=D1=85=2043=20=D1=84=D0=B8=D0=BA=D1=81=D0=BE=D0=B2=20SDLP?= =?UTF-8?q?oP=20=D1=81=D0=BE=20=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=D0=B0?= =?UTF-8?q?=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Документ vanilla_vs_bugfixed.md дополнен полным перечнем опциональных исправлений оригинала, какие есть в SDLPoP, с их статусом у нас и местом в коде, где решение принято. Расклад: 4 взяты (дверь выхода, звуки ворот, перо только для Кида, приоритеты звуков), 4 сознательно оставлены ванильными (падение на стража, прыжок через стража, трюк 35, кровь скелета), 1 в работе (падение сквозь стену), 33 не реализованы — кандидаты в ENHANCED. ГЛАВНОЕ СЛЕДСТВИЕ: наш билд — это не VANILLA, а «ваниль плюс четыре исправления». При разделении режимов придётся пройтись по уже сделанным отступлениям и распределить их, иначе текущее поведение нельзя считать эталоном ни для одного режима. ИСПРАВЛЕНА МОЯ НЕВЕРНАЯ ОЦЕНКА. Ранее было записано, что фиксы, требующие правки байткода seqtbl, у нас недоступны без переделки конвейера данных. Это неверно: байткод можно менять и у нас. Лучший способ — держать ОБЕ версии в одной странице EMM: kid.ani занимает около 4 КБ при странице в 16 КБ, так что обе помещаются рядом, а переключение режима сводится к смене базового смещения — без патчей и с мгновенным откатом. У SDLPoP, к слову, рабочая таблица и неизменная копия оригинала тоже существуют раздельно. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_011MsUsEFAQfsjjQpJ7RtKVY --- .../SprPoP/docs/vanilla_vs_bugfixed.md | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/applications/SprPoP/docs/vanilla_vs_bugfixed.md b/applications/SprPoP/docs/vanilla_vs_bugfixed.md index f45b9cc..a1aee80 100644 --- a/applications/SprPoP/docs/vanilla_vs_bugfixed.md +++ b/applications/SprPoP/docs/vanilla_vs_bugfixed.md @@ -98,6 +98,171 @@ ENHANCED. для двух режимов нужен либо параметр сборки тестов, либо ожидания, зависящие от флага. +## Инвентаризация: что уже решено по каждому фиксу SDLPoP + +Составлено 2026-08-31 обходом кода. В движке эти решения УЖЕ приняты и +задокументированы прямо в комментариях — таблица лишь сводит их в одно +место, чтобы при разделении режимов не перечитывать исходники. + +| фикс SDLPoP | где у нас | что взято | +|---|---|---| +| `fix_feather_fall_affects_guards` | `pop_map.c:941` | **ФИКС** — перо действует только на Кида | +| `fix_exit_door` | `pop_map.c:1212` | **ФИКС** — ветка фикса вместо ванильного глобала | +| `FIX_GATE_SOUNDS` | `pop_trob.c:579` | **ФИКС** — условия через ИЛИ | +| `fix_sound_priorities` | `pop_sfx.c:196` | **ФИКС** — в SDLPoP включён безусловно, сравниваемся с исправленным | +| `FIX_STAND_ON_THIN_AIR` | `pop_map.c:1499` | **ВАНИЛЬ** — взяты 2 части из 3, третья ждёт патча `seqtbl` | +| `fix_painless_fall_on_guard` | `pop_map.c:1611` | **ВАНИЛЬ** — намеренно | +| `fix_jumping_over_guard` | `pop_map.c:1612` | **ВАНИЛЬ** — намеренно | +| `FIX_RETREAT_WITHOUT_LEAVING_ROOM` | `pop_map.c:3036` | **ВАНИЛЬ** — в SDLPoP выключен по умолчанию; трюк 35 сохраняем | +| `fix_skeleton_chomper_blood` | `pop_map.c:3177` | **ВАНИЛЬ** — кровь скелета в ванили есть | +| потеря HP скелетом при падении с двух этажей | `pop_map.c:676` | **ВАНИЛЬ** — баг оригинала, сохраняем сознательно | + +### Фиксы, которым нужна правка байткода + +`FIX_STAND_ON_THIN_AIR` не взят НЕ потому, что мы выбрали ваниль, а +потому что его нельзя применить наполовину: он состоит из трёх частей, и +третья — правка самого байткода `seqtbl` (смещения в последовательности +вставания). Взяв только первые две, мы получим вставание, уносящее +весовую точку в стену, то есть ХУЖЕ ванили. + +**Это выполнимо, и раньше здесь стояла неверная оценка** (уточнено +2026-08-31): байткод можно менять и у нас. Способов три: + +1. **Патч в рантайме** — после загрузки `kid.ani` в EMM-страницу + пропатчить нужные байты прямо там. Речь о единицах байт, страница уже + наша, и патч обратим — то есть режим переключается без пересборки + ресурсов. Это и делает фикс пригодным для VANILLA/ENHANCED. +2. **Патч в упаковщике** — готовить два варианта `kid.ani`. Привязывает + режим к файлам на диске, поэтому хуже: переключатель в меню перестаёт + быть чисто кодовым. +3. **Две копии в одной странице** — и это, пожалуй, лучший вариант + (решено 2026-08-31). `kid.ani` целиком около 4 КБ, а страница EMM — + 16 КБ, то есть обе версии байткода спокойно помещаются рядом в уже + выделенной странице. Переключение режима сводится к смене базового + смещения, патчить ничего не нужно, откат мгновенный. + +Для сравнения: у SDLPoP рабочая таблица и неизменная копия оригинала +существуют раздельно (`seqtbl` и `original_seqtbl`), причём вторая нужна +для сверки — то есть сама идея «оригинальный байткод отдельно, рабочий +отдельно» там уже заложена. + +Общее правило для BUGFIXED: фиксы, требующие правки `seqtbl`, доступны +через рантайм-патч страницы; закладывать это стоит сразу, чтобы не +упереться при первом же таком фиксе. + +### Вывод для разделения режимов + +Четыре фикса уже взяты, шесть позиций оставлены ванильными. Значит +нынешний билд — это не VANILLA, а «ваниль плюс четыре исправления». При +разделении: + +* взятые четыре надо либо оставить в обоих режимах (если считаем их + безусловными улучшениями), либо увести в ENHANCED и вернуть ванильное + поведение в VANILLA — второе честнее, но потребует обратной работы; +* ванильные шесть — кандидаты в ENHANCED; `FIX_STAND_ON_THIN_AIR` тоже, + но ему дополнительно нужен рантайм-патч байткода. + +## ВСЕ исправления SDLPoP и их статус у нас + +Полный перечень опциональных исправлений оригинала, какие есть в SDLPoP +(43 позиции), со статусом в нашем порте. Названия — идентификаторы +опций SDLPoP, описание — своими словами. + +Статусы: **ВЗЯТ** — портирован; **ВАНИЛЬ** — сознательно не берём, держим +поведение оригинала; **НЕТ** — не реализован, кандидат в ENHANCED; +**НЕДОСТУПЕН** — требует правки байткода `seqtbl` (см. ограничение выше); +**В РАБОТЕ** — решено делать сейчас. + +### Стены и препятствия + +| опция | что чинит | статус | +|---|---|---| +| `fix_glide_through_wall` | проход сквозь стену при падении после разворота в беге | **В РАБОТЕ** | +| `fix_jump_through_wall_above_gate` | прыжок в тайл над воротами | НЕТ | +| `fix_drop_through_tapestry` | проваливание сквозь гобелен | НЕТ | +| `fix_running_jump_through_tapestry` | прыжок с разбега сквозь гобелен | НЕТ | +| `fix_turn_running_near_wall` | разворот в беге вплотную к стене | НЕТ | +| `fix_wall_bump_triggers_tile_below` | удар о стену срабатывает на тайл ниже | НЕТ | +| `fix_bigpillar_climb` | подъём на большую колонну | НЕТ | +| `fix_land_against_gate_or_tapestry` | приземление вплотную к воротам или гобелену | НЕТ | +| `fix_caped_prince_sliding_through_gate` | проскальзывание сквозь ворота | НЕТ | + +### Падение, прыжки, зацепы + +| опция | что чинит | статус | +|---|---|---| +| `fix_stand_on_thin_air` | стояние на воздухе после отмены падения | НЕТ — нужен рантайм-патч `seqtbl` (см. выше) | +| `fix_jump_distance_at_edge` | дальность прыжка у самой кромки | НЕТ | +| `fix_edge_distance_check_when_climbing` | проверка расстояния до кромки при подъёме | НЕТ | +| `fix_grab_falling_speed` | зацеп на слишком большой скорости падения | НЕТ | +| `fix_drop_2_rooms_climbing_loose_tile` | провал через две комнаты при подъёме на шаткой плите | НЕТ | +| `fix_infinite_down_bug` | бесконечное падение вниз | НЕТ | +| `fix_falling_through_floor_during_sword_strike` | провал сквозь пол во время удара мечом | НЕТ | +| `fix_safe_landing_on_spikes` | безопасное приземление на невыдвинутые пики | НЕТ | +| `fix_dead_floating_in_air` | мёртвый зависает в воздухе | НЕТ | + +### Бой и стражи + +| опция | что чинит | статус | +|---|---|---| +| `fix_painless_fall_on_guard` | падение на стража с высоты без урона | **ВАНИЛЬ** | +| `fix_jumping_over_guard` | перепрыгивание через стража | **ВАНИЛЬ** | +| `fix_skeleton_chomper_blood` | кровь скелета в челюстях | **ВАНИЛЬ** | +| `fix_push_guard_into_wall` | вталкивание стража в стену | НЕТ | +| `fix_guard_following_through_closed_gates` | страж идёт сквозь закрытые ворота | НЕТ | +| `fix_doortop_disabling_guard` | верх двери отключает стража | НЕТ | +| `fix_offscreen_guards_disappearing` | стражи пропадают за краем экрана | НЕТ | +| `fix_unintended_sword_strike` | непреднамеренный удар мечом | НЕТ | +| `fix_two_coll_bug` | двойная проверка столкновения | НЕТ | +| `fix_move_after_sheathe` | движение сразу после убирания меча | НЕТ | + +### Ворота, двери, плиты + +| опция | что чинит | статус | +|---|---|---| +| `fix_exit_door` | дверь выхода с уровня | **ВЗЯТ** | +| `fix_gate_sounds` | звуки ворот | **ВЗЯТ** | +| `fix_gate_drawing_bug` | отрисовка ворот | НЕТ | +| `fix_press_through_closed_gates` | нажатие плиты сквозь закрытые ворота | НЕТ | +| `fix_chompers_not_starting` | челюсти не заводятся | НЕТ | +| `fix_loose_left_of_potion` | шаткая плита слева от зелья | НЕТ | +| `fix_hidden_floors_during_flashing` | скрытые полы во время вспышки | НЕТ | +| `fix_retreat_without_leaving_room` | отступление без смены комнаты (трюк 35) | **ВАНИЛЬ** | + +### Зелья, перо, спецэффекты + +| опция | что чинит | статус | +|---|---|---| +| `fix_feather_fall_affects_guards` | перо действует и на стражей | **ВЗЯТ** | +| `fix_feather_interrupted_by_leveldoor` | перо прерывается дверью уровня | НЕТ | +| `fix_move_after_drink` | движение сразу после питья | НЕТ | +| `fix_quicksave_during_feather` | быстрое сохранение под пером | НЕТ | +| `fix_hang_on_teleport` | зависание при телепорте | НЕТ (телепортов у нас нет) | + +### Интерфейс и ввод + +| опция | что чинит | статус | +|---|---|---| +| `fix_one_hp_stops_blinking` | индикатор перестаёт мигать на одном HP | НЕТ | +| `fix_register_quick_input` | учёт быстрого ввода | НЕТ | + +### Отдельно: приоритеты звуков + +`fix_sound_priorities` в SDLPoP включён БЕЗУСЛОВНО (не опция), и мы +сравниваемся с исправленным вариантом — `pop_sfx.c:196`. Статус: +**ВЗЯТ**, вернуть ванильное поведение отдельным режимом было бы +дополнительной работой. + +### Сводка + +| статус | сколько | +|---|---:| +| ВЗЯТ | 4 | +| ВАНИЛЬ (сознательно) | 4 | +| В РАБОТЕ | 1 | +| требует патча `seqtbl` (выполнимо) | 1 | +| НЕТ (кандидаты в ENHANCED) | 33 | + ## Список кандидатов на BUGFIXED Пополняется по мере аудита. Пока: