# Authoring Effects

A designer-focused guide to creating, configuring, and balancing status effects without writing code.


# Creating a New Effect

  1. In the Content Browser, navigate to where you want to store effects (recommend Content/Effects/ or Content/SFX_Defs/).
  2. Right-click → Miscellaneous → Data Asset.
  3. Select AP StatusEffectDefinition as the class → click Select.
  4. Name the asset with the SFX_Def_ prefix: e.g., SFX_Def_Chill, SFX_Def_Fortify.
  5. Double-click to open and configure the Details panel.

# Effect Tag

Every effect must have a unique Gameplay Tag set as its EffectTag.

# Recommended Tag Hierarchy

Tags are registered in Project Settings → Gameplay Tags or via the plugin's Config/Tags/StatusFXTags.ini.


# Duration Types

Type Use When Key Property
Timed Effect should expire automatically Set BaseDuration (seconds)
Infinite Effect lasts until explicitly removed (e.g., a passive trait) No duration needed
Instant One-shot effect — fires OnEffectApplied once with no ongoing state No duration or stacking needed

# Choosing a Duration

Short (1–3s)   — Crowd control, brief interrupts (Stun, Fear)
Medium (5–15s) — Damage-over-time, moderate buffs (Poison, SpeedBoost)
Long (30s+)    — Persistent buffs, environmental hazards (Regeneration aura)
Infinite       — Permanent states, passive bonuses, custom-removed effects

# Tick Interval

Set TickInterval to have the effect fire OnEffectTick periodically. Common uses:

TickInterval Use Case
0.0 No ticking (default) — effect applies once on application
1.0 Damage/heal per second (poison, regeneration)
0.5 Fast DoT, rapid resource drain
3.0 Slow periodic pulse, environmental tick

# Stacking Policies

Choosing the right stacking policy is the most important design decision for each effect.

Behavior: Reapplication resets the duration timer. Stack count is always 1.

Use for: Buffs and debuffs where only the most recent application matters — speed boosts, damage buffs, shields.

Example — Speed Boost:

  • Player applies Speed Boost (10s).
  • Player applies Speed Boost again at 6s remaining.
  • Result: Duration resets to 10s. Stack count stays at 1.

Behavior: Each application adds its full duration to the remaining time (up to no explicit cap by default).

Use for: Effects that "stack up" over time — channeled heals, sustained buffs from repeated casts.

Example — Hot Spring Aura:

  • Player enters hot spring: Regeneration applied (15s).
  • Player stays: Regeneration applied again → now 30s remaining.
  • Each second the player stays, more duration accumulates.

Behavior: Each application adds one stack (up to MaxStacks). Duration is shared and refreshes on each application.

Use for: Escalating effects — poison that deals more damage per stack, bleeds, charge-based mechanics.

Example — Poison (MaxStacks: 5):

  • Hit 1: Poison × 1 (10s)
  • Hit 2: Poison × 2 (10s, refreshed)
  • Hit 5: Poison × 5 (10s, refreshed) — maximum damage, maximum stacks

Your game logic reads GetStackCount() and scales damage accordingly.

Behavior: Each application creates a completely separate tracked instance with its own duration.

Use for: Effects where each source is tracked separately — multiple projectile DoTs, layered shields, multi-source bleeds.

Example — Layered Shield:

  • Ability A applies Shield (15s).
  • Ability B applies Shield (10s).
  • Two separate shields exist simultaneously; they expire independently.

Configure GlobalMaxIndependentStacks in Project Settings as a safety cap (default: 50).

Behavior: Delegates all stacking logic to a UAP_StackingResolver subclass you provide.

Use for: Complex or unique stacking that doesn't fit the built-in models — charge systems, diminishing returns, gear-driven scaling.

Create a Blueprint subclass of UAP_StackingResolver, override ResolveStacking, and assign the class to CustomStackingResolverClass on the definition.


# Interaction Rules

Effects can interact with each other in two ways:

# Removes Effects With Tags

When this effect is applied, remove any currently active effect whose EffectTag is in this container.

Example: Antidote

  • RemovesEffectsWithTags: Effect.Debuff.Poison, Effect.Debuff.Disease
  • When Antidote is applied, all poison and disease effects are removed.

# Blocked By Effects With Tags

This effect cannot be applied while any effect with these tags is active.

Example: Frozen (blocked by Invulnerability)

  • BlockedByEffectsWithTags: Effect.Buff.Invulnerability
  • While the target has Invulnerability, applying Frozen silently fails.

# DataTable Rules (Complex Interactions)

For interactions that require immunity grants on removal, use a DataTable in Project Settings:

Column Value
SourceTag Effect.CC.Frozen
TargetTagsToRemove Effect.Debuff.Burning
bGrantImmunityToRemoved true
ImmunityDuration 3.0

Result: Applying Frozen removes Burning and makes the target immune to Burning for 3 seconds.


# Immunity on Expiry

Enable bGrantImmunityOnExpire and set ImmunityDuration to automatically grant immunity after an effect ends naturally.

Example: Stun with Tenacity

  • Stun expires after 3 seconds.
  • bGrantImmunityOnExpire: true, ImmunityDuration: 5.0
  • The target is immune to Stun for 5 seconds after recovery — prevents stunlock.

This is a common pattern in action games and MOBAs (crowd control diminishing returns).


# Icon Setup

Set the Icon property on each definition to a 64×64 UTexture2D. The demo ships with 64×64 PNG icons for all 31 included effects — you can use these as a starting point or as placeholders while producing your own art.

Import icons via Content Browser → Import or by dragging PNG files directly into the editor.


# Validation Warnings

The editor will show warnings in the Compiler Results panel if a definition has invalid configuration:

Warning Cause
Missing EffectTag EffectTag is not set — the effect cannot be identified
CustomStackingResolverClass not set Policy is Custom but no resolver class is assigned
TickInterval < 0 Negative tick interval is invalid
MaxStacks < 0 Negative max stacks is invalid

Fix any warnings before using the definition in gameplay.


# Balancing Tips


# Related Pages


AfterPrime Systems — Building the Gameplay Foundation