/** * Galaxy Strike Online - Item System * Centralized item management for shop, inventory, dungeons, and all game systems */ class ItemSystem { constructor() { // Server configuration - will be set dynamically this.serverUrl = process.env.SERVER_URL || 'http://localhost:3002'; // Master item catalog - single source of truth this.itemCatalog = { // Ships ships: [ { id: 'starter_cruiser_common', name: 'Starter Cruiser', type: 'ship', rarity: 'common', price: 5000, currency: 'credits', description: 'Reliable starter cruiser for new pilots', texturePath: 'images/ships/starter_cruiser_common.png', stats: { attack: 15, speed: 10, defense: 12, hull: 100 }, categories: ['shop', 'dungeon_reward'], requirements: { level: 1 }, stackable: false }, { id: 'starter_cruiser_uncommon', name: 'Starter Cruiser II', type: 'ship', rarity: 'uncommon', price: 12000, currency: 'credits', description: 'Upgraded starter cruiser with enhanced systems', texturePath: 'images/ships/starter_cruiser_uncommon.png', stats: { attack: 18, speed: 12, defense: 15, hull: 120 }, categories: ['shop', 'dungeon_reward'], requirements: { level: 5 }, stackable: false }, { id: 'starter_cruiser_rare', name: 'Starter Cruiser III', type: 'ship', rarity: 'rare', price: 25000, currency: 'credits', description: 'Elite starter cruiser with maximum upgrades', texturePath: 'images/ships/starter_cruiser_rare.png', stats: { attack: 22, speed: 15, defense: 18, hull: 150 }, categories: ['shop', 'dungeon_reward'], requirements: { level: 10 }, stackable: false }, { id: 'interceptor_common', name: 'Interceptor', type: 'ship', rarity: 'common', price: 8000, currency: 'credits', description: 'Fast attack ship for hit-and-run tactics', texturePath: 'images/ships/interceptor_common.png', stats: { attack: 12, speed: 18, defense: 8, hull: 80 }, categories: ['shop', 'dungeon_reward'], requirements: { level: 3 }, stackable: false }, { id: 'interceptor_uncommon', name: 'Interceptor II', type: 'ship', rarity: 'uncommon', price: 18000, currency: 'credits', description: 'Enhanced interceptor with improved weapons', texturePath: 'images/ships/interceptor_uncommon.png', stats: { attack: 15, speed: 22, defense: 10, hull: 95 }, categories: ['shop', 'dungeon_reward'], requirements: { level: 7 }, stackable: false }, { id: 'heavy_cruiser_rare', name: 'Heavy Cruiser', type: 'ship', rarity: 'rare', price: 35000, currency: 'credits', description: 'Powerful heavy cruiser with superior firepower and armor', texturePath: 'images/ships/heavy_cruiser_rare.png', stats: { attack: 28, speed: 8, defense: 25, hull: 200 }, categories: ['shop', 'dungeon_reward'], requirements: { level: 12 }, stackable: false } ], // Materials materials: [ { id: 'steel_plating', name: 'Steel Plating', type: 'material', rarity: 'common', price: 100, currency: 'credits', description: 'Basic armor material for ship upgrades', texture: 'http://localhost:3002/images/items/materials/steel_plating.png', categories: ['shop', 'dungeon_loot', 'crafting'], requirements: { level: 1 }, stackable: true, maxStack: 99, effects: { defense: 5 } }, { id: 'energy_core', name: 'Energy Core', type: 'material', rarity: 'uncommon', price: 250, currency: 'credits', description: 'Power source for advanced upgrades', texture: 'http://localhost:3002/images/items/materials/energy_crystal.png', categories: ['shop', 'dungeon_loot', 'crafting'], requirements: { level: 5 }, stackable: true, maxStack: 50, effects: { energy: 10 } }, { id: 'quantum_fuel', name: 'Quantum Fuel', type: 'material', rarity: 'rare', price: 500, currency: 'credits', description: 'Advanced fuel for long-range travel', texture: 'http://localhost:3002/images/items/materials/quantum_core.png', categories: ['shop', 'dungeon_loot', 'crafting'], requirements: { level: 10 }, stackable: true, maxStack: 25, effects: { speed: 15 } }, { id: 'dark_matter', name: 'Dark Matter', type: 'material', rarity: 'legendary', price: 2000, currency: 'gems', description: 'Exotic matter for ultimate upgrades', texture: 'http://localhost:3002/images/items/materials/dark_matter_fragment.png', categories: ['shop', 'dungeon_loot', 'crafting'], requirements: { level: 15 }, stackable: true, maxStack: 10, effects: { attack: 20, defense: 20 } }, { id: 'titanium_alloy', name: 'Titanium Alloy', type: 'material', rarity: 'uncommon', price: 300, currency: 'credits', description: 'Lightweight yet durable metal for ship construction', texture: 'http://localhost:3002/images/items/materials/titanium_alloy.png', categories: ['shop', 'dungeon_loot', 'crafting'], requirements: { level: 8 }, stackable: true, maxStack: 75, effects: { defense: 8, speed: 3 } }, { id: 'plasma_coil', name: 'Plasma Coil', type: 'material', rarity: 'rare', price: 750, currency: 'credits', description: 'High-energy component for weapon systems', texture: 'http://localhost:3002/images/items/materials/plasma_coil.png', categories: ['shop', 'dungeon_loot', 'crafting'], requirements: { level: 12 }, stackable: true, maxStack: 30, effects: { attack: 12, energy: 8 } }, { id: 'nanite_gel', name: 'Nanite Gel', type: 'material', rarity: 'epic', price: 1200, currency: 'gems', description: 'Self-repairing nanomachines in gel form', texture: 'http://localhost:3002/images/items/materials/nanite_gel.png', categories: ['shop', 'dungeon_loot', 'crafting'], requirements: { level: 18 }, stackable: true, maxStack: 15, effects: { hull_repair: 25, defense: 5 } }, { id: 'cryo_crystal', name: 'Cryo Crystal', type: 'material', rarity: 'rare', price: 600, currency: 'credits', description: 'Frozen crystal that enhances cooling systems', texture: 'http://localhost:3002/images/items/materials/cryo_crystal.png', categories: ['shop', 'dungeon_loot', 'crafting'], requirements: { level: 10 }, stackable: true, maxStack: 40, effects: { energy: 15, speed: 5 } }, { id: 'void_shard', name: 'Void Shard', type: 'material', rarity: 'legendary', price: 2500, currency: 'gems', description: 'Fragment of void space with reality-bending properties', texture: 'http://localhost:3002/images/items/materials/void_shard.png', categories: ['shop', 'dungeon_loot', 'crafting'], requirements: { level: 20 }, stackable: true, maxStack: 8, effects: { attack: 15, defense: 15, speed: 10 } } ], // Consumables consumables: [ { id: 'repair_kit', name: 'Repair Kit', type: 'consumable', rarity: 'common', price: 50, currency: 'credits', description: 'Instantly repairs ship damage', texture: 'http://localhost:3002/images/items/consumables/repair_kit.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 1 }, stackable: true, maxStack: 20, effects: { hull_repair: 50 }, consumable: true, cooldown: 30000 // 30 seconds }, { id: 'energy_boost', name: 'Energy Boost', type: 'consumable', rarity: 'common', price: 75, currency: 'credits', description: 'Temporary energy increase', texture: 'http://localhost:3002/images/items/consumables/energy_boost.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 1 }, stackable: true, maxStack: 15, effects: { energy_boost: 25, duration: 60000 }, // 1 minute consumable: true, cooldown: 45000 // 45 seconds }, { id: 'shield_booster', name: 'Shield Booster', type: 'consumable', rarity: 'uncommon', price: 150, currency: 'credits', description: 'Temporary shield enhancement', texture: 'http://localhost:3002/images/items/consumables/shield_recharge.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 5 }, stackable: true, maxStack: 10, effects: { shield_boost: 50, duration: 90000 }, // 1.5 minutes consumable: true, cooldown: 60000 // 1 minute }, { id: 'damage_amplifier', name: 'Damage Amplifier', type: 'consumable', rarity: 'rare', price: 300, currency: 'credits', description: 'Increases damage output temporarily', texture: 'http://localhost:3002/images/items/consumables/ammo_pack.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 8 }, stackable: true, maxStack: 5, effects: { damage_multiplier: 1.5, duration: 45000 }, // 45 seconds consumable: true, cooldown: 120000 // 2 minutes }, { id: 'speed_boost', name: 'Speed Boost', type: 'consumable', rarity: 'uncommon', price: 200, currency: 'credits', description: 'Temporary speed increase for quick escapes', texture: 'http://localhost:3002/images/items/consumables/speed_boost.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 6 }, stackable: true, maxStack: 8, effects: { speed_multiplier: 1.3, duration: 30000 }, // 30 seconds consumable: true, cooldown: 90000 // 1.5 minutes }, { id: 'nanite_repair', name: 'Nanite Repair', type: 'consumable', rarity: 'epic', price: 500, currency: 'credits', description: 'Advanced nanites that continuously repair hull damage', texture: 'http://localhost:3002/images/items/consumables/nanite_repair.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 12 }, stackable: true, maxStack: 3, effects: { hull_repair_rate: 10, duration: 60000 }, // 10 HP/sec for 1 minute consumable: true, cooldown: 180000 // 3 minutes }, { id: 'stealth_field', name: 'Stealth Field Generator', type: 'consumable', rarity: 'rare', price: 400, currency: 'credits', description: 'Temporary invisibility to enemy sensors', texture: 'http://localhost:3002/images/items/consumables/stealth_field.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 10 }, stackable: true, maxStack: 4, effects: { stealth: true, duration: 20000 }, // 20 seconds consumable: true, cooldown: 150000 // 2.5 minutes }, { id: 'emergency_warp', name: 'Emergency Warp Core', type: 'consumable', rarity: 'legendary', price: 1000, currency: 'gems', description: 'Instant emergency teleport to safety', texture: 'http://localhost:3002/images/items/consumables/emergency_warp.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 15 }, stackable: true, maxStack: 2, effects: { emergency_escape: true }, consumable: true, cooldown: 300000 // 5 minutes }, { id: 'combat_stim', name: 'Combat Stimulant', type: 'consumable', rarity: 'uncommon', price: 250, currency: 'credits', description: 'Enhances combat abilities for short duration', texture: 'http://localhost:3002/images/items/consumables/combat_stim.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 7 }, stackable: true, maxStack: 6, effects: { attack: 10, speed: 5, duration: 45000 }, // 45 seconds consumable: true, cooldown: 120000 // 2 minutes } ], // Cosmetics cosmetics: [ { id: 'red_paint', name: 'Red Paint Job', type: 'cosmetic', rarity: 'common', price: 500, currency: 'credits', description: 'Red color scheme for your ship', texture: 'http://localhost:3002/images/items/cosmetics/cool_paint_job.png', categories: ['shop'], requirements: { level: 1 }, stackable: false, cosmetic: true, slot: 'paint' }, { id: 'blue_paint', name: 'Blue Paint Job', type: 'cosmetic', rarity: 'common', price: 500, currency: 'credits', description: 'Blue color scheme for your ship', texture: 'http://localhost:3002/images/items/cosmetics/neon_lights.png', categories: ['shop'], requirements: { level: 1 }, stackable: false, cosmetic: true, slot: 'paint' }, { id: 'gold_trim', name: 'Gold Trim', type: 'cosmetic', rarity: 'uncommon', price: 1000, currency: 'credits', description: 'Gold accent trim for your ship', texture: 'http://localhost:3002/images/items/cosmetics/golden_trim.png', categories: ['shop'], requirements: { level: 5 }, stackable: false, cosmetic: true, slot: 'trim' }, { id: 'rainbow_effect', name: 'Rainbow Engine Effect', type: 'cosmetic', rarity: 'rare', price: 2500, currency: 'credits', description: 'Colorful engine trail effect', texture: 'http://localhost:3002/images/items/cosmetics/custom_decal.png', categories: ['shop'], requirements: { level: 10 }, stackable: false, cosmetic: true, slot: 'engine' }, { id: 'skull_decal', name: 'Skull Decal', type: 'cosmetic', rarity: 'uncommon', price: 1500, currency: 'credits', description: 'Intimidating skull decal for your ship', texture: 'http://localhost:3002/images/items/cosmetics/skull_decal.png', categories: ['shop'], requirements: { level: 3 }, stackable: false, cosmetic: true, slot: 'decal' }, { id: 'neon_lights', name: 'Neon Underglow', type: 'cosmetic', rarity: 'rare', price: 3000, currency: 'credits', description: 'Colorful neon lights under your ship', texture: 'http://localhost:3002/images/items/cosmetics/neon_lights.png', categories: ['shop'], requirements: { level: 8 }, stackable: false, cosmetic: true, slot: 'lights' }, { id: 'chrome_finish', name: 'Chrome Finish', type: 'cosmetic', rarity: 'epic', price: 5000, currency: 'credits', description: 'Reflective chrome coating for premium look', texture: 'http://localhost:3002/images/items/cosmetics/chrome_finish.png', categories: ['shop'], requirements: { level: 12 }, stackable: false, cosmetic: true, slot: 'finish' }, { id: 'holographic_display', name: 'Holographic Display', type: 'cosmetic', rarity: 'legendary', price: 8000, currency: 'gems', description: 'Advanced holographic projection system', texture: 'http://localhost:3002/images/items/cosmetics/holographic_display.png', categories: ['shop'], requirements: { level: 15 }, stackable: false, cosmetic: true, slot: 'display' }, { id: 'carbon_fiber', name: 'Carbon Fiber Body', type: 'cosmetic', rarity: 'uncommon', price: 2000, currency: 'credits', description: 'Lightweight carbon fiber ship body', texture: 'http://localhost:3002/images/items/cosmetics/carbon_fiber.png', categories: ['shop'], requirements: { level: 6 }, stackable: false, cosmetic: true, slot: 'body' } ], // Weapons weapons: [ { id: 'laser_cannon_common', name: 'Laser Cannon', type: 'weapon', rarity: 'common', price: 1000, currency: 'credits', description: 'Basic laser weapon for beginners', texture: 'http://localhost:3002/images/weapons/laser_pistol_common.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 1 }, stackable: false, stats: { attack: 10, range: 100, fire_rate: 2 } }, { id: 'plasma_rifle_uncommon', name: 'Plasma Rifle', type: 'weapon', rarity: 'uncommon', price: 2500, currency: 'credits', description: 'Plasma-based weapon with increased damage', texture: 'http://localhost:3002/images/weapons/plasma_rifle_uncommon.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 5 }, stackable: false, stats: { attack: 18, range: 120, fire_rate: 1.5 } }, { id: 'quantum_blaster_rare', name: 'Quantum Blaster', type: 'weapon', rarity: 'rare', price: 6000, currency: 'credits', description: 'Advanced quantum weapon with high damage output', texture: 'http://localhost:3002/images/weapons/plasma_rifle_rare.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 10 }, stackable: false, stats: { attack: 30, range: 150, fire_rate: 1 } }, { id: 'ion_cannon_uncommon', name: 'Ion Cannon', type: 'weapon', rarity: 'uncommon', price: 3500, currency: 'credits', description: 'Ion-based weapon effective against shields', texture: 'http://localhost:3002/images/weapons/ion_cannon_uncommon.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 6 }, stackable: false, stats: { attack: 22, range: 110, fire_rate: 1.8, shield_damage: 1.5 } }, { id: 'missile_launcher_rare', name: 'Missile Launcher', type: 'weapon', rarity: 'rare', price: 8000, currency: 'credits', description: 'Homing missile system for heavy damage', texture: 'http://localhost:3002/images/weapons/missile_launcher_rare.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 12 }, stackable: false, stats: { attack: 45, range: 200, fire_rate: 0.8, explosive: true } }, { id: 'plasma_thrower_epic', name: 'Plasma Thrower', type: 'weapon', rarity: 'epic', price: 12000, currency: 'credits', description: 'Continuous plasma stream weapon', texture: 'http://localhost:3002/images/weapons/plasma_thrower_epic.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 15 }, stackable: false, stats: { attack: 35, range: 80, fire_rate: 5, continuous: true } }, { id: 'railgun_legendary', name: 'Railgun', type: 'weapon', rarity: 'legendary', price: 20000, currency: 'gems', description: 'Electromagnetic railgun with piercing shots', texture: 'http://localhost:3002/images/weapons/railgun_legendary.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 18 }, stackable: false, stats: { attack: 60, range: 300, fire_rate: 0.5, piercing: true } }, { id: 'pulse_cannon_common', name: 'Pulse Cannon', type: 'weapon', rarity: 'common', price: 1500, currency: 'credits', description: 'Rapid-fire pulse weapon', texture: 'http://localhost:3002/images/weapons/pulse_cannon_common.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 2 }, stackable: false, stats: { attack: 8, range: 90, fire_rate: 4 } } ], // Armors armors: [ { id: 'basic_shield_common', name: 'Basic Shield Generator', type: 'armor', rarity: 'common', price: 800, currency: 'credits', description: 'Basic shield protection for beginners', texture: 'http://localhost:3002/images/armors/light_armor_common.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 1 }, stackable: false, stats: { defense: 8, shield_capacity: 50, recharge_rate: 5 } }, { id: 'energy_armor_uncommon', name: 'Energy Armor', type: 'armor', rarity: 'uncommon', price: 2000, currency: 'credits', description: 'Energy-based armor with enhanced protection', texture: 'http://localhost:3002/images/armors/light_armor_uncommon.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 5 }, stackable: false, stats: { defense: 15, shield_capacity: 100, recharge_rate: 8 } }, { id: 'quantum_deflector_rare', name: 'Quantum Deflector', type: 'armor', rarity: 'rare', price: 5000, currency: 'credits', description: 'Advanced quantum armor with maximum protection', texture: 'http://localhost:3002/images/armors/light_armor_rare.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 10 }, stackable: false, stats: { defense: 25, shield_capacity: 200, recharge_rate: 12 } }, { id: 'plasma_barrier_uncommon', name: 'Plasma Barrier', type: 'armor', rarity: 'uncommon', price: 3000, currency: 'credits', description: 'Plasma-based barrier system', texture: 'http://localhost:3002/images/armors/plasma_barrier_uncommon.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 7 }, stackable: false, stats: { defense: 18, shield_capacity: 120, recharge_rate: 10, energy_resistance: 0.8 } }, { id: 'reactive_armor_epic', name: 'Reactive Armor', type: 'armor', rarity: 'epic', price: 9000, currency: 'credits', description: 'Adaptive armor that responds to damage types', texture: 'http://localhost:3002/images/armors/reactive_armor_epic.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 14 }, stackable: false, stats: { defense: 35, shield_capacity: 250, recharge_rate: 15, adaptive: true } }, { id: 'kinetic_dampener_rare', name: 'Kinetic Dampener', type: 'armor', rarity: 'rare', price: 6000, currency: 'credits', description: 'Specialized armor against kinetic weapons', texture: 'http://localhost:3002/images/armors/kinetic_dampener_rare.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 11 }, stackable: false, stats: { defense: 22, shield_capacity: 180, recharge_rate: 11, kinetic_resistance: 0.7 } }, { id: 'phase_shifter_legendary', name: 'Phase Shifter', type: 'armor', rarity: 'legendary', price: 15000, currency: 'gems', description: 'Experimental phase-shifting armor system', texture: 'http://localhost:3002/images/armors/phase_shifter_legendary.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 18 }, stackable: false, stats: { defense: 40, shield_capacity: 300, recharge_rate: 20, phase_shift: 0.2 } }, { id: 'carbon_plate_common', name: 'Carbon Plate Armor', type: 'armor', rarity: 'common', price: 1200, currency: 'credits', description: 'Lightweight carbon composite armor', texture: 'http://localhost:3002/images/armors/carbon_plate_common.png', categories: ['shop', 'dungeon_loot'], requirements: { level: 3 }, stackable: false, stats: { defense: 12, shield_capacity: 70, recharge_rate: 6, weight_reduction: 0.1 } } ], // Dungeon-specific rewards dungeon_rewards: [ { id: 'dungeon_key_basic', name: 'Basic Dungeon Key', type: 'key', rarity: 'common', price: 200, currency: 'credits', description: 'Key to enter basic dungeons', categories: ['shop', 'dungeon_loot'], requirements: { level: 1 }, stackable: true, maxStack: 10, consumable: true, dungeon_access: ['basic_dungeon', 'mines'] }, { id: 'dungeon_key_advanced', name: 'Advanced Dungeon Key', type: 'key', rarity: 'uncommon', price: 800, currency: 'credits', description: 'Key to enter advanced dungeons', categories: ['shop', 'dungeon_loot'], requirements: { level: 8 }, stackable: true, maxStack: 5, consumable: true, dungeon_access: ['advanced_dungeon', 'fortress'] }, { id: 'treasure_chest', name: 'Treasure Chest', type: 'container', rarity: 'rare', price: 0, currency: 'credits', description: 'Contains random valuable items', categories: ['dungeon_loot'], requirements: { level: 1 }, stackable: true, maxStack: 5, consumable: true, loot_table: 'treasure_chest_common' } ] }; // Initialize item lookup maps for performance this.itemLookup = new Map(); this.categoryLookup = new Map(); this.rarityLookup = new Map(); this.buildLookupMaps(); } /** * Build lookup maps for efficient item retrieval */ buildLookupMaps() { // Build ID lookup for (const [category, items] of Object.entries(this.itemCatalog)) { for (const item of items) { this.itemLookup.set(item.id, item); // Build category lookup if (!this.categoryLookup.has(category)) { this.categoryLookup.set(category, []); } this.categoryLookup.get(category).push(item); // Build rarity lookup if (!this.rarityLookup.has(item.rarity)) { this.rarityLookup.set(item.rarity, []); } this.rarityLookup.get(item.rarity).push(item); } } } /** * Get item by ID */ getItem(itemId) { return this.itemLookup.get(itemId) || null; } /** * Get all items in a category */ getItemsByCategory(category) { return this.categoryLookup.get(category) || []; } /** * Get items by rarity */ getItemsByRarity(rarity) { return this.rarityLookup.get(rarity) || []; } /** * Get items available for specific context (shop, dungeon, etc.) */ getItemsByContext(context) { const results = []; for (const item of this.itemLookup.values()) { if (item.categories && item.categories.includes(context)) { results.push(item); } } return results; } /** * Get shop items (items available in shop) */ getShopItems() { return this.getItemsByContext('shop'); } /** * Get dungeon loot items */ getDungeonLootItems() { return this.getItemsByContext('dungeon_loot'); } /** * Get dungeon reward items */ getDungeonRewardItems() { return this.getItemsByContext('dungeon_reward'); } /** * Get crafting materials */ getCraftingMaterials() { return this.getItemsByContext('crafting'); } /** * Check if player meets item requirements */ canPlayerUseItem(playerData, item) { if (!item.requirements) return true; // Check level requirement if (item.requirements.level && playerData.stats.level < item.requirements.level) { return false; } // Add other requirement checks here (skills, quests, etc.) return true; } /** * Get filtered items for player (based on requirements) */ getAvailableItemsForPlayer(playerData, context = null) { let items = context ? this.getItemsByContext(context) : Array.from(this.itemLookup.values()); return items.filter(item => this.canPlayerUseItem(playerData, item)); } /** * Generate random loot based on rarity weights */ generateLoot(rarityWeights = null, context = null) { const defaultWeights = { common: 50, uncommon: 30, rare: 15, legendary: 5 }; const weights = rarityWeights || defaultWeights; const availableItems = context ? this.getItemsByContext(context) : Array.from(this.itemLookup.values()); // Filter by rarity weights const weightedItems = []; for (const item of availableItems) { const weight = weights[item.rarity] || 0; for (let i = 0; i < weight; i++) { weightedItems.push(item); } } if (weightedItems.length === 0) return null; // Random selection const randomIndex = Math.floor(Math.random() * weightedItems.length); return weightedItems[randomIndex]; } /** * Get item statistics */ getItemStats() { const stats = { totalItems: this.itemLookup.size, byCategory: {}, byRarity: {}, byType: {} }; for (const item of this.itemLookup.values()) { // Count by category for (const category of item.categories || []) { stats.byCategory[category] = (stats.byCategory[category] || 0) + 1; } // Count by rarity stats.byRarity[item.rarity] = (stats.byRarity[item.rarity] || 0) + 1; // Count by type stats.byType[item.type] = (stats.byType[item.type] || 0) + 1; } return stats; } /** * Validate item data structure */ validateItem(item) { const required = ['id', 'name', 'type', 'rarity']; const missing = required.filter(field => !item[field]); if (missing.length > 0) { return { valid: false, errors: [`Missing required fields: ${missing.join(', ')}`] }; } const errors = []; // Validate type if (!['ship', 'material', 'consumable', 'cosmetic', 'key', 'container'].includes(item.type)) { errors.push(`Invalid item type: ${item.type}`); } // Validate rarity if (!['common', 'uncommon', 'rare', 'legendary'].includes(item.rarity)) { errors.push(`Invalid rarity: ${item.rarity}`); } // Validate stackable items if (item.stackable && (!item.maxStack || item.maxStack < 1)) { errors.push('Stackable items must have maxStack >= 1'); } return { valid: errors.length === 0, errors }; } /** * Set server URL dynamically */ setServerUrl(url) { this.serverUrl = url; console.log(`[ITEM SYSTEM] Server URL set to: ${this.serverUrl}`); } /** * Process item to add full texture URL */ processItem(item) { const processedItem = { ...item }; // Add full texture URL if texturePath exists if (item.texturePath) { processedItem.texture = `${this.serverUrl}/${item.texturePath}`; } // Fallback to old texture field if exists else if (item.texture) { processedItem.texture = item.texture; } // Default placeholder else { processedItem.texture = `${this.serverUrl}/images/ui/placeholder.png`; } return processedItem; } /** * Get items with processed URLs */ getItemsByType(type) { const items = this.itemCatalog[type] || []; return items.map(item => this.processItem(item)); } /** * Get all items with processed URLs */ getAllItems() { const allItems = {}; Object.keys(this.itemCatalog).forEach(type => { allItems[type] = this.getItemsByType(type); }); return allItems; } /** * Get random shop items with processed URLs - 6 items per category */ getRandomShopItems(count = 6) { const shopItems = {}; // Get 6 random items from each category Object.keys(this.itemCatalog).forEach(category => { const categoryItems = this.itemCatalog[category] || []; const selectedItems = []; if (categoryItems.length > 0) { // Randomly select items from this category const shuffled = [...categoryItems].sort(() => Math.random() - 0.5); for (let i = 0; i < Math.min(count, shuffled.length); i++) { selectedItems.push(this.processItem(shuffled[i])); } } shopItems[category] = selectedItems; }); return shopItems; } /** * Get random items for a specific category */ getRandomItemsByCategory(category, count = 6) { const categoryItems = this.itemCatalog[category] || []; const selectedItems = []; if (categoryItems.length > 0) { const shuffled = [...categoryItems].sort(() => Math.random() - 0.5); for (let i = 0; i < Math.min(count, shuffled.length); i++) { selectedItems.push(this.processItem(shuffled[i])); } } return selectedItems; } } module.exports = ItemSystem;