Skip to content

Sequence Steps

Each step is a table with a kind. Steps run in order unless a control-flow step changes how child steps are played.

Step Reference

Kind Main fields Purpose
animate to, from, duration, ease, delay Tween numeric fields on target.values.
wait, pause duration or time Delay the next step.
emit event, name, payload Send a host-owned event to opts.emit.
audio cue, audioKind Send an audio cue to opts.audio.
callback callback or fn Run Lua code and continue.
log message or text Log through opts.log or print.
play name, sequence, steps, step, feedback Run one child sequence before continuing.
parallel steps or sequences Run child sequences together, then continue.
repeat count, times, forever, plus child sequence fields Run a child sequence repeatedly.
random options Pick one weighted child option.

Animation And Timing

animate tweens numeric fields on target.values, including custom fields:

{ kind = "animate", duration = 0.12, to = { x = 12, scale = 1.08, teleportGlow = 1 }, ease = "quadout" }

Use from to set starting values before a tween, delay to delay a tween, and onStart, onUpdate, or onComplete hooks for step-local callbacks.

wait and pause delay the next step until enough feel.update(dt) time has passed.

{ kind = "wait", duration = 0.12 }

Side Effects

emit hands a host-owned event to opts.emit(event, ctx).

{ kind = "emit", event = "burst", payload = { count = 18 } }

audio hands an audio cue to opts.audio(event, ctx).

{ kind = "audio", cue = "ui-pop" }

callback runs arbitrary Lua and then continues.

{ kind = "callback", callback = function(ctx) combo = combo + 1 end }

log calls opts.log(message, ctx) when provided, otherwise it prints.

Composition

play runs a named or inline child sequence before continuing.

{ kind = "play", name = "screen.flash" }

parallel runs child steps or sequences at the same time and continues when all branches finish.

{
  kind = "parallel",
  steps = {
    { kind = "animate", duration = 0.08, to = { scale = 1.12 } },
    { kind = "emit", event = "camera.shake", payload = { amount = 8 } },
  },
}

repeat runs a child step or sequence multiple times. forever = true loops until feel.clear() cancels it.

random chooses exactly one weighted child option.

{
  kind = "random",
  options = {
    { weight = 3, step = { kind = "emit", event = "spark.small" } },
    { weight = 1, step = { kind = "emit", event = "spark.big" } },
  },
}

Use LOVE Adapter events when emitted events should control registered LOVE sounds, particles, shaders, camera, screen overlays, or post-processing.