How This Works

Drafted by an LLM, reviewed and edited by TitanTrainers15 and others.

If you’ve used PvPoke, most of what you see on this site is built on top of it. This page is the short version of what the tool is, where the numbers come from, and what you can and can’t trust.

The simulator is PvPoke, rewritten in Python

Every matchup on this site is scored by the same decision-making logic PvPoke uses on its battle page: the same fast-move / charge-move timing, the same shield decisions, the same damage formula, the same shadow multipliers, the same priority rules for simultaneous charge moves. We read the same gamemaster.json that PvPoke publishes, so when Niantic changes a move’s power or energy cost, our dives change with PvPoke’s next data release.

The reason it’s a rewrite and not a wrapper is that PvPoke’s battle simulator runs in your browser. To sweep one species against an opponent pool across every IV spread and every shield scenario, we need it running in a loop without a browser in the way. A Python port gets us that, and also gets us a test suite.

We check ours against PvPoke’s

PvPoke is the reference. To make sure the Python rewrite matches, we keep a suite of cross-checks:

When our simulator produces a different number than PvPoke’s, it’s a bug in one of them and we go find out which. Often it’s ours. A few times it’s turned out to be PvPoke’s - we document those in our developer notes (6 so far) so readers know when we’re intentionally running a fixed version of the reference logic.

We sweep every IV spread, not just the top ones

PvPoke’s UI shows you one IV-spread matchup at a time, usually the stat-product rank-1 IV spread on both sides. We run the simulation against every legal IV spread on your side - all 4096 of them (Atk 0-15, Def 0-15, Sta 0-15) - at every level that keeps the CP under the league cap.

Why the full sweep: IV spreads matter to PvP teambuilding in a way that the rank-1 stat-product spread doesn’t capture. Two IV spreads with similar stat products can sit on opposite sides of an important damage breakpoint or a CMP tie, and the only way to see which IV spreads fall on which side is to simulate them all. The Threshold Tiers on every dive page are the output of that sweep: they name the specific cutoff an IV has to clear to reach the next meaningful tier against each notable opponent. See the Threshold Tiers guide for how to read those cards.

For every IV spread, we simulate against the league’s meta opponent pool (currently 87 opponents on the reference Oinkologne (Female) Great League dive) in each of the nine shield scenarios (0-0, 0-1, 0-2, 1-0, 1-1, 1-2, 2-0, 2-1, 2-2). That’s one dive, fully scored.

We render with Plotly so every IV spread is inspectable

The scatter plot on every dive page is a Plotly figure with one point per IV spread. Hovering a point shows you its stat-product rank, its battle rank, its avg battle score, its per-opponent win/loss list, and which threshold tiers it clears. The dropdowns at the top of the plot (Shields / Opponent IVs / Bait) re-color the plot live - same data, different lens.

This is the part we built that PvPoke doesn’t have. Instead of asking “what’s the best IV spread,” the scatter lets you ask “how does each IV spread compare to every other one at once” - the cluster shapes, breakpoint banding, and outlier IV spreads are all visible on the same canvas. The catch- and trade-probability question is answered separately in the IV Flavor Guide and Threshold Tier sections; the scatter is the “see them all together” view.

What you should trust, and what you shouldn’t

Trust:

Be careful with:

Known limits:

If you want the gory details, the code is at github.com/mglerner and every dive page has a Run parameters (CLI invocation) section at the bottom showing the exact command that produced it.

Battle engine is a Python port of PvPoke; all game data from PvPoke by Empoleon_Dynamite (MIT license). This project would not exist without it.

Part of the PvP dive site. Explainers regenerate from current dive data every publish, so numbers stay in sync with the methodology. Last regenerated 2026-08-27.