/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var AutoClickerFinger = Container.expand(function () { var self = Container.call(this); var fingerGraphics = self.attachAsset('autoClickerFinger', { anchorX: 0.5, anchorY: 1 }); self.clickTimer = 0; self.clickInterval = 600; // 10 seconds at 60fps self.update = function () { self.clickTimer++; if (self.clickTimer >= self.clickInterval) { self.clickTimer = 0; // Trigger auto click if (typeof autoClickBall === 'function') { autoClickBall(); } } }; return self; }); var Basket = Container.expand(function () { var self = Container.call(this); var basketGraphics = self.attachAsset('basket', { anchorX: 0.5, anchorY: 0.5 }); self.direction = 1; self.baseSpeed = 2; self.speedMultiplier = 1; self.update = function () { self.x += self.direction * self.baseSpeed * self.speedMultiplier; if (self.x <= 90 || self.x >= 2048 - 90) { self.direction *= -1; } }; return self; }); var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.fallSpeed = 2 + Math.random() * 1.5; self.collected = false; self.swayDirection = Math.random() > 0.5 ? 1 : -1; self.swaySpeed = 0.5 + Math.random() * 1; self.swayAmount = 20 + Math.random() * 30; self.rotationSpeed = (Math.random() - 0.5) * 0.1; self.startX = 0; self.swayTime = 0; self.update = function () { if (!self.collected) { self.y += self.fallSpeed; // Add swaying motion like paper money self.swayTime += self.swaySpeed; var swayOffset = Math.sin(self.swayTime * 0.05) * self.swayAmount; self.x = self.startX + swayOffset; // Add rotation for realistic paper motion coinGraphics.rotation += self.rotationSpeed; // Slight deceleration as it falls (air resistance) if (self.fallSpeed > 1) { self.fallSpeed *= 0.999; } } }; return self; }); var UpgradeButton = Container.expand(function (text, cost) { var self = Container.call(this); var buttonGraphics = self.attachAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5 }); self.buttonText = new Text2(text + '\n' + cost + ' coins', { size: 24, fill: 0xFFFFFF }); self.buttonText.anchor.set(0.5, 0.5); self.addChild(self.buttonText); self.cost = cost; self.upgradeText = text; self.updateButton = function (newCost) { self.cost = newCost; self.buttonText.setText(self.upgradeText + '\n' + self.cost + ' coins'); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87ceeb }); /**** * Game Code ****/ // Game variables var clickCount = 0; var coinCount = 0; var autoClickerLevel = 0; var basketSpeedLevel = 0; var coins = []; var autoClickerFingers = []; // Create central ball var centralBall = game.addChild(LK.getAsset('centralBall', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 3 })); // Create counter text above basket var counterText = new Text2('0', { size: 48, fill: 0x000000 }); counterText.anchor.set(0.5, 1); game.addChild(counterText); // Create basket var basket = game.addChild(new Basket()); basket.x = 2048 / 2; basket.y = 2732 - 150; basket.speedMultiplier = 1 + basketSpeedLevel * 0.5; // Position counter text above basket counterText.x = basket.x; counterText.y = basket.y - 50; // Create coin counter display below basket var coinDisplay = new Text2('Coins: ' + coinCount, { size: 36, fill: 0x000000 }); coinDisplay.anchor.set(0.5, 0); coinDisplay.x = basket.x; coinDisplay.y = basket.y + 50; game.addChild(coinDisplay); // Create upgrade buttons var autoClickerButton = game.addChild(new UpgradeButton('Auto-Clicker', 25)); autoClickerButton.x = 2048 / 2 - 160; autoClickerButton.y = 2732 - 300; var basketButton = game.addChild(new UpgradeButton('Faster Basket', 50)); basketButton.x = 2048 / 2 + 160; basketButton.y = 2732 - 300; // Create auto-clicker fingers based on saved level for (var i = 0; i < autoClickerLevel; i++) { var finger = game.addChild(new AutoClickerFinger()); // Position fingers in a circle around the central ball var angle = i / Math.max(1, autoClickerLevel) * 2 * Math.PI; var radius = 150; finger.x = centralBall.x + Math.cos(angle) * radius; finger.y = centralBall.y + Math.sin(angle) * radius; autoClickerFingers.push(finger); } // Update upgrade button costs function updateUpgradeButtons() { var autoClickerCost = 25 + autoClickerLevel * 15; var basketCost = 50 + basketSpeedLevel * 25; autoClickerButton.updateButton(autoClickerCost); basketButton.updateButton(basketCost); } // Auto click function function autoClickBall() { clickCount++; counterText.setText(clickCount.toString()); // Create coin drop createCoinDrop(); // Play sound LK.getSound('ballClick').play(); // Visual feedback tween(centralBall, { scaleX: 1.1, scaleY: 1.1 }, { duration: 100, onFinish: function onFinish() { tween(centralBall, { scaleX: 1, scaleY: 1 }, { duration: 100 }); } }); // Animate all auto-clicker fingers for (var f = 0; f < autoClickerFingers.length; f++) { var finger = autoClickerFingers[f]; tween(finger, { scaleX: 1.2, scaleY: 1.2 }, { duration: 150, onFinish: function onFinish() { tween(finger, { scaleX: 1, scaleY: 1 }, { duration: 150 }); } }); } } // Create falling coin function createCoinDrop() { var coin = new Coin(); coin.x = Math.random() * (2048 - 100) + 50; coin.startX = coin.x; // Store starting position for sway physics coin.y = -50; coins.push(coin); game.addChild(coin); } // Ball click handler centralBall.down = function (x, y, obj) { clickCount++; counterText.setText(clickCount.toString()); // Create coin drop createCoinDrop(); // Play sound LK.getSound('ballClick').play(); // Visual feedback tween(centralBall, { scaleX: 1.1, scaleY: 1.1 }, { duration: 100, onFinish: function onFinish() { tween(centralBall, { scaleX: 1, scaleY: 1 }, { duration: 100 }); } }); }; // Upgrade button handlers autoClickerButton.down = function (x, y, obj) { var cost = 25 + autoClickerLevel * 15; if (coinCount >= cost) { coinCount -= cost; autoClickerLevel++; // Create new auto-clicker finger var finger = game.addChild(new AutoClickerFinger()); // Position new finger in circle formation var angle = (autoClickerLevel - 1) / autoClickerLevel * 2 * Math.PI; var radius = 150; finger.x = centralBall.x + Math.cos(angle) * radius; finger.y = centralBall.y + Math.sin(angle) * radius; autoClickerFingers.push(finger); // Reposition all existing fingers to maintain circle formation for (var f = 0; f < autoClickerFingers.length; f++) { var existingFinger = autoClickerFingers[f]; var fingerAngle = f / autoClickerLevel * 2 * Math.PI; tween(existingFinger, { x: centralBall.x + Math.cos(fingerAngle) * radius, y: centralBall.y + Math.sin(fingerAngle) * radius }, { duration: 300, easing: tween.easeOut }); } // Update displays coinDisplay.setText('Coins: ' + coinCount); updateUpgradeButtons(); // Play sound LK.getSound('upgrade').play(); // Visual feedback LK.effects.flashObject(autoClickerButton, 0x00ff00, 300); } }; basketButton.down = function (x, y, obj) { var cost = 50 + basketSpeedLevel * 25; if (coinCount >= cost) { coinCount -= cost; basketSpeedLevel++; basket.speedMultiplier = 1 + basketSpeedLevel * 0.5; // Update displays coinDisplay.setText('Coins: ' + coinCount); updateUpgradeButtons(); // Play sound LK.getSound('upgrade').play(); // Visual feedback LK.effects.flashObject(basketButton, 0x00ff00, 300); } }; // Create test button for 10,000 points var testButton = game.addChild(new UpgradeButton('TEST +10K', 0)); testButton.x = 2048 / 2; testButton.y = 2732 - 450; // Test button handler testButton.down = function (x, y, obj) { coinCount += 10000; coinDisplay.setText('Coins: ' + coinCount); // Update upgrade buttons in case new coins unlock upgrades updateUpgradeButtons(); // Visual feedback LK.effects.flashObject(testButton, 0xffff00, 500); }; // Initialize upgrade buttons updateUpgradeButtons(); // Main game update loop game.update = function () { // Update coins for (var i = coins.length - 1; i >= 0; i--) { var coin = coins[i]; if (coin.lastY === undefined) coin.lastY = coin.y; // Check if coin fell off screen if (coin.lastY <= 2732 && coin.y > 2732) { coin.destroy(); coins.splice(i, 1); continue; } // Check collision with basket if (!coin.collected && coin.intersects(basket)) { coin.collected = true; coinCount++; coinDisplay.setText('Coins: ' + coinCount); // Play sound LK.getSound('coinCollect').play(); // Remove coin coin.destroy(); coins.splice(i, 1); continue; } coin.lastY = coin.y; } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var AutoClickerFinger = Container.expand(function () {
var self = Container.call(this);
var fingerGraphics = self.attachAsset('autoClickerFinger', {
anchorX: 0.5,
anchorY: 1
});
self.clickTimer = 0;
self.clickInterval = 600; // 10 seconds at 60fps
self.update = function () {
self.clickTimer++;
if (self.clickTimer >= self.clickInterval) {
self.clickTimer = 0;
// Trigger auto click
if (typeof autoClickBall === 'function') {
autoClickBall();
}
}
};
return self;
});
var Basket = Container.expand(function () {
var self = Container.call(this);
var basketGraphics = self.attachAsset('basket', {
anchorX: 0.5,
anchorY: 0.5
});
self.direction = 1;
self.baseSpeed = 2;
self.speedMultiplier = 1;
self.update = function () {
self.x += self.direction * self.baseSpeed * self.speedMultiplier;
if (self.x <= 90 || self.x >= 2048 - 90) {
self.direction *= -1;
}
};
return self;
});
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.fallSpeed = 2 + Math.random() * 1.5;
self.collected = false;
self.swayDirection = Math.random() > 0.5 ? 1 : -1;
self.swaySpeed = 0.5 + Math.random() * 1;
self.swayAmount = 20 + Math.random() * 30;
self.rotationSpeed = (Math.random() - 0.5) * 0.1;
self.startX = 0;
self.swayTime = 0;
self.update = function () {
if (!self.collected) {
self.y += self.fallSpeed;
// Add swaying motion like paper money
self.swayTime += self.swaySpeed;
var swayOffset = Math.sin(self.swayTime * 0.05) * self.swayAmount;
self.x = self.startX + swayOffset;
// Add rotation for realistic paper motion
coinGraphics.rotation += self.rotationSpeed;
// Slight deceleration as it falls (air resistance)
if (self.fallSpeed > 1) {
self.fallSpeed *= 0.999;
}
}
};
return self;
});
var UpgradeButton = Container.expand(function (text, cost) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.buttonText = new Text2(text + '\n' + cost + ' coins', {
size: 24,
fill: 0xFFFFFF
});
self.buttonText.anchor.set(0.5, 0.5);
self.addChild(self.buttonText);
self.cost = cost;
self.upgradeText = text;
self.updateButton = function (newCost) {
self.cost = newCost;
self.buttonText.setText(self.upgradeText + '\n' + self.cost + ' coins');
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
// Game variables
var clickCount = 0;
var coinCount = 0;
var autoClickerLevel = 0;
var basketSpeedLevel = 0;
var coins = [];
var autoClickerFingers = [];
// Create central ball
var centralBall = game.addChild(LK.getAsset('centralBall', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 3
}));
// Create counter text above basket
var counterText = new Text2('0', {
size: 48,
fill: 0x000000
});
counterText.anchor.set(0.5, 1);
game.addChild(counterText);
// Create basket
var basket = game.addChild(new Basket());
basket.x = 2048 / 2;
basket.y = 2732 - 150;
basket.speedMultiplier = 1 + basketSpeedLevel * 0.5;
// Position counter text above basket
counterText.x = basket.x;
counterText.y = basket.y - 50;
// Create coin counter display below basket
var coinDisplay = new Text2('Coins: ' + coinCount, {
size: 36,
fill: 0x000000
});
coinDisplay.anchor.set(0.5, 0);
coinDisplay.x = basket.x;
coinDisplay.y = basket.y + 50;
game.addChild(coinDisplay);
// Create upgrade buttons
var autoClickerButton = game.addChild(new UpgradeButton('Auto-Clicker', 25));
autoClickerButton.x = 2048 / 2 - 160;
autoClickerButton.y = 2732 - 300;
var basketButton = game.addChild(new UpgradeButton('Faster Basket', 50));
basketButton.x = 2048 / 2 + 160;
basketButton.y = 2732 - 300;
// Create auto-clicker fingers based on saved level
for (var i = 0; i < autoClickerLevel; i++) {
var finger = game.addChild(new AutoClickerFinger());
// Position fingers in a circle around the central ball
var angle = i / Math.max(1, autoClickerLevel) * 2 * Math.PI;
var radius = 150;
finger.x = centralBall.x + Math.cos(angle) * radius;
finger.y = centralBall.y + Math.sin(angle) * radius;
autoClickerFingers.push(finger);
}
// Update upgrade button costs
function updateUpgradeButtons() {
var autoClickerCost = 25 + autoClickerLevel * 15;
var basketCost = 50 + basketSpeedLevel * 25;
autoClickerButton.updateButton(autoClickerCost);
basketButton.updateButton(basketCost);
}
// Auto click function
function autoClickBall() {
clickCount++;
counterText.setText(clickCount.toString());
// Create coin drop
createCoinDrop();
// Play sound
LK.getSound('ballClick').play();
// Visual feedback
tween(centralBall, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 100,
onFinish: function onFinish() {
tween(centralBall, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
}
});
// Animate all auto-clicker fingers
for (var f = 0; f < autoClickerFingers.length; f++) {
var finger = autoClickerFingers[f];
tween(finger, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 150,
onFinish: function onFinish() {
tween(finger, {
scaleX: 1,
scaleY: 1
}, {
duration: 150
});
}
});
}
}
// Create falling coin
function createCoinDrop() {
var coin = new Coin();
coin.x = Math.random() * (2048 - 100) + 50;
coin.startX = coin.x; // Store starting position for sway physics
coin.y = -50;
coins.push(coin);
game.addChild(coin);
}
// Ball click handler
centralBall.down = function (x, y, obj) {
clickCount++;
counterText.setText(clickCount.toString());
// Create coin drop
createCoinDrop();
// Play sound
LK.getSound('ballClick').play();
// Visual feedback
tween(centralBall, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 100,
onFinish: function onFinish() {
tween(centralBall, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
}
});
};
// Upgrade button handlers
autoClickerButton.down = function (x, y, obj) {
var cost = 25 + autoClickerLevel * 15;
if (coinCount >= cost) {
coinCount -= cost;
autoClickerLevel++;
// Create new auto-clicker finger
var finger = game.addChild(new AutoClickerFinger());
// Position new finger in circle formation
var angle = (autoClickerLevel - 1) / autoClickerLevel * 2 * Math.PI;
var radius = 150;
finger.x = centralBall.x + Math.cos(angle) * radius;
finger.y = centralBall.y + Math.sin(angle) * radius;
autoClickerFingers.push(finger);
// Reposition all existing fingers to maintain circle formation
for (var f = 0; f < autoClickerFingers.length; f++) {
var existingFinger = autoClickerFingers[f];
var fingerAngle = f / autoClickerLevel * 2 * Math.PI;
tween(existingFinger, {
x: centralBall.x + Math.cos(fingerAngle) * radius,
y: centralBall.y + Math.sin(fingerAngle) * radius
}, {
duration: 300,
easing: tween.easeOut
});
}
// Update displays
coinDisplay.setText('Coins: ' + coinCount);
updateUpgradeButtons();
// Play sound
LK.getSound('upgrade').play();
// Visual feedback
LK.effects.flashObject(autoClickerButton, 0x00ff00, 300);
}
};
basketButton.down = function (x, y, obj) {
var cost = 50 + basketSpeedLevel * 25;
if (coinCount >= cost) {
coinCount -= cost;
basketSpeedLevel++;
basket.speedMultiplier = 1 + basketSpeedLevel * 0.5;
// Update displays
coinDisplay.setText('Coins: ' + coinCount);
updateUpgradeButtons();
// Play sound
LK.getSound('upgrade').play();
// Visual feedback
LK.effects.flashObject(basketButton, 0x00ff00, 300);
}
};
// Create test button for 10,000 points
var testButton = game.addChild(new UpgradeButton('TEST +10K', 0));
testButton.x = 2048 / 2;
testButton.y = 2732 - 450;
// Test button handler
testButton.down = function (x, y, obj) {
coinCount += 10000;
coinDisplay.setText('Coins: ' + coinCount);
// Update upgrade buttons in case new coins unlock upgrades
updateUpgradeButtons();
// Visual feedback
LK.effects.flashObject(testButton, 0xffff00, 500);
};
// Initialize upgrade buttons
updateUpgradeButtons();
// Main game update loop
game.update = function () {
// Update coins
for (var i = coins.length - 1; i >= 0; i--) {
var coin = coins[i];
if (coin.lastY === undefined) coin.lastY = coin.y;
// Check if coin fell off screen
if (coin.lastY <= 2732 && coin.y > 2732) {
coin.destroy();
coins.splice(i, 1);
continue;
}
// Check collision with basket
if (!coin.collected && coin.intersects(basket)) {
coin.collected = true;
coinCount++;
coinDisplay.setText('Coins: ' + coinCount);
// Play sound
LK.getSound('coinCollect').play();
// Remove coin
coin.destroy();
coins.splice(i, 1);
continue;
}
coin.lastY = coin.y;
}
};