Far Cry 2

Far Cry 2

58 ratings
Исправление ошибки с пленками Шакала (Баг с №09 «Ботинки»)
By FoxAhead
Исправление ошибки, из-за которой все пленки Шакала со второй южной карты (Бова-Секо) будут проигрывать одну и ту же запись №09 - "Ботинки"
2
   
Award
Favorite
Favorited
Unfavorite
Безумие
Вы знаете, что такое безумие? Безумие – это когда раз за разом, снова и снова повторяешь одно и то же, в надежде, что что-то изменится. Безумие – это когда подбираешь очередную пленку Шакала в надежде услышать что-то дальше, чем про Ботинки. Нет-нет-нет-нет-нет, пожалуйста! В этот раз точно будет новая запись!

Безумие – это когда баг не исправляется в течение 10 лет.

In English:
https://test-steamproxy.haloskins.io/sharedfiles/filedetails/?id=1563578739
Симптомы
Начиная с обновления v1.03 появилась ошибка не позволяющая прослушать и получить в список пленки на второй южной карте (Бова-Секо) дальше, чем №09 «Ботинки». Первая поднятая пленка на этой карте отмечается как №09 «Ботинки», а все последующие на этой же карте просто будут повторять ее, заставляя раз за разом слушать, как Шакал рассказывает печальную историю про мальчика, ворующего ботинки с убитого бойца.
Причины болезни
Во время игры в памяти хранится список из 17 пленок, в котором помимо прочего отмечается следующая информация:


Рисунок 1. Иллюстрация списка пленок в памяти. Поле IsTaken заполнено для примера. Поле FromMap1 всегда заполнено так.
На картинке выше – 17 пленок. Номер 00 – пленка, дающаяся Рубеном Олувагемби в начале игры, остальные разбросаны по миру. В условное поле IsTaken заносится «1», отмечая ее как поднятую. Условное поле FromMap1 предварительно заполняется при загрузке игры (сохранения), отмечая «1» пленки с первой северной карты (Лебоа-Сако).

При поднятии очередного диктофона в движке игры срабатывает подпрограмма NewJackalTapeFound. В ней поочередно по вышеуказанному списку пленки проверяются на предмет: отмечена ли она как поднятая, и к какой карте она относится. Наконец, в зависимости от того, на какой карте вы сейчас находитесь, принимается решение: проиграть пленку и отметить ее как поднятую или искать дальше по списку.

Все просто. Посмотрите на эту правильно работающую схему из версий игры с 1.00 по 1.02:


Рисунок 2. Корректная логика подпрограммы NewJackalTapeFound. Зеленое – ДА. Красное – НЕТ.
Обратите внимание, что если проверка Tape Taken показывает, что эта пленка в списке отмечена как поднятая, то сразу происходит переход по зеленой стрелочке к следующей в списке (Next). Согласно этой логике пленки с 00 по 08 будут проиграны (и отмечены) только если вы подобрали диктофон на первой карте, а пленки с 09 по 16 – только если на второй.

После обновления 1.03 логика подпрограммы немного изменилась:


Рисунок 3. Некорректная логика подпрограммы NewJackalTapeFound после обновления 1.03
Сразу обратите внимание, куда идет зеленая стрелочка от проверки Tape Taken. Предположим, что мы перешли во второй акт, находимся на второй карте и ситуация с пленками у нас как в таблице выше: на первой карте нашли три, а на второй нашли одну. В следующий раз, когда на второй карте мы поднимем диктофон, первые три пленки (00-02) пройдут по пути:
Tape Taken --> ДА --> 1st Map --> НЕТ --> Tape from 2nd Map --> НЕТ --> Next
Пленки 03-08 пройдут по пути:
Tape Taken --> НЕТ --> 1st Map --> НЕТ --> Tape from 2nd Map --> НЕТ --> Next
А вот пленка 09, несмотря на то, что она уже отмечена как поднятая, пойдет по пути:
Tape Taken --> ДА --> 1st Map --> НЕТ --> Tape from 2nd Map --> ДА --> PLAY

Вот и ошибка!

Все остальные изменения в схеме чудесным образом не повлияли на работу. Даже если просто вернуть зеленую стрелочку от Tape Taken обратно к Next, то все заработает как надо.
Данная ошибка – лишнее подтверждение истины «Работает – не трогай». Возможно, при очередном рефакторинге метода NewJackalTapeFound, случайно не там поставили скобки в исходном коде, и логика поменялась.
Лечение
Для устранения ошибки на самом деле достаточно изменить всего один байт в файле Dunia.DLL, чтобы повернуть логику подпрограммы в нужное русло.

Чтобы не изменять файл физически, рекомендую использовать утилиту для запуска игры с различными исправлениями прямо в памяти процесса. Подробнее:
https://test-steamproxy.haloskins.io/sharedfiles/filedetails/?id=1620560934

Самолечение

Если вы уверены в том, что делаете, и знакомы с двоичными редакторами, тогда вот, что нужно сделать.
  1. Найдите, где установлена игра – нужный файл располагается в подпапке BIN.
  2. Конечно же, сделайте резервную копию файла Dunia.DLL, на всякий случай.
  3. Затем откройте файл и найдите следующую последовательность байтов:
    0A 3B CA 75 0A
  4. Если нашли, то, чтобы быть совсем уверенными, проверьте, что для Steam-версии размер файла равен 20183176 байтам, а нужная последовательность нашлась по смещению 0x0074D865, либо для Retail-версии размер 19412104 и смещение 0x00740355.
  5. Поменяйте первый байт последовательности 0x0A на 0x14. Т.е. должно стать так:
    14 3B CA 75 0A

Обращение к врачу

Те, кто не хочет заморачиваться с ручным редактированием файла, могут воспользоваться простым в использовании патчером:

https://github.com/FoxAhead/Far-Cry-2-Stealing-Boots-Jackal-Tapes-Patcher/releases/latest

Скачайте и запустите файл FarCry2StealingBootsJackalTapesPatcher.exe. Через кнопку Browse выберите файл Dunia.DLL. Нажмите кнопку Patch!



При запуске программа попытается автоматически определить путь с установленной игрой, так что по кнопке Browse сразу должна открыться нужная папка, и останется только выбрать файл Duina.DLL. Перед применением патча программа проверяет файл, и если все в порядке, то кнопка Patch! внизу станет доступна для нажатия. Резервная копия будет создана автоматически, как только вы подтвердите свое намерение. Если на любом из этапов что-то пойдет не так, то программа сообщит об этом.

Патчер ищет подходящий шаблон байтов по маске, так что теоретически он способен исправить подпрограмму даже в каком-то экзотическом файле Dunia.DLL (другой размер, другие адреса) при условии, что там действительно есть ошибочная подпрограмма.
Прогноз
Окончательным выздоровление может считаться, только если до применения патча вы подняли не более одной пленки на второй карте. В противном случае все последующие поднятые пленки просто исчезли безвозвратно, так и не отметившись в списке. В этом случае поищите более раннее сохранение. Или… почему бы не перепройти игру?


P.S.
Я когда-нибудь
говорил вам,
что такое безумие?
21 Comments
syavikua 16 Nov, 2024 @ 12:39pm 
самый абсурд, что по логике патч v1.03 должен был исправить эту проблему - так и указано в файле ReadMe.txt в корневой папки самой игры(Fixed a bug with the "Jackal tapes" accounting). Хотя в самом начале файла уже идет версия v1.03b. Видно, что разрабы знали о баге, но так ни черта и не исправили. Это талант/кривизна рук, - выпускать патч для устранения ошибки, которую все ровно не исправляет!:steamfacepalm:
FoxAhead  [author] 16 Nov, 2024 @ 10:52am 
Мне повезло найти и исправить эту функцию. Это оказалось относительно просто. Но вот, чтобы вернуть на карту все диктофоны и сбросить список, это надо копаться во внутренностях сэйвов, в том, как хранятся объекты в сэйве. По сути нужен редактор сейвов. И всё это без исходного кода игры. Это гораздо сложнее, не представляю даже с какой стороны подойти. Буду рад, если кто-то такое сделает.
FoxAhead  [author] 16 Nov, 2024 @ 10:51am 
syavikua,
про "Гуманиста" странно. Вообще первой карте проблем быть не должно. Сам диктофон лежащий в игровом мире не "хранит" в себе запись. Это просто одноразовый триггер на запуск функции, которая работает списком и по описанной логике запускает очередную звукозапись. Каждая группа из 8 плёнок будут продвигаться строго поочерёдно на своей части (Север/Юг) независимо от того, в каком из 8 квадратов был подобран диктофон. Из-за бага при подборе диктофона на южной карте список не продвигался, но диктофон удалялся из мира как и положено.
syavikua 12 Nov, 2024 @ 9:53am 
В этом и трабла, что новичок узнает об этом баге спустя половину пройденной игры. Может есть возможность сбросить все собранные пленки(фиксом или прогой), чтобы потом уже собрать их без ошибок?! Проходить ее заново только ради записей так себе вариант... тяжело долго выдержать эту пустынно-желтую гамму, хз вроде и графа для 2008 норм, а все ровно что-то не то с игрой(будто с депрессинкой она:steamhappy:). Хотя и за такой фикс благодарочка!
syavikua 12 Nov, 2024 @ 9:49am 
Правильно ли я понял, что единственная панацея - это накатывать патч Far-Cry-2-Stealing-Boots-Jackal-Tapes-Patcher или юзать Far-Cry-2-Multi-Fixer изначально, при старте новой игры?! Потому как я заметил, что у меня проблемы возникли еще на 1й карте, при взятии записи "Гуманист"(она не отображалась в списке, хотя была взята ранее) после всей пройденной игры, и уже после бескон. истории про ботинки со 2й карты. Все остальные из 1й карты взялись без проблем(FC2 v1.03 Uplay vers. + русик).
Tesmund 17 Dec, 2022 @ 12:21pm 
FoxAhead,
да после повторного прочтения понял это, извините дурачка, спасибо, что ответили, желаю вам счастье, здоровье, благополучие и всего самого наилучшего! :winter2019happybulb:
FoxAhead  [author] 11 Dec, 2022 @ 3:53am 
Tesmund,
"если до применения патча вы подняли не более одной пленки на второй карте", то все будет хорошо.
Tesmund 7 Dec, 2022 @ 11:25pm 
Я не врубаюсь, нахожусь ща на 1 первой карте, поставил заранее патч, у меня теперь все плёнки исчезнут со второй карты или что?
Эль Кукуй 2 Oct, 2021 @ 5:36am 
а есть варик как починить баг с закрытой дверью в деревне на 65% прохождения?
kakolykia 5 Nov, 2020 @ 4:08am 
ох уж эта ДУНЯ :lunar2019deadpanpig: