ФЭНДОМ


Список играбельных рас для ХВ2 удручающе мал. Всего две. Конечно, это хорошая традиция для конкретно серии Homeworld, но плохая — для стратегии. В этом мануале мы будем заниматься созданием новой расы, которая будет, в принципе, даже каноничной для ХВ2 — это таидане.

Приготовления

Для начала нам нужно достать декомпилированные файлы homeworld2.big. Это можно сделать с помощью UnfBig1.41, но тогда нужно ожидать, что не все нужные файлы будут корректно читаться, или с помощью интернета — где-то гуляет сборник «Лучшая декомпиляция homeworld2.big», спрашивайте в ближайшем моддинг-отделе. Не буду вдаваться в подробности, тем более, что UnfBig1.41 — программа простая, как говаривал AndrewN, да и уже давно есть мануал; а основы использования Всемирной Сети вы должны и сами знать.
Кроме того, советую, в качестве примеров, закачать и декомпилировать парочку модов, желательно от разных авторов: некоторые моддеры имеют привычку свой новый мод начинать на базе старого, отчего скрипты превращаются в небольшую помойку. Надо заметить, что и в оригинальных скриптах много лишней информации.

Кстати, о коде — на будущее. Старайтесь больше комментировать свой код, чтобы в нём могли разобраться последователи и ваши сотоварищи, но не перестарайтесь. Код должен быть просматриваемым и легкопонимаемым. Если вы сами с полпинка не можете вникнуть, что же вы написали — лучше или переписать, или обильно сдобрить комментариями. Как говорит закон Мэрфи — всё, что может быть понято превратно, будет понято превратно. Старайтесь использовать только то, что нужно — это и уменьшит время искания багов, и облегчит жизнь движку игры.
Вообще, старайтесь делать бэкапы: играйтесь со значениями во временной версии, например, находящейся непосредственно в папке %HW2_root%\Data, а окончательные изменения сохраняйте в другом месте. В дальнейшем, я буду опускать %HW2_root%, вы же знайте, что косая черта впереди всех — это обозначение корневого каталога с игрой.

И последнее — поставьте ХВ2 заново, сделайте бэкап папки с всей игрой, и сделайте копию ярлыка игры с параметром -OverrideBigFile. Если вы не знаете, что это такое, то смотрите любой мануал по запуску мода к ХВ2. И, в конце концов, что вы тогда делаете тут, раз не знаете это?..

Список рас

Но довольно наставлений, перейдём к делу. Напоминаю — мы делает таидашек.
Итак, для начала мы должны заставить игру видеть наших таиданчиков в списке рас, выбираемых при начале мультиплеерного сражения.
Находим файл %homeworld2.big_decompiled%\scripts\race.lua, открываем, и к значению races = {} копипастим ещё одну расу:

{ 
  "Taiidan", -- название расы, только для игрового движка;
  "Taiidan", -- название расы, видное в игре, возможна локализация;
  "hyperspace_gate_kpr", -- эффект гиперокна; будет жёлтое, киперовское;
  "etg/special/SPECIAL_ABILITIES_HYPERSPACE_IN", -- ещё какой-то эффект;
  9.5, -- время, нужное для начального гиперпрыжка;
  Playable, -- можно ли играть в мультиплеере с этой расой;
  "TDN_", -- префикс названия кораблей, которые может использовать раса;
},

Замечание: всё, что начинается с двойного тире —- и есть комментарии.

Нужно упомянуть о, так сказать, «naming convention», то есть, вы должны придерживаться определённых стандартов при именовании кораблей, функций итд. Это облегчит жизнь всем, кто будет работать над кодом с вами. Называть старайтесь просто и понятно, чтобы с первого взгляда можно было разобраться, кто это и что это. В случае с названиями рас в HW2 есть такая традиция: префиксы к расам обычно являются сочетанием их трёх согласных. Помните, «кртксть — сстр тлнт»? Так и тут: если хиигаряне, то HGN_; если вэйгры, то VGR_. Та же фишка и с прочими расами, будь то таидане (TDN_), кушане (KSN_), кадеши (KDS_), туранцы (TRN_) итд.

Итак, начало положено. Копируйте этот race.lua в папку \Data с сохранением оригинальной структуры — то есть, в \Data\scripts. В дальнейшем, делайте аналогично, я больше не буду говорить об этом.

В дополнение скажу, что всего в игре можно задействовать только 6 рас, максимум, и в оригинале задействованы уже 4: хиигаряне, вэйгры, Хранители и бентуси, с префиксом которых (BEN_ - смутно напоминает о дяде Бене из ЗВ, он же — Оби-Ван Кеноби) в игре нет кораблей: Великий Бентус существует под категорией «Мегалит», meg_bentus. Если вы не планируете в своём моде играться в оригинальную кампанию, то можете смело выкидывать бентусов и Хранителей из списка рас, тем самым увеличивая простор для расовой дифференциации. Но ежели вам и этого мало — то иначе как скриптовой магией этого не добьёшься. И для этого вам надо смотреть реализацию оной в модах вроде HWU или PTV.
Но для начала нам хватит и одной дополнительной расы, поэтому запускайте игру, выбирайте появившихся таидан в списке играбельных рас — и начинайте сражение!..

Исследования и строительство

...А вот фигушки. Игра вылетает, таидане навечно застревают в гипер-пространстве.
Что же произошло? Для выяснение этого нужно открыть файл \Bin\Release\Hw2.log. Этот волшебный файл — ваше чудесное спасение, панацея от многих проблем, потому что игровой движок здесь пишет всё, что он думает о вас, вашем моде, и что ему не нравится в нём.
И если пролистать этот лог до конца, то можно увидеть, что пишет он такие ругательства:

?Error: loading research file (data:scripts\Building and Research\Taiidan\research.lua)?-- FATAL EXIT --?researchmanager/70:!?--stack trace--??????????

В дальнейшем, при любом вылете или ошибке игры заходите в лог и по выданной записи ищите, где же вы накосячили. Если же лог пуст — то есть там ничего нет — то значит, что ошибки есть или в *.hod-файлах — или же что-то очень страшное и левое, что лечится только откатом и переделыванием. На этом всё про логи, я об этом упоминать уже не буду.

Итак, движку не нравится, что у нас нет ни исследований, ни (забегая чуть вперёд) — строительства. Нужно исправлять сей досадный недочёт: создаём в \Data\scripts\building and research\ папку с названием нашей расы — то бишь, taiidan, - и копипастим туда, от уже существующих рас, файлы build.lua и research.lua.
А теперь открываем оба файла и стираем всё, что находится между фигурными скобками у функций build = {} и research = {}. Пока что нам ни строительство, ни исследования не важны — мы ещё только хотим хотя бы запустить игру без лишних проблем.
Перед тем как снова попробовать запустить игру, посмотрим на сам конфиг. В любом из трёх, рассмотренных нами, *.lua-файлах были похожие строки:

Modifier = 0 
Ability = 1

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

Корабли моей гавани

Ура! Оно запустилось, но, правда, только на чуть-чуть.
Логи ругаются, что у нас нет флота:

Level may have no ships

А это значит, что нужно срочно обзаводиться оным. Для начала мы возьмём те корабли, которые изначально предлагаются в ХВ2, а уже потом будем пытаться выковыривать нужные нам космолёты из ненужных нам модов: чужие модели обычно тянут за собой ворох непонятных файлов, что затрудняет и затормаживает тестирование, а нам это не нужно.
Итак, надо сделать так, чтобы у таидан были какие-нибудь корабли по загрузке карты.
Создаём \Data\scripts\startingfleets\taidan00.lua — точнее, копипастим конфиги уже какой-нибудь из созданных рас, и из всего богатства оставляем такой текст:

PersistantData =
{ 
 StrikeGroups = {}, 
 Squadrons =
 { 
   { 
     type = "Kpr_Destroyer", -- тут можно было и попроще кораблик, вроде Hgn_MotherShip, но я решил, раз уж у нас только один корабль, то пусть будет что-нибудь хорошее;
     subsystems = {}, -- нет подсистем (кроме «по умолчанию»);
     shiphold = {}, -- корабли в доках;
     name = "", -- имя, которое может быть использовано в скриптах — это больше к части синглплеерных забав;
     size = 1, -- вроде как кол-во кораблей в звене, но не работает, поэтому не уверен;
     number = 1, -- количество таких однотипных кораблей;
   }, 
 }, 
 Research = {}, -- нет изначально доступных исследований: правда, не знаю, уже исследованных, или просто доступных;
}

Если вы хотите, чтобы по выходу из гипера какой-нибудь из ваших кораблей выгрузил пару-тройку звеньев истребителей — это бывает полезно, когда нужно использовать корабль другой расы (иначе они просто гипернуться со всеми) - то нужно «записываться» в shiphold:

shiphold = {{type = "Vgr_Destroyer",},},

Тут надо помнить такую вещь: если выпускающий корабль в принципе не может построить выпускаемого, то он гипернётся рядом; то есть, если флагман выпустит эсминец из недр, то, в случае с носителем, тот выпрыгнет рядом.

Внимательный моддер заметит, что строчка, которую мы прописываем в shiphold, является первой строкой общего обозначения корабля. К сожалению, для кораблей, появляющихся из доков, действует только она: иначе можно было бы сделать выход эскадры а-ля matryoshka-style; не работает и параметр number, заставляя копипастить название корабля столько раз, сколько надо кораблей. Но с другой стороны, и для «основных» кораблей можно оставлять только эту, главную строчку: остальные параметры можно указывать по желанию: что будет не указано, то останется с параметрами по умолчанию:

{type = "Vgr_MotherShip",},
{
  type = "Vgr_ResourceCollector",
  number = 4;
},

Запускаем игру и долго радуемся кровавой мсте таидан. Для ещё большей веселухи можете впихнуть парочку-другую Саджууков на старте — для этого смотрите его название в %HW2_decompiled%\ship...

...Я тебя породил...

Но это ещё не всё — мы же хотим наладить полноценное производство кораблей! А чтобы построить корабль, нужно, собственно, две вещи — корабль-строитель и, соответственно, корабль, который строят.
Итак, мы сумели заставить корабли чужих рас появляться под знамёнами таидан. Но проблема в том, что хоть они и появляются в качестве стартового флота, но никто из них нам ничего строить не будет: для этого нам нужно обзавестись собственными кораблями (помните про префикс, который мы задавали при создании новой расы?).
Перекопируйте к себе из %HW2_decompiled%\ship папку с хиигарянским носителем. Переназовите как папку, так и его содержимое — там должны быть минимум три файла: *.hod (собственно, модель корабля), *.ship (его описание для инициализации игровым движком) и *.events (анимация и прочие дела) – в какой-нибудь tdn_carrier.
Затем пропишите в build.lua какие-нибудь кораблики, вроде вэйгрского перехватчика и хиигарянского десантного фрегата:

build =
{
  {
    Type = Ship, –- строим или корабль, или подсистему итд;
    ThingToBuild = "Vgr_Interceptor", -- название корабля;
    RequiredResearch = "", -- здесь пишем нужные ресёрчи для него;
    RequiredShipSubSystems = "", -- нужные подсистемы;
    DisplayPriority = 10, -- чем больше цифра, тем ниже в списках строительства будет появляться корабль; не должно повторяться;
    DisplayedName = "$8000", -- название корабля, видимое игроком;
    Description = "$8000", -- описание корабля, видимое игроком;
  },
  –- Повторите то же самое с «десантником» ))
}

Если вы запустите игру, то заметите две вещи:

  1. Первое, у вас появился лимит на истребители и фрегаты — то есть, игра смотрит, к какому классу принадлежит корабль, и самостоятельно определяет, сколько чего вы можете строить; правда, абордажных фрегатов у вас — 6 штук, наверное, потому, что вы играете не за хиигарян, которым прописано дополнительное правило-пенальти по абордажникам;
  2. Второе, вы не можете строить корабли вэйгров — хотя лимит на них и появился. Это всё потому, что у нашего псевдо-таиданского носителя прописано разрешение на строительство лишь хиигарянской «семьи» кораблей. Если в нашем флоте заведётся кто-нибудь из вэйгростроителей, то он, соответственно, сможет построить перехватчик вэйгров, но не сможет хиигарянский.

В принципе, можно завести только несколько несколько строительных кораблей с префиксом tdn_, а остальные забирать от вэйгров или хиигарян — по сути, по похожему принципу была сделана многорасовость в моде HWU, с возможностью строить с чужих производственных кораблей: они просто совместили все расы в одну, а затем уже скриптами снова разделили расы. Однако, ИМХО, это как-то неправильно. По крайней мере, на первый взгляд...
Возможность что-то строить прописывается в *.ship-файле корабля вот этой строчкой:

addAbility(
    NewShipType, "CanBuildShips", 1,
    -- эта строчка определяет, какие семейства кораблей может строить производитель;
    "Fighter_Hgn, Corvette_Hgn, Frigate_Hgn, Utility_Hgn, Platform_Hgn, SubSystem_Hgn,Shipyard_Hgn, Probe_Hgn",
    -- эта строчка показывает менюшки в интерфейсе;
    "Utility, Fighter, Corvette, Frigate, Platform, SubSystemModule, SubSystemSensors, Capital"
)

К какому семейству относится корабль, можно понять из этих строк:

NewShipType.BuildFamily = "SuperCap_Hgn" -- супертяж хиигарян, однако!;

Подробнее обо всех остальных функциях смотрите в отдельном мануале. А пока обратимся к самим семействам...

Дела семейные

//To be continued...

Смотрите также

Ссылки

  • homeworld.su - мануал AndrewN;
  • homeworld3.ru - мануал, в общем-то, того же AndrewN;
  • Буржуйка - мануал от одмена Всея Кафолической Буржуйки Moe;