Neu: Clicker Game
This commit is contained in:
914
clicker/script.js
Normal file
914
clicker/script.js
Normal file
@@ -0,0 +1,914 @@
|
||||
// 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;
|
||||
document.getElementById('autoClickerDesc').textContent = `Klickt ${(autoClickers * (doubleClick ? 2 : 1) * (clickMultiplier ? 1.5 : 1)).toFixed(1)} Mal alle 5s`;
|
||||
|
||||
// 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';
|
||||
document.getElementById('autoClickerStat').textContent = autoClickers + ' (' + ((autoClickers * (doubleClick ? 2 : 1) * (clickMultiplier ? 1.5 : 1)) / 5).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)) / 5)) + '/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 settings
|
||||
document.getElementById('notificationStatus').textContent = notificationsOn ? 'AN' : 'AUS';
|
||||
|
||||
// Check achievements
|
||||
checkAchievements();
|
||||
|
||||
// Save game
|
||||
saveGame();
|
||||
}
|
||||
|
||||
function showScoreChange(amount, isGolden = false) {
|
||||
const container = document.getElementById('score-container');
|
||||
const change = document.createElement('div');
|
||||
change.className = 'score-change';
|
||||
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 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;
|
||||
|
||||
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) {
|
||||
if (confirm(`Prestige durchführen? Du wirst deinen Fortschritt zurücksetzen, aber erhältst einen permanenten ${(0.5 + prestigeLevel * 0.1).toFixed(1)}x Multiplikator für alle Einkommen.`)) {
|
||||
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.`);
|
||||
}
|
||||
|
||||
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() {
|
||||
if (confirm("Bist du sicher, dass du ALLE Fortschritte zurücksetzen möchtest? Dies kann nicht rückgängig gemacht werden!")) {
|
||||
localStorage.removeItem("clickerSave");
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
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 - Geschwindigkeit abhängig von fastAutoClicker
|
||||
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;
|
||||
updateUI();
|
||||
}
|
||||
}, fastAutoClicker ? 3000 : 5000);
|
||||
|
||||
// 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);
|
||||
alert('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)}"e=${encodeURIComponent(text)}`;
|
||||
break;
|
||||
}
|
||||
|
||||
if (shareUrl) {
|
||||
window.open(shareUrl, '_blank', 'width=600,height=400');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user