User prompt
Please fix the bug: 'self.getCost is not a function' in or related to this line: 'self.costText = new Text2("Cost: " + self.getCost(), {' Line Number: 197
Code edit (1 edits merged)
Please save this source code
User prompt
Mega Gain CoinClicker: Fortune Empire
User prompt
MG CoinClicker
User prompt
sonic
User prompt
MG
User prompt
Please continue polishing my design document.
User prompt
Please continue polishing my design document.
Initial prompt
CoinClicker 2D MG
/**** * 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
}
});