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