Présentation du mod
A la base, je voulais avoir une manière très simple de répartir des objets n'importe où dans le jeu, sans devoir coder.
Par exemple, indiquer d'ajouter un objet dans l'inventaire de telle créature, dans tel conteneur ou dans l'inventaire de tel marchand. Très simple à faire en Weidu, mais nécessite du code.
A force d'y réfléchir, les idées se sont empilées, pour en arriver à quelque chose de bien plus complet, qui ressemble à plusieurs égards à ItemRandomiser pour la partie aléatoire, tout en y ajoutant diverses features et automatismes.
L'idée de base est simple, toute la répartition doit se réaliser à partir d'un simple fichier 2da.
Ensuite, n'importe quel mod peut venir se greffer et de proposer ses propres répartitions et configurations, elles seront jouées au moment de l'installation d'ItemDispatcher.
Pour une répartition simpliste, il n'y a rien de vraiment particulier, si [ItemA] existe, il est placé à l'endroit [TargetA] s'il existe également.
On va donc un peu plus loin, et on se dit qu'on voudrait déplacer un objet provenant d'une source bien précise, pour le répartir ailleurs, en le supprimant de sa source, ou le remplaçant à sa source par autre chose.
Encore plus loin, on voudrait que l'objet n'apparaisse dans [Target] qu'à partir d'un certain chapitre, d'un certain niveau d'expérience du joueur, qu'il ne soit réparti que sur des créatures d'un palier, d'une race et/ou d'une classe précise, uniquement pour récompenser les joueurs qui jouent dans une certaine difficulté, que l'objet soit équipé ou non sur [Target] si c'est une créature, qu'il ne soit équipé que si la créature peut le porter, qu'on puisse répartir un objet parmi une [Target] appartenant à un groupe défini, que l'objet n'apparaissent qu'à certaines périodes de la journée, etc.
Et là on se rend compte que d'une simple idée, on peut faire un outil vraiment sympa, complet et puissant.
Et je le rappelle, le tout sans devoir coder la moindre ligne de code Weidu, simplement en remplissant quelques tableaux de données.
Bien que je vais être obligée de créer des scripts qui s'exécuterons en jeu pour la majorité des fonctionnalités plus avancée, il faudra tout de même réinstaller le mod pour avoir une répartition différente.
Il y aura cependant de petites variantes. Par exemple, si le système veut donner 2 objets différents à une créature, ces 2 objets pourront apparaitre aléatoirement d'une partie à l'autre.
J'ai aussi trouvé comment faire pour donner un objet à une créature bien précise d'une carte, même si elle est présente en plusieurs exemplaires sur cette carte, seule l'une d'entre-elles sera concernée.
Bien, maintenant passons au cœur du sujet, je vais lister toutes les options possibles, et donner quelques exemples de ce qui est prévu.
Désolée, ça va être un peu long ! Mais n'hésitez pas si vous avez des critiques ou suggestions.
Les options
L'objet
Le nom du fichier de l'objet à répartir (sans le .itm), c'est la seule option qui sera obligatoire.
Ex: sw1h01
L'objet pourra aussi faire référence à un trésor aléatoire qui sera affecté au moment de la création de la créature par le jeu. Attention, si l'objet doit être équipé, il faudra que l'ensemble des objets de la liste appartiennent au même emplacement d'équipement (le mod effectuera la vérification).
Il n'y aura pas de changement dans l'écriture de l'objet dans le fichier 2da, le jeu gère ce genre de cas comme un objet classique.
La cible
C'est l'endroit où l'on défini où sera réparti l'objet. C'est l'option la plus complexe, il y aura beaucoup de possibilités, voici de manière exhaustive ce qui est prévu.
Description de la cible | Exemple | Code |
Une créature spécifique | Sur un squelette | skelet01.cre |
Une créature aléatoire | Sur une créature aléatoire | ?.cre |
Une créature aléatoire d'une certaine race | Sur une créature aléatoire de race naine | dwarf.rce |
Une créature aléatoire d'une certaine classe | Sur une créature aléatoire de classe mage | mage.cls |
Une créature aléatoire d'une certain kit | Sur une créature aléatoire possédant le kit de Kensai | kensai.kit |
Une créature aléatoire d'une certain alignement | Sur une créature loyale mauvaise aléatoire | lawful_evil.alg |
Une créature aléatoire d'un certain type (humanoïde, animal, mort-vivant, etc.) | Sur une créature aléatoire de type mort-vivant | undead.gen |
Une créature aléatoire d'un certain genre | Sur une créature aléatoire du genre féminin | female.gnd |
Une créature aléatoire de niveau 3 | Sur une créature aléatoire de niveau 3 | 3.lvl |
Une créature aléatoire de niveau 3 et plus | Sur une créature aléatoire de niveau 3 et plus | +3.lvl |
Une créature aléatoire de niveau 3 et moins | Sur une créature aléatoire de niveau 3 et moins | -3.lvl |
Une créature aléatoire de niveau 3 à 6 | Sur une créature aléatoire de niveau 3 à 6 | 3-6.lvl |
Un magasin spécifique | Dans le magasin de Ribald | ribald3.sto |
Un magasin aléatoire | Dans un magasin aléatoire | ?.sto |
Un conteneur aléatoire | Dans un conteneur aléatoire | ?.cnt |
Un conteneur spécifique (nécessite que l'option "zone" soit défini) | Dans le conteneur numéro 2 de la carte où il se trouve | 2.cnt |
Un groupe | Sur une créature, un magasin ou un conteneur aléatoire appartenant au groupe | mongroupe.grp |
Une zone | Sur une créature, un magasin ou un conteneur aléatoire du donjon d'Irenicus | ar0602.are |
Avec tout cela, on peut déjà faire pas mal de choses, mais ce n'est pas tout ! Car à cela, viennent s'ajouter les combinaisons et les quantités !
Les combinaisons
C'est ici qu'on peut commencer à vraiment s'amuser, il sera possible de combiner la plupart des notations de cible. Pour se faire, il suffit de les séparer avec le caractère "|". Vous pourrez les noter dans n'importe quel ordre, seule la quantité devra impérativement se trouver en début de cahîne.
Que diriez-vous de pouvoir répartir votre objet sur 3 nains d'alignement mauvais d'une zone précise ?
Cela se traduira par ce bout de code
3#dwarf.rce|male.gnd|evil.alg|ar0602.are
Si nous décomposons, nous obtenons
3# : 3 cibles aléatoires
dwarf.rce : De race naine
male.gnd : De genre masculin
evil.alg : D'alignement mauvais (loyal, neutre ou chaotique)
ar0602.are : Dans le donjon d'Irenicus
La quantité
Par défaut, un seule cible par ligne aura l'objet réparti sur elle.
Pour étendre les possibilités, on peut donc définir la quantité de cibles sur lesquels répartir l'objet. 4 possibilités sont offertes, toutes les cibles, un nombre de cible bien précis, un nombre aléatoire de cibles, un pourcentage de cibles.
Cette notion de quantité est valable pour toutes les cibles où une part d'aléatoire est présente. Voici quelques exemples.
Exemple | Code |
1 cible aléatoire | - |
Toutes les cibles | * |
1 cible aléatoire | 1 |
2 cibles aléatoires | 2 |
Entre 2 et 6 cibles aléatoires | 2-6 |
20% des cibles | 20% |
La source de l'objet
Si aucune source n'est définie, le mod se contentera d'ajouter une nouvelle occurrence de l'objet dans le jeu. Mais ce comportement ne sera pas toujours voulu, parfois, on veut qu'un objet unique le reste, ou qu'il n'ai pas trop d'exemplaires dans la nature. Il y a aussi le cas des mods d'objets qui centralisent tous dans un seul et unique magasin. Généralement, car c'est plus facile à faire, il y a moins de problèmes de compatibilité, ou d'autres raisons.
C'est là que la source intervient, si elle est définie, l'objet ne sera plus simplement ajouté, mais il sera retiré de sa source. Si l'objet ne serait plus présent à sa source au moment où le mod se charge de lui, alors il sera simplement ignoré.
Tout comme la cible, la source pourra avoir une part d'aléatoire. Bien qu'il serait techniquement possible d'offrir toutes les possibilités, et combinaisons de la cible, je ne pense pas proposer cela. L'intérêt est bien moindre, de fait, il n'y aura pas de combinaison ni de quantité, mais une notation simplifiée qui permettra le principal.
Description de la source | Exemple | Code |
Une créature spécifique | Répartir l'objet du squelette | skelet01.cre |
Une créature aléatoire | Répartir l'objet d'une créature aléatoire | ?.cre |
Toutes les créatures | Répartir l'objet de toutes les créatures qui le possèdent | *.cre |
Un magasin spécifique | Répartir l'objet du magasin de Ribald | ribald3.sto |
Un magasin aléatoire | Répartir l'objet d'un magasin aléatoire | ?.sto |
Tous les magasins | Répartir l'objet de tous les magasins | *.sto |
Le nombre d'objets
Simplement définir le nombre de fois où l'objets sera ajouté à la cible, en tenant compte du nombre d'objets possible par pile.
Par exemple, il sera possible d'ajouter 20 flèches (1 pile), mais attention, si vous définissez 20 pour une épée, elle sera ajouté 20 fois dans l'inventaire de la créature. En fait, 20 maximum, dépendant de la place qu'il lui reste.
Il sera également possible de définir un nombre aléatoire d'objets
Exemple | Code |
1 objet | - |
1 objet | 1 |
2 objets | 2 |
Entre 0 et 5 objets | 0-5 |
Entre 7 et 40 objets | 7-40 |
Le chapitre
Cette option va permettre de définir à quel chapitre l'objet pourra apparaitre. Cela pourra aller d'un chapitre fixe, un chapitre minimum et/ou un chapitre maximum.
Du fait de sa nature, ce genre de répartition passera obligatoirement par un script, qui vérifiera le chapitre en cours pour savoir si l'objet sera présent ou non sur la cible.
Les chapitres iront du 1 au 22, qui correspond à la numérotation des chapitres de EET.
Exemple | Code |
Un objet présent à n'importe quel chapitre | - |
Un objet présent qu'au chapitre 3 | 3 |
Un objet présent à partir du chapitre 3 | 3+ |
Un objet présent jusqu'au chapitre 3 (inclus) | 3- |
Un objet présent du chapitre 3 au chapitre 5 | 3-5 |
La difficulté
Cette option permettra de répartir un objet, uniquement si le joueur est dans une difficulté précise. Vous voulez récompenser les joueurs qui se cassent la tête à vaincre vos monstres en difficulté maximale ? Vous voulez donner un coup de pouce à ceux qui préfèrent se focaliser sur l'histoire en jouant en difficulté minimale ? Ce sera possible !
Les valeurs possibles vont de 1 à 5 et correspondent, par défaut, aux niveaux de difficultés suivants :
1 - Facile
2 - Normal
3 - Règle de base
4 - Difficile
5 - Très difficile
Exemple | Code |
Uniquement en difficulté de base | - |
Uniquement en difficulté de base | 3 |
En difficile ou plus | 4+ |
En normal ou moins | 2- |
Entre la difficulté normale et difficile | 2-4 |
Le palier
Remplacé par le concept des groupes. Création de groupes correspondant à divers paliers si nécessaire
Cette option n'est pas obligatoire, mais il sera plus que conseillé de la renseigner, afin d'éviter de déséquilibrer le jeu.
Sans elle, il serait possible que la répartition choisisse de donner un objet +5 sur un simple Gobelin, de le place dans une caisse de ChateauSuif, ou encore de placer un épée rouillée sur le Démogorgon.
Pour répondre à ce problème, le concept de palier entre en jeu. Il tente d'estimer la puissance relative d'un objet, et d'une cible. Malheureusement, ce concept est part nature assez subjectif, j'imagine qu'il y aura pas mal de modifications dans ces listes pour avoir un équilibrage intéressant.
Le mod aura donc diverses listes pour définir le palier d'un objet, d'un magasin, d'un conteneur ou d'un groupe.
Ces listes pourront être agrémentées par d'autres mods, principalement pour gérer les paliers de leurs propres objets et cibles.
Pour tous les objets et créatures pour lesquels aucun palier n'a été défini, le mod va leur en affecter un par défaut.
Je ne sais pas encore précisément quels calculs seront effectués, mais l'idée est de se baser sur le niveau d'enchantement pour les objets, et le niveau (total d'expérience) pour les créatures, en appliquant un nombre aléatoire pour augmenter ou diminuer de 2 (valeur arbitraire non fixée) le palier calculé.
Le nombre de paliers n'est pas encore arrêté, j'avais pensé à 1 palier par chapitre. C'est simple et donne une bonne idée au moddeur pour savoir environ à quel niveau le joueur se trouve.
Exemple | Code |
Aux cibles de n'importe quel palier | - |
Aux cibles de palier 5 | 5 |
Aux cibles de palier 6 et plus | 6+ |
Aux cibles de palier 6 et moins | 6- |
Aux cibles de palier 3 et 9 | 3-9 |
Equiper
Cette option n'est valable que si la cible est une créature, elle indique si l'objet doit être équipé ou simplement ajouté dans l'inventaire.
Attention, si cette option est activée, seules les créatures pouvant porter l'objet seront sélectionnées.
Aussi, si le slot de la créature est déjà occupé par un objet, le mod s'assurera de remplacer l'objet par un autre de même type.
Exemple | Code |
Ne sera pas équipé | - |
Ne sera pas équipé | 0 |
Sera équipé | 1 |
L'objet sera aléatoirement équipé ou non | ? |
Voler
Simplement indiquer si l'objet peut être volé ou non. Rien de spécial à ajouter ici.
Exemple | Code |
Ne peut pas être volé | - |
Ne peut pas être volé | 0 |
Peut être volé | 1 |
L'objet peut aléatoirement être volé ou non | ? |
La chance
Une option qui indique la chance que la ligne soit prise en compte, rien de plus, rien de moins. Elle acceptera une valeur allant de 1 à 100.
Les trésors aléatoires
Le jeu possède déjà des objets spéciaux qui, lorsqu'ils sont assignés à une créature, vont générer un objet aléatoire. C'est par exemple utilisé pour les loots aléatoires de pierre précieuse.
ItemDispatcher utilisera cette feature.
Pour se faire, les moddeurs pourront créer des listes de trésors aléatoires dans le dossier dispatching/treasures/xxx.2da.
Attention, le nom de ces fichiers sera limité à 8 caractères ! Car c'est ce nom qui sera utilisé pour affecter l'item en jeu.
Ces listes permettront d'une partie à l'autre, et même au sein d'une même partie, de trouver des objets différents sur des créatures identiques.
Si vous créez une liste de trésors aléatoires, le mod créera automatiquement un fichier .itm correspondant, qu'il sera possible d'exploiter dans la répartition comme n'importe quel autre objet. De fait, vous pourrez aussi étendre les listes de trésors aléatoires déjà existantes en jeu, ou créées par d'autres mods.
Ce genre de liste pourra avoir plusieurs cas d'usages, quelques exemples
- Le moddeur a créé plein d'objets puissants qu'il ne voudrait pas voir apparaitre plusieurs fois dans le jeu, mais ne sait pas lequel donner à sa créature. Une petite liste et le tour est joué, son boss donnera un objet différent à chaque partie.
- Le moddeur a créé plein d'objets qui peuvent se retrouver sans problème en plusieurs exemplaires sur diverses créatures, une nouvelle liste !
C'est une alternative simple pour différentier les objets trouvés sans réinstaller, mais il faut faire attention, car mal utilisé, cela pourrait dupliquer des objets censés être uniques.
Les groupes
Les groupes permettent de regrouper, de manière totalement subjective, différents éléments dans une même "catégorie" qu'il n'est pas possible de réaliser avec les données du jeu.
Ils ne sont pas limités en nombre, les plus génériques seront disponibles par défaut, permettant aux mods d'avoir une base commune pour y insérer leurs objets, créatures, magasins ou autre. (les groupes qui se subsistueraient à la notion de palier pourraient en faire partie). Mais les moddeurs seront libre de créer les leurs et utiliser ceux d'un autre mod.
Les groupes pourront être utilisés autant pour filtrer la cible, que pour définir les objets à répartir. Leur nom est totalement libre.
Pour chaque élément dans un groupe, l'extension sera obligatoire, du fait que plusieurs types d'éléments pourront y cohabiter.
Si 2 mods différents utilisent le même nom de groupe, les entrées seront alors fusionnées.
Si une règle de répartition utilise un groupe qui n'existe pas, elle sera ignorée.
Il y aura 2 types de groupes, les groupes de cibles et les groupes d'objets.
Les groupes de cibles
Lorsqu'un groupe est utilisé en tant que cible, il agira comme un filtre. Toutes les cibles qui correspondent à l'une des entrées du groupe seront éligibles pour recevoir l'objet, ce qui équivaux à un OR.
Les groupes de d'objets
Ce type de groupe permettra de répartir aléatoirement divers objets aux cibles.
Si par exemple vous avez un groupe d'objet avec 3 épées différentes, sw1h01.itm, sw1h02.itm et sw1h03.itm, pour chaque cible trouvée, le mod sélectionnera aléatoirement l'un des objets du groupe.
Attention, c'est différent des trésors aléatoires ! Ici, l'objet sera affecté aléatoirement au moment de l'installation. Tandis que l'objet aléatoire le sera en jeu au moment de la création de la créature.
Quelques exemples
Vous désirez regrouper tous les "boss" du jeu, créez alors un groupe boss.grp dans lequel vous insèrerez les créatures considérées comme des boss (ex: irenicus.cre)
Vous désirez regrouper tout ce qui est relatif au culte de l'Oeil Aveugle ? Créatures, marchands, conteneurs, alors créez un groupe oeil_aveugle.grp et insérez-y les éléments voulus.
Vous désirez regrouper les créatures de race elfes et demi-elfes ? Un groupe all_elf.grp contenant les entrées elf.rce et half_elf.rce comblera votre désir.
Un groupe pourra également contenir une entrée correspondant à un autre groupe ! Permettant de gérer des filtres assez finement.
Reprenons l'exemple du culte de l'Oeil Aveugle, tel que l'exemple a été réalisé, le groupe contient tout, de manière mélangée. Vous pourriez effectuer un découpage, afin de parfois vous limiter aux créatures de l'Oeil Aveugle, et parfois vous limiter aux conteneurs.
Nous aurions donc un fichier oeil_aveugle_cre.grp contenant la liste des créatures, un autre oeil_aveugle_cnt.2da contenant la liste des conteneurs et enfin, le fichier oeil_aveugle.grp qui contiendra en entrées le nom des 2 groupes précédemment créés.
Dans ce cas, nous aurions pu facilement créer le filtre directement avec une combinaison entre oeil_aveugle.grp et ?.cre, mais il fallait bien un petit exemple
Comment définir un groupe ?
Chaque groupe aura son propre fichier .2da, qui devra se trouver dans le dossier dsipatching/groups. Il ne contiendra qu'une seule colonne décrivrant la cible. Si d'autres données sont renseignées, elles seront considérées comme de simples commentaires.
La cible peut être n'importe qu'elle cible valide, une combinaison, un autre groupe. Pour ces dernières, une protection contre les références circulaires devra être codée pour éviter les boucles infinies.
all_elf.2da
Code : Tout sélectionner
elf.rce
half_elf.rce
Code : Tout sélectionner
chapter1boss.grp
chapter2boss.grp
monboss.cre # Un gros dur à cuire qui a une chance d'apparaitre sur n'importe quelle carte
dragon.rce&evil.alg # Commentaire : Parce que les dragons mauvais sont trop forts !
C'est très simple, il lui suffira de créer un dossier "dispatching", et dans ce dossier, créer le fichier items.2da, les groupes et/ou les listes de trésors aléatoires.
L'arborescence ressemblerait à ceci
Code : Tout sélectionner
dispatching
|_ items.2da
|_ groups
|_ boss.2da
|_ all_elf.2da
|_ ...
|_ treasures
|_ gems.2da
|_ bigswords.2da
|_ ...
Si le mod ajoute de nouveaux boss, l'auteur pourrait décider de les ajouter dans la liste des boss déjà existantes. Pour se faire, il n'a qu'à créer le fichier groups/all_boss.2da, et de lister ses cibles.
Quelques règles générales
- Le mod tentera le plus possible d'éviter qu'une même cible soit sélectionnée pendant la répartition. Cependant, s'il n'y a pas assez de cible, que plusieurs mods cibles spécifiquement la même créature et qu'une créature est sélectionnée plus d'une fois pour un objet à équiper sur le même emplacement, une liste de trésors aléatoire sera automatiquement créée et affectée à la créature. L'objet sera alors déterminé aléatoirement durant la partie.
- Le mod ne répartira pas, ni ne déplacera un objet qu'il aura lui-même ajouté sur une cible.
- Pour un magasin, l'objet n'y sera ajouté que si le magasin accepte ce type d'objet
- Un objet ne sera ajouté dans l'inventaire d'une créature, que s'il reste au moins 1 place. S'il ne reste plus de place, la créature sera ignorée et une autre sera sélectionnée.
- Les créatures invoquées ne pourront pas être la cible d'une répartition
- Un fichier de log sera créé pour indiquer tous les changements effectués, à des fins de vérifications, mais aussi de spoil si l'utilisateur veut savoir où trouver tel objet.
Au final le fichier 2da de répartition pourrait ressembler à ceci
Code : Tout sélectionner
Objet Cible Source Nombre Chapitre Difficulte Palier Equiper Voler Chance
sw1h01 skelet01.cre - - - - - - - 50
sw1h01 ?.cre - - 2+ - 4 1 1 100