How-To: Tune Combo Input Feel

Goal: control when a matched transition fires, and make a step offer a light attack and a charged heavy on the same button.

Prerequisites
How-To: Author a Combo.

1. Choose a fire mode per transition

ECrimsonComboFireMode on each transition decides when a match becomes an activation.

ModeFiresUse for
IASAThe instant the gate matches. The default, and the original behavior.Dodges, cancels, reactive branches - anything where response time is the point.
Press BufferWhen the transition window closes.Combo strings. The follow-up always starts at the same point in the parent step no matter when inside the window the player pressed.
Hold BufferWhen the window closes, and only if the action is still held.Charged follow-ups that must be committed to.

The buffered modes exist because firing on the press makes a string's rhythm depend on the player's exact press frame, so the same combo feels different every time. Deferring to the window's end makes the cadence learnable. Fighting games have split these apart for decades.

Click the Transition node in the combo graph and set Fire Mode under Combo | Timing.

Verify
Set a transition to Press Buffer and press very early in the window. The follow-up still begins at the window's close, not at your press.

2. Put a tap and a hold on the same button

Author two transitions from the same step on the same UInputAction: one with Kind = Tap, one with Kind = Hold and a ChargeWindow.Min. The plugin resolves the ambiguity for you.

Player doesResult
Releases before Tap Max Hold DurationThe Tap transition fires.
Holds past ChargeWindow.MinThe Hold transition fires.
Holds past Tap Max Hold but never reaches ChargeWindow.MinNothing fires - the player asked for the heavy and did not charge it.
Why the tap is deferred
A Tap gate would otherwise match on the press edge, before a Hold could ever reach its minimum charge - so the Hold branch would be unreachable. When both exist on one action the Tap waits for the press to resolve. A step with only ONE gate on an action is unaffected and still fires immediately.

Tune the threshold at Project Settings -> Crimson -> Crimson Ability System -> Tap Max Hold Duration (default 0.18).
Verify
Author both on one action. A quick tap runs the light attack; holding runs the heavy. Before this behavior existed the heavy could never fire.

3. Tune the input buffer

A press that lands slightly too early is buffered rather than dropped. The TTL resolves through a chain - the first non-zero value wins.

  1. The active step node's Input Buffer TTL Override.
  2. The combo asset's Input Buffer TTL Seconds.
  3. The rooting ability's Combo Extension -> Input Buffer TTL Override.
  4. The controller's Default Input Buffer TTL property.
  5. Project Settings -> Crimson Ability System -> Default Input Buffer TTL (default 0.1).
Longer is not better
An over-long buffer produces ghost inputs - actions the player queued but no longer intends, executed after the situation changed. Smash Ultimate shipped a 9-frame buffer and it is still the most common complaint about its feel. Start at the default and shorten before you lengthen.
Verify
Set the TTL to 0.5 and press well before the window opens. The transition still fires when the window opens - that is the buffer working, and it is probably too generous.

4. Stop a buffered attack eating a dodge

The combo controller sees input before the ASC does, so a buffered attack can consume a press the player meant as a dodge. Route defensive actions through the defensive entry point instead.

Bind dodge and block through Input Defensive Action Pressed / Input Defensive Action Released on CrimsonHeroComponent (CrimsonCore - requires all Crimson plugins), or in a standalone project call Handle Input Action Pressed on the combo controller with b Is Defensive ticked and then always forward to the ASC.

Verify
Buffer an attack, then press dodge inside the window. The dodge runs and the queued attack is discarded rather than firing on top of it.

See also

  • How-To: Author a Combo
  • Concept: Combo System