Статус-эффекты и условия
StatusEffect — ядро игровой логики: типы срабатывания, цели, изменение свойств, Conditional и RequiredItem.
Что такое StatusEffect
Статус-эффект (StatusEffect) — это универсальное «сделай что-нибудь»: поменяй состояние сущности, навесь аффликшен, заспавни предмет, проиграй звук, выпусти частицы. На статус-эффектах держится почти вся логика в модах.
Важно различать две вещи:
- Исполнитель — предмет, персонаж или конечность, который запускает эффект.
- Цель — сущность, на которую эффект действует (может быть не исполнителем).
Когда срабатывает: атрибут type
Атрибут type задаёт условие срабатывания. Частые значения:
type | Когда срабатывает |
|---|---|
OnUse | Когда предмет используют. |
OnActive | Пока предмет активен / запитан. |
OnDamaged | Когда сущность получает урон. |
OnContaining | Пока в контейнере лежит нужный предмет. |
InWater | Пока сущность под водой. |
OnWearing | Постоянно, пока предмет надет. |
OnSpawn | В момент создания сущности. |
На кого действует: атрибут target
target | Цель |
|---|---|
This | Сама сущность эффекта. |
Character | Персонаж, который использует. |
Contained | Предметы внутри (в контейнере). |
Parent | Контейнер (для предмета) или владелец (для конечности). |
NearbyCharacters / NearbyItems | Всё в радиусе Range. |
UseTarget | Цель взаимодействия. |
AllLimbs | Все конечности персонажа. |
Меняем свойства
Эффект меняет свойства цели через атрибуты. По умолчанию значение меняется в секунду:
<StatusEffect type="InWater" target="This" Condition="-10.0" />
Этот эффект снимает 10 единиц состояния (Condition) предмета в секунду, пока тот под водой.
Модификаторы поведения:
setValue="true"— установить значение, а не прибавлять.disableDeltaTime="true"— менять за кадр, а не за секунду (по сути мгновенно).
Вложенные элементы
<Affliction>— навесить аффликшен (identifier,strength,probability).<RequiredItem>— условие наличия нужного предмета.<Conditional>— логическая проверка перед выполнением (см. ниже).<Sound>,<ParticleEmitter>,<Explosion>,<SpawnItem>— звук, частицы, взрыв, спавн.
Пример: лечащий шприц
<Item identifier="myhealingsyringe" name="Healing Syringe" category="Medical">
<Sprite texture="%ModDir%/textures/syringe.png" sourcerect="0,0,64,64" />
<MeleeWeapon range="50" reload="1.0">
<StatusEffect type="OnUse" target="UseTarget">
<Affliction identifier="bloodloss" strength="-20" />
<Affliction identifier="healingboost" strength="10" />
</StatusEffect>
</MeleeWeapon>
</Item>
Отрицательная strength у bloodloss уменьшает кровопотерю — то есть лечит.
Условия: Conditional
<Conditional> проверяет условие перед тем, как эффект сработает. Синтаксис:
свойство="оператор значение".
Операторы сравнения:
| Оператор | Значение |
|---|---|
eq | равно (по умолчанию) |
neq | не равно |
gt / gte | больше / больше или равно |
lt / lte | меньше / меньше или равно |
<StatusEffect type="OnUse" target="UseTarget">
<Conditional Name="eq Wraith" />
<Conditional Health="gt 50" />
<Affliction identifier="stun" strength="5" />
</StatusEffect>
Эффект сработает, только если цель — Wraith и её здоровье больше 50.
Conditional умеет проверять имена, виды, теги, типы сущностей, навыки (
SkillRequirement), свойства компонентов (TargetItemComponent) и многое другое.
Дальше — как наносить урон: атаки и взрывы.