/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { coins: 0, totalCoins: 0, coinsPerClick: 1, coinsPerSecond: 0, prestigePoints: 0, prestigeMultiplier: 1, upgrades: {} }); /**** * Classes ****/ var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.originalScale = 1; self.originalY = 0; self.animate = function () { // First stop any ongoing animation tween.stop(coinGraphics, { scaleX: true, scaleY: true, y: true }); // Set initial state coinGraphics.scaleX = self.originalScale; coinGraphics.scaleY = self.originalScale; coinGraphics.y = self.originalY; // Grow slightly tween(coinGraphics, { scaleX: self.originalScale * 1.2, scaleY: self.originalScale * 1.2, y: self.originalY - 10 }, { duration: 120, easing: tween.easeOut, onFinish: function onFinish() { // Shrink back tween(coinGraphics, { scaleX: self.originalScale, scaleY: self.originalScale, y: self.originalY }, { duration: 120, easing: tween.bounceOut }); } }); }; return self; }); var CoinClickArea = Container.expand(function () { var self = Container.call(this); var clickArea = self.attachAsset('coinClickArea', { anchorX: 0.5, anchorY: 0.5, alpha: 0.3 }); var coin = new Coin(); coin.originalScale = 1.5; self.addChild(coin); // Coin value popup var coinValue = new Text2("", { size: 40, fill: 0xFFD700 }); coinValue.anchor.set(0.5, 0.5); coinValue.visible = false; self.addChild(coinValue); self.showValue = function (value) { coinValue.setText("+" + value); coinValue.alpha = 1; coinValue.visible = true; coinValue.y = -40; tween.stop(coinValue, { alpha: true, y: true }); tween(coinValue, { alpha: 0, y: -120 }, { duration: 1000, easing: tween.easeOut, onFinish: function onFinish() { coinValue.visible = false; } }); }; self.down = function (x, y, obj) { // Calculate earned coins based on coinsPerClick and prestige multiplier var earned = Math.floor(coinsPerClick * prestigeMultiplier); // Add coins coins += earned; totalCoins += earned; // Play animation coin.animate(); // Show value popup self.showValue(earned); // Play sound LK.getSound('coinClick').play(); }; return self; }); var PrestigeButton = Container.expand(function () { var self = Container.call(this); var buttonGraphics = self.attachAsset('prestige', { anchorX: 0.5, anchorY: 0.5 }); self.title = new Text2("PRESTIGE", { size: 40, fill: 0xFFFFFF }); self.title.anchor.set(0.5, 0); self.title.y = -35; self.addChild(self.title); self.infoText = new Text2("Reset for +0 points", { size: 30, fill: 0xFFFFFF }); self.infoText.anchor.set(0.5, 0); self.infoText.y = 15; self.addChild(self.infoText); self.update = function () { var newPoints = Math.floor(Math.sqrt(totalCoins / 1e12)); self.infoText.setText("Reset for +" + newPoints + " points"); if (newPoints > 0) { buttonGraphics.tint = 0x9C27B0; // Purple } else { buttonGraphics.tint = 0x888888; // Gray } }; self.down = function () { var newPoints = Math.floor(Math.sqrt(totalCoins / 1e12)); if (newPoints > 0) { // Play prestige sound LK.getSound('prestige').play(); // Add prestige points prestigePoints += newPoints; prestigeMultiplier = 1 + prestigePoints * 0.1; // 10% bonus per point // Reset game but keep prestige values storage.coins = 0; storage.totalCoins = 0; storage.coinsPerClick = 1; storage.coinsPerSecond = 0; storage.prestigePoints = prestigePoints; storage.prestigeMultiplier = prestigeMultiplier; storage.upgrades = {}; // Show game over to restart LK.showGameOver(); } }; return self; }); var UpgradeButton = Container.expand(function (id, name, description, cost, effect, requirements) { var self = Container.call(this); self.id = id; self.name = name; self.description = description; self.baseCost = cost; self.effect = effect; self.requirements = requirements || {}; self.count = 0; // Initialize from storage if exists if (storage.upgrades && storage.upgrades[id] !== undefined) { self.count = storage.upgrades[id]; } var buttonGraphics = self.attachAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5 }); self.title = new Text2(name, { size: 40, fill: 0xFFFFFF }); self.title.anchor.set(0.5, 0); self.title.y = -35; self.addChild(self.title); self.getCost = function () { return Math.floor(self.baseCost * Math.pow(1.15, self.count)); }; self.costText = new Text2("Cost: " + self.getCost(), { size: 30, fill: 0xFFFFFF }); self.costText.anchor.set(0.5, 0); self.costText.y = 15; self.addChild(self.costText); self.countText = new Text2("Owned: " + self.count, { size: 25, fill: 0xFFFFFF }); self.countText.anchor.set(1, 0); self.countText.x = buttonGraphics.width / 2 - 10; self.countText.y = -buttonGraphics.height / 2 + 10; self.addChild(self.countText); self.getCost = function () { return Math.floor(self.baseCost * Math.pow(1.15, self.count)); }; self.canPurchase = function () { // Check if player has enough coins if (coins < self.getCost()) { return false; } // Check requirements for (var req in self.requirements) { if (!upgrades[req] || upgrades[req].count < self.requirements[req]) { return false; } } return true; }; self.purchase = function () { if (!self.canPurchase()) { return false; } coins -= self.getCost(); self.count++; // Update storage if (!storage.upgrades) { storage.upgrades = {}; } storage.upgrades[self.id] = self.count; // Apply effect self.effect(self.count); // Update UI self.costText.setText("Cost: " + self.getCost()); self.countText.setText("Owned: " + self.count); return true; }; self.update = function () { if (self.canPurchase()) { buttonGraphics.tint = 0x4CAF50; // Green } else { buttonGraphics.tint = 0x888888; // Gray } }; self.down = function () { if (self.canPurchase()) { if (self.purchase()) { LK.getSound('upgrade').play(); // Animate tween.stop(buttonGraphics, { scaleX: true, scaleY: true }); buttonGraphics.scaleX = 1; buttonGraphics.scaleY = 1; tween(buttonGraphics, { scaleX: 0.95, scaleY: 0.95 }, { duration: 100, easing: tween.easeOut, onFinish: function onFinish() { tween(buttonGraphics, { scaleX: 1, scaleY: 1 }, { duration: 100, easing: tween.easeOut }); } }); } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2C3E50 }); /**** * Game Code ****/ // Game variables var coins = storage.coins || 0; var totalCoins = storage.totalCoins || 0; var coinsPerClick = storage.coinsPerClick || 1; var coinsPerSecond = storage.coinsPerSecond || 0; var prestigePoints = storage.prestigePoints || 0; var prestigeMultiplier = storage.prestigeMultiplier || 1; // Initialize UI text var coinText = new Text2("Coins: 0", { size: 60, fill: 0xFFD700 }); coinText.anchor.set(0.5, 0); LK.gui.top.addChild(coinText); coinText.y = 50; var cpsText = new Text2("0 per second", { size: 40, fill: 0xFFFFFF }); cpsText.anchor.set(0.5, 0); LK.gui.top.addChild(cpsText); cpsText.y = 120; var prestigeText = new Text2("Prestige Points: 0", { size: 40, fill: 0x9C27B0 }); prestigeText.anchor.set(0.5, 0); LK.gui.top.addChild(prestigeText); prestigeText.y = 170; // Create coin click area var coinClickArea = new CoinClickArea(); game.addChild(coinClickArea); coinClickArea.x = 2048 / 2; coinClickArea.y = 2732 / 4; // Create upgrades container var upgradesContainer = new Container(); game.addChild(upgradesContainer); upgradesContainer.x = 2048 / 2; upgradesContainer.y = 2732 / 2 + 200; // Create prestige button var prestigeButton = new PrestigeButton(); game.addChild(prestigeButton); prestigeButton.x = 2048 / 2; prestigeButton.y = 2732 - 200; // Define upgrades var upgrades = { clickPower: new UpgradeButton("clickPower", "Better Fingers", "Increase coins per click", 10, function (count) { coinsPerClick = 1 + count; storage.coinsPerClick = coinsPerClick; }), autoClicker: new UpgradeButton("autoClicker", "Auto Clicker", "Generates coins automatically", 100, function (count) { coinsPerSecond = count; storage.coinsPerSecond = coinsPerSecond; }), coinValue: new UpgradeButton("coinValue", "Gold Purity", "Increases coin value", 500, function (count) { coinsPerClick = 1 + count + upgrades.clickPower.count * 2; storage.coinsPerClick = coinsPerClick; }, { clickPower: 5 }), factory: new UpgradeButton("factory", "Coin Factory", "Mass produce coins", 3000, function (count) { coinsPerSecond = count * 5 + upgrades.autoClicker.count; storage.coinsPerSecond = coinsPerSecond; }, { autoClicker: 10 }), bank: new UpgradeButton("bank", "Investment Bank", "Earn interest on your coins", 10000, function (count) { // This will be calculated in the update function }, { factory: 5 }) }; // Add upgrades to container var upgradeY = 0; var upgradeSpacing = 120; for (var key in upgrades) { upgradesContainer.addChild(upgrades[key]); upgrades[key].y = upgradeY; upgradeY += upgradeSpacing; } // Format large numbers with appropriate suffixes function formatNumber(num) { if (num < 1000) { return num.toFixed(0); } var suffixes = ["", "K", "M", "B", "T", "Qa", "Qi"]; var suffixIndex = 0; while (num >= 1000 && suffixIndex < suffixes.length - 1) { num /= 1000; suffixIndex++; } if (num < 10) { return num.toFixed(2) + suffixes[suffixIndex]; } if (num < 100) { return num.toFixed(1) + suffixes[suffixIndex]; } return num.toFixed(0) + suffixes[suffixIndex]; } // Update function - called every frame var lastUpdateTime = Date.now(); game.update = function () { // Calculate time since last update for accurate coin generation var now = Date.now(); var delta = (now - lastUpdateTime) / 1000; // Convert to seconds lastUpdateTime = now; // Update text displays coinText.setText("Coins: " + formatNumber(coins)); cpsText.setText(formatNumber(coinsPerSecond) + " per second"); prestigeText.setText("Prestige Points: " + prestigePoints + " (×" + prestigeMultiplier.toFixed(1) + ")"); // Generate passive income var baseIncome = coinsPerSecond * delta * prestigeMultiplier; // Add bank interest if we have that upgrade if (upgrades.bank && upgrades.bank.count > 0) { var interestRate = 0.001 * upgrades.bank.count; var interest = coins * interestRate * delta; baseIncome += interest; } coins += baseIncome; totalCoins += baseIncome; // Save progress periodically (every 5 seconds) if (LK.ticks % 300 === 0) { storage.coins = coins; storage.totalCoins = totalCoins; } // Update all upgrades for (var key in upgrades) { upgrades[key].update(); } // Update prestige button prestigeButton.update(); }; // Start background music LK.playMusic('bgmusic', { fade: { start: 0, end: 0.3, duration: 1000 } });
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
coins: 0,
totalCoins: 0,
coinsPerClick: 1,
coinsPerSecond: 0,
prestigePoints: 0,
prestigeMultiplier: 1,
upgrades: {}
});
/****
* Classes
****/
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.originalScale = 1;
self.originalY = 0;
self.animate = function () {
// First stop any ongoing animation
tween.stop(coinGraphics, {
scaleX: true,
scaleY: true,
y: true
});
// Set initial state
coinGraphics.scaleX = self.originalScale;
coinGraphics.scaleY = self.originalScale;
coinGraphics.y = self.originalY;
// Grow slightly
tween(coinGraphics, {
scaleX: self.originalScale * 1.2,
scaleY: self.originalScale * 1.2,
y: self.originalY - 10
}, {
duration: 120,
easing: tween.easeOut,
onFinish: function onFinish() {
// Shrink back
tween(coinGraphics, {
scaleX: self.originalScale,
scaleY: self.originalScale,
y: self.originalY
}, {
duration: 120,
easing: tween.bounceOut
});
}
});
};
return self;
});
var CoinClickArea = Container.expand(function () {
var self = Container.call(this);
var clickArea = self.attachAsset('coinClickArea', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
var coin = new Coin();
coin.originalScale = 1.5;
self.addChild(coin);
// Coin value popup
var coinValue = new Text2("", {
size: 40,
fill: 0xFFD700
});
coinValue.anchor.set(0.5, 0.5);
coinValue.visible = false;
self.addChild(coinValue);
self.showValue = function (value) {
coinValue.setText("+" + value);
coinValue.alpha = 1;
coinValue.visible = true;
coinValue.y = -40;
tween.stop(coinValue, {
alpha: true,
y: true
});
tween(coinValue, {
alpha: 0,
y: -120
}, {
duration: 1000,
easing: tween.easeOut,
onFinish: function onFinish() {
coinValue.visible = false;
}
});
};
self.down = function (x, y, obj) {
// Calculate earned coins based on coinsPerClick and prestige multiplier
var earned = Math.floor(coinsPerClick * prestigeMultiplier);
// Add coins
coins += earned;
totalCoins += earned;
// Play animation
coin.animate();
// Show value popup
self.showValue(earned);
// Play sound
LK.getSound('coinClick').play();
};
return self;
});
var PrestigeButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('prestige', {
anchorX: 0.5,
anchorY: 0.5
});
self.title = new Text2("PRESTIGE", {
size: 40,
fill: 0xFFFFFF
});
self.title.anchor.set(0.5, 0);
self.title.y = -35;
self.addChild(self.title);
self.infoText = new Text2("Reset for +0 points", {
size: 30,
fill: 0xFFFFFF
});
self.infoText.anchor.set(0.5, 0);
self.infoText.y = 15;
self.addChild(self.infoText);
self.update = function () {
var newPoints = Math.floor(Math.sqrt(totalCoins / 1e12));
self.infoText.setText("Reset for +" + newPoints + " points");
if (newPoints > 0) {
buttonGraphics.tint = 0x9C27B0; // Purple
} else {
buttonGraphics.tint = 0x888888; // Gray
}
};
self.down = function () {
var newPoints = Math.floor(Math.sqrt(totalCoins / 1e12));
if (newPoints > 0) {
// Play prestige sound
LK.getSound('prestige').play();
// Add prestige points
prestigePoints += newPoints;
prestigeMultiplier = 1 + prestigePoints * 0.1; // 10% bonus per point
// Reset game but keep prestige values
storage.coins = 0;
storage.totalCoins = 0;
storage.coinsPerClick = 1;
storage.coinsPerSecond = 0;
storage.prestigePoints = prestigePoints;
storage.prestigeMultiplier = prestigeMultiplier;
storage.upgrades = {};
// Show game over to restart
LK.showGameOver();
}
};
return self;
});
var UpgradeButton = Container.expand(function (id, name, description, cost, effect, requirements) {
var self = Container.call(this);
self.id = id;
self.name = name;
self.description = description;
self.baseCost = cost;
self.effect = effect;
self.requirements = requirements || {};
self.count = 0;
// Initialize from storage if exists
if (storage.upgrades && storage.upgrades[id] !== undefined) {
self.count = storage.upgrades[id];
}
var buttonGraphics = self.attachAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.title = new Text2(name, {
size: 40,
fill: 0xFFFFFF
});
self.title.anchor.set(0.5, 0);
self.title.y = -35;
self.addChild(self.title);
self.getCost = function () {
return Math.floor(self.baseCost * Math.pow(1.15, self.count));
};
self.costText = new Text2("Cost: " + self.getCost(), {
size: 30,
fill: 0xFFFFFF
});
self.costText.anchor.set(0.5, 0);
self.costText.y = 15;
self.addChild(self.costText);
self.countText = new Text2("Owned: " + self.count, {
size: 25,
fill: 0xFFFFFF
});
self.countText.anchor.set(1, 0);
self.countText.x = buttonGraphics.width / 2 - 10;
self.countText.y = -buttonGraphics.height / 2 + 10;
self.addChild(self.countText);
self.getCost = function () {
return Math.floor(self.baseCost * Math.pow(1.15, self.count));
};
self.canPurchase = function () {
// Check if player has enough coins
if (coins < self.getCost()) {
return false;
}
// Check requirements
for (var req in self.requirements) {
if (!upgrades[req] || upgrades[req].count < self.requirements[req]) {
return false;
}
}
return true;
};
self.purchase = function () {
if (!self.canPurchase()) {
return false;
}
coins -= self.getCost();
self.count++;
// Update storage
if (!storage.upgrades) {
storage.upgrades = {};
}
storage.upgrades[self.id] = self.count;
// Apply effect
self.effect(self.count);
// Update UI
self.costText.setText("Cost: " + self.getCost());
self.countText.setText("Owned: " + self.count);
return true;
};
self.update = function () {
if (self.canPurchase()) {
buttonGraphics.tint = 0x4CAF50; // Green
} else {
buttonGraphics.tint = 0x888888; // Gray
}
};
self.down = function () {
if (self.canPurchase()) {
if (self.purchase()) {
LK.getSound('upgrade').play();
// Animate
tween.stop(buttonGraphics, {
scaleX: true,
scaleY: true
});
buttonGraphics.scaleX = 1;
buttonGraphics.scaleY = 1;
tween(buttonGraphics, {
scaleX: 0.95,
scaleY: 0.95
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(buttonGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 100,
easing: tween.easeOut
});
}
});
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2C3E50
});
/****
* Game Code
****/
// Game variables
var coins = storage.coins || 0;
var totalCoins = storage.totalCoins || 0;
var coinsPerClick = storage.coinsPerClick || 1;
var coinsPerSecond = storage.coinsPerSecond || 0;
var prestigePoints = storage.prestigePoints || 0;
var prestigeMultiplier = storage.prestigeMultiplier || 1;
// Initialize UI text
var coinText = new Text2("Coins: 0", {
size: 60,
fill: 0xFFD700
});
coinText.anchor.set(0.5, 0);
LK.gui.top.addChild(coinText);
coinText.y = 50;
var cpsText = new Text2("0 per second", {
size: 40,
fill: 0xFFFFFF
});
cpsText.anchor.set(0.5, 0);
LK.gui.top.addChild(cpsText);
cpsText.y = 120;
var prestigeText = new Text2("Prestige Points: 0", {
size: 40,
fill: 0x9C27B0
});
prestigeText.anchor.set(0.5, 0);
LK.gui.top.addChild(prestigeText);
prestigeText.y = 170;
// Create coin click area
var coinClickArea = new CoinClickArea();
game.addChild(coinClickArea);
coinClickArea.x = 2048 / 2;
coinClickArea.y = 2732 / 4;
// Create upgrades container
var upgradesContainer = new Container();
game.addChild(upgradesContainer);
upgradesContainer.x = 2048 / 2;
upgradesContainer.y = 2732 / 2 + 200;
// Create prestige button
var prestigeButton = new PrestigeButton();
game.addChild(prestigeButton);
prestigeButton.x = 2048 / 2;
prestigeButton.y = 2732 - 200;
// Define upgrades
var upgrades = {
clickPower: new UpgradeButton("clickPower", "Better Fingers", "Increase coins per click", 10, function (count) {
coinsPerClick = 1 + count;
storage.coinsPerClick = coinsPerClick;
}),
autoClicker: new UpgradeButton("autoClicker", "Auto Clicker", "Generates coins automatically", 100, function (count) {
coinsPerSecond = count;
storage.coinsPerSecond = coinsPerSecond;
}),
coinValue: new UpgradeButton("coinValue", "Gold Purity", "Increases coin value", 500, function (count) {
coinsPerClick = 1 + count + upgrades.clickPower.count * 2;
storage.coinsPerClick = coinsPerClick;
}, {
clickPower: 5
}),
factory: new UpgradeButton("factory", "Coin Factory", "Mass produce coins", 3000, function (count) {
coinsPerSecond = count * 5 + upgrades.autoClicker.count;
storage.coinsPerSecond = coinsPerSecond;
}, {
autoClicker: 10
}),
bank: new UpgradeButton("bank", "Investment Bank", "Earn interest on your coins", 10000, function (count) {
// This will be calculated in the update function
}, {
factory: 5
})
};
// Add upgrades to container
var upgradeY = 0;
var upgradeSpacing = 120;
for (var key in upgrades) {
upgradesContainer.addChild(upgrades[key]);
upgrades[key].y = upgradeY;
upgradeY += upgradeSpacing;
}
// Format large numbers with appropriate suffixes
function formatNumber(num) {
if (num < 1000) {
return num.toFixed(0);
}
var suffixes = ["", "K", "M", "B", "T", "Qa", "Qi"];
var suffixIndex = 0;
while (num >= 1000 && suffixIndex < suffixes.length - 1) {
num /= 1000;
suffixIndex++;
}
if (num < 10) {
return num.toFixed(2) + suffixes[suffixIndex];
}
if (num < 100) {
return num.toFixed(1) + suffixes[suffixIndex];
}
return num.toFixed(0) + suffixes[suffixIndex];
}
// Update function - called every frame
var lastUpdateTime = Date.now();
game.update = function () {
// Calculate time since last update for accurate coin generation
var now = Date.now();
var delta = (now - lastUpdateTime) / 1000; // Convert to seconds
lastUpdateTime = now;
// Update text displays
coinText.setText("Coins: " + formatNumber(coins));
cpsText.setText(formatNumber(coinsPerSecond) + " per second");
prestigeText.setText("Prestige Points: " + prestigePoints + " (×" + prestigeMultiplier.toFixed(1) + ")");
// Generate passive income
var baseIncome = coinsPerSecond * delta * prestigeMultiplier;
// Add bank interest if we have that upgrade
if (upgrades.bank && upgrades.bank.count > 0) {
var interestRate = 0.001 * upgrades.bank.count;
var interest = coins * interestRate * delta;
baseIncome += interest;
}
coins += baseIncome;
totalCoins += baseIncome;
// Save progress periodically (every 5 seconds)
if (LK.ticks % 300 === 0) {
storage.coins = coins;
storage.totalCoins = totalCoins;
}
// Update all upgrades
for (var key in upgrades) {
upgrades[key].update();
}
// Update prestige button
prestigeButton.update();
};
// Start background music
LK.playMusic('bgmusic', {
fade: {
start: 0,
end: 0.3,
duration: 1000
}
});