Ajouter et enlever des effets.
Si vous faîtes défiler la liste des commandes dans votre
« script editor », vous pouvez voir une longue liste de commandes qui commencent
par le mot "Effect". Ceux sont les commandes pour faire tous les sorts,
les capacilés spétiales et les effets visuels dans le jeu. Il y a deux commandes
qui permettent de les utiliser : ApplyEffectToObject
et ApplyEffectAtLocation.
Toutes les deux sont très similaires dans leur structure, à l’exception
que la cible de la première est un objet spécifique (créature, objets placables,
etc) et la cible de la deuxième est un emplacement spécifique (un point dans l’espace)
void ApplyEffectToObject (int nDurationType, effect eEffect, object oTarget, float fDuration=0.0f)
|
Duration Type: "nDurationType"
demande une constante commencant par DURATION_TYPE_*,
il n’y en a en fait que trois possibles:
DURATION_TYPE_INSTANT
s’applique à tous les effets qui sont instantannés, permanents et ne peuvent
être annulés. EffectDamage
serait un exemple, ainsi que tous les objets "fire-and-forget" (tire
et oublie). Si elle n’est pas « instant », la constante doit être soit DURATION_TYPE_PERMANENT
…l’effet reste jusqu’à ce qu’il soit enlevé ou dissipé.
Une durée temporaire (DURATION_TYPE_TEMPORARY)
signifie que l’effet doit avoir une durée spécifique dans la commande (et
c’est le seul moment où c’est le cas)
Effect: C’est l’effet spécifique que vous voulez
utiliser Il est courant de définir d’abord une variable qui contient toutes
les informations pertinentes, et ensuite de l’utiliser cette variable quand
vous le voulez…mais ce n’est pas nécessaire. Chaque effet varie dans
ces conditions. Quelques uns sont simplement appellés EffectSleep
ou EffectCharmed
et n’ont besoin de rien d’autre. D’autres ont besoin de paramêtres
additionnels, comme EffectDamage
ou EffectPolymorph.
Je ne détaillerais pas tous les effets ici, mais il est important que vous fournissiez
tous les paramêtres requis par un effet ou il sera non valide.
Target: Cela doit être soit un objet (dans ApplyEffectToObject)
ou un emplacement (dans ApplyEffectAtLocation).
Il peut être déclaré séparement dans une variable ou défini dans la commande.
Duration: Une durée (en seconds) est uniquement requise pour
les effets avec DURATION_TYPE_TEMPORARY.
Quand elle est spécifié, ce doit être un "float"
(et non un integer). Donc mettez "3.0"
pour 3 secondes, ou "10.5"
pour 10 secondes et demi.
Quelques exemples d’effets
- Dans le OnUsed d’un objet, il transforme l’utilisateur en pixie
:
void main() { effect ePixie = EffectPolymorph(POLYMORPH_TYPE_PIXIE); ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePixie, GetLastUsedBy()); }
|
- Un objet avec en capacité un sort unique (avec le tag "WONDERFUL_WAND" qui soigne
le « hâte » la cible pour 30 secondes:
void main() { object oWand = GetItemActivated(); if (oWand == GetObjectByTag("WONDERFUL_WAND")) { object oTarget = GetItemActivatedTarget(); int nMaxHP = GetMaxHitPoints(oTarget); int nCurHP = GetCurrentHitPoints(oTarget); effect eHeal = EffectHeal(nMaxHP - nCurHP); ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oTarget); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectHaste(), oTarget, 30.0); } }
|
- Dans le OnUserDefined d’une créature, quand un événement #100 est envoyé,
un blaireau générique est convoqué au waypoint avec le tag "SUMMON_POINT":
void main() { int nUser = GetUserDefinedEventNumber(); if(nUser == 100) { effect eSummon = EffectSummonCreature("bugbeara001"); location lWP = GetLocation(GetObjectByTag("SUMMON_POINT")); ApplyEffectAtLocation(DURATION_TYPE_PERMANENT, eSummon, lWP); } }
|
Effets visuels
Les effets visuels sont très similaires aux effets normaux, vous les appliquez
de la même manière. Vous utilisez EffectVisualEffect
et fournissez lui fournissez le paramêtre d’une des constantes des effets
visuels…elles commencent toutes par VFX_*.
Cependant, il y en a un certain nombre, et elles sont différenciées par des mentions
différentes.
VFX_BEAM_* = il
y a différents types de beam (poutres) visuels, et bien qu’elles soient
groupées avec les autres effets visuels, ces constantes sont utilisées avec EffectBeam
et non avec EffectVisualEffect.
VFX_COM_* = ce sont les effets visuels de combat, presque tous sont utilisés
avec une durée instantanée (DURATION_TYPE_INSTANT).
VFX_DUR_* = beaucoup
sont des effets utilisés pour les sorts. Ils doivent tous être applqiés avec une
durée soit permanente, soit temporaire (DURATION_TYPE_PERMANENT
ou DURATION_TYPE_TEMPORARY)
VFX_FNF_* = Ils
sont appellés les effets « fire-and-forget » (tire et oublie) dans le sens ou
ils ne sont joués qu’une fois. Ils doivent avoir une durée instantannée
(DURATION_TYPE_INSTANT)
VFX_IMP_* = Ce
sont les effets « impact », ils sont habituellement utilisés pour des effets de
courte durée quand un sort frappe une cible. Ins ont une durée instantannée (DURATION_TYPE_INSTANT).
Voici un exemple d’un puit de sorcière magique, quand il est utilisé, il
crée un effet sur lui même et augmente la force avec un effet sur la cible (mais
il ne peut seulement être utilisé une fois…si il est utilisé une seconde
fois, il attaque avec un éclair de 8d6 de dégats) :
void main() { effect eFirst; effect eSecond; effect eStrength = EffectAbilityIncrease(ABILITY_STRENGTH, (d4() + 1)); object oTarget = GetLastUsedBy(); int nOnce = GetLocalInt(oTarget, "Use_Pool_Once"); // si le PC n’a pas utilisé la fontaine auparavant if (nOnce == FALSE) { eFirst = EffectVisualEffect(VFX_IMP_GOOD_HELP); eSecond = EffectVisualEffect(VFX_IMP_IMPROVE_ABILITY_SCORE); // crée l’effet sur la fontaine ApplyEffectToObject(DURATION_TYPE_INSTANT, eFirst, OBJECT_SELF); // applique l’augmentation de la force avec un effet 3 secondes plus tard DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eSecond,oTarget)); DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eStrength,oTarget, 300.0)); // se fixe la variable pour que le PC ne puisse pas l’utiliser une seconde fois SetLocalInt(oTarget, "Use_Pool_Once", TRUE); } // Si il a utilisé la fontaine else { eFirst = EffectVisualEffect(VFX_IMP_LIGHTNING_M); // permet un jet de sauvegarde pour éviter l’éclair int nDamage = GetReflexAdjustedDamage(d6(8), oTarget, 25,SAVING_THROW_TYPE_ELECTRICITY); eSecond = EffectDamage(nDamage, DAMAGE_TYPE_ELECTRICAL); // and then cause the visual effect of the bolt strike and apply the damage ApplyEffectToObject(DURATION_TYPE_INSTANT, eFirst, oTarget); ApplyEffectToObject(DURATION_TYPE_INSTANT, eSecond, oTarget); } }
|
Enlever des effets
La chose pour enlever des effets est qu’un effet a un "pointeur"
unique qui a été établie quand il a été appliqué. Si vous définissez un nouvel
effet de variable plus tard et que vous le définissez comme un effet du même type,
RemoveEffect ne
le ciblera pas.
La voie la plus facile pour enlever un effet est de parcourir les effets actifs
qu’ils sont appliqués à la cible en utilisant GetFirstEffect
et GetNextEffect...
et ensuite de filtrer l’effet spécifique que vous recherchez. Une fois que
vous l’avez trouvé (ou les avez trouvés si vous voulez en enlever plus d’un)
le pointeur est fixé sur le bon effet et vous pouvez l’enlever.
Les commandes suivantes sont utiles pour filtrer:
GetEffectCreator
= Si vous voulez spécifier seulement les effets qui ont été appliqués par une
créture ou un objet spécifique,
GetEffectDurationType
= Cela retournera la constante du type de durée d’un effet (soit "instant"
, "permanent" , "temporary" ). Très générales, mais utile
dans certaines circonstances,
GetEffectSpellId
= Cel retournera la constante du sort qui a appliqué l’effet (SPELL_*).
Très utile si vous cherchez tous les effets d’un sort particulier ou si
vous voulez les exclure,
GetEffectSubType
= Cela renverra la constante SUBTYPE_MAGICAL,
SUBTYPE_SUPERNATURAL
ou
SUBTPE_EXTRAORDINARY.
Tous les effets par défaut d’un sous type sans les spécifier exactement,
GetEffectType =
C’est le filtre le plus utilisé quand vous cherchez un objet spécifique.
Il renvoie une constante du type EFFECT_TYPE_*,
qui est presque la même que la liste de commande des effets. Seul les effets visuels
n’ont pas un type d’effet (EFFECT_TYPE_*).
Le script basique pour enlever un effet ressemble à ceci:
effect eEffect = GetFirstEffect(oTarget); while (GetIsValidEffect(eEffect)) { if (eEffect == filter used) { RemoveEffect(oTarget, eEffect); } eEffect = GetNextEffect(oTarget); }
|
Un exemple pour enlever une malédiction (curse) lancée par une sorcière (avec
le tag "EVIL_WITCH")
à la fin d’un dialogue:
void main() { effect eEffect = GetFirstEffect(GetPCSpeaker()); while (GetIsEffectValid(eEffect)) { if ((GetEffectType(eEffect) == EFFECT_TYPE_CURSE) && (GetEffectCreator(eEffect) == GetObjectByTag("EVIL_WITCH"))) { RemoveEffect(GetPCSpeaker(), eEffect); } eEffect = GetNextEffect(GetPCSpeaker()); } }
|
Quelques choses à retenir
- EffectKnockdown
cause un crasch quand il est appliqué par autrechose que par une créature (ce
sera fixé par le prochain patch)
Note du Traducteur: ça devrait être fait.
- EffectHitPointChangeWhenDying
ne marche pas (ce sera fixé par le prochain patch)
Note du Traducteur: idem
- Tous les effets ne sont pas permanent... Ils ne sont pas sauvé quand le personnage
retourne au menu, mais il persiste tant qu’il est sur le module.
Le plus long type d’effet est l’effet extroardinaire, qui résiste
à la dissipation de la magie et au repos. Les ExtraordinaryEffect
et les SupernaturalEffect
sont appliqués quand le commande suivante est dite:
effect eEffect = ExtraordinaryEffect (EffectSilence());
|
__________________
Théranthil, Mage Elfe prêtre de Mystra Membre des GdE
Parti Elmotiste pour un parler jowilien: Ministre
supérieur de la corruption
"Les langues vont toujours bon train. Les pieds ont du mal à suivre."
(les bourses aussi NdT )
Mespert de la porte de Baldur