Skip to content

add: Система зависимостей от алкоголя, никотина и наркотиков, трайты и лечение - #419

Open
ultradyper wants to merge 2 commits into
ss14-ganimed:masterfrom
ultradyper:add/addictions
Open

add: Система зависимостей от алкоголя, никотина и наркотиков, трайты и лечение#419
ultradyper wants to merge 2 commits into
ss14-ganimed:masterfrom
ultradyper:add/addictions

Conversation

@ultradyper

Copy link
Copy Markdown
Contributor

Описание PR

Система привыкания и зависимости от алкоголя, никотина и наркотиков:

  • уровень привыкания растёт при употреблении и медленно спадает без него, подсесть может любой игрок;
  • при долгом отсутствии дозы начинается ломка из трёх стадий: дрожь и поп-апы, затем косноязычие, затем лёгкое замедление, у наркоманов на тяжёлой стадии галлюцинации;
  • доза снимает ломку, но поднимает привыкание ещё выше;
  • лечение: воздержание (около часа) или новый реагент Детоксин (Charcoal + Dylovene);
  • три новых трайта в редакторе персонажа (категория Quirks, -1 очко): Алкогольная зависимость, Никотиновая зависимость, Наркозависимость; стартуют с высоким уровнем привыкания, сочетаются между собой, недоступны расам без органического метаболизма;
  • раздел "Зависимости" в гидбуке с описанием механики, симптомов и лечения.

Технические детали

  • Content.Shared/_Ganimed/Addiction: AddictionComponent (каналы зависимости Alcohol/Nicotine/Drug, уровень 0-100, порог 50, спад 100 за ~50 минут, рост 0.04 за цикл метаболизма, ломка через 10 минут, стадии по 10 минут) и реагентный эффект AdjustAddictionLevel.
  • Content.Server/_Ganimed/Addiction: AddictionSystem (подписка на GetReagentEffectsEvent для учёта доз, раздача компонента игрокам на PlayerSpawnCompleteEvent после TraitSystem, обновление симптомов раз в 10 секунд) и AdjustAddictionLevelEffectSystem.
  • Симптомы: дрожь через DoJitter, косноязычие/сларр через StatusEffectStutter/StatusEffectSlurred, замедление через новый StatusEffectWithdrawalWeakness, галлюцинации через StatusEffectSeeingRainbow.
  • Новые прототипы: трайты, статус-эффект, реагент Детоксин, реакция синтеза, запись гидбука.
  • Правка ванили с маркером Ganimed-Edit: никотину добавлен метаболизм (группа Narcotic, без эффектов), иначе он не метаболизируется и система не ловит приём дозы.

Медиа

Скриншоты будут добавлены отдельным комментарием.

Чек-лист

  • PR полностью завершён и мне не нужна помощь, чтобы его закончить.
  • Я запускал локальный сервер со своими изменениями, всё протестировал, и всё работает как должно.

Список изменений

🆑 ultradyper

  • add: Добавлена система привыкания к алкоголю, сигаретам и наркотикам с ломкой и лечением.
  • add: Добавлены трайты алкогольной, никотиновой и наркотической зависимости.
  • add: Добавлен реагент Детоксин для лечения зависимостей.
  • add: Добавлен раздел "Зависимости" в гидбук.

@github-actions github-actions Bot added size/M Changes: Localization Изменения затрагивают локализацию. S: Needs Review Status: Требуется рассмотрение and removed size/M labels Aug 7, 2026
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Summary by CodeRabbit

  • Новые возможности

    • Добавлена система зависимости от алкоголя, никотина и наркотиков.
    • Реализованы накопление зависимости, стадии абстиненции и симптомы: дрожь, заикание, слабость и галлюцинации.
    • Добавлены черты персонажа, связанные с зависимостями.
    • Добавлен детоксин, снижающий уровень зависимости, и рецепт его изготовления.
    • Попапы уведомляют о начале зависимости, употреблении, ломке и выздоровлении.
  • Документация

    • Добавлена русскоязычная страница руководства о зависимостях, симптомах и лечении.

Walkthrough

Добавлена система зависимости от алкоголя, никотина и наркотиков. Она создаёт каналы зависимости, изменяет их уровни, запускает стадии абстиненции и поддерживает лечение детоксином. Добавлены компоненты, эффекты, прототипы, трейты, локализация и руководство.

Changes

Механика зависимостей

Layer / File(s) Summary
Контракты и лечебный эффект
Content.Shared/_Ganimed/Addiction/*
Добавлены AddictionComponent, AddictionKind, AddictionChannel, событие AddictionSymptomsChangedEvent и эффект AdjustAddictionLevel. Эффект изменяет уровень выбранного или всех каналов и ограничивает его снизу значением 0.
Обработка зависимости и абстиненции
Content.Server/_Ganimed/Addiction/*
AddictionSystem отслеживает употребление реагентов, снижает уровень зависимости, определяет стадии абстиненции и публикует события симптомов. AddictionSymptomsSystem применяет дрожь, статус-эффекты, косноязычие, заикание, слабость и галлюцинации.
Прототипы, лечение и описание
Resources/Prototypes/_Ganimed/..., Resources/Prototypes/Reagents/narcotics.yml, Resources/Locale/ru-RU/_Ganimed/addictions.ftl, Resources/ServerInfo/_Ganimed/Guidebook/Addictions.xml
Добавлены статус-эффект слабости, метаболизм никотина, реагент и рецепт детоксина, три трейта зависимости, локализация и руководство.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Игрок
  participant AddictionSystem
  participant AddictionComponent
  participant AddictionSymptomsSystem
  participant StatusEffectWithdrawalWeakness
  Игрок->>AddictionSystem: употребляет отслеживаемый реагент
  AddictionSystem->>AddictionComponent: обновляет канал зависимости
  AddictionSystem->>AddictionComponent: снижает уровень при воздержании
  AddictionSystem->>AddictionSymptomsSystem: публикует AddictionSymptomsChangedEvent
  AddictionSymptomsSystem->>StatusEffectWithdrawalWeakness: применяет эффект симптома
Loading

Suggested labels: T: Balance

Suggested reviewers: crimemoot

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed Заголовок точно и кратко описывает основное изменение: систему зависимостей, связанные трайты и лечение.
Description check ✅ Passed Описание подробно связано с изменениями и охватывает механику зависимостей, симптомы, лечение, трайты и техническую реализацию.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@ultradyper

Copy link
Copy Markdown
Contributor Author
изображение изображение изображение изображение

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: bea1de41-dc7f-4df6-b61b-0e2efe7b486e

📥 Commits

Reviewing files that changed from the base of the PR and between 1f46142 and 28930ef.

📒 Files selected for processing (12)
  • Content.Server/_Ganimed/Addiction/AddictionSystem.cs
  • Content.Server/_Ganimed/Addiction/AdjustAddictionLevelEffectSystem.cs
  • Content.Shared/_Ganimed/Addiction/AddictionComponent.cs
  • Content.Shared/_Ganimed/Addiction/Effects/AdjustAddictionLevel.cs
  • Resources/Locale/ru-RU/_Ganimed/addictions.ftl
  • Resources/Prototypes/Reagents/narcotics.yml
  • Resources/Prototypes/_Ganimed/Entities/StatusEffects/addictions.yml
  • Resources/Prototypes/_Ganimed/Guidebook/addictions.yml
  • Resources/Prototypes/_Ganimed/Reagents/medicine.yml
  • Resources/Prototypes/_Ganimed/Recipes/Reactions/medicine.yml
  • Resources/Prototypes/_Ganimed/Traits/addictions.yml
  • Resources/ServerInfo/_Ganimed/Guidebook/Addictions.xml
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
  • GitHub Check: Test Packaging
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML Linter
  • GitHub Check: check-maps
  • GitHub Check: YAML map schema validator
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2026-01-28T21:02:49.548Z
Learnt from: HyperB1
Repo: ss14-ganimed/Ganimed14 PR: 350
File: Resources/Locale/en-US/_Harmony/game-ticking/game-presets/preset-conspirator.ftl:14-14
Timestamp: 2026-01-28T21:02:49.548Z
Learning: Verify that locale FTl files under Resources/Locale maintain consistency with control keycodes. If a fork modifies a keycode (e.g., 'o' → 'г' in radio_channels.yml for a specific channel), the English (en-US) locale should be updated to reflect the intended behavior or explicitly document the exception. Ensure the English instruction uses the same keycode as the default/original behavior unless the fork’s logic requires a deliberate change, to avoid localization discrepancies.

Applied to files:

  • Resources/Locale/ru-RU/_Ganimed/addictions.ftl

Comment thread Content.Server/_Ganimed/Addiction/AddictionSystem.cs
Comment thread Content.Server/_Ganimed/Addiction/AddictionSystem.cs
Comment on lines +27 to +30
/// Спад уровня в секунду. 100 за ~50 минут воздержания.
/// </summary>
[DataField]
public float DecayRate = 100f / 3000f;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Согласуйте спад уровня с длительностями стадий ломки.

При DecayRate = 100 / 3000 уровень канала, ограниченный значением 100, достигнет Threshold = 50 через 25 минут. Тяжёлая стадия начинается только через 30 минут: 10 минут задержки и две стадии по 10 минут. Условие излечения сработает раньше, поэтому третья стадия и галлюцинации недостижимы.

  • Content.Shared/_Ganimed/Addiction/AddictionComponent.cs#L27-L30: уменьшите DecayRate или измените порог и длительности так, чтобы уровень оставался выше Threshold при входе в тяжёлую стадию.
  • Content.Server/_Ganimed/Addiction/AddictionSystem.cs#L93-L106: синхронизируйте условие излечения с длительностями стадий и добавьте проверки границ стадий.
  • Resources/ServerInfo/_Ganimed/Guidebook/Addictions.xml#L24-L27: обновите указанное время лечения после выбора итогового баланса.
📍 Affects 3 files
  • Content.Shared/_Ganimed/Addiction/AddictionComponent.cs#L27-L30 (this comment)
  • Content.Server/_Ganimed/Addiction/AddictionSystem.cs#L93-L106
  • Resources/ServerInfo/_Ganimed/Guidebook/Addictions.xml#L24-L27

Comment thread Content.Shared/_Ganimed/Addiction/Effects/AdjustAddictionLevel.cs Outdated
@CrimeMoot

Copy link
Copy Markdown
Member

Зачем так много щиткода, переводи константы в компонент. Вместо float пробуй TimeSpan. Прямые вызовы тоже перебор, лучше через событие.

@ultradyper

Copy link
Copy Markdown
Contributor Author

Зачем так много щиткода, переводи константы в компонент. Вместо float пробуй TimeSpan. Прямые вызовы тоже перебор, лучше через событие.

Исправлю.

…омпонент, TimeSpan вместо float, симптомы через событие

- константы (статус-эффекты, длительности, амплитуды дрожи, группы метаболизма) переведены в DataField компонента Addiction
- длительности симптомов теперь TimeSpan
- симптомы ломки применяет отдельная AddictionSymptomsSystem по событию AddictionSymptomsChangedEvent, пересчёт по всем каналам
- стартовые каналы из трайтов получают WasAddicted, поп-апы выздоровления и подсадки не врут
- DecayRate снижен (100/6000): тяжёлая стадия ломки теперь достижима
- гайдбук эффекта показывает модуль снижения, без минуса
@ultradyper

Copy link
Copy Markdown
Contributor Author

Исправлено: константы переведены в компонент (DataField), длительности в TimeSpan, симптомы ломки применяются через событие AddictionSymptomsChangedEvent отдельной системой с пересчётом по всем каналам. Заодно поправлен баланс спада, чтобы тяжёлая стадия была достижима.

@github-actions github-actions Bot added the size/M label Aug 7, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6df7b461-ab9d-4c9f-b0c1-833066b88f95

📥 Commits

Reviewing files that changed from the base of the PR and between 28930ef and 2021520.

📒 Files selected for processing (5)
  • Content.Server/_Ganimed/Addiction/AddictionSymptomsSystem.cs
  • Content.Server/_Ganimed/Addiction/AddictionSystem.cs
  • Content.Shared/_Ganimed/Addiction/AddictionComponent.cs
  • Content.Shared/_Ganimed/Addiction/AddictionSymptomsChangedEvent.cs
  • Content.Shared/_Ganimed/Addiction/Effects/AdjustAddictionLevel.cs
🚧 Files skipped from review as they are similar to previous changes (1)
  • Content.Shared/_Ganimed/Addiction/Effects/AdjustAddictionLevel.cs
📜 Review details
⏰ Context from checks skipped due to timeout. (6)
  • GitHub Check: check-maps
  • GitHub Check: Test Packaging
  • GitHub Check: YAML RGA schema validator
  • GitHub Check: YAML Linter
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML map schema validator
🔇 Additional comments (4)
Content.Shared/_Ganimed/Addiction/AddictionComponent.cs (1)

5-8: LGTM!

Also applies to: 31-35, 67-144, 185-205

Content.Shared/_Ganimed/Addiction/AddictionSymptomsChangedEvent.cs (1)

1-12: LGTM!

Content.Server/_Ganimed/Addiction/AddictionSystem.cs (1)

20-20: LGTM!

Also applies to: 54-67, 83-88, 105-106, 122-126, 145-145, 164-165, 176-204

Content.Server/_Ganimed/Addiction/AddictionSymptomsSystem.cs (1)

1-120: LGTM!

Also applies to: 125-139

Comment thread Content.Server/_Ganimed/Addiction/AddictionSymptomsSystem.cs
@HyperB1 HyperB1 added T: Enhancement Type: Новый контент, QoL и улучшения P3: Standard Стандартный приоритет рассмотрения S: Awaiting Changes Status: В ожидании запрошенных изменений A: Character/Species Area: Player characters and species features and content. A: Medical Area: Medical department, including Chemistry A: Preferences Area: Menu and lobby customization settings which are saved in the database. labels Aug 8, 2026
@HyperB1

HyperB1 commented Aug 8, 2026

Copy link
Copy Markdown
Member

Раундстарт алкоголизм и в особенности наркомания должны блокировать некоторые роли по моему мнению.
Плюс, есть вопрос от какого наркотика идёт зависимость? Я так понимаю, галлюциногены (seeing rainbows), но есть же и другие наркотики.

Моё мнение по балансу (окончательное решение за руководством) - убрать черту наркозависимости и заблокировать алкашам некоторые роли (капитана, ГСБ, ГВ, КЦК и ОСЩ допустим).

@ThundraBoomerov

Copy link
Copy Markdown
Contributor

Раундстарт алкоголизм и в особенности наркомания должны блокировать некоторые роли по моему мнению. Плюс, есть вопрос от какого наркотика идёт зависимость? Я так понимаю, галлюциногены (seeing rainbows), но есть же и другие наркотики.

Моё мнение по балансу (окончательное решение за руководством) - убрать черту наркозависимости и заблокировать алкашам некоторые роли (капитана, ГСБ, ГВ, КЦК и ОСЩ допустим).

Да.
Если реализуемо с точки зрения кода, считаю, что хорошо подмечено

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A: Character/Species Area: Player characters and species features and content. A: Medical Area: Medical department, including Chemistry A: Preferences Area: Menu and lobby customization settings which are saved in the database. Changes: Localization Изменения затрагивают локализацию. P3: Standard Стандартный приоритет рассмотрения S: Awaiting Changes Status: В ожидании запрошенных изменений S: Needs Review Status: Требуется рассмотрение size/M T: Enhancement Type: Новый контент, QoL и улучшения

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants