NWScript - pour niveau 10
Pourquoi aborder les créatures en fin de chapitre ? Les événements liés aux créatures définissent la majeure partie de leur comportement, leur "IA" diront les plus chevronnés. Bien que l'intelligence donnée par les concepteurs de NWN2 soit quelque peu limitée, ceux-ci ne nous ont pas interdit de modifier la manière dont chaque créature réagira.
Préparez-vous à activer le Ghost caché dans chaque individu, et pénétrez dans le monde du cérébral. Prenez soin d'essuyer vos pieds avant d'entrer.
NWScript - pour niveau 6
- Evénements du module -
NWScript - pour niveau 7
- Evénements d'un plaçable, d'une porte -
NWScript - pour niveau 8
- Evénements d'une zone, d'un déclencheur, d'une rencontre -
NWScript - pour niveau 9
- Evénements d'une conversation, d'une échoppe -
NWScript - pour niveau 10
- Evénements d'une créature -
Evénements d'une créature...
Voici la liste des événements qu'une créature supporte :
- lors de l'apparition en jeu
- lors de la perception
- lors d'une attaque physique
- lors du lancement d'un sort
- lorsque des dégâts sont subis
- lors la fin du tour de combat
- lors de la fin du repos
- lors de la mort
- lors d'une conversation
- lors d'une modification de l'inventaire
- lors d'un blocage dans le déplacement
- événement récurrent
- événement défini par l'utilisateur
De la même manière qu'un plaçable, certains événements pourront se déclencher simultanément. Un même événement peut égélement se déclencher plusieurs fois "en même temps". Grâce à ces événements, une créature peut accomplir un grand nombre de rôles.
... lors de l'apparition en jeu
(OnSpawn)
Cet événement est déclenché lorsqu'une créature apparaît sur le module. Les créatures ayant été "posées" à partir de l'éditeur déclenchent aussi cet événement lors du démarrage du module. En général, on utilise l'événement "OnSpawn" pour appliquer certains paramètres à une créature, comme des variables locales définissant un comportement précis.
Il n'y a aucune fonction directement associée à cet événement.
NWN2 utilise des fonctions particulières afin de paramêtrer une créature lors de son apparition. Ces paramêtres de comportements sont inclus dans les bibliothèques de fonctions "x0_i0_anims" et "x2_inc_switches". Les fonctions de NWN2 utilisent un système de variables locales dont la présence sera vérifiée par le script "nw_c2_default9".
Par exemple sur une créature, en mettant la valeur 1 à une variable locale de type "int" dont le nom est "X2_L_SPAWN_USE_STEALTH", celle-ci se mettra automatiquement en mode discrétion lorsqu'elle apparaîtra en jeu.
Il est également possible de faire réagir la créature à une suite de caractères "parlés". Il faut pour cela définir quels sont les caractères à reconnaître, leur donner un identifiant, et activer le mode "écoute" sur la créature :
// en utilisant ** à la place d'une suite de caractères,
// la créature sera capable d'analyser toutes les phrases.
SetListenPattern(oSelf, "Bladabroque", 30001);
// Une fois la suite de caractères définie, on active l'écoute.
SetListening(oSelf, TRUE);
De cette manière, la créature sera capable de reconnaître le mot "Bladabroque" lorsque l'événement "OnConversation" sera déclenché.
... lors de la perception
(OnPerception)
Cet événement se déclenche lorsqu'une créature perçoit la présence d'une autre créature. Cette dernière peut avoir été "vue", ou "entendue". Si une créature invisible et inaudible n'a pas été détectée, l'événement "OnPerception" ne sera pas déclenché.
La fonction permettant de retrouver la créature ayant déclenché cet événement est "GetLastPerceived()".
Il existe quatre situations déterminant la manière dont l'événement "OnPerception" a été déclenché.
Créature visible :
Une créature visible peut simplement être entrée dans le champ de perception, et avoir déclenché cet événement.
Une créature invisible peut s'approcher sans être vue, mais il est possible qu'elle soit détectée. Dans ce cas, l'événement "OnPerception" sera déclenché.
La fonction "GetLastPerceptionSeen()" permet de déterminer si une créature est devenue visible.
Créature audible :
Une créature "entendue" peut simplement être entrée dans le champ de perception, et avoir déclenché cet événement.
Si une créature inaudible a pu s'approcher sans être entendue, il est possible qu'elle soit détectée. Dans ce cas, l'événement "OnPerception" sera déclenché.
La fonction "GetLastPerceptionHeard()" permet de déterminer si une créature est devenue audible.
Créature invisible :
Le terme "invisible" qualifie ici une créature qui disparaît de la vue. Elle peut simplement être sortie du champ de perception. Elle peut également avoir utilisé un sort ou une compétence spéciale la rendant invisible, et n'a pas été détectée. L'événement "OnPerception" se déclenchera alors. Si une créature dans le champ de perception devient invisible, mais qu'elle a été détectée, l'événement "OnPerception" ne se déclenchera pas.
La fonction "GetLastPerceptionVanished()" permet de déterminer si une créature est devenue invisible.
Créature inaudible :
Une créature est qualifiée "d'inaudible" lorsqu'elle ne peut plus être entendue. Elle peut simplement être sortie du champ de perception. Elle peut également avoir utilisé un sort ou une compétence spéciale la rendant inaudible, et n'a pas été détectée. L'événement "OnPerception" se déclenchera alors. Si une créature dans le champ de perception devient inaudible, mais qu'elle a été détectée, l'événement "OnPerception" ne se déclenchera pas.
La fonction "GetLastPerceptionInaudible()" permet de déterminer si une créature est devenue inaudible.
Fonctionnement de la perception :
En général, une créature qui entre simplement dans le champ de perception déclenche deux fois l'événement "OnPerception". Une première fois car elle a été vue, une deuxième fois car elle a été entendue. Lorsqu'elle sortira simplement du champ de perception, l'événement "OnPerception" sera aussi déclenché deux fois, car elle ne peut plus être vue, ni entendue.
Le script ci-dessous vous permettra de faire quelques tests de perception :
void main()
{
string sMessage;
if(GetLastPerceptionSeen() == TRUE);
{
sMessage = "Visible";
}
else if(GetLastPerceptionHeard() == TRUE);
{
sMessage = "Audible";
}
else if(GetLastPerceptionVanished() == TRUE);
{
sMessage = "Invisible";
}
else if(GetLastPerceptionInaudible() == TRUE);
{
sMessage = "Inaudible";
}
object oJoueur = GetLastPerceived();
SendMessagToPC(oJoueur, sMessage);
SpeakString(sMessage, TALKVOLUME_SHOUT);
}
Il semblerait que la fonction "ClearAllActions(...)" réinitialise le statut de perception de la créature.
... lors d'une attaque physique
(OnPhysicalAttacked)
Cet événement est déclenché lorsqu'une créature est attaquée par une arme de mélée ou à distance. A chaque attaque sur la créature, l'événement "OnPhysicalAttacked" sera déclenché. Si la créature subit des dégâts, l'événement "OnPhysicalAttacked" sera automatiquement suivi de l'événement "OnDamaged".
La fonction permettant de retrouver l'objet ayant attaqué la créature est "GetLastAttacker()".
Si l'attaquant est une autre créature, il est possible de retrouver l'arme qu'elle a utilisé lors de l'attaque grâce à la fonction "GetLastWeaponUsed(...)".
Notez bien que cet événement se déclenchera même si l'attaque sur la créature a échoué.
... lors du lancement d'un sort
(OnSpellCastAt)
Cet événement est déclenché lorsqu'une créature est ciblée par un sort, ou incluse dans la zone d'effet d'un sort. Si le sort provoque des dégâts, l'événement "OnSpellCastAt" sera automatiquement suivi de l'événement "OnDamaged".
La fonction permettant de retrouver l'objet ayant lancé un sort sur la créature est "GetLastSpellCaster()".
La fonction "GetLastSpell()" permet de retrouver l'identifiant du sort qui a été lancé. La valeur obtenue peut être alors comparée aux constantes de la famille "SPELL_".
La fonction "GetLastSpellCastClass()" permet de retrouver quelle est la classe du lanceur de sort. Cette fonction saura aussi distinguer la bonne classe dans le cas d'une créature ayant plusieurs classes de type "lanceur de sort". La valeur renvoyée par cette fonction pourra être comparée aux constantes de la famille "CLASS_TYPE_".
La fonction "GetLastSpellHarmful()" permet de définir si le sort était offensif ou non. La valeur renvoyée sera "TRUE" si le sort était offensif.
... lorsque des dégâts sont subis
(OnDamaged)
Cet événement se déclenche si une créature subit des dégâts.
La fonction permettant de retrouver l'objet ayant endommagé la créature est "GetLastDamager()".
La fonction "GetTotalDamageDealt()" permettra de connaître la totalité des dégâts subis.
La fonction "GetDamageDealtByType(...)" permettra de connaître le montant d'un même type de dégâts infligés. Il faudra remplir le paramètre de la fonction par une constante de la famille "DAMAGE_TYPE_", pour désigner le type de dégâts infligés dont on souhaite connaître le montant.
... lors la fin du tour de combat
(OnCombatRoundEnd)
Cet événement se déclenche toutes les 6 secondes lorsque la créature est impliquée dans un combat.
Cet événement signifie la fin d'un "round" de combat. Si le combat s'achève avant que le round ne se termine, l'événement n'est pas déclenché.
Il n'y a aucune fonction directement associée à cet événement.
... lors de la fin du repos
(OnRest)
Cet événement se déclenche si une créature est amenée à se reposer, notamment grâce à la fonction "ActionRest(...)".
Le repos d'une créature est instantané. Il ne comporte pas de sous-catégorie, comparé à l'événement "OnRest" du module.
Il n'y a aucune fonction directement associée à cet événement.
... lors de la mort
(OnDeath)
Cet événement est déclenché lorsque quelqu'un (ou quelque chose) tue la créature.
Par défaut, il est encore possible d'interagir avec une créature morte pendant environ trois secondes. Passé ce délai, la créature n'est plus accessible. Si la créature est paramétrée pour ne pas disparaître après sa mort, elle restera constamment accessible par script.
La plupart des systèmes personnalisés d'attribution d'expérience utilisent l'événement "OnDeath" pour distribuer les points d'expérience aux joueurs.
La fonction permettant de retrouver l'objet ayant tué la créature est "GetLastKiller()".
... lors d'une conversation
(OnConversation)
Cet événement est déclenché lorsqu'une créature est à portée d'un dialogue. Attention, il ne s'agit pas d'une "conversation" selon les termes de NWN2. J'utiliserai le terme "dialogue" pour tout ce qui est utilisation de la fenêtre de dialogue, ou d'une fonction de script telle que "SpeakString(...)".
La créature entendra un dialogue "parlé" ou "chuchoté" selon la distance que couvrent ces type de dialogue.
La fonction permettant de retrouver l'objet ayant tenu une discussion à portée de la créature est "GetLastSpeaker()".
Si une créature a été paramétrée de façon à "écouter" une suite de caractères spécifiques, la fonction "GetListenPatternNumber()" permettra de déterminer si l'identifiant associé à cette suite de caractères est dans la liste des identifiants connus.
Par exemple, il sera possible de faire réagir la créature que l'on a paramétrée grâce à l'événement "OnSpawn" :
void main()
{
// Si le joueur prononce le mot "Bladabroque", et que
// et que la créature reconnaît l'identifiant...
if(GetListenPatternNumber() == 30001)
{
// ... il sera possible de la faire réagir.
SpeakString("Qui me parle ?", TALKVOLUME_TALK);
}
}
... lors d'une modification de l'inventaire
(OnDisturbed)
Cet événement se déclenche lorsque l'inventaire d'une créature est modifié. Cela peut être à cause d'un objet retiré, d'un objet rajouté, ou encore d'un objet volé.
La fonction permettant de retrouver ce qui a altéré l'inventaire d'une créature est "GetLastDisturbed()".
La fonction "GetInventoryDisturbType()" peut être utilisée pour déterminer quel est le type de modification dans l'inventaire de la créature. La valeur que cette fonction renverra pourra être comparée aux constantes suivantes :
- INVENTORY_DISTURB_TYPE_ADDED : sa valeur de 0 signifiera qu'un objet a été rajouté.
- INVENTORY_DISTURB_TYPE_REMOVED : sa valeur de 1 signifiera qu'un objet a été retiré.
- INVENTORY_DISTURB_TYPE_STOLEN : sa valeur de 2 signifiera qu'un objet a été volé.
La fonction "GetInventoryDisturbItem()" permettra de retrouver l'item ayant été retiré ou rajouté.
... lors d'un blocage dans le déplacement
(OnBlocked)
Cet événement se déclenche lorsqu'une porte gêne le déplacement de la créature. D'après la description du script par défaut, seules les portes sont considérées comme pouvant bloquer une créature.
La fonction "GetBlockingDoor()" permet de déterminer quelle est la porte gênante.
... événement récurrent
(OnHeartbeat)
Cet événement est déclenché toutes les 6 secondes par la créature. Il n'y a pas d'objet associé au déclenchement de cet événement.
... événement défini par l'utilisateur
(OnUserDefined)
Au même titre que pour le module, il est possible de faire réagir l'événement "OnUserDefined" à partir des autres événements, ou à partir d'événements personnalisés.
Notez qu'une créature morte ne réagit pas si un signal est envoyé.
Vous avez gagné un niveau !
Le contrôle des créature peut avoir sa part dans la difficulté générale du module. A partir du moment où une créature est plus "intelligente" qu'une autre, elle devient un challenge pour les joueurs la rencontrant. Bien entendu, le combat n'est pas le seul cas où l'on peut avoir recours à une "intelligence". Aussi, l'animation des PNJs dépend principalement des scripts qui lui sont attribués.
La meilleure manière de comprendre comment une créature "réflechit" est de décortiquer les scripts de NWN2. Une fois ce cap passé, vous serez très certainement capable de rendre plus vivantes les aventures que proposera votre module.
NWScript - Page générale
NWScript - pour niveau 6
- Evénements du module -
NWScript - pour niveau 7
- Evénements d'un plaçable, d'une porte -
NWScript - pour niveau 8
- Evénements d'une zone, d'un déclencheur, d'une rencontre -
NWScript - pour niveau 9
- Evénements d'une conversation, d'une échoppe -
NWScript - pour niveau 10
- Evénements d'une créature -
Réactions
Pas de compte JeuxOnLine ?
Créer un compteQue pensez-vous de Neverwinter Nights 2 ?
315 joliens y jouent, 840 y ont joué.
-
25 mai 2015
-
7 juin 2013
-
5 janvier 2012
-
17 août 2011
-
8 juin 2011