calculateDamage
Determine Pokémon battle damage by analyzing attacker and defender stats, abilities, moves, items, and field conditions for strategic planning.
Instructions
Calculates the battle damage between an attacking and a defending Pokémon, considering their stats, abilities, items, and field conditions.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| attacker | Yes | ||
| defender | Yes | ||
| field | Yes | ||
| move | Yes |
Implementation Reference
- src/calculator.ts:97-139 (handler)Core implementation of the calculateDamage tool handler using @smogon/calc library to compute damage range, KO chance, and description.export function calculateDamage(request: CalculateDamageRequest): CalculateDamageResponse { try { // Validate required fields if (!request.attacker?.species) { throw new Error("Attacker species is required"); } if (!request.defender?.species) { throw new Error("Defender species is required"); } if (!request.move?.name) { throw new Error("Move name is required"); } const attacker = createSmogonPokemon(request.attacker); const defender = createSmogonPokemon(request.defender); const move = createSmogonMove(request.move); const field = createSmogonField(request.field); const result = calculate(gen, attacker, defender, move, field); let damageRange: [number, number]; if (result.damage) { if (Array.isArray(result.damage)) { const damageArray = result.damage as number[]; damageRange = [damageArray[0], damageArray[damageArray.length - 1]]; } else { const singleDamage = result.damage as number; damageRange = [singleDamage, singleDamage]; } } else { damageRange = [0, 0]; } return { description: result.fullDesc(), damage: damageRange, koChance: result.kochance().text, fullResult: result }; } catch (error) { throw new Error(`Calculation failed: ${error instanceof Error ? error.message : String(error)}`); } }
- src/types.ts:57-69 (schema)TypeScript interfaces defining the input (CalculateDamageRequest) and output (CalculateDamageResponse) schemas for the tool.export interface CalculateDamageRequest { attacker: Pokemon; defender: Pokemon; field: Field; move: Move; } export interface CalculateDamageResponse { description: string; damage: [number, number]; koChance: string; fullResult?: any; }
- src/index.ts:168-178 (registration)MCP server registration of the calculateDamage tool, listing it with name, description, and input schema.server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ { name: 'calculateDamage', description: 'Calculates the battle damage between an attacking and a defending Pokémon, considering their stats, abilities, items, and field conditions.', inputSchema: CALCULATE_DAMAGE_SCHEMA, }, ], }; });
- src/index.ts:181-204 (registration)MCP server handler for calling the calculateDamage tool, dispatching to the core calculateDamage function.server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; if (name === 'calculateDamage') { try { const result = calculateDamage(args as unknown as CalculateDamageRequest); return { content: [ { type: 'text', text: JSON.stringify(result, null, 2), }, ], }; } catch (error) { throw new McpError( ErrorCode.InternalError, `Failed to calculate damage: ${error instanceof Error ? error.message : String(error)}` ); } } else { throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`); } });
- api/mcp/route.ts:133-179 (handler)Alternative Vercel MCP adapter implementation of the calculateDamage tool handler with inline logic similar to src/calculator.ts.const handler = createMcpHandler((server) => { server.tool( 'calculateDamage', 'Calculates the battle damage between an attacking and a defending Pokémon, considering their stats, abilities, items, and field conditions.', CalculateDamageSchema.shape, async (params) => { try { const attacker = createSmogonPokemon(params.attacker); const defender = createSmogonPokemon(params.defender); const move = createSmogonMove(params.move); const field = createSmogonField(params.field); const result = calculate(gen, attacker, defender, move, field); let damageRange: [number, number]; if (result.damage) { if (Array.isArray(result.damage)) { const damageArray = result.damage as number[]; damageRange = [damageArray[0], damageArray[damageArray.length - 1]]; } else { const singleDamage = result.damage as number; damageRange = [singleDamage, singleDamage]; } } else { damageRange = [0, 0]; } const calculationResult = { description: result.fullDesc(), damage: damageRange, koChance: result.kochance().text, percentage: result.range(), }; return { content: [ { type: 'text', text: `**${calculationResult.description}**\n\nDamage: ${calculationResult.damage[0]}-${calculationResult.damage[1]}\nKO Chance: ${calculationResult.koChance}` } ] }; } catch (error) { throw new Error(`Calculation failed: ${error instanceof Error ? error.message : String(error)}`); } } );