Masteriser Neverwinter Nights (MNWN)
Ville - Partie 1
Navigation dans la série :
Table des matières :
Vue du Module
1. Chapitre 1 : le module
Avant de se plonger dans les détails de chaque zone incluse dans ce module, il pourait être intéressant de regarder les scripts
associés au module lui-même :
onAcquireItem : m1module_1
onActivateItem : m1_itemact
onPlayerDeath : nw_o0_death
onPlayerDying : nw_o0_dying
onPlayerLevelUp : nw_o0_levelup
onPlayerRespawn : nw_o0_respawn
Le premier script est impliqué dans la mise à jour du journal du PJ quand ils acquièrent un certain objet.
Il serait redondant d'analyser ce script, mais, si vous y jetez un œil, vous allez voir quelques déclarations
qui vérifient le tag de l'objet acquis. Selon l'objet acquis, d'autres vérifications peuvent avoir lieu pour
déterminer si une entrée du journal doit être mise à jour et à quel état. Rien de bien surprenant.
Le deuxième script est court et sympa : il inclue seulement un appel à IsRecall(). Nous parlerons de la pierre de
Retour plus tard, je n'entrerais donc pas dans les détails de ce tristement simple appel à ce point.
Les scripts onPlayerDeath, on PlayerDying et onPlayerRespawn exécutent les actions standards requiseS dans chaque cas
(redéfinition des points de vie et de la réputation et 'vol' de points d'expérience et d'argent). Ces scripts ont été
analysés, commentés et modifiés par tant de gens que je ne pense pas qu'il soit nécessaire de s'y attarder
(Il y a bien plus intéressant dans ce module !).
Le script pour le onPlayerLevelUp vérifie si vous avez un compagnon avec vous (nous aurons une section détaillée
sur les compagnons un peu plus tard), s'il peut augmenter de niveau, et si oui, il appelle DoLevelUp pour augmenter
le niveau de votre compagnon.
2. Sanatorium
Vous entrez dans le Chapitre 1 à partir de cette petite zone avec une seule pièce qui est utilisée pour quelques
victimes (choisies) de la Peste.
Avant de poursuivre, nous allons faire quelque chose que peu de joueurs font habituellement : se retourner et regarder
de là où nous venons. Oui, c'est bien une porte derrière le point de départ. C'est une 'Jewelled Door', marquée comme
'Plot Item', fermée, et demandant une clé non spécifiée pour être ouverte (en gros : scellée). A part ça la porte a
un script associé avec son évènement onFailToOpen, faisant dire une ligne à la porte tirée de son arbre de conversation.
Comme dans le prologue, cet arbre de conversation est utilisé encore et encore par des portes diverses et variées et la
variable NW_L_FEEDBACK est mise juste avant que la ligne soit utilisée pour s'assurer que le noeud correct du dialogue
est choisi. Dans ce cas, le noeud dit est le suivant : 'This door is barred from the other side'. Une révision de ce que
l'on a déjà vu dans le Prélude.
Le reste du Sanatorium contient Desther, Fenthick, deux infirmières, et quelques victimes de la peste. Si l'on veut être
complet : il y a aussi 4 triggers (déclencheurs) et une porte menant à la zone du Hall de Justice.
Le trigger (déclencheur) entourant Desther and Fenthick :
Ce dernier est associé à deux scripts :
onEnter : m4q1ktriga_2
onExit : m1q1ktriga_3
^^^^^^^^^^^^^^^^^^^^
Script: m1q1ktriga_2
^^^^^^^^^^^^^^^^^^^^
void main()
{
object oFenthick =
GetLocalObject(
GetArea(OBJECT_SELF),
"NW_G_oFenthick");
object oPC =
GetEnteringObject();
if(GetIsPC(oPC) &&
GetLocalInt(oPC,
"NW_L_M1Q1KFenthicInit") == FALSE &&
IsInConversation(oFenthick) ==
FALSE)
{
AssignCommand(oPC,
ClearAllActions());
AssignCommand(oFenthick,
ClearAllActions());
AssignCommand(oFenthick,
ActionStartConversation(oPC));
}
}
^^^^^^^^^^^^^^^^^^^^
Le comportement de ce script dépend de l'objet entrant, de la valeur de la variable NW_L_M1Q1KFenthicInit se trouvant sur
l'objet entrant et si Fenthick est ou n'est pas en cours de conversation.
Si l'objet entrant est un PJ, la varible est déclarée comme FALSE (ou 0) et si Fenthick n'est pas en conversation, il
engagera la conversation avec le pJ. Notez que Fenthick lui-même est indirectement référencé à travers une copy de l'objet
Fenthick mis dans la zone elle-même. Cet objet local est configuré par le script de spaning appartenant… à Fenthick (!)
(voir ci-dessous de toutes façons).
^^^^^^^^^^^^^^^^^^^^
Script: m1q1ktriga_3
^^^^^^^^^^^^^^^^^^^^
void main()
{
object oExit =
GetExitingObject();
if(GetTag(oExit) ==
"M1Q1KFenthick")
{
AssignCommand(oExit,
ClearAllActions());
AssignCommand(oExit,
ActionMoveToObject(GetNearestObjectByTag
("WP_M1Q1KFenthick")));
}
}
^^^^^^^^^^^^^^^^^^^^
Ce trigger (déclencheur) est placé là pour vérifier si Fenthick, pour une raison étrange, sort de la zone de trigger
(déclencheur) et, si oui le repositionner au niveau du point de passage WP_M1Q1KFenthick au milieu de la zone.
Le premier trigger allongé :
Peut-être que vous ne voyez pas de quel trigger je veux parler. En fait, en plus du trigger entourant Fenthick et Desther,
les trois autres triggers dans la zone forment une espèce de long rectangle. 'Premier' fait référence au trigger le plus près
de la position de départ. Le 'deuxième' trigger sera celui au milieu, et le 'troisième' celui le plus loin de la position
de départ et proche de la porte menant au Hall de Justice.
Le premier trigger est caractérisé par un seul script sur l'évènement onEnter :
^^^^^^^^^^^^^^^^^^^^
Script: m1q1ktrigb_2
^^^^^^^^^^^^^^^^^^^^
void main()
{
if(GetIsPC(
GetEnteringObject()))
{
AssignCommand(
GetNearestObjectByTag(
"M1Q6KPatient_03"),SpeakOneLinerConversation());
}
}
^^^^^^^^^^^^^^^^^^^^
En clair, quand vous marchez sur ce trigger, la victime avec le tag M1Q6KPatient_03 dira une ligne tirée de son arbre de conversation.
Le deuxième trigger :
Le deuxième trigger a le script suivant associé à son évènement onEnter
^^^^^^^^^^^^^^^^^^^^
Script: m1q1ktrigc_2
^^^^^^^^^^^^^^^^^^^^
void main()
{
if(GetIsPC(
GetEnteringObject()))
{
AssignCommand(
GetNearestObjectByTag(
"M1Q6KPatient_07"),SpeakOneLinerConversation());
AssignCommand(
GetNearestObjectByTag
("M1Q1KNurse"),SpeakOneLinerConversation(
"M1Q1KConsole"));
AssignCommand(
GetNearestObjectByTag
("M1Q1KNurse"),ActionPlayAnimation
(ANIMATION_LOOPING_GET_LOW));
}
}
^^^^^^^^^^^^^^^^^^^^
Quand vous marchez sur ce déclencheur, la victime ayant le tag M1Q6KPatient_07 dira une ligne de conversation,
l'infirmière M1Q1Knurse fera de même, puis exécutera l'animation ANIMATION_LOOPING_GET_LOW.
Le troisième trigger :
C'est en fait une copie conforme du deuxième trigger… La même victime dit une ligne de sa conversation l'infirmière
en dit une autre etc…
Fenthick :
Fenthick est décrit par les scripts suivants :
onConversation : m1q1kfent_4
onHeartbeat : m1q1kfenthick_1
onSpawn : m1q1fenthick_9
Ses autres évènements n'ont aucun script d'associés. Commençons par le script onSpawn (puisque 'au début il n'y avait rien').
Le script de spawning met simplement la variable NW_G_oFenthick pour être une copie, ou référence, de lui-même.
Voici le script onHeartbeat de Fenthick
^^^^^^^^^^^^^^^^^^^^^^^
Script: m1q1kfenthick_1
^^^^^^^^^^^^^^^^^^^^^^^
void main()
{
int nCount =
GetLocalInt(OBJECT_SELF,"NW_L_Count");
if(IsInConversation(
OBJECT_SELF) == FALSE)
{
int bFound =
FALSE;
int nNth =
1;
object oPlayerInSight =
GetNearestCreature
(CREATURE_TYPE_PLAYER_CHAR,
PLAYER_CHAR_IS_PC,
OBJECT_SELF,
nNth,
CREATURE_TYPE_PERCEPTION,
PERCEPTION_SEEN);
while (GetIsObjectValid(
oPlayerInSight) &&
bFound ==
FALSE)
{
if(
GetLocalInt(oPlayerInSight,
"NW_L_M1Q1KFenthicInit"))
{
bFound =
TRUE;
}
else
{
nNth++;
oPlayerInSight = GetNearestCreature
(CREATURE_TYPE_PLAYER_CHAR,
PLAYER_CHAR_IS_PC,
OBJECT_SELF,
nNth,
CREATURE_TYPE_PERCEPTION,
PERCEPTION_SEEN);
}
}
if(bFound ==
FALSE &&
nCount >= 3)
{
ActionDoCommand(
SetFacingPoint(GetPosition
(oPlayerInSight)));
ActionDoCommand(
SpeakOneLinerConversation());
nCount++;
}
else
{
ActionPlayAnimation(
ANIMATION_LOOPING_TALK_NORMAL);
ActionPlayAnimation(
ANIMATION_LOOPING_LISTEN);
ActionPlayAnimation(
ANIMATION_LOOPING_TALK_NORMAL);
ActionDoCommand(
SetFacingPoint(GetPosition
(GetNearestObjectByTag("WP_GroupFacing"))));
nCount =
0;
}
}
SetLocalInt(OBJECT_SELF,
"NW_L_Count",nCount);
}
^^^^^^^^^^^^^^^^^^^^^^^
Si Fenthick est déjà en conversation rien ne se passera. Sinon il triera les PJS en vue et cherchera celui ou ceux ayant la variable
NW_L_M1Q1KFFenthicInit définie comme True. A ce point la variable NW_L_Count définie sur Fenthick devient cruciale. A moins que la
variable ne soit à 3 ou plus. Dans ce cas Fenthick fera face au PJ ayant les conditions requises, dira une ligne de sa conversation
et augmentera la valeur de sa variable MW_L_Count.
Voici le script onConversation de Fenthick :
^^^^^^^^^^^^^^^^^^^^^^^
Script: m1q1kfenthick_4
^^^^^^^^^^^^^^^^^^^^^^^
void main()
{
object oFenthick =
GetLocalObject(
GetArea(OBJECT_SELF),"NW_G_oDesther");
if(IsInConversation(oFenthick) ==
FALSE)
{
ClearAllActions();
BeginConversation();
}
else
{
SpeakOneLinerConversation(
"M1Q1KFent2");
}
}
^^^^^^^^^^^^^^^^^^^^^^^
Assez simple : si Fenthick n'est pas engagé dans une conversation il va engager sa conversation. Sinon il utilisera le seul noeud
de l'arbre de dialogue M1Q1KFent2 à savoir : 'I'm sorry I can't talk right now. I'm listening to Desther.'
De toutes façons nous allons jeter un œil au dialogue de Fenthick. Dix noeuds, pour couvrir toutes vos interactions avec lui durant
le Chapitre 1. Ca pourait être pire, je suppose. Voyons voir…
Tout d'abord les scripts pour la fin 'Normal' et 'Aborted' de la conversation sont les mêmes : le script est nommé m1q1kfentend et
déplace simplement Fenthick au point de passage WP_M1Q1KTFenthick, là où il commence.
Ensuite regardons la racine.
Branche #1 :
"I must speak with you"
Celle là a un Conditional attaché particulièrement intéressant :
Return !GetIsPC(GetPCSpeaker()) ;
Donc hmm… euh… quand quelqu'un qui n'est pas un PJ parle à Fenthick il répondra cela… amusant.
Branche #2 :
"<FirstName>, you were quick to answer the summons. Allow me to be the first to welcome you to the Halls of Justice."
Apparaît seulement quand NW_L_M1Q01TALKFENTHICK (sur le PJ qui parle à Fenthick) vaut 0. Dans le noeud suivant la variable
NW_L_M1Q1KFenthicInit est mise à la valeur 'TRUE ' (ou 1). Desther lancera une ligne de dialogue à ce point.
Cette branche amènera Fenthick à parler de la situation actuelle en ville et mettra NW_L_M1Q01TALKFENTHICK (sur le PJ)
à la valeur 1, pour que cette branche n'aparaisse qu'une fois. Le dialogue continuera et mènera Fenthick à éventuellement
mettre NW_L_M1Q01TALFENTHICK à 2. Finalement vous aurez l'option de lui poser quelques question (voir le noeud à ce propos dans
la branche #10) ou simplement recevoir la bénédiction de Tyr et partir (encore une fois en passant par la branche #10).
Branche #3 :
"If we are to survive the Wailing Death, Neverwinter has need of men and women like you, <FirstName>."
Cette branche apparaît quand NW_L_M1Q01TALKFENTHICK est égale à 1 et met NW_L_M1Q1KFenthicInit à la valeur 'True'
(juste au cas où). A part elle vous mènera immédiatement aux mêmes nodes de dialogue qui étaient disponible dans la branche #2.
Branche #4 :
"Greetings, <FirstName>. I must congratulate you on capturing the first Waterdhavian creature."
Cette branche apparaît si les conditions suivantes sont remplies : si NW_L_FenthickTalk est inférieure à 1, si NW_G_M1Q1MainPlot
(une variable du module en fait) est égale à 25, et si NW_L_oPrimary (un objet local sur Fenthick) est un objet valide et correspond au
PJ parlant à Fenthick.
Cette branche mettra NW_L_FenthickTalk à la valeur 1 et NW_G_M1Q1A1PlayerConversation à 'True'.
Le dialogue vous laissera poser quelques question ou montrer à Fenthick une des notes que les assassins mystérieux ne manqueront
pas de laisser tomber lorsqu'ils vous tendront des embuscades pendant la courses aux créatures Waterdhéviennes. Ce noeud est aussi dans
la branche #10 ; nous l'examinerons quand nous y arriveront.
Branche #5 :
"Have you heard, <FirstName>? The first of the Waterdhavian creatures has been recovered by <CUSTOM100>."
Vous arriverez à cette branche si les conditions suivantes sont remplies :
NW_L_FenthickTalk est inférieure à 1, NW_G_M1Q1MainPlot est égale à 25, NW_L_oPrimary est valide et ne correspond pas au PJ qui
parle à Fenthick.
En arrivant à cette branche cela mettra NW_L_FenthickTalk à 1 et NW_G_M1Q1A1PlayerConversation en 'True'.
Dans un sens cette branche est une jumelle de la précédente sauf que la créature a été récupérée par quelqu'un d'autre.
Branche #6 :
"<FirstName>! Thanks to you we have now recovered two of the Waterdhavian creatures, and are halfway to a cure for the
Wailing Death!"
Apparaîtra quand NW_L_FenthickTalk est inférieure à 2, NW_G_M1Q1MainPlot est égale à 50, NW_L_oPrimary est un objet valide et
correspond au PJ discutant avec Fenthick.
Ce même noeud mettra NW_L_FenthickTalk à 2 et NW_G_M1Q1A1PlayerConversation en 'True'.
Branche #7 :
"I have good news to report, <FirstName>! The second Waterdhavian creature has been recovered by <CUSTOM100>.
We are halfway to a cure!"
La jumelle de la branche #6 sauf que c'est une fois de plus quelqu'un d'autre qui a trouvé la seconde créature :).
Branche #8 :
"Well done, <FirstName>. I heard you found the third of the creatures from Waterdeep. A cure is all but within
our grasp now!"
Cette branche apparaît quand NW_L_FenthickTalk est inférieure à 3, NW_G_M1Q1MainPlot est égale à 75, NW_L_oPrimary est
un objet valide et correspond au PJ engageant la conversation avec Fenthick. Ce noeud mettra NW_L_FenthickTalk à 3 et
NW_G_M1Q1A1PlayerConversation en 'True'.
Branche #9 :
"Well met, <FirstName>. Have you heard? The third Waterdhavian creature has been found. A cure is all but in our hand!"
Encore une fois la sœur de la branche ci-dessus, mènera aux même choix de conversations.
Branche #10 :
"Hello again, <FirstName>, and well met as always. Is there something I may do for you?"
Cette branche n'a aucune condition attaché à sa racine. C'est une branche générale utilisée quand il n'y a rien de particulier
de déclenché par rapport aux variables précédemment citées.
Ce dialogue vous permet de poser des questions et inclue un noeud concernant les lettres que vous récupérerez sur les corps des assassins
qui vous attaqueront durant le Chapitre 1.
Ce noeud apparaîtra seulement si le PJ parlant à Fenthick possède dans son inventaire un des objets suivant : M1Q1_LetterConspiracy,
M1Q1_LetterCult ou M1Q1_LetterSpy.
Des dialogues différents s'enclencheront selon l'objet possédé. Dans tous les cas la lettre vous sera enlevée et Desther profitera de
la situation pour montrer sa personnalité des plus charmantes. Vous finirez ce dialogue à grands renforts de plaintes et de grommelements.
Desther :
Ou au moins, une version de Desther ! Ce viel homme charmant est charactérisé par les scripts suivants :
onConversation: m1q1kdest_4
onHeartbeat: m1animation3_1
onSpawn: m1q1kdest_9
Puisque nous havons un onSpawn script nous commencerons de là. Le script m1q1kdest_9 met simplement une copie de Desther comme objet
local dans cette zone nommé NW_G_oDesther. Cela permet à quiconque d'avoir une référencé à Desther en cas de besoin.
Le script onHeartbeat de Desther (m1animation3_1) joue simplement trois animations : TALK_NORMAL, LISTEN et TALK_NORMAL et s'assure
que Desther fait face au point de passage WP_GroupFacing (comme Fenthick). Tout ça bien sûr, sauf si Desther est engagé dans une conversation.
Le script onConversation est similaire à celui de Fenthick : Si Fenthick (oui oui Fenthick et non pas Desther) est engagé dans
une covnersation, Desther dira une ligne tirée du dialogue M1Q1KDest2 (Le noeud " Leave me be for the moment. I am listening
to Fencthick. " est la seule dans ce dialogue.) Sinon il commencera sa conversation par défaut (m1q1kdesther).
Le dialogue par défaut de Desther possède 5 branches principales qui sont sélectionnées aléatoirement. Aucune des ces dernières n'a
de conséquences sur le jeu, juste de la conversation vide et inintéressante quoi.
A. Législation
"Neverwinter Nights" est développé par Bioware Corp., produit et vendu par Infogrames, Inc.,
New York, NY. Bioware et le Bioware Aurora Engine sont des marques déposées de Bioware Corp. Tous les autres copyrights et marques déposées sont la propriété de leurs ayant-droits respectifs.
B. Contact
L’article "Masteriser Neverwinter Nights : Prélude" a été écrit par Frank "Olorin" Rizzi.
Vous pouvez me contacter (l’auteur) par e-mail fkh1000@yahoo.com. Tout commentaire, suggestion, et même critique, sera bienvenu et apprécié. Ceci est le premier de ce qui pourrait
être une série d’articles, donc il y a de la marge pour améliorer cet article, ainsi que ceux encore à venir.
J’espère que vous apprécierez la lecture de MNWN : Prélude, et qu’elle vous inspirera et vous
aider pour la création de modules encore meilleurs avec le toolset Aurora et Neverwinter Nights. Je tiens à remercier BioWare pour avoir développer un aussi bon produit.
Cette traduction à été effectuée par Don Vincenzo. Vous pouvez me contacter (le traducteur) sur le
forum. Toute suggestion pour améliorer
la traduction sera la bienvenue. J’espère vous faciliter la lecture et la compréhension de cette
très intéressante série d’articles.
Vous pouvez (et je vous le recommande) consulter la version originale à
cette adresse.