Modifier la priorité d'une attaque
Principe
La priorité d'une attaque peut être modifiée pour deux raisons distinctes :
- Depuis l'attaque elle-même : l'attaque recalcule sa priorité en fonction du contexte de combat.
- Depuis un effet externe : un effet actif modifie la priorité de l'attaque avant la détermination de l'ordre du tour.
Dans les deux cas, la valeur retournée est un Integer représentant la priorité finale.
Depuis l'attaque
Certaines attaques peuvent modifier leur priorité selon leurs propres règles. Par exemple, l'attaque Gliss'Herbe gagne +1 en priorité si le terrain herbu est actif et que le lanceur est au sol.
Pour gérer ce comportement, on override la méthode priority dans la classe de l'attaque.
Exemple : Gliss'Herbe
# Return the priority of the skill
# @param user [PFM::PokemonBattler] user for the priority check
# @return [Integer]
def priority(user = nil)
base_priority = super
return base_priority unless @logic.field_terrain_effect.grassy?
return base_priority unless @logic.current_action.launcher.grounded?
return base_priority + 1
end
superrécupère la priorité de base définie dans les données de l'attaque.- Les conditions sont vérifiées séquentiellement : si l'une échoue, la priorité de base est retournée inchangée.
- La méthode ajoute +1 à la priorité de base au lieu de retourner une valeur fixe, ce qui respecte les modifications antérieures.
Depuis un effet
Certains effets peuvent modifier la priorité d'une attaque. Par exemple, le talent Farceur donne +1 en priorité aux attaques de statut.
Pour gérer ce comportement, on utilise la méthode on_move_priority_change dans la classe de l'effet.
Exemple : Farceur
# Function called when we try to check if the effect changes the definitive priority of the move
# @param user [PFM::PokemonBattler]
# @param priority [Integer]
# @param move [Battle::Move]
# @return [Integer, nil]
def on_move_priority_change(user, priority, move)
return if user != @target
return unless move&.status?
return priority + 1
end
- La première ligne vérifie que l'utilisateur est bien le porteur du talent.
- La deuxième ligne vérifie que l'attaque est de type statut.
- Le paramètre
prioritycontient la priorité actuelle, potentiellement déjà modifiée par d'autres effets. - Le retour
nil(implicite) laisse la priorité inchangée.
Conclusion
- Utilisez
prioritysi la modification dépend de la logique propre de l'attaque. Retournez unInteger. - Utilisez
on_move_priority_changesi la modification dépend d'un effet externe. Retournez unIntegerounil. - Modifiez toujours la priorité de manière relative (
base_priority + 1) plutôt qu'absolue pour respecter les autres modifications.