Jabbertoon error codes
When Jabbertoon checks a move, a character or a cartoon, every problem it finds has a code: a short name made of lower-case words, such as the ones below. The block editor and the studio show the problem in words; the tools for AI assistants give the code as well, with where the problem is, what is wrong and how to fix it, and each answer links to the code's place on this page. The tools have codes of their own as well, from their own checks and for a call, a file or a video they cannot make; those have no example here, and each says why.
An error stops the program from being used until it is fixed. A warning lets it play, because the program is still valid, but points at something that will probably not do what you meant, such as a part that no character has. Each code below says which of the two it is, in a tag before what it means: Error or Warning. Under each, open its example to see a program that gets it and what the check says about it.
The codes are also published as data, in the error catalog, and a program can be checked against the JSON Schemas before Jabbertoon sees it.
All 235 codes, A to Z
background_not_drawable_herebad_argumentsbad_fpsbad_optionbad_sizebad_timeblock_has_no_bodyblock_needs_opblocks_never_runbody_not_listbranches_not_listbusycanvas_unavailablecaption_cutcaption_hiddencaption_needs_textcaption_too_longcartoon_emptycartoon_fails_when_playedcartoon_file_field_unknowncartoon_file_no_programcartoon_over_limitcartoon_script_needs_scene_hatcast_at_field_unknowncast_at_not_numbercast_at_not_objectcast_entry_badcast_field_unknowncast_has_no_designcast_id_badcast_is_a_listcast_legs_badcast_missingcast_name_not_textcast_not_drawable_herecast_not_objectcast_over_studio_limitcast_pack_badcast_pack_id_badcast_pack_version_not_textcast_voice_not_textchain_channel_badchain_needs_channelchain_not_a_chainchain_on_legschain_part_is_a_raisechain_part_segmentchannel_badchannel_values_not_objectcharacter_invalidclip_badcontent_hash_wrongcut_needs_place_or_mooddamping_negativedoes_also_not_booleandoes_needs_movedoes_setting_unknowndoes_settings_not_objectdrive_needs_channel_and_valuedur_unknown_hereease_unknownempty_stageexpression_invalidexpression_unknown_functionfacing_badfails_when_playedfalloff_largefalloff_not_positivefeet_off_stageffmpeg_failedffmpeg_missingffmpeg_no_h264ffmpeg_no_webpfield_ignoredfile_existsfile_not_foundfile_unreadablefolder_not_writablefollow_after_badfollow_after_segmentfollow_channels_emptyfollow_moodfollow_needs_channel_and_sourcefollow_source_badformat_1_projectgait_bob_badglide_cuthat_never_fireshat_unknownhold_negativeimage_unreadableinput_hat_in_videoinvalid_programjob_unknownlag_negativelag_slowline_cutlink_bad_namelink_too_biglook_colors_not_objectlook_colour_badlook_colour_outside_colorslook_colour_unknownlook_facing_badlook_field_unknownlook_given_twicelook_name_not_textlook_not_objectlook_options_not_objectlook_outside_picturelook_stretch_badlook_stretch_field_unknownlook_stretch_not_objectmood_missingmove_block_in_scenemove_cutmove_id_badmove_version_not_textmove_wrong_bodyname_of_a_charactername_unknownnode_missingnode_too_oldnot_a_cartoonnot_foundnot_jsonnot_supported_herenumber_not_finiteofflineoffstageop_unknownoption_unknownoption_value_unknownoverlapown_move_not_a_movepack_invalidpart_not_a_namepart_not_drawnpart_role_unknownpart_unknownpath_outside_folderpinned_scene_squeezedplace_entry_badplace_needs_a_valueplace_not_a_nameplace_unknownplaces_not_objectplay_warningpoint_field_unknownpoint_needs_x_and_ypoint_not_objectprogram_kind_unknownprogram_kind_wrongprogram_not_objectprogram_scripts_not_listprogram_versionreach_needs_targetreach_not_a_limbreach_offset_without_spotreach_to_and_atrender_failedreport_not_sentruntime_capsay_needs_textscene_block_in_movescene_hat_conflictscene_hat_field_ignoredscene_hat_invalidscene_pinned_before_earlierscene_program_one_scenescene_script_hatscene_start_badscene_unknownsegments_badsegments_not_a_chainserver_errorshape_unknownside_unknownsize_not_positivesound_not_placedsound_unreadablespeed_given_twicespeed_not_positivespot_unknownspring_fastspring_not_positivespring_too_fastsync_badtalks_offstagetext_bad_indenttext_bad_jsontext_bad_valuetext_block_outside_scripttext_branch_alonetext_cast_field_unknowntext_cast_unknown_idtext_child_not_allowedtext_else_alonetext_expectedtext_form_remote_unsupportedtext_heading_latetext_heading_not_firsttext_heading_twicetext_not_texttext_program_not_alonetext_unclosed_brackettext_unclosed_quotetext_unknown_linetexture_unavailabletimeouttoo_largeturn_view_instantunknown_backgroundunknown_gradeunknown_moodunknown_moveunknown_packunknown_shapeunknown_styleunknown_templateunknown_toolunknown_voiceunreadablevalue_not_numbervalue_not_textvariable_not_a_namevariable_start_not_numberview_needs_toview_unknownvoices_failedvoices_not_installedwave_needs_channelwho_missingwho_not_in_castwindow_end_unknown
background_not_drawable_here
Error A scene's background is not one of the six this renderer draws, so it would be drawn as another.
How to fix it: Use one of beach, meadow, classroom, stage, space or city as the place's background, or pass allow_substitutes: true to draw the meadow instead (listed in the result).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"name": "Ann", "look": {"template": "kid"}}
},
"scripts": [
{
"hat": {
"on": "scene",
"name": "One",
"place": "kitchen"
},
"body": [{"op": "say", "who": "A", "text": "Hi!"}]
}
]
}What the check says: places: A background cannot be drawn here: kitchen (it is not one of the six backgrounds (beach, meadow, classroom, stage, space, city)).
bad_arguments
Error The call's arguments are not ones the tool can use: one is missing, unknown or of the wrong type.
How to fix it: Send the arguments the tool's inputSchema gives, as the message says.
Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.
bad_fps
Error That frame rate is not one this renderer makes.
How to fix it: Use 24 (the default) or any whole number up to 30. The cartoon itself always runs on its 24 frames-a-second clock.
Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.
bad_option
Error An option has a value this renderer does not take.
How to fix it: See the option named in the message, and the values it takes.
Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.
bad_size
Error That frame size is not one this renderer makes.
How to fix it: Use 1280x720 (the default), 1920x1080 or 1080x1920 for a video; a frame or a contact sheet takes any size from 16 to 3840 pixels a side.
Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.
bad_time
Error That time is not in the cartoon.
How to fix it: Give a time in seconds from 0 to the cartoon's length.
Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.
block_has_no_body
Warning A block that holds no body was given one; its body never runs.
How to fix it: Move the blocks out of it, or into a block that holds a body (for, repeat, forever, while, if, between).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{
"body": [
{
"op": "move",
"dx": 10,
"body": [{"op": "wait", "s": 1}]
}
]
}
]
}What the check says: scripts[0].body[0]: "move" has no body
block_needs_op
Error A block has no "op" saying what it is.
How to fix it: Give each block an "op": {"op": "say", ...}.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"do": "wait"}]}]
}What the check says: scripts[0].body[0]: block needs an "op"
blocks_never_run
Warning The scene ends before a script reaches some of its blocks, so they never run.
How to fix it: Let the script reach its end before the scene ends: pin the next scene later, or take out the wait the script was held at.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "window", "from": -1, "body": []}]
}
]
}What the check says: Blocks of a script in scene "s" never run: the scene ends at 0 s before the script reaches them.
body_not_list
Error A body is not a list of blocks.
How to fix it: Make the body a list: "body": [{...}, {...}].
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "forever", "body": {"op": "wait"}}]}
]
}What the check says: scripts[0].body[0].body: body must be an array
branches_not_list
Error The branches of an at-the-same-time block are not a list of bodies.
How to fix it: Write branches as a list of lists of blocks: [[...], [...]].
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "together", "branches": "two"}]}
]
}What the check says: scripts[0].body[0].branches: must be an array of bodies
busy
Error The online tools are busy: they have answered all they take today, or as many at once as they take.
How to fix it: Try again after the time Retry-After gives; the studio at https://jabbertoon.com/studio/ and the tool on your own computer work without them.
Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.
caption_cut
Warning A caption is cut off before its time is up, when its scene ends.
How to fix it: A caption does not wait: put a wait after it (as long as its for), or end the scene later.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"at": {"x": 0.4}}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{
"op": "say",
"who": "A",
"text": "And they swam all day."
},
{"op": "caption", "text": "The end", "for": 2}
]
}
]
}What the check says: The caption "The end" is cut off when scene "s" ends at 1.57 s: 0 of 2 s shown.
caption_needs_text
Error A caption has no words.
How to fix it: Give the caption as text: "text": "Later that day".
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "caption"}]
}
]
}What the check says: scripts[0].body[0].text: caption needs text, as a string
caption_too_long
Warning A caption (or a line, which shows as one) takes more than about three lines of the picture.
How to fix it: Split the words into two captions (or lines), each of at most about three lines.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"at": {"x": 0.4}}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{
"op": "caption",
"text": "This caption goes on and on and on, far longer than three lines of the picture can ever hold at the size the studio writes them, so the end of it is lost below the frame.",
"for": 4
},
{"op": "wait", "s": 4}
]
}
]
}What the check says: The caption "This caption goes on and on and on, far…" at 0 s takes about 5 lines on the picture; 3 fit.
cartoon_empty
Error The cartoon has no scenes, so there is nothing to play, and render_video and preview refuse it.
How to fix it: Add a scene: {"hat": {"on": "scene", "name": "Hello"}, "body": [{"op": "say", "who": "dog", "text": "Hi!"}]}.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"name": "Ann", "look": {"template": "kid"}}
},
"scripts": []
}What the check says: scripts: has no scenes, so there is nothing to play
Only in the downloadable tool, not yet published: preview, render_video
cartoon_fails_when_played
Error The cartoon stopped with an error while it was being played, so it was not drawn.
How to fix it: Fix what the message names, as validate's play check does (fails_when_played, at the same time): a name in a formula that is not a setting, a variable or one the engine has; a character (who) that is not in the cast; or a loop that never waits (put a wait in it).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"name": "Ann", "look": {"template": "kid"}}
},
"scripts": [
{
"hat": {"on": "scene", "name": "One"},
"body": [{"op": "wait", "s": "=nope + 1"}]
}
]
}What the check says: The cartoon stopped with an error before its first frame: expression: unknown name "nope"
cartoon_file_field_unknown
Error A cartoon file holds its cast, its places and its program, and nothing else.
How to fix it: Move the field into the program where it belongs, or leave it out.
An example that gets this code
{
"pack": 1,
"id": "c4c:cartoon:happy_now",
"type": "cartoon",
"version": "1.0.1",
"name": "Happy now?",
"description": "Sunny brings Grump a cake with sprinkles. Two characters, two scenes, about 23 seconds.",
"author": {"id": "you", "name": "You"},
"license": "cc0",
"remixable": true,
"derived_from": [],
"preview": {"seconds": 23},
"content_hash": "sha256:28ac64431d1fac33415608eb770bb63fd22de03c84953fe5369bec79925cc505",
"content": {
"cast": {
"A": {
"name": "Sunny",
"legs": 2,
"look": {
"template": "person",
"colors": {"body": "#ffcf77", "acc": "#6a4c93"}
}
},
"B": {
"name": "Grump",
"legs": 4,
"at": {
"x": 0.68,
"y": 0.92,
"h": 0.34,
"facing": -1
},
"look": {
"template": "dog",
"colors": {
"skin": "#9e8a78",
"body": "#d9cbbd",
"acc": "#5a4636"
}
}
}
},
"places": {"park": {"background": "meadow"}},
"program": {
"v": 1,
"kind": "cartoon",
"name": "Happy now?",
"scripts": [
{
"hat": {
"on": "scene",
"name": "Morning",
"place": "park"
},
"body": [
{
"op": "does",
"who": "B",
"behaviour": "c4c:beh:sadidle"
},
{
"op": "caption",
"text": "Grump was having a grey sort of morning.",
"for": 2.6
},
{"op": "wait", "s": 1.2},
{
"op": "does",
"who": "A",
"behaviour": "c4c:beh:walk",
"for": 2,
"params": {"from": 0, "to": 0, "t_in": 2}
},
{
"op": "enter",
"who": "A",
"from": "left",
"over": 2,
"x": 0.3
},
{
"op": "does",
"who": "A",
"behaviour": "c4c:beh:wave_hello"
},
{
"op": "say",
"who": "A",
"text": "Good morning, Grump!",
"mood": "happy"
},
{
"op": "does",
"who": "B",
"behaviour": "c4c:beh:annoyed"
},
{
"op": "say",
"who": "B",
"text": "Is it?",
"mood": "angry"
},
{"op": "wait", "s": 0.5},
{
"op": "does",
"who": "A",
"behaviour": "c4c:beh:bounce"
},
{
"op": "say",
"who": "A",
"text": "I baked you a cake. It has sprinkles!",
"mood": "happy"
},
{
"op": "does",
"who": "B",
"behaviour": "c4c:beh:sadidle"
},
{
"op": "say",
"who": "B",
"text": "I don't like sprinkles.",
"mood": "sad"
},
{"op": "wait", "s": 0.8}
]
},
{
"hat": {"on": "scene", "name": "One bite later"},
"body": [
{
"op": "caption",
"text": "One bite later...",
"for": 1.6
},
{
"op": "does",
"who": "B",
"behaviour": "c4c:beh:idle"
},
{
"op": "does",
"who": "A",
"behaviour": "c4c:beh:point"
},
{"op": "wait", "s": 1},
{
"op": "say",
"who": "A",
"text": "Are you happy now?",
"mood": "happy"
},
{"op": "wait", "s": 0.9},
{
"op": "does",
"who": "B",
"behaviour": "c4c:beh:wag"
},
{
"op": "say",
"who": "B",
"text": "...Maybe a little."
},
{"op": "cut", "place": "park", "mood": "bloom"},
{
"op": "does",
"who": "A",
"behaviour": "c4c:beh:jump_for_joy"
},
{
"op": "say",
"who": "A",
"text": "Hooray! Cake for everyone!",
"mood": "happy"
},
{
"op": "say",
"who": "B",
"text": "Don't make it weird.",
"mood": "angry"
},
{
"op": "does",
"who": "A",
"behaviour": "c4c:beh:walk",
"for": 2.4,
"params": {"from": 0, "to": 0, "t_in": 2.4}
},
{
"op": "together",
"branches": [
[
{
"op": "exit",
"who": "A",
"to": "left",
"over": 2.4
}
],
[
{"op": "wait", "s": 1.2},
{
"op": "say",
"who": "B",
"text": "Thanks for the cake.",
"speed": 0.85
}
]
]
},
{"op": "mood", "who": "B", "mood": "happy"},
{"op": "wait", "s": 1.2}
]
}
]
},
"extra": 1
}
}What the check says: content.extra: a cartoon pack holds {cast, places, program} only
cartoon_file_no_program
Error A cartoon file needs its program.
How to fix it: Give {"cast": {...}, "program": {"v": 1, "kind": "cartoon", "scripts": [...]}}.
An example that gets this code
{
"format": "jabbertoon-project",
"version": 2,
"cartoon": 5,
"assets": {"characters": {}, "sounds": {}}
}What the check says: cartoon: a project file holds its cartoon in "cartoon"
cartoon_over_limit
Error The cartoon is longer than 600 seconds (or never ends), so it was not drawn.
How to fix it: Make it 10 minutes or shorter: end every scene (a "forever" loop needs a scene that ends it), or split it into parts.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"name": "Ann", "look": {"template": "kid"}}
},
"scripts": [
{
"hat": {"on": "scene", "name": "One"},
"body": [{"op": "wait", "s": 700}]
}
]
}What the check says: The cartoon is still playing after 601 seconds (it is longer than the limit of 600 seconds, or a scene never ends), so it was not drawn.
cartoon_script_needs_scene_hat
Error A cartoon script does not start with a scene hat that has a name.
How to fix it: Start every script of a cartoon with {"on": "scene", "name": "..."}.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {},
"scripts": [{"body": []}]
}What the check says: scripts[0].hat: every cartoon script needs a scene hat {"on":"scene","name":"…"}
cast_at_field_unknown
Warning A cast member's "at" has a field other than x, y, h and facing; it is ignored.
How to fix it: Keep only x, y, h and facing in "at".
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"at": {"x": 0.5, "z": 1}}},
"scripts": []
}What the check says: cast.A.at: unknown field "z"
cast_at_not_number
Error A value of a cast member's "at" is not a number.
How to fix it: Give x, y, h and facing as numbers (a formula is not allowed there): x from 0 to 1, y the feet line (the ground is 0.92), h a share of the stage's height.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"at": {"x": "=t"}}},
"scripts": []
}What the check says: cast.A.at.x: must be a number
cast_at_not_object
Error A cast member's "at" is not {x, y, h, facing}.
How to fix it: Write where it stands as {"x": 0.3, "y": 0.92, "h": 0.5, "facing": 1} (stage fractions; facing 1 right, -1 left).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"at": 0.5}},
"scripts": []
}What the check says: cast.A.at: must be {x, y, h, facing}
cast_entry_bad
Error A cast member is neither a role description (text) nor an object.
How to fix it: Write the member as {"name", "legs", "at", "voice", "pack", "look"}, or as text describing its role.
An example that gets this code
{"v": 1, "kind": "cartoon", "cast": {"A": 5}, "scripts": []}What the check says: cast.A: must be a role description or {name, legs, at, voice, pack, look}
cast_field_unknown
Warning A cast member has a field the language does not use; it is ignored.
How to fix it: Remove the field, or move it where it belongs (colours go in look.colors, the template in look.template).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"colour": "red"}},
"scripts": []
}What the check says: cast.A: unknown field "colour"
cast_has_no_design
Error A cast member is only a role (a few words), with no look, pack or picture to draw, so render_video refuses it.
How to fix it: Give it a look with one of the six characters as its template, keeping its words as its name: {"name": "Biscuit", "look": {"template": "dog"}}.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": "a friendly dog"},
"scripts": [
{
"hat": {"on": "scene", "name": "One"},
"body": [{"op": "say", "who": "A", "text": "Hi!"}]
}
]
}What the check says: cast.A: is only a role ("a friendly dog"): it has no look, pack or picture to draw, so render_video refuses it
Only in the downloadable tool, not yet published: render_video
cast_id_bad
Error A cast id has a letter it cannot have.
How to fix it: Use letters, digits, _ or - in a cast id (A, sunny, dog_2), and the same id in every "who".
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"my dog": {}},
"scripts": []
}What the check says: cast.my dog: a cast id is letters, digits, _ or -
cast_is_a_list
Warning The cast is a list, so its members are named "0", "1", ... and each who must say one of those.
How to fix it: Write the cast as an object keyed by the ids the who fields use: {"dog": {"name": "Biscuit"}, "cat": {"name": "Mia"}}.
An example that gets this code
{
"cast": [{"name": "Ann", "look": {"template": "kid"}}],
"program": {
"v": 1,
"kind": "cartoon",
"scripts": [
{
"hat": {"on": "scene", "name": "One"},
"body": [{"op": "say", "who": "0", "text": "Hi!"}]
}
]
}
}What the check says: cast: is a list, so its entries are named "0", "1", ... and each "who" must say one of those
cast_legs_bad
Error A cast member's legs is not a whole number.
How to fix it: Give legs as 0, 2 or 4 (a whole number, 0 or more).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"legs": 2.5}},
"scripts": []
}What the check says: cast.A.legs: must be a whole number
cast_missing
Warning The scene has no cast, so every "who" must name a character the page adds itself.
How to fix it: Add a cast: {"A": {"name": "Sunny"}}, and use its ids in "who".
An example that gets this code
{
"v": 1,
"kind": "scene",
"scripts": [{"body": [{"op": "wait", "s": 1}]}]
}What the check says: cast: no cast declared: "who" must name characters added with addCharacter
cast_name_not_text
Error A cast member's name is not text.
How to fix it: Give the name as text in quotes: "name": "Sunny".
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": 7}},
"scripts": []
}What the check says: cast.A.name: must be a string
cast_not_drawable_here
Error A character in the cast cannot be drawn here: it is a picture from the internet, a role with no design, a character pack this renderer does not have, or a design it does not know.
How to fix it: Give the character a look ({"template": "dog", "style": "outlined"}) or one of the shipped character packs (c4c:char:person, kid, dog, cat, bird, monster), or a picture of its own in a project file; or pass allow_substitutes: true to draw a stand-in, listed in the result.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {
"name": "Ann",
"look": {
"template": "kid",
"image": "https://example.com/ann.png"
}
}
},
"scripts": [
{
"hat": {"on": "scene", "name": "One"},
"body": [{"op": "say", "who": "A", "text": "Hi!"}]
}
]
}What the check says: cast.A: Character A (Ann) cannot be drawn here: a picture from outside (image) (pictures from the internet (emoji, Open Peeps, DiceBear) are never fetched by the renderer).
cast_not_object
Error The cast is not an object of members by id.
How to fix it: Write the cast as {"A": {"name": "Sunny"}, "B": {...}}: one entry per character, keyed by its id.
An example that gets this code
{"v": 1, "kind": "cartoon", "cast": ["A"], "scripts": []}What the check says: cast: must be {id: entry}
cast_over_studio_limit
Warning The cast has more characters than the studio opens.
How to fix it: Keep the cast to two characters to open the cartoon in the studio; a longer cast still validates and plays.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"at": {"x": 0.2}},
"B": {"at": {"x": 0.5}},
"C": {"at": {"x": 0.8}}
},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "wait", "s": 1}]
}
]
}What the check says: The cast has 3 characters; the studio opens 2.
cast_pack_bad
Error A cast member's pack is neither an id nor {id, version}.
How to fix it: Give the pack as "c4c:char:dog" or {"id": "c4c:char:dog", "version": "1.0.0"}.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"pack": ["c4c:char:sunny"]}},
"scripts": []
}What the check says: cast.A.pack: must be an id or {id, version}
cast_pack_id_bad
Error A cast member's pack is not a pack id.
How to fix it: Give the pack id as written in the pack, like "c4c:char:dog".
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"pack": "sunny"},
"B": {"pack": {"id": "Sunny"}}
},
"scripts": []
}What the check says: cast.A.pack: "sunny" is not a pack id like "c4c:char:sunny"
cast_pack_version_not_text
Error A cast member's pack version is not text.
How to fix it: Give the version as text, like "1.0.0", or leave it out.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"pack": {"id": "c4c:char:sunny", "version": 1}}
},
"scripts": []
}What the check says: cast.A.pack.version: must be a string
cast_voice_not_text
Error A cast member's voice is not text.
How to fix it: Give the voice as text, one of the studio's voices such as "af_heart".
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"voice": 1}},
"scripts": []
}What the check says: cast.A.voice: must be a string
chain_channel_bad
Error A chain wave runs down something that is not one part.
How to fix it: Give a part channel without a #number, like "part:tail".
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "chain", "ch": "part:tail#1"}]}
]
}What the check says: scripts[0].body[0].ch: chain runs down one part: a part channel without a #number, like "part:tail", not "part:tail#1"
chain_needs_channel
Error A chain wave does not say which part it runs down.
How to fix it: Give "ch", the part, like "part:tail".
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "chain"}]}]
}What the check says: scripts[0].body[0]: chain needs "ch": the part the wave runs down, like "part:tail"
chain_not_a_chain
Warning A chain wave runs down a part that is drawn in one piece, so only its first segment moves.
How to fix it: Run the chain down a tail, the body, the ears or the hair, or use a wave on the part.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "chain", "ch": "part:arm:1"}]}
]
}What the check says: scripts[0].body[0].ch: the arm is not drawn as a chain, so nothing draws "part:arm:1#1" …
chain_on_legs
Warning A chain wave on legs runs from leg to leg (a leg's #number says which leg), not down one leg.
How to fix it: Run the chain down a tail, the body, the ears or the hair; move legs with their own blocks.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "chain", "ch": "part:leg"}]}
]
}What the check says: scripts[0].body[0].ch: a leg's #number says which leg it is (#0 back left … #3 front right), so this wave runs from leg to leg
chain_part_is_a_raise
Error A block that turns a part was given a raise (lift:).
How to fix it: Name the part itself ("tail"), not its raise.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "swish", "part": "lift:tail"}]}
]
}What the check says: scripts[0].body[0].part: swish turns a part: name the part, not a raise ("lift:tail")
chain_part_segment
Error A chain block was given one segment of a chain; it numbers the segments itself.
How to fix it: Name the whole part ("tail"), not "part:tail#2".
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "swish", "part": "part:tail#2"}]}
]
}What the check says: scripts[0].body[0].part: name the whole tail (the block numbers its segments), not "part:tail#2"
channel_bad
Error A channel is not one the language has.
How to fix it: Use dx, dy, rot, sx, sy, mouth, blink, or part:<part> or lift:<part>, like part:arm:-1 (the left arm).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "set", "to": {"dz": 1}}]}]
}What the check says: scripts[0].body[0].to.dz: bad channel "dz"
channel_values_not_object
Error A set or glide's channels are not {channel: value}.
How to fix it: Write them as {"dx": 40, "part:arm:1": 30}.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "set", "to": [1]}]}]
}What the check says: scripts[0].body[0].to: must be {channel: value}
character_invalid
Error A part, a shape or the face of the character is not one the studio can draw.
How to fix it: Fix the part named, as its fix says (the character format: https://jabbertoon.com/docs/packs/).
An example that gets this code
{
"name": "Rex",
"content": {
"tree": 5,
"legs": 4,
"kind": "dog",
"height": 178.4,
"footprint": 120,
"look": "outlined",
"views": [
{"view": "side"},
{
"view": "front",
"tree": {
"id": "root",
"role": "root",
"pos": {"x": 0, "y": 0},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"children": [
{
"id": "torso",
"role": "torso",
"shape": {
"type": "ellipse",
"w": 87.5,
"h": 77
},
"pos": {"x": 0, "y": -91},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#b8793f",
"children": [
{
"id": "bib",
"role": null,
"shape": {
"type": "ellipse",
"w": 43.4,
"h": 43.4
},
"pos": {"x": 0, "y": 7},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#f7d9b0",
"children": []
},
{
"id": "tail",
"role": "tail",
"index": 0,
"shape": {
"type": "taper",
"w": 18,
"w2": 11,
"h": 59.5
},
"pos": {"x": 15.4, "y": -15.4},
"rot": 196,
"sx": 1,
"sy": 1,
"z": -3,
"fill": "#b8793f",
"children": [
{
"id": "tail1",
"role": "tail",
"index": 1,
"pos": {"x": 0, "y": 14.875},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"children": [
{
"id": "tail2",
"role": "tail",
"index": 2,
"pos": {"x": 0, "y": 14.875},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"children": [
{
"id": "tail3",
"role": "tail",
"index": 3,
"pos": {"x": 0, "y": 14.875},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"children": [],
"limits": {
"min": -70,
"max": 70
},
"tip": {"x": 0, "y": 14.875}
}
],
"limits": {"min": -70, "max": 70}
}
],
"limits": {"min": -70, "max": 70}
}
],
"limits": {"min": -120, "max": 120},
"bend": true
},
{
"id": "leg0",
"role": "leg",
"side": -1,
"index": 0,
"shape": {
"type": "capsule",
"w": 21,
"h": 35.42
},
"pos": {"x": -28, "y": 9.8},
"rot": 0,
"sx": 1,
"sy": 1,
"z": -2,
"fill": "#a26a37",
"children": [
{
"id": "low0",
"role": "shin",
"side": -1,
"index": 0,
"shape": {
"type": "capsule",
"w": 18,
"h": 32.2
},
"pos": {"x": 0, "y": 32.2},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#a26a37",
"children": [
{
"id": "paw0",
"role": "foot",
"side": -1,
"index": 0,
"shape": {
"type": "hcapsule",
"w": 26,
"h": 15
},
"pos": {"x": 0, "y": 32.268},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#6b4120",
"children": [],
"limits": {"min": -45, "max": 45}
}
],
"limits": {"min": -60, "max": 60},
"flex": 1,
"fold": true
}
],
"limits": {"min": -75, "max": 60},
"fold": true
},
{
"id": "leg1",
"role": "leg",
"side": 1,
"index": 1,
"shape": {
"type": "capsule",
"w": 21,
"h": 35.42
},
"pos": {"x": 28, "y": 9.8},
"rot": 0,
"sx": 1,
"sy": 1,
"z": -2,
"fill": "#a26a37",
"children": [
{
"id": "low1",
"role": "shin",
"side": 1,
"index": 1,
"shape": {
"type": "capsule",
"w": 18,
"h": 32.2
},
"pos": {"x": 0, "y": 32.2},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#a26a37",
"children": [
{
"id": "paw1",
"role": "foot",
"side": 1,
"index": 1,
"shape": {
"type": "hcapsule",
"w": 26,
"h": 15
},
"pos": {"x": 0, "y": 32.268},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#6b4120",
"children": [],
"limits": {"min": -45, "max": 45}
}
],
"limits": {"min": -60, "max": 60},
"flex": -1,
"fold": true
}
],
"limits": {"min": -60, "max": 75},
"fold": true
},
{
"id": "leg2",
"role": "leg",
"side": -1,
"index": 2,
"shape": {
"type": "capsule",
"w": 21,
"h": 38.5
},
"pos": {"x": -17.5, "y": 15.4},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 1,
"fill": "#b8793f",
"children": [
{
"id": "low2",
"role": "shin",
"side": -1,
"index": 2,
"shape": {
"type": "capsule",
"w": 18,
"h": 35
},
"pos": {"x": 0, "y": 35},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#b8793f",
"children": [
{
"id": "paw2",
"role": "foot",
"side": -1,
"index": 2,
"shape": {
"type": "hcapsule",
"w": 26,
"h": 15
},
"pos": {"x": 0, "y": 32.9},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#7a4a24",
"children": [],
"limits": {"min": -45, "max": 45}
}
],
"limits": {"min": -60, "max": 60},
"flex": 1,
"fold": true
}
],
"limits": {"min": -75, "max": 60},
"fold": true
},
{
"id": "leg3",
"role": "leg",
"side": 1,
"index": 3,
"shape": {
"type": "capsule",
"w": 21,
"h": 38.5
},
"pos": {"x": 17.5, "y": 15.4},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 1,
"fill": "#b8793f",
"children": [
{
"id": "low3",
"role": "shin",
"side": 1,
"index": 3,
"shape": {
"type": "capsule",
"w": 18,
"h": 35
},
"pos": {"x": 0, "y": 35},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#b8793f",
"children": [
{
"id": "paw3",
"role": "foot",
"side": 1,
"index": 3,
"shape": {
"type": "hcapsule",
"w": 26,
"h": 15
},
"pos": {"x": 0, "y": 32.9},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#7a4a24",
"children": [],
"limits": {"min": -45, "max": 45}
}
],
"limits": {"min": -60, "max": 60},
"flex": -1,
"fold": true
}
],
"limits": {"min": -60, "max": 75},
"fold": true
},
{
"id": "head",
"role": "head",
"shape": {
"type": "ellipse",
"w": 76.96000000000001,
"h": 66.56,
"oy": -19.2
},
"pos": {"x": 0, "y": -29.4},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 2,
"fill": "#b8793f",
"face": {
"eyeX": 14.8,
"eyeY": -28.16,
"eyeR": 7.77,
"brows": true,
"mouthW": 22.2,
"mouthH": 10.88,
"mouthY": 3.2,
"z": 1.5
},
"children": [
{
"id": "snout",
"role": "snout",
"shape": {
"type": "ellipse",
"w": 38.480000000000004,
"h": 24.32
},
"pos": {"x": 0, "y": -4.48},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 1,
"fill": "#f7d9b0",
"children": [],
"limits": {"min": -20, "max": 20}
},
{
"id": "nose",
"role": "nose",
"shape": {
"type": "ellipse",
"w": 14.8,
"h": 9.6
},
"pos": {"x": 0, "y": -10.88},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 3,
"fill": "#222",
"outline": false,
"children": [],
"limits": {"min": -20, "max": 20}
},
{
"id": "ear-1",
"role": "ear",
"side": -1,
"index": 0,
"shape": {
"type": "teardrop",
"w": 23.68,
"h": 49.92
},
"pos": {"x": -32.56, "y": -39.68},
"rot": 26,
"sx": 1,
"sy": 1,
"z": -1,
"fill": "#7a4a24",
"children": [
{
"id": "ear-1_1",
"role": "ear",
"side": -1,
"index": 1,
"pos": {"x": 0, "y": 24.96},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"children": [],
"limits": {"min": -60, "max": 60},
"tip": {"x": 0, "y": 24.96}
}
],
"limits": {"min": -90, "max": 90},
"bend": true
},
{
"id": "ear1",
"role": "ear",
"side": 1,
"index": 0,
"shape": {
"type": "teardrop",
"w": 23.68,
"h": 49.92
},
"pos": {"x": 32.56, "y": -39.68},
"rot": -26,
"sx": 1,
"sy": 1,
"z": -1,
"fill": "#7a4a24",
"children": [
{
"id": "ear1_1",
"role": "ear",
"side": 1,
"index": 1,
"pos": {"x": 0, "y": 24.96},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"children": [],
"limits": {"min": -60, "max": 60},
"tip": {"x": 0, "y": 24.96}
}
],
"limits": {"min": -90, "max": 90},
"bend": true
}
],
"limits": {"min": -40, "max": 40}
}
],
"limits": {"min": -30, "max": 30}
}
]
},
"footprint": 64
},
{
"view": "back",
"tree": {
"id": "root",
"role": "root",
"pos": {"x": 0, "y": 0},
"rot": 0,
"sx": -1,
"sy": 1,
"z": 0,
"children": [
{
"id": "torso",
"role": "torso",
"shape": {
"type": "ellipse",
"w": 87.5,
"h": 77
},
"pos": {"x": 0, "y": -91},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#b8793f",
"children": [
{
"id": "tail",
"role": "tail",
"index": 0,
"shape": {
"type": "taper",
"w": 18,
"w2": 11,
"h": 59.5
},
"pos": {"x": 15.4, "y": -15.4},
"rot": 196,
"sx": 1,
"sy": 1,
"z": 3,
"fill": "#b8793f",
"children": [
{
"id": "tail1",
"role": "tail",
"index": 1,
"pos": {"x": 0, "y": 14.875},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"children": [
{
"id": "tail2",
"role": "tail",
"index": 2,
"pos": {"x": 0, "y": 14.875},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"children": [
{
"id": "tail3",
"role": "tail",
"index": 3,
"pos": {"x": 0, "y": 14.875},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"children": [],
"limits": {
"min": -70,
"max": 70
},
"tip": {"x": 0, "y": 14.875}
}
],
"limits": {"min": -70, "max": 70}
}
],
"limits": {"min": -70, "max": 70}
}
],
"limits": {"min": -120, "max": 120},
"bend": true
},
{
"id": "leg0",
"role": "leg",
"side": -1,
"index": 0,
"shape": {
"type": "capsule",
"w": 21,
"h": 38.5
},
"pos": {"x": -17.5, "y": 15.4},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 1,
"fill": "#b8793f",
"children": [
{
"id": "low0",
"role": "shin",
"side": -1,
"index": 0,
"shape": {
"type": "capsule",
"w": 18,
"h": 35
},
"pos": {"x": 0, "y": 35},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#b8793f",
"children": [
{
"id": "paw0",
"role": "foot",
"side": -1,
"index": 0,
"shape": {
"type": "hcapsule",
"w": 26,
"h": 15
},
"pos": {"x": 0, "y": 32.9},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#7a4a24",
"children": [],
"limits": {"min": -45, "max": 45}
}
],
"limits": {"min": -60, "max": 60},
"flex": 1,
"fold": true
}
],
"limits": {"min": -75, "max": 60},
"fold": true
},
{
"id": "leg1",
"role": "leg",
"side": 1,
"index": 1,
"shape": {
"type": "capsule",
"w": 21,
"h": 38.5
},
"pos": {"x": 17.5, "y": 15.4},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 1,
"fill": "#b8793f",
"children": [
{
"id": "low1",
"role": "shin",
"side": 1,
"index": 1,
"shape": {
"type": "capsule",
"w": 18,
"h": 35
},
"pos": {"x": 0, "y": 35},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#b8793f",
"children": [
{
"id": "paw1",
"role": "foot",
"side": 1,
"index": 1,
"shape": {
"type": "hcapsule",
"w": 26,
"h": 15
},
"pos": {"x": 0, "y": 32.9},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#7a4a24",
"children": [],
"limits": {"min": -45, "max": 45}
}
],
"limits": {"min": -60, "max": 60},
"flex": -1,
"fold": true
}
],
"limits": {"min": -60, "max": 75},
"fold": true
},
{
"id": "leg2",
"role": "leg",
"side": -1,
"index": 2,
"shape": {
"type": "capsule",
"w": 21,
"h": 35.42
},
"pos": {"x": -28, "y": 9.8},
"rot": 0,
"sx": 1,
"sy": 1,
"z": -2,
"fill": "#a26a37",
"children": [
{
"id": "low2",
"role": "shin",
"side": -1,
"index": 2,
"shape": {
"type": "capsule",
"w": 18,
"h": 32.2
},
"pos": {"x": 0, "y": 32.2},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#a26a37",
"children": [
{
"id": "paw2",
"role": "foot",
"side": -1,
"index": 2,
"shape": {
"type": "hcapsule",
"w": 26,
"h": 15
},
"pos": {"x": 0, "y": 32.268},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#6b4120",
"children": [],
"limits": {"min": -45, "max": 45}
}
],
"limits": {"min": -60, "max": 60},
"flex": 1,
"fold": true
}
],
"limits": {"min": -75, "max": 60},
"fold": true
},
{
"id": "leg3",
"role": "leg",
"side": 1,
"index": 3,
"shape": {
"type": "capsule",
"w": 21,
"h": 35.42
},
"pos": {"x": 28, "y": 9.8},
"rot": 0,
"sx": 1,
"sy": 1,
"z": -2,
"fill": "#a26a37",
"children": [
{
"id": "low3",
"role": "shin",
"side": 1,
"index": 3,
"shape": {
"type": "capsule",
"w": 18,
"h": 32.2
},
"pos": {"x": 0, "y": 32.2},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#a26a37",
"children": [
{
"id": "paw3",
"role": "foot",
"side": 1,
"index": 3,
"shape": {
"type": "hcapsule",
"w": 26,
"h": 15
},
"pos": {"x": 0, "y": 32.268},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"fill": "#6b4120",
"children": [],
"limits": {"min": -45, "max": 45}
}
],
"limits": {"min": -60, "max": 60},
"flex": -1,
"fold": true
}
],
"limits": {"min": -60, "max": 75},
"fold": true
},
{
"id": "head",
"role": "head",
"shape": {
"type": "ellipse",
"w": 76.96000000000001,
"h": 66.56,
"oy": -19.2
},
"pos": {"x": 0, "y": -29.4},
"rot": 0,
"sx": 1,
"sy": 1,
"z": -1,
"fill": "#b8793f",
"children": [
{
"id": "ear-1",
"role": "ear",
"side": -1,
"index": 0,
"shape": {
"type": "teardrop",
"w": 23.68,
"h": 49.92
},
"pos": {"x": -32.56, "y": -39.68},
"rot": 26,
"sx": 1,
"sy": 1,
"z": 1,
"fill": "#7a4a24",
"children": [
{
"id": "ear-1_1",
"role": "ear",
"side": -1,
"index": 1,
"pos": {"x": 0, "y": 24.96},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"children": [],
"limits": {"min": -60, "max": 60},
"tip": {"x": 0, "y": 24.96}
}
],
"limits": {"min": -90, "max": 90},
"bend": true
},
{
"id": "ear1",
"role": "ear",
"side": 1,
"index": 0,
"shape": {
"type": "teardrop",
"w": 23.68,
"h": 49.92
},
"pos": {"x": 32.56, "y": -39.68},
"rot": -26,
"sx": 1,
"sy": 1,
"z": 1,
"fill": "#7a4a24",
"children": [
{
"id": "ear1_1",
"role": "ear",
"side": 1,
"index": 1,
"pos": {"x": 0, "y": 24.96},
"rot": 0,
"sx": 1,
"sy": 1,
"z": 0,
"children": [],
"limits": {"min": -60, "max": 60},
"tip": {"x": 0, "y": 24.96}
}
],
"limits": {"min": -90, "max": 90},
"bend": true
}
],
"limits": {"min": -40, "max": 40}
}
],
"limits": {"min": -30, "max": 30}
}
]
},
"footprint": 64
}
],
"spots": {
"side": {
"hip": {
"node": "torso",
"at": [-51, -3.5],
"hands": false
},
"chest": {
"node": "torso",
"at": [82.45, 7],
"alt": [105.4, 10.5]
},
"head": {
"node": "head",
"at": [11.1, 7.36],
"alt": [23.68, 16]
},
"mouth": {
"node": "head",
"at": [44.4, 6.4],
"alt": [24.42, 19.2]
}
},
"front": {
"hip": {
"node": "torso",
"at": [35, 7],
"mirror": true,
"hands": false
},
"chest": {
"node": "torso",
"at": [0, 3.5],
"hands": false
},
"head": {
"node": "head",
"at": [22.2, -48],
"mirror": true,
"hands": false
},
"mouth": {
"node": "head",
"at": [0, 1.28],
"hands": false
}
},
"back": {
"hip": {
"node": "torso",
"at": [35, 7],
"mirror": true,
"hands": false
},
"chest": {
"node": "torso",
"at": [0, 3.5],
"hands": false
},
"head": {
"node": "head",
"at": [22.2, -48],
"mirror": true,
"hands": false
},
"mouth": {
"node": "head",
"at": [0, 1.28],
"hands": false
}
}
}
}
}What the check says: character.content: must be a character pack's content, with its node tree in content.tree
clip_bad
Error A wave's clip is neither "pos" nor "neg".
How to fix it: Use "pos" (only the upper half) or "neg" (only the lower half), or leave it out.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "wave", "ch": "dy", "clip": "up"}]}
]
}What the check says: scripts[0].body[0].clip: must be "pos" or "neg"
content_hash_wrong
Error The pack's content_hash is not the hash of its content.
How to fix it: Set content_hash to the value the fix gives: sha256 of the canonical JSON of the content.
An example that gets this code
{
"pack": 1,
"id": "c4c:beh:wave_hello",
"type": "behaviour",
"version": "1.0.0",
"name": "Wave hello",
"description": "Raises the right arm and waves, with a happy little bob. Written with friendly blocks.",
"author": {"id": "you", "name": "You"},
"license": "cc0",
"remixable": true,
"derived_from": [],
"preview": {"moves": ["wave_hello"], "seconds": 6},
"content_hash": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
"content": {
"v": 1,
"kind": "behaviour",
"name": "wave_hello",
"scripts": [
{
"body": [
{"op": "mood", "mood": "happy"},
{"op": "bob", "amp": 4, "every": 1.2},
{
"op": "setPart",
"part": "right forearm",
"deg": 20
},
{
"op": "setPart",
"part": "right arm",
"deg": 150,
"over": 0.35,
"ease": "out"
},
{
"op": "forever",
"body": [
{
"op": "turnPart",
"part": "right forearm",
"deg": -40,
"over": 0.2
},
{
"op": "turnPart",
"part": "right forearm",
"deg": 40,
"over": 0.2
}
]
}
]
}
]
}
}What the check says: content_hash: is not the hash of this content
cut_needs_place_or_mood
Error A cut changes neither the place nor the mood.
How to fix it: Give a place, a mood (the grade), or both: {"op": "cut", "place": "park", "mood": "bloom"}.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "cut"}]
}
]
}What the check says: scripts[0].body[0]: cut needs a place, a mood, or both
damping_negative
Error A spring's damping is below 0.
How to fix it: Give damping of 0 or more (0 swings on and on, 1 settles without swinging past).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "letFollow", "damping": -1}]}
]
}What the check says: scripts[0].body[0].damping: must be 0 or more (0 swings on and on, 1 settles without swinging past)
does_also_not_boolean
Error A does's "also" is not true or false.
How to fix it: Give "also": true to add the move to what the character does, or leave it out.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{
"op": "does",
"who": "A",
"behaviour": "c4c:beh:walk",
"also": "yes"
}
]
}
]
}What the check says: scripts[0].body[0].also: true or false
does_needs_move
Error A does does not say which move.
How to fix it: Give "behaviour": a move's id like "c4c:beh:wave_hello", or a move written out.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "does", "who": "A"}]
}
]
}What the check says: scripts[0].body[0].behaviour: needs a pack id like "c4c:beh:bounce" or an inline behaviour program
does_setting_unknown
Warning A does gives a setting its own move does not have; the move ignores it.
How to fix it: Use a setting of the move, or add it to the move's settings.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{
"op": "does",
"who": "A",
"behaviour": {
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "wait", "s": 1}]}]
},
"params": {"speed": 2}
}
]
}
]
}What the check says: scripts[0].body[0].params.speed: the inline behaviour has no such param
does_settings_not_object
Error A does's settings (params) are not {name: value}.
How to fix it: Write them as {"t_in": 2}.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{
"op": "does",
"who": "A",
"behaviour": "c4c:beh:walk",
"params": [1]
}
]
}
]
}What the check says: scripts[0].body[0].params: must be {name: value}
drive_needs_channel_and_value
Error A drive block lacks "ch" or "value".
How to fix it: Give both: "ch": "dy", "value": "=sin(t) * 10".
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "drive", "ch": "dy"}]}]
}What the check says: scripts[0].body[0]: drive needs "ch" and "value"
dur_unknown_here
Warning A scene reads "dur", the scene's length, which is known only when the next scene is pinned with "at"; here it is Infinity.
How to fix it: Pin the next scene with "at" (seconds from the start), or use a number of seconds.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "wait", "s": "=dur"}]
}
]
}What the check says: scripts[0].body[0].s: "dur" is the scene's length only when the next scene is pinned with "at"; here it is Infinity
ease_unknown
Error A block names an ease the language does not have.
How to fix it: Use linear, smooth, inout, in, out or snappy.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{"op": "enter", "who": "A", "ease": "bouncy"}
]
}
]
}What the check says: scripts[0].body[0].ease: unknown ease "bouncy"
empty_stage
Warning Nobody is on the stage for two seconds or more (a character with half of it, or its face, in the picture is on it).
How to fix it: Bring a character on (enter, or place with x) sooner, or shorten the wait, or end the scene there.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {},
"scripts": [
{
"hat": {"on": "scene", "name": "a", "at": 4},
"body": []
},
{
"hat": {"on": "scene", "name": "b", "at": 2},
"body": []
}
]
}What the check says: Nobody is on the stage from 0 s to 4 s.
expression_invalid
Error A formula does not read: a sign, a bracket or a word is out of place.
How to fix it: Check the formula: numbers, names, + - * / ^ % and brackets, functions like sin(t); in JSON it starts with =.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "wait", "s": "=1 +"}]}]
}What the check says: scripts[0].body[0].s: expression: unexpected end of "1 +"
expression_unknown_function
Error A formula uses a function the language does not have.
How to fix it: Use one of its functions (sin, cos, abs, min, max, clamp, floor, round, sqrt and the others the spec lists).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "wait", "s": "=wobble(1)"}]}
]
}What the check says: scripts[0].body[0].s: expression: unknown function "wobble" in "wobble(1)"
facing_bad
Error A facing given as a number is neither 1 nor -1.
How to fix it: Use 1 for facing right or -1 for facing left.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "place", "who": "A", "facing": 2}]
}
]
}What the check says: scripts[0].body[0].facing: must be 1 (facing right) or -1 (facing left)
fails_when_played
Error The program fails when it is played: a formula, a block or a character it names cannot run.
How to fix it: Fix what the message names: a name in a formula that is not a setting, a variable or one the engine has; a character (who) that is not in the cast (give the cartoon a cast line with every character); or a loop that never waits (put a wait in it).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"name": "Hello, Mia",
"scripts": [
{
"hat": {"on": "scene", "name": "Hello"},
"body": [
{
"op": "enter",
"who": "dog",
"from": "left",
"x": 0.3
},
{
"op": "does",
"who": "dog",
"behaviour": "c4c:beh:wave_hello"
},
{
"op": "say",
"who": "dog",
"text": "Hi, Mia! Do you want to play?"
},
{
"op": "does",
"who": "cat",
"behaviour": "c4c:beh:bounce"
},
{
"op": "say",
"who": "cat",
"text": "Yes, please!",
"mood": "happy"
}
]
}
]
}What the check says: The cartoon cannot start: no character "dog".
falloff_large
Warning A falloff over 2 makes each segment swing more than twice the one before.
How to fix it: Use a falloff of 2 or less.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "flop", "falloff": 3}]}]
}What the check says: scripts[0].body[0].falloff: a falloff of 3 makes each segment swing more than twice the one before
falloff_not_positive
Warning A falloff of 0 or less stops or flips every segment after the first.
How to fix it: Give a falloff more than 0 (1 keeps every segment the same).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "flop", "falloff": 0}]}]
}What the check says: scripts[0].body[0].falloff: a falloff of 0 stops or flips every segment after the first
feet_off_stage
Warning A character's feet (y) are outside the picture, so it stands out of frame.
How to fix it: Keep y between 0 (the top edge) and 1 (the bottom edge); the ground is 0.92.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "place", "who": "A", "y": 1.4}]
}
]
}What the check says: scripts[0].body[0].y: y 1.4 is off the stage (0 is the top edge, 1 the bottom edge, the ground 0.92): the character's feet are out of frame
ffmpeg_failed
Error ffmpeg stopped with an error, so the video was not made.
How to fix it: Read the last lines of ffmpeg's own message (in the result), and try again; a full disk or a folder you cannot write to are the usual causes.
Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.
ffmpeg_missing
Error Making a video needs ffmpeg, and none was found. Frames and contact sheets work without it.
How to fix it: Get ffmpeg one of three ways: install it from https://ffmpeg.org/download.html or your package manager (winget install ffmpeg, brew install ffmpeg, apt install ffmpeg) so it is on your PATH; point at one you have with --ffmpeg <path> or JABBERTOON_FFMPEG=<path>; or run npm install ffmpeg-static where you run jabbertoon. Jabbertoon does not ship ffmpeg.
Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.
ffmpeg_no_h264
Error The ffmpeg found cannot write H.264 video (it has none of libx264, h264_mf, h264_videotoolbox or libopenh264).
How to fix it: Use a full build of ffmpeg (https://ffmpeg.org/download.html), or point at another with --ffmpeg <path>.
Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.
ffmpeg_no_webp
Error The ffmpeg found cannot write animated WebP (it has no libwebp_anim encoder).
How to fix it: Use a build of ffmpeg with libwebp (the full builds at https://ffmpeg.org/download.html have it).
Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.
field_ignored
Warning A block has a field it does not take; it is ignored.
How to fix it: Remove the field, or check its spelling.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{
"body": [
{
"2": 1,
"10": 1,
"op": "set",
"to": {"dx": 1},
"note": "hi",
"id": "b1",
"extra": 2
}
]
}
]
}What the check says: scripts[0].body[0]: "set" ignores "2"
file_exists
Error A file with that name is already there, and it was not replaced.
How to fix it: Give another name, or pass overwrite: true to replace it.
Why there is no example: This code is about a file, a folder or the computer the jabbertoon tool runs on, not about a program, so no program gets it. The message the tool gives with it names the file or the folder, or what the computer needs, such as Node.js.
file_not_found
Error There is no file of that name in the output folder.
How to fix it: Give the name of a .json or .txt file in the output folder (jabbertoon doctor says where the folder is).
Why there is no example: This code is about a file, a folder or the computer the jabbertoon tool runs on, not about a program, so no program gets it. The message the tool gives with it names the file or the folder, or what the computer needs, such as Node.js.
file_unreadable
Error That file could not be read: it is not a cartoon's JSON or screenplay text, or not UTF-8.
How to fix it: Save the cartoon as UTF-8 JSON (.json) or screenplay text (.txt), then give its name again.
Why there is no example: This code is about a file, a folder or the computer the jabbertoon tool runs on, not about a program, so no program gets it. The message the tool gives with it names the file or the folder, or what the computer needs, such as Node.js.
folder_not_writable
Error The output folder cannot be made or written to.
How to fix it: Choose another folder with --out <folder> or JABBERTOON_OUT, one you can write to.
Why there is no example: This code is about a file, a folder or the computer the jabbertoon tool runs on, not about a program, so no program gets it. The message the tool gives with it names the file or the folder, or what the computer needs, such as Node.js.
follow_after_bad
Error A let-follow block follows something other than the body or a part.
How to fix it: Follow "body" or a part, like "head".
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "letFollow", "after": "lift:head"}]}
]
}What the check says: scripts[0].body[0].after: follows "body" or a part, not "lift:head"
follow_after_segment
Error A let-follow block follows one segment or one leg, not a whole part.
How to fix it: Follow the whole part ("tail", "head").
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "letFollow", "after": "part:tail#2"}]}
]
}What the check says: scripts[0].body[0].after: follows a whole part, not one segment or leg ("part:tail#2")
follow_channels_empty
Error A follow block's list of channels is empty.
How to fix it: Give at least one channel in "ch".
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "follow", "ch": [], "source": "dy"}]}
]
}What the check says: scripts[0].body[0].ch: needs at least one channel
follow_mood
Error A follow block follows or moves "mood", which is not a number.
How to fix it: Follow a number channel (dy, rot, a part).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{
"body": [
{
"op": "follow",
"ch": "part:tail",
"source": "mood"
},
{"op": "follow", "ch": "mood", "source": "dy"}
]
}
]
}What the check says: scripts[0].body[0].source: mood is not a number: follow a number channel
follow_needs_channel_and_source
Error A follow block lacks "ch" (what moves) or "source" (what it follows).
How to fix it: Give both: "ch": "part:tail", "source": "dy".
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "follow", "ch": "part:tail"}]}
]
}What the check says: scripts[0].body[0]: follow needs "ch" and "source"
follow_source_bad
Error A follow block's source is not one channel.
How to fix it: Give the source as one channel, like "dy".
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{
"body": [
{
"op": "follow",
"ch": "part:tail",
"source": ["dy"]
}
]
}
]
}What the check says: scripts[0].body[0].source: must be one channel, like "dy", not ["dy"]
format_1_project
Error That project file is the studio's older format (format 1), which this renderer does not read.
How to fix it: Open it in the studio at https://jabbertoon.com/studio/ and save it again, or give the cartoon program itself.
An example that gets this code
{
"jabbertoon": "cartoon",
"format": 1,
"name": "Old",
"cast": [null, null],
"names": ["A", "B"],
"scenes": []
}What the check says: That project file is the studio's older format (format 1), which this renderer does not read.
gait_bob_bad
Error A walk cycle's bob is neither [base, amp] nor null.
How to fix it: Give bob as [-2, 3] (two numbers), or null for no bob.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "gait", "bob": [1]}]}]
}What the check says: scripts[0].body[0].bob: must be [base, amp] or null
glide_cut
Warning An enter, an exit or a glide (place … in N s) is cut off before it lands, when its scene ends; an exit cut off leaves the character on the stage.
How to fix it: Give the enter, exit or place time to land: a wait after it, or pin the next scene later.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"B": {"look": {"template": "cat"}, "at": {"x": 0.5}}
},
"scripts": [
{
"hat": {"on": "scene", "name": "a"},
"body": [
{"op": "place", "who": "B", "x": 0.5},
{"op": "wait", "s": 0.1},
{
"op": "exit",
"who": "B",
"to": "right",
"over": 0.2
}
]
},
{
"hat": {"on": "scene", "name": "b", "at": 0.3},
"body": [{"op": "wait", "s": 1}]
}
]
}What the check says: B's exit to the right lands just after it should, when scene "a" ends at 0.3 s, so B stays on stage, just out of the frame.
hat_never_fires
Warning A move starts a script with a hat that never fires in a cartoon (touch, beat, loud, every), so those blocks never run.
How to fix it: Use a hat that fires in a cartoon: when it starts, when the scene starts, when I start talking, when I stop talking.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "hop", "amp": 20}]},
{"hat": {"on": "beat"}, "body": [{"op": "squash"}]}
]
}What the check says: The "beat" hat in this move never fires: nothing in a cartoon sends it, so its blocks never run.
hat_unknown
Error A move's script starts with a hat the language does not have.
How to fix it: Start the script with a hat it has: start, talk-start, talk-end, scene, key, click (and beat, loud, every, touch, which never fire).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"hat": {"on": "wink"}, "body": []}]
}What the check says: scripts[0].hat: unknown hat "wink"
hold_negative
Warning A reach holds for less than 0 s, so it lets go at once.
How to fix it: Give hold 0 or more seconds.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "reach", "at": "head", "hold": -1}]}
]
}What the check says: scripts[0].body[0].hold: a hold below 0 lets go at once
image_unreadable
Error A picture in the project could not be read as an image.
How to fix it: Give the picture as a PNG data URL ("data:image/png;base64,..."), as the studio saves it.
An example that gets this code
{
"format": "jabbertoon-project",
"version": 2,
"cartoon": {
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Ann"}},
"scripts": [
{
"hat": {"on": "scene", "name": "One"},
"body": [{"op": "say", "who": "A", "text": "Hi!"}]
}
]
},
"assets": {
"characters": {
"A": {
"kind": "drawn",
"png": "data:image/png;base64,aGVsbG8="
}
},
"sounds": {}
}
}What the check says: assets.characters.A.png: Character A's picture could not be read (that is not an image this renderer can read (Unsupported image type)).
input_hat_in_video
Warning A move starts a script with key or click, which fire only in the block editor, never in a video.
How to fix it: In a video nobody presses a key or clicks: start it with "when it starts" or "when the scene starts" instead.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"look": {"template": "cat"}, "at": {"x": 0.5}}
},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{
"op": "does",
"who": "A",
"behaviour": {
"v": 1,
"kind": "behaviour",
"scripts": [
{
"hat": {"on": "key"},
"body": [{"op": "hop", "amp": 30}]
}
]
},
"for": 1
},
{"op": "wait", "s": 1}
]
}
]
}What the check says: The "key" hat in A's move fires only in the block editor, when someone presses a key; in a video it never fires.
invalid_program
Error The program does not validate, so it cannot be played.
How to fix it: Validate the program and fix the errors it lists (each names its block by its path), then play it again.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "nope"}]}]
}What the check says: It does not validate, so it cannot be played: scripts[0].body[0]: unknown op "nope" (op_unknown).
job_unknown
Error There is no render with that job here: a job lives only while the tool that started it runs.
How to fix it: Start the render again with render_video.
Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.
Only in the downloadable tool, not yet published: render_video
lag_negative
Warning A lag below 0 runs the wave from the tip toward the body.
How to fix it: Give a lag of 0 or more (0.08 s is the usual).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "swish", "lag": -0.1}]}]
}What the check says: scripts[0].body[0].lag: a lag below 0 (-0.1 s) runs the wave from the tip toward the body
lag_slow
Warning A lag of more than 1 s for each segment is very slow.
How to fix it: Use a lag under 1 s (0.08 s is the usual).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "swish", "lag": 2}]}]
}What the check says: scripts[0].body[0].lag: a lag of 2 s for each segment is very slow
line_cut
Warning A line is cut off before it ends, when its scene ends.
How to fix it: Give the line time to end: a wait after it, or pin the next scene later; a "stop all" ends lines too.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"at": {"x": 0.4}}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{
"op": "together",
"branches": [
[
{
"op": "say",
"who": "A",
"text": "This is a long line that will not finish."
}
],
[{"op": "stopAll"}]
]
}
]
},
{
"hat": {"on": "scene", "name": "t"},
"body": [{"op": "wait", "s": 1}]
}
]
}What the check says: A's line "This is a long line that will not finis…" is cut off at 0 s, when scene "s" ends.
link_bad_name
Error This holds a name a link cannot carry (__proto__, constructor or prototype), so no link was made.
How to fix it: Rename that setting, variable or key.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"name": "wave_hello",
"scripts": [
{
"body": [
{"op": "mood", "mood": "happy"},
{"op": "bob", "amp": 4, "every": 1.2},
{
"op": "setPart",
"part": "right forearm",
"deg": 20
},
{
"op": "setPart",
"part": "right arm",
"deg": 150,
"over": 0.35,
"ease": "out"
},
{
"op": "forever",
"body": [
{
"op": "turnPart",
"part": "right forearm",
"deg": -40,
"over": 0.2
},
{
"op": "turnPart",
"part": "right forearm",
"deg": 40,
"over": 0.2
}
]
}
]
}
],
"params": {"constructor": 1}
}What the check says: program: That uses a name a link cannot carry (__proto__, constructor or prototype), so no link was made. Rename it, then make the link again.
link_too_big
Error This holds more than a link can carry (over 1 MB), so no link was made.
How to fix it: Make it smaller: fewer scenes, shorter moves, or save it to a file instead.
Why there is no example: The tools give this code from their own checks of what they are sent (the cast and its looks, a cartoon's file, a pack, a link, or the video it would make), which the engine's checks this page takes its examples from do not make. The message the tool gives with it names the part to change.
look_colors_not_object
Warning A look's colors is not an object; the renderer uses its default colours.
How to fix it: Write colors as {"body": "#ffcf77", "skin": "#9e8a78", "acc": "#6a4c93"}.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"look": {"colors": "#fff"}}},
"scripts": [
{"hat": {"on": "scene", "name": "s"}, "body": []}
]
}What the check says: cast.A.look.colors: must be {body, skin, acc}
look_colour_bad
Warning A colour is not written as one; the renderer uses its default.
How to fix it: Write a colour as # and 3 or 6 hex digits, like "#ffcf77".
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"look": {"colors": {"body": "red"}}}},
"scripts": [
{"hat": {"on": "scene", "name": "s"}, "body": []}
]
}What the check says: cast.A.look.colors.body: must be a colour like "#ffcf77", not "red"
look_colour_outside_colors
Warning A colour is written straight in the look, where the renderer does not read it.
How to fix it: Move it into "colors": {"colors": {"body": "#ffcf77", "skin": "#9e8a78", "acc": "#6a4c93"}}.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"look": {"template": "dog", "skin": "#9e8a78"}}
},
"scripts": [
{"hat": {"on": "scene", "name": "s"}, "body": []}
]
}What the check says: cast.A.look: "skin" is a colour: colours go in "colors" ({body, skin, acc}), where the renderer reads them
look_colour_unknown
Warning A colour slot is not one a character has; it is ignored.
How to fix it: Use the slots body, skin and acc (list_characters says what each one paints).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"look": {"colors": {"hair": "#fff"}}}},
"scripts": [
{"hat": {"on": "scene", "name": "s"}, "body": []}
]
}What the check says: cast.A.look.colors: unknown colour "hair" (the colours are body, skin, acc)
look_facing_bad
Warning A look's facing is neither 1 nor -1; the renderer takes the art as drawn.
How to fix it: Set the look's facing to 1 (the art faces right, or the front) or -1 (it faces left).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"look": {"facing": 0}}},
"scripts": [
{"hat": {"on": "scene", "name": "s"}, "body": []}
]
}What the check says: cast.A.look.facing: must be 1 (the art faces right, or the front) or -1 (it faces left)
look_field_unknown
Warning A look has a field the renderer does not use; it is ignored.
How to fix it: Use template, style, shape, look, proportions, colors, stretch, options and facing only.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"look": {"template": "dog", "hat": "tall"}}
},
"scripts": [
{"hat": {"on": "scene", "name": "s"}, "body": []}
]
}What the check says: cast.A.look: unknown field "hat"
look_given_twice
Warning A look gives both the studio's name and the engine's name for one thing (look and style, or proportions and shape); the engine's wins.
How to fix it: Keep one of the two: style (or look), shape (or proportions).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"look": {"look": "crayon", "style": "flat"}}
},
"scripts": [
{"hat": {"on": "scene", "name": "s"}, "body": []}
]
}What the check says: cast.A.look.look: is the studio's name for "style", which is given too and wins: keep one
look_name_not_text
Warning A name in a look (template, style, shape and so on) is not text; the renderer uses its own.
How to fix it: Give it as text: "template": "dog".
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"look": {"template": 5}}},
"scripts": [
{"hat": {"on": "scene", "name": "s"}, "body": []}
]
}What the check says: cast.A.look.template: must be a name (a string)
look_not_object
Error A cast member's look is not an object.
How to fix it: Write the look as {"template": "dog", "style": "outlined", "colors": {"body": "#ffcf77"}}.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"look": "flat"}},
"scripts": [
{"hat": {"on": "scene", "name": "s"}, "body": []}
]
}What the check says: cast.A.look: must be {template, style, shape, colors, facing}
look_options_not_object
Warning A look's options is not an object; it is ignored.
How to fix it: Write options as {"name": value}, the options list_characters gives for the template.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"look": {"options": [true]}}},
"scripts": [
{"hat": {"on": "scene", "name": "s"}, "body": []}
]
}What the check says: cast.A.look.options: must be {name: value}
look_outside_picture
Error A cast member's look names a picture from outside (an emoji, an image address, an avatar), which jabbertoon.com never fetches, so render_video refuses that character.
How to fix it: Draw it as one of the six ready-made characters instead ({"template": "dog"}), and leave the picture out.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {
"name": "Ann",
"look": {
"template": "kid",
"image": "https://example.com/ann.png"
}
}
},
"scripts": [
{
"hat": {"on": "scene", "name": "One"},
"body": [{"op": "say", "who": "A", "text": "Hi!"}]
}
]
}What the check says: cast.A.look.image: "image" names a picture from outside, which jabbertoon.com never fetches, so render_video refuses this character
Only in the downloadable tool, not yet published: render_video
look_stretch_bad
Warning A stretch is not a number more than 0; it is ignored.
How to fix it: Give each stretch as a number more than 0 (1 is as drawn).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"look": {"stretch": {"head": 0}}}},
"scripts": [
{"hat": {"on": "scene", "name": "s"}, "body": []}
]
}What the check says: cast.A.look.stretch.head: must be a number more than 0, not 0
look_stretch_field_unknown
Warning A look's stretch has a part other than head, body and legs; it is ignored.
How to fix it: Stretch only head, body and legs.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"look": {"stretch": {"arms": 2}}}},
"scripts": [
{"hat": {"on": "scene", "name": "s"}, "body": []}
]
}What the check says: cast.A.look.stretch: unknown field "arms" (stretch has head, body, legs)
look_stretch_not_object
Warning A look's stretch is not {head, body, legs}; it is ignored.
How to fix it: Write stretch as {"head": 1.2, "body": 1, "legs": 0.9} (1 is as drawn).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"look": {"stretch": 2}}},
"scripts": [
{"hat": {"on": "scene", "name": "s"}, "body": []}
]
}What the check says: cast.A.look.stretch: must be {head, body, legs}
mood_missing
Error A mood block does not say which mood.
How to fix it: Give "mood": happy, sad, angry, surprised or normal.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "mood", "who": "A"}]
}
]
}What the check says: scripts[0].body[0].mood: needs a mood, e.g. "happy"
move_block_in_scene
Error A scene uses a block that moves a character, which is a move's job.
How to fix it: Put the block in a move (a behaviour program) and start it with does {who, behaviour}.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "move", "dx": 10}]
}
]
}What the check says: scripts[0].body[0]: "move" moves a character; in a scene, put it in a behaviour and use does {who, behaviour}
move_cut
Warning A move given a time (does … for N s) is cut off before it is done, when its scene ends.
How to fix it: A does with a for does not wait: put a wait after it, or give the scene time for the move to end.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"look": {"template": "kid"}, "at": {"x": 0.3}},
"B": {
"look": {"template": "dog"},
"at": {"x": 0.7, "facing": -1}
}
},
"places": {"park": "meadow"},
"scripts": [
{
"hat": {
"on": "scene",
"name": "One",
"place": "park"
},
"body": [
{"op": "say", "who": "A", "text": "Bye!"},
{
"op": "does",
"who": "A",
"behaviour": "c4c:beh:wave_hello",
"for": 3
}
]
},
{
"hat": {
"on": "scene",
"name": "Two",
"place": "park",
"at": 3
},
"body": [
{"op": "say", "who": "A", "text": "Hi again"},
{
"op": "exit",
"who": "B",
"to": "right",
"over": 4
}
]
},
{
"hat": {
"on": "scene",
"name": "Three",
"place": "park",
"at": 5
},
"body": [
{"op": "caption", "text": "The end", "for": 2}
]
}
]
}What the check says: A's move "c4c:beh:wave_hello" is cut off when scene "One" ends at 3 s: 2.4 of 3 s done.
move_id_bad
Error A does names a move that is not a pack id.
How to fix it: Give a move's id, like "c4c:beh:walk" (list_moves gives them all).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{"op": "does", "who": "A", "behaviour": "walk"},
{
"op": "does",
"who": "B",
"behaviour": {"id": "Walk"}
}
]
}
]
}What the check says: scripts[0].body[0].behaviour: "walk" is not a pack id like "c4c:beh:bounce"
move_version_not_text
Error A does gives a move's version that is not text.
How to fix it: Give the version as text, like "1.0.0", or leave it out.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{
"op": "does",
"who": "A",
"behaviour": {"id": "c4c:beh:walk", "version": 1}
}
]
}
]
}What the check says: scripts[0].body[0].behaviour.version: must be a string
move_wrong_body
Warning A character does a move that does not suit its body: it moves nothing on it, or it moves legs the character does not have.
How to fix it: Give this character a move made for its body (list_moves says what each move works on), or another character.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {
"look": {
"template": "monster",
"options": {"legs": 0}
},
"legs": 0,
"at": {"x": 0.5}
}
},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{
"op": "does",
"who": "A",
"behaviour": "c4c:beh:walk",
"for": 2
},
{"op": "wait", "s": 2}
]
}
]
}What the check says: A does walk at 0 s, a move of the legs, but has no legs: only its whole body moves.
name_of_a_character
Warning A scene reads "loud" or "talking", which belong to a character; a scene reads 0.
How to fix it: Read them in a move (a behaviour) that the scene starts with does.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "wait", "s": "=loud"}]
}
]
}What the check says: scripts[0].body[0].s: "loud" belongs to a character; a scene reads 0
name_unknown
Warning A formula uses a name that is not a setting, a variable or one the engine gives, so the move fails when it plays.
How to fix it: Use a name the program has (its settings and variables) or one the engine gives: t, tau, local, dur, loud, talking, random, pi, e.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{
"body": [
{"op": "wave", "ch": "dy", "amp": "=wiggle * 3"}
]
}
]
}What the check says: scripts[0].body[0].amp: unknown name "wiggle" (param, var or builtin?)
node_missing
Error Making a video from Python is done by the jabbertoon command, which needs Node.js 22 or later, and neither the jabbertoon command nor npx was found.
How to fix it: Install Node.js 22 or later (https://nodejs.org/), which brings npx, then render again; or give render() the jabbertoon command you have, with cli= or JABBERTOON_CLI.
Why there is no example: This code is about a file, a folder or the computer the jabbertoon tool runs on, not about a program, so no program gets it. The message the tool gives with it names the file or the folder, or what the computer needs, such as Node.js.
node_too_old
Error This Node.js is older than the jabbertoon tool needs (22 or later).
How to fix it: Install Node.js 22 or later from https://nodejs.org/.
Why there is no example: This code is about a file, a folder or the computer the jabbertoon tool runs on, not about a program, so no program gets it. The message the tool gives with it names the file or the folder, or what the computer needs, such as Node.js.
not_a_cartoon
Error That is not something Jabbertoon can draw: it is not a cartoon, scene or move program, a cartoon pack, or a project file.
How to fix it: Give a cartoon program ({"v": 1, "kind": "cartoon", "cast": {...}, "scripts": [...]}), a cartoon pack, a .jabbertoon.json project (version 2), or a move program.
Why there is no example: The tools give this code from their own checks of what they are sent (the cast and its looks, a cartoon's file, a pack, a link, or the video it would make), which the engine's checks this page takes its examples from do not make. The message the tool gives with it names the part to change.
not_found
Error There is nothing of that name.
How to fix it: Use a name the tool lists (list_moves for a move).
Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.
not_json
Error That is not something a link can carry, so no link was made.
How to fix it: Give plain JSON values only: objects, lists, text, numbers, true, false and null.
Why there is no example: The tools give this code from their own checks of what they are sent (the cast and its looks, a cartoon's file, a pack, a link, or the video it would make), which the engine's checks this page takes its examples from do not make. The message the tool gives with it names the part to change.
not_supported_here
Error This door does not do that: it is done by the tool on your own computer (reading a file, playing the cartoon through).
How to fix it: Send the cartoon itself, or use the jabbertoon tool on your own computer.
Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.
number_not_finite
Error A number is not finite (it is too big, or not a number at all).
How to fix it: Give an ordinary number.
An example that gets this code
{"v":1,"kind":"behaviour","vars":{"x":1e400},"scripts":[]} What the check says: vars.x: not a finite number
offline
Error The tool runs with --offline, so the report was not sent.
How to fix it: Run the tool without --offline to send reports, or write to hello@jabbertoon.com.
Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.
offstage
Warning A character is shown partly out of the frame (more than 2% of its width or its height past an edge, or a quarter of its face out of the picture) while not entering or leaving.
How to fix it: Place the character where all of it is in the picture, its face too: no more than 2% of its width or its height past an edge (the issue gives the places that keep it in when there are some: a dog or a cat, drawn wider than it is tall, needs more room from an edge than a person), its feet, y, near the ground at 0.92; or let it exit if it should leave. When its own move takes it out, the issue names the move.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {
"look": {"template": "dog"},
"at": {"x": 0.5, "h": 1.15}
}
},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "wait", "s": 1}]
}
]
}What the check says: A's face is out of the frame from 0 s to 1 s (at x 0.5, facing right; 64% of its face in the picture): it is out above the frame: give it a smaller size, or its feet (y) near the ground at 0.92.
op_unknown
Error A block's "op" is not one the language has.
How to fix it: Use a block the language has (the spec lists them; a scene uses say, does, caption, cut, enter, exit, place, mood and the control blocks).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "fly"}]}]
}What the check says: scripts[0].body[0]: unknown op "fly"
option_unknown
Warning A cast member's look gives an option its character does not have, so it does nothing.
How to fix it: Use the character's own options (list_characters gives each one's), or leave the option out.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {
"name": "Blob",
"look": {
"template": "monster",
"options": {"wings": 2}
}
}
},
"scripts": [
{
"hat": {"on": "scene", "name": "One"},
"body": [{"op": "say", "who": "A", "text": "Hi!"}]
}
]
}What the check says: cast.A.look.options: the monster has no option "wings", so it does nothing
option_value_unknown
Warning A look option has a value the character does not take, so the site reads it as one of the values it does take.
How to fix it: Use one of the values list_characters gives for that option.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {
"name": "Blob",
"look": {
"template": "monster",
"options": {"eyes": 7}
}
}
},
"scripts": [
{
"hat": {"on": "scene", "name": "One"},
"body": [{"op": "say", "who": "A", "text": "Hi!"}]
}
]
}What the check says: cast.A.look.options.eyes: the monster's option "eyes" (Eyes) takes 2 (Two) or 1 (One), not 7, so the site reads it as "Two"
overlap
Warning Two characters stand over each other for half a second or more: one covers half or more of the other, one face covers half or more of the other face, or the one drawn in front (the later in the cast, in the order a link gives it) covers half or more of the face of the one behind.
How to fix it: Move one of them away from the other: the issue gives the place, and the smaller size when only a smaller one has room, that keeps them apart with all of each in the picture; or have one exit first. When a move carries one onto the other, the issue names it.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"look": {"template": "person"}, "at": {"x": 0.5}},
"B": {"look": {"template": "kid"}, "at": {"x": 0.52}}
},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{"op": "wait", "s": 2},
{"op": "place", "who": "B", "x": 0.8, "over": 0.5},
{"op": "wait", "s": 1}
]
}
]
}What the check says: A and B stand over each other from 0 s to 2.167 s; placed at x 0.59, B stays clear of A with all of it in the picture.
own_move_not_a_move
Error A does was given a program of its own that is not a move.
How to fix it: Give the move "kind": "behaviour".
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{
"op": "does",
"who": "A",
"behaviour": {
"v": 1,
"kind": "scene",
"scripts": []
}
}
]
}
]
}What the check says: scripts[0].body[0].behaviour.kind: an inline behaviour needs kind "behaviour"
pack_invalid
Error A field of the pack's manifest is not right (its id, version, type, name, licence or another).
How to fix it: Fix the field named, as the pack format describes: https://jabbertoon.com/docs/packs/.
An example that gets this code
{
"pack": 1,
"id": "c4c:beh:wave_hello",
"type": "behaviour",
"version": "one",
"name": "Wave hello",
"description": "Raises the right arm and waves, with a happy little bob. Written with friendly blocks.",
"author": {"id": "you", "name": "You"},
"license": "cc0",
"remixable": true,
"derived_from": [],
"preview": {"moves": ["wave_hello"], "seconds": 6},
"content_hash": "sha256:a7cc2f929a2014dc87c812a99f9156a9b5c4e09db56940506eff667f99f27463",
"content": {
"v": 1,
"kind": "behaviour",
"name": "wave_hello",
"scripts": [
{
"body": [
{"op": "mood", "mood": "happy"},
{"op": "bob", "amp": 4, "every": 1.2},
{
"op": "setPart",
"part": "right forearm",
"deg": 20
},
{
"op": "setPart",
"part": "right arm",
"deg": 150,
"over": 0.35,
"ease": "out"
},
{
"op": "forever",
"body": [
{
"op": "turnPart",
"part": "right forearm",
"deg": -40,
"over": 0.2
},
{
"op": "turnPart",
"part": "right forearm",
"deg": 40,
"over": 0.2
}
]
}
]
}
]
}
}What the check says: version: semver x.y.z
part_not_a_name
Error A block's "part" is not text.
How to fix it: Name the part as text: "right arm", "tail", "ears".
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "setPart", "part": 5, "deg": 10}]}
]
}What the check says: scripts[0].body[0].part: part name expected, got 5
part_not_drawn
Warning A block moves the neck, which no character draws, so it shows nothing.
How to fix it: Move the head or the torso instead.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "set", "to": {"part:neck": 10}}]}
]
}What the check says: scripts[0].body[0].to.part:neck: no character draws a neck, so "part:neck" moves nothing
part_role_unknown
Warning A part channel names a part no character has, so nothing moves.
How to fix it: Use a part of the vocabulary: head, torso, hips, arm, forearm, hand, leg, shin, foot, tail, ear, wing, fin, claw, snout, nose, hair, hat, eye, brow.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "set", "to": {"part:elbow": 10}}]}
]
}What the check says: scripts[0].body[0].to.part:elbow: no part is called "elbow": nothing draws "part:elbow"
part_unknown
Error A block names a part the language does not know.
How to fix it: Name a part like "right arm", "left leg", "tail", "ears", "head" or "body".
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{
"body": [
{"op": "setPart", "part": "elbow", "deg": 10},
{"op": "letFollow", "after": "part:elbow"}
]
}
]
}What the check says: scripts[0].body[0].part: unknown part "elbow"
path_outside_folder
Error That file name would put the file outside the output folder.
How to fix it: Give a plain file name (letters, digits, spaces, dots, dashes), with no folder in it.
Why there is no example: This code is about a file, a folder or the computer the jabbertoon tool runs on, not about a program, so no program gets it. The message the tool gives with it names the file or the folder, or what the computer needs, such as Node.js.
pinned_scene_squeezed
Warning A scene runs 0 s: the next scene's pinned start had passed when it began.
How to fix it: Pin the next scene later, or shorten what comes before this scene.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"at": {"x": 0.4}}},
"scripts": [
{
"hat": {"on": "scene", "name": "a"},
"body": [{"op": "wait", "s": 2}]
},
{
"hat": {"on": "scene", "name": "b"},
"body": [
{"op": "say", "who": "A", "text": "Squeezed."}
]
},
{
"hat": {"on": "scene", "name": "c", "at": 1},
"body": [{"op": "wait", "s": 1}]
}
]
}What the check says: Scene "b" runs 0 s: the next scene's pinned start had passed when it began at 2 s.
place_entry_bad
Error A place is neither a background's name nor {background, grade}.
How to fix it: Write the place as "meadow" or {"background": "meadow", "grade": "bloom"}.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"places": {"park": 5},
"scripts": [
{"hat": {"on": "scene", "name": "s"}, "body": []}
]
}What the check says: places.park: must be a background name or {background, grade}
place_needs_a_value
Error A place block gives none of x, y, h and facing.
How to fix it: Give at least one: {"op": "place", "who": "A", "x": 0.3}.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "place", "who": "A"}]
}
]
}What the check says: scripts[0].body[0]: place needs at least one of x, y, h, facing
place_not_a_name
Error A place is not given as a name.
How to fix it: Give the place as text: a name of the places (or a background, like "meadow").
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"places": {"park": "meadow"},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "cut", "place": 5}]
}
]
}What the check says: scripts[0].body[0].place: must be a place name
place_unknown
Error A cut or a scene names a place the places do not have.
How to fix it: Use a name of the places, or add it to "places".
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"places": {"park": "meadow"},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "cut", "place": "beach"}]
}
]
}What the check says: scripts[0].body[0].place: unknown place "beach" (places: park)
places_not_object
Error The places are not an object of places by name.
How to fix it: Write places as {"park": {"background": "meadow", "grade": "normal"}}.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"legs": 2}, "B": {"legs": 2}},
"scripts": [
{"hat": {"on": "scene", "name": "s"}, "body": []}
],
"places": []
}What the check says: places: must be {name: {background, grade}}
play_warning
Warning The player warned about something while it played the cartoon; the issue gives its words.
How to fix it: Read what the player says and change the block it names.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{
"op": "does",
"who": "A",
"behaviour": {
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "wait", "s": 1}]}]
},
"params": {"speed": 2}
}
]
}
]
}What the check says: The player warns: does inline: the behaviour has no param "speed" (passed anyway).
point_field_unknown
Error A point has a field other than x and y.
How to fix it: Keep only x and y in the point.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{
"body": [
{"op": "reach", "to": {"x": 1, "y": 2, "z": 3}}
]
}
]
}What the check says: scripts[0].body[0].to: a point has x and y only, not "z"
point_needs_x_and_y
Error A point is missing x or y.
How to fix it: Give both x and y.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "reach", "to": {"x": 1}}]}]
}What the check says: scripts[0].body[0].to: needs y
point_not_object
Error A reach "to" is not a point {x, y}.
How to fix it: Give the point as {"x": 80, "y": 300} (pixels from the feet, x toward the front).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "reach", "to": [1, 2]}]}]
}What the check says: scripts[0].body[0].to: must be a point {x, y}, not [1,2]
program_kind_unknown
Error The program's "kind" is not one the language has.
How to fix it: Set "kind" to "cartoon" (scenes with a cast), "scene" (one scene) or "behaviour" (a move for one character).
An example that gets this code
{"v": 1, "kind": "film", "scripts": []}What the check says: kind: unknown kind "film"
program_kind_wrong
Error The program's kind is not the one this file or pack holds: a cartoon holds a kind "cartoon" program, a scene pack a kind "scene" one.
How to fix it: Set the program's kind to the one named.
An example that gets this code
{
"pack": 1,
"id": "c4c:beh:wave_hello",
"type": "behaviour",
"version": "1.0.0",
"name": "Wave hello",
"description": "Raises the right arm and waves, with a happy little bob. Written with friendly blocks.",
"author": {"id": "you", "name": "You"},
"license": "cc0",
"remixable": true,
"derived_from": [],
"preview": {"moves": ["wave_hello"], "seconds": 6},
"content_hash": "sha256:a7cc2f929a2014dc87c812a99f9156a9b5c4e09db56940506eff667f99f27463",
"content": {
"v": 1,
"kind": "cartoon",
"name": "wave_hello",
"scripts": [
{
"body": [
{"op": "mood", "mood": "happy"},
{"op": "bob", "amp": 4, "every": 1.2},
{
"op": "setPart",
"part": "right forearm",
"deg": 20
},
{
"op": "setPart",
"part": "right arm",
"deg": 150,
"over": 0.35,
"ease": "out"
},
{
"op": "forever",
"body": [
{
"op": "turnPart",
"part": "right forearm",
"deg": -40,
"over": 0.2
},
{
"op": "turnPart",
"part": "right forearm",
"deg": 40,
"over": 0.2
}
]
}
]
}
]
}
}What the check says: content.kind: must be "behaviour"
program_not_object
Error What was given is not a program: a program is a JSON object.
How to fix it: Give the program as an object: {"v": 1, "kind": "cartoon", "cast": {...}, "scripts": [...]}.
An example that gets this code
5What the check says: program is not an object
program_scripts_not_list
Error The program's "scripts" is not a list.
How to fix it: Make "scripts" a list of scripts: [{"hat": {...}, "body": [...]}].
An example that gets this code
{"v": 1, "kind": "behaviour", "scripts": null}What the check says: scripts: must be an array
program_version
Error The program's "v" is not 1, the only version of the language.
How to fix it: Set "v" to 1.
An example that gets this code
{"v": 2, "kind": "behaviour", "scripts": []}What the check says: v: must be 1
reach_needs_target
Error A reach gives neither a point (to) nor a spot (at).
How to fix it: Give "to" a point {x, y} or "at" a spot: hip, head, chest or mouth.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "reach"}]}]
}What the check says: scripts[0].body[0]: reach needs "to" (a point {x, y}) or "at" (a spot: hip, head, chest, mouth)
reach_not_a_limb
Error A reach or a let-go moves something that is not a hand or a foot.
How to fix it: Reach with a hand or a foot: "right hand", "left foot", "hands", "feet".
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{
"body": [
{"op": "reach", "part": "tail", "at": "hip"}
]
}
]
}What the check says: scripts[0].body[0].part: reach moves a hand or a foot (right hand, left foot, hands, feet), not "tail"
reach_offset_without_spot
Error A reach moves a point with dx or dy, which only move a spot.
How to fix it: Use dx and dy with "at" (a spot); a point is a place of its own.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{
"body": [
{"op": "reach", "to": {"x": 1, "y": 2}, "dx": 0.1}
]
}
]
}What the check says: scripts[0].body[0].dx: dx moves a spot: give it with "at" (a spot), not with a point
reach_to_and_at
Error A reach gives both a point (to) and a spot (at).
How to fix it: Give one: "to" a point {x, y}, or "at" a spot (hip, head, chest, mouth).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{
"body": [
{
"op": "reach",
"to": {"x": 1, "y": 2},
"at": "hip"
}
]
}
]
}What the check says: scripts[0].body[0]: give only one of to, at
render_failed
Error Drawing a frame failed.
How to fix it: Read the message: it names what could not be drawn. If it names the canvas library or a texture, install the package again (npm install) so that library is complete; otherwise send the code and the message (never the cartoon) with report_problem.
Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.
report_not_sent
Error The report could not be sent to jabbertoon.com.
How to fix it: Try again later, or write to hello@jabbertoon.com.
Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.
runtime_cap
Warning The render took longer than its time limit, so it was cut short: the result is partial.
How to fix it: Render a shorter part, a smaller size, or give it a longer time limit.
Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.
say_needs_text
Error A say block has no words.
How to fix it: Give the line as text: "text": "Hello!".
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "say", "who": "A", "text": " "}]
}
]
}What the check says: scripts[0].body[0].text: say needs the words, as a string
scene_block_in_move
Error A move uses a scene block (say, does, caption, cut, enter, exit, place).
How to fix it: Use scene blocks in a program of kind "cartoon" or "scene"; a move moves one character.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "say", "who": "A", "text": "Hi"}]}
]
}What the check says: scripts[0].body[0]: "say" is a scene block; use it in a program of kind "scene" or "cartoon"
scene_hat_conflict
Error Two scripts of one scene give it different places, moods or pinned starts.
How to fix it: Give the place, mood and "at" once, or the same in each script of the scene.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {},
"scripts": [
{
"hat": {"on": "scene", "name": "a", "place": "x"},
"body": []
},
{
"hat": {"on": "scene", "name": "a", "place": "y"},
"body": []
}
]
}What the check says: scripts[1].hat.place: scene "a" already has place "x"
scene_hat_field_ignored
Warning A scene hat has a field it does not take; it is ignored.
How to fix it: Keep only on, name, place, mood and at on a scene hat.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {},
"scripts": [
{
"hat": {"on": "scene", "name": "s", "colour": "red"},
"body": []
}
]
}What the check says: scripts[0].hat: a scene hat ignores "colour"
scene_hat_invalid
Error The scene hats cannot be grouped into scenes as written.
How to fix it: Give every script of a cartoon a scene hat {"on": "scene", "name": "…"}, and give a scene's place, mood and "at" once.
Why there is no example: No program gets this code today. It is kept for a way of writing the scene hats that the checks may refuse in a later version, so that such a program gets a code of its own and never another one's.
scene_pinned_before_earlier
Warning A scene is pinned before an earlier scene's pinned start, so the scene before it is cut off at once and it starts late.
How to fix it: Pin the scenes in order: each "at" later than the one before.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {},
"scripts": [
{
"hat": {"on": "scene", "name": "a", "at": 4},
"body": []
},
{
"hat": {"on": "scene", "name": "b", "at": 2},
"body": []
}
]
}What the check says: scene "b": is pinned at 2 s, before an earlier scene's pinned start (4 s): the scene before it will be cut off at once (0 s) and it will start late
scene_program_one_scene
Error A scene program names more than one scene.
How to fix it: Make it a cartoon (kind "cartoon") to have several scenes, or give every script the same scene name.
An example that gets this code
{
"v": 1,
"kind": "scene",
"cast": {},
"scripts": [
{"hat": {"on": "scene", "name": "a"}, "body": []},
{"hat": {"on": "scene", "name": "b"}, "body": []}
]
}What the check says: scripts[1].hat.name: a scene program is one scene ("a"), not "b"
scene_script_hat
Error A script of a scene program starts with a hat other than the scene's.
How to fix it: Start each script with the scene (no hat, or {"on": "scene"}); key and click are the block editor's.
An example that gets this code
{
"v": 1,
"kind": "scene",
"cast": {},
"scripts": [{"hat": {"on": "key"}, "body": []}]
}What the check says: scripts[0].hat: a scene's scripts start with the scene (no hat, or {"on":"scene"}), not "key"
scene_start_bad
Error A scene's pinned start ("at") is not a time of 0 s or more.
How to fix it: Give "at" as seconds from the cartoon's start (a number, 0 or more).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {},
"scripts": [
{
"hat": {"on": "scene", "name": "s", "at": -2},
"body": []
}
]
}What the check says: scripts[0].hat.at: must be a time in seconds (a number ≥ 0)
scene_unknown
Error The cartoon has no scene of that name.
How to fix it: Use one of the scene names the cartoon has (validate's summary lists them).
Why there is no example: The tools give this code from their own checks of what they are sent (the cast and its looks, a cartoon's file, a pack, a link, or the video it would make), which the engine's checks this page takes its examples from do not make. The message the tool gives with it names the part to change.
segments_bad
Error Segments is not a whole number from 1 to 16.
How to fix it: Give segments as a whole number from 1 to 16.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "swish", "segments": 40}]}]
}What the check says: scripts[0].body[0].segments: must be a whole number from 1 to 16, not 40
segments_not_a_chain
Warning A block gives "segments" for a part that is not a chain; it moves whole, so segments does nothing.
How to fix it: Leave segments out, or use a chain part (tail, body, ears, hair).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{
"body": [
{"op": "bend", "part": "head", "segments": 3}
]
}
]
}What the check says: scripts[0].body[0].segments: the head is not a chain: it moves whole, so "segments" does nothing
server_error
Error The tool failed on its own side.
How to fix it: Try again; if it keeps failing, call report_problem.
Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.
shape_unknown
Error A wave names a shape the language does not have.
How to fix it: Use sin, cos, abssin, possin, dampsin, square, saw or tri.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{
"body": [
{"op": "wave", "ch": "dy", "shape": "zigzag"}
]
}
]
}What the check says: scripts[0].body[0].shape: unknown shape "zigzag"
side_unknown
Error An entrance or an exit names a side the stage does not have.
How to fix it: Use left, right, top or bottom.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{"op": "enter", "who": "A", "from": "up"},
{"op": "exit", "who": "A", "to": "down"}
]
}
]
}What the check says: scripts[0].body[0].from: must be one of left, right, top, bottom
size_not_positive
Error A character's size (h) is not more than 0.
How to fix it: Give h as a share of the stage's height more than 0: 0.5 is half the height.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "place", "who": "A", "h": 0}]
}
]
}What the check says: scripts[0].body[0].h: must be more than 0 (the height as a fraction of the stage height)
sound_not_placed
Error A recording in the project is not for any line of the cartoon, so it would not be heard.
How to fix it: Key each recording in assets.sounds by the line it belongs to: "line:<n>" (or "<n>"), n counting the lines (say blocks) from 0 in the order the cartoon speaks them; or pass allow_substitutes: true to make it without that recording (listed in the result).
An example that gets this code
{
"format": "jabbertoon-project",
"version": 2,
"cartoon": {
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"name": "Ann", "look": {"template": "kid"}}
},
"scripts": [
{
"hat": {"on": "scene", "name": "One"},
"body": [{"op": "say", "who": "A", "text": "Hi!"}]
}
]
},
"assets": {
"characters": {},
"sounds": {
"line:5": {"mime": "audio/wav", "data": "UklGRg=="}
}
}
}What the check says: assets.sounds.line:5: The recording "line:5" is not for any line: the cartoon has 1 line (0 to 0), so there is no line 5. It would not be heard, so nothing was made.
sound_unreadable
Error A sound in the project could not be read.
How to fix it: Give the sound as base64 audio (WAV, MP3, OGG or WebM) with its mime type, as the studio saves a recording; ffmpeg reads it.
An example that gets this code
{
"format": "jabbertoon-project",
"version": 2,
"cartoon": {
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"name": "Ann", "look": {"template": "kid"}}
},
"scripts": [
{
"hat": {"on": "scene", "name": "One"},
"body": [{"op": "say", "who": "A", "text": "Hi!"}]
}
]
},
"assets": {
"characters": {},
"sounds": {"line:0": {"mime": "audio/wav", "data": ""}}
}
}What the check says: assets.sounds.line:0: The recording "line:0" (line 0) has no sound in it: a recording is {"mime": ..., "data": "<base64>"}.
speed_given_twice
Error A block gives more than one of w, hz and every.
How to fix it: Give one speed: w (radians a second), hz (times a second) or every (seconds each time).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{
"body": [
{"op": "wave", "ch": "dy", "w": 3, "every": 1}
]
}
]
}What the check says: scripts[0].body[0]: give only one of w, hz, every
speed_not_positive
Error A line's speed is not more than 0.
How to fix it: Give speed more than 0 (1 is the usual; 0.85 a little slower).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{"op": "say", "who": "A", "text": "Hi", "speed": 0}
]
}
]
}What the check says: scripts[0].body[0].speed: must be more than 0
spot_unknown
Error A reach names a spot the body does not have.
How to fix it: Use one of the spots: hip, head, chest, mouth.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "reach", "at": "knee"}]}]
}What the check says: scripts[0].body[0].at: unknown spot "knee" (spots: hip, head, chest, mouth)
spring_fast
Warning A spring faster than 6 a second swings further and settles differently than a real spring would.
How to fix it: Use hz of 6 or less for a close follow-through.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "letFollow", "hz": 9}]}]
}What the check says: scripts[0].body[0].hz: a spring of 9 per second is faster than the 240-a-second follow-through follows closely: it swings further and settles differently than a real spring would (up to 6 per second follows within 1 px)
spring_not_positive
Error A spring's speed (hz) is not more than 0.
How to fix it: Give hz more than 0: how many times a second the spring swings back (2 is the usual).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "letFollow", "hz": 0}]}]
}What the check says: scripts[0].body[0].hz: must be more than 0 (how many times a second the spring swings back)
spring_too_fast
Error A spring swings back more than 60 times a second.
How to fix it: Give hz of 60 or less (up to 6 follows closely).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{
"body": [
{
"op": "follow",
"ch": "part:tail",
"source": "dy",
"hz": 90
}
]
}
]
}What the check says: scripts[0].body[0].hz: must be at most 60 (the follow-through ticks 240 times a second), not 90
sync_bad
Error A wave's clock is neither "local" nor "start".
How to fix it: Use "local" (from when the block starts) or "start" (the move's own clock).
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "wave", "ch": "dy", "sync": "now"}]}
]
}What the check says: scripts[0].body[0].sync: must be "local" or "start"
talks_offstage
Warning A character says a line while it is out of the picture (less than half of it in, and its face out) for most of the line.
How to fix it: Let the character enter (or place it) before its line, or give the line to someone on stage.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{
"op": "say",
"who": "A",
"text": "Hi",
"loud": true
}
]
}
]
}What the check says: A says "Hi" at 0 s while out of the picture.
text_bad_indent
Error That line is indented to a level no line above it has.
How to fix it: Indent each block two spaces more than the line it belongs to, and keep the lines of one body at the same indent.
An example that gets this code
when it starts
wait 1 s
wait 2 sWhat the check says: Line 3, column 3: that line is indented to a level no line above it has.
text_bad_json
Error The JSON after the block's name does not read as that block.
How to fix it: Check the JSON: names and text in double quotes, no comma after the last item, and "op" the same as the word before it; or write the block in words.
An example that gets this code
when it starts
wave {"op":"hop"}What the check says: Line 2, column 8: the JSON after the block's name does not read as that block (expected the JSON of a "wave" block (its "op" is "wave"); found "{\"op\":\"hop\"}").
text_bad_value
Error A value there cannot be read.
How to fix it: Write a number (0.5), a formula in brackets ((t * 2)), or text in double quotes ("Hello").
An example that gets this code
when it starts
wait abc sWhat the check says: Line 2, column 8: a value there cannot be read (expected a number, a (formula) or "text"; found "abc").
text_block_outside_script
Error A block line is not under a hat.
How to fix it: Put a hat line above it (when it starts in a move, scene "Name" in a cartoon) and indent the block two spaces under it.
An example that gets this code
move right 4What the check says: Line 1, column 1: a block line is not under a hat.
text_branch_alone
Error A branch line (— 1:) is not under at the same time:.
How to fix it: Put each — 1:, — 2: … line (or - 1:, - 2: …) under an at the same time: line, indented two spaces.
An example that gets this code
when it starts
— 1:
wait 1 sWhat the check says: Line 2, column 3: a branch line (— 1:) is not under at the same time:.
text_cast_field_unknown
Error That cast detail is not one the text knows.
How to fix it: Use pack, template, style, look, shape, proportions, legs (4 legs), at x … y … size … facing …, voice, colors body …, stretch, art faces, options or note, separated by " · " (or "|").
An example that gets this code
cartoon
cast: A
A: template dog · wings 2
scene "s"
A says "x"What the check says: Line 3, column 21: that cast detail is not one the text knows (expected pack, template, style, look, shape, proportions, legs, at, voice, colors, stretch, art faces, options or note; found "wings").
text_cast_unknown_id
Error A cast detail line names an id the cast: line does not have.
How to fix it: Add the id to the cast: line (cast: A = Sunny, B = Grump), or fix the id at the start of the detail line.
An example that gets this code
cartoon
cast: A
B: template dog
scene "s"
A says "x"What the check says: Line 3, column 3: a cast detail line names an id the cast: line does not have ("B").
text_child_not_allowed
Error That line is indented under a line that holds no lines.
How to fix it: Unindent it, or move it under a hat or a block that holds a body (for, until, repeat, forever, while, if, between, at the same time).
An example that gets this code
cartoon
places: park = meadow
wait 1 s
scene "s"
wait 1 sWhat the check says: Line 3, column 3: that line is indented under a line that holds no lines.
text_else_alone
Error Else: is not right after a block at its indent.
How to fix it: Put else: at the same indent as its if …: line, right after the lines of the if.
An example that gets this code
when it starts
else:
wait 1 sWhat the check says: Line 2, column 3: else: is not right after a block at its indent.
text_expected
Error The line reads well up to here, then has something else than the text expects.
How to fix it: Write the words the block takes at that place (the error says which), the way the Screenplay text section of the spec shows the block.
An example that gets this code
when it starts
turn 30 radiansWhat the check says: Line 2, column 11: the line reads well up to here, then has something else than the text expects (expected "°", "in", "(" or the end of the line; found "radians").
text_form_remote_unsupported
Error The remote door reads a program as JSON only, not as screenplay text.
How to fix it: Send the program as JSON (the studio's paste box and the local tool read the text and give its JSON), or use the local tool, which reads the text itself.
Why there is no example: This code is about how a cartoon is sent, not about the cartoon. The online tools for AI assistants give it when a cartoon comes to them written as screenplay text instead of JSON; the checks in the studio and the block editor read the text themselves, so no program gets it there.
text_heading_late
Error A heading comes after a scene or a hat.
How to fix it: Move the heading (cast:, places:, settings:, variables:) above the first scene or hat.
An example that gets this code
cartoon
scene "s"
wait 1 s
cast: AWhat the check says: Line 4, column 1: a heading comes after a scene or a hat (cast).
text_heading_not_first
Error The cartoon line (or the scene program line) is not the first line of the text.
How to fix it: Make cartoon "Name" the first line: take out what is above it (a sentence, or a ``` line), or move the line to the top.
An example that gets this code
cast: A = Ann
cartoon "Beach day"
scene "One"
A says "Hi!"What the check says: Line 2, column 1: the cartoon line (or the scene program line) is not the first line of the text.
text_heading_twice
Error That heading is given twice.
How to fix it: Give each heading (cartoon, cast:, places:, settings:, variables:) once, at the top.
An example that gets this code
cartoon
cast: A
cast: B
scene "s"
A says "x"What the check says: Line 3, column 1: that heading is given twice (cast).
text_not_text
Error That is not text.
How to fix it: Give the screenplay text as a string.
An example that gets this code
5What the check says: Line 1, column 1: that is not text.
text_program_not_alone
Error A program written as its JSON (program {…}) is the whole text, and a line is outside it.
How to fix it: Write the program either as one program {…} line of JSON or in the screenplay words, not both.
An example that gets this code
program {"v": 1, "kind": "behaviour", "scripts": [{"body": [{"op": "hop"}]}]}
when it starts
wait 1 sWhat the check says: Line 2, column 1: a program written as its JSON (program {…}) is the whole text, and this line is outside it.
text_unclosed_bracket
Error A bracket is not closed.
How to fix it: Close the bracket with ) on the same line: a formula, (t * 2), or the list at the end of a line, (happy, voice af_sky).
An example that gets this code
when it starts
wait (t > 1What the check says: Line 2, column 14: a bracket is not closed (expected a closing ")"; the line ends there).
text_unclosed_quote
Error A quote is not closed.
How to fix it: End the text with a double quote (") on the same line; write a quote inside text as \".
An example that gets this code
when it starts
caption "hiWhat the check says: Line 2, column 14: a quote is not closed (expected a closing quote ("); the line ends there).
text_unknown_line
Error That line is not a block, a hat or a heading the screenplay text knows.
How to fix it: Write the line the way the Screenplay text section of the spec shows it: in a scene, for example A says "Hello!" (happy), A does wave_hello or place A at x 0.3 in 1 s; in a move, turn 30° in 0.5 s.
An example that gets this code
cartoon "Oops"
scene "One"
A trun 30°What the check says: Line 3, column 3: that line is not a block, a hat or a heading the screenplay text knows ("A trun 30°").
timeout
Error The request took longer than the online tools allow and was stopped.
How to fix it: Try again in a few seconds; if it happens again, send a smaller program, or check it with the tool on your own computer.
Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.
too_large
Error The request (more than 256 KB) or its answer (more than 4 MB) is too large.
How to fix it: Send one program, pack or cartoon at a time, without data it does not need.
Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.
turn_view_instant
Warning A turn of 0 s or less changes the view at once, without the squash.
How to fix it: Give the turn a time ("over": 0.24 is the usual), or use a view block for a change at once.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "turnView", "over": 0}]}]
}What the check says: scripts[0].body[0].over: a turn of 0 s or less changes the view at once, without the squash
unknown_background
Error A scene or a cut is at a place whose background the studio does not have.
How to fix it: Use one of the studio's backgrounds: beach, meadow, classroom, stage, space or city; or give the place one on the places line (places: kitchen = classroom).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"look": {"template": "kid"}, "at": {"x": 0.3}}
},
"scripts": [
{
"hat": {
"on": "scene",
"name": "Breakfast",
"place": "kitchen"
},
"body": [
{"op": "say", "who": "A", "text": "Good morning!"},
{"op": "cut", "place": "meado"},
{"op": "wait", "s": 1},
{"op": "cut", "place": "beach"},
{"op": "wait", "s": 1}
]
}
]
}What the check says: Scene "Breakfast" at 0 s is at "kitchen", which is not a background the studio has (beach, meadow, classroom, stage, space, city).
unknown_grade
Warning A scene, a place or a cut gives a grade (the picture's colouring) the studio does not have.
How to fix it: Use one of the scene grades: normal, angry, bloom, soft or sad.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"at": {"x": 0.4}}},
"places": {
"beach": {"background": "beach", "grade": "bright"}
},
"scripts": [
{
"hat": {
"on": "scene",
"name": "Swim",
"place": "beach"
},
"body": [
{
"op": "say",
"who": "A",
"text": "Sunny!",
"mood": "mad"
},
{
"op": "say",
"who": "A",
"text": "Wow.",
"mood": "Scared"
},
{
"op": "say",
"who": "A",
"text": "Hm.",
"mood": "hapy"
}
]
}
]
}What the check says: Scene "Swim" at 0 s has the grade "bright", which is not one the studio has (normal, angry, bloom, soft, sad).
unknown_mood
Warning A line, a "looks" block or a move gives a mood that no face shows.
How to fix it: Use one of the moods a face shows: happy, sad, angry, surprised or normal.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{
"body": [
{"op": "mood", "mood": "smug"},
{"op": "hop", "amp": 20}
]
}
]
}What the check says: This move has a "look" block with the mood "smug", which is not one a face shows (happy, sad, angry, surprised, normal).
unknown_move
Warning A character does a move the studio does not have; in the studio it idles instead.
How to fix it: Use a move the studio has (list_moves gives every one, with what it works on), such as walk, wave_hello or bounce.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"at": {"x": 0.4}}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{
"op": "does",
"who": "A",
"behaviour": "c4c:beh:wave_helo",
"for": 1
},
{"op": "wait", "s": 1}
]
}
]
}What the check says: A does wave_helo at 0 s, a move the studio does not have: the character idles instead.
unknown_pack
Error A cast member names a character pack Jabbertoon does not ship: the studio has no such character, and render_video refuses it.
How to fix it: Use one of the shipped character packs (c4c:char:person, c4c:char:kid, c4c:char:dog, c4c:char:cat, c4c:char:bird, c4c:char:monster), or draw a ready-made character with a look ({"look": {"template": "dog"}}).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"name": "Puff", "pack": "c4c:char:dragon"}
},
"scripts": [
{
"hat": {"on": "scene", "name": "One"},
"body": [{"op": "say", "who": "A", "text": "Hi!"}]
}
]
}What the check says: cast.A.pack: "c4c:char:dragon" is not one of the character packs shipped with Jabbertoon (c4c:char:person, c4c:char:kid, c4c:char:dog, c4c:char:cat, c4c:char:bird, c4c:char:monster): the studio has no such character, and render_video refuses it
Only in the downloadable tool, not yet published: render_video
unknown_shape
Warning A cast member's look names a body shape (look.shape) the site does not have, so it is drawn with the classic shape.
How to fix it: Use one of the three body shapes: classic, bighead or tall (list_looks gives them).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {
"name": "Rex",
"look": {"template": "dog", "shape": "round"}
}
},
"scripts": [
{
"hat": {"on": "scene", "name": "One"},
"body": [{"op": "say", "who": "A", "text": "Hi!"}]
}
]
}What the check says: cast.A.look.shape: "round" is not one of the three body shapes, so the site draws it with the classic shape
unknown_style
Warning A cast member's look names a style (look.style) the site does not have, so it is drawn in the page's own look.
How to fix it: Use one of the six looks: flat, outlined, soft, storybook, bold or crayon (list_looks gives them).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {
"name": "Rex",
"look": {"template": "dog", "style": "neon"}
}
},
"scripts": [
{
"hat": {"on": "scene", "name": "One"},
"body": [{"op": "say", "who": "A", "text": "Hi!"}]
}
]
}What the check says: cast.A.look.style: "neon" is not one of the six looks, so the site draws it in the page's own look
unknown_template
Error A cast member's template (its kind of body) is not one the studio has.
How to fix it: Use one of the studio's templates: person, kid, dog, cat, bird or monster (list_characters gives them).
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {
"A": {"look": {"template": "Dog"}, "at": {"x": 0.3}},
"B": {"look": {"template": "dgo"}, "at": {"x": 0.7}}
},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{
"op": "say",
"who": "A",
"text": "Woof.",
"mood": "Happy"
},
{"op": "cut", "mood": "Bloom"},
{"op": "wait", "s": 1}
]
}
]
}What the check says: A's template "Dog" is not one the studio has (person, kid, dog, cat, bird, monster).
unknown_tool
Error That tool is not one this door has.
How to fix it: Ask tools/list for the tools this door has (the tool on your own computer has preview and render_video too), and call one of them by its name.
Why there is no example: This code is about a call to one of the tools, not about a program, so no program gets it. It is given for the name of a tool the door does not have, for the call's arguments or size, for a name or a job the tool looks up, or when the tools are busy, stopped or could not send a report. The message the tool gives with it says what to change.
Only in the downloadable tool, not yet published: preview, render_video
unknown_voice
Warning A character speaks in a voice the studio does not have.
How to fix it: Use one of the studio's voices (list_characters gives them), such as af_heart or am_puck.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"voice": "robot", "at": {"x": 0.4}}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{"op": "say", "who": "A", "text": "Beep."},
{
"op": "say",
"who": "A",
"text": "Boop.",
"voice": "af_sky"
}
]
}
]
}What the check says: A's voice "robot" is not one of the studio's voices.
unreadable
Error The checker could not read this at all: it is not the shape of anything Jabbertoon checks.
How to fix it: Give it the shape its format describes: a program https://jabbertoon.com/docs/language/, a pack or a character https://jabbertoon.com/docs/packs/.
Why there is no example: The tools give this code from their own checks of what they are sent (the cast and its looks, a cartoon's file, a pack, a link, or the video it would make), which the engine's checks this page takes its examples from do not make. The message the tool gives with it names the part to change.
value_not_number
Error A value that must be a number is neither a number nor a formula.
How to fix it: Give a number (0.5), or a formula as text starting with = ("=t * 2").
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "wait", "s": "two"}]}]
}What the check says: scripts[0].body[0].s: expected a number or "=expression", got "two"
value_not_text
Error A value that must be text is not.
How to fix it: Give it as text in quotes.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [
{"op": "say", "who": "A", "text": "Hi", "voice": 3}
]
}
]
}What the check says: scripts[0].body[0].voice: must be a string
variable_not_a_name
Error A variable block's "var" is not a name.
How to fix it: Give the variable's name as text: "var": "score".
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [
{"body": [{"op": "setVar", "var": 3, "value": 1}]}
]
}What the check says: scripts[0].body[0].var: must be a name
variable_start_not_number
Error A variable starts at something other than a number.
How to fix it: Start each variable at a number ("vars": {"n": 0}); set it to a formula with a set block as the script runs.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"vars": {"n": "=1"},
"scripts": []
}What the check says: vars.n: a variable starts at a number, not "=1"
view_needs_to
Error A view block does not say which view.
How to fix it: Give "to": front, side or back.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "view"}]}]
}What the check says: scripts[0].body[0]: view needs "to": front, side, back
view_unknown
Error A view block names a view the characters do not have.
How to fix it: Use front, side or back.
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "view", "to": "top"}]}]
}What the check says: scripts[0].body[0].to: unknown view "top" (views: front, side, back)
voices_failed
Error The voices could not speak a line, so there is no speech.
How to fix it: Run "jabbertoon voices status" to check the install, or install them again.
Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.
voices_not_installed
Error The voices are not installed on this machine, so there is no speech. Nothing is downloaded during a render.
How to fix it: Run "jabbertoon voices install" once (about 500 MB on disk: the voice engine and its 92 MB voice model, in a folder of your own), then render again; or render without voices.
Why there is no example: This code is about making a video or a picture with the jabbertoon tool on your own computer, not about what the program says, so no program gets it. It is given for the size, the frame rate, the time or another option asked for, for ffmpeg or the voices on that computer, or for a drawing that failed or took too long. The message the tool gives with it says what to change.
wave_needs_channel
Error A wave does not say what it moves.
How to fix it: Give "ch", a channel like "dy" or "part:arm:1".
An example that gets this code
{
"v": 1,
"kind": "behaviour",
"scripts": [{"body": [{"op": "wave", "amp": 5}]}]
}What the check says: scripts[0].body[0]: wave needs "ch"
who_missing
Error A scene block does not say who.
How to fix it: Give "who", an id of the cast: "who": "A".
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "say", "text": "Hi"}]
}
]
}What the check says: scripts[0].body[0].who: needs "who": a cast id
who_not_in_cast
Error A scene block names someone who is not in the cast.
How to fix it: Use an id of the cast, or add the character to the cast.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "say", "who": "Q", "text": "x"}]
}
]
}What the check says: scripts[0].body[0].who: "Q" is not in the cast (empty)
window_end_unknown
Warning A between block counts back from the scene's end, which is known only when the next scene is pinned; here it is never reached.
How to fix it: Pin the next scene with "at", or give from and to as seconds from the scene's start.
An example that gets this code
{
"v": 1,
"kind": "cartoon",
"cast": {"A": {"name": "Sunny"}, "B": {}},
"scripts": [
{
"hat": {"on": "scene", "name": "s"},
"body": [{"op": "window", "from": -1, "body": []}]
}
]
}What the check says: scripts[0].body[0]: a negative from/to counts back from the scene's end, which is known only when the next scene is pinned with "at"; in this scene it is never reached