/**** * 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); } // Special case for level 21: add 20 seconds bonus time if (level === 21) { levelTimeLimit += 20; } // 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