eae7c066d19641a4dd6d08769279b82c811f869f
- 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
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-а.
Description
Languages
C#
100%