// Jahr aktualisieren document.getElementById('currentYear').textContent = new Date().getFullYear(); // Game state let score = 0; let totalScore = 0; let clickPower = 1; let idlePower = 0; let autoClickers = 0; let clickPowerCost = 10; let idleCost = 20; let autoClickerCost = 100; let totalClicks = 0; let prestigeLevel = 0; let notificationsOn = true; let secondsPlayed = 0; let lastUpdate = Date.now(); // Upgrades let doubleClick = false; let idleMultiplier = false; let clickMultiplier = false; let doubleClickCost = 500; let idleMultiplierCost = 1000; let clickMultiplierCost = 2000; // Neue Upgrades let fastAutoClicker = false; let autoClickerBoost = false; let megaClick = false; let hyperIdle = false; let superMultiplier = false; let prestigeBoost = false; let goldenClick = false; let comboSystem = false; let timeBonus = false; let ultraPower = false; let fastAutoClickerCost = 5000; let autoClickerBoostCost = 10000; let megaClickCost = 15000; let hyperIdleCost = 20000; let superMultiplierCost = 30000; let prestigeBoostCost = 25000; let goldenClickCost = 40000; let comboSystemCost = 50000; let timeBonusCost = 35000; let ultraPowerCost = 75000; // Spezial-Feature Variablen let lastClickTime = 0; let comboCount = 0; let startTime = Date.now(); // Achievements const achievements = [ { id: 'first_click', name: 'Erster Klick', description: 'Mache deinen ersten Klick', earned: false, check: () => totalClicks >= 1 }, { id: 'first_upgrade', name: 'Erstes Upgrade', description: 'Kaufe dein erstes Upgrade', earned: false, check: () => clickPower > 1 || idlePower > 0 }, { id: '100_clicks', name: 'Jahrhundert', description: 'Erreiche 100 Klicks', earned: false, check: () => totalClicks >= 100 }, { id: '1000_score', name: 'Tausender', description: 'Erreiche 1.000 Punkte', earned: false, check: () => totalScore >= 1000 }, { id: 'first_prestige', name: 'Aufstieg', description: 'Führe dein erstes Prestige durch', earned: false, check: () => prestigeLevel >= 1 }, { id: 'auto_clicker', name: 'Automatisierung', description: 'Kaufe deinen ersten Auto-Klicker', earned: false, check: () => autoClickers > 0 }, { id: 'idle_master', name: 'Idle-Meister', description: 'Erreiche 100 Idle-Power', earned: false, check: () => idlePower >= 100 }, { id: 'click_master', name: 'Klick-Meister', description: 'Erreiche 100 Klick-Power', earned: false, check: () => clickPower >= 100 }, { id: 'prestige_5', name: 'Prestige-Profi', description: 'Erreiche Prestige Level 5', earned: false, check: () => prestigeLevel >= 5 }, { id: 'all_upgrades', name: 'Voll aufgerüstet', description: 'Kaufe alle Basis-Upgrades', earned: false, check: () => doubleClick && idleMultiplier && clickMultiplier }, // Höhere Meilensteine { id: '10k_score', name: 'Zehntausend', description: 'Erreiche 10.000 Punkte', earned: false, check: () => totalScore >= 10000 }, { id: '100k_score', name: 'Hunderttausend', description: 'Erreiche 100.000 Punkte', earned: false, check: () => totalScore >= 100000 }, { id: '1m_score', name: 'Millionär', description: 'Erreiche 1.000.000 Punkte', earned: false, check: () => totalScore >= 1000000 }, { id: '1k_clicks', name: 'Tausend Klicks', description: 'Erreiche 1.000 Klicks', earned: false, check: () => totalClicks >= 1000 }, { id: '10k_clicks', name: 'Zehntausend Klicks', description: 'Erreiche 10.000 Klicks', earned: false, check: () => totalClicks >= 10000 }, { id: '100k_clicks', name: 'Hunderttausend Klicks', description: 'Erreiche 100.000 Klicks', earned: false, check: () => totalClicks >= 100000 }, { id: '1000_click_power', name: 'Power-Gigant Klick', description: 'Erreiche 1.000 Klick-Power', earned: false, check: () => clickPower >= 1000 }, { id: '1000_idle_power', name: 'Power-Gigant Idle', description: 'Erreiche 1.000 Idle-Power', earned: false, check: () => idlePower >= 1000 }, // Zeit & Geduld { id: '1h_played', name: 'Ausdauer', description: 'Spiele 1 Stunde lang', earned: false, check: () => secondsPlayed >= 3600 }, { id: '10h_played', name: 'Hingabe', description: 'Spiele 10 Stunden lang', earned: false, check: () => secondsPlayed >= 36000 }, { id: '100h_played', name: 'Legende', description: 'Spiele 100 Stunden lang', earned: false, check: () => secondsPlayed >= 360000 }, // Herausforderungen (werden manuell freigeschaltet) { id: 'fast_clicker', name: 'Schnellschütze', description: 'Klicke 100 Mal in 60 Sekunden', earned: false, check: () => false }, { id: 'minimalist', name: 'Minimalist', description: 'Erreiche 10.000 Punkte ohne Auto-Klicker', earned: false, check: () => false }, { id: 'speed_runner', name: 'Speed Runner', description: 'Erreiche 1.000 Punkte in 5 Minuten', earned: false, check: () => false }, // Prestige & Sammler { id: 'prestige_10', name: 'Prestige-Experte', description: 'Erreiche Prestige Level 10', earned: false, check: () => prestigeLevel >= 10 }, { id: 'prestige_20', name: 'Prestige-Meister', description: 'Erreiche Prestige Level 20', earned: false, check: () => prestigeLevel >= 20 }, { id: '10_auto_clickers', name: 'Auto-Armee', description: 'Besitze 10 Auto-Klicker', earned: false, check: () => autoClickers >= 10 }, { id: 'all_upgrades_extended', name: 'Vollständig aufgerüstet', description: 'Kaufe alle Upgrades', earned: false, check: () => doubleClick && idleMultiplier && clickMultiplier && fastAutoClicker && autoClickerBoost && megaClick && hyperIdle && superMultiplier && prestigeBoost && goldenClick && comboSystem && timeBonus && ultraPower } ]; // DOM elements const scoreEl = document.getElementById('score'); const clickButton = document.getElementById('clickButton'); function updateUI() { // Update main display scoreEl.textContent = formatNumber(score); document.getElementById('clickPowerValue').textContent = doubleClick ? 2 : 1; document.getElementById('idleValue').textContent = idleMultiplier ? 2 : 1; document.getElementById('clickPowerCost').textContent = formatNumber(clickPowerCost); document.getElementById('idleCost').textContent = formatNumber(idleCost); document.getElementById('autoClickerCost').textContent = formatNumber(autoClickerCost); document.getElementById('autoClickerCount').textContent = autoClickers; const autoClickerInterval = fastAutoClicker ? 3 : 5; document.getElementById('autoClickerDesc').textContent = `Klickt ${(autoClickers * (doubleClick ? 2 : 1) * (clickMultiplier ? 1.5 : 1)).toFixed(1)} Mal alle ${autoClickerInterval}s`; // Update stats tab document.getElementById('totalClicks').textContent = formatNumber(totalClicks); document.getElementById('clickPowerStat').textContent = formatNumber(clickPower * (doubleClick ? 2 : 1) * (clickMultiplier ? 1.5 : 1)); document.getElementById('idleStat').textContent = formatNumber(idlePower * (idleMultiplier ? 2 : 1) * (1 + prestigeLevel * 0.5)) + '/s'; const autoClickerIntervalSec = fastAutoClicker ? 3 : 5; document.getElementById('autoClickerStat').textContent = autoClickers + ' (' + ((autoClickers * (doubleClick ? 2 : 1) * (clickMultiplier ? 1.5 : 1)) / autoClickerIntervalSec).toFixed(1) + '/s)'; document.getElementById('prestigeLevel').textContent = prestigeLevel; document.getElementById('prestigeBonusStat').textContent = (1 + prestigeLevel * 0.5).toFixed(1) + 'x'; document.getElementById('timePlayed').textContent = formatTime(secondsPlayed); document.getElementById('totalScore').textContent = formatNumber(totalScore); document.getElementById('scoreRate').textContent = formatNumber((idlePower * (idleMultiplier ? 2 : 1) * (1 + prestigeLevel * 0.5)) + ((autoClickers * (doubleClick ? 2 : 1) * (clickMultiplier ? 1.5 : 1)) / autoClickerIntervalSec)) + '/s'; // Update upgrades tab document.getElementById('doubleClickCost').textContent = formatNumber(doubleClickCost); document.getElementById('idleMultiplierCost').textContent = formatNumber(idleMultiplierCost); document.getElementById('clickMultiplierCost').textContent = formatNumber(clickMultiplierCost); // Neue Upgrades document.getElementById('fastAutoClickerCost').textContent = formatNumber(fastAutoClickerCost); document.getElementById('autoClickerBoostCost').textContent = formatNumber(autoClickerBoostCost); document.getElementById('megaClickCost').textContent = formatNumber(megaClickCost); document.getElementById('hyperIdleCost').textContent = formatNumber(hyperIdleCost); document.getElementById('superMultiplierCost').textContent = formatNumber(superMultiplierCost); document.getElementById('prestigeBoostCost').textContent = formatNumber(prestigeBoostCost); document.getElementById('goldenClickCost').textContent = formatNumber(goldenClickCost); document.getElementById('comboSystemCost').textContent = formatNumber(comboSystemCost); document.getElementById('timeBonusCost').textContent = formatNumber(timeBonusCost); document.getElementById('ultraPowerCost').textContent = formatNumber(ultraPowerCost); // Update prestige button const prestigeBtn = document.getElementById('prestigeBtn'); if (score >= 1000 * Math.pow(2, prestigeLevel)) { prestigeBtn.style.display = 'block'; document.getElementById('prestigeBonus').textContent = (0.5 + prestigeLevel * 0.1).toFixed(1); } else { prestigeBtn.style.display = 'none'; } // Update progress bars updateProgress('clickPowerProgress', score / clickPowerCost); updateProgress('idleProgress', score / idleCost); updateProgress('autoClickerProgress', score / autoClickerCost); updateProgress('doubleClickProgress', score / doubleClickCost); updateProgress('idleMultiplierProgress', score / idleMultiplierCost); updateProgress('clickMultiplierProgress', score / clickMultiplierCost); // Neue Upgrade Progress-Bars updateProgress('fastAutoClickerProgress', score / fastAutoClickerCost); updateProgress('autoClickerBoostProgress', score / autoClickerBoostCost); updateProgress('megaClickProgress', score / megaClickCost); updateProgress('hyperIdleProgress', score / hyperIdleCost); updateProgress('superMultiplierProgress', score / superMultiplierCost); updateProgress('prestigeBoostProgress', score / prestigeBoostCost); updateProgress('goldenClickProgress', score / goldenClickCost); updateProgress('comboSystemProgress', score / comboSystemCost); updateProgress('timeBonusProgress', score / timeBonusCost); updateProgress('ultraPowerProgress', score / ultraPowerCost); // Update card states updateCardState('clickPowerCard', score >= clickPowerCost); updateCardState('idleCard', score >= idleCost); updateCardState('autoClickerCard', score >= autoClickerCost); updateCardState('doubleClickCard', !doubleClick && score >= doubleClickCost); updateCardState('idleMultiplierCard', !idleMultiplier && score >= idleMultiplierCost); updateCardState('clickMultiplierCard', !clickMultiplier && score >= clickMultiplierCost); // Neue Upgrade Card-States updateCardState('fastAutoClickerCard', !fastAutoClicker && score >= fastAutoClickerCost); updateCardState('autoClickerBoostCard', !autoClickerBoost && score >= autoClickerBoostCost); updateCardState('megaClickCard', !megaClick && score >= megaClickCost); updateCardState('hyperIdleCard', !hyperIdle && score >= hyperIdleCost); updateCardState('superMultiplierCard', !superMultiplier && score >= superMultiplierCost); updateCardState('prestigeBoostCard', !prestigeBoost && score >= prestigeBoostCost); updateCardState('goldenClickCard', !goldenClick && score >= goldenClickCost); updateCardState('comboSystemCard', !comboSystem && score >= comboSystemCost); updateCardState('timeBonusCard', !timeBonus && score >= timeBonusCost); updateCardState('ultraPowerCard', !ultraPower && score >= ultraPowerCost); // Update premium upgrade "Gekauft" status updatePremiumUpgradeOwned('doubleClick', doubleClick); updatePremiumUpgradeOwned('idleMultiplier', idleMultiplier); updatePremiumUpgradeOwned('clickMultiplier', clickMultiplier); updatePremiumUpgradeOwned('fastAutoClicker', fastAutoClicker); updatePremiumUpgradeOwned('autoClickerBoost', autoClickerBoost); updatePremiumUpgradeOwned('megaClick', megaClick); updatePremiumUpgradeOwned('hyperIdle', hyperIdle); updatePremiumUpgradeOwned('prestigeBoost', prestigeBoost); updatePremiumUpgradeOwned('superMultiplier', superMultiplier); updatePremiumUpgradeOwned('timeBonus', timeBonus); updatePremiumUpgradeOwned('goldenClick', goldenClick); updatePremiumUpgradeOwned('comboSystem', comboSystem); updatePremiumUpgradeOwned('ultraPower', ultraPower); // Update settings document.getElementById('notificationStatus').textContent = notificationsOn ? 'AN' : 'AUS'; // Check achievements checkAchievements(); // Save game saveGame(); } function showScoreChange(amount, isGolden = false, isAuto = false) { const container = document.getElementById('score-container'); const change = document.createElement('div'); change.className = 'score-change'; if (isAuto) { change.textContent = `+${formatNumber(amount)} 🤖`; change.style.left = '0'; change.style.right = 'auto'; } else { change.textContent = `+${formatNumber(amount)}${isGolden ? ' ⭐' : ''}`; } if (isGolden) { change.style.color = '#FFD700'; change.style.fontSize = '1.5rem'; change.style.fontWeight = '800'; } container.appendChild(change); setTimeout(() => change.remove(), 1000); } function updateProgress(id, ratio) { const progress = document.getElementById(id); progress.style.width = `${Math.min(100, ratio * 100)}%`; } function updateCardState(id, enabled) { const card = document.getElementById(id); if (enabled) { card.classList.remove('disabled'); } else { card.classList.add('disabled'); } } function updatePremiumUpgradeOwned(name, isOwned) { const ownedLabel = document.getElementById(name + 'Owned'); const costLabel = document.getElementById(name + 'CostLabel'); if (isOwned) { ownedLabel.style.display = 'inline'; if (costLabel) costLabel.style.display = 'none'; } else { ownedLabel.style.display = 'none'; if (costLabel) costLabel.style.display = 'inline'; } } function clickScore() { // Basis-Multiplikatoren let clickMultipliers = (doubleClick ? 2 : 1) * (clickMultiplier ? 1.5 : 1); if (megaClick) clickMultipliers *= 3; // Prestige-Bonus let prestigeBonus = 1 + prestigeLevel * 0.5; if (prestigeBoost) prestigeBonus *= 2; // Zeit-Bonus let timeMult = 1; if (timeBonus) { const hoursPlayed = secondsPlayed / 3600; timeMult = 1 + (hoursPlayed * 0.05); } // Ultra-Power if (ultraPower) { clickMultipliers *= 1.5; timeMult *= 1.5; } // Super-Multiplikator if (superMultiplier) { clickMultipliers *= 1.5; } // Combo-System const now = Date.now(); if (comboSystem && (now - lastClickTime) < 2000) { comboCount++; clickMultipliers *= (1 + comboCount * 0.1); } else { comboCount = 0; } lastClickTime = now; // Golden Click let isGolden = false; if (goldenClick && Math.random() < 0.1) { clickMultipliers *= 10; isGolden = true; } const power = clickPower * clickMultipliers * prestigeBonus * timeMult; score += power; totalScore += power; totalClicks++; // Visual feedback showScoreChange(power, isGolden); // Button animation clickButton.style.transform = 'scale(0.95)'; setTimeout(() => { clickButton.style.transform = 'scale(1)'; }, 100); updateUI(); } function buyClickPower() { if (score >= clickPowerCost) { score -= clickPowerCost; clickPower++; clickPowerCost = Math.floor(clickPowerCost * 1.5); if (notificationsOn) { showNotification(`Klick-Power auf ${clickPower} erhöht!`); } updateUI(); } } function buyIdle() { if (score >= idleCost) { score -= idleCost; idlePower++; idleCost = Math.floor(idleCost * 1.8); if (notificationsOn) { showNotification(`Idle-Power auf ${idlePower}/s erhöht!`); } updateUI(); } } function buyAutoClicker() { if (score >= autoClickerCost) { score -= autoClickerCost; autoClickers++; autoClickerCost = Math.floor(autoClickerCost * 2.5); if (notificationsOn) { showNotification(`Auto-Klicker gekauft! Du hast jetzt ${autoClickers} Auto-Klicker.`); } updateUI(); } } function buyDoubleClick() { if (!doubleClick && score >= doubleClickCost) { score -= doubleClickCost; doubleClick = true; if (notificationsOn) { showNotification('Doppelte Klick-Power freigeschaltet! Alle Klicks sind jetzt doppelt so stark.'); } updateUI(); } } function buyIdleMultiplier() { if (!idleMultiplier && score >= idleMultiplierCost) { score -= idleMultiplierCost; idleMultiplier = true; if (notificationsOn) { showNotification('Idle-Multiplikator freigeschaltet! Idle-Generierung ist jetzt doppelt so effektiv.'); } updateUI(); } } function buyClickMultiplier() { if (!clickMultiplier && score >= clickMultiplierCost) { score -= clickMultiplierCost; clickMultiplier = true; if (notificationsOn) { showNotification('Klick-Multiplikator freigeschaltet! Alle Klicks sind jetzt 1,5x effektiver.'); } updateUI(); } } // Neue Upgrade-Funktionen function buyFastAutoClicker() { if (!fastAutoClicker && score >= fastAutoClickerCost) { score -= fastAutoClickerCost; fastAutoClicker = true; // Starte Auto-Clicker mit neuer Geschwindigkeit neu startAutoClicker(); if (notificationsOn) { showNotification('Schnelle Auto-Clicker freigeschaltet! Auto-Clicker klicken jetzt alle 3s.'); } updateUI(); } } function buyAutoClickerBoost() { if (!autoClickerBoost && score >= autoClickerBoostCost) { score -= autoClickerBoostCost; autoClickerBoost = true; if (notificationsOn) { showNotification('Auto-Clicker Boost freigeschaltet! Auto-Clicker sind jetzt 2x stärker.'); } updateUI(); } } function buyMegaClick() { if (!megaClick && score >= megaClickCost) { score -= megaClickCost; megaClick = true; if (notificationsOn) { showNotification('Mega-Klick freigeschaltet! Klicks sind jetzt 3x stärker.'); } updateUI(); } } function buyHyperIdle() { if (!hyperIdle && score >= hyperIdleCost) { score -= hyperIdleCost; hyperIdle = true; if (notificationsOn) { showNotification('Hyper Idle freigeschaltet! Idle-Power ist jetzt 3x stärker.'); } updateUI(); } } function buySuperMultiplier() { if (!superMultiplier && score >= superMultiplierCost) { score -= superMultiplierCost; superMultiplier = true; if (notificationsOn) { showNotification('Super-Multiplikator freigeschaltet! Alle Einnahmen +50%.'); } updateUI(); } } function buyPrestigeBoost() { if (!prestigeBoost && score >= prestigeBoostCost) { score -= prestigeBoostCost; prestigeBoost = true; if (notificationsOn) { showNotification('Prestige-Boost freigeschaltet! Prestige gibt jetzt doppelten Bonus.'); } updateUI(); } } function buyGoldenClick() { if (!goldenClick && score >= goldenClickCost) { score -= goldenClickCost; goldenClick = true; if (notificationsOn) { showNotification('Golden Click freigeschaltet! 10% Chance auf kritischen Klick (10x).'); } updateUI(); } } function buyComboSystem() { if (!comboSystem && score >= comboSystemCost) { score -= comboSystemCost; comboSystem = true; if (notificationsOn) { showNotification('Combo-System freigeschaltet! Schnelle Klicks geben +10% Bonus.'); } updateUI(); } } function buyTimeBonus() { if (!timeBonus && score >= timeBonusCost) { score -= timeBonusCost; timeBonus = true; if (notificationsOn) { showNotification('Zeit-Bonus freigeschaltet! +5% zu allem pro Stunde Spielzeit.'); } updateUI(); } } function buyUltraPower() { if (!ultraPower && score >= ultraPowerCost) { score -= ultraPowerCost; ultraPower = true; if (notificationsOn) { showNotification('Ultra-Power freigeschaltet! Alle Multiplikatoren +50%.'); } updateUI(); } } function prestige() { const requiredScore = 1000 * Math.pow(2, prestigeLevel); if (score >= requiredScore) { // Öffne das Prestige-Modal const modal = document.getElementById('prestigeModal'); const text = document.getElementById('prestigeModalText'); text.innerHTML = `Du wirst deinen Fortschritt zurücksetzen, aber erhältst einen permanenten ${(0.5 + prestigeLevel * 0.1).toFixed(1)}x Multiplikator für alle Einkommen.

Deine gekauften Upgrades bleiben erhalten!`; modal.classList.add('active'); } } function closePrestigeModal() { const modal = document.getElementById('prestigeModal'); modal.classList.remove('active'); } function confirmPrestige() { // Schließe das Modal closePrestigeModal(); prestigeLevel++; // Reset game state but keep prestige level and upgrades score = 0; clickPower = 1; idlePower = 0; autoClickers = 0; clickPowerCost = 10; idleCost = 20; autoClickerCost = 100; totalClicks = 0; if (notificationsOn) { showNotification(`Prestige auf Level ${prestigeLevel}! ${(0.5 + (prestigeLevel-1)*0.1).toFixed(1)}x Multiplikator erhalten.`); } // Starte Auto-Clicker neu (behält fastAutoClicker Geschwindigkeit) startAutoClicker(); updateUI(); } function toggleNotifications() { notificationsOn = !notificationsOn; updateUI(); } function switchTab(id) { document.querySelectorAll('.tab').forEach(btn => btn.classList.remove('active')); document.querySelector(`.tab[onclick="switchTab('${id}')"]`).classList.add('active'); document.querySelectorAll('.tab-content').forEach(tab => { tab.classList.remove('active'); tab.style.opacity = '0'; }); const activeTab = document.getElementById(id); activeTab.classList.add('active'); setTimeout(() => { activeTab.style.opacity = '1'; }, 10); } function resetGame() { // Öffne das Reset-Modal const modal = document.getElementById('resetModal'); modal.classList.add('active'); } function closeResetModal() { const modal = document.getElementById('resetModal'); modal.classList.remove('active'); } function confirmReset() { // Schließe das Modal closeResetModal(); // Lösche den Spielstand localStorage.removeItem("clickerSave"); // Setze alle Variablen zurück score = 0; totalScore = 0; clickPower = 1; idlePower = 0; autoClickers = 0; clickPowerCost = 10; idleCost = 20; autoClickerCost = 100; totalClicks = 0; prestigeLevel = 0; secondsPlayed = 0; lastUpdate = Date.now(); startTime = Date.now(); comboCount = 0; lastClickTime = 0; // Setze Upgrades zurück doubleClick = false; idleMultiplier = false; clickMultiplier = false; doubleClickCost = 500; idleMultiplierCost = 1000; clickMultiplierCost = 2000; // Neue Upgrades zurücksetzen fastAutoClicker = false; autoClickerBoost = false; megaClick = false; hyperIdle = false; superMultiplier = false; prestigeBoost = false; goldenClick = false; comboSystem = false; timeBonus = false; ultraPower = false; fastAutoClickerCost = 5000; autoClickerBoostCost = 10000; megaClickCost = 15000; hyperIdleCost = 20000; superMultiplierCost = 30000; prestigeBoostCost = 25000; goldenClickCost = 40000; comboSystemCost = 50000; timeBonusCost = 35000; ultraPowerCost = 75000; // Achievements zurücksetzen achievements.forEach(achievement => { achievement.earned = false; }); // Starte Auto-Clicker neu (jetzt wieder mit 5s) startAutoClicker(); // UI aktualisieren updateUI(); renderAchievements(); if (notificationsOn) { showNotification('Spiel wurde zurückgesetzt!'); } } function showNotification(message) { if (!notificationsOn) return; const notifications = document.getElementById('notifications'); const notification = document.createElement('div'); notification.className = 'notification'; notification.textContent = message; notifications.appendChild(notification); setTimeout(() => { notification.style.opacity = '0'; setTimeout(() => notification.remove(), 300); }, 3000); } function checkAchievements() { achievements.forEach(achievement => { if (!achievement.earned && achievement.check()) { achievement.earned = true; if (notificationsOn) { showNotification(`Erfolg freigeschaltet: ${achievement.name}!`); } renderAchievements(); } }); } function renderAchievements() { const container = document.getElementById('achievementsList'); container.innerHTML = ''; achievements.forEach(achievement => { const div = document.createElement('div'); div.className = achievement.earned ? 'achievement' : 'achievement locked'; div.innerHTML = ` ${achievement.name}
${achievement.description}
${achievement.earned ? '✅ Freigeschaltet' : '🔒 Gesperrt'} `; container.appendChild(div); }); } function formatNumber(num) { if (num >= 1000000000) { return (num / 1000000000).toFixed(1) + 'Mrd'; } if (num >= 1000000) { return (num / 1000000).toFixed(1) + 'Mio'; } if (num >= 1000) { return (num / 1000).toFixed(1) + 'K'; } return Math.floor(num).toString(); } function formatTime(seconds) { const hours = Math.floor(seconds / 3600); const minutes = Math.floor((seconds % 3600) / 60); const secs = seconds % 60; if (hours > 0) { return `${hours}h ${minutes}m ${secs}s`; } else if (minutes > 0) { return `${minutes}m ${secs}s`; } else { return `${secs}s`; } } function getSaveData() { return { score, totalScore, clickPower, idlePower, autoClickers, clickPowerCost, idleCost, autoClickerCost, totalClicks, prestigeLevel, notificationsOn, secondsPlayed, doubleClick, idleMultiplier, clickMultiplier, doubleClickCost, idleMultiplierCost, clickMultiplierCost, fastAutoClicker, autoClickerBoost, megaClick, hyperIdle, superMultiplier, prestigeBoost, goldenClick, comboSystem, timeBonus, ultraPower, fastAutoClickerCost, autoClickerBoostCost, megaClickCost, hyperIdleCost, superMultiplierCost, prestigeBoostCost, goldenClickCost, comboSystemCost, timeBonusCost, ultraPowerCost, achievements: achievements.map(a => ({ id: a.id, earned: a.earned })) }; } function loadSaveData(data) { score = data.score || 0; totalScore = data.totalScore || 0; clickPower = data.clickPower || 1; idlePower = data.idlePower || 0; autoClickers = data.autoClickers || 0; clickPowerCost = data.clickPowerCost || 10; idleCost = data.idleCost || 20; autoClickerCost = data.autoClickerCost || 100; totalClicks = data.totalClicks || 0; prestigeLevel = data.prestigeLevel || 0; notificationsOn = data.notificationsOn ?? true; secondsPlayed = data.secondsPlayed || 0; // Upgrades doubleClick = data.doubleClick || false; idleMultiplier = data.idleMultiplier || false; clickMultiplier = data.clickMultiplier || false; doubleClickCost = data.doubleClickCost || 500; idleMultiplierCost = data.idleMultiplierCost || 1000; clickMultiplierCost = data.clickMultiplierCost || 2000; fastAutoClicker = data.fastAutoClicker || false; autoClickerBoost = data.autoClickerBoost || false; megaClick = data.megaClick || false; hyperIdle = data.hyperIdle || false; superMultiplier = data.superMultiplier || false; prestigeBoost = data.prestigeBoost || false; goldenClick = data.goldenClick || false; comboSystem = data.comboSystem || false; timeBonus = data.timeBonus || false; ultraPower = data.ultraPower || false; fastAutoClickerCost = data.fastAutoClickerCost || 5000; autoClickerBoostCost = data.autoClickerBoostCost || 10000; megaClickCost = data.megaClickCost || 15000; hyperIdleCost = data.hyperIdleCost || 20000; superMultiplierCost = data.superMultiplierCost || 30000; prestigeBoostCost = data.prestigeBoostCost || 25000; goldenClickCost = data.goldenClickCost || 40000; comboSystemCost = data.comboSystemCost || 50000; timeBonusCost = data.timeBonusCost || 35000; ultraPowerCost = data.ultraPowerCost || 75000; // Achievements if (data.achievements) { data.achievements.forEach(savedAchievement => { const achievement = achievements.find(a => a.id === savedAchievement.id); if (achievement) { achievement.earned = savedAchievement.earned; } }); } // Starte Auto-Clicker mit korrekter Geschwindigkeit neu startAutoClicker(); updateUI(); renderAchievements(); } function saveGame() { localStorage.setItem("clickerSave", JSON.stringify(getSaveData())); } function loadGame() { const saved = localStorage.getItem("clickerSave"); if (saved) { try { loadSaveData(JSON.parse(saved)); } catch (e) { console.error("Fehler beim Laden des Spielstands:", e); } } } // Game loop function gameLoop() { const now = Date.now(); const delta = (now - lastUpdate) / 1000; // Convert to seconds lastUpdate = now; // Berechne Multiplikatoren für Idle let idleMultipliers = (idleMultiplier ? 2 : 1); if (hyperIdle) idleMultipliers *= 3; if (superMultiplier) idleMultipliers *= 1.5; if (ultraPower) idleMultipliers *= 1.5; // Prestige-Bonus let prestigeBonus = 1 + prestigeLevel * 0.5; if (prestigeBoost) prestigeBonus *= 2; // Zeit-Bonus let timeMult = 1; if (timeBonus) { const hoursPlayed = secondsPlayed / 3600; timeMult = 1 + (hoursPlayed * 0.05); } if (ultraPower) timeMult *= 1.5; // Idle generation const idleIncome = idlePower * idleMultipliers * prestigeBonus * timeMult * delta; if (idleIncome > 0) { score += idleIncome; totalScore += idleIncome; } updateUI(); requestAnimationFrame(gameLoop); } // Auto clicker interval - wird dynamisch neu gestartet let autoClickerInterval; function startAutoClicker() { // Stoppe altes Interval falls vorhanden if (autoClickerInterval) { clearInterval(autoClickerInterval); } // Starte neues Interval mit aktueller Geschwindigkeit const interval = fastAutoClicker ? 3000 : 5000; autoClickerInterval = setInterval(() => { if (autoClickers > 0) { // Berechne Multiplikatoren let clickMultipliers = (doubleClick ? 2 : 1) * (clickMultiplier ? 1.5 : 1); if (megaClick) clickMultipliers *= 3; if (autoClickerBoost) clickMultipliers *= 2; if (superMultiplier) clickMultipliers *= 1.5; if (ultraPower) clickMultipliers *= 1.5; // Prestige-Bonus let prestigeBonus = 1 + prestigeLevel * 0.5; if (prestigeBoost) prestigeBonus *= 2; // Zeit-Bonus let timeMult = 1; if (timeBonus) { const hoursPlayed = secondsPlayed / 3600; timeMult = 1 + (hoursPlayed * 0.05); } if (ultraPower) timeMult *= 1.5; const clicks = autoClickers * clickMultipliers * prestigeBonus * timeMult; score += clicks; totalScore += clicks; // Visual feedback - zeige Auto-Clicker-Anzeige showScoreChange(clicks, false, true); updateUI(); } }, interval); } // Starte Auto-Clicker beim Laden startAutoClicker(); // Time played counter setInterval(() => { secondsPlayed++; updateUI(); }, 1000); // Initialize loadGame(); updateUI(); renderAchievements(); gameLoop(); // Share Modal Functions let currentShareVariant = 1; const shareTexts = {}; function generateShareTexts() { const clicks = formatNumber(totalClicks); const points = formatNumber(totalScore); const timeText = formatTime(secondsPlayed); const earnedAchievements = achievements.filter(a => a.earned).length; const url = 'https://tools.ponywave.de/clicker'; // Variante 1: Klicks fokussiert shareTexts[1] = `Ich habe beim PonyWave Clicker Game ${clicks} mal in ${timeText} geklickt! Wie viel schaffst du?\n\n#ClickerGame #PonyWave`; // Variante 2: Punkte fokussiert shareTexts[2] = `Ich habe ${points} Punkte im PonyWave Clicker Game erreicht! 🎮 Schlag meinen Score!\n\n#ClickerGame #PonyWave`; // Variante 3: Vollständige Stats let variant3 = `PonyWave Clicker: ${clicks} Klicks | ${points} Punkte`; if (prestigeLevel > 0) { variant3 += ` | Prestige Level ${prestigeLevel}`; } if (earnedAchievements > 0) { variant3 += ` | ${earnedAchievements} Erfolge`; } variant3 += ` 🏆\n\n#ClickerGame #PonyWave`; shareTexts[3] = variant3; } function openShareModal() { generateShareTexts(); const modal = document.getElementById('shareModal'); modal.classList.add('active'); selectShareVariant(1); } function closeShareModal() { const modal = document.getElementById('shareModal'); modal.classList.remove('active'); } function selectShareVariant(variantNum) { currentShareVariant = variantNum; // Update button states document.querySelectorAll('.share-variant-btn').forEach((btn, index) => { if (index + 1 === variantNum) { btn.classList.add('active'); } else { btn.classList.remove('active'); } }); // Update textarea document.getElementById('shareText').value = shareTexts[variantNum]; } function copyShareText() { const textarea = document.getElementById('shareText'); const text = textarea.value; const url = 'https://tools.ponywave.de/clicker'; const fullText = text + '\n' + url; // Copy to clipboard navigator.clipboard.writeText(fullText).then(() => { // Show feedback const feedback = document.getElementById('copyFeedback'); feedback.classList.add('show'); setTimeout(() => { feedback.classList.remove('show'); }, 2000); }).catch(err => { console.error('Fehler beim Kopieren:', err); showNotification('❌ Fehler beim Kopieren in die Zwischenablage'); }); } function shareToSocial(platform) { const text = document.getElementById('shareText').value; const url = 'https://tools.ponywave.de/clicker'; let shareUrl = ''; switch (platform) { case 'twitter': shareUrl = `https://x.com/intent/post?text=${encodeURIComponent(text + '\n' + url)}`; break; case 'whatsapp': shareUrl = `https://wa.me/?text=${encodeURIComponent(text + '\n' + url)}`; break; case 'telegram': shareUrl = `https://t.me/share/url?url=${encodeURIComponent(url)}&text=${encodeURIComponent(text)}`; break; case 'facebook': shareUrl = `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(url)}`; break; } if (shareUrl) { window.open(shareUrl, '_blank', 'width=600,height=400'); } }