smogon / pokemon-showdown

Pokémon battle simulator.
https://pokemonshowdown.com
MIT License
4.77k stars 2.79k forks source link

GSC Toxic is maintained with Baton Pass and Heal Bell #3357

Closed FredrIQ closed 5 years ago

FredrIQ commented 7 years ago

GSC suffers from some of the same Toxic oddities as RBY do, allthough only as a result of using Baton Pass or Heal Bell. Basically, Toxic and the Toxic counter is preserved when switching using Baton Pass. If whatever you are switching into is then poisoned or burned (or if it was when you switched into it), it will retain the Toxic status. It will also retain the count, unless the move was Toxic in which the counter is reset.

Leech Seed isn't affected, unlike RBY, only poison and burn is.

scheibo commented 5 years ago

GSC suffers from some of the same Toxic oddities as RBY do

Do you mean this is happening incorrectly on Pokemon Showdown? https://github.com/pret/pokecrystal/blob/master/docs/bugs_and_glitches.md doesn't seem to list this as the in-game behavior?

Can you still reproduce this? Can you share a replay demonstrating the bug? Thanks :)

KamilaBorowska commented 5 years ago

I will check later on in-game, but that sounds reasonable.

First of, this is Baton Pass code: https://github.com/pret/pokecrystal/blob/3eacab563d0e1ab5557c2443556a7a5e58d14cad/engine/battle/move_effects/baton_pass.asm#L127. It doesn't reset the SUBSTATUS_TOXIC flag, so it gets passed.

Then in residual damage code (https://github.com/pret/pokecrystal/blob/a999787cb84e8363509ad72d92be8f1fc8b7d321/engine/battle/core.asm#L1000) it uses the same code for burns and poison status.

The Toxic counter is only reset when successfully using Toxic move (de register comes from .check_toxic subroutine).

Heal Bell status only removes Nightmare substatus, so it should keep the toxic status and its counter, and the Toxic should continue once burned or poisoned normally (without using Toxic move, which would reset the counter).

Zarel commented 5 years ago

Any implementation of this should come with a -hint message, by the way.

KamilaBorowska commented 5 years ago

Okay, checked, it works.

scheibo commented 5 years ago

Alright, I'll start by writing some tests for the desired behavior, and then look into fixing it.

scheibo commented 5 years ago

9186884 adds some tests which I think describe the behavior as I understand it.

Heal Bell status only removes Nightmare status, so it should keep the toxic status and its counter

Can I get some clarification here? Surely Heal Bell removes the status, it just doesn't remove the 'substatus'? ie/ Heal Bell will make it so the Pokemon is no longer poisoned, it just keeps maintaining the toxic counter under the hood? Saying "Heal Bell status only removes the Nightmare status" seems confusing to me because that seems to imply it doesn't cure the Sleep/Burn/etc status. Though 'status' probably means something more intricate than my layperson definition here.

KamilaBorowska commented 5 years ago

@scheibo Meant "substatus" word here, sorry for confusing you.