math-kingdom-game / achievements.html
Lashtw's picture
Upload 42 files
d201b77 verified
<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>數學魔法王國:成就系統</title>
<style>
:root {
--primary-color: #ff8c00;
--secondary-color: #ffa500;
--dark-bg: rgba(0, 0, 0, 0.7);
--light-text: #ffffff;
--journey-color: #4e9af1;
--trial-color: #f1c232;
--secret-color: #9c59b6;
--locked-color: #888888;
--card-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
--toast-bg: rgba(0, 0, 0, 0.85);
}
body {
font-family: 'Arial', sans-serif;
background-image: url('palace.jpg');
background-size: cover;
background-position: center;
background-attachment: fixed;
margin: 0;
padding: 0;
color: var(--light-text);
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.achievements-header {
text-align: center;
margin-bottom: 30px;
background-color: var(--dark-bg);
border-radius: 15px;
padding: 20px;
border: 2px solid var(--primary-color);
box-shadow: var(--card-shadow);
}
.achievements-title {
color: var(--secondary-color);
font-size: 2.5rem;
margin-bottom: 10px;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
}
.achievements-stats {
font-size: 1.2rem;
margin-bottom: 20px;
}
.tab-container {
display: flex;
justify-content: center;
margin-bottom: 20px;
}
.tab-button {
background-color: var(--dark-bg);
color: var(--light-text);
border: 2px solid var(--primary-color);
border-radius: 10px;
padding: 10px 20px;
margin: 0 10px;
font-size: 1.1rem;
cursor: pointer;
transition: all 0.3s;
}
.tab-button:hover {
background-color: rgba(255, 140, 0, 0.3);
transform: translateY(-3px);
}
.tab-button.active {
background-color: var(--primary-color);
box-shadow: 0 0 15px rgba(255, 140, 0, 0.5);
}
.tab-button[data-type="journey"].active {
background-color: var(--journey-color);
border-color: var(--journey-color);
}
.tab-button[data-type="trial"].active {
background-color: var(--trial-color);
border-color: var(--trial-color);
}
.tab-button[data-type="secret"].active {
background-color: var(--secret-color);
border-color: var(--secret-color);
}
.achievements-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 20px;
margin-top: 30px;
}
.achievement-card {
background-color: var(--dark-bg);
border-radius: 10px;
padding: 20px;
transition: all 0.3s;
border: 2px solid var(--primary-color);
box-shadow: var(--card-shadow);
position: relative;
overflow: hidden;
}
.achievement-card.journey {
border-color: var(--journey-color);
}
.achievement-card.trial {
border-color: var(--trial-color);
}
.achievement-card.secret {
border-color: var(--secret-color);
}
.achievement-card.locked {
filter: grayscale(100%);
opacity: 0.7;
border-color: var(--locked-color);
}
.achievement-icon {
font-size: 2rem;
margin-bottom: 10px;
text-align: center;
}
.achievement-title {
font-size: 1.3rem;
margin-bottom: 10px;
color: var(--secondary-color);
text-align: center;
}
.achievement-description {
font-size: 1rem;
margin-bottom: 15px;
line-height: 1.4;
}
.achievement-unlock-time {
font-size: 0.9rem;
color: rgba(255, 255, 255, 0.7);
text-align: right;
font-style: italic;
}
.lock-icon {
position: absolute;
top: 10px;
right: 10px;
font-size: 1.5rem;
color: var(--locked-color);
}
/* 成就解鎖彈窗通知 */
.toast-container {
position: fixed;
top: 20px;
right: 20px;
z-index: 1000;
display: flex;
flex-direction: column;
gap: 10px;
max-width: 350px;
}
.toast {
background-color: var(--toast-bg);
color: var(--light-text);
border-radius: 10px;
padding: 15px;
margin-bottom: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
display: flex;
align-items: center;
animation: fadeInOut 5s forwards;
border-left: 4px solid var(--primary-color);
}
.toast.journey {
border-left-color: var(--journey-color);
}
.toast.trial {
border-left-color: var(--trial-color);
}
.toast.secret {
border-left-color: var(--secret-color);
}
.toast-icon {
font-size: 2rem;
margin-right: 15px;
}
.toast-content {
flex: 1;
}
.toast-title {
font-weight: bold;
margin-bottom: 5px;
color: var(--secondary-color);
}
@keyframes fadeInOut {
0% { opacity: 0; transform: translateX(50px); }
10% { opacity: 1; transform: translateX(0); }
90% { opacity: 1; transform: translateX(0); }
100% { opacity: 0; transform: translateX(50px); }
}
/* 響應式設計 */
@media (max-width: 768px) {
.achievements-grid {
grid-template-columns: 1fr;
}
.tab-container {
flex-direction: column;
align-items: center;
gap: 10px;
}
.tab-button {
width: 80%;
margin: 5px 0;
}
.toast-container {
max-width: 90%;
right: 5%;
}
}
/* 返回按鈕 */
.back-button {
background-color: var(--dark-bg);
color: var(--light-text);
border: 2px solid var(--primary-color);
border-radius: 10px;
padding: 10px 20px;
font-size: 1.1rem;
cursor: pointer;
transition: all 0.3s;
display: block;
margin: 20px auto;
width: fit-content;
}
.back-button:hover {
background-color: rgba(255, 140, 0, 0.3);
transform: translateY(-3px);
}
</style>
</head>
<body>
<div class="container">
<div class="achievements-header">
<h1 class="achievements-title">數學魔法王國:成就圖鑑</h1>
<div class="achievements-stats" id="achievements-stats">
已解鎖成就:0 / 0
</div>
<div class="tab-container">
<button class="tab-button active" data-type="all">全部成就</button>
<button class="tab-button" data-type="journey">魔力足跡</button>
<button class="tab-button" data-type="trial">試煉之魂</button>
<button class="tab-button" data-type="secret">隱藏彩蛋</button>
</div>
</div>
<div class="achievements-grid" id="achievements-grid">
<!-- 成就卡片將由 JavaScript 動態生成 -->
</div>
<!-- 直接使用a標籤硬編碼返回王國地圖 -->
<a href="kingdom_map.html" class="back-button">返回遊戲</a>
</div>
<div class="toast-container" id="toast-container">
<!-- 成就解鎖通知將由 JavaScript 動態生成 -->
</div>
<script src="achievements.js"></script>
<script>
// 等待成就系統載入完成後再顯示成就
document.addEventListener('DOMContentLoaded', function() {
// 等待成就系統初始化
const waitForAchievementSystem = () => {
if (window.achievementSystem && window.achievementSystem.achievements.length > 0) {
displayAchievements();
setupTabButtons();
} else {
setTimeout(waitForAchievementSystem, 100);
}
};
setTimeout(waitForAchievementSystem, 500);
});
function setupTabButtons() {
const tabButtons = document.querySelectorAll('.tab-button');
tabButtons.forEach(button => {
button.addEventListener('click', function() {
// 移除所有按鈕的 active 類
tabButtons.forEach(btn => btn.classList.remove('active'));
// 添加 active 類到當前按鈕
this.classList.add('active');
// 根據選擇的類型過濾成就
const selectedType = this.getAttribute('data-type');
filterAchievements(selectedType);
});
});
}
function filterAchievements(type) {
const achievementSystem = window.achievementSystem;
const achievementsContainer = document.getElementById('achievements-grid');
// 清空容器
achievementsContainer.innerHTML = '';
// 過濾成就
let filteredAchievements;
if (type === 'all') {
filteredAchievements = achievementSystem.achievements;
} else {
filteredAchievements = achievementSystem.achievements.filter(achievement =>
achievement.type === type
);
}
// 顯示過濾後的成就
filteredAchievements.forEach(achievement => {
const isUnlocked = achievementSystem.isAchievementUnlocked(achievement.id);
const achievementCard = createAchievementCard(achievement, isUnlocked);
achievementsContainer.appendChild(achievementCard);
});
}
function displayAchievements() {
const achievementSystem = window.achievementSystem;
if (!achievementSystem) {
console.error('成就系統未載入');
return;
}
const achievementsContainer = document.getElementById('achievements-grid');
if (!achievementsContainer) {
console.error('找不到成就容器');
return;
}
// 清空容器
achievementsContainer.innerHTML = '';
// 顯示成就
achievementSystem.achievements.forEach(achievement => {
const isUnlocked = achievementSystem.isAchievementUnlocked(achievement.id);
const achievementCard = createAchievementCard(achievement, isUnlocked);
achievementsContainer.appendChild(achievementCard);
});
// 更新統計
updateAchievementStats();
}
function createAchievementCard(achievement, isUnlocked) {
const card = document.createElement('div');
card.className = `achievement-card ${achievement.type || achievement.category || 'default'} ${isUnlocked ? 'unlocked' : 'locked'}`;
const icon = getAchievementIcon(achievement.type || achievement.category);
// 根據成就類型決定是否顯示名稱和描述
let title, description;
if (achievement.type === 'secret' && !isUnlocked) {
// 隱藏彩蛋未解鎖時不顯示名稱和描述
title = '???';
description = '尚未解鎖';
} else {
// 魔力足跡和試煉之魂始終顯示名稱和描述
title = achievement.title;
description = achievement.description;
}
card.innerHTML = `
<div class="achievement-icon">${icon}</div>
<div class="achievement-content">
<h3 class="achievement-title">${title}</h3>
<p class="achievement-description">${description}</p>
${isUnlocked ? `<div class="achievement-date">解鎖時間:${formatDate(window.achievementSystem.userAchievements[achievement.id]?.unlockedAt)}</div>` : ''}
</div>
<div class="achievement-status">
${isUnlocked ? '<span class="status-unlocked">✓</span>' : '<span class="status-locked">🔒</span>'}
</div>
`;
return card;
}
function getAchievementIcon(type) {
switch (type) {
case 'journey': return '🌟';
case 'trial': return '⚔️';
case 'secret': return '🔮';
default: return '🏆';
}
}
function formatDate(dateString) {
if (!dateString) return '未知';
const date = new Date(dateString);
return date.toLocaleDateString('zh-TW');
}
function updateAchievementStats() {
const achievementSystem = window.achievementSystem;
const unlockedCount = achievementSystem.getUnlockedCount();
const totalCount = achievementSystem.getTotalCount();
const statsElement = document.querySelector('.achievements-stats');
if (statsElement) {
statsElement.textContent = `已解鎖:${unlockedCount}/${totalCount}`;
}
}
</script>
</body>
</html>