Files
my-biz/docs/tech/products.md
2026-02-21 10:26:23 +03:00

8.5 KiB
Raw Blame History

Продукты (Products)

Система продуктов и товаров в игре.

Обзор

Продукты — основа экономической модели. Каждый продукт имеет тип (конфигурацию) и экземпляр (количество).

📂 Код: backend/src/MyBiz.Core/Product*.cs


Архитектура

┌─────────────────┐         ┌─────────────────┐
│  ProductType    │         │   Product       │
│  (конфигурация) │ ──────► │  (экземпляр)    │
│  - Id           │  Type   │  - Quantity     │
│  - Name         │         │  - CurrentPrice │
│  - BasePrice    │         │  - Quality      │
│  - ShelfLife    │         │  - IsSpoiled    │
└─────────────────┘         └─────────────────┘
         ▲
         │
┌─────────────────┐
│ ProductRegistry │
│  (реестр типов) │
└─────────────────┘

ProductType

Назначение: Конфигурация типа продукта для моддинга.

📂 Исходный код: ProductType.cs

Основные свойства

Свойство Тип Описание
Id string Уникальный идентификатор (для моддинга)
Name string Отображаемое имя
Description string Описание продукта
Category ProductCategory Категория (сырьё/компонент/товар)
BasePrice decimal Базовая цена
BaseDemand int Базовый спрос в тик
DemandElasticity float Эластичность спроса (0-1)
ShelfLife int Срок хранения в тиках (0 = бессрочно)
StackSize int Размер стека в инвентаре
AvailableFromYear int Год доступности (исторический режим)
RequiredTechnologies List Требуемые технологии

Вычисляемые свойства

  • IsPerishable — портится ли продукт (ShelfLife > 0)

Методы

  • Clone() — создание независимой копии

Product

Назначение: Экземпляр продукта в инвентаре/на складе.

📂 Исходный код: Product.cs

Основные свойства

Свойство Тип Описание
Id Guid Уникальный ID экземпляра
Type ProductType Ссылка на конфигурацию типа
Quantity int Количество
CurrentPrice decimal Текущая цена за единицу
CreatedAtTick int Тик создания (для срока годности)
Quality int Качество (0-100)
IsSpoiled bool Испорчен ли

Вычисляемые свойства

  • TotalValue — общая стоимость (Quantity × CurrentPrice)
  • IsUsable — можно ли использовать (Quantity > 0 && !IsSpoiled)

Методы

Метод Описание
Add(int amount) Добавить количество
Remove(int amount) Удалить количество (возвращает факт. удалённое)
Update(int currentTick) Обновить состояние (проверка срока годности)

ProductRegistry

Назначение: Централизованный реестр типов продуктов.

📂 Исходный код: ProductRegistry.cs

Методы

Метод Описание
Register(ProductType) Зарегистрировать тип
GetById(string) Получить по ID
GetOrThrow(string) Получить или выбросить исключение
Exists(string) Проверка существования
GetByCategory(ProductCategory) Фильтр по категории
GetAvailableInYear(int) Фильтр по году доступности
Remove(string) Удалить тип
LoadFromConfig(string) Загрузить из JSON (TODO)
ExportToJson() Экспорт в JSON (TODO)

События

  • ProductTypeAdded — добавлен новый тип (для моддинга)
  • ProductTypeModified — изменён тип

Дефолтные продукты

12 продуктов в 3 категориях:

📂 Исходный код: DefaultProducts.cs

Сырьё (RawMaterial)

ID Название Базовая цена Портится С года
raw_cotton Хлопок 5 1900
raw_steel Сталь 15 1900
raw_plastic Пластик 8 1950
raw_food Сельхозпродукция 3 (10 тиков) 1900

Компоненты (Component)

ID Название Базовая цена Портится С года
comp_fabric Ткань 12 1900
comp_metal_parts Металлоизделия 25 1900
comp_plastic_parts Пластиковые детали 18 1950
comp_electronics Электронные компоненты 50 1960

Товары (ConsumerGoods)

ID Название Базовая цена Портится С года
goods_food Продукты питания 8 (5 тиков) 1900
goods_clothing Одежда 35 1900
goods_electronics Электроника 150 1960
goods_automobile Автомобили 5000 1920

Примеры использования

Регистрация типа продукта

var registry = new ProductRegistry();

var bread = new ProductType
{
    Id = "food_bread",
    Name = "Хлеб",
    Category = ProductCategory.ConsumerGoods,
    BasePrice = 10m,
    ShelfLife = 5,
    AvailableFromYear = 1900
};

registry.Register(bread);

Создание экземпляра продукта

var product = new Product
{
    Type = registry.GetOrThrow("goods_food"),
    Quantity = 100,
    CurrentPrice = 8m,
    CreatedAtTick = 0
};

product.Add(50);        // +50 единиц
product.Remove(30);     // -30 единиц
product.Update(10);     // проверка через 10 тиков

Фильтрация продуктов

// Все сырьевые продукты
var rawMaterials = registry.GetByCategory(ProductCategory.RawMaterial);

// Доступные в 1950 году
var available1950 = registry.GetAvailableInYear(1950);

// Скоропортящиеся
var perishable = registry.AllProductTypes.Where(p => p.IsPerishable);

Тесты

📂 Код: backend/tests/MyBiz.Tests/ProductTests.cs

Тест Описание
ProductType_Creation_ShouldInitializeProperties Создание типа продукта
ProductType_Clone_ShouldCreateIndependentCopy Клонирование типа
Product_Add_ShouldIncreaseQuantity Добавление количества
Product_Remove_ShouldDecreaseQuantity Удаление количества
Product_Perishable_ShouldSpoilAfterShelfLife Порча продуктов
Registry_* Тесты реестра

Связанные документы


Последнее обновление: 20.02.2026