PvPoke Developer Notes - Update 1.27.0
Developer of PvPoke here! The latest site update makes some core changes to how the simulations work, and I'll be diving into those changes and how Pokemon are evaluated differently compared to before. I’ll also be sharing some behind the scenes thoughts and challenges.
Jump to a section:
Overview
Before we get into the details, let’s lay a quick groundwork on how PvPoke works and what these changes mean!
The PvPoke simulator determines the result of a Pokemon matchup by playing it out using a set of behavior rules. These behavior rules range from simple ones like “use your Charged Move when you have the energy” to more complicated ones like “don’t throw self-debuffing moves early in a matchup if you have a non-debuffing move with comparable damage output”. All in all, these behavior rules attempt to produce a single result that represents a typical matchup between two Pokemon, and arrive at a number that can be used for analysis.
Of course, the behavior rules and results aren’t perfect! (No, Melmetal isn’t supposed to helplessly throw Rock Slides into Steelix.) This article highlights some changes I’ve made to improve them and what to expect from the results and rankings.
New Baiting Behaviors
Baiting behaviors have been expanded with a “selective baiting” option. This behavior only baits shields when the Pokemon can meaningfully threaten the opponent with its other Charged Move (the opponent can’t survive the Charged Move plus subsequent Fast Moves). This baiting behavior is the new default behavior, as opposed to always baiting in every matchup.
With this change, Pokemon like Bubble Beam Jellicent will no longer bait shields against bulky opponents like Azumarill, who can survive their big move (in this case, Shadow Ball). It reduces the number of unrealistic baits in the default simulations and lowers the overperformance of bait dependent Pokemon.
The goal of this change is to reduce the impact of “sim hero” Pokemon who are guaranteed to perform well in the simulations but don’t perform as consistently in practice. While “sim hero” Pokemon will always exist, I hope this helps produce more realistic results than before. It also fixes issues that resulted from special shielding rules surrounding Power-Up Punch and Poison Fang; for example, Scrafty will no longer attempt to bait against Ghost-type Pokemon and will simply use Foul Play instead.
Development Note: When I first started working on this update, I initially made it so Pokemon don’t shield at all until a Charged Move threatens them. That sounds like realistic play, but I quickly realized it would be bad as a tool! The site’s Battle Rating metric evaluates matchups based on HP remaining, so bulkier Pokemon would unintuitively have lower scores since they would be less inclined to use their shields. I then shifted from changing when defenders choose to shield to changing when attackers choose to bait.
Why do baits always succeed in the simulations?
The answer to this goes way back to the foundational designs of PvPoke. PvPoke is based around the “battle timeline” as a tool for visualizing and exploring Pokemon matchups. For each matchup, the simulation solves for one result to display on the battle timeline or reference in other tools like the rankings or team builder. That result needs to be repeatable and shareable.
To arrive at that result, the simulation must make assumptions about the Pokemon (such as moves and IV’s) and player behavior (such as baiting). In this case, the outcome of baiting must be a boolean value—that is, baits must either always succeed or always fail. Always successful baits skew the results in favor of some Pokemon, but the same would be true if baits always failed. The changes described in this article should help find a middle ground.
Optimized Move Timing
Previously, the default simulations didn’t use optimized Charged Move timing although this was available as an advanced setting. (Read more about optimized timing here!) The default simulations now use optimized timing.
This change positively impacts Pokemon with short Fast Moves (like Lock On or Dragon Breath) who now play more optimally against their opponents, and negatively impacts Pokemon with long Fast Moves (like Incinerate), whose opponents now play more optimally against them. It also reduces the number of Fast Move “sneaks” present in the default simulations, which had an impact on pacing and matchup outcomes.
The goal of this change is to remove some asterisks or qualifiers that surround the default simulations. In particular, the optimized move timing setting is generally only discussed when the default simulation produces a different result—and the result with optimized timing is generally considered to be the more correct of the two. Perfectly optimized move timing isn’t representative of typical play, but this change should reduce the need to double check the simulation results or add asterisks to related analysis.
Other Updates & Fixes
In this update, I also made fixes so Pokemon more accurately predict when they’re about to faint and throw available energy accordingly. Previously, many Pokemon would faint with loaded energy. In addition, I also added some edge cases where Pokemon with self-debuffing moves like Close Combat or Wild Charge will wait for their opponent to throw a survivable Charged Move before debuffing themselves. This change should slightly improve results for Pokemon like Zacian.
Developer Note: While testing these updates, I compared results from the old simulations to the new simulations. When the results were significantly different, it was important to evaluate if one Pokemon was playing more correctly, or if the other Pokemon was playing worse.
Through this, I discovered a bug in the old simulations that caused many of Talonflame’s opponents to faint with energy because they were incorrectly predicting they could survive another Fast Move. Some of Talonflame’s wins are now softer wins as a result of these fixes. Sorry, Talonflame! Its ratings are being hit on multiple fronts in this update, but it’s still an excellent Pokemon.
