Starbound

Starbound

536 ratings
Моддинг в Starbound
By 76561197988369829
Базовая информация о моддинге в Starbound с подробными примерами того, как добавлять в игру свои объекты, предметы, оружие, расы или даже корабли. Также описан ряд технических нюансов и особенностей, связанных с процессом модифицирования игры.
2
7
2
2
   
Award
Favorite
Favorited
Unfavorite
Предисловие
Руководство создано в помощь лицам, желающим создать свой мод, но не до конца осознающим, с чего им следует начать. Я постарался максимально доступно рассмотреть основные примеры игрового контента и то, как следует его добавлять в игру.

Прошу учесть, что процесс создания модов не быстр и весьма зануден - если вы нетерпеливый человек, считающий, что будет достаточно "щёлкнуть пальцами" и всё будет готово, то вы серьёзно ошибаетесь и, скорее всего, не получите никакого удовольствия от процесса работы.

Для работы вам понадобится удобный для вас текстовый редактор. Можно обойтись даже стандартным блокнотом, но я рекомендую обратить взор на Notepad++ - он весьма прост в обращении, а его функционал идеально подходит для работы. Скачать можно здесь[notepad-plus-plus.org].

Для редактирования спрайтов также понадобится какой-нибудь графический редактор: Paint, GIMP, Photoshop... Любой, удобный вам - главное, чтобы PNG открывал.

В первой половине руководства рассмотрены реальные примеры контента, а во второй описаны некоторые приёмы и нюансы моддинга. Прежде чем переходить к выполнению сложных примеров (с 5 по 9), рекомендую сначала ознакомиться со всеми разделами руководства.

Несколько важных фактов:

1. Все создаваемые текстовые файлы должны быть сохранены в кодировке UTF-8.

2. В названиях файлов и папок можно использовать только символы латинского алфавита и цифры.

3. Объект (object) - это то, что в размещается в игровой области: ящики, мебель, светильники и прочее тому подобное.

4. Предмет (item) - это то, что используется персонажем: аптечки, броня, оружие, фонарик и так далее.
Подготовка мода
Для начала нужно открыть папку с установленной игрой. При наличии официальной стим-версии игры, проще всего сделать это через клиент Steam следующим образом:

Через верхнее меню переходим в раздел Библиотека, затем в левом меню находим Starbound и щёлкаем по нему правой кнопкой мыши.

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

Переходим в mods, создаём внутри новую директорию mymod (можно другое, удобное вам название). В названии используем только символы латинского алфавита и цифры.

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

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

В папке с модом создаём директорию objects, в ней директорию mypic, а уже в ней файл mypic.object.

Название файла и директории mypic - это всего лишь пример, вы можете использовать любое угодное вам название, главное, чтобы оно было "свободно" - то есть не встречалась ранее в стандартных игровых файлах, а также установленных вами модах.

Ещё нужен спрайт плаката и его иконка для инвентаря. Оба графических файла в формате PNG. Иконка на самом деле необязательна - вместо неё вполне можно указывать основной спрайт, однако в примерах я буду указывать всё полностью. Для тестирования можно использовать подготовленные мной файлы.

скачиваем в директорию mypic (mods/mymod/objects/mypic), как название задаём mypic.png.


скачиваем в директорию mypic (mods/mymod/objects/mypic), как название задаём mypic_icon.png.

Через текстовый редактор задаём файлу mypic.object следующее содержание:
{ "objectName" : "mypic", "colonyTags" : ["alpine"], "rarity" : "Common", "description" : "Описание", "shortdescription" : "Название", "race" : "generic", "category" : "decorative", "price" : 1000, "printable" : true, "apexDescription" : "Комментарий апекса", "avianDescription" : "Комментарий авиана", "floranDescription" : "Комментарий флорана", "glitchDescription" : "Комментарий глитча", "humanDescription" : "Комментарий человека", "hylotlDescription" : "Комментарий хилотла", "novakidDescription" : "Комментарий новакида", "inventoryIcon" : "mypic_icon.png", "orientations" : [ { "image" : "mypic.png", "imagePosition" : [0, 0], "frames" : 1, "animationCycle" : 0.5, "spaceScan" : 0.1, "anchors" : [] } ] }

objectName
Уникальный технический идентификатор (ID) объекта. Не должен повторяться в других объектах и предметах.

colonyTags
Тег типа колониста, который должен жить в комнате с этим объектом.

Можно указывать несколько вариантов подобным образом: ["crafting","electronic"], но тогда тип колониста в комнате будет выбираться случайно при его спавне.

Все возможные варианты тегов можно глянуть здесь[starbounder.org]. Теги с колонистами, это те, что Tenants - Yes.

rarity
Редкость объекта. По факту - влияет лишь на цвет рамки объекта, когда он в инвентаре.

Доступные варианты:
Common
Uncommon
Rare
Legendary
Essential

Насколько мне известно, создать собственные уровни редкости или отредактировать имеющиеся невозможно. Это обусловлено тем, что разработчики прописали систему редкости в часть игрового движка закрытую для модифицирования.



description
Игровое описание объекта.

shortdescription
Игровое название объекта.

race
Раса, к которой относится объект.
generic - общий вариант.

category
Краткое пояснение, характеризующее объект.
Демонстрируется в инвентаре, при наведении курсора на объект.

Некоторые сочетания автоматически преобразовываются в игре, например: crafting в игре показывается как Crafting Station.



price
Стоимость объекта в игровой валюте.

printable
Возможно ли копировать объект при помощи принтера.

true - можно.
false - нельзя.

apexDescription, avianDescription, floranDescription, glitchDescription, humanDescription, hylotlDescription, novakidDescription
Комментарий игрового персонажа об объекте. Зависит от расы и произносится при клике на объект в режиме исследования (по умолчанию - N).

inventoryIcon
Путь к файлу иконки объекта. Иконка демонстрируется пока объект находится в инвентаре.

Далее группа параметров orientations, отвечающая за поведение и расположение объекта в игре.

orientations: image
Путь к игровому спрайту.

orientations: imagePosition
Координаты сдвига спрайта размещённого объекта, первая цифра отвечает за горизонтальное положение, а вторая за вертикальное.

Эти координаты могут быть полезны для, как вам кажется, правильного позиционирования объектов нестандартных размеров, то есть занимающих не целые блоки, а например, 2,5 блока по ширине или высоте. Отрицательное значение (с минусом) сдвигает объект влево и, соответственно, вниз.

Три примера:

0, 0 - это стандартные координаты, подходящие для большинства задуманных объектов.
-5, -10 - сдвинет объект на 5 пиксов влево и 10 вниз.
5, 10 - сдвинет объект на 5 пиксов вправо и 10 вверх.

Иллюстрация для упрощения понимания работы координат.


orientations: anchors
Плоскость, на которую ставится объект.

top - к потолку (например: люстра).
bottom - к полу (например: диван).
background - к заднему фону (например: картина).

Остальные параметры в orientations пока что не важны.

Как только спрайты и файл "mypic.object" будут готовы, останется проверить в игре, правильно ли всё сделано.

Включаем игру, заходим на персонажа, вводим в консоль следующие команды:
/admin
/spawnitem mypic
В данном случае mypic - это уникальный ID нашего объекта.
Режим админа можно отключить повторным вводом команды /admin.

Если что-то у Вас не получается, например, вместо добавленного предмета появляется зелёная болванка, переходите к разделу "Ничего не работает!".
Пример: станок для крафтинга
Команда spawnitem очень удобна, но в игровом плане не особо эстетична - стоит добавить свой станок для создания предметов.

В директории objects мода создаём новую директорию mycraft, а в ней файлы mycraft.object и mycraft.frames. Названия должны быть одинаковы, различаются только расширения файлов.

Не забываем картинки.


Скачиваем в директорию mycraft (mods/mymod/objects/mycraft), как название задаём mycraft.png.

скачиваем в директорию mycraft (mods/mymod/objects/mycraft), как название задаём mycraft_icon.png.

Файлу mycraft.object задаём содержание:
{ "objectName" : "mycraft", "colonyTags" : ["alpine"], "printable" : false, "rarity" : "Common", "interactAction" : "OpenCraftingInterface", "interactData" : { "config" : "/interface/windowconfig/crafting.config", "filter" : [] }, "category" : "crafting", "price" : 2400, "description" : "Большой синий станок, игриво мигает лампочками.", "shortdescription" : "Крафтовый станок", "race" : "generic", "apexDescription" : "Комментарий апекса", "avianDescription" : "Комментарий авиана", "floranDescription" : "Комментарий флорана", "glitchDescription" : "Комментарий глитча", "humanDescription" : "Комментарий человека", "hylotlDescription" : "Комментарий хилотла", "novakidDescription" : "Комментарий новакида", "inventoryIcon" : "mycraft_icon.png", "orientations" : [ { "dualImage" : "mycraft.png:<color>.<frame>", "imagePosition" : [-24, 0], "frames" : 8, "animationCycle" : 1.0, "spaceScan" : 0.1, "anchors" : [] } ] }

interactAction
Действие, которое происходит при взаимодействии с объектом.

Группа параметров interactData отвечает за различные нюансы взаимодействия с объектом.

interactData: config
Путь к файлу настроек действия, производимого при использовании объекта.

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

interactData: filter
Параметр, отвечающий за выборку рецептов для станка.

Группа параметров orientations здесь отличается от статичного декоративного объекта, поскольку спрайт в этот раз анимирован.

interactData: dualImage
Путь к спрайту.

Отличие этого варианта от обычного images в том, что появляется возможность зеркально отражать объект при размещении. Если спрайт состоит из одного кадра (т.е. он без анимации), приставка :<color>.<frame> в конце не нужна.

interactData: frames
Количество кадров в спрайте.

interactData: animationCycle
За какое время полностью проигрывается анимация спрайта.
1.0 - одна секунда. Чем меньше значение, тем быстрее скорость анимации.

Файлу mycraft.frames задаём содержание:
{ "frameGrid" : { "size" : [48, 32], "dimensions" : [8, 1], "names" : [ [] ] }, "aliases" : { "default.default" : "default.0" } }

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

frameGrid: size
Размер одного кадра в пиксах. Сначала ширина, а затем высота.

frameGrid: dimensions
Определение раскадровки вашего спрайта. Сначала указывается числов кадров в одном ряду, а затем количество рядов. В примере получается 1 ряд с 8 кадрами: 8, 1.

Остальные параметры этого файла будут рассмотрены в других примерах.

Включаем игру, заходим на персонажа, вводим в консоль следующие команды:
/admin
/spawnitem mycraft

Станок готов, но пока что в нём нет рецептов, а потому пришло время - разберёмся с ними в Примере 3.
Пример: рецепты
В папке с модом создаём директорию recipies, а в ней директорию mycrafting.
Создаём в mycrafting два файла: mycraft.recipe и mypic.recipe.

Содержимое файла mycraft.recipe:
{ "input" : [ { "item" : "money", "count" : 50 } ], "output" : { "item" : "mycraft", "count" : 1 }, "duration" : 1.0, "groups" : [] }

Содержимое файла mypic.recipe:
{ "input" : [ { "item" : "logblock", "count" : 4 }, { "item" : "torch", "count" : 1 } ], "output" : { "item" : "mypic", "count" : 5 }, "duration" : 0.25, "groups" : [] }

input
Массив с перечислением ингредиентов, требуемых для крафта.

input: item
ID ингредиента (это может быть как объект, так и предмет).

input: count
Количество требуемого ингредиента.

output: item
ID создаваемого объекта или предмета.

output: count
Количество продукции, получаемой за один крафт.

duration
Сколько времени займёт процесс создания.

groups
Фильтр станков, к которым относится данный рецепт. Помните параметр filtres в файле mycraft.object? Вот с его помощью и соотносятся между собой станки и рецепты.

Вариант plain - это крафт "из рук" (по-умолчанию - C).

Осталось "выучить" рецепты - это делается исправлением файла стандартных настроек персонажа player.config. Есть вариант полностью скопировать этот файл в свой мод, внеся нужные изменения, но это плохо - так лучше не делать.

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

Лучший вариант - пропатчить нужный нам файл, не заменяя его.

Возвращаемся в корневую директорию мода (mymod) и создаём в ней новый файл с названием player.config.patch.

Содержимое файла player.config.patch.
[ { "op" : "add", "path" : "/defaultBlueprints/tier1/-", "value" : { "item" : "mycraft" } }, { "op" : "add", "path" : "/defaultBlueprints/tier1/-", "value" : { "item" : "mypic" } } ]

Простой манипуляцией мы внедрили свои рецепты в массив, в котором хранятся доступные со старта игры рецепты. Аналогичным образом (указав, разумеется, правильное название файла и редактируемого массива) можно вносить изменения и в другие важные игровые файлы, которые лучше не коверкать целиком.

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

Создаём в objects новую директорию, называем её mysafe и создаём файлы mysafe.object и mysafe.frames.

скачиваем в директорию mysafe (mods/mymod/objects/mysafe), как название задаём mysafe.png.

скачиваем в директорию mysafe (mods/mymod/objects/mysafe), как название задаём mysafe_icon.png.

Полагаю, что к этому моменту кто-то одарённый уже мог догадаться, что файлы объектов можно складировать и напрямую в папку objects, игнорируя отдельную папку для объекта - спешу вас расстроить: так делать не стоит.

Первое и, как мне кажется, весьма очевидное: если новых объектов в моде запланировано много, в папке objects в итоге образуется помойка. По собственному опыту могу сразу сообщить, что разбирать подобный cрач совсем не весело.

Второе: при подобном хранении некоторых объектов (чаще всего тех, где используются связанные скрипты и настройки из других игровых директорий), иногда образовывается ряд системных ошибок, обусловленных тем, что игра перестаёт находить связанные файлы. Игра при этом запускается и играется, но нужный объект будет тупить и работать некорректно - искать причину ошибки в таком случае можно очень долго...


Содержимое файла mysafe.object
{ "objectName" : "mysafe", "colonyTags" : ["alpine"], "rarity" : "Legendary", "category" : "storage", "price" : 12000, "description" : "Тяжеленный золотой сейф.", "shortdescription" : "Золотой сейф", "race" : "generic", "health" : 5, "printable" : false, "objectType" : "container", "tooltipKind" : "container", "apexDescription" : "Комментарий апекса", "avianDescription" : "Комментарий авиана", "floranDescription" : "Комментарий флорана", "glitchDescription" : "Комментарий глитча", "humanDescription" : "Комментарий человека", "hylotlDescription" : "Комментарий хилотла", "novakidDescription" : "Комментарий новакида", "inventoryIcon" : "mysafe_icon.png", "orientations" : [ { "dualImage" : "mysafe.png:<color>.<key>", "imagePosition" : [-8, 0], "spaceScan" : 0.1, "anchors" : [], "collision" : "platform" } ], "openSounds" : [], "closeSounds" : [], "slotCount" : 64, "uiConfig" : "/interface/chests/chest<slots>.config", "frameCooldown" : 5, "autoCloseCooldown" : 3600 }

health
Сколько "здоровья" у объекта. Влияет на то, сколько времени нужно для сноса объекта манипулятором. Довольно важный параметр для контейнера, поскольку если его случайно сломать, всё содержимое контейнера вывалится на пол.

objectType
Параметр, уточняющий тип нашего объекта.

tooltipKind
Параметр, определяющий шаблон игровой подсказки, появляющейся при взаимодействии с объектом.

orientations: collision
Этим необязательным параметром можно задать дополнительные свойства физического взаимодействия с объектом.

platform - объект действует как блок-платформа.
solid - объект непроходим (т.е. блокирует путь), но на него можно запрыгнуть.

openSounds
Путь к звуковому файлу, проигрываемому при открытии контейнера.

closeSounds
Путь к звуковому файлу, проигрываемому при закрытии контейнера.

slotCount
Число слотов в контейнере.

По-умолчанию в игре доступны варианты в 1, 9, 12, 16, 24, 32, 40, 48, 56, 60 и 64 слота. Если вы хотите вариант, например, с 3 слотами, вам нужно будет подготовить для этого свой файл настроек, путь к которому надо указать в следующем параметре.

uiConfig
Путь к файлу настроек контейнера.

frameCooldown
Число кадров, нужное для проигрывания анимации открытия/закрытия контейнера.

autoCloseCooldown
Время, через которое контейнер автоматически закроется, если вы отошли от него в момент использования.

Содержимое файла mysafe.frames
{ "frameGrid" : { "size" : [24, 16], "dimensions" : [3, 1], "names" : [ [] ] }, "aliases" : { "default.default" : "default.0" } }

Параметры подобного файла, нужные именно сейчас, мы уже рассматривали в одном из прошлых примеров.

Объект готов, время тестировать его в игре, воспользовавшись командой spawnitem или же самостоятельно настроив рецепт создания для контейнера.
Пример: оружие ближнего боя
Вот и подобрались к предметам. Начнём с простого оружия.

В папке с модом создаём директорию items, в ней директорию active, в ней weapons, а в ней melee. В общем итоге получиться такой путь: items/active/weapons/melee

Думаете всё? Не-а. В melee создаём ещё одну директорию - hammer. Название этой директории зависит от того, какой тип оружия вы добавляете.

axe - топор.
broadsword - большой меч.
dagger - кинжал.
hammer - молот.
pickaxe - кирка.
shortsword - короткий меч.
spear - копьё.

Ну, а теперь, наконец-то, создаём в hammer последнюю директорию, называем её myhammer, а в ней создаём файл myhammer.activeitem.

скачиваем спрайт в myhammer, файл называем myhammer.png


В этом примере обойдёмся без иконки.

Содержимое файла myhammer.activeitem

{ "itemName" : "myhammer", "price" : 960, "maxStack" : 1, "rarity" : "Rare", "description" : "Нетолерантен для авиан", "shortdescription" : "Молот-клевец", "tooltipKind" : "sword", "category" : "hammer", "twoHanded" : true, "inventoryIcon" : "myhammer.png", "animation" : "/items/active/weapons/melee/hammer/hammer.animation", "animationParts" : { "handle" : "", "blade" : "myhammer.png" }, "animationCustom" : { "sounds" : { "fire" : [] } }, "scripts" : ["/items/active/weapons/melee/meleeweapon.lua"], "elementalType" : "physical", "primaryAbilityType" : "hammersmash", "primaryAbility" : { "fireTime" : 0.5, "baseDps" : 12.0 }, "altAbilityType" : "physicalshockwave", "builder" : "/items/buildscripts/buildunrandweapon.lua" }

itemName
Уникальный технический идентификатор (ID) предмета. Не должен повторяться в других предметах и объектах.

maxStack
Сколько предметов поместится в одну стопку. Актуально для расходных предметов: еды, аптечек, верёвок и другого тому подобного.

twoHanded
Определение, занимает ли предмет обе руки при использовании.

true - двуручный
false - одноручный

animation
Путь к файлу, отвечающему за построение спрайта молота.

animationParts: handle
Это путь к файлу рукоятки, если ваше оружие состоит из нескольких частей, например: рукояти, гарды и лезвия.

Подобное разделения спрайта актуально для случайно сгенерированного оружия, где используются куски разных спрайтов. Я такими сложностями не заморачиваюсь (как и большая часть других мододелов) и использую целиковый спрайт для оружия, указываемый в следующее поле.

animationParts: blade
Сюда я указываю спрайт оружия.

animationCustom
Тут могут быть прописаны различные особенности, связанные с анимацией оружия. Сюда же указывается звук при нанесении удара.

scripts
Путь к файлу скрипта, отвечающего за настройки холодного оружия.

elementalType
Тип урона, наносимого оружием.

physical - физический.
fire - огненный.
ice - ледяной.
electric - электрический.
poison - ядовитый.

primaryAbilityType
Тип атаки, проводимой при нажатии на левую кнопку мыши.

primaryAbility: fireTime
Время нужное для нанесения одного удара.

primaryAbility: baseDps
Базовый урон оружия.

altAbilityType
Тип альтернативной атаки, проводимой при нажатии на правую кнопку мыши. Работает только с двуручным оружием.

builder
Путь к скрипту, интерпретирующему параметры оружия. Различается для рандомного и уникального оружия. В этом примере оружие уникально.

Следует учесть, что вариаций настройки и указания параметров для оружия очень-очень много. Рекомендую ознакомиться с кодом различных стандартных игровых "пух", дабы лучше вникнуть во всё это. О том, как смотреть стандартные игровые файлы, можно будет узнать в нижеследующих разделах руководства, посвящённых работе с .pak файлами.

Проверить работоспособность молотка можно на любом противнике в игре.
Пример: оружие дальнего боя
Переходим в items/active/weapons и создаём новую директорию ranged, а в ней myrevolver. В оружии дальнего боя нет нужды создавать промежуточные директории, типа как hammer из предыдущего примера.

сохраняем в myrevolver.

В myrevolver создаём файл myrevolver.activeitem.

Содержимое файла myrevolver.activeitem
{ "itemName" : "myrevolver", "price" : 640, "maxStack" : 1, "rarity" : "Common", "description" : "Большой револьвер с деревянной рукояткой", "shortdescription" : "Револьвер", "tooltipKind" : "gun", "category" : "pistol", "twoHanded" : false, "itemTags" : ["weapon", "ranged", "pistol"], "inventoryIcon" : "myrevolver.png", "animation" : "/items/active/weapons/ranged/gun.animation", "animationParts" : { "butt" : "", "middle" : "myrevolver.png", "barrel" : "", "muzzleFlash" : "/items/active/weapons/ranged/muzzleflash.png" }, "animationCustom" : { "sounds" : { "fire" : ["/sfx/gun/revolver2.ogg"] } }, "baseOffset" : [0.5, 0.25], "muzzleOffset" : [1.4, 0.3], "scripts" : ["/items/active/weapons/ranged/gun.lua"], "elementalType" : "physical", "primaryAbility" : { "scripts" : ["/items/active/weapons/ranged/gunfire.lua"], "class" : "GunFire", "fireTime" : 0.6, "baseDps" : 6.25, "energyUsage" : 18.75, "inaccuracy" : 0.025, "projectileCount" : 1, "fireType" : "auto", "projectileType" : "standardbullet", "projectileParameters" : { "knockback" : 6 }, "stances" : { "idle" : { "armRotation" : 0, "weaponRotation" : 0, "twoHanded" : false, "allowRotate" : true, "allowFlip" : true }, "fire" : { "duration" : 0, "armRotation" : 25, "weaponRotation" : 25, "twoHanded" : false, "allowRotate" : false, "allowFlip" : false }, "cooldown" : { "duration" : 0.15, "armRotation" : 25, "weaponRotation" : 25, "twoHanded" : false, "allowRotate" : false, "allowFlip" : false } } }, "builder" : "/items/buildscripts/buildunrandweapon.lua" }

animationParts: muzzleFlash
Путь к спрайту вспышки выстрела.

baseOffset
Координаты точки, за которую персонаж удерживает оружие.

muzzleOffset
Координаты вспышки, появляющейся при стрельбе.

primaryAbility: fireTime
Скорость стрельбы.

primaryAbility: baseDps
Базовый урон.

primaryAbility: energyUsage
Энергетическая стоимость одного выстрела.

primaryAbility: projectileCount
Количество снарядов, выпускаемых при выстреле.

primaryAbility: fireType
Тип огня (автоматический или полуавтоматический).

primaryAbility: projectileType
Тип выпускаемого снаряда.

Группа параметров projectileParameters отвечает за настройку снарядов.

primaryAbility > projectileParameters: knockback
Сила отталкивания противника, словившего пулю или иной снаряд.

Группа параметров stances отвечает за поведения оружия в различных состояниях. В них настраивается отдача и другое тому подобное, связанное с оружием.

idle - обычное состояние оружия.
fire - момент непосредственно во время выстрела.
cooldown - краткосрочное состояние, наступающее сразу после выстрела.

stances: duration
Длительность состояния.

stances: armRotation
Первый параметр, отвечающий за силу визуальной отдачи.

stances: weaponRotation
Второй параметр, отвечающий за силу визуальной отдачи.

allowRotate и allowFlip вероятно отвечают за состояние спрайта в определённых состояниях. Точно я в этом не уверен, поскольку у меня не было нужды вникать конкретно в эти два параметра.
Пример: одежда (файлы)
В виду ограниченности системы руководств, пришлось разбить материал на два раздела.
Начнём с файлов.

Создаём следующую цепочку директорий: items/armors/other/myclothes.

Создаём в myclothes четыре файла:
mycape.back - плащ.
myhead.head - шапка.
mychest.chest - рубашка.
mylegs.legs - штаны.

Теперь закачиваем в myclothes нижеперечисленные файлы.

icons.png - набор иконок для одежды
back.png - спина (рюкзак, хвостик, плащ и тому подобное)
head.png - спрайт шапки
< прозрачный файл
mask.png - технический спрайт, ответственный за скрытие волос под шапкой
chestm.png - туловище мужского персонажа
chestf.png - туловище женского персонажа
fsleeve.png - рука на переднем плане
bsleeve.png - рука на заднем плане
pants.png - ноги

Содержимое файла mycape.back
{ "itemName" : "mycape", "price" : 2500, "inventoryIcon" : "icons.png:back", "rarity" : "Common", "category" : "backwear", "description" : "Длинный плащ", "shortdescription" : "Плащ", "tooltipKind" : "back", "maxStack" : 1, "maleFrames" : "back.png", "femaleFrames" : "back.png", "effectSources" : [], "colorOptions" : [ { "ffca8a" : "0e0e0e", "e0975c" : "0e0e0e", "a85636" : "0e0e0e", "6f2919" : "000000" } ] }

Содержимое файла myhead.head
{ "itemName" : "myhead", "price" : 2500, "inventoryIcon" : "icons.png:head", "rarity" : "Rare", "category" : "headwear", "description" : "Модная 'шляпка', скрывающая ваше лицо", "shortdescription" : "'Шляпа'", "tooltipKind" : "armor", "maxStack" : 1, "maleFrames" : "head.png", "femaleFrames" : "head.png", "mask" : "mask.png", "effectSources" : [], "colorOptions" : [ { "ffca8a" : "0e0e0e", "e0975c" : "0e0e0e", "a85636" : "0e0e0e", "6f2919" : "000000" } ] }

Содержимое файла mychest.chest
{ "itemName" : "mychest", "price" : 2500, "inventoryIcon" : "icons.png:chest", "rarity" : "Rare", "category" : "chestwear", "description" : "Обтягивающая рубашка с длинными рукавами", "shortdescription" : "Рубашка", "tooltipKind" : "armor", "maxStack" : 1, "maleFrames" : { "body" : "chestm.png", "backSleeve" : "bsleeve.png", "frontSleeve" : "fsleeve.png" }, "femaleFrames" : { "body" : "chestf.png", "backSleeve" : "bsleeve.png", "frontSleeve" : "fsleeve.png" }, "effectSources" : [], "colorOptions" : [ { "ffca8a" : "0e0e0e", "e0975c" : "0e0e0e", "a85636" : "0e0e0e", "6f2919" : "000000" } ] }

Содержимое файла mylegs.legs
{ "itemName" : "mylegs", "price" : 2500, "inventoryIcon" : "icons.png:pants", "rarity" : "Rare", "category" : "legwear", "description" : "Модные узкие штаны", "shortdescription" : "Штаны", "tooltipKind" : "armor", "maxStack" : 1, "maleFrames" : "pants.png", "femaleFrames" : "pants.png", "level" : 10, "leveledStatusEffects" : [ { "levelFunction" : "standardArmorLevelPowerMultiplierMultiplier", "stat" : "powerMultiplier", "baseMultiplier" : 1.25 }, { "levelFunction" : "standardArmorLevelProtectionMultiplier", "stat" : "protection", "amount" : 0.5 }, { "levelFunction" : "standardArmorLevelMaxEnergyMultiplier", "stat" : "maxEnergy", "amount" : 5 }, { "levelFunction" : "standardArmorLevelMaxHealthMultiplier", "stat" : "maxHealth", "amount" : 5 } ], "effectSources" : [], "colorOptions" : [ { "ffca8a" : "0e0e0e", "e0975c" : "0e0e0e", "a85636" : "0e0e0e", "6f2919" : "000000" } ] }
Пример: одежда (описание)
inventoryIcon
Путь к иконке для инвентаря.

Для одежды есть возможность создавать единый файл-иконку, что реализовано в моём примере.

PNG файл должен быть 64 пикса в ширину и 16 пиксов в высоту. Картинка условно разбита на 4 сектора по 16х16 пиксов - каждый из этих секторов отвечает за иконку для определённого слота одежды. Сначала идёт голова, затем торс, ноги и спина.

В коде одёжки путь к такому файлу указывается с уточнением через двоеточие.

:head - голова.
:chest - туловище.
:pants - ноги.
:back - спина.

Общий файл-иконка наиболее актуален для целых сетов одежды. Возможность делать для каждого предмета отдельный файл-иконку по-прежнему доступна.

effectSources
Параметр, отвечающий за визуальный эффект, сопровождающий элемент одежды.

maleFrames
Путь к спрайту, отвечающему за спрайт одежды для торса мужского персонажа.
Данный параметр несколько отличается в файле одежды для торса (.chest).

maleFrames: body
Путь к спрайту, отвечающему за спрайт одежды для торса мужского персонажа.
Используется в файле одежды для торса.

maleFrames: backSleeve
Путь к спрайту, изображающему рукав для руки, расположенной на заднем плане.
Используется только в файле одежды для торса.

maleFrames: frontSleeve
Путь к спрайту, изображающему рукав для руки, расположенной на переднем плане.
Используется только в файле одежды для торса.

femaleFrames
Путь к спрайту, отвечающему за спрайт одежды для торса женского персонажа.
Данный параметр несколько отличается в файле одежды для торса (.chest).

femaleFrames: body
Путь к спрайту, отвечающему за спрайт одежды для торса женского персонажа.
Используется в файле одежды для торса.

femaleFrames: backSleeve
Путь к спрайту, изображающему рукав для руки, расположенной на заднем плане.
Используется только в файле одежды для торса.

femaleFrames: frontSleeve
Путь к спрайту, изображающему рукав для руки, расположенной на переднем плане.
Используется только в файле одежды для торса.

mask
Путь к спрайту-маске.
Указывается только в элементах одежды для головы.

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

Принцип работы файла довольно прост – в игре отображаются закрашенные участки файла. Чтобы скрыть всё – оставляем файл полностью пустым. Голова персонажа расположена в самом центре картинки.

На картинке слева отображён пример действия файла mask.png с закрашенной (то есть видимой) правой половиной - соответственно, что при надётой "шапке" остаётся виден кусок причёски справа от головы.

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

colorOptions
Это массив, ответственный за автоматическую покраску спрайта в игре.

Коды цветов в массиве указываются в HEX формате.

Рассмотрим упрощённый пример.

"colorOptions" : [ { "999999" : "000000", "CCCCCC" : "000000" } ]

В данном случае, идёт перекрашивание тёмно-серых (999999) и серых (CCCCCC) пикселей в чёрные (000000).

Сперва указывается исходный цвет, затем через двоеточие конечный цвет. Если требуется сменить не один, а несколько цветов, то разделяем каждую связку запятой.

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

Если вы не собираетесь перекрашивать свой спрайт игровым методом, то можете даже оставить массив пустым, выглядеть это должно так:

"colorOptions" : [ {} ]

- Для чего вообще нужно красить спрайты?
Предположим, что у вас в моде есть два вида штанов с одинаковым спрайтом, отличающимся только цветом, например: Красная футболка и Синяя футболка – можно конечно создать два одинаковых png файла с разноцветными спрайтами, но зачем наполнять мод лишними файлами?

А если одинаковых спрайтов в моде будет очень много, а вам вдруг приспичит что-то поправить в них, на внесение правок у вас уйдёт гораздо больше времени, ведь придётся редактировать каждый цветовой файл по отдельности.
Пример: корабль (файлы)
На мой взгляд, создание своего космического корабля - это самое занудное и сложное. Думаю, что об этом красноречиво говорит то, что тему мне пришлось даже разделить на два три четыре раздела. Но не будем тянуть кота за яйца - создаём директорию ships в папке с модом.

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

apex - корабль апексов.
avian - корабль авиан.
floran - корабль флоран.
glitch - корабль глитчей.
human - корабль людей.
hylotl - корабль хилотлов.
novakid - корабль новакидов.

В примере я буду рассматривать human.

В созданной папке должно быть много-много текстовых файлов, а ещё много-много спрайтов... Крепитесь.

Создаём текстовые файлы:

blockKey.config - этот файл отвечает за опознание недвижимых объектов, размещённых на корабле: кресло пилота, шкафчик, телепортер, всякая декоративная шелуха и т.д.

humanT0.structure - этот файл отвечает за параметры и вид корабля в его самой первой итерации, а именно - когда вы на нём просыпаетесь в начале игры и ещё не поговорили с SAIL.

humanT1.structure - этот файл отвечает за параметры и вид корабля в момент, когда вы уже поговорили с SAIL на своём корабле, но ещё не добрались до Аванпоста (Outpost).

humanT2.structure - этот файл отвечает за параметры и вид корабля в момент, когда вы получаете возможность передвигаться по первой доступной звёздной системе, но ещё не можете вылетать за её пределы.

humanT3.structure - этот файл отвечает за параметры и вид корабля на его базовом восстановленном уровне. Дальнейшее развитие корабля идёт за кол-во членов команды (от 2 до 10) или поддельную лицензию, приобретаемую, если я правильно помню, у кого-то из продавцов Аванпоста.

humanT4.structure - этот файл отвечает за параметры и вид корабля типа "Sparrow".
humanT5.structure - этот файл отвечает за параметры и вид корабля типа "Kestrel".
humanT6.structure - этот файл отвечает за параметры и вид корабля типа "Falcon".
humanT7.structure - этот файл отвечает за параметры и вид корабля типа "Eagle".
humanT8.structure - этот файл отвечает за параметры и вид корабля типа "Condow".

А теперь загоняем спрайты в папку human.

humanT0blocks.png
humanT1blocks.png
humanT2blocks.png
humanT3blocks.png
humanT4blocks.png
humanT5blocks.png
humanT6blocks.png
humanT7blocks.png
humanT8blocks.png
humanT0.png
humanT1.png
humanT2.png
humanT3.png
humanT4.png
humanT5.png
humanT6.png
humanT7.png
humanT8.png
humanT0lit.png
humanT1lit.png
humanT2lit.png
humanT3lit.png
humanT4lit.png
humanT5lit.png
humanT6lit.png
humanT7lit.png
humanT8lit.png
Пример: корабль (содержимое 1)
Содержимое файла blockKey.config. Структура данного файла рассмотрена в разделе "корабль (спрайты)".
{ "blockKey" : [ { "value" : [255, 255, 255, 255], "foregroundBlock" : false, "backgroundBlock" : false }, { "value" : [0, 0, 255, 255], "foregroundBlock" : false, "backgroundBlock" : true }, { "value" : [255, 0, 0, 255], "foregroundBlock" : true, "backgroundBlock" : true }, { "value" : [0, 255, 0, 255], "foregroundBlock" : false, "backgroundBlock" : true, "backgroundMat" : "apexshipwall", "flags" : [], "object" : "humanshiplocker", "objectParameters" : { "treasurePools" : [], "level" : 0.5, "unbreakable" : true }, "objectResidual" : true }, { "value" : [0, 128, 0, 255], "foregroundBlock" : false, "backgroundBlock" : true, "backgroundMat" : "apexshipwall", "object" : "humanshiplockerTier0", "objectParameters" : { "unbreakable" : true } }, { "value" : [142, 255, 142, 255], "foregroundBlock" : false, "backgroundBlock" : true, "backgroundMat" : "apexshipwall", "object" : "humantechstation", "objectParameters" : { "unbreakable" : true }, "objectResidual" : true }, { "value" : [255, 87, 81, 255], "foregroundBlock" : false, "backgroundBlock" : true, "object" : "brokenhumanfuelhatch", "objectParameters" : { "unbreakable" : true } }, { "value" : [255, 90, 90, 255], "foregroundBlock" : false, "backgroundBlock" : true, "object" : "humanfuelhatch", "objectParameters" : { "unbreakable" : true }, "objectResidual" : true }, { "value" : [255, 255, 0, 255], "foregroundBlock" : false, "backgroundBlock" : true, "backgroundMat" : "apexshipdetails", "object" : "apexshiplight", "objectResidual" : true }, { "value" : [191, 191, 0, 255], "foregroundBlock" : false, "backgroundBlock" : true, "backgroundMat" : "apexshipdetails", "object" : "apexshiplightBroken", "objectParameters" : { "unbreakable" : true } }, { "value" : [128, 128, 0, 255], "foregroundBlock" : false, "backgroundBlock" : true, "backgroundMat" : "apexshipdetails", "object" : "apexshiplight", "objectParameters" : { "unbreakable" : true, "defaultLightState" : false } }, { "value" : [255, 102, 0, 255], "foregroundBlock" : false, "backgroundBlock" : false, "object" : "humanshipdoor", "objectResidual" : true }, { "value" : [128, 51, 0, 255], "foregroundBlock" : false, "backgroundBlock" : false, "object" : "humanshipdoorBroken", "objectParameters" : { "unbreakable" : true } }, { "value" : [174, 137, 81, 255], "foregroundBlock" : false, "backgroundBlock" : true, "object" : "shipengine", "objectParameters" : { "unbreakable" : true } }, { "value" : [156, 0, 255, 255], "anchor" : true, "foregroundBlock" : false, "backgroundBlock" : true, "backgroundMat" : "apexshipdetails", "object" : "humanteleporter", "flags" : [], "objectParameters" : { "unbreakable" : true } }, { "value" : [79, 0, 128, 255], "anchor" : true, "foregroundBlock" : false, "backgroundBlock" : true, "backgroundMat" : "apexshipdetails", "object" : "humanteleporterTier0", "flags" : [], "objectParameters" : { "unbreakable" : true } }, { "value" : [167, 167, 255, 255], "foregroundBlock" : false, "backgroundBlock" : true, "object" : "boosterflamehuman", "objectParameters" : { "unbreakable" : true } }, { "value" : [168, 168, 255, 255], "foregroundBlock" : false, "backgroundBlock" : true, "object" : "boosterflamehuman2", "objectParameters" : { "unbreakable" : true } }, { "value" : [180, 180, 255, 255], "foregroundBlock" : false, "backgroundBlock" : true, "object" : "boosterflamehuman3", "objectParameters" : { "unbreakable" : true } }, { "value" : [166, 166, 255, 255], "foregroundBlock" : false, "backgroundBlock" : true, "object" : "boosterflame", "objectParameters" : { "unbreakable" : true } }, { "value" : [100, 100, 255, 255], "foregroundBlock" : false, "backgroundBlock" : true, "object" : "bigboosterflameavian", "objectParameters" : { "unbreakable" : true } }, { "value" : [200, 200, 200, 255], "foregroundBlock" : false, "backgroundBlock" : true, "object" : "bigboosterflamehuman", "objectParameters" : { "unbreakable" : true } }, { "value" : [168, 168, 168, 255], "foregroundBlock" : false, "backgroundBlock" : true, "object" : "smallboosterflame", "objectParameters" : { "unbreakable" : true } }, { "value" : [190, 190, 190, 255], "foregroundBlock" : false, "backgroundBlock" : true, "object" : "smallboosterflamehuman2", "objectParameters" : { "unbreakable" : true } }, { "value" : [0, 255, 255, 255], "foregroundBlock" : false, "backgroundBlock" : true, "object" : "humancaptainschair", "objectDirection" : "right", "objectParameters" : { "unbreakable" : true } }, { "value" : [122, 122, 122, 255], "foregroundBlock" : false, "backgroundBlock" : true, "object" : "invisiblelight", "objectParameters" : { "unbreakable" : true } }, { "value" : [255, 232, 128, 255], "foregroundBlock" : false, "backgroundBlock" : true, "object" : "invisiblesparker", "objectParameters" : { "unbreakable" : true } }, { "value" : [255, 255, 144], "foregroundBlock" : false, "backgroundBlock" : true, "backgroundMat" : "apexshipwall" }, { "value" : [255, 117, 144], "foregroundBlock" : false, "backgroundBlock" : true, "backgroundMat" : "apexshipdetails" }, { "value" : [255, 117, 255], "foregroundBlock" : false, "backgroundBlock" : true, "backgroundMat" : "apexshipsupport" }, { "value" : [255, 255, 220], "foregroundBlock" : true, "backgroundBlock" : false, "foregroundMat" : "hazard", "foregroundResidual" : true }, { "value" : [255, 200, 220], "foregroundBlock" : true, "backgroundBlock" : true, "foregroundMat" : "hazard", "foregroundResidual" : true, "backgroundMat" : "apexshipdetails" } ] }
Пример: корабль (содержимое 2)
Содержимое файла humanT0.structure
{ "config" : { "shipUpgrades" : { "capabilities" : [], "crewSize" : 2 } }, "backgroundOverlays" : [ { "image" : "humanT0.png", "position" : [0, 0], "fullbright" : true }, { "image" : "humanT0lit.png", "position" : [0, 0] } ], "blockKey" : "blockKey.config:blockKey", "blockImage" : "humanT0blocks.png" }

Содержимое файла humanT1.structure
{ "config" : { "shipUpgrades" : { "capabilities" : [], "crewSize" : 2 } }, "backgroundOverlays" : [ { "image" : "humanT1.png", "position" : [0, 0], "fullbright" : true }, { "image" : "humanT1lit.png", "position" : [0, 0] } ], "blockKey" : "blockKey.config:blockKey", "blockImage" : "humanT1blocks.png" }

Содержимое файла humanT2.structure
{ "config" : { "shipUpgrades" : { "capabilities" : ["teleport", "planetTravel"], "crewSize" : 2 } }, "backgroundOverlays" : [ { "image" : "humanT2.png", "position" : [0, 0], "fullbright" : true }, { "image" : "humanT2lit.png", "position" : [0, 0] } ], "blockKey" : "blockKey.config:blockKey", "blockImage" : "humanT2blocks.png" }

Содержимое файла humanT3.structure
{ "config" : { "shipUpgrades" : { "capabilities" : ["teleport", "planetTravel", "systemTravel"], "crewSize" : 2 } }, "backgroundOverlays" : [ { "image" : "humanT3.png", "position" : [0, 0], "fullbright" : true }, { "image" : "humanT3lit.png", "position" : [0, 0] } ], "blockKey" : "blockKey.config:blockKey", "blockImage" : "humanT3blocks.png" }

Содержимое файла humanT4.structure
{ "config" : { "shipUpgrades" : { "capabilities" : ["teleport", "planetTravel", "systemTravel"], "crewSize" : 4 } }, "backgroundOverlays" : [ { "image" : "humanT4.png", "position" : [0, 0], "fullbright" : true }, { "image" : "humanT4lit.png", "position" : [0, 0] } ], "blockKey" : "blockKey.config:blockKey", "blockImage" : "humanT4blocks.png" }

Содержимое файла humanT5.structure
{ "config" : { "shipUpgrades" : { "capabilities" : ["teleport", "planetTravel", "systemTravel"], "crewSize" : 6 } }, "backgroundOverlays" : [ { "image" : "humanT5.png", "position" : [0, 0], "fullbright" : true }, { "image" : "humanT5lit.png", "position" : [0, 0] } ], "blockKey" : "blockKey.config:blockKey", "blockImage" : "humanT5blocks.png" }

Содержимое файла humanT6.structure
{ "config" : { "shipUpgrades" : { "capabilities" : ["teleport", "planetTravel", "systemTravel"], "crewSize" : 8 } }, "backgroundOverlays" : [ { "image" : "humanT6.png", "position" : [0, 0], "fullbright" : true }, { "image" : "humanT6lit.png", "position" : [0, 0] } ], "blockKey" : "blockKey.config:blockKey", "blockImage" : "humanT6blocks.png" }

Содержимое файла humanT7.structure
{ "config" : { "shipUpgrades" : { "capabilities" : ["teleport", "planetTravel", "systemTravel"], "crewSize" : 10 } }, "backgroundOverlays" : [ { "image" : "humanT7.png", "position" : [0, 0], "fullbright" : true }, { "image" : "humanT7lit.png", "position" : [0, 0] } ], "blockKey" : "blockKey.config:blockKey", "blockImage" : "humanT7blocks.png" }

Содержимое файла humanT8.structure
{ "config" : { "shipUpgrades" : { "capabilities" : ["teleport", "planetTravel", "systemTravel"], "crewSize" : 12 } }, "backgroundOverlays" : [ { "image" : "humanT8.png", "position" : [0, 0], "fullbright" : true }, { "image" : "humanT8lit.png", "position" : [0, 0] } ], "blockKey" : "blockKey.config:blockKey", "blockImage" : "humanT8blocks.png" }

Структура файлов humanT0.structure, humanT1.structure и т.д...

В массиве config находится информация о размере команды и возможностях выбранного тира корабля

shipUpgrades: capabilities
Доступные "фичи" корабля: телепорт на планету, межзвёздные путешествия и тому подобное.

shipUpgrades: crewSize
Сколько членов команды может вместить корабль на выбранном тире.

Массив backgroundOverlays содержит два элемента, в которых указаны пути, а также некоторые настройки главного и вспомогательного спрайтов выбранного тира корабля. Как правило, сначала указан основной спрайт, а затем вспомогательный.

backgroundOverlays: image
Путь к спрайту.

backgroundOverlays: position
Количество блоков, на которое сдвигается спрайт влево-вправо и вверх-вниз. Подробнее об этом в следующем разделе руководства.

backgroundOverlays: fullbright
Влияет на яркость и освещённость спрайта корабля.
Доступны варианты true и false. По умолчанию всегда идёт true. Во вспомогательный спрайт данный параметр не указывается.

blockKey
Это путь к файлу и массиву с перечислением корабельных блоков и объектов.

blockImage
Путь к техническому спрайту выбранного тира корабля.
Пример: корабль (спрайты)
Внешне корабль состоит из трёх основных спрайтов: Главного, Вспомогательного (обычно он с приставкой lit в названии) и Технического (обычно с приставкой blocks в названии).

На каждый тир корабля приходится по три спрайта. В кораблях стандартных игровых рас есть исключения - это тир T0. У него есть только собственный технический спрайт, а главный и вспомогательный берутся из T1 тира - в принципе это оправдано, поскольку корабельный тир T0 обычно фигурирует в игре не более 15-20 секунд... Но для данного примера я все равно реализовал необязательные файлы для T0.

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

При рисовании спрайта следует помнить, что размер одного игрового блока занимает 8 пиксов по высоте и ширине.

Главный спрайт
Это основная картинка корабля, она отвечает непосредственно за внешнее и внутреннее убранство вашего корабля.

Высоту, а также ширину данного спрайта следует делать кратной 8.
С каждой стороны спрайта (лево, право, верх и низ) нужно оставить пустые поля, блоков эдак в 20, иначе говоря - по 160 пиксов с каждой стороны.

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

Внешне этот спрайт практически полностью идентичен предыдущему, отличие заключается лишь в том, что область внешней стороны корабля (к которой игрок не имеет доступа) должна быть полупрозрачной. Я стараюсь делать от 50 до 75 процентов, но можно указывать и другие значения - смотрите по ситуации, как будет выглядеть лучше.

Внутренняя часть корабля (доступная для игрока) должна оставаться непрозрачной.

На картинке-примере видно, как в итоге выглядит подобный файл через редактор изображений.



Технический спрайт отвечает за то, где располагаются различные корабельные области и объекты.

Это спрайт по высоте и ширине отличается от других спрайтов, но он должен повторять их пропорции, соблюдая масштаб 1 к 8. Например: главный спрайт имеет размер 96х440 (высота-ширина), соответственно, что размером технического спрайта в таком случае будет 12х55.

Нужные размеры для технического спрайта элементарно вычисляются путём разделения размеров главного спрайта на 8.

Важно! Если размеры главного спрайта не кратны 8, то у вас будет несоответствие пропорций между главным и техническим спрайтом.

В принципе, все такие различия можно компенсировать через файл .structure при помощи параметра position. Значения, указанные в данном параметре, означают на сколько игровых блоков будет сдвинут спрайт корабля, дабы компенсировать образовавшуюся разницу пропорций. Если разница неровная (например, 2.5 блока), то в этих параметрах нужно указывать и дробные числа... Разумеется, что вам нужно будет их правильно высчитать, чтобы в игре всё встало ровно.

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

С размерами технического спрайта вроде разобрались, теперь рассмотрим его абстрактное содержимое.

Как вы уже наверняка догадались, 1 пикс на техническом спрайте соответствует одному игровому блоку. Цвет обозначает, что находится на конкретной точке.

Все варианты доступных по-умолчанию цветов я рассматривать не буду - их реально очень много, а я не хочу добавлять ещё три раздела по теме кораблей в руководстве. Пройдёмся по важным для примера вариантам:

(RGB: 255, 0, 0) - это основной блок, занимающий большую часть спрайта. Он обозначает области, недоступные игроку.

Рекомендую по краям спрайта делать поля красного цвета, блоков эдак в 20 - это нужно для того, чтобы игрок не мог ставить свои блоки за пределами корабля во время игры. В примере намеренно отражён этот "косяк", чтобы было понятно о чём речь.

(RGB: 255, 255, 255) - это пустой блок, на котором изначально ничего нет.

(RGB: 255, 255, 144) - это блок, обозначающий стандартную корабельную стенку. Её можно снимать манипулятором.

(RGB: 0, 0, 255) - это технический блок, условно обозначающий стенку для крепления других объектов. В игре он не виден сам по себе, но некоторые стандартные объекты корабля без него не будут работать - банально не будут видны в игре.

Важно! Некоторые объекты должны быть размещены вместе с другими, определёнными блоками.

(RGB: 255, 90, 90) - это блок, обозначающий место, где находится сливной бачок бензобака корабля. Это один из объектов, который может работать лишь вместе с другим блоком, в данном случае (0, 0, 255).

Как только вы вникните в логику работы технического спрайта, у вас не будет сложностей с размещением и передвижением стандартных корабельных объектов.

Понятие того, как следует интерпретировать тот или иной цвет, указывается в файле blockKey.config. Рассмотрим его структуру.

Все цветовые комбинации находятся в общем массиве blockKey, элементы которого между собой разделяются запятой.

Пример элемента массива
{ "value" : [255, 255, 255, 255], "foregroundBlock" : false, "backgroundBlock" : false }

value
Это параметр, в котором указана RGB схема, соответствующая блоку/объекту. Сначала указывается Red, затем Green, а после Blue. В последней цифре можно оставлять значение 255.

Повторяться RGB комбинации не должны.

foregroundBlock
Физичность блока на переднем плане.
true - физичен.
false - не физичен.

backgroundBlock
Физичность блока на заднем плане.
true - физичен.
false - не физичен.

Бывают и другие параметры - рассмотрим важные.

backgroundMat
Какой объект или материальный блок будет размещён на заднем фоне. Указывать нужно ID.

object
Какой объект будет размещён на точке. Указывать нужно ID.

Также доступен необязательный массив objectParameters, в который указываются дополнительные параметры размещённого объекта.

objectParameters: unbreakable
Является ли объект неразрушимым. true - является.
Пример: игровая раса
Создать свою расу легко. На словах ;)
На деле же, вам придётся настроить кучу параметров, прямо или косвенно рассмотренных в прошлых примерах.

Для создания расы используйте мод-шаблон
https://steamproxy.net/sharedfiles/filedetails/?id=739417362
Другие ссылки:
http://www.nexusmods.com/starbound/mods/373/?
http://community.playstarbound.com/resources/template-race-mod.956/

Есть отдельный гайд по этому шаблону (на английском). Таки рекомендую учиться делать расу по нему - там больше инфы, причём от автора шаблона расы.
https://steamproxy.net/sharedfiles/filedetails/?id=1380289410
Также, чтобы раса появилась в списке при создании персонажей, нужно обязательно поставить этот мод
https://steamproxy.net/sharedfiles/filedetails/?id=729426722
Скачав шаблон, закидываем его папку (Skittles Basic Race Template) в mods, папку шаблона можно переименовать в другое, более удобное для вас название, например myrace.

Запускаем файл BASIC_RACE_TEMPLATE_EASY_SETUP и в появившемся окне указываем именование расы. Используем только латинские символы, без пробелов и цифр, с маленькой буквы. Подходящие примеры: demon, dupa, izverg, vasyaloh. С большой буквы тоже можно указать, но тогда некоторые файлы почему-то игра не видит - потом долго и нудно исправлять будете.

Указанное название автоматом будет разбросано в ID всех важных файлов, что упросит вам работу. Далее дело за малым: настроить свой расовый контент. Что-то уже было расмотрено в прошлых примерах, а до чего-то дойдёте сами. Я лишь укажу несколько важных файлов и папок:

species - тут файлы с основными настройками расы.
humanoid - тут спрайты тушек расы.
ai - тут спрайты ИИ`шки космического корабля.
Ничего не работает! :С (получается "зелёнка", игра вылетает и т.д.)
Если в создании мода вы сталкиваетесь с тем, что игра начинает постоянно вырубаться, не запускается, не спавнится добавленный вами предмет (вместо него "зелёная" заглушка), ну или творится что-то ещё подобное, а у вас даже нет ни малейшей идеи о причинах происходящего, то нужно обязательно посмотреть техническое логи игры, находящиеся по следующему пути (исходя из корневой директории игры) – storage/starbound.log.

Более старые логи записываются в файлы «starbound.log. 1», «starbound.log. 2» и так далее.

В самих логах следует искать строки со словом «Error» - как правило, именно в них отражены прямые или косвенные причины ошибки. Например:

[17:13:13.102] [Error] Exception caught loading asset: /items/armors/other/tightclothes/tightdisguise.head, (AssetException) Could not read JSON asset /items/armors/other/tightclothes/tightdisguise.head

Эта строка сообщает точное время ошибки, указывает её общую причину (не удалось загрузить информацию об объекте или предмете) и указывает путь к проблемному файлу.

Всё это позволяет искать проблему в конкретном файле, в котором скорее всего неправильно закрыта какая-нибудь информационная строка. Конкретную причину проблемы нужно искать в самом файле ( или его отсутствии :-) ), логи же позволяют примерно определить источник проблемы.
.pak: основа
Для создания модификации может пригодиться навык работы с игровыми архивами в формате ".pak". Это не особо сложно, но специальной программы для этого я не нашёл, так что придётся работать с консолью.

Для чего конкретно это может понадобиться? .pak архив позволит хранить и передавать ваш мод одним файлом. Это обязательно нужно для загрузки вашего мода во всякие сторонние базы модов, типа "nexusmods/starbound" (прямую ссылку приводить не буду ибо там сплошная похабщина фурривая).

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

Чтобы распаковать или упаковать архив вам надо перейти в директорию с установленной игрой любым удобным для вас способом.

Открыть консоль можно следующей манипуляцией:

На белом (пустом) пространстве окна нажимайте правой кнопкой мыши с зажатой клавишей Shift. В открывшемся меню выбирайте пункт "Открыть меню команд" (если не зажать Shift, то этот пункт не будет виден) - после этого откроется окно для ввода консольных команд.

В 10-ке вместо "Открыть меню команд" может быть написано "Открыть окно PowerShell здесь" - это тоже подходящая консоль.
.pak: распаковка
Для распаковки архива используется подобная команда:

"win32\asset_unpacker.exe" "<путь к файлу для распаковки>" "<название директории, куда будут распакованы файлы>"

("win32\asset_unpacker.exe") - это путь к скрипту, ответственному за работу с .pak файлами. Тут ничего менять не нужно.

("<путь к файлу для распаковки>") - это полный путь к файлу, который следует распаковать, например - "assets\packed.pak".

("<название директории, куда будут распакованы файлы>") - это название директории, куда будут распакованы файлы из архивы. Если директории с указанным названием нет в папке с игрой, то она будет автоматически создана.

А теперь на практике. Команда
"win32\asset_unpacker.exe" "assets\packed.pak" "UnpackedAssets"
позволит распаковать архив со стандартными игровыми файлами.

После того, как вы введёте команду в консоль и нажмёте Enter, в директории с игрой появится новая папка "UnpackedAssets", в которой находятся все распакованные файлы. Обязательно дождитесь появления в консоли сообщения об окончании процесса распаковки. Сам процесс довольно длителен - у меня идёт примерно 6-7 минут.

В некоторых операционных системах (например, Windows 10) бывают отличия, из-за которых команды нужно вводить без кавычек. В таком случае команда на распаковку игровых файлов будет выглядеть так:
win32\asset_unpacker.exe assets\packed.pak UnpackedAssets
.pak: упаковка
Для упаковки архива используется подобная команда:

"win32\asset_packer.exe" "<папка, которую надо упаковать>" "<куда положить архив>"

("win32\asset_unpacker.exe") - это путь к скрипту, ответственному за работу с .pak файлами. Тут ничего менять не нужно.

("<папка, которую надо упаковать>") - это путь к папке с вашим модом, который вы хотите упаковать в архив.

("<куда положить архив>") - это путь, куда автоматически будет размещён готовый архив. В этом же параметре указывается желаемое название архива. В конце обязательно указывайте .pak.

Пример готовой команды:

"win32\asset_packer.exe" "mods\pink_bed" "mods\pinkbed.pak"

После того, как вы введёте команду в консоль и нажмёте Enter, в папке mods появится новый архив pinkbed.pak с вашим модом внутри.

Этот файл можно давать его друзьям - если они положат этот архив в свою папку mods, то смогут играть с вашей модификацией.

В некоторых операционных системах (например, Windows 10) бывают отличия, из-за которых команды нужно вводить без кавычек. В таком случае команда на упаковку файлов будет выглядеть так:
win32\asset_packer.exe mods\pink_bed mods\pinkbed.pak
Изменение игровых объектов
Изменение уже существующих в игре объектов - это один из самых простых видов модифицирования игры.

В первую очередь нужно распаковать стандартные игровые файлы, а затем найти в них предмет, который вы хотите изменить. Для примера рассмотрю какую-нибудь флэшку-дополнение для Набора Экологической Защиты (EPP).

Файлов в игре довольно много и перебирать их в ручную, выискивая нужный, крайне непрактично. Я предпочитаю пользоваться функцией поиска по файлам в Notepad+. Открываем программу, а затем нажимаем Ctrl + F ИЛИ в верхнем меню щёлкаем "Поиск", а затем "Найти".

В появившемся окошке переходим во вкладку "Найти в файлах".

В поле "Найти" вписываем ID или название нужного объекта. Рекомендую искать по ID - поиск будет более точный. ID предметов можно смотреть на официальной вики игры - http://starbounder.org.

В поле "Папка" указываем путь к распакованным игровым файлам, ставим отметку "Во всех подпапках", а затем жмём "Найти всё".



Процесс поиска не моментальный - запаситесь терпением. Если вы примерно знаете, где находится нужный вам файл, то в поле "Папка" можно указывать более точный путь - это может заметно сократить время поиска.

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

Для примера я искал флэшку, дающую иммунитет к отравлению, её файл - "items/augments/back/poisonblockaugment.augment", следовательно, что нужно копировать его по точно такому же пути, воссозданному в папке с модом:

mymod/items/augments/back/poisonblockaugment.augment. Обязательно сохраняйте оригинальное название и расширение скопированного файла, иначе игра не будет видеть замену стандартного игрового файла.

Можете вносить в этот файл любые нужные изменения: другое название флэшки, больше эффектов и так далее.

Следует учесть, что уже существующие в инвентаре флэшки не изменятся. Флэшки с обновлёнными параметрами нужно будет купить, выбить из монстров, скрафтить или заспавнить через /spawnitem. Подобная особенность актуальна для большинства используемых игровых предметов.
О создании своих спрайтов
Для создания своего спрайта для своего объекта вам понадобится какой-нибудь графический редактор. Спрайты нужно сохранять в формате PNG.

Учитывайте, что в игре спрайт показывается несколько большим размером, чем он есть на самом деле. Если не ошибаюсь, то картинка увеличивается в три раза. Иногда из-за этого создаётся впечатление, что спрайт "размазан".

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

Объект минимального размера занимает 1 игровой блок, размер спрайта для такого объекта - 8 на 8 пиксов. Очевидно, что объект со спрайтом размера 16 на 8 пиксов займёт в игре два блока в ширину и один высоту, а 16 на 16 – два блока в ширину и два высоту.

Перед тем как начать рисовать свою картинку-спрайт, заранее определитесь с тем, какого размера должен быть ваш объект в игре, дабы не пришлось перерисовывать готовое изображение из-за логического не соответствия размера объекта - обычная лампочка не может быть больше человека, кресло не может быть меньше пятки и так далее.
Как загрузить мод в Мастерскую
Для загрузки своего мода запускаем Starbound через Steam - сперва всегда открывается меню с несколькими вариантами. Нас интересует "Launch Mod Uploader Tool" - отмечаем и жмём "Играть".



В открывшейся программе жмём кнопку "Select Mod Directory" и указываем путь к папке с файлами вашего мода. Если в ней уже есть файл "_metadata", то большинство данных будет взято из него. Если файла нет, то все данные можно указать в программе.

Name и Title - название вашего мода. Не помню в чём разница, лол.

Author - ваше имя или псевдоним.

Version - версия мода.

Description - описание мода.

Preview Image - путь к картинке-превьюшке, которая будет отображаться в Мастерской. Файл должен быть в формате PNG или JPG. Картинка необязательна.

Mod ID - номер вашего мода в стиме. Указывается автоматом при первоначальной загрузке мода.

После того, как вы всё указали, жмите кнопку "Upload to Steam!". Ждите завершения процесса (исчезнет маленькое окошко с полосой прогресса). Обратите внимание, что у вашего мода появился ID - щелкнув на него, вы перейдёте на страницу модификации в Мастерской.

Изначально загруженный мод скрыт от посетителей и виден только вам и администраторам Steam. Чтобы открыть доступ к моду, в правой части страницы найдите ссылку "Права доступа" - ткните её и выберите нужный вариант.



Дополнительные изображения и видео вашей модификации добавляются по ссылке "Изменить изображения и видео". Примечательно, что главное (первое) изображение меняется только при обновлении мода через "Mod Uploader Tool".

Название и описание меняется по ссылке "Изменить заголовок и описание".

Если ваш мод для работы требует другой мод (например "Xbawks" для новых рас), то через ссылку "Изменить список необходимых предметов" вы можете указать его.

Если вы внесли изменения в мод и хотите обновить версию в Мастерской, то снова переходите в "Launch Mod Uploader Tool" и жмите кнопку "Upload to Steam!". Кнопка "Reset Steam Mod Information" справа от Mod ID сбросит записанную в файлах мода идентификационную информацию Мастерской и позволит закачать мод в Мастерскую как новый объект.

Насколько мне стало известно, на 32-битных системах вышеописанный метод закачки модов не работает, но для них есть свой метод (сам я его не пробовал - не было нужды), подробно описанный здесь: https://steamproxy.net/sharedfiles/filedetails/?id=1097300763
Полезные ссылки
Полезные ресурсы с информацией непосредственно о моддинге.

Официальный форум Chucklefish, посвящённый моддингу в Starbound[community.playstarbound.com]
Официальный форум в Steam, посвящённый моддингу в Starbound
Статья о моддинге на англоязычной вики по Starbound[starbounder.org]

Другое (не моё) руководство по моддингу Старбаунда:
https://steamproxy.net/sharedfiles/filedetails/?id=2382397599

Базы игровых данных (предметы, станки, враги, оружие и тому подобное).

На этих сайтах можно найти ID различных предметов/объектов/существ для спавна или подыскать существующий в игре предмет, который может стать основой для вашего мода.

Англоязычная вики[starbounder.org]
Русскоязычная вики[ru.starbound.wikia.com]
Кастомные вещи
Несколько раз мне уже писали и просили подробно рассказать о так называемых "кастомных вещах" - новых предметах экипировки, добавленных в игру консолью, а не модами.

Лично мне кажется, что данное явление имеет мало отношения к прямому модифицированию игры, а потому мне не очень хочется влезать в дебри "кастомок", тем более, что эта тема уже достаточно раскрыта в стиме.

Приведу ссылки на несколько руководств, сходу мне попавшихся:

https://steamproxy.net/sharedfiles/filedetails/?id=2038797970
https://steamproxy.net/sharedfiles/filedetails/?id=1254778659
https://steamproxy.net/sharedfiles/filedetails/?id=1227193356
https://steamproxy.net/sharedfiles/filedetails/?id=1205321281
https://steamproxy.net/sharedfiles/filedetails/?id=1354010253

Наверняка есть и другие подобные руководства, но я искать не буду.
Послесловие
Тема моддинга довольно велика и в рамках одного руководства охватить её невозможно. Я и пытаться не буду, да и тем более, надо же оставить вам какие-нибудь темы для самостоятельного развития...

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

По моей задумке, основная цель руководства заключается в том, чтобы помочь новичкам-мододелам начать свою работу, а не осветить абсолютный каждый аспект моддинга (как почему то решили некоторые читатели). У меня нет на подобный титанический труд времени, сил и, самое главное, желания.

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

Успехов в работе!

P.S.
Автор гайда (т.е. я) ленивая задница и почти не отвечает на комменты
399 Comments
🅱🅻🅰🆇🅰🆂 19 Jun @ 12:20pm 
Классное руководство, но увы я не умею рисовать спрайты в остальном все просто
THE UNknOwN 425 13 May @ 10:15pm 
а можно пример со своим мобом?
Arack Babara 3 Jan @ 9:46am 
По неизвестной мне причине не запускается mod uploader tool, вне зависимости от скачанных модов. Да и игра запускается только в 32-битном формате. А если пытаюсь открыть игру через вариант "Запустить Starbound", она почти мгновенно закрывается, даже окно не успевает появиться. Кто-нибудь знает, как это исправить?
who dat boy who him is 25 Sep, 2023 @ 1:44pm 
респект за старания, очень много инфы полезной
.pche1a 4 May, 2023 @ 12:07pm 
ТАКЖЕ! ОЧЕНЬ ВАЖНО!
Если вы хотите запустить игру с модом(а вы хотите)
То после "rottingMultiplier" : 1.0, добавьте эти строки:
"blockingEffects" : [
"wellfed"
]

Это эффекты, из-за которых нельзя поесть
.pche1a 4 May, 2023 @ 11:52am 
"foodValue" : 0, - То, сколько мы восстановим голода после употребления
"duration" : 360 - Длительность эффекта
"maxStack" : 1, - Как я понял, максимальное кол.во в одной клетке инвентаря

Я хз где прям сразу взять названия эффектов, но вы можете полазить в файлах игры(Папка Unpacked) и просмотреть код любой еды, и оттуда вычленить эффект который вам нужно применить.
.pche1a 4 May, 2023 @ 11:50am 
Вот пример кода с едой:

{
"itemName" : "samplepotato",
"rarity" : "Common",
"price" : 200,
"category" : "preparedFood",
"inventoryIcon" : "potatogrids.png",
"description" : "Чисто картоха, не вкусная",
"shortdescription" : "Potato Grids",
"effects" : [ [
{
"effect" : "weakpoison",
"duration" : 360
}
] ],
"foodValue" : 0,
"tooltipKind" : "food",
"builder" : "/items/buildscripts/buildfood.lua",
"maxStack" : 1,
"itemAgingScripts" : ["/scripts/items/rotting.lua"],
"rottingMultiplier" : 1.0,
}

"effect" : "weakpoison", Это эффект который получает игрок после употребления пищи.
☢Sayo Harugawa☢ 25 Apr, 2023 @ 6:13am 
А есть у кого нибудь инструкция по созданию транспорта? Летающего и ездящего, у меня свой проект в задумке, но к сожалению, мой напарник ленивая жепа, хоть и шарит за скрипты(я больше по визуализации), но я задолбался его пинать постоянно, а хочется свое создавать. Увы нигде толком нет инфы по транспорту, а обращатся к другим мододелам я как то не особо хочу, так как боюсь кражи идей и наработок.
Toxi 17 Apr, 2023 @ 8:00am 
Уважаемые, вот сделал свое оружие, добавил в мастерскую стима, но как отредактировать мод если файл не сохранился?
.pche1a 9 Feb, 2023 @ 1:48pm 
Если вы всё сделали как ниже, но ничего не работает, могу лишь пожалеть вас)