Why kinglercalc.com Shows “Loading...” or “???” Instead of Damage Results

Updated

The calculator is showing placeholders because the page's JavaScript hasn't finished running or the matchup isn't complete yet. The page itself tells you this: after the copy confirmation it notes, “If you see this message for more than a few seconds, try enabling JavaScript.” In practice, results stay as “Loading...” or “??? – ???%” until the script runs and both Pokémon have a move selected. Fix JavaScript first, then complete the setup.

What the placeholders mean

The damage readout is generated in the browser, not pre-written into the page. Each move row under “Pokémon 1's Moves” and “Pokémon 2's Moves” is a slot that fills in once the script can compute it. Until then you see:

  • “Loading...” — the script hasn't populated that row yet.
  • “??? – ???%” — the row exists but has no valid calculation behind it, usually because a required input is missing.

Neither message is an error in your matchup. They are the empty state of the results area.

Fix 1: Make sure JavaScript is running

This is the cause the site itself points to. Check in this order:

  1. Browser setting — confirm JavaScript is allowed for kinglercalc.com (or globally). If you use an extension that blocks scripts, allow the site and reload.
  2. Hard refresh — reload the page after changing the setting so the script runs from a clean load.
  3. Try a normal window — if you're in a private/incognito window or a restricted embedded browser, open the page in a standard window.
  4. Check the copy message — trigger a copy action and watch the confirmation. If it stays visible for more than a few seconds, the page is telling you JavaScript is still not active.

Expected result: the move rows stop saying “Loading...” and begin showing damage percentages as you fill in the matchup.

Fix 2: Complete both sides of the matchup

A calculation needs a full attacker and defender, not just a selected Pokémon. Work through both panels:

  • Generation and game version — pick these first at the top. The available Pokémon, moves, and stat fields change with the generation, so a half-set generation can leave fields empty.
  • Both Pokémon selected — Pokémon 1 and Pokémon 2 each need a species.
  • At least one move chosen per side — the page says “select one to show detailed results.” A move row with no move selected has nothing to compute.
  • Stats and level — the stat panel shows Current HP, level, and the stat block (HP, Attack, Defense, Sp. Atk, Sp. Def, Speed, plus Special in older generations). If these are blank or zeroed, the result can't resolve.

Expected result: selecting a move on a side fills that side's rows with damage ranges instead of placeholders.

Fix 3: Re-check inputs that silently block a result

Some fields look optional but feed the formula. If results are still “???” after the steps above, verify:

Check Why it matters
A move is actually selected, not just the move list opened Rows only calculate for a chosen move
Level and stats are populated Damage depends on the attacker's stats and the defender's HP/defenses
Ability and item fields are set as intended They modify damage; an unset field can leave the calculation incomplete
Generation matches the Pokémon and move Options from another generation may not resolve
Both Pokémon panels are filled One empty side leaves that side's rows blank

Quick checklist

  1. Enable JavaScript and hard-refresh.
  2. Choose generation and game version.
  3. Select Pokémon 1 and Pokémon 2.
  4. Pick a move on each side.
  5. Confirm level and stats are filled.
  6. Read the damage range in the move rows.

If the copy confirmation still lingers after a refresh with JavaScript enabled, the problem is on the browser side, not in your matchup setup.