1
0
Files
PonyWave-Tools/clicker/script.js
2025-10-31 21:21:34 +01:00

1070 lines
34 KiB
JavaScript

// 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 <strong style="color: var(--secondary-color);">${(0.5 + prestigeLevel * 0.1).toFixed(1)}x Multiplikator</strong> für alle Einkommen.<br><br>Deine gekauften <strong>Upgrades bleiben erhalten</strong>!`;
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(`Achievement 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 = `
<strong>${achievement.name}</strong><br>
${achievement.description}<br>
${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\n${url}`;
// Variante 2: Punkte fokussiert
shareTexts[2] = `Ich habe ${points} Punkte im PonyWave Clicker Game erreicht! 🎮 Beat meinen Score!\n\n#ClickerGame #PonyWave\n${url}`;
// 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} Achievements`;
}
variant3 += ` 🏆\n\n#ClickerGame #PonyWave\n${url}`;
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;
// Copy to clipboard
navigator.clipboard.writeText(text).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)}`;
break;
case 'whatsapp':
shareUrl = `https://wa.me/?text=${encodeURIComponent(text)}`;
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)}&quote=${encodeURIComponent(text)}`;
break;
}
if (shareUrl) {
window.open(shareUrl, '_blank', 'width=600,height=400');
}
}