Asset schema

JSON Schema (draft 2020-12): /schemas/asset.v1.json. Unknown fields are not allowed.

Ids and versions

asset_ + 12 chars from abcdefghjkmnpqrstuvwxyz23456789, immutable. version is an integer from 1, cut only when file bytes, license, or attribution change. metadata_revision counts in-place metadata fixes inside a version.

Slicing data

Use frame_width, frame_height, grid_cols, and grid_rows to slice the sheet, and animations[] to group frames into clips.

"slicing": {
  "frame_width": 32, "frame_height": 32, "grid_cols": 8, "grid_rows": 2,
  "margin": 0, "spacing": 1,
  "pivot": { "x": 16, "y": 32 },
  "pivot_overrides": [ { "frame": 12, "x": 15, "y": 32 } ],
  "animations": [ { "name": "run", "frames": [8,9,10,11,12,13,14,15], "fps": 12, "loop": true } ]
}

Frame i: col = i mod grid_cols, row = floor(i / grid_cols); x = margin + col·(frame_width + spacing); y = margin + row·(frame_height + spacing). Pivot is in pixels from the frame's top-left. Rule checked at ingest: 2·margin + cols·frame_width + (cols−1)·spacing = image width (same for height).

Tileset variant (Tiled-compatible)

"slicing": { "tile_width": 16, "tile_height": 16, "margin": 0, "spacing": 1, "tile_count": 64, "columns": 8,
  "tile_properties": [ { "id": 5, "collision": true, "terrain": "grass" } ] }

Maps directly to Tiled's tilewidth, tileheight, margin, spacing, tilecount, columns.

License and provenance fields

license_spdx, license_url, attribution_required, attribution_text, commercial_use, redistribution_allowed, api_mirroring_allowed, source_url, author, retrieved_at, source_terms_url, source_terms_snapshot, license_snapshot_sha256, verification_status, verified_by, verified_at.