User prompt
Save panel save button load button seve delete button ve 4 sultan oluşsun ve save paneli 4 slot sığacak şekilde düzenle ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Seve açma buttonu açılınca setting panel kapansın ve panelleri genişlet
User prompt
Bigint tipinde save sistemi koy 4 yuvadan oluştur ve save ve load ve save delete buttonu koy ve settings panele save panel açacak button ekle ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Per click tier 100 den 200 e çıkar ve tıklayabilinirliğini de denle
User prompt
Valueleri (K) (M) (B) (T) a b c d e ... diye davam etir z kadar z olunca A B C D... Z kadar devam ettir sonra 1.00 E290 gibi görünsün ve 1279 1.27 (K) gibi görünsün
User prompt
Sürüm textti Pre_Alpha 1 olarak değiştir
User prompt
Upgrade paneli genişlet ve kapama butonunu genişlet
User prompt
Setting buttonu birz yukarı ve az sağa kaydır ve per click upgrade buttonu upgrade panel yağ içine koy ve panele kapama tuşu koy
User prompt
Hard reset ve settings paneli daha büyüt
User prompt
Hard reser arka plan rengi sağdan olmasın ve setting paneli oyun panelin tam ortasında oluşmasını sağlayan
User prompt
Sürüm textti ve settings buttonu ve texttini büyüt
User prompt
Sürüm yazısı oluştur Pre_Alpha 0 olcak ve Hard reset butonunu settings panel yap içine koy
User prompt
Yeniden magnet textti oluştur total click altına ve Hard reset buttonu ekle
User prompt
Butonları ve textleri büyüt ve hala magnet textti görünmüyor textti kadır
User prompt
Magnet textti görünmüyor onun görünmesini sağlar eyer magnet değir yoksa oluştur
User prompt
Sürüm textti eklenecek V0.0.0.0.00 (Pre_Alpha 0)
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'fill')' in or related to this line: 'return Math.floor(10 * Math.pow(1.5, upgradeTier));' Line Number: 266
Code edit (1 edits merged)
Please save this source code
User prompt
Scrap Collecting Emperor
Initial prompt
scrap collecting emperor oyun adı bigint veri tipi ortada click button olcak değerler scrap magnet cash sv svxp per click click değerleri olcak click buttona her tıklandığında per click kadar scrap verecek ve 1 click artacak ve magnet ve xp belli şans oranında verilecek sv 0 olarak başlayacak ve belli xp değerine gedinde sv artacak ama sv 1 de istenen xp miktarından fazla istemeli sv2 de click button altında sell scrap olcak oda scrap/2 olcak ana scrap işlemden sonra 0 veya 1 kalmalı scap olsun. Sell scrap button yanına upgrade panel açacak button koy ve paneli baya büyük yap ve per click değerini atılacak bir yükseme buttonu ekle ve 100 tierden oluşsun yükleme tieri göster ve yükleme için cash gerksin ve tek button olsun upgrade per click
/****
* 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();
}