/**
* 成就系統整合範例
*
* 此文件提供如何在遊戲主頁中整合成就系統按鈕的範例代碼
*/
// 在遊戲主頁添加成就按鈕的範例
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();
}