Алгоритм монтирования DLC
1. Игра проверяет наличие папок в папке Biogame\DLC.
2. Наличие файла Mount.dlc, в котором находится вся внешняя информация о данном контенте.
3. Игра загружает INI-файлы, соответсвующие различный аспектам игры (BIOEngine.ini, BIOGame.ini, BIOUI.ini, etc).
Конфигурационные файлы
Наиболее важным из них является BIOEngine.ini, именно в этом файле добвляются строки о обработке DLC:
1) в разделе [Core.System] добавляется строка о добавлении папки с DLC в библиотеку игры:
+SeekFreePCPaths=..\BIOGame\DLC\DLC_EXP_Part01\CookedPC
2) в секции [Engine.StartupPackages] строки о загрузке стартующих пакетов (в них содержится информация, какие компоненты загружать):
+DLCStartupPackage=DLCSharedPlot
+DLCStartupPackage=Startup_EXP_Part01
3) в [sFXGame.SFXEngine] содержится информация о том, в каких пакетах следует искать определенные объекты:
+DynamicLoadMapping=(ObjectName="SFXGameContentLiara.SFXPower_StasisNew",SeekFreePackageName="SFXPower_StasisNew")
+DynamicLoadMapping=(ObjectName="SB_Codex_Images.Liara_512",SeekFreePackageName="SFXLiaraHenchImage")
+DynamicLoadMapping=(ObjectName="SB_Codex_Images.Stasis_512",SeekFreePackageName="SFXLiaraPowerImages")
+DynamicLoadMapping=(ObjectName="BIOG_GesturesConfigDLC.RuntimeData",SeekFreePackageName="GesturesConfigDLC")
В BIOGame.ini содержатся различные параметры, самое большое внимание стоит обратить на [sFXGame.BioWorldInfo]. В данной секции находятся "ConditionalClasses" (даже не знаю, как это нормально перевести), эти записи добавляют чтение "условий", без которых стартующие пакеты не будут обработаны, а значит, не начнется обработка компонентов DLC:
+ConditionalClasses=PlotManagerDLC_EXP_Part01.BioAutoConditionals
+ConditionalClasses=PlotManagerDLC_00_Shared.BioAutoConditionals
В BIOUI.ini, BIOWeapon.ini содержатся игровые параметры, без которых игра не будет работать правильно.
Модификация Mount.dlc
Теперь самое интересное - изменение Mount.dlc, этот файл отвечает за внешние параметры, такие как оставление инфомации о DLC в ваших сейвгеймах, название DLC, уникальный идентификационный код DLC (разбор файла занял у меня около 3 часов, слава богу, было свободное время).
Нам понадобится любой HEX-редактор, я использовал плагин для Notepad++ - HexEditor (который, кстати, иногда вызывает зависания, заставляя его жрать память и нагружать процессор). Подопытным будет всеми нами любимый Lair of the Shadow Broker (DLC_EXP_Part01). Открываем Mount.dlc, видим перед собой такую картину (вид - 8-битный):
1. Первые 12 байт (Offset - 00, 00-0b) - идентификационный код, присутствующий у абсолютно всех файлов. По нему игра узнает, что этот файл именно то, что ей нужно, а не какой-то другой файл, переменованный в Mount.dlc.
2. Следующие 2 байта (Offsett - 00, 0c-0d) - уникальный идентификационный код (GUID), у каждого DLC он собственный. Код предствляет собой Little Endian (байты читаются справа налево) Hex (16-ричное) представление какого-либо числа. Экспериментальный путем было выяснено, что значения меньше 77 (Hex), заставят игру воспринимать любое удаление или изменение контента DLC как угрозу, что не даст его активировать unlocker'ом (подозреваю, что в GlobalPersistentCookerData.upk хранятся точные кэши всех файлов, persistent - немного намекает; значение выше 76 пропускает эту процедуру). Существуют DLC, значения которых по умолчанию меньше данного, такие DLC - DLC_HEN_VT, DLC_PRE_Cerberus, DLC_UNC_Hammer01, DLC_UNC_Moment01. При изменении идентификационного кода DLC придется модицировать ваши старые сейвгеймы, точнее убрать информацию о требуемых DLC из файла сохранения (Gibbed Saved Editor, вкладка Raw -> Information -> Dependent DLC -> Collection -> Remove). Поэтому, чтобы у вас в дальнейшем не было с этим проблем, при модификации GUID желательно выполнить пункт #4.
3. Далее идет определенный набор байтов 00 00 03 00 00 00 ae 0f 43 dd 0b 52 5d 4c 9e 28 0d 77 6d 86 91 55 00 00 00 00.
4. Следующие байт (Offset - 20, 08) регулирует связь DLC и ваших сохранений:
00 - DLC не оставляет информацию в сохранениях (такое значение имеют большинство мелких DLC)
01 - вероятно, тоже самое (такое значение имеют несколько мелких DLC)
02 - DLC оставляет информацию в сохранениях (свойственно крупным DLC)
При модификации желательно ставить значение 00.
5. Разделитель - 000000.
6. Количество символов в названии DLC (указывается в 16-ричной системе; с учетом дополнительного байта в конце названия - 00).
7. Разделитель - 000000.
8. Название DLC для внешней идентификации + 00 - "La tana dell'Ombra"
9. Разделитель - 000000.
10. Следующие 3 байта - название DLC, отображаемое в игре (номер строчки из библиотеки .tlk файлов; указывается в Little Endian Hex).
11. Разделитель - 00.
12. Количество символов в названии папки, содержащее DLC (указывается в 16-ричной системе; с учетом дополнительного байта в конце названия - 00).
13. Разделитель - 000000.
14. Название папки с DLC + 00 - "DLC_EXP_Part01".
15. Завершение файла - 00000000.
DLC можно соединять, вшивать в игру. Но для этого требуется изменять .ini файлы. Это сложновато делать для "мясистых" DLC (слишком большая вероятность испортить по невнимательности), да и того не стоит.
Кстати, вот один амбициозный проект. Жаль, автор прекратил над ним работу
http://code.google.com/p/me2-cpp-sdk