A Pokémon Champions Newbie Built a Real-Time Damage Calculator with AI — and Climbed to Master Ball


이 글은 한국어판의 영어 번역입니다. This is an English translation of the original Korean post.

Have you been enjoying Pokémon Champions? I’ve been living in it since I left my job. I never owned a Switch, so for years I only watched competitive Pokémon on YouTube — and now I can finally play myself. (Thank you, mobile release.)

Official Pokémon Champions key art Pokémon Champions — the Pokémon battling game released on mobile in 2026. (Image: official site)

I suspect a lot of players are entering competitive battles for the first time, like me. And honestly, this game is not beginner-friendly. My last Pokémon game was SoulSilver on the DS, so I started with the mindset of “just use the moves that sound powerful” — and got stuck below Ultra Ball rank.

Studying the game led me to damage calculator websites. Which created a new problem: I couldn’t play without a calculator anymore. And using one mid-battle is chaos — calculate speed here, damage there, and all the while I’m shadowboxing with questions like “did this thing invest its EVs in bulk or attack?”

A calculator site example — the SmartNuo damage calculator SmartNuo (smartnuo.com), a Korean calculator site where you enter stats, boosts, natures, abilities and weather to get damage numbers.

I was slow, and I felt genuinely sorry for my opponents waiting on me. But I still wanted to reach Master Ball rank.

So I built a program that does the math for me just by looking at the screen. I’m not a developer — I built it with help from an AI (Claude) — but it turned out more useful than I expected, which is why I’m writing this.

Today I’ll show you what it is, how it works, and how it actually performs — through two real ranked battles.

Pokémon battles are secretly a math game

There’s plenty of luck involved, but at its core every turn of a Pokémon battle is a math problem between two Pokémon: speed and damage.

  • Does my move OHKO their Pokémon?
  • Can I survive their attack?
  • Am I faster than them?

That’s it, really — sounds simple. The problem is when modifiers start stacking: stat boosts, weather, screens, burn and paralysis. Suddenly predicting damage in your head gets genuinely hard.

I kept eyeballing those calls and losing, and it drove me crazy. So I decided to build a tool that does the calculating for me.

What I built

A real-time damage calculator + opponent set analyzer overlay for Pokémon Champions (played via emulator).

It captures the game screen about every 0.7 seconds → figures out whether a battle is happening → reads the nameplate to identify each Pokémon → then draws the opponent’s likely set, damage rolls, speed comparison and weaknesses — with boosts, weather and status factored in — on a separate always-on-top window.

The analyzer recognizing the opponent’s Mega Clefable and showing its predicted set and damage The game stays untouched — a “calculation copilot” window just sits next to it.

It never touches or modifies game memory. It only looks at the screen, which keeps it relatively safe and portable.

How it works

Let me explain it the way a non-developer would. The core is a loop that runs every 0.7 seconds. Each cycle does this, in order:

  1. Capture the screen.
  2. Decide whether a battle is in progress.
  3. Identify the Pokémon on screen.
  4. Calculate and draw the panel — based on the most common competitive sets from usage stats.
  5. Read battle text via OCR — lines like “Sp. Atk rose” or “the rain stopped.”
  6. Auto-record wins and losses.

Battle 1 — the strength (Gholdengo vs. Mega Clefable)

Talk is cheap, so here’s an actual game. It came down to a 1v1 endgame.

Game screen — my Gholdengo facing the opponent’s Mega Clefable one-on-one My Gholdengo (Steel/Ghost) vs. their Mega Clefable (Fairy/Flying).

There’s a trap here: we each hit the other super effectively. My Make It Rain (Steel) is 2x against Clefable (Fairy); their Flamethrower (Fire) is 2x against Gholdengo (Steel). At a glance it looks like a coin flip decided by damage rolls. The calculator says otherwise.

Decision 1 — “Does Make It Rain OHKO?”

The app’s Gholdengo panel — Make It Rain deals 89–104% to Mega Clefable Make It Rain → Mega Clefable: 89–104% (super effective), and I’m faster — 106 vs. 90 Speed.

The 89–104% range is the whole story. It only KOs on a high roll — it is not guaranteed. And if I fail to KO, I eat a Flamethrower back and I’m suddenly in danger.

Decision 2 — “Then can I survive their Flamethrower?”

The app showing incoming Flamethrower damage as 143–168 HP Flamethrower: 143–168 damage. Incoming damage is shown in raw HP, not percent. I can survive two.

Game screen — Gholdengo survives the Flamethrower with 37 HP Took the Flamethrower and lived on 37 HP.

The finish — Make It Rain

Game screen — Gholdengo’s Make It Rain knocks out Mega Clefable The surviving Gholdengo closed it out with Make It Rain.

Calculation App said Actual result
Make It Rain → Mega Clefable 117–138% (2x) KO ✓
Flamethrower → Gholdengo 143–168 HP (2x) survived at 37 HP ✓

 

Watching the game, it’s just another battle. Through the calculator, it’s numbers. Without it, I’m certain I would have clicked Make It Rain turn one and lost.

Battle 2 — the app got it wrong. Here’s why that’s fine

This app runs on estimates. You can’t actually see the opponent’s item or EV spread, so it predicts them from usage statistics — which means it can be wrong. This battle shows both the weakness and how to turn it into a weapon.

Miss #1 — Excadrill: the item prediction was wrong

The analyzer showing the opponent’s Excadrill against my Mega Blaziken, speed 152 vs. 231 The app assumed Excadrill’s most common item — Choice Scarf (37% usage) — and displayed “opponent is faster” based on that.

Under the Scarf assumption, the app said Excadrill outspeeds. In reality it held a Focus Sash. Without the 1.5x Scarf boost, Excadrill sits around 154 Speed — and Blaziken’s Speed Boost ability raises its Speed every turn, so my Blaziken was actually faster.

Game screen — Blaziken’s Flare Blitz knocks out Excadrill Blaziken’s Flare Blitz. The item shown is just “what’s most used” — never a guarantee.

Miss #2 — Primarina: the EV estimate was wrong

The analyzer showing Blaziken’s Thunder Punch at 91–107% against Primarina It assumed an offensive Primarina, so Thunder Punch showed 91–107% (2x — nearly a guaranteed KO).

The actual hit came in far weaker. That means this Primarina was a bulky build — recalculated, it was 59–70%. And here’s the key insight: EVs put into bulk are EVs not put into Speed. The app assumed max Speed (112) and called Primarina faster, but a bulky spread (around 80) is slower than my Gholdengo (106).

Game screen — Primarina takes Blaziken’s Thunder Punch Thunder Punch dealt less than the app’s estimate — which itself tells you it’s a bulky set.

EV estimates can miss. But “it hit weaker than predicted” is information. From that one fact you can reverse-engineer “this thing is bulky and slow.”

And when the inputs are right — the math is exact

Game screen — Gholdengo facing the last opponent, Mega Staraptor The last opponent: Mega Staraptor.

After stacking Nasty Plot to +2, Thunderbolt showed 129–152% — a guaranteed OHKO (Electric vs. Flying, 2x). I set up exactly as calculated and ended it in one hit.

Going the other way, their Blaze Kick did 86–102 per hit to me — so I knew in advance I could absorb two and not die, and took the first one on purpose.

Game screen — Mega Staraptor uses Blaze Kick, then falls to Thunderbolt Absorbed the Blaze Kick, then closed the game with the boosted Thunderbolt.

That one battle is the whole app in miniature. Estimates (items, EVs) can be wrong — but compare them against what actually happens and they become a tool for reading the opponent’s set — and calculations with correct inputs are exact. That’s why being wrong is fine.

Honest limitations

  • Opponent sets are estimates. If the item or EV guess is off, speed and damage will be too (see Excadrill and Primarina above).
  • OCR-dependent events (boosts, weather, status, screens) can be missed depending on text and recognition quality. There are manual buttons as a fallback.
  • Some move data may be missing.
  • It’s built for Pokémon Champions on one specific emulator setup.

Know the limits, and even the misses become useful: “the app says X but reality says Y — so the opponent must be running Z.”

Wrapping up

This started as “I just want to win some Pokémon battles,” but I learned a lot building it — screen recognition, asking an AI about things I didn’t know and saving its answers as training data, reading text with OCR, and turning the full damage formula (random rolls included) into code. It took longer than I expected.

The Master Ball rank result screen The actual Master Ball rank screen. Mwahaha.

Now I just need to learn how to build a proper team. Which turns out to be the hard part…