Товарищ Hexxx не перестаёт радовать своими открытиями в области ковыряния движка, но помимо этого ещё успевает писать архиполезнейшие утилиты! Удивительный человек, снимаю шляпу :)
F2ScriptDebugger это первое подобие скриптового отладчика для SSL скриптов в Fallout'e
Скачать, инструкция внутри
Как пользоваться:
1) Положить файлы ssldebug.ini, SslDebug.dll и F2ScriptDebugger.exe рядом с exe-файлом игры
2) Изменить в ssldebug.ini имя исполняемого файла, если вы отлаживаете не FalloutOfNevada.exe (см ниже)
3) Запустить exe-файл игры и дождаться пока появится шлавное меню
4) Переключиться в explorer по ALT-Tab и запустить F2ScriptDebugger.exe
5) Вернуться в игру и делать все что хочется, выполнение скриптов логируется в Debug.log
Особенности:
1) Прервать работу F2ScriptDebugger.exe можно в любой момент. Но он не умеет атачиться повторно. Придется перезапускать игру
2) Лог полностью сбрасывается на диск только когда выходишь из F2ScriptDebugger.exe. То есть пока он работает в Debug.log может отображаться не вся информация, часть информации может быть все еще в буфере.
3) В лог пишется очень много информации (если не включены фильтры), примерно 20 мб в минуту.
4) Адрес таблицы обработчиков скриптовых опкодов установлен для Fallout 2 v1.2 English. Если вы собрались юзать на какой-то другой версии, нужно выяснять какой адрес таблицы в вашем exe.
Опции в ssldebug.ini:
Game имя исполняемого файла игры
Scripts список скриптов, которые вы хотите логировать. Остальные логироваться не будут. Разделитель точка с запятой. Позволяет сократить поток спама идущего в debug.log :) Изначально закоментировано, для того чтобы писался полный поток.
ScriptHandlerTableAddress адрес глобальной переменной где лежат обработчики скриптов. Это для тех кто рискнет и захочет попробовать использовать дебагер на других версиях игры.
В основе лежит следующая идея:
Скриптовый движок для выполнения опкодов использует массив/таблица функций-обработчиков. Т.е. в нем столько обработчиков, сколько зарегистрировано опкодов. Перезаписав адреса обработчиков на свои, мы имеем возможность контролировать выполнение скрипта.
Сейчас именно так и сделано. В процесс игры инжектится DLL, она хучит все обработчики на адрес собственного обработчика опкодв. Собственный обработчик просто собирает информацию об опкоде, который выполняется в данный момент и шлет по IPC в процесс дебагера, где производится логирование. А дальше вызывается оригинальный обработчик опкода.
Проблема: массив инициализируется во время старта игры, поэтому нужно дождаться пока игра запустится, перед тем как перебивать адреса в массиве.
Небольшое пояснение про формат лога. В логе идут записи вида: