{"asset_map": {"background_garden": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_garden_8d760536-e065-4684-9600-1f8ff6224b90.webp", "type": "image", "prompt": "Generate a 9:16 tall image of a cheerful garden background, hand-drawn cartoon style with soft painterly textures. On the left side is a cute colorful house with a door and windows. Behind is a white picket fence and lush green grass. The sky is bright blue with fluffy white clouds. Background trees are in soft focus. Vibrant, inviting atmosphere, clean game art.", "description": "The main game background featuring a cheerful garden and house in a hand-drawn style", "subtype": "background", "aspect_ratio": [1024, 1536], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "sunflower_idle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/sunflower_idle_f4eec4b6-0e25-47af-8e1e-612a8f0e9b77.webp", "type": "image", "prompt": "Transform the sunflower character from image 1 to face DIRECTLY DOWNWARD towards the bottom of the screen. Create a top-down bird's eye view where the happy face is centered and looking straight at the viewer. The bright yellow petals should radiate outward symmetrically around the face. Maintain the hand-drawn cartoon style and cheerful expression. High resolution, clean lines, transparent background.", "description": "Cheerful sunflower character oriented to face downward for a top-down perspective.", "subtype": "character", "aspect_ratio": [704, 719], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "peashooter_idle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/peashooter_idle_118d5ca3-0b56-43db-b398-ed0410e72f54.webp", "type": "image", "prompt": "Transform the peashooter plant from image 1 to face DIRECTLY DOWNWARD toward the bottom of the screen. The peashooter's head and mouth must point straight down, viewed from a top-down perspective. Maintain the vibrant green cartoonish hand-drawn style, determined eyes, and stem detail. High-quality game asset, transparent background.", "description": "Green peashooter plant character oriented to face downward for a top-down vertical perspective.", "subtype": "character", "aspect_ratio": [730, 1172], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "peashooter_attacking": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/peashooter_attacking_057c1cce-42ca-4bf9-ba34-3ed2dd413a9e.webp", "type": "image", "prompt": "Transform the peashooter in image 1 to face DIRECTLY DOWNWARD towards the bottom of the screen. The character should have an aggressive and focused expression with its mouth wide open, actively shooting a green pea projectile straight down. Ensure a top-down perspective view, maintaining the hand-drawn green cartoon style consistent with the existing garden defense theme. Transparent background, high resolution, professional game asset.", "description": "The peashooter plant character in an aggressive attacking pose, oriented to shoot downwards for a top-down perspective.", "subtype": "character", "aspect_ratio": [638, 1237], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "wallnut_idle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/wallnut_idle_453bd4a7-ab46-4f0a-90f7-8b193ecaf775.webp", "type": "image", "prompt": "Change the orientation of the wall-nut in image 1 to face directly downward toward the bottom of the screen. Show the character from a top-down bird's eye perspective. The determined, defensive facial expression should be visible looking down. Maintain the hand-drawn brown nutshell cartoon style, high resolution, detailed, transparent background.", "description": "A defensive wall-nut character facing directly downward for a top-down perspective.", "subtype": "character", "aspect_ratio": [793, 1029], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "cherrybomb_idle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/cherrybomb_idle_8f156857-21f4-4e2a-a8b2-463c202b10a2.webp", "type": "image", "prompt": "Transform the cherry bomb character from image 1 to face DIRECTLY DOWNWARD toward the bottom of the screen. Show the twin cherries from a top-down view with their angry, fierce explosive facial expressions looking down. The green fuse should be clearly visible at the top. Maintain the hand-drawn red cartoon style and vibrant colors. High quality, transparent background.", "description": "Explosive twin cherries character facing downward for a top-down perspective", "subtype": "character", "aspect_ratio": [830, 1031], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "snowpea_idle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/snowpea_idle_36a8f61d-7a18-47ab-9016-0adc2f2b7626.webp", "type": "image", "prompt": "Transform the snow pea plant from image 1 to face DIRECTLY DOWNWARD toward the bottom of the screen. The head and mouth must be pointing straight down for a top-down perspective. Maintain the light blue and cyan icy cartoon aesthetic, hand-drawn style, and cool expression. High resolution, transparent background.", "description": "A downward-facing version of the Snow Pea plant for a vertical top-down perspective.", "subtype": "character", "aspect_ratio": [555, 1235], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "snowpea_attacking": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/snowpea_attacking_fe3a8214-f8c0-42b4-b1ea-c8188ca4b33e.webp", "type": "image", "prompt": "Transform the snow pea character to face DIRECTLY DOWNWARD towards the bottom of the frame. The character should have its mouth open in an attacking pose, shooting a frozen pea straight down. Maintain the icy light-blue color palette and hand-drawn cartoon style consistent with image 1. Top-down perspective, full body illustration, high resolution, transparent background.", "description": "The snow pea character in an attacking pose, facing and shooting directly downward for a vertical top-down perspective.", "subtype": "character", "aspect_ratio": [491, 1241], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "basic_critter_walk": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/basic_critter_walk_ae86e235-c764-4bfa-a3e8-0237e31fbb0e.webp", "type": "image", "prompt": "Generate a full-body character illustration of a small cheerful blob critter, side profile view facing left in a walking pose. Pastel purple color, large innocent eyes, friendly smile. Hand-drawn cartoon style, soft outlines, cel-shading. Transparent background.", "description": "Basic enemy character in walking pose", "subtype": "character", "aspect_ratio": [887, 1062], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "fast_critter_walk": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/fast_critter_walk_7d03fb04-a51a-4e80-9009-5dab152494ff.webp", "type": "image", "prompt": "Generate a full-body character illustration of a sleek orange/red critter, side profile view facing left in a fast running pose. Determined eyes, long legs mid-stride, motion lines to suggest speed. Hand-drawn cartoon style, vibrant colors. Transparent background.", "description": "Fast enemy character in running pose", "subtype": "character", "aspect_ratio": [1362, 676], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "tank_critter_walk": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/tank_critter_walk_d9f8f622-94ab-42a2-9987-e205c9f645a4.webp", "type": "image", "prompt": "Generate a full-body character illustration of a large bulky armored critter, side profile view facing left. Dark blue/gray armored shell, grumpy expression, thick legs taking a heavy step. Hand-drawn cartoon style, metallic highlights. Transparent background.", "description": "Large, high-health enemy character", "subtype": "character", "aspect_ratio": [895, 789], "compression_suggestion": "low", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "pea_projectile": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/pea_projectile_ffa82cdc-fbb6-4515-ba19-5a82d7371c3f.webp", "type": "image", "prompt": "Generate a small, round green pea projectile with slight motion blur and simple dimensional shading. Hand-drawn cartoon style, bright green. Transparent background.", "description": "A green pea projectile", "subtype": "effect", "aspect_ratio": [874, 552], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "frozen_pea_projectile": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/frozen_pea_projectile_589d0058-64ec-4ffd-a420-e56b131b194b.webp", "type": "image", "prompt": "Generate a small round light blue pea projectile with frost crystals and icy sparkles. Hand-drawn cartoon style, cool cyan color with white frost accents, slight motion blur. Transparent background.", "description": "A light blue frozen pea projectile", "subtype": "effect", "aspect_ratio": [1018, 755], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "explosion_effect": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/explosion_effect_13adcb08-11d8-4d60-b5a6-cbcebc422224.webp", "type": "image", "prompt": "Generate a bright orange and yellow cartoon explosion burst with red accents. Stylized cloud shape with radiating lines. Dynamic hand-drawn comic style. Transparent background.", "description": "Visual effect for the Cherry Bomb explosion", "subtype": "effect", "aspect_ratio": [886, 870], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "sun_icon": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/sun_icon_6c35731d-4c6b-474f-88f9-fc7f7ba6744e.webp", "type": "image", "prompt": "Generate a glowing yellow sun icon with radiating rays and a soft glow effect. Hand-drawn cartoon style, vibrant yellow and orange, cheerful appearance. Transparent background.", "description": "Collectible sunlight icon", "subtype": "ui", "aspect_ratio": [869, 889], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "plant_card_sunflower": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/plant_card_sunflower_d166e80c-039e-46bd-a938-9dfd3bd4535a.webp", "type": "image", "prompt": "Generate a UI card for a Sunflower plant. Rounded rectangle background in soft green. Contains a portrait of the sunflower from sunflower_idle. In the corner, a small sun icon with the text '50'. Hand-drawn cartoon style, clean and polished.", "description": "UI selection card for the Sunflower", "subtype": "ui", "aspect_ratio": [771, 937], "compression_suggestion": "low", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "plant_card_peashooter": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/plant_card_peashooter_c1d913de-6eca-4db3-ad23-8ecd25d93dd9.webp", "type": "image", "prompt": "Generate a UI card for a Peashooter plant. Rounded rectangle background in soft green. Contains a portrait of the peashooter from peashooter_idle. In the corner, a small sun icon with the text '100'. Hand-drawn cartoon style, clean and polished.", "description": "UI selection card for the Peashooter", "subtype": "ui", "aspect_ratio": [788, 1213], "compression_suggestion": "low", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "plant_card_wallnut": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/plant_card_wallnut_0bb6111b-e931-42f9-b745-1faf0c021d8d.webp", "type": "image", "prompt": "Generate a UI card for a Wall-nut plant. Rounded rectangle background in soft tan. Contains a portrait of the wall-nut from wallnut_idle. In the corner, a small sun icon with the text '50'. Hand-drawn cartoon style, clean and polished.", "description": "UI selection card for the Wall-nut", "subtype": "ui", "aspect_ratio": [759, 1183], "compression_suggestion": "low", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "plant_card_cherrybomb": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/plant_card_cherrybomb_cb62343c-7834-42ce-b3b8-86afe17a675a.webp", "type": "image", "prompt": "Generate a UI card for a Cherry Bomb plant. Rounded rectangle background in soft red. Contains a portrait of the cherry bomb from cherrybomb_idle. In the corner, a small sun icon with the text '150'. Hand-drawn cartoon style, clean and polished.", "description": "UI selection card for the Cherry Bomb", "subtype": "ui", "aspect_ratio": [726, 1030], "compression_suggestion": "low", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "plant_card_snowpea": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/plant_card_snowpea_e085c188-3420-4f9d-988b-f8a35e8ec1df.webp", "type": "image", "prompt": "Generate a UI card for a Snow Pea plant. Rounded rectangle background in soft blue. Contains a portrait of the snow pea from snowpea_idle. In the corner, a small sun icon with the text '175'. Hand-drawn cartoon style, clean and polished.", "description": "UI selection card for the Snow Pea", "subtype": "ui", "aspect_ratio": [753, 1120], "compression_suggestion": "low", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "menu_button": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/menu_button_a217663f-fc88-452b-ad4f-8fa2f7ae5c8a.webp", "type": "image", "prompt": "Generate a UI menu button icon. Rounded rectangle in soft gold with three horizontal hamburger lines. Hand-drawn cartoon style, vibrant colors. Transparent background.", "description": "Standard menu/pause button icon", "subtype": "ui", "aspect_ratio": [834, 810], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "play_button": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/play_button_90fbd510-5ead-4e1e-89ee-cbab375f7311.webp", "type": "image", "prompt": "Generate a large green play button, rounded rectangle shape with a white triangle icon in the center. Hand-drawn cartoon style, vibrant green, soft border and subtle shadow for depth.", "description": "Large play button for the main menu", "subtype": "ui", "aspect_ratio": [909, 831], "compression_suggestion": "low", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "level_card_locked": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/level_card_locked_c121830e-73e2-460d-bd3f-dedfb40e3fbf.webp", "type": "image", "prompt": "Generate a UI level selection card in a locked state. Rounded rectangle in muted gray-brown with a large padlock icon in the center. Hand-drawn cartoon style, subdued colors.", "description": "UI card for a locked level", "subtype": "ui", "aspect_ratio": [889, 892], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "level_card_unlocked": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/level_card_unlocked_d66acd14-eac1-4550-af2e-4b20f37c1b9b.webp", "type": "image", "prompt": "Generate a UI level selection card in an unlocked state. Rounded rectangle in vibrant green, with a space for a level number and three empty star outlines at the bottom. Hand-drawn cartoon style, vibrant and clean.", "description": "UI card for an unlocked level", "subtype": "ui", "aspect_ratio": [810, 801], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "star_empty": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/star_empty_1923e951-49da-4918-8641-9fdae83620b3.webp", "type": "image", "prompt": "Generate a simple five-pointed star outline in gray. Hand-drawn style with soft rounded edges. Transparent background.", "description": "Empty star icon for ratings", "subtype": "ui", "aspect_ratio": [900, 855], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "star_filled": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/star_filled_3cb0b140-335c-4312-ade2-13b483af22bd.webp", "type": "image", "prompt": "Generate a bright yellow/gold five-pointed star with a soft glow or sparkle effect. Hand-drawn style with soft rounded edges. Transparent background.", "description": "Filled gold star icon for ratings", "subtype": "ui", "aspect_ratio": [765, 732], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "victory_banner": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/victory_banner_498b9d59-717e-467d-b9fe-a2354ebab84c.webp", "type": "image", "prompt": "Generate a decorative banner with the text 'VICTORY!' in a hand-drawn cartoon style. Vibrant gold, yellow, and green colors with confetti and sparkles. Ribbon design. Transparent background.", "description": "Celebratory banner for winning a level", "subtype": "ui", "aspect_ratio": [1351, 856], "compression_suggestion": "low", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "defeat_banner": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/defeat_banner_66b82adf-1e83-434f-84e0-e73bab95d897.webp", "type": "image", "prompt": "Generate a decorative banner with the text 'DEFEAT' in a hand-drawn cartoon style. Subdued colors like gray and blue, with droopy design elements. Ribbon design. Transparent background.", "description": "Banner for losing a level", "subtype": "ui", "aspect_ratio": [1498, 779], "compression_suggestion": "low", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "background_music": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/background_music_dd89bed5-61d4-4fbc-8047-dea5e80ad545.mp3", "type": "audio", "prompt": "Upbeat, cheerful background music for a casual garden-themed tower defense game. Light, playful melody featuring acoustic ukulele, a bright xylophone, soft wooden percussion, and a cheerful flute lead. 130 BPM, C major, relaxing but energetic family-friendly vibe. Seamless loop, high-quality acoustic arrangement, clean production.", "description": "Upbeat and whimsical main theme music for the garden defense gameplay.", "subtype": "music", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 30, "loop": true, "opus_url": null, "animation": null}, "sun_collect_sfx": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/sun_collect_sfx_54a2c7d4-0b2c-4be3-97a3-0c34c927d07f.mp3", "type": "audio", "prompt": "Bright, cheerful magical chime sound effect for collecting a sun resource. High-pitched sparkly bell sound with a shimmering tail. Positive, rewarding, and crystal clear. Short, snappy attack with a 0.5s glittery decay.", "description": "Magical chime sound for collecting sunlight resources.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 1.53, "loop": false, "opus_url": null, "animation": null}, "plant_place_sfx": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/plant_place_sfx_8d0d5659-362a-4a76-910a-21508f93b4df.mp3", "type": "audio", "prompt": "Soft, satisfying organic 'plop' or 'thud' sound effect for planting in soil. Natural, earthy quality, slightly wet and squishy but clean. Short duration, subtle rustle of leaves included. Confirms successful placement in a cartoonish garden.", "description": "Satisfying organic 'plop' sound for placing plants on the grass.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 1.27, "loop": false, "opus_url": null, "animation": null}, "pea_shoot_sfx": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/pea_shoot_sfx_dfa06966-3389-43f8-a754-154290dfa921.mp3", "type": "audio", "prompt": "Light, cartoonish shooting sound effect. A quick 'pew' or 'pop' sound like a pea being blown through a tube. Short, playful, non-aggressive, with a hollow wooden texture. Suitable for frequent repetition.", "description": "Quick, playful popping sound for plant projectiles.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 2, "loop": false, "opus_url": null, "animation": null}, "explosion_sfx": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/explosion_sfx_45dc5d28-e144-4519-b405-8787c815e043.mp3", "type": "audio", "prompt": "Big cartoonish explosion sound effect. Loud, impactful 'BOOM' with a comedic 'POW' quality. Includes a slight whistling fuse before the blast and a clean, non-scary debris falling sound. High energy but family-friendly.", "description": "Comedic, loud explosion for the Cherry Bomb plant.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 2.35, "loop": false, "opus_url": null, "animation": null}, "critter_defeat_sfx": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/critter_defeat_sfx_6e7652a7-88b9-485e-b0e5-c307461e0197.mp3", "type": "audio", "prompt": "Silly, cartoonish 'poof' sound effect for a character disappearing. Features a descending slide whistle or pitch-shifted 'boing'. Lighthearted, whimsical, and non-violent. Clean, quick decay.", "description": "Silly, descending sound for critter elimination.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 1.26, "loop": false, "opus_url": null, "animation": null}, "wave_start_sfx": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/wave_start_sfx_3dd0bde7-56ae-4c47-b32b-5c12129a66ec.mp3", "type": "audio", "prompt": "Rising chime fanfare to signal the start of a wave. 3-4 rising notes on a bright glockenspiel or toy trumpet. Attention-grabbing, positive, and motivating. Signals that action is about to commence.", "description": "Attention-grabbing chime fanfare for new waves.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 3, "loop": false, "opus_url": null, "animation": null}, "victory_sfx": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/victory_sfx_a4d4ebb1-8c17-481c-b78d-c47d18bac19e.mp3", "type": "audio", "prompt": "Short triumphant victory fanfare. Upbeat and celebratory with bright orchestral bells, brass stabs, and a shimmering tambourine. Ends on a strong, happy major chord. Joyful and highly rewarding.", "description": "Triumphant celebratory fanfare for level completion.", "subtype": "music", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 5, "loop": false, "opus_url": null, "animation": null}, "defeat_sfx": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/defeat_sfx_0f67410d-727f-4e5e-96c5-79640bc2e0b4.mp3", "type": "audio", "prompt": "Sympathetic 'try again' sound effect. Descending melodic tones on a mellow marimba or muted trombone. Not harsh or punishing; sounds slightly 'aww' and whimsical. Encouraging the player to restart.", "description": "Sympathetic descending tones for a game over.", "subtype": "music", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 4, "loop": false, "opus_url": null, "animation": null}, "lawn_mower": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/lawn_mower_b12df5a2-aedd-45c9-9c51-670ac3026110.webp", "type": "image", "prompt": "Generate a professional game asset of a classic red push lawn mower. Style: Hand-drawn, whimsical cartoon aesthetic matching Plants vs Zombies. Perspective: Top-down view, facing downward (toward the bottom of the screen). Features: Bright red body with metallic silver accents, visible handlebar, and two wheels visible from the top. The design should be cheerful and protective with clean, bold outlines and slight highlights on the metal surfaces. High resolution, detailed, transparent background.", "description": "A classic red push lawn mower serving as the last line of defense, oriented to face downward in a hand-drawn cartoon style.", "subtype": "object", "aspect_ratio": [471, 923], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_basic_walk": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_basic_walk_9dd41b34-e439-4204-ab54-518c20561508.webp", "type": "image", "prompt": "Transform the basic zombie from image 1 to face UPWARD (away from the viewer) for a top-down vertical perspective. The zombie should be walking toward the top of the screen. Maintain the exact hand-drawn cartoon style, green skin, and tattered clothes from the original. High resolution, transparent background, game-ready character asset.", "description": "Basic zombie character in a walking pose, oriented to face upward for a top-down vertical perspective.", "subtype": "character", "aspect_ratio": [627, 1183], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_basic_eat": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_basic_eat_5c26ea6e-07e4-4aa8-8f76-a2e48a9feafe.webp", "type": "image", "prompt": "Transform the basic zombie eating pose to face UPWARD (toward the top of the screen). The zombie should be seen from a top-down perspective, green skin, tattered clothes, in a biting/eating animation pose looking towards the top. Maintain the whimsical hand-drawn cartoon style consistent with image 1. Transparent background, high resolution, game-ready asset.", "description": "A cartoon basic zombie in an eating pose, oriented to face upward for a top-down vertical perspective.", "subtype": "character", "aspect_ratio": [461, 985], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_fast_walk": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_fast_walk_8e30b684-09c9-43fa-826d-632a36a01479.webp", "type": "image", "prompt": "Generate a full-body picture of a cartoon football zombie from a top-down view, facing UPWARD. The zombie wears a red American football jersey and a large helmet, appearing athletic and fast. Match the hand-drawn, whimsical cartoon art style of image 1. The character should be in a running motion, moving towards the top of the frame. High resolution, professional quality game asset, transparent background.", "description": "A cartoon football zombie in an athletic running pose, oriented to face upward for a top-down vertical perspective.", "subtype": "character", "aspect_ratio": [699, 1187], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_fast_eat": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_fast_eat_3050381d-560e-4dc7-8a85-5e8f0b8a4459.webp", "type": "image", "prompt": "Transform the football zombie eating pose to face UPWARD towards the top of the screen. The zombie should be seen from a top-down perspective, wearing a red football helmet and jersey. Maintain the hand-drawn cartoon style consistent with the Plants vs Zombies aesthetic. The zombie is in a biting/eating animation pose, facing forward/up. High quality, detailed, transparent background.", "description": "Fast football zombie in an eating pose facing upward for top-down gameplay.", "subtype": "character", "aspect_ratio": [855, 891], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_tank_walk": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_tank_walk_e99842d6-abc9-490d-8395-62ea9b0449ba.webp", "type": "image", "prompt": "Transform the conehead zombie character from image 1 to face UPWARD (away from the viewer) for a top-down vertical perspective. The zombie should be seen from a slightly high angle, walking towards the top of the screen. Keep the green skin, tattered business suit, and the orange-and-white striped traffic cone on its head. Maintain the hand-drawn, goofy cartoon style consistent with image 1. Transparent background, high resolution.", "description": "A cartoon zombie with a traffic cone on its head, walking pose facing UPWARD for a vertical tower defense perspective.", "subtype": "character", "aspect_ratio": [712, 1143], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_tank_eat": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_tank_eat_3d0290a4-b520-4e29-88c5-5a6a8bfa077d.webp", "type": "image", "prompt": "Transform the zombie with a traffic cone on its head into an eating pose facing UPWARD toward the top of the screen. Top-down view, bird's eye perspective. Maintain the goofy, hand-drawn cartoon style consistent with 'zombie_tank_walk'. The zombie should have green skin, tattered clothes, and a bright orange traffic cone on its head, shown from above as it bites downward. Transparent background, high resolution.", "description": "Large hulking conehead zombie in an eating pose facing upward for top-down gameplay", "subtype": "character", "aspect_ratio": [544, 742], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "repeater_idle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/repeater_idle_9de536f3-ccfe-434f-94f2-a4f73c09b200.webp", "type": "image", "prompt": "Modify the repeater plant character to face directly downward toward the bottom of the screen. This is a double-barreled peashooter; both heads and barrels must point straight down. Maintain the hand-drawn green cartoon style consistent with image 1. Top-down perspective view, standing illustration, high resolution, transparent background.", "description": "Double-barreled repeater plant character facing downward for top-down gameplay", "subtype": "character", "aspect_ratio": [775, 1121], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "plant_card_repeater": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/plant_card_repeater_8a4a607e-fcef-4dc7-8181-5b7f6cd9f953.webp", "type": "image", "prompt": "Generate a UI selection card for a Repeater plant in a hand-drawn cartoon style. The card should feature a character icon based on the 'repeater_idle' asset, showing a robust green plant with two barrels. The card design should match the layout and artistic style of 'plant_card_peashooter', including a clean border and a placeholder area for cost, set against a transparent background.", "description": "UI selection card for the Repeater plant, featuring the Repeater character icon.", "subtype": "ui", "aspect_ratio": [809, 1248], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "potatomine_idle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/potatomine_idle_76de6ef5-3329-4992-a4ef-8145148e7bfc.webp", "type": "image", "prompt": "Generate a top-down bird's eye view illustration of the potato mine character from image 1. The potato should be partially buried in the ground, showing only the top half from a vertical perspective. Maintain the goofy cartoon style, brown potato skin texture, and sleepy/dormant facial expression. High quality, hand-drawn 2D game asset style, transparent background.", "description": "A top-down bird's eye view of a partially buried potato mine character with a sleepy expression.", "subtype": "object", "aspect_ratio": [875, 972], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "potatomine_armed": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/potatomine_armed_9ca3bba6-d3ee-4350-bfaa-b5e0e9f24b7e.webp", "type": "image", "prompt": "Generate a top-down bird's eye view of the potato mine character, fully emerged from the soil. The character should have a glowing angry red light or eyes to indicate it is armed and ready to explode. Use a clean, hand-drawn cartoon art style consistent with a garden defense game. Transparent background, high resolution, detailed illustration, front-facing but from a strictly vertical top-down perspective.", "description": "Top-down view of an armed potato mine, fully emerged and ready to explode with a glowing red alert expression.", "subtype": "object", "aspect_ratio": [920, 1023], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "plant_card_potatomine": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/plant_card_potatomine_a184000f-fbb1-4b7f-a32c-3a21fe4bc75f.webp", "type": "image", "prompt": "Generate a UI selection card for the Potato Mine plant, featuring the character from image 1. The card should have a rectangular frame with a clean border, matching the hand-drawn cartoon style of other plant cards like 'plant_card_peashooter'. High resolution, professional game UI, transparent background.", "description": "A UI selection card for the Potato Mine plant, featuring the character from 'potatomine_idle'.", "subtype": "ui", "aspect_ratio": [877, 942], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "squash_idle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/squash_idle_8f84a09c-ab76-446c-a2e5-040e1970f155.webp", "type": "image", "prompt": "Transform the squash plant to a top-down view, facing DIRECTLY DOWNWARD toward the bottom of the screen. The character should be a grumpy, green/yellow squash with a determined, angry facial expression. Maintain the hand-drawn cartoon style consistent with the garden defense game. Front-facing character from a high-angle top-down perspective. Transparent background, high resolution, professional game asset.", "description": "A grumpy squash plant character facing downward in a top-down perspective, ready to smash enemies.", "subtype": "character", "aspect_ratio": [704, 602], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "squash_attacking": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/squash_attacking_70fee449-dd2d-4f65-8c21-138efbbd1c7b.webp", "type": "image", "prompt": "Transform the character from image 1 into an attacking pose where it is lunging and jumping directly downward toward the bottom of the screen. The squash should be in a mid-jump animation frame, heading down from a top-down perspective. Maintain the aggressive, grumpy facial expression and the hand-drawn cartoon art style of image 1. High resolution, transparent background.", "description": "The squash plant character lunging downward in a smashing attack pose.", "subtype": "character", "aspect_ratio": [707, 551], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "jalapeno_idle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/jalapeno_idle_87d2bcd8-7171-43e8-bfb4-61be500f66f1.webp", "type": "image", "prompt": "Transform the Jalapeno plant to be oriented vertically facing downward towards the bottom of the screen. The red pepper body should point down with its angry, fiery facial expression clearly visible. Maintain the hand-drawn cartoon art style consistent with image 1. Top-down perspective, full body illustration, high resolution, transparent background.", "description": "A fiery red jalapeno pepper plant oriented vertically, facing downward with a determined expression for top-down gameplay.", "subtype": "character", "aspect_ratio": [645, 1193], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "spikeweed_idle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/spikeweed_idle_5ee7877e-128d-442e-86fc-ba7ea57d1431.webp", "type": "image", "prompt": "Generate a top-down bird's eye view of a spikeweed ground trap plant. The image should show sharp, green and brown spikes pointing directly upwards towards the viewer. Hand-drawn cartoon style consistent with a garden defense game. Clean lines, polished game-ready asset, transparent background, high resolution.", "description": "A top-down, bird's eye view of the spikeweed trap plant with sharp spikes.", "subtype": "ground", "aspect_ratio": [1113, 830], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "torchwood_idle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/torchwood_idle_ffb47472-ccd5-44fd-9349-31560d974393.webp", "type": "image", "prompt": "Generate a top-down view of a hollowed-out tree stump plant with a bright orange flame burning on top. The character should be facing DIRECTLY DOWNWARD toward the bottom of the screen. Show the hollow opening where projectiles pass through. Use a clean, hand-drawn cartoon art style consistent with a garden defense game. Transparent background, high resolution, professional quality game asset.", "description": "A hollowed-out tree stump plant with a flame on top, oriented in a top-down view facing downward.", "subtype": "character", "aspect_ratio": [787, 1237], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "tallnut_idle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/tallnut_idle_d3e7abde-f2cf-4a13-8af8-a1b28103d6e3.webp", "type": "image", "prompt": "Change the orientation of the tall-nut character in image 1 to face DIRECTLY DOWNWARD towards the bottom of the screen. Show the character from a top-down bird's eye view perspective. The tall-nut should have a stoic and determined expression, featuring its characteristic tall, brown nutshell body. Maintain the hand-drawn whimsical cartoon art style consistent with image 1. High resolution, transparent background, standing illustration.", "description": "A stoic, tall defensive nut plant character oriented to face downward for a top-down perspective.", "subtype": "character", "aspect_ratio": [792, 869], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "cactus_idle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/cactus_idle_7d73484f-89d7-4887-8a82-e2ce5e515b85.webp", "type": "image", "prompt": "Transform the cactus character in image 1 to face DIRECTLY DOWNWARD toward the bottom of the screen. Generate a full-body standing illustration from a top-down perspective, with the cactus's face and spikes directed downward. Maintain the green spiky hand-drawn cartoon style and determined expression consistent with the game's aesthetic. High resolution, detailed, transparent background.", "description": "A determined cactus character oriented to face downward for a top-down perspective.", "subtype": "character", "aspect_ratio": [748, 964], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "starfruit_idle": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/starfruit_idle_855a7fc6-1e18-44c1-9fc5-5c6aa7817d34.webp", "type": "image", "prompt": "Transform the character in image 1 to be viewed from a direct top-down perspective. The yellow star-shaped fruit should be seen from above with its 5 points radiating outward. The cheerful, happy face must be located in the center of the star, looking directly downward toward the viewer. Maintain the bright yellow cartoonish hand-drawn style, bold outlines, and playful aesthetic of the original game assets. High resolution, transparent background.", "description": "A cheerful star-shaped fruit plant oriented to face downward for a top-down gameplay perspective.", "subtype": "character", "aspect_ratio": [702, 681], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "plant_card_squash": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/plant_card_squash_f30f9d44-5a2b-4683-abbb-d40db9a18a86.webp", "type": "image", "prompt": "Generate a UI selection card for the Squash plant, featuring a small portrait of the squash character from image 1. The card should have a rectangular frame, a wooden or stone texture background typical of garden defense games, and a small space at the bottom for a cost number. Clean, polished, hand-drawn cartoon style, high resolution, transparent background.", "description": "UI selection card for the Squash plant used in the seed selection menu", "subtype": "ui", "aspect_ratio": [691, 801], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "plant_card_jalapeno": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/plant_card_jalapeno_f78d4e76-8482-4ace-872b-79801c4d45f9.webp", "type": "image", "prompt": "Generate a UI selection card for a 'Jalapeno' plant. The card should feature the fiery red jalapeno character from image 1 on a rectangular game card with a wooden or stone texture border, consistent with the Plants vs. Zombies UI style. Include a small sun icon with a cost value in the corner. Hand-drawn, clean cartoon style, polished game asset, transparent background.", "description": "A UI selection card for the Jalapeno plant, featuring the Jalapeno character icon on a standard PvZ-style card background.", "subtype": "ui", "aspect_ratio": [787, 1181], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "plant_card_spikeweed": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/plant_card_spikeweed_25595986-10ee-48ed-946d-1218cbad77a0.webp", "type": "image", "prompt": "Generate a UI selection card for a plant-defense game, featuring the 'spikeweed' character icon. The card should have a rectangular frame with a wooden or stony texture, matching the visual style of 'plant_card_peashooter' and 'plant_card_squash'. The center features a thorny green spikeweed plant. High resolution, clean UI design, game-ready asset, hand-drawn cartoon style, opaque card background.", "description": "A UI selection card for the Spikeweed plant with its icon on a standard background", "subtype": "ui", "aspect_ratio": [882, 1023], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "plant_card_torchwood": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/plant_card_torchwood_df4293de-32bf-46ac-b44a-3a8bc8de15bf.webp", "type": "image", "prompt": "Generate a UI selection card for a plant defense game. The card features the 'torchwood' character from image 1 (a tree stump with fire on top) centered on a standard rectangular plant card background. The style should be hand-drawn and cartoonish, matching the visual aesthetic of image 1 and other plant cards in the game. Professional quality UI element with clean edges.", "description": "UI selection card for the Torchwood plant featuring the character icon.", "subtype": "ui", "aspect_ratio": [719, 1157], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "plant_card_tallnut": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/plant_card_tallnut_f31a7527-571b-4c1e-aa9c-3f7d281554a1.webp", "type": "image", "prompt": "Generate a UI selection card for a game, featuring the 'tallnut_idle' character icon. The card should have a standard Plants vs. Zombies style with a brown wood-textured or earthy rectangular border, a small seed packet aesthetic, and a placeholder area for cost at the bottom. Maintain a clean, hand-drawn cartoon style consistent with the 'plant_card_torchwood' and other existing plant cards. High resolution, professional game UI quality.", "description": "A UI selection card for the Tall-nut plant, featuring the character icon.", "subtype": "ui", "aspect_ratio": [776, 1248], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "plant_card_cactus": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/plant_card_cactus_20b3de6a-b820-4871-b1bf-5791e27ae278.webp", "type": "image", "prompt": "Generate a UI selection card for a game, featuring a character icon of the 'cactus_idle' on a standard garden-defense style card background. The card should have a rectangular frame with a beige or light brown center, matching the hand-drawn, cartoonish art style of 'plant_card_peashooter'. High-quality, clean lines, game-ready UI element.", "description": "UI selection card for the Cactus plant used in the seed selection menu.", "subtype": "ui", "aspect_ratio": [809, 1248], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "plant_card_starfruit": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/plant_card_starfruit_d6e1a960-8146-4386-a3ff-a0510e02c773.webp", "type": "image", "prompt": "Generate a UI selection card for the Starfruit plant. The card should feature a cheerful yellow star-shaped fruit character icon centered on a standard game card background. Maintain the hand-drawn, cartoonish art style consistent with image 1 and image 2. The card should have a clean, polished look suitable for a mobile game interface, with professional quality and transparent background.", "description": "UI selection card for the Starfruit plant, used in the seed selection menu.", "subtype": "ui", "aspect_ratio": [821, 1248], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "fire_pea_projectile": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/fire_pea_projectile_9a934191-38cb-40f1-9eec-3d5543f85103.webp", "type": "image", "prompt": "Generate a glowing, flaming orange pea projectile. It should be a small green pea engulfed in bright orange and yellow stylized flames, trailing a bit of smoke. Hand-drawn, clean cartoonish style matching the aesthetic of image 1. Side view, moving horizontally. High resolution, professional quality game asset on a transparent background.", "description": "A glowing, flaming orange pea projectile for the Torchwood power-up effect.", "subtype": "effect", "aspect_ratio": [1225, 543], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "cactus_spike_projectile": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/cactus_spike_projectile_512e08ec-20ac-4cad-8a22-0349672c6334.webp", "type": "image", "prompt": "Generate a sharp, green cactus needle spike projectile. Hand-drawn cartoonish style matching the aesthetic of a garden defense game. Clean lines, simple shading, transparent background, side-view horizontal orientation.", "description": "A sharp cactus needle projectile fired by the Cactus plant.", "subtype": "effect", "aspect_ratio": [725, 224], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "star_projectile": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/star_projectile_1ef76b3a-5a89-40ac-b2fc-fdc924b28b6d.webp", "type": "image", "prompt": "Generate a small, glowing yellow star-shaped projectile for a garden defense game. Hand-drawn, clean cartoonish style, side view, polished game asset with sharp edges, transparent background, high resolution.", "description": "A yellow star-shaped projectile fired by the Starfruit plant.", "subtype": "effect", "aspect_ratio": [517, 482], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "wave_banner_bg": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/wave_banner_bg_3d27ce4b-08ac-4aae-913b-6e401de50f28.webp", "type": "image", "prompt": "Generate a wide, dramatic stylized red banner for a battle warning. The banner should have a hand-drawn cartoonish aesthetic, slightly weathered and torn at the edges with a war-like intensity. Polished game-ready asset, rich texture, deep crimson colors, designed to accommodate text on top. Transparent background, high resolution, matching the hand-drawn style of image background_garden.", "description": "A dramatic, weathered red battle banner used as a background for incoming wave warnings.", "subtype": "ui", "aspect_ratio": [1160, 544], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "background_backyard": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_backyard_cdacba19-2e26-4d97-8ede-eef872687bce.webp", "type": "image", "prompt": "Generate a 9:16 tall image of a cheerful, hand-drawn 2D backyard scene for a garden defense game. The view features a vibrant lush green lawn in the foreground with scattered colorful flowers. In the upper part of the frame, a cozy, whimsical house is visible. The art style is polished, high-quality 2D animation style, matching the hand-drawn aesthetic of image background_garden. Sun-drenched atmosphere with clear blue skies.", "description": "A cheerful, hand-drawn 2D backyard scene with a lush lawn and a cozy house in the background.", "subtype": "background", "aspect_ratio": [832, 1248], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "background_frontyard_night": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_frontyard_night_8f117cc4-cc36-436e-8d8a-50e1fc7ff681.webp", "type": "image", "prompt": "Generate a wide 16:9 2D hand-drawn background of a suburban front yard at night. The scene features a lush green lawn illuminated by soft blue moonlight. In the background, a cozy suburban house has warm yellow light glowing from the windows. The perspective is a side-view looking slightly down at the lawn to accommodate a 5x9 gameplay grid. The art style is whimsical, clean, and polished, matching the hand-drawn aesthetic of image 'background_garden'. No characters or UI elements, empty environment only.", "description": "A moonlit front yard night background with a 5x9 grid perspective for gameplay.", "subtype": "background", "aspect_ratio": [1248, 832], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "ui_click_plop_sfx": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/ui_click_plop_sfx_9c76a526-53e7-4f9c-a8e9-2c4f0838c474.mp3", "type": "audio", "prompt": "A short, satisfying, and organic 'plop' sound effect for a UI button click. It sounds like a soft bubble bursting or a light wooden block being tapped. Whimsical garden theme, gentle and friendly, high-pitched but soft attack, clean decay. No metallic ringing, no harshness, no gunshot qualities. Suitable for frequent menu navigation in a casual game.", "description": "A light and whimsical organic pop sound for menu interactions and UI buttons.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 0.75, "loop": false, "opus_url": null, "animation": null}, "ui_click_short_sfx": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/ui_click_short_sfx_d6104f8d-e5b8-46de-bfee-6095f6bf5603.mp3", "type": "audio", "prompt": "Create a clean, short, professional 2D game UI click sound. It should be a whimsical but snappy 'tick' or 'pop' sound with no aggressive qualities. High-frequency, light, and satisfying, similar to a soft bubble pop or a mechanical keyboard switch but more organic. Suitable for frequent menu navigation and button taps. No gunshot or explosive qualities. Clean tail with minimal reverb.", "description": "A clean, whimsical, and snappy UI click sound for menu navigation.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 0.39, "loop": false, "opus_url": null, "animation": null}, "plant_unlock_sfx": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/plant_unlock_sfx_50c4d060-3696-4d47-be9b-67dedce2d863.mp3", "type": "audio", "prompt": "A magical, rewarding, and celebratory sound effect for a game achievement. The sound should feature a bright glockenspiel or chime melody, a subtle shimmering harp glissando, and a gentle magical burst. It must feel positive and distinct, with a clear rising pitch to signify growth and unlocking. Whimsical, organic, and polished, fitting a garden-themed defense game style. No dark tones, no heavy percussion, clean finish.", "description": "A magical and celebratory sound effect for unlocking a new plant character.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 2.67, "loop": false, "opus_url": null, "animation": null}, "war_start_sfx": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/war_start_sfx_020da027-3e50-4150-8a9f-ee48c4bd9b06.mp3", "type": "audio", "prompt": "Dramatic and cinematic war starting sound effect for a strategy game. Starts with a deep, resonating low-frequency war horn blast, immediately followed by a fast, rhythmic marching snare drum roll to build tension and urgency. The sound conveys a 'call to arms' atmosphere. Clean production, high-stakes feel, ending with a sharp cutoff. 4 seconds duration.", "description": "A dramatic and cinematic call to battle sound effect, signaling the transition to a combat phase.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 2.84, "loop": false, "opus_url": null, "animation": null}, "war_horn_start_sfx": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/sounds/effect/war_horn_start_sfx_85c75f36-4708-4b40-ad48-e439490acd7b.mp3", "type": "audio", "prompt": "A cinematic and intense war horn blast followed by a powerful, deep percussion drum roll. The sound is high-impact, epic, and slightly ominous, evoking the feel of an ancient call to battle in a high-fantasy strategy game. Thick texture, resonant brass echoes, and a rhythmic tribal drum swell to create tension and attention. High quality, wide stereo field.", "description": "An epic and dramatic war horn blast with a powerful drum roll to signal the start of a battle phase.", "subtype": "effect", "aspect_ratio": null, "compression_suggestion": "original", "duration_secs": 5.32, "loop": false, "opus_url": null, "animation": null}, "background_frontyard_night_v2": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_frontyard_night_v2_8dede0cd-40d6-4560-addc-ad8292f6548b.webp", "type": "image", "prompt": "Generate a high-quality 2D hand-drawn game background of a suburban front yard at night. On the left, a cozy house with warm light glowing from the windows. A lush green lawn stretches across the center with a very subtle 5x9 grid pattern integrated into the grass. On the right, a sidewalk where enemies approach. The sky is deep blue and moonlit with sparkling stars. Whimsical, clean, and vibrant art style, side-view perspective, 16:9 aspect ratio, no characters or UI elements.", "description": "A moonlit suburban front yard background with a 5x9 grid layout, matching the whimsical hand-drawn style.", "subtype": "background", "aspect_ratio": [1248, 832], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "background_night_garden": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_night_garden_79256090-f04e-4e09-b3d6-e39e65fea420.webp", "type": "image", "prompt": "Generate a wide 16:9 hand-drawn 2D game background of a whimsical moonlit night garden. The foreground features a lush green lawn area designed to fit a 5x9 grid perspective. In the background, a cozy suburban house with a glowing yellow window sits under a large, luminous full moon. Use a magical atmospheric color palette of deep blues and purples with soft yellow highlights. High-quality polished cartoon art style, slightly elevated side-front perspective, matching the aesthetic of existing garden defense games.", "description": "A moonlit suburban night garden with a lush lawn, cozy house, and glowing full moon for the game world.", "subtype": "background", "aspect_ratio": [1248, 832], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "background_night_garden_hd": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_night_garden_hd_1af5e99d-c937-4e3b-851b-92fec2cdd9f7.webp", "type": "image", "prompt": "Generate a 9:16 tall image of a high-quality, atmospheric 2D hand-drawn suburban night garden. The scene features a lush green lawn in the foreground with a subtle 5x9 grid perspective suitable for a tower defense game. In the background, a cozy suburban house is visible under the glow of a large, bright full moon. The sky is a deep midnight blue with twinkling stars and wispy clouds. Magical, whimsical lighting with soft moonlight illuminating the garden. Match the hand-drawn art style of background_night_garden.", "description": "High-quality atmospheric midnight garden background with a suburban house and full moon.", "subtype": "background", "aspect_ratio": [832, 1248], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "background_night_garden_layout": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_night_garden_layout_39dacb5b-f109-42e2-b6d4-26608f0d54fc.webp", "type": "image", "prompt": "Generate a 9:16 tall image of a moonlit suburban night garden for a tower defense game. The top 25% of the frame shows the side of a cozy, whimsical house with a visible door and porch. The remaining 75% of the frame is a flat, lush green lawn layout. Use a hand-drawn, colorful, and whimsical art style. Include a large, glowing full moon in a starry night sky. The perspective is a side-view designed for a 5x9 grid. High contrast between the dark midnight sky and the vibrant green grass. Match the artistic style of 'background_garden'.", "description": "A moonlit suburban night garden with a 5x9 lawn grid and a cozy house, optimized for portrait mobile gameplay.", "subtype": "background", "aspect_ratio": [832, 1248], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "background_night_grass_only": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_night_grass_only_e8749502-5671-4c92-8bfc-c5d401dbce77.webp", "type": "image", "prompt": "Generate a 9:16 tall image of a seamless, top-down perspective 2D background of a lush green lawn at night. Hand-drawn whimsical art style matching the Plants vs. Zombies aesthetic. The texture consists of perfectly manicured green grass with subtle moonlit highlights and deep shadows. No house, no flowers, no path, no UI elements. Cool blue and dark green palette to suggest a magical moonlit night. Professional quality game asset.", "description": "A seamless moonlit lawn background for the 5x9 grid gameplay, featuring only lush green grass.", "subtype": "background", "aspect_ratio": [832, 1248], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "day_grass_bg": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/day_grass_bg_4ff3945b-b160-4714-b0ec-c5899481d606.webp", "type": "image", "prompt": "Generate a 9:16 tall image of a lush, vibrant green garden lawn texture. High-angle top-down view, bright sunny day lighting, seamless and clean. No house or other objects, just a beautiful, well-maintained grass surface designed for a 2D game background. Hand-drawn whimsical art style consistent with a garden defense game.", "description": "A vibrant green garden lawn background for the daytime levels, featuring a clean grass texture.", "subtype": "background", "aspect_ratio": [832, 1248], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "home_entrance_top": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/home_entrance_top_1b86bb96-d753-4e3c-b8b8-698b7278e7e6.webp", "type": "image", "prompt": "Generate a wide horizontal facade of a cheerful suburban house entrance, hand-drawn cartoon style. Featuring a wooden garden gate, lush colorful flower bushes, and a welcoming front door area. Match the vibrant colors and whimsical art style of background_garden. Front-facing view, bright daytime lighting, clean edges at the bottom for seamless placement at the top of the screen. High resolution, professional game asset.", "description": "A cheerful cartoon house entrance with a garden gate and flowers for the top of the screen.", "subtype": "background", "aspect_ratio": [1248, 832], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "background_day_road_complete": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_day_road_complete_791019f1-adb4-459e-a9b2-9e04965994cb.webp", "type": "image", "prompt": "Generate a high-quality 2D digital art background for a garden defense game in a 9:16 tall aspect ratio. The composition is divided vertically: the top section features a charming, hand-drawn front view of a suburban house with a cozy garden gate and colorful flowers; the middle section is a bright, sunlit, lush green lawn with a vibrant, clean texture; the bottom section is a paved grey suburban road with a sidewalk. Whimsical, cheerful cartoon style with vibrant colors and soft daytime lighting. Match the hand-drawn art style of background_garden. No grid lines, professional game-ready background.", "description": "Complete vertical game background with a suburban house at the top, a lush green lawn in the center, and a paved road at the bottom.", "subtype": "background", "aspect_ratio": [832, 1248], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "background_garden_final": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_garden_final_d35d1982-0e7b-4f65-acdf-bb81d0777902.webp", "type": "image", "prompt": "Generate a 9:16 tall image of a 2D hand-drawn cartoon style garden background for a defense game. The composition consists of three distinct horizontal sections: Top 15% shows a cozy suburban house entrance with a wooden gate and colorful flowers; Middle 70% features a lush green grass lawn with a subtle, faint 5x9 grid pattern suitable for isometric placement; Bottom 15% shows a paved gray suburban road. The style is whimsical, bright, sunny, and cheerful with clean lines and vibrant colors, matching the aesthetic of existing garden assets. Perspective is slightly top-down isometric to provide depth.", "description": "A complete portrait game background featuring a house, a 5x9 lawn grid, and a paved road.", "subtype": "background", "aspect_ratio": [832, 1248], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "background_grass_road": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_grass_road_21788e12-f77a-46a9-9956-7222ea85fb37.webp", "type": "image", "prompt": "Generate a 9:16 tall image for a mobile portrait garden defense game. The top 85% of the frame is a vibrant, lush green garden lawn with a subtle seamless grass texture. The bottom 15% is an old, cracked, and weathered paved asphalt road. The style is whimsical, hand-drawn, and colorful, matching the aesthetic of image 1 and image 2. The perspective is a clean top-down view with a slight isometric tilt, suitable for a 5x9 grid layout. No houses, gates, or structures\u2014just a clean transition from grass to road.", "description": "A vertical game background with a lush green lawn occupying most of the frame and a cracked asphalt road at the bottom.", "subtype": "background", "aspect_ratio": [832, 1248], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "background_grass_road_v2": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_grass_road_v2_4241560d-2bcd-4f80-8e36-77180ef011ef.webp", "type": "image", "prompt": "Generate a 9:16 tall image for a 2D hand-drawn garden defense game. The top 80% consists of a vibrant, lush green lawn with subtle grid patterns suggested by grass texture variations. The bottom 20% shows a weathered, cracked, and broken grey asphalt road with small weeds poking through. Whimsical and clean art style, high resolution, no houses or buildings, focus exclusively on the garden and road transition. Optimized for mobile portrait view.", "description": "A vertical portrait background featuring a lush green lawn and a weathered asphalt road at the bottom.", "subtype": "background", "aspect_ratio": [832, 1248], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "plain_grass_bg": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/plain_grass_bg_3be75aa2-cc0e-4996-a310-f61fc913f50c.webp", "type": "image", "prompt": "Generate a top-down view of a vibrant green lawn for a 2D garden defense game. The image should be a seamless, tileable texture of plain, lush grass with slight natural variations and a whimsical hand-drawn art style. Clean and bright aesthetic, matching the visual style of 'background_garden'. No buildings, roads, or objects\u2014purely a grass texture optimized for a 5x9 grid layout.", "description": "A seamless top-down lush green lawn for the gameplay grid area.", "subtype": "ground", "aspect_ratio": [832, 1248], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "background_grass_road_split": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_grass_road_split_38536cf1-b0f4-4def-9ddf-75209f6df602.webp", "type": "image", "prompt": "Generate a 9:16 tall vertical portrait game background. The top 80% is a lush, vibrant green grass field with natural textures and subtle blade details. The bottom 20% is a weathered, cracked asphalt road with realistic wear, tear, and discoloration. Ensure a clean, natural transition between the grass and the road. Whimsical, hand-drawn 2D game art style matching image background_garden. High resolution, polished game-ready environment.", "description": "Vertical game background with a 4:1 split between a lush green grass field and a weathered asphalt road at the bottom.", "subtype": "background", "aspect_ratio": [832, 1248], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "game_background_grass_road": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/game_background_grass_road_e8871aeb-5f03-4a60-a5c8-e368887f6f24.webp", "type": "image", "prompt": "Generate a 9:16 tall image for a tower defense game background. The top 80% of the image is a vibrant, lush green garden lawn seen from a top-down perspective. The bottom 20% is a weathered, cracked gray asphalt suburban road. Hand-drawn, cartoonish art style matching the aesthetic of image background_garden. Bright daytime lighting, clean and simple design, high resolution, professional quality. The transition between grass and road is sharp and horizontal.", "description": "Vertical portrait background featuring a 4:1 ratio of lush garden lawn to a weathered suburban asphalt road.", "subtype": "background", "aspect_ratio": [832, 1248], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "background_grass_road_80_20": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_grass_road_80_20_03e619d5-1dab-45c2-a5a4-7257c0e00291.webp", "type": "image", "prompt": "Generate a 9:16 tall vertical portrait game background for a mobile tower defense game. The top 80% is a vibrant, lush green garden lawn with soft natural textures and a slightly rolling terrain. The bottom 20% is a weathered, cracked asphalt suburban road with subtle tire marks. The style is cheerful, hand-drawn, and whimsical, matching the aesthetic of image background_garden. Clean transition between the grass and the road. High resolution, polished cartoon game art.", "description": "Vertical mobile game background with an 80% lush green lawn and 20% weathered asphalt road at the bottom.", "subtype": "background", "aspect_ratio": [832, 1248], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "background_grass_road_final": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/background_grass_road_final_d7c78cf2-ee79-48cc-8fc4-bfa21d5e6e2a.webp", "type": "image", "prompt": "Generate a 9:16 tall portrait image for a game background. The top 80% is a lush, vibrant manicured green lawn with a top-down perspective. The bottom 20% is a weathered, cracked gray suburban asphalt road. Style is clean, hand-drawn cartoon aesthetic with bright saturated colors, matching the cheerful mood of a garden defense game. Horizontal division between grass and road is clear and straight. No characters, objects, or UI elements, just the environment textures. Professional quality, high resolution, game-ready asset.", "description": "A high-quality 9:16 vertical background featuring a 4:1 split of lush green lawn and weathered asphalt road for the gameplay area.", "subtype": "background", "aspect_ratio": [832, 1248], "compression_suggestion": "original", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_buckethead_walk": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_buckethead_walk_ac12e7af-fbe2-4bfd-b040-49724e06ac50.webp", "type": "image", "prompt": "Generate a full-body, top-down view of a cartoon zombie walking upwards toward the top of the screen. The zombie has green skin, tattered business casual clothing, and is wearing a dented, rusty metal bucket on its head as a helmet. Hand-drawn polished cartoon style, vibrant colors, clean linework matching the Plants vs Zombies aesthetic. Front-facing/Top-down perspective, transparent background, high resolution.", "description": "A bucket-wearing zombie enemy in a walking pose for top-down gameplay.", "subtype": "character", "aspect_ratio": [640, 1217], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_buckethead_eat": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_buckethead_eat_8f0f37ed-2329-4bb3-befb-315f27735f43.webp", "type": "image", "prompt": "Generate a full-body, top-down view of a goofy cartoon zombie wearing a rusty, dented metal bucket on its head. The zombie is in an eating and biting pose, oriented to face UPWARD towards the top of the screen. It has green skin and tattered brown clothes. Hand-drawn, polished cartoon art style matching image 1. High resolution, professional quality game asset on a transparent background.", "description": "A buckethead zombie character in an eating pose, facing upward for top-down gameplay.", "subtype": "character", "aspect_ratio": [655, 1247], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_flag_walk": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_flag_walk_02b6eb40-f7da-4274-8e70-a8d49795b386.webp", "type": "image", "prompt": "Generate a full-body, top-down view of a cartoon flag-bearer zombie walking and facing upward. The zombie has green skin, tattered clothes, and is holding a pole with a tattered, torn flag. Hand-drawn cartoon style matching the whimsical aesthetic of Plants vs Zombies, high resolution, detailed, transparent background.", "description": "A cartoon flag-bearer zombie walking upward to signal a new wave, in a hand-drawn style.", "subtype": "character", "aspect_ratio": [710, 1232], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_flag_eat": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_flag_eat_30467926-b5f8-4909-9d5c-51f4d47ec86c.webp", "type": "image", "prompt": "Generate a cartoon flag-bearer zombie in an eating/biting pose, facing UPWARD (toward the top of the screen). The zombie has green skin, wears tattered basic clothes, and is still holding a pole with a torn, tattered flag. Hand-drawn, goofy cartoon style matching the aesthetic of image 1. Full body standing illustration, top-down view, transparent background, high resolution, professional game asset.", "description": "The flag-bearer zombie character in an eating pose, facing upward for the top-down game view.", "subtype": "character", "aspect_ratio": [715, 1248], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_newspaper_walk": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_newspaper_walk_bb96f8bc-9609-46bd-a2aa-da5d499c91cb.webp", "type": "image", "prompt": "Generate a full-body, top-down view of a nerdy cartoon zombie walking and facing UPWARD. The zombie has green skin, wears reading glasses, and is clutching a newspaper in its hands. Hand-drawn, polished cartoon style matching the aesthetic of Plants vs Zombies. High resolution, detailed, professional quality game asset on a transparent background.", "description": "A nerdy newspaper-holding zombie in a walking pose for top-down gameplay.", "subtype": "character", "aspect_ratio": [589, 1204], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_newspaper_angry": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_newspaper_angry_8c62c2d9-d8d9-4605-a1d8-7441cddf0614.webp", "type": "image", "prompt": "Generate a full-body, top-down view of a cartoon zombie with broken reading glasses and an extremely angry expression, facing and running UPWARD. The zombie has red glowing eyes, gritting teeth, and no longer holds a newspaper. Use a hand-drawn, goofy cartoon style consistent with the 'zombie_newspaper_walk' asset. High resolution, professional quality, transparent background.", "description": "Furious newspaper zombie in a running pose, triggered after losing its newspaper shield.", "subtype": "character", "aspect_ratio": [721, 890], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_pole_walk": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_pole_walk_5d16be4e-90d1-48fb-a553-58659504dfc9.webp", "type": "image", "prompt": "Generate a full-body, top-down view of a cartoon athletic pole vaulter zombie walking and facing upward (toward the top of the screen). The zombie has green skin, a lean athletic build, and is wearing a colorful track and field uniform while carrying a long pole vault pole. Hand-drawn polished cartoon style, clean lines, vibrant colors, matching the aesthetic of the existing zombie characters. High resolution, professional quality game asset, transparent background.", "description": "An athletic pole vaulter zombie in a track uniform carrying a pole, facing upward for top-down gameplay.", "subtype": "character", "aspect_ratio": [725, 1235], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_pole_jump": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_pole_jump_4a127f2b-4d0d-4091-9dd6-5c8b2e5a87f4.webp", "type": "image", "prompt": "Generate a full-body, top-down view of a cartoon pole vaulter zombie in mid-vault, jumping forward with its pole. The zombie should be facing UPWARD (towards the top of the screen). It has green skin and is wearing a worn-out athletic track uniform. Hand-drawn cartoon style matching the aesthetic of image 1. High resolution, detailed, professional game asset with a transparent background.", "description": "An athletic pole vaulter zombie in a jumping/vaulting pose, facing upward for top-down gameplay.", "subtype": "character", "aspect_ratio": [744, 1214], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_gargantuar_walk": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_gargantuar_walk_72b110bd-e0f5-49ef-b66b-c697a281f366.webp", "type": "image", "prompt": "Generate a full-body, front-view illustration of a massive hulking giant Gargantuar zombie. The character has extremely muscular green skin, a tiny head on a huge body, and a menacing expression. He is carrying a wooden telephone pole as a weapon. The character is oriented to face UPWARD for a top-down vertical tower defense game. Style: hand-drawn cartoon matching the whimsical Plants vs Zombies aesthetic. High resolution, detailed, transparent background.", "description": "A massive hulking Gargantuar zombie carrying a telephone pole, facing upward for top-down gameplay.", "subtype": "character", "aspect_ratio": [772, 943], "compression_suggestion": "medium", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_gargantuar_smash": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_gargantuar_smash_22c7ca6d-f88c-48a8-8564-af1af025b423.webp", "type": "image", "prompt": "Generate a full-body, top-down view of a MASSIVE hulking giant Gargantuar zombie mid-swing, smashing downward with a telephone pole weapon. The character is facing UPWARD (toward the top of the screen). Extremely muscular build, green skin, tiny head on a huge body, menacing expression. Hand-drawn clean 2D cartoon style matching the aesthetic of Plants vs Zombies. High resolution, professional quality game asset, transparent background.", "description": "A massive Gargantuar zombie in a mid-swing smashing attack pose with a telephone pole weapon.", "subtype": "character", "aspect_ratio": [604, 1180], "compression_suggestion": "low", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_imp_walk": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_imp_walk_ee2a9470-de11-4343-b291-d7e5bb3a282f.webp", "type": "image", "prompt": "Generate a tiny, small imp zombie character in a walking pose, facing UPWARD towards the top of the screen. Top-down bird's eye view. The character has green skin, a mischievous expression, and is wearing tattered tiny clothes. Hand-drawn polished cartoon style, vibrant colors, clean thick outlines matching the Plants vs Zombies aesthetic. Transparent background, high resolution, professional quality game asset.", "description": "A tiny, mischievous imp zombie in a walking pose, facing upward for vertical gameplay.", "subtype": "character", "aspect_ratio": [402, 742], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}, "zombie_imp_eat": {"url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/zombie_imp_eat_51952675-285a-4a24-8bf3-292b09ef2efe.webp", "type": "image", "prompt": "Generate a full-body, top-down view of a tiny, mischievous imp zombie in an eating and biting pose, facing UPWARD. The character should have green skin, a small stature, and tattered clothing. Style must be a polished, hand-drawn 2D cartoon matching the whimsical aesthetic of Plants vs Zombies. High resolution, professional quality game asset on a transparent background.", "description": "A small imp zombie in an eating pose facing upward for top-down gameplay.", "subtype": "character", "aspect_ratio": [681, 1181], "compression_suggestion": "high", "duration_secs": null, "loop": null, "opus_url": null, "animation": null}}, "game_code": "<!DOCTYPE html>\n<html>\n<head>\n    <title>Plant vs Zombies 2</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&family=Poppins:wght@400;600;700&display=swap\" rel=\"stylesheet\">\n    <style>\n        /* CSS Reset */\n        *, *::before, *::after {\n            box-sizing: border-box;\n            margin: 0;\n            padding: 0;\n        }\n\n        /* Root Variables */\n        :root {\n            --transition-fast: 150ms;\n            --transition-normal: 300ms;\n            --transition-slow: 500ms;\n            --ease-out: cubic-bezier(0.0, 0, 0.2, 1);\n            --ease-bounce: cubic-bezier(0.68, -0.6, 0.32, 1.6);\n            --space-xs: 8px;\n            --space-sm: 16px;\n            --space-md: 24px;\n            --space-lg: 32px;\n            --space-xl: 48px;\n            --color-primary: #4CAF50;\n            --color-accent: #FFD700;\n            --color-danger: #F44336;\n            --color-sky: #87CEEB;\n            --color-text: #2C3E50;\n            --color-text-light: #FFFFFF;\n            --panel-bg: rgba(255, 255, 255, 0.8);\n            --glass-bg: rgba(255, 255, 255, 0.4);\n            --glass-border: rgba(255, 255, 255, 0.6);\n        }\n\n        /* Story Cinematic Screen */\n        .story-screen {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            background: #0d0f18;\n            z-index: 3000;\n            display: flex;\n            flex-direction: column;\n            overflow: hidden;\n            font-family: 'Fredoka', sans-serif;\n            color: #ffffff;\n            user-select: none;\n        }\n\n        .story-stage {\n            position: relative;\n            width: 100%;\n            flex: 1;\n            overflow: hidden;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n        }\n\n        .story-bg {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            object-fit: cover;\n            transition: transform 1.2s ease-out, filter 1s ease;\n        }\n\n        .story-vignette {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            pointer-events: none;\n            background: radial-gradient(circle at center, rgba(0,0,0,0) 40%, rgba(0,0,0,0.7) 100%);\n            box-shadow: inset 0 0 100px rgba(0,0,0,0.8);\n        }\n\n        .story-actors-layer {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            pointer-events: none;\n        }\n\n        .story-actor {\n            position: absolute;\n            transform-origin: center bottom;\n            filter: drop-shadow(0 10px 15px rgba(0,0,0,0.6));\n            transition: all 0.7s cubic-bezier(0.2, 0.9, 0.3, 1.2);\n        }\n\n        .story-comic-bubble {\n            position: absolute;\n            background: #ffffff;\n            color: #2c3e50;\n            padding: 14px 22px;\n            border-radius: 20px;\n            border: 4px solid #3e2723;\n            font-size: 20px;\n            font-weight: 700;\n            box-shadow: 0 8px 0 #1b120c, 0 12px 24px rgba(0,0,0,0.4);\n            max-width: 320px;\n            text-align: center;\n            z-index: 10;\n            animation: bubbleBounce 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n        }\n\n        .story-comic-bubble::after {\n            content: '';\n            position: absolute;\n            bottom: -16px;\n            left: 50%;\n            transform: translateX(-50%);\n            border-width: 16px 14px 0;\n            border-style: solid;\n            border-color: #3e2723 transparent;\n            display: block;\n            width: 0;\n        }\n\n        .story-comic-bubble.bubble-zombie {\n            background: #e8f5e9;\n            color: #1b5e20;\n            border-color: #2e7d32;\n            box-shadow: 0 8px 0 #1b5e20, 0 12px 24px rgba(0,0,0,0.5);\n            font-family: 'Fredoka', cursive;\n            font-size: 24px;\n            letter-spacing: 1px;\n        }\n\n        .story-comic-bubble.bubble-zombie::after {\n            border-color: #2e7d32 transparent;\n        }\n\n        @keyframes bubbleBounce {\n            0% { transform: scale(0.6) translateY(20px); opacity: 0; }\n            80% { transform: scale(1.08) translateY(-4px); opacity: 1; }\n            100% { transform: scale(1) translateY(0); opacity: 1; }\n        }\n\n        .story-bottom-panel {\n            min-height: 280px;\n            background: linear-gradient(180deg, rgba(30, 20, 15, 0.96) 0%, rgba(15, 10, 8, 0.99) 100%);\n            border-top: 5px solid #ffb300;\n            padding: 24px 28px;\n            display: flex;\n            flex-direction: column;\n            justify-content: space-between;\n            box-shadow: 0 -10px 30px rgba(0,0,0,0.7);\n            z-index: 20;\n            position: relative;\n        }\n\n        .story-chapter-badge {\n            display: inline-block;\n            align-self: flex-start;\n            background: linear-gradient(90deg, #ff9800, #f57c00);\n            color: #fff;\n            padding: 5px 14px;\n            border-radius: 12px;\n            font-size: 14px;\n            font-weight: 700;\n            letter-spacing: 1.5px;\n            text-transform: uppercase;\n            box-shadow: 0 3px 0 #b26a00;\n            margin-bottom: 8px;\n        }\n\n        .story-text-container {\n            flex: 1;\n            display: flex;\n            align-items: center;\n        }\n\n        .story-narration {\n            font-size: 24px;\n            line-height: 1.45;\n            font-weight: 600;\n            color: #fff8e7;\n            text-shadow: 0 2px 4px rgba(0,0,0,0.6);\n            transition: opacity 0.25s ease;\n        }\n\n        .story-narration highlight {\n            color: #ffd54f;\n            font-weight: 700;\n        }\n\n        .story-controls {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            margin-top: 15px;\n            gap: 16px;\n        }\n\n        .story-progress-dots {\n            display: flex;\n            gap: 10px;\n            align-items: center;\n        }\n\n        .story-dot {\n            width: 12px;\n            height: 12px;\n            border-radius: 50%;\n            background: rgba(255,255,255,0.25);\n            transition: all 0.3s;\n        }\n\n        .story-dot.active {\n            background: #ffca28;\n            transform: scale(1.3);\n            box-shadow: 0 0 10px #ffca28;\n        }\n\n        .story-nav-btn {\n            background: linear-gradient(180deg, #4caf50 0%, #2e7d32 100%);\n            border: 3px solid #1b5e20;\n            border-radius: 16px;\n            padding: 12px 32px;\n            color: #ffffff;\n            font-family: 'Fredoka', sans-serif;\n            font-size: 22px;\n            font-weight: 700;\n            cursor: pointer;\n            box-shadow: 0 5px 0 #134217, 0 8px 15px rgba(0,0,0,0.4);\n            display: flex;\n            align-items: center;\n            gap: 8px;\n            transition: transform 0.1s, filter 0.1s;\n        }\n\n        .story-nav-btn:hover {\n            filter: brightness(1.1);\n        }\n\n        .story-nav-btn:active {\n            transform: translateY(3px);\n            box-shadow: 0 2px 0 #134217;\n        }\n\n        .story-skip-btn {\n            position: absolute;\n            top: 20px;\n            right: 20px;\n            background: rgba(0, 0, 0, 0.65);\n            border: 2px solid rgba(255, 255, 255, 0.4);\n            color: #ffffff;\n            padding: 8px 20px;\n            border-radius: 20px;\n            font-size: 16px;\n            font-weight: 700;\n            cursor: pointer;\n            z-index: 100;\n            backdrop-filter: blur(4px);\n            transition: all 0.2s;\n        }\n\n        .story-skip-btn:hover {\n            background: rgba(255, 255, 255, 0.2);\n            border-color: #ffd54f;\n            color: #ffd54f;\n        }\n\n        .story-skip-btn:active {\n            transform: scale(0.95);\n        }\n\n        /* Comic Shake & Flash Animations */\n        @keyframes dramaticShake {\n            0% { transform: translate(0, 0) rotate(0deg); }\n            20% { transform: translate(-6px, 4px) rotate(-1deg); }\n            40% { transform: translate(6px, -4px) rotate(1deg); }\n            60% { transform: translate(-4px, -3px) rotate(0deg); }\n            80% { transform: translate(4px, 3px) rotate(1deg); }\n            100% { transform: translate(0, 0) rotate(0deg); }\n        }\n\n        @keyframes redPulseVignette {\n            0%, 100% { background: radial-gradient(circle at center, rgba(180,0,0,0.1) 30%, rgba(120,0,0,0.6) 100%); }\n            50% { background: radial-gradient(circle at center, rgba(255,0,0,0.25) 20%, rgba(180,0,0,0.85) 100%); }\n        }\n\n        @keyframes sunshineSparkle {\n            0%, 100% { filter: drop-shadow(0 0 15px rgba(255, 215, 0, 0.6)) brightness(1); }\n            50% { filter: drop-shadow(0 0 35px rgba(255, 235, 59, 1)) brightness(1.25); }\n        }\n\n        @keyframes bounceActor {\n            0%, 100% { transform: translateY(0) scale(1); }\n            50% { transform: translateY(-16px) scale(1.05); }\n        }\n\n        @keyframes zombieMarch {\n            0%, 100% { transform: translateX(0) rotate(2deg); }\n            50% { transform: translateX(-8px) rotate(-3deg); }\n        }\n\n        /* Base Styles */\n        body, html {\n            margin: 0;\n            padding: 0;\n            width: 100%;\n            height: 100%;\n            overflow: hidden;\n            touch-action: none;\n            -ms-touch-action: none;\n            font-family: 'Fredoka', sans-serif;\n            background: var(--color-sky);\n            color: var(--color-text);\n            user-select: none;\n            -webkit-user-select: none;\n            -webkit-tap-highlight-color: transparent;\n        }\n\n        /* Game World Container */\n        #game-world {\n            position: relative;\n            width: 100%;\n            height: 100%;\n            background-color: #1a1a1a;\n            overflow: hidden;\n            display: flex;\n            justify-content: center;\n            align-items: center;\n        }\n\n        #game-canvas {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            image-rendering: auto;\n        }\n\n        /* UI Overlay */\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: 10;\n        }\n\n        .ui-overlay > * {\n            pointer-events: auto;\n        }\n\n        /* Top UI Layout - Sun Counter */\n        .top-ui-container {\n            position: absolute;\n            top: 15px;\n            left: 50%;\n            transform: translateX(-50%);\n            width: auto;\n            height: auto;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            padding: 8px 12px;\n            gap: 8px;\n            pointer-events: none;\n            z-index: 100;\n            background: linear-gradient(180deg, #d4b896 0%, #bda27e 50%, #a68b6a 100%);\n            border: 3px solid #5d4037;\n            border-radius: 12px;\n            box-shadow: 0 6px 0 #3e2723, 0 8px 16px rgba(0,0,0,0.4), inset 0 2px 0 rgba(255,255,255,0.2);\n        }\n\n        /* Bottom UI Layout - Plant Selection */\n        .bottom-ui-container {\n            position: absolute;\n            bottom: 15px;\n            left: 50%;\n            transform: translateX(-50%);\n            width: auto;\n            max-width: 98%;\n            height: 140px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            padding: 10px 14px;\n            gap: 10px;\n            pointer-events: none;\n            z-index: 100;\n            background: linear-gradient(180deg, #d4b896 0%, #bda27e 50%, #a68b6a 100%);\n            border: 3px solid #5d4037;\n            border-radius: 12px;\n            box-shadow: 0 -4px 0 #3e2723, 0 -6px 16px rgba(0,0,0,0.4), inset 0 2px 0 rgba(255,255,255,0.2);\n        }\n\n        .sun-counter {\n            width: 110px;\n            height: 44px;\n            background: linear-gradient(180deg, #fff8e7 0%, #fdf5e6 100%);\n            border: 2px solid #5d4037;\n            border-radius: 22px;\n            display: flex;\n            align-items: center;\n            justify-content: flex-end;\n            position: relative;\n            box-shadow: inset 0 2px 4px rgba(0,0,0,0.1), 0 2px 4px rgba(0,0,0,0.2);\n            flex-shrink: 0;\n            pointer-events: auto;\n            margin-left: 0;\n            padding-left: 4px;\n            padding-right: 8px;\n            gap: 4px;\n        }\n\n        .sun-icon-ui {\n            width: 38px;\n            height: 38px;\n            position: relative;\n            left: 0;\n            flex-shrink: 0;\n            filter: drop-shadow(0 2px 3px rgba(0,0,0,0.4));\n            z-index: 5;\n            animation: sunPulse 2s infinite alternate ease-in-out;\n        }\n\n        @keyframes sunPulse {\n            from { transform: scale(1); filter: drop-shadow(0 2px 3px rgba(0,0,0,0.4)) brightness(1); }\n            to { transform: scale(1.1); filter: drop-shadow(0 2px 5px rgba(255,215,0,0.6)) brightness(1.2); }\n        }\n\n        #sun-count {\n            background: linear-gradient(180deg, #fff 0%, #f5f5f5 100%);\n            width: 55px;\n            text-align: center;\n            border-radius: 12px;\n            color: #333;\n            font-size: 18px;\n            font-weight: 700;\n            border: 2px solid #5d4037;\n            z-index: 2;\n            padding: 2px 0;\n            box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);\n        }\n\n        .plant-selection {\n            display: flex;\n            gap: 8px;\n            background: rgba(0, 0, 0, 0.2);\n            padding: 8px 12px;\n            border-radius: 12px;\n            height: 120px;\n            align-items: center;\n            pointer-events: auto;\n            overflow-x: auto;\n            overflow-y: hidden;\n            min-width: 80px;\n            max-width: 100%;\n            scrollbar-width: none;\n            -ms-overflow-style: none;\n        }\n\n        .plant-selection::-webkit-scrollbar {\n            display: none;\n        }\n\n        .plant-card {\n            width: 80px;\n            height: 100px;\n            background: linear-gradient(180deg, #fff 0%, #f5f5f5 100%);\n            border: 3px solid #5d4037;\n            border-radius: 10px;\n            cursor: pointer;\n            position: relative;\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            transition: all 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n            overflow: hidden;\n            flex-shrink: 0;\n            box-shadow: 0 3px 6px rgba(0,0,0,0.25);\n        }\n\n        .plant-card:hover:not(.disabled) {\n            transform: translateY(-2px) scale(1.02);\n            border-color: #4CAF50;\n            box-shadow: 0 4px 8px rgba(0,0,0,0.3);\n        }\n\n        .plant-card.selected {\n            border-color: #FFD700;\n            box-shadow: 0 0 10px #FFD700, 0 4px 8px rgba(0,0,0,0.3);\n            transform: translateY(-2px) scale(1.05);\n        }\n\n        .plant-card.disabled {\n            filter: grayscale(0.7) brightness(0.6);\n            cursor: not-allowed;\n            box-shadow: none;\n        }\n\n        .plant-card-image {\n            width: 100%;\n            height: 100%;\n            object-fit: cover;\n            display: block;\n            position: absolute;\n            top: 0;\n            left: 0;\n        }\n\n        .plant-card-cost {\n            width: 100%;\n            height: 24px;\n            font-size: 15px;\n            font-weight: 800;\n            color: #3e2723;\n            background: linear-gradient(180deg, #fff8dc 0%, #ffeaa7 100%);\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            border-top: 2px solid #5d4037;\n            margin-top: auto;\n            position: relative;\n            z-index: 5;\n        }\n\n        .plant-card-cost img {\n            width: 14px !important;\n            height: 14px !important;\n            margin-right: 3px !important;\n        }\n\n        .menu-btn-ui {\n            position: absolute;\n            top: 15px;\n            right: 12px;\n            width: 44px;\n            height: 44px;\n            background: linear-gradient(180deg, #8d6e63 0%, #5d4037 100%);\n            border: 2px solid #3e2723;\n            border-radius: 10px;\n            cursor: pointer;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            box-shadow: 0 3px 0 #3e2723, 0 4px 8px rgba(0,0,0,0.3);\n            z-index: 110;\n            transition: all 0.15s;\n            pointer-events: auto;\n        }\n\n        .menu-btn-ui:hover {\n            transform: translateY(-2px);\n            filter: brightness(1.1);\n        }\n\n        .menu-btn-ui:active {\n            transform: translateY(2px);\n            box-shadow: 0 1px 0 #3e2723;\n        }\n\n        .menu-btn-ui img {\n            width: 60%;\n            height: 60%;\n            object-fit: contain;\n        }\n\n        .plant-card-cooldown {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: calc(100% - 20px);\n            background: rgba(0, 0, 0, 0.7);\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            font-size: 14px;\n            font-weight: 700;\n            color: #fff;\n            border-radius: 6px 6px 0 0;\n        }\n\n        /* Menu Screens */\n        .menu-screen {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            background: rgba(0, 0, 0, 0.6);\n            backdrop-filter: blur(5px);\n            -webkit-backdrop-filter: blur(5px);\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: center;\n            z-index: 100;\n            animation: screenIn 0.3s ease-out;\n        }\n\n        .menu-panel {\n            background: #fdf5e6;\n            border: 6px solid #5d4037;\n            border-radius: 30px;\n            padding: 30px;\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            box-shadow: 0 15px 0 #3e2723, 0 20px 40px rgba(0,0,0,0.4);\n            width: 500px;\n            max-width: 90%;\n            animation: panelIn 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n        }\n\n        @keyframes panelIn {\n            from { transform: translateY(50px); opacity: 0; }\n            to { transform: translateY(0); opacity: 1; }\n        }\n\n        @keyframes screenIn {\n            from { opacity: 0; }\n            to { opacity: 1; }\n        }\n\n        .menu-title {\n            font-family: 'Fredoka', sans-serif;\n            font-size: 64px;\n            font-weight: 700;\n            color: #5d4037;\n            margin-bottom: 35px;\n            text-align: center;\n            line-height: 1;\n            text-shadow: 2px 2px 0 rgba(0,0,0,0.1);\n            position: relative;\n        }\n\n        .menu-title::after {\n            content: '';\n            position: absolute;\n            bottom: -15px;\n            left: 50%;\n            transform: translateX(-50%);\n            width: 100px;\n            height: 6px;\n            background: #5d4037;\n            border-radius: 3px;\n            opacity: 0.3;\n        }\n\n        .menu-buttons {\n            display: flex;\n            flex-direction: column;\n            gap: 15px;\n            width: 100%;\n            align-items: center;\n        }\n\n        .menu-button {\n            width: 100%;\n            max-width: 400px;\n            height: 96px;\n            background: #4CAF50;\n            border: 4px solid #2E7D32;\n            border-radius: 20px;\n            font-family: 'Fredoka', sans-serif;\n            font-size: 32px;\n            font-weight: 600;\n            color: white;\n            cursor: pointer;\n            transition: all 0.2s;\n            box-shadow: 0 8px 0 #1B5E20;\n            text-transform: uppercase;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n        }\n\n        .menu-button:hover {\n            transform: translateY(-2px);\n            filter: brightness(1.1);\n        }\n\n        .menu-button:active {\n            transform: translateY(4px);\n            box-shadow: 0 4px 0 #1B5E20;\n        }\n\n        .menu-button.secondary { background: #FFA726; border-color: #EF6C00; box-shadow: 0 8px 0 #E65100; }\n        .menu-button.danger { background: #F44336; border-color: #C62828; box-shadow: 0 8px 0 #B71C1C; }\n        \n        .menu-button.secondary:active { box-shadow: 0 4px 0 #E65100; }\n        .menu-button.danger:active { box-shadow: 0 4px 0 #B71C1C; }\n\n        /* Level Selection Grid */\n        .level-grid {\n            display: grid;\n            grid-template-columns: repeat(5, 1fr);\n            gap: 15px;\n            padding: 10px;\n            max-height: 420px;\n            overflow-y: auto;\n        }\n\n        .level-card {\n            width: 100px;\n            height: 100px;\n            background: #fff;\n            border: 4px solid #5d4037;\n            border-radius: 20px;\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: center;\n            cursor: pointer;\n            transition: all 0.2s;\n            box-shadow: 0 5px 0 #3e2723;\n            position: relative;\n        }\n\n        .level-card:hover:not(.locked) {\n            transform: translateY(-2px);\n            filter: brightness(1.05);\n            border-color: #4CAF50;\n        }\n\n        .level-card:active:not(.locked) {\n            transform: translateY(2px);\n            box-shadow: 0 2px 0 #3e2723;\n        }\n\n        .level-card.locked {\n            background: #d2c4b5;\n            border-color: #8d6e63;\n            cursor: not-allowed;\n            opacity: 0.7;\n            box-shadow: 0 5px 0 #5d4037;\n        }\n\n        .level-card.locked .level-number {\n            display: none;\n        }\n\n        .level-card.locked::after {\n            content: '\ud83d\udd12';\n            font-size: 32px;\n        }\n\n        .level-number {\n            font-size: 36px;\n            font-weight: 700;\n            color: #5d4037;\n        }\n\n        /* Result Screens */\n        .result-screen {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            background: rgba(0, 0, 0, 0.85);\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: center;\n            z-index: 110;\n            animation: screenIn 0.5s ease-out;\n        }\n\n        .result-banner {\n            width: 400px;\n            margin-bottom: 20px;\n            filter: drop-shadow(0 0 20px rgba(255, 215, 0, 0.3));\n        }\n\n        .result-stars {\n            display: flex;\n            gap: 12px;\n            margin-bottom: 40px;\n        }\n\n        .result-star {\n            width: 64px;\n            height: 64px;\n            filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.5));\n        }\n\n        .hidden { display: none !important; }\n\n        /* Level Header */\n        .level-header {\n            position: absolute;\n            top: 15px;\n            left: 12px;\n            background: linear-gradient(180deg, #4CAF50 0%, #388E3C 100%);\n            border: 3px solid #2E7D32;\n            border-radius: 12px;\n            padding: 10px 16px;\n            font-family: 'Fredoka', sans-serif;\n            font-size: 16px;\n            font-weight: 700;\n            color: #fff;\n            text-shadow: 1px 1px 2px rgba(0,0,0,0.3);\n            box-shadow: 0 4px 0 #1B5E20, 0 6px 12px rgba(0,0,0,0.3);\n            z-index: 110;\n            pointer-events: auto;\n            cursor: pointer;\n            white-space: nowrap;\n            text-transform: uppercase;\n            animation: headerIn 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n        }\n\n        .level-header:hover {\n            filter: brightness(1.1);\n            transform: translateY(-2px);\n        }\n\n        .level-header:active {\n            transform: translateY(2px);\n            box-shadow: 0 2px 0 #1B5E20;\n        }\n\n        @keyframes headerIn {\n            from { transform: translateY(-20px); opacity: 0; }\n            to { transform: translateY(0); opacity: 1; }\n        }\n\n\n        #unlock-popup {\n            background: rgba(0, 0, 0, 0.4);\n            backdrop-filter: none;\n            -webkit-backdrop-filter: none;\n        }\n\n        @keyframes pulse {\n            from { transform: translateX(-50%) scale(1); }\n            to { transform: translateX(-50%) scale(1.05); }\n        }\n        \n        /* Tutorial Overlay */\n        .tutorial-box {\n            position: absolute;\n            background: #fdf5e6;\n            border: 4px solid #5d4037;\n            border-radius: 20px;\n            padding: 30px;\n            color: #5d4037;\n            font-size: 26px;\n            font-weight: 600;\n            box-shadow: 0 8px 0 #3e2723, 0 15px 30px rgba(0,0,0,0.3);\n            pointer-events: auto;\n            z-index: 2000;\n            max-width: 500px;\n            text-align: center;\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            gap: 20px;\n            animation: popIn 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n        }\n        .tutorial-arrow {\n            position: absolute;\n            width: 0;\n            height: 0;\n            border-left: 10px solid transparent;\n            border-right: 10px solid transparent;\n            border-top: 15px solid #5d4037;\n        }\n        @keyframes popIn {\n            from { transform: scale(0.8); opacity: 0; }\n            to { transform: scale(1); opacity: 1; }\n        }\n        @keyframes popInCentered {\n            from { transform: translate(-50%, -50%) scale(0.8); opacity: 0; }\n            to { transform: translate(-50%, -50%) scale(1); opacity: 1; }\n        }\n        .tutorial-box.centered {\n            top: 50% !important;\n            left: 50% !important;\n            transform: translate(-50%, -50%) !important;\n            animation: popInCentered 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n        }\n        .tutorial-box:not(.centered) {\n            animation: popIn 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n        }\n\n        /* Localization helpers */\n        body, button, select { font-family: 'Fredoka', 'Poppins', 'Noto Sans', system-ui, -apple-system, 'Segoe UI', sans-serif; }\n        .menu-button { padding: 0 16px; line-height: 1.1; text-align: center; gap: 8px; }\n        body.rtl .menu-panel, body.rtl .tutorial-box, body.rtl .story-bottom-panel, body.rtl .story-comic-bubble { direction: rtl; }\n\n        /* In-game story toast (live comic callouts) */\n        .story-toast {\n            position: absolute; top: 175px; left: 50%; transform: translateX(-50%);\n            z-index: 1100; pointer-events: none; display: flex; align-items: center; gap: 10px;\n            width: 92%; max-width: 640px; justify-content: center;\n            animation: toastIn 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n        }\n        .story-toast img { width: 96px; height: 96px; object-fit: contain; filter: drop-shadow(0 6px 10px rgba(0,0,0,0.6)); animation: bounceActor 0.8s infinite ease-in-out; }\n        .story-toast-bubble {\n            background: #fff; color: #3e2723; border: 4px solid #3e2723; border-radius: 18px;\n            padding: 12px 18px; font-size: 22px; font-weight: 700; text-align: center;\n            box-shadow: 0 6px 0 #1b120c, 0 10px 20px rgba(0,0,0,0.4); max-width: 480px;\n        }\n        .story-toast-bubble.zombie { background: #e8f5e9; color: #1b5e20; border-color: #2e7d32; box-shadow: 0 6px 0 #1b5e20, 0 10px 20px rgba(0,0,0,0.5); }\n        @keyframes toastIn {\n            from { transform: translateX(-50%) translateY(-40px) scale(0.7); opacity: 0; }\n            to { transform: translateX(-50%) translateY(0) scale(1); opacity: 1; }\n        }\n        .unlock-quote {\n            position: relative; background: #fff; color: #3e2723; border: 3px solid #3e2723;\n            border-radius: 16px; padding: 8px 16px; font-size: 20px; font-weight: 700;\n            margin-bottom: 16px; box-shadow: 0 4px 0 #1b120c; text-align: center;\n            animation: bubbleBounce 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n        }\n        .unlock-quote::after {\n            content: ''; position: absolute; bottom: -12px; left: 50%; transform: translateX(-50%);\n            border-width: 12px 10px 0; border-style: solid; border-color: #3e2723 transparent;\n        }\n\n        /* Settings Screen */\n        #settings-screen { z-index: 3600; }\n        .settings-label {\n            display: flex; align-items: center; gap: 10px;\n            font-size: 28px; font-weight: 700; color: #5d4037;\n            margin-bottom: 14px; align-self: stretch; justify-content: center;\n        }\n        .lang-select-wrap {\n            position: relative; width: 100%; max-width: 400px; margin-bottom: 30px;\n        }\n        .lang-select-wrap::after {\n            content: '\u25bc'; position: absolute; right: 22px; top: 50%; transform: translateY(-50%);\n            color: #fff; font-size: 20px; pointer-events: none; text-shadow: 0 2px 0 rgba(0,0,0,0.3);\n        }\n        body.rtl .lang-select-wrap::after { right: auto; left: 22px; }\n        .lang-select {\n            width: 100%; height: 96px; appearance: none; -webkit-appearance: none;\n            background: linear-gradient(180deg, #8d6e63 0%, #5d4037 100%);\n            border: 4px solid #3e2723; border-radius: 20px;\n            box-shadow: 0 8px 0 #3e2723, inset 0 2px 0 rgba(255,255,255,0.2);\n            color: #fff8e7; font-size: 28px; font-weight: 700;\n            padding: 0 60px 0 24px; cursor: pointer; outline: none;\n        }\n        .lang-select:focus { border-color: #FFD700; }\n        .lang-select option { background: #fdf5e6; color: #3e2723; font-size: 22px; }\n    </style>\n</head>\n<body>\n    <div id=\"game-world\">\n        <canvas id=\"game-canvas\"></canvas>\n        \n        <!-- UI Overlay -->\n        <div class=\"ui-overlay\">\n            <div class=\"level-header hidden\" id=\"level-header\">Garden Basics</div>\n            <!-- Top UI Container -->\n            <div class=\"top-ui-container hidden\" id=\"top-ui\">\n                <div class=\"sun-counter\">\n                    <img class=\"sun-icon-ui\" id=\"sun-icon-ui\" alt=\"Sun\">\n                    <span id=\"sun-count\">0</span>\n                </div>\n            </div>\n            \n            <div class=\"bottom-ui-container hidden\" id=\"bottom-ui\">\n                <div class=\"plant-selection\" id=\"plant-selection\"></div>\n            </div>\n            \n            <div class=\"menu-btn-ui hidden\" id=\"game-menu-btn\">\n                <img id=\"menu-icon-hud\" alt=\"Menu\">\n            </div>\n\n            <!-- Wave Indicator -->\n            <div class=\"wave-indicator hidden\" id=\"wave-indicator\" style=\"position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 1000; pointer-events: none; transition: opacity 0.5s; display: flex; align-items: center; justify-content: center; width: 100%; height: 300px;\">\n                <img id=\"wave-banner-img\" style=\"position: absolute; width: 100%; height: 100%; object-fit: contain; filter: drop-shadow(0 10px 20px rgba(0,0,0,0.5));\">\n                <span id=\"wave-text\" style=\"position: relative; font-size: 64px; font-weight: 800; color: #FFFFFF; text-shadow: 3px 3px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 0 0 20px rgba(0,0,0,0.8); text-transform: uppercase; text-align: center; font-family: 'Fredoka', sans-serif; padding: 0 20px; line-height: 1.1; animation: warShake 0.5s infinite;\"></span>\n            </div>\n\n            <style>\n                @keyframes warShake {\n                    0% { transform: translate(1px, 1px) rotate(0deg); }\n                    10% { transform: translate(-1px, -2px) rotate(-1deg); }\n                    20% { transform: translate(-3px, 0px) rotate(1deg); }\n                    30% { transform: translate(3px, 2px) rotate(0deg); }\n                    40% { transform: translate(1px, -1px) rotate(1deg); }\n                    50% { transform: translate(-1px, 2px) rotate(-1deg); }\n                    60% { transform: translate(-3px, 1px) rotate(0deg); }\n                    70% { transform: translate(3px, 1px) rotate(-1deg); }\n                    80% { transform: translate(-1px, -1px) rotate(1deg); }\n                    90% { transform: translate(1px, 2px) rotate(0deg); }\n                    100% { transform: translate(1px, -2px) rotate(-1deg); }\n                }\n            </style>\n\n            <!-- Persistent Phase Display -->\n            <div class=\"phase-display hidden\" id=\"phase-display\" style=\"position: absolute; top: 120px; left: 50%; transform: translateX(-50%); font-size: 20px; font-weight: 700; color: #fff; text-shadow: 2px 2px 4px rgba(0,0,0,0.8); z-index: 95; background: linear-gradient(180deg, rgba(109, 76, 65, 0.95) 0%, rgba(78, 52, 46, 0.95) 100%); padding: 5px 16px; border-radius: 10px; border: 2px solid #3e2723; box-shadow: 0 3px 6px rgba(0,0,0,0.3);\">PHASE: 1/3</div>\n\n            <!-- Next Wave Timer -->\n            <div class=\"next-wave-timer hidden\" id=\"next-wave-timer\" style=\"position: absolute; bottom: 140px; left: 50%; transform: translateX(-50%); font-size: 22px; font-weight: 700; color: #FFD700; text-shadow: 2px 2px 4px black; z-index: 100; pointer-events: none; background: linear-gradient(180deg, rgba(30,30,30,0.95) 0%, rgba(0,0,0,0.95) 100%); padding: 8px 20px; border-radius: 25px; border: 2px solid #5d4037; animation: pulse 1s infinite alternate; box-shadow: 0 4px 12px rgba(0,0,0,0.5);\">Next wave in: 25s</div>\n\n            <!-- Mode Indicator (Edit Mode) -->\n            <div class=\"story-toast hidden\" id=\"story-toast\">\n                <img id=\"story-toast-img\" alt=\"\">\n                <div class=\"story-toast-bubble\" id=\"story-toast-text\"></div>\n            </div>\n\n            <div class=\"mode-indicator hidden\" id=\"mode-indicator\" data-i18n=\"edit_mode\">EDIT MODE</div>\n\n            <!-- Main Menu -->\n            <div class=\"menu-screen\" id=\"main-menu\">\n                <div class=\"menu-panel\">\n                    <div id=\"loading-indicator\" data-i18n=\"loading\" style=\"font-size: 18px; color: #5d4037; margin-bottom: 20px;\">Loading Assets...</div>\n                    <h1 class=\"menu-title\" data-i18n=\"title\">Plant vs Zombies 2</h1>\n                    <div class=\"menu-buttons\">\n                        <button class=\"menu-button\" id=\"play-btn\" data-i18n=\"play\">Play</button>\n                        <button class=\"menu-button secondary\" id=\"story-btn\" style=\"height: 76px; font-size: 26px;\">\ud83d\udcd6 <span data-i18n=\"story_btn\">Story Prologue</span></button>\n                        <button class=\"menu-button secondary\" id=\"settings-btn\" style=\"height: 76px; font-size: 26px;\">\u2699\ufe0f <span data-i18n=\"settings\">Settings</span></button>\n                    </div>\n                </div>\n            </div>\n\n            <!-- Animated Story Cutscene Overlay -->\n            <div class=\"story-screen hidden\" id=\"story-screen\">\n                <button class=\"story-skip-btn\" id=\"story-skip-btn\"><span data-i18n=\"skip\">SKIP</span> \u23ed</button>\n                <div class=\"story-stage\" id=\"story-stage\">\n                    <img class=\"story-bg\" id=\"story-bg-img\" alt=\"Background\">\n                    <div class=\"story-vignette\" id=\"story-vignette\"></div>\n                    <div class=\"story-actors-layer\" id=\"story-actors-layer\"></div>\n                </div>\n                <div class=\"story-bottom-panel\">\n                    <div class=\"story-chapter-badge\" id=\"story-chapter-badge\">PROLOGUE \u2022 ACT 1</div>\n                    <div class=\"story-text-container\">\n                        <div class=\"story-narration\" id=\"story-narration-text\" data-i18n=\"story_loading\">Loading story...</div>\n                    </div>\n                    <div class=\"story-controls\">\n                        <div class=\"story-progress-dots\" id=\"story-progress-dots\"></div>\n                        <button class=\"story-nav-btn\" id=\"story-next-btn\">NEXT \u2794</button>\n                    </div>\n                </div>\n            </div>\n\n            <!-- Level Selection -->\n            <div class=\"menu-screen hidden\" id=\"level-selection\">\n                <div class=\"menu-panel\" style=\"width: 600px; position: relative;\">\n                    <h1 class=\"menu-title\" data-i18n=\"select_level\">Select Level</h1>\n                    <div class=\"level-grid\" id=\"level-grid\"></div>\n                    <button class=\"menu-button secondary\" id=\"back-to-menu\" style=\"margin-top: 24px;\" data-i18n=\"back\">Back</button>\n                </div>\n            </div>\n\n            <!-- Selection Screen -->\n            <div class=\"menu-screen hidden\" id=\"selection-screen\">\n                <div class=\"menu-panel\" style=\"width: 650px; max-height: 90%;\">\n                    <h1 class=\"menu-title\" style=\"font-size: 56px; margin-bottom: 10px;\" data-i18n=\"choose_plants\">Choose Your Plants</h1>\n                    <div style=\"display: flex; gap: 15px; align-items: center; margin-bottom: 15px;\">\n                        <div id=\"selection-sun-display\" style=\"display: flex; align-items: center; background: #bda27e; border: 4px solid #5d4037; border-radius: 15px; padding: 8px 15px; gap: 10px; box-shadow: 0 4px 0 #3e2723;\">\n                             <img id=\"selection-sun-icon\" style=\"width: 50px; height: 50px; filter: drop-shadow(0 2px 3px rgba(0,0,0,0.4));\" alt=\"Sun\">\n                             <div style=\"background: #fff; border: 3px solid #5d4037; border-radius: 12px; padding: 2px 15px; min-width: 80px; text-align: center;\">\n                                <span id=\"selection-sun-count\" style=\"font-size: 28px; font-weight: 700; color: #333;\">0</span>\n                             </div>\n                        </div>\n                        <div id=\"selection-status\" style=\"font-size: 24px; color: #5d4037; font-weight: 700;\">Selected: 0/5</div>\n                    </div>\n                    <div class=\"selection-grid\" id=\"selection-grid\" style=\"display: grid; grid-template-columns: repeat(4, 1fr); gap: 15px; background: rgba(0,0,0,0.1); padding: 20px; border-radius: 15px; margin-bottom: 20px; width: 100%; max-height: 300px; overflow-y: auto; border: 3px solid #5d4037;\"></div>\n                    <div class=\"loadout-preview\" id=\"loadout-preview\" style=\"display: flex; gap: 10px; margin-bottom: 25px; min-height: 100px; background: rgba(0,0,0,0.2); padding: 10px; border-radius: 15px; width: 100%; justify-content: center; align-items: center; border: 3px dashed #5d4037;\"></div>\n                    <div class=\"menu-buttons\" id=\"selection-buttons\" style=\"flex-direction: row; gap: 20px; justify-content: center; width: 100%;\">\n                        <button class=\"menu-button secondary\" id=\"selection-back-btn\" data-i18n=\"back\">Back</button>\n                        <button class=\"menu-button\" id=\"start-level-btn\" data-i18n=\"start_game\">Start Game</button>\n                    </div>\n                </div>\n            </div>\n\n            <!-- Pause Menu -->\n            <!-- Gardener Library Screen -->\n            <div class=\"menu-screen hidden\" id=\"library-screen\">\n                <div class=\"menu-panel\" style=\"width: 700px; max-height: 90%;\">\n                    <h1 class=\"menu-title\" style=\"font-size: 56px; margin-bottom: 5px;\" data-i18n=\"collection\">Plant Collection</h1>\n                    <div id=\"library-status\" data-i18n=\"discover\" style=\"margin-bottom: 15px; font-size: 22px; color: #5d4037; font-weight: 700;\">Discover your plant defenders!</div>\n                    <div class=\"library-grid\" id=\"library-grid\" style=\"display: grid; grid-template-columns: repeat(4, 1fr); gap: 15px; background: rgba(0,0,0,0.1); padding: 20px; border-radius: 15px; margin-bottom: 20px; width: 100%; max-height: 450px; overflow-y: auto; border: 3px solid #5d4037;\"></div>\n                    <div class=\"menu-buttons\">\n                        <button class=\"menu-button\" id=\"library-close-btn\" data-i18n=\"close\">Close</button>\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"menu-screen hidden\" id=\"pause-menu\">\n                <div class=\"menu-panel\">\n                    <h1 class=\"menu-title\" data-i18n=\"paused\">Paused</h1>\n                    <div class=\"menu-buttons\">\n                        <button class=\"menu-button\" id=\"resume-btn\" data-i18n=\"resume\">Resume</button>\n                        <button class=\"menu-button secondary\" id=\"restart-btn\" data-i18n=\"restart\">Restart</button>\n                        <button class=\"menu-button secondary\" id=\"quit-btn\" data-i18n=\"level_select\">Level Select</button>\n                        <button class=\"menu-button secondary\" id=\"pause-settings-btn\">\u2699\ufe0f <span data-i18n=\"settings\">Settings</span></button>\n                        <button class=\"menu-button danger\" id=\"pause-to-main-btn\" data-i18n=\"main_menu\">Main Menu</button>\n                    </div>\n                </div>\n            </div>\n\n            <!-- Victory Screen -->\n            <div class=\"menu-screen hidden\" id=\"victory-screen\">\n                <div class=\"menu-panel\">\n                    <h1 class=\"menu-title\" data-i18n=\"victory\">Victory!</h1>\n                    <div class=\"result-stars\" id=\"victory-stars\"></div>\n                    <div class=\"menu-buttons\">\n                        <button class=\"menu-button\" id=\"next-level-btn\" data-i18n=\"next_level\">Next Level</button>\n                        <button class=\"menu-button secondary\" id=\"replay-btn\" data-i18n=\"replay\">Replay</button>\n                        <button class=\"menu-button secondary\" id=\"victory-quit-btn\" data-i18n=\"level_select\">Level Select</button>\n                        <button class=\"menu-button danger\" id=\"victory-to-main-btn\" data-i18n=\"main_menu\">Main Menu</button>\n                    </div>\n                </div>\n            </div>\n\n            <!-- Defeat Screen -->\n            <div class=\"menu-screen hidden\" id=\"defeat-screen\">\n                <div class=\"menu-panel\">\n                    <h1 class=\"menu-title\" data-i18n=\"defeat\">Defeat!</h1>\n                    <div class=\"menu-buttons\">\n                        <button class=\"menu-button\" id=\"retry-btn\" data-i18n=\"retry\">Retry</button>\n                        <button class=\"menu-button danger\" id=\"defeat-quit-btn\" data-i18n=\"level_select\">Level Select</button>\n                        <button class=\"menu-button secondary\" id=\"defeat-to-main-btn\" data-i18n=\"main_menu\">Main Menu</button>\n                    </div>\n                </div>\n            </div>\n\n            <!-- Unlock Popup -->\n            <div class=\"menu-screen hidden\" id=\"unlock-popup\">\n                <div class=\"menu-panel\" style=\"width: 500px;\">\n                    <h1 class=\"menu-title\" style=\"font-size: 48px; margin-bottom: 10px;\" data-i18n=\"new_plant\">New Plant!</h1>\n                    <div class=\"unlock-quote\" data-i18n=\"unl_q\">Reporting for duty, Gardener! \ud83c\udf31</div>\n                    <div id=\"unlock-card-container\" style=\"margin-bottom: 20px;\"></div>\n                    <h2 id=\"unlock-name\" style=\"color: #5d4037; font-size: 32px; margin-bottom: 10px;\">Sunflower</h2>\n                    <p id=\"unlock-description\" style=\"color: #5d4037; font-size: 20px; text-align: center; margin-bottom: 25px; padding: 0 20px; font-weight: 600;\">Generates extra Sun for your garden.</p>\n                    <button class=\"menu-button\" id=\"unlock-continue-btn\" data-i18n=\"awesome\">Awesome!</button>\n                </div>\n            </div>\n\n            <!-- Tutorial Overlay -->\n            <div class=\"menu-screen hidden\" id=\"settings-screen\">\n                <div class=\"menu-panel\">\n                    <h1 class=\"menu-title\" data-i18n=\"settings\">Settings</h1>\n                    <div class=\"settings-label\">\ud83c\udf10 <span data-i18n=\"language\">Language</span></div>\n                    <div class=\"lang-select-wrap\">\n                        <select id=\"language-select\" class=\"lang-select\"></select>\n                    </div>\n                    <div class=\"menu-buttons\">\n                        <button class=\"menu-button\" id=\"settings-close-btn\" data-i18n=\"close\">Close</button>\n                    </div>\n                </div>\n            </div>\n\n            <div id=\"tutorial-container\" class=\"hidden\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 2000;\">\n                <div id=\"tutorial-step-1\" class=\"tutorial-box centered hidden\" style=\"top: 50%; left: 50%;\">\n                    <span data-i18n=\"tut1\">Welcome to Plant vs Zombies 2!</span>\n                    <button class=\"menu-button\" style=\"height: 64px; font-size: 24px; min-width: 160px;\" onclick=\"window.nextTutorialStep(1)\" data-i18n=\"next\">NEXT</button>\n                </div>\n                <div id=\"tutorial-step-2\" class=\"tutorial-box centered hidden\" style=\"top: 50%; left: 50%;\">\n                    <span data-i18n=\"tut2\">Collect Sunlight to grow your defenses.</span>\n                    <button class=\"menu-button\" style=\"height: 64px; font-size: 24px; min-width: 160px;\" onclick=\"window.nextTutorialStep(2)\" data-i18n=\"next\">NEXT</button>\n                </div>\n                <div id=\"tutorial-step-3\" class=\"tutorial-box hidden\" style=\"top: 120px; right: 20px;\">\n                    <span data-i18n=\"tut3\">Use the menu button to pause or restart the level.</span>\n                    <div class=\"tutorial-arrow\" style=\"top: -15px; right: 30px; border-top: none; border-bottom: 15px solid #5d4037;\"></div>\n                    <button class=\"menu-button\" style=\"height: 64px; font-size: 24px; min-width: 160px;\" onclick=\"window.nextTutorialStep(3)\" data-i18n=\"next\">NEXT</button>\n                </div>\n                <div id=\"tutorial-step-4\" class=\"tutorial-box hidden\" style=\"top: 160px; left: 50%; transform: translateX(-50%);\">\n                    <span data-i18n=\"tut4\">Tap plant cards to select a plant, then tap a grid cell to place it.</span>\n                    <div class=\"tutorial-arrow\" style=\"top: -15px; left: 50%; transform: translateX(-50%); border-top: none; border-bottom: 15px solid #5d4037;\"></div>\n                    <button class=\"menu-button\" style=\"height: 64px; font-size: 24px; min-width: 180px;\" onclick=\"window.nextTutorialStep(4)\" data-i18n=\"got_it\">GOT IT!</button>\n                </div>\n                <button id=\"tutorial-skip-all\" class=\"menu-button secondary\" style=\"position: absolute; bottom: 20px; right: 20px; min-width: 120px; width: auto; height: 60px; font-size: 24px; color: #5d4037; pointer-events: auto;\" data-i18n=\"skip\">SKIP</button>\n            </div>\n        </div>\n    </div>\n\n    <script>\n        /* ================= LOCALIZATION DICTIONARY (17 languages: 15+ supported) ================= */\n        window.PLANT_ORDER = ['sunflower','peashooter','wallnut','snowpea','cherrybomb','repeater','potatomine','squash','jalapeno','spikeweed','torchwood','tallnut','cactus','starfruit'];\n        window.RTL_LANGS = ['ar', 'ur'];\n        window.LANG_NAMES = {\n            en: 'English', zh: '\u4e2d\u6587 (\u7b80\u4f53)', hi: '\u0939\u093f\u0928\u094d\u0926\u0940', es: 'Espa\u00f1ol', ar: '\u0627\u0644\u0639\u0631\u0628\u064a\u0629', fr: 'Fran\u00e7ais',\n            bn: '\u09ac\u09be\u0982\u09b2\u09be', pt: 'Portugu\u00eas', ru: '\u0420\u0443\u0441\u0441\u043a\u0438\u0439', id: 'Bahasa Indonesia', ur: '\u0627\u0631\u062f\u0648',\n            de: 'Deutsch', ja: '\u65e5\u672c\u8a9e', jv: 'Basa Jawa', ko: '\ud55c\uad6d\uc5b4', it: 'Italiano', vi: 'Ti\u1ebfng Vi\u1ec7t'\n        };\n        window.I18N = {\n            en: {\n                loading: \"Loading Assets...\", title: \"Plant vs Zombies 2\", play: \"Play\", story_btn: \"Story Prologue\", settings: \"Settings\", language: \"Language\",\n                skip: \"SKIP\", next: \"NEXT\", defend: \"DEFEND THE LAWN!\", act: \"PROLOGUE \u2022 ACT {n}\", story_loading: \"Loading story...\",\n                select_level: \"Select Level\", back: \"Back\", choose_plants: \"Choose Your Plants\", selected: \"Selected: {n}/5\", start_game: \"Start Game\",\n                collection: \"Plant Collection\", discover: \"Discover your plant defenders!\", close: \"Close\",\n                paused: \"Paused\", resume: \"Resume\", restart: \"Restart\", level_select: \"Level Select\", main_menu: \"Main Menu\",\n                victory: \"Victory!\", next_level: \"Next Level\", replay: \"Replay\", defeat: \"Defeat!\", retry: \"Retry\",\n                new_plant: \"New Plant!\", awesome: \"Awesome!\", new_plant_desc: \"A new powerful plant joins your defense!\",\n                tut1: \"Welcome to Plant vs Zombies 2!\", tut2: \"Collect Sunlight to grow your defenses.\", tut3: \"Use the menu button to pause or restart the level.\", tut4: \"Tap plant cards to select a plant, then tap a grid cell to place it.\", got_it: \"GOT IT!\",\n                prep: \"Preparation: {s}s\", next_phase: \"Next phase in: {s}s\", phase_start: \"PHASE {n} STARTING\", phase: \"PHASE: {n}/{t}\",\n                level_n: \"Level {n}\", unlocks_at: \"Unlocks at Level {n}\", lv1: \"Garden Basics\", lv2: \"Defensive Line\", lv3: \"Explosive Defense\", edit_mode: \"EDIT MODE\",\n                p: [\"Sunflower\",\"Peashooter\",\"Wall-nut\",\"Snow Pea\",\"Cherry Bomb\",\"Repeater\",\"Potato Mine\",\"Squash\",\"Jalapeno\",\"Spikeweed\",\"Torchwood\",\"Tall-nut\",\"Cactus\",\"Starfruit\"],\n                d: [\"Generates extra Sun to help you grow your arsenal faster!\",\"Shoots peas at approaching enemies to defend your lawn.\",\"Has a very hard shell to protect your other plants from being eaten.\",\"Fires frozen peas that slow down enemy movement and attacks.\",\"Explodes in a large area, destroying all zombies in its range!\",\"Double the trouble! Shoots two peas at a time for extra damage.\",\"Explodes on contact! Needs a little time to arm itself underground.\",\"Smashes the first zombie that gets too close to it.\",\"A fiery pepper that destroys every zombie in its entire lane!\",\"Damages zombies that try to walk over its sharp spikes.\",\"Ignites peas that pass through it, doubling their damage!\",\"A massive wall that even jumping zombies can't get over.\",\"Shoots sharp spikes that can even pop balloons!\",\"A cheerful fruit that shoots stars in five different directions!\"],\n                n1: \"A peaceful, golden morning in Neighborville. The cheerful Sunflower humming in the breeze, unaware of the lurking shadows...\",\n                b1a: \"What a glorious sunny day! Not a zombie in sight! \ud83c\udf3b\", b1b: \"Perimeter looks calm! Time to soak in the morning sun.\",\n                n2: \"UNTIL THE GROUND TREMBLED! Shuffling footsteps echoed down the street as the ravenous undead stepped into the light with one craving... <highlight>BRAINS!</highlight>\",\n                b2a: \"BRRRRAAAIIINSSS... We want juicy brains! \ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"Traffic cone defense ready! March to the porch!\", b2c: \"\u26a0\ufe0f CODE RED! UNDEAD AT THE CURB!\",\n                n3: \"A colossal invasion forces its way toward your doorstep! The telephone-pole swinging Gargantuar and athletic football zombies threaten to overrun the lawn!\",\n                b3a: \"SMASH! SMASH THE HOUSE! \ud83d\udca5\",\n                n4: \"The green resistance awakens! Command your botanical guardians, collect solar energy, deploy tough barriers, and blast away the horde to save your neighborhood!\",\n                b4a: \"Sun up, roots down! We'll protect this garden!\", b4b: \"They will NOT break my shell! Stand firm!\", b4c: \"Locked and loaded! Ready, aim, FIRE! \ud83c\udfaf\"\n            },\n            zh: {\n                loading: \"\u6b63\u5728\u52a0\u8f7d\u8d44\u6e90...\", title: \"\u690d\u7269\u5927\u6218\u50f5\u5c382\", play: \"\u5f00\u59cb\u6e38\u620f\", story_btn: \"\u6545\u4e8b\u5e8f\u7ae0\", settings: \"\u8bbe\u7f6e\", language: \"\u8bed\u8a00\",\n                skip: \"\u8df3\u8fc7\", next: \"\u4e0b\u4e00\u6b65\", defend: \"\u4fdd\u536b\u8349\u576a\uff01\", act: \"\u5e8f\u7ae0 \u2022 \u7b2c{n}\u5e55\", story_loading: \"\u6b63\u5728\u52a0\u8f7d\u6545\u4e8b...\",\n                select_level: \"\u9009\u62e9\u5173\u5361\", back: \"\u8fd4\u56de\", choose_plants: \"\u9009\u62e9\u4f60\u7684\u690d\u7269\", selected: \"\u5df2\u9009\uff1a{n}/5\", start_game: \"\u5f00\u59cb\u6218\u6597\",\n                collection: \"\u690d\u7269\u56fe\u9274\", discover: \"\u53d1\u73b0\u4f60\u7684\u690d\u7269\u5b88\u62a4\u8005\uff01\", close: \"\u5173\u95ed\",\n                paused: \"\u5df2\u6682\u505c\", resume: \"\u7ee7\u7eed\", restart: \"\u91cd\u65b0\u5f00\u59cb\", level_select: \"\u9009\u62e9\u5173\u5361\", main_menu: \"\u4e3b\u83dc\u5355\",\n                victory: \"\u80dc\u5229\uff01\", next_level: \"\u4e0b\u4e00\u5173\", replay: \"\u91cd\u73a9\", defeat: \"\u5931\u8d25\uff01\", retry: \"\u91cd\u8bd5\",\n                new_plant: \"\u65b0\u690d\u7269\uff01\", awesome: \"\u592a\u68d2\u4e86\uff01\", new_plant_desc: \"\u4e00\u4f4d\u5f3a\u5927\u7684\u65b0\u690d\u7269\u52a0\u5165\u4e86\u4f60\u7684\u9632\u7ebf\uff01\",\n                tut1: \"\u6b22\u8fce\u6765\u5230\u690d\u7269\u5927\u6218\u50f5\u5c382\uff01\", tut2: \"\u6536\u96c6\u9633\u5149\u6765\u58ee\u5927\u4f60\u7684\u9632\u5fa1\u3002\", tut3: \"\u4f7f\u7528\u83dc\u5355\u6309\u94ae\u6682\u505c\u6216\u91cd\u65b0\u5f00\u59cb\u5173\u5361\u3002\", tut4: \"\u70b9\u51fb\u690d\u7269\u5361\u7247\u9009\u62e9\u690d\u7269\uff0c\u7136\u540e\u70b9\u51fb\u683c\u5b50\u8fdb\u884c\u79cd\u690d\u3002\", got_it: \"\u660e\u767d\u4e86\uff01\",\n                prep: \"\u51c6\u5907\u65f6\u95f4\uff1a{s}\u79d2\", next_phase: \"\u4e0b\u4e00\u9636\u6bb5\uff1a{s}\u79d2\", phase_start: \"\u7b2c{n}\u9636\u6bb5\u5f00\u59cb\", phase: \"\u9636\u6bb5\uff1a{n}/{t}\",\n                level_n: \"\u7b2c{n}\u5173\", unlocks_at: \"\u7b2c{n}\u5173\u89e3\u9501\", lv1: \"\u82b1\u56ed\u5165\u95e8\", lv2: \"\u9632\u5fa1\u9635\u7ebf\", lv3: \"\u7206\u7834\u9632\u5fa1\", edit_mode: \"\u7f16\u8f91\u6a21\u5f0f\",\n                p: [\"\u5411\u65e5\u8475\",\"\u8c4c\u8c46\u5c04\u624b\",\"\u575a\u679c\u5899\",\"\u5bd2\u51b0\u5c04\u624b\",\"\u6a31\u6843\u70b8\u5f39\",\"\u53cc\u53d1\u5c04\u624b\",\"\u571f\u8c46\u96f7\",\"\u7a9d\u74dc\",\"\u706b\u7206\u8fa3\u6912\",\"\u5730\u523a\",\"\u706b\u70ac\u6811\u6869\",\"\u9ad8\u575a\u679c\",\"\u4ed9\u4eba\u638c\",\"\u6768\u6843\"],\n                d: [\"\u4ea7\u751f\u989d\u5916\u9633\u5149\uff0c\u5e2e\u52a9\u4f60\u66f4\u5feb\u6269\u5145\u519b\u5907\uff01\",\"\u5411\u6765\u88ad\u7684\u654c\u4eba\u53d1\u5c04\u8c4c\u8c46\uff0c\u4fdd\u536b\u4f60\u7684\u8349\u576a\u3002\",\"\u62e5\u6709\u575a\u786c\u7684\u5916\u58f3\uff0c\u4fdd\u62a4\u5176\u4ed6\u690d\u7269\u4e0d\u88ab\u5403\u6389\u3002\",\"\u53d1\u5c04\u51b0\u51bb\u8c4c\u8c46\uff0c\u51cf\u7f13\u654c\u4eba\u7684\u79fb\u52a8\u548c\u653b\u51fb\u3002\",\"\u5927\u8303\u56f4\u7206\u70b8\uff0c\u6d88\u706d\u8303\u56f4\u5185\u6240\u6709\u50f5\u5c38\uff01\",\"\u53cc\u500d\u5a01\u529b\uff01\u4e00\u6b21\u53d1\u5c04\u4e24\u9897\u8c4c\u8c46\uff0c\u9020\u6210\u989d\u5916\u4f24\u5bb3\u3002\",\"\u63a5\u89e6\u5373\u7206\u70b8\uff01\u9700\u8981\u4e00\u70b9\u65f6\u95f4\u5728\u5730\u4e0b\u51c6\u5907\u3002\",\"\u538b\u6241\u7b2c\u4e00\u4e2a\u9760\u5f97\u592a\u8fd1\u7684\u50f5\u5c38\u3002\",\"\u706b\u7206\u8fa3\u6912\uff0c\u6467\u6bc1\u6574\u6761\u8def\u7ebf\u4e0a\u7684\u6240\u6709\u50f5\u5c38\uff01\",\"\u4f24\u5bb3\u8bd5\u56fe\u8e29\u8fc7\u5176\u5c16\u523a\u7684\u50f5\u5c38\u3002\",\"\u70b9\u71c3\u7a7f\u8fc7\u5b83\u7684\u8c4c\u8c46\uff0c\u4f7f\u4f24\u5bb3\u7ffb\u500d\uff01\",\"\u5de8\u5927\u7684\u5899\u58c1\uff0c\u8fde\u4f1a\u8df3\u7684\u50f5\u5c38\u4e5f\u8d8a\u4e0d\u8fc7\u53bb\u3002\",\"\u53d1\u5c04\u5c16\u523a\uff0c\u751a\u81f3\u80fd\u6233\u7834\u6c14\u7403\uff01\",\"\u5feb\u4e50\u7684\u679c\u5b9e\uff0c\u5411\u4e94\u4e2a\u65b9\u5411\u53d1\u5c04\u661f\u661f\uff01\"],\n                n1: \"\u90bb\u5c45\u9547\u4e00\u4e2a\u5b81\u9759\u91d1\u8272\u7684\u65e9\u6668\u3002\u5feb\u4e50\u7684\u5411\u65e5\u8475\u5728\u5fae\u98ce\u4e2d\u54fc\u7740\u6b4c\uff0c\u4e1d\u6beb\u6ca1\u6709\u5bdf\u89c9\u6f5c\u4f0f\u7684\u9634\u5f71\u2026\u2026\",\n                b1a: \"\u591a\u4e48\u707f\u70c2\u7684\u6674\u5929\uff01\u4e00\u4e2a\u50f5\u5c38\u90fd\u6ca1\u6709\uff01\ud83c\udf3b\", b1b: \"\u5468\u8fb9\u4e00\u5207\u5e73\u9759\uff01\u662f\u65f6\u5019\u4eab\u53d7\u6668\u5149\u4e86\u3002\",\n                n2: \"\u76f4\u5230\u5927\u5730\u5f00\u59cb\u98a4\u6296\uff01\u62d6\u6c93\u7684\u811a\u6b65\u58f0\u5728\u8857\u9053\u4e0a\u56de\u8361\uff0c\u9965\u997f\u7684\u4ea1\u7075\u5e26\u7740\u552f\u4e00\u7684\u6e34\u671b\u8d70\u8fdb\u4e86\u5149\u660e\u2026\u2026<highlight>\u8111\u5b50\uff01</highlight>\",\n                b2a: \"\u8111\u2026\u2026\u5b50\u2026\u2026\u6211\u4eec\u8981\u591a\u6c41\u7684\u8111\u5b50\uff01\ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"\u8def\u969c\u9632\u5fa1\u5c31\u7eea\uff01\u5411\u95e8\u5eca\u8fdb\u519b\uff01\", b2c: \"\u26a0\ufe0f \u7ea2\u8272\u8b66\u62a5\uff01\u4ea1\u7075\u5df2\u5230\u8def\u8fb9\uff01\",\n                n3: \"\u4e00\u652f\u5e9e\u5927\u7684\u5165\u4fb5\u5927\u519b\u6b63\u903c\u8fd1\u4f60\u7684\u5bb6\u95e8\uff01\u6325\u821e\u7535\u7ebf\u6746\u7684\u5de8\u4eba\u50f5\u5c38\u548c\u6a44\u6984\u7403\u50f5\u5c38\u5373\u5c06\u51b2\u57ae\u8349\u576a\uff01\",\n                b3a: \"\u7838\uff01\u7838\u70c2\u623f\u5b50\uff01\ud83d\udca5\",\n                n4: \"\u7eff\u8272\u62b5\u6297\u519b\u89c9\u9192\u4e86\uff01\u6307\u6325\u4f60\u7684\u690d\u7269\u5b88\u62a4\u8005\uff0c\u6536\u96c6\u9633\u5149\u80fd\u91cf\uff0c\u90e8\u7f72\u575a\u56fa\u5c4f\u969c\uff0c\u51fb\u9000\u50f5\u5c38\u5927\u519b\uff0c\u62ef\u6551\u4f60\u7684\u793e\u533a\uff01\",\n                b4a: \"\u9633\u5149\u5347\u8d77\uff0c\u624e\u6839\u5927\u5730\uff01\u6211\u4eec\u4f1a\u4fdd\u62a4\u8fd9\u5ea7\u82b1\u56ed\uff01\", b4b: \"\u4ed6\u4eec\u4f11\u60f3\u6253\u7834\u6211\u7684\u58f3\uff01\u575a\u5b88\u9635\u5730\uff01\", b4c: \"\u5f39\u836f\u88c5\u586b\u5b8c\u6bd5\uff01\u9884\u5907\uff0c\u7784\u51c6\uff0c\u5f00\u706b\uff01\ud83c\udfaf\"\n            },\n            hi: {\n                loading: \"\u090f\u0938\u0947\u091f \u0932\u094b\u0921 \u0939\u094b \u0930\u0939\u0947 \u0939\u0948\u0902...\", title: \"\u092a\u094d\u0932\u093e\u0902\u091f\u094d\u0938 \u092c\u0928\u093e\u092e \u091c\u093c\u0949\u092e\u094d\u092c\u0940\u091c\u093c 2\", play: \"\u0916\u0947\u0932\u0947\u0902\", story_btn: \"\u0915\u0939\u093e\u0928\u0940 \u0915\u0940 \u0936\u0941\u0930\u0941\u0906\u0924\", settings: \"\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938\", language: \"\u092d\u093e\u0937\u093e\",\n                skip: \"\u091b\u094b\u0921\u093c\u0947\u0902\", next: \"\u0906\u0917\u0947\", defend: \"\u0932\u0949\u0928 \u0915\u0940 \u0930\u0915\u094d\u0937\u093e \u0915\u0930\u094b!\", act: \"\u092a\u094d\u0930\u0938\u094d\u0924\u093e\u0935\u0928\u093e \u2022 \u0905\u0902\u0915 {n}\", story_loading: \"\u0915\u0939\u093e\u0928\u0940 \u0932\u094b\u0921 \u0939\u094b \u0930\u0939\u0940 \u0939\u0948...\",\n                select_level: \"\u0932\u0947\u0935\u0932 \u091a\u0941\u0928\u0947\u0902\", back: \"\u0935\u093e\u092a\u0938\", choose_plants: \"\u0905\u092a\u0928\u0947 \u092a\u094c\u0927\u0947 \u091a\u0941\u0928\u0947\u0902\", selected: \"\u091a\u092f\u0928\u093f\u0924: {n}/5\", start_game: \"\u0916\u0947\u0932 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902\",\n                collection: \"\u092a\u094c\u0927\u094b\u0902 \u0915\u093e \u0938\u0902\u0917\u094d\u0930\u0939\", discover: \"\u0905\u092a\u0928\u0947 \u092a\u094c\u0927\u0947 \u0930\u0915\u094d\u0937\u0915\u094b\u0902 \u0915\u094b \u0916\u094b\u091c\u0947\u0902!\", close: \"\u092c\u0902\u0926 \u0915\u0930\u0947\u0902\",\n                paused: \"\u0930\u0941\u0915\u093e \u0939\u0941\u0906\", resume: \"\u091c\u093e\u0930\u0940 \u0930\u0916\u0947\u0902\", restart: \"\u092b\u093f\u0930 \u0938\u0947 \u0936\u0941\u0930\u0942\", level_select: \"\u0932\u0947\u0935\u0932 \u091a\u0941\u0928\u0947\u0902\", main_menu: \"\u092e\u0941\u0916\u094d\u092f \u092e\u0947\u0928\u0942\",\n                victory: \"\u091c\u0940\u0924!\", next_level: \"\u0905\u0917\u0932\u093e \u0932\u0947\u0935\u0932\", replay: \"\u0926\u094b\u092c\u093e\u0930\u093e \u0916\u0947\u0932\u0947\u0902\", defeat: \"\u0939\u093e\u0930!\", retry: \"\u092b\u093f\u0930 \u0915\u094b\u0936\u093f\u0936 \u0915\u0930\u0947\u0902\",\n                new_plant: \"\u0928\u092f\u093e \u092a\u094c\u0927\u093e!\", awesome: \"\u092c\u0939\u0941\u0924 \u092c\u0922\u093c\u093f\u092f\u093e!\", new_plant_desc: \"\u090f\u0915 \u0928\u092f\u093e \u0936\u0915\u094d\u0924\u093f\u0936\u093e\u0932\u0940 \u092a\u094c\u0927\u093e \u0906\u092a\u0915\u0940 \u0930\u0915\u094d\u0937\u093e \u092e\u0947\u0902 \u0936\u093e\u092e\u093f\u0932 \u0939\u0941\u0906!\",\n                tut1: \"\u092a\u094d\u0932\u093e\u0902\u091f\u094d\u0938 \u092c\u0928\u093e\u092e \u091c\u093c\u0949\u092e\u094d\u092c\u0940\u091c\u093c 2 \u092e\u0947\u0902 \u0906\u092a\u0915\u093e \u0938\u094d\u0935\u093e\u0917\u0924 \u0939\u0948!\", tut2: \"\u0905\u092a\u0928\u0940 \u0930\u0915\u094d\u0937\u093e \u092c\u0922\u093c\u093e\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0927\u0942\u092a \u0907\u0915\u091f\u094d\u0920\u093e \u0915\u0930\u0947\u0902\u0964\", tut3: \"\u0932\u0947\u0935\u0932 \u0930\u094b\u0915\u0928\u0947 \u092f\u093e \u092b\u093f\u0930 \u0938\u0947 \u0936\u0941\u0930\u0942 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u092e\u0947\u0928\u0942 \u092c\u091f\u0928 \u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0915\u0930\u0947\u0902\u0964\", tut4: \"\u092a\u094c\u0927\u093e \u091a\u0941\u0928\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0915\u093e\u0930\u094d\u0921 \u092a\u0930 \u091f\u0948\u092a \u0915\u0930\u0947\u0902, \u092b\u093f\u0930 \u0932\u0917\u093e\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0917\u094d\u0930\u093f\u0921 \u0916\u093e\u0928\u0947 \u092a\u0930 \u091f\u0948\u092a \u0915\u0930\u0947\u0902\u0964\", got_it: \"\u0938\u092e\u091d \u0917\u092f\u093e!\",\n                prep: \"\u0924\u0948\u092f\u093e\u0930\u0940: {s} \u0938\u0947\u0915\u0902\u0921\", next_phase: \"\u0905\u0917\u0932\u093e \u091a\u0930\u0923: {s} \u0938\u0947\u0915\u0902\u0921 \u092e\u0947\u0902\", phase_start: \"\u091a\u0930\u0923 {n} \u0936\u0941\u0930\u0942\", phase: \"\u091a\u0930\u0923: {n}/{t}\",\n                level_n: \"\u0932\u0947\u0935\u0932 {n}\", unlocks_at: \"\u0932\u0947\u0935\u0932 {n} \u092a\u0930 \u0916\u0941\u0932\u0947\u0917\u093e\", lv1: \"\u092c\u0917\u0940\u091a\u0947 \u0915\u0940 \u092c\u0941\u0928\u093f\u092f\u093e\u0926\", lv2: \"\u0930\u0915\u094d\u0937\u093e \u092a\u0902\u0915\u094d\u0924\u093f\", lv3: \"\u0935\u093f\u0938\u094d\u092b\u094b\u091f\u0915 \u0930\u0915\u094d\u0937\u093e\", edit_mode: \"\u090f\u0921\u093f\u091f \u092e\u094b\u0921\",\n                p: [\"\u0938\u0942\u0930\u091c\u092e\u0941\u0916\u0940\",\"\u092e\u091f\u0930 \u0936\u0942\u091f\u0930\",\"\u0905\u0916\u0930\u094b\u091f \u0926\u0940\u0935\u093e\u0930\",\"\u092c\u0930\u094d\u092b\u093c\u0940\u0932\u093e \u092e\u091f\u0930\",\"\u091a\u0947\u0930\u0940 \u092c\u092e\",\"\u0930\u093f\u092a\u0940\u091f\u0930\",\"\u0906\u0932\u0942 \u092e\u093e\u0907\u0928\",\"\u0938\u094d\u0915\u094d\u0935\u0948\u0936\",\"\u0939\u0932\u093e\u092a\u0947\u0928\u094d\u092f\u094b\",\"\u0915\u093e\u0902\u091f\u0947\u0926\u093e\u0930 \u0918\u093e\u0938\",\"\u092e\u0936\u093e\u0932 \u0932\u0915\u0921\u093c\u0940\",\"\u090a\u0901\u091a\u093e \u0905\u0916\u0930\u094b\u091f\",\"\u0915\u0948\u0915\u094d\u091f\u0938\",\"\u0938\u094d\u091f\u093e\u0930\u092b\u094d\u0930\u0942\u091f\"],\n                d: [\"\u0905\u0924\u093f\u0930\u093f\u0915\u094d\u0924 \u0927\u0942\u092a \u092c\u0928\u093e\u0924\u093e \u0939\u0948 \u0924\u093e\u0915\u093f \u0906\u092a \u0924\u0947\u091c\u093c\u0940 \u0938\u0947 \u0905\u092a\u0928\u0940 \u0938\u0947\u0928\u093e \u092c\u0922\u093c\u093e \u0938\u0915\u0947\u0902!\",\"\u0906\u0924\u0947 \u0926\u0941\u0936\u094d\u092e\u0928\u094b\u0902 \u092a\u0930 \u092e\u091f\u0930 \u0926\u093e\u0917\u0915\u0930 \u0906\u092a\u0915\u0947 \u0932\u0949\u0928 \u0915\u0940 \u0930\u0915\u094d\u0937\u093e \u0915\u0930\u0924\u093e \u0939\u0948\u0964\",\"\u0907\u0938\u0915\u093e \u0915\u0920\u094b\u0930 \u0916\u094b\u0932 \u0926\u0942\u0938\u0930\u0947 \u092a\u094c\u0927\u094b\u0902 \u0915\u094b \u0916\u093e\u090f \u091c\u093e\u0928\u0947 \u0938\u0947 \u092c\u091a\u093e\u0924\u093e \u0939\u0948\u0964\",\"\u091c\u092e\u0947 \u0939\u0941\u090f \u092e\u091f\u0930 \u0926\u093e\u0917\u0924\u093e \u0939\u0948 \u091c\u094b \u0926\u0941\u0936\u094d\u092e\u0928\u094b\u0902 \u0915\u0940 \u091a\u093e\u0932 \u0914\u0930 \u0939\u092e\u0932\u0947 \u0927\u0940\u092e\u0947 \u0915\u0930\u0924\u0947 \u0939\u0948\u0902\u0964\",\"\u092c\u0921\u093c\u0947 \u0915\u094d\u0937\u0947\u0924\u094d\u0930 \u092e\u0947\u0902 \u092b\u091f\u0924\u093e \u0939\u0948 \u0914\u0930 \u0938\u092d\u0940 \u091c\u093c\u0949\u092e\u094d\u092c\u0940\u091c\u093c \u0915\u094b \u0928\u0937\u094d\u091f \u0915\u0930\u0924\u093e \u0939\u0948!\",\"\u0926\u094b\u0917\u0941\u0928\u0940 \u092e\u093e\u0930! \u090f\u0915 \u0938\u093e\u0925 \u0926\u094b \u092e\u091f\u0930 \u0926\u093e\u0917\u0924\u093e \u0939\u0948\u0964\",\"\u091b\u0942\u0924\u0947 \u0939\u0940 \u092b\u091f\u0924\u093e \u0939\u0948! \u091c\u093c\u092e\u0940\u0928 \u092e\u0947\u0902 \u0924\u0948\u092f\u093e\u0930 \u0939\u094b\u0928\u0947 \u092e\u0947\u0902 \u0925\u094b\u0921\u093c\u093e \u0938\u092e\u092f \u0932\u0917\u0924\u093e \u0939\u0948\u0964\",\"\u092c\u0939\u0941\u0924 \u092a\u093e\u0938 \u0906\u0928\u0947 \u0935\u093e\u0932\u0947 \u092a\u0939\u0932\u0947 \u091c\u093c\u0949\u092e\u094d\u092c\u0940 \u0915\u094b \u0915\u0941\u091a\u0932 \u0926\u0947\u0924\u093e \u0939\u0948\u0964\",\"\u090f\u0915 \u0924\u0940\u0916\u0940 \u092e\u093f\u0930\u094d\u091a \u091c\u094b \u092a\u0942\u0930\u0940 \u0932\u0947\u0928 \u0915\u0947 \u0938\u092d\u0940 \u091c\u093c\u0949\u092e\u094d\u092c\u0940\u091c\u093c \u0915\u094b \u091c\u0932\u093e \u0926\u0947\u0924\u0940 \u0939\u0948!\",\"\u0905\u092a\u0928\u0947 \u0928\u0941\u0915\u0940\u0932\u0947 \u0915\u093e\u0902\u091f\u094b\u0902 \u092a\u0930 \u091a\u0932\u0928\u0947 \u0935\u093e\u0932\u0947 \u091c\u093c\u0949\u092e\u094d\u092c\u0940\u091c\u093c \u0915\u094b \u0928\u0941\u0915\u0938\u093e\u0928 \u092a\u0939\u0941\u0901\u091a\u093e\u0924\u093e \u0939\u0948\u0964\",\"\u0905\u092a\u0928\u0947 \u092c\u0940\u091a \u0938\u0947 \u0917\u0941\u091c\u093c\u0930\u0928\u0947 \u0935\u093e\u0932\u0947 \u092e\u091f\u0930\u094b\u0902 \u092e\u0947\u0902 \u0906\u0917 \u0932\u0917\u093e\u0915\u0930 \u0928\u0941\u0915\u0938\u093e\u0928 \u0926\u094b\u0917\u0941\u0928\u093e \u0915\u0930\u0924\u093e \u0939\u0948!\",\"\u090f\u0915 \u0935\u093f\u0936\u093e\u0932 \u0926\u0940\u0935\u093e\u0930 \u091c\u093f\u0938\u0947 \u0915\u0942\u0926\u0928\u0947 \u0935\u093e\u0932\u0947 \u091c\u093c\u0949\u092e\u094d\u092c\u0940\u091c\u093c \u092d\u0940 \u092a\u093e\u0930 \u0928\u0939\u0940\u0902 \u0915\u0930 \u0938\u0915\u0924\u0947\u0964\",\"\u0928\u0941\u0915\u0940\u0932\u0947 \u0915\u093e\u0902\u091f\u0947 \u0926\u093e\u0917\u0924\u093e \u0939\u0948 \u091c\u094b \u0917\u0941\u092c\u094d\u092c\u093e\u0930\u0947 \u092d\u0940 \u092b\u094b\u0921\u093c \u0938\u0915\u0924\u0947 \u0939\u0948\u0902!\",\"\u090f\u0915 \u0916\u0941\u0936\u092e\u093f\u091c\u093c\u093e\u091c \u092b\u0932 \u091c\u094b \u092a\u093e\u0901\u091a \u0926\u093f\u0936\u093e\u0913\u0902 \u092e\u0947\u0902 \u0924\u093e\u0930\u0947 \u0926\u093e\u0917\u0924\u093e \u0939\u0948!\"],\n                n1: \"\u0928\u0947\u092c\u0930\u0935\u093f\u0932 \u092e\u0947\u0902 \u090f\u0915 \u0936\u093e\u0902\u0924, \u0938\u0941\u0928\u0939\u0930\u0940 \u0938\u0941\u092c\u0939\u0964 \u0916\u0941\u0936\u092e\u093f\u091c\u093c\u093e\u091c \u0938\u0942\u0930\u091c\u092e\u0941\u0916\u0940 \u0939\u0935\u093e \u092e\u0947\u0902 \u0917\u0941\u0928\u0917\u0941\u0928\u093e \u0930\u0939\u093e \u0939\u0948, \u091b\u093f\u092a\u0940 \u092a\u0930\u091b\u093e\u0907\u092f\u094b\u0902 \u0938\u0947 \u0905\u0928\u091c\u093e\u0928...\",\n                b1a: \"\u0915\u094d\u092f\u093e \u0936\u093e\u0928\u0926\u093e\u0930 \u0927\u0942\u092a \u0935\u093e\u0932\u093e \u0926\u093f\u0928 \u0939\u0948! \u0915\u094b\u0908 \u091c\u093c\u0949\u092e\u094d\u092c\u0940 \u0928\u091c\u093c\u0930 \u0928\u0939\u0940\u0902 \u0906 \u0930\u0939\u093e! \ud83c\udf3b\", b1b: \"\u091a\u093e\u0930\u094b\u0902 \u0924\u0930\u092b\u093c \u0936\u093e\u0902\u0924\u093f \u0939\u0948! \u0938\u0941\u092c\u0939 \u0915\u0940 \u0927\u0942\u092a \u0915\u093e \u092e\u091c\u093c\u093e \u0932\u0947\u0928\u0947 \u0915\u093e \u0938\u092e\u092f\u0964\",\n                n2: \"\u0924\u092d\u0940 \u091c\u093c\u092e\u0940\u0928 \u0915\u093e\u0901\u092a \u0909\u0920\u0940! \u0917\u0932\u0940 \u092e\u0947\u0902 \u0918\u093f\u0938\u091f\u0924\u0947 \u0915\u0926\u092e\u094b\u0902 \u0915\u0940 \u0906\u0935\u093e\u091c\u093c \u0917\u0942\u0901\u091c\u0940 \u0914\u0930 \u092d\u0942\u0916\u0947 \u092e\u0941\u0930\u094d\u0926\u0947 \u090f\u0915 \u0939\u0940 \u091a\u093e\u0939\u0924 \u0932\u0947\u0915\u0930 \u0930\u094b\u0936\u0928\u0940 \u092e\u0947\u0902 \u0906\u090f... <highlight>\u0926\u093f\u092e\u093e\u0917!</highlight>\",\n                b2a: \"\u0926\u093f\u092e\u093e\u093e\u093e\u0917... \u0939\u092e\u0947\u0902 \u0930\u0938\u0940\u0932\u093e \u0926\u093f\u092e\u093e\u0917 \u091a\u093e\u0939\u093f\u090f! \ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"\u091f\u094d\u0930\u0948\u092b\u093c\u093f\u0915 \u0915\u094b\u0928 \u0924\u0948\u092f\u093e\u0930! \u092c\u0930\u093e\u092e\u0926\u0947 \u0915\u0940 \u0913\u0930 \u092c\u0922\u093c\u094b!\", b2c: \"\u26a0\ufe0f \u0930\u0947\u0921 \u0905\u0932\u0930\u094d\u091f! \u092e\u0941\u0930\u094d\u0926\u0947 \u0938\u0921\u093c\u0915 \u092a\u0930 \u0939\u0948\u0902!\",\n                n3: \"\u090f\u0915 \u0935\u093f\u0936\u093e\u0932 \u0939\u092e\u0932\u093e \u0906\u092a\u0915\u0947 \u0926\u0930\u0935\u093e\u091c\u093c\u0947 \u0915\u0940 \u0913\u0930 \u092c\u0922\u093c \u0930\u0939\u093e \u0939\u0948! \u0916\u0902\u092d\u093e \u0918\u0941\u092e\u093e\u0928\u0947 \u0935\u093e\u0932\u093e \u0917\u093e\u0930\u094d\u0917\u0947\u0902\u091f\u0941\u0906\u0930 \u0914\u0930 \u092b\u093c\u0941\u091f\u092c\u0949\u0932 \u091c\u093c\u0949\u092e\u094d\u092c\u0940\u091c\u093c \u0932\u0949\u0928 \u0915\u094b \u0930\u094c\u0902\u0926\u0928\u0947 \u0935\u093e\u0932\u0947 \u0939\u0948\u0902!\",\n                b3a: \"\u0924\u094b\u0921\u093c\u094b! \u0918\u0930 \u0915\u094b \u0924\u094b\u0921\u093c \u0926\u094b! \ud83d\udca5\",\n                n4: \"\u0939\u0930\u0940 \u0938\u0947\u0928\u093e \u091c\u093e\u0917 \u0909\u0920\u0940 \u0939\u0948! \u0905\u092a\u0928\u0947 \u092a\u094c\u0927\u0947 \u0930\u0915\u094d\u0937\u0915\u094b\u0902 \u0915\u0940 \u0915\u092e\u093e\u0928 \u0938\u0902\u092d\u093e\u0932\u0947\u0902, \u0938\u094c\u0930 \u090a\u0930\u094d\u091c\u093e \u0907\u0915\u091f\u094d\u0920\u093e \u0915\u0930\u0947\u0902, \u092e\u091c\u093c\u092c\u0942\u0924 \u0926\u0940\u0935\u093e\u0930\u0947\u0902 \u092c\u0928\u093e\u090f\u0901 \u0914\u0930 \u092d\u0940\u0921\u093c \u0915\u094b \u0909\u0921\u093c\u093e\u0915\u0930 \u0905\u092a\u0928\u0947 \u092e\u094b\u0939\u0932\u094d\u0932\u0947 \u0915\u094b \u092c\u091a\u093e\u090f\u0901!\",\n                b4a: \"\u0938\u0942\u0930\u091c \u090a\u092a\u0930, \u091c\u0921\u093c\u0947\u0902 \u0928\u0940\u091a\u0947! \u0939\u092e \u0907\u0938 \u092c\u0917\u0940\u091a\u0947 \u0915\u0940 \u0930\u0915\u094d\u0937\u093e \u0915\u0930\u0947\u0902\u0917\u0947!\", b4b: \"\u0935\u0947 \u092e\u0947\u0930\u093e \u0916\u094b\u0932 \u0928\u0939\u0940\u0902 \u0924\u094b\u0921\u093c \u092a\u093e\u090f\u0901\u0917\u0947! \u0921\u091f\u0947 \u0930\u0939\u094b!\", b4c: \"\u0924\u0948\u092f\u093e\u0930! \u0928\u093f\u0936\u093e\u0928\u093e \u0938\u093e\u0927\u094b, \u092b\u093c\u093e\u092f\u0930! \ud83c\udfaf\"\n            },\n            es: {\n                loading: \"Cargando recursos...\", title: \"Plantas vs Zombis 2\", play: \"Jugar\", story_btn: \"Pr\u00f3logo\", settings: \"Ajustes\", language: \"Idioma\",\n                skip: \"SALTAR\", next: \"SIGUIENTE\", defend: \"\u00a1DEFIENDE EL JARD\u00cdN!\", act: \"PR\u00d3LOGO \u2022 ACTO {n}\", story_loading: \"Cargando historia...\",\n                select_level: \"Elegir nivel\", back: \"Atr\u00e1s\", choose_plants: \"Elige tus plantas\", selected: \"Elegidas: {n}/5\", start_game: \"Empezar\",\n                collection: \"Colecci\u00f3n de plantas\", discover: \"\u00a1Descubre a tus plantas defensoras!\", close: \"Cerrar\",\n                paused: \"Pausa\", resume: \"Continuar\", restart: \"Reiniciar\", level_select: \"Niveles\", main_menu: \"Men\u00fa principal\",\n                victory: \"\u00a1Victoria!\", next_level: \"Siguiente nivel\", replay: \"Repetir\", defeat: \"\u00a1Derrota!\", retry: \"Reintentar\",\n                new_plant: \"\u00a1Nueva planta!\", awesome: \"\u00a1Genial!\", new_plant_desc: \"\u00a1Una nueva y poderosa planta se une a tu defensa!\",\n                tut1: \"\u00a1Bienvenido a Plantas vs Zombis 2!\", tut2: \"Recoge luz solar para aumentar tus defensas.\", tut3: \"Usa el bot\u00f3n de men\u00fa para pausar o reiniciar el nivel.\", tut4: \"Toca una carta para elegir una planta y luego toca una casilla para plantarla.\", got_it: \"\u00a1ENTENDIDO!\",\n                prep: \"Preparaci\u00f3n: {s}s\", next_phase: \"Siguiente fase en: {s}s\", phase_start: \"COMIENZA LA FASE {n}\", phase: \"FASE: {n}/{t}\",\n                level_n: \"Nivel {n}\", unlocks_at: \"Se desbloquea en el nivel {n}\", lv1: \"Lo b\u00e1sico del jard\u00edn\", lv2: \"L\u00ednea defensiva\", lv3: \"Defensa explosiva\", edit_mode: \"MODO EDICI\u00d3N\",\n                p: [\"Girasol\",\"Lanzaguisantes\",\"Nuez\",\"Guisante helado\",\"Petacereza\",\"Repetidora\",\"Patapum\",\"Calabaza\",\"Jalape\u00f1o\",\"Pinchohierba\",\"Le\u00f1aflama\",\"Nuez alta\",\"Cactus\",\"Carambola\"],\n                d: [\"\u00a1Genera sol extra para que ampl\u00edes tu arsenal m\u00e1s r\u00e1pido!\",\"Dispara guisantes a los enemigos que se acercan.\",\"Su caparaz\u00f3n duro protege a tus otras plantas de ser devoradas.\",\"Dispara guisantes congelados que ralentizan a los enemigos.\",\"\u00a1Explota en un \u00e1rea grande y destruye a todos los zombis cercanos!\",\"\u00a1Doble problema! Dispara dos guisantes a la vez.\",\"\u00a1Explota al contacto! Necesita un poco de tiempo para armarse.\",\"Aplasta al primer zombi que se acerca demasiado.\",\"\u00a1Un chile ardiente que destruye a todos los zombis de su carril!\",\"Da\u00f1a a los zombis que pisan sus afiladas p\u00faas.\",\"\u00a1Enciende los guisantes que lo atraviesan y duplica su da\u00f1o!\",\"Un muro enorme que ni los zombis saltadores pueden superar.\",\"\u00a1Dispara p\u00faas afiladas que incluso revientan globos!\",\"\u00a1Una fruta alegre que dispara estrellas en cinco direcciones!\"],\n                n1: \"Una ma\u00f1ana dorada y tranquila en Vecin\u00f3polis. El alegre Girasol tararea con la brisa, sin saber de las sombras que acechan...\",\n                b1a: \"\u00a1Qu\u00e9 d\u00eda tan soleado! \u00a1Ni un zombi a la vista! \ud83c\udf3b\", b1b: \"\u00a1Todo tranquilo por aqu\u00ed! Hora de disfrutar del sol.\",\n                n2: \"\u00a1HASTA QUE LA TIERRA TEMBL\u00d3! Pasos arrastrados resonaron por la calle mientras los muertos hambrientos sal\u00edan a la luz con un solo antojo... <highlight>\u00a1CEREBROS!</highlight>\",\n                b2a: \"CEEEREEEBROOOS... \u00a1Queremos cerebros jugosos! \ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"\u00a1Defensa de cono lista! \u00a1Marchen al porche!\", b2c: \"\u26a0\ufe0f \u00a1C\u00d3DIGO ROJO! \u00a1NO MUERTOS EN LA ACERA!\",\n                n3: \"\u00a1Una invasi\u00f3n colosal avanza hacia tu puerta! \u00a1El Gargant\u00faa con su poste y los zombis futbolistas amenazan con arrasar el jard\u00edn!\",\n                b3a: \"\u00a1APLASTAR! \u00a1APLASTAR LA CASA! \ud83d\udca5\",\n                n4: \"\u00a1La resistencia verde despierta! Dirige a tus guardianes bot\u00e1nicos, recoge energ\u00eda solar, coloca barreras y acaba con la horda para salvar tu vecindario.\",\n                b4a: \"\u00a1Sol arriba, ra\u00edces abajo! \u00a1Protegeremos este jard\u00edn!\", b4b: \"\u00a1No romper\u00e1n mi c\u00e1scara! \u00a1Firmes!\", b4c: \"\u00a1Cargado y listo! \u00a1Preparen, apunten, FUEGO! \ud83c\udfaf\"\n            },\n            ar: {\n                loading: \"\u062c\u0627\u0631\u064d \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0645\u0648\u0627\u0631\u062f...\", title: \"\u0627\u0644\u0646\u0628\u0627\u062a\u0627\u062a \u0636\u062f \u0627\u0644\u0632\u0648\u0645\u0628\u064a 2\", play: \"\u0627\u0644\u0639\u0628\", story_btn: \"\u0645\u0642\u062f\u0645\u0629 \u0627\u0644\u0642\u0635\u0629\", settings: \"\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a\", language: \"\u0627\u0644\u0644\u063a\u0629\",\n                skip: \"\u062a\u062e\u0637\u064e\u0651\", next: \"\u0627\u0644\u062a\u0627\u0644\u064a\", defend: \"\u062f\u0627\u0641\u0639 \u0639\u0646 \u0627\u0644\u062d\u062f\u064a\u0642\u0629!\", act: \"\u0627\u0644\u0645\u0642\u062f\u0645\u0629 \u2022 \u0627\u0644\u0641\u0635\u0644 {n}\", story_loading: \"\u062c\u0627\u0631\u064d \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0642\u0635\u0629...\",\n                select_level: \"\u0627\u062e\u062a\u0631 \u0627\u0644\u0645\u0631\u062d\u0644\u0629\", back: \"\u0631\u062c\u0648\u0639\", choose_plants: \"\u0627\u062e\u062a\u0631 \u0646\u0628\u0627\u062a\u0627\u062a\u0643\", selected: \"\u0627\u0644\u0645\u062e\u062a\u0627\u0631: {n}/5\", start_game: \"\u0627\u0628\u062f\u0623 \u0627\u0644\u0644\u0639\u0628\",\n                collection: \"\u0645\u062c\u0645\u0648\u0639\u0629 \u0627\u0644\u0646\u0628\u0627\u062a\u0627\u062a\", discover: \"\u0627\u0643\u062a\u0634\u0641 \u0646\u0628\u0627\u062a\u0627\u062a\u0643 \u0627\u0644\u0645\u062f\u0627\u0641\u0639\u0629!\", close: \"\u0625\u063a\u0644\u0627\u0642\",\n                paused: \"\u0645\u062a\u0648\u0642\u0641 \u0645\u0624\u0642\u062a\u064b\u0627\", resume: \"\u0627\u0633\u062a\u0626\u0646\u0627\u0641\", restart: \"\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0628\u062f\u0621\", level_select: \"\u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0645\u0631\u062d\u0644\u0629\", main_menu: \"\u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n                victory: \"\u0641\u0648\u0632!\", next_level: \"\u0627\u0644\u0645\u0631\u062d\u0644\u0629 \u0627\u0644\u062a\u0627\u0644\u064a\u0629\", replay: \"\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0644\u0639\u0628\", defeat: \"\u0647\u0632\u064a\u0645\u0629!\", retry: \"\u062d\u0627\u0648\u0644 \u0645\u062c\u062f\u062f\u064b\u0627\",\n                new_plant: \"\u0646\u0628\u062a\u0629 \u062c\u062f\u064a\u062f\u0629!\", awesome: \"\u0631\u0627\u0626\u0639!\", new_plant_desc: \"\u0646\u0628\u062a\u0629 \u0642\u0648\u064a\u0629 \u062c\u062f\u064a\u062f\u0629 \u062a\u0646\u0636\u0645 \u0625\u0644\u0649 \u062f\u0641\u0627\u0639\u0643!\",\n                tut1: \"\u0645\u0631\u062d\u0628\u064b\u0627 \u0628\u0643 \u0641\u064a \u0627\u0644\u0646\u0628\u0627\u062a\u0627\u062a \u0636\u062f \u0627\u0644\u0632\u0648\u0645\u0628\u064a 2!\", tut2: \"\u0627\u062c\u0645\u0639 \u0636\u0648\u0621 \u0627\u0644\u0634\u0645\u0633 \u0644\u062a\u0642\u0648\u064a\u0629 \u062f\u0641\u0627\u0639\u0627\u062a\u0643.\", tut3: \"\u0627\u0633\u062a\u062e\u062f\u0645 \u0632\u0631 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0644\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0645\u0631\u062d\u0644\u0629 \u0645\u0624\u0642\u062a\u064b\u0627 \u0623\u0648 \u0625\u0639\u0627\u062f\u062a\u0647\u0627.\", tut4: \"\u0627\u0636\u063a\u0637 \u0639\u0644\u0649 \u0628\u0637\u0627\u0642\u0629 \u0646\u0628\u062a\u0629 \u0644\u0627\u062e\u062a\u064a\u0627\u0631\u0647\u0627\u060c \u062b\u0645 \u0627\u0636\u063a\u0637 \u0639\u0644\u0649 \u062e\u0627\u0646\u0629 \u0644\u0632\u0631\u0627\u0639\u062a\u0647\u0627.\", got_it: \"\u0641\u0647\u0645\u062a!\",\n                prep: \"\u0627\u0644\u062a\u062d\u0636\u064a\u0631: {s} \u062b\", next_phase: \"\u0627\u0644\u0645\u0648\u062c\u0629 \u0627\u0644\u062a\u0627\u0644\u064a\u0629 \u0628\u0639\u062f: {s} \u062b\", phase_start: \"\u0628\u062f\u0621 \u0627\u0644\u0645\u0648\u062c\u0629 {n}\", phase: \"\u0627\u0644\u0645\u0648\u062c\u0629: {n}/{t}\",\n                level_n: \"\u0627\u0644\u0645\u0631\u062d\u0644\u0629 {n}\", unlocks_at: \"\u062a\u064f\u0641\u062a\u062d \u0641\u064a \u0627\u0644\u0645\u0631\u062d\u0644\u0629 {n}\", lv1: \"\u0623\u0633\u0627\u0633\u064a\u0627\u062a \u0627\u0644\u062d\u062f\u064a\u0642\u0629\", lv2: \"\u062e\u0637 \u0627\u0644\u062f\u0641\u0627\u0639\", lv3: \"\u062f\u0641\u0627\u0639 \u0645\u062a\u0641\u062c\u0631\", edit_mode: \"\u0648\u0636\u0639 \u0627\u0644\u062a\u062d\u0631\u064a\u0631\",\n                p: [\"\u0639\u0628\u0627\u062f \u0627\u0644\u0634\u0645\u0633\",\"\u0642\u0627\u0630\u0641 \u0627\u0644\u0628\u0627\u0632\u0644\u0627\u0621\",\"\u0627\u0644\u062c\u0648\u0632\u0629 \u0627\u0644\u062c\u062f\u0627\u0631\u064a\u0629\",\"\u0627\u0644\u0628\u0627\u0632\u0644\u0627\u0621 \u0627\u0644\u062b\u0644\u062c\u064a\u0629\",\"\u0642\u0646\u0628\u0644\u0629 \u0627\u0644\u0643\u0631\u0632\",\"\u0627\u0644\u0642\u0627\u0630\u0641 \u0627\u0644\u0645\u0632\u062f\u0648\u062c\",\"\u0644\u063a\u0645 \u0627\u0644\u0628\u0637\u0627\u0637\u0633\",\"\u0627\u0644\u0642\u0631\u0639 \u0627\u0644\u0633\u0627\u062d\u0642\",\"\u0627\u0644\u0647\u0627\u0644\u0628\u064a\u0646\u0648\",\"\u0627\u0644\u0639\u0634\u0628 \u0627\u0644\u0634\u0627\u0626\u0643\",\"\u062c\u0630\u0639 \u0627\u0644\u0634\u0639\u0644\u0629\",\"\u0627\u0644\u062c\u0648\u0632\u0629 \u0627\u0644\u0637\u0648\u064a\u0644\u0629\",\"\u0627\u0644\u0635\u0628\u0627\u0631\",\"\u0641\u0627\u0643\u0647\u0629 \u0627\u0644\u0646\u062c\u0645\u0629\"],\n                d: [\"\u062a\u0646\u062a\u062c \u0634\u0645\u0633\u064b\u0627 \u0625\u0636\u0627\u0641\u064a\u0629 \u0644\u062a\u0648\u0633\u064a\u0639 \u062a\u0631\u0633\u0627\u0646\u062a\u0643 \u0628\u0633\u0631\u0639\u0629!\",\"\u064a\u0637\u0644\u0642 \u0627\u0644\u0628\u0627\u0632\u0644\u0627\u0621 \u0639\u0644\u0649 \u0627\u0644\u0623\u0639\u062f\u0627\u0621 \u0627\u0644\u0642\u0627\u062f\u0645\u064a\u0646 \u0644\u062d\u0645\u0627\u064a\u0629 \u062d\u062f\u064a\u0642\u062a\u0643.\",\"\u0642\u0634\u0631\u062a\u0647\u0627 \u0627\u0644\u0635\u0644\u0628\u0629 \u062a\u062d\u0645\u064a \u0646\u0628\u0627\u062a\u0627\u062a\u0643 \u0627\u0644\u0623\u062e\u0631\u0649 \u0645\u0646 \u0627\u0644\u0623\u0643\u0644.\",\"\u062a\u0637\u0644\u0642 \u0628\u0627\u0632\u0644\u0627\u0621 \u0645\u062c\u0645\u062f\u0629 \u062a\u0628\u0637\u0626 \u062d\u0631\u0643\u0629 \u0627\u0644\u0623\u0639\u062f\u0627\u0621 \u0648\u0647\u062c\u0645\u0627\u062a\u0647\u0645.\",\"\u062a\u0646\u0641\u062c\u0631 \u0641\u064a \u0645\u0633\u0627\u062d\u0629 \u0648\u0627\u0633\u0639\u0629 \u0648\u062a\u062f\u0645\u0631 \u0643\u0644 \u0627\u0644\u0632\u0648\u0645\u0628\u064a \u0641\u064a \u0646\u0637\u0627\u0642\u0647\u0627!\",\"\u0636\u0639\u0641 \u0627\u0644\u0642\u0648\u0629! \u064a\u0637\u0644\u0642 \u062d\u0628\u062a\u064a \u0628\u0627\u0632\u0644\u0627\u0621 \u0641\u064a \u0643\u0644 \u0645\u0631\u0629.\",\"\u064a\u0646\u0641\u062c\u0631 \u0639\u0646\u062f \u0627\u0644\u0644\u0645\u0633! \u064a\u062d\u062a\u0627\u062c \u0628\u0639\u0636 \u0627\u0644\u0648\u0642\u062a \u0644\u064a\u062c\u0647\u0632 \u062a\u062d\u062a \u0627\u0644\u0623\u0631\u0636.\",\"\u064a\u0633\u062d\u0642 \u0623\u0648\u0644 \u0632\u0648\u0645\u0628\u064a \u064a\u0642\u062a\u0631\u0628 \u0645\u0646\u0647 \u0643\u062b\u064a\u0631\u064b\u0627.\",\"\u0641\u0644\u0641\u0644 \u0646\u0627\u0631\u064a \u064a\u062f\u0645\u0631 \u0643\u0644 \u0627\u0644\u0632\u0648\u0645\u0628\u064a \u0641\u064a \u0645\u0633\u0627\u0631\u0647 \u0628\u0627\u0644\u0643\u0627\u0645\u0644!\",\"\u064a\u0624\u0630\u064a \u0627\u0644\u0632\u0648\u0645\u0628\u064a \u0627\u0644\u0630\u064a\u0646 \u064a\u0645\u0634\u0648\u0646 \u0641\u0648\u0642 \u0623\u0634\u0648\u0627\u0643\u0647 \u0627\u0644\u062d\u0627\u062f\u0629.\",\"\u064a\u0634\u0639\u0644 \u0627\u0644\u0628\u0627\u0632\u0644\u0627\u0621 \u0627\u0644\u062a\u064a \u062a\u0645\u0631 \u0639\u0628\u0631\u0647 \u0641\u064a\u0636\u0627\u0639\u0641 \u0636\u0631\u0631\u0647\u0627!\",\"\u062c\u062f\u0627\u0631 \u0636\u062e\u0645 \u0644\u0627 \u064a\u0633\u062a\u0637\u064a\u0639 \u062d\u062a\u0649 \u0627\u0644\u0632\u0648\u0645\u0628\u064a \u0627\u0644\u0642\u0627\u0641\u0632\u0648\u0646 \u062a\u062c\u0627\u0648\u0632\u0647.\",\"\u064a\u0637\u0644\u0642 \u0623\u0634\u0648\u0627\u0643\u064b\u0627 \u062d\u0627\u062f\u0629 \u064a\u0645\u0643\u0646\u0647\u0627 \u062d\u062a\u0649 \u062a\u0641\u062c\u064a\u0631 \u0627\u0644\u0628\u0627\u0644\u0648\u0646\u0627\u062a!\",\"\u0641\u0627\u0643\u0647\u0629 \u0645\u0631\u062d\u0629 \u062a\u0637\u0644\u0642 \u0627\u0644\u0646\u062c\u0648\u0645 \u0641\u064a \u062e\u0645\u0633\u0629 \u0627\u062a\u062c\u0627\u0647\u0627\u062a!\"],\n                n1: \"\u0635\u0628\u0627\u062d \u0630\u0647\u0628\u064a \u0647\u0627\u062f\u0626 \u0641\u064a \u062d\u064a\u0651 \u0627\u0644\u062c\u064a\u0631\u0627\u0646. \u0639\u0628\u0627\u062f \u0627\u0644\u0634\u0645\u0633 \u0627\u0644\u0645\u0631\u062d \u064a\u062f\u0646\u062f\u0646 \u0645\u0639 \u0627\u0644\u0646\u0633\u064a\u0645\u060c \u063a\u0627\u0641\u0644\u064b\u0627 \u0639\u0646 \u0627\u0644\u0638\u0644\u0627\u0644 \u0627\u0644\u0645\u062a\u0631\u0628\u0635\u0629...\",\n                b1a: \"\u064a\u0627 \u0644\u0647 \u0645\u0646 \u064a\u0648\u0645 \u0645\u0634\u0645\u0633 \u0631\u0627\u0626\u0639! \u0644\u0627 \u0632\u0648\u0645\u0628\u064a \u0641\u064a \u0627\u0644\u0623\u0641\u0642! \ud83c\udf3b\", b1b: \"\u0627\u0644\u0645\u062d\u064a\u0637 \u0647\u0627\u062f\u0626! \u062d\u0627\u0646 \u0648\u0642\u062a \u0627\u0644\u0627\u0633\u062a\u0645\u062a\u0627\u0639 \u0628\u0634\u0645\u0633 \u0627\u0644\u0635\u0628\u0627\u062d.\",\n                n2: \"\u062d\u062a\u0649 \u0627\u0647\u062a\u0632\u062a \u0627\u0644\u0623\u0631\u0636! \u062a\u0631\u062f\u062f \u0635\u062f\u0649 \u062e\u0637\u0648\u0627\u062a \u0645\u062a\u062b\u0627\u0642\u0644\u0629 \u0641\u064a \u0627\u0644\u0634\u0627\u0631\u0639 \u0628\u064a\u0646\u0645\u0627 \u062e\u0631\u062c \u0627\u0644\u0645\u0648\u062a\u0649 \u0627\u0644\u062c\u0627\u0626\u0639\u0648\u0646 \u0625\u0644\u0649 \u0627\u0644\u0646\u0648\u0631 \u0628\u0631\u063a\u0628\u0629 \u0648\u0627\u062d\u062f\u0629... <highlight>\u0623\u062f\u0645\u063a\u0629!</highlight>\",\n                b2a: \"\u0623\u062f\u0645\u063a\u0629\u0629\u0629... \u0646\u0631\u064a\u062f \u0623\u062f\u0645\u063a\u0629 \u0644\u0630\u064a\u0630\u0629! \ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"\u062f\u0641\u0627\u0639 \u0627\u0644\u0645\u062e\u0631\u0648\u0637 \u062c\u0627\u0647\u0632! \u062a\u0642\u062f\u0645\u0648\u0627 \u0646\u062d\u0648 \u0627\u0644\u0634\u0631\u0641\u0629!\", b2c: \"\u26a0\ufe0f \u0625\u0646\u0630\u0627\u0631 \u0623\u062d\u0645\u0631! \u0627\u0644\u0645\u0648\u062a\u0649 \u0639\u0646\u062f \u0627\u0644\u0631\u0635\u064a\u0641!\",\n                n3: \"\u063a\u0632\u0648 \u0647\u0627\u0626\u0644 \u064a\u0634\u0642 \u0637\u0631\u064a\u0642\u0647 \u0646\u062d\u0648 \u0628\u0627\u0628\u0643! \u0627\u0644\u0639\u0645\u0644\u0627\u0642 \u062d\u0627\u0645\u0644 \u0639\u0645\u0648\u062f \u0627\u0644\u0647\u0627\u062a\u0641 \u0648\u0632\u0648\u0645\u0628\u064a \u0643\u0631\u0629 \u0627\u0644\u0642\u062f\u0645 \u064a\u0647\u062f\u062f\u0648\u0646 \u0628\u0627\u062c\u062a\u064a\u0627\u062d \u0627\u0644\u062d\u062f\u064a\u0642\u0629!\",\n                b3a: \"\u062d\u0637\u0651\u0645! \u062d\u0637\u0651\u0645 \u0627\u0644\u0628\u064a\u062a! \ud83d\udca5\",\n                n4: \"\u0627\u0644\u0645\u0642\u0627\u0648\u0645\u0629 \u0627\u0644\u062e\u0636\u0631\u0627\u0621 \u062a\u0633\u062a\u064a\u0642\u0638! \u0642\u064f\u062f \u062d\u0631\u0627\u0633\u0643 \u0627\u0644\u0646\u0628\u0627\u062a\u064a\u064a\u0646\u060c \u0648\u0627\u062c\u0645\u0639 \u0627\u0644\u0637\u0627\u0642\u0629 \u0627\u0644\u0634\u0645\u0633\u064a\u0629\u060c \u0648\u0627\u0646\u0634\u0631 \u0627\u0644\u062d\u0648\u0627\u062c\u0632\u060c \u0648\u0627\u0647\u0632\u0645 \u0627\u0644\u062d\u0634\u062f \u0644\u0625\u0646\u0642\u0627\u0630 \u062d\u064a\u0651\u0643!\",\n                b4a: \"\u0627\u0644\u0634\u0645\u0633 \u0641\u0648\u0642 \u0648\u0627\u0644\u062c\u0630\u0648\u0631 \u062a\u062d\u062a! \u0633\u0646\u062d\u0645\u064a \u0647\u0630\u0647 \u0627\u0644\u062d\u062f\u064a\u0642\u0629!\", b4b: \"\u0644\u0646 \u064a\u0643\u0633\u0631\u0648\u0627 \u0642\u0634\u0631\u062a\u064a! \u0627\u062b\u0628\u062a\u0648\u0627!\", b4c: \"\u062c\u0627\u0647\u0632 \u062a\u0645\u0627\u0645\u064b\u0627! \u0627\u0633\u062a\u0639\u062f\u060c \u0635\u0648\u0651\u0628\u060c \u0623\u0637\u0644\u0642! \ud83c\udfaf\"\n            },\n            fr: {\n                loading: \"Chargement des ressources...\", title: \"Plantes contre Zombies 2\", play: \"Jouer\", story_btn: \"Prologue\", settings: \"Param\u00e8tres\", language: \"Langue\",\n                skip: \"PASSER\", next: \"SUIVANT\", defend: \"D\u00c9FENDS LA PELOUSE !\", act: \"PROLOGUE \u2022 ACTE {n}\", story_loading: \"Chargement de l'histoire...\",\n                select_level: \"Choisir un niveau\", back: \"Retour\", choose_plants: \"Choisis tes plantes\", selected: \"Choisies : {n}/5\", start_game: \"Commencer\",\n                collection: \"Collection de plantes\", discover: \"D\u00e9couvre tes plantes d\u00e9fenseuses !\", close: \"Fermer\",\n                paused: \"Pause\", resume: \"Reprendre\", restart: \"Recommencer\", level_select: \"Niveaux\", main_menu: \"Menu principal\",\n                victory: \"Victoire !\", next_level: \"Niveau suivant\", replay: \"Rejouer\", defeat: \"D\u00e9faite !\", retry: \"R\u00e9essayer\",\n                new_plant: \"Nouvelle plante !\", awesome: \"G\u00e9nial !\", new_plant_desc: \"Une nouvelle plante puissante rejoint ta d\u00e9fense !\",\n                tut1: \"Bienvenue dans Plantes contre Zombies 2 !\", tut2: \"R\u00e9colte du soleil pour renforcer tes d\u00e9fenses.\", tut3: \"Utilise le bouton menu pour mettre en pause ou recommencer le niveau.\", tut4: \"Touche une carte pour choisir une plante, puis touche une case pour la planter.\", got_it: \"COMPRIS !\",\n                prep: \"Pr\u00e9paration : {s}s\", next_phase: \"Phase suivante dans : {s}s\", phase_start: \"D\u00c9BUT DE LA PHASE {n}\", phase: \"PHASE : {n}/{t}\",\n                level_n: \"Niveau {n}\", unlocks_at: \"D\u00e9bloqu\u00e9 au niveau {n}\", lv1: \"Les bases du jardin\", lv2: \"Ligne de d\u00e9fense\", lv3: \"D\u00e9fense explosive\", edit_mode: \"MODE \u00c9DITION\",\n                p: [\"Tournesol\",\"Pois Tireur\",\"Noix\",\"Pois Glac\u00e9\",\"Cerise Bombe\",\"Double Pois\",\"Patate Mine\",\"Courge\",\"Piment\",\"Herbe \u00e0 Pointes\",\"Souche Ardente\",\"Grande Noix\",\"Cactus\",\"Carambole\"],\n                d: [\"Produit du soleil en plus pour d\u00e9velopper ton arsenal plus vite !\",\"Tire des pois sur les ennemis qui approchent.\",\"Sa coque tr\u00e8s dure prot\u00e8ge tes autres plantes d'\u00eatre d\u00e9vor\u00e9es.\",\"Tire des pois glac\u00e9s qui ralentissent les ennemis.\",\"Explose sur une grande zone et d\u00e9truit tous les zombies \u00e0 port\u00e9e !\",\"Double peine ! Tire deux pois \u00e0 la fois.\",\"Explose au contact ! A besoin d'un peu de temps pour s'armer.\",\"\u00c9crase le premier zombie qui s'approche trop.\",\"Un piment ardent qui d\u00e9truit tous les zombies de sa colonne !\",\"Blesse les zombies qui marchent sur ses pointes ac\u00e9r\u00e9es.\",\"Enflamme les pois qui le traversent et double leurs d\u00e9g\u00e2ts !\",\"Un mur immense que m\u00eame les zombies sauteurs ne peuvent franchir.\",\"Tire des \u00e9pines ac\u00e9r\u00e9es qui peuvent m\u00eame crever les ballons !\",\"Un fruit joyeux qui tire des \u00e9toiles dans cinq directions !\"],\n                n1: \"Un matin dor\u00e9 et paisible \u00e0 Voisinville. Le joyeux Tournesol fredonne dans la brise, ignorant les ombres qui r\u00f4dent...\",\n                b1a: \"Quelle magnifique journ\u00e9e ! Pas un zombie en vue ! \ud83c\udf3b\", b1b: \"Tout est calme ! Profitons du soleil du matin.\",\n                n2: \"JUSQU'\u00c0 CE QUE LE SOL TREMBLE ! Des pas tra\u00eenants r\u00e9sonn\u00e8rent dans la rue et les morts-vivants affam\u00e9s surgirent avec une seule envie... <highlight>DES CERVEAUX !</highlight>\",\n                b2a: \"CERVEAAAUX... On veut des cerveaux juteux ! \ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"D\u00e9fense en c\u00f4ne pr\u00eate ! En marche vers le perron !\", b2c: \"\u26a0\ufe0f ALERTE ROUGE ! MORTS-VIVANTS AU TROTTOIR !\",\n                n3: \"Une invasion colossale fonce vers ta porte ! Le Gargantuar et son poteau et les zombies footballeurs menacent d'envahir la pelouse !\",\n                b3a: \"\u00c9CRASER ! \u00c9CRASER LA MAISON ! \ud83d\udca5\",\n                n4: \"La r\u00e9sistance verte s'\u00e9veille ! Commande tes gardiens botaniques, r\u00e9colte l'\u00e9nergie solaire, pose des barri\u00e8res et repousse la horde pour sauver ton quartier !\",\n                b4a: \"Soleil en haut, racines en bas ! On prot\u00e9gera ce jardin !\", b4b: \"Ils ne briseront PAS ma coque ! Tenez bon !\", b4c: \"Charg\u00e9 et pr\u00eat ! En joue, FEU ! \ud83c\udfaf\"\n            },\n            bn: {\n                loading: \"\u09b0\u09bf\u09b8\u09cb\u09b0\u09cd\u09b8 \u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...\", title: \"\u09aa\u09cd\u09b2\u09cd\u09af\u09be\u09a8\u09cd\u099f\u09b8 \u09ac\u09a8\u09be\u09ae \u099c\u09ae\u09cd\u09ac\u09bf\u09b8 \u09e8\", play: \"\u0996\u09c7\u09b2\u09c1\u09a8\", story_btn: \"\u0997\u09b2\u09cd\u09aa\u09c7\u09b0 \u09b8\u09c2\u099a\u09a8\u09be\", settings: \"\u09b8\u09c7\u099f\u09bf\u0982\u09b8\", language: \"\u09ad\u09be\u09b7\u09be\",\n                skip: \"\u098f\u09a1\u09bc\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u09a8\", next: \"\u09aa\u09b0\u09ac\u09b0\u09cd\u09a4\u09c0\", defend: \"\u09b2\u09a8 \u09b0\u0995\u09cd\u09b7\u09be \u0995\u09b0\u09cb!\", act: \"\u09b8\u09c2\u099a\u09a8\u09be \u2022 \u0985\u0999\u09cd\u0995 {n}\", story_loading: \"\u0997\u09b2\u09cd\u09aa \u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...\",\n                select_level: \"\u09b2\u09c7\u09ad\u09c7\u09b2 \u09ac\u09be\u099b\u09c1\u09a8\", back: \"\u09ab\u09bf\u09b0\u09c7 \u09af\u09be\u09a8\", choose_plants: \"\u0986\u09aa\u09a8\u09be\u09b0 \u0997\u09be\u099b \u09ac\u09be\u099b\u09c1\u09a8\", selected: \"\u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09bf\u09a4: {n}/5\", start_game: \"\u0996\u09c7\u09b2\u09be \u09b6\u09c1\u09b0\u09c1\",\n                collection: \"\u0997\u09be\u099b\u09c7\u09b0 \u09b8\u0982\u0997\u09cd\u09b0\u09b9\", discover: \"\u0986\u09aa\u09a8\u09be\u09b0 \u0997\u09be\u099b \u09b0\u0995\u09cd\u09b7\u0995\u09a6\u09c7\u09b0 \u0986\u09ac\u09bf\u09b7\u09cd\u0995\u09be\u09b0 \u0995\u09b0\u09c1\u09a8!\", close: \"\u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8\",\n                paused: \"\u09ac\u09bf\u09b0\u09a4\u09bf\", resume: \"\u099a\u09be\u09b2\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u09a8\", restart: \"\u0986\u09ac\u09be\u09b0 \u09b6\u09c1\u09b0\u09c1\", level_select: \"\u09b2\u09c7\u09ad\u09c7\u09b2 \u09ac\u09be\u099b\u09be\u0987\", main_menu: \"\u09aa\u09cd\u09b0\u09a7\u09be\u09a8 \u09ae\u09c7\u09a8\u09c1\",\n                victory: \"\u099c\u09af\u09bc!\", next_level: \"\u09aa\u09b0\u09c7\u09b0 \u09b2\u09c7\u09ad\u09c7\u09b2\", replay: \"\u0986\u09ac\u09be\u09b0 \u0996\u09c7\u09b2\u09c1\u09a8\", defeat: \"\u09aa\u09b0\u09be\u099c\u09af\u09bc!\", retry: \"\u0986\u09ac\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be\",\n                new_plant: \"\u09a8\u09a4\u09c1\u09a8 \u0997\u09be\u099b!\", awesome: \"\u09a6\u09be\u09b0\u09c1\u09a3!\", new_plant_desc: \"\u098f\u0995\u099f\u09bf \u09a8\u09a4\u09c1\u09a8 \u09b6\u0995\u09cd\u09a4\u09bf\u09b6\u09be\u09b2\u09c0 \u0997\u09be\u099b \u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09cd\u09b0\u09a4\u09bf\u09b0\u0995\u09cd\u09b7\u09be\u09af\u09bc \u09af\u09cb\u0997 \u09a6\u09bf\u09af\u09bc\u09c7\u099b\u09c7!\",\n                tut1: \"\u09aa\u09cd\u09b2\u09cd\u09af\u09be\u09a8\u09cd\u099f\u09b8 \u09ac\u09a8\u09be\u09ae \u099c\u09ae\u09cd\u09ac\u09bf\u09b8 \u09e8-\u098f \u09b8\u09cd\u09ac\u09be\u0997\u09a4\u09ae!\", tut2: \"\u09aa\u09cd\u09b0\u09a4\u09bf\u09b0\u0995\u09cd\u09b7\u09be \u09ac\u09be\u09a1\u09bc\u09be\u09a4\u09c7 \u09b8\u09c2\u09b0\u09cd\u09af\u09be\u09b2\u09cb\u0995 \u09b8\u0982\u0997\u09cd\u09b0\u09b9 \u0995\u09b0\u09c1\u09a8\u0964\", tut3: \"\u09b2\u09c7\u09ad\u09c7\u09b2 \u09a5\u09be\u09ae\u09be\u09a4\u09c7 \u09ac\u09be \u0986\u09ac\u09be\u09b0 \u09b6\u09c1\u09b0\u09c1 \u0995\u09b0\u09a4\u09c7 \u09ae\u09c7\u09a8\u09c1 \u09ac\u09cb\u09a4\u09be\u09ae \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09c1\u09a8\u0964\", tut4: \"\u0997\u09be\u099b \u09ac\u09be\u099b\u09a4\u09c7 \u0995\u09be\u09b0\u09cd\u09a1\u09c7 \u099f\u09cd\u09af\u09be\u09aa \u0995\u09b0\u09c1\u09a8, \u09a4\u09be\u09b0\u09aa\u09b0 \u09b2\u09be\u0997\u09be\u09a4\u09c7 \u098f\u0995\u099f\u09bf \u0998\u09b0\u09c7 \u099f\u09cd\u09af\u09be\u09aa \u0995\u09b0\u09c1\u09a8\u0964\", got_it: \"\u09ac\u09c1\u099d\u09c7\u099b\u09bf!\",\n                prep: \"\u09aa\u09cd\u09b0\u09b8\u09cd\u09a4\u09c1\u09a4\u09bf: {s} \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1\", next_phase: \"\u09aa\u09b0\u09c7\u09b0 \u09a7\u09be\u09aa: {s} \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1\u09c7\", phase_start: \"\u09a7\u09be\u09aa {n} \u09b6\u09c1\u09b0\u09c1\", phase: \"\u09a7\u09be\u09aa: {n}/{t}\",\n                level_n: \"\u09b2\u09c7\u09ad\u09c7\u09b2 {n}\", unlocks_at: \"\u09b2\u09c7\u09ad\u09c7\u09b2 {n}-\u098f \u0996\u09c1\u09b2\u09ac\u09c7\", lv1: \"\u09ac\u09be\u0997\u09be\u09a8\u09c7\u09b0 \u09aa\u09cd\u09b0\u09be\u09a5\u09ae\u09bf\u0995 \u09aa\u09be\u09a0\", lv2: \"\u09aa\u09cd\u09b0\u09a4\u09bf\u09b0\u0995\u09cd\u09b7\u09be \u09b0\u09c7\u0996\u09be\", lv3: \"\u09ac\u09bf\u09b8\u09cd\u09ab\u09cb\u09b0\u0995 \u09aa\u09cd\u09b0\u09a4\u09bf\u09b0\u0995\u09cd\u09b7\u09be\", edit_mode: \"\u098f\u09a1\u09bf\u099f \u09ae\u09cb\u09a1\",\n                p: [\"\u09b8\u09c2\u09b0\u09cd\u09af\u09ae\u09c1\u0996\u09c0\",\"\u09ae\u099f\u09b0 \u09b6\u09c1\u099f\u09be\u09b0\",\"\u0986\u0996\u09b0\u09cb\u099f \u09a6\u09c7\u09af\u09bc\u09be\u09b2\",\"\u09ac\u09b0\u09ab \u09ae\u099f\u09b0\",\"\u099a\u09c7\u09b0\u09bf \u09ac\u09cb\u09ae\u09be\",\"\u09b0\u09bf\u09aa\u09bf\u099f\u09be\u09b0\",\"\u0986\u09b2\u09c1 \u09ae\u09be\u0987\u09a8\",\"\u09b8\u09cd\u0995\u09cb\u09af\u09bc\u09be\u09b6\",\"\u09b9\u09be\u09b2\u09be\u09aa\u09c7\u09a8\u09cb\",\"\u0995\u09be\u0981\u099f\u09be \u0998\u09be\u09b8\",\"\u09ae\u09b6\u09be\u09b2 \u0995\u09be\u09a0\",\"\u09b2\u09ae\u09cd\u09ac\u09be \u0986\u0996\u09b0\u09cb\u099f\",\"\u0995\u09cd\u09af\u09be\u0995\u099f\u09be\u09b8\",\"\u09b8\u09cd\u099f\u09be\u09b0\u09ab\u09cd\u09b0\u09c1\u099f\"],\n                d: [\"\u0985\u09a4\u09bf\u09b0\u09bf\u0995\u09cd\u09a4 \u09b8\u09c2\u09b0\u09cd\u09af \u09a4\u09c8\u09b0\u09bf \u0995\u09b0\u09c7 \u09af\u09be\u09a4\u09c7 \u09a6\u09cd\u09b0\u09c1\u09a4 \u09b6\u0995\u09cd\u09a4\u09bf \u09ac\u09be\u09a1\u09bc\u09be\u09a8!\",\"\u0986\u09b8\u09a8\u09cd\u09a8 \u09b6\u09a4\u09cd\u09b0\u09c1\u09a6\u09c7\u09b0 \u09a6\u09bf\u0995\u09c7 \u09ae\u099f\u09b0 \u099b\u09c1\u09a1\u09bc\u09c7 \u09b2\u09a8 \u09b0\u0995\u09cd\u09b7\u09be \u0995\u09b0\u09c7\u0964\",\"\u098f\u09b0 \u09b6\u0995\u09cd\u09a4 \u0996\u09cb\u09b8\u09be \u0985\u09a8\u09cd\u09af \u0997\u09be\u099b\u09a6\u09c7\u09b0 \u0996\u09be\u0993\u09af\u09bc\u09be \u09a5\u09c7\u0995\u09c7 \u09ac\u09be\u0981\u099a\u09be\u09af\u09bc\u0964\",\"\u099c\u09ae\u09be\u099f \u09ae\u099f\u09b0 \u099b\u09cb\u09a1\u09bc\u09c7 \u09af\u09be \u09b6\u09a4\u09cd\u09b0\u09c1\u09a6\u09c7\u09b0 \u0997\u09a4\u09bf \u0993 \u0986\u0995\u09cd\u09b0\u09ae\u09a3 \u0995\u09ae\u09be\u09af\u09bc\u0964\",\"\u09ac\u09a1\u09bc \u098f\u09b2\u09be\u0995\u09be \u099c\u09c1\u09a1\u09bc\u09c7 \u09ac\u09bf\u09b8\u09cd\u09ab\u09cb\u09b0\u09bf\u09a4 \u09b9\u09af\u09bc\u09c7 \u09b8\u09ac \u099c\u09ae\u09cd\u09ac\u09bf \u09a7\u09cd\u09ac\u0982\u09b8 \u0995\u09b0\u09c7!\",\"\u09a6\u09cd\u09ac\u09bf\u0997\u09c1\u09a3 \u0986\u0995\u09cd\u09b0\u09ae\u09a3! \u098f\u0995\u09b8\u09be\u09a5\u09c7 \u09a6\u09c1\u099f\u09bf \u09ae\u099f\u09b0 \u099b\u09cb\u09a1\u09bc\u09c7\u0964\",\"\u099b\u09cb\u0981\u09af\u09bc\u09be\u09ae\u09be\u09a4\u09cd\u09b0 \u09ac\u09bf\u09b8\u09cd\u09ab\u09cb\u09b0\u09a3! \u09ae\u09be\u099f\u09bf\u09b0 \u09a8\u09bf\u099a\u09c7 \u09a4\u09c8\u09b0\u09bf \u09b9\u09a4\u09c7 \u098f\u0995\u099f\u09c1 \u09b8\u09ae\u09af\u09bc \u09b2\u09be\u0997\u09c7\u0964\",\"\u0996\u09c1\u09ac \u0995\u09be\u099b\u09c7 \u0986\u09b8\u09be \u09aa\u09cd\u09b0\u09a5\u09ae \u099c\u09ae\u09cd\u09ac\u09bf\u0995\u09c7 \u09aa\u09bf\u09b7\u09c7 \u09a6\u09c7\u09af\u09bc\u0964\",\"\u098f\u0995\u099f\u09bf \u099d\u09be\u09b2 \u09ae\u09b0\u09bf\u099a \u09af\u09be \u09aa\u09c1\u09b0\u09cb \u09b2\u09c7\u09a8\u09c7\u09b0 \u09b8\u09ac \u099c\u09ae\u09cd\u09ac\u09bf \u09aa\u09c1\u09a1\u09bc\u09bf\u09af\u09bc\u09c7 \u09a6\u09c7\u09af\u09bc!\",\"\u098f\u09b0 \u09a7\u09be\u09b0\u09be\u09b2\u09cb \u0995\u09be\u0981\u099f\u09be\u09b0 \u0989\u09aa\u09b0 \u09a6\u09bf\u09af\u09bc\u09c7 \u09b9\u09be\u0981\u099f\u09be \u099c\u09ae\u09cd\u09ac\u09bf\u09a6\u09c7\u09b0 \u0995\u09cd\u09b7\u09a4\u09bf \u0995\u09b0\u09c7\u0964\",\"\u098f\u09b0 \u09ae\u09a7\u09cd\u09af \u09a6\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u0993\u09af\u09bc\u09be \u09ae\u099f\u09b0\u09c7 \u0986\u0997\u09c1\u09a8 \u09a7\u09b0\u09bf\u09af\u09bc\u09c7 \u0995\u09cd\u09b7\u09a4\u09bf \u09a6\u09cd\u09ac\u09bf\u0997\u09c1\u09a3 \u0995\u09b0\u09c7!\",\"\u09ac\u09bf\u09b6\u09be\u09b2 \u098f\u0995 \u09a6\u09c7\u09af\u09bc\u09be\u09b2 \u09af\u09be \u09b2\u09be\u09ab\u09be\u09a8\u09cb \u099c\u09ae\u09cd\u09ac\u09bf\u09b0\u09be\u0993 \u09aa\u09be\u09b0 \u09b9\u09a4\u09c7 \u09aa\u09be\u09b0\u09c7 \u09a8\u09be\u0964\",\"\u09a7\u09be\u09b0\u09be\u09b2\u09cb \u0995\u09be\u0981\u099f\u09be \u099b\u09cb\u09a1\u09bc\u09c7 \u09af\u09be \u09ac\u09c7\u09b2\u09c1\u09a8\u0993 \u09ab\u09be\u099f\u09be\u09a4\u09c7 \u09aa\u09be\u09b0\u09c7!\",\"\u098f\u0995\u099f\u09bf \u09b9\u09be\u09b8\u09bf\u0996\u09c1\u09b6\u09bf \u09ab\u09b2 \u09af\u09be \u09aa\u09be\u0981\u099a \u09a6\u09bf\u0995\u09c7 \u09a4\u09be\u09b0\u09be \u099b\u09cb\u09a1\u09bc\u09c7!\"],\n                n1: \"\u09a8\u09c7\u0987\u09ac\u09be\u09b0\u09ad\u09bf\u09b2\u09c7 \u098f\u0995 \u09b6\u09be\u09a8\u09cd\u09a4 \u09b8\u09cb\u09a8\u09be\u09b2\u09bf \u09b8\u0995\u09be\u09b2\u0964 \u09b9\u09be\u09b8\u09bf\u0996\u09c1\u09b6\u09bf \u09b8\u09c2\u09b0\u09cd\u09af\u09ae\u09c1\u0996\u09c0 \u09ac\u09be\u09a4\u09be\u09b8\u09c7 \u0997\u09c1\u09a8\u0997\u09c1\u09a8 \u0995\u09b0\u099b\u09c7, \u09b2\u09c1\u0995\u09bf\u09af\u09bc\u09c7 \u09a5\u09be\u0995\u09be \u099b\u09be\u09af\u09bc\u09be\u09b0 \u0995\u09a5\u09be \u099c\u09be\u09a8\u09c7 \u09a8\u09be...\",\n                b1a: \"\u0995\u09c0 \u099a\u09ae\u09ce\u0995\u09be\u09b0 \u09b0\u09cb\u09a6\u09c7\u09b2\u09be \u09a6\u09bf\u09a8! \u098f\u0995\u099f\u09be\u0993 \u099c\u09ae\u09cd\u09ac\u09bf \u09a8\u09c7\u0987! \ud83c\udf3b\", b1b: \"\u099a\u09be\u09b0\u09aa\u09be\u09b6 \u09b6\u09be\u09a8\u09cd\u09a4! \u09b8\u0995\u09be\u09b2\u09c7\u09b0 \u09b0\u09cb\u09a6 \u0989\u09aa\u09ad\u09cb\u0997\u09c7\u09b0 \u09b8\u09ae\u09af\u09bc\u0964\",\n                n2: \"\u09b9\u09a0\u09be\u09ce \u09ae\u09be\u099f\u09bf \u0995\u09c7\u0981\u09aa\u09c7 \u0989\u09a0\u09b2! \u09b0\u09be\u09b8\u09cd\u09a4\u09be\u09af\u09bc \u099f\u09c7\u09a8\u09c7 \u099f\u09c7\u09a8\u09c7 \u099a\u09b2\u09be\u09b0 \u09b6\u09ac\u09cd\u09a6 \u09aa\u09cd\u09b0\u09a4\u09bf\u09a7\u09cd\u09ac\u09a8\u09bf\u09a4 \u09b9\u09b2, \u0986\u09b0 \u0995\u09cd\u09b7\u09c1\u09a7\u09be\u09b0\u09cd\u09a4 \u09ae\u09c3\u09a4\u09b0\u09be \u098f\u0995\u099f\u09be\u0987 \u099a\u09be\u0993\u09af\u09bc\u09be \u09a8\u09bf\u09af\u09bc\u09c7 \u0986\u09b2\u09cb\u09af\u09bc \u098f\u09b2... <highlight>\u09ae\u0997\u099c!</highlight>\",\n                b2a: \"\u09ae\u0997\u099c\u099c\u099c... \u0986\u09ae\u09b0\u09be \u09b0\u09b8\u09be\u09b2\u09cb \u09ae\u0997\u099c \u099a\u09be\u0987! \ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"\u099f\u09cd\u09b0\u09be\u09ab\u09bf\u0995 \u0995\u09cb\u09a8 \u09aa\u09cd\u09b0\u09b8\u09cd\u09a4\u09c1\u09a4! \u09ac\u09be\u09b0\u09be\u09a8\u09cd\u09a6\u09be\u09b0 \u09a6\u09bf\u0995\u09c7 \u098f\u0997\u09cb\u0993!\", b2c: \"\u26a0\ufe0f \u09b0\u09c7\u09a1 \u0985\u09cd\u09af\u09be\u09b2\u09be\u09b0\u09cd\u099f! \u09ae\u09c3\u09a4\u09b0\u09be \u09b0\u09be\u09b8\u09cd\u09a4\u09be\u09b0 \u09a7\u09be\u09b0\u09c7!\",\n                n3: \"\u098f\u0995 \u09ac\u09bf\u09b6\u09be\u09b2 \u0986\u0995\u09cd\u09b0\u09ae\u09a3 \u0986\u09aa\u09a8\u09be\u09b0 \u09a6\u09b0\u099c\u09be\u09b0 \u09a6\u09bf\u0995\u09c7 \u098f\u0997\u09bf\u09af\u09bc\u09c7 \u0986\u09b8\u099b\u09c7! \u0996\u09c1\u0981\u099f\u09bf \u0998\u09cb\u09b0\u09be\u09a8\u09cb \u0997\u09be\u09b0\u09cd\u0997\u09be\u09a8\u099f\u09c1\u09af\u09bc\u09be\u09b0 \u0986\u09b0 \u09ab\u09c1\u099f\u09ac\u09b2 \u099c\u09ae\u09cd\u09ac\u09bf\u09b0\u09be \u09b2\u09a8 \u09a6\u0996\u09b2\u09c7\u09b0 \u09b9\u09c1\u09ae\u0995\u09bf \u09a6\u09bf\u099a\u09cd\u099b\u09c7!\",\n                b3a: \"\u09ad\u09be\u0999\u09cb! \u09ac\u09be\u09a1\u09bc\u09bf \u09ad\u09c7\u0999\u09c7 \u09a6\u09be\u0993! \ud83d\udca5\",\n                n4: \"\u09b8\u09ac\u09c1\u099c \u09aa\u09cd\u09b0\u09a4\u09bf\u09b0\u09cb\u09a7 \u099c\u09c7\u0997\u09c7 \u0989\u09a0\u09c7\u099b\u09c7! \u0986\u09aa\u09a8\u09be\u09b0 \u0997\u09be\u099b \u09b0\u0995\u09cd\u09b7\u0995\u09a6\u09c7\u09b0 \u09a8\u09c7\u09a4\u09c3\u09a4\u09cd\u09ac \u09a6\u09bf\u09a8, \u09b8\u09cc\u09b0\u09b6\u0995\u09cd\u09a4\u09bf \u09b8\u0982\u0997\u09cd\u09b0\u09b9 \u0995\u09b0\u09c1\u09a8, \u09ae\u099c\u09ac\u09c1\u09a4 \u09ac\u09be\u09a7\u09be \u09ac\u09b8\u09be\u09a8 \u0986\u09b0 \u09a6\u09b2\u0995\u09c7 \u09b9\u099f\u09bf\u09af\u09bc\u09c7 \u09aa\u09be\u09a1\u09bc\u09be \u09ac\u09be\u0981\u099a\u09be\u09a8!\",\n                b4a: \"\u09b8\u09c2\u09b0\u09cd\u09af \u0989\u09aa\u09b0\u09c7, \u09b6\u09bf\u0995\u09a1\u09bc \u09a8\u09bf\u099a\u09c7! \u0986\u09ae\u09b0\u09be \u098f\u0987 \u09ac\u09be\u0997\u09be\u09a8 \u09b0\u0995\u09cd\u09b7\u09be \u0995\u09b0\u09ac!\", b4b: \"\u0993\u09b0\u09be \u0986\u09ae\u09be\u09b0 \u0996\u09cb\u09b8\u09be \u09ad\u09be\u0999\u09a4\u09c7 \u09aa\u09be\u09b0\u09ac\u09c7 \u09a8\u09be! \u0985\u099f\u09b2 \u09a5\u09be\u0995\u09cb!\", b4c: \"\u09aa\u09cd\u09b0\u09b8\u09cd\u09a4\u09c1\u09a4! \u09a4\u09be\u0995 \u0995\u09b0\u09cb, \u09ab\u09be\u09af\u09bc\u09be\u09b0! \ud83c\udfaf\"\n            },\n            pt: {\n                loading: \"Carregando recursos...\", title: \"Plantas vs Zumbis 2\", play: \"Jogar\", story_btn: \"Pr\u00f3logo\", settings: \"Configura\u00e7\u00f5es\", language: \"Idioma\",\n                skip: \"PULAR\", next: \"PR\u00d3XIMO\", defend: \"DEFENDA O GRAMADO!\", act: \"PR\u00d3LOGO \u2022 ATO {n}\", story_loading: \"Carregando hist\u00f3ria...\",\n                select_level: \"Escolher fase\", back: \"Voltar\", choose_plants: \"Escolha suas plantas\", selected: \"Escolhidas: {n}/5\", start_game: \"Come\u00e7ar\",\n                collection: \"Cole\u00e7\u00e3o de plantas\", discover: \"Descubra suas plantas defensoras!\", close: \"Fechar\",\n                paused: \"Pausado\", resume: \"Continuar\", restart: \"Reiniciar\", level_select: \"Fases\", main_menu: \"Menu principal\",\n                victory: \"Vit\u00f3ria!\", next_level: \"Pr\u00f3xima fase\", replay: \"Jogar de novo\", defeat: \"Derrota!\", retry: \"Tentar de novo\",\n                new_plant: \"Nova planta!\", awesome: \"Incr\u00edvel!\", new_plant_desc: \"Uma nova planta poderosa se junta \u00e0 sua defesa!\",\n                tut1: \"Bem-vindo a Plantas vs Zumbis 2!\", tut2: \"Colete luz do sol para fortalecer suas defesas.\", tut3: \"Use o bot\u00e3o de menu para pausar ou reiniciar a fase.\", tut4: \"Toque em uma carta para escolher a planta e depois em uma casa para plant\u00e1-la.\", got_it: \"ENTENDI!\",\n                prep: \"Prepara\u00e7\u00e3o: {s}s\", next_phase: \"Pr\u00f3xima fase em: {s}s\", phase_start: \"FASE {n} COME\u00c7ANDO\", phase: \"FASE: {n}/{t}\",\n                level_n: \"Fase {n}\", unlocks_at: \"Desbloqueia na fase {n}\", lv1: \"B\u00e1sico do jardim\", lv2: \"Linha defensiva\", lv3: \"Defesa explosiva\", edit_mode: \"MODO EDI\u00c7\u00c3O\",\n                p: [\"Girassol\",\"Ervilha Atiradora\",\"Noz\",\"Ervilha Gelada\",\"Cereja Bomba\",\"Repetidora\",\"Mina Batata\",\"Ab\u00f3bora\",\"Pimenta Jalape\u00f1o\",\"Erva Espinhenta\",\"Tronco Flamejante\",\"Noz Alta\",\"Cacto\",\"Carambola\"],\n                d: [\"Gera sol extra para voc\u00ea aumentar seu arsenal mais r\u00e1pido!\",\"Atira ervilhas nos inimigos que se aproximam.\",\"Sua casca dura protege suas outras plantas de serem devoradas.\",\"Atira ervilhas congeladas que deixam os inimigos mais lentos.\",\"Explode em uma grande \u00e1rea, destruindo todos os zumbis por perto!\",\"Dose dupla! Atira duas ervilhas de uma vez.\",\"Explode ao contato! Precisa de um tempinho para se armar.\",\"Esmaga o primeiro zumbi que chegar perto demais.\",\"Uma pimenta ardente que destr\u00f3i todos os zumbis da fileira!\",\"Fere os zumbis que pisam em seus espinhos afiados.\",\"Incendeia as ervilhas que passam por ele, dobrando o dano!\",\"Um muro enorme que nem zumbis saltadores conseguem pular.\",\"Atira espinhos afiados que estouram at\u00e9 bal\u00f5es!\",\"Uma fruta alegre que atira estrelas em cinco dire\u00e7\u00f5es!\"],\n                n1: \"Uma manh\u00e3 dourada e tranquila em Vizinh\u00f3polis. O alegre Girassol cantarola com a brisa, sem saber das sombras \u00e0 espreita...\",\n                b1a: \"Que dia lindo de sol! Nenhum zumbi \u00e0 vista! \ud83c\udf3b\", b1b: \"Tudo calmo por aqui! Hora de aproveitar o sol.\",\n                n2: \"AT\u00c9 QUE O CH\u00c3O TREMEU! Passos arrastados ecoaram pela rua enquanto os mortos-vivos famintos surgiam com um s\u00f3 desejo... <highlight>C\u00c9REBROS!</highlight>\",\n                b2a: \"C\u00c9\u00c9\u00c9REBROOOS... Queremos c\u00e9rebros suculentos! \ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"Defesa de cone pronta! Marchem para a varanda!\", b2c: \"\u26a0\ufe0f C\u00d3DIGO VERMELHO! MORTOS-VIVOS NA CAL\u00c7ADA!\",\n                n3: \"Uma invas\u00e3o colossal avan\u00e7a at\u00e9 sua porta! O Gigante com seu poste e os zumbis jogadores de futebol amea\u00e7am tomar o gramado!\",\n                b3a: \"ESMAGAR! ESMAGAR A CASA! \ud83d\udca5\",\n                n4: \"A resist\u00eancia verde desperta! Comande seus guardi\u00f5es bot\u00e2nicos, colete energia solar, posicione barreiras e acabe com a horda para salvar seu bairro!\",\n                b4a: \"Sol no alto, ra\u00edzes no ch\u00e3o! Vamos proteger este jardim!\", b4b: \"Eles N\u00c3O v\u00e3o quebrar minha casca! Firmes!\", b4c: \"Carregado e pronto! Preparar, apontar, FOGO! \ud83c\udfaf\"\n            },\n            ru: {\n                loading: \"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432...\", title: \"\u0420\u0430\u0441\u0442\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0442\u0438\u0432 \u0417\u043e\u043c\u0431\u0438 2\", play: \"\u0418\u0433\u0440\u0430\u0442\u044c\", story_btn: \"\u041f\u0440\u043e\u043b\u043e\u0433\", settings: \"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\", language: \"\u042f\u0437\u044b\u043a\",\n                skip: \"\u041f\u0420\u041e\u041f\u0423\u0421\u0422\u0418\u0422\u042c\", next: \"\u0414\u0410\u041b\u0415\u0415\", defend: \"\u0417\u0410\u0429\u0418\u0422\u0418 \u0413\u0410\u0417\u041e\u041d!\", act: \"\u041f\u0420\u041e\u041b\u041e\u0413 \u2022 \u0410\u041a\u0422 {n}\", story_loading: \"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0438...\",\n                select_level: \"\u0412\u044b\u0431\u043e\u0440 \u0443\u0440\u043e\u0432\u043d\u044f\", back: \"\u041d\u0430\u0437\u0430\u0434\", choose_plants: \"\u0412\u044b\u0431\u0435\u0440\u0438 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u044f\", selected: \"\u0412\u044b\u0431\u0440\u0430\u043d\u043e: {n}/5\", start_game: \"\u041d\u0430\u0447\u0430\u0442\u044c\",\n                collection: \"\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u0439\", discover: \"\u041e\u0442\u043a\u0440\u043e\u0439 \u0441\u0432\u043e\u0438\u0445 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u0439-\u0437\u0430\u0449\u0438\u0442\u043d\u0438\u043a\u043e\u0432!\", close: \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\",\n                paused: \"\u041f\u0430\u0443\u0437\u0430\", resume: \"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c\", restart: \"\u0417\u0430\u043d\u043e\u0432\u043e\", level_select: \"\u0423\u0440\u043e\u0432\u043d\u0438\", main_menu: \"\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e\",\n                victory: \"\u041f\u043e\u0431\u0435\u0434\u0430!\", next_level: \"\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c\", replay: \"\u041f\u0435\u0440\u0435\u0438\u0433\u0440\u0430\u0442\u044c\", defeat: \"\u041f\u043e\u0440\u0430\u0436\u0435\u043d\u0438\u0435!\", retry: \"\u0415\u0449\u0451 \u0440\u0430\u0437\",\n                new_plant: \"\u041d\u043e\u0432\u043e\u0435 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u0435!\", awesome: \"\u041e\u0442\u043b\u0438\u0447\u043d\u043e!\", new_plant_desc: \"\u041d\u043e\u0432\u043e\u0435 \u043c\u043e\u0449\u043d\u043e\u0435 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442\u0441\u044f \u043a \u043e\u0431\u043e\u0440\u043e\u043d\u0435!\",\n                tut1: \"\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u0420\u0430\u0441\u0442\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0442\u0438\u0432 \u0417\u043e\u043c\u0431\u0438 2!\", tut2: \"\u0421\u043e\u0431\u0438\u0440\u0430\u0439 \u0441\u043e\u043b\u043d\u0446\u0435, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0438\u043b\u0438\u0432\u0430\u0442\u044c \u043e\u0431\u043e\u0440\u043e\u043d\u0443.\", tut3: \"\u041a\u043d\u043e\u043f\u043a\u0430 \u043c\u0435\u043d\u044e \u0441\u0442\u0430\u0432\u0438\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0430 \u043f\u0430\u0443\u0437\u0443 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0435\u0433\u043e.\", tut4: \"\u041d\u0430\u0436\u043c\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0430\u0434\u0438\u0442\u044c \u0435\u0433\u043e.\", got_it: \"\u041f\u041e\u041d\u042f\u0422\u041d\u041e!\",\n                prep: \"\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430: {s} \u0441\", next_phase: \"\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0444\u0430\u0437\u0430 \u0447\u0435\u0440\u0435\u0437: {s} \u0441\", phase_start: \"\u0424\u0410\u0417\u0410 {n} \u041d\u0410\u0427\u0418\u041d\u0410\u0415\u0422\u0421\u042f\", phase: \"\u0424\u0410\u0417\u0410: {n}/{t}\",\n                level_n: \"\u0423\u0440\u043e\u0432\u0435\u043d\u044c {n}\", unlocks_at: \"\u041e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 {n}\", lv1: \"\u041e\u0441\u043d\u043e\u0432\u044b \u0441\u0430\u0434\u0430\", lv2: \"\u041b\u0438\u043d\u0438\u044f \u043e\u0431\u043e\u0440\u043e\u043d\u044b\", lv3: \"\u0412\u0437\u0440\u044b\u0432\u043d\u0430\u044f \u043e\u0431\u043e\u0440\u043e\u043d\u0430\", edit_mode: \"\u0420\u0415\u0416\u0418\u041c \u0420\u0415\u0414\u0410\u041a\u0422\u041e\u0420\u0410\",\n                p: [\"\u041f\u043e\u0434\u0441\u043e\u043b\u043d\u0443\u0445\",\"\u0413\u043e\u0440\u043e\u0445\u043e\u0441\u0442\u0440\u0435\u043b\",\"\u0421\u0442\u0435\u043d\u043e\u0440\u0435\u0445\",\"\u0421\u043d\u0435\u0436\u043d\u044b\u0439 \u0433\u043e\u0440\u043e\u0445\",\"\u0412\u0438\u0448\u043d\u0451\u0432\u0430\u044f \u0431\u043e\u043c\u0431\u0430\",\"\u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0433\u043e\u0440\u043e\u0445\u043e\u0441\u0442\u0440\u0435\u043b\",\"\u041a\u0430\u0440\u0442\u043e\u0444\u0435\u043b\u044c\u043d\u0430\u044f \u043c\u0438\u043d\u0430\",\"\u041a\u0430\u0431\u0430\u0447\u043e\u043a\",\"\u0425\u0430\u043b\u0430\u043f\u0435\u043d\u044c\u043e\",\"\u041a\u043e\u043b\u044e\u0447\u043a\u0430\",\"\u041f\u0435\u043d\u044c-\u0444\u0430\u043a\u0435\u043b\",\"\u0412\u044b\u0441\u043e\u043a\u0438\u0439 \u043e\u0440\u0435\u0445\",\"\u041a\u0430\u043a\u0442\u0443\u0441\",\"\u0417\u0432\u0451\u0437\u0434\u043e\u0447\u043a\u0430\"],\n                d: [\"\u0414\u0430\u0451\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u043b\u043d\u0446\u0435, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0430\u0440\u0441\u0435\u043d\u0430\u043b!\",\"\u0421\u0442\u0440\u0435\u043b\u044f\u0435\u0442 \u0433\u043e\u0440\u043e\u0448\u0438\u043d\u0430\u043c\u0438 \u043f\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u044e\u0449\u0438\u043c\u0441\u044f \u0432\u0440\u0430\u0433\u0430\u043c.\",\"\u0422\u0432\u0451\u0440\u0434\u0430\u044f \u0441\u043a\u043e\u0440\u043b\u0443\u043f\u0430 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u044f \u043e\u0442 \u043f\u043e\u0435\u0434\u0430\u043d\u0438\u044f.\",\"\u0421\u0442\u0440\u0435\u043b\u044f\u0435\u0442 \u043b\u0435\u0434\u044f\u043d\u044b\u043c \u0433\u043e\u0440\u043e\u0445\u043e\u043c, \u0437\u0430\u043c\u0435\u0434\u043b\u044f\u044f \u0432\u0440\u0430\u0433\u043e\u0432 \u0438 \u0438\u0445 \u0430\u0442\u0430\u043a\u0438.\",\"\u0412\u0437\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u0438, \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u044f \u0432\u0441\u0435\u0445 \u0437\u043e\u043c\u0431\u0438 \u0432\u043e\u043a\u0440\u0443\u0433!\",\"\u0414\u0432\u043e\u0439\u043d\u0430\u044f \u043c\u043e\u0449\u044c! \u0421\u0442\u0440\u0435\u043b\u044f\u0435\u0442 \u0434\u0432\u0443\u043c\u044f \u0433\u043e\u0440\u043e\u0448\u0438\u043d\u0430\u043c\u0438 \u0441\u0440\u0430\u0437\u0443.\",\"\u0412\u0437\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043a\u0430\u0441\u0430\u043d\u0438\u0438! \u041d\u0443\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0442\u043e\u0431\u044b \u0432\u0437\u0432\u0435\u0441\u0442\u0438\u0441\u044c.\",\"\u0420\u0430\u0441\u043f\u043b\u044e\u0449\u0438\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438, \u043f\u043e\u0434\u043e\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043b\u0438\u0437\u043a\u043e.\",\"\u041e\u0433\u043d\u0435\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0446, \u0441\u0436\u0438\u0433\u0430\u044e\u0449\u0438\u0439 \u0432\u0441\u0435\u0445 \u0437\u043e\u043c\u0431\u0438 \u043d\u0430 \u043b\u0438\u043d\u0438\u0438!\",\"\u0420\u0430\u043d\u0438\u0442 \u0437\u043e\u043c\u0431\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0434\u0443\u0442 \u043f\u043e \u0435\u0433\u043e \u043e\u0441\u0442\u0440\u044b\u043c \u0448\u0438\u043f\u0430\u043c.\",\"\u041f\u043e\u0434\u0436\u0438\u0433\u0430\u0435\u0442 \u043f\u0440\u043e\u043b\u0435\u0442\u0430\u044e\u0449\u0438\u0439 \u0433\u043e\u0440\u043e\u0445, \u0443\u0434\u0432\u0430\u0438\u0432\u0430\u044f \u0443\u0440\u043e\u043d!\",\"\u041e\u0433\u0440\u043e\u043c\u043d\u0430\u044f \u0441\u0442\u0435\u043d\u0430, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0440\u044b\u0433\u043d\u0443\u0442\u044c \u0434\u0430\u0436\u0435 \u043f\u0440\u044b\u0433\u0443\u043d\u0430\u043c.\",\"\u0421\u0442\u0440\u0435\u043b\u044f\u0435\u0442 \u043e\u0441\u0442\u0440\u044b\u043c\u0438 \u0438\u0433\u043b\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u043e\u043f\u0430\u044e\u0442 \u0434\u0430\u0436\u0435 \u0448\u0430\u0440\u0438\u043a\u0438!\",\"\u0412\u0435\u0441\u0451\u043b\u044b\u0439 \u043f\u043b\u043e\u0434, \u0441\u0442\u0440\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u0437\u0432\u0451\u0437\u0434\u0430\u043c\u0438 \u0432 \u043f\u044f\u0442\u044c \u0441\u0442\u043e\u0440\u043e\u043d!\"],\n                n1: \"\u0422\u0438\u0445\u043e\u0435 \u0437\u043e\u043b\u043e\u0442\u043e\u0435 \u0443\u0442\u0440\u043e \u0432 \u0421\u043e\u0441\u0435\u0434\u0432\u0438\u043b\u043b\u0435. \u0412\u0435\u0441\u0451\u043b\u044b\u0439 \u041f\u043e\u0434\u0441\u043e\u043b\u043d\u0443\u0445 \u043d\u0430\u043f\u0435\u0432\u0430\u0435\u0442 \u043d\u0430 \u0432\u0435\u0442\u0435\u0440\u043a\u0435, \u043d\u0435 \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u044f \u043e \u043f\u0440\u0438\u0442\u0430\u0438\u0432\u0448\u0438\u0445\u0441\u044f \u0442\u0435\u043d\u044f\u0445...\",\n                b1a: \"\u041a\u0430\u043a\u043e\u0439 \u0447\u0443\u0434\u0435\u0441\u043d\u044b\u0439 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u044b\u0439 \u0434\u0435\u043d\u044c! \u041d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438! \ud83c\udf3b\", b1b: \"\u0412\u043e\u043a\u0440\u0443\u0433 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e! \u0412\u0440\u0435\u043c\u044f \u043f\u043e\u043d\u0435\u0436\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u043e\u043b\u043d\u0446\u0435.\",\n                n2: \"\u041f\u041e\u041a\u0410 \u0417\u0415\u041c\u041b\u042f \u041d\u0415 \u0417\u0410\u0414\u0420\u041e\u0416\u0410\u041b\u0410! \u0428\u0430\u0440\u043a\u0430\u044e\u0449\u0438\u0435 \u0448\u0430\u0433\u0438 \u0440\u0430\u0437\u043d\u0435\u0441\u043b\u0438\u0441\u044c \u043f\u043e \u0443\u043b\u0438\u0446\u0435, \u0438 \u0433\u043e\u043b\u043e\u0434\u043d\u044b\u0435 \u043c\u0435\u0440\u0442\u0432\u0435\u0446\u044b \u0432\u044b\u0448\u043b\u0438 \u043d\u0430 \u0441\u0432\u0435\u0442 \u0441 \u043e\u0434\u043d\u0438\u043c \u0436\u0435\u043b\u0430\u043d\u0438\u0435\u043c... <highlight>\u041c\u041e\u0417\u0413\u0418!</highlight>\",\n                b2a: \"\u041c\u041e\u041e\u041e\u0417\u0413\u0418\u0418\u0418... \u0425\u043e\u0442\u0438\u043c \u0441\u043e\u0447\u043d\u044b\u0445 \u043c\u043e\u0437\u0433\u043e\u0432! \ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"\u041a\u043e\u043d\u0443\u0441\u043d\u0430\u044f \u0437\u0430\u0449\u0438\u0442\u0430 \u0433\u043e\u0442\u043e\u0432\u0430! \u041c\u0430\u0440\u0448 \u043a \u043a\u0440\u044b\u043b\u044c\u0446\u0443!\", b2c: \"\u26a0\ufe0f \u041a\u0420\u0410\u0421\u041d\u042b\u0419 \u041a\u041e\u0414! \u041c\u0415\u0420\u0422\u0412\u0415\u0426\u042b \u0423 \u041e\u0411\u041e\u0427\u0418\u041d\u042b!\",\n                n3: \"\u041a\u043e\u043b\u043e\u0441\u0441\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0442\u043e\u0440\u0436\u0435\u043d\u0438\u0435 \u0440\u0432\u0451\u0442\u0441\u044f \u043a \u0442\u0432\u043e\u0435\u043c\u0443 \u043f\u043e\u0440\u043e\u0433\u0443! \u0413\u0430\u0440\u0433\u0430\u043d\u0442\u044e\u0430 \u0441\u043e \u0441\u0442\u043e\u043b\u0431\u043e\u043c \u0438 \u0437\u043e\u043c\u0431\u0438-\u0444\u0443\u0442\u0431\u043e\u043b\u0438\u0441\u0442\u044b \u0433\u0440\u043e\u0437\u044f\u0442 \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0433\u0430\u0437\u043e\u043d!\",\n                b3a: \"\u041a\u0420\u0423\u0428\u0418! \u041a\u0420\u0423\u0428\u0418 \u0414\u041e\u041c! \ud83d\udca5\",\n                n4: \"\u0417\u0435\u043b\u0451\u043d\u043e\u0435 \u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f! \u041a\u043e\u043c\u0430\u043d\u0434\u0443\u0439 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u044f\u043c\u0438-\u0441\u0442\u0440\u0430\u0436\u0430\u043c\u0438, \u0441\u043e\u0431\u0438\u0440\u0430\u0439 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u0443\u044e \u044d\u043d\u0435\u0440\u0433\u0438\u044e, \u0441\u0442\u0430\u0432\u044c \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u0438 \u0440\u0430\u0437\u0433\u0440\u043e\u043c\u0438 \u043e\u0440\u0434\u0443, \u0447\u0442\u043e\u0431\u044b \u0441\u043f\u0430\u0441\u0442\u0438 \u0440\u0430\u0439\u043e\u043d!\",\n                b4a: \"\u0421\u043e\u043b\u043d\u0446\u0435 \u0432\u0432\u0435\u0440\u0445\u0443, \u043a\u043e\u0440\u043d\u0438 \u0432\u043d\u0438\u0437\u0443! \u041c\u044b \u0437\u0430\u0449\u0438\u0442\u0438\u043c \u044d\u0442\u043e\u0442 \u0441\u0430\u0434!\", b4b: \"\u0418\u043c \u041d\u0415 \u0440\u0430\u0441\u043a\u043e\u043b\u043e\u0442\u044c \u043c\u043e\u044e \u0441\u043a\u043e\u0440\u043b\u0443\u043f\u0443! \u0421\u0442\u043e\u044f\u0442\u044c \u043d\u0430\u0441\u043c\u0435\u0440\u0442\u044c!\", b4c: \"\u0417\u0430\u0440\u044f\u0436\u0435\u043d\u043e! \u0413\u043e\u0442\u043e\u0432\u044c\u0441\u044f, \u0446\u0435\u043b\u044c\u0441\u044f, \u041e\u0413\u041e\u041d\u042c! \ud83c\udfaf\"\n            },\n            id: {\n                loading: \"Memuat aset...\", title: \"Tanaman vs Zombi 2\", play: \"Main\", story_btn: \"Prolog Cerita\", settings: \"Pengaturan\", language: \"Bahasa\",\n                skip: \"LEWATI\", next: \"LANJUT\", defend: \"LINDUNGI HALAMAN!\", act: \"PROLOG \u2022 BABAK {n}\", story_loading: \"Memuat cerita...\",\n                select_level: \"Pilih Level\", back: \"Kembali\", choose_plants: \"Pilih Tanamanmu\", selected: \"Dipilih: {n}/5\", start_game: \"Mulai Main\",\n                collection: \"Koleksi Tanaman\", discover: \"Temukan tanaman pembelamu!\", close: \"Tutup\",\n                paused: \"Dijeda\", resume: \"Lanjutkan\", restart: \"Ulangi\", level_select: \"Pilih Level\", main_menu: \"Menu Utama\",\n                victory: \"Menang!\", next_level: \"Level Berikutnya\", replay: \"Main Lagi\", defeat: \"Kalah!\", retry: \"Coba Lagi\",\n                new_plant: \"Tanaman Baru!\", awesome: \"Keren!\", new_plant_desc: \"Tanaman baru yang kuat bergabung dengan pertahananmu!\",\n                tut1: \"Selamat datang di Tanaman vs Zombi 2!\", tut2: \"Kumpulkan sinar matahari untuk memperkuat pertahanan.\", tut3: \"Gunakan tombol menu untuk menjeda atau mengulang level.\", tut4: \"Ketuk kartu untuk memilih tanaman, lalu ketuk kotak untuk menanamnya.\", got_it: \"MENGERTI!\",\n                prep: \"Persiapan: {s} dtk\", next_phase: \"Fase berikutnya: {s} dtk\", phase_start: \"FASE {n} DIMULAI\", phase: \"FASE: {n}/{t}\",\n                level_n: \"Level {n}\", unlocks_at: \"Terbuka di Level {n}\", lv1: \"Dasar Berkebun\", lv2: \"Garis Pertahanan\", lv3: \"Pertahanan Ledakan\", edit_mode: \"MODE EDIT\",\n                p: [\"Bunga Matahari\",\"Penembak Kacang\",\"Kacang Dinding\",\"Kacang Salju\",\"Bom Ceri\",\"Penembak Ganda\",\"Ranjau Kentang\",\"Labu\",\"Jalapeno\",\"Rumput Duri\",\"Kayu Obor\",\"Kacang Tinggi\",\"Kaktus\",\"Belimbing\"],\n                d: [\"Menghasilkan matahari ekstra agar persenjataanmu cepat bertambah!\",\"Menembakkan kacang ke musuh yang mendekat.\",\"Cangkangnya yang keras melindungi tanaman lain agar tidak dimakan.\",\"Menembakkan kacang beku yang memperlambat musuh.\",\"Meledak di area luas dan menghancurkan semua zombi di sekitarnya!\",\"Dua kali lipat! Menembakkan dua kacang sekaligus.\",\"Meledak saat disentuh! Butuh waktu untuk siap di bawah tanah.\",\"Menghancurkan zombi pertama yang terlalu dekat.\",\"Cabai pedas yang menghancurkan semua zombi di jalurnya!\",\"Melukai zombi yang berjalan di atas durinya yang tajam.\",\"Membakar kacang yang melewatinya, menggandakan kerusakan!\",\"Tembok raksasa yang bahkan tak bisa dilompati zombi pelompat.\",\"Menembakkan duri tajam yang bahkan bisa memecahkan balon!\",\"Buah ceria yang menembakkan bintang ke lima arah!\"],\n                n1: \"Pagi keemasan yang damai di Neighborville. Bunga Matahari yang ceria bersenandung diterpa angin, tak sadar akan bayangan yang mengintai...\",\n                b1a: \"Hari yang sangat cerah! Tak ada zombi sama sekali! \ud83c\udf3b\", b1b: \"Sekitar aman! Saatnya berjemur di bawah matahari pagi.\",\n                n2: \"SAMPAI TANAH BERGETAR! Langkah terseret bergema di jalan saat mayat hidup yang lapar muncul dengan satu keinginan... <highlight>OTAK!</highlight>\",\n                b2a: \"OTAAAK... Kami mau otak yang lezat! \ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"Pertahanan kerucut siap! Maju ke teras!\", b2c: \"\u26a0\ufe0f KODE MERAH! MAYAT HIDUP DI PINGGIR JALAN!\",\n                n3: \"Invasi raksasa menerjang ke pintumu! Gargantuar pengayun tiang dan zombi football mengancam menyerbu halaman!\",\n                b3a: \"HANCURKAN! HANCURKAN RUMAHNYA! \ud83d\udca5\",\n                n4: \"Perlawanan hijau bangkit! Pimpin para penjaga tanamanmu, kumpulkan energi matahari, pasang penghalang, dan kalahkan gerombolan untuk menyelamatkan lingkunganmu!\",\n                b4a: \"Matahari di atas, akar di bawah! Kami akan melindungi kebun ini!\", b4b: \"Mereka TIDAK akan memecahkan cangkangku! Bertahan!\", b4c: \"Siap tembak! Bidik, TEMBAK! \ud83c\udfaf\"\n            },\n            ur: {\n                loading: \"\u0627\u062b\u0627\u062b\u06d2 \u0644\u0648\u0688 \u06c1\u0648 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba...\", title: \"\u067e\u0648\u062f\u06d2 \u0628\u0645\u0642\u0627\u0628\u0644\u06c1 \u0632\u0648\u0645\u0628\u06cc\u0632 2\", play: \"\u06a9\u06be\u06cc\u0644\u06cc\u06ba\", story_btn: \"\u06a9\u06c1\u0627\u0646\u06cc \u06a9\u0627 \u0622\u063a\u0627\u0632\", settings: \"\u062a\u0631\u062a\u06cc\u0628\u0627\u062a\", language: \"\u0632\u0628\u0627\u0646\",\n                skip: \"\u0686\u06be\u0648\u0691\u06cc\u06ba\", next: \"\u0627\u06af\u0644\u0627\", defend: \"\u0644\u0627\u0646 \u06a9\u0627 \u062f\u0641\u0627\u0639 \u06a9\u0631\u0648!\", act: \"\u0622\u063a\u0627\u0632 \u2022 \u0628\u0627\u0628 {n}\", story_loading: \"\u06a9\u06c1\u0627\u0646\u06cc \u0644\u0648\u0688 \u06c1\u0648 \u0631\u06c1\u06cc \u06c1\u06d2...\",\n                select_level: \"\u0644\u06cc\u0648\u0644 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u06cc\u06ba\", back: \"\u0648\u0627\u067e\u0633\", choose_plants: \"\u0627\u067e\u0646\u06d2 \u067e\u0648\u062f\u06d2 \u0686\u0646\u06cc\u06ba\", selected: \"\u0645\u0646\u062a\u062e\u0628: {n}/5\", start_game: \"\u06a9\u06be\u06cc\u0644 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\",\n                collection: \"\u067e\u0648\u062f\u0648\u06ba \u06a9\u0627 \u0645\u062c\u0645\u0648\u0639\u06c1\", discover: \"\u0627\u067e\u0646\u06d2 \u067e\u0648\u062f\u06d2 \u0645\u062d\u0627\u0641\u0638\u0648\u06ba \u06a9\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u06cc\u06ba!\", close: \"\u0628\u0646\u062f \u06a9\u0631\u06cc\u06ba\",\n                paused: \"\u0631\u06a9\u0627 \u06c1\u0648\u0627\", resume: \"\u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u06cc\u06ba\", restart: \"\u062f\u0648\u0628\u0627\u0631\u06c1 \u0634\u0631\u0648\u0639\", level_select: \"\u0644\u06cc\u0648\u0644 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u06cc\u06ba\", main_menu: \"\u0645\u06cc\u0646 \u0645\u06cc\u0646\u0648\",\n                victory: \"\u0641\u062a\u062d!\", next_level: \"\u0627\u06af\u0644\u0627 \u0644\u06cc\u0648\u0644\", replay: \"\u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u06be\u06cc\u0644\u06cc\u06ba\", defeat: \"\u0634\u06a9\u0633\u062a!\", retry: \"\u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634\",\n                new_plant: \"\u0646\u06cc\u0627 \u067e\u0648\u062f\u0627!\", awesome: \"\u0632\u0628\u0631\u062f\u0633\u062a!\", new_plant_desc: \"\u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0637\u0627\u0642\u062a\u0648\u0631 \u067e\u0648\u062f\u0627 \u0622\u067e \u06a9\u06d2 \u062f\u0641\u0627\u0639 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u0648 \u06af\u06cc\u0627!\",\n                tut1: \"\u067e\u0648\u062f\u06d2 \u0628\u0645\u0642\u0627\u0628\u0644\u06c1 \u0632\u0648\u0645\u0628\u06cc\u0632 2 \u0645\u06cc\u06ba \u062e\u0648\u0634 \u0622\u0645\u062f\u06cc\u062f!\", tut2: \"\u0627\u067e\u0646\u0627 \u062f\u0641\u0627\u0639 \u0645\u0636\u0628\u0648\u0637 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u06be\u0648\u067e \u062c\u0645\u0639 \u06a9\u0631\u06cc\u06ba\u06d4\", tut3: \"\u0644\u06cc\u0648\u0644 \u0631\u0648\u06a9\u0646\u06d2 \u06cc\u0627 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u06cc\u0646\u0648 \u0628\u0679\u0646 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4\", tut4: \"\u067e\u0648\u062f\u0627 \u0686\u0646\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0631\u0688 \u067e\u0631 \u0679\u06cc\u067e \u06a9\u0631\u06cc\u06ba\u060c \u067e\u06be\u0631 \u0644\u06af\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062e\u0627\u0646\u06d2 \u067e\u0631 \u0679\u06cc\u067e \u06a9\u0631\u06cc\u06ba\u06d4\", got_it: \"\u0633\u0645\u062c\u06be \u06af\u06cc\u0627!\",\n                prep: \"\u062a\u06cc\u0627\u0631\u06cc: {s} \u0633\u06cc\u06a9\u0646\u0688\", next_phase: \"\u0627\u06af\u0644\u0627 \u0645\u0631\u062d\u0644\u06c1: {s} \u0633\u06cc\u06a9\u0646\u0688 \u0645\u06cc\u06ba\", phase_start: \"\u0645\u0631\u062d\u0644\u06c1 {n} \u0634\u0631\u0648\u0639\", phase: \"\u0645\u0631\u062d\u0644\u06c1: {n}/{t}\",\n                level_n: \"\u0644\u06cc\u0648\u0644 {n}\", unlocks_at: \"\u0644\u06cc\u0648\u0644 {n} \u067e\u0631 \u06a9\u06be\u0644\u06d2 \u06af\u0627\", lv1: \"\u0628\u0627\u063a \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f\u06cc\u06ba\", lv2: \"\u062f\u0641\u0627\u0639\u06cc \u0644\u0627\u0626\u0646\", lv3: \"\u062f\u06be\u0645\u0627\u06a9\u06c1 \u062e\u06cc\u0632 \u062f\u0641\u0627\u0639\", edit_mode: \"\u0627\u06cc\u0688\u0679 \u0645\u0648\u0688\",\n                p: [\"\u0633\u0648\u0631\u062c \u0645\u06a9\u06be\u06cc\",\"\u0645\u0679\u0631 \u0634\u0648\u0679\u0631\",\"\u0627\u062e\u0631\u0648\u0679 \u062f\u06cc\u0648\u0627\u0631\",\"\u0628\u0631\u0641\u0627\u0646\u06cc \u0645\u0679\u0631\",\"\u0686\u06cc\u0631\u06cc \u0628\u0645\",\"\u0631\u06cc\u067e\u06cc\u0679\u0631\",\"\u0622\u0644\u0648 \u0628\u0627\u0631\u0648\u062f\u06cc \u0633\u0631\u0646\u06af\",\"\u0627\u0633\u06a9\u0648\u0627\u0634\",\"\u06c1\u0627\u0644\u0627\u067e\u06cc\u0646\u0648\",\"\u06a9\u0627\u0646\u0679\u06d2 \u062f\u0627\u0631 \u06af\u06be\u0627\u0633\",\"\u0645\u0634\u0639\u0644 \u0644\u06a9\u0691\u06cc\",\"\u0644\u0645\u0628\u0627 \u0627\u062e\u0631\u0648\u0679\",\"\u06a9\u06cc\u06a9\u0679\u0633\",\"\u0627\u0633\u0679\u0627\u0631 \u0641\u0631\u0648\u0679\"],\n                d: [\"\u0627\u0636\u0627\u0641\u06cc \u062f\u06be\u0648\u067e \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u062a\u0627\u06a9\u06c1 \u0622\u067e \u062a\u06cc\u0632\u06cc \u0633\u06d2 \u0627\u067e\u0646\u06cc \u0641\u0648\u062c \u0628\u0691\u06be\u0627 \u0633\u06a9\u06cc\u06ba!\",\"\u0622\u062a\u06d2 \u062f\u0634\u0645\u0646\u0648\u06ba \u067e\u0631 \u0645\u0679\u0631 \u0628\u0631\u0633\u0627 \u06a9\u0631 \u0622\u067e \u06a9\u06d2 \u0644\u0627\u0646 \u06a9\u0627 \u062f\u0641\u0627\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4\",\"\u0627\u0633 \u06a9\u0627 \u0633\u062e\u062a \u062e\u0648\u0644 \u062f\u0648\u0633\u0631\u06d2 \u067e\u0648\u062f\u0648\u06ba \u06a9\u0648 \u06a9\u06be\u0627\u0626\u06d2 \u062c\u0627\u0646\u06d2 \u0633\u06d2 \u0628\u0686\u0627\u062a\u0627 \u06c1\u06d2\u06d4\",\"\u062c\u0645\u06d2 \u06c1\u0648\u0626\u06d2 \u0645\u0679\u0631 \u067e\u06be\u06cc\u0646\u06a9\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u062f\u0634\u0645\u0646\u0648\u06ba \u06a9\u0648 \u0633\u0633\u062a \u06a9\u0631 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4\",\"\u0628\u0691\u06d2 \u0639\u0644\u0627\u0642\u06d2 \u0645\u06cc\u06ba \u067e\u06be\u0679 \u06a9\u0631 \u062a\u0645\u0627\u0645 \u0632\u0648\u0645\u0628\u06cc\u0632 \u06a9\u0648 \u062a\u0628\u0627\u06c1 \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2!\",\"\u062f\u06af\u0646\u06cc \u0645\u0627\u0631! \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u062f\u0648 \u0645\u0679\u0631 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u06d4\",\"\u0686\u06be\u0648\u062a\u06d2 \u06c1\u06cc \u067e\u06be\u0679\u062a\u0627 \u06c1\u06d2! \u0632\u0645\u06cc\u0646 \u0645\u06cc\u06ba \u062a\u06cc\u0627\u0631 \u06c1\u0648\u0646\u06d2 \u0645\u06cc\u06ba \u062a\u06be\u0648\u0691\u0627 \u0648\u0642\u062a \u0644\u06af\u062a\u0627 \u06c1\u06d2\u06d4\",\"\u0628\u06c1\u062a \u0642\u0631\u06cc\u0628 \u0622\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u067e\u06c1\u0644\u06d2 \u0632\u0648\u0645\u0628\u06cc \u06a9\u0648 \u06a9\u0686\u0644 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4\",\"\u0627\u06cc\u06a9 \u062a\u06cc\u0632 \u0645\u0631\u0686 \u062c\u0648 \u067e\u0648\u0631\u06cc \u0642\u0637\u0627\u0631 \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0632\u0648\u0645\u0628\u06cc\u0632 \u06a9\u0648 \u062c\u0644\u0627 \u062f\u06cc\u062a\u06cc \u06c1\u06d2!\",\"\u0627\u067e\u0646\u06d2 \u0646\u0648\u06a9\u06cc\u0644\u06d2 \u06a9\u0627\u0646\u0679\u0648\u06ba \u067e\u0631 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0632\u0648\u0645\u0628\u06cc\u0632 \u06a9\u0648 \u0646\u0642\u0635\u0627\u0646 \u067e\u06c1\u0646\u0686\u0627\u062a\u0627 \u06c1\u06d2\u06d4\",\"\u06af\u0632\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0645\u0679\u0631\u0648\u06ba \u06a9\u0648 \u0622\u06af \u0644\u06af\u0627 \u06a9\u0631 \u0646\u0642\u0635\u0627\u0646 \u062f\u06af\u0646\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2!\",\"\u0627\u06cc\u06a9 \u0628\u0691\u06cc \u062f\u06cc\u0648\u0627\u0631 \u062c\u0633\u06d2 \u0686\u06be\u0644\u0627\u0646\u06af \u0644\u06af\u0627\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0632\u0648\u0645\u0628\u06cc \u0628\u06be\u06cc \u067e\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2\u06d4\",\"\u0646\u0648\u06a9\u06cc\u0644\u06d2 \u06a9\u0627\u0646\u0679\u06d2 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u063a\u0628\u0627\u0631\u06d2 \u0628\u06be\u06cc \u067e\u06be\u0627\u0691 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba!\",\"\u0627\u06cc\u06a9 \u062e\u0648\u0634 \u0645\u0632\u0627\u062c \u067e\u06be\u0644 \u062c\u0648 \u067e\u0627\u0646\u0686 \u0633\u0645\u062a\u0648\u06ba \u0645\u06cc\u06ba \u0633\u062a\u0627\u0631\u06d2 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2!\"],\n                n1: \"\u0646\u06cc\u0628\u0631\u0648\u06cc\u0644 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u067e\u0631\u0633\u06a9\u0648\u0646 \u0633\u0646\u06c1\u0631\u06cc \u0635\u0628\u062d\u06d4 \u062e\u0648\u0634 \u0645\u0632\u0627\u062c \u0633\u0648\u0631\u062c \u0645\u06a9\u06be\u06cc \u06c1\u0648\u0627 \u0645\u06cc\u06ba \u06af\u0646\u06af\u0646\u0627 \u0631\u06c1\u0627 \u06c1\u06d2\u060c \u0686\u06be\u067e\u06d2 \u0633\u0627\u06cc\u0648\u06ba \u0633\u06d2 \u0628\u06d2 \u062e\u0628\u0631...\",\n                b1a: \"\u06a9\u06cc\u0627 \u0634\u0627\u0646\u062f\u0627\u0631 \u062f\u06be\u0648\u067e \u0648\u0627\u0644\u0627 \u062f\u0646 \u06c1\u06d2! \u06a9\u0648\u0626\u06cc \u0632\u0648\u0645\u0628\u06cc \u0646\u0638\u0631 \u0646\u06c1\u06cc\u06ba \u0622 \u0631\u06c1\u0627! \ud83c\udf3b\", b1b: \"\u0686\u0627\u0631\u0648\u06ba \u0637\u0631\u0641 \u0633\u06a9\u0648\u0646 \u06c1\u06d2! \u0635\u0628\u062d \u06a9\u06cc \u062f\u06be\u0648\u067e \u06a9\u0627 \u0645\u0632\u06c1 \u0644\u06cc\u0646\u06d2 \u06a9\u0627 \u0648\u0642\u062a\u06d4\",\n                n2: \"\u06cc\u06c1\u0627\u06ba \u062a\u06a9 \u06a9\u06c1 \u0632\u0645\u06cc\u0646 \u0644\u0631\u0632 \u0627\u0679\u06be\u06cc! \u06af\u0644\u06cc \u0645\u06cc\u06ba \u06af\u06be\u0633\u0679\u062a\u06d2 \u0642\u062f\u0645\u0648\u06ba \u06a9\u06cc \u0622\u0648\u0627\u0632 \u06af\u0648\u0646\u062c\u06cc \u0627\u0648\u0631 \u0628\u06be\u0648\u06a9\u06d2 \u0645\u0631\u062f\u06d2 \u0627\u06cc\u06a9 \u06c1\u06cc \u062e\u0648\u0627\u06c1\u0634 \u0644\u06cc\u06d2 \u0631\u0648\u0634\u0646\u06cc \u0645\u06cc\u06ba \u0622\u0626\u06d2... <highlight>\u062f\u0645\u0627\u063a!</highlight>\",\n                b2a: \"\u062f\u0645\u0627\u0627\u0627\u063a... \u06c1\u0645\u06cc\u06ba \u0645\u0632\u06cc\u062f\u0627\u0631 \u062f\u0645\u0627\u063a \u0686\u0627\u06c1\u06cc\u06d2! \ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"\u0679\u0631\u06cc\u0641\u06a9 \u06a9\u0648\u0646 \u062a\u06cc\u0627\u0631! \u0628\u0631\u0622\u0645\u062f\u06d2 \u06a9\u06cc \u0637\u0631\u0641 \u0628\u0691\u06be\u0648!\", b2c: \"\u26a0\ufe0f \u0631\u06cc\u0688 \u0627\u0644\u0631\u0679! \u0645\u0631\u062f\u06d2 \u0633\u0691\u06a9 \u067e\u0631 \u06c1\u06cc\u06ba!\",\n                n3: \"\u0627\u06cc\u06a9 \u0632\u0628\u0631\u062f\u0633\u062a \u062d\u0645\u0644\u06c1 \u0622\u067e \u06a9\u06d2 \u062f\u0631\u0648\u0627\u0632\u06d2 \u06a9\u06cc \u0637\u0631\u0641 \u0628\u0691\u06be \u0631\u06c1\u0627 \u06c1\u06d2! \u06a9\u06be\u0645\u0628\u0627 \u06af\u06be\u0645\u0627\u0646\u06d2 \u0648\u0627\u0644\u0627 \u06af\u0627\u0631\u06af\u06cc\u0646\u0679\u0648\u0627\u0631 \u0627\u0648\u0631 \u0641\u0679\u0628\u0627\u0644 \u0632\u0648\u0645\u0628\u06cc\u0632 \u0644\u0627\u0646 \u06a9\u0648 \u0631\u0648\u0646\u062f\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06c1\u06cc\u06ba!\",\n                b3a: \"\u062a\u0648\u0691\u0648! \u06af\u06be\u0631 \u062a\u0648\u0691 \u062f\u0648! \ud83d\udca5\",\n                n4: \"\u0633\u0628\u0632 \u0645\u0632\u0627\u062d\u0645\u062a \u062c\u0627\u06af \u0627\u0679\u06be\u06cc \u06c1\u06d2! \u0627\u067e\u0646\u06d2 \u067e\u0648\u062f\u06d2 \u0645\u062d\u0627\u0641\u0638\u0648\u06ba \u06a9\u06cc \u0642\u06cc\u0627\u062f\u062a \u06a9\u0631\u06cc\u06ba\u060c \u0634\u0645\u0633\u06cc \u062a\u0648\u0627\u0646\u0627\u0626\u06cc \u062c\u0645\u0639 \u06a9\u0631\u06cc\u06ba\u060c \u0645\u0636\u0628\u0648\u0637 \u0631\u06a9\u0627\u0648\u0679\u06cc\u06ba \u0644\u06af\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u06c1\u062c\u0648\u0645 \u06a9\u0648 \u0634\u06a9\u0633\u062a \u062f\u06d2 \u06a9\u0631 \u0627\u067e\u0646\u0627 \u0645\u062d\u0644\u06c1 \u0628\u0686\u0627\u0626\u06cc\u06ba!\",\n                b4a: \"\u0633\u0648\u0631\u062c \u0627\u0648\u067e\u0631\u060c \u062c\u0691\u06cc\u06ba \u0646\u06cc\u0686\u06d2! \u06c1\u0645 \u0627\u0633 \u0628\u0627\u063a \u06a9\u06cc \u062d\u0641\u0627\u0638\u062a \u06a9\u0631\u06cc\u06ba \u06af\u06d2!\", b4b: \"\u0648\u06c1 \u0645\u06cc\u0631\u0627 \u062e\u0648\u0644 \u0646\u06c1\u06cc\u06ba \u062a\u0648\u0691 \u0633\u06a9\u06cc\u06ba \u06af\u06d2! \u0688\u0679\u06d2 \u0631\u06c1\u0648!\", b4c: \"\u062a\u06cc\u0627\u0631! \u0646\u0634\u0627\u0646\u06c1 \u0644\u0648\u060c \u0641\u0627\u0626\u0631! \ud83c\udfaf\"\n            },\n            de: {\n                loading: \"Lade Inhalte...\", title: \"Pflanzen gegen Zombies 2\", play: \"Spielen\", story_btn: \"Prolog\", settings: \"Einstellungen\", language: \"Sprache\",\n                skip: \"\u00dcBERSPRINGEN\", next: \"WEITER\", defend: \"VERTEIDIGE DEN RASEN!\", act: \"PROLOG \u2022 AKT {n}\", story_loading: \"Lade Geschichte...\",\n                select_level: \"Level w\u00e4hlen\", back: \"Zur\u00fcck\", choose_plants: \"W\u00e4hle deine Pflanzen\", selected: \"Gew\u00e4hlt: {n}/5\", start_game: \"Spiel starten\",\n                collection: \"Pflanzensammlung\", discover: \"Entdecke deine Pflanzenverteidiger!\", close: \"Schlie\u00dfen\",\n                paused: \"Pausiert\", resume: \"Fortsetzen\", restart: \"Neustart\", level_select: \"Levelauswahl\", main_menu: \"Hauptmen\u00fc\",\n                victory: \"Sieg!\", next_level: \"N\u00e4chstes Level\", replay: \"Nochmal\", defeat: \"Niederlage!\", retry: \"Erneut versuchen\",\n                new_plant: \"Neue Pflanze!\", awesome: \"Super!\", new_plant_desc: \"Eine neue starke Pflanze verst\u00e4rkt deine Verteidigung!\",\n                tut1: \"Willkommen bei Pflanzen gegen Zombies 2!\", tut2: \"Sammle Sonnenlicht, um deine Verteidigung auszubauen.\", tut3: \"Mit der Men\u00fctaste kannst du das Level pausieren oder neu starten.\", tut4: \"Tippe auf eine Karte, um eine Pflanze zu w\u00e4hlen, dann auf ein Feld, um sie zu setzen.\", got_it: \"VERSTANDEN!\",\n                prep: \"Vorbereitung: {s}s\", next_phase: \"N\u00e4chste Phase in: {s}s\", phase_start: \"PHASE {n} BEGINNT\", phase: \"PHASE: {n}/{t}\",\n                level_n: \"Level {n}\", unlocks_at: \"Freigeschaltet ab Level {n}\", lv1: \"Gartengrundlagen\", lv2: \"Verteidigungslinie\", lv3: \"Explosive Verteidigung\", edit_mode: \"BEARBEITUNGSMODUS\",\n                p: [\"Sonnenblume\",\"Erbsenkanone\",\"Walnuss\",\"Schneeerbse\",\"Kirschbombe\",\"Doppelerbse\",\"Kartoffelmine\",\"K\u00fcrbis\",\"Jalape\u00f1o\",\"Stachelkraut\",\"Fackelbaum\",\"Hochnuss\",\"Kaktus\",\"Sternfrucht\"],\n                d: [\"Erzeugt zus\u00e4tzliche Sonne, damit dein Arsenal schneller w\u00e4chst!\",\"Schie\u00dft Erbsen auf herannahende Feinde.\",\"Ihre harte Schale sch\u00fctzt deine anderen Pflanzen davor, gefressen zu werden.\",\"Schie\u00dft gefrorene Erbsen, die Feinde verlangsamen.\",\"Explodiert in einem gro\u00dfen Bereich und vernichtet alle Zombies darin!\",\"Doppelter \u00c4rger! Schie\u00dft zwei Erbsen auf einmal.\",\"Explodiert bei Ber\u00fchrung! Braucht etwas Zeit zum Scharfmachen.\",\"Zerquetscht den ersten Zombie, der zu nahe kommt.\",\"Eine feurige Schote, die alle Zombies in ihrer Bahn vernichtet!\",\"Verletzt Zombies, die \u00fcber seine spitzen Stacheln laufen.\",\"Entz\u00fcndet Erbsen, die hindurchfliegen, und verdoppelt ihren Schaden!\",\"Eine riesige Mauer, die selbst springende Zombies nicht \u00fcberwinden.\",\"Schie\u00dft spitze Stacheln, die sogar Ballons platzen lassen!\",\"Eine fr\u00f6hliche Frucht, die Sterne in f\u00fcnf Richtungen schie\u00dft!\"],\n                n1: \"Ein friedlicher, goldener Morgen in Nachbarsdorf. Die fr\u00f6hliche Sonnenblume summt im Wind, ahnungslos gegen\u00fcber den lauernden Schatten...\",\n                b1a: \"Was f\u00fcr ein herrlich sonniger Tag! Kein Zombie in Sicht! \ud83c\udf3b\", b1b: \"Alles ruhig! Zeit, die Morgensonne zu genie\u00dfen.\",\n                n2: \"BIS DER BODEN BEBTE! Schlurfende Schritte hallten durch die Stra\u00dfe, als die hungrigen Untoten mit nur einem Verlangen ins Licht traten... <highlight>GEHIRNE!</highlight>\",\n                b2a: \"GEEEHIIIRNE... Wir wollen saftige Gehirne! \ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"Pylonen-Abwehr bereit! Marsch zur Veranda!\", b2c: \"\u26a0\ufe0f ALARMSTUFE ROT! UNTOTE AM BORDSTEIN!\",\n                n3: \"Eine gewaltige Invasion dr\u00e4ngt zu deiner Haust\u00fcr! Der masttragende Gargantuar und Football-Zombies drohen den Rasen zu \u00fcberrennen!\",\n                b3a: \"ZERSCHMETTERN! DAS HAUS ZERSCHMETTERN! \ud83d\udca5\",\n                n4: \"Der gr\u00fcne Widerstand erwacht! F\u00fchre deine Pflanzenw\u00e4chter, sammle Sonnenenergie, errichte Barrieren und schlag die Horde zur\u00fcck, um deine Nachbarschaft zu retten!\",\n                b4a: \"Sonne hoch, Wurzeln tief! Wir besch\u00fctzen diesen Garten!\", b4b: \"Meine Schale knacken sie NICHT! Haltet stand!\", b4c: \"Geladen und bereit! Zielen, FEUER! \ud83c\udfaf\"\n            },\n            ja: {\n                loading: \"\u8aad\u307f\u8fbc\u307f\u4e2d...\", title: \"\u30d7\u30e9\u30f3\u30c4 vs \u30be\u30f3\u30d3 2\", play: \"\u30d7\u30ec\u30a4\", story_btn: \"\u30b9\u30c8\u30fc\u30ea\u30fc\u5e8f\u7ae0\", settings: \"\u8a2d\u5b9a\", language: \"\u8a00\u8a9e\",\n                skip: \"\u30b9\u30ad\u30c3\u30d7\", next: \"\u6b21\u3078\", defend: \"\u829d\u751f\u3092\u5b88\u308c\uff01\", act: \"\u5e8f\u7ae0 \u2022 \u7b2c{n}\u5e55\", story_loading: \"\u30b9\u30c8\u30fc\u30ea\u30fc\u8aad\u307f\u8fbc\u307f\u4e2d...\",\n                select_level: \"\u30ec\u30d9\u30eb\u9078\u629e\", back: \"\u623b\u308b\", choose_plants: \"\u690d\u7269\u3092\u9078\u307c\u3046\", selected: \"\u9078\u629e\u4e2d\uff1a{n}/5\", start_game: \"\u30b2\u30fc\u30e0\u958b\u59cb\",\n                collection: \"\u690d\u7269\u56f3\u9451\", discover: \"\u690d\u7269\u306e\u5b88\u308a\u624b\u305f\u3061\u3092\u898b\u3064\u3051\u3088\u3046\uff01\", close: \"\u9589\u3058\u308b\",\n                paused: \"\u4e00\u6642\u505c\u6b62\", resume: \"\u518d\u958b\", restart: \"\u3084\u308a\u76f4\u3059\", level_select: \"\u30ec\u30d9\u30eb\u9078\u629e\", main_menu: \"\u30e1\u30a4\u30f3\u30e1\u30cb\u30e5\u30fc\",\n                victory: \"\u52dd\u5229\uff01\", next_level: \"\u6b21\u306e\u30ec\u30d9\u30eb\", replay: \"\u3082\u3046\u4e00\u5ea6\", defeat: \"\u6557\u5317\u2026\", retry: \"\u30ea\u30c8\u30e9\u30a4\",\n                new_plant: \"\u65b0\u3057\u3044\u690d\u7269\uff01\", awesome: \"\u3084\u3063\u305f\u306d\uff01\", new_plant_desc: \"\u5f37\u529b\u306a\u65b0\u3057\u3044\u690d\u7269\u304c\u4ef2\u9593\u306b\u52a0\u308f\u3063\u305f\uff01\",\n                tut1: \"\u30d7\u30e9\u30f3\u30c4 vs \u30be\u30f3\u30d3 2\u3078\u3088\u3046\u3053\u305d\uff01\", tut2: \"\u592a\u967d\u3092\u96c6\u3081\u3066\u5b88\u308a\u3092\u56fa\u3081\u3088\u3046\u3002\", tut3: \"\u30e1\u30cb\u30e5\u30fc\u30dc\u30bf\u30f3\u3067\u4e00\u6642\u505c\u6b62\u3084\u30ea\u30b9\u30bf\u30fc\u30c8\u304c\u3067\u304d\u307e\u3059\u3002\", tut4: \"\u30ab\u30fc\u30c9\u3092\u30bf\u30c3\u30d7\u3057\u3066\u690d\u7269\u3092\u9078\u3073\u3001\u30de\u30b9\u3092\u30bf\u30c3\u30d7\u3057\u3066\u690d\u3048\u3088\u3046\u3002\", got_it: \"\u308f\u304b\u3063\u305f\uff01\",\n                prep: \"\u6e96\u5099\u6642\u9593\uff1a{s}\u79d2\", next_phase: \"\u6b21\u306e\u30d5\u30a7\u30fc\u30ba\u307e\u3067\uff1a{s}\u79d2\", phase_start: \"\u30d5\u30a7\u30fc\u30ba{n} \u958b\u59cb\", phase: \"\u30d5\u30a7\u30fc\u30ba\uff1a{n}/{t}\",\n                level_n: \"\u30ec\u30d9\u30eb{n}\", unlocks_at: \"\u30ec\u30d9\u30eb{n}\u3067\u89e3\u653e\", lv1: \"\u5ead\u306e\u304d\u307b\u3093\", lv2: \"\u9632\u885b\u30e9\u30a4\u30f3\", lv3: \"\u7206\u767a\u30c7\u30a3\u30d5\u30a7\u30f3\u30b9\", edit_mode: \"\u7de8\u96c6\u30e2\u30fc\u30c9\",\n                p: [\"\u30d2\u30de\u30ef\u30ea\",\"\u30d4\u30fc\u30b7\u30e5\u30fc\u30bf\u30fc\",\"\u30a6\u30a9\u30fc\u30eb\u30ca\u30c3\u30c4\",\"\u30b9\u30ce\u30fc\u30d4\u30fc\",\"\u30c1\u30a7\u30ea\u30fc\u30dc\u30e0\",\"\u30ea\u30d4\u30fc\u30bf\u30fc\",\"\u30dd\u30c6\u30c8\u30de\u30a4\u30f3\",\"\u30b9\u30ab\u30c3\u30b7\u30e5\",\"\u30cf\u30e9\u30da\u30fc\u30cb\u30e7\",\"\u30c8\u30b2\u30c8\u30b2\u8349\",\"\u30c8\u30fc\u30c1\u30a6\u30c3\u30c9\",\"\u30c8\u30fc\u30eb\u30ca\u30c3\u30c4\",\"\u30b5\u30dc\u30c6\u30f3\",\"\u30b9\u30bf\u30fc\u30d5\u30eb\u30fc\u30c4\"],\n                d: [\"\u8ffd\u52a0\u306e\u592a\u967d\u3092\u751f\u307f\u51fa\u3057\u3001\u6226\u529b\u3092\u3059\u3070\u3084\u304f\u5897\u3084\u305b\u308b\uff01\",\"\u8feb\u308a\u304f\u308b\u6575\u306b\u8c46\u3092\u6483\u3063\u3066\u829d\u751f\u3092\u5b88\u308b\u3002\",\"\u3068\u3066\u3082\u786c\u3044\u6bbb\u3067\u4ed6\u306e\u690d\u7269\u304c\u98df\u3079\u3089\u308c\u308b\u306e\u3092\u9632\u3050\u3002\",\"\u51cd\u3063\u305f\u8c46\u3067\u6575\u306e\u79fb\u52d5\u3068\u653b\u6483\u3092\u9045\u304f\u3059\u308b\u3002\",\"\u5e83\u7bc4\u56f2\u3067\u7206\u767a\u3057\u3001\u7bc4\u56f2\u5185\u306e\u30be\u30f3\u30d3\u3092\u4e00\u6383\u3059\u308b\uff01\",\"2\u500d\u306e\u653b\u6483\uff01\u4e00\u5ea6\u306b\u8c46\u30922\u767a\u6483\u3064\u3002\",\"\u89e6\u308c\u308b\u3068\u7206\u767a\uff01\u5730\u4e2d\u3067\u6e96\u5099\u3059\u308b\u306e\u306b\u5c11\u3057\u6642\u9593\u304c\u304b\u304b\u308b\u3002\",\"\u8fd1\u3065\u304d\u3059\u304e\u305f\u6700\u521d\u306e\u30be\u30f3\u30d3\u3092\u62bc\u3057\u3064\u3076\u3059\u3002\",\"\u5217\u5168\u4f53\u306e\u30be\u30f3\u30d3\u3092\u713c\u304d\u5c3d\u304f\u3059\u6fc0\u8f9b\u30da\u30c3\u30d1\u30fc\uff01\",\"\u92ed\u3044\u30c8\u30b2\u306e\u4e0a\u3092\u6b69\u304f\u30be\u30f3\u30d3\u306b\u30c0\u30e1\u30fc\u30b8\u3092\u4e0e\u3048\u308b\u3002\",\"\u901a\u308a\u629c\u3051\u305f\u8c46\u306b\u706b\u3092\u3064\u3051\u3001\u30c0\u30e1\u30fc\u30b8\u30922\u500d\u306b\uff01\",\"\u30b8\u30e3\u30f3\u30d7\u3059\u308b\u30be\u30f3\u30d3\u3067\u3082\u8d8a\u3048\u3089\u308c\u306a\u3044\u5de8\u5927\u306a\u58c1\u3002\",\"\u98a8\u8239\u3082\u5272\u308c\u308b\u92ed\u3044\u30c8\u30b2\u3092\u6483\u3064\uff01\",\"5\u65b9\u5411\u306b\u661f\u3092\u6483\u3064\u967d\u6c17\u306a\u30d5\u30eb\u30fc\u30c4\uff01\"],\n                n1: \"\u30cd\u30a4\u30d0\u30fc\u30d3\u30eb\u306e\u7a4f\u3084\u304b\u306a\u9ec4\u91d1\u8272\u306e\u671d\u3002\u967d\u6c17\u306a\u30d2\u30de\u30ef\u30ea\u306f\u305d\u3088\u98a8\u306b\u9f3b\u6b4c\u3092\u6b4c\u3044\u3001\u5fcd\u3073\u5bc4\u308b\u5f71\u306b\u6c17\u3065\u3044\u3066\u3044\u306a\u3044\u2026\",\n                b1a: \"\u306a\u3093\u3066\u7d20\u6575\u306a\u6674\u308c\u306e\u65e5\uff01\u30be\u30f3\u30d3\u306f\u4e00\u5339\u3082\u3044\u306a\u3044\uff01\ud83c\udf3b\", b1b: \"\u5468\u308a\u306f\u9759\u304b\u3060\uff01\u671d\u65e5\u3092\u6d74\u3073\u308b\u6642\u9593\u3060\u306d\u3002\",\n                n2: \"\u305d\u306e\u6642\u3001\u5927\u5730\u304c\u63fa\u308c\u305f\uff01\u8db3\u3092\u5f15\u304d\u305a\u308b\u97f3\u304c\u901a\u308a\u306b\u97ff\u304d\u3001\u98e2\u3048\u305f\u30a2\u30f3\u30c7\u30c3\u30c9\u304c\u305f\u3060\u4e00\u3064\u306e\u6b32\u671b\u3092\u80f8\u306b\u59ff\u3092\u73fe\u3057\u305f\u2026<highlight>\u8133\u307f\u305d\uff01</highlight>\",\n                b2a: \"\u30ce\u30fc\u30fc\u30df\u30bd\u30fc\u30fc\u2026\u30b8\u30e5\u30fc\u30b7\u30fc\u306a\u8133\u307f\u305d\u304c\u6b32\u3057\u3044\uff01\ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"\u30b3\u30fc\u30f3\u306e\u5b88\u308a\u6e96\u5099\u5b8c\u4e86\uff01\u7384\u95a2\u3078\u9032\u3081\uff01\", b2c: \"\u26a0\ufe0f \u7dca\u6025\u4e8b\u614b\uff01\u30be\u30f3\u30d3\u304c\u6b69\u9053\u307e\u3067\u6765\u3066\u308b\uff01\",\n                n3: \"\u5de8\u5927\u306a\u4fb5\u7565\u8ecd\u304c\u7384\u95a2\u306b\u8feb\u308b\uff01\u96fb\u67f1\u3092\u632f\u308a\u56de\u3059\u30ac\u30eb\u30ac\u30f3\u30c1\u30e5\u30a2\u3068\u30d5\u30c3\u30c8\u30dc\u30fc\u30eb\u30be\u30f3\u30d3\u304c\u829d\u751f\u3092\u8352\u3089\u305d\u3046\u3068\u3057\u3066\u3044\u308b\uff01\",\n                b3a: \"\u3076\u3063\u58ca\u305b\uff01\u5bb6\u3092\u3076\u3063\u58ca\u305b\uff01\ud83d\udca5\",\n                n4: \"\u7dd1\u306e\u30ec\u30b8\u30b9\u30bf\u30f3\u30b9\u304c\u76ee\u899a\u3081\u305f\uff01\u690d\u7269\u306e\u5b88\u8b77\u8005\u3092\u6307\u63ee\u3057\u3001\u592a\u967d\u30a8\u30cd\u30eb\u30ae\u30fc\u3092\u96c6\u3081\u3001\u9811\u4e08\u306a\u58c1\u3092\u7bc9\u304d\u3001\u5927\u7fa4\u3092\u5439\u304d\u98db\u3070\u3057\u3066\u8857\u3092\u5b88\u308c\uff01\",\n                b4a: \"\u592a\u967d\u306f\u4e0a\u306b\u3001\u6839\u3063\u3053\u306f\u4e0b\u306b\uff01\u3053\u306e\u5ead\u3092\u5b88\u308b\u305e\uff01\", b4b: \"\u3053\u306e\u6bbb\u306f\u7d76\u5bfe\u306b\u7834\u3089\u305b\u306a\u3044\uff01\u8e0f\u3093\u5f35\u308c\uff01\", b4c: \"\u88c5\u586b\u5b8c\u4e86\uff01\u69cb\u3048\u3066\u3001\u6483\u3066\u30fc\uff01\ud83c\udfaf\"\n            },\n            jv: {\n                loading: \"Ngemot aset...\", title: \"Tanduran vs Zombi 2\", play: \"Dolanan\", story_btn: \"Purwaka Crita\", settings: \"Setelan\", language: \"Basa\",\n                skip: \"LIWATI\", next: \"SABANJURE\", defend: \"JAGA PLATARAN!\", act: \"PURWAKA \u2022 BABAK {n}\", story_loading: \"Ngemot crita...\",\n                select_level: \"Pilih Level\", back: \"Bali\", choose_plants: \"Pilih Tanduranmu\", selected: \"Dipilih: {n}/5\", start_game: \"Miwiti Dolanan\",\n                collection: \"Koleksi Tanduran\", discover: \"Temokake tanduran pambelamu!\", close: \"Tutup\",\n                paused: \"Ngaso\", resume: \"Terusake\", restart: \"Baleni\", level_select: \"Pilih Level\", main_menu: \"Menu Utama\",\n                victory: \"Menang!\", next_level: \"Level Sabanjure\", replay: \"Dolanan Maneh\", defeat: \"Kalah!\", retry: \"Jajal Maneh\",\n                new_plant: \"Tanduran Anyar!\", awesome: \"Apik Tenan!\", new_plant_desc: \"Tanduran anyar sing kuwat melu njaga pertahananmu!\",\n                tut1: \"Sugeng rawuh ing Tanduran vs Zombi 2!\", tut2: \"Kumpulna sorot srengenge kanggo nguwatake pertahanan.\", tut3: \"Gunakake tombol menu kanggo ngaso utawa mbaleni level.\", tut4: \"Tutul kertu kanggo milih tanduran, banjur tutul kothak kanggo nandur.\", got_it: \"NGERTI!\",\n                prep: \"Persiapan: {s} detik\", next_phase: \"Fase sabanjure: {s} detik\", phase_start: \"FASE {n} DIWIWITI\", phase: \"FASE: {n}/{t}\",\n                level_n: \"Level {n}\", unlocks_at: \"Kabukak ing Level {n}\", lv1: \"Dhasar Kebon\", lv2: \"Garis Pertahanan\", lv3: \"Pertahanan Bledosan\", edit_mode: \"MODE SUNTING\",\n                p: [\"Kembang Srengenge\",\"Penembak Kacang\",\"Kacang Tembok\",\"Kacang Es\",\"Bom Ceri\",\"Penembak Kembar\",\"Ranjau Kenthang\",\"Waluh\",\"Lombok Jalapeno\",\"Suket Eri\",\"Kayu Obor\",\"Kacang Dhuwur\",\"Kaktus\",\"Blimbing\"],\n                d: [\"Ngasilake srengenge ekstra supaya senjatamu cepet nambah!\",\"Nembak kacang menyang mungsuh sing nyedhak.\",\"Kulite sing atos nglindhungi tanduran liyane supaya ora dipangan.\",\"Nembak kacang beku sing ngalonake mungsuh.\",\"Mbledhos ing wilayah amba lan ngrusak kabeh zombi ing sakubenge!\",\"Kaping pindho! Nembak kacang loro sakaligus.\",\"Mbledhos yen kesenggol! Butuh wektu sethithik kanggo siyap.\",\"Ngremuk zombi pisanan sing nyedhak banget.\",\"Lombok pedhes sing ngobong kabeh zombi ing jalure!\",\"Nglarani zombi sing mlaku ing ndhuwur eri-erine sing landhep.\",\"Ngobong kacang sing liwat, ngundhakake karusakan kaping pindho!\",\"Tembok gedhe sing ora bisa diluncati zombi sing pinter mlumpat.\",\"Nembak eri landhep sing bisa mecahake balon!\",\"Woh sing seneng sing nembak lintang menyang limang arah!\"],\n                n1: \"Esuk emas sing tentrem ing Neighborville. Kembang Srengenge sing seneng nembang kena angin, ora ngerti ana wewayangan sing ndhelik...\",\n                b1a: \"Dina sing padhang tenan! Ora ana zombi babar pisan! \ud83c\udf3b\", b1b: \"Sakubenge tentrem! Wayahe nikmati srengenge esuk.\",\n                n2: \"NGANTI LEMAH GONJANG-GANJING! Swara langkah nyeret kumandhang ing dalan nalika mayat urip sing luwe metu karo siji kepinginan... <highlight>UTEK!</highlight>\",\n                b2a: \"UTEEEK... Aku pengin utek sing enak! \ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"Pertahanan kerucut siyap! Maju menyang teras!\", b2c: \"\u26a0\ufe0f KODE ABANG! MAYAT URIP ING PINGGIR DALAN!\",\n                n3: \"Serbuan gedhe tumuju lawangmu! Gargantuar sing ngayunake cagak lan zombi bal-balan arep nggempur plataran!\",\n                b3a: \"REMUKNA! REMUKNA OMAHE! \ud83d\udca5\",\n                n4: \"Perlawanan ijo tangi! Pimpinen para pengawal tanduranmu, kumpulna energi srengenge, pasang penghalang, lan kalahna gerombolan kanggo nylametake kampungmu!\",\n                b4a: \"Srengenge ing dhuwur, oyod ing ngisor! Awake dhewe bakal njaga kebon iki!\", b4b: \"Kulitku ORA bakal pecah! Tetep kuwat!\", b4c: \"Siyap! Arahna, TEMBAK! \ud83c\udfaf\"\n            },\n            ko: {\n                loading: \"\ub9ac\uc18c\uc2a4 \ubd88\ub7ec\uc624\ub294 \uc911...\", title: \"\uc2dd\ubb3c vs \uc880\ube44 2\", play: \"\ud50c\ub808\uc774\", story_btn: \"\uc2a4\ud1a0\ub9ac \ud504\ub864\ub85c\uadf8\", settings: \"\uc124\uc815\", language: \"\uc5b8\uc5b4\",\n                skip: \"\uac74\ub108\ub6f0\uae30\", next: \"\ub2e4\uc74c\", defend: \"\uc794\ub514\ubc2d\uc744 \uc9c0\ucf1c\ub77c!\", act: \"\ud504\ub864\ub85c\uadf8 \u2022 {n}\ub9c9\", story_loading: \"\uc2a4\ud1a0\ub9ac \ubd88\ub7ec\uc624\ub294 \uc911...\",\n                select_level: \"\ub808\ubca8 \uc120\ud0dd\", back: \"\ub4a4\ub85c\", choose_plants: \"\uc2dd\ubb3c\uc744 \uace0\ub974\uc138\uc694\", selected: \"\uc120\ud0dd\ub428: {n}/5\", start_game: \"\uac8c\uc784 \uc2dc\uc791\",\n                collection: \"\uc2dd\ubb3c \ub3c4\uac10\", discover: \"\uc2dd\ubb3c \uc218\ud638\uc790\ub4e4\uc744 \ubc1c\uacac\ud558\uc138\uc694!\", close: \"\ub2eb\uae30\",\n                paused: \"\uc77c\uc2dc\uc815\uc9c0\", resume: \"\uacc4\uc18d\ud558\uae30\", restart: \"\ub2e4\uc2dc \uc2dc\uc791\", level_select: \"\ub808\ubca8 \uc120\ud0dd\", main_menu: \"\uba54\uc778 \uba54\ub274\",\n                victory: \"\uc2b9\ub9ac!\", next_level: \"\ub2e4\uc74c \ub808\ubca8\", replay: \"\ub2e4\uc2dc \ud558\uae30\", defeat: \"\ud328\ubc30!\", retry: \"\uc7ac\ub3c4\uc804\",\n                new_plant: \"\uc0c8\ub85c\uc6b4 \uc2dd\ubb3c!\", awesome: \"\uba4b\uc838\uc694!\", new_plant_desc: \"\uac15\ub825\ud55c \uc0c8 \uc2dd\ubb3c\uc774 \ubc29\uc5b4\uc5d0 \ud569\ub958\ud588\uc2b5\ub2c8\ub2e4!\",\n                tut1: \"\uc2dd\ubb3c vs \uc880\ube44 2\uc5d0 \uc624\uc2e0 \uac83\uc744 \ud658\uc601\ud569\ub2c8\ub2e4!\", tut2: \"\ud587\ube5b\uc744 \ubaa8\uc544 \ubc29\uc5b4\ub97c \uac15\ud654\ud558\uc138\uc694.\", tut3: \"\uba54\ub274 \ubc84\ud2bc\uc73c\ub85c \ub808\ubca8\uc744 \uc77c\uc2dc\uc815\uc9c0\ud558\uac70\ub098 \ub2e4\uc2dc \uc2dc\uc791\ud560 \uc218 \uc788\uc5b4\uc694.\", tut4: \"\uce74\ub4dc\ub97c \ud0ed\ud574 \uc2dd\ubb3c\uc744 \uace0\ub974\uace0, \uce78\uc744 \ud0ed\ud574 \uc2ec\uc73c\uc138\uc694.\", got_it: \"\uc54c\uaca0\uc5b4\uc694!\",\n                prep: \"\uc900\ube44 \uc2dc\uac04: {s}\ucd08\", next_phase: \"\ub2e4\uc74c \ub2e8\uacc4\uae4c\uc9c0: {s}\ucd08\", phase_start: \"{n}\ub2e8\uacc4 \uc2dc\uc791\", phase: \"\ub2e8\uacc4: {n}/{t}\",\n                level_n: \"\ub808\ubca8 {n}\", unlocks_at: \"\ub808\ubca8 {n}\uc5d0\uc11c \ud574\uae08\", lv1: \"\uc815\uc6d0 \uae30\ucd08\", lv2: \"\ubc29\uc5b4\uc120\", lv3: \"\ud3ed\ubc1c \ubc29\uc5b4\", edit_mode: \"\ud3b8\uc9d1 \ubaa8\ub4dc\",\n                p: [\"\ud574\ubc14\ub77c\uae30\",\"\uc644\ub450\ucf69 \uc288\ud130\",\"\uc6d4\ub11b\",\"\ub208\uc644\ub450\",\"\uccb4\ub9ac \ud3ed\ud0c4\",\"\ub9ac\ud53c\ud130\",\"\uac10\uc790 \uc9c0\ub8b0\",\"\uc2a4\ucffc\uc2dc\",\"\ud560\ub77c\ud53c\ub1e8\",\"\uac00\uc2dc\ud480\",\"\ud683\ubd88\ub098\ubb34\",\"\ud1a8\ub11b\",\"\uc120\uc778\uc7a5\",\"\uc2a4\ud0c0\ud504\ub8e8\ud2b8\"],\n                d: [\"\ucd94\uac00 \ud587\ube5b\uc744 \ub9cc\ub4e4\uc5b4 \uc804\ub825\uc744 \ube60\ub974\uac8c \ud0a4\uc6cc\uc918\uc694!\",\"\ub2e4\uac00\uc624\ub294 \uc801\uc5d0\uac8c \uc644\ub450\ucf69\uc744 \uc3f4\uc11c \uc794\ub514\ubc2d\uc744 \uc9c0\ucf1c\uc694.\",\"\ub2e8\ub2e8\ud55c \uaecd\uc9c8\ub85c \ub2e4\ub978 \uc2dd\ubb3c\uc774 \uba39\ud788\uc9c0 \uc54a\uac8c \ub9c9\uc544\uc694.\",\"\uc5bc\ub9b0 \uc644\ub450\ucf69\uc73c\ub85c \uc801\uc758 \uc774\ub3d9\uacfc \uacf5\uaca9\uc744 \ub290\ub9ac\uac8c \ud574\uc694.\",\"\ub113\uc740 \ubc94\uc704\ub97c \ud3ed\ubc1c\uc2dc\ucf1c \ubc94\uc704 \uc548\uc758 \ubaa8\ub4e0 \uc880\ube44\ub97c \uc5c6\uc560\uc694!\",\"\ub450 \ubc30\uc758 \uacf5\uaca9! \ud55c \ubc88\uc5d0 \uc644\ub450\ucf69 \ub450 \uac1c\ub97c \uc3f4\uc694.\",\"\ub2ff\uc73c\uba74 \ud3ed\ubc1c! \ub545\uc18d\uc5d0\uc11c \uc900\ube44\ud558\ub294 \ub370 \uc2dc\uac04\uc774 \uc870\uae08 \uac78\ub824\uc694.\",\"\ub108\ubb34 \uac00\uae4c\uc774 \uc628 \uccab \ubc88\uc9f8 \uc880\ube44\ub97c \uc9d3\ub20c\ub7ec\uc694.\",\"\uc904 \uc804\uccb4\uc758 \uc880\ube44\ub97c \ubd88\ud0dc\uc6b0\ub294 \ub9e4\uc6b4 \uace0\ucd94!\",\"\ub0a0\uce74\ub85c\uc6b4 \uac00\uc2dc \uc704\ub97c \uac77\ub294 \uc880\ube44\uc5d0\uac8c \ud53c\ud574\ub97c \uc918\uc694.\",\"\uc9c0\ub098\uac00\ub294 \uc644\ub450\ucf69\uc5d0 \ubd88\uc744 \ubd99\uc5ec \ud53c\ud574\ub97c \ub450 \ubc30\ub85c!\",\"\uc810\ud504\ud558\ub294 \uc880\ube44\ub3c4 \ub118\uc744 \uc218 \uc5c6\ub294 \uac70\ub300\ud55c \ubcbd.\",\"\ud48d\uc120\ub3c4 \ud130\ub728\ub9ac\ub294 \ub0a0\uce74\ub85c\uc6b4 \uac00\uc2dc\ub97c \uc3f4\uc694!\",\"\ub2e4\uc12f \ubc29\ud5a5\uc73c\ub85c \ubcc4\uc744 \uc3d8\ub294 \uba85\ub791\ud55c \uacfc\uc77c!\"],\n                n1: \"\ub124\uc774\ubc84\ube4c\uc758 \ud3c9\ud654\ub85c\uc6b4 \ud669\uae08\ube5b \uc544\uce68. \uba85\ub791\ud55c \ud574\ubc14\ub77c\uae30\ub294 \uc0b0\ub4e4\ubc14\ub78c\uc5d0 \ucf67\ub178\ub798\ub97c \ubd80\ub974\uba70, \uc228\uc5b4 \uc788\ub294 \uadf8\ub9bc\uc790\ub97c \ub208\uce58\ucc44\uc9c0 \ubabb\ud588\uc8e0...\",\n                b1a: \"\uc815\ub9d0 \ud654\ucc3d\ud55c \ub0a0\uc774\uc57c! \uc880\ube44\ub294 \ud558\ub098\ub3c4 \uc5c6\uc5b4! \ud83c\udf3b\", b1b: \"\uc8fc\ubcc0\uc740 \uc870\uc6a9\ud574! \uc544\uce68 \ud587\uc0b4\uc744 \uc990\uae38 \uc2dc\uac04\uc774\uc57c.\",\n                n2: \"\uadf8\ub54c \ub545\uc774 \ud754\ub4e4\ub838\ub2e4! \ubc1c\uc744 \ub044\ub294 \uc18c\ub9ac\uac00 \uac70\ub9ac\uc5d0 \uc6b8\ub824 \ud37c\uc9c0\uace0, \uad76\uc8fc\ub9b0 \uc880\ube44\ub4e4\uc774 \ub2e8 \ud558\ub098\uc758 \uc695\ub9dd\uc744 \ud488\uace0 \ub098\ud0c0\ub0ac\ub2e4... <highlight>\ub1cc!</highlight>\",\n                b2a: \"\ub1cc\uc560\uc560... \ub9db\uc788\ub294 \ub1cc\ub97c \uc6d0\ud55c\ub2e4! \ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"\uace0\uae54 \ubc29\uc5b4 \uc900\ube44 \uc644\ub8cc! \ud604\uad00\uc73c\ub85c \uc9c4\uaca9!\", b2c: \"\u26a0\ufe0f \ube44\uc0c1\uc0ac\ud0dc! \uc880\ube44\uac00 \uae38\uac00\uc5d0 \uc654\uc5b4!\",\n                n3: \"\uac70\ub300\ud55c \uce68\ub7b5\uad70\uc774 \ubb38 \uc55e\uae4c\uc9c0 \ubc00\ub824\uc628\ub2e4! \uc804\ubd07\ub300\ub97c \ud718\ub450\ub974\ub294 \uac70\uac04\ud22c\uc544\uc640 \ubbf8\uc2dd\ucd95\uad6c \uc880\ube44\uac00 \uc794\ub514\ubc2d\uc744 \ud729\uc4f8\ub824 \ud55c\ub2e4!\",\n                b3a: \"\ubd80\uc234\ub77c! \uc9d1\uc744 \ubd80\uc234\ub77c! \ud83d\udca5\",\n                n4: \"\ub179\uc0c9 \uc800\ud56d\uad70\uc774 \uae68\uc5b4\ub0ac\ub2e4! \uc2dd\ubb3c \uc218\ud638\uc790\ub4e4\uc744 \uc9c0\ud718\ud558\uace0, \ud0dc\uc591 \uc5d0\ub108\uc9c0\ub97c \ubaa8\uc73c\uace0, \ud2bc\ud2bc\ud55c \ubc29\ubcbd\uc744 \uc138\uc6cc \uc880\ube44 \ubb34\ub9ac\ub97c \ubb3c\ub9ac\uce58\uace0 \ub9c8\uc744\uc744 \uc9c0\ucf1c\ub77c!\",\n                b4a: \"\ud574\ub294 \uc704\ub85c, \ubfcc\ub9ac\ub294 \uc544\ub798\ub85c! \uc774 \uc815\uc6d0\uc744 \uc9c0\ud0a4\uaca0\uc5b4!\", b4b: \"\ub0b4 \uaecd\uc9c8\uc740 \uc808\ub300 \ubabb \uae68! \ubc84\ud168!\", b4c: \"\uc7a5\uc804 \uc644\ub8cc! \uc870\uc900, \ubc1c\uc0ac! \ud83c\udfaf\"\n            },\n            it: {\n                loading: \"Caricamento risorse...\", title: \"Piante contro Zombi 2\", play: \"Gioca\", story_btn: \"Prologo\", settings: \"Impostazioni\", language: \"Lingua\",\n                skip: \"SALTA\", next: \"AVANTI\", defend: \"DIFENDI IL GIARDINO!\", act: \"PROLOGO \u2022 ATTO {n}\", story_loading: \"Caricamento storia...\",\n                select_level: \"Scegli livello\", back: \"Indietro\", choose_plants: \"Scegli le tue piante\", selected: \"Scelte: {n}/5\", start_game: \"Inizia partita\",\n                collection: \"Collezione piante\", discover: \"Scopri i tuoi difensori botanici!\", close: \"Chiudi\",\n                paused: \"In pausa\", resume: \"Riprendi\", restart: \"Riavvia\", level_select: \"Livelli\", main_menu: \"Menu principale\",\n                victory: \"Vittoria!\", next_level: \"Livello successivo\", replay: \"Rigioca\", defeat: \"Sconfitta!\", retry: \"Riprova\",\n                new_plant: \"Nuova pianta!\", awesome: \"Fantastico!\", new_plant_desc: \"Una nuova potente pianta si unisce alla tua difesa!\",\n                tut1: \"Benvenuto in Piante contro Zombi 2!\", tut2: \"Raccogli la luce solare per potenziare le difese.\", tut3: \"Usa il pulsante menu per mettere in pausa o riavviare.\", tut4: \"Tocca una carta per scegliere una pianta, poi tocca una casella per piantarla.\", got_it: \"HO CAPITO!\",\n                prep: \"Preparazione: {s}s\", next_phase: \"Prossima fase tra: {s}s\", phase_start: \"INIZIO FASE {n}\", phase: \"FASE: {n}/{t}\",\n                level_n: \"Livello {n}\", unlocks_at: \"Si sblocca al livello {n}\", lv1: \"Basi del giardino\", lv2: \"Linea difensiva\", lv3: \"Difesa esplosiva\", edit_mode: \"MODALIT\u00c0 MODIFICA\",\n                p: [\"Girasole\",\"Sparasemi\",\"Noce\",\"Sparasemi di ghiaccio\",\"Ciliegia bomba\",\"Doppio Sparasemi\",\"Mina patata\",\"Schiaccia\",\"Jalapeno\",\"Erba spina\",\"Tronco di fuoco\",\"Noce gigante\",\"Cactus\",\"Carambola\"],\n                d: [\"Genera sole extra per espandere il tuo arsenale pi\u00f9 in fretta!\",\"Spara piselli contro i nemici in arrivo per difendere il prato.\",\"Il suo guscio resistente protegge le altre piante dall'essere divorate.\",\"Spara piselli congelati che rallentano i nemici.\",\"Esplode in un'ampia area distruggendo tutti gli zombi vicini!\",\"Doppia potenza! Spara due piselli alla volta.\",\"Esplode al contatto! Ha bisogno di tempo per prepararsi sottoterra.\",\"Schiaccia il primo zombi che si avvicina troppo.\",\"Un peperoncino infuocato che incenerisce l'intera corsia!\",\"Danneggia gli zombi che calpestano le sue spine appuntite.\",\"Infiamma i piselli che lo attraversano raddoppiandone i danni!\",\"Un muro enorme che nemmeno gli zombi saltatori possono superare.\",\"Spara spine affilate capaci di far scoppiare i palloncini!\",\"Un frutto allegro che spara stelle in cinque direzioni!\"],\n                n1: \"Un mattino dorato e sereno a Neighborville. Il vispo Girasole canticchia nella brezza, ignaro delle ombre in agguato...\",\n                b1a: \"Che bella giornata di sole! Nessuno zombi in vista! \ud83c\udf3b\", b1b: \"Tutto tranquillo! Godiamoci il sole del mattino.\",\n                n2: \"FINCH\u00c9 LA TERRA NON TREM\u00d2! Passi strascicati echeggiarono per la strada e i non-morti affamati emersero con un solo desiderio... <highlight>CERVELLI!</highlight>\",\n                b2a: \"CEEERVELLLI... Vogliamo cervelli succosi! \ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"Difesa col cono pronta! Marcia verso il portico!\", b2c: \"\u26a0\ufe0f ALLARME ROSSO! NON-MORTI SUL CORDOLO!\",\n                n3: \"Un'invasione colossale avanza verso la tua porta! Il possente Gargantuar col palo e gli zombi rugbisti minacciano il prato!\",\n                b3a: \"DISTRUGGERE! DISTRUGGERE LA CASA! \ud83d\udca5\",\n                n4: \"La resistenza verde si risveglia! Guida i tuoi guardiani botanici, raccogli l'energia solare, erigi barriere e respingi l'orda per salvare il quartiere!\",\n                b4a: \"Sole in alto, radici a terra! Difenderemo questo giardino!\", b4b: \"NON romperanno il mio guscio! Resistete!\", b4c: \"Carico e pronto! Mirare... FUOCO! \ud83c\udfaf\"\n            },\n            vi: {\n                loading: \"\u0110ang t\u1ea3i t\u00e0i nguy\u00ean...\", title: \"Hoa Qu\u1ea3 N\u1ed5i Gi\u1eadn 2\", play: \"Ch\u01a1i ngay\", story_btn: \"L\u1eddi m\u1edf \u0111\u1ea7u\", settings: \"C\u00e0i \u0111\u1eb7t\", language: \"Ng\u00f4n ng\u1eef\",\n                skip: \"B\u1ece QUA\", next: \"TI\u1ebeP\", defend: \"B\u1ea2O V\u1ec6 KHU V\u01af\u1edcN!\", act: \"M\u1ede \u0110\u1ea6U \u2022 H\u1ed2I {n}\", story_loading: \"\u0110ang t\u1ea3i c\u00e2u chuy\u1ec7n...\",\n                select_level: \"Ch\u1ecdn m\u00e0n\", back: \"Quay l\u1ea1i\", choose_plants: \"Ch\u1ecdn c\u00e2y tr\u1ed3ng\", selected: \"\u0110\u00e3 ch\u1ecdn: {n}/5\", start_game: \"B\u1eaft \u0111\u1ea7u\",\n                collection: \"B\u1ed9 s\u01b0u t\u1eadp c\u00e2y\", discover: \"Kh\u00e1m ph\u00e1 c\u00e1c d\u0169ng s\u0129 th\u1ef1c v\u1eadt!\", close: \"\u0110\u00f3ng\",\n                paused: \"T\u1ea1m d\u1eebng\", resume: \"Ti\u1ebfp t\u1ee5c\", restart: \"Ch\u01a1i l\u1ea1i\", level_select: \"Ch\u1ecdn m\u00e0n\", main_menu: \"Menu ch\u00ednh\",\n                victory: \"Chi\u1ebfn th\u1eafng!\", next_level: \"M\u00e0n ti\u1ebfp theo\", replay: \"Ch\u01a1i l\u1ea1i\", defeat: \"Th\u1ea5t b\u1ea1i!\", retry: \"Th\u1eed l\u1ea1i\",\n                new_plant: \"C\u00e2y m\u1edbi!\", awesome: \"Tuy\u1ec7t v\u1eddi!\", new_plant_desc: \"M\u1ed9t chi\u1ebfn binh th\u1ef1c v\u1eadt m\u1edbi \u0111\u00e3 gia nh\u1eadp \u0111\u1ed9i h\u00ecnh!\",\n                tut1: \"Ch\u00e0o m\u1eebng b\u1ea1n \u0111\u1ebfn v\u1edbi Hoa Qu\u1ea3 N\u1ed5i Gi\u1eadn 2!\", tut2: \"Thu th\u1eadp \u00e1nh s\u00e1ng m\u1eb7t tr\u1eddi \u0111\u1ec3 ph\u00e1t tri\u1ec3n ph\u00f2ng tuy\u1ebfn.\", tut3: \"D\u00f9ng n\u00fat menu \u0111\u1ec3 t\u1ea1m d\u1eebng ho\u1eb7c ch\u01a1i l\u1ea1i m\u00e0n ch\u01a1i.\", tut4: \"Nh\u1ea5n v\u00e0o th\u1ebb c\u00e2y r\u1ed3i nh\u1ea5n v\u00e0o \u00f4 \u0111\u1ea5t \u0111\u1ec3 tr\u1ed3ng.\", got_it: \"\u0110\u00c3 HI\u1ec2U!\",\n                prep: \"Chu\u1ea9n b\u1ecb: {s} gi\u00e2y\", next_phase: \"\u0110\u1ee3t ti\u1ebfp theo trong: {s} gi\u00e2y\", phase_start: \"B\u1eaeT \u0110\u1ea6U \u0110\u1ee2T {n}\", phase: \"\u0110\u1ee2T: {n}/{t}\",\n                level_n: \"M\u00e0n {n}\", unlocks_at: \"M\u1edf kh\u00f3a \u1edf M\u00e0n {n}\", lv1: \"V\u01b0\u1eddn c\u01a1 b\u1ea3n\", lv2: \"Tuy\u1ebfn ph\u00f2ng th\u1ee7\", lv3: \"Ph\u00f2ng th\u1ee7 b\u00f9ng n\u1ed5\", edit_mode: \"CH\u1ebe \u0110\u1ed8 CH\u1ec8NH S\u1eecA\",\n                p: [\"Hoa H\u01b0\u1edbng D\u01b0\u01a1ng\",\"C\u00e2y B\u1eafn \u0110\u1eadu\",\"H\u1ea1t \u00d3c Ch\u00f3\",\"\u0110\u1eadu B\u0103ng\",\"Qu\u1ea3 Bom Cherry\",\"C\u00e2y \u0110\u1eadu Hai N\u00f2ng\",\"M\u00ecn Khoai T\u00e2y\",\"B\u00ed Ng\u00f4 \u0110\u00e8\",\"\u1edat L\u1eeda\",\"C\u1ecf Ch\u00f4ng\",\"C\u00e2y \u0110u\u1ed1c\",\"\u00d3c Ch\u00f3 Cao\",\"X\u01b0\u01a1ng R\u1ed3ng\",\"Kh\u1ebf N\u0103m C\u00e1nh\"],\n                d: [\"T\u1ea1o th\u00eam \u00e1nh s\u00e1ng m\u1eb7t tr\u1eddi gi\u00fap b\u1ea1n x\u00e2y d\u1ef1ng qu\u00e2n \u0111\u1ed9i nhanh h\u01a1n!\",\"B\u1eafn \u0111\u1eadu v\u00e0o k\u1ebb \u0111\u1ecbch \u0111ang ti\u1ebfn \u0111\u1ebfn \u0111\u1ec3 b\u1ea3o v\u1ec7 b\u00e3i c\u1ecf.\",\"L\u1edbp v\u1ecf c\u1ee9ng c\u00e1p b\u1ea3o v\u1ec7 c\u00e1c c\u00e2y kh\u00e1c kh\u00f4ng b\u1ecb \u0103n th\u1ecbt.\",\"B\u1eafn ra h\u1ea1t \u0111\u1eadu b\u0103ng l\u00e0m ch\u1eadm t\u1ed1c \u0111\u1ed9 v\u00e0 \u0111\u00f2n \u0111\u00e1nh c\u1ee7a \u0111\u1ecbch.\",\"N\u1ed5 tung tr\u00ean di\u1ec7n r\u1ed9ng, ti\u00eau di\u1ec7t to\u00e0n b\u1ed9 zombie xung quanh!\",\"Nh\u00e2n \u0111\u00f4i s\u1ee9c m\u1ea1nh! B\u1eafn hai h\u1ea1t \u0111\u1eadu c\u00f9ng l\u00fac.\",\"Ch\u1ea1m v\u00e0o l\u00e0 ph\u00e1t n\u1ed5! C\u1ea7n m\u1ed9t ch\u00fat th\u1eddi gian \u0111\u1ec3 k\u00edch ho\u1ea1t d\u01b0\u1edbi \u0111\u1ea5t.\",\"\u0110\u00e8 b\u1eb9p zombie \u0111\u1ea7u ti\u00ean ti\u1ebfn l\u1ea1i qu\u00e1 g\u1ea7n.\",\"Qu\u1ea3 \u1edbt r\u1ef1c l\u1eeda thi\u00eau r\u1ee5i to\u00e0n b\u1ed9 zombie tr\u00ean c\u00f9ng m\u1ed9t h\u00e0ng!\",\"G\u00e2y s\u00e1t th\u01b0\u01a1ng cho zombie b\u01b0\u1edbc qua l\u1edbp ch\u00f4ng s\u1eafc nh\u1ecdn.\",\"Th\u1eafp l\u1eeda cho h\u1ea1t \u0111\u1eadu bay qua, nh\u00e2n \u0111\u00f4i s\u00e1t th\u01b0\u01a1ng!\",\"B\u1ee9c t\u01b0\u1eddng ki\u00ean c\u1ed1 m\u00e0 ngay c\u1ea3 zombie nh\u1ea3y s\u00e0o c\u0169ng kh\u00f4ng qua \u0111\u01b0\u1ee3c.\",\"B\u1eafn gai nh\u1ecdn th\u1eadm ch\u00ed c\u00f3 th\u1ec3 l\u00e0m n\u1ed5 bong b\u00f3ng!\",\"Tr\u00e1i c\u00e2y vui v\u1ebb b\u1eafn sao ra n\u0103m h\u01b0\u1edbng kh\u00e1c nhau!\"],\n                n1: \"M\u1ed9t bu\u1ed5i s\u00e1ng v\u00e0ng thanh b\u00ecnh \u1edf Neighborville. Hoa H\u01b0\u1edbng D\u01b0\u01a1ng vui v\u1ebb ng\u00e2m nga trong gi\u00f3, kh\u00f4ng h\u1ec1 hay bi\u1ebft b\u00f3ng t\u1ed1i \u0111ang r\u00ecnh r\u1eadp...\",\n                b1a: \"M\u1ed9t ng\u00e0y n\u1eafng th\u1eadt \u0111\u1eb9p! Kh\u00f4ng th\u1ea5y b\u00f3ng d\u00e1ng zombie n\u00e0o! \ud83c\udf3b\", b1b: \"Xung quanh th\u1eadt y\u00ean \u1ea3! \u0110\u1ebfn l\u00fac t\u1eafm n\u1eafng s\u1edbm r\u1ed3i.\",\n                n2: \"CHO \u0110\u1ebeN KHI M\u1eb6T \u0110\u1ea4T RUNG CHUY\u1ec2N! Ti\u1ebfng l\u00ea b\u01b0\u1edbc vang v\u1ecdng kh\u1eafp con ph\u1ed1 khi l\u0169 x\u00e1c s\u1ed1ng \u0111\u00f3i kh\u00e1t xu\u1ea5t hi\u1ec7n v\u1edbi m\u1ed9t khao kh\u00e1t duy nh\u1ea5t... <highlight>N\u00c3O!</highlight>\",\n                b2a: \"N\u00c3\u00c3\u00c3O... Ch\u00fang tao mu\u1ed1n nh\u1eefng b\u1ed9 n\u00e3o ngon l\u00e0nh! \ud83e\udddf\u200d\u2642\ufe0f\", b2b: \"N\u00f3n giao th\u00f4ng s\u1eb5n s\u00e0ng! Ti\u1ebfn l\u00ean th\u1ec1m nh\u00e0!\", b2c: \"\u26a0\ufe0f B\u00c1O \u0110\u1ed8NG \u0110\u1ece! X\u00c1C S\u1ed0NG \u0110\u00c3 \u0110\u1ebeN V\u1ec8A H\u00c8!\",\n                n3: \"M\u1ed9t cu\u1ed9c x\u00e2m l\u0103ng kh\u1ed5ng l\u1ed3 \u0111ang tr\u00e0n t\u1edbi c\u1eeda nh\u00e0 b\u1ea1n! Gargantuar v\u00e1c c\u1ed9t \u0111i\u1ec7n v\u00e0 zombie b\u00f3ng b\u1ea7u d\u1ee5c \u0111e d\u1ecda san ph\u1eb3ng b\u00e3i c\u1ecf!\",\n                b3a: \"\u0110\u1eacP N\u00c1T! \u0110\u1eacP N\u00c1T NG\u00d4I NH\u00c0! \ud83d\udca5\",\n                n4: \"\u0110\u1ed9i qu\u00e2n xanh th\u1ee9c t\u1ec9nh! Ch\u1ec9 huy nh\u1eefng d\u0169ng s\u0129 th\u1ef1c v\u1eadt, thu th\u1eadp n\u0103ng l\u01b0\u1ee3ng m\u1eb7t tr\u1eddi, d\u1ef1ng t\u01b0\u1eddng th\u00e0nh v\u00e0 qu\u00e9t s\u1ea1ch binh \u0111o\u00e0n zombie!\",\n                b4a: \"M\u1eb7t tr\u1eddi l\u00ean cao, r\u1ec5 b\u00e1m s\u00e2u! Ch\u00fang ta s\u1ebd b\u1ea3o v\u1ec7 khu v\u01b0\u1eddn n\u00e0y!\", b4b: \"Ch\u00fang KH\u00d4NG TH\u1ec2 ph\u00e1 v\u1ee1 l\u1edbp v\u1ecf c\u1ee7a t\u00f4i! Gi\u1eef v\u1eefng v\u1ecb tr\u00ed!\", b4c: \"\u0110\u00e3 n\u1ea1p \u0111\u1ea1n xong! Ng\u1eafm b\u1eafn... B\u1eaeN! \ud83c\udfaf\"\n            }\n        };\n        // Expand plant name/description arrays into keyed entries (p_sunflower, d_sunflower, ...)\n        Object.keys(window.I18N).forEach(code => {\n            const L = window.I18N[code];\n            (L.p || []).forEach((v, i) => { L['p_' + window.PLANT_ORDER[i]] = v; });\n            (L.d || []).forEach((v, i) => { L['d_' + window.PLANT_ORDER[i]] = v; });\n        });\n\n        /* ================= MINI-STORY TRANSLATIONS (milestones, intros, victories) ================= */\n        window.I18N_STORY = {\n            en: { badge_intro: \"\u26a0\ufe0f INCOMING THREAT\", badge_mile: \"\u2b50 MILESTONE\", badge_final: \"\ud83d\udd25 FINAL BATTLE\", cont: \"CONTINUE\", unl_q: \"Reporting for duty, Gardener! \ud83c\udf31\", final_wave: \"A HUGE WAVE OF ZOMBIES IS APPROACHING!\", mower: \"LAWN MOWER TO THE RESCUE!\",\n                w1n: \"Your very first victory! The zombies stumble back down the street, groaning... but this was only the beginning.\", w1a: \"We did it! Our first win! \ud83c\udf89\", w1b: \"We'll be back... with CONES! \ud83e\udddf\",\n                i5n: \"A tattered flag waves on the horizon. A massive wave is coming, and some zombies now wear metal buckets!\", i5a: \"FOLLOW THE FLAG! BRAAAINS!\", i5b: \"Bucket on! Your peas can't hurt me!\",\n                i6n: \"The undead are getting smarter! A grumpy reader hides behind his newspaper, and an athlete vaults right over your plants. Battles now come in phases!\", i6a: \"Don't touch my newspaper!! \ud83d\udcf0\", i6b: \"Hup! Over the wall I go! \ud83c\udfc3\",\n                w5n: \"Five levels cleared! Word spreads through Neighborville: the green resistance is real, and it's winning!\", w5a: \"The whole street is cheering for us! \ud83c\udf3b\", w5b: \"Stay sharp... something BIG is coming.\",\n                i10n: \"The ground cracks open. Dragging a telephone pole, with a tiny Imp on its back, the mighty GARGANTUAR has arrived!\", i10a: \"SMASH PUNY PLANTS!! \ud83d\udca5\", i10b: \"Throw me, big guy! Wheee!\", i10c: \"Uh-oh... we're gonna need more peas!\",\n                w10n: \"Halfway there! The Gargantuar crashes onto the lawn. But far away, the zombie army gathers every last soldier...\", w10a: \"Halfway to saving Neighborville! \ud83d\udcaa\", w10b: \"The boss will NOT be happy...\",\n                i15n: \"The battle rages on. Every kind of zombie has joined the march. Only the bravest gardens will survive!\", i15a: \"Let's make this one go BOOM! \ud83c\udf52\", i15b: \"ALL TOGETHER NOW! CHAAARGE!\",\n                i20n: \"THE FINAL STAND! The entire undead army marches on your home: Gargantuars, Imps and hordes beyond counting. This is it!\", i20a: \"THIS LAWN IS OURS!!\", i20b: \"Every sunbeam counts. For Neighborville! \u2600\ufe0f\", i20c: \"Not. One. Step. Further!\",\n                w20n: \"LEGENDARY VICTORY! The last zombie falls and golden sunlight returns to Neighborville. You are the Guardian of the Garden!\", w20a: \"We saved the neighborhood! \ud83c\udf3b\", w20b: \"Best. Gardener. EVER! \ud83c\udfc6\", w20c: \"...until the next full moon. \ud83d\ude09\",\n                l1n: \"Oh no! The zombies ate your brains! But every great gardener grows back stronger...\", l1a: \"Don't give up! Try a new plan! \ud83c\udf31\", l1b: \"Mmm... braaains... \ud83e\udde0\" },\n            zh: { badge_intro: \"\u26a0\ufe0f \u5a01\u80c1\u6765\u88ad\", badge_mile: \"\u2b50 \u91cc\u7a0b\u7891\", badge_final: \"\ud83d\udd25 \u6700\u7ec8\u51b3\u6218\", cont: \"\u7ee7\u7eed\", unl_q: \"\u56ed\u4e01\uff0c\u524d\u6765\u62a5\u5230\uff01\ud83c\udf31\", final_wave: \"\u4e00\u5927\u6ce2\u50f5\u5c38\u6b63\u5728\u63a5\u8fd1\uff01\", mower: \"\u5272\u8349\u673a\u6765\u6551\u573a\u5566\uff01\",\n                w1n: \"\u4f60\u7684\u7b2c\u4e00\u573a\u80dc\u5229\uff01\u50f5\u5c38\u4eec\u54c0\u568e\u7740\u8dcc\u8dcc\u649e\u649e\u5730\u9000\u56de\u8857\u4e0a\u2026\u2026\u4f46\u8fd9\u53ea\u662f\u5f00\u59cb\u3002\", w1a: \"\u6211\u4eec\u505a\u5230\u4e86\uff01\u7b2c\u4e00\u573a\u80dc\u5229\uff01\ud83c\udf89\", w1b: \"\u6211\u4eec\u4f1a\u56de\u6765\u7684\u2026\u2026\u6234\u7740\u8def\u969c\uff01\ud83e\udddf\",\n                i5n: \"\u4e00\u9762\u7834\u65e7\u7684\u65d7\u5e1c\u5728\u8fdc\u65b9\u98d8\u626c\u3002\u4e00\u5927\u6ce2\u50f5\u5c38\u5373\u5c06\u6765\u88ad\uff0c\u6709\u4e9b\u8fd8\u6234\u4e0a\u4e86\u94c1\u6876\uff01\", i5a: \"\u8ddf\u7740\u65d7\u5b50\u8d70\uff01\u8111\u5b50\uff01\", i5b: \"\u94c1\u6876\u6234\u597d\uff01\u4f60\u7684\u8c4c\u8c46\u4f24\u4e0d\u4e86\u6211\uff01\",\n                i6n: \"\u4ea1\u7075\u8d8a\u6765\u8d8a\u806a\u660e\u4e86\uff01\u66b4\u8e81\u7684\u8bfb\u62a5\u50f5\u5c38\u8eb2\u5728\u62a5\u7eb8\u540e\u9762\uff0c\u8fd0\u52a8\u5458\u50f5\u5c38\u8fd8\u80fd\u6491\u6746\u8df3\u8fc7\u4f60\u7684\u690d\u7269\u3002\u6218\u6597\u73b0\u5728\u5206\u9636\u6bb5\u8fdb\u884c\uff01\", i6a: \"\u522b\u78b0\u6211\u7684\u62a5\u7eb8\uff01\uff01\ud83d\udcf0\", i6b: \"\u563f\uff01\u8df3\u8fc7\u53bb\u54af\uff01\ud83c\udfc3\",\n                w5n: \"\u5df2\u901a\u5173\u4e94\u5173\uff01\u6d88\u606f\u4f20\u904d\u4e86\u90bb\u5c45\u9547\uff1a\u7eff\u8272\u62b5\u6297\u519b\u662f\u771f\u7684\uff0c\u800c\u4e14\u6b63\u5728\u83b7\u80dc\uff01\", w5a: \"\u6574\u6761\u8857\u90fd\u5728\u4e3a\u6211\u4eec\u6b22\u547c\uff01\ud83c\udf3b\", w5b: \"\u4fdd\u6301\u8b66\u60d5\u2026\u2026\u6709\u4e2a\u5927\u5bb6\u4f19\u8981\u6765\u4e86\u3002\",\n                i10n: \"\u5927\u5730\u88c2\u5f00\u4e86\u3002\u62d6\u7740\u7535\u7ebf\u6746\u3001\u80cc\u4e0a\u9a6e\u7740\u5c0f\u9b3c\u50f5\u5c38\uff0c\u5f3a\u5927\u7684\u5de8\u4eba\u50f5\u5c38\u767b\u573a\u4e86\uff01\", i10a: \"\u7838\u70c2\u5f31\u5c0f\u690d\u7269\uff01\uff01\ud83d\udca5\", i10b: \"\u6254\u6211\u5427\uff0c\u5927\u4e2a\u5b50\uff01\u545c\u547c\uff01\", i10c: \"\u7cdf\u7cd5\u2026\u2026\u6211\u4eec\u9700\u8981\u66f4\u591a\u8c4c\u8c46\uff01\",\n                w10n: \"\u5df2\u8fc7\u534a\u7a0b\uff01\u5de8\u4eba\u50f5\u5c38\u8f70\u7136\u5012\u5728\u8349\u576a\u4e0a\u3002\u4f46\u5728\u8fdc\u65b9\uff0c\u50f5\u5c38\u5927\u519b\u6b63\u96c6\u7ed3\u6700\u540e\u7684\u58eb\u5175\u2026\u2026\", w10a: \"\u62ef\u6551\u90bb\u5c45\u9547\u5df2\u7ecf\u8fc7\u534a\uff01\ud83d\udcaa\", w10b: \"\u8001\u5927\u53ef\u4e0d\u4f1a\u9ad8\u5174\u7684\u2026\u2026\",\n                i15n: \"\u6218\u6597\u6108\u6f14\u6108\u70c8\u3002\u6240\u6709\u7c7b\u578b\u7684\u50f5\u5c38\u90fd\u52a0\u5165\u4e86\u8fdb\u519b\u3002\u53ea\u6709\u6700\u52c7\u6562\u7684\u82b1\u56ed\u624d\u80fd\u5e78\u5b58\uff01\", i15a: \"\u8ba9\u8fd9\u4e00\u5173\u70b8\u7ffb\u5929\uff01\ud83c\udf52\", i15b: \"\u4e00\u8d77\u4e0a\uff01\u51b2\u554a\uff01\",\n                i20n: \"\u6700\u7ec8\u51b3\u6218\uff01\u6574\u652f\u4ea1\u7075\u5927\u519b\u5411\u4f60\u7684\u5bb6\u8fdb\u53d1\uff1a\u5de8\u4eba\u3001\u5c0f\u9b3c\u548c\u6570\u4e0d\u6e05\u7684\u50f5\u5c38\u7fa4\u3002\u51b3\u6218\u65f6\u523b\u5230\u4e86\uff01\", i20a: \"\u8fd9\u7247\u8349\u576a\u662f\u6211\u4eec\u7684\uff01\uff01\", i20b: \"\u6bcf\u4e00\u7f15\u9633\u5149\u90fd\u5f88\u91cd\u8981\u3002\u4e3a\u4e86\u90bb\u5c45\u9547\uff01\u2600\ufe0f\", i20c: \"\u4e00\u6b65\u3002\u4e5f\u4e0d\u8bb8\u3002\u518d\u524d\u8fdb\uff01\",\n                w20n: \"\u4f20\u5947\u822c\u7684\u80dc\u5229\uff01\u6700\u540e\u4e00\u4e2a\u50f5\u5c38\u5012\u4e0b\uff0c\u91d1\u8272\u7684\u9633\u5149\u91cd\u56de\u90bb\u5c45\u9547\u3002\u4f60\u5c31\u662f\u82b1\u56ed\u5b88\u62a4\u8005\uff01\", w20a: \"\u6211\u4eec\u62ef\u6551\u4e86\u793e\u533a\uff01\ud83c\udf3b\", w20b: \"\u53f2\u4e0a\u3002\u6700\u5f3a\u3002\u56ed\u4e01\uff01\ud83c\udfc6\", w20c: \"\u2026\u2026\u76f4\u5230\u4e0b\u4e00\u4e2a\u6ee1\u6708\u3002\ud83d\ude09\",\n                l1n: \"\u54e6\u4e0d\uff01\u50f5\u5c38\u5403\u6389\u4e86\u4f60\u7684\u8111\u5b50\uff01\u4f46\u6bcf\u4e2a\u4f1f\u5927\u7684\u56ed\u4e01\u90fd\u4f1a\u53d8\u5f97\u66f4\u5f3a\u2026\u2026\", l1a: \"\u522b\u653e\u5f03\uff01\u6362\u4e2a\u7b56\u7565\u8bd5\u8bd5\uff01\ud83c\udf31\", l1b: \"\u55ef\u2026\u2026\u8111\u2026\u2026\u5b50\u2026\u2026\ud83e\udde0\" },\n            hi: { badge_intro: \"\u26a0\ufe0f \u0916\u0924\u0930\u093e \u0906 \u0930\u0939\u093e \u0939\u0948\", badge_mile: \"\u2b50 \u0909\u092a\u0932\u092c\u094d\u0927\u093f\", badge_final: \"\ud83d\udd25 \u0905\u0902\u0924\u093f\u092e \u092f\u0941\u0926\u094d\u0927\", cont: \"\u091c\u093e\u0930\u0940 \u0930\u0916\u0947\u0902\", unl_q: \"\u092e\u093e\u0932\u0940 \u091c\u0940, \u0921\u094d\u092f\u0942\u091f\u0940 \u0915\u0947 \u0932\u093f\u090f \u0939\u093e\u091c\u093c\u093f\u0930! \ud83c\udf31\", final_wave: \"\u091c\u093c\u0949\u092e\u094d\u092c\u0940\u091c\u093c \u0915\u0940 \u090f\u0915 \u0935\u093f\u0936\u093e\u0932 \u0932\u0939\u0930 \u0906 \u0930\u0939\u0940 \u0939\u0948!\", mower: \"\u0932\u0949\u0928 \u092e\u094b\u0935\u0930 \u092c\u091a\u093e\u0928\u0947 \u0906\u092f\u093e!\",\n                w1n: \"\u0906\u092a\u0915\u0940 \u092a\u0939\u0932\u0940 \u091c\u0940\u0924! \u091c\u093c\u0949\u092e\u094d\u092c\u0940\u091c\u093c \u0915\u0930\u093e\u0939\u0924\u0947 \u0939\u0941\u090f \u0917\u0932\u0940 \u092e\u0947\u0902 \u0935\u093e\u092a\u0938 \u0932\u0921\u093c\u0916\u0921\u093c\u093e \u0917\u090f... \u092a\u0930 \u092f\u0939 \u0924\u094b \u092c\u0938 \u0936\u0941\u0930\u0941\u0906\u0924 \u0925\u0940\u0964\", w1a: \"\u0939\u092e\u0928\u0947 \u0915\u0930 \u0926\u093f\u0916\u093e\u092f\u093e! \u092a\u0939\u0932\u0940 \u091c\u0940\u0924! \ud83c\udf89\", w1b: \"\u0939\u092e \u0935\u093e\u092a\u0938 \u0906\u090f\u0901\u0917\u0947... \u0915\u094b\u0928 \u092a\u0939\u0928\u0915\u0930! \ud83e\udddf\",\n                i5n: \"\u0915\u094d\u0937\u093f\u0924\u093f\u091c \u092a\u0930 \u090f\u0915 \u092b\u091f\u093e \u091d\u0902\u0921\u093e \u0932\u0939\u0930\u093e \u0930\u0939\u093e \u0939\u0948\u0964 \u090f\u0915 \u0935\u093f\u0936\u093e\u0932 \u0932\u0939\u0930 \u0906 \u0930\u0939\u0940 \u0939\u0948, \u0914\u0930 \u0915\u0941\u091b \u091c\u093c\u0949\u092e\u094d\u092c\u0940\u091c\u093c \u0905\u092c \u0932\u094b\u0939\u0947 \u0915\u0940 \u092c\u093e\u0932\u094d\u091f\u0940 \u092a\u0939\u0928\u0924\u0947 \u0939\u0948\u0902!\", i5a: \"\u091d\u0902\u0921\u0947 \u0915\u0947 \u092a\u0940\u091b\u0947 \u091a\u0932\u094b! \u0926\u093f\u092e\u093e\u093e\u093e\u0917!\", i5b: \"\u092c\u093e\u0932\u094d\u091f\u0940 \u092a\u0939\u0928 \u0932\u0940! \u0924\u0941\u092e\u094d\u0939\u093e\u0930\u0947 \u092e\u091f\u0930 \u092e\u0947\u0930\u093e \u0915\u0941\u091b \u0928\u0939\u0940\u0902 \u092c\u093f\u0917\u093e\u0921\u093c \u0938\u0915\u0924\u0947!\",\n                i6n: \"\u092e\u0941\u0930\u094d\u0926\u0947 \u091a\u093e\u0932\u093e\u0915 \u0939\u094b \u0930\u0939\u0947 \u0939\u0948\u0902! \u090f\u0915 \u091a\u093f\u0921\u093c\u091a\u093f\u0921\u093c\u093e \u092a\u093e\u0920\u0915 \u0905\u0916\u093c\u092c\u093e\u0930 \u0915\u0947 \u092a\u0940\u091b\u0947 \u091b\u093f\u092a\u093e \u0939\u0948, \u0914\u0930 \u090f\u0915 \u090f\u0925\u0932\u0940\u091f \u0906\u092a\u0915\u0947 \u092a\u094c\u0927\u094b\u0902 \u0915\u0947 \u090a\u092a\u0930 \u0938\u0947 \u0915\u0942\u0926 \u091c\u093e\u0924\u093e \u0939\u0948\u0964 \u0905\u092c \u0932\u0921\u093c\u093e\u0907\u092f\u093e\u0901 \u091a\u0930\u0923\u094b\u0902 \u092e\u0947\u0902 \u0939\u094b\u0902\u0917\u0940!\", i6a: \"\u092e\u0947\u0930\u0947 \u0905\u0916\u093c\u092c\u093e\u0930 \u0915\u094b \u092e\u0924 \u091b\u0942\u0928\u093e!! \ud83d\udcf0\", i6b: \"\u0939\u092a! \u0926\u0940\u0935\u093e\u0930 \u0915\u0947 \u090a\u092a\u0930 \u0938\u0947! \ud83c\udfc3\",\n                w5n: \"\u092a\u093e\u0901\u091a \u0932\u0947\u0935\u0932 \u092a\u0942\u0930\u0947! \u0928\u0947\u092c\u0930\u0935\u093f\u0932 \u092e\u0947\u0902 \u0916\u093c\u092c\u0930 \u092b\u0948\u0932 \u0917\u0908: \u0939\u0930\u0940 \u0938\u0947\u0928\u093e \u0905\u0938\u0932\u0940 \u0939\u0948, \u0914\u0930 \u091c\u0940\u0924 \u0930\u0939\u0940 \u0939\u0948!\", w5a: \"\u092a\u0942\u0930\u0940 \u0917\u0932\u0940 \u0939\u092e\u093e\u0930\u0947 \u0932\u093f\u090f \u0924\u093e\u0932\u093f\u092f\u093e\u0901 \u092c\u091c\u093e \u0930\u0939\u0940 \u0939\u0948! \ud83c\udf3b\", w5b: \"\u0938\u0924\u0930\u094d\u0915 \u0930\u0939\u094b... \u0915\u0941\u091b \u092c\u0939\u0941\u0924 \u092c\u0921\u093c\u093e \u0906 \u0930\u0939\u093e \u0939\u0948\u0964\",\n                i10n: \"\u091c\u093c\u092e\u0940\u0928 \u092b\u091f \u0917\u0908\u0964 \u091f\u0947\u0932\u0940\u092b\u093c\u094b\u0928 \u0915\u093e \u0916\u0902\u092d\u093e \u0918\u0938\u0940\u091f\u0924\u0947 \u0939\u0941\u090f, \u092a\u0940\u0920 \u092a\u0930 \u091b\u094b\u091f\u0947 \u0907\u092e\u094d\u092a \u0915\u0947 \u0938\u093e\u0925, \u0936\u0915\u094d\u0924\u093f\u0936\u093e\u0932\u0940 \u0917\u093e\u0930\u094d\u0917\u0947\u0902\u091f\u0941\u0906\u0930 \u0906 \u092a\u0939\u0941\u0901\u091a\u093e!\", i10a: \"\u0915\u092e\u091c\u093c\u094b\u0930 \u092a\u094c\u0927\u094b\u0902 \u0915\u094b \u0915\u0941\u091a\u0932\u094b!! \ud83d\udca5\", i10b: \"\u092e\u0941\u091d\u0947 \u092b\u0947\u0902\u0915\u094b, \u092c\u0921\u093c\u0947 \u092d\u093e\u0908! \u0935\u0942\u0939\u0942!\", i10c: \"\u0913\u0939... \u0939\u092e\u0947\u0902 \u0914\u0930 \u092e\u091f\u0930 \u091a\u093e\u0939\u093f\u090f!\",\n                w10n: \"\u0906\u0927\u093e \u0938\u092b\u093c\u0930 \u092a\u0942\u0930\u093e! \u0917\u093e\u0930\u094d\u0917\u0947\u0902\u091f\u0941\u0906\u0930 \u0932\u0949\u0928 \u092a\u0930 \u0927\u0921\u093c\u093e\u092e \u0938\u0947 \u0917\u093f\u0930\u093e\u0964 \u092a\u0930 \u0926\u0942\u0930 \u0915\u0939\u0940\u0902, \u091c\u093c\u0949\u092e\u094d\u092c\u0940 \u0938\u0947\u0928\u093e \u0905\u092a\u0928\u093e \u0939\u0930 \u0938\u093f\u092a\u093e\u0939\u0940 \u0907\u0915\u091f\u094d\u0920\u093e \u0915\u0930 \u0930\u0939\u0940 \u0939\u0948...\", w10a: \"\u0928\u0947\u092c\u0930\u0935\u093f\u0932 \u092c\u091a\u093e\u0928\u0947 \u0915\u093e \u0906\u0927\u093e \u0915\u093e\u092e \u092a\u0942\u0930\u093e! \ud83d\udcaa\", w10b: \"\u092c\u0949\u0938 \u092c\u093f\u0932\u094d\u0915\u0941\u0932 \u0916\u093c\u0941\u0936 \u0928\u0939\u0940\u0902 \u0939\u094b\u0917\u093e...\",\n                i15n: \"\u0932\u0921\u093c\u093e\u0908 \u0914\u0930 \u0924\u0947\u091c\u093c \u0939\u094b \u0917\u0908 \u0939\u0948\u0964 \u0939\u0930 \u0924\u0930\u0939 \u0915\u093e \u091c\u093c\u0949\u092e\u094d\u092c\u0940 \u092e\u093e\u0930\u094d\u091a \u092e\u0947\u0902 \u0936\u093e\u092e\u093f\u0932 \u0939\u0948\u0964 \u0938\u093f\u0930\u094d\u092b\u093c \u0938\u092c\u0938\u0947 \u092c\u0939\u093e\u0926\u0941\u0930 \u092c\u0917\u0940\u091a\u0947 \u0939\u0940 \u092c\u091a\u0947\u0902\u0917\u0947!\", i15a: \"\u091a\u0932\u094b \u0907\u0938 \u092c\u093e\u0930 \u0927\u092e\u093e\u0915\u093e \u0915\u0930\u0947\u0902! \ud83c\udf52\", i15b: \"\u0938\u092c \u090f\u0915 \u0938\u093e\u0925! \u0939\u092e\u0932\u093e!\",\n                i20n: \"\u0905\u0902\u0924\u093f\u092e \u092e\u0941\u0915\u093e\u092c\u0932\u093e! \u092a\u0942\u0930\u0940 \u092e\u0941\u0930\u094d\u0926\u093e \u0938\u0947\u0928\u093e \u0906\u092a\u0915\u0947 \u0918\u0930 \u0915\u0940 \u0913\u0930 \u092c\u0922\u093c \u0930\u0939\u0940 \u0939\u0948: \u0917\u093e\u0930\u094d\u0917\u0947\u0902\u091f\u0941\u0906\u0930, \u0907\u092e\u094d\u092a \u0914\u0930 \u0905\u0928\u0917\u093f\u0928\u0924 \u092d\u0940\u0921\u093c\u0964 \u092f\u0939\u0940 \u0939\u0948 \u0935\u094b \u092a\u0932!\", i20a: \"\u092f\u0939 \u0932\u0949\u0928 \u0939\u092e\u093e\u0930\u093e \u0939\u0948!!\", i20b: \"\u0927\u0942\u092a \u0915\u0940 \u0939\u0930 \u0915\u093f\u0930\u0923 \u092e\u093e\u092f\u0928\u0947 \u0930\u0916\u0924\u0940 \u0939\u0948\u0964 \u0928\u0947\u092c\u0930\u0935\u093f\u0932 \u0915\u0947 \u0932\u093f\u090f! \u2600\ufe0f\", i20c: \"\u090f\u0915\u0964 \u0915\u0926\u092e\u0964 \u092d\u0940\u0964 \u0906\u0917\u0947\u0964 \u0928\u0939\u0940\u0902!\",\n                w20n: \"\u092e\u0939\u093e\u0928 \u091c\u0940\u0924! \u0906\u0916\u093c\u093f\u0930\u0940 \u091c\u093c\u0949\u092e\u094d\u092c\u0940 \u0917\u093f\u0930 \u0917\u092f\u093e \u0914\u0930 \u0928\u0947\u092c\u0930\u0935\u093f\u0932 \u092e\u0947\u0902 \u0938\u0941\u0928\u0939\u0930\u0940 \u0927\u0942\u092a \u0932\u094c\u091f \u0906\u0908\u0964 \u0906\u092a \u092c\u0917\u0940\u091a\u0947 \u0915\u0947 \u0930\u0915\u094d\u0937\u0915 \u0939\u0948\u0902!\", w20a: \"\u0939\u092e\u0928\u0947 \u092e\u094b\u0939\u0932\u094d\u0932\u093e \u092c\u091a\u093e \u0932\u093f\u092f\u093e! \ud83c\udf3b\", w20b: \"\u0905\u092c \u0924\u0915 \u0915\u093e\u0964 \u0938\u092c\u0938\u0947\u0964 \u0905\u091a\u094d\u091b\u093e \u092e\u093e\u0932\u0940! \ud83c\udfc6\", w20c: \"...\u0905\u0917\u0932\u0940 \u092a\u0942\u0930\u094d\u0923\u093f\u092e\u093e \u0924\u0915\u0964 \ud83d\ude09\",\n                l1n: \"\u0905\u0930\u0947 \u0928\u0939\u0940\u0902! \u091c\u093c\u0949\u092e\u094d\u092c\u0940\u091c\u093c \u0928\u0947 \u0906\u092a\u0915\u093e \u0926\u093f\u092e\u093e\u0917 \u0916\u093e \u0932\u093f\u092f\u093e! \u092a\u0930 \u0939\u0930 \u092e\u0939\u093e\u0928 \u092e\u093e\u0932\u0940 \u0914\u0930 \u092e\u091c\u093c\u092c\u0942\u0924 \u0939\u094b\u0915\u0930 \u0932\u094c\u091f\u0924\u093e \u0939\u0948...\", l1a: \"\u0939\u093e\u0930 \u092e\u0924 \u092e\u093e\u0928\u094b! \u0928\u0908 \u092f\u094b\u091c\u0928\u093e \u0906\u091c\u093c\u092e\u093e\u0913! \ud83c\udf31\", l1b: \"\u092e\u094d\u092e\u094d\u092e... \u0926\u093f\u092e\u093e\u093e\u093e\u0917... \ud83e\udde0\" },\n            es: { badge_intro: \"\u26a0\ufe0f AMENAZA EN CAMINO\", badge_mile: \"\u2b50 HITO\", badge_final: \"\ud83d\udd25 BATALLA FINAL\", cont: \"CONTINUAR\", unl_q: \"\u00a1A tus \u00f3rdenes, jardinero! \ud83c\udf31\", final_wave: \"\u00a1SE ACERCA UNA ENORME OLEADA DE ZOMBIS!\", mower: \"\u00a1PODADORA AL RESCATE!\",\n                w1n: \"\u00a1Tu primera victoria! Los zombis retroceden tambale\u00e1ndose y gimiendo... pero esto solo era el comienzo.\", w1a: \"\u00a1Lo logramos! \u00a1Primera victoria! \ud83c\udf89\", w1b: \"Volveremos... \u00a1con CONOS! \ud83e\udddf\",\n                i5n: \"Una bandera rota ondea en el horizonte. \u00a1Llega una oleada enorme y algunos zombis ahora llevan cubos de metal!\", i5a: \"\u00a1SIGAN LA BANDERA! \u00a1CEREBROOOS!\", i5b: \"\u00a1Cubo puesto! \u00a1Tus guisantes no me hacen nada!\",\n                i6n: \"\u00a1Los no muertos se vuelven m\u00e1s listos! Un lector gru\u00f1\u00f3n se esconde tras su peri\u00f3dico y un atleta salta por encima de tus plantas. \u00a1Ahora las batallas tienen fases!\", i6a: \"\u00a1\u00a1No toques mi peri\u00f3dico!! \ud83d\udcf0\", i6b: \"\u00a1Hop! \u00a1Por encima del muro! \ud83c\udfc3\",\n                w5n: \"\u00a1Cinco niveles superados! Corre la voz por Vecin\u00f3polis: la resistencia verde es real \u00a1y est\u00e1 ganando!\", w5a: \"\u00a1Toda la calle nos aclama! \ud83c\udf3b\", w5b: \"Atentos... algo GRANDE se acerca.\",\n                i10n: \"La tierra se agrieta. Arrastrando un poste telef\u00f3nico y con un peque\u00f1o Diablillo a la espalda, \u00a1ha llegado el poderoso GARGANT\u00daA!\", i10a: \"\u00a1\u00a1APLASTAR PLANTAS D\u00c9BILES!! \ud83d\udca5\", i10b: \"\u00a1L\u00e1nzame, grandull\u00f3n! \u00a1Yujuu!\", i10c: \"Ay... \u00a1vamos a necesitar m\u00e1s guisantes!\",\n                w10n: \"\u00a1A mitad de camino! El Gargant\u00faa cae sobre el c\u00e9sped. Pero a lo lejos, el ej\u00e9rcito zombi re\u00fane hasta su \u00faltimo soldado...\", w10a: \"\u00a1Ya vamos por la mitad! \ud83d\udcaa\", w10b: \"Al jefe NO le va a gustar esto...\",\n                i15n: \"La batalla contin\u00faa. Todo tipo de zombis se ha unido a la marcha. \u00a1Solo los jardines m\u00e1s valientes sobrevivir\u00e1n!\", i15a: \"\u00a1Que este nivel haga BUM! \ud83c\udf52\", i15b: \"\u00a1TODOS JUNTOS! \u00a1A LA CARGA!\",\n                i20n: \"\u00a1LA BATALLA FINAL! Todo el ej\u00e9rcito no muerto marcha hacia tu casa: Gargant\u00faas, Diablillos y hordas incontables. \u00a1Es ahora o nunca!\", i20a: \"\u00a1\u00a1ESTE JARD\u00cdN ES NUESTRO!!\", i20b: \"Cada rayo de sol cuenta. \u00a1Por Vecin\u00f3polis! \u2600\ufe0f\", i20c: \"\u00a1Ni. Un. Paso. M\u00e1s!\",\n                w20n: \"\u00a1VICTORIA LEGENDARIA! Cae el \u00faltimo zombi y la luz dorada vuelve a Vecin\u00f3polis. \u00a1Eres el Guardi\u00e1n del Jard\u00edn!\", w20a: \"\u00a1Salvamos el vecindario! \ud83c\udf3b\", w20b: \"\u00a1El. Mejor. Jardinero. DE LA HISTORIA! \ud83c\udfc6\", w20c: \"...hasta la pr\u00f3xima luna llena. \ud83d\ude09\",\n                l1n: \"\u00a1Oh, no! \u00a1Los zombis se comieron tu cerebro! Pero todo gran jardinero vuelve a crecer m\u00e1s fuerte...\", l1a: \"\u00a1No te rindas! \u00a1Prueba otro plan! \ud83c\udf31\", l1b: \"Mmm... cerebrooos... \ud83e\udde0\" },\n            ar: { badge_intro: \"\u26a0\ufe0f \u062a\u0647\u062f\u064a\u062f \u0642\u0627\u062f\u0645\", badge_mile: \"\u2b50 \u0625\u0646\u062c\u0627\u0632\", badge_final: \"\ud83d\udd25 \u0627\u0644\u0645\u0639\u0631\u0643\u0629 \u0627\u0644\u0623\u062e\u064a\u0631\u0629\", cont: \"\u0645\u062a\u0627\u0628\u0639\u0629\", unl_q: \"\u0641\u064a \u0627\u0644\u062e\u062f\u0645\u0629 \u0623\u064a\u0647\u0627 \u0627\u0644\u0628\u0633\u062a\u0627\u0646\u064a! \ud83c\udf31\", final_wave: \"\u0645\u0648\u062c\u0629 \u0647\u0627\u0626\u0644\u0629 \u0645\u0646 \u0627\u0644\u0632\u0648\u0645\u0628\u064a \u062a\u0642\u062a\u0631\u0628!\", mower: \"\u062c\u0632\u0651\u0627\u0632\u0629 \u0627\u0644\u0639\u0634\u0628 \u0644\u0644\u0625\u0646\u0642\u0627\u0630!\",\n                w1n: \"\u0623\u0648\u0644 \u0627\u0646\u062a\u0635\u0627\u0631 \u0644\u0643! \u062a\u0631\u0627\u062c\u0639 \u0627\u0644\u0632\u0648\u0645\u0628\u064a \u0645\u062a\u0631\u0646\u062d\u064a\u0646 \u0641\u064a \u0627\u0644\u0634\u0627\u0631\u0639 \u0648\u0647\u0645 \u064a\u0626\u0646\u0648\u0646... \u0644\u0643\u0646 \u0647\u0630\u0647 \u0643\u0627\u0646\u062a \u0627\u0644\u0628\u062f\u0627\u064a\u0629 \u0641\u0642\u0637.\", w1a: \"\u0641\u0639\u0644\u0646\u0627\u0647\u0627! \u0623\u0648\u0644 \u0641\u0648\u0632 \u0644\u0646\u0627! \ud83c\udf89\", w1b: \"\u0633\u0646\u0639\u0648\u062f... \u0628\u0627\u0644\u0645\u062e\u0627\u0631\u064a\u0637! \ud83e\udddf\",\n                i5n: \"\u0639\u0644\u0645 \u0645\u0645\u0632\u0642 \u064a\u0631\u0641\u0631\u0641 \u0641\u064a \u0627\u0644\u0623\u0641\u0642. \u0645\u0648\u062c\u0629 \u0636\u062e\u0645\u0629 \u0642\u0627\u062f\u0645\u0629\u060c \u0648\u0628\u0639\u0636 \u0627\u0644\u0632\u0648\u0645\u0628\u064a \u064a\u0631\u062a\u062f\u0648\u0646 \u0627\u0644\u0622\u0646 \u062f\u0644\u0627\u0621 \u0645\u0639\u062f\u0646\u064a\u0629!\", i5a: \"\u0627\u062a\u0628\u0639\u0648\u0627 \u0627\u0644\u0639\u0644\u0645! \u0623\u062f\u0645\u063a\u0629\u0629\u0629!\", i5b: \"\u0627\u0644\u062f\u0644\u0648 \u0639\u0644\u0649 \u0631\u0623\u0633\u064a! \u0628\u0627\u0632\u0644\u0627\u0624\u0643 \u0644\u0627 \u062a\u0624\u0630\u064a\u0646\u064a!\",\n                i6n: \"\u0627\u0644\u0645\u0648\u062a\u0649 \u064a\u0632\u062f\u0627\u062f\u0648\u0646 \u0630\u0643\u0627\u0621\u064b! \u0642\u0627\u0631\u0626 \u063a\u0627\u0636\u0628 \u064a\u062e\u062a\u0628\u0626 \u062e\u0644\u0641 \u062c\u0631\u064a\u062f\u062a\u0647\u060c \u0648\u0631\u064a\u0627\u0636\u064a \u064a\u0642\u0641\u0632 \u0641\u0648\u0642 \u0646\u0628\u0627\u062a\u0627\u062a\u0643. \u0627\u0644\u0645\u0639\u0627\u0631\u0643 \u0627\u0644\u0622\u0646 \u0639\u0644\u0649 \u0645\u0631\u0627\u062d\u0644!\", i6a: \"\u0644\u0627 \u062a\u0644\u0645\u0633 \u062c\u0631\u064a\u062f\u062a\u064a!! \ud83d\udcf0\", i6b: \"\u0647\u0648\u0628! \u0641\u0648\u0642 \u0627\u0644\u062c\u062f\u0627\u0631! \ud83c\udfc3\",\n                w5n: \"\u062e\u0645\u0633 \u0645\u0631\u0627\u062d\u0644 \u0645\u0643\u062a\u0645\u0644\u0629! \u0627\u0646\u062a\u0634\u0631 \u0627\u0644\u062e\u0628\u0631 \u0641\u064a \u062d\u064a\u0651 \u0627\u0644\u062c\u064a\u0631\u0627\u0646: \u0627\u0644\u0645\u0642\u0627\u0648\u0645\u0629 \u0627\u0644\u062e\u0636\u0631\u0627\u0621 \u062d\u0642\u064a\u0642\u064a\u0629 \u0648\u0647\u064a \u062a\u0646\u062a\u0635\u0631!\", w5a: \"\u0627\u0644\u0634\u0627\u0631\u0639 \u0643\u0644\u0647 \u064a\u0647\u062a\u0641 \u0644\u0646\u0627! \ud83c\udf3b\", w5b: \"\u0627\u0628\u0642\u0648\u0627 \u0645\u062a\u064a\u0642\u0638\u064a\u0646... \u0634\u064a\u0621 \u0636\u062e\u0645 \u0642\u0627\u062f\u0645.\",\n                i10n: \"\u0627\u0644\u0623\u0631\u0636 \u062a\u062a\u0634\u0642\u0642. \u064a\u062c\u0631 \u0639\u0645\u0648\u062f \u0647\u0627\u062a\u0641 \u0648\u064a\u062d\u0645\u0644 \u0639\u0641\u0631\u064a\u062a\u064b\u0627 \u0635\u063a\u064a\u0631\u064b\u0627 \u0639\u0644\u0649 \u0638\u0647\u0631\u0647\u060c \u0648\u0635\u0644 \u0627\u0644\u0639\u0645\u0644\u0627\u0642 \u0627\u0644\u062c\u0628\u0627\u0631!\", i10a: \"\u062d\u0637\u0651\u0645 \u0627\u0644\u0646\u0628\u0627\u062a\u0627\u062a \u0627\u0644\u0636\u0639\u064a\u0641\u0629!! \ud83d\udca5\", i10b: \"\u0627\u0631\u0645\u0646\u064a \u0623\u064a\u0647\u0627 \u0627\u0644\u0636\u062e\u0645! \u0648\u0648\u0647\u0648\u0648!\", i10c: \"\u0623\u0648\u0647... \u0633\u0646\u062d\u062a\u0627\u062c \u0627\u0644\u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u0628\u0627\u0632\u0644\u0627\u0621!\",\n                w10n: \"\u0645\u0646\u062a\u0635\u0641 \u0627\u0644\u0637\u0631\u064a\u0642! \u0633\u0642\u0637 \u0627\u0644\u0639\u0645\u0644\u0627\u0642 \u0639\u0644\u0649 \u0627\u0644\u0639\u0634\u0628. \u0644\u0643\u0646 \u0628\u0639\u064a\u062f\u064b\u0627\u060c \u064a\u062c\u0645\u0639 \u062c\u064a\u0634 \u0627\u0644\u0632\u0648\u0645\u0628\u064a \u0622\u062e\u0631 \u062c\u0646\u0648\u062f\u0647...\", w10a: \"\u0642\u0637\u0639\u0646\u0627 \u0646\u0635\u0641 \u0627\u0644\u0637\u0631\u064a\u0642 \u0644\u0625\u0646\u0642\u0627\u0630 \u0627\u0644\u062d\u064a! \ud83d\udcaa\", w10b: \"\u0627\u0644\u0632\u0639\u064a\u0645 \u0644\u0646 \u064a\u0643\u0648\u0646 \u0633\u0639\u064a\u062f\u064b\u0627...\",\n                i15n: \"\u0627\u0644\u0645\u0639\u0631\u0643\u0629 \u062a\u0634\u062a\u062f. \u0643\u0644 \u0623\u0646\u0648\u0627\u0639 \u0627\u0644\u0632\u0648\u0645\u0628\u064a \u0627\u0646\u0636\u0645\u062a \u0625\u0644\u0649 \u0627\u0644\u0632\u062d\u0641. \u0648\u062d\u062f\u0647\u0627 \u0627\u0644\u062d\u062f\u0627\u0626\u0642 \u0627\u0644\u0623\u0634\u062c\u0639 \u0633\u062a\u0646\u062c\u0648!\", i15a: \"\u0644\u0646\u062c\u0639\u0644 \u0647\u0630\u0647 \u0627\u0644\u0645\u0631\u062d\u0644\u0629 \u062a\u0646\u0641\u062c\u0631! \ud83c\udf52\", i15b: \"\u062c\u0645\u064a\u0639\u064b\u0627 \u0645\u0639\u064b\u0627! \u0647\u062c\u0648\u0648\u0648\u0645!\",\n                i20n: \"\u0627\u0644\u0645\u0648\u0627\u062c\u0647\u0629 \u0627\u0644\u0623\u062e\u064a\u0631\u0629! \u062c\u064a\u0634 \u0627\u0644\u0645\u0648\u062a\u0649 \u0628\u0623\u0643\u0645\u0644\u0647 \u064a\u0632\u062d\u0641 \u0646\u062d\u0648 \u0628\u064a\u062a\u0643: \u0639\u0645\u0627\u0644\u0642\u0629 \u0648\u0639\u0641\u0627\u0631\u064a\u062a \u0648\u062d\u0634\u0648\u062f \u0644\u0627 \u062a\u064f\u062d\u0635\u0649. \u0647\u0630\u0647 \u0647\u064a \u0627\u0644\u0644\u062d\u0638\u0629!\", i20a: \"\u0647\u0630\u0647 \u0627\u0644\u062d\u062f\u064a\u0642\u0629 \u0644\u0646\u0627!!\", i20b: \"\u0643\u0644 \u0634\u0639\u0627\u0639 \u0634\u0645\u0633 \u0645\u0647\u0645. \u0645\u0646 \u0623\u062c\u0644 \u0627\u0644\u062d\u064a! \u2600\ufe0f\", i20c: \"\u0648\u0644\u0627. \u062e\u0637\u0648\u0629. \u0623\u062e\u0631\u0649!\",\n                w20n: \"\u0627\u0646\u062a\u0635\u0627\u0631 \u0623\u0633\u0637\u0648\u0631\u064a! \u0633\u0642\u0637 \u0622\u062e\u0631 \u0632\u0648\u0645\u0628\u064a \u0648\u0639\u0627\u062f \u0636\u0648\u0621 \u0627\u0644\u0634\u0645\u0633 \u0627\u0644\u0630\u0647\u0628\u064a \u0625\u0644\u0649 \u0627\u0644\u062d\u064a. \u0623\u0646\u062a \u062d\u0627\u0631\u0633 \u0627\u0644\u062d\u062f\u064a\u0642\u0629!\", w20a: \"\u0623\u0646\u0642\u0630\u0646\u0627 \u0627\u0644\u062d\u064a! \ud83c\udf3b\", w20b: \"\u0623\u0641\u0636\u0644. \u0628\u0633\u062a\u0627\u0646\u064a. \u0639\u0644\u0649 \u0627\u0644\u0625\u0637\u0644\u0627\u0642! \ud83c\udfc6\", w20c: \"...\u062d\u062a\u0649 \u0627\u0644\u0628\u062f\u0631 \u0627\u0644\u0642\u0627\u062f\u0645. \ud83d\ude09\",\n                l1n: \"\u0623\u0648\u0647 \u0644\u0627! \u0623\u0643\u0644 \u0627\u0644\u0632\u0648\u0645\u0628\u064a \u062f\u0645\u0627\u063a\u0643! \u0644\u0643\u0646 \u0643\u0644 \u0628\u0633\u062a\u0627\u0646\u064a \u0639\u0638\u064a\u0645 \u064a\u0646\u0645\u0648 \u0645\u0646 \u062c\u062f\u064a\u062f \u0623\u0642\u0648\u0649...\", l1a: \"\u0644\u0627 \u062a\u0633\u062a\u0633\u0644\u0645! \u062c\u0631\u0651\u0628 \u062e\u0637\u0629 \u062c\u062f\u064a\u062f\u0629! \ud83c\udf31\", l1b: \"\u0645\u0645\u0645... \u0623\u062f\u0645\u063a\u0629\u0629\u0629... \ud83e\udde0\" },\n            fr: { badge_intro: \"\u26a0\ufe0f MENACE EN APPROCHE\", badge_mile: \"\u2b50 \u00c9TAPE CL\u00c9\", badge_final: \"\ud83d\udd25 BATAILLE FINALE\", cont: \"CONTINUER\", unl_q: \"\u00c0 vos ordres, jardinier ! \ud83c\udf31\", final_wave: \"UNE \u00c9NORME VAGUE DE ZOMBIES APPROCHE !\", mower: \"LA TONDEUSE \u00c0 LA RESCOUSSE !\",\n                w1n: \"Ta toute premi\u00e8re victoire ! Les zombies repartent en titubant et en g\u00e9missant... mais ce n'\u00e9tait que le d\u00e9but.\", w1a: \"On a r\u00e9ussi ! Premi\u00e8re victoire ! \ud83c\udf89\", w1b: \"On reviendra... avec des C\u00d4NES ! \ud83e\udddf\",\n                i5n: \"Un drapeau d\u00e9chir\u00e9 flotte \u00e0 l'horizon. Une vague \u00e9norme arrive, et certains zombies portent maintenant des seaux en m\u00e9tal !\", i5a: \"SUIVEZ LE DRAPEAU ! CERVEAAAUX !\", i5b: \"Seau sur la t\u00eate ! Tes pois ne me font rien !\",\n                i6n: \"Les morts-vivants deviennent plus malins ! Un lecteur grincheux se cache derri\u00e8re son journal et un athl\u00e8te saute par-dessus tes plantes. Les batailles se jouent d\u00e9sormais en phases !\", i6a: \"Touche pas \u00e0 mon journal !! \ud83d\udcf0\", i6b: \"Hop ! Par-dessus le mur ! \ud83c\udfc3\",\n                w5n: \"Cinq niveaux termin\u00e9s ! La rumeur court dans Voisinville : la r\u00e9sistance verte existe, et elle gagne !\", w5a: \"Toute la rue nous acclame ! \ud83c\udf3b\", w5b: \"Restez vigilants... quelque chose d'\u00c9NORME arrive.\",\n                i10n: \"Le sol se fend. Tra\u00eenant un poteau t\u00e9l\u00e9phonique, un petit Diablotin sur le dos, le puissant GARGANTUAR est arriv\u00e9 !\", i10a: \"\u00c9CRASER PETITES PLANTES !! \ud83d\udca5\", i10b: \"Lance-moi, mon grand ! Youhou !\", i10c: \"Oh oh... il va nous falloir plus de pois !\",\n                w10n: \"\u00c0 mi-chemin ! Le Gargantuar s'\u00e9croule sur la pelouse. Mais au loin, l'arm\u00e9e zombie rassemble ses derniers soldats...\", w10a: \"\u00c0 mi-chemin pour sauver Voisinville ! \ud83d\udcaa\", w10b: \"Le chef ne va PAS \u00eatre content...\",\n                i15n: \"La bataille fait rage. Tous les types de zombies ont rejoint la marche. Seuls les jardins les plus braves survivront !\", i15a: \"Que ce niveau fasse BOUM ! \ud83c\udf52\", i15b: \"TOUS ENSEMBLE ! \u00c0 L'ATTAQUE !\",\n                i20n: \"L'ULTIME COMBAT ! Toute l'arm\u00e9e des morts-vivants marche sur ta maison : Gargantuars, Diablotins et hordes innombrables. C'est le moment !\", i20a: \"CETTE PELOUSE EST \u00c0 NOUS !!\", i20b: \"Chaque rayon de soleil compte. Pour Voisinville ! \u2600\ufe0f\", i20c: \"Pas. Un. Pas. De plus !\",\n                w20n: \"VICTOIRE L\u00c9GENDAIRE ! Le dernier zombie tombe et la lumi\u00e8re dor\u00e9e revient sur Voisinville. Tu es le Gardien du Jardin !\", w20a: \"On a sauv\u00e9 le quartier ! \ud83c\udf3b\", w20b: \"Meilleur. Jardinier. DE TOUS LES TEMPS ! \ud83c\udfc6\", w20c: \"...jusqu'\u00e0 la prochaine pleine lune. \ud83d\ude09\",\n                l1n: \"Oh non ! Les zombies ont mang\u00e9 ton cerveau ! Mais chaque grand jardinier repousse plus fort...\", l1a: \"N'abandonne pas ! Essaie un autre plan ! \ud83c\udf31\", l1b: \"Mmm... cerveaaaux... \ud83e\udde0\" },\n            bn: { badge_intro: \"\u26a0\ufe0f \u09ac\u09bf\u09aa\u09a6 \u0986\u09b8\u099b\u09c7\", badge_mile: \"\u2b50 \u09ae\u09be\u0987\u09b2\u09ab\u09b2\u0995\", badge_final: \"\ud83d\udd25 \u099a\u09c2\u09a1\u09bc\u09be\u09a8\u09cd\u09a4 \u09af\u09c1\u09a6\u09cd\u09a7\", cont: \"\u099a\u09be\u09b2\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u09a8\", unl_q: \"\u09ae\u09be\u09b2\u09bf \u09b8\u09be\u09b9\u09c7\u09ac, \u09a6\u09be\u09af\u09bc\u09bf\u09a4\u09cd\u09ac\u09c7 \u09b9\u09be\u099c\u09bf\u09b0! \ud83c\udf31\", final_wave: \"\u099c\u09ae\u09cd\u09ac\u09bf\u09a6\u09c7\u09b0 \u098f\u0995 \u09ac\u09bf\u09b6\u09be\u09b2 \u09a2\u09c7\u0989 \u0986\u09b8\u099b\u09c7!\", mower: \"\u09b2\u09a8 \u09ae\u09cb\u09af\u09bc\u09be\u09b0 \u0989\u09a6\u09cd\u09a7\u09be\u09b0\u09c7 \u098f\u09b2!\",\n                w1n: \"\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09cd\u09b0\u09a5\u09ae \u099c\u09af\u09bc! \u099c\u09ae\u09cd\u09ac\u09bf\u09b0\u09be \u0997\u09cb\u0999\u09be\u09a4\u09c7 \u0997\u09cb\u0999\u09be\u09a4\u09c7 \u09b0\u09be\u09b8\u09cd\u09a4\u09be\u09af\u09bc \u09aa\u09bf\u099b\u09c1 \u09b9\u099f\u09b2... \u0995\u09bf\u09a8\u09cd\u09a4\u09c1 \u098f\u099f\u09be \u09a4\u09cb \u0995\u09c7\u09ac\u09b2 \u09b6\u09c1\u09b0\u09c1\u0964\", w1a: \"\u0986\u09ae\u09b0\u09be \u09aa\u09c7\u09b0\u09c7\u099b\u09bf! \u09aa\u09cd\u09b0\u09a5\u09ae \u099c\u09af\u09bc! \ud83c\udf89\", w1b: \"\u0986\u09ae\u09b0\u09be \u09ab\u09bf\u09b0\u09c7 \u0986\u09b8\u09ac... \u0995\u09cb\u09a8 \u09aa\u09b0\u09c7! \ud83e\udddf\",\n                i5n: \"\u09a6\u09bf\u0997\u09a8\u09cd\u09a4\u09c7 \u098f\u0995\u099f\u09bf \u099b\u09c7\u0981\u09a1\u09bc\u09be \u09aa\u09a4\u09be\u0995\u09be \u0989\u09a1\u09bc\u099b\u09c7\u0964 \u09ac\u09bf\u09b6\u09be\u09b2 \u098f\u0995 \u09a2\u09c7\u0989 \u0986\u09b8\u099b\u09c7, \u0986\u09b0 \u0995\u09bf\u099b\u09c1 \u099c\u09ae\u09cd\u09ac\u09bf \u098f\u0996\u09a8 \u09b2\u09cb\u09b9\u09be\u09b0 \u09ac\u09be\u09b2\u09a4\u09bf \u09aa\u09b0\u09c7!\", i5a: \"\u09aa\u09a4\u09be\u0995\u09be\u09b0 \u09aa\u09bf\u099b\u09a8\u09c7 \u099a\u09b2\u09cb! \u09ae\u0997\u099c\u099c\u099c!\", i5b: \"\u09ac\u09be\u09b2\u09a4\u09bf \u09aa\u09b0\u09c7 \u09a8\u09bf\u09af\u09bc\u09c7\u099b\u09bf! \u09a4\u09cb\u09ae\u09be\u09b0 \u09ae\u099f\u09b0 \u0986\u09ae\u09be\u09b0 \u0995\u09bf\u099b\u09c1 \u0995\u09b0\u09a4\u09c7 \u09aa\u09be\u09b0\u09ac\u09c7 \u09a8\u09be!\",\n                i6n: \"\u09ae\u09c3\u09a4\u09b0\u09be \u099a\u09be\u09b2\u09be\u0995 \u09b9\u099a\u09cd\u099b\u09c7! \u098f\u0995 \u09ac\u09a6\u09ae\u09c7\u099c\u09be\u099c\u09bf \u09aa\u09be\u09a0\u0995 \u0996\u09ac\u09b0\u09c7\u09b0 \u0995\u09be\u0997\u099c\u09c7\u09b0 \u0986\u09a1\u09bc\u09be\u09b2\u09c7 \u09b2\u09c1\u0995\u09be\u09af\u09bc, \u0986\u09b0 \u098f\u0995 \u0985\u09cd\u09af\u09be\u09a5\u09b2\u09bf\u099f \u0986\u09aa\u09a8\u09be\u09b0 \u0997\u09be\u099b\u09c7\u09b0 \u0989\u09aa\u09b0 \u09a6\u09bf\u09af\u09bc\u09c7 \u09b2\u09be\u09ab\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u09af\u09bc\u0964 \u098f\u0996\u09a8 \u09af\u09c1\u09a6\u09cd\u09a7 \u09b9\u09ac\u09c7 \u09a7\u09be\u09aa\u09c7 \u09a7\u09be\u09aa\u09c7!\", i6a: \"\u0986\u09ae\u09be\u09b0 \u0996\u09ac\u09b0\u09c7\u09b0 \u0995\u09be\u0997\u099c \u099b\u09c1\u0981\u09af\u09bc\u09cb \u09a8\u09be!! \ud83d\udcf0\", i6b: \"\u09b9\u09aa! \u09a6\u09c7\u09af\u09bc\u09be\u09b2\u09c7\u09b0 \u0989\u09aa\u09b0 \u09a6\u09bf\u09af\u09bc\u09c7! \ud83c\udfc3\",\n                w5n: \"\u09aa\u09be\u0981\u099a\u099f\u09bf \u09b2\u09c7\u09ad\u09c7\u09b2 \u09b6\u09c7\u09b7! \u09a8\u09c7\u0987\u09ac\u09be\u09b0\u09ad\u09bf\u09b2\u09c7 \u0996\u09ac\u09b0 \u099b\u09a1\u09bc\u09bf\u09af\u09bc\u09c7 \u09aa\u09a1\u09bc\u09c7\u099b\u09c7: \u09b8\u09ac\u09c1\u099c \u09aa\u09cd\u09b0\u09a4\u09bf\u09b0\u09cb\u09a7 \u09b8\u09a4\u09cd\u09af\u09bf, \u0986\u09b0 \u09a4\u09be\u09b0\u09be \u099c\u09bf\u09a4\u099b\u09c7!\", w5a: \"\u09aa\u09c1\u09b0\u09cb \u09b0\u09be\u09b8\u09cd\u09a4\u09be \u0986\u09ae\u09be\u09a6\u09c7\u09b0 \u099c\u09a8\u09cd\u09af \u0989\u09b2\u09cd\u09b2\u09be\u09b8 \u0995\u09b0\u099b\u09c7! \ud83c\udf3b\", w5b: \"\u09b8\u09a4\u09b0\u09cd\u0995 \u09a5\u09be\u0995\u09cb... \u09ac\u09bf\u09b6\u09be\u09b2 \u0995\u09bf\u099b\u09c1 \u0986\u09b8\u099b\u09c7\u0964\",\n                i10n: \"\u09ae\u09be\u099f\u09bf \u09ab\u09c7\u099f\u09c7 \u0997\u09c7\u09b2\u0964 \u099f\u09c7\u09b2\u09bf\u09ab\u09cb\u09a8\u09c7\u09b0 \u0996\u09c1\u0981\u099f\u09bf \u099f\u09c7\u09a8\u09c7, \u09aa\u09bf\u09a0\u09c7 \u099b\u09cb\u099f\u09cd\u099f \u0987\u09ae\u09cd\u09aa \u09a8\u09bf\u09af\u09bc\u09c7, \u09b6\u0995\u09cd\u09a4\u09bf\u09b6\u09be\u09b2\u09c0 \u0997\u09be\u09b0\u09cd\u0997\u09be\u09a8\u099f\u09c1\u09af\u09bc\u09be\u09b0 \u098f\u09b8\u09c7 \u09aa\u09a1\u09bc\u09c7\u099b\u09c7!\", i10a: \"\u09a6\u09c1\u09b0\u09cd\u09ac\u09b2 \u0997\u09be\u099b \u09aa\u09bf\u09b7\u09c7 \u09a6\u09be\u0993!! \ud83d\udca5\", i10b: \"\u0986\u09ae\u09be\u0995\u09c7 \u099b\u09c1\u09a1\u09bc\u09c7 \u09a6\u09be\u0993, \u09ac\u09a1\u09bc \u09ad\u09be\u0987! \u0987\u09af\u09bc\u09be\u09b9\u09c1!\", i10c: \"\u0993\u09b9... \u0986\u09ae\u09be\u09a6\u09c7\u09b0 \u0986\u09b0\u0993 \u09ae\u099f\u09b0 \u09b2\u09be\u0997\u09ac\u09c7!\",\n                w10n: \"\u0985\u09b0\u09cd\u09a7\u09c7\u0995 \u09aa\u09a5 \u09b6\u09c7\u09b7! \u0997\u09be\u09b0\u09cd\u0997\u09be\u09a8\u099f\u09c1\u09af\u09bc\u09be\u09b0 \u09b2\u09a8\u09c7 \u09a7\u09aa\u09be\u09b8 \u0995\u09b0\u09c7 \u09aa\u09a1\u09bc\u09b2\u0964 \u0995\u09bf\u09a8\u09cd\u09a4\u09c1 \u09a6\u09c2\u09b0\u09c7, \u099c\u09ae\u09cd\u09ac\u09bf \u09ac\u09be\u09b9\u09bf\u09a8\u09c0 \u09a4\u09be\u09a6\u09c7\u09b0 \u09b6\u09c7\u09b7 \u09b8\u09c8\u09a8\u09cd\u09af\u099f\u09bf\u0995\u09c7\u0993 \u099c\u09a1\u09bc\u09cb \u0995\u09b0\u099b\u09c7...\", w10a: \"\u09a8\u09c7\u0987\u09ac\u09be\u09b0\u09ad\u09bf\u09b2 \u09ac\u09be\u0981\u099a\u09be\u09a8\u09cb\u09b0 \u0985\u09b0\u09cd\u09a7\u09c7\u0995 \u09aa\u09a5 \u09b6\u09c7\u09b7! \ud83d\udcaa\", w10b: \"\u09ac\u09b8 \u098f\u0995\u09a6\u09ae \u0996\u09c1\u09b6\u09bf \u09b9\u09ac\u09c7 \u09a8\u09be...\",\n                i15n: \"\u09af\u09c1\u09a6\u09cd\u09a7 \u09a4\u09c0\u09ac\u09cd\u09b0 \u09b9\u099a\u09cd\u099b\u09c7\u0964 \u09b8\u09ac \u09a7\u09b0\u09a8\u09c7\u09b0 \u099c\u09ae\u09cd\u09ac\u09bf \u09ae\u09bf\u099b\u09bf\u09b2\u09c7 \u09af\u09cb\u0997 \u09a6\u09bf\u09af\u09bc\u09c7\u099b\u09c7\u0964 \u0995\u09c7\u09ac\u09b2 \u09b8\u09ac\u099a\u09c7\u09af\u09bc\u09c7 \u09b8\u09be\u09b9\u09b8\u09c0 \u09ac\u09be\u0997\u09be\u09a8\u0987 \u099f\u09bf\u0995\u09c7 \u09a5\u09be\u0995\u09ac\u09c7!\", i15a: \"\u098f\u09ac\u09be\u09b0 \u098f\u0995\u099f\u09be \u09ac\u09bf\u09b8\u09cd\u09ab\u09cb\u09b0\u09a3 \u09b9\u09cb\u0995! \ud83c\udf52\", i15b: \"\u09b8\u09ac\u09be\u0987 \u098f\u0995\u09b8\u09be\u09a5\u09c7! \u0986\u0995\u09cd\u09b0\u09ae\u09a3!\",\n                i20n: \"\u099a\u09c2\u09a1\u09bc\u09be\u09a8\u09cd\u09a4 \u09b2\u09a1\u09bc\u09be\u0987! \u09aa\u09c1\u09b0\u09cb \u09ae\u09c3\u09a4 \u09ac\u09be\u09b9\u09bf\u09a8\u09c0 \u0986\u09aa\u09a8\u09be\u09b0 \u09ac\u09be\u09a1\u09bc\u09bf\u09b0 \u09a6\u09bf\u0995\u09c7 \u098f\u0997\u09cb\u099a\u09cd\u099b\u09c7: \u0997\u09be\u09b0\u09cd\u0997\u09be\u09a8\u099f\u09c1\u09af\u09bc\u09be\u09b0, \u0987\u09ae\u09cd\u09aa \u0986\u09b0 \u0985\u0997\u09a3\u09bf\u09a4 \u09a6\u09b2\u0964 \u098f\u099f\u09be\u0987 \u09b8\u09c7\u0987 \u09ae\u09c1\u09b9\u09c2\u09b0\u09cd\u09a4!\", i20a: \"\u098f\u0987 \u09b2\u09a8 \u0986\u09ae\u09be\u09a6\u09c7\u09b0!!\", i20b: \"\u09aa\u09cd\u09b0\u09a4\u09bf\u099f\u09bf \u09b0\u09cb\u09a6\u09c7\u09b0 \u0995\u09a3\u09be \u0997\u09c1\u09b0\u09c1\u09a4\u09cd\u09ac\u09aa\u09c2\u09b0\u09cd\u09a3\u0964 \u09a8\u09c7\u0987\u09ac\u09be\u09b0\u09ad\u09bf\u09b2\u09c7\u09b0 \u099c\u09a8\u09cd\u09af! \u2600\ufe0f\", i20c: \"\u0986\u09b0\u0964 \u098f\u0995\u0964 \u09aa\u09be\u0964 \u0993 \u09a8\u09be!\",\n                w20n: \"\u0995\u09bf\u0982\u09ac\u09a6\u09a8\u09cd\u09a4\u09bf \u099c\u09af\u09bc! \u09b6\u09c7\u09b7 \u099c\u09ae\u09cd\u09ac\u09bf\u099f\u09bf \u09aa\u09a1\u09bc\u09c7 \u0997\u09c7\u09b2 \u0986\u09b0 \u09a8\u09c7\u0987\u09ac\u09be\u09b0\u09ad\u09bf\u09b2\u09c7 \u09b8\u09cb\u09a8\u09be\u09b2\u09bf \u09b0\u09cb\u09a6 \u09ab\u09bf\u09b0\u09c7 \u098f\u09b2\u0964 \u0986\u09aa\u09a8\u09bf\u0987 \u09ac\u09be\u0997\u09be\u09a8\u09c7\u09b0 \u09b0\u0995\u09cd\u09b7\u0995!\", w20a: \"\u0986\u09ae\u09b0\u09be \u09aa\u09be\u09a1\u09bc\u09be \u09ac\u09be\u0981\u099a\u09bf\u09af\u09bc\u09c7\u099b\u09bf! \ud83c\udf3b\", w20b: \"\u09b8\u09b0\u09cd\u09ac\u0995\u09be\u09b2\u09c7\u09b0\u0964 \u09b8\u09c7\u09b0\u09be\u0964 \u09ae\u09be\u09b2\u09bf! \ud83c\udfc6\", w20c: \"...\u09aa\u09b0\u09c7\u09b0 \u09aa\u09c2\u09b0\u09cd\u09a3\u09bf\u09ae\u09be \u09aa\u09b0\u09cd\u09af\u09a8\u09cd\u09a4\u0964 \ud83d\ude09\",\n                l1n: \"\u0993\u09b9 \u09a8\u09be! \u099c\u09ae\u09cd\u09ac\u09bf\u09b0\u09be \u0986\u09aa\u09a8\u09be\u09b0 \u09ae\u0997\u099c \u0996\u09c7\u09af\u09bc\u09c7 \u09ab\u09c7\u09b2\u09c7\u099b\u09c7! \u0995\u09bf\u09a8\u09cd\u09a4\u09c1 \u09aa\u09cd\u09b0\u09a4\u09cd\u09af\u09c7\u0995 \u09ae\u09b9\u09be\u09a8 \u09ae\u09be\u09b2\u09bf \u0986\u09b0\u0993 \u09b6\u0995\u09cd\u09a4\u09bf\u09b6\u09be\u09b2\u09c0 \u09b9\u09af\u09bc\u09c7 \u09ab\u09bf\u09b0\u09c7 \u0986\u09b8\u09c7...\", l1a: \"\u09b9\u09be\u09b2 \u099b\u09c7\u09a1\u09bc\u09cb \u09a8\u09be! \u09a8\u09a4\u09c1\u09a8 \u09aa\u09b0\u09bf\u0995\u09b2\u09cd\u09aa\u09a8\u09be \u0995\u09b0\u09cb! \ud83c\udf31\", l1b: \"\u09ae\u09ae\u09ae... \u09ae\u0997\u099c\u099c\u099c... \ud83e\udde0\" },\n            pt: { badge_intro: \"\u26a0\ufe0f AMEA\u00c7A A CAMINHO\", badge_mile: \"\u2b50 CONQUISTA\", badge_final: \"\ud83d\udd25 BATALHA FINAL\", cont: \"CONTINUAR\", unl_q: \"Pronto para o servi\u00e7o, jardineiro! \ud83c\udf31\", final_wave: \"UMA ENORME ONDA DE ZUMBIS EST\u00c1 CHEGANDO!\", mower: \"CORTADOR DE GRAMA AO RESGATE!\",\n                w1n: \"Sua primeira vit\u00f3ria! Os zumbis voltam cambaleando pela rua, gemendo... mas isso era s\u00f3 o come\u00e7o.\", w1a: \"Conseguimos! Primeira vit\u00f3ria! \ud83c\udf89\", w1b: \"N\u00f3s voltaremos... com CONES! \ud83e\udddf\",\n                i5n: \"Uma bandeira rasgada tremula no horizonte. Uma onda enorme est\u00e1 vindo, e alguns zumbis agora usam baldes de metal!\", i5a: \"SIGAM A BANDEIRA! C\u00c9REBROOOS!\", i5b: \"Balde na cabe\u00e7a! Suas ervilhas n\u00e3o me machucam!\",\n                i6n: \"Os mortos-vivos est\u00e3o mais espertos! Um leitor ranzinza se esconde atr\u00e1s do jornal e um atleta salta por cima das suas plantas. Agora as batalhas t\u00eam fases!\", i6a: \"N\u00e3o toque no meu jornal!! \ud83d\udcf0\", i6b: \"Hup! Por cima do muro! \ud83c\udfc3\",\n                w5n: \"Cinco fases conclu\u00eddas! A not\u00edcia se espalha por Vizinh\u00f3polis: a resist\u00eancia verde \u00e9 real, e est\u00e1 vencendo!\", w5a: \"A rua inteira est\u00e1 torcendo por n\u00f3s! \ud83c\udf3b\", w5b: \"Fiquem atentos... algo GRANDE est\u00e1 vindo.\",\n                i10n: \"O ch\u00e3o se abre. Arrastando um poste e com um pequeno Diabrete nas costas, o poderoso GIGANTE chegou!\", i10a: \"ESMAGAR PLANTINHAS!! \ud83d\udca5\", i10b: \"Me joga, grand\u00e3o! Uhuuul!\", i10c: \"Ih... vamos precisar de mais ervilhas!\",\n                w10n: \"Metade do caminho! O Gigante desaba no gramado. Mas ao longe, o ex\u00e9rcito zumbi re\u00fane seu \u00faltimo soldado...\", w10a: \"Metade do caminho para salvar Vizinh\u00f3polis! \ud83d\udcaa\", w10b: \"O chefe N\u00c3O vai gostar disso...\",\n                i15n: \"A batalha continua. Todo tipo de zumbi entrou na marcha. S\u00f3 os jardins mais corajosos v\u00e3o sobreviver!\", i15a: \"Vamos fazer essa fase ir pelos ares! \ud83c\udf52\", i15b: \"TODOS JUNTOS! AO ATAQUE!\",\n                i20n: \"A BATALHA FINAL! Todo o ex\u00e9rcito morto-vivo marcha at\u00e9 sua casa: Gigantes, Diabretes e hordas sem fim. \u00c9 agora!\", i20a: \"ESTE GRAMADO \u00c9 NOSSO!!\", i20b: \"Cada raio de sol conta. Por Vizinh\u00f3polis! \u2600\ufe0f\", i20c: \"Nem. Um. Passo. A mais!\",\n                w20n: \"VIT\u00d3RIA LEND\u00c1RIA! O \u00faltimo zumbi cai e a luz dourada volta a Vizinh\u00f3polis. Voc\u00ea \u00e9 o Guardi\u00e3o do Jardim!\", w20a: \"Salvamos o bairro! \ud83c\udf3b\", w20b: \"Melhor. Jardineiro. DE TODOS! \ud83c\udfc6\", w20c: \"...at\u00e9 a pr\u00f3xima lua cheia. \ud83d\ude09\",\n                l1n: \"Ah, n\u00e3o! Os zumbis comeram seu c\u00e9rebro! Mas todo grande jardineiro volta a crescer mais forte...\", l1a: \"N\u00e3o desista! Tente um novo plano! \ud83c\udf31\", l1b: \"Hmm... c\u00e9rebrooos... \ud83e\udde0\" },\n            ru: { badge_intro: \"\u26a0\ufe0f \u0423\u0413\u0420\u041e\u0417\u0410 \u0411\u041b\u0418\u0417\u041a\u041e\", badge_mile: \"\u2b50 \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u0415\", badge_final: \"\ud83d\udd25 \u0424\u0418\u041d\u0410\u041b\u042c\u041d\u0410\u042f \u0411\u0418\u0422\u0412\u0410\", cont: \"\u041f\u0420\u041e\u0414\u041e\u041b\u0416\u0418\u0422\u042c\", unl_q: \"\u041f\u0440\u0438\u0431\u044b\u043b \u043d\u0430 \u0441\u043b\u0443\u0436\u0431\u0443, \u0441\u0430\u0434\u043e\u0432\u043d\u0438\u043a! \ud83c\udf31\", final_wave: \"\u041f\u0420\u0418\u0411\u041b\u0418\u0416\u0410\u0415\u0422\u0421\u042f \u041e\u0413\u0420\u041e\u041c\u041d\u0410\u042f \u0412\u041e\u041b\u041d\u0410 \u0417\u041e\u041c\u0411\u0418!\", mower: \"\u0413\u0410\u0417\u041e\u041d\u041e\u041a\u041e\u0421\u0418\u041b\u041a\u0410 \u0421\u041f\u0415\u0428\u0418\u0422 \u041d\u0410 \u041f\u041e\u041c\u041e\u0429\u042c!\",\n                w1n: \"\u0422\u0432\u043e\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u043f\u043e\u0431\u0435\u0434\u0430! \u0417\u043e\u043c\u0431\u0438, \u0441\u0442\u0435\u043d\u0430\u044f, \u043a\u043e\u0432\u044b\u043b\u044f\u044e\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 \u0443\u043b\u0438\u0446\u0443... \u043d\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0430\u043b\u043e.\", w1a: \"\u041c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e! \u041f\u0435\u0440\u0432\u0430\u044f \u043f\u043e\u0431\u0435\u0434\u0430! \ud83c\udf89\", w1b: \"\u041c\u044b \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f... \u0441 \u041a\u041e\u041d\u0423\u0421\u0410\u041c\u0418! \ud83e\udddf\",\n                i5n: \"\u041d\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0435 \u0440\u0430\u0437\u0432\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0432\u0430\u043d\u044b\u0439 \u0444\u043b\u0430\u0433. \u0418\u0434\u0451\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u0430\u044f \u0432\u043e\u043b\u043d\u0430, \u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u043e\u043c\u0431\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u043e\u0441\u044f\u0442 \u0436\u0435\u043b\u0435\u0437\u043d\u044b\u0435 \u0432\u0451\u0434\u0440\u0430!\", i5a: \"\u0417\u0410 \u0424\u041b\u0410\u0413\u041e\u041c! \u041c\u041e\u041e\u041e\u0417\u0413\u0418!\", i5b: \"\u0412\u0435\u0434\u0440\u043e \u043d\u0430\u0434\u0435\u0442\u043e! \u0422\u0432\u043e\u0439 \u0433\u043e\u0440\u043e\u0445 \u043c\u043d\u0435 \u043d\u0435 \u0441\u0442\u0440\u0430\u0448\u0435\u043d!\",\n                i6n: \"\u041c\u0435\u0440\u0442\u0432\u0435\u0446\u044b \u0443\u043c\u043d\u0435\u044e\u0442! \u0412\u043e\u0440\u0447\u043b\u0438\u0432\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u044f\u0447\u0435\u0442\u0441\u044f \u0437\u0430 \u0433\u0430\u0437\u0435\u0442\u043e\u0439, \u0430 \u0430\u0442\u043b\u0435\u0442 \u043f\u0435\u0440\u0435\u043f\u0440\u044b\u0433\u0438\u0432\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u0442\u0432\u043e\u0438 \u0440\u0430\u0441\u0442\u0435\u043d\u0438\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u0431\u0438\u0442\u0432\u044b \u0438\u0434\u0443\u0442 \u043f\u043e \u0444\u0430\u0437\u0430\u043c!\", i6a: \"\u041d\u0435 \u0442\u0440\u043e\u0433\u0430\u0439 \u043c\u043e\u044e \u0433\u0430\u0437\u0435\u0442\u0443!! \ud83d\udcf0\", i6b: \"\u0425\u043e\u043f! \u0427\u0435\u0440\u0435\u0437 \u0441\u0442\u0435\u043d\u0443! \ud83c\udfc3\",\n                w5n: \"\u041f\u044f\u0442\u044c \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043e! \u041f\u043e \u0421\u043e\u0441\u0435\u0434\u0432\u0438\u043b\u043b\u044e \u0440\u0430\u0437\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0432\u0435\u0441\u0442\u044c: \u0437\u0435\u043b\u0451\u043d\u043e\u0435 \u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0438 \u043e\u043d\u043e \u043f\u043e\u0431\u0435\u0436\u0434\u0430\u0435\u0442!\", w5a: \"\u0412\u0441\u044f \u0443\u043b\u0438\u0446\u0430 \u0431\u043e\u043b\u0435\u0435\u0442 \u0437\u0430 \u043d\u0430\u0441! \ud83c\udf3b\", w5b: \"\u0411\u0443\u0434\u044c\u0442\u0435 \u043d\u0430\u0447\u0435\u043a\u0443... \u0433\u0440\u044f\u0434\u0451\u0442 \u043d\u0435\u0447\u0442\u043e \u041e\u0413\u0420\u041e\u041c\u041d\u041e\u0415.\",\n                i10n: \"\u0417\u0435\u043c\u043b\u044f \u0442\u0440\u0435\u0441\u043a\u0430\u0435\u0442\u0441\u044f. \u0412\u043e\u043b\u043e\u0447\u0430 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u0444\u043d\u044b\u0439 \u0441\u0442\u043e\u043b\u0431 \u0438 \u043d\u0435\u0441\u044f \u043d\u0430 \u0441\u043f\u0438\u043d\u0435 \u043a\u0440\u043e\u0448\u0435\u0447\u043d\u043e\u0433\u043e \u0418\u043c\u043f\u0430, \u044f\u0432\u0438\u043b\u0441\u044f \u043c\u043e\u0433\u0443\u0447\u0438\u0439 \u0413\u0410\u0420\u0413\u0410\u041d\u0422\u042e\u0410!\", i10a: \"\u041a\u0420\u0423\u0428\u0418\u0422\u042c \u0425\u0418\u041b\u042b\u0415 \u0420\u0410\u0421\u0422\u0415\u041d\u0418\u042f!! \ud83d\udca5\", i10b: \"\u0411\u0440\u043e\u0441\u0430\u0439 \u043c\u0435\u043d\u044f, \u0437\u0434\u043e\u0440\u043e\u0432\u044f\u043a! \u0423\u0440\u0430-\u0430!\", i10c: \"\u041e\u0439-\u043e\u0439... \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0440\u043e\u0445\u0430!\",\n                w10n: \"\u041f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043f\u0443\u0442\u0438! \u0413\u0430\u0440\u0433\u0430\u043d\u0442\u044e\u0430 \u0440\u0443\u0448\u0438\u0442\u0441\u044f \u043d\u0430 \u0433\u0430\u0437\u043e\u043d. \u041d\u043e \u0432\u0434\u0430\u043b\u0438 \u0430\u0440\u043c\u0438\u044f \u0437\u043e\u043c\u0431\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0441\u043e\u043b\u0434\u0430\u0442...\", w10a: \"\u041f\u043e\u043b\u043f\u0443\u0442\u0438 \u0434\u043e \u0441\u043f\u0430\u0441\u0435\u043d\u0438\u044f \u0421\u043e\u0441\u0435\u0434\u0432\u0438\u043b\u043b\u044f! \ud83d\udcaa\", w10b: \"\u0411\u043e\u0441\u0441 \u0431\u0443\u0434\u0435\u0442 \u041d\u0415 \u0432 \u0432\u043e\u0441\u0442\u043e\u0440\u0433\u0435...\",\n                i15n: \"\u0411\u0438\u0442\u0432\u0430 \u0440\u0430\u0437\u0433\u043e\u0440\u0430\u0435\u0442\u0441\u044f. \u0412\u0441\u0435 \u0432\u0438\u0434\u044b \u0437\u043e\u043c\u0431\u0438 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043b\u0438\u0441\u044c \u043a \u043c\u0430\u0440\u0448\u0443. \u0412\u044b\u0436\u0438\u0432\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u044b\u0435 \u0441\u043c\u0435\u043b\u044b\u0435 \u0441\u0430\u0434\u044b!\", i15a: \"\u041f\u0443\u0441\u0442\u044c \u044d\u0442\u043e\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u0437\u043e\u0440\u0432\u0451\u0442\u0441\u044f! \ud83c\udf52\", i15b: \"\u0412\u0421\u0415 \u0412\u041c\u0415\u0421\u0422\u0415! \u0412 \u0410\u0422\u0410\u041a\u0423!\",\n                i20n: \"\u041f\u041e\u0421\u041b\u0415\u0414\u041d\u0418\u0419 \u0420\u0423\u0411\u0415\u0416! \u0412\u0441\u044f \u0430\u0440\u043c\u0438\u044f \u043d\u0435\u0436\u0438\u0442\u0438 \u0438\u0434\u0451\u0442 \u043d\u0430 \u0442\u0432\u043e\u0439 \u0434\u043e\u043c: \u0413\u0430\u0440\u0433\u0430\u043d\u0442\u044e\u0430, \u0418\u043c\u043f\u044b \u0438 \u0431\u0435\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043e\u0440\u0434\u044b. \u0412\u043e\u0442 \u043e\u043d\u043e!\", i20a: \"\u042d\u0422\u041e\u0422 \u0413\u0410\u0417\u041e\u041d \u041d\u0410\u0428!!\", i20b: \"\u041a\u0430\u0436\u0434\u044b\u0439 \u043b\u0443\u0447 \u0441\u043e\u043b\u043d\u0446\u0430 \u043d\u0430 \u0441\u0447\u0435\u0442\u0443. \u0417\u0430 \u0421\u043e\u0441\u0435\u0434\u0432\u0438\u043b\u043b\u044c! \u2600\ufe0f\", i20c: \"\u041d\u0438. \u0428\u0430\u0433\u0443. \u0414\u0430\u043b\u044c\u0448\u0435!\",\n                w20n: \"\u041b\u0415\u0413\u0415\u041d\u0414\u0410\u0420\u041d\u0410\u042f \u041f\u041e\u0411\u0415\u0414\u0410! \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0437\u043e\u043c\u0431\u0438 \u043f\u0430\u043b, \u0438 \u0437\u043e\u043b\u043e\u0442\u043e\u0439 \u0441\u0432\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f \u0432 \u0421\u043e\u0441\u0435\u0434\u0432\u0438\u043b\u043b\u044c. \u0422\u044b \u2014 \u0425\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u044c \u0421\u0430\u0434\u0430!\", w20a: \"\u041c\u044b \u0441\u043f\u0430\u0441\u043b\u0438 \u0440\u0430\u0439\u043e\u043d! \ud83c\udf3b\", w20b: \"\u041b\u0443\u0447\u0448\u0438\u0439. \u0421\u0430\u0434\u043e\u0432\u043d\u0438\u043a. \u0412\u0421\u0415\u0425 \u0412\u0420\u0415\u041c\u0401\u041d! \ud83c\udfc6\", w20c: \"...\u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u043b\u0443\u043d\u0438\u044f. \ud83d\ude09\",\n                l1n: \"\u041e \u043d\u0435\u0442! \u0417\u043e\u043c\u0431\u0438 \u0441\u044a\u0435\u043b\u0438 \u0442\u0432\u043e\u0439 \u043c\u043e\u0437\u0433! \u041d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0435\u043b\u0438\u043a\u0438\u0439 \u0441\u0430\u0434\u043e\u0432\u043d\u0438\u043a \u0432\u044b\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u0441\u043d\u043e\u0432\u0430, \u0435\u0449\u0451 \u0441\u0438\u043b\u044c\u043d\u0435\u0435...\", l1a: \"\u041d\u0435 \u0441\u0434\u0430\u0432\u0430\u0439\u0441\u044f! \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439 \u043d\u043e\u0432\u044b\u0439 \u043f\u043b\u0430\u043d! \ud83c\udf31\", l1b: \"\u041c\u043c\u043c... \u043c\u043e\u043e\u043e\u0437\u0433\u0438... \ud83e\udde0\" },\n            id: { badge_intro: \"\u26a0\ufe0f ANCAMAN DATANG\", badge_mile: \"\u2b50 PENCAPAIAN\", badge_final: \"\ud83d\udd25 PERTEMPURAN TERAKHIR\", cont: \"LANJUTKAN\", unl_q: \"Siap bertugas, Tukang Kebun! \ud83c\udf31\", final_wave: \"GELOMBANG ZOMBI RAKSASA MENDEKAT!\", mower: \"MESIN PEMOTONG RUMPUT DATANG MENOLONG!\",\n                w1n: \"Kemenangan pertamamu! Para zombi mundur terhuyung-huyung sambil mengerang... tapi ini baru permulaan.\", w1a: \"Kita berhasil! Kemenangan pertama! \ud83c\udf89\", w1b: \"Kami akan kembali... pakai KERUCUT! \ud83e\udddf\",\n                i5n: \"Sebuah bendera robek berkibar di cakrawala. Gelombang besar datang, dan beberapa zombi kini memakai ember besi!\", i5a: \"IKUTI BENDERA! OTAAAK!\", i5b: \"Ember terpasang! Kacangmu tak mempan!\",\n                i6n: \"Mayat hidup makin pintar! Pembaca pemarah bersembunyi di balik korannya, dan atlet melompati tanamanmu. Pertempuran kini berlangsung dalam fase!\", i6a: \"Jangan sentuh koranku!! \ud83d\udcf0\", i6b: \"Hup! Lompati tembok! \ud83c\udfc3\",\n                w5n: \"Lima level selesai! Kabar menyebar di Neighborville: perlawanan hijau itu nyata, dan sedang menang!\", w5a: \"Seluruh jalan bersorak untuk kita! \ud83c\udf3b\", w5b: \"Tetap waspada... sesuatu yang BESAR akan datang.\",\n                i10n: \"Tanah retak. Menyeret tiang telepon dengan Imp kecil di punggungnya, GARGANTUAR perkasa telah tiba!\", i10a: \"HANCURKAN TANAMAN LEMAH!! \ud83d\udca5\", i10b: \"Lempar aku, bos besar! Yuhuu!\", i10c: \"Waduh... kita butuh lebih banyak kacang!\",\n                w10n: \"Setengah jalan! Gargantuar ambruk di halaman. Tapi di kejauhan, pasukan zombi mengumpulkan prajurit terakhirnya...\", w10a: \"Setengah jalan menyelamatkan Neighborville! \ud83d\udcaa\", w10b: \"Bos TIDAK akan senang...\",\n                i15n: \"Pertempuran makin sengit. Semua jenis zombi ikut berbaris. Hanya kebun paling berani yang akan bertahan!\", i15a: \"Ayo bikin level ini meledak! \ud83c\udf52\", i15b: \"SEMUANYA BERSAMA! SERBUUU!\",\n                i20n: \"PERTARUNGAN TERAKHIR! Seluruh pasukan mayat hidup berbaris ke rumahmu: Gargantuar, Imp, dan gerombolan tak terhitung. Inilah saatnya!\", i20a: \"HALAMAN INI MILIK KAMI!!\", i20b: \"Setiap sinar matahari berarti. Demi Neighborville! \u2600\ufe0f\", i20c: \"Tidak. Satu. Langkah. Lagi!\",\n                w20n: \"KEMENANGAN LEGENDARIS! Zombi terakhir tumbang dan cahaya emas kembali ke Neighborville. Kamulah Penjaga Kebun!\", w20a: \"Kita menyelamatkan lingkungan! \ud83c\udf3b\", w20b: \"Tukang. Kebun. TERBAIK! \ud83c\udfc6\", w20c: \"...sampai bulan purnama berikutnya. \ud83d\ude09\",\n                l1n: \"Oh tidak! Zombi memakan otakmu! Tapi setiap tukang kebun hebat tumbuh kembali lebih kuat...\", l1a: \"Jangan menyerah! Coba rencana baru! \ud83c\udf31\", l1b: \"Mmm... otaaak... \ud83e\udde0\" },\n            ur: { badge_intro: \"\u26a0\ufe0f \u062e\u0637\u0631\u06c1 \u0622 \u0631\u06c1\u0627 \u06c1\u06d2\", badge_mile: \"\u2b50 \u0633\u0646\u06af \u0645\u06cc\u0644\", badge_final: \"\ud83d\udd25 \u0622\u062e\u0631\u06cc \u062c\u0646\u06af\", cont: \"\u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u06cc\u06ba\", unl_q: \"\u0645\u0627\u0644\u06cc \u0635\u0627\u062d\u0628\u060c \u0688\u06cc\u0648\u0679\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u062d\u0627\u0636\u0631! \ud83c\udf31\", final_wave: \"\u0632\u0648\u0645\u0628\u06cc\u0632 \u06a9\u06cc \u0627\u06cc\u06a9 \u0628\u06c1\u062a \u0628\u0691\u06cc \u0644\u06c1\u0631 \u0622 \u0631\u06c1\u06cc \u06c1\u06d2!\", mower: \"\u0644\u0627\u0646 \u0645\u0648\u0648\u0631 \u0628\u0686\u0627\u0646\u06d2 \u0622 \u06af\u06cc\u0627!\",\n                w1n: \"\u0622\u067e \u06a9\u06cc \u067e\u06c1\u0644\u06cc \u0641\u062a\u062d! \u0632\u0648\u0645\u0628\u06cc\u0632 \u06a9\u0631\u0627\u06c1\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u06af\u0644\u06cc \u0645\u06cc\u06ba \u0648\u0627\u067e\u0633 \u0644\u0691\u06a9\u06be\u0691\u0627 \u06af\u0626\u06d2... \u0645\u06af\u0631 \u06cc\u06c1 \u062a\u0648 \u0628\u0633 \u0622\u063a\u0627\u0632 \u062a\u06be\u0627\u06d4\", w1a: \"\u06c1\u0645 \u0646\u06d2 \u06a9\u0631 \u062f\u06a9\u06be\u0627\u06cc\u0627! \u067e\u06c1\u0644\u06cc \u062c\u06cc\u062a! \ud83c\udf89\", w1b: \"\u06c1\u0645 \u0648\u0627\u067e\u0633 \u0622\u0626\u06cc\u06ba \u06af\u06d2... \u06a9\u0648\u0646 \u067e\u06c1\u0646 \u06a9\u0631! \ud83e\udddf\",\n                i5n: \"\u0627\u0641\u0642 \u067e\u0631 \u0627\u06cc\u06a9 \u067e\u06be\u0679\u0627 \u062c\u06be\u0646\u0688\u0627 \u0644\u06c1\u0631\u0627 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0628\u0691\u06cc \u0644\u06c1\u0631 \u0622 \u0631\u06c1\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u06a9\u0686\u06be \u0632\u0648\u0645\u0628\u06cc\u0632 \u0627\u0628 \u0644\u0648\u06c1\u06d2 \u06a9\u06cc \u0628\u0627\u0644\u0679\u06cc\u0627\u06ba \u067e\u06c1\u0646\u062a\u06d2 \u06c1\u06cc\u06ba!\", i5a: \"\u062c\u06be\u0646\u0688\u06d2 \u06a9\u06d2 \u067e\u06cc\u0686\u06be\u06d2 \u0686\u0644\u0648! \u062f\u0645\u0627\u0627\u0627\u063a!\", i5b: \"\u0628\u0627\u0644\u0679\u06cc \u067e\u06c1\u0646 \u0644\u06cc! \u062a\u0645\u06c1\u0627\u0631\u06d2 \u0645\u0679\u0631 \u0645\u06cc\u0631\u0627 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u0628\u06af\u0627\u0691 \u0633\u06a9\u062a\u06d2!\",\n                i6n: \"\u0645\u0631\u062f\u06d2 \u0686\u0627\u0644\u0627\u06a9 \u06c1\u0648 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba! \u0627\u06cc\u06a9 \u0686\u0691\u0686\u0691\u0627 \u0642\u0627\u0631\u06cc \u0627\u062e\u0628\u0627\u0631 \u06a9\u06d2 \u067e\u06cc\u0686\u06be\u06d2 \u0686\u06be\u067e\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u06a9\u06be\u0644\u0627\u0691\u06cc \u0622\u067e \u06a9\u06d2 \u067e\u0648\u062f\u0648\u06ba \u06a9\u06d2 \u0627\u0648\u067e\u0631 \u0633\u06d2 \u06a9\u0648\u062f \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0628 \u0644\u0691\u0627\u0626\u06cc\u0627\u06ba \u0645\u0631\u062d\u0644\u0648\u06ba \u0645\u06cc\u06ba \u06c1\u0648\u06ba \u06af\u06cc!\", i6a: \"\u0645\u06cc\u0631\u06d2 \u0627\u062e\u0628\u0627\u0631 \u06a9\u0648 \u06c1\u0627\u062a\u06be \u0645\u062a \u0644\u06af\u0627\u0646\u0627!! \ud83d\udcf0\", i6b: \"\u06c1\u067e! \u062f\u06cc\u0648\u0627\u0631 \u06a9\u06d2 \u0627\u0648\u067e\u0631 \u0633\u06d2! \ud83c\udfc3\",\n                w5n: \"\u067e\u0627\u0646\u0686 \u0644\u06cc\u0648\u0644 \u0645\u06a9\u0645\u0644! \u0646\u06cc\u0628\u0631\u0648\u06cc\u0644 \u0645\u06cc\u06ba \u062e\u0628\u0631 \u067e\u06be\u06cc\u0644 \u06af\u0626\u06cc: \u0633\u0628\u0632 \u0645\u0632\u0627\u062d\u0645\u062a \u062d\u0642\u06cc\u0642\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062c\u06cc\u062a \u0631\u06c1\u06cc \u06c1\u06d2!\", w5a: \"\u067e\u0648\u0631\u06cc \u06af\u0644\u06cc \u06c1\u0645\u0627\u0631\u06d2 \u0644\u06cc\u06d2 \u0646\u0639\u0631\u06d2 \u0644\u06af\u0627 \u0631\u06c1\u06cc \u06c1\u06d2! \ud83c\udf3b\", w5b: \"\u06c1\u0648\u0634\u06cc\u0627\u0631 \u0631\u06c1\u0648... \u06a9\u0686\u06be \u0628\u06c1\u062a \u0628\u0691\u0627 \u0622 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4\",\n                i10n: \"\u0632\u0645\u06cc\u0646 \u067e\u06be\u0679 \u06af\u0626\u06cc\u06d4 \u0679\u06cc\u0644\u06cc\u0641\u0648\u0646 \u06a9\u0627 \u06a9\u06be\u0645\u0628\u0627 \u06af\u06be\u0633\u06cc\u0679\u062a\u06d2 \u06c1\u0648\u0626\u06d2\u060c \u067e\u06cc\u0679\u06be \u067e\u0631 \u0646\u0646\u06be\u06d2 \u0627\u0645\u067e \u06a9\u06d2 \u0633\u0627\u062a\u06be\u060c \u0637\u0627\u0642\u062a\u0648\u0631 \u06af\u0627\u0631\u06af\u06cc\u0646\u0679\u0648\u0627\u0631 \u0622 \u067e\u06c1\u0646\u0686\u0627!\", i10a: \"\u06a9\u0645\u0632\u0648\u0631 \u067e\u0648\u062f\u0648\u06ba \u06a9\u0648 \u06a9\u0686\u0644 \u062f\u0648!! \ud83d\udca5\", i10b: \"\u0645\u062c\u06be\u06d2 \u067e\u06be\u06cc\u0646\u06a9\u0648\u060c \u0628\u0691\u06d2 \u0628\u06be\u0627\u0626\u06cc! \u0648\u0627\u06c1!\", i10c: \"\u0627\u0648\u06c1... \u06c1\u0645\u06cc\u06ba \u0645\u0632\u06cc\u062f \u0645\u0679\u0631 \u0686\u0627\u06c1\u0626\u06cc\u06ba!\",\n                w10n: \"\u0622\u062f\u06be\u0627 \u0633\u0641\u0631 \u0645\u06a9\u0645\u0644! \u06af\u0627\u0631\u06af\u06cc\u0646\u0679\u0648\u0627\u0631 \u0644\u0627\u0646 \u067e\u0631 \u062f\u06be\u0691\u0627\u0645 \u0633\u06d2 \u06af\u0631\u0627\u06d4 \u0645\u06af\u0631 \u062f\u0648\u0631 \u06a9\u06c1\u06cc\u06ba\u060c \u0632\u0648\u0645\u0628\u06cc \u0641\u0648\u062c \u0627\u067e\u0646\u0627 \u06c1\u0631 \u0633\u067e\u0627\u06c1\u06cc \u062c\u0645\u0639 \u06a9\u0631 \u0631\u06c1\u06cc \u06c1\u06d2...\", w10a: \"\u0646\u06cc\u0628\u0631\u0648\u06cc\u0644 \u0628\u0686\u0627\u0646\u06d2 \u06a9\u0627 \u0622\u062f\u06be\u0627 \u06a9\u0627\u0645 \u0645\u06a9\u0645\u0644! \ud83d\udcaa\", w10b: \"\u0628\u0627\u0633 \u0628\u0627\u0644\u06a9\u0644 \u062e\u0648\u0634 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u06af\u0627...\",\n                i15n: \"\u062c\u0646\u06af \u0634\u062f\u062a \u067e\u06a9\u0691 \u0631\u06c1\u06cc \u06c1\u06d2\u06d4 \u06c1\u0631 \u0642\u0633\u0645 \u06a9\u0627 \u0632\u0648\u0645\u0628\u06cc \u0645\u0627\u0631\u0686 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u06d2\u06d4 \u0635\u0631\u0641 \u0633\u0628 \u0633\u06d2 \u0628\u06c1\u0627\u062f\u0631 \u0628\u0627\u063a \u06c1\u06cc \u0628\u0686\u06cc\u06ba \u06af\u06d2!\", i15a: \"\u0686\u0644\u0648 \u0627\u0633 \u0628\u0627\u0631 \u062f\u06be\u0645\u0627\u06a9\u06c1 \u06a9\u0631\u06cc\u06ba! \ud83c\udf52\", i15b: \"\u0633\u0628 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be! \u062d\u0645\u0644\u06c1!\",\n                i20n: \"\u0622\u062e\u0631\u06cc \u0645\u0639\u0631\u06a9\u06c1! \u0645\u0631\u062f\u0648\u06ba \u06a9\u06cc \u067e\u0648\u0631\u06cc \u0641\u0648\u062c \u0622\u067e \u06a9\u06d2 \u06af\u06be\u0631 \u06a9\u06cc \u0637\u0631\u0641 \u0628\u0691\u06be \u0631\u06c1\u06cc \u06c1\u06d2: \u06af\u0627\u0631\u06af\u06cc\u0646\u0679\u0648\u0627\u0631\u060c \u0627\u0645\u067e \u0627\u0648\u0631 \u0628\u06d2 \u0634\u0645\u0627\u0631 \u06c1\u062c\u0648\u0645\u06d4 \u06cc\u06c1\u06cc \u0648\u06c1 \u0644\u0645\u062d\u06c1 \u06c1\u06d2!\", i20a: \"\u06cc\u06c1 \u0644\u0627\u0646 \u06c1\u0645\u0627\u0631\u0627 \u06c1\u06d2!!\", i20b: \"\u062f\u06be\u0648\u067e \u06a9\u06cc \u06c1\u0631 \u06a9\u0631\u0646 \u0627\u06c1\u0645 \u06c1\u06d2\u06d4 \u0646\u06cc\u0628\u0631\u0648\u06cc\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2! \u2600\ufe0f\", i20c: \"\u0627\u06cc\u06a9\u06d4 \u0642\u062f\u0645\u06d4 \u0628\u06be\u06cc\u06d4 \u0622\u06af\u06d2\u06d4 \u0646\u06c1\u06cc\u06ba!\",\n                w20n: \"\u0634\u0627\u0646\u062f\u0627\u0631 \u0641\u062a\u062d! \u0622\u062e\u0631\u06cc \u0632\u0648\u0645\u0628\u06cc \u06af\u0631 \u06af\u06cc\u0627 \u0627\u0648\u0631 \u0646\u06cc\u0628\u0631\u0648\u06cc\u0644 \u0645\u06cc\u06ba \u0633\u0646\u06c1\u0631\u06cc \u062f\u06be\u0648\u067e \u0644\u0648\u0679 \u0622\u0626\u06cc\u06d4 \u0622\u067e \u0628\u0627\u063a \u06a9\u06d2 \u0645\u062d\u0627\u0641\u0638 \u06c1\u06cc\u06ba!\", w20a: \"\u06c1\u0645 \u0646\u06d2 \u0645\u062d\u0644\u06c1 \u0628\u0686\u0627 \u0644\u06cc\u0627! \ud83c\udf3b\", w20b: \"\u0627\u0628 \u062a\u06a9 \u06a9\u0627\u06d4 \u0633\u0628 \u0633\u06d2\u06d4 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u0645\u0627\u0644\u06cc! \ud83c\udfc6\", w20c: \"...\u0627\u06af\u0644\u06d2 \u067e\u0648\u0631\u06d2 \u0686\u0627\u0646\u062f \u062a\u06a9\u06d4 \ud83d\ude09\",\n                l1n: \"\u0627\u0631\u06d2 \u0646\u06c1\u06cc\u06ba! \u0632\u0648\u0645\u0628\u06cc\u0632 \u0646\u06d2 \u0622\u067e \u06a9\u0627 \u062f\u0645\u0627\u063a \u06a9\u06be\u0627 \u0644\u06cc\u0627! \u0645\u06af\u0631 \u06c1\u0631 \u0639\u0638\u06cc\u0645 \u0645\u0627\u0644\u06cc \u0627\u0648\u0631 \u0645\u0636\u0628\u0648\u0637 \u06c1\u0648 \u06a9\u0631 \u0644\u0648\u0679\u062a\u0627 \u06c1\u06d2...\", l1a: \"\u06c1\u0645\u062a \u0645\u062a \u06c1\u0627\u0631\u0648! \u0646\u06cc\u0627 \u0645\u0646\u0635\u0648\u0628\u06c1 \u0622\u0632\u0645\u0627\u0624! \ud83c\udf31\", l1b: \"\u0645\u0645\u0645... \u062f\u0645\u0627\u0627\u0627\u063a... \ud83e\udde0\" },\n            de: { badge_intro: \"\u26a0\ufe0f GEFAHR NAHT\", badge_mile: \"\u2b50 MEILENSTEIN\", badge_final: \"\ud83d\udd25 ENDKAMPF\", cont: \"WEITER\", unl_q: \"Melde mich zum Dienst, G\u00e4rtner! \ud83c\udf31\", final_wave: \"EINE RIESIGE ZOMBIEWELLE N\u00c4HERT SICH!\", mower: \"RASENM\u00c4HER ZUR RETTUNG!\",\n                w1n: \"Dein allererster Sieg! Die Zombies torkeln st\u00f6hnend zur\u00fcck auf die Stra\u00dfe... doch das war erst der Anfang.\", w1a: \"Geschafft! Unser erster Sieg! \ud83c\udf89\", w1b: \"Wir kommen wieder... mit PYLONEN! \ud83e\udddf\",\n                i5n: \"Eine zerfetzte Flagge weht am Horizont. Eine riesige Welle rollt an, und manche Zombies tragen jetzt Metalleimer!\", i5a: \"FOLGT DER FLAGGE! GEHIIIRNE!\", i5b: \"Eimer auf! Deine Erbsen k\u00f6nnen mir nichts!\",\n                i6n: \"Die Untoten werden schlauer! Ein m\u00fcrrischer Leser versteckt sich hinter seiner Zeitung, und ein Athlet springt \u00fcber deine Pflanzen. K\u00e4mpfe laufen jetzt in Phasen!\", i6a: \"Finger weg von meiner Zeitung!! \ud83d\udcf0\", i6b: \"Hopp! \u00dcber die Mauer! \ud83c\udfc3\",\n                w5n: \"F\u00fcnf Level geschafft! In Nachbarsdorf spricht es sich herum: Der gr\u00fcne Widerstand ist echt, und er gewinnt!\", w5a: \"Die ganze Stra\u00dfe jubelt uns zu! \ud83c\udf3b\", w5b: \"Bleibt wachsam... etwas GROSSES kommt.\",\n                i10n: \"Der Boden bricht auf. Mit einem Telefonmast und einem kleinen Imp auf dem R\u00fccken ist der m\u00e4chtige GARGANTUAR da!\", i10a: \"SCHWACHE PFLANZEN ZERSCHMETTERN!! \ud83d\udca5\", i10b: \"Wirf mich, Gro\u00dfer! Juhuu!\", i10c: \"Oh oh... wir brauchen mehr Erbsen!\",\n                w10n: \"Halbzeit! Der Gargantuar kracht auf den Rasen. Doch in der Ferne sammelt die Zombiearmee ihre letzten Soldaten...\", w10a: \"Halb geschafft, Nachbarsdorf zu retten! \ud83d\udcaa\", w10b: \"Der Boss wird NICHT erfreut sein...\",\n                i15n: \"Die Schlacht tobt weiter. Jede Zombieart hat sich dem Marsch angeschlossen. Nur die tapfersten G\u00e4rten \u00fcberleben!\", i15a: \"Lass es diesmal KRACHEN! \ud83c\udf52\", i15b: \"ALLE ZUSAMMEN! ANGRIFF!\",\n                i20n: \"DAS LETZTE GEFECHT! Die gesamte Untotenarmee marschiert auf dein Haus zu: Gargantuare, Imps und unz\u00e4hlige Horden. Jetzt gilt's!\", i20a: \"DIESER RASEN GEH\u00d6RT UNS!!\", i20b: \"Jeder Sonnenstrahl z\u00e4hlt. F\u00fcr Nachbarsdorf! \u2600\ufe0f\", i20c: \"Keinen. Schritt. Weiter!\",\n                w20n: \"LEGEND\u00c4RER SIEG! Der letzte Zombie f\u00e4llt und goldenes Sonnenlicht kehrt nach Nachbarsdorf zur\u00fcck. Du bist der H\u00fcter des Gartens!\", w20a: \"Wir haben die Nachbarschaft gerettet! \ud83c\udf3b\", w20b: \"Bester. G\u00e4rtner. ALLER ZEITEN! \ud83c\udfc6\", w20c: \"...bis zum n\u00e4chsten Vollmond. \ud83d\ude09\",\n                l1n: \"Oh nein! Die Zombies haben dein Gehirn gefressen! Doch jeder gro\u00dfe G\u00e4rtner w\u00e4chst st\u00e4rker nach...\", l1a: \"Gib nicht auf! Versuch einen neuen Plan! \ud83c\udf31\", l1b: \"Mmm... Gehiiirne... \ud83e\udde0\" },\n            ja: { badge_intro: \"\u26a0\ufe0f \u8105\u5a01\u63a5\u8fd1\u4e2d\", badge_mile: \"\u2b50 \u30de\u30a4\u30eb\u30b9\u30c8\u30fc\u30f3\", badge_final: \"\ud83d\udd25 \u6700\u7d42\u6c7a\u6226\", cont: \"\u3064\u3065\u3051\u308b\", unl_q: \"\u30ac\u30fc\u30c7\u30ca\u30fc\u3001\u7740\u4efb\u3057\u307e\u3057\u305f\uff01\ud83c\udf31\", final_wave: \"\u30be\u30f3\u30d3\u306e\u5927\u7fa4\u304c\u8feb\u3063\u3066\u304f\u308b\uff01\", mower: \"\u829d\u5208\u308a\u6a5f\u304c\u52a9\u3051\u306b\u6765\u305f\uff01\",\n                w1n: \"\u521d\u3081\u3066\u306e\u52dd\u5229\uff01\u30be\u30f3\u30d3\u305f\u3061\u306f\u3046\u3081\u304d\u306a\u304c\u3089\u901a\u308a\u3078\u9003\u3052\u5e30\u3063\u305f\u2026\u3067\u3082\u3001\u3053\u308c\u306f\u307e\u3060\u59cb\u307e\u308a\u306b\u3059\u304e\u306a\u3044\u3002\", w1a: \"\u3084\u3063\u305f\uff01\u521d\u52dd\u5229\u3060\uff01\ud83c\udf89\", w1b: \"\u307e\u305f\u6765\u308b\u305e\u2026\u30b3\u30fc\u30f3\u3092\u304b\u3076\u3063\u3066\u306a\uff01\ud83e\udddf\",\n                i5n: \"\u5730\u5e73\u7dda\u306b\u30dc\u30ed\u30dc\u30ed\u306e\u65d7\u304c\u306a\u3073\u304f\u3002\u5927\u7fa4\u304c\u62bc\u3057\u5bc4\u305b\u3001\u9244\u306e\u30d0\u30b1\u30c4\u3092\u304b\u3076\u3063\u305f\u30be\u30f3\u30d3\u307e\u3067\u73fe\u308c\u305f\uff01\", i5a: \"\u65d7\u306b\u7d9a\u3051\u30fc\uff01\u30ce\u30fc\u30df\u30bd\u30fc\uff01\", i5b: \"\u30d0\u30b1\u30c4\u88c5\u7740\uff01\u8c46\u306a\u3093\u304b\u52b9\u304b\u306a\u3044\u305e\uff01\",\n                i6n: \"\u30a2\u30f3\u30c7\u30c3\u30c9\u304c\u8ce2\u304f\u306a\u3063\u3066\u304d\u305f\uff01\u4e0d\u6a5f\u5acc\u306a\u65b0\u805e\u30be\u30f3\u30d3\u306f\u65b0\u805e\u306e\u9670\u306b\u96a0\u308c\u3001\u30a2\u30b9\u30ea\u30fc\u30c8\u306f\u690d\u7269\u3092\u98db\u3073\u8d8a\u3048\u308b\u3002\u6226\u3044\u306f\u30d5\u30a7\u30fc\u30ba\u5236\u306b\u306a\u3063\u305f\uff01\", i6a: \"\u65b0\u805e\u306b\u89e6\u308b\u306a\u30fc\uff01\uff01\ud83d\udcf0\", i6b: \"\u30db\u30c3\u30d7\uff01\u58c1\u3092\u98db\u3073\u8d8a\u3048\u308b\u305e\uff01\ud83c\udfc3\",\n                w5n: \"5\u30ec\u30d9\u30eb\u30af\u30ea\u30a2\uff01\u30cd\u30a4\u30d0\u30fc\u30d3\u30eb\u4e2d\u306b\u3046\u308f\u3055\u304c\u5e83\u304c\u308b\uff1a\u7dd1\u306e\u30ec\u30b8\u30b9\u30bf\u30f3\u30b9\u306f\u672c\u7269\u3067\u3001\u52dd\u3061\u7d9a\u3051\u3066\u3044\u308b\uff01\", w5a: \"\u901a\u308a\u306e\u307f\u3093\u306a\u304c\u5fdc\u63f4\u3057\u3066\u304f\u308c\u3066\u308b\uff01\ud83c\udf3b\", w5b: \"\u6c17\u3092\u629c\u304f\u306a\u2026\u4f55\u304b\u5de8\u5927\u306a\u3082\u306e\u304c\u6765\u308b\u3002\",\n                i10n: \"\u5927\u5730\u304c\u5272\u308c\u305f\u3002\u96fb\u67f1\u3092\u5f15\u304d\u305a\u308a\u3001\u80cc\u4e2d\u306b\u5c0f\u3055\u306a\u30a4\u30f3\u30d7\u3092\u4e57\u305b\u3066\u3001\u5f37\u5927\u306a\u30ac\u30eb\u30ac\u30f3\u30c1\u30e5\u30a2\u304c\u73fe\u308c\u305f\uff01\", i10a: \"\u5f31\u3044\u690d\u7269\u3001\u3076\u3063\u6f70\u3059\uff01\uff01\ud83d\udca5\", i10b: \"\u6295\u3052\u3066\u304f\u308c\u3001\u30c7\u30ab\u3044\u306e\uff01\u30d2\u30e3\u30c3\u30db\u30fc\uff01\", i10c: \"\u3046\u308f\u3041\u2026\u3082\u3063\u3068\u8c46\u304c\u5fc5\u8981\u3060\uff01\",\n                w10n: \"\u6298\u308a\u8fd4\u3057\u5730\u70b9\uff01\u30ac\u30eb\u30ac\u30f3\u30c1\u30e5\u30a2\u304c\u829d\u751f\u306b\u5012\u308c\u8fbc\u3093\u3060\u3002\u3060\u304c\u9060\u304f\u3067\u3001\u30be\u30f3\u30d3\u8ecd\u56e3\u306f\u6700\u5f8c\u306e\u5175\u58eb\u307e\u3067\u96c6\u3081\u3066\u3044\u308b\u2026\", w10a: \"\u30cd\u30a4\u30d0\u30fc\u30d3\u30eb\u6551\u51fa\u307e\u3067\u3042\u3068\u534a\u5206\uff01\ud83d\udcaa\", w10b: \"\u30dc\u30b9\u306f\u7d76\u5bfe\u306b\u6012\u308b\u305e\u2026\",\n                i15n: \"\u6226\u3044\u306f\u3055\u3089\u306b\u6fc0\u3057\u304f\u306a\u308b\u3002\u3042\u3089\u3086\u308b\u30be\u30f3\u30d3\u304c\u884c\u9032\u306b\u52a0\u308f\u3063\u305f\u3002\u751f\u304d\u6b8b\u308c\u308b\u306e\u306f\u6700\u3082\u52c7\u6562\u306a\u5ead\u3060\u3051\u3060\uff01\", i15a: \"\u4eca\u56de\u306f\u30c9\u30ab\u30f3\u3068\u3044\u3053\u3046\uff01\ud83c\udf52\", i15b: \"\u5168\u54e1\u3067\u7a81\u6483\u3060\u30fc\uff01\",\n                i20n: \"\u6700\u5f8c\u306e\u6226\u3044\uff01\u30a2\u30f3\u30c7\u30c3\u30c9\u306e\u5168\u8ecd\u304c\u5bb6\u306b\u8feb\u308b\uff1a\u30ac\u30eb\u30ac\u30f3\u30c1\u30e5\u30a2\u3001\u30a4\u30f3\u30d7\u3001\u305d\u3057\u3066\u6570\u3048\u304d\u308c\u306a\u3044\u5927\u7fa4\u3002\u6c7a\u6226\u306e\u6642\u3060\uff01\", i20a: \"\u3053\u306e\u829d\u751f\u306f\u30aa\u30ec\u305f\u3061\u306e\u3082\u306e\u3060\uff01\uff01\", i20b: \"\u592a\u967d\u306e\u3072\u3068\u7b4b\u3072\u3068\u7b4b\u304c\u5927\u5207\u3002\u30cd\u30a4\u30d0\u30fc\u30d3\u30eb\u306e\u305f\u3081\u306b\uff01\u2600\ufe0f\", i20c: \"\u4e00\u6b69\u3082\u3001\u901a\u3055\u306a\u3044\uff01\",\n                w20n: \"\u4f1d\u8aac\u306e\u52dd\u5229\uff01\u6700\u5f8c\u306e\u30be\u30f3\u30d3\u304c\u5012\u308c\u3001\u30cd\u30a4\u30d0\u30fc\u30d3\u30eb\u306b\u9ec4\u91d1\u306e\u5149\u304c\u623b\u3063\u305f\u3002\u541b\u3053\u305d\u5ead\u306e\u5b88\u8b77\u8005\u3060\uff01\", w20a: \"\u8857\u3092\u6551\u3063\u305f\u305e\uff01\ud83c\udf3b\", w20b: \"\u53f2\u4e0a\u3001\u6700\u9ad8\u306e\u3001\u30ac\u30fc\u30c7\u30ca\u30fc\uff01\ud83c\udfc6\", w20c: \"\u2026\u6b21\u306e\u6e80\u6708\u307e\u3067\u306f\u306d\u3002\ud83d\ude09\",\n                l1n: \"\u306a\u3093\u3066\u3053\u3063\u305f\uff01\u30be\u30f3\u30d3\u306b\u8133\u307f\u305d\u3092\u98df\u3079\u3089\u308c\u305f\uff01\u3067\u3082\u5049\u5927\u306a\u30ac\u30fc\u30c7\u30ca\u30fc\u306f\u3001\u3082\u3063\u3068\u5f37\u304f\u306a\u3063\u3066\u82bd\u3092\u51fa\u3059\u3093\u3060\u2026\", l1a: \"\u3042\u304d\u3089\u3081\u306a\u3044\u3067\uff01\u65b0\u3057\u3044\u4f5c\u6226\u3092\u8a66\u305d\u3046\uff01\ud83c\udf31\", l1b: \"\u3046\u30fc\u3093\u2026\u30ce\u30fc\u30df\u30bd\u30fc\u2026\ud83e\udde0\" },\n            jv: { badge_intro: \"\u26a0\ufe0f BEBAYA TEKA\", badge_mile: \"\u2b50 PRESTASI\", badge_final: \"\ud83d\udd25 PERANG PUNGKASAN\", cont: \"TERUSAKE\", unl_q: \"Siyap njaga, Tukang Kebon! \ud83c\udf31\", final_wave: \"OMBAK ZOMBI GEDHE BANGET NYEDHAK!\", mower: \"MESIN PANGETHOK SUKET TEKA NULUNG!\",\n                w1n: \"Kamenangan pisananmu! Para zombi mundur sempoyongan karo nggresula... nanging iki lagi wiwitane.\", w1a: \"Kita kasil! Menang pisanan! \ud83c\udf89\", w1b: \"Aku bakal bali... nganggo KERUCUT! \ud83e\udddf\",\n                i5n: \"Gendera suwek ngibar ing cakrawala. Ombak gedhe teka, lan sawetara zombi saiki nganggo ember wesi!\", i5a: \"TUTNANA GENDERA! UTEEEK!\", i5b: \"Ember wis dipasang! Kacangmu ora mempan!\",\n                i6n: \"Mayat urip saya pinter! Tukang maca sing nesunan ndhelik ing mburi korane, lan atlet mlumpati tanduranmu. Perang saiki ana fase-fase!\", i6a: \"Aja ndemek koranku!! \ud83d\udcf0\", i6b: \"Hup! Mlumpati tembok! \ud83c\udfc3\",\n                w5n: \"Limang level rampung! Kabar nyebar ing Neighborville: perlawanan ijo iku nyata, lan lagi menang!\", w5a: \"Sak dalan kabeh nyurak-nyurak kanggo kita! \ud83c\udf3b\", w5b: \"Tetep waspada... ana sing GEDHE arep teka.\",\n                i10n: \"Lemahe nela. Nyeret cagak telpon karo Imp cilik ing gegere, GARGANTUAR sing digdaya wis teka!\", i10a: \"REMUKNA TANDURAN RINGKIH!! \ud83d\udca5\", i10b: \"Uncalna aku, Kang! Yuhuu!\", i10c: \"Waduh... kita butuh kacang luwih akeh!\",\n                w10n: \"Wis separo dalan! Gargantuar ambruk ing plataran. Nanging adoh kana, wadya zombi ngumpulake prajurit pungkasane...\", w10a: \"Separo dalan kanggo nylametake Neighborville! \ud83d\udcaa\", w10b: \"Bose mesthi ORA seneng...\",\n                i15n: \"Perang saya rame. Kabeh jinis zombi melu baris. Mung kebon sing paling wani sing bakal slamet!\", i15a: \"Ayo gawe level iki mbledhos! \ud83c\udf52\", i15b: \"BARENG-BARENG! SERBUUU!\",\n                i20n: \"PERANG PUNGKASAN! Kabeh wadya mayat urip mlaku menyang omahmu: Gargantuar, Imp, lan gerombolan tanpa wilangan. Iki wayahe!\", i20a: \"PLATARAN IKI DUWEKE AWAKE DHEWE!!\", i20b: \"Saben sorot srengenge iku penting. Kanggo Neighborville! \u2600\ufe0f\", i20c: \"Ora. Oleh. Maju. Maneh!\",\n                w20n: \"KAMENANGAN LEGENDARIS! Zombi pungkasan tiba lan sorot emas bali menyang Neighborville. Kowe Pengawal Kebon!\", w20a: \"Kita nylametake kampung! \ud83c\udf3b\", w20b: \"Tukang. Kebon. PALING APIK! \ud83c\udfc6\", w20c: \"...nganti purnama sabanjure. \ud83d\ude09\",\n                l1n: \"Adhuh! Zombi mangan utekmu! Nanging saben tukang kebon sing hebat bakal thukul maneh luwih kuwat...\", l1a: \"Aja nyerah! Jajal rencana anyar! \ud83c\udf31\", l1b: \"Mmm... uteeek... \ud83e\udde0\" },\n            ko: { badge_intro: \"\u26a0\ufe0f \uc704\ud611 \uc811\uadfc \uc911\", badge_mile: \"\u2b50 \uc774\uc815\ud45c\", badge_final: \"\ud83d\udd25 \ucd5c\ud6c4\uc758 \uc804\ud22c\", cont: \"\uacc4\uc18d\", unl_q: \"\uc815\uc6d0\uc0ac\ub2d8, \uc784\ubb34 \ubcf4\uace0\ud569\ub2c8\ub2e4! \ud83c\udf31\", final_wave: \"\uac70\ub300\ud55c \uc880\ube44 \ubb34\ub9ac\uac00 \ub2e4\uac00\uc624\uace0 \uc788\ub2e4!\", mower: \"\uc794\ub514\uae4e\uc774 \ucd9c\ub3d9!\",\n                w1n: \"\uccab \ubc88\uc9f8 \uc2b9\ub9ac! \uc880\ube44\ub4e4\uc774 \uc2e0\uc74c\ud558\uba70 \ube44\ud2c0\ube44\ud2c0 \uac70\ub9ac\ub85c \ubb3c\ub7ec\ub0ac\ub2e4... \ud558\uc9c0\ub9cc \uc774\uac74 \uc2dc\uc791\uc5d0 \ubd88\uacfc\ud588\ub2e4.\", w1a: \"\ud574\ub0c8\ub2e4! \uccab \uc2b9\ub9ac\uc57c! \ud83c\udf89\", w1b: \"\ub2e4\uc2dc \uc62c \uac70\ub2e4... \uace0\uae54\uc744 \uc4f0\uace0! \ud83e\udddf\",\n                i5n: \"\uc9c0\ud3c9\uc120\uc5d0 \ucc22\uc5b4\uc9c4 \uae43\ubc1c\uc774 \ud384\ub7ed\uc778\ub2e4. \uac70\ub300\ud55c \ubb34\ub9ac\uac00 \ubab0\ub824\uc624\uace0, \uc774\uc81c \ucca0 \uc591\ub3d9\uc774\ub97c \uc4f4 \uc880\ube44\ub3c4 \uc788\ub2e4!\", i5a: \"\uae43\ubc1c\uc744 \ub530\ub974\ub77c! \ub1cc\uc560\uc560!\", i5b: \"\uc591\ub3d9\uc774 \uc7a5\ucc29! \ub124 \uc644\ub450\ucf69\uc740 \uc548 \ud1b5\ud574!\",\n                i6n: \"\uc880\ube44\ub4e4\uc774 \ub611\ub611\ud574\uc9c0\uace0 \uc788\ub2e4! \uc2ec\uc220\uad82\uc740 \uc2e0\ubb38 \uc880\ube44\ub294 \uc2e0\ubb38 \ub4a4\uc5d0 \uc228\uace0, \uc6b4\ub3d9\uc120\uc218 \uc880\ube44\ub294 \uc2dd\ubb3c\uc744 \ub6f0\uc5b4\ub118\ub294\ub2e4. \uc774\uc81c \uc804\ud22c\ub294 \ub2e8\uacc4\ubcc4\ub85c \uc9c4\ud589\ub41c\ub2e4!\", i6a: \"\ub0b4 \uc2e0\ubb38 \uac74\ub4dc\ub9ac\uc9c0 \ub9c8!! \ud83d\udcf0\", i6b: \"\ud5d9! \ubcbd\uc744 \ub118\uc5b4\uac04\ub2e4! \ud83c\udfc3\",\n                w5n: \"\ub2e4\uc12f \ub808\ubca8 \ud074\ub9ac\uc5b4! \ub124\uc774\ubc84\ube4c\uc5d0 \uc18c\ubb38\uc774 \ud37c\uc84c\ub2e4: \ub179\uc0c9 \uc800\ud56d\uad70\uc740 \uc9c4\uc9dc\uace0, \uc774\uae30\uace0 \uc788\ub2e4!\", w5a: \"\uc628 \ub3d9\ub124\uac00 \uc6b0\ub9ac\ub97c \uc751\uc6d0\ud574! \ud83c\udf3b\", w5b: \"\uae34\uc7a5 \ub2a6\ucd94\uc9c0 \ub9c8... \ubb54\uac00 \uac70\ub300\ud55c \uac8c \uc628\ub2e4.\",\n                i10n: \"\ub545\uc774 \uac08\ub77c\uc84c\ub2e4. \uc804\ubd07\ub300\ub97c \ub04c\uace0 \ub4f1\uc5d0 \uc791\uc740 \uc784\ud504\ub97c \ud0dc\uc6b4 \uac15\ub825\ud55c \uac70\uac04\ud22c\uc544\uac00 \ub098\ud0c0\ub0ac\ub2e4!\", i10a: \"\uc57d\ud55c \uc2dd\ubb3c \ubd80\uc234!! \ud83d\udca5\", i10b: \"\ub358\uc838\uc918, \ub369\uce58! \uc57c\ud638!\", i10c: \"\uc774\ub7f0... \uc644\ub450\ucf69\uc774 \ub354 \ud544\uc694\ud574!\",\n                w10n: \"\uc808\ubc18 \uc654\ub2e4! \uac70\uac04\ud22c\uc544\uac00 \uc794\ub514\ubc2d\uc5d0 \uc4f0\ub7ec\uc84c\ub2e4. \ud558\uc9c0\ub9cc \uba40\ub9ac\uc11c \uc880\ube44 \uad70\ub300\uac00 \ub9c8\uc9c0\ub9c9 \ubcd1\uc0ac\uae4c\uc9c0 \ubaa8\uc73c\uace0 \uc788\ub2e4...\", w10a: \"\ub124\uc774\ubc84\ube4c \uad6c\ucd9c\uae4c\uc9c0 \uc808\ubc18 \ub0a8\uc558\uc5b4! \ud83d\udcaa\", w10b: \"\ubcf4\uc2a4\uac00 \uc808\ub300 \uc88b\uc544\ud558\uc9c0 \uc54a\uc744 \uac70\uc57c...\",\n                i15n: \"\uc804\ud22c\uac00 \uaca9\ub82c\ud574\uc9c4\ub2e4. \ubaa8\ub4e0 \uc885\ub958\uc758 \uc880\ube44\uac00 \ud589\uc9c4\uc5d0 \ud569\ub958\ud588\ub2e4. \uac00\uc7a5 \uc6a9\uac10\ud55c \uc815\uc6d0\ub9cc\uc774 \uc0b4\uc544\ub0a8\ub294\ub2e4!\", i15a: \"\uc774\ubc88\uc5d4 \ud391 \ud130\ub728\ub9ac\uc790! \ud83c\udf52\", i15b: \"\ubaa8\ub450 \ud568\uaed8! \ub3cc\uaca9!\",\n                i20n: \"\ucd5c\ud6c4\uc758 \uacb0\uc804! \uc880\ube44 \ub300\uad70 \uc804\uccb4\uac00 \uc9d1\uc73c\ub85c \uc9c4\uaca9\ud55c\ub2e4: \uac70\uac04\ud22c\uc544, \uc784\ud504, \uadf8\ub9ac\uace0 \uc140 \uc218 \uc5c6\ub294 \ubb34\ub9ac. \ubc14\ub85c \uc9c0\uae08\uc774\ub2e4!\", i20a: \"\uc774 \uc794\ub514\ubc2d\uc740 \uc6b0\ub9ac \uac70\ub2e4!!\", i20b: \"\ud587\uc0b4 \ud55c \uc904\uae30\ub3c4 \uc18c\uc911\ud574. \ub124\uc774\ubc84\ube4c\uc744 \uc704\ud574! \u2600\ufe0f\", i20c: \"\ud55c. \ubc1c\uc9dd\ub3c4. \ubabb \uc9c0\ub098\uac00!\",\n                w20n: \"\uc804\uc124\uc801\uc778 \uc2b9\ub9ac! \ub9c8\uc9c0\ub9c9 \uc880\ube44\uac00 \uc4f0\ub7ec\uc9c0\uace0 \ub124\uc774\ubc84\ube4c\uc5d0 \ud669\uae08\ube5b \ud587\uc0b4\uc774 \ub3cc\uc544\uc654\ub2e4. \ub2f9\uc2e0\uc774 \ubc14\ub85c \uc815\uc6d0\uc758 \uc218\ud638\uc790!\", w20a: \"\uc6b0\ub9ac\uac00 \ub3d9\ub124\ub97c \uad6c\ud588\uc5b4! \ud83c\udf3b\", w20b: \"\uc5ed\ub300. \ucd5c\uace0\uc758. \uc815\uc6d0\uc0ac! \ud83c\udfc6\", w20c: \"...\ub2e4\uc74c \ubcf4\ub984\ub2ec\uae4c\uc9c0\ub294. \ud83d\ude09\",\n                l1n: \"\uc774\ub7f0! \uc880\ube44\uac00 \ub2f9\uc2e0\uc758 \ub1cc\ub97c \uba39\uc5b4\ubc84\ub838\ub2e4! \ud558\uc9c0\ub9cc \uc704\ub300\ud55c \uc815\uc6d0\uc0ac\ub294 \ub354 \uac15\ud558\uac8c \ub2e4\uc2dc \uc790\ub77c\ub09c\ub2e4...\", l1a: \"\ud3ec\uae30\ud558\uc9c0 \ub9c8! \uc0c8\ub85c\uc6b4 \uc791\uc804\uc744 \uc368\ubd10! \ud83c\udf31\", l1b: \"\uc74c... \ub1cc\uc560\uc560... \ud83e\udde0\" },\n            it: { badge_intro: \"\u26a0\ufe0f MINACCIA IN ARRIVO\", badge_mile: \"\u2b50 TRAGUARDO\", badge_final: \"\ud83d\udd25 BATTAGLIA FINALE\", cont: \"CONTINUA\", unl_q: \"Pronto al dovere, giardiniere! \ud83c\udf31\", final_wave: \"UN'ENORME ONDATA DI ZOMBI SI AVVICINA!\", mower: \"TOSAERBA IN SOCCORSO!\",\n                w1n: \"La tua prima vittoria! Gli zombi indietreggiano lamentandosi... ma era solo l'inizio.\", w1a: \"Ce l'abbiamo fatta! Prima vittoria! \ud83c\udf89\", w1b: \"Torneremo... coi CONI! \ud83e\udddf\",\n                i5n: \"Una bandiera lacera sventola all'orizzonte. Arriva un'ondata massiccia e alcuni zombi indossano secchi di metallo!\", i5a: \"SEGUITE LA BANDIERA! CERVEELLI!\", i5b: \"Secchio in testa! I tuoi piselli non mi fanno niente!\",\n                i6n: \"I non-morti diventano pi\u00f9 furbi! Un lettore scontroso si nasconde dietro al giornale e un atleta scavalca le tue piante. Le battaglie ora sono a fasi!\", i6a: \"Non toccare il mio giornale!! \ud83d\udcf0\", i6b: \"Hop! Oltre il muro! \ud83c\udfc3\",\n                w5n: \"Cinque livelli superati! La voce si diffonde a Neighborville: la resistenza verde esiste ed \u00e8 vincente!\", w5a: \"Tutta la strada fa il tifo per noi! \ud83c\udf3b\", w5b: \"Occhi aperti... sta arrivando qualcosa di ENORME.\",\n                i10n: \"La terra si spacca. Trascinando un palo del telefono e con un piccolo Imp sulla schiena, il potente GARGANTUAR \u00e8 arrivato!\", i10a: \"SCHIACCIARE PIANTINE!! \ud83d\udca5\", i10b: \"Lanciaci, bestione! Evviva!\", i10c: \"Oh-oh... ci serviranno molti pi\u00f9 piselli!\",\n                w10n: \"A met\u00e0 strada! Il Gargantuar crolla sul prato. Ma lontano, l'esercito zombi raduna fino all'ultimo soldato...\", w10a: \"A met\u00e0 strada per salvare Neighborville! \ud83d\udcaa\", w10b: \"Il capo NON sar\u00e0 contento...\",\n                i15n: \"La battaglia infuria. Zombi di ogni tipo si sono uniti alla marcia. Solo i giardini pi\u00f9 valorosi sopravvivranno!\", i15a: \"Facciamo fare il BOATO a questo livello! \ud83c\udf52\", i15b: \"TUTTI INSIEME! CARICAAA!\",\n                i20n: \"L'ULTIMA BATTAGLIA! L'intero esercito dei non-morti marcia su casa tua: Gargantuar, Imp e orde sterminate. \u00c8 il momento!\", i20a: \"QUESTO PRATO \u00c8 NOSTRO!!\", i20b: \"Ogni raggio di sole conta. Per Neighborville! \u2600\ufe0f\", i20c: \"Non. Un. Passo. Pi\u00f9. Avanti!\",\n                w20n: \"VITTORIA LEGGENDARIA! L'ultimo zombi cade e la luce dorata torna su Neighborville. Sei il Custode del Giardino!\", w20a: \"Abbiamo salvato il quartiere! \ud83c\udf3b\", w20b: \"Il. Miglior. Giardiniere. DI SEMPRE! \ud83c\udfc6\", w20c: \"...fino alla prossima luna piena. \ud83d\ude09\",\n                l1n: \"Oh no! Gli zombi hanno mangiato il tuo cervello! Ma ogni grande giardiniere ricresce pi\u00f9 forte...\", l1a: \"Non arrenderti! Prova una nuova strategia! \ud83c\udf31\", l1b: \"Mmm... cerveeelli... \ud83e\udde0\" },\n            vi: { badge_intro: \"\u26a0\ufe0f M\u1ed0I \u0110E D\u1eccA \u0110ANG \u0110\u1ebeN\", badge_mile: \"\u2b50 C\u1ed8T M\u1ed0C\", badge_final: \"\ud83d\udd25 TR\u1eacN \u0110\u00c1NH CU\u1ed0I\", cont: \"TI\u1ebeP T\u1ee4C\", unl_q: \"S\u1eb5n s\u00e0ng nh\u1eadn nhi\u1ec7m v\u1ee5, ng\u01b0\u1eddi l\u00e0m v\u01b0\u1eddn! \ud83c\udf31\", final_wave: \"M\u1ed8T \u0110\u1ee2T S\u00d3NG ZOMBIE KH\u1ed4NG L\u1ed2 \u0110ANG \u0110\u1ebeN!\", mower: \"M\u00c1Y C\u1eaeT C\u1ece \u0110\u1ebeN C\u1ee8U VI\u1ec6N!\",\n                w1n: \"Chi\u1ebfn th\u1eafng \u0111\u1ea7u ti\u00ean c\u1ee7a b\u1ea1n! L\u0169 zombie r\u00ean r\u1ec9 tho\u00e1i lui tr\u00ean \u0111\u01b0\u1eddng... nh\u01b0ng \u0111\u00e2y m\u1edbi ch\u1ec9 l\u00e0 kh\u1edfi \u0111\u1ea7u.\", w1a: \"Ch\u00fang ta l\u00e0m \u0111\u01b0\u1ee3c r\u1ed3i! Th\u1eafng l\u1ee3i \u0111\u1ea7u ti\u00ean! \ud83c\udf89\", w1b: \"B\u1ecdn tao s\u1ebd quay l\u1ea1i... mang theo N\u00d3N! \ud83e\udddf\",\n                i5n: \"L\u00e1 c\u1edd r\u00e1ch r\u01b0\u1edbi tung bay n\u01a1i ch\u00e2n tr\u1eddi. M\u1ed9t \u0111\u1ee3t s\u00f3ng kh\u1ed5ng l\u1ed3 \u0111ang t\u1edbi, v\u00e0 v\u00e0i con zombie \u0111\u00e3 \u0111\u1ed9i x\u00f4 s\u1eaft!\", i5a: \"THEO L\u00c1 C\u1edc! N\u00c3\u00c3\u00c3O!\", i5b: \"\u0110\u00e3 \u0111\u1ed9i x\u00f4! \u0110\u1eadu c\u1ee7a m\u00e0y v\u00f4 d\u1ee5ng th\u00f4i!\",\n                i6n: \"L\u0169 x\u00e1c s\u1ed1ng ng\u00e0y c\u00e0ng ranh m\u00e3nh! K\u1ebb c\u00e1u k\u1ec9nh n\u1ea5p sau t\u1edd b\u00e1o, v\u00e0 m\u1ed9t v\u1eadn \u0111\u1ed9ng vi\u00ean nh\u1ea3y s\u00e0o qua c\u00e2y c\u1ee7a b\u1ea1n. C\u00e1c tr\u1eadn chi\u1ebfn gi\u1edd chia theo t\u1eebng \u0111\u1ee3t!\", i6a: \"\u0110\u1eebng ch\u1ea1m v\u00e0o b\u00e1o c\u1ee7a tao!! \ud83d\udcf0\", i6b: \"H\u00e2y da! V\u01b0\u1ee3t qua t\u01b0\u1eddng r\u00e0o! \ud83c\udfc3\",\n                w5n: \"\u0110\u00e3 v\u01b0\u1ee3t qua 5 m\u00e0n! Tin t\u1ee9c lan truy\u1ec1n kh\u1eafp Neighborville: \u0111\u1ed9i qu\u00e2n xanh c\u00f3 th\u1eadt v\u00e0 \u0111ang th\u1eafng th\u1ebf!\", w5a: \"C\u1ea3 con ph\u1ed1 \u0111ang reo h\u00f2 v\u00ec ch\u00fang ta! \ud83c\udf3b\", w5b: \"C\u1ea3nh gi\u00e1c cao \u0111\u1ed9... th\u1ee9 g\u00ec \u0111\u00f3 KH\u1ed4NG L\u1ed2 \u0111ang t\u1edbi.\",\n                i10n: \"M\u1eb7t \u0111\u1ea5t n\u1ee9t to\u00e1c. K\u00e9o theo c\u1ed9t \u0111i\u1ec7n v\u00e0 c\u00f5ng Imp nh\u1ecf tr\u00ean l\u01b0ng, GARGANTUAR h\u00f9ng m\u1ea1nh \u0111\u00e3 xu\u1ea5t hi\u1ec7n!\", i10a: \"\u0110\u1eacP N\u00c1T M\u1ea4Y C\u00c1I C\u00c2Y Y\u1ebeU \u1edaT!! \ud83d\udca5\", i10b: \"N\u00e9m em \u0111i, anh b\u1ef1! Oa!\", i10c: \"Nguy r\u1ed3i... ch\u00fang ta c\u1ea7n nhi\u1ec1u \u0111\u1eadu h\u01a1n n\u1eefa!\",\n                w10n: \"\u0110\u00e3 \u0111i \u0111\u01b0\u1ee3c n\u1eeda ch\u1eb7ng \u0111\u01b0\u1eddng! Gargantuar g\u1ee5c ng\u00e3 tr\u00ean b\u00e3i c\u1ecf. Nh\u01b0ng t\u1eeb ph\u00eda xa, qu\u00e2n \u0111o\u00e0n zombie \u0111ang t\u1eadp h\u1ee3p nh\u1eefng binh s\u0129 cu\u1ed1i c\u00f9ng...\", w10a: \"\u0110\u00e3 \u0111i \u0111\u01b0\u1ee3c n\u1eeda \u0111\u01b0\u1eddng gi\u1ea3i c\u1ee9u Neighborville! \ud83d\udcaa\", w10b: \"\u0110\u1ea1i ca s\u1ebd KH\u00d4NG h\u00e0i l\u00f2ng \u0111\u00e2u...\",\n                i15n: \"Tr\u1eadn chi\u1ebfn ng\u00e0y c\u00e0ng kh\u1ed1c li\u1ec7t. M\u1ecdi lo\u1ea1i zombie \u0111\u1ec1u \u0111\u00e3 nh\u1eadp cu\u1ed9c. Ch\u1ec9 nh\u1eefng khu v\u01b0\u1eddn d\u0169ng c\u1ea3m nh\u1ea5t m\u1edbi s\u1ed1ng s\u00f3t!\", i15a: \"H\u00e3y l\u00e0m cho m\u00e0n n\u00e0y N\u1ed4 TUNG \u0111i! \ud83c\udf52\", i15b: \"T\u1ea4T C\u1ea2 C\u00d9NG NHAU! X\u00d4NG L\u00caN!\",\n                i20n: \"TR\u1eacN CHI\u1ebeN CU\u1ed0I C\u00d9NG! To\u00e0n b\u1ed9 qu\u00e2n \u0111o\u00e0n x\u00e1c s\u1ed1ng ti\u1ebfn v\u1ec1 ng\u00f4i nh\u00e0 c\u1ee7a b\u1ea1n: Gargantuar, Imp v\u00e0 mu\u00f4n v\u00e0n qu\u00e1i v\u1eadt. Th\u1eddi kh\u1eafc \u0111\u00e3 \u0111i\u1ec3m!\", i20a: \"B\u00c3I C\u1ece N\u00c0Y L\u00c0 C\u1ee6A CH\u00daNG TA!!\", i20b: \"T\u1eebng tia n\u1eafng \u0111\u1ec1u v\u00f4 gi\u00e1. V\u00ec Neighborville! \u2600\ufe0f\", i20c: \"Kh\u00f4ng. \u0110\u01b0\u1ee3c. B\u01b0\u1edbc. Th\u00eam. B\u01b0\u1edbc. N\u00e0o!\",\n                w20n: \"CHI\u1ebeN TH\u1eaeNG HUY\u1ec0N THO\u1ea0I! Zombie cu\u1ed1i c\u00f9ng ng\u00e3 xu\u1ed1ng v\u00e0 \u00e1nh n\u1eafng v\u00e0ng r\u1ef1c r\u1ee1 tr\u1edf l\u1ea1i Neighborville. B\u1ea1n ch\u00ednh l\u00e0 H\u1ed9 V\u1ec7 Khu V\u01b0\u1eddn!\", w20a: \"Ch\u00fang ta \u0111\u00e3 c\u1ee9u c\u1ea3 khu ph\u1ed1! \ud83c\udf3b\", w20b: \"Ng\u01b0\u1eddi. L\u00e0m. V\u01b0\u1eddn. V\u0128 \u0110\u1ea0I NH\u1ea4T! \ud83c\udfc6\", w20c: \"...cho t\u1edbi k\u00ec tr\u0103ng tr\u00f2n ti\u1ebfp theo. \ud83d\ude09\",\n                l1n: \"\u00d4i kh\u00f4ng! Zombie \u0111\u00e3 \u0103n m\u1ea5t n\u00e3o c\u1ee7a b\u1ea1n! Nh\u01b0ng ng\u01b0\u1eddi l\u00e0m v\u01b0\u1eddn v\u0129 \u0111\u1ea1i lu\u00f4n v\u01b0\u01a1n l\u00ean m\u1ea1nh m\u1ebd h\u01a1n...\", l1a: \"\u0110\u1eebng b\u1ecf cu\u1ed9c! H\u00e3y th\u1eed m\u1ed9t k\u1ebf ho\u1ea1ch m\u1edbi! \ud83c\udf31\", l1b: \"Mmm... n\u00e3\u00e3\u00e3o... \ud83e\udde0\" }\n        };\n        Object.keys(window.I18N_STORY).forEach(code => {\n            if (window.I18N[code]) Object.assign(window.I18N[code], window.I18N_STORY[code]);\n        });\n    </script>\n    <script>\n        /**\n         * Plant vs Zombies 2 - A lane-based tower defense game\n         * \n         * Players strategically place plants on a 5\u00d79 grid to defend against waves of zombies.\n         * Features include:\n         * - 5 plant types with unique abilities (Sunflower, Peashooter, Wall-nut, Cherry Bomb, Snow Pea)\n         * - 3 zombie types with different stats (Basic, Fast, Tank)\n         * - Sunlight collection system for resource management\n         * - Wave-based progression with increasing difficulty\n         * - Edit mode for customizing level parameters\n         */\n\n        async function run(mode) {\n            const gameWorld = document.getElementById('game-world');\n            const canvas = document.getElementById('game-canvas');\n            const ctx = canvas.getContext('2d');\n\n            // ================= LOCALIZATION CORE =================\n            const I18N = window.I18N;\n            function detectDeviceLanguage() {\n                let list = [];\n                try {\n                    list = (navigator.languages && navigator.languages.length) ? Array.from(navigator.languages) : [navigator.language || navigator.userLanguage || 'en'];\n                } catch (e) { list = ['en']; }\n                for (const l of list) {\n                    if (!l) continue;\n                    let code = String(l).toLowerCase().split(/[-_]/)[0];\n                    if (code === 'in') code = 'id';\n                    if (code === 'jw') code = 'jv';\n                    if (I18N[code]) return code;\n                }\n                return 'en';\n            }\n            let currentLanguage = detectDeviceLanguage();\n            let uiReady = false;\n            let lastPhaseInfo = null;\n            let currentUnlockType = null;\n\n            function t(key, params) {\n                const dict = I18N[currentLanguage] || I18N.en;\n                let s = dict[key];\n                if (s === undefined) s = I18N.en[key];\n                if (s === undefined) s = key;\n                if (params) {\n                    Object.keys(params).forEach(k => { s = String(s).split('{' + k + '}').join(params[k]); });\n                }\n                return s;\n            }\n\n            const LEVEL_NAME_KEYS = { 'Garden Basics': 'lv1', 'Defensive Line': 'lv2', 'Explosive Defense': 'lv3' };\n            function getLevelName(levelConfig, n) {\n                const name = levelConfig && levelConfig.name;\n                if (!name || /^Level\\s*\\d+$/i.test(name)) return t('level_n', { n });\n                if (LEVEL_NAME_KEYS[name]) return t(LEVEL_NAME_KEYS[name]);\n                return name;\n            }\n\n            function applyStaticTranslations() {\n                document.documentElement.lang = currentLanguage;\n                document.body.classList.toggle('rtl', window.RTL_LANGS.includes(currentLanguage));\n                document.querySelectorAll('[data-i18n]').forEach(el => {\n                    el.textContent = t(el.dataset.i18n);\n                });\n                document.title = t('title');\n            }\n\n            async function persistLanguagePreference() {\n                try {\n                    await lib.saveUserGameState({ maxUnlockedLevel, seenUnlocks, hasSeenStory, language: currentLanguage, seenStories });\n                } catch (error) {\n                    lib.log(`Failed to save language preference: ${error.message}`);\n                }\n            }\n\n            function setLanguage(code, persist) {\n                if (!I18N[code]) code = 'en';\n                currentLanguage = code;\n                applyStaticTranslations();\n                if (uiReady) refreshDynamicTexts();\n                if (persist) persistLanguagePreference();\n            }\n\n            applyStaticTranslations();\n\n            // Initialize display and resize handling\n            function resizeCanvas() {\n                canvas.width = gameWorld.clientWidth;\n                canvas.height = gameWorld.clientHeight;\n            }\n            resizeCanvas();\n            window.addEventListener('resize', resizeCanvas);\n            \n            // Polyfill for roundRect in older environments\n            if (!CanvasRenderingContext2D.prototype.roundRect) {\n                CanvasRenderingContext2D.prototype.roundRect = function (x, y, w, h, r) {\n                    if (w < 2 * r) r = w / 2;\n                    if (h < 2 * r) r = h / 2;\n                    this.moveTo(x + r, y);\n                    this.arcTo(x + w, y, x + w, y + h, r);\n                    this.arcTo(x + w, y + h, x, y + h, r);\n                    this.arcTo(x, y + h, x, y, r);\n                    this.arcTo(x, y, x + w, y, r);\n                    this.closePath();\n                    return this;\n                }\n            }\n\n            // Asset cache\n            const assetCache = {};\n            const audioCache = {};\n            let audioContext = null;\n            let backgroundMusicSource = null;\n\n            let spawnQueue = [];\n            let plantCardElements = {};\n\n            // Preload assets\n            async function preloadAssets() {\n                const assetIds = [\n                    'game_background_grass_road', 'plain_grass_bg', 'background_grass_road_v2', 'background_grass_road', 'day_grass_bg', 'home_entrance_top',\n                    'sunflower_idle', 'peashooter_idle', 'peashooter_attacking',\n                    'wallnut_idle', 'cherrybomb_idle', 'snowpea_idle', 'snowpea_attacking',\n                    'repeater_idle', 'potatomine_idle', 'potatomine_armed',\n                    'squash_idle', 'squash_attacking', 'jalapeno_idle', 'spikeweed_idle',\n                    'torchwood_idle', 'tallnut_idle', 'cactus_idle', 'starfruit_idle',\n                    'zombie_basic_walk', 'zombie_basic_eat', 'zombie_fast_walk', 'zombie_fast_eat',\n                    'zombie_tank_walk', 'zombie_tank_eat',\n                    'zombie_buckethead_walk', 'zombie_buckethead_eat',\n                    'zombie_flag_walk', 'zombie_flag_eat',\n                    'zombie_newspaper_walk', 'zombie_newspaper_angry',\n                    'zombie_pole_walk', 'zombie_pole_jump',\n                    'zombie_gargantuar_walk', 'zombie_gargantuar_smash',\n                    'zombie_imp_walk', 'zombie_imp_eat',\n                    'pea_projectile', 'frozen_pea_projectile', 'fire_pea_projectile', \n                    'cactus_spike_projectile', 'star_projectile',\n                    'explosion_effect', 'sun_icon', 'background_night_garden_hd',\n                    'plant_card_sunflower', 'plant_card_peashooter', 'plant_card_wallnut',\n                    'plant_card_cherrybomb', 'plant_card_snowpea', 'plant_card_repeater', 'plant_card_potatomine',\n                    'plant_card_squash', 'plant_card_jalapeno', 'plant_card_spikeweed',\n                    'plant_card_torchwood', 'plant_card_tallnut', 'plant_card_cactus', 'plant_card_starfruit',\n                    'menu_button', 'star_empty', 'star_filled', 'victory_banner', 'defeat_banner', 'lawn_mower',\n                    'wave_banner_bg', 'war_horn_start_sfx',\n                    'background_music', 'sun_collect_sfx', 'plant_place_sfx', 'pea_shoot_sfx',\n                    'explosion_sfx', 'critter_defeat_sfx', 'wave_start_sfx', 'victory_sfx', 'defeat_sfx',\n                    'ui_click_short_sfx', 'plant_unlock_sfx'\n                ];\n\n                const promises = assetIds.map(id => {\n                    return new Promise((resolve) => {\n                        const assetInfo = lib.getAsset(id);\n                        if (!assetInfo) {\n                            resolve();\n                            return;\n                        }\n\n                        if (assetInfo.type === 'image') {\n                            const img = new Image();\n                            img.onload = () => {\n                                assetCache[id] = { img, info: assetInfo };\n                                resolve();\n                            };\n                            img.onerror = () => resolve();\n                            img.src = assetInfo.url;\n                        } else if (assetInfo.type === 'audio') {\n                            fetch(assetInfo.url)\n                                .then(response => response.arrayBuffer())\n                                .then(arrayBuffer => {\n                                    try {\n                                        if (!audioContext) {\n                                            audioContext = new (window.AudioContext || window.webkitAudioContext)();\n                                        }\n                                        return audioContext.decodeAudioData(arrayBuffer);\n                                    } catch (e) {\n                                        return Promise.reject(e);\n                                    }\n                                })\n                                .then(audioBuffer => {\n                                    audioCache[id] = { buffer: audioBuffer, info: assetInfo };\n                                    resolve();\n                                })\n                                .catch(() => resolve());\n                        } else {\n                            resolve();\n                        }\n                    });\n                });\n\n                await Promise.all(promises);\n            }\n\n            // Audio helper functions\n            const lastPlayed = {};\n            function playSound(id) {\n                if (!audioContext || !audioCache[id]) return;\n                \n                // Prevent the same sound from playing multiple times in the same frame or very close together\n                const now = Date.now();\n                if (lastPlayed[id] && now - lastPlayed[id] < 50) return;\n                lastPlayed[id] = now;\n\n                try {\n                    const source = audioContext.createBufferSource();\n                    source.buffer = audioCache[id].buffer;\n                    source.connect(audioContext.destination);\n                    source.start(0);\n                } catch (e) {\n                    console.error('Error playing sound:', e);\n                }\n            }\n\n            function playBackgroundMusic() {\n                if (!audioContext || !audioCache['background_music']) return;\n                try {\n                    if (backgroundMusicSource) {\n                        backgroundMusicSource.stop();\n                    }\n                    backgroundMusicSource = audioContext.createBufferSource();\n                    backgroundMusicSource.buffer = audioCache['background_music'].buffer;\n                    backgroundMusicSource.loop = true;\n                    backgroundMusicSource.connect(audioContext.destination);\n                    backgroundMusicSource.start(0);\n                } catch (e) {\n                    console.error('Error playing background music:', e);\n                }\n            }\n\n            function stopBackgroundMusic() {\n                if (backgroundMusicSource) {\n                    try {\n                        backgroundMusicSource.stop();\n                        backgroundMusicSource = null;\n                    } catch (e) {}\n                }\n            }\n\n            // Initialize audio context on first user interaction\n            let audioInitialized = false;\n            function initAudio() {\n                if (!audioInitialized && audioContext) {\n                    audioContext.resume();\n                    audioInitialized = true;\n                }\n            }\n\n            await preloadAssets();\n            document.getElementById('loading-indicator').classList.add('hidden');\n\n            // Game constants\n            const GRID_ROWS = 6;\n            const GRID_COLS = 5;\n            const CELL_SIZE = 130;\n            const GRID_WIDTH = GRID_COLS * CELL_SIZE;\n            const GRID_HEIGHT = GRID_ROWS * CELL_SIZE;\n            const GRID_START_X = Math.floor((canvas.width - GRID_WIDTH) / 2);\n            const GRID_START_Y = 200;\n\n            // Plant definitions\n            const PLANT_TYPES = {\n                sunflower: {\n                    name: 'Sunflower',\n                    cost: 50,\n                    cooldown: 0, // Instant placement\n                    health: 360, // 300 * 1.2\n                    sunGeneration: 25,\n                    sunInterval: 24, // PvZ actual generation interval\n                    idleAsset: 'sunflower_idle'\n                },\n                peashooter: {\n                    name: 'Peashooter',\n                    cost: 100,\n                    cooldown: 0, // Instant placement\n                    health: 360, // 300 * 1.2\n                    damage: 24, // 20 * 1.2\n                    fireRate: 1.16, // 1.4 / 1.2 (20% more shots)\n                    projectileSpeed: 400,\n                    idleAsset: 'peashooter_idle',\n                    attackAsset: 'peashooter_attacking',\n                    projectileAsset: 'pea_projectile'\n                },\n                wallnut: {\n                    name: 'Wall-nut',\n                    cost: 50,\n                    cooldown: 7,\n                    health: 4800, // 4000 * 1.2\n                    idleAsset: 'wallnut_idle'\n                },\n                cherrybomb: {\n                    name: 'Cherry Bomb',\n                    cost: 150,\n                    cooldown: 7,\n                    health: 360, // 300 * 1.2\n                    damage: 2160, // 1800 * 1.2\n                    explosionRadius: 1.5,\n                    fuseTime: 1.2,\n                    idleAsset: 'cherrybomb_idle'\n                },\n                snowpea: {\n                    name: 'Snow Pea',\n                    cost: 175,\n                    cooldown: 7,\n                    health: 360, // 300 * 1.2\n                    damage: 24, // 20 * 1.2\n                    fireRate: 1.16, // 1.4 / 1.2\n                    projectileSpeed: 400,\n                    slowEffect: 0.5,\n                    slowDuration: 10, // Slow lasts longer in PvZ\n                    idleAsset: 'snowpea_idle',\n                    attackAsset: 'snowpea_attacking',\n                    projectileAsset: 'frozen_pea_projectile'\n                },\n                repeater: {\n                    name: 'Repeater',\n                    cost: 200,\n                    cooldown: 7,\n                    health: 360, // 300 * 1.2\n                    damage: 24, // 20 * 1.2\n                    fireRate: 1.16, // 1.4 / 1.2\n                    projectileSpeed: 400,\n                    idleAsset: 'repeater_idle',\n                    attackAsset: 'repeater_idle', // Use idle for now\n                    projectileAsset: 'pea_projectile'\n                },\n                potatomine: {\n                    name: 'Potato Mine',\n                    cost: 25,\n                    cooldown: 7,\n                    health: 360, // 300 * 1.2\n                    damage: 2160, // 1800 * 1.2\n                    explosionRadius: 0.5,\n                    armTime: 14,\n                    idleAsset: 'potatomine_idle',\n                    armedAsset: 'potatomine_armed'\n                },\n                squash: {\n                    name: 'Squash',\n                    cost: 50,\n                    cooldown: 7,\n                    health: 360, // 300 * 1.2\n                    damage: 2160, // 1800 * 1.2\n                    idleAsset: 'squash_idle',\n                    attackAsset: 'squash_attacking'\n                },\n                jalapeno: {\n                    name: 'Jalapeno',\n                    cost: 125,\n                    cooldown: 7,\n                    health: 360, // 300 * 1.2\n                    damage: 2160, // 1800 * 1.2\n                    idleAsset: 'jalapeno_idle'\n                },\n                spikeweed: {\n                    name: 'Spikeweed',\n                    cost: 100,\n                    cooldown: 5,\n                    health: 360, // 300 * 1.2\n                    damage: 48, // 40 * 1.2\n                    idleAsset: 'spikeweed_idle',\n                    isGround: true\n                },\n                torchwood: {\n                    name: 'Torchwood',\n                    cost: 175,\n                    cooldown: 5,\n                    health: 540, // 450 * 1.2\n                    idleAsset: 'torchwood_idle'\n                },\n                tallnut: {\n                    name: 'Tall-nut',\n                    cost: 125,\n                    cooldown: 7,\n                    health: 9600, // 8000 * 1.2\n                    idleAsset: 'tallnut_idle'\n                },\n                cactus: {\n                    name: 'Cactus',\n                    cost: 125,\n                    cooldown: 7,\n                    health: 360, // 300 * 1.2\n                    damage: 24, // 20 * 1.2\n                    fireRate: 1.16, // 1.4 / 1.2\n                    projectileSpeed: 450,\n                    idleAsset: 'cactus_idle',\n                    projectileAsset: 'cactus_spike_projectile'\n                },\n                starfruit: {\n                    name: 'Starfruit',\n                    cost: 125,\n                    cooldown: 7,\n                    health: 360, // 300 * 1.2\n                    damage: 24, // 20 * 1.2\n                    fireRate: 1.33, // 1.6 / 1.2\n                    projectileSpeed: 350,\n                    idleAsset: 'starfruit_idle',\n                    projectileAsset: 'star_projectile'\n                }\n            };\n\n            const PLANT_POWERS = {\n                sunflower: \"Generates extra Sun to help you grow your arsenal faster!\",\n                peashooter: \"Shoots peas at approaching enemies to defend your lawn.\",\n                wallnut: \"Has a very hard shell to protect your other plants from being eaten.\",\n                snowpea: \"Fires frozen peas that slow down enemy movement and attacks.\",\n                cherrybomb: \"Explodes in a large area, destroying all zombies in its range!\",\n                repeater: \"Double the trouble! Shoots two peas at a time for extra damage.\",\n                potatomine: \"Explodes on contact! Needs a little time to arm itself underground.\",\n                squash: \"Smashes the first zombie that gets too close to it.\",\n                jalapeno: \"A fiery pepper that destroys every zombie in its entire lane!\",\n                spikeweed: \"Damages zombies that try to walk over its sharp spikes.\",\n                torchwood: \"Ignites peas that pass through it, doubling their damage!\",\n                tallnut: \"A massive wall that even jumping zombies can't get over.\",\n                cactus: \"Shoots sharp spikes that can even pop balloons!\",\n                starfruit: \"A cheerful fruit that shoots stars in five different directions!\"\n            };\n\n            const PLANT_UNLOCKS = [\n                'sunflower',   // Level 1\n                'peashooter',  // Level 2\n                'wallnut',     // Level 3\n                'snowpea',     // Level 4\n                'cherrybomb',  // Level 5\n                'repeater',    // Level 6\n                'potatomine',  // Level 7\n                'squash',      // Level 8\n                'jalapeno',    // Level 9\n                'spikeweed',   // Level 10\n                'torchwood',   // Level 11\n                'tallnut',     // Level 12\n                'cactus',      // Level 13\n                'starfruit'    // Level 14\n            ];\n\n            // Zombie definitions - Expanded with PvZ-style zombies\n            const ZOMBIE_TYPES = {\n                basic: {\n                    name: 'Basic Zombie',\n                    health: 100, \n                    speed: 18,\n                    damage: 14, \n                    attackSpeed: 0.5,\n                    asset: 'zombie_basic_walk',\n                    eatAsset: 'zombie_basic_eat'\n                },\n                conehead: {\n                    name: 'Conehead Zombie',\n                    health: 280, \n                    speed: 18,\n                    damage: 14,\n                    attackSpeed: 0.5,\n                    asset: 'zombie_tank_walk',\n                    eatAsset: 'zombie_tank_eat'\n                },\n                buckethead: {\n                    name: 'Buckethead Zombie',\n                    health: 650,\n                    speed: 18,\n                    damage: 14,\n                    attackSpeed: 0.5,\n                    asset: 'zombie_buckethead_walk',\n                    eatAsset: 'zombie_buckethead_eat'\n                },\n                flag: {\n                    name: 'Flag Zombie',\n                    health: 100,\n                    speed: 22,\n                    damage: 14,\n                    attackSpeed: 0.5,\n                    asset: 'zombie_flag_walk',\n                    eatAsset: 'zombie_flag_eat'\n                },\n                newspaper: {\n                    name: 'Newspaper Zombie',\n                    health: 100,\n                    shieldHealth: 80,\n                    speed: 14,\n                    angrySpeed: 45,\n                    damage: 14,\n                    attackSpeed: 0.5,\n                    asset: 'zombie_newspaper_walk',\n                    angryAsset: 'zombie_newspaper_angry',\n                    eatAsset: 'zombie_newspaper_walk'\n                },\n                polevaulter: {\n                    name: 'Pole Vaulter Zombie',\n                    health: 170,\n                    speed: 28,\n                    jumpSpeed: 50,\n                    damage: 14,\n                    attackSpeed: 0.5,\n                    asset: 'zombie_pole_walk',\n                    jumpAsset: 'zombie_pole_jump',\n                    eatAsset: 'zombie_pole_walk',\n                    canJump: true\n                },\n                football: {\n                    name: 'Football Zombie',\n                    health: 560, \n                    speed: 35,\n                    damage: 14,\n                    attackSpeed: 0.3,\n                    asset: 'zombie_fast_walk',\n                    eatAsset: 'zombie_fast_eat'\n                },\n                gargantuar: {\n                    name: 'Gargantuar',\n                    health: 3000,\n                    speed: 10,\n                    damage: 100,\n                    attackSpeed: 1.5,\n                    asset: 'zombie_gargantuar_walk',\n                    eatAsset: 'zombie_gargantuar_smash',\n                    throwsImp: true,\n                    impThrowHealth: 1500\n                },\n                imp: {\n                    name: 'Imp',\n                    health: 70,\n                    speed: 40,\n                    damage: 14,\n                    attackSpeed: 0.4,\n                    asset: 'zombie_imp_walk',\n                    eatAsset: 'zombie_imp_eat'\n                },\n                // Backward compatibility aliases\n                fast: {\n                    name: 'Football Zombie',\n                    health: 560, \n                    speed: 35,\n                    damage: 14,\n                    attackSpeed: 0.3,\n                    asset: 'zombie_fast_walk',\n                    eatAsset: 'zombie_fast_eat'\n                },\n                tank: {\n                    name: 'Conehead Zombie',\n                    health: 280, \n                    speed: 18,\n                    damage: 14,\n                    attackSpeed: 0.5,\n                    asset: 'zombie_tank_walk',\n                    eatAsset: 'zombie_tank_eat'\n                }\n            };\n            // Game state\n            let currentLevel = 1;\n            let maxUnlockedLevel = 1;\n            let currentSun = 0;\n            let currentWave = 0;\n            let gameState = 'menu'; // menu, levelSelect, playing, paused, victory, defeat, selection\n            let plants = [];\n            let zombies = [];\n            let projectiles = [];\n            let fallingSuns = [];\n            let particles = [];\n            let visualEffects = []; // For big explosions and temporary sprites\n            let lawnMowers = [];\n            let plantCooldowns = {};\n            let selectedPlantType = null;\n            let selectedLoadout = [];\n            let waveTimer = 0;\n            let sunFallTimer = 0;\n            let plantsLost = 0;\n            let isWaveActive = false;\n            let isViewingLoadout = false; // Flag for loadout viewer mode\n            let nextWaveCountdown = 0;\n            let isTutorialActive = false;\n            let seenUnlocks = [];\n\n            let tutorialCallback = null;\n            window.nextTutorialStep = (step) => {\n                document.getElementById(`tutorial-step-${step}`).classList.add('hidden');\n                playSound('ui_click_short_sfx'); \n                \n                // Show UI after the 3rd popup (menu bar popup)\n                if (step === 3) {\n                    document.getElementById('top-ui').classList.remove('hidden');\n                    document.getElementById('bottom-ui').classList.remove('hidden');\n                    document.getElementById('plant-selection').classList.remove('hidden');\n                }\n\n                if (step < 4) {\n                    const nextStep = document.getElementById(`tutorial-step-${step + 1}`);\n                    if (nextStep) {\n                        nextStep.classList.remove('hidden');\n                        // Removed duplicate playSound call here to fix 'double sound' issue\n                    }\n                    else finishTutorial();\n                } else {\n                    finishTutorial();\n                }\n            };\n\n            function finishTutorial() {\n                isTutorialActive = false;\n                document.getElementById('tutorial-container').classList.add('hidden');\n                playSound('ui_click_short_sfx'); // Changed to plop\n                // Ensure UI is visible if tutorial was skipped or finished\n                document.getElementById('top-ui').classList.remove('hidden');\n                document.getElementById('bottom-ui').classList.remove('hidden');\n                document.getElementById('plant-selection').classList.remove('hidden');\n                \n                // Hide all steps\n                for (let i = 1; i <= 4; i++) {\n                    const step = document.getElementById(`tutorial-step-${i}`);\n                    if (step) step.classList.add('hidden');\n                }\n                \n                if (gameState === 'tutorial') {\n                    gameState = 'playing';\n                    if (tutorialCallback) {\n                        const cb = tutorialCallback;\n                        tutorialCallback = null;\n                        cb();\n                    } else {\n                        playBackgroundMusic();\n                    }\n                }\n            }\n\n            document.getElementById('tutorial-skip-all').addEventListener('click', () => {\n                playSound('ui_click_short_sfx');\n                finishTutorial();\n            });\n\n            let hasSeenStory = false;\n            let seenStories = [];\n\n            // Load saved progress\n            try {\n                const savedState = await lib.getUserGameState();\n                maxUnlockedLevel = 1; \n                if (savedState && savedState.state && savedState.state.maxUnlockedLevel) {\n                    maxUnlockedLevel = Math.max(1, savedState.state.maxUnlockedLevel);\n                    seenUnlocks = savedState.state.seenUnlocks || [];\n                    hasSeenStory = Boolean(savedState.state.hasSeenStory);\n                    lib.log(`Loaded progress: Level ${maxUnlockedLevel} unlocked, ${seenUnlocks.length} plants seen, story seen: ${hasSeenStory}`);\n                } else {\n                    lib.log('No saved progress found, starting fresh');\n                }\n                if (savedState && savedState.state && savedState.state.language && I18N[savedState.state.language]) {\n                    setLanguage(savedState.state.language, false);\n                }\n                if (savedState && savedState.state && Array.isArray(savedState.state.seenStories)) {\n                    seenStories = savedState.state.seenStories.filter(id => typeof id === 'string').slice(0, 32);\n                }\n            } catch (error) {\n                maxUnlockedLevel = 1;\n                lib.log(`Failed to load progress: ${error.message}`);\n            }\n\n            // Animated Story Cinematic Hook\n            const STORY_SCENES = [\n                {\n                    act: \"PROLOGUE \u2022 ACT 1\",\n                    bgAsset: 'day_grass_bg',\n                    narration: 'n1',\n                    sfx: 'sun_collect_sfx',\n                    vignetteStyle: 'radial-gradient(circle at center, rgba(255,235,59,0.1) 40%, rgba(0,0,0,0.5) 100%)',\n                    actors: [\n                        {\n                            asset: 'sunflower_idle',\n                            x: '22%',\n                            y: '58%',\n                            size: 155,\n                            animation: 'bounceActor 2.4s infinite ease-in-out, sunshineSparkle 3s infinite',\n                            bubble: { text: 'b1a', top: '36%', left: '12%' }\n                        },\n                        {\n                            asset: 'peashooter_idle',\n                            x: '64%',\n                            y: '62%',\n                            size: 140,\n                            animation: 'bounceActor 2s infinite ease-in-out 0.4s',\n                            bubble: { text: 'b1b', top: '44%', left: '46%' }\n                        },\n                        {\n                            asset: 'sun_icon',\n                            x: '46%',\n                            y: '20%',\n                            size: 85,\n                            animation: 'bounceActor 3s infinite ease-in-out, sunPulse 2s infinite'\n                        }\n                    ]\n                },\n                {\n                    act: \"PROLOGUE \u2022 ACT 2\",\n                    bgAsset: 'background_grass_road',\n                    shake: true,\n                    sfx: 'war_horn_start_sfx',\n                    narration: 'n2',\n                    vignetteStyle: 'radial-gradient(circle at center, rgba(120,0,0,0.2) 30%, rgba(20,5,10,0.85) 100%)',\n                    actors: [\n                        {\n                            asset: 'zombie_basic_walk',\n                            x: '24%',\n                            y: '52%',\n                            size: 175,\n                            animation: 'zombieMarch 1.4s infinite alternate ease-in-out',\n                            bubble: { text: 'b2a', top: '30%', left: '10%', isZombie: true }\n                        },\n                        {\n                            asset: 'zombie_tank_walk',\n                            x: '68%',\n                            y: '54%',\n                            size: 180,\n                            animation: 'zombieMarch 1.6s infinite alternate ease-in-out 0.3s',\n                            bubble: { text: 'b2b', top: '34%', left: '46%', isZombie: true }\n                        },\n                        {\n                            asset: 'peashooter_attacking',\n                            x: '14%',\n                            y: '80%',\n                            size: 115,\n                            animation: 'bounceActor 0.5s infinite ease-in-out',\n                            bubble: { text: 'b2c', top: '66%', left: '22%' }\n                        }\n                    ]\n                },\n                {\n                    act: \"PROLOGUE \u2022 ACT 3\",\n                    bgAsset: 'game_background_grass_road',\n                    sfx: 'explosion_sfx',\n                    shake: true,\n                    narration: 'n3',\n                    vignetteStyle: 'radial-gradient(circle at center, rgba(200,30,0,0.3) 20%, rgba(0,0,0,0.9) 100%)',\n                    actors: [\n                        {\n                            asset: 'zombie_gargantuar_walk',\n                            x: '46%',\n                            y: '42%',\n                            size: 240,\n                            animation: 'bounceActor 1.8s infinite ease-in-out',\n                            bubble: { text: 'b3a', top: '22%', left: '32%', isZombie: true }\n                        },\n                        {\n                            asset: 'zombie_newspaper_walk',\n                            x: '14%',\n                            y: '56%',\n                            size: 155,\n                            animation: 'zombieMarch 1.2s infinite alternate'\n                        },\n                        {\n                            asset: 'zombie_fast_walk',\n                            x: '76%',\n                            y: '58%',\n                            size: 155,\n                            animation: 'zombieMarch 1s infinite alternate'\n                        },\n                        {\n                            asset: 'lawn_mower',\n                            x: '48%',\n                            y: '84%',\n                            size: 96,\n                            animation: 'bounceActor 3s infinite ease-in-out'\n                        }\n                    ]\n                },\n                {\n                    act: \"PROLOGUE \u2022 ACT 4\",\n                    bgAsset: 'day_grass_bg',\n                    sfx: 'victory_sfx',\n                    isFinal: true,\n                    narration: 'n4',\n                    vignetteStyle: 'radial-gradient(circle at center, rgba(76,175,80,0.2) 30%, rgba(0,0,0,0.55) 100%)',\n                    actors: [\n                        {\n                            asset: 'sunflower_idle',\n                            x: '16%',\n                            y: '58%',\n                            size: 145,\n                            animation: 'bounceActor 2s infinite ease-in-out, sunshineSparkle 2s infinite',\n                            bubble: { text: 'b4a', top: '38%', left: '8%' }\n                        },\n                        {\n                            asset: 'wallnut_idle',\n                            x: '48%',\n                            y: '62%',\n                            size: 140,\n                            animation: 'bounceActor 2.2s infinite ease-in-out',\n                            bubble: { text: 'b4b', top: '44%', left: '32%' }\n                        },\n                        {\n                            asset: 'peashooter_attacking',\n                            x: '80%',\n                            y: '56%',\n                            size: 145,\n                            animation: 'bounceActor 1.6s infinite ease-in-out',\n                            bubble: { text: 'b4c', top: '36%', left: '50%' }\n                        },\n                        {\n                            asset: 'cherrybomb_idle',\n                            x: '50%',\n                            y: '82%',\n                            size: 120,\n                            animation: 'bounceActor 0.7s infinite alternate'\n                        }\n                    ]\n                }\n            ];\n\n            // ================= MINI STORIES (milestones, new threats, victories, defeats) =================\n            const LEVEL_INTRO_STORIES = { 5: 'i5', 6: 'i6', 10: 'i10', 15: 'i15', 20: 'i20' };\n            const LEVEL_WIN_STORIES = { 1: 'w1', 5: 'w5', 10: 'w10', 20: 'w20' };\n            const VIG_GREEN = 'radial-gradient(circle at center, rgba(76,175,80,0.2) 30%, rgba(0,0,0,0.55) 100%)';\n            const VIG_GOLD = 'radial-gradient(circle at center, rgba(255,215,0,0.25) 30%, rgba(0,0,0,0.5) 100%)';\n            const VIG_RED = 'radial-gradient(circle at center, rgba(150,0,0,0.25) 25%, rgba(20,0,5,0.88) 100%)';\n            const VIG_GRAY = 'radial-gradient(circle at center, rgba(60,60,80,0.3) 25%, rgba(0,0,0,0.9) 100%)';\n            const MINI_STORIES = {\n                w1: [{ badge: 'victory', badgeLevel: 1, bgAsset: 'day_grass_bg', sfx: 'plant_unlock_sfx', narration: 'w1n', isFinal: true, finalLabel: 'cont', vignetteStyle: VIG_GOLD,\n                    actors: [\n                        { asset: 'sunflower_idle', x: '28%', y: '44%', size: 150, animation: 'bounceActor 1.1s infinite ease-in-out, sunshineSparkle 2s infinite', bubble: { text: 'w1a', top: '18%', left: '4%' } },\n                        { asset: 'zombie_basic_walk', x: '72%', y: '70%', size: 130, animation: 'zombieMarch 1.2s infinite alternate', bubble: { text: 'w1b', top: '50%', left: '44%', isZombie: true } },\n                        { asset: 'peashooter_attacking', x: '22%', y: '84%', size: 120, animation: 'bounceActor 0.9s infinite ease-in-out' }\n                    ] }],\n                i5: [{ badge: 'badge_intro', badgeLevel: 5, bgAsset: 'background_grass_road', shake: true, sfx: 'war_horn_start_sfx', narration: 'i5n', isFinal: true, finalLabel: 'cont', vignetteStyle: VIG_RED,\n                    actors: [\n                        { asset: 'zombie_flag_walk', x: '28%', y: '44%', size: 175, animation: 'zombieMarch 1.3s infinite alternate ease-in-out', bubble: { text: 'i5a', top: '18%', left: '4%', isZombie: true } },\n                        { asset: 'zombie_buckethead_walk', x: '70%', y: '70%', size: 170, animation: 'zombieMarch 1.6s infinite alternate ease-in-out 0.3s', bubble: { text: 'i5b', top: '48%', left: '44%', isZombie: true } }\n                    ] }],\n                i6: [{ badge: 'badge_intro', badgeLevel: 6, bgAsset: 'game_background_grass_road', shake: true, sfx: 'wave_start_sfx', narration: 'i6n', isFinal: true, finalLabel: 'cont', vignetteStyle: VIG_RED,\n                    actors: [\n                        { asset: 'zombie_newspaper_walk', x: '28%', y: '44%', size: 170, animation: 'zombieMarch 1.4s infinite alternate', bubble: { text: 'i6a', top: '18%', left: '4%', isZombie: true } },\n                        { asset: 'zombie_pole_jump', x: '70%', y: '70%', size: 180, animation: 'bounceActor 0.9s infinite ease-in-out', bubble: { text: 'i6b', top: '48%', left: '44%', isZombie: true } }\n                    ] }],\n                w5: [{ badge: 'badge_mile', badgeLevel: 5, bgAsset: 'day_grass_bg', sfx: 'victory_sfx', narration: 'w5n', isFinal: true, finalLabel: 'cont', vignetteStyle: VIG_GOLD,\n                    actors: [\n                        { asset: 'sunflower_idle', x: '28%', y: '44%', size: 150, animation: 'bounceActor 1.2s infinite ease-in-out, sunshineSparkle 2s infinite', bubble: { text: 'w5a', top: '18%', left: '4%' } },\n                        { asset: 'wallnut_idle', x: '70%', y: '70%', size: 140, animation: 'bounceActor 2s infinite ease-in-out', bubble: { text: 'w5b', top: '50%', left: '44%' } },\n                        { asset: 'snowpea_idle', x: '22%', y: '84%', size: 115, animation: 'bounceActor 1.4s infinite ease-in-out 0.2s' }\n                    ] }],\n                i10: [{ badge: 'badge_intro', badgeLevel: 10, bgAsset: 'background_grass_road', shake: true, sfx: 'explosion_sfx', narration: 'i10n', isFinal: true, finalLabel: 'cont', vignetteStyle: VIG_RED,\n                    actors: [\n                        { asset: 'zombie_gargantuar_walk', x: '38%', y: '40%', size: 240, animation: 'bounceActor 1.8s infinite ease-in-out', bubble: { text: 'i10a', top: '10%', left: '4%', isZombie: true } },\n                        { asset: 'zombie_imp_walk', x: '80%', y: '56%', size: 100, animation: 'bounceActor 0.6s infinite ease-in-out', bubble: { text: 'i10b', top: '40%', left: '50%', isZombie: true } },\n                        { asset: 'peashooter_idle', x: '22%', y: '84%', size: 120, animation: 'zombieMarch 0.4s infinite alternate', bubble: { text: 'i10c', top: '66%', left: '4%' } }\n                    ] }],\n                w10: [{ badge: 'badge_mile', badgeLevel: 10, bgAsset: 'day_grass_bg', sfx: 'victory_sfx', narration: 'w10n', isFinal: true, finalLabel: 'cont', vignetteStyle: VIG_GREEN,\n                    actors: [\n                        { asset: 'peashooter_attacking', x: '28%', y: '44%', size: 145, animation: 'bounceActor 1s infinite ease-in-out', bubble: { text: 'w10a', top: '18%', left: '4%' } },\n                        { asset: 'zombie_imp_walk', x: '74%', y: '66%', size: 110, animation: 'zombieMarch 0.8s infinite alternate', bubble: { text: 'w10b', top: '48%', left: '44%', isZombie: true } },\n                        { asset: 'zombie_gargantuar_walk', x: '50%', y: '86%', size: 160, rotate: '80deg' }\n                    ] }],\n                i15: [{ badge: 'badge_intro', badgeLevel: 15, bgAsset: 'game_background_grass_road', shake: true, sfx: 'war_horn_start_sfx', narration: 'i15n', isFinal: true, finalLabel: 'cont', vignetteStyle: VIG_RED,\n                    actors: [\n                        { asset: 'cherrybomb_idle', x: '28%', y: '44%', size: 140, animation: 'bounceActor 0.6s infinite alternate', bubble: { text: 'i15a', top: '18%', left: '4%' } },\n                        { asset: 'zombie_flag_walk', x: '70%', y: '70%', size: 170, animation: 'zombieMarch 1.2s infinite alternate', bubble: { text: 'i15b', top: '48%', left: '44%', isZombie: true } },\n                        { asset: 'zombie_fast_walk', x: '22%', y: '84%', size: 140, animation: 'zombieMarch 0.9s infinite alternate' }\n                    ] }],\n                i20: [{ badge: 'badge_final', badgeLevel: 20, bgAsset: 'background_grass_road', shake: true, sfx: 'war_horn_start_sfx', narration: 'i20n', isFinal: true, finalLabel: 'defend', vignetteStyle: 'radial-gradient(circle at center, rgba(200,30,0,0.3) 20%, rgba(0,0,0,0.92) 100%)',\n                    actors: [\n                        { asset: 'zombie_gargantuar_smash', x: '68%', y: '36%', size: 230, animation: 'bounceActor 1.4s infinite ease-in-out', bubble: { text: 'i20a', top: '8%', left: '44%', isZombie: true } },\n                        { asset: 'sunflower_idle', x: '26%', y: '60%', size: 140, animation: 'bounceActor 1.6s infinite ease-in-out, sunshineSparkle 2s infinite', bubble: { text: 'i20b', top: '38%', left: '4%' } },\n                        { asset: 'tallnut_idle', x: '72%', y: '82%', size: 140, animation: 'bounceActor 2.2s infinite ease-in-out', bubble: { text: 'i20c', top: '62%', left: '46%' } }\n                    ] }],\n                w20: [{ badge: 'victory', badgeLevel: 20, bgAsset: 'day_grass_bg', sfx: 'victory_sfx', narration: 'w20n', isFinal: true, finalLabel: 'cont', vignetteStyle: VIG_GOLD,\n                    actors: [\n                        { asset: 'sunflower_idle', x: '26%', y: '40%', size: 150, animation: 'bounceActor 1s infinite ease-in-out, sunshineSparkle 1.5s infinite', bubble: { text: 'w20a', top: '14%', left: '4%' } },\n                        { asset: 'peashooter_attacking', x: '72%', y: '54%', size: 140, animation: 'bounceActor 0.9s infinite ease-in-out', bubble: { text: 'w20b', top: '32%', left: '46%' } },\n                        { asset: 'wallnut_idle', x: '28%', y: '84%', size: 130, animation: 'bounceActor 1.8s infinite ease-in-out', bubble: { text: 'w20c', top: '62%', left: '4%' } },\n                        { asset: 'sun_icon', x: '80%', y: '86%', size: 90, animation: 'bounceActor 2s infinite ease-in-out, sunPulse 2s infinite' }\n                    ] }],\n                l1: [{ badge: 'defeat', bgAsset: 'background_grass_road', sfx: null, narration: 'l1n', isFinal: true, finalLabel: 'cont', vignetteStyle: VIG_GRAY,\n                    actors: [\n                        { asset: 'sunflower_idle', x: '28%', y: '44%', size: 140, animation: 'bounceActor 2s infinite ease-in-out', bubble: { text: 'l1a', top: '18%', left: '4%' } },\n                        { asset: 'zombie_basic_eat', x: '70%', y: '70%', size: 170, animation: 'zombieMarch 0.5s infinite alternate', bubble: { text: 'l1b', top: '50%', left: '44%', isZombie: true } }\n                    ] }]\n            };\n\n            let activeScenes = STORY_SCENES;\n            let activeStoryId = 'prologue';\n\n            function playMiniStory(id, onComplete) {\n                const scenes = MINI_STORIES[id];\n                const storyScreenEl = document.getElementById('story-screen');\n                if (!scenes || !storyScreenEl || mode === 'edit' || seenStories.includes(id)) {\n                    if (onComplete) onComplete();\n                    return false;\n                }\n                seenStories.push(id);\n                const prevState = gameState;\n                activeScenes = scenes;\n                activeStoryId = id;\n                storyCurrentIndex = 0;\n                storyOnCompleteCallback = () => {\n                    if (gameState === 'story') gameState = prevState;\n                    if (onComplete) onComplete();\n                };\n                gameState = 'story';\n                storyScreenEl.classList.remove('hidden');\n                renderStoryScene(0);\n                initAudio();\n                return true;\n            }\n\n            let storyToastTimer = null;\n            function showStoryToast(asset, text, isZombie) {\n                const el = document.getElementById('story-toast');\n                const img = document.getElementById('story-toast-img');\n                const txt = document.getElementById('story-toast-text');\n                if (!el || mode === 'edit') return;\n                if (assetCache[asset]) { img.src = assetCache[asset].img.src; img.style.display = 'block'; } else { img.style.display = 'none'; }\n                txt.textContent = text;\n                txt.className = 'story-toast-bubble' + (isZombie ? ' zombie' : '');\n                el.classList.remove('hidden');\n                el.style.animation = 'none';\n                el.offsetHeight;\n                el.style.animation = '';\n                clearTimeout(storyToastTimer);\n                storyToastTimer = setTimeout(() => el.classList.add('hidden'), 3500);\n            }\n            let mowerToastShown = false;\n\n            let storyCurrentIndex = 0;\n            let storyOnCompleteCallback = null;\n\n            function playStory(onComplete) {\n                const storyScreenEl = document.getElementById('story-screen');\n                if (!storyScreenEl) {\n                    if (onComplete) onComplete();\n                    return;\n                }\n                \n                gameState = 'story';\n                stopBackgroundMusic();\n                activeScenes = STORY_SCENES;\n                activeStoryId = 'prologue';\n                storyOnCompleteCallback = onComplete;\n                storyCurrentIndex = 0;\n                \n                // Hide other screens\n                mainMenuEl.classList.add('hidden');\n                levelSelectionEl.classList.add('hidden');\n                topUI.classList.add('hidden');\n                bottomUI.classList.add('hidden');\n                \n                storyScreenEl.classList.remove('hidden');\n                renderStoryScene(0);\n                initAudio();\n            }\n\n            function renderStoryScene(index) {\n                const scene = activeScenes[index];\n                if (!scene) return;\n                \n                const bgImg = document.getElementById('story-bg-img');\n                const vignette = document.getElementById('story-vignette');\n                const actorsLayer = document.getElementById('story-actors-layer');\n                const chapterBadge = document.getElementById('story-chapter-badge');\n                const narrationText = document.getElementById('story-narration-text');\n                const nextBtn = document.getElementById('story-next-btn');\n                const dotsContainer = document.getElementById('story-progress-dots');\n                const stage = document.getElementById('story-stage');\n                \n                // Play scene SFX\n                if (scene.sfx) {\n                    playSound(scene.sfx);\n                }\n                \n                // Background\n                if (assetCache[scene.bgAsset]) {\n                    bgImg.src = assetCache[scene.bgAsset].img.src;\n                }\n                \n                // Vignette\n                if (scene.vignetteStyle) {\n                    vignette.style.background = scene.vignetteStyle;\n                }\n                \n                // Camera shake effect\n                if (scene.shake) {\n                    stage.style.animation = 'none';\n                    stage.offsetHeight; // trigger reflow\n                    stage.style.animation = 'dramaticShake 0.6s ease-in-out';\n                } else {\n                    stage.style.animation = 'none';\n                }\n                \n                // Chapter & Text\n                chapterBadge.textContent = scene.badge\n                    ? t(scene.badge) + (scene.badgeLevel ? ' \u2022 ' + t('level_n', { n: scene.badgeLevel }) : '')\n                    : t('act', { n: index + 1 });\n                narrationText.style.opacity = '0';\n                setTimeout(() => {\n                    narrationText.innerHTML = t(scene.narration);\n                    narrationText.style.opacity = '1';\n                }, 100);\n                \n                // Next Button\n                if (scene.isFinal) {\n                    nextBtn.textContent = t(scene.finalLabel || 'defend') + ' \u2794';\n                    nextBtn.style.background = 'linear-gradient(180deg, #ff9800 0%, #e65100 100%)';\n                    nextBtn.style.borderColor = '#bf360c';\n                    nextBtn.style.boxShadow = '0 5px 0 #870000, 0 8px 15px rgba(255,152,0,0.5)';\n                } else {\n                    nextBtn.textContent = t('next') + ' \u2794';\n                    nextBtn.style.background = 'linear-gradient(180deg, #4caf50 0%, #2e7d32 100%)';\n                    nextBtn.style.borderColor = '#1b5e20';\n                    nextBtn.style.boxShadow = '0 5px 0 #134217, 0 8px 15px rgba(0,0,0,0.4)';\n                }\n                \n                // Progress Dots\n                dotsContainer.innerHTML = '';\n                for (let i = 0; i < activeScenes.length; i++) {\n                    const dot = document.createElement('div');\n                    dot.className = `story-dot ${i === index ? 'active' : ''}`;\n                    dotsContainer.appendChild(dot);\n                }\n                \n                // Clear & Build Actors Layer\n                actorsLayer.innerHTML = '';\n                scene.actors.forEach((actor, actorIdx) => {\n                    const actorEl = document.createElement('div');\n                    actorEl.className = 'story-actor';\n                    actorEl.style.left = actor.x;\n                    actorEl.style.top = actor.y;\n                    actorEl.style.width = `${actor.size}px`;\n                    actorEl.style.height = `${actor.size}px`;\n                    actorEl.style.transform = 'translate(-50%, -50%)' + (actor.rotate ? ` rotate(${actor.rotate})` : '');\n                    \n                    if (actor.animation) {\n                        actorEl.style.animation = actor.animation;\n                    }\n                    \n                    if (assetCache[actor.asset]) {\n                        const img = document.createElement('img');\n                        img.src = assetCache[actor.asset].img.src;\n                        img.style.width = '100%';\n                        img.style.height = '100%';\n                        img.style.objectFit = 'contain';\n                        img.style.display = 'block';\n                        actorEl.appendChild(img);\n                    }\n                    \n                    actorsLayer.appendChild(actorEl);\n                    \n                    // Bubble if present\n                    if (actor.bubble) {\n                        const bubbleEl = document.createElement('div');\n                        bubbleEl.className = `story-comic-bubble ${actor.bubble.isZombie ? 'bubble-zombie' : ''}`;\n                        bubbleEl.textContent = t(actor.bubble.text);\n                        bubbleEl.style.top = actor.bubble.top;\n                        bubbleEl.style.left = actor.bubble.left;\n                        bubbleEl.style.animationDelay = `${0.2 + actorIdx * 0.15}s`;\n                        actorsLayer.appendChild(bubbleEl);\n                    }\n                });\n            }\n\n            function advanceStory() {\n                playSound('ui_click_short_sfx');\n                if (storyCurrentIndex < activeScenes.length - 1) {\n                    storyCurrentIndex++;\n                    renderStoryScene(storyCurrentIndex);\n                } else {\n                    finishStory();\n                }\n            }\n\n            async function finishStory() {\n                const storyScreenEl = document.getElementById('story-screen');\n                if (storyScreenEl) {\n                    storyScreenEl.classList.add('hidden');\n                }\n                \n                if (activeStoryId === 'prologue') hasSeenStory = true;\n                try {\n                    await lib.saveUserGameState({ maxUnlockedLevel, seenUnlocks, hasSeenStory, language: currentLanguage, seenStories });\n                } catch (e) {\n                    lib.log(`Failed saving story state: ${e.message}`);\n                }\n                \n                if (storyOnCompleteCallback) {\n                    const cb = storyOnCompleteCallback;\n                    storyOnCompleteCallback = null;\n                    cb();\n                }\n            }\n\n            document.getElementById('story-next-btn').addEventListener('click', (e) => {\n                e.stopPropagation();\n                advanceStory();\n            });\n\n            document.getElementById('story-stage').addEventListener('click', () => {\n                advanceStory();\n            });\n\n            document.getElementById('story-skip-btn').addEventListener('click', (e) => {\n                e.stopPropagation();\n                playSound('ui_click_short_sfx');\n                finishStory();\n            });\n\n            document.getElementById('story-btn').addEventListener('click', () => {\n                playSound('ui_click_short_sfx');\n                playStory(() => {\n                    // When replayed from Main Menu, return to Main Menu\n                    gameState = 'menu';\n                    mainMenuEl.classList.remove('hidden');\n                });\n            });\n\n            // UI elements\n            const sunIconUI = document.getElementById('sun-icon-ui');\n            const topUI = document.getElementById('top-ui');\n            const bottomUI = document.getElementById('bottom-ui');\n            const levelHeaderEl = document.getElementById('level-header');\n            const sunCountEl = document.getElementById('sun-count');\n            const waveIndicatorEl = document.getElementById('wave-indicator');\n            const phaseDisplayEl = document.getElementById('phase-display');\n            const nextWaveTimerEl = document.getElementById('next-wave-timer');\n            const plantSelectionEl = document.getElementById('plant-selection');\n            const mainMenuEl = document.getElementById('main-menu');\n            const levelSelectionEl = document.getElementById('level-selection');\n            const pauseMenuEl = document.getElementById('pause-menu');\n            const victoryScreenEl = document.getElementById('victory-screen');\n            const defeatScreenEl = document.getElementById('defeat-screen');\n            const selectionScreenEl = document.getElementById('selection-screen');\n            const selectionGridEl = document.getElementById('selection-grid');\n            const loadoutPreviewEl = document.getElementById('loadout-preview');\n            const selectionStatusEl = document.getElementById('selection-status');\n            const startLevelBtn = document.getElementById('start-level-btn');\n            const modeIndicatorEl = document.getElementById('mode-indicator');\n\n            // ================= SETTINGS / LANGUAGE UI =================\n            const settingsScreenEl = document.getElementById('settings-screen');\n            const languageSelectEl = document.getElementById('language-select');\n            languageSelectEl.innerHTML = '';\n            Object.keys(I18N).forEach(code => {\n                const opt = document.createElement('option');\n                opt.value = code;\n                opt.textContent = window.LANG_NAMES[code] || code;\n                languageSelectEl.appendChild(opt);\n            });\n            languageSelectEl.value = currentLanguage;\n\n            function openSettings() {\n                languageSelectEl.value = currentLanguage;\n                settingsScreenEl.classList.remove('hidden');\n                playSound('ui_click_short_sfx');\n                initAudio();\n            }\n            document.getElementById('settings-btn').addEventListener('click', openSettings);\n            document.getElementById('pause-settings-btn').addEventListener('click', openSettings);\n            document.getElementById('settings-close-btn').addEventListener('click', () => {\n                playSound('ui_click_short_sfx');\n                settingsScreenEl.classList.add('hidden');\n            });\n            languageSelectEl.addEventListener('change', (e) => {\n                setLanguage(e.target.value, true);\n                playSound('ui_click_short_sfx');\n            });\n\n            function refreshDynamicTexts() {\n                if (!uiReady) return;\n                try {\n                    const lc = window.gameConfig.levels[currentLevel - 1];\n                    levelHeaderEl.textContent = getLevelName(lc, currentLevel);\n                    if (lastPhaseInfo) {\n                        phaseDisplayEl.textContent = t('phase', { n: lastPhaseInfo.n, t: lastPhaseInfo.total });\n                    }\n                    if (!selectionScreenEl.classList.contains('hidden')) {\n                        updateSelectionUI(isViewingLoadout);\n                    }\n                    if (!document.getElementById('library-screen').classList.contains('hidden')) {\n                        updateLibraryUI();\n                    }\n                    if (currentUnlockType && !document.getElementById('unlock-popup').classList.contains('hidden')) {\n                        document.getElementById('unlock-name').textContent = t('p_' + currentUnlockType);\n                        document.getElementById('unlock-description').textContent = t('d_' + currentUnlockType);\n                    }\n                    languageSelectEl.value = currentLanguage;\n                } catch (e) {\n                    lib.log('Language refresh error: ' + e.message);\n                }\n            }\n            uiReady = true;\n            refreshDynamicTexts();\n            function showSelectionScreen() {\n                gameState = 'selection';\n                mainMenuEl.classList.add('hidden');\n                levelSelectionEl.classList.add('hidden');\n                selectionScreenEl.classList.remove('hidden');\n                \n                selectedLoadout = [];\n                updateSelectionUI();\n            }\n\n            function updateSelectionUI(readOnly = false) {\n                selectionGridEl.innerHTML = '';\n                loadoutPreviewEl.innerHTML = '';\n                \n                const levelConfig = window.gameConfig.levels[currentLevel - 1];\n                if (levelConfig) {\n                    const sunCount = document.getElementById('selection-sun-count');\n                    const sunIcon = document.getElementById('selection-sun-icon');\n                    if (sunCount) sunCount.textContent = levelConfig.startingSun || 0;\n                    if (sunIcon && assetCache['sun_icon']) sunIcon.src = assetCache['sun_icon'].img.src;\n                }\n                \n                // Show ALL plants from the unlock list\n                PLANT_UNLOCKS.forEach((type, index) => {\n                    const plantDef = PLANT_TYPES[type];\n                    if (!plantDef) return;\n\n                    const levelConfig = window.gameConfig.levels[currentLevel - 1];\n                    const plantCost = (levelConfig && levelConfig.plantCosts && levelConfig.plantCosts[type] !== undefined) \n                        ? levelConfig.plantCosts[type] \n                        : plantDef.cost;\n\n                    // Sunflower and Peashooter are Level 1. Others are Level index.\n                    const unlockLevelRequired = index <= 1 ? 1 : index;\n                    const isUnlocked = unlockLevelRequired <= maxUnlockedLevel;\n                    const isSelected = selectedLoadout.includes(type);\n                    \n                    const card = document.createElement('div');\n                    card.className = `plant-card ${isSelected ? 'selected' : ''} ${!isUnlocked ? 'disabled' : ''}`;\n                    card.style.margin = '0 auto';\n                    \n                    if (!isUnlocked) {\n                        card.style.filter = 'grayscale(1) brightness(0.4)';\n                        card.style.cursor = 'not-allowed';\n                    }\n                    \n                    const cardAsset = `plant_card_${type}`;\n                    if (assetCache[cardAsset]) {\n                        const img = document.createElement('img');\n                        img.className = 'plant-card-image';\n                        img.src = assetCache[cardAsset].img.src;\n                        card.appendChild(img);\n                    }\n                    \n                    const cost = document.createElement('div');\n                    cost.className = 'plant-card-cost';\n                    cost.innerHTML = `<img src=\"${assetCache['sun_icon'].img.src}\" style=\"width: 20px; height: 20px; margin-right: 5px;\"> ${plantCost}`;\n                    card.appendChild(cost);\n                    \n                    card.onclick = () => {\n                        if (readOnly) return; // Prevent changes in view mode\n                        if (!isUnlocked) return;\n                        if (isSelected) {\n                            selectedLoadout = selectedLoadout.filter(t => t !== type);\n                        } else if (selectedLoadout.length < 5) {\n                            selectedLoadout.push(type);\n                        }\n                        updateSelectionUI();\n                    };\n                    \n                    selectionGridEl.appendChild(card);\n                });\n                \n                // Preview slots\n                for (let i = 0; i < 5; i++) {\n                    const slot = document.createElement('div');\n                    slot.style.width = '96px';\n                    slot.style.height = '115px';\n                    slot.style.border = '3px dashed #5d4037';\n                    slot.style.borderRadius = '10px';\n                    slot.style.background = 'rgba(255,255,255,0.1)';\n                    slot.style.display = 'flex';\n                    slot.style.alignment = 'center';\n                    slot.style.justifyContent = 'center';\n                    \n                    if (selectedLoadout[i]) {\n                        const type = selectedLoadout[i];\n                        const plantDef = PLANT_TYPES[type];\n                        const levelConfig = window.gameConfig.levels[currentLevel - 1];\n                        const plantCost = Number((levelConfig && levelConfig.plantCosts && levelConfig.plantCosts[type] !== undefined) \n                            ? levelConfig.plantCosts[type] \n                            : (plantDef ? plantDef.cost : 0)) || 0;\n\n                        const card = document.createElement('div');\n                        card.className = 'plant-card';\n                        card.style.width = '100%';\n                        card.style.height = '100%';\n                        card.style.border = 'none';\n                        card.style.transform = 'none'; \n                        \n                        const cardAsset = `plant_card_${type}`;\n                        if (assetCache[cardAsset]) {\n                            const img = document.createElement('img');\n                            img.className = 'plant-card-image';\n                            img.src = assetCache[cardAsset].img.src;\n                            card.appendChild(img);\n                        }\n\n                        const costDiv = document.createElement('div');\n                        costDiv.className = 'plant-card-cost';\n                        costDiv.innerHTML = `<img src=\"${assetCache['sun_icon'].img.src}\" style=\"width: 20px; height: 20px; margin-right: 5px;\"> ${plantCost}`;\n                        card.appendChild(costDiv);\n                        \n                        card.onclick = () => {\n                            if (readOnly) return; // Prevent changes in view mode\n                            selectedLoadout = selectedLoadout.filter(t => t !== type);\n                            updateSelectionUI();\n                        };\n                        \n                        slot.appendChild(card);\n                        slot.style.border = '3px solid #5d4037';\n                        slot.style.background = '#f5f5f5';\n                    }\n                    \n                    loadoutPreviewEl.appendChild(slot);\n                }\n                \n                selectionStatusEl.textContent = t('selected', { n: selectedLoadout.length });\n                if (selectedLoadout.length > 0) {\n                    startLevelBtn.classList.remove('disabled');\n                    startLevelBtn.style.opacity = '1';\n                    startLevelBtn.style.cursor = 'pointer';\n                } else {\n                    startLevelBtn.classList.add('disabled');\n                    startLevelBtn.style.opacity = '0.5';\n                    startLevelBtn.style.cursor = 'not-allowed';\n                }\n            }\n            function setupLevelSelection() {\n                const levelGrid = document.getElementById('level-grid');\n                levelGrid.innerHTML = '';\n                \n                for (let i = 0; i < 20; i++) {\n                    const levelIndex = i;\n                    const levelNum = i + 1;\n                    const isLocked = levelNum > maxUnlockedLevel;\n                    \n                    const card = document.createElement('div');\n                    card.className = `level-card ${isLocked ? 'locked' : ''}`;\n                    \n                    const numDisplay = document.createElement('div');\n                    numDisplay.className = 'level-number';\n                    numDisplay.textContent = levelNum;\n                    card.appendChild(numDisplay);\n                    \n                    if (!isLocked) {\n                        card.addEventListener('click', () => {\n                            currentLevel = levelNum;\n                            // Only auto-select if maxUnlockedLevel is small AND we're on an early level\n                            if (maxUnlockedLevel < 5 && currentLevel < 5) {\n                                selectedLoadout = PLANT_UNLOCKS.filter((id, index) => index < (currentLevel + 1));\n                                if (currentLevel === 1 && !hasSeenStory && mode !== 'edit') {\n                                    playStory(() => {\n                                        startLevel();\n                                    });\n                                } else {\n                                    startLevel();\n                                }\n                            } else {\n                                showSelectionScreen();\n                            }\n                            initAudio();\n                        });\n                    }\n                    \n                    levelGrid.appendChild(card);\n                }\n            }\n            if (sunIconUI && assetCache['sun_icon']) {\n                sunIconUI.src = assetCache['sun_icon'].img.src;\n            }\n\n            const menuIcon = document.getElementById('menu-icon');\n            if (menuIcon && assetCache['menu_button']) {\n                menuIcon.src = assetCache['menu_button'].img.src;\n            }\n\n            const menuIconHud = document.getElementById('menu-icon-hud');\n            if (menuIconHud && assetCache['menu_button']) {\n                menuIconHud.src = assetCache['menu_button'].img.src;\n            }\n\n            const victoryBanner = document.getElementById('victory-banner');\n            if (victoryBanner && assetCache['victory_banner']) {\n                victoryBanner.src = assetCache['victory_banner'].img.src;\n            }\n\n            const defeatBanner = document.getElementById('defeat-banner');\n            if (defeatBanner && assetCache['defeat_banner']) {\n                defeatBanner.src = assetCache['defeat_banner'].img.src;\n            }\n\n            // Helper functions\n            function drawImage(asset, x, y, width, height) {\n                if (!assetCache[asset]) return;\n                const { img, info } = assetCache[asset];\n                \n                // Calculate aspect ratio\n                const aspectRatio = info.aspect_ratio ? info.aspect_ratio[0] / info.aspect_ratio[1] : 1;\n                \n                // Use contain scaling for game objects\n                let drawWidth = width;\n                let drawHeight = height;\n                \n                if (aspectRatio > 1) {\n                    drawHeight = width / aspectRatio;\n                } else {\n                    drawWidth = height * aspectRatio;\n                }\n                \n                const offsetX = (width - drawWidth) / 2;\n                const offsetY = (height - drawHeight) / 2;\n                \n                ctx.drawImage(img, x + offsetX, y + offsetY, drawWidth, drawHeight);\n            }\n\n            function drawImageCover(asset, x, y, width, height) {\n                if (!assetCache[asset]) return;\n                const { img, info } = assetCache[asset];\n                \n                const aspectRatio = info.aspect_ratio ? info.aspect_ratio[0] / info.aspect_ratio[1] : 1;\n                const targetRatio = width / height;\n                \n                let drawWidth, drawHeight, offsetX = 0, offsetY = 0;\n                \n                if (aspectRatio > targetRatio) {\n                    drawHeight = height;\n                    drawWidth = height * aspectRatio;\n                    offsetX = -(drawWidth - width) / 2;\n                } else {\n                    drawWidth = width;\n                    drawHeight = width / aspectRatio;\n                    offsetY = -(drawHeight - height) / 2;\n                }\n                \n                ctx.drawImage(img, x + offsetX, y + offsetY, drawWidth, drawHeight);\n            }\n\n            function getCellPosition(row, col) {\n                return {\n                    x: GRID_START_X + col * CELL_SIZE,\n                    y: GRID_START_Y + row * CELL_SIZE\n                };\n            }\n\n            function getCellFromPosition(x, y) {\n                const col = Math.floor((x - GRID_START_X) / CELL_SIZE);\n                const row = Math.floor((y - GRID_START_Y) / CELL_SIZE);\n                \n                if (col >= 0 && col < GRID_COLS && row >= 0 && row < GRID_ROWS) {\n                    return { row, col };\n                }\n                return null;\n            }\n\n            function isValidPlacement(row, col) {\n                return !plants.some(p => p.row === row && p.col === col);\n            }\n\n            function createPlant(type, row, col) {\n                const plantDef = PLANT_TYPES[type];\n                const pos = getCellPosition(row, col);\n                \n                const plant = {\n                    type,\n                    row,\n                    col,\n                    x: pos.x + CELL_SIZE / 2,\n                    y: pos.y + CELL_SIZE / 2,\n                    health: plantDef.health || 0,\n                    maxHealth: plantDef.health || 0,\n                    fireTimer: 0,\n                    sunTimer: type === 'sunflower' ? plantDef.sunInterval / 2 : 0, // Produce first sun faster\n                    fuseTimer: plantDef.fuseTime || 0,\n                    armTimer: type === 'potatomine' ? plantDef.armTime : 0,\n                    isArmed: false,\n                    scale: 0,\n                    dropY: -80, // Start higher for smooth drop-in\n                    isGround: plantDef.isGround || false,\n                    animTimer: 0,\n                    attacking: false,\n                    targetX: 0,\n                    jumpState: 'none',\n                    jumpTimer: 0\n                };\n                \n                return plant;\n            }\n\n            function createZombie(type, col, spawnY = null) {\n                const zombieDef = ZOMBIE_TYPES[type];\n                const pos = getCellPosition(GRID_ROWS, col);\n                \n                return {\n                    type,\n                    col,\n                    x: pos.x + CELL_SIZE / 2,\n                    y: spawnY !== null ? spawnY : pos.y + CELL_SIZE / 2,\n                    health: zombieDef.health,\n                    maxHealth: zombieDef.health,\n                    shieldHealth: zombieDef.shieldHealth || 0,\n                    maxShieldHealth: zombieDef.shieldHealth || 0,\n                    speed: zombieDef.speed,\n                    attackTimer: 0,\n                    slowTimer: 0,\n                    slowFactor: 1,\n                    attacking: false,\n                    hasJumped: false,\n                    isJumping: false,\n                    jumpTimer: 0,\n                    isAngry: false,\n                    hasThrownImp: false\n                };\n            }\n\n            function createProjectile(plant, type) {\n                const plantDef = PLANT_TYPES[type];\n                return {\n                    type,\n                    col: plant.col,\n                    x: plant.x,\n                    y: plant.y + CELL_SIZE / 4,\n                    speed: plantDef.projectileSpeed, // Move DOWN\n                    damage: plantDef.damage,\n                    slowEffect: plantDef.slowEffect,\n                    slowDuration: plantDef.slowDuration\n                };\n            }\n\n            function createFallingSun() {\n                const x = Math.random() * (canvas.width - 48) + 24;\n                let targetY = Math.random() * (GRID_ROWS * CELL_SIZE - 150) + GRID_START_Y + 50;\n                \n                // Avoid the timer area (centered, around y=320)\n                const isNearCenterHorizontally = x > canvas.width * 0.3 && x < canvas.width * 0.7;\n                // If it's in the vertical zone of the timer, push it down\n                if (isNearCenterHorizontally && targetY > 250 && targetY < 400) {\n                    targetY = 400 + Math.random() * 100; \n                }\n\n                return {\n                    x,\n                    y: -48,\n                    targetY: targetY,\n                    speed: 100,\n                    value: 25,\n                    collected: false,\n                    life: 10 // Sun disappears after 10 seconds\n                };\n            }\n\n            function createParticle(x, y, type) {\n                return {\n                    x,\n                    y,\n                    vx: (Math.random() - 0.5) * 200,\n                    vy: (Math.random() - 0.5) * 200,\n                    life: 1,\n                    maxLife: 1,\n                    type\n                };\n            }\n\n            // Game logic functions\n            function placePlant(type, row, col) {\n                const levelConfig = window.gameConfig.levels[currentLevel - 1];\n                if (!levelConfig) return;\n                \n                const plantDef = PLANT_TYPES[type];\n                const cost = Number((levelConfig && levelConfig.plantCosts && levelConfig.plantCosts[type] !== undefined)\n                    ? levelConfig.plantCosts[type]\n                    : (plantDef ? plantDef.cost : 0)) || 0;\n                \n                if (currentSun < cost) return false;\n                if (!isValidPlacement(row, col)) return false;\n                if (plantCooldowns[type] && plantCooldowns[type] > 0) return false;\n                \n                currentSun -= cost;\n                plants.push(createPlant(type, row, col));\n                plantCooldowns[type] = plantDef.cooldown;\n                \n                playSound('plant_place_sfx');\n                initAudio();\n                \n                return true;\n            }\n            function updatePlants(dt) {\n                plants.forEach(plant => {\n                    const plantDef = PLANT_TYPES[plant.type];\n                    \n                    // Smooth drop-in animation\n                    if (plant.scale < 1) {\n                        plant.animTimer += dt;\n                        // Elastic out easing\n                        const t = Math.min(1, plant.animTimer * 2);\n                        const elastic = 1 - Math.pow(1 - t, 3) * (1 - t * Math.sin(t * Math.PI * 3.5));\n                        plant.scale = elastic;\n                        plant.dropY = -80 * (1 - elastic);\n                    } else {\n                        plant.scale = 1;\n                        if (plant.jumpState === 'none') {\n                            plant.dropY = 0;\n                        }\n                    }\n                    \n                    // Sunflower sun generation\n                    if (plant.type === 'sunflower') {\n                        plant.sunTimer += dt;\n                        if (plant.sunTimer >= plantDef.sunInterval) {\n                            plant.sunTimer = 0;\n                            const sun = {\n                                x: plant.x,\n                                y: plant.y,\n                                targetY: plant.y + 40,\n                                speed: 50,\n                                value: plantDef.sunGeneration || 25,\n                                collected: false,\n                                fromPlant: true,\n                                life: 10\n                            };\n                            fallingSuns.push(sun);\n                        }\n                    }\n                    \n                    // Attacking plants\n                    if (plantDef.fireRate) {\n                        plant.fireTimer += dt;\n                        \n                        // Check for zombies in lane (column) - BELOW the plant\n                        const gridBottomEdge = GRID_START_Y + GRID_ROWS * CELL_SIZE;\n                        const zombieInLane = zombies.some(z => z.col === plant.col && z.y > plant.y && z.y <= gridBottomEdge);\n                        \n                    if (zombieInLane && plant.fireTimer >= plantDef.fireRate) {\n                        plant.fireTimer = 0;\n                        plant.attacking = true;\n                        \n                        if (plant.type === 'repeater') {\n                            // Double shot\n                            projectiles.push(createProjectile(plant, plant.type));\n                            setTimeout(() => {\n                                if (plants.includes(plant)) {\n                                    projectiles.push(createProjectile(plant, plant.type));\n                                    playSound('pea_shoot_sfx');\n                                }\n                            }, 200);\n                        } else if (plant.type === 'starfruit') {\n                            // 5-way shot\n                            const angles = [0, 72, 144, 216, 288].map(a => (a + 90) * Math.PI / 180);\n                            angles.forEach(angle => {\n                                projectiles.push({\n                                    type: plant.type,\n                                    col: plant.col,\n                                    x: plant.x,\n                                    y: plant.y,\n                                    vx: Math.cos(angle) * plantDef.projectileSpeed,\n                                    vy: Math.sin(angle) * plantDef.projectileSpeed,\n                                    damage: plantDef.damage\n                                });\n                            });\n                        } else {\n                            projectiles.push(createProjectile(plant, plant.type));\n                        }\n                        \n                        playSound('pea_shoot_sfx');\n                        \n                        if (plant.type !== 'repeater') {\n                            setTimeout(() => {\n                                plant.attacking = false;\n                            }, 200);\n                        } else {\n                            setTimeout(() => {\n                                plant.attacking = false;\n                            }, 400);\n                        }\n                    }\n                }\n                    \n                // Squash logic\n                if (plant.type === 'squash' && !plant.attacking) {\n                    const gridBottomEdge = GRID_START_Y + GRID_ROWS * CELL_SIZE;\n                    const targetZombie = zombies.find(z => z.col === plant.col && z.y > plant.y && Math.abs(z.y - plant.y) < CELL_SIZE * 1.5 && z.y <= gridBottomEdge);\n                    if (targetZombie) {\n                        plant.attacking = true;\n                        plant.targetY = targetZombie.y;\n                        plant.jumpState = 'up';\n                        plant.jumpTimer = 0;\n                    }\n                }\n                \n                if (plant.type === 'squash' && plant.attacking) {\n                    plant.jumpTimer += dt;\n                    if (plant.jumpState === 'up') {\n                        plant.dropY = -150 * (plant.jumpTimer / 0.5);\n                        if (plant.jumpTimer >= 0.5) {\n                            plant.jumpState = 'down';\n                            plant.jumpTimer = 0;\n                            plant.y = plant.targetY;\n                        }\n                    } else if (plant.jumpState === 'down') {\n                        plant.dropY = -150 * (1 - (plant.jumpTimer / 0.3));\n                        if (plant.jumpTimer >= 0.3) {\n                            // Smash!\n                            zombies.forEach(z => {\n                                if (z.col === plant.col && Math.abs(z.y - plant.y) < CELL_SIZE * 1.0) {\n                                    z.health -= plantDef.damage;\n                                }\n                            });\n                            visualEffects.push({\n                                x: plant.x,\n                                y: plant.y,\n                                asset: 'explosion_effect',\n                                life: 0.3,\n                                maxLife: 0.3,\n                                size: CELL_SIZE * 2\n                            });\n                            playSound('explosion_sfx');\n                            plant.health = 0; // Destroy self\n                            plant.isInstant = true;\n                        }\n                    }\n                }\n\n                // Jalapeno logic\n                if (plant.type === 'jalapeno') {\n                    plant.animTimer += dt;\n                    if (plant.animTimer >= 1.0) {\n                        // Explode lane (column) - only zombies on the grid\n                        const gridTopEdge = GRID_START_Y;\n                        const gridBottomEdge = GRID_START_Y + GRID_ROWS * CELL_SIZE;\n                        zombies.forEach(z => {\n                            if (z.col === plant.col && z.y >= gridTopEdge && z.y <= gridBottomEdge) {\n                                z.health -= plantDef.damage;\n                            }\n                        });\n                        visualEffects.push({\n                            x: plant.x,\n                            y: canvas.height / 2,\n                            asset: 'explosion_effect',\n                            life: 1.0,\n                            maxLife: 1.0,\n                            size: canvas.height * 2\n                        });\n                        playSound('explosion_sfx');\n                        plant.health = 0;\n                        plant.isInstant = true;\n                    }\n                }\n                    \n                    // Cherry Bomb fuse\n                    if (plant.type === 'cherrybomb') {\n                        plant.fuseTimer -= dt;\n                        \n                        // Pulsing effect as it gets closer to exploding\n                        const fuseProgress = 1 - (plant.fuseTimer / plantDef.fuseTime);\n                        if (fuseProgress > 0) {\n                            plant.scale = 1 + Math.sin(fuseProgress * 20) * 0.1 * fuseProgress;\n                        }\n\n                        if (plant.fuseTimer <= 0) {\n                            explodeCherryBomb(plant);\n                        }\n                    }\n\n                    // Potato Mine arming\n                    if (plant.type === 'potatomine' && !plant.isArmed) {\n                        plant.armTimer -= dt;\n                        if (plant.armTimer <= 0) {\n                            plant.isArmed = true;\n                            // Visual hint for arming\n                            particles.push(createParticle(plant.x, plant.y, 'explosion'));\n                        }\n                    }\n                });\n                \n                // Remove dead plants\n                plants = plants.filter(plant => {\n                    if (plant.health <= 0) {\n                        if (plant.wasEaten) plantsLost++;\n                        return false;\n                    }\n                    if (plant.type === 'cherrybomb' && plant.fuseTimer <= 0) {\n                        return false;\n                    }\n                    if (plant.type === 'potatomine' && plant.health <= 0) {\n                        return false;\n                    }\n                    return true;\n                });\n            }\n\n            function explodeCherryBomb(plant) {\n                const plantDef = PLANT_TYPES['cherrybomb'];\n                const explosionRadius = plantDef.explosionRadius * CELL_SIZE;\n                const gridRightEdge = GRID_START_X + GRID_COLS * CELL_SIZE;\n                \n                // Damage all zombies in radius that are on the grid\n                zombies.forEach(zombie => {\n                    const dx = zombie.x - plant.x;\n                    const dy = zombie.y - plant.y;\n                    const distance = Math.sqrt(dx * dx + dy * dy);\n                    \n                    if (distance <= explosionRadius && zombie.x <= gridRightEdge) {\n                        zombie.health -= plantDef.damage;\n                    }\n                });\n                \n                // Create a big visual explosion effect\n                visualEffects.push({\n                    x: plant.x,\n                    y: plant.y,\n                    asset: 'explosion_effect',\n                    life: 0.8,\n                    maxLife: 0.8,\n                    size: explosionRadius * 2\n                });\n\n                // Create small explosion particles\n                for (let i = 0; i < 20; i++) {\n                    particles.push(createParticle(plant.x, plant.y, 'explosion'));\n                }\n                \n                playSound('explosion_sfx');\n            }\n\n            function explodePotatoMine(plant) {\n                const plantDef = PLANT_TYPES['potatomine'];\n                \n                // Damage zombies in immediate cell\n                zombies.forEach(zombie => {\n                    const dx = zombie.x - plant.x;\n                    const dy = zombie.y - plant.y;\n                    const distance = Math.sqrt(dx * dx + dy * dy);\n                    \n                    if (distance <= CELL_SIZE * 0.6) {\n                        zombie.health -= plantDef.damage;\n                    }\n                });\n                \n                visualEffects.push({\n                    x: plant.x,\n                    y: plant.y,\n                    asset: 'explosion_effect',\n                    life: 0.5,\n                    maxLife: 0.5,\n                    size: CELL_SIZE * 1.2\n                });\n\n                for (let i = 0; i < 10; i++) {\n                    particles.push(createParticle(plant.x, plant.y, 'explosion'));\n                }\n                \n                playSound('explosion_sfx');\n            }\n\n            function updateZombies(dt) {\n                const zombiesToSpawn = [];\n                \n                zombies.forEach(zombie => {\n                    const zombieDef = ZOMBIE_TYPES[zombie.type];\n                    \n                    // Spikeweed damage\n                    const spikeweed = plants.find(p => p.type === 'spikeweed' && p.col === zombie.col && Math.abs(p.y - zombie.y) < CELL_SIZE / 2);\n                    if (spikeweed) {\n                        zombie.health -= PLANT_TYPES.spikeweed.damage * dt;\n                    }\n\n                    // Update slow effect\n                    if (zombie.slowTimer > 0) {\n                        zombie.slowTimer -= dt;\n                        if (zombie.slowTimer <= 0) {\n                            zombie.slowFactor = 1;\n                        }\n                    }\n                    \n                    // Newspaper zombie shield and anger mechanic\n                    if (zombie.type === 'newspaper' && zombie.shieldHealth > 0) {\n                        // Shield takes damage first (handled in projectile collision)\n                    }\n                    if (zombie.type === 'newspaper' && zombie.shieldHealth <= 0 && !zombie.isAngry) {\n                        zombie.isAngry = true;\n                        zombie.speed = zombieDef.angrySpeed;\n                    }\n                    \n                    // Gargantuar throws imp at half health\n                    if (zombie.type === 'gargantuar' && !zombie.hasThrownImp && zombie.health <= zombieDef.impThrowHealth) {\n                        zombie.hasThrownImp = true;\n                        // Throw imp ahead\n                        zombiesToSpawn.push({\n                            type: 'imp',\n                            col: zombie.col,\n                            y: zombie.y - CELL_SIZE * 2\n                        });\n                    }\n                    \n                    // Check for plants to attack (ignore ground plants)\n                    const plantToAttack = plants.find(p => \n                        p.col === zombie.col && \n                        Math.abs(p.y - zombie.y) < CELL_SIZE / 2 &&\n                        !p.isGround\n                    );\n                    \n                    // Pole vaulter jump logic\n                    if (zombie.type === 'polevaulter' && plantToAttack && !zombie.hasJumped && !zombie.isJumping) {\n                        if (plantToAttack.type === 'tallnut') {\n                            zombie.hasJumped = true;\n                            zombie.speed = zombieDef.speed * 0.6;\n                        } else {\n                            zombie.isJumping = true;\n                            zombie.jumpTimer = 0;\n                            zombie.jumpTargetY = plantToAttack.y - CELL_SIZE;\n                        }\n                    }\n                    \n                    if (zombie.isJumping) {\n                        zombie.jumpTimer += dt;\n                        const jumpDuration = 0.5;\n                        if (zombie.jumpTimer < jumpDuration) {\n                            // Jump animation - move upward fast to clear the plant\n                            const jumpDistance = zombie.y - zombie.jumpTargetY;\n                            zombie.y -= (jumpDistance / (jumpDuration - zombie.jumpTimer)) * dt;\n                        } else {\n                            zombie.isJumping = false;\n                            zombie.hasJumped = true;\n                            zombie.y = zombie.jumpTargetY;\n                            zombie.speed = zombieDef.speed * 0.6; // Slower after jumping\n                        }\n                        return; // Skip normal movement during jump\n                    }\n                    \n                    if (plantToAttack && !(zombie.type === 'polevaulter' && !zombie.hasJumped)) {\n                        zombie.attacking = true;\n                        zombie.attackTimer += dt;\n\n                        // Check for Potato Mine explosion\n                        if (plantToAttack.type === 'potatomine' && plantToAttack.isArmed) {\n                            plantToAttack.health = 0; // Trigger removal\n                            explodePotatoMine(plantToAttack);\n                            return;\n                        }\n\n                        // Slow effect also affects attack speed\n                        const effectiveAttackSpeed = zombieDef.attackSpeed / zombie.slowFactor;\n                        if (zombie.attackTimer >= effectiveAttackSpeed) {\n                            zombie.attackTimer = 0;\n                            \n                            // Gargantuar does massive damage\n                            const damageDealt = zombie.type === 'gargantuar' ? zombieDef.damage : zombieDef.damage;\n                            plantToAttack.health -= damageDealt;\n                            plantToAttack.shakeTimer = 0.2; // Add a shake effect when bitten\n                            \n                            // Emit leaf particles on bite\n                            for (let i = 0; i < 3; i++) {\n                                particles.push({\n                                    x: plantToAttack.x + (Math.random() - 0.5) * 20,\n                                    y: plantToAttack.y + (Math.random() - 0.5) * 20,\n                                    vx: (Math.random() - 0.5) * 100,\n                                    vy: (Math.random() - 0.5) * 100 - 50,\n                                    life: 0.5,\n                                    maxLife: 0.5,\n                                    type: 'leaf'\n                                });\n                            }\n\n                            if (plantToAttack.health <= 0) plantToAttack.wasEaten = true;\n                        }\n                    } else {\n                        // Move toward house (UP)\n                        zombie.attacking = false;\n                        const currentSpeed = zombie.isAngry ? zombieDef.angrySpeed || zombie.speed : zombie.speed;\n                        zombie.y -= currentSpeed * zombie.slowFactor * dt;\n                        zombie.attackTimer = 0;\n                    }\n                });\n                \n                // Spawn any new zombies (from Gargantuar throwing imps)\n                zombiesToSpawn.forEach(z => {\n                    zombies.push(createZombie(z.type, z.col, z.y));\n                });\n                \n                // Remove dead zombies\n                zombies = zombies.filter(zombie => {\n                    if (zombie.health <= 0) {\n                        playSound('critter_defeat_sfx');\n                        for (let i = 0; i < 5; i++) {\n                            particles.push(createParticle(zombie.x, zombie.y, 'zombie'));\n                        }\n                        return false;\n                    }\n                    return true;\n                });\n                \n                // Check for zombies reaching house or triggering lawn mowers\n                const houseY = GRID_START_Y;\n                zombies.forEach(zombie => {\n                    if (zombie.y < houseY + 40) {\n                        const mower = lawnMowers.find(m => m.col === zombie.col && !m.triggered);\n                        if (mower) {\n                            mower.triggered = true;\n                            playSound('explosion_sfx');\n                            if (!mowerToastShown) {\n                                mowerToastShown = true;\n                                showStoryToast('lawn_mower', '\ud83d\ude9c ' + t('mower'), false);\n                            }\n                            mower.y = zombie.y - 40; // Snap to zombie so it kills it on next frame\n                        } else if (zombie.y < houseY) {\n                            gameState = 'defeat';\n                            showDefeatScreen();\n                        }\n                    }\n                });\n            }\n\n            function updateLawnMowers(dt) {\n                lawnMowers.forEach(mower => {\n                    if (mower.triggered) {\n                        mower.y += 400 * dt; // Move DOWN\n                        \n                        // Kill zombies in lane - only if they are on the grid\n                        const gridBottomEdge = GRID_START_Y + GRID_ROWS * CELL_SIZE;\n                        zombies.forEach(zombie => {\n                            if (zombie.col === mower.col && zombie.y < mower.y + CELL_SIZE/2 && zombie.y <= gridBottomEdge) {\n                                zombie.health = 0;\n                            }\n                        });\n                    }\n                });\n                \n                // Remove off-screen lawn mowers\n                lawnMowers = lawnMowers.filter(m => m.y < canvas.height + 100);\n            }\n\n            function updateProjectiles(dt) {\n                projectiles.forEach(projectile => {\n                    if (projectile.vx !== undefined) {\n                        projectile.x += projectile.vx * dt;\n                        projectile.y += projectile.vy * dt;\n                    } else {\n                        projectile.y += projectile.speed * dt; // speed is negative for UP\n                    }\n                    \n                    // Torchwood check\n                    if (projectile.type !== 'starfruit' && !projectile.isFire) {\n                        const torchwood = plants.find(p => p.type === 'torchwood' && p.col === projectile.col && Math.abs(p.y - projectile.y) < CELL_SIZE / 2);\n                        if (torchwood) {\n                            projectile.isFire = true;\n                            projectile.damage *= 2;\n                        }\n                    }\n\n                    // Check collision with zombies\n                    const hitZombie = zombies.find(z => \n                        Math.abs(z.x - projectile.x) < CELL_SIZE / 2 &&\n                        Math.abs(z.y - projectile.y) < CELL_SIZE * 0.6\n                    );\n                    \n                    if (hitZombie) {\n                        // Handle newspaper zombie shield\n                        if (hitZombie.type === 'newspaper' && hitZombie.shieldHealth > 0) {\n                            hitZombie.shieldHealth -= projectile.damage;\n                            if (hitZombie.shieldHealth <= 0) {\n                                hitZombie.shieldHealth = 0;\n                            }\n                        } else {\n                            hitZombie.health -= projectile.damage;\n                        }\n                        projectile.hit = true;\n                        \n                        // Apply slow effect\n                        if (projectile.slowEffect) {\n                            hitZombie.slowFactor = projectile.slowEffect;\n                            hitZombie.slowTimer = projectile.slowDuration;\n                        }\n                    }\n                });\n                \n                // Remove hit or off-screen projectiles\n                projectiles = projectiles.filter(p => !p.hit && p.y > -50 && p.y < canvas.height + 50);\n            }\n\n            function updateFallingSuns(dt) {\n                fallingSuns.forEach(sun => {\n                    if (!sun.collected) {\n                        if (sun.y < sun.targetY) {\n                            sun.y += sun.speed * dt;\n                        } else {\n                            // Only decrease life when it has reached its target (on ground)\n                            sun.life -= dt;\n                            \n                            // Auto-collect after 10 seconds on the ground\n                            if (sun.life <= 0) {\n                                currentSun += sun.value;\n                                updateSunUI();\n                                sun.collected = true;\n                                playSound('sun_collect_sfx');\n                            }\n                        }\n                    }\n                });\n                \n                // Remove only collected suns (sun stays on ground until auto-collected)\n                fallingSuns = fallingSuns.filter(sun => !sun.collected);\n            }\n\n            function updateParticles(dt) {\n                particles.forEach(particle => {\n                    particle.x += particle.vx * dt;\n                    particle.y += particle.vy * dt;\n                    particle.life -= dt;\n                });\n                \n                particles = particles.filter(p => p.life > 0);\n            }\n\n            function updateVisualEffects(dt) {\n                visualEffects.forEach(effect => {\n                    effect.life -= dt;\n                });\n                visualEffects = visualEffects.filter(e => e.life > 0);\n            }\n\n            function updateWaves(dt) {\n                const levelConfig = window.gameConfig.levels[currentLevel - 1];\n                if (!levelConfig) return;\n                \n                if (currentLevel <= 5) {\n                    // Continuous mode for levels 1-5: only one starting countdown\n                    if (currentWave < levelConfig.waves.length) {\n                        nextWaveCountdown -= dt;\n                        \n                        // Show countdown ONLY for the first wave (preparation)\n                        if (currentWave === 0) {\n                            if (nextWaveCountdown > 0) {\n                                nextWaveTimerEl.classList.remove('hidden');\n                                nextWaveTimerEl.textContent = t('prep', { s: Math.ceil(nextWaveCountdown) });\n                            } else {\n                                nextWaveTimerEl.classList.add('hidden');\n                                spawnNextWave(levelConfig);\n                            }\n                        } else if (nextWaveCountdown <= 0) {\n                            // Subsequent waves spawn without visible timer or announcement\n                            spawnNextWave(levelConfig);\n                        }\n                    } else {\n                        // All phases spawned, now wait for all zombies to be defeated for victory\n                        if (zombies.length === 0 && spawnQueue.length === 0) {\n                            gameState = 'victory';\n                            showVictoryScreen();\n                        }\n                    }\n                } else {\n                    // Standard wave system for levels > 5: waits for screen to clear\n                    if (isWaveActive) {\n                        // During a wave, check if all zombies are defeated\n                        if (zombies.length === 0 && spawnQueue.length === 0) {\n                            if (currentWave >= levelConfig.waves.length) {\n                                gameState = 'victory';\n                                showVictoryScreen();\n                            } else {\n                                // Current phase zombies killed, prepare for next\n                                isWaveActive = false;\n                                nextWaveCountdown = 20;\n                                nextWaveTimerEl.classList.remove('hidden');\n                            }\n                        }\n                    } else {\n                        // Between waves, countdown\n                        nextWaveCountdown -= dt;\n                        if (nextWaveCountdown > 0) {\n                            nextWaveTimerEl.classList.remove('hidden');\n                            nextWaveTimerEl.textContent = t('next_phase', { s: Math.ceil(nextWaveCountdown) });\n                        } else {\n                            nextWaveTimerEl.classList.add('hidden');\n                            spawnNextWave(levelConfig);\n                        }\n                    }\n                }\n            }\n\n            function spawnNextWave(levelConfig) {\n                const currentWaveConfig = levelConfig.waves[currentWave];\n                if (currentWaveConfig) {\n                    spawnWave(currentWaveConfig);\n                    currentWave++;\n                    isWaveActive = true;\n\n                    // Live comic callout for the final wave\n                    if (levelConfig.waves.length > 1 && currentWave === levelConfig.waves.length) {\n                        showStoryToast('zombie_flag_walk', '\u26a0\ufe0f ' + t('final_wave'), true);\n                    }\n                    \n                    // Announcements only for Level > 5 OR for the first wave of Level <= 5\n                    if (currentLevel > 5 || currentWave === 1) {\n                        showWaveAnnouncement(currentWave, levelConfig.waves.length);\n                        playSound('war_horn_start_sfx'); \n                        if (currentLevel > 5) {\n                            updatePhaseDisplay(currentWave, levelConfig.waves.length);\n                        }\n                    }\n                    \n                    // For levels 1-5, set a fixed 15s delay for the next \"direct\" phase\n                    if (currentLevel <= 5 && currentWave < levelConfig.waves.length) {\n                        nextWaveCountdown = 15;\n                    }\n                }\n            }\n\n            function updatePhaseDisplay(wave, total) {\n                lastPhaseInfo = { n: wave, total };\n                phaseDisplayEl.textContent = t('phase', { n: wave, t: total });\n                phaseDisplayEl.classList.remove('hidden');\n            }\n\n            function showWaveAnnouncement(wave, total) {\n                const waveText = document.getElementById('wave-text');\n                const waveBannerImg = document.getElementById('wave-banner-img');\n                \n                waveText.textContent = t('phase_start', { n: wave });\n                if (assetCache['wave_banner_bg']) {\n                    waveBannerImg.src = assetCache['wave_banner_bg'].img.src;\n                }\n                \n                waveIndicatorEl.classList.remove('hidden');\n                waveIndicatorEl.style.opacity = '1';\n                \n                setTimeout(() => {\n                    waveIndicatorEl.style.opacity = '0';\n                    setTimeout(() => {\n                        waveIndicatorEl.classList.add('hidden');\n                    }, 500);\n                }, 3000);\n            }\n\n            function spawnWave(waveConfig) {\n                const zombieTypes = [\n                    { type: 'basic', count: waveConfig.basicCount || 0 },\n                    { type: 'conehead', count: waveConfig.coneheadCount || waveConfig.tankCount || 0 },\n                    { type: 'buckethead', count: waveConfig.bucketheadCount || 0 },\n                    { type: 'flag', count: waveConfig.flagCount || 0 },\n                    { type: 'newspaper', count: waveConfig.newspaperCount || 0 },\n                    { type: 'polevaulter', count: waveConfig.polevaulterCount || 0 },\n                    { type: 'football', count: waveConfig.footballCount || waveConfig.fastCount || 0 },\n                    { type: 'gargantuar', count: waveConfig.gargantuarCount || 0 },\n                    { type: 'imp', count: waveConfig.impCount || 0 }\n                ];\n                \n                let spawnDelay = 0;\n                \n                // Flag zombies spawn first to signal wave\n                const flagZombies = zombieTypes.find(z => z.type === 'flag');\n                if (flagZombies && flagZombies.count > 0) {\n                    for (let i = 0; i < flagZombies.count; i++) {\n                        spawnQueue.push({\n                            type: 'flag',\n                            time: spawnDelay,\n                            spawned: false\n                        });\n                        spawnDelay += 0.3;\n                    }\n                }\n                \n                // Then other zombies\n                zombieTypes.forEach(({ type, count }) => {\n                    if (type === 'flag') return; // Already handled\n                    for (let i = 0; i < count; i++) {\n                        spawnQueue.push({\n                            type,\n                            time: spawnDelay,\n                            spawned: false\n                        });\n                        spawnDelay += 0.5;\n                    }\n                });\n            }\n\n            function updateSpawnQueue(dt) {\n                spawnQueue.forEach(item => {\n                    item.time -= dt;\n                    if (item.time <= 0 && !item.spawned) {\n                        const col = Math.floor(Math.random() * GRID_COLS);\n                        zombies.push(createZombie(item.type, col));\n                        item.spawned = true;\n                    }\n                });\n                spawnQueue = spawnQueue.filter(item => !item.spawned);\n            }\n\n            function updateSunFall(dt) {\n                const levelConfig = window.gameConfig.levels[currentLevel - 1];\n                if (!levelConfig) return;\n                \n                // Logic: More sunflowers = faster sun fall from the sky. \n                // Also faster in higher levels to \"compete faster\".\n                const numSunflowers = plants.filter(p => p.type === 'sunflower').length;\n                const levelBoost = 1 + (currentLevel - 1) * 0.1; // 10% faster per level\n                const sunflowerBoost = 1 + (numSunflowers * 0.15); // 15% faster per sunflower\n                \n                const effectiveRate = levelConfig.sunFallRate / (levelBoost * sunflowerBoost);\n                \n                sunFallTimer += dt;\n                if (sunFallTimer >= effectiveRate) {\n                    sunFallTimer = 0;\n                    fallingSuns.push(createFallingSun());\n                }\n            }\n\n            function updateCooldowns(dt) {\n                Object.keys(plantCooldowns).forEach(type => {\n                    if (plantCooldowns[type] > 0) {\n                        plantCooldowns[type] = Math.max(0, plantCooldowns[type] - dt);\n                    }\n                });\n            }\n\n            // Rendering functions\n            function render(dt) {\n                ctx.clearRect(0, 0, canvas.width, canvas.height);\n                \n                // Draw background\n                if (assetCache['game_background_grass_road']) {\n                    drawImageCover('game_background_grass_road', 0, 0, canvas.width, canvas.height);\n                } else if (assetCache['plain_grass_bg']) {\n                    drawImageCover('plain_grass_bg', 0, 0, canvas.width, canvas.height);\n                } else if (assetCache['background_grass_road_v2']) {\n                    drawImageCover('background_grass_road_v2', 0, 0, canvas.width, canvas.height);\n                } else if (assetCache['background_grass_road']) {\n                    drawImageCover('background_grass_road', 0, 0, canvas.width, canvas.height);\n                } else if (assetCache['background_garden_final']) {\n                    drawImageCover('background_garden_final', 0, 0, canvas.width, canvas.height);\n                } else if (assetCache['background_day_road_complete']) {\n                    drawImageCover('background_day_road_complete', 0, 0, canvas.width, canvas.height);\n                } else {\n                    // Fallback to old background style\n                    drawImageCover('day_grass_bg', 0, 0, canvas.width, canvas.height);\n                    drawImage('home_entrance_top', 0, 0, canvas.width, 192);\n                }\n                \n                // Draw grid overlay with improved visuals\n                ctx.strokeStyle = 'rgba(255, 255, 255, 0.15)';\n                ctx.lineWidth = 2;\n                \n                // Draw grid background with rounded corners effect\n                ctx.save();\n                ctx.fillStyle = 'rgba(0, 0, 0, 0.1)';\n                // Draw rounded rectangle for grid background\n                const bgPadding = 8;\n                const bgRadius = 12;\n                ctx.beginPath();\n                ctx.roundRect(GRID_START_X - bgPadding, GRID_START_Y - bgPadding, GRID_WIDTH + bgPadding * 2, GRID_HEIGHT + bgPadding * 2, bgRadius);\n                ctx.fill();\n                ctx.restore();\n                \n                for (let row = 0; row < GRID_ROWS; row++) {\n                    for (let col = 0; col < GRID_COLS; col++) {\n                        const pos = getCellPosition(row, col);\n                        // Alternating checkerboard pattern with softer colors\n                        ctx.fillStyle = (row + col) % 2 === 0 ? 'rgba(76, 175, 80, 0.15)' : 'rgba(56, 142, 60, 0.2)';\n                        ctx.fillRect(pos.x + 2, pos.y + 2, CELL_SIZE - 4, CELL_SIZE - 4);\n                        \n                        // Subtle inner border for each cell\n                        ctx.strokeStyle = 'rgba(255, 255, 255, 0.08)';\n                        ctx.lineWidth = 1;\n                        ctx.strokeRect(pos.x + 2, pos.y + 2, CELL_SIZE - 4, CELL_SIZE - 4);\n                    }\n                }\n                \n                // Draw grid lines\n                ctx.strokeStyle = 'rgba(93, 64, 55, 0.4)';\n                ctx.lineWidth = 2;\n                ctx.beginPath();\n                for (let row = 0; row <= GRID_ROWS; row++) {\n                    const y = GRID_START_Y + row * CELL_SIZE;\n                    ctx.moveTo(GRID_START_X, y);\n                    ctx.lineTo(GRID_START_X + GRID_WIDTH, y);\n                }\n                for (let col = 0; col <= GRID_COLS; col++) {\n                    const x = GRID_START_X + col * CELL_SIZE;\n                    ctx.moveTo(x, GRID_START_Y);\n                    ctx.lineTo(x, GRID_START_Y + GRID_HEIGHT);\n                }\n                ctx.stroke();\n                \n                // Draw outer border for grid with rounded corners\n                ctx.strokeStyle = 'rgba(93, 64, 55, 0.7)';\n                ctx.lineWidth = 4;\n                ctx.beginPath();\n                ctx.roundRect(GRID_START_X - 2, GRID_START_Y - 2, GRID_WIDTH + 4, GRID_HEIGHT + 4, 10);\n                ctx.stroke();\n                \n                // Draw plants\n                plants.forEach(plant => {\n                    const plantDef = PLANT_TYPES[plant.type];\n                    const size = CELL_SIZE * 0.9 * plant.scale;\n                    \n                    // Procedural Idle Animation for professional look\n                    const time = Date.now() * 0.003;\n                    const sway = Math.sin(time + (plant.row * 10) + (plant.col * 5)) * 0.05;\n                    const breath = 1.0 + Math.sin(time * 0.8 + (plant.row * 2)) * 0.03;\n                    \n                    // Shake effect when being eaten\n                    let shakeX = 0;\n                    if (plant.shakeTimer > 0) {\n                        shakeX = Math.sin(Date.now() * 0.05) * 5;\n                        plant.shakeTimer -= dt;\n                    }\n\n                    ctx.save();\n                    ctx.translate(plant.x + shakeX, plant.y + plant.dropY);\n                    ctx.scale(plant.scale * breath, plant.scale * breath);\n                    ctx.rotate(sway);\n                    \n                    const asset = plant.attacking && plantDef.attackAsset ? plantDef.attackAsset : (plant.type === 'potatomine' && plant.isArmed ? plantDef.armedAsset : plantDef.idleAsset);\n                    drawImage(asset, -size / 2, -size / 2, size, size);\n                    \n                    ctx.restore();\n                    \n                    // Draw health bar\n                    if (plantDef.health) {\n                        const barWidth = CELL_SIZE * 0.8;\n                        const barHeight = 6;\n                        const barX = plant.x - barWidth / 2;\n                        const barY = plant.y - CELL_SIZE / 2 - 10;\n                        \n                        ctx.fillStyle = 'rgba(0, 0, 0, 0.5)';\n                        ctx.fillRect(barX, barY, barWidth, barHeight);\n                        \n                        const healthPercent = plant.health / plant.maxHealth;\n                        ctx.fillStyle = healthPercent > 0.5 ? '#4CAF50' : healthPercent > 0.25 ? '#FFA726' : '#F44336';\n                        ctx.fillRect(barX, barY, barWidth * healthPercent, barHeight);\n                    }\n                });\n                \n                // Draw zombies\n                zombies.forEach(zombie => {\n                    const zombieDef = ZOMBIE_TYPES[zombie.type];\n                    let size = CELL_SIZE * 1.0; // Slightly larger for zombies\n                    \n                    // Gargantuar is much bigger\n                    if (zombie.type === 'gargantuar') {\n                        size = CELL_SIZE * 1.6;\n                    }\n                    // Imp is smaller\n                    if (zombie.type === 'imp') {\n                        size = CELL_SIZE * 0.6;\n                    }\n                    \n                    // Procedural Animation\n                    let bobY = 0;\n                    let rotation = 0;\n                    let bobX = 0;\n                    let scaleX = 1;\n                    let scaleY = 1;\n                    const time = Date.now() * 0.005;\n                    \n                    if (zombie.isJumping) {\n                        // Pole vaulter jump animation\n                        rotation = -0.3;\n                        bobY = -20;\n                    } else if (zombie.attacking) {\n                        // Enhanced munching animation - lunge UP toward plant\n                        const munchSpeed = 8; // Faster munching\n                        const munchCycle = Date.now() * 0.01 * munchSpeed;\n                        \n                        // Lunge toward plant (negative Y = up)\n                        bobY = Math.sin(munchCycle) * 12 - 8;\n                        \n                        // Head shake while eating\n                        bobX = Math.sin(munchCycle * 1.5) * 4;\n                        \n                        // Chomping scale effect\n                        const chompPhase = Math.sin(munchCycle * 2);\n                        scaleX = 1 + chompPhase * 0.08;\n                        scaleY = 1 - chompPhase * 0.05;\n                        \n                        // Aggressive head tilt\n                        rotation = Math.sin(munchCycle * 0.8) * 0.15;\n                    } else {\n                        // Walking bob and sway\n                        const speedFactor = zombie.isAngry ? 2 : 1;\n                        bobY = Math.abs(Math.sin(time * 2 * speedFactor)) * -5;\n                        rotation = Math.sin(time * speedFactor) * 0.1;\n                    }\n\n                    ctx.save();\n                    ctx.translate(zombie.x + bobX, zombie.y + bobY);\n                    ctx.rotate(rotation);\n                    ctx.scale(scaleX, scaleY);\n                    \n                    // Tint if slowed\n                    if (zombie.slowTimer > 0) {\n                        ctx.save();\n                        ctx.globalAlpha = 0.5;\n                        ctx.fillStyle = '#00BCD4';\n                        // Draw a circle behind to show frozen status\n                        ctx.beginPath();\n                        ctx.arc(0, 0, size/2, 0, Math.PI * 2);\n                        ctx.fill();\n                        ctx.restore();\n                    }\n                    \n                    // Red tint for angry newspaper zombie\n                    if (zombie.isAngry) {\n                        ctx.save();\n                        ctx.globalAlpha = 0.3;\n                        ctx.fillStyle = '#FF0000';\n                        ctx.beginPath();\n                        ctx.arc(0, 0, size/2, 0, Math.PI * 2);\n                        ctx.fill();\n                        ctx.restore();\n                    }\n                    \n                    // Determine which asset to use - eating takes priority when attacking\n                    let asset = zombieDef.asset;\n                    if (zombie.isJumping && zombieDef.jumpAsset) {\n                        asset = zombieDef.jumpAsset;\n                    } else if (zombie.attacking && zombieDef.eatAsset) {\n                        // Eating animation takes priority when attacking a plant\n                        asset = zombieDef.eatAsset;\n                        // Angry newspaper zombie uses angry asset even when eating\n                        if (zombie.isAngry && zombie.type === 'newspaper') {\n                            asset = zombieDef.angryAsset || zombieDef.eatAsset;\n                        }\n                    } else if (zombie.isAngry && zombieDef.angryAsset) {\n                        asset = zombieDef.angryAsset;\n                    }\n                    \n                    drawImage(asset, -size / 2, -size / 2, size, size);\n                    ctx.restore();\n                    \n                    // Draw health bar\n                    const barWidth = CELL_SIZE * 0.6;\n                    const barHeight = 6;\n                    const barX = zombie.x - barWidth / 2;\n                    const barY = zombie.y - size / 2 - 15;\n                    \n                    // Shield bar for newspaper zombie\n                    if (zombie.type === 'newspaper' && zombie.shieldHealth > 0) {\n                        ctx.fillStyle = 'rgba(100, 100, 100, 0.7)';\n                        ctx.fillRect(barX, barY - 8, barWidth, 4);\n                        const shieldPercent = zombie.shieldHealth / zombie.maxShieldHealth;\n                        ctx.fillStyle = '#888888';\n                        ctx.fillRect(barX, barY - 8, barWidth * shieldPercent, 4);\n                    }\n                    \n                    ctx.fillStyle = 'rgba(0, 0, 0, 0.5)';\n                    ctx.fillRect(barX, barY, barWidth, barHeight);\n                    \n                    const healthPercent = zombie.health / zombie.maxHealth;\n                    ctx.fillStyle = healthPercent > 0.5 ? '#4CAF50' : healthPercent > 0.25 ? '#FFA726' : '#F44336';\n                    ctx.fillRect(barX, barY, barWidth * healthPercent, barHeight);\n                });\n                \n                // Draw projectiles\n                projectiles.forEach(projectile => {\n                    const plantDef = PLANT_TYPES[projectile.type];\n                    const size = projectile.isFire ? 24 : 16;\n                    let asset = plantDef.projectileAsset;\n                    if (projectile.isFire && assetCache['fire_pea_projectile']) {\n                        asset = 'fire_pea_projectile';\n                    }\n                    drawImage(asset, projectile.x - size / 2, projectile.y - size / 2, size, size);\n                });\n                \n                // Draw falling suns\n                fallingSuns.forEach(sun => {\n                    const size = 48;\n                    if (sun.life !== undefined && sun.life < 2.5 && Math.floor(Date.now() / 150) % 2 === 0) return;\n                    drawImage('sun_icon', sun.x - size / 2, sun.y - size / 2, size, size);\n                });\n                \n                // Draw lawn mowers\n                lawnMowers.forEach(mower => {\n                    const size = CELL_SIZE * 0.8;\n                    drawImage('lawn_mower', mower.x - size / 2, mower.y - size / 2, size, size);\n                });\n\n                // Draw big visual effects (like Cherry Bomb explosion)\n                visualEffects.forEach(effect => {\n                    ctx.save();\n                    // Fade out effect\n                    ctx.globalAlpha = Math.min(1, effect.life * 2);\n                    // Scale up effect\n                    const scale = 1 + (1 - effect.life / effect.maxLife) * 0.2;\n                    const currentSize = effect.size * scale;\n                    drawImage(effect.asset, effect.x - currentSize / 2, effect.y - currentSize / 2, currentSize, currentSize);\n                    ctx.restore();\n                });\n                \n                // Draw particles\n                particles.forEach(particle => {\n                    ctx.save();\n                    ctx.globalAlpha = particle.life / particle.maxLife;\n                    \n                    if (particle.type === 'explosion') {\n                        ctx.fillStyle = '#FF5722';\n                        ctx.beginPath();\n                        ctx.arc(particle.x, particle.y, 8, 0, Math.PI * 2);\n                        ctx.fill();\n                    } else if (particle.type === 'zombie') {\n                        ctx.fillStyle = '#4CAF50';\n                        ctx.beginPath();\n                        ctx.arc(particle.x, particle.y, 4, 0, Math.PI * 2);\n                        ctx.fill();\n                    } else if (particle.type === 'leaf') {\n                        ctx.fillStyle = '#8BC34A';\n                        ctx.beginPath();\n                        ctx.arc(particle.x, particle.y, 3, 0, Math.PI * 2);\n                        ctx.fill();\n                    }\n                    \n                    ctx.restore();\n                });\n                \n                // Draw selected plant preview\n                if (selectedPlantType && mousePos) {\n                    const cell = getCellFromPosition(mousePos.x, mousePos.y);\n                    if (cell) {\n                        const pos = getCellPosition(cell.row, cell.col);\n                        const valid = isValidPlacement(cell.row, cell.col);\n                        \n                        ctx.save();\n                        ctx.fillStyle = valid ? 'rgba(255, 255, 255, 0.3)' : 'rgba(244, 67, 54, 0.3)';\n                        ctx.fillRect(pos.x, pos.y, CELL_SIZE, CELL_SIZE);\n                        \n                        ctx.strokeStyle = valid ? '#4CAF50' : '#F44336';\n                        ctx.lineWidth = 3;\n                        ctx.strokeRect(pos.x, pos.y, CELL_SIZE, CELL_SIZE);\n                        ctx.restore();\n                        \n                        const plantDef = PLANT_TYPES[selectedPlantType];\n                        const size = CELL_SIZE * 0.9;\n                        ctx.save();\n                        ctx.globalAlpha = 0.7;\n                        drawImage(plantDef.idleAsset, pos.x + (CELL_SIZE - size) / 2, pos.y + (CELL_SIZE - size) / 2, size, size);\n                        ctx.restore();\n                    }\n                }\n            }\n\n            // UI functions\n            function setupPlantCards() {\n                plantSelectionEl.innerHTML = '';\n                plantCardElements = {};\n                \n                const levelConfig = window.gameConfig.levels[currentLevel - 1];\n                if (!levelConfig) return;\n                \n                selectedLoadout.forEach(type => {\n                    const card = document.createElement('div');\n                    card.className = 'plant-card';\n                    card.dataset.type = type;\n                    const plantDef = PLANT_TYPES[type];\n                    \n                    const cardAsset = `plant_card_${type}`;\n                    if (assetCache[cardAsset]) {\n                        const img = document.createElement('img');\n                        img.className = 'plant-card-image';\n                        img.src = assetCache[cardAsset].img.src;\n                        card.appendChild(img);\n                    }\n                    \n                    const cost = document.createElement('div');\n                    cost.className = 'plant-card-cost';\n                    const plantCost = Number((levelConfig.plantCosts && levelConfig.plantCosts[type] !== undefined) \n                        ? levelConfig.plantCosts[type] \n                        : (plantDef ? plantDef.cost : 0)) || 0;\n                    cost.innerHTML = `<img src=\"${assetCache['sun_icon'].img.src}\" style=\"width: 14px; height: 14px; margin-right: 3px;\"> <span>${plantCost}</span>`;\n                    card.appendChild(cost);\n\n                    const cooldownOverlay = document.createElement('div');\n                    cooldownOverlay.className = 'plant-card-cooldown hidden';\n                    card.appendChild(cooldownOverlay);\n                    \n                    card.addEventListener('click', () => {\n                        if (card.classList.contains('disabled')) return;\n                        \n                        document.querySelectorAll('.plant-card').forEach(c => c.classList.remove('selected'));\n                        \n                        if (selectedPlantType === type) {\n                            selectedPlantType = null;\n                        } else {\n                            selectedPlantType = type;\n                            card.classList.add('selected');\n                        }\n                        \n                        initAudio();\n                    });\n                    \n                    plantSelectionEl.appendChild(card);\n                    plantCardElements[type] = { card, costEl: cost, cooldownEl: cooldownOverlay };\n                });\n            }\n\n            function updatePlantCards() {\n                const levelConfig = window.gameConfig.levels[currentLevel - 1];\n                if (!levelConfig) return;\n                \n                Object.keys(plantCardElements).forEach(type => {\n                    const { card, costEl, cooldownEl } = plantCardElements[type];\n                    const plantDef = PLANT_TYPES[type];\n                    const cost = Number((levelConfig.plantCosts && levelConfig.plantCosts[type] !== undefined) \n                        ? levelConfig.plantCosts[type] \n                        : (plantDef ? plantDef.cost : 0)) || 0;\n                    const cooldown = plantCooldowns[type] || 0;\n                    \n                    // Update disabled state\n                    if (currentSun < cost || cooldown > 0) {\n                        card.classList.add('disabled');\n                    } else {\n                        card.classList.remove('disabled');\n                    }\n                    \n                    // Update cooldown display\n                    if (cooldown > 0) {\n                        cooldownEl.classList.remove('hidden');\n                        cooldownEl.textContent = Math.ceil(cooldown);\n                    } else {\n                        cooldownEl.classList.add('hidden');\n                    }\n                });\n            }\n\n            function startLevel() {\n                const levelConfig = window.gameConfig.levels[currentLevel - 1];\n                if (!levelConfig) return;\n\n                // Mini story intro for major levels (new zombie threats / final battle)\n                const introStoryId = LEVEL_INTRO_STORIES[currentLevel];\n                if (introStoryId && mode !== 'edit' && !seenStories.includes(introStoryId)) {\n                    stopBackgroundMusic();\n                    playMiniStory(introStoryId, () => startLevel());\n                    return;\n                }\n                \n                // Finalize setup first so background/HUD/Garden are visible (\"inside game screen\")\n                finalizeStartLevel(levelConfig);\n                \n                // Check for new plant unlocks\n                const newUnlocks = [];\n                if (currentLevel === 1) {\n                    // Level 1: Always Sunflower and Peashooter\n                    newUnlocks.push(PLANT_UNLOCKS[0]);\n                    newUnlocks.push(PLANT_UNLOCKS[1]);\n                } else if (currentLevel < PLANT_UNLOCKS.length) {\n                    newUnlocks.push(PLANT_UNLOCKS[currentLevel]);\n                }\n                \n                // Filter unlocks by plants not already seen\n                const selectedUnlocks = newUnlocks.filter(type => \n                    !seenUnlocks.includes(type)\n                );\n                \n                // New Sequence Logic: Tutorial first, then unlocks\n                if (currentLevel === 1 && mode !== 'edit') {\n                    startTutorial(() => {\n                        if (selectedUnlocks.length > 0) {\n                            const prevState = gameState;\n                            gameState = 'paused';\n                            stopBackgroundMusic();\n                            showUnlockPopups(selectedUnlocks, () => {\n                                gameState = prevState;\n                                playBackgroundMusic();\n                            });\n                        } else {\n                            playBackgroundMusic();\n                        }\n                    });\n                } else {\n                    if (selectedUnlocks.length > 0) {\n                        const prevState = gameState;\n                        gameState = 'paused';\n                        stopBackgroundMusic();\n                        \n                        showUnlockPopups(selectedUnlocks, () => {\n                            gameState = prevState;\n                            playBackgroundMusic();\n                        });\n                    } else {\n                        playBackgroundMusic();\n                    }\n                }\n            }\n\n            async function showUnlockPopups(types, callback) {\n                if (types.length === 0) {\n                    callback();\n                    return;\n                }\n                \n                const type = types[0];\n                const plantDef = PLANT_TYPES[type];\n                const levelConfig = window.gameConfig.levels[currentLevel - 1];\n                const plantCost = Number((levelConfig && levelConfig.plantCosts && levelConfig.plantCosts[type] !== undefined) \n                    ? levelConfig.plantCosts[type] \n                    : (plantDef ? plantDef.cost : 0)) || 0;\n\n                const popup = document.getElementById('unlock-popup');\n                const cardContainer = document.getElementById('unlock-card-container');\n                const nameEl = document.getElementById('unlock-name');\n                const descEl = document.getElementById('unlock-description');\n                const continueBtn = document.getElementById('unlock-continue-btn');\n                \n                cardContainer.innerHTML = '';\n                \n                // Create a full plant card for consistency\n                const card = document.createElement('div');\n                card.className = 'plant-card';\n                card.style.width = '120px';\n                card.style.height = '145px';\n                card.style.cursor = 'default';\n                card.style.transform = 'none';\n\n                const cardAsset = `plant_card_${type}`;\n                if (assetCache[cardAsset]) {\n                    const img = document.createElement('img');\n                    img.className = 'plant-card-image';\n                    img.src = assetCache[cardAsset].img.src;\n                    card.appendChild(img);\n                }\n\n                const costDiv = document.createElement('div');\n                costDiv.className = 'plant-card-cost';\n                costDiv.style.fontSize = '24px';\n                costDiv.style.height = '40px';\n                costDiv.innerHTML = `<img src=\"${assetCache['sun_icon'].img.src}\" style=\"width: 24px; height: 24px; margin-right: 8px;\"> ${plantCost}`;\n                card.appendChild(costDiv);\n                \n                cardContainer.appendChild(card);\n                \n                currentUnlockType = type;\n                nameEl.textContent = t('p_' + type);\n                descEl.textContent = t('d_' + type) || t('new_plant_desc');\n                \n                popup.classList.remove('hidden');\n                playSound('plant_unlock_sfx'); // Reward fanfare for new plant!\n                \n                // Mark this plant as seen and save immediately\n                if (!seenUnlocks.includes(type)) {\n                    seenUnlocks.push(type);\n                    try {\n                        await lib.saveUserGameState({ maxUnlockedLevel, seenUnlocks, hasSeenStory, language: currentLanguage, seenStories });\n                        lib.log(`Saved seen unlock for ${plantDef.name}`);\n                    } catch (error) {\n                        lib.log(`Failed to save progress: ${error.message}`);\n                    }\n                }\n                \n                continueBtn.onclick = () => {\n                    playSound('ui_click_short_sfx');\n                    popup.classList.add('hidden');\n                    showUnlockPopups(types.slice(1), callback);\n                };\n            }\n\n            function finalizeStartLevel(levelConfig) {\n                gameState = 'playing';\n                const storyEl = document.getElementById('story-screen');\n                if (storyEl) storyEl.classList.add('hidden');\n                selectionScreenEl.classList.add('hidden');\n                document.getElementById('library-screen').classList.add('hidden');\n                document.getElementById('tutorial-container').classList.add('hidden');\n                document.getElementById('unlock-popup').classList.add('hidden');\n                currentSun = Number(levelConfig.startingSun) || 0;\n                currentWave = 0;\n                plants = [];\n                zombies = [];\n                projectiles = [];\n                fallingSuns = [];\n                particles = [];\n                lawnMowers = [];\n                for (let c = 0; c < GRID_COLS; c++) {\n                    const pos = getCellPosition(0, c);\n                    lawnMowers.push({\n                        col: c,\n                        x: pos.x + CELL_SIZE / 2,\n                        y: pos.y - CELL_SIZE * 0.4,\n                        triggered: false\n                    });\n                }\n                spawnQueue = [];\n                plantCooldowns = {};\n                selectedPlantType = null;\n                waveTimer = 0;\n                sunFallTimer = 0;\n                plantsLost = 0;\n                isWaveActive = false;\n                mowerToastShown = false;\n                const toastEl = document.getElementById('story-toast');\n                if (toastEl) toastEl.classList.add('hidden');\n                // Initial countdown for first wave - increased to 25s as requested\n                nextWaveCountdown = 25; \n                nextWaveTimerEl.style.bottom = '140px';\n                nextWaveTimerEl.style.top = 'auto';\n                nextWaveTimerEl.textContent = t('prep', { s: 25 });\n                nextWaveTimerEl.classList.remove('hidden');\n            // Hide phase display for levels 1-5\n            if (currentLevel <= 5) {\n                lastPhaseInfo = null;\n                phaseDisplayEl.classList.add('hidden');\n            } else {\n                updatePhaseDisplay(1, levelConfig.waves.length);\n            }\n                \n                levelHeaderEl.textContent = getLevelName(levelConfig, currentLevel);\n                levelHeaderEl.classList.remove('hidden');\n                \n                updateSunUI();\n                \n                setupPlantCards();\n                \n                mainMenuEl.classList.add('hidden');\n                levelSelectionEl.classList.add('hidden');\n                pauseMenuEl.classList.add('hidden');\n                victoryScreenEl.classList.add('hidden');\n                defeatScreenEl.classList.add('hidden');\n                \n                // Hide UI for Level 1 tutorial\n                if (currentLevel === 1 && mode !== 'edit') {\n                    topUI.classList.add('hidden');\n                    bottomUI.classList.add('hidden');\n                    plantSelectionEl.classList.add('hidden');\n                } else {\n                    topUI.classList.remove('hidden');\n                    bottomUI.classList.remove('hidden');\n                    plantSelectionEl.classList.remove('hidden');\n                }\n                \n                hudMenuBtn.classList.remove('hidden');\n                \n                if (mode === 'edit') {\n                    updateEditParameters();\n                    modeIndicatorEl.classList.remove('hidden');\n                }\n            }\n\n            function startTutorial(callback) {\n                gameState = 'tutorial';\n                isTutorialActive = true;\n                tutorialCallback = callback;\n                document.getElementById('tutorial-container').classList.remove('hidden');\n                document.getElementById('tutorial-step-1').classList.remove('hidden');\n                playSound('ui_click_short_sfx'); // Clean click sound when first popup appears\n                // Hide other steps just in case\n                for (let i = 2; i <= 4; i++) {\n                    const step = document.getElementById(`tutorial-step-${i}`);\n                    if (step) step.classList.add('hidden');\n                }\n            }\n\n            async function showVictoryScreen() {\n                stopBackgroundMusic();\n                playSound('victory_sfx');\n                \n                victoryScreenEl.classList.remove('hidden');\n\n                // Update progression\n                if (currentLevel === maxUnlockedLevel && maxUnlockedLevel < 20) {\n                    maxUnlockedLevel++;\n                    \n                    // Save progress\n                    try {\n                        await lib.saveUserGameState({ maxUnlockedLevel, seenUnlocks, hasSeenStory, language: currentLanguage, seenStories });\n                        lib.log(`Progress saved: Level ${maxUnlockedLevel} unlocked`);\n                    } catch (error) {\n                        lib.log(`Failed to save progress: ${error.message}`);\n                        // Game continues even if save fails\n                    }\n                }\n                \n                // Calculate stars\n                let stars = 1;\n                if (plantsLost === 0) stars = 3;\n                else if (plantsLost < 3) stars = 2;\n                \n                const starsContainer = document.getElementById('victory-stars');\n                starsContainer.innerHTML = '';\n                for (let i = 0; i < 3; i++) {\n                    const star = document.createElement('img');\n                    star.className = 'result-star';\n                    star.src = i < stars ? assetCache['star_filled'].img.src : assetCache['star_empty'].img.src;\n                    starsContainer.appendChild(star);\n                }\n                \n                // Show/hide next level button\n                const nextLevelBtn = document.getElementById('next-level-btn');\n                if (currentLevel < 20) {\n                    nextLevelBtn.style.display = 'block';\n                } else {\n                    nextLevelBtn.style.display = 'none';\n                }\n\n                // Milestone / victory mini story\n                const winStoryId = LEVEL_WIN_STORIES[currentLevel];\n                if (winStoryId && !seenStories.includes(winStoryId)) {\n                    setTimeout(() => {\n                        if (gameState === 'victory') playMiniStory(winStoryId);\n                    }, 900);\n                }\n            }\n\n            function showDefeatScreen() {\n                stopBackgroundMusic();\n                playSound('defeat_sfx');\n                defeatScreenEl.classList.remove('hidden');\n                if (!seenStories.includes('l1')) {\n                    setTimeout(() => {\n                        if (gameState === 'defeat') playMiniStory('l1');\n                    }, 900);\n                }\n            }\n\n            function updateEditParameters() {\n                if (mode !== 'edit') return;\n                \n                lib.showGameParameters({\n                    name: `Level ${currentLevel} Settings`,\n                    params: {\n                        'Starting Sun': {\n                            key: `levels.${currentLevel - 1}.startingSun`,\n                            type: 'slider',\n                            min: 50,\n                            max: 500,\n                            step: 25\n                        },\n                        'Sun Fall Rate (seconds)': {\n                            key: `levels.${currentLevel - 1}.sunFallRate`,\n                            type: 'slider',\n                            min: 3,\n                            max: 15,\n                            step: 1\n                        },\n                        'Sunflower Cost': {\n                            key: `levels.${currentLevel - 1}.plantCosts.sunflower`,\n                            type: 'slider',\n                            min: 25,\n                            max: 200,\n                            step: 25\n                        },\n                        'Peashooter Cost': {\n                            key: `levels.${currentLevel - 1}.plantCosts.peashooter`,\n                            type: 'slider',\n                            min: 50,\n                            max: 300,\n                            step: 25\n                        },\n                        'Wall-nut Cost': {\n                            key: `levels.${currentLevel - 1}.plantCosts.wallnut`,\n                            type: 'slider',\n                            min: 25,\n                            max: 200,\n                            step: 25\n                        },\n                        'Cherry Bomb Cost': {\n                            key: `levels.${currentLevel - 1}.plantCosts.cherrybomb`,\n                            type: 'slider',\n                            min: 100,\n                            max: 300,\n                            step: 25\n                        },\n                        'Snow Pea Cost': {\n                            key: `levels.${currentLevel - 1}.plantCosts.snowpea`,\n                            type: 'slider',\n                            min: 100,\n                            max: 300,\n                            step: 25\n                        },\n                        'Squash Cost': {\n                            key: `levels.${currentLevel - 1}.plantCosts.squash`,\n                            type: 'slider',\n                            min: 25,\n                            max: 150,\n                            step: 25\n                        },\n                        'Jalapeno Cost': {\n                            key: `levels.${currentLevel - 1}.plantCosts.jalapeno`,\n                            type: 'slider',\n                            min: 50,\n                            max: 250,\n                            step: 25\n                        },\n                        'Spikeweed Cost': {\n                            key: `levels.${currentLevel - 1}.plantCosts.spikeweed`,\n                            type: 'slider',\n                            min: 50,\n                            max: 200,\n                            step: 25\n                        },\n                        'Torchwood Cost': {\n                            key: `levels.${currentLevel - 1}.plantCosts.torchwood`,\n                            type: 'slider',\n                            min: 50,\n                            max: 300,\n                            step: 25\n                        }\n                    }\n                });\n            }\n\n            function updateLibraryUI() {\n                const libraryGrid = document.getElementById('library-grid');\n                libraryGrid.innerHTML = '';\n                \n                PLANT_UNLOCKS.forEach((type, index) => {\n                    const plantDef = PLANT_TYPES[type];\n                    if (!plantDef) return;\n\n                    // Sunflower and Peashooter are Level 1. Others are Level index.\n                    const unlockLevelRequired = index <= 1 ? 1 : index;\n                    const isUnlocked = index <= maxUnlockedLevel;\n                    \n                    const card = document.createElement('div');\n                    card.className = `plant-card ${!isUnlocked ? 'disabled' : ''}`;\n                    card.style.margin = '0 auto';\n                    card.style.cursor = 'default';\n                    card.style.pointerEvents = 'auto'; \n                    card.style.width = '120px';\n                    card.style.height = '150px';\n\n                    if (!isUnlocked) {\n                        card.style.filter = 'grayscale(1) brightness(0.3)';\n                        card.style.background = '#222';\n                        card.style.borderColor = '#444';\n                    }\n                    \n                    const cardAsset = `plant_card_${type}`;\n                    if (assetCache[cardAsset]) {\n                        const img = document.createElement('img');\n                        img.className = 'plant-card-image';\n                        img.src = assetCache[cardAsset].img.src;\n                        card.appendChild(img);\n                    }\n                    \n                    const infoOverlay = document.createElement('div');\n                    infoOverlay.style.position = 'absolute';\n                    infoOverlay.style.bottom = '0';\n                    infoOverlay.style.width = '100%';\n                    infoOverlay.style.background = isUnlocked ? 'rgba(76, 175, 80, 0.95)' : 'rgba(0, 0, 0, 0.85)';\n                    infoOverlay.style.color = 'white';\n                    infoOverlay.style.fontSize = '14px';\n                    infoOverlay.style.padding = '6px 2px';\n                    infoOverlay.style.textAlign = 'center';\n                    infoOverlay.style.fontWeight = '700';\n                    infoOverlay.style.zIndex = '10';\n                    infoOverlay.style.borderTop = '2px solid rgba(255,255,255,0.2)';\n                    \n                    if (isUnlocked) {\n                        infoOverlay.textContent = t('p_' + type);\n                    } else {\n                        infoOverlay.textContent = t('unlocks_at', { n: unlockLevelRequired });\n                        infoOverlay.style.fontSize = '12px';\n                        infoOverlay.style.color = '#aaa';\n                    }\n                    card.appendChild(infoOverlay);\n                    \n                    libraryGrid.appendChild(card);\n                });\n            }\n\n            function showPlantLibrary() {\n                const wasPlaying = gameState === 'playing';\n                if (wasPlaying) {\n                    gameState = 'paused';\n                    stopBackgroundMusic();\n                }\n                \n                const libraryScreen = document.getElementById('library-screen');\n                libraryScreen.dataset.wasPlaying = wasPlaying;\n                libraryScreen.classList.remove('hidden');\n                \n                updateLibraryUI();\n            }\n\n            levelHeaderEl.addEventListener('click', () => {\n                if (gameState === 'playing' || gameState === 'paused') {\n                    showPlantLibrary();\n                }\n            });\n\n            document.getElementById('library-close-btn').addEventListener('click', () => {\n                const libraryScreen = document.getElementById('library-screen');\n                libraryScreen.classList.add('hidden');\n                \n                if (libraryScreen.dataset.wasPlaying === 'true') {\n                    gameState = 'playing';\n                    playBackgroundMusic();\n                }\n                initAudio();\n            });\n\n            function updateSunUI() {\n                if (isNaN(currentSun) || currentSun === null || currentSun === undefined) {\n                    currentSun = 0;\n                    lib.log(\"Warning: currentSun was NaN, resetting to 0\");\n                }\n                sunCountEl.textContent = Math.floor(currentSun);\n            }\n\n            // Input handling\n            let mousePos = null;\n            let touchPos = null;\n\n            canvas.addEventListener('mousemove', (e) => {\n                const rect = canvas.getBoundingClientRect();\n                mousePos = {\n                    x: e.clientX - rect.left,\n                    y: e.clientY - rect.top\n                };\n            });\n\n            canvas.addEventListener('touchmove', (e) => {\n                const rect = canvas.getBoundingClientRect();\n                const touch = e.touches[0];\n                mousePos = {\n                    x: touch.clientX - rect.left,\n                    y: touch.clientY - rect.top\n                };\n            });\n\n            canvas.addEventListener('click', (e) => {\n                if (gameState !== 'playing') return;\n                \n                const rect = canvas.getBoundingClientRect();\n                const x = e.clientX - rect.left;\n                const y = e.clientY - rect.top;\n                \n                // Check for sun collection\n                for (let i = fallingSuns.length - 1; i >= 0; i--) {\n                    const sun = fallingSuns[i];\n                    const dx = x - sun.x;\n                    const dy = y - sun.y;\n                    const distance = Math.sqrt(dx * dx + dy * dy);\n                    \n                    if (distance < 24) {\n                        currentSun += sun.value;\n                        updateSunUI();\n                        sun.collected = true;\n                        playSound('sun_collect_sfx');\n                        initAudio();\n                        return;\n                    }\n                }\n                \n                // Check for plant placement\n                if (selectedPlantType) {\n                    const cell = getCellFromPosition(x, y);\n                    if (cell) {\n                        const levelConfig = window.gameConfig.levels[currentLevel - 1];\n                        const plantDef = PLANT_TYPES[selectedPlantType];\n                        const cost = (levelConfig && levelConfig.plantCosts && levelConfig.plantCosts[selectedPlantType] !== undefined)\n                            ? levelConfig.plantCosts[selectedPlantType]\n                            : (plantDef ? plantDef.cost : 0);\n                        \n                        if (placePlant(selectedPlantType, cell.row, cell.col)) {\n                            updateSunUI();\n                            selectedPlantType = null;\n                            document.querySelectorAll('.plant-card').forEach(c => c.classList.remove('selected'));\n                        }\n                    }\n                }\n            });\n\n            canvas.addEventListener('touchstart', (e) => {\n                e.preventDefault();\n                if (gameState !== 'playing') return;\n                \n                const rect = canvas.getBoundingClientRect();\n                const touch = e.touches[0];\n                const x = touch.clientX - rect.left;\n                const y = touch.clientY - rect.top;\n                \n                touchPos = { x, y };\n                \n                // Check for sun collection\n                for (let i = fallingSuns.length - 1; i >= 0; i--) {\n                    const sun = fallingSuns[i];\n                    const dx = x - sun.x;\n                    const dy = y - sun.y;\n                    const distance = Math.sqrt(dx * dx + dy * dy);\n                    \n                    if (distance < 24) {\n                        currentSun += sun.value;\n                        updateSunUI();\n                        sun.collected = true;\n                        playSound('sun_collect_sfx');\n                        initAudio();\n                        return;\n                    }\n                }\n                \n                // Check for plant placement\n                if (selectedPlantType) {\n                    const cell = getCellFromPosition(x, y);\n                    if (cell) {\n                        const levelConfig = window.gameConfig.levels[currentLevel - 1];\n                        const plantDef = PLANT_TYPES[selectedPlantType];\n                        const cost = (levelConfig && levelConfig.plantCosts && levelConfig.plantCosts[selectedPlantType] !== undefined)\n                            ? levelConfig.plantCosts[selectedPlantType]\n                            : (plantDef ? plantDef.cost : 0);\n                        \n                        if (placePlant(selectedPlantType, cell.row, cell.col)) {\n                            updateSunUI();\n                            selectedPlantType = null;\n                            document.querySelectorAll('.plant-card').forEach(c => c.classList.remove('selected'));\n                        }\n                    }\n                }\n            });\n\n            // Keyboard controls\n            document.addEventListener('keydown', (e) => {\n                if (gameState === 'playing') {\n                    if (e.key === 'Escape' || e.key === 'p' || e.key === 'P') {\n                        gameState = 'paused';\n                        pauseMenuEl.classList.remove('hidden');\n                        stopBackgroundMusic();\n                    } else if (e.key >= '1' && e.key <= '5') {\n                        const index = parseInt(e.key) - 1;\n                        const cards = document.querySelectorAll('.plant-card');\n                        if (cards[index]) {\n                            cards[index].click();\n                        }\n                    }\n                }\n            });\n\n            // Menu button handlers\n            document.getElementById('play-btn').addEventListener('click', () => {\n                playSound('pea_shoot_sfx');\n                initAudio();\n                if (maxUnlockedLevel === 1 && !hasSeenStory && mode !== 'edit') {\n                    currentLevel = 1;\n                    selectedLoadout = PLANT_UNLOCKS.filter((id, index) => index < (currentLevel + 1));\n                    playStory(() => {\n                        startLevel();\n                    });\n                } else {\n                    gameState = 'levelSelect';\n                    mainMenuEl.classList.add('hidden');\n                    levelSelectionEl.classList.remove('hidden');\n                    setupLevelSelection();\n                }\n            });\n\n            document.getElementById('back-to-menu').addEventListener('click', () => {\n                gameState = 'menu';\n                levelSelectionEl.classList.add('hidden');\n                mainMenuEl.classList.remove('hidden');\n            });\n\n            const hudMenuBtn = document.getElementById('game-menu-btn');\n            if (hudMenuBtn) {\n                hudMenuBtn.addEventListener('click', () => {\n                    if (gameState === 'playing') {\n                        gameState = 'paused';\n                        pauseMenuEl.classList.remove('hidden');\n                        stopBackgroundMusic();\n                    }\n                    initAudio();\n                });\n            }\n\n            document.getElementById('pause-to-main-btn').addEventListener('click', () => {\n                gameState = 'menu';\n                const storyEl = document.getElementById('story-screen');\n                if (storyEl) storyEl.classList.add('hidden');\n                pauseMenuEl.classList.add('hidden');\n                levelHeaderEl.classList.add('hidden');\n                topUI.classList.add('hidden');\n                bottomUI.classList.add('hidden');\n                hudMenuBtn.classList.add('hidden');\n                waveIndicatorEl.classList.add('hidden');\n                phaseDisplayEl.classList.add('hidden');\n                nextWaveTimerEl.classList.add('hidden');\n                selectionScreenEl.classList.add('hidden');\n                document.getElementById('library-screen').classList.add('hidden');\n                document.getElementById('tutorial-container').classList.add('hidden');\n                document.getElementById('unlock-popup').classList.add('hidden');\n                mainMenuEl.classList.remove('hidden');\n            });\n\n            document.getElementById('victory-to-main-btn').addEventListener('click', () => {\n                gameState = 'menu';\n                const storyEl = document.getElementById('story-screen');\n                if (storyEl) storyEl.classList.add('hidden');\n                victoryScreenEl.classList.add('hidden');\n                levelHeaderEl.classList.add('hidden');\n                topUI.classList.add('hidden');\n                bottomUI.classList.add('hidden');\n                hudMenuBtn.classList.add('hidden');\n                waveIndicatorEl.classList.add('hidden');\n                phaseDisplayEl.classList.add('hidden');\n                nextWaveTimerEl.classList.add('hidden');\n                selectionScreenEl.classList.add('hidden');\n                document.getElementById('library-screen').classList.add('hidden');\n                document.getElementById('tutorial-container').classList.add('hidden');\n                document.getElementById('unlock-popup').classList.add('hidden');\n                mainMenuEl.classList.remove('hidden');\n            });\n\n            document.getElementById('defeat-to-main-btn').addEventListener('click', () => {\n                gameState = 'menu';\n                const storyEl = document.getElementById('story-screen');\n                if (storyEl) storyEl.classList.add('hidden');\n                defeatScreenEl.classList.add('hidden');\n                levelHeaderEl.classList.add('hidden');\n                topUI.classList.add('hidden');\n                bottomUI.classList.add('hidden');\n                hudMenuBtn.classList.add('hidden');\n                waveIndicatorEl.classList.add('hidden');\n                phaseDisplayEl.classList.add('hidden');\n                nextWaveTimerEl.classList.add('hidden');\n                selectionScreenEl.classList.add('hidden');\n                document.getElementById('library-screen').classList.add('hidden');\n                document.getElementById('tutorial-container').classList.add('hidden');\n                document.getElementById('unlock-popup').classList.add('hidden');\n                mainMenuEl.classList.remove('hidden');\n            });\n\n            document.getElementById('resume-btn').addEventListener('click', () => {\n                gameState = 'playing';\n                pauseMenuEl.classList.add('hidden');\n                playBackgroundMusic();\n            });\n\n            document.getElementById('restart-btn').addEventListener('click', () => {\n                pauseMenuEl.classList.add('hidden');\n                startLevel();\n            });\n\n            document.getElementById('quit-btn').addEventListener('click', () => {\n                gameState = 'levelSelect';\n                pauseMenuEl.classList.add('hidden');\n                levelHeaderEl.classList.add('hidden');\n                topUI.classList.add('hidden');\n                bottomUI.classList.add('hidden');\n                hudMenuBtn.classList.add('hidden');\n                waveIndicatorEl.classList.add('hidden');\n                phaseDisplayEl.classList.add('hidden');\n                nextWaveTimerEl.classList.add('hidden');\n                selectionScreenEl.classList.add('hidden');\n                document.getElementById('library-screen').classList.add('hidden');\n                document.getElementById('tutorial-container').classList.add('hidden');\n                document.getElementById('unlock-popup').classList.add('hidden');\n                levelSelectionEl.classList.remove('hidden');\n                setupLevelSelection();\n            });\n\n            document.getElementById('next-level-btn').addEventListener('click', () => {\n                const finishedLevel = currentLevel;\n                currentLevel++;\n                victoryScreenEl.classList.add('hidden');\n                \n                // If just finished level 1, show them the level selection menu to show there are many other levels\n                if (finishedLevel === 1) {\n                    gameState = 'levelSelect';\n                    levelHeaderEl.classList.add('hidden');\n                    topUI.classList.add('hidden');\n                    bottomUI.classList.add('hidden');\n                    hudMenuBtn.classList.add('hidden');\n                    waveIndicatorEl.classList.add('hidden');\n                    phaseDisplayEl.classList.add('hidden');\n                    nextWaveTimerEl.classList.add('hidden');\n                    selectionScreenEl.classList.add('hidden');\n                    document.getElementById('library-screen').classList.add('hidden');\n                    document.getElementById('tutorial-container').classList.add('hidden');\n                    document.getElementById('unlock-popup').classList.add('hidden');\n                    levelSelectionEl.classList.remove('hidden');\n                    setupLevelSelection();\n                    return;\n                }\n\n                if (currentLevel < 5) {\n                    selectedLoadout = PLANT_UNLOCKS.filter((id, index) => index < (currentLevel + 1));\n                    startLevel();\n                } else {\n                    showSelectionScreen();\n                }\n            });\n\n            document.getElementById('replay-btn').addEventListener('click', () => {\n                victoryScreenEl.classList.add('hidden');\n                startLevel();\n            });\n\n            document.getElementById('victory-quit-btn').addEventListener('click', () => {\n                gameState = 'levelSelect';\n                victoryScreenEl.classList.add('hidden');\n                levelHeaderEl.classList.add('hidden');\n                topUI.classList.add('hidden');\n                bottomUI.classList.add('hidden');\n                hudMenuBtn.classList.add('hidden');\n                waveIndicatorEl.classList.add('hidden');\n                phaseDisplayEl.classList.add('hidden');\n                nextWaveTimerEl.classList.add('hidden');\n                selectionScreenEl.classList.add('hidden');\n                document.getElementById('library-screen').classList.add('hidden');\n                document.getElementById('tutorial-container').classList.add('hidden');\n                document.getElementById('unlock-popup').classList.add('hidden');\n                levelSelectionEl.classList.remove('hidden');\n                setupLevelSelection();\n            });\n\n            document.getElementById('retry-btn').addEventListener('click', () => {\n                defeatScreenEl.classList.add('hidden');\n                startLevel();\n            });\n\n            document.getElementById('defeat-quit-btn').addEventListener('click', () => {\n                gameState = 'levelSelect';\n                defeatScreenEl.classList.add('hidden');\n                levelHeaderEl.classList.add('hidden');\n                topUI.classList.add('hidden');\n                bottomUI.classList.add('hidden');\n                hudMenuBtn.classList.add('hidden');\n                waveIndicatorEl.classList.add('hidden');\n                phaseDisplayEl.classList.add('hidden');\n                nextWaveTimerEl.classList.add('hidden');\n                selectionScreenEl.classList.add('hidden');\n                document.getElementById('library-screen').classList.add('hidden');\n                document.getElementById('tutorial-container').classList.add('hidden');\n                document.getElementById('unlock-popup').classList.add('hidden');\n                levelSelectionEl.classList.remove('hidden');\n                setupLevelSelection();\n            });\n\n            document.getElementById('start-level-btn').addEventListener('click', () => {\n                playSound('pea_shoot_sfx');\n                if (isViewingLoadout) {\n                    isViewingLoadout = false;\n                    selectionScreenEl.classList.add('hidden');\n                    \n                    const startBtn = document.getElementById('start-level-btn');\n                    const backBtn = document.getElementById('selection-back-btn');\n                    startBtn.textContent = t('start_game');\n                    backBtn.classList.remove('hidden');\n                    \n                    // Resume game if we were playing before opening viewer\n                    if (selectionScreenEl.dataset.wasPlaying === 'true') {\n                        gameState = 'playing';\n                        playBackgroundMusic();\n                    }\n                    return;\n                }\n\n                if (gameState === 'selection' && selectedLoadout.length > 0) {\n                    startLevel();\n                    initAudio();\n                }\n            });\n\n            document.getElementById('selection-back-btn').addEventListener('click', () => {\n                gameState = 'levelSelect';\n                selectionScreenEl.classList.add('hidden');\n                levelSelectionEl.classList.remove('hidden');\n            });\n\n            // Show game parameters\n            if (mode === 'edit') {\n                updateEditParameters();\n                modeIndicatorEl.classList.remove('hidden');\n                selectedLoadout = PLANT_UNLOCKS.filter((id, index) => index < Math.min(currentLevel, 5));\n                startLevel();\n            } else if (mode === 'play') {\n                lib.showGameParameters({\n                    name: 'Plant vs Zombies 2 Settings',\n                    params: {}\n                });\n                \n                // Only auto-start Level 1 for new players\n                // Returning players (maxUnlockedLevel > 1) see the main menu to choose their level\n                if (maxUnlockedLevel === 1) {\n                    currentLevel = 1;\n                    selectedLoadout = PLANT_UNLOCKS.filter((id, index) => index < (currentLevel + 1));\n                    if (!hasSeenStory) {\n                        playStory(() => {\n                            startLevel();\n                        });\n                    } else {\n                        startLevel();\n                    }\n                } else {\n                    // Returning player - show main menu\n                    gameState = 'menu';\n                    lib.log(`Welcome back! You have unlocked ${maxUnlockedLevel} levels.`);\n                }\n            } else {\n                lib.showGameParameters({\n                    name: 'Plant vs Zombies 2 Settings',\n                    params: {}\n                });\n            }\n\n            // Game loop\n            let lastTime = 0;\n            function gameLoop(timestamp) {\n                let dt = (timestamp - lastTime) / 1000;\n                lastTime = timestamp;\n                \n                // Cap delta time\n                dt = Math.min(dt, 0.11);\n                \n                if (gameState === 'playing' || gameState === 'tutorial') {\n                    if (gameState === 'playing') {\n                        updatePlants(dt);\n                        updateZombies(dt);\n                        updateLawnMowers(dt);\n                        updateProjectiles(dt);\n                        updateFallingSuns(dt);\n                        updateParticles(dt);\n                        updateVisualEffects(dt);\n                        updateWaves(dt);\n                        updateSpawnQueue(dt);\n                        updateSunFall(dt);\n                        updateCooldowns(dt);\n                        updatePlantCards();\n                    }\n                }\n                \n                render(dt);\n                requestAnimationFrame(gameLoop);\n            }\n            requestAnimationFrame(gameLoop);\n        }\n    </script>\n</body>\n</html>", "game_config": "{\n  \"levels\": [\n    {\n      \"waves\": [\n        {\n          \"delay\": 25,\n          \"fastCount\": 0,\n          \"tankCount\": 0,\n          \"basicCount\": 2\n        },\n        {\n          \"fastCount\": 0,\n          \"tankCount\": 0,\n          \"delay\": 20,\n          \"basicCount\": 6\n        },\n        {\n          \"tankCount\": 0,\n          \"fastCount\": 1,\n          \"delay\": 25,\n          \"basicCount\": 10\n        }\n      ],\n      \"sunFallRate\": 4,\n      \"name\": \"Garden Basics\",\n      \"startingSun\": 450,\n      \"availablePlants\": {\n        \"peashooter\": true,\n        \"cherrybomb\": false,\n        \"wallnut\": false,\n        \"snowpea\": false,\n        \"sunflower\": true\n      },\n      \"plantCosts\": {\n        \"sunflower\": 50,\n        \"peashooter\": 100,\n        \"snowpea\": 175,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"squash\": 50,\n        \"jalapeno\": 125,\n        \"spikeweed\": 100,\n        \"torchwood\": 175,\n        \"tallnut\": 125,\n        \"cactus\": 125,\n        \"starfruit\": 125,\n        \"repeater\": 200,\n        \"potatomine\": 25\n      }\n    },\n    {\n      \"sunFallRate\": 5,\n      \"name\": \"Defensive Line\",\n      \"waves\": [\n        {\n          \"basicCount\": 4,\n          \"delay\": 30,\n          \"fastCount\": 0,\n          \"tankCount\": 0\n        },\n        {\n          \"delay\": 20,\n          \"tankCount\": 0,\n          \"fastCount\": 2,\n          \"basicCount\": 8\n        },\n        {\n          \"basicCount\": 12,\n          \"fastCount\": 2,\n          \"tankCount\": 1,\n          \"delay\": 25\n        }\n      ],\n      \"startingSun\": 400,\n      \"plantCosts\": {\n        \"sunflower\": 50,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"snowpea\": 175,\n        \"peashooter\": 100\n      },\n      \"availablePlants\": {\n        \"sunflower\": true,\n        \"snowpea\": false,\n        \"cherrybomb\": false,\n        \"wallnut\": true,\n        \"peashooter\": true\n      }\n    },\n    {\n      \"waves\": [\n        {\n          \"delay\": 35,\n          \"fastCount\": 0,\n          \"tankCount\": 0,\n          \"basicCount\": 5\n        },\n        {\n          \"tankCount\": 1,\n          \"fastCount\": 4,\n          \"delay\": 25,\n          \"basicCount\": 10\n        },\n        {\n          \"basicCount\": 15,\n          \"fastCount\": 5,\n          \"tankCount\": 3,\n          \"delay\": 30\n        }\n      ],\n      \"sunFallRate\": 5,\n      \"name\": \"Explosive Defense\",\n      \"startingSun\": 400,\n      \"availablePlants\": {\n        \"sunflower\": true,\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"snowpea\": true,\n        \"peashooter\": true\n      },\n      \"plantCosts\": {\n        \"sunflower\": 50,\n        \"peashooter\": 100,\n        \"snowpea\": 175,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50\n      }\n    },\n    {\n      \"plantCosts\": {\n        \"sunflower\": 50,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"snowpea\": 175,\n        \"peashooter\": 100\n      },\n      \"availablePlants\": {\n        \"peashooter\": true,\n        \"snowpea\": true,\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"sunflower\": true\n      },\n      \"startingSun\": 400,\n      \"sunFallRate\": 5,\n      \"name\": \"Level 4\",\n      \"waves\": [\n        {\n          \"fastCount\": 1,\n          \"tankCount\": 0,\n          \"delay\": 35,\n          \"basicCount\": 6\n        },\n        {\n          \"delay\": 25,\n          \"tankCount\": 2,\n          \"fastCount\": 5,\n          \"basicCount\": 12\n        },\n        {\n          \"basicCount\": 20,\n          \"delay\": 30,\n          \"fastCount\": 8,\n          \"tankCount\": 4\n        }\n      ]\n    },\n    {\n      \"availablePlants\": {\n        \"snowpea\": true,\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"peashooter\": true,\n        \"sunflower\": true\n      },\n      \"plantCosts\": {\n        \"snowpea\": 175,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"peashooter\": 100,\n        \"sunflower\": 50\n      },\n      \"waves\": [\n        {\n          \"fastCount\": 1,\n          \"tankCount\": 0,\n          \"delay\": 35,\n          \"basicCount\": 6,\n          \"flagCount\": 1\n        },\n        {\n          \"delay\": 25,\n          \"tankCount\": 2,\n          \"fastCount\": 5,\n          \"basicCount\": 12,\n          \"bucketheadCount\": 1\n        },\n        {\n          \"basicCount\": 20,\n          \"delay\": 30,\n          \"fastCount\": 8,\n          \"tankCount\": 4,\n          \"bucketheadCount\": 2\n        }\n      ],\n      \"sunFallRate\": 5,\n      \"name\": \"Level 5\",\n      \"startingSun\": 400\n    },\n    {\n      \"plantCosts\": {\n        \"snowpea\": 175,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"peashooter\": 100,\n        \"sunflower\": 50\n      },\n      \"availablePlants\": {\n        \"peashooter\": true,\n        \"snowpea\": true,\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"sunflower\": true\n      },\n      \"sunFallRate\": 5,\n      \"name\": \"Level 6\",\n      \"waves\": [\n        {\n          \"delay\": 35,\n          \"tankCount\": 1,\n          \"fastCount\": 2,\n          \"basicCount\": 8,\n          \"flagCount\": 1,\n          \"newspaperCount\": 2\n        },\n        {\n          \"basicCount\": 15,\n          \"delay\": 25,\n          \"tankCount\": 3,\n          \"fastCount\": 7,\n          \"bucketheadCount\": 2,\n          \"newspaperCount\": 3\n        },\n        {\n          \"basicCount\": 25,\n          \"delay\": 30,\n          \"fastCount\": 10,\n          \"tankCount\": 5,\n          \"bucketheadCount\": 3,\n          \"polevaulterCount\": 2\n        }\n      ],\n      \"startingSun\": 250\n    },\n    {\n      \"startingSun\": 250,\n      \"waves\": [\n        {\n          \"fastCount\": 4,\n          \"tankCount\": 2,\n          \"delay\": 35,\n          \"basicCount\": 12\n        },\n        {\n          \"fastCount\": 10,\n          \"tankCount\": 5,\n          \"delay\": 25,\n          \"basicCount\": 20\n        },\n        {\n          \"basicCount\": 35,\n          \"delay\": 30,\n          \"tankCount\": 7,\n          \"fastCount\": 15\n        }\n      ],\n      \"sunFallRate\": 5,\n      \"name\": \"Level 7\",\n      \"availablePlants\": {\n        \"peashooter\": true,\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"snowpea\": true,\n        \"sunflower\": true\n      },\n      \"plantCosts\": {\n        \"sunflower\": 50,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"snowpea\": 175,\n        \"peashooter\": 100\n      }\n    },\n    {\n      \"name\": \"Level 8\",\n      \"sunFallRate\": 5,\n      \"waves\": [\n        {\n          \"basicCount\": 14,\n          \"delay\": 35,\n          \"fastCount\": 5,\n          \"tankCount\": 3\n        },\n        {\n          \"basicCount\": 22,\n          \"delay\": 25,\n          \"fastCount\": 12,\n          \"tankCount\": 6\n        },\n        {\n          \"fastCount\": 18,\n          \"tankCount\": 8,\n          \"delay\": 30,\n          \"basicCount\": 40\n        }\n      ],\n      \"startingSun\": 250,\n      \"plantCosts\": {\n        \"sunflower\": 50,\n        \"peashooter\": 100,\n        \"snowpea\": 175,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50\n      },\n      \"availablePlants\": {\n        \"sunflower\": true,\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"snowpea\": true,\n        \"peashooter\": true\n      }\n    },\n    {\n      \"startingSun\": 250,\n      \"sunFallRate\": 5,\n      \"name\": \"Level 9\",\n      \"waves\": [\n        {\n          \"delay\": 35,\n          \"tankCount\": 3,\n          \"fastCount\": 6,\n          \"basicCount\": 16\n        },\n        {\n          \"delay\": 25,\n          \"tankCount\": 7,\n          \"fastCount\": 14,\n          \"basicCount\": 25\n        },\n        {\n          \"delay\": 30,\n          \"fastCount\": 20,\n          \"tankCount\": 10,\n          \"basicCount\": 45\n        }\n      ],\n      \"plantCosts\": {\n        \"peashooter\": 100,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"snowpea\": 175,\n        \"sunflower\": 50\n      },\n      \"availablePlants\": {\n        \"snowpea\": true,\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"peashooter\": true,\n        \"sunflower\": true\n      }\n    },\n    {\n      \"availablePlants\": {\n        \"sunflower\": true,\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"snowpea\": true,\n        \"peashooter\": true\n      },\n      \"plantCosts\": {\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"snowpea\": 175,\n        \"peashooter\": 100,\n        \"sunflower\": 50\n      },\n      \"startingSun\": 250,\n      \"waves\": [\n        {\n          \"delay\": 35,\n          \"tankCount\": 3,\n          \"fastCount\": 6,\n          \"basicCount\": 16,\n          \"flagCount\": 1,\n          \"bucketheadCount\": 2\n        },\n        {\n          \"delay\": 25,\n          \"tankCount\": 7,\n          \"fastCount\": 14,\n          \"basicCount\": 25,\n          \"bucketheadCount\": 4,\n          \"newspaperCount\": 5\n        },\n        {\n          \"delay\": 30,\n          \"fastCount\": 20,\n          \"tankCount\": 10,\n          \"basicCount\": 45,\n          \"gargantuarCount\": 1,\n          \"polevaulterCount\": 4\n        }\n      ],\n      \"sunFallRate\": 5,\n      \"name\": \"Level 10\"\n    },\n    {\n      \"sunFallRate\": 5,\n      \"name\": \"Level 11\",\n      \"waves\": [\n        {\n          \"tankCount\": 4,\n          \"fastCount\": 8,\n          \"delay\": 35,\n          \"basicCount\": 20\n        },\n        {\n          \"basicCount\": 30,\n          \"delay\": 25,\n          \"tankCount\": 9,\n          \"fastCount\": 18\n        },\n        {\n          \"fastCount\": 25,\n          \"tankCount\": 14,\n          \"delay\": 30,\n          \"basicCount\": 55\n        }\n      ],\n      \"startingSun\": 250,\n      \"plantCosts\": {\n        \"snowpea\": 175,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"peashooter\": 100,\n        \"sunflower\": 50\n      },\n      \"availablePlants\": {\n        \"sunflower\": true,\n        \"peashooter\": true,\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"snowpea\": true\n      }\n    },\n    {\n      \"plantCosts\": {\n        \"sunflower\": 50,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"snowpea\": 175,\n        \"peashooter\": 100\n      },\n      \"availablePlants\": {\n        \"peashooter\": true,\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"snowpea\": true,\n        \"sunflower\": true\n      },\n      \"sunFallRate\": 5,\n      \"name\": \"Level 12\",\n      \"waves\": [\n        {\n          \"basicCount\": 22,\n          \"delay\": 35,\n          \"tankCount\": 5,\n          \"fastCount\": 9\n        },\n        {\n          \"basicCount\": 32,\n          \"delay\": 25,\n          \"tankCount\": 10,\n          \"fastCount\": 20\n        },\n        {\n          \"basicCount\": 60,\n          \"delay\": 30,\n          \"fastCount\": 28,\n          \"tankCount\": 16\n        }\n      ],\n      \"startingSun\": 250\n    },\n    {\n      \"availablePlants\": {\n        \"sunflower\": true,\n        \"peashooter\": true,\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"snowpea\": true\n      },\n      \"plantCosts\": {\n        \"peashooter\": 100,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"snowpea\": 175,\n        \"sunflower\": 50\n      },\n      \"waves\": [\n        {\n          \"delay\": 35,\n          \"tankCount\": 5,\n          \"fastCount\": 10,\n          \"basicCount\": 24\n        },\n        {\n          \"basicCount\": 35,\n          \"delay\": 25,\n          \"fastCount\": 22,\n          \"tankCount\": 11\n        },\n        {\n          \"delay\": 30,\n          \"fastCount\": 30,\n          \"tankCount\": 18,\n          \"basicCount\": 65\n        }\n      ],\n      \"sunFallRate\": 5,\n      \"name\": \"Level 13\",\n      \"startingSun\": 250\n    },\n    {\n      \"plantCosts\": {\n        \"sunflower\": 50,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"snowpea\": 175,\n        \"peashooter\": 100\n      },\n      \"availablePlants\": {\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"snowpea\": true,\n        \"peashooter\": true,\n        \"sunflower\": true\n      },\n      \"sunFallRate\": 5,\n      \"name\": \"Level 14\",\n      \"waves\": [\n        {\n          \"delay\": 35,\n          \"tankCount\": 6,\n          \"fastCount\": 11,\n          \"basicCount\": 26\n        },\n        {\n          \"fastCount\": 24,\n          \"tankCount\": 12,\n          \"delay\": 25,\n          \"basicCount\": 38\n        },\n        {\n          \"basicCount\": 70,\n          \"fastCount\": 32,\n          \"tankCount\": 20,\n          \"delay\": 30\n        }\n      ],\n      \"startingSun\": 250\n    },\n    {\n      \"startingSun\": 250,\n      \"waves\": [\n        {\n          \"delay\": 35,\n          \"tankCount\": 6,\n          \"fastCount\": 11,\n          \"basicCount\": 26,\n          \"flagCount\": 2,\n          \"bucketheadCount\": 4\n        },\n        {\n          \"fastCount\": 24,\n          \"tankCount\": 12,\n          \"delay\": 25,\n          \"basicCount\": 38,\n          \"bucketheadCount\": 6,\n          \"newspaperCount\": 8,\n          \"polevaulterCount\": 4\n        },\n        {\n          \"basicCount\": 70,\n          \"fastCount\": 32,\n          \"tankCount\": 20,\n          \"delay\": 30,\n          \"gargantuarCount\": 2,\n          \"bucketheadCount\": 8\n        }\n      ],\n      \"sunFallRate\": 5,\n      \"name\": \"Level 15\",\n      \"availablePlants\": {\n        \"sunflower\": true,\n        \"snowpea\": true,\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"peashooter\": true\n      },\n      \"plantCosts\": {\n        \"snowpea\": 175,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"peashooter\": 100,\n        \"sunflower\": 50\n      }\n    },\n    {\n      \"startingSun\": 250,\n      \"waves\": [\n        {\n          \"tankCount\": 7,\n          \"fastCount\": 13,\n          \"delay\": 35,\n          \"basicCount\": 30\n        },\n        {\n          \"basicCount\": 42,\n          \"delay\": 25,\n          \"fastCount\": 28,\n          \"tankCount\": 14\n        },\n        {\n          \"delay\": 30,\n          \"tankCount\": 24,\n          \"fastCount\": 38,\n          \"basicCount\": 80\n        }\n      ],\n      \"sunFallRate\": 5,\n      \"name\": \"Level 16\",\n      \"availablePlants\": {\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"snowpea\": true,\n        \"peashooter\": true,\n        \"sunflower\": true\n      },\n      \"plantCosts\": {\n        \"snowpea\": 175,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"peashooter\": 100,\n        \"sunflower\": 50\n      }\n    },\n    {\n      \"plantCosts\": {\n        \"sunflower\": 50,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"snowpea\": 175,\n        \"peashooter\": 100\n      },\n      \"availablePlants\": {\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"snowpea\": true,\n        \"peashooter\": true,\n        \"sunflower\": true\n      },\n      \"startingSun\": 250,\n      \"sunFallRate\": 5,\n      \"name\": \"Level 17\",\n      \"waves\": [\n        {\n          \"delay\": 35,\n          \"tankCount\": 7,\n          \"fastCount\": 14,\n          \"basicCount\": 32\n        },\n        {\n          \"delay\": 25,\n          \"fastCount\": 30,\n          \"tankCount\": 15,\n          \"basicCount\": 45\n        },\n        {\n          \"tankCount\": 26,\n          \"fastCount\": 40,\n          \"delay\": 30,\n          \"basicCount\": 85\n        }\n      ]\n    },\n    {\n      \"availablePlants\": {\n        \"peashooter\": true,\n        \"snowpea\": true,\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"sunflower\": true\n      },\n      \"plantCosts\": {\n        \"snowpea\": 175,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"peashooter\": 100,\n        \"sunflower\": 50\n      },\n      \"startingSun\": 250,\n      \"waves\": [\n        {\n          \"basicCount\": 34,\n          \"fastCount\": 15,\n          \"tankCount\": 8,\n          \"delay\": 35\n        },\n        {\n          \"fastCount\": 32,\n          \"tankCount\": 16,\n          \"delay\": 25,\n          \"basicCount\": 48\n        },\n        {\n          \"basicCount\": 90,\n          \"delay\": 30,\n          \"fastCount\": 42,\n          \"tankCount\": 28\n        }\n      ],\n      \"name\": \"Level 18\",\n      \"sunFallRate\": 5\n    },\n    {\n      \"availablePlants\": {\n        \"sunflower\": true,\n        \"peashooter\": true,\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"snowpea\": true\n      },\n      \"plantCosts\": {\n        \"snowpea\": 175,\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"peashooter\": 100,\n        \"sunflower\": 50\n      },\n      \"waves\": [\n        {\n          \"basicCount\": 36,\n          \"delay\": 35,\n          \"fastCount\": 16,\n          \"tankCount\": 8\n        },\n        {\n          \"basicCount\": 50,\n          \"fastCount\": 34,\n          \"tankCount\": 17,\n          \"delay\": 25\n        },\n        {\n          \"basicCount\": 95,\n          \"fastCount\": 45,\n          \"tankCount\": 30,\n          \"delay\": 30\n        }\n      ],\n      \"name\": \"Level 19\",\n      \"sunFallRate\": 5,\n      \"startingSun\": 250\n    },\n    {\n      \"availablePlants\": {\n        \"cherrybomb\": true,\n        \"wallnut\": true,\n        \"snowpea\": true,\n        \"peashooter\": true,\n        \"sunflower\": true\n      },\n      \"plantCosts\": {\n        \"cherrybomb\": 150,\n        \"wallnut\": 50,\n        \"snowpea\": 175,\n        \"peashooter\": 100,\n        \"sunflower\": 50\n      },\n      \"startingSun\": 250,\n      \"waves\": [\n        {\n          \"basicCount\": 40,\n          \"fastCount\": 20,\n          \"tankCount\": 10,\n          \"delay\": 35,\n          \"flagCount\": 3,\n          \"bucketheadCount\": 8,\n          \"newspaperCount\": 6\n        },\n        {\n          \"basicCount\": 60,\n          \"fastCount\": 40,\n          \"tankCount\": 20,\n          \"delay\": 25,\n          \"bucketheadCount\": 12,\n          \"polevaulterCount\": 8,\n          \"gargantuarCount\": 2\n        },\n        {\n          \"delay\": 30,\n          \"tankCount\": 40,\n          \"fastCount\": 50,\n          \"basicCount\": 100,\n          \"gargantuarCount\": 5,\n          \"bucketheadCount\": 15,\n          \"impCount\": 10\n        }\n      ],\n      \"name\": \"Level 20\",\n      \"sunFallRate\": 5\n    }\n  ]\n}", "game_design_document": "## Core Game Loop and Mechanics\n\n**Garden Guardians** is a lane-based tower defense game where players strategically place plants on a grid to defend against waves of approaching critters.\n\n### Moment-to-Moment Gameplay\n1. **Resource Generation**: Players collect sunlight that falls from the sky or is produced by Sunflower plants\n2. **Plant Placement**: Spend sunlight to place defensive plants on a 5x9 grid (5 rows, 9 columns)\n3. **Wave Defense**: Critters spawn from the right side and walk left toward the house\n4. **Combat**: Plants automatically attack critters in their lanes using various abilities\n5. **Victory/Defeat**: Win by surviving all waves; lose if any critter reaches the leftmost column\n\n### Core Mechanics\n\n**Sunlight System**\n- Sunlight falls randomly from the sky every 5-10 seconds (tap/click to collect, worth 25 sun)\n- Sunflowers generate 25 sun every 20 seconds\n- Sun is the currency for placing plants\n\n**Grid-Based Placement**\n- 5 horizontal lanes (rows) \u00d7 9 columns\n- Each cell can hold one plant\n- Plants can only be placed on grass tiles (not on the path)\n- Once placed, plants cannot be moved\n\n**Lane-Based Combat**\n- Critters walk along their spawn lane toward the house\n- Most plants attack critters in their own lane\n- Some plants have special abilities (splash damage, slowing, etc.)\n\n**Wave System**\n- Each level has multiple waves of critters\n- Waves increase in difficulty (more critters, tougher types)\n- Short breaks between waves for strategic planning\n- Display wave counter (e.g., \"Wave 3/5\")\n\n### Progression and Engagement\n\n**Level Progression**\n- 20 levels total with increasing difficulty\n- Early levels introduce mechanics gradually\n- Later levels require strategic plant combinations\n- Each level has a unique wave composition\n\n**Plant Unlocking**\n- Start with 3 basic plants (Sunflower, Peashooter, Wall-nut)\n- Unlock 1-2 new plants every few levels\n- By level 20, players have access to 8-10 plant types\n\n**Replayability**\n- Try different plant combinations\n- Optimize sun usage and placement\n- Challenge of harder levels\n\n### Win/Lose Conditions\n\n**Victory**: Survive all waves in a level without any critter reaching the leftmost column\n**Defeat**: Any critter reaches the leftmost column (enters the house)\n\n## Starting Scope\n\nFor the initial implementation, we'll create a **highly polished, playable prototype** with the following scope:\n\n### Phase 1: Core Prototype (Initial Implementation)\n- **3 levels** with progressive difficulty (Levels 1-3)\n- **5 plant types**:\n  - Sunflower (generates sun)\n  - Peashooter (basic ranged attacker)\n  - Wall-nut (defensive blocker)\n  - Cherry Bomb (explosive, one-time use)\n  - Snow Pea (slowing attacker)\n- **3 critter types**:\n  - Basic Critter (slow, low health)\n  - Fast Critter (quick movement)\n  - Tank Critter (slow, high health)\n- **Core systems fully implemented**:\n  - Sunlight collection and management\n  - Grid-based plant placement\n  - Lane-based critter movement and combat\n  - Wave spawning system\n  - Victory/defeat conditions\n  - Level selection screen\n- **Polish elements**:\n  - Smooth animations for plants attacking and critters moving\n  - Particle effects for projectiles and explosions\n  - Sound effects for placement, attacks, and collection\n  - Background music\n  - UI feedback (sun counter, wave indicator, plant cooldowns)\n\n### Future Phases (Post-Launch Iterations)\n- **Phase 2**: Add levels 4-10, introduce 2-3 new plant types, 2 new critter types\n- **Phase 3**: Add levels 11-20, complete plant roster (8-10 types), add boss critters\n- **Phase 4**: Special abilities, power-ups, night levels, different environments\n\n## Game Perspective\n\n**Fixed-screen with side-scrolling elements**\n\nThe game uses a fixed camera showing the entire battlefield:\n- **Main view**: 5\u00d79 grid displayed in side view (critters approach from right to left)\n- **No camera movement**: All action visible on one screen\n- **2D side perspective**: Plants and critters shown in profile view\n- **Layered depth**: Background (house on left), gameplay grid (middle), sky (background for falling sun)\n\n## Game World and Level Design\n\n### Visual Layout\n\n```\n[HOUSE] [Grid: 5 rows \u00d7 9 columns] [Critter Spawn Area]\n  \ud83c\udfe0    [P][P][P][P][P][P][P][P][P]  \u27a1\ufe0f Critters\n        [P][P][P][P][P][P][P][P][P]\n        [P][P][P][P][P][P][P][P][P]\n        [P][P][P][P][P][P][P][P][P]\n        [P][P][P][P][P][P][P][P][P]\n```\n\n### Grid System\n- **5 lanes (rows)**: Each lane is an independent path for critters\n- **9 columns**: Provides strategic depth for plant placement\n- **Cell size**: 72\u00d772 pixels (optimized for 720px width with margins)\n- **Left side**: House graphic (the thing players are defending)\n- **Right side**: Critter spawn points (off-screen or at edge)\n\n### Level Designs (First 3 Levels)\n\n**Level 1: \"Garden Basics\"**\n- **Goal**: Introduce core mechanics\n- **Available plants**: Sunflower, Peashooter (Wall-nut locked)\n- **Waves**: 3 waves\n  - Wave 1: 5 Basic Critters (1 per lane, staggered)\n  - Wave 2: 8 Basic Critters (mixed lanes)\n  - Wave 3: 10 Basic Critters + 2 Fast Critters\n- **Starting sun**: 150\n- **Tutorial hints**: \"Collect falling sunlight!\", \"Plant Sunflowers to generate more sun\", \"Place Peashooters to attack critters\"\n\n**Level 2: \"Defensive Line\"**\n- **Goal**: Introduce defensive plants\n- **Available plants**: Sunflower, Peashooter, Wall-nut\n- **Waves**: 4 waves\n  - Wave 1: 8 Basic Critters\n  - Wave 2: 6 Basic Critters + 4 Fast Critters\n  - Wave 3: 10 Basic Critters + 3 Tank Critters\n  - Wave 4: 12 Basic Critters + 5 Fast Critters + 2 Tank Critters\n- **Starting sun**: 100\n- **Hint**: \"Use Wall-nuts to block tough critters!\"\n\n**Level 3: \"Explosive Defense\"**\n- **Goal**: Introduce special abilities and slowing\n- **Available plants**: All 5 types unlocked\n- **Waves**: 5 waves\n  - Wave 1: 10 Basic Critters\n  - Wave 2: 8 Basic Critters + 6 Fast Critters\n  - Wave 3: 5 Tank Critters + 8 Basic Critters\n  - Wave 4: 12 Fast Critters + 4 Tank Critters\n  - Wave 5: 15 Basic Critters + 8 Fast Critters + 5 Tank Critters\n- **Starting sun**: 75\n- **Hint**: \"Cherry Bombs clear entire areas! Snow Peas slow critters down!\"\n\n### Environmental Elements\n- **Background**: Cheerful garden scene with house on left, fence, blue sky\n- **Grid surface**: Grass tiles with subtle grid lines\n- **Sunlight**: Animated sun icons that fall from the sky\n- **Critter path**: Visual indication of the lanes (slightly worn grass or path markers)\n\n## Edit Mode Design\n\nEdit mode allows players to customize level parameters and experiment with different configurations. Keep it **simple and focused** for the initial implementation.\n\n### Editable Properties (Phase 1)\n\n**Level Configuration**\n- **Starting Sun**: Adjust initial sun amount (range: 0-500, step: 25)\n- **Sun Fall Rate**: How often sun falls from sky (range: 3-15 seconds)\n- **Wave Count**: Number of waves in the level (range: 1-10)\n\n**Wave Composition** (for each wave)\n- **Basic Critter Count**: Number of basic critters (range: 0-30)\n- **Fast Critter Count**: Number of fast critters (range: 0-20)\n- **Tank Critter Count**: Number of tank critters (range: 0-10)\n- **Wave Delay**: Seconds before next wave starts (range: 5-30)\n\n**Plant Availability**\n- **Toggle each plant type**: Enable/disable specific plants for the level\n- **Plant Costs**: Adjust sun cost for each plant (range: 25-300, step: 25)\n\n### Edit Mode UI\n\n**Layout**\n- **Top bar**: \"Edit Mode\" indicator, \"Play\" button to test changes\n- **Main area**: Game grid (non-interactive in edit mode)\n- **Right panel** (scrollable): Property editors organized by category\n  - Level Settings (collapsible section)\n  - Wave 1 Settings (collapsible)\n  - Wave 2 Settings (collapsible)\n  - etc.\n  - Plant Settings (collapsible)\n\n**Controls**\n- **Sliders**: For numeric values with live preview\n- **Toggles**: For enabling/disabling plants\n- **Add/Remove Wave buttons**: Dynamically adjust wave count\n- **Reset to Default**: Button to restore original level design\n\n### Constraints\n\nTo prevent broken game states:\n- **Minimum 1 wave** per level\n- **At least 1 plant type** must be enabled\n- **Sunflower cannot be disabled** (ensures sun generation is possible)\n- **Starting sun minimum**: 50 (enough to place at least one plant)\n- **Total critters per wave**: Maximum 50 (performance limit)\n- **Wave delay minimum**: 5 seconds (gives players time to prepare)\n\n### Future Edit Mode Features (Post-Launch)\n- Custom grid layouts (obstacles, different terrain)\n- Plant placement presets\n- Custom critter spawn patterns\n- Visual level editor (drag-and-drop critters)\n\n## Control Design\n\nGarden Guardians uses a **tap/click-based control scheme** optimized for the casual tower defense genre.\n\n### Mobile Controls (Touch)\n\n**Plant Selection**\n- **Plant cards** displayed at the top of the screen (horizontal row)\n- **Tap a plant card** to select it (card highlights)\n- **Tap a grid cell** to place the selected plant (if enough sun and cell is empty)\n- **Tap selected card again** to deselect\n\n**Sunlight Collection**\n- **Tap falling sun icons** to collect them (they disappear and add to sun counter)\n\n**Special Actions**\n- **Tap Cherry Bomb** after placement to detonate (or auto-detonates after 3 seconds)\n- **Tap menu button** (top-right) to pause and access options\n\n**UI Interaction**\n- **Tap buttons** for menu navigation, level selection, etc.\n- **Swipe** in level selection screen to browse levels (if needed)\n\n### Desktop Controls (Keyboard + Mouse)\n\n**Plant Selection & Placement**\n- **Click plant cards** at top to select\n- **Click grid cells** to place selected plant\n- **Number keys 1-5**: Quick-select plants (1 = first plant, 2 = second, etc.)\n- **Right-click or ESC**: Deselect current plant\n\n**Sunlight Collection**\n- **Click falling sun icons** to collect\n\n**Special Actions**\n- **Click Cherry Bomb** after placement to detonate\n- **ESC key**: Open pause menu\n- **Space bar**: Speed up time (optional fast-forward during waves)\n\n**UI Navigation**\n- **Click buttons** for menus\n- **Arrow keys**: Navigate level selection\n- **Enter**: Confirm selection\n\n### Input Handling Details\n\n**Touch Tracking**\n- Track touch IDs to distinguish between plant selection and placement\n- Prevent accidental placements when scrolling or multi-touching\n- Ignore touches on UI elements (don't place plants under buttons)\n\n**Mouse Handling**\n- Prevent default context menu on right-click\n- Show hover effects on plant cards and grid cells\n- Display plant preview/ghost on grid when plant is selected\n\n**Input State Management**\n- Clear selected plant when entering/exiting menus\n- Disable input during wave transitions or game over screens\n- Handle window blur (pause game if player switches tabs)\n\n**Accessibility**\n- Large touch targets (plant cards minimum 96\u00d796px)\n- Visual feedback for all interactions (highlights, animations)\n- Clear affordances (plant cards show sun cost and cooldown state)\n\n### Control Flow Example\n\n1. Player taps Sunflower card (costs 50 sun, player has 75 sun)\n2. Sunflower card highlights, cursor/touch shows plant preview\n3. Player taps empty grid cell in column 2, row 3\n4. Sunflower appears in that cell with planting animation\n5. Sun counter decreases by 50 (now shows 25)\n6. Sunflower card shows cooldown timer (5 seconds before can place another)\n7. Player taps falling sun icon \u2192 sun counter increases to 50\n\n## Plant Types (Phase 1)\n\n### 1. Sunflower\n- **Cost**: 50 sun\n- **Cooldown**: 5 seconds\n- **Health**: 300 HP\n- **Ability**: Generates 25 sun every 20 seconds\n- **Attack**: None (passive support plant)\n- **Strategy**: Essential for economy; place in back columns for safety\n\n### 2. Peashooter\n- **Cost**: 100 sun\n- **Cooldown**: 5 seconds\n- **Health**: 300 HP\n- **Ability**: Shoots peas at critters in its lane\n- **Attack**: 20 damage per pea, fires every 1.5 seconds, range: entire lane\n- **Projectile speed**: Fast (travels across screen in ~1 second)\n- **Strategy**: Basic offensive plant; place in middle columns for coverage\n\n### 3. Wall-nut\n- **Cost**: 50 sun\n- **Cooldown**: 20 seconds\n- **Health**: 4000 HP (very tanky)\n- **Ability**: Blocks critters, no attack\n- **Attack**: None (pure defense)\n- **Strategy**: Place in front of attackers to absorb damage; buy time for other plants\n\n### 4. Cherry Bomb\n- **Cost**: 150 sun\n- **Cooldown**: 30 seconds\n- **Health**: N/A (explodes immediately or after 3 seconds)\n- **Ability**: Explodes in a 3\u00d73 area, dealing massive damage\n- **Attack**: 1800 damage to all critters in explosion radius\n- **Strategy**: Emergency clear for overwhelming waves; expensive but powerful\n\n### 5. Snow Pea\n- **Cost**: 175 sun\n- **Cooldown**: 5 seconds\n- **Health**: 300 HP\n- **Ability**: Shoots frozen peas that slow critters\n- **Attack**: 20 damage per pea, fires every 1.5 seconds, range: entire lane\n- **Slow effect**: Reduces critter speed by 50% for 3 seconds\n- **Strategy**: Crowd control; place in lanes with fast critters\n\n## Critter Types (Phase 1)\n\n### 1. Basic Critter\n- **Health**: 200 HP\n- **Speed**: 1 cell per 3 seconds (slow)\n- **Damage**: 100 HP per bite (attacks plants in its cell)\n- **Attack speed**: 1 bite per 2 seconds\n- **Behavior**: Walks straight toward house; stops to eat plants\n- **Visual**: Small, round, cheerful-looking creature\n\n### 2. Fast Critter\n- **Health**: 100 HP\n- **Speed**: 1 cell per 1.5 seconds (fast)\n- **Damage**: 50 HP per bite\n- **Attack speed**: 1 bite per 1.5 seconds\n- **Behavior**: Rushes toward house; quickly eats through weak plants\n- **Visual**: Sleek, energetic creature with motion lines\n\n### 3. Tank Critter\n- **Health**: 1000 HP\n- **Speed**: 1 cell per 5 seconds (very slow)\n- **Damage**: 200 HP per bite\n- **Attack speed**: 1 bite per 3 seconds\n- **Behavior**: Slowly advances; soaks up damage; hard to stop\n- **Visual**: Large, armored creature with tough exterior\n\n## Game States and Flow\n\n### Main Menu\n- **Title screen** with \"Garden Guardians\" logo\n- **Play button**: Opens level selection\n- **Options button**: Sound settings (music/SFX volume)\n- **Credits button**: Shows game info\n\n### Level Selection\n- **Grid of level cards** (3 visible initially, more unlock as player progresses)\n- Each card shows:\n  - Level number\n  - Star rating (0-3 stars based on performance, initially locked)\n  - Lock icon if not yet unlocked\n- **Tap/click a level** to start it\n- **Back button** returns to main menu\n\n### Gameplay\n- **Top UI bar**:\n  - Sun counter (large, prominent)\n  - Wave indicator (\"Wave 2/5\")\n  - Menu button (pause)\n- **Plant selection bar**: Horizontal row of plant cards below top bar\n- **Main grid**: 5\u00d79 gameplay area\n- **Falling sun**: Animated sun icons drop from sky periodically\n\n### Pause Menu (during gameplay)\n- **Resume button**: Return to game\n- **Restart button**: Restart current level\n- **Quit button**: Return to level selection\n- **Options**: Volume sliders\n\n### Victory Screen\n- **\"Victory!\" message** with celebration animation\n- **Stars earned**: Display 1-3 stars based on performance\n  - 3 stars: No plants lost\n  - 2 stars: Less than 3 plants lost\n  - 1 star: Level completed\n- **Next Level button**: Proceed to next level (if available)\n- **Replay button**: Replay current level\n- **Level Select button**: Return to level selection\n\n### Defeat Screen\n- **\"Defeat!\" message** with sad animation\n- **Retry button**: Restart current level\n- **Level Select button**: Return to level selection\n\n## Art Style and Visual Theme\n\n**Garden Guardians** features a **hand-drawn, cartoon art style** with bright, cheerful colors and whimsical character designs.\n\n### Overall Aesthetic\n- **Style**: Hand-drawn cartoon with soft outlines and painterly textures\n- **Mood**: Lighthearted, fun, family-friendly\n- **Color palette**: \n  - Vibrant greens for grass and plants\n  - Warm yellows and oranges for sunlight\n  - Soft blues for sky\n  - Varied, saturated colors for critters (purples, reds, blues)\n- **Inspiration**: Casual mobile games, children's book illustrations\n\n### Visual Consistency\n- **Unified line weight**: Consistent outline thickness across all characters and objects\n- **Shading style**: Soft cel-shading with subtle gradients\n- **Viewing angle**: Side profile for all plants and critters (2D side-scrolling perspective)\n- **Proportions**: Slightly exaggerated, cute proportions (big eyes, rounded shapes)\n\n### Asset Specifications\n\n**Plants**\n- **Size**: Approximately 64\u00d764 pixels (fit within grid cell with padding)\n- **Style**: Friendly, expressive faces on plants (eyes, smiles)\n- **Detail level**: Medium detail with clear silhouettes\n- **Animation states**: Idle, attacking, damaged (will be handled with multiple assets or sprite sheets in future)\n\n**Critters**\n- **Size**: 48-72 pixels tall (varies by type)\n- **Style**: Quirky, non-threatening creatures (more silly than scary)\n- **Detail level**: Clear features, expressive faces\n- **Animation states**: Walking, attacking, defeated\n\n**Environment**\n- **Background**: Soft-focus garden scene with house, fence, trees\n- **Grid**: Grass texture with subtle grid lines (not too prominent)\n- **Sky**: Gradient blue with fluffy clouds\n\n**UI Elements**\n- **Plant cards**: Rounded rectangles with plant portraits, sun cost, cooldown indicator\n- **Buttons**: Rounded, colorful, with clear icons/text\n- **Sun counter**: Large, glowing sun icon with number\n- **Effects**: Sparkles for sun collection, explosion particles for Cherry Bomb, ice crystals for Snow Pea\n\n### Technical Rendering Approach\n\n**Generated Assets**:\n- All plants (5 types, multiple states)\n- All critters (3 types, multiple states)\n- Background scene\n- UI elements (plant cards, buttons, icons)\n- Particle effects (projectiles, explosions)\n\n**Code-Rendered Elements**:\n- Grid lines (CSS borders or canvas lines)\n- Health bars (simple rectangles)\n- Cooldown overlays (semi-transparent fills)\n- Text (sun counter, wave indicator, menus)", "persistent_storage_config": null, "game_metadata": {"game_id": "01KSQWCW6KJJXDJA1GDEDRF9AJ", "title": "Plant vs Zombies 2", "description": "Defend your garden by strategically placing plants with unique abilities to stop waves of quirky critters from reaching your house!", "thumbnail_url": "https://d2oir5eh8rty2e.cloudfront.net/assets/images/thumbnail_5b3e6ff6-a071-42ff-9728-e655c689ea00.webp", "created_at": 1779991737, "updated_at": 1791973838454.4243, "art_style": null, "is_remix": true, "base_game_id": "01KRVNFBM1Q33BKXR5YQX7SDAX"}, "task_plan": null}