Code edit (1 edits merged)
Please save this source code
User prompt
Shake & Drop: Food Fall Challenge
Initial prompt
Toca food fall (2005). The powerpuff girls do not eat anything. Level 1 cauliflower and cabbage shake your device 10 times to make cauliflower and cabbage fall, level 2 baked beans shake your device 10 times to make baked beans fall, level 3 bananas shake your device 10 times to make the bananas fall, level 4 oranges shake your device 10 times to make the oranges fall, or level 5 apples shake your device 10 times to make the green apples fall
/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/**** 
* Classes
****/ 
var Basket = Container.expand(function () {
	var self = Container.call(this);
	var basketGraphics = self.attachAsset('basket', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.targetX = 2048 / 2;
	self.update = function () {
		var diff = self.targetX - self.x;
		self.x += diff * 0.1;
	};
	return self;
});
var FoodItem = Container.expand(function (foodType) {
	var self = Container.call(this);
	self.foodType = foodType;
	self.speed = Math.random() * 3 + 2;
	self.rotationSpeed = (Math.random() - 0.5) * 0.1;
	self.collected = false;
	var foodGraphics = self.attachAsset(foodType, {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.update = function () {
		if (!self.collected) {
			self.y += self.speed;
			self.rotation += self.rotationSpeed;
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87CEEB
});
/**** 
* Game Code
****/ 
var currentLevel = 1;
var shakeCount = 0;
var requiredShakes = 10;
var foodItems = [];
var basket;
var lastAcceleration = 0;
var shakeThreshold = 15;
var levelFoodTypes = {
	1: ['cauliflower', 'cabbage'],
	2: ['bakedBean'],
	3: ['banana'],
	4: ['orange'],
	5: ['greenApple']
};
var levelNames = {
	1: 'Vegetables',
	2: 'Baked Beans',
	3: 'Bananas',
	4: 'Oranges',
	5: 'Green Apples'
};
// UI Elements
var levelText = new Text2('Level 1: Vegetables', {
	size: 80,
	fill: '#FFFFFF'
});
levelText.anchor.set(0.5, 0);
LK.gui.top.addChild(levelText);
levelText.y = 120;
var shakeText = new Text2('Shake Count: 0/10', {
	size: 60,
	fill: '#FFFFFF'
});
shakeText.anchor.set(0.5, 0);
LK.gui.top.addChild(shakeText);
shakeText.y = 220;
var instructionText = new Text2('Shake your device to make food fall!', {
	size: 50,
	fill: '#FFFF00'
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
instructionText.y = 300;
// Create basket
basket = game.addChild(new Basket());
basket.x = 2048 / 2;
basket.y = 2732 - 200;
// Load saved level
var savedLevel = storage.currentLevel || 1;
if (savedLevel > 1) {
	currentLevel = savedLevel;
	updateLevelUI();
}
function updateLevelUI() {
	levelText.setText('Level ' + currentLevel + ': ' + levelNames[currentLevel]);
	shakeText.setText('Shake Count: ' + shakeCount + '/' + requiredShakes);
}
function detectShake() {
	// Simple shake detection using device motion simulation
	var currentTime = Date.now();
	var acceleration = Math.abs(Math.sin(currentTime * 0.01)) * 20;
	if (acceleration > shakeThreshold && lastAcceleration <= shakeThreshold) {
		shakeCount++;
		LK.getSound('shakeSound').play();
		updateLevelUI();
		if (shakeCount >= requiredShakes) {
			triggerFoodDrop();
		}
	}
	lastAcceleration = acceleration;
}
function triggerFoodDrop() {
	var foodTypes = levelFoodTypes[currentLevel];
	for (var i = 0; i < 15; i++) {
		var randomFoodType = foodTypes[Math.floor(Math.random() * foodTypes.length)];
		var foodItem = new FoodItem(randomFoodType);
		foodItem.x = Math.random() * 1800 + 124;
		foodItem.y = -100 - Math.random() * 200;
		foodItems.push(foodItem);
		game.addChild(foodItem);
	}
}
function checkCollisions() {
	for (var i = foodItems.length - 1; i >= 0; i--) {
		var food = foodItems[i];
		if (food.collected) continue;
		if (food.intersects(basket)) {
			food.collected = true;
			LK.getSound('collectFood').play();
			LK.setScore(LK.getScore() + 10);
			// Visual feedback
			tween(food, {
				alpha: 0,
				scaleX: 1.5,
				scaleY: 1.5
			}, {
				duration: 300,
				onFinish: function onFinish() {
					food.destroy();
				}
			});
			foodItems.splice(i, 1);
			// Check if enough food collected for level completion
			if (LK.getScore() >= currentLevel * 50) {
				completeLevel();
			}
		} else if (food.y > 2732 + 100) {
			// Remove food that fell off screen
			food.destroy();
			foodItems.splice(i, 1);
		}
	}
}
function completeLevel() {
	LK.getSound('levelComplete').play();
	// Flash screen green
	LK.effects.flashScreen(0x00FF00, 800);
	currentLevel++;
	shakeCount = 0;
	// Save progress
	storage.currentLevel = currentLevel;
	if (currentLevel > 5) {
		// Game completed
		LK.showYouWin();
	} else {
		updateLevelUI();
		// Clear remaining food items
		for (var i = foodItems.length - 1; i >= 0; i--) {
			foodItems[i].destroy();
		}
		foodItems = [];
		// Show level complete message temporarily
		var levelCompleteText = new Text2('Level Complete!', {
			size: 100,
			fill: '#00FF00'
		});
		levelCompleteText.anchor.set(0.5, 0.5);
		levelCompleteText.x = 2048 / 2;
		levelCompleteText.y = 2732 / 2;
		game.addChild(levelCompleteText);
		tween(levelCompleteText, {
			alpha: 0
		}, {
			duration: 2000,
			onFinish: function onFinish() {
				levelCompleteText.destroy();
			}
		});
	}
}
// Touch controls for basket movement
game.move = function (x, y, obj) {
	basket.targetX = x;
};
game.down = function (x, y, obj) {
	basket.targetX = x;
};
// Alternative shake trigger for testing/accessibility
game.up = function (x, y, obj) {
	if (y < 400) {
		// Tap top of screen to simulate shake
		shakeCount++;
		LK.getSound('shakeSound').play();
		updateLevelUI();
		if (shakeCount >= requiredShakes) {
			triggerFoodDrop();
		}
	}
};
game.update = function () {
	detectShake();
	checkCollisions();
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,224 @@
-/****
+/**** 
+* Plugins
+****/ 
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/**** 
+* Classes
+****/ 
+var Basket = Container.expand(function () {
+	var self = Container.call(this);
+	var basketGraphics = self.attachAsset('basket', {
+		anchorX: 0.5,
+		anchorY: 0.5
+	});
+	self.targetX = 2048 / 2;
+	self.update = function () {
+		var diff = self.targetX - self.x;
+		self.x += diff * 0.1;
+	};
+	return self;
+});
+var FoodItem = Container.expand(function (foodType) {
+	var self = Container.call(this);
+	self.foodType = foodType;
+	self.speed = Math.random() * 3 + 2;
+	self.rotationSpeed = (Math.random() - 0.5) * 0.1;
+	self.collected = false;
+	var foodGraphics = self.attachAsset(foodType, {
+		anchorX: 0.5,
+		anchorY: 0.5
+	});
+	self.update = function () {
+		if (!self.collected) {
+			self.y += self.speed;
+			self.rotation += self.rotationSpeed;
+		}
+	};
+	return self;
+});
+
+/**** 
 * Initialize Game
-****/
+****/ 
 var game = new LK.Game({
-	backgroundColor: 0x000000
-});
\ No newline at end of file
+	backgroundColor: 0x87CEEB
+});
+
+/**** 
+* Game Code
+****/ 
+var currentLevel = 1;
+var shakeCount = 0;
+var requiredShakes = 10;
+var foodItems = [];
+var basket;
+var lastAcceleration = 0;
+var shakeThreshold = 15;
+var levelFoodTypes = {
+	1: ['cauliflower', 'cabbage'],
+	2: ['bakedBean'],
+	3: ['banana'],
+	4: ['orange'],
+	5: ['greenApple']
+};
+var levelNames = {
+	1: 'Vegetables',
+	2: 'Baked Beans',
+	3: 'Bananas',
+	4: 'Oranges',
+	5: 'Green Apples'
+};
+// UI Elements
+var levelText = new Text2('Level 1: Vegetables', {
+	size: 80,
+	fill: '#FFFFFF'
+});
+levelText.anchor.set(0.5, 0);
+LK.gui.top.addChild(levelText);
+levelText.y = 120;
+var shakeText = new Text2('Shake Count: 0/10', {
+	size: 60,
+	fill: '#FFFFFF'
+});
+shakeText.anchor.set(0.5, 0);
+LK.gui.top.addChild(shakeText);
+shakeText.y = 220;
+var instructionText = new Text2('Shake your device to make food fall!', {
+	size: 50,
+	fill: '#FFFF00'
+});
+instructionText.anchor.set(0.5, 0);
+LK.gui.top.addChild(instructionText);
+instructionText.y = 300;
+// Create basket
+basket = game.addChild(new Basket());
+basket.x = 2048 / 2;
+basket.y = 2732 - 200;
+// Load saved level
+var savedLevel = storage.currentLevel || 1;
+if (savedLevel > 1) {
+	currentLevel = savedLevel;
+	updateLevelUI();
+}
+function updateLevelUI() {
+	levelText.setText('Level ' + currentLevel + ': ' + levelNames[currentLevel]);
+	shakeText.setText('Shake Count: ' + shakeCount + '/' + requiredShakes);
+}
+function detectShake() {
+	// Simple shake detection using device motion simulation
+	var currentTime = Date.now();
+	var acceleration = Math.abs(Math.sin(currentTime * 0.01)) * 20;
+	if (acceleration > shakeThreshold && lastAcceleration <= shakeThreshold) {
+		shakeCount++;
+		LK.getSound('shakeSound').play();
+		updateLevelUI();
+		if (shakeCount >= requiredShakes) {
+			triggerFoodDrop();
+		}
+	}
+	lastAcceleration = acceleration;
+}
+function triggerFoodDrop() {
+	var foodTypes = levelFoodTypes[currentLevel];
+	for (var i = 0; i < 15; i++) {
+		var randomFoodType = foodTypes[Math.floor(Math.random() * foodTypes.length)];
+		var foodItem = new FoodItem(randomFoodType);
+		foodItem.x = Math.random() * 1800 + 124;
+		foodItem.y = -100 - Math.random() * 200;
+		foodItems.push(foodItem);
+		game.addChild(foodItem);
+	}
+}
+function checkCollisions() {
+	for (var i = foodItems.length - 1; i >= 0; i--) {
+		var food = foodItems[i];
+		if (food.collected) continue;
+		if (food.intersects(basket)) {
+			food.collected = true;
+			LK.getSound('collectFood').play();
+			LK.setScore(LK.getScore() + 10);
+			// Visual feedback
+			tween(food, {
+				alpha: 0,
+				scaleX: 1.5,
+				scaleY: 1.5
+			}, {
+				duration: 300,
+				onFinish: function onFinish() {
+					food.destroy();
+				}
+			});
+			foodItems.splice(i, 1);
+			// Check if enough food collected for level completion
+			if (LK.getScore() >= currentLevel * 50) {
+				completeLevel();
+			}
+		} else if (food.y > 2732 + 100) {
+			// Remove food that fell off screen
+			food.destroy();
+			foodItems.splice(i, 1);
+		}
+	}
+}
+function completeLevel() {
+	LK.getSound('levelComplete').play();
+	// Flash screen green
+	LK.effects.flashScreen(0x00FF00, 800);
+	currentLevel++;
+	shakeCount = 0;
+	// Save progress
+	storage.currentLevel = currentLevel;
+	if (currentLevel > 5) {
+		// Game completed
+		LK.showYouWin();
+	} else {
+		updateLevelUI();
+		// Clear remaining food items
+		for (var i = foodItems.length - 1; i >= 0; i--) {
+			foodItems[i].destroy();
+		}
+		foodItems = [];
+		// Show level complete message temporarily
+		var levelCompleteText = new Text2('Level Complete!', {
+			size: 100,
+			fill: '#00FF00'
+		});
+		levelCompleteText.anchor.set(0.5, 0.5);
+		levelCompleteText.x = 2048 / 2;
+		levelCompleteText.y = 2732 / 2;
+		game.addChild(levelCompleteText);
+		tween(levelCompleteText, {
+			alpha: 0
+		}, {
+			duration: 2000,
+			onFinish: function onFinish() {
+				levelCompleteText.destroy();
+			}
+		});
+	}
+}
+// Touch controls for basket movement
+game.move = function (x, y, obj) {
+	basket.targetX = x;
+};
+game.down = function (x, y, obj) {
+	basket.targetX = x;
+};
+// Alternative shake trigger for testing/accessibility
+game.up = function (x, y, obj) {
+	if (y < 400) {
+		// Tap top of screen to simulate shake
+		shakeCount++;
+		LK.getSound('shakeSound').play();
+		updateLevelUI();
+		if (shakeCount >= requiredShakes) {
+			triggerFoodDrop();
+		}
+	}
+};
+game.update = function () {
+	detectShake();
+	checkCollisions();
+};
\ No newline at end of file