User prompt
create a settings tab. let it be a place where we can turn off music and effects. let it be a language option. let it be Turkish and English. let it be a game reset feature ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Let it be the power value according to the level of the rigs. This power value should be written as a total in the power place above. It should not exceed the upgradeable power value. In cases where it will be more than the upgradeable power, more rigs should not be purchased.
User prompt
Buy more powerful mining rigs
User prompt
save the game every 5 seconds ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
bitcoin values should not be displayed with abbreviations
User prompt
The numbers in the game appear with globally accepted abbreviations.
Code edit (1 edits merged)
Please save this source code
User prompt
Crypto Mining Tycoon
Initial prompt
I'm looking to commission the development of a mobile **Idle Miner / Tycoon game** centered around Bitcoin (or cryptocurrency) mining, heavily inspired by Fumb Games' "Bitcoin Miner." The game should offer a satisfying progression loop of expanding a mining operation, optimizing profits, and accumulating virtual wealth through strategic upgrades and resource management. --- ### Core Game Concept The player's goal is to become a top crypto mining tycoon. Starting with a basic setup in a small room, players will invest their earned virtual Bitcoin into acquiring more powerful mining rigs, upgrading infrastructure, and unlocking new mining locations. The game emphasizes passive income generation, where the player's core interaction shifts from active tapping to making strategic decisions about upgrades and expansions. --- ### Key Features & Mechanics 1. **Mining Process (Idle-Focused):** * **Automated Mining:** Rigs automatically mine Bitcoin/crypto over time. The player does not need to tap constantly for core income. * **Visual Feedback:** Clear visual indication of mining activity (e.g., rigs blinking, numbers increasing). * **Offline Earnings:** The game must continue to generate Bitcoin while the player is offline, with a clear collection mechanism upon return. 2. **Mining Rigs (Equipment Management):** * **Variety of Rigs:** A diverse catalog of mining rigs, each with distinct stats: * **Hash Rate (Mining Power):** How much Bitcoin it generates per second/minute. * **Electricity Consumption:** How much power it uses. * **Heat Generation:** How much heat it produces (potentially affecting cooling costs or efficiency). * **Cost:** Purchase price. * **Tiered Progression:** As players progress, new, more powerful (and expensive) rigs unlock. * **Upgrade System:** Individual rigs can be upgraded to improve their hash rate or efficiency. 3. **Infrastructure & Facility Management:** * **Power Supply:** Manage electricity consumption. Upgrade power generators or power lines to support more rigs. High consumption could lead to higher electricity bills or power outages. * **Cooling Systems:** Rigs generate heat. Upgrade cooling systems (fans, AC units) to maintain optimal operating temperatures and efficiency. * **Mining Rooms/Locations:** Unlock and expand into larger or more efficient mining rooms/facilities, each potentially offering bonuses or more space for rigs. * **Network Upgrades:** Improve network efficiency or reduce data transfer costs. 4. **Research & Development (R&D) / Tech Tree:** * A tech tree or research lab where players can invest Bitcoin/cash to unlock global efficiency bonuses, new rig types, or advanced infrastructure upgrades. * Examples: "Improved Cooling Efficiency," "Next-Gen Chip Design," "Automated Maintenance." 5. **Bitcoin (Crypto) Market Simulation:** * A simplified, dynamic in-game market where the value of Bitcoin (or the in-game crypto) fluctuates over time. * Players can **sell** their mined Bitcoin for cash (the currency used for buying new rigs, power, upgrades) at strategic times to maximize cash earnings. * Visual representation of the market trend (e.g., a simple graph). 6. **Prestige System:** * A core long-term retention mechanic. Players can "reset" their progress (sell all rigs, clear rooms) at certain milestones to earn **permanent prestige currency** (e.g., "MegaHash Tokens" or "Super Bitcoins"). * This prestige currency is used to buy powerful **global permanent bonuses** that make subsequent playthroughs much faster and more profitable. 7. **Monetization & Economy:** * **In-App Purchases (IAP):** Focus on premium currency (e.g., "Gems," "Gold Bars") for: * Instant cash/Bitcoin boosts. * Premium time warps (speed up idle earnings). * Exclusive cosmetic items for the mining facility. * "No Ads" purchase option. * **Rewarded Video Ads:** Optional ads for: * Temporary income multipliers (e.g., "2x profit for 30 min"). * Instant electricity refills. * Short-term speed boosts for mining. * **Balanced Economy:** Carefully designed resource costs and earnings to ensure satisfying progression without feeling too slow or too fast. --- ### Art Style & User Interface (UI/UX) * **Art Style:** Clean, clear, and appealing **isometric or top-down perspective** on the mining room/facility. Visuals should clearly distinguish different rigs and upgrades. A slightly realistic but stylized aesthetic would be suitable. * **UI/UX:** Intuitive, uncluttered, and highly responsive mobile-first interface. Easy access to all stats (Bitcoin balance, cash, hash rate, power consumption), upgrade menus, market, and research tree. Clear visual indicators for full offline earnings, low power, etc. --- ### Technical Requirements * **Platform:** iOS and Android compatibility. * **Game Engine:** Unity (highly recommended for this genre). * **Data Storage:** Robust system for saving player progress locally and potentially to the cloud. --- ### Deliverables * Comprehensive Game Design Document (GDD) detailing all features, upgrade trees, and economic balance. * All necessary 2D/3D art assets (rig models, room environments, UI elements, animations). * Fully functional, stable, and optimized game build for both iOS and Android.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var BitcoinParticle = Container.expand(function () { var self = Container.call(this); var particle = self.attachAsset('bitcoinIcon', { anchorX: 0.5, anchorY: 0.5 }); self.startY = 0; self.targetY = 0; self.animate = function (startY, targetY) { self.y = startY; self.startY = startY; self.targetY = targetY; tween(self, { y: targetY, alpha: 0 }, { duration: 2000, easing: tween.easeOut, onFinish: function onFinish() { self.destroy(); } }); }; return self; }); var MiningRig = Container.expand(function (rigType) { var self = Container.call(this); // Rig properties based on type var rigStats = { basic: { hashRate: 0.01, powerCost: 0.5, price: 2500 }, advanced: { hashRate: 0.4, powerCost: 1.5, price: 1500 }, professional: { hashRate: 2.25, powerCost: 5.0, price: 7500 } }; self.rigType = rigType || 'basic'; self.stats = rigStats[self.rigType]; self.lastMineTime = Date.now(); var rigGraphics = self.attachAsset('miningRig', { anchorX: 0.5, anchorY: 0.5 }); // Add visual indicator for rig type if (self.rigType === 'advanced') { rigGraphics.tint = 0x8e44ad; } else if (self.rigType === 'professional') { rigGraphics.tint = 0xe67e22; } // Mining animation self.animate = function () { tween(rigGraphics, { scaleX: 1.1, scaleY: 1.1 }, { duration: 500, easing: tween.easeInOut, onFinish: function onFinish() { tween(rigGraphics, { scaleX: 1.0, scaleY: 1.0 }, { duration: 500, easing: tween.easeInOut }); } }); }; self.update = function () { var currentTime = Date.now(); if (currentTime - self.lastMineTime >= 10000) { // Mine every 10 seconds self.lastMineTime = currentTime; self.animate(); // Generate bitcoin based on hash rate with prestige multiplier var prestigeMultiplier = Math.pow(1.2, prestigePoints); bitcoin += self.stats.hashRate * prestigeMultiplier; // Power usage is calculated globally, not per rig // Play mining sound occasionally if (Math.random() < 0.1 && settings.effectsEnabled) { LK.getSound('mining').play(); } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a1a }); /**** * Game Code ****/ // Add background image var backgroundImage = LK.getAsset('background', { anchorX: 0, anchorY: 0 }); backgroundImage.x = 0; backgroundImage.y = 0; game.addChild(backgroundImage); // Game state variables var bitcoin = storage.bitcoin || 0; var cash = storage.cash || 1000; var miningRigs = []; var powerCapacity = storage.powerCapacity || 10; var coolingCapacity = storage.coolingCapacity || 10; var powerUsage = 0; var bitcoinPrice = 45000 + Math.random() * 10000; // Starting price between 45k-55k var lastPriceUpdate = Date.now(); var prestigePoints = storage.prestigePoints || 0; var showingPrestige = false; // UI Elements var bitcoinDisplay = new Text2('₿ 0.00000', { size: 50, fill: 0xF39C12 }); bitcoinDisplay.anchor.set(0, 0); bitcoinDisplay.x = 150; bitcoinDisplay.y = 50; LK.gui.topLeft.addChild(bitcoinDisplay); var cashDisplay = new Text2('$ 1,000', { size: 50, fill: 0x27AE60 }); cashDisplay.anchor.set(0, 0); cashDisplay.x = 150; cashDisplay.y = 120; LK.gui.topLeft.addChild(cashDisplay); var priceDisplay = new Text2('BTC: $45,000', { size: 40, fill: 0xFFFFFF }); priceDisplay.anchor.set(1, 0); LK.gui.topRight.addChild(priceDisplay); var powerDisplay = new Text2('Power: 0/10', { size: 35, fill: 0xE74C3C }); powerDisplay.anchor.set(0.5, 0); powerDisplay.y = 50; LK.gui.top.addChild(powerDisplay); // Power meter visual var powerMeterBg = LK.getAsset('powerMeter', { anchorX: 0.5, anchorY: 0.5 }); powerMeterBg.tint = 0x34495e; powerMeterBg.x = 1024; powerMeterBg.y = 150; game.addChild(powerMeterBg); var powerMeterFill = LK.getAsset('powerMeter', { anchorX: 0, anchorY: 0.5, scaleX: 0 }); powerMeterFill.x = powerMeterBg.x - powerMeterBg.width / 2; powerMeterFill.y = powerMeterBg.y; game.addChild(powerMeterFill); // Upgrade buttons var rigUpgradeButton = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); rigUpgradeButton.x = 300; rigUpgradeButton.y = 2600; game.addChild(rigUpgradeButton); var rigUpgradeText = new Text2('Buy Mining Rig - $100', { size: 50, fill: 0xFFFFFF }); rigUpgradeText.anchor.set(0.5, 0.5); rigUpgradeText.x = rigUpgradeButton.x; rigUpgradeText.y = rigUpgradeButton.y; game.addChild(rigUpgradeText); var powerUpgradeButton = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); powerUpgradeButton.x = 850; powerUpgradeButton.y = 2600; game.addChild(powerUpgradeButton); var powerUpgradeText = new Text2('Upgrade Power - $200', { size: 50, fill: 0xFFFFFF }); powerUpgradeText.anchor.set(0.5, 0.5); powerUpgradeText.x = powerUpgradeButton.x; powerUpgradeText.y = powerUpgradeButton.y; game.addChild(powerUpgradeText); var sellButton = LK.getAsset('sellButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); sellButton.x = 1300; sellButton.y = 2600; game.addChild(sellButton); var sellButtonText = new Text2(' SELL ', { size: 50, fill: 0xFFFFFF }); sellButtonText.anchor.set(0.5, 0.5); sellButtonText.x = sellButton.x; sellButtonText.y = sellButton.y; game.addChild(sellButtonText); // Mining rig types and costs - only basic rigs available var rigTypes = ['basic']; var currentRigType = 0; // Starting mining rigs if (storage.rigCount === undefined) { var startingRig = new MiningRig('basic'); startingRig.x = 400; startingRig.y = 400; game.addChild(startingRig); miningRigs.push(startingRig); storage.rigCount = 1; storage.rigTypes = ['basic']; } else { // Restore saved rigs var savedRigTypes = storage.rigTypes || []; for (var i = 0; i < storage.rigCount; i++) { var rigType = savedRigTypes[i] || 'basic'; var rig = new MiningRig(rigType); rig.x = 400 + i % 10 * 140; rig.y = 400 + Math.floor(i / 10) * 120; game.addChild(rig); miningRigs.push(rig); } } // Number formatting utility function formatNumber(num) { if (num < 1000) { return num.toFixed(0); } else if (num < 1000000) { return (num / 1000).toFixed(1) + 'K'; } else if (num < 1000000000) { return (num / 1000000).toFixed(1) + 'M'; } else if (num < 1000000000000) { return (num / 1000000000).toFixed(1) + 'B'; } else if (num < 1000000000000000) { return (num / 1000000000000).toFixed(1) + 'T'; } else if (num < 1000000000000000000) { return (num / 1000000000000000).toFixed(1) + 'Qa'; } else { return (num / 1000000000000000000).toFixed(1) + 'Qi'; } } // Utility functions function updateUI() { bitcoinDisplay.setText(texts[settings.language].bitcoin + ' ' + bitcoin.toFixed(5)); cashDisplay.setText(texts[settings.language].cash + ' ' + formatNumber(cash)); priceDisplay.setText(texts[settings.language].btcPrice + formatNumber(bitcoinPrice)); powerDisplay.setText(texts[settings.language].power + powerUsage.toFixed(1) + '/' + powerCapacity); // Update power meter var powerRatio = Math.min(powerUsage / powerCapacity, 1); powerMeterFill.scaleX = powerRatio; if (powerRatio > 0.9) { powerMeterFill.tint = 0xe74c3c; // Red when near capacity } else if (powerRatio > 0.7) { powerMeterFill.tint = 0xf39c12; // Orange when high } else { powerMeterFill.tint = 0x27ae60; // Green when safe } // Update upgrade button costs - only basic rigs var rigType = 'basic'; var baseCost = 2500; var rigCost = baseCost * Math.pow(1.3, Math.floor(miningRigs.length / 3)); var rigName = 'Basic'; rigUpgradeText.setText(texts[settings.language].buyRig + rigName + texts[settings.language].rig + formatNumber(rigCost)); var powerCost = 500 * Math.pow(1.5, (powerCapacity - 10) / 1); powerUpgradeText.setText(texts[settings.language].upgradePower + formatNumber(powerCost)); } function spawnBitcoinParticle() { if (Math.random() < 0.002) { // 0.2% chance per frame when mining var particle = new BitcoinParticle(); particle.x = 400 + Math.random() * 800; particle.animate(300, 150); game.addChild(particle); } } // Function to calculate total power requirement function calculateTotalPowerUsage() { var totalPower = 0; for (var i = 0; i < miningRigs.length; i++) { totalPower += miningRigs[i].stats.powerCost; } return totalPower; } // Settings state var settings = storage.settings || { musicEnabled: true, effectsEnabled: true, language: 'en' }; var showingSettings = false; // Admin state var adminMode = false; var showingAdmin = false; var unlimitedMoney = false; // Language texts var texts = { en: { bitcoin: '₿', cash: '$', btcPrice: 'BTC: $', power: 'Power: ', buyRig: 'Buy ', rig: ' Rig - $', upgradePower: 'Upgrade Power - $', sellBitcoin: 'Sell Bitcoin', settings: 'Settings', music: 'Music', effects: 'Effects', language: 'Language', reset: 'Reset Game', on: 'ON', off: 'OFF', english: 'English', turkish: 'Turkish', close: 'Close' }, tr: { bitcoin: '₿', cash: '$', btcPrice: 'BTC: $', power: 'Güç: ', buyRig: 'Al ', rig: ' Cihaz - $', upgradePower: 'Güç Yükselt - $', sellBitcoin: 'Bitcoin Sat', settings: 'Ayarlar', music: 'Müzik', effects: 'Efektler', language: 'Dil', reset: 'Oyunu Sıfırla', on: 'AÇIK', off: 'KAPALI', english: 'İngilizce', turkish: 'Türkçe', close: 'Kapat' } }; // Settings button var settingsButton = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); settingsButton.interactive = true; settingsButton.x = 1800; settingsButton.y = 2600; game.addChild(settingsButton); var settingsButtonText = new Text2(texts[settings.language].settings, { size: 50, fill: 0xFFFFFF }); settingsButtonText.anchor.set(0.5, 0.5); settingsButtonText.x = settingsButton.x; settingsButtonText.y = settingsButton.y; game.addChild(settingsButtonText); // Admin button (hidden by default) var adminButton = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); adminButton.interactive = true; adminButton.tint = 0xFF0000; adminButton.x = 1224; adminButton.y = 500; adminButton.visible = adminMode; game.addChild(adminButton); var adminButtonText = new Text2('ADMIN', { size: 30, fill: 0xFFFFFF }); adminButtonText.anchor.set(0.5, 0.5); adminButtonText.x = adminButton.x; adminButtonText.y = adminButton.y; adminButtonText.visible = adminMode; game.addChild(adminButtonText); // Settings panel var settingsPanel = new Container(); settingsPanel.visible = false; var panelBg = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 6, scaleY: 10 }); panelBg.tint = 0x2c3e50; panelBg.x = 0; panelBg.y = 0; settingsPanel.x = 2048 / 2; settingsPanel.y = 2732 / 2; settingsPanel.addChild(panelBg); // Music toggle var musicToggle = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.5, scaleY: 1.2 }); musicToggle.interactive = true; musicToggle.x = 0; musicToggle.y = -266; settingsPanel.addChild(musicToggle); var musicText = new Text2(texts[settings.language].music + ': ' + (settings.musicEnabled ? texts[settings.language].on : texts[settings.language].off), { size: 60, fill: 0xFFFFFF }); musicText.anchor.set(0.5, 0.5); musicText.x = musicToggle.x; musicText.y = musicToggle.y; settingsPanel.addChild(musicText); // Effects toggle var effectsToggle = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.5, scaleY: 1.2 }); effectsToggle.interactive = true; effectsToggle.x = 0; effectsToggle.y = -116; settingsPanel.addChild(effectsToggle); var effectsText = new Text2(texts[settings.language].effects + ': ' + (settings.effectsEnabled ? texts[settings.language].on : texts[settings.language].off), { size: 60, fill: 0xFFFFFF }); effectsText.anchor.set(0.5, 0.5); effectsText.x = effectsToggle.x; effectsText.y = effectsToggle.y; settingsPanel.addChild(effectsText); // Language toggle var languageToggle = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.5, scaleY: 1.2 }); languageToggle.interactive = true; languageToggle.x = 0; languageToggle.y = 34; settingsPanel.addChild(languageToggle); var languageText = new Text2(texts[settings.language].language + ': ' + (settings.language === 'en' ? texts[settings.language].english : texts[settings.language].turkish), { size: 60, fill: 0xFFFFFF }); languageText.anchor.set(0.5, 0.5); languageText.x = languageToggle.x; languageText.y = languageToggle.y; settingsPanel.addChild(languageText); // Reset button var resetButton = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.5, scaleY: 1.2 }); resetButton.interactive = true; resetButton.tint = 0xe74c3c; resetButton.x = 0; resetButton.y = 184; settingsPanel.addChild(resetButton); var resetText = new Text2(texts[settings.language].reset, { size: 60, fill: 0xFFFFFF }); resetText.anchor.set(0.5, 0.5); resetText.x = resetButton.x; resetText.y = resetButton.y; settingsPanel.addChild(resetText); // Reset button var resetButton = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.5, scaleY: 1.2 }); resetButton.interactive = true; resetButton.tint = 0xe74c3c; resetButton.x = 0; resetButton.y = 184; settingsPanel.addChild(resetButton); var resetText = new Text2(texts[settings.language].reset, { size: 60, fill: 0xFFFFFF }); resetText.anchor.set(0.5, 0.5); resetText.x = resetButton.x; resetText.y = resetButton.y; settingsPanel.addChild(resetText); // Close button var closeButton = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.2, scaleY: 1.2 }); closeButton.interactive = true; closeButton.x = 0; closeButton.y = 484; settingsPanel.addChild(closeButton); var closeText = new Text2(texts[settings.language].close, { size: 60, fill: 0xFFFFFF }); closeText.anchor.set(0.5, 0.5); closeText.x = closeButton.x; closeText.y = closeButton.y; settingsPanel.addChild(closeText); LK.gui.addChild(settingsPanel); // Prestige panel var prestigePanel = new Container(); prestigePanel.visible = false; var prestigePanelBg = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 6, scaleY: 8 }); prestigePanelBg.tint = 0x8e44ad; prestigePanelBg.x = 0; prestigePanelBg.y = 0; prestigePanel.x = 1024; prestigePanel.y = 1366; prestigePanel.addChild(prestigePanelBg); // Prestige title var prestigeTitle = new Text2('PRESTIGE AVAILABLE!', { size: 80, fill: 0xFFFFFF }); prestigeTitle.anchor.set(0.5, 0.5); prestigeTitle.x = 0; prestigeTitle.y = -250; prestigePanel.addChild(prestigeTitle); // Prestige info var prestigeInfo = new Text2('You have reached 100 rigs!\nPrestige to reset progress\nand gain permanent bonuses', { size: 50, fill: 0xFFFFFF }); prestigeInfo.anchor.set(0.5, 0.5); prestigeInfo.x = 0; prestigeInfo.y = -100; prestigePanel.addChild(prestigeInfo); // Current prestige points display var currentPrestigeText = new Text2('Current Prestige Points: ' + prestigePoints, { size: 45, fill: 0xF39C12 }); currentPrestigeText.anchor.set(0.5, 0.5); currentPrestigeText.x = 0; currentPrestigeText.y = 0; prestigePanel.addChild(currentPrestigeText); // Prestige multiplier display var multiplierText = new Text2('Current Multiplier: ' + Math.pow(1.2, prestigePoints).toFixed(2) + 'x', { size: 45, fill: 0x27AE60 }); multiplierText.anchor.set(0.5, 0.5); multiplierText.x = 0; multiplierText.y = 70; prestigePanel.addChild(multiplierText); // Prestige button var prestigeButton = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.5, scaleY: 1.5 }); prestigeButton.interactive = true; prestigeButton.tint = 0x8e44ad; prestigeButton.x = 0; prestigeButton.y = 180; prestigePanel.addChild(prestigeButton); var prestigeButtonText = new Text2('PRESTIGE (+1 Point)', { size: 55, fill: 0xFFFFFF }); prestigeButtonText.anchor.set(0.5, 0.5); prestigeButtonText.x = prestigeButton.x; prestigeButtonText.y = prestigeButton.y; prestigePanel.addChild(prestigeButtonText); LK.gui.addChild(prestigePanel); // Admin panel var adminPanel = new Container(); adminPanel.visible = false; var adminPanelBg = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 6, scaleY: 6 }); adminPanelBg.tint = 0x2c3e50; adminPanelBg.x = 0; adminPanelBg.y = 0; adminPanel.x = 1024; adminPanel.y = 1366; adminPanel.addChild(adminPanelBg); // Admin title var adminTitle = new Text2('ADMIN PANEL', { size: 80, fill: 0xFF0000 }); adminTitle.anchor.set(0.5, 0.5); adminTitle.x = 0; adminTitle.y = -200; adminPanel.addChild(adminTitle); // Unlimited money toggle var unlimitedMoneyToggle = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.5, scaleY: 1.2 }); unlimitedMoneyToggle.interactive = true; unlimitedMoneyToggle.x = 0; unlimitedMoneyToggle.y = -50; adminPanel.addChild(unlimitedMoneyToggle); var unlimitedMoneyText = new Text2('Unlimited Money: ' + (unlimitedMoney ? 'ON' : 'OFF'), { size: 50, fill: 0xFFFFFF }); unlimitedMoneyText.anchor.set(0.5, 0.5); unlimitedMoneyText.x = unlimitedMoneyToggle.x; unlimitedMoneyText.y = unlimitedMoneyToggle.y; adminPanel.addChild(unlimitedMoneyText); // Admin close button var adminCloseButton = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.2, scaleY: 1.2 }); adminCloseButton.interactive = true; adminCloseButton.x = 0; adminCloseButton.y = 100; adminPanel.addChild(adminCloseButton); var adminCloseText = new Text2('Close', { size: 60, fill: 0xFFFFFF }); adminCloseText.anchor.set(0.5, 0.5); adminCloseText.x = adminCloseButton.x; adminCloseText.y = adminCloseButton.y; adminPanel.addChild(adminCloseText); LK.gui.addChild(adminPanel); // Function to update language texts function updateLanguageTexts() { settingsButtonText.setText(texts[settings.language].settings); musicText.setText(texts[settings.language].music + ': ' + (settings.musicEnabled ? texts[settings.language].on : texts[settings.language].off)); effectsText.setText(texts[settings.language].effects + ': ' + (settings.effectsEnabled ? texts[settings.language].on : texts[settings.language].off)); languageText.setText(texts[settings.language].language + ': ' + (settings.language === 'en' ? texts[settings.language].english : texts[settings.language].turkish)); resetText.setText(texts[settings.language].reset); closeText.setText(texts[settings.language].close); sellButtonText.setText(texts[settings.language].sellBitcoin); } // Settings button handler settingsButton.down = function (x, y, obj) { showingSettings = !showingSettings; settingsPanel.visible = showingSettings; if (settings.effectsEnabled) { LK.effects.flashObject(settingsButton, 0x3498db, 300); } }; // Music toggle handler musicToggle.down = function (x, y, obj) { settings.musicEnabled = !settings.musicEnabled; storage.settings = settings; updateLanguageTexts(); // Control music playback based on setting if (settings.musicEnabled) { LK.playMusic('Music'); } else { LK.stopMusic(); } if (settings.effectsEnabled) { LK.effects.flashObject(musicToggle, 0x27ae60, 300); } }; // Effects toggle handler effectsToggle.down = function (x, y, obj) { settings.effectsEnabled = !settings.effectsEnabled; storage.settings = settings; updateLanguageTexts(); LK.effects.flashObject(effectsToggle, 0x27ae60, 300); }; // Language toggle handler languageToggle.down = function (x, y, obj) { settings.language = settings.language === 'en' ? 'tr' : 'en'; storage.settings = settings; updateLanguageTexts(); if (settings.effectsEnabled) { LK.effects.flashObject(languageToggle, 0x27ae60, 300); } }; // Reset button handler resetButton.down = function (x, y, obj) { // Clear all storage storage.bitcoin = 0; storage.cash = 1000; storage.powerCapacity = 10; delete storage.rigCount; delete storage.rigTypes; storage.settings = { musicEnabled: true, effectsEnabled: true, language: 'en' }; if (settings.effectsEnabled) { LK.effects.flashObject(resetButton, 0xe74c3c, 500); } // Show game over to restart LK.setTimeout(function () { LK.showGameOver(); }, 600); }; // Close button handler closeButton.down = function (x, y, obj) { showingSettings = false; settingsPanel.visible = false; if (settings.effectsEnabled) { LK.effects.flashObject(closeButton, 0x95a5a6, 300); } }; // Prestige button handler prestigeButton.down = function (x, y, obj) { prestigePoints += 1; storage.prestigePoints = prestigePoints; // Reset game state bitcoin = 0; cash = 1000; powerCapacity = 10; // Clear all rigs for (var i = 0; i < miningRigs.length; i++) { miningRigs[i].destroy(); } miningRigs = []; // Reset storage storage.bitcoin = 0; storage.cash = 1000; storage.powerCapacity = 10; storage.rigCount = 0; storage.rigTypes = []; // Hide prestige panel showingPrestige = false; prestigePanel.visible = false; if (settings.effectsEnabled) { LK.effects.flashObject(prestigeButton, 0x8e44ad, 500); } // Create starting rig var startingRig = new MiningRig('basic'); startingRig.x = 400; startingRig.y = 400; game.addChild(startingRig); miningRigs.push(startingRig); storage.rigCount = 1; storage.rigTypes = ['basic']; }; // Admin button handler adminButton.down = function (x, y, obj) { showingAdmin = !showingAdmin; adminPanel.visible = showingAdmin; if (settings.effectsEnabled) { LK.effects.flashObject(adminButton, 0xFF0000, 300); } }; // Unlimited money toggle handler unlimitedMoneyToggle.down = function (x, y, obj) { unlimitedMoney = !unlimitedMoney; unlimitedMoneyText.setText('Unlimited Money: ' + (unlimitedMoney ? 'ON' : 'OFF')); if (settings.effectsEnabled) { LK.effects.flashObject(unlimitedMoneyToggle, 0x27ae60, 300); } }; // Admin close button handler adminCloseButton.down = function (x, y, obj) { showingAdmin = false; adminPanel.visible = false; if (settings.effectsEnabled) { LK.effects.flashObject(adminCloseButton, 0x95a5a6, 300); } }; // Admin mode activation (secret tap sequence on bitcoin display) var adminTapCount = 0; var lastAdminTap = 0; bitcoinDisplay.interactive = true; bitcoinDisplay.down = function (x, y, obj) { var currentTime = Date.now(); if (currentTime - lastAdminTap < 1000) { adminTapCount++; if (adminTapCount >= 5) { adminMode = true; adminButton.visible = true; adminButtonText.visible = true; adminTapCount = 0; if (settings.effectsEnabled) { LK.effects.flashObject(bitcoinDisplay, 0xFF0000, 500); } } } else { adminTapCount = 1; } lastAdminTap = currentTime; }; // Event handlers rigUpgradeButton.down = function (x, y, obj) { var rigType = 'basic'; var baseCost = 2500; var rigCost = baseCost * Math.pow(1.3, Math.floor(miningRigs.length / 3)); var powerRequired = 0.5; var currentTotalPower = calculateTotalPowerUsage(); if ((cash >= rigCost || unlimitedMoney) && currentTotalPower + powerRequired <= powerCapacity && miningRigs.length < 100) { if (!unlimitedMoney) { cash -= rigCost; } else { cash = Math.max(cash, 999999999); // Ensure cash stays high in unlimited mode } var newRig = new MiningRig(rigType); newRig.x = 400 + miningRigs.length % 10 * 140; newRig.y = 400 + Math.floor(miningRigs.length / 10) * 120; game.addChild(newRig); miningRigs.push(newRig); // Save rig types if (!storage.rigTypes) { storage.rigTypes = []; } storage.rigTypes.push(rigType); storage.rigCount = miningRigs.length; if (settings.effectsEnabled) { LK.getSound('purchase').play(); // Flash effect LK.effects.flashObject(rigUpgradeButton, 0x27ae60, 300); } } }; powerUpgradeButton.down = function (x, y, obj) { var powerCost = 500 * Math.pow(1.5, (powerCapacity - 10) / 1); if ((cash >= powerCost || unlimitedMoney) && powerCapacity < 50) { if (!unlimitedMoney) { cash -= powerCost; } else { cash = Math.max(cash, 999999999); // Ensure cash stays high in unlimited mode } powerCapacity += 1; storage.powerCapacity = powerCapacity; if (settings.effectsEnabled) { LK.getSound('purchase').play(); // Flash effect LK.effects.flashObject(powerUpgradeButton, 0x27ae60, 300); } } }; sellButton.down = function (x, y, obj) { if (bitcoin >= 0.01) { var sellAmount = bitcoin; var earnings = sellAmount * bitcoinPrice; cash += earnings; bitcoin = 0; if (settings.effectsEnabled) { LK.getSound('coin').play(); // Flash effect LK.effects.flashObject(sellButton, 0xf39c12, 500); } // Show earnings popup var earningsText = new Text2('+$' + formatNumber(earnings), { size: 60, fill: 0xF39C12 }); earningsText.anchor.set(0.5, 0.5); earningsText.x = sellButton.x; earningsText.y = sellButton.y - 100; game.addChild(earningsText); tween(earningsText, { y: earningsText.y - 100, alpha: 0 }, { duration: 2000, easing: tween.easeOut, onFinish: function onFinish() { earningsText.destroy(); } }); } }; // Start playing background music if (settings.musicEnabled) { LK.playMusic('Music'); } game.update = function () { powerUsage = calculateTotalPowerUsage(); // Calculate total power usage from all rigs // Update bitcoin price periodically if (Date.now() - lastPriceUpdate > 5000) { // Every 5 seconds lastPriceUpdate = Date.now(); var priceChange = (Math.random() - 0.5) * 0.1; // ±5% change bitcoinPrice = Math.max(10000, bitcoinPrice * (1 + priceChange)); } // Spawn bitcoin particles when mining if (miningRigs.length > 0) { spawnBitcoinParticle(); } // Check for prestige availability if (miningRigs.length >= 100 && !showingPrestige) { showingPrestige = true; prestigePanel.visible = true; // Update prestige panel text currentPrestigeText.setText('Current Prestige Points: ' + prestigePoints); multiplierText.setText('Current Multiplier: ' + Math.pow(1.2, prestigePoints).toFixed(2) + 'x'); } updateUI(); // Save progress periodically if (LK.ticks % 300 === 0) { // Every 5 seconds storage.bitcoin = bitcoin; storage.cash = cash; storage.powerCapacity = powerCapacity; storage.rigCount = miningRigs.length; // Save rig types var rigTypesToSave = []; for (var i = 0; i < miningRigs.length; i++) { rigTypesToSave.push(miningRigs[i].rigType); } storage.rigTypes = rigTypesToSave; } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var BitcoinParticle = Container.expand(function () {
var self = Container.call(this);
var particle = self.attachAsset('bitcoinIcon', {
anchorX: 0.5,
anchorY: 0.5
});
self.startY = 0;
self.targetY = 0;
self.animate = function (startY, targetY) {
self.y = startY;
self.startY = startY;
self.targetY = targetY;
tween(self, {
y: targetY,
alpha: 0
}, {
duration: 2000,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
};
return self;
});
var MiningRig = Container.expand(function (rigType) {
var self = Container.call(this);
// Rig properties based on type
var rigStats = {
basic: {
hashRate: 0.01,
powerCost: 0.5,
price: 2500
},
advanced: {
hashRate: 0.4,
powerCost: 1.5,
price: 1500
},
professional: {
hashRate: 2.25,
powerCost: 5.0,
price: 7500
}
};
self.rigType = rigType || 'basic';
self.stats = rigStats[self.rigType];
self.lastMineTime = Date.now();
var rigGraphics = self.attachAsset('miningRig', {
anchorX: 0.5,
anchorY: 0.5
});
// Add visual indicator for rig type
if (self.rigType === 'advanced') {
rigGraphics.tint = 0x8e44ad;
} else if (self.rigType === 'professional') {
rigGraphics.tint = 0xe67e22;
}
// Mining animation
self.animate = function () {
tween(rigGraphics, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(rigGraphics, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 500,
easing: tween.easeInOut
});
}
});
};
self.update = function () {
var currentTime = Date.now();
if (currentTime - self.lastMineTime >= 10000) {
// Mine every 10 seconds
self.lastMineTime = currentTime;
self.animate();
// Generate bitcoin based on hash rate with prestige multiplier
var prestigeMultiplier = Math.pow(1.2, prestigePoints);
bitcoin += self.stats.hashRate * prestigeMultiplier;
// Power usage is calculated globally, not per rig
// Play mining sound occasionally
if (Math.random() < 0.1 && settings.effectsEnabled) {
LK.getSound('mining').play();
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
// Add background image
var backgroundImage = LK.getAsset('background', {
anchorX: 0,
anchorY: 0
});
backgroundImage.x = 0;
backgroundImage.y = 0;
game.addChild(backgroundImage);
// Game state variables
var bitcoin = storage.bitcoin || 0;
var cash = storage.cash || 1000;
var miningRigs = [];
var powerCapacity = storage.powerCapacity || 10;
var coolingCapacity = storage.coolingCapacity || 10;
var powerUsage = 0;
var bitcoinPrice = 45000 + Math.random() * 10000; // Starting price between 45k-55k
var lastPriceUpdate = Date.now();
var prestigePoints = storage.prestigePoints || 0;
var showingPrestige = false;
// UI Elements
var bitcoinDisplay = new Text2('₿ 0.00000', {
size: 50,
fill: 0xF39C12
});
bitcoinDisplay.anchor.set(0, 0);
bitcoinDisplay.x = 150;
bitcoinDisplay.y = 50;
LK.gui.topLeft.addChild(bitcoinDisplay);
var cashDisplay = new Text2('$ 1,000', {
size: 50,
fill: 0x27AE60
});
cashDisplay.anchor.set(0, 0);
cashDisplay.x = 150;
cashDisplay.y = 120;
LK.gui.topLeft.addChild(cashDisplay);
var priceDisplay = new Text2('BTC: $45,000', {
size: 40,
fill: 0xFFFFFF
});
priceDisplay.anchor.set(1, 0);
LK.gui.topRight.addChild(priceDisplay);
var powerDisplay = new Text2('Power: 0/10', {
size: 35,
fill: 0xE74C3C
});
powerDisplay.anchor.set(0.5, 0);
powerDisplay.y = 50;
LK.gui.top.addChild(powerDisplay);
// Power meter visual
var powerMeterBg = LK.getAsset('powerMeter', {
anchorX: 0.5,
anchorY: 0.5
});
powerMeterBg.tint = 0x34495e;
powerMeterBg.x = 1024;
powerMeterBg.y = 150;
game.addChild(powerMeterBg);
var powerMeterFill = LK.getAsset('powerMeter', {
anchorX: 0,
anchorY: 0.5,
scaleX: 0
});
powerMeterFill.x = powerMeterBg.x - powerMeterBg.width / 2;
powerMeterFill.y = powerMeterBg.y;
game.addChild(powerMeterFill);
// Upgrade buttons
var rigUpgradeButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
rigUpgradeButton.x = 300;
rigUpgradeButton.y = 2600;
game.addChild(rigUpgradeButton);
var rigUpgradeText = new Text2('Buy Mining Rig - $100', {
size: 50,
fill: 0xFFFFFF
});
rigUpgradeText.anchor.set(0.5, 0.5);
rigUpgradeText.x = rigUpgradeButton.x;
rigUpgradeText.y = rigUpgradeButton.y;
game.addChild(rigUpgradeText);
var powerUpgradeButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
powerUpgradeButton.x = 850;
powerUpgradeButton.y = 2600;
game.addChild(powerUpgradeButton);
var powerUpgradeText = new Text2('Upgrade Power - $200', {
size: 50,
fill: 0xFFFFFF
});
powerUpgradeText.anchor.set(0.5, 0.5);
powerUpgradeText.x = powerUpgradeButton.x;
powerUpgradeText.y = powerUpgradeButton.y;
game.addChild(powerUpgradeText);
var sellButton = LK.getAsset('sellButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
sellButton.x = 1300;
sellButton.y = 2600;
game.addChild(sellButton);
var sellButtonText = new Text2(' SELL ', {
size: 50,
fill: 0xFFFFFF
});
sellButtonText.anchor.set(0.5, 0.5);
sellButtonText.x = sellButton.x;
sellButtonText.y = sellButton.y;
game.addChild(sellButtonText);
// Mining rig types and costs - only basic rigs available
var rigTypes = ['basic'];
var currentRigType = 0;
// Starting mining rigs
if (storage.rigCount === undefined) {
var startingRig = new MiningRig('basic');
startingRig.x = 400;
startingRig.y = 400;
game.addChild(startingRig);
miningRigs.push(startingRig);
storage.rigCount = 1;
storage.rigTypes = ['basic'];
} else {
// Restore saved rigs
var savedRigTypes = storage.rigTypes || [];
for (var i = 0; i < storage.rigCount; i++) {
var rigType = savedRigTypes[i] || 'basic';
var rig = new MiningRig(rigType);
rig.x = 400 + i % 10 * 140;
rig.y = 400 + Math.floor(i / 10) * 120;
game.addChild(rig);
miningRigs.push(rig);
}
}
// Number formatting utility
function formatNumber(num) {
if (num < 1000) {
return num.toFixed(0);
} else if (num < 1000000) {
return (num / 1000).toFixed(1) + 'K';
} else if (num < 1000000000) {
return (num / 1000000).toFixed(1) + 'M';
} else if (num < 1000000000000) {
return (num / 1000000000).toFixed(1) + 'B';
} else if (num < 1000000000000000) {
return (num / 1000000000000).toFixed(1) + 'T';
} else if (num < 1000000000000000000) {
return (num / 1000000000000000).toFixed(1) + 'Qa';
} else {
return (num / 1000000000000000000).toFixed(1) + 'Qi';
}
}
// Utility functions
function updateUI() {
bitcoinDisplay.setText(texts[settings.language].bitcoin + ' ' + bitcoin.toFixed(5));
cashDisplay.setText(texts[settings.language].cash + ' ' + formatNumber(cash));
priceDisplay.setText(texts[settings.language].btcPrice + formatNumber(bitcoinPrice));
powerDisplay.setText(texts[settings.language].power + powerUsage.toFixed(1) + '/' + powerCapacity);
// Update power meter
var powerRatio = Math.min(powerUsage / powerCapacity, 1);
powerMeterFill.scaleX = powerRatio;
if (powerRatio > 0.9) {
powerMeterFill.tint = 0xe74c3c; // Red when near capacity
} else if (powerRatio > 0.7) {
powerMeterFill.tint = 0xf39c12; // Orange when high
} else {
powerMeterFill.tint = 0x27ae60; // Green when safe
}
// Update upgrade button costs - only basic rigs
var rigType = 'basic';
var baseCost = 2500;
var rigCost = baseCost * Math.pow(1.3, Math.floor(miningRigs.length / 3));
var rigName = 'Basic';
rigUpgradeText.setText(texts[settings.language].buyRig + rigName + texts[settings.language].rig + formatNumber(rigCost));
var powerCost = 500 * Math.pow(1.5, (powerCapacity - 10) / 1);
powerUpgradeText.setText(texts[settings.language].upgradePower + formatNumber(powerCost));
}
function spawnBitcoinParticle() {
if (Math.random() < 0.002) {
// 0.2% chance per frame when mining
var particle = new BitcoinParticle();
particle.x = 400 + Math.random() * 800;
particle.animate(300, 150);
game.addChild(particle);
}
}
// Function to calculate total power requirement
function calculateTotalPowerUsage() {
var totalPower = 0;
for (var i = 0; i < miningRigs.length; i++) {
totalPower += miningRigs[i].stats.powerCost;
}
return totalPower;
}
// Settings state
var settings = storage.settings || {
musicEnabled: true,
effectsEnabled: true,
language: 'en'
};
var showingSettings = false;
// Admin state
var adminMode = false;
var showingAdmin = false;
var unlimitedMoney = false;
// Language texts
var texts = {
en: {
bitcoin: '₿',
cash: '$',
btcPrice: 'BTC: $',
power: 'Power: ',
buyRig: 'Buy ',
rig: ' Rig - $',
upgradePower: 'Upgrade Power - $',
sellBitcoin: 'Sell Bitcoin',
settings: 'Settings',
music: 'Music',
effects: 'Effects',
language: 'Language',
reset: 'Reset Game',
on: 'ON',
off: 'OFF',
english: 'English',
turkish: 'Turkish',
close: 'Close'
},
tr: {
bitcoin: '₿',
cash: '$',
btcPrice: 'BTC: $',
power: 'Güç: ',
buyRig: 'Al ',
rig: ' Cihaz - $',
upgradePower: 'Güç Yükselt - $',
sellBitcoin: 'Bitcoin Sat',
settings: 'Ayarlar',
music: 'Müzik',
effects: 'Efektler',
language: 'Dil',
reset: 'Oyunu Sıfırla',
on: 'AÇIK',
off: 'KAPALI',
english: 'İngilizce',
turkish: 'Türkçe',
close: 'Kapat'
}
};
// Settings button
var settingsButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
settingsButton.interactive = true;
settingsButton.x = 1800;
settingsButton.y = 2600;
game.addChild(settingsButton);
var settingsButtonText = new Text2(texts[settings.language].settings, {
size: 50,
fill: 0xFFFFFF
});
settingsButtonText.anchor.set(0.5, 0.5);
settingsButtonText.x = settingsButton.x;
settingsButtonText.y = settingsButton.y;
game.addChild(settingsButtonText);
// Admin button (hidden by default)
var adminButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
adminButton.interactive = true;
adminButton.tint = 0xFF0000;
adminButton.x = 1224;
adminButton.y = 500;
adminButton.visible = adminMode;
game.addChild(adminButton);
var adminButtonText = new Text2('ADMIN', {
size: 30,
fill: 0xFFFFFF
});
adminButtonText.anchor.set(0.5, 0.5);
adminButtonText.x = adminButton.x;
adminButtonText.y = adminButton.y;
adminButtonText.visible = adminMode;
game.addChild(adminButtonText);
// Settings panel
var settingsPanel = new Container();
settingsPanel.visible = false;
var panelBg = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 6,
scaleY: 10
});
panelBg.tint = 0x2c3e50;
panelBg.x = 0;
panelBg.y = 0;
settingsPanel.x = 2048 / 2;
settingsPanel.y = 2732 / 2;
settingsPanel.addChild(panelBg);
// Music toggle
var musicToggle = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2.5,
scaleY: 1.2
});
musicToggle.interactive = true;
musicToggle.x = 0;
musicToggle.y = -266;
settingsPanel.addChild(musicToggle);
var musicText = new Text2(texts[settings.language].music + ': ' + (settings.musicEnabled ? texts[settings.language].on : texts[settings.language].off), {
size: 60,
fill: 0xFFFFFF
});
musicText.anchor.set(0.5, 0.5);
musicText.x = musicToggle.x;
musicText.y = musicToggle.y;
settingsPanel.addChild(musicText);
// Effects toggle
var effectsToggle = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2.5,
scaleY: 1.2
});
effectsToggle.interactive = true;
effectsToggle.x = 0;
effectsToggle.y = -116;
settingsPanel.addChild(effectsToggle);
var effectsText = new Text2(texts[settings.language].effects + ': ' + (settings.effectsEnabled ? texts[settings.language].on : texts[settings.language].off), {
size: 60,
fill: 0xFFFFFF
});
effectsText.anchor.set(0.5, 0.5);
effectsText.x = effectsToggle.x;
effectsText.y = effectsToggle.y;
settingsPanel.addChild(effectsText);
// Language toggle
var languageToggle = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2.5,
scaleY: 1.2
});
languageToggle.interactive = true;
languageToggle.x = 0;
languageToggle.y = 34;
settingsPanel.addChild(languageToggle);
var languageText = new Text2(texts[settings.language].language + ': ' + (settings.language === 'en' ? texts[settings.language].english : texts[settings.language].turkish), {
size: 60,
fill: 0xFFFFFF
});
languageText.anchor.set(0.5, 0.5);
languageText.x = languageToggle.x;
languageText.y = languageToggle.y;
settingsPanel.addChild(languageText);
// Reset button
var resetButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2.5,
scaleY: 1.2
});
resetButton.interactive = true;
resetButton.tint = 0xe74c3c;
resetButton.x = 0;
resetButton.y = 184;
settingsPanel.addChild(resetButton);
var resetText = new Text2(texts[settings.language].reset, {
size: 60,
fill: 0xFFFFFF
});
resetText.anchor.set(0.5, 0.5);
resetText.x = resetButton.x;
resetText.y = resetButton.y;
settingsPanel.addChild(resetText);
// Reset button
var resetButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2.5,
scaleY: 1.2
});
resetButton.interactive = true;
resetButton.tint = 0xe74c3c;
resetButton.x = 0;
resetButton.y = 184;
settingsPanel.addChild(resetButton);
var resetText = new Text2(texts[settings.language].reset, {
size: 60,
fill: 0xFFFFFF
});
resetText.anchor.set(0.5, 0.5);
resetText.x = resetButton.x;
resetText.y = resetButton.y;
settingsPanel.addChild(resetText);
// Close button
var closeButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2.2,
scaleY: 1.2
});
closeButton.interactive = true;
closeButton.x = 0;
closeButton.y = 484;
settingsPanel.addChild(closeButton);
var closeText = new Text2(texts[settings.language].close, {
size: 60,
fill: 0xFFFFFF
});
closeText.anchor.set(0.5, 0.5);
closeText.x = closeButton.x;
closeText.y = closeButton.y;
settingsPanel.addChild(closeText);
LK.gui.addChild(settingsPanel);
// Prestige panel
var prestigePanel = new Container();
prestigePanel.visible = false;
var prestigePanelBg = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 6,
scaleY: 8
});
prestigePanelBg.tint = 0x8e44ad;
prestigePanelBg.x = 0;
prestigePanelBg.y = 0;
prestigePanel.x = 1024;
prestigePanel.y = 1366;
prestigePanel.addChild(prestigePanelBg);
// Prestige title
var prestigeTitle = new Text2('PRESTIGE AVAILABLE!', {
size: 80,
fill: 0xFFFFFF
});
prestigeTitle.anchor.set(0.5, 0.5);
prestigeTitle.x = 0;
prestigeTitle.y = -250;
prestigePanel.addChild(prestigeTitle);
// Prestige info
var prestigeInfo = new Text2('You have reached 100 rigs!\nPrestige to reset progress\nand gain permanent bonuses', {
size: 50,
fill: 0xFFFFFF
});
prestigeInfo.anchor.set(0.5, 0.5);
prestigeInfo.x = 0;
prestigeInfo.y = -100;
prestigePanel.addChild(prestigeInfo);
// Current prestige points display
var currentPrestigeText = new Text2('Current Prestige Points: ' + prestigePoints, {
size: 45,
fill: 0xF39C12
});
currentPrestigeText.anchor.set(0.5, 0.5);
currentPrestigeText.x = 0;
currentPrestigeText.y = 0;
prestigePanel.addChild(currentPrestigeText);
// Prestige multiplier display
var multiplierText = new Text2('Current Multiplier: ' + Math.pow(1.2, prestigePoints).toFixed(2) + 'x', {
size: 45,
fill: 0x27AE60
});
multiplierText.anchor.set(0.5, 0.5);
multiplierText.x = 0;
multiplierText.y = 70;
prestigePanel.addChild(multiplierText);
// Prestige button
var prestigeButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2.5,
scaleY: 1.5
});
prestigeButton.interactive = true;
prestigeButton.tint = 0x8e44ad;
prestigeButton.x = 0;
prestigeButton.y = 180;
prestigePanel.addChild(prestigeButton);
var prestigeButtonText = new Text2('PRESTIGE (+1 Point)', {
size: 55,
fill: 0xFFFFFF
});
prestigeButtonText.anchor.set(0.5, 0.5);
prestigeButtonText.x = prestigeButton.x;
prestigeButtonText.y = prestigeButton.y;
prestigePanel.addChild(prestigeButtonText);
LK.gui.addChild(prestigePanel);
// Admin panel
var adminPanel = new Container();
adminPanel.visible = false;
var adminPanelBg = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 6,
scaleY: 6
});
adminPanelBg.tint = 0x2c3e50;
adminPanelBg.x = 0;
adminPanelBg.y = 0;
adminPanel.x = 1024;
adminPanel.y = 1366;
adminPanel.addChild(adminPanelBg);
// Admin title
var adminTitle = new Text2('ADMIN PANEL', {
size: 80,
fill: 0xFF0000
});
adminTitle.anchor.set(0.5, 0.5);
adminTitle.x = 0;
adminTitle.y = -200;
adminPanel.addChild(adminTitle);
// Unlimited money toggle
var unlimitedMoneyToggle = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2.5,
scaleY: 1.2
});
unlimitedMoneyToggle.interactive = true;
unlimitedMoneyToggle.x = 0;
unlimitedMoneyToggle.y = -50;
adminPanel.addChild(unlimitedMoneyToggle);
var unlimitedMoneyText = new Text2('Unlimited Money: ' + (unlimitedMoney ? 'ON' : 'OFF'), {
size: 50,
fill: 0xFFFFFF
});
unlimitedMoneyText.anchor.set(0.5, 0.5);
unlimitedMoneyText.x = unlimitedMoneyToggle.x;
unlimitedMoneyText.y = unlimitedMoneyToggle.y;
adminPanel.addChild(unlimitedMoneyText);
// Admin close button
var adminCloseButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2.2,
scaleY: 1.2
});
adminCloseButton.interactive = true;
adminCloseButton.x = 0;
adminCloseButton.y = 100;
adminPanel.addChild(adminCloseButton);
var adminCloseText = new Text2('Close', {
size: 60,
fill: 0xFFFFFF
});
adminCloseText.anchor.set(0.5, 0.5);
adminCloseText.x = adminCloseButton.x;
adminCloseText.y = adminCloseButton.y;
adminPanel.addChild(adminCloseText);
LK.gui.addChild(adminPanel);
// Function to update language texts
function updateLanguageTexts() {
settingsButtonText.setText(texts[settings.language].settings);
musicText.setText(texts[settings.language].music + ': ' + (settings.musicEnabled ? texts[settings.language].on : texts[settings.language].off));
effectsText.setText(texts[settings.language].effects + ': ' + (settings.effectsEnabled ? texts[settings.language].on : texts[settings.language].off));
languageText.setText(texts[settings.language].language + ': ' + (settings.language === 'en' ? texts[settings.language].english : texts[settings.language].turkish));
resetText.setText(texts[settings.language].reset);
closeText.setText(texts[settings.language].close);
sellButtonText.setText(texts[settings.language].sellBitcoin);
}
// Settings button handler
settingsButton.down = function (x, y, obj) {
showingSettings = !showingSettings;
settingsPanel.visible = showingSettings;
if (settings.effectsEnabled) {
LK.effects.flashObject(settingsButton, 0x3498db, 300);
}
};
// Music toggle handler
musicToggle.down = function (x, y, obj) {
settings.musicEnabled = !settings.musicEnabled;
storage.settings = settings;
updateLanguageTexts();
// Control music playback based on setting
if (settings.musicEnabled) {
LK.playMusic('Music');
} else {
LK.stopMusic();
}
if (settings.effectsEnabled) {
LK.effects.flashObject(musicToggle, 0x27ae60, 300);
}
};
// Effects toggle handler
effectsToggle.down = function (x, y, obj) {
settings.effectsEnabled = !settings.effectsEnabled;
storage.settings = settings;
updateLanguageTexts();
LK.effects.flashObject(effectsToggle, 0x27ae60, 300);
};
// Language toggle handler
languageToggle.down = function (x, y, obj) {
settings.language = settings.language === 'en' ? 'tr' : 'en';
storage.settings = settings;
updateLanguageTexts();
if (settings.effectsEnabled) {
LK.effects.flashObject(languageToggle, 0x27ae60, 300);
}
};
// Reset button handler
resetButton.down = function (x, y, obj) {
// Clear all storage
storage.bitcoin = 0;
storage.cash = 1000;
storage.powerCapacity = 10;
delete storage.rigCount;
delete storage.rigTypes;
storage.settings = {
musicEnabled: true,
effectsEnabled: true,
language: 'en'
};
if (settings.effectsEnabled) {
LK.effects.flashObject(resetButton, 0xe74c3c, 500);
}
// Show game over to restart
LK.setTimeout(function () {
LK.showGameOver();
}, 600);
};
// Close button handler
closeButton.down = function (x, y, obj) {
showingSettings = false;
settingsPanel.visible = false;
if (settings.effectsEnabled) {
LK.effects.flashObject(closeButton, 0x95a5a6, 300);
}
};
// Prestige button handler
prestigeButton.down = function (x, y, obj) {
prestigePoints += 1;
storage.prestigePoints = prestigePoints;
// Reset game state
bitcoin = 0;
cash = 1000;
powerCapacity = 10;
// Clear all rigs
for (var i = 0; i < miningRigs.length; i++) {
miningRigs[i].destroy();
}
miningRigs = [];
// Reset storage
storage.bitcoin = 0;
storage.cash = 1000;
storage.powerCapacity = 10;
storage.rigCount = 0;
storage.rigTypes = [];
// Hide prestige panel
showingPrestige = false;
prestigePanel.visible = false;
if (settings.effectsEnabled) {
LK.effects.flashObject(prestigeButton, 0x8e44ad, 500);
}
// Create starting rig
var startingRig = new MiningRig('basic');
startingRig.x = 400;
startingRig.y = 400;
game.addChild(startingRig);
miningRigs.push(startingRig);
storage.rigCount = 1;
storage.rigTypes = ['basic'];
};
// Admin button handler
adminButton.down = function (x, y, obj) {
showingAdmin = !showingAdmin;
adminPanel.visible = showingAdmin;
if (settings.effectsEnabled) {
LK.effects.flashObject(adminButton, 0xFF0000, 300);
}
};
// Unlimited money toggle handler
unlimitedMoneyToggle.down = function (x, y, obj) {
unlimitedMoney = !unlimitedMoney;
unlimitedMoneyText.setText('Unlimited Money: ' + (unlimitedMoney ? 'ON' : 'OFF'));
if (settings.effectsEnabled) {
LK.effects.flashObject(unlimitedMoneyToggle, 0x27ae60, 300);
}
};
// Admin close button handler
adminCloseButton.down = function (x, y, obj) {
showingAdmin = false;
adminPanel.visible = false;
if (settings.effectsEnabled) {
LK.effects.flashObject(adminCloseButton, 0x95a5a6, 300);
}
};
// Admin mode activation (secret tap sequence on bitcoin display)
var adminTapCount = 0;
var lastAdminTap = 0;
bitcoinDisplay.interactive = true;
bitcoinDisplay.down = function (x, y, obj) {
var currentTime = Date.now();
if (currentTime - lastAdminTap < 1000) {
adminTapCount++;
if (adminTapCount >= 5) {
adminMode = true;
adminButton.visible = true;
adminButtonText.visible = true;
adminTapCount = 0;
if (settings.effectsEnabled) {
LK.effects.flashObject(bitcoinDisplay, 0xFF0000, 500);
}
}
} else {
adminTapCount = 1;
}
lastAdminTap = currentTime;
};
// Event handlers
rigUpgradeButton.down = function (x, y, obj) {
var rigType = 'basic';
var baseCost = 2500;
var rigCost = baseCost * Math.pow(1.3, Math.floor(miningRigs.length / 3));
var powerRequired = 0.5;
var currentTotalPower = calculateTotalPowerUsage();
if ((cash >= rigCost || unlimitedMoney) && currentTotalPower + powerRequired <= powerCapacity && miningRigs.length < 100) {
if (!unlimitedMoney) {
cash -= rigCost;
} else {
cash = Math.max(cash, 999999999); // Ensure cash stays high in unlimited mode
}
var newRig = new MiningRig(rigType);
newRig.x = 400 + miningRigs.length % 10 * 140;
newRig.y = 400 + Math.floor(miningRigs.length / 10) * 120;
game.addChild(newRig);
miningRigs.push(newRig);
// Save rig types
if (!storage.rigTypes) {
storage.rigTypes = [];
}
storage.rigTypes.push(rigType);
storage.rigCount = miningRigs.length;
if (settings.effectsEnabled) {
LK.getSound('purchase').play();
// Flash effect
LK.effects.flashObject(rigUpgradeButton, 0x27ae60, 300);
}
}
};
powerUpgradeButton.down = function (x, y, obj) {
var powerCost = 500 * Math.pow(1.5, (powerCapacity - 10) / 1);
if ((cash >= powerCost || unlimitedMoney) && powerCapacity < 50) {
if (!unlimitedMoney) {
cash -= powerCost;
} else {
cash = Math.max(cash, 999999999); // Ensure cash stays high in unlimited mode
}
powerCapacity += 1;
storage.powerCapacity = powerCapacity;
if (settings.effectsEnabled) {
LK.getSound('purchase').play();
// Flash effect
LK.effects.flashObject(powerUpgradeButton, 0x27ae60, 300);
}
}
};
sellButton.down = function (x, y, obj) {
if (bitcoin >= 0.01) {
var sellAmount = bitcoin;
var earnings = sellAmount * bitcoinPrice;
cash += earnings;
bitcoin = 0;
if (settings.effectsEnabled) {
LK.getSound('coin').play();
// Flash effect
LK.effects.flashObject(sellButton, 0xf39c12, 500);
}
// Show earnings popup
var earningsText = new Text2('+$' + formatNumber(earnings), {
size: 60,
fill: 0xF39C12
});
earningsText.anchor.set(0.5, 0.5);
earningsText.x = sellButton.x;
earningsText.y = sellButton.y - 100;
game.addChild(earningsText);
tween(earningsText, {
y: earningsText.y - 100,
alpha: 0
}, {
duration: 2000,
easing: tween.easeOut,
onFinish: function onFinish() {
earningsText.destroy();
}
});
}
};
// Start playing background music
if (settings.musicEnabled) {
LK.playMusic('Music');
}
game.update = function () {
powerUsage = calculateTotalPowerUsage(); // Calculate total power usage from all rigs
// Update bitcoin price periodically
if (Date.now() - lastPriceUpdate > 5000) {
// Every 5 seconds
lastPriceUpdate = Date.now();
var priceChange = (Math.random() - 0.5) * 0.1; // ±5% change
bitcoinPrice = Math.max(10000, bitcoinPrice * (1 + priceChange));
}
// Spawn bitcoin particles when mining
if (miningRigs.length > 0) {
spawnBitcoinParticle();
}
// Check for prestige availability
if (miningRigs.length >= 100 && !showingPrestige) {
showingPrestige = true;
prestigePanel.visible = true;
// Update prestige panel text
currentPrestigeText.setText('Current Prestige Points: ' + prestigePoints);
multiplierText.setText('Current Multiplier: ' + Math.pow(1.2, prestigePoints).toFixed(2) + 'x');
}
updateUI();
// Save progress periodically
if (LK.ticks % 300 === 0) {
// Every 5 seconds
storage.bitcoin = bitcoin;
storage.cash = cash;
storage.powerCapacity = powerCapacity;
storage.rigCount = miningRigs.length;
// Save rig types
var rigTypesToSave = [];
for (var i = 0; i < miningRigs.length; i++) {
rigTypesToSave.push(miningRigs[i].rigType);
}
storage.rigTypes = rigTypesToSave;
}
};