303 lines
24 KiB
Markdown
303 lines
24 KiB
Markdown
# Общение, отношения и романтический пак
|
||
|
||
Договорённость на срез после сессии/темпа, не текущий код.
|
||
Люди: [`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 — разговоры
|
||
|
||
### Кружок
|
||
|
||
В одном узле собирается **2–4** человека, одна тема на всех. Пятый начинает соседний кружок,
|
||
не влезает в этот.
|
||
|
||
Кого зовут: сначала друзья и одноклассники в узле, потом остальные. Врагов сами не зовут —
|
||
столкновение может уйти в ссору. Тихоня реже инициатор, лидер чаще. Веса — поля на `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+, взаимно, одна; разрыв — событие; сотрудник↔ученик нет |
|
||
| Сотрудники | Симпатия и пара между собой — да |
|