Page 1 sur 1

Le roi du silence: les secrets de HaveSpell

Posté : mer. 13 août 2025, 09:09
par rivvers
Je me rends compte concernant les snippets que les choix inhabituels doivent être expliqués et justifiés.
Qu'il est important que tout le monde soit au même niveau de connaissances pour pouvoir juger la pertinence (ou pas) d'une solution proposée.
Sans quoi, je passerai au mieux pour un marginal, au pire pour un incompétent.


Il existe une condition minimale à l'incantation des sorts : ne pas être silencieux.
Pour cela, nous avons l'utile

Code : Tout sélectionner

StateCheck(Myself, STATE_SILENCED)
C'est une chose que vous verrez dans tous les scripts depuis 25 ans (au moins).

J'y vois deux inconvénients :
  • les moddeurs ont vite fait oublier de l'enlever sur les rares capacités à ne pas nécessiter de composante verbale
  • des mods peuvent modifier la composante verbale des sorts, le script devient alors partiellement inadapté

Sauf qu'il existe une solution incroyablement simple à ces deux problèmatiques, que l'on utilise déjà sans le savoir : le trigger

Code : Tout sélectionner

HaveSpell
Comme tout le monde s'en doute :
Returns true only if the active CRE has the specified spell (either as symbolic value or resource string) memorised.
C'est vrai, mais incomplet.

Celui-ci vérifie que :
  • le sort est mémorisé (ok)
  • si le sort nécessite une composante verbale, le lanceur de sort n'est pas sous l'effet d'un silence
  • le lanceur n'est pas sous l'effet empêchant le lancement de sort (comme celle dans la Transformation de Tenser par exemple)
Alors oui, `HaveSpell(XX)` peut renvoyer faux même si le sort est mémorisé.

Cela signifie que la présence d'une composante verbale est checkée au moment du lancement du sort :
  • cela gère donc les modifications faites par les mods
  • on ne peut plus s'emmêler les pinceaux avec `StateCheck(Myself, STATE_SILENCED)` puisqu'il suffit de ne pas le mettre

Ainsi, le meilleur moyen de gérer le silence dans un bloc pour lancer un sort, c'est de laisser l'action `HaveSpell` faire le travail.
Et c'est la raison pour laquelle vous ne trouverez probablement jamais dans mes scripts un `StateCheck(Myself, STATE_SILENCED)` avant de lancer un sort.

Bien à vous.