/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { coins: 0, autoCollectors: 0, coinValue: 1, autoCollectorCost: 50, coinValueUpgradeCost: 100, coinSpawnRateUpgradeCost: 75, coinSpawnRate: 1 }); /**** * Classes ****/ var AutoCollector = Container.expand(function () { var self = Container.call(this); var collectorGraphic = self.attachAsset('collector', { anchorX: 0.5, anchorY: 0.5 }); var labelText = new Text2('Auto Collector', { size: 36, fill: 0xFFFFFF }); labelText.anchor.set(0.5, 0.5); self.addChild(labelText); self.lastCollection = 0; self.collectionRate = 1000; // Collect once per second self.update = function () { // Check if it's time to collect if (LK.ticks - self.lastCollection >= self.collectionRate / (1000 / 60)) { self.collect(); self.lastCollection = LK.ticks; } }; self.collect = function () { // Find the nearest coin and collect it var nearestCoin = null; var nearestDistance = Infinity; for (var i = 0; i < activeCoins.length; i++) { var coin = activeCoins[i]; var distance = Math.sqrt(Math.pow(coin.x - self.x, 2) + Math.pow(coin.y - self.y, 2)); if (distance < nearestDistance) { nearestDistance = distance; nearestCoin = coin; } } if (nearestCoin && nearestDistance < 500) { // Visual feedback LK.effects.flashObject(self, 0x00FF00, 200); // Create a visual connection between collector and coin var connection = LK.getAsset('collector', { width: 10, height: 10, anchorX: 0.5, anchorY: 0.5, x: self.x, y: self.y, alpha: 0.5 }); game.addChild(connection); tween(connection, { x: nearestCoin.x, y: nearestCoin.y, alpha: 0 }, { duration: 200, onFinish: function onFinish() { connection.destroy(); nearestCoin.collect(); } }); } }; return self; }); var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphic = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.speed = Math.random() * 2 + 1; self.value = coinValue; self.update = function () { self.y += self.speed; // Slight horizontal oscillation self.x += Math.sin(LK.ticks / 20) * 0.5; // Rotate coin slightly coinGraphic.rotation += 0.02; }; self.down = function (x, y, obj) { self.collect(); }; self.collect = function () { coins += self.value; LK.getSound('coin_collect').play(); LK.setScore(Math.floor(coins)); // Create coin collection effect LK.effects.flashObject(self, 0xFFFFFF, 200); // Animate coin moving toward wallet tween(self, { scaleX: 0, scaleY: 0, alpha: 0 }, { duration: 300, onFinish: function onFinish() { self.shouldRemove = true; } }); }; return self; }); var UpgradeButton = Container.expand(function (title, cost, description, onPurchase) { var self = Container.call(this); var background = self.attachAsset('collector', { anchorX: 0.5, anchorY: 0.5, width: 380, height: 120, tint: 0x4CAF50 }); var titleText = new Text2(title, { size: 30, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0); titleText.y = -40; self.addChild(titleText); var costText = new Text2(cost + " coins", { size: 24, fill: 0xFFFF00 }); costText.anchor.set(0.5, 0); costText.y = 0; self.addChild(costText); var descText = new Text2(description, { size: 18, fill: 0xFFFFFF }); descText.anchor.set(0.5, 0); descText.y = 30; self.addChild(descText); self.cost = cost; self.title = title; self.updateCost = function (newCost) { self.cost = newCost; costText.setText(newCost + " coins"); }; self.down = function (x, y, obj) { if (coins >= self.cost) { // Purchase the upgrade coins -= self.cost; LK.setScore(Math.floor(coins)); LK.getSound('upgrade_buy').play(); // Visual feedback LK.effects.flashObject(self, 0x00FF00, 300); // Call the provided purchase function onPurchase(); // Save progress storage.coins = coins; } else { // Not enough coins LK.effects.flashObject(self, 0xFF0000, 300); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Game variables var coins = storage.coins || 0; var autoCollectors = storage.autoCollectors || 0; var coinValue = storage.coinValue || 1; var coinSpawnRate = storage.coinSpawnRate || 1; var autoCollectorCost = storage.autoCollectorCost || 50; var coinValueUpgradeCost = storage.coinValueUpgradeCost || 100; var coinSpawnRateUpgradeCost = storage.coinSpawnRateUpgradeCost || 75; var activeCoins = []; var collectors = []; var lastCoinSpawn = 0; var coinsCollectedThisSession = 0; // Create UI elements var coinsText = new Text2("Coins: " + Math.floor(coins), { size: 60, fill: 0xFFFFFF }); coinsText.anchor.set(0.5, 0); LK.gui.top.addChild(coinsText); coinsText.y = 50; var statsText = new Text2("Session Coins: 0\nAuto Collectors: 0\nCoin Value: 1", { size: 30, fill: 0xFFFFFF }); statsText.anchor.set(0, 0); statsText.x = 50; statsText.y = 150; LK.gui.addChild(statsText); // Create upgrade buttons var autoCollectorButton = new UpgradeButton("Auto Collector", autoCollectorCost, "Automatically collects nearby coins", function () { autoCollectors++; storage.autoCollectors = autoCollectors; // Create a new collector var collector = new AutoCollector(); collector.x = 300 + autoCollectors % 3 * 400; collector.y = 400 + Math.floor(autoCollectors / 3) * 200; game.addChild(collector); collectors.push(collector); // Increase cost for next purchase autoCollectorCost = Math.floor(autoCollectorCost * 1.5); storage.autoCollectorCost = autoCollectorCost; autoCollectorButton.updateCost(autoCollectorCost); updateStatsText(); }); autoCollectorButton.x = 2048 / 2 - 400; autoCollectorButton.y = 2732 - 200; LK.gui.addChild(autoCollectorButton); var coinValueButton = new UpgradeButton("Coin Value", coinValueUpgradeCost, "Increases the value of each coin", function () { coinValue++; storage.coinValue = coinValue; // Increase cost for next purchase coinValueUpgradeCost = Math.floor(coinValueUpgradeCost * 1.7); storage.coinValueUpgradeCost = coinValueUpgradeCost; coinValueButton.updateCost(coinValueUpgradeCost); updateStatsText(); }); coinValueButton.x = 2048 / 2; coinValueButton.y = 2732 - 200; LK.gui.addChild(coinValueButton); var spawnRateButton = new UpgradeButton("Coin Rain", coinSpawnRateUpgradeCost, "Increases coin spawn frequency", function () { coinSpawnRate += 0.5; storage.coinSpawnRate = coinSpawnRate; // Increase cost for next purchase coinSpawnRateUpgradeCost = Math.floor(coinSpawnRateUpgradeCost * 1.6); storage.coinSpawnRateUpgradeCost = coinSpawnRateUpgradeCost; spawnRateButton.updateCost(coinSpawnRateUpgradeCost); updateStatsText(); }); spawnRateButton.x = 2048 / 2 + 400; spawnRateButton.y = 2732 - 200; LK.gui.addChild(spawnRateButton); // Helper functions function updateStatsText() { statsText.setText("Session Coins: " + Math.floor(coinsCollectedThisSession) + "\nAuto Collectors: " + autoCollectors + "\nCoin Value: " + coinValue + "\nCoin Spawn Rate: " + coinSpawnRate.toFixed(1) + "x"); } function spawnCoin() { var coin = new Coin(); coin.x = Math.random() * (2048 - 200) + 100; // Keep away from edges coin.y = -100; game.addChild(coin); activeCoins.push(coin); } // Initialize existing auto collectors for (var i = 0; i < autoCollectors; i++) { var collector = new AutoCollector(); collector.x = 300 + i % 3 * 400; collector.y = 400 + Math.floor(i / 3) * 200; game.addChild(collector); collectors.push(collector); } // Set initial score LK.setScore(Math.floor(coins)); updateStatsText(); // Start background music LK.playMusic('background_music', { fade: { start: 0, end: 0.4, duration: 1000 } }); // Game update loop game.update = function () { // Update coins text coinsText.setText("Coins: " + Math.floor(coins)); // Spawn coins periodically var spawnInterval = Math.max(60 - coinSpawnRate * 10, 10); // Adjust spawn rate based on upgrade if (LK.ticks - lastCoinSpawn >= spawnInterval) { spawnCoin(); lastCoinSpawn = LK.ticks; } // Update all coins for (var i = activeCoins.length - 1; i >= 0; i--) { var coin = activeCoins[i]; // Check if coin is off-screen or marked for removal if (coin.y > 2732 + 100 || coin.shouldRemove) { coin.destroy(); activeCoins.splice(i, 1); } } // Save progress periodically (every 5 seconds) if (LK.ticks % 300 === 0) { storage.coins = coins; } }; // Game interaction game.down = function (x, y, obj) { // Handle clicks on the game area (not on specific objects) }; // For tracking session coins LK.setInterval(function () { coinsCollectedThisSession = coins - storage.coins; updateStatsText(); }, 1000);
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
coins: 0,
autoCollectors: 0,
coinValue: 1,
autoCollectorCost: 50,
coinValueUpgradeCost: 100,
coinSpawnRateUpgradeCost: 75,
coinSpawnRate: 1
});
/****
* Classes
****/
var AutoCollector = Container.expand(function () {
var self = Container.call(this);
var collectorGraphic = self.attachAsset('collector', {
anchorX: 0.5,
anchorY: 0.5
});
var labelText = new Text2('Auto Collector', {
size: 36,
fill: 0xFFFFFF
});
labelText.anchor.set(0.5, 0.5);
self.addChild(labelText);
self.lastCollection = 0;
self.collectionRate = 1000; // Collect once per second
self.update = function () {
// Check if it's time to collect
if (LK.ticks - self.lastCollection >= self.collectionRate / (1000 / 60)) {
self.collect();
self.lastCollection = LK.ticks;
}
};
self.collect = function () {
// Find the nearest coin and collect it
var nearestCoin = null;
var nearestDistance = Infinity;
for (var i = 0; i < activeCoins.length; i++) {
var coin = activeCoins[i];
var distance = Math.sqrt(Math.pow(coin.x - self.x, 2) + Math.pow(coin.y - self.y, 2));
if (distance < nearestDistance) {
nearestDistance = distance;
nearestCoin = coin;
}
}
if (nearestCoin && nearestDistance < 500) {
// Visual feedback
LK.effects.flashObject(self, 0x00FF00, 200);
// Create a visual connection between collector and coin
var connection = LK.getAsset('collector', {
width: 10,
height: 10,
anchorX: 0.5,
anchorY: 0.5,
x: self.x,
y: self.y,
alpha: 0.5
});
game.addChild(connection);
tween(connection, {
x: nearestCoin.x,
y: nearestCoin.y,
alpha: 0
}, {
duration: 200,
onFinish: function onFinish() {
connection.destroy();
nearestCoin.collect();
}
});
}
};
return self;
});
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphic = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = Math.random() * 2 + 1;
self.value = coinValue;
self.update = function () {
self.y += self.speed;
// Slight horizontal oscillation
self.x += Math.sin(LK.ticks / 20) * 0.5;
// Rotate coin slightly
coinGraphic.rotation += 0.02;
};
self.down = function (x, y, obj) {
self.collect();
};
self.collect = function () {
coins += self.value;
LK.getSound('coin_collect').play();
LK.setScore(Math.floor(coins));
// Create coin collection effect
LK.effects.flashObject(self, 0xFFFFFF, 200);
// Animate coin moving toward wallet
tween(self, {
scaleX: 0,
scaleY: 0,
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
self.shouldRemove = true;
}
});
};
return self;
});
var UpgradeButton = Container.expand(function (title, cost, description, onPurchase) {
var self = Container.call(this);
var background = self.attachAsset('collector', {
anchorX: 0.5,
anchorY: 0.5,
width: 380,
height: 120,
tint: 0x4CAF50
});
var titleText = new Text2(title, {
size: 30,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0);
titleText.y = -40;
self.addChild(titleText);
var costText = new Text2(cost + " coins", {
size: 24,
fill: 0xFFFF00
});
costText.anchor.set(0.5, 0);
costText.y = 0;
self.addChild(costText);
var descText = new Text2(description, {
size: 18,
fill: 0xFFFFFF
});
descText.anchor.set(0.5, 0);
descText.y = 30;
self.addChild(descText);
self.cost = cost;
self.title = title;
self.updateCost = function (newCost) {
self.cost = newCost;
costText.setText(newCost + " coins");
};
self.down = function (x, y, obj) {
if (coins >= self.cost) {
// Purchase the upgrade
coins -= self.cost;
LK.setScore(Math.floor(coins));
LK.getSound('upgrade_buy').play();
// Visual feedback
LK.effects.flashObject(self, 0x00FF00, 300);
// Call the provided purchase function
onPurchase();
// Save progress
storage.coins = coins;
} else {
// Not enough coins
LK.effects.flashObject(self, 0xFF0000, 300);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game variables
var coins = storage.coins || 0;
var autoCollectors = storage.autoCollectors || 0;
var coinValue = storage.coinValue || 1;
var coinSpawnRate = storage.coinSpawnRate || 1;
var autoCollectorCost = storage.autoCollectorCost || 50;
var coinValueUpgradeCost = storage.coinValueUpgradeCost || 100;
var coinSpawnRateUpgradeCost = storage.coinSpawnRateUpgradeCost || 75;
var activeCoins = [];
var collectors = [];
var lastCoinSpawn = 0;
var coinsCollectedThisSession = 0;
// Create UI elements
var coinsText = new Text2("Coins: " + Math.floor(coins), {
size: 60,
fill: 0xFFFFFF
});
coinsText.anchor.set(0.5, 0);
LK.gui.top.addChild(coinsText);
coinsText.y = 50;
var statsText = new Text2("Session Coins: 0\nAuto Collectors: 0\nCoin Value: 1", {
size: 30,
fill: 0xFFFFFF
});
statsText.anchor.set(0, 0);
statsText.x = 50;
statsText.y = 150;
LK.gui.addChild(statsText);
// Create upgrade buttons
var autoCollectorButton = new UpgradeButton("Auto Collector", autoCollectorCost, "Automatically collects nearby coins", function () {
autoCollectors++;
storage.autoCollectors = autoCollectors;
// Create a new collector
var collector = new AutoCollector();
collector.x = 300 + autoCollectors % 3 * 400;
collector.y = 400 + Math.floor(autoCollectors / 3) * 200;
game.addChild(collector);
collectors.push(collector);
// Increase cost for next purchase
autoCollectorCost = Math.floor(autoCollectorCost * 1.5);
storage.autoCollectorCost = autoCollectorCost;
autoCollectorButton.updateCost(autoCollectorCost);
updateStatsText();
});
autoCollectorButton.x = 2048 / 2 - 400;
autoCollectorButton.y = 2732 - 200;
LK.gui.addChild(autoCollectorButton);
var coinValueButton = new UpgradeButton("Coin Value", coinValueUpgradeCost, "Increases the value of each coin", function () {
coinValue++;
storage.coinValue = coinValue;
// Increase cost for next purchase
coinValueUpgradeCost = Math.floor(coinValueUpgradeCost * 1.7);
storage.coinValueUpgradeCost = coinValueUpgradeCost;
coinValueButton.updateCost(coinValueUpgradeCost);
updateStatsText();
});
coinValueButton.x = 2048 / 2;
coinValueButton.y = 2732 - 200;
LK.gui.addChild(coinValueButton);
var spawnRateButton = new UpgradeButton("Coin Rain", coinSpawnRateUpgradeCost, "Increases coin spawn frequency", function () {
coinSpawnRate += 0.5;
storage.coinSpawnRate = coinSpawnRate;
// Increase cost for next purchase
coinSpawnRateUpgradeCost = Math.floor(coinSpawnRateUpgradeCost * 1.6);
storage.coinSpawnRateUpgradeCost = coinSpawnRateUpgradeCost;
spawnRateButton.updateCost(coinSpawnRateUpgradeCost);
updateStatsText();
});
spawnRateButton.x = 2048 / 2 + 400;
spawnRateButton.y = 2732 - 200;
LK.gui.addChild(spawnRateButton);
// Helper functions
function updateStatsText() {
statsText.setText("Session Coins: " + Math.floor(coinsCollectedThisSession) + "\nAuto Collectors: " + autoCollectors + "\nCoin Value: " + coinValue + "\nCoin Spawn Rate: " + coinSpawnRate.toFixed(1) + "x");
}
function spawnCoin() {
var coin = new Coin();
coin.x = Math.random() * (2048 - 200) + 100; // Keep away from edges
coin.y = -100;
game.addChild(coin);
activeCoins.push(coin);
}
// Initialize existing auto collectors
for (var i = 0; i < autoCollectors; i++) {
var collector = new AutoCollector();
collector.x = 300 + i % 3 * 400;
collector.y = 400 + Math.floor(i / 3) * 200;
game.addChild(collector);
collectors.push(collector);
}
// Set initial score
LK.setScore(Math.floor(coins));
updateStatsText();
// Start background music
LK.playMusic('background_music', {
fade: {
start: 0,
end: 0.4,
duration: 1000
}
});
// Game update loop
game.update = function () {
// Update coins text
coinsText.setText("Coins: " + Math.floor(coins));
// Spawn coins periodically
var spawnInterval = Math.max(60 - coinSpawnRate * 10, 10); // Adjust spawn rate based on upgrade
if (LK.ticks - lastCoinSpawn >= spawnInterval) {
spawnCoin();
lastCoinSpawn = LK.ticks;
}
// Update all coins
for (var i = activeCoins.length - 1; i >= 0; i--) {
var coin = activeCoins[i];
// Check if coin is off-screen or marked for removal
if (coin.y > 2732 + 100 || coin.shouldRemove) {
coin.destroy();
activeCoins.splice(i, 1);
}
}
// Save progress periodically (every 5 seconds)
if (LK.ticks % 300 === 0) {
storage.coins = coins;
}
};
// Game interaction
game.down = function (x, y, obj) {
// Handle clicks on the game area (not on specific objects)
};
// For tracking session coins
LK.setInterval(function () {
coinsCollectedThisSession = coins - storage.coins;
updateStatsText();
}, 1000);