Update design documentation to clarify the structure and relationships of game elements. Enhance the definitions of TerritoryDef, BuildingDef, and FloorDef, and introduce new concepts like Patch for modifying definitions. Revise the near-term design to outline the UI structure and interactions, ensuring a clear framework for future development phases.
ci / server (push) Failing after 3m37s
ci / client (push) Successful in 16s

This commit is contained in:
Leonid Pershin
2026-08-18 13:41:35 +03:00
parent d96b420133
commit bc9a33e67f
9 changed files with 337 additions and 105 deletions
+14 -9
View File
@@ -5,28 +5,33 @@
модель. Менять инвариант в рабочих соглашениях имеет смысл только вместе с кодом.
Экран и defs: [`near-term.md`](near-term.md), [`defs.md`](defs.md).
Куда класть код: [`projects.md`](projects.md).
Работник (поток, очередь, сейв-файл) живёт в **Server**. То, что он тикает — `School` в
**Simulation**. Каталог, с которым школа создана — **Content**, замороженный у работника.
## Что уже почти есть
У каждой `School` уже свой Arch `World`. Это оставляем и делаем жёстким правилом: мир не
разделяется между школами и не отдаётся чужому потоку. Arch не потокобезопасен.
## Целевая модель
## Целевая модель — в этом срезе
Каждая школа — **актор**: свой поток (или `TaskCreationOptions.LongRunning`, что для нас то же
самое: выделенный поток, не пул тиков), свой `World`, свои часы, свой **замороженный** каталог
def (набор модов, выбранный при создании).
Каждая школа — **актор**: свой поток (`TaskCreationOptions.LongRunning` / выделенный поток, не
пул тиков), свой `World`, свои часы, свой **замороженный** каталог def, свой файл на диске.
Над ними — тонкий супервизор (сегодняшняя роль `GameLoopService` + `SchoolRegistry`):
Над ними — тонкий супервизор (вместо сегодняшнего общего цикла):
- создать / удалить школу, знать лимит;
- держать ящики: `id →` очередь команд этой школы;
- собирать **снимки** для `GET /api/schools` (работник публикует неизменяемое состояние, как
сейчас цикл публикует `SchoolsState`);
- маршрутизировать сокет: `OpenSchool` / `SetRunning` / кадры часов — только в ящик той школы.
- маршрутизировать сокет: `OpenSchool` / `SetRunning` / кадры часов — только в ящик той школы;
- при старте процесса поднять школы с диска, при остановке — дождаться записи работников.
Супервизор **не** вызывает `World`, не тикает часы, не читает defs инстанса. Работник **не**
трогает чужой мир и не ходит в ASP.NET.
трогает чужой мир и не ходит в ASP.NET. Файл школы пишет **работник** (create/delete через
команду супервизору, снимок часов — редкий, shutdown — обязательный).
Тик по-прежнему фиксированный (`SimulationOptions.FixedDeltaTime`), у каждого работника свой
таймер. Школы не синхронизируют календарь друг с другом — так и задумано.
@@ -56,6 +61,6 @@ def (набор модов, выбранный при создании).
## Пока не делаем
- Потоки на системы внутри одной школы (job system как у RimWorld) — рано.
- Потоки на системы внутри одной школы (job system как у RimWorld).
- Миграция живой школы на другой набор модов.
- Правка `AGENTS.md` до тех пор, пока цикл в коде ещё общий.
- Запись сейва на каждом тике.