ЭИК
Эффекты и боёвка

Статус-эффекты и условия

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) и многое другое.

Дальше — как наносить урон: атаки и взрывы.