Система ран Backmen: как тип урона превращается в рану на части тела.
В Backmen физический урон на гуманоидах не копится в DamageableComponent как в ванильном SS14. Вместо этого он превращается в раны (Wound) на ранимых частях тела (WoundableComponent).
| Концепция | Где живёт |
|---|---|
| Типы и группы урона | Resources/Prototypes/Damage/ |
| Поведение конкретной раны | Resources/Prototypes/_Backmen/Entities/Surgery/wounds.yml |
| Части тела, контейнеры, пороги | Resources/Prototypes/Body/Parts/ |
| Логика создания/лечения ран | Content.Shared/Backmen/Surgery/Wounds/ |
Важно:
AsphyxiationиBloodlossне создают раны. Они обрабатываются через модификаторы сознания (ConsciousnessComponent) в C#.
ID прототипа раны = ID типа урона.
Пример: урон Piercing → спавнится entity-прототип Piercing из wounds.yml.
Проверка в коде (WoundSystem.Wounding.cs):
_prototype.TryIndex<EntityPrototype>(protoId, out var woundPrototype)
&& woundPrototype.TryGetComponent<WoundComponent>(out _, _factory);
Damage/types.ymlБазовые типы: Blunt, Slash, Piercing, Heat, Cold, Poison, Asphyxiation, Bloodloss и др.
Backmen-расширения: Resources/Prototypes/_Backmen/Damage/types.yml
| Поле | Назначение |
|---|---|
name |
Ключ локализации (damage-type-*) |
appliesAs |
Подмена типа при расчёте брони |
woundHealingMultiplier |
Множитель лечения раны (редко, напр. Holy) |
Damage/groups.yml| Группа | Типы |
|---|---|
Brute |
Blunt, Slash, Piercing, ArmorPiercing |
Burn |
Heat, Shock, Cold, Caustic |
Airloss |
Asphyxiation, Bloodloss |
Toxin |
Poison, Radiation |
Genetic |
Cellular |
Metaphysical |
Holy |
Damage/containers.yml| Container | Типичное использование |
|---|---|
Biological |
Тело целиком (все группы) |
OrganicPart |
Части тела при хирургии (только Brute + Burn) |
Silicon |
IPC / роботы |
wounds.ymlПуть: Resources/Prototypes/_Backmen/Entities/Surgery/wounds.yml
| Компонент | Роль |
|---|---|
Wound |
Базовые параметры раны |
PainInflicter |
Боль → нервная система |
BleedInflicter |
Кровотечение |
TraumaInflicter |
Шанс травм (кости, органы, нервы…) |
- type: entity
id: MyCustomDamage # ДОЛЖЕН совпадать с damageType в types.yml
parent: WoundBase
categories: [ HideSpawnMenu ]
components:
- type: Wound
damageType: MyCustomDamage
woundType: External # External | Internal
woundVisibility: Always # Always | HandScanner | AdvancedScanner
scarWound: BluntScar
integrityMultiplier: 0.2
- type: PainInflicter
multiplier: 0.75
painType: WoundPain # WoundPain | TraumaticPain | Starving
- type: BleedInflicter
severityThreshold: 8
scalingSpeed: 1
cauterizedBy:
- Heat
- Cold
- type: TraumaInflicter
severityThreshold: 12
allowedTraumas:
- OrganDamage
- BoneDamage
traumasChances:
OrganDamage: 0.21
BoneDamage: 0.34
Dismemberment: -0.17
WoundКод: Content.Shared/Backmen/Surgery/Wounds/Components/WoundComponent.cs
| Поле (YAML) | Описание |
|---|---|
damageType |
ID типа урона (обязательно) |
woundType |
External — видно сразу; Internal — нужен сканер |
woundVisibility |
Когда рана видна в UI |
integrityMultiplier |
WoundIntegrityDamage = severity × multiplier |
scarWound |
Прототип шрама после полного заживления |
canHealAfter |
Задержка перед пассивным заживлением |
Severity: enum WoundSeverity — Healed → Minor → Moderate → Severe → Critical → Loss.
Числовое значение: WoundSeverityPoint — основная метрика для анализатора и лечения.
WoundableКод: Content.Shared/Backmen/Surgery/Wounds/Components/WoundableComponent.cs
YAML: Resources/Prototypes/Body/Parts/base.yml
- type: Woundable
damageContainer: Biological
integrity: 65
integrityCap: 65
thresholds:
Minor: 60
Moderate: 45
Severe: 30
Critical: 12
Loss: 0
| Поле | Описание |
|---|---|
integrity / integrityCap |
Целостность части тела |
thresholds |
Пороги WoundableSeverity |
allowWounds |
Можно ли создавать раны |
healAbility |
Скорость пассивного лечения |
bleedingTreatmentAbility |
Скорость остановки кровотечения |
| Поле | Описание |
|---|---|
multiplier |
Pain = RawPain × multiplier |
painType |
WoundPain, TraumaticPain, Starving |
| Поле | Описание |
|---|---|
severityThreshold |
Минимальная severity для кровотечения |
scalingSpeed |
Скорость нарастания кровотечения |
cauterizedBy |
Типы урона, прижигающие рану |
Кровотечение ≠ кровопотеря:
BleedAmount— активная кровь из ран;Bloodloss— нехватка крови в организме.
| Поле | Описание |
|---|---|
severityThreshold |
Минимальная severity для травмы |
allowedTraumas |
Какие травмы возможны |
allowArmourDeduction |
Учитывать броню при расчёте |
traumasChances |
Модификатор шанса (−1…+1) |
| Тип | Механика | Код |
|---|---|---|
Asphyxiation |
Модификатор сознания на нервной системе | ServerConsciousnessSystem |
Bloodloss |
Модификатор от уровня крови | SharedBloodstreamSystem |
В анализаторе они показываются через PainCauses, а не как раны на частях тела.
Основной файл: Content.Shared/Backmen/Surgery/Wounds/Systems/WoundSystem.Wounding.cs
ChangeWoundableDamage(woundable, damage)
├── для каждого типа в DamageSpecifier:
│ ├── рана есть → изменить severity (или удалить при лечении)
│ └── раны нет → CanAddWound() → TryCreateWound()
└── события: WoundsChangedEvent, WoundChangedEvent
Серверный спавн: Content.Server/Backmen/Surgery/Wounds/Systems/ServerWoundSystem.cs
Damage/types.yml — новый damageTypeDamage/groups.yml — добавить в группуwounds.yml — entity с тем же idLocale/ru-RU/damage/damage-types.ftlContent.IntegrationTests/Tests/Backmen/Medical/| Задача | Что менять |
|---|---|
| Больше/меньше боли | PainInflicter.multiplier |
| Чаще/реже кровит | BleedInflicter.severityThreshold, scalingSpeed |
| Чаще ломаются кости | TraumaInflicter.traumasChances.BoneDamage |
| Быстрее «убивает» конечность | integrityMultiplier |
| Рана видна только со сканером | woundVisibility: HandScanner |
| Внутренняя рана (яд, радиация) | woundType: Internal |
| Данные | Источник |
|---|---|
| Группы Brute/Burn | Сумма WoundSeverityPoint по ранам |
| Airloss (удушение, кровопотеря) | PainCauses с сервера |
| Кровотечение (алерт) | BloodstreamComponent.BleedAmount > 0 |
| Причины боли | ServerConsciousnessSystem.GetPainCauses() |
| Файл | Назначение |
|---|---|
WoundSystem.Wounding.cs |
Создание, лечение, severity |
ServerWoundSystem.cs |
Спавн ран |
ServerPainSystem.cs |
Боль от ран |
BloodstreamSystem.cs |
Кровотечение ран → BleedAmount |
ServerConsciousnessSystem.cs |
Asphyxiation, GetPainCauses |
ServerTraumaSystem.cs |
Травмы от TraumaInflicter |
| Симптом | Причина |
|---|---|
| Урон не создаёт рану | Нет прототипа в wounds.yml или id ≠ damageType |
| Урон игнорируется | damageContainer части не поддерживает группу |
AllowWounds: false |
Киборг / особая часть тела |
| Asphyxiation не в группах анализатора | Не рана; смотреть PainCauses |