Creates and edits Defold resource and component files that use Protobuf Text Format (.collection, .go, .atlas, .sprite, .gui, .collisionobject, .convexshape, .label, .font, .material, .model, .mesh, .particlefx, .sound, .camera, .factory, .collectionfactory, .collectionproxy, .tilemap, .tilesource, .objectinterpolation). Use when asked to create, modify, or configure any Defold proto text format file.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
A direct command skips the review prompt. Inspect the source before running it.
Creates and edits Defold resource and component files that use Protobuf Text Format (.collection, .go, .atlas, .sprite, .gui, .collisionobject, .convexshape, .label, .font, .material, .model, .mesh, .particlefx, .sound, .camera, .factory, .collectionfactory, .collectionproxy, .tilemap, .tilesource, .objectinterpolation). Use when asked to create, modify, or configure any Defold proto text format file.
Editing Defold Proto Text Format Files
Creates and edits Defold resource and component files that use Protobuf Text Format.
When to use
This skill covers all Defold file types that are serialized as Protobuf Text Format. It does NOT cover Lua script files (.script, .gui_script, .render_script, .editor_script).
Supported file types
For detailed field references, consult the per-type reference file in references/:
references/objectinterpolation.md — .objectinterpolation files (extension: interpolation of fixed step movement)
For skill maintenance tasks (updating references, fetching proto schemas), use the defold-skill-maintain skill.
Shaders and materials relationship
Shaders (.vp, .fp, .glsl) are GLSL files and are NOT covered by this skill — use the defold-shaders-editing skill for shader files. However, shaders and materials are tightly coupled:
Data flow from material to shader
Constants declared in vertex_constants / fragment_constants become uniform variables in shaders. Engine-provided constants (CONSTANT_TYPE_VIEW, CONSTANT_TYPE_PROJECTION, etc.) are automatically populated. User constants (CONSTANT_TYPE_USER) can be animated via go.set() / go.animate().
Samplers declared in samplers become sampler2D uniforms. The sampler name in the material must match the uniform name in the shader.
Attributes declared in attributes become vertex in variables. Semantic types like SEMANTIC_TYPE_POSITION, SEMANTIC_TYPE_TEXCOORD provide engine-generated data.
Instancing with mtx_world and mtx_normal
For instanced rendering, two special vertex attributes are available without declaring them in the material's attributes section:
mtx_world — mat4 world transformation matrix (per-instance)
mtx_normal — mat4 normal transformation matrix (per-instance)
When these are declared as vertex in attributes in the shader, Defold automatically enables instanced rendering:
model.vp / model.fp — 3D model rendering (local space, uniforms)
model_instanced.vp — 3D model with instancing (uses mtx_world, mtx_normal as attributes)
Bundled scripts
scripts/get_image_size.py — Get image dimensions (width × height) from PNG/JPEG files. Pure Python, no external dependencies. Use this when creating collision object box shapes that should match sprite image sizes. See references/collisionobject.md → "Sizing box shapes from sprite images" for the full workflow.
scripts/gen_convexshape.py — Generate a .convexshape file from a 2D image's non-transparent silhouette. Uses PIL/Pillow. Computes a convex hull, simplifies to ≤16 points (Box2D limit), centers at origin, and outputs Defold .convexshape format. See references/convexshape.md → "Generating from an image" for usage.
scripts/gen_silhouette_chain.py — Generate a .collisionobject file with a chain of rotated TYPE_BOX shapes tracing the contour of any image silhouette (concave, with holes, multi-part). Uses PIL/Pillow. Extracts boundary contour loops, simplifies with RDP, and outputs a .collisionobject with thin rotated boxes along each edge. See references/collisionobject.md → "Silhouette chain from image contour" for usage.
Embedded component type names
When embedding components in .go or .collection files, these are the type string values:
"sprite" — Sprite component
"label" — Label component
"collisionobject" — Collision object
"sound" — Sound component
"particlefx" — Particle effect
"model" — 3D model
"mesh" — Mesh
"camera" — Camera
"factory" — Factory
"collectionfactory" — Collection factory
"collectionproxy" — Collection proxy
"tilegrid" — Tilemap (note: type is "tilegrid", not "tilemap")
Common mistake — closing quote of inner data: The line that closes the inner data string (the \" that ends the embedded component's data value) must use single-escaped newline "\"\n", NOT double-escaped "\"\\n". The closing quote \" is the boundary between nesting levels — after it, you are back at the outer (game object) level, so the newline is single \n. Using \\n here corrupts the game object data and causes a load error.
Note: After the opening data: \"...\\n" line inside double-nested data, subsequent lines of that inner data do NOT have leading whitespace (they start at column 0 of the quoted string).
Multi-line string concatenation blocks end with an empty "" terminator. A single-line data: "" does not need an additional terminator.
Workflow
Creating a new file
Determine the file type and path.
Consult the relevant reference file in references/ for the field structure.
Set all required fields.
Set optional fields only if they differ from defaults.
Follow proto field number order.
Apply all Protobuf Text Format rules above.
Editing an existing file
Read the current file.
Modify only the requested fields.
Preserve existing field values and order.
Apply omission rules: remove fields that become equal to their defaults after editing.
When editing existing files, preserve the existing formatting style.