{"asset_map": {"cake_tier_bottom": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/cake_tier_bottom_d750c60c-1bd9-426d-8bb3-a676d80e5857.webp", "type": "image", "prompt": "Modify the cake tier in image 1 to completely remove all shadows. Ensure there are no contact shadows underneath, no drop shadows, and no internal shading gradients. Maintain the exact same round shape, size, and isometric front-right perspective. The lighting should be clean and flat. Keep the original cake texture and color, but ensure the final result is a clean game asset on a transparent background with zero shadow elements.", "description": "A shadowless version of the large bottom cake tier in isometric perspective.", "subtype": "object", "aspect_ratio": [1023, 876], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "cake_tier_middle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/cake_tier_middle_b423ac06-3b49-4ca9-9ea0-b5c45e404703.webp", "type": "image", "prompt": "Modify the middle cake tier from image 1 to completely remove all shadows. Ensure there are no drop shadows, contact shadows, or internal shading on the cake itself. Maintain the same front-right isometric perspective and round shape. Use clean, flat, bright lighting while preserving the cake's base texture. The final asset must have a transparent background and no shadow elements at all, matching the style of a clean game UI element.", "description": "A medium round cake tier with flat lighting and no shadows, viewed from a front-right isometric angle.", "subtype": "object", "aspect_ratio": [931, 876], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "cake_tier_top": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/ef54e7f5-ffce-447f-9591-b8afce48d453.webp", "type": "image", "prompt": "Generate a small round cake tier, the top layer, unfrosted with a light golden-brown cake texture and visible layers. It should be viewed from a slight isometric angle (front-right view) in a bright, cheerful cartoon style with soft outlines and a soft shadow underneath. Approximately 200px wide. Transparent background. Professional game asset.", "description": "A small round cake tier (top layer) viewed from the same isometric angle as the other tiers.", "subtype": "object", "aspect_ratio": [832, 738], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_white": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_white_30b5478e-d2ef-414a-a85d-b735154bc9da.webp", "type": "image", "prompt": "Generate a high-quality white frosting texture overlay for a round cake tier in an isometric perspective. The texture should look like fresh, powdery winter snow with subtle sparkles and delicate translucent ice crystals. Incorporate gentle, embossed snowflake patterns across the surface. Use soft blue and grey shading to define the 3D isometric round shape while maintaining a clean, bright white appearance. Transparent background, game-ready asset, winter wonderland aesthetic.", "description": "A winter-themed white snowy frosting texture overlay for an isometric cake tier.", "subtype": "other", "aspect_ratio": [1024, 967], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_chocolate": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_chocolate_95d88ecc-9d54-4630-9868-04d7943d3ee4.webp", "type": "image", "prompt": "Generate a high-quality chocolate frosting texture overlay for a round cake tier in isometric perspective. The frosting should be a rich, deep chocolate brown with a velvety smooth texture and a slight glossy shine. Incorporate tiny golden sparkles scattered throughout and a subtle magical glow around the edges. Feature creamy swirls and peaks in a whimsical, enchanted fantasy kawaii style. Ensure the lighting is soft and magical, matching a fairytale aesthetic. Transparent background, game-ready asset.", "description": "A magical fantasy-themed chocolate frosting texture overlay for an isometric cake tier.", "subtype": "other", "aspect_ratio": [1024, 988], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_pink": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_pink_f50b60cf-bc89-4f8a-8196-cf3486fcdb8a.webp", "type": "image", "prompt": "Generate a high-quality isometric texture overlay of pink coral frosting for a round cake tier. The design should feature a soft pink coral base (#FFB6D9) with an intricate pattern of delicate, flowing coral branches, scattered white pearl dots, and tiny decorative seashells. The texture must be designed for a front-right isometric perspective to wrap naturally around a curved cylindrical surface. Maintain a romantic mermaid aesthetic with soft gradients and a sweet, enchanting feel. Use flat lighting with no shadows, clean vector-like polish, and ensure a transparent background.", "description": "A romantic pink coral-themed frosting texture overlay with delicate branch patterns and pearl dots for an isometric cake tier.", "subtype": "other", "aspect_ratio": [994, 896], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_blue": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_blue_dac152b6-c663-43fc-b6ff-600ae66e83d0.webp", "type": "image", "prompt": "Generate a high-quality game asset of a bright sky blue frozen icing texture overlay for a round cake tier. The asset must be in an isometric perspective to fit a 3D-style cake. The style is a magical winter wonderland with a vivid sky blue color (#87CEEB to #6BB6FF). Features include delicate white frost crystals and subtle snowflake patterns scattered across the surface, with silver sparkle highlights and gentle frost buildup along the edges. The look should be fresh, clean, and icy like a clear winter sky. Transparent background, professional digital art style, clean edges.", "description": "A vibrant sky blue frozen icing texture overlay for an isometric cake tier with static frost patterns.", "subtype": "other", "aspect_ratio": [931, 884], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_green": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_green_36a19652-c6ed-4363-8082-23af2ba6e7b7.webp", "type": "image", "prompt": "Generate a high-quality, isometric perspective mint green frosting texture overlay for a round cake tier. The style is enchanted forest fantasy and kawaii, featuring smooth creamy swirls and soft peaks. Add tiny leaf-shaped sparkles and a gentle magical glow throughout the texture. The aesthetic should be whimsical with a subtle magical sheen, matching the existing fantasy cake assets. Transparent background, game-ready asset, high resolution.", "description": "A mint green fantasy-themed frosting texture overlay for a round cake tier in isometric perspective.", "subtype": "other", "aspect_ratio": [1024, 977], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_yellow": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_yellow_0e637ed5-0cbe-43a5-8e26-3351b6cbda4a.webp", "type": "image", "prompt": "Generate a high-quality yellow frosting texture overlay for a round cake tier in isometric perspective. The style is fantasy kawaii with a bright, cheerful golden-sunlight yellow color. Incorporate subtle shimmering tiny star sparkles and light sunburst patterns within the smooth, buttery swirls. The frosting should have a warm, radiant magical glow, appearing whimsical and enchanted. Ensure it matches the isometric angle of 'cake_tier_middle' and 'cake_tier_bottom', with a clean transparent background and no shadows.", "description": "A magical golden-yellow frosting texture overlay with star sparkles and a sunburst pattern for a round cake tier.", "subtype": "other", "aspect_ratio": [1024, 970], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_candle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_candle_06dc7db1-33fb-4652-b99a-41acee954a16.webp", "type": "image", "prompt": "Generate a high-quality isometric birthday candle cake topper for a winter wonderland theme. The candle is a classic cylindrical shape with a gentle taper, colored in pearlescent winter white. Decorate the wax with small embossed silver snowflake patterns and a light dusting of frost. The candle sits in an icy blue base with snowflake details. At the top, a warm, glowing yellow flame. Use a cute cartoonish style with thick clean outlines and no background. Transform the previous crystal version into this elegant winter holiday design while maintaining the same isometric perspective.", "description": "A winter-themed holiday birthday candle cake topper with snowflake patterns and a warm glow.", "subtype": "object", "aspect_ratio": [576, 1186], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_flower": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_flower_21c2089d-7cc0-4750-944f-f002088991f7.webp", "type": "image", "prompt": "Transform the flower in image 1 into a highly stylized, cute cartoon game asset. Add thick black outlines around the petals and center. Make the petals perfectly round and simplified. Use bright, saturated vibrant colors. Add a tiny, cute smiling face in the center with simple black dot eyes and a curved mouth. Maintain the isometric perspective and front-right viewing angle to match the cake tiers. Ensure a clean, polished, sticker-like appearance with a transparent background.", "description": "A cute cartoonish flower decoration with thick outlines and a cheerful face for cake topping.", "subtype": "object", "aspect_ratio": [881, 889], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_sprinkles": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_sprinkles_6c4b08a5-e873-4bf4-9461-a8029b73a433.webp", "type": "image", "prompt": "Generate a cluster of winter holiday cake sprinkles and toppings. Include a mix of small white snowflakes, tiny translucent ice crystals, silver drag\u00e9es, pearl sprinkles, and small red-and-white candy cane pieces. Use a cool winter color palette of white, light blue, silver, and mint green. High-quality cartoonish style with thick outlines and glossy, frosted textures. No faces, no characters, no magical glow. Isometric perspective, front-view, transparent background, game-ready asset.", "description": "A cluster of winter-themed holiday sprinkles including snowflakes and candy cane bits for cake decoration.", "subtype": "object", "aspect_ratio": [969, 737], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_strawberry": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_strawberry_20b34404-63b7-478e-8eec-d19905c99c30.webp", "type": "image", "prompt": "Generate a full-body, front-view magical strawberry cake topper in a cute chibi fantasy style. The strawberry has a kawaii face with sweet large eyes and a happy smile. Add magical elements like glowing seeds, a soft shimmering aura, and enchanted sparkles surrounding it. Use vibrant red for the fruit with soft pastel accents on the leaves. Thick clean outlines, glossy finish, high resolution, professional game asset. Match the cute aesthetic of a fantasy meadow theme. Transparent background, isometric perspective to match cake tiers.", "description": "A magical fantasy chibi-styled strawberry cake topper with a kawaii face and glowing sparkles.", "subtype": "object", "aspect_ratio": [580, 867], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_star": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_star_5c3a34bb-5ba5-4639-a749-b88a37a5ea27.webp", "type": "image", "prompt": "Generate a high-quality isometric cake topper of a five-pointed holiday star. The star has a beautiful icy, crystalline appearance with a sparkling snow and frost texture on its surface. Use a cool winter color palette of whites, light blues, and silvers. Include small, delicate snowflake patterns and ice crystal details on the star. The edges should have a soft, magical cool blue and white glow. Designed in a cute, whimsical cartoon style with thick outlines and a glossy icy finish. No faces. Transparent background, front-right isometric perspective to match a cake decoration.", "description": "A festive winter holiday star cake topper with an icy crystalline texture and glowing edges.", "subtype": "object", "aspect_ratio": [830, 1126], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_heart": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_heart_4094374a-8a71-4c44-9c67-8a4b0d1f536e.webp", "type": "image", "prompt": "Generate a high-quality isometric cake topper of a heart made of translucent blue ice and snow. The heart should have frosted white edges with a light dusting of snow and small crystalline snowflake details embedded within. Use a cute cartoonish style with thick outlines and a glossy icy finish. The color palette should feature cool winter tones like icy blue, silver, and white with a soft magical glow. Remove any faces or crowns. Perspective: front-right isometric. Background: transparent.", "description": "An icy winter-themed heart cake topper with frosted edges and snowflake details", "subtype": "object", "aspect_ratio": [671, 906], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_chocolate_chip": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_chocolate_chip_2adc9bf7-ddfc-4975-bc88-6585148f3148.webp", "type": "image", "prompt": "Transform the chocolate chip in image 1 into a cute, cartoonish game asset. Add thick black outlines, make the shape rounder and more simplified, and use a rich chocolate brown color. Add exaggerated glossy highlights to make it look like a tasty candy topping. Maintain the isometric perspective to match the cake tiers and ensure a clean, polished look. High resolution, professional vector-style game art, transparent background.", "description": "A cute, cartoonish chocolate chip cake decoration with thick outlines and a glossy finish.", "subtype": "object", "aspect_ratio": [989, 847], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_cherry": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_cherry_e6f2935f-fea3-417b-bafd-c6ded257a676.webp", "type": "image", "prompt": "Transform the cherry in image into a stylized cartoon version. Add thick black outlines, make the shape rounder and more simplified, and use a bright, highly saturated red color. Simplify the green stem into a smooth curve. Add a prominent white glossy highlight to make it look shiny and appetizing. Maintain the isometric perspective and ensure it has a transparent background. Professional clean game asset style.", "description": "A cartoonish, bright red maraschino cherry with a glossy highlight and thick outlines for cake decoration.", "subtype": "object", "aspect_ratio": [820, 1248], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "background_party": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_party_cd74aa82-d7cd-48a5-8261-0c1a189fa4e8.webp", "type": "image", "prompt": "Generate a 9:16 tall portrait-oriented mystical underwater ocean background. The composition features a smooth vertical gradient from deep navy-blue at the bottom to light turquoise-blue at the top, with a golden-beige sandy floor at the bottom 15%. Include 4-5 diagonal volumetric 'god rays' streaming from the surface and bioluminescent particles throughout. On the left and right sides, place silhouetted coral and swaying kelp, keeping the center 60% width completely clear for cake placement. Use a soft painterly, dreamy fantasy illustration style with a palette of deep ocean blues, magical aquas, and subtle mystical purple glows. High resolution, professional quality, no transparency, atmospheric and peaceful mood.", "description": "A mystical, ethereal underwater ocean background for a mermaid-themed cake decorating game with a clear center for gameplay.", "subtype": "background", "aspect_ratio": [1024, 1536], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "ui_button_undo": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/2e6a757f-de5b-4156-90aa-e64109ac4a11.webp", "type": "image", "prompt": "Generate a rounded rectangular UI button with a bright blue background and a clear white curved arrow icon pointing left (undo symbol). Use a cheerful cartoon style with soft shadows. Approximately 100x80 pixels. Transparent background around the button shape. Professional game asset.", "description": "A rounded rectangular button with a curved arrow pointing left (undo symbol).", "subtype": "ui", "aspect_ratio": [868, 676], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "ui_button_clear": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/14a19bc5-71b8-4df1-8c11-eaaf5bed8cec.webp", "type": "image", "prompt": "Generate a rounded rectangular UI button with a bright red background and a clear white X or trash can icon. Use a cheerful cartoon style with soft shadows, matching the style of `ui_button_undo`. Approximately 100x80 pixels. Transparent background around the button shape. Professional game asset.", "description": "A rounded rectangular button with an X or trash can icon.", "subtype": "ui", "aspect_ratio": [842, 714], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "ui_button_done": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/db136fed-f3a2-4256-b5db-81b693eea88e.webp", "type": "image", "prompt": "Generate a large rounded rectangular UI button with a bright green background and a clear white checkmark icon. Use a cheerful cartoon style with soft shadows, matching the style of other UI buttons like `ui_button_undo`. Approximately 200x80 pixels. Transparent background around the button shape. Professional game asset.", "description": "A large rounded rectangular button with a checkmark icon.", "subtype": "ui", "aspect_ratio": [973, 659], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "ui_star_empty": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/0c1cdeab-28f3-4191-b14c-3cc3b945b60f.webp", "type": "image", "prompt": "Generate an outline of a five-pointed star for a rating display. It should have a gray outline and a hollow center. Use a cheerful cartoon style with soft lines. Approximately 80px in diameter. Transparent background. Professional game asset.", "description": "An outline of a five-pointed star for rating display.", "subtype": "ui", "aspect_ratio": [873, 850], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "ui_star_filled": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/a9d648d3-c9cc-4e1f-9c22-f62bccd8e68e.webp", "type": "image", "prompt": "Generate a filled five-pointed star for a rating display. It should be bright golden yellow with a sparkle effect, matching the size and style of `ui_star_empty`. Approximately 80px in diameter. Transparent background. Professional game asset.", "description": "A filled five-pointed star for rating display.", "subtype": "ui", "aspect_ratio": [787, 746], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "ui_timer_bar_bg": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/875cca85-8e00-40c2-8583-4d9308b54cd1.webp", "type": "image", "prompt": "Generate a horizontal bar background for a timer. It should be a rounded rectangle shape with a light gray fill and a subtle inner shadow. Use a cheerful cartoon style. Approximately 600x40 pixels. Transparent background around the bar. Professional game asset.", "description": "A horizontal bar background for the timer.", "subtype": "ui", "aspect_ratio": [1023, 268], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "ui_timer_bar_fill": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/cd45f99b-805d-4a27-8b07-a56a1af87e8d.webp", "type": "image", "prompt": "Generate a horizontal bar fill for a timer with a candy-stripe pattern. It should feature diagonal stripes in bright colors (pink and white), matching the rounded rectangle shape of `ui_timer_bar_bg`. Use a cheerful cartoon style. Approximately 600x40 pixels. Transparent background around the bar. Professional game asset.", "description": "A horizontal bar fill for the timer with candy-stripe pattern.", "subtype": "ui", "aspect_ratio": [1452, 359], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "ui_prompt_card": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/5c03517a-d18c-4845-ba80-ea4dab590d95.webp", "type": "image", "prompt": "Generate a decorative card background for displaying prompts. It should be a rounded rectangle with a white/cream background and a colorful border (rainbow gradient or confetti pattern). Use a cheerful cartoon style with soft shadows. Approximately 500x150 pixels. Transparent background around the card. Professional game asset.", "description": "A decorative card background for displaying prompts.", "subtype": "ui", "aspect_ratio": [1267, 768], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "sound_place_decoration": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/f4c0da6b-4c6c-489d-916f-527804e2265d.mp3", "type": "audio", "prompt": "Short, cheerful, playful, satisfying 'pop' or 'plop' sound effect like placing a soft decoration on a cake surface, cartoon style.", "description": "A short, cheerful 'pop' or 'plop' sound effect for placing decorations on the cake.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 0.5, "loop": false, "animation": null}, "sound_apply_frosting": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/e8cc63e4-2dfe-4987-9343-500aa83c1a03.mp3", "type": "audio", "prompt": "Soft, smooth, satisfying 'whoosh' or 'swipe' sound effect like spreading creamy frosting on a cake, cartoon style.", "description": "A soft 'whoosh' or 'swipe' sound effect for applying frosting to a cake tier.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 0.5, "loop": false, "animation": null}, "sound_undo": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/045c24cd-4494-44c8-ac06-baeaf1e7a39d.mp3", "type": "audio", "prompt": "Quick, playful, clear 'rewind' or 'zip back' sound effect for an undo action in a game.", "description": "A quick 'rewind' or 'zip back' sound effect for the undo action.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 0.5, "loop": false, "animation": null}, "sound_clear": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/c22792d9-db2c-4ca1-a7e3-4930e8d69a1a.mp3", "type": "audio", "prompt": "Quick, definitive 'whoosh' sound effect like sweeping things away for clearing decorations, cartoon style.", "description": "A 'whoosh' sound effect for clearing all decorations.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 0.5, "loop": false, "animation": null}, "sound_timer_warning": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/59d5439c-621f-4e40-8c16-f86845eceeba.mp3", "type": "audio", "prompt": "Gentle, slightly urgent but not stressful 'tick-tock' or clock sound effect for a 10-second timer warning.", "description": "A gentle 'tick-tock' or clock sound that plays when 10 seconds remain.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 0.5, "loop": true, "animation": null}, "sound_round_complete": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/03cb6272-6ec9-4f43-9d5b-a27c8874c436.mp3", "type": "audio", "prompt": "Cheerful, bright, uplifting, rewarding, celebratory 'success' jingle with bells or chimes for completing a game round.", "description": "A cheerful 'success' jingle for completing a round.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 2, "loop": false, "animation": null}, "sound_star_earned": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/e389d104-214f-4973-a1ce-2035bdec1f44.mp3", "type": "audio", "prompt": "Magical, bright, satisfying 'ding' or 'sparkle' sound effect for earning a star reward in a game.", "description": "A magical 'ding' or 'sparkle' sound for each star earned in the rating.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 0.5, "loop": false, "animation": null}, "music_gameplay": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/music/music_gameplay_f88fcddc-6cca-4a4b-98b1-c9a411994bf3.mp3", "type": "audio", "prompt": "Upbeat and energetic mermaid theme background music for an underwater game. Tropical and mystical melody with magical fantasy elements. Features bright shimmering synthesizers resembling glittering scales, mixed with subtle organic ocean sounds like rising bubbles, gentle water flows, and soft aquatic ambiance. Tempo is 130 BPM, cheerful and encouraging tone, whimsical arrangement with light percussion and bell-like tones. Smooth loop transitions for continuous gameplay, oceanic/aquatic mood, high-quality production, instrumental only.", "description": "Upbeat mermaid-themed gameplay music with aquatic textures and magical synthesizers for an underwater cake decorating game.", "subtype": "music", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 75.07591836734694, "loop": true, "animation": null}, "music_menu": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/music/music_menu_d4bca7b2-8314-4c7c-aa25-4fa0d9c296df.mp3", "type": "audio", "prompt": "Whimsical mermaid theme background music for a magical underwater game menu. Features a soft, calming oceanic mood, dreamy synthesizers, and shimmering textures evoking light rays through water. Includes subtle ambient elements like distant ethereal mermaid vocalizations (a cappella style), light bubble sounds, and gentle water currents. Tempo is moderate at 95 BPM. Instrumentation: soft pads, glockenspiel for 'water sparkles', melodic harp, and deep, warm sub-bass. Peaceful, inviting, and magical sanctuary vibe. Instrumental with vocal textures.", "description": "Gentle, whimsical mermaid-themed background music for the menu and results screens.", "subtype": "music", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 75.07591836734694, "loop": true, "animation": null}, "frosting_purple": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_purple_edc4790f-6498-4ffc-8d58-9d4ffc3152ba.webp", "type": "image", "prompt": "Generate a high-quality isometric view of a round cake tier covered in winter-themed amethyst purple frosting. The frosting should have a rich, cool purple color like frozen amethyst crystals, featuring delicate snowflake patterns, frosted textures, and sparkling ice crystal formations. The lighting should be flat and consistent with a magical winter glow, no shadows, suitable for a game asset overlay. Transparent background.", "description": "A winter-themed amethyst purple frosting texture overlay for an isometric round cake tier with ice crystals.", "subtype": "other", "aspect_ratio": [1024, 962], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_orange": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_orange_d95d9658-0b6f-4589-822c-546bc51cc133.webp", "type": "image", "prompt": "Generate a high-quality, isometric perspective orange frosting texture overlay for a round cake tier. The style is fantasy kawaii with a bright, warm orange color reminiscent of autumn magic. Include golden magical sparkles scattered throughout the smooth, creamy texture. Add subtle, whimsical swirls shaped like stylized autumn leaves or flickering fire. The frosting should have an enchanting glow and a polished, glossy finish, matching the isometric angle of 'cake_tier_middle'. Ensure the background is transparent for use as a game overlay.", "description": "A fantasy-themed orange frosting texture overlay with golden sparkles and autumn swirls for an isometric cake tier.", "subtype": "other", "aspect_ratio": [1024, 962], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_red": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_red_b0d8481a-ea79-4071-82c9-95a19d3588bf.webp", "type": "image", "prompt": "Generate a vibrant ruby red frosting texture overlay for a round cake tier in isometric perspective. The frosting should have a glossy, gemstone-like sheen with tiny heart-shaped sparkles and an enchanting magical glow. Include elegant swirls and peaks with a smooth finish, matching a fantasy kawaii aesthetic. The style should be whimsical and romantic, consistent with a magical enchanted theme, on a transparent background.", "description": "A vibrant ruby red fantasy-themed frosting texture with heart sparkles and a magical glow for a round cake tier.", "subtype": "other", "aspect_ratio": [1024, 947], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_mint": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_mint_8f6c14d6-dde2-45e7-8d5b-00decb657b2b.webp", "type": "image", "prompt": "Generate a high-quality, 3D isometric round cake tier texture overlay. The frosting is a gentle mint green with a frosted, icy finish. Incorporate crystalline frost patterns, delicate white snowflake details, and a subtle texture suggesting frozen pine needles. The style is clean and polished with a cool, refreshing winter aesthetic. Maintain a clear isometric perspective and 3D depth, designed to fit perfectly over a round cake layer, transparent background.", "description": "A winter-themed frosted pine mint green frosting texture for an isometric cake tier with snowflake patterns.", "subtype": "other", "aspect_ratio": [1024, 962], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_gold": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_gold_b69420cb-f9c6-4fa3-b793-e20f59fd60cf.webp", "type": "image", "prompt": "Generate a high-quality isometric view of a round cake tier covered in rich, shimmering gold frosting. The texture should have elegant swirls, a metallic lustrous finish, and be adorned with abundant golden sparkles and tiny glowing stars. The style is fantasy kawaii, fitting an enchanted royal theme. Ensure the lighting is radiant and magical, with a clean look and transparent background for overlay use.", "description": "A rich, shimmering gold frosting texture for a cake tier with a fantasy kawaii aesthetic and magical glow.", "subtype": "other", "aspect_ratio": [1024, 962], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_rainbow": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_rainbow_03fae897-c7a3-4c1f-92d0-de28c9c7ecf3.webp", "type": "image", "prompt": "Generate a high-quality isometric view of a round cake tier frosting texture. The texture features a smooth, dreamy rainbow gradient of red, orange, yellow, green, blue, and purple. Incorporate whimsical swirls that blend the colors seamlessly with a holographic shimmer and a prismatic glow. Scatter tiny rainbow-colored sparkles throughout the frosting. The style is fantasy kawaii with a soft, enchanted theme. Match the isometric perspective and round shape of 'cake_tier_bottom'. Transparent background for the outer edges, but the frosting itself is a rich, opaque texture.", "description": "A magical rainbow frosting texture overlay for an isometric cake tier with holographic shimmer and fantasy sparkles.", "subtype": "other", "aspect_ratio": [1024, 875], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_lollipop": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_lollipop_eaa17177-e386-4b7d-9344-234bcebec29a.webp", "type": "image", "prompt": "Transform the decoration_lollipop into a bold cartoon style. Add thick black outlines and a simplified, exaggerated spiral swirl pattern using bright, contrasting rainbow colors. Make the lollipop stick shorter and thicker. Apply a high-gloss reflective shine to the candy surface to make it look sugary and polished. Ensure the asset is shown from a front-right isometric perspective to match the cake tiers, with a transparent background.", "description": "A cartoonish, glossy swirled lollipop cake topper with thick outlines and bold colors.", "subtype": "object", "aspect_ratio": [831, 1240], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_gummy_bear": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_gummy_bear_497a5c65-c370-4313-88bb-57a67f037374.webp", "type": "image", "prompt": "Transform the decoration_gummy_bear into a highly stylized, cartoonish version. Add thick black outlines and make the shape much rounder and more simplified with a chubby, adorable body. Give it a cute face consisting of simple black dot eyes and a tiny smile. The material should look like bright, translucent, semi-transparent gelatin with a glossy candy sheen. Maintain the isometric perspective to match the cake tiers and provide it as a standalone illustration on a transparent background.", "description": "A cute, cartoonish gummy bear cake topper with thick outlines and a glossy finish.", "subtype": "object", "aspect_ratio": [799, 1232], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_marshmallow": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_marshmallow_43ea90af-3a47-4b01-a5e5-d0d14bf5ae3b.webp", "type": "image", "prompt": "Transform the marshmallow in image 1 into a highly stylized cartoon version. Give it thick, clean black outlines and make the shape significantly rounder, puffier, and squishier. Use a soft pastel white color with subtle pinkish-white highlights to create a pillowy, soft appearance. Add a slight glossy shine to the top edges to suggest a smooth sugar coating. Maintain the isometric perspective to match the cake tiers in the game. Ensure a transparent background and a polished, professional game-ready look.", "description": "A cute, puffy, cartoon-style marshmallow cake topper with thick outlines.", "subtype": "object", "aspect_ratio": [794, 1007], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_bow": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_bow_5a1586f6-a1a2-43b7-a8e2-2e581342ff02.webp", "type": "image", "prompt": "Transform the existing ribbon bow in image 1 into a stylized cartoon game asset. Add thick, clean black outlines and simplify the ribbon loops to be rounder, symmetrical, and exaggerated. Use bright, saturated pink and red colors with simple fold lines for dimension. Maintain a shadowless, isometric perspective consistent with a cake topper. High quality, professional 2D vector-style game art on a transparent background.", "description": "A cute, cartoonish decorative ribbon bow for a birthday cake topper.", "subtype": "object", "aspect_ratio": [793, 868], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_balloon": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_balloon_fd6be4d5-6efc-49dd-870e-ad052c1bff79.webp", "type": "image", "prompt": "Transform the decoration_balloon into a stylized cartoon version. Add thick black outlines, make the balloon shape perfectly round and simplified with bright saturated colors. Include a distinct white glossy highlight or shine spot. Simplify the string into a smooth curved line. Maintain the isometric perspective to match the existing cake tiers. High resolution, clean vector-style game asset, transparent background.", "description": "A cartoonish, festive balloon decoration with thick outlines and a bright shine, designed as a cake topper.", "subtype": "object", "aspect_ratio": [730, 1247], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_cookie": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_cookie_16a07172-3124-438f-a700-46b2ad057765.webp", "type": "image", "prompt": "Transform the cookie in image 1 into a highly stylized, cartoonish game asset. Add thick, clean black outlines and simplify the shape to be perfectly round. Use a vibrant, bright golden brown color for the dough. Add large, prominent dark brown circles for chocolate chips. Give the surface a subtle baked texture. Include a small, cute bite mark on the top right edge. Maintain an isometric perspective consistent with the cake tiers, ensuring a transparent background and professional game-ready quality.", "description": "A cute cartoonish chocolate chip cookie cake topper with thick outlines and a bite mark.", "subtype": "object", "aspect_ratio": [1023, 844], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "cake_plate": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/cake_plate_36f0feee-f652-4c82-9959-6f62929af474.webp", "type": "image", "prompt": "Generate a high-quality isometric view of an elegant circular cake plate. Transform the existing design into a mermaid-themed aesthetic: replace winter elements with decorative seashell patterns around the rim, pearl and starfish embellishments, and flowing wave patterns. Use a color palette of coral, pearl, and seafoam green with an iridescent shimmer. The plate should look like a magical underwater serving piece. Flat lighting, clean outlines, game-ready asset on a transparent background, matching the perspective of image 1.", "description": "An elegant, mermaid-themed isometric cake plate with seashells and iridescent textures.", "subtype": "object", "aspect_ratio": [1248, 696], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "mascot_happy": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_happy_9e8f20ce-dbc6-4f89-9e02-01378211679e.webp", "type": "image", "prompt": "Generate a full-body, front-facing illustration of a cheerful kawaii-style chef mascot. The character should have a big friendly smile, large expressive eyes, and be wearing a classic white chef's hat and a simple cute chef's tunic. The art style is polished, clean vector-like digital art with soft shading and bold outlines, matching a vibrant mobile game aesthetic. High resolution, professional quality, standing on a transparent background.", "description": "A cheerful kawaii chef mascot with a big smile, designed for the Frosting Master game.", "subtype": "character", "aspect_ratio": [868, 1462], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "mascot_excited": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_excited_4176c1d8-cb23-4fcb-908b-ffe849e37890.webp", "type": "image", "prompt": "Transform the character from mascot_happy into an excited version. Maintain the same kawaii-style chef mascot base design, including the chef hat and outfit. Change the facial expression to have large, sparkling 'star' eyes and a wide, energetic 'WOW' open-mouthed expression showing pure delight. The character should be a full-body standing illustration, front-facing, with a clean, polished game-ready look on a transparent background.", "description": "An excited kawaii chef mascot with sparkling eyes and a big 'WOW' expression for celebratory moments.", "subtype": "character", "aspect_ratio": [758, 1248], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "mascot_surprised": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_surprised_2e7293cf-dde7-4211-b70f-7804ac88bdb2.webp", "type": "image", "prompt": "Generate a full-body, front-facing illustration of a kawaii chef mascot with a surprised expression, featuring wide eyes and an 'O' shaped mouth. The character should have soft, rounded features, a clean vector-style aesthetic, and a cheerful color palette consistent with image 1. The chef should be wearing a white toque and a cute apron. High resolution, professional game asset, transparent background, matching the character design of mascot_happy.", "description": "A surprised kawaii chef mascot with wide eyes and an 'O' shaped mouth, matching the established game character design.", "subtype": "character", "aspect_ratio": [737, 1248], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "mascot_worried": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_worried_d5f698e3-12cf-4d29-91fa-cd93bad2154b.webp", "type": "image", "prompt": "Generate a full-body, front-view illustration of a kawaii chef mascot with a worried and nervous expression. The character should have soft rounded features, concerned furrowed eyebrows, an anxious mouth, and small sweat drops to emphasize the nervous feeling. The chef wears a clean white toque and a professional chef's coat. Maintain a bright, polished cartoon art style with clean lines and soft shading, matching the visual identity of 'mascot_happy'. High resolution, professional game asset, transparent background.", "description": "A worried kawaii chef mascot for the cake decorating game timer warning, showing an anxious expression.", "subtype": "character", "aspect_ratio": [740, 1248], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "mascot_celebrating": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_celebrating_e1e4f596-f047-4a5e-8518-a2870ff619e7.webp", "type": "image", "prompt": "Generate a full-body, front-facing illustration of a kawaii chef mascot in a triumphant celebration pose. The character has arms raised high in a victorious gesture, hands reaching upward. Features include a big joyful smile, sparkling happy eyes, and a clean, polished cartoon style. Maintain strict character consistency with the established chef design in image 1. Transparent background, high resolution, professional game asset quality.", "description": "A triumphant kawaii chef mascot celebrating a successful cake decoration with arms raised.", "subtype": "character", "aspect_ratio": [763, 1220], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_blueberry": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_blueberry_63243f9b-3233-48fc-9a8c-2ece57f55f29.webp", "type": "image", "prompt": "Transform the blueberry in image 1 into a highly stylized, cartoonish game asset. Apply thick black outlines and a perfectly round, plump, simplified shape. Use a vibrant, saturated blue-purple color palette with bright glossy white highlights. Add a simple, clean star-shaped crown on the top. Ensure the isometric perspective matches the existing cake tiers perfectly. Professional quality, clean vector-like style, transparent background.", "description": "A cute, cartoonish blueberry cake decoration with thick outlines and a glossy finish.", "subtype": "object", "aspect_ratio": [861, 1020], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_candy": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_candy_cefb20d5-01f4-4887-a58f-7f0baee5786e.webp", "type": "image", "prompt": "Transform the decoration_candy into a highly stylized cartoon game asset. Add thick, clean black outlines and simplify the wrapper with bold, saturated pink and white stripes. Make the twisted ends of the wrapper more exaggerated, curly, and playful. Add high-contrast white glossy highlights to give it a shiny plastic appearance. Maintain the same isometric perspective as the cake_tier_bottom and existing decorations. Set against a transparent background, high resolution, professional 2D game art style.", "description": "A cartoonish, glossy wrapped candy cake topper with thick outlines and bold patterns.", "subtype": "object", "aspect_ratio": [1024, 936], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_pretzel": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_pretzel_ed787019-4f4d-43d3-9260-bde282967488.webp", "type": "image", "prompt": "Transform the pretzel in image 1 into a stylized cartoon game asset. Use thick, clean black outlines and a simplified twisted knot shape. Apply a vibrant, warm golden brown color with a slight glossy shine highlight. Add large, prominent white dots to represent salt crystals. Ensure it is rendered in an isometric perspective to match the cake tiers, with a cute and appetizing appearance. High resolution, professional vector-style game art, transparent background.", "description": "A cute cartoon-style golden brown twisted pretzel cake topper with thick outlines and glossy finish.", "subtype": "object", "aspect_ratio": [1077, 830], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_macaron": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_macaron_becff7df-74e4-40cd-83e5-c6251a849d01.webp", "type": "image", "prompt": "Transform the macaron in image 1 into a stylized cartoon game asset. Add thick black outlines and simplify the shape to be rounder and more bubbly. Use bright pastel colors with a visible creamy filling layer in the middle. Exaggerate the ruffled 'feet' texture on the edges. The surface should look glossy and smooth. Maintain a side-view isometric perspective to match the cake tiers, with a transparent background.", "description": "A cartoonish, pastel macaron cake topper with thick outlines and a glossy finish.", "subtype": "object", "aspect_ratio": [1017, 976], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_wafer": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_wafer_a1174450-c81f-4b90-b24a-3a9a1c9dd2f0.webp", "type": "image", "prompt": "Transform the decoration_wafer into a stylized cartoon version. Apply thick black outlines and a simplified, bold grid pattern. Use a vibrant, bright golden color with a slight glossy shine on the surfaces. Ensure the grid holes are pronounced, uniform, and clean. Maintain a straight, simple shape and keep the isometric perspective consistent with the other cake decorations. Transparent background, high resolution, game-ready asset.", "description": "A cartoonish golden wafer stick decoration with a bold grid pattern and thick outlines.", "subtype": "object", "aspect_ratio": [1023, 948], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_mint_leaf": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_mint_leaf_5481b771-2152-493f-9a3e-c4e4600c06e5.webp", "type": "image", "prompt": "Transform the mint leaf in image 1 into a stylized cartoon version. Add thick black outlines and simplify the shape to 2-3 rounded, plump leaves. Use a vibrant, bright green color palette with simple, clean vein lines. Ensure the appearance is fresh and cheerful with a 'kawaii' aesthetic. Maintain the isometric perspective to match the cake tiers and provide a transparent background.", "description": "A cute cartoon-style mint leaf sprig for cake decoration with thick outlines.", "subtype": "object", "aspect_ratio": [1023, 857], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "frosting_lavender": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_lavender_6e574701-4915-495b-9327-f0b40cdb4282.webp", "type": "image", "prompt": "Generate a high-quality lavender purple frosting texture overlay designed for an isometric round cake tier. The texture should feature a flowing twilight wave pattern in soft lavender (#E6E6FA to #DDA0DD) with scattered twinkling star points and subtle galaxy swirl patterns. The design should have a dreamy, ethereal mermaid aesthetic with gentle movement. Isometric perspective, wrap-around texture for a curved surface, flat lighting with no shadows, transparent background, clean game-ready asset.", "description": "A soft, dreamy lavender purple frosting texture overlay with flowing twilight waves and starlight sparkles for an isometric cake tier.", "subtype": "other", "aspect_ratio": [1023, 962], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_rose": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_rose_a75eb07e-d494-4827-a3e4-49c8085713e2.webp", "type": "image", "prompt": "Generate a high-quality, isometric perspective frosting texture overlay for a round cake tier. The texture should be a vibrant rose-pink, resembling magical rose petals with elegant floral swirls. Add small heart-shaped and petal-shaped sparkles throughout. The finish should be smooth and glossy with a romantic shimmer and a warm, loving glow. The style is fantasy kawaii, matching a whimsical enchanted theme. Ensure flat lighting and no shadows to function as a game texture overlay. Match the orientation of cake_tier_middle.", "description": "A vibrant rose-pink frosting texture overlay with magical sparkles and floral swirls in an isometric perspective.", "subtype": "other", "aspect_ratio": [1024, 961], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_turquoise": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_turquoise_8cda84c0-2729-4897-b32f-d5071c419ca0.webp", "type": "image", "prompt": "Generate a brilliant turquoise gemstone frosting texture overlay for a round isometric cake tier. The texture features a brand new crystalline facet arrangement like a cut turquoise gemstone, with geometric crystal patterns and sharp diamond-like light refractions. Include small starlight twinkles and a luxurious sparkling finish. The design should wrap naturally around a curved isometric surface. Use flat lighting with no shadows, mermaid-themed magical aesthetic, vibrant turquoise color palette (#40E0D0 to #AFEEEE), transparent background, high resolution, game-ready UI asset.", "description": "A brilliant turquoise gemstone frosting texture overlay with crystalline facets for an isometric cake tier.", "subtype": "other", "aspect_ratio": [1066, 919], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_lime": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_lime_80002f69-cac6-4087-95b1-3eadb7e3ebcf.webp", "type": "image", "prompt": "Generate a vibrant lime green frosting texture overlay for a round cake tier in isometric perspective. The style is fantasy kawaii with a smooth, zesty texture and energetic swirls. Add tiny green leaves and star-shaped sparkles for an enchanted citrus look. The frosting should have a bright, cheerful glow and a magical, whimsical appearance consistent with a fantasy theme. High resolution, clean lines, game-ready asset, matching the perspective of cake_tier_middle.", "description": "A vibrant lime green enchanted frosting texture for an isometric cake tier with magical sparkles.", "subtype": "other", "aspect_ratio": [1023, 947], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_silver": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_silver_029ec082-c3f2-4851-9bc7-7f93fd2af84b.webp", "type": "image", "prompt": "Generate a winter-themed silver frosting texture overlay for a round isometric cake tier. The texture should be a glacial silvery-blue with a frozen metallic sheen and crystalline patterns. The dominant feature must be multiple well-defined hanging icicles in a bright icy blue, varying in length, dripping from the top edge. High-quality game asset, clean lines, fantasy kawaii aesthetic, 3/4 isometric perspective, transparent background.", "description": "A winter-themed glacial silver frosting texture with prominent hanging blue icicles for an isometric cake tier.", "subtype": "other", "aspect_ratio": [1024, 962], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_coral": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_coral_27b9ce22-c350-4888-bf64-a78cfa74248b.webp", "type": "image", "prompt": "Generate a high-detail coral pink-orange frosting texture overlay for an isometric round cake tier. The design features a vibrant coral base (#FF7F50 to #FFB6C1) with a brand new arrangement of intricate coral branch patterns and small organic polyp details. Scatter subtle white pearl dots and delicate clusters of tiny bubbles throughout the texture to create a magical underwater mermaid aesthetic. Use flat lighting with no shadows, ensuring the pattern wraps naturally for a curved isometric surface. Clean, professional game-ready asset with a whimsical fantasy feel on a transparent background.", "description": "A vibrant coral-pink mermaid-themed frosting texture with intricate reef patterns and polyp details for an isometric cake tier.", "subtype": "other", "aspect_ratio": [1024, 875], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_candle_pink": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_candle_pink_af72e4c5-5f87-480f-88ee-d259a0681dff.webp", "type": "image", "prompt": "Transform the pink candle in image 1 into a winter-themed version. Add delicate white snowflake patterns etched onto the candle surface and white silver frosted edges. Incorporate a subtle ice crystal sparkle effect across the body. The candle should be a soft rose pink with white winter embellishments. Maintain the warm glowing flame on top, the isometric perspective, and the cute kawaii art style with thick outlines and a glossy finish. Transparent background.", "description": "A pink winter-themed birthday candle cake topper with snowflake patterns and icy frost details in isometric perspective.", "subtype": "object", "aspect_ratio": [420, 1246], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_candle_rainbow": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_candle_rainbow_224dd986-150d-4700-abed-e76275592fce.webp", "type": "image", "prompt": "Transform the rainbow candle from decoration_candle_rainbow into a winter-themed version. Add delicate white snowflake patterns overlaid on the rainbow stripes. Apply an icy, sparkly coating with shimmering ice crystals and frost across the surface. Add white and silver frost accents at the top and bottom edges. The original red, orange, yellow, green, blue, and purple stripes should remain visible through the frost. Maintain the warm glowing flame on top, the isometric perspective, and the clean kawaii cartoon style with thick outlines on a transparent background.", "description": "A winter-themed rainbow birthday candle cake topper with snowflake patterns and an icy, frosted finish.", "subtype": "object", "aspect_ratio": [716, 1248], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_krabby_patty": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_krabby_patty_4c3d8266-8562-48df-a9e5-96846f8343c3.webp", "type": "image", "prompt": "Generate a cute, cartoonish Krabby Patty burger cake topper in the SpongeBob SquarePants art style. The burger features a golden brown sesame seed bun, green frilly lettuce, a bright red tomato slice, a slice of melted yellow cheese, and a juicy brown patty. Use thick black outlines, glossy cartoon highlights, and vibrant colors. Viewed from a front-right isometric angle to match a cake's perspective. Clean, professional game asset, high resolution, transparent background.", "description": "A cute cartoonish Krabby Patty burger cake topper in the SpongeBob SquarePants art style.", "subtype": "object", "aspect_ratio": [900, 882], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_bubbles": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_bubbles_f6874f2b-516f-4288-b6d1-b2aa71bbedf6.webp", "type": "image", "prompt": "Generate a cluster of 3-5 shiny cartoon bubbles of varying sizes in the SpongeBob SquarePants art style. The bubbles should be translucent with rainbow reflections and bright white highlights. Each bubble must have thick black outlines and a glossy, floating appearance. The overall look is a cheerful underwater bubble cluster, viewed from a front-right isometric angle to match a cake topper perspective. High resolution, professional game asset, transparent background.", "description": "A cluster of shiny, cartoonish SpongeBob-style bubbles as a cake topper.", "subtype": "object", "aspect_ratio": [813, 770], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_spatula": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_spatula_ecabc69c-ed7c-4927-8b6d-e255ffb5f074.webp", "type": "image", "prompt": "Generate a cartoonish metal fry cook spatula cake topper inspired by the SpongeBob SquarePants art style. The spatula features a shiny silver-gray metal head with a long handle, rendered with thick black outlines and bold, simple highlights. The object is angled diagonally to match an isometric cake decorating perspective. Professional game asset, high resolution, clean lines, cel-shaded, transparent background.", "description": "A cartoonish SpongeBob-style metal spatula cake topper with thick outlines and a glossy finish.", "subtype": "object", "aspect_ratio": [932, 1273], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_gary": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_gary_d43265db-57d3-418f-841c-19f5795b8648.webp", "type": "image", "prompt": "Generate a full-body, front-right isometric view of Gary the Snail from SpongeBob SquarePants as a cake topper. Gary has a light pink body, a large light blue shell with a dark red spiral and purple spots, and tall eye stalks with large green eyes. The style must be clean cartoon with thick black outlines, glossy highlights, and flat/cell shading. Ensure it looks like a physical plastic or sugar topper, matching the isometric perspective of 'cake_plate'. High resolution, transparent background.", "description": "A cute cartoonish Gary the Snail cake topper in SpongeBob style for cake decoration.", "subtype": "object", "aspect_ratio": [578, 555], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_anchor": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_anchor_ddf66449-36d0-4cae-b51f-f27d2679fe77.webp", "type": "image", "prompt": "Generate a cartoonish nautical anchor cake topper in the SpongeBob SquarePants art style. The anchor should be a gray and silver metal with a classic shape including flukes and a shank. Use thick black outlines, glossy metallic highlights, and a clean, polished game-ready look. Front-right isometric perspective to match a cake topping. High resolution, professional quality, transparent background.", "description": "A cartoonish nautical anchor cake topper in the SpongeBob SquarePants art style for cake decoration.", "subtype": "object", "aspect_ratio": [852, 974], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_jellyfish": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_jellyfish_6fdc98e2-1714-42ee-933b-910cca673645.webp", "type": "image", "prompt": "Generate a cute cartoonish pink jellyfish cake topper in the SpongeBob SquarePants art style. The subject is a smiling pink jellyfish with a translucent bell-shaped body, dangling tentacles, and happy eyes. Use thick black outlines, bright bold colors, and simplified shapes. Include slight glossy highlights on the body. Front view, standing illustration, high resolution, professional game asset, transparent background.", "description": "A cute pink jellyfish cake topper in the SpongeBob SquarePants art style for cake decoration.", "subtype": "object", "aspect_ratio": [581, 950], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_pineapple": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_pineapple_b38cfd2a-53bb-42f7-8aec-a917c18022ce.webp", "type": "image", "prompt": "Generate a professional quality, front-facing illustration of a cute cartoonish pineapple cake topper in the SpongeBob SquarePants art style. The pineapple has a golden yellow-orange body with a prominent crosshatch diamond pattern and bright green spiky leaves sprouting from the top. Use thick black outlines, bright vibrant colors, and simplified shapes with glossy highlights. No doors or windows. Transparent background, high resolution, standing illustration, game-ready asset.", "description": "A cute cartoonish pineapple cake topper in the SpongeBob SquarePants art style for cake decoration.", "subtype": "object", "aspect_ratio": [600, 1024], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_treasure_chest": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_treasure_chest_e40858d5-8c04-4c85-93ae-9e0959b9ead3.webp", "type": "image", "prompt": "Generate a full-body, front-angled view of a small wooden pirate treasure chest cake topper, designed in the SpongeBob SquarePants cartoon art style. The chest is partially open with shiny gold coins and colorful gems like rubies and emeralds spilling out. Use thick black outlines, bright vibrant colors, and a playful simplified design. Include metal bands, a latch, and glossy highlights on the treasure to give it a nautical Bikini Bottom feel. Professional quality game asset, transparent background.", "description": "A cute cartoonish SpongeBob-style treasure chest cake topper with gold coins and jewels.", "subtype": "object", "aspect_ratio": [916, 1042], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_patrick": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_patrick_5b7e53d9-4d17-4606-a016-0463bf97c11d.webp", "type": "image", "prompt": "Generate a full-body, front-facing illustration of Patrick Star from SpongeBob SquarePants designed as a cake topper. The character is a pink starfish with a happy, simple expression, wearing green swim trunks with purple flower patterns. Use the official SpongeBob cartoon art style with thick black outlines, bright saturated colors, and a glossy finish with highlights. The asset should be in a front-right isometric perspective to match 'decoration_gary' and 'decoration_pineapple'. High resolution, clean edges, transparent background.", "description": "A cute cartoonish Patrick Star cake topper in the SpongeBob SquarePants art style for cake decoration.", "subtype": "object", "aspect_ratio": [572, 920], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_spongebob": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_spongebob_f7b3446b-a294-435e-b078-507a5e48b60b.webp", "type": "image", "prompt": "Generate a cute cartoon cake topper of a cheerful yellow sea sponge character. The character is square-shaped with a porous sponge texture, big expressive eyes, and a wide friendly smile. He is wearing a white collared shirt and brown square pants. Energetic and joyful pose, isometric front-facing viewing angle. Features thick black outlines, vibrant saturated yellow colors, and a glossy polished finish. High-quality game asset, transparent background, clean silhouette suitable for small icon sizes.", "description": "A cute cartoonish yellow sponge character cake topper in an isometric perspective.", "subtype": "object", "aspect_ratio": [963, 869], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_squidward": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_squidward_d0217af8-5d54-4d8c-b6f0-e18793173737.webp", "type": "image", "prompt": "Generate a full-body, front-facing isometric cake topper of Squidward Tentacles. He has a turquoise body, a large bulbous nose, and a bored, grumpy expression with droopy eyes. He is wearing his iconic brownish-yellow shirt. The art style is high-quality SpongeBob SquarePants cartoon with thick black outlines, bright colors, and a glossy, shiny finish. The asset should be a single standalone object with a transparent background, matching the lighting and perspective of a small plastic cake decoration.", "description": "A grumpy Squidward Tentacles cake topper in SpongeBob SquarePants cartoon style.", "subtype": "object", "aspect_ratio": [497, 1204], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_mr_krabs": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_mr_krabs_5fb50749-114e-4144-80aa-0e777c5904ac.webp", "type": "image", "prompt": "Generate a high-quality, front-facing 3/4 angle illustration of Mr. Krabs from SpongeBob SquarePants as a cake topper. The character should be a red crab with tall eyestalks, large claws, wearing his signature light blue shirt and dark pants. Style: clean cartoon with thick black outlines, vibrant saturated colors, and a glossy finish. No shadows, flat lighting, transparent background. Ensure the style matches the established SpongeBob and Patrick cake toppers.", "description": "A cute cartoonish Mr. Krabs cake topper in the SpongeBob SquarePants art style for cake decoration.", "subtype": "object", "aspect_ratio": [701, 882], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_kelp": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_kelp_e01cd429-3453-4041-910c-202340f06efa.webp", "type": "image", "prompt": "Generate a cute cartoonish kelp seaweed cake topper in the SpongeBob SquarePants art style. Long, wavy green seaweed strands with multiple flowing blades in various shades of lime and dark green. Featuring thick black outlines, bright saturated colors, and a glossy finish. Add a few small shiny bubbles around the base. Vertical orientation, upright standing, front-view, no shadows, clean edges, transparent background, high resolution, professional game asset quality.", "description": "A cute cartoonish kelp seaweed cake topper in the SpongeBob SquarePants art style.", "subtype": "object", "aspect_ratio": [429, 976], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_sandy": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_sandy_9ab19e8a-14fd-4873-be1b-49fa87783f79.webp", "type": "image", "prompt": "Generate a high-quality, professional game asset of a Sandy Cheeks cake topper from SpongeBob SquarePants. The character is a squirrel in a white diving suit with a purple flower and a clear glass dome helmet. Use a bright, bold cartoon style with thick black outlines and a glossy finish. The character should have a cheerful, big friendly smile and a welcoming pose. Perspective must be isometric to match 'decoration_patrick' and 'decoration_spongebob'. Transparent background, clean edges, front-right facing.", "description": "A cute cartoonish Sandy Cheeks cake topper in the SpongeBob SquarePants art style for cake decoration.", "subtype": "object", "aspect_ratio": [794, 1100], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_clarinet": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_clarinet_36b2b52a-450f-42f7-82ed-bccfb947b915.webp", "type": "image", "prompt": "Generate a cute cartoonish clarinet cake topper in the SpongeBob SquarePants art style. The clarinet should be dark wood brown or black with shiny silver keys and a bell at the bottom. Use a simplified, stylized design with thick black outlines, bright bold colors, and a glossy finish with highlights. Position it in a front-right isometric perspective to match a cake decoration. High resolution, professional quality, transparent background.", "description": "A cute cartoonish clarinet cake topper in the SpongeBob SquarePants art style for cake decoration.", "subtype": "object", "aspect_ratio": [379, 1248], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_plankton": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_plankton_d8583254-2c11-46bb-8f13-2a7deffec2ea.webp", "type": "image", "prompt": "Generate a full-body, front-facing isometric cake topper of Sheldon J. Plankton from SpongeBob SquarePants. The character is a tiny bright green copepod with one large iconic red and pink eye, long thin antennae, and a mischievous, comedic grin. Use a vibrant cartoon art style with thick, bold black outlines and a glossy finish. The asset should look like a high-quality physical cake decoration with a slight 3D pop effect. Transparent background, professional game asset quality, matching the aesthetic of decoration_spongebob and decoration_patrick.", "description": "A cute cartoonish Plankton character cake topper in the SpongeBob SquarePants art style.", "subtype": "object", "aspect_ratio": [381, 1163], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "mascot_spongebob_happy": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_spongebob_happy_dfd96cf3-5562-41a0-a823-ce0eccee913b.webp", "type": "image", "prompt": "Generate a full-body, front-facing illustration of SpongeBob SquarePants in a happy state. He has a large, cheerful open-mouthed smile showing his two front teeth, bright wide eyes, and is giving a friendly thumbs up. The style is the iconic Nickelodeon cartoon art: bright yellow porous sponge body, thick black outlines, white shirt, red tie, and brown rectangular pants. Standing upright, high-quality game-ready character mascot, transparent background.", "description": "A cheerful SpongeBob SquarePants mascot to encourage players during cake decorating.", "subtype": "character", "aspect_ratio": [656, 725], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "mascot_spongebob_excited": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_spongebob_excited_c0991d06-8faf-4cb4-9767-dd2f48e499f0.webp", "type": "image", "prompt": "Generate a full-body, front-facing illustration of SpongeBob SquarePants in an extremely excited and energetic state. He has huge sparkling eyes, a wide joyful open-mouthed smile, and his arms are raised high in celebration. Use the authentic SpongeBob SquarePants cartoon art style with vibrant yellow porous texture, thick clean outlines, and bold colors. High-quality game mascot character, standing pose, transparent background, professional 2D vector style.", "description": "An excited SpongeBob SquarePants mascot celebrating a successful cake decoration.", "subtype": "character", "aspect_ratio": [929, 932], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "mascot_spongebob_surprised": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_spongebob_surprised_fa9da2a0-54d8-4067-9aba-a45e42605f69.webp", "type": "image", "prompt": "Generate a full-body, front-facing illustration of SpongeBob SquarePants in a surprised and shocked state. He should have wide, dilated eyes, raised eyebrows, and his mouth formed into a perfect 'O' shape. Use the official SpongeBob SquarePants cartoon art style: vibrant yellow porous sponge texture, thick black outlines, white eyes with blue irises, and his signature white shirt, red tie, and brown rectangular pants. The character should be standing in a startled pose against a transparent background. High resolution, clean vector-like finish, professional game mascot quality.", "description": "A surprised SpongeBob SquarePants mascot with wide eyes and an 'O' shaped mouth for game reactions.", "subtype": "character", "aspect_ratio": [642, 890], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "mascot_spongebob_worried": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_spongebob_worried_e35cc425-e8e5-42c8-8124-26163454a375.webp", "type": "image", "prompt": "Generate a full-body, front-facing illustration of SpongeBob SquarePants in a worried and anxious state. He should have a concerned expression with furrowed brow-lines, large worried eyes, and a nervous wavy frown. Use the authentic SpongeBob SquarePants cartoon art style: vibrant yellow porous sponge body, thick black outlines, white eyes, and his signature square pants outfit. He should look slightly frantic to warn the player to hurry. High-quality, clean vector-style game asset on a transparent background.", "description": "A worried SpongeBob SquarePants mascot to warn the player when the timer is low.", "subtype": "character", "aspect_ratio": [619, 727], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "mascot_spongebob_celebrating": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_spongebob_celebrating_becb44c4-3ad1-48c4-b595-1ce60aa25be6.webp", "type": "image", "prompt": "Generate a full-body, front-facing illustration of SpongeBob SquarePants in a triumphant celebration pose. He has a massive joyful smile, wide sparkling eyes, and both arms raised high in victory. Use the official SpongeBob SquarePants cartoon art style: vibrant yellow porous sponge body, thick black outlines, white shirt, red tie, and brown rectangular pants. The character should be in an energetic jumping or cheering stance against a transparent background. High resolution, polished game-ready asset, matching the style of mascot_spongebob_happy.", "description": "A triumphant SpongeBob SquarePants mascot celebrating a round completion with a victory pose.", "subtype": "character", "aspect_ratio": [635, 720], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "background_fish": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_fish_e1513150-836e-4caf-b859-f8e865321e51.webp", "type": "image", "prompt": "Transform the fish in image 1 into an ultra-kawaii chibi version. Increase eye size significantly to be much bigger and more prominent with sparkly highlights. Add cute pink rosy blush circles to the cheeks. Make the body shape much rounder, plumper, and more adorable. Give it a bigger, friendlier smiling expression. Use highly saturated, cheerful, and vibrant colors. Add small white sparkle and shine effects on the body. Maintain a side-view isometric perspective suitable for an underwater background. Style: Polished cartoon with thick clean outlines and a plush-toy aesthetic, matching the SpongeBob-inspired game world but much cuter.", "description": "An ultra-kawaii chibi tropical fish with large sparkly eyes and rosy cheeks for underwater background decoration.", "subtype": "other", "aspect_ratio": [1024, 869], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "background_seahorse": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_seahorse_4ed6b87b-0a12-455b-9fb0-cbe2e6cca77e.webp", "type": "image", "prompt": "Generate a full-body side view of a cute, small seahorse in the SpongeBob SquarePants cartoon art style. The seahorse should have a bright yellow-orange body with coral pink accents, a small curled tail, and large expressive eyes. Use thick, bold black outlines and smooth rounded shapes. The character should be in an upright vertical posture with a small dorsal fin, matching the aesthetic of the existing background_fish. High resolution, professional game asset, clean lines, transparent background.", "description": "A cute, side-view animated seahorse in SpongeBob art style for background decoration.", "subtype": "other", "aspect_ratio": [516, 940], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_candle_spongebob": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_candle_spongebob_1c235b3f-8569-471f-8b02-0e505f24a51a.webp", "type": "image", "prompt": "Generate a SpongeBob SquarePants themed birthday candle cake topper. The candle body is a bright yellow square shaped like SpongeBob with his iconic face, big smile, and two square eyes. A bright, flickering yellow and orange animated-style flame sits on top. High-quality 2D cartoon art style with thick black outlines and vibrant colors matching the SpongeBob show. Isometric perspective, front-right view, standing illustration, transparent background.", "description": "A SpongeBob-themed yellow square birthday candle cake topper with a flickering flame.", "subtype": "object", "aspect_ratio": [563, 798], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_candle_pink_spongebob": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_candle_pink_spongebob_8669935e-c72d-45e7-9087-119130373c6e.webp", "type": "image", "prompt": "Generate a Patrick Star themed pink birthday candle cake topper, isometric front-right viewing angle. The candle is cylindrical with a wick on top, decorated with Patrick's signature lime green and purple flower patterns and organic spots. Thick black outlines, vibrant flat colors with simple cel-shading, SpongeBob SquarePants cartoon art style. No flame on the wick. Clean, polished game asset on a transparent background.", "description": "A Patrick Star themed pink birthday candle cake topper in the SpongeBob art style.", "subtype": "object", "aspect_ratio": [467, 994], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_candle_rainbow_spongebob": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_candle_rainbow_spongebob_6986ebce-7bf5-44c6-b95b-3f7cc85282a7.webp", "type": "image", "prompt": "Generate a professional game asset of a cylindrical birthday candle cake topper, isometric front-right view. The candle features a vibrant, saturated rainbow gradient inspired by SpongeBob's 'imagination' rainbow, decorated with small stylized magic stars and sparkles. Thick black outlines, clean cel-shaded cartoon style matching SpongeBob SquarePants aesthetic. No flame on the wick. High resolution, transparent background, cute and whimsical.", "description": "A whimsical rainbow 'imagination' themed birthday candle cake topper in SpongeBob art style.", "subtype": "object", "aspect_ratio": [366, 819], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "mascot_chibi_dragon_happy": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_chibi_dragon_happy_99a8f0a7-584e-43d6-97c7-6d80cf30dd3a.webp", "type": "image", "prompt": "Generate a full-body, front-facing 3/4 view illustration of a cute chibi baby dragon mascot. The dragon has an oversized head, small body, large sparkling expressive eyes, and a wide happy smile. It features pastel rainbow-colored scales in soft pink, purple, and blue. The dragon is wearing a tiny white chef's hat and holding a small cartoon spatula. Kawaii aesthetic with thick black outlines, rounded soft shapes, bright saturated pastel colors, and a glossy polished finish. Professional game-ready character sprite, transparent background, high resolution, detailed vector-style art.", "description": "A cheerful chibi dragon mascot wearing a chef hat for a cake decorating game.", "subtype": "character", "aspect_ratio": [933, 1407], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "mascot_chibi_dragon_excited": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_chibi_dragon_excited_7bb5ea6d-32c1-49af-b33f-d4222ef67987.webp", "type": "image", "prompt": "Generate a full-body, front 3/4 view of an excited cute chibi fantasy dragon mascot based on the character in mascot_chibi_dragon_happy. The dragon has an amazed 'WOW' expression with wide, star-sparkling eyes and a large 'O' shaped mouth. It is wearing a tiny white chef's hat, has pastel rainbow-colored scales in soft pinks, purples, and blues, and small wings spread out in excitement. The pose should be energetic, as if jumping slightly with arms raised in celebration. Use a kawaii/chibi art style with thick black outlines, bright saturated pastel colors, and a glossy, polished finish. Add small floating sparkles around the character. High resolution, transparent background, game-ready sprite.", "description": "An excited chibi dragon mascot with a 'WOW' expression, matching the established character style.", "subtype": "character", "aspect_ratio": [824, 1062], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "mascot_chibi_dragon_surprised": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_chibi_dragon_surprised_2f31949c-8f36-4025-96f2-8b62a786b4a6.webp", "type": "image", "prompt": "Generate a surprised cute chibi fantasy dragon mascot with very wide sparkling eyes and a small 'O' shaped mouth, matching the character in mascot_chibi_dragon_happy. The character is a baby dragon with pastel rainbow-colored scales (soft pinks, purples, blues), small wings slightly raised, and wearing a tiny white chef's hat. The pose should show a slight backward lean with paws up near the face in a startled but cute gesture. Kawaii aesthetic, thick black outlines, bright saturated pastel colors, glossy polished finish, 3/4 isometric-friendly perspective, transparent background, high resolution game sprite.", "description": "A surprised chibi fantasy dragon mascot with wide eyes and an 'O' shaped mouth for game reactions.", "subtype": "character", "aspect_ratio": [759, 1220], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "mascot_chibi_dragon_worried": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_chibi_dragon_worried_440479ab-3161-4912-ba1b-f6195faf8515.webp", "type": "image", "prompt": "Generate a worried version of the chibi dragon from mascot_chibi_dragon_happy. A cute, small baby fantasy dragon with pastel rainbow scales, large anxious eyes with tiny sweat drops, and a nervous wavy mouth. The dragon is wearing a tiny white chef's hat tilted slightly. It has a worried, nervous stance with paws clasped together. Use a kawaii chibi art style with thick black outlines, soft pastel colors, and a glossy polished finish. 3/4 isometric view, full body standing illustration, transparent background, high resolution game asset.", "description": "A worried kawaii chibi dragon mascot with an anxious expression for timer warnings.", "subtype": "character", "aspect_ratio": [784, 1242], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "mascot_chibi_dragon_celebrating": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_chibi_dragon_celebrating_c32f769a-afa2-446d-96ae-2dc91ec54ad4.webp", "type": "image", "prompt": "Generate a full-body, front-view illustration of a triumphant cute chibi fantasy dragon mascot celebrating a victory. The dragon has an adorable oversized head, small body, and pastel rainbow-colored scales in soft pinks, purples, and blues. It is wearing a tiny white chef's hat. Its eyes are closed in joy with a big happy smile, and both arms are raised high in a victory pose while standing on tiptoes. Include celebratory effects like colorful confetti, sparkles, and small stars bursting around the character. Match the kawaii aesthetic of mascot_chibi_dragon_happy with thick black outlines, glossy polished finish, and soft gradients. Isometric-friendly 3/4 perspective, transparent background, high resolution.", "description": "A triumphant chibi dragon mascot celebrating victory with raised arms and confetti.", "subtype": "character", "aspect_ratio": [773, 1001], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "background_fantasy_meadow": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_fantasy_meadow_f043dab2-7da4-4880-936e-b01bca942a83.webp", "type": "image", "prompt": "Generate a 9:16 tall portrait-oriented background of an enchanted garden meadow in a cute chibi/kawaii aesthetic. The scene features soft pastel purples, pinks, and mint greens. Include whimsical elements: smiling clouds with faces, floating kawaii butterflies with big eyes, and tiny fairies. The foreground has soft grass and wildflowers with cute expressions and small glowing mushrooms with kawaii faces. Subtle rainbow arcs and magical sparkles fill the air. The composition is balanced with a clear, less-cluttered center area to accommodate a game UI. Thick outlines, bright cheerful colors, high resolution, professional game art style.", "description": "A whimsical, cute chibi-style enchanted meadow background with a soft pastel palette for a mobile cake decorating game.", "subtype": "background", "aspect_ratio": [1024, 1536], "compression_suggestion": "original", "duration_secs": null, "loop": null, "animation": null}, "decoration_chibi_unicorn": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_chibi_unicorn_fdffb81a-1ec8-40db-a22c-1424dc52b900.webp", "type": "image", "prompt": "Generate a cute chibi baby unicorn cake topper in a 3/4 isometric perspective. The unicorn should have a white pearlescent body, a sparkling gold spiral horn, and a flowing rainbow-colored mane and tail. Large kawaii eyes with sparkles, thick black outlines, and a glossy polished finish. Include magical sparkles around the horn. Styled to match 'mascot_chibi_dragon_happy' with rounded shapes and bright saturated pastel colors. Front-right facing, standing pose, transparent background, high resolution, game-ready sprite.", "description": "A cute chibi unicorn cake topper for the fantasy-themed cake decorating game.", "subtype": "object", "aspect_ratio": [761, 1177], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_chibi_dragon": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_chibi_dragon_9522f418-fa65-49f3-8435-9c95d1df0654.webp", "type": "image", "prompt": "Generate a cute chibi baby dragon cake topper, standing illustration in a 3/4 isometric view. The dragon has purple and teal scales, small wings, a curled tail, and large sparkling kawaii eyes with a friendly expression. Digital art in a kawaii aesthetic with thick black outlines, rounded shapes, and a glossy polished finish. The dragon is breathing tiny magical sparkles. High resolution, professional game asset, transparent background.", "description": "A cute chibi baby dragon cake topper in a fantasy art style for cake decoration.", "subtype": "object", "aspect_ratio": [659, 831], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_chibi_fairy": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_chibi_fairy_70e66d8c-a44a-475f-99ff-488818980805.webp", "type": "image", "prompt": "Generate a cute chibi fairy cake topper, full-body standing illustration in an isometric 3/4 view. The fairy has a tiny body, a large head, and large sparkly translucent butterfly wings. She is wearing a dress made of flower petals and holding a small magic wand with a star on top. Long flowing hair with tiny sparkles. Kawaii aesthetic with thick black outlines, bright pastel colors, and a glossy polished finish. Include a magical glow around the wand and wings. Transparent background, high resolution, game-ready sprite.", "description": "A cute chibi fairy cake topper in a fantasy art style for cake decoration.", "subtype": "object", "aspect_ratio": [705, 754], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_chibi_bunny": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_chibi_bunny_ba725032-98ab-41a5-995d-5874fa97b277.webp", "type": "image", "prompt": "Generate a full-body, front-right isometric view of a cute chibi magical baby bunny cake topper. The bunny has soft lavender pastel fur, long floppy ears with sparkly tips, and large sparkling kawaii eyes. It is wearing a tiny flower crown and holding a small glowing magic gem. Use a kawaii aesthetic with thick black outlines, soft pastel colors, and a glossy, polished finish with magical sparkles. Professional game asset, high resolution, clean edges, transparent background.", "description": "A cute chibi magical bunny cake topper in a fantasy style for cake decoration.", "subtype": "object", "aspect_ratio": [744, 1134], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_magic_wand": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_magic_wand_85c1b244-63ec-4482-b6f6-67cd1915f6fe.webp", "type": "image", "prompt": "Generate a high-quality, front-right isometric view of a cute magical wand cake topper. The wand features a metallic gold staff with an elegant glowing yellow star on top. Include sparkly pink and purple ribbons trailing from the star tip with magical glowing energy effects and floating sparkles. Use a kawaii fantasy art style with thick black outlines, bold saturated colors, and a glossy polished finish. Ensure a transparent background and clean edges, matching the aesthetic of existing chibi fantasy game assets.", "description": "A cute magical wand cake topper with a glowing star tip and sparkly ribbons in a fantasy kawaii style.", "subtype": "object", "aspect_ratio": [536, 911], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_chibi_pegasus": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_chibi_pegasus_32bdda80-43fd-4ce1-a366-56a8e02af291.webp", "type": "image", "prompt": "Generate a high-quality, full-body illustration of a cute chibi baby pegasus cake topper for a game. The pegasus has a white cream coat, large feathered wings spread gracefully, and a colorful flowing pastel rainbow mane and tail. Features large kawaii sparkling eyes. Style: Kawaii chibi aesthetic with thick black outlines, soft pastel colors, and a glossy polished finish. Include magical sparkle effects and small soft clouds at its feet. Isometric 3/4 view, standing pose, transparent background, clean edges, professional game asset.", "description": "A cute chibi pegasus cake topper with wings and a rainbow mane in a fantasy art style.", "subtype": "object", "aspect_ratio": [768, 1006], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_magic_mushroom": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_magic_mushroom_c3325efc-a5ef-42f1-a166-2b7595b6d56a.webp", "type": "image", "prompt": "Generate a cute chibi-style magical fantasy mushroom cake topper. The mushroom has a bright red cap with white glowing spots and a thick, cream-colored stem. Include magical floating sparkles and a soft glow around the cap. Isometric perspective, thick black outlines, bright saturated colors, glossy polished finish, kawaii aesthetic. Transparent background, high resolution, detailed game asset.", "description": "A cute, whimsical magical mushroom cake topper with glowing spots and a kawaii aesthetic.", "subtype": "object", "aspect_ratio": [846, 867], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_fantasy_butterfly": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_fantasy_butterfly_e5a398d0-aba9-49ad-8371-2dd934c6a768.webp", "type": "image", "prompt": "Generate a cute chibi-style magical butterfly cake topper, front-right isometric perspective. The butterfly has large spread wings with colorful pink and purple gradient patterns including small hearts and stars. It features a cute round body with kawaii eyes, thick black outlines, and a glossy finish. Add magical sparkles and a subtle glitter trail. Transparent background, high resolution, game-ready asset, matching the art style of mascot_chibi_dragon_happy.", "description": "A cute magical butterfly cake topper in a kawaii fantasy style for cake decoration.", "subtype": "object", "aspect_ratio": [809, 794], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_chibi_fox": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_chibi_fox_51a16ad2-df35-4cb9-bd0b-8ff59d4cb3a5.webp", "type": "image", "prompt": "Generate a full-body, front-facing isometric view of a cute chibi baby fox cake topper. The fox has an oversized head (60% of height), large sparkling purple eyes, and a tiny body in a sitting pose with a bushy white-tipped tail curled around. Use a kawaii fantasy art style with thick black outlines, vibrant orange and white fur, and glossy cel-shaded lighting. Include subtle magical sparkles and tiny autumn leaves around the character. High resolution, professional game asset, transparent background.", "description": "A cute chibi baby fox cake topper in a kawaii fantasy style for cake decoration.", "subtype": "object", "aspect_ratio": [682, 966], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_chibi_phoenix": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_chibi_phoenix_2bc90667-cae6-4a9f-9582-300debd7cd0f.webp", "type": "image", "prompt": "Generate a full-body, front-facing isometric view of an adorable baby phoenix cake topper. Chibi proportions with a large head and small body, soft rounded shapes, and big sparkly eyes with star-shaped highlights. Art style is kawaii fantasy with thick black outlines, glossy highlights, and magical sparkles. Color palette consists of pastel and warm sunset oranges, reds, and golds. Features fluffy flame-like feathers, tiny wings with gradient fire effects, and small tail feathers with magical ember particles. Include a subtle magical glow and a cheerful expression. Transparent background, high resolution, game-ready asset.", "description": "A cute chibi phoenix cake topper in a kawaii fantasy style for cake decoration.", "subtype": "object", "aspect_ratio": [743, 974], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_chibi_owl": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_chibi_owl_0d0f9ca3-6507-4f9f-9f4c-f84ad774c6a0.webp", "type": "image", "prompt": "Generate a full-body, isometric front-view of an adorable baby owl cake topper. The owl should have chibi proportions, a large round head, and enormous sparkly eyes. Use a kawaii fantasy art style with soft rounded shapes, thick black outlines, and glossy highlights. Color palette includes soft purples, blues, and whites with mystical sparkles and star/moon symbols on fluffy feathers. The owl is wearing a tiny wizard hat and has a gentle, wise expression. Transparent background, high resolution, game-ready asset.", "description": "A cute chibi magical owl cake topper in a kawaii fantasy style for cake decoration.", "subtype": "object", "aspect_ratio": [769, 1241], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_fantasy_crown": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_fantasy_crown_65938750-883f-41a8-814d-eab3eac7bd5f.webp", "type": "image", "prompt": "Generate a high-quality, professional game asset of a cute royal fantasy crown cake topper. The crown is golden with ornate points, featuring large colorful gemstones like ruby red and sapphire blue. Use a kawaii fantasy art style with thick black outlines, a glossy metallic sheen, and vibrant shimmering colors. Include magical star particles and a soft glow around the crown. Isometric front-facing view, full body standing illustration, transparent background.", "description": "A cute royal fantasy crown cake topper with jewels and magical sparkles in a kawaii style.", "subtype": "object", "aspect_ratio": [856, 1325], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_magic_crystal": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_magic_crystal_3b9d3ad0-f68a-4786-a6ea-90da7cbaeae9.webp", "type": "image", "prompt": "Generate a high-quality isometric front-view of a cluster of 3-5 colorful magical crystals as a cake topper. Kawaii fantasy art style with thick black outlines. The crystals should be in varying heights and pastel colors like amethyst purple, rose quartz pink, and aquamarine blue. Ensure a glossy, semi-transparent appearance with internal reflections, light refraction, and internal sparkles. Add magical particle effects and small star sparkles at the tips. The crystals should be joined at a geode-like base. Transparent background, clean professional game asset.", "description": "A cute magical crystal cluster cake topper in a kawaii fantasy style for cake decoration.", "subtype": "object", "aspect_ratio": [716, 911], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_fantasy_flower": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_fantasy_flower_6c4b2c8f-864d-4a6d-b91d-db55a6131128.webp", "type": "image", "prompt": "Generate a high-quality, front-facing isometric cake topper of a cute magical fantasy flower. The flower features 6 large rounded petals with pink-to-purple gradients, glossy highlights, and a cheerful kawaii face in the center with big eyes and rosy cheeks. Include thick black outlines, magical sparkles on petal tips, small green leaves at the base, and a soft glowing aura with floating star-shaped particles. Professional kawaii fantasy art style, clean edges, transparent background.", "description": "A cute magical fantasy flower cake topper with a kawaii face and sparkling petals for cake decoration.", "subtype": "object", "aspect_ratio": [840, 938], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "frosting_sparkle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_sparkle_191468de-0412-4481-9413-04a87ddf43b0.webp", "type": "image", "prompt": "Generate a high-quality isometric view of a round cake tier frosting texture overlay. The texture is a winter-themed 'diamond snowflake' style, featuring a prismatic and iridescent white surface with prominent diamond-shaped snowflake patterns. Incorporate a sparkling crystalline texture with subtle reflective hints of icy blue, lavender, and pure white to create a jewel-like appearance. The lighting should suggest light catching on faceted ice crystals. Ensure the perspective is a front-right isometric angle to match 'cake_tier_middle', with a clean edge and no shadows, suitable for a kawaii fantasy game asset.", "description": "A winter-themed diamond snowflake frosting texture with a prismatic, iridescent finish for an isometric cake tier.", "subtype": "other", "aspect_ratio": [1024, 956], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "frosting_galaxy": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_galaxy_720b88f8-c09c-4a9e-8de1-875351a2c462.webp", "type": "image", "prompt": "Transform the frosting in image 1 into a dramatic deep space nebula. Intensify the colors with deep purples, midnight blues, and blacks. Add prominent swirling nebula clouds in vibrant pink, cyan, and magenta. Scatter numerous tiny, glowing white and yellow star points throughout. Add visible cosmic dust clouds and smooth gradients. Maintain the isometric perspective, round cake tier shape, and ensure a transparent background. High resolution, magical fantasy game asset style.", "description": "An enhanced cosmic galaxy frosting texture with deep space colors and nebula swirls for an isometric cake tier.", "subtype": "other", "aspect_ratio": [1022, 961], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_aurora": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_aurora_04bdd977-b5a7-4fba-82a4-fe0b4e3f8764.webp", "type": "image", "prompt": "Generate a high-quality isometric cake tier frosting texture overlay. The texture should feature a prominent Arctic Aurora Borealis effect with flowing ribbons of ethereal light in soft cyan, turquoise, lavender, and pale blue-green. The surface should have a dreamy, glowing quality with shimmering iridescent light waves and subtle frost crystal patterns. Include a few tiny twinkling stars. The style is clean, polished, and magical fantasy, designed to fit perfectly on a round cake layer in isometric perspective. Transparent background around the texture, vibrant cool colors, high resolution.", "description": "An enhanced Arctic Aurora frosting texture overlay for an isometric cake tier featuring glowing Northern Lights.", "subtype": "other", "aspect_ratio": [1024, 962], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_fire": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_fire_1536f215-a855-4cc7-b14d-04ff75544626.webp", "type": "image", "prompt": "Transform the frosting in image 1 into more dramatic phoenix flames. Add prominent upward-flowing flame shapes and swirls with an intense color gradient from deep red and bright orange to yellow and white at the hottest points. Scatter small glowing ember particles throughout and increase the warm golden glow. Incorporate subtle feather-like patterns within the fire to suggest a phoenix connection. Maintain the isometric perspective, round cake tier shape, and ensure a transparent background. Fantasy kawaii game art style, high detail, magical and energetic.", "description": "An enhanced phoenix-themed fire frosting texture with dramatic upward-flowing flames and glowing embers for an isometric cake tier.", "subtype": "other", "aspect_ratio": [1020, 1014], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_magic_moon": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_magic_moon_ec2be448-25e9-4050-bf0d-d90d181a0e48.webp", "type": "image", "prompt": "Generate a high-quality, professional game asset of a cute chibi-style crescent moon cake topper. The moon has a peaceful, endearing kawaii face with closed eyes and a gentle smile. Features a prominent ethereal magical glow, floating stardust particles, and a shimmering pearlescent surface with subtle tiny star patterns. Front-right isometric perspective to match a cake decoration. Clean thick outlines, vibrant colors, fantasy aesthetic, transparent background.", "description": "A redesigned magical chibi crescent moon cake topper with an enhanced ethereal glow and pearlescent finish.", "subtype": "object", "aspect_ratio": [888, 1015], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_cute_ghost": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_cute_ghost_4fb0eeb2-e8e9-4c83-9205-849f2a4baa1d.webp", "type": "image", "prompt": "Generate a high-quality, front-right isometric view of a friendly chibi ghost cake topper. The ghost should have a classic rounded shape with a cute, expressive kawaii face (big eyes and a small smile). The body must have a translucent, ethereal appearance with a smooth blue-to-white gradient and a vibrant, mystical magical glow. Surround the ghost with floating magical sparkles and gentle flowing wisps to suggest floating motion. Clean, polished game-ready asset, transparent background, high resolution, professional digital art style matching a fantasy-themed cake decorating game.", "description": "A friendly chibi ghost cake topper with a vibrant magical glow and translucent ethereal effect.", "subtype": "object", "aspect_ratio": [808, 1212], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "frosting_moonlight": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_moonlight_2ec5bce7-6bc2-484c-b492-254c9990c0eb.webp", "type": "image", "prompt": "Generate a high-quality silvery-blue moonlight frosting texture overlay for an isometric round cake tier. The texture should feature a pale silver-blue base color (#E0F2FE) with a brand new pattern of soft, glowing moonbeam rays radiating across the surface. Include tiny twinkling star dots and subtle crescent moon shapes integrated into the design. The style is magical mermaid aesthetic, ethereal and luminous with a soft glow. Isometric perspective, designed to wrap naturally around a curved cake surface, flat lighting with no shadows, transparent background, professional game-ready asset.", "description": "A mystical silvery-blue moonlight frosting texture overlay for an isometric round cake tier with glowing moonbeams and stars.", "subtype": "other", "aspect_ratio": [955, 864], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_ocean": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_ocean_5e2fec59-1e4c-4b0a-90fa-75d64270332a.webp", "type": "image", "prompt": "Generate a high-quality frosting texture overlay for an isometric round cake tier. The design features a rich deep ocean blue base with flowing horizontal wave patterns and white foam crests. Include small rising bubble trails and subtle darker blue undertow swirls. The texture should have a magical mermaid aesthetic with dynamic water movement and depth gradients. Render with flat lighting, no shadows, on a transparent background, designed to wrap naturally around a curved isometric surface.", "description": "A deep ocean wave frosting texture overlay for an isometric cake tier with flowing horizontal patterns and white foam crests.", "subtype": "other", "aspect_ratio": [966, 859], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_magic_potion": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_magic_potion_63f524c9-35bd-4bfb-81f7-825a4ea0c3d4.webp", "type": "image", "prompt": "Generate a full-body, front-facing isometric view of a cute magical potion bottle cake topper. The bottle is round-bottomed with a tapered neck and a cork stopper, filled with glowing vibrant pink and purple liquid with tiny stars and bubbles inside. Include a simple kawaii face on the glass. Use a soft, rounded chibi fantasy art style with thick clean outlines and a whimsical aesthetic, matching the style of decoration_chibi_unicorn. The potion should have a magical pearlescent shimmer and floating sparkles around it. High resolution, professional game asset, transparent background.", "description": "A cute magical potion bottle cake topper in a kawaii fantasy style for cake decoration.", "subtype": "object", "aspect_ratio": [617, 1006], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_floating_lantern": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_floating_lantern_0e047da5-3642-4c82-aaf0-3db453310de4.webp", "type": "image", "prompt": "Generate a high-quality, full-body isometric view of a cute magical floating paper lantern cake topper. The lantern should be round with a warm golden-orange glow emanating from within, featuring subtle magical runes on the paper and a small decorative tassel hanging from the bottom. Surround it with soft magical sparkles and light particles. Use a kawaii fantasy art style with clean, bold outlines and soft shading to match a chibi aesthetic. Ensure a transparent background and a three-quarter perspective consistent with other game decorations.", "description": "A whimsical, glowing paper lantern cake topper in a kawaii fantasy style with warm golden light and magic sparkles.", "subtype": "object", "aspect_ratio": [820, 956], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "loading_screen_background": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/loading_screen_background_b1043856-031b-4ec4-be79-4e6badc43bb4.webp", "type": "image", "prompt": "Generate a 9:16 tall portrait-oriented loading screen background for a magic cake game. The image features a soft dreamy pastel gradient flowing from lavender purple at the top to gentle pink in the middle and warm golden peach at the bottom. Scattered throughout are floating magical sparkles, twinkling 4-point stars, and soft glowing bokeh particles. Include wispy magical swirls and light trails in purple and pink tones. The center area should be relatively clear and open, with decorative elements framing the edges and corners. Add very faint, subtle silhouettes of cake tiers at the bottom and light rays radiating from the center. High resolution, whimsical fantasy kawaii art style, soft and inviting mood, professional quality.", "description": "A whimsical fantasy loading screen background with a soft pastel gradient and magical sparkles for 'Enchanted Frosting'.", "subtype": "background", "aspect_ratio": [1024, 1536], "compression_suggestion": "original", "duration_secs": null, "loop": null, "animation": null}, "background_heart_butterfly_pink": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_heart_butterfly_pink_4034f15c-f436-43f9-8232-bebc022b3fdd.webp", "type": "image", "prompt": "Generate a full-body, front-view chibi butterfly with large, symmetrical heart-shaped wings. The wings should be a vibrant pink gradient with white highlights and small magical sparkles. The body is small and rounded with a simple kawaii face, dot eyes, and a tiny smile. Antennae should have small heart tips. Use a fantasy kawaii aesthetic with thick clean outlines and a gentle shimmer effect. Transparent background, high resolution, professional game asset style.", "description": "A cute kawaii butterfly with prominent heart-shaped wings and a chibi body for background decoration.", "subtype": "other", "aspect_ratio": [935, 802], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "background_heart_butterfly_purple": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_heart_butterfly_purple_124bdb98-de12-4759-b38f-2b6b42bf919f.webp", "type": "image", "prompt": "Generate a cute chibi butterfly with large, prominent heart-shaped wings in a front-view pose with wings spread wide. The wings should be a clear symmetrical heart shape with a purple and lavender gradient, decorated with small magical sparkles and a gentle shimmer. The body is small and round with a kawaii face, simple dot eyes, and a small smile, featuring antennae with heart tips. Use a fantasy kawaii aesthetic with soft mystical colors, thick clean outlines, and a gentle magical glow. Match the exact style and proportions of image 1 but use purple and violet tones. Transparent background.", "description": "A purple variant of the kawaii heart-winged butterfly for fantasy background decoration.", "subtype": "other", "aspect_ratio": [1022, 877], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "background_heart_butterfly_blue": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_heart_butterfly_blue_469a2dd2-c821-4edd-844f-5919186e85c8.webp", "type": "image", "prompt": "Generate a full-body, front-view illustration of a cute chibi butterfly with prominent heart-shaped wings. The wings are a sky blue and turquoise gradient with icy crystalline sparkles and white highlights. Small, round central body with a kawaii face, dot eyes, and a small smile. Antennae have tiny star tips. Style is fantasy kawaii with thick clean outlines and a gentle glow. Match the style, proportions, and pose of image 1 and image 2 but with blue and cyan coloring. Transparent background.", "description": "A blue variant of the kawaii heart-shaped butterfly for the fantasy game background.", "subtype": "other", "aspect_ratio": [1023, 870], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_snowflake": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_snowflake_3201ee60-830d-4143-b2cd-dc2af94479da.webp", "type": "image", "prompt": "Generate a standalone, front-view cute winter-themed snowflake cake topper. The snowflake should be a single, symmetrical six-pointed ice crystal with a soft magical cyan glow and thick, clean dark blue outlines. Styled as a high-quality 2D game asset, polished and glossy, suitable for an isometric cake decoration. Transparent background, high resolution, professional digital art style.", "description": "A cute, winter-themed snowflake cake topper with a magical glow for the decorations palette.", "subtype": "object", "aspect_ratio": [740, 834], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_snowman": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_snowman_e96e2ea1-518d-410c-8ce5-9477aa3fd738.webp", "type": "image", "prompt": "Generate a full-body, front-facing chibi snowman cake topper in an isometric perspective. The snowman should consist of three stacked snowballs with soft rounded shapes, a kawaii face with black button eyes and a small orange carrot nose. It is wearing a bright red and white striped winter scarf and a small black top hat. The snowman has tiny twig arms in a cheerful pose. Use a clean cartoon style with thick outlines, soft blue and purple shading for dimension, and a polished game-ready finish. High resolution, transparent background, magical winter party aesthetic.", "description": "A cute chibi snowman cake topper with a winter scarf and hat for cake decoration.", "subtype": "object", "aspect_ratio": [616, 917], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_candy_cane": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_candy_cane_4c885e00-c1d7-44dd-9e2c-848d3ba68374.webp", "type": "image", "prompt": "Generate a professional game asset of a cute, cartoonish candy cane cake topper. The candy cane has a classic hook shape with bold red and white spiral stripes. It features a glossy, shiny surface with bright highlight reflections and thick clean cartoon outlines. The proportions are slightly chunky and oversized for a kawaii aesthetic. Isometric perspective, front-right view, high resolution, detailed textures, transparent background, magical festive sparkles, matching the visual style of a fantasy cake decorating game.", "description": "A cute, cartoonish red and white candy cane cake topper in isometric perspective.", "subtype": "object", "aspect_ratio": [665, 1006], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_ice_crystal": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_ice_crystal_0c383b11-f43f-4a65-bba7-a5b471f1abe6.webp", "type": "image", "prompt": "Generate a professional quality, game-ready cake topper of a cute, sparkling ice crystal cluster. The asset features 3-5 sharp, geometric hexagonal ice crystals of varying sizes in a cluster. Use a translucent ice-blue and white color palette with internal magical glow and strong refraction effects. Include faceted surfaces for depth and thick cartoon outlines consistent with a kawaii fantasy art style. Add light rays and star sparkles emanating from the crystals. Isometric perspective, front-view, transparent background, high resolution, detailed texture similar to decoration_magic_crystal but with a winter theme.", "description": "A sparkling magical ice crystal cluster cake topper in isometric perspective for a winter-themed cake.", "subtype": "object", "aspect_ratio": [812, 1046], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_pine_tree": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_pine_tree_ee423a10-8966-4e53-8372-992155e1c432.webp", "type": "image", "prompt": "Generate a cute, cartoonish snow-covered pine tree cake topper in isometric perspective. The tree is a stylized dark green evergreen with thick clumps of white snow on the branches and a small yellow star on top. Feature thick bold outlines, soft cel-shading for 3D depth, and a glossy finish consistent with a high-quality game asset. Ensure a clean, transparent background and a kawaii aesthetic that matches a festive winter party theme.", "description": "A cute, cartoonish snow-covered pine tree cake topper for a winter wonderland theme.", "subtype": "object", "aspect_ratio": [852, 1389], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_hot_cocoa": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_hot_cocoa_04a73822-d133-41fd-81bb-3fec3f9542ca.webp", "type": "image", "prompt": "Generate a high-quality isometric view of a cute, cartoonish hot cocoa mug cake topper. The mug is a festive red with white snowflake patterns and features a simple, happy kawaii face with blushing cheeks. The mug is filled with rich brown hot chocolate, topped with fluffy white whipped cream and mini marshmallows. A small candy cane stir stick is tucked into the side. Include soft steam wisps rising from the top. The style should have thick, clean cartoon outlines, bold colors, and soft shading to match a 2D isometric game aesthetic. Transparent background, professional game asset.", "description": "A cute, cartoonish hot cocoa mug cake topper with a kawaii face for a winter-themed cake.", "subtype": "object", "aspect_ratio": [839, 1092], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_mittens": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_mittens_792a517f-cad7-4949-9061-6333da18f1f1.webp", "type": "image", "prompt": "Generate a pair of cute cartoonish winter mittens connected by a colorful yarn string, designed as a cake topper. Isometric perspective (front-right angle), kawaii chibi art style with thick bold outlines. The mittens feature bright red and white festive snowflake patterns with fluffy white wool cuffs. Soft textures, cheerful and cozy appearance. High resolution, professional game asset, transparent background, matching the style of decoration_snowman and decoration_candy_cane.", "description": "A pair of cute, cartoonish winter mittens connected by a string as an isometric cake topper.", "subtype": "object", "aspect_ratio": [623, 1063], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_icicle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_icicle_0f2e5948-a7eb-405b-b893-13258f102003.webp", "type": "image", "prompt": "Generate a cluster of 3-5 crystalline icicles of varying lengths, viewed from a front-right isometric perspective. Use a kawaii chibi art style with thick, clean outlines and a translucent appearance. The icicles should be light blue and white with a magical frozen shimmer, pearlescent highlights, and glowing star sparkles. The overall feel should be elegant and enchanting, designed as a cake topper on a transparent background. High resolution, professional game asset quality, matching the style of decoration_ice_crystal.", "description": "A cluster of magical, translucent icicles for a winter-themed cake topper.", "subtype": "object", "aspect_ratio": [742, 969], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "background_winter_wonderland": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_winter_wonderland_58ddd7ce-2713-4d92-a413-733b47c56848.webp", "type": "image", "prompt": "Generate a 9:16 tall image of a whimsical winter wonderland background for a mobile game. The scene features a soft, pastel winter color palette with light blues, whites, and pale purples. Design a snowy landscape with gentle hills and snow-covered ground at the bottom under a dreamy gradient sky transitioning from pale blue to soft pink twilight. Include gentle falling snowflakes of various sizes and soft bokeh lights to create a magical atmosphere. The style should be clean, cartoonish, and cute to match a kawaii aesthetic, with very subtle details to ensure the foreground cake remains the focus. No characters or large distracting objects. High resolution, professional game-ready background.", "description": "A whimsical, portrait-oriented winter wonderland background for a mobile cake decorating game featuring a soft pastel snowy landscape.", "subtype": "background", "aspect_ratio": [1024, 1536], "compression_suggestion": "original", "duration_secs": null, "loop": null, "animation": null}, "decoration_penguin": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_penguin_1578869d-7372-4259-bd10-6e8f7b758fd2.webp", "type": "image", "prompt": "Generate a high-quality, professional game asset of a cute chibi baby penguin cake topper. The penguin should be in an isometric front-right perspective, featuring large expressive kawaii eyes with sparkles, rosy cheeks, and a happy smile. It is wearing a vibrant red and blue striped winter scarf with visible knit texture. Classic black and white penguin feathers with small orange feet and beak. The art style must feature thick, bold outlines and clean, flat-shaded colors to match a cartoon aesthetic. Transparent background, shadowless, standing illustration, vibrant and playful winter wonderland theme.", "description": "A cute chibi penguin cake topper with a colorful winter scarf in isometric perspective.", "subtype": "object", "aspect_ratio": [618, 930], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_reindeer": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_reindeer_82a69894-a91e-4c42-9380-3c5a0da5020e.webp", "type": "image", "prompt": "Generate a full-body, front-view chibi reindeer cake topper in an isometric perspective. The focal point is a very large, bright, and vibrant red glowing nose with a luminous aura suggesting it is shining. The reindeer has a cute, kawaii expression, tiny antlers, and is wearing a cozy striped winter scarf. Clean, polished game-ready asset with thick outlines, high resolution, and a transparent background. Match the established winter wonderland art style of the existing game assets.", "description": "A cute chibi reindeer cake topper featuring a prominent, glowing red Rudolph nose and a festive winter scarf.", "subtype": "object", "aspect_ratio": [830, 1247], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_gingerbread": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_gingerbread_5c3e4528-ce4e-4060-b7a1-8ec74c4abb3a.webp", "type": "image", "prompt": "Generate a full-body, front-right isometric view of a chibi/kawaii gingerbread person cookie cake topper. Classic golden-brown baked cookie texture with thick, bold outlines and a simple rounded silhouette. Features large expressive sparkling eyes, rosy cheeks, and a cheerful smile. Detailed with white frosting patterns on the cuffs and wavy edges, and colorful red and green gumdrop buttons. The style should be sweet, friendly, and festive, matching a winter wonderland theme. Professional game asset, high resolution, transparent background.", "description": "A cute, cartoonish gingerbread person cake topper in a winter wonderland kawaii style for cake decoration.", "subtype": "object", "aspect_ratio": [927, 1381], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_polar_bear": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_polar_bear_05c7f01d-cc1c-4520-b644-cf668c276868.webp", "type": "image", "prompt": "Generate a high-quality, full-body illustration of a chibi kawaii baby polar bear cub as a cake topper. Isometric front-right perspective. The bear has large expressive sparkling eyes, a small black nose, rosy cheeks, and a tiny cute smile. Chubby rounded body proportions, fluffy white fur with soft shading, and small round ears. The bear is wearing a small colorful winter scarf. Thick bold outlines, clean cartoon style, transparent background. Match the artistic style of decoration_penguin and decoration_reindeer.", "description": "A cute, cartoonish polar bear cub cake topper in a winter wonderland kawaii style for cake decoration.", "subtype": "object", "aspect_ratio": [687, 890], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "mascot_winter_reindeer_happy": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_winter_reindeer_happy_1e771749-09be-4493-8903-c99117486e9d.webp", "type": "image", "prompt": "Generate a full-body, front-facing illustration of a cheerful chibi winter reindeer mascot. The character should have a large head, an adorable bright red nose, and big sparkling eyes with a warm, happy smile. It is wearing a festive red and white striped winter scarf. The art style is kawaii with smooth rounded shapes, thick clean outlines, and soft professional shading. Soft brown fur with a cream belly. Include subtle magical sparkles around the character. High resolution, game-ready character design on a transparent background, matching the cute aesthetic of decoration_reindeer.", "description": "A cheerful chibi winter reindeer mascot character with a red nose and festive scarf to guide and encourage players.", "subtype": "character", "aspect_ratio": [805, 1218], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "mascot_winter_reindeer_excited": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_winter_reindeer_excited_91cf3447-992c-4bdb-9bd4-48211807085c.webp", "type": "image", "prompt": "Generate a full-body, front-facing illustration of the cute chibi winter reindeer from mascot_winter_reindeer_happy with an excited 'WOW' expression. The reindeer should have very wide sparkling eyes, eyebrows raised high, and a big open mouth showing enthusiasm. Maintain the same character design: bright red nose, small snowy antlers, and a red and white striped winter scarf. The pose should be dynamic and bouncy with raised hooves. Include small magical sparkles and stars around the character to convey high energy. Kawaii chibi art style with thick outlines, smooth rounded shapes, and soft professional shading. Transparent background.", "description": "An excited and enthusiastic chibi winter reindeer mascot with sparkling eyes and a 'WOW' expression.", "subtype": "character", "aspect_ratio": [735, 1041], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "mascot_winter_reindeer_surprised": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_winter_reindeer_surprised_baf9e7df-8dee-4e87-9ee8-59cfdaa3674f.webp", "type": "image", "prompt": "Generate a surprised, startled cute chibi winter reindeer mascot character for a cake decorating game, front-facing isometric perspective. The character has a big bright red nose, extremely wide and round sparkling eyes, raised eyebrows, and a small 'O' shaped mouth expressing astonishment. Wearing a festive red and white striped winter scarf, soft brown fur, and small antlers with a light dusting of snow. The pose is slightly leaning back with small hooves raised in surprise. Use a kawaii aesthetic with smooth rounded shapes, thick outlines, and soft shading. High quality, game-ready illustration on a transparent background, matching the style of mascot_winter_reindeer_happy.", "description": "A surprised chibi winter reindeer mascot with wide eyes and an 'O' shaped mouth, matching the game's festive art style.", "subtype": "character", "aspect_ratio": [739, 1074], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "mascot_winter_reindeer_celebrating": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_winter_reindeer_celebrating_20bbff7f-14e7-4b06-b2b1-d5b0010045f9.webp", "type": "image", "prompt": "Generate a full-body, front-facing isometric illustration of the cute chibi winter reindeer from image 1 in a triumphant celebration pose. The reindeer has a bright red nose, soft brown fur, a cream belly, and wears a red and white striped scarf. Its eyes are closed in happy crescents of pure joy, with a huge enthusiastic smile. Both hooves are raised high in a victory gesture. Surround the character with festive confetti, magic sparkles, and small floating stars. Maintain the kawaii aesthetic with thick outlines, smooth rounded shapes, and soft shading on a transparent background. Match the exact character design and art style of mascot_winter_reindeer_happy.", "description": "A triumphant, celebrating chibi winter reindeer mascot in a victory pose for game completion.", "subtype": "character", "aspect_ratio": [656, 928], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "background_snowflake": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_snowflake_2289f724-2007-46e3-a48f-5502c7070450.webp", "type": "image", "prompt": "Generate a single, high-resolution six-pointed ice crystal snowflake. The design must feature symmetrical branches radiating from a central hexagonal core, using solid, elegant geometric crystal shapes rather than thin lines or sticks. The snowflake should have a semi-transparent, ethereal appearance with a soft inner glow and dimensional crystalline structure. Pure white color, clean edges, and a magical winter aesthetic. High quality, professional game asset, centered on a transparent background.", "description": "A delicate, six-pointed solid ice crystal snowflake for ambient background animation in the winter wonderland theme.", "subtype": "other", "aspect_ratio": [779, 918], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_snowglobe": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_snowglobe_b53e4b10-e74a-4eaf-beaa-4a846f6db617.webp", "type": "image", "prompt": "Generate a high-quality, front-right isometric view of a cute cartoonish snow globe cake topper. The globe is round glass with shimmering highlights, sitting on a decorative gold base. Inside the globe is a tiny snow-covered pine tree and floating snowflakes. Use a kawaii aesthetic with thick outlines, soft pastel winter colors, and a glossy finish. Professional game asset, transparent background, matching the style of decoration_pine_tree and decoration_snowman.", "description": "A cute, cartoonish snow globe cake topper in a kawaii winter style for cake decoration.", "subtype": "object", "aspect_ratio": [629, 808], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_ice_skates": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_ice_skates_273ce02f-089d-4e4b-aad2-422845fcf991.webp", "type": "image", "prompt": "Generate a pair of cute white figure ice skates tied together by their laces as a cake topper. Isometric front-right perspective, white boots with light blue accents and shiny silver metallic blades. The laces are tied in a neat bow at the top. Kawaii aesthetic with thick outlines, glossy finish, and subtle magical sparkles. High-quality game asset, transparent background, matching the festive winter wonderland art style of other cake decorations.", "description": "A pair of cute, cartoonish ice skates cake topper in a kawaii winter style for cake decoration.", "subtype": "object", "aspect_ratio": [814, 1074], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_ornament": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_ornament_c4b5b0e1-a418-4b6b-a280-37bef27b0775.webp", "type": "image", "prompt": "Generate a cute, ultra-glossy holiday ornament ball cake topper, ice blue and silver colors with a delicate snowflake pattern. High-shine reflective surface with metallic cap and loop at the top. Kawaii winter aesthetic, thick outlines, professional game asset, isometric front perspective, transparent background, high resolution, detailed magical shimmer.", "description": "A shiny holiday ornament ball cake topper in a kawaii winter style for cake decoration.", "subtype": "object", "aspect_ratio": [802, 1407], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_holly": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_holly_912eb554-48a8-4fd6-8a43-71a38feac61b.webp", "type": "image", "prompt": "Generate a festive holly sprig cake topper, featuring 3 glossy green leaves with pointed edges and a cluster of 3 bright red berries. High-quality game asset, cute kawaii cartoon style with thick bold outlines and a glossy finish. Isometric front-right perspective. The berries should have prominent white highlights. Professional digital art, vibrant holiday colors, transparent background.", "description": "A festive holly sprig cake topper with glossy red berries and green leaves in a kawaii winter style.", "subtype": "object", "aspect_ratio": [915, 769], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_cardinal": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_cardinal_99f66329-12a9-48d4-b4f9-2fa90f55ea78.webp", "type": "image", "prompt": "Generate a full-body, isometric side-view of a cute chibi red cardinal bird cake topper. The bird has bright red plumage, a small black face mask, a distinctive crest, and a fluffy round body. Tiny orange beak and small round black eyes with sparkles. Perched on a small simple branch. High-quality game asset, cute cartoon style with thick outlines, soft feather texture, festive winter theme, transparent background.", "description": "A cute chibi red cardinal bird cake topper in a winter kawaii style for cake decoration.", "subtype": "object", "aspect_ratio": [880, 1290], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_sleigh_bell": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_sleigh_bell_d98b0910-3a28-4eb2-a09f-7da039999069.webp", "type": "image", "prompt": "Generate a professional quality, game-ready cake topper of a shiny golden sleigh bell. The bell is round with a metallic golden finish, featuring a small clapper at the bottom opening and a festive red ribbon bow tied at the top. Use a cute cartoon style with thick outlines and a glossy metallic finish. The aesthetic should be kawaii and magical to match a winter theme. Isometric front-right perspective, full body illustration, transparent background.", "description": "A shiny golden sleigh bell cake topper in a kawaii winter style with a festive ribbon.", "subtype": "object", "aspect_ratio": [782, 965], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_winter_scarf": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_winter_scarf_2a7e04eb-bac2-4273-8384-b57513febe38.webp", "type": "image", "prompt": "Generate a full-body, isometric front-right view of a cozy knitted winter scarf cake topper. The scarf features a soft, fluffy knit texture with red and white horizontal stripes and fringed tassels at both ends. Designed in a cute kawaii cartoon style with thick outlines and a festive winter theme. The scarf should have a gentle draped, flowing shape. High-quality game asset, transparent background, soft inviting colors, no shadows.", "description": "A cozy, striped knitted winter scarf cake topper in a kawaii style with thick outlines.", "subtype": "object", "aspect_ratio": [911, 1289], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_icicle_lights": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_icicle_lights_9df5570d-5cc1-4947-bb27-ee4212799b14.webp", "type": "image", "prompt": "Generate a cute cartoon-style cake topper of a string of decorative icicle lights. The asset features 3-4 translucent icicle-shaped light bulbs hanging at varying lengths from a thin white wire. Use cool winter colors like ice blue and bright white with a glowing, sparkling effect. Maintain thick outlines, a glossy finish, and a kawaii aesthetic consistent with a winter wonderland theme. Isometric front-right perspective, transparent background, high resolution, professional game asset.", "description": "A string of decorative icicle-shaped LED lights for cake topping with a magical winter glow.", "subtype": "object", "aspect_ratio": [857, 692], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "frosting_frostbite": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_frostbite_03764900-ce7c-4490-8773-0024cf646770.webp", "type": "image", "prompt": "Generate a high-quality game asset of a deep blue 'Frostbite' frosting texture overlay for a round cake tier. Perspective: front-right isometric view. The style is a winter wonderland theme with intense cold aesthetics. Use a color palette of navy, cobalt, and royal blue with sharp white ice crystal shards and geometric frost patterns. The texture should look like a powerful deep freeze from the heart of a blizzard. Flat even lighting, no shadows, transparent background. The shape must naturally wrap around a circular isometric cake form, matching the curvature of existing cake tiers.", "description": "An intense, deep blue frozen frosting texture overlay for an isometric cake tier with sharp ice crystals.", "subtype": "other", "aspect_ratio": [1008, 870], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_glacier": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_glacier_d1ef0b46-f55b-46af-9106-b17770eab246.webp", "type": "image", "prompt": "Generate a game-ready frosting texture overlay for a round cake tier in isometric front-right perspective. The style is 'pale glacier' with ancient ice formations, featuring a color palette of powder blue, ice blue, and nearly white tints. Include subtle layered ice textures, delicate cracks, and translucent ethereal effects. The lighting should be flat and even with no shadows. The texture must wrap naturally around a circular cake form, presented on a transparent background, high resolution, professional quality.", "description": "A pale, glacial ice frosting texture overlay for an isometric round cake tier with ancient ice patterns.", "subtype": "other", "aspect_ratio": [1023, 962], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_blizzard": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_blizzard_6a2681d7-7091-4e03-9fbb-b10ecd23130d.webp", "type": "image", "prompt": "Generate a high-quality frosting texture overlay for a round isometric cake tier. The theme is a swirling blizzard with a white base and light blue wind streaks. The texture should feature dynamic, wind-blown snow patterns and circular swirls suggesting motion. Isometric front-right perspective, flat lighting, no shadows, transparent background. The design should wrap naturally around a circular cake form, matching the style of existing frosting assets.", "description": "A swirling blizzard-themed frosting texture overlay for an isometric cake tier with wind-blown snow patterns.", "subtype": "other", "aspect_ratio": [1024, 962], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_winternight": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_winternight_19946fa6-f6f2-482f-9ca9-df5a14b6cb48.webp", "type": "image", "prompt": "Generate a high-quality frosting texture overlay for a round cake tier in isometric front-right perspective. The theme is a winter night sky with a deep midnight blue and navy base. The surface is decorated with scattered tiny white twinkling stars and subtle, ethereal hints of purple and green aurora borealis. The texture should wrap naturally around a circular cake form. Use flat, even lighting with no shadows, consistent with a clean game asset. Transparent background, professional digital art style.", "description": "A midnight winter night frosting texture overlay for a round isometric cake tier with starry patterns.", "subtype": "other", "aspect_ratio": [1024, 962], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_crystalice": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_crystalice_2923d305-3bd9-4065-9602-46d35d78dd80.webp", "type": "image", "prompt": "Generate a high-quality isometric front-right view texture overlay of crystal ice frosting for a round cake tier. The style is clean, polished, and game-ready for a winter wonderland theme. The frosting features ultra-clear whites and very pale blues with subtle prismatic rainbow refractions. Incorporate perfect hexagonal ice crystal patterns and geometric facets resembling cut diamonds. Flat even lighting, no shadows, transparent background. The texture should wrap naturally around a circular cake form, matching the perspective of cake_tier_bottom.", "description": "An ultra-clear crystal ice frosting texture overlay for an isometric round cake tier with prismatic geometric patterns.", "subtype": "other", "aspect_ratio": [981, 828], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_blue_jay": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_blue_jay_56e4cb89-6c2d-4849-9df6-e996423d2d31.webp", "type": "image", "prompt": "Generate a full-body, front-facing illustration of an adorable chibi blue jay bird cake topper. The bird has a plump, round body with vibrant royal blue plumage, a white chest, and a distinct blue crest. Large sparkling black kawaii eyes with white highlights and soft pink blush marks. Wings are slightly spread and clearly visible for animation. Thick black outlines, clean cel-shaded style, and a cheerful expression. Designed in a professional kawaii game asset style with a transparent background, matching the isometric perspective of existing cake decorations.", "description": "A cute chibi blue jay bird cake topper in kawaii winter style for cake decoration.", "subtype": "object", "aspect_ratio": [908, 1417], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_arctic_fox": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_arctic_fox_67ce2512-45d2-4767-b98f-899f3198c3f6.webp", "type": "image", "prompt": "Generate a high-quality, full-body front-view illustration of a cute chibi Arctic fox cake topper. The fox has fluffy white fur with soft light-blue shading, oversized sparkling eyes, a small black nose, and a bushy tail. It is sitting in a friendly pose. Art style: Kawaii cartoon with thick clean outlines, soft shading, and a magical winter aesthetic. Use a color palette of pure white, light cream, and soft blue accents. Match the style of decoration_penguin and decoration_polar_bear. Transparent background, game-ready asset, isometric perspective.", "description": "A cute chibi Arctic fox cake topper with fluffy white fur and a friendly expression for the Winter Wonderland theme.", "subtype": "object", "aspect_ratio": [675, 795], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_gift_box": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_gift_box_2e4112a3-8be0-4b29-988b-6dd57a9e7959.webp", "type": "image", "prompt": "Generate a professional quality, full-body isometric view of a cute kawaii gift box cake topper. The gift box is wrapped in light blue and lavender paper with white snowflake patterns and a large, fluffy silver ribbon bow on top. Cartoon style with thick outlines, glossy finish, and subtle magical sparkles. High contrast, festive celebratory appearance, transparent background, matching the art style of decoration_ornament and decoration_snowglobe.", "description": "A cute, festive winter-themed gift box cake topper with a fluffy bow and snowflake patterns.", "subtype": "object", "aspect_ratio": [664, 988], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_wreath": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_wreath_994f68bc-6a78-421a-957c-afbbf4159012.webp", "type": "image", "prompt": "Generate a high-quality, front-facing kawaii winter wreath cake topper. The wreath is a circular arrangement of stylized deep green evergreen branches with a thick cartoon outline. Features include a large, cute red ribbon bow at the bottom, small red berries, and a light dusting of white snow with tiny simplified snowflakes. Use a clean, polished game-ready aesthetic with bold outlines and a glossy finish. Isometric perspective, transparent background, matching the art style of decoration_holly and decoration_pine_tree.", "description": "A festive, kawaii-style winter evergreen wreath cake topper with a red bow and snow dusting.", "subtype": "object", "aspect_ratio": [760, 827], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_winter_boots": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_winter_boots_a82820b7-e8d8-4e9c-93bb-2fdb13bc8555.webp", "type": "image", "prompt": "Generate a pair of cozy winter snow boots cake topper, side by side, in a cute chibi kawaii style. The boots are warm red with fluffy white fur trim and small snowflake patterns. Isometric 3/4 view to match a cake tier, thick bold outlines, soft even lighting with glossy highlights. High resolution, professional game asset, transparent background. Must match the artistic style of decoration_snowman and decoration_reindeer.", "description": "A pair of cute, cartoonish winter boots cake topper in a kawaii winter style for cake decoration.", "subtype": "object", "aspect_ratio": [741, 730], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_sled": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_sled_d722d201-9489-47f3-8bd5-16c407b4533d.webp", "type": "image", "prompt": "Generate a professional quality, game-ready isometric 3/4 view illustration of a cute wooden sled cake topper. The sled should be a classic toboggan style with curved silver runners, natural wood slats, and a red rope handle. Use a kawaii winter wonderland aesthetic with thick bold black outlines and a soft glossy finish. Ensure even lighting with gentle highlights on the metal parts. Style must match decoration_snowman and decoration_reindeer. Transparent background.", "description": "A cute cartoonish wooden sled cake topper in a kawaii winter style with an isometric perspective.", "subtype": "object", "aspect_ratio": [820, 523], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_igloo": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_igloo_131cc897-75e7-4e4d-ad6e-73042caaa82e.webp", "type": "image", "prompt": "Generate a cute, cartoonish snow igloo cake topper in a kawaii winter style. The igloo is a dome-shaped structure made of visible ice blocks with an arched doorway showing a warm yellow glow from inside. Use an isometric 3/4 front view. Art style features thick, bold black outlines, soft blue shading, and gentle glossy highlights on the ice surfaces. High-quality game asset, transparent background, matching the style of a chibi snowman and polar bear.", "description": "A cute, isometric ice igloo cake topper with a cozy glow for the Winter Wonderland theme.", "subtype": "object", "aspect_ratio": [738, 707], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_pearl": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_pearl_847db22a-c83d-447e-95e8-f3861835d5ae.webp", "type": "image", "prompt": "Generate a high-quality, game-ready iridescent pearl white frosting texture overlay for a round cake tier. The texture features a luminous pearl white base with a glossy, mother-of-pearl sheen and subtle circular ripples. Include a delicate rainbow shimmer with pink, blue, and gold highlights and tiny scattered sparkle points. The perspective is a 30-degree isometric view (front-right angle) designed to wrap around a circular cake surface. Ensure a soft gradient fade at the edges for seamless blending and a completely transparent background.", "description": "An elegant iridescent pearl white frosting texture overlay for an isometric round cake tier with a mermaid theme.", "subtype": "other", "aspect_ratio": [1176, 934], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_aquamarine": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_aquamarine_39d85527-9204-40f5-9944-8a8c3ce5f6da.webp", "type": "image", "prompt": "Generate a high-quality game asset of an isometric round cake tier frosting texture. The texture should look like brilliant aquamarine gemstone (#7FFFD4) with turquoise highlights. The surface must feature a geometric pattern of hexagonal crystal facets with sharp, prismatic edges and glossy reflections. The shape should be a curved overlay suitable for a 3D isometric cylinder, showing a front-right angle (~30 degrees). Bright, crystalline lighting with gem-like sparkles. Transparent background, soft gradient fade at the edges for seamless blending onto a cake model.", "description": "A brilliant aquamarine gemstone frosting texture overlay for an isometric round cake tier with hexagonal facets.", "subtype": "other", "aspect_ratio": [801, 790], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "frosting_shell": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_shell_b6f5b229-f5a3-4449-81a6-d2236341be49.webp", "type": "image", "prompt": "Generate a game-ready frosting texture overlay for a round isometric cake tier. The texture should feature a warm cream and beige seashell pattern inspired by a nautilus or conch shell. Design with concentric spiral ridges and smooth curved lines flowing from the center. High-quality smooth surface with a soft pearlescent sheen and organic growth lines. Viewed from a front-right isometric perspective (~30 degrees). The asset must be on a transparent background with soft gradient edges for seamless blending onto a cake model. High resolution, clean game art style.", "description": "A warm cream seashell-textured frosting overlay with spiral ridges for an isometric cake tier.", "subtype": "other", "aspect_ratio": [789, 725], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "frosting_seaweed": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_seaweed_b513eeda-8fc9-4c13-b837-f87a034e0c2c.webp", "type": "image", "prompt": "Generate a high-quality isometric round cake tier frosting texture overlay. The texture should be a rich seaweed green (#2E8B57) with deep forest green tones. Feature a pattern of flowing kelp strands, overlapping wavy seaweed ribbons, and detailed leaf veins. The surface should look like smooth frosting with raised organic kelp patterns. Maintain a front-right isometric perspective (~30 degrees). The edges should have a soft gradient fade for seamless blending onto a cake model. Transparent background, game-ready asset, clean and polished fantasy mermaid aesthetic.", "description": "A rich seaweed green frosting texture overlay with flowing kelp patterns for an isometric cake tier.", "subtype": "other", "aspect_ratio": [1023, 957], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "frosting_starfish": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_starfish_aeb69f3c-45f3-48e6-91f1-ec89af6dca62.webp", "type": "image", "prompt": "Generate a high-quality isometric view of a round cake tier frosting overlay. The texture is a golden orange (#FFD700) with a bumpy, dotted surface resembling starfish skin. Include small raised tubercles and subtle organic star shapes distributed across the surface. The lighting should be warm, highlighting the 3D texture and raised details. The asset must have a transparent background and soft gradient fades at the edges to allow it to wrap seamlessly around a circular cake tier in a mermaid-themed game. Clean, polished, game-ready asset, isometric front-right perspective.", "description": "A golden starfish-themed bumpy frosting texture overlay for an isometric round cake tier.", "subtype": "other", "aspect_ratio": [870, 829], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "frosting_tide": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_tide_642c4e8a-5dbe-449a-8f97-ea974d595b93.webp", "type": "image", "prompt": "Generate a high-quality isometric cake frosting texture overlay. The texture should be a medium tidal blue (#4682B4) with steel blue tones, featuring horizontal flowing wave patterns and white foam crests. The design should look like fluid, flowing water with smooth wave lines and ripples wrapping around a circular cake tier. Use an isometric perspective (front-right angle). Ensure a professional game-ready look with a soft gradient fade at the edges for seamless blending. Transparent background.", "description": "A medium tidal blue flowing water frosting texture overlay for an isometric round cake tier with white foam crests.", "subtype": "other", "aspect_ratio": [1024, 967], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "frosting_bubble": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_bubble_551ab243-2156-4175-a525-c658124fcc59.webp", "type": "image", "prompt": "Generate a game-ready, isometric round cake tier frosting texture overlay. The texture is a translucent bubble white (#E0F7FA) featuring multiple overlapping soap bubbles of various sizes. Each bubble should have thin, delicate membrane edges and a vibrant rainbow iridescent shimmer on its surface. The overall look is light, airy, and translucent with realistic rainbow light reflections. Ensure an isometric perspective (front-right angle) that wraps around a curved circular surface. High resolution, professional quality, soft gradient fade at the edges for seamless blending, transparent background.", "description": "A translucent bubble white frosting texture overlay for an isometric round cake tier with rainbow shimmer.", "subtype": "other", "aspect_ratio": [943, 924], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "frosting_scales": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_scales_e4c39a95-7d40-4e6d-b7e4-5f6b82f3b31b.webp", "type": "image", "prompt": "A high-quality isometric view of a round cake tier frosting texture consisting of overlapping mermaid scales. The scales should feature a full rainbow spectrum (red, orange, yellow, green, blue, purple) with a glossy, holographic shimmer and metallic iridescent sheen. Each scale should have clear outlines and catch the light differently to create a 3D effect. The texture must be designed to wrap around a curved isometric surface (front-right angle, ~30 degrees). Bright, magical lighting with sparkles. Soft gradient fade at the edges for seamless blending. Transparent background, game-ready UI asset.", "description": "A vibrant rainbow mermaid scale frosting texture overlay for an isometric cake tier with holographic shimmer.", "subtype": "other", "aspect_ratio": [852, 843], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "frosting_sunset": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_sunset_1bce0380-db68-42fa-b5ee-83be9b11b117.webp", "type": "image", "prompt": "Generate a high-quality isometric cake frosting texture overlay. The texture features a smooth gradient from warm sunset orange (#FF6347) to coral pink (#FF7F50). Design it to wrap around a round, circular cake tier from a front-right isometric perspective (30-degree angle). Include horizontal color bands blending smoothly like a sunset sky, with soft cloud-like wisps, golden light rays, and a warm radiant shimmer. The lighting should be warm and glowing. The asset must have a transparent background and soft gradient edges for seamless blending onto a cake model. High resolution, polished game asset style.", "description": "A warm sunset orange and coral pink gradient frosting texture overlay for an isometric cake tier.", "subtype": "other", "aspect_ratio": [1024, 1017], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "frosting_seafoam": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_seafoam_f6eda87a-b099-4a1e-a9cf-cf5fe5858609.webp", "type": "image", "prompt": "Generate a high-quality seafoam green (#93E9BE) bubbly frosting texture overlay for a round cake tier in a 30-degree isometric perspective. The texture should feature a frothy, airy surface with clusters of tiny to medium-sized bubbles and wispy foam trails. Use a fresh, minty aqua color palette with soft edges and subtle translucency in the bubble areas to create an ocean spray effect. The asset should be a clean, shadowless illustration on a transparent background, designed to wrap seamlessly around a curved isometric cake surface. Match the art style of existing cake frosting assets like 'frosting_pearl' and 'frosting_scales'.", "description": "A fresh seafoam green bubbly frosting texture overlay for an isometric round cake tier in a mermaid theme.", "subtype": "other", "aspect_ratio": [1024, 1006], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "decoration_seashell": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_seashell_5596f89d-c2d0-4fd5-b4a6-e87c9db30281.webp", "type": "image", "prompt": "Generate a high-quality, front-view isometric seashell cake topper in a kawaii cartoon style. The seashell should be a spiraled conch or elegant scallop shape with a pearlescent cream and soft pink color palette. Include a glossy, smooth surface with bright white highlights and a subtle iridescent shimmer. Feature thick, clean dark outlines and simple geometric ridges. The design should be bold and centered on a transparent background, matching the underwater aesthetic of SpongeBob and mermaid themes.", "description": "A cute, cartoonish seashell cake topper with a kawaii mermaid style for cake decoration.", "subtype": "object", "aspect_ratio": [748, 973], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_starfish": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_starfish_f90c3330-eb26-4f44-a38c-7b518cd9c13c.webp", "type": "image", "prompt": "Generate a high-quality, front-view isometric cartoon starfish cake topper. The starfish should have a classic five-pointed shape in a warm golden-orange color with a subtle bumpy texture and small dots. Features a cute kawaii smiling face with closed happy eyes. Designed with thick dark outlines, simple bold shapes, and glossy highlights to match a mermaid-themed mobile game aesthetic. Transparent background, professional game-ready asset.", "description": "A cute cartoonish starfish cake topper in a kawaii mermaid style for cake decoration.", "subtype": "object", "aspect_ratio": [941, 888], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_pearl": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_pearl_967e1fbf-4306-4c43-990f-7cdb464ea0e1.webp", "type": "image", "prompt": "Generate a high-quality, front-facing isometric cartoon illustration of a large, lustrous white pearl nestled in a soft pink open oyster shell. Kawaii art style with thick dark outlines, pearlescent iridescent shimmer, and glossy highlights. Professional game asset, clean lines, mermaid and underwater theme, transparent background.", "description": "A cute cartoonish iridescent pearl in an oyster shell cake topper for a mermaid-themed cake.", "subtype": "object", "aspect_ratio": [702, 821], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_coral": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_coral_ae869b2a-deaf-46cc-874f-4403a64593ce.webp", "type": "image", "prompt": "Generate a high-quality, front-view isometric cake topper of a branching coral piece. The style is cute kawaii cartoon with thick dark outlines and bright vibrant coral-pink colors. The coral should have organic rounded branches with small decorative polyp dots. Clean, polished game-ready asset with simple shading for dimension, transparent background, matching the mermaid underwater theme of image decoration_seashell.", "description": "A cute cartoonish coral branch cake topper in a kawaii mermaid style.", "subtype": "object", "aspect_ratio": [806, 1045], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_seahorse": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_seahorse_d73c67b5-4dde-4dc1-8e1a-01fdfa084fe2.webp", "type": "image", "prompt": "Generate a full-body, isometric side-view of a cute cartoonish seahorse cake topper. Designed in a kawaii mermaid style with a bright turquoise and coral color palette, a curled tail, and a happy smiling face with closed eyes. Features thick dark outlines, simple rounded segmented body ridges, and a small dorsal fin. High-quality game asset, clean polished look, vibrant ocean colors, transparent background.", "description": "A cute, cartoonish seahorse cake topper in a kawaii mermaid style for cake decoration.", "subtype": "object", "aspect_ratio": [637, 1431], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_fish": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_fish_fa8fe3e9-e3be-43c4-bf66-36e37146b0b6.webp", "type": "image", "prompt": "Generate a high-resolution, game-ready cartoonish tropical fish cake topper in a kawaii mermaid style. The fish should be a small clownfish with bright orange and white stripes, featuring a cute happy face with simple black eyes and a smile. Use an isometric side-view perspective. The art style must have thick dark outlines, clean flat colors with simple shading, and a glossy finish to match a cake decoration. Ensure the fins are rounded and flowing. Transparent background.", "description": "A cute cartoonish tropical fish cake topper in a kawaii mermaid style.", "subtype": "object", "aspect_ratio": [684, 801], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "decoration_mermaid_tail": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_mermaid_tail_393c7e8b-f0d1-4cc5-bfbf-a0359144aea8.webp", "type": "image", "prompt": "Generate a cute, cartoonish mermaid tail cake topper in a kawaii mermaid style. The design should feature a classic curved fin with shimmering iridescent scales in a turquoise, purple, and pink gradient. Include a holographic rainbow shimmer effect on the scale patterns. The asset should be shown in an isometric front-facing view with thick dark outlines, bold shapes, and clean, simple shading. High resolution, professional game asset, transparent background.", "description": "A cute, cartoonish mermaid tail cake topper with shimmering iridescent scales for cake decoration.", "subtype": "object", "aspect_ratio": [843, 1419], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_trident": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_trident_e2fa528c-ea65-4dbd-bb5f-3708807ba11f.webp", "type": "image", "prompt": "Generate a professional quality, game-ready cake topper of a cute, cartoonish trident. The trident should have a classic three-pronged shape in a shimmering golden metallic color with thick dark outlines. Add ornate details like a small wrapped seaweed strand and a tiny pearl jewel on the shaft. Use a kawaii ocean-inspired art style with simple shapes and bright colors. The asset must be a full-body, front-view isometric illustration on a transparent background, matching the style of decoration_mermaid_tail and decoration_seashell.", "description": "A cute, cartoonish trident cake topper in a kawaii mermaid style for cake decoration.", "subtype": "object", "aspect_ratio": [542, 1058], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_crown": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_crown_3ec9363e-8d92-4e31-a66a-250835116448.webp", "type": "image", "prompt": "Generate a cute, cartoonish mermaid crown cake topper in a kawaii ocean style. The crown is an elegant tiara shape with golden and pearlescent textures, decorated with small seashells, pearls, and coral motifs. It features a large central aquamarine jewel and wave-inspired curves. Isometric front-facing view, thick dark outlines, bright cheerful colors, high-resolution game-ready asset with a transparent background.", "description": "A cute cartoonish mermaid crown cake topper with ocean motifs and a central jewel.", "subtype": "object", "aspect_ratio": [739, 1188], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "mascot_mermaid_happy": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_mermaid_happy_926906f9-e887-4bcf-9ff8-824a75f2664a.webp", "type": "image", "prompt": "Generate a full-body, front-facing chibi mermaid mascot character with a big cheerful smile and large friendly eyes. The character has long flowing turquoise and purple hair adorned with small coral accessories, a sparkly iridescent shell top, and a shimmering rainbow-scaled fish tail. Use a clean kawaii art style with soft rounded shapes, pink blushing cheeks, and a subtle magical glowing aura. High resolution, professional game asset, 2D vector style with thick clean outlines, transparent background, isometric perspective to match a cake decorating game.", "description": "A cheerful kawaii mermaid mascot with a big smile for the underwater-themed cake decorating game.", "subtype": "character", "aspect_ratio": [915, 1390], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "mascot_mermaid_excited": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_mermaid_excited_0f4ce485-3403-4e81-a7ac-18a4b33c9e31.webp", "type": "image", "prompt": "Generate a full-body, front-view kawaii chibi mermaid mascot character with an excited 'WOW' expression. The character has large sparkling eyes, an open mouth showing joy, and long flowing turquoise hair with magical shimmer. She wears a pearlescent shell bikini top and has a shimmering rainbow-scaled fish tail in a dynamic, dancing pose with arms raised in celebration. Include small coral and pearl accessories in her hair, surrounded by starry magical sparkles and a soft glowing aura. Clean thick outlines, professional game-ready character art, vibrant colors, isometric perspective, transparent background.", "description": "An excited and enthusiastic chibi mermaid mascot with sparkling eyes and a big WOW expression for celebratory moments.", "subtype": "character", "aspect_ratio": [821, 1246], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "mascot_mermaid_surprised": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_mermaid_surprised_773fa981-8546-42ee-8214-5d1d21dbcc54.webp", "type": "image", "prompt": "Generate a full-body, front-facing chibi mermaid mascot with a surprised expression. She has wide, shocked eyes and an 'O' shaped mouth, with one hand raised to her face in a startled gesture. She features long flowing turquoise hair with shell accessories, a pearlescent bikini top, and a shimmering rainbow-scaled fish tail. Style is kawaii with soft rounded shapes, thick clean outlines, and a gentle magical glow. Include a few floating bubbles to emphasize the surprise. Match the character design and art style of mascot_mermaid_happy and mascot_mermaid_excited. High resolution, professional game asset, transparent background.", "description": "A surprised chibi mermaid mascot for underwater cake decorating game reactions.", "subtype": "character", "aspect_ratio": [821, 1246], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "mascot_mermaid_worried": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_mermaid_worried_d3f6cc87-7fa5-47ad-8770-45e2a2ddddd0.webp", "type": "image", "prompt": "Generate a full-body, front-view chibi mermaid mascot with a worried and anxious expression. The character has a cute rounded face, furrowed eyebrows, large concerned eyes, and a small 'o' shaped mouth. She has long flowing turquoise hair with shell accessories, a sparkly pearl bikini top, and a shimmering iridescent rainbow fish tail. Her hands are held together in a nervous wringing motion. Include a small sweat drop icon to indicate worry and a soft, dim glowing magical aura. Kawaii art style with thick clean outlines and soft shading, transparent background, matching the style of mascot_mermaid_happy.", "description": "A worried kawaii mermaid mascot for timer warnings and game-over states.", "subtype": "character", "aspect_ratio": [796, 1204], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "mascot_mermaid_celebrating": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/mascot_mermaid_celebrating_0b0fbcd3-8153-45f5-9ab2-f09e3f091d07.webp", "type": "image", "prompt": "Generate a triumphant, celebrating mermaid mascot in a victory pose, front-facing isometric view. The mermaid has a cute rounded chibi face with a huge happy smile and sparkling eyes, and long flowing hair with magical shimmer. She is wearing a sparkly iridescent shell bikini top and has a shimmering fish tail with rainbow gradient scales. Both arms are raised high in a victory pose with fist-pumps. Surrounded by multiple stars, sparkles, and festive bubbles in a celebration. Kawaii art style with soft rounded shapes and a strong glowing magical aura. High resolution, detailed, professional game-ready character asset, transparent background, matching the style of mascot_mermaid_happy.", "description": "A triumphant mermaid mascot in a victory pose for the mermaid-themed cake decorating game.", "subtype": "character", "aspect_ratio": [827, 1241], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "decoration_dolphin": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_dolphin_8a2cdb1f-13f8-4970-9bdf-b80b0cba6740.webp", "type": "image", "prompt": "Generate a full-body, isometric view of a cute cartoonish dolphin cake topper. The dolphin has an adorable friendly face with a big smile and large kawaii eyes. It is a bright blue-grey color with a lighter white belly, posed in a playful jumping arc. Use a clean, simple design with thick bold outlines and a glossy finish, matching a mermaid-themed aesthetic. The lighting should be flat and consistent with other isometric cake decorations like 'decoration_seahorse'. Transparent background, high resolution, professional game asset.", "description": "A cute cartoonish dolphin cake topper in a kawaii mermaid style.", "subtype": "object", "aspect_ratio": [621, 963], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "decoration_octopus": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_octopus_b24247ac-b324-4d68-ad00-4e498cc804b0.webp", "type": "image", "prompt": "Generate a professional quality, high-resolution isometric illustration of a cute chibi octopus cake topper. The octopus should be purple with pink gradient suction cups on eight curled tentacles. It features large kawaii eyes, a sweet smile, and clean thick outlines. The style must match a mermaid-themed cake decorating game, appearing as a small plastic or fondant topper. Transparent background, vibrant colors, shadowless, front-right isometric perspective.", "description": "A cute cartoonish octopus cake topper in a kawaii mermaid style for cake decoration.", "subtype": "object", "aspect_ratio": [737, 710], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_sea_turtle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_sea_turtle_67bc9b9f-150b-478a-85a4-bc0dba7467c8.webp", "type": "image", "prompt": "Generate a small, cute cartoonish sea turtle cake topper in a kawaii mermaid style. The sea turtle features big adorable eyes, a gentle smile, and a green body with a brown and tan patterned shell showing geometric hexagonal designs. The turtle is in a playful swimming pose with flippers visible. Designed in an isometric perspective to match a cake decorating game, with thick clean outlines, bold colors, and a glossy finish. High-quality game asset, transparent background, front-right isometric view.", "description": "A cute cartoonish sea turtle cake topper in a kawaii mermaid style for cake decoration.", "subtype": "object", "aspect_ratio": [877, 714], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_conch": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_conch_e50c1d56-df51-402c-99e0-d881c0918198.webp", "type": "image", "prompt": "Generate a cute cartoonish spiral conch shell cake topper, isometric perspective. The shell has a beautiful pink and peach gradient with a glossy, iridescent inner surface and ridged texture. Designed in a kawaii mermaid style with thick clean outlines, high resolution, professional game asset quality. Small size suitable for a cake decoration, transparent background, matching the art style of decoration_seashell and decoration_coral.", "description": "A cute cartoonish conch shell cake topper in a kawaii mermaid style.", "subtype": "object", "aspect_ratio": [821, 1086], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_sand_dollar": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_sand_dollar_c9c39dba-8fcc-464f-95e0-394ec29d42f7.webp", "type": "image", "prompt": "Generate a cute cartoonish sand dollar cake topper in a kawaii mermaid style. It should be a flat circular disc shape with the characteristic five-petal flower pattern clearly visible on top. Use a cream or beige color with subtle texture and thick outlines. Front-right isometric perspective to match 'cake_plate'. Clean, simple design with a glossy finish, high resolution, professional quality, transparent background.", "description": "A cute cartoonish sand dollar cake topper in a kawaii mermaid style for cake decoration.", "subtype": "object", "aspect_ratio": [824, 603], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_jellyfish_blue": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_jellyfish_blue_20eec41a-f76a-4d82-ba61-4a73027292bd.webp", "type": "image", "prompt": "Generate a cute, cartoonish blue jellyfish cake topper in a kawaii style. The jellyfish has a round, translucent blue bell-shaped head with a friendly face (simple eyes and a small mouth) and 6-8 flowing tentacles. Include a magical glowing effect with lighter blue highlights and subtle sparkles. Isometric perspective, high-quality 2D game asset, thick clean outlines, glossy finish, transparent background. Matches the art style of decoration_jellyfish and decoration_mermaid_tail.", "description": "A cute blue jellyfish cake topper for the mermaid-themed cake decorating game.", "subtype": "object", "aspect_ratio": [691, 1132], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_jellyfish_purple": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_jellyfish_purple_2d55f68f-e543-4f7a-b136-01dbf5848c65.webp", "type": "image", "prompt": "Generate a full-body, front-view cute cartoonish purple jellyfish cake topper in an isometric perspective. The jellyfish should have a round, dome-shaped vibrant purple bell with a glossy, translucent finish and a kawaii face with small dot eyes and a gentle smile. 6-8 flowing tentacles in lavender shades trail downward. Style features thick black outlines, bold colors, and a soft purple glow, matching the SpongeBob-inspired aesthetic of decoration_jellyfish and decoration_jellyfish_blue. High quality, transparent background.", "description": "A cute cartoonish purple jellyfish cake topper in a kawaii mermaid style.", "subtype": "object", "aspect_ratio": [763, 1233], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_jellyfish_orange": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_jellyfish_orange_4664dc18-c397-471d-8eed-c0d55e0d1068.webp", "type": "image", "prompt": "Generate a cute, cartoonish orange jellyfish cake topper in an isometric perspective. The jellyfish has a round, dome-shaped orange bell with a glossy finish and a simple kawaii face (dot eyes and a smile). It features 6-8 flowing tentacles in peach and coral shades trailing downward. Style should match the SpongeBob SquarePants aesthetic with thick black outlines, vibrant colors, and a soft warm glow. High resolution, professional game asset, transparent background.", "description": "A cute cartoonish orange jellyfish cake topper in SpongeBob style for cake decoration.", "subtype": "object", "aspect_ratio": [529, 747], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_jellyfish_bioluminescent": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_jellyfish_bioluminescent_be1bb1a8-f169-4b59-a210-9bb3a5d622ff.webp", "type": "image", "prompt": "Generate a cute, cartoonish bioluminescent jellyfish cake topper in an isometric perspective. The jellyfish features a round, dome-shaped bell in deep blue-purple with visible glowing constellation patterns inside. It has a kawaii face with small dot eyes and a gentle smile. 8-10 flowing tentacles in cyan and electric blue trail downwards with bright glowing bioluminescent nodes. Use a vibrant 'STRONG' glow effect with electric cyan and aqua light emanating from the bell and tentacles. Thick black outlines with subtle cyan glowing accents, high-quality glossy finish, transparent background, SpongeBob SquarePants aesthetic, game-ready asset.", "description": "A cute, bioluminescent deep-sea jellyfish cake topper with a magical cyan glow and isometric perspective.", "subtype": "object", "aspect_ratio": [485, 795], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "frosting_abyss": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_abyss_bcb29441-9394-4515-8fc4-d83dfc3ef59d.webp", "type": "image", "prompt": "Generate a high-quality isometric round cake tier frosting texture overlay, featuring a deep dark ocean abyss theme. The color palette should consist of deep navy blue, midnight purple, and subtle hints of bioluminescent cyan specks. The texture should show mysterious dark waves and flowing patterns suggesting extreme ocean depths. Style is clean, polished, and match the mermaid fantasy aesthetic of other game assets. Front-right isometric perspective, flat lighting, no shadows, transparent background.", "description": "A deep, dark ocean abyss frosting texture overlay for an isometric round cake tier in a mermaid theme.", "subtype": "other", "aspect_ratio": [934, 962], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "frosting_tropical": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_tropical_d20dc81a-38b8-4299-8221-4e03036e488d.webp", "type": "image", "prompt": "Generate a vibrant tropical paradise frosting texture overlay for an isometric round cake tier. The texture should feature a brilliant bright turquoise and tropical cyan base with flowing wave-like patterns and sparkling sunlight highlights. Include subtle warm coral accents inspired by tropical reefs. Ensure a front-right isometric perspective that wraps around a curved surface. Clean, polished game asset with a smooth, luminous surface, high saturation, and flat even lighting. Transparent background, no shadows, no cake base visible, just the frosting texture overlay.", "description": "A vibrant tropical paradise frosting texture overlay for an isometric round cake tier in a mermaid theme.", "subtype": "other", "aspect_ratio": [1023, 875], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "frosting_lagoon": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_lagoon_641d2f1c-fe53-417e-8ffe-0b3d398799ac.webp", "type": "image", "prompt": "Generate a calm lagoon-themed frosting texture overlay for a round cake tier in a front-right isometric perspective. The texture should feature a medium-light teal and soft aqua color palette (#20B2AA, #48D1CC, #5F9EA0) with gentle ripple patterns and subtle, flowing water textures suggesting peaceful, still lagoon water. Maintain a smooth surface with soft highlights and balanced saturation. The style must be clean, flat-lit, and shadowless to match a kawaii mermaid underwater fantasy game, consistent with image frosting_tropical and frosting_abyss. Transparent background, game-ready asset.", "description": "A calm lagoon waters frosting texture overlay for an isometric round cake tier in a mermaid theme.", "subtype": "other", "aspect_ratio": [962, 848], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "frosting_sapphire": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_sapphire_053d478f-bebb-4fcb-8372-1a04c3aa2059.webp", "type": "image", "prompt": "Generate a high-quality sapphire gemstone frosting texture overlay for a round cake tier, viewed from a front-right isometric perspective. The texture should feature a rich royal blue and deep sapphire color palette with brilliant crystalline facet patterns suggesting a cut gemstone. Include angular geometric shapes and sharp sparkling highlights to create a luxurious, jewel-like appearance. Style: Mermaid/underwater fantasy theme, clean and polished game asset, flat even lighting, no shadows, transparent background.", "description": "A precious sapphire gemstone frosting texture overlay with crystalline facets for an isometric cake tier.", "subtype": "other", "aspect_ratio": [975, 940], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "frosting_opal": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_opal_0aaa60f3-03b9-4e69-bf9f-b77a0bf955e5.webp", "type": "image", "prompt": "Generate a game-ready, isometric view frosting texture overlay for a round cake tier. The style is mermaid fantasy with a magical iridescent opal appearance. The texture features a pearly cream base with soft pastel rainbow shimmer including pink, light blue, pale aqua, and lavender. Include an opalescent sheen with color-shifting gradients and subtle flowing patterns. No shadows, flat even lighting, transparent background, high resolution, professional digital art style.", "description": "An iridescent opal shimmer frosting texture overlay for an isometric round cake tier in a mermaid theme.", "subtype": "other", "aspect_ratio": [1024, 875], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "frosting_sand": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frosting_sand_5dbb5600-b47e-45d6-b055-135990f575ab.webp", "type": "image", "prompt": "Generate a sandy beach frosting texture overlay for a round cake tier in front-right isometric perspective. Use a warm palette of golden tan, light beige, and cream. The texture should show fine granular beach sand with subtle sun-reflecting sparkles and gentle wind-blown patterns. Ensure a flat, even lighting style with no shadows to match the mermaid-themed game aesthetic. Transparent background, game-ready asset, high resolution.", "description": "A warm sandy beach frosting texture overlay for an isometric cake tier with a mermaid theme.", "subtype": "other", "aspect_ratio": [1024, 875], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "decoration_mermaid": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_mermaid_19417ca0-492d-4684-9a55-a57f3234e7e9.webp", "type": "image", "prompt": "Generate a full-body, front-right isometric view of a cute chibi mermaid cake topper. She has a large head, big sparkling eyes, and long flowing wavy hair adorned with tiny seashells. She is wearing a seashell bikini top and has a gracefully curved iridescent mermaid tail with shimmering scales. She is holding a small glowing pearl. The art style is kawaii cartoon with thick black outlines, bright vibrant colors, a glossy polished finish, and soft shading for depth. High resolution, professional game asset, transparent background, isometric perspective matching a 30-degree angle.", "description": "A cute chibi mermaid cake topper with iridescent scales and a seashell bikini for the mermaid-themed cake game.", "subtype": "object", "aspect_ratio": [739, 1235], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_merman": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_merman_7a0a58b0-7e03-4b2a-ae91-9e785f37d1e1.webp", "type": "image", "prompt": "Generate a cute chibi merman character cake topper, standing illustration. The merman has a large head, small body, cool ocean-styled hair, and a friendly adventurous expression with big expressive eyes. He has an iridescent blue and teal merman tail with shimmering scales and is holding a small trident. Art style: kawaii cartoon, thick black outlines, bright vibrant colors, glossy polished finish, soft shading. Perspective: isometric front-right view (~30 degrees). Transparent background, high resolution, detailed, match the style of decoration_mermaid.", "description": "A cute, cartoonish kawaii merman character cake topper in isometric perspective for a mermaid-themed game.", "subtype": "object", "aspect_ratio": [770, 1234], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_mermaid_warrior": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_mermaid_warrior_189364b8-0c80-4bd8-a6aa-aca74a54a05c.webp", "type": "image", "prompt": "Generate a full-body, front-right isometric view of a cute chibi mermaid warrior cake topper. She has flowing teal and purple iridescent scales on her tail, holds a small decorative golden trident, and wears a pearl-encrusted shell bikini. Her expression is determined and brave with large sparkling eyes. Style is kawaii fantasy with thick clean outlines, glossy finish, and subtle bioluminescent glowing accents. Match the art style of decoration_mermaid and decoration_merman. High resolution, professional game asset, transparent background.", "description": "A cute chibi mermaid warrior cake topper with a trident and iridescent scales for cake decoration.", "subtype": "object", "aspect_ratio": [788, 1216], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_mermaid_queen": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_mermaid_queen_3f7b52f7-2821-4786-9679-021a548b11dd.webp", "type": "image", "prompt": "Generate a regal mermaid queen cake topper in cute chibi kawaii style, isometric perspective. She has luxurious flowing aquamarine and pearl iridescent scales on her tail, wears an ornate shell crown with glowing jewels, and has a majestic yet friendly expression. She wears elegant pearl and coral adornments. Include magical shimmer effects and tiny bubbles around her crown. Consistent with the cute, thick-outlined cartoon style of decoration_mermaid. Full body illustration, standing/swimming pose, high resolution, transparent background.", "description": "A regal mermaid queen cake topper in a cute kawaii style with iridescent scales and an ornate shell crown.", "subtype": "object", "aspect_ratio": [660, 1244], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_merman_musician": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_merman_musician_c7845253-c33e-40c9-8341-5d65b771b637.webp", "type": "image", "prompt": "Generate a cute chibi merman musician cake topper in a kawaii fantasy style. He has cyan and lavender iridescent scales on his tail and is holding a small magical coral shell horn. He has a joyful expression as if singing. The character is shown in an isometric perspective, front-right facing, full body standing illustration. Include floating musical note accents and bioluminescent glowing details. Clean, polished game-ready asset with thick outlines and a glossy finish, matching the style of decoration_merman. Transparent background.", "description": "A cute chibi merman musician cake topper holding a coral shell horn for cake decoration.", "subtype": "object", "aspect_ratio": [782, 1154], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_mermaid_dancer": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_mermaid_dancer_d9720e70-f451-4860-9046-b2c0dbbe2f50.webp", "type": "image", "prompt": "Generate a cute chibi mermaid dancer cake topper in a kawaii fantasy style, isometric perspective. She has flowing rainbow iridescent scales on her tail and is posed in a graceful dancing motion with arms extended. She wears a shell bikini top and has a joyful, playful expression with flowing hair. Include magical sparkle effects around her. Clean lines, polished game-ready asset, vibrant colors, matching the style of decoration_mermaid and decoration_mermaid_queen. High resolution, detailed, transparent background.", "description": "A graceful chibi dancing mermaid cake topper with rainbow scales in isometric perspective.", "subtype": "object", "aspect_ratio": [674, 1113], "compression_suggestion": "low", "duration_secs": null, "loop": null, "animation": null}, "decoration_merman_adventurer": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_merman_adventurer_428a20a4-ed9c-4d5d-a27c-041a803c17f5.webp", "type": "image", "prompt": "Generate a cute, cartoonish kawaii-style merman adventurer character as a cake topper. The character features a cute male upper body, a vibrant blue-green iridescent mermaid tail with shimmering scales, and SHORT WAVY tousled dark brown hair. He wears a small shoulder satchel and a shell necklace. Expressive big eyes and a brave smile. Dynamic pose holding a small shell compass. Isometric 3/4 view (front-right), smooth clean vector-like appearance with thick outlines, soft flat lighting, no shadows, transparent background. Matches the style of 'decoration_merman' and 'decoration_mermaid'.", "description": "A cute chibi merman adventurer cake topper with short wavy hair and explorer gear.", "subtype": "object", "aspect_ratio": [688, 1240], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_merman_guardian": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_merman_guardian_6616e929-5f95-4e06-b569-54375ff7957f.webp", "type": "image", "prompt": "Generate a full-body, front-facing isometric view of a cute kawaii chibi merman guardian character designed as a cake topper. The character has a muscular but cute chibi body, short spiky ocean blue hair, and a powerful iridescent blue-green scaled tail. He is holding a decorative coral trident and wearing white shell shoulder armor. Thick black outlines, bright saturated colors, smooth rounded shapes, high-quality game asset, transparent background, heroic but friendly expression.", "description": "A cute, heroic chibi merman guardian cake topper with a trident and shell armor.", "subtype": "object", "aspect_ratio": [860, 1377], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_baby_mermaid": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_baby_mermaid_54e634bb-4b90-4dcb-be3a-8154c93fcec0.webp", "type": "image", "prompt": "Generate a full-body, front-facing isometric view of an ultra-cute baby mermaid cake topper. The character has chubby chibi proportions, a very large head, and a tiny body. She has wispy soft pastel pink hair in pigtails with tiny starfish clips, and a small rainbow-scaled tail. Her face is super kawaii with huge sparkling eyes and rosy cheeks. She wears a small pearl necklace and seashell top. Use thick black outlines, a clean cartoon style, and soft pastel colors. Professional quality game asset on a transparent background.", "description": "An adorable chibi baby mermaid cake topper with rainbow scales and pastel pink hair.", "subtype": "object", "aspect_ratio": [865, 817], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_baby_merman": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_baby_merman_8fabc6f4-89d4-46b8-882f-ccf239ad2899.webp", "type": "image", "prompt": "Generate a full-body, front-facing isometric view of a cute chibi baby merman cake topper. The character should have an oversized head, chubby cheeks, and large sparkling eyes. Short tousled seafoam green hair. An iridescent merman tail with rainbow shimmer scales. Smooth rounded shapes, bright pastel colors, and thick clean outlines. Include magical sparkles and tiny bubbles around him. High resolution, professional kawaii game asset style on a transparent background.", "description": "An adorable chibi baby merman cake topper with iridescent scales and a sweet expression.", "subtype": "object", "aspect_ratio": [623, 910], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_water_splash": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_water_splash_6d4b792d-23ae-4140-acd7-65c34f4e5e6f.webp", "type": "image", "prompt": "Generate a cute, kawaii-style water splash cake topper for a mermaid-themed game. The design should be dynamic and celebratory with bright blue and cyan water droplets radiating outward in a starburst pattern. Include white highlights for a glossy, liquid effect and some semi-transparent droplets. Isometric perspective, side-view, clean thick outlines, game-ready asset, professional quality, high resolution, transparent background.", "description": "A dynamic, celebratory kawaii water splash cake topper for the mermaid theme.", "subtype": "object", "aspect_ratio": [846, 847], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_water_droplet": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_water_droplet_632a31ad-aaaf-4776-b8b8-b04a3af699e3.webp", "type": "image", "prompt": "Generate a cute, single large water droplet cake topper for a mermaid-themed game. The droplet has a glossy, three-dimensional appearance with a bright highlight spot. Use a vibrant cyan and turquoise color palette with white highlights to create a 'wet' look. Kawaii chibi style with thick clean outlines, matching the aesthetic of image 1. Side/isometric view, transparent background, high resolution, professional game asset quality.", "description": "A cute, glossy water droplet cake topper for the mermaid-themed cake game.", "subtype": "object", "aspect_ratio": [502, 1002], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_water_fountain": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_water_fountain_4fcafd45-0e3f-43a1-9158-275ae0929d69.webp", "type": "image", "prompt": "Generate a dynamic upward-shooting water fountain spray decoration for a cake. The fountain features 3-5 vertical streams of translucent blue-cyan water arcing gracefully at the top. Includes white highlights, magical sparkles, and spray particles. High-quality kawaii cartoon style with thick, bold outlines and a glossy finish. Isometric perspective, transparent background, vibrant blue and white color palette, consistent with mermaid-themed game assets.", "description": "A cute, cartoonish water fountain spray cake topper for the mermaid theme.", "subtype": "object", "aspect_ratio": [692, 753], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_narwhal": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_narwhal_c1d3d9e2-5e8f-4536-8f98-a6d1c9eb2c5e.webp", "type": "image", "prompt": "Generate a high-quality, professional game asset of a cute chibi narwhal cake topper. The narwhal has a plump, rounded soft blue-gray body, a white belly, and a magical spiraled pearlescent horn with rainbow shimmer. Large sparkling kawaii eyes and a sweet smile. Character features small flippers and cute tail flukes. Art style is kawaii/chibi with thick clean outlines and a glossy, shiny finish with bright highlights. Isometric perspective to match existing mermaid decorations. Add subtle magical cyan sparkles around the horn. Transparent background, front-right angled view.", "description": "A cute chibi narwhal cake topper for the mermaid-themed cake decorating game.", "subtype": "object", "aspect_ratio": [727, 695], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_sea_otter": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_sea_otter_86f15cc9-126d-4e65-9d8c-fd1ea56241d2.webp", "type": "image", "prompt": "Generate a high-quality, front-facing isometric view of a cute chibi sea otter cake topper. The otter has a plump, fluffy brown body and is floating on its back, holding a glowing iridescent pearl on its belly. Kawaii art style with thick outlines, large sparkling eyes, rosy cheeks, and a peaceful expression. Include soft water ripple effects around the body. Clean edges, vibrant saturated colors, glossy finish with highlights, and a transparent background. Match the artistic style of decoration_narwhal and decoration_mermaid.", "description": "An adorable chibi sea otter holding a pearl, designed as a cake topper for a mermaid-themed game.", "subtype": "object", "aspect_ratio": [796, 990], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_clownfish": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_clownfish_85dd471f-38ce-4dac-ae29-15d482440151.webp", "type": "image", "prompt": "Generate a professional quality, game-ready kawaii chibi clownfish cake topper decoration. The clownfish has a plump, rounded body, bright orange color with three white stripes bordered by thin black lines. It features large sparkling kawaii eyes and a cheerful, friendly smile. Isometric perspective, slightly angled view. The style is cartoonish with thick clean outlines and a glossy, shiny finish with bright highlights. Include subtle bubbles around it and a magical glow on the scales. High resolution, vibrant saturated colors, transparent background, front-right facing.", "description": "A cute chibi clownfish cake topper in a kawaii mermaid style for cake decoration.", "subtype": "object", "aspect_ratio": [771, 952], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_mermaid_mirror": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_mermaid_mirror_fc231d86-47af-4371-be6f-e78cc73df0be.webp", "type": "image", "prompt": "Generate a cute, magical mermaid hand mirror cake topper in a kawaii fantasy style. The object features an ornate oval mirror frame decorated with tiny seashells, pearls, and starfish, with an elegant curved handle showing wave patterns. Use an isometric perspective with thick outlines and a glossy finish. The mirror surface should have a soft, iridescent blue-white shimmer with magical sparkles. Colors include rose gold for the frame, aquamarine jewels, and pearlescent accents. Professional game asset, high resolution, transparent background, clean edges.", "description": "An elegant mermaid hand mirror cake topper with seashell and pearl decorations.", "subtype": "object", "aspect_ratio": [723, 1392], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "animation": null}, "decoration_message_bottle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_message_bottle_280721ac-feb6-47d6-9400-5769d7798452.webp", "type": "image", "prompt": "Generate a high-quality, front-view isometric cake topper of a message in a bottle. The bottle is made of transparent teal-green glass with glossy highlights and contains a rolled parchment scroll. Features include a cork stopper, a rope tied around the neck with a tiny starfish detail, and a soft magical glow from within. Kawaii fantasy art style with thick clean outlines, vibrant saturated colors, and a 3D glossy finish. Transparent background.", "description": "A cute romantic message in a bottle cake topper with a magical ocean aesthetic.", "subtype": "object", "aspect_ratio": [759, 1341], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}, "decoration_hermit_crab": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/decoration_hermit_crab_22001ca6-1422-4d02-b8ac-8beadea5e365.webp", "type": "image", "prompt": "Generate a high-resolution, game-ready chibi hermit crab cake topper. The character has a plump orange-red body (#FF6B4A) with large, sparkling kawaii eyes and a shy, friendly expression peeking out from a vibrant coral-pink and turquoise striped spiral shell. Include small walking legs and one slightly larger pincer. The style is kawaii/chibi with thick clean outlines, a glossy/shiny finish, and soft 3D shading. Viewed from a front-right isometric perspective to match a mermaid-themed cake decorating game. Transparent background.", "description": "A cute chibi hermit crab cake topper with a colorful spiral shell for a mermaid-themed game.", "subtype": "object", "aspect_ratio": [817, 937], "compression_suggestion": "high", "duration_secs": null, "loop": null, "animation": null}}, "game_code": "<!DOCTYPE html>\n<html>\n<head>\n    <title>Cake Splash</title>\n    <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n    <link href=\"https://fonts.googleapis.com/css2?family=Fredoka:wght@400;600;700&family=Poppins:wght@400;600&display=swap\" rel=\"stylesheet\">\n    \n    <style>/* ===== CSS RESET ===== */\n\n* { margin: 0; padding: 0; box-sizing: border-box; }\n\nbody, html { \n            width: 100%; \n            height: 100%; \n            overflow: hidden; \n            touch-action: none; \n            -ms-touch-action: none;\n            font-family: \"Poppins\", sans-serif;\n        }\n\n/* ===== CSS CUSTOM PROPERTIES ===== */\n\n:root { --transition-fast: 150ms; --transition-normal: 300ms; --transition-slow: 500ms; --ease-out: cubic-bezier(0.0, 0, 0.2, 1); --ease-bounce: cubic-bezier(0.68, -0.6, 0.32, 1.6); --space-xs: 8px; --space-sm: 16px; --space-md: 24px; --space-lg: 32px; --space-xl: 48px; --color-primary: #40E0D0; --color-secondary: #7FFFD4; --color-success: #93E9BE; --color-warning: #FFB6D9; --color-danger: #FF7F50; --color-text: #006994; --color-text-light: #4682B4; --color-ocean-blue: #006994; --color-aquamarine: #7FFFD4; --color-coral: #FF7F50; --color-pearl: #F0EAD6; --color-seafoam: #93E9BE; }\n\n/* ===== GAME CONTAINER ===== */\n\n#game-container { position: relative; width: 100%; height: 100%; background: linear-gradient(180deg, #001F3F 0%, #003D5C 15%, #005A7A 30%, #007898 50%, #0095B6 70%, #00B2D4 85%, #40E0D0 100%); }\n\n#background {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            object-fit: cover;\n            z-index: 0;\n        }\n\n#game-canvas {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            z-index: 1;\n        }\n\n/* ===== UI OVERLAY ===== */\n\n.ui-overlay {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            pointer-events: none;\n            z-index: 2;\n        }\n\n.ui-overlay > * {\n            pointer-events: auto;\n        }\n\n/* ===== GAME TITLE (ABOVE CAKE) ===== */\n\n.game-title { position: absolute; top: 180px; left: 50%; transform: translateX(-50%); font-family: \"Fredoka\", sans-serif; font-size: 36px; font-weight: 700; color: #FFFFFF; text-shadow: \n        3px 3px 0 #40E0D0,\n        -2px -2px 0 #7FFFD4,\n        0 0 25px rgba(64, 224, 208, 0.8),\n        0 0 35px rgba(127, 255, 212, 0.6); z-index: 3; pointer-events: none; text-align: center; letter-spacing: 1px; }\n\n/* ===== TOP HUD ===== */\n\n.top-hud { \n    position: absolute; \n    top: var(--space-sm); \n    left: 50%; \n    transform: translateX(-50%); \n    width: 95%; \n    max-width: 680px; \n    height: 56px;\n    display: flex; \n    flex-direction: row; \n    align-items: center; \n    justify-content: space-between;\n    gap: var(--space-sm);\n    background: linear-gradient(135deg, rgba(224, 247, 250, 0.95) 0%, rgba(178, 235, 242, 0.95) 50%, rgba(128, 222, 234, 0.95) 100%);\n    border-radius: 28px;\n    padding: 0 var(--space-md);\n    box-shadow: 0 4px 20px rgba(64, 224, 208, 0.3), 0 0 15px rgba(127, 255, 212, 0.2);\n    border: 2px solid rgba(64, 224, 208, 0.4);\n}\n\n.top-hud-challenge {\n    display: flex;\n    align-items: center;\n    gap: 6px;\n    flex: 1;\n    min-width: 0;\n}\n\n.challenge-icon {\n    font-size: 16px;\n    flex-shrink: 0;\n}\n\n.challenge-text {\n    font-family: \"Fredoka\", sans-serif;\n    font-size: 16px;\n    font-weight: 600;\n    color: var(--color-text);\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n\n.top-hud-stars {\n    display: flex;\n    gap: 8px;\n    align-items: center;\n    justify-content: center;\n    flex-shrink: 0;\n}\n\n.top-star {\n    font-size: 24px;\n    animation: twinkle 1.5s ease-in-out infinite;\n}\n\n.top-star:nth-child(1) {\n    animation-delay: 0s;\n}\n\n.top-star:nth-child(2) {\n    animation-delay: 0.5s;\n}\n\n.top-star:nth-child(3) {\n    animation-delay: 1s;\n}\n\n@keyframes twinkle {\n    0%, 100% { opacity: 1; transform: scale(1); }\n    50% { opacity: 0.6; transform: scale(1.1); }\n}\n\n.hint-button-inline { width: 40px; height: 40px; min-width: 40px; border: none; border-radius: 50%; background: linear-gradient(135deg, #FFE4B5 0%, #FFDAB9 50%, #FFB6D9 100%); color: #8B4513; font-size: 20px; cursor: pointer; transition: all var(--transition-fast) var(--ease-out); box-shadow: 0 2px 15px rgba(255, 182, 217, 0.6), \n                        0 0 20px rgba(255, 228, 181, 0.4),\n                        inset 0 1px 8px rgba(255, 255, 255, 0.8); border: 2px solid rgba(255, 255, 255, 0.9); display: flex; align-items: center; justify-content: center; flex-shrink: 0; text-shadow: 0 1px 2px rgba(255, 255, 255, 0.7); }\n\n.hint-button-inline:active {\n    transform: scale(0.95);\n    box-shadow: 0 1px 12px rgba(253, 230, 138, 0.6), \n                0 0 15px rgba(254, 243, 199, 0.4),\n                inset 0 1px 6px rgba(255, 255, 255, 0.7);\n}\n\n.hint-button-inline.hidden {\n    display: none;\n}\n\n.top-hud-challenge {\n    display: none !important;\n}\n\n.top-hud-challenge.hidden {\n    display: none;\n}\n\n.timer-container-inline {\n    width: 140px;\n    height: 36px;\n    position: relative;\n    flex-shrink: 0;\n}\n\n.timer-bg-inline {\n    width: 100%;\n    height: 100%;\n    background: linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, rgba(232, 244, 248, 0.9) 100%);\n    border-radius: 18px;\n    border: 2px solid var(--color-primary);\n    overflow: hidden;\n    box-shadow: inset 0 2px 8px rgba(107, 182, 255, 0.15), 0 0 10px rgba(135, 206, 235, 0.2);\n}\n\n.timer-fill-inline {\n    height: 100%;\n    background: linear-gradient(90deg, #93E9BE 0%, #40E0D0 40%, #7FFFD4 70%, #B2EBF2 100%);\n    transition: width 0.1s linear;\n    position: relative;\n    box-shadow: 0 0 15px rgba(64, 224, 208, 0.4);\n}\n\n.timer-fill-inline::after {\n    content: \"\";\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    background: repeating-linear-gradient(\n        45deg,\n        transparent,\n        transparent 8px,\n        rgba(255, 255, 255, 0.15) 8px,\n        rgba(255, 255, 255, 0.15) 16px\n    );\n}\n\n.timer-text-inline {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n    font-family: \"Fredoka\", sans-serif;\n    font-size: 18px;\n    font-weight: 700;\n    color: var(--color-text);\n    text-shadow: 0 1px 2px rgba(255, 255, 255, 0.9);\n}\n\n/* Legacy classes for compatibility */\n\n.timer-container {\n    width: 100%;\n    height: 32px;\n    position: relative;\n}\n\n.timer-bg {\n    width: 100%;\n    height: 100%;\n    background: rgba(255, 255, 255, 0.8);\n    border-radius: 20px;\n    border: 3px solid var(--color-primary);\n    overflow: hidden;\n    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n}\n\n.timer-fill {\n    height: 100%;\n    background: linear-gradient(90deg, #FFED4E 0%, #00B5E2 50%, #7FD8F7 100%);\n    transition: width 0.1s linear;\n    position: relative;\n}\n\n.timer-fill::after {\n    content: \"\";\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    background: repeating-linear-gradient(\n        45deg,\n        transparent,\n        transparent 10px,\n        rgba(255, 255, 255, 0.3) 10px,\n        rgba(255, 255, 255, 0.3) 20px\n    );\n}\n\n.timer-text {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n    font-family: \"Fredoka\", sans-serif;\n    font-size: 24px;\n    font-weight: 700;\n    color: var(--color-text);\n    text-shadow: 0 2px 4px rgba(255, 255, 255, 0.8);\n}\n\n.prompt-card { position: relative; top: 80px; left: 50%; transform: translateX(-50%); width: 90%; max-width: 600px; background: white; border-radius: 16px; padding: var(--space-md); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15); border: 4px solid var(--color-primary); text-align: center; display: flex; flex-direction: column; justify-content: center; gap: var(--space-xs); z-index: 3; }\n\n.hint-button { position: absolute; top: 50%; right: var(--space-md); transform: translateY(-50%); min-width: 64px; height: 64px; border: none; border-radius: 50%; background: linear-gradient(135deg, #FEF3C7 0%, #FDE68A 50%, #FCD34D 100%); color: #78350F; font-size: 32px; cursor: pointer; transition: all var(--transition-fast) var(--ease-out); box-shadow: 0 4px 20px rgba(253, 230, 138, 0.7), \n                        0 0 25px rgba(254, 243, 199, 0.5),\n                        inset 0 2px 10px rgba(255, 255, 255, 0.9); border: 3px solid rgba(255, 255, 255, 0.95); display: flex; align-items: center; justify-content: center; flex-shrink: 0; text-shadow: 0 1px 3px rgba(255, 255, 255, 0.8); }\n\n.hint-button:active {\n    transform: translateY(-50%) scale(0.95);\n}\n\n.hint-button.hidden {\n    display: none;\n}\n\n.prompt-card.hidden {\n    display: none;\n}\n\n.prompt-title {\n    font-family: \"Fredoka\", sans-serif;\n    font-size: 28px;\n    font-weight: 700;\n    color: var(--color-primary);\n    text-shadow: 2px 2px 0 rgba(255, 255, 255, 0.5);\n    line-height: 1.2;\n}\n\n.prompt-description { font-family: \"Poppins\", sans-serif; font-size: 18px; color: var(--color-text); line-height: 1.4; display: none; }\n\n.timer-container.hidden,\n.timer-container-inline.hidden {\n    display: none;\n}\n\n/* ===== MASCOT ===== */\n\n.mascot-container { position: absolute; bottom: 450px; left: 70%; transform: translateX(-50%); width: 120px; height: 120px; z-index: 3; pointer-events: none; transition: bottom 0.8s cubic-bezier(0.4, 0.0, 0.2, 1), left 0.8s cubic-bezier(0.4, 0.0, 0.2, 1), transform 0.8s cubic-bezier(0.4, 0.0, 0.2, 1); }\n\n.mascot-image {\n            width: 100%;\n            height: 100%;\n            object-fit: contain;\n            filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2));\n            transition: transform 0.3s var(--ease-bounce);\n        }\n\n.mascot-bounce {\n            animation: mascot-bounce 0.5s var(--ease-bounce);\n        }\n\n.mascot-swimming {\n            animation: mascot-swim 0.4s ease-in-out infinite;\n        }\n\n@keyframes mascot-bounce {\n            0%, 100% { transform: scale(1); }\n            50% { transform: scale(1.15); }\n        }\n\n@keyframes mascot-swim {\n            0%, 100% { transform: translateX(-50%) translateY(0px) rotate(0deg); }\n            25% { transform: translateX(-50%) translateY(-3px) rotate(-2deg); }\n            50% { transform: translateX(-50%) translateY(0px) rotate(0deg); }\n            75% { transform: translateX(-50%) translateY(3px) rotate(2deg); }\n        }\n\n/* ===== BOTTOM CONTROLS ===== */\n\n.bottom-controls { position: absolute; bottom: 0; left: 0; width: 100%; background: linear-gradient(180deg, rgba(224, 247, 250, 0.98) 0%, rgba(178, 235, 242, 0.98) 100%); padding: 8px 12px; display: flex; flex-direction: column; gap: 6px; box-shadow: 0 -4px 20px rgba(64, 224, 208, 0.25), 0 0 15px rgba(127, 255, 212, 0.15); border-top: 2px solid rgba(64, 224, 208, 0.3); }\n\n.frosting-palette { display: flex; gap: 8px; overflow-x: auto; overflow-y: hidden; padding: 4px; -webkit-overflow-scrolling: touch; scrollbar-width: none; }\n\n.frosting-palette::-webkit-scrollbar {\n            display: none;\n        }\n\n.frosting-item { min-width: 65px; height: 65px; border-radius: 16px; border: 3px solid rgba(107, 182, 255, 0.4); cursor: pointer; transition: transform var(--transition-fast) var(--ease-out), box-shadow var(--transition-fast); box-shadow: 0 4px 15px rgba(107, 182, 255, 0.2), 0 0 10px rgba(135, 206, 235, 0.1); position: relative; }\n\n.frosting-item:active {\n            transform: scale(0.95);\n        }\n\n.frosting-item.selected {\n            border: 4px solid var(--color-primary);\n            box-shadow: 0 0 25px rgba(64, 224, 208, 0.8), 0 0 35px rgba(127, 255, 212, 0.5), 0 4px 20px rgba(147, 233, 190, 0.4);\n            transform: scale(1.05);\n        }\n\n.decoration-palette { display: flex; gap: 8px; overflow-x: auto; overflow-y: hidden; padding: 4px; -webkit-overflow-scrolling: touch; scrollbar-width: none; }\n\n.decoration-palette::-webkit-scrollbar {\n            display: none;\n        }\n\n.decoration-item { min-width: 80px; height: 80px; background: linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, rgba(232, 244, 248, 0.9) 100%); border-radius: 16px; border: 3px solid rgba(160, 216, 240, 0.5); display: flex; align-items: center; justify-content: center; cursor: pointer; transition: transform var(--transition-fast) var(--ease-out), box-shadow var(--transition-fast); box-shadow: 0 4px 15px rgba(160, 216, 240, 0.25), 0 0 10px rgba(192, 216, 232, 0.15); position: relative; }\n\n.decoration-item:active {\n            transform: scale(0.95);\n        }\n\n.decoration-item:hover {\n            box-shadow: 0 6px 20px rgba(160, 216, 240, 0.4), 0 0 15px rgba(192, 216, 232, 0.3);\n            transform: scale(1.02);\n        }\n\n.decoration-item img {\n            width: 70%;\n            height: 70%;\n            object-fit: contain;\n            pointer-events: none;\n        }\n\n.button-row { display: flex; gap: 6px; justify-content: center; }\n\n.game-button { min-width: 80px; height: 56px; border: none; border-radius: 16px; font-family: \"Fredoka\", sans-serif; font-size: 24px; font-weight: 600; cursor: pointer; transition: all var(--transition-fast) var(--ease-out); box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2), 0 0 10px rgba(255, 255, 255, 0.3); display: flex; align-items: center; justify-content: center; gap: var(--space-xs); }\n\n.game-button:active {\n            transform: translateY(2px);\n            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2), 0 0 8px rgba(255, 255, 255, 0.2);\n        }\n\n.btn-undo {\n            background: linear-gradient(135deg, #B2EBF2 0%, #80DEEA 50%, #4DD0E1 100%);\n            color: #006064;\n            box-shadow: 0 4px 15px rgba(128, 222, 234, 0.6), \n                        0 0 20px rgba(178, 235, 242, 0.4),\n                        inset 0 1px 8px rgba(255, 255, 255, 0.8);\n            border: 2px solid rgba(255, 255, 255, 0.9);\n            text-shadow: 0 1px 2px rgba(255, 255, 255, 0.8);\n        }\n\n.btn-clear {\n            background: linear-gradient(135deg, #FFCCBC 0%, #FFAB91 50%, #FF7F50 100%);\n            color: #BF360C;\n            box-shadow: 0 4px 15px rgba(255, 127, 80, 0.6), \n                        0 0 20px rgba(255, 171, 145, 0.4),\n                        inset 0 1px 8px rgba(255, 255, 255, 0.7);\n            border: 2px solid rgba(255, 255, 255, 0.8);\n            text-shadow: 0 1px 2px rgba(255, 255, 255, 0.7);\n        }\n\n.btn-done {\n            background: linear-gradient(135deg, #FFFFFF 0%, #E0F7FA 30%, #B2EBF2 70%, #80DEEA 100%);\n            color: #006064;\n            flex: 1;\n            max-width: 300px;\n            box-shadow: 0 4px 20px rgba(128, 222, 234, 0.7), \n                        0 0 25px rgba(178, 235, 242, 0.5),\n                        inset 0 2px 12px rgba(255, 255, 255, 0.9);\n            border: 3px solid rgba(255, 255, 255, 0.95);\n            text-shadow: 0 1px 3px rgba(255, 255, 255, 0.9);\n        }\n\n.btn-new-canvas {\n            background: linear-gradient(135deg, #E1F5FE 0%, #B3E5FC 50%, #81D4FA 100%);\n            color: #01579B;\n            flex: 1;\n            max-width: 300px;\n            box-shadow: 0 4px 20px rgba(129, 212, 250, 0.7), \n                        0 0 25px rgba(179, 229, 252, 0.5),\n                        inset 0 2px 12px rgba(255, 255, 255, 0.8);\n            border: 3px solid rgba(255, 255, 255, 0.9);\n            text-shadow: 0 1px 3px rgba(255, 255, 255, 0.9);\n        }\n\n/* ===== RESULTS SCREEN ===== */\n\n.results-screen {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            background: linear-gradient(135deg, \n                rgba(64, 224, 208, 0.3) 0%, \n                rgba(127, 255, 212, 0.4) 25%, \n                rgba(147, 233, 190, 0.35) 50%, \n                rgba(178, 235, 242, 0.4) 75%, \n                rgba(64, 224, 208, 0.3) 100%);\n            backdrop-filter: blur(10px);\n            display: none;\n            align-items: center;\n            justify-content: center;\n            z-index: 10;\n        }\n\n.results-screen.active {\n            display: flex;\n        }\n\n.results-content {\n            background: linear-gradient(135deg, \n                rgba(240, 255, 255, 0.98) 0%, \n                rgba(224, 247, 250, 0.98) 15%, \n                rgba(178, 235, 242, 0.96) 30%, \n                rgba(127, 255, 212, 0.95) 50%, \n                rgba(147, 233, 190, 0.96) 70%, \n                rgba(178, 235, 242, 0.98) 85%, \n                rgba(240, 255, 255, 0.98) 100%);\n            border-radius: 40px;\n            padding: var(--space-xl);\n            max-width: 90%;\n            text-align: center;\n            box-shadow: \n                0 12px 40px rgba(64, 224, 208, 0.6),\n                0 6px 20px rgba(127, 255, 212, 0.7),\n                0 0 60px rgba(147, 233, 190, 0.5),\n                inset 0 3px 20px rgba(255, 255, 255, 0.9),\n                inset 0 -3px 20px rgba(64, 224, 208, 0.3),\n                inset 2px 2px 8px rgba(255, 255, 255, 0.8);\n            border: 5px solid rgba(64, 224, 208, 0.8);\n            position: relative;\n            overflow: hidden;\n        }\n\n.results-content::before {\n            content: \"\";\n            position: absolute;\n            top: -50%;\n            left: -50%;\n            width: 200%;\n            height: 200%;\n            background: repeating-linear-gradient(\n                120deg,\n                transparent,\n                transparent 25px,\n                rgba(127, 255, 212, 0.2) 25px,\n                rgba(127, 255, 212, 0.2) 30px,\n                transparent 30px,\n                transparent 55px,\n                rgba(64, 224, 208, 0.15) 55px,\n                rgba(64, 224, 208, 0.15) 60px\n            );\n            pointer-events: none;\n            animation: ocean-waves 4s linear infinite;\n        }\n\n.results-content::after {\n            content: \"\ud83c\udf0a\";\n            position: absolute;\n            font-size: 80px;\n            opacity: 0.08;\n            pointer-events: none;\n            z-index: 0;\n            top: 10px;\n            right: 20px;\n        }\n\n@keyframes ocean-waves {\n            0% { transform: translate(0, 0); }\n            100% { transform: translate(60px, 60px); }\n        }\n\n.results-title {\n            font-family: \"Fredoka\", sans-serif;\n            font-size: 40px;\n            font-weight: 700;\n            color: #006994;\n            margin-bottom: var(--space-md);\n            line-height: 1.2;\n            text-shadow: \n                0 3px 10px rgba(64, 224, 208, 0.8),\n                0 0 25px rgba(255, 255, 255, 0.9),\n                2px 2px 0 rgba(255, 255, 255, 0.95),\n                -1px -1px 0 rgba(127, 255, 212, 0.6),\n                0 0 50px rgba(147, 233, 190, 0.5);\n            position: relative;\n            z-index: 1;\n        }\n\n.stars-container {\n            display: flex;\n            gap: var(--space-sm);\n            justify-content: center;\n            margin: var(--space-lg) 0;\n        }\n\n.star {\n            width: 80px;\n            height: 80px;\n            object-fit: contain;\n        }\n\n.score-text {\n            font-family: \"Fredoka\", sans-serif;\n            font-size: 32px;\n            color: #3A7CA5;\n            margin: var(--space-md) 0;\n            position: relative;\n            z-index: 1;\n            text-shadow: 0 1px 4px rgba(255, 255, 255, 0.8);\n        }\n\n.next-button {\n            background: linear-gradient(135deg, \n                #7FFFD4 0%, \n                #40E0D0 20%, \n                #00CED1 40%, \n                #20B2AA 70%, \n                #008B8B 100%);\n            color: #FFFFFF;\n            border: none;\n            border-radius: 25px;\n            padding: var(--space-md) var(--space-xl);\n            font-family: \"Fredoka\", sans-serif;\n            font-size: 28px;\n            font-weight: 600;\n            cursor: pointer;\n            transition: all var(--transition-fast) var(--ease-out);\n            box-shadow: \n                0 6px 30px rgba(64, 224, 208, 0.9), \n                0 0 40px rgba(127, 255, 212, 0.8),\n                0 3px 15px rgba(147, 233, 190, 0.7),\n                inset 0 2px 15px rgba(255, 255, 255, 0.5),\n                inset 0 -2px 10px rgba(0, 105, 148, 0.3);\n            margin-top: var(--space-md);\n            border: 4px solid rgba(255, 255, 255, 0.9);\n            position: relative;\n            z-index: 1;\n            text-shadow: \n                0 2px 4px rgba(0, 105, 148, 0.8),\n                0 0 10px rgba(255, 255, 255, 0.3);\n            overflow: hidden;\n        }\n\n.next-button::before {\n            content: \"\ud83c\udf0a\";\n            position: absolute;\n            left: 15px;\n            font-size: 24px;\n            opacity: 0.7;\n        }\n\n.next-button::after {\n            content: \"\ud83c\udf0a\";\n            position: absolute;\n            right: 15px;\n            font-size: 24px;\n            opacity: 0.7;\n        }\n\n.next-button:active {\n            transform: translateY(3px);\n            box-shadow: \n                0 3px 20px rgba(64, 224, 208, 0.9), \n                0 0 30px rgba(127, 255, 212, 0.7),\n                inset 0 2px 12px rgba(255, 255, 255, 0.4),\n                inset 0 -2px 8px rgba(0, 105, 148, 0.4);\n        }\n\n/* ===== EDIT MODE ===== */\n\n.edit-panel { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: white; display: none; flex-direction: column; z-index: 5; overflow-y: auto; }\n\n.edit-panel.active {\n            display: flex;\n        }\n\n.edit-header {\n            background: var(--color-primary);\n            color: white;\n            padding: var(--space-md);\n            font-family: \"Fredoka\", sans-serif;\n            font-size: 32px;\n            font-weight: 700;\n            text-align: center;\n        }\n\n.edit-tabs {\n            display: flex;\n            background: white;\n            border-bottom: 2px solid #ddd;\n        }\n\n.edit-tab {\n            flex: 1;\n            padding: var(--space-md);\n            background: #f5f5f5;\n            border: none;\n            font-family: \"Fredoka\", sans-serif;\n            font-size: 20px;\n            cursor: pointer;\n            transition: background var(--transition-fast);\n        }\n\n.edit-tab.active {\n            background: white;\n            border-bottom: 3px solid var(--color-primary);\n        }\n\n.edit-content {\n            flex: 1;\n            padding: var(--space-md);\n            overflow-y: auto;\n        }\n\n.edit-section {\n            display: none;\n        }\n\n.edit-section.active {\n            display: block;\n        }\n\n.setting-group {\n            background: white;\n            border-radius: 12px;\n            padding: var(--space-md);\n            margin-bottom: var(--space-md);\n            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n        }\n\n.setting-label {\n            font-family: \"Fredoka\", sans-serif;\n            font-size: 22px;\n            font-weight: 600;\n            color: var(--color-text);\n            margin-bottom: var(--space-sm);\n        }\n\n.setting-input {\n            width: 100%;\n            padding: var(--space-sm);\n            font-size: 18px;\n            border: 2px solid #ddd;\n            border-radius: 8px;\n            font-family: \"Poppins\", sans-serif;\n        }\n\n.prompt-list {\n            display: flex;\n            flex-direction: column;\n            gap: var(--space-sm);\n        }\n\n.prompt-item {\n            background: #f9f9f9;\n            border-radius: 8px;\n            padding: var(--space-md);\n            border: 2px solid #ddd;\n        }\n\n.prompt-item-title {\n            font-family: \"Fredoka\", sans-serif;\n            font-size: 20px;\n            font-weight: 600;\n            margin-bottom: var(--space-xs);\n        }\n\n.checkbox-group {\n            display: flex;\n            flex-wrap: wrap;\n            gap: var(--space-sm);\n        }\n\n.checkbox-item {\n            display: flex;\n            align-items: center;\n            gap: var(--space-xs);\n            padding: var(--space-xs) var(--space-sm);\n            background: white;\n            border: 2px solid #ddd;\n            border-radius: 8px;\n        }\n\n.checkbox-item input {\n            width: 24px;\n            height: 24px;\n        }\n\n.checkbox-item label {\n            font-size: 18px;\n        }\n\n/* ===== DRAGGING DECORATION ===== */\n\n.dragging-decoration { position: absolute; width: auto; height: auto; pointer-events: none; z-index: 100; opacity: 0.8; }\n\n/* ===== LOADING SCREEN ===== */\n\n.loading-screen {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            background: linear-gradient(180deg, \n                #001F3F 0%, \n                #003D5C 15%, \n                #005A7A 30%, \n                #007898 50%, \n                #0095B6 70%, \n                #00B2D4 85%, \n                #40E0D0 100%);\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: center;\n            z-index: 20;\n            gap: var(--space-lg);\n            overflow: hidden;\n            position: relative;\n        }\n\n/* Underwater wave overlay */\n\n.loading-screen::before {\n            content: \"\";\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            background: repeating-linear-gradient(\n                90deg,\n                transparent,\n                transparent 80px,\n                rgba(64, 224, 208, 0.03) 80px,\n                rgba(64, 224, 208, 0.03) 160px\n            );\n            animation: loading-wave-scroll 20s linear infinite;\n            pointer-events: none;\n        }\n\n/* Light rays from surface */\n\n.loading-screen::after {\n            content: \"\";\n            position: absolute;\n            top: -10%;\n            left: 0;\n            width: 100%;\n            height: 50%;\n            background: repeating-linear-gradient(\n                105deg,\n                transparent,\n                transparent 60px,\n                rgba(255, 255, 255, 0.03) 60px,\n                rgba(255, 255, 255, 0.03) 70px,\n                transparent 70px,\n                transparent 130px\n            );\n            animation: loading-light-rays 15s linear infinite;\n            pointer-events: none;\n        }\n\n@keyframes loading-wave-scroll {\n            0% { transform: translateX(0); }\n            100% { transform: translateX(160px); }\n        }\n\n@keyframes loading-light-rays {\n            0% { transform: translateX(-50px); }\n            100% { transform: translateX(50px); }\n        }\n\n.loading-screen.hidden {\n            display: none;\n        }\n\n/* Floating ocean bubbles */\n\n.loading-sparkle {\n            position: absolute;\n            font-size: 20px;\n            animation: loading-bubble-rise 4s ease-in-out infinite;\n            opacity: 0;\n        }\n\n@keyframes loading-bubble-rise {\n            0% { \n                transform: translateY(100vh) scale(0.5); \n                opacity: 0; \n            }\n            10% { \n                opacity: 0.6; \n            }\n            90% { \n                opacity: 0.6; \n            }\n            100% { \n                transform: translateY(-100px) translateX(20px) scale(1.2); \n                opacity: 0; \n            }\n        }\n\n/* Floating ocean decorations (shells, pearls, fish) */\n\n.loading-heart {\n            position: absolute;\n            font-size: 28px;\n            animation: loading-ocean-float 8s ease-in-out infinite;\n            opacity: 0.7;\n        }\n\n@keyframes loading-ocean-float {\n            0% { \n                transform: translateY(0) translateX(0) rotate(0deg); \n                opacity: 0.5; \n            }\n            25% { \n                transform: translateY(-20px) translateX(15px) rotate(90deg); \n                opacity: 0.8; \n            }\n            50% { \n                transform: translateY(-10px) translateX(-10px) rotate(180deg); \n                opacity: 0.7; \n            }\n            75% { \n                transform: translateY(-30px) translateX(10px) rotate(270deg); \n                opacity: 0.8; \n            }\n            100% { \n                transform: translateY(0) translateX(0) rotate(360deg); \n                opacity: 0.5; \n            }\n        }\n\n/* Bouncy stars around mascot */\n\n.loading-mascot-star {\n            position: absolute;\n            font-size: 16px;\n            animation: loading-star-bounce 1.5s ease-in-out infinite;\n        }\n\n@keyframes loading-star-bounce {\n            0%, 100% { transform: translateY(0px) scale(1) rotate(0deg); }\n            50% { transform: translateY(-15px) scale(1.3) rotate(180deg); }\n        }\n\n.loading-title {\n            font-family: \"Fredoka\", sans-serif;\n            font-size: 64px;\n            font-weight: 700;\n            text-align: center;\n            perspective: 1000px;\n            margin-bottom: var(--space-md);\n            filter: drop-shadow(0 0 30px rgba(64, 224, 208, 0.9)) \n                    drop-shadow(0 0 50px rgba(127, 255, 212, 0.7));\n        }\n\n.loading-title-text { \n            display: inline-block; \n            color: #FFFFFF;\n            text-shadow: \n                0 0 20px rgba(64, 224, 208, 0.9),\n                0 0 40px rgba(127, 255, 212, 0.7),\n                0 0 60px rgba(147, 233, 190, 0.5),\n                -3px -3px 0 #40E0D0,\n                3px -3px 0 #7FFFD4,\n                -3px 3px 0 #7FFFD4,\n                3px 3px 0 #40E0D0,\n                -4px 0 0 rgba(64, 224, 208, 0.8),\n                4px 0 0 rgba(127, 255, 212, 0.8),\n                0 -4px 0 rgba(64, 224, 208, 0.8),\n                0 4px 0 rgba(127, 255, 212, 0.8); \n            animation: loading-float-gentle 4s ease-in-out infinite, loading-shimmer 3s ease-in-out infinite; \n            transform-style: preserve-3d; \n            letter-spacing: 3px; \n            font-size: 72px;\n        }\n\n@keyframes loading-float-gentle {\n            0%, 100% { transform: translateY(0px) rotateX(0deg); }\n            50% { transform: translateY(-15px) rotateX(3deg); }\n        }\n\n@keyframes loading-shimmer {\n            0%, 100% { \n                filter: brightness(1) hue-rotate(0deg); \n            }\n            50% { \n                filter: brightness(1.3) hue-rotate(10deg); \n            }\n        }\n\n.loading-spongebob-container {\n            width: 280px;\n            height: 280px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            animation: loading-mascot-swim 3s ease-in-out infinite;\n            position: relative;\n            filter: drop-shadow(0 15px 40px rgba(64, 224, 208, 0.6)) \n                    drop-shadow(0 0 50px rgba(127, 255, 212, 0.4));\n        }\n\n@keyframes loading-mascot-swim {\n            0%, 100% { \n                transform: translateY(0px) translateX(0px) rotate(-2deg); \n            }\n            25% { \n                transform: translateY(-15px) translateX(10px) rotate(2deg); \n            }\n            50% { \n                transform: translateY(-25px) translateX(0px) rotate(-2deg); \n            }\n            75% { \n                transform: translateY(-15px) translateX(-10px) rotate(2deg); \n            }\n        }\n\n.loading-spongebob-container img {\n            width: 100%;\n            height: 100%;\n            object-fit: contain;\n            filter: drop-shadow(0 10px 30px rgba(0, 0, 0, 0.3));\n        }\n\n.loading-progress {\n            width: 280px;\n            height: 16px;\n            background: rgba(0, 31, 63, 0.4);\n            border-radius: 20px;\n            overflow: hidden;\n            box-shadow: \n                0 4px 16px rgba(64, 224, 208, 0.4), \n                0 0 20px rgba(127, 255, 212, 0.3),\n                inset 0 2px 8px rgba(0, 0, 0, 0.3);\n            border: 3px solid rgba(64, 224, 208, 0.6);\n            position: relative;\n        }\n\n.loading-progress::before {\n            content: \"\";\n            position: absolute;\n            top: 0;\n            left: -100%;\n            width: 100%;\n            height: 100%;\n            background: linear-gradient(90deg, transparent, rgba(127, 255, 212, 0.4), transparent);\n            animation: loading-shimmer 2s infinite;\n        }\n\n@keyframes loading-shimmer {\n            0% { left: -100%; }\n            100% { left: 200%; }\n        }\n\n.loading-progress-bar {\n            height: 100%;\n            background: linear-gradient(90deg, \n                #00B2D4 0%, \n                #40E0D0 20%, \n                #7FFFD4 40%, \n                #93E9BE 60%, \n                #B2EBF2 80%, \n                #E0F7FA 100%);\n            width: 0%;\n            transition: width 0.3s ease;\n            border-radius: 20px;\n            box-shadow: \n                0 0 25px rgba(64, 224, 208, 0.8), \n                inset 0 2px 8px rgba(255, 255, 255, 0.3),\n                inset 0 0 20px rgba(127, 255, 212, 0.2);\n            animation: loading-bar-glow 1.5s ease-in-out infinite;\n            position: relative;\n            overflow: hidden;\n        }\n\n.loading-progress-bar::after {\n            content: \"\";\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            background: repeating-linear-gradient(\n                45deg,\n                transparent,\n                transparent 8px,\n                rgba(255, 255, 255, 0.15) 8px,\n                rgba(255, 255, 255, 0.15) 16px\n            );\n        }\n\n@keyframes loading-bar-glow {\n            0%, 100% { filter: brightness(1); }\n            50% { filter: brightness(1.2); }\n        }\n\n.loading-text { \n            font-family: \"Fredoka\", sans-serif; \n            font-size: 24px; \n            font-weight: 600; \n            color: #FFFFFF; \n            text-align: center; \n            animation: loading-text-pulse 2s ease-in-out infinite; \n            text-shadow: \n                0 0 20px rgba(64, 224, 208, 0.9), \n                0 0 40px rgba(127, 255, 212, 0.8), \n                -2px -2px 0 rgba(40, 200, 180, 0.6), \n                2px -2px 0 rgba(40, 200, 180, 0.6), \n                -2px 2px 0 rgba(40, 200, 180, 0.6), \n                2px 2px 0 rgba(40, 200, 180, 0.6), \n                0 -2px 0 rgba(30, 180, 160, 0.7), \n                0 2px 0 rgba(30, 180, 160, 0.7), \n                -2px 0 0 rgba(30, 180, 160, 0.7), \n                2px 0 0 rgba(30, 180, 160, 0.7); \n            -webkit-text-stroke: 2px rgba(64, 224, 208, 0.3); \n        }\n\n.loading-subtitle { \n            font-family: \"Fredoka\", sans-serif; \n            font-size: 18px; \n            font-weight: 400; \n            color: rgba(255, 255, 255, 0.9); \n            text-align: center; \n            margin-top: -8px; \n            animation: loading-text-pulse 2s ease-in-out infinite 0.2s; \n            text-shadow: \n                0 0 15px rgba(64, 224, 208, 0.7), \n                0 0 25px rgba(127, 255, 212, 0.5);\n        }\n\n@keyframes loading-text-pulse {\n            0%, 100% { \n                transform: translateY(0px); \n                opacity: 0.9; \n            }\n            50% { \n                transform: translateY(-3px); \n                opacity: 1; \n            }\n        }\n\n/* ===== HINT MODAL ===== */\n\n.hint-modal {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            background: rgba(0, 0, 0, 0.7);\n            display: none;\n            align-items: center;\n            justify-content: center;\n            z-index: 15;\n        }\n\n.hint-modal.active {\n            display: flex;\n        }\n\n.hint-modal-content {\n            background: linear-gradient(135deg, #E0F7FA 0%, #B2EBF2 50%, #80DEEA 100%);\n            border-radius: 24px;\n            padding: var(--space-xl);\n            max-width: 80%;\n            text-align: center;\n            box-shadow: 0 12px 48px rgba(64, 224, 208, 0.4), 0 0 30px rgba(127, 255, 212, 0.3);\n            border: 3px solid rgba(64, 224, 208, 0.4);\n        }\n\n.hint-modal-title {\n            font-family: \"Fredoka\", sans-serif;\n            font-size: 32px;\n            font-weight: 700;\n            color: var(--color-warning);\n            margin-bottom: var(--space-md);\n            text-shadow: 0 2px 10px rgba(255, 217, 125, 0.4);\n        }\n\n.hint-modal-text {\n            font-family: \"Poppins\", sans-serif;\n            font-size: 20px;\n            color: var(--color-text);\n            margin-bottom: var(--space-lg);\n            line-height: 1.6;\n        }\n\n.hint-modal-close {\n            background: linear-gradient(135deg, #B2EBF2 0%, #80DEEA 50%, #4DD0E1 100%);\n            color: #006064;\n            border: none;\n            border-radius: 16px;\n            padding: var(--space-md) var(--space-xl);\n            font-family: \"Fredoka\", sans-serif;\n            font-size: 24px;\n            font-weight: 600;\n            cursor: pointer;\n            transition: all var(--transition-fast) var(--ease-out);\n            box-shadow: 0 4px 20px rgba(128, 222, 234, 0.7), \n                        0 0 20px rgba(178, 235, 242, 0.5),\n                        inset 0 2px 10px rgba(255, 255, 255, 0.9);\n            border: 3px solid rgba(255, 255, 255, 0.9);\n            text-shadow: 0 1px 2px rgba(255, 255, 255, 0.8);\n        }\n\n.hint-modal-close:active {\n            transform: translateY(2px);\n            box-shadow: 0 2px 15px rgba(186, 230, 253, 0.7), \n                        0 0 15px rgba(224, 242, 254, 0.5),\n                        inset 0 2px 8px rgba(255, 255, 255, 0.85);\n        }\n\n/* ===== ANIMATIONS ===== */\n\n@keyframes bobCarriedItem {\n    0%, 100% { transform: translateY(-50%) translateX(0); }\n    50% { transform: translateY(-50%) translateX(3px); }\n}\n\n@keyframes sparkle {\n            0%, 100% { transform: scale(1) rotate(0deg); }\n            50% { transform: scale(1.2) rotate(180deg); }\n        }\n\n.star.earned {\n            animation: sparkle 0.6s var(--ease-bounce);\n        }\n\n@keyframes pulse {\n            0%, 100% { transform: scale(1); }\n            50% { transform: scale(1.05); }\n        }\n\n.timer-warning {\n            animation: pulse 0.5s infinite;\n        }\n\n.timer-container-inline.timer-warning {\n            animation: pulse 0.5s infinite;\n        }\n\n/* ===== MODE SELECTOR ===== */\n\n.mode-selector {\n            position: absolute;\n            top: var(--space-sm);\n            left: 50%;\n            transform: translateX(-50%);\n            display: flex;\n            gap: var(--space-sm);\n            z-index: 10;\n            background: linear-gradient(135deg, rgba(224, 247, 250, 0.95) 0%, rgba(178, 235, 242, 0.95) 100%);\n            border-radius: 20px;\n            padding: 6px;\n            box-shadow: 0 4px 20px rgba(64, 224, 208, 0.25), 0 0 12px rgba(127, 255, 212, 0.2);\n            border: 2px solid rgba(64, 224, 208, 0.3);\n        }\n\n.mode-btn {\n            padding: 8px 20px;\n            border: none;\n            border-radius: 16px;\n            font-family: \"Fredoka\", sans-serif;\n            font-size: 18px;\n            font-weight: 600;\n            cursor: pointer;\n            transition: all var(--transition-fast) var(--ease-out);\n            background: linear-gradient(135deg, rgba(255, 255, 255, 0.8) 0%, rgba(240, 249, 255, 0.8) 100%);\n            color: var(--color-text);\n            border: 2px solid rgba(224, 242, 254, 0.6);\n        }\n\n.mode-btn.active {\n            background: linear-gradient(135deg, #B2EBF2 0%, #80DEEA 50%, #4DD0E1 100%);\n            color: #006064;\n            box-shadow: 0 2px 15px rgba(128, 222, 234, 0.7), \n                        0 0 20px rgba(178, 235, 242, 0.5),\n                        inset 0 1px 8px rgba(255, 255, 255, 0.9);\n            border: 2px solid rgba(255, 255, 255, 0.9);\n            text-shadow: 0 1px 2px rgba(255, 255, 255, 0.8);\n        }\n\n.mode-btn:active {\n            transform: scale(0.95);\n        }\n\n.timer-container.hidden {\n            display: none;\n        }\n\n/* ===== GALLERY BUTTON ===== */\n\n.gallery-button {\n            position: absolute;\n            top: var(--space-sm);\n            right: var(--space-md);\n            padding: 8px 20px;\n            border: none;\n            border-radius: 16px;\n            font-family: \"Fredoka\", sans-serif;\n            font-size: 18px;\n            font-weight: 600;\n            cursor: pointer;\n            transition: all var(--transition-fast) var(--ease-out);\n            background: linear-gradient(135deg, #E0F7FA 0%, #B2EBF2 50%, #80DEEA 100%);\n            color: #006064;\n            box-shadow: 0 4px 18px rgba(178, 235, 242, 0.6), \n                        0 0 20px rgba(128, 222, 234, 0.4),\n                        inset 0 1px 8px rgba(255, 255, 255, 0.9);\n            border: 2px solid rgba(255, 255, 255, 0.9);\n            z-index: 10;\n            display: none;\n            text-shadow: 0 1px 2px rgba(255, 255, 255, 0.8);\n        }\n\n.gallery-button.visible {\n            display: block;\n        }\n\n.gallery-button:active {\n            transform: scale(0.95);\n        }\n\n/* ===== GALLERY MODAL ===== */\n\n.gallery-modal {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            background: rgba(0, 0, 0, 0.8);\n            display: none;\n            align-items: center;\n            justify-content: center;\n            z-index: 20;\n            overflow-y: auto;\n        }\n\n.gallery-modal.active {\n            display: flex;\n        }\n\n.gallery-content {\n            background: white;\n            border-radius: 24px;\n            padding: var(--space-xl);\n            max-width: 90%;\n            max-height: 90%;\n            overflow-y: auto;\n            box-shadow: 0 12px 48px rgba(0, 0, 0, 0.3);\n        }\n\n.gallery-header {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            margin-bottom: var(--space-lg);\n        }\n\n.gallery-title {\n            font-family: \"Fredoka\", sans-serif;\n            font-size: 36px;\n            font-weight: 700;\n            color: var(--color-primary);\n        }\n\n.gallery-close {\n            background: var(--color-danger);\n            color: white;\n            border: none;\n            border-radius: 50%;\n            width: 48px;\n            height: 48px;\n            font-size: 24px;\n            cursor: pointer;\n            transition: all var(--transition-fast) var(--ease-out);\n            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n        }\n\n.gallery-close:active {\n            transform: scale(0.95);\n        }\n\n.gallery-grid {\n            display: grid;\n            grid-template-columns: repeat(2, 1fr);\n            gap: var(--space-md);\n        }\n\n.gallery-item {\n            background: #f9f9f9;\n            border-radius: 16px;\n            padding: var(--space-md);\n            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n            display: flex;\n            flex-direction: column;\n            gap: var(--space-sm);\n        }\n\n.gallery-preview {\n            width: 100%;\n            aspect-ratio: 1;\n            border-radius: 12px;\n            overflow: hidden;\n            background: linear-gradient(180deg, #FFE5EC 0%, #FFF0F5 50%, #E5F4FF 100%);\n        }\n\n.gallery-preview canvas {\n            width: 100%;\n            height: 100%;\n        }\n\n.gallery-item-info {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n        }\n\n.gallery-timestamp {\n            font-family: \"Poppins\", sans-serif;\n            font-size: 12px;\n            color: var(--color-text-light);\n        }\n\n.gallery-delete {\n            background: var(--color-danger);\n            color: white;\n            border: none;\n            border-radius: 8px;\n            padding: 6px 12px;\n            font-family: \"Fredoka\", sans-serif;\n            font-size: 14px;\n            font-weight: 600;\n            cursor: pointer;\n            transition: all var(--transition-fast) var(--ease-out);\n        }\n\n.gallery-delete:active {\n            transform: scale(0.95);\n        }\n\n.gallery-empty {\n            text-align: center;\n            padding: var(--space-xl);\n            font-family: \"Poppins\", sans-serif;\n            font-size: 18px;\n            color: var(--color-text-light);\n        }\n\n/* ===== SUCCESS MESSAGE ===== */\n\n.success-message {\n            position: fixed;\n            top: 50%;\n            left: 50%;\n            transform: translate(-50%, -50%);\n            background: linear-gradient(135deg, #93E9BE 0%, #7FFFD4 100%);\n            color: white;\n            padding: var(--space-md) var(--space-xl);\n            border-radius: 16px;\n            font-family: \"Fredoka\", sans-serif;\n            font-size: 24px;\n            font-weight: 600;\n            box-shadow: 0 8px 30px rgba(147, 233, 190, 0.5), 0 0 25px rgba(127, 255, 212, 0.4);\n            z-index: 25;\n            pointer-events: none;\n            opacity: 0;\n            transition: opacity var(--transition-normal) var(--ease-out);\n            border: 2px solid rgba(255, 255, 255, 0.5);\n        }\n\n.success-message.show {\n            opacity: 1;\n        }</style>\n</head>\n<body>\n    <div id=\"game-container\">\n        <img id=\"background\" alt=\"Background\">\n        <canvas id=\"game-canvas\" width=\"720\" height=\"1280\"></canvas>\n        \n        <!-- Loading Screen -->\n        <div class=\"loading-screen\" id=\"loading-screen\">\n            <div class=\"loading-title\">\n                <div class=\"loading-title-text\">Cake Splash</div>\n            </div>\n            <div class=\"loading-spongebob-container\">\n                <img id=\"loading-spongebob-image\" src=\"\" alt=\"Winter Reindeer\">\n            </div>\n            <div class=\"loading-progress\">\n                <div class=\"loading-progress-bar\" id=\"loading-progress-bar\"></div>\n            </div>\n            <div class=\"loading-text\">\ud83c\udf82 Get Ready to Decorate! \ud83c\udf82</div>\n            <div class=\"loading-subtitle\">\ud83c\udfa8 Make a splash with your cake designs! \ud83c\udf0a</div>\n        </div>\n        \n        <div class=\"ui-overlay\">\n            <!-- Mode Selector -->\n            <div class=\"mode-selector\" id=\"mode-selector\">\n                <button class=\"mode-btn active\" data-mode=\"challenge\">\ud83c\udfc6 Challenge</button>\n                <button class=\"mode-btn\" data-mode=\"free\">\ud83c\udfa8 Free Mode</button>\n            </div>\n            \n            <!-- Gallery Button -->\n            <button class=\"gallery-button\" id=\"gallery-button\">\ud83d\udcf7 Gallery</button>\n            \n            <!-- Game Title: Large title above the cake -->\n            <div class=\"game-title\">Cake Splash</div>\n            \n            <!-- Top HUD: Single horizontal bar with challenge and timer -->\n            <div class=\"top-hud\">\n                <div class=\"top-hud-challenge\">\n                    <span class=\"challenge-icon\">\u2728</span>\n                    <span class=\"challenge-text\" id=\"prompt-title\">Classic Vanilla</span>\n                </div>\n                <div class=\"top-hud-stars\">\n                    <span class=\"top-star\">\ud83c\udf0a</span>\n                    <span class=\"top-star\">\ud83e\udddc\u200d\u2640\ufe0f</span>\n                    <span class=\"top-star\">\ud83d\udc8e</span>\n                </div>\n                <div class=\"timer-container-inline\">\n                    <div class=\"timer-bg-inline\">\n                        <div class=\"timer-fill-inline\" id=\"timer-fill\"></div>\n                    </div>\n                    <div class=\"timer-text-inline\" id=\"timer-text\">60</div>\n                </div>\n            </div>\n            \n            <!-- Order Card: Displays the current challenge prominently -->\n            <div class=\"prompt-card\" id=\"prompt-card\">\n                <div class=\"prompt-title\" id=\"prompt-card-title\">Classic Vanilla</div>\n                <div class=\"prompt-description\" id=\"prompt-card-description\">White frosting, candles on top</div>\n                <button class=\"hint-button\" id=\"hint-button-card\" title=\"Show Hint\">\ud83d\udca1</button>\n            </div>\n\n            <!-- Mascot -->\n            <div class=\"mascot-container\" id=\"mascot-container\">\n                <img id=\"mascot-image\" class=\"mascot-image\" src=\"\" alt=\"Mascot\">\n            </div>\n            \n            <!-- Bottom Controls -->\n            <div class=\"bottom-controls\">\n                <div style=\"padding: var(--space-xs); display: flex; justify-content: space-between; align-items: center;\">\n                    <div>\n                        <span style=\"font-family: 'Fredoka', sans-serif; font-size: 18px; font-weight: 600; color: var(--color-text);\">Frosting Color</span>\n                        <span style=\"font-family: 'Poppins', sans-serif; font-size: 14px; color: var(--color-text-light); margin-left: 8px;\">Tap to select, then tap each of the 3 cake tiers</span>\n                    </div>\n                    <span style=\"font-family: 'Poppins', sans-serif; font-size: 14px; color: var(--color-text-light);\">Scroll for more \u2192</span>\n                </div>\n                <div class=\"frosting-palette\" id=\"frosting-palette\">\n                    <!-- Frosting colors will be added here -->\n                </div>\n                <div style=\"padding: var(--space-xs); display: flex; justify-content: space-between; align-items: center;\">\n                    <div>\n                        <span style=\"font-family: 'Fredoka', sans-serif; font-size: 18px; font-weight: 600; color: var(--color-text);\">Toppings</span>\n                        <span style=\"font-family: 'Poppins', sans-serif; font-size: 14px; color: var(--color-text-light); margin-left: 8px;\">Drag onto cake - tap to move them around</span>\n                    </div>\n                    <span style=\"font-family: 'Poppins', sans-serif; font-size: 14px; color: var(--color-text-light);\">Scroll for more \u2192</span>\n                </div>\n                <div class=\"decoration-palette\" id=\"decoration-palette\">\n                    <!-- Decoration items will be added here -->\n                </div>\n                <div class=\"button-row\">\n                    <button class=\"game-button btn-undo\" id=\"btn-undo\" title=\"Undo\">\u21b6</button>\n                    <button class=\"game-button btn-clear\" id=\"btn-clear\" title=\"Clear All\">\u2715</button>\n                    <button class=\"game-button btn-done\" id=\"btn-done\">\u2713 Done</button>\n                </div>\n            </div>\n\n            <!-- Results Screen -->\n            <div class=\"results-screen\" id=\"results-screen\">\n                <div class=\"results-content\">\n                    <div class=\"results-title\" id=\"results-title\">Round Complete!</div>\n                    <div class=\"stars-container\" id=\"stars-container\">\n                        <img class=\"star\" src=\"\" alt=\"Star\">\n                        <img class=\"star\" src=\"\" alt=\"Star\">\n                        <img class=\"star\" src=\"\" alt=\"Star\">\n                    </div>\n                    <div class=\"score-text\" id=\"score-text\">Total Score: 0</div>\n                    <div id=\"requirements-display\" style=\"margin: var(--space-md) 0; padding: var(--space-md); background: #f9f9f9; border-radius: 12px; text-align: left;\">\n                        <div style=\"font-family: 'Fredoka', sans-serif; font-size: 20px; font-weight: 600; color: var(--color-primary); margin-bottom: var(--space-sm);\">Required:</div>\n                        <div id=\"requirements-list\" style=\"font-family: 'Poppins', sans-serif; font-size: 16px; color: var(--color-text); line-height: 1.6;\"></div>\n                    </div>\n                    <button class=\"next-button\" id=\"next-button\">Next Round</button>\n                </div>\n            </div>\n\n            <!-- Hint Modal -->\n            <div class=\"hint-modal\" id=\"hint-modal\">\n                <div class=\"hint-modal-content\">\n                    <div class=\"hint-modal-title\">\ud83d\udca1 Hint</div>\n                    <div class=\"hint-modal-text\" id=\"hint-modal-text\"></div>\n                    <button class=\"hint-modal-close\" id=\"hint-modal-close\">Got it!</button>\n                </div>\n            </div>\n            \n            <!-- Gallery Modal -->\n            <div class=\"gallery-modal\" id=\"gallery-modal\">\n                <div class=\"gallery-content\">\n                    <div class=\"gallery-header\">\n                        <div class=\"gallery-title\">\ud83c\udf82 My Cakes</div>\n                        <button class=\"gallery-close\" id=\"gallery-close\">\u00d7</button>\n                    </div>\n                    <div id=\"gallery-grid-container\">\n                        <!-- Gallery items will be inserted here -->\n                    </div>\n                </div>\n            </div>\n            \n            <!-- Success Message -->\n            <div class=\"success-message\" id=\"success-message\"></div>\n\n            <!-- Edit Mode Panel -->\n            <div class=\"edit-panel\" id=\"edit-panel\">\n                <div class=\"edit-header\">Game Settings</div>\n                <div class=\"edit-tabs\">\n                    <button class=\"edit-tab active\" data-tab=\"prompts\">Prompts</button>\n                    <button class=\"edit-tab\" data-tab=\"timer\">Timer</button>\n                    <button class=\"edit-tab\" data-tab=\"decorations\">Decorations</button>\n                </div>\n                <div class=\"edit-content\" id=\"edit-content\">\n                    <!-- Content will be populated by JavaScript -->\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <script>\n        /* ==================================================\n         * GAME OVERVIEW: Frosting Frenzy - A time-based cake decorating game where players\n         * match design prompts by applying frosting colors and placing decorations on a 3-tier cake.\n         * Players tap cake tiers to cycle through frosting colors and drag decorations from a palette.\n         * Each round is evaluated based on how well the cake matches the prompt requirements,\n         * earning 1-3 stars. Edit mode allows customization of prompts, timer settings, and available decorations.\n         * \n         * GAME STATE SHAPE: window.gameConfig = {\n         *   prompts: [{ name, description, requiredFrosting: [{tier, color}], requiredDecorations: [{type, minCount}] }],\n         *   timerSettings: { startTime, reductionPerRound, minTime },\n         *   availableDecorations: { candle: true, flower: true, ... },\n         *   availableFrostingColors: { white: true, chocolate: true, ... }\n         * }\n         * ==================================================\n         */\n\n        // ===== ASSET CACHE =====\n        const assetCache = {\n            images: {},\n            audio: {},\n            audioContext: null,\n            audioBuffers: {}\n        };\n\n        // ===== GAME STATE =====\n        let currentMode = 'play';\n        let gameState = {\n            round: 1,\n            totalScore: 0,\n            timeRemaining: 60,\n            maxTime: 60,\n            currentPrompt: null,\n            cakeFrosting: [null, null, null], // Array: [bottom, middle, top] frosting color indices\n            decorations: [], // [{type, x, y}]\n            gamePhase: 'playing', // 'playing', 'evaluating', 'results'\n            lastFrameTime: 0,\n            selectedFrostingColor: null, // index of selected frosting color\n            mascotState: 'happy', // Current mascot emotion\n            actionHistory: [], // Track all actions for undo: [{type: 'frosting'|'decoration', ...}]\n            gameMode: 'challenge', // 'challenge' or 'free'\n            backgroundJellyfish: [], // [{x, y, speed, phase, scale}]\n            backgroundBubbles: [], // [{x, y, speedX, speedY, radius, phase, opacity}]\n            backgroundFish: [], // [{x, y, speedX, speedY, scale, flipX, phase, swimPhase, opacity}]\n            backgroundSeahorses: [], // [{x, y, speedX, speedY, scale, flipX, phase, finPhase, opacity}]\n            backgroundBirds: [], // [{x, y, speedX, speedY, scale, flipX, phase, flapPhase, opacity}]\n            lastActionTime: 0, // Track when last action happened for speed calculation\n            actionSpeedMultiplier: 1 // Current speed multiplier (1 = normal, higher = faster)\n        };\n        \n        // ===== DRAG STATE =====\n        let dragState = {\n            isDragging: false,\n            decorationType: null,\n            draggingDecorationIndex: null, // Index of decoration being repositioned\n            startX: 0,\n            startY: 0,\n            currentX: 0,\n            currentY: 0,\n            dragElement: null,\n            offsetX: 0, // Offset from decoration center to touch point\n            offsetY: 0\n        };\n\n        // ===== CANVAS SETUP =====\n        const canvas = document.getElementById('game-canvas');\n        const ctx = canvas.getContext('2d');\n\n        // ===== CAKE DIMENSIONS AND POSITIONS =====\n        const cakeConfig = {\n            centerX: 360,\n            centerY: 540,\n            width: 500,\n            height: 400\n        };\n\n        // ===== DECORATION TYPES =====\n        const decorationTypes = [\n            'seashell', 'starfish', 'pearl',\n            'coral', 'bubbles', 'seahorse',\n            'fish', 'mermaid_tail', 'mermaid', 'merman', 'mermaid_warrior', 'merman_adventurer',\n            'mermaid_queen', 'merman_musician', 'mermaid_dancer', 'merman_guardian',\n            'baby_mermaid', 'baby_merman', 'trident', 'crown',\n            'dolphin', 'octopus', 'jellyfish',\n            'jellyfish_blue', 'jellyfish_purple', 'jellyfish_orange', 'jellyfish_bioluminescent',\n            'treasure_chest', 'sea_turtle', 'anchor',\n            'conch', 'sand_dollar', 'water_splash', 'water_droplet', 'water_fountain',\n            'clownfish', 'narwhal', 'sea_otter', 'hermit_crab'\n        ];\n\n        const frostingColors = [\n            'coral', 'ocean', 'turquoise', 'pearl', 'seafoam', 'aquamarine',\n            'lavender', 'pink', 'shell', 'seaweed', 'starfish',\n            'moonlight', 'tide', 'bubble', 'scales', 'sunset',\n            'abyss', 'tropical', 'lagoon', 'sapphire', 'opal', 'sand'\n        ];\n\n        // ===== GALLERY STATE =====\n        let galleryData = {\n            cakes: [] // Array of saved cakes: [{frosting, decorations, timestamp}]\n        };\n        const MAX_GALLERY_CAKES = 20;\n\n        // ===== GALLERY FUNCTIONS =====\n        \n        // Load gallery from persistent storage\n        async function loadGallery() {\n            try {\n                const response = await lib.getUserGameState();\n                if (response.state && response.state.gallery) {\n                    galleryData.cakes = response.state.gallery;\n                    lib.log(`Loaded ${galleryData.cakes.length} cakes from gallery`);\n                } else {\n                    galleryData.cakes = [];\n                    lib.log('No saved gallery found, starting fresh');\n                }\n            } catch (error) {\n                lib.log(`Failed to load gallery: ${error.message}`);\n                galleryData.cakes = [];\n            }\n        }\n        \n        // Save gallery to persistent storage\n        async function saveGallery() {\n            try {\n                await lib.saveUserGameState({ gallery: galleryData.cakes });\n                lib.log('Gallery saved successfully');\n                return true;\n            } catch (error) {\n                lib.log(`Failed to save gallery: ${error.message}`);\n                return false;\n            }\n        }\n        \n        // Add current cake to gallery\n        async function saveCakeToGallery() {\n            // Check if cake is empty\n            const isEmpty = gameState.cakeFrosting.every(f => f === null) && gameState.decorations.length === 0;\n            if (isEmpty) {\n                showSuccessMessage('\u274c Design a cake first!');\n                return;\n            }\n            \n            // Check if gallery is full\n            if (galleryData.cakes.length >= MAX_GALLERY_CAKES) {\n                showSuccessMessage(`\u274c Gallery full! (Max ${MAX_GALLERY_CAKES})`);\n                return;\n            }\n            \n            // Create cake snapshot\n            const cakeSnapshot = {\n                frosting: [...gameState.cakeFrosting],\n                decorations: JSON.parse(JSON.stringify(gameState.decorations)),\n                timestamp: Date.now()\n            };\n            \n            // Add to gallery\n            galleryData.cakes.unshift(cakeSnapshot); // Add to beginning\n            \n            // Save to persistent storage\n            const success = await saveGallery();\n            \n            if (success) {\n                playSound('sound_round_complete');\n                showSuccessMessage('\ud83d\udcbe Cake saved to gallery!');\n                \n                // Clear the canvas\n                setTimeout(() => {\n                    clearAll();\n                }, 500);\n            } else {\n                showSuccessMessage('\u274c Failed to save cake');\n                // Remove from local array if save failed\n                galleryData.cakes.shift();\n            }\n        }\n        \n        // Delete cake from gallery\n        async function deleteCakeFromGallery(index) {\n            if (index >= 0 && index < galleryData.cakes.length) {\n                galleryData.cakes.splice(index, 1);\n                await saveGallery();\n                showSuccessMessage('\ud83d\uddd1\ufe0f Cake deleted');\n                renderGallery();\n            }\n        }\n        \n        // Load cake from gallery\n        function loadCakeFromGallery(index) {\n            if (index >= 0 && index < galleryData.cakes.length) {\n                const cake = galleryData.cakes[index];\n                \n                // Load frosting colors (deep copy the array)\n                gameState.cakeFrosting = [...cake.frosting];\n                \n                // Load decorations (deep copy)\n                gameState.decorations = JSON.parse(JSON.stringify(cake.decorations));\n                \n                // Clear action history since this is a fresh load\n                gameState.actionHistory = [];\n                \n                // Update frosting palette UI\n                updateFrostingPaletteUI();\n                \n                // Close gallery\n                hideGallery();\n                \n                // Show success message\n                showSuccessMessage('\ud83d\udce5 Cake loaded!');\n                playSound('sound_place_decoration');\n                \n                // Set mascot to excited\n                setMascotState('excited');\n                setTimeout(() => {\n                    if (gameState.mascotState === 'excited') {\n                        setMascotState('happy');\n                    }\n                }, 1500);\n            }\n        }\n        \n        // Show success message\n        function showSuccessMessage(message) {\n            const msgElement = document.getElementById('success-message');\n            msgElement.textContent = message;\n            msgElement.classList.add('show');\n            \n            setTimeout(() => {\n                msgElement.classList.remove('show');\n            }, 2000);\n        }\n        \n        // Render a cake on a canvas (for previews)\n        function renderCakeOnCanvas(canvas, frosting, decorations) {\n            const ctx = canvas.getContext('2d');\n            const scale = canvas.width / 720; // Scale factor for smaller preview\n            \n            ctx.clearRect(0, 0, canvas.width, canvas.height);\n            \n            // Draw background gradient\n            const gradient = ctx.createLinearGradient(0, 0, 0, canvas.height);\n            gradient.addColorStop(0, '#FFE5EC');\n            gradient.addColorStop(0.5, '#FFF0F5');\n            gradient.addColorStop(1, '#E5F4FF');\n            ctx.fillStyle = gradient;\n            ctx.fillRect(0, 0, canvas.width, canvas.height);\n            \n            // Scale context\n            ctx.save();\n            ctx.scale(scale, scale);\n            \n            // Use same rendering logic as main game\n            const localCakeConfig = {\n                centerX: 360,\n                centerY: 540,\n                width: 500,\n                height: 400\n            };\n            \n            // Draw plate\n            const plateImg = assetCache.images['cake_plate'];\n            if (plateImg) {\n                const plateWidth = localCakeConfig.width * 1.1;\n                const plateHeight = plateWidth * 0.3;\n                const plateY = localCakeConfig.centerY + localCakeConfig.height / 2 - 60;\n                \n                ctx.drawImage(\n                    plateImg,\n                    localCakeConfig.centerX - plateWidth / 2,\n                    plateY - plateHeight / 2,\n                    plateWidth,\n                    plateHeight\n                );\n            }\n            \n            // Draw tiers\n            const bottomImg = assetCache.images['cake_tier_bottom'];\n            const middleImg = assetCache.images['cake_tier_middle'];\n            const topImg = assetCache.images['cake_tier_top'];\n            \n            if (bottomImg && middleImg && topImg) {\n                const bottomWidth = localCakeConfig.width * 1.2;\n                const bottomHeight = localCakeConfig.height * 0.48;\n                const middleWidth = localCakeConfig.width * 0.9;\n                const middleHeight = localCakeConfig.height * 0.42;\n                const topWidth = localCakeConfig.width * 0.6;\n                const topHeight = localCakeConfig.height * 0.36;\n                \n                const baseY = localCakeConfig.centerY + localCakeConfig.height / 2 - 40;\n                const bottomY = baseY - bottomHeight / 2;\n                const middleY = bottomY - bottomHeight / 2 - middleHeight / 2 + 60;\n                const topY = middleY - middleHeight / 2 - topHeight / 2 + 60;\n                \n                // Draw bottom tier\n                ctx.drawImage(\n                    bottomImg,\n                    localCakeConfig.centerX - bottomWidth / 2,\n                    bottomY - bottomHeight / 2,\n                    bottomWidth,\n                    bottomHeight\n                );\n                \n                // Draw bottom frosting\n                if (frosting[0] !== null) {\n                    const colorName = frostingColors[frosting[0]];\n                    const frostingImg = assetCache.images[`frosting_${colorName}`];\n                    if (frostingImg) {\n                        ctx.drawImage(\n                            frostingImg,\n                            localCakeConfig.centerX - bottomWidth * 1.02 / 2,\n                            bottomY - bottomHeight * 1.02 / 2,\n                            bottomWidth * 1.02,\n                            bottomHeight * 1.02\n                        );\n                    }\n                }\n                \n                // Draw middle tier\n                ctx.drawImage(\n                    middleImg,\n                    localCakeConfig.centerX - middleWidth / 2,\n                    middleY - middleHeight / 2,\n                    middleWidth,\n                    middleHeight\n                );\n                \n                // Draw middle frosting\n                if (frosting[1] !== null) {\n                    const colorName = frostingColors[frosting[1]];\n                    const frostingImg = assetCache.images[`frosting_${colorName}`];\n                    if (frostingImg) {\n                        ctx.drawImage(\n                            frostingImg,\n                            localCakeConfig.centerX - middleWidth * 1.02 / 2,\n                            middleY - middleHeight * 1.02 / 2,\n                            middleWidth * 1.02,\n                            middleHeight * 1.02\n                        );\n                    }\n                }\n                \n                // Draw top tier\n                ctx.drawImage(\n                    topImg,\n                    localCakeConfig.centerX - topWidth / 2,\n                    topY - topHeight / 2,\n                    topWidth,\n                    topHeight\n                );\n                \n                // Draw top frosting\n                if (frosting[2] !== null) {\n                    const colorName = frostingColors[frosting[2]];\n                    const frostingImg = assetCache.images[`frosting_${colorName}`];\n                    if (frostingImg) {\n                        ctx.drawImage(\n                            frostingImg,\n                            localCakeConfig.centerX - topWidth * 1.02 / 2,\n                            topY - topHeight * 1.02 / 2,\n                            topWidth * 1.02,\n                            topHeight * 1.02\n                        );\n                    }\n                }\n            }\n            \n            // Draw decorations\n            for (const decoration of decorations) {\n                const decorationImg = assetCache.images[`decoration_${decoration.type}`];\n                if (decorationImg) {\n                    const { width, height } = getDecorationSize(decoration.type);\n                    ctx.drawImage(\n                        decorationImg,\n                        decoration.x - width / 2,\n                        decoration.y - height / 2,\n                        width,\n                        height\n                    );\n                }\n            }\n            \n            ctx.restore();\n        }\n        \n        // Show gallery modal\n        function showGallery() {\n            document.getElementById('gallery-modal').classList.add('active');\n            renderGallery();\n        }\n        \n        // Hide gallery modal\n        function hideGallery() {\n            document.getElementById('gallery-modal').classList.remove('active');\n        }\n        \n        // Render gallery grid\n        function renderGallery() {\n            const container = document.getElementById('gallery-grid-container');\n            container.innerHTML = '';\n            \n            if (galleryData.cakes.length === 0) {\n                container.innerHTML = '<div class=\"gallery-empty\">No cakes saved yet! \ud83c\udf82<br>Decorate a cake and click \"Save & Clear\" to add it here.</div>';\n                return;\n            }\n            \n            const grid = document.createElement('div');\n            grid.className = 'gallery-grid';\n            \n            galleryData.cakes.forEach((cake, index) => {\n                const item = document.createElement('div');\n                item.className = 'gallery-item';\n                \n                // Preview canvas\n                const previewDiv = document.createElement('div');\n                previewDiv.className = 'gallery-preview';\n                \n                const previewCanvas = document.createElement('canvas');\n                previewCanvas.width = 360;\n                previewCanvas.height = 360;\n                previewDiv.appendChild(previewCanvas);\n                \n                // Render cake on preview canvas\n                renderCakeOnCanvas(previewCanvas, cake.frosting, cake.decorations);\n                \n                item.appendChild(previewDiv);\n                \n                // Info section\n                const info = document.createElement('div');\n                info.className = 'gallery-item-info';\n                \n                // Timestamp\n                const timestamp = document.createElement('div');\n                timestamp.className = 'gallery-timestamp';\n                const date = new Date(cake.timestamp);\n                timestamp.textContent = date.toLocaleDateString() + ' ' + date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n                \n                // Button container\n                const btnContainer = document.createElement('div');\n                btnContainer.style.display = 'flex';\n                btnContainer.style.gap = '8px';\n                \n                // Load button\n                const loadBtn = document.createElement('button');\n                loadBtn.className = 'gallery-delete'; // Reuse same styling\n                loadBtn.style.background = 'var(--color-secondary)';\n                loadBtn.textContent = '\ud83d\udce5 Load';\n                loadBtn.addEventListener('click', () => {\n                    loadCakeFromGallery(index);\n                });\n                \n                // Delete button\n                const deleteBtn = document.createElement('button');\n                deleteBtn.className = 'gallery-delete';\n                deleteBtn.textContent = '\ud83d\uddd1\ufe0f Delete';\n                deleteBtn.addEventListener('click', () => {\n                    deleteCakeFromGallery(index);\n                });\n                \n                btnContainer.appendChild(loadBtn);\n                btnContainer.appendChild(deleteBtn);\n                \n                info.appendChild(timestamp);\n                info.appendChild(btnContainer);\n                item.appendChild(info);\n                \n                grid.appendChild(item);\n            });\n            \n            container.appendChild(grid);\n        }\n\n        // ===== UPDATE LOADING PROGRESS =====\n        function updateLoadingProgress(percent) {\n            const progressBar = document.getElementById('loading-progress-bar');\n            if (progressBar) {\n                progressBar.style.width = percent + '%';\n            }\n        }\n\n        // ===== CREATE LOADING DECORATIONS =====\n        function createLoadingDecorations() {\n            const loadingScreen = document.getElementById('loading-screen');\n            if (!loadingScreen) return;\n            \n            // Create floating bubbles rising (15-18 bubbles)\n            for (let i = 0; i < 18; i++) {\n                const bubble = document.createElement('div');\n                bubble.className = 'loading-sparkle';\n                bubble.textContent = '\ud83e\udee7';\n                bubble.style.left = Math.random() * 100 + '%';\n                bubble.style.bottom = '-50px';\n                bubble.style.animationDelay = Math.random() * 4 + 's';\n                bubble.style.animationDuration = (3 + Math.random() * 2) + 's';\n                bubble.style.fontSize = (15 + Math.random() * 15) + 'px';\n                loadingScreen.appendChild(bubble);\n            }\n            \n            // Create floating ocean decorations (shells, pearls, starfish, fish)\n            const oceanDecorations = ['\ud83d\udc1a', '\ud83e\uddaa', '\u2b50', '\ud83d\udc20', '\ud83d\udc1f', '\ud83c\udf0a', '\ud83d\udc8e', '\ud83e\udeb8'];\n            for (let i = 0; i < 10; i++) {\n                const decoration = document.createElement('div');\n                decoration.className = 'loading-heart';\n                decoration.textContent = oceanDecorations[Math.floor(Math.random() * oceanDecorations.length)];\n                decoration.style.left = (10 + Math.random() * 80) + '%';\n                decoration.style.top = (10 + Math.random() * 80) + '%';\n                decoration.style.animationDelay = (Math.random() * 8) + 's';\n                decoration.style.animationDuration = (6 + Math.random() * 4) + 's';\n                decoration.style.fontSize = (20 + Math.random() * 15) + 'px';\n                loadingScreen.appendChild(decoration);\n            }\n            \n            // Create swimming fish (5-7 fish)\n            for (let i = 0; i < 6; i++) {\n                const fish = document.createElement('div');\n                fish.className = 'loading-heart';\n                fish.textContent = i % 2 === 0 ? '\ud83d\udc1f' : '\ud83d\udc20';\n                fish.style.left = Math.random() * 100 + '%';\n                fish.style.top = (20 + Math.random() * 60) + '%';\n                fish.style.animationDelay = (Math.random() * 8) + 's';\n                fish.style.animationDuration = (7 + Math.random() * 3) + 's';\n                fish.style.fontSize = (22 + Math.random() * 12) + 'px';\n                loadingScreen.appendChild(fish);\n            }\n            \n            // Create twinkling underwater sparkles (12-15 sparkles)\n            for (let i = 0; i < 15; i++) {\n                const sparkle = document.createElement('div');\n                sparkle.className = 'loading-sparkle';\n                sparkle.textContent = ['\u2728', '\u2b50', '\ud83d\udcab', '\ud83c\udf1f'][Math.floor(Math.random() * 4)];\n                sparkle.style.left = Math.random() * 100 + '%';\n                sparkle.style.top = Math.random() * 100 + '%';\n                sparkle.style.animationDelay = Math.random() * 4 + 's';\n                sparkle.style.animationDuration = (2 + Math.random() * 2) + 's';\n                sparkle.style.animation = 'loading-twinkle 2s ease-in-out infinite';\n                sparkle.style.fontSize = (15 + Math.random() * 10) + 'px';\n                loadingScreen.appendChild(sparkle);\n            }\n            \n            // Add twinkle animation for sparkles\n            const style = document.createElement('style');\n            style.textContent = `\n                @keyframes loading-twinkle {\n                    0%, 100% { opacity: 0; transform: scale(0) rotate(0deg); }\n                    50% { opacity: 0.8; transform: scale(1) rotate(180deg); }\n                }\n            `;\n            document.head.appendChild(style);\n            \n            // Create floating seaweed/coral at bottom edges (4-5 pieces)\n            const seaweedPositions = ['5%', '25%', '50%', '75%', '95%'];\n            for (let i = 0; i < 5; i++) {\n                const seaweed = document.createElement('div');\n                seaweed.className = 'loading-heart';\n                seaweed.textContent = i % 2 === 0 ? '\ud83c\udf3f' : '\ud83e\udeb8';\n                seaweed.style.left = seaweedPositions[i];\n                seaweed.style.bottom = '-10px';\n                seaweed.style.animationDelay = (i * 1.5) + 's';\n                seaweed.style.animationDuration = (7 + Math.random() * 2) + 's';\n                seaweed.style.fontSize = (25 + Math.random() * 15) + 'px';\n                seaweed.style.animation = 'loading-sway 4s ease-in-out infinite';\n                loadingScreen.appendChild(seaweed);\n            }\n            \n            // Add sway animation for seaweed\n            const swayStyle = document.createElement('style');\n            swayStyle.textContent = `\n                @keyframes loading-sway {\n                    0%, 100% { transform: rotate(-3deg); }\n                    50% { transform: rotate(3deg); }\n                }\n            `;\n            document.head.appendChild(swayStyle);\n        }\n        \n        // ===== HIDE LOADING SCREEN =====\n        function hideLoadingScreen() {\n            const loadingScreen = document.getElementById('loading-screen');\n            if (loadingScreen) {\n                loadingScreen.classList.add('hidden');\n            }\n            \n            // Start with cute fantasy menu music at startup\n            if (backgroundMusic) {\n                backgroundMusic.stop();\n            }\n            backgroundMusic = playSound('music_menu', true); // Gentle, whimsical fantasy music\n        }\n        \n        // ===== MASCOT FUNCTIONS =====\n        let mascotSwimTimeout = null;\n        const mascotDefaultPosition = { bottom: 450, left: 70 }; // Default position in viewport percent/px\n        \n        // Track what mermaid is carrying and placement queue\n        let mascotCarrying = null; // { type: 'frosting'|'decoration', data: ... }\n        let placementQueue = []; // Queue of placement actions waiting for mermaid\n        \n        // Update what the mermaid is visibly carrying\n        function updateMascotCarriedItem() {\n            const mascotContainer = document.getElementById('mascot-container');\n            if (!mascotContainer) return;\n            \n            // Remove any existing carried item\n            const existingItem = mascotContainer.querySelector('.mascot-carried-item');\n            if (existingItem) {\n                existingItem.remove();\n            }\n            \n            if (!mascotCarrying) return;\n            \n            // Create carried item element\n            const carriedItem = document.createElement('div');\n            carriedItem.className = 'mascot-carried-item';\n            carriedItem.style.cssText = `\n                position: absolute;\n                right: -15px;\n                top: 50%;\n                transform: translateY(-50%);\n                width: 40px;\n                height: 40px;\n                pointer-events: none;\n                z-index: 10;\n                animation: bobCarriedItem 0.8s ease-in-out infinite;\n            `;\n            \n            if (mascotCarrying.type === 'frosting') {\n                // Show frosting swatch\n                const colorName = frostingColors[mascotCarrying.colorIndex];\n                const frostingImg = assetCache.images[`frosting_${colorName}`];\n                \n                if (frostingImg) {\n                    const img = document.createElement('img');\n                    img.src = frostingImg.src;\n                    img.style.cssText = 'width: 100%; height: 100%; object-fit: cover; border-radius: 8px; border: 2px solid rgba(255, 255, 255, 0.8); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);';\n                    carriedItem.appendChild(img);\n                }\n            } else if (mascotCarrying.type === 'decoration') {\n                // Show decoration\n                const decorationImg = assetCache.images[`decoration_${mascotCarrying.decorationType}`];\n                \n                if (decorationImg) {\n                    const img = document.createElement('img');\n                    img.src = decorationImg.src;\n                    img.style.cssText = 'width: 100%; height: 100%; object-fit: contain; filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));';\n                    carriedItem.appendChild(img);\n                }\n            }\n            \n            mascotContainer.appendChild(carriedItem);\n            \n            // Scale down mermaid slightly when carrying something\n            const mascotImage = document.getElementById('mascot-image');\n            if (mascotImage) {\n                mascotImage.style.transform = 'scale(0.9)';\n            }\n        }\n        \n        // Clear what the mermaid is carrying\n        function clearMascotCarriedItem() {\n            mascotCarrying = null;\n            \n            const mascotContainer = document.getElementById('mascot-container');\n            if (!mascotContainer) return;\n            \n            const existingItem = mascotContainer.querySelector('.mascot-carried-item');\n            if (existingItem) {\n                existingItem.remove();\n            }\n            \n            // Reset mermaid scale\n            const mascotImage = document.getElementById('mascot-image');\n            if (mascotImage) {\n                mascotImage.style.transform = 'scale(1)';\n            }\n        }\n        \n        function setMascotState(state) {\n            gameState.mascotState = state;\n            const mascotImage = document.getElementById('mascot-image');\n            \n            // Map states to mermaid mascot asset IDs\n            const assetMap = {\n                'happy': 'mascot_mermaid_happy',\n                'excited': 'mascot_mermaid_excited',\n                'surprised': 'mascot_mermaid_surprised',\n                'worried': 'mascot_mermaid_worried',\n                'celebrating': 'mascot_mermaid_celebrating'\n            };\n            \n            const assetId = assetMap[state] || 'mascot_happy';\n            const asset = lib.getAsset(assetId);\n            \n            if (asset && mascotImage) {\n                mascotImage.src = asset.url;\n                \n                // Add bounce animation\n                mascotImage.classList.remove('mascot-bounce');\n                // Force reflow to restart animation\n                void mascotImage.offsetWidth;\n                mascotImage.classList.add('mascot-bounce');\n                \n                // Remove animation class after it completes\n                setTimeout(() => {\n                    mascotImage.classList.remove('mascot-bounce');\n                }, 500);\n            }\n        }\n        \n        // Calculate speed multiplier based on how quickly user is acting\n        function calculateSpeedMultiplier() {\n            const now = performance.now();\n            const timeSinceLastAction = now - gameState.lastActionTime;\n            \n            // If less than 1 second since last action, speed up progressively\n            if (timeSinceLastAction < 1000) {\n                // Very fast - 2x speed\n                return 2;\n            } else if (timeSinceLastAction < 2000) {\n                // Fast - 1.5x speed\n                return 1.5;\n            } else {\n                // Normal speed\n                return 1;\n            }\n        }\n        \n        // Update action timing\n        function recordAction() {\n            const now = performance.now();\n            gameState.lastActionTime = now;\n            gameState.actionSpeedMultiplier = calculateSpeedMultiplier();\n        }\n        \n        function swimMascotTo(targetBottom, targetLeft, baseDuration = 800, callback = null) {\n            const mascotContainer = document.getElementById('mascot-container');\n            const mascotImage = document.getElementById('mascot-image');\n            \n            if (!mascotContainer || !mascotImage) return;\n            \n            // Apply speed multiplier to duration\n            const duration = baseDuration / gameState.actionSpeedMultiplier;\n            \n            // Adjust CSS transition duration for faster/slower swim\n            mascotContainer.style.transition = `bottom ${duration}ms cubic-bezier(0.4, 0.0, 0.2, 1), left ${duration}ms cubic-bezier(0.4, 0.0, 0.2, 1), transform ${duration}ms cubic-bezier(0.4, 0.0, 0.2, 1)`;\n            \n            // Clear any existing timeout\n            if (mascotSwimTimeout) {\n                clearTimeout(mascotSwimTimeout);\n                mascotSwimTimeout = null;\n            }\n            \n            // Add swimming animation\n            mascotImage.classList.add('mascot-swimming');\n            \n            // Move to target position\n            mascotContainer.style.bottom = targetBottom + 'px';\n            mascotContainer.style.left = targetLeft + '%';\n            \n            // Call callback after swim completes\n            if (callback) {\n                setTimeout(callback, duration);\n            }\n        }\n        \n        function returnMascotHome() {\n            const mascotContainer = document.getElementById('mascot-container');\n            const mascotImage = document.getElementById('mascot-image');\n            \n            if (!mascotContainer || !mascotImage) return;\n            \n            mascotImage.classList.remove('mascot-swimming');\n            mascotContainer.style.bottom = mascotDefaultPosition.bottom + 'px';\n            mascotContainer.style.left = mascotDefaultPosition.left + '%';\n        }\n        \n        function mermaidGrabFrosting(colorIndex) {\n            // Record action for speed calculation\n            recordAction();\n            \n            // Mermaid grabs frosting from palette\n            mascotCarrying = { type: 'frosting', colorIndex: colorIndex };\n            setMascotState('excited');\n            \n            // Calculate grab duration based on speed multiplier\n            const grabDuration = 600 / gameState.actionSpeedMultiplier;\n            \n            // Swim to frosting palette\n            swimMascotTo(180, 25, grabDuration, () => {\n                // After arriving at palette, show item in hand and play grab sound\n                updateMascotCarriedItem();\n                playSound('sound_apply_frosting');\n            });\n        }\n        \n        function mermaidGrabDecoration(decorationType) {\n            // Record action for speed calculation\n            recordAction();\n            \n            // Mermaid grabs decoration from palette\n            mascotCarrying = { type: 'decoration', decorationType: decorationType };\n            setMascotState('excited');\n            \n            // Calculate grab duration based on speed multiplier\n            const grabDuration = 600 / gameState.actionSpeedMultiplier;\n            \n            // Swim to decoration palette\n            swimMascotTo(180, 60, grabDuration, () => {\n                // After arriving at palette, show item in hand and play grab sound\n                updateMascotCarriedItem();\n                playSound('sound_place_decoration');\n            });\n        }\n        \n        function mermaidApplyFrosting(tierIndex, colorIndex, canvasX, canvasY) {\n            // Calculate screen position for tier\n            const rect = canvas.getBoundingClientRect();\n            const screenX = (canvasX / canvas.width) * rect.width + rect.left;\n            const screenY = (canvasY / canvas.height) * rect.height + rect.top;\n            \n            // Convert to bottom/left for mascot positioning\n            const targetLeft = (screenX / window.innerWidth) * 100;\n            const targetBottom = window.innerHeight - screenY;\n            \n            // Calculate swim duration based on speed multiplier\n            const swimDuration = 800 / gameState.actionSpeedMultiplier;\n            const pauseDuration = 500 / gameState.actionSpeedMultiplier;\n            \n            // Swim to cake tier\n            swimMascotTo(targetBottom, targetLeft, swimDuration, () => {\n                // Apply frosting after arriving\n                const previousFrosting = gameState.cakeFrosting[tierIndex];\n                gameState.cakeFrosting[tierIndex] = colorIndex;\n                \n                // Add to action history\n                gameState.actionHistory.push({\n                    type: 'frosting',\n                    tierIndex: tierIndex,\n                    previousValue: previousFrosting,\n                    newValue: colorIndex\n                });\n                \n                // Clear what mermaid is carrying\n                clearMascotCarriedItem();\n                \n                // Return home after a moment\n                setTimeout(() => {\n                    returnMascotHome();\n                    setMascotState('happy');\n                }, pauseDuration);\n            });\n        }\n        \n        function mermaidPlaceDecoration(decoration) {\n            // Calculate screen position\n            const rect = canvas.getBoundingClientRect();\n            const screenX = (decoration.x / canvas.width) * rect.width + rect.left;\n            const screenY = (decoration.y / canvas.height) * rect.height + rect.top;\n            \n            // Convert to bottom/left for mascot positioning\n            const targetLeft = (screenX / window.innerWidth) * 100;\n            const targetBottom = window.innerHeight - screenY;\n            \n            // Calculate swim duration based on speed multiplier\n            const swimDuration = 800 / gameState.actionSpeedMultiplier;\n            const pauseDuration = 500 / gameState.actionSpeedMultiplier;\n            \n            // Swim to decoration position\n            swimMascotTo(targetBottom, targetLeft, swimDuration, () => {\n                // Place decoration after arriving\n                gameState.decorations.push(decoration);\n                \n                // Add to action history\n                gameState.actionHistory.push({\n                    type: 'decoration',\n                    index: gameState.decorations.length - 1\n                });\n                \n                // Clear what mermaid is carrying\n                clearMascotCarriedItem();\n                \n                // Return home after a moment\n                setTimeout(() => {\n                    returnMascotHome();\n                    setMascotState('happy');\n                }, pauseDuration);\n            });\n        }\n        \n        function initMascot() {\n            setMascotState('happy');\n        }\n\n        // ===== PRELOAD ASSETS =====\n        async function preloadAssets() {\n            lib.log('Preloading assets...');\n            \n            // Initialize Web Audio API\n            assetCache.audioContext = new (window.AudioContext || window.webkitAudioContext)();\n\n            // Load mermaid mascot for loading screen\n            const mermaidAsset = lib.getAsset('mascot_mermaid_happy');\n            \n            if (mermaidAsset) {\n                const loadingImage = document.getElementById('loading-spongebob-image');\n                if (loadingImage) {\n                    loadingImage.src = mermaidAsset.url;\n                }\n            }\n\n            // Don't load background image - use gradient instead\n            // const bgAsset = lib.getAsset('background_party');\n            // if (bgAsset) {\n            //     document.getElementById('background').src = bgAsset.url;\n            // }\n\n            let totalAssets = 0;\n            let loadedAssets = 0;\n\n            // Count total assets\n            const tierIds = ['cake_tier_bottom', 'cake_tier_middle', 'cake_tier_top'];\n            totalAssets += 1; // Plate\n            totalAssets += tierIds.length;\n            totalAssets += frostingColors.length;\n            totalAssets += decorationTypes.length;\n            totalAssets += 2; // UI images\n            totalAssets += 5; // Chibi dragon mascot images\n            totalAssets += 9; // Audio files\n\n            // Load cake plate\n            const plateAsset = lib.getAsset('cake_plate');\n            if (plateAsset) {\n                const img = new Image();\n                img.src = plateAsset.url;\n                await new Promise(resolve => {\n                    img.onload = resolve;\n                    img.onerror = resolve;\n                });\n                assetCache.images['cake_plate'] = img;\n            }\n            loadedAssets++;\n            updateLoadingProgress((loadedAssets / totalAssets) * 100);\n\n            // Load cake tier images\n            for (const id of tierIds) {\n                const asset = lib.getAsset(id);\n                if (asset) {\n                    const img = new Image();\n                    img.src = asset.url;\n                    await new Promise(resolve => {\n                        img.onload = resolve;\n                        img.onerror = resolve;\n                    });\n                    // Assign immediately after await to avoid race condition\n                    assetCache.images = Object.assign({}, assetCache.images, { [id]: img });\n                }\n                loadedAssets++;\n                updateLoadingProgress((loadedAssets / totalAssets) * 100);\n            }\n\n            // Load frosting overlays\n            for (const color of frostingColors) {\n                const id = `frosting_${color}`;\n                const asset = lib.getAsset(id);\n                if (asset) {\n                    const img = new Image();\n                    img.src = asset.url;\n                    await new Promise(resolve => {\n                        img.onload = resolve;\n                        img.onerror = resolve;\n                    });\n                    assetCache.images[id] = img;\n                }\n                loadedAssets++;\n                updateLoadingProgress((loadedAssets / totalAssets) * 100);\n            }\n\n            // Load decoration images\n            for (const type of decorationTypes) {\n                const id = `decoration_${type}`;\n                const asset = lib.getAsset(id);\n                if (asset) {\n                    const img = new Image();\n                    img.src = asset.url;\n                    await new Promise(resolve => {\n                        img.onload = resolve;\n                        img.onerror = resolve;\n                    });\n                    assetCache.images[id] = img;\n                }\n                loadedAssets++;\n                updateLoadingProgress((loadedAssets / totalAssets) * 100);\n            }\n\n            // Load background fish varieties for animation\n            const backgroundFishTypes = ['fish', 'clownfish', 'dolphin', 'octopus', 'sea_turtle'];\n            for (const fishType of backgroundFishTypes) {\n                const id = `decoration_${fishType}`;\n                if (!assetCache.images[id]) {\n                    const asset = lib.getAsset(id);\n                    if (asset) {\n                        const img = new Image();\n                        img.src = asset.url;\n                        await new Promise(resolve => {\n                            img.onload = resolve;\n                            img.onerror = resolve;\n                        });\n                        // Assign immediately after await to avoid race condition\n                        assetCache.images = Object.assign({}, assetCache.images, { [id]: img });\n                    }\n                }\n            }\n\n            // Load UI images\n            const uiIds = ['ui_star_empty', 'ui_star_filled'];\n            for (const id of uiIds) {\n                const asset = lib.getAsset(id);\n                if (asset) {\n                    const img = new Image();\n                    img.src = asset.url;\n                    await new Promise(resolve => {\n                        img.onload = resolve;\n                        img.onerror = resolve;\n                    });\n                    assetCache.images[id] = img;\n                }\n                loadedAssets++;\n                updateLoadingProgress((loadedAssets / totalAssets) * 100);\n            }\n            \n            // Load mermaid mascot images\n            const mascotIds = ['mascot_mermaid_happy', 'mascot_mermaid_excited', 'mascot_mermaid_surprised', 'mascot_mermaid_worried', 'mascot_mermaid_celebrating'];\n            for (const id of mascotIds) {\n                const asset = lib.getAsset(id);\n                if (asset) {\n                    const img = new Image();\n                    img.src = asset.url;\n                    await new Promise(resolve => {\n                        img.onload = resolve;\n                        img.onerror = resolve;\n                    });\n                    assetCache.images[id] = img;\n                }\n                loadedAssets++;\n                updateLoadingProgress((loadedAssets / totalAssets) * 100);\n            }\n            \n            // Load heart-shaped butterfly images\n            const heartButterflyIds = ['background_heart_butterfly_pink', 'background_heart_butterfly_purple', 'background_heart_butterfly_blue'];\n            for (const id of heartButterflyIds) {\n                const asset = lib.getAsset(id);\n                if (asset) {\n                    const img = new Image();\n                    img.src = asset.url;\n                    await new Promise(resolve => {\n                        img.onload = resolve;\n                        img.onerror = resolve;\n                    });\n                    assetCache.images[id] = img;\n                }\n            }\n            \n            // Load background fish and seahorse for underwater scene\n            const bgFishAsset = lib.getAsset('background_fish');\n            if (bgFishAsset) {\n                const img = new Image();\n                img.src = bgFishAsset.url;\n                await new Promise(resolve => {\n                    img.onload = resolve;\n                    img.onerror = resolve;\n                });\n                // Assign immediately after await to avoid race condition\n                assetCache.images = Object.assign({}, assetCache.images, { 'background_fish': img });\n            }\n            \n            const bgSeahorseAsset = lib.getAsset('background_seahorse');\n            if (bgSeahorseAsset) {\n                const img = new Image();\n                img.src = bgSeahorseAsset.url;\n                await new Promise(resolve => {\n                    img.onload = resolve;\n                    img.onerror = resolve;\n                });\n                // Assign immediately after await to avoid race condition\n                assetCache.images = Object.assign({}, assetCache.images, { 'background_seahorse': img });\n            }\n            \n            // Load background snowflake for falling animation\n            const bgSnowflakeAsset = lib.getAsset('background_snowflake');\n            if (bgSnowflakeAsset) {\n                const img = new Image();\n                img.src = bgSnowflakeAsset.url;\n                await new Promise(resolve => {\n                    img.onload = resolve;\n                    img.onerror = resolve;\n                });\n                // Assign immediately after await to avoid race condition\n                assetCache.images = Object.assign({}, assetCache.images, { 'background_snowflake': img });\n            }\n\n\n            // Load audio files\n            const audioIds = [\n                'sound_place_decoration', 'sound_apply_frosting', 'sound_undo',\n                'sound_clear', 'sound_timer_warning', 'sound_round_complete',\n                'sound_star_earned', 'music_gameplay', 'music_menu'\n            ];\n\n            for (const id of audioIds) {\n                const asset = lib.getAsset(id);\n                if (asset) {\n                    try {\n                        const response = await fetch(asset.url);\n                        const arrayBuffer = await response.arrayBuffer();\n                        const decodedBuffer = await assetCache.audioContext.decodeAudioData(arrayBuffer);\n                        const buffers = assetCache.audioBuffers;\n                        buffers[id] = decodedBuffer;\n                    } catch (error) {\n                        lib.log(`Error loading audio ${id}: ${error}`);\n                    }\n                }\n                loadedAssets++;\n                updateLoadingProgress((loadedAssets / totalAssets) * 100);\n            }\n\n            lib.log('Assets preloaded');\n        }\n\n        // ===== AUDIO PLAYBACK =====\n        function playSound(soundId, loop = false) {\n            if (!assetCache.audioBuffers[soundId]) return;\n            \n            const source = assetCache.audioContext.createBufferSource();\n            source.buffer = assetCache.audioBuffers[soundId];\n            source.loop = loop;\n            source.connect(assetCache.audioContext.destination);\n            source.start(0);\n            \n            return source;\n        }\n\n        let backgroundMusic = null;\n\n        function startBackgroundMusic() {\n            if (backgroundMusic) {\n                backgroundMusic.stop();\n            }\n            backgroundMusic = playSound('music_gameplay', true);\n        }\n\n        // ===== INITIALIZE GAME STATE =====\n        function initializeGameState() {\n            gameState.round = 1;\n            gameState.totalScore = 0;\n            gameState.cakeFrosting = [null, null, null];\n            gameState.decorations = [];\n            gameState.gamePhase = 'playing';\n            gameState.gameMode = window.gameConfig.gameMode || 'challenge';\n            \n            // Set timer from config\n            gameState.maxTime = window.gameConfig.timerSettings.startTime;\n            gameState.timeRemaining = gameState.maxTime;\n            \n            // Select first prompt (only in challenge mode)\n            if (gameState.gameMode === 'challenge') {\n                selectNextPrompt();\n            } else {\n                gameState.currentPrompt = null;\n            }\n            \n            // Initialize background animations\n            initializeBackgroundJellyfish();\n            initializeBackgroundBubbles();\n            initializeBackgroundFish();\n            initializeBackgroundSeahorses();\n            initializeBackgroundBirds();\n            \n            updateUIForGameMode();\n        }\n        \n        // ===== INITIALIZE BACKGROUND BUBBLES (MYSTICAL MERMAID) =====\n        function initializeBackgroundJellyfish() {\n            gameState.backgroundJellyfish = [];\n            \n            // Create 3 types of bubbles for variety:\n            // Type 1: Large mystical bubbles (10-12)\n            // Type 2: Medium bubbles (15-18)\n            // Type 3: Tiny bubbles (30-35)\n            \n            // Large mystical bubbles with rainbow shimmer\n            const largeCount = 10 + Math.floor(Math.random() * 3);\n            for (let i = 0; i < largeCount; i++) {\n                gameState.backgroundJellyfish.push({\n                    x: Math.random() * canvas.width,\n                    y: Math.random() * canvas.height,\n                    speedX: (Math.random() - 0.5) * 10,\n                    speedY: 20 + Math.random() * 20, // Rising speed\n                    phase: Math.random() * Math.PI * 2,\n                    rotation: Math.random() * Math.PI * 2,\n                    rotationSpeed: (Math.random() - 0.5) * 0.8,\n                    scale: 0.7 + Math.random() * 0.4, // Larger\n                    opacity: 0.6 + Math.random() * 0.3,\n                    type: 'large',\n                    wobbleSpeed: 0.8 + Math.random() * 0.4\n                });\n            }\n            \n            // Medium bubbles\n            const mediumCount = 15 + Math.floor(Math.random() * 4);\n            for (let i = 0; i < mediumCount; i++) {\n                gameState.backgroundJellyfish.push({\n                    x: Math.random() * canvas.width,\n                    y: Math.random() * canvas.height,\n                    speedX: (Math.random() - 0.5) * 15,\n                    speedY: 25 + Math.random() * 25, // Rising speed\n                    phase: Math.random() * Math.PI * 2,\n                    rotation: Math.random() * Math.PI * 2,\n                    rotationSpeed: (Math.random() - 0.5) * 1.2,\n                    scale: 0.4 + Math.random() * 0.4,\n                    opacity: 0.4 + Math.random() * 0.4,\n                    type: 'medium',\n                    wobbleSpeed: 1.0 + Math.random() * 0.6\n                });\n            }\n            \n            // Tiny bubbles\n            const specCount = 30 + Math.floor(Math.random() * 6);\n            for (let i = 0; i < specCount; i++) {\n                gameState.backgroundJellyfish.push({\n                    x: Math.random() * canvas.width,\n                    y: Math.random() * canvas.height,\n                    speedX: (Math.random() - 0.5) * 20,\n                    speedY: 30 + Math.random() * 40, // Rising speed\n                    phase: Math.random() * Math.PI * 2,\n                    rotation: 0,\n                    rotationSpeed: 0,\n                    scale: 0.2 + Math.random() * 0.25, // Very small\n                    opacity: 0.3 + Math.random() * 0.5,\n                    type: 'spec',\n                    wobbleSpeed: 1.2 + Math.random() * 0.8,\n                    twinkle: Math.random() * Math.PI * 2 // For shimmer effect\n                });\n            }\n        }\n        \n        // ===== INITIALIZE BACKGROUND BIRDS (CARDINALS) =====\n        function initializeBackgroundBirds() {\n            gameState.backgroundBirds = [];\n            \n            // Create 8-10 flying winter cardinals at various depths\n            const birdCount = 8 + Math.floor(Math.random() * 3);\n            \n            // Create evenly spaced segments across the width\n            const segmentWidth = canvas.width / birdCount;\n            \n            for (let i = 0; i < birdCount; i++) {\n                const depthBias = Math.random();\n                const y = depthBias < 0.7 \n                    ? canvas.height * 0.15 + Math.random() * canvas.height * 0.6\n                    : Math.random() * canvas.height;\n                \n                // Random direction (left or right)\n                const direction = Math.random() > 0.5 ? 1 : -1;\n                const speed = 35 + Math.random() * 55;\n                \n                // Spread birds evenly across screen\n                const baseX = i * segmentWidth + segmentWidth / 2;\n                const randomOffset = (Math.random() - 0.5) * segmentWidth * 0.6;\n                const x = baseX + randomOffset;\n                \n                gameState.backgroundBirds.push({\n                    x: x,\n                    y: y,\n                    speedX: speed * direction,\n                    speedY: (Math.random() - 0.5) * 18,\n                    scale: 0.35 + Math.random() * 0.35,\n                    flipX: direction < 0,\n                    phase: Math.random() * Math.PI * 2,\n                    flapPhase: Math.random() * Math.PI * 2,\n                    opacity: 0.75 + Math.random() * 0.25\n                });\n            }\n        }\n        \n        // ===== INITIALIZE BACKGROUND FISH =====\n        function initializeBackgroundFish() {\n            gameState.backgroundFish = [];\n            \n            // Different fish types available\n            const fishTypes = ['fish', 'clownfish', 'dolphin', 'octopus', 'sea_turtle'];\n            \n            // Create 10-14 swimming tropical fish at various depths\n            const fishCount = 10 + Math.floor(Math.random() * 5);\n            \n            // Create evenly spaced segments across the width\n            const segmentWidth = canvas.width / fishCount;\n            \n            for (let i = 0; i < fishCount; i++) {\n                const depthBias = Math.random();\n                const y = depthBias < 0.7 \n                    ? canvas.height * 0.15 + Math.random() * canvas.height * 0.7\n                    : Math.random() * canvas.height;\n                \n                // Random direction (left or right)\n                const direction = Math.random() > 0.5 ? 1 : -1;\n                const speed = 35 + Math.random() * 55;\n                \n                // Spread fish evenly across screen\n                const baseX = i * segmentWidth + segmentWidth / 2;\n                const randomOffset = (Math.random() - 0.5) * segmentWidth * 0.6;\n                const x = baseX + randomOffset;\n                \n                // Randomly select a fish type\n                const fishType = fishTypes[Math.floor(Math.random() * fishTypes.length)];\n                \n                gameState.backgroundFish.push({\n                    x: x,\n                    y: y,\n                    speedX: speed * direction,\n                    speedY: (Math.random() - 0.5) * 18,\n                    scale: 0.5 + Math.random() * 0.4,\n                    flipX: direction < 0,\n                    phase: Math.random() * Math.PI * 2,\n                    swimPhase: Math.random() * Math.PI * 2,\n                    opacity: 0.75 + Math.random() * 0.25,\n                    type: fishType\n                });\n            }\n        }\n        \n        // ===== INITIALIZE BACKGROUND FAIRIES =====\n        function initializeBackgroundSeahorses() {\n            gameState.backgroundSeahorses = [];\n            \n            // Create 5-7 floating fairies (increased from 3-5 for better visibility)\n            const fairyCount = 5 + Math.floor(Math.random() * 3);\n            \n            for (let i = 0; i < fairyCount; i++) {\n                const x = Math.random() * canvas.width;\n                const y = Math.random() * canvas.height;\n                \n                // Fairies float gracefully up and down\n                const direction = Math.random() > 0.5 ? 1 : -1;\n                const speedY = (15 + Math.random() * 25) * direction;\n                const speedX = (Math.random() - 0.5) * 12;\n                \n                gameState.backgroundSeahorses.push({\n                    x: x,\n                    y: y,\n                    speedX: speedX,\n                    speedY: speedY,\n                    scale: 0.5 + Math.random() * 0.3,\n                    flipX: Math.random() > 0.5,\n                    phase: Math.random() * Math.PI * 2,\n                    finPhase: Math.random() * Math.PI * 2,\n                    opacity: 0.7 + Math.random() * 0.3\n                });\n            }\n        }\n        \n        // ===== INITIALIZE BACKGROUND BUBBLES =====\n        function initializeBackgroundBubbles() {\n            gameState.backgroundBubbles = [];\n            \n            // Create 15-20 falling snowflakes with varied animations\n            const snowflakeCount = 15 + Math.floor(Math.random() * 6);\n            \n            for (let i = 0; i < snowflakeCount; i++) {\n                gameState.backgroundBubbles.push({\n                    x: Math.random() * canvas.width,\n                    y: Math.random() * canvas.height,\n                    speedX: (Math.random() - 0.5) * 20, // Gentle horizontal drift\n                    speedY: 25 + Math.random() * 35, // Falling downward speed\n                    scale: 0.3 + Math.random() * 0.4, // Size variation\n                    opacity: 0.5 + Math.random() * 0.4, // Transparency variation\n                    baseOpacity: 0.5 + Math.random() * 0.4, // Store base opacity\n                    phase: Math.random() * Math.PI * 2, // For wobble animation\n                    rotation: Math.random() * Math.PI * 2, // Initial rotation\n                    rotationSpeed: (Math.random() - 0.5) * 2 // Rotation speed\n                });\n            }\n        }\n        \n        // ===== RENDER BACKGROUND BUBBLES (MYSTICAL MERMAID) =====\n        function renderBackgroundJellyfish() {\n            const currentTime = performance.now() / 1000;\n            \n            for (const bubble of gameState.backgroundJellyfish) {\n                ctx.save();\n                \n                // Calculate gentle swaying motion\n                const swayOffset = Math.sin(currentTime * bubble.wobbleSpeed + bubble.phase) * (bubble.type === 'spec' ? 8 : 15);\n                \n                const drawX = bubble.x + swayOffset;\n                const drawY = bubble.y;\n                \n                // Calculate bubble shimmer (rainbow iridescence)\n                const shimmerPhase = (currentTime * 2 + bubble.phase) % (Math.PI * 2);\n                const hueShift = Math.sin(shimmerPhase) * 60 + 180; // Shift between cyan and purple\n                \n                if (bubble.type === 'spec') {\n                    // Render tiny bubbles as simple circles\n                    const twinkle = Math.sin(currentTime * 3 + bubble.twinkle) * 0.5 + 0.5;\n                    const specOpacity = bubble.opacity * (0.4 + twinkle * 0.3);\n                    ctx.globalAlpha = specOpacity;\n                    \n                    const specSize = 4 * bubble.scale;\n                    \n                    // Draw bubble with subtle rainbow shimmer\n                    const gradient = ctx.createRadialGradient(\n                        drawX - specSize * 0.3, \n                        drawY - specSize * 0.3, \n                        0, \n                        drawX, \n                        drawY, \n                        specSize * 2\n                    );\n                    gradient.addColorStop(0, `hsla(${hueShift}, 70%, 95%, ${specOpacity * 0.9})`);\n                    gradient.addColorStop(0.4, `hsla(${hueShift + 30}, 60%, 85%, ${specOpacity * 0.5})`);\n                    gradient.addColorStop(0.7, `hsla(${hueShift + 60}, 50%, 75%, ${specOpacity * 0.2})`);\n                    gradient.addColorStop(1, 'rgba(200, 230, 255, 0)');\n                    \n                    ctx.fillStyle = gradient;\n                    ctx.beginPath();\n                    ctx.arc(drawX, drawY, specSize * 2, 0, Math.PI * 2);\n                    ctx.fill();\n                    \n                    // Bright highlight\n                    ctx.fillStyle = `rgba(255, 255, 255, ${specOpacity * 0.8})`;\n                    ctx.beginPath();\n                    ctx.arc(drawX - specSize * 0.3, drawY - specSize * 0.3, specSize * 0.4, 0, Math.PI * 2);\n                    ctx.fill();\n                } else {\n                    // Render larger bubbles with mystical shimmer\n                    const baseSize = bubble.type === 'large' ? 45 : 30;\n                    const size = baseSize * bubble.scale;\n                    \n                    // Pulsing opacity for floating effect\n                    const pulse = Math.sin(currentTime * 1.5 + bubble.phase) * 0.15 + 0.85;\n                    ctx.globalAlpha = bubble.opacity * pulse;\n                    \n                    // Main bubble body with rainbow iridescence\n                    const bubbleGradient = ctx.createRadialGradient(\n                        drawX - size * 0.35,\n                        drawY - size * 0.35,\n                        0,\n                        drawX,\n                        drawY,\n                        size\n                    );\n                    bubbleGradient.addColorStop(0, `hsla(${hueShift}, 65%, 95%, ${pulse * 0.3})`);\n                    bubbleGradient.addColorStop(0.3, `hsla(${hueShift + 40}, 55%, 85%, ${pulse * 0.25})`);\n                    bubbleGradient.addColorStop(0.6, `hsla(${hueShift + 80}, 50%, 80%, ${pulse * 0.15})`);\n                    bubbleGradient.addColorStop(1, 'rgba(180, 220, 255, 0)');\n                    \n                    ctx.fillStyle = bubbleGradient;\n                    ctx.beginPath();\n                    ctx.arc(drawX, drawY, size, 0, Math.PI * 2);\n                    ctx.fill();\n                    \n                    // Bubble outline (soap film effect)\n                    ctx.strokeStyle = `hsla(${hueShift + 20}, 60%, 90%, ${pulse * 0.4})`;\n                    ctx.lineWidth = 1.5;\n                    ctx.beginPath();\n                    ctx.arc(drawX, drawY, size, 0, Math.PI * 2);\n                    ctx.stroke();\n                    \n                    // Bright highlight spot (top-left)\n                    const highlightSize = size * 0.35;\n                    const highlightGradient = ctx.createRadialGradient(\n                        drawX - size * 0.35,\n                        drawY - size * 0.35,\n                        0,\n                        drawX - size * 0.35,\n                        drawY - size * 0.35,\n                        highlightSize\n                    );\n                    highlightGradient.addColorStop(0, `rgba(255, 255, 255, ${pulse * 0.8})`);\n                    highlightGradient.addColorStop(0.6, `rgba(255, 255, 255, ${pulse * 0.3})`);\n                    highlightGradient.addColorStop(1, 'rgba(255, 255, 255, 0)');\n                    \n                    ctx.fillStyle = highlightGradient;\n                    ctx.beginPath();\n                    ctx.arc(drawX - size * 0.35, drawY - size * 0.35, highlightSize, 0, Math.PI * 2);\n                    ctx.fill();\n                    \n                    // Secondary highlight (bottom-right, dimmer)\n                    const secondarySize = size * 0.2;\n                    ctx.fillStyle = `rgba(255, 255, 255, ${pulse * 0.4})`;\n                    ctx.beginPath();\n                    ctx.arc(drawX + size * 0.3, drawY + size * 0.3, secondarySize, 0, Math.PI * 2);\n                    ctx.fill();\n                    \n                    // Add mystical sparkle for large bubbles\n                    if (bubble.type === 'large') {\n                        const sparkle = Math.sin(currentTime * 4 + bubble.phase) * 0.5 + 0.5;\n                        if (sparkle > 0.6) {\n                            // Draw small star sparkle\n                            ctx.fillStyle = `rgba(200, 255, 255, ${(sparkle - 0.6) * 2.5})`;\n                            ctx.beginPath();\n                            ctx.arc(drawX + size * 0.5, drawY - size * 0.2, 2, 0, Math.PI * 2);\n                            ctx.fill();\n                            \n                            // Sparkle rays\n                            ctx.strokeStyle = `rgba(220, 255, 255, ${(sparkle - 0.6) * 2})`;\n                            ctx.lineWidth = 1;\n                            for (let i = 0; i < 4; i++) {\n                                const angle = (i * Math.PI / 2) + currentTime * 3;\n                                const rayLength = 4;\n                                ctx.beginPath();\n                                ctx.moveTo(drawX + size * 0.5, drawY - size * 0.2);\n                                ctx.lineTo(\n                                    drawX + size * 0.5 + Math.cos(angle) * rayLength,\n                                    drawY - size * 0.2 + Math.sin(angle) * rayLength\n                                );\n                                ctx.stroke();\n                            }\n                        }\n                    }\n                }\n                \n                ctx.restore();\n            }\n        }\n        \n        // ===== RENDER BACKGROUND BIRDS (CARDINALS) =====\n        function renderBackgroundBirds() {\n            const cardinalImg = assetCache.images['decoration_cardinal'];\n            if (!cardinalImg) return;\n            \n            const currentTime = performance.now() / 1000;\n            \n            for (const bird of gameState.backgroundBirds) {\n                ctx.save();\n                \n                // Calculate flying bob (up and down motion)\n                const bobOffset = Math.sin(currentTime * 4 + bird.flapPhase) * 6;\n                \n                // Calculate wing flap rotation - MORE DRAMATIC\n                const wingFlap = Math.sin(currentTime * 8 + bird.phase) * 0.12;\n                \n                // Apply fixed transparency for depth\n                ctx.globalAlpha = bird.opacity;\n                \n                // Position and draw bird\n                const size = 45 * bird.scale;\n                const drawX = bird.x;\n                const drawY = bird.y + bobOffset;\n                \n                ctx.translate(drawX, drawY);\n                \n                // Flip horizontally if flying left\n                if (bird.flipX) {\n                    ctx.scale(-1, 1);\n                }\n                \n                // Apply subtle rotation for flying motion\n                ctx.rotate(wingFlap);\n                \n                ctx.drawImage(\n                    cardinalImg,\n                    -size / 2,\n                    -size / 2,\n                    size,\n                    size\n                );\n                \n                ctx.restore();\n            }\n        }\n        \n        // ===== RENDER BACKGROUND FISH =====\n        function renderBackgroundFish() {\n            const currentTime = performance.now() / 1000;\n            \n            for (const fish of gameState.backgroundFish) {\n                // Determine which asset to use based on fish type\n                const assetId = `decoration_${fish.type}`;\n                const fishImg = assetCache.images[assetId];\n                \n                if (!fishImg) continue; // Skip if asset not found\n                \n                ctx.save();\n                \n                // Calculate swimming bob (up and down motion)\n                const bobOffset = Math.sin(currentTime * 3 + fish.swimPhase) * 8;\n                \n                // Calculate tail swish - MORE DRAMATIC for fish\n                const tailSwish = Math.sin(currentTime * 8 + fish.phase) * 0.12;\n                \n                // Apply fixed transparency for depth\n                ctx.globalAlpha = fish.opacity;\n                \n                // Position and draw fish\n                let size = 55 * fish.scale;\n                \n                // Adjust size based on type for variety\n                if (fish.type === 'dolphin') size = 70 * fish.scale;\n                else if (fish.type === 'sea_turtle') size = 60 * fish.scale;\n                else if (fish.type === 'octopus') size = 50 * fish.scale;\n                \n                const drawX = fish.x;\n                const drawY = fish.y + bobOffset;\n                \n                ctx.translate(drawX, drawY);\n                \n                // Flip horizontally if swimming left\n                if (fish.flipX) {\n                    ctx.scale(-1, 1);\n                }\n                \n                // Apply subtle rotation for swimming motion\n                ctx.rotate(tailSwish);\n                \n                ctx.drawImage(\n                    fishImg,\n                    -size / 2,\n                    -size / 2,\n                    size,\n                    size\n                );\n                \n                ctx.restore();\n            }\n        }\n        \n        // ===== RENDER BACKGROUND FAIRIES =====\n        function renderBackgroundSeahorses() {\n            const fairyImg = assetCache.images['decoration_chibi_fairy'];\n            if (!fairyImg) return;\n            \n            const currentTime = performance.now() / 1000;\n            \n            for (const fairy of gameState.backgroundSeahorses) {\n                ctx.save();\n                \n                // Calculate floating sway (fairies drift side to side)\n                const swayOffset = Math.sin(currentTime * 2 + fairy.phase) * 12;\n                \n                // Calculate wing flutter - MORE DRAMATIC (increased from 0.06 to 0.15)\n                const wingFlutter = Math.sin(currentTime * 10 + fairy.finPhase) * 0.15;\n                \n                // Add wing flapping scale effect for more visible animation\n                const wingFlapScale = 1 + Math.sin(currentTime * 10 + fairy.finPhase) * 0.12;\n                \n                // Apply fixed transparency for depth\n                ctx.globalAlpha = fairy.opacity;\n                \n                // Position and draw fairy\n                const size = 60 * fairy.scale * wingFlapScale;\n                const drawX = fairy.x + swayOffset;\n                const drawY = fairy.y;\n                \n                ctx.translate(drawX, drawY);\n                \n                // Flip horizontally randomly for variety\n                if (fairy.flipX) {\n                    ctx.scale(-1, 1);\n                }\n                \n                // Apply rotation for wing flutter\n                ctx.rotate(wingFlutter);\n                \n                ctx.drawImage(\n                    fairyImg,\n                    -size / 2,\n                    -size / 2,\n                    size,\n                    size\n                );\n                \n                ctx.restore();\n            }\n        }\n        \n        // ===== RENDER BACKGROUND BUBBLES =====\n        function renderBackgroundBubbles() {\n            const currentTime = performance.now() / 1000;\n            \n            for (const bubble of gameState.backgroundBubbles) {\n                ctx.save();\n                \n                // Calculate gentle swaying motion\n                const swayOffset = Math.sin(currentTime * 1.8 + bubble.phase) * 15;\n                \n                const drawX = bubble.x + swayOffset;\n                const drawY = bubble.y;\n                \n                // Bubble size with slight pulsing\n                const pulse = Math.sin(currentTime * 2 + bubble.phase) * 0.15 + 0.85;\n                const bubbleSize = 15 * bubble.scale * pulse;\n                \n                // Apply opacity with shimmer\n                const shimmer = Math.sin(currentTime * 3 + bubble.phase) * 0.2 + 0.8;\n                ctx.globalAlpha = bubble.opacity * shimmer;\n                \n                // Main bubble body with rainbow iridescence\n                const bubbleGradient = ctx.createRadialGradient(\n                    drawX - bubbleSize * 0.35,\n                    drawY - bubbleSize * 0.35,\n                    0,\n                    drawX,\n                    drawY,\n                    bubbleSize\n                );\n                \n                // Rainbow shimmer effect\n                const hueShift = (currentTime * 50 + bubble.phase * 100) % 360;\n                bubbleGradient.addColorStop(0, `hsla(${hueShift}, 70%, 95%, ${0.6 * shimmer})`);\n                bubbleGradient.addColorStop(0.3, `hsla(${(hueShift + 60) % 360}, 60%, 85%, ${0.4 * shimmer})`);\n                bubbleGradient.addColorStop(0.6, `hsla(${(hueShift + 120) % 360}, 50%, 75%, ${0.2 * shimmer})`);\n                bubbleGradient.addColorStop(1, 'rgba(180, 220, 255, 0)');\n                \n                ctx.fillStyle = bubbleGradient;\n                ctx.beginPath();\n                ctx.arc(drawX, drawY, bubbleSize, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Bubble outline (soap film effect)\n                ctx.strokeStyle = `hsla(${hueShift + 30}, 60%, 90%, ${0.5 * shimmer})`;\n                ctx.lineWidth = 1.5;\n                ctx.beginPath();\n                ctx.arc(drawX, drawY, bubbleSize, 0, Math.PI * 2);\n                ctx.stroke();\n                \n                // Bright highlight spot (top-left)\n                const highlightSize = bubbleSize * 0.35;\n                const highlightGradient = ctx.createRadialGradient(\n                    drawX - bubbleSize * 0.35,\n                    drawY - bubbleSize * 0.35,\n                    0,\n                    drawX - bubbleSize * 0.35,\n                    drawY - bubbleSize * 0.35,\n                    highlightSize\n                );\n                highlightGradient.addColorStop(0, `rgba(255, 255, 255, ${0.9 * shimmer})`);\n                highlightGradient.addColorStop(0.6, `rgba(255, 255, 255, ${0.4 * shimmer})`);\n                highlightGradient.addColorStop(1, 'rgba(255, 255, 255, 0)');\n                \n                ctx.fillStyle = highlightGradient;\n                ctx.beginPath();\n                ctx.arc(drawX - bubbleSize * 0.35, drawY - bubbleSize * 0.35, highlightSize, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Secondary highlight (bottom-right, dimmer)\n                const secondarySize = bubbleSize * 0.2;\n                ctx.fillStyle = `rgba(255, 255, 255, ${0.5 * shimmer})`;\n                ctx.beginPath();\n                ctx.arc(drawX + bubbleSize * 0.3, drawY + bubbleSize * 0.3, secondarySize, 0, Math.PI * 2);\n                ctx.fill();\n                \n                ctx.restore();\n            }\n        }\n        \n        // ===== UPDATE BACKGROUND BUBBLES (RISING) =====\n        function updateBackgroundJellyfish(deltaTime) {\n            for (const bubble of gameState.backgroundJellyfish) {\n                // Update position (bubbles rise upward, negative Y direction)\n                bubble.x += bubble.speedX * deltaTime;\n                bubble.y -= Math.abs(bubble.speedY) * deltaTime; // Always rise (subtract from Y)\n                \n                // Update rotation (for visual variety)\n                bubble.rotation += bubble.rotationSpeed * deltaTime;\n                \n                // Wrap around horizontally\n                if (bubble.x < -50) {\n                    bubble.x = canvas.width + 50;\n                } else if (bubble.x > canvas.width + 50) {\n                    bubble.x = -50;\n                }\n                \n                // Wrap around vertically (bubbles rise and respawn at bottom)\n                if (bubble.y < -50) {\n                    bubble.y = canvas.height + 50;\n                    bubble.x = Math.random() * canvas.width;\n                }\n            }\n        }\n        \n        // ===== UPDATE BACKGROUND BIRDS (CARDINALS) =====\n        function updateBackgroundBirds(deltaTime) {\n            for (const bird of gameState.backgroundBirds) {\n                // Update position\n                bird.x += bird.speedX * deltaTime;\n                bird.y += bird.speedY * deltaTime;\n                \n                // Wrap around horizontally\n                if (bird.speedX > 0 && bird.x > canvas.width + 50) {\n                    bird.x = -50;\n                } else if (bird.speedX < 0 && bird.x < -50) {\n                    bird.x = canvas.width + 50;\n                }\n                \n                // Keep birds within vertical bounds\n                if (bird.y < 50) {\n                    bird.y = 50;\n                    bird.speedY = Math.abs(bird.speedY);\n                } else if (bird.y > canvas.height - 50) {\n                    bird.y = canvas.height - 50;\n                    bird.speedY = -Math.abs(bird.speedY);\n                }\n            }\n        }\n        \n        // ===== UPDATE BACKGROUND FISH =====\n        function updateBackgroundFish(deltaTime) {\n            for (const fish of gameState.backgroundFish) {\n                // Update position\n                fish.x += fish.speedX * deltaTime;\n                fish.y += fish.speedY * deltaTime;\n                \n                // Wrap around horizontally\n                if (fish.speedX > 0 && fish.x > canvas.width + 50) {\n                    fish.x = -50;\n                } else if (fish.speedX < 0 && fish.x < -50) {\n                    fish.x = canvas.width + 50;\n                }\n                \n                // Keep fish within vertical bounds\n                if (fish.y < 50) {\n                    fish.y = 50;\n                    fish.speedY = Math.abs(fish.speedY);\n                } else if (fish.y > canvas.height - 50) {\n                    fish.y = canvas.height - 50;\n                    fish.speedY = -Math.abs(fish.speedY);\n                }\n            }\n        }\n        \n        // ===== UPDATE BACKGROUND FAIRIES =====\n        function updateBackgroundSeahorses(deltaTime) {\n            for (const fairy of gameState.backgroundSeahorses) {\n                // Update position\n                fairy.x += fairy.speedX * deltaTime;\n                fairy.y += fairy.speedY * deltaTime;\n                \n                // Wrap around horizontally\n                if (fairy.x < -50) {\n                    fairy.x = canvas.width + 50;\n                } else if (fairy.x > canvas.width + 50) {\n                    fairy.x = -50;\n                }\n                \n                // Wrap around vertically (fairies float up and down)\n                if (fairy.speedY < 0 && fairy.y < -50) {\n                    fairy.y = canvas.height + 50;\n                } else if (fairy.speedY > 0 && fairy.y > canvas.height + 50) {\n                    fairy.y = -50;\n                }\n            }\n        }\n        \n        // ===== UPDATE BACKGROUND BUBBLES =====\n        function updateBackgroundBubbles(deltaTime) {\n            for (const bubble of gameState.backgroundBubbles) {\n                // Update position - bubbles RISE upward (negative Y direction)\n                bubble.x += bubble.speedX * deltaTime;\n                bubble.y -= Math.abs(bubble.speedY) * deltaTime; // Always rise (subtract from Y)\n                \n                // Update rotation\n                bubble.rotation += bubble.rotationSpeed * deltaTime;\n                \n                // Wrap around horizontally\n                if (bubble.x < -50) {\n                    bubble.x = canvas.width + 50;\n                } else if (bubble.x > canvas.width + 50) {\n                    bubble.x = -50;\n                }\n                \n                // Wrap around vertically (bubbles rise and respawn at bottom)\n                if (bubble.y < -50) {\n                    bubble.y = canvas.height + 50;\n                    bubble.x = Math.random() * canvas.width;\n                }\n            }\n        }\n\n        // ===== SELECT NEXT PROMPT =====\n        function selectNextPrompt() {\n            const availablePrompts = window.gameConfig.prompts.filter(p => p.enabled !== false);\n            if (availablePrompts.length === 0) {\n                lib.log('No prompts available!');\n                return;\n            }\n            \n            // Determine difficulty based on round\n            let targetDifficulty = 'easy';\n            if (gameState.round >= 8) {\n                targetDifficulty = 'hard';\n            } else if (gameState.round >= 4) {\n                targetDifficulty = 'medium';\n            }\n            \n            // Filter prompts by difficulty\n            let filteredPrompts = availablePrompts.filter(p => p.difficulty === targetDifficulty);\n            \n            // If no prompts for this difficulty, fall back to all available\n            if (filteredPrompts.length === 0) {\n                filteredPrompts = availablePrompts;\n            }\n            \n            const randomIndex = Math.floor(Math.random() * filteredPrompts.length);\n            gameState.currentPrompt = filteredPrompts[randomIndex];\n            \n            // Update UI - both inline title and prompt card\n            document.getElementById('prompt-title').textContent = gameState.currentPrompt.name;\n            \n            const promptCard = document.getElementById('prompt-card');\n            const promptCardTitle = document.getElementById('prompt-card-title');\n            const promptCardDescription = document.getElementById('prompt-card-description');\n            \n            if (promptCardTitle) promptCardTitle.textContent = gameState.currentPrompt.name;\n            if (promptCardDescription) promptCardDescription.textContent = gameState.currentPrompt.description;\n        }\n        \n        // ===== UPDATE UI FOR GAME MODE =====\n        function updateUIForGameMode() {\n            const timerContainer = document.querySelector('.timer-container-inline');\n            const challengeSection = document.querySelector('.top-hud-challenge');\n            const hintButton = document.getElementById('hint-button');\n            const promptCard = document.getElementById('prompt-card');\n            const doneBtn = document.getElementById('btn-done');\n            const galleryBtn = document.getElementById('gallery-button');\n            \n            if (gameState.gameMode === 'free') {\n                // Free mode: hide timer, challenge, hint button, and prompt card\n                if (timerContainer) timerContainer.classList.add('hidden');\n                if (challengeSection) challengeSection.classList.add('hidden');\n                if (hintButton) hintButton.classList.add('hidden');\n                if (promptCard) promptCard.classList.add('hidden');\n                doneBtn.textContent = '\ud83d\udcbe Save & Clear';\n                doneBtn.classList.remove('btn-done');\n                doneBtn.classList.add('btn-new-canvas');\n                galleryBtn.classList.add('visible');\n            } else {\n                // Challenge mode: show timer, challenge, hint button, and prompt card\n                if (timerContainer) timerContainer.classList.remove('hidden');\n                if (challengeSection) challengeSection.classList.remove('hidden');\n                if (hintButton) hintButton.classList.remove('hidden');\n                if (promptCard) promptCard.classList.remove('hidden');\n                doneBtn.textContent = '\u2713 Done';\n                doneBtn.classList.add('btn-done');\n                doneBtn.classList.remove('btn-new-canvas');\n                galleryBtn.classList.remove('visible');\n            }\n        }\n\n        // ===== GET DECORATION SIZE =====\n        function getDecorationSize(decorationType) {\n            const decorationAssetId = `decoration_${decorationType}`;\n            const assetInfo = lib.getAsset(decorationAssetId);\n            let width = 70;\n            let height = 70;\n            \n            // Special sizing for reindeer - make it bigger\n            if (decorationType === 'reindeer') {\n                width = 100;\n                height = 100;\n            }\n            \n            if (assetInfo && assetInfo.aspect_ratio) {\n                const [aspectW, aspectH] = assetInfo.aspect_ratio;\n                const aspectRatio = aspectW / aspectH;\n                \n                if (decorationType === 'reindeer') {\n                    // Keep reindeer at 100px base\n                    if (aspectRatio > 1) {\n                        width = 100;\n                        height = 100 / aspectRatio;\n                    } else {\n                        height = 100;\n                        width = 100 * aspectRatio;\n                    }\n                } else {\n                    if (aspectRatio > 1) {\n                        width = 70;\n                        height = 70 / aspectRatio;\n                    } else {\n                        height = 70;\n                        width = 70 * aspectRatio;\n                    }\n                }\n            }\n            \n            return { width, height };\n        }\n        \n        // ===== CHECK IF POINT IS OVER DECORATION =====\n        function getDecorationAtPoint(x, y) {\n            // Check decorations in reverse order (top to bottom)\n            for (let i = gameState.decorations.length - 1; i >= 0; i--) {\n                const decoration = gameState.decorations[i];\n                const { width, height } = getDecorationSize(decoration.type);\n                \n                const left = decoration.x - width / 2;\n                const right = decoration.x + width / 2;\n                const top = decoration.y - height / 2;\n                const bottom = decoration.y + height / 2;\n                \n                if (x >= left && x <= right && y >= top && y <= bottom) {\n                    return i;\n                }\n            }\n            return null;\n        }\n        \n        \n        // ===== FROSTBITE FROSTING EFFECT (Deep Intense Cold) =====\n        function drawFrostbiteFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw intense ice shards\n            const shardCount = 15;\n            \n            for (let i = 0; i < shardCount; i++) {\n                const shardX = x + width * (0.1 + (i * 0.618033988749895) % 1 * 0.8);\n                const shardY = y + height * (0.1 + (i * 0.786151377757423) % 1 * 0.8);\n                \n                const pulse = Math.sin(time * 3 + i * 0.9) * 0.5 + 0.5;\n                const shardSize = 6 + pulse * 3;\n                \n                ctx.save();\n                ctx.translate(shardX, shardY);\n                ctx.rotate(time * 0.8 + i * 0.6);\n                \n                // Sharp ice shard with deep blue\n                const shardGradient = ctx.createRadialGradient(0, 0, 0, 0, 0, shardSize * 2);\n                shardGradient.addColorStop(0, `rgba(59, 130, 246, ${pulse * 0.8})`);\n                shardGradient.addColorStop(0.5, `rgba(30, 58, 138, ${pulse * 0.6})`);\n                shardGradient.addColorStop(1, 'rgba(15, 23, 42, 0)');\n                \n                ctx.fillStyle = shardGradient;\n                ctx.beginPath();\n                ctx.moveTo(0, -shardSize);\n                ctx.lineTo(shardSize * 0.4, 0);\n                ctx.lineTo(0, shardSize);\n                ctx.lineTo(-shardSize * 0.4, 0);\n                ctx.closePath();\n                ctx.fill();\n                \n                ctx.restore();\n            }\n            \n            // Add frosty cold veil\n            const coldGradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.4,\n                0,\n                x + width * 0.5,\n                y + height * 0.4,\n                Math.max(width, height) * 0.7\n            );\n            \n            const coldPulse = Math.sin(time * 1.3) * 0.5 + 0.5;\n            coldGradient.addColorStop(0, `rgba(59, 130, 246, ${coldPulse * 0.15})`);\n            coldGradient.addColorStop(0.6, `rgba(30, 64, 175, ${coldPulse * 0.08})`);\n            coldGradient.addColorStop(1, 'rgba(15, 23, 42, 0)');\n            \n            ctx.fillStyle = coldGradient;\n            ctx.fillRect(x, y, width, height);\n            \n            ctx.restore();\n        }\n        \n        // ===== GLACIER FROSTING EFFECT (Pale Ice) =====\n        function drawGlacierFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw pale ice layers\n            const layerCount = 5;\n            \n            for (let i = 0; i < layerCount; i++) {\n                const layerY = y + (i * height / layerCount);\n                const layerHeight = height / layerCount + 10;\n                \n                const layerAlpha = (Math.sin(time * 1.5 + i * 0.8) * 0.5 + 0.5) * 0.15;\n                \n                const layerGradient = ctx.createLinearGradient(x, layerY, x + width, layerY);\n                layerGradient.addColorStop(0, `rgba(224, 242, 254, ${layerAlpha})`);\n                layerGradient.addColorStop(0.5, `rgba(240, 249, 255, ${layerAlpha * 1.2})`);\n                layerGradient.addColorStop(1, `rgba(224, 242, 254, ${layerAlpha})`);\n                \n                ctx.fillStyle = layerGradient;\n                ctx.fillRect(x, layerY, width, layerHeight);\n            }\n            \n            // Add scattered ice sparkles\n            const sparkleCount = 20;\n            \n            for (let i = 0; i < sparkleCount; i++) {\n                const sparkleX = x + width * (0.1 + (i * 0.618033988749895) % 1 * 0.8);\n                const sparkleY = y + height * (0.1 + (i * 0.786151377757423) % 1 * 0.8);\n                \n                const twinkle = Math.sin(time * 4 + i * 0.9) * 0.5 + 0.5;\n                const sparkleSize = 1.5 + twinkle * 2;\n                \n                ctx.fillStyle = `rgba(186, 230, 253, ${twinkle * 0.7})`;\n                ctx.beginPath();\n                ctx.arc(sparkleX, sparkleY, sparkleSize, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            ctx.restore();\n        }\n        \n        // ===== BLIZZARD FROSTING EFFECT (Swirling Storm) =====\n        function drawBlizzardFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw swirling snow particles\n            const particleCount = 40;\n            \n            for (let i = 0; i < particleCount; i++) {\n                const baseX = x + width * (0.05 + (i * 0.618033988749895) % 1 * 0.9);\n                const baseY = y + height * (0.05 + (i * 0.786151377757423) % 1 * 0.9);\n                \n                // Swirling motion\n                const swirl = (time * 2 + i * 0.3) % (Math.PI * 2);\n                const radius = 15 + Math.sin(time * 1.5 + i) * 10;\n                const particleX = baseX + Math.cos(swirl) * radius;\n                const particleY = baseY + Math.sin(swirl) * radius * 0.6;\n                \n                const particleAlpha = Math.sin(swirl) * 0.5 + 0.5;\n                const particleSize = 2 + particleAlpha * 2;\n                \n                // Snow particle\n                const particleGradient = ctx.createRadialGradient(\n                    particleX,\n                    particleY,\n                    0,\n                    particleX,\n                    particleY,\n                    particleSize * 1.5\n                );\n                particleGradient.addColorStop(0, `rgba(255, 255, 255, ${particleAlpha * 0.8})`);\n                particleGradient.addColorStop(0.5, `rgba(186, 230, 253, ${particleAlpha * 0.5})`);\n                particleGradient.addColorStop(1, 'rgba(224, 242, 254, 0)');\n                \n                ctx.fillStyle = particleGradient;\n                ctx.beginPath();\n                ctx.arc(particleX, particleY, particleSize * 1.5, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Add wind streaks\n            const streakCount = 8;\n            \n            for (let i = 0; i < streakCount; i++) {\n                const streakY = y + height * (0.2 + i * 0.1);\n                const streakProgress = (time * 0.8 + i * 0.3) % 1;\n                const streakX = x + width * streakProgress;\n                \n                const streakAlpha = Math.sin(streakProgress * Math.PI) * 0.3;\n                \n                ctx.strokeStyle = `rgba(255, 255, 255, ${streakAlpha})`;\n                ctx.lineWidth = 2;\n                ctx.beginPath();\n                ctx.moveTo(streakX, streakY);\n                ctx.lineTo(streakX + 20, streakY + 5);\n                ctx.stroke();\n            }\n            \n            ctx.restore();\n        }\n        \n        // ===== WINTER NIGHT FROSTING EFFECT (Midnight Stars) =====\n        function drawWinterNightFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw starry night sky\n            const starCount = 30;\n            \n            for (let i = 0; i < starCount; i++) {\n                const starX = x + width * (0.05 + (i * 0.618033988749895) % 1 * 0.9);\n                const starY = y + height * (0.05 + (i * 0.786151377757423) % 1 * 0.9);\n                \n                const twinkle = Math.sin(time * 3 + i * 1.2) * 0.5 + 0.5;\n                const starSize = 1 + twinkle * 2.5;\n                \n                // Star with blue-white glow\n                const starGradient = ctx.createRadialGradient(starX, starY, 0, starX, starY, starSize * 2);\n                starGradient.addColorStop(0, `rgba(219, 234, 254, ${twinkle * 0.9})`);\n                starGradient.addColorStop(0.5, `rgba(147, 197, 253, ${twinkle * 0.6})`);\n                starGradient.addColorStop(1, 'rgba(59, 130, 246, 0)');\n                \n                ctx.fillStyle = starGradient;\n                ctx.beginPath();\n                ctx.arc(starX, starY, starSize * 2, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Bright core\n                ctx.fillStyle = `rgba(255, 255, 255, ${twinkle * 0.8})`;\n                ctx.beginPath();\n                ctx.arc(starX, starY, starSize * 0.4, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Add night sky glow\n            const nightGradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.3,\n                0,\n                x + width * 0.5,\n                y + height * 0.3,\n                Math.max(width, height) * 0.8\n            );\n            \n            const nightPulse = Math.sin(time * 0.8) * 0.5 + 0.5;\n            nightGradient.addColorStop(0, `rgba(30, 58, 138, ${nightPulse * 0.12})`);\n            nightGradient.addColorStop(0.6, `rgba(15, 23, 42, ${nightPulse * 0.08})`);\n            nightGradient.addColorStop(1, 'rgba(15, 23, 42, 0)');\n            \n            ctx.fillStyle = nightGradient;\n            ctx.fillRect(x, y, width, height);\n            \n            ctx.restore();\n        }\n        \n        // ===== CRYSTAL ICE FROSTING EFFECT (Ultra Clear Crystal) =====\n        function drawCrystalIceFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw prismatic crystal facets\n            const facetCount = 12;\n            \n            for (let i = 0; i < facetCount; i++) {\n                const facetX = x + width * (0.1 + (i * 0.618033988749895) % 1 * 0.8);\n                const facetY = y + height * (0.1 + (i * 0.786151377757423) % 1 * 0.8);\n                \n                const pulse = Math.sin(time * 2.5 + i * 0.8) * 0.5 + 0.5;\n                const facetSize = 8 + pulse * 4;\n                \n                ctx.save();\n                ctx.translate(facetX, facetY);\n                ctx.rotate(time * 0.6 + i * 0.5);\n                \n                // Crystal facet with rainbow refraction\n                const facetGradient = ctx.createRadialGradient(0, 0, 0, 0, 0, facetSize * 2);\n                facetGradient.addColorStop(0, `rgba(240, 249, 255, ${pulse * 0.7})`);\n                facetGradient.addColorStop(0.4, `rgba(224, 242, 254, ${pulse * 0.5})`);\n                facetGradient.addColorStop(0.7, `rgba(186, 230, 253, ${pulse * 0.3})`);\n                facetGradient.addColorStop(1, 'rgba(147, 197, 253, 0)');\n                \n                ctx.fillStyle = facetGradient;\n                ctx.beginPath();\n                for (let j = 0; j < 6; j++) {\n                    const angle = (j * Math.PI / 3);\n                    const px = Math.cos(angle) * facetSize;\n                    const py = Math.sin(angle) * facetSize;\n                    if (j === 0) ctx.moveTo(px, py);\n                    else ctx.lineTo(px, py);\n                }\n                ctx.closePath();\n                ctx.fill();\n                \n                // Bright center\n                ctx.fillStyle = `rgba(255, 255, 255, ${pulse * 0.9})`;\n                ctx.beginPath();\n                ctx.arc(0, 0, facetSize * 0.3, 0, Math.PI * 2);\n                ctx.fill();\n                \n                ctx.restore();\n            }\n            \n            // Add prismatic light rays\n            const rayCount = 6;\n            \n            for (let i = 0; i < rayCount; i++) {\n                const rayAngle = (i * Math.PI * 2 / rayCount) + time * 0.5;\n                const rayCenterX = x + width * 0.5;\n                const rayCenterY = y + height * 0.5;\n                const rayLength = Math.max(width, height) * 0.4;\n                \n                const rayAlpha = (Math.sin(time * 2 + i) * 0.5 + 0.5) * 0.15;\n                \n                ctx.save();\n                ctx.translate(rayCenterX, rayCenterY);\n                ctx.rotate(rayAngle);\n                \n                const rayGradient = ctx.createLinearGradient(0, 0, rayLength, 0);\n                rayGradient.addColorStop(0, `rgba(240, 249, 255, ${rayAlpha})`);\n                rayGradient.addColorStop(1, 'rgba(240, 249, 255, 0)');\n                \n                ctx.fillStyle = rayGradient;\n                ctx.fillRect(0, -3, rayLength, 6);\n                \n                ctx.restore();\n            }\n            \n            ctx.restore();\n        }\n        \n        // ===== ABYSS FROSTING EFFECT (Deep Sea Darkness) =====\n        function drawAbyssFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Bioluminescent sparkles floating in the dark\n            const sparkleCount = 25;\n            for (let i = 0; i < sparkleCount; i++) {\n                const sparkleX = x + width * (0.1 + (i * 0.618033988749895) % 1 * 0.8);\n                const sparkleY = y + height * (0.1 + (i * 0.786151377757423) % 1 * 0.8);\n                \n                const twinkle = Math.sin(time * 4 + i * 1.2) * 0.5 + 0.5;\n                const sparkleSize = 2 + twinkle * 3;\n                \n                // Bioluminescent blue-cyan glow\n                const sparkleGradient = ctx.createRadialGradient(sparkleX, sparkleY, 0, sparkleX, sparkleY, sparkleSize * 3);\n                sparkleGradient.addColorStop(0, `rgba(100, 200, 255, ${twinkle * 0.9})`);\n                sparkleGradient.addColorStop(0.5, `rgba(60, 150, 220, ${twinkle * 0.6})`);\n                sparkleGradient.addColorStop(1, 'rgba(30, 100, 180, 0)');\n                \n                ctx.fillStyle = sparkleGradient;\n                ctx.beginPath();\n                ctx.arc(sparkleX, sparkleY, sparkleSize * 3, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Bright core\n                ctx.fillStyle = `rgba(150, 220, 255, ${twinkle * 0.95})`;\n                ctx.beginPath();\n                ctx.arc(sparkleX, sparkleY, sparkleSize * 0.5, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Deep ocean particles drifting\n            const particleCount = 15;\n            for (let i = 0; i < particleCount; i++) {\n                const baseX = x + width * (0.15 + (i * 0.754877666) % 1 * 0.7);\n                const baseY = y + height * (0.15 + (i * 0.866025403) % 1 * 0.7);\n                \n                const drift = (time * 0.5 + i * 0.3) % 1;\n                const particleX = baseX + Math.sin(time * 1.5 + i * 0.9) * 15;\n                const particleY = baseY + drift * 20 - 10;\n                \n                const particleAlpha = Math.sin(drift * Math.PI) * 0.6;\n                const particleSize = 3 + Math.sin(time * 2 + i) * 2;\n                \n                // Glowing particle\n                const particleGradient = ctx.createRadialGradient(particleX, particleY, 0, particleX, particleY, particleSize * 2);\n                particleGradient.addColorStop(0, `rgba(80, 180, 240, ${particleAlpha})`);\n                particleGradient.addColorStop(0.5, `rgba(50, 140, 200, ${particleAlpha * 0.6})`);\n                particleGradient.addColorStop(1, 'rgba(30, 100, 160, 0)');\n                \n                ctx.fillStyle = particleGradient;\n                ctx.beginPath();\n                ctx.arc(particleX, particleY, particleSize * 2, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Deep blue ambient glow\n            const ambientGradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.4,\n                0,\n                x + width * 0.5,\n                y + height * 0.4,\n                Math.max(width, height) * 0.7\n            );\n            \n            const glowPulse = Math.sin(time * 1.2) * 0.5 + 0.5;\n            ambientGradient.addColorStop(0, `rgba(50, 100, 180, ${glowPulse * 0.25})`);\n            ambientGradient.addColorStop(0.6, `rgba(30, 70, 140, ${glowPulse * 0.15})`);\n            ambientGradient.addColorStop(1, 'rgba(20, 50, 100, 0)');\n            \n            ctx.fillStyle = ambientGradient;\n            ctx.fillRect(x, y, width, height);\n            \n            ctx.restore();\n        }\n        \n        // ===== TROPICAL FROSTING EFFECT (Bright Paradise) =====\n        function drawTropicalFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Vibrant tropical shimmer waves\n            const waveCount = 6;\n            for (let i = 0; i < waveCount; i++) {\n                const waveY = y + height * (i / waveCount);\n                const waveOffset = Math.sin(time * 3 + i * 0.8) * 12;\n                \n                const waveGradient = ctx.createLinearGradient(x + waveOffset, waveY, x + width + waveOffset, waveY);\n                const waveAlpha = (Math.sin(time * 2 + i * 0.5) * 0.5 + 0.5) * 0.3;\n                \n                waveGradient.addColorStop(0, `rgba(0, 255, 255, ${waveAlpha})`);\n                waveGradient.addColorStop(0.5, `rgba(0, 255, 200, ${waveAlpha * 1.3})`);\n                waveGradient.addColorStop(1, `rgba(0, 255, 255, ${waveAlpha})`);\n                \n                ctx.fillStyle = waveGradient;\n                ctx.fillRect(x, waveY, width, height / waveCount + 8);\n            }\n            \n            // Bright tropical sparkles\n            const sparkleCount = 30;\n            for (let i = 0; i < sparkleCount; i++) {\n                const sparkleX = x + width * (0.1 + (i * 0.618033988749895) % 1 * 0.8);\n                const sparkleY = y + height * (0.1 + (i * 0.786151377757423) % 1 * 0.8);\n                \n                const twinkle = Math.sin(time * 5 + i * 1.1) * 0.5 + 0.5;\n                const sparkleSize = 2 + twinkle * 3;\n                \n                // Bright cyan sparkle\n                const sparkleGradient = ctx.createRadialGradient(sparkleX, sparkleY, 0, sparkleX, sparkleY, sparkleSize * 2);\n                sparkleGradient.addColorStop(0, `rgba(0, 255, 240, ${twinkle * 0.9})`);\n                sparkleGradient.addColorStop(0.5, `rgba(0, 220, 200, ${twinkle * 0.6})`);\n                sparkleGradient.addColorStop(1, 'rgba(0, 180, 160, 0)');\n                \n                ctx.fillStyle = sparkleGradient;\n                ctx.beginPath();\n                ctx.arc(sparkleX, sparkleY, sparkleSize * 2, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Bright core\n                ctx.fillStyle = `rgba(150, 255, 240, ${twinkle * 0.95})`;\n                ctx.beginPath();\n                ctx.arc(sparkleX, sparkleY, sparkleSize * 0.4, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Tropical glow overlay\n            const glowGradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.4,\n                0,\n                x + width * 0.5,\n                y + height * 0.4,\n                Math.max(width, height) * 0.7\n            );\n            \n            const glowPulse = Math.sin(time * 1.5) * 0.5 + 0.5;\n            glowGradient.addColorStop(0, `rgba(0, 255, 220, ${glowPulse * 0.25})`);\n            glowGradient.addColorStop(0.6, `rgba(0, 220, 200, ${glowPulse * 0.15})`);\n            glowGradient.addColorStop(1, 'rgba(0, 180, 160, 0)');\n            \n            ctx.fillStyle = glowGradient;\n            ctx.fillRect(x, y, width, height);\n            \n            ctx.restore();\n        }\n        \n        // ===== LAGOON FROSTING EFFECT (Calm Waters) =====\n        function drawLagoonFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Gentle lagoon ripples\n            const rippleCount = 6;\n            for (let i = 0; i < rippleCount; i++) {\n                const rippleProgress = (time * 0.5 + i * 0.3) % 1;\n                const rippleRadius = Math.max(width, height) * 0.3 * rippleProgress;\n                const rippleX = x + width * 0.5;\n                const rippleY = y + height * 0.5;\n                \n                const rippleAlpha = (1 - rippleProgress) * 0.3;\n                \n                ctx.strokeStyle = `rgba(32, 178, 170, ${rippleAlpha})`;\n                ctx.lineWidth = 2;\n                ctx.beginPath();\n                ctx.arc(rippleX, rippleY, rippleRadius, 0, Math.PI * 2);\n                ctx.stroke();\n            }\n            \n            // Floating water lilies (circles)\n            const lilyCount = 8;\n            for (let i = 0; i < lilyCount; i++) {\n                const lilyX = x + width * (0.15 + (i * 0.618033988749895) % 1 * 0.7);\n                const lilyY = y + height * (0.15 + (i * 0.786151377757423) % 1 * 0.7);\n                \n                const float = Math.sin(time * 1.5 + i * 0.8) * 0.5 + 0.5;\n                const lilySize = 3 + float * 2;\n                \n                const lilyGradient = ctx.createRadialGradient(lilyX, lilyY, 0, lilyX, lilyY, lilySize * 2);\n                lilyGradient.addColorStop(0, `rgba(72, 209, 204, ${float * 0.7})`);\n                lilyGradient.addColorStop(0.5, `rgba(32, 178, 170, ${float * 0.5})`);\n                lilyGradient.addColorStop(1, 'rgba(20, 150, 140, 0)');\n                \n                ctx.fillStyle = lilyGradient;\n                ctx.beginPath();\n                ctx.arc(lilyX, lilyY, lilySize * 2, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            ctx.restore();\n        }\n        \n        // ===== SAPPHIRE FROSTING EFFECT (Deep Blue Gem) =====\n        function drawSapphireFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Sapphire gem facets\n            const facetCount = 12;\n            for (let i = 0; i < facetCount; i++) {\n                const facetX = x + width * (0.1 + (i * 0.618033988749895) % 1 * 0.8);\n                const facetY = y + height * (0.1 + (i * 0.786151377757423) % 1 * 0.8);\n                \n                const shine = Math.sin(time * 3 + i * 0.9) * 0.5 + 0.5;\n                const facetSize = 6 + shine * 4;\n                \n                ctx.save();\n                ctx.translate(facetX, facetY);\n                ctx.rotate(time * 0.5 + i * 0.4);\n                \n                // Diamond shape\n                ctx.fillStyle = `rgba(15, 82, 186, ${shine * 0.7})`;\n                ctx.beginPath();\n                ctx.moveTo(0, -facetSize);\n                ctx.lineTo(facetSize * 0.6, 0);\n                ctx.lineTo(0, facetSize);\n                ctx.lineTo(-facetSize * 0.6, 0);\n                ctx.closePath();\n                ctx.fill();\n                \n                // Bright center\n                ctx.fillStyle = `rgba(100, 150, 255, ${shine * 0.9})`;\n                ctx.beginPath();\n                ctx.arc(0, 0, facetSize * 0.3, 0, Math.PI * 2);\n                ctx.fill();\n                \n                ctx.restore();\n            }\n            \n            // Sapphire glow\n            const glowGradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.4,\n                0,\n                x + width * 0.5,\n                y + height * 0.4,\n                Math.max(width, height) * 0.6\n            );\n            \n            const glowAlpha = 0.12 + Math.sin(time * 1.5) * 0.05;\n            glowGradient.addColorStop(0, `rgba(15, 82, 186, ${glowAlpha})`);\n            glowGradient.addColorStop(0.6, `rgba(10, 60, 150, ${glowAlpha * 0.6})`);\n            glowGradient.addColorStop(1, 'rgba(5, 40, 100, 0)');\n            \n            ctx.fillStyle = glowGradient;\n            ctx.fillRect(x, y, width, height);\n            \n            ctx.restore();\n        }\n        \n        // ===== OPAL FROSTING EFFECT (Iridescent Shimmer) =====\n        function drawOpalFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Iridescent color shifts\n            const colorWaveCount = 5;\n            for (let i = 0; i < colorWaveCount; i++) {\n                const waveProgress = (time * 0.8 + i * 0.2) % 1;\n                const waveY = y + height * waveProgress;\n                \n                const hue = (time * 50 + i * 60) % 360;\n                const waveAlpha = Math.sin(waveProgress * Math.PI) * 0.2;\n                \n                const waveGradient = ctx.createLinearGradient(x, waveY - 20, x, waveY + 20);\n                waveGradient.addColorStop(0, `hsla(${hue}, 70%, 85%, 0)`);\n                waveGradient.addColorStop(0.5, `hsla(${hue}, 70%, 85%, ${waveAlpha})`);\n                waveGradient.addColorStop(1, `hsla(${hue}, 70%, 85%, 0)`);\n                \n                ctx.fillStyle = waveGradient;\n                ctx.fillRect(x, waveY - 20, width, 40);\n            }\n            \n            // Opal sparkles with rainbow colors\n            const sparkleCount = 25;\n            for (let i = 0; i < sparkleCount; i++) {\n                const sparkleX = x + width * (0.1 + (i * 0.618033988749895) % 1 * 0.8);\n                const sparkleY = y + height * (0.1 + (i * 0.786151377757423) % 1 * 0.8);\n                \n                const twinkle = Math.sin(time * 4 + i * 1.1) * 0.5 + 0.5;\n                const sparkleSize = 2 + twinkle * 2;\n                \n                const hue = (time * 100 + i * 40) % 360;\n                \n                ctx.fillStyle = `hsla(${hue}, 70%, 85%, ${twinkle * 0.7})`;\n                ctx.beginPath();\n                ctx.arc(sparkleX, sparkleY, sparkleSize, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            ctx.restore();\n        }\n        \n        // ===== SAND FROSTING EFFECT (Beach Sand) =====\n        function drawSandFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // STRONG warm sandy glow overlay - VERY VISIBLE\n            const sandGradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.4,\n                0,\n                x + width * 0.5,\n                y + height * 0.4,\n                Math.max(width, height) * 0.8\n            );\n            \n            const shimmer = Math.sin(time * 1.5) * 0.5 + 0.5;\n            sandGradient.addColorStop(0, `rgba(255, 235, 180, ${shimmer * 0.5 + 0.3})`); // Much stronger\n            sandGradient.addColorStop(0.5, `rgba(240, 220, 170, ${shimmer * 0.35 + 0.25})`);\n            sandGradient.addColorStop(1, `rgba(220, 200, 150, ${shimmer * 0.15})`);\n            \n            ctx.fillStyle = sandGradient;\n            ctx.fillRect(x, y, width, height);\n            \n            // PROMINENT golden sand sparkles - VERY VISIBLE\n            const sparkleCount = 35;\n            for (let i = 0; i < sparkleCount; i++) {\n                const sparkleX = x + width * (0.1 + (i * 0.618033988749895) % 1 * 0.8);\n                const sparkleY = y + height * (0.1 + (i * 0.786151377757423) % 1 * 0.8);\n                \n                const glint = Math.sin(time * 3 + i * 0.9) * 0.5 + 0.5;\n                const sparkleSize = 3 + glint * 3.5; // LARGER sparkles\n                \n                // BRIGHT golden sparkle with strong glow\n                const sparkleGradient = ctx.createRadialGradient(sparkleX, sparkleY, 0, sparkleX, sparkleY, sparkleSize * 2.5);\n                sparkleGradient.addColorStop(0, `rgba(255, 245, 200, ${glint * 0.95})`); // Much brighter\n                sparkleGradient.addColorStop(0.5, `rgba(240, 220, 170, ${glint * 0.75})`);\n                sparkleGradient.addColorStop(1, `rgba(220, 200, 140, ${glint * 0.3})`);\n                \n                ctx.fillStyle = sparkleGradient;\n                ctx.beginPath();\n                ctx.arc(sparkleX, sparkleY, sparkleSize * 2.5, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // BRIGHT center - VERY VISIBLE\n                ctx.fillStyle = `rgba(255, 250, 220, ${glint * 0.98})`;\n                ctx.beginPath();\n                ctx.arc(sparkleX, sparkleY, sparkleSize * 0.5, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Add sparkle rays for extra visibility\n                if (glint > 0.7) {\n                    for (let j = 0; j < 4; j++) {\n                        const rayAngle = (j * Math.PI / 2) + time * 2;\n                        const rayLength = sparkleSize * 2;\n                        const rayX = sparkleX + Math.cos(rayAngle) * rayLength;\n                        const rayY = sparkleY + Math.sin(rayAngle) * rayLength;\n                        \n                        ctx.strokeStyle = `rgba(255, 240, 180, ${(glint - 0.7) * 2})`;\n                        ctx.lineWidth = 1.5;\n                        ctx.beginPath();\n                        ctx.moveTo(sparkleX, sparkleY);\n                        ctx.lineTo(rayX, rayY);\n                        ctx.stroke();\n                    }\n                }\n            }\n            \n            // VISIBLE drifting sand particles\n            const particleCount = 20;\n            for (let i = 0; i < particleCount; i++) {\n                const baseX = x + width * (0.15 + (i * 0.754877666) % 1 * 0.7);\n                const baseY = y + height * (0.15 + (i * 0.866025403) % 1 * 0.7);\n                \n                const drift = (time * 0.6 + i * 0.3) % 1;\n                const particleX = baseX + Math.sin(time * 1.8 + i * 0.8) * 12;\n                const particleY = baseY + Math.sin(drift * Math.PI) * 8;\n                \n                const particleAlpha = Math.sin(drift * Math.PI) * 0.65; // More visible\n                const particleSize = 3 + Math.sin(time * 2.5 + i) * 2; // Larger\n                \n                // Glowing sand particle\n                const particleGradient = ctx.createRadialGradient(particleX, particleY, 0, particleX, particleY, particleSize * 2);\n                particleGradient.addColorStop(0, `rgba(255, 240, 190, ${particleAlpha})`);\n                particleGradient.addColorStop(0.5, `rgba(240, 220, 170, ${particleAlpha * 0.7})`);\n                particleGradient.addColorStop(1, 'rgba(220, 200, 140, 0)');\n                \n                ctx.fillStyle = particleGradient;\n                ctx.beginPath();\n                ctx.arc(particleX, particleY, particleSize * 2, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Bright particle core\n                ctx.fillStyle = `rgba(255, 245, 200, ${particleAlpha * 0.9})`;\n                ctx.beginPath();\n                ctx.arc(particleX, particleY, particleSize * 0.4, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Add golden shimmer waves\n            const waveCount = 4;\n            for (let i = 0; i < waveCount; i++) {\n                const waveProgress = (time * 0.5 + i * 0.25) % 1;\n                const waveY = y + height * waveProgress;\n                \n                const waveAlpha = Math.sin(waveProgress * Math.PI) * 0.25;\n                \n                const waveGradient = ctx.createLinearGradient(x, waveY - 15, x, waveY + 15);\n                waveGradient.addColorStop(0, `rgba(255, 235, 180, 0)`);\n                waveGradient.addColorStop(0.5, `rgba(255, 240, 190, ${waveAlpha})`);\n                waveGradient.addColorStop(1, `rgba(255, 235, 180, 0)`);\n                \n                ctx.fillStyle = waveGradient;\n                ctx.fillRect(x, waveY - 15, width, 30);\n            }\n            \n            ctx.restore();\n        }\n        \n        // ===== DRAW ANIMATED FROSTING EFFECTS =====\n        function drawAnimatedFrostingEffect(colorName, x, y, width, height, time) {\n            // All frostings now use the sparkle effect\n            drawSparkleFrostingEffect(x, y, width, height, time);\n        }\n        \n        // ===== SPARKLE FROSTING EFFECT =====\n        function drawSparkleFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Create 15-20 twinkling sparkle points\n            const sparkleCount = 18;\n            \n            for (let i = 0; i < sparkleCount; i++) {\n                // Use deterministic random positions based on index\n                const sparkleX = x + width * (0.15 + (i * 0.618033988749895) % 1 * 0.7);\n                const sparkleY = y + height * (0.15 + (i * 0.786151377757423) % 1 * 0.7);\n                \n                // Staggered twinkling animation\n                const phase = (time * 3 + i * 0.5) % 2;\n                const brightness = phase < 1 ? phase : 2 - phase;\n                \n                // Draw sparkle star\n                const sparkleSize = 3 + brightness * 4;\n                \n                ctx.fillStyle = `rgba(255, 255, 255, ${brightness * 0.9})`;\n                ctx.beginPath();\n                for (let j = 0; j < 4; j++) {\n                    const angle = (j * Math.PI / 2) + time * 2;\n                    const pointX = sparkleX + Math.cos(angle) * sparkleSize;\n                    const pointY = sparkleY + Math.sin(angle) * sparkleSize;\n                    if (j === 0) ctx.moveTo(pointX, pointY);\n                    else ctx.lineTo(pointX, pointY);\n                }\n                ctx.closePath();\n                ctx.fill();\n                \n                // Glow\n                const gradient = ctx.createRadialGradient(sparkleX, sparkleY, 0, sparkleX, sparkleY, sparkleSize * 2);\n                gradient.addColorStop(0, `rgba(255, 240, 200, ${brightness * 0.5})`);\n                gradient.addColorStop(1, 'rgba(255, 240, 200, 0)');\n                ctx.fillStyle = gradient;\n                ctx.fillRect(sparkleX - sparkleSize * 2, sparkleY - sparkleSize * 2, sparkleSize * 4, sparkleSize * 4);\n            }\n            \n            ctx.restore();\n        }\n        \n        // ===== GALAXY FROSTING EFFECT =====\n        function drawGalaxyFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            \n            // Draw many galaxy stars scattered across the entire cake tier\n            const starCount = 50;\n            \n            for (let i = 0; i < starCount; i++) {\n                // Deterministic random positions covering the whole tier\n                const starX = x + width * (0.05 + (i * 0.618033988749895) % 1 * 0.9);\n                const starY = y + height * (0.05 + (i * 0.786151377757423) % 1 * 0.9);\n                \n                // Staggered twinkling\n                const pulse = Math.sin(time * 3 + i * 0.4) * 0.5 + 0.5;\n                const starSize = 1 + pulse * 2.5;\n                \n                // Vary star colors for galaxy effect - more variety\n                const colorVariant = i % 5;\n                const colors = [\n                    `rgba(150, 100, 255, ${0.7 + pulse * 0.3})`,\n                    `rgba(100, 150, 255, ${0.7 + pulse * 0.3})`,\n                    `rgba(200, 150, 255, ${0.6 + pulse * 0.4})`,\n                    `rgba(100, 200, 255, ${0.6 + pulse * 0.4})`,\n                    `rgba(180, 130, 255, ${0.65 + pulse * 0.35})`\n                ];\n                \n                // Draw star\n                ctx.fillStyle = colors[colorVariant];\n                ctx.beginPath();\n                ctx.arc(starX, starY, starSize, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Star glow\n                const glowGradient = ctx.createRadialGradient(starX, starY, 0, starX, starY, starSize * 4);\n                glowGradient.addColorStop(0, colors[colorVariant].replace(/[\\d.]+\\)/, '0.5)'));\n                glowGradient.addColorStop(0.5, colors[colorVariant].replace(/[\\d.]+\\)/, '0.2)'));\n                glowGradient.addColorStop(1, colors[colorVariant].replace(/[\\d.]+\\)/, '0)'));\n                ctx.fillStyle = glowGradient;\n                ctx.beginPath();\n                ctx.arc(starX, starY, starSize * 4, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Add subtle nebula overlay\n            ctx.globalCompositeOperation = 'screen';\n            const gradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.5,\n                0,\n                x + width * 0.5,\n                y + height * 0.5,\n                Math.max(width, height) * 0.6\n            );\n            \n            const nebulaAlpha = 0.12 + Math.sin(time * 1.5) * 0.04;\n            gradient.addColorStop(0, `rgba(120, 80, 200, ${nebulaAlpha})`);\n            gradient.addColorStop(0.5, `rgba(150, 120, 255, ${nebulaAlpha * 0.6})`);\n            gradient.addColorStop(1, 'rgba(180, 140, 255, 0)');\n            \n            ctx.fillStyle = gradient;\n            ctx.fillRect(x, y, width, height);\n            \n            ctx.restore();\n        }\n        \n        // ===== AURORA FROSTING EFFECT =====\n        function drawAuroraFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            \n            // Clip to the frosting boundaries\n            ctx.beginPath();\n            ctx.rect(x, y, width, height);\n            ctx.clip();\n            \n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw SOFTER vertical light beams shooting upward (aurora style)\n            const beamCount = 8;\n            const beamSpacing = width / beamCount;\n            \n            for (let i = 0; i < beamCount; i++) {\n                const beamX = x + (i + 0.5) * beamSpacing;\n                const beamPhase = (time * 0.5 + i * 0.3) % (Math.PI * 2); // SLOWER animation\n                \n                // GENTLER beam intensity pulses\n                const intensity = Math.sin(beamPhase) * 0.3 + 0.4; // Reduced range\n                const beamWidth = 18 + Math.sin(time * 1.2 + i) * 6; // Wider, gentler movement\n                \n                // LIGHTER, PASTEL color shifts through aurora spectrum\n                const hueBase = 170 + i * 20; // Softer cyan to lavender range\n                const hueShift = Math.sin(time * 1 + i * 0.6) * 20; // Gentler shifts\n                const hue = hueBase + hueShift;\n                \n                // Draw vertical light beam with LIGHTER colors\n                const beamGradient = ctx.createLinearGradient(beamX, y + height, beamX, y);\n                beamGradient.addColorStop(0, `hsla(${hue}, 60%, 85%, 0)`); // Much lighter\n                beamGradient.addColorStop(0.3, `hsla(${hue}, 65%, 88%, ${intensity * 0.2})`); // Reduced opacity\n                beamGradient.addColorStop(0.7, `hsla(${hue}, 70%, 92%, ${intensity * 0.35})`); // Pastel\n                beamGradient.addColorStop(1, `hsla(${hue}, 75%, 95%, ${intensity * 0.15})`); // Very light top\n                \n                ctx.fillStyle = beamGradient;\n                ctx.fillRect(beamX - beamWidth / 2, y, beamWidth, height);\n                \n                // Add SOFT bright core to beam\n                const coreGradient = ctx.createLinearGradient(beamX, y + height, beamX, y);\n                coreGradient.addColorStop(0, `hsla(${hue}, 70%, 92%, 0)`);\n                coreGradient.addColorStop(0.5, `hsla(${hue}, 75%, 95%, ${intensity * 0.25})`); // Softer core\n                coreGradient.addColorStop(1, `hsla(${hue}, 80%, 97%, ${intensity * 0.1})`); // Very gentle\n                \n                ctx.fillStyle = coreGradient;\n                ctx.fillRect(beamX - beamWidth / 4, y, beamWidth / 2, height);\n            }\n            \n            // Draw GENTLE floating aurora sparkles/particles\n            const particleCount = 25; // Slightly fewer\n            \n            for (let i = 0; i < particleCount; i++) {\n                // Deterministic positions\n                const baseX = x + width * (0.1 + (i * 0.618033988749895) % 1 * 0.8);\n                const baseY = y + height * (0.1 + (i * 0.786151377757423) % 1 * 0.8);\n                \n                // SLOWER, gentler floating animation\n                const floatProgress = (time * 0.4 + i * 0.25) % 1; // Slower\n                const particleY = baseY - floatProgress * height * 0.3; // Less distance\n                const particleX = baseX + Math.sin(time * 1.5 + i * 0.6) * 10; // Gentler sway\n                \n                // Skip if particle has floated out of bounds\n                if (particleY < y - 10) continue;\n                \n                const particleAlpha = (1 - floatProgress) * 0.5; // Much more transparent\n                const particleSize = 2 + (1 - floatProgress) * 2.5;\n                \n                // PASTEL color shifts for variety\n                const particleHue = 175 + (i * 25) % 70; // Softer range\n                \n                // Particle glow with LIGHTER colors\n                const particleGradient = ctx.createRadialGradient(\n                    particleX, particleY, 0,\n                    particleX, particleY, particleSize * 2\n                );\n                particleGradient.addColorStop(0, `hsla(${particleHue}, 70%, 92%, ${particleAlpha})`);\n                particleGradient.addColorStop(0.5, `hsla(${particleHue}, 65%, 88%, ${particleAlpha * 0.5})`);\n                particleGradient.addColorStop(1, `hsla(${particleHue}, 60%, 85%, 0)`);\n                \n                ctx.fillStyle = particleGradient;\n                ctx.beginPath();\n                ctx.arc(particleX, particleY, particleSize * 2, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // SOFT bright core\n                ctx.fillStyle = `hsla(${particleHue}, 75%, 97%, ${particleAlpha * 0.7})`;\n                ctx.beginPath();\n                ctx.arc(particleX, particleY, particleSize * 0.4, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Add DELICATE shimmering stars scattered throughout\n            const starCount = 18; // Slightly fewer\n            \n            for (let i = 0; i < starCount; i++) {\n                const starX = x + width * (0.1 + (i * 0.754877666) % 1 * 0.8);\n                const starY = y + height * (0.1 + (i * 0.866025403) % 1 * 0.8);\n                \n                const twinkle = Math.sin(time * 3.5 + i * 1) * 0.4 + 0.5; // Gentler twinkle\n                const starSize = 1.2 + twinkle * 1.8;\n                \n                // Star with PASTEL color\n                const starHue = 185 + (i * 18) % 50; // Softer range\n                ctx.fillStyle = `hsla(${starHue}, 65%, 93%, ${twinkle * 0.6})`; // Much lighter\n                ctx.beginPath();\n                ctx.arc(starX, starY, starSize, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Star cross points - SOFTER\n                const crossSize = starSize * 1.3;\n                ctx.fillStyle = `hsla(${starHue}, 70%, 96%, ${twinkle * 0.45})`;\n                ctx.fillRect(starX - crossSize, starY - 0.5, crossSize * 2, 1);\n                ctx.fillRect(starX - 0.5, starY - crossSize, 1, crossSize * 2);\n            }\n            \n            // ETHEREAL ambient glow overlay\n            const ambientGradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.5,\n                0,\n                x + width * 0.5,\n                y + height * 0.5,\n                Math.max(width, height) * 0.8\n            );\n            \n            const ambientPulse = Math.sin(time * 0.9) * 0.4 + 0.5; // Slower, gentler pulse\n            const ambientAlpha = 0.08 + ambientPulse * 0.05; // Much more subtle\n            ambientGradient.addColorStop(0, `hsla(190, 70%, 88%, ${ambientAlpha})`); // Soft pastel\n            ambientGradient.addColorStop(0.5, `hsla(200, 65%, 90%, ${ambientAlpha * 0.6})`);\n            ambientGradient.addColorStop(1, 'hsla(210, 60%, 92%, 0)');\n            \n            ctx.fillStyle = ambientGradient;\n            ctx.fillRect(x, y, width, height);\n            \n            ctx.restore();\n        }\n        \n        // ===== PURPLE MYSTIC FROSTING EFFECT =====\n        function drawPurpleFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw floating mystic energy orbs scattered across the tier\n            const orbCount = 20;\n            \n            for (let i = 0; i < orbCount; i++) {\n                // Deterministic random positions\n                const orbX = x + width * (0.1 + (i * 0.618033988749895) % 1 * 0.8);\n                const orbY = y + height * (0.1 + (i * 0.786151377757423) % 1 * 0.8);\n                \n                // Individual orb floating with staggered timing\n                const floatOffset = Math.sin(time * 1.5 + i * 0.6) * 8;\n                const pulse = Math.sin(time * 3 + i * 0.9) * 0.5 + 0.5;\n                \n                const drawY = orbY + floatOffset;\n                const orbSize = 3 + pulse * 4;\n                \n                // Mystical purple orb with gradient\n                const orbGradient = ctx.createRadialGradient(drawY, drawY, 0, orbX, drawY, orbSize * 2.5);\n                orbGradient.addColorStop(0, `rgba(200, 100, 255, ${pulse * 0.9})`);\n                orbGradient.addColorStop(0.4, `rgba(150, 50, 255, ${pulse * 0.7})`);\n                orbGradient.addColorStop(0.7, `rgba(120, 30, 200, ${pulse * 0.5})`);\n                orbGradient.addColorStop(1, 'rgba(80, 0, 150, 0)');\n                \n                ctx.fillStyle = orbGradient;\n                ctx.beginPath();\n                ctx.arc(orbX, drawY, orbSize * 2.5, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Bright mystical core\n                ctx.fillStyle = `rgba(220, 180, 255, ${pulse * 0.8})`;\n                ctx.beginPath();\n                ctx.arc(orbX, drawY, orbSize * 0.5, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Magic sparkles around orbs\n                const sparkleCount = 3;\n                for (let j = 0; j < sparkleCount; j++) {\n                    const angle = (time * 2 + i * 0.5 + j * (Math.PI * 2 / sparkleCount)) % (Math.PI * 2);\n                    const distance = orbSize * 3 + pulse * 3;\n                    const sparkleX = orbX + Math.cos(angle) * distance;\n                    const sparkleY = drawY + Math.sin(angle) * distance;\n                    \n                    const sparklePulse = Math.sin(time * 5 + i * 0.8 + j) * 0.5 + 0.5;\n                    \n                    ctx.fillStyle = `rgba(200, 150, 255, ${sparklePulse * pulse * 0.6})`;\n                    ctx.beginPath();\n                    ctx.arc(sparkleX, sparkleY, 1.5, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n            \n            // Add mystical energy waves\n            ctx.globalAlpha = 0.15;\n            const gradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.5,\n                0,\n                x + width * 0.5,\n                y + height * 0.5,\n                Math.max(width, height) * 0.7\n            );\n            \n            const waveAlpha = 0.15 + Math.sin(time * 1.2) * 0.05;\n            gradient.addColorStop(0, `rgba(180, 100, 255, ${waveAlpha})`);\n            gradient.addColorStop(0.6, `rgba(150, 80, 220, ${waveAlpha * 0.6})`);\n            gradient.addColorStop(1, 'rgba(120, 60, 180, 0)');\n            \n            ctx.fillStyle = gradient;\n            ctx.fillRect(x, y, width, height);\n            \n            ctx.restore();\n        }\n        \n        // ===== MINT ICE FROSTING EFFECT =====\n        function drawMintFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw icy crystalline sparkles across the tier\n            const crystalCount = 25;\n            \n            for (let i = 0; i < crystalCount; i++) {\n                // Deterministic random positions\n                const crystalX = x + width * (0.08 + (i * 0.618033988749895) % 1 * 0.84);\n                const crystalY = y + height * (0.08 + (i * 0.786151377757423) % 1 * 0.84);\n                \n                // Individual crystal twinkling with staggered timing\n                const twinkle = Math.sin(time * 4 + i * 0.7) * 0.5 + 0.5;\n                const crystalSize = 2 + twinkle * 3;\n                \n                // Draw diamond/crystal shape\n                ctx.save();\n                ctx.translate(crystalX, crystalY);\n                ctx.rotate(time * 0.5 + i * 0.3);\n                \n                // Outer icy glow\n                const glowGradient = ctx.createRadialGradient(0, 0, 0, 0, 0, crystalSize * 3);\n                glowGradient.addColorStop(0, `rgba(200, 255, 255, ${twinkle * 0.7})`);\n                glowGradient.addColorStop(0.5, `rgba(150, 240, 240, ${twinkle * 0.4})`);\n                glowGradient.addColorStop(1, 'rgba(100, 220, 220, 0)');\n                \n                ctx.fillStyle = glowGradient;\n                ctx.beginPath();\n                ctx.arc(0, 0, crystalSize * 3, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Crystal diamond shape\n                ctx.fillStyle = `rgba(220, 255, 255, ${twinkle * 0.9})`;\n                ctx.beginPath();\n                ctx.moveTo(0, -crystalSize);\n                ctx.lineTo(crystalSize * 0.6, 0);\n                ctx.lineTo(0, crystalSize);\n                ctx.lineTo(-crystalSize * 0.6, 0);\n                ctx.closePath();\n                ctx.fill();\n                \n                // Bright core\n                ctx.fillStyle = `rgba(255, 255, 255, ${twinkle * 0.95})`;\n                ctx.beginPath();\n                ctx.arc(0, 0, crystalSize * 0.3, 0, Math.PI * 2);\n                ctx.fill();\n                \n                ctx.restore();\n                \n                // Add star points for extra sparkle\n                for (let j = 0; j < 4; j++) {\n                    const angle = (j * Math.PI / 2) + time * 2 + i * 0.5;\n                    const pointX = crystalX + Math.cos(angle) * crystalSize * 2;\n                    const pointY = crystalY + Math.sin(angle) * crystalSize * 2;\n                    \n                    ctx.fillStyle = `rgba(200, 255, 255, ${twinkle * 0.6})`;\n                    ctx.fillRect(pointX - 1, pointY - 1, 2, 2);\n                }\n            }\n            \n            // Add frosty overlay shimmer\n            const gradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.4,\n                0,\n                x + width * 0.5,\n                y + height * 0.4,\n                Math.max(width, height) * 0.6\n            );\n            \n            const shimmerAlpha = 0.12 + Math.sin(time * 1.8) * 0.05;\n            gradient.addColorStop(0, `rgba(230, 255, 255, ${shimmerAlpha})`);\n            gradient.addColorStop(0.5, `rgba(200, 245, 245, ${shimmerAlpha * 0.6})`);\n            gradient.addColorStop(1, 'rgba(180, 235, 235, 0)');\n            \n            ctx.fillStyle = gradient;\n            ctx.fillRect(x, y, width, height);\n            \n            ctx.restore();\n        }\n        \n        // ===== WHITE FROSTING EFFECT (Falling Snow) =====\n        function drawWhiteFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw gently falling snowflakes across the tier\n            const snowflakeCount = 20;\n            \n            for (let i = 0; i < snowflakeCount; i++) {\n                // Deterministic positions\n                const baseX = x + width * (0.1 + (i * 0.618033988749895) % 1 * 0.8);\n                const baseY = y + height * (0.1 + (i * 0.786151377757423) % 1 * 0.8);\n                \n                // Gentle falling animation\n                const fallProgress = (time * 0.3 + i * 0.2) % 1;\n                const snowX = baseX + Math.sin(time * 1.5 + i * 0.7) * 6;\n                const snowY = baseY + fallProgress * 15 - 7.5;\n                \n                const snowAlpha = Math.sin(fallProgress * Math.PI) * 0.7;\n                const snowSize = 2 + Math.sin(time * 3 + i) * 1;\n                \n                // Draw snowflake\n                ctx.fillStyle = `rgba(255, 255, 255, ${snowAlpha})`;\n                ctx.beginPath();\n                \n                // Simple 6-point snowflake\n                for (let j = 0; j < 6; j++) {\n                    const angle = (j * Math.PI / 3) + time + i;\n                    const px = snowX + Math.cos(angle) * snowSize;\n                    const py = snowY + Math.sin(angle) * snowSize;\n                    if (j === 0) ctx.moveTo(px, py);\n                    else ctx.lineTo(px, py);\n                }\n                ctx.closePath();\n                ctx.fill();\n                \n                // Center dot\n                ctx.fillStyle = `rgba(255, 255, 255, ${snowAlpha * 0.9})`;\n                ctx.beginPath();\n                ctx.arc(snowX, snowY, snowSize * 0.4, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Add soft sparkles\n            const sparkleCount = 12;\n            for (let i = 0; i < sparkleCount; i++) {\n                const sparkleX = x + width * (0.15 + (i * 0.754877666) % 1 * 0.7);\n                const sparkleY = y + height * (0.15 + (i * 0.866025403) % 1 * 0.7);\n                \n                const twinkle = Math.sin(time * 2.5 + i * 0.8) * 0.5 + 0.5;\n                const sparkleSize = 1.5 + twinkle * 2;\n                \n                ctx.fillStyle = `rgba(255, 255, 255, ${twinkle * 0.6})`;\n                ctx.beginPath();\n                ctx.arc(sparkleX, sparkleY, sparkleSize, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Gentle overall glow\n            const glowGradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.4,\n                0,\n                x + width * 0.5,\n                y + height * 0.4,\n                Math.max(width, height) * 0.6\n            );\n            \n            const glowAlpha = 0.1 + Math.sin(time * 1.2) * 0.04;\n            glowGradient.addColorStop(0, `rgba(255, 255, 255, ${glowAlpha})`);\n            glowGradient.addColorStop(0.6, `rgba(245, 250, 255, ${glowAlpha * 0.6})`);\n            glowGradient.addColorStop(1, 'rgba(235, 245, 255, 0)');\n            \n            ctx.fillStyle = glowGradient;\n            ctx.fillRect(x, y, width, height);\n            \n            ctx.restore();\n        }\n        \n        // ===== SILVER FROSTING EFFECT (Icy Blue with Icicles) =====\n        function drawSilverFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Add STRONG icy blue veil overlay - VERY VISIBLE\n            const iceVeilGradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.3,\n                0,\n                x + width * 0.5,\n                y + height * 0.3,\n                Math.max(width, height) * 0.8\n            );\n            \n            const veilPulse = Math.sin(time * 1.5) * 0.5 + 0.5;\n            const veilAlpha = 0.35 + veilPulse * 0.15; // STRONG visibility\n            iceVeilGradient.addColorStop(0, `rgba(180, 220, 255, ${veilAlpha})`);\n            iceVeilGradient.addColorStop(0.4, `rgba(150, 200, 255, ${veilAlpha * 0.8})`);\n            iceVeilGradient.addColorStop(0.7, `rgba(120, 180, 240, ${veilAlpha * 0.5})`);\n            iceVeilGradient.addColorStop(1, 'rgba(100, 160, 220, 0)');\n            \n            ctx.fillStyle = iceVeilGradient;\n            ctx.fillRect(x, y, width, height);\n            \n            // Draw DRAMATIC BLUE PHYSICAL ICICLES - MAXIMUM VISIBILITY\n            const icicleCount = 18; // More icicles\n            \n            for (let i = 0; i < icicleCount; i++) {\n                const icicleX = x + width * (0.05 + (i * 0.754877666) % 1 * 0.9);\n                const icicleTopY = y + height * (0.05 + (i * 0.4) % 0.25); // Near top of tier\n                \n                // Icicle length varies significantly\n                const baseLength = 20 + (i % 4) * 10;\n                const pulse = Math.sin(time * 2 + i * 0.7) * 0.5 + 0.5;\n                const icicleLength = baseLength + pulse * 8;\n                \n                // Icicle width varies\n                const icicleWidth = 5 + (i % 3) * 2.5;\n                \n                ctx.save();\n                ctx.translate(icicleX, icicleTopY);\n                \n                // VIBRANT BLUE icicle gradient - MAXIMUM VISIBILITY\n                const icicleGradient = ctx.createLinearGradient(0, 0, 0, icicleLength);\n                icicleGradient.addColorStop(0, `rgba(120, 180, 255, 0.98)`); // Very opaque bright blue\n                icicleGradient.addColorStop(0.3, `rgba(100, 160, 240, 0.95)`);\n                icicleGradient.addColorStop(0.6, `rgba(130, 190, 255, 0.9)`);\n                icicleGradient.addColorStop(1, `rgba(160, 210, 255, 0.85)`); // Bright tip\n                \n                // Draw icicle body - SOLID SHAPE\n                ctx.fillStyle = icicleGradient;\n                ctx.beginPath();\n                ctx.moveTo(0, 0); // Top center\n                ctx.lineTo(-icicleWidth / 2, icicleLength * 0.25); // Left side\n                ctx.lineTo(-icicleWidth / 3, icicleLength * 0.6); // Taper\n                ctx.lineTo(0, icicleLength); // Bottom point\n                ctx.lineTo(icicleWidth / 3, icicleLength * 0.6); // Taper\n                ctx.lineTo(icicleWidth / 2, icicleLength * 0.25); // Right side\n                ctx.closePath();\n                ctx.fill();\n                \n                // Add BRILLIANT white highlight on left edge - VERY VISIBLE\n                ctx.strokeStyle = `rgba(255, 255, 255, ${pulse * 0.95})`;\n                ctx.lineWidth = 2.5;\n                ctx.beginPath();\n                ctx.moveTo(-icicleWidth / 4, 3);\n                ctx.lineTo(-icicleWidth / 3.5, icicleLength * 0.3);\n                ctx.lineTo(-icicleWidth / 4.5, icicleLength * 0.6);\n                ctx.lineTo(-icicleWidth / 5, icicleLength * 0.85);\n                ctx.stroke();\n                \n                // POWERFUL icicle glow - VERY VISIBLE\n                const glowGradient = ctx.createRadialGradient(0, icicleLength / 2, 0, 0, icicleLength / 2, icicleWidth * 3.5);\n                glowGradient.addColorStop(0, `rgba(120, 180, 255, ${pulse * 0.7})`);\n                glowGradient.addColorStop(0.4, `rgba(100, 160, 240, ${pulse * 0.5})`);\n                glowGradient.addColorStop(1, 'rgba(120, 180, 255, 0)');\n                \n                ctx.fillStyle = glowGradient;\n                ctx.beginPath();\n                ctx.ellipse(0, icicleLength / 2, icicleWidth * 3.5, icicleLength / 1.3, 0, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Add BRILLIANT sparkle at tip\n                const tipSparkle = Math.sin(time * 4 + i * 1.2) * 0.5 + 0.5;\n                if (tipSparkle > 0.5) {\n                    ctx.fillStyle = `rgba(180, 220, 255, ${tipSparkle * 0.95})`;\n                    ctx.beginPath();\n                    ctx.arc(0, icicleLength, 3, 0, Math.PI * 2);\n                    ctx.fill();\n                    \n                    // Sparkle rays\n                    for (let j = 0; j < 4; j++) {\n                        const rayAngle = (j * Math.PI / 2) + time * 3;\n                        const rayLength = 6;\n                        const rayX = Math.cos(rayAngle) * rayLength;\n                        const rayY = Math.sin(rayAngle) * rayLength;\n                        \n                        ctx.strokeStyle = `rgba(200, 230, 255, ${tipSparkle * 0.85})`;\n                        ctx.lineWidth = 1.5;\n                        ctx.beginPath();\n                        ctx.moveTo(0, icicleLength);\n                        ctx.lineTo(rayX, icicleLength + rayY);\n                        ctx.stroke();\n                    }\n                }\n                \n                ctx.restore();\n            }\n            \n            // Draw VISIBLE BLUE hexagonal ice crystals\n            const crystalCount = 20;\n            \n            for (let i = 0; i < crystalCount; i++) {\n                const crystalX = x + width * (0.1 + (i * 0.618033988749895) % 1 * 0.8);\n                const crystalY = y + height * (0.1 + (i * 0.786151377757423) % 1 * 0.8);\n                \n                const crystalPulse = Math.sin(time * 3 + i * 0.8) * 0.5 + 0.5;\n                const crystalSize = 5 + crystalPulse * 4;\n                \n                ctx.save();\n                ctx.translate(crystalX, crystalY);\n                ctx.rotate(time * 0.5 + i * 0.4);\n                \n                // STRONG blue crystal glow\n                const crystalGlow = ctx.createRadialGradient(0, 0, 0, 0, 0, crystalSize * 3);\n                crystalGlow.addColorStop(0, `rgba(150, 200, 255, ${crystalPulse * 0.7})`);\n                crystalGlow.addColorStop(0.5, `rgba(120, 180, 240, ${crystalPulse * 0.5})`);\n                crystalGlow.addColorStop(1, 'rgba(100, 160, 220, 0)');\n                \n                ctx.fillStyle = crystalGlow;\n                ctx.beginPath();\n                ctx.arc(0, 0, crystalSize * 3, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Hexagon shape - BRIGHT BLUE\n                ctx.fillStyle = `rgba(180, 220, 255, ${crystalPulse * 0.85})`;\n                ctx.strokeStyle = `rgba(150, 200, 255, ${crystalPulse * 0.75})`;\n                ctx.lineWidth = 2;\n                ctx.beginPath();\n                for (let j = 0; j < 6; j++) {\n                    const angle = (j * Math.PI / 3);\n                    const px = Math.cos(angle) * crystalSize;\n                    const py = Math.sin(angle) * crystalSize;\n                    if (j === 0) ctx.moveTo(px, py);\n                    else ctx.lineTo(px, py);\n                }\n                ctx.closePath();\n                ctx.fill();\n                ctx.stroke();\n                \n                // Inner hexagon for depth - BRIGHT\n                ctx.fillStyle = `rgba(220, 240, 255, ${crystalPulse * 0.9})`;\n                ctx.beginPath();\n                for (let j = 0; j < 6; j++) {\n                    const angle = (j * Math.PI / 3);\n                    const px = Math.cos(angle) * crystalSize * 0.5;\n                    const py = Math.sin(angle) * crystalSize * 0.5;\n                    if (j === 0) ctx.moveTo(px, py);\n                    else ctx.lineTo(px, py);\n                }\n                ctx.closePath();\n                ctx.fill();\n                \n                ctx.restore();\n            }\n            \n            // Draw VISIBLE BLUE frosted ice patterns\n            const frostLineCount = 15;\n            for (let i = 0; i < frostLineCount; i++) {\n                const startX = x + width * (0.15 + (i * 0.754877666) % 1 * 0.7);\n                const startY = y + height * (0.15 + (i * 0.866025403) % 1 * 0.7);\n                \n                const angle = (i * Math.PI / 4) + time * 0.3;\n                const length = 15 + Math.sin(time * 2 + i) * 7;\n                const endX = startX + Math.cos(angle) * length;\n                const endY = startY + Math.sin(angle) * length;\n                \n                const frostAlpha = (Math.sin(time * 1.8 + i * 0.7) * 0.5 + 0.5) * 0.65;\n                \n                ctx.strokeStyle = `rgba(150, 200, 255, ${frostAlpha})`;\n                ctx.lineWidth = 2;\n                ctx.beginPath();\n                ctx.moveTo(startX, startY);\n                ctx.lineTo(endX, endY);\n                ctx.stroke();\n                \n                // Add branch lines - BLUE\n                const branchLength = length * 0.4;\n                const branch1X = startX + Math.cos(angle) * length * 0.5;\n                const branch1Y = startY + Math.sin(angle) * length * 0.5;\n                \n                ctx.beginPath();\n                ctx.moveTo(branch1X, branch1Y);\n                ctx.lineTo(branch1X + Math.cos(angle + Math.PI / 4) * branchLength, branch1Y + Math.sin(angle + Math.PI / 4) * branchLength);\n                ctx.stroke();\n                \n                ctx.beginPath();\n                ctx.moveTo(branch1X, branch1Y);\n                ctx.lineTo(branch1X + Math.cos(angle - Math.PI / 4) * branchLength, branch1Y + Math.sin(angle - Math.PI / 4) * branchLength);\n                ctx.stroke();\n            }\n            \n            // VISIBLE blue shimmer overlay\n            const shimmerGradient = ctx.createLinearGradient(\n                x,\n                y,\n                x + width,\n                y + height\n            );\n            \n            const shimmerPhase = (time * 0.8) % 2;\n            const shimmerAlpha = Math.sin(shimmerPhase * Math.PI) * 0.2;\n            \n            shimmerGradient.addColorStop(0, `rgba(180, 220, 255, ${shimmerAlpha})`);\n            shimmerGradient.addColorStop(0.5, `rgba(150, 200, 255, ${shimmerAlpha * 1.3})`);\n            shimmerGradient.addColorStop(1, `rgba(120, 180, 240, ${shimmerAlpha * 0.9})`);\n            \n            ctx.fillStyle = shimmerGradient;\n            ctx.fillRect(x, y, width, height);\n            \n            ctx.restore();\n        }\n        \n        // ===== TURQUOISE FROSTING EFFECT (Glacial Ice) =====\n        function drawTurquoiseFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw crystalline ice structures\n            const crystalCount = 12;\n            \n            for (let i = 0; i < crystalCount; i++) {\n                const crystalX = x + width * (0.12 + (i * 0.618033988749895) % 1 * 0.76);\n                const crystalY = y + height * (0.12 + (i * 0.786151377757423) % 1 * 0.76);\n                \n                const pulse = Math.sin(time * 2 + i * 0.7) * 0.5 + 0.5;\n                const crystalSize = 8 + pulse * 4;\n                \n                // Draw hexagonal crystal\n                ctx.save();\n                ctx.translate(crystalX, crystalY);\n                ctx.rotate(time * 0.3 + i * 0.5);\n                \n                // Outer glow\n                const glowGradient = ctx.createRadialGradient(0, 0, 0, 0, 0, crystalSize * 2);\n                glowGradient.addColorStop(0, `rgba(100, 230, 240, ${pulse * 0.6})`);\n                glowGradient.addColorStop(0.5, `rgba(64, 224, 235, ${pulse * 0.4})`);\n                glowGradient.addColorStop(1, 'rgba(40, 200, 220, 0)');\n                \n                ctx.fillStyle = glowGradient;\n                ctx.beginPath();\n                ctx.arc(0, 0, crystalSize * 2, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Hexagon crystal shape\n                ctx.fillStyle = `rgba(150, 240, 245, ${pulse * 0.7})`;\n                ctx.beginPath();\n                for (let j = 0; j < 6; j++) {\n                    const angle = (j * Math.PI / 3);\n                    const px = Math.cos(angle) * crystalSize;\n                    const py = Math.sin(angle) * crystalSize;\n                    if (j === 0) ctx.moveTo(px, py);\n                    else ctx.lineTo(px, py);\n                }\n                ctx.closePath();\n                ctx.fill();\n                \n                // Inner highlight\n                ctx.fillStyle = `rgba(200, 255, 255, ${pulse * 0.8})`;\n                ctx.beginPath();\n                for (let j = 0; j < 6; j++) {\n                    const angle = (j * Math.PI / 3);\n                    const px = Math.cos(angle) * crystalSize * 0.5;\n                    const py = Math.sin(angle) * crystalSize * 0.5;\n                    if (j === 0) ctx.moveTo(px, py);\n                    else ctx.lineTo(px, py);\n                }\n                ctx.closePath();\n                ctx.fill();\n                \n                ctx.restore();\n            }\n            \n            // Icy crack lines\n            const crackCount = 8;\n            \n            for (let i = 0; i < crackCount; i++) {\n                const startX = x + width * (0.2 + (i * 0.754877666) % 1 * 0.6);\n                const startY = y + height * (0.2 + (i * 0.866025403) % 1 * 0.6);\n                \n                const angle = (i * Math.PI / 4) + time * 0.2;\n                const length = 15 + Math.sin(time * 2 + i) * 5;\n                const endX = startX + Math.cos(angle) * length;\n                const endY = startY + Math.sin(angle) * length;\n                \n                const crackAlpha = (Math.sin(time * 1.5 + i * 0.6) * 0.5 + 0.5) * 0.4;\n                \n                ctx.strokeStyle = `rgba(180, 245, 250, ${crackAlpha})`;\n                ctx.lineWidth = 1.5;\n                ctx.beginPath();\n                ctx.moveTo(startX, startY);\n                ctx.lineTo(endX, endY);\n                ctx.stroke();\n            }\n            \n            // Glacial shimmer overlay\n            const shimmerGradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.4,\n                0,\n                x + width * 0.5,\n                y + height * 0.4,\n                Math.max(width, height) * 0.7\n            );\n            \n            const shimmerAlpha = 0.12 + Math.sin(time * 1.3) * 0.05;\n            shimmerGradient.addColorStop(0, `rgba(150, 240, 245, ${shimmerAlpha})`);\n            shimmerGradient.addColorStop(0.6, `rgba(100, 224, 235, ${shimmerAlpha * 0.6})`);\n            shimmerGradient.addColorStop(1, 'rgba(64, 200, 220, 0)');\n            \n            ctx.fillStyle = shimmerGradient;\n            ctx.fillRect(x, y, width, height);\n            \n            ctx.restore();\n        }\n        \n        // ===== LAVENDER FROSTING EFFECT (Twilight Stars) =====\n        function drawLavenderFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw dreamy twinkling stars\n            const starCount = 20;\n            \n            for (let i = 0; i < starCount; i++) {\n                const starX = x + width * (0.1 + (i * 0.618033988749895) % 1 * 0.8);\n                const starY = y + height * (0.1 + (i * 0.786151377757423) % 1 * 0.8);\n                \n                const twinkle = Math.sin(time * 3 + i * 0.8) * 0.5 + 0.5;\n                const starSize = 2 + twinkle * 3;\n                \n                // Star with soft lavender glow\n                const starGradient = ctx.createRadialGradient(starX, starY, 0, starX, starY, starSize * 3);\n                starGradient.addColorStop(0, `rgba(230, 200, 255, ${twinkle * 0.8})`);\n                starGradient.addColorStop(0.4, `rgba(200, 160, 240, ${twinkle * 0.6})`);\n                starGradient.addColorStop(1, 'rgba(180, 140, 220, 0)');\n                \n                ctx.fillStyle = starGradient;\n                ctx.beginPath();\n                ctx.arc(starX, starY, starSize * 3, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Bright star center\n                ctx.fillStyle = `rgba(255, 240, 255, ${twinkle * 0.9})`;\n                ctx.beginPath();\n                ctx.arc(starX, starY, starSize * 0.5, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Star points\n                for (let j = 0; j < 4; j++) {\n                    const pointAngle = (j * Math.PI / 2) + time * 1.5;\n                    const pointLength = starSize * 1.8;\n                    const px = starX + Math.cos(pointAngle) * pointLength;\n                    const py = starY + Math.sin(pointAngle) * pointLength;\n                    \n                    ctx.fillStyle = `rgba(230, 200, 255, ${twinkle * 0.7})`;\n                    ctx.fillRect(px - 0.5, py - 0.5, 1, 1);\n                }\n            }\n            \n            // Floating dreamy particles\n            const particleCount = 15;\n            \n            for (let i = 0; i < particleCount; i++) {\n                const baseX = x + width * (0.15 + (i * 0.754877666) % 1 * 0.7);\n                const baseY = y + height * (0.15 + (i * 0.866025403) % 1 * 0.7);\n                \n                // Gentle floating motion\n                const floatProgress = (time * 0.5 + i * 0.3) % 1;\n                const particleX = baseX + Math.sin(time * 1.5 + i * 0.9) * 10;\n                const particleY = baseY + Math.sin(floatProgress * Math.PI) * 8;\n                \n                const particleAlpha = Math.sin(floatProgress * Math.PI) * 0.6;\n                const particleSize = 2 + Math.sin(time * 2.5 + i) * 1.5;\n                \n                // Soft glowing particle\n                const particleGradient = ctx.createRadialGradient(\n                    particleX,\n                    particleY,\n                    0,\n                    particleX,\n                    particleY,\n                    particleSize * 2\n                );\n                particleGradient.addColorStop(0, `rgba(220, 180, 255, ${particleAlpha})`);\n                particleGradient.addColorStop(0.5, `rgba(190, 150, 230, ${particleAlpha * 0.6})`);\n                particleGradient.addColorStop(1, 'rgba(160, 120, 200, 0)');\n                \n                ctx.fillStyle = particleGradient;\n                ctx.beginPath();\n                ctx.arc(particleX, particleY, particleSize * 2, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Dreamy twilight glow\n            const twilightGradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.3,\n                0,\n                x + width * 0.5,\n                y + height * 0.3,\n                Math.max(width, height) * 0.7\n            );\n            \n            const twilightAlpha = 0.1 + Math.sin(time * 1.1) * 0.04;\n            twilightGradient.addColorStop(0, `rgba(220, 180, 255, ${twilightAlpha})`);\n            twilightGradient.addColorStop(0.6, `rgba(190, 150, 230, ${twilightAlpha * 0.6})`);\n            twilightGradient.addColorStop(1, 'rgba(160, 120, 200, 0)');\n            \n            ctx.fillStyle = twilightGradient;\n            ctx.fillRect(x, y, width, height);\n            \n            ctx.restore();\n        }\n        \n        // ===== PINK FROSTING EFFECT (Rose Hearts) =====\n        function drawPinkFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw floating heart-shaped sparkles\n            const heartCount = 12;\n            \n            for (let i = 0; i < heartCount; i++) {\n                const baseX = x + width * (0.15 + (i * 0.618033988749895) % 1 * 0.7);\n                const baseY = y + height * (0.15 + (i * 0.786151377757423) % 1 * 0.7);\n                \n                // Gentle floating animation\n                const floatProgress = (time * 0.6 + i * 0.25) % 1;\n                const heartX = baseX + Math.sin(time * 2 + i * 0.8) * 8;\n                const heartY = baseY - floatProgress * 12 + 6;\n                \n                const heartAlpha = Math.sin(floatProgress * Math.PI) * 0.7;\n                const heartSize = 4 + Math.sin(time * 3 + i) * 2;\n                \n                ctx.save();\n                ctx.translate(heartX, heartY);\n                ctx.scale(heartSize / 10, heartSize / 10);\n                \n                // Draw heart shape\n                ctx.fillStyle = `rgba(255, 180, 220, ${heartAlpha})`;\n                ctx.beginPath();\n                ctx.moveTo(0, 3);\n                ctx.bezierCurveTo(-5, -2, -10, 1, -5, 8);\n                ctx.lineTo(0, 12);\n                ctx.lineTo(5, 8);\n                ctx.bezierCurveTo(10, 1, 5, -2, 0, 3);\n                ctx.closePath();\n                ctx.fill();\n                \n                // Heart glow\n                const heartGlow = ctx.createRadialGradient(0, 5, 0, 0, 5, 15);\n                heartGlow.addColorStop(0, `rgba(255, 200, 230, ${heartAlpha * 0.6})`);\n                heartGlow.addColorStop(0.5, `rgba(255, 180, 220, ${heartAlpha * 0.3})`);\n                heartGlow.addColorStop(1, 'rgba(255, 160, 210, 0)');\n                \n                ctx.fillStyle = heartGlow;\n                ctx.beginPath();\n                ctx.arc(0, 5, 15, 0, Math.PI * 2);\n                ctx.fill();\n                \n                ctx.restore();\n            }\n            \n            // Sparkling rose particles\n            const sparkleCount = 18;\n            \n            for (let i = 0; i < sparkleCount; i++) {\n                const sparkleX = x + width * (0.1 + (i * 0.754877666) % 1 * 0.8);\n                const sparkleY = y + height * (0.1 + (i * 0.866025403) % 1 * 0.8);\n                \n                const twinkle = Math.sin(time * 4 + i * 0.9) * 0.5 + 0.5;\n                const sparkleSize = 2 + twinkle * 2.5;\n                \n                // Rose-colored sparkle\n                const sparkleGradient = ctx.createRadialGradient(\n                    sparkleX,\n                    sparkleY,\n                    0,\n                    sparkleX,\n                    sparkleY,\n                    sparkleSize * 2\n                );\n                sparkleGradient.addColorStop(0, `rgba(255, 200, 230, ${twinkle * 0.8})`);\n                sparkleGradient.addColorStop(0.5, `rgba(255, 180, 220, ${twinkle * 0.5})`);\n                sparkleGradient.addColorStop(1, 'rgba(255, 150, 200, 0)');\n                \n                ctx.fillStyle = sparkleGradient;\n                ctx.beginPath();\n                ctx.arc(sparkleX, sparkleY, sparkleSize * 2, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Bright center\n                ctx.fillStyle = `rgba(255, 230, 240, ${twinkle * 0.9})`;\n                ctx.beginPath();\n                ctx.arc(sparkleX, sparkleY, sparkleSize * 0.5, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Romantic shimmer overlay\n            const shimmerGradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.4,\n                0,\n                x + width * 0.5,\n                y + height * 0.4,\n                Math.max(width, height) * 0.6\n            );\n            \n            const shimmerAlpha = 0.1 + Math.sin(time * 1.4) * 0.04;\n            shimmerGradient.addColorStop(0, `rgba(255, 200, 230, ${shimmerAlpha})`);\n            shimmerGradient.addColorStop(0.6, `rgba(255, 180, 220, ${shimmerAlpha * 0.6})`);\n            shimmerGradient.addColorStop(1, 'rgba(255, 160, 210, 0)');\n            \n            ctx.fillStyle = shimmerGradient;\n            ctx.fillRect(x, y, width, height);\n            \n            ctx.restore();\n        }\n        \n        // ===== SUBTLE SHIMMER EFFECT (for all basic frostings) =====\n        function drawSubtleShimmerEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Create a gentle pulsing glow overlay\n            const pulse = Math.sin(time * 1.5) * 0.5 + 0.5;\n            const shimmerAlpha = 0.08 + pulse * 0.06; // Very subtle: 0.08 to 0.14\n            \n            // Create radial gradient for subtle glow\n            const gradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.4,\n                0,\n                x + width * 0.5,\n                y + height * 0.4,\n                Math.max(width, height) * 0.6\n            );\n            \n            gradient.addColorStop(0, `rgba(255, 255, 255, ${shimmerAlpha})`);\n            gradient.addColorStop(0.5, `rgba(255, 255, 255, ${shimmerAlpha * 0.5})`);\n            gradient.addColorStop(1, 'rgba(255, 255, 255, 0)');\n            \n            ctx.fillStyle = gradient;\n            ctx.fillRect(x, y, width, height);\n            \n            // Add a few subtle sparkle points\n            const sparkleCount = 8;\n            for (let i = 0; i < sparkleCount; i++) {\n                const sparkleX = x + width * (0.2 + (i * 0.618033988749895) % 1 * 0.6);\n                const sparkleY = y + height * (0.2 + (i * 0.786151377757423) % 1 * 0.6);\n                \n                const sparklePulse = Math.sin(time * 2 + i * 0.8) * 0.5 + 0.5;\n                const sparkleSize = 1 + sparklePulse * 1.5;\n                const sparkleAlpha = sparklePulse * 0.3; // Very subtle\n                \n                ctx.fillStyle = `rgba(255, 255, 255, ${sparkleAlpha})`;\n                ctx.beginPath();\n                ctx.arc(sparkleX, sparkleY, sparkleSize, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            ctx.restore();\n        }\n        \n        // ===== MOONLIGHT FROSTING EFFECT =====\n        function drawMoonlightFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw floating moon phases scattered across the tier\n            const moonCount = 8;\n            \n            for (let i = 0; i < moonCount; i++) {\n                // Deterministic random positions\n                const moonX = x + width * (0.12 + (i * 0.618033988749895) % 1 * 0.76);\n                const moonY = y + height * (0.12 + (i * 0.786151377757423) % 1 * 0.76);\n                \n                // Gentle pulsing glow\n                const pulse = Math.sin(time * 1.5 + i * 0.7) * 0.5 + 0.5;\n                const moonSize = 8 + pulse * 4;\n                \n                // Determine moon phase based on index (variety)\n                const phaseType = i % 4; // 0: crescent, 1: half, 2: gibbous, 3: full\n                \n                // Draw moon glow\n                const glowGradient = ctx.createRadialGradient(moonX, moonY, 0, moonX, moonY, moonSize * 2);\n                glowGradient.addColorStop(0, `rgba(220, 230, 255, ${pulse * 0.6})`);\n                glowGradient.addColorStop(0.5, `rgba(180, 200, 240, ${pulse * 0.4})`);\n                glowGradient.addColorStop(1, 'rgba(160, 180, 220, 0)');\n                \n                ctx.fillStyle = glowGradient;\n                ctx.beginPath();\n                ctx.arc(moonX, moonY, moonSize * 2, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Draw moon phase\n                if (phaseType === 0) {\n                    // Crescent\n                    ctx.fillStyle = `rgba(240, 245, 255, ${pulse * 0.8})`;\n                    ctx.beginPath();\n                    ctx.arc(moonX, moonY, moonSize, 0, Math.PI * 2);\n                    ctx.fill();\n                    \n                    ctx.fillStyle = `rgba(200, 215, 235, ${pulse * 0.5})`;\n                    ctx.beginPath();\n                    ctx.arc(moonX + moonSize * 0.4, moonY, moonSize * 0.8, 0, Math.PI * 2);\n                    ctx.fill();\n                    ctx.globalCompositeOperation = 'destination-out';\n                    ctx.fill();\n                    ctx.globalCompositeOperation = 'screen';\n                } else if (phaseType === 1) {\n                    // Half moon\n                    ctx.fillStyle = `rgba(240, 245, 255, ${pulse * 0.8})`;\n                    ctx.beginPath();\n                    ctx.arc(moonX, moonY, moonSize, Math.PI * 0.5, Math.PI * 1.5);\n                    ctx.fill();\n                } else if (phaseType === 2) {\n                    // Gibbous\n                    ctx.fillStyle = `rgba(240, 245, 255, ${pulse * 0.8})`;\n                    ctx.beginPath();\n                    ctx.arc(moonX, moonY, moonSize, 0, Math.PI * 2);\n                    ctx.fill();\n                    \n                    ctx.fillStyle = `rgba(200, 215, 235, ${pulse * 0.3})`;\n                    ctx.beginPath();\n                    ctx.arc(moonX + moonSize * 0.2, moonY, moonSize * 0.6, 0, Math.PI * 2);\n                    ctx.fill();\n                } else {\n                    // Full moon\n                    ctx.fillStyle = `rgba(245, 250, 255, ${pulse * 0.9})`;\n                    ctx.beginPath();\n                    ctx.arc(moonX, moonY, moonSize, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n            \n            // Draw twinkling stars all across the tier\n            const starCount = 35;\n            \n            for (let i = 0; i < starCount; i++) {\n                const starX = x + width * (0.08 + (i * 0.754877666) % 1 * 0.84);\n                const starY = y + height * (0.08 + (i * 0.866025403) % 1 * 0.84);\n                \n                const twinkle = Math.sin(time * 4 + i * 0.9) * 0.5 + 0.5;\n                const starSize = 1 + twinkle * 2;\n                \n                // Draw twinkling star\n                ctx.fillStyle = `rgba(240, 245, 255, ${twinkle * 0.9})`;\n                ctx.beginPath();\n                ctx.arc(starX, starY, starSize, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Star cross points\n                const crossSize = starSize * 1.8;\n                ctx.fillStyle = `rgba(230, 240, 255, ${twinkle * 0.7})`;\n                ctx.fillRect(starX - crossSize, starY - 0.5, crossSize * 2, 1);\n                ctx.fillRect(starX - 0.5, starY - crossSize, 1, crossSize * 2);\n            }\n            \n            // Silvery shimmer overlay\n            const shimmerGradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.4,\n                0,\n                x + width * 0.5,\n                y + height * 0.4,\n                Math.max(width, height) * 0.6\n            );\n            \n            const shimmerAlpha = 0.1 + Math.sin(time * 1.2) * 0.04;\n            shimmerGradient.addColorStop(0, `rgba(230, 240, 255, ${shimmerAlpha})`);\n            shimmerGradient.addColorStop(0.5, `rgba(210, 225, 245, ${shimmerAlpha * 0.6})`);\n            shimmerGradient.addColorStop(1, 'rgba(190, 210, 235, 0)');\n            \n            ctx.fillStyle = shimmerGradient;\n            ctx.fillRect(x, y, width, height);\n            \n            ctx.restore();\n        }\n        \n        // ===== OCEAN WAVES FROSTING EFFECT =====\n        function drawOceanFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw flowing wave patterns\n            const waveCount = 5;\n            \n            for (let w = 0; w < waveCount; w++) {\n                ctx.beginPath();\n                \n                // Horizontal waves flowing across the tier\n                const baseY = y + height * (0.15 + w * 0.18);\n                const flowOffset = (time * 0.4 + w * 0.25) % 1;\n                \n                // Create smooth wave line\n                for (let i = 0; i <= 30; i++) {\n                    const progress = i / 30;\n                    const waveX = x + width * progress;\n                    \n                    // Wave undulation\n                    const wavePhase = progress * Math.PI * 4 + flowOffset * Math.PI * 2;\n                    const waveHeight = Math.sin(wavePhase) * height * 0.08;\n                    const waveY = baseY + waveHeight;\n                    \n                    if (i === 0) {\n                        ctx.moveTo(waveX, waveY);\n                    } else {\n                        ctx.lineTo(waveX, waveY);\n                    }\n                }\n                \n                // Wave colors - varying shades of ocean blue with white foam\n                const waveAlpha = 0.3 + Math.sin(time * 2 + w * 0.6) * 0.1;\n                \n                if (w % 2 === 0) {\n                    // White foam crests\n                    ctx.strokeStyle = `rgba(220, 240, 255, ${waveAlpha})`;\n                    ctx.lineWidth = 6;\n                } else {\n                    // Deep blue waves\n                    ctx.strokeStyle = `rgba(100, 180, 220, ${waveAlpha * 0.7})`;\n                    ctx.lineWidth = 8;\n                }\n                \n                ctx.lineCap = 'round';\n                ctx.lineJoin = 'round';\n                ctx.stroke();\n            }\n            \n            // Draw rising bubbles scattered throughout\n            const bubbleCount = 30;\n            \n            for (let i = 0; i < bubbleCount; i++) {\n                const baseX = x + width * (0.1 + (i * 0.618033988749895) % 1 * 0.8);\n                const baseY = y + height * (0.1 + (i * 0.786151377757423) % 1 * 0.8);\n                \n                // Bubbles rising animation\n                const riseProgress = (time * 0.8 + i * 0.3) % 1;\n                const bubbleX = baseX + Math.sin(time * 2 + i * 0.7) * 8;\n                const bubbleY = baseY - riseProgress * height * 0.3;\n                \n                // Skip if bubble has risen too far\n                if (bubbleY < y - 10) continue;\n                \n                const bubbleAlpha = (1 - riseProgress) * 0.7;\n                const bubbleSize = 2 + (1 - riseProgress) * 3;\n                \n                // Bubble with shimmer\n                const bubbleGradient = ctx.createRadialGradient(\n                    bubbleX - bubbleSize * 0.3,\n                    bubbleY - bubbleSize * 0.3,\n                    0,\n                    bubbleX,\n                    bubbleY,\n                    bubbleSize\n                );\n                bubbleGradient.addColorStop(0, `rgba(255, 255, 255, ${bubbleAlpha * 0.9})`);\n                bubbleGradient.addColorStop(0.5, `rgba(200, 230, 255, ${bubbleAlpha * 0.6})`);\n                bubbleGradient.addColorStop(1, `rgba(150, 200, 240, ${bubbleAlpha * 0.3})`);\n                \n                ctx.fillStyle = bubbleGradient;\n                ctx.beginPath();\n                ctx.arc(bubbleX, bubbleY, bubbleSize, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Bubble highlight\n                ctx.fillStyle = `rgba(255, 255, 255, ${bubbleAlpha * 0.8})`;\n                ctx.beginPath();\n                ctx.arc(bubbleX - bubbleSize * 0.35, bubbleY - bubbleSize * 0.35, bubbleSize * 0.3, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Add underwater light shimmer\n            const shimmerGradient = ctx.createRadialGradient(\n                x + width * 0.5,\n                y + height * 0.3,\n                0,\n                x + width * 0.5,\n                y + height * 0.3,\n                Math.max(width, height) * 0.7\n            );\n            \n            const shimmerAlpha = 0.12 + Math.sin(time * 1.5) * 0.05;\n            shimmerGradient.addColorStop(0, `rgba(180, 220, 255, ${shimmerAlpha})`);\n            shimmerGradient.addColorStop(0.6, `rgba(150, 200, 240, ${shimmerAlpha * 0.5})`);\n            shimmerGradient.addColorStop(1, 'rgba(120, 180, 220, 0)');\n            \n            ctx.fillStyle = shimmerGradient;\n            ctx.fillRect(x, y, width, height);\n            \n            ctx.restore();\n        }\n        \n        // ===== FIRE FROSTING EFFECT =====\n        function drawFireFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw fire ember particles scattered across the cake tier\n            const emberCount = 25;\n            \n            for (let i = 0; i < emberCount; i++) {\n                // Deterministic random positions based on index\n                const posX = x + width * (0.1 + (i * 0.618033988749895) % 1 * 0.8);\n                const posY = y + height * (0.1 + (i * 0.786151377757423) % 1 * 0.8);\n                \n                // Individual ember flickering with staggered timing\n                const flicker1 = Math.sin(time * 6 + i * 0.8);\n                const flicker2 = Math.sin(time * 9 + i * 1.3);\n                const brightness = (flicker1 + flicker2) * 0.25 + 0.5; // 0 to 1\n                \n                const emberSize = 3 + brightness * 4;\n                \n                // Glowing ember with gradient\n                const emberGradient = ctx.createRadialGradient(posX, posY, 0, posX, posY, emberSize * 2.5);\n                emberGradient.addColorStop(0, `rgba(255, 255, 200, ${brightness * 0.9})`);\n                emberGradient.addColorStop(0.3, `rgba(255, 180, 100, ${brightness * 0.7})`);\n                emberGradient.addColorStop(0.6, `rgba(255, 100, 50, ${brightness * 0.5})`);\n                emberGradient.addColorStop(1, 'rgba(255, 50, 0, 0)');\n                \n                ctx.fillStyle = emberGradient;\n                ctx.beginPath();\n                ctx.arc(posX, posY, emberSize * 2.5, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Bright core\n                ctx.fillStyle = `rgba(255, 240, 150, ${brightness * 0.8})`;\n                ctx.beginPath();\n                ctx.arc(posX, posY, emberSize * 0.6, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            ctx.restore();\n        }\n        \n        // ===== SKY CASTLE FROSTING EFFECT =====\n        function drawSkyCastleFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw floating cloud wisps\n            const cloudCount = 8;\n            \n            for (let i = 0; i < cloudCount; i++) {\n                const cloudX = x + width * (0.15 + (i * 0.618033988749895) % 1 * 0.7);\n                const cloudY = y + height * (0.2 + (i * 0.786151377757423) % 1 * 0.6);\n                \n                // Gentle floating animation\n                const floatOffset = Math.sin(time * 1.5 + i * 0.7) * 8;\n                const drawY = cloudY + floatOffset;\n                \n                const pulse = Math.sin(time * 2 + i * 0.5) * 0.5 + 0.5;\n                const cloudSize = 15 + pulse * 8;\n                \n                // Soft cloud gradient\n                const cloudGradient = ctx.createRadialGradient(cloudX, drawY, 0, cloudX, drawY, cloudSize);\n                cloudGradient.addColorStop(0, `rgba(255, 255, 255, ${0.6 + pulse * 0.2})`);\n                cloudGradient.addColorStop(0.5, `rgba(200, 230, 255, ${0.4 + pulse * 0.15})`);\n                cloudGradient.addColorStop(1, 'rgba(180, 220, 255, 0)');\n                \n                ctx.fillStyle = cloudGradient;\n                ctx.beginPath();\n                ctx.arc(cloudX, drawY, cloudSize, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Draw twinkling castle stars\n            const starCount = 15;\n            \n            for (let i = 0; i < starCount; i++) {\n                const starX = x + width * (0.1 + (i * 0.754877666) % 1 * 0.8);\n                const starY = y + height * (0.1 + (i * 0.866025403) % 1 * 0.8);\n                \n                const twinkle = Math.sin(time * 4 + i * 0.8) * 0.5 + 0.5;\n                const starSize = 2 + twinkle * 2;\n                \n                // Draw star sparkle\n                ctx.fillStyle = `rgba(255, 255, 255, ${twinkle * 0.8})`;\n                ctx.beginPath();\n                ctx.arc(starX, starY, starSize, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Star points\n                for (let j = 0; j < 4; j++) {\n                    const angle = (j * Math.PI / 2) + time * 2;\n                    const px = starX + Math.cos(angle) * starSize * 1.5;\n                    const py = starY + Math.sin(angle) * starSize * 1.5;\n                    ctx.fillRect(px - 0.5, py - 0.5, 1, 1);\n                }\n            }\n            \n            ctx.restore();\n        }\n        \n        // ===== CORAL FROSTING EFFECT =====\n        function drawCoralFrostingEffect(x, y, width, height, time) {\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            \n            // Draw floating ocean bubbles\n            const bubbleCount = 20;\n            \n            for (let i = 0; i < bubbleCount; i++) {\n                const bubbleX = x + width * (0.1 + (i * 0.618033988749895) % 1 * 0.8);\n                const bubbleY = y + height * (0.1 + (i * 0.786151377757423) % 1 * 0.8);\n                \n                // Gentle rising and swaying motion\n                const riseOffset = (time * 15 + i * 3) % height;\n                const swayOffset = Math.sin(time * 3 + i * 0.9) * 10;\n                \n                const drawX = bubbleX + swayOffset;\n                const drawY = y + height - riseOffset;\n                \n                // Check if bubble is within tier bounds\n                if (drawY < y || drawY > y + height) continue;\n                \n                const pulse = Math.sin(time * 3 + i * 0.6) * 0.5 + 0.5;\n                const bubbleSize = 3 + pulse * 3;\n                \n                // Ocean bubble with shimmer\n                const bubbleGradient = ctx.createRadialGradient(\n                    drawX - bubbleSize * 0.3,\n                    drawY - bubbleSize * 0.3,\n                    0,\n                    drawX,\n                    drawY,\n                    bubbleSize\n                );\n                bubbleGradient.addColorStop(0, `rgba(255, 255, 255, ${0.7 + pulse * 0.2})`);\n                bubbleGradient.addColorStop(0.5, `rgba(180, 240, 255, ${0.5 + pulse * 0.15})`);\n                bubbleGradient.addColorStop(1, 'rgba(255, 180, 200, 0)');\n                \n                ctx.fillStyle = bubbleGradient;\n                ctx.beginPath();\n                ctx.arc(drawX, drawY, bubbleSize, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Highlight\n                ctx.fillStyle = `rgba(255, 255, 255, ${0.8 + pulse * 0.2})`;\n                ctx.beginPath();\n                ctx.arc(drawX - bubbleSize * 0.35, drawY - bubbleSize * 0.35, bubbleSize * 0.25, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Draw shimmering pearl spots\n            const pearlCount = 12;\n            \n            for (let i = 0; i < pearlCount; i++) {\n                const pearlX = x + width * (0.15 + (i * 0.754877666) % 1 * 0.7);\n                const pearlY = y + height * (0.15 + (i * 0.866025403) % 1 * 0.7);\n                \n                const shimmer = Math.sin(time * 2.5 + i * 0.7) * 0.5 + 0.5;\n                const pearlSize = 2.5 + shimmer * 2;\n                \n                // Pearl with iridescent glow\n                const pearlGradient = ctx.createRadialGradient(pearlX, pearlY, 0, pearlX, pearlY, pearlSize * 2);\n                pearlGradient.addColorStop(0, `rgba(255, 240, 255, ${shimmer * 0.7})`);\n                pearlGradient.addColorStop(0.5, `rgba(255, 200, 220, ${shimmer * 0.5})`);\n                pearlGradient.addColorStop(1, 'rgba(255, 180, 200, 0)');\n                \n                ctx.fillStyle = pearlGradient;\n                ctx.beginPath();\n                ctx.arc(pearlX, pearlY, pearlSize * 2, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Pearl core\n                ctx.fillStyle = `rgba(255, 255, 255, ${shimmer * 0.9})`;\n                ctx.beginPath();\n                ctx.arc(pearlX, pearlY, pearlSize * 0.6, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            ctx.restore();\n        }\n        \n        // ===== DRAW ANIMATED FLAME =====\n        function drawFlame(x, y, time) {\n            // Create flickering effect\n            const flicker = Math.sin(time * 8) * 0.15 + Math.sin(time * 12) * 0.1;\n            const scale = 1 + flicker;\n            \n            const flameHeight = 25 * scale;\n            const flameWidth = 12 * scale;\n            \n            // Draw outer flame (orange)\n            ctx.save();\n            ctx.translate(x, y);\n            \n            // Outer glow\n            const outerGradient = ctx.createRadialGradient(0, 0, 0, 0, 0, flameWidth);\n            outerGradient.addColorStop(0, 'rgba(255, 200, 0, 0.8)');\n            outerGradient.addColorStop(0.5, 'rgba(255, 100, 0, 0.6)');\n            outerGradient.addColorStop(1, 'rgba(255, 0, 0, 0)');\n            \n            ctx.fillStyle = outerGradient;\n            ctx.beginPath();\n            ctx.ellipse(0, -flameHeight * 0.3, flameWidth * 0.8, flameHeight, 0, 0, Math.PI * 2);\n            ctx.fill();\n            \n            // Main flame body\n            ctx.fillStyle = '#FF6B00';\n            ctx.beginPath();\n            ctx.moveTo(0, 0);\n            ctx.bezierCurveTo(\n                -flameWidth * 0.5, -flameHeight * 0.3,\n                -flameWidth * 0.3, -flameHeight * 0.7,\n                0, -flameHeight\n            );\n            ctx.bezierCurveTo(\n                flameWidth * 0.3, -flameHeight * 0.7,\n                flameWidth * 0.5, -flameHeight * 0.3,\n                0, 0\n            );\n            ctx.fill();\n            \n            // Inner flame (yellow)\n            const innerScale = 0.6;\n            ctx.fillStyle = '#FFD700';\n            ctx.beginPath();\n            ctx.moveTo(0, -flameHeight * 0.1);\n            ctx.bezierCurveTo(\n                -flameWidth * 0.3 * innerScale, -flameHeight * 0.4,\n                -flameWidth * 0.2 * innerScale, -flameHeight * 0.7,\n                0, -flameHeight * 0.9\n            );\n            ctx.bezierCurveTo(\n                flameWidth * 0.2 * innerScale, -flameHeight * 0.7,\n                flameWidth * 0.3 * innerScale, -flameHeight * 0.4,\n                0, -flameHeight * 0.1\n            );\n            ctx.fill();\n            \n            // Bright core\n            ctx.fillStyle = '#FFFFCC';\n            ctx.beginPath();\n            ctx.ellipse(0, -flameHeight * 0.4, flameWidth * 0.15, flameHeight * 0.25, 0, 0, Math.PI * 2);\n            ctx.fill();\n            \n            ctx.restore();\n        }\n        \n        // ===== DRAW ANIMATED DECORATION EFFECTS =====\n        function drawDecorationAnimations(decoration, x, y, width, height, time) {\n            ctx.save();\n            \n            const decorationType = decoration.type;\n            \n            // Sparkle effects for magical decorations\n            if (['chibi_unicorn', 'magic_wand', 'magic_crystal', 'fantasy_crown'].includes(decorationType)) {\n                // Twinkling sparkles around the decoration\n                for (let i = 0; i < 4; i++) {\n                    const angle = (i / 4) * Math.PI * 2 + time * 2;\n                    const distance = Math.max(width, height) * 0.5;\n                    const sparkleX = x + Math.cos(angle) * distance;\n                    const sparkleY = y + Math.sin(angle) * distance;\n                    \n                    const pulse = Math.sin(time * 4 + i * 1.5) * 0.5 + 0.5;\n                    const sparkleSize = 2 + pulse * 3;\n                    \n                    ctx.fillStyle = `rgba(255, 255, 200, ${pulse * 0.8})`;\n                    ctx.beginPath();\n                    ctx.arc(sparkleX, sparkleY, sparkleSize, 0, Math.PI * 2);\n                    ctx.fill();\n                    \n                    // Draw star shape\n                    ctx.fillStyle = `rgba(255, 240, 150, ${pulse * 0.9})`;\n                    for (let j = 0; j < 4; j++) {\n                        const starAngle = (j * Math.PI / 2) + time * 3;\n                        const px = sparkleX + Math.cos(starAngle) * sparkleSize * 1.5;\n                        const py = sparkleY + Math.sin(starAngle) * sparkleSize * 1.5;\n                        ctx.fillRect(px - 1, py - 1, 2, 2);\n                    }\n                }\n            }\n            \n            // Glow pulse for phoenix\n            if (decorationType === 'chibi_phoenix') {\n                const pulse = Math.sin(time * 3) * 0.5 + 0.5;\n                const glowRadius = Math.max(width, height) * 0.8;\n                \n                const gradient = ctx.createRadialGradient(x, y, 0, x, y, glowRadius);\n                gradient.addColorStop(0, `rgba(255, 150, 0, ${pulse * 0.4})`);\n                gradient.addColorStop(0.5, `rgba(255, 100, 0, ${pulse * 0.2})`);\n                gradient.addColorStop(1, 'rgba(255, 0, 0, 0)');\n                \n                ctx.fillStyle = gradient;\n                ctx.beginPath();\n                ctx.arc(x, y, glowRadius, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Sparkle trail for dragon\n            if (decorationType === 'chibi_dragon') {\n                const sparkleCount = 3;\n                for (let i = 0; i < sparkleCount; i++) {\n                    const trailProgress = (time * 2 + i * 0.5) % 1;\n                    const trailX = x + Math.sin(time * 3 + i) * width * 0.3;\n                    const trailY = y - height * 0.3 - trailProgress * height * 0.4;\n                    const alpha = 1 - trailProgress;\n                    const size = 2 + (1 - trailProgress) * 2;\n                    \n                    ctx.fillStyle = `rgba(150, 100, 255, ${alpha * 0.7})`;\n                    ctx.beginPath();\n                    ctx.arc(trailX, trailY, size, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n            \n            // Wing flutter for butterflies\n            if (decorationType === 'fantasy_butterfly') {\n                const flutter = Math.sin(time * 8) * 0.1;\n                const glowPulse = Math.sin(time * 4) * 0.5 + 0.5;\n                \n                const gradient = ctx.createRadialGradient(x, y, 0, x, y, width * 0.7);\n                gradient.addColorStop(0, `rgba(255, 180, 255, ${glowPulse * 0.3})`);\n                gradient.addColorStop(1, 'rgba(255, 100, 255, 0)');\n                \n                ctx.fillStyle = gradient;\n                ctx.beginPath();\n                ctx.arc(x, y, width * 0.7, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Fairy dust trail\n            if (decorationType === 'chibi_fairy') {\n                const dustCount = 5;\n                for (let i = 0; i < dustCount; i++) {\n                    const trailProgress = (time * 1.5 + i * 0.3) % 1;\n                    const angle = time * 2 + i * 0.8;\n                    const radius = width * 0.5 * trailProgress;\n                    const dustX = x + Math.cos(angle) * radius;\n                    const dustY = y + Math.sin(angle) * radius;\n                    const alpha = 1 - trailProgress;\n                    const size = 2 + (1 - trailProgress) * 1.5;\n                    \n                    ctx.fillStyle = `rgba(200, 255, 255, ${alpha * 0.8})`;\n                    ctx.beginPath();\n                    ctx.arc(dustX, dustY, size, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n            \n            // Crystal glow pulse\n            if (decorationType === 'magic_crystal') {\n                const pulse = Math.sin(time * 2.5) * 0.5 + 0.5;\n                const glowRadius = Math.max(width, height) * 0.9;\n                \n                const gradient = ctx.createRadialGradient(x, y, 0, x, y, glowRadius);\n                gradient.addColorStop(0, `rgba(100, 200, 255, ${pulse * 0.5})`);\n                gradient.addColorStop(0.6, `rgba(150, 150, 255, ${pulse * 0.3})`);\n                gradient.addColorStop(1, 'rgba(200, 100, 255, 0)');\n                \n                ctx.fillStyle = gradient;\n                ctx.beginPath();\n                ctx.arc(x, y, glowRadius, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Flower petals falling\n            if (decorationType === 'fantasy_flower') {\n                const petalCount = 3;\n                for (let i = 0; i < petalCount; i++) {\n                    const fallProgress = (time * 0.8 + i * 0.4) % 1;\n                    const petalX = x + Math.sin(time * 2 + i) * width * 0.2;\n                    const petalY = y + height * 0.3 + fallProgress * height * 0.8;\n                    const alpha = 1 - fallProgress;\n                    const size = 3 + (1 - fallProgress) * 2;\n                    \n                    ctx.fillStyle = `rgba(255, 180, 200, ${alpha * 0.6})`;\n                    ctx.beginPath();\n                    ctx.arc(petalX, petalY, size, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n            \n            // Magic Moon - twinkling stars orbiting\n            if (decorationType === 'magic_moon') {\n                const starCount = 4;\n                const orbitRadius = Math.max(width, height) * 0.6;\n                \n                for (let i = 0; i < starCount; i++) {\n                    const angle = (time * 1.5 + i * (Math.PI * 2 / starCount)) % (Math.PI * 2);\n                    const starX = x + Math.cos(angle) * orbitRadius;\n                    const starY = y + Math.sin(angle) * orbitRadius;\n                    \n                    const twinkle = Math.sin(time * 4 + i * 1.2) * 0.5 + 0.5;\n                    const starSize = 2 + twinkle * 2.5;\n                    \n                    // Draw star\n                    ctx.fillStyle = `rgba(255, 255, 200, ${twinkle * 0.9})`;\n                    ctx.beginPath();\n                    ctx.arc(starX, starY, starSize, 0, Math.PI * 2);\n                    ctx.fill();\n                    \n                    // Star points\n                    for (let j = 0; j < 4; j++) {\n                        const pointAngle = (j * Math.PI / 2) + time * 3;\n                        const px = starX + Math.cos(pointAngle) * starSize * 1.5;\n                        const py = starY + Math.sin(pointAngle) * starSize * 1.5;\n                        ctx.fillRect(px - 0.5, py - 0.5, 1, 1);\n                    }\n                }\n                \n                // Moon glow pulse\n                const glowPulse = Math.sin(time * 2) * 0.5 + 0.5;\n                const glowRadius = Math.max(width, height) * 0.7;\n                \n                const gradient = ctx.createRadialGradient(x, y, 0, x, y, glowRadius);\n                gradient.addColorStop(0, `rgba(255, 255, 200, ${glowPulse * 0.4})`);\n                gradient.addColorStop(0.6, `rgba(255, 255, 150, ${glowPulse * 0.2})`);\n                gradient.addColorStop(1, 'rgba(255, 255, 100, 0)');\n                \n                ctx.fillStyle = gradient;\n                ctx.beginPath();\n                ctx.arc(x, y, glowRadius, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Cute Ghost - floating and transparency pulse\n            if (decorationType === 'cute_ghost') {\n                const floatOffset = Math.sin(time * 2) * 8;\n                const transparencyPulse = Math.sin(time * 3) * 0.3 + 0.7;\n                \n                // Ethereal trail effect\n                const trailCount = 3;\n                for (let i = 0; i < trailCount; i++) {\n                    const trailProgress = (time * 1.5 + i * 0.3) % 1;\n                    const trailY = y + floatOffset + trailProgress * 15;\n                    const trailAlpha = (1 - trailProgress) * transparencyPulse * 0.3;\n                    const trailSize = width * 0.8 * (1 - trailProgress * 0.3);\n                    \n                    const gradient = ctx.createRadialGradient(x, trailY, 0, x, trailY, trailSize / 2);\n                    gradient.addColorStop(0, `rgba(200, 220, 255, ${trailAlpha})`);\n                    gradient.addColorStop(1, 'rgba(200, 220, 255, 0)');\n                    \n                    ctx.fillStyle = gradient;\n                    ctx.beginPath();\n                    ctx.ellipse(x, trailY, trailSize / 2, trailSize / 3, 0, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n                \n                // Gentle glow\n                const glowRadius = Math.max(width, height) * 0.7;\n                const glowGradient = ctx.createRadialGradient(x, y + floatOffset, 0, x, y + floatOffset, glowRadius);\n                glowGradient.addColorStop(0, `rgba(200, 230, 255, ${transparencyPulse * 0.4})`);\n                glowGradient.addColorStop(0.6, `rgba(150, 200, 255, ${transparencyPulse * 0.2})`);\n                glowGradient.addColorStop(1, 'rgba(100, 180, 255, 0)');\n                \n                ctx.fillStyle = glowGradient;\n                ctx.beginPath();\n                ctx.arc(x, y + floatOffset, glowRadius, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Magic Potion - rising bubbles\n            if (decorationType === 'magic_potion') {\n                const bubbleCount = 5;\n                \n                for (let i = 0; i < bubbleCount; i++) {\n                    const riseProgress = (time * 1.2 + i * 0.25) % 1;\n                    const bubbleX = x + Math.sin(time * 2 + i * 1.5) * width * 0.15;\n                    const bubbleY = y + height * 0.2 - riseProgress * height * 0.8;\n                    const alpha = 1 - riseProgress;\n                    const size = 2 + (1 - riseProgress) * 2.5;\n                    \n                    // Bubble with gradient\n                    const bubbleGradient = ctx.createRadialGradient(\n                        bubbleX - size * 0.3,\n                        bubbleY - size * 0.3,\n                        0,\n                        bubbleX,\n                        bubbleY,\n                        size\n                    );\n                    bubbleGradient.addColorStop(0, `rgba(255, 200, 255, ${alpha * 0.8})`);\n                    bubbleGradient.addColorStop(0.5, `rgba(200, 150, 255, ${alpha * 0.5})`);\n                    bubbleGradient.addColorStop(1, `rgba(150, 100, 255, ${alpha * 0.2})`);\n                    \n                    ctx.fillStyle = bubbleGradient;\n                    ctx.beginPath();\n                    ctx.arc(bubbleX, bubbleY, size, 0, Math.PI * 2);\n                    ctx.fill();\n                    \n                    // Bubble highlight\n                    ctx.fillStyle = `rgba(255, 255, 255, ${alpha * 0.7})`;\n                    ctx.beginPath();\n                    ctx.arc(bubbleX - size * 0.3, bubbleY - size * 0.3, size * 0.3, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n                \n                // Magical shimmer around bottle\n                const shimmerPulse = Math.sin(time * 3) * 0.5 + 0.5;\n                const shimmerRadius = Math.max(width, height) * 0.6;\n                \n                const gradient = ctx.createRadialGradient(x, y, 0, x, y, shimmerRadius);\n                gradient.addColorStop(0, `rgba(200, 150, 255, ${shimmerPulse * 0.3})`);\n                gradient.addColorStop(0.6, `rgba(150, 100, 255, ${shimmerPulse * 0.15})`);\n                gradient.addColorStop(1, 'rgba(100, 50, 255, 0)');\n                \n                ctx.fillStyle = gradient;\n                ctx.beginPath();\n                ctx.arc(x, y, shimmerRadius, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Snowglobe - swirling snow particles\n            if (decorationType === 'snowglobe') {\n                const particleCount = 12;\n                const globeRadius = Math.max(width, height) * 0.45;\n                \n                for (let i = 0; i < particleCount; i++) {\n                    const swirl = (time * 1.5 + i * 0.3) % (Math.PI * 2);\n                    const radius = (Math.sin(time * 2 + i * 0.8) * 0.5 + 0.5) * globeRadius;\n                    const particleX = x + Math.cos(swirl) * radius;\n                    const particleY = y + Math.sin(swirl) * radius * 0.7 - radius * 0.3;\n                    \n                    // Check if inside globe bounds\n                    const distFromCenter = Math.sqrt(Math.pow(particleX - x, 2) + Math.pow(particleY - y, 2));\n                    if (distFromCenter > globeRadius) continue;\n                    \n                    const pulse = Math.sin(time * 4 + i * 1.2) * 0.5 + 0.5;\n                    const snowSize = 1.5 + pulse * 1.5;\n                    \n                    ctx.fillStyle = `rgba(255, 255, 255, ${pulse * 0.8})`;\n                    ctx.beginPath();\n                    ctx.arc(particleX, particleY, snowSize, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n                \n                // Subtle glow around globe\n                const glowPulse = Math.sin(time * 1.5) * 0.5 + 0.5;\n                const glowGradient = ctx.createRadialGradient(x, y, 0, x, y, globeRadius * 1.2);\n                glowGradient.addColorStop(0, `rgba(200, 230, 255, ${glowPulse * 0.15})`);\n                glowGradient.addColorStop(0.7, `rgba(180, 220, 255, ${glowPulse * 0.08})`);\n                glowGradient.addColorStop(1, 'rgba(150, 210, 255, 0)');\n                \n                ctx.fillStyle = glowGradient;\n                ctx.beginPath();\n                ctx.arc(x, y, globeRadius * 1.2, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Ice Skates - gentle swinging motion\n            if (decorationType === 'ice_skates') {\n                const swing = Math.sin(time * 2) * 0.12;\n                const glintPulse = Math.sin(time * 4) * 0.5 + 0.5;\n                \n                // Metallic blade glints\n                for (let i = 0; i < 3; i++) {\n                    const glintX = x + (Math.random() - 0.5) * width * 0.3;\n                    const glintY = y + height * 0.3 + (i - 1) * 8;\n                    const glintPhase = (time * 5 + i * 1.5) % 1;\n                    const glintAlpha = Math.sin(glintPhase * Math.PI) * glintPulse * 0.8;\n                    \n                    if (glintAlpha > 0) {\n                        ctx.fillStyle = `rgba(200, 230, 255, ${glintAlpha})`;\n                        ctx.fillRect(glintX - 3, glintY - 0.5, 6, 1);\n                        ctx.fillRect(glintX - 0.5, glintY - 3, 1, 6);\n                    }\n                }\n                \n                // Gentle shimmer\n                const shimmerGradient = ctx.createRadialGradient(x, y, 0, x, y, width * 0.6);\n                shimmerGradient.addColorStop(0, `rgba(220, 240, 255, ${glintPulse * 0.2})`);\n                shimmerGradient.addColorStop(1, 'rgba(220, 240, 255, 0)');\n                \n                ctx.fillStyle = shimmerGradient;\n                ctx.beginPath();\n                ctx.arc(x, y, width * 0.6, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Ornament - gentle swinging and rotating\n            if (decorationType === 'ornament') {\n                const swing = Math.sin(time * 1.8) * 0.1;\n                const spin = time * 0.5;\n                \n                // Reflective light streaks on ornament\n                for (let i = 0; i < 4; i++) {\n                    const angle = spin + (i * Math.PI / 2);\n                    const streakLength = width * 0.4;\n                    const brightness = Math.sin(time * 3 + i) * 0.5 + 0.5;\n                    \n                    ctx.save();\n                    ctx.translate(x, y);\n                    ctx.rotate(angle);\n                    \n                    const streakGradient = ctx.createLinearGradient(0, -streakLength / 2, 0, streakLength / 2);\n                    streakGradient.addColorStop(0, 'rgba(255, 255, 255, 0)');\n                    streakGradient.addColorStop(0.5, `rgba(255, 255, 255, ${brightness * 0.4})`);\n                    streakGradient.addColorStop(1, 'rgba(255, 255, 255, 0)');\n                    \n                    ctx.fillStyle = streakGradient;\n                    ctx.fillRect(-1, -streakLength / 2, 2, streakLength);\n                    \n                    ctx.restore();\n                }\n                \n                // Sparkle glints\n                const sparkleCount = 3;\n                for (let i = 0; i < sparkleCount; i++) {\n                    const sparkleAngle = spin * 2 + (i * Math.PI * 2 / sparkleCount);\n                    const sparkleDistance = width * 0.35;\n                    const sparkleX = x + Math.cos(sparkleAngle) * sparkleDistance;\n                    const sparkleY = y + Math.sin(sparkleAngle) * sparkleDistance;\n                    const sparklePulse = Math.sin(time * 5 + i * 1.5) * 0.5 + 0.5;\n                    \n                    ctx.fillStyle = `rgba(255, 255, 255, ${sparklePulse * 0.9})`;\n                    ctx.beginPath();\n                    ctx.arc(sparkleX, sparkleY, 1.5, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n            \n            // Holly - pulsing glow on berries\n            if (decorationType === 'holly') {\n                const berryPulse = Math.sin(time * 2.5) * 0.5 + 0.5;\n                \n                // Glowing berries effect - 2-3 berry positions\n                const berryPositions = [\n                    { x: x + width * 0.15, y: y },\n                    { x: x - width * 0.1, y: y + height * 0.1 },\n                    { x: x + width * 0.05, y: y - height * 0.15 }\n                ];\n                \n                berryPositions.forEach((pos, i) => {\n                    const individualPulse = Math.sin(time * 2.5 + i * 0.8) * 0.5 + 0.5;\n                    const berrySize = 8 + individualPulse * 4;\n                    \n                    // Berry glow\n                    const berryGradient = ctx.createRadialGradient(pos.x, pos.y, 0, pos.x, pos.y, berrySize);\n                    berryGradient.addColorStop(0, `rgba(255, 80, 80, ${individualPulse * 0.6})`);\n                    berryGradient.addColorStop(0.5, `rgba(255, 60, 60, ${individualPulse * 0.4})`);\n                    berryGradient.addColorStop(1, 'rgba(255, 40, 40, 0)');\n                    \n                    ctx.fillStyle = berryGradient;\n                    ctx.beginPath();\n                    ctx.arc(pos.x, pos.y, berrySize, 0, Math.PI * 2);\n                    ctx.fill();\n                    \n                    // Bright center\n                    ctx.fillStyle = `rgba(255, 150, 150, ${individualPulse * 0.7})`;\n                    ctx.beginPath();\n                    ctx.arc(pos.x - 2, pos.y - 2, 2, 0, Math.PI * 2);\n                    ctx.fill();\n                });\n                \n                // Festive sparkles around holly\n                for (let i = 0; i < 4; i++) {\n                    const sparkleAngle = time * 2 + i * (Math.PI / 2);\n                    const sparkleDistance = width * 0.4;\n                    const sparkleX = x + Math.cos(sparkleAngle) * sparkleDistance;\n                    const sparkleY = y + Math.sin(sparkleAngle) * sparkleDistance * 0.8;\n                    const sparklePulse = Math.sin(time * 4 + i * 1.2) * 0.5 + 0.5;\n                    \n                    ctx.fillStyle = `rgba(255, 220, 220, ${sparklePulse * 0.6})`;\n                    ctx.beginPath();\n                    ctx.arc(sparkleX, sparkleY, 1 + sparklePulse, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n            \n            // Cardinal - subtle wing flutter\n            if (decorationType === 'cardinal') {\n                const flutter = Math.sin(time * 6) * 0.08;\n                const chirpPulse = Math.sin(time * 3) * 0.5 + 0.5;\n                \n                // Wing movement shimmer\n                const wingShimmerLeft = ctx.createRadialGradient(\n                    x - width * 0.3,\n                    y,\n                    0,\n                    x - width * 0.3,\n                    y,\n                    width * 0.3\n                );\n                wingShimmerLeft.addColorStop(0, `rgba(255, 100, 100, ${Math.abs(flutter) * 0.3})`);\n                wingShimmerLeft.addColorStop(1, 'rgba(255, 100, 100, 0)');\n                \n                ctx.fillStyle = wingShimmerLeft;\n                ctx.beginPath();\n                ctx.arc(x - width * 0.3, y, width * 0.3, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Musical notes when \"chirping\"\n                if (chirpPulse > 0.7) {\n                    const noteX = x + width * 0.4;\n                    const noteY = y - height * 0.3 - (chirpPulse - 0.7) * 10;\n                    const noteAlpha = (chirpPulse - 0.7) * 3;\n                    \n                    ctx.fillStyle = `rgba(100, 100, 100, ${noteAlpha * 0.6})`;\n                    ctx.font = 'bold 12px Arial';\n                    ctx.fillText('\u266a', noteX, noteY);\n                }\n                \n                // Soft glow around bird\n                const glowGradient = ctx.createRadialGradient(x, y, 0, x, y, width * 0.6);\n                glowGradient.addColorStop(0, `rgba(255, 150, 150, ${chirpPulse * 0.2})`);\n                glowGradient.addColorStop(1, 'rgba(255, 100, 100, 0)');\n                \n                ctx.fillStyle = glowGradient;\n                ctx.beginPath();\n                ctx.arc(x, y, width * 0.6, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Blue Jay - DRAMATIC wing flapping and whistling\n            if (decorationType === 'blue_jay') {\n                const wingFlap = Math.sin(time * 8) * 0.18; // MUCH MORE dramatic flap\n                const whistlePulse = Math.sin(time * 2.5) * 0.5 + 0.5;\n                const flapScale = 1 + Math.abs(Math.sin(time * 8)) * 0.15; // Pulsing scale\n                \n                // DRAMATIC wing shimmer bursts - LEFT WING\n                const wingShimmerLeft = ctx.createRadialGradient(\n                    x - width * 0.35,\n                    y,\n                    0,\n                    x - width * 0.35,\n                    y,\n                    width * 0.6\n                );\n                const leftWingIntensity = Math.abs(wingFlap) * 1.2; // MUCH stronger\n                wingShimmerLeft.addColorStop(0, `rgba(100, 180, 255, ${leftWingIntensity * 0.9})`);\n                wingShimmerLeft.addColorStop(0.4, `rgba(80, 150, 255, ${leftWingIntensity * 0.7})`);\n                wingShimmerLeft.addColorStop(1, 'rgba(60, 120, 255, 0)');\n                \n                ctx.fillStyle = wingShimmerLeft;\n                ctx.beginPath();\n                ctx.arc(x - width * 0.35, y, width * 0.6, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // DRAMATIC wing shimmer bursts - RIGHT WING\n                const wingShimmerRight = ctx.createRadialGradient(\n                    x + width * 0.35,\n                    y,\n                    0,\n                    x + width * 0.35,\n                    y,\n                    width * 0.6\n                );\n                const rightWingIntensity = Math.abs(wingFlap) * 1.2; // MUCH stronger\n                wingShimmerRight.addColorStop(0, `rgba(100, 180, 255, ${rightWingIntensity * 0.9})`);\n                wingShimmerRight.addColorStop(0.4, `rgba(80, 150, 255, ${rightWingIntensity * 0.7})`);\n                wingShimmerRight.addColorStop(1, 'rgba(60, 120, 255, 0)');\n                \n                ctx.fillStyle = wingShimmerRight;\n                ctx.beginPath();\n                ctx.arc(x + width * 0.35, y, width * 0.6, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // ANIMATED WING STREAKS for dramatic effect\n                const streakCount = 4;\n                for (let i = 0; i < streakCount; i++) {\n                    const streakProgress = (time * 8 + i * 0.25) % 1;\n                    const streakAlpha = Math.sin(streakProgress * Math.PI) * Math.abs(wingFlap) * 0.8;\n                    \n                    if (streakAlpha > 0.1) {\n                        // Left wing streaks\n                        ctx.strokeStyle = `rgba(120, 200, 255, ${streakAlpha})`;\n                        ctx.lineWidth = 3;\n                        ctx.beginPath();\n                        ctx.moveTo(x - width * 0.2, y);\n                        ctx.lineTo(x - width * (0.2 + streakProgress * 0.4), y - streakProgress * 15);\n                        ctx.stroke();\n                        \n                        // Right wing streaks\n                        ctx.beginPath();\n                        ctx.moveTo(x + width * 0.2, y);\n                        ctx.lineTo(x + width * (0.2 + streakProgress * 0.4), y - streakProgress * 15);\n                        ctx.stroke();\n                    }\n                }\n                \n                // Musical notes when \"whistling\" - double notes for blue jay whistle\n                if (whistlePulse > 0.65) {\n                    const noteX1 = x + width * 0.4;\n                    const noteY1 = y - height * 0.3 - (whistlePulse - 0.65) * 12;\n                    const noteX2 = x + width * 0.5;\n                    const noteY2 = y - height * 0.35 - (whistlePulse - 0.65) * 15;\n                    const noteAlpha = (whistlePulse - 0.65) * 2.8;\n                    \n                    ctx.fillStyle = `rgba(70, 130, 180, ${noteAlpha * 0.8})`;\n                    ctx.font = 'bold 16px Arial';\n                    ctx.fillText('\u266b', noteX1, noteY1);\n                    ctx.fillText('\u266a', noteX2, noteY2);\n                }\n                \n                // STRONG blue glow around bird that pulses with flapping\n                const glowPulse = Math.abs(wingFlap) * 2;\n                const glowGradient = ctx.createRadialGradient(x, y, 0, x, y, width * 0.8);\n                glowGradient.addColorStop(0, `rgba(150, 220, 255, ${(whistlePulse * 0.4 + glowPulse * 0.3)})`);\n                glowGradient.addColorStop(0.5, `rgba(100, 180, 255, ${(whistlePulse * 0.25 + glowPulse * 0.2)})`);\n                glowGradient.addColorStop(1, 'rgba(80, 150, 255, 0)');\n                \n                ctx.fillStyle = glowGradient;\n                ctx.beginPath();\n                ctx.arc(x, y, width * 0.8, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Reindeer - glowing red nose (Rudolph!) with POWERFUL glow animation\n            if (decorationType === 'reindeer') {\n                // POWERFUL pulsing red nose glow\n                const nosePulse = Math.sin(time * 3) * 0.5 + 0.5;\n                const noseGlowRadius = width * 0.4;\n                \n                // MASSIVE outer glow - very visible\n                const outerGlowGradient = ctx.createRadialGradient(\n                    x + width * 0.15,\n                    y - height * 0.1,\n                    0,\n                    x + width * 0.15,\n                    y - height * 0.1,\n                    noseGlowRadius * 2.5\n                );\n                outerGlowGradient.addColorStop(0, `rgba(255, 100, 80, ${nosePulse * 0.5})`);\n                outerGlowGradient.addColorStop(0.3, `rgba(255, 60, 40, ${nosePulse * 0.35})`);\n                outerGlowGradient.addColorStop(0.6, `rgba(255, 30, 0, ${nosePulse * 0.15})`);\n                outerGlowGradient.addColorStop(1, 'rgba(255, 0, 0, 0)');\n                \n                ctx.fillStyle = outerGlowGradient;\n                ctx.beginPath();\n                ctx.arc(x + width * 0.15, y - height * 0.1, noseGlowRadius * 2.5, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Main nose glow - bright red\n                const noseGradient = ctx.createRadialGradient(\n                    x + width * 0.15,\n                    y - height * 0.1,\n                    0,\n                    x + width * 0.15,\n                    y - height * 0.1,\n                    noseGlowRadius\n                );\n                noseGradient.addColorStop(0, `rgba(255, 150, 100, ${nosePulse * 0.95})`);\n                noseGradient.addColorStop(0.4, `rgba(255, 100, 60, ${nosePulse * 0.8})`);\n                noseGradient.addColorStop(0.7, `rgba(255, 60, 20, ${nosePulse * 0.6})`);\n                noseGradient.addColorStop(1, 'rgba(255, 30, 0, 0)');\n                \n                ctx.fillStyle = noseGradient;\n                ctx.beginPath();\n                ctx.arc(x + width * 0.15, y - height * 0.1, noseGlowRadius, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Bright red nose core - LARGER\n                const noseSize = 8 + nosePulse * 5;\n                ctx.fillStyle = `rgba(255, 180, 150, ${nosePulse * 0.98})`;\n                ctx.beginPath();\n                ctx.arc(x + width * 0.15, y - height * 0.1, noseSize, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // DRAMATIC sparkle rays around the nose - MORE VISIBLE\n                const rayCount = 6;\n                for (let i = 0; i < rayCount; i++) {\n                    const rayAngle = (i * Math.PI / 3) + time * 2;\n                    const rayLength = noseGlowRadius * 1.2;\n                    const rayX = x + width * 0.15 + Math.cos(rayAngle) * rayLength;\n                    const rayY = y - height * 0.1 + Math.sin(rayAngle) * rayLength;\n                    \n                    const rayAlpha = nosePulse * 0.85;\n                    ctx.strokeStyle = `rgba(255, 220, 180, ${rayAlpha})`;\n                    ctx.lineWidth = 3;\n                    ctx.lineCap = 'round';\n                    ctx.beginPath();\n                    ctx.moveTo(x + width * 0.15, y - height * 0.1);\n                    ctx.lineTo(rayX, rayY);\n                    ctx.stroke();\n                }\n                \n                // MANY twinkling sparkles around the nose - MORE VISIBLE\n                const sparkleCount = 12;\n                for (let i = 0; i < sparkleCount; i++) {\n                    const sparkleAngle = (time * 4 + i * (Math.PI * 2 / sparkleCount)) % (Math.PI * 2);\n                    const sparkleDistance = noseGlowRadius * 1.6;\n                    const sparkleX = x + width * 0.15 + Math.cos(sparkleAngle) * sparkleDistance;\n                    const sparkleY = y - height * 0.1 + Math.sin(sparkleAngle) * sparkleDistance;\n                    \n                    const sparklePulse = Math.sin(time * 5 + i * 1.2) * 0.5 + 0.5;\n                    const sparkleSize = 3 + sparklePulse * 3;\n                    \n                    ctx.fillStyle = `rgba(255, 240, 200, ${sparklePulse * nosePulse * 0.9})`;\n                    ctx.beginPath();\n                    ctx.arc(sparkleX, sparkleY, sparkleSize, 0, Math.PI * 2);\n                    ctx.fill();\n                    \n                    // Sparkle cross - LARGER\n                    ctx.strokeStyle = `rgba(255, 220, 180, ${sparklePulse * nosePulse * 0.8})`;\n                    ctx.lineWidth = 2;\n                    ctx.beginPath();\n                    ctx.moveTo(sparkleX - 4, sparkleY);\n                    ctx.lineTo(sparkleX + 4, sparkleY);\n                    ctx.moveTo(sparkleX, sparkleY - 4);\n                    ctx.lineTo(sparkleX, sparkleY + 4);\n                    ctx.stroke();\n                }\n                \n                // WHOLE REINDEER GLOW - subtle but visible\n                const reindeerGlowGradient = ctx.createRadialGradient(x, y, 0, x, y, width * 0.8);\n                const reindeerGlowAlpha = Math.sin(time * 2) * 0.15 + 0.15;\n                reindeerGlowGradient.addColorStop(0, `rgba(255, 150, 100, ${reindeerGlowAlpha})`);\n                reindeerGlowGradient.addColorStop(0.5, `rgba(255, 100, 50, ${reindeerGlowAlpha * 0.5})`);\n                reindeerGlowGradient.addColorStop(1, 'rgba(255, 50, 0, 0)');\n                \n                ctx.fillStyle = reindeerGlowGradient;\n                ctx.beginPath();\n                ctx.arc(x, y, width * 0.8, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Sleigh Bell - gentle shake motion\n            if (decorationType === 'sleigh_bell') {\n                const shake = Math.sin(time * 8) * 0.05;\n                const jingle = Math.sin(time * 4) * 0.5 + 0.5;\n                \n                // Sound wave rings when jingling\n                for (let i = 0; i < 3; i++) {\n                    const ringProgress = (time * 2 + i * 0.3) % 1;\n                    const ringRadius = width * 0.4 + ringProgress * width * 0.5;\n                    const ringAlpha = (1 - ringProgress) * jingle * 0.5;\n                    \n                    if (ringAlpha > 0) {\n                        ctx.strokeStyle = `rgba(255, 215, 0, ${ringAlpha})`;\n                        ctx.lineWidth = 2;\n                        ctx.beginPath();\n                        ctx.arc(x, y, ringRadius, 0, Math.PI * 2);\n                        ctx.stroke();\n                    }\n                }\n                \n                // Sparkle glints on metallic surface\n                for (let i = 0; i < 4; i++) {\n                    const glintAngle = time * 3 + (i * Math.PI / 2);\n                    const glintX = x + Math.cos(glintAngle) * width * 0.3;\n                    const glintY = y + Math.sin(glintAngle) * height * 0.3;\n                    const glintPulse = Math.sin(time * 5 + i * 1.5) * 0.5 + 0.5;\n                    \n                    ctx.fillStyle = `rgba(255, 240, 180, ${glintPulse * 0.8})`;\n                    ctx.beginPath();\n                    ctx.arc(glintX, glintY, 2, 0, Math.PI * 2);\n                    ctx.fill();\n                    \n                    // Cross sparkle\n                    ctx.fillRect(glintX - 4, glintY - 0.5, 8, 1);\n                    ctx.fillRect(glintX - 0.5, glintY - 4, 1, 8);\n                }\n                \n                // Golden shimmer\n                const shimmerPulse = Math.sin(time * 2) * 0.5 + 0.5;\n                const shimmerGradient = ctx.createRadialGradient(x, y, 0, x, y, width * 0.5);\n                shimmerGradient.addColorStop(0, `rgba(255, 215, 0, ${shimmerPulse * 0.3})`);\n                shimmerGradient.addColorStop(1, 'rgba(255, 215, 0, 0)');\n                \n                ctx.fillStyle = shimmerGradient;\n                ctx.beginPath();\n                ctx.arc(x, y, width * 0.5, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Winter Scarf - flowing fabric animation\n            if (decorationType === 'winter_scarf') {\n                const flow = Math.sin(time * 1.5) * 0.15;\n                \n                // Fabric wave effect\n                const waveCount = 5;\n                for (let i = 0; i < waveCount; i++) {\n                    const waveX = x + (i - waveCount / 2) * 10;\n                    const waveY = y + Math.sin(time * 3 + i * 0.5) * 8;\n                    const waveAlpha = Math.sin(time * 2 + i * 0.8) * 0.3 + 0.5;\n                    \n                    const waveGradient = ctx.createRadialGradient(waveX, waveY, 0, waveX, waveY, 15);\n                    waveGradient.addColorStop(0, `rgba(220, 230, 255, ${waveAlpha * 0.3})`);\n                    waveGradient.addColorStop(1, 'rgba(220, 230, 255, 0)');\n                    \n                    ctx.fillStyle = waveGradient;\n                    ctx.beginPath();\n                    ctx.arc(waveX, waveY, 15, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n                \n                // Cozy warmth glow\n                const warmthPulse = Math.sin(time * 1.2) * 0.5 + 0.5;\n                const warmthGradient = ctx.createRadialGradient(x, y, 0, x, y, width * 0.7);\n                warmthGradient.addColorStop(0, `rgba(255, 220, 200, ${warmthPulse * 0.15})`);\n                warmthGradient.addColorStop(1, 'rgba(255, 200, 180, 0)');\n                \n                ctx.fillStyle = warmthGradient;\n                ctx.beginPath();\n                ctx.arc(x, y, width * 0.7, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Water Splash - dynamic splashing water effect\n            if (decorationType === 'water_splash') {\n                // Create splashing droplet particles radiating outward\n                const splashCount = 8;\n                for (let i = 0; i < splashCount; i++) {\n                    const splashPhase = (time * 2 + i * (Math.PI * 2 / splashCount)) % (Math.PI * 2);\n                    const radius = width * 0.4 + Math.sin(time * 3 + i) * width * 0.2;\n                    const splashX = x + Math.cos(splashPhase) * radius;\n                    const splashY = y + Math.sin(splashPhase) * radius;\n                    \n                    const splashPulse = Math.sin(time * 4 + i * 1.2) * 0.5 + 0.5;\n                    const dropletSize = 3 + splashPulse * 3;\n                    \n                    // Glowing water droplet\n                    const dropletGradient = ctx.createRadialGradient(\n                        splashX - dropletSize * 0.3,\n                        splashY - dropletSize * 0.3,\n                        0,\n                        splashX,\n                        splashY,\n                        dropletSize\n                    );\n                    dropletGradient.addColorStop(0, `rgba(100, 200, 255, ${splashPulse * 0.9})`);\n                    dropletGradient.addColorStop(0.5, `rgba(80, 180, 240, ${splashPulse * 0.6})`);\n                    dropletGradient.addColorStop(1, `rgba(60, 160, 220, ${splashPulse * 0.2})`);\n                    \n                    ctx.fillStyle = dropletGradient;\n                    ctx.beginPath();\n                    ctx.arc(splashX, splashY, dropletSize, 0, Math.PI * 2);\n                    ctx.fill();\n                    \n                    // Bright center\n                    ctx.fillStyle = `rgba(180, 230, 255, ${splashPulse * 0.8})`;\n                    ctx.beginPath();\n                    ctx.arc(splashX - dropletSize * 0.3, splashY - dropletSize * 0.3, dropletSize * 0.4, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n                \n                // Central splash glow\n                const splashGlow = Math.sin(time * 3) * 0.5 + 0.5;\n                const glowRadius = width * 0.6;\n                \n                const splashGradient = ctx.createRadialGradient(x, y, 0, x, y, glowRadius);\n                splashGradient.addColorStop(0, `rgba(100, 220, 255, ${splashGlow * 0.5})`);\n                splashGradient.addColorStop(0.6, `rgba(80, 200, 240, ${splashGlow * 0.25})`);\n                splashGradient.addColorStop(1, 'rgba(60, 180, 220, 0)');\n                \n                ctx.fillStyle = splashGradient;\n                ctx.beginPath();\n                ctx.arc(x, y, glowRadius, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            \n            // Water Droplet - gentle floating bobbing motion\n            if (decorationType === 'water_droplet') {\n                // Gentle bobbing animation\n                const bobOffset = Math.sin(time * 2) * 8;\n                \n                // Ripple rings expanding outward\n                for (let i = 0; i < 3; i++) {\n                    const rippleProgress = (time * 1.5 + i * 0.3) % 1;\n                    const rippleRadius = width * 0.3 * rippleProgress;\n                    const rippleAlpha = (1 - rippleProgress) * 0.4;\n                    \n                    if (rippleAlpha > 0) {\n                        ctx.strokeStyle = `rgba(100, 200, 255, ${rippleAlpha})`;\n                        ctx.lineWidth = 2;\n                        ctx.beginPath();\n                        ctx.arc(x, y + bobOffset, rippleRadius, 0, Math.PI * 2);\n                        ctx.stroke();\n                    }\n                }\n                \n                // Main water droplet glow\n                const dropletPulse = Math.sin(time * 3) * 0.5 + 0.5;\n                const dropletGradient = ctx.createRadialGradient(x, y + bobOffset, 0, x, y + bobOffset, width * 0.5);\n                dropletGradient.addColorStop(0, `rgba(150, 220, 255, ${dropletPulse * 0.6})`);\n                dropletGradient.addColorStop(0.4, `rgba(120, 200, 240, ${dropletPulse * 0.4})`);\n                dropletGradient.addColorStop(1, 'rgba(100, 180, 220, 0)');\n                \n                ctx.fillStyle = dropletGradient;\n                ctx.beginPath();\n                ctx.arc(x, y + bobOffset, width * 0.5, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Sparkles around droplet\n                for (let i = 0; i < 4; i++) {\n                    const sparkleAngle = (time * 2 + i * (Math.PI / 2)) % (Math.PI * 2);\n                    const sparkleDistance = width * 0.5;\n                    const sparkleX = x + Math.cos(sparkleAngle) * sparkleDistance;\n                    const sparkleY = y + bobOffset + Math.sin(sparkleAngle) * sparkleDistance;\n                    \n                    const sparklePulse = Math.sin(time * 4 + i * 1.5) * 0.5 + 0.5;\n                    const sparkleSize = 2 + sparklePulse * 2;\n                    \n                    ctx.fillStyle = `rgba(200, 240, 255, ${sparklePulse * 0.7})`;\n                    ctx.beginPath();\n                    ctx.arc(sparkleX, sparkleY, sparkleSize, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n            \n            // Water Fountain - water shooting upward in fountain streams\n            if (decorationType === 'water_fountain') {\n                // Multiple water streams shooting upward\n                const streamCount = 5;\n                \n                for (let i = 0; i < streamCount; i++) {\n                    // Staggered timing for each stream\n                    const streamPhase = (time * 2.5 + i * 0.2) % 1;\n                    \n                    // Stream shoots up from base\n                    const streamHeight = height * 0.8 * streamPhase;\n                    const streamX = x + (i - streamCount / 2) * (width / streamCount) * 0.6;\n                    const streamY = y + height * 0.3 - streamHeight;\n                    \n                    const streamAlpha = (1 - streamPhase) * 0.8;\n                    const streamWidth = 3 + (1 - streamPhase) * 2;\n                    \n                    if (streamAlpha > 0.1) {\n                        // Main stream\n                        const streamGradient = ctx.createLinearGradient(streamX, y + height * 0.3, streamX, streamY);\n                        streamGradient.addColorStop(0, `rgba(100, 220, 255, ${streamAlpha * 0.9})`);\n                        streamGradient.addColorStop(0.5, `rgba(120, 230, 255, ${streamAlpha * 0.7})`);\n                        streamGradient.addColorStop(1, `rgba(180, 240, 255, ${streamAlpha * 0.4})`);\n                        \n                        ctx.fillStyle = streamGradient;\n                        ctx.fillRect(streamX - streamWidth / 2, streamY, streamWidth, height * 0.3 + streamHeight);\n                        \n                        // Bright core\n                        ctx.fillStyle = `rgba(200, 245, 255, ${streamAlpha * 0.6})`;\n                        ctx.fillRect(streamX - streamWidth / 4, streamY, streamWidth / 2, height * 0.3 + streamHeight);\n                        \n                        // Water droplets at the top\n                        if (streamPhase > 0.5) {\n                            const dropletCount = 3;\n                            for (let j = 0; j < dropletCount; j++) {\n                                const angle = (j / dropletCount) * Math.PI - Math.PI / 2;\n                                const dropletDist = (streamPhase - 0.5) * 15;\n                                const dropletX = streamX + Math.cos(angle) * dropletDist;\n                                const dropletY = streamY + Math.sin(angle) * dropletDist;\n                                const dropletSize = 2 + (1 - streamPhase) * 2;\n                                \n                                const dropletGradient = ctx.createRadialGradient(\n                                    dropletX,\n                                    dropletY,\n                                    0,\n                                    dropletX,\n                                    dropletY,\n                                    dropletSize\n                                );\n                                dropletGradient.addColorStop(0, `rgba(180, 235, 255, ${streamAlpha})`);\n                                dropletGradient.addColorStop(0.5, `rgba(140, 215, 245, ${streamAlpha * 0.6})`);\n                                dropletGradient.addColorStop(1, `rgba(100, 195, 235, ${streamAlpha * 0.2})`);\n                                \n                                ctx.fillStyle = dropletGradient;\n                                ctx.beginPath();\n                                ctx.arc(dropletX, dropletY, dropletSize, 0, Math.PI * 2);\n                                ctx.fill();\n                            }\n                        }\n                    }\n                }\n                \n                // Fountain base glow\n                const basePulse = Math.sin(time * 3) * 0.5 + 0.5;\n                const baseGradient = ctx.createRadialGradient(x, y + height * 0.3, 0, x, y + height * 0.3, width * 0.6);\n                baseGradient.addColorStop(0, `rgba(120, 220, 255, ${basePulse * 0.6})`);\n                baseGradient.addColorStop(0.5, `rgba(100, 200, 240, ${basePulse * 0.4})`);\n                baseGradient.addColorStop(1, 'rgba(80, 180, 220, 0)');\n                \n                ctx.fillStyle = baseGradient;\n                ctx.beginPath();\n                ctx.arc(x, y + height * 0.3, width * 0.6, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Sparkles around fountain\n                for (let i = 0; i < 6; i++) {\n                    const sparkleAngle = (time * 2 + i * (Math.PI / 3)) % (Math.PI * 2);\n                    const sparkleDistance = width * 0.4;\n                    const sparkleX = x + Math.cos(sparkleAngle) * sparkleDistance;\n                    const sparkleY = y + Math.sin(sparkleAngle) * sparkleDistance;\n                    \n                    const sparklePulse = Math.sin(time * 4 + i * 1.3) * 0.5 + 0.5;\n                    const sparkleSize = 2 + sparklePulse * 2;\n                    \n                    ctx.fillStyle = `rgba(180, 240, 255, ${sparklePulse * 0.8})`;\n                    ctx.beginPath();\n                    ctx.arc(sparkleX, sparkleY, sparkleSize, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n            \n            // Icicle Lights - twinkling lights animation\n            if (decorationType === 'icicle_lights') {\n                // Multiple icicle light positions\n                const lightPositions = [\n                    { x: x - width * 0.25, y: y + height * 0.15 },\n                    { x: x, y: y + height * 0.3 },\n                    { x: x + width * 0.25, y: y + height * 0.2 },\n                    { x: x + width * 0.1, y: y }\n                ];\n                \n                lightPositions.forEach((pos, i) => {\n                    // Staggered twinkling for each light\n                    const twinkle = Math.sin(time * 4 + i * 1.3) * 0.5 + 0.5;\n                    const lightSize = 4 + twinkle * 4;\n                    \n                    // Light glow\n                    const lightGradient = ctx.createRadialGradient(pos.x, pos.y, 0, pos.x, pos.y, lightSize * 2);\n                    lightGradient.addColorStop(0, `rgba(180, 220, 255, ${twinkle * 0.8})`);\n                    lightGradient.addColorStop(0.5, `rgba(150, 200, 255, ${twinkle * 0.5})`);\n                    lightGradient.addColorStop(1, 'rgba(120, 180, 255, 0)');\n                    \n                    ctx.fillStyle = lightGradient;\n                    ctx.beginPath();\n                    ctx.arc(pos.x, pos.y, lightSize * 2, 0, Math.PI * 2);\n                    ctx.fill();\n                    \n                    // Bright core\n                    ctx.fillStyle = `rgba(220, 240, 255, ${twinkle * 0.9})`;\n                    ctx.beginPath();\n                    ctx.arc(pos.x, pos.y, lightSize * 0.5, 0, Math.PI * 2);\n                    ctx.fill();\n                    \n                    // Light rays\n                    for (let j = 0; j < 4; j++) {\n                        const rayAngle = (j * Math.PI / 2) + time * 2;\n                        const rayLength = lightSize * 2;\n                        const rayX = pos.x + Math.cos(rayAngle) * rayLength;\n                        const rayY = pos.y + Math.sin(rayAngle) * rayLength;\n                        \n                        ctx.strokeStyle = `rgba(200, 230, 255, ${twinkle * 0.5})`;\n                        ctx.lineWidth = 1;\n                        ctx.beginPath();\n                        ctx.moveTo(pos.x, pos.y);\n                        ctx.lineTo(rayX, rayY);\n                        ctx.stroke();\n                    }\n                });\n            }\n            \n            // Floating Lantern - flickering light\n            if (decorationType === 'floating_lantern') {\n                // Main glow with flicker\n                const flicker1 = Math.sin(time * 5) * 0.15;\n                const flicker2 = Math.sin(time * 8.7) * 0.1;\n                const brightness = 0.75 + flicker1 + flicker2;\n                \n                const glowRadius = Math.max(width, height) * 0.8;\n                \n                const glowGradient = ctx.createRadialGradient(x, y, 0, x, y, glowRadius);\n                glowGradient.addColorStop(0, `rgba(255, 220, 150, ${brightness * 0.6})`);\n                glowGradient.addColorStop(0.4, `rgba(255, 180, 100, ${brightness * 0.4})`);\n                glowGradient.addColorStop(0.7, `rgba(255, 140, 50, ${brightness * 0.2})`);\n                glowGradient.addColorStop(1, 'rgba(255, 100, 0, 0)');\n                \n                ctx.fillStyle = glowGradient;\n                ctx.beginPath();\n                ctx.arc(x, y, glowRadius, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Floating sparkles around lantern\n                const sparkleCount = 4;\n                for (let i = 0; i < sparkleCount; i++) {\n                    const angle = (time * 1 + i * (Math.PI * 2 / sparkleCount)) % (Math.PI * 2);\n                    const radius = width * 0.5 + Math.sin(time * 2 + i) * width * 0.2;\n                    const sparkleX = x + Math.cos(angle) * radius;\n                    const sparkleY = y + Math.sin(angle) * radius * 0.7;\n                    \n                    const sparklePulse = Math.sin(time * 4 + i * 1.5) * 0.5 + 0.5;\n                    const sparkleSize = 1.5 + sparklePulse * 2;\n                    \n                    ctx.fillStyle = `rgba(255, 220, 100, ${sparklePulse * brightness * 0.7})`;\n                    ctx.beginPath();\n                    ctx.arc(sparkleX, sparkleY, sparkleSize, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n                \n                // Warm light rays (subtle)\n                const rayCount = 6;\n                for (let i = 0; i < rayCount; i++) {\n                    const rayAngle = (i * Math.PI * 2 / rayCount) + time * 0.5;\n                    const rayLength = glowRadius * 0.6;\n                    const rayAlpha = (Math.sin(time * 3 + i) * 0.5 + 0.5) * brightness * 0.15;\n                    \n                    ctx.save();\n                    ctx.translate(x, y);\n                    ctx.rotate(rayAngle);\n                    \n                    const rayGradient = ctx.createLinearGradient(0, 0, rayLength, 0);\n                    rayGradient.addColorStop(0, `rgba(255, 220, 150, ${rayAlpha})`);\n                    rayGradient.addColorStop(1, 'rgba(255, 220, 150, 0)');\n                    \n                    ctx.fillStyle = rayGradient;\n                    ctx.fillRect(0, -2, rayLength, 4);\n                    \n                    ctx.restore();\n                }\n            }\n            \n            ctx.restore();\n        }\n        \n        // ===== RENDER GAME =====\n        function renderGame() {\n            ctx.clearRect(0, 0, canvas.width, canvas.height);\n            \n            // Draw background animations (back to front)\n            renderBackgroundBirds();\n            renderBackgroundFish();\n            renderBackgroundSeahorses();\n            renderBackgroundJellyfish();\n            renderBackgroundBubbles();\n            \n            // Add mystical underwater light rays\n            ctx.save();\n            ctx.globalCompositeOperation = 'screen';\n            ctx.globalAlpha = 0.08;\n            \n            const mysticalTime = performance.now() / 1000;\n            const rayCount = 4;\n            for (let i = 0; i < rayCount; i++) {\n                const rayX = (i / rayCount) * canvas.width + (Math.sin(mysticalTime * 0.3 + i) * 50);\n                const rayWidth = 120 + Math.sin(mysticalTime * 0.5 + i * 1.5) * 30;\n                \n                const rayGradient = ctx.createLinearGradient(rayX, 0, rayX, canvas.height);\n                rayGradient.addColorStop(0, 'rgba(180, 230, 255, 0.4)');\n                rayGradient.addColorStop(0.3, 'rgba(200, 240, 255, 0.2)');\n                rayGradient.addColorStop(0.7, 'rgba(220, 250, 255, 0.15)');\n                rayGradient.addColorStop(1, 'rgba(200, 240, 255, 0)');\n                \n                ctx.fillStyle = rayGradient;\n                ctx.fillRect(rayX - rayWidth / 2, 0, rayWidth, canvas.height);\n            }\n            ctx.restore();\n            \n            // Add floating mystical sparkles\n            ctx.save();\n            ctx.globalAlpha = 0.6;\n            const sparkleCount = 12;\n            for (let i = 0; i < sparkleCount; i++) {\n                const sparkleX = (Math.sin(mysticalTime * 0.8 + i * 2.5) * 0.5 + 0.5) * canvas.width;\n                const sparkleY = (Math.cos(mysticalTime * 0.6 + i * 1.8) * 0.5 + 0.5) * canvas.height;\n                const twinkle = Math.sin(mysticalTime * 4 + i * 1.3) * 0.5 + 0.5;\n                const sparkleSize = 2 + twinkle * 2;\n                \n                // Sparkle with rainbow hue\n                const hue = (mysticalTime * 30 + i * 30) % 360;\n                ctx.fillStyle = `hsla(${hue}, 70%, 90%, ${twinkle * 0.8})`;\n                ctx.beginPath();\n                ctx.arc(sparkleX, sparkleY, sparkleSize, 0, Math.PI * 2);\n                ctx.fill();\n                \n                // Sparkle cross\n                ctx.strokeStyle = `hsla(${hue}, 70%, 95%, ${twinkle * 0.6})`;\n                ctx.lineWidth = 1;\n                ctx.beginPath();\n                ctx.moveTo(sparkleX - 4, sparkleY);\n                ctx.lineTo(sparkleX + 4, sparkleY);\n                ctx.moveTo(sparkleX, sparkleY - 4);\n                ctx.lineTo(sparkleX, sparkleY + 4);\n                ctx.stroke();\n            }\n            ctx.restore();\n            \n            // Draw plate under cake\n            const plateImg = assetCache.images['cake_plate'];\n            if (plateImg) {\n                const plateWidth = cakeConfig.width * 1.1; // Slightly wider than cake\n                const plateHeight = plateWidth * 0.3; // Aspect ratio for plate\n                const plateY = cakeConfig.centerY + cakeConfig.height / 2 - 60; // Position at bottom of cake\n                \n                ctx.drawImage(\n                    plateImg,\n                    cakeConfig.centerX - plateWidth / 2,\n                    plateY - plateHeight / 2,\n                    plateWidth,\n                    plateHeight\n                );\n            }\n            \n            // Draw three-tier cake\n            const bottomImg = assetCache.images['cake_tier_bottom'];\n            const middleImg = assetCache.images['cake_tier_middle'];\n            const topImg = assetCache.images['cake_tier_top'];\n            \n            const currentTime = performance.now() / 1000;\n            \n            if (bottomImg && middleImg && topImg) {\n                // Define tier sizes (decreasing from bottom to top)\n                const bottomWidth = cakeConfig.width * 1.2;\n                const bottomHeight = cakeConfig.height * 0.48;\n                \n                const middleWidth = cakeConfig.width * 0.9;\n                const middleHeight = cakeConfig.height * 0.42;\n                \n                const topWidth = cakeConfig.width * 0.6;\n                const topHeight = cakeConfig.height * 0.36;\n                \n                // Calculate positions (stacked vertically)\n                const baseY = cakeConfig.centerY + cakeConfig.height / 2 - 40; // Bottom of cake stack\n                \n                const bottomY = baseY - bottomHeight / 2;\n                const middleY = bottomY - bottomHeight / 2 - middleHeight / 2 + 60;\n                const topY = middleY - middleHeight / 2 - topHeight / 2 + 60;\n                \n                // Draw bottom tier\n                ctx.drawImage(\n                    bottomImg,\n                    cakeConfig.centerX - bottomWidth / 2,\n                    bottomY - bottomHeight / 2,\n                    bottomWidth,\n                    bottomHeight\n                );\n                \n                // Draw bottom frosting\n                if (gameState.cakeFrosting[0] !== null) {\n                    const colorName = frostingColors[gameState.cakeFrosting[0]];\n                    // Map mermaid theme colors to actual asset IDs\n                    const colorMap = {\n                        'coral': 'coral',\n                        'ocean': 'ocean',\n                        'turquoise': 'turquoise',\n                        'pearl': 'pearl',\n                        'seafoam': 'seafoam',\n                        'aquamarine': 'aquamarine',\n                        'lavender': 'lavender',\n                        'pink': 'pink',\n                        'shell': 'shell',\n                        'seaweed': 'seaweed',\n                        'starfish': 'starfish',\n                        'moonlight': 'moonlight',\n                        'tide': 'tide',\n                        'bubble': 'bubble',\n                        'scales': 'scales',\n                        'sunset': 'sunset'\n                    };\n                    const assetColor = colorMap[colorName] || colorName;\n                    const frostingImg = assetCache.images[`frosting_${assetColor}`];\n                    \n                    const frostingWidth = bottomWidth * 1.08;\n                    const frostingHeight = bottomHeight * 1.08;\n                    const x = cakeConfig.centerX - frostingWidth / 2;\n                    const y = bottomY - frostingHeight / 2;\n                    \n                    // Draw frosting texture if available\n                    if (frostingImg) {\n                        ctx.drawImage(frostingImg, x, y, frostingWidth, frostingHeight);\n                    }\n                    \n                    // Always draw animated effects (they work standalone)\n                    drawAnimatedFrostingEffect(colorName, x, y, frostingWidth, frostingHeight, currentTime);\n                }\n                \n                // Draw middle tier\n                ctx.drawImage(\n                    middleImg,\n                    cakeConfig.centerX - middleWidth / 2,\n                    middleY - middleHeight / 2,\n                    middleWidth,\n                    middleHeight\n                );\n                \n                // Draw middle frosting\n                if (gameState.cakeFrosting[1] !== null) {\n                    const colorName = frostingColors[gameState.cakeFrosting[1]];\n                    // Map mermaid theme colors to actual asset IDs\n                    const colorMap = {\n                        'coral': 'coral',\n                        'ocean': 'ocean',\n                        'turquoise': 'turquoise',\n                        'pearl': 'pearl',\n                        'seafoam': 'seafoam',\n                        'aquamarine': 'aquamarine',\n                        'lavender': 'lavender',\n                        'pink': 'pink',\n                        'shell': 'shell',\n                        'seaweed': 'seaweed',\n                        'starfish': 'starfish',\n                        'moonlight': 'moonlight',\n                        'tide': 'tide',\n                        'bubble': 'bubble',\n                        'scales': 'scales',\n                        'sunset': 'sunset'\n                    };\n                    const assetColor = colorMap[colorName] || colorName;\n                    const frostingImg = assetCache.images[`frosting_${assetColor}`];\n                    \n                    const frostingWidth = middleWidth * 1.08;\n                    const frostingHeight = middleHeight * 1.08;\n                    const x = cakeConfig.centerX - frostingWidth / 2;\n                    const y = middleY - frostingHeight / 2;\n                    \n                    // Draw frosting texture if available\n                    if (frostingImg) {\n                        ctx.drawImage(frostingImg, x, y, frostingWidth, frostingHeight);\n                    }\n                    \n                    // Always draw animated effects (they work standalone)\n                    drawAnimatedFrostingEffect(colorName, x, y, frostingWidth, frostingHeight, currentTime);\n                }\n                \n                // Draw top tier\n                ctx.drawImage(\n                    topImg,\n                    cakeConfig.centerX - topWidth / 2,\n                    topY - topHeight / 2,\n                    topWidth,\n                    topHeight\n                );\n                \n                // Draw top frosting\n                if (gameState.cakeFrosting[2] !== null) {\n                    const colorName = frostingColors[gameState.cakeFrosting[2]];\n                    // Map mermaid theme colors to actual asset IDs\n                    const colorMap = {\n                        'coral': 'coral',\n                        'ocean': 'ocean',\n                        'turquoise': 'turquoise',\n                        'pearl': 'pearl',\n                        'seafoam': 'seafoam',\n                        'aquamarine': 'aquamarine',\n                        'lavender': 'lavender',\n                        'pink': 'pink',\n                        'shell': 'shell',\n                        'seaweed': 'seaweed',\n                        'starfish': 'starfish',\n                        'moonlight': 'moonlight',\n                        'tide': 'tide',\n                        'bubble': 'bubble',\n                        'scales': 'scales',\n                        'sunset': 'sunset'\n                    };\n                    const assetColor = colorMap[colorName] || colorName;\n                    const frostingImg = assetCache.images[`frosting_${assetColor}`];\n                    \n                    const frostingWidth = topWidth * 1.08;\n                    const frostingHeight = topHeight * 1.08;\n                    const x = cakeConfig.centerX - frostingWidth / 2;\n                    const y = topY - frostingHeight / 2;\n                    \n                    // Draw frosting texture if available\n                    if (frostingImg) {\n                        ctx.drawImage(frostingImg, x, y, frostingWidth, frostingHeight);\n                    }\n                    \n                    // Always draw animated effects (they work standalone)\n                    drawAnimatedFrostingEffect(colorName, x, y, frostingWidth, frostingHeight, currentTime);\n                }\n            }\n            \n            // Draw decorations\n            for (let i = 0; i < gameState.decorations.length; i++) {\n                const decoration = gameState.decorations[i];\n                const decorationAssetId = `decoration_${decoration.type}`;\n                const decorationImg = assetCache.images[decorationAssetId];\n                if (decorationImg) {\n                    const { width, height } = getDecorationSize(decoration.type);\n                    \n                    // Make semi-transparent if being repositioned\n                    if (dragState.isDragging && dragState.draggingDecorationIndex === i) {\n                        ctx.save();\n                        ctx.globalAlpha = 0.4;\n                    }\n                    \n                    // Draw animated effects behind decoration\n                    if (!(dragState.isDragging && dragState.draggingDecorationIndex === i)) {\n                        drawDecorationAnimations(decoration, decoration.x, decoration.y, width, height, currentTime);\n                    }\n                    \n                    ctx.drawImage(\n                        decorationImg,\n                        decoration.x - width / 2,\n                        decoration.y - height / 2,\n                        width,\n                        height\n                    );\n                    \n                    if (dragState.isDragging && dragState.draggingDecorationIndex === i) {\n                        ctx.restore();\n                    }\n                    \n                    // Draw animated flame on top of all candle types (not when being dragged)\n                    if ((decoration.type === 'candle' || decoration.type === 'candle_pink' || decoration.type === 'candle_rainbow') &&\n                        !(dragState.isDragging && dragState.draggingDecorationIndex === i)) {\n                        const flameX = decoration.x;\n                        const flameY = decoration.y - height * 0.5;\n                        drawFlame(flameX, flameY, currentTime);\n                    }\n                }\n            }\n            \n            // Draw dragging decoration\n            if (dragState.isDragging && dragState.dragElement) {\n                // Handled by HTML element\n            }\n        }\n\n        // ===== UPDATE GAME =====\n        function updateGame(deltaTime) {\n            // Update background animations\n            updateBackgroundJellyfish(deltaTime);\n            updateBackgroundBubbles(deltaTime);\n            updateBackgroundFish(deltaTime);\n            updateBackgroundSeahorses(deltaTime);\n            updateBackgroundBirds(deltaTime);\n            \n            if (gameState.gamePhase !== 'playing') return;\n            \n            // Only update timer in challenge mode\n            if (gameState.gameMode === 'challenge') {\n                // Update timer\n                gameState.timeRemaining -= deltaTime;\n                \n                if (gameState.timeRemaining <= 0) {\n                    gameState.timeRemaining = 0;\n                    endRound();\n                }\n                \n                // Update timer UI\n                const timerPercent = (gameState.timeRemaining / gameState.maxTime) * 100;\n                document.getElementById('timer-fill').style.width = timerPercent + '%';\n                document.getElementById('timer-text').textContent = Math.ceil(gameState.timeRemaining);\n                \n                // Timer warning\n                if (gameState.timeRemaining <= 10 && gameState.timeRemaining > 9.9) {\n                    playSound('sound_timer_warning');\n                    const timerContainer = document.querySelector('.timer-container-inline');\n                    if (timerContainer) {\n                        timerContainer.classList.add('timer-warning');\n                    }\n                    setMascotState('worried');\n                }\n            }\n        }\n\n        // ===== EVALUATE ROUND =====\n        function evaluateRound() {\n            const prompt = gameState.currentPrompt;\n            let totalScore = 0;\n            let maxScore = 0;\n            \n            // Check frosting requirements\n            if (prompt.requiredFrosting && prompt.requiredFrosting.length > 0) {\n                for (const frostingReq of prompt.requiredFrosting) {\n                    maxScore += 1;\n                    \n                    const requiredColorName = frostingReq.color;\n                    const requiredColorIndex = frostingColors.indexOf(requiredColorName);\n                    const tierIndex = frostingReq.tier || 0; // Default to bottom tier if not specified\n                    \n                    if (gameState.cakeFrosting[tierIndex] === requiredColorIndex) {\n                        totalScore += 1;\n                    }\n                }\n            }\n            \n            // Check decoration requirements with partial credit\n            if (prompt.requiredDecorations) {\n                for (const req of prompt.requiredDecorations) {\n                    maxScore += 1;\n                    \n                    const count = gameState.decorations.filter(d => d.type === req.type).length;\n                    \n                    // Give full credit if they meet or exceed the requirement\n                    if (count >= req.minCount) {\n                        totalScore += 1;\n                    } \n                    // Give partial credit if they're close (at least 1 decoration of this type)\n                    else if (count > 0) {\n                        // Partial credit based on how close they got\n                        // e.g., if need 5 and have 3, give 0.6 credit\n                        totalScore += Math.min(count / req.minCount, 0.8); // Cap partial credit at 0.8\n                    }\n                }\n            }\n            \n            // Calculate stars with more forgiving thresholds\n            const percentage = maxScore > 0 ? totalScore / maxScore : 0;\n            let stars = 0;\n            \n            if (percentage >= 0.75) stars = 3;      // Down from 90%\n            else if (percentage >= 0.50) stars = 2; // Down from 60%\n            else if (percentage >= 0.25) stars = 1; // Down from 30%\n            \n            return stars;\n        }\n\n        // ===== END ROUND =====\n        function endRound() {\n            gameState.gamePhase = 'evaluating';\n            \n            // Show chef reaching/celebrating first\n            setMascotState('celebrating');\n            \n            // Wait longer before showing results so chef celebration is visible\n            setTimeout(() => {\n                const stars = evaluateRound();\n                gameState.totalScore += stars;\n                \n                // Show results\n                showResults(stars);\n            }, 2500);\n        }\n\n        // ===== SHOW RESULTS =====\n        function showResults(stars) {\n            playSound('sound_round_complete');\n            setMascotState('celebrating');\n            \n            const resultsScreen = document.getElementById('results-screen');\n            const starsContainer = document.getElementById('stars-container');\n            const scoreText = document.getElementById('score-text');\n            const requirementsList = document.getElementById('requirements-list');\n            \n            resultsScreen.classList.add('active');\n            \n            // Update stars\n            const starElements = starsContainer.querySelectorAll('.star');\n            const starFilledImg = assetCache.images['ui_star_filled'];\n            const starEmptyImg = assetCache.images['ui_star_empty'];\n            \n            starElements.forEach((starEl, index) => {\n                if (index < stars) {\n                    // Earned star - filled with glow\n                    if (starFilledImg) {\n                        starEl.src = starFilledImg.src;\n                    }\n                    starEl.style.opacity = '1';\n                    starEl.style.filter = 'brightness(1.2) drop-shadow(0 0 15px rgba(255, 215, 0, 0.8))';\n                    starEl.classList.add('earned');\n                    setTimeout(() => {\n                        playSound('sound_star_earned');\n                    }, index * 300);\n                } else {\n                    // Not earned star - empty\n                    if (starEmptyImg) {\n                        starEl.src = starEmptyImg.src;\n                    }\n                    starEl.style.opacity = '0.4';\n                    starEl.style.filter = 'grayscale(0.3)';\n                    starEl.classList.remove('earned');\n                }\n            });\n            \n            scoreText.textContent = `Total Score: ${gameState.totalScore}`;\n            \n            // Display requirements visually\n            const prompt = gameState.currentPrompt;\n            requirementsList.innerHTML = '';\n            \n            // Mermaid themed frosting names\n            const themedFrostingNames = {\n                'coral': '\ud83e\udeb8 Coral Reef',\n                'ocean': '\ud83c\udf0a Ocean Blue',\n                'turquoise': '\ud83d\udc8e Turquoise Wave',\n                'pearl': '\ud83e\uddaa Pearl White',\n                'seafoam': '\ud83e\udee7 Seafoam Green',\n                'aquamarine': '\ud83d\udc9a Aquamarine',\n                'lavender': '\ud83d\udc9c Lavender Sea',\n                'pink': '\ud83e\ude77 Pink Coral',\n                'shell': '\ud83d\udc1a Seashell',\n                'seaweed': '\ud83c\udf3f Seaweed Green',\n                'starfish': '\u2b50 Starfish Gold',\n                'moonlight': '\ud83c\udf19 Moonlight',\n                'tide': '\ud83c\udf0a Tidal Blue',\n                'bubble': '\ud83e\udee7 Bubble White',\n                'scales': '\ud83d\udc20 Rainbow Scales',\n                'sunset': '\ud83c\udf05 Sunset Orange',\n                'abyss': '\ud83c\udf11 Deep Abyss',\n                'tropical': '\ud83c\udfdd\ufe0f Tropical Paradise',\n                'lagoon': '\ud83c\udfd6\ufe0f Lagoon Waters',\n                'sapphire': '\ud83d\udc8e Sapphire Gem',\n                'opal': '\u2728 Opal Shimmer',\n                'sand': '\ud83c\udfd6\ufe0f Sandy Beach'\n            };\n            \n            // Color map for frosting backgrounds (ocean/mermaid theme)\n            const colorMap = {\n                'coral': '#FF7F50',\n                'ocean': '#006994',\n                'turquoise': '#40E0D0',\n                'pearl': '#F0EAD6',\n                'seafoam': '#93E9BE',\n                'aquamarine': '#7FFFD4',\n                'lavender': '#E6E6FA',\n                'pink': '#FFB6D9',\n                'shell': '#FFF5EE',\n                'seaweed': '#2E8B57',\n                'starfish': '#FFD700',\n                'moonlight': 'linear-gradient(135deg, #E0F2FE 0%, #DBEAFE 50%, #BFDBFE 100%)',\n                'tide': '#4682B4',\n                'bubble': '#E0F7FA',\n                'scales': 'linear-gradient(135deg, #FF6B9D 0%, #C239B3 25%, #7E40FF 50%, #4E9FFF 75%, #00D4FF 100%)',\n                'sunset': '#FF6347',\n                'abyss': '#191970',\n                'tropical': '#00CED1',\n                'lagoon': '#20B2AA',\n                'sapphire': '#0F52BA',\n                'opal': 'linear-gradient(135deg, #FFB6D9 0%, #B8E6FF 25%, #D4F1F4 50%, #FFE5B4 75%, #E6E6FA 100%)',\n                'sand': '#C2B280'\n            };\n            \n            // Show frosting requirements with visual swatches - FILTERED by availability\n            if (prompt.requiredFrosting && prompt.requiredFrosting.length > 0) {\n                // Filter to only show available frostings\n                const availableFrostings = prompt.requiredFrosting.filter(function(req) {\n                    return window.gameConfig.availableFrostingColors[req.color] !== false;\n                });\n                \n                if (availableFrostings.length > 0) {\n                    const frostingTitle = document.createElement('div');\n                    frostingTitle.style.cssText = 'font-family: \"Fredoka\", sans-serif; font-size: 20px; font-weight: 600; color: var(--color-primary); margin-bottom: var(--space-sm);';\n                    frostingTitle.textContent = 'Frosting Colors:';\n                    requirementsList.appendChild(frostingTitle);\n                    \n                    const frostingContainer = document.createElement('div');\n                    frostingContainer.style.cssText = 'display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: var(--space-md);';\n                    \n                    availableFrostings.forEach(function(req) {\n                        const frostingColor = req.color;\n                        const tierName = req.tier === 0 ? 'Bottom' : req.tier === 1 ? 'Middle' : req.tier === 2 ? 'Top' : 'Bottom';\n                        const displayName = themedFrostingNames[frostingColor] || (frostingColor.charAt(0).toUpperCase() + frostingColor.slice(1));\n                        \n                        const frostingItem = document.createElement('div');\n                        frostingItem.style.cssText = 'display: flex; flex-direction: column; align-items: center; gap: 6px;';\n                        \n                        // Visual swatch\n                        const swatch = document.createElement('div');\n                        swatch.style.cssText = `\n                            width: 70px;\n                            height: 70px;\n                            border-radius: 12px;\n                            border: 3px solid rgba(185, 104, 217, 0.4);\n                            box-shadow: 0 4px 15px rgba(185, 104, 217, 0.2), 0 0 10px rgba(255, 107, 199, 0.1);\n                            display: flex;\n                            align-items: center;\n                            justify-content: center;\n                            font-family: \"Fredoka\", sans-serif;\n                            font-size: 11px;\n                            font-weight: 600;\n                            text-align: center;\n                            padding: 4px;\n                        `;\n                        \n                        if (frostingColor === 'scales' || frostingColor === 'moonlight') {\n                            swatch.style.background = colorMap[frostingColor];\n                        } else {\n                            swatch.style.backgroundColor = colorMap[frostingColor] || '#CCC';\n                        }\n                        \n                        swatch.style.color = (frostingColor === 'pearl' || frostingColor === 'shell' || frostingColor === 'lavender' ||\n                                              frostingColor === 'bubble' || frostingColor === 'moonlight' || frostingColor === 'seafoam' ||\n                                              frostingColor === 'aquamarine') ? '#333' : '#FFF';\n                        swatch.textContent = displayName;\n                        \n                        // Tier label\n                        const label = document.createElement('div');\n                        label.style.cssText = 'font-family: \"Poppins\", sans-serif; font-size: 14px; color: var(--color-text); text-align: center;';\n                        label.textContent = tierName + ' Tier';\n                        \n                        frostingItem.appendChild(swatch);\n                        frostingItem.appendChild(label);\n                        frostingContainer.appendChild(frostingItem);\n                    });\n                    \n                    requirementsList.appendChild(frostingContainer);\n                }\n            }\n            \n            // Show decoration requirements with images - FILTERED by availability\n            if (prompt.requiredDecorations && prompt.requiredDecorations.length > 0) {\n                // Filter to only show available decorations\n                const availableDecorations = prompt.requiredDecorations.filter(function(req) {\n                    return window.gameConfig.availableDecorations[req.type] !== false;\n                });\n                \n                if (availableDecorations.length > 0) {\n                    const decorTitle = document.createElement('div');\n                    decorTitle.style.cssText = 'font-family: \"Fredoka\", sans-serif; font-size: 20px; font-weight: 600; color: var(--color-primary); margin-bottom: var(--space-sm);';\n                    decorTitle.textContent = 'Toppings:';\n                    requirementsList.appendChild(decorTitle);\n                    \n                    const decorContainer = document.createElement('div');\n                    decorContainer.style.cssText = 'display: flex; flex-wrap: wrap; gap: 12px;';\n                    \n                    availableDecorations.forEach(function(req) {\n                        const decorationName = req.type.split('_').map(function(word) {\n                            return word.charAt(0).toUpperCase() + word.slice(1);\n                        }).join(' ');\n                        \n                        const decorItem = document.createElement('div');\n                        decorItem.style.cssText = 'display: flex; flex-direction: column; align-items: center; gap: 6px;';\n                        \n                        // Visual decoration image\n                        const decorBox = document.createElement('div');\n                        decorBox.style.cssText = `\n                            width: 70px;\n                            height: 70px;\n                            background: linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, rgba(255, 240, 255, 0.9) 100%);\n                            border-radius: 12px;\n                            border: 3px solid rgba(232, 154, 199, 0.5);\n                            display: flex;\n                            align-items: center;\n                            justify-content: center;\n                            box-shadow: 0 4px 15px rgba(232, 154, 199, 0.25), 0 0 10px rgba(255, 179, 230, 0.15);\n                        `;\n                        \n                        const decorImg = document.createElement('img');\n                        const decorationAssetId = `decoration_${req.type}`;\n                        const decorationImage = assetCache.images[decorationAssetId];\n                        if (decorationImage) {\n                            decorImg.src = decorationImage.src;\n                        }\n                        decorImg.style.cssText = 'width: 50px; height: 50px; object-fit: contain;';\n                        decorBox.appendChild(decorImg);\n                        \n                        // Count label\n                        const label = document.createElement('div');\n                        label.style.cssText = 'font-family: \"Poppins\", sans-serif; font-size: 14px; color: var(--color-text); text-align: center;';\n                        label.textContent = decorationName + ' (\u00d7' + req.minCount + ')';\n                        \n                        decorItem.appendChild(decorBox);\n                        decorItem.appendChild(label);\n                        decorContainer.appendChild(decorItem);\n                    });\n                    \n                    requirementsList.appendChild(decorContainer);\n                }\n            }\n        }\n\n        // ===== NEXT ROUND =====\n        function nextRound() {\n            gameState.round++;\n            gameState.cakeFrosting = [null, null, null];\n            gameState.decorations = [];\n            gameState.selectedFrostingColor = null;\n            gameState.actionHistory = []; // Clear action history for new round\n            gameState.gamePhase = 'playing';\n            \n            // Calculate new timer\n            const reduction = window.gameConfig.timerSettings.reductionPerRound;\n            const minTime = window.gameConfig.timerSettings.minTime;\n            gameState.maxTime = Math.max(minTime, gameState.maxTime - reduction);\n            gameState.timeRemaining = gameState.maxTime;\n            \n            const timerContainer = document.querySelector('.timer-container-inline');\n            if (timerContainer) {\n                timerContainer.classList.remove('timer-warning');\n            }\n            \n            updateFrostingPaletteUI();\n            selectNextPrompt();\n            \n            document.getElementById('results-screen').classList.remove('active');\n            \n            // Reset mascot to happy\n            setMascotState('happy');\n        }\n\n        // ===== HANDLE CAKE CLICK =====\n        function handleCakeClick(x, y) {\n            // Apply selected frosting to the tier that was clicked\n            if (gameState.selectedFrostingColor === null) return;\n            \n            // Don't allow new actions while mermaid is carrying something\n            if (mascotCarrying !== null) return;\n            \n            const left = cakeConfig.centerX - cakeConfig.width / 2;\n            const right = cakeConfig.centerX + cakeConfig.width / 2;\n            const top = cakeConfig.centerY - cakeConfig.height / 2;\n            const bottom = cakeConfig.centerY + cakeConfig.height / 2;\n            \n            if (x < left || x > right || y < top || y > bottom) return;\n            \n            // Define tier sizes and positions (same as in renderGame)\n            const bottomWidth = cakeConfig.width;\n            const bottomHeight = cakeConfig.height * 0.4;\n            \n            const middleWidth = cakeConfig.width * 0.75;\n            const middleHeight = cakeConfig.height * 0.35;\n            \n            const topWidth = cakeConfig.width * 0.5;\n            const topHeight = cakeConfig.height * 0.3;\n            \n            const baseY = cakeConfig.centerY + cakeConfig.height / 2 - 40;\n            \n            const bottomY = baseY - bottomHeight / 2;\n            const middleY = bottomY - bottomHeight / 2 - middleHeight / 2 + 30;\n            const topY = middleY - middleHeight / 2 - topHeight / 2 + 30;\n            \n            // Determine which tier was clicked (check from top to bottom)\n            let tierIndex = -1;\n            let targetY = 0;\n            \n            // Check top tier\n            const topLeft = cakeConfig.centerX - topWidth / 2;\n            const topRight = cakeConfig.centerX + topWidth / 2;\n            const topTop = topY - topHeight / 2;\n            const topBottom = topY + topHeight / 2;\n            \n            if (x >= topLeft && x <= topRight && y >= topTop && y <= topBottom) {\n                tierIndex = 2; // Top tier\n                targetY = topY;\n            }\n            \n            // Check middle tier\n            if (tierIndex === -1) {\n                const middleLeft = cakeConfig.centerX - middleWidth / 2;\n                const middleRight = cakeConfig.centerX + middleWidth / 2;\n                const middleTop = middleY - middleHeight / 2;\n                const middleBottom = middleY + middleHeight / 2;\n                \n                if (x >= middleLeft && x <= middleRight && y >= middleTop && y <= middleBottom) {\n                    tierIndex = 1; // Middle tier\n                    targetY = middleY;\n                }\n            }\n            \n            // Check bottom tier\n            if (tierIndex === -1) {\n                const bottomLeft = cakeConfig.centerX - bottomWidth / 2;\n                const bottomRight = cakeConfig.centerX + bottomWidth / 2;\n                const bottomTop = bottomY - bottomHeight / 2;\n                const bottomBottom = bottomY + bottomHeight / 2;\n                \n                if (x >= bottomLeft && x <= bottomRight && y >= bottomTop && y <= bottomBottom) {\n                    tierIndex = 0; // Bottom tier\n                    targetY = bottomY;\n                }\n            }\n            \n            // Apply frosting via mermaid - TWO STEP ANIMATION\n            if (tierIndex !== -1) {\n                // Record action for speed calculation\n                recordAction();\n                \n                setMascotState('excited');\n                \n                // Calculate swim duration based on speed multiplier\n                const swimDuration = 800 / gameState.actionSpeedMultiplier;\n                const pauseDuration = 500 / gameState.actionSpeedMultiplier;\n                \n                // Find the exact screen position of the selected frosting palette item\n                const paletteContainer = document.querySelector(`#frosting-palette > div[data-color-index=\"${gameState.selectedFrostingColor}\"]`);\n                let paletteLeft = 25; // Default fallback\n                let paletteBottom = 180; // Default fallback\n                \n                if (paletteContainer) {\n                    const paletteRect = paletteContainer.getBoundingClientRect();\n                    const paletteCenterX = paletteRect.left + paletteRect.width / 2;\n                    const paletteCenterY = paletteRect.top + paletteRect.height / 2;\n                    \n                    // Convert to mascot coordinate system\n                    paletteLeft = (paletteCenterX / window.innerWidth) * 100;\n                    paletteBottom = window.innerHeight - paletteCenterY;\n                }\n                \n                // STEP 1: Swim to the EXACT frosting palette position to grab it\n                swimMascotTo(paletteBottom, paletteLeft, swimDuration, () => {\n                    // After arriving at palette, grab the frosting (show in hand)\n                    mascotCarrying = { type: 'frosting', colorIndex: gameState.selectedFrostingColor };\n                    updateMascotCarriedItem();\n                    playSound('sound_apply_frosting');\n                    \n                    // Calculate screen position for tier\n                    const rect = canvas.getBoundingClientRect();\n                    const screenX = (x / canvas.width) * rect.width + rect.left;\n                    const screenY = (targetY / canvas.height) * rect.height + rect.top;\n                    \n                    // Convert to bottom/left for mascot positioning\n                    const targetLeft = (screenX / window.innerWidth) * 100;\n                    const targetBottom = window.innerHeight - screenY;\n                    \n                    // STEP 2: Swim to tier position to apply it\n                    setTimeout(() => {\n                        swimMascotTo(targetBottom, targetLeft, swimDuration, () => {\n                            // Apply frosting after arriving at tier\n                            const previousFrosting = gameState.cakeFrosting[tierIndex];\n                            gameState.cakeFrosting[tierIndex] = gameState.selectedFrostingColor;\n                            \n                            // Add to action history\n                            gameState.actionHistory.push({\n                                type: 'frosting',\n                                tierIndex: tierIndex,\n                                previousValue: previousFrosting,\n                                newValue: gameState.selectedFrostingColor\n                            });\n                            \n                            // Clear what mermaid is carrying\n                            clearMascotCarriedItem();\n                            \n                            // Return home after a moment\n                            setTimeout(() => {\n                                returnMascotHome();\n                                setMascotState('happy');\n                            }, pauseDuration);\n                        });\n                    }, pauseDuration);\n                });\n            }\n        }\n\n\n        // ===== START DRAG =====\n        function startDrag(decorationType, clientX, clientY, decorationIndex = null, paletteItemX = null, paletteItemY = null) {\n            dragState.isDragging = true;\n            dragState.decorationType = decorationType;\n            dragState.draggingDecorationIndex = decorationIndex;\n            dragState.startX = clientX;\n            dragState.startY = clientY;\n            dragState.currentX = clientX;\n            dragState.currentY = clientY;\n            dragState.paletteItemX = paletteItemX; // Store palette item position\n            dragState.paletteItemY = paletteItemY;\n            \n            // If repositioning an existing decoration, calculate offset\n            if (decorationIndex !== null) {\n                const rect = canvas.getBoundingClientRect();\n                const canvasX = ((clientX - rect.left) / rect.width) * canvas.width;\n                const canvasY = ((clientY - rect.top) / rect.height) * canvas.height;\n                \n                const decoration = gameState.decorations[decorationIndex];\n                dragState.offsetX = canvasX - decoration.x;\n                dragState.offsetY = canvasY - decoration.y;\n            } else {\n                dragState.offsetX = 0;\n                dragState.offsetY = 0;\n            }\n            \n            // Store palette item position if provided\n            dragState.paletteItemX = paletteItemX;\n            dragState.paletteItemY = paletteItemY;\n            \n            // Create dragging element with proper aspect ratio\n            const dragEl = document.createElement('div');\n            dragEl.className = 'dragging-decoration';\n            \n            // Get proper size\n            const { width, height } = getDecorationSize(decorationType);\n            \n            dragEl.style.width = width + 'px';\n            dragEl.style.height = height + 'px';\n            \n            const img = document.createElement('img');\n            const decorationAssetId = `decoration_${decorationType}`;\n            const decorationImg = assetCache.images[decorationAssetId];\n            img.src = decorationImg?.src || '';\n            img.style.width = '100%';\n            img.style.height = '100%';\n            img.style.objectFit = 'contain';\n            dragEl.appendChild(img);\n            document.body.appendChild(dragEl);\n            dragState.dragElement = dragEl;\n            \n            updateDragPosition(clientX, clientY);\n        }\n\n        // ===== UPDATE DRAG =====\n        function updateDragPosition(clientX, clientY) {\n            if (!dragState.isDragging || !dragState.dragElement) return;\n            \n            dragState.currentX = clientX;\n            dragState.currentY = clientY;\n            \n            const elWidth = dragState.dragElement.offsetWidth;\n            const elHeight = dragState.dragElement.offsetHeight;\n            \n            dragState.dragElement.style.left = (clientX - elWidth / 2) + 'px';\n            dragState.dragElement.style.top = (clientY - elHeight / 2) + 'px';\n        }\n\n        // ===== CHECK IF POINT IS ON CAKE =====\n        function isPointOnCake(x, y) {\n            // Define tier sizes (same as in renderGame)\n            const bottomWidth = cakeConfig.width * 1.2;\n            const bottomHeight = cakeConfig.height * 0.48;\n            \n            const middleWidth = cakeConfig.width * 0.9;\n            const middleHeight = cakeConfig.height * 0.42;\n            \n            const topWidth = cakeConfig.width * 0.6;\n            const topHeight = cakeConfig.height * 0.36;\n            \n            const baseY = cakeConfig.centerY + cakeConfig.height / 2 - 40;\n            \n            const bottomY = baseY - bottomHeight / 2;\n            const middleY = bottomY - bottomHeight / 2 - middleHeight / 2 + 60;\n            const topY = middleY - middleHeight / 2 - topHeight / 2 + 60;\n            \n            // Check if point is within top tier\n            if (x >= cakeConfig.centerX - topWidth / 2 && \n                x <= cakeConfig.centerX + topWidth / 2 &&\n                y >= topY - topHeight / 2 && \n                y <= topY + topHeight / 2) {\n                return true;\n            }\n            \n            // Check if point is within middle tier\n            if (x >= cakeConfig.centerX - middleWidth / 2 && \n                x <= cakeConfig.centerX + middleWidth / 2 &&\n                y >= middleY - middleHeight / 2 && \n                y <= middleY + middleHeight / 2) {\n                return true;\n            }\n            \n            // Check if point is within bottom tier\n            if (x >= cakeConfig.centerX - bottomWidth / 2 && \n                x <= cakeConfig.centerX + bottomWidth / 2 &&\n                y >= bottomY - bottomHeight / 2 && \n                y <= bottomY + bottomHeight / 2) {\n                return true;\n            }\n            \n            return false;\n        }\n        \n        // ===== END DRAG =====\n        function endDrag() {\n            if (!dragState.isDragging) return;\n            \n            // Don't allow new actions while mermaid is carrying something\n            if (mascotCarrying !== null) {\n                // Cancel drag\n                if (dragState.dragElement) {\n                    dragState.dragElement.remove();\n                }\n                \n                dragState.isDragging = false;\n                dragState.decorationType = null;\n                dragState.draggingDecorationIndex = null;\n                dragState.dragElement = null;\n                dragState.offsetX = 0;\n                dragState.offsetY = 0;\n                dragState.paletteItemX = null;\n                dragState.paletteItemY = null;\n                return;\n            }\n            \n            // Convert screen coordinates to canvas coordinates\n            const rect = canvas.getBoundingClientRect();\n            const canvasX = ((dragState.currentX - rect.left) / rect.width) * canvas.width - dragState.offsetX;\n            const canvasY = ((dragState.currentY - rect.top) / rect.height) * canvas.height - dragState.offsetY;\n            \n            // Check if the decoration is being placed on the cake\n            if (!isPointOnCake(canvasX, canvasY)) {\n                // Not on cake - cancel the placement/move\n                if (dragState.dragElement) {\n                    dragState.dragElement.remove();\n                }\n                \n                dragState.isDragging = false;\n                dragState.decorationType = null;\n                dragState.draggingDecorationIndex = null;\n                dragState.dragElement = null;\n                dragState.offsetX = 0;\n                dragState.offsetY = 0;\n                dragState.paletteItemX = null;\n                dragState.paletteItemY = null;\n                return;\n            }\n            \n            // Decoration is on the cake - place it\n            if (dragState.draggingDecorationIndex !== null) {\n                // Reposition existing decoration - just move it instantly\n                gameState.decorations[dragState.draggingDecorationIndex].x = canvasX;\n                gameState.decorations[dragState.draggingDecorationIndex].y = canvasY;\n            } else {\n                // Place new decoration via mermaid - TWO STEP ANIMATION\n                const decoration = {\n                    type: dragState.decorationType,\n                    x: canvasX,\n                    y: canvasY\n                };\n                \n                // Record action for speed calculation\n                recordAction();\n                \n                setMascotState('excited');\n                \n                // Calculate swim duration based on speed multiplier\n                const swimDuration = 800 / gameState.actionSpeedMultiplier;\n                const pauseDuration = 500 / gameState.actionSpeedMultiplier;\n                \n                // Use stored palette item position or fallback\n                let paletteLeft = 60; // Default fallback\n                let paletteBottom = 180; // Default fallback\n                \n                if (dragState.paletteItemX !== null && dragState.paletteItemY !== null) {\n                    // Convert stored palette position to mascot coordinate system\n                    paletteLeft = (dragState.paletteItemX / window.innerWidth) * 100;\n                    paletteBottom = window.innerHeight - dragState.paletteItemY;\n                }\n                \n                // STEP 1: Swim to the EXACT decoration palette position to grab it\n                swimMascotTo(paletteBottom, paletteLeft, swimDuration, () => {\n                    // After arriving at palette, grab the decoration (show in hand)\n                    mascotCarrying = { type: 'decoration', decorationType: dragState.decorationType };\n                    updateMascotCarriedItem();\n                    playSound('sound_place_decoration');\n                    \n                    // Calculate screen position for final placement\n                    const screenX = (canvasX / canvas.width) * rect.width + rect.left;\n                    const screenY = (canvasY / canvas.height) * rect.height + rect.top;\n                    \n                    // Convert to bottom/left for mascot positioning\n                    const targetLeft = (screenX / window.innerWidth) * 100;\n                    const targetBottom = window.innerHeight - screenY;\n                    \n                    // STEP 2: Swim to placement position\n                    setTimeout(() => {\n                        swimMascotTo(targetBottom, targetLeft, swimDuration, () => {\n                            // Place decoration after arriving at position\n                            gameState.decorations.push(decoration);\n                            \n                            // Add to action history\n                            gameState.actionHistory.push({\n                                type: 'decoration',\n                                index: gameState.decorations.length - 1\n                            });\n                            \n                            // Clear what mermaid is carrying\n                            clearMascotCarriedItem();\n                            \n                            // Return home after a moment\n                            setTimeout(() => {\n                                returnMascotHome();\n                                setMascotState('happy');\n                            }, pauseDuration);\n                        });\n                    }, pauseDuration);\n                });\n            }\n            \n            // Clean up\n            if (dragState.dragElement) {\n                dragState.dragElement.remove();\n            }\n            \n            dragState.isDragging = false;\n            dragState.decorationType = null;\n            dragState.draggingDecorationIndex = null;\n            dragState.dragElement = null;\n            dragState.offsetX = 0;\n            dragState.offsetY = 0;\n            dragState.paletteItemX = null;\n            dragState.paletteItemY = null;\n        }\n\n        // ===== MERMAID REMOVE DECORATION =====\n        function mermaidRemoveDecoration(decorationIndex) {\n            if (decorationIndex < 0 || decorationIndex >= gameState.decorations.length) return;\n            \n            const decoration = gameState.decorations[decorationIndex];\n            \n            // Record action for speed calculation\n            recordAction();\n            \n            setMascotState('surprised');\n            \n            // Calculate swim duration based on speed multiplier\n            const swimDuration = 800 / gameState.actionSpeedMultiplier;\n            const pauseDuration = 400 / gameState.actionSpeedMultiplier;\n            \n            // Calculate screen position for decoration\n            const rect = canvas.getBoundingClientRect();\n            const screenX = (decoration.x / canvas.width) * rect.width + rect.left;\n            const screenY = (decoration.y / canvas.height) * rect.height + rect.top;\n            \n            // Convert to bottom/left for mascot positioning\n            const targetLeft = (screenX / window.innerWidth) * 100;\n            const targetBottom = window.innerHeight - screenY;\n            \n            // STEP 1: Swim to decoration position to grab it\n            swimMascotTo(targetBottom, targetLeft, swimDuration, () => {\n                // After arriving at decoration, grab it (show in hand)\n                mascotCarrying = { type: 'decoration', decorationType: decoration.type };\n                updateMascotCarriedItem();\n                playSound('sound_undo');\n                \n                // STEP 2: Swim off-screen to the right to remove it\n                const offScreenLeft = 110; // Off the right side of screen\n                const offScreenBottom = targetBottom;\n                \n                setTimeout(() => {\n                    swimMascotTo(offScreenBottom, offScreenLeft, swimDuration, () => {\n                        // Remove decoration after swimming away\n                        gameState.decorations.splice(decorationIndex, 1);\n                        \n                        // Clear what mermaid is carrying\n                        clearMascotCarriedItem();\n                        \n                        // Return home after a moment\n                        setTimeout(() => {\n                            returnMascotHome();\n                            setMascotState('happy');\n                        }, pauseDuration);\n                    });\n                }, pauseDuration);\n            });\n        }\n        \n        // ===== MERMAID REMOVE FROSTING =====\n        function mermaidRemoveFrosting(tierIndex, colorIndex) {\n            if (tierIndex < 0 || tierIndex > 2) return;\n            if (colorIndex === null) return;\n            \n            // Record action for speed calculation\n            recordAction();\n            \n            setMascotState('surprised');\n            \n            // Calculate swim duration based on speed multiplier\n            const swimDuration = 800 / gameState.actionSpeedMultiplier;\n            const pauseDuration = 400 / gameState.actionSpeedMultiplier;\n            \n            // Calculate tier position on canvas\n            const bottomWidth = cakeConfig.width * 1.2;\n            const bottomHeight = cakeConfig.height * 0.48;\n            const middleWidth = cakeConfig.width * 0.9;\n            const middleHeight = cakeConfig.height * 0.42;\n            const topWidth = cakeConfig.width * 0.6;\n            const topHeight = cakeConfig.height * 0.36;\n            \n            const baseY = cakeConfig.centerY + cakeConfig.height / 2 - 40;\n            const bottomY = baseY - bottomHeight / 2;\n            const middleY = bottomY - bottomHeight / 2 - middleHeight / 2 + 60;\n            const topY = middleY - middleHeight / 2 - topHeight / 2 + 60;\n            \n            let targetCanvasY = bottomY;\n            if (tierIndex === 1) targetCanvasY = middleY;\n            else if (tierIndex === 2) targetCanvasY = topY;\n            \n            // Calculate screen position for tier\n            const rect = canvas.getBoundingClientRect();\n            const screenX = (cakeConfig.centerX / canvas.width) * rect.width + rect.left;\n            const screenY = (targetCanvasY / canvas.height) * rect.height + rect.top;\n            \n            // Convert to bottom/left for mascot positioning\n            const targetLeft = (screenX / window.innerWidth) * 100;\n            const targetBottom = window.innerHeight - screenY;\n            \n            // STEP 1: Swim to tier position to grab frosting\n            swimMascotTo(targetBottom, targetLeft, swimDuration, () => {\n                // After arriving at tier, grab the frosting (show in hand)\n                mascotCarrying = { type: 'frosting', colorIndex: colorIndex };\n                updateMascotCarriedItem();\n                playSound('sound_undo');\n                \n                // STEP 2: Swim off-screen to the right to remove it\n                const offScreenLeft = 110; // Off the right side of screen\n                const offScreenBottom = targetBottom;\n                \n                setTimeout(() => {\n                    swimMascotTo(offScreenBottom, offScreenLeft, swimDuration, () => {\n                        // Remove frosting after swimming away\n                        gameState.cakeFrosting[tierIndex] = null;\n                        \n                        // Clear what mermaid is carrying\n                        clearMascotCarriedItem();\n                        \n                        // Return home after a moment\n                        setTimeout(() => {\n                            returnMascotHome();\n                            setMascotState('happy');\n                        }, pauseDuration);\n                    });\n                }, pauseDuration);\n            });\n        }\n        \n        // ===== UNDO =====\n        function undo() {\n            if (gameState.actionHistory.length === 0) return;\n            \n            // Don't allow undo while mermaid is carrying something\n            if (mascotCarrying !== null) return;\n            \n            const lastAction = gameState.actionHistory.pop();\n            \n            if (lastAction.type === 'decoration') {\n                // Remove the last decoration via mermaid animation\n                const decorationIndex = lastAction.index;\n                if (decorationIndex >= 0 && decorationIndex < gameState.decorations.length) {\n                    mermaidRemoveDecoration(decorationIndex);\n                }\n            } else if (lastAction.type === 'frosting') {\n                // Remove frosting via mermaid animation if there was frosting to remove\n                if (lastAction.newValue !== null) {\n                    mermaidRemoveFrosting(lastAction.tierIndex, lastAction.newValue);\n                } else {\n                    // No frosting to remove (was setting to null), restore instantly\n                    gameState.cakeFrosting[lastAction.tierIndex] = lastAction.previousValue;\n                    setMascotState('surprised');\n                    setTimeout(() => {\n                        if (gameState.mascotState === 'surprised') {\n                            setMascotState('happy');\n                        }\n                    }, 1500);\n                }\n            }\n        }\n\n        // ===== CLEAR =====\n        function clearAll() {\n            // Don't allow clear while mermaid is carrying something\n            if (mascotCarrying !== null) return;\n            \n            setMascotState('surprised');\n            \n            // Collect all items to remove (decorations + frosted tiers)\n            const itemsToRemove = [];\n            \n            // Add decorations\n            for (let i = gameState.decorations.length - 1; i >= 0; i--) {\n                itemsToRemove.push({ type: 'decoration', index: i });\n            }\n            \n            // Add frosted tiers\n            for (let i = 0; i < 3; i++) {\n                if (gameState.cakeFrosting[i] !== null) {\n                    itemsToRemove.push({ type: 'frosting', tierIndex: i, colorIndex: gameState.cakeFrosting[i] });\n                }\n            }\n            \n            // If nothing to clear, just reset\n            if (itemsToRemove.length === 0) {\n                gameState.actionHistory = [];\n                updateFrostingPaletteUI();\n                playSound('sound_clear');\n                setTimeout(() => {\n                    setMascotState('happy');\n                }, 500);\n                return;\n            }\n            \n            // Remove items one by one with quick animations\n            const removeNextItem = () => {\n                if (itemsToRemove.length > 0) {\n                    const item = itemsToRemove.shift();\n                    \n                    if (item.type === 'decoration') {\n                        const decoration = gameState.decorations[item.index];\n                        \n                        // Quick swim to decoration\n                        const rect = canvas.getBoundingClientRect();\n                        const screenX = (decoration.x / canvas.width) * rect.width + rect.left;\n                        const screenY = (decoration.y / canvas.height) * rect.height + rect.top;\n                        const targetLeft = (screenX / window.innerWidth) * 100;\n                        const targetBottom = window.innerHeight - screenY;\n                        \n                        // Very quick swim (300ms)\n                        const quickSwim = 300 / gameState.actionSpeedMultiplier;\n                        \n                        swimMascotTo(targetBottom, targetLeft, quickSwim, () => {\n                            // Grab and immediately remove\n                            mascotCarrying = { type: 'decoration', decorationType: decoration.type };\n                            updateMascotCarriedItem();\n                            \n                            // Remove after brief pause\n                            setTimeout(() => {\n                                gameState.decorations.splice(item.index, 1);\n                                clearMascotCarriedItem();\n                                \n                                // Continue to next item\n                                removeNextItem();\n                            }, 100);\n                        });\n                    } else if (item.type === 'frosting') {\n                        // Calculate tier position\n                        const bottomWidth = cakeConfig.width * 1.2;\n                        const bottomHeight = cakeConfig.height * 0.48;\n                        const middleWidth = cakeConfig.width * 0.9;\n                        const middleHeight = cakeConfig.height * 0.42;\n                        const topWidth = cakeConfig.width * 0.6;\n                        const topHeight = cakeConfig.height * 0.36;\n                        \n                        const baseY = cakeConfig.centerY + cakeConfig.height / 2 - 40;\n                        const bottomY = baseY - bottomHeight / 2;\n                        const middleY = bottomY - bottomHeight / 2 - middleHeight / 2 + 60;\n                        const topY = middleY - middleHeight / 2 - topHeight / 2 + 60;\n                        \n                        let targetCanvasY = bottomY;\n                        if (item.tierIndex === 1) targetCanvasY = middleY;\n                        else if (item.tierIndex === 2) targetCanvasY = topY;\n                        \n                        // Quick swim to tier\n                        const rect = canvas.getBoundingClientRect();\n                        const screenX = (cakeConfig.centerX / canvas.width) * rect.width + rect.left;\n                        const screenY = (targetCanvasY / canvas.height) * rect.height + rect.top;\n                        const targetLeft = (screenX / window.innerWidth) * 100;\n                        const targetBottom = window.innerHeight - screenY;\n                        \n                        // Very quick swim (300ms)\n                        const quickSwim = 300 / gameState.actionSpeedMultiplier;\n                        \n                        swimMascotTo(targetBottom, targetLeft, quickSwim, () => {\n                            // Grab and immediately remove\n                            mascotCarrying = { type: 'frosting', colorIndex: item.colorIndex };\n                            updateMascotCarriedItem();\n                            \n                            // Remove after brief pause\n                            setTimeout(() => {\n                                gameState.cakeFrosting[item.tierIndex] = null;\n                                clearMascotCarriedItem();\n                                \n                                // Continue to next item\n                                removeNextItem();\n                            }, 100);\n                        });\n                    }\n                } else {\n                    // All items removed, finalize\n                    gameState.selectedFrostingColor = null;\n                    gameState.actionHistory = [];\n                    updateFrostingPaletteUI();\n                    playSound('sound_clear');\n                    \n                    returnMascotHome();\n                    setTimeout(() => {\n                        setMascotState('happy');\n                    }, 500);\n                }\n            };\n            \n            removeNextItem();\n        }\n\n        // ===== SETUP INPUT HANDLERS =====\n        function setupInputHandlers() {\n            // Verify canvas exists\n            if (!canvas) {\n                lib.log('Error: Canvas element not found');\n                return;\n            }\n            \n            // Canvas mouse/touch for frosting and decoration dragging\n            canvas.addEventListener('mousedown', (e) => {\n                if (currentMode !== 'play' || gameState.gamePhase !== 'playing') return;\n                \n                const rect = canvas.getBoundingClientRect();\n                const canvasX = ((e.clientX - rect.left) / rect.width) * canvas.width;\n                const canvasY = ((e.clientY - rect.top) / rect.height) * canvas.height;\n                \n                // Check if clicking on a decoration\n                const decorationIndex = getDecorationAtPoint(canvasX, canvasY);\n                if (decorationIndex !== null) {\n                    // Start dragging existing decoration\n                    const decoration = gameState.decorations[decorationIndex];\n                    startDrag(decoration.type, e.clientX, e.clientY, decorationIndex);\n                } else {\n                    // Handle frosting\n                    handleCakeClick(canvasX, canvasY);\n                }\n            });\n            \n            // Touch for frosting and decoration dragging\n            canvas.addEventListener('touchstart', (e) => {\n                if (currentMode !== 'play' || gameState.gamePhase !== 'playing') return;\n                e.preventDefault();\n                \n                const touch = e.touches[0];\n                const rect = canvas.getBoundingClientRect();\n                const canvasX = ((touch.clientX - rect.left) / rect.width) * canvas.width;\n                const canvasY = ((touch.clientY - rect.top) / rect.height) * canvas.height;\n                \n                // Check if touching a decoration\n                const decorationIndex = getDecorationAtPoint(canvasX, canvasY);\n                if (decorationIndex !== null) {\n                    // Start dragging existing decoration\n                    const decoration = gameState.decorations[decorationIndex];\n                    startDrag(decoration.type, touch.clientX, touch.clientY, decorationIndex);\n                } else {\n                    // Handle frosting\n                    handleCakeClick(canvasX, canvasY);\n                }\n            });\n            \n            // Decoration palette drag\n            const palette = document.getElementById('decoration-palette');\n            \n            palette.addEventListener('mousedown', (e) => {\n                if (currentMode !== 'play' || gameState.gamePhase !== 'playing') return;\n                \n                const decorationItem = e.target.closest('.decoration-item');\n                if (decorationItem) {\n                    const decorationType = decorationItem.dataset.type;\n                    \n                    // Get the exact screen position of this palette item\n                    const rect = decorationItem.getBoundingClientRect();\n                    const centerX = rect.left + rect.width / 2;\n                    const centerY = rect.top + rect.height / 2;\n                    \n                    startDrag(decorationType, e.clientX, e.clientY, null, centerX, centerY);\n                }\n            });\n            \n            palette.addEventListener('touchstart', (e) => {\n                if (currentMode !== 'play' || gameState.gamePhase !== 'playing') return;\n                \n                const decorationItem = e.target.closest('.decoration-item');\n                if (decorationItem) {\n                    const touch = e.touches[0];\n                    const decorationType = decorationItem.dataset.type;\n                    \n                    // Get the exact screen position of this palette item\n                    const rect = decorationItem.getBoundingClientRect();\n                    const centerX = rect.left + rect.width / 2;\n                    const centerY = rect.top + rect.height / 2;\n                    \n                    startDrag(decorationType, touch.clientX, touch.clientY, null, centerX, centerY);\n                }\n            });\n            \n            // Global drag handlers\n            document.addEventListener('mousemove', (e) => {\n                if (dragState.isDragging) {\n                    updateDragPosition(e.clientX, e.clientY);\n                }\n            });\n            \n            document.addEventListener('touchmove', (e) => {\n                if (dragState.isDragging) {\n                    const touch = e.touches[0];\n                    updateDragPosition(touch.clientX, touch.clientY);\n                }\n            });\n            \n            document.addEventListener('mouseup', () => {\n                if (dragState.isDragging) {\n                    endDrag();\n                }\n            });\n            \n            document.addEventListener('touchend', () => {\n                if (dragState.isDragging) {\n                    endDrag();\n                }\n            });\n            \n            // Button handlers\n            const btnUndo = document.getElementById('btn-undo');\n            const btnClear = document.getElementById('btn-clear');\n            const btnDone = document.getElementById('btn-done');\n            const nextButton = document.getElementById('next-button');\n            const galleryButton = document.getElementById('gallery-button');\n            const galleryClose = document.getElementById('gallery-close');\n            const hintButtonCard = document.getElementById('hint-button-card');\n            const hintModalClose = document.getElementById('hint-modal-close');\n            \n            if (btnUndo) btnUndo.addEventListener('click', undo);\n            if (btnClear) btnClear.addEventListener('click', clearAll);\n            if (btnDone) btnDone.addEventListener('click', () => {\n                if (gameState.gameMode === 'free') {\n                    // In free mode, \"Save & Clear\" button saves to gallery\n                    saveCakeToGallery();\n                } else if (gameState.gamePhase === 'playing') {\n                    // In challenge mode, \"Done\" button ends the round\n                    endRound();\n                }\n            });\n            \n            if (nextButton) nextButton.addEventListener('click', nextRound);\n            \n            // Gallery button handler\n            if (galleryButton) galleryButton.addEventListener('click', showGallery);\n            \n            // Gallery close button\n            if (galleryClose) galleryClose.addEventListener('click', hideGallery);\n            \n            // Hint button handlers (both inline and card)\n            const showHintModal = () => {\n                if (gameState.gameMode === 'challenge' && gameState.currentPrompt) {\n                    const hint = gameState.currentPrompt.hint || 'Match the frosting colors and add the required toppings!';\n                    document.getElementById('hint-modal-text').textContent = hint;\n                    document.getElementById('hint-modal').classList.add('active');\n                }\n            };\n            \n            const hintButton = document.getElementById('hint-button');\n            if (hintButton) hintButton.addEventListener('click', showHintModal);\n            if (hintButtonCard) hintButtonCard.addEventListener('click', showHintModal);\n            \n            // Hint modal close button\n            if (hintModalClose) hintModalClose.addEventListener('click', () => {\n                document.getElementById('hint-modal').classList.remove('active');\n            });\n            \n            // Mode selector buttons\n            const modeSelector = document.getElementById('mode-selector');\n            if (modeSelector) {\n                modeSelector.addEventListener('click', (e) => {\n                    const modeBtn = e.target.closest('.mode-btn');\n                    if (modeBtn && currentMode === 'play') {\n                        const newMode = modeBtn.dataset.mode;\n                        \n                        // Update button states\n                        modeSelector.querySelectorAll('.mode-btn').forEach(btn => {\n                            btn.classList.remove('active');\n                        });\n                        modeBtn.classList.add('active');\n                        \n                        // Switch game mode\n                        gameState.gameMode = newMode;\n                        window.gameConfig.gameMode = newMode;\n                        \n                        // Reset game state for new mode\n                        gameState.round = 1;\n                        gameState.totalScore = 0;\n                        gameState.cakeFrosting = [null, null, null];\n                        gameState.decorations = [];\n                        gameState.selectedFrostingColor = null;\n                        gameState.actionHistory = [];\n                        gameState.gamePhase = 'playing';\n                        \n                        if (newMode === 'challenge') {\n                            gameState.timeRemaining = gameState.maxTime;\n                            selectNextPrompt();\n                        } else {\n                            gameState.currentPrompt = null;\n                        }\n                        \n                        updateFrostingPaletteUI();\n                        updateUIForGameMode();\n                        setMascotState('happy');\n                        \n                        // Close results screen if open\n                        document.getElementById('results-screen').classList.remove('active');\n                    }\n                });\n            }\n            \n            // Keyboard shortcuts\n            document.addEventListener('keydown', (e) => {\n                if (currentMode !== 'play' || gameState.gamePhase !== 'playing') return;\n                \n                if (e.key === 'z' || e.key === 'Z') {\n                    undo();\n                } else if (e.key === 'c' || e.key === 'C') {\n                    clearAll();\n                } else if (e.key === 'Enter' || e.key === ' ') {\n                    endRound();\n                }\n            });\n        }\n\n        // ===== POPULATE FROSTING PALETTE =====\n        function populateFrostingPalette() {\n            const palette = document.getElementById('frosting-palette');\n            palette.innerHTML = '';\n            \n            // Mermaid themed frosting names\n            const themedNames = {\n                'coral': '\ud83e\udeb8 Coral Reef',\n                'ocean': '\ud83c\udf0a Ocean Blue',\n                'turquoise': '\ud83d\udc8e Turquoise Wave',\n                'pearl': '\ud83e\uddaa Pearl White',\n                'seafoam': '\ud83e\udee7 Seafoam Green',\n                'aquamarine': '\ud83d\udc9a Aquamarine',\n                'lavender': '\ud83d\udc9c Lavender Sea',\n                'pink': '\ud83e\ude77 Pink Coral',\n                'shell': '\ud83d\udc1a Seashell',\n                'seaweed': '\ud83c\udf3f Seaweed Green',\n                'starfish': '\u2b50 Starfish Gold',\n                'moonlight': '\ud83c\udf19 Moonlight',\n                'tide': '\ud83c\udf0a Tidal Blue',\n                'bubble': '\ud83e\udee7 Bubble White',\n                'scales': '\ud83d\udc20 Rainbow Scales',\n                'sunset': '\ud83c\udf05 Sunset Orange',\n                'abyss': '\ud83c\udf11 Deep Abyss',\n                'tropical': '\ud83c\udfdd\ufe0f Tropical Paradise',\n                'lagoon': '\ud83c\udfd6\ufe0f Lagoon Waters',\n                'sapphire': '\ud83d\udc8e Sapphire Gem',\n                'opal': '\u2728 Opal Shimmer',\n                'sand': '\ud83c\udfd6\ufe0f Sandy Beach'\n            };\n            \n            for (let i = 0; i < frostingColors.length; i++) {\n                const color = frostingColors[i];\n                \n                if (window.gameConfig.availableFrostingColors[color] === false) continue;\n                \n                const item = document.createElement('div');\n                item.className = 'frosting-item';\n                item.dataset.colorIndex = i;\n                \n                // Get the frosting texture image\n                const frostingAssetId = `frosting_${color}`;\n                const frostingImg = assetCache.images[frostingAssetId];\n                \n                if (frostingImg) {\n                    // Use the actual frosting texture as background\n                    item.style.backgroundImage = `url('${frostingImg.src}')`;\n                    item.style.backgroundSize = 'cover';\n                    item.style.backgroundPosition = 'center';\n                } else {\n                    // Fallback to solid color if texture not available\n                    const colorMap = {\n                        'coral': '#FF7F50',\n                        'ocean': '#006994',\n                        'turquoise': '#40E0D0',\n                        'pearl': '#F0EAD6',\n                        'seafoam': '#93E9BE',\n                        'aquamarine': '#7FFFD4',\n                        'lavender': '#E6E6FA',\n                        'pink': '#FFB6D9',\n                        'shell': '#FFF5EE',\n                        'seaweed': '#2E8B57',\n                        'starfish': '#FFD700',\n                        'moonlight': 'linear-gradient(135deg, #E0F2FE 0%, #DBEAFE 50%, #BFDBFE 100%)',\n                        'tide': '#4682B4',\n                        'bubble': '#E0F7FA',\n                        'scales': 'linear-gradient(135deg, #FF6B9D 0%, #C239B3 25%, #7E40FF 50%, #4E9FFF 75%, #00D4FF 100%)',\n                        'sunset': '#FF6347',\n                        'abyss': '#191970',\n                        'tropical': '#00CED1',\n                        'lagoon': '#20B2AA',\n                        'sapphire': '#0F52BA',\n                        'opal': 'linear-gradient(135deg, #FFB6D9 0%, #B8E6FF 25%, #D4F1F4 50%, #FFE5B4 75%, #E6E6FA 100%)',\n                        'sand': '#C2B280'\n                    };\n                    \n                    if (colorMap[color]) {\n                        if (color === 'scales' || color === 'moonlight' || color === 'opal') {\n                            item.style.background = colorMap[color];\n                        } else {\n                            item.style.backgroundColor = colorMap[color];\n                        }\n                    } else {\n                        item.style.backgroundColor = '#CCC';\n                    }\n                }\n                \n                // Create container for swatch + label\n                const container = document.createElement('div');\n                container.style.cssText = 'display: flex; flex-direction: column; align-items: center; gap: 6px; min-width: 80px;';\n                container.dataset.colorIndex = i;\n                \n                // Create label below swatch\n                const label = document.createElement('div');\n                label.style.cssText = 'font-family: \"Fredoka\", sans-serif; font-size: 14px; font-weight: 700; color: var(--color-text); text-align: center; max-width: 80px; word-wrap: break-word; line-height: 1.3;';\n                label.textContent = themedNames[color] || (color.charAt(0).toUpperCase() + color.slice(1));\n                \n                container.addEventListener('click', () => {\n                    // Toggle selection\n                    if (gameState.selectedFrostingColor === i) {\n                        gameState.selectedFrostingColor = null;\n                    } else {\n                        gameState.selectedFrostingColor = i;\n                    }\n                    updateFrostingPaletteUI();\n                });\n                \n                container.appendChild(item);\n                container.appendChild(label);\n                palette.appendChild(container);\n            }\n        }\n\n        function updateFrostingPaletteUI() {\n            const containers = document.querySelectorAll('#frosting-palette > div');\n            containers.forEach((container) => {\n                const colorIndex = parseInt(container.dataset.colorIndex);\n                const swatch = container.querySelector('.frosting-item');\n                if (swatch) {\n                    if (colorIndex === gameState.selectedFrostingColor) {\n                        swatch.classList.add('selected');\n                    } else {\n                        swatch.classList.remove('selected');\n                    }\n                }\n            });\n        }\n\n        // ===== POPULATE DECORATION PALETTE =====\n        function populateDecorationPalette() {\n            const palette = document.getElementById('decoration-palette');\n            palette.innerHTML = '';\n            \n            for (const type of decorationTypes) {\n                if (window.gameConfig.availableDecorations[type] === false) continue;\n                \n                const item = document.createElement('div');\n                item.className = 'decoration-item';\n                item.dataset.type = type;\n                \n                const img = document.createElement('img');\n                const decorationAssetId = `decoration_${type}`;\n                const assetInfo = lib.getAsset(decorationAssetId);\n                \n                img.src = assetCache.images[decorationAssetId]?.src || '';\n                img.alt = type;\n                \n                // Explicitly maintain aspect ratio\n                if (assetInfo && assetInfo.aspect_ratio) {\n                    const [aspectW, aspectH] = assetInfo.aspect_ratio;\n                    const aspectRatio = aspectW / aspectH;\n                    \n                    // Set explicit dimensions to maintain aspect ratio\n                    // within the 96x96 container, using 70% size\n                    const maxSize = 96 * 0.7; // 67.2px\n                    \n                    if (aspectRatio > 1) {\n                        // Wider than tall\n                        img.style.width = maxSize + 'px';\n                        img.style.height = (maxSize / aspectRatio) + 'px';\n                    } else {\n                        // Taller than wide or square\n                        img.style.height = maxSize + 'px';\n                        img.style.width = (maxSize * aspectRatio) + 'px';\n                    }\n                } else {\n                    // Fallback to CSS sizing\n                    img.style.width = '70%';\n                    img.style.height = '70%';\n                }\n                \n                img.style.objectFit = 'contain';\n                \n                item.appendChild(img);\n                palette.appendChild(item);\n            }\n        }\n\n        // ===== GAME LOOP =====\n        function gameLoop(timestamp) {\n            const deltaTime = Math.min((timestamp - gameState.lastFrameTime) / 1000, 0.11);\n            gameState.lastFrameTime = timestamp;\n            \n            if (currentMode === 'play') {\n                updateGame(deltaTime);\n                renderGame();\n            }\n            \n            requestAnimationFrame(gameLoop);\n        }\n\n        // ===== EDIT MODE =====\n        function setupEditMode() {\n            const editPanel = document.getElementById('edit-panel');\n            editPanel.classList.add('active');\n            \n            // Setup tabs\n            const tabs = document.querySelectorAll('.edit-tab');\n            tabs.forEach(tab => {\n                tab.addEventListener('click', () => {\n                    tabs.forEach(t => t.classList.remove('active'));\n                    tab.classList.add('active');\n                    \n                    const tabName = tab.dataset.tab;\n                    showEditSection(tabName);\n                });\n            });\n            \n            // Show initial section\n            showEditSection('prompts');\n        }\n\n        function showEditSection(sectionName) {\n            const content = document.getElementById('edit-content');\n            content.innerHTML = '';\n            \n            if (sectionName === 'prompts') {\n                renderPromptsSection(content);\n            } else if (sectionName === 'timer') {\n                renderTimerSection(content);\n            } else if (sectionName === 'decorations') {\n                renderDecorationsSection(content);\n            }\n        }\n\n        function renderPromptsSection(container) {\n            const section = document.createElement('div');\n            section.className = 'edit-section active';\n            \n            const title = document.createElement('div');\n            title.className = 'setting-label';\n            title.textContent = 'Prompt Library';\n            section.appendChild(title);\n            \n            const promptList = document.createElement('div');\n            promptList.className = 'prompt-list';\n            \n            window.gameConfig.prompts.forEach((prompt, index) => {\n                const promptItem = document.createElement('div');\n                promptItem.className = 'prompt-item';\n                \n                const promptTitle = document.createElement('div');\n                promptTitle.className = 'prompt-item-title';\n                promptTitle.textContent = prompt.name;\n                promptItem.appendChild(promptTitle);\n                \n                const promptDesc = document.createElement('div');\n                promptDesc.textContent = prompt.description;\n                promptDesc.style.fontSize = '16px';\n                promptDesc.style.color = '#666';\n                promptDesc.style.marginBottom = '8px';\n                promptItem.appendChild(promptDesc);\n                \n                const enableCheckbox = document.createElement('label');\n                enableCheckbox.innerHTML = `\n                    <input type=\"checkbox\" ${prompt.enabled !== false ? 'checked' : ''}>\n                    Enabled\n                `;\n                enableCheckbox.style.display = 'flex';\n                enableCheckbox.style.alignItems = 'center';\n                enableCheckbox.style.gap = '8px';\n                enableCheckbox.querySelector('input').addEventListener('change', (e) => {\n                    window.gameConfig.prompts[index].enabled = e.target.checked;\n                });\n                promptItem.appendChild(enableCheckbox);\n                \n                promptList.appendChild(promptItem);\n            });\n            \n            section.appendChild(promptList);\n            container.appendChild(section);\n        }\n\n        function renderTimerSection(container) {\n            const section = document.createElement('div');\n            section.className = 'edit-section active';\n            \n            // Start Time\n            const startTimeGroup = document.createElement('div');\n            startTimeGroup.className = 'setting-group';\n            startTimeGroup.innerHTML = `\n                <div class=\"setting-label\">Starting Time (seconds)</div>\n                <input type=\"number\" class=\"setting-input\" min=\"20\" max=\"120\" value=\"${window.gameConfig.timerSettings.startTime}\">\n            `;\n            startTimeGroup.querySelector('input').addEventListener('change', (e) => {\n                window.gameConfig.timerSettings.startTime = Math.max(20, Math.min(120, parseInt(e.target.value)));\n            });\n            section.appendChild(startTimeGroup);\n            \n            // Reduction Per Round\n            const reductionGroup = document.createElement('div');\n            reductionGroup.className = 'setting-group';\n            reductionGroup.innerHTML = `\n                <div class=\"setting-label\">Time Reduction Per Round (seconds)</div>\n                <input type=\"number\" class=\"setting-input\" min=\"0\" max=\"10\" value=\"${window.gameConfig.timerSettings.reductionPerRound}\">\n            `;\n            reductionGroup.querySelector('input').addEventListener('change', (e) => {\n                window.gameConfig.timerSettings.reductionPerRound = Math.max(0, Math.min(10, parseInt(e.target.value)));\n            });\n            section.appendChild(reductionGroup);\n            \n            // Minimum Time\n            const minTimeGroup = document.createElement('div');\n            minTimeGroup.className = 'setting-group';\n            minTimeGroup.innerHTML = `\n                <div class=\"setting-label\">Minimum Time (seconds)</div>\n                <input type=\"number\" class=\"setting-input\" min=\"20\" max=\"60\" value=\"${window.gameConfig.timerSettings.minTime}\">\n            `;\n            minTimeGroup.querySelector('input').addEventListener('change', (e) => {\n                window.gameConfig.timerSettings.minTime = Math.max(20, Math.min(60, parseInt(e.target.value)));\n            });\n            section.appendChild(minTimeGroup);\n            \n            container.appendChild(section);\n        }\n\n        function renderDecorationsSection(container) {\n            const section = document.createElement('div');\n            section.className = 'edit-section active';\n            \n            // Decorations\n            const decorationsGroup = document.createElement('div');\n            decorationsGroup.className = 'setting-group';\n            decorationsGroup.innerHTML = '<div class=\"setting-label\">Available Decorations</div>';\n            \n            const decorationsCheckboxes = document.createElement('div');\n            decorationsCheckboxes.className = 'checkbox-group';\n            \n            decorationTypes.forEach(type => {\n                const checkboxItem = document.createElement('div');\n                checkboxItem.className = 'checkbox-item';\n                checkboxItem.innerHTML = `\n                    <input type=\"checkbox\" id=\"dec-${type}\" ${window.gameConfig.availableDecorations[type] !== false ? 'checked' : ''}>\n                    <label for=\"dec-${type}\">${type}</label>\n                `;\n                checkboxItem.querySelector('input').addEventListener('change', (e) => {\n                    window.gameConfig.availableDecorations[type] = e.target.checked;\n                    populateDecorationPalette();\n                });\n                decorationsCheckboxes.appendChild(checkboxItem);\n            });\n            \n            decorationsGroup.appendChild(decorationsCheckboxes);\n            section.appendChild(decorationsGroup);\n            \n            // Frosting Colors\n            const frostingGroup = document.createElement('div');\n            frostingGroup.className = 'setting-group';\n            frostingGroup.innerHTML = '<div class=\"setting-label\">Available Frosting Colors</div>';\n            \n            const frostingCheckboxes = document.createElement('div');\n            frostingCheckboxes.className = 'checkbox-group';\n            \n            frostingColors.forEach(color => {\n                const checkboxItem = document.createElement('div');\n                checkboxItem.className = 'checkbox-item';\n                checkboxItem.innerHTML = `\n                    <input type=\"checkbox\" id=\"frost-${color}\" ${window.gameConfig.availableFrostingColors[color] !== false ? 'checked' : ''}>\n                    <label for=\"frost-${color}\">${color}</label>\n                `;\n                checkboxItem.querySelector('input').addEventListener('change', (e) => {\n                    window.gameConfig.availableFrostingColors[color] = e.target.checked;\n                });\n                frostingCheckboxes.appendChild(checkboxItem);\n            });\n            \n            frostingGroup.appendChild(frostingCheckboxes);\n            section.appendChild(frostingGroup);\n            \n            container.appendChild(section);\n        }\n\n        // ===== RUN FUNCTION =====\n        async function run(mode) {\n            lib.log('run() called. Mode: ' + mode);\n            currentMode = mode;\n            \n            // Create cute loading decorations\n            createLoadingDecorations();\n            \n            // Preload assets\n            await preloadAssets();\n            \n            // Load gallery from persistent storage\n            await loadGallery();\n            \n            // Hide loading screen\n            hideLoadingScreen();\n            \n            // Initialize game state\n            initializeGameState();\n            \n            // Initialize mascot\n            initMascot();\n            \n            // Setup input handlers\n            setupInputHandlers();\n            \n            // Populate frosting and decoration palettes\n            populateFrostingPalette();\n            populateDecorationPalette();\n            \n            // Update mode selector UI\n            const modeSelector = document.getElementById('mode-selector');\n            if (modeSelector) {\n                modeSelector.querySelectorAll('.mode-btn').forEach(btn => {\n                    if (btn.dataset.mode === gameState.gameMode) {\n                        btn.classList.add('active');\n                    } else {\n                        btn.classList.remove('active');\n                    }\n                });\n            }\n            \n            if (mode === 'play') {\n                // Hide edit panel\n                document.getElementById('edit-panel').classList.remove('active');\n                \n                // Render initial frame immediately\n                renderGame();\n                \n                // Start background music\n                startBackgroundMusic();\n                \n                // Start game loop\n                gameState.lastFrameTime = performance.now();\n                requestAnimationFrame(gameLoop);\n            } else if (mode === 'edit') {\n                // Setup edit mode\n                setupEditMode();\n                \n                // Render cake in edit mode too\n                renderGame();\n            }\n            \n            // Show game parameters\n            lib.showGameParameters({\n                name: 'Game Settings',\n                params: {\n                    'Starting Time': {\n                        key: 'gameConfig.timerSettings.startTime',\n                        type: 'slider',\n                        min: 20,\n                        max: 120,\n                        step: 5,\n                        onChange: (value) => {\n                            window.gameConfig.timerSettings.startTime = value;\n                        }\n                    },\n                    'Time Reduction': {\n                        key: 'gameConfig.timerSettings.reductionPerRound',\n                        type: 'slider',\n                        min: 0,\n                        max: 10,\n                        step: 1,\n                        onChange: (value) => {\n                            window.gameConfig.timerSettings.reductionPerRound = value;\n                        }\n                    }\n                }\n            });\n        }\n    </script>\n</body>\n</html>", "game_config": "{\"prompts\":[{\"name\":\"Coral Reef\",\"description\":\"Vibrant coral frosting with ocean treasures\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"coral\"},{\"tier\":1,\"color\":\"pink\"},{\"tier\":2,\"color\":\"coral\"}],\"requiredDecorations\":[{\"type\":\"starfish\",\"minCount\":3},{\"type\":\"coral\",\"minCount\":2}],\"enabled\":true,\"difficulty\":\"easy\",\"hint\":\"Bright coral colors with starfish decorations!\"},{\"name\":\"Pearl Princess\",\"description\":\"Elegant pearl white with seashell accents\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"pearl\"},{\"tier\":1,\"color\":\"shell\"},{\"tier\":2,\"color\":\"pearl\"}],\"requiredDecorations\":[{\"minCount\":3,\"type\":\"pearl\"},{\"minCount\":2,\"type\":\"seashell\"}],\"enabled\":true,\"difficulty\":\"medium\",\"hint\":\"Pure pearl and shell tiers with seashells!\"},{\"name\":\"Ocean Waves\",\"description\":\"Deep ocean blue with turquoise tide\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"ocean\"},{\"tier\":1,\"color\":\"turquoise\"},{\"tier\":2,\"color\":\"tide\"}],\"requiredDecorations\":[{\"minCount\":3,\"type\":\"fish\"},{\"minCount\":2,\"type\":\"bubbles\"}],\"enabled\":true,\"difficulty\":\"medium\",\"hint\":\"Layer ocean blues from deep to bright with fish!\"},{\"name\":\"Mermaid Lagoon\",\"description\":\"Magical aquamarine and seafoam paradise\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"aquamarine\"},{\"tier\":1,\"color\":\"seafoam\"},{\"tier\":2,\"color\":\"bubble\"}],\"requiredDecorations\":[{\"minCount\":3,\"type\":\"seahorse\"},{\"minCount\":2,\"type\":\"mermaid_tail\"}],\"enabled\":true,\"difficulty\":\"hard\",\"hint\":\"Mix greens and aquas for a magical lagoon!\"},{\"name\":\"Sunset Beach\",\"description\":\"Warm sunset orange with coral accents\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"sunset\"},{\"tier\":1,\"color\":\"coral\"},{\"tier\":2,\"color\":\"pink\"}],\"requiredDecorations\":[{\"minCount\":3,\"type\":\"starfish\"},{\"minCount\":2,\"type\":\"coral\"}],\"enabled\":true,\"difficulty\":\"hard\",\"hint\":\"Warm sunset colors with starfish treasures!\"},{\"name\":\"Seaweed Garden\",\"description\":\"Lush seaweed green with aquamarine\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"seaweed\"},{\"tier\":1,\"color\":\"aquamarine\"},{\"tier\":2,\"color\":\"seafoam\"}],\"requiredDecorations\":[{\"minCount\":3,\"type\":\"fish\"},{\"minCount\":2,\"type\":\"seahorse\"}],\"enabled\":true,\"difficulty\":\"medium\",\"hint\":\"Green and aqua layers with swimming creatures!\"},{\"name\":\"Rainbow Scales\",\"description\":\"Shimmering rainbow mermaid scales\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"scales\"},{\"tier\":1,\"color\":\"scales\"},{\"tier\":2,\"color\":\"scales\"}],\"requiredDecorations\":[{\"minCount\":4,\"type\":\"starfish\"},{\"minCount\":2,\"type\":\"bubbles\"}],\"enabled\":true,\"difficulty\":\"easy\",\"hint\":\"Rainbow scales everywhere with bubbles!\"},{\"name\":\"Moonlit Tide\",\"description\":\"Mystical moonlight over ocean waves\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"moonlight\"},{\"tier\":1,\"color\":\"tide\"},{\"tier\":2,\"color\":\"moonlight\"}],\"requiredDecorations\":[{\"minCount\":3,\"type\":\"pearl\"},{\"minCount\":2,\"type\":\"seashell\"}],\"enabled\":true,\"difficulty\":\"medium\",\"hint\":\"Pale moonlight and deep blue with pearls!\"},{\"name\":\"Treasure Trove\",\"description\":\"Golden starfish with coral treasures\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"starfish\"},{\"tier\":1,\"color\":\"coral\"},{\"tier\":2,\"color\":\"starfish\"}],\"requiredDecorations\":[{\"minCount\":3,\"type\":\"crown\"},{\"minCount\":2,\"type\":\"treasure_chest\"}],\"enabled\":true,\"difficulty\":\"medium\",\"hint\":\"Gold and coral with treasure decorations!\"},{\"name\":\"Lavender Sea\",\"description\":\"Dreamy lavender ocean with pink coral\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"lavender\"},{\"tier\":1,\"color\":\"pink\"},{\"tier\":2,\"color\":\"lavender\"}],\"requiredDecorations\":[{\"minCount\":4,\"type\":\"pearl\"},{\"minCount\":2,\"type\":\"dolphin\"}],\"enabled\":true,\"difficulty\":\"hard\",\"hint\":\"Soft purples and pinks with dolphins!\"},{\"name\":\"Jellyfish Garden\",\"description\":\"Colorful jellyfish floating through the ocean\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"ocean\"},{\"tier\":1,\"color\":\"turquoise\"},{\"tier\":2,\"color\":\"seafoam\"}],\"requiredDecorations\":[{\"minCount\":2,\"type\":\"jellyfish\"},{\"minCount\":2,\"type\":\"jellyfish_blue\"},{\"minCount\":2,\"type\":\"jellyfish_purple\"}],\"enabled\":true,\"difficulty\":\"hard\",\"hint\":\"Mix colorful jellyfish with ocean blues!\"},{\"name\":\"Bioluminescent Deep\",\"description\":\"Magical glowing jellyfish in the deep sea\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"moonlight\"},{\"tier\":1,\"color\":\"scales\"},{\"tier\":2,\"color\":\"bubble\"}],\"requiredDecorations\":[{\"minCount\":3,\"type\":\"jellyfish_bioluminescent\"},{\"minCount\":2,\"type\":\"jellyfish_orange\"}],\"enabled\":true,\"difficulty\":\"hard\",\"hint\":\"Glowing jellyfish with magical frostings!\"},{\"name\":\"Sparkle Wonderland\",\"description\":\"Dazzling sparkle frosting with magic crystals\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"sparkle\"},{\"tier\":1,\"color\":\"sparkle\"},{\"tier\":2,\"color\":\"sparkle\"}],\"requiredDecorations\":[{\"minCount\":3,\"type\":\"magic_crystal\"},{\"minCount\":2,\"type\":\"magic_wand\"}],\"enabled\":true,\"difficulty\":\"medium\",\"hint\":\"Shimmering sparkles everywhere with magical items!\"},{\"name\":\"Galaxy Dreams\",\"description\":\"Cosmic galaxy frosting with stars and moons\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"galaxy\"},{\"tier\":1,\"color\":\"galaxy\"},{\"tier\":2,\"color\":\"galaxy\"}],\"requiredDecorations\":[{\"minCount\":3,\"type\":\"magic_moon\"},{\"minCount\":2,\"type\":\"cute_ghost\"}],\"enabled\":true,\"difficulty\":\"medium\",\"hint\":\"Deep space colors with mystical decorations!\"},{\"name\":\"Aurora Borealis\",\"description\":\"Northern lights with soft pastels\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"aurora\"},{\"tier\":1,\"color\":\"aurora\"},{\"tier\":2,\"color\":\"aurora\"}],\"requiredDecorations\":[{\"minCount\":3,\"type\":\"fantasy_butterfly\"},{\"minCount\":2,\"type\":\"magic_potion\"}],\"enabled\":true,\"difficulty\":\"hard\",\"hint\":\"Gentle aurora glow with fantasy creatures!\"},{\"name\":\"Flame Fantasy\",\"description\":\"Fiery Phoenix with passionate colors\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"fire\"},{\"tier\":1,\"color\":\"fire\"},{\"tier\":2,\"color\":\"sunset\"}],\"requiredDecorations\":[{\"minCount\":2,\"type\":\"chibi_phoenix\"},{\"minCount\":2,\"type\":\"chibi_dragon\"}],\"enabled\":true,\"difficulty\":\"hard\",\"hint\":\"Fiery flames with magical creatures!\"},{\"name\":\"Winter Wonderland\",\"description\":\"Frosty crystalline ice cake\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"crystalice\"},{\"tier\":1,\"color\":\"glacier\"},{\"tier\":2,\"color\":\"frostbite\"}],\"requiredDecorations\":[{\"minCount\":3,\"type\":\"snowflake\"},{\"minCount\":2,\"type\":\"snowman\"}],\"enabled\":true,\"difficulty\":\"medium\",\"hint\":\"Icy blue layers with winter decorations!\"},{\"name\":\"Blizzard Blast\",\"description\":\"Swirling blizzard with snow crystals\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"blizzard\"},{\"tier\":1,\"color\":\"winternight\"},{\"tier\":2,\"color\":\"blizzard\"}],\"requiredDecorations\":[{\"minCount\":3,\"type\":\"ice_crystal\"},{\"minCount\":2,\"type\":\"snowman\"}],\"enabled\":true,\"difficulty\":\"hard\",\"hint\":\"Windy blues with ice decorations!\"},{\"name\":\"Enchanted Forest\",\"description\":\"Magical forest with fantasy creatures\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"sparkle\"},{\"tier\":1,\"color\":\"aurora\"},{\"tier\":2,\"color\":\"sparkle\"}],\"requiredDecorations\":[{\"minCount\":2,\"type\":\"chibi_unicorn\"},{\"minCount\":2,\"type\":\"chibi_fairy\"},{\"minCount\":2,\"type\":\"fantasy_flower\"}],\"enabled\":true,\"difficulty\":\"hard\",\"hint\":\"Magical sparkles with fantasy friends!\"},{\"name\":\"Festive Holiday\",\"description\":\"Jolly Christmas celebration cake\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"glacier\"},{\"tier\":1,\"color\":\"winternight\"},{\"tier\":2,\"color\":\"glacier\"}],\"requiredDecorations\":[{\"minCount\":2,\"type\":\"reindeer\"},{\"minCount\":2,\"type\":\"gift_box\"},{\"minCount\":2,\"type\":\"candy_cane\"}],\"enabled\":true,\"difficulty\":\"medium\",\"hint\":\"Snowy blues with holiday decorations!\"},{\"name\":\"Penguin Party\",\"description\":\"Arctic penguin celebration\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"frostbite\"},{\"tier\":1,\"color\":\"glacier\"},{\"tier\":2,\"color\":\"frostbite\"}],\"requiredDecorations\":[{\"minCount\":3,\"type\":\"penguin\"},{\"minCount\":2,\"type\":\"polar_bear\"}],\"enabled\":true,\"difficulty\":\"medium\",\"hint\":\"Deep ice blues with arctic creatures!\"},{\"name\":\"Magical Potion\",\"description\":\"Bubbling magical potions and spells\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"bubble\"},{\"tier\":1,\"color\":\"galaxy\"},{\"tier\":2,\"color\":\"bubble\"}],\"requiredDecorations\":[{\"minCount\":3,\"type\":\"magic_potion\"},{\"minCount\":2,\"type\":\"magic_wand\"}],\"enabled\":true,\"difficulty\":\"hard\",\"hint\":\"Mystical bubbles with enchanted items!\"},{\"name\":\"Dragon's Treasure\",\"description\":\"Dragon's hoard of sparkles and gems\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"galaxy\"},{\"tier\":1,\"color\":\"sparkle\"},{\"tier\":2,\"color\":\"galaxy\"}],\"requiredDecorations\":[{\"minCount\":2,\"type\":\"chibi_dragon\"},{\"minCount\":3,\"type\":\"magic_crystal\"}],\"enabled\":true,\"difficulty\":\"hard\",\"hint\":\"Cosmic and sparkly with dragon friends!\"},{\"name\":\"Lantern Glow\",\"description\":\"Magical floating lanterns light the way\",\"requiredFrosting\":[{\"tier\":0,\"color\":\"fire\"},{\"tier\":1,\"color\":\"sunset\"},{\"tier\":2,\"color\":\"fire\"}],\"requiredDecorations\":[{\"minCount\":3,\"type\":\"floating_lantern\"},{\"minCount\":2,\"type\":\"magic_moon\"}],\"enabled\":true,\"difficulty\":\"medium\",\"hint\":\"Warm glowing colors with magical lights!\"}],\"timerSettings\":{\"startTime\":20,\"reductionPerRound\":0,\"minTime\":40},\"availableDecorations\":{\"anchor\":true,\"arctic_fox\":false,\"blue_jay\":false,\"bubbles\":true,\"candy_cane\":false,\"cardinal\":false,\"chibi_bunny\":false,\"chibi_dragon\":false,\"chibi_fairy\":false,\"chibi_fox\":false,\"chibi_owl\":false,\"chibi_pegasus\":false,\"chibi_phoenix\":false,\"chibi_unicorn\":false,\"conch\":true,\"coral\":true,\"cute_ghost\":false,\"dolphin\":true,\"fantasy_butterfly\":false,\"fantasy_crown\":false,\"fantasy_flower\":false,\"fire\":false,\"fish\":true,\"floating_lantern\":false,\"gingerbread\":true,\"gift_box\":false,\"hot_cocoa\":false,\"ice_crystal\":false,\"ice_skates\":false,\"icicle\":false,\"icicle_lights\":false,\"igloo\":false,\"jellyfish\":true,\"jellyfish_bioluminescent\":true,\"jellyfish_blue\":true,\"jellyfish_orange\":true,\"jellyfish_purple\":true,\"magic_crystal\":false,\"magic_moon\":false,\"magic_potion\":true,\"magic_wand\":false,\"mermaid_tail\":true,\"mittens\":false,\"octopus\":true,\"ornament\":false,\"pearl\":true,\"penguin\":true,\"pine_tree\":false,\"polar_bear\":false,\"reindeer\":true,\"sand_dollar\":true,\"seahorse\":true,\"seashell\":true,\"sea_turtle\":true,\"sled\":false,\"sleigh_bell\":false,\"snowflake\":false,\"snowglobe\":false,\"snowman\":true,\"starfish\":true,\"treasure_chest\":true,\"trident\":true,\"winter_boots\":false,\"winter_scarf\":false,\"wreath\":false,\"mermaid\":true,\"merman\":true,\"mermaid_warrior\":true,\"merman_adventurer\":true,\"mermaid_queen\":true,\"merman_musician\":true,\"mermaid_dancer\":true,\"baby_mermaid\":true,\"baby_merman\":true,\"water_splash\":true,\"water_droplet\":true,\"water_fountain\":true,\"clownfish\":true,\"narwhal\":true,\"sea_otter\":true,\"hermit_crab\":true},\"availableFrostingColors\":{\"coral\":true,\"ocean\":true,\"turquoise\":true,\"pearl\":true,\"seafoam\":true,\"aquamarine\":true,\"lavender\":true,\"pink\":true,\"shell\":true,\"seaweed\":true,\"starfish\":true,\"moonlight\":true,\"tide\":true,\"bubble\":true,\"scales\":true,\"sunset\":true,\"sparkle\":false,\"galaxy\":false,\"aurora\":false,\"fire\":false,\"frostbite\":true,\"glacier\":true,\"blizzard\":true,\"winternight\":true,\"crystalice\":true,\"abyss\":true,\"tropical\":true,\"lagoon\":true,\"sapphire\":true,\"opal\":true,\"sand\":false},\"gameMode\":\"challenge\"}", "game_design_document": "## Core Game Loop and Mechanics\n\n**Main Gameplay Flow:**\n1. Player sees a design prompt card (e.g., \"Rainbow Explosion\", \"Elegant Wedding\", \"Monster Mash\")\n2. A 60-second timer starts\n3. Player decorates a blank 3-tier cake using available tools and decorations\n4. When time expires (or player submits early), the game evaluates how well the cake matches the prompt\n5. Player receives a star rating (1-3 stars) and moves to the next round\n6. Difficulty increases with more complex prompts and tighter time limits\n\n**Decoration Mechanics:**\n- **Frosting Application**: Tap/click on cake tiers to cycle through frosting colors (white, chocolate, pink, blue, green, yellow)\n- **Decoration Placement**: Drag and drop decorations from a palette onto the cake (flowers, candles, sprinkles, fruit, stars, hearts)\n- **Undo**: Button to remove the last placed decoration\n- **Clear**: Button to start over completely\n\n**Scoring System:**\n- Each prompt has 3-5 key requirements (e.g., \"Rainbow Explosion\" needs: colorful frosting, star decorations, candles)\n- Meeting all requirements = 3 stars\n- Meeting most requirements = 2 stars  \n- Meeting some requirements = 1 star\n- Score accumulates across rounds\n\n**Progression:**\n- Rounds 1-3: Simple prompts, 60 seconds each\n- Rounds 4-6: Medium prompts, 50 seconds each\n- Rounds 7+: Complex prompts, 40 seconds each\n- Game continues until player wants to stop or fails to get at least 1 star\n\n**Win/Lose Conditions:**\n- No traditional \"game over\" - players can keep playing rounds\n- Each round is won by achieving 1+ stars\n- Goal is to achieve high cumulative score and perfect (3-star) rounds\n\n## Starting Scope\n\n**First Implementation (Minimal Viable Product):**\n- Single 3-tier cake model (always the same shape)\n- 6 frosting colors (white, chocolate, pink, blue, green, yellow)\n- 8 decoration types (candles, flowers, sprinkles, strawberries, stars, hearts, chocolate chips, cherries)\n- 10 pre-designed prompts with clear requirements\n- Simple star rating system (1-3 stars based on requirements met)\n- 60-second timer for all rounds\n- Basic UI: timer, prompt display, decoration palette, undo/clear buttons\n- Touch controls for mobile, mouse for desktop\n- Victory screen showing stars earned and total score\n\n**Future Iterations:**\n- More decoration types and frosting colors\n- Different cake shapes (round, square, heart-shaped)\n- Cake sculpting tools (reshape tiers)\n- More complex prompts (50+ variations)\n- Progressive difficulty with shorter timers\n- Combo system for placing decorations quickly\n- Photo mode to save decorated cakes\n- Daily challenges with special prompts\n- Leaderboards for high scores\n\n## Game Perspective\n\n**Fixed-screen** perspective with a centered view of the cake. The camera shows the entire cake at once with the decoration palette at the bottom of the screen. The cake is displayed at a slight 3D angle (isometric-style) so players can see the front and top of all three tiers clearly.\n\n## Game World and Level Design\n\n**Single Screen Layout:**\n- **Top Section (0-200px)**: Timer bar and current prompt display\n- **Middle Section (200-900px)**: The cake display area - centered 3-tier cake with space around it for decorations to be placed\n- **Bottom Section (900-1280px)**: Decoration palette and control buttons\n\n**Cake Structure:**\n- Three circular tiers stacked vertically\n- Bottom tier: largest (base)\n- Middle tier: medium\n- Top tier: smallest\n- Each tier can be frosted independently\n- Decorations can be placed on top surfaces and around the sides of each tier\n\n**The Decoration Palette:**\nScrollable horizontal row of decoration icons at the bottom. Each icon can be dragged onto the cake. Decorations snap to valid placement zones on the cake tiers.\n\n**Prompt Examples (First 10):**\n1. \"Classic Vanilla\" - White frosting, candles on top\n2. \"Chocolate Lover\" - Chocolate frosting, chocolate chips\n3. \"Strawberry Delight\" - Pink frosting, strawberries, flowers\n4. \"Rainbow Explosion\" - Multiple colored tiers, stars, sprinkles\n5. \"Garden Party\" - Green frosting, flowers everywhere\n6. \"Birthday Bash\" - Any bright frosting, lots of candles\n7. \"Berry Bonanza\" - Strawberries and cherries covering the cake\n8. \"Starry Night\" - Blue frosting, star decorations\n9. \"Love is Sweet\" - Pink frosting, heart decorations\n10. \"Sprinkle Madness\" - Any frosting, sprinkles on every tier\n\n## Edit Mode Design\n\n**Editable Properties:**\n\nPlayers can customize these aspects in Edit Mode:\n\n1. **Prompt Library** (Array of prompt objects):\n   - Prompt name/title\n   - Required frosting colors (array)\n   - Required decoration types (array)\n   - Minimum decorations needed\n   - Flavor text description\n\n2. **Timer Settings**:\n   - Starting time per round (30-90 seconds)\n   - Time reduction per round (0-10 seconds)\n   - Minimum time limit (20-60 seconds)\n\n3. **Difficulty Settings**:\n   - Number of requirements per prompt (1-5)\n   - Strictness of matching (lenient/normal/strict)\n\n4. **Available Decorations**:\n   - Toggle which decoration types are available\n   - Cannot remove all decorations\n\n5. **Frosting Colors**:\n   - Toggle which colors are available\n   - Cannot remove all colors\n\n**Edit Mode UI:**\n- Tabbed interface: \"Prompts\", \"Timer\", \"Difficulty\", \"Decorations\"\n- Each prompt in the library shows as an editable card\n- Add/Remove/Edit prompt buttons\n- Real-time preview of changes\n- Reset to defaults button\n\n**Constraints:**\n- Minimum 3 prompts required\n- Timer cannot be less than 20 seconds or more than 120 seconds\n- At least 3 decoration types must be enabled\n- At least 3 frosting colors must be enabled\n- Prompt requirements must reference available decorations/colors\n\n## Control Design\n\n**Mobile (Touch) Controls:**\n- **Frosting**: Tap directly on a cake tier to cycle through available frosting colors\n- **Decorations**: Drag decoration icons from the bottom palette onto the cake\n- **Undo**: Tap the undo button (top-right area)\n- **Clear**: Tap the clear button (next to undo)\n- **Submit**: Tap the \"Done!\" button when satisfied (or wait for timer to expire)\n\n**Desktop (Mouse/Keyboard) Controls:**\n- **Frosting**: Click on a cake tier to cycle through frosting colors\n- **Decorations**: Click and drag decoration icons from palette onto cake\n- **Undo**: Click undo button or press 'Z' key\n- **Clear**: Click clear button or press 'C' key\n- **Submit**: Click \"Done!\" button or press Enter/Space\n\n**Interaction Details:**\n- Decorations snap to valid placement zones when dragged near them\n- Invalid placement zones show visual feedback (red tint or X indicator)\n- Decorations can overlap slightly for creative freedom\n- Dragging a decoration off the cake removes it\n- Visual feedback when hovering over interactive elements\n\n## Art Style and Visual Theme\n\n**Overall Style**: Bright, cheerful, cartoon-style with a playful party atmosphere. Think vibrant colors, soft shadows, and inviting textures that make you want to eat the cake.\n\n**Color Palette**:\n- Bright, saturated colors for decorations and UI\n- Warm, appetizing tones for cake and frosting\n- High contrast for readability\n- Pastel accents for backgrounds\n\n**Visual Consistency**:\n- All decorations drawn in the same cartoon style with soft outlines\n- Consistent lighting from top-left creating gentle shadows\n- Slightly exaggerated proportions (bigger decorations, rounder shapes)\n- Smooth gradients on frosting to show texture\n\n**Cake Design**:\n- Three-tier round cake with visible layers\n- Slight isometric angle (viewing from front-right)\n- Soft shadows beneath each tier\n- Frosting has subtle gradient/texture to look creamy\n\n**UI Elements**:\n- Rounded buttons with playful fonts\n- Timer bar with candy-stripe pattern\n- Prompt cards with decorative borders\n- Star rating with sparkle effects\n\n**Asset Specifications**:\n- Cake tiers: 400-500px wide for bottom tier, scaled proportionally\n- Decorations: 60-80px each for clear visibility\n- Consistent viewing angle across all assets\n- Transparent backgrounds for all decorations\n- Soft drop shadows for depth", "persistent_storage_config": {"leaderboard": {"sort_ascending": true}}, "game_metadata": {"game_id": "01KJ6EEHPXBFDQGYZ5CCB7KPY7", "title": "Cake Splash", "description": "Winter cake decorating game where you apply frosting colors and place winter-themed decorations on three-tier cakes\u2014race the clock in Challenge Mode to match design prompts and earn stars", "thumbnail_url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/thumbnail_d5e5140b-16d7-4c31-a260-10c0a04998b3.webp", "created_at": 1771890494, "updated_at": 1772597345009.613, "art_style": null, "is_remix": true, "base_game_id": "01KJ33WPDSEJY2KG35ZVXXFKBE"}}