Files
novafarma/src/systems/LandmarkQuestSystem.js

354 lines
12 KiB
JavaScript

/**
* 📜 LANDMARK QUEST SYSTEM
* Quest system integrated with landmarks and structures
* - Main quest: Visit all 5 landmarks
* - Side quests from NPCs
* - Exploration rewards
* - Quest tracking
*/
class LandmarkQuestSystem {
constructor(scene) {
this.scene = scene;
// Active quests
this.activeQuests = [];
// Completed quests
this.completedQuests = [];
// Quest definitions
this.quests = {
// Main quest chain
'main_explore_landmarks': {
id: 'main_explore_landmarks',
name: 'The Five Landmarks',
description: 'Discover all 5 legendary landmarks across the world',
type: 'main',
objectives: [
{ type: 'visit_landmark', target: 'ancient_temple', name: 'Visit Ancient Temple', completed: false },
{ type: 'visit_landmark', target: 'great_pyramid', name: 'Visit Great Pyramid', completed: false },
{ type: 'visit_landmark', target: 'mountain_peak', name: 'Reach Mountain Peak', completed: false },
{ type: 'visit_landmark', target: 'abandoned_city', name: 'Explore Abandoned City', completed: false },
{ type: 'visit_landmark', target: 'dragon_skeleton', name: 'Find Dragon Skeleton', completed: false }
],
rewards: {
gold: 5000,
xp: 10000,
item: 'legendary_compass'
}
},
// Biome exploration quests
'explore_grassland': {
id: 'explore_grassland',
name: 'Grassland Explorer',
description: 'Visit 10 structures in Grassland biome',
type: 'side',
objectives: [
{ type: 'visit_structures', biome: 'Grassland', count: 0, target: 10, completed: false }
],
rewards: { gold: 500, xp: 1000 }
},
'explore_forest': {
id: 'explore_forest',
name: 'Forest Wanderer',
description: 'Visit 10 structures in Forest biome',
type: 'side',
objectives: [
{ type: 'visit_structures', biome: 'Forest', count: 0, target: 10, completed: false }
],
rewards: { gold: 500, xp: 1000 }
},
'explore_desert': {
id: 'explore_desert',
name: 'Desert Nomad',
description: 'Visit 5 structures in Desert biome',
type: 'side',
objectives: [
{ type: 'visit_structures', biome: 'Desert', count: 0, target: 5, completed: false }
],
rewards: { gold: 750, xp: 1500 }
},
'explore_mountain': {
id: 'explore_mountain',
name: 'Mountain Climber',
description: 'Visit 5 structures in Mountain biome',
type: 'side',
objectives: [
{ type: 'visit_structures', biome: 'Mountain', count: 0, target: 5, completed: false }
],
rewards: { gold: 750, xp: 1500 }
},
'explore_swamp': {
id: 'explore_swamp',
name: 'Swamp Explorer',
description: 'Visit 5 structures in Swamp biome',
type: 'side',
objectives: [
{ type: 'visit_structures', biome: 'Swamp', count: 0, target: 5, completed: false }
],
rewards: { gold: 750, xp: 1500 }
},
// Enemy quests
'slay_enemies': {
id: 'slay_enemies',
name: 'Monster Hunter',
description: 'Defeat 20 enemies',
type: 'side',
objectives: [
{ type: 'kill_enemies', count: 0, target: 20, completed: false }
],
rewards: { gold: 1000, xp: 2000 }
},
// Collection quest
'treasure_hunter': {
id: 'treasure_hunter',
name: 'Treasure Hunter',
description: 'Open 30 chests',
type: 'side',
objectives: [
{ type: 'open_chests', count: 0, target: 30, completed: false }
],
rewards: { gold: 2000, xp: 3000 }
}
};
// Tracking
this.landmarksVisited = [];
this.structuresVisitedByBiome = {};
console.log('📜 LandmarkQuestSystem initialized');
}
// Start main quest automatically
startMainQuest() {
this.activeQuests.push('main_explore_landmarks');
console.log('📜 Main quest started: The Five Landmarks');
this.showQuestNotification('New Quest!', 'The Five Landmarks', 'Discover all 5 legendary landmarks');
}
// Start exploration quests
startExplorationQuests() {
this.activeQuests.push('explore_grassland');
this.activeQuests.push('explore_forest');
this.activeQuests.push('explore_desert');
this.activeQuests.push('explore_mountain');
this.activeQuests.push('explore_swamp');
console.log('📜 Started 5 biome exploration quests');
}
// Visit landmark (called from player)
visitLandmark(landmarkType) {
if (this.landmarksVisited.includes(landmarkType)) return;
this.landmarksVisited.push(landmarkType);
console.log(`🗿 Visited landmark: ${landmarkType}`);
// Update main quest
const mainQuest = this.quests['main_explore_landmarks'];
if (this.activeQuests.includes('main_explore_landmarks')) {
for (const obj of mainQuest.objectives) {
if (obj.target === landmarkType) {
obj.completed = true;
this.showQuestNotification('Objective Complete!', obj.name, '+2000 XP');
break;
}
}
// Check if all objectives complete
if (mainQuest.objectives.every(o => o.completed)) {
this.completeQuest('main_explore_landmarks');
}
}
}
// Visit structure (for biome quests)
visitStructure(x, y, biome) {
const key = `${x},${y}`;
if (!this.structuresVisitedByBiome[biome]) {
this.structuresVisitedByBiome[biome] = [];
}
if (this.structuresVisitedByBiome[biome].includes(key)) return;
this.structuresVisitedByBiome[biome].push(key);
// Update biome exploration quests
const questId = `explore_${biome.toLowerCase()}`;
if (this.activeQuests.includes(questId)) {
const quest = this.quests[questId];
for (const obj of quest.objectives) {
if (obj.biome === biome) {
obj.count++;
if (obj.count >= obj.target && !obj.completed) {
obj.completed = true;
this.completeQuest(questId);
}
}
}
}
}
// Complete quest and give rewards
completeQuest(questId) {
const quest = this.quests[questId];
if (!quest) return;
console.log(`✅ Quest completed: ${quest.name}`);
// Remove from active
const index = this.activeQuests.indexOf(questId);
if (index > -1) {
this.activeQuests.splice(index, 1);
}
// Add to completed
this.completedQuests.push(questId);
// Give rewards
if (this.scene.inventorySystem && quest.rewards) {
if (quest.rewards.gold) {
this.scene.inventorySystem.gold += quest.rewards.gold;
}
if (quest.rewards.item) {
this.scene.inventorySystem.addItem(quest.rewards.item, 1);
}
}
// Show completion
this.showQuestCompleteNotification(quest);
// Play sound
if (this.scene.soundManager) {
this.scene.soundManager.beepPickup();
}
}
// Show quest notification
showQuestNotification(title, questName, description) {
const notification = this.scene.add.text(
this.scene.cameras.main.centerX,
100,
`${title}\n${questName}\n${description}`,
{
fontSize: '24px',
color: '#FFD700',
backgroundColor: '#000000',
padding: { x: 30, y: 20 },
align: 'center'
}
);
notification.setOrigin(0.5);
notification.setScrollFactor(0);
notification.setDepth(10001);
this.scene.tweens.add({
targets: notification,
alpha: 0,
duration: 1000,
delay: 3000,
onComplete: () => notification.destroy()
});
}
// Show quest complete notification
showQuestCompleteNotification(quest) {
const rewardText = [];
if (quest.rewards.gold) rewardText.push(`+${quest.rewards.gold} gold`);
if (quest.rewards.xp) rewardText.push(`+${quest.rewards.xp} XP`);
if (quest.rewards.item) rewardText.push(`+${quest.rewards.item}`);
const notification = this.scene.add.text(
this.scene.cameras.main.centerX,
this.scene.cameras.main.centerY,
`🎉 QUEST COMPLETE! 🎉\n${quest.name}\n\nRewards:\n${rewardText.join('\n')}`,
{
fontSize: '32px',
color: '#FFD700',
backgroundColor: '#000000',
padding: { x: 40, y: 30 },
align: 'center'
}
);
notification.setOrigin(0.5);
notification.setScrollFactor(0);
notification.setDepth(10002);
// Fireworks effect
for (let i = 0; i < 30; i++) {
const particle = this.scene.add.circle(
this.scene.cameras.main.centerX,
this.scene.cameras.main.centerY,
5,
[0xFFD700, 0xFF69B4, 0x00BFFF][i % 3]
);
particle.setScrollFactor(0);
particle.setDepth(10001);
this.scene.tweens.add({
targets: particle,
x: particle.x + (Math.random() - 0.5) * 400,
y: particle.y + (Math.random() - 0.5) * 400,
alpha: 0,
duration: 2000,
onComplete: () => particle.destroy()
});
}
this.scene.tweens.add({
targets: notification,
alpha: 0,
duration: 1000,
delay: 4000,
onComplete: () => notification.destroy()
});
}
// Get active quests for UI
getActiveQuests() {
return this.activeQuests.map(id => this.quests[id]);
}
// Get quest progress
getQuestProgress(questId) {
const quest = this.quests[questId];
if (!quest) return null;
const completed = quest.objectives.filter(o => o.completed).length;
const total = quest.objectives.length;
return { completed, total, objectives: quest.objectives };
}
// Export/Import for save system
exportData() {
return {
activeQuests: this.activeQuests,
completedQuests: this.completedQuests,
landmarksVisited: this.landmarksVisited,
structuresVisitedByBiome: this.structuresVisitedByBiome
};
}
importData(data) {
if (!data) return;
this.activeQuests = data.activeQuests || [];
this.completedQuests = data.completedQuests || [];
this.landmarksVisited = data.landmarksVisited || [];
this.structuresVisitedByBiome = data.structuresVisitedByBiome || {};
}
destroy() {
this.activeQuests = [];
this.completedQuests = [];
}
}