FTL: Faster Than Light Guide

Гайд по моддингу FTL от bamalf for FTL: Faster Than Light

Гайд по моддингу FTL от bamalf

Overview

Всё, что вы хотели знать о моддинге и даже больше! Только на русском языке, полное руководство о моддинге FTL от bamalf.

1. Необходимый софт и структура файлов игры.

1.1. Софт.

Основная программа, в которой я редактирую код — notepad++ <!– [link] –> со включённым xml-синтаксисом. <!– Вкладка “Синтаксисы” — XML –>

Для запаковки файлов игры в архив мода использую 7-zip. <!– [link] –> ftl-файлы мода представляют собой обычный zip-архив с переименованным расширением.

Для установки готового мода применяется Slipstream Mod Manager. <!– [link] –> Рекомендую в его настройках File — Preferences отметить галочкой allow_zip, это позволит модменеджеру видеть zip-архивы так же, как и ftl-файлы, что избавит от необходимости переименовывать *.zip в *.ftl при каждом тесте мода.

Для распаковки оригинальных игровых архивов использую ftldat. <!– [link] –> Эта программа понадобится лишь один раз, для того чтобы распаковать ресурсы игры.

Для редактирования графики подойдёт любой редактор, поддерживающий прозрачность изображений, например GIMP <!– [link] –> Я использую фотошоп, ссылок не будет 🙂

<!– ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ –>

1.2. Структура файлов.

Все файлы игры разбиты на 4 папки:
audio <!– содержит звуки и музыку –>
data <!– текстовый код –>
fonts <!– шрифты –>
img <!– графику –>
Рассмотрим основную папку data.

Изначально весь код игры (доступный для редактирования) записан в xml-файлах, но при русификации мы добавили к ним расширение *.rawclobber, это позволяет модменеджеру переносить код игры без форматирования. Если использовать оригинальное расширение *.xml, то модменеджер “съедает” специально оставленные пробелы в конце строк. Пример: <text name=”add_power”>Увеличить мощность: </text>
Notepad++, начиная с версии 6.8.4, автоматически распознаёт синтаксис XML, даже если расширение файла другое. Для этого в первой строке каждого xml-файла напишите код: <?xml version=”1.0″ encoding=”utf-8″?>
Файлы с этим расширением заменяют оригинальные xml полностью, но также есть возможность переписать конкретные части кода, сохраняя при этом оригинальные файлы. Для этого новому файлу с заменяемым участком кода дописывается расширение *.append. Вот пример частичной замены кода в оригинальном файле circle_scout.xml на код из нового файла circle_scout.xml.append:
<mod:findLike type=”explosion”>
<mod-overwrite:gib5>
<velocity min=”1″ max=”3″/>
<direction min=”-180″ max=”180″/>
<angular min=”-1″ max=”1″/>
<x>90</x>
<y>170</y>
</mod-overwrite:gib5>
<mod-overwrite:gib6>
<velocity min=”1″ max=”3″/>
<direction min=”-180″ max=”180″/>
<angular min=”-1″ max=”1″/>
<x>230</x>
<y>160</y>
</mod-overwrite:gib6>
<mod-overwrite:gib7>
<velocity min=”1″ max=”3″/>
<direction min=”-180″ max=”180″/>
<angular min=”-1″ max=”1″/>
<x>100</x>
<y>35</y>
</mod-overwrite:gib7>
</mod:findLike> Здесь мы ищем блок <explosion> в оригинальном файле и заменяем в нём блоки <gib5>, <gib6> и <gib7> на новые. Остальной код в оригинальном файле остаётся без изменений. Но такой метод я почти не использую, а предпочитаю заменять файлы полностью на новые.

Деление кода на отдельные файлы условное, оно нужно для облегчения чтения и поиска нужных участков кода. Игра сама объединяет все файлы в определённом порядке в один массив, из которого загружаются необходимые части кода. Если один и тот же код (а точнее код с одинаковым заголовком-именем) написан более одного раза, то код, написанный ниже, перезаписывает код, который расположен выше него в том же самом файле. Пример:
<text name=”level”>Лалала </text>
<text name=”manned”>Управляется экипажем: </text>
<text name=”status”>Состояние: </text>
<text name=”level”>Уровень </text>
Код на первой строке будет игнорироваться, т.к. то же самое имя использовано на строке ниже, и эта строка перезапишет все строки над ней с теми же именами.

Итак, что же во всех этих файлах закодировано. Я распишу только файлы с расширением *.rawclobber, именно они нас интересуют в первую очередь.

achievements.xml.rawclobber <!– Описания достижений игры. Для редактирования доступно только описание, этот файл нам не интересен. –>
animations.xml.rawclobber <!– Вся анимация игры, включая оружие, дронов, персонажей и прочего. –>
autoBlueprints.xml.rawclobber <!– Содержит списки орудий, дронов, улучшений, кораблей и сами корабли. –>
blueprints.xml.rawclobber <!– Содержит стартовые корабли игрока, оружие, дронов, системы и улучшения. –>
bosses.xml.rawclobber <!– Здесь записаны код флагмана для всех трёх фаз и трёх уровней сложностей. –>
dlcAnimations.xml.rawclobber <!– Анимация, добавленная в дополнении Advanced Edition. Этот код игнорируется при отключённом расширенном режиме. –>
dlcBlueprints.xml.rawclobber <!– Аналогично blueprints.xml.rawclobber — это код для дополнения, здесь также записан код стартовых кораблей ланиусов. –>
dlcBlueprintsOverwrite.xml.rawclobber <!– Этот код замещает аналогичный код из autoBlueprints.xml.rawclobber при включённом дополнении. Содержит также код кораблей типа С. Если в имени списков присутствует префикс OVERRIDE_, то это значит, что данный блок кода заменяет тот же самый код (с тем же именем) без этого префикса, если включён расширенный режим игры с дополнением. –>
dlcEvents.xml.rawclobber <!– События, добавленные в дополнении. –>
dlcEvents_anaerobic.xml.rawclobber <!– События сектора ланиусов. –>
dlcEventsOverwrite.xml.rawclobber <!– Здесь находятся изменения в событиях и списках событий при включённом дополнении. –>
dlcPirateBlueprints.xml.rawclobber <!– Код кораблей пиратов –>
events.xml.rawclobber <!– Основной файл событий игры. Все новые события я пишу в конце этого файла. Разработчики для удобства поиска событий раскидывали их по отдельным файлам, для каждой расы в свой файл. –>
events_boss.xml.rawclobber <!– События финального сектора. –>
events_crystal.xml.rawclobber <!– События сектора кристалинов. –>
events_engi.xml.rawclobber <!– События секторов инжи. –>
events_fuel.xml.rawclobber <!– События, вызываемые при пустых топливных баках. –>
events_imageList.xml.rawclobber <!– Здесь находятся списки задних фонов и планет. –>
events_mantis.xml.rawclobber <!– События богомолов. –>
events_nebula.xml.rawclobber <!– События в туманностях. –>
events_pirate.xml.rawclobber <!– События пиратского сектора. –>
events_rebel.xml.rawclobber <!– События секторов повстанцев. –>
events_rock.xml.rawclobber <!– События роков. –>
events_ships.xml.rawclobber <!– События, связанные с битвами с определёнными кораблями. –>
events_slug.xml.rawclobber <!– События слизней. –>
events_zoltan.xml.rawclobber <!– События золтанцев. –>
misc.xml.rawclobber <!– Содержит описания элементов интерфейса, настроек, статистики, подсказок для разных типов оружия и прочую информацию. –>
nameEvents.xml.rawclobber <!– Здесь разработчики экспериментировали с функциями вызова имён экипажа в текстах событий. Но этот код так и не был доведён до ума и в финальную версию игры не попал. Я рекомендую не использовать подобный код вообще, либо использовать в не несущих нагрузку текстах. Пример: <text>Вам не нравятся звуки, раздающиеся в этом месте время от времени… %req жалуется на постоянные головные боли из-за них.</text> Здесь %req вызовет имя случайного члена экипажа. –>
names.xml.rawclobber <!– Все возможные имена, с которыми вам встречаются персонажи в игре. –>
newEvents.xml.rawclobber <!– Содержит списки событий для первых секторов, списки событий по группам (нейтральные, опасности, туманности, маяки бедствий и т.д.), а также советы, показываемые в стартовом событии первого сектора. Здесь также находятся некоторые простые события. –>
sector_data.xml.rawclobber <!– Описывает структуру секторов. –>
sounds.xml.rawclobber <!– Здесь закодированы звуки и музыка. –>
tooltips.xml.rawclobber <!– Всплывающие подсказки для различных элементов интерфейса. –>
tutorial.xml.rawclobbe

2. Моддинг улучшений, систем, оружия и дронов.

<?xml version=”1.0″ encoding=”utf-8″?>

<!– ГАЙД ПО МОДДИНГУ FTL –>

<!– Автор bamalf, специально для группы [link] –>

2. Моддинг улучшений, систем, оружия и дронов.

Код для оружия и дронов записывается в blueprints.xml.rawclobber (основная часть) и частично в dlcBlueprints.xml.rawclobber. Новые вещи я рекомендую записывать в первом файле, для удобства.

2.1. Улучшения.

Рассмотрим пример улучшения.

<augBlueprint name=”SCRAP_COLLECTOR”>
<title>Кран для сбора лома</title>
<desc>Позволяет собирать на 15% больше лома из любого источника.</desc><!–ребаланс 10%–>
<cost>50</cost><!–ребаланс 50–>
<bp>8</bp>
<rarity>1</rarity>
<stackable>true</stackable>
<value>0.15</value><!–ребаланс 0.10–>
</augBlueprint>

Код улучшения начинается со строки имени улучшения <augBlueprint name=”SCRAP_COLLECTOR”> и заканчивается закрытием кода </augBlueprint>. Знак / обозначает конец кода этого элемента. Каждый тег в треугольных скобках должен быть закрыт! В закрывающей строке может быть написано в принципе что угодно. Например, </augGorshok> игра корректно воспримет и закроет код элемента. Но такого, разумеется, писать на надо 🙂

Все последующие строки для удобства восприятия отделяются табуляцией. Можно вообще писать весь код в одну строку, но я рекомендую придерживаться того же форматирования, что и разработчики.
Далее используются простые теги в одну строку, их порядок не принципиален, но я также рекомендую использовать порядок, который выбрали разработчики. Каждый тег обязательно должен быть закрыт в конце строки.

<title>Кран для сбора лома</title> Название улучшения (и вообще любого другого предмета в игре).
<desc>Позволяет собирать на 15% больше лома из любого источника.</desc> Его описание.
Далее идёт закомментированный текст <!–ребаланс 10%–>, который не является кодом и служит для создания пометок и комментариев. Чтобы быстро закомментировать выделенный фрагмент текста, нажмите Ctrl+K.
<cost>50</cost> Цена. Цена продажи генерируется автоматически, она равна половине от цены покупки.
<bp>8</bp> Видимо, это некая система градации по степени крутости предмета. Похоже, что в игре это нигде не применяется.
<rarity>1</rarity> Группа редкости предмета. Предметы с редкостью 1 будут встречаться чаще всего, максимальная редкость 5 используется для самых редких предметов. Возможно, можно назначать и редкость выше пяти, но я не пробовал. Предметы с редкостью 0 вообще не будут встречаться в магазинах и случайных событиях, такие предметы можно получить только в качестве особой награды в событии.
<stackable>true</stackable> Значение true позволяет иметь несколько таких предметов одновременно, false запрещает это делать.
<value>0.15</value> Цифровое значение для этого улучшения. Не все улучшения имеют цифровые значения, но даже те, которые их имеют, не всегда зависят от этой строки. Например, ремонтный гель слизней имеет цифровое значение, но как бы вы его не меняли, скорость зарастания брешей не изменится.

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

<!– ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ –>

2.2. Системы.

Далее рассмотрим пример кода системы щитов.

<systemBlueprint name=”shields”>
<type>shields</type>
<title>Щиты</title>
<desc>Снабжает энергией ваши щиты. Каждый дополнительный слой щита блокирует одно попадание.</desc>
<startPower>2</startPower>
<maxPower>8</maxPower>
<rarity>1</rarity>
<upgradeCost>
<level>100</level> <!– level 2 –>
<level>20</level> <!– level 3 –>
<level>30</level> <!– level 4 –>
<level>40</level> <!– level 5 –>
<level>60</level> <!– level 6 –>
<level>80</level> <!– level 7 –>
<level>100</level> <!– level 8 –>
<level>120</level> <!– Imaginary level 9 –>
</upgradeCost>
<cost>125</cost>
</systemBlueprint>

<systemBlueprint name=”shields”> Первая строка содержит имя системы. Именно на имена ссылаются, когда хотят вызвать систему (или что-то другое) в коде события.
<type>shields</type> Тип системы, используется для вызова всплывающей подсказки к этому элементу, а также, видимо, используется для взаимодействия с исполняемым файлом игры (хардкод).
<title>Щиты</title> Название.
<desc>Снабжает энергией ваши щиты. Каждый дополнительный слой щита блокирует одно попадание.</desc> Описание.
<startPower>2</startPower> Уровень питания, с которым эта система покупается в магазине.
<maxPower>8</maxPower> Максимальный возможный уровень прокачки системы.
<rarity>1</rarity> Редкость.
<upgradeCost>
<level>100</level> <!– level 2 –>
<level>20</level> <!– level 3 –>
<level>30</level> <!– level 4 –>
<level>40</level> <!– level 5 –>
<level>60</level> <!– level 6 –>
<level>80</level> <!– level 7 –>
<level>100</level> <!– level 8 –>
<level>120</level> <!– Imaginary level 9 –>
</upgradeCost> Стоимость прокачки. Первая строка показывает цену прокачки на второй уровень, последняя строка в игре не используется, т.к. она отвечает за прокачку на 9 уровень, а максимальный возможный только 8. Зачем она нужна, я не знаю.
<cost>125</cost> Цена системы в магазине.
</systemBlueprint> Конец кода, закрытие строки.

В некоторых системах используется строка <locked>1</locked>. Она означает, что после использования системы, она уходит на перезарядку.

Топливо, ракеты и детали дронов имеют схожие теги параметров, их я рассматривать отдельно не буду.
Про расы тоже добавить особо нечего, ни создать новую расу, не отредактировать какие-то характеристики существующих невозможно, только перерисовать их графику. Одна раса осталась недоделанной разработчиками, но её код доступен для включения в игру в виде мода. Речь идёт об аватарах, если кто не понял 🙂 Соответствующий блюпринт называется <crewBlueprint name=”ghost”>.

<!– ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ –>

2.3. Оружие.

Пример:

<weaponBlueprint name=”LASER_HEAVY_1_SP”>
<type>LASER</type>
<title>Тяж. проникающий лазер</title>
<short>Тяж. проник.</short>
<tip>tip_laser</tip>
<desc>Тяжёлые лазеры способны нанести больше ущерба, нежели их меньшие аналоги — импульсные лазеры. Данная модификация проникает сквозь 1 слой щита.</desc>
<tooltip>Делает 1 выстрел, нанося 2 единицы повреждения с низкой вероятностью нарушить целостность корпуса или начать пожар. Проникает сквозь 1 слой щита. </tooltip>
<damage>2</damage>
<shots>1</shots>
<sp>1</sp>
<fireChance>3</fireChance>
<breachChance>3</breachChance>
<cooldown>10</cooldown>
<power>2</power>
<cost>50</cost>
<bp>6</bp>
<rarity>4</rarity>
<image>laser_heavy1</image>
<launchSounds>
<sound>heavyLaser1</sound>
<sound>heavyLaser2</sound>
<sound>heavyLaser3</sound>
</launchSounds>
<hitShipSounds>
<sound>hitHull1</sound>
</hitShipSounds>
<hitShieldSounds>
<sound>hitShield1</sound>
<sound>hitShield2</sound>
<sound>hitShield3</sound>
</hitShieldSounds>
<missSounds>
<sound>miss</sound>
</missSounds>
<weaponArt>laser_heavy_1</weaponArt>
<iconImage>heavyL</iconImage>
</weaponBlueprint>

<weaponBlueprint name=”LASER_HEAVY_1_SP”> Имя блюпринта оружия. Дальнейший порядок тегов не принципиален.
<type>LASER</type> Его тип. Различают следующие типы оружия: LASER — лазеры, MISSILES — ракеты (не имеют принципиальных отличий от лазеров, любой лазер можно сделать ракетой), BEAM — лучи, BOMB — бомбы, BURST — осколочные снаряды.
Иногда после этой строки пишут подтип оружия, например <flavorType>Тяжёлый лазерный снаряд</flavorType> такой код выведет во всплывающее окно после строки “Тип: Лазер” строку “Тяжёлый лазерный снаряд”
<title>Тяж. проникающий лазер</title> Полное название оружия. Следите за тем, чтобы оно помещалось в окошке описания о

3. Корабли.

<?xml version=”1.0″ encoding=”utf-8″?>

<!– ГАЙД ПО МОДДИНГУ FTL –>

<!– Автор bamalf, специально для группы [link] –>

3. Корабли.

Все корабли в игре можно разделить на 3 типа:
– Корабли под управлением игрока. 8 штук по три типа и ещё 2 по 2 типа. Итого 28.
– Корабли противника. Этих в принципе может быть сколько угодно.
– Корабли босса. Их целых 3 штуки для каждой фазы, и ещё по 3 для каждого уровня сложности. Итого 9.

3.1. Начну с самых распространённых — кораблей противников. Они в основном записаны в файле autoBlueprints.xml.rawclobber.

Итак, возьмём пример типичного корабля противника:
<shipBlueprint name=”CIRCLE_SCOUT” layout=”circle_scout” img=”circle_scout”>
<class>Разведчик инжи</class>
<maxSector>7</maxSector>
<systemList>
<pilot power=”1″max=”3″ room=”5″/>
<doors power=”1″ max=”3″ room=”2″ start=”false”/>
<medbay power=”1″ max=”3″ room=”6″ start=”false”/>
<oxygen power=”1″ max=”3″ room=”3″/>
<shields power=”2″ max=”8″ room=”1″/>
<engines power=”1″ max=”5″ room=”7″/>
<weapons power=”2″ max=”8″ room=”4″/>
<drones power=”2″ max=”8″ room=”0″/>
</systemList>
<weaponList missiles=”6″ load=”WEAPONS_CIRCLE”/>
<droneList drones=”4″ load=”DRONES_DEFENSE”/>
<health amount=”7″/>
<maxPower amount =”8″/>
<crewCount amount = “2” max=”5″ class=”engi”/><!–CHANGED was 2 3–>
<boardingAI>sabotage</boardingAI>
<aug name=”NANO_MEDBAY”/>
<cloakImage>circle_scout</cloakImage>
</shipBlueprint>

<shipBlueprint name=”CIRCLE_SCOUT” layout=”circle_scout” img=”circle_scout”> Первая строка описывает имя блюпринта, layout отвечает за планировку отсеков, а img за изображение корпуса. Можно создать корабль с тем же самым корпусом, но отличной планировкой, это будет выглядеть, например, так: <shipBlueprint name=”CIRCLE_SCOUT_2″ layout=”circle_scout_2″ img=”circle_scout”>
<class>Разведчик инжи</class> Это имя корабля, которое будет написано в окошке врага вверху справа.
<maxSector>7</maxSector> (есть аналогичный параметр <minSector>2</minSector>) указывает, в каком максимальном по счёту номере сектора может появиться этот корабль, если корабль вызывается из списка. Например, мы находимся в 5-м секторе, и у нас есть список из двух кораблей. В первом корабле максимальный сектор не ограничен, а во втором есть строка <maxSector>3</maxSector>. Таким образом, второй корабль из списка не может выбраться, а значит нам выпадет первый корабль. Если этого тега нет в коде корабля, на него не накладываются ограничения по номеру сектора.
<systemList>
<pilot power=”1″max=”3″ room=”5″/>
<doors power=”1″ max=”3″ room=”2″ start=”false”/>
<medbay power=”1″ max=”3″ room=”6″ start=”false”/>
<oxygen power=”1″ max=”3″ room=”3″/>
<shields power=”2″ max=”8″ room=”1″/>
<engines power=”1″ max=”5″ room=”7″/>
<weapons power=”2″ max=”8″ room=”4″/>
<drones power=”2″ max=”8″ room=”0″/>
</systemList> Здесь перечислены все возможные системы на этом корабле. Параметр power определяет минимальное значение для этой системы. Минимальные значения встречаются в начальных секторах игры, и плавно возрастают до значений max ближе к концу игры. Параметр start=”false” означает, что данной системы может не быть в начальных секторах. А может и будет, на всё воля рандома 🙂 При отсутствии этого параметра, или же при start=”true” система всегда будет присутствовать на корабле. Параметр room показывает, в каком отсеке будет находиться данная система. О планировках и расположении отсеков и дверей я расскажу позднее.
<weaponList missiles=”6″ load=”WEAPONS_CIRCLE”/> Параметр missiles задаёт количество ракет на борту, а load загружает список орудий для этого корабля. При этом рандом набирает необходимое количество стволов из этого списка, в зависимости от прокачки орудийной системы. Дополнительно можно прописать конкретное число орудий, которое будет на этом корабле, например три: <weaponList missiles=”8″ count=”3″ load=”WEAPONS_AUTO”/>. Если хотите ограничить максимум слотов для оружия, добавляйте строку типа <weaponSlots>3</weaponSlots>, здесь стоит ограничение на 3 слота.
<droneList drones=”4″ load=”DRONES_DEFENSE”/> Аналогично для дронов, где drones — число деталей дронов. Ограничение по слотам задаётся так: <droneSlots>3</droneSlots>
<health amount=”7″/> Количество здоровья корпуса корабля.
<maxPower amount =”8″/> Максимальный размер реактора. Бесполезный параметр, т.к. игра всегда делает реактор таким, чтобы все системы были запитаны по максимуму. Не знаю, для чего он нужен.
<crewCount amount = “2” max=”5″ class=”engi”/> Число экипижа минимум/максимум и раса. Для беспилотников эта строка выглядит так: <crewCount amount = “0” max=”0″ class=”human”/>.
<boardingAI>sabotage</boardingAI> Тип поведения ИИ при абордаже. Существует 2 типа поведения — sabotage и invasion. Первый — обычное поведение противника, враги атакуют до тех пор, пока у них достаточно здоровья. При втором типе поведения каждый персонаж нападает не более одного раза, этот тип поведения используется на третьей фазе битвы с боссом.
<aug name=”NANO_MEDBAY”/> Тут мы можем вставить до трёх улучшений на вражеский корабль, каждое пишем с новой строки. Надо иметь в виду, что не все улучшения враг может использовать. Например, предзажигатель орудий он не умеет применять.
<cloakImage>circle_scout</cloakImage> Изображение корабля при включённой маскировке. К названию файла изображения нужно приписать префикс _cloak, например anaerobic_cruiser_cloak.png. Если корабль не использует маскировку, это изображение можно не рисовать.

Рассмотрим подробнее планировку отсеков. За планировку отвечает параметр layout=”circle_scout” в первой строке блюпринта корабля. В папке data должны находиться 2 файла с таким именем (circle_scout), один с расширением xml, а другой с txt. Так как этот корабль в моде остаётся без изменений (ну почти), рассмотрим планировку circle_scout_2.

<img x=”-42″ y=”-47″ w=”300″ h=”282″/> Здесь указываются координаты смещения изображения корпуса корабля относительно некоторой точки с нулевыми координатами. Игра автоматически размещает корабль так, чтобы его отсеки были в центре окошка, поэтому следите за тем, чтобы отсеки находились в центре корпуса, иначе в одну сторону корпус будет ближе к краю окошка. Далее идут размеры изображения по высоте и ширине.
<offsets>
<floor x=”0″ y=”0″ />
<cloak x=”19″ y=”15″ />
</offsets> Здесь пишутся координаты смещения графики полов (если они есть) и маскировки (аналогично). Для вражеских кораблей полы обычно не создаются, а маскировка есть не у всех кораблей.

<weaponMounts>
<mount x=”32″ y=”70″ rotate=”false” mirror=”true” gib=”1″ slide=”left” />
<mount x=”226″ y=”70″ rotate=”false” mirror=”false” gib=”2″ slide=”right” />
<mount x=”135″ y=”32″ rotate=”false” mirror=”false” gib=”1″ slide=”up” />
<mount x=”268″ y=”160″ rotate=”false” mirror=”false” gib=”4″ slide=”right” />
</weaponMounts> Здесь находятся координаты орудийных стволов, они могут быть повёрнуты (rotate=”true”), отзеркалены (mirror=”true”), прикреплены к определённому обломку корабля, вместе с которым ствол будет перемещаться при его взрыве (gib=”1″), а также задаётся направление, в какую сторону ствол выезжает при включении орудия (slide=”left”). Если выдвижение оружия не нужно, ставьте параметр slide=”no”

Последний блок отвечает за взрыв и разлёт осколков.
<explosion>
<gib1>
<velocity min=”0.10″ max=”1.00″ />
<direction min=”20″ max=”160″ />
<angular min=”-1.00″ max=”1.00″ />
<x>0</x>
<y>0</y>
</gib1>
<gib2>
<velocity min=”0.10″ max=”0.30″ />
<direction min=”280″ max=”350″ />
<angular min=”-1.00″ max=”1.00″ />
<x>74</x>
<y>0</y>
</gib2>
<gib3>
<velocity min=”0.40″ max=”1.00″ />
<direction min=”190″ max=”260″ />
<angular min=”-0.40″ max=”1.00″ />
<x>11</x>
<y>92</y>
</gib3>
<gib4>
<velocity min=”0.10″ max=”0.60″ />
<direction min=”-40″ max=”40″ />
<angular min=”-0.50″ max=”0.50″ />
<x>123</x>
<y>104</y>
</gib4>
<gib5>
<velocity min=”1.00″ max=”3.00″ />
<direction min=”-180″ max=”180″ />
<angular min=”-1.00″ max=”1.00″ />
<x>90</x>

4. Списки и события.

<?xml version=”1.0″ encoding=”utf-8″?>

<!– ГАЙД ПО МОДДИНГУ FTL –>

<!– Автор bamalf, специально для группы [link] –>

4. Списки и события.

4.1. Списки.

Любые однотипные объекты в игре могут объединяться в списки. Если какое-то событие ссылается на такой список, игра случайно выбирает один из элементов списка. Например, нам нужно вызвать случайный пиратский корабль золтанцев, список таких кораблей выглядит так:

<blueprintList name=”OVERRIDE_SHIPS_ZOLTAN_PIRATE”>
<name>ZOLTAN_FIGHTER_P</name>
<name>ZOLTAN_BOMBER_P</name>
<name>ZOLTAN_FIGHTER_P_DLC</name>
<name>ZOLTAN_BOMBER_P_DLC</name>
</blueprintList>

Ссылаясь на имя блюпринта SHIPS_ZOLTAN_PIRATE (Префикс OVERRIDE_ игнорируется, т.к. он обозначает включённый режим АЕ), мы получим один из этих 4-х кораблей.

В списки помимо кораблей могут объединяться оружие, дроны, улучшения, расы, а также события и тексты событий.

Создавая новое оружие или корабль, не забывайте добавлять их в списки, чтобы игра могла их случайно выбирать среди других орудий или кораблей. Например, вы создали оружие, похожее на тяжёлый лазер. С помощью поиска сначала найдём сам тяжёлый лазер, его блюпринт называется <weaponBlueprint name=”LASER_HEAVY_1″>. Затем опять же поиском ищем все списки, в которые входит тяжёлый лазер LASER_HEAVY_1. Включайте галочки “только целые слова” и “учитывать регистр”, чтобы отсеивать лишние результаты. Вы найдёте блюпринт тяжёлого лазера в нескольких списках, причём даже в разных файлах. Теперь после каждого тяжёлого лазера вставьте строку с именем блюпринта вашего нового орудия, таким образом вы добавите его в каждый список, где уже есть тяжёлый лазер.

<blueprintList name=”WEAPONS_LASER”>

<name>LASER_HEAVY_1</name>
<name>LASER_SUPER_HEAVY_1</name>
<name>LASER_HEAVY_2</name>

</blueprintList>

<!– ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ –>

4.2 События.

Возьмём для примера событие с гигантскими пауками:

<event name=”DISTRESS_INFESTATION” unique=”true”>
<text>Вы обнаружили несколько небольших кораблей, спасающихся со станции. Вы приветствуете их и интересуетесь, что случилось. «Помогите! На нас напали какие-то огромные инопланетные пауки!» — отвечают они.</text>
<distressBeacon/>
<choice hidden=”true”>
<text>Отправить экипаж на помощь! Гигантские инопланетные пауки — это не шутки!</text>
<event load=”DISTRESS_INFESTATION_LIST”/>
</choice>
<choice hidden=”true”>
<text>Оставить их в покое.</text>
<event>
<text>Вы не можете рисковать, сражаясь с неизвестными пришельцами на каждой захудалой станции, которая вам попадается. Вы готовитесь к прыжку.</text>
</event>
</choice>
<choice hidden=”true” req=”DRONES_BATTLE”>
<text>(Противопехотный дрон) Послать вашего боевого дрона на помощь.</text>
<event>
<text>Вы разворачиваетесь в сторону станции и выпускаете через воздушный шлюз дрона. Очень быстро большая часть мерзких существ была перебита, с минимумом потерь. Хозяева кораблей выражают свою искреннюю благодарность.</text>
<autoReward level=”MED”>stuff</autoReward>
<item_modify>
<item type=”drones” min=”-1″ max=”-1″/>
</item_modify>
</event>
</choice>
<choice hidden=”true” req=”DRONES_BOARDER”>
<text>(Абордажный дрон) Отправить дрона на станцию.</text>
<event>
<text>Вы запускаете дрона, и он пробивает их корпус, оставляя огромную дыру. Вы наблюдаете, как дрон прорывается сквозь чудовищ, а обломки и трупы вылетают через дыру. Владельцы станции не очень восторженны, когда благодарят вас и предлагают только скудное вознаграждение. Наверное, самое время уходить…</text>
<autoReward level=”LOW”>standard</autoReward>
<item_modify>
<item type=”drones” min=”-1″ max=”-1″/>
</item_modify>
</event>
</choice>
<choice hidden=”true” req=”BEAMS_BIO”>
<text>(Анти-био луч) Использовать луч, чтобы перебить пауков.</text>
<event>
<text>Вы дали им указания опустить щиты, и вам удалось убить чудовищ, не повреждая станцию. «Мы наблюдали, как монстры воспламенялись. Какое ужасное оружие… Вот, возьми это за помощь, друг».</text>
<autoReward level=”HIGH”>stuff</autoReward>
</event>
</choice>
</event>
<eventList name=”DISTRESS_INFESTATION_LIST”>
<event>
<text>Ваш экипаж высадился на станцию, осторожно передвигаясь между коридорами. Внезапно из системы вентиляции вырывается паукообразное насекомое размером с человека, а за ним следует множество других. Вы с боем прорываетесь к шлюзу и вынуждены покинуть станцию, не дожидаясь всех членов экипажа. Кому-то не удалось вернуться.</text>
<removeCrew>
<clone>true</clone>
<text>Вы с надеждой идёте в клон-отсек, и, к вашему облегчению, клон потерянного члена экипажа уже готов.</text>
</removeCrew>
</event>
<event>
<text>Ваша команда осторожно подкрадывается сзади к скоплению существ. Неожиданно гигантские арахниды разворачиваются и атакуют. Впрочем, ваша команда сохранила самообладание и без промедления откинула тварей назад.</text>
<choice hidden=”true”>
<text>Связаться с владельцами станции.</text>
<event>
<text>Они в восторге от вашего успеха и предлагают вам награду.</text>
<autoReward level=”HIGH”>stuff</autoReward>
</event>
</choice>
</event>
</eventList>

Обратите внимание на форматирование кода. Каждый новый тег сдвигается табуляцией на одну строку вправо, за исключением тегов, идущих за тегом <text>, такие теги пишутся на одном уровне:

<text>Они в восторге от вашего успеха и предлагают вам награду.</text>
<autoReward level=”HIGH”>stuff</autoReward>

Закрывающий тег ставится с таким же отступом, что и открывающий:

<event>
<text>Они в восторге от вашего успеха и предлагают вам награду.</text>
<autoReward level=”HIGH”>stuff</autoReward>
</event>

Я очень рекомендую придерживаться такого стиля форматирования, он очень облегчает чтение кода.

Итак, разберём первую строку.
<event name=”DISTRESS_INFESTATION” unique=”true”> Каждое событие в игре должно иметь уникальное имя. После имени может указываться параметр уникальности unique=”true”, он означает, что в текущем секторе не может появиться второе такое же событие (но оно всё ещё может встретиться в последующих секторах). Большинство событий в игре имеют параметр unique=”true”. Если этот параметр не задан или задан unique=”false”, игра может выдать то же самое событие в текущем секторе снова. А может и не выдать.

На второй строке видим описание события в текстовом теге. Далее на этом же уровне отступа следует короткий тег без параметров <distressBeacon/>. Запомните, все такие короткие теги без параметров закрываются слэшем справа, в отличии от сложных тегов, состоящих из двух частей!
Этот тег означает метку сигнала бедствия, которая отображается на карте маяков при прыжке.

Существуют следующие виды меток:
<distressBeacon/> — сигнал бедствия
<store/> — магазин
<repair/> — ремонт

Неважно в какой последовательности идёт метка, до или после описания события в тегах <text>, но я предпочитаю написать сначала все метки, а уже потом вставлять описание события.

<!– Что ещё может быть в начале события, кроме метки и его описания? Конкретно в этом событии с пауками больше ничего нет, но есть ещё варианты: –>

Событие может иметь уникальный фон и планету на заднем плане. Если ничего не прописано, то по умолчанию загружается <img back=”BACKGROUND” planet=”PLANET”/>, то есть событие с пауками на самом деле выглядит так:

<event name=”DISTRESS_INFESTATION” unique=”true”>
<img back=”BACKGROUND” planet=”PLANET”/>
<distressBeacon/>
<text>…</text>

</event>

Списки фонов и планет находятся в events_imageList.xml.rawclobber. Часто в событие нужно вставить обитаемую планету, в этом случае вам подойдёт такой список планет:
<imageList name=”PLANET_POPULATED”>

Если нужно вставить только фон, без планеты, код будет выглядеть так:
<event name=”DISTRESS_INFESTATION” unique=”true”>
<img back=”BACKGROUND” planet=”NONE”/>

Если нужно вставить конкретный фон или конкретную планету,

Скачать этот гайд в xml-файлах

Ссылки на xml-файлы с этим гайдом:

1 раздел[www.dropbox.com]

2 раздел[www.dropbox.com]

3 раздел[www.dropbox.com]

4 раздел[www.dropbox.com]

SteamSolo.com