{
  "module": "wasser",
  "level": 1,
  "title": "Die Pfütze",
  "notes": "Sprites/sheets: Blender (Cycles), transparentes PNG, 2x Retina, Blick nach rechts (bei Bedarf per Code spiegeln/drehen). Anchor = [x,y] als Anteil von Breite/HÃ¶he des (Frame-)Bilds. Sheets = horizontale Streifen. GrÃ¶ÃŸen zwischen Arten NICHT maÃŸstabsgetreu, im Spiel skalieren. Kein Schatten gerendert (Kontaktschatten per Code). HintergrÃ¼nde/Illustrationen: OpenAI gpt-image-2, 1536x1024. Parallax: die Lichtungs-Hauptszene ist ein Einzelbild; layer_sky/far/front sind eine separate, frei kombinierbare Parallax-Garnitur (nicht aus der Hauptszene ausgeschnitten).",
  "assets": [
    {
      "id": "bg_main_evening",
      "type": "background",
      "path": "assets/bg/bg_main_evening.webp",
      "width": 1536,
      "height": 1024,
      "description": "Hauptszene Waldlichtung (Fichten/Buchen, Moos, Steine, Totholz) mit LEERER Schlammmulde in der Mitte unten; AbenddÃ¤mmerung, warmes Gegenlicht von rechts. Alle drei Tageszeiten mit identischer Komposition (Ã¼berblendbar)",
      "hollow": {
        "cx": 0.5,
        "cy": 0.695,
        "rx": 0.385,
        "ry": 0.145,
        "note": "leere Schlammmulde (ohne Wasser) als Ellipse in Bildanteilen (ca.), hier zeichnet der Code das Wasser"
      }
    },
    {
      "id": "bg_main_morning",
      "type": "background",
      "path": "assets/bg/bg_main_morning.webp",
      "width": 1536,
      "height": 1024,
      "description": "Hauptszene Waldlichtung (Fichten/Buchen, Moos, Steine, Totholz) mit LEERER Schlammmulde in der Mitte unten; Morgenlicht, Dunst, Sonnenstrahlen von links. Alle drei Tageszeiten mit identischer Komposition (Ã¼berblendbar)",
      "hollow": {
        "cx": 0.5,
        "cy": 0.695,
        "rx": 0.385,
        "ry": 0.145,
        "note": "leere Schlammmulde (ohne Wasser) als Ellipse in Bildanteilen (ca.), hier zeichnet der Code das Wasser"
      }
    },
    {
      "id": "bg_main_noon",
      "type": "background",
      "path": "assets/bg/bg_main_noon.webp",
      "width": 1536,
      "height": 1024,
      "description": "Hauptszene Waldlichtung (Fichten/Buchen, Moos, Steine, Totholz) mit LEERER Schlammmulde in der Mitte unten; Mittag, hoher Sonnenstand, blauer Himmel. Alle drei Tageszeiten mit identischer Komposition (Ã¼berblendbar)",
      "hollow": {
        "cx": 0.5,
        "cy": 0.695,
        "rx": 0.385,
        "ry": 0.145,
        "note": "leere Schlammmulde (ohne Wasser) als Ellipse in Bildanteilen (ca.), hier zeichnet der Code das Wasser"
      }
    },
    {
      "id": "bg_mud_closeup",
      "type": "background",
      "path": "assets/bg/bg_mud_closeup.webp",
      "width": 1536,
      "height": 1024,
      "description": "Minispiel Lupe: Nahaufnahme PfÃ¼tzenrand von schrÃ¤g oben, links Schlamm/Moos/BlÃ¤tter/Zweige (Verstecke), rechts flaches Wasser; keine Tiere"
    },
    {
      "id": "bg_underwater",
      "type": "background",
      "path": "assets/bg/bg_underwater.webp",
      "width": 1536,
      "height": 1024,
      "description": "Minispiel Kaulquappe: Blick unter Wasser in der PfÃ¼tze (Wasserlinie bei ca. 25 % HÃ¶he, darÃ¼ber Waldrand), grÃ¼nliches Licht, Schlammgrund, Algen/Pflanzen an den RÃ¤ndern, Mitte frei"
    },
    {
      "id": "layer_far",
      "type": "background",
      "path": "assets/layers/layer_far.webp",
      "width": 1536,
      "height": 1024,
      "description": "Parallax-Ebene 1: ferner Waldstreifen (Fichten/Buchen), transparent; Waldband ca. 57-85 % BildhÃ¶he",
      "parallax": 0.35,
      "alpha": true
    },
    {
      "id": "layer_front",
      "type": "background",
      "path": "assets/layers/layer_front.webp",
      "width": 1536,
      "height": 1024,
      "description": "Parallax-Ebene 3 (vorne): Farne, Huflattich, Pilze unten links/rechts und Buchenzweig oben links, Mitte transparent",
      "parallax": 1.2,
      "alpha": true
    },
    {
      "id": "layer_sky",
      "type": "background",
      "path": "assets/layers/layer_sky.webp",
      "width": 1536,
      "height": 1024,
      "description": "Parallax-Ebene 0 (hinten): Morgenhimmel mit Filzwolken, deckend",
      "parallax": 0.1
    },
    {
      "id": "title",
      "type": "illustration",
      "path": "assets/bg/title.webp",
      "width": 1536,
      "height": 1024,
      "description": "Titelbild Modul: PfÃ¼tze auf Waldlichtung mit Grasfrosch auf Moosstein, Laichballen, Kaulquappen, Huflattich; oberes Drittel ruhig fÃ¼r Titel per Code"
    },
    {
      "id": "info_foodchain",
      "type": "infographic",
      "path": "assets/info/info_foodchain.webp",
      "width": 1536,
      "height": 1024,
      "description": "Infografik-Basis ohne Text auf cremefarbenem Papier: Nahrungskette in einer Reihe: Fadenalgen -> Kaulquappe -> Libellenlarve -> Graureiher, mit Pfeilen; Platz fÃ¼r Beschriftung darunter"
    },
    {
      "id": "info_lifecycle",
      "type": "infographic",
      "path": "assets/info/info_lifecycle.webp",
      "width": 1536,
      "height": 1024,
      "description": "Infografik-Basis ohne Text auf cremefarbenem Papier: Lebenskreislauf Grasfrosch im Uhrzeigersinn: Laichballen (oben) -> Kaulquappe -> Kaulquappe mit Beinen -> Jungfrosch -> Frosch, mit Pfeilen; Platz fÃ¼r Beschriftung"
    },
    {
      "id": "info_watercycle",
      "type": "infographic",
      "path": "assets/info/info_watercycle.webp",
      "width": 1536,
      "height": 1024,
      "description": "Infografik-Basis ohne Text auf cremefarbenem Papier: Wasserkreislauf an der PfÃ¼tze: Sonne (oben links), Verdunstung aus der PfÃ¼tze, Wolke mit Regen (oben rechts), Pfeil-Kreislauf"
    },
    {
      "id": "kroete_frosch",
      "type": "illustration",
      "path": "assets/info/kroete/frosch.webp",
      "width": 720,
      "height": 456,
      "use": "minigame kroete, basket",
      "source": "OpenAI gpt-image-1.5, transparenter Hintergrund (Original: do_not_deploy/media_original/img/wasser_kroete)",
      "description": "Grasfrosch (Rana temporaria) sitzend, Dreiviertel-Seitenansicht nach rechts: glatte braune Haut, dunkler Schläfenfleck, lange Hinterbeine (Korb-Bild)"
    },
    {
      "id": "kroete_kroete",
      "type": "illustration",
      "path": "assets/info/kroete/kroete.webp",
      "width": 720,
      "height": 437,
      "use": "minigame kroete, basket",
      "source": "OpenAI gpt-image-1.5, transparenter Hintergrund (Original: do_not_deploy/media_original/img/wasser_kroete)",
      "description": "Erdkröte (Bufo bufo) sitzend, Dreiviertel-Seitenansicht nach rechts: breit, warzig, Kupferaugen, kurze Beine (Korb-Bild)"
    },
    {
      "id": "kroete_ballen",
      "type": "illustration",
      "path": "assets/info/kroete/ballen.webp",
      "width": 384,
      "height": 384,
      "use": "minigame kroete, trait card ballen",
      "source": "OpenAI gpt-image-1.5, transparenter Hintergrund (Original: do_not_deploy/media_original/img/wasser_kroete)",
      "description": "Merkmal Laichballen: runder Grasfrosch-Laichballen im Wasser"
    },
    {
      "id": "kroete_schnur",
      "type": "illustration",
      "path": "assets/info/kroete/schnur.webp",
      "width": 384,
      "height": 384,
      "use": "minigame kroete, trait card schnur",
      "source": "OpenAI gpt-image-1.5, transparenter Hintergrund (Original: do_not_deploy/media_original/img/wasser_kroete)",
      "description": "Merkmal Laichschnur: Erdkröten-Laichschnüre um einen Pflanzenstängel gewickelt"
    },
    {
      "id": "kroete_glatt",
      "type": "illustration",
      "path": "assets/info/kroete/glatt.webp",
      "width": 384,
      "height": 384,
      "use": "minigame kroete, trait card glatt",
      "source": "OpenAI gpt-image-1.5, transparenter Hintergrund (Original: do_not_deploy/media_original/img/wasser_kroete)",
      "description": "Merkmal glatte, feuchte Haut: Ausschnitt Froschhaut mit Tropfen"
    },
    {
      "id": "kroete_warzig",
      "type": "illustration",
      "path": "assets/info/kroete/warzig.webp",
      "width": 384,
      "height": 384,
      "use": "minigame kroete, trait card warzig",
      "source": "OpenAI gpt-image-1.5, transparenter Hintergrund (Original: do_not_deploy/media_original/img/wasser_kroete)",
      "description": "Merkmal warzige, trockene Haut: Ausschnitt Krötenhaut"
    },
    {
      "id": "kroete_springt",
      "type": "illustration",
      "path": "assets/info/kroete/springt.webp",
      "width": 384,
      "height": 384,
      "use": "minigame kroete, trait card springt",
      "source": "OpenAI gpt-image-1.5, transparenter Hintergrund (Original: do_not_deploy/media_original/img/wasser_kroete)",
      "description": "Merkmal springt weit: Grasfrosch im Sprung, Hinterbeine gestreckt"
    },
    {
      "id": "kroete_krabbelt",
      "type": "illustration",
      "path": "assets/info/kroete/krabbelt.webp",
      "width": 384,
      "height": 384,
      "use": "minigame kroete, trait card krabbelt",
      "source": "OpenAI gpt-image-1.5, transparenter Hintergrund (Original: do_not_deploy/media_original/img/wasser_kroete)",
      "description": "Merkmal krabbelt: Erdkröte geht auf kurzen Beinen"
    },
    {
      "id": "frog_blink",
      "type": "sheet",
      "path": "assets/sheets/frog_blink.webp",
      "width": 1280,
      "height": 268,
      "frameWidth": 320,
      "frameHeight": 268,
      "frames": 4,
      "layout": "horizontal strip, left to right",
      "fps": 8,
      "loop": true,
      "anchor": [
        0.5,
        0.97
      ],
      "view": "side",
      "facing": "right",
      "description": "Grasfrosch Idle-Blinzeln, 4 Frames (offen, halb, zu, halb); passt pixelgenau zu frog_sit_side",
      "note": "Frame 0 lÃ¤nger halten (z.B. 2-4 s), dann 1-2-3 schnell abspielen",
      "legacy": true,
      "replacedBy": "characters.frog"
    },
    {
      "id": "frog_hop",
      "type": "sheet",
      "path": "assets/sheets/frog_hop.webp",
      "width": 5688,
      "height": 484,
      "frameWidth": 711,
      "frameHeight": 484,
      "frames": 8,
      "layout": "horizontal strip, left to right",
      "fps": 12,
      "loop": false,
      "anchor": [
        0.707,
        0.93
      ],
      "view": "side",
      "facing": "right",
      "description": "Grasfrosch Sprung, 8 Frames, auf der Stelle (HÃ¶he im Frame enthalten, horizontale Bewegung per Code). Frame 0 = Sitzpose",
      "note": "Anchor = FuÃŸpunkt der Sitzpose; Frame 3-5 in der Luft",
      "legacy": true,
      "replacedBy": "characters.frog"
    },
    {
      "id": "heron_idle",
      "type": "sheet",
      "path": "assets/sheets/heron_idle.webp",
      "width": 1788,
      "height": 642,
      "frameWidth": 447,
      "frameHeight": 642,
      "frames": 4,
      "layout": "horizontal strip, left to right",
      "fps": 4,
      "loop": true,
      "anchor": [
        0.451,
        0.96
      ],
      "view": "side",
      "facing": "right",
      "description": "Graureiher Idle, 4 Frames (Hals/Kopf wippt leicht, Schopf bewegt sich), passt zu heron_stand"
    },
    {
      "id": "tadpole_swim_side",
      "type": "sheet",
      "path": "assets/sheets/tadpole_swim_side.webp",
      "width": 2560,
      "height": 68,
      "frameWidth": 256,
      "frameHeight": 68,
      "frames": 10,
      "layout": "horizontal strip, left to right",
      "fps": 14,
      "loop": true,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "side34",
      "facing": "right",
      "description": "Schwimmzyklus groÃŸe Kaulquappe, 3/4-Seitenansicht, Hauptszene",
      "legacy": true,
      "replacedBy": "characters.tadpole.sprites.large_side"
    },
    {
      "id": "tadpole_swim_top",
      "type": "sheet",
      "path": "assets/sheets/tadpole_swim_top.webp",
      "width": 2560,
      "height": 78,
      "frameWidth": 256,
      "frameHeight": 78,
      "frames": 10,
      "layout": "horizontal strip, left to right",
      "fps": 14,
      "loop": true,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "top",
      "facing": "right",
      "description": "Schwimmzyklus groÃŸe Kaulquappe, Draufsicht (Schwanz schlÃ¤ngelt), Minispiel",
      "legacy": true,
      "replacedBy": "characters.tadpole.sprites.large_top"
    },
    {
      "id": "algae_side",
      "type": "sprite",
      "path": "assets/sprites/algae_side.webp",
      "width": 255,
      "height": 162,
      "anchor": [
        0.5,
        0.98
      ],
      "view": "side",
      "facing": "right",
      "description": "Fadenalgen, Seitenansicht, wachsen vom Grund nach oben"
    },
    {
      "id": "algae_top_a",
      "type": "sprite",
      "path": "assets/sprites/algae_top_a.webp",
      "width": 264,
      "height": 250,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "top",
      "facing": "right",
      "description": "Fadenalgen-BÃ¼schel, Draufsicht (Futter im Kaulquappen-Minispiel), Variante A"
    },
    {
      "id": "algae_top_b",
      "type": "sprite",
      "path": "assets/sprites/algae_top_b.webp",
      "width": 268,
      "height": 265,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "top",
      "facing": "right",
      "description": "Fadenalgen-BÃ¼schel, Draufsicht, Variante B"
    },
    {
      "id": "beetle_side",
      "type": "sprite",
      "path": "assets/sprites/beetle_side.webp",
      "width": 287,
      "height": 70,
      "anchor": [
        0.5,
        0.7
      ],
      "view": "side",
      "facing": "right",
      "description": "GelbrandkÃ¤fer, Seitenansicht"
    },
    {
      "id": "beetle_top",
      "type": "sprite",
      "path": "assets/sprites/beetle_top.webp",
      "width": 288,
      "height": 235,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "top",
      "facing": "right",
      "description": "GelbrandkÃ¤fer, Draufsicht (dunkel olivgrÃ¼n mit gelbem Rand, Ruderbeine)"
    },
    {
      "id": "dragonfly_larva_side",
      "type": "sprite",
      "path": "assets/sprites/dragonfly_larva_side.webp",
      "width": 338,
      "height": 73,
      "anchor": [
        0.5,
        0.9
      ],
      "view": "side",
      "facing": "right",
      "description": "Libellenlarve, Seitenansicht (lÃ¤uft am Grund)"
    },
    {
      "id": "dragonfly_larva_top",
      "type": "sprite",
      "path": "assets/sprites/dragonfly_larva_top.webp",
      "width": 338,
      "height": 227,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "top",
      "facing": "right",
      "description": "Libellenlarve (GroÃŸlibelle), Draufsicht, RÃ¤uber im Kaulquappen-Minispiel"
    },
    {
      "id": "frog_sit_side",
      "type": "sprite",
      "path": "assets/sprites/frog_sit_side.webp",
      "width": 320,
      "height": 265,
      "anchor": [
        0.5,
        0.97
      ],
      "view": "side",
      "facing": "right",
      "description": "Grasfrosch (erwachsen), sitzend, Seitenansicht; braun mit dunklen Flecken und dunklem SchlÃ¤fenfleck",
      "legacy": true,
      "replacedBy": "characters.frog"
    },
    {
      "id": "froglet_side",
      "type": "sprite",
      "path": "assets/sprites/froglet_side.webp",
      "width": 218,
      "height": 164,
      "anchor": [
        0.5,
        0.97
      ],
      "view": "side",
      "facing": "right",
      "description": "Jungfrosch (FrÃ¶schlein) mit Schwanzstummel, sitzend, Seitenansicht; im Spiel etwa halb so groÃŸ wie der erwachsene Frosch zeigen",
      "legacy": true,
      "replacedBy": "characters.froglet.sprites.side"
    },
    {
      "id": "heron_stand",
      "type": "sprite",
      "path": "assets/sprites/heron_stand.webp",
      "width": 446,
      "height": 627,
      "anchor": [
        0.452,
        0.959
      ],
      "view": "side",
      "facing": "right",
      "description": "Graureiher, stehend, Seitenansicht; Anchor = Füße (Bodenpunkt), gleich für alle Reiher-Sprites (Fressfeind von Kaulquappen/FrÃ¶schen)"
    },
    {
      "id": "heron_strike",
      "type": "sprite",
      "path": "assets/sprites/heron_strike.webp",
      "width": 634,
      "height": 465,
      "anchor": [
        0.329,
        0.945
      ],
      "view": "side",
      "facing": "right",
      "description": "Graureiher, vorgebeugt zum ZustoÃŸen (Hals gestreckt, Schnabel nach unten), Seitenansicht"
    },
    {
      "id": "leaf_side",
      "type": "sprite",
      "path": "assets/sprites/leaf_side.webp",
      "width": 427,
      "height": 232,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "side34",
      "facing": "right",
      "description": "Huflattich-Blatt, schrÃ¤g von der Seite (als Schattendach Ã¼ber der PfÃ¼tze)"
    },
    {
      "id": "leaf_top",
      "type": "sprite",
      "path": "assets/sprites/leaf_top.webp",
      "width": 500,
      "height": 453,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "top",
      "facing": "right",
      "description": "Huflattich-Blatt mit Stiel, Draufsicht (Schatten spenden / treibt auf dem Wasser)"
    },
    {
      "id": "leaf_stalk_a",
      "type": "sprite",
      "path": "assets/sprites/leaf_stalk_a.webp",
      "width": 720,
      "height": 437,
      "anchor": [
        0.0332,
        0.9903
      ],
      "blade": [
        0.675,
        0.45
      ],
      "bladeW": 0.63,
      "view": "side34",
      "facing": "right",
      "source": "OpenAI gpt-image-1.5 (Original: do_not_deploy/media_original/img/wasser_leaves)",
      "description": "Huflattich mit langem Stiel, Stiel steigt links unten auf und biegt sich zum Blatt (rechts oben); Stielende weich ausgeblendet; anchor = Stielende (Bildanteile), blade = Blattmitte, bladeW = Blattbreite/Bildbreite"
    },
    {
      "id": "leaf_stalk_c",
      "type": "sprite",
      "path": "assets/sprites/leaf_stalk_c.webp",
      "width": 720,
      "height": 334,
      "anchor": [
        0.0044,
        0.948
      ],
      "blade": [
        0.72,
        0.44
      ],
      "bladeW": 0.54,
      "view": "side34",
      "facing": "right",
      "source": "OpenAI gpt-image-1.5 (Original: do_not_deploy/media_original/img/wasser_leaves)",
      "description": "Huflattich mit langem, flachem Stiel von links unten, Blatt rechts schräg von oben; für Pflanzplätze am Seitenufer (ragt vom Bildrand herein); anchor = Stielende (Bildanteile), blade = Blattmitte, bladeW = Blattbreite/Bildbreite"
    },
    {
      "id": "leaf_stalk_d",
      "type": "sprite",
      "path": "assets/sprites/leaf_stalk_d.webp",
      "width": 720,
      "height": 404,
      "anchor": [
        0.0051,
        0.1335
      ],
      "blade": [
        0.67,
        0.6
      ],
      "bladeW": 0.66,
      "view": "side34",
      "facing": "right",
      "source": "OpenAI gpt-image-1.5 (Original: do_not_deploy/media_original/img/wasser_leaves)",
      "description": "Huflattich, Stiel links oben, neigt sich nach vorn unten, Blatt rechts unten von oben gesehen; für Pflanzplätze am hinteren Ufer; anchor = Stielende (Bildanteile), blade = Blattmitte, bladeW = Blattbreite/Bildbreite"
    },
    {
      "id": "leaf_stalk_e",
      "type": "sprite",
      "path": "assets/sprites/leaf_stalk_e.webp",
      "width": 720,
      "height": 429,
      "anchor": [
        0.0047,
        0.1799
      ],
      "blade": [
        0.645,
        0.61
      ],
      "bladeW": 0.67,
      "view": "side34",
      "facing": "right",
      "source": "OpenAI gpt-image-1.5 (Original: do_not_deploy/media_original/img/wasser_leaves)",
      "description": "Huflattich, Variante zu leaf_stalk_d (hinteres Ufer); anchor = Stielende (Bildanteile), blade = Blattmitte, bladeW = Blattbreite/Bildbreite"
    },
    {
      "id": "mosquito_larva_side",
      "type": "sprite",
      "path": "assets/sprites/mosquito_larva_side.webp",
      "width": 179,
      "height": 233,
      "anchor": [
        0.28,
        0.03
      ],
      "view": "side",
      "facing": "right",
      "description": "StechmÃ¼ckenlarve, hÃ¤ngt schrÃ¤g kopfÃ¼ber, Atemrohr oben an der WasseroberflÃ¤che",
      "note": "Anchor = Spitze des Atemrohrs (an die Wasserlinie setzen)"
    },
    {
      "id": "mosquito_larva_top",
      "type": "sprite",
      "path": "assets/sprites/mosquito_larva_top.webp",
      "width": 256,
      "height": 62,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "top",
      "facing": "right",
      "description": "StechmÃ¼ckenlarve, Draufsicht"
    },
    {
      "id": "spawn_fresh_side",
      "type": "sprite",
      "path": "assets/sprites/spawn_fresh_side.webp",
      "width": 314,
      "height": 201,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "side34",
      "facing": "right",
      "description": "Grasfrosch-Laichballen (Klumpen, GallerthÃ¼llen mit dunklen Eiern), frisch; schwimmend, SchrÃ¤gansicht von oben (3/4). Glas-Transparenz: Hintergrund scheint durch"
    },
    {
      "id": "spawn_fresh_top",
      "type": "sprite",
      "path": "assets/sprites/spawn_fresh_top.webp",
      "width": 314,
      "height": 262,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "top",
      "facing": "right",
      "description": "Grasfrosch-Laichballen frisch, Draufsicht"
    },
    {
      "id": "spawn_late_side",
      "type": "sprite",
      "path": "assets/sprites/spawn_late_side.webp",
      "width": 316,
      "height": 201,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "side34",
      "facing": "right",
      "description": "Laichballen kurz vor dem SchlÃ¼pfen (Embryonen lÃ¤nglich), 3/4-Ansicht"
    },
    {
      "id": "spawn_late_top",
      "type": "sprite",
      "path": "assets/sprites/spawn_late_top.webp",
      "width": 316,
      "height": 265,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "top",
      "facing": "right",
      "description": "Laichballen kurz vor dem SchlÃ¼pfen, Draufsicht"
    },
    {
      "id": "tadpole_four_side",
      "type": "sprite",
      "path": "assets/sprites/tadpole_four_side.webp",
      "width": 264,
      "height": 80,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "side34",
      "facing": "right",
      "description": "Kaulquappe mit vier Beinen und Schwanz (olivbraun, kurz vor dem Landgang) - Seitenansicht leicht von oben (3/4), Hauptszene",
      "legacy": true,
      "replacedBy": "characters.tadpole.sprites.four_side"
    },
    {
      "id": "tadpole_four_top",
      "type": "sprite",
      "path": "assets/sprites/tadpole_four_top.webp",
      "width": 264,
      "height": 91,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "top",
      "facing": "right",
      "description": "Kaulquappe mit vier Beinen und Schwanz (olivbraun, kurz vor dem Landgang) - Draufsicht, Kaulquappen-Minispiel",
      "legacy": true,
      "replacedBy": "characters.tadpole.sprites.four_top"
    },
    {
      "id": "tadpole_large_side",
      "type": "sprite",
      "path": "assets/sprites/tadpole_large_side.webp",
      "width": 256,
      "height": 66,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "side34",
      "facing": "right",
      "description": "Kaulquappe, groÃŸ (dunkelbraun mit goldenen Sprenkeln, Flossensaum) - Seitenansicht leicht von oben (3/4), Hauptszene",
      "legacy": true,
      "replacedBy": "characters.tadpole.sprites.large_side"
    },
    {
      "id": "tadpole_large_top",
      "type": "sprite",
      "path": "assets/sprites/tadpole_large_top.webp",
      "width": 256,
      "height": 78,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "top",
      "facing": "right",
      "description": "Kaulquappe, groÃŸ (dunkelbraun mit goldenen Sprenkeln, Flossensaum) - Draufsicht, Kaulquappen-Minispiel",
      "legacy": true,
      "replacedBy": "characters.tadpole.sprites.large_top"
    },
    {
      "id": "tadpole_legs_side",
      "type": "sprite",
      "path": "assets/sprites/tadpole_legs_side.webp",
      "width": 256,
      "height": 66,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "side34",
      "facing": "right",
      "description": "Kaulquappe mit Hinterbeinen - Seitenansicht leicht von oben (3/4), Hauptszene",
      "legacy": true,
      "replacedBy": "characters.tadpole.sprites.legs_side"
    },
    {
      "id": "tadpole_legs_top",
      "type": "sprite",
      "path": "assets/sprites/tadpole_legs_top.webp",
      "width": 256,
      "height": 78,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "top",
      "facing": "right",
      "description": "Kaulquappe mit Hinterbeinen - Draufsicht, Kaulquappen-Minispiel",
      "legacy": true,
      "replacedBy": "characters.tadpole.sprites.legs_top"
    },
    {
      "id": "tadpole_small_side",
      "type": "sprite",
      "path": "assets/sprites/tadpole_small_side.webp",
      "width": 250,
      "height": 59,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "side34",
      "facing": "right",
      "description": "Kaulquappe, frisch geschlÃ¼pft (klein, schlank, ohne Sprenkel) - Seitenansicht leicht von oben (3/4), Hauptszene",
      "legacy": true,
      "replacedBy": "characters.tadpole.sprites.small_side"
    },
    {
      "id": "tadpole_small_top",
      "type": "sprite",
      "path": "assets/sprites/tadpole_small_top.webp",
      "width": 250,
      "height": 64,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "top",
      "facing": "right",
      "description": "Kaulquappe, frisch geschlÃ¼pft (klein, schlank, ohne Sprenkel) - Draufsicht, Kaulquappen-Minispiel",
      "legacy": true,
      "replacedBy": "characters.tadpole.sprites.small_top"
    },
    {
      "id": "water_strider_side",
      "type": "sprite",
      "path": "assets/sprites/water_strider_side.webp",
      "width": 268,
      "height": 114,
      "anchor": [
        0.5,
        0.97
      ],
      "view": "side",
      "facing": "right",
      "description": "WasserlÃ¤ufer, Seitenansicht, steht auf der WasseroberflÃ¤che (FuÃŸspitzen = Wasserlinie)"
    },
    {
      "id": "water_strider_top",
      "type": "sprite",
      "path": "assets/sprites/water_strider_top.webp",
      "width": 268,
      "height": 389,
      "anchor": [
        0.5,
        0.5
      ],
      "view": "top",
      "facing": "right",
      "description": "WasserlÃ¤ufer, Draufsicht (lange Mittel- und Hinterbeine)"
    }
  ],
  "updated": "2026-10-27T15:18:12",
  "pending": [],
  "characters": {
    "frog": {
      "label": "Grasfrosch (Rana temporaria), adult",
      "animation": "jump: rig (sit/crouch/push-off/touch-down) + painted poses jump/land in the flight phase; see tests/rig.html",
      "master": "assets/chars/frog/master.webp",
      "units": "px of the exported images (2x retina)",
      "facing": "right",
      "rotation": "radians, positive = clockwise (canvas)",
      "parts": {
        "body": {
          "path": "assets/chars/frog/body.webp",
          "width": 569,
          "height": 348,
          "pivot": [
            80.0,
            192.5
          ],
          "parent": null,
          "z": 0,
          "note": "Rumpf+Kopf ohne Beine; pivot = HÃ¼ftgelenk = Wurzel des Rigs"
        },
        "hind_folded": {
          "path": "assets/chars/frog/hind_folded.webp",
          "width": 462,
          "height": 208,
          "pivot": [
            95.0,
            45.0
          ],
          "parent": "body",
          "joint": [
            70.0,
            200.0
          ],
          "z": 2
        },
        "hind_folded_far": {
          "path": "assets/chars/frog/hind_folded_far.webp",
          "width": 462,
          "height": 208,
          "pivot": [
            95.0,
            45.0
          ],
          "parent": "body",
          "joint": [
            57.0,
            193.0
          ],
          "z": -2,
          "note": "abgewandtes Bein (dunkler, hinter dem KÃ¶rper)"
        },
        "hind_extended": {
          "path": "assets/chars/frog/hind_extended.webp",
          "width": 533,
          "height": 128,
          "pivot": [
            496.0,
            48.0
          ],
          "parent": "body",
          "joint": [
            80.0,
            192.5
          ],
          "z": 2
        },
        "hind_extended_far": {
          "path": "assets/chars/frog/hind_extended_far.webp",
          "width": 533,
          "height": 128,
          "pivot": [
            496.0,
            48.0
          ],
          "parent": "body",
          "joint": [
            67.0,
            185.5
          ],
          "z": -2,
          "note": "abgewandtes Bein (dunkler, hinter dem KÃ¶rper)"
        },
        "front_leg": {
          "path": "assets/chars/frog/front_leg.webp",
          "width": 178,
          "height": 191,
          "pivot": [
            41.2,
            20.0
          ],
          "parent": "body",
          "joint": [
            315.0,
            182.5
          ],
          "z": 3
        },
        "front_leg_far": {
          "path": "assets/chars/frog/front_leg_far.webp",
          "width": 178,
          "height": 191,
          "pivot": [
            41.2,
            20.0
          ],
          "parent": "body",
          "joint": [
            302.0,
            175.5
          ],
          "z": -3,
          "note": "abgewandtes Bein (dunkler, hinter dem KÃ¶rper)"
        },
        "eyelid": {
          "path": "assets/chars/frog/eyelid.webp",
          "width": 74,
          "height": 74,
          "pivot": [
            37.0,
            37.0
          ],
          "parent": "body",
          "joint": [
            447.5,
            52.5
          ],
          "z": 4,
          "note": "geschlossenes Lid; zum Blinzeln von oben her einblenden (Clip-Rechteck), 120-180 ms"
        }
      },
      "poses": {
        "master": {
          "path": "assets/chars/frog/master.webp",
          "width": 604,
          "height": 346,
          "note": "Ganzkörper-Pose (Fallback / Flugphase), gleicher Maßstab wie das Rig"
        },
        "crouch": {
          "path": "assets/chars/frog/pose_crouch.webp",
          "width": 606,
          "height": 313,
          "note": "Ganzkörper-Pose (Fallback / Flugphase), gleicher Maßstab wie das Rig"
        },
        "jump": {
          "path": "assets/chars/frog/pose_jump.webp",
          "width": 961,
          "height": 624,
          "note": "Ganzkörper-Pose (Fallback / Flugphase), gleicher Maßstab wie das Rig; pivot = Hüfte, an die Rig-Wurzel setzen; tiltDeg = Eigenneigung der Körperachse",
          "pivot": [
            425.0,
            331.5
          ],
          "tiltDeg": -27
        },
        "land": {
          "path": "assets/chars/frog/pose_land.webp",
          "width": 749,
          "height": 352,
          "note": "Ganzkörper-Pose (Fallback / Flugphase), gleicher Maßstab wie das Rig; pivot = Hüfte, an die Rig-Wurzel setzen; tiltDeg = Eigenneigung der Körperachse",
          "pivot": [
            150.1,
            221.2
          ],
          "tiltDeg": -7
        }
      },
      "masterOffset": [
        -38.0,
        -3.5
      ]
    },
    "toad": {
      "label": "Erdkröte (Bufo bufo), adult",
      "animation": "Kröten krabbeln statt springen: walk_a -> walk_b -> walk_c -> walk_b (je ca. 180 ms) mit langsamer Vorwärtsbewegung; Rig-Teile für kleine Bewegungen (Atmen, Bein heben, Blinzeln)",
      "master": "assets/chars/toad/master.webp",
      "units": "px of the exported images (2x retina)",
      "facing": "right",
      "rotation": "radians, positive = clockwise (canvas)",
      "parts": {
        "body": {
          "path": "assets/chars/toad/body.webp",
          "width": 549,
          "height": 340,
          "pivot": [
            100.5,
            201.5
          ],
          "parent": null,
          "z": 0,
          "note": "Rumpf+Kopf ohne Beine; pivot = HÃ¼ftgelenk = Wurzel des Rigs"
        },
        "hind_leg": {
          "path": "assets/chars/toad/hind_leg.webp",
          "width": 318,
          "height": 222,
          "pivot": [
            97.1,
            33.2
          ],
          "parent": "body",
          "joint": [
            100.5,
            201.5
          ],
          "z": 2
        },
        "hind_leg_far": {
          "path": "assets/chars/toad/hind_leg_far.webp",
          "width": 318,
          "height": 222,
          "pivot": [
            97.1,
            33.2
          ],
          "parent": "body",
          "joint": [
            89.5,
            195.5
          ],
          "z": -2,
          "note": "abgewandtes Bein (dunkler, hinter dem KÃ¶rper)"
        },
        "front_leg": {
          "path": "assets/chars/toad/front_leg.webp",
          "width": 260,
          "height": 276,
          "pivot": [
            124.5,
            45.6
          ],
          "parent": "body",
          "joint": [
            310.5,
            181.5
          ],
          "z": 3
        },
        "front_leg_far": {
          "path": "assets/chars/toad/front_leg_far.webp",
          "width": 260,
          "height": 276,
          "pivot": [
            124.5,
            45.6
          ],
          "parent": "body",
          "joint": [
            299.5,
            175.5
          ],
          "z": -3,
          "note": "abgewandtes Bein (dunkler, hinter dem KÃ¶rper)"
        },
        "eyelid": {
          "path": "assets/chars/toad/eyelid.webp",
          "width": 62,
          "height": 62,
          "pivot": [
            31.0,
            31.0
          ],
          "parent": "body",
          "joint": [
            453.0,
            56.5
          ],
          "z": 4,
          "note": "geschlossenes Lid; zum Blinzeln von oben her einblenden (Clip-Rechteck), 120-180 ms"
        }
      },
      "poses": {
        "master": {
          "path": "assets/chars/toad/master.webp",
          "width": 576,
          "height": 354,
          "note": "Ganzkörper-Pose (Fallback / Flugphase), gleicher Maßstab wie das Rig"
        },
        "walk_a": {
          "path": "assets/chars/toad/walk_a.webp",
          "width": 620,
          "height": 350,
          "note": "Ganzkörper-Pose (Fallback / Flugphase), gleicher Maßstab wie das Rig"
        },
        "walk_b": {
          "path": "assets/chars/toad/walk_b.webp",
          "width": 588,
          "height": 338,
          "note": "Ganzkörper-Pose (Fallback / Flugphase), gleicher Maßstab wie das Rig"
        },
        "walk_c": {
          "path": "assets/chars/toad/walk_c.webp",
          "width": 633,
          "height": 340,
          "note": "Ganzkörper-Pose (Fallback / Flugphase), gleicher Maßstab wie das Rig"
        }
      },
      "masterOffset": [
        -27.5,
        3.0
      ]
    },
    "froglet": {
      "label": "Jungfrosch (Grasfrosch)",
      "units": "px (2x retina)",
      "facing": "right (Draufsicht: Kopf nach rechts)",
      "sprites": {
        "side": {
          "path": "assets/chars/froglet/side.webp",
          "width": 290,
          "height": 163,
          "anchor": [
            0.5,
            0.97
          ],
          "description": "Jungfrosch (Fröschlein) mit Schwanzstummel, Seitenansicht"
        },
        "top": {
          "path": "assets/chars/froglet/top.webp",
          "width": 300,
          "height": 220,
          "anchor": [
            0.5,
            0.5
          ],
          "description": "Jungfrosch mit Schwanzstummel, Draufsicht (Kopf nach rechts), schwimmend"
        }
      }
    },
    "tadpole": {
      "label": "Kaulquappen (Grasfrosch), 4 Stadien",
      "units": "px (2x retina)",
      "facing": "right (Draufsicht: Kopf nach rechts)",
      "sprites": {
        "small_side": {
          "path": "assets/chars/tadpole/small_side.webp",
          "width": 300,
          "height": 76,
          "anchor": [
            0.5,
            0.5
          ],
          "description": "Kaulquappe klein (frisch geschlüpft), Seitenansicht",
          "rig": {
            "body": {
              "path": "assets/chars/tadpole/small_side_body.webp",
              "z": 1
            },
            "tail": {
              "path": "assets/chars/tadpole/small_side_tail.webp",
              "z": 0,
              "pivot": [
                141,
                41.3
              ],
              "joint": [
                141,
                41.3
              ]
            },
            "note": "Body und Tail haben dieselbe Bildgröße wie das Gesamtbild (übereinander zeichnen). Schwanz-Wackeln: Tail in senkrechten Streifen zeichnen und jeden Streifen um A*sin(phase - k*dist)*(dist/len)^1.3 versetzen (dist = Abstand zum Pivot nach links); Body liegt darüber und verdeckt die Naht."
          }
        },
        "small_top": {
          "path": "assets/chars/tadpole/small_top.webp",
          "width": 300,
          "height": 78,
          "anchor": [
            0.5,
            0.5
          ],
          "description": "Kaulquappe klein, Draufsicht",
          "rig": {
            "body": {
              "path": "assets/chars/tadpole/small_top_body.webp",
              "z": 1
            },
            "tail": {
              "path": "assets/chars/tadpole/small_top_tail.webp",
              "z": 0,
              "pivot": [
                141,
                34.3
              ],
              "joint": [
                141,
                34.3
              ]
            },
            "note": "Body und Tail haben dieselbe Bildgröße wie das Gesamtbild (übereinander zeichnen). Schwanz-Wackeln: Tail in senkrechten Streifen zeichnen und jeden Streifen um A*sin(phase - k*dist)*(dist/len)^1.3 versetzen (dist = Abstand zum Pivot nach links); Body liegt darüber und verdeckt die Naht."
          }
        },
        "large_side": {
          "path": "assets/chars/tadpole/large_side.webp",
          "width": 520,
          "height": 135,
          "anchor": [
            0.5,
            0.5
          ],
          "description": "Kaulquappe groß, Seitenansicht",
          "rig": {
            "body": {
              "path": "assets/chars/tadpole/large_side_body.webp",
              "z": 1
            },
            "tail": {
              "path": "assets/chars/tadpole/large_side_tail.webp",
              "z": 0,
              "pivot": [
                254,
                65.7
              ],
              "joint": [
                254,
                65.7
              ]
            },
            "note": "Body und Tail haben dieselbe Bildgröße wie das Gesamtbild (übereinander zeichnen). Schwanz-Wackeln: Tail in senkrechten Streifen zeichnen und jeden Streifen um A*sin(phase - k*dist)*(dist/len)^1.3 versetzen (dist = Abstand zum Pivot nach links); Body liegt darüber und verdeckt die Naht."
          }
        },
        "large_top": {
          "path": "assets/chars/tadpole/large_top.webp",
          "width": 520,
          "height": 167,
          "anchor": [
            0.5,
            0.5
          ],
          "description": "Kaulquappe groß, Draufsicht",
          "rig": {
            "body": {
              "path": "assets/chars/tadpole/large_top_body.webp",
              "z": 1
            },
            "tail": {
              "path": "assets/chars/tadpole/large_top_tail.webp",
              "z": 0,
              "pivot": [
                254,
                82.1
              ],
              "joint": [
                254,
                82.1
              ]
            },
            "note": "Body und Tail haben dieselbe Bildgröße wie das Gesamtbild (übereinander zeichnen). Schwanz-Wackeln: Tail in senkrechten Streifen zeichnen und jeden Streifen um A*sin(phase - k*dist)*(dist/len)^1.3 versetzen (dist = Abstand zum Pivot nach links); Body liegt darüber und verdeckt die Naht."
          }
        },
        "legs_side": {
          "path": "assets/chars/tadpole/legs_side.webp",
          "width": 540,
          "height": 154,
          "anchor": [
            0.5,
            0.5
          ],
          "description": "Kaulquappe mit Hinterbeinen, Seitenansicht",
          "rig": {
            "body": {
              "path": "assets/chars/tadpole/legs_side_body.webp",
              "z": 1
            },
            "tail": {
              "path": "assets/chars/tadpole/legs_side_tail.webp",
              "z": 0,
              "pivot": [
                270,
                78.8
              ],
              "joint": [
                270,
                78.8
              ]
            },
            "note": "Body und Tail haben dieselbe Bildgröße wie das Gesamtbild (übereinander zeichnen). Schwanz-Wackeln: Tail in senkrechten Streifen zeichnen und jeden Streifen um A*sin(phase - k*dist)*(dist/len)^1.3 versetzen (dist = Abstand zum Pivot nach links); Body liegt darüber und verdeckt die Naht."
          }
        },
        "legs_top": {
          "path": "assets/chars/tadpole/legs_top.webp",
          "width": 540,
          "height": 146,
          "anchor": [
            0.5,
            0.5
          ],
          "description": "Kaulquappe mit Hinterbeinen, Draufsicht",
          "rig": {
            "body": {
              "path": "assets/chars/tadpole/legs_top_body.webp",
              "z": 1
            },
            "tail": {
              "path": "assets/chars/tadpole/legs_top_tail.webp",
              "z": 0,
              "pivot": [
                270,
                75.6
              ],
              "joint": [
                270,
                75.6
              ]
            },
            "note": "Body und Tail haben dieselbe Bildgröße wie das Gesamtbild (übereinander zeichnen). Schwanz-Wackeln: Tail in senkrechten Streifen zeichnen und jeden Streifen um A*sin(phase - k*dist)*(dist/len)^1.3 versetzen (dist = Abstand zum Pivot nach links); Body liegt darüber und verdeckt die Naht."
          }
        },
        "four_side": {
          "path": "assets/chars/tadpole/four_side.webp",
          "width": 520,
          "height": 138,
          "anchor": [
            0.5,
            0.5
          ],
          "description": "Kaulquappe mit vier Beinen und Schwanz, Seitenansicht",
          "rig": {
            "body": {
              "path": "assets/chars/tadpole/four_side_body.webp",
              "z": 1
            },
            "tail": {
              "path": "assets/chars/tadpole/four_side_tail.webp",
              "z": 0,
              "pivot": [
                260,
                77.8
              ],
              "joint": [
                260,
                77.8
              ]
            },
            "note": "Body und Tail haben dieselbe Bildgröße wie das Gesamtbild (übereinander zeichnen). Schwanz-Wackeln: Tail in senkrechten Streifen zeichnen und jeden Streifen um A*sin(phase - k*dist)*(dist/len)^1.3 versetzen (dist = Abstand zum Pivot nach links); Body liegt darüber und verdeckt die Naht."
          }
        },
        "four_top": {
          "path": "assets/chars/tadpole/four_top.webp",
          "width": 520,
          "height": 195,
          "anchor": [
            0.5,
            0.5
          ],
          "description": "Kaulquappe mit vier Beinen und Schwanz, Draufsicht",
          "rig": {
            "body": {
              "path": "assets/chars/tadpole/four_top_body.webp",
              "z": 1
            },
            "tail": {
              "path": "assets/chars/tadpole/four_top_tail.webp",
              "z": 0,
              "pivot": [
                260,
                98.6
              ],
              "joint": [
                260,
                98.6
              ]
            },
            "note": "Body und Tail haben dieselbe Bildgröße wie das Gesamtbild (übereinander zeichnen). Schwanz-Wackeln: Tail in senkrechten Streifen zeichnen und jeden Streifen um A*sin(phase - k*dist)*(dist/len)^1.3 versetzen (dist = Abstand zum Pivot nach links); Body liegt darüber und verdeckt die Naht."
          }
        },
        "gills_side": {
          "path": "assets/chars/tadpole/gills_side.webp",
          "width": 300,
          "height": 68,
          "anchor": [
            0.5,
            0.5
          ],
          "description": "Kaulquappe frisch geschlüpft mit Außenkiemen, Seitenansicht (Thomas 8.11.: saubere realistische Zeichnung)"
        },
        "gills_top": {
          "path": "assets/chars/tadpole/gills_top.webp",
          "width": 300,
          "height": 65,
          "anchor": [
            0.5,
            0.5
          ],
          "description": "Kaulquappe frisch geschlüpft mit Außenkiemen, Draufsicht"
        }
      }
    }
  },
  "characters_notes": "characters.*: gemalte Ausschnitt-Figuren (OpenAI gpt-image-1.5, transparenter Hintergrund; Master + per Bild-Edit erzeugte Teile, Farben per Lab-Statistik an den Master angeglichen, Körper/Lid auf den Master registriert). Koordinaten in px der exportierten Bilder (2x Retina). Rig: body.pivot = Hüfte = Wurzel; jedes Teil: pivot (eigenes Bild) wird auf joint (Körperbild-Koordinaten) gesetzt, dann um Gelenkwinkel gedreht; z < 0 hinter dem Körper (abgewandte Beine *_far), z > 0 davor. Frosch-Sprung: Rig für Sitzen/Ducken/Absprung/Aufsetzen, in der Flugphase Überblendung auf poses.jump / poses.land (pivot = Hüfte, tiltDeg = Eigenneigung). Referenz-Implementierung: tests/rig.html. Ältere Blender-Sprites für Frosch/Kaulquappen sind mit legacy=true markiert."
}
