/****
* 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
}
});