Всем привет!
В этом цикле статье я постараюсь максимально просто объяснить как добавить свой кастомный предмет в Stardew Valley
Важно: Все действия, описанные здесь, актуальны для версии 1.6. Если ваша версия игры Stardew Valley отличается от этой, то не все приведенные здесь советы могут быть применимы.
Для начала стоит разделить 2 сущности: Контент-паки и моды
Контент-пак (Content pack) - это расширение для Stardew Valley, которое не изменяет основное поведение игры, а позволяет добавлять или изменять уже существующие предметы и персонажей. Контент-паки создаются путем создания новых файлов в формате .json, которые "говорят" игре добавлять или изменять уже существующие объекты.
Мод (Mod) - файлы с кодом, написанные на языке C#, которые могут менять поведение игры, добавлять новые сущности, в общем глобально меняют некоторые аспекты игры.
В этой статье мы затронем именно создание контент-паков так как нам нужно добавить только предметы. Также в этой статье я подробнее расскажу про установку и загрузку необходимых модов и фреймворков. В последующих статьях это будет опущено.
Какие ресурсы понадобятся для создания своего контент-пака:
- SMAPI - Это основа любых модов для Stardew Valley, именно он позволяет запускать модифицированную игру. Установка донельзя простая - просто скачайте файл, распакуйте и выберите нужный вам установщик. Есть версии для Windows, Linux и MacOS. В этой статье я рассмотрю именно работу с windows.
- Программа для редактирования кода, которая позволяет работать с файлами формата .json - лично я использую VSCode.
- Json Assets - фреймворк (мод, который не делает ничего сам по себе, но нужен для правильной работы других модов), который непосредственно позволяет добавлять в игру собственные объекты (ассеты).
- Producer Framework Mod - фреймворк, который позволяет добавить собственные рецепты для оборудования (Бочонок, кадка, пресс для сыра и т.п.).
- Expanded Preconditions Utility - фреймворк, который позволяет добавлять условия получения (покупки) предмета. Необходим для работы JsonAssets, даже если вы не планируете добавлять условия
- (Опционально) Content Patcher - фреймворк, который позволяет напрямую изменять игровые предметы. В этой статье мы его использовать не будем, но он может пригодиться в следующих
Важно: На момент выхода этой статьи (21.03.2024) во вкладке ручного скачивания модов нужно выбирать версию для Stardew Valley 1.6, она находится ниже версии для 1.5.5. Также советую обращать внимание на дату загрузки файла. Чем ближе она к текущей дате, тем "Свежее" мод.
Как установить необходимые моды:
- SMAPI - для установки, нужно скачать файл с официального сайта, распаковать архив и в получившейся папке найти файл установки соответствующий вашей ОС.
Например, для ОС Windows название файла будет выглядеть так: install on Windows.bat.
После запуска, программа предложит вам выбрать место установки SMAPI. Если у вас Steam-версия игры, то путь к нужной папке установщик найдёт самостоятельно. Если игра установлена из других источников - путь к папке нужно будет указывать вручную.
Следующим шагом программа попросит вас выбрать действие. Выбираем install и нажимаем enter.
После этого программа сама установится в нужную папку, и в ней появится дополнительная папка "Mods", куда мы и будем устанавливать наши моды.
Дополнительно: Если у вас игра в Steam, в библиотеке нажмите правой кнопкой мыши по Stardew Valley > Свойства > Параметры запуска и укажите там строчку
"[Путь к папке Steam]\SteamLibrary\steamapps\common\Stardew Valley\StardewModdingAPI.exe" %command%
Заменив [Путь к папке Steam] на путь. У меня папка SteamLibrary лежит просто на диске А, поэтому моя строчка выглядит как
"A:\SteamLibrary\steamapps\common\Stardew Valley\StardewModdingAPI.exe" %command%
2. Установка остальных модов - Все остальные моды устанавливаются одинаково. С Nexus Mods скачивается архив, который нужно распаковать и положить в папку "Mods", которую создал SMAPI при установке.
Создание собственного контент-пака
В этом блоке мы пристально рассмотрим как создать контент-пак, от его структуры, до примеров кода, которые используются. В будущих статьях эта информация будет пропускаться.
Как правильно описать файл с расширением .json
В контент-паках основную информацию предоставляют файлы формата .json.
Они представляют собой словари, состоящие из пар "ключ": "значение".
Основные правила синтаксиса json-ов:
- Тело файла ограничивается фигурными скобками {}. Соответственно в начале файла всегда стоит открывающая скобка { а в конце - закрывающая }
- Все ключи должны заключаться в двойные кавычки. Например "key": "value"
- Ключ и значение отделяются друг от друга двоеточием
- В конце строки ставится запятая.
- Значение может иметь несколько типов: Строка, Число, Список, Словарь или Логический
- Значение типа Строка всегда заключается в двойные кавычки. "key": "string"
- Значение типа Число не заключается в кавычки. "key": 40
- Значение типа Список это перечисление значений через запятую, заключенное в квадратные скобки. При этом правила написания типов значений сохраняются. "key": [1, 2, "value"]
- Значение типа Словарь это набор пар ключ: значение, заключенное в фигурные скобки. "key": {"key": "value"}
- Значение типа Логический имеет всего 3 варианта (true - Если параметр должен быть включён; false - Если параметр должен быть выключен; null - Если значение параметра не установлено). Значения при этом не заключаются в скобки. "key": true
Подробнее про синтаксис json можно прочитать по ссылке
Дополнительная информация: В процессе называния различных объектов, папок и т.д. я буду использовать принцип CamelCase. Подробнее про него можно прочитать по ссылке.
Файловая структура контент-пака
Базово, контент-пак состоит из 2 типов файлов:
- manifest.json - файл, который даёт базовою информацию о контент-паке: его версию, автора и т.п
- Остальные файлы, которые описывают что должен делать контент-пак. Структура этих файлов может отличаться друг от друга
Например, мод, который меняет рецепты для оборудования, должен содержать всего 3 файла: "manifest.json", "ProducerRules.json" и "ProducerConfig.json"
Мод JsonAssets, который мы будем использовать как фреймворк в этой статье, использует следующую структуру:
1. Файл "manifest.json"
2. Папка "Objects" внутри которой для каждого объекта есть отдельная папка с файлами "object.json" (описывает данные объекта) и "object.png" (спрайт - то как выглядит объект в игре)
manifest.json
Итак, файл manifest.json состоит из следующих значений:
- Name - название мода или контент-пака. Именно это название будет отображаться в игре.
- Author - автор, тот, кто создал контент-пак.
- Version - версия контент-пака.
- Description - описание контент-пака.
- UniqueId - уникальный id пака. Обычно состоит из автора и названия мода, разделенных точкой и без пробелов. "author.ModName"
- UpdateKeys - поле нужно для указания ключей обновления, если вы загружаете свой мод, например на NexusMods, игра, получив ключ, сможет узнать актуальную версию мода и сравнить её с текущей. В этом примере мы оставим это поле пустым.
- ContentPackFor - в этом поле нужно указать тот фреймворк к которому относится пак. В одном паке может быть несколько частей, которые используют разные фреймворки. Для каждой такой части нужно создавать отдельный manifest.json в котором указывать UniqueId разных фреймворков.
Пример ContentPackFor для пака, который использует JsonAssets:
"ContentPackFor": {
"UniqueId": "spacechase0.JsonAssets"
} - Dependencies - это поле, которое позволяет указать зависимости для контент-пака. В этом примере мы его использовать не будем.
Создание нового объекта
Для создания нового объекта, внутри папки "objects" нужно создать новую папку с названием объекта.
В этой папке необходимо создать 2 файла: object.json и object.png
object.json
Объект может состоять из следующих значений:
- Name - имя объекта, будет использоваться в английской версии игры
- Description - описание объекта, тоже используется в английской версии игры
- Category - категория объекта. В базовой игре доступны следующие категории: Flower, Fruit, Vegetable, Gem, Fish, Egg, Milk, Cooking, Crafting, Mineral, Meat, Metal, Junk, Syrup, MonsterLoot, ArtisanGoods, Greens, AnimalGoods, Seeds.
У некоторых категорий есть особые настройки. Например, чтобы предмет можно было произвести или приготовить, он должен иметь категорию Crafting или Cooking соответственно. В этом примере мы рассмотрим только базовые категории. - Edibility - съедобность объекта. Если съедобность равно -300 - то объект несъедобен и его не получится употребить в пищу. Съедобность от -299 до -1 будет уменьшать здоровье и энергию, 0 означает, что объект съедобен, но никаких параметров не меняет, если значение больше или равно 1, то здоровье и энергия прибавляются.
Увеличение (или уменьшение для отрицательных значений) здоровья и энергии рассчитывается по следующей формуле:
Здоровье = съедобность * 1,125 (чтобы здоровье увеличилось на 100, съедобность должна быть 88.8)
Энергия = съедобность * 2.5 (чтобы энергия увеличилась на 100, съедобность должна быть 40) - EdibleIsDrink - Является ли объект напитком. Если напиток несъедобен - то значение параметра не учитывается.
- EdibleBuffs - Эффекты, которые даёт объект. Этот параметр мы подробнее разберем в следующей статье.
- Price - Цена продажи объекта торговцам
- IsColored - Имеет ли объект конкретный цвет. Этот параметр актуален для объектов, которые могут использоваться в рецептах, где результат зависит от цвета объекта
- CanPurchase - Можно ли приобрести товар у торговца.
- PurchaseFrom - продавец у которого можно приобрести объект. Значение учитывается только если объект можно купить. Полный список значений можно найти по ссылке.
- PurchasePrice - Цена по которой можно купить объект
- PurchaseRequirements - Условия, которые нужны для приобретения объекта. Мы затронем этот параметр в следующих статьях
- Recipe - Рецепт для создания предмета. Подробнее рассмотрим этот параметр в следующей статье
- NameLocalization - Перевод названия предмета на другие языки. Структура значения выглядит как словарь с парами "код языка": "Перевод названия".
Полный список языковых кодов можно найти по ссылке. - DescriptionLocalization - то же самое, что и в предыдущем пункте, только с описанием объекта.
Это не полный список параметров, которые можно использовать при создании объекта. Полный список параметров для всех типов объектов в том числе и одежды, можно посмотреть у автора мода Json Assets по ссылке.
Исходя из всего вышеперечисленного мы можем создать файл object.json в котором укажем базовые параметры для объекта с типом "Gem" - он будет драгоценным камнем
object.png
Второй составляющей для создания объекта является спрайт - файл в формате .png, размером 16х16 пикселей.
Для создания спрайта можно использовать любую программу, которая поддерживает сохранение файлов с прозрачным фоном. MS Paint, например, не поддерживает прозрачность фона, поэтому его использовать не получится.
Я использую программу Paint NET - скачать его можно по ссылке
Процесс отрисовки спрайта довольно прост. При создании полотна нужно указать размеры картинки - 16х16 пикселей, удалить фон и нарисовать то, как вы видите объект.
Финальный этап
Когда все файлы подготовлены, мы можем собрать их в одну папку (не забывая о правильной структуре пака) и загрузить эту папку в папку "Mods"
После этого можно запускать Stardew Valley и проверять наличие объекта :)