NWScript - pour niveau 9

Huit niveaux passés à combler vos donjons, vos forêts, vos grottes... Il est temps à présent de se pencher sur un autre aspect de l'aventure. Lors de ce neuvième niveau, nous verrons comment un dialogue peut influencer le jeu, et comment permettre à vos joueurs de dépenser les pièces d'or fraichement obtenues. Entrez donc dans le monde du social et du commercial.



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 -

Evénements d'une conversation

Chaque ligne d'une conversation comporte deux événements : "condition" et "action". Ces deux seuls événements permettent une infinité de choses. L'éditeur de conversations fut d'ailleurs l'outil le plus utilisé dans Neverwinter Nights, aussi bien dans la conception de systèmes d'artisanats que d'outils pour MD ou joueurs (tels que DMFI). Avec l'apparition des interfaces personnalisées, la conversation a perdu de sa polyvalence, mais reste l'outil principal que l'on utilise afin de faire "vivre" les quêtes. De toutes manières, il est pratiquement inconcevable de mettre un PNJ important sans lui affecter une conversation.

Au même titre que les événements liés à une conversation, il y a deux manières de concevoir les scripts. Mais les commandes permettant d'interagir avec les interlocuteurs resteront les mêmes :

L'objet auquel est rattaché la conversation sera toujours représenté par "OBJECT_SELF".

La fonction permettant de retrouver le joueur impliqué dans la conversation est "GetPCSpeaker()".


Voici une conversation très complexe :

image

La zone où nous pourrons visualiser et paramétrer un script lié à une "condition" :

image

La zone où nous pourrons visualiser et paramétrer un script lié à une "action" :

image

Notez qu'une même ligne peut aussi avoir un script en "condition" ET en "action".


Condition (ou condition d'exécution) :

La "condition" détermine si la ligne d'une conversation doit être affichée ou non. Attention car toutes les lignes d'une conversation reliées a la même racine vérifieront leur condition. Dans l'exemple de la conversation précédente, les lignes "Bonjour madame" et "Bonjour monsieur" vérifieront leur condition, puis la ligne la plus haut placée ayant rempli ses conditions s'affichera. Si ces deux lignes vérifient leur condition avec succès, la ligne "Bonjour monsieur" ne s'affichera pas car "Bonjour madame" est plus haut placée.

Un script de "condition" ne commence pas par "void main()". A la place, il faudra utiliser "int StartingConditional()". N'étant donc pas un script de type "void", il faudra retourner une valeur. Dans le cas ci-présent, "TRUE" ou "FALSE" détermineront si la condition est remplie ou non.


Notez qu'une ligne n'ayant pas de script attaché à cet événement sera considéré comme ayant toujours vérifié une condition avec succès. C'est pour cela que l'on place toujours en premier les lignes ayant un script de "condition".


Voyons plus en détail comment agit une "condition". Nous nous pencherons sur la première ligne : "Bonjour madame". Au vu de la complexité surprenante de cette conversation, j'utiliserai la fonction "GetGender()" pour déterminer si le personnage du joueur est de sexe masculin ou féminin, et déclarer remplie la condition s'il est de sexe féminin.

Je prépare donc un script que je nommerai "script1" :

int StartingConditional()
{
    object oJoueur = GetPCSpeaker();
    if(GetGender(oJoueur) == GENDER_FEMALE)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

Il ne me reste plus qu'à utiliser ce script dans la ligne "Bonjour madame" de ma conversation. Pour cela, je devrai sélectionner la ligne, m'assurer d'être dans la partie "condition", et cliquer sur "ajouter". Je n'aurai plus qu'à entrer le nom du script, qui s'affichera dans la zone de visualisation :

image

Notez qu'une "condition" peut aller au-delà d'une simple vérification. Par exemple, vous pouvez très bien vérifier si le joueur a au moins 100 pièces d'or sur lui, les lui enlever s'il les a, puis déclarer la condition comme ayant été vérifiée :

int StartingConditional()
{
    object oJoueur = GetPCSpeaker();
    if(GetGold(oJoueur) >= 100)
    {
        AssignCommand(oJoueur, TakeGoldFromCreature(100, oJoueur, TRUE));
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

Notez la manière dont j'ai utilisé la fonction "TakeGoldFromCreature(...)", me permettant de retirer de l'argent à un joueur. Cette méthode de renommée mondiale a été approuvée par la majorité des contrôleurs des impôts.


Action (ou action conséquente) :

Un script lié à l'événement "action" est déclenché lorsque la ligne d'une conversation est :
- affichée, s'il s'agit d'une ligne liée à un objet non-joueur
- sélectionnée, s'il s'agit d'une ligne liée à un joueur

Prenons le script ci-dessous, que je nommerai "script2" :

void main()
{
    object oJoueur = GetPCSpeaker();
    GiveGoldToCreature(oJoueur, 100);
}

Si j'affecte ce script à la ligne "Au revoir" liée au joueur, ce dernier ne recevra rien tant qu'il n'aura pas cliqué sur le texte. Si je l'affecte à "Bonjour madame" ou "Bonjour monsieur", le joueur recevra automatiquement ses 100 pièces d'or.

Pour affecter un script à une "action", nous procéderons de la même manière que pour une "condition". Il faudra sélectionner la ligne, s'assurer d'être dans la partie "action", et cliquer sur "ajouter". Il ne restera plus qu'à entrer le nom du script, qui s'affichera dans la zone de visualisation :

image

Notez qu'un script lié à une "action" sera de type "void main()".

Evénements d'une échoppe

Les échoppes sont le principal "moteur commercial" d'un module. Ils permettent à un joueur de vendre et d'acheter diverses choses selon un prix dont le rapport est déterminé par le concepteur. En tant que contenant, ils peuvent déclencher un événement lors de l'ouverture, et lors de la fermeture.

En premier lieu, il faut savoir que le contenu d'une échoppe pendant le jeu n'est accessible que par le biais d'un script. Ceci est possible grâce à la fonction "OpenStore(...)". Voyons comment cette fonction s'utilise :

// Ouvre le contenu de l'échoppe "oStore" pour "oPC"
// - oStore : l'échoppe dont le contenu sera affiché
// - oPC : le joueur pour lequel le contenu sera affiché
// - nBonusMarkUp : représente le pourcentage rajouté au
//                  prix des objets en vente (de -100 à 100)
// - nBonusMarkDown : représente le pourcentage rajouté au
//                    prix des objets rachetés (de -100 à 100)
void OpenStore(object oStore,
               object oPC,
               int nBonusMarkUp=0,
               int nBonusMarkDown=0);

Je pourrai donc utiliser cette fonction dans un script que je placerai dans l'événement "action" d'une conversation, ou encore lors de l'événement "OnUsed" d'un plaçable. Nous admettrons qu'il existe un objet de type "échoppe", dont le Tag serait "ECHOPPE_01". Je ferai en sorte que les objets en vente soient à leur prix normal, et que le joueur ne puisse se séparer de ses objets qu'à 50% de leur prix initial :

void main()
{
    object oEchoppe = GetObjectByTag("ECHOPPE_01");

    // J'ai utilisé la fonction "GetPCSpeaker()", vu que
    // la conversation est plus souvent utilisée.
    // Dans le cas d'un événement "OnUsed", j'aurais
    // utilisé la fonction "GetLastUsedBy()".
    object oJoueur = GetPCSpeaker();

    OpenStore(oEchoppe, oJoueur, 0, -50);
}

Notez bien que les paramètres "nBonusMarkUp" et "nBonusMarkDown" représententent un pourcentage rajouté au prix d'origine.


... Lors de l'ouverture :

Cet événement se déclenche lorsqu'une échoppe s'ouvre.

La fonction permettant de retrouver le joueur ayant ouvert l'échoppe est "GetLastOpenedBy()".


... Lors de la fermeture :

Cet événement se déclenche lorsqu'une échoppe se ferme.

Bien qu'il n'y ait rien d'indiqué, la fonction qui théoriquement permettrait de retrouver le joueur ayant fermé l'échoppe est "GetLastClosedBy()".

Vous avez gagné un niveau !

Les principaux outils pour faire vivre le moindre village sont désormais entre vos mains. Libre à vous dès à présent de donner un lieu de repos aux aventuriers qui fouleront le sol de 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


Personne n'a encore réagi. Soyez le premier.

Que pensez-vous de Neverwinter Nights 2 ?

127 aiment, 20 pas.
Note moyenne : (155 évaluations | 5 critiques)
8,4 / 10 - Très bien

315 joliens y jouent, 840 y ont joué.