FolioTier 2
video
Play a fullscreen cutscene, or place a video clip on the stage.
Video covers two different jobs under one verb. Play throws a clip across the whole screen as a cutscene, taking over the frame the way a scene transition would, and is the right call for openings, memory sequences, or any moment where the video is the scene. Show instead treats a clip as a piece of stage furniture, sized and positioned like a sprite, so it can run in the corner of the shot while dialogue and other stage business continue around it, a phone screen, a television, a looping background element.
Loop changes what happens at the end of playback rather than during it: a looping play keeps the cutscene running until the scene itself moves on, while a looping show clip repeats indefinitely until you hide it. Leave loop off a show clip and it plays once, then holds on its last frame, which is a clean way to land on a freeze frame without adding extra logic.
A shown clip's position, size, and rotation are fixed at the moment you show it. There is no way to tween a clip across the stage; to move one, hide it and show it again at the new spot, which reads as a cut, not a slide.
Hide has to match what show set up: if the clip was given an as name, hide needs that name, not the underlying video reference, since the name is what identifies the clip on stage from that point on. This scene-local name also survives a rename of the underlying video asset, so refactoring your asset list won't orphan a hide call that's still using the old on-stage name.
Showing the same reference twice without an as name doesn't create a second clip, it just repositions the first one in place, so if you know up front you'll need two copies on screen at once, as needs to be there from the first show, not added later.
Parameters
| Parameter | Kind | Required | Default | Notes |
|---|---|---|---|---|
| action | identifier | yes | - | `play` starts a fullscreen cutscene; `show` places a clip on the stage; `hide` removes a placed clip. |
| reference | identifier | yes | - | On `play` and `show`, a video reference registered in the project's video assets; quoted form accepted for references with non-identifier characters. On `hide`, the clip's `as` name when its show gave it one, else the video reference. |
| as | identifier | no | - | `show` only - names this clip on stage, which is the only way to place one video twice: two shows without a name are the same clip, so the second just repositions the first. `hide` then takes the name. The name is scene-local and never follows an asset rename. |
| at | expression | no | - | `show` only - static position, e.g. `at(50%, 40%)`. A clip's placement never animates; re-show the clip to reposition it in place. |
| size | expression | no | - | `show` only - static size, e.g. `size(30%)` or `size(200px, 100px)`. Omitted entirely, the clip fills the stage (contain fit, centered). |
| rotate | number | no | - | `show` only - static rotation in degrees around the anchor. |
| anchor | identifier | no | - | `show` only - placement anchor preset; omitted = bottom-center like sprites. |
| loop | boolean | no | false | Trailing `loop` flag. On `play`: the cutscene runs until a scene transition. On `show`: the clip repeats until hidden or the scene ends; without it the clip plays once and holds its final frame. |
Canonical example
video play denjiwork
video show card_reveal at(50%, 40%) size(30%) loop
video show card_reveal as second_screen at(80%, 40%) size(15%) loop
video hide second_screen
video hide card_reveal$ renpy.movie_cutscene("video/denjiwork.webm", loops=0)
show card_reveal at truecenter
show card_reveal as second_screen at right
hide second_screen
hide card_revealOne keyword, two lanes. video play runs a fullscreen cutscene in the
player's video overlay: a one-shot advances to the next step when it
finishes; with loop it runs until a scene transition ends it.
video show places a clip ON the stage - positioned, sized, and living
beside sprites while dialogue keeps playing - and video hide removes
it.
Notes
A stage clip's placement is static: at/size/rotate/anchor
set where it mounts, and none of them animate. Re-showing a mounted
clip updates its placement and loop flag in place without restarting
playback - that is how a clip repositions. Motion clauses (from(),
-> tracks, with <curve>, entrance(), z(), flip()) are parse
errors on a video show line; there is no video move.
A stage clip is identified by its as name when it has one, and by its
video asset when it does not. That single rule decides every case: two
shows of one video with no name are one clip (the second repositions
it), while as left and as right are two clips that place and hide
independently. A named clip answers only to its name, so video hide
with the plain reference cannot take it. Hiding something that is not on
stage does nothing, which is fine - a show inside a when branch that
did not run leaves its hide with nothing to do.
Without loop, a stage clip plays once and holds its final frame;
with it, the clip repeats until hidden or the Folio scene ends (scene
boundaries clear mounted clips, like sprites). Whenever playback
re-derivation newly mounts a clip - a timeline click, scrub, save
restore, or scene entry - it plays from the start. Stage clips are
muted.
The Ren'Py $ renpy.movie_cutscene("…") Python call lowers to
video play during import (loops=0 one-shot, loops=-1 looping). A
Ren'Py image X = Movie(...) definition imports as a video-backed
image: scene X becomes a persistent bg, while
show X / hide X become video show / video hide stage clips -
never sprites, so webms don't appear in the Sprite manager. Movie
size= maps to the show's placement size; a mask= alpha companion is
an honestly flagged loss.
See also
bg- for video-backed scene backgrounds (theMovie(...)displayable pattern); usebgwhen the video is a layered background,video showwhen it sits over the stage,video playwhen it's a fullscreen cutscenesprite- the placement vocabulary a stage clip borrows (statically) from the sprite move grammarsound- play/stop grammar for SFX