{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://ludo.ai/schemas/ludo-ai/game-asset.json",
  "title": "Ludo.ai Game Asset",
  "description": "Schema representing game assets generated by the Ludo.ai platform, including images, spritesheets, 3D models, videos, and audio files.",
  "type": "object",
  "required": ["asset_type", "url", "created_at"],
  "properties": {
    "asset_type": {
      "type": "string",
      "description": "The category of generated game asset.",
      "enum": [
        "image",
        "spritesheet",
        "video",
        "3d_model",
        "sound_effect",
        "music",
        "voice",
        "speech"
      ]
    },
    "url": {
      "type": "string",
      "format": "uri",
      "description": "URL of the generated asset. Temporary and expires after 7 days."
    },
    "request_id": {
      "type": "string",
      "description": "Client-provided identifier for tracking and retrieving the asset asynchronously."
    },
    "created_at": {
      "type": "string",
      "format": "date-time",
      "description": "Timestamp when the asset was generated."
    },
    "credits_consumed": {
      "type": "number",
      "description": "Number of credits consumed to generate this asset.",
      "minimum": 0
    },
    "image_details": {
      "$ref": "#/$defs/ImageDetails"
    },
    "spritesheet_details": {
      "$ref": "#/$defs/SpritesheetDetails"
    },
    "model_3d_details": {
      "$ref": "#/$defs/Model3DDetails"
    },
    "video_details": {
      "$ref": "#/$defs/VideoDetails"
    },
    "audio_details": {
      "$ref": "#/$defs/AudioDetails"
    }
  },
  "$defs": {
    "ImageDetails": {
      "type": "object",
      "description": "Details specific to generated image assets.",
      "properties": {
        "image_type": {
          "type": "string",
          "description": "The type of game image asset.",
          "enum": [
            "sprite",
            "icon",
            "screenshot",
            "art",
            "asset",
            "sprite-vfx",
            "ui_asset",
            "fixed_background",
            "texture",
            "3d",
            "generic"
          ]
        },
        "art_style": {
          "type": "string",
          "description": "The art style used for generation.",
          "enum": [
            "Pixel Art (16-Bit)",
            "Pixel Art (8-Bit)",
            "Low Poly",
            "Cartoonish",
            "Stylized 3D",
            "Flat Design",
            "Anime/Manga",
            "Voxel Art"
          ]
        },
        "perspective": {
          "type": "string",
          "description": "The camera perspective used for the image.",
          "enum": [
            "Side-Scroll",
            "Top-Down",
            "Isometric",
            "First-Person",
            "Third-Person",
            "2.5D"
          ]
        },
        "aspect_ratio": {
          "type": "string",
          "description": "The aspect ratio of the generated image.",
          "enum": ["default", "ar_1_1", "ar_4_3", "ar_16_9", "ar_9_16"]
        },
        "prompt": {
          "type": "string",
          "description": "The text prompt used to generate the image."
        }
      }
    },
    "SpritesheetDetails": {
      "type": "object",
      "description": "Details specific to generated spritesheet animation assets.",
      "properties": {
        "spritesheet_url": {
          "type": "string",
          "format": "uri",
          "description": "URL of the spritesheet image."
        },
        "video_url": {
          "type": "string",
          "format": "uri",
          "description": "URL of the animation as a video file."
        },
        "gif_url": {
          "type": "string",
          "format": "uri",
          "description": "URL of the animated GIF version."
        },
        "individual_frame_urls": {
          "type": "array",
          "description": "URLs of individual animation frames.",
          "items": {
            "type": "string",
            "format": "uri"
          }
        },
        "num_frames": {
          "type": "integer",
          "description": "Total number of frames in the spritesheet.",
          "minimum": 4,
          "maximum": 64
        },
        "num_cols": {
          "type": "integer",
          "description": "Number of columns in the spritesheet grid.",
          "minimum": 1
        },
        "num_rows": {
          "type": "integer",
          "description": "Number of rows in the spritesheet grid.",
          "minimum": 1
        },
        "frame_size": {
          "type": "integer",
          "description": "Size of each frame in pixels.",
          "enum": [64, 128, 256, 0]
        },
        "loop": {
          "type": "boolean",
          "description": "Whether the animation is a seamless loop."
        },
        "motion_prompt": {
          "type": "string",
          "description": "The motion prompt used to generate the animation."
        }
      }
    },
    "Model3DDetails": {
      "type": "object",
      "description": "Details specific to generated 3D model assets.",
      "properties": {
        "model_url": {
          "type": "string",
          "format": "uri",
          "description": "URL of the GLB 3D model file."
        },
        "snapshots": {
          "type": "array",
          "description": "Snapshot images of the 3D model from four different angles.",
          "items": {
            "type": "string",
            "format": "uri"
          },
          "minItems": 4,
          "maxItems": 4
        },
        "texture_type": {
          "type": "string",
          "description": "Type of texture applied to the model.",
          "enum": ["pbr", "simple", "none"]
        },
        "texture_size": {
          "type": "integer",
          "description": "Texture resolution in pixels.",
          "enum": [1024, 2048, 4096]
        },
        "target_num_faces": {
          "type": "integer",
          "description": "Target triangle count for the mesh.",
          "minimum": 1000,
          "maximum": 100000
        }
      }
    },
    "VideoDetails": {
      "type": "object",
      "description": "Details specific to generated video assets.",
      "properties": {
        "duration": {
          "type": "integer",
          "description": "Duration of the video in seconds.",
          "enum": [3, 5, 8, 10]
        },
        "prompt": {
          "type": "string",
          "description": "The motion prompt used to generate the video."
        },
        "model": {
          "type": "string",
          "description": "The video generation model used.",
          "enum": ["standard", "new"]
        }
      }
    },
    "AudioDetails": {
      "type": "object",
      "description": "Details specific to generated audio assets.",
      "properties": {
        "audio_type": {
          "type": "string",
          "description": "The type of audio asset generated.",
          "enum": ["sound_effect", "music", "voice", "speech", "speech_preset"]
        },
        "description": {
          "type": "string",
          "description": "The text description or prompt used to generate the audio."
        },
        "duration": {
          "type": "number",
          "description": "Duration of the audio in seconds.",
          "minimum": 0,
          "maximum": 10
        },
        "voice_preset_id": {
          "type": "string",
          "description": "The voice preset character used for speech generation.",
          "enum": [
            "Serious woman",
            "Wise woman",
            "Calm woman",
            "Patient man",
            "Determined man",
            "Deep voice man",
            "Teen boy",
            "Sweet girl"
          ]
        },
        "emotion": {
          "type": "string",
          "description": "The emotion applied to speech delivery.",
          "enum": ["Default", "Happy", "Sad", "Angry", "Fearful", "Surprised", "Neutral"]
        },
        "language": {
          "type": "string",
          "description": "Language used for speech output.",
          "enum": ["auto", "English", "Spanish", "French", "German", "Japanese", "Korean"]
        }
      }
    }
  }
}
