User prompt
Create a special space where we can fill our souls
User prompt
Create a beautiful background.
User prompt
Enemies only come from above
User prompt
Please fix the bug: 'TypeError: taskTexts[i].setColor is not a function' in or related to this line: 'taskTexts[i].setColor(color);' Line Number: 334
User prompt
Put the character's health bar under
User prompt
give us some tasks and show these tasks on top
User prompt
Reduces enemies' health and range
Code edit (1 edits merged)
Please save this source code
User prompt
Top Cop: Police Pursuit
Initial prompt
make a gun game and um top top camera and then uh and then and then uh sound effects and uh police and uh and
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Background = Container.expand(function () { var self = Container.call(this); // Create sky gradient var skyGradient = new Container(); // Create several bands of sky color var skyColors = [0x1a3c80, 0x3a5c9f, 0x5a7cbf, 0x7a9cdf, 0x9abcff]; var bandHeight = 2732 / skyColors.length; for (var i = 0; i < skyColors.length; i++) { var skyBand = LK.getAsset('skyBand' + i, { width: 2048, height: bandHeight, color: skyColors[i], shape: 'box', y: i * bandHeight }); skyGradient.addChild(skyBand); } self.addChild(skyGradient); // Create buildings var buildings = new Container(); self.addChild(buildings); // Far buildings (darker) var buildingColors = [0x222a40, 0x323a50, 0x424a60]; var buildingCount = 15; for (var i = 0; i < buildingCount; i++) { var buildingWidth = 100 + Math.random() * 150; var buildingHeight = 300 + Math.random() * 400; var building = LK.getAsset('building_far_' + i, { width: buildingWidth, height: buildingHeight, color: buildingColors[Math.floor(Math.random() * buildingColors.length)], shape: 'box', x: i * (2048 / buildingCount), y: 2732 - buildingHeight, anchorY: 0 }); buildings.addChild(building); } // Near buildings (slightly lighter) var nearBuildingColors = [0x303a50, 0x404a60, 0x505a70]; var nearBuildingCount = 10; for (var i = 0; i < nearBuildingCount; i++) { var buildingWidth = 180 + Math.random() * 150; var buildingHeight = 500 + Math.random() * 600; var building = LK.getAsset('building_near_' + i, { width: buildingWidth, height: buildingHeight, color: nearBuildingColors[Math.floor(Math.random() * nearBuildingColors.length)], shape: 'box', x: i * (2048 / nearBuildingCount), y: 2732 - buildingHeight, anchorY: 0 }); buildings.addChild(building); } // Add some windows to buildings (as small yellow rectangles) for (var b = 0; b < buildings.children.length; b++) { var building = buildings.children[b]; var windowCount = Math.floor(building.width / 30) * Math.floor(building.height / 40); // Limit window count for performance windowCount = Math.min(windowCount, 20); for (var w = 0; w < windowCount; w++) { var windowSize = 10 + Math.random() * 10; var windowX = Math.random() * (building.width - windowSize); var windowY = Math.random() * (building.height - windowSize); // Only add some windows (randomized lighting effect) if (Math.random() > 0.4) { var windowLight = LK.getAsset('window_' + b + '_' + w, { width: windowSize, height: windowSize, color: Math.random() > 0.7 ? 0xffcc66 : 0x888888, // Some windows lit, some not shape: 'box', x: building.x + windowX, y: building.y + windowY }); self.addChild(windowLight); } } } // Add clouds var clouds = new Container(); self.clouds = clouds; self.addChild(clouds); var cloudCount = 6; for (var i = 0; i < cloudCount; i++) { var cloudWidth = 200 + Math.random() * 300; var cloudHeight = 100 + Math.random() * 100; var cloud = LK.getAsset('cloud_' + i, { width: cloudWidth, height: cloudHeight, color: 0xddddff, shape: 'ellipse', x: Math.random() * 2048, y: 200 + Math.random() * 400, alpha: 0.7 }); // Add some variation to clouds with slight scaling cloud.scaleX = 0.8 + Math.random() * 0.4; cloud.scaleY = 0.8 + Math.random() * 0.4; // Store cloud speed for animation cloud.speedX = 0.2 + Math.random() * 0.3; clouds.addChild(cloud); } // Update function to animate clouds self.update = function () { // Move clouds horizontally for (var i = 0; i < clouds.children.length; i++) { var cloud = clouds.children[i]; cloud.x += cloud.speedX; // Loop clouds when they move off screen if (cloud.x > 2048 + cloud.width) { cloud.x = -cloud.width; cloud.y = 200 + Math.random() * 400; } } }; return self; }); var BreathingCircle = Container.expand(function () { var self = Container.call(this); // Create the breathing circle var innerCircle = self.attachAsset('centerCircle', { width: 200, height: 200, color: 0x3a5c9f, anchorX: 0.5, anchorY: 0.5, alpha: 0.4 }); var outerCircle = LK.getAsset('centerCircle', { width: 240, height: 240, color: 0x5a7cbf, anchorX: 0.5, anchorY: 0.5, alpha: 0.2 }); self.addChild(outerCircle); // Breathing animation state self.breathPhase = 0; // 0: inhale growing, 1: hold, 2: exhale shrinking, 3: hold self.breathTimer = 0; self.inhaleDuration = 240; // 4 seconds self.holdDuration = 120; // 2 seconds self.exhaleDuration = 240; // 4 seconds self.restDuration = 60; // 1 second // Text guide for breathing self.breathText = new Text2("Breathe In", { size: 40, fill: 0xffffff }); self.breathText.anchor.set(0.5, 0.5); self.breathText.y = -160; self.addChild(self.breathText); // Update method to animate the breathing circle self.update = function () { self.breathTimer++; // Determine current phase based on timer if (self.breathPhase === 0) { // Inhale var progress = self.breathTimer / self.inhaleDuration; var scale = 1 + progress * 0.5; innerCircle.scale.x = innerCircle.scale.y = scale; outerCircle.scale.x = outerCircle.scale.y = 0.9 + progress * 0.5; self.breathText.setText("Breathe In"); if (self.breathTimer >= self.inhaleDuration) { self.breathPhase = 1; self.breathTimer = 0; } } else if (self.breathPhase === 1) { // Hold after inhale self.breathText.setText("Hold"); if (self.breathTimer >= self.holdDuration) { self.breathPhase = 2; self.breathTimer = 0; } } else if (self.breathPhase === 2) { // Exhale var progress = self.breathTimer / self.exhaleDuration; var scale = 1.5 - progress * 0.5; innerCircle.scale.x = innerCircle.scale.y = scale; outerCircle.scale.x = outerCircle.scale.y = 1.4 - progress * 0.5; self.breathText.setText("Breathe Out"); if (self.breathTimer >= self.exhaleDuration) { self.breathPhase = 3; self.breathTimer = 0; } } else { // Hold after exhale self.breathText.setText("Rest"); if (self.breathTimer >= self.restDuration) { self.breathPhase = 0; self.breathTimer = 0; } } }; return self; }); var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 12; self.direction = { x: 0, y: -1 }; // Default upward self.lifespan = 120; // 2 seconds at 60fps self.age = 0; self.damage = 1; self.update = function () { self.x += self.direction.x * self.speed; self.y += self.direction.y * self.speed; self.age++; if (self.age > self.lifespan) { self.markForDeletion = true; } }; return self; }); var Criminal = Container.expand(function () { var self = Container.call(this); var criminalGraphics = self.attachAsset('criminal', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.health = 2; // Reduced from 3 self.shootCooldown = 0; self.shootDelay = 120; // Frames between shots self.attackRange = 300; // Reduced from 500 self.movePattern = Math.floor(Math.random() * 3); // 0: direct, 1: zigzag, 2: circle self.moveTimer = 0; self.update = function () { // Target the player var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); // Movement based on pattern if (distance > 100) { // Keep some distance var moveX = 0; var moveY = 0; switch (self.movePattern) { case 0: // Direct moveX = dx / distance; moveY = dy / distance; break; case 1: // Zigzag self.moveTimer++; moveX = dx / distance + Math.sin(self.moveTimer * 0.1) * 0.5; moveY = dy / distance; break; case 2: // Circle self.moveTimer++; moveX = dx / distance + Math.sin(self.moveTimer * 0.05) * 0.8; moveY = dy / distance + Math.cos(self.moveTimer * 0.05) * 0.8; break; } self.x += moveX * self.speed; self.y += moveY * self.speed; } // Shooting logic if (distance < self.attackRange) { if (self.shootCooldown <= 0) { // Create enemy bullet var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; // Calculate direction toward player var dirX = dx / distance; var dirY = dy / distance; bullet.direction = { x: dirX, y: dirY }; // Mark as enemy bullet bullet.isEnemyBullet = true; // Add to game's bullets array bullets.push(bullet); game.addChild(bullet); // Reset cooldown with some randomness self.shootCooldown = self.shootDelay + Math.random() * 60; } } if (self.shootCooldown > 0) { self.shootCooldown--; } }; self.takeDamage = function () { self.health--; LK.effects.flashObject(self, 0xFF0000, 300); if (self.health <= 0) { LK.getSound('criminal_down').play(); LK.setScore(LK.getScore() + 1); self.markForDeletion = true; // Track criminal elimination task var eliminateTask = tasks.find(function (task) { return task.id === 'eliminate'; }); if (eliminateTask && !eliminateTask.completed) { eliminateTask.count++; if (eliminateTask.count >= eliminateTask.target) { eliminateTask.completed = true; LK.effects.flashObject(taskTexts[1], 0x00FF00, 1000); } updateTaskDisplay(); } } }; return self; }); var EmergencyCall = Container.expand(function () { var self = Container.call(this); var callGraphics = self.attachAsset('emergencyCall', { anchorX: 0.5, anchorY: 0.5 }); self.lifetime = 600; // 10 seconds at 60fps self.age = 0; self.flashInterval = 30; self.update = function () { self.age++; // Flash effect if (self.age % self.flashInterval === 0) { if (callGraphics.alpha === 1) { tween(callGraphics, { alpha: 0.3 }, { duration: 500 }); } else { tween(callGraphics, { alpha: 1 }, { duration: 500 }); } } // Expire after lifetime if (self.age > self.lifetime) { self.markForDeletion = true; } }; self.down = function () { // Responding to call LK.getSound('radiochatter').play(); // Spawn criminals from top of screen, using emergency call's X position spawnCriminals(self.x, 0, 2 + Math.floor(Math.random() * 3)); self.markForDeletion = true; // Increase score for responding LK.setScore(LK.getScore() + 2); // Track emergency call response task var respondTask = tasks.find(function (task) { return task.id === 'respond'; }); if (respondTask && !respondTask.completed) { respondTask.count++; if (respondTask.count >= respondTask.target) { respondTask.completed = true; LK.effects.flashObject(taskTexts[0], 0x00FF00, 1000); } updateTaskDisplay(); } }; return self; }); var MeditationGuide = Container.expand(function () { var self = Container.call(this); // Create a text display for meditation prompts self.promptText = new Text2("Breathe deeply...", { size: 60, fill: 0xffffff, align: 'center' }); self.promptText.anchor.set(0.5, 0.5); self.addChild(self.promptText); // List of meditation prompts self.prompts = ["Breathe deeply...", "Focus on your breath...", "Let go of your thoughts...", "Feel the peace within...", "You are present...", "Allow yourself to be...", "Feel the energy flow...", "Find your center..."]; self.currentPrompt = 0; self.promptTimer = 0; self.promptDuration = 300; // 5 seconds per prompt // Update method to cycle through prompts self.update = function () { self.promptTimer++; // Change prompt periodically if (self.promptTimer >= self.promptDuration) { self.currentPrompt = (self.currentPrompt + 1) % self.prompts.length; self.promptText.setText(self.prompts[self.currentPrompt]); self.promptTimer = 0; // Animate text appearance self.promptText.alpha = 0; tween(self.promptText, { alpha: 1 }, { duration: 1000 }); } // Subtle pulse animation var scale = 1 + 0.05 * Math.sin(self.promptTimer * 0.01); self.promptText.scale.x = scale; self.promptText.scale.y = scale; }; return self; }); var MeditationSpace = Container.expand(function () { var self = Container.call(this); // Create a peaceful gradient background var background = new Container(); self.addChild(background); // Create calming gradient colors for the background var skyColors = [0x081832, 0x112a4e, 0x1a3c6a, 0x234e86, 0x2c60a2]; var bandHeight = 2732 / skyColors.length; for (var i = 0; i < skyColors.length; i++) { var skyBand = LK.getAsset('skyBand' + i, { width: 2048, height: bandHeight, color: skyColors[i], y: i * bandHeight }); background.addChild(skyBand); } // Create stars var stars = new Container(); self.stars = stars; self.addChild(stars); // Add stars to the night sky var starCount = 100; for (var i = 0; i < starCount; i++) { var starSize = 2 + Math.random() * 4; var star = LK.getAsset('star_' + i, { width: starSize, height: starSize, color: 0xffffff, shape: 'ellipse', x: Math.random() * 2048, y: Math.random() * 1200, alpha: 0.5 + Math.random() * 0.5 }); star.pulseSpeed = 0.01 + Math.random() * 0.02; star.pulsePhase = Math.random() * Math.PI * 2; stars.addChild(star); } // Add floating lotus flowers var lotusFlowers = new Container(); self.lotusFlowers = lotusFlowers; self.addChild(lotusFlowers); var lotusCount = 5; for (var i = 0; i < lotusCount; i++) { var lotusSize = 80 + Math.random() * 40; var lotus = LK.getAsset('lotus_' + i, { width: lotusSize, height: lotusSize, color: 0xffb6c1, shape: 'ellipse', x: 400 + Math.random() * 1200, y: 1500 + Math.random() * 800 }); lotus.floatSpeed = 0.2 + Math.random() * 0.3; lotus.floatPhase = Math.random() * Math.PI * 2; lotusFlowers.addChild(lotus); } // Add water ripples var ripples = new Container(); self.ripples = ripples; self.addChild(ripples); self.rippleTimer = 0; // Update function to animate elements self.update = function () { // Animate stars (pulsing effect) for (var i = 0; i < stars.children.length; i++) { var star = stars.children[i]; star.pulsePhase += star.pulseSpeed; star.alpha = 0.5 + 0.5 * Math.sin(star.pulsePhase); } // Animate lotus flowers (gentle floating) for (var i = 0; i < lotusFlowers.children.length; i++) { var lotus = lotusFlowers.children[i]; lotus.floatPhase += 0.01; lotus.y += Math.sin(lotus.floatPhase) * lotus.floatSpeed; } // Create new ripples periodically self.rippleTimer++; if (self.rippleTimer > 120) { // Every 2 seconds self.createRipple(400 + Math.random() * 1200, 1500 + Math.random() * 800); self.rippleTimer = 0; } // Update existing ripples for (var i = ripples.children.length - 1; i >= 0; i--) { var ripple = ripples.children[i]; ripple.age++; // Expand ripple ripple.scale.x += 0.01; ripple.scale.y += 0.01; // Fade out ripple ripple.alpha = 1 - ripple.age / ripple.lifespan; // Remove old ripples if (ripple.age >= ripple.lifespan) { ripple.destroy(); ripples.removeChild(ripple); } } }; // Method to create a new water ripple self.createRipple = function (x, y) { var ripple = LK.getAsset('ripple', { width: 50, height: 50, color: 0xffffff, shape: 'ellipse', x: x, y: y, anchorX: 0.5, anchorY: 0.5, alpha: 0.7 }); ripple.age = 0; ripple.lifespan = 120; // 2 seconds ripples.addChild(ripple); }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.health = 100; self.maxHealth = 100; self.shootCooldown = 0; self.shootDelay = 15; // Frames between shots self.canMove = true; // Health bar setup var healthBarBg = self.attachAsset('healthBarBackground', { anchorX: 0.5, anchorY: 0, y: 120 }); var healthBarFill = self.attachAsset('healthBar', { anchorX: 0.5, anchorY: 0, y: 122 }); self.updateHealthBar = function () { var healthPercentage = self.health / self.maxHealth; healthBarFill.scale.x = healthPercentage; // Center the health bar healthBarFill.x = -100 * (1 - healthPercentage); }; self.takeDamage = function (amount) { self.health -= amount; if (self.health <= 0) { self.health = 0; LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); } self.updateHealthBar(); }; self.shoot = function () { if (self.shootCooldown <= 0) { var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y - 40; // Add to game's bullets array bullets.push(bullet); game.addChild(bullet); // Play gun sound LK.getSound('gunshot').play(); // Reset cooldown self.shootCooldown = self.shootDelay; } }; self.update = function () { if (self.shootCooldown > 0) { self.shootCooldown--; } }; self.down = function (x, y, obj) { self.shoot(); }; // Initialize health bar self.updateHealthBar(); return self; }); var SoulOrb = Container.expand(function () { var self = Container.call(this); // Create the soul orb with a glowing effect var orbCore = self.attachAsset('centerCircle', { width: 60, height: 60, color: 0x83de44, anchorX: 0.5, anchorY: 0.5 }); // Create outer glow var orbGlow = LK.getAsset('centerCircle', { width: 100, height: 100, color: 0xb8ffb0, anchorX: 0.5, anchorY: 0.5, alpha: 0.5 }); self.addChild(orbGlow); // Add pulsating animation to the glow self.glowPhase = 0; self.energy = 0; // Energy level (0-100) self.maxEnergy = 100; self.pulseSpeed = 0.05; // Update method to animate the orb self.update = function () { self.glowPhase += self.pulseSpeed; orbGlow.scale.x = 1 + 0.2 * Math.sin(self.glowPhase); orbGlow.scale.y = 1 + 0.2 * Math.sin(self.glowPhase); // Adjust color based on energy level var energyRatio = self.energy / self.maxEnergy; var r = Math.floor(131 + (255 - 131) * energyRatio); var g = Math.floor(222 + (255 - 222) * energyRatio); var b = Math.floor(68 + (255 - 68) * energyRatio); // Convert RGB to hex var color = r << 16 | g << 8 | b; orbCore.tint = color; }; // Method to add energy to the orb self.addEnergy = function (amount) { self.energy = Math.min(self.maxEnergy, self.energy + amount); // Flash with increasing brightness as energy increases LK.effects.flashObject(self, 0xffffff, 300); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x081832 }); /**** * Game Code ****/ // Game variables var meditationSpace; var soulOrb; var breathingCircle; var meditationGuide; var gameActive = true; var dragOffset = { x: 0, y: 0 }; var meditationLevel = 1; var meditationTime = 0; var soulEnergy = 0; var maxSoulEnergy = 100; var breathingTimer = 0; // Meditation practices var practices = [{ id: 'breathe', text: 'Complete 5 breathing cycles', count: 0, target: 5, completed: false }, { id: 'focus', text: 'Maintain focus for 60 seconds', count: 0, target: 60, completed: false }, { id: 'energy', text: 'Fill your soul with energy', count: 0, target: 100, completed: false }]; // Setup practice UI var practiceContainer = new Container(); practiceContainer.x = 40; practiceContainer.y = 180; LK.gui.left.addChild(practiceContainer); var practiceTitle = new Text2('PRACTICES:', { size: 50, fill: 0xFFFFFF }); practiceContainer.addChild(practiceTitle); // Create text for each practice var practiceTexts = []; for (var i = 0; i < practices.length; i++) { var practiceText = new Text2('• ' + practices[i].text + ' (0/' + practices[i].target + ')', { size: 40, fill: 0xCCCCCC }); practiceText.y = 60 + i * 50; practiceContainer.addChild(practiceText); practiceTexts.push(practiceText); } // Function to update practice UI function updatePracticeDisplay() { for (var i = 0; i < practices.length; i++) { var practice = practices[i]; var color = practice.completed ? 0x83de44 : 0xCCCCCC; practiceTexts[i].setText('• ' + practice.text + ' (' + practice.count + '/' + practice.target + ')'); practiceTexts[i].fill = color; } } // Setup UI var energyTxt = new Text2('Soul Energy: 0%', { size: 60, fill: 0xFFFFFF }); energyTxt.anchor.set(0.5, 0); LK.gui.top.addChild(energyTxt); var levelTxt = new Text2('Meditation Level: 1', { size: 60, fill: 0xFFFFFF }); levelTxt.anchor.set(0.5, 0); levelTxt.y = 70; LK.gui.top.addChild(levelTxt); // Create and add meditation space meditationSpace = new MeditationSpace(); game.addChild(meditationSpace); // Initialize soul orb soulOrb = new SoulOrb(); soulOrb.x = 2048 / 2; soulOrb.y = 2732 / 3; game.addChild(soulOrb); // Initialize breathing circle breathingCircle = new BreathingCircle(); breathingCircle.x = 2048 / 2; breathingCircle.y = 2732 / 2 + 200; game.addChild(breathingCircle); // Initialize meditation guide meditationGuide = new MeditationGuide(); meditationGuide.x = 2048 / 2; meditationGuide.y = 2732 / 5; game.addChild(meditationGuide); // Play meditation music LK.playMusic('background_music'); // Create a ripple at a position (utility function) function createRipple(x, y) { meditationSpace.createRipple(x, y); } // Add soul energy function addSoulEnergy(amount) { soulOrb.addEnergy(amount); // Update energy practice var energyPractice = practices.find(function (practice) { return practice.id === 'energy'; }); if (energyPractice && !energyPractice.completed) { energyPractice.count = Math.floor(soulOrb.energy); if (energyPractice.count >= energyPractice.target) { energyPractice.completed = true; LK.effects.flashObject(practiceTexts[2], 0x83de44, 1000); } updatePracticeDisplay(); } } // Check if meditation level should increase function checkMeditationProgress() { // Check if practices are completed to progress meditation level var completedPractices = practices.filter(function (practice) { return practice.completed; }).length; var newLevel = 1 + Math.floor(completedPractices / 2); if (newLevel > meditationLevel) { meditationLevel = newLevel; levelTxt.setText('Meditation Level: ' + meditationLevel); // Bonus for reaching new level addSoulEnergy(10 * meditationLevel); // Visual feedback LK.effects.flashScreen(0x83de44, 500); } } // Meditation interaction handling game.down = function (x, y, obj) { // Calculate distances to interactive elements var distToOrb = Math.sqrt(Math.pow(x - soulOrb.x, 2) + Math.pow(y - soulOrb.y, 2)); // If touching the soul orb if (distToOrb < 100) { // Add energy to the soul soulOrb.addEnergy(5); // Emit a ripple effect from the interaction point meditationSpace.createRipple(x, y); // Create visual feedback LK.effects.flashObject(soulOrb, 0xFFFFFF, 500); } else { // Create ripple at touch point meditationSpace.createRipple(x, y); } // Set drag offset for moving the orb dragOffset.x = soulOrb.x - x; dragOffset.y = soulOrb.y - y; }; game.move = function (x, y, obj) { // Move soul orb with drag soulOrb.x = x + dragOffset.x; soulOrb.y = y + dragOffset.y; // Keep soul orb in bounds soulOrb.x = Math.max(100, Math.min(2048 - 100, soulOrb.x)); soulOrb.y = Math.max(100, Math.min(2732 - 100, soulOrb.y)); // Create subtle ripple effects during movement if (Math.random() < 0.1) { meditationSpace.createRipple(soulOrb.x + (Math.random() * 100 - 50), soulOrb.y + (Math.random() * 100 - 50)); } }; game.up = function () { // Create final ripple at release point meditationSpace.createRipple(soulOrb.x, soulOrb.y); }; // Game update loop game.update = function () { if (!gameActive) return; // Update meditation space meditationSpace.update(); // Update soul orb, breathing circle, and guide soulOrb.update(); breathingCircle.update(); meditationGuide.update(); // Update energy display energyTxt.setText('Soul Energy: ' + Math.floor(soulOrb.energy / maxSoulEnergy * 100) + '%'); // Track breathing cycles for breathe practice if (breathingCircle.breathPhase === 3 && breathingCircle.breathTimer === 0) { // Just completed a full breathing cycle var breathePractice = practices.find(function (practice) { return practice.id === 'breathe'; }); if (breathePractice && !breathePractice.completed) { breathePractice.count++; if (breathePractice.count >= breathePractice.target) { breathePractice.completed = true; LK.effects.flashObject(practiceTexts[0], 0x83de44, 1000); // Add soul energy when completing breathing practice soulOrb.addEnergy(20); } updatePracticeDisplay(); } } // Track focus time for focus practice meditationTime++; if (meditationTime % 60 === 0) { // Every second var focusPractice = practices.find(function (practice) { return practice.id === 'focus'; }); if (focusPractice && !focusPractice.completed) { focusPractice.count++; if (focusPractice.count >= focusPractice.target) { focusPractice.completed = true; LK.effects.flashObject(practiceTexts[1], 0x83de44, 1000); // Add soul energy when completing focus practice soulOrb.addEnergy(30); } updatePracticeDisplay(); } } // Add soul energy over time with active meditation if (meditationTime % 180 === 0) { // Every 3 seconds soulOrb.addEnergy(1); // Track soul energy for energy practice var energyPractice = practices.find(function (practice) { return practice.id === 'energy'; }); if (energyPractice && !energyPractice.completed) { energyPractice.count = Math.floor(soulOrb.energy); if (energyPractice.count >= energyPractice.target) { energyPractice.completed = true; LK.effects.flashObject(practiceTexts[2], 0x83de44, 1000); } updatePracticeDisplay(); } } // Check for meditation level up if (meditationTime % 600 === 0) { // Every 10 seconds meditationLevel++; levelTxt.setText('Meditation Level: ' + meditationLevel); // Visual feedback for level up LK.effects.flashScreen(0x83de44, 500); } // Check if all practices are completed var allPracticesCompleted = practices.every(function (practice) { return practice.completed; }); if (allPracticesCompleted && gameActive) { // Show enlightenment message var enlightenmentMessage = new Text2('ENLIGHTENMENT ACHIEVED!', { size: 100, fill: 0xFFFFFF }); enlightenmentMessage.anchor.set(0.5, 0.5); enlightenmentMessage.x = 2048 / 2; enlightenmentMessage.y = 2732 / 2; game.addChild(enlightenmentMessage); // Visual effects for enlightenment LK.effects.flashScreen(0xFFFFFF, 2000); // Create new practices with higher requirements practices = [{ id: 'breathe', text: 'Complete 10 breathing cycles', count: 0, target: 10, completed: false }, { id: 'focus', text: 'Maintain focus for 120 seconds', count: 0, target: 120, completed: false }, { id: 'energy', text: 'Achieve deeper enlightenment', count: 0, target: 200, completed: false }]; // Update practice display for (var i = 0; i < practices.length; i++) { practiceTexts[i].setText('• ' + practices[i].text + ' (0/' + practices[i].target + ')'); practiceTexts[i].fill = 0xCCCCCC; } // Increase soul orb capacity maxSoulEnergy = 200; // Remove the enlightenment message after 3 seconds LK.setTimeout(function () { enlightenmentMessage.destroy(); updatePracticeDisplay(); }, 3000); } };
===================================================================
--- original.js
+++ change.js
@@ -125,8 +125,87 @@
}
};
return self;
});
+var BreathingCircle = Container.expand(function () {
+ var self = Container.call(this);
+ // Create the breathing circle
+ var innerCircle = self.attachAsset('centerCircle', {
+ width: 200,
+ height: 200,
+ color: 0x3a5c9f,
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.4
+ });
+ var outerCircle = LK.getAsset('centerCircle', {
+ width: 240,
+ height: 240,
+ color: 0x5a7cbf,
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.2
+ });
+ self.addChild(outerCircle);
+ // Breathing animation state
+ self.breathPhase = 0; // 0: inhale growing, 1: hold, 2: exhale shrinking, 3: hold
+ self.breathTimer = 0;
+ self.inhaleDuration = 240; // 4 seconds
+ self.holdDuration = 120; // 2 seconds
+ self.exhaleDuration = 240; // 4 seconds
+ self.restDuration = 60; // 1 second
+ // Text guide for breathing
+ self.breathText = new Text2("Breathe In", {
+ size: 40,
+ fill: 0xffffff
+ });
+ self.breathText.anchor.set(0.5, 0.5);
+ self.breathText.y = -160;
+ self.addChild(self.breathText);
+ // Update method to animate the breathing circle
+ self.update = function () {
+ self.breathTimer++;
+ // Determine current phase based on timer
+ if (self.breathPhase === 0) {
+ // Inhale
+ var progress = self.breathTimer / self.inhaleDuration;
+ var scale = 1 + progress * 0.5;
+ innerCircle.scale.x = innerCircle.scale.y = scale;
+ outerCircle.scale.x = outerCircle.scale.y = 0.9 + progress * 0.5;
+ self.breathText.setText("Breathe In");
+ if (self.breathTimer >= self.inhaleDuration) {
+ self.breathPhase = 1;
+ self.breathTimer = 0;
+ }
+ } else if (self.breathPhase === 1) {
+ // Hold after inhale
+ self.breathText.setText("Hold");
+ if (self.breathTimer >= self.holdDuration) {
+ self.breathPhase = 2;
+ self.breathTimer = 0;
+ }
+ } else if (self.breathPhase === 2) {
+ // Exhale
+ var progress = self.breathTimer / self.exhaleDuration;
+ var scale = 1.5 - progress * 0.5;
+ innerCircle.scale.x = innerCircle.scale.y = scale;
+ outerCircle.scale.x = outerCircle.scale.y = 1.4 - progress * 0.5;
+ self.breathText.setText("Breathe Out");
+ if (self.breathTimer >= self.exhaleDuration) {
+ self.breathPhase = 3;
+ self.breathTimer = 0;
+ }
+ } else {
+ // Hold after exhale
+ self.breathText.setText("Rest");
+ if (self.breathTimer >= self.restDuration) {
+ self.breathPhase = 0;
+ self.breathTimer = 0;
+ }
+ }
+ };
+ return self;
+});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
@@ -299,8 +378,164 @@
}
};
return self;
});
+var MeditationGuide = Container.expand(function () {
+ var self = Container.call(this);
+ // Create a text display for meditation prompts
+ self.promptText = new Text2("Breathe deeply...", {
+ size: 60,
+ fill: 0xffffff,
+ align: 'center'
+ });
+ self.promptText.anchor.set(0.5, 0.5);
+ self.addChild(self.promptText);
+ // List of meditation prompts
+ self.prompts = ["Breathe deeply...", "Focus on your breath...", "Let go of your thoughts...", "Feel the peace within...", "You are present...", "Allow yourself to be...", "Feel the energy flow...", "Find your center..."];
+ self.currentPrompt = 0;
+ self.promptTimer = 0;
+ self.promptDuration = 300; // 5 seconds per prompt
+ // Update method to cycle through prompts
+ self.update = function () {
+ self.promptTimer++;
+ // Change prompt periodically
+ if (self.promptTimer >= self.promptDuration) {
+ self.currentPrompt = (self.currentPrompt + 1) % self.prompts.length;
+ self.promptText.setText(self.prompts[self.currentPrompt]);
+ self.promptTimer = 0;
+ // Animate text appearance
+ self.promptText.alpha = 0;
+ tween(self.promptText, {
+ alpha: 1
+ }, {
+ duration: 1000
+ });
+ }
+ // Subtle pulse animation
+ var scale = 1 + 0.05 * Math.sin(self.promptTimer * 0.01);
+ self.promptText.scale.x = scale;
+ self.promptText.scale.y = scale;
+ };
+ return self;
+});
+var MeditationSpace = Container.expand(function () {
+ var self = Container.call(this);
+ // Create a peaceful gradient background
+ var background = new Container();
+ self.addChild(background);
+ // Create calming gradient colors for the background
+ var skyColors = [0x081832, 0x112a4e, 0x1a3c6a, 0x234e86, 0x2c60a2];
+ var bandHeight = 2732 / skyColors.length;
+ for (var i = 0; i < skyColors.length; i++) {
+ var skyBand = LK.getAsset('skyBand' + i, {
+ width: 2048,
+ height: bandHeight,
+ color: skyColors[i],
+ y: i * bandHeight
+ });
+ background.addChild(skyBand);
+ }
+ // Create stars
+ var stars = new Container();
+ self.stars = stars;
+ self.addChild(stars);
+ // Add stars to the night sky
+ var starCount = 100;
+ for (var i = 0; i < starCount; i++) {
+ var starSize = 2 + Math.random() * 4;
+ var star = LK.getAsset('star_' + i, {
+ width: starSize,
+ height: starSize,
+ color: 0xffffff,
+ shape: 'ellipse',
+ x: Math.random() * 2048,
+ y: Math.random() * 1200,
+ alpha: 0.5 + Math.random() * 0.5
+ });
+ star.pulseSpeed = 0.01 + Math.random() * 0.02;
+ star.pulsePhase = Math.random() * Math.PI * 2;
+ stars.addChild(star);
+ }
+ // Add floating lotus flowers
+ var lotusFlowers = new Container();
+ self.lotusFlowers = lotusFlowers;
+ self.addChild(lotusFlowers);
+ var lotusCount = 5;
+ for (var i = 0; i < lotusCount; i++) {
+ var lotusSize = 80 + Math.random() * 40;
+ var lotus = LK.getAsset('lotus_' + i, {
+ width: lotusSize,
+ height: lotusSize,
+ color: 0xffb6c1,
+ shape: 'ellipse',
+ x: 400 + Math.random() * 1200,
+ y: 1500 + Math.random() * 800
+ });
+ lotus.floatSpeed = 0.2 + Math.random() * 0.3;
+ lotus.floatPhase = Math.random() * Math.PI * 2;
+ lotusFlowers.addChild(lotus);
+ }
+ // Add water ripples
+ var ripples = new Container();
+ self.ripples = ripples;
+ self.addChild(ripples);
+ self.rippleTimer = 0;
+ // Update function to animate elements
+ self.update = function () {
+ // Animate stars (pulsing effect)
+ for (var i = 0; i < stars.children.length; i++) {
+ var star = stars.children[i];
+ star.pulsePhase += star.pulseSpeed;
+ star.alpha = 0.5 + 0.5 * Math.sin(star.pulsePhase);
+ }
+ // Animate lotus flowers (gentle floating)
+ for (var i = 0; i < lotusFlowers.children.length; i++) {
+ var lotus = lotusFlowers.children[i];
+ lotus.floatPhase += 0.01;
+ lotus.y += Math.sin(lotus.floatPhase) * lotus.floatSpeed;
+ }
+ // Create new ripples periodically
+ self.rippleTimer++;
+ if (self.rippleTimer > 120) {
+ // Every 2 seconds
+ self.createRipple(400 + Math.random() * 1200, 1500 + Math.random() * 800);
+ self.rippleTimer = 0;
+ }
+ // Update existing ripples
+ for (var i = ripples.children.length - 1; i >= 0; i--) {
+ var ripple = ripples.children[i];
+ ripple.age++;
+ // Expand ripple
+ ripple.scale.x += 0.01;
+ ripple.scale.y += 0.01;
+ // Fade out ripple
+ ripple.alpha = 1 - ripple.age / ripple.lifespan;
+ // Remove old ripples
+ if (ripple.age >= ripple.lifespan) {
+ ripple.destroy();
+ ripples.removeChild(ripple);
+ }
+ }
+ };
+ // Method to create a new water ripple
+ self.createRipple = function (x, y) {
+ var ripple = LK.getAsset('ripple', {
+ width: 50,
+ height: 50,
+ color: 0xffffff,
+ shape: 'ellipse',
+ x: x,
+ y: y,
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.7
+ });
+ ripple.age = 0;
+ ripple.lifespan = 120; // 2 seconds
+ ripples.addChild(ripple);
+ };
+ return self;
+});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
@@ -363,313 +598,354 @@
// Initialize health bar
self.updateHealthBar();
return self;
});
+var SoulOrb = Container.expand(function () {
+ var self = Container.call(this);
+ // Create the soul orb with a glowing effect
+ var orbCore = self.attachAsset('centerCircle', {
+ width: 60,
+ height: 60,
+ color: 0x83de44,
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Create outer glow
+ var orbGlow = LK.getAsset('centerCircle', {
+ width: 100,
+ height: 100,
+ color: 0xb8ffb0,
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.5
+ });
+ self.addChild(orbGlow);
+ // Add pulsating animation to the glow
+ self.glowPhase = 0;
+ self.energy = 0; // Energy level (0-100)
+ self.maxEnergy = 100;
+ self.pulseSpeed = 0.05;
+ // Update method to animate the orb
+ self.update = function () {
+ self.glowPhase += self.pulseSpeed;
+ orbGlow.scale.x = 1 + 0.2 * Math.sin(self.glowPhase);
+ orbGlow.scale.y = 1 + 0.2 * Math.sin(self.glowPhase);
+ // Adjust color based on energy level
+ var energyRatio = self.energy / self.maxEnergy;
+ var r = Math.floor(131 + (255 - 131) * energyRatio);
+ var g = Math.floor(222 + (255 - 222) * energyRatio);
+ var b = Math.floor(68 + (255 - 68) * energyRatio);
+ // Convert RGB to hex
+ var color = r << 16 | g << 8 | b;
+ orbCore.tint = color;
+ };
+ // Method to add energy to the orb
+ self.addEnergy = function (amount) {
+ self.energy = Math.min(self.maxEnergy, self.energy + amount);
+ // Flash with increasing brightness as energy increases
+ LK.effects.flashObject(self, 0xffffff, 300);
+ };
+ return self;
+});
/****
* Initialize Game
****/
var game = new LK.Game({
- backgroundColor: 0x1a3c80
+ backgroundColor: 0x081832
});
/****
* Game Code
****/
// Game variables
-var player;
-var bullets = [];
-var criminals = [];
-var emergencyCalls = [];
+var meditationSpace;
+var soulOrb;
+var breathingCircle;
+var meditationGuide;
var gameActive = true;
var dragOffset = {
x: 0,
y: 0
};
-var gameLevel = 1;
-var spawnTimer = 0;
-var maxCriminals = 10;
-var emergencyCallTimer = 0;
-// Game tasks
-var tasks = [{
- id: 'respond',
- text: 'Respond to emergency calls',
+var meditationLevel = 1;
+var meditationTime = 0;
+var soulEnergy = 0;
+var maxSoulEnergy = 100;
+var breathingTimer = 0;
+// Meditation practices
+var practices = [{
+ id: 'breathe',
+ text: 'Complete 5 breathing cycles',
count: 0,
target: 5,
completed: false
}, {
- id: 'eliminate',
- text: 'Eliminate criminals',
+ id: 'focus',
+ text: 'Maintain focus for 60 seconds',
count: 0,
- target: 15,
+ target: 60,
completed: false
}, {
- id: 'survive',
- text: 'Survive to level 3',
- count: 1,
- target: 3,
+ id: 'energy',
+ text: 'Fill your soul with energy',
+ count: 0,
+ target: 100,
completed: false
}];
-// Setup task UI
-var taskContainer = new Container();
-taskContainer.x = 40;
-taskContainer.y = 180;
-LK.gui.left.addChild(taskContainer);
-var taskTitle = new Text2('TASKS:', {
+// Setup practice UI
+var practiceContainer = new Container();
+practiceContainer.x = 40;
+practiceContainer.y = 180;
+LK.gui.left.addChild(practiceContainer);
+var practiceTitle = new Text2('PRACTICES:', {
size: 50,
fill: 0xFFFFFF
});
-taskContainer.addChild(taskTitle);
-// Create text for each task
-var taskTexts = [];
-for (var i = 0; i < tasks.length; i++) {
- var taskText = new Text2('• ' + tasks[i].text + ' (0/' + tasks[i].target + ')', {
+practiceContainer.addChild(practiceTitle);
+// Create text for each practice
+var practiceTexts = [];
+for (var i = 0; i < practices.length; i++) {
+ var practiceText = new Text2('• ' + practices[i].text + ' (0/' + practices[i].target + ')', {
size: 40,
fill: 0xCCCCCC
});
- taskText.y = 60 + i * 50;
- taskContainer.addChild(taskText);
- taskTexts.push(taskText);
+ practiceText.y = 60 + i * 50;
+ practiceContainer.addChild(practiceText);
+ practiceTexts.push(practiceText);
}
-// Function to update task UI
-function updateTaskDisplay() {
- for (var i = 0; i < tasks.length; i++) {
- var task = tasks[i];
- var color = task.completed ? 0x00FF00 : 0xCCCCCC;
- taskTexts[i].setText('• ' + task.text + ' (' + task.count + '/' + task.target + ')');
- taskTexts[i].fill = color;
+// Function to update practice UI
+function updatePracticeDisplay() {
+ for (var i = 0; i < practices.length; i++) {
+ var practice = practices[i];
+ var color = practice.completed ? 0x83de44 : 0xCCCCCC;
+ practiceTexts[i].setText('• ' + practice.text + ' (' + practice.count + '/' + practice.target + ')');
+ practiceTexts[i].fill = color;
}
}
// Setup UI
-var scoreTxt = new Text2('Score: 0', {
- size: 70,
+var energyTxt = new Text2('Soul Energy: 0%', {
+ size: 60,
fill: 0xFFFFFF
});
-scoreTxt.anchor.set(0.5, 0);
-LK.gui.top.addChild(scoreTxt);
-var levelTxt = new Text2('Level: 1', {
- size: 70,
+energyTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(energyTxt);
+var levelTxt = new Text2('Meditation Level: 1', {
+ size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0.5, 0);
-levelTxt.y = 80;
+levelTxt.y = 70;
LK.gui.top.addChild(levelTxt);
-// Create and add beautiful background
-var background = new Background();
-game.addChild(background);
-// Initialize player
-player = new Player();
-player.x = 2048 / 2;
-player.y = 2732 / 2;
-game.addChild(player);
-// Play background music
+// Create and add meditation space
+meditationSpace = new MeditationSpace();
+game.addChild(meditationSpace);
+// Initialize soul orb
+soulOrb = new SoulOrb();
+soulOrb.x = 2048 / 2;
+soulOrb.y = 2732 / 3;
+game.addChild(soulOrb);
+// Initialize breathing circle
+breathingCircle = new BreathingCircle();
+breathingCircle.x = 2048 / 2;
+breathingCircle.y = 2732 / 2 + 200;
+game.addChild(breathingCircle);
+// Initialize meditation guide
+meditationGuide = new MeditationGuide();
+meditationGuide.x = 2048 / 2;
+meditationGuide.y = 2732 / 5;
+game.addChild(meditationGuide);
+// Play meditation music
LK.playMusic('background_music');
-// Spawn criminals at a position
-function spawnCriminals(x, y, count) {
- for (var i = 0; i < count; i++) {
- if (criminals.length < maxCriminals) {
- var criminal = new Criminal();
- // Randomize spawn position only at top of screen
- var spawnX = Math.random() * (2048 - 100) + 50;
- var spawnY = -50; // Start above the screen
- criminal.x = spawnX;
- criminal.y = spawnY;
- criminals.push(criminal);
- game.addChild(criminal);
+// Create a ripple at a position (utility function)
+function createRipple(x, y) {
+ meditationSpace.createRipple(x, y);
+}
+// Add soul energy
+function addSoulEnergy(amount) {
+ soulOrb.addEnergy(amount);
+ // Update energy practice
+ var energyPractice = practices.find(function (practice) {
+ return practice.id === 'energy';
+ });
+ if (energyPractice && !energyPractice.completed) {
+ energyPractice.count = Math.floor(soulOrb.energy);
+ if (energyPractice.count >= energyPractice.target) {
+ energyPractice.completed = true;
+ LK.effects.flashObject(practiceTexts[2], 0x83de44, 1000);
}
+ updatePracticeDisplay();
}
}
-// Create an emergency call at a random position
-function createEmergencyCall() {
- var call = new EmergencyCall();
- call.x = Math.random() * (2048 - 200) + 100; // Keep away from edges
- call.y = Math.random() * (2732 - 200) + 100; // Keep away from edges
- emergencyCalls.push(call);
- game.addChild(call);
- // Play siren sound
- LK.getSound('siren').play();
-}
-// Check if a level up should occur
-function checkLevelUp() {
- var score = LK.getScore();
- var newLevel = Math.floor(score / 10) + 1;
- if (newLevel > gameLevel) {
- gameLevel = newLevel;
- levelTxt.setText('Level: ' + gameLevel);
- // Increase difficulty
- maxCriminals = 10 + gameLevel * 2;
+// Check if meditation level should increase
+function checkMeditationProgress() {
+ // Check if practices are completed to progress meditation level
+ var completedPractices = practices.filter(function (practice) {
+ return practice.completed;
+ }).length;
+ var newLevel = 1 + Math.floor(completedPractices / 2);
+ if (newLevel > meditationLevel) {
+ meditationLevel = newLevel;
+ levelTxt.setText('Meditation Level: ' + meditationLevel);
// Bonus for reaching new level
- player.health = Math.min(player.maxHealth, player.health + 20);
- player.updateHealthBar();
+ addSoulEnergy(10 * meditationLevel);
// Visual feedback
- LK.effects.flashScreen(0x00FF00, 500);
- // Track survival task progress
- var surviveTask = tasks.find(function (task) {
- return task.id === 'survive';
- });
- if (surviveTask && !surviveTask.completed) {
- surviveTask.count = gameLevel;
- if (surviveTask.count >= surviveTask.target) {
- surviveTask.completed = true;
- LK.effects.flashObject(taskTexts[2], 0x00FF00, 1000);
- }
- updateTaskDisplay();
- }
+ LK.effects.flashScreen(0x83de44, 500);
}
}
-// Game drag handling
+// Meditation interaction handling
game.down = function (x, y, obj) {
- if (!player.canMove) return;
- // Calculate offset for dragging
- dragOffset.x = player.x - x;
- dragOffset.y = player.y - y;
- player.shoot();
+ // Calculate distances to interactive elements
+ var distToOrb = Math.sqrt(Math.pow(x - soulOrb.x, 2) + Math.pow(y - soulOrb.y, 2));
+ // If touching the soul orb
+ if (distToOrb < 100) {
+ // Add energy to the soul
+ soulOrb.addEnergy(5);
+ // Emit a ripple effect from the interaction point
+ meditationSpace.createRipple(x, y);
+ // Create visual feedback
+ LK.effects.flashObject(soulOrb, 0xFFFFFF, 500);
+ } else {
+ // Create ripple at touch point
+ meditationSpace.createRipple(x, y);
+ }
+ // Set drag offset for moving the orb
+ dragOffset.x = soulOrb.x - x;
+ dragOffset.y = soulOrb.y - y;
};
game.move = function (x, y, obj) {
- if (!player.canMove) return;
- // Move player with drag
- player.x = x + dragOffset.x;
- player.y = y + dragOffset.y;
- // Keep player in bounds
- player.x = Math.max(50, Math.min(2048 - 50, player.x));
- player.y = Math.max(50, Math.min(2732 - 50, player.y));
+ // Move soul orb with drag
+ soulOrb.x = x + dragOffset.x;
+ soulOrb.y = y + dragOffset.y;
+ // Keep soul orb in bounds
+ soulOrb.x = Math.max(100, Math.min(2048 - 100, soulOrb.x));
+ soulOrb.y = Math.max(100, Math.min(2732 - 100, soulOrb.y));
+ // Create subtle ripple effects during movement
+ if (Math.random() < 0.1) {
+ meditationSpace.createRipple(soulOrb.x + (Math.random() * 100 - 50), soulOrb.y + (Math.random() * 100 - 50));
+ }
};
game.up = function () {
- // Add any logic needed when touch/click is released
+ // Create final ripple at release point
+ meditationSpace.createRipple(soulOrb.x, soulOrb.y);
};
// Game update loop
game.update = function () {
if (!gameActive) return;
- // Update background elements
- background.update();
- // Update score display
- scoreTxt.setText('Score: ' + LK.getScore());
- // Update player
- player.update();
- // Update bullets
- for (var i = bullets.length - 1; i >= 0; i--) {
- var bullet = bullets[i];
- bullet.update();
- // Check for off-screen bullets
- if (bullet.x < 0 || bullet.x > 2048 || bullet.y < 0 || bullet.y > 2732 || bullet.markForDeletion) {
- bullet.destroy();
- bullets.splice(i, 1);
- continue;
- }
- // Check for bullet collisions
- if (bullet.isEnemyBullet) {
- // Enemy bullets hit player
- if (bullet.intersects(player)) {
- player.takeDamage(10);
- bullet.destroy();
- bullets.splice(i, 1);
- continue;
+ // Update meditation space
+ meditationSpace.update();
+ // Update soul orb, breathing circle, and guide
+ soulOrb.update();
+ breathingCircle.update();
+ meditationGuide.update();
+ // Update energy display
+ energyTxt.setText('Soul Energy: ' + Math.floor(soulOrb.energy / maxSoulEnergy * 100) + '%');
+ // Track breathing cycles for breathe practice
+ if (breathingCircle.breathPhase === 3 && breathingCircle.breathTimer === 0) {
+ // Just completed a full breathing cycle
+ var breathePractice = practices.find(function (practice) {
+ return practice.id === 'breathe';
+ });
+ if (breathePractice && !breathePractice.completed) {
+ breathePractice.count++;
+ if (breathePractice.count >= breathePractice.target) {
+ breathePractice.completed = true;
+ LK.effects.flashObject(practiceTexts[0], 0x83de44, 1000);
+ // Add soul energy when completing breathing practice
+ soulOrb.addEnergy(20);
}
- } else {
- // Player bullets hit criminals
- for (var j = criminals.length - 1; j >= 0; j--) {
- if (bullet.intersects(criminals[j])) {
- criminals[j].takeDamage();
- bullet.destroy();
- bullets.splice(i, 1);
- break;
- }
- }
+ updatePracticeDisplay();
}
}
- // Update criminals
- for (var k = criminals.length - 1; k >= 0; k--) {
- var criminal = criminals[k];
- criminal.update();
- // Check for criminal-player collision
- if (criminal.intersects(player)) {
- player.takeDamage(5);
- LK.effects.flashObject(player, 0xFF0000, 500);
- // Push player away from criminal
- var dx = player.x - criminal.x;
- var dy = player.y - criminal.y;
- var dist = Math.sqrt(dx * dx + dy * dy);
- if (dist > 0) {
- player.x += dx / dist * 30;
- player.y += dy / dist * 30;
+ // Track focus time for focus practice
+ meditationTime++;
+ if (meditationTime % 60 === 0) {
+ // Every second
+ var focusPractice = practices.find(function (practice) {
+ return practice.id === 'focus';
+ });
+ if (focusPractice && !focusPractice.completed) {
+ focusPractice.count++;
+ if (focusPractice.count >= focusPractice.target) {
+ focusPractice.completed = true;
+ LK.effects.flashObject(practiceTexts[1], 0x83de44, 1000);
+ // Add soul energy when completing focus practice
+ soulOrb.addEnergy(30);
}
+ updatePracticeDisplay();
}
- // Remove dead criminals
- if (criminal.markForDeletion) {
- criminal.destroy();
- criminals.splice(k, 1);
- }
}
- // Update emergency calls
- for (var m = emergencyCalls.length - 1; m >= 0; m--) {
- emergencyCalls[m].update();
- if (emergencyCalls[m].markForDeletion) {
- emergencyCalls[m].destroy();
- emergencyCalls.splice(m, 1);
+ // Add soul energy over time with active meditation
+ if (meditationTime % 180 === 0) {
+ // Every 3 seconds
+ soulOrb.addEnergy(1);
+ // Track soul energy for energy practice
+ var energyPractice = practices.find(function (practice) {
+ return practice.id === 'energy';
+ });
+ if (energyPractice && !energyPractice.completed) {
+ energyPractice.count = Math.floor(soulOrb.energy);
+ if (energyPractice.count >= energyPractice.target) {
+ energyPractice.completed = true;
+ LK.effects.flashObject(practiceTexts[2], 0x83de44, 1000);
+ }
+ updatePracticeDisplay();
}
}
- // Spawn logic
- spawnTimer++;
- if (spawnTimer > 180 && criminals.length < maxCriminals) {
- // Every 3 seconds
- spawnCriminals(Math.random() * 2048, 0, 1 + Math.floor(Math.random() * gameLevel));
- spawnTimer = 0;
- }
- // Emergency call logic
- emergencyCallTimer++;
- if (emergencyCallTimer > 600 && emergencyCalls.length < 3) {
+ // Check for meditation level up
+ if (meditationTime % 600 === 0) {
// Every 10 seconds
- createEmergencyCall();
- emergencyCallTimer = 0;
+ meditationLevel++;
+ levelTxt.setText('Meditation Level: ' + meditationLevel);
+ // Visual feedback for level up
+ LK.effects.flashScreen(0x83de44, 500);
}
- // Check for level up
- checkLevelUp();
- // Check if all tasks are completed
- var allTasksCompleted = tasks.every(function (task) {
- return task.completed;
+ // Check if all practices are completed
+ var allPracticesCompleted = practices.every(function (practice) {
+ return practice.completed;
});
- if (allTasksCompleted && gameActive) {
- // Show mission complete message
- var missionComplete = new Text2('ALL TASKS COMPLETED!', {
+ if (allPracticesCompleted && gameActive) {
+ // Show enlightenment message
+ var enlightenmentMessage = new Text2('ENLIGHTENMENT ACHIEVED!', {
size: 100,
- fill: 0x00FF00
+ fill: 0xFFFFFF
});
- missionComplete.anchor.set(0.5, 0.5);
- missionComplete.x = 2048 / 2;
- missionComplete.y = 2732 / 2;
- game.addChild(missionComplete);
- // Give player bonus health and a visual indication
- player.health = player.maxHealth;
- player.updateHealthBar();
- LK.effects.flashScreen(0x00FF00, 1000);
- // Create new tasks with higher requirements for continued gameplay
- tasks = [{
- id: 'respond',
- text: 'Respond to emergency calls',
+ enlightenmentMessage.anchor.set(0.5, 0.5);
+ enlightenmentMessage.x = 2048 / 2;
+ enlightenmentMessage.y = 2732 / 2;
+ game.addChild(enlightenmentMessage);
+ // Visual effects for enlightenment
+ LK.effects.flashScreen(0xFFFFFF, 2000);
+ // Create new practices with higher requirements
+ practices = [{
+ id: 'breathe',
+ text: 'Complete 10 breathing cycles',
count: 0,
target: 10,
completed: false
}, {
- id: 'eliminate',
- text: 'Eliminate criminals',
+ id: 'focus',
+ text: 'Maintain focus for 120 seconds',
count: 0,
- target: 30,
+ target: 120,
completed: false
}, {
- id: 'survive',
- text: 'Survive to level 5',
- count: gameLevel,
- target: 5,
+ id: 'energy',
+ text: 'Achieve deeper enlightenment',
+ count: 0,
+ target: 200,
completed: false
}];
- // Update task display
- for (var i = 0; i < tasks.length; i++) {
- taskTexts[i].setText('• ' + tasks[i].text + ' (0/' + tasks[i].target + ')');
- taskTexts[i].fill = 0xCCCCCC;
+ // Update practice display
+ for (var i = 0; i < practices.length; i++) {
+ practiceTexts[i].setText('• ' + practices[i].text + ' (0/' + practices[i].target + ')');
+ practiceTexts[i].fill = 0xCCCCCC;
}
- // Remove the mission complete text after 3 seconds
+ // Increase soul orb capacity
+ maxSoulEnergy = 200;
+ // Remove the enlightenment message after 3 seconds
LK.setTimeout(function () {
- missionComplete.destroy();
- updateTaskDisplay();
+ enlightenmentMessage.destroy();
+ updatePracticeDisplay();
}, 3000);
}
};
\ No newline at end of file