How-To: Author Motion Presets

Motion presets live in a UCrimsonCombatTextMotionSet asset as ordinary editable rows keyed by gameplay tag. Adding your own needs no C++.

One preset, many styles
Define a motion once and point many styles at it. Editing the preset updates every style using it - which is the whole reason motion is a shared asset rather than a per-style struct.

1. Create the asset

Content Browser right-click > Crimson > Combat Text > Motion Set. A new asset arrives pre-seeded with five editable built-in presets, so you are never staring at an empty map:

Preset tagFeel
CrimsonCombatText.Motion.FloatUpGentle straight rise with a soft ease-out. The everyday damage number.
CrimsonCombatText.Motion.ArcOutRises then falls away in an arc. Classic ballistic combat text.
CrimsonCombatText.Motion.BurstWide fast scatter, short life. Multi-hit and AoE.
CrimsonCombatText.Motion.CritPunchHard scale punch, minimal drift, long hang time.
CrimsonCombatText.Motion.StaticNo movement. Fades in place. Good for status words.

Point the registry's MotionSet at this asset, then reference presets from a style's MotionPreset tag.

2. Add your own

Add a gameplay tag under CrimsonCombatText.Motion and a matching row. Tune the amplitudes first, then shape the curves:

Motion Set asset: the Presets map with a preset row expanded, showing RiseCurve open in the curve editor.
FieldWhat to reach for it for
DurationHow long it lives
RiseDistanceHow far it travels up over the full lifetime
SpreadDistanceLateral amplitude at full fan deflection
RiseCurveThe shape of the rise. Empty = linear
SpreadCurveThe shape of the lateral travel. Empty = linear
ScaleCurvePunch and settle. Empty = constant 1
OpacityCurveFade. Empty = opaque until 80%, then linear to 0
Curves are lifetime-relative, not seconds
Curves run over a normalized 0..1 lifetime alpha, not seconds - so changing Duration restretches the whole motion without redrawing anything.

3. Stop hits stacking

bUseSpreadFan deflects concurrent hits on the same target to alternating sides. Slot 0 goes straight up, then -1/N, +1/N, -2/N and so on out to FanWidth. It is deterministic, so the same burst always reads the same way; RandomJitter adds controlled wobble on top if perfect regularity looks mechanical.

SpreadDecayTime in project settings controls how long a burst keeps fanning outward before the next flurry restarts from center.

Overriding motion from a modifier

A modifier's MotionPresetOverride swaps the motion wholesale. Pointing a Crit modifier at CrimsonCombatText.Motion.CritPunch gives every critical hit the punch motion, whatever base style it resolved to - no per-damage-type rows needed.