AI tools: Play, test and profile
Playing the game, bots, screenshots, recordings, frame timing and checks. 73 tools. You see every step your AI takes and can undo any of them.
ai_report
Read actual enemy decisions and sight/hearing/radio per tick. mode=live reads only this engine's current Play session and never silently simulates. mode=simulate explicitly runs a separate stationary-player snapshot for 0...30 seconds, without changing the authoring scene, camera or saves. Rows include firstSeenTick/firstNoticedTick, reasons, routes, health and attack counts. History is bounded: dropped/omitted rows are explicit. First-seen ticks support checks such as noticed within 2 seconds (240 ticks). HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.
| Argument | Type | What it does |
|---|---|---|
entity | string | Entity name (e.g. "Tower_B") or id (e.g. "#7"). |
limit | integer | |
mode | live / simulate | |
seconds | number | |
since_tick | integer |
audio_report
Measure the actual live pre-master stereo bus, using the same capture as listen. Reports levels, per-channel clipping and rendered source contributions, not just requested sound names. Optional explicit impulse probe can measure an isolated reverb decay; it never substitutes the geometric estimate for a measurement. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.
| Argument | Type | What it does |
|---|---|---|
expected | list of string | Exact rendered sound names, or a trailing * prefix. Missing or silent contributions fail the check. |
probe_reverb | boolean | Default false. Explicitly plays one quiet impulse through the current live room. Other active audio makes the measured decay unavailable. |
seconds | number |
audio_spatial_check
Measure the engine's headphone 3D (binaural) on the real mixer, offline: noise and tones from ahead, the sides, behind, above, below and at the shoulder, plus a sweep round the head. Reports each direction's ear delay (ms), level difference (dB), brightness and pinna-notch tones, and pass/fail checks. Pass binaural:false to measure the plain pan for comparison.
| Argument | Type | What it does |
|---|---|---|
binaural | boolean | Default true (the engine's setting). false: measure the plain equal-power pan. |
demo | string | Optional: a WAV in the project's Assets (e.g. "Sounds/Footsteps/x.wav"). Writes Renders/spatial_demo.wav: that sound carried round your head, over and under it, then up to your shoulder; listen on headphones. |
autoplay
Stress test: a bot plays the game many times through the real controls (pathfinding to objectives, hiding from guards/enemies, getting unstuck) and reports win rate, how runs fail, objectives it couldn't reach, where it got stuck, script errors and simulation cost, plus a picture of one run's end.
| Argument | Type | What it does |
|---|---|---|
camera | chase / player | Watching: chase (default) a raised camera behind the player; player the game's own view (first person: the player's eyes), what a person playing sees, so frame timings measured meanwhile are the game's. |
cautious | boolean | Hide from threats (default true). false plays recklessly, which shows whether threats work at all. |
fight | boolean | Shoot threats in clear sight (default true). |
goals | list of string | Objectives in order: names, or tag:name for all with that tag (nearest first). Default: worked out from the scene's triggers, exits last. |
job | string | The job id of a stress test still running: returns its report when it has finished (or how far it has got). |
patience | number | Seconds to hold at an objective that stays put (pressing E) until the mission objective changes. Default 90. |
players | integer | Players in the game (1–4), each played by its own bot: a co-op stress test. Default 1. |
runs | integer | Default 5, max 40. |
seconds | number | Time limit per run. Default 180, max 600. |
seed | integer | First run's seed (default 1). Each seed replays exactly: bot choices and the game's random() (spawns, spread). |
show_live | boolean | A bot also plays live in the viewport, in real time, so people see what is being tested: it starts with the measured runs and keeps playing (run after run) until stopped with play_mode (default true; not while someone is already playing). |
threat_tags | list of string | Default [guard, enemy]. |
wait | number | Seconds to wait for the report (default 40, at most 50). Longer stress tests keep running in the background and reply with a job id: call autoplay {"job": id} for the report. The editor stays responsive either way. |
watch | boolean | Play one run live in the editor's viewport in real time (Play mode, camera on the player) so people can watch; returns at once. Stop with play_mode. With a seed, every watched run replays that seed exactly (a benchmark route); without one each round differs. |
check_asset
Standard validity checks for a forged model or character, before anyone looks at it: connected parts, parts floating off the body (with the gap in mm and where), watertight (open and non-manifold edges), flipped or inside-out faces, degenerate triangles, scale sanity (with a units hint: authored in cm?), and broken data. With prop (a model with grip_start/grip_end points) and character, also the grip on every frame of the character's clips: palm-to-handle distance and handle-vs-grip-axis angle, with the failing frames. Writes Bench/<name>/validity.json. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.
| Argument | Type | What it does |
|---|---|---|
allow_floating | list of string | Piece names meant to float. |
allow_open | boolean | Open sheets are fine (cloth, leaves, cards): don't fail on open edges. |
attach_position | list of number | Prop origin in the hand joint's frame (m). |
attach_rotation | list of number | Prop rotation in the hand joint's frame (degrees x, y, z). |
character | string | A TTR Body or creature in Assets/Characters (eyes, hair and cards are left out). |
clip | string | Only this clip (default: every clip the character carries). |
creature | object | Or a creature spec inline. |
expected_size | list of number | Or [min, max] meters for the largest side. |
grip_angle_deg | number | |
grip_distance_mm | number | |
hand | r / l | |
handle | list of list of number | Handle ends [[x,y,z],[x,y,z]] in the prop's frame, if it has no grip points. |
kind | human / head / hand_prop / prop / weapon / tool / creature / vehicle … | Sets the expected size for the scale check. |
mesh | string | Or any model file under Assets. |
mode | saved / recipe_preview | saved (default): check the character's saved file; recipe_preview: rebuild it from its recipe and check that instead. |
prop | string | A held prop's model file under Assets, for the grip check. |
tolerance_mm | number | How close counts as attached (default 2 mm). |
check_dialogue
Check the project's branching dialogue files (Dialogue/<id>.dialogue.json): errors that stop one from playing right (a goto to no node, a condition or action that can't be read, a node with both next and choices, empty choice text, more than 6 choices) and warnings (nodes never reached, missing voice files). Give `id` for one conversation, with its node and choice counts. Format: { start, nodes: { name: { speaker, text, portrait, emotion, side (left/right), voice (Sounds file), next, choices [{ text, if, do, goto }] (at most 6), if, else, do, end } } }. Conditions: flag:key, has:item[:n], state:key>=n (== != >= <= > <), quest:id=active (locked/open/active/done/failed), seen:dialogue.node, ! negates, && and ||. Actions: set:key=value, set:key+n, give:item[:n], take:item[:n], quest:id>start|done|fail|objective[+n], send:message, cutscene:name. A node with no text is logic only (its do runs, it goes straight on); a node whose if fails goes to its else (or ends).
| Argument | Type | What it does |
|---|---|---|
id | string | One conversation's id (its file name without .dialogue.json); all when left out. |
check_quests
Check the project's quest files (Quests/<id>.quest.json) against its conversations and this scene: errors (unknown objective kinds, missing fields per kind, a talk objective on a node that isn't there, duplicate ids, bad reward actions, quests after missing ones or after themselves) and warnings (reach objects not in this scene, journal lines never written). Format: { title, summary, after [quest ids], auto_start, objectives [{ id, text, kind, item, count, key, dialogue, node, at, radius, tag, optional }], journal { start, <objective id>, done, failed: line }, reward { items { id: n }, do [dialogue actions] } }. Kinds: item (item, count), count (key, count), flag (key), talk (dialogue, node), reach (at, radius m, default 3), kill (tag, count), script (only by hand). State lives in the game state (quest.<id>.state etc.), so it carries across scenes and saves.
No arguments.
check_request
Before saying done, check every word of the person's request yourself: splits it into checkable claims ("a big red rotating cube" → big, red, rotating), finds the object each describes, and checks each against the scene and a short headless play on a copy (size from the mesh and scale, colour from the material, rotating/moving/falling/bouncing measured over the play, glowing, solid, physics, in the middle). Answers MET / NOT MET / UNCHECKED per claim with the numbers. Never tell the person to "hit Play to see it": fix what's NOT MET and check again.
| Argument | Type | What it does |
|---|---|---|
request required | string | The person's last request, in their words. |
seconds | number | Seconds of headless play for motion claims (default 2, max 10). |
check_sights
First person: check a gun's sights the way the game holds it (a character with view "first_person" and the shooter kit's gun.js): finds the sight line on the gun's model (rear and front sight, or a red dot's axis), aims down it for cameras looking level, up, down and turned, and reports how far the drawn rear and front sights land from the screen's centre at 1920×1080 (through the view model's field of view; aligned is under 1 px), then flies a bullet zeroed at `zero` m and lists where it passes the sight line at 10, 25, 50, 100 and 200 m (cm above + / below −). `view` takes gun.js's first-person data (sight, eye_relief, zero, view_fov, ads_view_fov, view_scale, ads_zoom) to try values before putting them in the kit's params.
| Argument | Type | What it does |
|---|---|---|
prop required | string | The gun object (name or #id). |
speed | number | Muzzle speed m/s (default 880). |
view | object | First-person data as gun.js's game.weaponView takes it. |
clip_check
Clothes clipping, measured (Gordon: clothing that never clips): a character's skin, garments and worn gear (things attached to its bones: a carrier, boots, a helmet; not what the hands hold) as drawn, frame by frame for `seconds` (live in Play while it moves: walk, run, crouch, raise the arms) or once now. Two kinds: POKE, a layer showing through the one over it (skin through a sleeve, a shirt through the vest, a trouser leg through a boot), and INTO, a piece cutting into another limb's flesh (the vest's edge in a raised arm, a thigh into the carrier, a boot shaft in the calf). Reports the deepest of each, where, in which frame, and every clip pair with its count and depth; mark: true draws the worst points live (red pokes, magenta into). Clips over 2 mm (poke) and 3 mm (into) count; depth at rest is subtracted.
| Argument | Type | What it does |
|---|---|---|
fps | number | Frames measured per second while watching (default 6; each takes a moment). |
mark | boolean | Draw the worst points of the last frame over the picture (false clears). |
pairs | integer | How many clip pairs to list (default 12). |
seconds | number | Watch this long (0: one frame now). Drive the motion meanwhile, e.g. play_input with wait false. |
target | string | The character's object name (default: the player, else the only character). |
clothes_check
Clothes clipping on a character, in plain words, with a red view (Beta 2 fix tools; any outfit and body, forged or imported): watches it for `seconds` (in Play while it moves: drive it with play_input wait false; 0 one frame now) and says where clothing goes through the body ("the shirt cuts 2.1 cm into the left forearm (t=1.4 s)", "skin shows through the trousers at the right thigh"), how deep, how often, and the fix for each (clothes_fix, clothes_fit). show: true marks every clip on the character: red where a layer shows through the one over it, amber where cloth measures inside a limb (bigger = deeper; false clears). Also lists its garments and the fit in force (looser/tighter per garment from clothes_fit, fixes from clothes_fix). clip_check gives the raw numbers.
| Argument | Type | What it does |
|---|---|---|
fps | number | Frames checked per second while watching (default 6). |
limit | integer | How many clips to describe (default 10). |
seconds | number | Watch this long (default 0: one frame now). |
show | boolean | The red view on the character (default true; false clears it). |
target | string | The character's object name (default: the player, else the only character). |
collision_view
Shows what bullets and feet actually meet: every collider within 40 m of the camera drawn over the picture as its boxes, coloured by what each is made of (a forged model's parts: wood orange, fabric violet, glass cyan, metal blue, ceramic white, plaster cream, plastic green, stone grey; a plain collider whose material is only guessed from its names grey; walk-through zones yellow). Lists boxes by material and the drawn objects with no collision at all. Edit and play; never saved. Forged models carry their own part boxes (collider shape "parts").
| Argument | Type | What it does |
|---|---|---|
on | boolean | Draw the collision view (default: leave as it is, report only). |
combat_report
Read who hit whom, simulation ticks, move frames, zones, guard/dodge outcomes and actual damage. With seconds>0 plus actor/target, run the real sparring bot on an isolated scene clone; no teleport or direct damage. Otherwise read this engine's live combat or the last unchanged-scene simulation. No run means authoring-only, never an invented pass. The combat_knockout proof requirement uses the same movement and attack path. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.
| Argument | Type | What it does |
|---|---|---|
actor | string | Existing entity name or #id. |
distance | number | |
limit | integer | |
move | string | |
seconds | number | |
target | string | Existing entity name or #id. |
compare_reference
Check a model against a reference drawing: one view of a three-view (side, top, bottom, front, back) is filled into a silhouette, the model is drawn alone from that exact direction, and the two are lined up and compared: a match score, a picture (red where the drawing has shape the model lacks, blue where the model has extra) and, station by station, how many meters each edge is off. Drawings go in Assets/References/<model>/.
| Argument | Type | What it does |
|---|---|---|
crop | list of number | [x0, y0, x1, y1] pixels: the one view to use from a sheet of several. |
image required | string | The drawing, relative to Assets/References (e.g. super_hornet/three_view_lines.png) or a full path. |
mesh | string | A model path instead of an object, e.g. Forge/super_hornet.glb. |
mirror | boolean | Flip the drawing left to right (the model's nose is on the left). |
target | string | Object whose model to compare (or give mesh). |
view | side / top / bottom / front / back |
crash_test
Measure a 40–100 km/h barrier crash (default 60). With object, exercises native part detachment and vertex dents on the authored car, returns a real rendered still and verifies source preservation. Preset-only is explicitly numerical. Reports measured impact speed and energy. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.
| Argument | Type | What it does |
|---|---|---|
object | string | |
preset | sports / sedan / suv / pickup / truck / kart / motorbike | |
speed_kmh | number |
culling
What the camera drew last frame and what it left out, and why: outside the view, wholly in a room nobody can see, or hidden behind last frame's depth (occlusion; it stands down while the camera moves fast, and the report says when and why). Also the clustered meshes (virtual geometry) and the detail levels drawn. Switch a stage off and on (occlusion, frustum, virtual_geometry, lod) to measure what it saves with frame_profile at the same camera; switches last until set again.
| Argument | Type | What it does |
|---|---|---|
error_pixels | number | Models whose detail levels carry a measured error draw the coarsest level whose error stays under this many pixels at the model's nearest point (default 1: can't be seen; 0: by the whole model's size on screen, the old rule). |
forest_far | number | Forests: cells farther than this many metres aren't drawn (default 1600). |
forest_far_field | boolean | Forests: past the far distance, the canopy to the horizon (default on; off: nothing past it, A/B). |
forest_gpu | boolean | Forests: far trees' instances written on the GPU from 16 bytes a tree (default on; off: the CPU writes them, A/B). |
forest_near | number | Forests: trees in cells within this many metres of the eye draw as ordinary objects (ray-traced shadows, bounced light, twigs); farther ones in batches by cell (default 64; 32 m sub-cells). |
frustum | boolean | Objects outside the view left out (default on; off draws everything, for A/B only). |
lod | boolean | Coarser detail levels by size on screen (default on). |
occluder_boxes | number | Most occluder boxes drawn a frame, biggest on screen first (default 256). |
occluders | boolean | Placed buildings' box occluders drawn for this frame when last frame's depth can't be used (a moving camera) (default on; off for A/B). |
occlusion | boolean | Objects behind last frame's depth left out (default on). |
placements_near | number | Placements: copies within this many metres draw as ordinary objects (default 150; the rest as instance runs). |
skin_levels | boolean | Characters posed only at the vertices of the level they're drawn at (default on; off poses every vertex, for A/B with frame_profile). |
tree_cards | number | Twig trees keep their own twigs (cards past the twig line) over full wood out to this many times the twig line, then cross-fade to their first level (default 2.5; 1: hand over at the line). |
virtual_geometry | boolean | Dense meshes drawn as clusters culled on the GPU (default on). |
voxel_trees | boolean | Far trees drawn as voxels (default on; off: their coarsest triangles: in a big forest bring forest_far in first). |
debug_overlays
The play systems' debug views drawn over the picture (Engine.debugOverlays), by name: with no arguments, which are on and how many boxes each draws from the camera now. `off` "name" (or "all") switches views off. Each view is switched on by its own system's tool (crumple {view: {on: true}}: the crumple lattices coloured by strain).
| Argument | Type | What it does |
|---|---|---|
off | string | A view's name, or "all": switch it off. |
debug_view
Watch a game closely: switch debug views on or off over the picture (colliders: the collision view, every collider's boxes coloured by material, as collision_view; triggers: cyan boxes; joints: a line from each pin to what it holds, coloured by kind; cloth: each world cloth's edge, its pins as orange dots and red where it's inside something solid, and in the editor it runs the cloth too) and set the play speed (1 real time, 0.5, 0.25, 0.1: slow motion for a jump, a hit or a joint; nothing saved changes). The person has the same in the toolbar (the eye and the speed buttons). debug_overlays lists every view that's on, the systems' own too (crumple, magnet, board).
| Argument | Type | What it does |
|---|---|---|
hide | list of colliders / triggers / joints / cloth / all | Views to switch off ("all": every one of these). |
show | list of colliders / triggers / joints / cloth | Views to switch on. |
speed | number | Play speed, 0.02 to 4 (1: real time). |
deformation_critic
Judge how a rigged character's skin holds up as it moves: every major joint through its range one at a time (shoulder, elbow, forearm roll, wrist, hip, knee, ankle, spine, neck) and six reference poses (deep squat, arms overhead, forward lean, mid-stride, cross-body reach), skinned as the engine skins. Per joint region: the worst volume change (flesh doesn't compress), crumple (crinkled skin), folded triangles, shading break and seam gap, each with the pose it came from; each limb's narrowest section (candy-wrapper twists); skin inside skin. Scored against the bars a body keeps in motion. show: a pose label from the report, held on the character for pictures (rig_release gives it back). HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.
| Argument | Type | What it does |
|---|---|---|
entity required | string | The character (name or #id). |
poses | all / range / reference | Which poses (default all). |
show | string | Hold this pose (a label from the report, e.g. "elbow 145°", "ref deep squat") on the character and judge only it. |
steps | integer | Samples per joint sweep (default 6). |
surface | skin / all | Judge the skin only (default) or everything worn too (clothes fold and crumple on their own). |
detail_critic
Detail Critic: judge how the scene reads up close, from the editor camera or a viewpoint, with the real renderer: texture detail at three scales, colour variation, roughness variation (not one plastic gloss), edges that catch light, shimmer as the camera moves a fraction of a pixel (against a supersampled reference), blotchy patches on flat surfaces, sharpness and the difference to the reference. Each score has a gate; under it fails with the reason. Returns a sheet (final, reference, normals, base colour) with the scores. Mac renderer only.
| Argument | Type | What it does |
|---|---|---|
channels | boolean | With save: also save <save>_roughness.png (the material channel the roughness check read, roughness in red) and <save>_regions.png (the surfaces the colour and roughness variation checks measured, each its own colour; black = creases, outlines and pieces under 150 px). surface_regions_share reports how much of the frame they cover. |
checks | list of string | Only these checks (an explicitly partial inspection: the best verdict is PARTIAL and names what wasn't checked). Default: all; PASS only when every check ran and passed. |
fov | number | Lens, degrees (default the editor camera's). |
frames | integer | Frames in the shimmer sequence (default 6; 0 skips it). |
from | list of number | |
height | integer | Default 540. |
look_at | list of number | |
reference_scale | integer | Reference resolution per axis (default 4: 16 samples a pixel). |
save | string | Save the sheet and scores as Bench/detail/<save>.png and .json. |
shimmer_lift | number | Stops 0...5 to brighten the shimmer sequence by (default: from the frame's median, shown as 'judged N stops brighter'). For attribution only: judge a before and an after at the same lift, so a darker after isn't judged brighter with clipped highlights. The verdict to report is the default one. |
width | integer | Default 960. |
drive_test
The car's feel report, which every car must pass: three racing-driver laps (lap-time consistency, slip angle, off-line distance), a panic swerve, a lane change and a handbrake turn (spin-outs; only the handbrake may drift), with what to change when it fails. Then a 32-gate circuit at three assist levels: with object, the authored car and meshes in a separate native PlaySession with a real rendered still; with preset only, a labelled numerical fixture. Never edits source art. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.
| Argument | Type | What it does |
|---|---|---|
object | string | |
preset | sports / sedan / suv / pickup / truck / kart / motorbike |
editor_layout_check
Check the editor's panels the way a person reads them: buttons or labels whose words don't fit, controls on top of each other, controls past the panel's edge. Name a panel, or leave it out for every panel. narrow: true checks at the side docks' narrowest width, then puts them back.
| Argument | Type | What it does |
|---|---|---|
narrow | boolean | Check with the side docks at their narrowest width. |
panel | string | A dock panel's id. Leave out to check every panel. |
equipment_report
What a character has on: each slot's item and how it's worn (fitted cloth, or riding which bone), the model it draws, fits not made yet, and anything that couldn't go on. Without an entity: every item in Assets/Items that can be worn or held, by slot, and item files that don't read. Check clipping in motion with clip_check.
| Argument | Type | What it does |
|---|---|---|
entity | string | The character: name (e.g. "Rowan") or id (e.g. "#7"). |
escape_check
Can the player get out, or get stuck? (Play.) Floods every place the player can reach from where they stand (or `from` [x, y, z]) over the scene's real colliders with the player's own body and moves: walking with its step height, dropping off edges, and jumps as high and as far as its jump speed and sprint carry it. Reports WAYS OUT (ground reached outside the boundary: the hull of every collider tagged "boundary", or `bounds` {min: [x, z], max: [x, z]}; and any walk or jump off into nothing), TRAPS (places it gets into and can't get out of, with the way in) and PERCHES (the highest things it can stand on, and the jump that gets there: is each meant to be climbed?). Cells of `cell` m (default 0.5; a snag smaller than that is for play_input walks). Holds the game still while it runs (up to `seconds`, default 40; then it reports what it has, marked unfinished). Run it after every change to a level's edges, with sense_check.
| Argument | Type | What it does |
|---|---|---|
bounds | object | |
cell | number | |
from | list of number | |
jumps | boolean | |
limit | number | |
seconds | number |
feel_check
Does the fight feel right? (Beta 2, 3D game feel) Plays the scene headless for `seconds` (its own fighters, brains and scripts; inputs drive the player like play_test's, e.g. [{from: 0, to: 8, move: [0, 1], fire: true}]) and reports every hit's feedback: hit-stop, camera shake, what flies off what was hit, its sound, the hit flash, a kill's slow motion, the controller's rumble, naming what was missing and on how many hits. With feel settings (shake, flash, hit_stop, rumble, effects) it checks the game as tuned. Nothing in the scene changes. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.
| Argument | Type | What it does |
|---|---|---|
effects | boolean | Particles, flashes and extra sounds (false: off; the hits themselves never change). |
flash | number | × the hit flash on bodies. |
hit_stop | number | × hit-stop (the hold on a hit). |
inputs | list of object | The player's controls over the run, as play_test's inputs. |
reduced_motion | boolean | No shake or slow motion, softer flashes. |
rumble | boolean | The controller's rumble on the player's hits. |
seconds | number | How long to play (default 10). |
shake | number | × the camera shake on hits (0 off, 1 as made). |
fit_check
Check how a forged model's parts fit together like a real assembly: every pair of parts that come near each other with the gap between their surfaces and how deep one is sunk into the other (2 mm tolerance), groups floating free of the main body (a wing or light hovering off the hull), and parts poking through glass. snap: true fixes floating groups by moving each onto the body (nearest first, 1 mm in) by adding f.fit({snap: true}) to the recipe and rebuilding, then reports again. For a separate model in the same frame (a glow-lights model on a hull) pass against: the other recipe, so it is checked sitting on that one. In recipes: f.socket / f.attach join faces, f.mount slides a part onto a surface, f.fit reports and snaps. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.
| Argument | Type | What it does |
|---|---|---|
against | string | Another recipe in Assets/Forge ("hb_racer.js") whose parts this model sits on in the same frame: checked (and snapped) with them in place. |
name required | string | The Forge model: its recipe is Assets/Forge/<name>.js. |
snap | boolean | Move floating groups onto the body and rebuild the model (default false: report only). |
tolerance | number | Meters (default 0.002): gaps and depths above it are reported. |
frame_governor
The frame governor: holds the frame rate on the fly without switching anything off. Over budget, it turns down one small step at a time what the eye notices least (bounced light re-learning more slowly, more minor lamps folded into light cuts' residuals, fewer light shaft steps, a coarser traced bounce, the render scale last), measures what each step saved and takes back any that saved nothing, and gives steps back when there is room. On while playing by default. Reports what it holds and what it did.
| Argument | Type | What it does |
|---|---|---|
mode | auto / on / off | auto (default): on while playing; on: also while editing; off: never. |
target_fps | number | The frame rate to hold (default 30, Gordon's 30+ target; TTR_GOVERNOR_FPS). |
frame_profile core
Where the frame's time goes, measured live without turning anything off: every render stage's GPU time per frame (and CPU encoding), the frame interval and GPU busy time, whether the GPU or the CPU is the limit, and why the expensive stages cost what they do, by name: the lamps whose shadow maps were drawn again and the reason (the light moved, a caster it reaches changed, a moving character in it), the static casters that changed, the moving casters. Use it before optimizing anything (and after, with the same camera) instead of switching features off to guess. mode isolated times each stage alone (exact, but the frame slows down while measured). With experiments, surface_features or skip_passes, an HTTP call returns a job_id at once: read the result with tool_job.
| Argument | Type | What it does |
|---|---|---|
camera | object | Measure from this view: the camera is moved here first (even with Follow AI off) and left there, so the person sees what was measured. Omitted: the view as it is (the report still says what it was). |
experiments | list of all / lamp_shadow_maps / contact_shadows / light_cuts / light_reach / light_shafts / full_res_shafts / screen_reflections … | Also measure what features cost here: each is switched off for `seconds`, measured, and switched back (live: the view shows it off meanwhile), against the frame with everything on. "all" runs every one. For finding where the time goes, never as the fix. |
freeze | boolean | Hold the game still while measuring (a live fight changes the picture frame to frame; frozen, an A/B reads only the setting). Put back as it was after. |
limit | integer | Stages to list (default 18). |
mode | live / isolated | live (default): the frame keeps its pace, each stage charged the GPU time it adds. isolated: each stage runs alone while the CPU waits (exact per-stage costs; the fps measured then means nothing). |
seconds | number | How long to measure (default 3, max 20). |
skip_passes | list of string | Passes to leave out one at a time, measured like experiments (what each costs inside its stage): any pass by name ("Meshes", "Scene depth", "Glass", "Strand hair" ...) or a part of the meshes pass: "Meshes: objects", "Meshes: land", "Meshes: ground cover", "Meshes: surfaced" (objects with scanned or recipe surfaces), "Meshes: pile shells". |
stills | string | A folder to save the experiments' comparison stills in (reference.png, reference_again.png, then one per experiment), to look at what each changes. |
surface_features | list of all / board_grain / decals / decay / detail_volume / dust / edge_wear_and_chips / floor_traffic … | Material recipe features (walls, floors, wood: the surfaced objects) left out one at a time, measured like experiments: what each costs to shade. |
warmup | number | Seconds to wait first (default 0.5). |
frame_timing
Measure performance honestly: records every frame for a while (after a short warm-up) and reports the distribution of frame intervals and GPU time (median, p95, p99, max, frames over the 60 fps budget), plus the render resolution. Use it for before/after comparisons with the same camera and scene; engine_overview's GPU figure is a smoothed average that hides periodic spikes.
| Argument | Type | What it does |
|---|---|---|
seconds | number | How long to record (default 8, max 60). |
warmup | number | Seconds to wait first (default 2). |
game_brief
The person's game in their own words: the pitch (what they asked for), what they said no to (avoid), the brief's requirements, the Game Plan's protected decisions and the next build-path step. Read it before changing a game you didn't just start; write the pitch when a new game starts ({pitch: their request, as they said it}) and add each "no" they give ({avoid: "no guns"}). Stored with the open scene's brief (Briefs/<scene>.brief.json).
| Argument | Type | What it does |
|---|---|---|
allow | string | Take one thing off the avoid list (the person changed their mind). |
avoid | string | Add one thing the person said no to ("no guns", "never a timer"). |
pitch | string | The person's request in their own words (replaces the pitch). |
title | string | The game's name. |
game_ui_actions
List the game's named input actions as players get them: keyboard keys, mouse buttons, controller buttons, and the prompt glyph on each controller family (Xbox, PlayStation, Nintendo). Shows conflicts. Read only.
| Argument | Type | What it does |
|---|---|---|
scene | string | Optional scene name for its own UI layout (UI/Scenes/<scene>.ui.json); omit for the project default. |
game_ui_lifecycle
Give a game the full lifecycle with no code (stock plain-row menus are rebuilt; a custom authored menu is kept exactly as it is and the reply lists what it lacks): title (Continue / New game / Load / Settings / Quit), save and load pages with slot names, time played and thumbnails (slot 0 is the autosave), pause with Save / Load / Retry from checkpoint, game over with Retry / Restart / Load, controls with keyboard and controller rebinding, dead zone and reset, accessibility (reduced motion, fewer flashes) and full screen. Keeps the layout's HUD, shop, dialogue and theme. Optionally declares named actions (controls: id, logicalKey, pad buttons a/b/x/y/lb/rb/lt/rt/l3/r3/view/dpad_*, label) and the game's save-state version with migrations (UI/save_schema.json). Add a game_flow component (autosave_seconds, retry, lives) and checkpoints: checkpoint_2d areas in 2D; in 3D a trigger whose script calls game.flow.checkpoint("Gate") when the player enters (kit_playbook game-ui).
| Argument | Type | What it does |
|---|---|---|
control_sets | object | Context control sets: {"vehicle:jet": [controls...], "on_foot": [...], "menu": [...]}, each like controls. A set's keys and buttons replace the standard actions' (Space can fire in the jet and jump on foot). Scripts switch with game.controls(name); getting into a car / boat / aircraft picks vehicle:<preset>, vehicle:car / vehicle:boat or vehicle:jet / vehicle:aircraft, then vehicle; the pause menu's Controls page and rebinding follow the set in use, saved per set. |
controls | list of object | Named actions: {id, logicalKey, defaultKey?, pad?: [buttons], label?}. A declared controller button moves off the engine action that had it. |
drop | list of jump / interact / inventory | Standard actions this game has no use for (a builder has no jump): their keys are free for the game's own controls. |
look3d | boolean | Keep mouse-look sensitivity / invert rows on the controls page (default: false for 2D scenes). |
migrations | list of object | [{from: 1, rename: {old: new}, defaults: {key: value}, remove: [key]}], one per version step. |
save_version | integer | The game's save-state version (1...10000). Older saves upgrade on load through migrations. |
scene | string | Optional scene name for its own UI layout (UI/Scenes/<scene>.ui.json); omit for the project default. |
title | string |
game_ui_saves
Read a game's save slots from the editor's saves folder (Saves/): each slot's status (ok, empty, newer, damaged), name, scene, time played, checkpoint, game state version, thumbnail and backup. action restore_backup puts a slot's previous save back; delete moves a slot to the Trash.
| Argument | Type | What it does |
|---|---|---|
action | list / restore_backup / delete | |
scene | string | Optional scene name for its own UI layout (UI/Scenes/<scene>.ui.json); omit for the project default. |
slot | integer | 0 (autosave) ... 99 |
ground_check
Quality check: is anything floating above the land or sunk into it? Measures every placed model (or one group, or named objects) against the terrain under it: the base of its box against the ground at its middle and part way out to its corners (plants and trees at the middle only, where the trunk stands). Lists floating objects with their gap, sunk ones with their depth, and how many sit right. settle: true moves every floating one down to rest `sink` metres into the land (one undoable step); run it after placing anything outdoors.
| Argument | Type | What it does |
|---|---|---|
group | string | Only objects in this group. |
limit | integer | Most objects listed in each kind (default 40). |
names | list of string | Only these objects. |
settle | boolean | Move every floating object down onto the land. |
sink | number | With settle: how far into the ground the base ends (default 0.05 m). |
sunk | number | Metres below the ground the base may go before it counts as sunk (default 1.5). |
tolerance | number | Metres of gap under the base that count as floating (default 0.08). |
hang_report
Every moment the editor's main thread stopped answering for over 100 ms this launch (the spinning wheel is one that reached about 2 s): how long, what was running (tool, scene open, forge...) and the hottest code frames. Use it after a change that could freeze the editor; reset: true starts a fresh count.
| Argument | Type | What it does |
|---|---|---|
json | boolean | Every stall as JSON (with the full sampled stack). |
limit | integer | How many of the worst stalls to list (default 15). |
reset | boolean | Clear the list after reading it. |
hold_check
Check each hand's hold: fails on a finger floating more than 2 mm off the object, the hand more than 1 mm into it, a wrist bent past 20°, or a palm more than 5 mm off its hold point. Returns the readout either way.
| Argument | Type | What it does |
|---|---|---|
entity required | string | The character (name or #id). |
impact_analysis
Before (or after) changing objects: what depends on them. Game Plan requirements and protected decisions that name them, plan routes that pass them, scripts and attachments that refer to them, engine capabilities they rely on (and how proven), which tests go stale, and whether to rehearse first.
| Argument | Type | What it does |
|---|---|---|
change | string | What you mean to do, in a few words ("delete", "move", "make destructible"). |
objects required | list of string | Names of the objects to change. |
import_report
The last import's report (Logs/last-import.json): every item with what came in, what was fixed, and what failed and why.
No arguments.
inspect_bench
Inspection Bench: see exactly how a generated character, creature or model differs from its reference sheet. Cuts the sheet into views, solves each view's camera and light so the model's render lies on the picture pixel for pixel, then returns a bench sheet per view (reference, model, 50% overlay, edge overlay, red/blue outline difference, shading or normal-map difference, close-ups at a fixed real-world scale) and a critic report: overlap, outline and edge distances in mm, landmarks, detail per scale band (too smooth = cartoon), colour ΔE, symmetry, and the worst regions ranked with a suggested sculpt_edit for each. Cameras are saved beside the sheet (.bench.json) for next time. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.
| Argument | Type | What it does |
|---|---|---|
character | string | A TTR Body or creature in Assets/Characters (its recipe is rebuilt with bones, so regions are named parts). |
creature | object | Or a creature spec inline (as forge_creature takes). |
image required | string | The reference sheet, relative to Assets/References (e.g. lion/flow_lion_sheet_4k.jpg). |
mesh | string | Or any model file under Assets (regions are then boxes: upper front left…). |
normals | string | A normal-map sheet laid out like the colour sheet, for normal comparisons. |
panels | list of integer | Only these views (0 = leftmost). |
patch_mm | number | Close-up size (default 6% of the model). |
regions | joints / joints+face / joints+creature / box | |
sculpt | list of object | Try sculpt edits first without saving them (same form as sculpt_edit's ops). |
show_turntable | boolean | |
turntable | integer | Turntable views to render (default 8, 0 none). |
views | list of string | Labels for the sheet's views left to right: front, back, side, left, right, three_quarter. Default: guessed. |
items_report
What a project's Assets/Items holds (items, loot tables, recipes, shops) and every problem: files that don't read, names nothing defines, recipes no station can make, shops selling things with no price. With "id", one thing in full.
| Argument | Type | What it does |
|---|---|---|
id | string | One item, table, recipe or shop to show in full. |
lab_run
Run a Motion & Interaction Lab station: its scene's bot repeats the move many times with random variation (body size, speed, approach angle, strength...), every trial measured (the bot's own scores plus foot sliding and soles in the ground from the drawn poses, and the frame time) and judged by the station's bars. A move counts as working at 98% of trials passing (500 trials for the record). Returns the pass rate, each score's spread, the failing trials with what was varied, and writes <station>-report.json/.txt and a contact sheet of the first trials' telling moments into `out`. Opens the station's scene in the editor (refused with unsaved changes); play it to watch the bot live.
| Argument | Type | What it does |
|---|---|---|
out | string | Folder for the report and sheet (default <project>/LabReports). |
seed | integer | The bot's random seed (default 1): the same seed repeats the same trials. |
sheet | boolean | Also render a contact sheet of the first 9 trials (default true). |
station | string | Which station: bump_push, rough_ground, stepping_stones. |
trials | integer | How many (default 100, max 1000; 500 for the record). |
listen
Hear the game: records what it's playing for a few seconds (works while the editor is muted) and reports loudness over time, peaks and clipping, where the energy sits (rumble to hiss), brightness, a spectrogram picture, and which sounds played how far away. Use it to judge sound like inspect judges looks; start Play first.
| Argument | Type | What it does |
|---|---|---|
seconds | number | How long to listen (default 3, max 10). |
machine_profile
What this computer can run: GPU, memory, the graphics tier to use and which advanced systems (ray-traced shadows, GI, volumetric clouds, dense forests, upscaling) to turn on or keep off for a smooth frame rate.
No arguments.
memory_report
How much memory the editor uses and where it goes: the process footprint (what Activity Monitor shows), the GPU total, GPU memory by renderer part (models, surfaces, render targets, shadow maps, bounced light, reflections, hair) and the models holding the most. Use it before and after a change that could grow memory, and when the Mac slows down.
| Argument | Type | What it does |
|---|---|---|
detail | boolean | Break renderer parts down one level further. Default false. |
json | boolean | Return exact byte counters as JSON for memory budget measurements. |
models | integer | How many of the largest models to list (default 12). |
movement_score
The AAA movement scorecard: drives the third-person player through the real controls on a fixed course (starts from standing, stops, 90° and 180° changes walking and sprinting, a slow walk, running while the view swings; or `legs` of your own) and measures every drawn frame: (1) reaction, ms from a stick change to the body's hips visibly answering (and the first foot lifting from standing); (2) speed tracking, how closely the body's speed follows the speed the stick asks and the time to 90% of it; (3) foot slide, cm a planted foot slides; (4) PoseAnatomy failures (hinges folding backwards, limbs twisted past a person's range, feet backwards, hands in the body) per frame; (5) pivot, time and foot slide on each 180° reversal; (6) camera jitter and jerk. Each number beside its AAA target, with why. Starts and returns at once; call again with report true when the course is done (it hands the controls back).
| Argument | Type | What it does |
|---|---|---|
camera_offset | list of number | [x, y, z] world metres: show the drive from a camera travelling with the player at this offset, not turning with it (the legs from the side through a turn). |
crouch | list of integer | Legs (numbered from 1, as the report numbers them) during which crouch is held: a crouch walk, or into a low gap a belly crawl. |
follow | boolean | Show the player's own camera in the viewport during the drive (for filming it): by default the viewport stays where it is. |
legs | list of list of number | A course of your own: [seconds, stick right, stick forward, view turn deg/s, sprint 0/1] per leg. |
report | boolean | Score the last drive and hand the controls back. |
nature_report
What nature the scene has: ground-cover layers (kind, area, density, expected plants, painted share), water bodies (kind, size, level, flow), waterfalls, the wind; with `point` [x, y, z], what the water does there (in water? surface height, flow, depth).
| Argument | Type | What it does |
|---|---|---|
point | list of number |
play_clip
Film a moment of play (Beta 2): plays the scene headless for `seconds` (2-3 is a hit, a jump, a door; up to 10) with play_test's inputs and camera, and answers a contact sheet of `frames` evenly spaced stills (default 8, labelled with their time) plus an MP4 of every frame at `fps` (default 30) in `dir` (default a new folder in the project's Captures). See motion, impacts and timing frame by frame: a hit's hit-stop and flash, a sail parting round a body, a landing. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.
| Argument | Type | What it does |
|---|---|---|
animate | boolean | Step the animation systems every tick as the live game does (default true: a clip is for seeing motion; false films the poses play_test's default leaves). |
camera | editor / player / game | Whose view (as play_test). |
camera_follow | list of number | As play_test's: [right, up, back] metres from the player in its own facing, a camera that travels with it. |
camera_look_at | list of number | |
camera_position | list of number | |
dir | string | An absolute folder for the movie (default Captures/clip-<time> in the project). |
fps | number | Movie frames a second (default 30). |
frames | integer | Stills on the sheet (default 8). |
from | number | Start filming this many seconds in (default 0): the run plays up to it first. |
inputs | list of object | The player's controls, as play_test's. |
seconds | number | Length (default 3). |
ui | boolean | Draw the game's own UI over it (default true; false films the scene alone, no HUD or hint over the character). |
play_eval core
Run a little JavaScript in the live game (Play mode) as its scripts see it (game, world, input and what the kits publish: game.builder, game.strategyCamera...) and get the value of its last expression back as JSON. Read state (game.builder.money, world.all("villager").length) or set a test up (a time of day, the weather, coins, a piece placed). Runs on the game's next tick; nothing is saved to the scene; an error comes back with its message and stack. Doesn't take the person's controls. While a menu or a dialogue holds the game (no tick comes), it reads the game as it stands, without stepping time.
| Argument | Type | What it does |
|---|---|---|
code required | string | Statements or an expression; the last expression's value comes back. |
play_input core
Play the live game (Play mode) through the player's own controls, like a person: move [x, z] (a stick: x right, z forward, -1...1, as play_test's inputs take it) or hold keys (keys "w", "wa", "s"...; any other key in it is held for the game's scripts: "1", "q"), press (keys with longer names, for the scripts: ["SPACE"], ["RETURN"]), sprint, crouch, jump, fire (left button), aim (right button: aim down sights), reload (R), use (E), turn [yaw°, pitch°] (yaw positive right, pitch positive up) spread over the time, look_at [x, y, z] (turns there at up to 540°/s), or track_zombie (keeps the nearest visible zombie's chest under the crosshair; fire_on_target: tracks too and holds the trigger only while one is under the crosshair), for `seconds` (0.05...10). Takes the controls on first use (the keyboard is ignored until play_release). wait (default true): return when the command is done, with play_state's report. Works in games without a player character too (builders, strategy, card and rhythm games): keys and buttons go to the scripts, and pointer [x, y] (-1...1 across and up, as input.pointer() reads it) or point_at [x, y, z] (a world point, kept under the pointer as the camera moves) puts the pointer there until play_release; a click is fire with the pointer on it. While a menu or a dialogue holds the game, the keys go to it as a person's do: press ["RETURN"] (or use / fire) goes on, arrows or keys "w"/"s" move, ["ESCAPE"] goes back.
| Argument | Type | What it does |
|---|---|---|
aim | boolean | |
crouch | boolean | |
fire | boolean | |
fire_on_target | boolean | |
jump | boolean | |
keys | string | |
look_at | list of number | |
move | list of number | |
point_at | list of number | |
pointer | list of number | |
press | list of string | |
reload | boolean | |
seconds | number | |
sprint | boolean | |
track_zombie | boolean | |
turn | list of number | |
use | boolean | |
wait | boolean |
play_mode
Start or stop Play in the editor so the person can watch or play the game live. Play runs on a copy; Stop restores the scene exactly.
| Argument | Type | What it does |
|---|---|---|
on | boolean |
play_release
Give the game's controls back to the keyboard and mouse (after play_input).
No arguments.
play_report
Play Watch's report of a Play session (written when Play stops; every live session, the person's, the bot's or a replay's): issues found with where they happened (the player stuck and against what, walked through something with no collider, fell, enemies stuck, script errors, slow motion, a leak), frame spikes grouped by place with what happened around them, the slowest square metres of the map and which way the player faced, the events, and the replay file that reproduces the game. No arguments: the latest. list: the recent reports. name: one of them.
| Argument | Type | What it does |
|---|---|---|
list | boolean | List the recent reports instead (newest first). |
name | string | A report's file name from the list. |
play_sequence
Play a sequence. While the game is playing in the editor, it starts there (the person watches it live, slow motion and all). Otherwise it plays headless on a copy of the scene and reports what happened: cuts taken, events fired, story and clock seconds, problems, where tracked objects ended, and a picture of its last frame.
| Argument | Type | What it does |
|---|---|---|
name required | string | The sequence's name (Sequences/<name>.sequence.json). |
stop | boolean | Stop the one playing live. |
play_state core
What the live game knows now, as the player: where the player is, where they face and look, speed, the HUD (health, ammo, wave, points, objective, outcome), and every zombie (nearest first): distance, where it is from the player's eyes (ahead / left / right and how far round), in sight or hidden behind something, how fast it moves, and STUCK when it has made no progress for over 2 s while away from the player. Script errors too.
No arguments.
play_teleport
Move the player during Play without stopping it (editing the Player object stops Play): to `position` [x, y, z], feet on whatever is solid under it (snap, default true: a deck, a floor or the land: any collider, found straight down from 2 m above), stopped, and turned to `look_at` [x, y, z] when given. Says what they landed on: "nothing under it" means a floor you can see but not stand on. For playthroughs and checks of where a player arrives.
| Argument | Type | What it does |
|---|---|---|
look_at | list of number | |
position required | list of number | |
snap | boolean |
play_test core
Play the game headless for some seconds on a copy of the scene (or rehearsal): runs scripts, triggers and physics, then reports the outcome (won/failed), on-screen messages, script errors with lines, script logs, and a screenshot of the last frame. Optional record.video encodes the successfully recorded PNG frames as an H.264 movie with measured frame count and duration. HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.
| Argument | Type | What it does |
|---|---|---|
animate | boolean | Step the animation systems every tick as the live game does (characters walk, step and aim in the pictures). Default false (older proofs replay as they were). |
audio | boolean | With record: also write the game's sound to record.dir/audio.wav (stereo 16-bit). |
camera | editor / player / game | Default: the game camera for 2D/2.5D and for 3D games with no player on foot, else the editor camera (use "player" or "game" to see what the player sees). Explicit editor, player or game selects that view; game uses the chase camera while driving. |
camera_follow | list of number | [right, up, back] metres from the player in its own facing: a camera that travels with it, looking at its chest (side views of a run, a strafe). Needs a player character: with none (a builder, a puzzle) the view doesn't move; use camera_position with camera_look_at. |
camera_look_at | list of number | |
camera_position | list of number | |
continue_after_outcome | boolean | Keep the native run alive after a result so timed controls can use Retry, Next and credits. Default false. |
flight | list of object | 3d/jet: a bot's sortie in a flight game: [{at: seconds, goal: takeoff | launch | hold | point | attack | land | trap | sortie, heading (deg), altitude, speed, target [x,y,z] (land: runway threshold; trap and sortie: the target wire, heading the landing direction)}]; sortie fights until no enemy is left, then traps; flown with the real controls, firing when locked in attack. With record, film a whole mission. |
frames | list of number | Up to 48 capture times in seconds, greater than zero and no later than seconds. Captured during this same run, plus its final frame. |
inputs | list of object | Scripted controls, each active from `from` to `to` seconds: {"from": 1, "to": 4, "move": [x, z] (x right, z forward, -1...1), "keys": ["E", "Space"], "jump": true (Space), "fire": true, "aim": true (the right mouse button: aim; in cover, peek), "look": [dx, dy] (mouse points per tick), "sprint": true (Shift: the character runs, stamina permitting), "crouch": true (C), "wheel": 3 (mouse-wheel scroll over the step, input.wheel()'s units: positive zooms in), "point_at": [x, y, z] (the mouse over that world point, through the game's camera; with "fire": true a click there, for builders and strategy games), "pointer": [x, y] (0...1 across and up the screen)}. Example: press E at 0.5 s to get in a car, hold W 1–6 s, steer right 3–4 s. |
record | object | Write numbered PNG frames: {dir: absolute folder, fps: 30 (up to 120: every simulation tick), from, to (seconds), video: false}. With video:true also encode capture.mp4 in a folder with no prior capture.mp4 or frame_*.png. |
reset_animation | boolean | Start this copied simulation with fresh animator runtime state for deterministic proofs, instead of inheriting the editor's current clip clocks and matches. The source scene is unchanged. |
saves_folder | string | L1: an absolute folder for this run's save slots and thumbnails (default: memory, never the player's saves). |
seconds | number | Default 10, max 900 (a whole mission or sortie in one run). |
size | list of number | Picture size [width, height] for frames and recordings (default 1280 × 720, up to 3840 × 2160). |
state | object | Optional starting game.state. Omitted: an empty state, isolated from editor Play. |
ui | boolean | Draw the game's own UI (HUD, hints, menus) over the pictures and the movie (default true; false films the scene alone). |
ui_screen | string | L1: the game UI screen the run starts on ("main": the title; menus are driven by Return/Space/arrows/Escape keys or a pad input). Default: play (hud). |
wait_for_builds | boolean | While a look, the character creator's previews or streamed models are still being built, game time runs no faster than real time (at most 60 s of waiting in all), so frames show what a player would see by then; the report says how long it waited. false: run flat out. |
watch | list of string | Objects whose final positions to report. |
play_walk_to
Walk the player to a point during Play with the player's own controls (looking along the way, holding W, sprinting if asked), along a route the walking map finds for the player's body: round walls and furniture, up stairs and ramps (the zombies' map). Returns when arrived (within `arrive` m, default 0.8), stuck (where, and the waypoint it was heading for), or no route; at most `timeout` s (default 50, max 55: call again to go on). For playthroughs a person would play: walk the route, then use/look/fire with play_input.
| Argument | Type | What it does |
|---|---|---|
arrive | number | |
sprint | boolean | |
timeout | number | |
to required | list of number |
proof_report
Prove the game against its brief, for the person to read: plays each requirement of the open scene's game brief (Briefs/<game>.brief.json) in a short headless scenario and returns a table (requirement, what it means in plain words, PASS / FAIL / PENDING, the numbers behind it) with the FIRST broken requirement called out, the steps that needed a person (the goal is none), and a plain-language "How this game works" (goal, win and lose, controls, rules, what each piece does and where to tune it). Show it to the person before saying a game is done. With build, also verifies a finished build for promo: Game Plan tests, a bot playing it many times (autoplay) and frame timing, written to promo/<build>/proof.md with a caption summary. "TTR doesn't just generate, it verifies." HTTP calls return a job_id immediately; read progress and the final result with tool_job instead of repeating the tool.
| Argument | Type | What it does |
|---|---|---|
build | string | Also write the promo proof: build name (promo/<build>/). |
only | list of string | Prove only these requirement ids. Default: all. |
prompt | string | What was asked for, in the person's words. |
record_human_step | string | A step a person had to do by hand ("imported Lineman.glb from Downloads"): kept in the brief and listed in every proof until it is automated. |
runs | integer | Bot runs for the promo proof (default 10). |
seconds | number | Seconds per bot run (default 60). |
seed | integer | Scenario seed (default 1): the same seed gives the same evidence. |
title | string | The game's name for the promo report. |
quality_lab
Measure movement quality: a character runs a fixed course through the real controls (stand, run, sprint, strafe, the backward diagonal, backpedal, stop, crouch walk, turn on the spot, strafe while aiming) on a copy of the scene, and its final drawn pose is measured every step against the ground: planted-foot sliding, feet sinking into or floating above the land, foot tilt against the slope, joint snaps (pose jumps), ground slope and pose cost. Lists failed checks.
| Argument | Type | What it does |
|---|---|---|
character | string | Who runs the course. Default: the player. |
course | standard / aiming | standard (default), or aiming: walk, strafe both ways, back diagonal, backpedal, crouch walk, turn on the spot and stop, all with the weapon up. |
foot_placement | boolean | false measures without feet placed on the land, to compare. Default true. |
gate | boolean | Fail (as an error) when quality regressed past the gate's limits. |
record
Capture build footage: start/stop an MP4. Visible viewport records at up to 30 fps and may drop frames to preserve latency; hidden/covered/other-Space viewport renders offscreen with lossless frame pacing (encoder backpressure, fixed 30 fps timestamps and simulation). No extra hidden GPU work without recording. Files go to promo/<build>/ with moments.md captions; still captures are separate.
| Argument | Type | What it does |
|---|---|---|
action required | start / stop / still / note | start/stop a clip, take a still, or add a note to the build log. |
build required | string | Build name, e.g. 001-tropical-survival (folder under promo/). |
caption | string | What the moment shows, for the editor's log. |
editor_overlays | boolean | still, program view: keep the editor's own drawings (gizmo, selection outlines) in the 3D view. Default false (clean promo shots). |
fps | number | start with frames: how many a second (default 30). |
frames | boolean | start: keep the frames as JPEG files in promo/<build>/<name>-<time>-frames/ (named by milliseconds), not a movie, for a frame-by-frame check: no video encoder involved, so another program's render can't starve it. No HUD on them. |
name | string | Shot name, e.g. first-palms (no extension). |
view | scene / program | scene (default): only the 3D view. program: the whole editor window (agent panel, inspector, activity feed) with the live 3D view in it, for showing what the AI is doing. |
window | string | still: picture another editor window by its title instead (e.g. "Node Graph"). |
record_physics
Bake physics into a sequence: plays a copy of the scene with the sequence up to from, lets physics take the object there (thrown at velocity [x,y,z] m/s with spin degrees/s, or moving as its keys were; a launch event at from works too; a ragdoll event in the stretch records every bone), records it on every tick until to (slow motion included, so it stays smooth slowed down) and keeps the keys a straight line between neighbours doesn't already give. Then edit any key (set_key, with falloff to reshape the arc) and it plays back the same every run. ignore: objects left out of the physics (the thrower's own body). Reports where it hit things and came to rest.
| Argument | Type | What it does |
|---|---|---|
entity required | string | |
from required | number | Story seconds from the start. |
ignore | list of string | |
sequence required | string | The sequence's name (Sequences/<name>.sequence.json). |
spin | list of number | |
to required | number | Story seconds from the start. |
tolerance | number | Metres a straight line between kept keys may stray (default 0.002). |
velocity | list of number |
record_play
Film a scripted play run for judging movement by eye: every frame from cameras that travel with the player (side, three_quarter, over_shoulder, front, feet), at real speed (fps, default 30) and optionally a slow-motion window rendered at up to 120 fps (every simulation tick). Writes numbered PNGs into dir/<camera>/ and dir/<camera>_slow/, plus dir/locomotion.csv (the player's speed, gaits, blend, stepping phase, stride and leg turn every tick). Turn the folders into videos with ffmpeg.
| Argument | Type | What it does |
|---|---|---|
audio | boolean | Also record the game's sound (footsteps, shots) to dir/audio.wav (stereo, 16-bit). |
cameras | list of string | Preset names: side, three_quarter, over_shoulder, front, feet, game (the game's own camera, with its aim zoom), sights (about at the right eye, down the aim: a near first-person sight picture), behind_head (just behind the head over the right shoulder, down the aim). Default side, three_quarter, over_shoulder. |
dir required | string | Absolute output folder. |
fps | number | Real-speed frame rate, default 30. |
height | integer | |
inputs | list of object | As play_test's inputs, plus "aim": true (right mouse: aim down the sights). |
seconds | number | Run length, default 10, max 60. |
slow | object | {from, to, fps (default 120), cameras}: a window also rendered densely for slow motion. |
width | integer |
reload_check
Check a keyed reload frame by frame: where the support hand goes into the gun (and which part), where the arm can't reach its key, and each key's moment. Fails on the hand more than 3 mm into the gun or 1 cm short of a key.
| Argument | Type | What it does |
|---|---|---|
entity required | string | The character (name or #id) whose weapon hold is being edited. |
steps | integer |
replay
Replays: every Play is recorded (the player's controls each tick, a few KB) into the project's Replays folder, and plays back exactly. list: newest first. watch: play one back live in the viewport (the player's own camera). check: replay it headless and compare the ending with the recording. race_ghost: start Play with the person in control and the replay racing alongside as a ghost (a tinted copy of its player and what they drive, moving exactly as recorded; nothing in the game can touch it).
| Argument | Type | What it does |
|---|---|---|
action required | list / watch / check / race_ghost | |
file | string | A file name from list (default: the newest). |
retarget_check
Does an animation made for another rig look right on this character? Plays `clip` from `library` (an animation pack or rigged model under Assets: a GLB, an imported FBX's GLB, or a .bvh) on `entity` the way a game plays a library (limbs matched, legs planted) and judges it frame by frame against the source (RetargetCheck): feet sliding, sinking or floating while planted, a crouch or fold (hips low, knees or torso bent more than the source's), feet tipped, limbs or hands away from the source's, a two-hand hold coming apart, a foot inside the other leg, the body check failing where the source's doesn't. RETARGET PASS or FAIL with every flaw named. all: every clip of the library, a line each (no stills). report: the verdicts written to Scripts/data/<report> for the game (game.data). rest (every_bone or limbs) and legs try another way for this check only; library_rest / library_legs change how games play libraries. keep_feet: plant the legs (default as legs). save_as keeps the result as a pose clip (default <clip>_<entity>).
| Argument | Type | What it does |
|---|---|---|
all | boolean | |
camera | list of number | |
clip | string | The clip's name in the library (a .bvh has one). |
entity required | string | The character to try it on. |
filmstrip | integer | |
keep_feet | boolean | |
legs | boolean | Plant the legs (default: as libraries play, on). |
library required | string | The animation's file under Assets (GLB, an imported FBX's GLB, or .bvh). |
library_legs | boolean | |
library_rest | every_bone / limbs | |
look | list of number | |
report | string | Write the verdicts to Scripts/data/<report> (.json) for the game (merged per body). |
rest | every_bone / limbs | |
save_as | string |
road_report
What the scene's road network is: each road (type, length, lanes, speed, bridges), every intersection (number, kind, where, arms and their control), ramp merges, overpasses, props, the lane graph, and checks (dead ends, unreachable lanes).
No arguments.
run_tests
Run the Game Plan's tests on the scene (or the open rehearsal). Failures explain what's wrong and which object is to blame; include_picture adds an image of the problem.
| Argument | Type | What it does |
|---|---|---|
include_picture | boolean | Attach a picture of the first failure (or the first route). Default true. |
requirement | string | Only this requirement. Default: all. |
screenshot core
See the scene: a PNG from the editor camera, or from any position looking at any point.
| Argument | Type | What it does |
|---|---|---|
aperture | number | Depth of field: the lens's f-stop (1.4 a very shallow focus, 2.8 cinematic, 8 most of the scene sharp; omitted: everything sharp). The bokeh's character comes from camera_look (bokeh_blades, anamorphic, bokeh_highlights, cat_eye). |
debug_view | integer | One render channel of the whole scene instead of the picture: 1 shadows, 2 bounced light, 3 materials, 4 normals, 5 base color, 6 roughness/metal/occlusion, 7 texture sharpness, 8 lighting only, 9 wireframe, 14 zebra (every surface mirrors bands of light: on a fair surface they flow in smooth curves, a dent, ripple or step between panels bends or breaks them; how car bodies are judged). Finds which part of the lighting a problem is in. |
editor_ui | boolean | With live:true, capture this editor window with its activity feed, progress cards and scene notices. Never captures the desktop. |
focus | number or list of number | Depth of field: what is in focus, a distance in metres or a point [x, y, z] (default: look_at). |
fov | number | Vertical field of view in degrees (0.05...175). Give fov or lens, not both. Omitted: keep the current camera lens. |
height | integer | Default 720. |
labels | boolean | Tag every visible object with its name and list them with pixel positions. Default true. |
lens | number | Lens focal length in millimetres on a full-frame 36×24 mm sensor (1...25000): 24 wide, 50 normal, 85 portrait; thousands of mm from far away for a blueprint-true (nearly orthographic) view. Same convention as cinematic cameras. |
live | boolean | Exactly what the person's viewport shows right now: the editor camera, with what see-through walls leaves out left out (position and look_at are ignored; fov/lens overrides are rejected). Default false. |
look_at | list of number | |
miniature | number | With aperture: the miniature (tilt-shift) lens, the depth of field drawn as if the world were this many times smaller (30: a town on a table top; 1 or omitted: real scale). |
position | list of number | |
show_selection | boolean | Draw the orange selection outline. Default false. |
width | integer | Default 1280, max 2560. |
sense_check
Does it make sense? Run it before calling a place done (Gordon 10-30: never build things that don't make sense). Checks every place a player arrives (their start, checkpoints, anything tagged "arrival", and `points` given as {name, position}): the first surface seen straight below must be solid (an object with a collider, or the land), else it's a floor the player can see but falls through. Then, across the scene: big floor-like models (decks, platforms, floors, booths, gates: anything big and solid-looking at ground level) with no collider; things floating with nothing under them; objects whose about-role is empty (what is it? what is it for?). Lists findings and, for each arrival, the camera for a player's-eye screenshot (look at every one: is there a way in and out, and does it read as a real place?). In Play it also runs escape_check: every way out of the boundary, every trap, every perch (escape: false skips it).
| Argument | Type | What it does |
|---|---|---|
escape | boolean | In Play, also run escape_check (default true). |
floating | boolean | Check things floating (default true). |
limit | number | Most findings listed per kind (default 20). |
points | list of object | More arrivals: [{name, position: [x, y, z]}] (feet). |
strings_check
Check the game's translations: for each language (or `language`), how many of the game's texts are translated, which are missing, placeholders dropped or invented, plural forms the language needs, texts left as the English, whether the game's fonts have the language's letters (else the system face for the language is used), and text that won't fit: every screen of the game's layout drawn in that language at `size` (default 1280x720), each text measured the way the renderer sets it (Chinese and Japanese break between letters, Arabic runs from the right), listing what is cut off, what breaks mid-word and what has to shrink below 80%. Fix by shortening the translation, widening the box, or a smaller font for that language. Codes: es, pt (pt-BR), fr, de, it, nl, pl, tr, vi, id, ru, uk, el, ja, ko, zh-Hans, zh-Hant, ar, he, hi, th (any BCP 47 code works). The engine's own menu words already come in es, pt, fr, de, ru, ja, ko, zh-Hans and ar.
| Argument | Type | What it does |
|---|---|---|
fit | boolean | Measure every screen (default true). |
language | string | |
scene | string | A scene's own UI layout (UI/Scenes/<scene>.ui.json) instead of the game's. |
size | string | WxH to draw at (default 1280x720). |
ui_report
Read and validate saved game UI, screen/widget bindings and Deck-size layout; every line of text (titles, subtitles, text widgets with their id and rect) and the preset sample lines still showing. This is source/layout evidence, not proof of play: use proof_report checks ui_pause_resume and ui_inventory_pickup. With export_job, read that export's durable completion receipt.
| Argument | Type | What it does |
|---|---|---|
export_job | string | |
scene | string | Optional scene name for an independent layout; omit for the project default. |
view_channel
Switches the live viewport to one render channel until set back to picture: zebra (every surface mirrors bands of light; on a fair surface they flow in smooth curves, a dent, ripple or step between panels bends or breaks them: how car bodies are judged), normals, materials, base_color, lighting_only, wireframe, shadows, bounced_light, light_complexity, shadow_atlas. For a still, use screenshot's debug_view instead.
| Argument | Type | What it does |
|---|---|---|
channel required | picture / shadows / bounced_light / materials / normals / base_color / roughness_metal_occlusion / texture_sharpness … |
viewport_report
Where did an object go? For the person's live viewport right now: every model and whether it is in view, outside the camera's view, hidden by see-through walls (it stands between the camera and the point the camera turns around), still loading, or missing; with its level of detail and distance, plus the camera and its orbit point. Use it when someone says objects disappear.
| Argument | Type | What it does |
|---|---|---|
entity | string | Entity name (e.g. "Tower_B") or id (e.g. "#7"). |
hidden_only | boolean | Only the models that should show but don't (see-through walls, loading, missing). Default false. |
limit | integer | Most objects to list (default 120). |