mikhail eae7c066d1 feat: Factorio Space Age Production Calculator
- Domain: immutable entities (Resource, Recipe, Machine, Module, etc.)
- Data: JSON recipe repository (34 resources, 26 recipes, Space Age)
- Solver: DFS-based production planner with module support
- Reporting: Console, JSON, Excel exporters
- CLI: solve/list commands with Spectre.Console
- Tests: 20 unit tests (xUnit) all passing
- Tech: C# .NET 10, MathNet.Numerics, ClosedXML

Model: GPT-4.1 (OpenAI) — executed by pi coding agent
2026-07-02 13:08:25 +03:00

Factorio Space Age Production Calculator

Model: GPT-4.1 (OpenAI) — executed by pi coding agent Stack: C# .NET 10, MathNet.Numerics, Spectre.Console, ClosedXML, xUnit

Калькулятор производственных цепочек для Factorio: Space Age. Рассчитывает количество машин, потоки ресурсов и сырьевые входы для заданных целей производства.

Архитектура

FactorioCalc/
├── src/
│   ├── FactorioCalc.Domain/     # Сущности, интерфейсы (DDD)
│   ├── FactorioCalc.Data/       # JSON-хранилище рецептов
│   ├── FactorioCalc.Solver/     # DFS-решатель (MathNet.Numerics)
│   ├── FactorioCalc.Reporting/  # Console/JSON/Excel экспорт
│   └── FactorioCalc.CLI/        # Точка входа, парсинг аргументов
├── tests/
│   └── FactorioCalc.Tests/      # xUnit unit-тесты (20 тестов)
├── data/
│   └── recipes.json             # База рецептов Space Age
└── README.md

Слои

Слой Описание
Domain Immutable-сущности: Resource, Recipe, Machine, Module, RecipeExecution, ProductionTarget, ProductionResult
Data JsonRecipeRepository — загрузка рецептов из JSON
Solver ProductionSolver — DFS-обход дерева зависимостей, расчёт модулей (speed/productivity)
Reporting ConsoleReporter, JsonReporter, ExcelReporter
CLI Парсинг аргументов, DI, Spectre.Console

Быстрый старт

# Сборка
dotnet build src/FactorioCalc.CLI/FactorioCalc.CLI.csproj

# Тесты
dotnet test tests/FactorioCalc.Tests/FactorioCalc.Tests.csproj

# Запуск
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj

Использование

Расчёт производства

# Простой расчёт
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- solve "Steel Plate:5"

# Множественные цели
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- solve "Red Science Pack:10" "Processing Unit:30"

# С модулями
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- solve "Blue Science Pack:60" -m "Productivity Module 3"

# С экспортом
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- solve "Yellow Science Pack:15" -j result.json -e result.xlsx

Формат целей

"ResourceName:amount"

Например: "Steel Plate:5" → 5 стальных пластин в секунду.

Опции

Опция Описание
-r, --recipe-file <path> Путь к JSON с рецептами
-m, --modules <name> Модуль для применения (можно повторять)
-j, --json <path> Экспорт в JSON
-e, --excel <path> Экспорт в Excel (.xlsx)

Список ресурсов

dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- list --resources
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- list --recipes
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- list --machines
dotnet run --project src/FactorioCalc.CLI/FactorioCalc.CLI.csproj -- list --modules

Формула расчёта

Recipe Rate (cycles/sec) = needed_per_sec / (product_amount × (1 + productivity_bonus))
Machine Count = recipe_rate / (effective_speed / craft_time)
Effective Speed = base_speed × (1 + speed_bonus)

Принципы

  • SOLID — разделение ответственности по слоям
  • Immutable entities — все сущности Domain-слоя неизменяемы
  • IReadOnlyCollection / IReadOnlyDictionary — публичные API
  • DFS — обход дерева зависимостей рецептов
  • MathNet.Numerics — для матричных вычислений (резерв)

Тесты

dotnet test tests/FactorioCalc.Tests/FactorioCalc.Tests.csproj

20 тестов: валидация сущностей Domain-слоя + интеграционные тесты Solver-а.

S
Description
No description provided
Readme 77 KiB
Languages
C# 100%