├── .DS_Store ├── .gitignore ├── README.md ├── config_example ├── areas.json ├── config.ini ├── discord.json └── settings.json ├── data ├── area_data │ └── .gitkeep ├── db_data │ └── .gitkeep ├── mon_names │ ├── de.json │ ├── en.json │ ├── es.json │ ├── fr.json │ ├── it.json │ └── pt.json └── osm_data │ └── .gitkeep ├── nests.json ├── nests.py ├── nestwatcher ├── analyze.py ├── area.py ├── config.py ├── discord.py ├── logging.py ├── overpass.py └── queries.py ├── requirements.txt ├── sql ├── nests.sql └── update.sql └── tools.py /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M4d40/nestwatcher/8741b76cd70f3daf5d957d16d9db6225de077cb3/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # ignore existing OSM files 2 | OSM_DATA_*.json 3 | default.ini 4 | .idea 5 | 6 | 7 | # Ignore the data folders 8 | data/area_data/*.csv 9 | data/osm_data/*.json 10 | data/db_data/*.json 11 | data/emotes.json 12 | data/custom_emotes.json 13 | 14 | */__pycache__/* 15 | *test* -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nest Watcher 2 | A Program to analyze nests in your area, save it to a database and send Discord notifications about them. 3 | 4 | ## Links 5 | - [Discord](https://discord.gg/q6MSBg4ugv) for help and keeping up with changes 6 | - [Wiki](https://ccev.github.io/nestwatcher/) to get everything running 7 | -------------------------------------------------------------------------------- /config_example/areas.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "samplecity", 4 | "path": [ 5 | 6 | ] 7 | } 8 | ] -------------------------------------------------------------------------------- /config_example/config.ini: -------------------------------------------------------------------------------- 1 | [Config] 2 | auto_time = True 3 | events = True 4 | hemisphere = north/south 5 | poracle_endpoint = 6 | bot_name = 7 | less_queries = False 8 | pokestop_pokemon = True 9 | i_scan_berlin = False 10 | 11 | [Scanner DB] 12 | scanner = rdm 13 | name = 14 | user = 15 | password = 16 | host = 0.0.0.0 17 | port = 3306 18 | 19 | [Nest DB] 20 | name = 21 | user = 22 | password = 23 | host = 0.0.0.0 24 | port = 3306 25 | 26 | [Geojson] 27 | path = /var/www/html/PMSF/custom/nest.json 28 | default_park_name = Unknown Parkname 29 | stroke = #352BFF 30 | stroke_width = 2 31 | stroke_opacity = 1 32 | fill = #0651FF 33 | fill_opacity = 0.5 34 | 35 | [Discord] 36 | token = 37 | language = en 38 | time_format = %d.%m. %H:%M 39 | tileserver_url = https://tiles.domain.com/ 40 | icon_repo = https://raw.githubusercontent.com/whitewillem/PogoAssets/resized/icons_large/ 41 | -------------------------------------------------------------------------------- /config_example/discord.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "title": "Nest report for {areaname}", 3 | "description": "{nest_entry}", 4 | "timestamp": "{current_time}", 5 | "image": { 6 | "url": "{staticmap}" 7 | } 8 | }, 9 | { 10 | "nest_entry": "{mon_emoji} {mon_name} (~{mon_avg}/hr): **{park_name}**\n", 11 | "sort_by": "mon_avg", 12 | "min_avg": 1, 13 | "ignore_unnamed": false 14 | }] -------------------------------------------------------------------------------- /config_example/settings.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "area": "DEFAULT", 4 | "min_pokemon": 9, 5 | "min_spawnpoints": 2, 6 | "min_average": 0.5, 7 | "min_ratio": 0, 8 | "scan_hours_per_day": 24, 9 | "max_markers": 30, 10 | "discord": null 11 | }, 12 | { 13 | "area": "samplecity", 14 | "min_pokemon": 4, 15 | "discord": "" 16 | } 17 | ] -------------------------------------------------------------------------------- /data/area_data/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M4d40/nestwatcher/8741b76cd70f3daf5d957d16d9db6225de077cb3/data/area_data/.gitkeep -------------------------------------------------------------------------------- /data/db_data/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M4d40/nestwatcher/8741b76cd70f3daf5d957d16d9db6225de077cb3/data/db_data/.gitkeep -------------------------------------------------------------------------------- /data/mon_names/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "1": "Bisasam", 3 | "2": "Bisaknosp", 4 | "3": "Bisaflor", 5 | "4": "Glumanda", 6 | "5": "Glutexo", 7 | "6": "Glurak", 8 | "7": "Schiggy", 9 | "8": "Schillok", 10 | "9": "Turtok", 11 | "10": "Raupy", 12 | "11": "Safcon", 13 | "12": "Smettbo", 14 | "13": "Hornliu", 15 | "14": "Kokuna", 16 | "15": "Bibor", 17 | "16": "Taubsi", 18 | "17": "Tauboga", 19 | "18": "Tauboss", 20 | "19": "Rattfratz", 21 | "20": "Rattikarl", 22 | "21": "Habitak", 23 | "22": "Ibitak", 24 | "23": "Rettan", 25 | "24": "Arbok", 26 | "25": "Pikachu", 27 | "26": "Raichu", 28 | "27": "Sandan", 29 | "28": "Sandamer", 30 | "29": "Nidoran\u2640", 31 | "30": "Nidorina", 32 | "31": "Nidoqueen", 33 | "32": "Nidoran\u2642", 34 | "33": "Nidorino", 35 | "34": "Nidoking", 36 | "35": "Piepi", 37 | "36": "Pixi", 38 | "37": "Vulpix", 39 | "38": "Vulnona", 40 | "39": "Pummeluff", 41 | "40": "Knuddeluff", 42 | "41": "Zubat", 43 | "42": "Golbat", 44 | "43": "Myrapla", 45 | "44": "Duflor", 46 | "45": "Giflor", 47 | "46": "Paras", 48 | "47": "Parasek", 49 | "48": "Bluzuk", 50 | "49": "Omot", 51 | "50": "Digda", 52 | "51": "Digdri", 53 | "52": "Mauzi", 54 | "53": "Snobilikat", 55 | "54": "Enton", 56 | "55": "Entoron", 57 | "56": "Menki", 58 | "57": "Rasaff", 59 | "58": "Fukano", 60 | "59": "Arkani", 61 | "60": "Quapsel", 62 | "61": "Quaputzi", 63 | "62": "Quappo", 64 | "63": "Abra", 65 | "64": "Kadabra", 66 | "65": "Simsala", 67 | "66": "Machollo", 68 | "67": "Maschock", 69 | "68": "Machomei", 70 | "69": "Knofensa", 71 | "70": "Ultrigaria", 72 | "71": "Sarzenia", 73 | "72": "Tentacha", 74 | "73": "Tentoxa", 75 | "74": "Kleinstein", 76 | "75": "Georok", 77 | "76": "Geowaz", 78 | "77": "Ponita", 79 | "78": "Gallopa", 80 | "79": "Flegmon", 81 | "80": "Lahmus", 82 | "81": "Magnetilo", 83 | "82": "Magneton", 84 | "83": "Porenta", 85 | "84": "Dodu", 86 | "85": "Dodri", 87 | "86": "Jurob", 88 | "87": "Jugong", 89 | "88": "Sleima", 90 | "89": "Sleimok", 91 | "90": "Muschas", 92 | "91": "Austos", 93 | "92": "Nebulak", 94 | "93": "Alpollo", 95 | "94": "Gengar", 96 | "95": "Onix", 97 | "96": "Traumato", 98 | "97": "Hypno", 99 | "98": "Krabby", 100 | "99": "Kingler", 101 | "100": "Voltobal", 102 | "101": "Lektrobal", 103 | "102": "Owei", 104 | "103": "Kokowei", 105 | "104": "Tragosso", 106 | "105": "Knogga", 107 | "106": "Kicklee", 108 | "107": "Nockchan", 109 | "108": "Schlurp", 110 | "109": "Smogon", 111 | "110": "Smogmog", 112 | "111": "Rihorn", 113 | "112": "Rizeros", 114 | "113": "Chaneira", 115 | "114": "Tangela", 116 | "115": "Kangama", 117 | "116": "Seeper", 118 | "117": "Seemon", 119 | "118": "Goldini", 120 | "119": "Golking", 121 | "120": "Sterndu", 122 | "121": "Starmie", 123 | "122": "Pantimos", 124 | "123": "Sichlor", 125 | "124": "Rossana", 126 | "125": "Elektek", 127 | "126": "Magmar", 128 | "127": "Pinsir", 129 | "128": "Tauros", 130 | "129": "Karpador", 131 | "130": "Garados", 132 | "131": "Lapras", 133 | "132": "Ditto", 134 | "133": "Evoli", 135 | "134": "Aquana", 136 | "135": "Blitza", 137 | "136": "Flamara", 138 | "137": "Porygon", 139 | "138": "Amonitas", 140 | "139": "Amoroso", 141 | "140": "Kabuto", 142 | "141": "Kabutops", 143 | "142": "Aerodactyl", 144 | "143": "Relaxo", 145 | "144": "Arktos", 146 | "145": "Zapdos", 147 | "146": "Lavados", 148 | "147": "Dratini", 149 | "148": "Dragonir", 150 | "149": "Dragoran", 151 | "150": "Mewtu", 152 | "151": "Mew", 153 | "152": "Endivie", 154 | "153": "Lorblatt", 155 | "154": "Meganie", 156 | "155": "Feurigel", 157 | "156": "Igelavar", 158 | "157": "Tornupto", 159 | "158": "Karnimani", 160 | "159": "Tyracroc", 161 | "160": "Impergator", 162 | "161": "Wiesor", 163 | "162": "Wiesenior", 164 | "163": "Hoothoot", 165 | "164": "Noctuh", 166 | "165": "Ledyba", 167 | "166": "Ledian", 168 | "167": "Webarak", 169 | "168": "Ariados", 170 | "169": "Iksbat", 171 | "170": "Lampi", 172 | "171": "Lanturn", 173 | "172": "Pichu", 174 | "173": "Pii", 175 | "174": "Fluffeluff", 176 | "175": "Togepi", 177 | "176": "Togetic", 178 | "177": "Natu", 179 | "178": "Xatu", 180 | "179": "Voltilamm", 181 | "180": "Waaty", 182 | "181": "Ampharos", 183 | "182": "Blubella", 184 | "183": "Marill", 185 | "184": "Azumarill", 186 | "185": "Mogelbaum", 187 | "186": "Quaxo", 188 | "187": "Hoppspross", 189 | "188": "Hubelupf", 190 | "189": "Papungha", 191 | "190": "Griffel", 192 | "191": "Sonnkern", 193 | "192": "Sonnflora", 194 | "193": "Yanma", 195 | "194": "Felino", 196 | "195": "Morlord", 197 | "196": "Psiana", 198 | "197": "Nachtara", 199 | "198": "Kramurx", 200 | "199": "Laschoking", 201 | "200": "Traunfugil", 202 | "201": "Icognito", 203 | "202": "Woingenau", 204 | "203": "Girafarig", 205 | "204": "Tannza", 206 | "205": "Forstellka", 207 | "206": "Dummisel", 208 | "207": "Skorgla", 209 | "208": "Stahlos", 210 | "209": "Snubbull", 211 | "210": "Granbull", 212 | "211": "Baldorfish", 213 | "212": "Scherox", 214 | "213": "Pottrott", 215 | "214": "Skaraborn", 216 | "215": "Sniebel", 217 | "216": "Teddiursa", 218 | "217": "Ursaring", 219 | "218": "Schneckmag", 220 | "219": "Magcargo", 221 | "220": "Quiekel", 222 | "221": "Keifel", 223 | "222": "Corasonn", 224 | "223": "Remoraid", 225 | "224": "Octillery", 226 | "225": "Botogel", 227 | "226": "Mantax", 228 | "227": "Panzaeron", 229 | "228": "Hunduster", 230 | "229": "Hundemon", 231 | "230": "Seedraking", 232 | "231": "Phanpy", 233 | "232": "Donphan", 234 | "233": "Porygon2", 235 | "234": "Damhirplex", 236 | "235": "Farbeagle", 237 | "236": "Rabauz", 238 | "237": "Kapoera", 239 | "238": "Kussilla", 240 | "239": "Elekid", 241 | "240": "Magby", 242 | "241": "Miltank", 243 | "242": "Heiteira", 244 | "243": "Raikou", 245 | "244": "Entei", 246 | "245": "Suicune", 247 | "246": "Larvitar", 248 | "247": "Pupitar", 249 | "248": "Despotar", 250 | "249": "Lugia", 251 | "250": "Ho-Oh", 252 | "251": "Celebi", 253 | "252": "Geckarbor", 254 | "253": "Reptain", 255 | "254": "Gewaldro", 256 | "255": "Flemmli", 257 | "256": "Jungglut", 258 | "257": "Lohgock", 259 | "258": "Hydropi", 260 | "259": "Moorabbel", 261 | "260": "Sumpex", 262 | "261": "Fiffyen", 263 | "262": "Magnayen", 264 | "263": "Zigzachs", 265 | "264": "Geradaks", 266 | "265": "Waumpel", 267 | "266": "Schaloko", 268 | "267": "Papinella", 269 | "268": "Panekon", 270 | "269": "Pudox", 271 | "270": "Loturzel", 272 | "271": "Lombrero", 273 | "272": "Kappalores", 274 | "273": "Samurzel", 275 | "274": "Blanas", 276 | "275": "Tengulist", 277 | "276": "Schwalbini", 278 | "277": "Schwalboss", 279 | "278": "Wingull", 280 | "279": "Pelipper", 281 | "280": "Trasla", 282 | "281": "Kirlia", 283 | "282": "Guardevoir", 284 | "283": "Gehweiher", 285 | "284": "Maskeregen", 286 | "285": "Knilz", 287 | "286": "Kapilz", 288 | "287": "Bummelz", 289 | "288": "Muntier", 290 | "289": "Letarking", 291 | "290": "Nincada", 292 | "291": "Ninjask", 293 | "292": "Ninjatom", 294 | "293": "Flurmel", 295 | "294": "Krakeelo", 296 | "295": "Krawumms", 297 | "296": "Makuhita", 298 | "297": "Hariyama", 299 | "298": "Azurill", 300 | "299": "Nasgnet", 301 | "300": "Eneco", 302 | "301": "Enekoro", 303 | "302": "Zobiris", 304 | "303": "Flunkifer", 305 | "304": "Stollunior", 306 | "305": "Stollrak", 307 | "306": "Stolloss", 308 | "307": "Meditie", 309 | "308": "Meditalis", 310 | "309": "Frizelbliz", 311 | "310": "Voltenso", 312 | "311": "Plusle", 313 | "312": "Minun", 314 | "313": "Volbeat", 315 | "314": "Illumise", 316 | "315": "Roselia", 317 | "316": "Schluppuck", 318 | "317": "Schlukwech", 319 | "318": "Kanivanha", 320 | "319": "Tohaido", 321 | "320": "Wailmer", 322 | "321": "Wailord", 323 | "322": "Camaub", 324 | "323": "Camerupt", 325 | "324": "Qurtel", 326 | "325": "Spoink", 327 | "326": "Groink", 328 | "327": "Pandir", 329 | "328": "Knacklion", 330 | "329": "Vibrava", 331 | "330": "Libelldra", 332 | "331": "Tuska", 333 | "332": "Noktuska", 334 | "333": "Wablu", 335 | "334": "Altaria", 336 | "335": "Sengo", 337 | "336": "Vipitis", 338 | "337": "Lunastein", 339 | "338": "Sonnfel", 340 | "339": "Schmerbe", 341 | "340": "Welsar", 342 | "341": "Krebscorps", 343 | "342": "Krebutack", 344 | "343": "Puppance", 345 | "344": "Lepumentas", 346 | "345": "Liliep", 347 | "346": "Wielie", 348 | "347": "Anorith", 349 | "348": "Armaldo", 350 | "349": "Barschwa", 351 | "350": "Milotic", 352 | "351": "Formeo", 353 | "352": "Kecleon", 354 | "353": "Shuppet", 355 | "354": "Banette", 356 | "355": "Zwirrlicht", 357 | "356": "Zwirrklop", 358 | "357": "Tropius", 359 | "358": "Palimpalim", 360 | "359": "Absol", 361 | "360": "Isso", 362 | "361": "Schneppke", 363 | "362": "Firnontor", 364 | "363": "Seemops", 365 | "364": "Seejong", 366 | "365": "Walraisa", 367 | "366": "Perlu", 368 | "367": "Aalabyss", 369 | "368": "Saganabyss", 370 | "369": "Relicanth", 371 | "370": "Liebiskus", 372 | "371": "Kindwurm", 373 | "372": "Draschel", 374 | "373": "Brutalanda", 375 | "374": "Tanhel", 376 | "375": "Metang", 377 | "376": "Metagross", 378 | "377": "Regirock", 379 | "378": "Regice", 380 | "379": "Registeel", 381 | "380": "Latias", 382 | "381": "Latios", 383 | "382": "Kyogre", 384 | "383": "Groudon", 385 | "384": "Rayquaza", 386 | "385": "Jirachi", 387 | "386": "Deoxys", 388 | "387": "Chelast", 389 | "388": "Chelcarain", 390 | "389": "Chelterrar", 391 | "390": "Panflam", 392 | "391": "Panpyro", 393 | "392": "Panferno", 394 | "393": "Plinfa", 395 | "394": "Pliprin", 396 | "395": "Impoleon", 397 | "396": "Staralili", 398 | "397": "Staravia", 399 | "398": "Staraptor", 400 | "399": "Bidiza", 401 | "400": "Bidifas", 402 | "401": "Zirpurze", 403 | "402": "Zirpeise", 404 | "403": "Sheinux", 405 | "404": "Luxio", 406 | "405": "Luxtra", 407 | "406": "Knospi", 408 | "407": "Roserade", 409 | "408": "Koknodon", 410 | "409": "Rameidon", 411 | "410": "Schilterus", 412 | "411": "Bollterus", 413 | "412": "Burmy", 414 | "413": "Burmadame", 415 | "414": "Moterpel", 416 | "415": "Wadribie", 417 | "416": "Honweisel", 418 | "417": "Pachirisu", 419 | "418": "Bamelin", 420 | "419": "Bojelin", 421 | "420": "Kikugi", 422 | "421": "Kinoso", 423 | "422": "Schalellos", 424 | "423": "Gastrodon", 425 | "424": "Ambidiffel", 426 | "425": "Driftlon", 427 | "426": "Drifzepeli", 428 | "427": "Haspiror", 429 | "428": "Schlapor", 430 | "429": "Traunmagil", 431 | "430": "Kramshef", 432 | "431": "Charmian", 433 | "432": "Shnurgarst", 434 | "433": "Klingplim", 435 | "434": "Skunkapuh", 436 | "435": "Skuntank", 437 | "436": "Bronzel", 438 | "437": "Bronzong", 439 | "438": "Mobai", 440 | "439": "Pantimimi", 441 | "440": "Wonneira", 442 | "441": "Plaudagei", 443 | "442": "Kryppuk", 444 | "443": "Kaumalat", 445 | "444": "Knarksel", 446 | "445": "Knakrack", 447 | "446": "Mampfaxo", 448 | "447": "Riolu", 449 | "448": "Lucario", 450 | "449": "Hippopotas", 451 | "450": "Hippoterus", 452 | "451": "Pionskora", 453 | "452": "Piondragi", 454 | "453": "Glibunkel", 455 | "454": "Toxiquak", 456 | "455": "Venuflibis", 457 | "456": "Finneon", 458 | "457": "Lumineon", 459 | "458": "Mantirps", 460 | "459": "Shnebedeck", 461 | "460": "Rexblisar", 462 | "461": "Snibunna", 463 | "462": "Magnezone", 464 | "463": "Schlurplek", 465 | "464": "Rihornior", 466 | "465": "Tangoloss", 467 | "466": "Elevoltek", 468 | "467": "Magbrant", 469 | "468": "Togekiss", 470 | "469": "Yanmega", 471 | "470": "Folipurba", 472 | "471": "Glaziola", 473 | "472": "Skorgro", 474 | "473": "Mamutel", 475 | "474": "Porygon-Z", 476 | "475": "Galagladi", 477 | "476": "Voluminas", 478 | "477": "Zwirrfinst", 479 | "478": "Frosdedje", 480 | "479": "Rotom", 481 | "480": "Selfe", 482 | "481": "Vesprit", 483 | "482": "Tobutz", 484 | "483": "Dialga", 485 | "484": "Palkia", 486 | "485": "Heatran", 487 | "486": "Regigigas", 488 | "487": "Giratina", 489 | "488": "Cresselia", 490 | "489": "Phione", 491 | "490": "Manaphy", 492 | "491": "Darkrai", 493 | "492": "Shaymin", 494 | "493": "Arceus", 495 | "494": "Victini", 496 | "495": "Serpifeu", 497 | "496": "Efoserp", 498 | "497": "Serpiroyal", 499 | "498": "Floink", 500 | "499": "Ferkokel", 501 | "500": "Flambirex", 502 | "501": "Ottaro", 503 | "502": "Zwottronin", 504 | "503": "Admurai", 505 | "504": "Nagelotz", 506 | "505": "Kukmarda", 507 | "506": "Yorkleff", 508 | "507": "Terribark", 509 | "508": "Bissbark", 510 | "509": "Felilou", 511 | "510": "Kleoparda", 512 | "511": "Vegimak", 513 | "512": "Vegichita", 514 | "513": "Grillmak", 515 | "514": "Grillchita", 516 | "515": "Sodamak", 517 | "516": "Sodachita", 518 | "517": "Somniam", 519 | "518": "Somnivora", 520 | "519": "Dusselgurr", 521 | "520": "Navitaub", 522 | "521": "Fasasnob", 523 | "522": "Elezeba", 524 | "523": "Zebritz", 525 | "524": "Kiesling", 526 | "525": "Sedimantur", 527 | "526": "Brockoloss", 528 | "527": "Fleknoil", 529 | "528": "Fletiamo", 530 | "529": "Rotomurf", 531 | "530": "Stalobor", 532 | "531": "Ohrdoch", 533 | "532": "Praktibalk", 534 | "533": "Strepoli", 535 | "534": "Meistagrif", 536 | "535": "Schallquap", 537 | "536": "Mebrana", 538 | "537": "Branawarz", 539 | "538": "Jiutesto", 540 | "539": "Karadonis", 541 | "540": "Strawickl", 542 | "541": "Folikon", 543 | "542": "Matrifol", 544 | "543": "Toxiped", 545 | "544": "Rollum", 546 | "545": "Cerapendra", 547 | "546": "Waumboll", 548 | "547": "Elfun", 549 | "548": "Lilminip", 550 | "549": "Dressella", 551 | "550": "Barschuft", 552 | "551": "Ganovil", 553 | "552": "Rokkaiman", 554 | "553": "Rabigator", 555 | "554": "Flampion", 556 | "555": "Flampivian", 557 | "556": "Maracamba", 558 | "557": "Lithomith", 559 | "558": "Castellith", 560 | "559": "Zurrokex", 561 | "560": "Irokex", 562 | "561": "Symvolara", 563 | "562": "Makabaja", 564 | "563": "Echnatoll", 565 | "564": "Galapaflos", 566 | "565": "Karippas", 567 | "566": "Flapteryx", 568 | "567": "Aeropteryx", 569 | "568": "Unrat\u00fctox", 570 | "569": "Deponitox", 571 | "570": "Zorua", 572 | "571": "Zoroark", 573 | "572": "Picochilla", 574 | "573": "Chillabell", 575 | "574": "Mollimorba", 576 | "575": "Hypnomorba", 577 | "576": "Morbitesse", 578 | "577": "Monozyto", 579 | "578": "Mitodos", 580 | "579": "Zytomega", 581 | "580": "Piccolente", 582 | "581": "Swaroness", 583 | "582": "Gelatini", 584 | "583": "Gelatroppo", 585 | "584": "Gelatwino", 586 | "585": "Sesokitz", 587 | "586": "Kronjuwild", 588 | "587": "Emolga", 589 | "588": "Laukaps", 590 | "589": "Cavalanzas", 591 | "590": "Tarnpignon", 592 | "591": "Hutsassa", 593 | "592": "Quabbel", 594 | "593": "Apoquallyp", 595 | "594": "Mamolida", 596 | "595": "Wattzapf", 597 | "596": "Voltula", 598 | "597": "Kastadur", 599 | "598": "Tentantel", 600 | "599": "Klikk", 601 | "600": "Kliklak", 602 | "601": "Klikdiklak", 603 | "602": "Zapplardin", 604 | "603": "Zapplalek", 605 | "604": "Zapplarang", 606 | "605": "Pygraulon", 607 | "606": "Megalon", 608 | "607": "Lichtel", 609 | "608": "Laternecto", 610 | "609": "Skelabra", 611 | "610": "Milza", 612 | "611": "Sharfax", 613 | "612": "Maxax", 614 | "613": "Petznief", 615 | "614": "Siberio", 616 | "615": "Frigometri", 617 | "616": "Schnuthelm", 618 | "617": "Hydragil", 619 | "618": "Flunschlik", 620 | "619": "Lin-Fu", 621 | "620": "Wie-Shu", 622 | "621": "Shardrago", 623 | "622": "Golbit", 624 | "623": "Golgantes", 625 | "624": "Gladiantri", 626 | "625": "Caesurio", 627 | "626": "Bisofank", 628 | "627": "Geronimatz", 629 | "628": "Washakwil", 630 | "629": "Skallyk", 631 | "630": "Grypheldis", 632 | "631": "Furnifra\u00df", 633 | "632": "Fermicula", 634 | "633": "Kapuno", 635 | "634": "Duodino", 636 | "635": "Trikephalo", 637 | "636": "Ignivor", 638 | "637": "Ramoth", 639 | "638": "Kobalium", 640 | "639": "Terrakium", 641 | "640": "Viridium", 642 | "641": "Boreos", 643 | "642": "Voltolos", 644 | "643": "Reshiram", 645 | "644": "Zekrom", 646 | "645": "Demeteros", 647 | "646": "Kyurem", 648 | "647": "Keldeo", 649 | "648": "Meloetta", 650 | "649": "Genesect", 651 | "650": "Igamaro", 652 | "651": "Igastarnish", 653 | "652": "Brigaron", 654 | "653": "Fynx", 655 | "654": "Rutena", 656 | "655": "Fennexis", 657 | "656": "Froxy", 658 | "657": "Amphizel", 659 | "658": "Quajutsu", 660 | "659": "Scoppel", 661 | "660": "Grebbit", 662 | "661": "Dartiri", 663 | "662": "Dartignis", 664 | "663": "Fiaro", 665 | "664": "Purmel", 666 | "665": "Puponcho", 667 | "666": "Vivillon", 668 | "667": "Leufeo", 669 | "668": "Pyroleo", 670 | "669": "Flab\u00e9b\u00e9", 671 | "670": "FLOETTE", 672 | "671": "Florges", 673 | "672": "M\u00e4hikel", 674 | "673": "Chevrumm", 675 | "674": "Pam-Pam", 676 | "675": "Pandagro", 677 | "676": "Coiffwaff", 678 | "677": "Psiau", 679 | "678": "Psiaugon", 680 | "679": "Gramokles", 681 | "680": "Duokles", 682 | "681": "Durengard", 683 | "682": "Parfi", 684 | "683": "Parfinesse", 685 | "684": "Flauschling", 686 | "685": "Sabbaione", 687 | "686": "Iscalar", 688 | "687": "Calamanero", 689 | "688": "Bithora", 690 | "689": "Thanathora", 691 | "690": "Algitt", 692 | "691": "Tandrak", 693 | "692": "Scampisto", 694 | "693": "Wummer", 695 | "694": "Eguana", 696 | "695": "Elezard", 697 | "696": "Balgoras", 698 | "697": "Monargoras", 699 | "698": "Amarino", 700 | "699": "Amagarga", 701 | "700": "Feelinara", 702 | "701": "Resladero", 703 | "702": "DEDENNE", 704 | "703": "Rocara", 705 | "704": "Viscora", 706 | "705": "Viscargot", 707 | "706": "Viscogon", 708 | "707": "Clavion", 709 | "708": "Paragoni", 710 | "709": "Trombork", 711 | "710": "Irrbis", 712 | "711": "Pumpdjinn", 713 | "712": "Arktip", 714 | "713": "Arktilas", 715 | "714": "eF-eM", 716 | "715": "UHaFnir", 717 | "716": "Xerneas", 718 | "717": "Yveltal", 719 | "718": "Zygarde", 720 | "719": "Diancie", 721 | "720": "Hoopa", 722 | "721": "Volcanion", 723 | "722": "Bauz", 724 | "723": "Arboretoss", 725 | "724": "Silvarro", 726 | "725": "Flamiau", 727 | "726": "Miezunder", 728 | "727": "Fuegro", 729 | "728": "Robball", 730 | "729": "Marikeck", 731 | "730": "Primarene", 732 | "731": "Peppeck", 733 | "732": "Trompeck", 734 | "733": "Tukanon", 735 | "734": "Mangunior", 736 | "735": "Manguspektor", 737 | "736": "Mabula", 738 | "737": "Akkup", 739 | "738": "Donarion", 740 | "739": "Krabbox", 741 | "740": "Krawell", 742 | "741": "Choreogel", 743 | "742": "Wommel", 744 | "743": "Bandelby", 745 | "744": "Wuffels", 746 | "745": "Wolwerock", 747 | "746": "Lusardin", 748 | "747": "Garstella", 749 | "748": "Aggrostella", 750 | "749": "Pampuli", 751 | "750": "Pampross", 752 | "751": "Araqua", 753 | "752": "Aranestro", 754 | "753": "Imantis", 755 | "754": "Mantidea", 756 | "755": "Bubungus", 757 | "756": "Lamellux", 758 | "757": "Molunk", 759 | "758": "Amfira", 760 | "759": "Velursi", 761 | "760": "Kosturso", 762 | "761": "Frubberl", 763 | "762": "Frubaila", 764 | "763": "Fruyal", 765 | "764": "Curelei", 766 | "765": "Kommandutan", 767 | "766": "Quartermak", 768 | "767": "Reißlaus", 769 | "768": "Tectass", 770 | "769": "Sankabuh", 771 | "770": "Colossand", 772 | "771": "Gufa", 773 | "772": "Typ:Null", 774 | "773": "Amigento", 775 | "774": "Meteno", 776 | "775": "Koalelu", 777 | "776": "Tortunator", 778 | "777": "Togedemaru", 779 | "778": "Mimigma", 780 | "779": "Knirfish", 781 | "780": "Sen-Long", 782 | "781": "Moruda", 783 | "782": "Miniras", 784 | "783": "Mediras", 785 | "784": "Grandiras", 786 | "785": "Kapu-Riki", 787 | "786": "Kapu-Fala", 788 | "787": "Kapu-Toro", 789 | "788": "Kapu-Kime", 790 | "789": "Cosmog", 791 | "790": "Cosmovum", 792 | "791": "Solgaleo", 793 | "792": "Lunala", 794 | "793": "Anego", 795 | "794": "Masskito", 796 | "795": "Schabelle", 797 | "796": "Voltriant", 798 | "797": "Kaguron", 799 | "798": "Katagami", 800 | "799": "Schlingking", 801 | "800": "Necrozma", 802 | "801": "Magearna", 803 | "802": "Marshadow", 804 | "803": "Venicro", 805 | "804": "Agoyon", 806 | "805": "Muramura", 807 | "806": "Kopplosio", 808 | "807": "Zeraora", 809 | "808": "Meltan", 810 | "809": "Melmetal", 811 | "810": "Chimpep", 812 | "811": "Chimstix", 813 | "812": "Gortrom", 814 | "813": "Hopplo", 815 | "814": "Kickerlo", 816 | "815": "Liberlo", 817 | "816": "Memmeon", 818 | "817": "Phlegleon", 819 | "818": "Intelleon", 820 | "819": "Raffel", 821 | "820": "Schlaraffel", 822 | "821": "Meikro", 823 | "822": "Kranoviz", 824 | "823": "Krarmor", 825 | "824": "Sensect", 826 | "825": "Keradar", 827 | "826": "Maritellit", 828 | "827": "Kleptifux", 829 | "828": "Gaunux", 830 | "829": "Cottini", 831 | "830": "Cottomi", 832 | "831": "Wolly", 833 | "832": "Zwollock", 834 | "833": "Kamehaps", 835 | "834": "Kamalm", 836 | "835": "Voldi", 837 | "836": "Bellektro", 838 | "837": "Klonkett", 839 | "838": "Wagong", 840 | "839": "Montecarbo", 841 | "840": "Knapfel", 842 | "841": "Drapfel", 843 | "842": "Schlapfel", 844 | "843": "Salanga", 845 | "844": "Sanaconda", 846 | "845": "Urgl", 847 | "846": "Pikuda", 848 | "847": "Barrakiefa", 849 | "848": "Toxel", 850 | "849": "Riffex", 851 | "850": "Thermopod", 852 | "851": "Infernopod", 853 | "852": "Klopptopus", 854 | "853": "Kaocto", 855 | "854": "Fatalitee", 856 | "855": "Mortipot", 857 | "856": "Brimova", 858 | "857": "Brimano", 859 | "858": "Silembrim", 860 | "859": "Bähmon", 861 | "860": "Pelzebub", 862 | "861": "Olangaar", 863 | "862": "Barrikadax", 864 | "863": "Mauzinger", 865 | "864": "Gorgasonn", 866 | "865": "Lauchzelot", 867 | "866": "Pantifrost", 868 | "867": "Oghnatoll", 869 | "868": "Hokumil", 870 | "869": "Pokusan", 871 | "870": "Legios", 872 | "871": "Britzigel", 873 | "872": "Snomnom", 874 | "873": "Mottineva", 875 | "874": "Humanolith", 876 | "875": "Kubuin", 877 | "876": "Servol", 878 | "877": "Morpeko", 879 | "878": "Kupfanti", 880 | "879": "Patinaraja", 881 | "880": "Lectragon", 882 | "881": "Lecryodon", 883 | "882": "Pescragon", 884 | "883": "Pescryodon", 885 | "884": "Duraludon", 886 | "885": "Grolldra", 887 | "886": "Phandra", 888 | "887": "Katapuldra", 889 | "888": "Zacian", 890 | "889": "Zamazenta", 891 | "890": "Endynalos", 892 | "891": "Dakuma", 893 | "892": "Wulaosu", 894 | "893": "Zarude", 895 | "894": "Regieleki", 896 | "895": "Regidrago", 897 | "896": "Polaross", 898 | "897": "Phantoross", 899 | "898": "Coronospa" 900 | } 901 | -------------------------------------------------------------------------------- /data/mon_names/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "1": "Bulbasaur", 3 | "2": "Ivysaur", 4 | "3": "Venusaur", 5 | "4": "Charmander", 6 | "5": "Charmeleon", 7 | "6": "Charizard", 8 | "7": "Squirtle", 9 | "8": "Wartortle", 10 | "9": "Blastoise", 11 | "10": "Caterpie", 12 | "11": "Metapod", 13 | "12": "Butterfree", 14 | "13": "Weedle", 15 | "14": "Kakuna", 16 | "15": "Beedrill", 17 | "16": "Pidgey", 18 | "17": "Pidgeotto", 19 | "18": "Pidgeot", 20 | "19": "Rattata", 21 | "20": "Raticate", 22 | "21": "Spearow", 23 | "22": "Fearow", 24 | "23": "Ekans", 25 | "24": "Arbok", 26 | "25": "Pikachu", 27 | "26": "Raichu", 28 | "27": "Sandshrew", 29 | "28": "Sandslash", 30 | "29": "Nidoran\u2640", 31 | "30": "Nidorina", 32 | "31": "Nidoqueen", 33 | "32": "Nidoran\u2642", 34 | "33": "Nidorino", 35 | "34": "Nidoking", 36 | "35": "Clefairy", 37 | "36": "Clefable", 38 | "37": "Vulpix", 39 | "38": "Ninetales", 40 | "39": "Jigglypuff", 41 | "40": "Wigglytuff", 42 | "41": "Zubat", 43 | "42": "Golbat", 44 | "43": "Oddish", 45 | "44": "Gloom", 46 | "45": "Vileplume", 47 | "46": "Paras", 48 | "47": "Parasect", 49 | "48": "Venonat", 50 | "49": "Venomoth", 51 | "50": "Diglett", 52 | "51": "Dugtrio", 53 | "52": "Meowth", 54 | "53": "Persian", 55 | "54": "Psyduck", 56 | "55": "Golduck", 57 | "56": "Mankey", 58 | "57": "Primeape", 59 | "58": "Growlithe", 60 | "59": "Arcanine", 61 | "60": "Poliwag", 62 | "61": "Poliwhirl", 63 | "62": "Poliwrath", 64 | "63": "Abra", 65 | "64": "Kadabra", 66 | "65": "Alakazam", 67 | "66": "Machop", 68 | "67": "Machoke", 69 | "68": "Machamp", 70 | "69": "Bellsprout", 71 | "70": "Weepinbell", 72 | "71": "Victreebel", 73 | "72": "Tentacool", 74 | "73": "Tentacruel", 75 | "74": "Geodude", 76 | "75": "Graveler", 77 | "76": "Golem", 78 | "77": "Ponyta", 79 | "78": "Rapidash", 80 | "79": "Slowpoke", 81 | "80": "Slowbro", 82 | "81": "Magnemite", 83 | "82": "Magneton", 84 | "83": "Farfetch'd", 85 | "84": "Doduo", 86 | "85": "Dodrio", 87 | "86": "Seel", 88 | "87": "Dewgong", 89 | "88": "Grimer", 90 | "89": "Muk", 91 | "90": "Shellder", 92 | "91": "Cloyster", 93 | "92": "Gastly", 94 | "93": "Haunter", 95 | "94": "Gengar", 96 | "95": "Onix", 97 | "96": "Drowzee", 98 | "97": "Hypno", 99 | "98": "Krabby", 100 | "99": "Kingler", 101 | "100": "Voltorb", 102 | "101": "Electrode", 103 | "102": "Exeggcute", 104 | "103": "Exeggutor", 105 | "104": "Cubone", 106 | "105": "Marowak", 107 | "106": "Hitmonlee", 108 | "107": "Hitmonchan", 109 | "108": "Lickitung", 110 | "109": "Koffing", 111 | "110": "Weezing", 112 | "111": "Rhyhorn", 113 | "112": "Rhydon", 114 | "113": "Chansey", 115 | "114": "Tangela", 116 | "115": "Kangaskhan", 117 | "116": "Horsea", 118 | "117": "Seadra", 119 | "118": "Goldeen", 120 | "119": "Seaking", 121 | "120": "Staryu", 122 | "121": "Starmie", 123 | "122": "Mr. Mime", 124 | "123": "Scyther", 125 | "124": "Jynx", 126 | "125": "Electabuzz", 127 | "126": "Magmar", 128 | "127": "Pinsir", 129 | "128": "Tauros", 130 | "129": "Magikarp", 131 | "130": "Gyarados", 132 | "131": "Lapras", 133 | "132": "Ditto", 134 | "133": "Eevee", 135 | "134": "Vaporeon", 136 | "135": "Jolteon", 137 | "136": "Flareon", 138 | "137": "Porygon", 139 | "138": "Omanyte", 140 | "139": "Omastar", 141 | "140": "Kabuto", 142 | "141": "Kabutops", 143 | "142": "Aerodactyl", 144 | "143": "Snorlax", 145 | "144": "Articuno", 146 | "145": "Zapdos", 147 | "146": "Moltres", 148 | "147": "Dratini", 149 | "148": "Dragonair", 150 | "149": "Dragonite", 151 | "150": "Mewtwo", 152 | "151": "Mew", 153 | "152": "Chikorita", 154 | "153": "Bayleef", 155 | "154": "Meganium", 156 | "155": "Cyndaquil", 157 | "156": "Quilava", 158 | "157": "Typhlosion", 159 | "158": "Totodile", 160 | "159": "Croconaw", 161 | "160": "Feraligatr", 162 | "161": "Sentret", 163 | "162": "Furret", 164 | "163": "Hoothoot", 165 | "164": "Noctowl", 166 | "165": "Ledyba", 167 | "166": "Ledian", 168 | "167": "Spinarak", 169 | "168": "Ariados", 170 | "169": "Crobat", 171 | "170": "Chinchou", 172 | "171": "Lanturn", 173 | "172": "Pichu", 174 | "173": "Cleffa", 175 | "174": "Igglybuff", 176 | "175": "Togepi", 177 | "176": "Togetic", 178 | "177": "Natu", 179 | "178": "Xatu", 180 | "179": "Mareep", 181 | "180": "Flaaffy", 182 | "181": "Ampharos", 183 | "182": "Bellossom", 184 | "183": "Marill", 185 | "184": "Azumarill", 186 | "185": "Sudowoodo", 187 | "186": "Politoed", 188 | "187": "Hoppip", 189 | "188": "Skiploom", 190 | "189": "Jumpluff", 191 | "190": "Aipom", 192 | "191": "Sunkern", 193 | "192": "Sunflora", 194 | "193": "Yanma", 195 | "194": "Wooper", 196 | "195": "Quagsire", 197 | "196": "Espeon", 198 | "197": "Umbreon", 199 | "198": "Murkrow", 200 | "199": "Slowking", 201 | "200": "Misdreavus", 202 | "201": "Unown", 203 | "202": "Wobbuffet", 204 | "203": "Girafarig", 205 | "204": "Pineco", 206 | "205": "Forretress", 207 | "206": "Dunsparce", 208 | "207": "Gligar", 209 | "208": "Steelix", 210 | "209": "Snubbull", 211 | "210": "Granbull", 212 | "211": "Qwilfish", 213 | "212": "Scizor", 214 | "213": "Shuckle", 215 | "214": "Heracross", 216 | "215": "Sneasel", 217 | "216": "Teddiursa", 218 | "217": "Ursaring", 219 | "218": "Slugma", 220 | "219": "Magcargo", 221 | "220": "Swinub", 222 | "221": "Piloswine", 223 | "222": "Corsola", 224 | "223": "Remoraid", 225 | "224": "Octillery", 226 | "225": "Delibird", 227 | "226": "Mantine", 228 | "227": "Skarmory", 229 | "228": "Houndour", 230 | "229": "Houndoom", 231 | "230": "Kingdra", 232 | "231": "Phanpy", 233 | "232": "Donphan", 234 | "233": "Porygon2", 235 | "234": "Stantler", 236 | "235": "Smeargle", 237 | "236": "Tyrogue", 238 | "237": "Hitmontop", 239 | "238": "Smoochum", 240 | "239": "Elekid", 241 | "240": "Magby", 242 | "241": "Miltank", 243 | "242": "Blissey", 244 | "243": "Raikou", 245 | "244": "Entei", 246 | "245": "Suicune", 247 | "246": "Larvitar", 248 | "247": "Pupitar", 249 | "248": "Tyranitar", 250 | "249": "Lugia", 251 | "250": "Ho-Oh", 252 | "251": "Celebi", 253 | "252": "Treecko", 254 | "253": "Grovyle", 255 | "254": "Sceptile", 256 | "255": "Torchic", 257 | "256": "Combusken", 258 | "257": "Blaziken", 259 | "258": "Mudkip", 260 | "259": "Marshtomp", 261 | "260": "Swampert", 262 | "261": "Poochyena", 263 | "262": "Mightyena", 264 | "263": "Zigzagoon", 265 | "264": "Linoone", 266 | "265": "Wurmple", 267 | "266": "Silcoon", 268 | "267": "Beautifly", 269 | "268": "Cascoon", 270 | "269": "Dustox", 271 | "270": "Lotad", 272 | "271": "Lombre", 273 | "272": "Ludicolo", 274 | "273": "Seedot", 275 | "274": "Nuzleaf", 276 | "275": "Shiftry", 277 | "276": "Taillow", 278 | "277": "Swellow", 279 | "278": "Wingull", 280 | "279": "Pelipper", 281 | "280": "Ralts", 282 | "281": "Kirlia", 283 | "282": "Gardevoir", 284 | "283": "Surskit", 285 | "284": "Masquerain", 286 | "285": "Shroomish", 287 | "286": "Breloom", 288 | "287": "Slakoth", 289 | "288": "Vigoroth", 290 | "289": "Slaking", 291 | "290": "Nincada", 292 | "291": "Ninjask", 293 | "292": "Shedinja", 294 | "293": "Whismur", 295 | "294": "Loudred", 296 | "295": "Exploud", 297 | "296": "Makuhita", 298 | "297": "Hariyama", 299 | "298": "Azurill", 300 | "299": "Nosepass", 301 | "300": "Skitty", 302 | "301": "Delcatty", 303 | "302": "Sableye", 304 | "303": "Mawile", 305 | "304": "Aron", 306 | "305": "Lairon", 307 | "306": "Aggron", 308 | "307": "Meditite", 309 | "308": "Medicham", 310 | "309": "Electrike", 311 | "310": "Manectric", 312 | "311": "Plusle", 313 | "312": "Minun", 314 | "313": "Volbeat", 315 | "314": "Illumise", 316 | "315": "Roselia", 317 | "316": "Gulpin", 318 | "317": "Swalot", 319 | "318": "Carvanha", 320 | "319": "Sharpedo", 321 | "320": "Wailmer", 322 | "321": "Wailord", 323 | "322": "Numel", 324 | "323": "Camerupt", 325 | "324": "Torkoal", 326 | "325": "Spoink", 327 | "326": "Grumpig", 328 | "327": "Spinda", 329 | "328": "Trapinch", 330 | "329": "Vibrava", 331 | "330": "Flygon", 332 | "331": "Cacnea", 333 | "332": "Cacturne", 334 | "333": "Swablu", 335 | "334": "Altaria", 336 | "335": "Zangoose", 337 | "336": "Seviper", 338 | "337": "Lunatone", 339 | "338": "Solrock", 340 | "339": "Barboach", 341 | "340": "Whiscash", 342 | "341": "Corphish", 343 | "342": "Crawdaunt", 344 | "343": "Baltoy", 345 | "344": "Claydol", 346 | "345": "Lileep", 347 | "346": "Cradily", 348 | "347": "Anorith", 349 | "348": "Armaldo", 350 | "349": "Feebas", 351 | "350": "Milotic", 352 | "351": "Castform", 353 | "352": "Kecleon", 354 | "353": "Shuppet", 355 | "354": "Banette", 356 | "355": "Duskull", 357 | "356": "Dusclops", 358 | "357": "Tropius", 359 | "358": "Chimecho", 360 | "359": "Absol", 361 | "360": "Wynaut", 362 | "361": "Snorunt", 363 | "362": "Glalie", 364 | "363": "Spheal", 365 | "364": "Sealeo", 366 | "365": "Walrein", 367 | "366": "Clamperl", 368 | "367": "Huntail", 369 | "368": "Gorebyss", 370 | "369": "Relicanth", 371 | "370": "Luvdisc", 372 | "371": "Bagon", 373 | "372": "Shelgon", 374 | "373": "Salamence", 375 | "374": "Beldum", 376 | "375": "Metang", 377 | "376": "Metagross", 378 | "377": "Regirock", 379 | "378": "Regice", 380 | "379": "Registeel", 381 | "380": "Latias", 382 | "381": "Latios", 383 | "382": "Kyogre", 384 | "383": "Groudon", 385 | "384": "Rayquaza", 386 | "385": "Jirachi", 387 | "386": "Deoxys", 388 | "387": "Turtwig", 389 | "388": "Grotle", 390 | "389": "Torterra", 391 | "390": "Chimchar", 392 | "391": "Monferno", 393 | "392": "Infernape", 394 | "393": "Piplup", 395 | "394": "Prinplup", 396 | "395": "Empoleon", 397 | "396": "Starly", 398 | "397": "Staravia", 399 | "398": "Staraptor", 400 | "399": "Bidoof", 401 | "400": "Bibarel", 402 | "401": "Kricketot", 403 | "402": "Kricketune", 404 | "403": "Shinx", 405 | "404": "Luxio", 406 | "405": "Luxray", 407 | "406": "Budew", 408 | "407": "Roserade", 409 | "408": "Cranidos", 410 | "409": "Rampardos", 411 | "410": "Shieldon", 412 | "411": "Bastiodon", 413 | "412": "Burmy", 414 | "413": "Wormadam", 415 | "414": "Mothim", 416 | "415": "Combee", 417 | "416": "Vespiquen", 418 | "417": "Pachirisu", 419 | "418": "Buizel", 420 | "419": "Floatzel", 421 | "420": "Cherubi", 422 | "421": "Cherrim", 423 | "422": "Shellos", 424 | "423": "Gastrodon", 425 | "424": "Ambipom", 426 | "425": "Drifloon", 427 | "426": "Drifblim", 428 | "427": "Buneary", 429 | "428": "Lopunny", 430 | "429": "Mismagius", 431 | "430": "Honchkrow", 432 | "431": "Glameow", 433 | "432": "Purugly", 434 | "433": "Chingling", 435 | "434": "Stunky", 436 | "435": "Skuntank", 437 | "436": "Bronzor", 438 | "437": "Bronzong", 439 | "438": "Bonsly", 440 | "439": "Mime Jr.", 441 | "440": "Happiny", 442 | "441": "Chatot", 443 | "442": "Spiritomb", 444 | "443": "Gible", 445 | "444": "Gabite", 446 | "445": "Garchomp", 447 | "446": "Munchlax", 448 | "447": "Riolu", 449 | "448": "Lucario", 450 | "449": "Hippopotas", 451 | "450": "Hippowdon", 452 | "451": "Skorupi", 453 | "452": "Drapion", 454 | "453": "Croagunk", 455 | "454": "Toxicroak", 456 | "455": "Carnivine", 457 | "456": "Finneon", 458 | "457": "Lumineon", 459 | "458": "Mantyke", 460 | "459": "Snover", 461 | "460": "Abomasnow", 462 | "461": "Weavile", 463 | "462": "Magnezone", 464 | "463": "Lickilicky", 465 | "464": "Rhyperior", 466 | "465": "Tangrowth", 467 | "466": "Electivire", 468 | "467": "Magmortar", 469 | "468": "Togekiss", 470 | "469": "Yanmega", 471 | "470": "Leafeon", 472 | "471": "Glaceon", 473 | "472": "Gliscor", 474 | "473": "Mamoswine", 475 | "474": "Porygon-Z", 476 | "475": "Gallade", 477 | "476": "Probopass", 478 | "477": "Dusknoir", 479 | "478": "Froslass", 480 | "479": "Rotom", 481 | "480": "Uxie", 482 | "481": "Mesprit", 483 | "482": "Azelf", 484 | "483": "Dialga", 485 | "484": "Palkia", 486 | "485": "Heatran", 487 | "486": "Regigigas", 488 | "487": "Giratina", 489 | "488": "Cresselia", 490 | "489": "Phione", 491 | "490": "Manaphy", 492 | "491": "Darkrai", 493 | "492": "Shaymin", 494 | "493": "Arceus", 495 | "494": "Victini", 496 | "495": "Snivy", 497 | "496": "Servine", 498 | "497": "Serperior", 499 | "498": "Tepig", 500 | "499": "Pignite", 501 | "500": "Emboar", 502 | "501": "Oshawott", 503 | "502": "Dewott", 504 | "503": "Samurott", 505 | "504": "Patrat", 506 | "505": "Watchog", 507 | "506": "Lillipup", 508 | "507": "Herdier", 509 | "508": "Stoutland", 510 | "509": "Purrloin", 511 | "510": "Liepard", 512 | "511": "Pansage", 513 | "512": "Simisage", 514 | "513": "Pansear", 515 | "514": "Simisear", 516 | "515": "Panpour", 517 | "516": "Simipour", 518 | "517": "Munna", 519 | "518": "Musharna", 520 | "519": "Pidove", 521 | "520": "Tranquill", 522 | "521": "Unfezant", 523 | "522": "Blitzle", 524 | "523": "Zebstrika", 525 | "524": "Roggenrola", 526 | "525": "Boldore", 527 | "526": "Gigalith", 528 | "527": "Woobat", 529 | "528": "Swoobat", 530 | "529": "Drilbur", 531 | "530": "Excadrill", 532 | "531": "Audino", 533 | "532": "Timburr", 534 | "533": "Gurdurr", 535 | "534": "Conkeldurr", 536 | "535": "Tympole", 537 | "536": "Palpitoad", 538 | "537": "Seismitoad", 539 | "538": "Throh", 540 | "539": "Sawk", 541 | "540": "Sewaddle", 542 | "541": "Swadloon", 543 | "542": "Leavanny", 544 | "543": "Venipede", 545 | "544": "Whirlipede", 546 | "545": "Scolipede", 547 | "546": "Cottonee", 548 | "547": "Whimsicott", 549 | "548": "Petilil", 550 | "549": "Lilligant", 551 | "550": "Basculin", 552 | "551": "Sandile", 553 | "552": "Krokorok", 554 | "553": "Krookodile", 555 | "554": "Darumaka", 556 | "555": "Darmanitan", 557 | "556": "Maractus", 558 | "557": "Dwebble", 559 | "558": "Crustle", 560 | "559": "Scraggy", 561 | "560": "Scrafty", 562 | "561": "Sigilyph", 563 | "562": "Yamask", 564 | "563": "Cofagrigus", 565 | "564": "Tirtouga", 566 | "565": "Carracosta", 567 | "566": "Archen", 568 | "567": "Archeops", 569 | "568": "Trubbish", 570 | "569": "Garbodor", 571 | "570": "Zorua", 572 | "571": "Zoroark", 573 | "572": "Minccino", 574 | "573": "Cinccino", 575 | "574": "Gothita", 576 | "575": "Gothorita", 577 | "576": "Gothitelle", 578 | "577": "Solosis", 579 | "578": "Duosion", 580 | "579": "Reuniclus", 581 | "580": "Ducklett", 582 | "581": "Swanna", 583 | "582": "Vanillite", 584 | "583": "Vanillish", 585 | "584": "Vanilluxe", 586 | "585": "Deerling", 587 | "586": "Sawsbuck", 588 | "587": "Emolga", 589 | "588": "Karrablast", 590 | "589": "Escavalier", 591 | "590": "Foongus", 592 | "591": "Amoonguss", 593 | "592": "Frillish", 594 | "593": "Jellicent", 595 | "594": "Alomomola", 596 | "595": "Joltik", 597 | "596": "Galvantula", 598 | "597": "Ferroseed", 599 | "598": "Ferrothorn", 600 | "599": "Klink", 601 | "600": "Klang", 602 | "601": "Klinklang", 603 | "602": "Tynamo", 604 | "603": "Eelektrik", 605 | "604": "Eelektross", 606 | "605": "Elgyem", 607 | "606": "Beheeyem", 608 | "607": "Litwick", 609 | "608": "Lampent", 610 | "609": "Chandelure", 611 | "610": "Axew", 612 | "611": "Fraxure", 613 | "612": "Haxorus", 614 | "613": "Cubchoo", 615 | "614": "Beartic", 616 | "615": "Cryogonal", 617 | "616": "Shelmet", 618 | "617": "Accelgor", 619 | "618": "Stunfisk", 620 | "619": "Mienfoo", 621 | "620": "Mienshao", 622 | "621": "Druddigon", 623 | "622": "Golett", 624 | "623": "Golurk", 625 | "624": "Pawniard", 626 | "625": "Bisharp", 627 | "626": "Bouffalant", 628 | "627": "Rufflet", 629 | "628": "Braviary", 630 | "629": "Vullaby", 631 | "630": "Mandibuzz", 632 | "631": "Heatmor", 633 | "632": "Durant", 634 | "633": "Deino", 635 | "634": "Zweilous", 636 | "635": "Hydreigon", 637 | "636": "Larvesta", 638 | "637": "Volcarona", 639 | "638": "Cobalion", 640 | "639": "Terrakion", 641 | "640": "Virizion", 642 | "641": "Tornadus", 643 | "642": "Thundurus", 644 | "643": "Reshiram", 645 | "644": "Zekrom", 646 | "645": "Landorus", 647 | "646": "Kyurem", 648 | "647": "Keldeo", 649 | "648": "Meloetta", 650 | "649": "Genesect", 651 | "650": "Chespin", 652 | "651": "Quilladin", 653 | "652": "Chesnaught", 654 | "653": "Fennekin", 655 | "654": "Braixen", 656 | "655": "Delphox", 657 | "656": "Froakie", 658 | "657": "Frogadier", 659 | "658": "Greninja", 660 | "659": "Bunnelby", 661 | "660": "Diggersby", 662 | "661": "Fletchling", 663 | "662": "Fletchinder", 664 | "663": "Talonflame", 665 | "664": "Scatterbug", 666 | "665": "Spewpa", 667 | "666": "Vivillon", 668 | "667": "Litleo", 669 | "668": "Pyroar", 670 | "669": "Flabebe", 671 | "670": "Floette", 672 | "671": "Florges", 673 | "672": "Skiddo", 674 | "673": "Gogoat", 675 | "674": "Pancham", 676 | "675": "Pangoro", 677 | "676": "Furfrou", 678 | "677": "Espurr", 679 | "678": "Meowstic", 680 | "679": "Honedge", 681 | "680": "Doublade", 682 | "681": "Aegislash", 683 | "682": "Spritzee", 684 | "683": "Aromatisse", 685 | "684": "Swirlix", 686 | "685": "Slurpuff", 687 | "686": "Inkay", 688 | "687": "Malamar", 689 | "688": "Binacle", 690 | "689": "Barbaracle", 691 | "690": "Skrelp", 692 | "691": "Dragalge", 693 | "692": "Clauncher", 694 | "693": "Clawitzer", 695 | "694": "Helioptile", 696 | "695": "Heliolisk", 697 | "696": "Tyrunt", 698 | "697": "Tyrantrum", 699 | "698": "Amaura", 700 | "699": "Aurorus", 701 | "700": "Sylveon", 702 | "701": "Hawlucha", 703 | "702": "Dedenne", 704 | "703": "Carbink", 705 | "704": "Goomy", 706 | "705": "Sliggoo", 707 | "706": "Goodra", 708 | "707": "Klefki", 709 | "708": "Phantump", 710 | "709": "Trevenant", 711 | "710": "Pumpkaboo", 712 | "711": "Gourgeist", 713 | "712": "Bergmite", 714 | "713": "Avalugg", 715 | "714": "Noibat", 716 | "715": "Noivern", 717 | "716": "Xerneas", 718 | "717": "Yveltal", 719 | "718": "Zygarde", 720 | "719": "Diancie", 721 | "720": "Hoopa", 722 | "721": "Volcanion", 723 | "722": "Rowlet", 724 | "723": "Dartrix", 725 | "724": "Decidueye", 726 | "725": "Litten", 727 | "726": "Torracat", 728 | "727": "Incineroar", 729 | "728": "Popplio", 730 | "729": "Brionne", 731 | "730": "Primarina", 732 | "731": "Pikipek", 733 | "732": "Trumbeak", 734 | "733": "Toucannon", 735 | "734": "Yungoos", 736 | "735": "Gumshoos", 737 | "736": "Grubbin", 738 | "737": "Charjabug", 739 | "738": "Vikavolt", 740 | "739": "Crabrawler", 741 | "740": "Crabominable", 742 | "741": "Oricorio", 743 | "742": "Cutiefly", 744 | "743": "Ribombee", 745 | "744": "Rockruff", 746 | "745": "Lycanroc", 747 | "746": "Wishiwashi", 748 | "747": "Mareanie", 749 | "748": "Toxapex", 750 | "749": "Mudbray", 751 | "750": "Mudsdale", 752 | "751": "Dewpider", 753 | "752": "Araquanid", 754 | "753": "Fomantis", 755 | "754": "Lurantis", 756 | "755": "Morelull", 757 | "756": "Shiinotic", 758 | "757": "Salandit", 759 | "758": "Salazzle", 760 | "759": "Stufful", 761 | "760": "Bewear", 762 | "761": "Bounsweet", 763 | "762": "Steenee", 764 | "763": "Tsareena", 765 | "764": "Comfey", 766 | "765": "Oranguru", 767 | "766": "Passimian", 768 | "767": "Wimpod", 769 | "768": "Golisopod", 770 | "769": "Sandygast", 771 | "770": "Palossand", 772 | "771": "Pyukumuku", 773 | "772": "Type: Null", 774 | "773": "Silvally", 775 | "774": "Minior", 776 | "775": "Komala", 777 | "776": "Turtonator", 778 | "777": "Togedemaru", 779 | "778": "Mimikyu", 780 | "779": "Bruxish", 781 | "780": "Drampa", 782 | "781": "Dhelmise", 783 | "782": "Jangmo-o", 784 | "783": "Hakamo-o", 785 | "784": "Kommo-o", 786 | "785": "Tapu Koko", 787 | "786": "Tapu Lele", 788 | "787": "Tapu Bulu", 789 | "788": "Tapu Fini", 790 | "789": "Cosmog", 791 | "790": "Cosmoem", 792 | "791": "Solgaleo", 793 | "792": "Lunala", 794 | "793": "Nihilego", 795 | "794": "Buzzwole", 796 | "795": "Pheromosa", 797 | "796": "Xurkitree", 798 | "797": "Celesteela", 799 | "798": "Kartana", 800 | "799": "Guzzlord", 801 | "800": "Necrozma", 802 | "801": "Magearna", 803 | "802": "Marshadow", 804 | "803": "Poipole", 805 | "804": "Naganadel", 806 | "805": "Stakataka", 807 | "806": "Blacephalon", 808 | "807": "Zeraora", 809 | "808": "Meltan", 810 | "809": "Melmetal", 811 | "810": "Grookey", 812 | "811": "Thwackey", 813 | "812": "Rillaboom", 814 | "813": "Scorbunny", 815 | "814": "Raboot", 816 | "815": "Cinderace", 817 | "816": "Sobble", 818 | "817": "Drizzile", 819 | "818": "Inteleon", 820 | "819": "Skwovet", 821 | "820": "Greedent", 822 | "821": "Rookidee", 823 | "822": "Corvisquire", 824 | "823": "Corviknight", 825 | "824": "Blipbug", 826 | "825": "Dottler", 827 | "826": "Orbeetle", 828 | "827": "Nickit", 829 | "828": "Thievul", 830 | "829": "Gossifleur", 831 | "830": "Eldegoss", 832 | "831": "Wooloo", 833 | "832": "Dubwool", 834 | "833": "Chewtle", 835 | "834": "Drednaw", 836 | "835": "Yamper", 837 | "836": "Boltund", 838 | "837": "Rolycoly", 839 | "838": "Carkol", 840 | "839": "Coalossal", 841 | "840": "Applin", 842 | "841": "Flapple", 843 | "842": "Appletun", 844 | "843": "Silicobra", 845 | "844": "Sandaconda", 846 | "845": "Cramorant", 847 | "846": "Arrokuda", 848 | "847": "Barraskewda", 849 | "848": "Toxel", 850 | "849": "Toxtricity", 851 | "850": "Sizzlipede", 852 | "851": "Centiskorch", 853 | "852": "Clobbopus", 854 | "853": "Grapploct", 855 | "854": "Sinistea", 856 | "855": "Polteageist", 857 | "856": "Hatenna", 858 | "857": "Hattrem", 859 | "858": "Hatterene", 860 | "859": "Impidimp", 861 | "860": "Morgrem", 862 | "861": "Grimmsnarl", 863 | "862": "Obstagoon", 864 | "863": "Perrserker", 865 | "864": "Cursola", 866 | "865": "Sirfetch’d", 867 | "866": "Mr. Rime", 868 | "867": "Runerigus", 869 | "868": "Milcery", 870 | "869": "Alcremie", 871 | "870": "Falinks", 872 | "871": "Pincurchin", 873 | "872": "Snom", 874 | "873": "Frosmoth", 875 | "874": "Stonjourner", 876 | "875": "Eiscue", 877 | "876": "Indeedee", 878 | "877": "Morpeko", 879 | "878": "Cufant", 880 | "879": "Copperajah", 881 | "880": "Dracozolt", 882 | "881": "Arctozolt", 883 | "882": "Dracovish", 884 | "883": "Arctovish", 885 | "884": "Duraludon", 886 | "885": "Dreepy", 887 | "886": "Drakloak", 888 | "887": "Dragapult", 889 | "888": "Zacian", 890 | "889": "Zamazenta", 891 | "890": "Eternatus", 892 | "891": "Kubfu", 893 | "892": "Urshifu", 894 | "893": "Zarude", 895 | "894": "Regieleki", 896 | "895": "Regidrago", 897 | "896": "Glastrier", 898 | "897": "Spectrier", 899 | "898": "Calyrex" 900 | } 901 | -------------------------------------------------------------------------------- /data/mon_names/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "1": "Bulbasaur", 3 | "2": "Ivysaur", 4 | "3": "Venusaur", 5 | "4": "Charmander", 6 | "5": "Charmeleon", 7 | "6": "Charizard", 8 | "7": "Squirtle", 9 | "8": "Wartortle", 10 | "9": "Blastoise", 11 | "10": "Caterpie", 12 | "11": "Metapod", 13 | "12": "Butterfree", 14 | "13": "Weedle", 15 | "14": "Kakuna", 16 | "15": "Beedrill", 17 | "16": "Pidgey", 18 | "17": "Pidgeotto", 19 | "18": "Pidgeot", 20 | "19": "Rattata", 21 | "20": "Raticate", 22 | "21": "Spearow", 23 | "22": "Fearow", 24 | "23": "Ekans", 25 | "24": "Arbok", 26 | "25": "Pikachu", 27 | "26": "Raichu", 28 | "27": "Sandshrew", 29 | "28": "Sandslash", 30 | "29": "Nidoran\u2640", 31 | "30": "Nidorina", 32 | "31": "Nidoqueen", 33 | "32": "Nidoran\u2642", 34 | "33": "Nidorino", 35 | "34": "Nidoking", 36 | "35": "Clefairy", 37 | "36": "Clefable", 38 | "37": "Vulpix", 39 | "38": "Ninetales", 40 | "39": "Jigglypuff", 41 | "40": "Wigglytuff", 42 | "41": "Zubat", 43 | "42": "Golbat", 44 | "43": "Oddish", 45 | "44": "Gloom", 46 | "45": "Vileplume", 47 | "46": "Paras", 48 | "47": "Parasect", 49 | "48": "Venonat", 50 | "49": "Venomoth", 51 | "50": "Diglett", 52 | "51": "Dugtrio", 53 | "52": "Meowth", 54 | "53": "Persian", 55 | "54": "Psyduck", 56 | "55": "Golduck", 57 | "56": "Mankey", 58 | "57": "Primeape", 59 | "58": "Growlithe", 60 | "59": "Arcanine", 61 | "60": "Poliwag", 62 | "61": "Poliwhirl", 63 | "62": "Poliwrath", 64 | "63": "Abra", 65 | "64": "Kadabra", 66 | "65": "Alakazam", 67 | "66": "Machop", 68 | "67": "Machoke", 69 | "68": "Machamp", 70 | "69": "Bellsprout", 71 | "70": "Weepinbell", 72 | "71": "Victreebel", 73 | "72": "Tentacool", 74 | "73": "Tentacruel", 75 | "74": "Geodude", 76 | "75": "Graveler", 77 | "76": "Golem", 78 | "77": "Ponyta", 79 | "78": "Rapidash", 80 | "79": "Slowpoke", 81 | "80": "Slowbro", 82 | "81": "Magnemite", 83 | "82": "Magneton", 84 | "83": "Farfetch'd", 85 | "84": "Doduo", 86 | "85": "Dodrio", 87 | "86": "Seel", 88 | "87": "Dewgong", 89 | "88": "Grimer", 90 | "89": "Muk", 91 | "90": "Shellder", 92 | "91": "Cloyster", 93 | "92": "Gastly", 94 | "93": "Haunter", 95 | "94": "Gengar", 96 | "95": "Onix", 97 | "96": "Drowzee", 98 | "97": "Hypno", 99 | "98": "Krabby", 100 | "99": "Kingler", 101 | "100": "Voltorb", 102 | "101": "Electrode", 103 | "102": "Exeggcute", 104 | "103": "Exeggutor", 105 | "104": "Cubone", 106 | "105": "Marowak", 107 | "106": "Hitmonlee", 108 | "107": "Hitmonchan", 109 | "108": "Lickitung", 110 | "109": "Koffing", 111 | "110": "Weezing", 112 | "111": "Rhyhorn", 113 | "112": "Rhydon", 114 | "113": "Chansey", 115 | "114": "Tangela", 116 | "115": "Kangaskhan", 117 | "116": "Horsea", 118 | "117": "Seadra", 119 | "118": "Goldeen", 120 | "119": "Seaking", 121 | "120": "Staryu", 122 | "121": "Starmie", 123 | "122": "Mr. Mime", 124 | "123": "Scyther", 125 | "124": "Jynx", 126 | "125": "Electabuzz", 127 | "126": "Magmar", 128 | "127": "Pinsir", 129 | "128": "Tauros", 130 | "129": "Magikarp", 131 | "130": "Gyarados", 132 | "131": "Lapras", 133 | "132": "Ditto", 134 | "133": "Eevee", 135 | "134": "Vaporeon", 136 | "135": "Jolteon", 137 | "136": "Flareon", 138 | "137": "Porygon", 139 | "138": "Omanyte", 140 | "139": "Omastar", 141 | "140": "Kabuto", 142 | "141": "Kabutops", 143 | "142": "Aerodactyl", 144 | "143": "Snorlax", 145 | "144": "Articuno", 146 | "145": "Zapdos", 147 | "146": "Moltres", 148 | "147": "Dratini", 149 | "148": "Dragonair", 150 | "149": "Dragonite", 151 | "150": "Mewtwo", 152 | "151": "Mew", 153 | "152": "Chikorita", 154 | "153": "Bayleef", 155 | "154": "Meganium", 156 | "155": "Cyndaquil", 157 | "156": "Quilava", 158 | "157": "Typhlosion", 159 | "158": "Totodile", 160 | "159": "Croconaw", 161 | "160": "Feraligatr", 162 | "161": "Sentret", 163 | "162": "Furret", 164 | "163": "Hoothoot", 165 | "164": "Noctowl", 166 | "165": "Ledyba", 167 | "166": "Ledian", 168 | "167": "Spinarak", 169 | "168": "Ariados", 170 | "169": "Crobat", 171 | "170": "Chinchou", 172 | "171": "Lanturn", 173 | "172": "Pichu", 174 | "173": "Cleffa", 175 | "174": "Igglybuff", 176 | "175": "Togepi", 177 | "176": "Togetic", 178 | "177": "Natu", 179 | "178": "Xatu", 180 | "179": "Mareep", 181 | "180": "Flaaffy", 182 | "181": "Ampharos", 183 | "182": "Bellossom", 184 | "183": "Marill", 185 | "184": "Azumarill", 186 | "185": "Sudowoodo", 187 | "186": "Politoed", 188 | "187": "Hoppip", 189 | "188": "Skiploom", 190 | "189": "Jumpluff", 191 | "190": "Aipom", 192 | "191": "Sunkern", 193 | "192": "Sunflora", 194 | "193": "Yanma", 195 | "194": "Wooper", 196 | "195": "Quagsire", 197 | "196": "Espeon", 198 | "197": "Umbreon", 199 | "198": "Murkrow", 200 | "199": "Slowking", 201 | "200": "Misdreavus", 202 | "201": "Unown", 203 | "202": "Wobbuffet", 204 | "203": "Girafarig", 205 | "204": "Pineco", 206 | "205": "Forretress", 207 | "206": "Dunsparce", 208 | "207": "Gligar", 209 | "208": "Steelix", 210 | "209": "Snubbull", 211 | "210": "Granbull", 212 | "211": "Qwilfish", 213 | "212": "Scizor", 214 | "213": "Shuckle", 215 | "214": "Heracross", 216 | "215": "Sneasel", 217 | "216": "Teddiursa", 218 | "217": "Ursaring", 219 | "218": "Slugma", 220 | "219": "Magcargo", 221 | "220": "Swinub", 222 | "221": "Piloswine", 223 | "222": "Corsola", 224 | "223": "Remoraid", 225 | "224": "Octillery", 226 | "225": "Delibird", 227 | "226": "Mantine", 228 | "227": "Skarmory", 229 | "228": "Houndour", 230 | "229": "Houndoom", 231 | "230": "Kingdra", 232 | "231": "Phanpy", 233 | "232": "Donphan", 234 | "233": "Porygon2", 235 | "234": "Stantler", 236 | "235": "Smeargle", 237 | "236": "Tyrogue", 238 | "237": "Hitmontop", 239 | "238": "Smoochum", 240 | "239": "Elekid", 241 | "240": "Magby", 242 | "241": "Miltank", 243 | "242": "Blissey", 244 | "243": "Raikou", 245 | "244": "Entei", 246 | "245": "Suicune", 247 | "246": "Larvitar", 248 | "247": "Pupitar", 249 | "248": "Tyranitar", 250 | "249": "Lugia", 251 | "250": "Ho-Oh", 252 | "251": "Celebi", 253 | "252": "Treecko", 254 | "253": "Grovyle", 255 | "254": "Sceptile", 256 | "255": "Torchic", 257 | "256": "Combusken", 258 | "257": "Blaziken", 259 | "258": "Mudkip", 260 | "259": "Marshtomp", 261 | "260": "Swampert", 262 | "261": "Poochyena", 263 | "262": "Mightyena", 264 | "263": "Zigzagoon", 265 | "264": "Linoone", 266 | "265": "Wurmple", 267 | "266": "Silcoon", 268 | "267": "Beautifly", 269 | "268": "Cascoon", 270 | "269": "Dustox", 271 | "270": "Lotad", 272 | "271": "Lombre", 273 | "272": "Ludicolo", 274 | "273": "Seedot", 275 | "274": "Nuzleaf", 276 | "275": "Shiftry", 277 | "276": "Taillow", 278 | "277": "Swellow", 279 | "278": "Wingull", 280 | "279": "Pelipper", 281 | "280": "Ralts", 282 | "281": "Kirlia", 283 | "282": "Gardevoir", 284 | "283": "Surskit", 285 | "284": "Masquerain", 286 | "285": "Shroomish", 287 | "286": "Breloom", 288 | "287": "Slakoth", 289 | "288": "Vigoroth", 290 | "289": "Slaking", 291 | "290": "Nincada", 292 | "291": "Ninjask", 293 | "292": "Shedinja", 294 | "293": "Whismur", 295 | "294": "Loudred", 296 | "295": "Exploud", 297 | "296": "Makuhita", 298 | "297": "Hariyama", 299 | "298": "Azurill", 300 | "299": "Nosepass", 301 | "300": "Skitty", 302 | "301": "Delcatty", 303 | "302": "Sableye", 304 | "303": "Mawile", 305 | "304": "Aron", 306 | "305": "Lairon", 307 | "306": "Aggron", 308 | "307": "Meditite", 309 | "308": "Medicham", 310 | "309": "Electrike", 311 | "310": "Manectric", 312 | "311": "Plusle", 313 | "312": "Minun", 314 | "313": "Volbeat", 315 | "314": "Illumise", 316 | "315": "Roselia", 317 | "316": "Gulpin", 318 | "317": "Swalot", 319 | "318": "Carvanha", 320 | "319": "Sharpedo", 321 | "320": "Wailmer", 322 | "321": "Wailord", 323 | "322": "Numel", 324 | "323": "Camerupt", 325 | "324": "Torkoal", 326 | "325": "Spoink", 327 | "326": "Grumpig", 328 | "327": "Spinda", 329 | "328": "Trapinch", 330 | "329": "Vibrava", 331 | "330": "Flygon", 332 | "331": "Cacnea", 333 | "332": "Cacturne", 334 | "333": "Swablu", 335 | "334": "Altaria", 336 | "335": "Zangoose", 337 | "336": "Seviper", 338 | "337": "Lunatone", 339 | "338": "Solrock", 340 | "339": "Barboach", 341 | "340": "Whiscash", 342 | "341": "Corphish", 343 | "342": "Crawdaunt", 344 | "343": "Baltoy", 345 | "344": "Claydol", 346 | "345": "Lileep", 347 | "346": "Cradily", 348 | "347": "Anorith", 349 | "348": "Armaldo", 350 | "349": "Feebas", 351 | "350": "Milotic", 352 | "351": "Castform", 353 | "352": "Kecleon", 354 | "353": "Shuppet", 355 | "354": "Banette", 356 | "355": "Duskull", 357 | "356": "Dusclops", 358 | "357": "Tropius", 359 | "358": "Chimecho", 360 | "359": "Absol", 361 | "360": "Wynaut", 362 | "361": "Snorunt", 363 | "362": "Glalie", 364 | "363": "Spheal", 365 | "364": "Sealeo", 366 | "365": "Walrein", 367 | "366": "Clamperl", 368 | "367": "Huntail", 369 | "368": "Gorebyss", 370 | "369": "Relicanth", 371 | "370": "Luvdisc", 372 | "371": "Bagon", 373 | "372": "Shelgon", 374 | "373": "Salamence", 375 | "374": "Beldum", 376 | "375": "Metang", 377 | "376": "Metagross", 378 | "377": "Regirock", 379 | "378": "Regice", 380 | "379": "Registeel", 381 | "380": "Latias", 382 | "381": "Latios", 383 | "382": "Kyogre", 384 | "383": "Groudon", 385 | "384": "Rayquaza", 386 | "385": "Jirachi", 387 | "386": "Deoxys", 388 | "387": "Turtwig", 389 | "388": "Grotle", 390 | "389": "Torterra", 391 | "390": "Chimchar", 392 | "391": "Monferno", 393 | "392": "Infernape", 394 | "393": "Piplup", 395 | "394": "Prinplup", 396 | "395": "Empoleon", 397 | "396": "Starly", 398 | "397": "Staravia", 399 | "398": "Staraptor", 400 | "399": "Bidoof", 401 | "400": "Bibarel", 402 | "401": "Kricketot", 403 | "402": "Kricketune", 404 | "403": "Shinx", 405 | "404": "Luxio", 406 | "405": "Luxray", 407 | "406": "Budew", 408 | "407": "Roserade", 409 | "408": "Cranidos", 410 | "409": "Rampardos", 411 | "410": "Shieldon", 412 | "411": "Bastiodon", 413 | "412": "Burmy", 414 | "413": "Wormadam", 415 | "414": "Mothim", 416 | "415": "Combee", 417 | "416": "Vespiquen", 418 | "417": "Pachirisu", 419 | "418": "Buizel", 420 | "419": "Floatzel", 421 | "420": "Cherubi", 422 | "421": "Cherrim", 423 | "422": "Shellos", 424 | "423": "Gastrodon", 425 | "424": "Ambipom", 426 | "425": "Drifloon", 427 | "426": "Drifblim", 428 | "427": "Buneary", 429 | "428": "Lopunny", 430 | "429": "Mismagius", 431 | "430": "Honchkrow", 432 | "431": "Glameow", 433 | "432": "Purugly", 434 | "433": "Chingling", 435 | "434": "Stunky", 436 | "435": "Skuntank", 437 | "436": "Bronzor", 438 | "437": "Bronzong", 439 | "438": "Bonsly", 440 | "439": "Mime Jr.", 441 | "440": "Happiny", 442 | "441": "Chatot", 443 | "442": "Spiritomb", 444 | "443": "Gible", 445 | "444": "Gabite", 446 | "445": "Garchomp", 447 | "446": "Munchlax", 448 | "447": "Riolu", 449 | "448": "Lucario", 450 | "449": "Hippopotas", 451 | "450": "Hippowdon", 452 | "451": "Skorupi", 453 | "452": "Drapion", 454 | "453": "Croagunk", 455 | "454": "Toxicroak", 456 | "455": "Carnivine", 457 | "456": "Finneon", 458 | "457": "Lumineon", 459 | "458": "Mantyke", 460 | "459": "Snover", 461 | "460": "Abomasnow", 462 | "461": "Weavile", 463 | "462": "Magnezone", 464 | "463": "Lickilicky", 465 | "464": "Rhyperior", 466 | "465": "Tangrowth", 467 | "466": "Electivire", 468 | "467": "Magmortar", 469 | "468": "Togekiss", 470 | "469": "Yanmega", 471 | "470": "Leafeon", 472 | "471": "Glaceon", 473 | "472": "Gliscor", 474 | "473": "Mamoswine", 475 | "474": "Porygon-Z", 476 | "475": "Gallade", 477 | "476": "Probopass", 478 | "477": "Dusknoir", 479 | "478": "Froslass", 480 | "479": "Rotom", 481 | "480": "Uxie", 482 | "481": "Mesprit", 483 | "482": "Azelf", 484 | "483": "Dialga", 485 | "484": "Palkia", 486 | "485": "Heatran", 487 | "486": "Regigigas", 488 | "487": "Giratina", 489 | "488": "Cresselia", 490 | "489": "Phione", 491 | "490": "Manaphy", 492 | "491": "Darkrai", 493 | "492": "Shaymin", 494 | "493": "Arceus", 495 | "494": "Victini", 496 | "495": "Snivy", 497 | "496": "Servine", 498 | "497": "Serperior", 499 | "498": "Tepig", 500 | "499": "Pignite", 501 | "500": "Emboar", 502 | "501": "Oshawott", 503 | "502": "Dewott", 504 | "503": "Samurott", 505 | "504": "Patrat", 506 | "505": "Watchog", 507 | "506": "Lillipup", 508 | "507": "Herdier", 509 | "508": "Stoutland", 510 | "509": "Purrloin", 511 | "510": "Liepard", 512 | "511": "Pansage", 513 | "512": "Simisage", 514 | "513": "Pansear", 515 | "514": "Simisear", 516 | "515": "Panpour", 517 | "516": "Simipour", 518 | "517": "Munna", 519 | "518": "Musharna", 520 | "519": "Pidove", 521 | "520": "Tranquill", 522 | "521": "Unfezant", 523 | "522": "Blitzle", 524 | "523": "Zebstrika", 525 | "524": "Roggenrola", 526 | "525": "Boldore", 527 | "526": "Gigalith", 528 | "527": "Woobat", 529 | "528": "Swoobat", 530 | "529": "Drilbur", 531 | "530": "Excadrill", 532 | "531": "Audino", 533 | "532": "Timburr", 534 | "533": "Gurdurr", 535 | "534": "Conkeldurr", 536 | "535": "Tympole", 537 | "536": "Palpitoad", 538 | "537": "Seismitoad", 539 | "538": "Throh", 540 | "539": "Sawk", 541 | "540": "Sewaddle", 542 | "541": "Swadloon", 543 | "542": "Leavanny", 544 | "543": "Venipede", 545 | "544": "Whirlipede", 546 | "545": "Scolipede", 547 | "546": "Cottonee", 548 | "547": "Whimsicott", 549 | "548": "Petilil", 550 | "549": "Lilligant", 551 | "550": "Basculin", 552 | "551": "Sandile", 553 | "552": "Krokorok", 554 | "553": "Krookodile", 555 | "554": "Darumaka", 556 | "555": "Darmanitan", 557 | "556": "Maractus", 558 | "557": "Dwebble", 559 | "558": "Crustle", 560 | "559": "Scraggy", 561 | "560": "Scrafty", 562 | "561": "Sigilyph", 563 | "562": "Yamask", 564 | "563": "Cofagrigus", 565 | "564": "Tirtouga", 566 | "565": "Carracosta", 567 | "566": "Archen", 568 | "567": "Archeops", 569 | "568": "Trubbish", 570 | "569": "Garbodor", 571 | "570": "Zorua", 572 | "571": "Zoroark", 573 | "572": "Minccino", 574 | "573": "Cinccino", 575 | "574": "Gothita", 576 | "575": "Gothorita", 577 | "576": "Gothitelle", 578 | "577": "Solosis", 579 | "578": "Duosion", 580 | "579": "Reuniclus", 581 | "580": "Ducklett", 582 | "581": "Swanna", 583 | "582": "Vanillite", 584 | "583": "Vanillish", 585 | "584": "Vanilluxe", 586 | "585": "Deerling", 587 | "586": "Sawsbuck", 588 | "587": "Emolga", 589 | "588": "Karrablast", 590 | "589": "Escavalier", 591 | "590": "Foongus", 592 | "591": "Amoonguss", 593 | "592": "Frillish", 594 | "593": "Jellicent", 595 | "594": "Alomomola", 596 | "595": "Joltik", 597 | "596": "Galvantula", 598 | "597": "Ferroseed", 599 | "598": "Ferrothorn", 600 | "599": "Klink", 601 | "600": "Klang", 602 | "601": "Klinklang", 603 | "602": "Tynamo", 604 | "603": "Eelektrik", 605 | "604": "Eelektross", 606 | "605": "Elgyem", 607 | "606": "Beheeyem", 608 | "607": "Litwick", 609 | "608": "Lampent", 610 | "609": "Chandelure", 611 | "610": "Axew", 612 | "611": "Fraxure", 613 | "612": "Haxorus", 614 | "613": "Cubchoo", 615 | "614": "Beartic", 616 | "615": "Cryogonal", 617 | "616": "Shelmet", 618 | "617": "Accelgor", 619 | "618": "Stunfisk", 620 | "619": "Mienfoo", 621 | "620": "Mienshao", 622 | "621": "Druddigon", 623 | "622": "Golett", 624 | "623": "Golurk", 625 | "624": "Pawniard", 626 | "625": "Bisharp", 627 | "626": "Bouffalant", 628 | "627": "Rufflet", 629 | "628": "Braviary", 630 | "629": "Vullaby", 631 | "630": "Mandibuzz", 632 | "631": "Heatmor", 633 | "632": "Durant", 634 | "633": "Deino", 635 | "634": "Zweilous", 636 | "635": "Hydreigon", 637 | "636": "Larvesta", 638 | "637": "Volcarona", 639 | "638": "Cobalion", 640 | "639": "Terrakion", 641 | "640": "Virizion", 642 | "641": "Tornadus", 643 | "642": "Thundurus", 644 | "643": "Reshiram", 645 | "644": "Zekrom", 646 | "645": "Landorus", 647 | "646": "Kyurem", 648 | "647": "Keldeo", 649 | "648": "Meloetta", 650 | "649": "Genesect", 651 | "650": "Chespin", 652 | "651": "Quilladin", 653 | "652": "Chesnaught", 654 | "653": "Fennekin", 655 | "654": "Braixen", 656 | "655": "Delphox", 657 | "656": "Froakie", 658 | "657": "Frogadier", 659 | "658": "Greninja", 660 | "659": "Bunnelby", 661 | "660": "Diggersby", 662 | "661": "Fletchling", 663 | "662": "Fletchinder", 664 | "663": "Talonflame", 665 | "664": "Scatterbug", 666 | "665": "Spewpa", 667 | "666": "Vivillon", 668 | "667": "Litleo", 669 | "668": "Pyroar", 670 | "669": "Flab\u00e9b\u00e9", 671 | "670": "Floette", 672 | "671": "Florges", 673 | "672": "Skiddo", 674 | "673": "Gogoat", 675 | "674": "Pancham", 676 | "675": "Pangoro", 677 | "676": "Furfrou", 678 | "677": "Espurr", 679 | "678": "Meowstic", 680 | "679": "Honedge", 681 | "680": "Doublade", 682 | "681": "Aegislash", 683 | "682": "Spritzee", 684 | "683": "Aromatisse", 685 | "684": "Swirlix", 686 | "685": "Slurpuff", 687 | "686": "Inkay", 688 | "687": "Malamar", 689 | "688": "Binacle", 690 | "689": "Barbaracle", 691 | "690": "Skrelp", 692 | "691": "Dragalge", 693 | "692": "Clauncher", 694 | "693": "Clawitzer", 695 | "694": "Helioptile", 696 | "695": "Heliolisk", 697 | "696": "Tyrunt", 698 | "697": "Tyrantrum", 699 | "698": "Amaura", 700 | "699": "Aurorus", 701 | "700": "Sylveon", 702 | "701": "Hawlucha", 703 | "702": "Dedenne", 704 | "703": "Carbink", 705 | "704": "Goomy", 706 | "705": "Sliggoo", 707 | "706": "Goodra", 708 | "707": "Klefki", 709 | "708": "Phantump", 710 | "709": "Trevenant", 711 | "710": "Pumpkaboo", 712 | "711": "Gourgeist", 713 | "712": "Bergmite", 714 | "713": "Avalugg", 715 | "714": "Noibat", 716 | "715": "Noivern", 717 | "716": "Xerneas", 718 | "717": "Yveltal", 719 | "718": "Zygarde", 720 | "719": "Diancie", 721 | "720": "Hoopa", 722 | "721": "Volcanion", 723 | "722": "Rowlet", 724 | "723": "Dartrix", 725 | "724": "Decidueye", 726 | "725": "Litten", 727 | "726": "Torracat", 728 | "727": "Incineroar", 729 | "728": "Popplio", 730 | "729": "Brionne", 731 | "730": "Primarina", 732 | "731": "Pikipek", 733 | "732": "Trumbeak", 734 | "733": "Toucannon", 735 | "734": "Yungoos", 736 | "735": "Gumshoos", 737 | "736": "Grubbin", 738 | "737": "Charjabug", 739 | "738": "Vikavolt", 740 | "739": "Crabrawler", 741 | "740": "Crabominable", 742 | "741": "Oricorio", 743 | "742": "Cutiefly", 744 | "743": "Ribombee", 745 | "744": "Rockruff", 746 | "745": "Lycanroc", 747 | "746": "Wishiwashi", 748 | "747": "Mareanie", 749 | "748": "Toxapex", 750 | "749": "Mudbray", 751 | "750": "Mudsdale", 752 | "751": "Dewpider", 753 | "752": "Araquanid", 754 | "753": "Fomantis", 755 | "754": "Lurantis", 756 | "755": "Morelull", 757 | "756": "Shiinotic", 758 | "757": "Salandit", 759 | "758": "Salazzle", 760 | "759": "Stufful", 761 | "760": "Bewear", 762 | "761": "Bounsweet", 763 | "762": "Steenee", 764 | "763": "Tsareena", 765 | "764": "Comfey", 766 | "765": "Oranguru", 767 | "766": "Passimian", 768 | "767": "Wimpod", 769 | "768": "Golisopod", 770 | "769": "Sandygast", 771 | "770": "Palossand", 772 | "771": "Pyukumuku", 773 | "772": "Type: Null", 774 | "773": "Silvally", 775 | "774": "Minior", 776 | "775": "Komala", 777 | "776": "Turtonator", 778 | "777": "Togedemaru", 779 | "778": "Mimikyu", 780 | "779": "Bruxish", 781 | "780": "Drampa", 782 | "781": "Dhelmise", 783 | "782": "Jangmo-o", 784 | "783": "Hakamo-o", 785 | "784": "Kommo-o", 786 | "785": "Tapu Koko", 787 | "786": "Tapu Lele", 788 | "787": "Tapu Bulu", 789 | "788": "Tapu Fini", 790 | "789": "Cosmog", 791 | "790": "Cosmoem", 792 | "791": "Solgaleo", 793 | "792": "Lunala", 794 | "793": "Nihilego", 795 | "794": "Buzzwole", 796 | "795": "Pheromosa", 797 | "796": "Xurkitree", 798 | "797": "Celesteela", 799 | "798": "Kartana", 800 | "799": "Guzzlord", 801 | "800": "Necrozma", 802 | "801": "Magearna", 803 | "802": "Marshadow", 804 | "803": "Poipole", 805 | "804": "Naganadel", 806 | "805": "Stakataka", 807 | "806": "Blacephalon", 808 | "807": "Zeraora", 809 | "808": "Meltan", 810 | "809": "Melmetal", 811 | "810": "Grookey", 812 | "811": "Thwackey", 813 | "812": "Rillaboom", 814 | "813": "Scorbunny", 815 | "814": "Raboot", 816 | "815": "Cinderace", 817 | "816": "Sobble", 818 | "817": "Drizzile", 819 | "818": "Inteleon", 820 | "819": "Skwovet", 821 | "820": "Greedent", 822 | "821": "Rookidee", 823 | "822": "Corvisquire", 824 | "823": "Corviknight", 825 | "824": "Blipbug", 826 | "825": "Dottler", 827 | "826": "Orbeetle", 828 | "827": "Nickit", 829 | "828": "Thievul", 830 | "829": "Gossifleur", 831 | "830": "Eldegoss", 832 | "831": "Wooloo", 833 | "832": "Dubwool", 834 | "833": "Chewtle", 835 | "834": "Drednaw", 836 | "835": "Yamper", 837 | "836": "Boltund", 838 | "837": "Rolycoly", 839 | "838": "Carkol", 840 | "839": "Coalossal", 841 | "840": "Applin", 842 | "841": "Flapple", 843 | "842": "Appletun", 844 | "843": "Silicobra", 845 | "844": "Sandaconda", 846 | "845": "Cramorant", 847 | "846": "Arrokuda", 848 | "847": "Barraskewda", 849 | "848": "Toxel", 850 | "849": "Toxtricity", 851 | "850": "Sizzlipede", 852 | "851": "Centiskorch", 853 | "852": "Clobbopus", 854 | "853": "Grapploct", 855 | "854": "Sinistea", 856 | "855": "Polteageist", 857 | "856": "Hatenna", 858 | "857": "Hattrem", 859 | "858": "Hatterene", 860 | "859": "Impidimp", 861 | "860": "Morgrem", 862 | "861": "Grimmsnarl", 863 | "862": "Obstagoon", 864 | "863": "Perrserker", 865 | "864": "Cursola", 866 | "865": "Sirfetch’d", 867 | "866": "Mr.Rime", 868 | "867": "Runerigus", 869 | "868": "Milcery", 870 | "869": "Alcremie", 871 | "870": "Falinks", 872 | "871": "Pincurchin", 873 | "872": "Snom", 874 | "873": "Frosmoth", 875 | "874": "Stonjourner", 876 | "875": "Eiscue", 877 | "876": "Indeedee", 878 | "877": "Morpeko", 879 | "878": "Cufant", 880 | "879": "Copperajah", 881 | "880": "Dracozolt", 882 | "881": "Arctozolt", 883 | "882": "Dracovish", 884 | "883": "Arctovish", 885 | "884": "Duraludon", 886 | "885": "Dreepy", 887 | "886": "Drakloak", 888 | "887": "Dragapult", 889 | "888": "Zacian", 890 | "889": "Zamazenta", 891 | "890": "Eternatus", 892 | "891": "Kubfu", 893 | "892": "Urshifu", 894 | "893": "Zarude", 895 | "894": "Regieleki", 896 | "895": "Regidrago", 897 | "896": "Glastrier", 898 | "897": "Spectrier", 899 | "898": "Calyrex" 900 | } 901 | -------------------------------------------------------------------------------- /data/mon_names/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "1": "Bulbizarre", 3 | "2": "Herbizarre", 4 | "3": "Florizarre", 5 | "4": "Salam\u00e8che", 6 | "5": "Reptincel", 7 | "6": "Dracaufeu", 8 | "7": "Carapuce", 9 | "8": "Carabaffe", 10 | "9": "Tortank", 11 | "10": "Chenipan", 12 | "11": "Chrysacier", 13 | "12": "Papilusion", 14 | "13": "Aspicot", 15 | "14": "Coconfort", 16 | "15": "Dardargnan", 17 | "16": "Roucool", 18 | "17": "Roucoups", 19 | "18": "Roucarnage", 20 | "19": "Rattata", 21 | "20": "Rattatac", 22 | "21": "Piafabec", 23 | "22": "Rapasdepic", 24 | "23": "Abo", 25 | "24": "Arbok", 26 | "25": "Pikachu", 27 | "26": "Raichu", 28 | "27": "Sabelette", 29 | "28": "Sablaireau", 30 | "29": "Nidoran\u2640", 31 | "30": "Nidorina", 32 | "31": "Nidoqueen", 33 | "32": "Nidoran\u2642", 34 | "33": "Nidorino", 35 | "34": "Nidoking", 36 | "35": "M\u00e9lof\u00e9e", 37 | "36": "M\u00e9lodelfe", 38 | "37": "Goupix", 39 | "38": "Feunard", 40 | "39": "Rondoudou", 41 | "40": "Grodoudou", 42 | "41": "Nosferapti", 43 | "42": "Nosferalto", 44 | "43": "Mystherbe", 45 | "44": "Ortide", 46 | "45": "Rafflesia", 47 | "46": "Paras", 48 | "47": "Parasect", 49 | "48": "Mimitoss", 50 | "49": "A\u00e9romite", 51 | "50": "Taupiqueur", 52 | "51": "Triopikeur", 53 | "52": "Miaouss", 54 | "53": "Persian", 55 | "54": "Psykokwak", 56 | "55": "Akwakwak", 57 | "56": "F\u00e9rosinge", 58 | "57": "Colossinge", 59 | "58": "Caninos", 60 | "59": "Arcanin", 61 | "60": "Ptitard", 62 | "61": "T\u00eatarte", 63 | "62": "Tartard", 64 | "63": "Abra", 65 | "64": "Kadabra", 66 | "65": "Alakazam", 67 | "66": "Machoc", 68 | "67": "Machopeur", 69 | "68": "Mackogneur", 70 | "69": "Ch\u00e9tiflor", 71 | "70": "Boustiflor", 72 | "71": "Empiflor", 73 | "72": "Tentacool", 74 | "73": "Tentacruel", 75 | "74": "Racaillou", 76 | "75": "Gravalanch", 77 | "76": "Grolem", 78 | "77": "Ponyta", 79 | "78": "Galopa", 80 | "79": "Ramoloss", 81 | "80": "Flagadoss", 82 | "81": "Magn\u00e9ti", 83 | "82": "Magn\u00e9ton", 84 | "83": "Canarticho", 85 | "84": "Doduo", 86 | "85": "Dodrio", 87 | "86": "Otaria", 88 | "87": "Lamantine", 89 | "88": "Tadmorv", 90 | "89": "Grotadmorv", 91 | "90": "Kokiyas", 92 | "91": "Crustabri", 93 | "92": "Fantominus", 94 | "93": "Spectrum", 95 | "94": "Ectoplasma", 96 | "95": "Onix", 97 | "96": "Soporifik", 98 | "97": "Hypnomade", 99 | "98": "Krabby", 100 | "99": "Krabboss", 101 | "100": "Voltorbe", 102 | "101": "\u00c9lectrode", 103 | "102": "Noeunoeuf", 104 | "103": "Noadkoko", 105 | "104": "Osselait", 106 | "105": "Ossatueur", 107 | "106": "Kicklee", 108 | "107": "Tygnon", 109 | "108": "Excelangue", 110 | "109": "Smogo", 111 | "110": "Smogogo", 112 | "111": "Rhinocorne", 113 | "112": "Rhinof\u00e9ros", 114 | "113": "Leveinard", 115 | "114": "Saquedeneu", 116 | "115": "Kangourex", 117 | "116": "Hypotrempe", 118 | "117": "Hypoc\u00e9an", 119 | "118": "Poissir\u00e8ne", 120 | "119": "Poissoroy", 121 | "120": "Stari", 122 | "121": "Staross", 123 | "122": "M. Mime", 124 | "123": "Ins\u00e9cateur", 125 | "124": "Lippoutou", 126 | "125": "\u00c9lektek", 127 | "126": "Magmar", 128 | "127": "Scarabrute", 129 | "128": "Tauros", 130 | "129": "Magicarpe", 131 | "130": "L\u00e9viator", 132 | "131": "Lokhlass", 133 | "132": "M\u00e9tamorph", 134 | "133": "\u00c9voli", 135 | "134": "Aquali", 136 | "135": "Voltali", 137 | "136": "Pyroli", 138 | "137": "Porygon", 139 | "138": "Amonita", 140 | "139": "Amonistar", 141 | "140": "Kabuto", 142 | "141": "Kabutops", 143 | "142": "Pt\u00e9ra", 144 | "143": "Ronflex", 145 | "144": "Artikodin", 146 | "145": "\u00c9lecthor", 147 | "146": "Sulfura", 148 | "147": "Minidraco", 149 | "148": "Draco", 150 | "149": "Dracolosse", 151 | "150": "Mewtwo", 152 | "151": "Mew", 153 | "152": "Germignon", 154 | "153": "Macronium", 155 | "154": "M\u00e9ganium", 156 | "155": "H\u00e9ricendre", 157 | "156": "Feurisson", 158 | "157": "Typhlosion", 159 | "158": "Kaiminus", 160 | "159": "Crocrodil", 161 | "160": "Aligatueur", 162 | "161": "Fouinette", 163 | "162": "Fouinar", 164 | "163": "Hoothoot", 165 | "164": "Noarfang", 166 | "165": "Coxy", 167 | "166": "Coxyclaque", 168 | "167": "Mimigal", 169 | "168": "Migalos", 170 | "169": "Nostenfer", 171 | "170": "Loupio", 172 | "171": "Lanturn", 173 | "172": "Pichu", 174 | "173": "M\u00e9lo", 175 | "174": "Toudoudou", 176 | "175": "Togepi", 177 | "176": "Togetic", 178 | "177": "Natu", 179 | "178": "Xatu", 180 | "179": "Wattouat", 181 | "180": "Lainergie", 182 | "181": "Pharamp", 183 | "182": "Joliflor", 184 | "183": "Marill", 185 | "184": "Azumarill", 186 | "185": "Simularbre", 187 | "186": "Tarpaud", 188 | "187": "Granivol", 189 | "188": "Floravol", 190 | "189": "Cotovol", 191 | "190": "Capumain", 192 | "191": "Tournegrin", 193 | "192": "H\u00e9liatronc", 194 | "193": "Yanma", 195 | "194": "Axoloto", 196 | "195": "Maraiste", 197 | "196": "Mentali", 198 | "197": "Noctali", 199 | "198": "Corn\u00e8bre", 200 | "199": "Roigada", 201 | "200": "Feufor\u00eave", 202 | "201": "Zarbi", 203 | "202": "Qulbutok\u00e9", 204 | "203": "Girafarig", 205 | "204": "Pomdepik", 206 | "205": "Foretress", 207 | "206": "Insolourdo", 208 | "207": "Scorplane", 209 | "208": "Steelix", 210 | "209": "Snubbull", 211 | "210": "Granbull", 212 | "211": "Qwilfish", 213 | "212": "Cizayox", 214 | "213": "Caratroc", 215 | "214": "Scarhino", 216 | "215": "Farfuret", 217 | "216": "Teddiursa", 218 | "217": "Ursaring", 219 | "218": "Limagma", 220 | "219": "Volcaropod", 221 | "220": "Marcacrin", 222 | "221": "Cochignon", 223 | "222": "Corayon", 224 | "223": "R\u00e9moraid", 225 | "224": "Octillery", 226 | "225": "Cadoizo", 227 | "226": "D\u00e9manta", 228 | "227": "Airmure", 229 | "228": "Malosse", 230 | "229": "D\u00e9molosse", 231 | "230": "Hyporoi", 232 | "231": "Phanpy", 233 | "232": "Donphan", 234 | "233": "Porygon2", 235 | "234": "Cerfrousse", 236 | "235": "Queulorior", 237 | "236": "Debugant", 238 | "237": "Kapoera", 239 | "238": "Lippouti", 240 | "239": "\u00c9lekid", 241 | "240": "Magby", 242 | "241": "\u00c9cr\u00e9meuh", 243 | "242": "Leuphorie", 244 | "243": "Raikou", 245 | "244": "Entei", 246 | "245": "Suicune", 247 | "246": "Embrylex", 248 | "247": "Ymphect", 249 | "248": "Tyranocif", 250 | "249": "Lugia", 251 | "250": "Ho-Oh", 252 | "251": "Celebi", 253 | "252": "Arcko", 254 | "253": "Massko", 255 | "254": "Jungko", 256 | "255": "Poussifeu", 257 | "256": "Galifeu", 258 | "257": "Bras\u00e9gali", 259 | "258": "Gobou", 260 | "259": "Flobio", 261 | "260": "Laggron", 262 | "261": "Medhy\u00e8na", 263 | "262": "Grahy\u00e8na", 264 | "263": "Zigzaton", 265 | "264": "Lin\u00e9on", 266 | "265": "Chenipotte", 267 | "266": "Armulys", 268 | "267": "Charmillon", 269 | "268": "Blindalys", 270 | "269": "Papinox", 271 | "270": "N\u00e9nupiot", 272 | "271": "Lombre", 273 | "272": "Ludicolo", 274 | "273": "Grainipiot", 275 | "274": "Pifeuil", 276 | "275": "Tengalice", 277 | "276": "Nirondelle", 278 | "277": "H\u00e9l\u00e9delle", 279 | "278": "Go\u00e9lise", 280 | "279": "Bekipan", 281 | "280": "Tarsal", 282 | "281": "Kirlia", 283 | "282": "Gardevoir", 284 | "283": "Arakdo", 285 | "284": "Maskadra", 286 | "285": "Balignon", 287 | "286": "Chapignon", 288 | "287": "Parecool", 289 | "288": "Vigoroth", 290 | "289": "Monafl\u00e8mit", 291 | "290": "Ningale", 292 | "291": "Ninjask", 293 | "292": "Munja", 294 | "293": "Chuchmur", 295 | "294": "Ramboum", 296 | "295": "Brouhabam", 297 | "296": "Makuhita", 298 | "297": "Hariyama", 299 | "298": "Azurill", 300 | "299": "Tarinor", 301 | "300": "Skitty", 302 | "301": "Delcatty", 303 | "302": "T\u00e9n\u00e9fix", 304 | "303": "Mysdibule", 305 | "304": "Galekid", 306 | "305": "Galegon", 307 | "306": "Galeking", 308 | "307": "M\u00e9ditikka", 309 | "308": "Charmina", 310 | "309": "Dynavolt", 311 | "310": "\u00c9lecsprint", 312 | "311": "Posipi", 313 | "312": "N\u00e9gapi", 314 | "313": "Muciole", 315 | "314": "Lumivole", 316 | "315": "Ros\u00e9lia", 317 | "316": "Gloupti", 318 | "317": "Avaltout", 319 | "318": "Carvanha", 320 | "319": "Sharpedo", 321 | "320": "Wailmer", 322 | "321": "Wailord", 323 | "322": "Chamallot", 324 | "323": "Cam\u00e9rupt", 325 | "324": "Chartor", 326 | "325": "Spoink", 327 | "326": "Groret", 328 | "327": "Spinda", 329 | "328": "Kraknoix", 330 | "329": "Vibraninf", 331 | "330": "Lib\u00e9gon", 332 | "331": "Cacnea", 333 | "332": "Cacturne", 334 | "333": "Tylton", 335 | "334": "Altaria", 336 | "335": "Mangriff", 337 | "336": "S\u00e9viper", 338 | "337": "S\u00e9l\u00e9roc", 339 | "338": "Solaroc", 340 | "339": "Barloche", 341 | "340": "Barbicha", 342 | "341": "\u00c9crapince", 343 | "342": "Colhomard", 344 | "343": "Balbuto", 345 | "344": "Kaorine", 346 | "345": "Lilia", 347 | "346": "Vacilys", 348 | "347": "Anorith", 349 | "348": "Armaldo", 350 | "349": "Barpau", 351 | "350": "Milobellus", 352 | "351": "Morph\u00e9o", 353 | "352": "Kecleon", 354 | "353": "Polichombr", 355 | "354": "Branette", 356 | "355": "Skel\u00e9nox", 357 | "356": "T\u00e9raclope", 358 | "357": "Tropius", 359 | "358": "\u00c9oko", 360 | "359": "Absol", 361 | "360": "Ok\u00e9ok\u00e9", 362 | "361": "Stalgamin", 363 | "362": "Oniglali", 364 | "363": "Obalie", 365 | "364": "Phogleur", 366 | "365": "Kaimorse", 367 | "366": "Coquiperl", 368 | "367": "Serpang", 369 | "368": "Rosabyss", 370 | "369": "Relicanth", 371 | "370": "Lovdisc", 372 | "371": "Draby", 373 | "372": "Drackhaus", 374 | "373": "Drattak", 375 | "374": "Terhal", 376 | "375": "M\u00e9tang", 377 | "376": "M\u00e9talosse", 378 | "377": "Regirock", 379 | "378": "Regice", 380 | "379": "Registeel", 381 | "380": "Latias", 382 | "381": "Latios", 383 | "382": "Kyogre", 384 | "383": "Groudon", 385 | "384": "Rayquaza", 386 | "385": "Jirachi", 387 | "386": "Deoxys", 388 | "387": "Tortipouss", 389 | "388": "Boskara", 390 | "389": "Torterra", 391 | "390": "Ouisticram", 392 | "391": "Chimpenfeu", 393 | "392": "Simiabraz", 394 | "393": "Tiplouf", 395 | "394": "Prinplouf", 396 | "395": "Pingol\u00e9on", 397 | "396": "\u00c9tourmi", 398 | "397": "\u00c9tourvol", 399 | "398": "\u00c9touraptor", 400 | "399": "Keunotor", 401 | "400": "Castorno", 402 | "401": "Crikzik", 403 | "402": "M\u00e9lokrik", 404 | "403": "Lixy", 405 | "404": "Luxio", 406 | "405": "Luxray", 407 | "406": "Rozbouton", 408 | "407": "Roserade", 409 | "408": "Kranidos", 410 | "409": "Charkos", 411 | "410": "Dinoclier", 412 | "411": "Bastiodon", 413 | "412": "Cheniti", 414 | "413": "Cheniselle", 415 | "414": "Papilord", 416 | "415": "Apitrini", 417 | "416": "Apireine", 418 | "417": "Pachirisu", 419 | "418": "Must\u00e9bou\u00e9e", 420 | "419": "Must\u00e9flott", 421 | "420": "Ceribou", 422 | "421": "Ceriflor", 423 | "422": "Sancoki", 424 | "423": "Tritosor", 425 | "424": "Capidextre", 426 | "425": "Baudrive", 427 | "426": "Grodrive", 428 | "427": "Laporeille", 429 | "428": "Lockpin", 430 | "429": "Magir\u00eave", 431 | "430": "Corboss", 432 | "431": "Chaglam", 433 | "432": "Chaffreux", 434 | "433": "Korillon", 435 | "434": "Moufouette", 436 | "435": "Moufflair", 437 | "436": "Arch\u00e9omire", 438 | "437": "Arch\u00e9odong", 439 | "438": "Manza\u00ef", 440 | "439": "Mime Jr.", 441 | "440": "Ptiravi", 442 | "441": "Pijako", 443 | "442": "Spiritomb", 444 | "443": "Griknot", 445 | "444": "Carmache", 446 | "445": "Carchacrok", 447 | "446": "Goinfrex", 448 | "447": "Riolu", 449 | "448": "Lucario", 450 | "449": "Hippopotas", 451 | "450": "Hippodocus", 452 | "451": "Rapion", 453 | "452": "Drascore", 454 | "453": "Cradopaud", 455 | "454": "Coatox", 456 | "455": "Vortente", 457 | "456": "\u00c9cayon", 458 | "457": "Lumin\u00e9on", 459 | "458": "Babimanta", 460 | "459": "Blizzi", 461 | "460": "Blizzaroi", 462 | "461": "Dimoret", 463 | "462": "Magn\u00e9zone", 464 | "463": "Coudlangue", 465 | "464": "Rhinastoc", 466 | "465": "Bouldeneu", 467 | "466": "\u00c9lekable", 468 | "467": "Maganon", 469 | "468": "Togekiss", 470 | "469": "Yanmega", 471 | "470": "Phyllali", 472 | "471": "Givrali", 473 | "472": "Scorvol", 474 | "473": "Mammochon", 475 | "474": "Porygon-Z", 476 | "475": "Gallame", 477 | "476": "Tarinorme", 478 | "477": "Noctunoir", 479 | "478": "Momartik", 480 | "479": "Motisma", 481 | "480": "Cr\u00e9helf", 482 | "481": "Cr\u00e9follet", 483 | "482": "Cr\u00e9fadet", 484 | "483": "Dialga", 485 | "484": "Palkia", 486 | "485": "Heatran", 487 | "486": "Regigigas", 488 | "487": "Giratina", 489 | "488": "Cresselia", 490 | "489": "Phione", 491 | "490": "Manaphy", 492 | "491": "Darkrai", 493 | "492": "Shaymin", 494 | "493": "Arceus", 495 | "494": "Victini", 496 | "495": "Vip\u00e9lierre", 497 | "496": "Lianaja", 498 | "497": "Majaspic", 499 | "498": "Gruikui", 500 | "499": "Grotichon", 501 | "500": "Roitiflam", 502 | "501": "Moustillon", 503 | "502": "Mateloutre", 504 | "503": "Clamiral", 505 | "504": "Ratentif", 506 | "505": "Miradar", 507 | "506": "Ponchiot", 508 | "507": "Ponchien", 509 | "508": "Mastouffe", 510 | "509": "Chacripan", 511 | "510": "L\u00e9opardus", 512 | "511": "Feuillajou", 513 | "512": "Feuiloutan", 514 | "513": "Flamajou", 515 | "514": "Flamoutan", 516 | "515": "Flotajou", 517 | "516": "Flotoutan", 518 | "517": "Munna", 519 | "518": "Mushana", 520 | "519": "Poichigeon", 521 | "520": "Colombeau", 522 | "521": "D\u00e9flaisan", 523 | "522": "Z\u00e9bibron", 524 | "523": "Z\u00e9blitz", 525 | "524": "Nodulithe", 526 | "525": "G\u00e9olithe", 527 | "526": "Gigalithe", 528 | "527": "Chovsourir", 529 | "528": "Rhinolove", 530 | "529": "Rototaupe", 531 | "530": "Minotaupe", 532 | "531": "Nanm\u00e9ou\u00efe", 533 | "532": "Charpenti", 534 | "533": "Ouvrifier", 535 | "534": "B\u00e9tochef", 536 | "535": "Tritonde", 537 | "536": "Batracn\u00e9", 538 | "537": "Crapustule", 539 | "538": "Judokrak", 540 | "539": "Karacl\u00e9e", 541 | "540": "Larveyette", 542 | "541": "Couverdure", 543 | "542": "Manternel", 544 | "543": "Venipatte", 545 | "544": "Scobolide", 546 | "545": "Brutapode", 547 | "546": "Doudouvet", 548 | "547": "Farfaduvet", 549 | "548": "Chlorobule", 550 | "549": "Fragilady", 551 | "550": "Bargantua", 552 | "551": "Masca\u00efman", 553 | "552": "Escroco", 554 | "553": "Crocorible", 555 | "554": "Darumarond", 556 | "555": "Darumacho", 557 | "556": "Maracachi", 558 | "557": "Crabicoque", 559 | "558": "Crabaraque", 560 | "559": "Baggiguane", 561 | "560": "Bagga\u00efd", 562 | "561": "Crypt\u00e9ro", 563 | "562": "Tutafeh", 564 | "563": "Tutankafer", 565 | "564": "Carapagos", 566 | "565": "M\u00e9gapagos", 567 | "566": "Ark\u00e9apti", 568 | "567": "A\u00e9ropt\u00e9ryx", 569 | "568": "Miamiasme", 570 | "569": "Miasmax", 571 | "570": "Zorua", 572 | "571": "Zoroark", 573 | "572": "Chinchidou", 574 | "573": "Pashmilla", 575 | "574": "Scrutella", 576 | "575": "Mesm\u00e9rella", 577 | "576": "Sid\u00e9rella", 578 | "577": "Nucl\u00e9os", 579 | "578": "M\u00e9ios", 580 | "579": "Symbios", 581 | "580": "Couaneton", 582 | "581": "Lakm\u00e9cygne", 583 | "582": "Sorb\u00e9b\u00e9", 584 | "583": "Sorboul", 585 | "584": "Sorbouboul", 586 | "585": "Vivaldaim", 587 | "586": "Haydaim", 588 | "587": "Emolga", 589 | "588": "Carabing", 590 | "589": "Lan\u00e7argot", 591 | "590": "Trompignon", 592 | "591": "Gaulet", 593 | "592": "Viskuse", 594 | "593": "Moyade", 595 | "594": "Mamanbo", 596 | "595": "Statitik", 597 | "596": "Mygavolt", 598 | "597": "Grindur", 599 | "598": "Noacier", 600 | "599": "Tic", 601 | "600": "Clic", 602 | "601": "Cliticlic", 603 | "602": "Anchwatt", 604 | "603": "Lamp\u00e9roie", 605 | "604": "Ohmassacre", 606 | "605": "Lewsor", 607 | "606": "Neitram", 608 | "607": "Fun\u00e9cire", 609 | "608": "M\u00e9lancolux", 610 | "609": "Lugulabre", 611 | "610": "Coupenotte", 612 | "611": "Incisache", 613 | "612": "Tranchodon", 614 | "613": "Polarhume", 615 | "614": "Polagriffe", 616 | "615": "Hexagel", 617 | "616": "Escargaume", 618 | "617": "Limaspeed", 619 | "618": "Limonde", 620 | "619": "Kungfouine", 621 | "620": "Shaofouine", 622 | "621": "Drakkarmin", 623 | "622": "Gringolem", 624 | "623": "Golemastoc", 625 | "624": "Scalpion", 626 | "625": "Scalproie", 627 | "626": "Frison", 628 | "627": "Furaiglon", 629 | "628": "Gueriaigle", 630 | "629": "Vostourno", 631 | "630": "Vaututrice", 632 | "631": "Aflamanoir", 633 | "632": "Fermite", 634 | "633": "Solochi", 635 | "634": "Diamat", 636 | "635": "Trioxhydre", 637 | "636": "Pyronille", 638 | "637": "Pyrax", 639 | "638": "Cobaltium", 640 | "639": "Terrakium", 641 | "640": "Viridium", 642 | "641": "Bor\u00e9as", 643 | "642": "Fulguris", 644 | "643": "Reshiram", 645 | "644": "Zekrom", 646 | "645": "D\u00e9m\u00e9t\u00e9ros", 647 | "646": "Kyurem", 648 | "647": "Keldeo", 649 | "648": "Meloetta", 650 | "649": "Genesect", 651 | "650": "Marisson", 652 | "651": "Bogu\u00e9risse", 653 | "652": "Blind\u00e9pique", 654 | "653": "Feunnec", 655 | "654": "Roussil", 656 | "655": "Goupelin", 657 | "656": "Grenousse", 658 | "657": "Cro\u00e2poral", 659 | "658": "Amphinobi", 660 | "659": "Sapereau", 661 | "660": "Excavarenne", 662 | "661": "Passerouge", 663 | "662": "Braisillon", 664 | "663": "Flambusard", 665 | "664": "L\u00e9pidonille", 666 | "665": "P\u00e9r\u00e9grain", 667 | "666": "Prismillon", 668 | "667": "H\u00e9lionceau", 669 | "668": "N\u00e9m\u00e9lios", 670 | "669": "Flab\u00e9b\u00e9", 671 | "670": "Floette", 672 | "671": "Florges", 673 | "672": "Cabriolaine", 674 | "673": "Chevroum", 675 | "674": "Pandespi\u00e8gle", 676 | "675": "Pandarbare", 677 | "676": "Couafarel", 678 | "677": "Psystigri", 679 | "678": "Mistigrix", 680 | "679": "Monorpale", 681 | "680": "Dimocl\u00e8s", 682 | "681": "Exagide", 683 | "682": "Fluvetin", 684 | "683": "Cocotine", 685 | "684": "Sucroquin", 686 | "685": "Cupcanaille", 687 | "686": "Sepiatop", 688 | "687": "Sepiatroce", 689 | "688": "Opermine", 690 | "689": "Golgopathe", 691 | "690": "Venalgue", 692 | "691": "Kravarech", 693 | "692": "Flingouste", 694 | "693": "Gamblast", 695 | "694": "Galvaran", 696 | "695": "Iguolta", 697 | "696": "Ptyranidur", 698 | "697": "Rexillius", 699 | "698": "Amagara", 700 | "699": "Dragmara", 701 | "700": "Nymphali", 702 | "701": "Brutalibr\u00e9", 703 | "702": "Dedenne", 704 | "703": "Strassie", 705 | "704": "Mucuscule", 706 | "705": "Colimucus", 707 | "706": "Muplodocus", 708 | "707": "Trousselin", 709 | "708": "Broc\u00e9l\u00f4me", 710 | "709": "Dess\u00e9liande", 711 | "710": "Pitrouille", 712 | "711": "Banshitrouye", 713 | "712": "Grela\u00e7on", 714 | "713": "S\u00e9racrawl", 715 | "714": "Sonistrelle", 716 | "715": "Bruyverne", 717 | "716": "Xerneas", 718 | "717": "Yveltal", 719 | "718": "Zygarde", 720 | "719": "Diancie", 721 | "720": "Hoopa", 722 | "721": "Volcanion", 723 | "722": "Brindibou", 724 | "723": "Efflèche", 725 | "724": "Archéduc", 726 | "725": "Flamiaou", 727 | "726": "Matoufeu", 728 | "727": "Félinferno", 729 | "728": "Otaquin", 730 | "729": "Otarlette", 731 | "730": "Oratoria", 732 | "731": "Picassaut", 733 | "732": "Piclairon", 734 | "733": "Bazoucan", 735 | "734": "Manglouton", 736 | "735": "Argouste", 737 | "736": "Larvibule", 738 | "737": "Chrysapile", 739 | "738": "Lucanon", 740 | "739": "Crabagarre", 741 | "740": "Crabominable", 742 | "741": "Plumeline", 743 | "742": "Bombydou", 744 | "743": "Rubombelle", 745 | "744": "Rocabot", 746 | "745": "Lougaroc", 747 | "746": "Froussardine", 748 | "747": "Vorastérie", 749 | "748": "Prédastérie", 750 | "749": "Tiboudet", 751 | "750": "Bourrinos", 752 | "751": "Araqua", 753 | "752": "Tarenbulle", 754 | "753": "Mimantis", 755 | "754": "Floramantis", 756 | "755": "Spododo", 757 | "756": "Lampignon", 758 | "757": "Tritox", 759 | "758": "Malamandre", 760 | "759": "Nounourson", 761 | "760": "Chelours", 762 | "761": "Croquine", 763 | "762": "Candine", 764 | "763": "Sucreine", 765 | "764": "Guérilande", 766 | "765": "Gouroutan", 767 | "766": "Quartermac", 768 | "767": "Sovkipou", 769 | "768": "Sarmuraï", 770 | "769": "Bacabouh", 771 | "770": "Trépassable", 772 | "771": "Concombaffe", 773 | "772": "Type:0", 774 | "773": "Silvallié", 775 | "774": "Météno", 776 | "775": "Dodoala", 777 | "776": "Boumata", 778 | "777": "Togedemaru", 779 | "778": "Mimiqui", 780 | "779": "Denticrisse", 781 | "780": "Draïeul", 782 | "781": "Sinistrail", 783 | "782": "Bébécaille", 784 | "783": "Écaïd", 785 | "784": "Ékaïser", 786 | "785": "Tokorico", 787 | "786": "Tokopiyon", 788 | "787": "Tokotoro", 789 | "788": "Tokopisco", 790 | "789": "Cosmog", 791 | "790": "Cosmovum", 792 | "791": "Solgaleo", 793 | "792": "Lunala", 794 | "793": "Zéroïd", 795 | "794": "Mouscoto", 796 | "795": "Cancrelove", 797 | "796": "Câblifère", 798 | "797": "Bamboiselle", 799 | "798": "Katagami", 800 | "799": "Engloutyran", 801 | "800": "Necrozma", 802 | "801": "Magearna", 803 | "802": "Marshadow", 804 | "803": "Vémini", 805 | "804": "Mandrillon", 806 | "805": "Ama-Ama", 807 | "806": "Pierroteknik", 808 | "807": "Zeraora", 809 | "808": "Meltan", 810 | "809": "Melmetal", 811 | "810": "Ouistempo", 812 | "811": "Badabouin", 813 | "812": "Gorythmic", 814 | "813": "Flambino", 815 | "814": "Lapyro", 816 | "815": "Pyrobut", 817 | "816": "Larméléon", 818 | "817": "Arrozard", 819 | "818": "Lézargus", 820 | "819": "Rongourmand", 821 | "820": "Rongrigou", 822 | "821": "Minisange", 823 | "822": "Bleuseille", 824 | "823": "Corvaillus", 825 | "824": "Larvadar", 826 | "825": "Coléodôme", 827 | "826": "Astronelle", 828 | "827": "Goupilou", 829 | "828": "Roublenard", 830 | "829": "Tournicoton", 831 | "830": "Blancoton", 832 | "831": "Moumouton", 833 | "832": "Moumouflon", 834 | "833": "Khélocrok", 835 | "834": "Torgamord", 836 | "835": "Voltoutou", 837 | "836": "Fulgudog", 838 | "837": "Charbi", 839 | "838": "Wagomine", 840 | "839": "Monthracite", 841 | "840": "Verpom", 842 | "841": "Pomdrapi", 843 | "842": "Dratatin", 844 | "843": "Dunaja", 845 | "844": "Dunaconda", 846 | "845": "Nigosier", 847 | "846": "Embrochet", 848 | "847": "Hastacuda", 849 | "848": "Toxizap", 850 | "849": "Salarsen", 851 | "850": "Grillepattes", 852 | "851": "Scolocendre", 853 | "852": "Poulpaf", 854 | "853": "Krakos", 855 | "854": "Théffroi", 856 | "855": "Polthégeist", 857 | "856": "Bibichut", 858 | "857": "Chapotus", 859 | "858": "Sorcilence", 860 | "859": "Grimalin", 861 | "860": "Fourbelin", 862 | "861": "Angoliath", 863 | "862": "Ixon", 864 | "863": "Berserkatt", 865 | "864": "Corayôme", 866 | "865": "Palarticho", 867 | "866": "M.Glaquette", 868 | "867": "Tutétékri", 869 | "868": "Crèmy", 870 | "869": "Charmilly", 871 | "870": "Hexadron", 872 | "871": "Wattapik", 873 | "872": "Frissonille", 874 | "873": "Beldeneige", 875 | "874": "Dolman", 876 | "875": "Bekaglaçon", 877 | "876": "Wimessir", 878 | "877": "Morpeko", 879 | "878": "Charibari", 880 | "879": "Pachyradjah", 881 | "880": "Galvagon", 882 | "881": "Galvagla", 883 | "882": "Hydragon", 884 | "883": "Hydragla", 885 | "884": "Duralugon", 886 | "885": "Fantyrm", 887 | "886": "Dispareptil", 888 | "887": "Lanssorien", 889 | "888": "Zacian", 890 | "889": "Zamazenta", 891 | "890": "Éthernatos", 892 | "891": "Wushours", 893 | "892": "Shifours", 894 | "893": "Zarude", 895 | "894": "Regieleki", 896 | "895": "Regidrago", 897 | "896": "Blizzeval", 898 | "897": "Spectreval", 899 | "898": "Sylveroy" 900 | } 901 | -------------------------------------------------------------------------------- /data/mon_names/it.json: -------------------------------------------------------------------------------- 1 | { 2 | "1": "Bulbasaur", 3 | "2": "Ivysaur", 4 | "3": "Venusaur", 5 | "4": "Charmander", 6 | "5": "Charmeleon", 7 | "6": "Charizard", 8 | "7": "Squirtle", 9 | "8": "Wartortle", 10 | "9": "Blastoise", 11 | "10": "Caterpie", 12 | "11": "Metapod", 13 | "12": "Butterfree", 14 | "13": "Weedle", 15 | "14": "Kakuna", 16 | "15": "Beedrill", 17 | "16": "Pidgey", 18 | "17": "Pidgeotto", 19 | "18": "Pidgeot", 20 | "19": "Rattata", 21 | "20": "Raticate", 22 | "21": "Spearow", 23 | "22": "Fearow", 24 | "23": "Ekans", 25 | "24": "Arbok", 26 | "25": "Pikachu", 27 | "26": "Raichu", 28 | "27": "Sandshrew", 29 | "28": "Sandslash", 30 | "29": "Nidoran\u2640", 31 | "30": "Nidorina", 32 | "31": "Nidoqueen", 33 | "32": "Nidoran\u2642", 34 | "33": "Nidorino", 35 | "34": "Nidoking", 36 | "35": "Clefairy", 37 | "36": "Clefable", 38 | "37": "Vulpix", 39 | "38": "Ninetales", 40 | "39": "Jigglypuff", 41 | "40": "Wigglytuff", 42 | "41": "Zubat", 43 | "42": "Golbat", 44 | "43": "Oddish", 45 | "44": "Gloom", 46 | "45": "Vileplume", 47 | "46": "Paras", 48 | "47": "Parasect", 49 | "48": "Venonat", 50 | "49": "Venomoth", 51 | "50": "Diglett", 52 | "51": "Dugtrio", 53 | "52": "Meowth", 54 | "53": "Persian", 55 | "54": "Psyduck", 56 | "55": "Golduck", 57 | "56": "Mankey", 58 | "57": "Primeape", 59 | "58": "Growlithe", 60 | "59": "Arcanine", 61 | "60": "Poliwag", 62 | "61": "Poliwhirl", 63 | "62": "Poliwrath", 64 | "63": "Abra", 65 | "64": "Kadabra", 66 | "65": "Alakazam", 67 | "66": "Machop", 68 | "67": "Machoke", 69 | "68": "Machamp", 70 | "69": "Bellsprout", 71 | "70": "Weepinbell", 72 | "71": "Victreebel", 73 | "72": "Tentacool", 74 | "73": "Tentacruel", 75 | "74": "Geodude", 76 | "75": "Graveler", 77 | "76": "Golem", 78 | "77": "Ponyta", 79 | "78": "Rapidash", 80 | "79": "Slowpoke", 81 | "80": "Slowbro", 82 | "81": "Magnemite", 83 | "82": "Magneton", 84 | "83": "Farfetch'd", 85 | "84": "Doduo", 86 | "85": "Dodrio", 87 | "86": "Seel", 88 | "87": "Dewgong", 89 | "88": "Grimer", 90 | "89": "Muk", 91 | "90": "Shellder", 92 | "91": "Cloyster", 93 | "92": "Gastly", 94 | "93": "Haunter", 95 | "94": "Gengar", 96 | "95": "Onix", 97 | "96": "Drowzee", 98 | "97": "Hypno", 99 | "98": "Krabby", 100 | "99": "Kingler", 101 | "100": "Voltorb", 102 | "101": "Electrode", 103 | "102": "Exeggcute", 104 | "103": "Exeggutor", 105 | "104": "Cubone", 106 | "105": "Marowak", 107 | "106": "Hitmonlee", 108 | "107": "Hitmonchan", 109 | "108": "Lickitung", 110 | "109": "Koffing", 111 | "110": "Weezing", 112 | "111": "Rhyhorn", 113 | "112": "Rhydon", 114 | "113": "Chansey", 115 | "114": "Tangela", 116 | "115": "Kangaskhan", 117 | "116": "Horsea", 118 | "117": "Seadra", 119 | "118": "Goldeen", 120 | "119": "Seaking", 121 | "120": "Staryu", 122 | "121": "Starmie", 123 | "122": "Mr. Mime", 124 | "123": "Scyther", 125 | "124": "Jynx", 126 | "125": "Electabuzz", 127 | "126": "Magmar", 128 | "127": "Pinsir", 129 | "128": "Tauros", 130 | "129": "Magikarp", 131 | "130": "Gyarados", 132 | "131": "Lapras", 133 | "132": "Ditto", 134 | "133": "Eevee", 135 | "134": "Vaporeon", 136 | "135": "Jolteon", 137 | "136": "Flareon", 138 | "137": "Porygon", 139 | "138": "Omanyte", 140 | "139": "Omastar", 141 | "140": "Kabuto", 142 | "141": "Kabutops", 143 | "142": "Aerodactyl", 144 | "143": "Snorlax", 145 | "144": "Articuno", 146 | "145": "Zapdos", 147 | "146": "Moltres", 148 | "147": "Dratini", 149 | "148": "Dragonair", 150 | "149": "Dragonite", 151 | "150": "Mewtwo", 152 | "151": "Mew", 153 | "152": "Chikorita", 154 | "153": "Bayleef", 155 | "154": "Meganium", 156 | "155": "Cyndaquil", 157 | "156": "Quilava", 158 | "157": "Typhlosion", 159 | "158": "Totodile", 160 | "159": "Croconaw", 161 | "160": "Feraligatr", 162 | "161": "Sentret", 163 | "162": "Furret", 164 | "163": "Hoothoot", 165 | "164": "Noctowl", 166 | "165": "Ledyba", 167 | "166": "Ledian", 168 | "167": "Spinarak", 169 | "168": "Ariados", 170 | "169": "Crobat", 171 | "170": "Chinchou", 172 | "171": "Lanturn", 173 | "172": "Pichu", 174 | "173": "Cleffa", 175 | "174": "Igglybuff", 176 | "175": "Togepi", 177 | "176": "Togetic", 178 | "177": "Natu", 179 | "178": "Xatu", 180 | "179": "Mareep", 181 | "180": "Flaaffy", 182 | "181": "Ampharos", 183 | "182": "Bellossom", 184 | "183": "Marill", 185 | "184": "Azumarill", 186 | "185": "Sudowoodo", 187 | "186": "Politoed", 188 | "187": "Hoppip", 189 | "188": "Skiploom", 190 | "189": "Jumpluff", 191 | "190": "Aipom", 192 | "191": "Sunkern", 193 | "192": "Sunflora", 194 | "193": "Yanma", 195 | "194": "Wooper", 196 | "195": "Quagsire", 197 | "196": "Espeon", 198 | "197": "Umbreon", 199 | "198": "Murkrow", 200 | "199": "Slowking", 201 | "200": "Misdreavus", 202 | "201": "Unown", 203 | "202": "Wobbuffet", 204 | "203": "Girafarig", 205 | "204": "Pineco", 206 | "205": "Forretress", 207 | "206": "Dunsparce", 208 | "207": "Gligar", 209 | "208": "Steelix", 210 | "209": "Snubbull", 211 | "210": "Granbull", 212 | "211": "Qwilfish", 213 | "212": "Scizor", 214 | "213": "Shuckle", 215 | "214": "Heracross", 216 | "215": "Sneasel", 217 | "216": "Teddiursa", 218 | "217": "Ursaring", 219 | "218": "Slugma", 220 | "219": "Magcargo", 221 | "220": "Swinub", 222 | "221": "Piloswine", 223 | "222": "Corsola", 224 | "223": "Remoraid", 225 | "224": "Octillery", 226 | "225": "Delibird", 227 | "226": "Mantine", 228 | "227": "Skarmory", 229 | "228": "Houndour", 230 | "229": "Houndoom", 231 | "230": "Kingdra", 232 | "231": "Phanpy", 233 | "232": "Donphan", 234 | "233": "Porygon2", 235 | "234": "Stantler", 236 | "235": "Smeargle", 237 | "236": "Tyrogue", 238 | "237": "Hitmontop", 239 | "238": "Smoochum", 240 | "239": "Elekid", 241 | "240": "Magby", 242 | "241": "Miltank", 243 | "242": "Blissey", 244 | "243": "Raikou", 245 | "244": "Entei", 246 | "245": "Suicune", 247 | "246": "Larvitar", 248 | "247": "Pupitar", 249 | "248": "Tyranitar", 250 | "249": "Lugia", 251 | "250": "Ho-Oh", 252 | "251": "Celebi", 253 | "252": "Treecko", 254 | "253": "Grovyle", 255 | "254": "Sceptile", 256 | "255": "Torchic", 257 | "256": "Combusken", 258 | "257": "Blaziken", 259 | "258": "Mudkip", 260 | "259": "Marshtomp", 261 | "260": "Swampert", 262 | "261": "Poochyena", 263 | "262": "Mightyena", 264 | "263": "Zigzagoon", 265 | "264": "Linoone", 266 | "265": "Wurmple", 267 | "266": "Silcoon", 268 | "267": "Beautifly", 269 | "268": "Cascoon", 270 | "269": "Dustox", 271 | "270": "Lotad", 272 | "271": "Lombre", 273 | "272": "Ludicolo", 274 | "273": "Seedot", 275 | "274": "Nuzleaf", 276 | "275": "Shiftry", 277 | "276": "Taillow", 278 | "277": "Swellow", 279 | "278": "Wingull", 280 | "279": "Pelipper", 281 | "280": "Ralts", 282 | "281": "Kirlia", 283 | "282": "Gardevoir", 284 | "283": "Surskit", 285 | "284": "Masquerain", 286 | "285": "Shroomish", 287 | "286": "Breloom", 288 | "287": "Slakoth", 289 | "288": "Vigoroth", 290 | "289": "Slaking", 291 | "290": "Nincada", 292 | "291": "Ninjask", 293 | "292": "Shedinja", 294 | "293": "Whismur", 295 | "294": "Loudred", 296 | "295": "Exploud", 297 | "296": "Makuhita", 298 | "297": "Hariyama", 299 | "298": "Azurill", 300 | "299": "Nosepass", 301 | "300": "Skitty", 302 | "301": "Delcatty", 303 | "302": "Sableye", 304 | "303": "Mawile", 305 | "304": "Aron", 306 | "305": "Lairon", 307 | "306": "Aggron", 308 | "307": "Meditite", 309 | "308": "Medicham", 310 | "309": "Electrike", 311 | "310": "Manectric", 312 | "311": "Plusle", 313 | "312": "Minun", 314 | "313": "Volbeat", 315 | "314": "Illumise", 316 | "315": "Roselia", 317 | "316": "Gulpin", 318 | "317": "Swalot", 319 | "318": "Carvanha", 320 | "319": "Sharpedo", 321 | "320": "Wailmer", 322 | "321": "Wailord", 323 | "322": "Numel", 324 | "323": "Camerupt", 325 | "324": "Torkoal", 326 | "325": "Spoink", 327 | "326": "Grumpig", 328 | "327": "Spinda", 329 | "328": "Trapinch", 330 | "329": "Vibrava", 331 | "330": "Flygon", 332 | "331": "Cacnea", 333 | "332": "Cacturne", 334 | "333": "Swablu", 335 | "334": "Altaria", 336 | "335": "Zangoose", 337 | "336": "Seviper", 338 | "337": "Lunatone", 339 | "338": "Solrock", 340 | "339": "Barboach", 341 | "340": "Whiscash", 342 | "341": "Corphish", 343 | "342": "Crawdaunt", 344 | "343": "Baltoy", 345 | "344": "Claydol", 346 | "345": "Lileep", 347 | "346": "Cradily", 348 | "347": "Anorith", 349 | "348": "Armaldo", 350 | "349": "Feebas", 351 | "350": "Milotic", 352 | "351": "Castform", 353 | "352": "Kecleon", 354 | "353": "Shuppet", 355 | "354": "Banette", 356 | "355": "Duskull", 357 | "356": "Dusclops", 358 | "357": "Tropius", 359 | "358": "Chimecho", 360 | "359": "Absol", 361 | "360": "Wynaut", 362 | "361": "Snorunt", 363 | "362": "Glalie", 364 | "363": "Spheal", 365 | "364": "Sealeo", 366 | "365": "Walrein", 367 | "366": "Clamperl", 368 | "367": "Huntail", 369 | "368": "Gorebyss", 370 | "369": "Relicanth", 371 | "370": "Luvdisc", 372 | "371": "Bagon", 373 | "372": "Shelgon", 374 | "373": "Salamence", 375 | "374": "Beldum", 376 | "375": "Metang", 377 | "376": "Metagross", 378 | "377": "Regirock", 379 | "378": "Regice", 380 | "379": "Registeel", 381 | "380": "Latias", 382 | "381": "Latios", 383 | "382": "Kyogre", 384 | "383": "Groudon", 385 | "384": "Rayquaza", 386 | "385": "Jirachi", 387 | "386": "Deoxys", 388 | "387": "Turtwig", 389 | "388": "Grotle", 390 | "389": "Torterra", 391 | "390": "Chimchar", 392 | "391": "Monferno", 393 | "392": "Infernape", 394 | "393": "Piplup", 395 | "394": "Prinplup", 396 | "395": "Empoleon", 397 | "396": "Starly", 398 | "397": "Staravia", 399 | "398": "Staraptor", 400 | "399": "Bidoof", 401 | "400": "Bibarel", 402 | "401": "Kricketot", 403 | "402": "Kricketune", 404 | "403": "Shinx", 405 | "404": "Luxio", 406 | "405": "Luxray", 407 | "406": "Budew", 408 | "407": "Roserade", 409 | "408": "Cranidos", 410 | "409": "Rampardos", 411 | "410": "Shieldon", 412 | "411": "Bastiodon", 413 | "412": "Burmy", 414 | "413": "Wormadam", 415 | "414": "Mothim", 416 | "415": "Combee", 417 | "416": "Vespiquen", 418 | "417": "Pachirisu", 419 | "418": "Buizel", 420 | "419": "Floatzel", 421 | "420": "Cherubi", 422 | "421": "Cherrim", 423 | "422": "Shellos", 424 | "423": "Gastrodon", 425 | "424": "Ambipom", 426 | "425": "Drifloon", 427 | "426": "Drifblim", 428 | "427": "Buneary", 429 | "428": "Lopunny", 430 | "429": "Mismagius", 431 | "430": "Honchkrow", 432 | "431": "Glameow", 433 | "432": "Purugly", 434 | "433": "Chingling", 435 | "434": "Stunky", 436 | "435": "Skuntank", 437 | "436": "Bronzor", 438 | "437": "Bronzong", 439 | "438": "Bonsly", 440 | "439": "Mime Jr.", 441 | "440": "Happiny", 442 | "441": "Chatot", 443 | "442": "Spiritomb", 444 | "443": "Gible", 445 | "444": "Gabite", 446 | "445": "Garchomp", 447 | "446": "Munchlax", 448 | "447": "Riolu", 449 | "448": "Lucario", 450 | "449": "Hippopotas", 451 | "450": "Hippowdon", 452 | "451": "Skorupi", 453 | "452": "Drapion", 454 | "453": "Croagunk", 455 | "454": "Toxicroak", 456 | "455": "Carnivine", 457 | "456": "Finneon", 458 | "457": "Lumineon", 459 | "458": "Mantyke", 460 | "459": "Snover", 461 | "460": "Abomasnow", 462 | "461": "Weavile", 463 | "462": "Magnezone", 464 | "463": "Lickilicky", 465 | "464": "Rhyperior", 466 | "465": "Tangrowth", 467 | "466": "Electivire", 468 | "467": "Magmortar", 469 | "468": "Togekiss", 470 | "469": "Yanmega", 471 | "470": "Leafeon", 472 | "471": "Glaceon", 473 | "472": "Gliscor", 474 | "473": "Mamoswine", 475 | "474": "Porygon-Z", 476 | "475": "Gallade", 477 | "476": "Probopass", 478 | "477": "Dusknoir", 479 | "478": "Froslass", 480 | "479": "Rotom", 481 | "480": "Uxie", 482 | "481": "Mesprit", 483 | "482": "Azelf", 484 | "483": "Dialga", 485 | "484": "Palkia", 486 | "485": "Heatran", 487 | "486": "Regigigas", 488 | "487": "Giratina", 489 | "488": "Cresselia", 490 | "489": "Phione", 491 | "490": "Manaphy", 492 | "491": "Darkrai", 493 | "492": "Shaymin", 494 | "493": "Arceus", 495 | "494": "Victini", 496 | "495": "Snivy", 497 | "496": "Servine", 498 | "497": "Serperior", 499 | "498": "Tepig", 500 | "499": "Pignite", 501 | "500": "Emboar", 502 | "501": "Oshawott", 503 | "502": "Dewott", 504 | "503": "Samurott", 505 | "504": "Patrat", 506 | "505": "Watchog", 507 | "506": "Lillipup", 508 | "507": "Herdier", 509 | "508": "Stoutland", 510 | "509": "Purrloin", 511 | "510": "Liepard", 512 | "511": "Pansage", 513 | "512": "Simisage", 514 | "513": "Pansear", 515 | "514": "Simisear", 516 | "515": "Panpour", 517 | "516": "Simipour", 518 | "517": "Munna", 519 | "518": "Musharna", 520 | "519": "Pidove", 521 | "520": "Tranquill", 522 | "521": "Unfezant", 523 | "522": "Blitzle", 524 | "523": "Zebstrika", 525 | "524": "Roggenrola", 526 | "525": "Boldore", 527 | "526": "Gigalith", 528 | "527": "Woobat", 529 | "528": "Swoobat", 530 | "529": "Drilbur", 531 | "530": "Excadrill", 532 | "531": "Audino", 533 | "532": "Timburr", 534 | "533": "Gurdurr", 535 | "534": "Conkeldurr", 536 | "535": "Tympole", 537 | "536": "Palpitoad", 538 | "537": "Seismitoad", 539 | "538": "Throh", 540 | "539": "Sawk", 541 | "540": "Sewaddle", 542 | "541": "Swadloon", 543 | "542": "Leavanny", 544 | "543": "Venipede", 545 | "544": "Whirlipede", 546 | "545": "Scolipede", 547 | "546": "Cottonee", 548 | "547": "Whimsicott", 549 | "548": "Petilil", 550 | "549": "Lilligant", 551 | "550": "Basculin", 552 | "551": "Sandile", 553 | "552": "Krokorok", 554 | "553": "Krookodile", 555 | "554": "Darumaka", 556 | "555": "Darmanitan", 557 | "556": "Maractus", 558 | "557": "Dwebble", 559 | "558": "Crustle", 560 | "559": "Scraggy", 561 | "560": "Scrafty", 562 | "561": "Sigilyph", 563 | "562": "Yamask", 564 | "563": "Cofagrigus", 565 | "564": "Tirtouga", 566 | "565": "Carracosta", 567 | "566": "Archen", 568 | "567": "Archeops", 569 | "568": "Trubbish", 570 | "569": "Garbodor", 571 | "570": "Zorua", 572 | "571": "Zoroark", 573 | "572": "Minccino", 574 | "573": "Cinccino", 575 | "574": "Gothita", 576 | "575": "Gothorita", 577 | "576": "Gothitelle", 578 | "577": "Solosis", 579 | "578": "Duosion", 580 | "579": "Reuniclus", 581 | "580": "Ducklett", 582 | "581": "Swanna", 583 | "582": "Vanillite", 584 | "583": "Vanillish", 585 | "584": "Vanilluxe", 586 | "585": "Deerling", 587 | "586": "Sawsbuck", 588 | "587": "Emolga", 589 | "588": "Karrablast", 590 | "589": "Escavalier", 591 | "590": "Foongus", 592 | "591": "Amoonguss", 593 | "592": "Frillish", 594 | "593": "Jellicent", 595 | "594": "Alomomola", 596 | "595": "Joltik", 597 | "596": "Galvantula", 598 | "597": "Ferroseed", 599 | "598": "Ferrothorn", 600 | "599": "Klink", 601 | "600": "Klang", 602 | "601": "Klinklang", 603 | "602": "Tynamo", 604 | "603": "Eelektrik", 605 | "604": "Eelektross", 606 | "605": "Elgyem", 607 | "606": "Beheeyem", 608 | "607": "Litwick", 609 | "608": "Lampent", 610 | "609": "Chandelure", 611 | "610": "Axew", 612 | "611": "Fraxure", 613 | "612": "Haxorus", 614 | "613": "Cubchoo", 615 | "614": "Beartic", 616 | "615": "Cryogonal", 617 | "616": "Shelmet", 618 | "617": "Accelgor", 619 | "618": "Stunfisk", 620 | "619": "Mienfoo", 621 | "620": "Mienshao", 622 | "621": "Druddigon", 623 | "622": "Golett", 624 | "623": "Golurk", 625 | "624": "Pawniard", 626 | "625": "Bisharp", 627 | "626": "Bouffalant", 628 | "627": "Rufflet", 629 | "628": "Braviary", 630 | "629": "Vullaby", 631 | "630": "Mandibuzz", 632 | "631": "Heatmor", 633 | "632": "Durant", 634 | "633": "Deino", 635 | "634": "Zweilous", 636 | "635": "Hydreigon", 637 | "636": "Larvesta", 638 | "637": "Volcarona", 639 | "638": "Cobalion", 640 | "639": "Terrakion", 641 | "640": "Virizion", 642 | "641": "Tornadus", 643 | "642": "Thundurus", 644 | "643": "Reshiram", 645 | "644": "Zekrom", 646 | "645": "Landorus", 647 | "646": "Kyurem", 648 | "647": "Keldeo", 649 | "648": "Meloetta", 650 | "649": "Genesect", 651 | "650": "Chespin", 652 | "651": "Quilladin", 653 | "652": "Chesnaught", 654 | "653": "Fennekin", 655 | "654": "Braixen", 656 | "655": "Delphox", 657 | "656": "Froakie", 658 | "657": "Frogadier", 659 | "658": "Greninja", 660 | "659": "Bunnelby", 661 | "660": "Diggersby", 662 | "661": "Fletchling", 663 | "662": "Fletchinder", 664 | "663": "Talonflame", 665 | "664": "Scatterbug", 666 | "665": "Spewpa", 667 | "666": "Vivillon", 668 | "667": "Litleo", 669 | "668": "Pyroar", 670 | "669": "Flab\u00e9b\u00e9", 671 | "670": "Floette", 672 | "671": "Florges", 673 | "672": "Skiddo", 674 | "673": "Gogoat", 675 | "674": "Pancham", 676 | "675": "Pangoro", 677 | "676": "Furfrou", 678 | "677": "Espurr", 679 | "678": "Meowstic", 680 | "679": "Honedge", 681 | "680": "Doublade", 682 | "681": "Aegislash", 683 | "682": "Spritzee", 684 | "683": "Aromatisse", 685 | "684": "Swirlix", 686 | "685": "Slurpuff", 687 | "686": "Inkay", 688 | "687": "Malamar", 689 | "688": "Binacle", 690 | "689": "Barbaracle", 691 | "690": "Skrelp", 692 | "691": "Dragalge", 693 | "692": "Clauncher", 694 | "693": "Clawitzer", 695 | "694": "Helioptile", 696 | "695": "Heliolisk", 697 | "696": "Tyrunt", 698 | "697": "Tyrantrum", 699 | "698": "Amaura", 700 | "699": "Aurorus", 701 | "700": "Sylveon", 702 | "701": "Hawlucha", 703 | "702": "Dedenne", 704 | "703": "Carbink", 705 | "704": "Goomy", 706 | "705": "Sliggoo", 707 | "706": "Goodra", 708 | "707": "Klefki", 709 | "708": "Phantump", 710 | "709": "Trevenant", 711 | "710": "Pumpkaboo", 712 | "711": "Gourgeist", 713 | "712": "Bergmite", 714 | "713": "Avalugg", 715 | "714": "Noibat", 716 | "715": "Noivern", 717 | "716": "Xerneas", 718 | "717": "Yveltal", 719 | "718": "Zygarde", 720 | "719": "Diancie", 721 | "720": "Hoopa", 722 | "721": "Volcanion", 723 | "722": "Rowlet", 724 | "723": "Dartrix", 725 | "724": "Decidueye", 726 | "725": "Litten", 727 | "726": "Torracat", 728 | "727": "Incineroar", 729 | "728": "Popplio", 730 | "729": "Brionne", 731 | "730": "Primarina", 732 | "731": "Pikipek", 733 | "732": "Trumbeak", 734 | "733": "Toucannon", 735 | "734": "Yungoos", 736 | "735": "Gumshoos", 737 | "736": "Grubbin", 738 | "737": "Charjabug", 739 | "738": "Vikavolt", 740 | "739": "Crabrawler", 741 | "740": "Crabominable", 742 | "741": "Oricorio", 743 | "742": "Cutiefly", 744 | "743": "Ribombee", 745 | "744": "Rockruff", 746 | "745": "Lycanroc", 747 | "746": "Wishiwashi", 748 | "747": "Mareanie", 749 | "748": "Toxapex", 750 | "749": "Mudbray", 751 | "750": "Mudsdale", 752 | "751": "Dewpider", 753 | "752": "Araquanid", 754 | "753": "Fomantis", 755 | "754": "Lurantis", 756 | "755": "Morelull", 757 | "756": "Shiinotic", 758 | "757": "Salandit", 759 | "758": "Salazzle", 760 | "759": "Stufful", 761 | "760": "Bewear", 762 | "761": "Bounsweet", 763 | "762": "Steenee", 764 | "763": "Tsareena", 765 | "764": "Comfey", 766 | "765": "Oranguru", 767 | "766": "Passimian", 768 | "767": "Wimpod", 769 | "768": "Golisopod", 770 | "769": "Sandygast", 771 | "770": "Palossand", 772 | "771": "Pyukumuku", 773 | "772": "Type: Null", 774 | "773": "Silvally", 775 | "774": "Minior", 776 | "775": "Komala", 777 | "776": "Turtonator", 778 | "777": "Togedemaru", 779 | "778": "Mimikyu", 780 | "779": "Bruxish", 781 | "780": "Drampa", 782 | "781": "Dhelmise", 783 | "782": "Jangmo-o", 784 | "783": "Hakamo-o", 785 | "784": "Kommo-o", 786 | "785": "Tapu Koko", 787 | "786": "Tapu Lele", 788 | "787": "Tapu Bulu", 789 | "788": "Tapu Fini", 790 | "789": "Cosmog", 791 | "790": "Cosmoem", 792 | "791": "Solgaleo", 793 | "792": "Lunala", 794 | "793": "Nihilego", 795 | "794": "Buzzwole", 796 | "795": "Pheromosa", 797 | "796": "Xurkitree", 798 | "797": "Celesteela", 799 | "798": "Kartana", 800 | "799": "Guzzlord", 801 | "800": "Necrozma", 802 | "801": "Magearna", 803 | "802": "Marshadow", 804 | "803": "Poipole", 805 | "804": "Naganadel", 806 | "805": "Stakataka", 807 | "806": "Blacephalon", 808 | "807": "Zeraora", 809 | "808": "Meltan", 810 | "809": "Melmetal", 811 | "810": "Grookey", 812 | "811": "Thwackey", 813 | "812": "Rillaboom", 814 | "813": "Scorbunny", 815 | "814": "Raboot", 816 | "815": "Cinderace", 817 | "816": "Sobble", 818 | "817": "Drizzile", 819 | "818": "Inteleon", 820 | "819": "Skwovet", 821 | "820": "Greedent", 822 | "821": "Rookidee", 823 | "822": "Corvisquire", 824 | "823": "Corviknight", 825 | "824": "Blipbug", 826 | "825": "Dottler", 827 | "826": "Orbeetle", 828 | "827": "Nickit", 829 | "828": "Thievul", 830 | "829": "Gossifleur", 831 | "830": "Eldegoss", 832 | "831": "Wooloo", 833 | "832": "Dubwool", 834 | "833": "Chewtle", 835 | "834": "Drednaw", 836 | "835": "Yamper", 837 | "836": "Boltund", 838 | "837": "Rolycoly", 839 | "838": "Carkol", 840 | "839": "Coalossal", 841 | "840": "Applin", 842 | "841": "Flapple", 843 | "842": "Appletun", 844 | "843": "Silicobra", 845 | "844": "Sandaconda", 846 | "845": "Cramorant", 847 | "846": "Arrokuda", 848 | "847": "Barraskewda", 849 | "848": "Toxel", 850 | "849": "Toxtricity", 851 | "850": "Sizzlipede", 852 | "851": "Centiskorch", 853 | "852": "Clobbopus", 854 | "853": "Grapploct", 855 | "854": "Sinistea", 856 | "855": "Polteageist", 857 | "856": "Hatenna", 858 | "857": "Hattrem", 859 | "858": "Hatterene", 860 | "859": "Impidimp", 861 | "860": "Morgrem", 862 | "861": "Grimmsnarl", 863 | "862": "Obstagoon", 864 | "863": "Perrserker", 865 | "864": "Cursola", 866 | "865": "Sirfetch’d", 867 | "866": "Mr.Rime", 868 | "867": "Runerigus", 869 | "868": "Milcery", 870 | "869": "Alcremie", 871 | "870": "Falinks", 872 | "871": "Pincurchin", 873 | "872": "Snom", 874 | "873": "Frosmoth", 875 | "874": "Stonjourner", 876 | "875": "Eiscue", 877 | "876": "Indeedee", 878 | "877": "Morpeko", 879 | "878": "Cufant", 880 | "879": "Copperajah", 881 | "880": "Dracozolt", 882 | "881": "Arctozolt", 883 | "882": "Dracovish", 884 | "883": "Arctovish", 885 | "884": "Duraludon", 886 | "885": "Dreepy", 887 | "886": "Drakloak", 888 | "887": "Dragapult", 889 | "888": "Zacian", 890 | "889": "Zamazenta", 891 | "890": "Eternatus", 892 | "891": "Kubfu", 893 | "892": "Urshifu", 894 | "893": "Zarude", 895 | "894": "Regieleki", 896 | "895": "Regidrago", 897 | "896": "Glastrier", 898 | "897": "Spectrier", 899 | "898": "Calyrex" 900 | } -------------------------------------------------------------------------------- /data/mon_names/pt.json: -------------------------------------------------------------------------------- 1 | { 2 | "1": "Bulbasaur", 3 | "2": "Ivysaur", 4 | "3": "Venusaur", 5 | "4": "Charmander", 6 | "5": "Charmeleon", 7 | "6": "Charizard", 8 | "7": "Squirtle", 9 | "8": "Wartortle", 10 | "9": "Blastoise", 11 | "10": "Caterpie", 12 | "11": "Metapod", 13 | "12": "Butterfree", 14 | "13": "Weedle", 15 | "14": "Kakuna", 16 | "15": "Beedrill", 17 | "16": "Pidgey", 18 | "17": "Pidgeotto", 19 | "18": "Pidgeot", 20 | "19": "Rattata", 21 | "20": "Raticate", 22 | "21": "Spearow", 23 | "22": "Fearow", 24 | "23": "Ekans", 25 | "24": "Arbok", 26 | "25": "Pikachu", 27 | "26": "Raichu", 28 | "27": "Sandshrew", 29 | "28": "Sandslash", 30 | "29": "Nidoran\u2640", 31 | "30": "Nidorina", 32 | "31": "Nidoqueen", 33 | "32": "Nidoran\u2642", 34 | "33": "Nidorino", 35 | "34": "Nidoking", 36 | "35": "Clefairy", 37 | "36": "Clefable", 38 | "37": "Vulpix", 39 | "38": "Ninetales", 40 | "39": "Jigglypuff", 41 | "40": "Wigglytuff", 42 | "41": "Zubat", 43 | "42": "Golbat", 44 | "43": "Oddish", 45 | "44": "Gloom", 46 | "45": "Vileplume", 47 | "46": "Paras", 48 | "47": "Parasect", 49 | "48": "Venonat", 50 | "49": "Venomoth", 51 | "50": "Diglett", 52 | "51": "Dugtrio", 53 | "52": "Meowth", 54 | "53": "Persian", 55 | "54": "Psyduck", 56 | "55": "Golduck", 57 | "56": "Mankey", 58 | "57": "Primeape", 59 | "58": "Growlithe", 60 | "59": "Arcanine", 61 | "60": "Poliwag", 62 | "61": "Poliwhirl", 63 | "62": "Poliwrath", 64 | "63": "Abra", 65 | "64": "Kadabra", 66 | "65": "Alakazam", 67 | "66": "Machop", 68 | "67": "Machoke", 69 | "68": "Machamp", 70 | "69": "Bellsprout", 71 | "70": "Weepinbell", 72 | "71": "Victreebel", 73 | "72": "Tentacool", 74 | "73": "Tentacruel", 75 | "74": "Geodude", 76 | "75": "Graveler", 77 | "76": "Golem", 78 | "77": "Ponyta", 79 | "78": "Rapidash", 80 | "79": "Slowpoke", 81 | "80": "Slowbro", 82 | "81": "Magnemite", 83 | "82": "Magneton", 84 | "83": "Farfetch'd", 85 | "84": "Doduo", 86 | "85": "Dodrio", 87 | "86": "Seel", 88 | "87": "Dewgong", 89 | "88": "Grimer", 90 | "89": "Muk", 91 | "90": "Shellder", 92 | "91": "Cloyster", 93 | "92": "Gastly", 94 | "93": "Haunter", 95 | "94": "Gengar", 96 | "95": "Onix", 97 | "96": "Drowzee", 98 | "97": "Hypno", 99 | "98": "Krabby", 100 | "99": "Kingler", 101 | "100": "Voltorb", 102 | "101": "Electrode", 103 | "102": "Exeggcute", 104 | "103": "Exeggutor", 105 | "104": "Cubone", 106 | "105": "Marowak", 107 | "106": "Hitmonlee", 108 | "107": "Hitmonchan", 109 | "108": "Lickitung", 110 | "109": "Koffing", 111 | "110": "Weezing", 112 | "111": "Rhyhorn", 113 | "112": "Rhydon", 114 | "113": "Chansey", 115 | "114": "Tangela", 116 | "115": "Kangaskhan", 117 | "116": "Horsea", 118 | "117": "Seadra", 119 | "118": "Goldeen", 120 | "119": "Seaking", 121 | "120": "Staryu", 122 | "121": "Starmie", 123 | "122": "Mr. Mime", 124 | "123": "Scyther", 125 | "124": "Jynx", 126 | "125": "Electabuzz", 127 | "126": "Magmar", 128 | "127": "Pinsir", 129 | "128": "Tauros", 130 | "129": "Magikarp", 131 | "130": "Gyarados", 132 | "131": "Lapras", 133 | "132": "Ditto", 134 | "133": "Eevee", 135 | "134": "Vaporeon", 136 | "135": "Jolteon", 137 | "136": "Flareon", 138 | "137": "Porygon", 139 | "138": "Omanyte", 140 | "139": "Omastar", 141 | "140": "Kabuto", 142 | "141": "Kabutops", 143 | "142": "Aerodactyl", 144 | "143": "Snorlax", 145 | "144": "Articuno", 146 | "145": "Zapdos", 147 | "146": "Moltres", 148 | "147": "Dratini", 149 | "148": "Dragonair", 150 | "149": "Dragonite", 151 | "150": "Mewtwo", 152 | "151": "Mew", 153 | "152": "Chikorita", 154 | "153": "Bayleef", 155 | "154": "Meganium", 156 | "155": "Cyndaquil", 157 | "156": "Quilava", 158 | "157": "Typhlosion", 159 | "158": "Totodile", 160 | "159": "Croconaw", 161 | "160": "Feraligatr", 162 | "161": "Sentret", 163 | "162": "Furret", 164 | "163": "Hoothoot", 165 | "164": "Noctowl", 166 | "165": "Ledyba", 167 | "166": "Ledian", 168 | "167": "Spinarak", 169 | "168": "Ariados", 170 | "169": "Crobat", 171 | "170": "Chinchou", 172 | "171": "Lanturn", 173 | "172": "Pichu", 174 | "173": "Cleffa", 175 | "174": "Igglybuff", 176 | "175": "Togepi", 177 | "176": "Togetic", 178 | "177": "Natu", 179 | "178": "Xatu", 180 | "179": "Mareep", 181 | "180": "Flaaffy", 182 | "181": "Ampharos", 183 | "182": "Bellossom", 184 | "183": "Marill", 185 | "184": "Azumarill", 186 | "185": "Sudowoodo", 187 | "186": "Politoed", 188 | "187": "Hoppip", 189 | "188": "Skiploom", 190 | "189": "Jumpluff", 191 | "190": "Aipom", 192 | "191": "Sunkern", 193 | "192": "Sunflora", 194 | "193": "Yanma", 195 | "194": "Wooper", 196 | "195": "Quagsire", 197 | "196": "Espeon", 198 | "197": "Umbreon", 199 | "198": "Murkrow", 200 | "199": "Slowking", 201 | "200": "Misdreavus", 202 | "201": "Unown", 203 | "202": "Wobbuffet", 204 | "203": "Girafarig", 205 | "204": "Pineco", 206 | "205": "Forretress", 207 | "206": "Dunsparce", 208 | "207": "Gligar", 209 | "208": "Steelix", 210 | "209": "Snubbull", 211 | "210": "Granbull", 212 | "211": "Qwilfish", 213 | "212": "Scizor", 214 | "213": "Shuckle", 215 | "214": "Heracross", 216 | "215": "Sneasel", 217 | "216": "Teddiursa", 218 | "217": "Ursaring", 219 | "218": "Slugma", 220 | "219": "Magcargo", 221 | "220": "Swinub", 222 | "221": "Piloswine", 223 | "222": "Corsola", 224 | "223": "Remoraid", 225 | "224": "Octillery", 226 | "225": "Delibird", 227 | "226": "Mantine", 228 | "227": "Skarmory", 229 | "228": "Houndour", 230 | "229": "Houndoom", 231 | "230": "Kingdra", 232 | "231": "Phanpy", 233 | "232": "Donphan", 234 | "233": "Porygon2", 235 | "234": "Stantler", 236 | "235": "Smeargle", 237 | "236": "Tyrogue", 238 | "237": "Hitmontop", 239 | "238": "Smoochum", 240 | "239": "Elekid", 241 | "240": "Magby", 242 | "241": "Miltank", 243 | "242": "Blissey", 244 | "243": "Raikou", 245 | "244": "Entei", 246 | "245": "Suicune", 247 | "246": "Larvitar", 248 | "247": "Pupitar", 249 | "248": "Tyranitar", 250 | "249": "Lugia", 251 | "250": "Ho-Oh", 252 | "251": "Celebi", 253 | "252": "Treecko", 254 | "253": "Grovyle", 255 | "254": "Sceptile", 256 | "255": "Torchic", 257 | "256": "Combusken", 258 | "257": "Blaziken", 259 | "258": "Mudkip", 260 | "259": "Marshtomp", 261 | "260": "Swampert", 262 | "261": "Poochyena", 263 | "262": "Mightyena", 264 | "263": "Zigzagoon", 265 | "264": "Linoone", 266 | "265": "Wurmple", 267 | "266": "Silcoon", 268 | "267": "Beautifly", 269 | "268": "Cascoon", 270 | "269": "Dustox", 271 | "270": "Lotad", 272 | "271": "Lombre", 273 | "272": "Ludicolo", 274 | "273": "Seedot", 275 | "274": "Nuzleaf", 276 | "275": "Shiftry", 277 | "276": "Taillow", 278 | "277": "Swellow", 279 | "278": "Wingull", 280 | "279": "Pelipper", 281 | "280": "Ralts", 282 | "281": "Kirlia", 283 | "282": "Gardevoir", 284 | "283": "Surskit", 285 | "284": "Masquerain", 286 | "285": "Shroomish", 287 | "286": "Breloom", 288 | "287": "Slakoth", 289 | "288": "Vigoroth", 290 | "289": "Slaking", 291 | "290": "Nincada", 292 | "291": "Ninjask", 293 | "292": "Shedinja", 294 | "293": "Whismur", 295 | "294": "Loudred", 296 | "295": "Exploud", 297 | "296": "Makuhita", 298 | "297": "Hariyama", 299 | "298": "Azurill", 300 | "299": "Nosepass", 301 | "300": "Skitty", 302 | "301": "Delcatty", 303 | "302": "Sableye", 304 | "303": "Mawile", 305 | "304": "Aron", 306 | "305": "Lairon", 307 | "306": "Aggron", 308 | "307": "Meditite", 309 | "308": "Medicham", 310 | "309": "Electrike", 311 | "310": "Manectric", 312 | "311": "Plusle", 313 | "312": "Minun", 314 | "313": "Volbeat", 315 | "314": "Illumise", 316 | "315": "Roselia", 317 | "316": "Gulpin", 318 | "317": "Swalot", 319 | "318": "Carvanha", 320 | "319": "Sharpedo", 321 | "320": "Wailmer", 322 | "321": "Wailord", 323 | "322": "Numel", 324 | "323": "Camerupt", 325 | "324": "Torkoal", 326 | "325": "Spoink", 327 | "326": "Grumpig", 328 | "327": "Spinda", 329 | "328": "Trapinch", 330 | "329": "Vibrava", 331 | "330": "Flygon", 332 | "331": "Cacnea", 333 | "332": "Cacturne", 334 | "333": "Swablu", 335 | "334": "Altaria", 336 | "335": "Zangoose", 337 | "336": "Seviper", 338 | "337": "Lunatone", 339 | "338": "Solrock", 340 | "339": "Barboach", 341 | "340": "Whiscash", 342 | "341": "Corphish", 343 | "342": "Crawdaunt", 344 | "343": "Baltoy", 345 | "344": "Claydol", 346 | "345": "Lileep", 347 | "346": "Cradily", 348 | "347": "Anorith", 349 | "348": "Armaldo", 350 | "349": "Feebas", 351 | "350": "Milotic", 352 | "351": "Castform", 353 | "352": "Kecleon", 354 | "353": "Shuppet", 355 | "354": "Banette", 356 | "355": "Duskull", 357 | "356": "Dusclops", 358 | "357": "Tropius", 359 | "358": "Chimecho", 360 | "359": "Absol", 361 | "360": "Wynaut", 362 | "361": "Snorunt", 363 | "362": "Glalie", 364 | "363": "Spheal", 365 | "364": "Sealeo", 366 | "365": "Walrein", 367 | "366": "Clamperl", 368 | "367": "Huntail", 369 | "368": "Gorebyss", 370 | "369": "Relicanth", 371 | "370": "Luvdisc", 372 | "371": "Bagon", 373 | "372": "Shelgon", 374 | "373": "Salamence", 375 | "374": "Beldum", 376 | "375": "Metang", 377 | "376": "Metagross", 378 | "377": "Regirock", 379 | "378": "Regice", 380 | "379": "Registeel", 381 | "380": "Latias", 382 | "381": "Latios", 383 | "382": "Kyogre", 384 | "383": "Groudon", 385 | "384": "Rayquaza", 386 | "385": "Jirachi", 387 | "386": "Deoxys", 388 | "387": "Turtwig", 389 | "388": "Grotle", 390 | "389": "Torterra", 391 | "390": "Chimchar", 392 | "391": "Monferno", 393 | "392": "Infernape", 394 | "393": "Piplup", 395 | "394": "Prinplup", 396 | "395": "Empoleon", 397 | "396": "Starly", 398 | "397": "Staravia", 399 | "398": "Staraptor", 400 | "399": "Bidoof", 401 | "400": "Bibarel", 402 | "401": "Kricketot", 403 | "402": "Kricketune", 404 | "403": "Shinx", 405 | "404": "Luxio", 406 | "405": "Luxray", 407 | "406": "Budew", 408 | "407": "Roserade", 409 | "408": "Cranidos", 410 | "409": "Rampardos", 411 | "410": "Shieldon", 412 | "411": "Bastiodon", 413 | "412": "Burmy", 414 | "413": "Wormadam", 415 | "414": "Mothim", 416 | "415": "Combee", 417 | "416": "Vespiquen", 418 | "417": "Pachirisu", 419 | "418": "Buizel", 420 | "419": "Floatzel", 421 | "420": "Cherubi", 422 | "421": "Cherrim", 423 | "422": "Shellos", 424 | "423": "Gastrodon", 425 | "424": "Ambipom", 426 | "425": "Drifloon", 427 | "426": "Drifblim", 428 | "427": "Buneary", 429 | "428": "Lopunny", 430 | "429": "Mismagius", 431 | "430": "Honchkrow", 432 | "431": "Glameow", 433 | "432": "Purugly", 434 | "433": "Chingling", 435 | "434": "Stunky", 436 | "435": "Skuntank", 437 | "436": "Bronzor", 438 | "437": "Bronzong", 439 | "438": "Bonsly", 440 | "439": "Mime Jr.", 441 | "440": "Happiny", 442 | "441": "Chatot", 443 | "442": "Spiritomb", 444 | "443": "Gible", 445 | "444": "Gabite", 446 | "445": "Garchomp", 447 | "446": "Munchlax", 448 | "447": "Riolu", 449 | "448": "Lucario", 450 | "449": "Hippopotas", 451 | "450": "Hippowdon", 452 | "451": "Skorupi", 453 | "452": "Drapion", 454 | "453": "Croagunk", 455 | "454": "Toxicroak", 456 | "455": "Carnivine", 457 | "456": "Finneon", 458 | "457": "Lumineon", 459 | "458": "Mantyke", 460 | "459": "Snover", 461 | "460": "Abomasnow", 462 | "461": "Weavile", 463 | "462": "Magnezone", 464 | "463": "Lickilicky", 465 | "464": "Rhyperior", 466 | "465": "Tangrowth", 467 | "466": "Electivire", 468 | "467": "Magmortar", 469 | "468": "Togekiss", 470 | "469": "Yanmega", 471 | "470": "Leafeon", 472 | "471": "Glaceon", 473 | "472": "Gliscor", 474 | "473": "Mamoswine", 475 | "474": "Porygon-Z", 476 | "475": "Gallade", 477 | "476": "Probopass", 478 | "477": "Dusknoir", 479 | "478": "Froslass", 480 | "479": "Rotom", 481 | "480": "Uxie", 482 | "481": "Mesprit", 483 | "482": "Azelf", 484 | "483": "Dialga", 485 | "484": "Palkia", 486 | "485": "Heatran", 487 | "486": "Regigigas", 488 | "487": "Giratina", 489 | "488": "Cresselia", 490 | "489": "Phione", 491 | "490": "Manaphy", 492 | "491": "Darkrai", 493 | "492": "Shaymin", 494 | "493": "Arceus", 495 | "494": "Victini", 496 | "495": "Snivy", 497 | "496": "Servine", 498 | "497": "Serperior", 499 | "498": "Tepig", 500 | "499": "Pignite", 501 | "500": "Emboar", 502 | "501": "Oshawott", 503 | "502": "Dewott", 504 | "503": "Samurott", 505 | "504": "Patrat", 506 | "505": "Watchog", 507 | "506": "Lillipup", 508 | "507": "Herdier", 509 | "508": "Stoutland", 510 | "509": "Purrloin", 511 | "510": "Liepard", 512 | "511": "Pansage", 513 | "512": "Simisage", 514 | "513": "Pansear", 515 | "514": "Simisear", 516 | "515": "Panpour", 517 | "516": "Simipour", 518 | "517": "Munna", 519 | "518": "Musharna", 520 | "519": "Pidove", 521 | "520": "Tranquill", 522 | "521": "Unfezant", 523 | "522": "Blitzle", 524 | "523": "Zebstrika", 525 | "524": "Roggenrola", 526 | "525": "Boldore", 527 | "526": "Gigalith", 528 | "527": "Woobat", 529 | "528": "Swoobat", 530 | "529": "Drilbur", 531 | "530": "Excadrill", 532 | "531": "Audino", 533 | "532": "Timburr", 534 | "533": "Gurdurr", 535 | "534": "Conkeldurr", 536 | "535": "Tympole", 537 | "536": "Palpitoad", 538 | "537": "Seismitoad", 539 | "538": "Throh", 540 | "539": "Sawk", 541 | "540": "Sewaddle", 542 | "541": "Swadloon", 543 | "542": "Leavanny", 544 | "543": "Venipede", 545 | "544": "Whirlipede", 546 | "545": "Scolipede", 547 | "546": "Cottonee", 548 | "547": "Whimsicott", 549 | "548": "Petilil", 550 | "549": "Lilligant", 551 | "550": "Basculin", 552 | "551": "Sandile", 553 | "552": "Krokorok", 554 | "553": "Krookodile", 555 | "554": "Darumaka", 556 | "555": "Darmanitan", 557 | "556": "Maractus", 558 | "557": "Dwebble", 559 | "558": "Crustle", 560 | "559": "Scraggy", 561 | "560": "Scrafty", 562 | "561": "Sigilyph", 563 | "562": "Yamask", 564 | "563": "Cofagrigus", 565 | "564": "Tirtouga", 566 | "565": "Carracosta", 567 | "566": "Archen", 568 | "567": "Archeops", 569 | "568": "Trubbish", 570 | "569": "Garbodor", 571 | "570": "Zorua", 572 | "571": "Zoroark", 573 | "572": "Minccino", 574 | "573": "Cinccino", 575 | "574": "Gothita", 576 | "575": "Gothorita", 577 | "576": "Gothitelle", 578 | "577": "Solosis", 579 | "578": "Duosion", 580 | "579": "Reuniclus", 581 | "580": "Ducklett", 582 | "581": "Swanna", 583 | "582": "Vanillite", 584 | "583": "Vanillish", 585 | "584": "Vanilluxe", 586 | "585": "Deerling", 587 | "586": "Sawsbuck", 588 | "587": "Emolga", 589 | "588": "Karrablast", 590 | "589": "Escavalier", 591 | "590": "Foongus", 592 | "591": "Amoonguss", 593 | "592": "Frillish", 594 | "593": "Jellicent", 595 | "594": "Alomomola", 596 | "595": "Joltik", 597 | "596": "Galvantula", 598 | "597": "Ferroseed", 599 | "598": "Ferrothorn", 600 | "599": "Klink", 601 | "600": "Klang", 602 | "601": "Klinklang", 603 | "602": "Tynamo", 604 | "603": "Eelektrik", 605 | "604": "Eelektross", 606 | "605": "Elgyem", 607 | "606": "Beheeyem", 608 | "607": "Litwick", 609 | "608": "Lampent", 610 | "609": "Chandelure", 611 | "610": "Axew", 612 | "611": "Fraxure", 613 | "612": "Haxorus", 614 | "613": "Cubchoo", 615 | "614": "Beartic", 616 | "615": "Cryogonal", 617 | "616": "Shelmet", 618 | "617": "Accelgor", 619 | "618": "Stunfisk", 620 | "619": "Mienfoo", 621 | "620": "Mienshao", 622 | "621": "Druddigon", 623 | "622": "Golett", 624 | "623": "Golurk", 625 | "624": "Pawniard", 626 | "625": "Bisharp", 627 | "626": "Bouffalant", 628 | "627": "Rufflet", 629 | "628": "Braviary", 630 | "629": "Vullaby", 631 | "630": "Mandibuzz", 632 | "631": "Heatmor", 633 | "632": "Durant", 634 | "633": "Deino", 635 | "634": "Zweilous", 636 | "635": "Hydreigon", 637 | "636": "Larvesta", 638 | "637": "Volcarona", 639 | "638": "Cobalion", 640 | "639": "Terrakion", 641 | "640": "Virizion", 642 | "641": "Tornadus", 643 | "642": "Thundurus", 644 | "643": "Reshiram", 645 | "644": "Zekrom", 646 | "645": "Landorus", 647 | "646": "Kyurem", 648 | "647": "Keldeo", 649 | "648": "Meloetta", 650 | "649": "Genesect", 651 | "650": "Chespin", 652 | "651": "Quilladin", 653 | "652": "Chesnaught", 654 | "653": "Fennekin", 655 | "654": "Braixen", 656 | "655": "Delphox", 657 | "656": "Froakie", 658 | "657": "Frogadier", 659 | "658": "Greninja", 660 | "659": "Bunnelby", 661 | "660": "Diggersby", 662 | "661": "Fletchling", 663 | "662": "Fletchinder", 664 | "663": "Talonflame", 665 | "664": "Scatterbug", 666 | "665": "Spewpa", 667 | "666": "Vivillon", 668 | "667": "Litleo", 669 | "668": "Pyroar", 670 | "669": "Flab\u00e9b\u00e9", 671 | "670": "Floette", 672 | "671": "Florges", 673 | "672": "Skiddo", 674 | "673": "Gogoat", 675 | "674": "Pancham", 676 | "675": "Pangoro", 677 | "676": "Furfrou", 678 | "677": "Espurr", 679 | "678": "Meowstic", 680 | "679": "Honedge", 681 | "680": "Doublade", 682 | "681": "Aegislash", 683 | "682": "Spritzee", 684 | "683": "Aromatisse", 685 | "684": "Swirlix", 686 | "685": "Slurpuff", 687 | "686": "Inkay", 688 | "687": "Malamar", 689 | "688": "Binacle", 690 | "689": "Barbaracle", 691 | "690": "Skrelp", 692 | "691": "Dragalge", 693 | "692": "Clauncher", 694 | "693": "Clawitzer", 695 | "694": "Helioptile", 696 | "695": "Heliolisk", 697 | "696": "Tyrunt", 698 | "697": "Tyrantrum", 699 | "698": "Amaura", 700 | "699": "Aurorus", 701 | "700": "Sylveon", 702 | "701": "Hawlucha", 703 | "702": "Dedenne", 704 | "703": "Carbink", 705 | "704": "Goomy", 706 | "705": "Sliggoo", 707 | "706": "Goodra", 708 | "707": "Klefki", 709 | "708": "Phantump", 710 | "709": "Trevenant", 711 | "710": "Pumpkaboo", 712 | "711": "Gourgeist", 713 | "712": "Bergmite", 714 | "713": "Avalugg", 715 | "714": "Noibat", 716 | "715": "Noivern", 717 | "716": "Xerneas", 718 | "717": "Yveltal", 719 | "718": "Zygarde", 720 | "719": "Diancie", 721 | "720": "Hoopa", 722 | "721": "Volcanion", 723 | "722": "Rowlet", 724 | "723": "Dartrix", 725 | "724": "Decidueye", 726 | "725": "Litten", 727 | "726": "Torracat", 728 | "727": "Incineroar", 729 | "728": "Popplio", 730 | "729": "Brionne", 731 | "730": "Primarina", 732 | "731": "Pikipek", 733 | "732": "Trumbeak", 734 | "733": "Toucannon", 735 | "734": "Yungoos", 736 | "735": "Gumshoos", 737 | "736": "Grubbin", 738 | "737": "Charjabug", 739 | "738": "Vikavolt", 740 | "739": "Crabrawler", 741 | "740": "Crabominable", 742 | "741": "Oricorio", 743 | "742": "Cutiefly", 744 | "743": "Ribombee", 745 | "744": "Rockruff", 746 | "745": "Lycanroc", 747 | "746": "Wishiwashi", 748 | "747": "Mareanie", 749 | "748": "Toxapex", 750 | "749": "Mudbray", 751 | "750": "Mudsdale", 752 | "751": "Dewpider", 753 | "752": "Araquanid", 754 | "753": "Fomantis", 755 | "754": "Lurantis", 756 | "755": "Morelull", 757 | "756": "Shiinotic", 758 | "757": "Salandit", 759 | "758": "Salazzle", 760 | "759": "Stufful", 761 | "760": "Bewear", 762 | "761": "Bounsweet", 763 | "762": "Steenee", 764 | "763": "Tsareena", 765 | "764": "Comfey", 766 | "765": "Oranguru", 767 | "766": "Passimian", 768 | "767": "Wimpod", 769 | "768": "Golisopod", 770 | "769": "Sandygast", 771 | "770": "Palossand", 772 | "771": "Pyukumuku", 773 | "772": "Type: Null", 774 | "773": "Silvally", 775 | "774": "Minior", 776 | "775": "Komala", 777 | "776": "Turtonator", 778 | "777": "Togedemaru", 779 | "778": "Mimikyu", 780 | "779": "Bruxish", 781 | "780": "Drampa", 782 | "781": "Dhelmise", 783 | "782": "Jangmo-o", 784 | "783": "Hakamo-o", 785 | "784": "Kommo-o", 786 | "785": "Tapu Koko", 787 | "786": "Tapu Lele", 788 | "787": "Tapu Bulu", 789 | "788": "Tapu Fini", 790 | "789": "Cosmog", 791 | "790": "Cosmoem", 792 | "791": "Solgaleo", 793 | "792": "Lunala", 794 | "793": "Nihilego", 795 | "794": "Buzzwole", 796 | "795": "Pheromosa", 797 | "796": "Xurkitree", 798 | "797": "Celesteela", 799 | "798": "Kartana", 800 | "799": "Guzzlord", 801 | "800": "Necrozma", 802 | "801": "Magearna", 803 | "802": "Marshadow", 804 | "803": "Poipole", 805 | "804": "Naganadel", 806 | "805": "Stakataka", 807 | "806": "Blacephalon", 808 | "807": "Zeraora", 809 | "808": "Meltan", 810 | "809": "Melmetal", 811 | "810": "Grookey", 812 | "811": "Thwackey", 813 | "812": "Rillaboom", 814 | "813": "Scorbunny", 815 | "814": "Raboot", 816 | "815": "Cinderace", 817 | "816": "Sobble", 818 | "817": "Drizzile", 819 | "818": "Inteleon", 820 | "819": "Skwovet", 821 | "820": "Greedent", 822 | "821": "Rookidee", 823 | "822": "Corvisquire", 824 | "823": "Corviknight", 825 | "824": "Blipbug", 826 | "825": "Dottler", 827 | "826": "Orbeetle", 828 | "827": "Nickit", 829 | "828": "Thievul", 830 | "829": "Gossifleur", 831 | "830": "Eldegoss", 832 | "831": "Wooloo", 833 | "832": "Dubwool", 834 | "833": "Chewtle", 835 | "834": "Drednaw", 836 | "835": "Yamper", 837 | "836": "Boltund", 838 | "837": "Rolycoly", 839 | "838": "Carkol", 840 | "839": "Coalossal", 841 | "840": "Applin", 842 | "841": "Flapple", 843 | "842": "Appletun", 844 | "843": "Silicobra", 845 | "844": "Sandaconda", 846 | "845": "Cramorant", 847 | "846": "Arrokuda", 848 | "847": "Barraskewda", 849 | "848": "Toxel", 850 | "849": "Toxtricity", 851 | "850": "Sizzlipede", 852 | "851": "Centiskorch", 853 | "852": "Clobbopus", 854 | "853": "Grapploct", 855 | "854": "Sinistea", 856 | "855": "Polteageist", 857 | "856": "Hatenna", 858 | "857": "Hattrem", 859 | "858": "Hatterene", 860 | "859": "Impidimp", 861 | "860": "Morgrem", 862 | "861": "Grimmsnarl", 863 | "862": "Obstagoon", 864 | "863": "Perrserker", 865 | "864": "Cursola", 866 | "865": "Sirfetch’d", 867 | "866": "Mr.Rime", 868 | "867": "Runerigus", 869 | "868": "Milcery", 870 | "869": "Alcremie", 871 | "870": "Falinks", 872 | "871": "Pincurchin", 873 | "872": "Snom", 874 | "873": "Frosmoth", 875 | "874": "Stonjourner", 876 | "875": "Eiscue", 877 | "876": "Indeedee", 878 | "877": "Morpeko", 879 | "878": "Cufant", 880 | "879": "Copperajah", 881 | "880": "Dracozolt", 882 | "881": "Arctozolt", 883 | "882": "Dracovish", 884 | "883": "Arctovish", 885 | "884": "Duraludon", 886 | "885": "Dreepy", 887 | "886": "Drakloak", 888 | "887": "Dragapult", 889 | "888": "Zacian", 890 | "889": "Zamazenta", 891 | "890": "Eternatus", 892 | "891": "Kubfu", 893 | "892": "Urshifu", 894 | "893": "Zarude", 895 | "894": "Regieleki", 896 | "895": "Regidrago", 897 | "896": "Glastrier", 898 | "897": "Spectrier", 899 | "898": "Calyrex" 900 | } -------------------------------------------------------------------------------- /data/osm_data/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M4d40/nestwatcher/8741b76cd70f3daf5d957d16d9db6225de077cb3/data/osm_data/.gitkeep -------------------------------------------------------------------------------- /nests.json: -------------------------------------------------------------------------------- 1 | { 2 | "style": "osm-bright", 3 | "latitude": #(lat), 4 | "longitude": #(lon), 5 | "zoom": #(zoom), 6 | "width": 1000, 7 | "height": 600, 8 | "scale": 2, 9 | "format": "png", 10 | "markers": [ 11 | #if(nestjson != nil): 12 | #for(nest in nestjson): 13 | { 14 | "url": "https://raw.githubusercontent.com/whitewillem/PogoAssets/resized/icons_large/pokemon_icon_#index(nest, 0)_00.png", 15 | "latitude": #index(nest, 1), 16 | "longitude": #index(nest, 2), 17 | "width": 30, 18 | "height": 30 19 | }, 20 | #endfor 21 | #endif 22 | ] 23 | } -------------------------------------------------------------------------------- /nests.py: -------------------------------------------------------------------------------- 1 | import json 2 | import argparse 3 | import requests 4 | import discord 5 | import time 6 | import sys 7 | import math 8 | 9 | from datetime import datetime, timedelta 10 | from geojson import FeatureCollection, dumps 11 | 12 | from nestwatcher.area import Area 13 | from nestwatcher.analyze import analyze_nests 14 | from nestwatcher.config import Config 15 | from nestwatcher.logging import log 16 | from nestwatcher.queries import Queries 17 | from nestwatcher.discord import get_emotes 18 | 19 | parser = argparse.ArgumentParser() 20 | parser.add_argument("-c", "--config", default="config/config.ini", help="Config file to use") 21 | parser.add_argument("-t", "--hours", default=None, help="Hours since last migration") 22 | parser.add_argument("-a", "--area", default=None, help="A specific area to analyze") 23 | parser.add_argument("-ne", "--noevents", action='store_true', help="Ignore event data") 24 | parser.add_argument("-nd", "--nodelete", action='store_true', help="Don't delete nests") 25 | args = parser.parse_args() 26 | config_path = args.config 27 | config = Config(config_path) 28 | 29 | def timestr_to_datetime(time): 30 | return datetime.strptime(time, "%Y-%m-%d %H:%M") 31 | 32 | # Auto migration time 33 | events = requests.get("https://raw.githubusercontent.com/ccev/pogoinfo/v2/active/events.json").json() 34 | hours_since_migration = False 35 | if config.auto_time: 36 | last_migration_timestamp = requests.get("https://raw.githubusercontent.com/ccev/pogoinfo/info/last-nest-migration").text 37 | last_migration = datetime.fromtimestamp(int(last_migration_timestamp)) 38 | last_regular_migration = last_migration 39 | 40 | local_time = datetime.now() 41 | for event in events: 42 | if not event["type"] == "event": 43 | continue 44 | if not (event["start"]) or (not event["end"]): 45 | continue 46 | event_start = timestr_to_datetime(event["start"]) 47 | if event_start > local_time: 48 | continue 49 | event_end = timestr_to_datetime(event["end"]) 50 | 51 | if event_end <= last_migration: 52 | continue 53 | 54 | if (event_start <= last_migration) and (event_end > local_time): 55 | continue 56 | 57 | if event_end < local_time: 58 | last_migration = event_end 59 | log.info(f"Overwriting nest migration with the end time of {event['name']}") 60 | else: 61 | last_migration = event_start 62 | log.info(f"Overwriting nest migration with the start time of {event['name']}") 63 | 64 | log.success(f"Last migration: {last_migration}") 65 | else: 66 | hours_since_migration = config.hours_since_change 67 | last_regular_migration = None 68 | 69 | if args.hours is not None: 70 | hours_since_migration = int(args.hours) 71 | log.info(f"Overwriting hours since change with {config.hours_since_change}") 72 | if hours_since_migration: 73 | config.hours_since_change = hours_since_migration 74 | last_migration = datetime.now() - timedelta(hours=hours_since_migration) 75 | else: 76 | # TODO: this is a hotfix so mon_avg doesnt break 77 | td = datetime.now() - last_migration 78 | days, seconds = td.days, td.seconds 79 | config.hours_since_change = math.floor(days * 24 + seconds / 3600) 80 | if config.hours_since_change <= 0: 81 | config.hours_since_change = 1 82 | if args.noevents: 83 | config.use_events = False 84 | 85 | with open("config/areas.json", "r") as area_file: 86 | areas = json.load(area_file) 87 | with open("config/settings.json", "r") as settings_file: 88 | settings = json.load(settings_file) 89 | 90 | if args.area is not None: 91 | args.nodelete = True 92 | areas = [a for a in areas if a["name"] == args.area] 93 | if len(areas) == 0: 94 | log.error("Couldn't find that area. Maybe check capitalization") 95 | sys.exit() 96 | 97 | reset_time = datetime.timestamp(last_migration) 98 | 99 | defaults = { 100 | "min_pokemon": 9, 101 | "min_spawnpoints": 2, 102 | "min_average": 0.5, 103 | "min_ratio": 0, 104 | "scan_hours_per_day": 24, 105 | "max_markers": 30, 106 | "discord": "" 107 | } 108 | settings_defaults = [s for s in settings if s.get("area") == "DEFAULT"] 109 | if len(settings_defaults) > 0: 110 | settings_defaults = settings_defaults[0] 111 | else: 112 | settings_defaults = {} 113 | for k, v in defaults.items(): 114 | defaults[k] = settings_defaults.get(k, v) 115 | 116 | for area in areas: 117 | if area["name"] not in [s["area"] for s in settings]: 118 | settings.append({"area": area["name"]}) 119 | area_settings = {} 120 | for setting in settings: 121 | area_settings[setting["area"]] = {} 122 | for k, v in defaults.items(): 123 | area_settings[setting["area"]][k] = setting.get(k, v) 124 | 125 | # Event Data 126 | 127 | event_mons = set() 128 | if config.use_events: 129 | events = requests.get("https://raw.githubusercontent.com/ccev/pogoinfo/v2/active/events.json").json() 130 | for event in events: 131 | if "season" in event["name"].lower(): 132 | continue 133 | if not event["start"] or not event["end"]: 134 | continue 135 | if not event["type"] in ["event", "spotlight-hour", "community-day"]: 136 | continue 137 | start = timestr_to_datetime(event["start"]) 138 | end = timestr_to_datetime(event["end"]) 139 | if end < last_migration: 140 | continue 141 | if start > datetime.now(): 142 | continue 143 | log.info(f"Found active event since last migration: {event['name']}") 144 | mons = {str(m["id"]) for m in event["spawns"]} 145 | event_mons = event_mons.union(mons) 146 | if len(event_mons) == 0: 147 | log.info("Found no Event spawns since last migration") 148 | 149 | # Getting nesting species 150 | 151 | #nesting_mons = requests.get("https://pogoapi.net/api/v1/nesting_pokemon.json").json().keys() 152 | nesting_mons = requests.get("https://raw.githubusercontent.com/ccev/pogoinfo/v2/nests/species-ids.json").json() 153 | nesting_mons = nesting_mons.get(config.hemisphere, nesting_mons["all"]) 154 | nesting_mons = [str(m) for m in nesting_mons] 155 | nest_mons = [m for m in nesting_mons if m not in event_mons] 156 | log.info("Got all nesting species") 157 | log.debug(nest_mons) 158 | 159 | # DB 160 | log.info("Establishing DB connection") 161 | queries = Queries(config) 162 | 163 | # Meganests 164 | if config.in_meganest: 165 | log.info("You're living in a meganest. Getting the mosg scanned mon from your DB and ignoring it for the rest of the run") 166 | most_mon = str(queries.most_mon(str(tuple(nest_mons)), str(reset_time))[0]) 167 | if most_mon in nest_mons: 168 | nest_mons.remove(most_mon) 169 | 170 | all_features = [] 171 | full_areas = [] 172 | for i, area in enumerate(areas): 173 | area_ = Area(area, area_settings[area["name"]]) 174 | nests = analyze_nests(config, area_, nest_mons, queries, reset_time, args.nodelete) 175 | area_.nests = nests 176 | full_areas.append(area_) 177 | 178 | for nest in nests: 179 | all_features.append(nest.feature) 180 | 181 | with open(config.json_path, "w+") as file_: 182 | file_.write(dumps(FeatureCollection(all_features), indent=4)) 183 | log.info("Saved Geojson file") 184 | queries.close() 185 | 186 | # Discord stuff 187 | discord_webhook_data = [] 188 | discord_message_data = [] 189 | 190 | for area in full_areas: 191 | if len(area.nests) == 0: 192 | log.warning(f"Did not find any nests in {area.name} - Skipping notifications") 193 | continue 194 | d = area.settings["discord"] 195 | if isinstance(d, str): 196 | if "webhooks" in d: 197 | discord_webhook_data.append([d, area]) 198 | elif isinstance(d, int): 199 | discord_message_data.append([d, area]) 200 | 201 | 202 | if len(discord_message_data) > 0: 203 | log.info("Logging into Discord") 204 | bot = discord.Client() 205 | 206 | @bot.event 207 | async def on_ready(): 208 | try: 209 | log.info("Connected to Discord. Generating Nest messages and sending them.") 210 | emote_refs = await get_emotes(bot, nesting_mons, config) 211 | for d, area in discord_message_data: 212 | try: 213 | channel = await bot.fetch_channel(d) 214 | found = False 215 | embed_dict, _ = area.get_nest_text(config, emote_refs, last_regular_migration, config.time_format) 216 | embed = discord.Embed().from_dict(embed_dict) 217 | async for message in channel.history(): 218 | if message.author == bot.user: 219 | embeds = message.embeds 220 | if len(embeds) > 0: 221 | if embeds[0].title == embed.title: 222 | found = True 223 | break 224 | if found: 225 | log.success(f"Found existing Nest message for {area.name} and editing it") 226 | await message.edit(embed=embed) 227 | else: 228 | log.success(f"Sending a new Nest message for {area.name}") 229 | await channel.send(embed=embed) 230 | except Exception as e: 231 | log.exception(e) 232 | except Exception as e: 233 | log.exception(e) 234 | await bot.close() 235 | 236 | bot.run(config.discord_token) 237 | 238 | if len(discord_webhook_data) > 0: 239 | log.info("Sending webhooks") 240 | 241 | for webhook_link, area in discord_webhook_data: 242 | entry_list_2 = [] 243 | entries = [] 244 | 245 | emote_refs = None 246 | if config.discord_token: 247 | bot = discord.Client() 248 | @bot.event 249 | async def on_ready(): 250 | bot.emote_refs = await get_emotes(bot, nesting_mons, config) 251 | await bot.close() 252 | bot.run(config.discord_token) 253 | emote_refs = bot.emote_refs 254 | 255 | embed_dict, entry_list = area.get_nest_text(config, emote_refs, last_regular_migration, config.time_format) 256 | 257 | text = "" 258 | while len(entry_list) > 0: 259 | text = "" 260 | for entry in entry_list: 261 | if len(entry+text) > 2048: 262 | entries.append(text) 263 | break 264 | text += entry 265 | entry_list_2.append(entry) 266 | entry_list = [e for e in entry_list if e not in entry_list_2] 267 | if text and text not in entries: 268 | entries.append(text) 269 | 270 | for i, entry in enumerate(entries): 271 | embed = { 272 | "description": entry 273 | } 274 | keys = ["color"] 275 | if i == 0: 276 | keys += ["title", "url", "thumbnail", "author"] 277 | if i == len(entries) - 1: 278 | keys += ["timestamp", "footer", "image"] 279 | for key in keys: 280 | if key in embed_dict.keys(): 281 | embed[key] = embed_dict[key] 282 | 283 | r = requests.post(webhook_link, json={"embeds": [embed]}) 284 | log.success(f"Sent Webhook for {area.name} ({r.status_code})") 285 | time.sleep(1) 286 | 287 | log.success("All done.") -------------------------------------------------------------------------------- /nestwatcher/analyze.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import json 3 | import time 4 | import timeit 5 | import requests 6 | 7 | from rich.progress import Progress 8 | from shapely import geometry 9 | from shapely.ops import polylabel, cascaded_union 10 | from shapely.errors import TopologicalError 11 | from geojson import Feature 12 | from collections import defaultdict 13 | 14 | from nestwatcher.logging import log 15 | from nestwatcher.overpass import get_osm_data 16 | from nestwatcher.area import WayPark, RelPark 17 | 18 | def osm_date(): 19 | return "2019-02-24T00:00:00Z" 20 | 21 | def analyze_nests(config, area, nest_mons, queries, reset_time, nodelete): 22 | OSM_DATE = osm_date() 23 | # Getting OSM/overpass data 24 | 25 | osm_file_name = f"data/osm_data/{area.name} {OSM_DATE.replace(':', '')}.json" 26 | try: 27 | with open(osm_file_name, mode="r", encoding="utf-8") as osm_file: 28 | nest_json = json.load(osm_file) 29 | except: 30 | nest_json = get_osm_data(area.bbox, OSM_DATE, osm_file_name) 31 | 32 | # Getting area data 33 | 34 | area_file_name = f"data/area_data/{area.name}.json" 35 | area_file_data = {} 36 | try: 37 | with open(area_file_name, mode="r", encoding="utf-8") as area_file: 38 | log.info("Found area data file. Reading and using data from it now") 39 | area_file_data_raw = json.load(area_file) 40 | for k, v in area_file_data_raw.items(): 41 | area_file_data[int(k)] = v 42 | 43 | except FileNotFoundError: 44 | pass 45 | 46 | """db_file_name = f"data/db_data/{area.name}.json" 47 | try: 48 | with open(db_file_name, mode="r", encoding="utf-8") as db_file: 49 | db_data = json.load(db_file) 50 | except FileNotFoundError: 51 | db_data = {}""" 52 | 53 | if not nodelete: 54 | queries.nest_delete(area.sql_fence, str(reset_time)) 55 | 56 | if config.poracle: 57 | poracle_data = [] 58 | 59 | log.info(f"Got all relevant information. Searching for nests in {area.name} now") 60 | 61 | nodes = {} 62 | ways = [] 63 | relations = [] 64 | for element in nest_json['elements']: 65 | if not "type" in element: 66 | continue 67 | if element["type"] == "node": 68 | nodes[element["id"]] = { 69 | "lat": element["lat"], 70 | "lon": element["lon"] 71 | } 72 | elif element["type"] == "way": 73 | if "nodes" not in element and not element["nodes"]: 74 | continue 75 | ways.append(WayPark(element, config)) 76 | elif element["type"] == "relation": 77 | if "members" not in element and not element["members"]: 78 | continue 79 | relations.append(RelPark(element, config)) 80 | 81 | parks = ways + relations 82 | 83 | # Check Relations 84 | 85 | failed_nests = defaultdict(int) 86 | failed_nests["Total Nests found"] = 0 87 | double_ways = [] 88 | 89 | start = timeit.default_timer() 90 | 91 | if config.less_queries: 92 | log.info("Getting DB data") 93 | all_spawns = [(str(_id), geometry.Point(lon, lat)) for _id, lat, lon in queries.spawns(area.sql_fence)] 94 | all_mons = queries.all_mons(str(tuple(nest_mons)), str(reset_time), area.sql_fence) 95 | all_mons = [(_id, geometry.Point(lon, lat)) for _id, lat, lon in all_mons] 96 | 97 | with Progress() as progress: 98 | #check_rels_task = progress.add_task("Generating Polygons", total=len(parks)) 99 | for park in relations: 100 | double_ways = park.get_polygon(nodes, ways, double_ways) 101 | #progress.update(check_rels_task, advance=1) 102 | for park in ways: 103 | park.get_polygon(nodes) 104 | #progress.update(check_rels_task, advance=1) 105 | 106 | for osm_id, data in area_file_data.items(): 107 | for connect_id in data["connect"]: 108 | for i, park in enumerate(parks): 109 | if park.id == osm_id: 110 | big_park = park 111 | big_park_i = i 112 | if park.id == connect_id: 113 | small_park = park 114 | small_park_i = i 115 | 116 | parks[big_park_i].connect.append(connect_id) 117 | parks[big_park_i].polygon = cascaded_union([big_park.polygon, small_park.polygon]) 118 | parks.pop(small_park_i) 119 | 120 | # NOW CHECK ALL AREAS ONE AFTER ANOTHER 121 | check_nest_task = progress.add_task("Nests found: 0", total=len(parks)) 122 | nests = [] 123 | 124 | for park in parks: 125 | progress.update(check_nest_task, advance=1, description=f"Nests found: {failed_nests['Total Nests found']}") 126 | 127 | if not park.is_valid: 128 | failed_nests["Geometry is not valid"] += 1 129 | continue 130 | 131 | if not area.polygon.contains(park.polygon): 132 | failed_nests["Not in Geofence"] += 1 133 | continue 134 | 135 | if park.id in double_ways: 136 | failed_nests["Avoiding double nests"] += 1 137 | continue 138 | 139 | pokestop_in = None 140 | stops = [] 141 | if config.pokestop_pokemon: 142 | # Get all Pokestops with id, lat and lon 143 | for pkstp in queries.stops(park.sql_fence): 144 | stops.append(str(pkstp[0])) 145 | pokestop_in = "'{}'".format("','".join(stops)) 146 | 147 | if config.less_queries: 148 | spawns = [s[0] for s in all_spawns if park.polygon.contains(s[1])] 149 | else: 150 | spawns = [str(s[0]) for s in queries.spawns(park.sql_fence)] 151 | 152 | if not stops and not spawns: 153 | failed_nests["No Stops or Spawnpoints"] += 1 154 | continue 155 | if (len(stops) < 1) and (len(spawns) < area.settings['min_spawnpoints']): 156 | failed_nests["Not enough Spawnpoints"] += 1 157 | continue 158 | spawnpoint_in = "'{}'".format("','".join(spawns)) 159 | if spawnpoint_in == "''": spawnpoint_in = "NULL" # This will handle the SQL warning since a blank string shouldn't be used for a number 160 | 161 | if config.less_queries: 162 | mons = [s[0] for s in all_mons if park.polygon.contains(s[1])] 163 | if len(mons) == 0: 164 | failed_nests["No Pokemon"] += 1 165 | continue 166 | most_id = max(set(mons), key=mons.count) 167 | poke_data = [most_id, mons.count(most_id)] 168 | 169 | else: 170 | poke_data = queries.mons(spawnpoint_in, str(tuple(nest_mons)), str(reset_time), pokestop_in) 171 | 172 | if poke_data is None: 173 | failed_nests["No Pokemon"] += 1 174 | continue 175 | park.mon_data(poke_data[0], poke_data[1], area.settings['scan_hours_per_day'], len(spawns) + len(stops)) 176 | 177 | if park.mon_count < area.settings['min_pokemon']: 178 | failed_nests["Not enough Pokemon"] += 1 179 | continue 180 | if park.mon_avg < area.settings['min_average']: 181 | failed_nests["Average spawnrate too low"] += 1 182 | continue 183 | if park.mon_ratio < area.settings['min_ratio']: 184 | failed_nests["Average spawn ratio too low"] += 1 185 | continue 186 | 187 | try: 188 | park.generate_details(area_file_data, failed_nests["Total Nests found"]) 189 | except TopologicalError: 190 | failed_nests["Geometry is not valid"] += 1 191 | 192 | # Insert Nest data to db 193 | insert_args = { 194 | "nest_id": park.id, 195 | "name": park.name, 196 | "form": park.mon_form, 197 | "lat": park.lat, 198 | "lon": park.lon, 199 | "pokemon_id": park.mon_id, 200 | "type": 0, 201 | "pokemon_count": park.mon_count, 202 | "pokemon_avg": park.mon_avg, 203 | "pokemon_ratio": park.mon_ratio, 204 | "poly_path": json.dumps(park.path), 205 | "poly_type": 1 if isinstance(park, RelPark) else 0, 206 | "current_time": int(time.time()), 207 | "nest_submitted_by": config.submitted_by 208 | } 209 | 210 | failed_nests["Total Nests found"] += 1 211 | nests.append(park) 212 | 213 | queries.nest_insert(insert_args) 214 | 215 | if config.poracle: 216 | insert_args["reset_time"] = int(reset_time) 217 | poracle_data.append({ 218 | "type": "nest", 219 | "message": insert_args 220 | }) 221 | stop = timeit.default_timer() 222 | log.success(f"Done finding nests in {area.name} ({round(stop - start, 1)} seconds)") 223 | for k, v in failed_nests.items(): 224 | log.info(f" - {k}: {v}") 225 | 226 | def sort_avg(nest): 227 | return nest.mon_avg 228 | 229 | new_area_data = {} 230 | for nest in sorted(nests, key=sort_avg, reverse=True): 231 | new_area_data[nest.id] = { 232 | "name": nest.name, 233 | "center": [nest.lat, nest.lon], 234 | "connect": nest.connect 235 | } 236 | for oid, data in area_file_data.items(): 237 | if oid not in [n.id for n in nests]: 238 | new_area_data[oid] = { 239 | "name": data["name"], 240 | "center": data["center"], 241 | "connect": data["connect"] 242 | } 243 | with open(area_file_name, mode="w+") as area_file: 244 | area_file.write(json.dumps(new_area_data, indent=4)) 245 | 246 | log.info("Saved area data") 247 | 248 | if config.poracle: 249 | for endpoint in config.poracle: 250 | r = requests.post(endpoint, json=poracle_data) 251 | log.info(f"Sent data to Poracle with status code {r.status_code}") 252 | log.success(f"All done with {area.name}\n") 253 | 254 | return nests -------------------------------------------------------------------------------- /nestwatcher/area.py: -------------------------------------------------------------------------------- 1 | import json 2 | import requests 3 | import random 4 | import math 5 | 6 | from shapely import geometry 7 | from shapely.ops import polylabel, linemerge, unary_union, polygonize 8 | from shapely.errors import TopologicalError 9 | from datetime import datetime, timedelta 10 | from geojson import Feature 11 | from urllib.parse import quote_plus 12 | 13 | from nestwatcher.logging import log 14 | 15 | def get_zoom(ne, sw, width, height, tile_size): 16 | ne = [c * 1.06 for c in ne] 17 | sw = [c * 1.06 for c in sw] 18 | 19 | if ne == sw: 20 | return 17.5 21 | 22 | def latRad(lat): 23 | sin = math.sin(lat * math.pi / 180) 24 | rad = math.log((1 + sin) / (1 - sin)) / 2 25 | return max(min(rad, math.pi), -math.pi) / 2 26 | 27 | def zoom(px, tile, fraction): 28 | return round(math.log((px / tile / fraction), 2), 2) 29 | 30 | lat_fraction = (latRad(ne[0]) - latRad(sw[0])) / math.pi 31 | 32 | angle = ne[1] - sw[1] 33 | if angle < 0: 34 | angle += 360 35 | lon_fraction = angle / 360 36 | 37 | lat_zoom = zoom(height, tile_size, lat_fraction) 38 | lon_zoom = zoom(width, tile_size, lon_fraction) 39 | 40 | return min(lat_zoom, lon_zoom) 41 | 42 | class Area(): 43 | def __init__(self, area, settings={}): 44 | self.name = area["name"] 45 | self.settings = settings 46 | self.nests = [] 47 | 48 | sql_fence = [] 49 | polygon_ = [] 50 | fence = area["path"] 51 | 52 | for lat, lon in fence: 53 | polygon_.append((lon, lat)) 54 | sql_fence.append(f"{lat} {lon}") 55 | sql_fence.append(f"{fence[0][0]} {fence[0][1]}") 56 | 57 | self.polygon = geometry.Polygon(polygon_) 58 | self.sql_fence = "(" + ",".join(sql_fence) + ")" 59 | 60 | bounds = self.polygon.bounds 61 | self.bbox = f"{bounds[1]},{bounds[0]},{bounds[3]},{bounds[2]}" 62 | 63 | def get_nest_text(self, config, emote_refs, last_migration, time_format): 64 | with open(f"data/mon_names/{config.language}.json", "r", encoding="utf-8") as f: 65 | mon_names = json.load(f) 66 | with open("config/discord.json", "r") as f: 67 | template = json.load(f) 68 | try: 69 | with open("data/custom_emotes.json", "r") as f: 70 | emote_data = json.load(f) 71 | except: 72 | emote_data = { 73 | "Shiny": "✨", 74 | "Grass": "🌿", 75 | "Poison": "☠", 76 | "Fire": "🔥", 77 | "Flying": "🐦", 78 | "Water": "💧", 79 | "Bug": "🐛", 80 | "Normal": "⭕", 81 | "Dark": "🌑", 82 | "Electric": "⚡", 83 | "Rock": "🗿", 84 | "Ground": "🌍", 85 | "Fairy": "🦋", 86 | "Fighting": "👊", 87 | "Psychic": "☯", 88 | "Steel": "🔩", 89 | "Ice": "❄", 90 | "Ghost": "👻", 91 | "Dragon": "🐲" 92 | } 93 | with open("data/custom_emotes.json", "w+") as f: 94 | f.write(json.dumps(emote_data, indent=4)) 95 | shiny_data = requests.get("https://pogoapi.net/api/v1/shiny_pokemon.json").json() 96 | type_data_raw = requests.get("https://pogoapi.net/api/v1/pokemon_types.json").json() 97 | 98 | type_data = {} 99 | for data in reversed(type_data_raw): 100 | type_data[int(data.get("pokemon_id", 0))] = data.get("type", []) 101 | 102 | filters = template[1] 103 | entries = "" 104 | entry_list = [] 105 | 106 | # Sorting 107 | 108 | def sort_avg(nest): 109 | return nest.mon_avg 110 | def sort_count(nest): 111 | return nest.mon_count 112 | def sort_ratio(nest): 113 | return nest.mon_ratio 114 | def sort_mid(nest): 115 | return nest.mon_id 116 | def sort_name(nest): 117 | return nest.name 118 | 119 | sorts = { 120 | "mon_avg": [sort_avg, True], 121 | "mon_count": [sort_count, True], 122 | "mon_id": [sort_mid, False], 123 | "mon_ratio": [sort_ratio, True], 124 | "park_name": [sort_name, False] 125 | } 126 | sort_ = sorts[filters["sort_by"]] 127 | self.nests = sorted(self.nests, key=sort_[0], reverse=sort_[1]) 128 | 129 | # statimap gen 130 | #polygons = [] 131 | markers = [] 132 | static_map = "" 133 | if len(config.static_url) > 0: 134 | maxlat = max([n.max_lat for n in self.nests]) 135 | minlat = min([n.min_lat for n in self.nests]) 136 | maxlon = max([n.max_lon for n in self.nests]) 137 | minlon = min([n.min_lon for n in self.nests]) 138 | zoom = get_zoom( 139 | [maxlat, maxlon], 140 | [minlat, minlon], 141 | 1000, 142 | 600, 143 | 256 144 | ) 145 | def add_to_points(points, monid, lat, lon): 146 | points.append([ 147 | str(monid).zfill(3), 148 | round(lat, 6), 149 | round(lon, 6) 150 | ]) 151 | return points 152 | for nest in self.nests: 153 | points = [] 154 | if self.settings["max_markers"] == 1: 155 | points = add_to_points(points, nest.mon_id, nest.lat, nest.lon) 156 | else: 157 | if nest.mon_avg > self.settings["max_markers"]: 158 | avg = self.settings["max_markers"] 159 | else: 160 | avg = round(nest.mon_avg) 161 | while len(points) <= avg - 1: 162 | pnt = geometry.Point(random.uniform(nest.min_lon, nest.max_lon), random.uniform(nest.min_lat, nest.max_lat)) 163 | if nest.polygon.contains(pnt): 164 | points = add_to_points(points, nest.mon_id, pnt.y, pnt.x) 165 | markers += points 166 | center_lat = minlat + ((maxlat - minlat) / 2) 167 | center_lon = minlon + ((maxlon - minlon) / 2) 168 | def parse(var): 169 | return quote_plus(json.dumps(var)).replace('+','') 170 | 171 | static_map_data = { 172 | "lat": center_lat, 173 | "lon": center_lon, 174 | "zoom": zoom, 175 | "nestjson": markers 176 | } 177 | static_map_raw = config.static_url + "staticmap/nests?pregenerate=true®eneratable=true" 178 | result = requests.post(static_map_raw, json=static_map_data) 179 | if "error" in result.text: 180 | log.error(f"Error while generating Static Map:\n\n{static_map_raw}\n{result.text}\n") 181 | static_map = "" 182 | else: 183 | if "http" in result.text: 184 | static_map = result.text 185 | else: 186 | static_map = config.static_url + f"staticmap/pregenerated/{result.text}" 187 | requests.get(static_map) 188 | 189 | next_migration_timestamp = last_migration + timedelta(days=14) 190 | next_migration = next_migration_timestamp.strftime(time_format) 191 | 192 | # Text gen + filtering 193 | 194 | def replace(dic): 195 | # Formats all strings in a dict 196 | for k, v in dic.items(): 197 | if isinstance(v, str): 198 | dic[k] = v.format( 199 | nest_entry=entries, 200 | areaname=self.name, 201 | staticmap=static_map, 202 | current_time=datetime.utcnow(), 203 | next_migration_timestamp=next_migration_timestamp, 204 | next_migration=next_migration 205 | ) 206 | elif isinstance(v, dict): 207 | dic[k] = replace(v) 208 | return dic 209 | 210 | for nest in self.nests: 211 | if nest.mon_avg < filters["min_avg"]: 212 | continue 213 | if nest.name == nest._default_name and filters["ignore_unnamed"]: 214 | continue 215 | 216 | shiny_emote = "" 217 | if shiny_data.get(str(nest.mon_id), {}).get("found_wild", False): 218 | shiny_emote = emote_data.get("Shiny", "") 219 | 220 | type_emotes = [] 221 | types = type_data.get(nest.mon_id) 222 | for t in types: 223 | type_emotes.append(emote_data.get(t, "")) 224 | type_emote = "/".join(type_emotes) 225 | 226 | mon_emote = "" 227 | if emote_refs is not None: 228 | emote_id = emote_refs.get(nest.mon_id, "") 229 | if not emote_id == "": 230 | mon_emote = f"<:m{nest.mon_id}:{emote_id}>" 231 | 232 | entry = filters["nest_entry"].format( 233 | park_name=nest.name, 234 | lat=nest.lat, 235 | lon=nest.lon, 236 | 237 | mon_id=nest.mon_id, 238 | mon_avg=nest.mon_avg, 239 | mon_count=nest.mon_count, 240 | mon_ratio=nest.mon_ratio*100, 241 | mon_name=mon_names.get(str(nest.mon_id), ""), 242 | mon_emoji=mon_emote, 243 | type_emoji=type_emote, 244 | shiny=shiny_emote 245 | ) 246 | if len(entries) + len(entry) <= 2048: 247 | entries += entry 248 | entry_list.append(entry) 249 | return replace(template[0]), entry_list 250 | 251 | class Park(): 252 | def __init__(self, element, config): 253 | self._element = element 254 | self._default_name = config.default_park_name 255 | self._config = config 256 | 257 | self.polygon = None 258 | self.min_lon, self.min_lat, self.max_lon, self.max_lat = (0, 0, 0, 0) 259 | self.sql_fence = "" 260 | self.feature = None 261 | self.path = [] 262 | 263 | self.id = element["id"] 264 | self.name = "" 265 | self.lat = 0 266 | self.lon = 0 267 | self.connect = [] 268 | 269 | self.mon_id = 0 270 | self.mon_form = 0 271 | self.mon_count = 0 272 | self.mon_avg = 0 273 | self.mon_ratio = 0 274 | 275 | self.is_valid = True 276 | 277 | def mon_data(self, mid, amount, hours, spawns): 278 | self.mon_id = mid 279 | self.mon_count = amount 280 | self.mon_avg = round( 281 | (amount / float(hours)) * ( 282 | 24.00 / float(self._config.hours_since_change)), 2) 283 | self.mon_ratio = self.mon_avg / spawns 284 | 285 | def generate_details(self, area_file, nr): 286 | if self.id in area_file.keys(): 287 | entry = area_file[self.id] 288 | self.name = entry["name"] 289 | self.lat = round(float(entry["center"][0]), 6) 290 | self.lon = round(float(entry["center"][1]), 6) 291 | else: 292 | tags = self._element.get("tags", {}) 293 | self.name = tags.get("name", tags.get("official_name", self._default_name.format(nr=nr))) 294 | # get name. if not there, get official name. if not there, use default name 295 | 296 | if isinstance(self.polygon, geometry.MultiPolygon): 297 | center_point = self.polygon.centroid 298 | else: 299 | center_point = polylabel(self.polygon, tolerance=1e-6) 300 | self.lat = round(center_point.y, 6) 301 | self.lon = round(center_point.x, 6) 302 | 303 | self.get_feature() 304 | 305 | def get_feature(self): 306 | self.min_lon, self.min_lat, self.max_lon, self.max_lat = self.polygon.convex_hull.bounds 307 | properties = { 308 | "name": self.name, 309 | "stroke": self._config.json_stroke, 310 | "stroke-width": self._config.json_stroke_width, 311 | "stroke-opacity": self._config.json_stroke_opacity, 312 | "fill": self._config.json_fill, 313 | "fill-opacity": self._config.json_fill_opacity, 314 | "area_center_point": geometry.Point(self.lat, self.lon), 315 | "min_lon": self.min_lon, 316 | "min_lat": self.min_lat, 317 | "max_lon": self.max_lon, 318 | "max_lat": self.max_lat, 319 | } 320 | 321 | self.feature = Feature( 322 | geometry=self.polygon, 323 | id=self.id, 324 | properties=properties 325 | ) 326 | 327 | class WayPark(Park): 328 | def __init__(self, element, config): 329 | super().__init__(element, config) 330 | 331 | def get_polygon(self, nodes): 332 | way_points = list() 333 | for point in self._element['nodes']: 334 | point_coords = nodes[point] 335 | way_points.append([point_coords['lon'], point_coords['lat']]) 336 | if len(way_points) < 3: 337 | self.is_valid = False 338 | return 339 | self.polygon = geometry.Polygon(way_points) 340 | 341 | sql_fence = [] 342 | path = [] 343 | for lon, lat in self.polygon.exterior.coords: 344 | sql_fence.append(f"{lat} {lon}") 345 | path.append([lat, lon]) 346 | self.path = [path] 347 | self.sql_fence = "(" + ",".join(sql_fence) + ")" 348 | 349 | class RelPark(Park): 350 | def __init__(self, element, config): 351 | super().__init__(element, config) 352 | 353 | def get_polygon(self, nodes, ways, new_ways): 354 | inner_members = list() 355 | outer_members = list() 356 | for member in self._element["members"]: 357 | if member["type"] == "node": 358 | continue 359 | 360 | way = [w for w in ways if w.id == member["ref"]] 361 | if way == []: 362 | continue 363 | else: 364 | way = way[0] 365 | new_ways.append(way.id) 366 | 367 | area_points = list() 368 | for point in way._element["nodes"]: 369 | point_coords = nodes[point] 370 | area_points.append([point_coords['lon'], point_coords['lat']]) 371 | 372 | way_poly = geometry.LineString(area_points) 373 | 374 | if member["role"] == "inner": 375 | inner_members.append(way_poly) 376 | else: 377 | outer_members.append(way_poly) 378 | 379 | def get_polys(lss): 380 | merged = linemerge([*lss]) 381 | borders = unary_union(merged) 382 | polygons = list(polygonize(borders)) 383 | return polygons 384 | 385 | outer_polygon = geometry.MultiPolygon(get_polys(outer_members)) 386 | inner_polygon = geometry.MultiPolygon(get_polys(inner_members)) 387 | final_polygon = None 388 | if outer_polygon and inner_polygon: 389 | try: 390 | final_polygon = outer_polygon.symmetric_difference( 391 | inner_polygon).difference(inner_polygon) 392 | except TopologicalError: 393 | final_polygon = outer_polygon 394 | elif outer_polygon: 395 | final_polygon = outer_polygon 396 | elif inner_polygon: 397 | final_polygon = inner_polygon 398 | else: 399 | self.is_valid = False 400 | final_polygon = geometry.Polygon([[0, 0], [0, 0], [0, 0]]) 401 | 402 | self.polygon = final_polygon 403 | 404 | if isinstance(self.polygon, geometry.MultiPolygon): 405 | polygons = list(self.polygon.geoms) 406 | else: 407 | polygons = [self.polygon] 408 | 409 | sql_fences = [] 410 | for polygon in polygons: 411 | sql_fence = [] 412 | path = [] 413 | if polygon.is_valid: 414 | coords = polygon.exterior.coords 415 | for lon, lat in coords: 416 | sql_fence.append(f"{lat} {lon}") 417 | path.append([lat, lon]) 418 | self.path.append(path) 419 | sql_fences.append("(" + ",".join(sql_fence) + ")") 420 | self.sql_fence = ",".join(sql_fences) 421 | 422 | return new_ways 423 | -------------------------------------------------------------------------------- /nestwatcher/config.py: -------------------------------------------------------------------------------- 1 | from configparser import RawConfigParser 2 | 3 | class Config: 4 | def __init__(self, config_path="config/config.ini"): 5 | config_file = RawConfigParser() 6 | config_file.read(config_path) 7 | 8 | self.hours_since_change = 3 9 | self.auto_time = config_file.getboolean("Config", "auto_time", fallback=True) 10 | self.use_events = config_file.getboolean("Config", "events", fallback=True) 11 | self.hemisphere = config_file.get("Config", "hemisphere", fallback="all") 12 | self.less_queries = config_file.getboolean("Config", "less_queries", fallback=False) 13 | self.submitted_by = config_file.get("Config", "bot_name", fallback=None) 14 | if not self.submitted_by: 15 | self.submitted_by = None 16 | self.pokestop_pokemon = config_file.getboolean("Config", "pokestop_pokemon") 17 | self.in_meganest = config_file.getboolean("Config", "i_scan_berlin", fallback=False) 18 | self.poracle = config_file.get("Config", "poracle_endpoint", fallback=False) 19 | if self.poracle: 20 | self.poracle = self.poracle.split(",") 21 | self.workers = 5 22 | 23 | self.scanner = config_file.get("Scanner DB", "scanner") 24 | self.db_name = config_file.get("Scanner DB", "name") 25 | self.db_user = config_file.get("Scanner DB", "user") 26 | self.db_password = config_file.get("Scanner DB", "password") 27 | self.db_host = config_file.get("Scanner DB", "host") 28 | self.db_port = config_file.getint("Scanner DB", "port") 29 | self.custom_pokemon = config_file.get("Scanner DB", "custom_pokemon_table", fallback="pokemon") 30 | 31 | self.nest_db_name = config_file.get("Nest DB", "name") 32 | self.nest_db_user = config_file.get("Nest DB", "user") 33 | self.nest_db_password = config_file.get("Nest DB", "password") 34 | self.nest_db_host = config_file.get("Nest DB", "host") 35 | self.nest_db_port = config_file.getint("Nest DB", "port") 36 | 37 | self.default_park_name = config_file.get("Geojson", "default_park_name") 38 | self.json_path = config_file.get("Geojson", "path") 39 | self.json_stroke = config_file.get("Geojson", "stroke") 40 | self.json_stroke_width = config_file.getint("Geojson", "stroke_width") 41 | self.json_stroke_opacity = config_file.getfloat("Geojson", "stroke_opacity") 42 | self.json_fill = config_file.get("Geojson", "fill") 43 | self.json_fill_opacity = config_file.getfloat("Geojson", "fill_opacity") 44 | 45 | self.discord_token = config_file.get("Discord", "token") 46 | self.language = config_file.get("Discord", "language") 47 | self.static_url = config_file.get("Discord", "tileserver_url") 48 | self.icon_repo = config_file.get("Discord", "icon_repo") 49 | self.time_format = config_file.get("Discord", "time_format", fallback="%d.%m. %H:%M") -------------------------------------------------------------------------------- /nestwatcher/discord.py: -------------------------------------------------------------------------------- 1 | import discord 2 | import requests 3 | import json 4 | 5 | from nestwatcher.logging import log 6 | 7 | def existing_emotes(guilds, emote_name): 8 | for guild in guilds: 9 | for emoji in guild.emojis: 10 | if emoji.name == emote_name: 11 | return emoji.id 12 | return None 13 | 14 | async def get_emotes(bot, nesting_mons, config): 15 | guilds = [] 16 | for guild in bot.guilds: 17 | if guild.name == "Nest Emotes": 18 | guilds.append(guild) 19 | 20 | emote_names = [f"m{mid}" for mid in nesting_mons] 21 | # emote removing 22 | for guild in guilds: 23 | for emoji in guild.emojis: 24 | if emoji.name not in emote_names: 25 | log.info(f"Found emoji {emoji.name} not being used anymore - deleting") 26 | await emoji.delete() 27 | 28 | # emote creation 29 | final_emotes = {} 30 | for monid in nesting_mons: 31 | emote_name = f"m{monid}" 32 | existing = existing_emotes(guilds, emote_name) 33 | if existing: 34 | final_emotes[int(monid)] = existing 35 | continue 36 | 37 | free_guild = None 38 | for guild in guilds: 39 | if len(guild.emojis) < guild.emoji_limit: 40 | free_guild = guild 41 | 42 | if not free_guild: 43 | try: 44 | free_guild = await bot.create_guild("Nest Emotes") 45 | channel = await free_guild.create_text_channel("hello") 46 | invite = await channel.create_invite() 47 | log.info(f"Created new emote server. Invite code: {invite.code}") 48 | guilds.append(free_guild) 49 | except Exception as e: 50 | log.error("Exception while trying to create a guild. Aborting") 51 | log.exception(e) 52 | return final_emotes 53 | 54 | image_url = config.icon_repo + f"pokemon_icon_{monid.zfill(3)}_00.png" 55 | image = requests.get(image_url).content 56 | emoji = await free_guild.create_custom_emoji(name=emote_name, image=image) 57 | log.info(f"Created emoji {emote_name}") 58 | 59 | final_emotes[int(monid)] = emoji.id 60 | 61 | return final_emotes 62 | -------------------------------------------------------------------------------- /nestwatcher/logging.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import coloredlogs 3 | 4 | success_level = 25 5 | log_level = "INFO" 6 | 7 | log = logging.getLogger("nestscript") 8 | logging.addLevelName(success_level, "SUCCESS") 9 | def success(self, message, *args, **kws): 10 | self._log(success_level, message, args, **kws) 11 | logging.Logger.success = success 12 | coloredlogs.DEFAULT_LEVEL_STYLES["debug"] = {"color": "blue"} 13 | coloredlogs.install(level=log_level, logger=log, fmt="%(message)s") -------------------------------------------------------------------------------- /nestwatcher/overpass.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import time 3 | import json 4 | import timeit 5 | 6 | from nestwatcher.logging import log 7 | 8 | def fetch_data(bbox, date): 9 | data = """ 10 | [out:json] 11 | [date:"{date}"] 12 | [timeout:100000] 13 | [bbox:{bbox}]; 14 | ( 15 | way[leisure=park]; 16 | way[landuse=recreation_ground]; 17 | way[leisure=recreation_ground]; 18 | way[leisure=pitch]; 19 | way[leisure=garden]; 20 | way[leisure=golf_course]; 21 | way[leisure=playground]; 22 | way[landuse=meadow]; 23 | way[landuse=grass]; 24 | way[landuse=greenfield]; 25 | way[natural=scrub]; 26 | way[natural=heath]; 27 | way[natural=grassland]; 28 | way[landuse=farmyard]; 29 | way[landuse=vineyard]; 30 | way[landuse=farmland]; 31 | way[landuse=orchard]; 32 | way[natural=plateau]; 33 | way[natural=moor]; 34 | way["leisure"="nature_reserve"]; 35 | 36 | rel[leisure=park]; 37 | rel[landuse=recreation_ground]; 38 | rel[leisure=recreation_ground]; 39 | rel[leisure=pitch]; 40 | rel[leisure=garden]; 41 | rel[leisure=golf_course]; 42 | rel[leisure=playground]; 43 | rel[landuse=meadow]; 44 | rel[landuse=grass]; 45 | rel[landuse=greenfield]; 46 | rel[natural=scrub]; 47 | rel[natural=heath]; 48 | rel[natural=grassland]; 49 | rel[landuse=farmyard]; 50 | rel[landuse=vineyard]; 51 | rel[landuse=farmland]; 52 | rel[landuse=orchard]; 53 | rel[natural=plateau]; 54 | rel[natural=moor]; 55 | rel["leisure"="nature_reserve"]; 56 | ); 57 | out body; 58 | >; 59 | out skel qt; 60 | 61 | """ 62 | 63 | data = data.format(bbox=bbox, date=date) 64 | 65 | r = requests.post("https://overpass.kumi.systems/api/interpreter", data=data) 66 | try: 67 | return r.json() 68 | except: 69 | return {"remark": r.content} 70 | 71 | def get_osm_data(bbox, date, osm_file_name): 72 | got_data = False 73 | while not got_data: 74 | free_slot = False 75 | while not free_slot: 76 | r = requests.get("http://overpass-api.de/api/status").text 77 | if "available now" in r: 78 | free_slot = True 79 | else: 80 | if "Slot available after" in r: 81 | rate_seconds = int(r.split(", in ")[1].split(" seconds.")[0]) + 15 82 | log.warning(f"Overpass is rate-limiting you. Gonna have to wait {rate_seconds} seconds before continuing") 83 | time.sleep(rate_seconds) 84 | else: 85 | log.warning("Had trouble finding out about your overpass status. Waiting 1 minute before trying again") 86 | time.sleep(60) 87 | 88 | log.info("Getting OSM data. This will take ages if this is your first run.") 89 | osm_time_start = timeit.default_timer() 90 | nest_json = fetch_data(bbox, date) 91 | osm_time_stop = timeit.default_timer() 92 | seconds = round(osm_time_stop - osm_time_start, 1) 93 | if len(nest_json.get("elements", [])) == 0: 94 | log.error(f"Overpass did not return any data in {seconds} seconds. This could have different causes. Check if your geofence doesn't have its lat/lon switched up. Sleeping 5 minutes and trying again.\nIf you want, you can share the below log entry in Discord") 95 | log.error(nest_json.get("remark")) 96 | time.sleep(60*5) 97 | else: 98 | got_data = True 99 | with open(osm_file_name, mode='w', encoding="utf-8") as osm_file: 100 | osm_file.write(json.dumps(nest_json, indent=4)) 101 | log.success(f"Done. Got all OSM data in {seconds} seconds and saved it.") 102 | return nest_json 103 | -------------------------------------------------------------------------------- /nestwatcher/queries.py: -------------------------------------------------------------------------------- 1 | import pymysql 2 | 3 | from datetime import datetime, timedelta 4 | 5 | class Queries(): 6 | def __init__(self, config): 7 | self.config = config 8 | self.connection = pymysql.connect( 9 | host=config.db_host, 10 | user=config.db_user, 11 | password=config.db_password, 12 | database=config.db_name, 13 | port=config.db_port, 14 | autocommit=True 15 | ) 16 | self.cursor = self.connection.cursor() 17 | 18 | self.nest_connection = pymysql.connect( 19 | host=config.nest_db_host, 20 | user=config.nest_db_user, 21 | password=config.nest_db_password, 22 | database=config.nest_db_name, 23 | port=config.nest_db_port, 24 | autocommit=True 25 | ) 26 | self.nest_cursor = self.nest_connection.cursor() 27 | 28 | if config.scanner == "rdm": 29 | pokestop_select = """SELECT id, lat, lon 30 | FROM pokestop 31 | WHERE ST_CONTAINS(ST_GEOMFROMTEXT('MULTIPOLYGON(({area}))'), point(lat, lon))""" 32 | spawnpoint_select = """SELECT id, lat, lon 33 | FROM spawnpoint 34 | WHERE ST_CONTAINS(ST_GEOMFROMTEXT('MULTIPOLYGON(({area}))'), point(lat, lon)) 35 | """ 36 | mon_select = """SELECT pokemon_id, COUNT(pokemon_id) AS count 37 | FROM {pokemon} 38 | WHERE ( 39 | ( 40 | pokestop_id IN ({pokestops}) 41 | OR 42 | spawn_id IN ({spawnpoints}) 43 | ) 44 | AND 45 | pokemon_id IN {nest_mons} 46 | AND 47 | first_seen_timestamp >= {reset_time}) 48 | GROUP BY pokemon_id 49 | ORDER BY count desc 50 | LIMIT 1""" 51 | most_mon = """SELECT pokemon_id, COUNT(pokemon_id) AS count 52 | FROM {pokemon} 53 | WHERE ( 54 | pokemon_id IN {nest_mons} 55 | AND 56 | first_seen_timestamp >= {reset_time}) 57 | GROUP BY pokemon_id 58 | ORDER BY count desc 59 | LIMIT 1""" 60 | all_mons = """SELECT pokemon_id, lat, lon 61 | FROM {pokemon} 62 | WHERE ( 63 | pokemon_id IN {nest_mons} 64 | AND 65 | ST_CONTAINS(ST_GEOMFROMTEXT('POLYGON({area})'), point(lat, lon)) 66 | AND 67 | first_seen_timestamp >= {reset_time} 68 | ) 69 | """ 70 | 71 | elif config.scanner == "mad": 72 | pokestop_select = """SELECT pokestop_id, latitude, longitude 73 | FROM pokestop 74 | WHERE ST_CONTAINS(ST_GEOMFROMTEXT('MULTIPOLYGON(({area}))'), point(latitude, longitude))""" 75 | spawnpoint_select = """SELECT spawnpoint, latitude, longitude 76 | FROM trs_spawn 77 | WHERE ST_CONTAINS(ST_GEOMFROMTEXT('MULTIPOLYGON(({area}))'), point(latitude, longitude)) 78 | """ 79 | mon_select = """SELECT pokemon_id, COUNT(pokemon_id) AS count 80 | FROM {pokemon} 81 | WHERE ( 82 | ( 83 | spawnpoint_id IN ({spawnpoints}) 84 | ) 85 | AND 86 | pokemon_id IN {nest_mons} 87 | AND 88 | UNIX_TIMESTAMP(last_modified) >= {reset_time}) 89 | GROUP BY pokemon_id 90 | ORDER BY count desc 91 | LIMIT 1""" 92 | most_mon = """SELECT pokemon_id, COUNT(pokemon_id) AS count 93 | FROM {pokemon} 94 | WHERE ( 95 | pokemon_id IN {nest_mons} 96 | AND 97 | UNIX_TIMESTAMP(last_modified) >= {reset_time}) 98 | GROUP BY pokemon_id 99 | ORDER BY count desc 100 | LIMIT 1""" 101 | all_mons = """SELECT pokemon_id, latitude, longitude 102 | FROM {pokemon} 103 | WHERE ( 104 | pokemon_id IN {nest_mons} 105 | AND 106 | ST_CONTAINS(ST_GEOMFROMTEXT('POLYGON({area})'), point(latitude, longitude)) 107 | AND 108 | UNIX_TIMESTAMP(last_modified) >= {reset_time} 109 | ) 110 | """ 111 | 112 | nest_delete = "DELETE FROM nests where ST_CONTAINS(ST_GEOMFROMTEXT('POLYGON({area})'), point(lat, lon)) and updated < {reset_time}" 113 | nest_insert = """INSERT INTO nests ( 114 | nest_id, name, lat, lon, pokemon_id, pokemon_form, type, pokemon_count, pokemon_avg, updated, 115 | pokemon_ratio, polygon_type, polygon_path) 116 | VALUES( 117 | %(nest_id)s, %(name)s, %(lat)s, %(lon)s, 118 | %(pokemon_id)s, %(form)s, %(type)s, %(pokemon_count)s, %(pokemon_avg)s, %(current_time)s, 119 | %(pokemon_ratio)s, %(poly_type)s, %(poly_path)s) 120 | ON DUPLICATE KEY UPDATE 121 | pokemon_id = %(pokemon_id)s, 122 | pokemon_form = %(form)s, 123 | name = %(name)s, 124 | lat = %(lat)s, 125 | lon = %(lon)s, 126 | type = %(type)s, 127 | pokemon_count = %(pokemon_count)s, 128 | pokemon_avg = %(pokemon_avg)s, 129 | updated = %(current_time)s, 130 | pokemon_ratio = %(pokemon_ratio)s, 131 | polygon_type = %(poly_type)s, 132 | polygon_path = %(poly_path)s 133 | """ 134 | 135 | self.queries = { 136 | "pokestops": pokestop_select, 137 | "spawns": spawnpoint_select, 138 | "mons": mon_select, 139 | "nest_delete": nest_delete, 140 | "nest_insert": nest_insert, 141 | "most_mon": most_mon, 142 | "all_mons": all_mons 143 | } 144 | 145 | def stops(self, area): 146 | self.cursor.execute(self.queries["pokestops"].format(area=area)) 147 | return self.cursor.fetchall() 148 | 149 | def spawns(self, area): 150 | query = self.queries["spawns"].format(area=area) 151 | #print(query + "\n\n") 152 | self.cursor.execute(query) 153 | return self.cursor.fetchall() 154 | 155 | def mons(self, spawns, mons, time, pokestops=None): 156 | query = self.queries["mons"].format(spawnpoints=spawns, nest_mons=mons, reset_time=time, pokestops=pokestops, pokemon=self.config.custom_pokemon) 157 | if not pokestops is None: 158 | query = query.format(pokestops=pokestops) 159 | 160 | self.cursor.execute(query) 161 | return self.cursor.fetchone() 162 | 163 | def all_mons(self, mons, time, fence): 164 | query = self.queries["all_mons"].format(nest_mons=mons, reset_time=time, area=fence, pokemon=self.config.custom_pokemon) 165 | self.cursor.execute(query) 166 | return self.cursor.fetchall() 167 | 168 | def most_mon(self, mons, time): 169 | self.cursor.execute(self.queries["most_mon"].format(nest_mons=mons, reset_time=time, pokemon=self.config.custom_pokemon)) 170 | return self.cursor.fetchone() 171 | 172 | def nest_delete(self, area, time): 173 | self.nest_cursor.execute(self.queries["nest_delete"].format(area=area, reset_time=time)) 174 | 175 | def nest_insert(self, args): 176 | self.nest_cursor.execute(self.queries["nest_insert"], args) 177 | 178 | def close(self): 179 | self.cursor.close() 180 | self.connection.close() 181 | 182 | self.nest_cursor.close() 183 | self.nest_connection.close() -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests 2 | shapely 3 | pymysql 4 | geojson 5 | discord.py 6 | rich 7 | coloredlogs -------------------------------------------------------------------------------- /sql/nests.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `nests` ( 2 | `nest_id` bigint(20) NOT NULL AUTO_INCREMENT, 3 | `lat` double(18,14) DEFAULT NULL, 4 | `lon` double(18,14) DEFAULT NULL, 5 | `pokemon_id` int(11) DEFAULT 0, 6 | `pokemon_form` smallint(6) DEFAULT NULL, 7 | `name` varchar(250) DEFAULT NULL, 8 | `pokemon_count` double DEFAULT 0, 9 | `pokemon_avg` double DEFAULT 0, 10 | `pokemon_ratio` double DEFAULT 0, 11 | `polygon_type` tinyint(1) DEFAULT 0, 12 | `polygon_path` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL, 13 | `type` tinyint(1) NOT NULL DEFAULT 0, 14 | `nest_submitted_by` varchar(200) DEFAULT NULL, 15 | `updated` bigint(20) DEFAULT NULL, 16 | PRIMARY KEY (`nest_id`), 17 | KEY `CoordsIndex` (`lat`,`lon`), 18 | KEY `UpdatedIndex` (`updated`) 19 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 20 | ; -------------------------------------------------------------------------------- /sql/update.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE `nests` 2 | ADD `pokemon_form` smallint(6) DEFAULT NULL, 3 | ADD `pokemon_ratio` double DEFAULT 0, 4 | 5 | ADD `polygon_type` tinyint(1) DEFAULT 0, 6 | ADD `polygon_path` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL; -------------------------------------------------------------------------------- /tools.py: -------------------------------------------------------------------------------- 1 | import os 2 | import discord 3 | import csv 4 | import json 5 | import sys 6 | import requests 7 | 8 | from configparser import ConfigParser 9 | 10 | from nestwatcher.config import Config 11 | from nestwatcher.area import get_zoom, Area 12 | from nestwatcher.queries import Queries 13 | 14 | tools = { 15 | "1": "Update area_data using Discord", 16 | "2": "Migrate data to a newer version", 17 | "3": "Update area_data using up-to-date OSM data", 18 | "4": "Delete all Discord emotes", 19 | "5": "Fetch OSM data for all areas" 20 | } 21 | 22 | print("What are you looking for?") 23 | 24 | def list_options(tools): 25 | for number, name in tools.items(): 26 | print(f" {number}: {name}") 27 | wanted = input("Type a number: ") 28 | return wanted 29 | 30 | wanted = list_options(tools) 31 | 32 | config = Config() 33 | 34 | if wanted == "1": 35 | print("Would you like to only edit nests with your confgured default name? (y/n) ") 36 | do_default = input() 37 | print("Okay, now put the name of the area you want the bot to go through. Then go to a channel the bot as access to and write 'start', then follow the instructions on Discord.\n\nPlease note that:\n - The bot needs Manage Messages Perms (you may also want to do it in a private channel)\n - You have a tileserver configured") 38 | areaname = input("Area: ") 39 | print("Starting the bot now. Please write 'start' and follow your bot's instructions.") 40 | 41 | bot = discord.Client() 42 | @bot.event 43 | async def on_message(message): 44 | if not message.content == "start": 45 | return 46 | admin = message.author 47 | channel = message.channel 48 | await message.delete() 49 | queries = Queries(config) 50 | 51 | controls = { 52 | "📝": "name", 53 | "🗺️": "point", 54 | "⏩": "skip", 55 | "❌": "exit" 56 | } 57 | 58 | embed = discord.Embed( 59 | description="This bot will now go through each nest in your database, allowing you to rename and set the marker for each one.\nTo see the changes reflect on your map or Discord, re-run the nest script once.\n\nFor every park there are 3 reactions:\n\n📝 to set a name\n🗺️ to set a point\n⏩ to go to the next park.\n❌ to stop everything\n\nAfter choosing one of the options, you can set the value by sending a message.\n\nPress ✅ to start." 60 | ) 61 | message = await channel.send(embed=embed) 62 | await message.add_reaction("✅") 63 | 64 | def check(reaction, user): 65 | return str(reaction.emoji) == "✅" and user.id == admin.id 66 | try: 67 | await bot.wait_for("reaction_add", check=check, timeout=60*60*24) 68 | except: 69 | print("Error while trying to check the start reaction") 70 | else: 71 | 72 | await message.clear_reactions() 73 | 74 | for emote in controls.keys(): 75 | await message.add_reaction(emote) 76 | 77 | with open("config/areas.json", "r") as f: 78 | areas = json.load(f) 79 | area = Area([a for a in areas if a["name"] == areaname][0], None) 80 | 81 | if do_default == "y": 82 | name_where = f"and name = '{config.default_park_name}'" 83 | else: 84 | name_where = "" 85 | queries.nest_cursor.execute(f"select nest_id, name, lat, lon, polygon_path, polygon_type from nests WHERE ST_CONTAINS(ST_GEOMFROMTEXT('POLYGON({area.sql_fence})'), point(lat, lon)) {name_where} order by pokemon_avg desc") 86 | nests = queries.nest_cursor.fetchall() 87 | 88 | file_name = f"data/area_data/{areaname}.json" 89 | with open(file_name, "r") as f: 90 | area_data = json.load(f) 91 | 92 | def get_desc(name, lat, lon, osm_link, g_link): 93 | return f"Name: **{name}**\nCenter: `{round(lat, 5)},{round(lon, 6)}`\n\n[OSM Link]({osm_link}) | [Google Maps]({g_link})" 94 | 95 | for i, (nest_id, name, lat, lon, poly_path, poly_type) in enumerate(nests, start=1): 96 | poly_path = json.loads(poly_path) 97 | poly_type = "way" if poly_path == 0 else "relation" 98 | osm_link = f"https://www.openstreetmap.org/{poly_type}/{nest_id}" 99 | g_link = f"https://www.google.com/maps?q={lat},{lon}" 100 | description = get_desc(name, lat, lon, osm_link, g_link) 101 | 102 | if len(config.static_url) > 0: 103 | lats = [] 104 | lons = [] 105 | for poly in poly_path: 106 | lats += [lat for lat, lon in poly] 107 | lons += [lon for lat, lon in poly] 108 | maxlat = max(lats) 109 | minlat = min(lats) 110 | maxlon = max(lons) 111 | minlon = min(lons) 112 | center_lat = minlat + ((maxlat - minlat) / 2) 113 | center_lon = minlon + ((maxlon - minlon) / 2) 114 | zoom = get_zoom( 115 | [maxlat, maxlon], 116 | [minlat, minlon], 117 | 1000, 118 | 600, 119 | 256 120 | ) 121 | static_map_data = { 122 | "style": "osm-bright", 123 | "latitude": center_lat, 124 | "longitude": center_lon, 125 | "zoom": zoom, 126 | "width": 1000, 127 | "height": 600, 128 | "scale": 1, 129 | "polygons": [] 130 | } 131 | for polygon in poly_path: 132 | static_map_data["polygons"].append({ 133 | "fill_color": "rgba(48,227,116,0.4)", 134 | "stroke_color": "rgba(15,166,128,0.9)", 135 | "stroke_width": 2, 136 | "path": polygon 137 | }) 138 | #print(json.dumps(static_map_data,indent=4)) 139 | 140 | result = requests.post(config.static_url + "staticmap?pregenerate=true", json=static_map_data) 141 | if "error" in result.text: 142 | print(f"Error while generating Static Map:\n\n{static_map_data}\n{result.text}\n") 143 | static_map_data["polygons"] = [] 144 | result = requests.post(config.static_url + "staticmap?pregenerate=true", json=static_map_data) 145 | if "http" in result.text: 146 | static_map = result.text 147 | else: 148 | static_map = config.static_url + f"staticmap/pregenerated/{result.text}" 149 | requests.get(static_map) 150 | else: 151 | static_map = "" 152 | 153 | embed = discord.Embed(description=description) 154 | embed.set_image(url=static_map) 155 | embed.set_footer(text=f"Page {i}/{len(nests)}") 156 | await message.edit(embed=embed) 157 | 158 | def m_check(m): 159 | return m.author.id == admin.id and channel == m.channel 160 | def check(reaction, user): 161 | return str(reaction.emoji) in controls.keys() and user.id == admin.id 162 | while True: 163 | try: 164 | reaction, _ = await bot.wait_for("reaction_add", check=check, timeout=60*60*24) 165 | except: 166 | print("Error while trying to check a reaction") 167 | else: 168 | control = controls[str(reaction.emoji)] 169 | if control == "name": 170 | m = await bot.wait_for("message", check=m_check) 171 | name = m.content 172 | area_data[str(nest_id)]["name"] = name 173 | await m.delete() 174 | await message.remove_reaction(reaction, admin) 175 | embed.description = get_desc(name, lat, lon, osm_link, g_link) 176 | embed.set_footer(text=f"Page {i}/{len(nests)}") 177 | await message.edit(embed=embed) 178 | 179 | with open(file_name, "w") as f: 180 | f.write(json.dumps(area_data, indent=4)) 181 | elif control == "point": 182 | m = await bot.wait_for("message", check=m_check) 183 | point_str = m.content 184 | points = point_str.split(",") 185 | points = [float(p.strip()) for p in points] 186 | area_data[str(nest_id)]["center"] = points 187 | await m.delete() 188 | await message.remove_reaction(reaction, admin) 189 | embed.description = get_desc(name, points[0], points[1], osm_link, g_link) 190 | embed.set_footer(text=f"Page {i}/{len(nests)}") 191 | await message.edit(embed=embed) 192 | 193 | with open(file_name, "w") as f: 194 | f.write(json.dumps(area_data, indent=4)) 195 | elif control == "skip": 196 | await message.remove_reaction(reaction, admin) 197 | break 198 | elif control == "exit": 199 | await message.delete() 200 | await bot.logout() 201 | sys.exit() 202 | 203 | await bot.logout() 204 | 205 | bot.run(config.discord_token) 206 | 207 | elif wanted == "2": 208 | migrates = { 209 | "1": "Migrate data from v1 (PMSFnestScript) to v2 (Nest Watcher)", 210 | "2": "Update area_data from csv to json (legacy, for beta testers)" 211 | } 212 | wanted2 = list_options(migrates) 213 | if wanted2 == "2": 214 | direc = "data/area_data/" 215 | for area_file_name in os.listdir(direc): 216 | if not area_file_name.endswith(".csv"): 217 | continue 218 | area_file_data = {} 219 | area_file_name = direc + area_file_name 220 | with open(area_file_name, mode="r", encoding="utf-8") as area_file: 221 | dict_reader = csv.DictReader( 222 | area_file, 223 | quotechar='"', 224 | quoting=csv.QUOTE_MINIMAL, 225 | ) 226 | for line in dict_reader: 227 | connect = [] 228 | for l in line.get("connect", "").split(";"): 229 | if not l in ["0", ""]: 230 | connect.append(int(l)) 231 | area_file_data[line["osm_id"]] = { 232 | "name": line["name"], 233 | "center": [float(line["center_lat"]), float(line["center_lon"])], 234 | "connect": connect 235 | } 236 | with open(area_file_name.replace(".csv", ".json"), "w+") as f: 237 | f.write(json.dumps(area_file_data, indent=4)) 238 | print("Done!") 239 | elif wanted2 == "1": 240 | print("This tool will copy your old default.ini values to the new format and convert the area data format.\nAttention: This WILL overwrite your current config with the options you set in PMSFnestScript") 241 | confirm = "" 242 | while confirm not in ["y", "n"]: 243 | confirm = input("Do you want to continue? (y/n) ").lower() 244 | if confirm == "n": 245 | sys.exit() 246 | 247 | print("Now write the whole path to your old PMSFnestScript (e.g. /root/PMSFnestScript/)") 248 | path = input() 249 | 250 | old_config = ConfigParser() 251 | old_config.read(path + "default.ini") 252 | 253 | new_config = ConfigParser() 254 | new_config.read("config/config.ini") 255 | 256 | new_config["Config"]["pokestop_pokemon"] = old_config.get("Nest Config", "POKESTOP_POKEMON") 257 | 258 | new_config["Scanner DB"]["scanner"] = old_config.get("DB Read", "SCANNER_SCHEMA") 259 | new_config["Scanner DB"]["name"] = old_config.get("DB Read", "NAME") 260 | new_config["Scanner DB"]["password"] = old_config.get("DB Read", "PASSWORD") 261 | new_config["Scanner DB"]["user"] = old_config.get("DB Read", "USER") 262 | new_config["Scanner DB"]["host"] = old_config.get("DB Read", "HOST") 263 | new_config["Scanner DB"]["port"] = old_config.get("DB Read", "PORT") 264 | 265 | new_config["Nest DB"]["name"] = old_config.get("DB Write", "NAME") 266 | new_config["Nest DB"]["password"] = old_config.get("DB Write", "PASSWORD") 267 | new_config["Nest DB"]["user"] = old_config.get("DB Write", "USER") 268 | new_config["Nest DB"]["host"] = old_config.get("DB Write", "HOST") 269 | new_config["Nest DB"]["port"] = old_config.get("DB Write", "PORT") 270 | 271 | new_config["Geojson"]["path"] = old_config.get("Geojson", "SAVE_PATH") 272 | new_config["Geojson"]["default_park_name"] = old_config.get("Geojson", "DEFAULT_PARK_NAME") 273 | new_config["Geojson"]["stroke"] = old_config.get("Geojson", "STROKE") 274 | new_config["Geojson"]["stroke_width"] = old_config.get("Geojson", "STROKE-WIDTH") 275 | new_config["Geojson"]["stroke_opacity"] = old_config.get("Geojson", "STROKE-OPACITY") 276 | new_config["Geojson"]["fill"] = old_config.get("Geojson", "FILL") 277 | new_config["Geojson"]["fill_opacity"] = old_config.get("Geojson", "FILL-OPACITY") 278 | 279 | new_config["Discord"]["language"] = old_config.get("Discord", "LANGUAGE") 280 | 281 | with open("config/config.ini", "w+") as configfile: 282 | new_config.write(configfile) 283 | 284 | path += "area_data/" 285 | 286 | for area_file_name in os.listdir(path): 287 | if not area_file_name.endswith(".csv"): 288 | continue 289 | area_file_data = {} 290 | with open(path + area_file_name, mode="r", encoding="utf-8") as area_file: 291 | dict_reader = csv.DictReader( 292 | area_file, 293 | quotechar='"', 294 | quoting=csv.QUOTE_MINIMAL, 295 | ) 296 | for line in dict_reader: 297 | connect = [] 298 | area_file_data[line["osm_id"]] = { 299 | "name": line["name"], 300 | "center": [float(line["center_lon"]), float(line["center_lat"])], 301 | "connect": [] 302 | } 303 | with open("data/area_data/" + area_file_name.replace(".csv", ".json"), "w+") as f: 304 | f.write(json.dumps(area_file_data, indent=4)) 305 | 306 | print("Done. Go check if everything worked in config/config.ini and data/area_data") 307 | 308 | 309 | elif wanted == "3": 310 | areaname = input("Area: ") 311 | with open("config/areas.json", "r") as f: 312 | areas = json.load(f) 313 | area = Area([a for a in areas if a["name"] == areaname][0], None) 314 | 315 | file_name = f"data/area_data/{areaname}.json" 316 | with open(file_name, "r") as f: 317 | area_data = json.load(f) 318 | 319 | print("Fetching data now. This may take a while") 320 | queries = Queries(config) 321 | queries.nest_cursor.execute(f"select name, nest_id, polygon_type from nests WHERE ST_CONTAINS(ST_GEOMFROMTEXT('POLYGON({area.sql_fence})'), point(lat, lon)) order by pokemon_avg desc;") 322 | nests = queries.nest_cursor.fetchall() 323 | 324 | query = "" 325 | for name, nestid, nesttype in nests: 326 | way = "way" if nesttype == 0 else "rel" 327 | query += f"{way}({nestid});" 328 | 329 | data = f"[out:json];({query});out body;>;out skel qt;" 330 | r = requests.post("http://overpass-api.de/api/interpreter", data=data) 331 | 332 | names = {} 333 | elements = r.json()["elements"] 334 | for element in elements: 335 | tags = element.get("tags", {}) 336 | name = tags.get("name", tags.get("official_name", None)) 337 | if name is not None: 338 | names[element["id"]] = name 339 | 340 | for name, nestid, nesttype in nests: 341 | new_name = names.get(nestid, None) 342 | if new_name is None: 343 | continue 344 | if new_name == name: 345 | continue 346 | 347 | print(f"[{nestid}] {name} -> {new_name}") 348 | confirm = "" 349 | while confirm.lower() not in ("y", "n"): 350 | confirm = input("y/n ") 351 | 352 | if confirm.lower() == "y": 353 | try: 354 | area_data[str(nestid)]["name"] = new_name 355 | with open(file_name, "w") as f: 356 | f.write(json.dumps(area_data, indent=4)) 357 | print("Saved.") 358 | except Exception as e: 359 | print(f"Got error {e}") 360 | else: 361 | print("Skipped.") 362 | continue 363 | 364 | elif wanted == "4": 365 | print("This will delete all Servers the bot created to host emotes on. Continue?") 366 | confirm = "" 367 | while confirm.lower() not in ("y", "n"): 368 | confirm = input("[y/n] ") 369 | if confirm == "n": 370 | sys.exit() 371 | 372 | bot = discord.Client() 373 | @bot.event 374 | async def on_ready(): 375 | for guild in bot.guilds: 376 | if guild.name == "Nest Emotes": 377 | await guild.delete() 378 | await bot.logout() 379 | 380 | bot.run(config.discord_token) 381 | 382 | print("Done. Now re-run the analyzer to regenerate emotes") 383 | 384 | elif wanted == "5": 385 | from nestwatcher.overpass import get_osm_data 386 | from nestwatcher.analyze import osm_date 387 | print("starting now") 388 | with open("config/areas.json", "r") as area_file: 389 | raw_areas = json.load(area_file) 390 | for area in raw_areas: 391 | area = Area(area) 392 | file_name = f"data/osm_data/{area.name} {osm_date().replace(':', '')}.json" 393 | nest_json = get_osm_data(area.bbox, osm_date(), file_name) 394 | print("All done") --------------------------------------------------------------------------------