Skip to content

Reference

Every pack follows an identical structure:

@sprite-foundry/<pack>/
pack.json ← pack-level index
assets/
<variant>/
manifest.json ← per-variant metadata
albedo/
front.png
front_left.png
left.png
back_left.png
back.png
back_right.png
right.png
front_right.png
normal/
(same 8 directions)
depth/
(same 8 directions)
previews/
<variant>-preview.png ← contact sheet

The pack-level index describes the collection:

{
"name": "Undead Patrol",
"slug": "undead-patrol",
"version": "1.0.0",
"tileSize": 48,
"directions": ["front","front_left","left","back_left","back","back_right","right","front_right"],
"layers": ["albedo","normal","depth"],
"variants": [
{
"slug": "shambler",
"name": "Shambler",
"role": "Basic melee enemy",
"path": "assets/shambler/manifest.json"
}
]
}
FieldTypeDescription
namestringDisplay name of the pack
slugstringURL-safe identifier
versionstringSemver version
tileSizenumberPixel dimensions (always 48)
directionsstring[]8 cardinal + ordinal directions
layersstring[]Map layer types
variantsobject[]Character variants in the pack

Each variant has a manifest with full provenance:

{
"schema_version": "1.0.0",
"identity": {
"subject_slug": "shambler",
"display_name": "Shambler",
"body_family": "bipedal"
},
"provenance": {
"run_id": "foundry-run-042",
"seed": 12345,
"generation_timestamps": { "start": "...", "end": "..." },
"regen_count": 0,
"reject_count": 0,
"git_hash": "abc1234"
},
"generation_stack": {
"checkpoint": "juggernautXL",
"lora": { "name": "pixel-art-xl", "weight": 0.85 }
},
"render_contract": {
"width": 48,
"height": 48,
"direction_order": ["front","front_left","left","back_left","back","back_right","right","front_right"],
"pivot": "center_bottom",
"transparency": true
},
"files": {
"albedo/front.png": { "sha256": "..." },
"normal/front.png": { "sha256": "..." },
"depth/front.png": { "sha256": "..." }
}
}
FieldPurpose
render_contract.pivotAnchor point for sprite alignment — always center_bottom
render_contract.direction_orderCanonical order for animation frame indexing
filesSHA-256 checksums for integrity verification
provenanceFull generation audit trail
generation_stackModel and LoRA used for generation

All packs use the same 8-direction system, ordered clockwise from front-facing:

back
back_left back_right
left right
front_left front_right
front

Direction index (for sprite sheet or animation frame mapping):

IndexDirection
0front
1front_left
2left
3back_left
4back
5back_right
6right
7front_right

Standard RGBA color sprite. Use as-is for basic rendering.

Tangent-space normal map encoded in RGB:

  • R = X axis (left/right surface angle)
  • G = Y axis (up/down surface angle)
  • B = Z axis (surface facing camera = bright blue)

Flat surfaces encode as (128, 128, 255) — standard OpenGL convention.

Grayscale height map:

  • White (255) = closest to camera
  • Black (0) = farthest from camera

Use for parallax scrolling, occlusion sorting, or shadow casting.

Every sprite across all packs guarantees:

  • 48x48 pixels — consistent tile size
  • Transparent background — PNG alpha channel
  • Center-bottom pivot — feet at pixel (24, 48)
  • Consistent silhouettes — same character recognizable across all 8 directions
  • Layer alignment — albedo, normal, and depth maps are pixel-perfect aligned