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
JavaScript
;
/**
* 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