actor.rpg.generator

rpg.actor

Schema Diff

+274 -106

From

CID
bafyreibdoynjsn4...
Indexed At
2026-10-02 21:40 UTC
View this version

To

CID
bafyreianalehdfw...
Indexed At
2026-10-09 12:54 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

44 breaking changes, 101 non-breaking changes.

Breaking Changes (44)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "actor.rpg.generator#fallback", src: "actor.rpg.generator#fallback", tgt: "actor.rpg.generator#fallback.blob", kind: "prop", name: Some("blob") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "actor.rpg.generator#fallback", src: "actor.rpg.generator#fallback", tgt: "actor.rpg.generator#fallback.assetName", kind: "prop", name: Some("assetName") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "actor.rpg.generator:body", src: "actor.rpg.generator:body", tgt: "actor.rpg.generator:body.eyes", kind: "prop", name: Some("eyes") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "actor.rpg.generator:body", src: "actor.rpg.generator:body", tgt: "actor.rpg.generator:body.skin", kind: "prop", name: Some("skin") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "actor.rpg.generator#layer", src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.id", kind: "prop", name: Some("id") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "actor.rpg.generator#layer", src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.blob", kind: "prop", name: Some("blob") }
  • RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "actor.rpg.generator:body.layers:items", src: "actor.rpg.generator:body.layers:items", tgt: "actor.rpg.generator:body.layers:items.blob", kind: "prop", name: Some("blob") }
  • RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "actor.rpg.generator:body.layers:items", src: "actor.rpg.generator:body.layers:items", tgt: "actor.rpg.generator:body.layers:items.id", kind: "prop", name: Some("id") }
  • RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "actor.rpg.generator:body", src: "actor.rpg.generator:body", tgt: "actor.rpg.generator:body.version", kind: "prop", name: Some("version") }
  • RemovedVertex RemovedVertex { vertex_id: "actor.rpg.generator:body.eyes.hex" }
  • RemovedVertex RemovedVertex { vertex_id: "actor.rpg.generator:body.eyes.mode" }
  • RemovedVertex RemovedVertex { vertex_id: "actor.rpg.generator:body.eyes.tone" }
  • RemovedVertex RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.assetName" }
  • RemovedVertex RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.blob" }
  • RemovedVertex RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.colors" }
  • RemovedVertex RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.colors.main" }
  • RemovedVertex RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.colors.sub1" }
  • RemovedVertex RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.colors.sub2" }
  • RemovedVertex RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.colors.sub3" }
  • RemovedVertex RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.id" }
  • RemovedVertex RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.title" }
  • RemovedVertex RemovedVertex { vertex_id: "actor.rpg.generator:body.skin.hex" }
  • RemovedVertex RemovedVertex { vertex_id: "actor.rpg.generator:body.skin.mode" }
  • RemovedVertex RemovedVertex { vertex_id: "actor.rpg.generator:body.skin.tone" }
  • RemovedVertex RemovedVertex { vertex_id: "actor.rpg.generator:body.version" }
  • RemovedEdge RemovedEdge { src: "actor.rpg.generator:body.eyes", tgt: "actor.rpg.generator:body.eyes.hex", kind: "prop", name: Some("hex") }
  • RemovedEdge RemovedEdge { src: "actor.rpg.generator:body.eyes", tgt: "actor.rpg.generator:body.eyes.mode", kind: "prop", name: Some("mode") }
  • RemovedEdge RemovedEdge { src: "actor.rpg.generator:body.eyes", tgt: "actor.rpg.generator:body.eyes.tone", kind: "prop", name: Some("tone") }
  • RemovedEdge RemovedEdge { src: "actor.rpg.generator:body.layers:items", tgt: "actor.rpg.generator:body.layers:items.assetName", kind: "prop", name: Some("assetName") }
  • RemovedEdge RemovedEdge { src: "actor.rpg.generator:body.layers:items", tgt: "actor.rpg.generator:body.layers:items.colors", kind: "prop", name: Some("colors") }
  • RemovedEdge RemovedEdge { src: "actor.rpg.generator:body.layers:items", tgt: "actor.rpg.generator:body.layers:items.title", kind: "prop", name: Some("title") }
  • RemovedEdge RemovedEdge { src: "actor.rpg.generator:body.layers:items.colors", tgt: "actor.rpg.generator:body.layers:items.colors.main", kind: "prop", name: Some("main") }
  • RemovedEdge RemovedEdge { src: "actor.rpg.generator:body.layers:items.colors", tgt: "actor.rpg.generator:body.layers:items.colors.sub1", kind: "prop", name: Some("sub1") }
  • RemovedEdge RemovedEdge { src: "actor.rpg.generator:body.layers:items.colors", tgt: "actor.rpg.generator:body.layers:items.colors.sub2", kind: "prop", name: Some("sub2") }
  • RemovedEdge RemovedEdge { src: "actor.rpg.generator:body.layers:items.colors", tgt: "actor.rpg.generator:body.layers:items.colors.sub3", kind: "prop", name: Some("sub3") }
  • RemovedEdge RemovedEdge { src: "actor.rpg.generator:body.skin", tgt: "actor.rpg.generator:body.skin.hex", kind: "prop", name: Some("hex") }
  • RemovedEdge RemovedEdge { src: "actor.rpg.generator:body.skin", tgt: "actor.rpg.generator:body.skin.mode", kind: "prop", name: Some("mode") }
  • RemovedEdge RemovedEdge { src: "actor.rpg.generator:body.skin", tgt: "actor.rpg.generator:body.skin.tone", kind: "prop", name: Some("tone") }
  • KindChanged KindChanged { vertex_id: "actor.rpg.generator:body.eyes", old_kind: "object", new_kind: "ref" }
  • KindChanged KindChanged { vertex_id: "actor.rpg.generator:body.layers:items", old_kind: "object", new_kind: "ref" }
  • KindChanged KindChanged { vertex_id: "actor.rpg.generator:body.skin", old_kind: "object", new_kind: "ref" }
  • ConstraintAdded ConstraintAdded { vertex_id: "actor.rpg.generator:body.eyes", sort: "ref", value: "#eyes" }
  • ConstraintAdded ConstraintAdded { vertex_id: "actor.rpg.generator:body.skin", sort: "ref", value: "#skin" }
  • ConstraintAdded ConstraintAdded { vertex_id: "actor.rpg.generator:body.layers:items", sort: "ref", value: "#layer" }
Non-Breaking Changes (101)
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#colors" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#colors.main" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#colors.sub1" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#colors.sub2" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#colors.sub3" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#eyes" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#eyes.hex" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#eyes.mode" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#eyes.tone" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#fallback" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#fallback.assetName" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#fallback.behindRows" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#fallback.behindRows:items" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#fallback.blob" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#fallback.colors" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#fallback.subtractMask" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#fallback.title" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#fallback.zSlot" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#fallback.zSlotByDir" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.assetName" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.behindRows" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.behindRows:items" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.blob" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.colors" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.disabled" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.id" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.layerClass" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.submaskExclusions" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.submaskRule" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.subtractMask" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.suppress" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.suppressAs" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.suppressSpecific" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.title" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.zSlot" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#layer.zSlotByDir" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#skin" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#skin.hex" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#skin.mode" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#skin.tone" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#submaskExclusions" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#submaskExclusions.classes" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#submaskExclusions.classes:items" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#submaskExclusions.layers" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#submaskExclusions.layers:items" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#suppressionRules" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#suppressionRules.classes" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#suppressionRules.classes:items" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#suppressionRules.layers" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator#suppressionRules.layers:items" }
  • AddedVertex AddedVertex { vertex_id: "actor.rpg.generator:body.faceMode" }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#colors", tgt: "actor.rpg.generator#colors.main", kind: "prop", name: Some("main") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#colors", tgt: "actor.rpg.generator#colors.sub1", kind: "prop", name: Some("sub1") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#colors", tgt: "actor.rpg.generator#colors.sub2", kind: "prop", name: Some("sub2") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#colors", tgt: "actor.rpg.generator#colors.sub3", kind: "prop", name: Some("sub3") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#eyes", tgt: "actor.rpg.generator#eyes.hex", kind: "prop", name: Some("hex") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#eyes", tgt: "actor.rpg.generator#eyes.mode", kind: "prop", name: Some("mode") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#eyes", tgt: "actor.rpg.generator#eyes.tone", kind: "prop", name: Some("tone") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#fallback", tgt: "actor.rpg.generator#fallback.behindRows", kind: "prop", name: Some("behindRows") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#fallback", tgt: "actor.rpg.generator#fallback.colors", kind: "prop", name: Some("colors") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#fallback", tgt: "actor.rpg.generator#fallback.subtractMask", kind: "prop", name: Some("subtractMask") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#fallback", tgt: "actor.rpg.generator#fallback.title", kind: "prop", name: Some("title") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#fallback", tgt: "actor.rpg.generator#fallback.zSlot", kind: "prop", name: Some("zSlot") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#fallback", tgt: "actor.rpg.generator#fallback.zSlotByDir", kind: "prop", name: Some("zSlotByDir") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#fallback.behindRows", tgt: "actor.rpg.generator#fallback.behindRows:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#fallback.colors", tgt: "actor.rpg.generator#colors", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.assetName", kind: "prop", name: Some("assetName") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.behindRows", kind: "prop", name: Some("behindRows") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.colors", kind: "prop", name: Some("colors") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.disabled", kind: "prop", name: Some("disabled") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.layerClass", kind: "prop", name: Some("layerClass") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.submaskExclusions", kind: "prop", name: Some("submaskExclusions") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.submaskRule", kind: "prop", name: Some("submaskRule") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.subtractMask", kind: "prop", name: Some("subtractMask") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.suppress", kind: "prop", name: Some("suppress") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.suppressAs", kind: "prop", name: Some("suppressAs") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.suppressSpecific", kind: "prop", name: Some("suppressSpecific") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.title", kind: "prop", name: Some("title") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.zSlot", kind: "prop", name: Some("zSlot") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.zSlotByDir", kind: "prop", name: Some("zSlotByDir") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer.behindRows", tgt: "actor.rpg.generator#layer.behindRows:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer.colors", tgt: "actor.rpg.generator#colors", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer.submaskExclusions", tgt: "actor.rpg.generator#submaskExclusions", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer.suppress", tgt: "actor.rpg.generator#suppressionRules", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#layer.suppressAs", tgt: "actor.rpg.generator#fallback", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#skin", tgt: "actor.rpg.generator#skin.hex", kind: "prop", name: Some("hex") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#skin", tgt: "actor.rpg.generator#skin.mode", kind: "prop", name: Some("mode") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#skin", tgt: "actor.rpg.generator#skin.tone", kind: "prop", name: Some("tone") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#submaskExclusions", tgt: "actor.rpg.generator#submaskExclusions.classes", kind: "prop", name: Some("classes") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#submaskExclusions", tgt: "actor.rpg.generator#submaskExclusions.layers", kind: "prop", name: Some("layers") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#submaskExclusions.classes", tgt: "actor.rpg.generator#submaskExclusions.classes:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#submaskExclusions.layers", tgt: "actor.rpg.generator#submaskExclusions.layers:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#suppressionRules", tgt: "actor.rpg.generator#suppressionRules.classes", kind: "prop", name: Some("classes") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#suppressionRules", tgt: "actor.rpg.generator#suppressionRules.layers", kind: "prop", name: Some("layers") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#suppressionRules.classes", tgt: "actor.rpg.generator#suppressionRules.classes:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "actor.rpg.generator#suppressionRules.layers", tgt: "actor.rpg.generator#suppressionRules.layers:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "actor.rpg.generator:body", tgt: "actor.rpg.generator:body.faceMode", kind: "prop", name: Some("faceMode") }
  • AddedEdge AddedEdge { src: "actor.rpg.generator:body.eyes", tgt: "actor.rpg.generator#eyes", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "actor.rpg.generator:body.layers:items", tgt: "actor.rpg.generator#layer", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "actor.rpg.generator:body.skin", tgt: "actor.rpg.generator#skin", kind: "ref", name: None }

Migration Guidance

Removed Elements

  • RemovedVertex { vertex_id: "actor.rpg.generator:body.eyes.hex" }
  • RemovedVertex { vertex_id: "actor.rpg.generator:body.eyes.mode" }
  • RemovedVertex { vertex_id: "actor.rpg.generator:body.eyes.tone" }
  • RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.assetName" }
  • RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.blob" }
  • RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.colors" }
  • RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.colors.main" }
  • RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.colors.sub1" }
  • RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.colors.sub2" }
  • RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.colors.sub3" }
  • RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.id" }
  • RemovedVertex { vertex_id: "actor.rpg.generator:body.layers:items.title" }
  • RemovedVertex { vertex_id: "actor.rpg.generator:body.skin.hex" }
  • RemovedVertex { vertex_id: "actor.rpg.generator:body.skin.mode" }
  • RemovedVertex { vertex_id: "actor.rpg.generator:body.skin.tone" }
  • RemovedVertex { vertex_id: "actor.rpg.generator:body.version" }

Added Elements

  • AddedVertex { vertex_id: "actor.rpg.generator#colors" }
  • AddedVertex { vertex_id: "actor.rpg.generator#colors.main" }
  • AddedVertex { vertex_id: "actor.rpg.generator#colors.sub1" }
  • AddedVertex { vertex_id: "actor.rpg.generator#colors.sub2" }
  • AddedVertex { vertex_id: "actor.rpg.generator#colors.sub3" }
  • AddedVertex { vertex_id: "actor.rpg.generator#eyes" }
  • AddedVertex { vertex_id: "actor.rpg.generator#eyes.hex" }
  • AddedVertex { vertex_id: "actor.rpg.generator#eyes.mode" }
  • AddedVertex { vertex_id: "actor.rpg.generator#eyes.tone" }
  • AddedVertex { vertex_id: "actor.rpg.generator#fallback" }
  • AddedVertex { vertex_id: "actor.rpg.generator#fallback.assetName" }
  • AddedVertex { vertex_id: "actor.rpg.generator#fallback.behindRows" }
  • AddedVertex { vertex_id: "actor.rpg.generator#fallback.behindRows:items" }
  • AddedVertex { vertex_id: "actor.rpg.generator#fallback.blob" }
  • AddedVertex { vertex_id: "actor.rpg.generator#fallback.colors" }
  • AddedVertex { vertex_id: "actor.rpg.generator#fallback.subtractMask" }
  • AddedVertex { vertex_id: "actor.rpg.generator#fallback.title" }
  • AddedVertex { vertex_id: "actor.rpg.generator#fallback.zSlot" }
  • AddedVertex { vertex_id: "actor.rpg.generator#fallback.zSlotByDir" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.assetName" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.behindRows" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.behindRows:items" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.blob" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.colors" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.disabled" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.id" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.layerClass" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.submaskExclusions" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.submaskRule" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.subtractMask" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.suppress" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.suppressAs" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.suppressSpecific" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.title" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.zSlot" }
  • AddedVertex { vertex_id: "actor.rpg.generator#layer.zSlotByDir" }
  • AddedVertex { vertex_id: "actor.rpg.generator#skin" }
  • AddedVertex { vertex_id: "actor.rpg.generator#skin.hex" }
  • AddedVertex { vertex_id: "actor.rpg.generator#skin.mode" }
  • AddedVertex { vertex_id: "actor.rpg.generator#skin.tone" }
  • AddedVertex { vertex_id: "actor.rpg.generator#submaskExclusions" }
  • AddedVertex { vertex_id: "actor.rpg.generator#submaskExclusions.classes" }
  • AddedVertex { vertex_id: "actor.rpg.generator#submaskExclusions.classes:items" }
  • AddedVertex { vertex_id: "actor.rpg.generator#submaskExclusions.layers" }
  • AddedVertex { vertex_id: "actor.rpg.generator#submaskExclusions.layers:items" }
  • AddedVertex { vertex_id: "actor.rpg.generator#suppressionRules" }
  • AddedVertex { vertex_id: "actor.rpg.generator#suppressionRules.classes" }
  • AddedVertex { vertex_id: "actor.rpg.generator#suppressionRules.classes:items" }
  • AddedVertex { vertex_id: "actor.rpg.generator#suppressionRules.layers" }
  • AddedVertex { vertex_id: "actor.rpg.generator#suppressionRules.layers:items" }
  • AddedVertex { vertex_id: "actor.rpg.generator:body.faceMode" }

Constraint Changes

  • ConstraintAdded ConstraintAdded { vertex_id: "actor.rpg.generator:body.eyes", sort: "ref", value: "#eyes" }
  • ConstraintAdded ConstraintAdded { vertex_id: "actor.rpg.generator:body.layers:items", sort: "ref", value: "#layer" }
  • ConstraintAdded ConstraintAdded { vertex_id: "actor.rpg.generator:body.skin", sort: "ref", value: "#skin" }

Additional Notes

  • Breaking: RequiredEdgeAdded { vertex_id: "actor.rpg.generator:body", src: "actor.rpg.generator:body", tgt: "actor.rpg.generator:body.eyes", kind: "prop", name: Some("eyes") }
  • Breaking: RequiredEdgeAdded { vertex_id: "actor.rpg.generator:body", src: "actor.rpg.generator:body", tgt: "actor.rpg.generator:body.skin", kind: "prop", name: Some("skin") }
  • Breaking: RequiredEdgeAdded { vertex_id: "actor.rpg.generator#layer", src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.id", kind: "prop", name: Some("id") }
  • Breaking: RequiredEdgeAdded { vertex_id: "actor.rpg.generator#layer", src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.blob", kind: "prop", name: Some("blob") }
  • Breaking: RequiredEdgeAdded { vertex_id: "actor.rpg.generator#fallback", src: "actor.rpg.generator#fallback", tgt: "actor.rpg.generator#fallback.blob", kind: "prop", name: Some("blob") }
  • Breaking: RequiredEdgeAdded { vertex_id: "actor.rpg.generator#fallback", src: "actor.rpg.generator#fallback", tgt: "actor.rpg.generator#fallback.assetName", kind: "prop", name: Some("assetName") }
  • Breaking: RequiredEdgeRemoved { vertex_id: "actor.rpg.generator:body.layers:items", src: "actor.rpg.generator:body.layers:items", tgt: "actor.rpg.generator:body.layers:items.blob", kind: "prop", name: Some("blob") }
  • Breaking: RequiredEdgeRemoved { vertex_id: "actor.rpg.generator:body.layers:items", src: "actor.rpg.generator:body.layers:items", tgt: "actor.rpg.generator:body.layers:items.id", kind: "prop", name: Some("id") }
  • Breaking: RequiredEdgeRemoved { vertex_id: "actor.rpg.generator:body", src: "actor.rpg.generator:body", tgt: "actor.rpg.generator:body.version", kind: "prop", name: Some("version") }
  • Breaking: RemovedEdge { src: "actor.rpg.generator:body.eyes", tgt: "actor.rpg.generator:body.eyes.hex", kind: "prop", name: Some("hex") }
  • Breaking: RemovedEdge { src: "actor.rpg.generator:body.eyes", tgt: "actor.rpg.generator:body.eyes.mode", kind: "prop", name: Some("mode") }
  • Breaking: RemovedEdge { src: "actor.rpg.generator:body.eyes", tgt: "actor.rpg.generator:body.eyes.tone", kind: "prop", name: Some("tone") }
  • Breaking: RemovedEdge { src: "actor.rpg.generator:body.layers:items", tgt: "actor.rpg.generator:body.layers:items.assetName", kind: "prop", name: Some("assetName") }
  • Breaking: RemovedEdge { src: "actor.rpg.generator:body.layers:items", tgt: "actor.rpg.generator:body.layers:items.colors", kind: "prop", name: Some("colors") }
  • Breaking: RemovedEdge { src: "actor.rpg.generator:body.layers:items", tgt: "actor.rpg.generator:body.layers:items.title", kind: "prop", name: Some("title") }
  • Breaking: RemovedEdge { src: "actor.rpg.generator:body.layers:items.colors", tgt: "actor.rpg.generator:body.layers:items.colors.main", kind: "prop", name: Some("main") }
  • Breaking: RemovedEdge { src: "actor.rpg.generator:body.layers:items.colors", tgt: "actor.rpg.generator:body.layers:items.colors.sub1", kind: "prop", name: Some("sub1") }
  • Breaking: RemovedEdge { src: "actor.rpg.generator:body.layers:items.colors", tgt: "actor.rpg.generator:body.layers:items.colors.sub2", kind: "prop", name: Some("sub2") }
  • Breaking: RemovedEdge { src: "actor.rpg.generator:body.layers:items.colors", tgt: "actor.rpg.generator:body.layers:items.colors.sub3", kind: "prop", name: Some("sub3") }
  • Breaking: RemovedEdge { src: "actor.rpg.generator:body.skin", tgt: "actor.rpg.generator:body.skin.hex", kind: "prop", name: Some("hex") }
  • Breaking: RemovedEdge { src: "actor.rpg.generator:body.skin", tgt: "actor.rpg.generator:body.skin.mode", kind: "prop", name: Some("mode") }
  • Breaking: RemovedEdge { src: "actor.rpg.generator:body.skin", tgt: "actor.rpg.generator:body.skin.tone", kind: "prop", name: Some("tone") }
  • Breaking: KindChanged { vertex_id: "actor.rpg.generator:body.eyes", old_kind: "object", new_kind: "ref" }
  • Breaking: KindChanged { vertex_id: "actor.rpg.generator:body.layers:items", old_kind: "object", new_kind: "ref" }
  • Breaking: KindChanged { vertex_id: "actor.rpg.generator:body.skin", old_kind: "object", new_kind: "ref" }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#colors", tgt: "actor.rpg.generator#colors.main", kind: "prop", name: Some("main") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#colors", tgt: "actor.rpg.generator#colors.sub1", kind: "prop", name: Some("sub1") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#colors", tgt: "actor.rpg.generator#colors.sub2", kind: "prop", name: Some("sub2") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#colors", tgt: "actor.rpg.generator#colors.sub3", kind: "prop", name: Some("sub3") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#eyes", tgt: "actor.rpg.generator#eyes.hex", kind: "prop", name: Some("hex") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#eyes", tgt: "actor.rpg.generator#eyes.mode", kind: "prop", name: Some("mode") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#eyes", tgt: "actor.rpg.generator#eyes.tone", kind: "prop", name: Some("tone") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#fallback", tgt: "actor.rpg.generator#fallback.behindRows", kind: "prop", name: Some("behindRows") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#fallback", tgt: "actor.rpg.generator#fallback.colors", kind: "prop", name: Some("colors") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#fallback", tgt: "actor.rpg.generator#fallback.subtractMask", kind: "prop", name: Some("subtractMask") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#fallback", tgt: "actor.rpg.generator#fallback.title", kind: "prop", name: Some("title") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#fallback", tgt: "actor.rpg.generator#fallback.zSlot", kind: "prop", name: Some("zSlot") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#fallback", tgt: "actor.rpg.generator#fallback.zSlotByDir", kind: "prop", name: Some("zSlotByDir") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#fallback.behindRows", tgt: "actor.rpg.generator#fallback.behindRows:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#fallback.colors", tgt: "actor.rpg.generator#colors", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.assetName", kind: "prop", name: Some("assetName") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.behindRows", kind: "prop", name: Some("behindRows") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.colors", kind: "prop", name: Some("colors") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.disabled", kind: "prop", name: Some("disabled") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.layerClass", kind: "prop", name: Some("layerClass") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.submaskExclusions", kind: "prop", name: Some("submaskExclusions") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.submaskRule", kind: "prop", name: Some("submaskRule") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.subtractMask", kind: "prop", name: Some("subtractMask") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.suppress", kind: "prop", name: Some("suppress") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.suppressAs", kind: "prop", name: Some("suppressAs") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.suppressSpecific", kind: "prop", name: Some("suppressSpecific") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.title", kind: "prop", name: Some("title") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.zSlot", kind: "prop", name: Some("zSlot") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer", tgt: "actor.rpg.generator#layer.zSlotByDir", kind: "prop", name: Some("zSlotByDir") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer.behindRows", tgt: "actor.rpg.generator#layer.behindRows:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer.colors", tgt: "actor.rpg.generator#colors", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer.submaskExclusions", tgt: "actor.rpg.generator#submaskExclusions", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer.suppress", tgt: "actor.rpg.generator#suppressionRules", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#layer.suppressAs", tgt: "actor.rpg.generator#fallback", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#skin", tgt: "actor.rpg.generator#skin.hex", kind: "prop", name: Some("hex") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#skin", tgt: "actor.rpg.generator#skin.mode", kind: "prop", name: Some("mode") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#skin", tgt: "actor.rpg.generator#skin.tone", kind: "prop", name: Some("tone") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#submaskExclusions", tgt: "actor.rpg.generator#submaskExclusions.classes", kind: "prop", name: Some("classes") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#submaskExclusions", tgt: "actor.rpg.generator#submaskExclusions.layers", kind: "prop", name: Some("layers") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#submaskExclusions.classes", tgt: "actor.rpg.generator#submaskExclusions.classes:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#submaskExclusions.layers", tgt: "actor.rpg.generator#submaskExclusions.layers:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#suppressionRules", tgt: "actor.rpg.generator#suppressionRules.classes", kind: "prop", name: Some("classes") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#suppressionRules", tgt: "actor.rpg.generator#suppressionRules.layers", kind: "prop", name: Some("layers") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#suppressionRules.classes", tgt: "actor.rpg.generator#suppressionRules.classes:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator#suppressionRules.layers", tgt: "actor.rpg.generator#suppressionRules.layers:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator:body", tgt: "actor.rpg.generator:body.faceMode", kind: "prop", name: Some("faceMode") }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator:body.eyes", tgt: "actor.rpg.generator#eyes", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator:body.layers:items", tgt: "actor.rpg.generator#layer", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "actor.rpg.generator:body.skin", tgt: "actor.rpg.generator#skin", kind: "ref", name: None }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 +
    "colors": {
5 +
      "description": "Selected recolor channels.",
6 +
      "properties": {
7 +
        "main": {
8 +
          "maxLength": 7,
9 +
          "type": "string"
10 +
        },
11 +
        "sub1": {
12 +
          "maxLength": 7,
13 +
          "type": "string"
14 +
        },
15 +
        "sub2": {
16 +
          "maxLength": 7,
17 +
          "type": "string"
18 +
        },
19 +
        "sub3": {
20 +
          "maxLength": 7,
21 +
          "type": "string"
22 +
        }
23 +
      },
24 +
      "type": "object"
25 +
    },
26 +
    "eyes": {
27 +
      "description": "Eye color configuration.",
28 +
      "properties": {
29 +
        "hex": {
30 +
          "maxLength": 7,
31 +
          "type": "string"
32 +
        },
33 +
        "mode": {
34 +
          "maxLength": 10,
35 +
          "type": "string"
36 +
        },
37 +
        "tone": {
38 +
          "maximum": 100,
39 +
          "minimum": 0,
40 +
          "type": "integer"
41 +
        }
42 +
      },
43 +
      "type": "object"
44 +
    },
45 +
    "fallback": {
46 +
      "description": "Rendered replacement used when a layer is class-suppressed.",
47 +
      "properties": {
48 +
        "assetName": {
49 +
          "maxLength": 100,
50 +
          "type": "string"
51 +
        },
52 +
        "behindRows": {
53 +
          "items": {
54 +
            "maximum": 3,
55 +
            "minimum": 0,
56 +
            "type": "integer"
57 +
          },
58 +
          "maxLength": 4,
59 +
          "type": "array"
60 +
        },
61 +
        "blob": {
62 +
          "accept": [
63 +
            "image/png"
64 +
          ],
65 +
          "maxSize": 1000000,
66 +
          "type": "blob"
67 +
        },
68 +
        "colors": {
69 +
          "ref": "#colors",
70 +
          "type": "ref"
71 +
        },
72 +
        "subtractMask": {
73 +
          "accept": [
74 +
            "image/png"
75 +
          ],
76 +
          "maxSize": 50000,
77 +
          "type": "blob"
78 +
        },
79 +
        "title": {
80 +
          "maxLength": 100,
81 +
          "type": "string"
82 +
        },
83 +
        "zSlot": {
84 +
          "maximum": 30,
85 +
          "minimum": 0,
86 +
          "type": "integer"
87 +
        },
88 +
        "zSlotByDir": {
89 +
          "type": "unknown"
90 +
        }
91 +
      },
92 +
      "required": [
93 +
        "assetName",
94 +
        "blob"
95 +
      ],
96 +
      "type": "object"
97 +
    },
98 +
    "layer": {
99 +
      "description": "A rendered generator layer and its recomposition metadata.",
100 +
      "properties": {
101 +
        "assetName": {
102 +
          "maxLength": 100,
103 +
          "type": "string"
104 +
        },
105 +
        "behindRows": {
106 +
          "description": "Rows rendered behind the body. Empty explicitly means all rows render in front.",
107 +
          "items": {
108 +
            "maximum": 3,
109 +
            "minimum": 0,
110 +
            "type": "integer"
111 +
          },
112 +
          "maxLength": 4,
113 +
          "type": "array"
114 +
        },
115 +
        "blob": {
116 +
          "accept": [
117 +
            "image/png"
118 +
          ],
119 +
          "maxSize": 1000000,
120 +
          "type": "blob"
121 +
        },
122 +
        "colors": {
123 +
          "ref": "#colors",
124 +
          "type": "ref"
125 +
        },
126 +
        "disabled": {
127 +
          "type": "boolean"
128 +
        },
129 +
        "id": {
130 +
          "maxLength": 30,
131 +
          "type": "string"
132 +
        },
133 +
        "layerClass": {
134 +
          "description": "Class assigned to this layer, such as hind.cloak.",
135 +
          "maxLength": 90,
136 +
          "type": "string"
137 +
        },
138 +
        "submaskExclusions": {
139 +
          "description": "Target-side exceptions to submaskRule. The layers array contains exact canonical source layer IDs and the classes array contains exact source layerClass or fitClass values; matching source masks are skipped before submaskRule is evaluated. Omission or empty arrays means no source-specific exclusions.",
140 +
          "ref": "#submaskExclusions",
141 +
          "type": "ref"
142 +
        },
143 +
        "submaskRule": {
144 +
          "description": "Controls which external subtractive masks may affect this layer. Omission means respect-all.",
145 +
          "knownValues": [
146 +
            "respect-all",
147 +
            "ignore-all",
148 +
            "ignore-layers-above",
149 +
            "ignore-layers-below"
150 +
          ],
151 +
          "maxLength": 24,
152 +
          "type": "string"
153 +
        },
154 +
        "subtractMask": {
155 +
          "accept": [
156 +
            "image/png"
157 +
          ],
158 +
          "maxSize": 50000,
159 +
          "type": "blob"
160 +
        },
161 +
        "suppress": {
162 +
          "ref": "#suppressionRules",
163 +
          "type": "ref"
164 +
        },
165 +
        "suppressAs": {
166 +
          "ref": "#fallback",
167 +
          "type": "ref"
168 +
        },
169 +
        "suppressSpecific": {
170 +
          "description": "Map from suppressor layerClass to either a structured fallback matching #fallback or a rule with default and bodyTypeAlt fallbacks. The active body-specific value takes priority over the class default, then suppressAs.",
171 +
          "type": "unknown"
172 +
        },
173 +
        "title": {
174 +
          "maxLength": 100,
175 +
          "type": "string"
176 +
        },
177 +
        "zSlot": {
178 +
          "description": "Legacy all-direction draw-order slot. zSlotByDir takes precedence.",
179 +
          "maximum": 30,
180 +
          "minimum": 0,
181 +
          "type": "integer"
182 +
        },
183 +
        "zSlotByDir": {
184 +
          "description": "Per-direction draw-order slots [down, left, right, up]. Entries are non-negative integers or null when the category default applies.",
185 +
          "type": "unknown"
186 +
        }
187 +
      },
188 +
      "required": [
189 +
        "id",
190 +
        "blob"
191 +
      ],
192 +
      "type": "object"
193 +
    },
4 194
    "main": {
5 -
      "description": "Stores the individual recolored layers and configuration used to build a sprite via the generator. Enables recomposition by third-party tools (e.g. adding items/overlays) without the full generator pipeline. One record per user (rkey: self).",
195 +
      "description": "Stores the recolored layers and configuration used to rebuild a generated sprite.",
6 196
      "key": "literal:self",
7 197
      "record": {
8 198
        "properties": {
9 199
          "bodyType": {
10 -
            "description": "Body type used (e.g. 'male', 'female').",
11 200
            "maxLength": 20,
12 201
            "type": "string"
13 202
          },
14 203
          "createdAt": {
15 -
            "description": "When this record was first created.",
16 204
            "format": "datetime",
17 205
            "type": "string"
18 206
          },
19 207
          "eyes": {
20 -
            "description": "Eye color configuration.",
21 -
            "properties": {
22 -
              "hex": {
23 -
                "description": "Custom eye hex color.",
24 -
                "maxLength": 7,
25 -
                "type": "string"
26 -
              },
27 -
              "mode": {
28 -
                "description": "'gradient' or 'custom'.",
29 -
                "maxLength": 10,
30 -
                "type": "string"
31 -
              },
32 -
              "tone": {
33 -
                "description": "Gradient eye tone index.",
34 -
                "maximum": 100,
35 -
                "minimum": 0,
36 -
                "type": "integer"
37 -
              }
38 -
            },
39 -
            "type": "object"
208 +
            "ref": "#eyes",
209 +
            "type": "ref"
210 +
          },
211 +
          "faceMode": {
212 +
            "description": "Whether face layers are selected intentionally. Omission is reserved for legacy records pending migration.",
213 +
            "knownValues": [
214 +
              "standard",
215 +
              "faceless"
216 +
            ],
217 +
            "type": "string"
40 218
          },
41 219
          "items": {
42 -
            "description": "Freeform item identifiers applied on top of the sprite (e.g. 'popcorn').",
43 220
            "items": {
44 221
              "maxLength": 50,
45 222
              "type": "string"
46 223
            },
47 224
            "maxLength": 20,
48 225
            "type": "array"
49 226
          },
50 227
          "layers": {
51 -
            "description": "Ordered array of recolored layer images, back-to-front. Body is always index 0.",
228 +
            "description": "Ordered recolored layers, back-to-front.",
52 229
            "items": {
53 -
              "properties": {
54 -
                "assetName": {
55 -
                  "description": "Generator asset filename (e.g. '001_basic_short').",
56 -
                  "maxLength": 100,
57 -
                  "type": "string"
58 -
                },
59 -
                "blob": {
60 -
                  "accept": [
61 -
                    "image/png"
62 -
                  ],
63 -
                  "description": "The recolored layer PNG.",
64 -
                  "maxSize": 1000000,
65 -
                  "type": "blob"
66 -
                },
67 -
                "colors": {
68 -
                  "description": "Color selections applied to this layer.",
69 -
                  "properties": {
70 -
                    "main": {
71 -
                      "maxLength": 7,
72 -
                      "type": "string"
73 -
                    },
74 -
                    "sub1": {
75 -
                      "maxLength": 7,
76 -
                      "type": "string"
77 -
                    },
78 -
                    "sub2": {
79 -
                      "maxLength": 7,
80 -
                      "type": "string"
81 -
                    },
82 -
                    "sub3": {
83 -
                      "maxLength": 7,
84 -
                      "type": "string"
85 -
                    }
86 -
                  },
87 -
                  "type": "object"
88 -
                },
89 -
                "id": {
90 -
                  "description": "Layer category identifier (e.g. 'body', 'tops', 'hair', 'bangs').",
91 -
                  "maxLength": 30,
92 -
                  "type": "string"
93 -
                },
94 -
                "title": {
95 -
                  "description": "Human-readable name derived from the asset filename.",
96 -
                  "maxLength": 100,
97 -
                  "type": "string"
98 -
                }
99 -
              },
100 -
              "required": [
101 -
                "id",
102 -
                "blob"
103 -
              ],
104 -
              "type": "object"
230 +
              "ref": "#layer",
231 +
              "type": "ref"
105 232
            },
106 -
            "maxLength": 20,
233 +
            "maxLength": 32,
107 234
            "type": "array"
108 235
          },
109 236
          "skin": {
110 -
            "description": "Skin configuration.",
111 -
            "properties": {
112 -
              "hex": {
113 -
                "description": "Custom skin hex color (if mode is custom).",
114 -
                "maxLength": 7,
115 -
                "type": "string"
116 -
              },
117 -
              "mode": {
118 -
                "description": "'gradient' or 'custom'.",
119 -
                "maxLength": 10,
120 -
                "type": "string"
121 -
              },
122 -
              "tone": {
123 -
                "description": "Gradient skin tone index.",
124 -
                "maximum": 100,
125 -
                "minimum": 0,
126 -
                "type": "integer"
127 -
              }
128 -
            },
129 -
            "type": "object"
237 +
            "ref": "#skin",
238 +
            "type": "ref"
130 239
          },
131 240
          "updatedAt": {
132 -
            "description": "When this record was last modified.",
133 241
            "format": "datetime",
134 242
            "type": "string"
135 -
          },
136 -
          "version": {
137 -
            "description": "Generator version that produced this record.",
138 -
            "maximum": 100,
139 -
            "minimum": 1,
140 -
            "type": "integer"
141 243
          }
142 244
        },
143 245
        "required": [
144 -
          "version",
145 246
          "bodyType",
247 +
          "skin",
248 +
          "eyes",
146 249
          "layers",
147 250
          "createdAt"
148 251
        ],
149 252
        "type": "object"
150 253
      },
151 254
      "type": "record"
255 +
    },
256 +
    "skin": {
257 +
      "description": "Skin color configuration.",
258 +
      "properties": {
259 +
        "hex": {
260 +
          "maxLength": 7,
261 +
          "type": "string"
262 +
        },
263 +
        "mode": {
264 +
          "maxLength": 10,
265 +
          "type": "string"
266 +
        },
267 +
        "tone": {
268 +
          "maximum": 100,
269 +
          "minimum": 0,
270 +
          "type": "integer"
271 +
        }
272 +
      },
273 +
      "type": "object"
274 +
    },
275 +
    "submaskExclusions": {
276 +
      "description": "Target-side exceptions for subtractive masks. List exact canonical source layer IDs in layers, or exact source layerClass or fitClass values in classes; matching source masks must not erase the target layer. Omission or empty arrays means no source-specific exclusions.",
277 +
      "properties": {
278 +
        "classes": {
279 +
          "description": "Exact source layerClass or fitClass values whose subtractive masks must be skipped.",
280 +
          "items": {
281 +
            "maxLength": 90,
282 +
            "type": "string"
283 +
          },
284 +
          "maxLength": 64,
285 +
          "type": "array"
286 +
        },
287 +
        "layers": {
288 +
          "description": "Exact canonical source layer IDs whose subtractive masks must be skipped.",
289 +
          "items": {
290 +
            "maxLength": 30,
291 +
            "type": "string"
292 +
          },
293 +
          "maxLength": 32,
294 +
          "type": "array"
295 +
        }
296 +
      },
297 +
      "type": "object"
298 +
    },
299 +
    "suppressionRules": {
300 +
      "description": "Layer IDs and classes hidden while this layer is active.",
301 +
      "properties": {
302 +
        "classes": {
303 +
          "items": {
304 +
            "maxLength": 90,
305 +
            "type": "string"
306 +
          },
307 +
          "maxLength": 20,
308 +
          "type": "array"
309 +
        },
310 +
        "layers": {
311 +
          "items": {
312 +
            "maxLength": 30,
313 +
            "type": "string"
314 +
          },
315 +
          "maxLength": 20,
316 +
          "type": "array"
317 +
        }
318 +
      },
319 +
      "type": "object"
152 320
    }
153 321
  },
154 322
  "description": "Generator metadata and decomposed layers for a sprite built with the rpg.actor sprite generator.",
155 323
  "id": "actor.rpg.generator",
156 324
  "lexicon": 1
157 325
}

Compare Other Versions

Lexicon Garden

@