Files
factorio-calc/README.md
T
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

115 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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-а.