Skip to main content
View

Make a move fail

Principle​

A move can fail for two distinct reasons:

  • From the move itself: the move checks its own conditions and decides it cannot be used.
  • From an external effect: an active effect on the Pokémon prevents the move from being used.

In both cases, the failure must be accompanied by a message clearly indicating the reason to the player.

From the move​

Some moves can fail based on their own rules. For example, the move Gravity fails if gravity is already active on the field.

To handle this behavior, override the move_usable_by_user method in the move's class.

Example: Gravity​

# Function that tests if the user is able to use the move
# @param user [PFM::PokemonBattler] user of the move
# @param targets [Array<PFM::PokemonBattler>] expected targets
# @note Thing that prevents the move from being used should be defined by :move_prevention_user Hook
# @return [Boolean] if the procedure can continue
def move_usable_by_user(user, targets)
return false unless super
return show_usage_failure(user) && false if @logic.terrain_effects.has?(:gravity)

return true
end
  • The call to super is mandatory to preserve default checks.
  • show_usage_failure(user) displays the failure message to the player.
  • The && false expression ensures the method returns false after displaying the message.

From an effect​

Some moves can fail because of an active effect on the user. For example, the Throat Chop effect prevents the use of sound-based moves.

To handle this behavior, use the on_move_prevention_user method in the effect's class.

Example: Throat Chop​

# Function called when we try to use a move as the user (returns :prevent if user fails)
# @param user [PFM::PokemonBattler]
# @param targets [Array<PFM::PokemonBattler>]
# @param move [Battle::Move]
# @return [:prevent, nil] :prevent if the move cannot continue
def on_move_prevention_user(user, targets, move)
return if user != @pokemon
return unless move.sound_attack?

move.scene.display_message_and_wait(parse_text_with_pokemon(59, 1860, user))
return :prevent
end
  • The first lines verify that the effect applies to this user and this type of move.
  • The failure message is displayed before returning :prevent.
  • Returning :prevent signals to the system that the move cannot continue.

Conclusion​

  • Use move_usable_by_user if the failure depends on the move's own logic.
  • Use on_move_prevention_user if the failure depends on an external effect active on the Pokémon.
  • Return false (from a move) or :prevent (from an effect) depending on the context.
  • Always display a clear message to the player before returning the failure.