378 lines
10 KiB
JavaScript
378 lines
10 KiB
JavaScript
/**
|
|
* CRAFTING TIERS SYSTEM
|
|
* Tool tiers, durability, and repair mechanics
|
|
*/
|
|
class CraftingTiersSystem {
|
|
constructor(scene) {
|
|
this.scene = scene;
|
|
this.enabled = true;
|
|
|
|
// Tool tiers
|
|
this.tiers = {
|
|
wood: { name: 'Wooden', durability: 50, speed: 1.0, damage: 1.0, color: 0x8B4513 },
|
|
bronze: { name: 'Bronze', durability: 150, speed: 1.2, damage: 1.3, color: 0xCD7F32 },
|
|
iron: { name: 'Iron', durability: 300, speed: 1.5, damage: 1.6, color: 0xC0C0C0 },
|
|
steel: { name: 'Steel', durability: 600, speed: 1.8, damage: 2.0, color: 0x4682B4 },
|
|
enchanted: { name: 'Enchanted', durability: 1200, speed: 2.5, damage: 3.0, color: 0x9370DB }
|
|
};
|
|
|
|
// Tool types
|
|
this.toolTypes = ['sword', 'pickaxe', 'axe', 'hoe', 'shovel'];
|
|
|
|
// Player's tools
|
|
this.playerTools = new Map();
|
|
|
|
// Crafting recipes
|
|
this.recipes = new Map();
|
|
|
|
this.loadProgress();
|
|
this.init();
|
|
|
|
console.log('✅ Crafting Tiers System initialized');
|
|
}
|
|
|
|
init() {
|
|
this.defineRecipes();
|
|
console.log('⚒️ Crafting recipes ready');
|
|
}
|
|
|
|
// ========== RECIPE DEFINITIONS ==========
|
|
|
|
defineRecipes() {
|
|
// BRONZE TIER (Copper + Tin)
|
|
this.defineRecipe('bronze_sword', {
|
|
name: 'Bronze Sword',
|
|
tier: 'bronze',
|
|
type: 'sword',
|
|
materials: { copper: 3, tin: 1 },
|
|
unlockLevel: 5
|
|
});
|
|
|
|
this.defineRecipe('bronze_pickaxe', {
|
|
name: 'Bronze Pickaxe',
|
|
tier: 'bronze',
|
|
type: 'pickaxe',
|
|
materials: { copper: 3, tin: 1, wood: 2 },
|
|
unlockLevel: 5
|
|
});
|
|
|
|
this.defineRecipe('bronze_axe', {
|
|
name: 'Bronze Axe',
|
|
tier: 'bronze',
|
|
type: 'axe',
|
|
materials: { copper: 3, tin: 1, wood: 2 },
|
|
unlockLevel: 5
|
|
});
|
|
|
|
// IRON TIER
|
|
this.defineRecipe('iron_sword', {
|
|
name: 'Iron Sword',
|
|
tier: 'iron',
|
|
type: 'sword',
|
|
materials: { iron: 5 },
|
|
unlockLevel: 10
|
|
});
|
|
|
|
this.defineRecipe('iron_pickaxe', {
|
|
name: 'Iron Pickaxe',
|
|
tier: 'iron',
|
|
type: 'pickaxe',
|
|
materials: { iron: 5, wood: 3 },
|
|
unlockLevel: 10
|
|
});
|
|
|
|
this.defineRecipe('iron_axe', {
|
|
name: 'Iron Axe',
|
|
tier: 'iron',
|
|
type: 'axe',
|
|
materials: { iron: 5, wood: 3 },
|
|
unlockLevel: 10
|
|
});
|
|
|
|
// STEEL TIER (Iron + Coal)
|
|
this.defineRecipe('steel_sword', {
|
|
name: 'Steel Sword',
|
|
tier: 'steel',
|
|
type: 'sword',
|
|
materials: { iron: 5, coal: 3 },
|
|
unlockLevel: 20
|
|
});
|
|
|
|
this.defineRecipe('steel_pickaxe', {
|
|
name: 'Steel Pickaxe',
|
|
tier: 'steel',
|
|
type: 'pickaxe',
|
|
materials: { iron: 5, coal: 3, wood: 2 },
|
|
unlockLevel: 20
|
|
});
|
|
|
|
// ENCHANTED TIER (Magical)
|
|
this.defineRecipe('enchanted_sword', {
|
|
name: 'Enchanted Sword',
|
|
tier: 'enchanted',
|
|
type: 'sword',
|
|
materials: { steel_sword: 1, magic_crystal: 5, dragon_scale: 3 },
|
|
unlockLevel: 30
|
|
});
|
|
}
|
|
|
|
defineRecipe(id, data) {
|
|
this.recipes.set(id, {
|
|
id,
|
|
...data
|
|
});
|
|
}
|
|
|
|
// ========== CRAFTING ==========
|
|
|
|
canCraft(recipeId) {
|
|
const recipe = this.recipes.get(recipeId);
|
|
if (!recipe) return false;
|
|
|
|
// Check level requirement
|
|
if (this.scene.skillTree && this.scene.skillTree.playerLevel < recipe.unlockLevel) {
|
|
return false;
|
|
}
|
|
|
|
// Check materials
|
|
if (!this.scene.inventorySystem) return false;
|
|
|
|
for (const [material, amount] of Object.entries(recipe.materials)) {
|
|
const has = this.scene.inventorySystem.getItemCount(material);
|
|
if (has < amount) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
craft(recipeId) {
|
|
if (!this.canCraft(recipeId)) {
|
|
console.log('❌ Cannot craft:', recipeId);
|
|
return false;
|
|
}
|
|
|
|
const recipe = this.recipes.get(recipeId);
|
|
|
|
// Consume materials
|
|
for (const [material, amount] of Object.entries(recipe.materials)) {
|
|
this.scene.inventorySystem.removeItem(material, amount);
|
|
}
|
|
|
|
// Create tool
|
|
const tool = this.createTool(recipe.tier, recipe.type);
|
|
this.playerTools.set(`${recipe.type}_${recipe.tier}`, tool);
|
|
|
|
// Add to inventory
|
|
if (this.scene.inventorySystem) {
|
|
this.scene.inventorySystem.addItem(recipeId, 1);
|
|
}
|
|
|
|
// Unlock achievement
|
|
if (this.scene.uiGraphics) {
|
|
if (recipe.tier === 'enchanted') {
|
|
this.scene.uiGraphics.unlockAchievement('master_crafter');
|
|
}
|
|
}
|
|
|
|
this.saveProgress();
|
|
console.log(`✅ Crafted: ${recipe.name}`);
|
|
return true;
|
|
}
|
|
|
|
// ========== TOOL MANAGEMENT ==========
|
|
|
|
createTool(tier, type) {
|
|
const tierData = this.tiers[tier];
|
|
|
|
return {
|
|
tier,
|
|
type,
|
|
durability: tierData.durability,
|
|
maxDurability: tierData.durability,
|
|
speed: tierData.speed,
|
|
damage: tierData.damage,
|
|
color: tierData.color,
|
|
enchantments: []
|
|
};
|
|
}
|
|
|
|
getTool(type) {
|
|
// Get best available tool of this type
|
|
const tierOrder = ['enchanted', 'steel', 'iron', 'bronze', 'wood'];
|
|
|
|
for (const tier of tierOrder) {
|
|
const key = `${type}_${tier}`;
|
|
const tool = this.playerTools.get(key);
|
|
if (tool && tool.durability > 0) {
|
|
return tool;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
useTool(type, amount = 1) {
|
|
const tool = this.getTool(type);
|
|
if (!tool) return false;
|
|
|
|
tool.durability -= amount;
|
|
|
|
// Tool broke
|
|
if (tool.durability <= 0) {
|
|
tool.durability = 0;
|
|
console.log(`💔 ${this.tiers[tool.tier].name} ${tool.type} broke!`);
|
|
|
|
// Visual effect
|
|
if (this.scene.visualEnhancements) {
|
|
const player = this.scene.player;
|
|
if (player) {
|
|
const pos = player.getPosition();
|
|
this.scene.visualEnhancements.createSparkleEffect(pos.x, pos.y);
|
|
}
|
|
}
|
|
}
|
|
|
|
this.saveProgress();
|
|
return true;
|
|
}
|
|
|
|
getToolDurabilityPercent(type) {
|
|
const tool = this.getTool(type);
|
|
if (!tool) return 0;
|
|
|
|
return (tool.durability / tool.maxDurability) * 100;
|
|
}
|
|
|
|
// ========== TOOL REPAIR ==========
|
|
|
|
canRepair(type) {
|
|
const tool = this.getTool(type);
|
|
if (!tool || tool.durability === tool.maxDurability) return false;
|
|
|
|
// Check materials
|
|
const repairCost = this.getRepairCost(tool);
|
|
if (!this.scene.inventorySystem) return false;
|
|
|
|
for (const [material, amount] of Object.entries(repairCost)) {
|
|
const has = this.scene.inventorySystem.getItemCount(material);
|
|
if (has < amount) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
getRepairCost(tool) {
|
|
const durabilityLost = tool.maxDurability - tool.durability;
|
|
const repairPercent = durabilityLost / tool.maxDurability;
|
|
|
|
// Cost scales with damage
|
|
const baseCost = {
|
|
wood: { wood: 2 },
|
|
bronze: { copper: 2, tin: 1 },
|
|
iron: { iron: 3 },
|
|
steel: { iron: 3, coal: 2 },
|
|
enchanted: { magic_crystal: 2 }
|
|
};
|
|
|
|
const cost = {};
|
|
const tierCost = baseCost[tool.tier];
|
|
|
|
for (const [material, amount] of Object.entries(tierCost)) {
|
|
cost[material] = Math.ceil(amount * repairPercent);
|
|
}
|
|
|
|
return cost;
|
|
}
|
|
|
|
repair(type) {
|
|
if (!this.canRepair(type)) {
|
|
console.log('❌ Cannot repair:', type);
|
|
return false;
|
|
}
|
|
|
|
const tool = this.getTool(type);
|
|
const cost = this.getRepairCost(tool);
|
|
|
|
// Consume materials
|
|
for (const [material, amount] of Object.entries(cost)) {
|
|
this.scene.inventorySystem.removeItem(material, amount);
|
|
}
|
|
|
|
// Repair tool
|
|
tool.durability = tool.maxDurability;
|
|
|
|
// Visual effect
|
|
if (this.scene.visualEnhancements) {
|
|
const player = this.scene.player;
|
|
if (player) {
|
|
const pos = player.getPosition();
|
|
this.scene.visualEnhancements.createSparkleEffect(pos.x, pos.y);
|
|
}
|
|
}
|
|
|
|
this.saveProgress();
|
|
console.log(`🔧 Repaired: ${this.tiers[tool.tier].name} ${tool.type}`);
|
|
return true;
|
|
}
|
|
|
|
// ========== ENCHANTMENTS ==========
|
|
|
|
enchantTool(type, enchantment) {
|
|
const tool = this.getTool(type);
|
|
if (!tool || tool.tier !== 'enchanted') return false;
|
|
|
|
tool.enchantments.push(enchantment);
|
|
this.saveProgress();
|
|
console.log(`✨ Enchanted ${tool.type} with ${enchantment}`);
|
|
return true;
|
|
}
|
|
|
|
// ========== PERSISTENCE ==========
|
|
|
|
saveProgress() {
|
|
const data = {
|
|
tools: {}
|
|
};
|
|
|
|
for (const [key, tool] of this.playerTools.entries()) {
|
|
data.tools[key] = {
|
|
tier: tool.tier,
|
|
type: tool.type,
|
|
durability: tool.durability,
|
|
enchantments: tool.enchantments
|
|
};
|
|
}
|
|
|
|
localStorage.setItem('novafarma_crafting_tiers', JSON.stringify(data));
|
|
}
|
|
|
|
loadProgress() {
|
|
const saved = localStorage.getItem('novafarma_crafting_tiers');
|
|
if (saved) {
|
|
try {
|
|
const data = JSON.parse(saved);
|
|
|
|
for (const [key, toolData] of Object.entries(data.tools)) {
|
|
const tool = this.createTool(toolData.tier, toolData.type);
|
|
tool.durability = toolData.durability;
|
|
tool.enchantments = toolData.enchantments || [];
|
|
this.playerTools.set(key, tool);
|
|
}
|
|
|
|
console.log('✅ Crafting progress loaded');
|
|
} catch (error) {
|
|
console.error('Failed to load crafting progress:', error);
|
|
}
|
|
}
|
|
}
|
|
|
|
destroy() {
|
|
this.saveProgress();
|
|
console.log('⚒️ Crafting Tiers System destroyed');
|
|
}
|
|
}
|