Написали по открытию ]]>неиграбельных фракций]]>.. Если я правильно понял то
"Причина того, что при попытке открыть неиграбельные фракции (кроме селевкидов) происходит вылет в том, что для них в данных не установлена политическая партия. Селевкидам это сделали для тестирования и будущего открытия поэтому их получилось открыть.
Таблицы в которых надо вносить изменения это “political_parties” and “faction_political_parties_junctions”.
В двух словах что надо делать -
Добавьте две записи в "political_parties" для фракции, которую вы пытаетесь открыть, и убедитесь, что флаг одной из партий стоит, как «playable».
Заполните другие данные по мере необходимости.
Обратите внимание, "effect_bundle" является обязательным полем и представляет собой спец. трейт фракции / семьи (например, "арверны", "Barcid Династия"), а не группы фракций (например, "галльских племен», «Карфаген»).
Используйте "rom_dummy_bundle" или один из других, как заполнитель при необходимости, или создайте новый трейт фракции в таблице "effect_bundles" (с эффектами подключенными в таблице "effect_bundles_to_effects_junctions").
Поле "Ui_icon" является обязательным, но не используется. Поставьте там 'X' или типа того.
Затем в таблице "faction_political_parties_junctions" просто добавьте запись связывая каждую из новых политических партий с фракцией, которую вы пытаетесь разблокировать.
Обратите внимание, что политическая партия может быть назначена только одной фракции.
Все должно работать"
Может где-то непонятно перевел, надо пробовать тогда разберемся ))
**********
Таблицы для модификации юнитовbattle_entities.xml - хит-поинты, скорость и масса юнитов
land_units_to_unit_abilites_junctions.xml - специальные способности
land_units.xml - первичная статистика юнитов
main_units.xml - юниты или флот; стоимость юнитов
naval_units.xml - очки движения для морских и транспортных юнитов
Также есть файлы для речей генерала перед битвой.. pre_battle_speech_parameters_enum pre_battle_speech_types_enum pre_battle_speeches.. М.Б. их вернуть можно? )
**********
Как отредактировать сумму, выдаваемую в начале кампании фракциями?Открыть сэйв есф-эдитором, пройти по пути CAMPAIGN_ENV/CAMPAING_MODEL/WORLD/FACTION_ARRAY/FACTION_ARRAY - 0/FACTION_ECONOMICS (В выделенном месте соответственно выбираете свою фракцию), и редактируйте первую строчку.
**********
Как отредактировать иконки юнитов: Нажмите, чтобы прочитать
Итак, запускаем PackFileManager и открываем файл, data.pack который лежит примерно тут:
C:\Program Files (x86)\Steam\steamapps\common\Total War Rome II\data
P.S. Сразу делаем резервную копию данного файла, а то икать по ночам и узнавать о себе много нового я не хочу
Видим такую вот картину:
Последовательно жмем «плюсики» на папках ui =>units, а затем нажимаем правой кнопкой мыши на папке units и выбираем пункт Extract=>Extract Selected. Указываем папку куда выгрузить иконки юнитов и немного ждем.
Следуем в папку с выгруженными иконками и находим в ней папку mask, мы будем менять иконки для юнита «Велиты» римской фракции.
Находим в данной папке файл с именем rom_velites_mask_1.png и отрываем его в графическом редакторе способном работать со слоями. В моем примере будет использован Adobe Photoshop.
Делаем фон в данном файле полностью прозрачным и сохраняем его с тем же именем.
Важно! Прозрачный фон желательно использовать, если сама иконка юнита не будет содержать белый цвет.
Теперь открываем сам файл юнита, который мы будем заменять на новый. Иконки юнитов лежат в папке icons.
Находим rom_velites.png, открываем её в редакторе и заменяем своей иконкой:
Сохраням полученный нами файл с тем же именем, и возвращаемся в программу PackFileManager.
Идем в пункт Options и снимаем галочку с фразы CA Packs Are Read Only…
В появившимся окне выбираем пункт: I’m not afraid, coward!
При помощи плюсиков идем последовательно ui =>units=>mask. Находим в нехилом списке файлик с именем rom_velites_mask_1.png и удаляем его из *.pack файла.
P.S. Сам файл из пака не исчезнет, а лишь станет серого цвета, не паникуйте так и должно быть.
После этого добавляем на его место созданный нами файл маски:
Точно такие же действия проделываем с файлом rom_velites.png. Его пусть в пак файле ui =>units=>icons.
Сохраняем изменения в Pack File Manager, при этом он на какое-то время «подвиснет».
Запускаем игру и смотрим итог наших усилий…
C:\Program Files (x86)\Steam\steamapps\common\Total War Rome II\data
P.S. Сразу делаем резервную копию данного файла, а то икать по ночам и узнавать о себе много нового я не хочу
Видим такую вот картину:
Последовательно жмем «плюсики» на папках ui =>units, а затем нажимаем правой кнопкой мыши на папке units и выбираем пункт Extract=>Extract Selected. Указываем папку куда выгрузить иконки юнитов и немного ждем.
Следуем в папку с выгруженными иконками и находим в ней папку mask, мы будем менять иконки для юнита «Велиты» римской фракции.
Находим в данной папке файл с именем rom_velites_mask_1.png и отрываем его в графическом редакторе способном работать со слоями. В моем примере будет использован Adobe Photoshop.
Делаем фон в данном файле полностью прозрачным и сохраняем его с тем же именем.
Важно! Прозрачный фон желательно использовать, если сама иконка юнита не будет содержать белый цвет.
Теперь открываем сам файл юнита, который мы будем заменять на новый. Иконки юнитов лежат в папке icons.
Находим rom_velites.png, открываем её в редакторе и заменяем своей иконкой:
Сохраням полученный нами файл с тем же именем, и возвращаемся в программу PackFileManager.
Идем в пункт Options и снимаем галочку с фразы CA Packs Are Read Only…
В появившимся окне выбираем пункт: I’m not afraid, coward!
При помощи плюсиков идем последовательно ui =>units=>mask. Находим в нехилом списке файлик с именем rom_velites_mask_1.png и удаляем его из *.pack файла.
P.S. Сам файл из пака не исчезнет, а лишь станет серого цвета, не паникуйте так и должно быть.
После этого добавляем на его место созданный нами файл маски:
Точно такие же действия проделываем с файлом rom_velites.png. Его пусть в пак файле ui =>units=>icons.
Сохраняем изменения в Pack File Manager, при этом он на какое-то время «подвиснет».
Запускаем игру и смотрим итог наших усилий…
Переодевание юнитов в Рим 2.
Когда брался переводить тутор от ]]>Jack Lusted]]> не вникал в его суть, но в процессе понял что опять это скакание по верхам и "суньте туда высуньте оттуда", так что малость(может не малость) расширю его, так как модингом Тотала занимаюсь пару часов, не судите строго. Как только вы посмотрите не накосячил ли я где или у вас будут дополнения, я закину его в шапку Нажмите, чтобы прочитать
Пока нам не доступно создание новых моделей, и импорт их в игру, мы можем использовать лишь те модели что есть, но мы может править текстуры, плюс Рим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! , это позволит нам перезаписать исходные файлы
Теперь мы видим следующую картину:
Мы видим структуру папок в которой у нас отобразились файлы в данном случаи это файлы юнитов, я так же как и автор исходного тутора выбрал gre_hippeus_lancers.variantmeshdefinition открыл его и увидел следующие:
Теперь давайте поговорим о структуре файла. В первую очередь хочется отметить довольно интуитивно понятные записи всех паков, не всматриваетесь, как в код пока не освоились, а читайте как книгу, при переводе 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 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 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 что это можно прочесть ]]>ТУТ]]>
Теперь на примере другого файла шлема с гребнем, рассмотрим более детально его структуру:
<VARIANT_MESH>
<SLOT name="helmets" > Слот шлема
<VARIANT_MESH model="VariantMeshes/_VariantModels/man/helmets/roman_montefortino.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/helmets/roman_montefortino.rigid_model_v2" >Сам шлем
<SLOT name="top_crests" 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 name="side_crests" /> Гребень с боку, его нет
</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 name="top_crests" probability ="0.8" attach_point="crest_centre" >
<VARIANT_MESH model="VariantMeshes/_VariantModels/man/crests/black_feather_03.rigid_model_v2" />
</SLOT>
<SLOT name="side_crests" />
</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 name="top_crests" 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 name="side_crests" />
</VARIANT_MESH>
</SLOT>
</VARIANT_MESH>
Вы видите что тут тоже есть значительно рандомное разнообразие.
Теперь перейдём ещё к одному моменту это модели щитов:
hellenic_hoplon_painted_hoplite
<VARIANT_MESH>
<SLOT name="shields" > Слот самого щита, далее его вариации
<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редакторе. Все текстуры нужных вам мешей носят те названия, если нет уточнений как в примере с файлами текстур масок для щитов
Мы не будем создавать мод мы будем переписывать ванилу, как создавать мод это уже отдельный разговор не относящийся к вопросу тутора.
В первую очередь скачиваем вот этот инструмент 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! , это позволит нам перезаписать исходные файлы
Теперь мы видим следующую картину:
Мы видим структуру папок в которой у нас отобразились файлы в данном случаи это файлы юнитов, я так же как и автор исходного тутора выбрал gre_hippeus_lancers.variantmeshdefinition открыл его и увидел следующие:
Теперь давайте поговорим о структуре файла. В первую очередь хочется отметить довольно интуитивно понятные записи всех паков, не всматриваетесь, как в код пока не освоились, а читайте как книгу, при переводе 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 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 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 что это можно прочесть ]]>ТУТ]]>
Теперь на примере другого файла шлема с гребнем, рассмотрим более детально его структуру:
<VARIANT_MESH>
<SLOT name="helmets" > Слот шлема
<VARIANT_MESH model="VariantMeshes/_VariantModels/man/helmets/roman_montefortino.rigid_model_v2" imposter_model="VariantMeshes/_VariantModels/man/helmets/roman_montefortino.rigid_model_v2" >Сам шлем
<SLOT name="top_crests" 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 name="side_crests" /> Гребень с боку, его нет
</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 name="top_crests" probability ="0.8" attach_point="crest_centre" >
<VARIANT_MESH model="VariantMeshes/_VariantModels/man/crests/black_feather_03.rigid_model_v2" />
</SLOT>
<SLOT name="side_crests" />
</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 name="top_crests" 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 name="side_crests" />
</VARIANT_MESH>
</SLOT>
</VARIANT_MESH>
Вы видите что тут тоже есть значительно рандомное разнообразие.
Теперь перейдём ещё к одному моменту это модели щитов:
hellenic_hoplon_painted_hoplite
<VARIANT_MESH>
<SLOT name="shields" > Слот самого щита, далее его вариации
<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редакторе. Все текстуры нужных вам мешей носят те названия, если нет уточнений как в примере с файлами текстур масок для щитов
Редактирование анимации в Rom2
Компиляция: используем ресурсы игры. Сам исходный код курсивом Нажмите, чтобы прочитать
В игре есть юнит "Критские лучники", которые не используют свой щит в рукопашной схватке. Это можно исправить.
Нам понадобиться PFM(пакфайлменеджер) и три файла из data_rome2.pack.
Открываем в PFM data_rome2.pack, находим файл animation_tables.txt(data_rome2.pack\animation\animation_tables\),
извлекаем animation_tables.txt(пкм по файлу Extract Selected) куда Вам удобно. Открываем animation_tables.txt любым текстовым редактором, находим блок анимации "rome_man_bow":
animation_table rome_man_bow
{
skeleton_type rome_man_game
skeleton_type_cinematic rome_man
fragment rome_man_unarmed_fragment
fragment rome_man_cinematic_fragment
fragment rome_man_sword_fragment
fragment rome_man_sword_matched_combat_fragment
fragment rome_man_bow_fragment
}
Мы видим , что блок состоит из нескольких строк:
animation_table rome_man_bow - название блока анимации(понадобится нам в таблице land_units: data_rome2.pack\db\land_units_tables\)
{ - начало блока
skeleton_type - тип скелета
skeleton_type_cinematic - предполагю-движение скелета, связанное с его типом
Эти две строки нам не понадобиться менять(пока).Далее:
fragment - из этих fragment-ов и состоит анимация(движение) юнита в игре, с ними и будем работать, точнее с третьим и четвёртым.
} - конец блока
В data_rome2.pack(как и в data.pack) открываем animation_fragments(data_rome2.pack\animations\animation_fragments\), где видим эти самые fragments. Т.е. строки "fragment rome_man_unarmed_fragment" и т.д и т.п. ссылаються именно на папку animation_fragments. Выбираем из "списка" то ,что нам нужно, а именно:rome_man_sword_shield_fragment(мечник со щитом) и rome_men_sword_shield_matched_combat_fragment(движение юнита в бою).
Создаём новый блок анимации в animation_tables.txt(добавляем), назовём его "animation_table rome_man_bow_shield":
animation_table rome_man_bow_shield
{
skeleton_type rome_man_game
skeleton_type_cinematic rome_man
fragment rome_man_unarmed_fragment
fragment rome_man_cinematic_fragment
fragment rome_man_sword_fragment
fragment rome_man_sword_matched_combat_fragment
fragment rome_man_bow_fragment
}
Но в этой анимации не предполагаеться использование щита, только лук или меч. Заменяем строку "rome_man_sword_fragment" на "rome_man_sword_shield_fragment", а "rome_man_sword_matched_combat" на "rome_men_sword_shield_matched_combat_fragment":
animation_table rome_man_bow_shield
{
skeleton_type rome_man_game
skeleton_type_cinematic rome_man
fragment rome_man_unarmed_fragment
fragment rome_man_cinematic_fragment
fragment rome_man_sword_shield_fragment
fragment rome_man_sword_shield_matched_combat_fragment
fragment rome_man_bow_fragment
}
Далее необходимо "присвоить" нашу новую анимацию выбранному юниту. При помощи всё того же PFM извлекаем из data_rome2.pack файл land_units_tables куда хотите. Создаём свой pack(мод). В PFM File>New или Ctr+N, по умолчанию он будет называться "Untitled.pack". В этот "pack" мы добавляем(пкм по Untitled.pack>Add>Directory...или Shift+Ins) нашу папку(diretory) animations с нашим animation_tables и папку(diretory) db с land_units_tables. Сохраняем наш pack (по умолчанию в папке data игры), называем как хочется (у меня-anim_bow_shield.pack). Открываем land_units_tables(конечно в PFM). Находим нашего юнита (критских лучников целых три: Aux_Gre_Cretan_Archers, Gre_Cretan_Archers и Mer_Gre_Cretan_Archers, но модель у них одна на всех)и в колонке man_animation заменяем rome_man_bow на нашу rome_man_bow_shield, сохраняем(Save) наш pack(мод). Запускаем с помощью модменеджера или прописываем user.script.txt и любуемся результатами труда.
Нам понадобиться PFM(пакфайлменеджер) и три файла из data_rome2.pack.
Открываем в PFM data_rome2.pack, находим файл animation_tables.txt(data_rome2.pack\animation\animation_tables\),
извлекаем animation_tables.txt(пкм по файлу Extract Selected) куда Вам удобно. Открываем animation_tables.txt любым текстовым редактором, находим блок анимации "rome_man_bow":
animation_table rome_man_bow
{
skeleton_type rome_man_game
skeleton_type_cinematic rome_man
fragment rome_man_unarmed_fragment
fragment rome_man_cinematic_fragment
fragment rome_man_sword_fragment
fragment rome_man_sword_matched_combat_fragment
fragment rome_man_bow_fragment
}
Мы видим , что блок состоит из нескольких строк:
animation_table rome_man_bow - название блока анимации(понадобится нам в таблице land_units: data_rome2.pack\db\land_units_tables\)
{ - начало блока
skeleton_type - тип скелета
skeleton_type_cinematic - предполагю-движение скелета, связанное с его типом
Эти две строки нам не понадобиться менять(пока).Далее:
fragment - из этих fragment-ов и состоит анимация(движение) юнита в игре, с ними и будем работать, точнее с третьим и четвёртым.
} - конец блока
В data_rome2.pack(как и в data.pack) открываем animation_fragments(data_rome2.pack\animations\animation_fragments\), где видим эти самые fragments. Т.е. строки "fragment rome_man_unarmed_fragment" и т.д и т.п. ссылаються именно на папку animation_fragments. Выбираем из "списка" то ,что нам нужно, а именно:rome_man_sword_shield_fragment(мечник со щитом) и rome_men_sword_shield_matched_combat_fragment(движение юнита в бою).
Создаём новый блок анимации в animation_tables.txt(добавляем), назовём его "animation_table rome_man_bow_shield":
animation_table rome_man_bow_shield
{
skeleton_type rome_man_game
skeleton_type_cinematic rome_man
fragment rome_man_unarmed_fragment
fragment rome_man_cinematic_fragment
fragment rome_man_sword_fragment
fragment rome_man_sword_matched_combat_fragment
fragment rome_man_bow_fragment
}
Но в этой анимации не предполагаеться использование щита, только лук или меч. Заменяем строку "rome_man_sword_fragment" на "rome_man_sword_shield_fragment", а "rome_man_sword_matched_combat" на "rome_men_sword_shield_matched_combat_fragment":
animation_table rome_man_bow_shield
{
skeleton_type rome_man_game
skeleton_type_cinematic rome_man
fragment rome_man_unarmed_fragment
fragment rome_man_cinematic_fragment
fragment rome_man_sword_shield_fragment
fragment rome_man_sword_shield_matched_combat_fragment
fragment rome_man_bow_fragment
}
Далее необходимо "присвоить" нашу новую анимацию выбранному юниту. При помощи всё того же PFM извлекаем из data_rome2.pack файл land_units_tables куда хотите. Создаём свой pack(мод). В PFM File>New или Ctr+N, по умолчанию он будет называться "Untitled.pack". В этот "pack" мы добавляем(пкм по Untitled.pack>Add>Directory...или Shift+Ins) нашу папку(diretory) animations с нашим animation_tables и папку(diretory) db с land_units_tables. Сохраняем наш pack (по умолчанию в папке data игры), называем как хочется (у меня-anim_bow_shield.pack). Открываем land_units_tables(конечно в PFM). Находим нашего юнита (критских лучников целых три: Aux_Gre_Cretan_Archers, Gre_Cretan_Archers и Mer_Gre_Cretan_Archers, но модель у них одна на всех)и в колонке man_animation заменяем rome_man_bow на нашу rome_man_bow_shield, сохраняем(Save) наш pack(мод). Запускаем с помощью модменеджера или прописываем user.script.txt и любуемся результатами труда.
Полный обзор системы построек
Нажмите, чтобы прочитать
Терминология и подробный разбор таблиц:
Терминология:
• Структура – описание группы параметров, которые включает в себя одна постройка (например, Загоны для скота)
• Субцепь – одиночная линия развития в цепи (например, линия Загоны для скота – Усадьба с выпасом – Скотный двор)
• Инстанция – группа из одной или более линий развития в цепи
• Цепь – группа субцепей, начинающаяся с первоначальной структуры для фракции/культуры (например, Земледелие)
• Суперцепь – группировка цепей, имеющих общие параметры для любой группы фракций/культур
Структура таблиц:
• Building_superchains
o Building_chains
Building_levels
• Building_effects_junction
• Building_level_required_technology
• Building_units_allowed
• Building_level_armed_citizenry_junctions
• Building_upgrades_junction
• Building_cultural_variants
o Building_culture_variants.loc
o Building_short_description_texts.loc
o Building_flavour_texts.loc
• Building_instances
• Campaign_settlement_display_buildings
o Campaign_settlement_display_buildings_ids
o Campaign_settlement_display_buildings_construction
• Cai_base_building_context_values
Building_chain_availabilities
Building_set_to_building_junctions
• Building_sets
Cai_construction_system_buildings_values
Подробный разбор таблиц:
Building_superchains
• Описывает группу цепей, имеющих одинаковые параметры в разных культурах/фракциях. Также описывает, в какие структуры можно превратить что-либо при заимствовании зданий из других субкультур
• Колонку maxinstances_per_region можно не использовать
Building_chains
• Описывает первоначальную структуру, от которой ответвляются все остальные структуры, в группе структур для культуры/фракции
• Задает категорию цепи и привязывает ее к суперцепи
Building_levels
• Описывает каждую отдельную структуру, которая может быть построена
• Ключевые параметры, такие как цепь, уровень постройки, цена постройки, необходимое для строительства количество ходов, уникальная фракция, необходимые ресурсы и инстанция описываются здесь
• Возможные будущие характеристики, в данный момент не используемые (стоимость содержания, стоимость разрушения, рост благополучия и т.п.)
Building_chain_availabilities
• Описывает, какие культуры используют данную цепь
• Также дополнительные поля для субкультур или фракций
Building_set_to_building_junctions
• Описывает, к какой категории (set) относится каждая цепь или структура (сельское хозяйство, город, промышленность, порт, религия, водопровод и канализация и т.д.)
• Если конкретная структура относится (одновременно) к другой категории, это описывается дополнительно
Cai_construction_system_buildings_values
• Используется ИИ для того, чтобы он знал, как строить здания
Building_effects_junction
• Описывает, какие эффекты будет иметь построенное здание
• Также могут быть заданы значения для каждого эффекта при поврежденном или разрушенном здании
Building_level_required_technology
• Описывает, какие технологии необходимы для постройки здания
• Должны быть описаны абсолютно все необходимые технологии, не только та, что разблокирует структуру
Building_units_allowed
• Описывает, какие юниты могут быть наняты при построенном здании
• Колонку Experience можно не использовать
Building_level_armed_citizenry_junctions
• Описывает гарнизон, появляющийся после постройки здания в регионе
• Упоминаемые группы юнитов описаны в armed_citizenry_groups
Building_upgrades_junction
• Описывает связи между структурами в цепи
• Позволяет разветвлять цепи (у каждой структуры, не только у первоначальной, может быть два или более апгрейда на каждом уровне)
Building_cultural_variants
• Описывает, какие культуры могут использовать эту структуру (постройку)
• Устанавливает иконку для постройки (ссылка ui/buildings/*.png)
• Дополнительная колонка для ограничения использования структуры в пределах субкультуры или фракции
Building_instances
• Описывает группировки субцепей по типу
• Членство в группе описывается в building_levels
• Может быть использована для создания взаимной исключительности субцепей (?) или для создания множества структур из одной субцепи (ни то, ни другое не было использовано в ванилле)
Campaign_settlement_display_buildings
• Описывает модель, которая будет показываться, как только постройка будет возведена
• Ключевая ссылка (? – references key) описывается в campaign_display_building_ids, не в id постройки (хотя это может быть один и тот же id)
Cai_base_building_context_values
• Заявляет структуры для ИИ
Building_sets
• Описывает широкие категории (broad categories) построек
• Используется для определения, какие здания подвержены влиянию (негативному) конкретных эффектов (эффекты описаны в effect_bonus_value_building_set_junctions)
Building_culture_variants.loc
• Имя структуры
• Ключевой формат: building_culture_variants_name_<id постройки><id культуры><id субкультуры>
• Оставьте поля культуры/субкультуры пустыми, если они не прописаны в db таблице building_culture_variants
Building_short_description_texts.loc
• Короткое предложение, описывающее структуру (постройку)
• Ключ задан в building_culture_variants в формате: building_short_descriptions_texts_short_description_<ключ>
Building_flavour_texts.loc
• Длинное описания, обычно включающее исторические данные. Появляется в сообщении о событии (event message), когда структура (постройка) закончена.
• Ключ задан в building_cultural_variants в формате: building_flavour_texts_flavour_<ключ>
Campaign_settlement_display_building_ids
• Описывает связь между ключами структуры и ключами отображаемой модели для построек на стратегической карте
• Ключ структуры может быть таким же, как и ключ модели
Campaign_settlement_display_building_construction
• Записи, необходимые для создания анимации строительства и разрушения здания (на стратегической карте)
• Нужна ссылка на ключ отображаемой модели, не на ключ структурыСоздание новой структуры в существующей субцепи:
Для создания совершенно новой структуры в существующей цепи вам нужна таблица Building_levels и большинство ее подуровней (все до Campaign_settlement_display_building_construction) в вашем packфайле. Эффекты, технологии, юниты и гарнизон добавляются в зависимости от назначения структуры, но если вы делаете больше одной постройки, то в любом случае лучше сразу их охватить.
Таким образом, ваш Building_mod.pack должен начинаться со следующих таблиц:
Building_levels:
Первый шаг в описании новой структуры – описание ее базовых параметров и присвоение ей имени, на которое можно будет ссылаться (ключа). Я добавил 5 уровень к главной линии развития эллинистического города, используя ключ: rom_HELLENIC_city_major_5_Crzy
Как и в большинстве случаев, описанных в данном туториале, быстрейший способ сделать то, что нужно – скопировать строку структуры, предшествующей вашей создающейся структуре. В данном случае это rom_HELLENIC_city_major_4. В колонке levelnameнужно написать новый ключ, в колонку levelдобавить 1 и изменить содержимое колонки uniqueindex на уникальное значение. Также можно задать значения колонок createtime(время создания) и createcost(цена создания), но это необязательно.
Building_upgrades_junction
Следующий шаг – связывание новой структуры с предшествующей постройкой (той, из которой делается апгрейд на новую постройку). Нужно просто поместить предшествующую постройку в колонку from (в данном случае это rom_HELLENIC_city_major_4), а новую постройку в колонку to(в данном случае rom_HELLENIC_city_major_5_Crzy).
Building_culture_variants
Это последняя таблица, необходимая для того, чтобы ваша новая структура показывалась в игре. Простейший путь – опять же копирование строки предыдущей постройки в цепи. Важные колонки здесь – icon, shortdescriptionи flavour. В колонке iconсодержится имя изображения в формате *.pngс установленными параметрами, которое будет показываться в UIкак только здание будет построено, остальные две колонки содержат ссылки на текстовые описания из locфайлов, которые мы добавим позже. После копирования предыдущей строки все, что нужно – сменить ключ постройки на новый ключ нашей структуры.
Campaign_settlement_display_buildings
Если эта таблица не заполнена, при постройке вашего нового здания на стратегической карте на его месте окажется лишь большая круглая дыра.
Чтобы этого не произошло, нужно обратиться к таблице campaign_settlement_display_building_ids и создать связь между ключом новой структуры и ключом модели на стратегической карте. Проще всего сделать оба ключа одинаковыми, так, как это показано в первых двух колонках нижеследующей таблицы (остальные колонки следует заполнить опять же копированием информации из предыдущей структуры).
Затем нужно вернуться в Campaign_display_buildings и еще раз скопировать строку предыдущей постройки. Изменить значение колонки keyна любой придуманный уникальный ключ, а в колонку displaybuilding поместить только что описанный ключ отображаемой модели.
Наконец, чтобы создать анимацию строительных кранов в течение строительства/разрушения постройки, нужно обратиться к таблице campaign_settlement_display_building_construction. Скопируйте любые 2 строки, в колонке idприсвойте им два любых уникальных значения, убедитесь, что в колонке constructiontype в одной строке стоит "default", а в другой "dismantle" и измените значение колонки displaybuildingkey на ключ вашей постройки.
Теперь у вашей новой структуры есть отображаемая модель на стратегической карте (она будет такой же, как и у постройки предыдущего уровня, если только у вас нет подходящей модели для добавления в Campaign_display_buildings).
Buildings_level_required_technology
Эта таблица устанавливает необходимый для разблокировки новой постройки уровень технологического развития. Она очень проста – в первую колонку следует поместить ключ новой постройки, во вторую – необходимые для создания новой постройки технологии. Желательно описать все необходимые технологии, а не только ту, что непосредственно разблокирует постройку.
Building_effects_junctions
Здесь описываются эффекты от постройки, такие как установленный доход, бонус к доходу в процентах, пища, загрязнение и т.д. В данной таблице не описываются гарнизон и найм юнитов.
В целом таблица не требует особых разъяснений. Первая колонка – ключ вашей структуры, во второй колонке описывается эффект, который вы хотите ей придать (полный список эффектов можно найти в effects_tables в data_rome2.pack). Третья колонка описывает, как широко будет применяться эффект, а последние три колонки задают значение эффекта при нормальном, поврежденном и полностью разрушенном здании соответственно.
Я установил для своего здания одиночный эффект – повышение дохода города на 3000 следующей записью:
Building_units_allowed
Эта таблица устанавливает, какие юниты могут быть наняты при построенном здании.
В настоящий момент известно значение только 4 колонок этой таблицы – это колонки: key (уникальный номер id), building (ключ постройки), unit (idнанимаемого юнита) и XP(устанавливается количество опыта, который будет иметь нанятый юнит).
Для моей структуры я добавил только одного юнита, Царские пельтасты, и установил для них значение опыта 3:
Building_level_armed_citizenry_junctions
Эта таблица отвечает за группы гарнизонных юнитов, которые появятся, если поселение с возведенной постройкой будет атаковано. Многие гарнизонные группы уже прописаны в таблице armed_citizenry_unit_groups. Вы также можете создать свою гарнизонную группу с помощью таблицы armed_citizenry_units_to_unit_groups_junctions.
Эта таблица состоит из 4 колонок: id (уникальный номер), buildinglevel (ключ новой постройки), колонка с неизвестным значением и колонка unitgroup (появляющаяся гарнизонная группа).
Следующей записью я добавляю для моей постройки нескольких юнитов ближнего боя, используя гарнизонную группу rom_hellenic_strong_melee:
Теперь для завершения создания новой структуры осталось только добавить UIэлементы.
building_culture_variants.loc
Здесь описывается имя новой постройки, которое будет отображаться в игре. Формат ключа постройки (в колонке Tag) в этой таблице таков: building_culture_variants_name_<id постройки><id культуры><id субкультуры><id фракции>
Субкультуру и фракцию нужно прописывать только если они были прописаны в таблице culture_variants.
building_short_description_texts
Отвечает за короткое описание под именем постройки. Формат ключа в этой таблице: building_short_description_texts_short_description_<ключ, написанный в колонке shortdescription таблицы culture_variants >
building_flavour_texts
Я не вполне уверен, где именно в игре отображается информация из этой таблицы, но в ней обычно пишется несколько предложений, описывающих назначение постройки.
Заполняется аналогично предыдущей таблице. Формат ключа: building_flavour_texts_flavour_<ключ, написанный в колонке flavourтаблицы culture_variants>
Иконка
Для завершения новой структуры нужна иконка для UI. Она должна быть изображением в формате PNGразрешением 66x66 пикселей с точно таким же названием, как прописано в колонке icon таблицы culture_variants.
Добавьте иконку в свой packфайл с путем: ui/buildings/icons/<имя файла>.png
На этом создание новой структуры закончено.
ПРИМЕЧАНИЕ
Для того, чтобы ИИ мог использовать новую структуру, нужны следующие таблицы.
cai_base_building_context_values
Скопируйте строку предыдущей постройки и вставьте туда (с заменой) ключ своей новой структуры.
cai_construction_system_building_values
Если вы добавляете новую структуру в конец существующей субцепи, вам нужно найти ключ существующей структуры и заменить значение колонки building_range_end_inclusive данными своей структуры. Если вы создали новое ответвление субцепи, вам нужно скопировать строку и заменить ту же запись на данные вашей новой постройки.Создание новой субцепи:
Создать новую субцепь (линию развития) очень просто. Вам понадобится всего 2 элементарных шага:
1) Создать новый ключ субцепи (также известен как buildinginstance). Можно использовать и существующий ключ, но в большинстве случаев вам понадобится новый (позже я объясню, почему).
2) Соединение вместе 1 или более структур для формирования линии развития субцепи, подобно тому, что вы делали для добавления новой структуры в существующую субцепь.
building_instances
Очень простая таблица, состоит из ключа и целого числа.
Формат ключа неизвестен (предположительно <цепь>_<инстанция>), поэтому для описания продовольственных инстанций цепи порта будет использован ключ rom_Port_Food, а для экономических инстанций – ключ rom_Port_Trade. Для примера я собираюсь создать новую субцепь порта, для чего добавляю ключ rom_Port_Crzy.
Целое число – это количество субцепей этой группы, которые могут быть построены в 1 регионе (1 городе). В ванилле этот параметр установлен на 1 (поэтому нельзя построить 3 одинаковых постройки в 1 регионе). Как правило, именно так и следует создавать новые субцепи (число 1 подходит для большинства случаев). Интересно то, что несколько субцепей могут иметь одну инстанцию, то есть если вы создаете 2 субцепи с одной инстанцией (у которой прописано 1 в колонке лимита), в каждом регионе можно будет построить только 1 из этих субцепей). Таким образом, вы можете создавать взаимоисключающие субцепи (в этом случае вы будете использовать существующий ключ субцепи, не создавать новый).
building_upgrades
Так же, как и раньше, свяжите первоначальную структуру с первой из ваших новых структур, первую со второй и т.д.
Теперь новая субцепь создана (добавлена к главному римскому порту).
Создание новой цепи построек:
Для создания новой цепи понадобится 2 шага:
1) Заявить новую цепь, установить ее категорию и привязать ее к суперцепи
2) Установить, какие культуры/субкультуры/фракции могут строить здания из этой цепи
building_chains
В этой таблице важны 3 колонки. В колонке keyсодержится внутреннее имя цепи, которое должно быть уникальным (его следует придумать). Колонка chain_category, по-видимому, используется в основном ИИ и содержит в себе название одной из 3 категорий цепи (military(военная), happiness(счастье/благополучие) и money(деньги)). Колонка building_superchain привязывает цепь к определенной суперцепи.
Я создал следующую запись для моей новой цепи амуниции:
building_chain_availabilities
Сокращенная версия таблицы building_culture_variants. Здания, входящие в вашу цепочку, должны соответствовать записям в обеих этих таблицах.
Примечание: Для первой постройки в цепи должен быть установлен уровень 0 в таблице building_levels.
На этом создание новой цепи построек завершено.Создание новой суперцепи:
Фалы примеров для пособия+.doc версия данного руководства: ]]>Скачать]]>
Нажмите, чтобы прочитать
Терминология:
• Структура – описание группы параметров, которые включает в себя одна постройка (например, Загоны для скота)
• Субцепь – одиночная линия развития в цепи (например, линия Загоны для скота – Усадьба с выпасом – Скотный двор)
• Инстанция – группа из одной или более линий развития в цепи
• Цепь – группа субцепей, начинающаяся с первоначальной структуры для фракции/культуры (например, Земледелие)
• Суперцепь – группировка цепей, имеющих общие параметры для любой группы фракций/культур
Структура таблиц:
• Building_superchains
o Building_chains
Building_levels
• Building_effects_junction
• Building_level_required_technology
• Building_units_allowed
• Building_level_armed_citizenry_junctions
• Building_upgrades_junction
• Building_cultural_variants
o Building_culture_variants.loc
o Building_short_description_texts.loc
o Building_flavour_texts.loc
• Building_instances
• Campaign_settlement_display_buildings
o Campaign_settlement_display_buildings_ids
o Campaign_settlement_display_buildings_construction
• Cai_base_building_context_values
Building_chain_availabilities
Building_set_to_building_junctions
• Building_sets
Cai_construction_system_buildings_values
Подробный разбор таблиц:
Building_superchains
• Описывает группу цепей, имеющих одинаковые параметры в разных культурах/фракциях. Также описывает, в какие структуры можно превратить что-либо при заимствовании зданий из других субкультур
• Колонку maxinstances_per_region можно не использовать
Building_chains
• Описывает первоначальную структуру, от которой ответвляются все остальные структуры, в группе структур для культуры/фракции
• Задает категорию цепи и привязывает ее к суперцепи
Building_levels
• Описывает каждую отдельную структуру, которая может быть построена
• Ключевые параметры, такие как цепь, уровень постройки, цена постройки, необходимое для строительства количество ходов, уникальная фракция, необходимые ресурсы и инстанция описываются здесь
• Возможные будущие характеристики, в данный момент не используемые (стоимость содержания, стоимость разрушения, рост благополучия и т.п.)
Building_chain_availabilities
• Описывает, какие культуры используют данную цепь
• Также дополнительные поля для субкультур или фракций
Building_set_to_building_junctions
• Описывает, к какой категории (set) относится каждая цепь или структура (сельское хозяйство, город, промышленность, порт, религия, водопровод и канализация и т.д.)
• Если конкретная структура относится (одновременно) к другой категории, это описывается дополнительно
Cai_construction_system_buildings_values
• Используется ИИ для того, чтобы он знал, как строить здания
Building_effects_junction
• Описывает, какие эффекты будет иметь построенное здание
• Также могут быть заданы значения для каждого эффекта при поврежденном или разрушенном здании
Building_level_required_technology
• Описывает, какие технологии необходимы для постройки здания
• Должны быть описаны абсолютно все необходимые технологии, не только та, что разблокирует структуру
Building_units_allowed
• Описывает, какие юниты могут быть наняты при построенном здании
• Колонку Experience можно не использовать
Building_level_armed_citizenry_junctions
• Описывает гарнизон, появляющийся после постройки здания в регионе
• Упоминаемые группы юнитов описаны в armed_citizenry_groups
Building_upgrades_junction
• Описывает связи между структурами в цепи
• Позволяет разветвлять цепи (у каждой структуры, не только у первоначальной, может быть два или более апгрейда на каждом уровне)
Building_cultural_variants
• Описывает, какие культуры могут использовать эту структуру (постройку)
• Устанавливает иконку для постройки (ссылка ui/buildings/*.png)
• Дополнительная колонка для ограничения использования структуры в пределах субкультуры или фракции
Building_instances
• Описывает группировки субцепей по типу
• Членство в группе описывается в building_levels
• Может быть использована для создания взаимной исключительности субцепей (?) или для создания множества структур из одной субцепи (ни то, ни другое не было использовано в ванилле)
Campaign_settlement_display_buildings
• Описывает модель, которая будет показываться, как только постройка будет возведена
• Ключевая ссылка (? – references key) описывается в campaign_display_building_ids, не в id постройки (хотя это может быть один и тот же id)
Cai_base_building_context_values
• Заявляет структуры для ИИ
Building_sets
• Описывает широкие категории (broad categories) построек
• Используется для определения, какие здания подвержены влиянию (негативному) конкретных эффектов (эффекты описаны в effect_bonus_value_building_set_junctions)
Building_culture_variants.loc
• Имя структуры
• Ключевой формат: building_culture_variants_name_<id постройки><id культуры><id субкультуры>
• Оставьте поля культуры/субкультуры пустыми, если они не прописаны в db таблице building_culture_variants
Building_short_description_texts.loc
• Короткое предложение, описывающее структуру (постройку)
• Ключ задан в building_culture_variants в формате: building_short_descriptions_texts_short_description_<ключ>
Building_flavour_texts.loc
• Длинное описания, обычно включающее исторические данные. Появляется в сообщении о событии (event message), когда структура (постройка) закончена.
• Ключ задан в building_cultural_variants в формате: building_flavour_texts_flavour_<ключ>
Campaign_settlement_display_building_ids
• Описывает связь между ключами структуры и ключами отображаемой модели для построек на стратегической карте
• Ключ структуры может быть таким же, как и ключ модели
Campaign_settlement_display_building_construction
• Записи, необходимые для создания анимации строительства и разрушения здания (на стратегической карте)
• Нужна ссылка на ключ отображаемой модели, не на ключ структуры
Нажмите, чтобы прочитать
Для создания совершенно новой структуры в существующей цепи вам нужна таблица Building_levels и большинство ее подуровней (все до Campaign_settlement_display_building_construction) в вашем packфайле. Эффекты, технологии, юниты и гарнизон добавляются в зависимости от назначения структуры, но если вы делаете больше одной постройки, то в любом случае лучше сразу их охватить.
Таким образом, ваш Building_mod.pack должен начинаться со следующих таблиц:
Building_levels:
Первый шаг в описании новой структуры – описание ее базовых параметров и присвоение ей имени, на которое можно будет ссылаться (ключа). Я добавил 5 уровень к главной линии развития эллинистического города, используя ключ: rom_HELLENIC_city_major_5_Crzy
Как и в большинстве случаев, описанных в данном туториале, быстрейший способ сделать то, что нужно – скопировать строку структуры, предшествующей вашей создающейся структуре. В данном случае это rom_HELLENIC_city_major_4. В колонке levelnameнужно написать новый ключ, в колонку levelдобавить 1 и изменить содержимое колонки uniqueindex на уникальное значение. Также можно задать значения колонок createtime(время создания) и createcost(цена создания), но это необязательно.
Building_upgrades_junction
Следующий шаг – связывание новой структуры с предшествующей постройкой (той, из которой делается апгрейд на новую постройку). Нужно просто поместить предшествующую постройку в колонку from (в данном случае это rom_HELLENIC_city_major_4), а новую постройку в колонку to(в данном случае rom_HELLENIC_city_major_5_Crzy).
Building_culture_variants
Это последняя таблица, необходимая для того, чтобы ваша новая структура показывалась в игре. Простейший путь – опять же копирование строки предыдущей постройки в цепи. Важные колонки здесь – icon, shortdescriptionи flavour. В колонке iconсодержится имя изображения в формате *.pngс установленными параметрами, которое будет показываться в UIкак только здание будет построено, остальные две колонки содержат ссылки на текстовые описания из locфайлов, которые мы добавим позже. После копирования предыдущей строки все, что нужно – сменить ключ постройки на новый ключ нашей структуры.
Campaign_settlement_display_buildings
Если эта таблица не заполнена, при постройке вашего нового здания на стратегической карте на его месте окажется лишь большая круглая дыра.
Чтобы этого не произошло, нужно обратиться к таблице campaign_settlement_display_building_ids и создать связь между ключом новой структуры и ключом модели на стратегической карте. Проще всего сделать оба ключа одинаковыми, так, как это показано в первых двух колонках нижеследующей таблицы (остальные колонки следует заполнить опять же копированием информации из предыдущей структуры).
Затем нужно вернуться в Campaign_display_buildings и еще раз скопировать строку предыдущей постройки. Изменить значение колонки keyна любой придуманный уникальный ключ, а в колонку displaybuilding поместить только что описанный ключ отображаемой модели.
Наконец, чтобы создать анимацию строительных кранов в течение строительства/разрушения постройки, нужно обратиться к таблице campaign_settlement_display_building_construction. Скопируйте любые 2 строки, в колонке idприсвойте им два любых уникальных значения, убедитесь, что в колонке constructiontype в одной строке стоит "default", а в другой "dismantle" и измените значение колонки displaybuildingkey на ключ вашей постройки.
Теперь у вашей новой структуры есть отображаемая модель на стратегической карте (она будет такой же, как и у постройки предыдущего уровня, если только у вас нет подходящей модели для добавления в Campaign_display_buildings).
Buildings_level_required_technology
Эта таблица устанавливает необходимый для разблокировки новой постройки уровень технологического развития. Она очень проста – в первую колонку следует поместить ключ новой постройки, во вторую – необходимые для создания новой постройки технологии. Желательно описать все необходимые технологии, а не только ту, что непосредственно разблокирует постройку.
Building_effects_junctions
Здесь описываются эффекты от постройки, такие как установленный доход, бонус к доходу в процентах, пища, загрязнение и т.д. В данной таблице не описываются гарнизон и найм юнитов.
В целом таблица не требует особых разъяснений. Первая колонка – ключ вашей структуры, во второй колонке описывается эффект, который вы хотите ей придать (полный список эффектов можно найти в effects_tables в data_rome2.pack). Третья колонка описывает, как широко будет применяться эффект, а последние три колонки задают значение эффекта при нормальном, поврежденном и полностью разрушенном здании соответственно.
Я установил для своего здания одиночный эффект – повышение дохода города на 3000 следующей записью:
Building_units_allowed
Эта таблица устанавливает, какие юниты могут быть наняты при построенном здании.
В настоящий момент известно значение только 4 колонок этой таблицы – это колонки: key (уникальный номер id), building (ключ постройки), unit (idнанимаемого юнита) и XP(устанавливается количество опыта, который будет иметь нанятый юнит).
Для моей структуры я добавил только одного юнита, Царские пельтасты, и установил для них значение опыта 3:
Building_level_armed_citizenry_junctions
Эта таблица отвечает за группы гарнизонных юнитов, которые появятся, если поселение с возведенной постройкой будет атаковано. Многие гарнизонные группы уже прописаны в таблице armed_citizenry_unit_groups. Вы также можете создать свою гарнизонную группу с помощью таблицы armed_citizenry_units_to_unit_groups_junctions.
Эта таблица состоит из 4 колонок: id (уникальный номер), buildinglevel (ключ новой постройки), колонка с неизвестным значением и колонка unitgroup (появляющаяся гарнизонная группа).
Следующей записью я добавляю для моей постройки нескольких юнитов ближнего боя, используя гарнизонную группу rom_hellenic_strong_melee:
Теперь для завершения создания новой структуры осталось только добавить UIэлементы.
building_culture_variants.loc
Здесь описывается имя новой постройки, которое будет отображаться в игре. Формат ключа постройки (в колонке Tag) в этой таблице таков: building_culture_variants_name_<id постройки><id культуры><id субкультуры><id фракции>
Субкультуру и фракцию нужно прописывать только если они были прописаны в таблице culture_variants.
building_short_description_texts
Отвечает за короткое описание под именем постройки. Формат ключа в этой таблице: building_short_description_texts_short_description_<ключ, написанный в колонке shortdescription таблицы culture_variants >
building_flavour_texts
Я не вполне уверен, где именно в игре отображается информация из этой таблицы, но в ней обычно пишется несколько предложений, описывающих назначение постройки.
Заполняется аналогично предыдущей таблице. Формат ключа: building_flavour_texts_flavour_<ключ, написанный в колонке flavourтаблицы culture_variants>
Иконка
Для завершения новой структуры нужна иконка для UI. Она должна быть изображением в формате PNGразрешением 66x66 пикселей с точно таким же названием, как прописано в колонке icon таблицы culture_variants.
Добавьте иконку в свой packфайл с путем: ui/buildings/icons/<имя файла>.png
На этом создание новой структуры закончено.
Нажмите, чтобы прочитать
Для того, чтобы ИИ мог использовать новую структуру, нужны следующие таблицы.
cai_base_building_context_values
Скопируйте строку предыдущей постройки и вставьте туда (с заменой) ключ своей новой структуры.
cai_construction_system_building_values
Если вы добавляете новую структуру в конец существующей субцепи, вам нужно найти ключ существующей структуры и заменить значение колонки building_range_end_inclusive данными своей структуры. Если вы создали новое ответвление субцепи, вам нужно скопировать строку и заменить ту же запись на данные вашей новой постройки.
Нажмите, чтобы прочитать
Создать новую субцепь (линию развития) очень просто. Вам понадобится всего 2 элементарных шага:
1) Создать новый ключ субцепи (также известен как buildinginstance). Можно использовать и существующий ключ, но в большинстве случаев вам понадобится новый (позже я объясню, почему).
2) Соединение вместе 1 или более структур для формирования линии развития субцепи, подобно тому, что вы делали для добавления новой структуры в существующую субцепь.
building_instances
Очень простая таблица, состоит из ключа и целого числа.
Формат ключа неизвестен (предположительно <цепь>_<инстанция>), поэтому для описания продовольственных инстанций цепи порта будет использован ключ rom_Port_Food, а для экономических инстанций – ключ rom_Port_Trade. Для примера я собираюсь создать новую субцепь порта, для чего добавляю ключ rom_Port_Crzy.
Целое число – это количество субцепей этой группы, которые могут быть построены в 1 регионе (1 городе). В ванилле этот параметр установлен на 1 (поэтому нельзя построить 3 одинаковых постройки в 1 регионе). Как правило, именно так и следует создавать новые субцепи (число 1 подходит для большинства случаев). Интересно то, что несколько субцепей могут иметь одну инстанцию, то есть если вы создаете 2 субцепи с одной инстанцией (у которой прописано 1 в колонке лимита), в каждом регионе можно будет построить только 1 из этих субцепей). Таким образом, вы можете создавать взаимоисключающие субцепи (в этом случае вы будете использовать существующий ключ субцепи, не создавать новый).
building_upgrades
Так же, как и раньше, свяжите первоначальную структуру с первой из ваших новых структур, первую со второй и т.д.
Теперь новая субцепь создана (добавлена к главному римскому порту).
Нажмите, чтобы прочитать
Нажмите, чтобы прочитать
Для создания новой цепи понадобится 2 шага:
1) Заявить новую цепь, установить ее категорию и привязать ее к суперцепи
2) Установить, какие культуры/субкультуры/фракции могут строить здания из этой цепи
building_chains
В этой таблице важны 3 колонки. В колонке keyсодержится внутреннее имя цепи, которое должно быть уникальным (его следует придумать). Колонка chain_category, по-видимому, используется в основном ИИ и содержит в себе название одной из 3 категорий цепи (military(военная), happiness(счастье/благополучие) и money(деньги)). Колонка building_superchain привязывает цепь к определенной суперцепи.
Я создал следующую запись для моей новой цепи амуниции:
building_chain_availabilities
Сокращенная версия таблицы building_culture_variants. Здания, входящие в вашу цепочку, должны соответствовать записям в обеих этих таблицах.
Примечание: Для первой постройки в цепи должен быть установлен уровень 0 в таблице building_levels.
На этом создание новой цепи построек завершено.
Нажмите, чтобы прочитать
Для создания новой суперцепи нам понадобятся всего две простые таблицы.
building_superchains
В этой таблице просто заявляется ключ суперцепи (в колонке key). Колонка max_instances_per_region, по всей видимости, не используется (лучше всего оставить в ней стоящее там по умолчанию значение 1).
slot_template_to_building_superchain_junctions
Эта таблица устанавливает, строятся ли структуры, входящие в данную суперцепь, в первом (главном) слоте, дополнительном портовом (dock) слоте или во вторичных основных слотах.
Также она определяет, будут ли постройки доступны в крупных (major) или мелких (minor) поселениях.
Создание суперцепи завершено.
building_superchains
В этой таблице просто заявляется ключ суперцепи (в колонке key). Колонка max_instances_per_region, по всей видимости, не используется (лучше всего оставить в ней стоящее там по умолчанию значение 1).
slot_template_to_building_superchain_junctions
Эта таблица устанавливает, строятся ли структуры, входящие в данную суперцепь, в первом (главном) слоте, дополнительном портовом (dock) слоте или во вторичных основных слотах.
Также она определяет, будут ли постройки доступны в крупных (major) или мелких (minor) поселениях.
Создание суперцепи завершено.
Сообщение отредактировал HunterWolf: 19 января 2014 - 20:28