SprPoP: инвентаризация всех 43 фиксов SDLPoP со статусами
Документ 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 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011MsUsEFAQfsjjQpJ7RtKVY
This commit is contained in:
@@ -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
|
||||
|
||||
Пополняется по мере аудита. Пока:
|
||||
|
||||
Reference in New Issue
Block a user