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.
1. Choose a fire mode per transition
ECrimsonComboFireMode on each transition decides when a match becomes an activation.
| Mode | Fires | Use for |
|---|---|---|
IASA | The instant the gate matches. The default, and the original behavior. | Dodges, cancels, reactive branches - anything where response time is the point. |
Press Buffer | When 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 Buffer | When 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.
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 does | Result |
|---|---|
| Releases before Tap Max Hold Duration | The Tap transition fires. |
Holds past ChargeWindow.Min | The Hold transition fires. |
Holds past Tap Max Hold but never reaches ChargeWindow.Min | Nothing fires - the player asked for the heavy and did not charge it. |
Tune the threshold at Project Settings -> Crimson -> Crimson Ability System -> Tap Max Hold Duration (default
0.18).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.
- The active step node's Input Buffer TTL Override.
- The combo asset's Input Buffer TTL Seconds.
- The rooting ability's Combo Extension -> Input Buffer TTL Override.
- The controller's Default Input Buffer TTL property.
- Project Settings -> Crimson Ability System -> Default Input Buffer TTL (default
0.1).
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.
See also
- How-To: Author a Combo
- Concept: Combo System