@
CI / build-test (push) Failing after 1m8s

Add MrGameEng.AI utility-AI module; format codebase with CSharpier

New MrGameEng.AI module (ResponseCurve, Consideration, UtilityAction,
UtilityAi selector, Blackboard) plus CSharpier formatting applied across
the whole engine. Documents the CSharpier convention in CLAUDE.md.
@
This commit is contained in:
Leonid Pershin
2026-06-12 07:19:10 +03:00
parent 4ae730cafa
commit fd6343bd09
96 changed files with 2066 additions and 589 deletions
+29
View File
@@ -38,6 +38,7 @@
| `MrGameEng.Atlases` | Текстурные атласы: офлайн-сборка из дерева картинок (`AtlasBuilder`) и рантайм-загрузка (`TextureAtlas`); CLI — `tools/MrGameEng.AtlasTool` |
| `MrGameEng.Tilemaps` | Тайловые карты, создаваемые кодом: `TileGrid` + `TileSet` + компонент `Tilemap`, отрисовка видимых клеток через батчер |
| `MrGameEng.Pathfinding` | Поиск пути по гриду: A*, Dijkstra, BFS и flow fields для толп; чистая логика без зависимостей |
| `MrGameEng.AI` | Примитивы utility-ИИ: кривые отклика, соображения, действия и выбор (`UtilityAi<TContext>`), `Blackboard`; детерминированно, generic по контексту игры, без данных мира |
| `MrGameEng.Collisions` | Определение столкновений: компонент `Collider`, spatial hash, пары/запросы/raycast |
| `MrGameEng.UI` | Игровой UI на [Myra](https://github.com/rds1983/Myra): `Desktop` на сцену, виджеты, скининг |
| `MrGameEng.DevConsole` | Ингейм-консоль разработчика: логи `Log`, команды, история, автодополнение |
@@ -226,6 +227,34 @@ CLI-обёртка: `dotnet run --project tools/MrGameEng.AtlasTool -- <исто
инвалидируются generation-штампом — повторные запросы не аллоцируют и не чистят
массивы. Один экземпляр на систему; результаты детерминированы.
## ИИ агентов (utility)
`MrGameEng.AI` — примитивы для принятия решений агентами (жители LittleSim).
Зависит только от Core, **не владеет данными мира** и не привязан к ECS: всё
параметризовано контекстом `TContext`, который игра передаёт сама (снимок восприятия,
хендл сущности, blackboard — что угодно). Основан на Infinite-Axis Utility System:
- `ResponseCurve` (value type) — кривая отклика, нормализованный вход `[0,1]` →
полезность `[0,1]`: `Linear`, `Polynomial` (степень), `Logistic` (S-кривая),
`SmoothStep`. Вход и выход клампятся. **Внимание:** `default(ResponseCurve)` имеет
нулевой наклон (всегда 0) — для тождества используйте `ResponseCurve.Identity`.
- `Consideration<TContext>` — одно соображение: читает сырое значение из контекста,
нормирует по диапазону `[min,max]` и прогоняет через кривую.
- `UtilityAction<TContext>` — действие из набора соображений. Очки = произведение
соображений × `Weight`; любой ноль ветирует действие. Компенсирующий множитель
(make-up value) убирает смещение произведения многих факторов вниз.
- `UtilityAi<TContext>` — reasoner: `Select` (детерминированно лучшее действие, при
равенстве — первое) и `SelectWeighted(random)` (рулетка по очкам для разнообразия,
воспроизводимо при seed). Очки пишутся в переиспользуемый буфер — повторные
вычисления не аллоцируют; один экземпляр на вид агента, не потокобезопасен.
- `Blackboard` — типизированная рабочая память агента (`Set`/`TryGet`/`GetOrDefault`)
для холодных путей (восприятие, планирование).
Витрина в LittleSim: `PawnDecisionSystem` выбирает «бродить/отдыхать» по энергии
жителя, `PawnNeedsSystem` тратит/восстанавливает энергию, уставшие темнеют
(`PawnAppearanceSystem`). Команда консоли `ai [energy]` печатает очки и расклад
отдыхающих/блуждающих.
## Коллизии
`MrGameEng.Collisions` — определение столкновений (без разрешения физики — она в бэклоге):