NWScript - pour niveau 2

Vous avez quelques points à dépenser dans la compétence "scripting" ?

N'hésitez pas ! Ici commencent les subtilités du langage. Vous verrez la façon d'exécuter des commandes selon une condition particulière, voire plusieurs. Quelques fonctions feront leur apparition pour vous montrer la manière dont les choses fonctionnent, dans Neverwinter Nights 2.

Installez-vous bien confortablement, le film ne fait que commencer.



NWScript - Page générale

NWScript - pour niveau 1
- Bases et notions de programmation -

NWScript - pour niveau 2
- Conditions if/else et opérateurs ET / OU -

NWScript - pour niveau 3
- Boucles while/for et sélection switch/case -

NWScript - pour niveau 4
- Constantes, fonctions, et bibliothèques -

NWScript - pour niveau 5
- Variables persistantes et exécution de scripts -

Conditions (if / else), comparer deux valeurs

Ce sont les instructions les plus utilisées dans NWScript. Elles permettent d'exécuter une partie de code selon une condition précise. Elles sont représentées de la manière suivante :

if ( /* première condition */ )
{
    // partie de code à exécuter
}

else if ( /* seconde condition */ )
{
    // partie de code à exécuter
}

else // Représente tout autre cas
{
    // partie de code à exécuter
}

Lorsqu'une condition "if" est posée, il n'est donc pas obligatoire d'énumérer toutes les autres situations dans des "else if" si elles peuvent toutes être regroupées dans un simple "else".

Remplir une condition signifie comparer deux valeurs du même type avec succès. Si la comparaison est un échec, la partie de code soumis à la condition est ignoré. Les comparateurs les plus fréquemment utilisés sont :

Comparateur Utilisation
== égal à
!= différent de
> plus grand que
< plus petit que
>= plus grand ou égal à
<= plus petit ou égal à

void main()
{
    object oJoueur = GetLastUsedBy();

    // Je vais chercher le niveau de oJoueur,
    // grace à la fonction "GetHitDice(...)".
    // Cette fonction est de type "int"
    int nNiveau = GetHitDice(oJoueur);

    // Je définis mes deux chaines de caractères
    string sTexte1 = "Vous êtes niveau 1";
    string sTexte2 = "Vous êtes niveau 2 ou plus";

    // J'emets maintenant ma première condition :
    // * Le joueur est-il niveau 1 ?
    if ( nNiveau == 1 )
    {
        // Si cette condition est remplie,
        // je lui envoie le message 1
        SendMessageToPC(oJoueur, sTexte1);
    }

    // Je peux émettre la seconde condition :
    // * Le joueur est-il niveau 2 ou plus ?
    else if ( nNiveau >= 2 )
    {
        // Si cette condition est remplie,
        // je lui envoie le message 2
        SendMessageToPC(oJoueur, sTexte2);
    }
}

La fonction suivante m'a permis de récupérer le nombre de dés de vie d'une créature :

int GetHitDice(object oCreature)

- Etant une fonction de type "int", elle renverra forcément une valeur de type "int" que je peux attribuer à une variable du même type.
- oCreature devra être un objet pour lequel on comptera le nombre de dés de vie. Dans le cas d'un joueur, celui-ci n'aura forcément qu'un seul dé de vie par niveau.

* N'oublions pas que le paramètre object oCréature représente seulement le type de variable à insérer. Peu importe le nom de la variable que je mettrai.


Notez que dans le cas du script précédent, seule la première condition est vraiment importante. La logique veut que : si le joueur n'est pas niveau 1, il est forcément niveau 2 ou plus. Cette logique est l'une des raisons qui doit pousser un programmeur à planifier ses scripts, pour ne pas se retrouver avec des portions de code inutiles. Notez aussi que, toujours dans ce cas, les messages textes n'ont pas besoin d'être stockés dans une variable non plus.

J'aurais donc très bien pu écrire le script précédent de cette manière :

void main()
{
    object oJoueur = GetLastUsedBy();
    int nNiveau = GetHitDice(oJoueur);

    // J'emets ma condition :
    // * Le joueur est-il niveau 1 ?
    if ( nNiveau == 1 )
    {
        // Si cette condition est remplie,
        // je lui envoie le message 1
        SendMessageToPC(oJoueur, "Vous êtes niveau 1");
    }

    // Si le joueur n'est pas niveau 1,
    // il est forcément niveau 2 ou plus
    else
    {
        // je lui envoie donc le message 2
        SendMessageToPC(oJoueur, "Vous êtes niveau 2 ou plus");
    }
}

... ou encore émettre des conditions supplémentaires :

void main()
{
    object oJoueur = GetLastUsedBy();
    int nNiveau = GetHitDice(oJoueur);

    // Le joueur est-il niveau 1 ?
    if ( nNiveau == 1 )
    {
        SendMessageToPC(oJoueur, "Vous êtes niveau 1");
    }

    // Le joueur est-il niveau 2 ?
    else if ( nNiveau == 2 )
    {
        SendMessageToPC(oJoueur, "Vous êtes niveau 2");
    }

    // Si les deux conditions précédentes ne sont pas
    // remplies, c'est qu'il est forcément niveau 3 ou plus
    else
    {
        SendMessageToPC(oJoueur, "Vous êtes niveau 3 ou plus");
    }
}

A noter que si une condition n'est pas remplie, la portion de code qu'elle contient ne sera pas exécutée.

Conditions à comparaisons multiples (ou / et)

Il arrive que l'on veuille effectuer plusieurs comparaisons pour une même condition. Pour cela, il existe deux façons de faire :

|| (ou), permet de définir plusieurs comparaisons qui n'ont pas besoin d'être toutes vérifiées.
&& (et), permet de définir plusieurs comparaisons qui doivent être toutes vérifiées.


Reprenons le principe du message envoyé à notre joueur. Je décide que :

- Un message lui soit envoyé son niveau est supérieur à 3
ou alors
- ce même message lui soit envoyé si sa force est supérieure à 14 (peu importe son niveau)

void main()
{
    object oJoueur = GetLastUsedBy();
    int nNiveau = GetHitDice(oJoueur);

    // Je vais vérifier la caractéristique "force" du
    // joueur grace à la fonction "GetAbilityScore(...)".
    // Cette fonction est de type "int".
    int nForce = GetAbilityScore(oJoueur, ABILITY_STRENGTH);

    // Le niveau du joueur est-il supérieur à 3,
    // ou alors sa force est-elle supérieure à 14 ?
    if ( nNiveau > 3 || nForce > 14 )
    {
        SendMessageToPC(oJoueur, "Test réussi");
    }
}

Il en va de même si deux comparaisons doivent être vérifiées pour remplir la condition :

- Le message doit être envoyé si son niveau est supérieur à 3, ET si sa force est supérieure à 14.

void main()
{
    object oJoueur = GetLastUsedBy();
    int nNiveau = GetHitDice(oJoueur);
    int nForce = GetAbilityScore(oJoueur, ABILITY_STRENGTH);

    // Le niveau du joueur est-il bien supérieur à 3
    // et sa force est-elle bien supérieure à 14 ?
    if ( nNiveau > 3 && nForce > 14 )
    {
        SendMessageToPC(oJoueur, "Test réussi");
    }
}

La fonction suivante m'a permis de récupérer la valeur d'une caractéristique, pour une créature.

int GetAbilityScore(object oCreature, int nAbility)

- Etant une fonction de type "int", elle renverra donc une valeur de type "int".
- oCreature devra être un objet duquel on désire récupérer la valeur d'une caractéristique précise. Il vaut mieux donc qu'il s'agisse d'une créature.
- nAbility* est la caractéristique dont on récupèrera la valeur.

* Pour remplir le paramètre nAbility, il faudra utiliser une constante. Il s'agit d'une variable déjà existante dans NWScript, et qui ne peut pas être modifiée. Ces constantes sont référencées. Elles ont un nom, une valeur et un type précis. Pour les utiliser, il suffit des les nommer. Les constantes représentant les 6 caractéristiques sont :
- ABILITY_STRENGHT : caractéristique force
- ABILITY_DEXTERITY : caractéristique dextérité
- ABILITY_CONSTITUTION : caractéristique constitution
- ABILITY_INTELLIGENCE : caractéristique intelligence
- ABILITY_WISDOM : caractéristique sagesse
- ABILITY_CHARISMA : caractéristique charisme
Notez bien que les constantes ci-dessus ne donnent pas la valeur de la caractéristique. Elles servent à désigner la caractéristique dont on veut récupérer la valeur. Ces constantes sont de type "int".


Il est également possible de définir des ensembles de comparaisons, en englobant chaque ensemble entre parenthèses.

Par exemple, je désire que mon test soit réussi si :

- Son niveau est supérieur à 3 ET sa force supérieure à 14
ou alors
- Si son intelligence est supérieure à 15 (peu importe son niveau et sa force)

void main()
{
    object oJoueur = GetLastUsedBy();
    int nNiveau = GetHitDice(oJoueur);
    int nForce = GetAbilityScore(oJoueur, ABILITY_STRENGTH);
    int nIntelligence = GetAbilityScore(oJoueur, ABILITY_INTELLIGENCE);

    // Le niveau du joueur est-il bien supérieur à 3
    // et sa force est-elle bien supérieure à 14 ?
    // Ou alors, son intelligence est-elle supérieure à 15 ?
    if ( ( nNiveau > 3 && nForce > 14 ) || nIntelligence > 15 )
    {
        SendMessageToPC(oJoueur, "Test réussi");
    }
}

D'une autre manière, je désire que mon test soit réussi :

- si le niveau du joueur est supérieur à 3
mais aussi
- si la force est supérieure à 14, ou si l'intelligence est supérieure à 15

void main()
{
    object oJoueur = GetLastUsedBy();
    int nNiveau = GetHitDice(oJoueur);
    int nForce = GetAbilityScore(oJoueur, ABILITY_STRENGTH);
    int nIntelligence = GetAbilityScore(oJoueur, ABILITY_INTELLIGENCE);

    // Le niveau du joueur est-il bien supérieur à 3 ?
    // sa force est-elle supérieure à 14, ou alors
    // son intelligence est-elle supérieure à 15 ?
    if ( nNiveau > 3 && ( nForce > 14 || nIntelligence > 15 ) )
    {
        SendMessageToPC(oJoueur, "Test réussi");
    }
}

La différence viendra de la position des parenthèses. Sur NWScript (pour NWN2), il suffit de mettre le curseur à côté d'une parenthèse ou d'une accolade pour la faire apparaître en gras. On peut aisément retrouver celle qui lui correspond.

Vous avez gagné un niveau !

Désormais, et en vous entrainant un peu, il vous sera possible d'exécuter des commandes selon différentes situations. Les commandes "if" sont les plus utilisées en NWScript. Et bien planifié, un script composé de "if" / "else" est capable d'accomplir la plupart des tâches. Mais ne nous quittez pas trop vite, le meilleur n'est pas encore arrivé !



NWScript - Page générale

NWScript - pour niveau 1
- Bases et notions de programmation -

NWScript - pour niveau 2
- Conditions if/else et opérateurs ET / OU -

NWScript - pour niveau 3
- Boucles while/for et sélection switch/case -

NWScript - pour niveau 4
- Constantes, fonctions, et bibliothèques -

NWScript - pour niveau 5
- Variables persistantes et exécution de scripts -

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é.