Gen 2 Gen 2 PS Development - Post bugs here

Marowak with Thick Club can SD again, it only takes into consideration the stat boost levels (no items, no screens, etc) when calculating whether or not adding another stat boost can happen. I recall testing this in-game Gold version on an emulator a year or so ago.

The other things you mentioned are correct though. PS still has the wrong mechanics.
 
I've seen some discussion about it, but Present's "special damage formula" based on secondary types doesn't seem to be implemented on PS. GS has it naturally, and Crystal uses it in all Link Battles for compatability. Stadium 2 totally fixes the glitch, but it lets you see opponent HP. Not too useful or practical but it's a niche.



https://replay.pokemonshowdown.com/gen2customgame-665091593 - repeatedly Presenting Umbreons with low level mons
 
Last edited:

Zarel

Not a Yuyuko fan
is a member of the Site Staffis a Battle Server Administratoris a Programmeris a Pokemon Researcheris an Administrator
Creator of PS
I've seen some discussion about it, but Present's "special damage formula" based on secondary types doesn't seem to be implemented on PS. GS has it naturally, and Crystal uses it in all Link Battles for compatability. Stadium 2 totally fixes the glitch, but it lets you see opponent HP. Not too useful or practical but it's a niche.



https://replay.pokemonshowdown.com/gen2customgame-665091593 - repeatedly Presenting Umbreons with low level mons
PS generally only implements the most recent game in a generation (in this case Crystal). If people want to make pullreqs implementing GS, feel free, but I'm not sure any of our coders have the free time for that.
 
PS generally only implements the most recent game in a generation (in this case Crystal). If people want to make pullreqs implementing GS, feel free, but I'm not sure any of our coders have the free time for that.
I think doipy hooves argument here is that link battle Crystal mechs should be favored over regular battle Crystal mechs, which I do agree with. Granted it's not a relevant enough mechanic for the most part to be labelled as a priority.
 
The opposing Delibird used Present! Cloyster lost 48.2% of its health!
Starmie used Recover! Starmie restored its HP. The opposing Smeargle used Present! Starmie lost 100% of its health! Starmie fainted!


I disagree, after implementing it on a server and testing it, Present is surprisingly relevant. Most of the Pokemon with STAB Present tend to lack offenses, which Present partly fixes. It hits its targets for something like 25% HP with a 40BP attack (the lowest damage output), and that's Pokemon with very high HP like Vaporeon. Playtests have included Normal-types 3HKOing Acid Armor Vaporeon and Curse Entei (Present ignores stat modifiers) with a 40BP > 80BP > 80BP which isn't too unreasonable especially since they can be pressured into Rest loops, and OHKOing low-ish HP mons like Starmie with a lucky 120BP attack as shown above.

To reiterate, the way it works is the user's secondary type* overrides the target's Defense stat (not stage, stat), which Normal and Flying (which covers most Pokemon with Present) effectively reduce to 1 Defense, the target's secondary type* overrides the user's Level stat (all Special-type indexes are 20 or higher), and then the Attack stat is set to 10, and uses that for the calculation. Which results in potentially ridiculous damage from any Normal-type vs. any secondary Special-type.

High tier Pokemon that Present can maim:
Uber: Mew, Mewtwo, Celebi
OU: Cloyster, Exeggutor, Jolteon, Raikou, Starmie, Suicuine, Umbreon, Tyranitar (resisted), Vaporeon.
BL: Alakazam, Entei, Espeon, Houndoom, Jynx, Kingdra, Lapras, Meganium, Typhlosion
* - Pokemon with one type internally have the same type twice.

It is very practical on mons with 0 offensive presence like Smeargle and Chansey (maybe Snubbull for a low tier desperate for Heal Bell?), and even something with usable offense like Blissey or Miltank has niche use of it to tear specific targets like Raikou or Charm Umbreon (again, Present ignores stat modifiers / screens) to shreds. Heck, I'd argue it could be listed as 'viable' on Normal-types for the Gen 2 teambuilder despite the chance of healing opponents. As for those that lack STAB, Azumarill and Raichu (and their Prevos) have garbage damage and shouldn't ever use it, and Delibird's Present without STAB is somewhat mediocre.

Just in case somebody complains that Blissey/Chansey can't learn both Heal Bell + Present, they actually can via a Smeargle > Snubbull > Chansey chain, but isn't recognized by the teambuilder.

I'll be doing a pull request to implement accurate GSC Present soon.

Edit: Also, as far as I can tell from the disassembly, Present ignores all stat modifiers, so don't expect to sweep with Curse Blissey or have Acid Armor Vaporeon tank any hits from STAB Present. Also, Flying as the attacker's secondary type reduces damage more than I thought, which accounts for Delibird's mediocre damage, and also means Togetic will do less than compared to the other Normal-types.

I've also set up Present on a local damage calc build, will be doing a pull request for that soon. Enjoy some calcs in the mean time:

Blissey Present (80BP) vs. Cloyster: 247-291 (81.5 - 96%) -- 56.4% chance to OHKO after Spikes
Smeargle Present (80BP) vs. Raikou: 227-267 (59.2 - 69.7%) -- guaranteed 2HKO after Leftovers recovery
Blissey Present (120BP) vs. Tyranitar on a critical hit: 368-433 (91.3 - 107.4%) -- 46.2% chance to OHKO


For those worried about it being OP:

Blissey Present (80BP) vs. Snorlax: 43-51 (8.2 - 9.7%) -- possibly the worst move ever
Blissey Present (80BP) vs. Machamp: 43-51 (11.2 - 13.3%) -- possibly the worst move ever
Blissey Present (80BP) vs. Zapdos: 43-51 (11.2 - 13.3%) -- possibly the worst move ever
 
Last edited:

Zarel

Not a Yuyuko fan
is a member of the Site Staffis a Battle Server Administratoris a Programmeris a Pokemon Researcheris an Administrator
Creator of PS
I think doipy hooves argument here is that link battle Crystal mechs should be favored over regular battle Crystal mechs, which I do agree with. Granted it's not a relevant enough mechanic for the most part to be labelled as a priority.
Oh, I missed the "Crystal link battles" part. Yeah, that should probably be implemented, then. Does anyone have an actual formula for how it works?

edit: Oh, looks like Enigami has it handled.
 

Zarel

Not a Yuyuko fan
is a member of the Site Staffis a Battle Server Administratoris a Programmeris a Pokemon Researcheris an Administrator
Creator of PS
I have not implemented Belly Drum yet because no one has given me details on how the 999 cap actually works, and I'm not sure if I care enough to find out without waiting for someone to tell me.
 
I have not implemented Belly Drum yet because no one has given me details on how the 999 cap actually works, and I'm not sure if I care enough to find out without waiting for someone to tell me.
It's all in Crystal's post which Lavos linked, but I guess the tl;dr is that BD consists of a series of increments rather than setting it straight to +6, and if an increment occurs when the stat is already 999, that increment is immediately reversed. Consequently, anything that hits 999 Atk at +5 or earlier will not boost any further via Belly Drum

I'm pretty sure this is right?
Code:
Increment(){
   if(stage<6){
      stage++;
      if(stat==999){
         stage--;
      } else{
         Recalculate();
      }
   }
}

BellyDrum(){
while(stage<6 && stat!=999){
      Increment();
      Increment();
   }
}
 

Jorgen

World's Strongest Fairy
is a Forum Moderator Alumnusis a Community Contributor Alumnusis a Contributor Alumnusis a Past SPL Champion
It seems to be more like this:

Code:
def SwordsDance(stats, stages, pokemon):
    if stages.attack < 6:
       stages.attack+=1
    else:
        return
  
    if stages.attack < 6:
        stages.attack+=1
    else:
        pass # note the lack of return here

    if stats.attack < 999:
        stats.calc_all(stages, pokemon)
        #reset all stats, calc all stats & cap each at 999
        stats.other_modifiers(pokemon)
        # burn, paralysis, items, screens... NO capping here, hence rollover issues
        return
    else:
        stages.attack -= 1
        return

def BellyDrum(stats, stages, pokemon):
    SwordsDance(stats, stages, pokemon)
  
    if pokemon.hp < pokemon.halfmaxhp:
        return
    else:
        pokemon.hp -= pokemon.halfmaxhp

    for i in range(5):
        SwordsDance(stats, stages, pokemon)

    return