- Introduced the `HSchool.Ai` project, responsible for routing, day plans, and presence management. - Updated the `HSchool.Simulation` project to integrate with the new AI functionalities, improving decision-making and presence tracking. - Added `travelMinutes` to room and territory definitions, ensuring accurate movement calculations within the simulation. - Enhanced the `School` class to manage presence and implement empty-time skipping functionality. - Updated documentation to reflect the new AI features and their impact on school simulation. - Added tests for presence management and routing to ensure robust functionality and reliability.
5.1 KiB
Нарезка проектов (целевая)
Сейчас в коде: Protocol ← Server → Simulation → Ai → People / Schedule → Content. Каталог не в Simulation (рядом с Arch)
и не в Server (рядом с Kestrel) — парсер JSONC и проверка графа не знают, что такое tick.
Зависимости
Protocol — ни на кого из игровых проектов (только байты)
Content — ни на Protocol, ни на Simulation, ни на ASP.NET
People → Content (defs, карта, склонения; без Arch и хоста)
Schedule → Content (раскладка уроков; без Arch и хоста)
Ai → Content, People, Schedule (маршруты и решения; без Arch и хоста)
Simulation → Ai, People, Content (ростер в World; без HTTP)
Server → Protocol, Simulation, People, Content
Client — своя сторона Protocol (TS) + HTTP
Клиент по-прежнему не ссылается на C#-проекты.
Кто чем владеет
| Проект | Да | Нет |
|---|---|---|
| HSchool.Content | Типы def, JSONC-загрузчик, наследование, патчи, слияние локалей, граф карты, валидация связности | Arch, часы, HTTP, потоки, пути mods/ с диска хоста |
| HSchool.People | Генерация ростера: семьи, классы, тело/навыки/черты из каталога и сида | Arch, ASP.NET, сокеты, DateTime.Now, файлы сейва |
| HSchool.Schedule | Раскладка учебного плана в таблицу уроков вокруг закреплённых правок | Arch, ASP.NET, сокеты, DateTime.Now, файлы сейва |
| HSchool.Ai | Маршруты по графу карты, план дня человека, выбор цели и действия, продвижение плана во времени | Arch, ASP.NET, сокеты, DateTime.Now, файлы сейва |
| HSchool.Simulation | School, GameClock, Arch World, тик, применение раскладки к миру, адаптер к Ai |
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, коллизии имён, дырявый граф, двор обязателен.tests/HSchool.People.Tests— тот же сид даёт тот же ростер; места и должности заполнены.tests/HSchool.Schedule.Tests— тот же штат и карта дают ту же таблицу; четыре запрета.tests/HSchool.Ai.Tests— путь между комнатами и его цена; те же входы дают то же решение.HSchool.Simulation.Tests— часы, тик, «школа с таким каталогом живёт».HSchool.AppHost.Tests— create с картой, рестарт, сейв на диске.
Ориентир в AGENTS.md обновить в фазе, которая заводит проект (сейчас это фаза 3).