1. Our third apparel sale is live. New design + reprint of the athletic design. Support us and get a shirt!
  2. Watch our World Cup of Pokemon Post-R1 Smogcast with some of Smogon's top players!
  3. Welcome to Smogon Forums! Please take a minute to read the rules.
  4. Click here to ensure that you never miss a new SmogonU video upload!

Programming IV Calc, EV calc

Discussion in 'Technical Projects' started by Sevans, Jun 14, 2012.

  1. Sevans


    Jun 14, 2012

    This works as an offline IV calculator.
    Features include
    -An IV calculator that can work with one pokemon for multiple levels.(good to check a low-leveled pokémon's IVs)
    -A Stat calculator to see how much EVs/IVs change stuff.
    -An EV calculator
    -A type chart with all type COMBOS
    -A team synergy page.

    So I looked at Serebii's IV formula, and it's wrong. I wanted to get an IV calculator with the right formula in it.

    This is the right formula (there is a minimum and maximum.)
    HP IV Min=Ceiling(((Stat-10-Level)*(100/Level))-2*Base-EP)
    HP IV Max=Floor((Stat-10+0.99999...-Level)*(100/Level)-2*Base-EP)

    Other IV Min=Ceiling((Ceiling(Stat/Nature)-5)*(100/Level)-2*Base-EP)
    Other IV Max=Floor((Ceiling((Stat+0.99999...)/Nature)-5)*(100/Level)-2*Base-EP)

    Floor means round down to the next integer,
    Ceiling means round up to the next integer,
    Stat is the value of the stat you want to find the IV for,
    Nature is either .9 or 1 or 1.1,
    Level is the level (1 to 100)
    Base is the base stat
    and EP= Floor(EV/4) where EV= effort value in that stat (from 0 to 255)

    I'm new to the programming world, but I can work with excel. And I'm good at math.

    Also new to smogon ...

    (If I need to change this post to be acceptable could a mod please let me know before deleting it?)
  2. NixHex

    NixHex Sometimes a man gets carried away.
    is a Site Staff Alumnusis a Forum Moderator Alumnusis a Researcher Alumnusis a Contributor Alumnusis a Battle Server Moderator Alumnus

    Oct 6, 2009
    I'm actually writing a DV/Stat Exp. calculator for RBY/GSC and I found that the best way to do it is to run it through a for loop instead of finding the inverse equation. Here's the pseudo code for IVs in Gen III and beyond:

    for HPIV=0:31
    if floor((2*BaseHP + HPIV + floor(EV/4) + 100)*Level/100 + 10)==HP_Stat

    for AtkIV=0:31
    if floor((2*BaseAtk + AtkIV + floor(EV/4))*Level/100 + 5)==Atk_Stat

    Of course every other stat besides HP follows the same equation as Attack. What this does is loops through every possible IV and if it satisfies the equality for whatever raw stat the user inputs, then add the current IV value into a set.
  3. Sevans


    Jun 14, 2012
    OK then. I would have done that...

    If I had any knowledge of actual programming codes.

    Because I had in fact thought of just testing each value individually, but I just didn't know how to do it efficiently.

    I had knowledge in algebra, so I used that. But still, if I had that code before...

    The same goes for the EV equation.
    Still, thanks for the suggestion.
  4. NixHex

    NixHex Sometimes a man gets carried away.
    is a Site Staff Alumnusis a Forum Moderator Alumnusis a Researcher Alumnusis a Contributor Alumnusis a Battle Server Moderator Alumnus

    Oct 6, 2009
    Right, if you want to find the EVs, you would have to know the IVs ahead of time (whereas before you had to know the EVs). Unfortunately, unlike IVs, EVs have a bit more complexity since the stat points calculated from EVs is int(EVs/4), which means 7 EVs would be "equivalent" to 4 EVs. This makes calculation more uncertain, and calculating EVs would only be an approximation. It would go something like this:

    for AtkEP=0:63
    if floor((2*BaseAtk + AtkIV + AtkEP)*Level/100 + 5)==Atk_Stat

    Which gives you the amount of Effort Points. This is more informative than EVs since multiple values of EVs equal the same amount of points granted when the stat is calculated, like I mentioned above.

    Next, you tell the user that the minimum and maximum by doing this:

    AtkEVMax=max(AtkEPs)*4 + 3

    Let's say you have a Jirachi (100/100/100/100/100/100) at level 100 and you already know it has 30 SpA IVs (HP Fire), and the raw stat you input is 290. Running it through the loop I gave you above will give you:
    SpAEPs = [55]
    Luckily there's enough info here (since it's at level 100) so there's only one value. Moving on, you have:
    SpAEVMin = 4*min(SpAEPs) = 4*55 = 220
    SpAEVMax = 4*max(SpAEPs) + 3 = 4*55+3 = 223

    That tells you the true range, since the user may have given their Jirachi 223, which is inefficient, but it's still a possibility. You'll have to do a check at the end to make sure that the sum of the minimum EVs don't exceed 510.

    if (HPEVmin+AtkEVMin + ... + SpeEVMin) > 510
    print('invalid EV range')
  5. Sevans


    Jun 14, 2012
    Okay then.

    ...I solved for EV too...

    I have an EV calculator in that excel document.

    The EV calculator is more to be used to see how much EVs you need to reach a stat, but I suppose it could be used on an in-game pokémon that you know the IVs of.

Users Viewing Thread (Users: 0, Guests: 0)