#!/bin/python3
# Pokemon size calculator
# now including formes
# v1 ideone ID: ibEXCG
# obviously, if a mon already has one of these forms, then you use
# the offical numbers in place of the min/average/max
# List of pokemon sizes, from Bulbapedia
# ( normal size, new size )
mega = [
( 2.0 , 2.4 ) ,
( 1.7 , 1.7 ) ,
( 1.6 , 1.6 ) ,
( 1.5 , 1.2 ) ,
( 1.5 , 1.4 ) ,
( 2.2 , 2.2 ) ,
( 1.5 , 1.7 ) ,
( 6.5 , 6.5 ) ,
( 1.8 , 2.1 ) ,
( 2.0 , 2.3 ) ,
( 2.0 , 1.5 ) ,
( 1.4 , 1.4 ) ,
( 1.8 , 2.0 ) ,
( 1.5 , 1.7 ) ,
( 1.4 , 1.9 ) ,
( 2.0 , 2.5 ) ,
( 1.9 , 1.9 ) ,
( 1.6 , 1.6 ) ,
( 0.6 , 1.0 ) ,
( 2.1 , 2.2 ) ,
( 1.3 , 1.3 ) ,
( 1.5 , 1.8 ) ,
( 1.1 , 1.2 ) ,
( 1.2 , 1.2 ) ,
( 1.9 , 1.9 ) ,
( 1.2 , 1.3 ) ,
( 2.2 , 2.7 ) ,
( 1.0 , 1.4 ) ,
( 1.5 , 2.2 ) ,
( 1.6 , 2.0 ) ,
( 9.2 , 10.5 ) ,
( 1.7 , 1.9 ) ,
( 1.5 , 1.9 ) ,
( 0.5 , 0.5 ) ,
( 1.8 , 2.5 ) ,
( 1.9 , 2.5 ) ,
( 1.1 , 1.5 ) ,
( 1.5 , 2.1 ) ,
( 1.5 , 1.8 ) ,
( 1.6 , 2.5 ) ,
( 1.4 , 1.8 ) ,
( 2.0 , 2.3 ) ,
( 7.0 , 10.8 ) ,
( 1.2 , 1.3 ) ,
( 1.6 , 1.6 ) ,
( 1.1 , 1.5 ) ,
( 0.7 , 1.1 )
]
alolan= [
( 0.7 , 0.7 ) ,
( 0.8 , 0.7 ) ,
( 1.0 , 1.2 ) ,
( 0.6 , 0.6 ) ,
( 0.7 , 0.7 ) ,
( 1.0 , 1.1 ) ,
( 1.0 , 1.0 ) ,
( 1.4 , 1.7 ) ,
( 1.2 , 1.0 ) ,
( 1.0 , 1.0 )
]
totem = [
( 0.7 , 1.4 ) ,
( 1.0 , 1.7 ) ,
( 0.7 , 1.4 ) ,
( 1.5 , 2.6 ) ,
( 0.2 , 0.4 ) ,
( 1.8 , 3.1 ) ,
( 0.9 , 1.5 ) ,
( 1.2 , 2.1 ) ,
( 0.3 , 0.6 ) ,
( 0.2 , 0.4 ) ,
( 1.6 , 2.4 )
]
# lots of legendaries here
formes = [
( 4.5 , 6.9 ) , # giratina
( 0.2 , 0.4 ) , # shaymin
( 1.5 , 1.4 ) , # tornadus
( 1.5 , 3.0 ) , # thundurus
( 1.5 , 1.3 ) , # landorus
( 3.0 , 3.6 ) , # white kyurem
( 3.0 , 3.3 ) , # black kyurem
( 0.4 , 0.3 ) , # pumpkaboo small
( 0.4 , 0.5 ) , # pumpkaboo large
( 0.4 , 0.8 ) , # pumpkaboo giant
( 0.9 , 0.7 ) , # gourgeist small
( 0.9 , 1.1 ) , # gourgeist large
( 0.9 , 1.7 ) , # gourgeist giant
# (5.0, 1.2), # zygarde 10% # coordinate system changed between forms
# (5.0, 4.5), # zygarde C # coordinate system changed between forms
( 0.8 , 1.1 ) , # lycanroc midnight
( 1.1 , 0.8 ) , # lycanroc midday (both are technically correct)
( 2.4 , 3.8 ) , # DM Necrozma
( 2.4 , 4.2 ) , # DW Necrozma
( 2.4 , 7.5 ) # U Necrozma
]
def add_outliers( ) :
global totem
global alolan
global mega
global formes
# these are pretty much all intentionally huge for one reason or another
formes.append ( ( 0.2 , 8.2 ) ) # wishiwashi school (41x)
formes.append ( ( 0.5 , 6.5 ) ) # hoopa unbound (13x)
alolan.append ( ( 2.0 , 10.9 ) ) # alolan exeggutor (5.45x)
def calc_size( tabl) :
_min = 1000.0
_max = -1000.0
_avg = 0
temp = tabl
for t in temp:
a = t[ 1 ] /t[ 0 ]
if a > _max: _max = a
if a < _min: _min = a
_avg += a
_avg = _avg / len ( temp)
return ( _min, _max, _avg)
def print_size2( s) :
_min = s[ 0 ]
_avg = s[ 2 ]
_max = s[ 1 ]
return "min %.3f average %.3f max %.3f" % ( _min, _avg, _max)
def print_stats( ) :
totem_stat = calc_size( totem)
mega_stat = calc_size( mega)
alolan_stat = calc_size( alolan)
forme_stat = calc_size( formes)
print ( "Size differences:" )
print ( "LGPE sizes " + print_size2( ( 0.6 , 1.4 , 1.0 ) ) )
print ( "totems " + print_size2( totem_stat) )
print ( "mega evos " + print_size2( mega_stat) )
print ( "alolan forms " + print_size2( alolan_stat) )
print ( "formes " + print_size2( forme_stat) )
print ( "" )
size_max = totem_stat[ 1 ] * mega_stat[ 1 ] * alolan_stat[ 1 ] * forme_stat[ 1 ] * 1.4
size_avg = totem_stat[ 2 ] * mega_stat[ 2 ] * alolan_stat[ 2 ] * forme_stat[ 2 ]
print ( "Averages multiplied: %7.2fx" % size_avg )
print ( "Maximums multiplied: %7.2fx" % size_max )
print ( "------------------------------------------------------" )
print ( "------------------------------------------------------" )
print_stats( )
add_outliers( )
print ( "With special case outliers" )
print_stats( )
IyEvYmluL3B5dGhvbjMKIyBQb2tlbW9uIHNpemUgY2FsY3VsYXRvcgojIG5vdyBpbmNsdWRpbmcgZm9ybWVzCgojIHYxIGlkZW9uZSBJRDogaWJFWENHCgojIG9idmlvdXNseSwgaWYgYSBtb24gYWxyZWFkeSBoYXMgb25lIG9mIHRoZXNlIGZvcm1zLCB0aGVuIHlvdSB1c2UKIyB0aGUgb2ZmaWNhbCBudW1iZXJzIGluIHBsYWNlIG9mIHRoZSBtaW4vYXZlcmFnZS9tYXgKCiMgTGlzdCBvZiBwb2tlbW9uIHNpemVzLCBmcm9tIEJ1bGJhcGVkaWEKIyAoIG5vcm1hbCBzaXplLCBuZXcgc2l6ZSApCm1lZ2EgPSBbCigyLjAsMi40KSwKKDEuNywxLjcpLAooMS42LDEuNiksCigxLjUsMS4yKSwKKDEuNSwxLjQpLAooMi4yLDIuMiksCigxLjUsMS43KSwKKDYuNSw2LjUpLAooMS44LDIuMSksCigyLjAsMi4zKSwKKDIuMCwxLjUpLAooMS40LDEuNCksCigxLjgsMi4wKSwKKDEuNSwxLjcpLAooMS40LDEuOSksCigyLjAsMi41KSwKKDEuOSwxLjkpLAooMS42LDEuNiksCigwLjYsMS4wKSwKKDIuMSwyLjIpLAooMS4zLDEuMyksCigxLjUsMS44KSwKKDEuMSwxLjIpLAooMS4yLDEuMiksCigxLjksMS45KSwKKDEuMiwxLjMpLAooMi4yLDIuNyksCigxLjAsMS40KSwKKDEuNSwyLjIpLAooMS42LDIuMCksCig5LjIsMTAuNSksCigxLjcsMS45KSwKKDEuNSwxLjkpLAooMC41LDAuNSksCigxLjgsMi41KSwKKDEuOSwyLjUpLAooMS4xLDEuNSksCigxLjUsMi4xKSwKKDEuNSwxLjgpLAooMS42LDIuNSksCigxLjQsMS44KSwKKDIuMCwyLjMpLAooNy4wLDEwLjgpLAooMS4yLDEuMyksCigxLjYsMS42KSwKKDEuMSwxLjUpLAooMC43LDEuMSkKXQoKYWxvbGFuPVsKKDAuNywwLjcpLAooMC44LDAuNyksCigxLjAsMS4yKSwKKDAuNiwwLjYpLAooMC43LDAuNyksCigxLjAsMS4xKSwKKDEuMCwxLjApLAooMS40LDEuNyksCigxLjIsMS4wKSwKKDEuMCwxLjApCl0KCnRvdGVtID0gWwooMC43LDEuNCksCigxLjAsMS43KSwKKDAuNywxLjQpLAooMS41LDIuNiksCigwLjIsMC40KSwKKDEuOCwzLjEpLAooMC45LDEuNSksCigxLjIsMi4xKSwKKDAuMywwLjYpLAooMC4yLDAuNCksCigxLjYsMi40KQpdCgojIGxvdHMgb2YgbGVnZW5kYXJpZXMgaGVyZQpmb3JtZXMgPSBbCig0LjUsIDYuOSksICMgZ2lyYXRpbmEKKDAuMiwgMC40KSwgIyBzaGF5bWluCigxLjUsIDEuNCksICMgdG9ybmFkdXMKKDEuNSwgMy4wKSwgIyB0aHVuZHVydXMKKDEuNSwgMS4zKSwgIyBsYW5kb3J1cwooMy4wLCAzLjYpLCAjIHdoaXRlIGt5dXJlbQooMy4wLCAzLjMpLCAjIGJsYWNrIGt5dXJlbQooMC40LCAwLjMpLCAjIHB1bXBrYWJvbyBzbWFsbAooMC40LCAwLjUpLCAjIHB1bXBrYWJvbyBsYXJnZQooMC40LCAwLjgpLCAjIHB1bXBrYWJvbyBnaWFudAooMC45LCAwLjcpLCAjIGdvdXJnZWlzdCBzbWFsbAooMC45LCAxLjEpLCAjIGdvdXJnZWlzdCBsYXJnZQooMC45LCAxLjcpLCAjIGdvdXJnZWlzdCBnaWFudAojICg1LjAsIDEuMiksICMgenlnYXJkZSAxMCUgIyBjb29yZGluYXRlIHN5c3RlbSBjaGFuZ2VkIGJldHdlZW4gZm9ybXMKIyAoNS4wLCA0LjUpLCAjIHp5Z2FyZGUgQyAgICMgY29vcmRpbmF0ZSBzeXN0ZW0gY2hhbmdlZCBiZXR3ZWVuIGZvcm1zCigwLjgsIDEuMSksICMgbHljYW5yb2MgbWlkbmlnaHQKKDEuMSwgMC44KSwgIyBseWNhbnJvYyBtaWRkYXkgKGJvdGggYXJlIHRlY2huaWNhbGx5IGNvcnJlY3QpCigyLjQsIDMuOCksICMgRE0gTmVjcm96bWEKKDIuNCwgNC4yKSwgIyBEVyBOZWNyb3ptYQooMi40LCA3LjUpICAjIFUgTmVjcm96bWEKXQoKZGVmIGFkZF9vdXRsaWVycygpOgoJZ2xvYmFsIHRvdGVtCglnbG9iYWwgYWxvbGFuCglnbG9iYWwgbWVnYQoJZ2xvYmFsIGZvcm1lcwoJIyB0aGVzZSBhcmUgcHJldHR5IG11Y2ggYWxsIGludGVudGlvbmFsbHkgaHVnZSBmb3Igb25lIHJlYXNvbiBvciBhbm90aGVyCglmb3JtZXMuYXBwZW5kKCAoMC4yLCA4LjIpICkgIyB3aXNoaXdhc2hpIHNjaG9vbCAoNDF4KQoJZm9ybWVzLmFwcGVuZCggKDAuNSwgNi41KSApICMgaG9vcGEgdW5ib3VuZCAoMTN4KQoJYWxvbGFuLmFwcGVuZCggKDIuMCwxMC45KSApICMgYWxvbGFuIGV4ZWdndXRvciAoNS40NXgpCgpkZWYgY2FsY19zaXplKHRhYmwpOgoJX21pbiA9IDEwMDAuMAoJX21heCA9IC0xMDAwLjAKCV9hdmcgPSAwCgl0ZW1wID0gdGFibAoJZm9yIHQgaW4gdGVtcDoKCQlhID0gdFsxXS90WzBdCgkJaWYgYSA+IF9tYXg6IF9tYXggPSBhCgkJaWYgYSA8IF9taW46IF9taW4gPSBhCgkJX2F2ZyArPSBhCglfYXZnID0gX2F2ZyAvIGxlbih0ZW1wKQoJcmV0dXJuIChfbWluLF9tYXgsX2F2ZykKCmRlZiBwcmludF9zaXplMihzKToKCV9taW4gPSBzWzBdCglfYXZnID0gc1syXQoJX21heCA9IHNbMV0KCXJldHVybiAibWluICUuM2YgICBhdmVyYWdlICUuM2YgICBtYXggJS4zZiIgJSAoX21pbiwgX2F2ZywgX21heCkKCmRlZiBwcmludF9zdGF0cygpOgoJdG90ZW1fc3RhdCAgPSBjYWxjX3NpemUodG90ZW0pCgltZWdhX3N0YXQgICA9IGNhbGNfc2l6ZShtZWdhKQoJYWxvbGFuX3N0YXQgPSBjYWxjX3NpemUoYWxvbGFuKQoJZm9ybWVfc3RhdCAgID0gY2FsY19zaXplKGZvcm1lcykKCXByaW50KCJTaXplIGRpZmZlcmVuY2VzOiIpCglwcmludCgiTEdQRSBzaXplcyAgICIgKyBwcmludF9zaXplMigoMC42LDEuNCwxLjApKSApCglwcmludCgidG90ZW1zICAgICAgICIgKyBwcmludF9zaXplMih0b3RlbV9zdGF0KSAgKQoJcHJpbnQoIm1lZ2EgZXZvcyAgICAiICsgcHJpbnRfc2l6ZTIobWVnYV9zdGF0KSAgICkKCXByaW50KCJhbG9sYW4gZm9ybXMgIiArIHByaW50X3NpemUyKGFsb2xhbl9zdGF0KSApCglwcmludCgiZm9ybWVzICAgICAgICIgKyBwcmludF9zaXplMihmb3JtZV9zdGF0KSApCglwcmludCgiIikKCglzaXplX21heCA9IHRvdGVtX3N0YXRbMV0gKiBtZWdhX3N0YXRbMV0gKiBhbG9sYW5fc3RhdFsxXSAqIGZvcm1lX3N0YXRbMV0gKiAxLjQKCXNpemVfYXZnID0gdG90ZW1fc3RhdFsyXSAqIG1lZ2Ffc3RhdFsyXSAqIGFsb2xhbl9zdGF0WzJdICogZm9ybWVfc3RhdFsyXQoJcHJpbnQoICJBdmVyYWdlcyBtdWx0aXBsaWVkOiAlNy4yZngiICUgc2l6ZV9hdmcgKQoJcHJpbnQoICJNYXhpbXVtcyBtdWx0aXBsaWVkOiAlNy4yZngiICUgc2l6ZV9tYXggKQoJcHJpbnQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCgpwcmludCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikKcHJpbnRfc3RhdHMoKQphZGRfb3V0bGllcnMoKQpwcmludCgiV2l0aCBzcGVjaWFsIGNhc2Ugb3V0bGllcnMiKQpwcmludF9zdGF0cygpCg==