Créer l'effet secondaire d'une attaque
Principe
L'implémentation de l'effet d'une attaque se fait en deux étapes :
- Appliquer l'effet : la méthode
deal_effectexécute l'effet sur les cibles valides. - Valider les conditions : une méthode de vérification détermine si l'effet peut s'appliquer. Cette méthode dépend du type d'attaque (offensive ou statut).
Appliquer l'effet
Pour définir ce que fait l'attaque, on override la méthode deal_effect dans la classe de l'attaque. Cette méthode reçoit les cibles qui seront effectivement affectées.
Exemple : Sanction Suprême
# Function that deals the effect to the pokemon
# @param user [PFM::PokemonBattler] user of the move
# @param actual_targets [Array<PFM::PokemonBattler>] targets that will be affected by the move
def deal_effect(user, actual_targets)
actual_targets.each do |target|
next if target.effects.has?(:ability_suppressed)
next unless action_played_this_turn?(target)
next if target.dead?
@logic.ability_change_handler.disable_ability(target, db_symbol, user, self)
@scene.display_message_and_wait(parse_text_with_pokemon(19, 565, target))
end
end
- La boucle
eachsuractual_targetsest indispensable pour appliquer l'effet à chaque cible individuellement. nextpermet de passer à la cible suivante si les conditions ne sont pas remplies pour une cible donnée.
Valider les conditions
Les conditions d'application de l'effet sont vérifiées avant son exécution. Si les conditions ne sont pas remplies, l'effet est ignoré. La méthode à utiliser dépend du type de l'attaque.
Pour les attaques offensives
On override la méthode effect_working? qui détermine si l'effet secondaire de l'attaque peut s'appliquer.
Exemple : Sanction Suprême
# Test if the effect is working
# @param user [PFM::PokemonBattler] user of the move
# @param actual_targets [Array<PFM::PokemonBattler>] targets that will be affected by the move
# @return [Boolean]
def effect_working?(user, actual_targets)
return false if actual_targets.all? { |target| target.effects.has?(:ability_suppressed) }
return false if actual_targets.none? { |target| action_played_this_turn?(target) }
return false if actual_targets.all?(&:dead?)
return true
end
- Si la méthode retourne
false,deal_effectn'est pas appelée. - La vérification porte sur
actual_targets(les cibles qui ont effectivement été touchées par l'attaque).
Pour les attaques de statut
On override la méthode move_usable_by_user qui détermine si l'attaque peut être lancée (voir guide 001 pour le détail complet).
Exemple : Gravité
# 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
- Si la méthode retourne
false, l'attaque échoue entièrement (pas seulement l'effet). - L'appel à
superest indispensable pour conserver les vérifications par défaut.
Conclusion
- Utilisez
deal_effectpour implémenter l'effet de l'attaque, en itérant suractual_targets. - Utilisez
effect_working?pour valider les conditions d'un effet secondaire sur une attaque offensive. - Utilisez
move_usable_by_userpour valider les conditions d'une attaque de statut (guide 001).