❓ QWAY Studio HelpQWAY · WRIGHT · RIDLEY · RAMS

RIDLEY language reference

Syntax and timing

RIDLEY uses the same bounded lexer/CST notation and comments as QWAY but different command signatures and scope. Object references resolve against the accepted world; cinematic/cue/state names are not new scene objects. The source hash and alias bindings pin meaning. Rebinding an existing alias to a different UUID is rejected.

Leaf cinematic cues require id; at is optional absolute time in the sequence. Sequential blocks advance the cursor; sync starts siblings together. duration defaults to 3s for visible nontext cues, max(1,text length/15)s for text, and 0 for emit/return/music/sfx. Visible cues require positive duration; audio commands are instantaneous. Overlapping camera cues or actions for the same actor are rejected.

Command signatures

Command / scopeArgumentsSemantics / defaults
cinematic / rootid; blockNamed sequence
voice / rootactor; voice,language,instructions,speedActor voice compiled at WorldPack export. Defaults fable, it-IT, speed=1. Cached across exports.
scene / cinematicno arguments; blockSequential grouping
sync / cinematicno arguments; blockParallel grouping
shot / cinematicid; at,duration; type; subject OR subjects; shoulder,movement,amount,transitionmovement=static; amount=.2 in [-1,1]; transition=cut|smooth. two-shot needs 2 subjects; OTS needs a distinct shoulder; establishing can omit subject.
dialogue / cinematicid; at,duration; actor,text; voice,language,instructions,speedExisting actor; nonempty text ≤4000 characters
subtitle, narration / cinematicid; at,duration; textSubtitles display text; narration can opt into generated speech with voice/language/instructions/speed.
action / cinematicid; at,duration; actor,action; target,clip,persistencelook-at / move-to require distinct target; animate requires actual clip; persistence=temporary|runtime, default temporary
wait / cinematicid; at,durationAdvances time
emit / cinematicid; at,duration; event,targetInstantaneous named event; optional target
return / cinematicid; at,durationReturn from sequence; instantaneous
trigger / rootid,event,subject,cinematic; target,distance,oncenear needs target; once defaults true; supported event enum is checked
audio / rootname,asset,sha256Pins existing audio resource
music / cinematic or statetrack; action,from,volume,fade,loop; cue timing/id only in cinematicplay|stop|crossfade; default play, volume1, fade0, looptrue; crossfade needs from
sfx / cinematicid; at,duration; track,spatial,volumeOne-shot sound, optional spatial object
persona / rootname,profile,sha256Pins existing persona revision
npc / rootactor,personaBinds actor to persona
experience / rootinitial; blockAt most one experience
state / experienceid; mode,cinematic; blockmode=interactive by default; cinematic requires sequence
control / stateactor; ownerowner=user|ridley, default user
camera / statemode,ownerthird-person default; first-person/overhead/overview; owner=user|ridley
follow / stateactor,target; distance,delay,speed1.2m distance,1.5s delay,1.2 speed scalar m/s; cycles rejected
conversation / stateactor,personaRequires bound persona and conversation state
on / experienceid,from,to,event; subject,target,onceFilters shared events; once defaults false. Not the QWAY support relation.
cut, transition / cinematicrecognized but rejectedEXPLICIT_TRANSITION_REQUIRED: use transition on destination shot

Shot and movement enums

Shot types: extreme-closeup, closeup, medium-closeup, medium, american, full, long, extreme-long, two-shot, over-the-shoulder, pov, establishing, insert. Movements: static, pan, tilt, dolly, truck, pedestal, orbit, zoom, follow, crane. These are templates evaluated against actual scene geometry, not promises of collision-free camera travel.

Tested programs

minimal

QWAY / RIDLEY
\cinematic[id=intro]{\shot[id=wide,type=establishing,duration=2s];}

Download. Compile against the matching QWAY example with desk/table aliases. The minimal establishing shot needs no actor alias.

intermediate

QWAY / RIDLEY
\cinematic[id=intro]{
  \sync[]{
    \shot[id=desk_view,type=medium,subject=@desk,duration=3s];
    \subtitle[id=welcome,text="Welcome to the workshop.",duration=3s];
  }
  \shot[id=detail,type=insert,subject=@desk,duration=2s,transition=smooth];
}

Download. Compile against the matching QWAY example with desk/table aliases. The minimal establishing shot needs no actor alias.

complete

QWAY / RIDLEY
\cinematic[id=intro]{
  \scene[]{
    \shot[id=wide,type=establishing,duration=2s];
    \sync[]{
      \shot[id=pair,type=two-shot,subjects=(@desk,@table),duration=3s];
      \narration[id=line,text="Two work surfaces, one shared project.",duration=3s];
    }
    \emit[id=ready,event="workshop.ready"];
    \return[id=done];
  }
}
\experience[initial=explore]{
  \state[id=explore]{\camera[mode=overview];}
  \state[id=tour,mode=cinematic,cinematic=intro]{}
  \on[id=start,from=explore,to=tour,event="workshop.start"];
  \on[id=end,from=tour,to=explore,event="ridley.complete"];
}

Download. Compile against the matching QWAY example with desk/table aliases. The minimal establishing shot needs no actor alias.

Errors and unsupported behavior

Unknown commands/arguments, invalid units, missing actors/clips/resources, alias rebound, conflicting cues, unsupported actions and invalid state graphs reject compilation. Example below is deliberately invalid:

QWAY / RIDLEY
\cinematic[id=bad]{\shot[id=oops,type=closeup,subject=@not_in_world];}

Expected UNKNOWN_ALIAS. Use transition=cut|smooth on a destination shot; standalone cut/transition commands are deliberately diagnosed. No arbitrary scripting, generated animation, TTS or automatic persistent world mutation is available.