Code edit (1 edits merged)
Please save this source code
User prompt
Powerpuff Ski Adventure
Initial prompt
Toca snowy mountain (December 2012-December 2021). The snowflakes are falling. And the powerpuff girls are skiing down the mountains. Tap on them to walk side ways like crabs, tap on them to watch them go down the mountain, to reach the small snow hill to go loop the loop, past the shops, past blossom’s house, after they reach to hit the playgroup 🏫
/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
var Landmark = Container.expand(function (type) {
	var self = Container.call(this);
	var landmarkGraphics = self.attachAsset(type, {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.type = type;
	self.passed = false;
	return self;
});
var Obstacle = Container.expand(function () {
	var self = Container.call(this);
	var obstacleGraphics = self.attachAsset('obstacle', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	return self;
});
var PowerpuffGirl = Container.expand(function (characterType) {
	var self = Container.call(this);
	var characterGraphics = self.attachAsset(characterType, {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 2;
	self.sidewaysSpeed = 0;
	self.acceleration = 0.1;
	self.isAccelerating = false;
	self.characterType = characterType;
	self.update = function () {
		// Move down the mountain
		self.y += self.speed;
		// Handle sideways movement
		if (self.sidewaysSpeed > 0) {
			self.x += self.sidewaysSpeed;
			self.sidewaysSpeed *= 0.95; // Gradual slowdown
		} else if (self.sidewaysSpeed < 0) {
			self.x += self.sidewaysSpeed;
			self.sidewaysSpeed *= 0.95;
		}
		// Handle acceleration
		if (self.isAccelerating) {
			self.speed += self.acceleration;
			if (self.speed > 8) self.speed = 8; // Max speed
		} else {
			if (self.speed > 2) {
				self.speed -= 0.05; // Gradual slowdown
			}
		}
		// Keep character within screen bounds
		if (self.x < 50) self.x = 50;
		if (self.x > 1998) self.x = 1998;
	};
	self.moveLeft = function () {
		self.sidewaysSpeed = -8;
		LK.getSound('swoosh').play();
	};
	self.moveRight = function () {
		self.sidewaysSpeed = 8;
		LK.getSound('swoosh').play();
	};
	self.accelerate = function () {
		self.isAccelerating = true;
	};
	self.stopAccelerate = function () {
		self.isAccelerating = false;
	};
	self.down = function (x, y, obj) {
		if (x < self.width / 2) {
			self.moveLeft();
		} else {
			self.moveRight();
		}
	};
	return self;
});
var Snowflake = Container.expand(function () {
	var self = Container.call(this);
	var snowflakeGraphics = self.attachAsset('snowflake', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = Math.random() * 2 + 1;
	self.drift = (Math.random() - 0.5) * 2;
	self.update = function () {
		self.y += self.speed;
		self.x += self.drift;
		if (self.y > 2800) {
			self.y = -50;
			self.x = Math.random() * 2048;
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87CEEB
});
/**** 
* Game Code
****/ 
// Game variables
var powerpuffGirls = [];
var snowflakes = [];
var obstacles = [];
var landmarks = [];
var gameStarted = false;
var allGirlsFinished = false;
var cameraY = 0;
var mountainLength = 4000;
// UI elements
var scoreTxt = new Text2('Distance: 0m', {
	size: 60,
	fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var instructionTxt = new Text2('Tap girls to move sideways, tap and hold to accelerate!', {
	size: 40,
	fill: 0xFFFFFF
});
instructionTxt.anchor.set(0.5, 0);
instructionTxt.x = LK.gui.center.x;
instructionTxt.y = 100;
LK.gui.center.addChild(instructionTxt);
// Create Powerpuff Girls
var blossom = game.addChild(new PowerpuffGirl('blossom'));
blossom.x = 500;
blossom.y = 200;
powerpuffGirls.push(blossom);
var bubbles = game.addChild(new PowerpuffGirl('bubbles'));
bubbles.x = 1024;
bubbles.y = 200;
powerpuffGirls.push(bubbles);
var buttercup = game.addChild(new PowerpuffGirl('buttercup'));
buttercup.x = 1500;
buttercup.y = 200;
powerpuffGirls.push(buttercup);
// Create snowflakes
for (var i = 0; i < 30; i++) {
	var snowflake = game.addChild(new Snowflake());
	snowflake.x = Math.random() * 2048;
	snowflake.y = Math.random() * 2732;
	snowflakes.push(snowflake);
}
// Create landmarks along the mountain
var landmarkPositions = [{
	type: 'hill',
	x: 300,
	y: 800
}, {
	type: 'shop',
	x: 1200,
	y: 1200
}, {
	type: 'hill',
	x: 800,
	y: 1600
}, {
	type: 'house',
	x: 1600,
	y: 2000
}, {
	type: 'hill',
	x: 400,
	y: 2400
}, {
	type: 'shop',
	x: 1000,
	y: 2800
}, {
	type: 'playgroup',
	x: 1024,
	y: 3600
}];
for (var i = 0; i < landmarkPositions.length; i++) {
	var landmark = game.addChild(new Landmark(landmarkPositions[i].type));
	landmark.x = landmarkPositions[i].x;
	landmark.y = landmarkPositions[i].y;
	landmarks.push(landmark);
}
// Create obstacles
var obstaclePositions = [{
	x: 600,
	y: 1000
}, {
	x: 1400,
	y: 1400
}, {
	x: 200,
	y: 1800
}, {
	x: 1800,
	y: 2200
}, {
	x: 700,
	y: 2600
}, {
	x: 1300,
	y: 3000
}];
for (var i = 0; i < obstaclePositions.length; i++) {
	var obstacle = game.addChild(new Obstacle());
	obstacle.x = obstaclePositions[i].x;
	obstacle.y = obstaclePositions[i].y;
	obstacles.push(obstacle);
}
// Game input handling
var acceleratingGirls = [];
game.down = function (x, y, obj) {
	// Check if tapping on a girl for acceleration
	for (var i = 0; i < powerpuffGirls.length; i++) {
		var girl = powerpuffGirls[i];
		var localPos = girl.toLocal({
			x: x,
			y: y
		});
		if (Math.abs(localPos.x) < 40 && Math.abs(localPos.y) < 40) {
			girl.accelerate();
			if (acceleratingGirls.indexOf(girl) === -1) {
				acceleratingGirls.push(girl);
			}
			return;
		}
	}
};
game.up = function (x, y, obj) {
	// Stop acceleration for all girls
	for (var i = 0; i < acceleratingGirls.length; i++) {
		acceleratingGirls[i].stopAccelerate();
	}
	acceleratingGirls = [];
};
// Main game loop
game.update = function () {
	if (!gameStarted) {
		gameStarted = true;
		// Hide instruction after 3 seconds
		LK.setTimeout(function () {
			if (instructionTxt.parent) {
				instructionTxt.parent.removeChild(instructionTxt);
			}
		}, 3000);
	}
	// Calculate camera position based on the leading girl
	var leadingY = Math.max(blossom.y, bubbles.y, buttercup.y);
	cameraY = leadingY - 400;
	// Update camera position
	game.y = -cameraY;
	// Update distance score
	var distance = Math.floor(leadingY / 10);
	scoreTxt.setText('Distance: ' + distance + 'm');
	// Check collisions with obstacles
	for (var i = 0; i < powerpuffGirls.length; i++) {
		var girl = powerpuffGirls[i];
		for (var j = 0; j < obstacles.length; j++) {
			var obstacle = obstacles[j];
			if (girl.intersects(obstacle)) {
				// Slow down the girl when hitting obstacle
				girl.speed = Math.max(1, girl.speed - 1);
				LK.effects.flashObject(girl, 0xFF0000, 500);
			}
		}
	}
	// Check if girls reached landmarks
	for (var i = 0; i < landmarks.length; i++) {
		var landmark = landmarks[i];
		if (!landmark.passed) {
			for (var j = 0; j < powerpuffGirls.length; j++) {
				var girl = powerpuffGirls[j];
				if (girl.intersects(landmark)) {
					landmark.passed = true;
					LK.setScore(LK.getScore() + 10);
					LK.getSound('collect').play();
					if (landmark.type === 'playgroup') {
						// Check if all girls reached the playgroup
						var allReached = true;
						for (var k = 0; k < powerpuffGirls.length; k++) {
							if (!powerpuffGirls[k].intersects(landmark)) {
								allReached = false;
								break;
							}
						}
						if (allReached && !allGirlsFinished) {
							allGirlsFinished = true;
							LK.setTimeout(function () {
								LK.showYouWin();
							}, 1000);
						}
					}
					break;
				}
			}
		}
	}
	// Check if any girl went too far off course
	for (var i = 0; i < powerpuffGirls.length; i++) {
		var girl = powerpuffGirls[i];
		if (girl.y > mountainLength + 500) {
			LK.showGameOver();
			return;
		}
	}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,316 @@
-/****
+/**** 
+* Plugins
+****/ 
+var tween = LK.import("@upit/tween.v1");
+
+/**** 
+* Classes
+****/ 
+var Landmark = Container.expand(function (type) {
+	var self = Container.call(this);
+	var landmarkGraphics = self.attachAsset(type, {
+		anchorX: 0.5,
+		anchorY: 0.5
+	});
+	self.type = type;
+	self.passed = false;
+	return self;
+});
+var Obstacle = Container.expand(function () {
+	var self = Container.call(this);
+	var obstacleGraphics = self.attachAsset('obstacle', {
+		anchorX: 0.5,
+		anchorY: 0.5
+	});
+	return self;
+});
+var PowerpuffGirl = Container.expand(function (characterType) {
+	var self = Container.call(this);
+	var characterGraphics = self.attachAsset(characterType, {
+		anchorX: 0.5,
+		anchorY: 0.5
+	});
+	self.speed = 2;
+	self.sidewaysSpeed = 0;
+	self.acceleration = 0.1;
+	self.isAccelerating = false;
+	self.characterType = characterType;
+	self.update = function () {
+		// Move down the mountain
+		self.y += self.speed;
+		// Handle sideways movement
+		if (self.sidewaysSpeed > 0) {
+			self.x += self.sidewaysSpeed;
+			self.sidewaysSpeed *= 0.95; // Gradual slowdown
+		} else if (self.sidewaysSpeed < 0) {
+			self.x += self.sidewaysSpeed;
+			self.sidewaysSpeed *= 0.95;
+		}
+		// Handle acceleration
+		if (self.isAccelerating) {
+			self.speed += self.acceleration;
+			if (self.speed > 8) self.speed = 8; // Max speed
+		} else {
+			if (self.speed > 2) {
+				self.speed -= 0.05; // Gradual slowdown
+			}
+		}
+		// Keep character within screen bounds
+		if (self.x < 50) self.x = 50;
+		if (self.x > 1998) self.x = 1998;
+	};
+	self.moveLeft = function () {
+		self.sidewaysSpeed = -8;
+		LK.getSound('swoosh').play();
+	};
+	self.moveRight = function () {
+		self.sidewaysSpeed = 8;
+		LK.getSound('swoosh').play();
+	};
+	self.accelerate = function () {
+		self.isAccelerating = true;
+	};
+	self.stopAccelerate = function () {
+		self.isAccelerating = false;
+	};
+	self.down = function (x, y, obj) {
+		if (x < self.width / 2) {
+			self.moveLeft();
+		} else {
+			self.moveRight();
+		}
+	};
+	return self;
+});
+var Snowflake = Container.expand(function () {
+	var self = Container.call(this);
+	var snowflakeGraphics = self.attachAsset('snowflake', {
+		anchorX: 0.5,
+		anchorY: 0.5
+	});
+	self.speed = Math.random() * 2 + 1;
+	self.drift = (Math.random() - 0.5) * 2;
+	self.update = function () {
+		self.y += self.speed;
+		self.x += self.drift;
+		if (self.y > 2800) {
+			self.y = -50;
+			self.x = Math.random() * 2048;
+		}
+	};
+	return self;
+});
+
+/**** 
 * Initialize Game
-****/
+****/ 
 var game = new LK.Game({
-	backgroundColor: 0x000000
-});
\ No newline at end of file
+	backgroundColor: 0x87CEEB
+});
+
+/**** 
+* Game Code
+****/ 
+// Game variables
+var powerpuffGirls = [];
+var snowflakes = [];
+var obstacles = [];
+var landmarks = [];
+var gameStarted = false;
+var allGirlsFinished = false;
+var cameraY = 0;
+var mountainLength = 4000;
+// UI elements
+var scoreTxt = new Text2('Distance: 0m', {
+	size: 60,
+	fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+var instructionTxt = new Text2('Tap girls to move sideways, tap and hold to accelerate!', {
+	size: 40,
+	fill: 0xFFFFFF
+});
+instructionTxt.anchor.set(0.5, 0);
+instructionTxt.x = LK.gui.center.x;
+instructionTxt.y = 100;
+LK.gui.center.addChild(instructionTxt);
+// Create Powerpuff Girls
+var blossom = game.addChild(new PowerpuffGirl('blossom'));
+blossom.x = 500;
+blossom.y = 200;
+powerpuffGirls.push(blossom);
+var bubbles = game.addChild(new PowerpuffGirl('bubbles'));
+bubbles.x = 1024;
+bubbles.y = 200;
+powerpuffGirls.push(bubbles);
+var buttercup = game.addChild(new PowerpuffGirl('buttercup'));
+buttercup.x = 1500;
+buttercup.y = 200;
+powerpuffGirls.push(buttercup);
+// Create snowflakes
+for (var i = 0; i < 30; i++) {
+	var snowflake = game.addChild(new Snowflake());
+	snowflake.x = Math.random() * 2048;
+	snowflake.y = Math.random() * 2732;
+	snowflakes.push(snowflake);
+}
+// Create landmarks along the mountain
+var landmarkPositions = [{
+	type: 'hill',
+	x: 300,
+	y: 800
+}, {
+	type: 'shop',
+	x: 1200,
+	y: 1200
+}, {
+	type: 'hill',
+	x: 800,
+	y: 1600
+}, {
+	type: 'house',
+	x: 1600,
+	y: 2000
+}, {
+	type: 'hill',
+	x: 400,
+	y: 2400
+}, {
+	type: 'shop',
+	x: 1000,
+	y: 2800
+}, {
+	type: 'playgroup',
+	x: 1024,
+	y: 3600
+}];
+for (var i = 0; i < landmarkPositions.length; i++) {
+	var landmark = game.addChild(new Landmark(landmarkPositions[i].type));
+	landmark.x = landmarkPositions[i].x;
+	landmark.y = landmarkPositions[i].y;
+	landmarks.push(landmark);
+}
+// Create obstacles
+var obstaclePositions = [{
+	x: 600,
+	y: 1000
+}, {
+	x: 1400,
+	y: 1400
+}, {
+	x: 200,
+	y: 1800
+}, {
+	x: 1800,
+	y: 2200
+}, {
+	x: 700,
+	y: 2600
+}, {
+	x: 1300,
+	y: 3000
+}];
+for (var i = 0; i < obstaclePositions.length; i++) {
+	var obstacle = game.addChild(new Obstacle());
+	obstacle.x = obstaclePositions[i].x;
+	obstacle.y = obstaclePositions[i].y;
+	obstacles.push(obstacle);
+}
+// Game input handling
+var acceleratingGirls = [];
+game.down = function (x, y, obj) {
+	// Check if tapping on a girl for acceleration
+	for (var i = 0; i < powerpuffGirls.length; i++) {
+		var girl = powerpuffGirls[i];
+		var localPos = girl.toLocal({
+			x: x,
+			y: y
+		});
+		if (Math.abs(localPos.x) < 40 && Math.abs(localPos.y) < 40) {
+			girl.accelerate();
+			if (acceleratingGirls.indexOf(girl) === -1) {
+				acceleratingGirls.push(girl);
+			}
+			return;
+		}
+	}
+};
+game.up = function (x, y, obj) {
+	// Stop acceleration for all girls
+	for (var i = 0; i < acceleratingGirls.length; i++) {
+		acceleratingGirls[i].stopAccelerate();
+	}
+	acceleratingGirls = [];
+};
+// Main game loop
+game.update = function () {
+	if (!gameStarted) {
+		gameStarted = true;
+		// Hide instruction after 3 seconds
+		LK.setTimeout(function () {
+			if (instructionTxt.parent) {
+				instructionTxt.parent.removeChild(instructionTxt);
+			}
+		}, 3000);
+	}
+	// Calculate camera position based on the leading girl
+	var leadingY = Math.max(blossom.y, bubbles.y, buttercup.y);
+	cameraY = leadingY - 400;
+	// Update camera position
+	game.y = -cameraY;
+	// Update distance score
+	var distance = Math.floor(leadingY / 10);
+	scoreTxt.setText('Distance: ' + distance + 'm');
+	// Check collisions with obstacles
+	for (var i = 0; i < powerpuffGirls.length; i++) {
+		var girl = powerpuffGirls[i];
+		for (var j = 0; j < obstacles.length; j++) {
+			var obstacle = obstacles[j];
+			if (girl.intersects(obstacle)) {
+				// Slow down the girl when hitting obstacle
+				girl.speed = Math.max(1, girl.speed - 1);
+				LK.effects.flashObject(girl, 0xFF0000, 500);
+			}
+		}
+	}
+	// Check if girls reached landmarks
+	for (var i = 0; i < landmarks.length; i++) {
+		var landmark = landmarks[i];
+		if (!landmark.passed) {
+			for (var j = 0; j < powerpuffGirls.length; j++) {
+				var girl = powerpuffGirls[j];
+				if (girl.intersects(landmark)) {
+					landmark.passed = true;
+					LK.setScore(LK.getScore() + 10);
+					LK.getSound('collect').play();
+					if (landmark.type === 'playgroup') {
+						// Check if all girls reached the playgroup
+						var allReached = true;
+						for (var k = 0; k < powerpuffGirls.length; k++) {
+							if (!powerpuffGirls[k].intersects(landmark)) {
+								allReached = false;
+								break;
+							}
+						}
+						if (allReached && !allGirlsFinished) {
+							allGirlsFinished = true;
+							LK.setTimeout(function () {
+								LK.showYouWin();
+							}, 1000);
+						}
+					}
+					break;
+				}
+			}
+		}
+	}
+	// Check if any girl went too far off course
+	for (var i = 0; i < powerpuffGirls.length; i++) {
+		var girl = powerpuffGirls[i];
+		if (girl.y > mountainLength + 500) {
+			LK.showGameOver();
+			return;
+		}
+	}
+};
\ No newline at end of file