/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
coins: 0,
materialPerClick: 1,
coinValue: 1,
clickUpgradeCost: 10,
valueUpgradeCost: 50,
clickUpgradeLevel: 0,
valueUpgradeLevel: 0,
evolutionUpgradeCost: 100,
evolutionLevel: 0,
botActive: false,
botLevel: 1,
botUpgradeCost: 100,
debugMode: false,
infiniteCoinsMode: false
});
/****
* Classes
****/
var CoinParticle = Container.expand(function () {
var self = Container.call(this);
var coin = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.init = function (startX, startY) {
self.x = startX;
self.y = startY;
// Animate coin floating up
tween(self, {
y: startY - 200,
alpha: 0
}, {
duration: 1500,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
// Scale animation
tween(self, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.easeIn
});
}
});
};
return self;
});
var DebugMenu = Container.expand(function () {
var self = Container.call(this);
var panel = self.attachAsset('debugPanel', {
anchorX: 0.5,
anchorY: 0.5
});
var closeBtn = self.addChild(LK.getAsset('debugCloseButton', {
anchorX: 0.5,
anchorY: 0.5
}));
closeBtn.y = -400;
var addCoinsBtn = self.addChild(LK.getAsset('debugActionButton', {
anchorX: 0.5,
anchorY: 0.5
}));
addCoinsBtn.y = -300;
var addMaterialsBtn = self.addChild(LK.getAsset('debugActionButton', {
anchorX: 0.5,
anchorY: 0.5
}));
addMaterialsBtn.y = -230;
var maxUpgradesBtn = self.addChild(LK.getAsset('debugActionButton', {
anchorX: 0.5,
anchorY: 0.5
}));
maxUpgradesBtn.y = -160;
var infiniteCoinsBtn = self.addChild(LK.getAsset('debugInfiniteCoinsButton', {
anchorX: 0.5,
anchorY: 0.5
}));
infiniteCoinsBtn.y = -90;
var infoBtn = self.addChild(LK.getAsset('debugActionButton', {
anchorX: 0.5,
anchorY: 0.5
}));
infoBtn.y = -20;
var closeText = new Text2('Close', {
size: 30,
fill: 0xFFFFFF
});
closeText.anchor.set(0.5, 0.5);
closeText.x = closeBtn.x;
closeText.y = closeBtn.y;
var addCoinsText = new Text2('Add 1000 Coins', {
size: 40,
fill: 0xFFFFFF
});
addCoinsText.anchor.set(0.5, 0.5);
addCoinsText.x = addCoinsBtn.x;
addCoinsText.y = addCoinsBtn.y;
var addMaterialsText = new Text2('Add Materials', {
size: 40,
fill: 0xFFFFFF
});
addMaterialsText.anchor.set(0.5, 0.5);
addMaterialsText.x = addMaterialsBtn.x;
addMaterialsText.y = addMaterialsBtn.y;
var infiniteCoinsText = new Text2('Infinite Coins: OFF', {
size: 40,
fill: 0xFFFFFF
});
infiniteCoinsText.anchor.set(0.5, 0.5);
infiniteCoinsText.x = infiniteCoinsBtn.x;
infiniteCoinsText.y = infiniteCoinsBtn.y;
var maxUpgradesText = new Text2('Max All Upgrades', {
size: 40,
fill: 0xFFFFFF
});
maxUpgradesText.anchor.set(0.5, 0.5);
maxUpgradesText.x = maxUpgradesBtn.x;
maxUpgradesText.y = maxUpgradesBtn.y;
var infoText = new Text2('Show Game Info', {
size: 40,
fill: 0xFFFFFF
});
infoText.anchor.set(0.5, 0.5);
infoText.x = infoBtn.x;
infoText.y = infoBtn.y;
closeBtn.down = function () {
debugMenuOpen = false;
self.visible = false;
};
addCoinsBtn.down = function () {
coins += 1000;
storage.coins = coins;
updateCoinDisplay();
console.log('Added 1000 coins. Total:', coins);
};
addMaterialsBtn.down = function () {
materials.stone += 100;
materials.lava += 50;
materials.crystal += 25;
materials.magic += 10;
materials.diamond += 5;
materials.ancient += 3;
materials.cosmic += 2;
materials.ultimate += 1;
updateMaterialDisplay();
console.log('Added materials to inventory');
};
maxUpgradesBtn.down = function () {
storage.materialPerClick = 50;
storage.clickUpgradeLevel = 10;
storage.clickUpgradeCost = 1000000;
storage.evolutionLevel = 8;
storage.evolutionUpgradeCost = 1000000;
storage.botLevel = 5;
storage.botUpgradeCost = 1000000;
updateRockAppearance();
if (upgradeMenu) {
upgradeMenu.updateTexts();
}
console.log('Maxed all upgrades');
};
infiniteCoinsBtn.down = function () {
infiniteCoinsMode = !infiniteCoinsMode;
storage.infiniteCoinsMode = infiniteCoinsMode;
if (infiniteCoinsMode) {
infiniteCoinsText.setText('Infinite Coins: ON');
infiniteCoinsBtn.tint = 0x00ff00; // Green when active
console.log('Infinite coins mode activated');
} else {
infiniteCoinsText.setText('Infinite Coins: OFF');
infiniteCoinsBtn.tint = 0xFFFFFF; // White when inactive
console.log('Infinite coins mode deactivated');
}
};
infoBtn.down = function () {
console.log('=== GAME INFO ===');
console.log('Coins:', coins);
console.log('Materials:', materials);
console.log('Evolution Level:', storage.evolutionLevel);
console.log('Bot Level:', storage.botLevel);
console.log('Bot Active:', botActive);
console.log('Material Per Click:', storage.materialPerClick);
console.log('Click Upgrade Cost:', storage.clickUpgradeCost);
console.log('Evolution Upgrade Cost:', storage.evolutionUpgradeCost);
console.log('Bot Upgrade Cost:', storage.botUpgradeCost);
console.log('Debug Mode:', debugMode);
console.log('Infinite Coins Mode:', infiniteCoinsMode);
};
self.addChild(closeText);
self.addChild(addCoinsText);
self.addChild(addMaterialsText);
self.addChild(infiniteCoinsText);
self.addChild(maxUpgradesText);
self.addChild(infoText);
return self;
});
var MaterialParticle = Container.expand(function () {
var self = Container.call(this);
var particle;
self.init = function (startX, startY, materialType) {
// Create particle with specific material type
var assetName = materialType || 'material_stone';
particle = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
// Start particles outside the rock perimeter (rock radius is approximately 200px)
var angle = Math.random() * Math.PI * 2;
var rockRadius = 220; // Slightly outside the rock edge
var startDistance = rockRadius + Math.random() * 50; // 220-270px from center
self.x = startX + Math.cos(angle) * startDistance;
self.y = startY + Math.sin(angle) * startDistance;
// Random direction for particle movement
var moveDistance = 100 + Math.random() * 150;
var targetX = self.x + Math.cos(angle) * moveDistance;
var targetY = self.y + Math.sin(angle) * moveDistance;
// Animate particle
tween(self, {
x: targetX,
y: targetY,
alpha: 0
}, {
duration: 800,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
};
return self;
});
var UpgradeMenu = Container.expand(function () {
var self = Container.call(this);
var panel = self.attachAsset('upgradePanel', {
anchorX: 0.5,
anchorY: 0.5
});
var clickUpgradeBtn = self.addChild(LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
}));
clickUpgradeBtn.y = -200;
var evolutionUpgradeBtn = self.addChild(LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
}));
evolutionUpgradeBtn.y = 0;
var botUpgradeBtn = self.addChild(LK.getAsset('botUpgradeButton', {
anchorX: 0.5,
anchorY: 0.5
}));
botUpgradeBtn.y = 100;
var resetBtn = self.addChild(LK.getAsset('resetButton', {
anchorX: 0.5,
anchorY: 0.5
}));
resetBtn.y = 200;
var closeBtn = self.addChild(LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
width: 100,
height: 60
}));
closeBtn.y = 300;
var clickUpgradeText = new Text2('Upgrade Click\nCost: ' + storage.clickUpgradeCost, {
size: 40,
fill: 0xFFFFFF
});
clickUpgradeText.anchor.set(0.5, 0.5);
clickUpgradeText.x = clickUpgradeBtn.x;
clickUpgradeText.y = clickUpgradeBtn.y;
var evolutionUpgradeText = new Text2('Evolve Rock\nCost: ' + storage.evolutionUpgradeCost, {
size: 40,
fill: 0xFFFFFF
});
evolutionUpgradeText.anchor.set(0.5, 0.5);
evolutionUpgradeText.x = evolutionUpgradeBtn.x;
evolutionUpgradeText.y = evolutionUpgradeBtn.y;
var botUpgradeText = new Text2('Upgrade Bot\nCost: ' + storage.botUpgradeCost, {
size: 40,
fill: 0xFFFFFF
});
botUpgradeText.anchor.set(0.5, 0.5);
botUpgradeText.x = botUpgradeBtn.x;
botUpgradeText.y = botUpgradeBtn.y;
var resetText = new Text2('Reset Progress', {
size: 36,
fill: 0xFFFFFF
});
resetText.anchor.set(0.5, 0.5);
resetText.x = resetBtn.x;
resetText.y = resetBtn.y;
var closeText = new Text2('Close', {
size: 36,
fill: 0xFFFFFF
});
closeText.anchor.set(0.5, 0.5);
closeText.x = closeBtn.x;
closeText.y = closeBtn.y;
self.updateTexts = function () {
if (storage.clickUpgradeLevel >= 10) {
clickUpgradeText.setText('Click MAX LEVEL');
} else {
clickUpgradeText.setText('Upgrade Click (+' + storage.materialPerClick + ')\nCost: ' + storage.clickUpgradeCost);
}
if (storage.evolutionLevel >= 8) {
evolutionUpgradeText.setText('Evolution MAX LEVEL');
} else {
evolutionUpgradeText.setText('Evolve Rock (Lvl ' + (storage.evolutionLevel + 1) + ')\nCost: ' + storage.evolutionUpgradeCost);
}
if (storage.botLevel >= 5) {
botUpgradeText.setText('Bot MAX LEVEL');
} else {
botUpgradeText.setText('Upgrade Bot (Lvl ' + (storage.botLevel + 1) + ')\nCost: ' + storage.botUpgradeCost);
}
};
clickUpgradeBtn.down = function () {
if ((infiniteCoinsMode || coins >= storage.clickUpgradeCost) && storage.clickUpgradeLevel < 10) {
if (!infiniteCoinsMode) {
coins -= storage.clickUpgradeCost;
storage.coins = coins;
}
storage.materialPerClick += 1;
storage.clickUpgradeLevel += 1;
storage.clickUpgradeCost = Math.floor(storage.clickUpgradeCost * 1.5);
LK.getSound('upgrade').play();
self.updateTexts();
updateCoinDisplay();
}
};
evolutionUpgradeBtn.down = function () {
if ((infiniteCoinsMode || coins >= storage.evolutionUpgradeCost) && storage.evolutionLevel < 8) {
if (!infiniteCoinsMode) {
coins -= storage.evolutionUpgradeCost;
storage.coins = coins;
}
storage.evolutionLevel += 1;
storage.evolutionUpgradeCost = Math.floor(storage.evolutionUpgradeCost * 3);
LK.getSound('upgrade').play();
self.updateTexts();
updateCoinDisplay();
updateRockAppearance();
}
};
botUpgradeBtn.down = function () {
if ((infiniteCoinsMode || coins >= storage.botUpgradeCost) && storage.botLevel < 5) {
if (!infiniteCoinsMode) {
coins -= storage.botUpgradeCost;
storage.coins = coins;
}
storage.botLevel += 1;
storage.botUpgradeCost = Math.floor(storage.botUpgradeCost * 2);
LK.getSound('upgrade').play();
self.updateTexts();
updateCoinDisplay();
// Restart bot with new timing if it's active
if (botActive) {
stopBot();
startBot();
}
}
};
resetBtn.down = function () {
// Reset all storage values to defaults
storage.coins = 0;
storage.materialPerClick = 1;
storage.coinValue = 1;
storage.clickUpgradeCost = 10;
storage.valueUpgradeCost = 50;
storage.clickUpgradeLevel = 0;
storage.valueUpgradeLevel = 0;
storage.evolutionUpgradeCost = 100;
storage.evolutionLevel = 0;
storage.botActive = false;
storage.botLevel = 1;
storage.botUpgradeCost = 100;
// Reset game variables
coins = 0;
materials = {
stone: 0,
lava: 0,
crystal: 0,
magic: 0,
diamond: 0,
ancient: 0,
cosmic: 0,
ultimate: 0
};
// Stop and reset bot
if (botActive) {
stopBot();
}
// Update displays
updateCoinDisplay();
updateMaterialDisplay();
updateRockAppearance();
self.updateTexts();
// Close menu
upgradeMenuOpen = false;
self.visible = false;
};
closeBtn.down = function () {
upgradeMenuOpen = false;
self.visible = false;
};
self.addChild(clickUpgradeText);
self.addChild(evolutionUpgradeText);
self.addChild(botUpgradeText);
self.addChild(resetText);
self.addChild(closeText);
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
var coins = storage.coins;
var materials = {
stone: 0,
lava: 0,
crystal: 0,
magic: 0,
diamond: 0,
ancient: 0,
cosmic: 0,
ultimate: 0
};
var upgradeMenuOpen = false;
var debugMenuOpen = false;
var botActive = storage.botActive;
var botTimer = null;
var debugMode = storage.debugMode;
var infiniteCoinsMode = storage.infiniteCoinsMode;
// Debug button
var debugBtn = game.addChild(LK.getAsset('debugButton', {
anchorX: 0.5,
anchorY: 0.5
}));
debugBtn.x = 2048 / 2;
debugBtn.y = 2732 - 350;
debugBtn.visible = true;
var debugBtnText = new Text2('DEBUG', {
size: 30,
fill: 0xFFFFFF
});
debugBtnText.anchor.set(0.5, 0.5);
debugBtnText.x = debugBtn.x;
debugBtnText.y = debugBtn.y;
debugBtnText.visible = true;
// Create background
var background = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0
}));
background.x = 0;
background.y = 0;
// Add a subtle gradient effect by creating multiple background layers
var backgroundGradient = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0
}));
backgroundGradient.x = 0;
backgroundGradient.y = 0;
backgroundGradient.tint = 0x1a1a3a;
backgroundGradient.alpha = 0.5;
// Create central rock
var rock = game.addChild(LK.getAsset('rock', {
anchorX: 0.5,
anchorY: 0.5
}));
rock.x = 2048 / 2;
rock.y = 2732 / 2;
// Add visual improvements to rock based on upgrade levels
function updateRockAppearance() {
var totalUpgrades = storage.clickUpgradeLevel + storage.valueUpgradeLevel;
var oldRock = rock;
var newRockAsset;
var newScale = 1;
var newTint = 0xFFFFFF;
// Evolution changes rock appearance dramatically
if (storage.evolutionLevel >= 8) {
newRockAsset = 'rock_ultimate';
newTint = 0xFFD700;
newScale = 1.2;
} else if (storage.evolutionLevel >= 7) {
newRockAsset = 'rock_ultimate';
newTint = 0xFFFFFF;
} else if (storage.evolutionLevel >= 6) {
newRockAsset = 'rock_cosmic';
newTint = 0xFFFFFF;
} else if (storage.evolutionLevel >= 5) {
newRockAsset = 'rock_ancient';
newTint = 0xFFFFFF;
} else if (storage.evolutionLevel >= 4) {
newRockAsset = 'rock_diamond';
newTint = 0xFFFFFF;
} else if (storage.evolutionLevel >= 3) {
newRockAsset = 'rock_magical';
newTint = 0xFFFFFF;
} else if (storage.evolutionLevel >= 2) {
newRockAsset = 'rock_crystal';
newTint = 0xFFFFFF;
} else if (storage.evolutionLevel >= 1) {
newRockAsset = 'rock_lava';
newTint = 0xFFFFFF;
} else {
newRockAsset = 'rock';
if (totalUpgrades > 5) {
newTint = 0xFFD700; // Golden color
} else if (totalUpgrades > 2) {
newTint = 0xC0C0C0; // Silver color
} else {
newTint = 0xFFFFFF;
}
}
// Replace rock with new evolved version if needed
var currentAssetId = rock._assetId || 'rock';
if (currentAssetId !== newRockAsset) {
var newRock = game.addChild(LK.getAsset(newRockAsset, {
anchorX: 0.5,
anchorY: 0.5
}));
newRock.x = rock.x;
newRock.y = rock.y;
newRock._assetId = newRockAsset;
// Copy event handlers
newRock.down = rock.down;
// Remove old rock and replace reference
game.removeChild(rock);
rock = newRock;
}
// Apply visual effects - keep scale at 1.0 for all levels
rock.scaleX = 1.0;
rock.scaleY = 1.0;
rock.tint = newTint;
// Show/hide bot button based on evolution level
if (storage.evolutionLevel >= 5) {
botBtn.visible = true;
botBtnText.visible = true;
if (upgradeMenu) {
upgradeMenu.children.forEach(function (child) {
if (child.children && child.children[0] && child.children[0].text && child.children[0].text.indexOf('Bot') !== -1) {
child.visible = true;
}
});
}
} else {
botBtn.visible = false;
botBtnText.visible = false;
if (upgradeMenu) {
upgradeMenu.children.forEach(function (child) {
if (child.children && child.children[0] && child.children[0].text && child.children[0].text.indexOf('Bot') !== -1) {
child.visible = false;
}
});
}
if (botActive) {
// Stop bot if evolution level drops below 5
stopBot();
}
}
}
// Create UI elements
var coinText = new Text2('Coins: 0', {
size: 80,
fill: 0xFFD700
});
coinText.anchor.set(0.5, 0);
LK.gui.top.addChild(coinText);
var materialText = new Text2('Materials: 0', {
size: 60,
fill: 0xFFFFFF
});
materialText.anchor.set(0, 0);
materialText.x = 20;
materialText.y = 120;
LK.gui.topLeft.addChild(materialText);
var upgradeBtn = game.addChild(LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
}));
upgradeBtn.x = 2048 / 2;
upgradeBtn.y = 2732 - 150;
var upgradeBtnText = new Text2('UPGRADES', {
size: 50,
fill: 0xFFFFFF
});
upgradeBtnText.anchor.set(0.5, 0.5);
upgradeBtnText.x = upgradeBtn.x;
upgradeBtnText.y = upgradeBtn.y;
var sellBtn = game.addChild(LK.getAsset('sellButton', {
anchorX: 0.5,
anchorY: 0.5
}));
sellBtn.x = 2048 / 2;
sellBtn.y = 2732 - 250;
var sellBtnText = new Text2('SELL MATERIALS', {
size: 40,
fill: 0xFFFFFF
});
sellBtnText.anchor.set(0.5, 0.5);
sellBtnText.x = sellBtn.x;
sellBtnText.y = sellBtn.y;
// Bot button (only visible from evolution level 5+)
var botBtn = game.addChild(LK.getAsset('botButton', {
anchorX: 0.5,
anchorY: 0.5
}));
botBtn.x = 2048 / 2;
botBtn.y = 2732 - 450;
var botBtnText = new Text2('BOT: OFF', {
size: 40,
fill: 0xFFFFFF
});
botBtnText.anchor.set(0.5, 0.5);
botBtnText.x = botBtn.x;
botBtnText.y = botBtn.y;
// Create upgrade menu
var upgradeMenu = game.addChild(new UpgradeMenu());
upgradeMenu.x = 2048 / 2;
upgradeMenu.y = 2732 / 2;
upgradeMenu.visible = false;
// Create debug menu
var debugMenu = game.addChild(new DebugMenu());
debugMenu.x = 2048 / 2;
debugMenu.y = 2732 / 2;
debugMenu.visible = false;
// Arrays for particles
var materialParticles = [];
var coinParticles = [];
// Add button texts on top of buttons
game.addChild(debugBtnText);
game.addChild(upgradeBtnText);
game.addChild(sellBtnText);
game.addChild(botBtnText);
// Update functions
function updateCoinDisplay() {
coinText.setText('Coins: ' + coins);
}
function updateMaterialDisplay() {
var totalMaterials = materials.stone + materials.lava + materials.crystal + materials.magic + materials.diamond + materials.ancient + materials.cosmic + materials.ultimate;
var displayText = 'Materials: ' + totalMaterials;
if (materials.stone > 0) displayText += '\nStone: ' + materials.stone;
if (materials.lava > 0) displayText += '\nLava: ' + materials.lava;
if (materials.crystal > 0) displayText += '\nCrystal: ' + materials.crystal;
if (materials.magic > 0) displayText += '\nMagic: ' + materials.magic;
if (materials.diamond > 0) displayText += '\nDiamond: ' + materials.diamond;
if (materials.ancient > 0) displayText += '\nAncient: ' + materials.ancient;
if (materials.cosmic > 0) displayText += '\nCosmic: ' + materials.cosmic;
if (materials.ultimate > 0) displayText += '\nUltimate: ' + materials.ultimate;
materialText.setText(displayText);
}
function startBot() {
if (botTimer) return; // Already running
botActive = true;
storage.botActive = true;
botBtnText.setText('BOT: ON');
botBtn.tint = 0x00ff00; // Green when active
// Calculate interval based on bot level - starts at 2000ms, reduces by 400ms per level (minimum 200ms)
var interval = Math.max(200, 2000 - (storage.botLevel - 1) * 400);
botTimer = LK.setInterval(function () {
if (storage.evolutionLevel >= 5 && !upgradeMenuOpen) {
// Simulate rock click
rock.down(rock.x, rock.y, {});
}
}, interval);
}
function stopBot() {
if (botTimer) {
LK.clearInterval(botTimer);
botTimer = null;
}
botActive = false;
storage.botActive = false;
botBtnText.setText('BOT: OFF');
botBtn.tint = 0xFFFFFF; // White when inactive
}
// Initialize displays
updateCoinDisplay();
updateMaterialDisplay();
updateRockAppearance();
// Initialize bot state
if (storage.evolutionLevel >= 5) {
botBtn.visible = true;
if (botActive) {
startBot();
}
} else {
botBtn.visible = false;
}
// Rock click handler
rock.down = function (x, y, obj) {
if (upgradeMenuOpen) return;
// Calculate base materials per click
var baseMaterials = storage.materialPerClick;
// Apply evolution level multiplier to all materials
var evolutionMultiplier = 1 + storage.evolutionLevel;
var totalParticles = 0;
// Generate materials based on evolution level - higher levels can produce multiple types
if (storage.evolutionLevel >= 8) {
// Ultimate level - produces all material types with ultimate bonus
materials.stone += baseMaterials * evolutionMultiplier;
materials.lava += baseMaterials * evolutionMultiplier;
materials.crystal += baseMaterials * evolutionMultiplier;
materials.magic += baseMaterials * evolutionMultiplier;
materials.diamond += baseMaterials * evolutionMultiplier;
materials.ancient += baseMaterials * evolutionMultiplier;
materials.cosmic += baseMaterials * evolutionMultiplier;
materials.ultimate += baseMaterials * evolutionMultiplier * 3;
totalParticles += baseMaterials * 10;
for (var i = 0; i < baseMaterials; i++) {
var materialTypes = ['material_stone', 'material_lava', 'material_crystal', 'material_magic', 'material_diamond', 'material_ancient', 'material_cosmic'];
for (var t = 0; t < materialTypes.length; t++) {
var particle = new MaterialParticle();
materialParticles.push(particle);
game.addChild(particle);
particle.init(rock.x, rock.y, materialTypes[t]);
}
}
for (var j = 0; j < baseMaterials * 3; j++) {
var ultimateParticle = new MaterialParticle();
materialParticles.push(ultimateParticle);
game.addChild(ultimateParticle);
ultimateParticle.init(rock.x, rock.y, 'material_ultimate');
}
} else if (storage.evolutionLevel >= 7) {
// Ultimate level variant - produces all material types with high ultimate bonus
materials.stone += baseMaterials * evolutionMultiplier;
materials.lava += baseMaterials * evolutionMultiplier;
materials.crystal += baseMaterials * evolutionMultiplier;
materials.magic += baseMaterials * evolutionMultiplier;
materials.diamond += baseMaterials * evolutionMultiplier;
materials.ancient += baseMaterials * evolutionMultiplier;
materials.cosmic += baseMaterials * evolutionMultiplier;
materials.ultimate += baseMaterials * evolutionMultiplier * 2;
totalParticles += baseMaterials * 9;
for (var i = 0; i < baseMaterials; i++) {
var materialTypes = ['material_stone', 'material_lava', 'material_crystal', 'material_magic', 'material_diamond', 'material_ancient', 'material_cosmic'];
for (var t = 0; t < materialTypes.length; t++) {
var particle = new MaterialParticle();
materialParticles.push(particle);
game.addChild(particle);
particle.init(rock.x, rock.y, materialTypes[t]);
}
}
for (var j = 0; j < baseMaterials * 2; j++) {
var ultimateParticle = new MaterialParticle();
materialParticles.push(ultimateParticle);
game.addChild(ultimateParticle);
ultimateParticle.init(rock.x, rock.y, 'material_ultimate');
}
} else if (storage.evolutionLevel >= 6) {
// Cosmic level - produces all previous materials plus cosmic
materials.stone += baseMaterials * evolutionMultiplier;
materials.lava += baseMaterials * evolutionMultiplier;
materials.crystal += baseMaterials * evolutionMultiplier;
materials.magic += baseMaterials * evolutionMultiplier;
materials.diamond += baseMaterials * evolutionMultiplier;
materials.ancient += baseMaterials * evolutionMultiplier;
materials.cosmic += baseMaterials * evolutionMultiplier * 3;
totalParticles += baseMaterials * 9;
for (var k = 0; k < baseMaterials; k++) {
var materialTypes2 = ['material_stone', 'material_lava', 'material_crystal', 'material_magic', 'material_diamond', 'material_ancient'];
for (var u = 0; u < materialTypes2.length; u++) {
var particle2 = new MaterialParticle();
materialParticles.push(particle2);
game.addChild(particle2);
particle2.init(rock.x, rock.y, materialTypes2[u]);
}
}
for (var l = 0; l < baseMaterials * 3; l++) {
var cosmicParticle = new MaterialParticle();
materialParticles.push(cosmicParticle);
game.addChild(cosmicParticle);
cosmicParticle.init(rock.x, rock.y, 'material_cosmic');
}
} else if (storage.evolutionLevel >= 5) {
// Ancient level - produces all previous materials plus ancient
materials.stone += baseMaterials * evolutionMultiplier;
materials.lava += baseMaterials * evolutionMultiplier;
materials.crystal += baseMaterials * evolutionMultiplier;
materials.magic += baseMaterials * evolutionMultiplier;
materials.diamond += baseMaterials * evolutionMultiplier;
materials.ancient += baseMaterials * evolutionMultiplier * 3;
totalParticles += baseMaterials * 8;
for (var m = 0; m < baseMaterials; m++) {
var materialTypes3 = ['material_stone', 'material_lava', 'material_crystal', 'material_magic', 'material_diamond'];
for (var v = 0; v < materialTypes3.length; v++) {
var particle3 = new MaterialParticle();
materialParticles.push(particle3);
game.addChild(particle3);
particle3.init(rock.x, rock.y, materialTypes3[v]);
}
}
for (var n = 0; n < baseMaterials * 3; n++) {
var ancientParticle = new MaterialParticle();
materialParticles.push(ancientParticle);
game.addChild(ancientParticle);
ancientParticle.init(rock.x, rock.y, 'material_ancient');
}
} else if (storage.evolutionLevel >= 4) {
// Diamond level - produces all previous materials plus diamond
materials.stone += baseMaterials * evolutionMultiplier;
materials.lava += baseMaterials * evolutionMultiplier;
materials.crystal += baseMaterials * evolutionMultiplier;
materials.magic += baseMaterials * evolutionMultiplier;
materials.diamond += baseMaterials * evolutionMultiplier * 3;
totalParticles += baseMaterials * 7;
for (var o = 0; o < baseMaterials; o++) {
var materialTypes4 = ['material_stone', 'material_lava', 'material_crystal', 'material_magic'];
for (var w = 0; w < materialTypes4.length; w++) {
var particle4 = new MaterialParticle();
materialParticles.push(particle4);
game.addChild(particle4);
particle4.init(rock.x, rock.y, materialTypes4[w]);
}
}
for (var p = 0; p < baseMaterials * 3; p++) {
var diamondParticle = new MaterialParticle();
materialParticles.push(diamondParticle);
game.addChild(diamondParticle);
diamondParticle.init(rock.x, rock.y, 'material_diamond');
}
} else if (storage.evolutionLevel >= 3) {
// Magic level - produces all material types
materials.stone += baseMaterials * evolutionMultiplier;
materials.lava += baseMaterials * evolutionMultiplier;
materials.crystal += baseMaterials * evolutionMultiplier;
materials.magic += baseMaterials * evolutionMultiplier * 2; // More magic materials at highest level
totalParticles += baseMaterials * 5;
// Create particles for each type
for (var i = 0; i < baseMaterials; i++) {
var stoneParticle = new MaterialParticle();
materialParticles.push(stoneParticle);
game.addChild(stoneParticle);
stoneParticle.init(rock.x, rock.y, 'material_stone');
var lavaParticle = new MaterialParticle();
materialParticles.push(lavaParticle);
game.addChild(lavaParticle);
lavaParticle.init(rock.x, rock.y, 'material_lava');
var crystalParticle = new MaterialParticle();
materialParticles.push(crystalParticle);
game.addChild(crystalParticle);
crystalParticle.init(rock.x, rock.y, 'material_crystal');
}
for (var j = 0; j < baseMaterials * 2; j++) {
var magicParticle = new MaterialParticle();
materialParticles.push(magicParticle);
game.addChild(magicParticle);
magicParticle.init(rock.x, rock.y, 'material_magic');
}
} else if (storage.evolutionLevel >= 2) {
// Crystal level - produces stone, lava, and crystal
materials.stone += baseMaterials * evolutionMultiplier;
materials.lava += baseMaterials * evolutionMultiplier;
materials.crystal += baseMaterials * evolutionMultiplier * 2; // More crystal materials
totalParticles += baseMaterials * 4;
for (var k = 0; k < baseMaterials; k++) {
var stoneParticle2 = new MaterialParticle();
materialParticles.push(stoneParticle2);
game.addChild(stoneParticle2);
stoneParticle2.init(rock.x, rock.y, 'material_stone');
var lavaParticle2 = new MaterialParticle();
materialParticles.push(lavaParticle2);
game.addChild(lavaParticle2);
lavaParticle2.init(rock.x, rock.y, 'material_lava');
}
for (var l = 0; l < baseMaterials * 2; l++) {
var crystalParticle2 = new MaterialParticle();
materialParticles.push(crystalParticle2);
game.addChild(crystalParticle2);
crystalParticle2.init(rock.x, rock.y, 'material_crystal');
}
} else if (storage.evolutionLevel >= 1) {
// Lava level - produces stone and lava
materials.stone += baseMaterials * evolutionMultiplier;
materials.lava += baseMaterials * evolutionMultiplier * 2; // More lava materials
totalParticles += baseMaterials * 3;
for (var m = 0; m < baseMaterials; m++) {
var stoneParticle3 = new MaterialParticle();
materialParticles.push(stoneParticle3);
game.addChild(stoneParticle3);
stoneParticle3.init(rock.x, rock.y, 'material_stone');
}
for (var n = 0; n < baseMaterials * 2; n++) {
var lavaParticle3 = new MaterialParticle();
materialParticles.push(lavaParticle3);
game.addChild(lavaParticle3);
lavaParticle3.init(rock.x, rock.y, 'material_lava');
}
} else {
// Basic level - only produces stone
materials.stone += baseMaterials * evolutionMultiplier;
totalParticles += baseMaterials;
for (var o = 0; o < baseMaterials; o++) {
var stoneParticle4 = new MaterialParticle();
materialParticles.push(stoneParticle4);
game.addChild(stoneParticle4);
stoneParticle4.init(rock.x, rock.y, 'material_stone');
}
}
updateMaterialDisplay();
// Rock animation
tween(rock, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(rock, {
scaleX: 1,
scaleY: 1
}, {
duration: 100,
easing: tween.easeIn
});
}
});
LK.getSound('mine').play();
};
// Upgrade button handler
upgradeBtn.down = function () {
upgradeMenuOpen = !upgradeMenuOpen;
upgradeMenu.visible = upgradeMenuOpen;
if (upgradeMenuOpen) {
upgradeMenu.updateTexts();
// Bring upgrade menu to front
game.removeChild(upgradeMenu);
game.addChild(upgradeMenu);
}
};
// Sell button handler
sellBtn.down = function () {
var totalMaterials = materials.stone + materials.lava + materials.crystal + materials.magic + materials.diamond + materials.ancient + materials.cosmic + materials.ultimate;
if (upgradeMenuOpen || totalMaterials <= 0) return;
// Convert all materials to coins with different values per type
var coinsToAdd = 0;
coinsToAdd += materials.stone * storage.coinValue;
coinsToAdd += materials.lava * storage.coinValue * 2;
coinsToAdd += materials.crystal * storage.coinValue * 3;
coinsToAdd += materials.magic * storage.coinValue * 5;
coinsToAdd += materials.diamond * storage.coinValue * 8;
coinsToAdd += materials.ancient * storage.coinValue * 12;
coinsToAdd += materials.cosmic * storage.coinValue * 20;
coinsToAdd += materials.ultimate * storage.coinValue * 50;
coins += coinsToAdd;
storage.coins = coins;
// Create coin particles for visual feedback
for (var i = 0; i < Math.min(totalMaterials, 5); i++) {
var coinParticle = new CoinParticle();
coinParticles.push(coinParticle);
game.addChild(coinParticle);
coinParticle.init(rock.x + i * 20 - 40, rock.y);
}
materials = {
stone: 0,
lava: 0,
crystal: 0,
magic: 0,
diamond: 0,
ancient: 0,
cosmic: 0,
ultimate: 0
};
updateCoinDisplay();
updateMaterialDisplay();
LK.getSound('coin').play();
};
// Debug button handler
debugBtn.down = function () {
debugMenuOpen = !debugMenuOpen;
debugMenu.visible = debugMenuOpen;
if (debugMenuOpen) {
// Bring debug menu to front
game.removeChild(debugMenu);
game.addChild(debugMenu);
console.log('Debug panel opened');
} else {
console.log('Debug panel closed');
}
};
// Bot button handler
botBtn.down = function () {
if (storage.evolutionLevel < 5) return;
if (botActive) {
stopBot();
} else {
startBot();
}
};
game.update = function () {
// Clean up destroyed particles
for (var i = materialParticles.length - 1; i >= 0; i--) {
if (materialParticles[i].destroyed) {
materialParticles.splice(i, 1);
}
}
for (var j = coinParticles.length - 1; j >= 0; j--) {
if (coinParticles[j].destroyed) {
coinParticles.splice(j, 1);
}
}
// Update debug button appearance
if (debugMode) {
debugBtn.tint = 0x00ff00; // Keep green when debug mode is on
debugBtnText.setText('DEBUG: ON');
} else {
debugBtn.tint = 0xFFFFFF; // Keep white when debug mode is off
debugBtnText.setText('DEBUG');
}
// Update rock appearance
updateRockAppearance();
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
coins: 0,
materialPerClick: 1,
coinValue: 1,
clickUpgradeCost: 10,
valueUpgradeCost: 50,
clickUpgradeLevel: 0,
valueUpgradeLevel: 0,
evolutionUpgradeCost: 100,
evolutionLevel: 0,
botActive: false,
botLevel: 1,
botUpgradeCost: 100,
debugMode: false,
infiniteCoinsMode: false
});
/****
* Classes
****/
var CoinParticle = Container.expand(function () {
var self = Container.call(this);
var coin = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.init = function (startX, startY) {
self.x = startX;
self.y = startY;
// Animate coin floating up
tween(self, {
y: startY - 200,
alpha: 0
}, {
duration: 1500,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
// Scale animation
tween(self, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.easeIn
});
}
});
};
return self;
});
var DebugMenu = Container.expand(function () {
var self = Container.call(this);
var panel = self.attachAsset('debugPanel', {
anchorX: 0.5,
anchorY: 0.5
});
var closeBtn = self.addChild(LK.getAsset('debugCloseButton', {
anchorX: 0.5,
anchorY: 0.5
}));
closeBtn.y = -400;
var addCoinsBtn = self.addChild(LK.getAsset('debugActionButton', {
anchorX: 0.5,
anchorY: 0.5
}));
addCoinsBtn.y = -300;
var addMaterialsBtn = self.addChild(LK.getAsset('debugActionButton', {
anchorX: 0.5,
anchorY: 0.5
}));
addMaterialsBtn.y = -230;
var maxUpgradesBtn = self.addChild(LK.getAsset('debugActionButton', {
anchorX: 0.5,
anchorY: 0.5
}));
maxUpgradesBtn.y = -160;
var infiniteCoinsBtn = self.addChild(LK.getAsset('debugInfiniteCoinsButton', {
anchorX: 0.5,
anchorY: 0.5
}));
infiniteCoinsBtn.y = -90;
var infoBtn = self.addChild(LK.getAsset('debugActionButton', {
anchorX: 0.5,
anchorY: 0.5
}));
infoBtn.y = -20;
var closeText = new Text2('Close', {
size: 30,
fill: 0xFFFFFF
});
closeText.anchor.set(0.5, 0.5);
closeText.x = closeBtn.x;
closeText.y = closeBtn.y;
var addCoinsText = new Text2('Add 1000 Coins', {
size: 40,
fill: 0xFFFFFF
});
addCoinsText.anchor.set(0.5, 0.5);
addCoinsText.x = addCoinsBtn.x;
addCoinsText.y = addCoinsBtn.y;
var addMaterialsText = new Text2('Add Materials', {
size: 40,
fill: 0xFFFFFF
});
addMaterialsText.anchor.set(0.5, 0.5);
addMaterialsText.x = addMaterialsBtn.x;
addMaterialsText.y = addMaterialsBtn.y;
var infiniteCoinsText = new Text2('Infinite Coins: OFF', {
size: 40,
fill: 0xFFFFFF
});
infiniteCoinsText.anchor.set(0.5, 0.5);
infiniteCoinsText.x = infiniteCoinsBtn.x;
infiniteCoinsText.y = infiniteCoinsBtn.y;
var maxUpgradesText = new Text2('Max All Upgrades', {
size: 40,
fill: 0xFFFFFF
});
maxUpgradesText.anchor.set(0.5, 0.5);
maxUpgradesText.x = maxUpgradesBtn.x;
maxUpgradesText.y = maxUpgradesBtn.y;
var infoText = new Text2('Show Game Info', {
size: 40,
fill: 0xFFFFFF
});
infoText.anchor.set(0.5, 0.5);
infoText.x = infoBtn.x;
infoText.y = infoBtn.y;
closeBtn.down = function () {
debugMenuOpen = false;
self.visible = false;
};
addCoinsBtn.down = function () {
coins += 1000;
storage.coins = coins;
updateCoinDisplay();
console.log('Added 1000 coins. Total:', coins);
};
addMaterialsBtn.down = function () {
materials.stone += 100;
materials.lava += 50;
materials.crystal += 25;
materials.magic += 10;
materials.diamond += 5;
materials.ancient += 3;
materials.cosmic += 2;
materials.ultimate += 1;
updateMaterialDisplay();
console.log('Added materials to inventory');
};
maxUpgradesBtn.down = function () {
storage.materialPerClick = 50;
storage.clickUpgradeLevel = 10;
storage.clickUpgradeCost = 1000000;
storage.evolutionLevel = 8;
storage.evolutionUpgradeCost = 1000000;
storage.botLevel = 5;
storage.botUpgradeCost = 1000000;
updateRockAppearance();
if (upgradeMenu) {
upgradeMenu.updateTexts();
}
console.log('Maxed all upgrades');
};
infiniteCoinsBtn.down = function () {
infiniteCoinsMode = !infiniteCoinsMode;
storage.infiniteCoinsMode = infiniteCoinsMode;
if (infiniteCoinsMode) {
infiniteCoinsText.setText('Infinite Coins: ON');
infiniteCoinsBtn.tint = 0x00ff00; // Green when active
console.log('Infinite coins mode activated');
} else {
infiniteCoinsText.setText('Infinite Coins: OFF');
infiniteCoinsBtn.tint = 0xFFFFFF; // White when inactive
console.log('Infinite coins mode deactivated');
}
};
infoBtn.down = function () {
console.log('=== GAME INFO ===');
console.log('Coins:', coins);
console.log('Materials:', materials);
console.log('Evolution Level:', storage.evolutionLevel);
console.log('Bot Level:', storage.botLevel);
console.log('Bot Active:', botActive);
console.log('Material Per Click:', storage.materialPerClick);
console.log('Click Upgrade Cost:', storage.clickUpgradeCost);
console.log('Evolution Upgrade Cost:', storage.evolutionUpgradeCost);
console.log('Bot Upgrade Cost:', storage.botUpgradeCost);
console.log('Debug Mode:', debugMode);
console.log('Infinite Coins Mode:', infiniteCoinsMode);
};
self.addChild(closeText);
self.addChild(addCoinsText);
self.addChild(addMaterialsText);
self.addChild(infiniteCoinsText);
self.addChild(maxUpgradesText);
self.addChild(infoText);
return self;
});
var MaterialParticle = Container.expand(function () {
var self = Container.call(this);
var particle;
self.init = function (startX, startY, materialType) {
// Create particle with specific material type
var assetName = materialType || 'material_stone';
particle = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
// Start particles outside the rock perimeter (rock radius is approximately 200px)
var angle = Math.random() * Math.PI * 2;
var rockRadius = 220; // Slightly outside the rock edge
var startDistance = rockRadius + Math.random() * 50; // 220-270px from center
self.x = startX + Math.cos(angle) * startDistance;
self.y = startY + Math.sin(angle) * startDistance;
// Random direction for particle movement
var moveDistance = 100 + Math.random() * 150;
var targetX = self.x + Math.cos(angle) * moveDistance;
var targetY = self.y + Math.sin(angle) * moveDistance;
// Animate particle
tween(self, {
x: targetX,
y: targetY,
alpha: 0
}, {
duration: 800,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
};
return self;
});
var UpgradeMenu = Container.expand(function () {
var self = Container.call(this);
var panel = self.attachAsset('upgradePanel', {
anchorX: 0.5,
anchorY: 0.5
});
var clickUpgradeBtn = self.addChild(LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
}));
clickUpgradeBtn.y = -200;
var evolutionUpgradeBtn = self.addChild(LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
}));
evolutionUpgradeBtn.y = 0;
var botUpgradeBtn = self.addChild(LK.getAsset('botUpgradeButton', {
anchorX: 0.5,
anchorY: 0.5
}));
botUpgradeBtn.y = 100;
var resetBtn = self.addChild(LK.getAsset('resetButton', {
anchorX: 0.5,
anchorY: 0.5
}));
resetBtn.y = 200;
var closeBtn = self.addChild(LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
width: 100,
height: 60
}));
closeBtn.y = 300;
var clickUpgradeText = new Text2('Upgrade Click\nCost: ' + storage.clickUpgradeCost, {
size: 40,
fill: 0xFFFFFF
});
clickUpgradeText.anchor.set(0.5, 0.5);
clickUpgradeText.x = clickUpgradeBtn.x;
clickUpgradeText.y = clickUpgradeBtn.y;
var evolutionUpgradeText = new Text2('Evolve Rock\nCost: ' + storage.evolutionUpgradeCost, {
size: 40,
fill: 0xFFFFFF
});
evolutionUpgradeText.anchor.set(0.5, 0.5);
evolutionUpgradeText.x = evolutionUpgradeBtn.x;
evolutionUpgradeText.y = evolutionUpgradeBtn.y;
var botUpgradeText = new Text2('Upgrade Bot\nCost: ' + storage.botUpgradeCost, {
size: 40,
fill: 0xFFFFFF
});
botUpgradeText.anchor.set(0.5, 0.5);
botUpgradeText.x = botUpgradeBtn.x;
botUpgradeText.y = botUpgradeBtn.y;
var resetText = new Text2('Reset Progress', {
size: 36,
fill: 0xFFFFFF
});
resetText.anchor.set(0.5, 0.5);
resetText.x = resetBtn.x;
resetText.y = resetBtn.y;
var closeText = new Text2('Close', {
size: 36,
fill: 0xFFFFFF
});
closeText.anchor.set(0.5, 0.5);
closeText.x = closeBtn.x;
closeText.y = closeBtn.y;
self.updateTexts = function () {
if (storage.clickUpgradeLevel >= 10) {
clickUpgradeText.setText('Click MAX LEVEL');
} else {
clickUpgradeText.setText('Upgrade Click (+' + storage.materialPerClick + ')\nCost: ' + storage.clickUpgradeCost);
}
if (storage.evolutionLevel >= 8) {
evolutionUpgradeText.setText('Evolution MAX LEVEL');
} else {
evolutionUpgradeText.setText('Evolve Rock (Lvl ' + (storage.evolutionLevel + 1) + ')\nCost: ' + storage.evolutionUpgradeCost);
}
if (storage.botLevel >= 5) {
botUpgradeText.setText('Bot MAX LEVEL');
} else {
botUpgradeText.setText('Upgrade Bot (Lvl ' + (storage.botLevel + 1) + ')\nCost: ' + storage.botUpgradeCost);
}
};
clickUpgradeBtn.down = function () {
if ((infiniteCoinsMode || coins >= storage.clickUpgradeCost) && storage.clickUpgradeLevel < 10) {
if (!infiniteCoinsMode) {
coins -= storage.clickUpgradeCost;
storage.coins = coins;
}
storage.materialPerClick += 1;
storage.clickUpgradeLevel += 1;
storage.clickUpgradeCost = Math.floor(storage.clickUpgradeCost * 1.5);
LK.getSound('upgrade').play();
self.updateTexts();
updateCoinDisplay();
}
};
evolutionUpgradeBtn.down = function () {
if ((infiniteCoinsMode || coins >= storage.evolutionUpgradeCost) && storage.evolutionLevel < 8) {
if (!infiniteCoinsMode) {
coins -= storage.evolutionUpgradeCost;
storage.coins = coins;
}
storage.evolutionLevel += 1;
storage.evolutionUpgradeCost = Math.floor(storage.evolutionUpgradeCost * 3);
LK.getSound('upgrade').play();
self.updateTexts();
updateCoinDisplay();
updateRockAppearance();
}
};
botUpgradeBtn.down = function () {
if ((infiniteCoinsMode || coins >= storage.botUpgradeCost) && storage.botLevel < 5) {
if (!infiniteCoinsMode) {
coins -= storage.botUpgradeCost;
storage.coins = coins;
}
storage.botLevel += 1;
storage.botUpgradeCost = Math.floor(storage.botUpgradeCost * 2);
LK.getSound('upgrade').play();
self.updateTexts();
updateCoinDisplay();
// Restart bot with new timing if it's active
if (botActive) {
stopBot();
startBot();
}
}
};
resetBtn.down = function () {
// Reset all storage values to defaults
storage.coins = 0;
storage.materialPerClick = 1;
storage.coinValue = 1;
storage.clickUpgradeCost = 10;
storage.valueUpgradeCost = 50;
storage.clickUpgradeLevel = 0;
storage.valueUpgradeLevel = 0;
storage.evolutionUpgradeCost = 100;
storage.evolutionLevel = 0;
storage.botActive = false;
storage.botLevel = 1;
storage.botUpgradeCost = 100;
// Reset game variables
coins = 0;
materials = {
stone: 0,
lava: 0,
crystal: 0,
magic: 0,
diamond: 0,
ancient: 0,
cosmic: 0,
ultimate: 0
};
// Stop and reset bot
if (botActive) {
stopBot();
}
// Update displays
updateCoinDisplay();
updateMaterialDisplay();
updateRockAppearance();
self.updateTexts();
// Close menu
upgradeMenuOpen = false;
self.visible = false;
};
closeBtn.down = function () {
upgradeMenuOpen = false;
self.visible = false;
};
self.addChild(clickUpgradeText);
self.addChild(evolutionUpgradeText);
self.addChild(botUpgradeText);
self.addChild(resetText);
self.addChild(closeText);
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
var coins = storage.coins;
var materials = {
stone: 0,
lava: 0,
crystal: 0,
magic: 0,
diamond: 0,
ancient: 0,
cosmic: 0,
ultimate: 0
};
var upgradeMenuOpen = false;
var debugMenuOpen = false;
var botActive = storage.botActive;
var botTimer = null;
var debugMode = storage.debugMode;
var infiniteCoinsMode = storage.infiniteCoinsMode;
// Debug button
var debugBtn = game.addChild(LK.getAsset('debugButton', {
anchorX: 0.5,
anchorY: 0.5
}));
debugBtn.x = 2048 / 2;
debugBtn.y = 2732 - 350;
debugBtn.visible = true;
var debugBtnText = new Text2('DEBUG', {
size: 30,
fill: 0xFFFFFF
});
debugBtnText.anchor.set(0.5, 0.5);
debugBtnText.x = debugBtn.x;
debugBtnText.y = debugBtn.y;
debugBtnText.visible = true;
// Create background
var background = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0
}));
background.x = 0;
background.y = 0;
// Add a subtle gradient effect by creating multiple background layers
var backgroundGradient = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0
}));
backgroundGradient.x = 0;
backgroundGradient.y = 0;
backgroundGradient.tint = 0x1a1a3a;
backgroundGradient.alpha = 0.5;
// Create central rock
var rock = game.addChild(LK.getAsset('rock', {
anchorX: 0.5,
anchorY: 0.5
}));
rock.x = 2048 / 2;
rock.y = 2732 / 2;
// Add visual improvements to rock based on upgrade levels
function updateRockAppearance() {
var totalUpgrades = storage.clickUpgradeLevel + storage.valueUpgradeLevel;
var oldRock = rock;
var newRockAsset;
var newScale = 1;
var newTint = 0xFFFFFF;
// Evolution changes rock appearance dramatically
if (storage.evolutionLevel >= 8) {
newRockAsset = 'rock_ultimate';
newTint = 0xFFD700;
newScale = 1.2;
} else if (storage.evolutionLevel >= 7) {
newRockAsset = 'rock_ultimate';
newTint = 0xFFFFFF;
} else if (storage.evolutionLevel >= 6) {
newRockAsset = 'rock_cosmic';
newTint = 0xFFFFFF;
} else if (storage.evolutionLevel >= 5) {
newRockAsset = 'rock_ancient';
newTint = 0xFFFFFF;
} else if (storage.evolutionLevel >= 4) {
newRockAsset = 'rock_diamond';
newTint = 0xFFFFFF;
} else if (storage.evolutionLevel >= 3) {
newRockAsset = 'rock_magical';
newTint = 0xFFFFFF;
} else if (storage.evolutionLevel >= 2) {
newRockAsset = 'rock_crystal';
newTint = 0xFFFFFF;
} else if (storage.evolutionLevel >= 1) {
newRockAsset = 'rock_lava';
newTint = 0xFFFFFF;
} else {
newRockAsset = 'rock';
if (totalUpgrades > 5) {
newTint = 0xFFD700; // Golden color
} else if (totalUpgrades > 2) {
newTint = 0xC0C0C0; // Silver color
} else {
newTint = 0xFFFFFF;
}
}
// Replace rock with new evolved version if needed
var currentAssetId = rock._assetId || 'rock';
if (currentAssetId !== newRockAsset) {
var newRock = game.addChild(LK.getAsset(newRockAsset, {
anchorX: 0.5,
anchorY: 0.5
}));
newRock.x = rock.x;
newRock.y = rock.y;
newRock._assetId = newRockAsset;
// Copy event handlers
newRock.down = rock.down;
// Remove old rock and replace reference
game.removeChild(rock);
rock = newRock;
}
// Apply visual effects - keep scale at 1.0 for all levels
rock.scaleX = 1.0;
rock.scaleY = 1.0;
rock.tint = newTint;
// Show/hide bot button based on evolution level
if (storage.evolutionLevel >= 5) {
botBtn.visible = true;
botBtnText.visible = true;
if (upgradeMenu) {
upgradeMenu.children.forEach(function (child) {
if (child.children && child.children[0] && child.children[0].text && child.children[0].text.indexOf('Bot') !== -1) {
child.visible = true;
}
});
}
} else {
botBtn.visible = false;
botBtnText.visible = false;
if (upgradeMenu) {
upgradeMenu.children.forEach(function (child) {
if (child.children && child.children[0] && child.children[0].text && child.children[0].text.indexOf('Bot') !== -1) {
child.visible = false;
}
});
}
if (botActive) {
// Stop bot if evolution level drops below 5
stopBot();
}
}
}
// Create UI elements
var coinText = new Text2('Coins: 0', {
size: 80,
fill: 0xFFD700
});
coinText.anchor.set(0.5, 0);
LK.gui.top.addChild(coinText);
var materialText = new Text2('Materials: 0', {
size: 60,
fill: 0xFFFFFF
});
materialText.anchor.set(0, 0);
materialText.x = 20;
materialText.y = 120;
LK.gui.topLeft.addChild(materialText);
var upgradeBtn = game.addChild(LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
}));
upgradeBtn.x = 2048 / 2;
upgradeBtn.y = 2732 - 150;
var upgradeBtnText = new Text2('UPGRADES', {
size: 50,
fill: 0xFFFFFF
});
upgradeBtnText.anchor.set(0.5, 0.5);
upgradeBtnText.x = upgradeBtn.x;
upgradeBtnText.y = upgradeBtn.y;
var sellBtn = game.addChild(LK.getAsset('sellButton', {
anchorX: 0.5,
anchorY: 0.5
}));
sellBtn.x = 2048 / 2;
sellBtn.y = 2732 - 250;
var sellBtnText = new Text2('SELL MATERIALS', {
size: 40,
fill: 0xFFFFFF
});
sellBtnText.anchor.set(0.5, 0.5);
sellBtnText.x = sellBtn.x;
sellBtnText.y = sellBtn.y;
// Bot button (only visible from evolution level 5+)
var botBtn = game.addChild(LK.getAsset('botButton', {
anchorX: 0.5,
anchorY: 0.5
}));
botBtn.x = 2048 / 2;
botBtn.y = 2732 - 450;
var botBtnText = new Text2('BOT: OFF', {
size: 40,
fill: 0xFFFFFF
});
botBtnText.anchor.set(0.5, 0.5);
botBtnText.x = botBtn.x;
botBtnText.y = botBtn.y;
// Create upgrade menu
var upgradeMenu = game.addChild(new UpgradeMenu());
upgradeMenu.x = 2048 / 2;
upgradeMenu.y = 2732 / 2;
upgradeMenu.visible = false;
// Create debug menu
var debugMenu = game.addChild(new DebugMenu());
debugMenu.x = 2048 / 2;
debugMenu.y = 2732 / 2;
debugMenu.visible = false;
// Arrays for particles
var materialParticles = [];
var coinParticles = [];
// Add button texts on top of buttons
game.addChild(debugBtnText);
game.addChild(upgradeBtnText);
game.addChild(sellBtnText);
game.addChild(botBtnText);
// Update functions
function updateCoinDisplay() {
coinText.setText('Coins: ' + coins);
}
function updateMaterialDisplay() {
var totalMaterials = materials.stone + materials.lava + materials.crystal + materials.magic + materials.diamond + materials.ancient + materials.cosmic + materials.ultimate;
var displayText = 'Materials: ' + totalMaterials;
if (materials.stone > 0) displayText += '\nStone: ' + materials.stone;
if (materials.lava > 0) displayText += '\nLava: ' + materials.lava;
if (materials.crystal > 0) displayText += '\nCrystal: ' + materials.crystal;
if (materials.magic > 0) displayText += '\nMagic: ' + materials.magic;
if (materials.diamond > 0) displayText += '\nDiamond: ' + materials.diamond;
if (materials.ancient > 0) displayText += '\nAncient: ' + materials.ancient;
if (materials.cosmic > 0) displayText += '\nCosmic: ' + materials.cosmic;
if (materials.ultimate > 0) displayText += '\nUltimate: ' + materials.ultimate;
materialText.setText(displayText);
}
function startBot() {
if (botTimer) return; // Already running
botActive = true;
storage.botActive = true;
botBtnText.setText('BOT: ON');
botBtn.tint = 0x00ff00; // Green when active
// Calculate interval based on bot level - starts at 2000ms, reduces by 400ms per level (minimum 200ms)
var interval = Math.max(200, 2000 - (storage.botLevel - 1) * 400);
botTimer = LK.setInterval(function () {
if (storage.evolutionLevel >= 5 && !upgradeMenuOpen) {
// Simulate rock click
rock.down(rock.x, rock.y, {});
}
}, interval);
}
function stopBot() {
if (botTimer) {
LK.clearInterval(botTimer);
botTimer = null;
}
botActive = false;
storage.botActive = false;
botBtnText.setText('BOT: OFF');
botBtn.tint = 0xFFFFFF; // White when inactive
}
// Initialize displays
updateCoinDisplay();
updateMaterialDisplay();
updateRockAppearance();
// Initialize bot state
if (storage.evolutionLevel >= 5) {
botBtn.visible = true;
if (botActive) {
startBot();
}
} else {
botBtn.visible = false;
}
// Rock click handler
rock.down = function (x, y, obj) {
if (upgradeMenuOpen) return;
// Calculate base materials per click
var baseMaterials = storage.materialPerClick;
// Apply evolution level multiplier to all materials
var evolutionMultiplier = 1 + storage.evolutionLevel;
var totalParticles = 0;
// Generate materials based on evolution level - higher levels can produce multiple types
if (storage.evolutionLevel >= 8) {
// Ultimate level - produces all material types with ultimate bonus
materials.stone += baseMaterials * evolutionMultiplier;
materials.lava += baseMaterials * evolutionMultiplier;
materials.crystal += baseMaterials * evolutionMultiplier;
materials.magic += baseMaterials * evolutionMultiplier;
materials.diamond += baseMaterials * evolutionMultiplier;
materials.ancient += baseMaterials * evolutionMultiplier;
materials.cosmic += baseMaterials * evolutionMultiplier;
materials.ultimate += baseMaterials * evolutionMultiplier * 3;
totalParticles += baseMaterials * 10;
for (var i = 0; i < baseMaterials; i++) {
var materialTypes = ['material_stone', 'material_lava', 'material_crystal', 'material_magic', 'material_diamond', 'material_ancient', 'material_cosmic'];
for (var t = 0; t < materialTypes.length; t++) {
var particle = new MaterialParticle();
materialParticles.push(particle);
game.addChild(particle);
particle.init(rock.x, rock.y, materialTypes[t]);
}
}
for (var j = 0; j < baseMaterials * 3; j++) {
var ultimateParticle = new MaterialParticle();
materialParticles.push(ultimateParticle);
game.addChild(ultimateParticle);
ultimateParticle.init(rock.x, rock.y, 'material_ultimate');
}
} else if (storage.evolutionLevel >= 7) {
// Ultimate level variant - produces all material types with high ultimate bonus
materials.stone += baseMaterials * evolutionMultiplier;
materials.lava += baseMaterials * evolutionMultiplier;
materials.crystal += baseMaterials * evolutionMultiplier;
materials.magic += baseMaterials * evolutionMultiplier;
materials.diamond += baseMaterials * evolutionMultiplier;
materials.ancient += baseMaterials * evolutionMultiplier;
materials.cosmic += baseMaterials * evolutionMultiplier;
materials.ultimate += baseMaterials * evolutionMultiplier * 2;
totalParticles += baseMaterials * 9;
for (var i = 0; i < baseMaterials; i++) {
var materialTypes = ['material_stone', 'material_lava', 'material_crystal', 'material_magic', 'material_diamond', 'material_ancient', 'material_cosmic'];
for (var t = 0; t < materialTypes.length; t++) {
var particle = new MaterialParticle();
materialParticles.push(particle);
game.addChild(particle);
particle.init(rock.x, rock.y, materialTypes[t]);
}
}
for (var j = 0; j < baseMaterials * 2; j++) {
var ultimateParticle = new MaterialParticle();
materialParticles.push(ultimateParticle);
game.addChild(ultimateParticle);
ultimateParticle.init(rock.x, rock.y, 'material_ultimate');
}
} else if (storage.evolutionLevel >= 6) {
// Cosmic level - produces all previous materials plus cosmic
materials.stone += baseMaterials * evolutionMultiplier;
materials.lava += baseMaterials * evolutionMultiplier;
materials.crystal += baseMaterials * evolutionMultiplier;
materials.magic += baseMaterials * evolutionMultiplier;
materials.diamond += baseMaterials * evolutionMultiplier;
materials.ancient += baseMaterials * evolutionMultiplier;
materials.cosmic += baseMaterials * evolutionMultiplier * 3;
totalParticles += baseMaterials * 9;
for (var k = 0; k < baseMaterials; k++) {
var materialTypes2 = ['material_stone', 'material_lava', 'material_crystal', 'material_magic', 'material_diamond', 'material_ancient'];
for (var u = 0; u < materialTypes2.length; u++) {
var particle2 = new MaterialParticle();
materialParticles.push(particle2);
game.addChild(particle2);
particle2.init(rock.x, rock.y, materialTypes2[u]);
}
}
for (var l = 0; l < baseMaterials * 3; l++) {
var cosmicParticle = new MaterialParticle();
materialParticles.push(cosmicParticle);
game.addChild(cosmicParticle);
cosmicParticle.init(rock.x, rock.y, 'material_cosmic');
}
} else if (storage.evolutionLevel >= 5) {
// Ancient level - produces all previous materials plus ancient
materials.stone += baseMaterials * evolutionMultiplier;
materials.lava += baseMaterials * evolutionMultiplier;
materials.crystal += baseMaterials * evolutionMultiplier;
materials.magic += baseMaterials * evolutionMultiplier;
materials.diamond += baseMaterials * evolutionMultiplier;
materials.ancient += baseMaterials * evolutionMultiplier * 3;
totalParticles += baseMaterials * 8;
for (var m = 0; m < baseMaterials; m++) {
var materialTypes3 = ['material_stone', 'material_lava', 'material_crystal', 'material_magic', 'material_diamond'];
for (var v = 0; v < materialTypes3.length; v++) {
var particle3 = new MaterialParticle();
materialParticles.push(particle3);
game.addChild(particle3);
particle3.init(rock.x, rock.y, materialTypes3[v]);
}
}
for (var n = 0; n < baseMaterials * 3; n++) {
var ancientParticle = new MaterialParticle();
materialParticles.push(ancientParticle);
game.addChild(ancientParticle);
ancientParticle.init(rock.x, rock.y, 'material_ancient');
}
} else if (storage.evolutionLevel >= 4) {
// Diamond level - produces all previous materials plus diamond
materials.stone += baseMaterials * evolutionMultiplier;
materials.lava += baseMaterials * evolutionMultiplier;
materials.crystal += baseMaterials * evolutionMultiplier;
materials.magic += baseMaterials * evolutionMultiplier;
materials.diamond += baseMaterials * evolutionMultiplier * 3;
totalParticles += baseMaterials * 7;
for (var o = 0; o < baseMaterials; o++) {
var materialTypes4 = ['material_stone', 'material_lava', 'material_crystal', 'material_magic'];
for (var w = 0; w < materialTypes4.length; w++) {
var particle4 = new MaterialParticle();
materialParticles.push(particle4);
game.addChild(particle4);
particle4.init(rock.x, rock.y, materialTypes4[w]);
}
}
for (var p = 0; p < baseMaterials * 3; p++) {
var diamondParticle = new MaterialParticle();
materialParticles.push(diamondParticle);
game.addChild(diamondParticle);
diamondParticle.init(rock.x, rock.y, 'material_diamond');
}
} else if (storage.evolutionLevel >= 3) {
// Magic level - produces all material types
materials.stone += baseMaterials * evolutionMultiplier;
materials.lava += baseMaterials * evolutionMultiplier;
materials.crystal += baseMaterials * evolutionMultiplier;
materials.magic += baseMaterials * evolutionMultiplier * 2; // More magic materials at highest level
totalParticles += baseMaterials * 5;
// Create particles for each type
for (var i = 0; i < baseMaterials; i++) {
var stoneParticle = new MaterialParticle();
materialParticles.push(stoneParticle);
game.addChild(stoneParticle);
stoneParticle.init(rock.x, rock.y, 'material_stone');
var lavaParticle = new MaterialParticle();
materialParticles.push(lavaParticle);
game.addChild(lavaParticle);
lavaParticle.init(rock.x, rock.y, 'material_lava');
var crystalParticle = new MaterialParticle();
materialParticles.push(crystalParticle);
game.addChild(crystalParticle);
crystalParticle.init(rock.x, rock.y, 'material_crystal');
}
for (var j = 0; j < baseMaterials * 2; j++) {
var magicParticle = new MaterialParticle();
materialParticles.push(magicParticle);
game.addChild(magicParticle);
magicParticle.init(rock.x, rock.y, 'material_magic');
}
} else if (storage.evolutionLevel >= 2) {
// Crystal level - produces stone, lava, and crystal
materials.stone += baseMaterials * evolutionMultiplier;
materials.lava += baseMaterials * evolutionMultiplier;
materials.crystal += baseMaterials * evolutionMultiplier * 2; // More crystal materials
totalParticles += baseMaterials * 4;
for (var k = 0; k < baseMaterials; k++) {
var stoneParticle2 = new MaterialParticle();
materialParticles.push(stoneParticle2);
game.addChild(stoneParticle2);
stoneParticle2.init(rock.x, rock.y, 'material_stone');
var lavaParticle2 = new MaterialParticle();
materialParticles.push(lavaParticle2);
game.addChild(lavaParticle2);
lavaParticle2.init(rock.x, rock.y, 'material_lava');
}
for (var l = 0; l < baseMaterials * 2; l++) {
var crystalParticle2 = new MaterialParticle();
materialParticles.push(crystalParticle2);
game.addChild(crystalParticle2);
crystalParticle2.init(rock.x, rock.y, 'material_crystal');
}
} else if (storage.evolutionLevel >= 1) {
// Lava level - produces stone and lava
materials.stone += baseMaterials * evolutionMultiplier;
materials.lava += baseMaterials * evolutionMultiplier * 2; // More lava materials
totalParticles += baseMaterials * 3;
for (var m = 0; m < baseMaterials; m++) {
var stoneParticle3 = new MaterialParticle();
materialParticles.push(stoneParticle3);
game.addChild(stoneParticle3);
stoneParticle3.init(rock.x, rock.y, 'material_stone');
}
for (var n = 0; n < baseMaterials * 2; n++) {
var lavaParticle3 = new MaterialParticle();
materialParticles.push(lavaParticle3);
game.addChild(lavaParticle3);
lavaParticle3.init(rock.x, rock.y, 'material_lava');
}
} else {
// Basic level - only produces stone
materials.stone += baseMaterials * evolutionMultiplier;
totalParticles += baseMaterials;
for (var o = 0; o < baseMaterials; o++) {
var stoneParticle4 = new MaterialParticle();
materialParticles.push(stoneParticle4);
game.addChild(stoneParticle4);
stoneParticle4.init(rock.x, rock.y, 'material_stone');
}
}
updateMaterialDisplay();
// Rock animation
tween(rock, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(rock, {
scaleX: 1,
scaleY: 1
}, {
duration: 100,
easing: tween.easeIn
});
}
});
LK.getSound('mine').play();
};
// Upgrade button handler
upgradeBtn.down = function () {
upgradeMenuOpen = !upgradeMenuOpen;
upgradeMenu.visible = upgradeMenuOpen;
if (upgradeMenuOpen) {
upgradeMenu.updateTexts();
// Bring upgrade menu to front
game.removeChild(upgradeMenu);
game.addChild(upgradeMenu);
}
};
// Sell button handler
sellBtn.down = function () {
var totalMaterials = materials.stone + materials.lava + materials.crystal + materials.magic + materials.diamond + materials.ancient + materials.cosmic + materials.ultimate;
if (upgradeMenuOpen || totalMaterials <= 0) return;
// Convert all materials to coins with different values per type
var coinsToAdd = 0;
coinsToAdd += materials.stone * storage.coinValue;
coinsToAdd += materials.lava * storage.coinValue * 2;
coinsToAdd += materials.crystal * storage.coinValue * 3;
coinsToAdd += materials.magic * storage.coinValue * 5;
coinsToAdd += materials.diamond * storage.coinValue * 8;
coinsToAdd += materials.ancient * storage.coinValue * 12;
coinsToAdd += materials.cosmic * storage.coinValue * 20;
coinsToAdd += materials.ultimate * storage.coinValue * 50;
coins += coinsToAdd;
storage.coins = coins;
// Create coin particles for visual feedback
for (var i = 0; i < Math.min(totalMaterials, 5); i++) {
var coinParticle = new CoinParticle();
coinParticles.push(coinParticle);
game.addChild(coinParticle);
coinParticle.init(rock.x + i * 20 - 40, rock.y);
}
materials = {
stone: 0,
lava: 0,
crystal: 0,
magic: 0,
diamond: 0,
ancient: 0,
cosmic: 0,
ultimate: 0
};
updateCoinDisplay();
updateMaterialDisplay();
LK.getSound('coin').play();
};
// Debug button handler
debugBtn.down = function () {
debugMenuOpen = !debugMenuOpen;
debugMenu.visible = debugMenuOpen;
if (debugMenuOpen) {
// Bring debug menu to front
game.removeChild(debugMenu);
game.addChild(debugMenu);
console.log('Debug panel opened');
} else {
console.log('Debug panel closed');
}
};
// Bot button handler
botBtn.down = function () {
if (storage.evolutionLevel < 5) return;
if (botActive) {
stopBot();
} else {
startBot();
}
};
game.update = function () {
// Clean up destroyed particles
for (var i = materialParticles.length - 1; i >= 0; i--) {
if (materialParticles[i].destroyed) {
materialParticles.splice(i, 1);
}
}
for (var j = coinParticles.length - 1; j >= 0; j--) {
if (coinParticles[j].destroyed) {
coinParticles.splice(j, 1);
}
}
// Update debug button appearance
if (debugMode) {
debugBtn.tint = 0x00ff00; // Keep green when debug mode is on
debugBtnText.setText('DEBUG: ON');
} else {
debugBtn.tint = 0xFFFFFF; // Keep white when debug mode is off
debugBtnText.setText('DEBUG');
}
// Update rock appearance
updateRockAppearance();
};
saco de tierra. In-Game asset. 2d. High contrast. No shadows. pixelart
roca magma. In-Game asset. 2d. High contrast. No shadows. pixelart
roca con trozos de cristal. In-Game asset. 2d. High contrast. No shadows. pixelart
amatista. In-Game asset. 2d. High contrast. No shadows. pixelart
roca gris oscuro con diamantes. In-Game asset. 2d. High contrast. No shadows. pixelart
roca madre. In-Game asset. 2d. High contrast. No shadows. pixelart
lapizlazuli. In-Game asset. 2d. High contrast. No shadows. pixelart
mineral de oro con lapizlazuli incrustado. In-Game asset. 2d. High contrast. No shadows. pixelart
mina abandonada. In-Game asset. 2d. High contrast. No shadows. pixelart