ok
This commit is contained in:
297
EMERGENCY_SYSTEMS_RECOVERY/MagicEnchantingSystem.js
Normal file
297
EMERGENCY_SYSTEMS_RECOVERY/MagicEnchantingSystem.js
Normal file
@@ -0,0 +1,297 @@
|
||||
/**
|
||||
* MAGIC ENCHANTING SYSTEM
|
||||
* Enhance tools with magical properties
|
||||
*
|
||||
* Features:
|
||||
* - 5 Enchantment Types: Power, Speed, Fortune, Unbreaking, Auto-Collect
|
||||
* - 3 Enchantment Levels per type
|
||||
* - Costs mana + rare materials
|
||||
* - Glowing visual effects
|
||||
* - Can stack multiple enchantments
|
||||
*/
|
||||
class MagicEnchantingSystem {
|
||||
constructor(scene) {
|
||||
this.scene = scene;
|
||||
|
||||
// Enchantment definitions
|
||||
this.enchantments = {
|
||||
power: {
|
||||
name: 'Power',
|
||||
icon: '⚡',
|
||||
description: 'Increases tool efficiency',
|
||||
levels: [
|
||||
{ level: 1, bonus: 0.25, cost: { mana: 50, crystal: 1 } },
|
||||
{ level: 2, bonus: 0.50, cost: { mana: 100, crystal: 3 } },
|
||||
{ level: 3, bonus: 1.00, cost: { mana: 200, crystal: 10 } }
|
||||
],
|
||||
color: 0xFF4444
|
||||
},
|
||||
speed: {
|
||||
name: 'Speed',
|
||||
icon: '⚡',
|
||||
description: 'Increases tool speed',
|
||||
levels: [
|
||||
{ level: 1, bonus: 0.20, cost: { mana: 50, feather: 5 } },
|
||||
{ level: 2, bonus: 0.40, cost: { mana: 100, feather: 15 } },
|
||||
{ level: 3, bonus: 0.80, cost: { mana: 200, feather: 50 } }
|
||||
],
|
||||
color: 0x44FF44
|
||||
},
|
||||
fortune: {
|
||||
name: 'Fortune',
|
||||
icon: '💎',
|
||||
description: 'Chance for double drops',
|
||||
levels: [
|
||||
{ level: 1, bonus: 0.15, cost: { mana: 75, emerald: 1 } },
|
||||
{ level: 2, bonus: 0.30, cost: { mana: 150, emerald: 3 } },
|
||||
{ level: 3, bonus: 0.50, cost: { mana: 300, emerald: 10 } }
|
||||
],
|
||||
color: 0x44FFFF
|
||||
},
|
||||
unbreaking: {
|
||||
name: 'Unbreaking',
|
||||
icon: '🛡️',
|
||||
description: 'Reduces durability loss',
|
||||
levels: [
|
||||
{ level: 1, bonus: 0.30, cost: { mana: 60, obsidian: 5 } },
|
||||
{ level: 2, bonus: 0.50, cost: { mana: 120, obsidian: 15 } },
|
||||
{ level: 3, bonus: 0.75, cost: { mana: 250, obsidian: 50 } }
|
||||
],
|
||||
color: 0xFF44FF
|
||||
},
|
||||
auto_collect: {
|
||||
name: 'Auto-Collect',
|
||||
icon: '🌀',
|
||||
description: 'Automatically collects drops',
|
||||
levels: [
|
||||
{ level: 1, bonus: 1.0, cost: { mana: 100, void_essence: 1 } },
|
||||
{ level: 2, bonus: 2.0, cost: { mana: 200, void_essence: 3 } },
|
||||
{ level: 3, bonus: 3.0, cost: { mana: 400, void_essence: 10 } }
|
||||
],
|
||||
color: 0x9D4EDD
|
||||
}
|
||||
};
|
||||
|
||||
// Enchanting table locations (town)
|
||||
this.enchantingTables = [];
|
||||
|
||||
console.log('✨ Magic Enchanting System initialized');
|
||||
}
|
||||
|
||||
/**
|
||||
* Enchant a tool
|
||||
*/
|
||||
enchantTool(toolId, enchantmentType, level = 1) {
|
||||
const toolSystem = this.scene.toolSystem;
|
||||
if (!toolSystem) {
|
||||
return { success: false, message: 'Tool system not available' };
|
||||
}
|
||||
|
||||
const tool = toolSystem.playerTools.get(toolId);
|
||||
if (!tool) {
|
||||
return { success: false, message: 'Tool not found' };
|
||||
}
|
||||
|
||||
const enchantment = this.enchantments[enchantmentType];
|
||||
if (!enchantment) {
|
||||
return { success: false, message: 'Unknown enchantment' };
|
||||
}
|
||||
|
||||
if (level < 1 || level > 3) {
|
||||
return { success: false, message: 'Invalid enchantment level' };
|
||||
}
|
||||
|
||||
// Check if tool already has this enchantment
|
||||
if (!tool.enchantments) {
|
||||
tool.enchantments = {};
|
||||
}
|
||||
|
||||
if (tool.enchantments[enchantmentType]) {
|
||||
return { success: false, message: 'Tool already has this enchantment!' };
|
||||
}
|
||||
|
||||
// Get cost
|
||||
const levelData = enchantment.levels[level - 1];
|
||||
const cost = levelData.cost;
|
||||
|
||||
// Check mana
|
||||
if (this.scene.player && this.scene.player.mana < cost.mana) {
|
||||
return { success: false, message: `Need ${cost.mana} mana!` };
|
||||
}
|
||||
|
||||
// Check materials (simplified - would check inventory)
|
||||
const canAfford = true; // TODO: Check inventory
|
||||
|
||||
if (!canAfford) {
|
||||
return { success: false, message: 'Not enough materials!' };
|
||||
}
|
||||
|
||||
// Apply enchantment
|
||||
tool.enchantments[enchantmentType] = {
|
||||
level: level,
|
||||
bonus: levelData.bonus,
|
||||
color: enchantment.color
|
||||
};
|
||||
|
||||
// Deduct mana
|
||||
if (this.scene.player) {
|
||||
this.scene.player.mana -= cost.mana;
|
||||
}
|
||||
|
||||
// Apply bonus to tool stats
|
||||
this.applyEnchantmentBonus(tool, enchantmentType, levelData.bonus);
|
||||
|
||||
console.log(`✨ Enchanted ${tool.name} with ${enchantment.name} ${level}!`);
|
||||
|
||||
this.scene.events.emit('notification', {
|
||||
title: 'Tool Enchanted!',
|
||||
message: `${enchantment.icon} ${enchantment.name} ${level} applied!`,
|
||||
icon: '✨'
|
||||
});
|
||||
|
||||
return { success: true, enchantment: enchantmentType, level: level };
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply enchantment bonus to tool
|
||||
*/
|
||||
applyEnchantmentBonus(tool, type, bonus) {
|
||||
switch (type) {
|
||||
case 'power':
|
||||
tool.efficiency += bonus;
|
||||
break;
|
||||
case 'speed':
|
||||
tool.speed += bonus;
|
||||
break;
|
||||
case 'fortune':
|
||||
tool.fortuneChance = bonus;
|
||||
break;
|
||||
case 'unbreaking':
|
||||
tool.durabilityMultiplier = 1 - bonus; // 30% less durability loss
|
||||
break;
|
||||
case 'auto_collect':
|
||||
tool.autoCollect = true;
|
||||
tool.autoCollectRadius = bonus;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove enchantment (costs mana)
|
||||
*/
|
||||
removeEnchantment(toolId, enchantmentType) {
|
||||
const toolSystem = this.scene.toolSystem;
|
||||
const tool = toolSystem.playerTools.get(toolId);
|
||||
|
||||
if (!tool || !tool.enchantments || !tool.enchantments[enchantmentType]) {
|
||||
return { success: false, message: 'Enchantment not found' };
|
||||
}
|
||||
|
||||
const cost = 25; // Mana cost to remove
|
||||
|
||||
if (this.scene.player && this.scene.player.mana >= cost) {
|
||||
this.scene.player.mana -= cost;
|
||||
|
||||
// Remove bonus
|
||||
const enchantData = tool.enchantments[enchantmentType];
|
||||
this.removeEnchantmentBonus(tool, enchantmentType, enchantData.bonus);
|
||||
|
||||
delete tool.enchantments[enchantmentType];
|
||||
|
||||
console.log(`🔮 Removed enchantment from ${tool.name}`);
|
||||
|
||||
return { success: true };
|
||||
}
|
||||
|
||||
return { success: false, message: 'Not enough mana' };
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove enchantment bonus from tool
|
||||
*/
|
||||
removeEnchantmentBonus(tool, type, bonus) {
|
||||
switch (type) {
|
||||
case 'power':
|
||||
tool.efficiency -= bonus;
|
||||
break;
|
||||
case 'speed':
|
||||
tool.speed -= bonus;
|
||||
break;
|
||||
case 'fortune':
|
||||
tool.fortuneChance = 0;
|
||||
break;
|
||||
case 'unbreaking':
|
||||
tool.durabilityMultiplier = 1.0;
|
||||
break;
|
||||
case 'auto_collect':
|
||||
tool.autoCollect = false;
|
||||
tool.autoCollectRadius = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all enchantments on a tool
|
||||
*/
|
||||
getToolEnchantments(toolId) {
|
||||
const toolSystem = this.scene.toolSystem;
|
||||
const tool = toolSystem.playerTools.get(toolId);
|
||||
|
||||
if (!tool || !tool.enchantments) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const enchantments = [];
|
||||
for (const [type, data] of Object.entries(tool.enchantments)) {
|
||||
const enchant = this.enchantments[type];
|
||||
enchantments.push({
|
||||
type: type,
|
||||
name: enchant.name,
|
||||
level: data.level,
|
||||
bonus: data.bonus,
|
||||
icon: enchant.icon,
|
||||
color: data.color
|
||||
});
|
||||
}
|
||||
|
||||
return enchantments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build enchanting table in town
|
||||
*/
|
||||
buildEnchantingTable(x, y) {
|
||||
const table = {
|
||||
id: `enchanting_${Date.now()}`,
|
||||
x: x,
|
||||
y: y,
|
||||
type: 'enchanting_table',
|
||||
active: true
|
||||
};
|
||||
|
||||
this.enchantingTables.push(table);
|
||||
|
||||
console.log(`✨ Built Enchanting Table at (${x}, ${y})`);
|
||||
|
||||
this.scene.events.emit('notification', {
|
||||
title: 'Enchanting Table Built!',
|
||||
message: 'You can now enchant your tools!',
|
||||
icon: '✨'
|
||||
});
|
||||
|
||||
return table;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if near enchanting table
|
||||
*/
|
||||
isNearEnchantingTable(x, y, radius = 3) {
|
||||
for (const table of this.enchantingTables) {
|
||||
const distance = Phaser.Math.Distance.Between(x, y, table.x, table.y);
|
||||
if (distance <= radius) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user