[WIP] ItemDispatcher
Posté : ven. 25 oct. 2024, 20:50
Attention ! Ce mod n'existe pas encore, c'est le résultat de ma réflexion sur ce que je compte réaliser.
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
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.
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 quantités
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. 3 possibilités sont offertes, toutes les cibles, un nombre de cible bien précis, un nombre aléatoire de cibles.
Pour définir une quantité, il suffit d'ajouter au tout début, la quantité désirée, suivie du caractère "#".
Cette notion de quantité est valable pour toutes les cibles où une part d'aléatoire est présente. Voici quelques exemples.
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 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.
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
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.
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
Le palier
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.
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.
Voler
Simplement indiquer si l'objet peut être volé ou non. Rien de spécial à ajouter ici.
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.
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 et qu'une créature est sélectionnée 2 fois pour un objet à équiper sur le même emplacement, l'objet équipé sera déterminé aléatoirement, tandis que le second ira dans l'inventaire.
- 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
Merci d'avoir lu tout ce pavé !
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
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 |
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 quantités
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. 3 possibilités sont offertes, toutes les cibles, un nombre de cible bien précis, un nombre aléatoire de cibles.
Pour définir une quantité, il suffit d'ajouter au tout début, la quantité désirée, suivie du caractère "#".
Cette notion de quantité est valable pour toutes les cibles où une part d'aléatoire est présente. Voici quelques exemples.
Exemple | Code |
Sur 2 créatures aléatoires | 2#?.cre |
Sur 3 magasins aléatoires | 3#?.sto |
Sur 5 cibles aléatoires appartenant à un groupe | 5#mongroupe.grp |
Sur toutes les créatures du genre féminin | *#female.gnd |
Sur 2 à 6 créatures de classe mage | 2-6#mage.cls |
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 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
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.
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 et qu'une créature est sélectionnée 2 fois pour un objet à équiper sur le même emplacement, l'objet équipé sera déterminé aléatoirement, tandis que le second ira dans l'inventaire.
- 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