diff --git a/AGENTS.md b/AGENTS.md index c433cb4..28bec94 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -29,6 +29,7 @@ way; this file is *how to work in them*. | notices, toasts, scene prompt contributions, Krea-only catalog | [`docs/design/11-events/`](docs/design/11-events/events.md) — slice 11, phases 63–67 | | class teachers, director summons queue, parent meetings | [`docs/design/12-office/`](docs/design/12-office/office.md) — slice 12, phases 68–72 | | marks 2–5, attendance journal | [`docs/design/13-grades/`](docs/design/13-grades/grades.md) — slice 13, phases 73–76 | +| health conditions, diseases, contagion, nurse | [`docs/design/14-health/`](docs/design/14-health/health.md) — slice 14, phases 77–80 | | a bug in already-shipped behaviour | `.claude/skills/bug-work` — document in `docs/bugs/`, discuss only if the fix has a fork, then patch | | a task that is not in any slice | `.claude/skills/side-work` — discuss, document in [`docs/phases/off-queue/`](docs/phases/off-queue/README.md), then implement | | a new named slice of the game | `.claude/skills/slice-work` — discuss, write design and phases, then `/phase-orch` | diff --git a/docs/design/14-health/health.md b/docs/design/14-health/health.md new file mode 100644 index 0000000..1d6fb4f --- /dev/null +++ b/docs/design/14-health/health.md @@ -0,0 +1,165 @@ +# Здоровье и болезни + +Договорённость на срез после журнала, не текущий код. +Одежда и климат: [`inventory.md`](../07-inventory/inventory.md). Урок: [`lesson-consequences.md`](../off-queue/lesson-consequences.md). +Журнал: [`grades.md`](../13-grades/grades.md). Кабинет: [`office.md`](../12-office/office.md). +Нужды и тело: [`people.md`](../02-people/people.md). Медкабинет в `core`: `MedicalOffice`, должность `Nurse`. + +У человека появляется **медицинское состояние** — не один флаг «болеет», а набор условий с +тяжестью, стадиями и эффектами (ориентир: hediff-слой RimWorld, но **сильнее упор на +реалистичные болезни**, инкубацию, иммунитет и заразность в школе). Медсестра и кабинет лечат. +Промокание и холод — векторы. Журнал 13 получает **уважительный** пропуск. + +## Роль игрока: менеджер / симулятор бога + +Как в [`office.md`](../12-office/office.md): нанять медсестру, держать медкабинет, смотреть вкладку +здоровья. Не «вылечи этого» кнопкой на карточке и не расстановка больных вручную. Люди сами идут +в медпункт или остаются дома по весам ИИ. + +## Что увидит игрок + +- На карточке — вкладка **здоровье**: активные состояния, тяжесть/стадия, кратко «что делает». +- Больные реже приходят / уходят к медсестре / сидят урок хуже (множители в данные). +- Заражение в классе и коридоре — видно по вспышке (тосты, несколько заболевших). +- В журнале (13) отсутствие по болезни не выглядит как прогул. + +## На какие вопросы отвечает + +- Как хранить несколько одновременных состояний с тяжестью, не смешивая с нуждами. +- Как устроены болезни: инкубация → симптомы → пик → иммунитет / хронизация (редко, данные). +- Как заразность работает в узле и в классе без глобальной магии. +- Как холод, дождь и промокание повышают шанс конкретных болезней. +- Как медсестра (`Medicine` / уход) снижает тяжесть и ускоряет выход. +- Как явка в срезе 13 различает прогул и болезнь. + +## Чего нет + +- Хирургии, ампутаций, установки органов, пулевых ран. +- Травм после драки (срез 9/12 сознательно без травм) — в этот срез не возвращаем. +- Настоящей больницы и госпитализации на недели вне школы. +- Игрока-врача с паузой и приказом «полечи». +- Полного анатомического дерева «каждый палец» как в бою RimWorld: для школы важнее + **системы органов / тракты** как мишени болезней (дыхание, ЖКТ, ЛОР…), не боевая медицина. + +## Что меняется в уже принятом + +| Было | Стало | Почему | +| --- | --- | --- | +| Нужды есть, болезней нет | Плюс слой состояний здоровья | Иначе «простуда от дождя» некуда класть | +| Медкабинет и Nurse — слот и должность | Уход и очередь к медсестре | Комната перестаёт быть декорацией | +| Явка в 13 — прогул/опоздание | Плюс причина «болезнь» | Связность с журналом | +| Тепло режет урок | Болезнь тоже режет и явку | Связность | +| Родители на собрании (12) | Могут болеть / не прийти | Тот же слой на всех ролях | + +## Модель (сильнее «просто sick») + +### Состояние + +На человеке список **условий** (`HealthCondition` / аналог hediff): + +- `defName` болезни или состояния; +- тяжесть 0…1 (или стадия из def); +- прогресс иммунитета / лечения; +- источник (зараз, холод, идиопатия); +- когда началось. + +Несколько условий сразу (простуда + живот) — норма. Нужды **не** заменяют болезни: болезнь +может усиливать спад тепла/голода или резать caps, но «голод» остаётся нуждой. + +### Def болезни + +`DiseaseDef` (имя уточнит фаза) в `core`: + +- семейство (респираторное, ЖКТ, …) — для реализма и иммунитета; +- инкубация, длительности стадий, кривая тяжести; +- симптомы → модификаторы нужд, `LessonLearning`, скорости ходьбы, шанс остаться дома; +- заразность: радиус (узел / класс), шанс контакта, носительство в инкубации — да/нет; +- векторы: холод ниже порога, дождь/снег на улице, промокание (если появится явное состояние + «мокрый» — иначе через тепло/погоду на приходе); +- ответ на уход: насколько `tend` медсестры и навык Medicine сдвигают иммунитет; +- после выздоровления — временный иммунитет к семейству / к def. + +Ваниль: несколько разных болезней (не одна «Болезнь»), например ОРВИ, грипп, гастро, ЛОР — +конкретный набор в фазе, все через данные. + +### Реалистичнее RimWorld-школы + +- Инкубация без симптомов, но уже можно заражать (по полю def). +- Разные кривые и сезоны/погода как множитель фона (климат школы). +- Тяжёлая стадия → с большей вероятностью **не приходит** (вне школы), уважительная явка. +- Лёгкая → приходит, учится хуже, чаще в медпункт. +- Рецидив / суперинфекция — только если поля на def разрешают; не обязательно в ванили v1. + +### Медпункт + +`MedicalOffice` + `Nurse`. Больной с достаточным дискомфортом получает цель «к медсестре». +Очередь в кабинете / ожидание у узла — тот же дух, что у директора (12), проще если надо. +Уход тикает тяжесть/иммунитет. Нет медсестры — болезни идут натурально, дольше и злее (данные). + +## Этап A — слой состояний + +Хранение, сейв, тик тяжести/стадий без заразности и без UI. Пустой список = здоров. + +После этапа школа целая: слой есть, ванильных вспышек может ещё не быть. + +## Этап B — ванильные болезни и векторы + +Несколько `DiseaseDef`, старт от холода/погоды/шанса. Эффекты на нужды и урок. Связь с +прогулом 13 (причина болезнь). + +## Этап C — заразность + +Контакт в узле и/или классе. Детерминизм от сида. Тост на вспышку (не на каждый чих). + +## Этап D — медсестра и экран + +Уход, очередь, вкладка здоровья на карточке. Связность: болезнь → явка → оценки; симптомы → +общение слабее / реже кружки (поле, не хардкод). + +После этапа срез 14 закрыт. + +## Поток данных + +Состояния — на человеке, тик на потоке школы. Решение «идти кNurse / остаться дома» — `HSchool.Ai`. +Карточка — HTTP. Тосты — EventDef. Журнал 13 читает причину отсутствия из состояния. + +## Где живёт код + +Нового проекта нет (отдельная сборка «Medicine» не заводим, пока слой не раздуется). + +| Что | Куда | +| --- | --- | +| `DiseaseDef` / стадии / векторы | `HSchool.Content` + JSONC | +| Тик, заражение, уход | `HSchool.Ai` + Simulation | +| Явка «болезнь» | стык с 13 | +| Вкладка, тосты | Server + Client + EventDef | + +## Советы, которые стоит принять сразу + +- Не смешивать болезнь с нуждой «здоровье» одной шкалой навсегда: нужды уже заняты; состояние — + список. +- Не тащить боевую анатомию RimWorld ради школы. +- Не лечить драку травмой в этом срезе. +- Заразность — данные на def, не один глобальный RNG на школу. +- Игрок не жмёт «вылечи». + +## Заведомо не сейчас + +- Хирургия, протезы, наркоз, кровь, шрамы-кампания. +- Больничный лист с зарплатой учителя. +- Пандемический UI и карантинные приказы игрока. +- Травмы драки, мокрый, aftereffect, явная дыра урока от больного учителя — + [`fallout.md`](../15-fallout/fallout.md). + +## Зафиксировано этим разговором + +| Тема | Решение | +| --- | --- | +| Оценки | Отдельный срез 13, шкала 2–5 | +| Заражение и разные болезни | В этом же срезе 14 | +| Weave | Отдельного среза нет; связность с журналом и уроком здесь | +| Медсостояние | Список условий с тяжестью (hediff-подобно), упор на болезни | +| Реализм | Инкубация, семейства, векторы погоды, иммунитет, уход | +| Приказы | Нет; менеджер / симулятор бога | +| Ваниль | `core` | +| Стоп | После A/B/C школа целая | diff --git a/docs/design/README.md b/docs/design/README.md index d78aaef..d652f6a 100644 --- a/docs/design/README.md +++ b/docs/design/README.md @@ -17,4 +17,5 @@ | 11. События и сцена | [11-events](11-events/events.md) | | 12. Кабинет и классный | [12-office](12-office/office.md) | | 13. Учёба и журнал | [13-grades](13-grades/grades.md) | +| 14. Здоровье и болезни | [14-health](14-health/health.md) | | Вне очереди | [off-queue](off-queue/) | diff --git a/docs/phases/14-health/77-health-conditions.md b/docs/phases/14-health/77-health-conditions.md new file mode 100644 index 0000000..023d48e --- /dev/null +++ b/docs/phases/14-health/77-health-conditions.md @@ -0,0 +1,35 @@ +# Фаза 77. Состояния здоровья + +## Зависимости + +- [Фаза 7](../02-people/07-people-in-school.md) +- [Фаза 20](../05-ai/20-needs-actions.md) + +## Зачем + +Место для болезней: список условий с тяжестью, не одна нужда «здоровье». + +## Задачи + +- [ ] На человеке список медицинских условий: def, тяжесть, прогресс, метаданные старта +- [ ] Тик тяжести/стадий на потоке школы; пустой список = здоров +- [ ] Сейв вместе с человеком +- [ ] Нужды не удалять и не подменять одним «HP» +- [ ] Пока можно без ванильных DiseaseDef-вспышек — инфраструктура и тест на искусственное условие +- [ ] Детерминизм тика от сида человека и дня + +## Тесты, без которых фаза не закрыта + +- [ ] Условие с кривой тяжести меняется одинаково при том же сиде +- [ ] Сейв восстанавливает список +- [ ] Два условия на одном человеке не затирают друг друга +- [ ] Нужда голода по-прежнему тикает отдельно + +## Критерий готовности + +- Dev/тест может повесить условие и увидеть сдвиг тяжести после тиков; reload сохраняет +- Отфильтрованные тесты по Testing policy проходят + +## Стоп + +Не заразность. Не UI вкладки. Не медсестра. Не ванильный набор ОРВИ (78). diff --git a/docs/phases/14-health/78-diseases.md b/docs/phases/14-health/78-diseases.md new file mode 100644 index 0000000..5c696f1 --- /dev/null +++ b/docs/phases/14-health/78-diseases.md @@ -0,0 +1,39 @@ +# Фаза 78. Болезни и векторы + +## Зависимости + +- [Фаза 77](77-health-conditions.md) +- [Фаза 32](../07-inventory/32-weather-warmth.md) +- [Фаза 74](../13-grades/74-attendance.md) + +## Зачем + +Разные болезни с инкубацией и эффектами; холод и погода как вход. + +## Задачи + +- [ ] `DiseaseDef` (или согласованное имя): семейство, стадии, инкубация, эффекты на нужды / + `LessonLearning` / шанс не прийти +- [ ] Ваниль **несколько** разных болезней в `core` (не один def «Болезнь») +- [ ] Векторы: холод ниже порога, дождь/снег — поля на def и BehaviorDef +- [ ] Отсутствие по болезни пишет причину для журнала 13 (уважительно) +- [ ] Временный иммунитет после выздоровления — поле на def +- [ ] Локали подписей болезней + +## Тесты, без которых фаза не закрыта + +- [ ] Два разных def дают разные кривые/эффекты при контрольном тике +- [ ] Холод повышает шанс респираторной ванили относительно контроля +- [ ] Больной с тяжёлой стадией чаще «вне школы» на учебный день +- [ ] Явка с причиной болезнь ≠ прогул в данных 13 +- [ ] Каталог без обязательных полей падает загрузкой, не молча + +## Критерий готовности + +- В холодный дождливый период кто-то из учеников заболевает ванильной болезнью; журнал не зовёт + это прогулом +- Отфильтрованные тесты по Testing policy проходят + +## Стоп + +Не заражение между людьми (79). Не UI вкладки (80). Не хирургия. diff --git a/docs/phases/14-health/79-contagion.md b/docs/phases/14-health/79-contagion.md new file mode 100644 index 0000000..bb4e452 --- /dev/null +++ b/docs/phases/14-health/79-contagion.md @@ -0,0 +1,34 @@ +# Фаза 79. Заразность + +## Зависимости + +- [Фаза 78](78-diseases.md) +- [Фаза 64](../11-events/64-event-defs.md) + +## Зачем + +Болезнь распространяется в школе, а не только от погоды. + +## Задачи + +- [ ] Поля заразности на `DiseaseDef`: узел и/или класс, шанс, носительство в инкубации +- [ ] Контакт считает поток школы; детерминизм от сида пары/узла/дня +- [ ] Не один глобальный `Random` на мир +- [ ] Info-тост на вспышку (порог числа новых случаев), не на каждый чих +- [ ] Иммунитет и уже болеющие не заражаются вопреки def + +## Тесты, без которых фаза не закрыта + +- [ ] Заразный и здоровый в одном узле → здоровый заболевает чаще, чем изолированный контроль +- [ ] Тот же сид → те же передачи в золотом сценарии +- [ ] Def без заразности не прыгает по классу +- [ ] Notice вспышки эмитится при пороге + +## Критерий готовности + +- Один больной в классе за несколько дней даёт цепочку заражений при заразном def +- Отфильтрованные тесты по Testing policy проходят + +## Стоп + +Не карантинные приказы игрока. Не пандемический UI. Не медсестра (80). diff --git a/docs/phases/14-health/80-nurse-health-ui.md b/docs/phases/14-health/80-nurse-health-ui.md new file mode 100644 index 0000000..5e9c089 --- /dev/null +++ b/docs/phases/14-health/80-nurse-health-ui.md @@ -0,0 +1,39 @@ +# Фаза 80. Медсестра и карточка здоровья + +## Зависимости + +- [Фаза 79](79-contagion.md) +- [Фаза 75](../13-grades/75-gradebook-ui.md) +- [Фаза 42](../09-social/42-talk-circles.md) + +## Зачем + +Уход в медкабинете и вкладка, плюс связность с журналом и общением. + +## Задачи + +- [ ] Больной с дискомфортом выше порога стремится в `MedicalOffice`; медсестра с `MedicalDuty` + снижает тяжесть / ускоряет иммунитет (навык Medicine) +- [ ] Нет медсестры — болезнь идёт натурально (хуже/дольше по данным) +- [ ] Очередь у медкабинета проще директора, но не телепорт +- [ ] Вкладка «Здоровье» на карточке: условия, стадия/тяжесть, краткий эффект +- [ ] Связность: симптомы режут вес кружка / общения (поле на def); явка-болезнь уже из 78 +- [ ] Игрок не жмёт «вылечи»; гость только смотрит +- [ ] Локали RU/EN + +## Тесты, без которых фаза не закрыта + +- [ ] С медсестрой в кабинете тяжесть падает быстрее контроля без неё +- [ ] Карточка показывает активные условия +- [ ] Нет API лечения от клиента +- [ ] Сильный симптом снижает шанс начать Chat относительно контроля +- [ ] Skip ночи не оставляет вечную очередь в медкабинете без разрешения + +## Критерий готовности + +- Больной идёт к медсестре, вкладка показывает болезнь, оценки/явка уважительны, общение слабее +- Отфильтрованные тесты по Testing policy проходят + +## Стоп + +Не хирургия. Не травмы драки. Не приказы карантина. Не отдельный срез weave. diff --git a/docs/phases/14-health/README.md b/docs/phases/14-health/README.md new file mode 100644 index 0000000..35a1af8 --- /dev/null +++ b/docs/phases/14-health/README.md @@ -0,0 +1,35 @@ +Индекс срезов: [`../README.md`](../README.md). + +## Срез 14. Здоровье и болезни + +Дизайн: [`health.md`](../../design/14-health/health.md). + +Медицинские состояния с тяжестью (hediff-подобно), разные болезни, заражение, медсестра. +Менеджер / симулятор бога: игрок не лечит кнопкой. Срез можно остановить после этапа A — +слой есть, даже если ванильных вспышек ещё нет. + +**Этап A — слой.** + +| Фаза | Статус | Зачем | +| --- | --- | --- | +| [77. Состояния здоровья](77-health-conditions.md) | 🔄 | Список условий, тяжесть, сейв, тик | + +**Этап B — болезни.** + +| Фаза | Статус | Зачем | +| --- | --- | --- | +| [78. Болезни и векторы](78-diseases.md) | ⬜ | Несколько DiseaseDef, холод/погода, урок/явка | + +**Этап C — зараза.** + +| Фаза | Статус | Зачем | +| --- | --- | --- | +| [79. Заразность](79-contagion.md) | ⬜ | Узел/класс, детерминизм, тост вспышки | + +**Этап D — уход и экран.** + +| Фаза | Статус | Зачем | +| --- | --- | --- | +| [80. Медсестра и карточка](80-nurse-health-ui.md) | ⬜ | Уход, вкладка, связность с журналом/общением | + +77 стоит на нуждах/сейве человека; 78 — на 77 и 32/53; 79 — на 78; 80 — на 79 и 74/75. diff --git a/docs/phases/README.md b/docs/phases/README.md index e172688..cb21cd1 100644 --- a/docs/phases/README.md +++ b/docs/phases/README.md @@ -24,4 +24,5 @@ | 11. События и сцена | 63–67 | [11-events](11-events/README.md) | [events](../design/11-events/events.md) | | 12. Кабинет и классный | 68–72 | [12-office](12-office/README.md) | [office](../design/12-office/office.md) | | 13. Учёба и журнал | 73–76 | [13-grades](13-grades/README.md) | [grades](../design/13-grades/grades.md) | +| 14. Здоровье и болезни | 77–80 | [14-health](14-health/README.md) | [health](../design/14-health/health.md) | | Вне очереди | 48–55 | [off-queue](off-queue/README.md) | [off-queue](../design/off-queue/) |