Comprehensive Guide on GoBattleSim

Submit Feedback or Error
Article by bioweapon


Thanks for using GoBattleSim, a simulator developed by u/biowpn.

Inspiration by u/doublefelix921's BattleSim.

Special thanks to u/Poksreddit whose suggestions shaped what GoBattleSim looks like now.


GoBattleSim is a next-generation Pokemon GO Battle Simulator. Its most distinguishing feature is Multiplayer Parallel Battles. You can add up to 20 total players, with individual lineup(s) for each player. Not only that, GoBattleSim is highly open-ended. You can make up moves and Pokemon and test them out as you like. Last but not least, GoBattleSim has a flexible batch input scheme, which can save you a lot of time for running multiple sims while iterating through parameters.

This guide will walk through all the functionalities of GoBattleSim.


Create Pokemon Lineup

A player can have up to 5 parties. Each party consists of up to 6 Pokemon. The Copies input field tells GoBattleSim how many of the same Pokemon should be created for the party. The other Pokemon specification fields (Level, IVs, etc) are self-explanatory. Selecting "Attacker Basic" in the field to the right of the Pokemon will allow you to input the CP instead of level and IVs. The "No Dodge" setup is displayed by default when selecting the Solo Raid Quick Start, but you can also try "Dodge Charged".

  • You may adjust the Pokemon/Party/Player order by dragging the section.

  • You may copy and paste the specifications of a Pokemon.

If you wish to add a new player, just click the located at the top of the page.

General Settings

There are three Battle Mode: Raid, Gym, PvP.

1. Raid

In a Raid battle, there should be only one player from the opposite team. That player should have only one party. The party should consist of only one Pokémon (which is the Raid Boss) and set revive to false. The Pokémon of that party should have Raid Boss as its role and Defender AI as its strategy.

The time limit should be set to either timelimitRaidMs or timelimitLegendaryRaidMs.

2. Gym

In a Gym battle, each player should have only one party. There should be only one player from the opposite team – the AI player. The AI player’s party consists of 1 to 6 unique Pokémon. The AI player’s party should its revive to false. All Pokémon of that party should have Gym Defender as its role and Defender AI as its strategy.

The time limit should be set to timelimitGymMs.

3. PvP

There is no validation requirement on either team.

If Dodge Bug is set to “Present”, then the Pokemon won’t attempt to dodge if the un-dodged damage would KO it.

Repeat tells GoBattleSim how many random simulations should be performed for the same configuration.

Aggregation tells GoBattleSim how to aggregate the multiple random sims for the same configuration:

  • If set to “Enumerate”, each random sim will be listed out.

  • If set to “Average”, arithmetic averages of selected metrics will be taken to represent a group of random sims.

Interpret the Result

After you input everything correctly, click GO to let GoBattleSim do its work! You will see a summary table after the simulations are completed, with the following metrics:

  • Outcome: “Win” or “Lose”, from the perspective of the Primary team. If it is an averaged sim, it will be the proportion of winning (such as 70%).

  • Duration: The duration of the battle in seconds, excluding arena entry lag and early termination.

  • TDO%: The Opposite team's sum HP lost in percentage of the sum of all opposite Pokemon's max HP.

  • DPS: The aggregated DPS of all players from the Primary team.

  • #Deaths: The grand sum of times of deaths of all Pokemon from the Primary team.

If you want to examine a particular sim in more details, click the info icon. The input section will replay the configuration of that sim. Each Pokemon’s statistics will be presented.

  • HP: The HP left of the Pokemon when it exits the battle.

  • Energy: The Energy of the Pokemon when it exits the battle.

  • TDO: The Total Damage Output of the Pokemon.

  • Duration: The cumulative time this Pokemon is on the field battling.

  • DPS: Damage Per Second.

You may click the Battle Log tab to check the battle log. There won’t be a battle log if it is an aggregated sim.



A PokeQuery is used to filter Pokémon, Moves, and other Pokemon Go objects. It is a generalization of the Pokémon Go in-app search query feature.

The following table summarizes the basic PokeQuery:

PokeQueryFormatMatch Condition
PokeBox$The Pokemon is in some user's box
Species NameXThe Pokemon’s species name contains X
Species DexdThe Pokemon’s dex number equals d
NicknameXThe Pokemon’s nickname contains X
Pokemon TypingXThe typing matches X. For Pokemon, one of its typings matches X.
Pokemon family+XAll Pokemon who can evolve from the Pokemon with name X, including X.
Pokemon can evolveevolveAll Pokemon who can evolve.
Legendary PokemonlegendaryLegendary Pokemon defined in Game Master.
Mythical PokemonmythicalMythical Pokemon defined in Game Master.
Baby PokemonbabyBaby Pokemon.
Move@XThe typing or name of the one of the moves the Pokémon matches X
Fast Move@<f>XThe typing or name of the Fast Move the Pokémon matches X
Charge Move@<c>XThe typing or name of the Charge Move the Pokémon matches X
Both Move@<*>XThe typing or name of both the Fast Move and the Charge Move the Pokémon matches X
Current movescurrentThe move is a current move of the Pokemon
Legacy moveslegacyThe move is a legacy move of the Pokemon
Exclusive movesexclusiveThe move is an exclusive move of the Pokemon
STAB movesstabThe move’s typing matches one the typings of the Pokemon
Raid Boss Tier%nThe Pokemon is or has been a Tier n raid boss
Raid Boss Availability%XThe availability of the raid boss. X can be:
  • current
  • legacy
  • future
  • special
Numerical Values A n ,
A n~m
The value of attribute A equals to n, or is within the range [n, m]. A can be the following supported attributes:
  • cp
  • atkiv
  • defiv
  • stmiv
  • level
  • maxhp
  • dex (can be omitted)
  • baseAtk
  • baseDef
  • baseStm
  • rating
  • duration
  • dws
  • energyDelta

Note: 1. You can also use '-' for range expression, although '~' is preferred because it won't be ambiguous when negative bounds are entered; 2. When you use ranges in the level/IV input fields, the attribute name should be omitted; 3. If a move input field is omitted, it will match all the moves that the Pokemon can learn, equivalent to "current, legacy, exclusive".

Basic PokeQuery can form complex PokeQuery by being combined with logical operators:

Logical OR , : ;
Logical AND & |
Logical NOT !
The precedence is: NOT > AND > OR. You may use parenthesis "("and ")" to override the precedence.
Batch Input Scheme

Multiple configurations from the user input will be parsed if a batching query is detected in some input field. A batching query’s format is as follows:

[Aggregation Type Indicator] [PokeQuery]

There are two kinds of Aggregation Type Indicators:

Aggregation Type IndicatorsDescription

Some examples:

Batching QueryDescription
*$Every Pokemon in the player's PokeBox
*rating4~ & !$Every generic Pokemon (not in the user's PokeBox) whose rating is at least 4
*stab & (current, legacy, exclusive)Every STAB moves that Pokemon has ever learnt
?currentAverage all the current moves of the Pokemon

The ? aggregation type indicator will ask the application to group the simulation results by that input field and take arithmetic average of each metric.

For any input field, the application will first try to find a direct match in the corresponding database. If no direct match is found, then it’ll proceed to treat the input as batching query. If no Aggregation Type Indicator is, then the * aggregation type indicator will be chosen as default.

The Dynamic Pasting Query is used to copy input value from a source which might parse into multiple values under the batching input scheme. It has the following format:

= [Player index]-[Party index]-[Pokemon index]

The index starts with 1. For example, 1-1-1 refers to the first Pokemon of the first Party of the first Player.

About the Author(s)