eae7c066d1
- 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
115 lines
4.4 KiB
Markdown
115 lines
4.4 KiB
Markdown
# 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 <path>` | Путь к JSON с рецептами |
|
||
| `-m, --modules <name>` | Модуль для применения (можно повторять) |
|
||
| `-j, --json <path>` | Экспорт в JSON |
|
||
| `-e, --excel <path>` | Экспорт в 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-а.
|