Open Source · LGPL v3+

Investycoon Core SDK

Модульный SDK для создания пользовательских плагинов в экосистеме Investycoon.

Установить nuget install InvestycoonCore -Source "GitLab"

Обзор

InvestycoonCore позволяет настраивать типы компаний, предметы и их характеристики, а также технологии. Пакет требует .NET 10 без дополнительных зависимостей NuGet.

  • Пользовательские типы компаний
  • Пользовательские предметы и характеристики
  • Расширяемые технологии

Установка

Для начала создайте .NET-решение и подключите InvestycoonCore через NuGet:

nuget install InvestycoonCore -Source "GitLab"

Или скачайте файл .nupkg из официального реестра.

Минимальный пример класса Plugin:

public class CustomPlugin : Plugin
{
    public override string Code => "custom-plugin";
    public override string Version => "1.0";
    public override string Name => "Custom Plugin";
    public override string Explanation => "This is a custom plugin";
    public override ResourceManager MainResourceManager => new CustomResourceManager();
}

Класс предоставляет свойства Code, Version, Name, Explanation и MainResourceManager для настройки.

Справочник по членам

Абстрактный класс Plugin предоставляет следующие члены. Code, Name, Version, Explanation и MainResourceManager обязательны. Остальные — опциональны и возвращают false или пустой список по умолчанию.

Член Тип Описание
Code string Уникальный идентификатор плагина, используется внутри системы.
Name string Имя, отображаемое в интерфейсе администратора.
Version string Версия плагина, отображаемая в InvestycoonSky.
Explanation string Описание, отображаемое администраторам.
MainResourceManager ResourceManager Менеджер ресурсов для локализации меток.
ItemIgnoreVanilla bool Если true, стандартные предметы игры удаляются. По умолчанию: false.
CompanyTypeIgnoreVanilla bool Если true, стандартные типы компаний удаляются. По умолчанию: false.
Items() List<Item> Возвращает список предметов, предоставляемых плагином.
CompanyTypes() List<CompanyType> Возвращает список типов компаний.
ItemSpecificationTypes() List<ItemSpecificationType> Возвращает список типов характеристик (качество и т.д.).

Полный пример плагина:

public sealed class MyPlugin : Plugin
{
    public override string Code        => "my-plugin";
    public override string Version     => "1.0";
    public override string Name        => "My Plugin";
    public override string Explanation => "Plugin description.";
    public override ResourceManager MainResourceManager
        => Resources.Resources.ResourceManager;

    public override bool ItemIgnoreVanilla        => true;
    public override bool CompanyTypeIgnoreVanilla => true;

    public override List<Item> Items() =>
    [
        new ItemResource(1, "lithium", 20_00).SetMass(25f).SetItemGroup("resource"),
        new Item(2, "battery", 2, 10_00).SetMass(0.1f).SetItemGroup("refined"),
    ];

    public override List<CompanyType> CompanyTypes() =>
    [
        new(1, "tech-company",
            nameof(Resources.Resources.TechCompany_Label),
            nameof(Resources.Resources.TechCompany_Label))
    ];

    public override List<ItemSpecificationType> ItemSpecificationTypes() =>
    [
        new(1, "quality", ItemSpecificationTypeEnum.Quality, [10])
    ];
}

Типы предметов

Выберите тип, соответствующий природе вашего предмета:

Item

Базовый продукт: компонент, производственный товар. Принимает уровень (1–5), влияющий на редкость и прогрессию в игре.

new Item(id: 1, name: "battery", tier: 2, defaultPrice: 10_00)
    .SetMass(0.1f)
    .SetVolume(0.0001f)
    .SetItemGroup("refined");

ItemResource

Природный добываемый ресурс. Автоматически устанавливает tier=1, IsDivisible=true и IsStackable=true. Опциональные методы SetRarity() и SetWorldGeneration() настраивают редкость и генерацию карты.

new ItemResource(id: 1, name: "lithium", price: 20_00)
    .SetMass(25f)
    .SetRarity(ItemRarity.GetByName("ordinary")!);

ItemFuel

Потребляемый источник энергии. Установите мощность с помощью SetEnergy().

new ItemFuel(id: 1, code: "atomic-battery", price: 300_00)
    .SetEnergy(1_000)
    .SetMass(1f);

ItemNonPhysical

Цифровой или нематериальный предмет (программное обеспечение, данные). Не имеет массы или объёма.

new ItemNonPhysical(id: 1, code: "program", price: 0);

MachineTransformer

Производственная машина с рецептами входа/выхода. Добавляйте рецепты с помощью AddRecipe().

new MachineTransformer(id: 1, code: "factory", price: 10_000_00)
    .SetNbInput(2)
    .SetNbOutput(1)
    .SetDelayBuild(TimeSpan.FromHours(1))
    .SetMaxWorkers(3)
    .AddRecipe(new MachineRecipeFuel(
        "my-recipe", "company-type-code",
        inputCapacity: 64, outputCapacity: 12,
        inputs:  [new RecipeProduct("lithium", 2)],
        outputs: [new RecipeProduct("battery", 10)]
    ));

Локализация

Метки в игре (названия предметов, типы компаний, рецепты) переводятся через файлы .resx. Создайте Resources/Resources.resx (English по умолчанию) и Resources/Resources.fr.resx (French).

Настройте ваш .csproj для генерации статического класса-аксессора:

<ItemGroup>
  <EmbeddedResource Update="Resources\Resources.resx">
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>Resources.Designer.cs</LastGenOutput>
  </EmbeddedResource>
</ItemGroup>

Затем используйте ResourceManager в вашем плагине:

public override ResourceManager MainResourceManager => Resources.Resources.ResourceManager;

Развёртывание плагина в InvestycoonSky

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

1. Соберите ваш плагин в конфигурации Release и отправьте файл .dll администратору сервера:

dotnet publish -c Release

2. Администратор импортирует .dll через InvestycoonSky и может включать или отключать плагин в любое время без перезапуска сервера.

Плагин появляется в InvestycoonSky с его именем, кодом и версией сразу после импорта. Активация и деактивация полностью управляются из интерфейса администратора.

Иллюстрации

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

Разместите изображения в следующих папках внутри вашего проекта плагина:

Resources/
└── Images/
    ├── Items/
    │   ├── lithium.png
    │   └── battery.png
    └── CompanyTypes/
        └── tech-company.png

Объявите их как встроенные ресурсы в вашем .csproj:

<ItemGroup>
  <EmbeddedResource Include="Resources\Images\**\*" />
</ItemGroup>

Имя файла должно точно совпадать со свойством Name предмета или типа компании (с учётом регистра). При запуске AssertValidItem() выбрасывает ResourceCompilingException, если изображение отсутствует.

Лицензия

Распространяется под лицензией LGPL v3+.

Авторы

Разработано Аланом Бретелем.

Rejoining the server...

Rejoin failed... trying again in seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please retry or reload the page.