I wanna be a Dev… часть 0

Spread the love

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

Если точнее, то мы рассмотрим:

  • Общую архитектуру модов
  • Сортировку файлов в моде
  • Подключение файлов
  • Создание простейшего предмета

 

Общая архитектура модов

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

Помимо модов там же лежит файл mod-list.json – этот файл отвечает за то, какие моды включены на данный момент, через него также можно выбрать, какие моды будут включены или выключены (без необходимого входа и перезахода в игру).

RCs9mz2

 

Сами моды могут содержаться как в папках, так и в архивах (первое – удобнее для редактирования, второе – для распространения).

Важно то, что архив или папка мода должна иметь имя составленное из имени мода, подчеркивания, и версии мода. Это корневая папка мода.

Пример: MyMod_0.1.4

 

Версия мода всегда записывается как 3 числа через точки. Разработчики объясняют это так:

Первое – Крупные обновления, Кардинальные изменения.

Второе – мелкие обновы, добавление пары предметов,

Третье – багфиксы

 

Теперь перейдем к архитектуре самого мода:

Существуют  “зарезервированные” и “свободные” файлы и имена, а также единственный обязательный файл.

Давайте, наверное, сразу создадим его, и не будем к этому возвращаться:Screenshot_21

создаем папку нашего мода, а в ней создаем файл “info.json”.

Этот файл – лицо мода. Он отвечает за его отображение в списке модов в игре.

В файле прописываем операторные скобки {  } .

Внутри пишем названия строк (на картинке указаны обязательные) и их значения в кавычках. Не забываем, что название папки соответствует версии и названию мода.

  • name – имя мода
  • version – версия
  • title – имя мода в списке
  • dependencies – зависимости (например в серии Боб-модов есть зависимости от других модов)Screenshot_22
  • author – имя создателя
  • descriprion – описание мода

 

Вы можете добавить и свои строки, но не забываем: “краткость – сестра таланта”.

Теперь можно разобраться со “свободными” и “зарезервированными” именами.

Существует несколько специальных папок, которые игра будет воспринимать по своему, и, если там будут не те файлы, вы получите ошибку.

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

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

  • campaigns
  • locale
  • Scenarios
  • migration

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

Сортировка файлов в моде

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

     Метод разработчиков3YC0bAt:

В оригинальной игре все предметы, рецепты, и файлы содержаться в папке Prototypes. Графика – в папке Graphics. Звуки – в Sounds. Тем самым разработчики разбивают все файлы по типу.

Внутри папок же они проводят разбиение по подтипу: например, в Prototypes идет рабиение на папки Recipes, Entity, Items, Technologies. Это гарантирует вам быстрое нахождение предмета в папках, но, если у вас будет много всего, будет довольно трудно найти конкретный предмет.

    Метод Naikoraptor’a  (что ник нечитаемый, что текст до правок …)  (re: это читается как: Найко раптор) (Нарко Йаптор ?..)

Мне кажется, что при создании предмета все его компоненты проще держать рядом, поэтому я создаю папку всех “объектов”, а в ней под папки для каждого “явления”Screenshot_23

Например, в папке Prototypes лежит папка Carbon, в ней лежат файлы: Item.lua, recipe.lua, technology.lua, Carbon.png, Carbon_Tech.png.

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

 

Подключение файлов.

Первым делом в корне нашего мода создадим файл data.luaScreenshot_24.

Этот файл будет автоматически запускаться при включении мода.

Любые другие файлы lua будут игнорироваться.

Давайте, для примера, создадим в нашем моде папку Items а в ней создадим Items.lua.

 

Теперь открываем вновь наш корневой файл data.lua и запоминаем новую команду:Screenshot_25

require( )

 

Команда прописываеться в начале файла.

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

Названия папок пишутся с учетом регистра и разделяются точками. Сам файл пишется без расширения “.lua”.

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

Таким образом осуществляется подключение всех файлов lua (звуки и графику рассмотрим позже).

 

 

Теперь немного от себя: как это можно выгодно использовать?

Помните, я советовал вам объеденять файлы в некоторые объекты и делать сортировку по принадлежности к тому или иному предмету? Так вот, именно тут это очень пригодится.

В каждой папке предмета(тот же Carbon” из примера) создаем data.lua, а в ней подключаем все компоненты.Screenshot_26

 

А в главном файле подключаем именно этот data.lua файл. Таким образом, объект со своим рецептом будет представлен одним единственным файлом, который можно легко включить или выключить при желанииScreenshot_27.

 

 

 

 

 

Создание своего предмета

И вот, мы плавно перешли к тому, чтобы создавать уже нечто свое.

Самое главное в создании мода – это идея. Если вы не знаете  что делаете – результат будет ущербным. Вам нужна задумка ( желательно оригинальная) чтобы что-то написать.

Для примера, я создам бочки полные воды (по аналогии с бочками нефти). Зачем? А помните, при создании карты можно указать чтобы вода была только в центре карты? А вдруг, нам понадобится вода на нашей “станции” за три-девять земель, и, тянуть туда трубу – не выгодно, а возить поездом – самое то.

Создадим папку отведенную под этот объект (да, я буду использовать свою сортировку, но вы можете делать как считаете нужным), там создаем data.lua и item.lua

Окрываем Фаил item.lua и прописываем туда : data:extend({    })

Внутри таких двойных скобок будет идти перечисление всех объектов. Тем самым мы описываем их базовые свойства.

Каждый объект внутри “data:extend”  прописывается в своих собственных скобках { }, { }, { }.

И не забывайте ставить запятые между  скобками, иначе вас ждет ошибка.

Далее идет заполнение предмета: оно довольно простое, так как вам нужно заполнять не все строки, а только те, которые вам нужны (другими словами вам нужно заполнять то, что вам нужно заполнять 😆 ) .

Сейчас я дам вам список и описание ВСЕХ возможных строк предмета, а после – пример создания нашей “бочки”.

  • type = string – Эта строка сообщает игре что перед ней предмет (другие типы будем изучать по мере выхода гайдов, тут сразу не раскажешь).
  • icon = string – Указывает путь к картинке файла (и к файлу картинки. ага).
  • name = string – Задает этому предмету имя  ВНТУРИ МОДА, а не в самой игре. Имено по этому имени мы будем сообщать другим частям кода что мы хотим, но чтобы не запутаться пишите так, как оно есть (только латиницей).
  • localised_name = string – Дает локализованое имя предмету (его видно в игре). Но мы не будем никогда использовать эту строку потому, что есть простой и правильный способ локализации (об этом в след. раз).
  • stack_size = uint – Наверняка, некоторое  испугались типа “Uint” ? Не пугайтесь, это просто длинный 32-bit unsigned integer (32-битный беззнаковый целочисленный тип. числа в пределах от 0 до 4 294 967 295. неплохо, да ?). Данный параметр отвечает за размер стака.
  • fuel_value = float – Если вы укажете эту строку, то сообщите игре что этот обьект – топливо, и его нужно совать в слот для топлива (в печи тоже). Здесь можно указывать сколько объект дает энергии при сжигании. Например, уголь дает 4.0, а твердое топливо – 25.0 Можно писать и дробью. (float – знаковое число с плавающей точкой. минусовое значение – бессмысленно, а число может изменяться в пределах 1.40129846432481707e-45 .. 3.40282346638528860e+38) .
  • order = string – Строка, указывающая в каком порядке сортировать предметы. Об этом в следующем гайде. Пока ставьте “aaa” (латиница).
  • group = string – Строка сортировки по группе. Также оставим на потом (не заполняйте её).
  • subgroup = string – Строка сортировке по полосе. И её оставим на потом (указывайте raw-material)
  • place_result = string – Это указание на то, что будет, если поставить объект на землю. О постройках мы также будем говорить.
  • speed = float – Указывает на скорость предмета, если это оружие или инструмент.
  • magazine_size = float – Указывает количество патронов в обойме, если это оружие.
  • resistance = Resistance – Еще один “волшебный” тип данных. О нем также позже. Эта строка отвечает за сопротивления брони к урону, если предмет – броня.
  • item_to_clear = LuaItemPrototype – Эта строка указывает необходимый ресурс, с помощью которого можно отчистить Чертеж от содержимого.
  • stackable = bool – Если стоит false, то это запрещает предмету стакаться. Однако, проще это делать указывая stack_size = 1.
  • module_effects – Эта строка вовсе не имеет типа. Она отвечает за эффекты если создаваемый предмет – модуль эффектов.
  • flags = string – самая интересная строка. Наделяет предмет свойствами(флагами). Об этом, как и практически о бо всем, я раскажу, но не сейчас.

А теперь создадим нашу бочку:

data:extend({
{

type = "item",

name = "WaterB",

icon = "__MyMod__/Prototypes/WaterT/empty-barrel.png",

flags = { "goes-to-main-inventory" },

subgroup = "raw-material",

order = "aaa",

stack_size= 10,

},
})

 

 

Теперь расскажу вам о двух пропущенных вещах: флаги и картинка.

Для создания простого предмета нужно всего 1 из 2 флагов:  “goes-to-main-inventory” или “goes-to-quickbar”.

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

Теперь по поводу картинок: картинка должна иметь формат png и размер 32×32. Иначе игра выдаст ошибку. Если вам лень придумывать и рисовать картинку (или если не умеете рисовать) – вы можете подключить уже готовую из игры.

Идем в папку base, и там в графике в иконках ищем нашу бочку.

вот вам на всякий случай её путь : __base__/graphics/icons/fluid/empty-barrel.png

Копируем себе такую в папку с файлом (можете подрисовать туда что-либо) и прописываем вот так  icon = "__MyMod__/Prototypes/WaterT/empty-barrel.png",

 

Расскажу поподробнее про то, как подключать картинки:

сначала указываем имя мода с двойным подчеркиванием : _ _ Имя мода _ _ (без пробелов, можно подключать и базовую игру и чужие моды 😉   ),

после, через “/” указываются названия папок, а после и сам файл с раширением.

 

Теперь подключаем наш итем в data.lua и заходим в игру (проверяем на ошибки). Если их нет и игра Screenshot_28запустилась, то все “ок”. Однако, предмет пока что мы сможем видеть только, например, в сундуке запроса, так как он не имеет рецепта.

Ну, вот и все. Мы создали наш первый предмет (и, хотя он не имеет рецепта, его можно найти в списке предметов). О том, как добавлять рецепты раскажу в след раз, иначе будет слишком много информации (и слишком много придётся кому-то редактировать текста… 😥 ).


Комментарии:

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.