Pokebattler takes great pride in high simulation accuracy. This article is about the most recent research in Pokemon Go Gym Combat. Simulations are never going to be an exact replica of the real world but we are getting closer and closer every release. The most recent 3.1.0 update to Pokebattler included a few big changes for simulation accuracy that will make a big difference for users of the site. First, an Unknown moveset was added. This chooses a random moveset for each random simulation then averages them together for the best counters for each raid boss when you don’t know what the moves are yet. Secondly, Pokebox raid rankings now automatically use more accurate Bronze Monte Carlo simulations for all users, thanks to the generous donations of my Patreon supporters. This means that 10 random simulations are performed for each Pokemon + boss combination and averaged together. This is significantly more accurate than the single simulation being done before, especially for dodge results. The last and biggest change is the most difficult to see, however, it involves more sophisticated modeling of the charge time for special moves.

Charge Time

First you may be asking, what is charge time? When you use a special, you need to charge it up of course! It’s that blue bar that fills up over time. This takes half a second to do and is best started while you are using a fast move. After you charge up, if you continue to hold down your finger on the screen, your special will automatically cast when it can.

Originally, charge time on special moves was modeled as a 500ms charge time before every move. This penalized multi-bar moves as it adds a flat half a second to every move.  A 2 bar move like Outrage normally takes 3.9 seconds. In the original simulations, Outrage would take 4.4 seconds.  After months of this, /u/dondon151 informed me that you could charge your special move during the previous quick attack. Some quick testing determined this was correct and the extra time was removed.  Fast forward many months and raids are out. Tier 3 raids are mostly solo-able and many high-end players are looking for more accurate times to win.  We gave it a bit of thought, and it turns out that charge moves are somewhere between the 2 simulations or perhaps even worse.

What’s wrong with this picture? First, no human can instantly begin charging their special the split millisecond that the energy is available. On top of that, there is some sort of server lag/energy ping pong typically going on. Let’s go for 250ms as the average response time, with the low end at 100ms and the high end at 400ms.  This is still quite aggressive in my mind but is achievable if you are paying attention.  Third, it turns out there is almost never enough time to charge your move during the prior quick move. Energy appears to be gained from the quick move (and spent from a charge move) when damage is dealt. Or at least that is when the server sends you an energy update. Occasionally there is energy ping pong but that will typically settle down before the next special is ready to go. That means your time to charge a move is duration – damageWindowStart which is less than 500ms charge time + 250ms reaction time in most cases

Modeling Changes

This is the first attempt at accurately modeling this situation and while I am happy with the results so far, I expect people to poke holes in the theory and implementation!

The following changes were made for all strategies

  1. Charge detection time is calculated as a random number of milliseconds between 100 and 400. This gives a relatively fast 250ms on average to start trying to charge the move as soon as you can. Considering that energy is gained at a fairly predictable rate, this seemed reasonable
  2. Charge time is 500ms + charge detection time.
  3. If the charge detection time finishes before the end of the prior move, the player is assumed to immediately begin charging up the charge move after the detection time.
  4. If the charge detection time finishes after the end of the prior move, the player is assumed to have started 1 additional quick attack and will then charge the special move immediately for 500ms

Dragonite Example

Let’s take a look at a detailed Dragonite vs. Entei example from my own Pokebox. Dragon Tail is a move with a 250ms charge window which makes it a good case study. Half the time it should do an extra quick attack and half the time not.

TimeMoveDamageEnergyCurrent Energy
298.4Dragon Tail1399
297.8Fire Fang6312
297.4Dragon Tail13921
296.8Fire Fang6324
296.3Dragon Tail13933
295.1Dragon Tail13942
295Fire Fang6345
294.1Dragon Tail13954
292.9Dragon Tail13963
291.7Fire Fang6366
290.2Outrage95-5016
289.1Fire Fang6319
287.9Dragon Tail13928
286.9Dragon Tail13937
286.1Fire Fang6340
285.8Dragon Tail13949
284.6Dragon Tail13958
281.5Outrage95-508
281.2Overheat834250
277.6Outrage95-500

The first Outrage shows a case where the charge detection time was greater than 250ms. An additional quick attack is done and then a charge attack is done immediately with the entire charge being done during the prior quick attack. This works because the energy bar is full at the start of the attack, you can trigger your quick attack and immediately perform a charge attack. Dragon Tails 1100ms duration easily covers the maximum 900ms we are using for charge time + charge detection time.

The second Outrage shows a case where the charge detection time was less than 250ms. The damage is dealt from the quick move at 15350 ms into the fight.  The special is detected quickly and the charge move begins 110ms later at 15460. 500ms later, the Outrage is fired off at 15960. The damage from Outrage is triggered at 18460. This is just 300 ms before a large Overheat comes in that coincidentally fills up the charge bar to exactly 50 energy.

The third Outrage plays out more simply. There is 900ms to detect that we are full on energy and fire off a charge move which we do for effectively no delay.  Finally we almost gain enough energy for another Outrage but we die before we can get it off.

*Note that the duration between Dragon Pulses on Dragonite looks funny due to Half-Even Rounding. Rest assured that the duration is a constant 1100 ms between them.

Charge Window For Moves

So what does this mean? The table below gives some clues.  Charge Window Ms is calculated as move duration – damage start window Ms. The smaller the Charge Window Ms, the more likely you will not detect that you can do a special move as quickly as you can and you will do an additional auto attack.

  • A time of 250 Ms means 50% of the time the charge bar detection will happen before the end of the prior move and the other 50% of the time after.
  • Anything over 400ms will always detect before the end of the quick move.
  • Anything over 600 ms will sometimes be able to do the entire charge during the quick move.
  • Anything over 900 ms (currently only Confusion) will always be able to charge during the time period.

In short, a larger number means it is easier to charge during the middle of the prior quick move.

NameDuration MsDamage MsCharge Window Ms
Acid800400400
Air Slash12001000200
Astonish1100700400
Bite500300200
Bubble1200750450
Bug Bite500250250
Bullet Punch900300600
Bullet Seed1100850250
Charge Beam1100850250
Confusion16006001000
Counter900700200
Cut500300200
Dragon Breath500300200
Dragon Tail1100850250
Ember1000600400
Extrasensory1100850250
Feint Attack900750150
Fire Fang900640260
Fire Spin1100850250
Frost Breath900450450
Fury Cutter400100300
Hex12001000200
Hidden Power15001100400
Ice Shard1200600600
Infestation1100850250
Iron Tail1100850250
Karate Chop800600200
Lick500200300
Low Kick600300300
Metal Claw700430270
Mud Shot600350250
Mud Slap14001150250
Peck1000450550
Poison Jab800200600
Poison Sting600375225
Pound600340260
Powder Snow1000850150
Psycho Cut600370230
Quick Attack800250550
Razor Leaf1000600400
Rock Smash1300550750
Rock Throw900500400
Scratch500300200
Shadow Claw700250450
Snarl1100850250
Spark700300400
Splash17301030700
Steel Wing800500300
Struggle Bug15001200300
Sucker Punch700300400
Tackle500300200
Thunder Shock600300300
Vine Whip600350250
Volt Switch23001800500
Water Gun500300200
Wing Attack800550250
Zen Headbutt1100850250

Future Work

Modeling charge moves is very tricky to do and I have tried to err on the side of caution in this implementation. I have implemented a strategy that was overall the best across the board but there are localized situations where this could be improved on.

Assumptions:

  1. Using specials as soon as possible is always preferable.
  2. Overfill on energy bar should be avoided at all costs. As seen in the Dragonite example, even a 2 bar move can easily overfill from a large raid boss attack. Dragonite was only 300ms and a couple incoming damage points shy of wasting some energy. This is particularly true for full bar moves as an incoming large damage move can be an enormous energy waste.
  3. By careful avoiding early pre-queuing of quick attacks, charge attacks can be charged during the charge window. This means you don’t use your quick attack until you see whether or not the energy that came in was enough to get you a full energy bar or not!

Some possible improvements:

  1. Multibar moves should probably always do an extra quick attack if it is safe to do so. This allows them to better hide the cast time of the multi bar moves.
  2. Calculating whether losing the 500ms to the charge is better DPS or not. Using Hydro Pump instead of a Water Gun might always be a win regardless.

Summary

Overall I am quite happy with the increased simulation quality for Pokebattler users. The Bronze Monte Carlo results, in particular, should help Pokebox users dramatically. No more weird edge conditions caused by perfect energy use 6 fights in a row!  The increased time to win from the charge time changes makes the solo raid attempts far more realistic.  There is still a lot of work to do to help with this though! It turns out there is a large variation between attempts. The Dragonite fight vs. Entei above is 795.8 seconds on average. But on any particular try it could be 826.6 seconds or it could be 778.2 seconds or anywhere in between or beyond! These aren’t even the best or worst scenarios, just random ones I found by hand. That’s an awfully large window and showing just a single number to represent it is misleading.

TLDR: Counter, Water Gun and Bite are not quite as good as they might seem