Spaces:
Running
Running
| document.addEventListener('DOMContentLoaded', function() { | |
| // 檢查是否有玩家資料 | |
| const currentPlayerId = localStorage.getItem('currentPlayerId'); | |
| // 如果沒有玩家資料,重定向到首頁 | |
| if (!currentPlayerId) { | |
| alert('請先登入遊戲!'); | |
| window.location.href = 'index.html'; | |
| return; | |
| } | |
| // 檢查並顯示待處理的成就通知 | |
| if (window.achievementSystem) { | |
| const pendingAchievements = window.achievementSystem.getAndClearPendingAchievements(); | |
| if (pendingAchievements.length > 0) { | |
| console.log('發現待處理成就:', pendingAchievements); | |
| // 延遲顯示成就通知,確保頁面完全載入 | |
| setTimeout(() => { | |
| pendingAchievements.forEach(achievementId => { | |
| const achievement = window.achievementSystem.achievements.find(a => a.id === achievementId); | |
| if (achievement) { | |
| window.achievementSystem.showAchievementToast(achievement); | |
| } | |
| }); | |
| }, 1000); | |
| } | |
| } | |
| // 獲取DOM元素 | |
| const springLocation = document.getElementById('spring-location'); | |
| const valleyLocation = document.getElementById('valley-location'); | |
| const towerLocation = document.getElementById('tower-location'); | |
| const backToPrologueBtn = document.getElementById('back-to-prologue'); | |
| const achievementsBtn = document.getElementById('achievements-btn'); | |
| const springStars = document.getElementById('spring-stars').children; | |
| const valleyStars = document.getElementById('valley-stars').children; | |
| const towerStars = document.getElementById('tower-stars').children; | |
| const valleyLockMessage = document.getElementById('valley-lock-message'); | |
| const towerLockMessage = document.getElementById('tower-lock-message'); | |
| const bgmAudio = document.getElementById('bgm'); | |
| const toggleBgmBtn = document.getElementById('toggle-bgm'); | |
| // 音樂控制 | |
| let isBgmPlaying = false; | |
| // 播放背景音樂 | |
| function playBgm() { | |
| bgmAudio.volume = 0.3; // 設置音量 | |
| bgmAudio.play().catch(e => console.log('自動播放被阻止:', e)); | |
| isBgmPlaying = true; | |
| } | |
| // 嘗試自動播放背景音樂(大多數瀏覽器會阻止) | |
| playBgm(); | |
| // 音樂開關按鈕 | |
| toggleBgmBtn.addEventListener('click', function() { | |
| if (isBgmPlaying) { | |
| bgmAudio.pause(); | |
| isBgmPlaying = false; | |
| toggleBgmBtn.textContent = '音樂開'; | |
| } else { | |
| bgmAudio.play(); | |
| isBgmPlaying = true; | |
| toggleBgmBtn.textContent = '音樂關'; | |
| } | |
| }); | |
| // 獲取遊戲進度 | |
| const gameProgress = JSON.parse(localStorage.getItem(`gameProgress_${currentPlayerId}`)) || { | |
| completedTrials: { | |
| "平方之泉": { completed: false, score: 0, challengesCompleted: [false, false, false, false, false, false] }, | |
| "變換山谷": { completed: false, score: 0, challengesCompleted: [false, false, false, false, false, false] }, | |
| "展開之塔": { completed: false, score: 0, challengesCompleted: [false, false, false, false, false, false] } | |
| }, | |
| currentLocation: "王國地圖", | |
| lastSaved: new Date().toISOString() | |
| }; | |
| // 更新星級顯示 | |
| function updateStars() { | |
| // 平方之泉星級 | |
| const springCorrect = gameProgress.completedTrials["平方之泉"].challengesCompleted.filter(Boolean).length; | |
| updateLocationStars(springStars, springCorrect); | |
| // 變換山谷星級 | |
| const valleyCorrect = gameProgress.completedTrials["變換山谷"].challengesCompleted.filter(Boolean).length; | |
| updateLocationStars(valleyStars, valleyCorrect); | |
| // 展開之塔星級 | |
| const towerCorrect = gameProgress.completedTrials["展開之塔"].challengesCompleted.filter(Boolean).length; | |
| updateLocationStars(towerStars, towerCorrect); | |
| } | |
| // 更新特定位置的星級 | |
| function updateLocationStars(starsElements, correctCount) { | |
| // 根據答對題數顯示星星 | |
| // 6題全對 = 3星, 5題對 = 2星, 4題對 = 1星, 少於4題 = 0星 | |
| let earnedStars = 0; | |
| if (correctCount >= 6) earnedStars = 3; | |
| else if (correctCount >= 5) earnedStars = 2; | |
| else if (correctCount >= 4) earnedStars = 1; | |
| // 更新星星顯示 | |
| for (let i = 0; i < starsElements.length; i++) { | |
| if (i < earnedStars) { | |
| starsElements[i].classList.add('earned'); | |
| } else { | |
| starsElements[i].classList.remove('earned'); | |
| } | |
| } | |
| return earnedStars; | |
| } | |
| // 更新解鎖狀態 | |
| function updateLockStatus() { | |
| // 檢查平方之泉是否完成(至少4題正確) | |
| const springCorrect = gameProgress.completedTrials["平方之泉"].challengesCompleted.filter(Boolean).length; | |
| const springCompleted = springCorrect >= 4; | |
| // 檢查變換山谷是否完成(至少4題正確) | |
| const valleyCorrect = gameProgress.completedTrials["變換山谷"].challengesCompleted.filter(Boolean).length; | |
| const valleyCompleted = valleyCorrect >= 4; | |
| // 更新變換山谷解鎖狀態 | |
| if (springCompleted) { | |
| valleyLocation.classList.remove('locked'); | |
| valleyLockMessage.style.display = 'none'; | |
| } else { | |
| valleyLocation.classList.add('locked'); | |
| valleyLockMessage.style.display = 'block'; | |
| } | |
| // 更新展開之塔解鎖狀態 | |
| if (springCompleted && valleyCompleted) { | |
| towerLocation.classList.remove('locked'); | |
| towerLockMessage.style.display = 'none'; | |
| } else { | |
| towerLocation.classList.add('locked'); | |
| towerLockMessage.style.display = 'block'; | |
| // 更新鎖定訊息 | |
| if (!springCompleted) { | |
| towerLockMessage.textContent = '需先完成平方之泉與變換山谷試煉'; | |
| } else { | |
| towerLockMessage.textContent = '需先完成變換山谷試煉'; | |
| } | |
| } | |
| } | |
| // 初始化頁面 | |
| updateStars(); | |
| updateLockStatus(); | |
| // 整個卡片區域點擊事件 - 平方之泉 | |
| springLocation.addEventListener('click', function() { | |
| window.location.href = 'spring.html'; | |
| }); | |
| // 整個卡片區域點擊事件 - 變換山谷 | |
| valleyLocation.addEventListener('click', function() { | |
| // 檢查是否已解鎖 | |
| const springCorrect = gameProgress.completedTrials["平方之泉"].challengesCompleted.filter(Boolean).length; | |
| const springCompleted = springCorrect >= 4; | |
| if (springCompleted) { | |
| window.location.href = 'valley.html'; | |
| } else { | |
| alert('需先完成平方之泉試煉才能進入變換山谷!'); | |
| } | |
| }); | |
| // 整個卡片區域點擊事件 - 展開之塔 | |
| towerLocation.addEventListener('click', function() { | |
| // 檢查是否已解鎖 | |
| const springCorrect = gameProgress.completedTrials["平方之泉"].challengesCompleted.filter(Boolean).length; | |
| const springCompleted = springCorrect >= 4; | |
| const valleyCorrect = gameProgress.completedTrials["變換山谷"].challengesCompleted.filter(Boolean).length; | |
| const valleyCompleted = valleyCorrect >= 4; | |
| if (springCompleted && valleyCompleted) { | |
| window.location.href = 'tower.html'; | |
| } else { | |
| if (!springCompleted) { | |
| alert('需先完成平方之泉與變換山谷試煉才能進入展開之塔!'); | |
| } else { | |
| alert('需先完成變換山谷試煉才能進入展開之塔!'); | |
| } | |
| } | |
| }); | |
| // 返回序章按鈕點擊事件 | |
| backToPrologueBtn.addEventListener('click', function() { | |
| window.location.href = 'prologue.html'; | |
| }); | |
| // 成就圖鑑按鈕點擊事件 | |
| if (achievementsBtn) { | |
| achievementsBtn.addEventListener('click', function() { | |
| window.location.href = 'achievements.html'; | |
| }); | |
| } | |
| // 為星星添加動畫效果 | |
| function initializeStarAnimations() { | |
| // 獲取所有已獲得的星星 | |
| const earnedStars = document.querySelectorAll('.star.earned'); | |
| // 為每個已獲得的星星設置隨機延遲的動畫 | |
| earnedStars.forEach((star, index) => { | |
| // 設置隨機延遲,使星星不同步閃爍 | |
| const randomDelay = Math.random() * 2; // 0-2秒的隨機延遲 | |
| star.style.animationDelay = `${randomDelay}s`; | |
| // 添加微小的旋轉效果 | |
| const randomRotation = (Math.random() - 0.5) * 10; // -5到5度的隨機旋轉 | |
| star.style.transform = `rotate(${randomRotation}deg)`; | |
| }); | |
| } | |
| // 初始化星星動畫 | |
| initializeStarAnimations(); | |
| // 檢查成就 | |
| if (window.achievementSystem) { | |
| // 構建遊戲狀態 | |
| const gameState = { | |
| // 基本信息 | |
| loginCount: parseInt(localStorage.getItem('loginCount') || '1'), | |
| prologueCompleted: true, | |
| // 試煉相關 | |
| visitedTrials: ['平方之泉'], | |
| completedTrials: {}, | |
| // 其他統計 | |
| maxCorrectStreak: 0, | |
| fastestTrialTime: 999, | |
| fastestQuestionTime: 999, | |
| retriesAfterFailure: 0, | |
| lastTrialCompletionTime: new Date(), | |
| lastTrialStartTime: new Date(), | |
| // 特殊條件 | |
| allThreeStarsSameDay: false, | |
| firstAttemptAllThreeStars: false, | |
| musicEnabledAllTrials: localStorage.getItem('musicPlaying') === 'true', | |
| musicDisabledAllTrials: localStorage.getItem('musicPlaying') === 'false' | |
| }; | |
| // 填充試煉相關數據 | |
| if (gameProgress.completedTrials) { | |
| for (const [trialName, trialData] of Object.entries(gameProgress.completedTrials)) { | |
| const correctCount = trialData.challengesCompleted.filter(Boolean).length; | |
| if (correctCount > 0) { | |
| if (!gameState.visitedTrials.includes(trialName)) { | |
| gameState.visitedTrials.push(trialName); | |
| } | |
| gameState.completedTrials[trialName] = { | |
| completed: correctCount >= 4, | |
| stars: correctCount >= 6 ? 3 : (correctCount >= 5 ? 2 : (correctCount >= 4 ? 1 : 0)), | |
| noErrors: correctCount === 6 | |
| }; | |
| } | |
| } | |
| } | |
| // 檢查成就 | |
| window.achievementSystem.checkAllAchievements(gameState); | |
| } | |
| }); | |