"If you're lucky, you might encounter a shiny Pokémon".
Try yourself and see how your next stroll could go!
Tap to check, hold to fast-forward.
Odds are based on rough estimates.
| <div id="catch_screen"> | |
| <div id="encounter"> | |
| <img id="pokemon"/> | |
| <img id="shiny"/> | |
| <canvas id="sparkles" width="256" height="256"></canvas> | |
| <img src="https://github.com/ZeChrales/PogoAssets/blob/master/static_assets/png/sparkle.png?raw=true" id="sparkle"/> | |
| </div> | |
| <select id="pokemons"></select> | |
| <table id="stats"> | |
| <tr> | |
| <td>Encounters:</td> | |
| <td id="encounters_stat"></td> | |
| </tr> | |
| <tr> | |
| <td>Shinies:</td> | |
| <td id="shinies_stat"></td> | |
| </tr> | |
| <tr> | |
| <td>Current streak:</td> | |
| <td id="streak_stat"></td> | |
| </tr> | |
| <tr> | |
| <td>Best streak:</td> | |
| <td id="best_streak_stat"></td> | |
| </tr> | |
| <tr> | |
| <td>Worst streak:</td> | |
| <td id="worst_streak_stat"></td> | |
| </tr> | |
| </table> | |
| <label><input type="checkbox" id="noflash"> No flash | |
| </div> | |
| <div id="flash"></div> | 
| var pokemon_selector = document.getElementById("pokemons"); | |
| var catch_screen = document.getElementById("catch_screen"); | |
| var pokemon = document.getElementById("pokemon"); | |
| var shiny = document.getElementById("shiny"); | |
| var stats = document.getElementById("stats"); | |
| var encounters_stat = document.getElementById("encounters_stat"); | |
| var shinies_stat = document.getElementById("shinies_stat"); | |
| var streak_stat = document.getElementById("streak_stat"); | |
| var worst_streak_stat = document.getElementById("worst_streak_stat"); | |
| var best_streak_stat = document.getElementById("best_streak_stat"); | |
| var flash = document.getElementById("flash"); | |
| // Odds are based on reports from thesilphroad.com and shinyrates.com | |
| // They're instinctively rounded to the nearest power of 2 | |
| var pokemons = { | |
| 1: ["Bulbasaur", 512], | |
| 4: ["Charmander", 512], | |
| 7: ["Squirtle", 512], | |
| 10: ["Caterpie", 512], | |
| 16: ["Pidgey", 512], | |
| 19: ["Rattata", 512], | |
| 23: ["Ekans", 512], | |
| 25: ["Pikachu", 512], | |
| 27: ["Sandshrew", 512], | |
| 29: ["Nidoran ♀", 512], | |
| 32: ["Nidoran ♂", 512], | |
| 41: ["Zubat", 512], | |
| 43: ["Oddish", 512], | |
| 48: ["Venonat", 512], | |
| 50: ["Diglett", 512], | |
| 52: ["Meowth", 512], | |
| 54: ["Psyduck", 512], | |
| 56: ["Mankey", 512], | |
| 58: ["Growlithe", 512], | |
| 60: ["Poliwag", 512], | |
| 63: ["Abra", 512], | |
| 66: ["Machop", 512], | |
| 72: ["Tentacool", 512], | |
| 74: ["Geodude", 512], | |
| 77: ["Ponyta", 512], | |
| 81: ["Magnemite", 512], | |
| 83: ["Farfetch'd", 256], | |
| 86: ["Seel", 512], | |
| 88: ["Grimer", 512], | |
| 90: ["Shellder", 512], | |
| 92: ["Gastly", 512], | |
| 95: ["Onix", 64], | |
| 96: ["Drowzee", 512], | |
| 98: ["Krabby", 512], | |
| 102: ["Exeggcute", 512], | |
| 104: ["Cubone", 512], | |
| 108: ["Lickitung", 64], | |
| 109: ["Koffing", 512], | |
| 111: ["Rhyhorn", 512], | |
| 113: ["Chansey", 64], | |
| 115: ["Kangaskhan", 256], | |
| 116: ["Horsea", 512], | |
| 122: ["Mr. Mime", 256], | |
| 123: ["Scyther", 64], | |
| 126: ["Magmar", 512], | |
| 127: ["Pinsir", 512], | |
| 128: ["Tauros", 256], | |
| 129: ["Magikarp", 512], | |
| 131: ["Lapras", 64], | |
| 133: ["Eevee", 512], | |
| 138: ["Omanyte", 512], | |
| 140: ["Kabuto", 512], | |
| 142: ["Aerodactyl", 64], | |
| 144: ["Articuno", 16], | |
| 145: ["Zapdos", 16], | |
| 146: ["Moltres", 16], | |
| 147: ["Dratini", 512], | |
| 150: ["Mewtwo", 16], | |
| 152: ["Chikorita", 512], | |
| 155: ["Cyndaquil", 512], | |
| 158: ["Totodile", 512], | |
| 161: ["Sentret", 512], | |
| 170: ["Chinchou", 512], | |
| 172: ["Pichu", 64], | |
| 173: ["Cleffa", 64], | |
| 174: ["Igglybuff", 64], | |
| 175: ["Togepi", 64], | |
| 177: ["Natu", 512], | |
| 179: ["Mareep", 512], | |
| 183: ["Marill", 512], | |
| 185: ["Sudowoodo", 512], | |
| 190: ["Aipom", 512], | |
| 191: ["Sunkern", 512], | |
| 193: ["Yanma", 512], | |
| 198: ["Murkrow", 512], | |
| 200: ["Misdreavus", 512], | |
| 202: ["Wobbuffet", 512], | |
| 204: ["Pineco", 64], | |
| 206: ["Dunsparce", 512], | |
| 207: ["Gligar", 64], | |
| 209: ["Snubull", 512], | |
| 213: ["Shuckle", 512], | |
| 215: ["Sneasel", 64], | |
| 216: ["Teddiursa", 512], | |
| 220: ["Swinub", 512], | |
| 225: ["Delibird", 512], | |
| 227: ["Skarmory", 64], | |
| 228: ["Houndour", 512], | |
| 234: ["Stantler", 512], | |
| 238: ["Smoochum", 64], | |
| 239: ["Elekid", 64], | |
| 240: ["Magby", 64], | |
| 246: ["Larvitar", 512], | |
| 249: ["Lugia", 16], | |
| 250: ["Ho-Oh", 16], | |
| 252: ["Treecko", 512], | |
| 255: ["Torchic", 512], | |
| 258: ["Mudkip", 512], | |
| 261: ["Poochyena", 512], | |
| 263: ["Zigzagoon", 512], | |
| 265: ["Wurmple", 512], | |
| 270: ["Lotad", 512], | |
| 276: ["Tailow", 512], | |
| 278: ["Wingull", 512], | |
| 280: ["Ralts", 512], | |
| 287: ["Slakoth", 512], | |
| 290: ["Nincada", 64], | |
| 296: ["Makuhita", 512], | |
| 298: ["Azurill", 64], | |
| 300: ["Skitty", 512], | |
| 302: ["Sableye", 512], | |
| 303: ["Mawile", 64], | |
| 304: ["Aron", 512], | |
| 307: ["Meditite", 512], | |
| 309: ["Electrike", 512], | |
| 311: ["Plusle", 512], | |
| 312: ["Minun", 512], | |
| 313: ["Volbeat", 512], | |
| 314: ["Illumise", 512], | |
| 315: ["Roselia", 512], | |
| 318: ["Carvahna", 512], | |
| 320: ["Wailmer", 512], | |
| 325: ["Spoink", 512], | |
| 327: ["Spinda", 64], | |
| 328: ["Trapinch", 512], | |
| 333: ["Swablu", 512], | |
| 335: ["Zangoose", 512], | |
| 336: ["Seviper", 512], | |
| 337: ["Lunatone", 512], | |
| 338: ["Solrock", 512], | |
| 339: ["Barboach", 512], | |
| 343: ["Baltoy", 512], | |
| 345: ["Lileep", 512], | |
| 347: ["Anorith", 512], | |
| 349: ["Feebas", 64], | |
| 351: ["Castform", 512], | |
| 353: ["Shuppet", 512], | |
| 355: ["Duskull", 512], | |
| 359: ["Absol", 64], | |
| 360: ["Wynaut", 64], | |
| 361: ["Snorunt", 512], | |
| 366: ["Clamperl", 64], | |
| 370: ["Luvdisc", 512], | |
| 371: ["Bagon", 512], | |
| 374: ["Beldum", 512], | |
| 377: ["Regirock", 16], | |
| 378: ["Regice", 16], | |
| 379: ["Registeel", 16], | |
| 380: ["Latias", 16], | |
| 381: ["Latios", 16], | |
| 382: ["Kyogre", 16], | |
| 383: ["Groudon", 16], | |
| 384: ["Rayquaza", 16], | |
| 387: ["Turtwig", 512], | |
| 390: ["Chimchar", 512], | |
| 393: ["Piplup", 512], | |
| 403: ["Shinx", 64], | |
| 406: ["Budew", 64], | |
| 412: ["Burmy", 512], | |
| 425: ["Drifloon", 512], | |
| 427: ["Buneary", 512], | |
| 431: ["Glameow", 512], | |
| 436: ["Bronzor", 64], | |
| 438: ["Bonsly", 64], | |
| 439: ["Mime Jr.", 64], | |
| 440: ["Happiny", 64], | |
| 443: ["Gible", 128], | |
| 447: ["Riolu", 16], | |
| 449: ["Hippopotas", 512], | |
| 451: ["Skorupi", 512], | |
| 453: ["Croagunk", 512], | |
| 459: ["Snover", 512], | |
| 485: ["Heatran", 16], | |
| 487: ["Giratina", 16], | |
| 488: ["Cresselia", 16], | |
| 491: ["Darkrai", 16], | |
| 504: ["Patrat", 512], | |
| 506: ["Lillipup", 512], | |
| 532: ["Timburr", 64], | |
| 572: ["Mincino", 512], | |
| 599: ["Klink", 64], | |
| 638: ["Cobalion", 16], | |
| 640: ["Virizion", 16], | |
| }; | |
| for (var p in pokemons){ | |
| var option = document.createElement("option"); | |
| var number = p; | |
| if (number < 10) number = "00" + number; | |
| else if (number < 100) number = "0" + number; | |
| option.textContent = number + " " + pokemons[p][0]; | |
| option.value = p; | |
| pokemon_selector.appendChild(option); | |
| } | |
| var current, odds, encounters, shinies, streak, worst_streak, best_streak; | |
| var autochecking = false; | |
| var autostarter = null; | |
| var autochecker = null; | |
| var sparkling = false; | |
| var noflash = false; | |
| pokemon.onmousedown = pokemon.ontouchstart = shiny.onmousedown = shiny.ontouchstart = function(e){ | |
| e.preventDefault(); | |
| if (autostarter == null) | |
| autostarter = setTimeout(autocheck, 500); | |
| } | |
| pokemon.onmouseup = pokemon.ontouchend = shiny.onmouseup = shiny.ontouchend = function(){ | |
| if (!autochecking && !sparkling){ | |
| flash.style.transition = "none"; | |
| if (!noflash) flash.style.opacity = 0.4; | |
| setTimeout(reveal, 5); | |
| } | |
| autochecking = false; | |
| clearInterval(autostarter); | |
| clearInterval(autochecker); | |
| autostarter = null; | |
| } | |
| pokemon_selector.onchange = function(){ | |
| current = this.value; | |
| odds = pokemons[current][1]; | |
| if (current < 10) current = "00" + current; | |
| else if (current < 100) current = "0" + current; | |
| pokemon.onload = function(){ pokemon.onmouseup(); }; | |
| if (current != "412"){ | |
| pokemon.src = "https://github.com/ZeChrales/PogoAssets/blob/master/pokemon_icons/pokemon_icon_" + current + "_00.png?raw=true"; | |
| shiny.src = "https://github.com/ZeChrales/PogoAssets/blob/master/pokemon_icons/pokemon_icon_" + current + "_00_shiny.png?raw=true"; | |
| } else { // Burmy | |
| pokemon.src = "https://github.com/ZeChrales/PogoAssets/blob/master/pokemon_icons/pokemon_icon_" + current + "_11.png?raw=true"; | |
| shiny.src = "https://github.com/ZeChrales/PogoAssets/blob/master/pokemon_icons/pokemon_icon_" + current + "_11_shiny.png?raw=true"; | |
| } | |
| encounters = shinies = streak = worst_streak = 0; | |
| best_streak = "-"; | |
| } | |
| pokemon_selector.onchange(); | |
| function autocheck(){ | |
| autochecking = true; | |
| autochecker = setInterval(reveal, 5); | |
| } | |
| function reveal(){ | |
| encounters++; | |
| if (shiny.style.display == "block") streak = 0; | |
| streak++; | |
| if (streak > worst_streak) worst_streak = streak; | |
| if (Math.ceil(Math.random() * odds) == odds){ | |
| shinies++; | |
| sparkling = true; | |
| clearInterval(autochecker); | |
| if (best_streak > streak || best_streak == "-") best_streak = streak; | |
| pokemon.style.display = "none"; | |
| shiny.style.display = "block"; | |
| setTimeout(shine, 400); | |
| } else { | |
| pokemon.style.display = "block"; | |
| shiny.style.display = "none"; | |
| } | |
| encounters_stat.textContent = encounters; | |
| shinies_stat.textContent = shinies; | |
| streak_stat.textContent = streak; | |
| worst_streak_stat.textContent = worst_streak; | |
| best_streak_stat.textContent = best_streak; | |
| flash.style.transition = "opacity 0.4s"; | |
| flash.style.opacity = 0; | |
| } | |
| var sparkle = document.getElementById("sparkle"); | |
| var sparkles = document.getElementById("sparkles"); | |
| var ctx = sparkles.getContext("2d"); | |
| var particles = []; | |
| var drawer; | |
| function addSparkles(){ | |
| for (var i = 0; i < 8; i++) particles.push({ "scale": 1, "radius": 60, "angle": 45 * i }); | |
| } | |
| function drawSparkles(){ | |
| ctx.clearRect(0, 0, 256, 256); | |
| for (p of particles){ | |
| var x = 128 + p.radius * Math.cos(p.angle * Math.PI / 180); | |
| var y = 128 + p.radius * Math.sin(p.angle * Math.PI / 180); | |
| var scaled = Math.max(32 * p.scale, 0); | |
| ctx.drawImage(sparkle, x - scaled / 2, y - scaled / 2, scaled, scaled); | |
| if (p.scale > 0.6) p.scale -= 0.2; | |
| else p.scale -= 0.05; | |
| p.angle -= 5; | |
| p.radius += 5; | |
| } | |
| } | |
| function stopDrawing(){ | |
| clearInterval(drawer); | |
| particles = []; | |
| sparkling = false; | |
| } | |
| function shine(){ | |
| if (!particles.length){ | |
| for (var i = 0; i < 5; i++) setTimeout(addSparkles, i * 100); | |
| drawer = setInterval(drawSparkles, 50); | |
| setTimeout(stopDrawing, 1000); | |
| } | |
| } | |
| document.getElementById("noflash").onchange = function(){ | |
| noflash = this.checked; | |
| } | |
| document.body.onkeydown = function(e){ | |
| e.preventDefault(); | |
| if (e.keyCode == 32 && !sparkling) reveal(); | |
| } | |
| pokemon.oncontextmenu = shiny.oncontextmenu = function(e){ | |
| e.preventDefault(); | |
| e.stopPropagation(); | |
| e.stopImmediatePropagation(); | |
| return false; | |
| } | 
| body { | |
| margin:0; | |
| background: #41740e; | |
| } | |
| #catch_screen { | |
| width: 100%; | |
| height: 412px; | |
| padding-top: 100px; | |
| background: url("https://github.com/ZeChrales/PogoAssets/blob/master/static_assets/png/Parkscene_Background.png?raw=true") center top, url("https://github.com/ZeChrales/PogoAssets/blob/master/static_assets/png/SkyDay.png?raw=true") center top / cover; | |
| text-align: center; | |
| user-select: none; | |
| } | |
| #pokemon, #shiny { | |
| user-select: none; | |
| -webkit-user-select: none; | |
| -webkit-touch-callout: none; | |
| margin: 0 auto 5px auto; | |
| cursor: pointer; | |
| } | |
| #shiny, #sparkle { display: none; } | |
| #encounter { position:relative; } | |
| #sparkles { | |
| position: absolute; | |
| width: 256px; | |
| height: 256px; | |
| top:48px; | |
| left:calc(50% - 128px); | |
| pointer-events: none; | |
| } | |
| #pokemons { | |
| font-size: 16px; | |
| -webkit-appearance: none; | |
| padding: 10px 36px 10px 20px; | |
| border-radius: 20px; | |
| color: white; | |
| background: url("https://github.com/ZeChrales/PogoAssets/blob/master/static_assets/png/Arrow_rounded.png?raw=true") no-repeat center right 16px / 12px 12px, rgba(0, 0, 0, 0.6); | |
| border: none; | |
| outline: none; | |
| margin-bottom: 10px; | |
| cursor: pointer; | |
| } | |
| #stats, label { | |
| color: white; | |
| font-family: Sans-serif; | |
| font-weight: 100; | |
| font-size: 16px; | |
| line-height: 22px; | |
| margin: auto; | |
| text-align: right; | |
| } | |
| label, input[type="checkbox"] { cursor: pointer; } | |
| #stats td:last-child { text-align: left; width: 50px; } | |
| #stats td[colspan="2"] { text-align: center; } | |
| #flash { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| width: 100vw; | |
| height: 100vh; | |
| background: white; | |
| pointer-events:none; | |
| } |