UNPKG

maplestorysea-mcp-server

Version:

NEXON MapleStory SEA API MCP Server for Claude Desktop - Complete character info, union details, guild data, rankings optimized for SEA servers

260 lines 7.7 kB
"use strict"; /** * Equipment analysis utilities for MapleStory items */ Object.defineProperty(exports, "__esModule", { value: true }); exports.parseStarforceLevel = parseStarforceLevel; exports.parseScrollUpgrades = parseScrollUpgrades; exports.parsePotentialGrade = parsePotentialGrade; exports.calculateCombatPower = calculateCombatPower; exports.analyzeSetEffects = analyzeSetEffects; exports.calculateEnhancementScore = calculateEnhancementScore; exports.analyzeEquipmentPiece = analyzeEquipmentPiece; /** * Parse starforce level from item data */ function parseStarforceLevel(item) { if (!item) return 0; // Check starforce field if (item.starforce && typeof item.starforce === 'string') { const starforce = parseInt(item.starforce, 10); return isNaN(starforce) ? 0 : starforce; } // Check item name for star indicators (Korean and English patterns) if (item.item_name && typeof item.item_name === 'string') { // Korean pattern: (숫자성) const koreanStarMatch = item.item_name.match(/\((\d+)성\)/); if (koreanStarMatch) { return parseInt(koreanStarMatch[1], 10); } // English patterns: (숫자stars) or (숫자★) or [숫자*] const englishStarMatch = item.item_name.match(/\((\d+)(?:stars?|★|\*)\)/i); if (englishStarMatch) { return parseInt(englishStarMatch[1], 10); } } return 0; } /** * Parse scroll upgrade count from item data */ function parseScrollUpgrades(item) { if (!item) return 0; // Check upgrade slots used vs available const upgradeCount = item.scroll_upgrade || 0; const maxUpgrade = item.scroll_upgradeable_count || 0; return Math.min(upgradeCount, maxUpgrade); } /** * Parse potential grade from item data */ function parsePotentialGrade(item) { if (!item || !item.potential_option_grade) return 'None'; const grade = item.potential_option_grade.toLowerCase(); switch (grade) { case 'rare': case '레어': return 'Rare'; case 'epic': case '에픽': return 'Epic'; case 'unique': case '유니크': return 'Unique'; case 'legendary': case '레전드리': return 'Legendary'; default: return 'None'; } } /** * Calculate total combat power from stats */ function calculateCombatPower(stats) { // Simplified combat power calculation (actual formula is more complex) const str = stats.str || 0; const dex = stats.dex || 0; const int = stats.int || 0; const luk = stats.luk || 0; const attackPower = stats.attack_power || 0; const magicPower = stats.magic_power || 0; // Basic stat contribution (simplified) const primaryStat = Math.max(str, dex, int, luk); const weaponPower = Math.max(attackPower, magicPower); return Math.floor(primaryStat * 1.5 + weaponPower * 2); } /** * Analyze equipment for set effects */ function analyzeSetEffects(equipment) { if (!equipment || !Array.isArray(equipment)) return []; const setMap = new Map(); // Count items by set name equipment.forEach((item) => { if (item?.item_equipment_part && item?.item_name) { const setName = extractSetName(item.item_name); if (setName) { setMap.set(setName, (setMap.get(setName) || 0) + 1); } } }); // Convert to set effects array const setEffects = []; setMap.forEach((count, setName) => { const setEffect = { setName, activeCount: count, totalCount: getSetTotalCount(setName), effects: getSetEffectDetails(setName, count), }; setEffects.push(setEffect); }); return setEffects.filter((set) => set.activeCount >= 2); // Only show sets with 2+ items } /** * Extract set name from item name */ function extractSetName(itemName) { if (!itemName) return null; // Common MapleStory SEA set patterns const setPatterns = [ /(.+)\sSet/i, // English set pattern /(Pensalir|Utgard|Necro|CRA|Arcane|Absolab|Eternal|Genesis|Boss|Root Abyss|Von Leon|Hieizan|Princess No)/i, // Known SEA set names ]; for (const pattern of setPatterns) { const match = itemName.match(pattern); if (match && match[1]) { return match[1].trim(); } } return null; } /** * Get total count for a set */ function getSetTotalCount(setName) { // Common set sizes (simplified) const knownSets = { // Korean names 펜살리르: 7, 루타비스: 8, 아케인: 6, 압솔: 6, 에테르넬: 6, 제네시스: 6, // English names Pensalir: 7, Lutabis: 8, CRA: 4, Arcane: 6, Absolab: 6, Eternal: 6, Genesis: 6, }; return knownSets[setName] || 8; // Default to 8 pieces } /** * Get set effect details */ function getSetEffectDetails(setName, activeCount) { // Simplified set effects (actual effects are much more complex) const effects = []; for (let i = 2; i <= activeCount; i++) { effects.push({ requiredCount: i, description: `${setName} ${i}-Set Effect`, stats: { str: i * 10, dex: i * 10, int: i * 10, luk: i * 10, attack_power: i * 5, magic_power: i * 5, }, }); } return effects; } /** * Calculate enhancement level score */ function calculateEnhancementScore(enhancement) { let score = 0; // Starforce contributes most to enhancement score score += enhancement.starforceLevel * 10; // Scroll upgrades contribute moderately score += enhancement.scrollUpgrades * 5; // Potential grade contributes significantly switch (enhancement.potentialGrade) { case 'Legendary': score += 100; break; case 'Unique': score += 50; break; case 'Epic': score += 25; break; case 'Rare': score += 10; break; } // Additional potential grade bonus switch (enhancement.additionalPotentialGrade) { case 'Legendary': score += 50; break; case 'Unique': score += 25; break; case 'Epic': score += 15; break; case 'Rare': score += 5; break; } return score; } /** * Analyze individual equipment piece */ function analyzeEquipmentPiece(item) { return { starforceLevel: parseStarforceLevel(item), scrollUpgrades: parseScrollUpgrades(item), potentialGrade: parsePotentialGrade(item), additionalPotentialGrade: parsePotentialGradeAdditional(item), // For additional potential }; } /** * Parse additional potential grade */ function parsePotentialGradeAdditional(item) { if (!item || !item.additional_potential_option_grade) return 'None'; const grade = item.additional_potential_option_grade.toLowerCase(); switch (grade) { case 'rare': case '레어': return 'Rare'; case 'epic': case '에픽': return 'Epic'; case 'unique': case '유니크': return 'Unique'; case 'legendary': case '레전드리': return 'Legendary'; default: return 'None'; } } //# sourceMappingURL=equipment-analyzer.js.map