Внедрение юнита в Medieval 2: Total War

Итак, здесь перед вами Тутор по внедрению юнита в Medieval 2: Total War, на базе существующей меш-модели. Оригинально авторство принадлежит Musashi из тоталвар.орг.

Процесс внедрения нового юнита нам обещают долгий и мучительный, но возможно его сделают проще, если СА выпустит пару новых тулзов для МТВ2. Но, на данный момент это единственный метод как внедрить новый юнит.

Данный Византийский драгун – что-то среднее между Рейтарами и стрелками на верблюдах, но помните –что это всего лишь авторская фантазия на тему.

 

Внимание! Прежде чем начать не забудьте распаковать паки!

Шаг первый: файл юнитов.

В паке дата откройте export_descr_unit.txt и добавьте вот такой текст:

Так как мы создаем юнит похожий на рейтаров, то проще будет начать с блока описания рейтар:
Код:

type             Reiters
dictionary       Reiters      ; Reiters
category         cavalry
class            missile
voice_type       Heavy
banner faction   main_cavalry
banner holy      crusade_cavalry
soldier          Reiters, 32, 0, 1
mount            heavy horse
mount_effect     elephant -4, camel -4
attributes       sea_faring, hide_forest, hardy, can_withdraw, can_formed_charge, cantabrian_circle, gunpowder_unit, start_not_skirmishing, guncavalry
formation        2, 4.4, 3, 6, 4, square
stat_health      1, 0
stat_pri         20, 3, pistol_bullet, 45, 20, missile, missile_gunpowder, piercing, none, musket_shot_set, 25, 1
;stat_pri_ex      0, 0, 0
stat_pri_attr    ap
stat_sec         11, 5, no, 0, 0, melee, melee_blade, piercing, spear, 25, 1
;stat_sec_ex      0, 0, 0
stat_sec_attr    no
stat_pri_armour  7, 6, 0, metal
;stat_armour_ex   7, 8, 0, 0, 6, 0, 0, metal
stat_sec_armour  0, 0, flesh
stat_heat        5
stat_ground      0, -2, -4, 0
stat_mental      9, normal, trained
stat_charge_dist 45
stat_fire_delay  0
stat_food        60, 300
stat_cost        1, 920, 250, 120, 95, 920, 4, 230
armour_ug_levels 3, 4
armour_ug_models Reiters, Reiters_ug1
ownership        hre
era 2            hre
;unit_info        11, 20, 13

Так что все, что нам нужно сделать это скопировать этот кусок, и подредактировать.

Первое, что меняем – это переменную типа. Это ссылка для движка, которая будет использоваться для связи с другими файлами в игре. Самое главное помнить, что игра будет пытаться использовать это ссылку для связи с иконкой юнита.

Code:
type GR_Dragoons

Потом нужно установить «Dictionary» запись. Это ссылка на запись в файле export_units.txt.bin, где игра хранит запись об имени и описанию юнита. Внимание здесь не должно быть никаких пробелов в этой записи. Так как юнит назван «Byzantine Dragoons», то используем для словаря "Byzantine_Dragoons".
Далее идет:

category         cavalry
class            missile
voice_type       Heavy
banner faction   main_cavalry
banner holy      crusade_cavalry

Ничего здесь менять не надо, так как рейтары – кавалерия, притом стрелковая. И менять нам нужды по описанию баннеров нам не надо.

Опыт редактирования model db файла позволяет сказать, что тип солдата определяет анимацию и скелет, в тоже время как модель и текстура берутся из записи «armour_ug_models». Технически мы можем оставить запись « soldier», так как используем модельку рейтаров, но для целостности картины изменим на:

soldier GR_Dragoons, 32, 0, 1
Также было изменено запись «mount», для того, что бы наш драгун ездил на восточной бронированной лошади.

Также меняем «stat_pri», - набор параметров для главного оружия, в данном случае – мушкета. Так как мы делаем стрелком-мушкетером, то копируем запись от Camel Gunners.

Внимание! Важно! «armour_ug_models» используются для поиска текстур!!! И если не сменить эти строчки, то игра будет упорно искать текстуры в записи рейтаров!!! И мы вместо наших драгун увидим призраков на поле боя, даже если сделаем все правильно для Model DB.
Вот так должна выглядеть новая запись для драгун после редактирования (рекомендую сделать вручную описанное выше, а потом просто свериться, так сказать набить руку).
Код:

type             GR_Dragoons
dictionary       GR_Dragoons      ; Byzantine Dragoons
category         cavalry
class            missile
voice_type       Heavy
banner faction   main_cavalry
banner holy      crusade_cavalry
soldier          GR_Dragoons, 32, 0, 1
mount            eastern armoured horse
mount_effect     elephant -4, camel -4
attributes       sea_faring, hide_forest, hardy, can_withdraw, can_formed_charge, cantabrian_circle, gunpowder_unit, start_not_skirmishing, guncavalry
formation        2, 4.4, 3, 6, 4, square
stat_health      1, 0
stat_pri         16, 3, musket_bullet, 180, 20, missile, missile_gunpowder, piercing, none, musket_shot_set, 25, 1
;stat_pri_ex      0, 0, 0
stat_pri_attr    ap
stat_sec         11, 5, no, 0, 0, melee, melee_blade, piercing, spear, 25, 1
;stat_sec_ex      0, 0, 0
stat_sec_attr    no
stat_pri_armour  7, 6, 0, metal
;stat_armour_ex   7, 8, 0, 0, 6, 0, 0, metal
stat_sec_armour  0, 0, flesh
stat_heat        5
stat_ground      0, -2, -4, 0
stat_mental      9, normal, trained
stat_charge_dist 45
stat_fire_delay  0
stat_food        60, 300
stat_cost        1, 920, 250, 120, 95, 920, 4, 230
armour_ug_levels 3, 4
armour_ug_models GR_Dragoons, GR_Dragoons_ug1
ownership        byzantium
era 2            byzantium
;unit_info        11, 20, 13

Шаг второй: Клятый Model DB…

Ну вот самый тяжелый и ответственный шаг. Редактирования файла data/unit_models/battle_models.modeldb вряд-ли когда-либо подразумевалось вручную, но ничего прорвемся.

ВНИМАНИЕ! ЭТОТ файл работает ТОЛЬКО в оригинальной data/unit_models и не будет работать в ПАПКЕ МОДА. Так что опять ждем исправлений косяков от СА. Главный недостаток в том, что юзер не сможет одновременно юзать несколько модов, что используют один и той же файл моделей.

ВНИМАНИЕ!!! Для получения работоспособных изменений добавить --io.file_first в бат файл.

«Все» что нам надо – это открыть файл в блокноте (видать вордом автор не юзает за ненадобностью, работоспособность файла после правки в Ворде не проверялась!!!). Выглядит файл в блокноте как… Ну скажем несколько безобразно…

Так как мы юзамем модель от рейтара то для начала копируем запись от них:

7 reiters 1 4 53 unit_models/_Units/RN_Half_3Q_Plate/reiters_lod0.mesh 121 53 unit_models/_Units/RN_Half_3Q_Plate/reiters_lod1.mesh 900 53 unit_models/_Units/RN_Half_3Q_Plate/reiters_lod2.mesh 2500 53 unit_models/_Units/RN_Half_3Q_Plate/reiters_lod3.mesh 6400 1 3 hre 73 unit_models/_Units/RN_Half_3Q_Plate/textures/rn_half_3q_plate_hre.texture 76 unit_models/_Units/RN_Half_3Q_Plate/textures/rn_half_3q_plate_normal.texture 35 unit_sprites/hre_Reiters_sprite.spr 1 3 hre 65 unit_models/AttachmentSets/Final European CB Gun_hre_diff.texture 65 unit_models/AttachmentSets/Final European CB Gun_hre_norm.texture 0  1 5 Horse 14 MTW2_HR_Pistol 13 MTW2_HR_Spear 1 22 MTW2_HR_Pistol_Primary 1 21 MTW2_HR_spear_Primary 16 -0.090000004 0 0 -0.34999999 0.80000001 0.60000002 11 reiters_ug1 1 4 57 unit_models/_Units/RN_Half_3Q_Plate/reiters_ug1_lod0.mesh 121 57 unit_models/_Units/RN_Half_3Q_Plate/reiters_ug1_lod1.mesh 900 57 unit_models/_Units/RN_Half_3Q_Plate/reiters_ug1_lod2.mesh 2500 57 unit_models/_Units/RN_Half_3Q_Plate/reiters_ug1_lod3.mesh 6400 1 3 hre 73 unit_models/_Units/RN_Half_3Q_Plate/textures/rn_half_3q_plate_hre.texture 76 unit_models/_Units/RN_Half_3Q_Plate/textures/rn_half_3q_plate_normal.texture 39 unit_sprites/hre_Reiters_ug1_sprite.spr 1 3 hre 65 unit_models/AttachmentSets/Final European CB Gun_hre_diff.texture 65 unit_models/AttachmentSets/Final European CB Gun_hre_norm.texture 0  1 5 Horse 14 MTW2_HR_Pistol 13 MTW2_HR_Spear 1 22 MTW2_HR_Pistol_Primary 1 21 MTW2_HR_spear_Primary 16 -0.090000004 0 0 -0.34999999 0.80000001 0.60000002

Так что мы здесь имеем в итоге:

Первое что стоит запомнить раз и навсегда – это то, что формат каждой записи в файле имеет вид "n xxxxx", где n – длина строки в СИМВОЛАХ, что идет после числа.
Наша запись "7 reiters". Так число 7 длина строки "reiters", потом само слово reiters.

Потом «1 4» - обычно строка из одного символа, что представляет количество лодов, что гейма будет пытаться загрузить. (ну да кому в голову стрельнет грузить 10-20 лодов к модельке?).

Следующие три записи:

53 unit_models/_Units/RN_Half_3Q_Plate/reiters_lod0.mesh 121 53 unit_models/_Units/RN_Half_3Q_Plate/reiters_lod1.mesh 900 53 unit_models/_Units/RN_Half_3Q_Plate/reiters_lod2.mesh 2500 53 unit_models/_Units/RN_Half_3Q_Plate/reiters_lod3.mesh 6400

Меши, что игра будет использовать на разных дистанциях от юнита. Запомните – сначала строка с Мешем, потом дистанция, на которой будет использован Меш. Все просто.

Итак, блок текстуры:

1 3 hre 73 unit_models/_Units/RN_Half_3Q_Plate/textures/rn_half_3q_plate_hre.texture 76 unit_models/_Units/RN_Half_3Q_Plate/textures/rn_half_3q_plate_normal.texture                                                                     35 unit_sprites/hre_Reiters_sprite.spr

1 - количество блоков текстур, что гейма должна попытаться загрузить, если проще – количество фракций, что юзают сию модель (хотя вполне может быть что модель одна, но референсов на модель несколько на одну фракцию, но с разными текстурами). В случае с рейтарами – только HRE может использовать модель рейтара, поэтому только один блок текстур.

3 – длина строки-названия фракции – для блока текстуры. В данном случае hre. Потом длина строки самой текстуры, пробел – длина строки для карты нормалей. (Более детально можно почитать, как редактировать текстуру и карту нормалей в гайде от Заруса на главной страничке).
Последняя срока – спрайт для модели, если удаление больше чем самый низкий ЛОД модели.

Следующий блок кода:

1 3 hre 65 unit_models/AttachmentSets/Final European CB Gun_hre_diff.texture 65 unit_models/AttachmentSets/Final European CB Gun_hre_norm.texture 0  1 5 Horse 14 MTW2_HR_Pistol 13 MTW2_HR_Spear 1 22 MTW2_HR_Pistol_Primary 1 21 MTW2_HR_spear_Primary 16 -0.090000004 0 0 -0.34999999 0.80000001 0.60000002

Лист атачментов, которые использует юнит. Вообще на 100% автор не уверен, что к чему, кроме того, что нужно начинать также как и для блока текстур. То есть 1 – количество блоков-описаний, 3 – длина названия фракции, потом длина следующей строки и так далее…
Потом тоже самое повторяется для модели-апгрейда.

Вот так это должно выглядеть для нового юнита. (Автор предлагает все это копировать в отдельное окно блокнота, там редактировать, а потом вставлять в конец последнего блока, так что бы был только один (!) пробел)

Вот так выглядит уже отредактированный блок:

11 GR_Dragoons 1 4 53 unit_models/_Units/RN_Half_3Q_Plate/reiters_lod0.mesh 121 53 unit_models/_Units/RN_Half_3Q_Plate/reiters_lod1.mesh 900 53 unit_models/_Units/RN_Half_3Q_Plate/reiters_lod2.mesh 2500 53 unit_models/_Units/RN_Half_3Q_Plate/reiters_lod3.mesh 6400 1 9 byzantium 79 unit_models/_Units/RN_Half_3Q_Plate/textures/rn_half_3q_plate_byzantium.texture 76 unit_models/_Units/RN_Half_3Q_Plate/textures/rn_half_3q_plate_normal.texture 41 unit_sprites/byzantium_Reiters_sprite.spr 1 9 byzantium 65 unit_models/AttachmentSets/Final European CB Gun_hre_diff.texture 65 unit_models/AttachmentSets/Final European CB Gun_hre_norm.texture 0  1 5 Horse 14 MTW2_HR_Pistol 13 MTW2_HR_Spear 1 22 MTW2_HR_Pistol_Primary 1 21 MTW2_HR_spear_Primary 16 -0.090000004 0 0 -0.34999999 0.80000001 0.60000002 11 reiters_ug1 1 4 57 unit_models/_Units/RN_Half_3Q_Plate/reiters_ug1_lod0.mesh 121 57 unit_models/_Units/RN_Half_3Q_Plate/reiters_ug1_lod1.mesh 900 57 unit_models/_Units/RN_Half_3Q_Plate/reiters_ug1_lod2.mesh 2500 57 unit_models/_Units/RN_Half_3Q_Plate/reiters_ug1_lod3.mesh 6400 1 9 byzantium 79 unit_models/_Units/RN_Half_3Q_Plate/textures/rn_half_3q_plate_byzantium.texture 76 unit_models/_Units/RN_Half_3Q_Plate/textures/rn_half_3q_plate_normal.texture 45 unit_sprites/byzantium_Reiters_ug1_sprite.spr 1 9 byzantium 65 unit_models/AttachmentSets/Final European CB Gun_hre_diff.texture 65 unit_models/AttachmentSets/Final European CB Gun_hre_norm.texture 0  1 5 Horse 14 MTW2_HR_Pistol 13 MTW2_HR_Spear 1 22 MTW2_HR_Pistol_Primary 1 21 MTW2_HR_spear_Primary 16 -0.090000004 0 0 -0.34999999 0.80000001 0.60000002

Как ведете, было изменено название модели (Вообщем-то моделей, так как апгрейнутая модель – это уже новая модель), фракции и названия текстур.

Шаг третий: редактируем текстуры
Как открыть – читай Заруса. (Моя технология), или использовать конвертер.

Шаг 4: делаем иконку.

Так в data/ui/units/hre копируем #reiters.tga в data/ui/units/byzantium и переименовуем в #gr_dragoons.tga. Если надо – делаем свою, или редактируем в фотошопе.

Редактируем описание.

Все что осталось – отредактировать текст:
Код:

{Reiters} Reiters
{Reiters_descr} Reiters derive their name from the German word reiter, meaning horseman. Generally from German states, Reiters are armed with a pistol and spear, and well protected by plate armour. They often employ the shooting circle tactic to create a continuous cycle of firing and reloading. Once the enemy are softened up by this treatment, they charge in and finish them off the old fashioned way.
{Reiters_descr_short} Effective gunpowder units, Reiters are armed with a pistol and spear, and protected by plate armour.

Копируем и изменяем на что-то в этом вроде:
Code:

{GR_Dragoons} Reiters
{GR_Dragoons_descr} Reiters derive their name from the German word reiter, meaning horseman. Generally from German states, Reiters are armed with a pistol and spear, and well protected by plate armour. They often employ the shooting circle tactic to create a continuous cycle of firing and reloading. Once the enemy are softened up by this treatment, they charge in and finish them off the old fashioned way.
{GR_Dragoons_descr_short} Effective gunpowder units, Reiters are armed with a pistol and spear, and protected by plate armour.

22 serialization::archive 3 0 0 0 0 701 0 0
и 701 - это количество моделей. Если ты добавляешь новую - меняй на 702, если выкидываешь - уменьшай число.

Вот и все. Ничего сложного, если знать как…

Замечания если кто будет делать свои модельки (ВАЖНО):
1. Файл моделдб должне быть в папке мода, там же где и оригинальный файл игры.

2. Следите за количеством символов в строках. Характерный признак при ошибках в файле моделдб - окошко с жёлтым треугольником. (ВНИМАНИЕ!!! при этом обычно в логах нет информации об ошибке!). Да и в самом окне просто Ошибка МТВ2 и "Ок".

 

Недостаточно прав для комментирования