Complete phase 47 romance pack on generic orientation and affinity hooks.

Vanilla catalogs stay without crushes; a content pack ships the overlay so later mods can reuse it.
This commit is contained in:
Leonid Pershin
2026-08-20 10:42:42 +03:00
parent cb869e4977
commit d2911c3daf
43 changed files with 1840 additions and 29 deletions
+7
View File
@@ -237,6 +237,13 @@ mods/
localizations/
ru.jsonc
en.jsonc
romance/ # контентный пак: ориентация, симпатия, пары 18+, темы
defs/orientations/
defs/affinity/
defs/traits/
defs/topics/
patches/
localizations/
```
Порядок загрузки: сначала `core`, потом выбранные моды в том порядке, в каком они стоят в
+15 -15
View File
@@ -13,27 +13,27 @@
## Задачи
- [ ] `mods/romance/`: `pack.jsonc` `requires: ["core"]`, локали, ориентация как данные,
- [x] `mods/romance/`: `pack.jsonc` `requires: ["core"]`, локали, ориентация как данные,
черты влюбчивый/ревнивый полями, патч тем и при необходимости `Chat`
- [ ] Без пака в create ориентации и романтических состояний нет; ванильный каталог без
- [x] Без пака в create ориентации и романтических состояний нет; ванильный каталог без
романтических тем
- [ ] Симпатия учеников: ±2 года или соседняя параллель
- [ ] Симпатия ученик → учитель можно, видна на обеих карточках; учитель → ученик никогда;
- [x] Симпатия учеников: ±2 года или соседняя параллель
- [x] Симпатия ученик → учитель можно, видна на обеих карточках; учитель → ученик никогда;
осадить — разговор; пары сотрудник↔ученик нет
- [ ] Пара: оба 18+, взаимно, одна; разрыв — событие, новая не раньше следующего дня
- [ ] Сотрудники между собой — симпатия и пара можно
- [ ] Никаких сексуальных действий и текстов. Детская линия — дразнилки и ярлык
- [ ] Тесты хоста: школа с паком и без; запрет учительской взаимности
- [ ] `example` не трогать
- [x] Пара: оба 18+, взаимно, одна; разрыв — событие, новая не раньше следующего дня
- [x] Сотрудники между собой — симпатия и пара можно
- [x] Никаких сексуальных действий и текстов. Детская линия — дразнилки и ярлык
- [x] Тесты хоста: школа с паком и без; запрет учительской взаимности
- [x] `example` не трогать
## Тесты, без которых фаза не закрыта
- [ ] `GET /api/catalog` без `romance` не отдаёт романтические темы
- [ ] Create с паком пишет ориентацию; без пака поля нет
- [ ] Двое 16-летних не получают статус пары при любом мнении
- [ ] Учитель не получает романтическое состояние на ученика
- [ ] Первоклассник не получает симпатию к одиннадцатому (возраст)
- [ ] Школа с `example` и без `romance` ведёт себя как ваниль в части тем
- [x] `GET /api/catalog` без `romance` не отдаёт романтические темы
- [x] Create с паком пишет ориентацию; без пака поля нет
- [x] Двое 16-летних не получают статус пары при любом мнении
- [x] Учитель не получает романтическое состояние на ученика
- [x] Первоклассник не получает симпатию к одиннадцатому (возраст)
- [x] Школа с `example` и без `romance` ведёт себя как ваниль в части тем
## Критерий готовности
+12 -2
View File
@@ -119,7 +119,9 @@ still a pack: the id stands in for the name, `version` is empty, `requires` is e
```
The repo also ships `example` next to `core` — a sample pack, not required. It appears in this
list with `required: false` and `requires: ["core"]`. Vanilla create omits it.
list with `required: false` and `requires: ["core"]`. Vanilla create omits it. `romance` is a
content pack on the same list; a school created without it has no orientations and no romantic
topics.
### `GET /api/catalog?lang=ru|en&mods=addon1,addon2`
@@ -159,6 +161,11 @@ academic year; a range whose start is after its end wraps across 1 January.
The assignment form in a later phase reads subjects; the timetable grid reads the day frame.
The create editor does not.
`topics` is the list of placeable conversation subjects (`defName`, label, `tags`). Vanilla
ships study/games/food/family/sport/gossip/rude/appearance. A content pack may add more — the
`romance` pack adds crush/couple/tease topics and a `romance` tag; they are absent from a
catalog requested without that pack. HTTP JSON is additive — no protocol version bump.
`lang` is the same value Hello carries — not `Accept-Language`. Anything other than `en` is
Russian.
@@ -328,7 +335,10 @@ not happen on this request.
`connections` is the **Связи** tab: family links with `opinion` / `opinionLabel` from catalog bands,
plus `friends`, `enemies` and `others` (every non-family non-zero pair for this person only).
The client does not compute thresholds. There is no school-wide opinions endpoint.
When a school was created with a pack that ships orientations, the card also carries
`orientation` (`defName` + label) and `connections.crushes` / `admirers` / `pair`. Without that
pack those fields are null or empty — the client hides the sympathy column. The client does not
compute thresholds. There is no school-wide opinions endpoint.
```json
{