Empêcher la sélection d'une attaque
Principe
Une attaque peut ne pas être sélectionnable pour deux raisons distinctes :
- Depuis l'attaque elle-même : l'attaque vérifie ses propres conditions et décide qu'elle ne peut pas être choisie.
- Depuis un effet externe : un effet actif sur le Pokémon empêche la sélection de l'attaque.
Dans les deux cas, l'empêchement est signalé par le retour d'un Proc. Ce retour doit impérativement être accompagné d'un message indiquant clairement la raison au joueur.
Différence avec l'échec (guide 001) : l'empêchement de sélection intervient avant le tour, dans le menu de combat. L'échec intervient pendant le tour, à l'exécution de l'attaque.
Depuis l'attaque
Certaines attaques peuvent ne pas être sélectionnables selon leurs propres règles. Par exemple, l'attaque Garde-à-Joues ne peut pas être sélectionnée si l'utilisateur ne tient pas de Baie.
Pour gérer ce comportement, on override la méthode disable_reason dans la classe de l'attaque.
Exemple : Garde-à-Joues
# Get the reason why the move is disabled
# @param user [PFM::PokemonBattler] user of the move
# @return [#call] Block that should be called when the move is disabled
def disable_reason(user)
reason_message = @scene.display_message_and_wait(parse_text_with_pokemon(60, 508, user))
return proc { reason_message } unless user.hold_berry?(user.battle_item_db_symbol)
return super
end
- L'appel à
superest indispensable pour conserver les vérifications par défaut. - Si la condition n'est pas remplie, un
Proccontenant le message est retourné pour signaler que l'attaque est désactivée. - Si la condition est remplie (l'utilisateur tient une Baie),
superprend le relais.
Depuis un effet
Certaines attaques peuvent ne pas être sélectionnables à cause d'un effet actif sur l'utilisateur. Par exemple, l'effet Gravité empêche la sélection des attaques affectées par la gravité.
Pour gérer ce comportement, on utilise la méthode on_move_disabled_check dans la classe de l'effet.
Exemple : Gravité
# Function called when we try to check if the user cannot use a move
# @param user [PFM::PokemonBattler]
# @param move [Battle::Move]
# @return [Proc, nil]
def on_move_disabled_check(user, move)
return unless move.gravity_affected?
reason_message = move.scene.display_message_and_wait(parse_text_with_pokemon(19, 1092, user, PFM::Text::MOVE[1] => move.name))
return proc { reason_message }
end
- La première ligne vérifie que l'attaque est bien concernée par la gravité.
- Si elle l'est, un
Proccontenant le message est retourné. - Si elle ne l'est pas,
nilest retourné implicitement (pas de blocage).
Cas particulier : couplage avec la prévention
Lorsqu'on utilise disable_reason pour désactiver une attaque, il faut également implémenter move_usable_by_user (guide 001). En effet, une attaque désactivée peut quand même être lancée via des effets comme Métronome qui contournent la sélection.
De la même manière, pour les effets, on_move_disabled_check doit être couplé avec on_move_prevention_user pour couvrir le cas où l'attaque est lancée sans passer par le menu.
Conclusion
- Utilisez
disable_reasonetmove_usable_by_usersi la logique dépend de l'attaque elle-même. - Utilisez
on_move_disabled_checketon_move_prevention_usersi la logique dépend d'un effet externe. - Retournez un
Procpour signaler que l'attaque est non sélectionnable. - Affichez toujours un message clair au joueur indiquant la raison.
- Pensez toujours à couvrir le cas où l'attaque est lancée sans passer par le menu de sélection.