Méthode
Il existe plusieurs méthodes pour ce faire, voici, à mon avis la plus simple.
L'idée est de faire tourner un script global testant si le joueur est affecté par un sort que l'on aura créer à l'avance, cela à l'aide de la fonction GetSpellEffect. Si c'est le cas, le script global lancera le script que l'on souhaite associer au sort en question ou executera directement les instructions si elles sont assez courtes.
Exemple
Ici on va créer un sort qui affiche l'heure (c'est nul je sais mais c'est pour l'exemple ).
Etape 1
On créer un sort "horloge mystique" avec l'effet : Réduction de magie, perso, 0 points, 0 secondes.
Etape 2
On créer un script global "gestion_sort" :
Begin Gestion_Sort ; Si le joueur est affecté par le sort if( player -> getSpellEffect "horloge mystique" == 1 ) ; On affiche l'heure messageBox "Au troisième toc il sera %GameHour" endif End
Etape 3
Lancer le script global, soit à partir d'un autre script ou d'un dialogue, soit en l'insérant dans les "start script" si vous avez le tescs version tribunal.
Attention : Si vous utilisez l'option start script, votre mod sera Tribunal requis. Le mieux est donc de se débrouiller pour lancer votre script autrement dans la mesure du possible.
Approfondissement
Si vous souhaitez créer plusieurs sorts de ce type, vous vous rendrez vite compte que le script global devant tester l'activation des sorts deviendra vite lourd, avec une instruction minimum (le test d'activation) par sort ainsi "scripté" et par boucle d'exécution.
Ainsi si vous avez N sorts scripté, votre script global exécutera N instructions (les tests d'activation) par tour d'exécution lorsque le joueur n'utilise pas ces sorts.
Une façon simple d'optimiser cela consiste à ajouter à tout vos sorts un effet commun, dont on est à peu près sur qu'il n'affectera pas en permanence le joueur, et de faire un premier test sur cet effet avant de tester l'activation des sorts au cas par cas. On réduit ainsi le script à 1 instruction par boucle d'execution lorsque le joueur n'utilise pas ces sorts, ce qui est très interressant vu que la majeure partie du temps, les tests d'activation des sorts seront faux.
Notre script générique aura à peu près cette tête :
Begin Gestion_Sorts ; si le joueur n'est pas sous l'effet d'une réduction de magie, on est sur ;qu'il n'est sous l'effet d'aucun de nos sorts scriptés, donc inutile de continuer if( player -> getEffect "sEffectDamageMagicka" ) if( player -> getSpellEffect "sort1" == 1 ) startscript script1 elseif( player -> getSpellEffect "sort2" == 1 ) startscript script2 elseif... ... endif endif End
Et voilà, on a ainsi un script générique pour ajouter de nouveaux effets inédits.
Une application directe à cette méthode : la magie dégressive, ou ces sorts que l'on peut activer/désactiver.
L'algo :
Si le joueur lance le sort machin Si il possède la capacité machin_effets On lui enlève sinon On lui ajoute
Exemple tiré de Nova Magica pour le sort Ailes du Vent
Le sort Ailes du vent doit possèder l'effet lévitation 50 points sur le perso, et être dégressif, c'est à dire qu'il n'a pas de durée prédéfinie mais qu'il va drainer petit à petit a magie du joueur tant que celui-ci n'y met pas fin, en le relançant.
On crée un premier sort "_MD_Ailes du Vent" avec comme effets lévitation, perso, 50 points, 0 secondes, et Réduction de magie, perso, 0 points, 0 secondes. (Note : l'effet de lévitation n'est mis qu'à titre indicatif pour le joueur, l'effet de réduction pour les raisons d'optimisation citées plus haut).
On crée un deuxième sort "_MDe_Ailes du Vent" de type capacité, c'est à dire permanent, avec comme effet lévitation 50 points.
Dans notre script global, on implémente simplement l'algo donné plus haut :
Begin MagieDegressive short concentration short timer ; Si l'indicateur de concentration est supérieur à 0, c'est qu'un sort de ;magie degressive est actif, auquel cas on draine la magie du joueur. if( concentration > 0 ) set timer to ( timer + getSecondsPassed ) if( timer >= 1 ) player->modMagicka -1 endif endif ; Ici commencent les test d'activation des sorts if( player -> getEffect "sEffectDamageMagicka" == 1 ) [...] if( player->getSpellEffects "_MD_AilesDuvent" ) ; Si l'effet n'est pas actif if( player->getSpellEffects "_MDe_AilesDUVent" = 0 ) ; on l'active et on met l'indicateur de concentration(perte de mana progressive) à 1 player->addSpell "_MDe_AilesDuVent" ; s'il est déjà actif else ; on le désactive et on met le compteur de concentration à 0 player->removeSpell "_MDe_AilesDuVent" Set concentration to 0 endif endif End