L'antre du Léviathan Index du Forum

L'antre du Léviathan
RP Vampire, modding Dragon Age et jeux de rôles

 FAQFAQ   RechercherRechercher   MembresMembres   GroupesGroupes   S’enregistrerS’enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

[TUTORIAL] Créer une classe

 
Poster un nouveau sujet   Répondre au sujet    L'antre du Léviathan Index du Forum -> Archives -> Créations Neverwinter Nights
Sujet précédent :: Sujet suivant  
Auteur Message
Léviathan
Marionnettiste
Marionnettiste

Hors ligne

Inscrit le: 13 Jan 2008
Messages: 309

MessagePosté le: Sam 26 Jan - 17:59 (2008)    Sujet du message: [TUTORIAL] Créer une classe Répondre en citant

Bon, on va passer aux choses sérieuses. Créer une classe est un processus assez complexe, et le mieux est encore de prendre un exemple concret pour en comprendre tous les rouages. Dans tout ce qui va suivre, je vais illustrer mes propos par la création du chasseur nocturne (textes en italique), qui est avec l'enfant céleste la classe la plus compliquée à élaborer du LPP, faisant appel aussi bien à des dons étiquettes, à des dons retournant des sorts, qu'à des dons de base. Ce n'est cependant pas forcément un modèle, car cette classe est plutôt surpuissante (sinon je pense que celle d'explorateur est plutôt faiblarde, et que les 7 autres classes du LPP sont relativement bien équilibrée).

Vous allez avoir besoin d'extraire les fichiers classes.2da, package.2da, feats.2da, skills.2da, racialtypes.2da et un exemplaire des fichiers cls_bfeat_xxxx.2da, cls_feat_xxxx.2da, cls_skill_xxxx.2da et cls_pres_xxxx.2da à l'aide du NWN Explorer.

De manière générale, je vous invite à lire les tutoriaux sur la création de dons et les fichiers TLK avant de poursuivre le présent tutorial.


Etape 1 : Savoir où l'on met les pieds

Il est important de savoir où on va mettre les pieds, et tout particulièrement à quel niveau et de quelle façon le personnage va gagner tel don. Poser tout à plat d'entrée permet de se rendre compte de l'étendu des difficultés qui nous attend.

Par exemple, je voulais que la classe de chasseur nocturne ressemble à ça :

 Dés de vie : d10
- Armes et armures : armes de base et de guerre, armures légères et intermédiaires
- Points de compétence : 4 + modificateur d'Int
- Table d'attaques : guerrier (table 1)
- Jets de sauvegarde : vigueur, réflexes, volonté

CONDITIONS :
Alignement : bon
Classe : guerrier, prêtre, paladin ou moine
Compétences : acrobatie 4, concentration 6, discipline 4
Dons : attaque en puissance, réflexes surhumains, volonté de fer

CARACTERISTIQUES :
Niveau
1 : chasseur de mort-vivants, repousser les morts-vivants, soins des blessures
2 : emprise sur les mort-vivants
3 : immunité contre la paralysie
4 : immunité contre le charme et la domination
5 : puissance ancestrale
6 : immunité contre l'absorption d'énergie
7 : bannissement
8 : immunité contre la magie de mort
9 : immunité contre les sorts mentaux
10 : fléau éternel de la non-vie

On voit tout de suite où est le problème : il n'existe aucun don retournant les sorts demandés aux niveaux 5, 7 et 10, et aucun don qui confère ces immunités. Bref, exceptés "repousser les morts-vivants" et "emprise sur les morts-vivants, il va falloir créer tous les autres dons de classes de toute pièce. Les immunités et le don "chasseur de morts-vivants" ne correspondant pas à des capacités assimilables à des sort, les pouvoirs annoncés par ses dons seront apportés via scripts directement dans le module (voir étape 7 de ce présent tutorial), alors que les dons en question ne seront finalement que des dons étiquettes (voir le tutorial sur la création de don). "Soins des blessures", "puissance ancestrale", "banissement" et "fléau éternel de la non-vie" sont eux des dons reproduisant l'effet d'un sort (voir le tutorial sur la création de don).



Etape 2 : Créer la classe proprement dite

Ouvrez le fichier classes.2da au bloc-note et créer une novuelle ligne. Voici la signification des colonnes de ce fichier :

Label : Le nom de votre classe dans votre fichier 2da (attention, vous avez le droit aux underscores "_" mais pas aux espaces !). Vous pouvez mettre ce que vous voulez, ça n'a aucune importance puisque le jeu ne lira pas le nom de votre classe de cette manière.

Les colonnes Name, Plural, Lower et Description correspondent à des références à votre fichier TLK personnalisé. Voir le tutorial sur les fichiers TLK pour de plus amples informations sur les valeurs à mettre.

Name : la référence à la ligne du TLK correspondant au nom de votre nouvelle classe (au singulier, et avec une majuscule).

Plural : la même chose, mais pour le nom de votre classe au pluriel et avec une majuscule.

Lower : la même chose, mais pour le nom de votre classe au singulier et sans majuscule.

Description : toujours une référence à une ligne du TLK, mais celle qui correspond au texte de descriptino de votre classe.

Icon : le nom de l'icone qui sera utilisé par le jeu dans le menu.
Pour le chasseur nocturne, moi j'ai repris celui du maître blême (palemaster), à savoir IR_PALEMA.

HitDie : le type de dé de vie que gagne votre personnage à chaque nouveau niveau. Vous avez le choix entre des dés à 4, 6, 8, 10 ou 12 faces. Mettez donc l'un de ces chiffres dans cette colonne.
Pour le chasseur nocturne, j'ai choisi des dés à 10 faces, comme pour un guerrier.

AttackBonusTable : la table des bonus d'attaque en fonction des niveaux. Il y en a 3 : CLS_ATK_1, CLS_ATK_2 et CLS_ATK_3. La table 1 procure +1 à l'attaque à chaque niveau (guerrier, paladin, rodeur, barbare), la table 2 procure +2 à l'attaque tous les 3 niveaux (barde, prêtre, druide, moine, roublard) et la table 3 procure un bonus de +3 à l'attaque (magicien, ensorceleur).
J'ai choisi la table CLS_ATK_1 pour mon chasseur nocturne car je voulais qu'il soit aussi bon qu'un guerrier contre n'importe quel ennemi.

FeatsTable : le nom du fichier qui contiendra la liste des dons de votre nouvelle classe (nous le créerons à l'étape 5). Il doit être de la forme cls_feat_xxxx.2da, ou xxxx est composé de 6 caractères au maximum.
Le nom du fichier pour le chasseur nocturne est cls_feat_sla.2da (sla pour slayer).

SavingThrowTable : le nom du fichier contenant la table de progression en jet de sauvegarde. Inutile dans créer une novuelle, tous les cas de figure existe déjà dans els tables des classes de base. Je vais vous les lister :
CLS_SAVTHR_FIGHT : vigueur forte, réflexes et volonté faibles
CLS_SAVTHR_ROG : réflexes forts, vigueur et volonté faibles
CLS_SAVTHR_CLER : volonté forte, vigueur et réflexes faibles
CLS_SAVTHR_WILD : vigueur et réflexes forts, volonté faible
CLS_SAVTHR_DRU : vigueur et volonté fortes, réflexes faibles
CLS_SAVTHR_BARD : réflexes et volonté forts, vigueur faible
CLS_SAVTHR_MONK : vigueur, réflexes et volonté forts
Quitte à en faire un gros-bill jusqu'au bout, j'ai opté pour CLS_SAVTHR_MONK pour mon chasseur nocturne.

SkillsTable : le nom du fichier qui contiendra la liste compétences de classe de votre nouvelle classe (nous le créerons à l'étape 4). Il doit être de la forme cls_skill_xxxx.2da, ou xxxx est composé de 6 caractères au maximum.
Le nom du fichier pour le chasseur nocturne est cls_skill_sla.2da.

BonusFeatsTable : le nom du fichier qui contiendra la fréquence d'obtention de dons bonus pour votre nouvelle classe (comme la liste de dons supplémentaires du guerrier ou du magicien) ainsi que la fréquence d'obtention des dons épiques (nous le créerons à l'étape 6). Il doit être de la forme cls_bfeat_xxxx.2da, ou xxxx est composé de 6 caractères au maximum.
Le nom du fichier pour le chasseur nocturne est cls_bfeat_sla.2da.

SkillPointBase : le nombre de points de compétence que gagne un personnage de votre nouvelle classe à chaque niveau.
Le chasseur nocturne en gagne 4.

SpellGainTable et SpellKnownTable : oubliez ces deux colonnes et mettez juste 4 astérisques ****. Vous pouvez toujours essayez de mettre autre chsoe, ça ne marchera pas : on ne peut pas créer de classe avec un livre de sorts !

PlayerClass : mettez 1 pour une classe jouable, 0 dans le cas contraire.

SpellCaster : compte tenu de ce que j'ai dis précédemment, la valeur à indiquer ici sera toujours 0.

Str, Dex, Con, Int, Wis, Cha : ces colonnes concernent à la base (du moins je pense) les caractéristiques par défaut des PNJ adoptant cette classe sous Aurora. Elle ne servent donc à rien pour des classes de prestige, mais metez quand même des valeurs (celles que vous souhaitez, entre 3 et 1Cool et pas des astérisques, sinon votre classe ne sera pas lue par le jeu.

PrimaryAbil : la caractéristique principale de votre classe (STR : force, DEX : dextérité, CON : constitution, INT : intelligence, WIS : sagesse, CHA : charisme).

AlignRestrict et AlignRstrctType : bon alors là j'avoue que j'ai séché. Mais heureusement, Papermonk était là :

Papermonk a écrit:

Alignment Restrictions

0x00 - No restrictions
0x01 - No Neutral
0x02 - No Lawful
0x03 - No Lawful, No Neutral
0x04 - No Chaotic
0x05 - No Chaotic, No Neutral
0x06 - No Chaotic, No Lawful
0x07 - No Chaotic, No Lawful, No Neutral
0x08 - No Good
0x09 - No Good, No Neutral
0x0A - No Good, No Lawful
0x0B - No Good, No Lawful, No Neutral
0x0C - No Good, No Chaotic
0x0D - No Good, No Chaotic, No Neutral
0x0E - No Good, No Chaotic, No Lawful
0x0F - No Good, No Chaotic, No Lawful, No Neutral
0x10 - No Evil
0x11 - No Evil, No Neutral
0x12 - No Evil, No Lawful
0x13 - No Evil, No Lawful, No Neutral
0x14 - No Evil, No Chaotic
0x15 - No Evil, No Chaotic, No Neutral
0x16 - No Evil, No Chaotic, No Lawful
0x17 - No Evil, No Chaotic, No Lawful, No Neutral
0x18 - No Evil, No Good
0x19 - No Evil, No Good, No Neutral
0x1A - No Evil, No Good, No Lawful
0x1B - No Evil, No Good, No Lawful, No Neutral
0x1C - No Evil, No Good, No Chaotic
0x1D - No Evil, No Good, No Chaotic, No Neutral
0x1E - No Evil, No Good, No Chaotic, No Lawful
0x1F - No Evil, No Good, No Chaotic, No Lawful, No Neutral


Align Restriction Type

0x0 - No Restriction (Can take class regardless of alignment and previous column)
0x1 - Restrict only on Law/Chaos spectrum (Can take class regardless of Good/Evil align, but
must comply with Law/Chaos align)
0x2 - Restrict only on Good/Evil spectrum (Can take class regardless of Law/Chaos align, but
must comply with Good/Evil align)
0x3 - Restrict on both Good/Evil and Law/Chaos (Must comply with all restrictions in previous
column)

The InvertRestrict column does exactly that, any alignment that was allowed isn’t, and any that wasn’t is. And the No Neutral in the first sections refers to both sorts of neutrality, however, the restrict type can be used to force it to look at only one side of the alignment.


InvertRestrict : comme écrit ci-dessus (bon ok, c'est en anglais, mais bon...), si vous mettez 1 à cette colonne, vous inverserez complètement la restriction d'alignement imposée par les deux colonnes précédentes.
Donc, si vous me suivez bien, si je veux comme condition d'alignement "tout alignement bon" pour mon chasseur nocturne, il me faut mettre 0x08 (non bon) à AlignRestrict, 0x2 à AlignRstrctType (on se contrefiche de la composane loi/chaos de l'alignement) et 1 à InvertRestrict (on inverse la restriction "non bon").

Constant : donnez un nom de constante du type CLASS_TYPE_XXXX pour votre nouvelle classe. De toute façon vous ne pourrez l'utiliser tel quel dans l'éditeur de script, il vous faudra forcément la déclarer quelque part par un : const int CLASS_TYPE_XXXX = yy; (où yy est le numéro de ligne de votre nouvelle classe dans le fichier classes.2da).

EffCRLvl01, ..., EffCRLvl20 : je suppose que ces colonnes indiquent quel est le facteur de puissance de base d'un personnage doté d'un niveau tant dans votre nouvelle classe, ou du moins des indices pour calaculer le dit facteur de puissance. Ne vous embétez pas, ne cherchez pas à faire n'importe quoi si vous ne comprenez pas, et faites plutôt comme moi : élevez l'indice de 1 pour chaque niveau. Autrement dit, mettez 1 pour EffCRLvl01, 2 pour EffCRLvl02, 3 pour EffCRLvl03, etc.

PreReqTable : le nom du fichier qui contiendra la liste des prérequis pour pouvoir sélectionner votre nouvelle classe de prestige (nous le créerons à l'étape 3). Il doit être de la forme cls_pres_xxxx.2da, ou xxxx est composé de 6 caractères au maximum.
Le nom du fichier pour le chasseur nocturne est cls_pres_sla.2da.

MaxLeveL : le niveau maximum qu'on puisse atteindre dans votre nouvelle classe, généralement 40.

XPPenalty : mettez 0 car les classe de prestige ne sont normalement pas sujette à cette histoire de classe de prédilection.

ArcSpellLvlMod : si vous souhaitez que le personnage continue à progresser en sorts dans sa classe de magie profane précédente (magicien, ensorceleur ou barde), vous devez préciser dans cette colonne à quelle fréquence. Par exemple, si vous souhaitez que pour chaque nouveau niveau pris dans votre novuelle classe de prestige, le PJ gagne aussi un niveau de sorts dans sa classe précédente, mettez la valeur 1, et si vous voulez qu'il gagne 1 niveau de sorts tous les 2 niveaux atteints dans votre nouvelle classe, mettez 2.

DivSpellLvlMod : pareil, mais pour la magie divine (prêtres, druides, paladins et rôdeurs).

EpicLevel : nombre de niveaux en-dessous duquel le personnage devient un personnage épique, cette valeur est de 10 pour les classes de prestige et de -1 pour les classes de base.
Le chasseur nocturne devient un chasseur nocturne épique au niveau 11, j'ai donc mis 10 dans la colonne EpicLevel.

Package : le numéro du package/archétypes dans le fichier package.2da correspondant au choix de dons et de compétences par défaut de votre nouvelle classe, vous savez, quand vous appuyez sur le fameux bouton recommandé (si vous mettez quatre astériques **** dans cette colonnes, alors le bouton recommandé ne retournera rien). Voir le tutorial sur les archétypes pour de plus amples informations à ce sujet.

Sauvegardez le fichier.


Etape 3 : Déterminer les prérequis pour pouvoir sélectionner la classe

Copiez un fichier cls_pres_xxxx.2da et renommez-le du nom que vous avez indiqué dans le fichier classes.2da à la colonne PreReqTable. Ouvrez-le au bloc-note, enlevez les lignes existantes de la classe d'origine du fichier, et commencez une nouvelle ligne.

Une ligne = un prérequis.

Voici les différentes possibilités de prérequis :
- une race : mettez le "label" de la race dans la colonne LABEL, la mention RACE dans la colonne ReqType, le numéro de ligne de la race au sein du fichier racialtypes.2da dans la colonne ReqParam1 et quatre astérisques **** dans la colonne ReqParam2.
- une classe : mettez le "label" de la classe dans la colonne LABEL, la mention CLASS (le PJ doit être de toutes les classes mises en prérequis) ou CLASSOR (le PJ doit être au moins d'une classe mise en prérequis) dans la colonne ReqType, le numéro de ligne de la classe au sein du fichier classes.2da dans la colonne ReqParam1 et quatre astérisques **** dans la colonne ReqParam2.
- un don : mettez le "label" du don dans la colonne LABEL, la mention FEAT (le PJ doit posséder tous les dons mis en prérequis) ou FEATOR (le PJ doit posséder au moins l'une des dons mis en prérequis) dans la colonne ReqType, le numéro de ligne du don au sein du fichier feats.2da dans la colonne ReqParam1 et quatre astérisques **** dans la colonne ReqParam2.
- un bonus de base à l'attaque minimum : mettez Base_Attack dans la colonne LABEL, la mention BAB dans la colonne ReqType, la valeur du bonus de base à l'attaque à atteindre dans la colonne ReqParam1 et quatre astérisques **** dans la colonne ReqParam2.
- un rang minimum dans une compétence : mettez le "label" de la compétence dans la colonne LABEL, la mention SKILL dans la colonne ReqType, le numéro de ligne de la compétence au sein du fichier skills.2da dans la colonne ReqParam1 et le rang minimum à atteindre dans cette compétence dans la colonne ReqParam2.
- un niveau de sort minimum en magie profane : mettez Caster_Level dans la colonne LABEL, la mention ARCSPELL dans la colonne ReqType, le niveau de sort minimum à atteindre en magie profane dans la colonne ReqParam1 et quatre astérisques **** dans la colonne ReqParam2.
- un niveau de sort minimum en magie divine : mettez Caster_Level dans la colonne LABEL, la mention DIVSPELL dans la colonne ReqType, le niveau de sort minimum à atteindre en magie divine dans la colonne ReqParam1 et quatre astérisques **** dans la colonne ReqParam2.
- une valeur particulière à une variable : mettez ScriptVar dans la colonne LABEL, la mention VAR dans la colonne ReqType, le nom de la variable en question dans la colonne ReqParam1 etla valeur initiale de celle-ci dans la colonne ReqParam2. Ce dernier point est très utile pour désactiver les classes de prestiges. Mettez toujours 0 dans ReqParam2, et changez si vous le souhaitez la valeur de la variable en 1 dans un script du module pour désactiver la classe. Ainsi, vous n'aurez qu'à refaire passer cette valeur à 0 pour rendre la classe accessible. Inversement, en procédant ainsi, toute classe dont vous ne vous serez pas occupée sera automatiquement disponible. C'est ainsi que j'ai procédé dans le module "Le jeu des Puissances" pour rendre la classe de barde athasien uniquement accessible après avoir suivi l'enseignement de Garren, par exemple.

Vous remarquerez que l'alignement, n'est pas dans cette liste. C'est bien normal, car il est déjà géré au niveau du fichier classes.2da.

Une fois vos lignes de prérequis écrites, sauvegardez le fichier.

Par exemple, pour le chasseur nocturne, en plus de l'alignement bon, je voulais que le PJ aie un rang minimum de 6 en concentration, de 4 discipline et de 4 en acrobatie, qu'il possède les dons attaque en puissance, réflexes surhumains et volonté de fer, et enfin qu'il appartienne déjà à l'une des classes suivantes : guerrier, paladin, prêtre ou moine. Enfin, comme d'habitude, je rajoute une variable initialisée à 0, juste au cas où quelqu'un voudrait désactiver la classe. La table ressemble donc à la suivante :

           LABEL                 ReqType       ReqParam1   ReqParam2        
1         Concentration    SKILL            1                   6
2         Discipline            SKILL            3                  4
3         Tumble               SKILL            21                4
4         PowerAtk           FEAT             28                 ****
5         LightngRef         FEAT             24                 ****
6         IronWill              FEAT             22                 ****
7         Fighter               CLASSOR      4                   ****
8         Cleric                 CLASSOR       2                  ****
9         Paladin              CLASSOR       6                  ****
10       Monk                 CLASSOR       5                   ****
11       ScriptVar            VAR               AllowSlayer   0



Etape 4 : Déterminer les compétences de classes

Copiez un fichier cls_skill_xxxx.2da et renommez-le du nom que vous avez indiqué dans le fichier classes.2da à la colonne SkillsTable. Ouvrez-le au bloc-note.

SkillLabel correspond au "label" de la compétence dans le fichier skills.2da et SkillIndex à son numéro de ligne dans le dit fichier. En fait, la seule chose que vous avez à faire ici est, pour chaque compétence, de mettre un 1 dans la colonne ClassSkill quand vous voulez que celle-ci soit une compétence de classe et 0 dans le cas contraire.

Ceci fait, sauvegardez le fichier.

Par exemple, je voulais que le chasseur nocturne possède les compétences de classe suivantes : concentration, discipline, premiers soins (heal), listen (perception auditive), savoir (lore), parade (parry), utilisation d'objets magique (usemagicdevice), acrobatie (tumble), fabrication d'armure (craft_armor) et fabrication d'armes (craft_wepon). J'ai donc fait passer la valeur du chiffre dans la colonne ClassSkill à 1 pour ses compétences, et je l'ai mise à 0 pour les autres.


Etape 5 : Déterminer les dons de classes et les dons épiques

Copiez un fichier cls_feat_xxxx.2da et renommez-le du nom que vous avez indiqué dans le fichier classes.2da à la colonne FeatsTable. Ouvrez-le au bloc-note, enlevez les lignes existantes de la classe d'origine du fichier, et commencez une nouvelle ligne.

FeatLabel correspond au "label" du don désiré dans le fichier classes.2da et FeatIndex à son numéro de ligne dans le dit fichier.

List admet les valeurs 0,1, 2 ou 3 uniquement. Voici à quoi ses valeurs correspondent :

0 : autorise seulement un don qui ne les pas forcément de base pour cette classe. Seuls combat à deux armes, parade de projectiles, ambidextrie, puissance divine, bouclier divin, les dons de métamagie et les dons du type école supérieure, école renforcée, etc., sont concernées.

1 : permet de faire une liste de dons n'apparaissant qu'aux niveaux spécifiés par le cls_bfeat_xxx.éda, à la manière des dons bonus du magicien ou du guerrier (ou encore des talents supplémentaires de l'explorateur, dans le LPP). Les dons épiques entre aussi dans cette catégorie.

2 : concerne les dons liés à un masterfeat, mettre 2 vous permet de donner un masterfeat (exemple : arme de choix du mda, ennemis jurés du rôdeurs, etc.) à votre classe de prestige à un niveau choisi ou simplment de donner accès aux dons sous ce masterfeat exemple : ecole renforcé).

3 : pour spécifier que le personnage obtiendra automatiquement tel don à tel niveau.

Pour les dons mis en liste 3, vous devrez indiquer le niveau auquel le don est gagné dans la colonne GrantedOnLevel.
Pour les dons de la catégorie 2, vous devrez indiquer le niveau auquel le masterfeat est gagné dans la colonne GrantedOnLevel dans la colonne GrantedAtLevel vous aurez alors le "masterfeat" à ce niveau (il faut mettre au moins 1 au même niveau dans le cls_bfeat_xxxx.2da pour que cela marche) ou si vous souhaitez seulment donné accès aux dons du masterfeat, mettez -1 dans cette colonne.
Pour les dons des catégories 0 et 1, mettez la valeur -1 dans cette colonne.

Enfin, vous devrez mettre la valeur du OnMenu à 1 pour les dons reproduisant le même effet qu'un sort (c'est-à-dire qui peut être lancé à partir du menu), comme l'apposition des mains du paladin par exemple. Dans tout autre cas, mettez la valeur du OnMenu à 0.

Il faut savoir que certains dons ne marcheront pas avec toutes les classes, car codées directement dans l'exécutable. Par exemple,  les dons "ennemis jurés" ne marchent que pour le rôdeur et l'éclaireur ménestrel, le don "compagnon animal" ne marche que pour le druide et le rôdeur et le don "bonus du moine à la CA" ne marche que pour le moine. En revanche, les dons "sérénité" et "perfection de l'être", qu'on pourrait croire réservés au moine, marche avec toutes les classes. Il n'y a donc pas de véritables règles et donc aucun secret : il faut tester et restester encore, pour déterminer ce qui marche et ce qui ne marche pas.

Une fois terminé, sauvegardez le fichier.

Concernant le chasseur nocturne, tous les dons annoncés dans la description de la classe sont donc mis en liste 3. Les dons épiques sont eux mis en liste 1, comme toujours.


Etape 6 : Déterminer la fréquence d'obtention des dons bonus et épiques

Copiez un fichier cls_bfeat_xxxx.2da et renommez-le du nom que vous avez indiqué dans le fichier classes.2da à la colonne BonusFeatsTable. Ouvrez-le au bloc-note.

Il vous faut d'abord réalisser que la ligne 0 correspond au niveau 1, que la ligne 1 correspond au niveau 2, etc. Pour chaque niveau, mettez 1 à la colonne Bonus si vous voulez que le personnage puisse choisir en atteignant celui-ci un don parmi ceux mis en liste 1 ou 2 dans le fichier cls_feat_xxxx.2da (voir l'étape précédente de ce tutorial), ou 0 dans le cas contraire.

A partir de la ligne 10 (et donc du niveau 11), vous devez mettre la valeur 1 à la colonne Bonus chaque fois que vous souhaitez donner un don épique au personnage.

Ceci fait, sauvegardez le fichier.

Pour le chasseur nocturne, j'ai donc mis 0 partout sauf aux lignes 12, 15, 18, 21, 24, 27, 30, 33, 36 et 39, afin que le personnage gagne un don épique tous les 3 niveaux.


Etape 7 : Donner une utilité aux dons étiquettes

L'étape qui suit ne concerne que ceux qui veulent faire des classes avec des dons étiquettes qui finalement servent à quelques choses. C'est assez compliqué et cela demande de savoir scripter un minimum. On est donc à un niveau de difficulté tout autre.

Prenons l'exemple du chasseur nocturne : chasseur de morts-vivants, immunité contre la paralysie, immunité contre le charme et la domination, immunités contre l'absorption d'énergie, immunité contre la magie de mort, immunité contre les sorts mentaux... tous ces dons ne sont que de banales étiquettes en fin de compte. Ils ne servent qu'à faire beau, et les pouvoirs du chasseur nocturne sont en fait complètement scriptés en dur dans le module. Le script est le suivant :

Code:


//Chasseur nocturne
if (GetLevelByClass(CLASS_TYPE_SLAYER,oPC) >= 1)
  {
  if (GetLocalInt(oPC,"lev_sla")==0)
   {
    SetLocalInt(oPC,"lev_sla",1);
    //Chasseur de morts-vivants, bonus de +2 
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(VersusRacialTypeEffect(EffectAttackIncrease(2),RACIAL_TYPE_UNDEAD)),oPC,0.0f);
   }
  }
if (GetLevelByClass(CLASS_TYPE_SLAYER,oPC) >= 3)
  {
  if (GetLocalInt(oPC,"lev_sla")==1)
   {
    SetLocalInt(oPC,"lev_sla",3);
    //Immunité contre la paralysie 
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectImmunity(IMMUNITY_TYPE_PARALYSIS)),oPC,0.0f);
   }
  }
if (GetLevelByClass(CLASS_TYPE_SLAYER,oPC) >= 4)
  {
  if (GetLocalInt(oPC,"lev_sla")==3)
   {
   SetLocalInt(oPC,"lev_sla",4);
    //Immunité contre la domination
   ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectImmunity(IMMUNITY_TYPE_DOMINATE)),oPC,0.0f);
    //Immunité contre les sorts de charme
   ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectImmunity(IMMUNITY_TYPE_CHARM)),oPC,0.0f);
   }
  }
if (GetLevelByClass(CLASS_TYPE_SLAYER,oPC) >= 5)
  {
  if (GetLocalInt(oPC,"lev_sla")==4)
   {
    SetLocalInt(oPC,"lev_sla",5);
    //Chasseur de morts-vivants, bonus de +3 
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(VersusRacialTypeEffect(EffectAttackIncrease(3),RACIAL_TYPE_UNDEAD)),oPC,0.0f);
   }
  }
if (GetLevelByClass(CLASS_TYPE_SLAYER,oPC) >= 6)
  {
  if (GetLocalInt(oPC,"lev_sla")==5)
   {
    SetLocalInt(oPC,"lev_sla",6);
    //Immunité contre l'absorption de caractéristiques 
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectImmunity(IMMUNITY_TYPE_ABILITY_DECREASE)),oPC,0.0f);
    //Immunité contre l'absorption de niveaux
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectImmunity(IMMUNITY_TYPE_NEGATIVE_LEVEL)),oPC,0.0f);
   }
  }
if (GetLevelByClass(CLASS_TYPE_SLAYER,oPC) >=  8)
  {
  if (GetLocalInt(oPC,"lev_sla")==6)
   {
    SetLocalInt(oPC,"lev_sla", 8) ;
    //Immunité contre la magie de mort
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectImmunity(IMMUNITY_TYPE_DEATH)),oPC,0.0f);
   }
  }
if (GetLevelByClass(CLASS_TYPE_SLAYER,oPC) >= 9)
  {
  if (GetLocalInt(oPC,"lev_sla")== 8)
   {
    SetLocalInt(oPC,"lev_sla",9);
    //Immunité contre la peur
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectImmunity(IMMUNITY_TYPE_FEAR)),oPC,0.0f);
   //Immunité contre les sorts mentaux 
   ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectImmunity(IMMUNITY_TYPE_MIND_SPELLS)),oPC,0.0f);
   }
  }
if (GetLevelByClass(CLASS_TYPE_SLAYER,oPC) >= 10)
  {
  if (GetLocalInt(oPC,"lev_sla")==9)
   {
    SetLocalInt(oPC,"lev_sla",10);
    //Chasseur de morts-vivants, bonus de +4 
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(VersusRacialTypeEffect(EffectAttackIncrease(4),RACIAL_TYPE_UNDEAD)),oPC,0.0f);
   }
  }



Bref, il vous faut donc dire "à tel niveau, le PJ gagne tel pouvoir" et scripter tout ça. Le script doit figurer dans l'évènement OnPlayerLevelUp de votre module, bien sur, mais aussi dans le OnModuleLoad et dans le OnPlayerRespawn afin de se prévenir de la disparition des pouvoirs suite à l'exportation/importation ou la mort du personnage.


Etape 8 : Modifier les sorts donnés en capacités de classe

C'est une chose qu'on oublie trop souvent, mais ce n'est pas tout de donner des dons reproduisant l'effet d'un sort à une classe si ceux-ci ne sont pas prévus pour prendre en compte la classe en question dans leur script. Ceci est également vrai pour des capacités comme "repousser les morts-vivants". Je vous conseille donc de regarder les scripts de ses sorts (allez dans l'éditeur de scripts, faites ouvrir et mettez le radio-bouton des ressources sur "toutes les ressources") et de les modifier si besoin est. Ceci fait, il vous faudra récupérer les fichiers des scripts des sorts. Mais attention : il vous faut exporter aussi bien la version "texte" du sort (fichier de type .nss) que la version compilée de celui-ci (fichier de type .ncs). La méthode la plus courante pour se faire est encore d'exporter le sort à l'aide de l'éditeur Aurora en format .erf, puis d'extraire les deux fichiers désirés du .erf grâce au NWN Explorer.

Par exemple, pour le chasseur nocturne, j'ai dû éditer les scripts codant pour les sorts/capacités "repousser les morts-vivants" (nw_s2_turndead), "banissement" (x0_s0_banishment) et "puissance divine" (nw_s0_divpower, pour le don "puissance ancestrale"), afin de modifier respectivement les bouts de codes suivants :

Code:

int nClericLevel = GetLevelByClass(CLASS_TYPE_CLERIC);
int nPaladinLevel = GetLevelByClass(CLASS_TYPE_PALADIN);
int nBlackguardlevel = GetLevelByClass(CLASS_TYPE_BLACKGUARD);

int nSlayerLevel = GetLevelByClass(CLASS_TYPE_SLAYER);
int nTotalLevel =  GetHitDice(OBJECT_SELF);

int nTurnLevel = nClericLevel+nSlayerLevel;
int nClassLevel = nClericLevel+nSlayerLevel;


Code:

int nPool = 2* (GetCasterLevel(OBJECT_SELF)+GetLevelByClass(CLASS_TYPE_SLAYER));


Code:

int nStrengthIncrease;
    if (GetLevelByClass(CLASS_TYPE_SLAYER,OBJECT_SELF) >= 1)
    {
    nStrengthIncrease = (nStr - 20) * -1;
    }
    else
    {
    nStrengthIncrease = (nStr - 18) * -1;
    }


Etape 9 : Créer le hak et le lier au module

Les précédentes étapes ayant été accomplies, mettez les fichiers classes.2da, package.2da, feats.2da (si vous avez créé de nouveaux dons), les nouveaux fichiers cls_xxxx_xxxx.2da et les fichiers .nss et .ncs (si vous êtes passé par les étapes 7 et/ou 8 de ce tutorial) dans un hak.

Ouvrez ensuite votre module, allez dans "propriétés du module", puis dans l'onglet "contenu personnalisé". Il ne vous reste désormais plus qu'à lier votre hak et votre fichier TLK au module, et à sauvegarder le tout.


Voilà, j'ai terminé... enfin... Si un point ne vous parait pas clair, n'hésitez pas à le signaler.
_________________
Léviathan, ancien Grand Prêtre du Clergé de Niter
Les MJ ne sont ni sadiques ni cruels, ce sont juste des artistes incompris.
Revenir en haut
Visiter le site web du posteur MSN
Publicité






MessagePosté le: Sam 26 Jan - 17:59 (2008)    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    L'antre du Léviathan Index du Forum -> Archives -> Créations Neverwinter Nights Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  

Index | Panneau d’administration | Creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com