catchemall

Gotta catch 'em all!

Below are all {data.pokemon.length} Pokemon across {data.games.length} games. Play through all generations and catch all catchable pokemon in each. Use the "Set rules" button to pick which games you want to complete.

{#if !data.user}

Log in to save your progress.

{/if}

{caughtCount}/{total} entries caught ({percentage} %)

0 ? caughtCount / total : 0}>
(scrollTop = scrollEl?.scrollTop ?? 0)} class="max-h-[75vh] overflow-auto rounded-xl border border-gray-300" > {#each visibleGames as game (game.id)} {/each} {#if startIndex > 0} {/if} {#each visiblePokemon as pokemon (pokemon.id)} {#each visibleGames as game (game.id)} {@const entry = entryMap.get(pokemon.id)?.get(game.id)} {@const reason = tooltip(entry, game)} {/each} {/each} {#if endIndex < data.pokemon.length} {/if}
Pokemon {game.name}
{pokemon.number} {pokemon.name} {pokemon.type1} {#if pokemon.type2} {pokemon.type2} {/if}
{#if entry && reason === null} toggleCaught(entry.id, e.currentTarget.checked)} /> {:else} {/if}

Set rules

Pick the games you want to catch 'em all in. Only those show up in the table and count towards your progress.

{ return async ({ result, update }) => { await update(); if (result.type === 'success') rulesDialog.close(); }; }} >
{#each gamesByGeneration as [generation, games] (generation)}
draft.has(g.id))} onchange={(e) => { for (const g of games) { if (e.currentTarget.checked) draft.add(g.id); else draft.delete(g.id); } }} /> Gen {generation} {#each games as game (game.id)} {/each}
{/each}