Actor Slots
Actor slots display characters in VN-style scenes with positioning, animations, and transitions.
How It Works
| Step | What happens |
|---|---|
| 1 | Define slot templates in Characters > Actor Slots |
| 2 | Use {actor} action to place characters in slots |
| 3 | Characters render with enter animations |
| 4 | Idle animations loop while displayed |
| 5 | Exit animations play on removal |
Features
Actor slots support:
| Feature | Description |
|---|---|
| Positioning | Place anywhere using x/y percentages, layer with z-index |
| Transforms | Scale, rotate, flip (mirror), adjust opacity and blur |
| Enter transitions | Animated appearance (fade, slide, zoom, bounce, etc.) |
| Exit transitions | Animated removal with same transition options |
| Idle animations | Looping animations while displayed (float, sway, pulse, etc.) |
| One-shot animations | Play once and return to rest (lunge, recoil, hop, flash, etc.) |
| Filter effects | Brightness, contrast, saturation, sepia, hue rotation |
| Anchors | Control rotation pivot point |
Adding/Removing Actors
Using Actions
| Action | Description |
|---|---|
{actor: "my_character->my_slot"} | Add character to slot |
{actor: "my_character->my_slot(x=30, scale=1.2)"} | Add with property overrides |
{actor: "alice->left, bob->right"} | Add multiple actors |
{actor: "!my_character"} | Remove character (with exit animation) |
{actor: "!my_character(exit=fade)"} | Remove with custom exit |
{actor: "my_character(alpha=0.5)"} | Update existing actor properties |
{actor: false} | Clear all actors |
Example - Two characters talking:
{actor: "alice->left(enter=fadeSlideRight), bob->right(enter=fadeSlideLeft)"}
Example - Character leaves:
{actor: "!alice"}
Example - Move character to different slot:
{actor: "alice->center"}
If a character is already in the scene, using my_character->other_slot moves them smoothly to the new position.
Slot Templates
Create reusable slot positions in Characters > Actor Slots.
Common slot setup:
| Slot ID | x | y | Description |
|---|---|---|---|
left | 20 | 50 | Left side of screen |
center | 50 | 50 | Center |
right | 80 | 50 | Right side of screen |
Templates define default values. Inline properties override template values.
Transitions
Enter Transitions
| Category | Options |
|---|---|
| Fade | fade, dissolve, blurIn |
| Slide | slideUp, slideDown, slideLeft, slideRight |
| Move In | moveInTop, moveInBottom, moveInLeft, moveInRight |
| Fade Slide | fadeSlideUp, fadeSlideDown, fadeSlideLeft, fadeSlideRight |
| Zoom | zoomIn, zoomOut, grow, shrink |
| Rotate | rotate, rotateIn, rotateOut |
| Flip | flip, flipVertical |
| Bounce | bounce, elastic, pop |
Exit Transitions
Same types available with directional variants (e.g., slideOutLeft, fadeSlideDown).
Easing Options
linear, power1, power2, power3, power4, back, elastic, bounce, circ, expo, sine
Idle Animations
Continuous looping animations while the character is displayed.
| Category | Options |
|---|---|
| Movement | float, bounce, hop, pan, shake, shimmy |
| Rotation | sway, rock, rotate, nod, lean, wiggle |
| Scale | pulse, breathe |
| Visual | blink, glow, jitter, glitch |
| Combined | wave |
| Pose | slumped — sinks and sags, then breathes heavily; stays until the idle changes |
Switching idles eases through the rest pose instead of snapping, so a slumped actor sinks down and rises back up.
Example - Floating character:
{actor: "ghost->center(idle=float, idle_intensity=0.8)"}
A character's own idle
Give a character the idle trait and it plays that loop wherever it is staged – set float once on a bat, a ghost or a winged girl and every staging line lifts it, with no idle= on the line:
{actor: "bat1->pos6"} // floats: its idle trait is float
{actor: "bat1->pos6(idle=none)"} // stands still this time
| Source | Wins over |
|---|---|
The staging line's idle (none included) | everything |
The slot template's idle (anything but inherit) | the trait |
The idle the actor already has, kept by inherit when it moves | the trait |
The idle trait | nothing – it fills in when the others are empty |
So a cancel sticks: idle=none on one line stays through later moves that set no idle. The trait's loop varies its length a little per actor, so several of them don't bob in step. Battle plugins may read the same trait – rpg_battler uses it for a battle slot that has no battle_idle.
One-Shot Animations
Play once, then the actor returns to rest; the idle loop keeps running underneath. One-shots are events, not state: they are never saved, and loading a save never replays them.
| Animation | Motion |
|---|---|
lunge | Darts toward the stage center and back — attacks, grabs |
recoil | Knocked back away from the center, then settles — hits, shoves |
hop | One quick jump — surprise, glee |
shake | Short sideways tremor — anger, pain, struggling |
shiver | Small fast trembling — fear, cold |
nod | Dips down and back — agreement |
bounce | Squash and stretch — playful emphasis |
flash | Quick red wash on this actor only — taking a hit |
lunge and recoil read the actor's side of the stage, so the same word points the right way on either side. intensity (default 1) and duration (seconds) tune any of them.
{actor: "chimera->right(anim=lunge)"} // stage and lunge once she has entered
{actor: "chimera(anim=lunge)"} // an actor already on stage
{animate: "chimera lunge, mc recoil(intensity=1.3)"} // several at once
Events
Actors use the same character visual template as Character Sheet and Character Face. The character_render event applies to all contexts where a character is displayed.
| Event | When it fires | Parameters |
|---|---|---|
character_render | Before character layers are built | (character) |
Use character_render to dynamically modify character.renderedLayers before display.
Quick Reference
| I want to... | Do this |
|---|---|
| Add character to slot | {actor: "my_character->my_slot"} |
| Add with animation | {actor: "my_character->my_slot(enter=fade)"} |
| Remove character | {actor: "!my_character"} |
| Move to new slot | {actor: "my_character->other_slot"} |
| Update properties | {actor: "my_character(alpha=0.5)"} |
| Flip horizontally | Set mirror: true on slot |
| Skip the scene grade (a glowing ghost) | {actor: "my_character->my_slot(grade=false)"} |
| Add looping animation | Set idle: "float" on slot |
| Play an animation once | {animate: "my_character lunge"} or {actor: "my_character(anim=lunge)"} |
| Clear all actors | {actor: false} |