Remove off-queue.md and add new design documentation files including README.md, defs.md, near-term.md, projects.md, runtime.md, people.md, staffing.md, and schedule.md to outline the structure and agreements for the game's design phases.

This commit is contained in:
Leonid Pershin
2026-08-20 12:26:13 +03:00
parent 12cc36b4dd
commit a37a5eb82d
101 changed files with 1015 additions and 921 deletions
+302
View File
@@ -0,0 +1,302 @@
# Общение, отношения и романтический пак
Договорённость на срез после сессии/темпа, не текущий код.
Люди: [`people.md`](../02-people/people.md). ИИ: [`ai.md`](../05-ai/ai.md). Одежда (уместность как образец):
[`inventory.md`](../07-inventory/inventory.md). Моды: [`defs.md`](../01-shell/defs.md), [`foundation.md`](../06-foundation/foundation.md).
У человека появляется, **с кем** он говорит и **что** о нём думают другие. Нужда «общение» уже
есть, действие `Chat` уже есть — но это соло в коридоре. Срез делает разговор кружком, тему —
дефом, мнение — числом, вражду — ссорой и редкой дракой. Игрок это **смотрит**. Романтика не
ваниль: отдельный пак, который ещё и проверяет, что контентный мод на живой дороге работает.
Срез отвечает на вопросы «кто кому друг», «о чём болтают» и «что меняет пак». Настроения-нужды,
приказов директора и секса нет.
## Что меняется в уже принятом
| Было | Стало | Почему |
| --- | --- | --- |
| `Chat` — один человек стоит в коридоре | Кружок 2–4 в одном узле, одна тема | Иначе общение не общение |
| Семья на карточке — только родство | Плюс число мнения; вкладка «Связи» | Родители по умолчанию не ноль |
| Конфликтов нет (`ai.md`) | Ссора и редкая драка без травм | Вражда должна быть видна, не только −40 в JSON |
| `example` — единственный не-core пак | Рядом контентный `romance` | Скучный образец не доказывает темы, ориентацию и патч `Chat` |
| Присутствие: id, узел, идёт/стоит | Плюс кружок (id участников + тема) | «Говорит с Машей о футболе» в локации |
| «Правила» — только одежда | Плюс политика речи | Уместность тем — тот же жест, что дресс-код |
## Этап A — мнения и темы
### Мнение
У упорядоченной пары `(A → B)` одно число **−100…100**. Несимметрично: A может любить B, B —
терпеть A. Ноль не храним. Пороги и подписи — в `BehaviorDef`, не в UI:
знакомые / приятели / друзья / близкие друзья на плюсе; натянуто / неприязнь / враги на минусе.
Семья даёт **стартовое** смещение при генерации (числа тоже в данных):
| Связь | Типичный старт |
| --- | --- |
| Родитель → ребёнок и обратно | сильно плюс |
| Братья и сёстры | плюс слабее |
| Партнёры в семье (уже есть на карточке) | плюс, не обязательно потолок |
Дальше число живёт: разговоры, дом, ссоры. Родство не переписывается.
**Дрейф.** Раз в рабочее утро (и skip ночи) каждое ненулевое мнение чуть сдвигается к своему
базису: семейная связь — к стартовому семейному числу, остальные — к нулю. Без этого дружба
первой недели вечная. Скорость — в `BehaviorDef`. Ноль снова не храним: дошли до базиса-нуля —
запись выкидываем.
Хранение — **на человеке**, разреженно, в `people.json`. Писать при содержательном сдвиге
(разговор кончился, драка, утреннее семейное, утренний дрейф), не каждый тик. Тот же шов, что у
одежды.
### Темы
Новый вид `TopicDef`: id, теги уместности, возраст, роли, можно ли на уроке (шёпот), какой
язык помогает (опционально), какой навык качается каплей сверх Communication.
Ванильные теги, не витрина:
- учёба, игры, еда, семья, спорт, сплетни, грубое, внешность.
Тема «внешность / форма» стыкует срез 7: исход смотрит уместность надетого (фаза 35). Не по
форме — насмешка или неловкость; по форме / ярко в свободной школе — комплимент. Нет ещё
уместности на карточке — тема живёт, модификатор ноль.
Уместность — **оценка**, как одежда: систему саму не заставит взять грубое на линейке с
директором; взяли — мнение может упасть, учитель может оборвать.
### Политика речи
Вкладка «Правила», рядом с одеждой. Два комбобокса (ученики / сотрудники), не четыре как форма
и цвет:
| Кого | Речь |
| --- | --- |
| Ученики | свободно / без грубого / только учёба |
| Сотрудники | свободно / без грубого / только учёба |
«Применить» — **с завтра**, как дресс-код. Сегодняшние кружки доигрывают тему.
### Вкладка карточки
Пятая: **Связи**. Семья с числами, топ друзей и врагов, поиск по ненулевым (иначе тихая вражда
не видна). Игрок ничего не назначает. Без романтического пака колонки симпатий нет.
## Этап B — разговоры
### Кружок
В одном узле собирается **24** человека, одна тема на всех. Пятый начинает соседний кружок,
не влезает в этот.
Кого зовут: сначала друзья и одноклассники в узле, потом остальные. Врагов сами не зовут —
столкновение может уйти в ссору. Тихоня реже инициатор, лидер чаще. Веса — поля на `TraitDef`
и `BehaviorDef`, не фамилии в коде.
`Chat` перестаёт быть соло: действие занимает людей кружка. Совместимость ролей как сейчас
(ученик и сотрудник могут говорить — учитель после урока, вопрос в коридоре).
Где: перемена, двор, обед, раздевалка, коридор. **Учительская** — отдельное действие
`StaffChat` (`room: TeachersRoom`, только сотрудники): взрослые не обязаны болтать в коридоре
с детьми, чтобы восполнить общение. На уроке — только **шёпот** (тема с тегом «можно шептать»).
Шёпот восполняет общение слабее, **режет рост навыка урока** у участников.
**Вместе.** На перемене и в обед друзья тянутся в узел, где уже стоят свои, а не в случайный
коридор. Враги не садятся в один кружок (уже) и не выбирают тот же обеденный узел, если есть
другой. Это веса цели «досуг», не новая ходьба парой и не состояние присутствия: на карте
видно кучку в одном узле.
**Телефон.** У кого в сумке или в руках есть телефон (срез 7), на перемене может быть **парный**
чат слабее живого кружка: оба с телефоном, тема из того же каталога, общение восполняется
меньше. Без телефона действия нет. На уроке телефоном не сидят — это шёпот голосом, не экран.
### Язык и красноречие
Отдельного навыка «красноречие» нет: это `Communication`. Языки — как сейчас.
Общий язык: лучший общий навык среди участников выше порога из `BehaviorDef`. Нет общего —
кружок всё равно возможен (жесты), но сдвиг мнения почти нулевой и чаще отрицательный.
`Communication` чуть растёт от разговора (меньше, чем предмет за урок). Язык, на котором
говорили, чуть растёт, если он ещё не у потолка.
### Шёпот
Если учитель **в том же кабинете**, шанс оборвать — из `BehaviorDef`, черты тише/громче
сдвигают. Не каждый шёпот ловят. Учитель, поймавший, начинает разговор-выговор (тот же
механизм кружка, тема «дисциплина»).
После урока учитель может сам взять 2–4 учеников (вопрос по предмету, похвала, выговор) —
обязанность с весом, не приказ игрока. Сдвиг мнения ученика об учителе слегка масштабируется
**педагогикой** учителя: сильный педагог после похвалы плюсует больше, слабый выговор злит
сильнее. Оценок по-прежнему нет.
Шёпот на уроке — действие `Whisper` в кабинете (`Classroom`); обычный `Chat` на уроке не
стартует. Доля роста навыка, шанс оборвать и веса разговора после звонка — поля `BehaviorDef`.
### Дом
Родители на карту не приходят. **Одно** семейное событие на человека за рабочее утро; skip
ночи его применяет, как утреннюю одежду. Тема из семейного набора, сдвиг небольшой.
Тем же утренним проходом — дрейф всех мнений к базису. Настроения-нужды нет.
### Черты в `core`
Уже крутят разговор: задира, тихоня, лидер, добрый, вспыльчивый. Добавляются две:
- **сплетник** — чаще берёт темы «сплетни», сильнее двигает мнение;
- **общительный** — чаще инициатор, выше шанс большого кружка.
Поля на `TraitDef` (вес инициативы, сдвиг к тегам тем), не списки id в коде.
## Этап C — ссора и драка
Отдельные действия, не только −N к мнению.
**Ссора** — на перемене, двое (иногда трое из распавшегося кружка), общение восполняется
криком, мнения падают сильнее обычного грубого разговора.
**Задира** не бросает кубик по школе каждый день: на человеке память жертвы (id), пока та в
ростере. Смена цели — если жертва выпустилась, ушла или мнение уже на полу. Поля на черте, не
`if (defName == "Bully")` в коде сверх проверки поля.
**Заступничество.** Третий в том же узле с высоким плюсом к жертве может встать в ссору на её
стороне. Мнение к задире падает, к жертве растёт; кружок ссоры становится тройкой.
**Извиниться** — отдельное действие после ссоры или выговора, пока оба в одном узле. Возвращает
часть (не всё) потерянного мнения. Задира извиняется реже (поле черты). Без этого единственный
путь вверх — «ещё поболтать» и утренний дрейф к нулю.
**Драка** — редко, двор или физкультура. Короткая. Травм, медкабинета и вызова родителей нет.
Мнения резко падают, оба в логе. Дежурный учитель или физрук в узле **обрывает** и делает
выговор. Никого в кабинете директора насильно нет: игрока нет в приказе, отдельной очереди
«к директору» этот срез не заводит.
Нет сотрудника рядом — драка кончается по длительности действия, лог всё равно пишется.
## Этап D — что видит игрок
Игрок **наблюдает**. Не мирит, не рассаживает, не запрещает дружить.
- **Локация** — «говорит с Машей о футболе»: кадр присутствия несёт id участников и id темы,
клиент собирает строку через справочник имён и локаль темы. Имена по-прежнему не строкой в
сокете. Раскладка присутствия меняется, **версия протокола +1**.
- **Сейчас** на карточке — то же плюс история за сегодня (уже есть лог).
- **Связи** — числа и подписи.
- **Правила** — политика речи, с завтра.
Список людей мнения не несёт.
## Этап E — пак `romance`
Первый **контентный** мод. `example` не раздуваем: он образец папки. `romance` выбирается в
create, `requires: ["core"]`, патчит `Chat`/темы (романтические темы появляются только с паком).
Без пака генератор не пишет ориентацию и романтические состояния. Живой школе мод не добавить —
как все паки сейчас.
### Ориентация
Поле на человеке, только если пак в школе. Значения — данные пака (гетеро / би / гомо и веса
генератора), не черта «ради галочки» и не хардкод. Пак без поля ориентации романтику не крутит.
### Симпатия и пара
Симпатия — односторонний ярлык поверх мнения (порог из данных пака). «Тили-тили тесто» —
подпись и лог, не свидание.
| Кто | Симпатия | Пара / свидание |
| --- | --- | --- |
| Ученик ↔ ученик близкого возраста | да | только если **обоим 18+** |
| Ученик → учитель | да, класс может дразнить; на карточке учителя видно | нет |
| Учитель → ученик | **нет**, взаимности нет, осаживает разговором | нет |
| Сотрудник ↔ сотрудник | да | да, оба взрослые |
| Сотрудник ↔ ученик как пара | нет | нет |
Близкий возраст учеников: **±2 года или соседняя параллель**. К учителю — исключение из этого
фильтра (иначе взрослый никогда не попадает).
Пара: только **взаимная**, только **одна**. Разрыв — событие (разговор или мнение ниже порога):
мнение падает, симпатия может остаться. Новая пара не раньше следующего дня. Неразделённая
симпатия живёт сколько угодно. Измену как механику не делаем: вторая симпатия просто висит.
Никакого сексуального контента, портретов «для романтики» и действий кроме разговора / ссоры /
уже существующих перемещений. Детская линия — дразнилки и ярлык симпатии.
Пак может добавить черты вроде «влюбчивый», «ревнивый» теми же полями `TraitDef`.
## Поток данных
Мнения и кружок — состояние мира, считает `HSchool.Ai` (выбор темы, состав, исход), пишет
симуляция. Карточка — HTTP через мейлбокс. Присутствие — сокет. Политика речи — снимок школы,
как будущий дресс-код.
Детерминизм: свой поток на человека, обход по id, тема из сида кружка. Тот же сид и те же
паки — те же первые дружбы на той же неделе (золотой отпечаток мнений — в фазе, которая
начинает писать ненулевые пары сверх семьи).
## Где живёт код
Нового проекта нет.
| Что | Куда |
| --- | --- |
| `TopicDef`, теги, поля черт, политика речи | `HSchool.Content` + JSONC |
| Стартовые мнения семьи, ориентация при паке | `HSchool.People` |
| Кружок, шёпот, ссора, драка, дом-утро | `HSchool.Ai` + адаптер в `HSchool.Simulation` |
| Кадр присутствия | `HSchool.Protocol` + `protocol.ts` + `docs/protocol.md` |
| Вкладка, правила, лог | `HSchool.Server` + клиент |
| Пак | `mods/romance/` рядом с `core` и `example` |
## Советы, которые стоит принять сразу
- Не заводить нужду «настроение»: мнение + общение уже две шкалы.
- Не класть имена в кадр присутствия — только id, как с людьми сейчас.
- Не лечить драку травмой: медкабинет тогда обязан стать больницей.
- Не делать «ходить вместе» отдельным состоянием присутствия: достаточно одного узла.
- `ActionDef` по-прежнему одна комната: учительская и телефон — отдельные действия, не массив комнат.
- Не вшивать романтику в `core`: ванильная школа должна собираться без пака.
- Не расширять `example`. Контент — другой пак.
- Не делать учительскую взаимность «опцией мода»: пак проверяет запрет тестом.
## Заведомо не сейчас
- Настроение как нужда, приказы, вызов родителей, рассадка класса.
- Секс, поцелуи как действие, свидания вне карты, ревность-сюжет.
- Пара учителя и ученика, даже 18+.
- Травмы, дневник дисциплины как журнал оценок.
- Смена модов у живой школы.
- Общая лента событий школы — по-прежнему лог человека.
## Зафиксировано этим разговором
| Тема | Решение |
| --- | --- |
| Мнение | −100…100, несимметрично, подписи по порогам, семья — старт |
| Дрейф | Каждое рабочее утро к семейному базису или к нулю; skip применяет |
| Хранение | Разреженно на человеке, писать при сдвиге |
| Темы | `TopicDef` + теги включая внешность; оценка, не запрет |
| Политика речи | Ученики/сотрудники: свободно / без грубого / только учёба; с завтра |
| Кружок | Сразу 2–4; пятый — другой кружок |
| Кого зовут | Друзья и класс в узле, врагов не зовут |
| Вместе | Друзья на перемене/обеде тянутся в один узел |
| Где | Перемена, двор, обед, после урока, учительская; на уроке — шёпот |
| Телефон | Парный чат на перемене, оба с телефоном, слабее живого |
| Шёпот | Режет урок; учитель в кабинете — шанс оборвать |
| Язык | Нет общего — слабый разговор, не отказ |
| Красноречие | `Communication`; растёт от разговора |
| Педагогика | Масштабирует мнение ученика об учителе после разговора |
| Игрок | Только смотрит |
| Экран | Вкладка «Связи»; локация из id в присутствии; протокол +1 |
| Ссора / драка | Действия; жертва задиры помнится; заступник; извинение; без травм |
| Дом | Одно семейное событие на рабочее утро; skip применяет |
| Настроение | Нет |
| Черты core | + сплетник, общительный |
| Романтика | Пак `romance`, патчит темы/`Chat` |
| Ориентация | Только с паком, поле и веса в данных |
| Симпатия учеников | Близкий возраст ±2 / соседняя параллель |
| Симпатия к учителю | Можно, видно, учитель осаждает, взаимности нет |
| Пара | Оба 18+, взаимно, одна; разрыв — событие; сотрудник↔ученик нет |
| Сотрудники | Симпатия и пара между собой — да |