Как собрать юнит из запчастей - моделей Total War: Rome 2
ВНИМАНИЕ!!! Перед прочтением сжечь!
В тексте, для корректного отображения на сайте, в блоках текста кода символы заменены на { код } ! Соответственно для того чтобы это работал в игре должно быть наоборот.
Пока нам не доступно создание новых моделей, и импорт их в игру, мы можем использовать лишь те модели что есть, но мы может править текстуры, плюс Рим2 наделён рядом отличных особенностей, таких как подкраска вертексов, например можно не вставляя новых текстур подкрасить\перекрасить те что есть, мы может так же добавлять рандомность различным элементам( плюмажем например) использую для одного шлема несколько видов, так же нам доступно нанесению с помощью "альфа маски" на элементы различных узоров, т.е нам не нужно делать щиты с различными узорами, мы можем накладывать с референсных текстур узоров рисунок сверху на исходные. Так же разнообразие среди вариаций и используемых моделей( т.е меш и текстура), рандомно появляющихся на одном юните, т.е отсутствуют поголовные клоны в отрядах.
Мы не будем создавать мод мы будем переписывать ванилу, как создавать мод это уже отдельный разговор не относящийся к вопросу тутора.
В первую очередь скачиваем вот этот инструмент Pack File Manage теперь распаковываем его и запускаем .exe. У меня по умолчанию стоят для файлов .pack «открыть с помощью Pack File Manage» поэтому я просто открываю model_rome2.pack находящийся примерно тут: C:\Program Files (x86)\Steam\SteamApps\common\Total War Rome II\data , вам же надо открыть его через меню файл – открыть. Вся структура файлов игра состоит из неких архивов «паков» которые в свою очередь внутри разбиты на директории «папки» всё как в Виндовсков проводнике, а уж в них находятся конкретные файлы в бинарном формате. Все фалы в этих паках связаны ссылками друг на друга, и черпают информацию из соседних или из своего же пака. Так как файлы у нас можно сказать зашифрованные(язык для машин, даже изображение не что иное как простой набор цифр) мы можем их просмотреть или с помощью встроенных инструментов Pack File Manage или сторонними редакторами, в самих папках все файлы как бы имеют один формат, а вот извлекая или просматривая мы их преобразовываем в форматы в которых нам будет удобно. Сейчас нас интересуют файлы которые в простонародье назвали бы скрипты)) , так что они у нас в текстовом формате, я буду открывать их с помощью встроенных инструментов : ПКМ(по файлу)-Open-Open sa text… Один важный момент вверху программы откройте вкладку Options и снимите галку «CA Packs Are Read Only»(только для чтения), в появившимся окне выбираем пункт: I’m not afraid, coward! , это позволит нам перезаписать исходные файлы
Теперь мы видим следующую картину:
{gallery}tutors/model_1_TWR2/1{/gallery}
Мы видим структуру папок в которой у нас отобразились файлы в данном случаи это файлы юнитов, я так же как и автор исходного тутора выбрал gre_hippeus_lancers.variantmeshdefinition открыл его и увидел следующие:
{gallery}tutors/model_1_TWR2/2{/gallery}
Теперь давайте поговорим о структуре файла. В первую очередь хочется отметить довольно интуитивно понятные записи всех паков, не всматриваетесь, как в код пока не освоились, а читайте как книгу, при переводе 80% смыла записи становится вполне понятна, так же как и название самих директорий(про директории загнул, порой хрен пойми, думаю и вас на компе есть паки «111111» «teyhfhf» в которых вполне себе лежат снимки с отпуска и скриншоты из игры). Вообще, если собрались модить(кодить) старайтесь сначала видеть в коде не что-то эфемерное не понятное, а всего лишь запись, как текст, даже сам синтаксис этого языка вполне понятен, сейчас разберём всю эту запись и вы поймёте что не всё так страшно:
Разберу запись одного юнита, возможно записи немного разнятся чего-то нет, что-то есть, но поняв принцип вы сможете сами разобраться в других
Важный момент - в тексте для корректного отображения на сайте в блоках текста кода символы < и > заменены на { и }
Курсивом в коде мои комментарии:
{VARIANT_MESH} Основной блок в который всё и внесено по этому юниту(внешний вид)Все слоты\блоки имеют структуру { - открытие {/ - закрытие
{SLOT name="skin" } Слот Лицо\кожа, скорее всего там где нет используется какой то общий фракционный(расовый тип)
{VARIANT_MESH}
{SLOT name="hair" } Слот волосы
{VARIANT_MESH_REFERENCE definition="VariantMeshes/_VariantModels/man/skin/greek_game_skin.VariantMeshDefinition" /} - Вот тут запись, о том какие волосы у этого юнита, как я упоминал все файлы ссылаются друг на друга, и тут мы видим ссылку на другой файл «файл где прописана сама «вещь\предмет» и её название, в общем то по виду такой же адрес как у нас в проводнике, и как я говорил что всё довольно понятно: дословно написано референс т.е ссылка
{/SLOT}
{SLOT name="beards" /} Слот Борода\усы, как видим её нет, ни кто не мешает нам добавить запись
{SLOT name="helmets" } Слот шлем, ниже вы видите несколько записей, это позволяет юниту рандомно использовать все виды шлемов, скорее рандом рассчитан: тут 4 предмета значит, каждый будет у 1\4 юнитов. Но если вы скажем добавите две одинаковые вещи то шанс их появления среди 4 остальных уже будет 50%, если 3 одинаковые то соответственно у 75% юнитов будет эта вещь. Так же стоит упомянуть что тут ссылки в файле только на саму вещь, не на модель.
{VARIANT_MESH_REFERENCE definition="VariantMeshes/_VariantModels/man/helmets/hellenic_thracians_basic.VariantMeshDefinition" /}
{VARIANT_MESH_REFERENCE definition="VariantMeshes/_VariantModels/man/helmets/hellenic_thracians_crests.VariantMeshDefinition" /}
{VARIANT_MESH_REFERENCE definition="VariantMeshes/_VariantModels/man/helmets/hellenic_attic.VariantMeshDefinition" /}
{VARIANT_MESH_REFERENCE definition="VariantMeshes/_VariantModels/man/helmets/hellenic_attic_crest.VariantMeshDefinition" /}
{VARIANT_MESH_REFERENCE definition="VariantMeshes/_VariantModels/man/helmets/hellenic_phyrgians_basic.VariantMeshDefinition" /}
{/SLOT}
{SLOT name="clothing" } Слот одежда, как мы видим этот юнит в плане одежды довольно инкубаторский
{VARIANT_MESH_REFERENCE definition="VariantMeshes/_VariantModels/man/armour/linothorax.VariantMeshDefinition" /}
{/SLOT}
{SLOT name="cloaks" /} Слот для плащей, нету -промокнет
{SLOT name="greaves" } Слот для обуви, тут используется 2 модели
{VARIANT_MESH_REFERENCE definition="VariantMeshes/_VariantModels/man/greaves/greaves.VariantMeshDefinition" /}
{VARIANT_MESH_REFERENCE definition="VariantMeshes/_VariantModels/man/greaves/graves_basic.VariantMeshDefinition" /}
{/SLOT}
{SLOT name="shield" attach_point="weapon_03" } Слот для щитов, тут есть небольшое уточнение это attach_point="weapon_03" . Смотреть уточнение 1. Как мы видим тут целых 4 вида щитов
{VARIANT_MESH_REFERENCE definition="VariantMeshes/_VariantModels/man/shield/hellenic_hoplon_painted_hoplite.VariantMeshDefinition" /}
{VARIANT_MESH_REFERENCE definition="VariantMeshes/_VariantModels/man/shield/hellenic_hoplon_painted_hoplite.VariantMeshDefinition" /}
{VARIANT_MESH_REFERENCE definition="VariantMeshes/_VariantModels/man/shield/hellenic_hoplon_painted_hoplite.VariantMeshDefinition" /}
{VARIANT_MESH_REFERENCE definition="VariantMeshes/_VariantModels/man/shield/hellenic_hoplon_hoplite.VariantMeshDefinition" /}
{/SLOT}
{SLOT name="weapon_1" attach_point="weapon_01" } Слот для 1-го оружия. Так же Уточнение 1
{VARIANT_MESH_REFERENCE definition="VariantMeshes/_VariantModels/man/weapons/short_spears.VariantMeshDefinition" /}
{/SLOT}
{SLOT name="weapon_2" /} Слот для 2-го оружия.
{SLOT name="weapon_3" /} Слот для3-го оружия.
{SLOT name="weapon_4" /} Слот для 4-го оружия.
{/VARIANT_MESH}
{/SLOT}
{/VARIANT_MESH} Все слоты и блоки закрываются
Уточнение 1
attach_point= Как мы видим есть дополнительная запись, для оружия, она показывает нам куда оружие автоматически (как скажут Как мы видим есть дополнительная запись, для оружия, она показывает нам куда оружие автоматически (как скажут Тридешники приатачивается) привязывается к кости скелета. Для остального, шлемов например, достаточно того что он лежит в слоте шлем. А так как оружие держится и переносится по разному используются разные варианты для разных видов оружия. Но в начале давайте уточним один момент, равность записей(bone – это кость):
"weapon_1": bone_1
"weapon_2": bone_2
"shield": bone_3
"weapon_3": bone_4
"weapon_4": bone_5
Далее оружие» приатачивается» по такой схеме:
Меч--Weapon bone 2
Гладиус--Weapon bone 2
Копьё--Weapon bone 1
Дротик--Weapon bone 5
Щит--Weapon bone 3
Пика--Weapon bone 1
Серп--Weapon bone 1
Штандарт--Weapon bone 1
Лук--Weapon bone 4
Стрелы--Weapon bone 5
Праща--Weapon bone 1
Камни--Weapon bone 5
Rhomphaia или фракийского серп--Weapon bone 1
Дубина--Weapon bone 2
Кинжал--Weapon bone 2
Меч--Weapon bone 2
Гладиус--Weapon bone 2
Копьё--Weapon bone 1
Дротик--Weapon bone 1
Щит--Weapon bone 3
Пика--Weapon bone 1
Серп--Weapon bone 1
Штандарт--Weapon bone 1
Лук--Weapon bone 4
Стрелы--Weapon bone 5
Праща--Weapon bone 1
Камни--Weapon bone 5
Rhomphaia или фракийского серп--Weapon bone 1
Дубина--Weapon bone 2
Кинжал--Weapon bone 2
И так теперь мы разобрались с записью обмундирования\вида юнита, давайте перейдём к конкретным его вещам. Мы видим ч то в слоте одежда идёт ссылка на файл с одеждой linothorax.VariantMeshDefinition Я вырезал его часть, что бы не занимать место. Давайте откроем его(адрес вы видите):
{VARIANT_MESH}
{SLOT name="tunics" } Слот для всей модели в котором её вариации состоящие из разных мешей(полигональных сеток), т.е к тому разнообразию в слоте юнита добавляется и это. В данном случаи вы видите слоты для армора одежды, но могут быть слоты и для других элементов: щиток, туника, плащ, …. Так же у каждой модели есть и «подмодель» imposter_model это спрайты этой модели, Может почитать в интернете что такое понятие спрайт в компьютерной графике
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/tunics/hellenic_tunic_cut.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/tunics/e3_tunic.rigid_model_v2" } Как видите тут несколько одинаковых записей, тут работает тот же принцип что и у слотов юнита, те каких записей больше тех мешей и больше. Так же у каждой части модели есть ещё отдельные варианты это субмеши тут их 4
{SLOT }
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/armour/linothorax_basic_01.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/armour/carthaginian_linothorax_a.rigid_model_v2" /}
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/armour/linothorax_basic_02.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/armour/carthaginian_linothorax_a.rigid_model_v2" /}
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/armour/linothorax_basic_03.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/armour/carthaginian_linothorax_a.rigid_model_v2" /}
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/armour/linothorax_basic_04.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/armour/carthaginian_linothorax_a.rigid_model_v2" /}
{/VARIANT_MESH}
{/SLOT}
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/tunics/italian_tunic1_cut.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/tunics/e3_tunic.rigid_model_v2" mask0="1" mask1="0" }
{SLOT name="armour" }
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/armour/linothorax_basic_01.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/armour/carthaginian_linothorax_a.rigid_model_v2" /}
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/armour/linothorax_basic_02.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/armour/carthaginian_linothorax_a.rigid_model_v2" /}
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/armour/linothorax_basic_03.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/armour/carthaginian_linothorax_a.rigid_model_v2" /}
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/armour/linothorax_basic_04.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/armour/carthaginian_linothorax_a.rigid_model_v2" /}
{/SLOT}
{/VARIANT_MESH}
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/tunics/italian_tunic1_cut.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/tunics/e3_tunic.rigid_model_v2" mask0="2" mask2="0" }
{SLOT name="armour" }
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/armour/linothorax_basic_01.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/armour/carthaginian_linothorax_a.rigid_model_v2" /}
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/armour/linothorax_basic_02.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/armour/carthaginian_linothorax_a.rigid_model_v2" /}
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/armour/linothorax_basic_03.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/armour/carthaginian_linothorax_a.rigid_model_v2" /}
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/armour/linothorax_basic_04.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/armour/carthaginian_linothorax_a.rigid_model_v2" /}
{/VARIANT_MESH}
{/SLOT}
{/VARIANT_MESH}
Обратите внимание, что вам не стоит менять тут модели эти спрайтов или добавлять новые, так как это может привести к некорректному их отображению и нагрузки на движок игры.
Так же обратите внимание на параметр у некоторых слотов " mask0="1" mask1="0" этот параметр позволяет накладывать маску: подкраску по вертексам меша, что делает возможным внести цветовое многообразие в меши. Тут так же действует система - чем больше таких мешей, тем больше будет их процент в игре. Сами маски используются следующим образом, первая будет применена к 60% мешей, вторая и третья к 20% на каждую. Цвета масок установлены для фракций т.е у каждой 3 варианта масок, редактировать их можно в файле: data_rome2.pack\db\faction_uniform_colours_tables\faction_uniform_colours, вы видите таблицу в которой первый столбик фракции и три варианты цвета, на каждый по три колонки - это цвета RGB что это можно прочесть http://ru.wikipedia.org/wiki/RGB
Теперь на примере другого файла шлема с гребнем, рассмотрим более детально его структуру:
{VARIANT_MESH}
{SLOT } Слот шлема
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/helmets/roman_montefortino.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/helmets/roman_montefortino.rigid_model_v2" }Сам шлем
{SLOT probability ="0.8" attach_point="crest_centre" } Центральный гребень, 0.8 – вероятность появления(скорее всего относительно единицы), attach_point="crest_centre" – так же место(точка) куда приатачивает, а именно центр
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/crests/black_feather_03.rigid_model_v2" /} Сами используемые гребни
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/crests/black_feather_03.rigid_model_v2" /}
{/SLOT}
{SLOT /} Гребень с боку, его нет
{/VARIANT_MESH}
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/helmets/roman_montefortino2.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/helmets/roman_montefortino.rigid_model_v2" }
{SLOT probability ="0.8" attach_point="crest_centre" }
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/crests/black_feather_03.rigid_model_v2" /}
{/SLOT}
{SLOT /}
{/VARIANT_MESH}
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/helmets/roman_montefortino3.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/helmets/roman_montefortino.rigid_model_v2" }
{SLOT probability ="0.8" attach_point="crest_centre" }
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/crests/black_feather_03.rigid_model_v2" /}
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/crests/black_feather_03.rigid_model_v2" /}
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/crests/black_horsehair_split_01.rigid_model_v2" /}
{/SLOT}
{SLOT /}
{/VARIANT_MESH}
{/SLOT}
{/VARIANT_MESH}
Вы видите что тут тоже есть значительно рандомное разнообразие.
Теперь перейдём ещё к одному моменту это модели щитов:
hellenic_hoplon_painted_hoplite
{VARIANT_MESH}
{SLOT } Слот самого щита, далее его вариации
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/shield/hellenic_shield_hoplon_painted2.rigid_model_v2" decal_diffuse="VariantMeshes/_VariantModels/man/patterns/hellenic/decal_diffuse" decal_normal="VariantMeshes/_VariantModels/man/patterns/hellenic/decal_normal" imposter_model="VariantMeshes/_VariantModels/man/shield/hellenic_shield_hoplon.rigid_model_v2" /} Тут вы видите меш самого щита, а так дополнительные текстуры дифуза и нормали, он накладываются как маска сверху основной текстуры щита, имеют префикс decal – или наклейка, картинка… Это позволяет не делая новых текстур назначить любые гербы, царапины, какие то элементы…, т.е вы можете сделать, так что бы у вас в отряде у юнитов были щиты разной степени повреждения и изношенности. Также тут применяются и маски по вертексам, как и в примере туники. На деле, ссылка идёт не сам файл текстуры, а на файл в котором перечислены эти текстуры, в котором и есть записи о текстурах. В файле находится несколько текстур с разными орнаментами, т.е установив decal_ текстуру, вы выбираете не одну, а сразу столько её вариаций сколько прописано в файле decal_...
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/shield/hellenic_shield_hoplon_painted2.rigid_model_v2" decal_diffuse="VariantMeshes/_VariantModels/man/patterns/hellenic/decal_diffuse" decal_normal="VariantMeshes/_VariantModels/man/patterns/hellenic/decal_normal" imposter_model="VariantMeshes/_VariantModels/man/shield/hellenic_shield_hoplon.rigid_model_v2" /}
{VARIANT_MESH model="VariantMeshes/_VariantModels/man/shield/hellenic_shield_hoplon_painted2.rigid_model_v2" decal_diffuse="VariantMeshes/_VariantModels/man/patterns/hellenic/decal_diffuse" decal_normal="VariantMeshes/_VariantModels/man/patterns/hellenic/decal_normal" imposter_model="VariantMeshes/_VariantModels/man/shield/hellenic_shield_hoplon.rigid_model_v2" mask1="2" mask2="1" /}
{/SLOT}
{/VARIANT_MESH}
И так мы поняли как и что расположено и теперь можем взять одно и заменить на другое, учтите текстуры мы редактировать можем переписывая исходные, а меши нет. Текстуры можно редактировать довольно просто: Установите Фотошоп или Гимп или любую программу поддерживающею растровый формат .dds установите в свойствах файла .dds открывать по умолчанию с помощью неё и в Pack File Manage нажмите ПКМ(по файлу)-Open-Open External… потом сохраните изменения после редактирования в 2D-редакторе. Все текстуры перечислены в файле риг. модель, открыть и увидеть все приписанные текстуры можно с помощью любого HEX идитора.
Более подробно о ре-текстурировании в следующих сериях нашего модосериала.