/** * 成就系統整合範例 * * 此文件提供如何在遊戲主頁中整合成就系統按鈕的範例代碼 */ // 在遊戲主頁添加成就按鈕的範例 document.addEventListener('DOMContentLoaded', function() { // 檢查是否在主頁 if (document.querySelector('.main-menu') || document.getElementById('main-menu')) { // 創建成就按鈕 const achievementButton = document.createElement('button'); achievementButton.className = 'menu-button achievement-button'; achievementButton.innerHTML = ` 🏆 成就圖鑑 `; // 添加點擊事件 achievementButton.addEventListener('click', function() { window.location.href = 'achievements.html'; }); // 找到合適的位置插入按鈕 const menuContainer = document.querySelector('.main-menu') || document.getElementById('main-menu'); if (menuContainer) { menuContainer.appendChild(achievementButton); } // 添加按鈕樣式 const style = document.createElement('style'); style.textContent = ` .achievement-button { background-color: rgba(0, 0, 0, 0.7); color: #ffffff; border: 2px solid #ff8c00; border-radius: 10px; padding: 10px 20px; margin: 10px; font-size: 1.1rem; cursor: pointer; transition: all 0.3s; display: flex; align-items: center; justify-content: center; } .achievement-button:hover { background-color: rgba(255, 140, 0, 0.3); transform: translateY(-3px); } .button-icon { font-size: 1.5rem; margin-right: 10px; } `; document.head.appendChild(style); } // 初始化成就系統 initAchievementSystem(); }); // 初始化成就系統 function initAchievementSystem() { // 如果成就系統尚未初始化 if (!window.achievementSystem) { // 檢查是否已加載成就系統腳本 if (!document.querySelector('script[src="achievements.js"]')) { // 動態加載成就系統腳本 const script = document.createElement('script'); script.src = 'achievements.js'; script.onload = function() { console.log('成就系統腳本加載完成'); // 腳本會自動初始化成就系統 }; document.head.appendChild(script); } } } // 遊戲狀態更新時檢查成就的範例 function checkAchievementsOnGameUpdate() { // 確保成就系統已初始化 if (window.achievementSystem) { // 構建當前遊戲狀態 const gameState = buildCurrentGameState(); // 檢查成就 window.achievementSystem.checkAllAchievements(gameState); } } // 構建當前遊戲狀態的範例 function buildCurrentGameState() { // 這裡應該從遊戲中獲取實際數據 // 以下僅為示例 // 從localStorage獲取遊戲數據 const gameData = JSON.parse(localStorage.getItem('gameData') || '{}'); return { // 基本信息 loginCount: gameData.loginCount || 0, prologueCompleted: gameData.prologueCompleted || false, // 試煉相關 visitedTrials: gameData.visitedTrials || [], completedTrials: gameData.completedTrials || { '平方之泉': { completed: false, stars: 0, noErrors: false }, '變換山谷': { completed: false, stars: 0, noErrors: false }, '展開之塔': { completed: false, stars: 0, noErrors: false } }, // 統計數據 maxCorrectStreak: gameData.maxCorrectStreak || 0, fastestTrialTime: gameData.fastestTrialTime || 999, fastestQuestionTime: gameData.fastestQuestionTime || 999, retriesAfterFailure: gameData.retriesAfterFailure || 0, lastTrialCompletionTime: gameData.lastTrialCompletionTime ? new Date(gameData.lastTrialCompletionTime) : null, lastTrialStartTime: gameData.lastTrialStartTime ? new Date(gameData.lastTrialStartTime) : null, // 特殊條件 allThreeStarsSameDay: gameData.allThreeStarsSameDay || false, firstAttemptAllThreeStars: gameData.firstAttemptAllThreeStars || false, musicEnabledAllTrials: gameData.musicEnabledAllTrials || false, musicDisabledAllTrials: gameData.musicDisabledAllTrials || false }; } // 在關卡完成時更新遊戲狀態並檢查成就的範例 function onTrialCompleted(trialName, stars, errors, completionTime) { // 獲取當前遊戲數據 const gameData = JSON.parse(localStorage.getItem('gameData') || '{}'); // 初始化試煉數據結構(如果不存在) if (!gameData.completedTrials) { gameData.completedTrials = {}; } // 初始化已訪問試煉列表(如果不存在) if (!gameData.visitedTrials) { gameData.visitedTrials = []; } // 添加到已訪問試煉列表(如果尚未添加) if (!gameData.visitedTrials.includes(trialName)) { gameData.visitedTrials.push(trialName); } // 更新試煉完成數據 gameData.completedTrials[trialName] = { completed: true, stars: Math.max(stars, gameData.completedTrials[trialName]?.stars || 0), // 保留最高星數 noErrors: errors === 0 || gameData.completedTrials[trialName]?.noErrors || false }; // 更新其他統計數據 gameData.lastTrialCompletionTime = new Date().toISOString(); // 更新最快完成時間(如果適用) if (!gameData.fastestTrialTime || completionTime < gameData.fastestTrialTime) { gameData.fastestTrialTime = completionTime; } // 檢查是否在同一天獲得所有三星 const today = new Date().toDateString(); const allThreeStarsToday = gameData.completedTrials['平方之泉']?.stars === 3 && gameData.completedTrials['變換山谷']?.stars === 3 && gameData.completedTrials['展開之塔']?.stars === 3 && new Date(gameData.completedTrials['平方之泉']?.lastCompletionTime || 0).toDateString() === today && new Date(gameData.completedTrials['變換山谷']?.lastCompletionTime || 0).toDateString() === today && new Date(gameData.completedTrials['展開之塔']?.lastCompletionTime || 0).toDateString() === today; if (allThreeStarsToday) { gameData.allThreeStarsSameDay = true; } // 儲存更新後的遊戲數據 localStorage.setItem('gameData', JSON.stringify(gameData)); // 檢查成就 checkAchievementsOnGameUpdate(); } // 在開始試煉時記錄時間的範例 function onTrialStarted(trialName) { // 獲取當前遊戲數據 const gameData = JSON.parse(localStorage.getItem('gameData') || '{}'); // 記錄試煉開始時間 gameData.lastTrialStartTime = new Date().toISOString(); // 初始化已訪問試煉列表(如果不存在) if (!gameData.visitedTrials) { gameData.visitedTrials = []; } // 添加到已訪問試煉列表(如果尚未添加) if (!gameData.visitedTrials.includes(trialName)) { gameData.visitedTrials.push(trialName); } // 儲存更新後的遊戲數據 localStorage.setItem('gameData', JSON.stringify(gameData)); // 檢查成就 checkAchievementsOnGameUpdate(); } // 在登入時更新登入次數並檢查成就的範例 function onLogin() { // 獲取當前遊戲數據 const gameData = JSON.parse(localStorage.getItem('gameData') || '{}'); // 更新登入次數 gameData.loginCount = (gameData.loginCount || 0) + 1; // 檢查連續登入 const lastLoginDate = gameData.lastLoginDate ? new Date(gameData.lastLoginDate) : null; const today = new Date(); if (lastLoginDate) { // 計算日期差異 const timeDiff = today.getTime() - lastLoginDate.getTime(); const dayDiff = Math.floor(timeDiff / (1000 * 3600 * 24)); if (dayDiff === 1) { // 連續登入 gameData.consecutiveLoginDays = (gameData.consecutiveLoginDays || 0) + 1; } else if (dayDiff > 1) { // 中斷連續登入 gameData.consecutiveLoginDays = 1; } } else { // 首次登入 gameData.consecutiveLoginDays = 1; } // 更新最後登入日期 gameData.lastLoginDate = today.toISOString(); // 儲存更新後的遊戲數據 localStorage.setItem('gameData', JSON.stringify(gameData)); // 檢查成就 checkAchievementsOnGameUpdate(); } // 在音樂設置變更時更新狀態並檢查成就的範例 function onMusicSettingChanged(trialName, enabled) { // 獲取當前遊戲數據 const gameData = JSON.parse(localStorage.getItem('gameData') || '{}'); // 初始化音樂設置(如果不存在) if (!gameData.musicSettings) { gameData.musicSettings = {}; } // 更新音樂設置 gameData.musicSettings[trialName] = enabled; // 檢查是否所有試煉都啟用/禁用音樂 const allTrials = ['平方之泉', '變換山谷', '展開之塔']; const allEnabled = allTrials.every(trial => gameData.musicSettings[trial] === true); const allDisabled = allTrials.every(trial => gameData.musicSettings[trial] === false); gameData.musicEnabledAllTrials = allEnabled; gameData.musicDisabledAllTrials = allDisabled; // 儲存更新後的遊戲數據 localStorage.setItem('gameData', JSON.stringify(gameData)); // 檢查成就 checkAchievementsOnGameUpdate(); } // 在答題時更新連擊數並檢查成就的範例 function onQuestionAnswered(correct, answerTime) { // 獲取當前遊戲數據 const gameData = JSON.parse(localStorage.getItem('gameData') || '{}'); // 更新連擊數 if (correct) { gameData.currentCorrectStreak = (gameData.currentCorrectStreak || 0) + 1; // 更新最大連擊數 if (!gameData.maxCorrectStreak || gameData.currentCorrectStreak > gameData.maxCorrectStreak) { gameData.maxCorrectStreak = gameData.currentCorrectStreak; } // 更新最快答題時間 if (!gameData.fastestQuestionTime || answerTime < gameData.fastestQuestionTime) { gameData.fastestQuestionTime = answerTime; } } else { // 重置連擊數 gameData.currentCorrectStreak = 0; } // 儲存更新後的遊戲數據 localStorage.setItem('gameData', JSON.stringify(gameData)); // 檢查成就 checkAchievementsOnGameUpdate(); } // 在試煉失敗後重試時更新統計並檢查成就的範例 function onRetryAfterFailure(trialName) { // 獲取當前遊戲數據 const gameData = JSON.parse(localStorage.getItem('gameData') || '{}'); // 初始化重試計數(如果不存在) if (!gameData.trialRetries) { gameData.trialRetries = {}; } // 更新重試計數 gameData.trialRetries[trialName] = (gameData.trialRetries[trialName] || 0) + 1; // 更新總重試次數 gameData.retriesAfterFailure = (gameData.retriesAfterFailure || 0) + 1; // 儲存更新後的遊戲數據 localStorage.setItem('gameData', JSON.stringify(gameData)); // 檢查成就 checkAchievementsOnGameUpdate(); }