Руководство по моддингу

Всем привет!

Как и обещал, доделал блог для зарегистрированных пользователей. Надеюсь, это сплотит оставшихся поклонников игры, и на свет появится что-то стоящее.

Начну с перепечатки статьи по модификации игры с сайта Absolute Games. Статья очень полезная, но ссылки на ней устарели, так как сайт разработчика игры – закрыт. Думаю, полезно будет освежить статью и ссылки. Присоединяйтесь! Буду ждать Ваши статьи!

Документация на английском языке и примеры модификации

Содержание:

  1. Работа с ресурсами игры: *.ubn-архивы
  2. Скрипты
  3. Текстуры и прочая графика — формат *.DDS
  4. 3D модели — форматы *.gr2 и *.diff3d
  5. Конструктор карт
  6. Глобальная карта и другие объекты графического интерфейса

Работа с ресурсами игры: *.ubn-архивы

UBN-файлы являются обычными zip-архивами и могут быть просмотрены, разархивированы, заархивированы и отредактированы WinZip или WinRAR. Каждый .UBN-файл содержит каталоги с файлами. Рассмотрим их подробнее:

zones.ubn — содержит все локации, имеющиеся в игре.

  • В нем находятся все скрипты по конкретным зонам (_init.py — скприт запуска зоны, dialogs.py — диалоги, npc.py — NPC, и т.д.).
  • [имя карты].zip — zip-архив самой карты.
  • zonetext — директория с .PY-скриптами текстов разговоров для конкретной зоны.
  • lightmap.png.dds — карта рельефа поверхности в формате *.DDS (об этом подробнее ниже), файл [имя карты]_minimap.png.dds. — миникарта зоны в формате *.DDS

terrain.ubn — текстуры поверхностей в формате *.DDS. Также содержит вместе с некоторыми текстурами файлы типа *.grid_map. Это обычные XML-файлы, которые редактируются любым текстовым редактором. Они определяют, какое место на карте занимает тот или иной объект (размер измеряется в тайлах). Если файл *.grid_map отсутствует, тогда объект становится полностью проходимым для персонажа, т.е. не занимает место на карте.

videos.ubn — видеозаставки из начала и конца игры. Формат — *.bik (для конверсии в сей замечательный и очень распространенный в играх формат, а также из него в другие форматы, используется бесплатная программа RAD Video Tools).

sounds.ubn — звуки и музыка в соответствующих каталогах, в открытом формате *.ogg (Vorbis). Большинство современных программ для работы со звуком конвертируют из *.ogg и в него без проблем.

textures.ubn — текстуры в формате *.DDS, разбиты по группам, как и все остальное (техника, здания, и т.д.).

objects.ubn — 3D-модели в форматах *.gr (в частности - анимация голов персонажей) и в формате *.diff3d (здания, оружие, объекты). О *.diff3d — ниже.

gui.ubn — графический интерфейс. Содержит изображения из меню, глобальных карт, экранов выбора персонажа, и т.д. в формате *.dds.

scripts.ubn — все скрипты в форматах *.py и *.pyc

data.ubn — архив содержит файлы для управления и разметки графического интерфейса! Типы данных: *.lay и *.gui, для них существуют официальные программы от разработчиков, подробнее о них ниже, в соответствующем разделе.

Эти архивы следует разархивировать в корневой каталог игры (/The Fall: Last Days of Gaia/). В этом случае игра будет брать файлы напрямую из одноименных каталогов (...Gaia/gui/...), а не из архивов *.ubn (.../Gaia/gui.ubn). Меняя что-то, можно будет сразу посмотреть на результат. Если напортачили где-то, можем снова разархивировать ubn и заменить поврежденные файлы исходными.

Затем, когда убедились, что МОД полностью готов и работает, компилируем каталоги с измененными файлами обратно в UBN-архив любым архиватором... Вуаля!

Замечание: иногда у игры случаются "заезды", когда вместо измененного файла из директории она берет оригинальный файл из архива. Поэтому мой совет: начиная работу над патчем или модом, разархивируйте все архивы, затем создайте бэкапы всех архивов, а потом оригинальные архивы откройте и сотрите ВСЕ данные внутри. НЕ УДАЛЯЙТЕ сами файлы архивов (*.ubn), иначе игра будет ругаться и не запустится. Теперь любое изменение файлов в директориях будет 100% отражаться в игре.

Скрипты

Все скрипты написаны на Python. Скрипты в основной массе находятся в *.ubn-архивах "zones.ubn" и "scripts.ubn" в виде *.py и *.pyc файлов. Их можно редактировать любым текстовым редактором, специализированные редакторы для него есть на www.python.org. Чтобы понять язык игры, сначала желательно ознакомиться с Python, а затем с руководством по скриптам.

Замечание: Игра работает только со скомпилированными скриптами (*.pyc), которые компилируются из редактируемых *.py. Если каталоги со скриптами разархивированы, то игра автоматически компилирует все файлы *.py, в которые вносились измерения, в *.pyc, и работает с ними. Если же они все заархивированы, то надо вручную скомпилировать в .PYC отредактированные .PY-файлы и положить их в архив, т.к. там автоматического апдейта нет.

Текстуры и прочая графика — формат *.DDS

*.DDS — графический формат, с которым можно работать в графических редакторах типа Adobe Photoshop, имея соответсвующий плагин. Его можно скачать с сайта NVIDIA среди прочих средств работы с DDS (кроме того, там еще есть плагин для 3DSMAX, позволяющий ему работать с DDS-текстурами, что впоследствии может весьма пригодиться при маппинге). Вот специализированный DDS конвертер.

На самом деле часть из DDS-текстур — это PNG пожатые в DDS для удобства работы, но игра может работать и с PNG. К примеру, Вы преобразовали DDS-файл в PNG-файл в Adobe Photoshop, отредактировали PNG-файл. Теперь удалите исходную DDS и поместите на ее место одноименный PNG — все будет работать. Когда мод закончен, все текстуры компилируем в *.DDS.

Замечание: Не все текстуры будут работать с PNG! Для некоторых очень важны mipmaps (последовательность уменьшающихся изображений). С PNG без проблем работают текстуры интерфейса, а вот текстуры поверхностей и объектов (terrain и textures соответственно) могут при использовании обычных PNG глючить!

При преобразовании PNG в DDS есть несколько опций. Для каждого вида текстур в игре следует выбирать свои опции:

  • текстуры из /GUI (интерфейса) — RGBA без mipmaps.
  • текстуры из /ZONES — без mipmaps, выбирать dxt1, если нет альфа-канала, dxt5 — если есть альфа-канал, RGBA — если это Lightmap (карта освещения).
  • текстуры из /TERRAIN — с mipmaps, dxt1 если нет альфа-канала, если есть — dxt3.
  • текстуры из /TERRAIN/SKIES — RGBA без mipmaps.
  • текстуры из /TEXTURES — mipmaps, dxt1 без альфа-калана, dxt5 если есть альфа-канал.

Mini-tutorial по добавлению новой текстуры в текстуры поверхности:

  • откройте в Adobe Photoshop произвольный *.DDS-файл из любого подкаталога директории /terrain/, кроме *.DDS-файла из каталога base. Загружать mipmaps не надо, вы позже сгенерируете их автоматически при сохранении.
  • Вы увидите текстуру поверхности. Замените любую четверть квадрата своей новой текстурой. "Склейте" все слои в один.
  • сохраните этот файл как *.DDS, с новым именем (например new.png.dds) в одном из подкаталогов каталога /terrain/. В опциях сохранения выберите dxt1, generate mipmaps.
  • теперь откройте файл terrain/details.txt. В нем записаны все текстуры. Скопируйте последнюю строчку, измените в ней порядковый номер (поставьте 822 вместо 821), Name (TRES_TERRAIN_TEXTUR_FLUSSBETT замените на Ваше название своей текстуры), setting_green менять не будем, хотя при желании можно это сделать, параметр определяет, в каком из каталогов материалов будет Ваша новая текстура в редакторе) и поменяйте путь (путь должен быть прописан terrain/один_из_подкаталогов/new.png.dds), и, наконец, измените маппинг — там четыре координаты, определяющие, какую часть изображения использовать. Если вы заполнили к примеру верхнюю левую четверть изображения своей текстурой, то впишите координаты типа X;Y;0;0, где X=1/2 ширины, Y=1/2 высоты изображения с текстурой.
  • запустите игру и зайдите в редактор карт. Ваша новая текстура доступна в указанном подразделе (если Вы не меняли подраздел редактора для новой текстуры, то это будет setting_green)

Добавление новой базовой текстуры (текстура всей поверхности карты)

  • откройте в Adobe Photoshop произвольный *.DDS-файл из /terrain/base/. Загружать mipmaps не надо, вы позже сгенерируете их автоматически при сохранении.
  • вы увидите текстуру поверхности. Замените ее своей новой текстурой. "Склейте" все слои в один.
  • сохраните этот файл как *.DDS, с новым именем (например newbase.png.dds) в /terrain/base/. В опциях сохранения выберите dxt1, generate mipmaps.
  • теперь откройте файл terrain/base.txt. В нем записаны все текстуры. Скопируйте последнюю строчку, измените в ней порядковый номер (поставьте 7 вместо 6), Name (Cave замените на Ваше название своей текстуры), и поменяйте путь (путь должен быть прописан terrain/base/newbase.png.dds).
  • запустите игру и зайдите в редактор карт. Ваша новая текстура доступна в разделе базовых текстур BASE.

Mini-tutorial по маппингу новых моделей

  • возьмите Вашу созданную модель и откройте ее в 3DSMAX.
  • нажмите M и вызовите редактор материалов. Откройте первый материал. В качестве diffuse-материала используйте Ваш файл с изображением новой текстуры для этой модели (он должен быть в формате PNG или DDS).
  • перетащите материал на вашу новую модель. Поправьте текстуру, если что-то криво сидит.
  • экспортируйте Вашу модель в формат *.ASE, поставив галочки в Mesh Options — Mesh Normals и Mapping Coordinates.
  • воспользуйтесь программой( http://www.soldiers-of-anarchy.com/jan/diff3dconvert/ConvertToDiff3D.exe) для конвертирования модели в diff3d. Синтаксис командной строки такой:
    ...путь_к_файлу-конвертеру/converttodiff3d.exe ...путь_к_файлу_модели/file.ase -map -man -mat
    -map экспортирует анимированные положения vertex, -man экспортирует анимированные нормали vertex, -map экспортирует анимированные координаты текстур.
  • Теперь готовую модель поместите в один из подкаталогов папки objects и пропишите в соответствующем *.py-файле данные по новой модели (подробнее об этом в mini-tutorial по моделям).
  • текстуру от модели поместите в соответствующий подкаталог textures. Если вы использовали текстуру 123.png в Максе в качестве diffuse-материала, то игра для текстурирования этого объекта будет искать 123.png в соответствующем разделе текстур (к примеру, если Ваша модель находится в objects/buildings/[подкаталог]/model.diff3d, то текстуру будет искать в textures/buildings/123.png).

3D модели — форматы *.gr2 и *.diff3d *.GR2 — формат Granny3d http://www.radgametools.com/gramain.htm — редактор 3D-моделей Granny3d довольно дорого стоит, но есть бесплатный просмотрщик, так что в принципе эти модели можно посмотреть... увы, посмотреть и только*.diff3dС этим форматом удобнее работать, т.к. в него умеет конвертировать специальная программа от разработчиков. Просмотреть diff3d можно с помощью специального браузера, а конвертировать модели в формат *.diff3d из *.ase, с помощью утилиты

Замечание: Чтобы текстурировать модели, необходимо экспортировать ASE-файлы из 3DSMAX, текстуру в формате PNG следует использовать в качестве diffuse-материала модели. Перегонка с помощью MD3toASE (для тех, кто работает над моделями в бесплатном MilkShape и экспортирует из в Md3, а оттуда в ASE) не подходит для текстур — маппинг модели сбивается.

Конструктор карт

Внутриигровой конструктор карт действительно очень прост. Однако импорт "собранных карт" в игру и обеспечение их играбельности — вопрос, требующий подробного руководства. Над этим гайдом я собираюсь работать в ближайшее время, с помощью разработчиков надеюсь получить объяснение всему процессу достаточно простое, чтобы моддингом могли заниматься не слишком продвинутые в программировании люди.

Замечание: LIGHTMAP (карта рельефа) экспортируется всегда чуть меньше, чем она есть на самом деле (1000x1000px = 993x993 метра/тайла).

Замечание: абсолютно вертикальных переходов в рельефе не допускается. Если на карте рельефа контраст черного/белого пиксела, между ними на карте появится наклонный тайл, а не вертикальный. По понятным причинам.

Замечание: 200 метров — фиксированная "граница камеры" — область от края карты, в которой невозможно ни движение персонажей, ни движение камеры! Граница, как сказали сами разработчики, не модифицируется, т.е. она прописана не в PY-скриптах. Поэтому карты размером 400x400 и меньше НЕ БУДУТ ИМЕТЬ ОБЛАСТИ ДЛЯ ДВИЖЕНИЯ! Помните об этом!

Глобальная карта и другие объекты графического интерфейса (меню, всплывающие окна, курсор и др.)

Изображения графического интерфейса находятся в архиве GUI.ubn. Управление им — в архиве DATA.ubn

Доступно 2 программы:

  • GUIResourceData.exe — для работы с файлами типа *.gui из помянутого архива.
  • LayoutManager.exe — для работы с файлами типа *.lay из этого же архива.

В *.gui прописываются текстуры (файлы текстур) и то, какие координаты картинок на этих текстурах. В частности на картинке с глобальной картой там указано, откуда "брать" все мелкие картинки "зон".

В *.lay наоборот, располагаются эти самые картинки на "layout"-е, который потом игрок и увидит в игре.

Руководство по помещению созданной зоны на глобальную карту

Чтобы приступить к освоению этого раздела, необходима рабочая (играбельная) зона, которая нормально запускается с помощью localinit.py: system.set_app_state(state=global_defines.APP_GAME,map="zones\<zonename>\<zonename>")

Замечание: Все описано здесь немного грубо и не на 100% протестировано.

  1. Для начала разархивируйте следующие *.ubn-файлы в <директория инсталляции The Fall>: data.ubn, gui.ubn.
  2. Откройте файл с глобальной картой из директории <директория инсталляции The Fall>guigui_missionmappanel.png.dds (к примеру, с помощью DDS-плагина для Adobe Photoshop).
  3. Найдите свободное место под картой возле маленьких иконок с изображениями других зон и нарисуйте там иконку своей новой локации.
  4. Запишите данные вашей иконки: координаты углового верхнего левого пиксела иконки и координаты нижнего правого пиксела иконки.
  5. Сохраните свой файл как PNG в тот же самый каталог, удалите оригинал mappanel.png.dds в этом каталоге И (!) в самом архиве gui.ubn! (если у Вас установлен конвертор PNG>>DDS от SSE, он автоматически создаст DDS-файлы из PNG во время следующего запуска, но тем не менее игра по какой-то причине предпочитает использовать уже существующий mappanel.png.dds из архива gui.ubn, поэтому придется этот файл из архива удалить. Сделайте бэкап, прежде чем удалять оригинальный файл из архива!).
  6. Теперь запустите утилиту GUIResourceData.exe и откройте файл: <директория инсталляции The Fall>dataguidatamap_icons.gui С помощью этой утилиты вы можете присваивать id определенным областям png/dds файлов, чтобы впоследствии использовать эти области в качестве элементов графического интерфейса.
  7. Добавьте новый ресурс, присвоив ему уникальный id (посмотрите на id всех остальных ресурсов и присвойте какой-нибудь другой!) и дескриптор (в программе bezeichner).
  8. Выделив созданный Вами новый ресурс, нажмите "new area" ("neuer bereich...") в правом окошке.
  9. здесь надо ввести координаты пикселей, которые вы записали в пункте 4. X1,Y1 — коорд. верхнего левого, X2,Y2 — коорд. нижнего правого. Высота и ширина вычисляются автоматически. Последняя установка: "texture". Выберите пункт "mappanel.png" (он там единственный) и нажмите "ОК".
  10. Теперь запустите утилиту LayoutManager.exe и загрузите файл <директория инсталляции The Fall>dataguidatalayout_missionmappanel.lay
  11. Здесь вы устанавливаете положение иконки Вашей новой зоны на глобальной карте: мышью нарисуйте прямоугольник примерно в том месте, где вы хотели бы видеть иконку Вашей зоны. Точное местоположение можно изменить позже.
  12. Прокрутите вниз в левом списке, чтобы найти новую запись: "unbenanntXX" (xx — порядковый номер, поясн. Стаса). Выделите ее. Теперь Вы должны задать ее параметры в боксах над листом. Параметр GUIResource ID: — тот ID, который вы дали своей иконке, когда использовали утилиту GUIResourceData.exe.
    X1/Y1: позиция верхнего левого пиксела вашего прямоугльника на layout'е.
    Ширина/Высота (Breite/Hohe): подставьте ТОЧНЫЕ размеры вашей иконки в пикселах, вы можете узнать их с помощью той же утилиты GUIResourceData.exe.
    Descriptor(Bezeichner): сделайте его по типу дескриптора в любом другом объекте лэйаута — "IM_ИМЯВАШЕЙЗОНЫ"
  13. Кроме того, Вам надо создать еще один прямоугольник внутри Вашего первого прямоугольника, параметр GUI Resource для него надо оставить пустым, и дать ему дескриптор типа "FD_ИМЯВАШЕЙЗОНЫ"
  14. Теперь Вашу новую зону надо добавить в список доступных зон в файле <директория инсталляции The Fall>scriptssystem_py.py Просто добавьте в конец списка новую строку подобного вида: "ИМЯЗОНЫ": ("zones\имязоны\имязоны", [координата X на карте, координата Y на карте])
    НАПРИМЕР:

    "vidzone_1": ("zones\vidzone_1\vidzone_1", [480.00, 450.00]),
    Координаты X и Y на глобальной карте даются для того, чтобы игра могла просчитать количество красных точек, покаывающих Ваш путь до зоны.
  15. Теперь Ваша новая зона должна стать доступной с глобальной карты, но для начала необходимо активировать ее через консоль командой global_defines.set_zone_enabled("имязоны",True)

Теперь выйдите на глобальную карту в игре — там должна появиться иконка Вашей новой зоны и она должна быть рабочей (к ней можно направиться)

Скрипт на активацию Вашей зоны вы позже можете привязать к какому-то квестовому событию или диалогу в игре.

Автор статьи: Stas Bush

 

zsrg 06.06.2011 | Комментарии (74)













Разработка Sergey A.Zhukov 2007-2012