Refactor products and buildings to support modding

This commit is contained in:
sokol
2026-02-20 21:51:06 +03:00
parent f320aa50ed
commit ec3da03bba
12 changed files with 1109 additions and 115 deletions

View File

@@ -0,0 +1,116 @@
namespace MyBiz.Core;
/// <summary>
/// Реестр типов продуктов - центрлизованное хранилище конфигураций
/// Поддерживает моддинг через загрузку внешних конфигураций
/// </summary>
public class ProductRegistry
{
private readonly Dictionary<string, ProductType> _productTypes = new();
/// <summary>
/// Все зарегистрированные типы продуктов
/// </summary>
public IEnumerable<ProductType> AllProductTypes => _productTypes.Values;
/// <summary>
/// Количество зарегистрированных типов
/// </summary>
public int Count => _productTypes.Count;
/// <summary>
/// Событие: добавлен новый тип продукта (для моддинга)
/// </summary>
public event Action<ProductType>? ProductTypeAdded;
/// <summary>
/// Событие: изменён тип продукта
/// </summary>
public event Action<ProductType>? ProductTypeModified;
/// <summary>
/// Зарегистрировать тип продукта
/// </summary>
public void Register(ProductType productType)
{
if (string.IsNullOrEmpty(productType.Id))
throw new ArgumentException("Product type must have an Id", nameof(productType));
if (_productTypes.ContainsKey(productType.Id))
throw new InvalidOperationException($"Product type '{productType.Id}' is already registered");
_productTypes[productType.Id] = productType;
ProductTypeAdded?.Invoke(productType);
}
/// <summary>
/// Получить тип продукта по ID
/// </summary>
public ProductType? GetById(string id)
{
return _productTypes.TryGetValue(id, out var type) ? type : null;
}
/// <summary>
/// Получить тип продукта или выбросить исключение
/// </summary>
public ProductType GetOrThrow(string id)
{
return GetById(id) ?? throw new KeyNotFoundException($"Product type '{id}' not found");
}
/// <summary>
/// Проверка: существует ли тип продукта
/// </summary>
public bool Exists(string id)
{
return _productTypes.ContainsKey(id);
}
/// <summary>
/// Получить продукты по категории
/// </summary>
public IEnumerable<ProductType> GetByCategory(ProductCategory category)
{
return _productTypes.Values.Where(p => p.Category == category);
}
/// <summary>
/// Получить продукты, доступные в указанном году
/// </summary>
public IEnumerable<ProductType> GetAvailableInYear(int year)
{
return _productTypes.Values.Where(p => p.AvailableFromYear <= year);
}
/// <summary>
/// Удалить тип продукта (для моддинга)
/// </summary>
public bool Remove(string id)
{
if (_productTypes.Remove(id))
{
ProductTypeModified?.Invoke(new ProductType { Id = id });
return true;
}
return false;
}
/// <summary>
/// Загрузить типы продуктов из конфигурации (JSON и т.п.)
/// </summary>
public void LoadFromConfig(string jsonConfig)
{
// TODO: Реализовать загрузку из JSON
// Это позволит модам добавлять свои продукты
}
/// <summary>
/// Экспортировать все типы в JSON (для моддинга)
/// </summary>
public string ExportToJson()
{
// TODO: Реализовать экспорт в JSON
return "{}";
}
}