Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement Taunt, Torment, Heal Block, and Aroma Veil #1153

Open
wants to merge 18 commits into
base: main
Choose a base branch
from

Conversation

jatinkohli
Copy link

@jatinkohli jatinkohli commented May 20, 2024

(WIP) Implement Taunt, Torment, and Heal Block moves. All these moves are variants of disable which prevent the target from using certain types of moves. Also implement Aroma Veil, which prevents the effects of these moves and a few others.

@bennybroseph bennybroseph marked this pull request as draft May 20, 2024 09:04
@jatinkohli
Copy link
Author

jatinkohli commented May 20, 2024

Torment

I (almost entirely) implemented torment.

Torment requirements

  • Target cannot use the same move twice in a row
  • Torment status only is removed when the pokemon leaves the battlefield (faint, switch, baton pass, etc.)
    • I decided to have torment remain between battles and not reset which move was used last, similar to encore's implementation
  • Torment does not take effect until the turn after it is used
  • A pokemon with no usable moves on a given turn as a result will struggle
  • Torment fails on Max pokemon
  • Pokemon with the Aroma Veil ability cannot become tormented (detail about aroma veil in another comment in this pr)

Torment implementation

Torment prevents the user from selecting the same move twice (see below video).

torment.normal.mp4

Torment status is removed upon switch, baton pass, and faint (see below video). My abra is tormented with a previous move of growl before switching out. When my abra comes back in, it has no torment status and can use growl again.

switch.remove.torment.mp4

Torment causes the target to struggle every turn which is has no usable moves (see below videos).

Torment + encore means the target will have no usable moves every other turn, starting the turn after the encore status is given.

torment.encore.struggle.mp4

Torment on a pokemon with only one move in its moveset causes the target to struggle every other turn.

torment.one.move.struggle.mp4

Torment does not take effect until the turn after it is used (see below video), meaning a pokemon who was just tormented can use the same move as it did last turn. My shuckle keeps using growl. On the turn it is tormented, it is still able to use growl. I cut the video off too early, but the next turn shuckle cannot select growl just like in the first video.

torment.wait.next.turn.mp4

Torment remains in effect between battles as long as the target remains on the field (see below video).

torment.remain.summon.mp4

Torment fails on Max pokemon (see below video).

torment.fails.max.mp4

What's Next for Torment

Mechanics

Magic guard and magic bounce need to reflect status moves like torment. Torment also needs to bypass substitute. I will leave these to whoever takes on the tasks of implementing these.

Localization

Torment has two messages which need localization: the message when a pokemon is tormented ("pokemon was subjected to torment!") and the message when the user tries to select the same move as they did the previous turn under torment ("pokemon can't use the same move twice in a row due to the torment!").

Unintuitive Struggle

As shown in the third video (about torment causes struggle every other turn in some cases), the UI shows the pokemon's move instead of what will happen, struggle. This could be confusing and/or frustrating, so it would be a good idea to change this move to struggle in this scenario. This also probably applies to other existing implementations of moves like disable.

@bennybroseph bennybroseph added the Move Affects a move label May 20, 2024
@jatinkohli
Copy link
Author

jatinkohli commented May 20, 2024

Taunt

I (almost completely) implemented taunt

Taunt requirements

  • Taunt prevents the target from using status moves
  • Taunt lasts for 3-4 turns (including the turn it is used), determined by whether the user goes before the target or not (respectively)
  • Taunt is also removed when the target leaves the battlefield (faint, switch, baton pass, etc.)
  • Taunt comes into effect immediately, cancelling any of the target's status moves for the turn
  • Targets with no usable moves as a result will struggle
  • Taunt remains between battles
  • Taunt works on max pokemon (in games it prevents use of max guard)
  • Pokemon with the Aroma Veil or Oblivious abilities cannot become taunted (detail about aroma veil in another comment in this pr)

Taunt implementation

Taunt prevents the target from selecting status moves (see below video). When the target (my Bulbasaur) moves before the user (enemy pokemon), taunt lasts for 4 turns (3 additional turns after the turn it was inflicted). Taunt persists as long as the target remains on the field, even if the user faints.

taunt.normal.remain.summon.mp4

When the target (my Shuckle) moves after the user (enemy pokemon), taunt lasts for 3 turns (2 additional turns after the turn it was inflicted).

taunt.slow.mp4

Taunt causes the target to struggle if the target has only status moves (see below video).

taunt.struggle.mp4

Taunt fails on a pokemon with the oblivious ability.

taunt.oblivious.mp4

What's Next for Taunt

Mechanics

Magic guard and magic bounce need to reflect status moves like taunt. Taunt also needs to bypass substitute. I will leave these to whoever takes on the tasks of implementing these.

Localization

Taunt has three messages which need localization: the message when a pokemon is taunted ("pokemon fell for the taunt!"), the message when a move fails due to taunt or the user attempts to select a status move while taunted ("pokemon can't use move after the taunt!"), and the message when the taunt duration expires ("pokemon shook off the taunt!").

Unintuitive Struggle

Same point as above in torment comment in this pr.

@jatinkohli jatinkohli changed the title Implement Taunt, Torment, and Heal Block Implement Taunt, Torment, Heal Block, and Aroma Veil May 21, 2024
@jatinkohli
Copy link
Author

This marks all the changes I want to make for these features, I will start testing and making updated videos/comments soon

@jatinkohli
Copy link
Author

jatinkohli commented May 27, 2024

Heal Block/Psychic Noise

I partially implemented the heal block status (just blocks healing moves) for Heal Block and Psychic Noise

Heal Block status requirements

Requirements for my partial implementation

  • Heal Block status prevents the target from using status moves
  • Heal Block status lasts for 5 turns (including the turn it is used) from Heal Block and 2 turns from Psychic Noise
  • Heal Block is also removed when the target leaves the battlefield (faint, switch, etc.), except baton pass transfers heal block
  • Pokemon with the Aroma Veil ability cannot become heal blocked (detail about aroma veil in another comment in this pr)
    • will still take damage from psychic noise

Additional Requirements for a full implementation

  • If Heal Block status blocks a move on the same turn, PP should not be deducted
  • Healing moves called from other moves (instruct, assist, etc.) fail
  • Heal Block status should block other healing effects (ingrain, aqua ring, etc.) from happening but not the moves that cause them
    • Leech seed damages target but does not heal user under heal blocks status
  • Draining moves (drain punch, giga drain, etc.) should still do damage but not heal user under heal block status
  • Heal block status on a pokemon with the liquid ooze ability does not prevent reversed damage
  • Heal block status should block healing items (leftovers, etc.) and berries (enigma berry, sitrus berry, etc.)
  • Heal block should block healing from abilities (dry skin in rain, water absorb) except for regenerator
    • Abilities like water absorb should still provide immunity, but they do not heal.

Heal Block implementation

The Heal Block move inflicts the Heal Block status for 5 turns (including the turn it is used), blocking the use of healing moves. The status remains as long as the pokemon remains on the field, even between battles. NOTE: Giga drain should be usable, but only the damage portion occurs. My implementation currently blocks all healing moves.

heal.block.normal.remain.summon.mp4

Psychic Noise inflicts the Heal Block status for 2 turns (including the turn it is used). Psychic Noise damages targets who already have the Heal Block status but does not reset the timer.

heal.block.psychic.noise.mp4

The Heal Block status prevents the target from using a healing move on the same move it is inflicted. The Heal Block status can be transferred with baton pass but is removed when leaving the battlefield otherwise.

heal.block.slow.baton.pass.switch.mp4

Pokemon with no usable moves as a result of the Heal Block status will struggle.

heal.block.struggle.mp4

What's Next for Heal Block/Psychic Noise

Mechanics

Magic guard and magic bounce need to reflect status moves like heal block, but not the heal block status component of Psychic Noise (tested in showdown). The heal block move does not seem to bypass substitute like taunt and torment, but I am not entirely sure. I will leave these to whoever takes on the tasks of implementing these.

Localization

The Heal Block status has three messages which need localization: the message when a pokemon is affected by heal block ("pokemon was prevented from healing!"), the message when a move fails due to heal block or the user attempts to select a healing move while affected by heal block ("pokemon can't use move after the Heal Block!"), and the message when the heal block status duration expires ("pokemon's Heal Block wore off!").

Unintuitive Struggle

Same point as above in torment comment in this pr.

@jatinkohli
Copy link
Author

Disable

I modified the existing implementation for disable to be a BattlerTag like the other move blocking statuses. This comment describes testing the new implementation to ensure everything works properly.

Disable requirements

  • Disable disables the target's previously used move for 4 turns (including the turn the status is applied)
  • Disable is also removed when the target leaves the battlefield (faint, switch, baton pass, etc.)
  • Disable comes into effect immediately, potentially cancelling the target's move for the turn
  • A pokemon with no usable moves as a result will struggle
  • Disable fails on Max pokemon
  • Pokemon with the Aroma Veil ability cannot be affected by disable (detail about aroma veil in another comment in this pr)

Disable testing

Disable disables the target's previously used move for 4 turns (including the turn the status is applied). It fails when the target has not yet used a move. It cancel's the target's move for the turn if the user moves before the target and the target used the same move as last turn. It remains in effect as long as the target remains on the battlefield, even if the user faints.

disable.slow.remain.summon.mp4

The disable status is removed whenever the user leaves the battlefield (switch, baton pass, faint, etc.).

disable.switch.mp4

Pokemon with no usable moves as a result of the disable status will struggle.

disable.struggle.mp4

Disable fails on Max pokemon.

disable.max.fail.mp4

What's Next for Disable

Mechanics

Magic guard and magic bounce need to reflect status moves like disable. Disable does not seem to bypass substitute like taunt and torment, but I am not entirely sure. I will leave these to whoever takes on the tasks of implementing these.

Unintuitive Struggle

Same point as above comments in this pr.

@jatinkohli
Copy link
Author

jatinkohli commented May 27, 2024

Aroma Veil

I implemented Aroma Veil.

Aroma Veil requirements

  • Aroma veil prevents the pokemon from being affected by taunt, torment, encore, disable (including cursed body), heal block (including the effect of psychic noise), and infatuation (including cute charm).
  • Aroma veil can be ignored or suppressed like other normal abilities

Aroma Veil implementation

Aroma Veil prevents the effects of taunt, torment, encore, and disable.

aroma.veil.taunt.torment.encore.disable.mp4

Aroma Veil prevents the effects of heal block and attract. It also prevents the heal block status of psychic noise but not the damage.

aroma.veil.heal.block.psychic.noise.attract.mp4

Aroma Veil prevents the disable status from cursed body and the infatuation status from cute charm.

aroma.veil.cursed.body.mp4
aroma.veil.cute.charm.mp4

Aroma Veil can be suppressed by Gastro Acid, like other normal abilities.

aroma.veil.gastro.acid.mp4

What's left for Aroma Veil

I believe Aroma Veil is fully implemented. It only prevents the status conditions listed above and seems to have no other effects or interactions.

@jatinkohli jatinkohli marked this pull request as ready for review May 27, 2024 04:39
@jatinkohli
Copy link
Author

A few other things to consider:

  • How should scoring work for these moves? Currently they have a fixed score like Encore, but in double battles there may be some targeting issues.
  • Should these moves work on bosses? They seem somewhat balanced, so I vote yes.

@OrangeRed OrangeRed mentioned this pull request May 28, 2024
3 tasks
@jatinkohli
Copy link
Author

Ready for review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Move Affects a move
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants