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
+53
View File
@@ -0,0 +1,53 @@
# Нарезка проектов (целевая)
Сейчас в коде: `Protocol ← Server → Simulation`. Этого мало, когда появятся defs, карта и моды.
Класть каталог в Simulation (рядом с Arch) или в Server (рядом с Kestrel) — оба варианта смешают
слои. Ниже — куда что идёт в этом срезе. `architecture.md` правится, когда код так и станет.
## Зависимости
```
Protocol — ни на кого из игровых проектов (только байты)
Content — ни на Protocol, ни на Simulation, ни на ASP.NET
Simulation → Content (каталог и раскладка, без файловых путей хоста)
Server → Protocol, Simulation, Content
Client — своя сторона Protocol (TS) + HTTP
```
Клиент по-прежнему не ссылается на C#-проекты.
## Кто чем владеет
| Проект | Да | Нет |
| --- | --- | --- |
| **HSchool.Content** (новый) | Типы def, JSONC-загрузчик, наследование, патчи, слияние локалей, граф карты, валидация связности | Arch, часы, HTTP, потоки, пути `mods/` с диска хоста |
| **HSchool.Simulation** | `School`, `GameClock`, Arch `World`, тик, применение раскладки к миру | Kestrel, сокеты, `Directory.Enumerate`, сейв-файлы |
| **HSchool.Server** | Хост, супервизор, работник-поток, `mods/` и `saves/` из конфига, HTTP/WS, DTO запросов | Правила «комната должна быть связана», схема Chair |
| **HSchool.Protocol** | Кадры сокета, в том числе снимок карты и locale в Hello | Имена комнат, JSONC |
| **HSchool.Client** | DOM, `t()` для хрома, рисует снимок | Файлы модов, симуляция |
Content принимает уже открытые потоки или список документов (сервер прочитал папки и отдал
байты/пути через узкий порт вроде «вот корневые каталоги этих id»). Тогда тесты Content кормят
фикстурами из `tests/`, без `appsettings`.
Сейв: **форма** (часы + id модов + раскладка) собирается из типов Simulation/Content; **запись
файла** — Server, и только с потока работника.
## Зачем не сваливать в Simulation
Arch и фиксированный тик — про живую школу. Парсер JSONC, `defName` и проверка графа не знают,
что такое tick. Их гоняют сотни раз в юните без мира. Если загрузчик сидит в Simulation, любой
тест каталога тащит ECS и наоборот.
## Зачем не сваливать в Server
Иначе связность карты и last-wins нельзя проверить без Aspire. Хост должен быть тонким:
найти папки, сериализовать HTTP, крутить потоки.
## Тесты
- `tests/HSchool.Content.Tests` — фикстуры JSONC, коллизии имён, дырявый граф, двор обязателен.
- `HSchool.Simulation.Tests` — часы, тик, «школа с таким каталогом живёт».
- `HSchool.AppHost.Tests` — create с картой, рестарт, сейв на диске.
Ориентир в `AGENTS.md` обновить в фазе, которая заводит проект (сейчас это фаза 3).