Code edit (1 edits merged)
Please save this source code
User prompt
PowerPuff Jewel Fall
Initial prompt
Toca free fall (2013-2021). The powerpuff girls have a free fall board. Use your finger to swipe the green jewel, blue jewel, light blue jewel, purple jewel, red jewel, or yellow jewel into 2 green jewels, 2 blue jewels, 2 light blue jewels, 2 purple jewels, 2 red jewels, or 2 yellow jewels. Finish all 5 levels and then a video called “the powerpuff girls say we had such fun.”
/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
var FallingJewel = Container.expand(function (jewelType) {
	var self = Container.call(this);
	self.jewelType = jewelType;
	self.fallSpeed = 3;
	self.isDragging = false;
	self.matched = false;
	var jewelAssets = {
		'green': 'greenJewel',
		'blue': 'blueJewel',
		'lightBlue': 'lightBlueJewel',
		'purple': 'purpleJewel',
		'red': 'redJewel',
		'yellow': 'yellowJewel'
	};
	var jewelGraphics = self.attachAsset(jewelAssets[jewelType], {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.update = function () {
		if (!self.isDragging && !self.matched) {
			self.y += self.fallSpeed;
		}
	};
	self.down = function (x, y, obj) {
		self.isDragging = true;
	};
	self.up = function (x, y, obj) {
		self.isDragging = false;
	};
	return self;
});
var TargetPair = Container.expand(function (jewelType, x, y) {
	var self = Container.call(this);
	self.jewelType = jewelType;
	self.matched = false;
	var targetAssets = {
		'green': 'targetGreen',
		'blue': 'targetBlue',
		'lightBlue': 'targetLightBlue',
		'purple': 'targetPurple',
		'red': 'targetRed',
		'yellow': 'targetYellow'
	};
	var targetGraphics = self.attachAsset(targetAssets[jewelType], {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.x = x;
	self.y = y;
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x220044
});
/**** 
* Game Code
****/ 
var jewelTypes = ['green', 'blue', 'lightBlue', 'purple', 'red', 'yellow'];
var fallingJewels = [];
var targetPairs = [];
var currentLevel = 1;
var maxLevels = 5;
var jewelsMatched = 0;
var jewelsNeededForLevel = 6;
var spawnTimer = 0;
var spawnDelay = 120;
var draggedJewel = null;
// Create level text
var levelText = new Text2('Level 1', {
	size: 100,
	fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0);
LK.gui.top.addChild(levelText);
levelText.y = 50;
// Create score text
var scoreText = new Text2('Score: 0', {
	size: 80,
	fill: 0xFFFFFF
});
scoreText.anchor.set(1, 0);
LK.gui.topRight.addChild(scoreText);
scoreText.x = -20;
scoreText.y = 20;
// Create target pairs at bottom of screen
function createTargetPairs() {
	var spacing = 2048 / 6;
	for (var i = 0; i < jewelTypes.length; i++) {
		var target = new TargetPair(jewelTypes[i], (i + 0.5) * spacing, 2600);
		targetPairs.push(target);
		game.addChild(target);
	}
}
// Spawn a random falling jewel
function spawnJewel() {
	var randomType = jewelTypes[Math.floor(Math.random() * jewelTypes.length)];
	var jewel = new FallingJewel(randomType);
	jewel.x = Math.random() * (2048 - 200) + 100;
	jewel.y = -100;
	jewel.fallSpeed = 3 + (currentLevel - 1) * 0.5;
	fallingJewels.push(jewel);
	game.addChild(jewel);
}
// Check for matches between jewels and targets
function checkMatches() {
	for (var i = fallingJewels.length - 1; i >= 0; i--) {
		var jewel = fallingJewels[i];
		// Check if jewel is off screen
		if (jewel.y > 2800) {
			jewel.destroy();
			fallingJewels.splice(i, 1);
			continue;
		}
		// Check for matches with target pairs
		for (var j = 0; j < targetPairs.length; j++) {
			var target = targetPairs[j];
			if (jewel.jewelType === target.jewelType && jewel.intersects(target) && !jewel.matched) {
				jewel.matched = true;
				LK.setScore(LK.getScore() + 10);
				scoreText.setText('Score: ' + LK.getScore());
				jewelsMatched++;
				// Flash effect
				LK.effects.flashObject(target, 0xffffff, 500);
				LK.getSound('match').play();
				// Remove jewel
				jewel.destroy();
				fallingJewels.splice(i, 1);
				// Check if level complete
				if (jewelsMatched >= jewelsNeededForLevel) {
					completeLevel();
				}
				break;
			}
		}
	}
}
// Complete current level
function completeLevel() {
	LK.getSound('levelComplete').play();
	currentLevel++;
	jewelsMatched = 0;
	if (currentLevel > maxLevels) {
		// Game complete - PowerPuff Girls celebration
		var celebrationText = new Text2('PowerPuff Girls Victory!\nYou saved the day!', {
			size: 120,
			fill: 0xFF69B4
		});
		celebrationText.anchor.set(0.5, 0.5);
		celebrationText.x = 2048 / 2;
		celebrationText.y = 2732 / 2;
		game.addChild(celebrationText);
		tween(celebrationText, {
			scaleX: 1.2,
			scaleY: 1.2
		}, {
			duration: 1000,
			easing: tween.easeInOut,
			onFinish: function onFinish() {
				LK.showYouWin();
			}
		});
	} else {
		levelText.setText('Level ' + currentLevel);
		spawnDelay = Math.max(60, spawnDelay - 10);
	}
}
// Handle dragging
function handleMove(x, y, obj) {
	if (draggedJewel) {
		draggedJewel.x = x;
		draggedJewel.y = y;
	}
}
game.move = handleMove;
game.down = function (x, y, obj) {
	// Find closest jewel to touch point
	var closestJewel = null;
	var closestDistance = Infinity;
	for (var i = 0; i < fallingJewels.length; i++) {
		var jewel = fallingJewels[i];
		var dx = jewel.x - x;
		var dy = jewel.y - y;
		var distance = Math.sqrt(dx * dx + dy * dy);
		if (distance < closestDistance && distance < 100) {
			closestDistance = distance;
			closestJewel = jewel;
		}
	}
	if (closestJewel) {
		draggedJewel = closestJewel;
		draggedJewel.isDragging = true;
	}
	handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
	if (draggedJewel) {
		draggedJewel.isDragging = false;
		draggedJewel = null;
	}
};
// Initialize target pairs
createTargetPairs();
game.update = function () {
	spawnTimer++;
	// Spawn new jewels
	if (spawnTimer >= spawnDelay) {
		spawnJewel();
		spawnTimer = 0;
	}
	// Check for matches and cleanup
	checkMatches();
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,225 @@
-/****
+/**** 
+* Plugins
+****/ 
+var tween = LK.import("@upit/tween.v1");
+
+/**** 
+* Classes
+****/ 
+var FallingJewel = Container.expand(function (jewelType) {
+	var self = Container.call(this);
+	self.jewelType = jewelType;
+	self.fallSpeed = 3;
+	self.isDragging = false;
+	self.matched = false;
+	var jewelAssets = {
+		'green': 'greenJewel',
+		'blue': 'blueJewel',
+		'lightBlue': 'lightBlueJewel',
+		'purple': 'purpleJewel',
+		'red': 'redJewel',
+		'yellow': 'yellowJewel'
+	};
+	var jewelGraphics = self.attachAsset(jewelAssets[jewelType], {
+		anchorX: 0.5,
+		anchorY: 0.5
+	});
+	self.update = function () {
+		if (!self.isDragging && !self.matched) {
+			self.y += self.fallSpeed;
+		}
+	};
+	self.down = function (x, y, obj) {
+		self.isDragging = true;
+	};
+	self.up = function (x, y, obj) {
+		self.isDragging = false;
+	};
+	return self;
+});
+var TargetPair = Container.expand(function (jewelType, x, y) {
+	var self = Container.call(this);
+	self.jewelType = jewelType;
+	self.matched = false;
+	var targetAssets = {
+		'green': 'targetGreen',
+		'blue': 'targetBlue',
+		'lightBlue': 'targetLightBlue',
+		'purple': 'targetPurple',
+		'red': 'targetRed',
+		'yellow': 'targetYellow'
+	};
+	var targetGraphics = self.attachAsset(targetAssets[jewelType], {
+		anchorX: 0.5,
+		anchorY: 0.5
+	});
+	self.x = x;
+	self.y = y;
+	return self;
+});
+
+/**** 
 * Initialize Game
-****/
+****/ 
 var game = new LK.Game({
-	backgroundColor: 0x000000
-});
\ No newline at end of file
+	backgroundColor: 0x220044
+});
+
+/**** 
+* Game Code
+****/ 
+var jewelTypes = ['green', 'blue', 'lightBlue', 'purple', 'red', 'yellow'];
+var fallingJewels = [];
+var targetPairs = [];
+var currentLevel = 1;
+var maxLevels = 5;
+var jewelsMatched = 0;
+var jewelsNeededForLevel = 6;
+var spawnTimer = 0;
+var spawnDelay = 120;
+var draggedJewel = null;
+// Create level text
+var levelText = new Text2('Level 1', {
+	size: 100,
+	fill: 0xFFFFFF
+});
+levelText.anchor.set(0.5, 0);
+LK.gui.top.addChild(levelText);
+levelText.y = 50;
+// Create score text
+var scoreText = new Text2('Score: 0', {
+	size: 80,
+	fill: 0xFFFFFF
+});
+scoreText.anchor.set(1, 0);
+LK.gui.topRight.addChild(scoreText);
+scoreText.x = -20;
+scoreText.y = 20;
+// Create target pairs at bottom of screen
+function createTargetPairs() {
+	var spacing = 2048 / 6;
+	for (var i = 0; i < jewelTypes.length; i++) {
+		var target = new TargetPair(jewelTypes[i], (i + 0.5) * spacing, 2600);
+		targetPairs.push(target);
+		game.addChild(target);
+	}
+}
+// Spawn a random falling jewel
+function spawnJewel() {
+	var randomType = jewelTypes[Math.floor(Math.random() * jewelTypes.length)];
+	var jewel = new FallingJewel(randomType);
+	jewel.x = Math.random() * (2048 - 200) + 100;
+	jewel.y = -100;
+	jewel.fallSpeed = 3 + (currentLevel - 1) * 0.5;
+	fallingJewels.push(jewel);
+	game.addChild(jewel);
+}
+// Check for matches between jewels and targets
+function checkMatches() {
+	for (var i = fallingJewels.length - 1; i >= 0; i--) {
+		var jewel = fallingJewels[i];
+		// Check if jewel is off screen
+		if (jewel.y > 2800) {
+			jewel.destroy();
+			fallingJewels.splice(i, 1);
+			continue;
+		}
+		// Check for matches with target pairs
+		for (var j = 0; j < targetPairs.length; j++) {
+			var target = targetPairs[j];
+			if (jewel.jewelType === target.jewelType && jewel.intersects(target) && !jewel.matched) {
+				jewel.matched = true;
+				LK.setScore(LK.getScore() + 10);
+				scoreText.setText('Score: ' + LK.getScore());
+				jewelsMatched++;
+				// Flash effect
+				LK.effects.flashObject(target, 0xffffff, 500);
+				LK.getSound('match').play();
+				// Remove jewel
+				jewel.destroy();
+				fallingJewels.splice(i, 1);
+				// Check if level complete
+				if (jewelsMatched >= jewelsNeededForLevel) {
+					completeLevel();
+				}
+				break;
+			}
+		}
+	}
+}
+// Complete current level
+function completeLevel() {
+	LK.getSound('levelComplete').play();
+	currentLevel++;
+	jewelsMatched = 0;
+	if (currentLevel > maxLevels) {
+		// Game complete - PowerPuff Girls celebration
+		var celebrationText = new Text2('PowerPuff Girls Victory!\nYou saved the day!', {
+			size: 120,
+			fill: 0xFF69B4
+		});
+		celebrationText.anchor.set(0.5, 0.5);
+		celebrationText.x = 2048 / 2;
+		celebrationText.y = 2732 / 2;
+		game.addChild(celebrationText);
+		tween(celebrationText, {
+			scaleX: 1.2,
+			scaleY: 1.2
+		}, {
+			duration: 1000,
+			easing: tween.easeInOut,
+			onFinish: function onFinish() {
+				LK.showYouWin();
+			}
+		});
+	} else {
+		levelText.setText('Level ' + currentLevel);
+		spawnDelay = Math.max(60, spawnDelay - 10);
+	}
+}
+// Handle dragging
+function handleMove(x, y, obj) {
+	if (draggedJewel) {
+		draggedJewel.x = x;
+		draggedJewel.y = y;
+	}
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+	// Find closest jewel to touch point
+	var closestJewel = null;
+	var closestDistance = Infinity;
+	for (var i = 0; i < fallingJewels.length; i++) {
+		var jewel = fallingJewels[i];
+		var dx = jewel.x - x;
+		var dy = jewel.y - y;
+		var distance = Math.sqrt(dx * dx + dy * dy);
+		if (distance < closestDistance && distance < 100) {
+			closestDistance = distance;
+			closestJewel = jewel;
+		}
+	}
+	if (closestJewel) {
+		draggedJewel = closestJewel;
+		draggedJewel.isDragging = true;
+	}
+	handleMove(x, y, obj);
+};
+game.up = function (x, y, obj) {
+	if (draggedJewel) {
+		draggedJewel.isDragging = false;
+		draggedJewel = null;
+	}
+};
+// Initialize target pairs
+createTargetPairs();
+game.update = function () {
+	spawnTimer++;
+	// Spawn new jewels
+	if (spawnTimer >= spawnDelay) {
+		spawnJewel();
+		spawnTimer = 0;
+	}
+	// Check for matches and cleanup
+	checkMatches();
+};
\ No newline at end of file