@smogon/calc engine.
VGC Calcr is a thin natural-language wrapper around
Pokemon Showdown’s damage calculator,
tuned for VGC 2026 Reg M-A (Champions). Type a question in plain English like
does max attack Iron Fist Infernape with Ice Punch OHKO 0 HP Garchomp?
and get back the exact damage range, percentages, and KO verdict, matching Showdown byte-for-byte.
You can also speak queries with the mic button, save your team’s specific EV/SP spreads from a pokepaste and recall them with a slash command, and jump between recent calcs with a keyboard shortcut. Everything lives in the browser: no account, no server, no tracking.
Tap the MIC button next to the query box (or open the command palette with Ctrl+K and pick Voice input) and speak your calc. Interim text streams into the textarea live; when you stop, the transcript is cleaned up against the dictionary of known species, moves, items, and abilities, so "in scene a roar" snaps to Incineroar.
slash sun rewrites to /sun ; the rest relies on natural phrasing
the parser already handles (in sun, behind reflect, etc.).SpeechRecognition API).
Open the ··· overflow menu → Saved spreads to paste a
Showdown team export. Each Pokemon previews with an editable slug; pick the ones you want, hit
Save selected, and they stick around in localStorage.
In the calc box, type /slug (e.g. /incini-slow) to recall the spread. A mini
move picker appears: click a move or press 1–4, and the slash
token is replaced with a full query fragment:
incineroar assault vest intimidate adamant 32 sp hp 32 sp spd tera ghost flare blitz.
Anything you typed before or after (into amoonguss, in sun, etc.) stays put.
into /slug works the same way.Your query goes through three deterministic stages. None use an LLM.
data/champions/*.json: species, moves, items, abilities, natures. Longest match
wins (Iron Fist resolves to the ability before Iron gets treated as a species prefix).252+ Atk, max Spe, 0 HP, Tera Fairy, in sun,
+2 atk, OHKO, and so on.@smogon/calc, the same
library Showdown uses on its site. Math happens there; we don’t reimplement damage formulas.If the parser can’t confidently resolve a name or stat, it refuses: no guessing. You get a clear error explaining what was ambiguous.
Damage calc math is precise to the individual EV. One EV off can be the difference between a guaranteed OHKO and a 5-roll range that lets the opponent survive. A language model hallucinating "max attack" as 250 EVs instead of 252 would silently give you a wrong answer on every roll, which is unacceptable for a tool whose whole value is trust.
Every number in your query is pulled from a dictionary generated directly from Showdown’s source. If a word doesn’t match something real, you see an error; you never see a fabricated calc.
Pokemon Champions replaced EVs with Stat Points (SP):
That 4-EV difference matters: at certain base stats, 256 EVs rounds one point higher than 252.
The toggle at the top of the calc picks which system your query is in; the resulting EVs are echoed
back so you can verify what actually went into @smogon/calc.
You can phrase a question either way and the parser figures out who is attacking and who is defending. Forward phrasings treat the first Pokemon as the attacker; reverse phrasings treat the first Pokemon as the defender and return a survives / doesn’t-survive verdict alongside the usual damage range.
vs, versus, against,
into, OHKO, 2HKOsurvive, survives,
tank, tanks, live, lives
Example:
does max hp max sp def milotic survive a +1 sp atk archaludon max sp atk electro shot?
Milotic is the defender; Archaludon (at +1 SpA stat stage, max Sp Atk, no item) is the attacker using
Electro Shot. The result shows damage range plus a verdict like "Survives 18.8% of rolls (3/16)."
Type / in the query box to open a menu of field-state shortcuts:
/sun /rain /sand /snow (weather)/elec /grass /psy /misty (terrain)/tr /hh /ref /ls /aur (trick room, helping hand, screens)/+1 /+2 /-1 (stat stages)/crit /burn /par /ohko /2hko/incini-slow) also appears in the same menue.code so macOS’s
special-char behavior doesn’t break it)
Nature names (adamant, jolly, etc.) allow a single-edit typo: insertion,
deletion, substitution, or adjacent swap. adamat resolves to Adamant; seriosu
to Serious. Each correction shows a warning like Interpreted "adamat" as Adamant so you always
see what was fixed.
If a typo is one edit from two natures, the parser refuses and will never pick one and hide the ambiguity.
Moves are checked against data/champions/learnsets.json for species with Champions-specific
overrides, falling back to the Gen 9 learnset otherwise. Incineroar can’t learn Knock Off in VGC
2026 Reg M-A, the parser rejects that query with "Incineroar cannot learn Knock Off"
and suggests legal alternatives.
To run the calc anyway for a hypothetical matchup, add the word hypothetical anywhere in
your query. The calc runs with a visible warning banner.
The language select inside the ··· menu switches the display
language for species, moves, items, and abilities. Supported:
English, 日本語, 한국어, Français, Deutsch, Español, Italiano, 简体中文. You can also
type Pokemon and moves in any of these: Carchacrok Séisme resolves to
Garchomp Earthquake, and ガブリアス じしん does the same.
Translations are synced from PokeAPI
(~1025 species, 800+ moves, 300+ abilities per language). Forms like Mega Charizard X or
Landorus-Therian fall back to English because PokeAPI only translates base species. The calc
itself is unchanged; names are just aliases for the English canonical values
@smogon/calc consumes.
All 98 Mega forms in the Champions dex are supported. Natural phrasing works:
mega gengar, mega charizard y, mega tatsugiri curly,
mega meowstic m. Regional forms too: alolan ninetales,
galarian rapidash, hisuian zoroark.
The two side columns flanking the calc hold your last nine queries and any named presets you’ve
saved. Recents stack vertically; presets show a named list you can load or re-run. Click the
SWAP button in either header to flip which panel is on which side, and your choice
persists to localStorage (vgc-panel-order-v1).
Recents, presets, and saved spreads all live in your browser’s
localStorage. Nothing ever hits the server.
All game data syncs directly from
smogon/pokemon-showdown
via npm run sync. When Showdown updates (new moves, new formats, tier shifts),
re-run the sync and you’re current. data/_meta.json tracks which commit you’re on.
The default is VGC 2026 Reg M-A (Gen 9 Champions, Level 50, Doubles). Species legality, learnsets, and the stat-point system all follow Champions rules. You can still calc anything: flip to Standard EV mode for traditional Gen 9 OU / Smogon Singles numbers.