# 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 | ## Быстрый старт ```bash # Сборка 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 ``` ## Использование ### Расчёт производства ```bash # Простой расчёт 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 ` | Путь к JSON с рецептами | | `-m, --modules ` | Модуль для применения (можно повторять) | | `-j, --json ` | Экспорт в JSON | | `-e, --excel ` | Экспорт в Excel (.xlsx) | ### Список ресурсов ```bash 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** — для матричных вычислений (резерв) ## Тесты ```bash dotnet test tests/FactorioCalc.Tests/FactorioCalc.Tests.csproj ``` 20 тестов: валидация сущностей Domain-слоя + интеграционные тесты Solver-а.