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