Studio

FolioTier 2

@dissolve

Cross-fade the changes it is scoped to - one line's own `with dissolve`, or every change inside a `transition dissolve:` block. Never an effect line.

Dissolve cross-fades whatever it's attached to, blending the old frame into the new one instead of cutting. It's the default choice for background changes, sprite swaps, or full scene transitions where you want continuity rather than a jarring pop - a new time of day, a character walking off and another taking their place, or wrapping several simultaneous changes in a transition dissolve block.

Use the shorter end of the duration range for quick beats like sprite mood swaps, and the longer end for scene-level changes like a location or time skip. Shorter feels responsive, longer feels deliberate.

Dissolve only applies to changes, not to standalone effect lines - it rides along with a bg, show, or hide, or wraps a group of them in a transition block. Setting wait to false lets the fade play out while the next lines already execute, which is how you layer a dissolve under dialogue that starts immediately rather than waiting for the fade to finish.

Demo

@dissolve

Hello.

A triangular opacity dip on the stage layer - backdrop and sprites fade through black to the player surface and return. The textbox stays at full opacity throughout.

Parameters

ParameterKindRequiredDefaultNotes
durationnumberno0.50.05-3 seconds. Default 0.5.
waitbooleannotrueBlock for the effect's duration when true; false fires and continues so effects can overlap.

Canonical example

Folio
bg bg-kitchen-morning with dissolve(0.5)
say "Emma": "Morning, already?"
Ren'Py
scene bg kitchen_morning
with Dissolve(0.5)
e "Morning, already?"

@dissolve is the runtime effect a dissolve transition lowers to. It is always scoped to the changes it was written for - one line's own with dissolve, or the body of a transition dissolve: block: those changes fade in over the duration while the prior state fades out, and anything changed outside that scope cuts. Then the next line runs.

Notes

There is no @dissolve(...) line. The effect has one parameter, duration, and both transition spellings carry it in full, so the effect-line form would be a second door to the same thing that no inspector could create. The parser rejects an @dissolve line as an error. Write one of:

  • bg <image> with dissolve(0.8) - the backdrop arrives under the crossfade (the Background event's Transition field in Forge).
  • transition dissolve(0.8): with an indented body - every change in that body crossfades together (the Transition block in Forge). Bare dissolve = the 0.5s default.

The importer keeps bare with dissolve as the bare call and carries a parameterized with Dissolve(N) as dissolve(N); a standalone Ren'Py with dissolve line becomes a transition dissolve: block around the changes pending since the last interaction.

Dissolve is the most-used transition in the corpus - 8502 hits across two sampled games alone. Defaulting duration to 0.5s matches Ren'Py's Dissolve() default and reads cleanly in both narrative events and montages.

See also

  • @fade - fade-out through a color, then fade-in (different shape, similar role)
  • transition - the standalone verb that spells this effect
  • bg - the verb most often paired with @dissolve