/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var BigNumber = Container.expand(function (mantissa, exponent) {
var self = Container.call(this);
// Initialize mantissa and exponent
self.mantissa = mantissa || 1;
self.exponent = exponent || 0;
// Normalize the number (keep mantissa between 1 and 10)
self.normalize = function () {
if (self.mantissa === 0) {
self.exponent = 0;
return self;
}
while (Math.abs(self.mantissa) >= 10) {
self.mantissa /= 10;
self.exponent++;
}
while (Math.abs(self.mantissa) < 1 && self.mantissa !== 0) {
self.mantissa *= 10;
self.exponent--;
}
return self;
};
// Add operation
self.add = function (other) {
if (typeof other === 'number') {
other = new BigNumber(other, 0).normalize();
}
var expDiff = self.exponent - other.exponent;
var newMantissa, newExponent;
if (expDiff >= 15) {
// Other number is too small to matter
return new BigNumber(self.mantissa, self.exponent);
} else if (expDiff <= -15) {
// Self is too small to matter
return new BigNumber(other.mantissa, other.exponent);
} else {
// Both numbers are significant
if (self.exponent >= other.exponent) {
newExponent = self.exponent;
newMantissa = self.mantissa + other.mantissa * Math.pow(10, other.exponent - self.exponent);
} else {
newExponent = other.exponent;
newMantissa = other.mantissa + self.mantissa * Math.pow(10, self.exponent - other.exponent);
}
}
return new BigNumber(newMantissa, newExponent).normalize();
};
// Multiply operation
self.multiply = function (other) {
if (typeof other === 'number') {
other = new BigNumber(other, 0).normalize();
}
var newMantissa = self.mantissa * other.mantissa;
var newExponent = self.exponent + other.exponent;
return new BigNumber(newMantissa, newExponent).normalize();
};
// Subtract operation
self.subtract = function (other) {
if (typeof other === 'number') {
other = new BigNumber(other, 0).normalize();
}
var expDiff = self.exponent - other.exponent;
var newMantissa, newExponent;
if (expDiff >= 15) {
// Other number is too small to matter
return new BigNumber(self.mantissa, self.exponent);
} else if (expDiff <= -15) {
// Result would be negative of other
return new BigNumber(-other.mantissa, other.exponent);
} else {
if (self.exponent >= other.exponent) {
newExponent = self.exponent;
newMantissa = self.mantissa - other.mantissa * Math.pow(10, other.exponent - self.exponent);
} else {
newExponent = other.exponent;
newMantissa = self.mantissa * Math.pow(10, self.exponent - other.exponent) - other.mantissa;
}
}
return new BigNumber(newMantissa, newExponent).normalize();
};
// Compare if greater than or equal
self.gte = function (other) {
if (typeof other === 'number') {
other = new BigNumber(other, 0).normalize();
}
if (self.exponent > other.exponent) return true;
if (self.exponent < other.exponent) return false;
return self.mantissa >= other.mantissa;
};
// Compare if greater than
self.gt = function (other) {
if (typeof other === 'number') {
other = new BigNumber(other, 0).normalize();
}
if (self.exponent > other.exponent) return true;
if (self.exponent < other.exponent) return false;
return self.mantissa > other.mantissa;
};
// Convert to display string
self.toString = function () {
if (self.exponent < 3 && self.exponent >= 0) {
// Show as regular number for small values
var regularNum = self.mantissa * Math.pow(10, self.exponent);
// Ensure regularNum is a valid finite number before calling toFixed
if (typeof regularNum === 'number' && !isNaN(regularNum) && regularNum !== Infinity && regularNum !== -Infinity && regularNum > -Infinity) {
try {
return regularNum.toFixed(2);
} catch (e) {
// Fallback to scientific notation if toFixed fails
return self.mantissa.toFixed(2) + 'e' + self.exponent;
}
} else {
// Fallback to scientific notation if regularNum is invalid
return self.mantissa.toFixed(2) + 'e' + self.exponent;
}
} else if (self.exponent >= 3) {
// Use letter notation for large numbers
return formatBigNumber(self.mantissa, self.exponent);
} else {
// Scientific notation for very small numbers
return self.mantissa.toFixed(2) + 'e' + self.exponent;
}
};
// Convert to regular number (with precision loss for very large numbers)
self.toNumber = function () {
if (self.exponent > 308) return Infinity; // JavaScript limit
if (self.exponent < -308) return 0;
return self.mantissa * Math.pow(10, self.exponent);
};
self.normalize();
return self;
});
// Helper function for formatting big numbers with letter notation
var ClickButton = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('clickButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
// Check if upgrade panel is open - if so, disable interaction
if (upgradePanel && upgradePanel.visible) {
return;
}
// Check if settings panel is open - if so, disable interaction
if (settingsPanel && settingsPanel.visible) {
return;
}
// Check if save panel is open - if so, disable interaction
if (savePanel && savePanel.visible) {
return;
}
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
// Visual feedback
tween(graphics, {
scaleX: 0.9,
scaleY: 0.9
}, {
duration: 100
});
tween(graphics, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 100,
onFinish: function onFinish() {
tween(graphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
}
});
// Generate scrap
scrap = scrap.add(perClickValue);
totalClicks = totalClicks.add(1);
// Chance for rewards (15% for magnet, 25% for XP)
if (Math.random() < 0.15) {
createMagnetReward();
}
if (Math.random() < 0.25) {
createXPReward();
}
updateUI();
LK.getSound('click').play();
};
return self;
});
var ConfirmationDialog = Container.expand(function (message, onYes, onNo) {
var self = Container.call(this);
// Dialog background
var dialogBg = LK.getAsset('upgradeButton', {
anchorX: 0,
anchorY: 0,
scaleX: 3.0,
scaleY: 3.0
});
dialogBg.tint = 0x222222;
self.addChild(dialogBg);
// Message text
var messageText = new Text2(message, {
size: 60,
fill: 0xFFFFFF
});
messageText.anchor.set(0.5, 0.5);
messageText.x = 600;
messageText.y = 150;
self.addChild(messageText);
// Yes button
var yesButton = new Text2('YES', {
size: 70,
fill: 0x00FF00
});
yesButton.anchor.set(0.5, 0.5);
yesButton.x = 400;
yesButton.y = 250;
self.addChild(yesButton);
// No button
var noButton = new Text2('NO', {
size: 70,
fill: 0xFF0000
});
noButton.anchor.set(0.5, 0.5);
noButton.x = 800;
noButton.y = 250;
self.addChild(noButton);
yesButton.down = function (x, y, obj) {
if (onYes) onYes();
self.destroy();
};
noButton.down = function (x, y, obj) {
if (onNo) onNo();
self.destroy();
};
return self;
});
var FloatingReward = Container.expand(function (type) {
var self = Container.call(this);
var assetName = type === 'magnet' ? 'magnetReward' : 'xpReward';
var graphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
// Add text to show reward type and value
var rewardText = new Text2('', {
size: 40,
fill: 0xFFFFFF
});
rewardText.anchor.set(0.5, 0.5);
rewardText.y = 60; // Position below the icon
self.addChild(rewardText);
if (type === 'magnet') {
rewardText.setText('MAGNET\n+' + formatNumber(perClickValue * 10));
} else {
rewardText.setText('XP\n+5');
}
self.rewardType = type;
self.lifetime = 0;
self.update = function () {
self.lifetime++;
self.y -= 2; // Float upward
var alphaValue = Math.max(0, 1 - self.lifetime / 120); // Fade out over 2 seconds
self.alpha = alphaValue;
rewardText.alpha = alphaValue; // Make text fade with the reward
// Update text to match current perClickValue for magnet rewards
if (self.rewardType === 'magnet') {
rewardText.setText('MAGNET\n+' + formatNumber(perClickValue * 10));
}
if (self.lifetime > 120) {
self.destroy();
var index = floatingRewards.indexOf(self);
if (index > -1) {
floatingRewards.splice(index, 1);
}
}
};
self.down = function (x, y, obj) {
if (self.rewardType === 'magnet') {
scrap = scrap.add(perClickValue.multiply(10)); // Magnet gives 10x click value
magnet = magnet.add(1); // Increase magnet count by 1
// Create floating text showing magnet reward
createFloatingText('+1 magnet', self.x, self.y, 0xFFD700);
} else {
xp = xp.add(1);
checkLevelUp();
// Create floating text showing XP reward
createFloatingText('+1 xp', self.x, self.y, 0x9C27B0);
}
LK.getSound('reward').play();
updateUI();
self.destroy();
var index = floatingRewards.indexOf(self);
if (index > -1) {
floatingRewards.splice(index, 1);
}
};
return self;
});
var FloatingText = Container.expand(function (text, x, y, color) {
var self = Container.call(this);
self.x = x;
self.y = y;
var textObj = new Text2(text, {
size: 80,
fill: color
});
textObj.anchor.set(0.5, 0.5);
self.addChild(textObj);
self.lifetime = 0;
self.update = function () {
self.lifetime++;
self.y -= 3; // Float upward
self.alpha = Math.max(0, 1 - self.lifetime / 120); // Fade out over 2 seconds
if (self.lifetime >= 120) {
self.destroy();
var index = floatingTexts.indexOf(self);
if (index > -1) {
floatingTexts.splice(index, 1);
}
}
};
return self;
});
var MultiplierUpgradeButton = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
});
graphics.tint = 0x9c27b0; // Purple tint to differentiate from regular upgrade
self.down = function (x, y, obj) {
// Check if settings panel is open - if so, disable interaction
if (settingsPanel && settingsPanel.visible) {
return;
}
// Check if save panel is open - if so, disable interaction
if (savePanel && savePanel.visible) {
return;
}
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
var upgradeCost = getMultiplierUpgradeCost();
if (cash.gte(upgradeCost) && multiplierTier < 25) {
cash = cash.subtract(upgradeCost);
multiplierTier++;
perClickValue = getPerClickValue();
// Give XP for upgrading
xp = xp.add(3);
checkLevelUp();
// Visual feedback
tween(graphics, {
scaleX: 0.95,
scaleY: 0.95
}, {
duration: 100
});
tween(graphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
updateUI();
LK.getSound('upgrade').play();
}
};
return self;
});
var SavePanel = Container.expand(function () {
var self = Container.call(this);
// Panel background - moved down and sized to fit 4 slots properly
var panelBg = LK.getAsset('upgradeButton', {
anchorX: 0,
anchorY: 0,
scaleX: 5.0,
scaleY: 11.67
});
panelBg.tint = 0x222222;
panelBg.y = 200; // Move background down
self.addChild(panelBg);
// Title
var titleText = new Text2('SAVE SYSTEM', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0);
titleText.x = 1000;
titleText.y = 250;
self.addChild(titleText);
// Create 4 save slots vertically stacked with wider positioning
for (var i = 0; i < 4; i++) {
createSaveSlot(self, i, 100, 350 + i * 200);
}
// Auto-save toggle button
var autoSaveToggle = new Text2('AUTO-SAVE: ON', {
size: 45,
fill: 0x00FF00
});
autoSaveToggle.anchor.set(0.5, 0.5);
autoSaveToggle.x = 1000;
autoSaveToggle.y = 1150;
self.addChild(autoSaveToggle);
autoSaveToggle.down = function (x, y, obj) {
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
toggleAutoSave();
};
return self;
});
var SellButton = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('sellButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
// Check if upgrade panel is open - if so, disable interaction
if (upgradePanel && upgradePanel.visible) {
return;
}
// Check if settings panel is open - if so, disable interaction
if (settingsPanel && settingsPanel.visible) {
return;
}
// Check if save panel is open - if so, disable interaction
if (savePanel && savePanel.visible) {
return;
}
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
if (scrap.gte(2)) {
var sellAmount = scrap;
var cashEarned = sellAmount.multiply(0.5);
cash = cash.add(cashEarned);
scrap = new BigNumber(Math.random(), 0); // Leave 0-1 scrap remaining
// Visual feedback
tween(graphics, {
scaleX: 0.9,
scaleY: 0.9
}, {
duration: 150
});
tween(graphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 150
});
updateUI();
LK.getSound('sell').play();
}
};
return self;
});
var UpgradeButton = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
// Check if settings panel is open - if so, disable interaction
if (settingsPanel && settingsPanel.visible) {
return;
}
// Check if save panel is open - if so, disable interaction
if (savePanel && savePanel.visible) {
return;
}
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
var upgradeCost = getUpgradeCost();
if (cash.gte(upgradeCost) && upgradeTier < 1600) {
cash = cash.subtract(upgradeCost);
upgradeTier++;
perClickValue = getPerClickValue();
// Give XP for upgrading
xp = xp.add(5);
checkLevelUp();
// Visual feedback
tween(graphics, {
scaleX: 0.95,
scaleY: 0.95
}, {
duration: 100
});
tween(graphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
updateUI();
LK.getSound('upgrade').play();
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
// Game variables - load from storage with defaults, using BigNumber system
// Helper function for formatting big numbers with letter notation
function formatBigNumber(mantissa, exponent) {
if (exponent < 1000) {
return mantissa.toFixed(2).replace(/\.?0+$/, '') + 'e' + exponent;
}
// Use letter notation for very large exponents
var letterIndex = Math.floor((exponent - 3) / 3);
var adjustedMantissa = mantissa * Math.pow(10, (exponent - 3) % 3);
var letter;
if (letterIndex < 26) {
letter = String.fromCharCode(97 + letterIndex); // a-z
} else if (letterIndex < 52) {
letter = String.fromCharCode(65 + letterIndex - 26); // A-Z
} else if (letterIndex < 78) {
var doubleLetterIndex = letterIndex - 52;
var firstLetter = String.fromCharCode(97 + doubleLetterIndex);
letter = '(' + firstLetter + firstLetter + ')';
} else {
return mantissa.toFixed(2) + 'e' + exponent;
}
return adjustedMantissa.toFixed(2).replace(/\.?0+$/, '') + letter;
}
var scrap = new BigNumber(storage.scrap ? parseFloat(storage.scrap) : 0, storage.scrapExp || 0);
var cash = new BigNumber(storage.cash ? parseFloat(storage.cash) : 0, storage.cashExp || 0);
var totalClicks = new BigNumber(storage.totalClicks ? parseFloat(storage.totalClicks) : 0, storage.totalClicksExp || 0);
var upgradeTier = storage.upgradeTier || 0;
var svLevel = storage.svLevel || 0;
var xp = new BigNumber(storage.xp ? parseFloat(storage.xp) : 0, storage.xpExp || 0);
var magnet = new BigNumber(storage.magnet ? parseFloat(storage.magnet) : 0, storage.magnetExp || 0);
var multiplierTier = storage.multiplierTier || 0;
var goldScrap = new BigNumber(storage.goldScrap ? parseFloat(storage.goldScrap) : 0, storage.goldScrapExp || 0);
var perClickValue = getPerClickValue();
var floatingRewards = [];
var floatingTexts = [];
// Game elements
var clickButton = game.addChild(new ClickButton());
clickButton.x = 1024;
clickButton.y = 1200;
// Upgrade panel
var upgradePanel = new Container();
upgradePanel.x = 1024 - 700; // Center horizontally
upgradePanel.y = 1366 - 300; // Center vertically
upgradePanel.visible = false;
game.addChild(upgradePanel);
// Upgrade panel background
var upgradePanelBg = LK.getAsset('upgradeButton', {
anchorX: 0,
anchorY: 0,
scaleX: 3.5,
scaleY: 8.0
});
upgradePanelBg.tint = 0x333333;
upgradePanel.addChild(upgradePanelBg);
// Close button for upgrade panel
var upgradeCloseButton = new Text2('✕', {
size: 100,
fill: 0xFF0000
});
upgradeCloseButton.anchor.set(0.5, 0.5);
upgradeCloseButton.x = 1300;
upgradeCloseButton.y = 80;
upgradePanel.addChild(upgradeCloseButton);
upgradeCloseButton.down = function (x, y, obj) {
upgradePanel.visible = false;
// Show sell button and upgrade panel button when upgrade panel closes
sellButton.visible = true;
upgradePanelButton.visible = true;
};
var upgradeButton = upgradePanel.addChild(new UpgradeButton());
upgradeButton.x = 700;
upgradeButton.y = 250;
var multiplierUpgradeButton = upgradePanel.addChild(new MultiplierUpgradeButton());
multiplierUpgradeButton.x = 700;
multiplierUpgradeButton.y = 420;
// Gold Scrap Panel Button (moved to main game, below upgrade panel button)
var goldScrapPanelButton = new Text2('GOLD SCRAP', {
size: 50,
fill: 0xFFD700
});
goldScrapPanelButton.anchor.set(0.5, 0.5);
goldScrapPanelButton.x = 1024;
goldScrapPanelButton.y = 1930;
game.addChild(goldScrapPanelButton);
goldScrapPanelButton.down = function (x, y, obj) {
// Check if settings panel is open - if so, disable interaction
if (settingsPanel && settingsPanel.visible) {
return;
}
// Check if save panel is open - if so, disable interaction
if (savePanel && savePanel.visible) {
return;
}
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
if (goldScrapPanel) {
goldScrapPanel.visible = !goldScrapPanel.visible;
}
};
// Gold Scrap panel
var goldScrapPanel = new Container();
goldScrapPanel.x = 1024 - 700; // Center horizontally
goldScrapPanel.y = 1366 - 300; // Center vertically
goldScrapPanel.visible = false;
game.addChild(goldScrapPanel);
// Gold Scrap panel background
var goldScrapPanelBg = LK.getAsset('upgradeButton', {
anchorX: 0,
anchorY: 0,
scaleX: 3.5,
scaleY: 6.0
});
goldScrapPanelBg.tint = 0x444400;
goldScrapPanel.addChild(goldScrapPanelBg);
// Close button for gold scrap panel
var goldScrapCloseButton = new Text2('✕', {
size: 100,
fill: 0xFF0000
});
goldScrapCloseButton.anchor.set(0.5, 0.5);
goldScrapCloseButton.x = 1300;
goldScrapCloseButton.y = 80;
goldScrapPanel.addChild(goldScrapCloseButton);
goldScrapCloseButton.down = function (x, y, obj) {
goldScrapPanel.visible = false;
};
// Gold Scrap conversion button
var goldScrapConvertButton = new Text2('CONVERT SCRAP\n(1000 Scrap = 1 Gold)', {
size: 45,
fill: 0xFFD700
});
goldScrapConvertButton.anchor.set(0.5, 0.5);
goldScrapConvertButton.x = 700;
goldScrapConvertButton.y = 250;
goldScrapPanel.addChild(goldScrapConvertButton);
goldScrapConvertButton.down = function (x, y, obj) {
// Ensure scrap is a BigNumber before using gte method
if (!(scrap instanceof BigNumber)) {
scrap = new BigNumber(scrap || 0, 0);
}
if (scrap.gte(1000)) {
// Use BigNumber division to handle very large numbers
var thousandBN = new BigNumber(1000, 0);
var goldScrapToAddBN = new BigNumber(Math.floor(scrap.mantissa), scrap.exponent - 3); // Divide by 1000 = subtract 3 from exponent
goldScrap = goldScrap.add(goldScrapToAddBN);
// Reset all values to 0 except magnet and gold scrap
scrap = new BigNumber(0, 0);
cash = new BigNumber(0, 0);
totalClicks = new BigNumber(0, 0);
upgradeTier = 0;
svLevel = 0;
xp = new BigNumber(0, 0);
multiplierTier = 0;
perClickValue = getPerClickValue();
updateUI();
LK.effects.flashScreen(0xFFD700, 1000);
}
};
// Gold Scrap display text in panel
var goldScrapPanelText = new Text2('Gold Scrap: 0', {
size: 65,
fill: 0xFFD700
});
goldScrapPanelText.anchor.set(0.5, 0.5);
goldScrapPanelText.x = 700;
goldScrapPanelText.y = 160;
goldScrapPanel.addChild(goldScrapPanelText);
// Potential Gold Scrap conversion display
var potentialGoldScrapText = new Text2('Potential: 0', {
size: 55,
fill: 0xFFD700
});
potentialGoldScrapText.anchor.set(0.5, 0.5);
potentialGoldScrapText.x = 700;
potentialGoldScrapText.y = 350;
goldScrapPanel.addChild(potentialGoldScrapText);
// Boost text
var boostText = new Text2('Boost: 1x', {
size: 60,
fill: 0xFFD700
});
boostText.anchor.set(0.5, 0.5);
boostText.x = 700;
boostText.y = 400;
goldScrapPanel.addChild(boostText);
var sellButton = game.addChild(new SellButton());
sellButton.x = 1024;
sellButton.y = 1650;
// UI Text elements
var goldScrapText = new Text2('Gold Scrap: 0', {
size: 80,
fill: 0xFFD700
});
goldScrapText.anchor.set(0.5, 0);
goldScrapText.x = 1024;
goldScrapText.y = 320;
game.addChild(goldScrapText);
var scrapText = new Text2('Scrap: 0', {
size: 80,
fill: 0xFFFFFF
});
scrapText.anchor.set(0.5, 0);
scrapText.x = 1024;
scrapText.y = 400;
game.addChild(scrapText);
var cashText = new Text2('Cash: $0', {
size: 70,
fill: 0x00FF00
});
cashText.anchor.set(0.5, 0);
cashText.x = 1024;
cashText.y = 480;
game.addChild(cashText);
var levelText = new Text2('SV Level: 0', {
size: 75,
fill: 0xFFFF00
});
levelText.anchor.set(0.5, 0);
levelText.x = 1024;
levelText.y = 560;
game.addChild(levelText);
var xpText = new Text2('XP: 0/100', {
size: 65,
fill: 0xFF00FF
});
xpText.anchor.set(0.5, 0);
xpText.x = 1024;
xpText.y = 640;
game.addChild(xpText);
var clickValueText = new Text2('Per Click: 1', {
size: 70,
fill: 0x00FFFF
});
clickValueText.anchor.set(0.5, 0);
clickValueText.x = 1024;
clickValueText.y = 720;
game.addChild(clickValueText);
var upgradeText = new Text2('Upgrade (Tier 0): $10', {
size: 60,
fill: 0xFFFFFF
});
upgradeText.anchor.set(0.5, 0.5);
upgradeText.x = 700;
upgradeText.y = 250;
upgradePanel.addChild(upgradeText);
var multiplierUpgradeText = new Text2('Multiplier (Tier 0): $50', {
size: 55,
fill: 0xFFFFFF
});
multiplierUpgradeText.anchor.set(0.5, 0.5);
multiplierUpgradeText.x = 700;
multiplierUpgradeText.y = 420;
upgradePanel.addChild(multiplierUpgradeText);
var sellText = new Text2('Sell Scrap', {
size: 55,
fill: 0xFFFFFF
});
sellText.anchor.set(0.5, 0.5);
sellText.x = 1024;
sellText.y = 1650;
game.addChild(sellText);
// Upgrade panel button
var upgradePanelButton = new Text2('UPGRADES', {
size: 50,
fill: 0x4CAF50
});
upgradePanelButton.anchor.set(0.5, 0.5);
upgradePanelButton.x = 1024;
upgradePanelButton.y = 1800;
game.addChild(upgradePanelButton);
upgradePanelButton.down = function (x, y, obj) {
// Check if settings panel is open - if so, disable interaction
if (settingsPanel && settingsPanel.visible) {
return;
}
// Check if save panel is open - if so, disable interaction
if (savePanel && savePanel.visible) {
return;
}
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
upgradePanel.visible = !upgradePanel.visible;
// Hide/show sell button and upgrade panel button when upgrade panel opens/closes
sellButton.visible = !upgradePanel.visible;
upgradePanelButton.visible = !upgradePanel.visible;
};
var totalClicksText = new Text2('Total Clicks: 0', {
size: 60,
fill: 0xCCCCCC
});
totalClicksText.anchor.set(0.5, 0);
totalClicksText.x = 1024;
totalClicksText.y = 800;
game.addChild(totalClicksText);
var magnetText = new Text2('Magnet: 0', {
size: 60,
fill: 0xFFD700
});
magnetText.anchor.set(0.5, 0);
magnetText.x = 1024;
magnetText.y = 880;
game.addChild(magnetText);
var versionText = new Text2('Pre_Alpha 8', {
size: 80,
fill: 0x888888
});
versionText.anchor.set(1, 1);
versionText.x = 2048 - 20;
versionText.y = 2732 - 20;
game.addChild(versionText);
// Save panel
var savePanel = new SavePanel();
savePanel.x = 1024 - 950; // Move panel to the left
savePanel.y = 1366 - 500; // Move panel down by 200 pixels
savePanel.visible = false;
game.addChild(savePanel);
// Close button for save panel
var saveCloseButton = new Text2('✕', {
size: 100,
fill: 0xFF0000
});
saveCloseButton.anchor.set(0.5, 0.5);
saveCloseButton.x = 1800;
saveCloseButton.y = 300;
savePanel.addChild(saveCloseButton);
saveCloseButton.down = function (x, y, obj) {
savePanel.visible = false;
};
// Settings panel
var settingsPanel = new Container();
settingsPanel.x = 1024 - 700; // Center horizontally (half of scaled width)
settingsPanel.y = 1366 - 240; // Center vertically (half of scaled height)
settingsPanel.visible = false;
game.addChild(settingsPanel);
// Settings panel background
var settingsBg = LK.getAsset('upgradeButton', {
anchorX: 0,
anchorY: 0,
scaleX: 3.5,
scaleY: 5.0
});
settingsBg.tint = 0x444444;
settingsPanel.addChild(settingsBg);
// Settings button
var settingsButton = new Text2('⚙️', {
size: 100,
fill: 0xFFFFFF
});
settingsButton.anchor.set(0, 1);
settingsButton.x = 80;
settingsButton.y = 2732 - 120;
game.addChild(settingsButton);
settingsButton.down = function (x, y, obj) {
// Check if upgrade panel is open - if so, disable interaction
if (upgradePanel && upgradePanel.visible) {
return;
}
// Check if save panel is open - if so, disable interaction
if (savePanel && savePanel.visible) {
return;
}
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
settingsPanel.visible = !settingsPanel.visible;
};
// Save panel button inside settings panel
var savePanelButton = new Text2('SAVE SYSTEM', {
size: 60,
fill: 0x00FFFF
});
savePanelButton.anchor.set(0.5, 0.5);
savePanelButton.x = 700;
savePanelButton.y = 160;
settingsPanel.addChild(savePanelButton);
savePanelButton.down = function (x, y, obj) {
settingsPanel.visible = false; // Close settings panel
savePanel.visible = !savePanel.visible;
};
// Hard reset button - moved down and made bigger
var hardResetButton = new Text2('HARD RESET', {
size: 70,
fill: 0xFF4444
});
hardResetButton.anchor.set(0.5, 0.5);
hardResetButton.x = 700;
hardResetButton.y = 300;
settingsPanel.addChild(hardResetButton);
hardResetButton.down = function (x, y, obj) {
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
// Create confirmation dialog
var confirmDialog = new ConfirmationDialog('Reset all progress?', function () {
// Yes - reset everything
scrap = new BigNumber(0, 0);
cash = new BigNumber(0, 0);
totalClicks = new BigNumber(0, 0);
upgradeTier = 0;
svLevel = 0;
xp = new BigNumber(0, 0);
magnet = new BigNumber(0, 0);
multiplierTier = 0;
goldScrap = new BigNumber(0, 0);
perClickValue = getPerClickValue();
updateUI();
settingsPanel.visible = false;
LK.effects.flashScreen(0xFF0000, 1000);
}, function () {
// No - do nothing
});
// Position dialog in center of screen
confirmDialog.x = 1024 - 600;
confirmDialog.y = 1366 - 180;
game.addChild(confirmDialog);
};
// Helper functions
function formatNumber(num) {
// Type checking to prevent toFixed errors
if (typeof num !== 'number' || isNaN(num) || num === null || num === undefined) {
return '0.00';
}
if (num < 1000) {
return num.toFixed(2);
}
if (num < 1000000) {
return (num / 1000).toFixed(2).replace(/\.?0+$/, '') + '(K)';
}
if (num < 1000000000) {
return (num / 1000000).toFixed(2).replace(/\.?0+$/, '') + '(M)';
}
if (num < 1000000000000) {
return (num / 1000000000).toFixed(2).replace(/\.?0+$/, '') + '(B)';
}
if (num < 1000000000000000) {
return (num / 1000000000000).toFixed(2).replace(/\.?0+$/, '') + '(T)';
}
// For numbers >= 1e15, use letters a-z then A-Z then AA-ZZ format
var exponent = Math.floor(Math.log10(num));
var letterIndex = Math.floor((exponent - 15) / 3);
var mantissa = num / Math.pow(10, 15 + letterIndex * 3);
var letter;
if (letterIndex < 26) {
letter = String.fromCharCode(97 + letterIndex); // a-z
} else if (letterIndex < 52) {
letter = String.fromCharCode(65 + letterIndex - 26); // A-Z
} else if (letterIndex < 78) {
// (aa)-(zz) format (52-77 range)
var doubleLetterIndex = letterIndex - 52;
var firstLetter = String.fromCharCode(97 + doubleLetterIndex); // a-z
letter = '(' + firstLetter + firstLetter + ')'; // (aa), (bb), (cc), etc.
} else {
// Scientific notation for very large numbers
return (num / Math.pow(10, Math.floor(Math.log10(num)))).toFixed(2) + ' E' + Math.floor(Math.log10(num));
}
return mantissa.toFixed(2).replace(/\.?0+$/, '') + letter;
}
function getPerClickValue() {
// Calculate base value from upgrade tiers with progressive scaling
var baseValue = new BigNumber(1, 0);
for (var i = 1; i <= upgradeTier; i++) {
var multiplier;
if (i % 100 === 0) {
multiplier = 1.8; // Every 100th tier - higher scaling due to high cost
} else if (i % 25 === 0) {
multiplier = 1.6; // Every 25th tier - increased scaling
} else if (i % 10 === 0) {
multiplier = 1.4; // Every 10th tier - moderate scaling
} else {
multiplier = 1.2; // All other tiers - reduced base scaling
}
baseValue = baseValue.multiply(multiplier);
}
// Apply multiplier tier bonus with balanced progression
var clickMultiplier = 1;
for (var j = 1; j <= multiplierTier; j++) {
if (j === 1) {
clickMultiplier += 0.8; // First tier: x1.8 total (reduced from 2.5x)
} else if (j === 2) {
clickMultiplier += 0.7; // Second tier: x2.5 total (reduced from 3.7x)
} else if (j === 3) {
clickMultiplier += 0.6; // Third tier: x3.1 total (reduced from 4.5x)
} else if (j === 4) {
clickMultiplier += 1.2; // Fourth tier: x4.3 total (reduced from 6.5x)
} else if (j === 5) {
clickMultiplier += 0.4; // Fifth tier: x4.7 total (reduced from 7.0x)
} else if (j % 5 === 0) {
clickMultiplier += 1.8; // Every 5th tier: large boost (reduced from 3.0)
} else if (j % 3 === 0) {
clickMultiplier += 1.2; // Every 3rd tier: medium boost (reduced from 1.8)
} else if (j % 2 === 0) {
clickMultiplier += 0.9; // Every 2nd tier: small-medium boost (reduced from 1.3)
} else {
clickMultiplier += 0.5; // Other tiers: small boost (reduced from 0.7)
}
}
// Balance the multiplier effect to maintain reasonable progression
baseValue = baseValue.multiply(clickMultiplier);
// Apply gold scrap boost - start at 1x boost
// Ensure goldScrap is a BigNumber object
if (!(goldScrap instanceof BigNumber)) {
goldScrap = new BigNumber(goldScrap || 0, 0);
}
var goldScrapBoost = new BigNumber(1, 0); // Start at 1x boost
// Add 1.5x boost per gold scrap when gold scrap >= 2
if (goldScrap.gte(2)) {
var boostMultiplier = goldScrap.multiply(1.5); // 1.5x boost per gold scrap
goldScrapBoost = goldScrapBoost.multiply(boostMultiplier);
}
baseValue = baseValue.multiply(goldScrapBoost);
return baseValue;
}
;
function getMultiplierUpgradeCost() {
var baseCost = new BigNumber(75, 0); // Higher base cost to match reduced multiplier benefits
for (var i = 1; i <= multiplierTier; i++) {
var costMultiplier;
if (i % 10 === 0) {
costMultiplier = 2.5; // Every 10th tier - significant cost increase
} else if (i % 5 === 0) {
costMultiplier = 2.2; // Every 5th tier - high cost increase
} else {
costMultiplier = 2.0; // Standard tiers - balanced scaling
}
baseCost = baseCost.multiply(costMultiplier);
}
return baseCost;
}
function getUpgradeCost() {
var baseCost = new BigNumber(25, 0);
for (var i = 1; i <= upgradeTier; i++) {
var multiplier;
if (i % 100 === 0) {
multiplier = 1.8 * 1.1; // Every 100th tier - per-click scaling + 1.1x
} else if (i % 25 === 0) {
multiplier = 1.6 * 1.1; // Every 25th tier - per-click scaling + 1.1x
} else if (i % 10 === 0) {
multiplier = 1.4 * 1.1; // Every 10th tier - per-click scaling + 1.1x
} else {
multiplier = 1.2 * 1.1; // All other tiers - per-click scaling + 1.1x
}
baseCost = baseCost.multiply(multiplier);
}
return baseCost;
}
function getXPRequired() {
return 100 + svLevel * 50;
}
function checkLevelUp() {
var xpRequired = getXPRequired();
if (xp >= xpRequired) {
xp -= xpRequired;
svLevel++;
// Flash effect for level up
LK.effects.flashScreen(0xffff00, 500);
}
}
function createMagnetReward() {
var reward = game.addChild(new FloatingReward('magnet'));
reward.x = 1024 + (Math.random() - 0.5) * 600;
reward.y = 1400;
floatingRewards.push(reward);
}
function createXPReward() {
var reward = game.addChild(new FloatingReward('xp'));
reward.x = 1024 + (Math.random() - 0.5) * 600;
reward.y = 1400;
floatingRewards.push(reward);
}
function createFloatingText(text, x, y, color) {
var floatingText = game.addChild(new FloatingText(text, x, y, color));
floatingTexts.push(floatingText);
}
function updateUI() {
// Update gold scrap display
goldScrapText.setText('Gold Scrap: ' + goldScrap.toString());
// Show decimal values for scrap instead of rounded integers
scrapText.setText('Scrap: ' + scrap.toString());
cashText.setText('Cash: $' + cash.toString());
levelText.setText('SV Level: ' + formatNumber(svLevel));
xpText.setText('XP: ' + xp.toString() + '/' + formatNumber(getXPRequired()));
// Show decimal values for per-click instead of rounded integers
clickValueText.setText('Per Click: ' + perClickValue.toString());
totalClicksText.setText('Total Clicks: ' + totalClicks.toString());
magnetText.setText('Magnet: ' + magnet.toString());
if (upgradeTier < 1600) {
var upgradeCost = getUpgradeCost();
var upgradeCostText = upgradeCost.toString();
upgradeText.setText('Upgrade (Tier ' + upgradeTier + '): $' + upgradeCostText);
// Ensure cash is a BigNumber before using gte method
if (!(cash instanceof BigNumber)) {
cash = new BigNumber(cash || 0, 0);
}
// Ensure upgradeCost is also a BigNumber before comparison
if (!(upgradeCost instanceof BigNumber)) {
upgradeCost = new BigNumber(upgradeCost || 0, 0);
}
upgradeText.fill = cash.gte(upgradeCost) ? "#00ff00" : "#ff0000";
} else {
upgradeText.setText('MAX TIER REACHED');
upgradeText.fill = "#ffff00";
}
// Update multiplier upgrade text
if (multiplierTier < 25) {
var multiplierCost = getMultiplierUpgradeCost();
var multiplierCostText = multiplierCost.toString();
// Calculate current multiplier using same logic as getPerClickValue
var currentMultiplier = 1;
for (var k = 1; k <= multiplierTier; k++) {
if (k === 1) {
currentMultiplier += 1.5;
} else if (k === 2) {
currentMultiplier += 1.2;
} else if (k === 3) {
currentMultiplier += 0.8;
} else if (k === 4) {
currentMultiplier += 2.0;
} else if (k === 5) {
currentMultiplier += 0.5;
} else if (k % 5 === 0) {
currentMultiplier += 3.0;
} else if (k % 3 === 0) {
currentMultiplier += 1.8;
} else if (k % 2 === 0) {
currentMultiplier += 1.3;
} else {
currentMultiplier += 0.7;
}
}
multiplierUpgradeText.setText('Multiplier x' + currentMultiplier.toFixed(1) + ' (Tier ' + multiplierTier + '): $' + multiplierCostText);
// Ensure cash is a BigNumber before using gte method
if (!(cash instanceof BigNumber)) {
cash = new BigNumber(cash || 0, 0);
}
// Ensure multiplierCost is also a BigNumber before comparison
if (!(multiplierCost instanceof BigNumber)) {
multiplierCost = new BigNumber(multiplierCost || 0, 0);
}
multiplierUpgradeText.fill = cash.gte(multiplierCost) ? "#00ff00" : "#ff0000";
} else {
multiplierUpgradeText.setText('MAX MULTIPLIER REACHED');
multiplierUpgradeText.fill = "#ffff00";
}
// Update gold scrap panel text
goldScrapPanelText.setText('Gold Scrap: ' + goldScrap.toString());
// Update boost text
var currentBoost = new BigNumber(1, 0); // Start at 1x
if (goldScrap.gte(2)) {
currentBoost = goldScrap.multiply(1.5); // 1.5x boost per gold scrap
}
boostText.setText('Boost: ' + currentBoost.toString() + 'x');
// Update potential gold scrap display
// Use BigNumber division to handle very large numbers
var potentialGoldScrapBN = new BigNumber(Math.floor(scrap.mantissa), scrap.exponent - 3); // Divide by 1000 = subtract 3 from exponent
var potentialGoldScrapNum = potentialGoldScrapBN.toNumber();
if (potentialGoldScrapNum < 1000 && potentialGoldScrapNum !== Infinity) {
potentialGoldScrapText.setText('Potential: ' + potentialGoldScrapNum.toFixed(0));
} else {
potentialGoldScrapText.setText('Potential: ' + potentialGoldScrapBN.toString());
}
// Update gold scrap convert button text
// Ensure scrap is a BigNumber before using gte method
if (!(scrap instanceof BigNumber)) {
scrap = new BigNumber(scrap || 0, 0);
}
if (scrap.gte(1000)) {
goldScrapConvertButton.fill = 0x00FF00;
} else {
goldScrapConvertButton.fill = 0xFF0000;
}
// Save game state with BigNumber support
// Ensure all BigNumber objects are properly initialized before accessing properties
if (!(scrap instanceof BigNumber)) {
scrap = new BigNumber(scrap || 0, 0);
}
if (!(cash instanceof BigNumber)) {
cash = new BigNumber(cash || 0, 0);
}
if (!(totalClicks instanceof BigNumber)) {
totalClicks = new BigNumber(totalClicks || 0, 0);
}
if (!(xp instanceof BigNumber)) {
xp = new BigNumber(xp || 0, 0);
}
if (!(magnet instanceof BigNumber)) {
magnet = new BigNumber(magnet || 0, 0);
}
if (!(goldScrap instanceof BigNumber)) {
goldScrap = new BigNumber(goldScrap || 0, 0);
}
storage.scrap = scrap.mantissa;
storage.scrapExp = scrap.exponent;
storage.cash = cash.mantissa;
storage.cashExp = cash.exponent;
storage.totalClicks = totalClicks.mantissa;
storage.totalClicksExp = totalClicks.exponent;
storage.upgradeTier = upgradeTier;
storage.svLevel = svLevel;
storage.xp = xp.mantissa;
storage.xpExp = xp.exponent;
storage.magnet = magnet.mantissa;
storage.magnetExp = magnet.exponent;
storage.multiplierTier = multiplierTier;
storage.goldScrap = goldScrap.mantissa;
storage.goldScrapExp = goldScrap.exponent;
}
// Initial UI update
updateUI();
// Auto-save timer
var autoSaveTimer = 0;
// UI update timer
var uiUpdateTimer = 0;
// Auto-save enabled flag
var autoSaveEnabled = storage.autoSaveEnabled !== undefined ? storage.autoSaveEnabled : true;
// Toggle auto-save function
function toggleAutoSave() {
autoSaveEnabled = !autoSaveEnabled;
storage.autoSaveEnabled = autoSaveEnabled;
if (autoSaveEnabled) {
createFloatingText('AUTO-SAVE ON', 1024, 1366, 0x00FF00);
} else {
createFloatingText('AUTO-SAVE OFF', 1024, 1366, 0xFF0000);
}
updateAutoSaveUI();
}
// Update auto-save UI function
function updateAutoSaveUI() {
if (savePanel && savePanel.children) {
// Find the auto-save toggle button and update its text/color
for (var i = 0; i < savePanel.children.length; i++) {
var child = savePanel.children[i];
if (child instanceof Text2 && child.text && child.text.includes('AUTO-SAVE')) {
child.setText(autoSaveEnabled ? 'AUTO-SAVE: ON' : 'AUTO-SAVE: OFF');
child.fill = autoSaveEnabled ? 0x00FF00 : 0xFF0000;
break;
}
}
}
}
game.update = function () {
// Update floating rewards
for (var i = floatingRewards.length - 1; i >= 0; i--) {
var reward = floatingRewards[i];
if (reward.update) {
reward.update();
}
}
// Update floating texts
for (var j = floatingTexts.length - 1; j >= 0; j--) {
var floatingText = floatingTexts[j];
if (floatingText.update) {
floatingText.update();
}
}
// Update UI every second (60 ticks)
uiUpdateTimer++;
if (uiUpdateTimer >= 60) {
uiUpdateTimer = 0;
updateUI();
}
// Auto-save every second (60 ticks) - only if enabled
autoSaveTimer++;
if (autoSaveTimer >= 60) {
autoSaveTimer = 0;
if (autoSaveEnabled) {
// Save current game state with BigNumber support
// Ensure all BigNumber objects are properly initialized before accessing properties
if (!(scrap instanceof BigNumber)) {
scrap = new BigNumber(scrap || 0, 0);
}
if (!(cash instanceof BigNumber)) {
cash = new BigNumber(cash || 0, 0);
}
if (!(totalClicks instanceof BigNumber)) {
totalClicks = new BigNumber(totalClicks || 0, 0);
}
if (!(xp instanceof BigNumber)) {
xp = new BigNumber(xp || 0, 0);
}
if (!(magnet instanceof BigNumber)) {
magnet = new BigNumber(magnet || 0, 0);
}
if (!(goldScrap instanceof BigNumber)) {
goldScrap = new BigNumber(goldScrap || 0, 0);
}
storage.scrap = scrap.mantissa;
storage.scrapExp = scrap.exponent;
storage.cash = cash.mantissa;
storage.cashExp = cash.exponent;
storage.totalClicks = totalClicks.mantissa;
storage.totalClicksExp = totalClicks.exponent;
storage.upgradeTier = upgradeTier;
storage.svLevel = svLevel;
storage.xp = xp.mantissa;
storage.xpExp = xp.exponent;
storage.magnet = magnet.mantissa;
storage.magnetExp = magnet.exponent;
storage.multiplierTier = multiplierTier;
storage.goldScrap = goldScrap.mantissa;
storage.goldScrapExp = goldScrap.exponent;
storage.lastSaveTime = Date.now(); // Track when last saved
}
}
};
function createSaveSlot(parent, slotIndex, x, y) {
var slotContainer = new Container();
slotContainer.x = x;
slotContainer.y = y;
parent.addChild(slotContainer);
// Slot background - made wider
var slotBg = LK.getAsset('upgradeButton', {
anchorX: 0,
anchorY: 0,
scaleX: 6.0,
scaleY: 1.8
});
slotBg.tint = 0x333333;
slotContainer.addChild(slotBg);
// Slot title - larger text
var slotTitle = new Text2('SLOT ' + (slotIndex + 1), {
size: 65,
fill: 0xFFFFFF
});
slotTitle.anchor.set(0, 0);
slotTitle.x = 30;
slotTitle.y = 20;
slotContainer.addChild(slotTitle);
// Save info text - larger
var saveInfo = new Text2('Empty', {
size: 45,
fill: 0xCCCCCC
});
saveInfo.anchor.set(0, 0);
saveInfo.x = 30;
saveInfo.y = 85;
slotContainer.addChild(saveInfo);
// Save button - larger and repositioned
var saveBtn = new Text2('SAVE', {
size: 55,
fill: 0x00FF00
});
saveBtn.anchor.set(0.5, 0.5);
saveBtn.x = 550;
saveBtn.y = 80;
slotContainer.addChild(saveBtn);
// Load button - larger and repositioned
var loadBtn = new Text2('LOAD', {
size: 55,
fill: 0x0080FF
});
loadBtn.anchor.set(0.5, 0.5);
loadBtn.x = 750;
loadBtn.y = 80;
slotContainer.addChild(loadBtn);
// Delete button - larger and repositioned
var deleteBtn = new Text2('DELETE', {
size: 55,
fill: 0xFF0000
});
deleteBtn.anchor.set(0.5, 0.5);
deleteBtn.x = 1000;
deleteBtn.y = 80;
slotContainer.addChild(deleteBtn);
// Update slot display
function updateSlotDisplay() {
var saveKey = 'save_slot_' + slotIndex;
var saveData = storage[saveKey];
if (saveData && saveData !== null) {
var saveTime = saveData.saveTime ? new Date(saveData.saveTime) : null;
var timeStr = saveTime ? saveTime.getMonth() + 1 + '/' + saveTime.getDate() : 'Unknown';
var versionStr = saveData.gameVersion ? ' v' + saveData.gameVersion.replace('Pre_Alpha ', '') : '';
saveInfo.setText('SV Lvl: ' + formatNumber(saveData.svLevel || 0) + '\nCash: $' + formatNumber(parseFloat(saveData.cash) || 0) + '\nSaved: ' + timeStr + versionStr);
saveInfo.fill = 0xFFFFFF;
loadBtn.fill = 0x0080FF;
} else {
saveInfo.setText('Empty');
saveInfo.fill = 0xCCCCCC;
loadBtn.fill = 0x555555;
}
}
// Save button functionality
saveBtn.down = function (x, y, obj) {
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
var saveKey = 'save_slot_' + slotIndex;
var backupKey = saveKey + '_backup';
// Create backup of existing save before overwriting
var existingSave = storage[saveKey];
if (existingSave && existingSave !== null) {
storage[backupKey] = existingSave;
}
var saveData = {
scrap: scrap.toString(),
cash: cash.toString(),
totalClicks: totalClicks.toString(),
upgradeTier: upgradeTier,
svLevel: svLevel,
xp: xp.toString(),
magnet: magnet.toString(),
multiplierTier: multiplierTier,
goldScrap: goldScrap.toString(),
saveTime: Date.now(),
gameVersion: 'Pre_Alpha 8'
};
storage[saveKey] = saveData;
updateSlotDisplay();
createFloatingText('SAVED TO SLOT ' + (slotIndex + 1), 1024, 1366, 0x00FF00);
LK.effects.flashScreen(0x00FF00, 300);
};
// Load button functionality
loadBtn.down = function (x, y, obj) {
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
var saveKey = 'save_slot_' + slotIndex;
var saveData = storage[saveKey];
if (saveData && saveData !== null) {
scrap = parseFloat(saveData.scrap) || 0;
cash = parseFloat(saveData.cash) || 0;
totalClicks = parseFloat(saveData.totalClicks) || 0;
upgradeTier = saveData.upgradeTier || 0;
svLevel = saveData.svLevel || 0;
xp = parseFloat(saveData.xp) || 0;
magnet = parseFloat(saveData.magnet) || 0;
multiplierTier = saveData.multiplierTier || 0;
goldScrap = saveData.goldScrap || 0;
perClickValue = getPerClickValue();
updateUI();
LK.effects.flashScreen(0x0080FF, 300);
}
};
// Delete button functionality
deleteBtn.down = function (x, y, obj) {
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
var saveKey = 'save_slot_' + slotIndex;
var saveData = storage[saveKey];
// Only show confirmation if there's actually data to delete
if (saveData && saveData !== null) {
// Create confirmation dialog
var confirmDialog = new ConfirmationDialog('Delete save data?', function () {
// Yes - delete the save data
storage[saveKey] = null;
// Force update the display to show Empty
saveInfo.setText('Empty');
saveInfo.fill = 0xCCCCCC;
loadBtn.fill = 0x555555;
updateSlotDisplay();
LK.effects.flashScreen(0xFF0000, 300);
}, function () {
// No - do nothing
});
// Position dialog in center of screen
confirmDialog.x = 1024 - 600;
confirmDialog.y = 1366 - 180;
game.addChild(confirmDialog);
}
};
// Initial display update
updateSlotDisplay();
} /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var BigNumber = Container.expand(function (mantissa, exponent) {
var self = Container.call(this);
// Initialize mantissa and exponent
self.mantissa = mantissa || 1;
self.exponent = exponent || 0;
// Normalize the number (keep mantissa between 1 and 10)
self.normalize = function () {
if (self.mantissa === 0) {
self.exponent = 0;
return self;
}
while (Math.abs(self.mantissa) >= 10) {
self.mantissa /= 10;
self.exponent++;
}
while (Math.abs(self.mantissa) < 1 && self.mantissa !== 0) {
self.mantissa *= 10;
self.exponent--;
}
return self;
};
// Add operation
self.add = function (other) {
if (typeof other === 'number') {
other = new BigNumber(other, 0).normalize();
}
var expDiff = self.exponent - other.exponent;
var newMantissa, newExponent;
if (expDiff >= 15) {
// Other number is too small to matter
return new BigNumber(self.mantissa, self.exponent);
} else if (expDiff <= -15) {
// Self is too small to matter
return new BigNumber(other.mantissa, other.exponent);
} else {
// Both numbers are significant
if (self.exponent >= other.exponent) {
newExponent = self.exponent;
newMantissa = self.mantissa + other.mantissa * Math.pow(10, other.exponent - self.exponent);
} else {
newExponent = other.exponent;
newMantissa = other.mantissa + self.mantissa * Math.pow(10, self.exponent - other.exponent);
}
}
return new BigNumber(newMantissa, newExponent).normalize();
};
// Multiply operation
self.multiply = function (other) {
if (typeof other === 'number') {
other = new BigNumber(other, 0).normalize();
}
var newMantissa = self.mantissa * other.mantissa;
var newExponent = self.exponent + other.exponent;
return new BigNumber(newMantissa, newExponent).normalize();
};
// Subtract operation
self.subtract = function (other) {
if (typeof other === 'number') {
other = new BigNumber(other, 0).normalize();
}
var expDiff = self.exponent - other.exponent;
var newMantissa, newExponent;
if (expDiff >= 15) {
// Other number is too small to matter
return new BigNumber(self.mantissa, self.exponent);
} else if (expDiff <= -15) {
// Result would be negative of other
return new BigNumber(-other.mantissa, other.exponent);
} else {
if (self.exponent >= other.exponent) {
newExponent = self.exponent;
newMantissa = self.mantissa - other.mantissa * Math.pow(10, other.exponent - self.exponent);
} else {
newExponent = other.exponent;
newMantissa = self.mantissa * Math.pow(10, self.exponent - other.exponent) - other.mantissa;
}
}
return new BigNumber(newMantissa, newExponent).normalize();
};
// Compare if greater than or equal
self.gte = function (other) {
if (typeof other === 'number') {
other = new BigNumber(other, 0).normalize();
}
if (self.exponent > other.exponent) return true;
if (self.exponent < other.exponent) return false;
return self.mantissa >= other.mantissa;
};
// Compare if greater than
self.gt = function (other) {
if (typeof other === 'number') {
other = new BigNumber(other, 0).normalize();
}
if (self.exponent > other.exponent) return true;
if (self.exponent < other.exponent) return false;
return self.mantissa > other.mantissa;
};
// Convert to display string
self.toString = function () {
if (self.exponent < 3 && self.exponent >= 0) {
// Show as regular number for small values
var regularNum = self.mantissa * Math.pow(10, self.exponent);
// Ensure regularNum is a valid finite number before calling toFixed
if (typeof regularNum === 'number' && !isNaN(regularNum) && regularNum !== Infinity && regularNum !== -Infinity && regularNum > -Infinity) {
try {
return regularNum.toFixed(2);
} catch (e) {
// Fallback to scientific notation if toFixed fails
return self.mantissa.toFixed(2) + 'e' + self.exponent;
}
} else {
// Fallback to scientific notation if regularNum is invalid
return self.mantissa.toFixed(2) + 'e' + self.exponent;
}
} else if (self.exponent >= 3) {
// Use letter notation for large numbers
return formatBigNumber(self.mantissa, self.exponent);
} else {
// Scientific notation for very small numbers
return self.mantissa.toFixed(2) + 'e' + self.exponent;
}
};
// Convert to regular number (with precision loss for very large numbers)
self.toNumber = function () {
if (self.exponent > 308) return Infinity; // JavaScript limit
if (self.exponent < -308) return 0;
return self.mantissa * Math.pow(10, self.exponent);
};
self.normalize();
return self;
});
// Helper function for formatting big numbers with letter notation
var ClickButton = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('clickButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
// Check if upgrade panel is open - if so, disable interaction
if (upgradePanel && upgradePanel.visible) {
return;
}
// Check if settings panel is open - if so, disable interaction
if (settingsPanel && settingsPanel.visible) {
return;
}
// Check if save panel is open - if so, disable interaction
if (savePanel && savePanel.visible) {
return;
}
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
// Visual feedback
tween(graphics, {
scaleX: 0.9,
scaleY: 0.9
}, {
duration: 100
});
tween(graphics, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 100,
onFinish: function onFinish() {
tween(graphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
}
});
// Generate scrap
scrap = scrap.add(perClickValue);
totalClicks = totalClicks.add(1);
// Chance for rewards (15% for magnet, 25% for XP)
if (Math.random() < 0.15) {
createMagnetReward();
}
if (Math.random() < 0.25) {
createXPReward();
}
updateUI();
LK.getSound('click').play();
};
return self;
});
var ConfirmationDialog = Container.expand(function (message, onYes, onNo) {
var self = Container.call(this);
// Dialog background
var dialogBg = LK.getAsset('upgradeButton', {
anchorX: 0,
anchorY: 0,
scaleX: 3.0,
scaleY: 3.0
});
dialogBg.tint = 0x222222;
self.addChild(dialogBg);
// Message text
var messageText = new Text2(message, {
size: 60,
fill: 0xFFFFFF
});
messageText.anchor.set(0.5, 0.5);
messageText.x = 600;
messageText.y = 150;
self.addChild(messageText);
// Yes button
var yesButton = new Text2('YES', {
size: 70,
fill: 0x00FF00
});
yesButton.anchor.set(0.5, 0.5);
yesButton.x = 400;
yesButton.y = 250;
self.addChild(yesButton);
// No button
var noButton = new Text2('NO', {
size: 70,
fill: 0xFF0000
});
noButton.anchor.set(0.5, 0.5);
noButton.x = 800;
noButton.y = 250;
self.addChild(noButton);
yesButton.down = function (x, y, obj) {
if (onYes) onYes();
self.destroy();
};
noButton.down = function (x, y, obj) {
if (onNo) onNo();
self.destroy();
};
return self;
});
var FloatingReward = Container.expand(function (type) {
var self = Container.call(this);
var assetName = type === 'magnet' ? 'magnetReward' : 'xpReward';
var graphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
// Add text to show reward type and value
var rewardText = new Text2('', {
size: 40,
fill: 0xFFFFFF
});
rewardText.anchor.set(0.5, 0.5);
rewardText.y = 60; // Position below the icon
self.addChild(rewardText);
if (type === 'magnet') {
rewardText.setText('MAGNET\n+' + formatNumber(perClickValue * 10));
} else {
rewardText.setText('XP\n+5');
}
self.rewardType = type;
self.lifetime = 0;
self.update = function () {
self.lifetime++;
self.y -= 2; // Float upward
var alphaValue = Math.max(0, 1 - self.lifetime / 120); // Fade out over 2 seconds
self.alpha = alphaValue;
rewardText.alpha = alphaValue; // Make text fade with the reward
// Update text to match current perClickValue for magnet rewards
if (self.rewardType === 'magnet') {
rewardText.setText('MAGNET\n+' + formatNumber(perClickValue * 10));
}
if (self.lifetime > 120) {
self.destroy();
var index = floatingRewards.indexOf(self);
if (index > -1) {
floatingRewards.splice(index, 1);
}
}
};
self.down = function (x, y, obj) {
if (self.rewardType === 'magnet') {
scrap = scrap.add(perClickValue.multiply(10)); // Magnet gives 10x click value
magnet = magnet.add(1); // Increase magnet count by 1
// Create floating text showing magnet reward
createFloatingText('+1 magnet', self.x, self.y, 0xFFD700);
} else {
xp = xp.add(1);
checkLevelUp();
// Create floating text showing XP reward
createFloatingText('+1 xp', self.x, self.y, 0x9C27B0);
}
LK.getSound('reward').play();
updateUI();
self.destroy();
var index = floatingRewards.indexOf(self);
if (index > -1) {
floatingRewards.splice(index, 1);
}
};
return self;
});
var FloatingText = Container.expand(function (text, x, y, color) {
var self = Container.call(this);
self.x = x;
self.y = y;
var textObj = new Text2(text, {
size: 80,
fill: color
});
textObj.anchor.set(0.5, 0.5);
self.addChild(textObj);
self.lifetime = 0;
self.update = function () {
self.lifetime++;
self.y -= 3; // Float upward
self.alpha = Math.max(0, 1 - self.lifetime / 120); // Fade out over 2 seconds
if (self.lifetime >= 120) {
self.destroy();
var index = floatingTexts.indexOf(self);
if (index > -1) {
floatingTexts.splice(index, 1);
}
}
};
return self;
});
var MultiplierUpgradeButton = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
});
graphics.tint = 0x9c27b0; // Purple tint to differentiate from regular upgrade
self.down = function (x, y, obj) {
// Check if settings panel is open - if so, disable interaction
if (settingsPanel && settingsPanel.visible) {
return;
}
// Check if save panel is open - if so, disable interaction
if (savePanel && savePanel.visible) {
return;
}
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
var upgradeCost = getMultiplierUpgradeCost();
if (cash.gte(upgradeCost) && multiplierTier < 25) {
cash = cash.subtract(upgradeCost);
multiplierTier++;
perClickValue = getPerClickValue();
// Give XP for upgrading
xp = xp.add(3);
checkLevelUp();
// Visual feedback
tween(graphics, {
scaleX: 0.95,
scaleY: 0.95
}, {
duration: 100
});
tween(graphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
updateUI();
LK.getSound('upgrade').play();
}
};
return self;
});
var SavePanel = Container.expand(function () {
var self = Container.call(this);
// Panel background - moved down and sized to fit 4 slots properly
var panelBg = LK.getAsset('upgradeButton', {
anchorX: 0,
anchorY: 0,
scaleX: 5.0,
scaleY: 11.67
});
panelBg.tint = 0x222222;
panelBg.y = 200; // Move background down
self.addChild(panelBg);
// Title
var titleText = new Text2('SAVE SYSTEM', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0);
titleText.x = 1000;
titleText.y = 250;
self.addChild(titleText);
// Create 4 save slots vertically stacked with wider positioning
for (var i = 0; i < 4; i++) {
createSaveSlot(self, i, 100, 350 + i * 200);
}
// Auto-save toggle button
var autoSaveToggle = new Text2('AUTO-SAVE: ON', {
size: 45,
fill: 0x00FF00
});
autoSaveToggle.anchor.set(0.5, 0.5);
autoSaveToggle.x = 1000;
autoSaveToggle.y = 1150;
self.addChild(autoSaveToggle);
autoSaveToggle.down = function (x, y, obj) {
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
toggleAutoSave();
};
return self;
});
var SellButton = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('sellButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
// Check if upgrade panel is open - if so, disable interaction
if (upgradePanel && upgradePanel.visible) {
return;
}
// Check if settings panel is open - if so, disable interaction
if (settingsPanel && settingsPanel.visible) {
return;
}
// Check if save panel is open - if so, disable interaction
if (savePanel && savePanel.visible) {
return;
}
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
if (scrap.gte(2)) {
var sellAmount = scrap;
var cashEarned = sellAmount.multiply(0.5);
cash = cash.add(cashEarned);
scrap = new BigNumber(Math.random(), 0); // Leave 0-1 scrap remaining
// Visual feedback
tween(graphics, {
scaleX: 0.9,
scaleY: 0.9
}, {
duration: 150
});
tween(graphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 150
});
updateUI();
LK.getSound('sell').play();
}
};
return self;
});
var UpgradeButton = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
// Check if settings panel is open - if so, disable interaction
if (settingsPanel && settingsPanel.visible) {
return;
}
// Check if save panel is open - if so, disable interaction
if (savePanel && savePanel.visible) {
return;
}
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
var upgradeCost = getUpgradeCost();
if (cash.gte(upgradeCost) && upgradeTier < 1600) {
cash = cash.subtract(upgradeCost);
upgradeTier++;
perClickValue = getPerClickValue();
// Give XP for upgrading
xp = xp.add(5);
checkLevelUp();
// Visual feedback
tween(graphics, {
scaleX: 0.95,
scaleY: 0.95
}, {
duration: 100
});
tween(graphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
updateUI();
LK.getSound('upgrade').play();
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
// Game variables - load from storage with defaults, using BigNumber system
// Helper function for formatting big numbers with letter notation
function formatBigNumber(mantissa, exponent) {
if (exponent < 1000) {
return mantissa.toFixed(2).replace(/\.?0+$/, '') + 'e' + exponent;
}
// Use letter notation for very large exponents
var letterIndex = Math.floor((exponent - 3) / 3);
var adjustedMantissa = mantissa * Math.pow(10, (exponent - 3) % 3);
var letter;
if (letterIndex < 26) {
letter = String.fromCharCode(97 + letterIndex); // a-z
} else if (letterIndex < 52) {
letter = String.fromCharCode(65 + letterIndex - 26); // A-Z
} else if (letterIndex < 78) {
var doubleLetterIndex = letterIndex - 52;
var firstLetter = String.fromCharCode(97 + doubleLetterIndex);
letter = '(' + firstLetter + firstLetter + ')';
} else {
return mantissa.toFixed(2) + 'e' + exponent;
}
return adjustedMantissa.toFixed(2).replace(/\.?0+$/, '') + letter;
}
var scrap = new BigNumber(storage.scrap ? parseFloat(storage.scrap) : 0, storage.scrapExp || 0);
var cash = new BigNumber(storage.cash ? parseFloat(storage.cash) : 0, storage.cashExp || 0);
var totalClicks = new BigNumber(storage.totalClicks ? parseFloat(storage.totalClicks) : 0, storage.totalClicksExp || 0);
var upgradeTier = storage.upgradeTier || 0;
var svLevel = storage.svLevel || 0;
var xp = new BigNumber(storage.xp ? parseFloat(storage.xp) : 0, storage.xpExp || 0);
var magnet = new BigNumber(storage.magnet ? parseFloat(storage.magnet) : 0, storage.magnetExp || 0);
var multiplierTier = storage.multiplierTier || 0;
var goldScrap = new BigNumber(storage.goldScrap ? parseFloat(storage.goldScrap) : 0, storage.goldScrapExp || 0);
var perClickValue = getPerClickValue();
var floatingRewards = [];
var floatingTexts = [];
// Game elements
var clickButton = game.addChild(new ClickButton());
clickButton.x = 1024;
clickButton.y = 1200;
// Upgrade panel
var upgradePanel = new Container();
upgradePanel.x = 1024 - 700; // Center horizontally
upgradePanel.y = 1366 - 300; // Center vertically
upgradePanel.visible = false;
game.addChild(upgradePanel);
// Upgrade panel background
var upgradePanelBg = LK.getAsset('upgradeButton', {
anchorX: 0,
anchorY: 0,
scaleX: 3.5,
scaleY: 8.0
});
upgradePanelBg.tint = 0x333333;
upgradePanel.addChild(upgradePanelBg);
// Close button for upgrade panel
var upgradeCloseButton = new Text2('✕', {
size: 100,
fill: 0xFF0000
});
upgradeCloseButton.anchor.set(0.5, 0.5);
upgradeCloseButton.x = 1300;
upgradeCloseButton.y = 80;
upgradePanel.addChild(upgradeCloseButton);
upgradeCloseButton.down = function (x, y, obj) {
upgradePanel.visible = false;
// Show sell button and upgrade panel button when upgrade panel closes
sellButton.visible = true;
upgradePanelButton.visible = true;
};
var upgradeButton = upgradePanel.addChild(new UpgradeButton());
upgradeButton.x = 700;
upgradeButton.y = 250;
var multiplierUpgradeButton = upgradePanel.addChild(new MultiplierUpgradeButton());
multiplierUpgradeButton.x = 700;
multiplierUpgradeButton.y = 420;
// Gold Scrap Panel Button (moved to main game, below upgrade panel button)
var goldScrapPanelButton = new Text2('GOLD SCRAP', {
size: 50,
fill: 0xFFD700
});
goldScrapPanelButton.anchor.set(0.5, 0.5);
goldScrapPanelButton.x = 1024;
goldScrapPanelButton.y = 1930;
game.addChild(goldScrapPanelButton);
goldScrapPanelButton.down = function (x, y, obj) {
// Check if settings panel is open - if so, disable interaction
if (settingsPanel && settingsPanel.visible) {
return;
}
// Check if save panel is open - if so, disable interaction
if (savePanel && savePanel.visible) {
return;
}
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
if (goldScrapPanel) {
goldScrapPanel.visible = !goldScrapPanel.visible;
}
};
// Gold Scrap panel
var goldScrapPanel = new Container();
goldScrapPanel.x = 1024 - 700; // Center horizontally
goldScrapPanel.y = 1366 - 300; // Center vertically
goldScrapPanel.visible = false;
game.addChild(goldScrapPanel);
// Gold Scrap panel background
var goldScrapPanelBg = LK.getAsset('upgradeButton', {
anchorX: 0,
anchorY: 0,
scaleX: 3.5,
scaleY: 6.0
});
goldScrapPanelBg.tint = 0x444400;
goldScrapPanel.addChild(goldScrapPanelBg);
// Close button for gold scrap panel
var goldScrapCloseButton = new Text2('✕', {
size: 100,
fill: 0xFF0000
});
goldScrapCloseButton.anchor.set(0.5, 0.5);
goldScrapCloseButton.x = 1300;
goldScrapCloseButton.y = 80;
goldScrapPanel.addChild(goldScrapCloseButton);
goldScrapCloseButton.down = function (x, y, obj) {
goldScrapPanel.visible = false;
};
// Gold Scrap conversion button
var goldScrapConvertButton = new Text2('CONVERT SCRAP\n(1000 Scrap = 1 Gold)', {
size: 45,
fill: 0xFFD700
});
goldScrapConvertButton.anchor.set(0.5, 0.5);
goldScrapConvertButton.x = 700;
goldScrapConvertButton.y = 250;
goldScrapPanel.addChild(goldScrapConvertButton);
goldScrapConvertButton.down = function (x, y, obj) {
// Ensure scrap is a BigNumber before using gte method
if (!(scrap instanceof BigNumber)) {
scrap = new BigNumber(scrap || 0, 0);
}
if (scrap.gte(1000)) {
// Use BigNumber division to handle very large numbers
var thousandBN = new BigNumber(1000, 0);
var goldScrapToAddBN = new BigNumber(Math.floor(scrap.mantissa), scrap.exponent - 3); // Divide by 1000 = subtract 3 from exponent
goldScrap = goldScrap.add(goldScrapToAddBN);
// Reset all values to 0 except magnet and gold scrap
scrap = new BigNumber(0, 0);
cash = new BigNumber(0, 0);
totalClicks = new BigNumber(0, 0);
upgradeTier = 0;
svLevel = 0;
xp = new BigNumber(0, 0);
multiplierTier = 0;
perClickValue = getPerClickValue();
updateUI();
LK.effects.flashScreen(0xFFD700, 1000);
}
};
// Gold Scrap display text in panel
var goldScrapPanelText = new Text2('Gold Scrap: 0', {
size: 65,
fill: 0xFFD700
});
goldScrapPanelText.anchor.set(0.5, 0.5);
goldScrapPanelText.x = 700;
goldScrapPanelText.y = 160;
goldScrapPanel.addChild(goldScrapPanelText);
// Potential Gold Scrap conversion display
var potentialGoldScrapText = new Text2('Potential: 0', {
size: 55,
fill: 0xFFD700
});
potentialGoldScrapText.anchor.set(0.5, 0.5);
potentialGoldScrapText.x = 700;
potentialGoldScrapText.y = 350;
goldScrapPanel.addChild(potentialGoldScrapText);
// Boost text
var boostText = new Text2('Boost: 1x', {
size: 60,
fill: 0xFFD700
});
boostText.anchor.set(0.5, 0.5);
boostText.x = 700;
boostText.y = 400;
goldScrapPanel.addChild(boostText);
var sellButton = game.addChild(new SellButton());
sellButton.x = 1024;
sellButton.y = 1650;
// UI Text elements
var goldScrapText = new Text2('Gold Scrap: 0', {
size: 80,
fill: 0xFFD700
});
goldScrapText.anchor.set(0.5, 0);
goldScrapText.x = 1024;
goldScrapText.y = 320;
game.addChild(goldScrapText);
var scrapText = new Text2('Scrap: 0', {
size: 80,
fill: 0xFFFFFF
});
scrapText.anchor.set(0.5, 0);
scrapText.x = 1024;
scrapText.y = 400;
game.addChild(scrapText);
var cashText = new Text2('Cash: $0', {
size: 70,
fill: 0x00FF00
});
cashText.anchor.set(0.5, 0);
cashText.x = 1024;
cashText.y = 480;
game.addChild(cashText);
var levelText = new Text2('SV Level: 0', {
size: 75,
fill: 0xFFFF00
});
levelText.anchor.set(0.5, 0);
levelText.x = 1024;
levelText.y = 560;
game.addChild(levelText);
var xpText = new Text2('XP: 0/100', {
size: 65,
fill: 0xFF00FF
});
xpText.anchor.set(0.5, 0);
xpText.x = 1024;
xpText.y = 640;
game.addChild(xpText);
var clickValueText = new Text2('Per Click: 1', {
size: 70,
fill: 0x00FFFF
});
clickValueText.anchor.set(0.5, 0);
clickValueText.x = 1024;
clickValueText.y = 720;
game.addChild(clickValueText);
var upgradeText = new Text2('Upgrade (Tier 0): $10', {
size: 60,
fill: 0xFFFFFF
});
upgradeText.anchor.set(0.5, 0.5);
upgradeText.x = 700;
upgradeText.y = 250;
upgradePanel.addChild(upgradeText);
var multiplierUpgradeText = new Text2('Multiplier (Tier 0): $50', {
size: 55,
fill: 0xFFFFFF
});
multiplierUpgradeText.anchor.set(0.5, 0.5);
multiplierUpgradeText.x = 700;
multiplierUpgradeText.y = 420;
upgradePanel.addChild(multiplierUpgradeText);
var sellText = new Text2('Sell Scrap', {
size: 55,
fill: 0xFFFFFF
});
sellText.anchor.set(0.5, 0.5);
sellText.x = 1024;
sellText.y = 1650;
game.addChild(sellText);
// Upgrade panel button
var upgradePanelButton = new Text2('UPGRADES', {
size: 50,
fill: 0x4CAF50
});
upgradePanelButton.anchor.set(0.5, 0.5);
upgradePanelButton.x = 1024;
upgradePanelButton.y = 1800;
game.addChild(upgradePanelButton);
upgradePanelButton.down = function (x, y, obj) {
// Check if settings panel is open - if so, disable interaction
if (settingsPanel && settingsPanel.visible) {
return;
}
// Check if save panel is open - if so, disable interaction
if (savePanel && savePanel.visible) {
return;
}
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
upgradePanel.visible = !upgradePanel.visible;
// Hide/show sell button and upgrade panel button when upgrade panel opens/closes
sellButton.visible = !upgradePanel.visible;
upgradePanelButton.visible = !upgradePanel.visible;
};
var totalClicksText = new Text2('Total Clicks: 0', {
size: 60,
fill: 0xCCCCCC
});
totalClicksText.anchor.set(0.5, 0);
totalClicksText.x = 1024;
totalClicksText.y = 800;
game.addChild(totalClicksText);
var magnetText = new Text2('Magnet: 0', {
size: 60,
fill: 0xFFD700
});
magnetText.anchor.set(0.5, 0);
magnetText.x = 1024;
magnetText.y = 880;
game.addChild(magnetText);
var versionText = new Text2('Pre_Alpha 8', {
size: 80,
fill: 0x888888
});
versionText.anchor.set(1, 1);
versionText.x = 2048 - 20;
versionText.y = 2732 - 20;
game.addChild(versionText);
// Save panel
var savePanel = new SavePanel();
savePanel.x = 1024 - 950; // Move panel to the left
savePanel.y = 1366 - 500; // Move panel down by 200 pixels
savePanel.visible = false;
game.addChild(savePanel);
// Close button for save panel
var saveCloseButton = new Text2('✕', {
size: 100,
fill: 0xFF0000
});
saveCloseButton.anchor.set(0.5, 0.5);
saveCloseButton.x = 1800;
saveCloseButton.y = 300;
savePanel.addChild(saveCloseButton);
saveCloseButton.down = function (x, y, obj) {
savePanel.visible = false;
};
// Settings panel
var settingsPanel = new Container();
settingsPanel.x = 1024 - 700; // Center horizontally (half of scaled width)
settingsPanel.y = 1366 - 240; // Center vertically (half of scaled height)
settingsPanel.visible = false;
game.addChild(settingsPanel);
// Settings panel background
var settingsBg = LK.getAsset('upgradeButton', {
anchorX: 0,
anchorY: 0,
scaleX: 3.5,
scaleY: 5.0
});
settingsBg.tint = 0x444444;
settingsPanel.addChild(settingsBg);
// Settings button
var settingsButton = new Text2('⚙️', {
size: 100,
fill: 0xFFFFFF
});
settingsButton.anchor.set(0, 1);
settingsButton.x = 80;
settingsButton.y = 2732 - 120;
game.addChild(settingsButton);
settingsButton.down = function (x, y, obj) {
// Check if upgrade panel is open - if so, disable interaction
if (upgradePanel && upgradePanel.visible) {
return;
}
// Check if save panel is open - if so, disable interaction
if (savePanel && savePanel.visible) {
return;
}
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
settingsPanel.visible = !settingsPanel.visible;
};
// Save panel button inside settings panel
var savePanelButton = new Text2('SAVE SYSTEM', {
size: 60,
fill: 0x00FFFF
});
savePanelButton.anchor.set(0.5, 0.5);
savePanelButton.x = 700;
savePanelButton.y = 160;
settingsPanel.addChild(savePanelButton);
savePanelButton.down = function (x, y, obj) {
settingsPanel.visible = false; // Close settings panel
savePanel.visible = !savePanel.visible;
};
// Hard reset button - moved down and made bigger
var hardResetButton = new Text2('HARD RESET', {
size: 70,
fill: 0xFF4444
});
hardResetButton.anchor.set(0.5, 0.5);
hardResetButton.x = 700;
hardResetButton.y = 300;
settingsPanel.addChild(hardResetButton);
hardResetButton.down = function (x, y, obj) {
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
// Create confirmation dialog
var confirmDialog = new ConfirmationDialog('Reset all progress?', function () {
// Yes - reset everything
scrap = new BigNumber(0, 0);
cash = new BigNumber(0, 0);
totalClicks = new BigNumber(0, 0);
upgradeTier = 0;
svLevel = 0;
xp = new BigNumber(0, 0);
magnet = new BigNumber(0, 0);
multiplierTier = 0;
goldScrap = new BigNumber(0, 0);
perClickValue = getPerClickValue();
updateUI();
settingsPanel.visible = false;
LK.effects.flashScreen(0xFF0000, 1000);
}, function () {
// No - do nothing
});
// Position dialog in center of screen
confirmDialog.x = 1024 - 600;
confirmDialog.y = 1366 - 180;
game.addChild(confirmDialog);
};
// Helper functions
function formatNumber(num) {
// Type checking to prevent toFixed errors
if (typeof num !== 'number' || isNaN(num) || num === null || num === undefined) {
return '0.00';
}
if (num < 1000) {
return num.toFixed(2);
}
if (num < 1000000) {
return (num / 1000).toFixed(2).replace(/\.?0+$/, '') + '(K)';
}
if (num < 1000000000) {
return (num / 1000000).toFixed(2).replace(/\.?0+$/, '') + '(M)';
}
if (num < 1000000000000) {
return (num / 1000000000).toFixed(2).replace(/\.?0+$/, '') + '(B)';
}
if (num < 1000000000000000) {
return (num / 1000000000000).toFixed(2).replace(/\.?0+$/, '') + '(T)';
}
// For numbers >= 1e15, use letters a-z then A-Z then AA-ZZ format
var exponent = Math.floor(Math.log10(num));
var letterIndex = Math.floor((exponent - 15) / 3);
var mantissa = num / Math.pow(10, 15 + letterIndex * 3);
var letter;
if (letterIndex < 26) {
letter = String.fromCharCode(97 + letterIndex); // a-z
} else if (letterIndex < 52) {
letter = String.fromCharCode(65 + letterIndex - 26); // A-Z
} else if (letterIndex < 78) {
// (aa)-(zz) format (52-77 range)
var doubleLetterIndex = letterIndex - 52;
var firstLetter = String.fromCharCode(97 + doubleLetterIndex); // a-z
letter = '(' + firstLetter + firstLetter + ')'; // (aa), (bb), (cc), etc.
} else {
// Scientific notation for very large numbers
return (num / Math.pow(10, Math.floor(Math.log10(num)))).toFixed(2) + ' E' + Math.floor(Math.log10(num));
}
return mantissa.toFixed(2).replace(/\.?0+$/, '') + letter;
}
function getPerClickValue() {
// Calculate base value from upgrade tiers with progressive scaling
var baseValue = new BigNumber(1, 0);
for (var i = 1; i <= upgradeTier; i++) {
var multiplier;
if (i % 100 === 0) {
multiplier = 1.8; // Every 100th tier - higher scaling due to high cost
} else if (i % 25 === 0) {
multiplier = 1.6; // Every 25th tier - increased scaling
} else if (i % 10 === 0) {
multiplier = 1.4; // Every 10th tier - moderate scaling
} else {
multiplier = 1.2; // All other tiers - reduced base scaling
}
baseValue = baseValue.multiply(multiplier);
}
// Apply multiplier tier bonus with balanced progression
var clickMultiplier = 1;
for (var j = 1; j <= multiplierTier; j++) {
if (j === 1) {
clickMultiplier += 0.8; // First tier: x1.8 total (reduced from 2.5x)
} else if (j === 2) {
clickMultiplier += 0.7; // Second tier: x2.5 total (reduced from 3.7x)
} else if (j === 3) {
clickMultiplier += 0.6; // Third tier: x3.1 total (reduced from 4.5x)
} else if (j === 4) {
clickMultiplier += 1.2; // Fourth tier: x4.3 total (reduced from 6.5x)
} else if (j === 5) {
clickMultiplier += 0.4; // Fifth tier: x4.7 total (reduced from 7.0x)
} else if (j % 5 === 0) {
clickMultiplier += 1.8; // Every 5th tier: large boost (reduced from 3.0)
} else if (j % 3 === 0) {
clickMultiplier += 1.2; // Every 3rd tier: medium boost (reduced from 1.8)
} else if (j % 2 === 0) {
clickMultiplier += 0.9; // Every 2nd tier: small-medium boost (reduced from 1.3)
} else {
clickMultiplier += 0.5; // Other tiers: small boost (reduced from 0.7)
}
}
// Balance the multiplier effect to maintain reasonable progression
baseValue = baseValue.multiply(clickMultiplier);
// Apply gold scrap boost - start at 1x boost
// Ensure goldScrap is a BigNumber object
if (!(goldScrap instanceof BigNumber)) {
goldScrap = new BigNumber(goldScrap || 0, 0);
}
var goldScrapBoost = new BigNumber(1, 0); // Start at 1x boost
// Add 1.5x boost per gold scrap when gold scrap >= 2
if (goldScrap.gte(2)) {
var boostMultiplier = goldScrap.multiply(1.5); // 1.5x boost per gold scrap
goldScrapBoost = goldScrapBoost.multiply(boostMultiplier);
}
baseValue = baseValue.multiply(goldScrapBoost);
return baseValue;
}
;
function getMultiplierUpgradeCost() {
var baseCost = new BigNumber(75, 0); // Higher base cost to match reduced multiplier benefits
for (var i = 1; i <= multiplierTier; i++) {
var costMultiplier;
if (i % 10 === 0) {
costMultiplier = 2.5; // Every 10th tier - significant cost increase
} else if (i % 5 === 0) {
costMultiplier = 2.2; // Every 5th tier - high cost increase
} else {
costMultiplier = 2.0; // Standard tiers - balanced scaling
}
baseCost = baseCost.multiply(costMultiplier);
}
return baseCost;
}
function getUpgradeCost() {
var baseCost = new BigNumber(25, 0);
for (var i = 1; i <= upgradeTier; i++) {
var multiplier;
if (i % 100 === 0) {
multiplier = 1.8 * 1.1; // Every 100th tier - per-click scaling + 1.1x
} else if (i % 25 === 0) {
multiplier = 1.6 * 1.1; // Every 25th tier - per-click scaling + 1.1x
} else if (i % 10 === 0) {
multiplier = 1.4 * 1.1; // Every 10th tier - per-click scaling + 1.1x
} else {
multiplier = 1.2 * 1.1; // All other tiers - per-click scaling + 1.1x
}
baseCost = baseCost.multiply(multiplier);
}
return baseCost;
}
function getXPRequired() {
return 100 + svLevel * 50;
}
function checkLevelUp() {
var xpRequired = getXPRequired();
if (xp >= xpRequired) {
xp -= xpRequired;
svLevel++;
// Flash effect for level up
LK.effects.flashScreen(0xffff00, 500);
}
}
function createMagnetReward() {
var reward = game.addChild(new FloatingReward('magnet'));
reward.x = 1024 + (Math.random() - 0.5) * 600;
reward.y = 1400;
floatingRewards.push(reward);
}
function createXPReward() {
var reward = game.addChild(new FloatingReward('xp'));
reward.x = 1024 + (Math.random() - 0.5) * 600;
reward.y = 1400;
floatingRewards.push(reward);
}
function createFloatingText(text, x, y, color) {
var floatingText = game.addChild(new FloatingText(text, x, y, color));
floatingTexts.push(floatingText);
}
function updateUI() {
// Update gold scrap display
goldScrapText.setText('Gold Scrap: ' + goldScrap.toString());
// Show decimal values for scrap instead of rounded integers
scrapText.setText('Scrap: ' + scrap.toString());
cashText.setText('Cash: $' + cash.toString());
levelText.setText('SV Level: ' + formatNumber(svLevel));
xpText.setText('XP: ' + xp.toString() + '/' + formatNumber(getXPRequired()));
// Show decimal values for per-click instead of rounded integers
clickValueText.setText('Per Click: ' + perClickValue.toString());
totalClicksText.setText('Total Clicks: ' + totalClicks.toString());
magnetText.setText('Magnet: ' + magnet.toString());
if (upgradeTier < 1600) {
var upgradeCost = getUpgradeCost();
var upgradeCostText = upgradeCost.toString();
upgradeText.setText('Upgrade (Tier ' + upgradeTier + '): $' + upgradeCostText);
// Ensure cash is a BigNumber before using gte method
if (!(cash instanceof BigNumber)) {
cash = new BigNumber(cash || 0, 0);
}
// Ensure upgradeCost is also a BigNumber before comparison
if (!(upgradeCost instanceof BigNumber)) {
upgradeCost = new BigNumber(upgradeCost || 0, 0);
}
upgradeText.fill = cash.gte(upgradeCost) ? "#00ff00" : "#ff0000";
} else {
upgradeText.setText('MAX TIER REACHED');
upgradeText.fill = "#ffff00";
}
// Update multiplier upgrade text
if (multiplierTier < 25) {
var multiplierCost = getMultiplierUpgradeCost();
var multiplierCostText = multiplierCost.toString();
// Calculate current multiplier using same logic as getPerClickValue
var currentMultiplier = 1;
for (var k = 1; k <= multiplierTier; k++) {
if (k === 1) {
currentMultiplier += 1.5;
} else if (k === 2) {
currentMultiplier += 1.2;
} else if (k === 3) {
currentMultiplier += 0.8;
} else if (k === 4) {
currentMultiplier += 2.0;
} else if (k === 5) {
currentMultiplier += 0.5;
} else if (k % 5 === 0) {
currentMultiplier += 3.0;
} else if (k % 3 === 0) {
currentMultiplier += 1.8;
} else if (k % 2 === 0) {
currentMultiplier += 1.3;
} else {
currentMultiplier += 0.7;
}
}
multiplierUpgradeText.setText('Multiplier x' + currentMultiplier.toFixed(1) + ' (Tier ' + multiplierTier + '): $' + multiplierCostText);
// Ensure cash is a BigNumber before using gte method
if (!(cash instanceof BigNumber)) {
cash = new BigNumber(cash || 0, 0);
}
// Ensure multiplierCost is also a BigNumber before comparison
if (!(multiplierCost instanceof BigNumber)) {
multiplierCost = new BigNumber(multiplierCost || 0, 0);
}
multiplierUpgradeText.fill = cash.gte(multiplierCost) ? "#00ff00" : "#ff0000";
} else {
multiplierUpgradeText.setText('MAX MULTIPLIER REACHED');
multiplierUpgradeText.fill = "#ffff00";
}
// Update gold scrap panel text
goldScrapPanelText.setText('Gold Scrap: ' + goldScrap.toString());
// Update boost text
var currentBoost = new BigNumber(1, 0); // Start at 1x
if (goldScrap.gte(2)) {
currentBoost = goldScrap.multiply(1.5); // 1.5x boost per gold scrap
}
boostText.setText('Boost: ' + currentBoost.toString() + 'x');
// Update potential gold scrap display
// Use BigNumber division to handle very large numbers
var potentialGoldScrapBN = new BigNumber(Math.floor(scrap.mantissa), scrap.exponent - 3); // Divide by 1000 = subtract 3 from exponent
var potentialGoldScrapNum = potentialGoldScrapBN.toNumber();
if (potentialGoldScrapNum < 1000 && potentialGoldScrapNum !== Infinity) {
potentialGoldScrapText.setText('Potential: ' + potentialGoldScrapNum.toFixed(0));
} else {
potentialGoldScrapText.setText('Potential: ' + potentialGoldScrapBN.toString());
}
// Update gold scrap convert button text
// Ensure scrap is a BigNumber before using gte method
if (!(scrap instanceof BigNumber)) {
scrap = new BigNumber(scrap || 0, 0);
}
if (scrap.gte(1000)) {
goldScrapConvertButton.fill = 0x00FF00;
} else {
goldScrapConvertButton.fill = 0xFF0000;
}
// Save game state with BigNumber support
// Ensure all BigNumber objects are properly initialized before accessing properties
if (!(scrap instanceof BigNumber)) {
scrap = new BigNumber(scrap || 0, 0);
}
if (!(cash instanceof BigNumber)) {
cash = new BigNumber(cash || 0, 0);
}
if (!(totalClicks instanceof BigNumber)) {
totalClicks = new BigNumber(totalClicks || 0, 0);
}
if (!(xp instanceof BigNumber)) {
xp = new BigNumber(xp || 0, 0);
}
if (!(magnet instanceof BigNumber)) {
magnet = new BigNumber(magnet || 0, 0);
}
if (!(goldScrap instanceof BigNumber)) {
goldScrap = new BigNumber(goldScrap || 0, 0);
}
storage.scrap = scrap.mantissa;
storage.scrapExp = scrap.exponent;
storage.cash = cash.mantissa;
storage.cashExp = cash.exponent;
storage.totalClicks = totalClicks.mantissa;
storage.totalClicksExp = totalClicks.exponent;
storage.upgradeTier = upgradeTier;
storage.svLevel = svLevel;
storage.xp = xp.mantissa;
storage.xpExp = xp.exponent;
storage.magnet = magnet.mantissa;
storage.magnetExp = magnet.exponent;
storage.multiplierTier = multiplierTier;
storage.goldScrap = goldScrap.mantissa;
storage.goldScrapExp = goldScrap.exponent;
}
// Initial UI update
updateUI();
// Auto-save timer
var autoSaveTimer = 0;
// UI update timer
var uiUpdateTimer = 0;
// Auto-save enabled flag
var autoSaveEnabled = storage.autoSaveEnabled !== undefined ? storage.autoSaveEnabled : true;
// Toggle auto-save function
function toggleAutoSave() {
autoSaveEnabled = !autoSaveEnabled;
storage.autoSaveEnabled = autoSaveEnabled;
if (autoSaveEnabled) {
createFloatingText('AUTO-SAVE ON', 1024, 1366, 0x00FF00);
} else {
createFloatingText('AUTO-SAVE OFF', 1024, 1366, 0xFF0000);
}
updateAutoSaveUI();
}
// Update auto-save UI function
function updateAutoSaveUI() {
if (savePanel && savePanel.children) {
// Find the auto-save toggle button and update its text/color
for (var i = 0; i < savePanel.children.length; i++) {
var child = savePanel.children[i];
if (child instanceof Text2 && child.text && child.text.includes('AUTO-SAVE')) {
child.setText(autoSaveEnabled ? 'AUTO-SAVE: ON' : 'AUTO-SAVE: OFF');
child.fill = autoSaveEnabled ? 0x00FF00 : 0xFF0000;
break;
}
}
}
}
game.update = function () {
// Update floating rewards
for (var i = floatingRewards.length - 1; i >= 0; i--) {
var reward = floatingRewards[i];
if (reward.update) {
reward.update();
}
}
// Update floating texts
for (var j = floatingTexts.length - 1; j >= 0; j--) {
var floatingText = floatingTexts[j];
if (floatingText.update) {
floatingText.update();
}
}
// Update UI every second (60 ticks)
uiUpdateTimer++;
if (uiUpdateTimer >= 60) {
uiUpdateTimer = 0;
updateUI();
}
// Auto-save every second (60 ticks) - only if enabled
autoSaveTimer++;
if (autoSaveTimer >= 60) {
autoSaveTimer = 0;
if (autoSaveEnabled) {
// Save current game state with BigNumber support
// Ensure all BigNumber objects are properly initialized before accessing properties
if (!(scrap instanceof BigNumber)) {
scrap = new BigNumber(scrap || 0, 0);
}
if (!(cash instanceof BigNumber)) {
cash = new BigNumber(cash || 0, 0);
}
if (!(totalClicks instanceof BigNumber)) {
totalClicks = new BigNumber(totalClicks || 0, 0);
}
if (!(xp instanceof BigNumber)) {
xp = new BigNumber(xp || 0, 0);
}
if (!(magnet instanceof BigNumber)) {
magnet = new BigNumber(magnet || 0, 0);
}
if (!(goldScrap instanceof BigNumber)) {
goldScrap = new BigNumber(goldScrap || 0, 0);
}
storage.scrap = scrap.mantissa;
storage.scrapExp = scrap.exponent;
storage.cash = cash.mantissa;
storage.cashExp = cash.exponent;
storage.totalClicks = totalClicks.mantissa;
storage.totalClicksExp = totalClicks.exponent;
storage.upgradeTier = upgradeTier;
storage.svLevel = svLevel;
storage.xp = xp.mantissa;
storage.xpExp = xp.exponent;
storage.magnet = magnet.mantissa;
storage.magnetExp = magnet.exponent;
storage.multiplierTier = multiplierTier;
storage.goldScrap = goldScrap.mantissa;
storage.goldScrapExp = goldScrap.exponent;
storage.lastSaveTime = Date.now(); // Track when last saved
}
}
};
function createSaveSlot(parent, slotIndex, x, y) {
var slotContainer = new Container();
slotContainer.x = x;
slotContainer.y = y;
parent.addChild(slotContainer);
// Slot background - made wider
var slotBg = LK.getAsset('upgradeButton', {
anchorX: 0,
anchorY: 0,
scaleX: 6.0,
scaleY: 1.8
});
slotBg.tint = 0x333333;
slotContainer.addChild(slotBg);
// Slot title - larger text
var slotTitle = new Text2('SLOT ' + (slotIndex + 1), {
size: 65,
fill: 0xFFFFFF
});
slotTitle.anchor.set(0, 0);
slotTitle.x = 30;
slotTitle.y = 20;
slotContainer.addChild(slotTitle);
// Save info text - larger
var saveInfo = new Text2('Empty', {
size: 45,
fill: 0xCCCCCC
});
saveInfo.anchor.set(0, 0);
saveInfo.x = 30;
saveInfo.y = 85;
slotContainer.addChild(saveInfo);
// Save button - larger and repositioned
var saveBtn = new Text2('SAVE', {
size: 55,
fill: 0x00FF00
});
saveBtn.anchor.set(0.5, 0.5);
saveBtn.x = 550;
saveBtn.y = 80;
slotContainer.addChild(saveBtn);
// Load button - larger and repositioned
var loadBtn = new Text2('LOAD', {
size: 55,
fill: 0x0080FF
});
loadBtn.anchor.set(0.5, 0.5);
loadBtn.x = 750;
loadBtn.y = 80;
slotContainer.addChild(loadBtn);
// Delete button - larger and repositioned
var deleteBtn = new Text2('DELETE', {
size: 55,
fill: 0xFF0000
});
deleteBtn.anchor.set(0.5, 0.5);
deleteBtn.x = 1000;
deleteBtn.y = 80;
slotContainer.addChild(deleteBtn);
// Update slot display
function updateSlotDisplay() {
var saveKey = 'save_slot_' + slotIndex;
var saveData = storage[saveKey];
if (saveData && saveData !== null) {
var saveTime = saveData.saveTime ? new Date(saveData.saveTime) : null;
var timeStr = saveTime ? saveTime.getMonth() + 1 + '/' + saveTime.getDate() : 'Unknown';
var versionStr = saveData.gameVersion ? ' v' + saveData.gameVersion.replace('Pre_Alpha ', '') : '';
saveInfo.setText('SV Lvl: ' + formatNumber(saveData.svLevel || 0) + '\nCash: $' + formatNumber(parseFloat(saveData.cash) || 0) + '\nSaved: ' + timeStr + versionStr);
saveInfo.fill = 0xFFFFFF;
loadBtn.fill = 0x0080FF;
} else {
saveInfo.setText('Empty');
saveInfo.fill = 0xCCCCCC;
loadBtn.fill = 0x555555;
}
}
// Save button functionality
saveBtn.down = function (x, y, obj) {
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
var saveKey = 'save_slot_' + slotIndex;
var backupKey = saveKey + '_backup';
// Create backup of existing save before overwriting
var existingSave = storage[saveKey];
if (existingSave && existingSave !== null) {
storage[backupKey] = existingSave;
}
var saveData = {
scrap: scrap.toString(),
cash: cash.toString(),
totalClicks: totalClicks.toString(),
upgradeTier: upgradeTier,
svLevel: svLevel,
xp: xp.toString(),
magnet: magnet.toString(),
multiplierTier: multiplierTier,
goldScrap: goldScrap.toString(),
saveTime: Date.now(),
gameVersion: 'Pre_Alpha 8'
};
storage[saveKey] = saveData;
updateSlotDisplay();
createFloatingText('SAVED TO SLOT ' + (slotIndex + 1), 1024, 1366, 0x00FF00);
LK.effects.flashScreen(0x00FF00, 300);
};
// Load button functionality
loadBtn.down = function (x, y, obj) {
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
var saveKey = 'save_slot_' + slotIndex;
var saveData = storage[saveKey];
if (saveData && saveData !== null) {
scrap = parseFloat(saveData.scrap) || 0;
cash = parseFloat(saveData.cash) || 0;
totalClicks = parseFloat(saveData.totalClicks) || 0;
upgradeTier = saveData.upgradeTier || 0;
svLevel = saveData.svLevel || 0;
xp = parseFloat(saveData.xp) || 0;
magnet = parseFloat(saveData.magnet) || 0;
multiplierTier = saveData.multiplierTier || 0;
goldScrap = saveData.goldScrap || 0;
perClickValue = getPerClickValue();
updateUI();
LK.effects.flashScreen(0x0080FF, 300);
}
};
// Delete button functionality
deleteBtn.down = function (x, y, obj) {
// Check if any confirmation dialog is showing
if (game.children.some(function (child) {
return child instanceof ConfirmationDialog;
})) {
return;
}
var saveKey = 'save_slot_' + slotIndex;
var saveData = storage[saveKey];
// Only show confirmation if there's actually data to delete
if (saveData && saveData !== null) {
// Create confirmation dialog
var confirmDialog = new ConfirmationDialog('Delete save data?', function () {
// Yes - delete the save data
storage[saveKey] = null;
// Force update the display to show Empty
saveInfo.setText('Empty');
saveInfo.fill = 0xCCCCCC;
loadBtn.fill = 0x555555;
updateSlotDisplay();
LK.effects.flashScreen(0xFF0000, 300);
}, function () {
// No - do nothing
});
// Position dialog in center of screen
confirmDialog.x = 1024 - 600;
confirmDialog.y = 1366 - 180;
game.addChild(confirmDialog);
}
};
// Initial display update
updateSlotDisplay();
}