# SurvivorTiers: full data dictionary and method Base URL: https://survivortiers.pages.dev Generated: 2026-10-15T16:54:58Z. Ranking version: definitivo. Game commit the data was built from: a9b21f0. Language of values: `name` is Spanish (the game's names), `nameEn` and `*En` fields are English. ## What the ranking is A fan-made ranking of the 966 Pokémon of PokéSurvivor. Rank 1 is the best. Tiers are fixed-size bands of ranks (table below). It is a model of how well each Pokémon does in the game as the fan site built it, not an official tier list and not a balance statement from the game's author. ## Tiers | Tier | Ranks | Pokémon | Firm Pokémon (≥ 80 % of repeats in this tier) | Median width of the p10–p90 rank range | | --- | --- | --- | --- | --- | | S | 1–30 | 30 | 50 % | 24 | | A | 31–120 | 90 | 68 % | 42 | | B | 121–320 | 200 | 77 % | 70 | | C | 321–620 | 300 | 81 % | 77 | | D | 621–966 | 346 | 91 % | 50 | Firmness: the share of the 2000 repeats in which a Pokémon lands in its own tier. A tier is firm when that share is at least 80 %. ## How the rank is built 1. Three pieces, each a rank: sheet 45 %, sim 30 %, late 25 %. - sheet: a species score from percentiles of four pillars (stats 45 %, moves 25 %, typedef 15 %, size 15 %). Stats are the base stats, moves are the attacks it can learn, type defence is how it takes type-based damage, size is its hitbox. - sim: a bot plays with one attack only, for up to 900 s, with no upgrades, bosses or rifts. It is run once with the starting attack and once with the best attack it can learn. Median seconds of survival give the rank. Seconds scale used on the site: 20 s to 139 s, median 75 s. - late: a late-game formula (v4) in two variants: all shop upgrades maxed, and no shop upgrades. 2. Repeats: 2000 runs of the whole method. Each one shifts the data within its error margin, changes the weight between the sim and late-game pieces, and uses one of 80 assumptions of the late-game model. Final rank = median of the 2000 resulting ranks. 3. Tiers are filled in order of final rank, with fixed sizes. A Pokémon that misses a gate is skipped and waits for the next tier it qualifies for. Gates: S needs the top 40 % on stats; A needs the top 60 % on stats; B needs the top 80 % on stats; S needs attacks of at least 3 different types; a melee starting attack keeps a Pokémon out of S. 4. Agreement: rank correlation of each piece with the final rank: sheet 0.93, simStart 0.7, simBest 0.88, lateMax 0.9, lateFresh 0.89. 5. Flags (bit values in `species.json` `d[7]`): 1 = status effect (burn, poison, slow) not modelled; 2 = melee starting attack; 4 = stats kept it out of its tier; 8 = fewer than three attack types kept it out of S. ## Files ### data/ranking.csv One row per Pokémon, sorted by rank. Columns ending in `_s` are seconds, `pct_*` and `p_*` columns are 0–1 fractions, the rest are ranks, ids or 0/1 flags: - rank, dex, name (English), tier: final rank 1–966, national Pokédex number, English name, tier. - rank_p10, rank_p90: 10th and 90th percentile of the rank over the repeats. p_tier: share of repeats in the tier. p_S: share of repeats in S. - start_move, start_kind, start_median_s: starting attack id, its kind (melee, projectile, beam, nova, ...), median simulated survival in seconds. - best_move, best_median_s: best attack the bot can learn and its median survival; equal to the starting attack when no better one exists. - rank_sim_start, rank_sim_best, rank_v4_max, rank_v4_fresh, rank_sheet: the rank of each single piece. rank_early combines the two sim ranks; rank_late combines the two late-game ranks. phase_gap = rank_late − rank_early (positive means better late than early). - pct_stats, pct_moves, pct_typedef, pct_size: pillar percentiles (0–1). - move_pair: the two attacks used for the coverage trio in the sheet. - shot_dmg_taken, radius, map_reach: model inputs (damage taken from an enemy shot, body radius, reach on the map). - stats_capped, types_capped, status_unmodelled, melee_start: flags as 0/1 (see flags above). attack_types: distinct types among the attacks the species can learn. ### data/pokemon-index.json Array of 966 objects, sorted by dex. Fields: - dex: national Pokédex number. name / nameEn: Spanish and English names. types: type keys, e.g. `["grass","poison"]`. - rarity: gacha star rating 1–5. legendary: boolean. bannerId: gacha banner 1–9 (1 Kanto … 9 Paldea). - w, h: sprite size in pixels. - r: `[rank, tier, p10, p90, firm]`. firm is the percentage of repeats in the tier (0–100, not a fraction). - v: sort values. atk (in-game attack multiplier), hp, spd (speed), ehp (effective HP), rad (body radius) come from the game's Pokédex export. td (type defence), mv (moves), st (stats) are 0–100 percentile scores where 100 is best. ### data/species.json Object with three keys: - sim: `[lo, hi, median]`, the seconds scale and the median of the starting-attack survival (seconds). Here: 20, 139, 75. - statMedian: median of each base stat across the 966 species, in order HP, Attack, Defence, Sp. Atk, Sp. Def, Speed. - d: object keyed by dex (string). Each value is an array: - d[0]: `[stats, moves, typedef, size]` percentiles 0–1. - d[1]: `[sheet, simStart, simBest, lateMax, lateFresh]` ranks. - d[2], d[3]: starting attack id and its median survival seconds. - d[4], d[5]: best attack id and its median survival seconds. - d[6]: `[move, move]`, the two attacks of the coverage pair. - d[7]: flags bitmask (see flags above). - d[8]: official base stats `[HP, Attack, Defence, Sp. Atk, Sp. Def, Speed]`. - d[9]: coverage trio `[super %, neutral %, move ids, attack types 1–3]`. The trio is the strongest attack of each attack type the species can learn (up to three), plus its best boost. super % = share of the 966 species that the trio hits super effectively (multiplier above 1.05). neutral % = share the trio never resists (multiplier at least 0.95). ### data/moves.json Array of 64 attacks and boosts. Fields: - id: move id (kebab-case, English name). name: Spanish name. en: `{name, evolvesTo, needsCard}` in English. - category: Spanish label, one of `cuerpo a cuerpo` (melee), `distancia` (ranged), `estadística` (boost). - tier and rank: move tier (S–D) and position in the move list. score: relative score from the move tier list (higher is better), for moves that have one. - type: type key. kind: attack shape (melee, projectile, beam, nova, aura, orbit, boomerang, mine, meteor, dash, cone, chain, trail, turret, or buff). - evolvesTo / needsCard: level-up card mechanics (a move that evolves into another, and the boost card it needs), or null. - mech: game parameters: `homing` (follows targets), `pierce` (goes through enemies), `count` (number of projectiles). ### data/gachas.json Array of nine banners: gen, name, poolSize, legendaryCount, tiers (Pokémon per tier), sCount, aCount, sPlusARate (percent of the pool in S or A), pullChance (percent chance that a single pull is S or A, ignoring pity guarantees). ### data/meta.json Version, generation time, game commit, tier cut-offs, tier counts, stability per tier, the method weights and gates (`method`), method agreement, the seconds scale, the number of species capped by stats, sprite credits and sprite licence. ## Sprites Sprites are not in the data files. They are served as WebP from jsDelivr: `https://cdn.jsdelivr.net/gh/felipebasurto/survivortiers@main/sprites/.webp`. Each one is credited to its artist; the list is in `data/meta.json` (`credits`) and on the About page. Licence: CC BY-NC 4.0 (https://creativecommons.org/licenses/by-nc/4.0/), from SpriteCollab (https://github.com/PMDCollab/SpriteCollab). Non-commercial use with attribution only. ## Examples ```sh curl -s https://survivortiers.pages.dev/data/pokemon-index.json | jq -r '.[] | select(.r[1] == "S") | .name' # the 30 S tier names curl -s https://survivortiers.pages.dev/data/ranking.csv | python3 -c "import csv,sys; rows=list(csv.DictReader(sys.stdin)); print(sorted(rows, key=lambda r: float(r['start_median_s']))[-1]['name'])" # best starting-attack survival curl -s https://survivortiers.pages.dev/data/gachas.json | jq -r '.[] | "\(.name): \(.sPlusARate) % S or A"' ``` ## Caveats - Tiers are a model with stated assumptions (bot play, no bosses or rifts in the sim, no status effects). Read the flags before trusting a single Pokémon. - The game changes. Check `gameCommit` in `data/meta.json` against the game you care about. - Fan site, not official. Pokémon and its names are trademarks of their owners.