1072 lines
34 KiB
JavaScript
1072 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(`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 = `
|
|
<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`;
|
|
|
|
// 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');
|
|
}
|
|
}
|