// game-data.jsx — The Director's Game: 3 levels, each with learning, tools, challenge.
// Exports to window.GAME = { LEVELS, RANKS }.

const RANKS = [
  "Production Assistant", // 0 levels cleared
  "Storyboard Artist",    // 1
  "Art Director",         // 2
  "Motion Director",      // 3
];

const LEVELS = [
  {
    id: 1,
    code: "Level 01",
    name: "Strategic Visualization",
    tag: "Storyboard",
    rank: "Storyboard Artist",
    mission:
      "Convert your script into a storyboard. A storyboard is a visual map that explains how an idea, experience, product, or story unfolds step by step.",
    tools: ["gemini", "firefly"],
    learning: [],
    strategicViz: {
      title: "Strategic Visualization",
      sections: [
        {
          n: "01",
          title: "Idea to Script",
          summary: "Jamila wakes up tired. She opens the fridge and finds MAZAJ iced coffee. After one sip, her mood changes and start working in fresh mood.",
          type: "pipeline",
          steps: [
            { n: "01", title: "Highlight the Script", desc: "She wakes up tired. She opens the fridge. She sees the coffee." },
            { n: "02", title: "Turn Moments to Frames", desc: "Show Jamila in bed looking tired. Show her hand opening the fridge. Show MAZAJ can inside the fridge." },
            { n: "03", title: "Choose the Camera Shot", desc: "Wide shot for room. Medium shot for her hand and fridge. Close-up on the can inside fridge." },
          ],
          exampleTitle: "Prompt Example",
          exampleText: "Act as a senior creative director, copywriter, and film director. Create a professional 30-second TikTok / Instagram Reels script from this brief. First, briefly analyze the objective, audience, key message, product benefit, tone, emotional journey, and missing data. Then write the table script using this format: Frame | Duration | VO / Text | Visual Description | Camera | Mood. Style camera movement requirements: Cinematic, colorful, playful street style, Gen Z-focused, not generic, built around the transformation: \"One sip changes the whole mood.\" Use natural mixed English. Brief: Jamila wakes up tired before work. She opens the fridge and finds MAZAJ Iced Coffee. After one sip, her mood changes. She gets ready, opens her laptop, and start working feeling confident. The product appears with the tagline: MAZAJ Iced Coffee — Until your mood finds you. Brand: Mazaj Product: Ice Coffee Audience: Gen Z, university students, young creatives Goal: Launch new iced coffee CTA: Until your mood finds you Benefit: Strong caffeine, affordable Packaging: Can Location: Street café / urban street Platform: TikTok / Instagram Reels Duration: 30 sec. Output: Script Table",
        },
        {
          n: "02",
          title: "Visual Language",
          summary: "Frame - Shot - Scene - Sequence - Film.",
          type: "styleGuide",
          components: [
            { n: "Frames", title: "The Smallest Unit — Single Still Image", desc: "When you watch a movie at 24 fps, you're seeing 24 individual frames every second. This is frame design. Jamila drinking coffee: Frame #1 - Can on table. Frame #2 - Hand moving. Frame #3 - Can lifted. Each of those is just one photograph." },
            { n: "Shots", title: "Continuous Camera Recording", desc: "A shot is the continuous recording between \"Action\" and \"Cut.\" That entire piece is ONE SHOT. Jamila enter the kitchen: Camera records a Jamila walking into the kitchen for 4 seconds. No cuts. That is one shot." },
            { n: "Scenes", title: "The Story Unit", desc: "Dramatic event happening in the same place and continuous, it is usually composed of multiple shots. In the kitchen: Jamila enters. She open the fridge. Find the coffee can. smile and take sip. The whole interaction is ONE SCENE." },
          ],
          example: "FRAME - SHOT - SCENE - SEQUENCE - FILM",
        },
        {
          n: "03",
          title: "Shot Types & Camera Movement",
          summary: "Shots Type and Camera Movement.",
          type: "shotGuide",
          shotTypes: [
            { purpose: "Show location", shot: "Wide shot" },
            { purpose: "Character emotion", shot: "Close-up" },
            { purpose: "Show action", shot: "Medium shot" },
            { purpose: "Product beauty", shot: "Macro / close-up" },
            { purpose: "Transformation", shot: "Slow motion" },
            { purpose: "Show lifestyle", shot: "Tracking shot" },
          ],
          cameraMovements: [
            { goal: "To create focus or emotion", move: "Push-in" },
            { goal: "To reveal the full scene", move: "Pull-out" },
            { goal: "To follow movement", move: "Tracking shot" },
            { goal: "To make product feel premium", move: "Orbit" },
            { goal: "To feel natural and lifestyle", move: "Handheld" },
            { goal: "To feel calm, clean, premium", move: "Static shot" },
          ],
        },
        {
          n: "04",
          title: "Convert Script to Storyboard",
          summary: "Prompt example.",
          type: "promptFormula",
          formula: ["Frame No.", "Time", "VO", "Visual Description", "Shot Type", "Mood", "Camera Movement"],
          exampleTitle: "Prompt Example",
          exampleText: "Act as a professional film director, art director, and AI visual storyboard creator. Convert the script that contains a storyboard table with the following columns: Frame No. | Time | VO | Visual Description | Shot Type | Mood | Camera Movement. Your task is to convert this script into a clear, detailed, cinematic visual storyboard. Do not rewrite the script or change the voice-over meaning. Use the existing script as the foundation, then upgrade the visual direction professionally.",
          negative: "",
        },
      ],
    },
    challenges: [
      {
        kind: "open",
        title: "How to Create a Gem",
        intro: "Build a custom Gem that works as your AI executive producer, then put it to work producing a demo package.",
        prompt: "Act as an Executive Producer Gem. Your job is to guide a creator from a raw idea to a fully produced short-form video package. When given a brief, you must: 1) Create a demo storyboard, writing a short description for every scene. 2) Generate the script and voice-over (VO) line for each scene. 3) Generate a production-ready AI image prompt for each frame, written for Nano Banana 2 & GPT Image 2. Keep character, product, and visual style consistent across every scene. Ask clarifying questions about brand, audience, platform, and tone before producing the final package. Output the storyboard, script/VO, and image prompts as clearly labeled sections. We need the system instructions to create this custom Gem — write them as a complete, ready-to-paste system instructions block for the Gem's configuration.",
        items: [
          { label: "Write instructions for a custom Gem that works as executive producer" },
          { label: "Create a demo storyboard with a description per scene" },
          { label: "Generate the script and VO per scene" },
          { label: "Generate the prompt that creates each image for Nano Banana 2 & GPT Image 2" },
        ],
      },
      {
        kind: "open",
        title: "Idea to Script",
        intro: "Turn this brief into a professional 30-second script table.",
        prompt: "Act as a senior creative director, copywriter, and film director. Create a professional 30-second TikTok / Instagram Reels script from this brief. Write the table script using this format: Frame | Duration | VO / Text | Visual Description | Camera | Mood. Style camera movement requirements: Cinematic, colorful, playful street style, Gen Z-focused, not generic, built around the transformation: \"One sip changes the whole mood.\" Use natural mixed English. Brief: Jamila wakes up tired before work. She opens the fridge and finds MAZAJ Iced Coffee. After one sip, her mood changes. She gets ready, opens her laptop, and start working feeling confident. The product appears with the tagline: MAZAJ Iced Coffee — Until your mood finds you. Brand: Mazaj Product: Ice Coffee Audience: Gen Z, university students, young creatives Goal: Launch new iced coffee CTA: Until your mood finds you Benefit: Strong caffeine, affordable Packaging: Can Location: Street café / urban street Platform: TikTok / Instagram Reels Duration: 30 sec. Output: Script Table",
        columns: ["Duration", "VO / Text", "Visual Description", "Camera", "Mood"],
        items: [
          { label: "Frame 1" },
          { label: "Frame 2" },
          { label: "Frame 3" },
          { label: "Frame 4" },
          { label: "Frame 5" },
        ],
      },
      {
        kind: "open",
        title: "Create Visual Story Board",
        intro: "Convert the script into a clear, detailed, cinematic visual storyboard.",
        prompt: "Act as a professional film director, art director, and AI visual storyboard creator. Convert the script that contains a storyboard table with the following columns: Frame No. | Time | VO | Visual Description | Shot Type | Mood | Camera Movement. Your task is to convert this script into a clear, detailed, cinematic visual storyboard. Do not rewrite the script or change the voice-over meaning. Use the existing script as the foundation, then upgrade the visual direction professionally.",
        columns: ["Time", "VO", "Visual Description", "Shot Type", "Mood", "Camera Movement"],
        items: [
          { label: "Frame 1" },
          { label: "Frame 2" },
          { label: "Frame 3" },
          { label: "Frame 4" },
          { label: "Frame 5" },
        ],
      },
    ],
  },

  {
    id: 2,
    code: "Level 02",
    name: "Visual Crafting",
    tag: "Visual Creation",
    rank: "Art Director",
    mission:
      "Six steps to bring your storyboard to life — from locking the visual style to reviewing every frame for story fit.",
    tools: ["firefly", "nano-banana", "gpt-image"],
    learning: [],
    challenges: [
      {
        kind: "open",
        title: "Build the Character Reference Sheet",
        intro: "Use the locked character prompt below to generate Jamila's reference sheet — front, side, back, face close-up, and all 5 expressions.",
        prompt: "Character reference sheet of Jamila, a 21 year old, with dark brown wavy shoulder length hair, warm brown eyes, olive tan skin, soft round face, average slim body, wearing cozy light blue long pajama pants and a matching button up pajama shirt, barefoot, slightly messy morning hair, natural sleepy face. Show front view, side view, back view, face close-up, and 5 expressions: very tired, sleepy, surprised, refreshed, focused and happy. Clean white background, cozy realistic character design, consistent proportions, clear outfit details, soft morning lifestyle mood, cinematic mood.",
        items: [
          { label: "Front view" },
          { label: "Side view" },
          { label: "Back view" },
          { label: "Face close-up" },
          { label: "5 expressions" },
        ],
      },
      {
        kind: "open",
        title: "Prompt Every Frame",
        intro: "create prompt for each frame in the storyboard",
        columns: ["AI Image Prompt"],
        items: [
          { label: "Frame 1" },
          { label: "Frame 2" },
          { label: "Frame 3" },
          { label: "Frame 4" },
          { label: "Frame 5" },
          { label: "Frame 6" },
          { label: "Frame 7" },
          { label: "Frame 8" },
          { label: "Frame 9" },
        ],
      },
      {
        kind: "open",
        title: "Generate the Storyboard, Frame by Frame",
        intro: "Feed the storyboard to your image model one frame at a time, using this iterative method — never generate the whole board in one shot.",
        prompt: "Read the storyboard.\n\nExtract Frame 01 only.\n\nGenerate one production-ready AI image prompt for Frame 01.\n\nWait.\n\nWhen I say \"Next\"\n\nGenerate Frame 02.\n\nContinue until the storyboard ends.\n\nKeep full consistency from previous frames.",
        items: [
          { label: "Frame 1 image" },
          { label: "Frame 2 image" },
          { label: "Frame 3 image" },
          { label: "Frame 4 image" },
          { label: "Frame 5 image" },
          { label: "Frame 6 image" },
          { label: "Frame 7 image" },
          { label: "Frame 8 image" },
          { label: "Frame 9 image" },
        ],
      },
    ],
    visualCrafting: {
      title: "Visual Crafting",
      intro: "Six steps to bring your storyboard to life — from locking the visual style to reviewing every frame for story fit.",
      sections: [
        {
          n: "01",
          title: "Lock the Storyboard First",
          summary: "Finalise every shot decision before rendering a single frame.",
          type: "points",
          points: [
            "Storyboard decisions are cheap — rendering is not. Change your mind here, not after spending credits.",
            "Lock every shot: subject, setting, mood, and camera angle.",
            "Get a second pair of eyes on the board before you commit to render.",
            "In the workshop, that's your facilitator — pitch it, adjust, then commit.",
          ],
        },
        {
          n: "02",
          title: "Maintain Character Consistency",
          summary: "Build and lock your character guide before the first render — then never deviate.",
          type: "character",
          steps: [
            {
              n: 1,
              title: "Start with the Character Concept",
              fields: [
                { k: "Name", v: "Jamila" },
                { k: "Age", v: "21" },
                { k: "Personality", v: "Tired at first, curious, energetic, confident" },
                { k: "Role", v: "Main character — university student" },
                { k: "Main goal", v: "Start her workday, but she wakes up tired and low-energy" },
                { k: "World/genre", v: "Cozy realistic home lifestyle, morning routine, soft cinematic storyboard" },
              ],
            },
            {
              n: 2,
              title: "Create a Fixed Visual Description",
              good: "Jamila, a 21-year-old, with dark brown wavy shoulder-length hair, warm brown eyes, olive tan skin, soft round face, average slim body, wearing cozy light blue long pajama pants and a matching button-up pajama shirt, barefoot, slightly messy morning hair, natural sleepy face.",
              bad: "A woman with brown hair and pyjamas.",
            },
            {
              n: 3,
              title: "Make a Character Reference Sheet",
              includes: ["Front view", "Side view", "Back view", "Face close-up", "Expression sheet", "Important accessories", "Color palette"],
              example: "Character reference sheet of Jamila, a 21 year old, with dark brown wavy shoulder length hair, warm brown eyes, olive tan skin, soft round face, average slim body, wearing cozy light blue long pajama pants and a matching button up pajama shirt, barefoot, slightly messy morning hair, natural sleepy face. Show front view, side view, back view, face close-up, and 5 expressions: very tired, sleepy, surprised, refreshed, focused and happy. Clean white background, cozy realistic character design, consistent proportions, clear outfit details, soft morning lifestyle mood, cinematic mood.",
            },
            {
              n: 4,
              title: "Build a Mini Character Guide",
              categories: [
                { label: "Body", items: ["21 years old", "Young adult", "Average slim body"] },
                { label: "Hair", items: ["Dark brown hair", "Wavy texture", "Shoulder-length", "Slightly messy in the morning"] },
                { label: "Face", items: ["Soft round face", "Warm brown eyes", "Olive tan skin", "Natural sleepy morning look"] },
                { label: "Clothes", items: ["Cozy long pajama pants", "Matching pajama shirt", "Light-blue color", "Barefoot"] },
                { label: "Main Object", items: ["Iced coffee"] },
                { label: "Do Not Change", items: ["Her age", "Her Egyptian identity", "Her dark brown wavy hair", "Her warm brown eyes", "Her olive tan skin", "Her slim body shape", "Her light-blue pajama pants and shirt", "The iced coffee as the mood-changing object", "The cozy morning home atmosphere"] },
              ],
            },
          ],
          checklist: [
            "Does the face look like the same person?",
            "Is the hair the same shape and color?",
            "Are the clothes correct?",
            "Are the accessories still there?",
            "Is the body size/age consistent?",
            "Is the art style the same?",
            "Does the emotion match the story?",
            "Is the camera angle clear?",
          ],
        },
        {
          n: "03",
          title: "Create a Visual Style Guide",
          summary: "One style, locked — art, lighting, palette, ratio, character design, and lens feel.",
          type: "styleGuide",
          components: [
            { n: "01", title: "Art Style", desc: "3D photorealistic, cinematic animation, documentary, anime, minimalist, etc." },
            { n: "02", title: "Color Palette", desc: "Warm, cold, muted, high contrast, pastel, monochrome" },
            { n: "03", title: "Lighting", desc: "Natural daylight, soft studio lighting, dramatic shadows, neon lighting, golden hour" },
            { n: "04", title: "Aspect Ratio", desc: "Video 16:9 · TikTok/Reels 9:16 · Feed posts 4:5 · Grid 1:1 · Ultrawide 21:9" },
            { n: "05", title: "Character Design", desc: "Same clothes, age, face, hair, body type, expression style across all frames" },
            { n: "06", title: "Lens / Camera Feel", desc: "Cinematic 35mm, documentary lens, shallow depth of field, etc." },
          ],
          example: "Cinematic realistic Gen Z lifestyle commercial, 9:16 vertical format, soft natural morning light, warm beige and creamy brown color palette, fresh iced coffee tones, shallow depth of field, realistic textures, premium but youthful mood, smooth camera movement, clean modern university lifestyle atmosphere.",
        },
        {
          n: "04",
          title: "Master Visual Direction",
          summary: "Use the same structural formula for every scene prompt — never skip an element.",
          type: "promptFormula",
          formula: ["Scene number", "Scene description", "Camera angle", "Composition", "Lighting", "Mood", "Technical format", "Negative prompt"],
          exampleTitle: "Scene 01",
          exampleText: "Jamila, a 21 year old Egyptian woman with dark brown wavy shoulder-length hair, warm brown eyes, olive tan skin, soft round face, average slim body, wearing cozy light blue long pajama pants and a matching button-up pajama shirt, barefoot, slightly messy morning hair, natural sleepy face, sits tired on the edge of her bed in a small modern student bedroom. Books and a laptop are on the desk, soft morning light enters through the window, her expression is sleepy and unfocused. Wide shot, cinematic realistic Gen Z lifestyle commercial, warm beige and soft brown color palette, shallow depth of field, 9:16 vertical format.",
          negative: "blurry, distorted face, extra fingers, unrealistic anatomy, different outfit, different character, bad hands, text, watermark, low quality",
        },
        {
          n: "05",
          title: "Generate Keyframes for Scenes",
          summary: "Start with the most important visual moments — not every second.",
          type: "keyframes",
          frames: [
            { label: "Opening Frame", desc: "How the scene begins — Jamila holds the coffee can close to her face, still looking tired" },
            { label: "Main Action Frame", desc: "The most important moment — Jamila takes the first sip, eyes softly closing" },
            { label: "Ending Frame", desc: "The scene transitions out — refreshing feeling begins, she becomes more confident, mood is brighter" },
          ],
          rules: [
            "For simple scenes, one image may be enough.",
            "For complex scenes, generate 2-3 keyframes.",
            "A keyframe is the most important visual moment in a scene — not every second needs a frame.",
          ],
        },
        {
          n: "06",
          title: "Images Consistency Checklist",
          summary: "A beautiful image means nothing if it doesn't serve the story.",
          type: "checklist",
          headline: "Do not accept beautiful images if they do not serve the story.",
          checks: [
            "Does it match the storyboard?",
            "Is the character consistent?",
            "Is the location consistent?",
            "Is the mood correct?",
            "Is the camera angle correct?",
            "Is it suitable for video animation?",
            "Does it visually connect to the previous and next scenes?",
          ],
        },
        {
          n: "07",
          title: "Reference Output: Final Frame Gallery",
          summary: "The complete 15-frame set generated end-to-end with a locked character and style.",
          type: "gallery",
          pdf: "assets/frames/video-frames-reference.pdf",
          images: [
            { src: "assets/frames/frame-01.jpg", label: "Frame 1" },
            { src: "assets/frames/frame-02.jpg", label: "Frame 2" },
            { src: "assets/frames/frame-03.jpg", label: "Frame 3" },
            { src: "assets/frames/frame-04.jpg", label: "Frame 4" },
            { src: "assets/frames/frame-05.jpg", label: "Frame 5" },
            { src: "assets/frames/frame-06.jpg", label: "Frame 6" },
            { src: "assets/frames/frame-07.jpg", label: "Frame 7" },
            { src: "assets/frames/frame-08.jpg", label: "Frame 8" },
            { src: "assets/frames/frame-09.jpg", label: "Frame 9" },
            { src: "assets/frames/frame-10.jpg", label: "Frame 10" },
            { src: "assets/frames/frame-11.jpg", label: "Frame 11" },
            { src: "assets/frames/frame-12.jpg", label: "Frame 12" },
            { src: "assets/frames/frame-13.jpg", label: "Frame 13" },
            { src: "assets/frames/frame-14.jpg", label: "Frame 14" },
            { src: "assets/frames/frame-15.jpg", label: "Frame 15" },
          ],
        },
      ],
    },
  },

  {
    id: 3,
    code: "Level 03",
    name: "Motion Orchestration",
    tag: "Image to Video",
    rank: "Motion Director",
    mission:
      "Frames become film. Follow the six-step production pipeline — from locking motion for each frame to merging clips into a finished video.",
    tools: ["kling", "veo", "seedance", "firefly"],
    learning: [],
    motionOrchestration: {
      title: "Motion Orchestration",
      intro: "The six-step production pipeline — from locking your frames to delivering a finished video.",
      sections: [
        {
          n: "01",
          title: "Production Pipeline",
          summary: "Six steps from locked frame to finished video — in order, every time.",
          type: "pipeline",
          steps: [
            { n: "01", title: "Prepare Your Frames Before Animation" },
            { n: "02", title: "Decide the Motion for Each Frame" },
            { n: "03", title: "Upload the Image as the First Frame" },
            { n: "04", title: "Write the Prompt Correctly" },
            { n: "05", title: "Generate Short Clips, Not Long Videos" },
            { n: "06", title: "Merge All Clips to Create Full Video" },
          ],
        },
        {
          n: "02",
          title: "Three Methods for Generated Video",
          summary: "Text prompt for ideas, still image for consistency, video clip for restyling.",
          type: "methods",
          rows: [
            { method: "Text-to-Video", start: "Text Prompt", strength: "Concept generation", use: "Ideation, new content creation — the Creator Start" },
            { method: "Image-to-Video", start: "Still Image", strength: "Visual consistency", use: "Cinematic shots, product ads — the Director Start" },
            { method: "Video-to-Video", start: "Video Clip", strength: "Style transformation", use: "Restyling, fixing/enhancing footage — the Editor Start" },
          ],
          keyframes: [
            { label: "First frame only", use: "When you want a simple movement from one image" },
            { label: "First + last frame", use: "When you want the shot to end in a specific pose or composition" },
            { label: "Motion reference video", use: "When you want the generated video to copy a real camera move" },
          ],
        },
        {
          n: "03",
          title: "Video Prompt Structure",
          summary: "Subject Action + Camera Movement + Environment Motion + Consistency Lock.",
          type: "promptFormula",
          formula: ["Subject Action", "Camera Movement", "Environment Motion", "Consistency Lock"],
          exampleTitle: "Prompt Example",
          exampleText: "Jamila takes her first sip of Iced Coffee while her expression shifts from tired to refreshed. The camera slowly pushes in. Morning light moves softly through the curtains of the cozy kitchen in the background. Motion is slow and cinematic. Keep the same identity, face, outfit, product, composition, lighting, background, and visual style from the input image.",
          negative: "",
        },
        {
          n: "04",
          title: "Image-to-Video Prompt Template",
          summary: "The AI prompt that generates the best image-to-video prompt for your tool.",
          type: "promptFormula",
          formula: ["Image / Frame", "Script or VO", "Shot Duration", "Platform / Tool", "Ratio", "Motion Style", "Consistency Lock"],
          exampleTitle: "The AI Prompt",
          exampleText: "Act as a professional film director, AI video prompt engineer, and motion designer. I will upload one storyboard frame/image. Analyze the image carefully and write the best image-to-video prompt for [TOOL NAME: Kling / Runway / Adobe Firefly / Seedance]. Goal of the shot: [Write the purpose of the shot or paste the VO/script line] Video duration: [5 seconds / 10 seconds] Aspect ratio: [1:1 / 16:9 / 9:16] Visual style: [Cinematic / realistic / luxury commercial / documentary / Gen Z lifestyle / premium product ad]. Your task: Identify the main subject. Suggest subject motion. Suggest camera movement. Add subtle environment motion. Keep the prompt short, clear, and cinematic. Do not rewrite the whole image description. Focus mainly on object, motion and environment. Add a consistency lock: keep the same identity, face, outfit, product, composition, lighting, background, and visual style. Output format: Image-to-video prompt: / Negative / avoid:",
          negative: "",
        },
        {
          n: "05",
          title: "Core Camera Movements",
          summary: "Seven movements — when to use each and what it does to the frame.",
          type: "cameraTable",
          rows: [
            { move: "Push In (Dolly In)", use: "For emotional moments or emphasizing a product detail", desc: "Moves toward the subject" },
            { move: "Pull Out (Dolly Out)", use: "For context or revelation, showing the subject within their environment", desc: "Moves away from the subject" },
            { move: "Pan", use: "To follow a subject's movement or to scan a wide scene", desc: "Stays in one location but pivots horizontally" },
            { move: "Tilt", use: "To reveal size or importance — e.g. tilting up a tall building or a character's outfit", desc: "Stays in one location but pivots vertically" },
            { move: "Orbit", use: "A dynamic 3D feeling, excellent for showing depth and high-end product features", desc: "Moves in a circle around the subject" },
            { move: "Tracking", use: "Follows a character as they move — parallel to the subject", desc: "Moves parallel to the subject" },
            { move: "Handheld", use: "For lifestyle, social media content, or realistic in-the-moment footage", desc: "Mimics the slight natural shake of a person holding the camera" },
          ],
        },
      ],
    },
    challenges: [
      {
        kind: "open",
        title: "Image into a cinematic shot",
        intro: "Use this brief to write a motion prompt that turns a still image into a cinematic video shot.",
        brief: "A hero shot of an iced coffee can on a clean cafe table, covered with cold condensation. Soft morning side light, warm blurred beige background, subtle reflections, fresh premium lifestyle feel.",
        goal: "Learn subtle motion, premium pacing, and cinematic realism.",
        items: [
          { label: "Motion model" },
          { label: "Your motion prompt" },
          { label: "Why this motion fits the brief" },
        ],
      },
      {
        kind: "open",
        title: "The 3-Second Transformation",
        intro: "Pick two images and write a prompt that creates a smooth, controlled transformation between them.",
        brief: "Animate a still image with a simple transformation. Use two images and create a short transformation effect.",
        goal: "Practice controlled transformation without chaotic results.",
        items: [
          { label: "Image 1 — describe your starting frame" },
          { label: "Image 2 — describe your ending frame" },
          { label: "Transformation prompt" },
          { label: "Model used" },
        ],
      },
    ],
  },
];

function levelItemCount(lv) {
  const chs = lv.challenges || (lv.challenge ? [lv.challenge] : []);
  return chs.reduce((n, c) => n + (c.items ? c.items.length : 0), 0);
}

window.GAME = { LEVELS, RANKS, levelItemCount };
