192 lines
15 KiB
Markdown
192 lines
15 KiB
Markdown
# Кабинет директора и классный
|
||
|
||
Договорённость на срез после событий и общения, не текущий код.
|
||
Люди: [`people.md`](../02-people/people.md). Штат: [`staffing.md`](../03-staffing/staffing.md).
|
||
ИИ: [`ai.md`](../05-ai/ai.md). Общение: [`social.md`](../09-social/social.md).
|
||
События: [`events.md`](../11-events/events.md). Урок: [`lesson-consequences.md`](../off-queue/lesson-consequences.md).
|
||
|
||
У школы появляется **власть на карте**: проступок помнится коротко, ученика **сами** гонят к
|
||
директору — с очередью у кабинета и ожиданием в коридоре. У класса появляется **классный**
|
||
(учитель из Управления); он редко оставляет класс после уроков на родительское собрание, и
|
||
родители **реально входят** на карту.
|
||
|
||
Игрок **назначает классных** и **смотрит**. Кнопки «вызвать к директору» и «назначить собрание»
|
||
нет: авто и ИИ классного.
|
||
|
||
### Роль игрока: менеджер / симулятор бога
|
||
|
||
Экран школы — **менеджер**, не контроллер юнитов. Игрок задаёт рамку (штат, расписание,
|
||
правила, классные) и смотрит, как мир сам ходит, ссорится и вызывается к директору. Приказов
|
||
«этому ученику — сюда» нет и в соседних срезах учёбы и здоровья не появляется.
|
||
|
||
## Что увидит игрок
|
||
|
||
- В **Управлении** — у каждого класса слот «классный»: только из нанятых учителей; снять /
|
||
переназначить.
|
||
- На карточке ученика — **небольшой список** недавних проступков (несколько последних), не
|
||
шкала дисциплины и не журнал оценок.
|
||
- После драки / выговора система может отправить ученика к директору: он идёт, если кабинет
|
||
занят — **ждёт в коридоре** у входа, внутри — **очередь по одному**.
|
||
- Редко после последнего урока класса: классный и часть родителей в кабинете класса; тост, что
|
||
собрание идёт.
|
||
|
||
## На какие вопросы отвечает
|
||
|
||
- Как приказ «к директору» живёт в том же ИИ, что урок (сильная обязанность), без телепорта.
|
||
- Как очередь у `PrincipalsOffice` не ломает присутствие и детерминизм.
|
||
- Кто такой классный без нового `PositionDef`.
|
||
- Как родитель впервые получает узел на карте и уходит после собрания.
|
||
- Что видит игрок без кнопки вмешательства.
|
||
|
||
## Чего нет
|
||
|
||
- Кнопки игрока «вызвать» / «на собрание».
|
||
- Шкалы дисциплины 0…100 и дневника оценок.
|
||
- Травм, медкабинета как больницы, выговора в отдельной вкладке «Правила».
|
||
- Еженедельного календаря собраний и явки 100%.
|
||
- Завуча как отдельной роли в этом срезе.
|
||
- Оценок и приказов «отправить домой».
|
||
|
||
## Что меняется в уже принятом
|
||
|
||
| Было | Стало | Почему |
|
||
| --- | --- | --- |
|
||
| Игрок только наблюдает; приказов нет ([`ai.md`](../05-ai/ai.md)) | Наблюдает вызовы; **назначает** классного | Классный — единственное решение игрока в срезе |
|
||
| Драка → выговор на месте; кабинет директора не заводим ([`social.md`](../09-social/social.md)) | Часть проступков → авто-вызов, очередь | Иначе выговор пустой |
|
||
| Родители без места на карте ([`people.md`](../02-people/people.md)) | На собрании получают узел и цель | Задел с ростера наконец используется |
|
||
| `SchoolClass` — id, год, литера, кабинет, ученики | Плюс `classTeacherId` (учитель или пусто) | Не должность, слот на классе |
|
||
| `EventDef`: утро, звонок, сбой генерации | Плюс вызов / собрание (info) | Игрок видит факт, не только строку в локации |
|
||
| «Родителя вызвать — отдельный сюжет» | Собрание классного; **не** вызов одного родителя к директору | Узкий scope |
|
||
|
||
## Этап A — классный
|
||
|
||
У `SchoolClass` опциональный id учителя. Назначить / снять — HTTP через мейлбокс школы (как
|
||
предметы), только хозяин. Кандидаты: нанятые с должностью `Teacher`. Один учитель — классный у
|
||
нескольких классов (ваниль не запрещает). Пустой слот: собраний нет, класс живёт как сейчас.
|
||
|
||
Карточка класса / строка в Управлении показывает имя. Сейв — в `people.json` / ростере рядом с
|
||
классами.
|
||
|
||
После этапа школа целая: классных можно расставить, вызовов ещё нет.
|
||
|
||
## Этап B — проступки и кабинет
|
||
|
||
### Память
|
||
|
||
На человеке **короткий список** недавних проступков (ваниль: несколько последних, потолок в
|
||
`BehaviorDef`, старые вытесняются). Запись: вид (ссора / драка / выговор / …), когда (игровые
|
||
часы или день+слот), опционально id второго участника. Не шкала. Писать при содержательном
|
||
событии (тот же шов, что мнения), не каждый тик.
|
||
|
||
Карточка ученика (вкладка «Сейчас» или рядом) показывает список. HTTP через мейлбокс.
|
||
|
||
### Вызов — только авто
|
||
|
||
Игрок не жмёт. Триггер из уже живых фактов: обрыв драки сотрудником, выговор учителя, при
|
||
необходимости грубый срыв с политикой речи — веса и пороги в `BehaviorDef`, не `if` по фамилии.
|
||
|
||
Состояние «вызван» — **временное** (флаг / обязанность), пока не дошёл, не отбыл приём и не
|
||
Sorвался день. Без долгой шкалы «дисциплина».
|
||
|
||
### Путь и очередь
|
||
|
||
Кабинет — `PrincipalsOffice` (уже в `core`). Вызванный идёт обычной ходьбой.
|
||
|
||
- Директор занят приёмом или отсутствует → очередь: ждут в **коридоре** у связанного узла (ребро
|
||
карты к кабинету), не толпятся внутри.
|
||
- В кабинете — **один** на приём. Очередь FIFO по id вызова (детерминизм: стабильный порядок).
|
||
- Приём — короткое действие (выговор / разговор), мнение о директоре падает, проступок может
|
||
дописаться; затем ученик свободен (обязанность урока снова тянет).
|
||
- Skip пустого времени не оставляет вечный «вызван» без разрешения: утро сбрасывает зависшее
|
||
или доигрывает по правилу в фазе.
|
||
|
||
Директор без найма: вызов не стартует (или гаснет) — порог в данных, не паника.
|
||
|
||
Тост info: кого вызвали (через `EventDef`). Протокол присутствия: действие / узел достаточно;
|
||
отдельное поле «очередь» в кадре — только если без него UI врёт. Версию сокета бампит **коммит
|
||
фазы**, не этот документ.
|
||
|
||
После этапа школа целая без собраний: драки гонят к директору, очередь видна в коридоре.
|
||
|
||
## Этап C — родительские собрания
|
||
|
||
Только **ИИ классного**, редко. Условия (числа в `BehaviorDef`):
|
||
|
||
- у класса есть классный;
|
||
- рабочий день, после **последнего** урока этого класса;
|
||
- классный сегодня в школе;
|
||
- бросок редкости от сида класса и дня.
|
||
|
||
Классный остаётся в кабинете класса (homeroom). Часть родителей учеников класса приходит:
|
||
получают место (двор → путь → кабинет), как обычная ходьба. Не 100% семей — доля и «кто» из
|
||
сида. Учитель-родитель этого класса, если уже в школе, может войти в собрание без второго
|
||
человека.
|
||
|
||
Собрание — действие/кружок ограниченной длины; мнения семья↔классный слегка двигаются; тост
|
||
info. После — родители уходят с карты (снова «вне школы»), классный свободен.
|
||
|
||
Игрок собрание не назначает и не отменяет.
|
||
|
||
После этапа школа целая целиком по срезу.
|
||
|
||
## Поток данных
|
||
|
||
| Что | Где |
|
||
| --- | --- |
|
||
| `classTeacherId` | ростер / сейв; HTTP Управление |
|
||
| Список проступков | на человеке; сейв; карточка HTTP |
|
||
| Очередь вызовов | состояние школы на потоке воркера; не клиент |
|
||
| Выбор «вызвать» / «собрание» | `HSchool.Ai` + адаптер симуляции |
|
||
| Ходьба родителей | те же узлы и `travelMinutes`, что у всех |
|
||
| Тосты | `EventDef` + доска уведомлений среза 11 |
|
||
| Назначение классного | намерение HTTP → мейлбокс (инвариант 3, 7) |
|
||
|
||
Инвариант 1: клиент не решает, кого вызвать. Инвариант 4: симуляция не знает тосты и ASP.NET.
|
||
|
||
## Где живёт код
|
||
|
||
Нового проекта нет.
|
||
|
||
| Что | Куда |
|
||
| --- | --- |
|
||
| Поля `BehaviorDef`, триггеры, потолки списка | `HSchool.Content` + JSONC `core` |
|
||
| `SchoolClass` + классный | `HSchool.People` + сейв |
|
||
| Обязанность вызова, очередь, собрание | `HSchool.Ai` + адаптер в `HSchool.Simulation` |
|
||
| HTTP назначение, карточка проступков | `HSchool.Server` + клиент Управление / карточка |
|
||
| `EventDef` вызова и собрания | `core` + шов среза 11 |
|
||
| Присутствие | уже есть; бамп протокола только если нужен новый статус |
|
||
|
||
## Советы, которые стоит принять сразу
|
||
|
||
- Не заводить `PositionDef` «классный» — слот на классе, как предметы у учителя.
|
||
- Не телепортировать к директору и не пихать очередь внутрь кабинета.
|
||
- Не давать игроку кнопку вызова: согласие на «только авто».
|
||
- Не шкалу дисциплины рядом со списком — два представления одной идеи путают.
|
||
- Родитель на карте только на время собрания (этот срез), не «живёт в школе».
|
||
- Очередь и вызовы считает поток школы; HTTP их не трогает.
|
||
- Редкость собраний — данные, не магическая константа в UI.
|
||
|
||
## Заведомо не сейчас
|
||
|
||
- Кнопка «вызвать к директору» / «назначить собрание».
|
||
- Оценки и журнал — [`grades.md`](../13-grades/grades.md); болезни — [`health.md`](../14-health/health.md).
|
||
- Вызов одного родителя, травмы драки — [`fallout.md`](../15-fallout/fallout.md).
|
||
- Завуч, рассадка, настроение-нужда.
|
||
- Календарь собраний на четверть.
|
||
|
||
## Зафиксировано этим разговором
|
||
|
||
| Тема | Решение |
|
||
| --- | --- |
|
||
| Форма | Именованный срез 12, не off-queue |
|
||
| Вызов | Только авто; игрок не жмёт |
|
||
| Поведение | Временный «вызван» + короткий список недавних проступков |
|
||
| Классный | Только из учителей; Управление |
|
||
| Собрание | Только ИИ классного, редко, после последнего урока класса |
|
||
| Родители / вызов | Реально ходят по карте; у директора очередь, ждут в коридоре |
|
||
| Ваниль | `core`, не отдельный пак |
|
||
| Стоп | После A — классные; после B — кабинет без собраний |
|
||
| Протокол | Бамп только если фазе нужен новый статус присутствия |
|
||
| Оценки / шкала дисциплины | Не в срезе |
|
||
| Роль игрока | Менеджер / симулятор бога: рамка школы, не приказы юнитам |
|