diff --git a/achievements.js b/achievements.js index a60f93d..9e793e9 100644 --- a/achievements.js +++ b/achievements.js @@ -105,35 +105,126 @@ function hideAchievements() { } } +// Doom-style cheat code toggle +const CHEAT_CODE = 'IDKFA'; +let cheatCodeIndex = 0; +let cheatCodeTimer; + // Initialize achievements function initializeAchievements() { // Check if achievements were enabled before achievementsEnabled = JSON.parse(localStorage.getItem('achievementsEnabled') || 'false'); - // Add hidden toggle button - const hiddenToggle = document.createElement('button'); - hiddenToggle.className = 'hidden'; - hiddenToggle.style.cssText = ` - position: fixed; - bottom: -100px; - right: -100px; - width: 50px; - height: 50px; - background: transparent; - border: none; - cursor: pointer; - transition: transform 0.3s; - `; + // Initialize particle effects + const particleContainer = document.getElementById('particleContainer'); + let particles = []; - hiddenToggle.onclick = () => { - toggleAchievements(); - hiddenToggle.style.transform = 'translate(-50px, -50px)'; - setTimeout(() => { - hiddenToggle.style.transform = ''; - }, 1000); - }; + function createParticle() { + const particle = document.createElement('div'); + particle.className = 'particle'; + + // Random position + particle.style.left = Math.random() * 100 + 'vw'; + particle.style.top = Math.random() * 100 + 'vh'; + + // Random size + const size = Math.random() * 2 + 2; + particle.style.width = size + 'px'; + particle.style.height = size + 'px'; + + // Random color + const colors = ['#4a6cf7', '#6355f7', '#3a56d4', '#2839b0']; + particle.style.background = colors[Math.floor(Math.random() * colors.length)]; + + particleContainer.appendChild(particle); + particles.push(particle); + } - document.body.appendChild(hiddenToggle); + // Create initial particles + for (let i = 0; i < 50; i++) { + createParticle(); + } + + // Add cheat code input listener + document.addEventListener('keydown', (e) => { + // Reset timer if no key was pressed in 2 seconds + if (cheatCodeTimer) { + clearTimeout(cheatCodeTimer); + } + + cheatCodeTimer = setTimeout(() => { + cheatCodeIndex = 0; + }, 2000); + + // Check if key matches current position in cheat code + if (e.key.toUpperCase() === CHEAT_CODE[cheatCodeIndex]) { + cheatCodeIndex++; + + // If complete code entered + if (cheatCodeIndex === CHEAT_CODE.length) { + // Show achievement unlocked animation + const achievementToast = document.createElement('div'); + achievementToast.className = 'fixed bottom-4 right-4 bg-white rounded-lg shadow-lg p-4 w-64 flex items-center text-green-500'; + achievementToast.innerHTML = ` +
+

Achievement Unlocked!

+

"IDKFA" cheat code activated

+
+ + `; + document.body.appendChild(achievementToast); + + // Play achievement sound + const audio = new Audio('https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3'); + audio.play(); + + // Create burst of particles + for (let i = 0; i < 20; i++) { + createParticle(); + } + + // Enable achievements + toggleAchievements(); + + // Reset cheat code + cheatCodeIndex = 0; + + // Remove achievement toast after 3 seconds + setTimeout(() => { + achievementToast.remove(); + }, 3000); + } + } else { + // Reset cheat code if wrong key pressed + cheatCodeIndex = 0; + } + }); + + // Update progress bars + async function updateProgressBars() { + try { + const response = await fetch('/api/visitor-stats'); + const stats = await response.json(); + + // Calculate progress for each achievement + const achievements = Object.values(ACHIEVEMENTS); + + achievements.forEach((achievement, index) => { + if (achievement.period === "monthly") { + const progress = Math.min((stats.monthly_visits / achievement.threshold) * 100, 100); + const progressBar = document.getElementById(`achievement${index + 1}Progress`); + if (progressBar) { + progressBar.style.width = `${progress}%`; + } + } + }); + } catch (error) { + console.error('Error updating progress bars:', error); + } + } + + // Update progress bars every 5 seconds + setInterval(updateProgressBars, 5000); // Check achievements when enabled if (achievementsEnabled) { diff --git a/index.html b/index.html index 134c108..6d61f90 100644 --- a/index.html +++ b/index.html @@ -17,22 +17,31 @@ /* Achievements styles */ #achievementsDisplay { - position: fixed; - top: 10px; - right: 10px; - background: white; - padding: 1rem; - border-radius: 0.5rem; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + width: 100%; + max-width: 1200px; + margin: 0 auto; + background: rgba(255, 255, 255, 0.95); + padding: 2rem; + border-radius: 20px; + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.1); display: none; - z-index: 1000; + margin-bottom: 2rem; } .achievement-item { display: flex; align-items: center; - padding: 0.5rem; - border-bottom: 1px solid #eee; + padding: 1.5rem; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + transition: all 0.3s ease; + cursor: pointer; + } + + .achievement-item:hover { + background: rgba(255, 255, 255, 0.1); + transform: translateX(10px); } .achievement-item:last-child { @@ -40,8 +49,85 @@ } .achievement-icon { + font-size: 2rem; + margin-right: 1.5rem; + animation: float 3s ease-in-out infinite; + } + + .achievement-content { + flex: 1; + } + + .achievement-title { font-size: 1.5rem; - margin-right: 0.75rem; + font-weight: bold; + margin-bottom: 0.5rem; + } + + .achievement-description { + color: #666; + font-size: 0.9rem; + } + + .achievement-progress { + width: 100%; + height: 4px; + background: #eee; + border-radius: 2px; + margin-top: 1rem; + overflow: hidden; + } + + .achievement-progress-bar { + height: 100%; + background: linear-gradient(90deg, #4a6cf7, #6355f7); + width: 0; + transition: width 0.5s ease; + } + + @keyframes float { + 0% { + transform: translateY(0px); + } + 50% { + transform: translateY(-10px); + } + 100% { + transform: translateY(0px); + } + } + + /* Particle effects */ + .particle-container { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + } + + .particle { + position: absolute; + width: 4px; + height: 4px; + background: rgba(255, 255, 255, 0.8); + border-radius: 50%; + animation: particle 2s infinite; + } + + @keyframes particle { + 0% { + transform: translateY(0) translateX(0) scale(1); + opacity: 0; + } + 50% { + opacity: 1; + } + 100% { + transform: translateY(100vh) translateX(100vw) scale(0); + opacity: 0; + } } + +
+
-
-

Nováček

-

První návštěva na portálu

+
+

Nováček

+

První návštěva na portálu

+
+
+
-
-

Pravidelný návštěvník

-

10 návštěv za měsíc

+
+

Pravidelný návštěvník

+

10 návštěv za měsíc

+
+
+
-
-

Power User

-

50 návštěv za měsíc

+
+

Power User

+

50 návštěv za měsíc

+
+
+
-
-

Super Fan

-

100 návštěv za měsíc

+
+

Super Fan

+

100 návštěv za měsíc

+
+
+