/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var BackgroundGradient = Container.expand(function () { var self = Container.call(this); self.gradientElements = []; self.init = function () { // Create gradient effect with multiple layers for (var i = 0; i < 5; i++) { var element = self.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 25, scaleY: 25, tint: 0x1a0000 }); element.x = 1024; element.y = 1366 + i * 300; element.alpha = 0.05 + i * 0.02; self.gradientElements.push(element); } }; return self; }); var Ball = Container.expand(function () { var self = Container.call(this); self.ballGraphics = null; self.points = 5; self.speed = 0; self.vx = 0; self.vy = 0; self.behavior = 'static'; self.fleeDistance = 150; self.collected = false; self.init = function (level) { // Calculate base level and difficulty tier var baseLevel = (level - 1) % 9 + 1; var difficultyTier = Math.floor((level - 1) / 9); // Create ball graphic with glow effect self.ballGraphics = self.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5, tint: 0xFFD700 }); // Add inner glow var innerGlow = self.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.05, scaleY: 1.05, tint: 0xFFFFFF }); innerGlow.alpha = 0.8; // Add outer glow var outerGlow = self.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.95, scaleY: 1.95, tint: 0xFF6B6B }); outerGlow.alpha = 0.3; // Pulsing animation tween(outerGlow, { scaleX: 2.25, scaleY: 2.25, alpha: 0.1 }, { duration: 1000, easing: tween.easeInOut, loop: true, yoyo: true }); // Set behavior based on base level if (baseLevel === 1) { self.behavior = 'static'; self.x = 200 + Math.random() * 1648; self.y = 300 + Math.random() * 2132; // Apply difficulty modifiers self.points = 5 + difficultyTier * 2; } else if (baseLevel === 2) { self.behavior = 'random'; self.x = Math.random() * 2048; self.y = Math.random() * 2732; self.speed = (1 + Math.random() * 2) * (1 + difficultyTier * 0.3); var angle = Math.random() * Math.PI * 2; self.vx = Math.cos(angle) * self.speed; self.vy = Math.sin(angle) * self.speed; self.points = 7 + difficultyTier * 3; } else if (baseLevel === 3) { self.behavior = 'falling'; self.x = Math.random() * 2048; self.y = -50; self.vy = (2 + Math.random() * 3) * (1 + difficultyTier * 0.4); self.points = 7 + difficultyTier * 3; } else if (baseLevel === 4) { self.behavior = 'fleeing'; self.x = 200 + Math.random() * 1648; self.y = 300 + Math.random() * 2132; self.speed = 3 * (1 + difficultyTier * 0.3); self.fleeDistance = 150 + difficultyTier * 50; self.points = 10 + difficultyTier * 4; } else if (baseLevel === 5) { self.behavior = 'roaming'; self.x = Math.random() * 2048; self.y = Math.random() * 2732; self.speed = (4 + Math.random() * 2) * (1 + difficultyTier * 0.4); var angle = Math.random() * Math.PI * 2; self.vx = Math.cos(angle) * self.speed; self.vy = Math.sin(angle) * self.speed; self.points = 15 + difficultyTier * 5; } else if (baseLevel === 6) { // Level 6: Orbiting balls self.behavior = 'orbiting'; self.orbitCenterX = 1024; self.orbitCenterY = 1366; self.orbitRadius = 200 + Math.random() * 300 - difficultyTier * 30; self.orbitAngle = Math.random() * Math.PI * 2; self.orbitSpeed = (0.01 + Math.random() * 0.02) * (1 + difficultyTier * 0.3); self.points = 12 + difficultyTier * 4; } else if (baseLevel === 7) { // Level 7: Mix of fleeing and static balls if (Math.random() < 0.7 + difficultyTier * 0.1) { self.behavior = 'fleeing'; self.speed = (4 + Math.random() * 2) * (1 + difficultyTier * 0.3); self.fleeDistance = 200 + difficultyTier * 50; self.points = 15 + difficultyTier * 5; } else { self.behavior = 'static'; self.points = 5 + difficultyTier * 2; } self.x = 200 + Math.random() * 1648; self.y = 300 + Math.random() * 2132; } else if (baseLevel === 8) { // Level 8: Phasing balls that appear and disappear self.behavior = 'phasing'; self.x = Math.random() * 2048; self.y = Math.random() * 2732; self.phaseTimer = 0; self.phaseInterval = Math.max(60, 120 + Math.random() * 60 - difficultyTier * 20); self.visible = true; self.points = 20 + difficultyTier * 6; // Some balls are negative (decoy) if (Math.random() < 0.3 + difficultyTier * 0.1) { self.isNegative = true; self.points = -(15 + difficultyTier * 5); self.ballGraphics.tint = 0xFF4444; // Red tint for negative } } else if (baseLevel === 9) { // Level 9: Chameleon balls that change color self.behavior = 'chameleon'; self.x = Math.random() * 2048; self.y = Math.random() * 2732; self.speed = (3 + Math.random() * 3) * (1 + difficultyTier * 0.3); var angle = Math.random() * Math.PI * 2; self.vx = Math.cos(angle) * self.speed; self.vy = Math.sin(angle) * self.speed; self.colorTimer = 0; self.colorInterval = Math.max(90, 180 + Math.random() * 120 - difficultyTier * 30); self.currentColor = 0; self.colors = [0xFFD700, 0xFF4444, 0x44FF44]; // Gold, Red, Green self.points = 25 + difficultyTier * 7; } // Apply difficulty modifiers to visual effects if (difficultyTier > 0) { // Make balls slightly smaller at higher difficulties var sizeModifier = 1 - difficultyTier * 0.1; self.ballGraphics.scaleX *= sizeModifier; self.ballGraphics.scaleY *= sizeModifier; innerGlow.scaleX *= sizeModifier; innerGlow.scaleY *= sizeModifier; outerGlow.scaleX *= sizeModifier; outerGlow.scaleY *= sizeModifier; } // Spawn animation with rotation and scale self.scaleX = 0; self.scaleY = 0; self.rotation = Math.random() * Math.PI * 2; tween(self, { scaleX: 1, scaleY: 1, rotation: 0 }, { duration: 800, easing: tween.bounceOut }); }; self.update = function () { if (self.collected) { return; } if (self.behavior === 'random') { self.x += self.vx; self.y += self.vy; // Bounce off walls if (self.x <= 40 || self.x >= 2008) { self.vx = -self.vx; LK.getSound('bounce').play(); } if (self.y <= 40 || self.y >= 2692) { self.vy = -self.vy; LK.getSound('bounce').play(); } } else if (self.behavior === 'falling') { self.y += self.vy; // Remove if off screen if (self.y > 2782) { self.collected = true; for (var i = 0; i < balls.length; i++) { if (balls[i] === self) { balls.splice(i, 1); break; } } LK.getSound('fall').play(); self.destroy(); } } else if (self.behavior === 'fleeing') { // Flee from mouse position if (mouseX !== null && mouseY !== null) { var dx = self.x - mouseX; var dy = self.y - mouseY; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < self.fleeDistance && dist > 0) { // Normalize and apply flee force dx /= dist; dy /= dist; self.x += dx * self.speed; self.y += dy * self.speed; // Keep within bounds self.x = Math.max(40, Math.min(2008, self.x)); self.y = Math.max(40, Math.min(2692, self.y)); // Play flee sound occasionally if (Math.random() < 0.02) { LK.getSound('flee').play(); } } } } else if (self.behavior === 'roaming') { self.x += self.vx; self.y += self.vy; // Bounce off walls if (self.x <= 40 || self.x >= 2008) { self.vx = -self.vx; LK.getSound('bounce').play(); } if (self.y <= 40 || self.y >= 2692) { self.vy = -self.vy; LK.getSound('bounce').play(); } // Occasionally change direction if (Math.random() < 0.02) { var angle = Math.random() * Math.PI * 2; self.vx = Math.cos(angle) * self.speed; self.vy = Math.sin(angle) * self.speed; LK.getSound('roam').play(); } } else if (self.behavior === 'orbiting') { // Orbital movement around center point self.orbitAngle += self.orbitSpeed; self.x = self.orbitCenterX + Math.cos(self.orbitAngle) * self.orbitRadius; self.y = self.orbitCenterY + Math.sin(self.orbitAngle) * self.orbitRadius; self.rotation = self.orbitAngle + Math.PI / 2; // Play orbit sound occasionally if (Math.random() < 0.005) { LK.getSound('orbit').play(); } } else if (self.behavior === 'phasing') { // Phase in and out of visibility self.phaseTimer++; if (self.phaseTimer >= self.phaseInterval) { self.phaseTimer = 0; self.visible = !self.visible; self.alpha = self.visible ? 1 : 0.3; // Can only be collected when fully visible self.interactive = self.visible; LK.getSound('phase').play(); } } else if (self.behavior === 'chameleon') { // Change colors periodically self.colorTimer++; if (self.colorTimer >= self.colorInterval) { self.colorTimer = 0; self.currentColor = (self.currentColor + 1) % self.colors.length; tween(self.ballGraphics, { tint: self.colors[self.currentColor] }, { duration: 500, easing: tween.easeInOut }); LK.getSound('colorChange').play(); } // Roaming movement self.x += self.vx; self.y += self.vy; // Bounce off walls if (self.x <= 40 || self.x >= 2008) { self.vx = -self.vx; LK.getSound('bounce').play(); } if (self.y <= 40 || self.y >= 2692) { self.vy = -self.vy; LK.getSound('bounce').play(); } } }; self.down = function () { if (self.collected) { return; } self.collected = true; // Calculate points based on ball type var basePoints = self.points; // Check if ball is red (any red tint value) if (self.ballGraphics && (self.ballGraphics.tint === 0xFF4444 || self.ballGraphics.tint === 0xFF0000 || self.ballGraphics.tint >= 0xFF0000 && self.ballGraphics.tint <= 0xFF4444)) { basePoints = 5; // All red balls give 5 points } else if (self.behavior === 'fleeing') { basePoints = 10; } else if (self.behavior === 'roaming') { basePoints = 15; } else if (self.behavior === 'falling') { basePoints = 7; } else if (self.behavior === 'orbiting') { basePoints = 12; } else if (self.behavior === 'phasing') { basePoints = 20; } else if (self.behavior === 'chameleon') { // Level 9: Check if ball matches target color if (currentLevel === 9 && self.ballGraphics && targetColor) { // First check if it's red - red balls always give 5 points if (self.ballGraphics.tint === 0xFF4444 || self.ballGraphics.tint === 0xFF0000) { basePoints = 5; } else if (self.ballGraphics.tint === targetColor) { basePoints = 30; // Bonus for matching color } else { basePoints = 5; // Reduced points for wrong color } } else { basePoints = 25; } } // Handle negative balls (Level 8) if (self.isNegative) { basePoints = -15; // Create warning effect createExplosion(self.x, self.y, 0xFF0000); screenShake(15, 400); } // Award points LK.setScore(LK.getScore() + basePoints); LK.getSound('hit').play(); // Create floating score text var scoreFloat = game.addChild(new Container()); scoreFloat.x = self.x; scoreFloat.y = self.y; var floatText = new Text2('+' + basePoints, { size: 60, fill: 0xFFD700, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); floatText.anchor.set(0.5, 0.5); scoreFloat.addChild(floatText); // Animate floating score tween(scoreFloat, { y: self.y - 100, alpha: 0 }, { duration: 1000, easing: tween.easeOut, onFinish: function onFinish() { scoreFloat.destroy(); } }); // Collection animation tween(self.ballGraphics, { scaleX: 1.5, scaleY: 1.5, alpha: 0 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { for (var i = 0; i < balls.length; i++) { if (balls[i] === self) { balls.splice(i, 1); break; } } self.destroy(); } }); // Create particle effect - bright red explosion createExplosion(self.x, self.y, 0xFF0000); }; return self; }); var Bird = Container.expand(function () { var self = Container.call(this); var birdPixel = self.attachAsset('birdPixel', { anchorX: 0.5, anchorY: 0.5 }); self.targetX = 0; self.targetY = 0; self.speed = 0.02; self.update = function () { var dx = self.targetX - self.x; var dy = self.targetY - self.y; self.x += dx * self.speed; self.y += dy * self.speed; if (Math.abs(dx) < 5 && Math.abs(dy) < 5) { self.findNewTarget(); } }; self.findNewTarget = function () { var angle = Math.random() * Math.PI * 2; var distance = 100 + Math.random() * 200; self.targetX = self.x + Math.cos(angle) * distance; self.targetY = self.y + Math.sin(angle) * distance; self.targetX = Math.max(100, Math.min(1948, self.targetX)); self.targetY = Math.max(100, Math.min(1000, self.targetY)); }; return self; }); var FloatingElement = Container.expand(function () { var self = Container.call(this); self.elementGraphics = null; self.floatSpeed = 0.5; self.bobAmount = 2; self.bobSpeed = 0.05; self.initialY = 0; self.time = 0; self.init = function (type, x, y) { self.x = x; self.y = y; self.initialY = y; self.time = Math.random() * Math.PI * 2; if (type === 'cloud') { // Create cloud with multiple layers var cloudBase = self.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 0.8, tint: 0x2a2a2a }); cloudBase.alpha = 0.3; self.elementGraphics = self.attachAsset('pixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 0.6, tint: 0x3a3a3a }); self.floatSpeed = 0.3; self.alpha = 0.4; } else if (type === 'star') { // Create sparkling star self.elementGraphics = self.attachAsset('tinyPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 1, scaleY: 1, tint: 0xFFD700 }); self.floatSpeed = 0.1; self.bobAmount = 1; // Add twinkle animation tween(self.elementGraphics, { alpha: 0.3, scaleX: 0.8, scaleY: 0.8 }, { duration: 1000 + Math.random() * 2000, easing: tween.easeInOut, loop: true, yoyo: true }); } // Fade in animation self.alpha = 0; tween(self, { alpha: self.alpha || 0.6 }, { duration: 2000, easing: tween.easeOut }); }; self.update = function () { self.x -= self.floatSpeed; self.time += self.bobSpeed; self.y = self.initialY + Math.sin(self.time) * self.bobAmount; // Reset position when off screen if (self.x < -100) { self.x = 2148; self.y = Math.random() * 1500 + 100; self.initialY = self.y; } }; return self; }); var InteractiveObject = Container.expand(function () { var self = Container.call(this); var objectGraphics = self.attachAsset('pixel', { anchorX: 0.5, anchorY: 0.5 }); self.init = function (x, y) { self.x = x; self.y = y; self.visible = true; }; self.down = function () { self.visible = false; }; return self; }); var OrbitingBall = Container.expand(function () { var self = Container.call(this); self.ballGraphics = null; self.points = 12; self.orbitRadius = 200; self.orbitSpeed = 0.02; self.orbitAngle = 0; self.centerX = 1024; self.centerY = 1366; self.collected = false; self.init = function () { // Create ball with orbital effect self.ballGraphics = self.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.3, scaleY: 1.3, tint: 0x00FFFF }); // Add orbital trail var trail = self.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.8, scaleY: 1.8, tint: 0x00FFFF }); trail.alpha = 0.2; // Set random starting angle self.orbitAngle = Math.random() * Math.PI * 2; self.orbitRadius = 150 + Math.random() * 200; self.orbitSpeed = 0.01 + Math.random() * 0.02; // Spawn animation self.scaleX = 0; self.scaleY = 0; tween(self, { scaleX: 1, scaleY: 1 }, { duration: 500, easing: tween.easeOut }); }; self.update = function () { if (self.collected) { return; } // Orbital movement self.orbitAngle += self.orbitSpeed; self.x = self.centerX + Math.cos(self.orbitAngle) * self.orbitRadius; self.y = self.centerY + Math.sin(self.orbitAngle) * self.orbitRadius; self.rotation = self.orbitAngle + Math.PI / 2; }; self.down = Ball.prototype.down; return self; }); var Particle = Container.expand(function () { var self = Container.call(this); self.particleGraphics = null; self.vx = 0; self.vy = 0; self.gravity = 0.2; self.friction = 0.98; self.lifespan = 60; self.maxLife = 60; self.init = function (x, y, color, size) { self.x = x; self.y = y; // Choose pixel size based on size parameter for dust effect var pixelType = 'pixel'; var baseScale = 1; if (size < 0.3) { pixelType = 'tinyPixel'; baseScale = 0.5 + Math.random() * 0.3; // More size variation for tiny particles } else if (size < 0.6) { pixelType = 'smallPixel'; baseScale = 0.7 + Math.random() * 0.4; } self.particleGraphics = self.attachAsset(pixelType, { anchorX: 0.5, anchorY: 0.5, scaleX: baseScale, scaleY: baseScale, tint: color || 0xFFFFFF }); // Dust-like velocity patterns var angle = Math.random() * Math.PI * 2; var speed; if (size < 0.3) { // Tiny particles: slower, more floating movement speed = 0.5 + Math.random() * 2; self.gravity = 0.05 + Math.random() * 0.1; self.friction = 0.995; } else if (size < 0.6) { // Medium particles: moderate speed speed = 1.5 + Math.random() * 3; self.gravity = 0.15 + Math.random() * 0.1; self.friction = 0.98; } else { // Large particles: faster, more dramatic speed = 3 + Math.random() * 5; self.gravity = 0.2 + Math.random() * 0.15; self.friction = 0.97; } self.vx = Math.cos(angle) * speed; self.vy = Math.sin(angle) * speed - (1 + Math.random() * 2); // Varied lifespans for dust-like effect if (size < 0.3) { self.lifespan = 60 + Math.random() * 40; // Tiny particles last longer } else { self.lifespan = 30 + Math.random() * 30; // Larger particles fade faster } self.maxLife = self.lifespan; }; self.update = function () { self.x += self.vx; self.y += self.vy; self.vy += self.gravity; self.vx *= self.friction; self.lifespan--; self.alpha = self.lifespan / self.maxLife; if (self.lifespan <= 0) { self.destroy(); for (var i = 0; i < particles.length; i++) { if (particles[i] === self) { particles.splice(i, 1); break; } } } }; return self; }); var Pixel = Container.expand(function () { var self = Container.call(this); self.pixelType = 'trunk'; self.pixelGraphics = null; self.init = function (type, color, size) { self.pixelType = type; if (self.pixelGraphics) { self.pixelGraphics.destroy(); } // Choose appropriate pixel asset based on size var pixelAsset = 'pixel'; var baseScale = size || 1; if (size && size < 0.5) { pixelAsset = 'tinyPixel'; baseScale = 1; } else if (size && size < 0.8) { pixelAsset = 'smallPixel'; baseScale = 1; } var assetConfig = { anchorX: 0.5, anchorY: 0.5, scaleX: baseScale, scaleY: baseScale }; if (color) { assetConfig.tint = color; } if (type === 'seed') { self.pixelGraphics = self.attachAsset('seedPixel', {}); } else if (type === 'leaf') { self.pixelGraphics = self.attachAsset('leafPixel', {}); } else if (type === 'flower') { self.pixelGraphics = self.attachAsset('flowerPixel', {}); } else if (type === 'bird') { self.pixelGraphics = self.attachAsset('birdPixel', {}); } else if (type === 'root' || type === 'trunk' || type === 'branch') { self.pixelGraphics = self.attachAsset(pixelAsset, {}); } else { self.pixelGraphics = self.attachAsset(pixelAsset, {}); } self.alpha = 0; }; self.fadeIn = function (duration) { tween(self, { alpha: 1 }, { duration: duration || 500, easing: tween.easeOut }); }; self.grow = function (targetScale, duration) { if (self.pixelGraphics) { tween(self.pixelGraphics, { scaleX: targetScale, scaleY: targetScale }, { duration: duration || 1000, easing: tween.easeInOut }); } }; return self; }); var ShepherdBall = Container.expand(function () { var self = Container.call(this); self.collected = false; self.lifespan = 300; // 5 seconds self.catchRadius = 300; self.init = function () { // Create shepherd ball with special appearance var outerGlow = self.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 3, scaleY: 3, tint: 0x00FFFF }); outerGlow.alpha = 0.2; var midGlow = self.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2, tint: 0x00FFFF }); midGlow.alpha = 0.4; self.ballGraphics = self.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5, tint: 0x00FFFF }); // Position randomly self.x = 200 + Math.random() * 1648; self.y = 300 + Math.random() * 2132; // Spawn animation self.scaleX = 0; self.scaleY = 0; tween(self, { scaleX: 1.2, scaleY: 1.2 }, { duration: 500, easing: tween.bounceOut, onFinish: function onFinish() { tween(self, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.easeInOut }); } }); // Pulsing effect tween(outerGlow, { scaleX: 3.5, scaleY: 3.5, alpha: 0.1 }, { duration: 1000, easing: tween.easeInOut, loop: true, yoyo: true }); }; self.update = function () { if (self.collected) { return; } self.lifespan--; // Start fading when about to disappear if (self.lifespan < 60) { self.alpha = self.lifespan / 60; } // Remove when lifespan ends if (self.lifespan <= 0) { self.collected = true; self.destroy(); } }; self.down = function () { if (self.collected) { return; } self.collected = true; // Collect all fleeing balls in radius var collectedCount = 0; for (var i = balls.length - 1; i >= 0; i--) { var ball = balls[i]; if (ball.behavior === 'fleeing' && !ball.collected) { var dx = ball.x - self.x; var dy = ball.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < self.catchRadius) { ball.collected = true; collectedCount++; // Award points LK.setScore(LK.getScore() + ball.points); // Create collection effect createExplosion(ball.x, ball.y, 0x00FFFF); // Animate ball collection tween(ball, { x: self.x, y: self.y, scaleX: 0, scaleY: 0, rotation: Math.PI * 2 }, { duration: 300, easing: tween.easeIn, onFinish: function onFinish() { ball.destroy(); } }); } } } // Bonus points for multiple catches if (collectedCount > 0) { var bonusPoints = collectedCount * 10; LK.setScore(LK.getScore() + bonusPoints); // Show bonus text var bonusText = game.addChild(new Container()); bonusText.x = self.x; bonusText.y = self.y; var text = new Text2('LASSO! +' + (collectedCount * 15 + bonusPoints), { size: 80, fill: 0x00FFFF, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); text.anchor.set(0.5, 0.5); bonusText.addChild(text); tween(bonusText, { y: self.y - 150, alpha: 0 }, { duration: 1500, easing: tween.easeOut, onFinish: function onFinish() { bonusText.destroy(); } }); LK.getSound('lasso').play(); } // Play sound LK.getSound('hit').play(); // Remove shepherd ball with effect tween(self, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 400, easing: tween.easeOut, onFinish: function onFinish() { self.destroy(); } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Level-based ball collection game game.setBackgroundColor(0x0a0a0a); // Deep black background for dramatic contrast // GLAUD Logo Container var glaudContainer = game.addChild(new Container()); glaudContainer.visible = false; // Game variables var balls = []; var particles = []; var floatingElements = []; var currentLevel = 1; var levelScore = 0; var levelTimeLimit = 30; // Level 1 starts with 30 seconds var levelTimer = 0; var levelStartTime = 0; var gameTime = 0; // Add gameTime variable var isTransitioning = false; var screenShakeX = 0; var screenShakeY = 0; var shakeIntensity = 0; var shakeDuration = 0; var mouseX = null; var mouseY = null; var ballSpawnTimer = 0; var levelRequirements = [100, 200, 300, 400, 500, 600, 700, 800, 900]; // Score requirements per level var highestLevel = storage.highestLevel || 1; // Load saved highest level // Function to get level requirement for any level function getLevelRequirement(level) { var baseLevel = (level - 1) % 9 + 1; var difficultyTier = Math.floor((level - 1) / 9); var baseRequirement = levelRequirements[baseLevel - 1]; // Increase requirements by 50% for each difficulty tier return Math.floor(baseRequirement * Math.pow(1.5, difficultyTier)); } var targetColor = 0; // For level 9 color targeting var targetColorIndex = 0; var colorTargetTimer = 0; var shepherdBalls = []; // For level 7 shepherd balls // Score display with shadow effect var scoreTextShadow = new Text2('Level 1 | Score: 0 | Time: 30', { size: 62, fill: 0x000000 }); scoreTextShadow.anchor.set(0, 0); scoreTextShadow.x = 182; scoreTextShadow.y = 12; scoreTextShadow.alpha = 0.5; LK.gui.topLeft.addChild(scoreTextShadow); var scoreText = new Text2('Level 1 | Score: 0 | Time: 30', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); scoreText.x = 180; scoreText.y = 10; LK.gui.topLeft.addChild(scoreText); // Highest level display var highestLevelText = new Text2('Best: Level ' + highestLevel, { size: 40, fill: 0xFFA500 }); highestLevelText.anchor.set(1, 0); highestLevelText.x = -20; highestLevelText.y = 10; LK.gui.topRight.addChild(highestLevelText); highestLevelText.visible = false; // Initialize progress bar animation variables var lastProgressValue = 0; var progressPulseActive = false; // Level transition container var transitionContainer = game.addChild(new Container()); transitionContainer.x = 1024; transitionContainer.y = 1366; // Level transition text with outline - modern style var levelTransitionOutline = new Text2('', { size: 124, fill: 0x000000, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); levelTransitionOutline.anchor.set(0.5, 0.5); levelTransitionOutline.x = 4; levelTransitionOutline.y = 4; levelTransitionOutline.alpha = 0.5; transitionContainer.addChild(levelTransitionOutline); var levelTransitionText = new Text2('', { size: 120, fill: 0xFFFFFF, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); levelTransitionText.anchor.set(0.5, 0.5); transitionContainer.addChild(levelTransitionText); // Add glow effect container var glowContainer = new Container(); glowContainer.x = 0; glowContainer.y = 0; transitionContainer.addChildAt(glowContainer, 0); // Create glow layers for (var i = 0; i < 3; i++) { var glowText = new Text2('', { size: 120 + i * 8, fill: 0xFFD700, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); glowText.anchor.set(0.5, 0.5); glowText.alpha = 0.15 - i * 0.05; glowContainer.addChild(glowText); } transitionContainer.visible = false; // Create background gradient var bgGradient = new BackgroundGradient(); bgGradient.init(); game.addChild(bgGradient); // Start background music LK.playMusic('gameMusic', { loop: true }); // GLAUD intro function function showGLAUDIntro() { isTransitioning = true; // Create intro container var introContainer = game.addChild(new Container()); introContainer.x = 1024; introContainer.y = 1366; introContainer.alpha = 0; // Create game ball shower effect var ballShower = []; for (var i = 0; i < 15; i++) { var ballContainer = new Container(); var ball = ballContainer.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.5 + Math.random() * 0.5, scaleY: 0.5 + Math.random() * 0.5, tint: i < 5 ? 0xFFD700 : i < 10 ? 0xFF4444 : 0x44FF44 }); ballContainer.x = -800 + Math.random() * 1600; ballContainer.y = -800 - Math.random() * 400; ballContainer.vx = (Math.random() - 0.5) * 2; ballContainer.vy = 5 + Math.random() * 5; ballContainer.rotation = Math.random() * Math.PI * 2; introContainer.addChild(ballContainer); ballShower.push(ballContainer); } // Create GLAUD text with multiple layers for effect var glaudOutline = new Text2('GLAUD', { size: 240, fill: 0xFFD700, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); glaudOutline.anchor.set(0.5, 0.5); glaudOutline.alpha = 0.2; introContainer.addChild(glaudOutline); var glaudShadow = new Text2('GLAUD', { size: 200, fill: 0x000000, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); glaudShadow.anchor.set(0.5, 0.5); glaudShadow.x = 8; glaudShadow.y = 8; glaudShadow.alpha = 0.5; introContainer.addChild(glaudShadow); var glaudGlow = new Text2('GLAUD', { size: 210, fill: 0xFF6600, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); glaudGlow.anchor.set(0.5, 0.5); glaudGlow.alpha = 0.3; introContainer.addChild(glaudGlow); var glaudText = new Text2('GLAUD', { size: 180, fill: 0xFFA500, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); glaudText.anchor.set(0.5, 0.5); introContainer.addChild(glaudText); // Add dynamic subtitle var subtitle = new Text2('BALL COLLECTOR', { size: 60, fill: 0xFFD700, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); subtitle.anchor.set(0.5, 0.5); subtitle.y = 100; subtitle.alpha = 0; introContainer.addChild(subtitle); // Create energy ring var energyRing = introContainer.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.1, scaleY: 0.1, tint: 0xFFA500 }); energyRing.alpha = 0.8; // Start with explosion effect introContainer.scaleX = 0.1; introContainer.scaleY = 0.1; introContainer.alpha = 1; // Explosive entrance tween(introContainer, { scaleX: 1.2, scaleY: 1.2 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { tween(introContainer, { scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.easeInOut }); } }); // Animate energy ring tween(energyRing, { scaleX: 8, scaleY: 8, alpha: 0 }, { duration: 800, easing: tween.easeOut }); // Animate balls falling var ballTimer = LK.setInterval(function () { for (var i = 0; i < ballShower.length; i++) { var ballContainer = ballShower[i]; ballContainer.x += ballContainer.vx; ballContainer.y += ballContainer.vy; ballContainer.rotation += 0.1; ballContainer.vy += 0.3; if (ballContainer.y > 800) { ballContainer.y = -800 - Math.random() * 400; ballContainer.x = -800 + Math.random() * 1600; ballContainer.vy = 5 + Math.random() * 5; } } }, 16); // Quick glow pulse tween(glaudGlow, { scaleX: 1.15, scaleY: 1.15, alpha: 0.6 }, { duration: 400, easing: tween.easeInOut, yoyo: true, repeat: 1 }); // Show subtitle LK.setTimeout(function () { tween(subtitle, { alpha: 1, y: 120 }, { duration: 300, easing: tween.easeOut }); }, 200); // Create collecting effect LK.setTimeout(function () { // All balls converge to center for (var i = 0; i < ballShower.length; i++) { (function (ballContainer, index) { tween(ballContainer, { x: 0, y: 0, scaleX: 0, scaleY: 0, rotation: Math.PI * 4 }, { duration: 400, delay: index * 20, easing: tween.easeIn }); })(ballShower[i], i); } // Flash effect when balls are collected LK.setTimeout(function () { var flash = introContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 20, scaleY: 20, tint: 0xFFD700 }); flash.alpha = 0.8; tween(flash, { alpha: 0 }, { duration: 300, easing: tween.easeOut }); // Score burst effect var scoreText = new Text2('+1000', { size: 100, fill: 0xFFD700, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); scoreText.anchor.set(0.5, 0.5); scoreText.y = -50; scoreText.alpha = 0; introContainer.addChild(scoreText); tween(scoreText, { y: -150, alpha: 1 }, { duration: 400, easing: tween.easeOut, onFinish: function onFinish() { tween(scoreText, { alpha: 0 }, { duration: 200, easing: tween.easeIn }); } }); }, 300); }, 800); // Quick transition to game LK.setTimeout(function () { LK.clearInterval(ballTimer); // Create permanent GLAUD logo in top right glaudContainer.x = 1900; glaudContainer.y = 80; var glaudLogo = new Text2('GLAUD', { size: 60, fill: 0xFFA500, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); glaudLogo.anchor.set(1, 0); glaudContainer.addChild(glaudLogo); // Quick fade out with rotation tween(introContainer, { alpha: 0, scaleX: 0.5, scaleY: 0.5, rotation: 0.2 }, { duration: 400, easing: tween.easeIn, onFinish: function onFinish() { introContainer.destroy(); // Show GLAUD logo and highest level glaudContainer.alpha = 0; glaudContainer.visible = true; tween(glaudContainer, { alpha: 1 }, { duration: 300, easing: tween.easeOut }); highestLevelText.visible = true; isTransitioning = false; // Start first level startLevel(1); } }); }, 1500); } // Create GLAUD intro showGLAUDIntro(); // Particle and effect functions function createExplosion(x, y, color) { // Create multi-layered explosion effect for (var i = 0; i < 30; i++) { var particle = new Particle(); // Mix of particle sizes for depth var sizeVariation = 0.1 + Math.random() * 0.5; // Vary colors for richness var particleColor = color; if (Math.random() < 0.3) { particleColor = 0xFFFFFF; // White sparkles } else if (Math.random() < 0.5) { particleColor = 0xFFD700; // Gold accents } particle.init(x, y, particleColor, sizeVariation); particles.push(particle); game.addChild(particle); } // Create ring effect var ring = game.addChild(new Container()); ring.x = x; ring.y = y; var ringGraphic = ring.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.1, scaleY: 0.1, tint: color }); ringGraphic.alpha = 0.8; tween(ringGraphic, { scaleX: 3, scaleY: 3, alpha: 0 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { ring.destroy(); } }); } function createTrailParticle(x, y, color) { var particle = new Particle(); particle.init(x, y, color, 0.2); particle.lifespan = 20; particle.maxLife = 20; particles.push(particle); game.addChild(particle); } function screenShake(intensity, duration) { shakeIntensity = intensity; shakeDuration = duration; } function updateScreenShake() { if (shakeDuration > 0) { screenShakeX = (Math.random() - 0.5) * shakeIntensity; screenShakeY = (Math.random() - 0.5) * shakeIntensity; game.x = screenShakeX; game.y = screenShakeY; shakeDuration -= 16; } else { game.x = 0; game.y = 0; } } // Function to spawn balls based on level function spawnBall() { if (isTransitioning) { return; } var ball = new Ball(); ball.init(currentLevel); balls.push(ball); game.addChild(ball); LK.getSound('spawn').play(); } // Function to start a new level function startLevel(level) { currentLevel = level; levelScore = 0; levelStartTime = gameTime; // Save highest level reached if (level > highestLevel) { highestLevel = level; storage.highestLevel = highestLevel; highestLevelText.setText('Best: Level ' + highestLevel); } // Calculate base level and difficulty tier var baseLevel = (level - 1) % 9 + 1; var difficultyTier = Math.floor((level - 1) / 9); // Set time limit for level with difficulty adjustments if (baseLevel === 1) { levelTimeLimit = Math.max(20, 30 - difficultyTier * 5); } else if (baseLevel <= 5) { levelTimeLimit = Math.max(30, 30 + (baseLevel - 1) * 20 - difficultyTier * 10); } else { // Harder time limits for levels 6-9 levelTimeLimit = Math.max(60, 120 + (baseLevel - 6) * 10 - difficultyTier * 15); } // Clear existing balls for (var i = balls.length - 1; i >= 0; i--) { balls[i].destroy(); } balls = []; lastProgressValue = 0; progressPulseActive = false; // Reset score to 0 for this level LK.setScore(0); levelScore = 0; // Show intro for level 1 if (level === 1 && gameTime === 0) { isTransitioning = true; transitionContainer.visible = true; transitionContainer.alpha = 1; // Clear any existing children except the main text elements for (var i = transitionContainer.children.length - 1; i >= 0; i--) { var child = transitionContainer.children[i]; if (child !== levelTransitionText && child !== levelTransitionOutline && child !== glowContainer) { child.destroy(); } } levelTransitionText.setText('LEVEL 1'); levelTransitionOutline.setText('LEVEL 1'); levelTransitionText.size = 140; levelTransitionOutline.size = 144; transitionContainer.x = 1024; transitionContainer.y = 1366; transitionContainer.scaleX = 0; transitionContainer.scaleY = 0; // Intro animation tween(transitionContainer, { scaleX: 1.2, scaleY: 1.2 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { tween(transitionContainer, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.easeInOut, onFinish: function onFinish() { // Add subtitle var subtitle = new Text2('Collect the Balls!', { size: 60, fill: 0xFFFFFF }); subtitle.anchor.set(0.5, 0.5); subtitle.y = 80; subtitle.alpha = 0; transitionContainer.addChild(subtitle); tween(subtitle, { alpha: 1, y: 60 }, { duration: 400, easing: tween.easeOut, onFinish: function onFinish() { LK.setTimeout(function () { tween(transitionContainer, { alpha: 0, scaleX: 0.8, scaleY: 0.8 }, { duration: 600, easing: tween.easeIn, onFinish: function onFinish() { transitionContainer.visible = false; transitionContainer.removeChild(subtitle); subtitle.destroy(); isTransitioning = false; // Spawn initial balls var initialBalls = 5 + baseLevel * 2 + difficultyTier * 3; for (var i = 0; i < initialBalls; i++) { spawnBall(); } } }); }, 1500); } }); } }); } }); } else { isTransitioning = false; // Spawn initial balls based on level var initialBalls = 5 + baseLevel * 2 + difficultyTier * 3; for (var i = 0; i < initialBalls; i++) { spawnBall(); } } } // Function to show level transition function showLevelTransition(nextLevel) { isTransitioning = true; // Clear balls for (var i = balls.length - 1; i >= 0; i--) { balls[i].destroy(); } balls = []; // Calculate base level and difficulty tier var baseLevel = (nextLevel - 1) % 9 + 1; var difficultyTier = Math.floor((nextLevel - 1) / 9); // Create modern transition sequence transitionContainer.visible = true; transitionContainer.alpha = 1; // First show completion message levelTransitionText.setText('LEVEL ' + (nextLevel - 1) + ' COMPLETE'); levelTransitionOutline.setText('LEVEL ' + (nextLevel - 1) + ' COMPLETE'); levelTransitionText.size = 100; levelTransitionOutline.size = 104; // Clear any existing children except the main text elements for (var i = transitionContainer.children.length - 1; i >= 0; i--) { var child = transitionContainer.children[i]; if (child !== levelTransitionText && child !== levelTransitionOutline && child !== glowContainer) { child.destroy(); } } // Start with slide in from left transitionContainer.x = -500; transitionContainer.y = 1366; transitionContainer.scaleX = 1; transitionContainer.scaleY = 1; transitionContainer.rotation = 0; // Slide in animation tween(transitionContainer, { x: 1024 }, { duration: 600, easing: tween.easeOut, onFinish: function onFinish() { // Pulse effect tween(transitionContainer, { scaleX: 1.1, scaleY: 1.1 }, { duration: 300, easing: tween.easeInOut, yoyo: true, onFinish: function onFinish() { // Wait then show next level intro LK.setTimeout(function () { // Show cinematic intro based on base level if (nextLevel <= 9) { // Original intros for levels 1-9 if (nextLevel === 2) { showLevel2Intro(nextLevel); } else if (nextLevel === 3) { showLevel3Intro(nextLevel); } else if (nextLevel === 4) { showLevel4Intro(nextLevel); } else if (nextLevel === 5) { showLevel5Intro(nextLevel); } else if (nextLevel === 6) { showLevel6Intro(nextLevel); } else if (nextLevel === 7) { showLevel7Intro(nextLevel); } else if (nextLevel === 8) { showLevel8Intro(nextLevel); } else if (nextLevel === 9) { showLevel9Intro(nextLevel); } } else { // For levels 10+, show level with difficulty tier levelTransitionText.setText('LEVEL ' + nextLevel); levelTransitionOutline.setText('LEVEL ' + nextLevel); levelTransitionText.size = 140; levelTransitionOutline.size = 144; // Reset position for intro animation transitionContainer.x = 1024; transitionContainer.scaleX = 0; transitionContainer.scaleY = 0; transitionContainer.alpha = 0; // Intro animation - expand from center tween(transitionContainer, { scaleX: 1.2, scaleY: 1.2, alpha: 1 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { // Shrink to normal size tween(transitionContainer, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.easeInOut, onFinish: function onFinish() { // Add subtitle showing difficulty tier var subtitleText = 'Difficulty Tier ' + (difficultyTier + 1); if (baseLevel === 1) { subtitleText += ' - Static Balls'; } else if (baseLevel === 2) { subtitleText += ' - Random Movement'; } else if (baseLevel === 3) { subtitleText += ' - Falling Balls'; } else if (baseLevel === 4) { subtitleText += ' - Fleeing Balls'; } else if (baseLevel === 5) { subtitleText += ' - Roaming Chaos'; } else if (baseLevel === 6) { subtitleText += ' - Orbital Mastery'; } else if (baseLevel === 7) { subtitleText += ' - Fugitives & Lasso'; } else if (baseLevel === 8) { subtitleText += ' - Phantom Echoes'; } else if (baseLevel === 9) { subtitleText += ' - Chromatic Chaos'; } var subtitle = new Text2(subtitleText, { size: 60, fill: difficultyTier >= 2 ? 0xFF4444 : 0xFFFFFF }); subtitle.anchor.set(0.5, 0.5); subtitle.y = 80; subtitle.alpha = 0; transitionContainer.addChild(subtitle); // Add difficulty warning for high tiers if (difficultyTier >= 2) { var warning = new Text2('EXTREME DIFFICULTY!', { size: 50, fill: 0xFF0000 }); warning.anchor.set(0.5, 0.5); warning.y = 140; warning.alpha = 0; transitionContainer.addChild(warning); tween(warning, { alpha: 1, scaleX: 1.1, scaleY: 1.1 }, { duration: 400, delay: 600, easing: tween.easeOut, yoyo: true, repeat: 2 }); } // Fade in subtitle tween(subtitle, { alpha: 1, y: 60 }, { duration: 400, easing: tween.easeOut, onFinish: function onFinish() { // Wait then fade everything out LK.setTimeout(function () { tween(transitionContainer, { alpha: 0, scaleX: 0.8, scaleY: 0.8 }, { duration: 600, easing: tween.easeIn, onFinish: function onFinish() { transitionContainer.visible = false; transitionContainer.removeChildren(); startLevel(nextLevel); } }); }, 1500); } }); } }); } }); } }, 800); } }); } }); // Create celebration effects for (var i = 0; i < 30; i++) { LK.setTimeout(function () { var angle = Math.random() * Math.PI * 2; var distance = 200 + Math.random() * 300; var x = 1024 + Math.cos(angle) * distance; var y = 1366 + Math.sin(angle) * distance; createExplosion(x, y, 0xFFD700); }, i * 30); } // Screen shake for impact screenShake(10, 300); } // Function to spawn floating background elements function spawnFloatingElement() { if (floatingElements.length < 8) { var element = new FloatingElement(); var type = Math.random() < 0.7 ? 'cloud' : 'star'; element.init(type, 2148, Math.random() * 1500 + 100); floatingElements.push(element); game.addChild(element); } } // Track mouse position game.move = function (x, y, obj) { mouseX = x; mouseY = y; }; // Enhanced update function with dynamic effects game.update = function () { // Update game time gameTime++; if (!isTransitioning) { // Calculate remaining time var elapsedTime = Math.floor((gameTime - levelStartTime) / 60); var remainingTime = Math.max(0, levelTimeLimit - elapsedTime); // Update screen shake updateScreenShake(); // Spawn balls periodically based on level ballSpawnTimer++; var baseLevel = (currentLevel - 1) % 9 + 1; var difficultyTier = Math.floor((currentLevel - 1) / 9); var spawnRate = Math.max(20, 120 - baseLevel * 15 - difficultyTier * 10); var maxBalls = 15 + baseLevel * 3 + difficultyTier * 5; if (ballSpawnTimer >= spawnRate && balls.length < maxBalls) { spawnBall(); ballSpawnTimer = 0; } // Spawn floating elements periodically if (gameTime % 300 === 0) { spawnFloatingElement(); } // Update score display with time warning var currentRequirement = getLevelRequirement(currentLevel); var displayText = 'Level ' + currentLevel + ' | Score: ' + LK.getScore() + '/' + currentRequirement + ' | Time: ' + remainingTime; scoreText.setText(displayText); scoreTextShadow.setText(displayText); // Time warning effect if (remainingTime <= 10 && remainingTime > 0) { scoreText.tint = 0xFF4444; scoreTextShadow.tint = 0x660000; // Pulse effect if (gameTime % 30 === 0) { tween(scoreText, { scaleX: 1.1, scaleY: 1.1 }, { duration: 300, easing: tween.easeOut, yoyo: true }); } } else { scoreText.tint = 0xFFFFFF; scoreTextShadow.tint = 0x000000; } // Update progress tracking var progress = LK.getScore() / levelRequirements[currentLevel - 1]; lastProgressValue = progress; // Level 7: Spawn shepherd balls occasionally if (currentLevel === 7 && gameTime % 300 === 0) { var shepherd = new ShepherdBall(); shepherd.init(); shepherdBalls.push(shepherd); game.addChild(shepherd); } // Level 9: Update color target if (currentLevel === 9) { colorTargetTimer++; if (colorTargetTimer >= 600) { // Change target every 10 seconds colorTargetTimer = 0; targetColorIndex = (targetColorIndex + 1) % 3; var colors = [0xFFD700, 0xFF4444, 0x44FF44]; targetColor = colors[targetColorIndex]; // Update UI to show current target color scoreText.tint = targetColor; } } // Update shepherd balls for (var i = shepherdBalls.length - 1; i >= 0; i--) { var shepherd = shepherdBalls[i]; if (shepherd.collected || shepherd.lifespan <= 0) { shepherdBalls.splice(i, 1); } } // Check level completion if (LK.getScore() >= getLevelRequirement(currentLevel)) { showLevelTransition(currentLevel + 1); } // Check time limit if (remainingTime <= 0) { LK.showGameOver(); } } }; // Cinematic intro for Level 2 - Random Moving Balls function showLevel2Intro(nextLevel) { // Clear transition container transitionContainer.removeChildren(); transitionContainer.x = 1024; transitionContainer.y = 1366; transitionContainer.scaleX = 1; transitionContainer.scaleY = 1; transitionContainer.alpha = 1; // Create cinematic frame var frameContainer = new Container(); frameContainer.scaleX = 0; frameContainer.scaleY = 0; transitionContainer.addChild(frameContainer); // Create outer frame border var outerFrame = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 12, scaleY: 8, tint: 0xFFD700 }); outerFrame.alpha = 0.3; // Create inner frame var innerFrame = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 11, scaleY: 7, tint: 0x000000 }); innerFrame.alpha = 0.9; // Create demo container var demoContainer = new Container(); demoContainer.y = 0; frameContainer.addChild(demoContainer); // Title var title = new Text2('LEVEL 2', { size: 180, fill: 0xFFD700, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); title.anchor.set(0.5, 0.5); title.y = -350; demoContainer.addChild(title); // Subtitle var subtitle = new Text2('Balls Move Randomly!', { size: 80, fill: 0xFFFFFF }); subtitle.anchor.set(0.5, 0.5); subtitle.y = -200; subtitle.alpha = 0; demoContainer.addChild(subtitle); // Create demo area background var demoArea = demoContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 9, scaleY: 4, tint: 0x1a1a1a }); demoArea.y = 150; demoArea.alpha = 0.5; // Create demo balls var demoBalls = []; for (var i = 0; i < 4; i++) { var ball = new Container(); // Add glow effect var glow = ball.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5, tint: 0xFFD700 }); glow.alpha = 0.3; var ballGfx = ball.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, tint: 0xFFD700 }); ball.x = -300 + i * 200; ball.y = 150; ball.vx = (Math.random() - 0.5) * 6; ball.vy = (Math.random() - 0.5) * 6; ball.scaleX = 0; ball.scaleY = 0; demoBalls.push(ball); demoContainer.addChild(ball); } // Animate frame entrance tween(frameContainer, { scaleX: 1.2, scaleY: 1.2 }, { duration: 600, easing: tween.easeOut, onFinish: function onFinish() { tween(frameContainer, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.easeInOut }); } }); // Animate intro tween(title, { scaleX: 1.2, scaleY: 1.2 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { tween(subtitle, { alpha: 1, y: -200 }, { duration: 400, easing: tween.easeOut }); // Animate demo balls for (var i = 0; i < demoBalls.length; i++) { (function (ball, delay) { LK.setTimeout(function () { tween(ball, { scaleX: 1.2, scaleY: 1.2 }, { duration: 300, easing: tween.bounceOut, onFinish: function onFinish() { tween(ball, { scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.easeInOut }); } }); }, delay); })(demoBalls[i], i * 100); } // Animate ball movement var moveTimer = LK.setInterval(function () { for (var i = 0; i < demoBalls.length; i++) { var ball = demoBalls[i]; ball.x += ball.vx; ball.y += ball.vy; // Bounce off walls if (ball.x < -400 || ball.x > 400) { ball.vx = -ball.vx; } if (ball.y < 0 || ball.y > 300) { ball.vy = -ball.vy; } } }, 16); // Transition out LK.setTimeout(function () { LK.clearInterval(moveTimer); tween(frameContainer, { alpha: 0, scaleX: 0.5, scaleY: 0.5, rotation: 0.1 }, { duration: 600, easing: tween.easeIn, onFinish: function onFinish() { transitionContainer.visible = false; transitionContainer.removeChildren(); startLevel(nextLevel); } }); }, 3500); } }); } // Cinematic intro for Level 3 - Falling Balls function showLevel3Intro(nextLevel) { // Clear transition container transitionContainer.removeChildren(); transitionContainer.x = 1024; transitionContainer.y = 1366; transitionContainer.scaleX = 1; transitionContainer.scaleY = 1; transitionContainer.alpha = 1; // Create cinematic frame with vertical emphasis var frameContainer = new Container(); frameContainer.scaleX = 0; frameContainer.scaleY = 0; transitionContainer.addChild(frameContainer); // Create outer frame border - taller for falling effect var outerFrame = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 10, scaleY: 12, tint: 0x4444FF }); outerFrame.alpha = 0.3; // Create inner frame var innerFrame = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 9, scaleY: 11, tint: 0x000000 }); innerFrame.alpha = 0.9; // Add decorative elements for (var i = 0; i < 4; i++) { var deco = frameContainer.attachAsset('smallPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2, tint: 0xFFD700 }); deco.x = -400 + i * 267; deco.y = -550; deco.alpha = 0.6; } // Create demo container var demoContainer = new Container(); demoContainer.y = 0; frameContainer.addChild(demoContainer); // Title var title = new Text2('LEVEL 3', { size: 180, fill: 0x4444FF, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); title.anchor.set(0.5, 0.5); title.y = -450; demoContainer.addChild(title); // Subtitle var subtitle = new Text2('Balls Fall From Above!', { size: 80, fill: 0xFFFFFF }); subtitle.anchor.set(0.5, 0.5); subtitle.y = -350; subtitle.alpha = 0; demoContainer.addChild(subtitle); // Create falling area indicators var leftLine = demoContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.1, scaleY: 8, tint: 0x4444FF }); leftLine.x = -380; leftLine.y = 0; leftLine.alpha = 0.3; var rightLine = demoContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.1, scaleY: 8, tint: 0x4444FF }); rightLine.x = 380; rightLine.y = 0; rightLine.alpha = 0.3; // Create falling demo balls var fallingBalls = []; // Animate frame entrance - drop from above frameContainer.y = -800; frameContainer.scaleX = 1; frameContainer.scaleY = 1; tween(frameContainer, { y: 0 }, { duration: 800, easing: tween.bounceOut }); // Animate intro LK.setTimeout(function () { tween(title, { scaleX: 1.2, scaleY: 1.2 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { tween(subtitle, { alpha: 1, y: -350 }, { duration: 400, easing: tween.easeOut }); // Create falling balls animation var ballSpawnTimer = LK.setInterval(function () { var ball = new Container(); // Add trail effect var trail = ball.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 1, scaleY: 2, tint: 0x4444FF }); trail.alpha = 0.2; var ballGfx = ball.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, tint: 0xFFD700 }); ball.x = -350 + Math.random() * 700; ball.y = -500; ball.rotation = Math.random() * Math.PI * 2; ball.scaleX = 0.5 + Math.random() * 0.5; ball.scaleY = ball.scaleX; fallingBalls.push(ball); demoContainer.addChild(ball); // Falling animation with acceleration tween(ball, { y: 500, rotation: ball.rotation + Math.PI * 4, scaleX: ball.scaleX * 1.5, scaleY: ball.scaleY * 1.5 }, { duration: 2000, easing: tween.easeIn, onFinish: function onFinish() { // Create splash effect var splash = demoContainer.addChild(new Container()); splash.x = ball.x; splash.y = 480; var splashGfx = splash.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.1, scaleY: 0.1, tint: 0xFFD700 }); tween(splashGfx, { scaleX: 3, scaleY: 3, alpha: 0 }, { duration: 400, easing: tween.easeOut, onFinish: function onFinish() { splash.destroy(); } }); ball.destroy(); } }); }, 200); // Transition out LK.setTimeout(function () { LK.clearInterval(ballSpawnTimer); tween(frameContainer, { alpha: 0, y: 800 }, { duration: 600, easing: tween.easeIn, onFinish: function onFinish() { transitionContainer.visible = false; transitionContainer.removeChildren(); startLevel(nextLevel); } }); }, 3500); } }); }, 800); } // Cinematic intro for Level 4 - Fleeing Balls function showLevel4Intro(nextLevel) { // Clear transition container transitionContainer.removeChildren(); transitionContainer.x = 1024; transitionContainer.y = 1366; transitionContainer.scaleX = 1; transitionContainer.scaleY = 1; transitionContainer.alpha = 1; // Create cinematic frame with action-movie style var frameContainer = new Container(); frameContainer.alpha = 0; transitionContainer.addChild(frameContainer); // Create dynamic frame border var outerFrame = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 14, scaleY: 10, tint: 0xFF4444 }); outerFrame.alpha = 0.4; // Create inner frame with gradient effect var innerFrame = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 13, scaleY: 9, tint: 0x000000 }); innerFrame.alpha = 0.95; // Add action lines for (var i = 0; i < 6; i++) { var line = frameContainer.attachAsset('bigPixel', { anchorX: 0, anchorY: 0.5, scaleX: 8, scaleY: 0.05, tint: 0xFF4444 }); line.x = -650; line.y = -400 + i * 160; line.alpha = 0.2; line.rotation = -0.1 + Math.random() * 0.2; } // Create demo container var demoContainer = new Container(); demoContainer.y = 0; frameContainer.addChild(demoContainer); // Title with dramatic effect var titleGlow = new Text2('LEVEL 4', { size: 200, fill: 0xFF4444, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); titleGlow.anchor.set(0.5, 0.5); titleGlow.y = -400; titleGlow.alpha = 0.3; demoContainer.addChild(titleGlow); var title = new Text2('LEVEL 4', { size: 180, fill: 0xFFFFFF, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); title.anchor.set(0.5, 0.5); title.y = -400; demoContainer.addChild(title); // Subtitle var subtitle = new Text2('Balls Run Away!', { size: 80, fill: 0xFFD700 }); subtitle.anchor.set(0.5, 0.5); subtitle.y = -280; subtitle.alpha = 0; demoContainer.addChild(subtitle); // Create demo arena var arena = demoContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 10, scaleY: 5, tint: 0x1a1a1a }); arena.y = 150; arena.alpha = 0.3; // Create fleeing demo with multiple balls var fleeingBalls = []; for (var i = 0; i < 3; i++) { var fleeingBall = new Container(); // Add fear effect var fearAura = fleeingBall.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5, tint: 0xFF4444 }); fearAura.alpha = 0.3; var ballGfx = fleeingBall.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, tint: 0xFFD700 }); fleeingBall.x = -200 + i * 200; fleeingBall.y = 150; fleeingBall.scaleX = 0; fleeingBall.scaleY = 0; fleeingBalls.push(fleeingBall); demoContainer.addChild(fleeingBall); } // Create cursor with predator effect var cursor = new Container(); var cursorAura = cursor.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2, tint: 0xFF0000 }); cursorAura.alpha = 0.2; var cursorGfx = cursor.attachAsset('smallTarget', { anchorX: 0.5, anchorY: 0.5, tint: 0xFFFFFF }); cursor.x = -400; cursor.y = 150; cursor.alpha = 0; cursor.scaleX = 1.5; cursor.scaleY = 1.5; demoContainer.addChild(cursor); // Animate frame entrance with flash tween(frameContainer, { alpha: 1 }, { duration: 300, easing: tween.easeOut }); // Screen flash effect var flash = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 15, scaleY: 11, tint: 0xFFFFFF }); flash.alpha = 0.8; tween(flash, { alpha: 0 }, { duration: 400, easing: tween.easeOut, onFinish: function onFinish() { flash.destroy(); } }); // Animate intro tween(title, { scaleX: 1.1, scaleY: 1.1 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { tween(subtitle, { alpha: 1, y: -280 }, { duration: 400, easing: tween.easeOut }); // Show balls with stagger for (var i = 0; i < fleeingBalls.length; i++) { (function (ball, delay) { LK.setTimeout(function () { tween(ball, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.bounceOut }); }, delay); })(fleeingBalls[i], i * 150); } // Show cursor LK.setTimeout(function () { tween(cursor, { alpha: 1 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { // Animate chase sequence tween(cursor, { x: 0, y: 150 }, { duration: 800, easing: tween.easeInOut, onFinish: function onFinish() { // All balls flee in different directions for (var i = 0; i < fleeingBalls.length; i++) { (function (ball, index) { var angle = index / fleeingBalls.length * Math.PI * 2; var fleeX = Math.cos(angle) * 300; var fleeY = 150 + Math.sin(angle) * 200; tween(ball, { x: fleeX, y: fleeY, rotation: Math.random() * Math.PI }, { duration: 600, easing: tween.easeOut }); })(fleeingBalls[i], i); } // Cursor spins confused tween(cursor, { rotation: Math.PI * 2 }, { duration: 800, easing: tween.easeInOut }); } }); } }); }, 600); // Transition out LK.setTimeout(function () { tween(frameContainer, { alpha: 0, scaleX: 1.5, scaleY: 1.5 }, { duration: 600, easing: tween.easeIn, onFinish: function onFinish() { transitionContainer.visible = false; transitionContainer.removeChildren(); startLevel(nextLevel); } }); }, 4000); } }); } // Cinematic intro for Level 5 - Roaming Balls function showLevel5Intro(nextLevel) { // Clear transition container transitionContainer.removeChildren(); transitionContainer.x = 1024; transitionContainer.y = 1366; transitionContainer.scaleX = 1; transitionContainer.scaleY = 1; transitionContainer.alpha = 1; // Create epic cinematic frame var frameContainer = new Container(); frameContainer.rotation = 0; transitionContainer.addChild(frameContainer); // Create multi-layered frame for chaos effect var chaosFrame1 = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 16, scaleY: 12, tint: 0xFF0000 }); chaosFrame1.alpha = 0.2; var chaosFrame2 = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 15, scaleY: 11, tint: 0xFFD700 }); chaosFrame2.alpha = 0.2; chaosFrame2.rotation = 0.05; var outerFrame = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 14, scaleY: 10, tint: 0xFF00FF }); outerFrame.alpha = 0.4; // Create inner frame var innerFrame = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 13, scaleY: 9, tint: 0x000000 }); innerFrame.alpha = 0.95; // Add chaos particles around frame var chaosParticles = []; for (var i = 0; i < 12; i++) { var particle = frameContainer.attachAsset('smallPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 1, scaleY: 1, tint: Math.random() < 0.5 ? 0xFF0000 : 0xFFD700 }); var angle = i / 12 * Math.PI * 2; particle.x = Math.cos(angle) * 600; particle.y = Math.sin(angle) * 450; particle.alpha = 0.6; chaosParticles.push(particle); } // Create demo container var demoContainer = new Container(); demoContainer.y = 0; frameContainer.addChild(demoContainer); // Epic title with multiple layers var titleBg = new Text2('LEVEL 5', { size: 220, fill: 0x000000, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); titleBg.anchor.set(0.5, 0.5); titleBg.y = -350; titleBg.x = 5; titleBg.alpha = 0.5; demoContainer.addChild(titleBg); var titleGlow = new Text2('LEVEL 5', { size: 200, fill: 0xFF00FF, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); titleGlow.anchor.set(0.5, 0.5); titleGlow.y = -350; titleGlow.alpha = 0.4; demoContainer.addChild(titleGlow); var title = new Text2('LEVEL 5', { size: 180, fill: 0xFFD700, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); title.anchor.set(0.5, 0.5); title.y = -350; demoContainer.addChild(title); // Subtitle with warning style var subtitle = new Text2('CHAOS MODE!', { size: 100, fill: 0xFF0000 }); subtitle.anchor.set(0.5, 0.5); subtitle.y = -230; subtitle.alpha = 0; demoContainer.addChild(subtitle); // Create chaos arena var arenaGlow = demoContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 11, scaleY: 7, tint: 0xFF00FF }); arenaGlow.y = 100; arenaGlow.alpha = 0.1; var arena = demoContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 10, scaleY: 6, tint: 0x0a0a0a }); arena.y = 100; arena.alpha = 0.8; // Create roaming balls with different sizes and colors var roamingBalls = []; for (var i = 0; i < 8; i++) { var ball = new Container(); // Random ball type var ballColor = i < 3 ? 0xFFD700 : i < 6 ? 0xFF0000 : 0x00FF00; var ballSize = 0.8 + Math.random() * 0.6; // Add trail effect var trail = ball.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: ballSize * 1.5, scaleY: ballSize * 1.5, tint: ballColor }); trail.alpha = 0.2; var ballGfx = ball.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: ballSize, scaleY: ballSize, tint: ballColor }); ball.x = -400 + Math.random() * 800; ball.y = -200 + Math.random() * 400; ball.vx = (Math.random() - 0.5) * 12; ball.vy = (Math.random() - 0.5) * 12; ball.scaleX = 0; ball.scaleY = 0; roamingBalls.push(ball); demoContainer.addChild(ball); } // Animate frame entrance with rotation frameContainer.scaleX = 0.1; frameContainer.scaleY = 0.1; frameContainer.rotation = Math.PI * 2; tween(frameContainer, { scaleX: 1, scaleY: 1, rotation: 0 }, { duration: 800, easing: tween.easeOut }); // Animate chaos particles for (var i = 0; i < chaosParticles.length; i++) { (function (particle, index) { tween(particle, { x: particle.x * 0.8, y: particle.y * 0.8, rotation: Math.PI * 4 }, { duration: 2000 + index * 100, easing: tween.linear, loop: true }); })(chaosParticles[i], i); } // Animate intro LK.setTimeout(function () { // Title shake effect var shakeTimer = LK.setInterval(function () { title.x = -5 + Math.random() * 10; title.y = -350 + (-5 + Math.random() * 10); titleGlow.x = title.x; titleGlow.y = title.y; }, 50); tween(title, { scaleX: 1.2, scaleY: 1.2 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { LK.clearInterval(shakeTimer); title.x = 0; title.y = -350; titleGlow.x = 0; titleGlow.y = -350; tween(subtitle, { alpha: 1, y: -230 }, { duration: 400, easing: tween.easeOut }); // Flash effect var flash = demoContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 20, scaleY: 15, tint: 0xFFFFFF }); flash.alpha = 0.6; tween(flash, { alpha: 0 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { flash.destroy(); } }); // Spawn balls with explosion effect for (var i = 0; i < roamingBalls.length; i++) { (function (ball, delay) { LK.setTimeout(function () { tween(ball, { scaleX: 1.5, scaleY: 1.5 }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { tween(ball, { scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.easeIn }); } }); }, delay); })(roamingBalls[i], i * 50); } // Animate chaotic movement var chaosTimer = LK.setInterval(function () { for (var i = 0; i < roamingBalls.length; i++) { var ball = roamingBalls[i]; ball.x += ball.vx; ball.y += ball.vy; ball.rotation += 0.2; // Bounce off walls with effects if (Math.abs(ball.x) > 450) { ball.vx = -ball.vx * 1.2; // Create bounce effect var bounce = demoContainer.addChild(new Container()); bounce.x = ball.x > 0 ? 450 : -450; bounce.y = ball.y; var bounceGfx = bounce.attachAsset('smallPixel', { anchorX: 0.5, anchorY: 0.5, tint: 0xFFFFFF }); tween(bounceGfx, { scaleX: 3, scaleY: 3, alpha: 0 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { bounce.destroy(); } }); } if (Math.abs(ball.y) > 250) { ball.vy = -ball.vy * 1.2; } // Random direction changes if (Math.random() < 0.08) { ball.vx = (Math.random() - 0.5) * 15; ball.vy = (Math.random() - 0.5) * 15; } } }, 16); // Add warning text with flashing LK.setTimeout(function () { var warning = new Text2('MAXIMUM DIFFICULTY!', { size: 70, fill: 0xFF0000 }); warning.anchor.set(0.5, 0.5); warning.y = 350; warning.alpha = 0; demoContainer.addChild(warning); tween(warning, { alpha: 1, scaleX: 1.2, scaleY: 1.2 }, { duration: 300, easing: tween.easeOut, yoyo: true, repeat: 4 }); }, 1500); // Transition out LK.setTimeout(function () { LK.clearInterval(chaosTimer); // Epic exit tween(frameContainer, { alpha: 0, scaleX: 2, scaleY: 2, rotation: -0.2 }, { duration: 600, easing: tween.easeIn, onFinish: function onFinish() { transitionContainer.visible = false; transitionContainer.removeChildren(); startLevel(nextLevel); } }); }, 4500); } }); }, 800); } // Cinematic intro for Level 6 - Orbital Mastery function showLevel6Intro(nextLevel) { // Clear transition container transitionContainer.removeChildren(); transitionContainer.x = 1024; transitionContainer.y = 1366; transitionContainer.scaleX = 1; transitionContainer.scaleY = 1; transitionContainer.alpha = 1; // Create cosmic frame var frameContainer = new Container(); frameContainer.alpha = 0; transitionContainer.addChild(frameContainer); // Create orbital rings background var orbitRings = []; for (var i = 0; i < 3; i++) { var ring = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 6 + i * 3, scaleY: 6 + i * 3, tint: 0x1a5d61 }); ring.alpha = 0.1 - i * 0.03; orbitRings.push(ring); } // Create frame var outerFrame = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 14, scaleY: 10, tint: 0x00FFFF }); outerFrame.alpha = 0.4; var innerFrame = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 13, scaleY: 9, tint: 0x000000 }); innerFrame.alpha = 0.95; // Create demo container var demoContainer = new Container(); frameContainer.addChild(demoContainer); // Title var title = new Text2('LEVEL 6', { size: 180, fill: 0x00FFFF, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); title.anchor.set(0.5, 0.5); title.y = -350; demoContainer.addChild(title); // Subtitle var subtitle = new Text2('ORBITAL MASTERY', { size: 80, fill: 0xFFFFFF }); subtitle.anchor.set(0.5, 0.5); subtitle.y = -250; subtitle.alpha = 0; demoContainer.addChild(subtitle); // Create orbital center var centerOrb = demoContainer.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2, tint: 0xFFD700 }); centerOrb.y = 100; // Create orbiting demo balls var orbitingBalls = []; for (var i = 0; i < 6; i++) { var ball = new Container(); var ballGfx = ball.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, tint: 0x00FFFF }); ball.angle = i / 6 * Math.PI * 2; ball.radius = 200; ball.speed = 0.02; ball.scaleX = 0; ball.scaleY = 0; orbitingBalls.push(ball); demoContainer.addChild(ball); } // Animate entrance tween(frameContainer, { alpha: 1 }, { duration: 500, easing: tween.easeOut }); // Rotate orbital rings for (var i = 0; i < orbitRings.length; i++) { (function (ring, index) { tween(ring, { rotation: Math.PI * 2 }, { duration: 10000 + index * 2000, easing: tween.linear, loop: true }); })(orbitRings[i], i); } // Animate title tween(title, { scaleX: 1.2, scaleY: 1.2 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { tween(subtitle, { alpha: 1 }, { duration: 400, easing: tween.easeOut }); // Show orbiting balls for (var i = 0; i < orbitingBalls.length; i++) { (function (ball, delay) { LK.setTimeout(function () { tween(ball, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.bounceOut }); }, delay); })(orbitingBalls[i], i * 100); } // Animate orbital motion var orbitTimer = LK.setInterval(function () { for (var i = 0; i < orbitingBalls.length; i++) { var ball = orbitingBalls[i]; ball.angle += ball.speed; ball.x = Math.cos(ball.angle) * ball.radius; ball.y = 100 + Math.sin(ball.angle) * ball.radius; } }, 16); // Create orbital paths LK.setTimeout(function () { for (var i = 0; i < 3; i++) { var path = demoContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 4 + i * 1.5, scaleY: 4 + i * 1.5, tint: 0x00FFFF }); path.y = 100; path.alpha = 0; tween(path, { alpha: 0.2, scaleX: path.scaleX * 1.2, scaleY: path.scaleY * 1.2 }, { duration: 800, easing: tween.easeOut }); } }, 1000); // Transition out LK.setTimeout(function () { LK.clearInterval(orbitTimer); tween(frameContainer, { alpha: 0, scaleX: 0.5, scaleY: 0.5, rotation: Math.PI / 4 }, { duration: 600, easing: tween.easeIn, onFinish: function onFinish() { transitionContainer.visible = false; transitionContainer.removeChildren(); startLevel(nextLevel); } }); }, 4000); } }); } // Cinematic intro for Level 7 - Fugitives & Lasso function showLevel7Intro(nextLevel) { // Clear transition container transitionContainer.removeChildren(); transitionContainer.x = 1024; transitionContainer.y = 1366; transitionContainer.scaleX = 1; transitionContainer.scaleY = 1; transitionContainer.alpha = 1; // Create western-themed frame var frameContainer = new Container(); frameContainer.scaleX = 0; frameContainer.scaleY = 0; transitionContainer.addChild(frameContainer); // Create frame var outerFrame = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 14, scaleY: 10, tint: 0x8B4513 }); outerFrame.alpha = 0.4; var innerFrame = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 13, scaleY: 9, tint: 0x000000 }); innerFrame.alpha = 0.95; // Create demo container var demoContainer = new Container(); frameContainer.addChild(demoContainer); // Title var title = new Text2('LEVEL 7', { size: 180, fill: 0xFFD700, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); title.anchor.set(0.5, 0.5); title.y = -350; demoContainer.addChild(title); // Subtitle var subtitle = new Text2('FUGITIVES & LASSO', { size: 80, fill: 0xFFFFFF }); subtitle.anchor.set(0.5, 0.5); subtitle.y = -250; subtitle.alpha = 0; demoContainer.addChild(subtitle); // Create fleeing balls var fugitives = []; for (var i = 0; i < 5; i++) { var fugitive = new Container(); var ballGfx = fugitive.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, tint: 0xFFD700 }); fugitive.x = -300 + i * 150; fugitive.y = 0; fugitive.scaleX = 0; fugitive.scaleY = 0; fugitives.push(fugitive); demoContainer.addChild(fugitive); } // Create shepherd ball (lasso) var shepherdDemo = new Container(); var shepherdGlow = shepherdDemo.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 3, scaleY: 3, tint: 0x00FFFF }); shepherdGlow.alpha = 0.3; var shepherdCore = shepherdDemo.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5, tint: 0x00FFFF }); shepherdDemo.y = 200; shepherdDemo.scaleX = 0; shepherdDemo.scaleY = 0; demoContainer.addChild(shepherdDemo); // Animate entrance tween(frameContainer, { scaleX: 1, scaleY: 1 }, { duration: 600, easing: tween.bounceOut }); // Animate title LK.setTimeout(function () { tween(subtitle, { alpha: 1 }, { duration: 400, easing: tween.easeOut }); // Show fugitives for (var i = 0; i < fugitives.length; i++) { (function (fugitive, delay) { LK.setTimeout(function () { tween(fugitive, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.bounceOut }); }, delay); })(fugitives[i], i * 100); } // Show shepherd ball LK.setTimeout(function () { tween(shepherdDemo, { scaleX: 1.2, scaleY: 1.2 }, { duration: 500, easing: tween.bounceOut, onFinish: function onFinish() { tween(shepherdDemo, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.easeInOut }); // Demonstrate lasso effect LK.setTimeout(function () { // Create lasso ring var lassoRing = demoContainer.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.1, scaleY: 0.1, tint: 0x00FFFF }); lassoRing.y = 200; lassoRing.alpha = 0.8; tween(lassoRing, { scaleX: 6, scaleY: 6, alpha: 0.2 }, { duration: 600, easing: tween.easeOut }); // Collect fugitives for (var i = 0; i < fugitives.length; i++) { (function (fugitive) { tween(fugitive, { x: 0, y: 200, scaleX: 0, scaleY: 0, rotation: Math.PI * 2 }, { duration: 500, easing: tween.easeIn }); })(fugitives[i]); } // Show bonus text var bonusText = new Text2('LASSO BONUS!', { size: 100, fill: 0x00FFFF, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); bonusText.anchor.set(0.5, 0.5); bonusText.y = 350; bonusText.alpha = 0; demoContainer.addChild(bonusText); tween(bonusText, { alpha: 1, scaleX: 1.2, scaleY: 1.2 }, { duration: 400, easing: tween.easeOut, yoyo: true }); }, 1000); } }); }, 800); // Transition out LK.setTimeout(function () { tween(frameContainer, { alpha: 0, x: -800 }, { duration: 600, easing: tween.easeIn, onFinish: function onFinish() { transitionContainer.visible = false; transitionContainer.removeChildren(); startLevel(nextLevel); } }); }, 4500); }, 500); } // Cinematic intro for Level 8 - Phantom Echoes function showLevel8Intro(nextLevel) { // Clear transition container transitionContainer.removeChildren(); transitionContainer.x = 1024; transitionContainer.y = 1366; transitionContainer.scaleX = 1; transitionContainer.scaleY = 1; transitionContainer.alpha = 1; // Create glitchy frame var frameContainer = new Container(); frameContainer.alpha = 1; transitionContainer.addChild(frameContainer); // Create glitch layers for (var i = 0; i < 3; i++) { var glitchLayer = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 14, scaleY: 10, tint: i === 0 ? 0xFF0000 : i === 1 ? 0x00FF00 : 0x0000FF }); glitchLayer.alpha = 0.1; glitchLayer.x = (Math.random() - 0.5) * 10; glitchLayer.y = (Math.random() - 0.5) * 10; } // Main frame var outerFrame = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 14, scaleY: 10, tint: 0x800080 }); outerFrame.alpha = 0.4; var innerFrame = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 13, scaleY: 9, tint: 0x000000 }); innerFrame.alpha = 0.95; // Create demo container var demoContainer = new Container(); frameContainer.addChild(demoContainer); // Title with glitch effect var title = new Text2('LEVEL 8', { size: 180, fill: 0x800080, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); title.anchor.set(0.5, 0.5); title.y = -350; demoContainer.addChild(title); // Subtitle var subtitle = new Text2('PHANTOM ECHOES', { size: 80, fill: 0xFFFFFF }); subtitle.anchor.set(0.5, 0.5); subtitle.y = -250; subtitle.alpha = 0; demoContainer.addChild(subtitle); // Create phasing balls var phantomBalls = []; for (var i = 0; i < 4; i++) { var phantom = new Container(); var ballGfx = phantom.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, tint: 0xFFD700 }); phantom.x = -400 + i * 267; phantom.y = 0; phantom.scaleX = 1; phantom.scaleY = 1; phantom.alpha = 1; phantomBalls.push(phantom); demoContainer.addChild(phantom); } // Create negative/decoy balls var negativeBalls = []; for (var i = 0; i < 2; i++) { var negative = new Container(); var negGfx = negative.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, tint: 0xFF4444 }); var dangerAura = negative.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5, tint: 0xFF0000 }); dangerAura.alpha = 0.3; negative.x = -200 + i * 400; negative.y = 200; negative.scaleX = 0; negative.scaleY = 0; negativeBalls.push(negative); demoContainer.addChild(negative); } // Glitch animation for title var glitchTimer = LK.setInterval(function () { if (Math.random() < 0.3) { title.x = (Math.random() - 0.5) * 5; title.y = -350 + (Math.random() - 0.5) * 5; LK.setTimeout(function () { title.x = 0; title.y = -350; }, 50); } }, 100); // Animate subtitle LK.setTimeout(function () { tween(subtitle, { alpha: 1 }, { duration: 400, easing: tween.easeOut }); // Phase animation for phantom balls var phaseTimer = LK.setInterval(function () { for (var i = 0; i < phantomBalls.length; i++) { (function (ball, index) { if (Math.random() < 0.5) { tween(ball, { alpha: ball.alpha > 0.5 ? 0.1 : 1 }, { duration: 300, easing: tween.easeInOut }); } })(phantomBalls[i], i); } }, 800); // Show negative balls for (var i = 0; i < negativeBalls.length; i++) { (function (ball, delay) { LK.setTimeout(function () { tween(ball, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.bounceOut }); }, delay); })(negativeBalls[i], 1000 + i * 200); } // Warning effect LK.setTimeout(function () { var warning = new Text2('AVOID RED BALLS!', { size: 70, fill: 0xFF0000, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); warning.anchor.set(0.5, 0.5); warning.y = 350; warning.alpha = 0; demoContainer.addChild(warning); tween(warning, { alpha: 1 }, { duration: 300, easing: tween.easeOut, yoyo: true, repeat: 3 }); }, 2000); // Transition out LK.setTimeout(function () { LK.clearInterval(glitchTimer); LK.clearInterval(phaseTimer); // Glitch out effect for (var i = 0; i < 5; i++) { (function (delay) { LK.setTimeout(function () { frameContainer.x = (Math.random() - 0.5) * 20; frameContainer.y = (Math.random() - 0.5) * 20; frameContainer.alpha = Math.random(); }, delay); })(i * 100); } LK.setTimeout(function () { transitionContainer.visible = false; transitionContainer.removeChildren(); startLevel(nextLevel); }, 600); }, 4000); }, 500); } // Cinematic intro for Level 9 - Chromatic Chaos function showLevel9Intro(nextLevel) { // Clear transition container transitionContainer.removeChildren(); transitionContainer.x = 1024; transitionContainer.y = 1366; transitionContainer.scaleX = 1; transitionContainer.scaleY = 1; transitionContainer.alpha = 1; // Create rainbow frame var frameContainer = new Container(); frameContainer.alpha = 0; transitionContainer.addChild(frameContainer); // Create rainbow background layers var colors = [0xFF0000, 0xFF7F00, 0xFFFF00, 0x00FF00, 0x0000FF, 0x4B0082, 0x9400D3]; for (var i = 0; i < colors.length; i++) { var colorLayer = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 14 - i * 0.5, scaleY: 10 - i * 0.3, tint: colors[i] }); colorLayer.alpha = 0.1; colorLayer.rotation = i * 0.05; } // Main frame var innerFrame = frameContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 11, scaleY: 8, tint: 0x000000 }); innerFrame.alpha = 0.9; // Create demo container var demoContainer = new Container(); frameContainer.addChild(demoContainer); // Title with rainbow effect var title = new Text2('LEVEL 9', { size: 180, fill: 0xFFD700, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); title.anchor.set(0.5, 0.5); title.y = -350; demoContainer.addChild(title); // Subtitle var subtitle = new Text2('CHROMATIC CHAOS', { size: 80, fill: 0xFFFFFF }); subtitle.anchor.set(0.5, 0.5); subtitle.y = -250; subtitle.alpha = 0; demoContainer.addChild(subtitle); // Create color target indicator var targetIndicator = demoContainer.attachAsset('bigPixel', { anchorX: 0.5, anchorY: 0.5, scaleX: 3, scaleY: 1, tint: 0xFFD700 }); targetIndicator.y = -150; var targetText = new Text2('TARGET COLOR', { size: 40, fill: 0xFFFFFF }); targetText.anchor.set(0.5, 0.5); targetText.y = -150; demoContainer.addChild(targetText); // Create chameleon balls var chameleonBalls = []; var ballColors = [0xFFD700, 0xFF4444, 0x44FF44]; for (var i = 0; i < 6; i++) { var chameleon = new Container(); var ballGfx = chameleon.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, tint: ballColors[i % 3] }); chameleon.x = -400 + i % 3 * 400; chameleon.y = 50 + Math.floor(i / 3) * 150; chameleon.colorIndex = i % 3; chameleon.scaleX = 0; chameleon.scaleY = 0; chameleonBalls.push(chameleon); demoContainer.addChild(chameleon); } // Animate entrance tween(frameContainer, { alpha: 1 }, { duration: 500, easing: tween.easeOut }); // Rainbow animation for title var titleColorIndex = 0; var titleColorTimer = LK.setInterval(function () { titleColorIndex = (titleColorIndex + 1) % colors.length; tween(title, { tint: colors[titleColorIndex] }, { duration: 300, easing: tween.easeInOut }); }, 400); // Animate elements LK.setTimeout(function () { tween(subtitle, { alpha: 1 }, { duration: 400, easing: tween.easeOut }); // Show chameleon balls for (var i = 0; i < chameleonBalls.length; i++) { (function (ball, delay) { LK.setTimeout(function () { tween(ball, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.bounceOut }); }, delay); })(chameleonBalls[i], i * 100); } // Demonstrate color changing var colorChangeTimer = LK.setInterval(function () { // Change target color var targetColorIndex = Math.floor(Math.random() * 3); tween(targetIndicator, { tint: ballColors[targetColorIndex] }, { duration: 300, easing: tween.easeInOut }); // Flash matching balls for (var i = 0; i < chameleonBalls.length; i++) { var ball = chameleonBalls[i]; if (ball.colorIndex === targetColorIndex) { tween(ball, { scaleX: 1.3, scaleY: 1.3 }, { duration: 200, easing: tween.easeOut, yoyo: true }); } } // Change some ball colors randomly for (var i = 0; i < chameleonBalls.length; i++) { if (Math.random() < 0.3) { var ball = chameleonBalls[i]; ball.colorIndex = Math.floor(Math.random() * 3); tween(ball.children[0], { tint: ballColors[ball.colorIndex] }, { duration: 500, easing: tween.easeInOut }); } } }, 1500); // Warning text LK.setTimeout(function () { var warning = new Text2('MATCH THE COLOR!', { size: 70, fill: 0xFFD700, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); warning.anchor.set(0.5, 0.5); warning.y = 350; warning.alpha = 0; demoContainer.addChild(warning); tween(warning, { alpha: 1, scaleX: 1.1, scaleY: 1.1 }, { duration: 400, easing: tween.easeOut, yoyo: true, repeat: 2 }); }, 2500); // Transition out LK.setTimeout(function () { LK.clearInterval(titleColorTimer); LK.clearInterval(colorChangeTimer); // Epic exit with color explosion for (var i = 0; i < 10; i++) { (function (index) { var explosion = frameContainer.attachAsset('target', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.1, scaleY: 0.1, tint: colors[index % colors.length] }); explosion.x = (Math.random() - 0.5) * 800; explosion.y = (Math.random() - 0.5) * 600; tween(explosion, { scaleX: 5, scaleY: 5, alpha: 0 }, { duration: 800, delay: index * 50, easing: tween.easeOut }); })(i); } tween(frameContainer, { alpha: 0, scaleX: 1.5, scaleY: 1.5 }, { duration: 800, easing: tween.easeIn, onFinish: function onFinish() { transitionContainer.visible = false; transitionContainer.removeChildren(); startLevel(nextLevel); } }); }, 5000); }, 500); } // Helper function to convert HSL to hex function hslToHex(h, s, l) { l /= 100; var a = s * Math.min(l, 1 - l) / 100; var f = function f(n) { var k = (n + h / 30) % 12; var color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); return Math.round(255 * color).toString(16).padStart(2, '0'); }; return parseInt('0x' + f(0) + f(8) + f(4)); }
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,3557 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var BackgroundGradient = Container.expand(function () {
+ var self = Container.call(this);
+ self.gradientElements = [];
+ self.init = function () {
+ // Create gradient effect with multiple layers
+ for (var i = 0; i < 5; i++) {
+ var element = self.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 25,
+ scaleY: 25,
+ tint: 0x1a0000
+ });
+ element.x = 1024;
+ element.y = 1366 + i * 300;
+ element.alpha = 0.05 + i * 0.02;
+ self.gradientElements.push(element);
+ }
+ };
+ return self;
+});
+var Ball = Container.expand(function () {
+ var self = Container.call(this);
+ self.ballGraphics = null;
+ self.points = 5;
+ self.speed = 0;
+ self.vx = 0;
+ self.vy = 0;
+ self.behavior = 'static';
+ self.fleeDistance = 150;
+ self.collected = false;
+ self.init = function (level) {
+ // Calculate base level and difficulty tier
+ var baseLevel = (level - 1) % 9 + 1;
+ var difficultyTier = Math.floor((level - 1) / 9);
+ // Create ball graphic with glow effect
+ self.ballGraphics = self.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.5,
+ scaleY: 1.5,
+ tint: 0xFFD700
+ });
+ // Add inner glow
+ var innerGlow = self.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.05,
+ scaleY: 1.05,
+ tint: 0xFFFFFF
+ });
+ innerGlow.alpha = 0.8;
+ // Add outer glow
+ var outerGlow = self.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.95,
+ scaleY: 1.95,
+ tint: 0xFF6B6B
+ });
+ outerGlow.alpha = 0.3;
+ // Pulsing animation
+ tween(outerGlow, {
+ scaleX: 2.25,
+ scaleY: 2.25,
+ alpha: 0.1
+ }, {
+ duration: 1000,
+ easing: tween.easeInOut,
+ loop: true,
+ yoyo: true
+ });
+ // Set behavior based on base level
+ if (baseLevel === 1) {
+ self.behavior = 'static';
+ self.x = 200 + Math.random() * 1648;
+ self.y = 300 + Math.random() * 2132;
+ // Apply difficulty modifiers
+ self.points = 5 + difficultyTier * 2;
+ } else if (baseLevel === 2) {
+ self.behavior = 'random';
+ self.x = Math.random() * 2048;
+ self.y = Math.random() * 2732;
+ self.speed = (1 + Math.random() * 2) * (1 + difficultyTier * 0.3);
+ var angle = Math.random() * Math.PI * 2;
+ self.vx = Math.cos(angle) * self.speed;
+ self.vy = Math.sin(angle) * self.speed;
+ self.points = 7 + difficultyTier * 3;
+ } else if (baseLevel === 3) {
+ self.behavior = 'falling';
+ self.x = Math.random() * 2048;
+ self.y = -50;
+ self.vy = (2 + Math.random() * 3) * (1 + difficultyTier * 0.4);
+ self.points = 7 + difficultyTier * 3;
+ } else if (baseLevel === 4) {
+ self.behavior = 'fleeing';
+ self.x = 200 + Math.random() * 1648;
+ self.y = 300 + Math.random() * 2132;
+ self.speed = 3 * (1 + difficultyTier * 0.3);
+ self.fleeDistance = 150 + difficultyTier * 50;
+ self.points = 10 + difficultyTier * 4;
+ } else if (baseLevel === 5) {
+ self.behavior = 'roaming';
+ self.x = Math.random() * 2048;
+ self.y = Math.random() * 2732;
+ self.speed = (4 + Math.random() * 2) * (1 + difficultyTier * 0.4);
+ var angle = Math.random() * Math.PI * 2;
+ self.vx = Math.cos(angle) * self.speed;
+ self.vy = Math.sin(angle) * self.speed;
+ self.points = 15 + difficultyTier * 5;
+ } else if (baseLevel === 6) {
+ // Level 6: Orbiting balls
+ self.behavior = 'orbiting';
+ self.orbitCenterX = 1024;
+ self.orbitCenterY = 1366;
+ self.orbitRadius = 200 + Math.random() * 300 - difficultyTier * 30;
+ self.orbitAngle = Math.random() * Math.PI * 2;
+ self.orbitSpeed = (0.01 + Math.random() * 0.02) * (1 + difficultyTier * 0.3);
+ self.points = 12 + difficultyTier * 4;
+ } else if (baseLevel === 7) {
+ // Level 7: Mix of fleeing and static balls
+ if (Math.random() < 0.7 + difficultyTier * 0.1) {
+ self.behavior = 'fleeing';
+ self.speed = (4 + Math.random() * 2) * (1 + difficultyTier * 0.3);
+ self.fleeDistance = 200 + difficultyTier * 50;
+ self.points = 15 + difficultyTier * 5;
+ } else {
+ self.behavior = 'static';
+ self.points = 5 + difficultyTier * 2;
+ }
+ self.x = 200 + Math.random() * 1648;
+ self.y = 300 + Math.random() * 2132;
+ } else if (baseLevel === 8) {
+ // Level 8: Phasing balls that appear and disappear
+ self.behavior = 'phasing';
+ self.x = Math.random() * 2048;
+ self.y = Math.random() * 2732;
+ self.phaseTimer = 0;
+ self.phaseInterval = Math.max(60, 120 + Math.random() * 60 - difficultyTier * 20);
+ self.visible = true;
+ self.points = 20 + difficultyTier * 6;
+ // Some balls are negative (decoy)
+ if (Math.random() < 0.3 + difficultyTier * 0.1) {
+ self.isNegative = true;
+ self.points = -(15 + difficultyTier * 5);
+ self.ballGraphics.tint = 0xFF4444; // Red tint for negative
+ }
+ } else if (baseLevel === 9) {
+ // Level 9: Chameleon balls that change color
+ self.behavior = 'chameleon';
+ self.x = Math.random() * 2048;
+ self.y = Math.random() * 2732;
+ self.speed = (3 + Math.random() * 3) * (1 + difficultyTier * 0.3);
+ var angle = Math.random() * Math.PI * 2;
+ self.vx = Math.cos(angle) * self.speed;
+ self.vy = Math.sin(angle) * self.speed;
+ self.colorTimer = 0;
+ self.colorInterval = Math.max(90, 180 + Math.random() * 120 - difficultyTier * 30);
+ self.currentColor = 0;
+ self.colors = [0xFFD700, 0xFF4444, 0x44FF44]; // Gold, Red, Green
+ self.points = 25 + difficultyTier * 7;
+ }
+ // Apply difficulty modifiers to visual effects
+ if (difficultyTier > 0) {
+ // Make balls slightly smaller at higher difficulties
+ var sizeModifier = 1 - difficultyTier * 0.1;
+ self.ballGraphics.scaleX *= sizeModifier;
+ self.ballGraphics.scaleY *= sizeModifier;
+ innerGlow.scaleX *= sizeModifier;
+ innerGlow.scaleY *= sizeModifier;
+ outerGlow.scaleX *= sizeModifier;
+ outerGlow.scaleY *= sizeModifier;
+ }
+ // Spawn animation with rotation and scale
+ self.scaleX = 0;
+ self.scaleY = 0;
+ self.rotation = Math.random() * Math.PI * 2;
+ tween(self, {
+ scaleX: 1,
+ scaleY: 1,
+ rotation: 0
+ }, {
+ duration: 800,
+ easing: tween.bounceOut
+ });
+ };
+ self.update = function () {
+ if (self.collected) {
+ return;
+ }
+ if (self.behavior === 'random') {
+ self.x += self.vx;
+ self.y += self.vy;
+ // Bounce off walls
+ if (self.x <= 40 || self.x >= 2008) {
+ self.vx = -self.vx;
+ LK.getSound('bounce').play();
+ }
+ if (self.y <= 40 || self.y >= 2692) {
+ self.vy = -self.vy;
+ LK.getSound('bounce').play();
+ }
+ } else if (self.behavior === 'falling') {
+ self.y += self.vy;
+ // Remove if off screen
+ if (self.y > 2782) {
+ self.collected = true;
+ for (var i = 0; i < balls.length; i++) {
+ if (balls[i] === self) {
+ balls.splice(i, 1);
+ break;
+ }
+ }
+ LK.getSound('fall').play();
+ self.destroy();
+ }
+ } else if (self.behavior === 'fleeing') {
+ // Flee from mouse position
+ if (mouseX !== null && mouseY !== null) {
+ var dx = self.x - mouseX;
+ var dy = self.y - mouseY;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist < self.fleeDistance && dist > 0) {
+ // Normalize and apply flee force
+ dx /= dist;
+ dy /= dist;
+ self.x += dx * self.speed;
+ self.y += dy * self.speed;
+ // Keep within bounds
+ self.x = Math.max(40, Math.min(2008, self.x));
+ self.y = Math.max(40, Math.min(2692, self.y));
+ // Play flee sound occasionally
+ if (Math.random() < 0.02) {
+ LK.getSound('flee').play();
+ }
+ }
+ }
+ } else if (self.behavior === 'roaming') {
+ self.x += self.vx;
+ self.y += self.vy;
+ // Bounce off walls
+ if (self.x <= 40 || self.x >= 2008) {
+ self.vx = -self.vx;
+ LK.getSound('bounce').play();
+ }
+ if (self.y <= 40 || self.y >= 2692) {
+ self.vy = -self.vy;
+ LK.getSound('bounce').play();
+ }
+ // Occasionally change direction
+ if (Math.random() < 0.02) {
+ var angle = Math.random() * Math.PI * 2;
+ self.vx = Math.cos(angle) * self.speed;
+ self.vy = Math.sin(angle) * self.speed;
+ LK.getSound('roam').play();
+ }
+ } else if (self.behavior === 'orbiting') {
+ // Orbital movement around center point
+ self.orbitAngle += self.orbitSpeed;
+ self.x = self.orbitCenterX + Math.cos(self.orbitAngle) * self.orbitRadius;
+ self.y = self.orbitCenterY + Math.sin(self.orbitAngle) * self.orbitRadius;
+ self.rotation = self.orbitAngle + Math.PI / 2;
+ // Play orbit sound occasionally
+ if (Math.random() < 0.005) {
+ LK.getSound('orbit').play();
+ }
+ } else if (self.behavior === 'phasing') {
+ // Phase in and out of visibility
+ self.phaseTimer++;
+ if (self.phaseTimer >= self.phaseInterval) {
+ self.phaseTimer = 0;
+ self.visible = !self.visible;
+ self.alpha = self.visible ? 1 : 0.3;
+ // Can only be collected when fully visible
+ self.interactive = self.visible;
+ LK.getSound('phase').play();
+ }
+ } else if (self.behavior === 'chameleon') {
+ // Change colors periodically
+ self.colorTimer++;
+ if (self.colorTimer >= self.colorInterval) {
+ self.colorTimer = 0;
+ self.currentColor = (self.currentColor + 1) % self.colors.length;
+ tween(self.ballGraphics, {
+ tint: self.colors[self.currentColor]
+ }, {
+ duration: 500,
+ easing: tween.easeInOut
+ });
+ LK.getSound('colorChange').play();
+ }
+ // Roaming movement
+ self.x += self.vx;
+ self.y += self.vy;
+ // Bounce off walls
+ if (self.x <= 40 || self.x >= 2008) {
+ self.vx = -self.vx;
+ LK.getSound('bounce').play();
+ }
+ if (self.y <= 40 || self.y >= 2692) {
+ self.vy = -self.vy;
+ LK.getSound('bounce').play();
+ }
+ }
+ };
+ self.down = function () {
+ if (self.collected) {
+ return;
+ }
+ self.collected = true;
+ // Calculate points based on ball type
+ var basePoints = self.points;
+ // Check if ball is red (any red tint value)
+ if (self.ballGraphics && (self.ballGraphics.tint === 0xFF4444 || self.ballGraphics.tint === 0xFF0000 || self.ballGraphics.tint >= 0xFF0000 && self.ballGraphics.tint <= 0xFF4444)) {
+ basePoints = 5; // All red balls give 5 points
+ } else if (self.behavior === 'fleeing') {
+ basePoints = 10;
+ } else if (self.behavior === 'roaming') {
+ basePoints = 15;
+ } else if (self.behavior === 'falling') {
+ basePoints = 7;
+ } else if (self.behavior === 'orbiting') {
+ basePoints = 12;
+ } else if (self.behavior === 'phasing') {
+ basePoints = 20;
+ } else if (self.behavior === 'chameleon') {
+ // Level 9: Check if ball matches target color
+ if (currentLevel === 9 && self.ballGraphics && targetColor) {
+ // First check if it's red - red balls always give 5 points
+ if (self.ballGraphics.tint === 0xFF4444 || self.ballGraphics.tint === 0xFF0000) {
+ basePoints = 5;
+ } else if (self.ballGraphics.tint === targetColor) {
+ basePoints = 30; // Bonus for matching color
+ } else {
+ basePoints = 5; // Reduced points for wrong color
+ }
+ } else {
+ basePoints = 25;
+ }
+ }
+ // Handle negative balls (Level 8)
+ if (self.isNegative) {
+ basePoints = -15;
+ // Create warning effect
+ createExplosion(self.x, self.y, 0xFF0000);
+ screenShake(15, 400);
+ }
+ // Award points
+ LK.setScore(LK.getScore() + basePoints);
+ LK.getSound('hit').play();
+ // Create floating score text
+ var scoreFloat = game.addChild(new Container());
+ scoreFloat.x = self.x;
+ scoreFloat.y = self.y;
+ var floatText = new Text2('+' + basePoints, {
+ size: 60,
+ fill: 0xFFD700,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ floatText.anchor.set(0.5, 0.5);
+ scoreFloat.addChild(floatText);
+ // Animate floating score
+ tween(scoreFloat, {
+ y: self.y - 100,
+ alpha: 0
+ }, {
+ duration: 1000,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ scoreFloat.destroy();
+ }
+ });
+ // Collection animation
+ tween(self.ballGraphics, {
+ scaleX: 1.5,
+ scaleY: 1.5,
+ alpha: 0
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ for (var i = 0; i < balls.length; i++) {
+ if (balls[i] === self) {
+ balls.splice(i, 1);
+ break;
+ }
+ }
+ self.destroy();
+ }
+ });
+ // Create particle effect - bright red explosion
+ createExplosion(self.x, self.y, 0xFF0000);
+ };
+ return self;
+});
+var Bird = Container.expand(function () {
+ var self = Container.call(this);
+ var birdPixel = self.attachAsset('birdPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.targetX = 0;
+ self.targetY = 0;
+ self.speed = 0.02;
+ self.update = function () {
+ var dx = self.targetX - self.x;
+ var dy = self.targetY - self.y;
+ self.x += dx * self.speed;
+ self.y += dy * self.speed;
+ if (Math.abs(dx) < 5 && Math.abs(dy) < 5) {
+ self.findNewTarget();
+ }
+ };
+ self.findNewTarget = function () {
+ var angle = Math.random() * Math.PI * 2;
+ var distance = 100 + Math.random() * 200;
+ self.targetX = self.x + Math.cos(angle) * distance;
+ self.targetY = self.y + Math.sin(angle) * distance;
+ self.targetX = Math.max(100, Math.min(1948, self.targetX));
+ self.targetY = Math.max(100, Math.min(1000, self.targetY));
+ };
+ return self;
+});
+var FloatingElement = Container.expand(function () {
+ var self = Container.call(this);
+ self.elementGraphics = null;
+ self.floatSpeed = 0.5;
+ self.bobAmount = 2;
+ self.bobSpeed = 0.05;
+ self.initialY = 0;
+ self.time = 0;
+ self.init = function (type, x, y) {
+ self.x = x;
+ self.y = y;
+ self.initialY = y;
+ self.time = Math.random() * Math.PI * 2;
+ if (type === 'cloud') {
+ // Create cloud with multiple layers
+ var cloudBase = self.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 2,
+ scaleY: 0.8,
+ tint: 0x2a2a2a
+ });
+ cloudBase.alpha = 0.3;
+ self.elementGraphics = self.attachAsset('pixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.5,
+ scaleY: 0.6,
+ tint: 0x3a3a3a
+ });
+ self.floatSpeed = 0.3;
+ self.alpha = 0.4;
+ } else if (type === 'star') {
+ // Create sparkling star
+ self.elementGraphics = self.attachAsset('tinyPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1,
+ scaleY: 1,
+ tint: 0xFFD700
+ });
+ self.floatSpeed = 0.1;
+ self.bobAmount = 1;
+ // Add twinkle animation
+ tween(self.elementGraphics, {
+ alpha: 0.3,
+ scaleX: 0.8,
+ scaleY: 0.8
+ }, {
+ duration: 1000 + Math.random() * 2000,
+ easing: tween.easeInOut,
+ loop: true,
+ yoyo: true
+ });
+ }
+ // Fade in animation
+ self.alpha = 0;
+ tween(self, {
+ alpha: self.alpha || 0.6
+ }, {
+ duration: 2000,
+ easing: tween.easeOut
+ });
+ };
+ self.update = function () {
+ self.x -= self.floatSpeed;
+ self.time += self.bobSpeed;
+ self.y = self.initialY + Math.sin(self.time) * self.bobAmount;
+ // Reset position when off screen
+ if (self.x < -100) {
+ self.x = 2148;
+ self.y = Math.random() * 1500 + 100;
+ self.initialY = self.y;
+ }
+ };
+ return self;
+});
+var InteractiveObject = Container.expand(function () {
+ var self = Container.call(this);
+ var objectGraphics = self.attachAsset('pixel', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.init = function (x, y) {
+ self.x = x;
+ self.y = y;
+ self.visible = true;
+ };
+ self.down = function () {
+ self.visible = false;
+ };
+ return self;
+});
+var OrbitingBall = Container.expand(function () {
+ var self = Container.call(this);
+ self.ballGraphics = null;
+ self.points = 12;
+ self.orbitRadius = 200;
+ self.orbitSpeed = 0.02;
+ self.orbitAngle = 0;
+ self.centerX = 1024;
+ self.centerY = 1366;
+ self.collected = false;
+ self.init = function () {
+ // Create ball with orbital effect
+ self.ballGraphics = self.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.3,
+ scaleY: 1.3,
+ tint: 0x00FFFF
+ });
+ // Add orbital trail
+ var trail = self.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.8,
+ scaleY: 1.8,
+ tint: 0x00FFFF
+ });
+ trail.alpha = 0.2;
+ // Set random starting angle
+ self.orbitAngle = Math.random() * Math.PI * 2;
+ self.orbitRadius = 150 + Math.random() * 200;
+ self.orbitSpeed = 0.01 + Math.random() * 0.02;
+ // Spawn animation
+ self.scaleX = 0;
+ self.scaleY = 0;
+ tween(self, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 500,
+ easing: tween.easeOut
+ });
+ };
+ self.update = function () {
+ if (self.collected) {
+ return;
+ }
+ // Orbital movement
+ self.orbitAngle += self.orbitSpeed;
+ self.x = self.centerX + Math.cos(self.orbitAngle) * self.orbitRadius;
+ self.y = self.centerY + Math.sin(self.orbitAngle) * self.orbitRadius;
+ self.rotation = self.orbitAngle + Math.PI / 2;
+ };
+ self.down = Ball.prototype.down;
+ return self;
+});
+var Particle = Container.expand(function () {
+ var self = Container.call(this);
+ self.particleGraphics = null;
+ self.vx = 0;
+ self.vy = 0;
+ self.gravity = 0.2;
+ self.friction = 0.98;
+ self.lifespan = 60;
+ self.maxLife = 60;
+ self.init = function (x, y, color, size) {
+ self.x = x;
+ self.y = y;
+ // Choose pixel size based on size parameter for dust effect
+ var pixelType = 'pixel';
+ var baseScale = 1;
+ if (size < 0.3) {
+ pixelType = 'tinyPixel';
+ baseScale = 0.5 + Math.random() * 0.3; // More size variation for tiny particles
+ } else if (size < 0.6) {
+ pixelType = 'smallPixel';
+ baseScale = 0.7 + Math.random() * 0.4;
+ }
+ self.particleGraphics = self.attachAsset(pixelType, {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: baseScale,
+ scaleY: baseScale,
+ tint: color || 0xFFFFFF
+ });
+ // Dust-like velocity patterns
+ var angle = Math.random() * Math.PI * 2;
+ var speed;
+ if (size < 0.3) {
+ // Tiny particles: slower, more floating movement
+ speed = 0.5 + Math.random() * 2;
+ self.gravity = 0.05 + Math.random() * 0.1;
+ self.friction = 0.995;
+ } else if (size < 0.6) {
+ // Medium particles: moderate speed
+ speed = 1.5 + Math.random() * 3;
+ self.gravity = 0.15 + Math.random() * 0.1;
+ self.friction = 0.98;
+ } else {
+ // Large particles: faster, more dramatic
+ speed = 3 + Math.random() * 5;
+ self.gravity = 0.2 + Math.random() * 0.15;
+ self.friction = 0.97;
+ }
+ self.vx = Math.cos(angle) * speed;
+ self.vy = Math.sin(angle) * speed - (1 + Math.random() * 2);
+ // Varied lifespans for dust-like effect
+ if (size < 0.3) {
+ self.lifespan = 60 + Math.random() * 40; // Tiny particles last longer
+ } else {
+ self.lifespan = 30 + Math.random() * 30; // Larger particles fade faster
+ }
+ self.maxLife = self.lifespan;
+ };
+ self.update = function () {
+ self.x += self.vx;
+ self.y += self.vy;
+ self.vy += self.gravity;
+ self.vx *= self.friction;
+ self.lifespan--;
+ self.alpha = self.lifespan / self.maxLife;
+ if (self.lifespan <= 0) {
+ self.destroy();
+ for (var i = 0; i < particles.length; i++) {
+ if (particles[i] === self) {
+ particles.splice(i, 1);
+ break;
+ }
+ }
+ }
+ };
+ return self;
+});
+var Pixel = Container.expand(function () {
+ var self = Container.call(this);
+ self.pixelType = 'trunk';
+ self.pixelGraphics = null;
+ self.init = function (type, color, size) {
+ self.pixelType = type;
+ if (self.pixelGraphics) {
+ self.pixelGraphics.destroy();
+ }
+ // Choose appropriate pixel asset based on size
+ var pixelAsset = 'pixel';
+ var baseScale = size || 1;
+ if (size && size < 0.5) {
+ pixelAsset = 'tinyPixel';
+ baseScale = 1;
+ } else if (size && size < 0.8) {
+ pixelAsset = 'smallPixel';
+ baseScale = 1;
+ }
+ var assetConfig = {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: baseScale,
+ scaleY: baseScale
+ };
+ if (color) {
+ assetConfig.tint = color;
+ }
+ if (type === 'seed') {
+ self.pixelGraphics = self.attachAsset('seedPixel', {});
+ } else if (type === 'leaf') {
+ self.pixelGraphics = self.attachAsset('leafPixel', {});
+ } else if (type === 'flower') {
+ self.pixelGraphics = self.attachAsset('flowerPixel', {});
+ } else if (type === 'bird') {
+ self.pixelGraphics = self.attachAsset('birdPixel', {});
+ } else if (type === 'root' || type === 'trunk' || type === 'branch') {
+ self.pixelGraphics = self.attachAsset(pixelAsset, {});
+ } else {
+ self.pixelGraphics = self.attachAsset(pixelAsset, {});
+ }
+ self.alpha = 0;
+ };
+ self.fadeIn = function (duration) {
+ tween(self, {
+ alpha: 1
+ }, {
+ duration: duration || 500,
+ easing: tween.easeOut
+ });
+ };
+ self.grow = function (targetScale, duration) {
+ if (self.pixelGraphics) {
+ tween(self.pixelGraphics, {
+ scaleX: targetScale,
+ scaleY: targetScale
+ }, {
+ duration: duration || 1000,
+ easing: tween.easeInOut
+ });
+ }
+ };
+ return self;
+});
+var ShepherdBall = Container.expand(function () {
+ var self = Container.call(this);
+ self.collected = false;
+ self.lifespan = 300; // 5 seconds
+ self.catchRadius = 300;
+ self.init = function () {
+ // Create shepherd ball with special appearance
+ var outerGlow = self.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 3,
+ scaleY: 3,
+ tint: 0x00FFFF
+ });
+ outerGlow.alpha = 0.2;
+ var midGlow = self.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 2,
+ scaleY: 2,
+ tint: 0x00FFFF
+ });
+ midGlow.alpha = 0.4;
+ self.ballGraphics = self.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.5,
+ scaleY: 1.5,
+ tint: 0x00FFFF
+ });
+ // Position randomly
+ self.x = 200 + Math.random() * 1648;
+ self.y = 300 + Math.random() * 2132;
+ // Spawn animation
+ self.scaleX = 0;
+ self.scaleY = 0;
+ tween(self, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 500,
+ easing: tween.bounceOut,
+ onFinish: function onFinish() {
+ tween(self, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 300,
+ easing: tween.easeInOut
+ });
+ }
+ });
+ // Pulsing effect
+ tween(outerGlow, {
+ scaleX: 3.5,
+ scaleY: 3.5,
+ alpha: 0.1
+ }, {
+ duration: 1000,
+ easing: tween.easeInOut,
+ loop: true,
+ yoyo: true
+ });
+ };
+ self.update = function () {
+ if (self.collected) {
+ return;
+ }
+ self.lifespan--;
+ // Start fading when about to disappear
+ if (self.lifespan < 60) {
+ self.alpha = self.lifespan / 60;
+ }
+ // Remove when lifespan ends
+ if (self.lifespan <= 0) {
+ self.collected = true;
+ self.destroy();
+ }
+ };
+ self.down = function () {
+ if (self.collected) {
+ return;
+ }
+ self.collected = true;
+ // Collect all fleeing balls in radius
+ var collectedCount = 0;
+ for (var i = balls.length - 1; i >= 0; i--) {
+ var ball = balls[i];
+ if (ball.behavior === 'fleeing' && !ball.collected) {
+ var dx = ball.x - self.x;
+ var dy = ball.y - self.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist < self.catchRadius) {
+ ball.collected = true;
+ collectedCount++;
+ // Award points
+ LK.setScore(LK.getScore() + ball.points);
+ // Create collection effect
+ createExplosion(ball.x, ball.y, 0x00FFFF);
+ // Animate ball collection
+ tween(ball, {
+ x: self.x,
+ y: self.y,
+ scaleX: 0,
+ scaleY: 0,
+ rotation: Math.PI * 2
+ }, {
+ duration: 300,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ ball.destroy();
+ }
+ });
+ }
+ }
+ }
+ // Bonus points for multiple catches
+ if (collectedCount > 0) {
+ var bonusPoints = collectedCount * 10;
+ LK.setScore(LK.getScore() + bonusPoints);
+ // Show bonus text
+ var bonusText = game.addChild(new Container());
+ bonusText.x = self.x;
+ bonusText.y = self.y;
+ var text = new Text2('LASSO! +' + (collectedCount * 15 + bonusPoints), {
+ size: 80,
+ fill: 0x00FFFF,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ text.anchor.set(0.5, 0.5);
+ bonusText.addChild(text);
+ tween(bonusText, {
+ y: self.y - 150,
+ alpha: 0
+ }, {
+ duration: 1500,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ bonusText.destroy();
+ }
+ });
+ LK.getSound('lasso').play();
+ }
+ // Play sound
+ LK.getSound('hit').play();
+ // Remove shepherd ball with effect
+ tween(self, {
+ scaleX: 2,
+ scaleY: 2,
+ alpha: 0
+ }, {
+ duration: 400,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ self.destroy();
+ }
+ });
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87CEEB
+});
+
+/****
+* Game Code
+****/
+// Level-based ball collection game
+game.setBackgroundColor(0x0a0a0a); // Deep black background for dramatic contrast
+// GLAUD Logo Container
+var glaudContainer = game.addChild(new Container());
+glaudContainer.visible = false;
+// Game variables
+var balls = [];
+var particles = [];
+var floatingElements = [];
+var currentLevel = 1;
+var levelScore = 0;
+var levelTimeLimit = 30; // Level 1 starts with 30 seconds
+var levelTimer = 0;
+var levelStartTime = 0;
+var gameTime = 0; // Add gameTime variable
+var isTransitioning = false;
+var screenShakeX = 0;
+var screenShakeY = 0;
+var shakeIntensity = 0;
+var shakeDuration = 0;
+var mouseX = null;
+var mouseY = null;
+var ballSpawnTimer = 0;
+var levelRequirements = [100, 200, 300, 400, 500, 600, 700, 800, 900]; // Score requirements per level
+var highestLevel = storage.highestLevel || 1; // Load saved highest level
+// Function to get level requirement for any level
+function getLevelRequirement(level) {
+ var baseLevel = (level - 1) % 9 + 1;
+ var difficultyTier = Math.floor((level - 1) / 9);
+ var baseRequirement = levelRequirements[baseLevel - 1];
+ // Increase requirements by 50% for each difficulty tier
+ return Math.floor(baseRequirement * Math.pow(1.5, difficultyTier));
+}
+var targetColor = 0; // For level 9 color targeting
+var targetColorIndex = 0;
+var colorTargetTimer = 0;
+var shepherdBalls = []; // For level 7 shepherd balls
+// Score display with shadow effect
+var scoreTextShadow = new Text2('Level 1 | Score: 0 | Time: 30', {
+ size: 62,
+ fill: 0x000000
+});
+scoreTextShadow.anchor.set(0, 0);
+scoreTextShadow.x = 182;
+scoreTextShadow.y = 12;
+scoreTextShadow.alpha = 0.5;
+LK.gui.topLeft.addChild(scoreTextShadow);
+var scoreText = new Text2('Level 1 | Score: 0 | Time: 30', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0, 0);
+scoreText.x = 180;
+scoreText.y = 10;
+LK.gui.topLeft.addChild(scoreText);
+// Highest level display
+var highestLevelText = new Text2('Best: Level ' + highestLevel, {
+ size: 40,
+ fill: 0xFFA500
+});
+highestLevelText.anchor.set(1, 0);
+highestLevelText.x = -20;
+highestLevelText.y = 10;
+LK.gui.topRight.addChild(highestLevelText);
+highestLevelText.visible = false;
+// Initialize progress bar animation variables
+var lastProgressValue = 0;
+var progressPulseActive = false;
+// Level transition container
+var transitionContainer = game.addChild(new Container());
+transitionContainer.x = 1024;
+transitionContainer.y = 1366;
+// Level transition text with outline - modern style
+var levelTransitionOutline = new Text2('', {
+ size: 124,
+ fill: 0x000000,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+});
+levelTransitionOutline.anchor.set(0.5, 0.5);
+levelTransitionOutline.x = 4;
+levelTransitionOutline.y = 4;
+levelTransitionOutline.alpha = 0.5;
+transitionContainer.addChild(levelTransitionOutline);
+var levelTransitionText = new Text2('', {
+ size: 120,
+ fill: 0xFFFFFF,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+});
+levelTransitionText.anchor.set(0.5, 0.5);
+transitionContainer.addChild(levelTransitionText);
+// Add glow effect container
+var glowContainer = new Container();
+glowContainer.x = 0;
+glowContainer.y = 0;
+transitionContainer.addChildAt(glowContainer, 0);
+// Create glow layers
+for (var i = 0; i < 3; i++) {
+ var glowText = new Text2('', {
+ size: 120 + i * 8,
+ fill: 0xFFD700,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ glowText.anchor.set(0.5, 0.5);
+ glowText.alpha = 0.15 - i * 0.05;
+ glowContainer.addChild(glowText);
+}
+transitionContainer.visible = false;
+// Create background gradient
+var bgGradient = new BackgroundGradient();
+bgGradient.init();
+game.addChild(bgGradient);
+// Start background music
+LK.playMusic('gameMusic', {
+ loop: true
+});
+// GLAUD intro function
+function showGLAUDIntro() {
+ isTransitioning = true;
+ // Create intro container
+ var introContainer = game.addChild(new Container());
+ introContainer.x = 1024;
+ introContainer.y = 1366;
+ introContainer.alpha = 0;
+ // Create game ball shower effect
+ var ballShower = [];
+ for (var i = 0; i < 15; i++) {
+ var ballContainer = new Container();
+ var ball = ballContainer.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.5 + Math.random() * 0.5,
+ scaleY: 0.5 + Math.random() * 0.5,
+ tint: i < 5 ? 0xFFD700 : i < 10 ? 0xFF4444 : 0x44FF44
+ });
+ ballContainer.x = -800 + Math.random() * 1600;
+ ballContainer.y = -800 - Math.random() * 400;
+ ballContainer.vx = (Math.random() - 0.5) * 2;
+ ballContainer.vy = 5 + Math.random() * 5;
+ ballContainer.rotation = Math.random() * Math.PI * 2;
+ introContainer.addChild(ballContainer);
+ ballShower.push(ballContainer);
+ }
+ // Create GLAUD text with multiple layers for effect
+ var glaudOutline = new Text2('GLAUD', {
+ size: 240,
+ fill: 0xFFD700,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ glaudOutline.anchor.set(0.5, 0.5);
+ glaudOutline.alpha = 0.2;
+ introContainer.addChild(glaudOutline);
+ var glaudShadow = new Text2('GLAUD', {
+ size: 200,
+ fill: 0x000000,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ glaudShadow.anchor.set(0.5, 0.5);
+ glaudShadow.x = 8;
+ glaudShadow.y = 8;
+ glaudShadow.alpha = 0.5;
+ introContainer.addChild(glaudShadow);
+ var glaudGlow = new Text2('GLAUD', {
+ size: 210,
+ fill: 0xFF6600,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ glaudGlow.anchor.set(0.5, 0.5);
+ glaudGlow.alpha = 0.3;
+ introContainer.addChild(glaudGlow);
+ var glaudText = new Text2('GLAUD', {
+ size: 180,
+ fill: 0xFFA500,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ glaudText.anchor.set(0.5, 0.5);
+ introContainer.addChild(glaudText);
+ // Add dynamic subtitle
+ var subtitle = new Text2('BALL COLLECTOR', {
+ size: 60,
+ fill: 0xFFD700,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ subtitle.anchor.set(0.5, 0.5);
+ subtitle.y = 100;
+ subtitle.alpha = 0;
+ introContainer.addChild(subtitle);
+ // Create energy ring
+ var energyRing = introContainer.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.1,
+ scaleY: 0.1,
+ tint: 0xFFA500
+ });
+ energyRing.alpha = 0.8;
+ // Start with explosion effect
+ introContainer.scaleX = 0.1;
+ introContainer.scaleY = 0.1;
+ introContainer.alpha = 1;
+ // Explosive entrance
+ tween(introContainer, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(introContainer, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200,
+ easing: tween.easeInOut
+ });
+ }
+ });
+ // Animate energy ring
+ tween(energyRing, {
+ scaleX: 8,
+ scaleY: 8,
+ alpha: 0
+ }, {
+ duration: 800,
+ easing: tween.easeOut
+ });
+ // Animate balls falling
+ var ballTimer = LK.setInterval(function () {
+ for (var i = 0; i < ballShower.length; i++) {
+ var ballContainer = ballShower[i];
+ ballContainer.x += ballContainer.vx;
+ ballContainer.y += ballContainer.vy;
+ ballContainer.rotation += 0.1;
+ ballContainer.vy += 0.3;
+ if (ballContainer.y > 800) {
+ ballContainer.y = -800 - Math.random() * 400;
+ ballContainer.x = -800 + Math.random() * 1600;
+ ballContainer.vy = 5 + Math.random() * 5;
+ }
+ }
+ }, 16);
+ // Quick glow pulse
+ tween(glaudGlow, {
+ scaleX: 1.15,
+ scaleY: 1.15,
+ alpha: 0.6
+ }, {
+ duration: 400,
+ easing: tween.easeInOut,
+ yoyo: true,
+ repeat: 1
+ });
+ // Show subtitle
+ LK.setTimeout(function () {
+ tween(subtitle, {
+ alpha: 1,
+ y: 120
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ }, 200);
+ // Create collecting effect
+ LK.setTimeout(function () {
+ // All balls converge to center
+ for (var i = 0; i < ballShower.length; i++) {
+ (function (ballContainer, index) {
+ tween(ballContainer, {
+ x: 0,
+ y: 0,
+ scaleX: 0,
+ scaleY: 0,
+ rotation: Math.PI * 4
+ }, {
+ duration: 400,
+ delay: index * 20,
+ easing: tween.easeIn
+ });
+ })(ballShower[i], i);
+ }
+ // Flash effect when balls are collected
+ LK.setTimeout(function () {
+ var flash = introContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 20,
+ scaleY: 20,
+ tint: 0xFFD700
+ });
+ flash.alpha = 0.8;
+ tween(flash, {
+ alpha: 0
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ // Score burst effect
+ var scoreText = new Text2('+1000', {
+ size: 100,
+ fill: 0xFFD700,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ scoreText.anchor.set(0.5, 0.5);
+ scoreText.y = -50;
+ scoreText.alpha = 0;
+ introContainer.addChild(scoreText);
+ tween(scoreText, {
+ y: -150,
+ alpha: 1
+ }, {
+ duration: 400,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(scoreText, {
+ alpha: 0
+ }, {
+ duration: 200,
+ easing: tween.easeIn
+ });
+ }
+ });
+ }, 300);
+ }, 800);
+ // Quick transition to game
+ LK.setTimeout(function () {
+ LK.clearInterval(ballTimer);
+ // Create permanent GLAUD logo in top right
+ glaudContainer.x = 1900;
+ glaudContainer.y = 80;
+ var glaudLogo = new Text2('GLAUD', {
+ size: 60,
+ fill: 0xFFA500,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ glaudLogo.anchor.set(1, 0);
+ glaudContainer.addChild(glaudLogo);
+ // Quick fade out with rotation
+ tween(introContainer, {
+ alpha: 0,
+ scaleX: 0.5,
+ scaleY: 0.5,
+ rotation: 0.2
+ }, {
+ duration: 400,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ introContainer.destroy();
+ // Show GLAUD logo and highest level
+ glaudContainer.alpha = 0;
+ glaudContainer.visible = true;
+ tween(glaudContainer, {
+ alpha: 1
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ highestLevelText.visible = true;
+ isTransitioning = false;
+ // Start first level
+ startLevel(1);
+ }
+ });
+ }, 1500);
+}
+// Create GLAUD intro
+showGLAUDIntro();
+// Particle and effect functions
+function createExplosion(x, y, color) {
+ // Create multi-layered explosion effect
+ for (var i = 0; i < 30; i++) {
+ var particle = new Particle();
+ // Mix of particle sizes for depth
+ var sizeVariation = 0.1 + Math.random() * 0.5;
+ // Vary colors for richness
+ var particleColor = color;
+ if (Math.random() < 0.3) {
+ particleColor = 0xFFFFFF; // White sparkles
+ } else if (Math.random() < 0.5) {
+ particleColor = 0xFFD700; // Gold accents
+ }
+ particle.init(x, y, particleColor, sizeVariation);
+ particles.push(particle);
+ game.addChild(particle);
+ }
+ // Create ring effect
+ var ring = game.addChild(new Container());
+ ring.x = x;
+ ring.y = y;
+ var ringGraphic = ring.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.1,
+ scaleY: 0.1,
+ tint: color
+ });
+ ringGraphic.alpha = 0.8;
+ tween(ringGraphic, {
+ scaleX: 3,
+ scaleY: 3,
+ alpha: 0
+ }, {
+ duration: 500,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ ring.destroy();
+ }
+ });
+}
+function createTrailParticle(x, y, color) {
+ var particle = new Particle();
+ particle.init(x, y, color, 0.2);
+ particle.lifespan = 20;
+ particle.maxLife = 20;
+ particles.push(particle);
+ game.addChild(particle);
+}
+function screenShake(intensity, duration) {
+ shakeIntensity = intensity;
+ shakeDuration = duration;
+}
+function updateScreenShake() {
+ if (shakeDuration > 0) {
+ screenShakeX = (Math.random() - 0.5) * shakeIntensity;
+ screenShakeY = (Math.random() - 0.5) * shakeIntensity;
+ game.x = screenShakeX;
+ game.y = screenShakeY;
+ shakeDuration -= 16;
+ } else {
+ game.x = 0;
+ game.y = 0;
+ }
+}
+// Function to spawn balls based on level
+function spawnBall() {
+ if (isTransitioning) {
+ return;
+ }
+ var ball = new Ball();
+ ball.init(currentLevel);
+ balls.push(ball);
+ game.addChild(ball);
+ LK.getSound('spawn').play();
+}
+// Function to start a new level
+function startLevel(level) {
+ currentLevel = level;
+ levelScore = 0;
+ levelStartTime = gameTime;
+ // Save highest level reached
+ if (level > highestLevel) {
+ highestLevel = level;
+ storage.highestLevel = highestLevel;
+ highestLevelText.setText('Best: Level ' + highestLevel);
+ }
+ // Calculate base level and difficulty tier
+ var baseLevel = (level - 1) % 9 + 1;
+ var difficultyTier = Math.floor((level - 1) / 9);
+ // Set time limit for level with difficulty adjustments
+ if (baseLevel === 1) {
+ levelTimeLimit = Math.max(20, 30 - difficultyTier * 5);
+ } else if (baseLevel <= 5) {
+ levelTimeLimit = Math.max(30, 30 + (baseLevel - 1) * 20 - difficultyTier * 10);
+ } else {
+ // Harder time limits for levels 6-9
+ levelTimeLimit = Math.max(60, 120 + (baseLevel - 6) * 10 - difficultyTier * 15);
+ }
+ // Clear existing balls
+ for (var i = balls.length - 1; i >= 0; i--) {
+ balls[i].destroy();
+ }
+ balls = [];
+ lastProgressValue = 0;
+ progressPulseActive = false;
+ // Reset score to 0 for this level
+ LK.setScore(0);
+ levelScore = 0;
+ // Show intro for level 1
+ if (level === 1 && gameTime === 0) {
+ isTransitioning = true;
+ transitionContainer.visible = true;
+ transitionContainer.alpha = 1;
+ // Clear any existing children except the main text elements
+ for (var i = transitionContainer.children.length - 1; i >= 0; i--) {
+ var child = transitionContainer.children[i];
+ if (child !== levelTransitionText && child !== levelTransitionOutline && child !== glowContainer) {
+ child.destroy();
+ }
+ }
+ levelTransitionText.setText('LEVEL 1');
+ levelTransitionOutline.setText('LEVEL 1');
+ levelTransitionText.size = 140;
+ levelTransitionOutline.size = 144;
+ transitionContainer.x = 1024;
+ transitionContainer.y = 1366;
+ transitionContainer.scaleX = 0;
+ transitionContainer.scaleY = 0;
+ // Intro animation
+ tween(transitionContainer, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 500,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(transitionContainer, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 300,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ // Add subtitle
+ var subtitle = new Text2('Collect the Balls!', {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ subtitle.anchor.set(0.5, 0.5);
+ subtitle.y = 80;
+ subtitle.alpha = 0;
+ transitionContainer.addChild(subtitle);
+ tween(subtitle, {
+ alpha: 1,
+ y: 60
+ }, {
+ duration: 400,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ LK.setTimeout(function () {
+ tween(transitionContainer, {
+ alpha: 0,
+ scaleX: 0.8,
+ scaleY: 0.8
+ }, {
+ duration: 600,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ transitionContainer.visible = false;
+ transitionContainer.removeChild(subtitle);
+ subtitle.destroy();
+ isTransitioning = false;
+ // Spawn initial balls
+ var initialBalls = 5 + baseLevel * 2 + difficultyTier * 3;
+ for (var i = 0; i < initialBalls; i++) {
+ spawnBall();
+ }
+ }
+ });
+ }, 1500);
+ }
+ });
+ }
+ });
+ }
+ });
+ } else {
+ isTransitioning = false;
+ // Spawn initial balls based on level
+ var initialBalls = 5 + baseLevel * 2 + difficultyTier * 3;
+ for (var i = 0; i < initialBalls; i++) {
+ spawnBall();
+ }
+ }
+}
+// Function to show level transition
+function showLevelTransition(nextLevel) {
+ isTransitioning = true;
+ // Clear balls
+ for (var i = balls.length - 1; i >= 0; i--) {
+ balls[i].destroy();
+ }
+ balls = [];
+ // Calculate base level and difficulty tier
+ var baseLevel = (nextLevel - 1) % 9 + 1;
+ var difficultyTier = Math.floor((nextLevel - 1) / 9);
+ // Create modern transition sequence
+ transitionContainer.visible = true;
+ transitionContainer.alpha = 1;
+ // First show completion message
+ levelTransitionText.setText('LEVEL ' + (nextLevel - 1) + ' COMPLETE');
+ levelTransitionOutline.setText('LEVEL ' + (nextLevel - 1) + ' COMPLETE');
+ levelTransitionText.size = 100;
+ levelTransitionOutline.size = 104;
+ // Clear any existing children except the main text elements
+ for (var i = transitionContainer.children.length - 1; i >= 0; i--) {
+ var child = transitionContainer.children[i];
+ if (child !== levelTransitionText && child !== levelTransitionOutline && child !== glowContainer) {
+ child.destroy();
+ }
+ }
+ // Start with slide in from left
+ transitionContainer.x = -500;
+ transitionContainer.y = 1366;
+ transitionContainer.scaleX = 1;
+ transitionContainer.scaleY = 1;
+ transitionContainer.rotation = 0;
+ // Slide in animation
+ tween(transitionContainer, {
+ x: 1024
+ }, {
+ duration: 600,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ // Pulse effect
+ tween(transitionContainer, {
+ scaleX: 1.1,
+ scaleY: 1.1
+ }, {
+ duration: 300,
+ easing: tween.easeInOut,
+ yoyo: true,
+ onFinish: function onFinish() {
+ // Wait then show next level intro
+ LK.setTimeout(function () {
+ // Show cinematic intro based on base level
+ if (nextLevel <= 9) {
+ // Original intros for levels 1-9
+ if (nextLevel === 2) {
+ showLevel2Intro(nextLevel);
+ } else if (nextLevel === 3) {
+ showLevel3Intro(nextLevel);
+ } else if (nextLevel === 4) {
+ showLevel4Intro(nextLevel);
+ } else if (nextLevel === 5) {
+ showLevel5Intro(nextLevel);
+ } else if (nextLevel === 6) {
+ showLevel6Intro(nextLevel);
+ } else if (nextLevel === 7) {
+ showLevel7Intro(nextLevel);
+ } else if (nextLevel === 8) {
+ showLevel8Intro(nextLevel);
+ } else if (nextLevel === 9) {
+ showLevel9Intro(nextLevel);
+ }
+ } else {
+ // For levels 10+, show level with difficulty tier
+ levelTransitionText.setText('LEVEL ' + nextLevel);
+ levelTransitionOutline.setText('LEVEL ' + nextLevel);
+ levelTransitionText.size = 140;
+ levelTransitionOutline.size = 144;
+ // Reset position for intro animation
+ transitionContainer.x = 1024;
+ transitionContainer.scaleX = 0;
+ transitionContainer.scaleY = 0;
+ transitionContainer.alpha = 0;
+ // Intro animation - expand from center
+ tween(transitionContainer, {
+ scaleX: 1.2,
+ scaleY: 1.2,
+ alpha: 1
+ }, {
+ duration: 500,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ // Shrink to normal size
+ tween(transitionContainer, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 300,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ // Add subtitle showing difficulty tier
+ var subtitleText = 'Difficulty Tier ' + (difficultyTier + 1);
+ if (baseLevel === 1) {
+ subtitleText += ' - Static Balls';
+ } else if (baseLevel === 2) {
+ subtitleText += ' - Random Movement';
+ } else if (baseLevel === 3) {
+ subtitleText += ' - Falling Balls';
+ } else if (baseLevel === 4) {
+ subtitleText += ' - Fleeing Balls';
+ } else if (baseLevel === 5) {
+ subtitleText += ' - Roaming Chaos';
+ } else if (baseLevel === 6) {
+ subtitleText += ' - Orbital Mastery';
+ } else if (baseLevel === 7) {
+ subtitleText += ' - Fugitives & Lasso';
+ } else if (baseLevel === 8) {
+ subtitleText += ' - Phantom Echoes';
+ } else if (baseLevel === 9) {
+ subtitleText += ' - Chromatic Chaos';
+ }
+ var subtitle = new Text2(subtitleText, {
+ size: 60,
+ fill: difficultyTier >= 2 ? 0xFF4444 : 0xFFFFFF
+ });
+ subtitle.anchor.set(0.5, 0.5);
+ subtitle.y = 80;
+ subtitle.alpha = 0;
+ transitionContainer.addChild(subtitle);
+ // Add difficulty warning for high tiers
+ if (difficultyTier >= 2) {
+ var warning = new Text2('EXTREME DIFFICULTY!', {
+ size: 50,
+ fill: 0xFF0000
+ });
+ warning.anchor.set(0.5, 0.5);
+ warning.y = 140;
+ warning.alpha = 0;
+ transitionContainer.addChild(warning);
+ tween(warning, {
+ alpha: 1,
+ scaleX: 1.1,
+ scaleY: 1.1
+ }, {
+ duration: 400,
+ delay: 600,
+ easing: tween.easeOut,
+ yoyo: true,
+ repeat: 2
+ });
+ }
+ // Fade in subtitle
+ tween(subtitle, {
+ alpha: 1,
+ y: 60
+ }, {
+ duration: 400,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ // Wait then fade everything out
+ LK.setTimeout(function () {
+ tween(transitionContainer, {
+ alpha: 0,
+ scaleX: 0.8,
+ scaleY: 0.8
+ }, {
+ duration: 600,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ transitionContainer.visible = false;
+ transitionContainer.removeChildren();
+ startLevel(nextLevel);
+ }
+ });
+ }, 1500);
+ }
+ });
+ }
+ });
+ }
+ });
+ }
+ }, 800);
+ }
+ });
+ }
+ });
+ // Create celebration effects
+ for (var i = 0; i < 30; i++) {
+ LK.setTimeout(function () {
+ var angle = Math.random() * Math.PI * 2;
+ var distance = 200 + Math.random() * 300;
+ var x = 1024 + Math.cos(angle) * distance;
+ var y = 1366 + Math.sin(angle) * distance;
+ createExplosion(x, y, 0xFFD700);
+ }, i * 30);
+ }
+ // Screen shake for impact
+ screenShake(10, 300);
+}
+// Function to spawn floating background elements
+function spawnFloatingElement() {
+ if (floatingElements.length < 8) {
+ var element = new FloatingElement();
+ var type = Math.random() < 0.7 ? 'cloud' : 'star';
+ element.init(type, 2148, Math.random() * 1500 + 100);
+ floatingElements.push(element);
+ game.addChild(element);
+ }
+}
+// Track mouse position
+game.move = function (x, y, obj) {
+ mouseX = x;
+ mouseY = y;
+};
+// Enhanced update function with dynamic effects
+game.update = function () {
+ // Update game time
+ gameTime++;
+ if (!isTransitioning) {
+ // Calculate remaining time
+ var elapsedTime = Math.floor((gameTime - levelStartTime) / 60);
+ var remainingTime = Math.max(0, levelTimeLimit - elapsedTime);
+ // Update screen shake
+ updateScreenShake();
+ // Spawn balls periodically based on level
+ ballSpawnTimer++;
+ var baseLevel = (currentLevel - 1) % 9 + 1;
+ var difficultyTier = Math.floor((currentLevel - 1) / 9);
+ var spawnRate = Math.max(20, 120 - baseLevel * 15 - difficultyTier * 10);
+ var maxBalls = 15 + baseLevel * 3 + difficultyTier * 5;
+ if (ballSpawnTimer >= spawnRate && balls.length < maxBalls) {
+ spawnBall();
+ ballSpawnTimer = 0;
+ }
+ // Spawn floating elements periodically
+ if (gameTime % 300 === 0) {
+ spawnFloatingElement();
+ }
+ // Update score display with time warning
+ var currentRequirement = getLevelRequirement(currentLevel);
+ var displayText = 'Level ' + currentLevel + ' | Score: ' + LK.getScore() + '/' + currentRequirement + ' | Time: ' + remainingTime;
+ scoreText.setText(displayText);
+ scoreTextShadow.setText(displayText);
+ // Time warning effect
+ if (remainingTime <= 10 && remainingTime > 0) {
+ scoreText.tint = 0xFF4444;
+ scoreTextShadow.tint = 0x660000;
+ // Pulse effect
+ if (gameTime % 30 === 0) {
+ tween(scoreText, {
+ scaleX: 1.1,
+ scaleY: 1.1
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ yoyo: true
+ });
+ }
+ } else {
+ scoreText.tint = 0xFFFFFF;
+ scoreTextShadow.tint = 0x000000;
+ }
+ // Update progress tracking
+ var progress = LK.getScore() / levelRequirements[currentLevel - 1];
+ lastProgressValue = progress;
+ // Level 7: Spawn shepherd balls occasionally
+ if (currentLevel === 7 && gameTime % 300 === 0) {
+ var shepherd = new ShepherdBall();
+ shepherd.init();
+ shepherdBalls.push(shepherd);
+ game.addChild(shepherd);
+ }
+ // Level 9: Update color target
+ if (currentLevel === 9) {
+ colorTargetTimer++;
+ if (colorTargetTimer >= 600) {
+ // Change target every 10 seconds
+ colorTargetTimer = 0;
+ targetColorIndex = (targetColorIndex + 1) % 3;
+ var colors = [0xFFD700, 0xFF4444, 0x44FF44];
+ targetColor = colors[targetColorIndex];
+ // Update UI to show current target color
+ scoreText.tint = targetColor;
+ }
+ }
+ // Update shepherd balls
+ for (var i = shepherdBalls.length - 1; i >= 0; i--) {
+ var shepherd = shepherdBalls[i];
+ if (shepherd.collected || shepherd.lifespan <= 0) {
+ shepherdBalls.splice(i, 1);
+ }
+ }
+ // Check level completion
+ if (LK.getScore() >= getLevelRequirement(currentLevel)) {
+ showLevelTransition(currentLevel + 1);
+ }
+ // Check time limit
+ if (remainingTime <= 0) {
+ LK.showGameOver();
+ }
+ }
+};
+// Cinematic intro for Level 2 - Random Moving Balls
+function showLevel2Intro(nextLevel) {
+ // Clear transition container
+ transitionContainer.removeChildren();
+ transitionContainer.x = 1024;
+ transitionContainer.y = 1366;
+ transitionContainer.scaleX = 1;
+ transitionContainer.scaleY = 1;
+ transitionContainer.alpha = 1;
+ // Create cinematic frame
+ var frameContainer = new Container();
+ frameContainer.scaleX = 0;
+ frameContainer.scaleY = 0;
+ transitionContainer.addChild(frameContainer);
+ // Create outer frame border
+ var outerFrame = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 12,
+ scaleY: 8,
+ tint: 0xFFD700
+ });
+ outerFrame.alpha = 0.3;
+ // Create inner frame
+ var innerFrame = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 11,
+ scaleY: 7,
+ tint: 0x000000
+ });
+ innerFrame.alpha = 0.9;
+ // Create demo container
+ var demoContainer = new Container();
+ demoContainer.y = 0;
+ frameContainer.addChild(demoContainer);
+ // Title
+ var title = new Text2('LEVEL 2', {
+ size: 180,
+ fill: 0xFFD700,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ title.anchor.set(0.5, 0.5);
+ title.y = -350;
+ demoContainer.addChild(title);
+ // Subtitle
+ var subtitle = new Text2('Balls Move Randomly!', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ subtitle.anchor.set(0.5, 0.5);
+ subtitle.y = -200;
+ subtitle.alpha = 0;
+ demoContainer.addChild(subtitle);
+ // Create demo area background
+ var demoArea = demoContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 9,
+ scaleY: 4,
+ tint: 0x1a1a1a
+ });
+ demoArea.y = 150;
+ demoArea.alpha = 0.5;
+ // Create demo balls
+ var demoBalls = [];
+ for (var i = 0; i < 4; i++) {
+ var ball = new Container();
+ // Add glow effect
+ var glow = ball.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.5,
+ scaleY: 1.5,
+ tint: 0xFFD700
+ });
+ glow.alpha = 0.3;
+ var ballGfx = ball.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: 0xFFD700
+ });
+ ball.x = -300 + i * 200;
+ ball.y = 150;
+ ball.vx = (Math.random() - 0.5) * 6;
+ ball.vy = (Math.random() - 0.5) * 6;
+ ball.scaleX = 0;
+ ball.scaleY = 0;
+ demoBalls.push(ball);
+ demoContainer.addChild(ball);
+ }
+ // Animate frame entrance
+ tween(frameContainer, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 600,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(frameContainer, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 300,
+ easing: tween.easeInOut
+ });
+ }
+ });
+ // Animate intro
+ tween(title, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 500,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(subtitle, {
+ alpha: 1,
+ y: -200
+ }, {
+ duration: 400,
+ easing: tween.easeOut
+ });
+ // Animate demo balls
+ for (var i = 0; i < demoBalls.length; i++) {
+ (function (ball, delay) {
+ LK.setTimeout(function () {
+ tween(ball, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 300,
+ easing: tween.bounceOut,
+ onFinish: function onFinish() {
+ tween(ball, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200,
+ easing: tween.easeInOut
+ });
+ }
+ });
+ }, delay);
+ })(demoBalls[i], i * 100);
+ }
+ // Animate ball movement
+ var moveTimer = LK.setInterval(function () {
+ for (var i = 0; i < demoBalls.length; i++) {
+ var ball = demoBalls[i];
+ ball.x += ball.vx;
+ ball.y += ball.vy;
+ // Bounce off walls
+ if (ball.x < -400 || ball.x > 400) {
+ ball.vx = -ball.vx;
+ }
+ if (ball.y < 0 || ball.y > 300) {
+ ball.vy = -ball.vy;
+ }
+ }
+ }, 16);
+ // Transition out
+ LK.setTimeout(function () {
+ LK.clearInterval(moveTimer);
+ tween(frameContainer, {
+ alpha: 0,
+ scaleX: 0.5,
+ scaleY: 0.5,
+ rotation: 0.1
+ }, {
+ duration: 600,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ transitionContainer.visible = false;
+ transitionContainer.removeChildren();
+ startLevel(nextLevel);
+ }
+ });
+ }, 3500);
+ }
+ });
+}
+// Cinematic intro for Level 3 - Falling Balls
+function showLevel3Intro(nextLevel) {
+ // Clear transition container
+ transitionContainer.removeChildren();
+ transitionContainer.x = 1024;
+ transitionContainer.y = 1366;
+ transitionContainer.scaleX = 1;
+ transitionContainer.scaleY = 1;
+ transitionContainer.alpha = 1;
+ // Create cinematic frame with vertical emphasis
+ var frameContainer = new Container();
+ frameContainer.scaleX = 0;
+ frameContainer.scaleY = 0;
+ transitionContainer.addChild(frameContainer);
+ // Create outer frame border - taller for falling effect
+ var outerFrame = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 10,
+ scaleY: 12,
+ tint: 0x4444FF
+ });
+ outerFrame.alpha = 0.3;
+ // Create inner frame
+ var innerFrame = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 9,
+ scaleY: 11,
+ tint: 0x000000
+ });
+ innerFrame.alpha = 0.9;
+ // Add decorative elements
+ for (var i = 0; i < 4; i++) {
+ var deco = frameContainer.attachAsset('smallPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 2,
+ scaleY: 2,
+ tint: 0xFFD700
+ });
+ deco.x = -400 + i * 267;
+ deco.y = -550;
+ deco.alpha = 0.6;
+ }
+ // Create demo container
+ var demoContainer = new Container();
+ demoContainer.y = 0;
+ frameContainer.addChild(demoContainer);
+ // Title
+ var title = new Text2('LEVEL 3', {
+ size: 180,
+ fill: 0x4444FF,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ title.anchor.set(0.5, 0.5);
+ title.y = -450;
+ demoContainer.addChild(title);
+ // Subtitle
+ var subtitle = new Text2('Balls Fall From Above!', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ subtitle.anchor.set(0.5, 0.5);
+ subtitle.y = -350;
+ subtitle.alpha = 0;
+ demoContainer.addChild(subtitle);
+ // Create falling area indicators
+ var leftLine = demoContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.1,
+ scaleY: 8,
+ tint: 0x4444FF
+ });
+ leftLine.x = -380;
+ leftLine.y = 0;
+ leftLine.alpha = 0.3;
+ var rightLine = demoContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.1,
+ scaleY: 8,
+ tint: 0x4444FF
+ });
+ rightLine.x = 380;
+ rightLine.y = 0;
+ rightLine.alpha = 0.3;
+ // Create falling demo balls
+ var fallingBalls = [];
+ // Animate frame entrance - drop from above
+ frameContainer.y = -800;
+ frameContainer.scaleX = 1;
+ frameContainer.scaleY = 1;
+ tween(frameContainer, {
+ y: 0
+ }, {
+ duration: 800,
+ easing: tween.bounceOut
+ });
+ // Animate intro
+ LK.setTimeout(function () {
+ tween(title, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 500,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(subtitle, {
+ alpha: 1,
+ y: -350
+ }, {
+ duration: 400,
+ easing: tween.easeOut
+ });
+ // Create falling balls animation
+ var ballSpawnTimer = LK.setInterval(function () {
+ var ball = new Container();
+ // Add trail effect
+ var trail = ball.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1,
+ scaleY: 2,
+ tint: 0x4444FF
+ });
+ trail.alpha = 0.2;
+ var ballGfx = ball.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: 0xFFD700
+ });
+ ball.x = -350 + Math.random() * 700;
+ ball.y = -500;
+ ball.rotation = Math.random() * Math.PI * 2;
+ ball.scaleX = 0.5 + Math.random() * 0.5;
+ ball.scaleY = ball.scaleX;
+ fallingBalls.push(ball);
+ demoContainer.addChild(ball);
+ // Falling animation with acceleration
+ tween(ball, {
+ y: 500,
+ rotation: ball.rotation + Math.PI * 4,
+ scaleX: ball.scaleX * 1.5,
+ scaleY: ball.scaleY * 1.5
+ }, {
+ duration: 2000,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ // Create splash effect
+ var splash = demoContainer.addChild(new Container());
+ splash.x = ball.x;
+ splash.y = 480;
+ var splashGfx = splash.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.1,
+ scaleY: 0.1,
+ tint: 0xFFD700
+ });
+ tween(splashGfx, {
+ scaleX: 3,
+ scaleY: 3,
+ alpha: 0
+ }, {
+ duration: 400,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ splash.destroy();
+ }
+ });
+ ball.destroy();
+ }
+ });
+ }, 200);
+ // Transition out
+ LK.setTimeout(function () {
+ LK.clearInterval(ballSpawnTimer);
+ tween(frameContainer, {
+ alpha: 0,
+ y: 800
+ }, {
+ duration: 600,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ transitionContainer.visible = false;
+ transitionContainer.removeChildren();
+ startLevel(nextLevel);
+ }
+ });
+ }, 3500);
+ }
+ });
+ }, 800);
+}
+// Cinematic intro for Level 4 - Fleeing Balls
+function showLevel4Intro(nextLevel) {
+ // Clear transition container
+ transitionContainer.removeChildren();
+ transitionContainer.x = 1024;
+ transitionContainer.y = 1366;
+ transitionContainer.scaleX = 1;
+ transitionContainer.scaleY = 1;
+ transitionContainer.alpha = 1;
+ // Create cinematic frame with action-movie style
+ var frameContainer = new Container();
+ frameContainer.alpha = 0;
+ transitionContainer.addChild(frameContainer);
+ // Create dynamic frame border
+ var outerFrame = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 14,
+ scaleY: 10,
+ tint: 0xFF4444
+ });
+ outerFrame.alpha = 0.4;
+ // Create inner frame with gradient effect
+ var innerFrame = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 13,
+ scaleY: 9,
+ tint: 0x000000
+ });
+ innerFrame.alpha = 0.95;
+ // Add action lines
+ for (var i = 0; i < 6; i++) {
+ var line = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0,
+ anchorY: 0.5,
+ scaleX: 8,
+ scaleY: 0.05,
+ tint: 0xFF4444
+ });
+ line.x = -650;
+ line.y = -400 + i * 160;
+ line.alpha = 0.2;
+ line.rotation = -0.1 + Math.random() * 0.2;
+ }
+ // Create demo container
+ var demoContainer = new Container();
+ demoContainer.y = 0;
+ frameContainer.addChild(demoContainer);
+ // Title with dramatic effect
+ var titleGlow = new Text2('LEVEL 4', {
+ size: 200,
+ fill: 0xFF4444,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ titleGlow.anchor.set(0.5, 0.5);
+ titleGlow.y = -400;
+ titleGlow.alpha = 0.3;
+ demoContainer.addChild(titleGlow);
+ var title = new Text2('LEVEL 4', {
+ size: 180,
+ fill: 0xFFFFFF,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ title.anchor.set(0.5, 0.5);
+ title.y = -400;
+ demoContainer.addChild(title);
+ // Subtitle
+ var subtitle = new Text2('Balls Run Away!', {
+ size: 80,
+ fill: 0xFFD700
+ });
+ subtitle.anchor.set(0.5, 0.5);
+ subtitle.y = -280;
+ subtitle.alpha = 0;
+ demoContainer.addChild(subtitle);
+ // Create demo arena
+ var arena = demoContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 10,
+ scaleY: 5,
+ tint: 0x1a1a1a
+ });
+ arena.y = 150;
+ arena.alpha = 0.3;
+ // Create fleeing demo with multiple balls
+ var fleeingBalls = [];
+ for (var i = 0; i < 3; i++) {
+ var fleeingBall = new Container();
+ // Add fear effect
+ var fearAura = fleeingBall.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.5,
+ scaleY: 1.5,
+ tint: 0xFF4444
+ });
+ fearAura.alpha = 0.3;
+ var ballGfx = fleeingBall.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: 0xFFD700
+ });
+ fleeingBall.x = -200 + i * 200;
+ fleeingBall.y = 150;
+ fleeingBall.scaleX = 0;
+ fleeingBall.scaleY = 0;
+ fleeingBalls.push(fleeingBall);
+ demoContainer.addChild(fleeingBall);
+ }
+ // Create cursor with predator effect
+ var cursor = new Container();
+ var cursorAura = cursor.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 2,
+ scaleY: 2,
+ tint: 0xFF0000
+ });
+ cursorAura.alpha = 0.2;
+ var cursorGfx = cursor.attachAsset('smallTarget', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: 0xFFFFFF
+ });
+ cursor.x = -400;
+ cursor.y = 150;
+ cursor.alpha = 0;
+ cursor.scaleX = 1.5;
+ cursor.scaleY = 1.5;
+ demoContainer.addChild(cursor);
+ // Animate frame entrance with flash
+ tween(frameContainer, {
+ alpha: 1
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ // Screen flash effect
+ var flash = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 15,
+ scaleY: 11,
+ tint: 0xFFFFFF
+ });
+ flash.alpha = 0.8;
+ tween(flash, {
+ alpha: 0
+ }, {
+ duration: 400,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ flash.destroy();
+ }
+ });
+ // Animate intro
+ tween(title, {
+ scaleX: 1.1,
+ scaleY: 1.1
+ }, {
+ duration: 500,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(subtitle, {
+ alpha: 1,
+ y: -280
+ }, {
+ duration: 400,
+ easing: tween.easeOut
+ });
+ // Show balls with stagger
+ for (var i = 0; i < fleeingBalls.length; i++) {
+ (function (ball, delay) {
+ LK.setTimeout(function () {
+ tween(ball, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 300,
+ easing: tween.bounceOut
+ });
+ }, delay);
+ })(fleeingBalls[i], i * 150);
+ }
+ // Show cursor
+ LK.setTimeout(function () {
+ tween(cursor, {
+ alpha: 1
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ // Animate chase sequence
+ tween(cursor, {
+ x: 0,
+ y: 150
+ }, {
+ duration: 800,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ // All balls flee in different directions
+ for (var i = 0; i < fleeingBalls.length; i++) {
+ (function (ball, index) {
+ var angle = index / fleeingBalls.length * Math.PI * 2;
+ var fleeX = Math.cos(angle) * 300;
+ var fleeY = 150 + Math.sin(angle) * 200;
+ tween(ball, {
+ x: fleeX,
+ y: fleeY,
+ rotation: Math.random() * Math.PI
+ }, {
+ duration: 600,
+ easing: tween.easeOut
+ });
+ })(fleeingBalls[i], i);
+ }
+ // Cursor spins confused
+ tween(cursor, {
+ rotation: Math.PI * 2
+ }, {
+ duration: 800,
+ easing: tween.easeInOut
+ });
+ }
+ });
+ }
+ });
+ }, 600);
+ // Transition out
+ LK.setTimeout(function () {
+ tween(frameContainer, {
+ alpha: 0,
+ scaleX: 1.5,
+ scaleY: 1.5
+ }, {
+ duration: 600,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ transitionContainer.visible = false;
+ transitionContainer.removeChildren();
+ startLevel(nextLevel);
+ }
+ });
+ }, 4000);
+ }
+ });
+}
+// Cinematic intro for Level 5 - Roaming Balls
+function showLevel5Intro(nextLevel) {
+ // Clear transition container
+ transitionContainer.removeChildren();
+ transitionContainer.x = 1024;
+ transitionContainer.y = 1366;
+ transitionContainer.scaleX = 1;
+ transitionContainer.scaleY = 1;
+ transitionContainer.alpha = 1;
+ // Create epic cinematic frame
+ var frameContainer = new Container();
+ frameContainer.rotation = 0;
+ transitionContainer.addChild(frameContainer);
+ // Create multi-layered frame for chaos effect
+ var chaosFrame1 = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 16,
+ scaleY: 12,
+ tint: 0xFF0000
+ });
+ chaosFrame1.alpha = 0.2;
+ var chaosFrame2 = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 15,
+ scaleY: 11,
+ tint: 0xFFD700
+ });
+ chaosFrame2.alpha = 0.2;
+ chaosFrame2.rotation = 0.05;
+ var outerFrame = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 14,
+ scaleY: 10,
+ tint: 0xFF00FF
+ });
+ outerFrame.alpha = 0.4;
+ // Create inner frame
+ var innerFrame = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 13,
+ scaleY: 9,
+ tint: 0x000000
+ });
+ innerFrame.alpha = 0.95;
+ // Add chaos particles around frame
+ var chaosParticles = [];
+ for (var i = 0; i < 12; i++) {
+ var particle = frameContainer.attachAsset('smallPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1,
+ scaleY: 1,
+ tint: Math.random() < 0.5 ? 0xFF0000 : 0xFFD700
+ });
+ var angle = i / 12 * Math.PI * 2;
+ particle.x = Math.cos(angle) * 600;
+ particle.y = Math.sin(angle) * 450;
+ particle.alpha = 0.6;
+ chaosParticles.push(particle);
+ }
+ // Create demo container
+ var demoContainer = new Container();
+ demoContainer.y = 0;
+ frameContainer.addChild(demoContainer);
+ // Epic title with multiple layers
+ var titleBg = new Text2('LEVEL 5', {
+ size: 220,
+ fill: 0x000000,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ titleBg.anchor.set(0.5, 0.5);
+ titleBg.y = -350;
+ titleBg.x = 5;
+ titleBg.alpha = 0.5;
+ demoContainer.addChild(titleBg);
+ var titleGlow = new Text2('LEVEL 5', {
+ size: 200,
+ fill: 0xFF00FF,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ titleGlow.anchor.set(0.5, 0.5);
+ titleGlow.y = -350;
+ titleGlow.alpha = 0.4;
+ demoContainer.addChild(titleGlow);
+ var title = new Text2('LEVEL 5', {
+ size: 180,
+ fill: 0xFFD700,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ title.anchor.set(0.5, 0.5);
+ title.y = -350;
+ demoContainer.addChild(title);
+ // Subtitle with warning style
+ var subtitle = new Text2('CHAOS MODE!', {
+ size: 100,
+ fill: 0xFF0000
+ });
+ subtitle.anchor.set(0.5, 0.5);
+ subtitle.y = -230;
+ subtitle.alpha = 0;
+ demoContainer.addChild(subtitle);
+ // Create chaos arena
+ var arenaGlow = demoContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 11,
+ scaleY: 7,
+ tint: 0xFF00FF
+ });
+ arenaGlow.y = 100;
+ arenaGlow.alpha = 0.1;
+ var arena = demoContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 10,
+ scaleY: 6,
+ tint: 0x0a0a0a
+ });
+ arena.y = 100;
+ arena.alpha = 0.8;
+ // Create roaming balls with different sizes and colors
+ var roamingBalls = [];
+ for (var i = 0; i < 8; i++) {
+ var ball = new Container();
+ // Random ball type
+ var ballColor = i < 3 ? 0xFFD700 : i < 6 ? 0xFF0000 : 0x00FF00;
+ var ballSize = 0.8 + Math.random() * 0.6;
+ // Add trail effect
+ var trail = ball.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: ballSize * 1.5,
+ scaleY: ballSize * 1.5,
+ tint: ballColor
+ });
+ trail.alpha = 0.2;
+ var ballGfx = ball.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: ballSize,
+ scaleY: ballSize,
+ tint: ballColor
+ });
+ ball.x = -400 + Math.random() * 800;
+ ball.y = -200 + Math.random() * 400;
+ ball.vx = (Math.random() - 0.5) * 12;
+ ball.vy = (Math.random() - 0.5) * 12;
+ ball.scaleX = 0;
+ ball.scaleY = 0;
+ roamingBalls.push(ball);
+ demoContainer.addChild(ball);
+ }
+ // Animate frame entrance with rotation
+ frameContainer.scaleX = 0.1;
+ frameContainer.scaleY = 0.1;
+ frameContainer.rotation = Math.PI * 2;
+ tween(frameContainer, {
+ scaleX: 1,
+ scaleY: 1,
+ rotation: 0
+ }, {
+ duration: 800,
+ easing: tween.easeOut
+ });
+ // Animate chaos particles
+ for (var i = 0; i < chaosParticles.length; i++) {
+ (function (particle, index) {
+ tween(particle, {
+ x: particle.x * 0.8,
+ y: particle.y * 0.8,
+ rotation: Math.PI * 4
+ }, {
+ duration: 2000 + index * 100,
+ easing: tween.linear,
+ loop: true
+ });
+ })(chaosParticles[i], i);
+ }
+ // Animate intro
+ LK.setTimeout(function () {
+ // Title shake effect
+ var shakeTimer = LK.setInterval(function () {
+ title.x = -5 + Math.random() * 10;
+ title.y = -350 + (-5 + Math.random() * 10);
+ titleGlow.x = title.x;
+ titleGlow.y = title.y;
+ }, 50);
+ tween(title, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 500,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ LK.clearInterval(shakeTimer);
+ title.x = 0;
+ title.y = -350;
+ titleGlow.x = 0;
+ titleGlow.y = -350;
+ tween(subtitle, {
+ alpha: 1,
+ y: -230
+ }, {
+ duration: 400,
+ easing: tween.easeOut
+ });
+ // Flash effect
+ var flash = demoContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 20,
+ scaleY: 15,
+ tint: 0xFFFFFF
+ });
+ flash.alpha = 0.6;
+ tween(flash, {
+ alpha: 0
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ flash.destroy();
+ }
+ });
+ // Spawn balls with explosion effect
+ for (var i = 0; i < roamingBalls.length; i++) {
+ (function (ball, delay) {
+ LK.setTimeout(function () {
+ tween(ball, {
+ scaleX: 1.5,
+ scaleY: 1.5
+ }, {
+ duration: 200,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(ball, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200,
+ easing: tween.easeIn
+ });
+ }
+ });
+ }, delay);
+ })(roamingBalls[i], i * 50);
+ }
+ // Animate chaotic movement
+ var chaosTimer = LK.setInterval(function () {
+ for (var i = 0; i < roamingBalls.length; i++) {
+ var ball = roamingBalls[i];
+ ball.x += ball.vx;
+ ball.y += ball.vy;
+ ball.rotation += 0.2;
+ // Bounce off walls with effects
+ if (Math.abs(ball.x) > 450) {
+ ball.vx = -ball.vx * 1.2;
+ // Create bounce effect
+ var bounce = demoContainer.addChild(new Container());
+ bounce.x = ball.x > 0 ? 450 : -450;
+ bounce.y = ball.y;
+ var bounceGfx = bounce.attachAsset('smallPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: 0xFFFFFF
+ });
+ tween(bounceGfx, {
+ scaleX: 3,
+ scaleY: 3,
+ alpha: 0
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ bounce.destroy();
+ }
+ });
+ }
+ if (Math.abs(ball.y) > 250) {
+ ball.vy = -ball.vy * 1.2;
+ }
+ // Random direction changes
+ if (Math.random() < 0.08) {
+ ball.vx = (Math.random() - 0.5) * 15;
+ ball.vy = (Math.random() - 0.5) * 15;
+ }
+ }
+ }, 16);
+ // Add warning text with flashing
+ LK.setTimeout(function () {
+ var warning = new Text2('MAXIMUM DIFFICULTY!', {
+ size: 70,
+ fill: 0xFF0000
+ });
+ warning.anchor.set(0.5, 0.5);
+ warning.y = 350;
+ warning.alpha = 0;
+ demoContainer.addChild(warning);
+ tween(warning, {
+ alpha: 1,
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ yoyo: true,
+ repeat: 4
+ });
+ }, 1500);
+ // Transition out
+ LK.setTimeout(function () {
+ LK.clearInterval(chaosTimer);
+ // Epic exit
+ tween(frameContainer, {
+ alpha: 0,
+ scaleX: 2,
+ scaleY: 2,
+ rotation: -0.2
+ }, {
+ duration: 600,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ transitionContainer.visible = false;
+ transitionContainer.removeChildren();
+ startLevel(nextLevel);
+ }
+ });
+ }, 4500);
+ }
+ });
+ }, 800);
+}
+// Cinematic intro for Level 6 - Orbital Mastery
+function showLevel6Intro(nextLevel) {
+ // Clear transition container
+ transitionContainer.removeChildren();
+ transitionContainer.x = 1024;
+ transitionContainer.y = 1366;
+ transitionContainer.scaleX = 1;
+ transitionContainer.scaleY = 1;
+ transitionContainer.alpha = 1;
+ // Create cosmic frame
+ var frameContainer = new Container();
+ frameContainer.alpha = 0;
+ transitionContainer.addChild(frameContainer);
+ // Create orbital rings background
+ var orbitRings = [];
+ for (var i = 0; i < 3; i++) {
+ var ring = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 6 + i * 3,
+ scaleY: 6 + i * 3,
+ tint: 0x1a5d61
+ });
+ ring.alpha = 0.1 - i * 0.03;
+ orbitRings.push(ring);
+ }
+ // Create frame
+ var outerFrame = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 14,
+ scaleY: 10,
+ tint: 0x00FFFF
+ });
+ outerFrame.alpha = 0.4;
+ var innerFrame = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 13,
+ scaleY: 9,
+ tint: 0x000000
+ });
+ innerFrame.alpha = 0.95;
+ // Create demo container
+ var demoContainer = new Container();
+ frameContainer.addChild(demoContainer);
+ // Title
+ var title = new Text2('LEVEL 6', {
+ size: 180,
+ fill: 0x00FFFF,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ title.anchor.set(0.5, 0.5);
+ title.y = -350;
+ demoContainer.addChild(title);
+ // Subtitle
+ var subtitle = new Text2('ORBITAL MASTERY', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ subtitle.anchor.set(0.5, 0.5);
+ subtitle.y = -250;
+ subtitle.alpha = 0;
+ demoContainer.addChild(subtitle);
+ // Create orbital center
+ var centerOrb = demoContainer.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 2,
+ scaleY: 2,
+ tint: 0xFFD700
+ });
+ centerOrb.y = 100;
+ // Create orbiting demo balls
+ var orbitingBalls = [];
+ for (var i = 0; i < 6; i++) {
+ var ball = new Container();
+ var ballGfx = ball.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: 0x00FFFF
+ });
+ ball.angle = i / 6 * Math.PI * 2;
+ ball.radius = 200;
+ ball.speed = 0.02;
+ ball.scaleX = 0;
+ ball.scaleY = 0;
+ orbitingBalls.push(ball);
+ demoContainer.addChild(ball);
+ }
+ // Animate entrance
+ tween(frameContainer, {
+ alpha: 1
+ }, {
+ duration: 500,
+ easing: tween.easeOut
+ });
+ // Rotate orbital rings
+ for (var i = 0; i < orbitRings.length; i++) {
+ (function (ring, index) {
+ tween(ring, {
+ rotation: Math.PI * 2
+ }, {
+ duration: 10000 + index * 2000,
+ easing: tween.linear,
+ loop: true
+ });
+ })(orbitRings[i], i);
+ }
+ // Animate title
+ tween(title, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 500,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(subtitle, {
+ alpha: 1
+ }, {
+ duration: 400,
+ easing: tween.easeOut
+ });
+ // Show orbiting balls
+ for (var i = 0; i < orbitingBalls.length; i++) {
+ (function (ball, delay) {
+ LK.setTimeout(function () {
+ tween(ball, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 300,
+ easing: tween.bounceOut
+ });
+ }, delay);
+ })(orbitingBalls[i], i * 100);
+ }
+ // Animate orbital motion
+ var orbitTimer = LK.setInterval(function () {
+ for (var i = 0; i < orbitingBalls.length; i++) {
+ var ball = orbitingBalls[i];
+ ball.angle += ball.speed;
+ ball.x = Math.cos(ball.angle) * ball.radius;
+ ball.y = 100 + Math.sin(ball.angle) * ball.radius;
+ }
+ }, 16);
+ // Create orbital paths
+ LK.setTimeout(function () {
+ for (var i = 0; i < 3; i++) {
+ var path = demoContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 4 + i * 1.5,
+ scaleY: 4 + i * 1.5,
+ tint: 0x00FFFF
+ });
+ path.y = 100;
+ path.alpha = 0;
+ tween(path, {
+ alpha: 0.2,
+ scaleX: path.scaleX * 1.2,
+ scaleY: path.scaleY * 1.2
+ }, {
+ duration: 800,
+ easing: tween.easeOut
+ });
+ }
+ }, 1000);
+ // Transition out
+ LK.setTimeout(function () {
+ LK.clearInterval(orbitTimer);
+ tween(frameContainer, {
+ alpha: 0,
+ scaleX: 0.5,
+ scaleY: 0.5,
+ rotation: Math.PI / 4
+ }, {
+ duration: 600,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ transitionContainer.visible = false;
+ transitionContainer.removeChildren();
+ startLevel(nextLevel);
+ }
+ });
+ }, 4000);
+ }
+ });
+}
+// Cinematic intro for Level 7 - Fugitives & Lasso
+function showLevel7Intro(nextLevel) {
+ // Clear transition container
+ transitionContainer.removeChildren();
+ transitionContainer.x = 1024;
+ transitionContainer.y = 1366;
+ transitionContainer.scaleX = 1;
+ transitionContainer.scaleY = 1;
+ transitionContainer.alpha = 1;
+ // Create western-themed frame
+ var frameContainer = new Container();
+ frameContainer.scaleX = 0;
+ frameContainer.scaleY = 0;
+ transitionContainer.addChild(frameContainer);
+ // Create frame
+ var outerFrame = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 14,
+ scaleY: 10,
+ tint: 0x8B4513
+ });
+ outerFrame.alpha = 0.4;
+ var innerFrame = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 13,
+ scaleY: 9,
+ tint: 0x000000
+ });
+ innerFrame.alpha = 0.95;
+ // Create demo container
+ var demoContainer = new Container();
+ frameContainer.addChild(demoContainer);
+ // Title
+ var title = new Text2('LEVEL 7', {
+ size: 180,
+ fill: 0xFFD700,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ title.anchor.set(0.5, 0.5);
+ title.y = -350;
+ demoContainer.addChild(title);
+ // Subtitle
+ var subtitle = new Text2('FUGITIVES & LASSO', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ subtitle.anchor.set(0.5, 0.5);
+ subtitle.y = -250;
+ subtitle.alpha = 0;
+ demoContainer.addChild(subtitle);
+ // Create fleeing balls
+ var fugitives = [];
+ for (var i = 0; i < 5; i++) {
+ var fugitive = new Container();
+ var ballGfx = fugitive.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: 0xFFD700
+ });
+ fugitive.x = -300 + i * 150;
+ fugitive.y = 0;
+ fugitive.scaleX = 0;
+ fugitive.scaleY = 0;
+ fugitives.push(fugitive);
+ demoContainer.addChild(fugitive);
+ }
+ // Create shepherd ball (lasso)
+ var shepherdDemo = new Container();
+ var shepherdGlow = shepherdDemo.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 3,
+ scaleY: 3,
+ tint: 0x00FFFF
+ });
+ shepherdGlow.alpha = 0.3;
+ var shepherdCore = shepherdDemo.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.5,
+ scaleY: 1.5,
+ tint: 0x00FFFF
+ });
+ shepherdDemo.y = 200;
+ shepherdDemo.scaleX = 0;
+ shepherdDemo.scaleY = 0;
+ demoContainer.addChild(shepherdDemo);
+ // Animate entrance
+ tween(frameContainer, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 600,
+ easing: tween.bounceOut
+ });
+ // Animate title
+ LK.setTimeout(function () {
+ tween(subtitle, {
+ alpha: 1
+ }, {
+ duration: 400,
+ easing: tween.easeOut
+ });
+ // Show fugitives
+ for (var i = 0; i < fugitives.length; i++) {
+ (function (fugitive, delay) {
+ LK.setTimeout(function () {
+ tween(fugitive, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 300,
+ easing: tween.bounceOut
+ });
+ }, delay);
+ })(fugitives[i], i * 100);
+ }
+ // Show shepherd ball
+ LK.setTimeout(function () {
+ tween(shepherdDemo, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 500,
+ easing: tween.bounceOut,
+ onFinish: function onFinish() {
+ tween(shepherdDemo, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 300,
+ easing: tween.easeInOut
+ });
+ // Demonstrate lasso effect
+ LK.setTimeout(function () {
+ // Create lasso ring
+ var lassoRing = demoContainer.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.1,
+ scaleY: 0.1,
+ tint: 0x00FFFF
+ });
+ lassoRing.y = 200;
+ lassoRing.alpha = 0.8;
+ tween(lassoRing, {
+ scaleX: 6,
+ scaleY: 6,
+ alpha: 0.2
+ }, {
+ duration: 600,
+ easing: tween.easeOut
+ });
+ // Collect fugitives
+ for (var i = 0; i < fugitives.length; i++) {
+ (function (fugitive) {
+ tween(fugitive, {
+ x: 0,
+ y: 200,
+ scaleX: 0,
+ scaleY: 0,
+ rotation: Math.PI * 2
+ }, {
+ duration: 500,
+ easing: tween.easeIn
+ });
+ })(fugitives[i]);
+ }
+ // Show bonus text
+ var bonusText = new Text2('LASSO BONUS!', {
+ size: 100,
+ fill: 0x00FFFF,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ bonusText.anchor.set(0.5, 0.5);
+ bonusText.y = 350;
+ bonusText.alpha = 0;
+ demoContainer.addChild(bonusText);
+ tween(bonusText, {
+ alpha: 1,
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 400,
+ easing: tween.easeOut,
+ yoyo: true
+ });
+ }, 1000);
+ }
+ });
+ }, 800);
+ // Transition out
+ LK.setTimeout(function () {
+ tween(frameContainer, {
+ alpha: 0,
+ x: -800
+ }, {
+ duration: 600,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ transitionContainer.visible = false;
+ transitionContainer.removeChildren();
+ startLevel(nextLevel);
+ }
+ });
+ }, 4500);
+ }, 500);
+}
+// Cinematic intro for Level 8 - Phantom Echoes
+function showLevel8Intro(nextLevel) {
+ // Clear transition container
+ transitionContainer.removeChildren();
+ transitionContainer.x = 1024;
+ transitionContainer.y = 1366;
+ transitionContainer.scaleX = 1;
+ transitionContainer.scaleY = 1;
+ transitionContainer.alpha = 1;
+ // Create glitchy frame
+ var frameContainer = new Container();
+ frameContainer.alpha = 1;
+ transitionContainer.addChild(frameContainer);
+ // Create glitch layers
+ for (var i = 0; i < 3; i++) {
+ var glitchLayer = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 14,
+ scaleY: 10,
+ tint: i === 0 ? 0xFF0000 : i === 1 ? 0x00FF00 : 0x0000FF
+ });
+ glitchLayer.alpha = 0.1;
+ glitchLayer.x = (Math.random() - 0.5) * 10;
+ glitchLayer.y = (Math.random() - 0.5) * 10;
+ }
+ // Main frame
+ var outerFrame = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 14,
+ scaleY: 10,
+ tint: 0x800080
+ });
+ outerFrame.alpha = 0.4;
+ var innerFrame = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 13,
+ scaleY: 9,
+ tint: 0x000000
+ });
+ innerFrame.alpha = 0.95;
+ // Create demo container
+ var demoContainer = new Container();
+ frameContainer.addChild(demoContainer);
+ // Title with glitch effect
+ var title = new Text2('LEVEL 8', {
+ size: 180,
+ fill: 0x800080,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ title.anchor.set(0.5, 0.5);
+ title.y = -350;
+ demoContainer.addChild(title);
+ // Subtitle
+ var subtitle = new Text2('PHANTOM ECHOES', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ subtitle.anchor.set(0.5, 0.5);
+ subtitle.y = -250;
+ subtitle.alpha = 0;
+ demoContainer.addChild(subtitle);
+ // Create phasing balls
+ var phantomBalls = [];
+ for (var i = 0; i < 4; i++) {
+ var phantom = new Container();
+ var ballGfx = phantom.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: 0xFFD700
+ });
+ phantom.x = -400 + i * 267;
+ phantom.y = 0;
+ phantom.scaleX = 1;
+ phantom.scaleY = 1;
+ phantom.alpha = 1;
+ phantomBalls.push(phantom);
+ demoContainer.addChild(phantom);
+ }
+ // Create negative/decoy balls
+ var negativeBalls = [];
+ for (var i = 0; i < 2; i++) {
+ var negative = new Container();
+ var negGfx = negative.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: 0xFF4444
+ });
+ var dangerAura = negative.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.5,
+ scaleY: 1.5,
+ tint: 0xFF0000
+ });
+ dangerAura.alpha = 0.3;
+ negative.x = -200 + i * 400;
+ negative.y = 200;
+ negative.scaleX = 0;
+ negative.scaleY = 0;
+ negativeBalls.push(negative);
+ demoContainer.addChild(negative);
+ }
+ // Glitch animation for title
+ var glitchTimer = LK.setInterval(function () {
+ if (Math.random() < 0.3) {
+ title.x = (Math.random() - 0.5) * 5;
+ title.y = -350 + (Math.random() - 0.5) * 5;
+ LK.setTimeout(function () {
+ title.x = 0;
+ title.y = -350;
+ }, 50);
+ }
+ }, 100);
+ // Animate subtitle
+ LK.setTimeout(function () {
+ tween(subtitle, {
+ alpha: 1
+ }, {
+ duration: 400,
+ easing: tween.easeOut
+ });
+ // Phase animation for phantom balls
+ var phaseTimer = LK.setInterval(function () {
+ for (var i = 0; i < phantomBalls.length; i++) {
+ (function (ball, index) {
+ if (Math.random() < 0.5) {
+ tween(ball, {
+ alpha: ball.alpha > 0.5 ? 0.1 : 1
+ }, {
+ duration: 300,
+ easing: tween.easeInOut
+ });
+ }
+ })(phantomBalls[i], i);
+ }
+ }, 800);
+ // Show negative balls
+ for (var i = 0; i < negativeBalls.length; i++) {
+ (function (ball, delay) {
+ LK.setTimeout(function () {
+ tween(ball, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 300,
+ easing: tween.bounceOut
+ });
+ }, delay);
+ })(negativeBalls[i], 1000 + i * 200);
+ }
+ // Warning effect
+ LK.setTimeout(function () {
+ var warning = new Text2('AVOID RED BALLS!', {
+ size: 70,
+ fill: 0xFF0000,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ warning.anchor.set(0.5, 0.5);
+ warning.y = 350;
+ warning.alpha = 0;
+ demoContainer.addChild(warning);
+ tween(warning, {
+ alpha: 1
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ yoyo: true,
+ repeat: 3
+ });
+ }, 2000);
+ // Transition out
+ LK.setTimeout(function () {
+ LK.clearInterval(glitchTimer);
+ LK.clearInterval(phaseTimer);
+ // Glitch out effect
+ for (var i = 0; i < 5; i++) {
+ (function (delay) {
+ LK.setTimeout(function () {
+ frameContainer.x = (Math.random() - 0.5) * 20;
+ frameContainer.y = (Math.random() - 0.5) * 20;
+ frameContainer.alpha = Math.random();
+ }, delay);
+ })(i * 100);
+ }
+ LK.setTimeout(function () {
+ transitionContainer.visible = false;
+ transitionContainer.removeChildren();
+ startLevel(nextLevel);
+ }, 600);
+ }, 4000);
+ }, 500);
+}
+// Cinematic intro for Level 9 - Chromatic Chaos
+function showLevel9Intro(nextLevel) {
+ // Clear transition container
+ transitionContainer.removeChildren();
+ transitionContainer.x = 1024;
+ transitionContainer.y = 1366;
+ transitionContainer.scaleX = 1;
+ transitionContainer.scaleY = 1;
+ transitionContainer.alpha = 1;
+ // Create rainbow frame
+ var frameContainer = new Container();
+ frameContainer.alpha = 0;
+ transitionContainer.addChild(frameContainer);
+ // Create rainbow background layers
+ var colors = [0xFF0000, 0xFF7F00, 0xFFFF00, 0x00FF00, 0x0000FF, 0x4B0082, 0x9400D3];
+ for (var i = 0; i < colors.length; i++) {
+ var colorLayer = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 14 - i * 0.5,
+ scaleY: 10 - i * 0.3,
+ tint: colors[i]
+ });
+ colorLayer.alpha = 0.1;
+ colorLayer.rotation = i * 0.05;
+ }
+ // Main frame
+ var innerFrame = frameContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 11,
+ scaleY: 8,
+ tint: 0x000000
+ });
+ innerFrame.alpha = 0.9;
+ // Create demo container
+ var demoContainer = new Container();
+ frameContainer.addChild(demoContainer);
+ // Title with rainbow effect
+ var title = new Text2('LEVEL 9', {
+ size: 180,
+ fill: 0xFFD700,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ title.anchor.set(0.5, 0.5);
+ title.y = -350;
+ demoContainer.addChild(title);
+ // Subtitle
+ var subtitle = new Text2('CHROMATIC CHAOS', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ subtitle.anchor.set(0.5, 0.5);
+ subtitle.y = -250;
+ subtitle.alpha = 0;
+ demoContainer.addChild(subtitle);
+ // Create color target indicator
+ var targetIndicator = demoContainer.attachAsset('bigPixel', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 3,
+ scaleY: 1,
+ tint: 0xFFD700
+ });
+ targetIndicator.y = -150;
+ var targetText = new Text2('TARGET COLOR', {
+ size: 40,
+ fill: 0xFFFFFF
+ });
+ targetText.anchor.set(0.5, 0.5);
+ targetText.y = -150;
+ demoContainer.addChild(targetText);
+ // Create chameleon balls
+ var chameleonBalls = [];
+ var ballColors = [0xFFD700, 0xFF4444, 0x44FF44];
+ for (var i = 0; i < 6; i++) {
+ var chameleon = new Container();
+ var ballGfx = chameleon.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: ballColors[i % 3]
+ });
+ chameleon.x = -400 + i % 3 * 400;
+ chameleon.y = 50 + Math.floor(i / 3) * 150;
+ chameleon.colorIndex = i % 3;
+ chameleon.scaleX = 0;
+ chameleon.scaleY = 0;
+ chameleonBalls.push(chameleon);
+ demoContainer.addChild(chameleon);
+ }
+ // Animate entrance
+ tween(frameContainer, {
+ alpha: 1
+ }, {
+ duration: 500,
+ easing: tween.easeOut
+ });
+ // Rainbow animation for title
+ var titleColorIndex = 0;
+ var titleColorTimer = LK.setInterval(function () {
+ titleColorIndex = (titleColorIndex + 1) % colors.length;
+ tween(title, {
+ tint: colors[titleColorIndex]
+ }, {
+ duration: 300,
+ easing: tween.easeInOut
+ });
+ }, 400);
+ // Animate elements
+ LK.setTimeout(function () {
+ tween(subtitle, {
+ alpha: 1
+ }, {
+ duration: 400,
+ easing: tween.easeOut
+ });
+ // Show chameleon balls
+ for (var i = 0; i < chameleonBalls.length; i++) {
+ (function (ball, delay) {
+ LK.setTimeout(function () {
+ tween(ball, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 300,
+ easing: tween.bounceOut
+ });
+ }, delay);
+ })(chameleonBalls[i], i * 100);
+ }
+ // Demonstrate color changing
+ var colorChangeTimer = LK.setInterval(function () {
+ // Change target color
+ var targetColorIndex = Math.floor(Math.random() * 3);
+ tween(targetIndicator, {
+ tint: ballColors[targetColorIndex]
+ }, {
+ duration: 300,
+ easing: tween.easeInOut
+ });
+ // Flash matching balls
+ for (var i = 0; i < chameleonBalls.length; i++) {
+ var ball = chameleonBalls[i];
+ if (ball.colorIndex === targetColorIndex) {
+ tween(ball, {
+ scaleX: 1.3,
+ scaleY: 1.3
+ }, {
+ duration: 200,
+ easing: tween.easeOut,
+ yoyo: true
+ });
+ }
+ }
+ // Change some ball colors randomly
+ for (var i = 0; i < chameleonBalls.length; i++) {
+ if (Math.random() < 0.3) {
+ var ball = chameleonBalls[i];
+ ball.colorIndex = Math.floor(Math.random() * 3);
+ tween(ball.children[0], {
+ tint: ballColors[ball.colorIndex]
+ }, {
+ duration: 500,
+ easing: tween.easeInOut
+ });
+ }
+ }
+ }, 1500);
+ // Warning text
+ LK.setTimeout(function () {
+ var warning = new Text2('MATCH THE COLOR!', {
+ size: 70,
+ fill: 0xFFD700,
+ font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
+ });
+ warning.anchor.set(0.5, 0.5);
+ warning.y = 350;
+ warning.alpha = 0;
+ demoContainer.addChild(warning);
+ tween(warning, {
+ alpha: 1,
+ scaleX: 1.1,
+ scaleY: 1.1
+ }, {
+ duration: 400,
+ easing: tween.easeOut,
+ yoyo: true,
+ repeat: 2
+ });
+ }, 2500);
+ // Transition out
+ LK.setTimeout(function () {
+ LK.clearInterval(titleColorTimer);
+ LK.clearInterval(colorChangeTimer);
+ // Epic exit with color explosion
+ for (var i = 0; i < 10; i++) {
+ (function (index) {
+ var explosion = frameContainer.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.1,
+ scaleY: 0.1,
+ tint: colors[index % colors.length]
+ });
+ explosion.x = (Math.random() - 0.5) * 800;
+ explosion.y = (Math.random() - 0.5) * 600;
+ tween(explosion, {
+ scaleX: 5,
+ scaleY: 5,
+ alpha: 0
+ }, {
+ duration: 800,
+ delay: index * 50,
+ easing: tween.easeOut
+ });
+ })(i);
+ }
+ tween(frameContainer, {
+ alpha: 0,
+ scaleX: 1.5,
+ scaleY: 1.5
+ }, {
+ duration: 800,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ transitionContainer.visible = false;
+ transitionContainer.removeChildren();
+ startLevel(nextLevel);
+ }
+ });
+ }, 5000);
+ }, 500);
+}
+// Helper function to convert HSL to hex
+function hslToHex(h, s, l) {
+ l /= 100;
+ var a = s * Math.min(l, 1 - l) / 100;
+ var f = function f(n) {
+ var k = (n + h / 30) % 12;
+ var color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);
+ return Math.round(255 * color).toString(16).padStart(2, '0');
+ };
+ return parseInt('0x' + f(0) + f(8) + f(4));
+}
\ No newline at end of file