Page 1 sur 2

[WIP] ItemDispatcher

Posté : ven. 25 oct. 2024, 20:50
par Selphira
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

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 cibleExempleCode
Une créature spécifiqueSur un squeletteskelet01.cre
Une créature aléatoireSur une créature aléatoire?.cre
Une créature aléatoire d'une certaine raceSur une créature aléatoire de race nainedwarf.rce
Une créature aléatoire d'une certaine classeSur une créature aléatoire de classe magemage.cls
Une créature aléatoire d'une certain kitSur une créature aléatoire possédant le kit de Kensaikensai.kit
Une créature aléatoire d'une certain alignementSur une créature loyale mauvaise aléatoirelawful_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-vivantundead.gen
Une créature aléatoire d'un certain genreSur une créature aléatoire du genre fémininfemale.gnd
Une créature aléatoire de niveau 3Sur une créature aléatoire de niveau 33.lvl
Une créature aléatoire de niveau 3 et plusSur une créature aléatoire de niveau 3 et plus+3.lvl
Une créature aléatoire de niveau 3 et moinsSur une créature aléatoire de niveau 3 et moins-3.lvl
Une créature aléatoire de niveau 3 à 6Sur une créature aléatoire de niveau 3 à 63-6.lvl
Un magasin spécifiqueDans le magasin de Ribaldribald3.sto
Un magasin aléatoireDans un magasin aléatoire?.sto
Un conteneur aléatoireDans 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 trouve2.cnt
Un groupeSur une créature, un magasin ou un conteneur aléatoire appartenant au groupemongroupe.grp
Une zoneSur une créature, un magasin ou un conteneur aléatoire du donjon d'Irenicusar0602.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.

ExempleCode
1 cible aléatoire-
Toutes les cibles*
1 cible aléatoire1
2 cibles aléatoires2
Entre 2 et 6 cibles aléatoires2-6
20% des cibles20%

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 sourceExempleCode
Une créature spécifiqueRépartir l'objet du squeletteskelet01.cre
Une créature aléatoireRépartir l'objet d'une créature aléatoire?.cre
Toutes les créaturesRépartir l'objet de toutes les créatures qui le possèdent*.cre
Un magasin spécifiqueRépartir l'objet du magasin de Ribaldribald3.sto
Un magasin aléatoireRépartir l'objet d'un magasin aléatoire?.sto
Tous les magasinsRé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

ExempleCode
1 objet-
1 objet1
2 objets2
Entre 0 et 5 objets0-5
Entre 7 et 40 objets7-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.

ExempleCode
Un objet présent à n'importe quel chapitre-
Un objet présent qu'au chapitre 33
Un objet présent à partir du chapitre 33+
Un objet présent jusqu'au chapitre 3 (inclus)3-
Un objet présent du chapitre 3 au chapitre 53-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

ExempleCode
Uniquement en difficulté de base-
Uniquement en difficulté de base3
En difficile ou plus4+
En normal ou moins2-
Entre la difficulté normale et difficile2-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.

ExempleCode
Aux cibles de n'importe quel palier-
Aux cibles de palier 55
Aux cibles de palier 6 et plus6+
Aux cibles de palier 6 et moins6-
Aux cibles de palier 3 et 93-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.

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

ExempleCode
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 :p

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
all_boss.2da

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 !
Comment un autre mod peut venir se greffer à la répartition ?

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
   |_ ...
Lors de l'installation, ItemDispatching scannera l'ensemble des mods présents, vérifiera si le dossier "dispatching" existe, et traitera les fichiers présents.

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    
Merci d'avoir lu tout ce pavé !

Re: [WIP] ItemDispatcher

Posté : ven. 25 oct. 2024, 21:04
par deratiseur
Chouette outil en prévision :)

Question : si on demande de mettre l'objet dans l'équipement d'une créature aléatoire, il pourrait donc être droppé si c'est une créature aléatoire ou volé (si on l'a accordé) si c'est une créature neutre. Mais comment savoir ? Par exemple, si je rajoute une casque sur une créature aléatoire, comment savoir s'il va aller sur un hobgobelin (drop) ou sur un prisonnier dans la prison ou un membre du conseil ?
Et si je veux qu'il ne puisse qu'être volé (tant qu'à ce que le jouer l'obtienne gratuitement, je préfère que ce soit par investissement dans mass points de compétence), comment assurer qu'il soit ajouté à une créature neutre ? Et comment je gère le niveau nécessaire pour voler sur ce personnage ?

Re: [WIP] ItemDispatcher

Posté : ven. 25 oct. 2024, 21:27
par Selphira
Justement, si c'est aléatoire, tu ne peux pas vraiment savoir.
Par contre, tu peux diriger l'aléatoire grâce aux divers filtres présents (classe, race, etc.), donc si tu veux que ton objet aille sur un Hobgobelin, qu'il soit archer, mage, garde d'élite, ou autre, alors utilise le filtre de race hobgobelin.rce.
Ces filtres, qui seront disponibles par défaut, seront générés à partir des fichiers .ids du jeu. Le nom à renseigner sera le contenu du fichier .ids en minuscule.

Il est certain que l'aléatoire total du genre un simple ?.cre pourra mener à des répartitions étranges et/ou inappropriées, mais c'est le jeu de l'aléatoire.

Pour la compétence de vol à la tire, je voulais aussi pouvoir jouer dessus, mais je n'ai pas trouvé grand qui permette de jouer dessus sur les créatures. Tout ce que j'ai pu trouver qui influence la difficulté, est que la compétence de vol à la tire de la cible est soustraite à la compétence du voleur. Mais rien qui ne soit directement lié à l'objet à voler.
Idem pour les marchands, il y a bien un pourcentage d'échec, mais il est lié au magasin, pas à un objet spécifique.
Si tu as d'autres informations sur le sujet, je suis preneuse !

Re: [WIP] ItemDispatcher

Posté : ven. 25 oct. 2024, 23:25
par loupgris
Donc si j'ai bien compris, si réinstallation il y a, l'avantage ici serait de contourner notamment la problématique d'item randomiser avant SCS.
C'est bien évidement intéressant, sachant qu'on peut cibler finement suivant divers critères.
L'aléatoire avec des variables OUI ! :good:

Re: [WIP] ItemDispatcher

Posté : sam. 26 oct. 2024, 12:25
par rivvers
C'est plutôt cool comme idée.

Je pense que rapidement on va te demander de pouvoir ajouter des négations dans les filtres, par exemple : !innocent.cls ou !ar0602.are
Qui offrirait je pense, des opportunités supplémentaires : *#!innocent.cls
Ou même simplement pour exclure une créature particulière.

L'usage du | est discutable, pourquoi ne pas avoir utilisé & ?

Des gens voudront pouvoir faire des or ou même des xor, ça peut vite ajouter de la complexité mais si on veut rajouter un objet à un elfe ou à un demi-elfe aléatoire : ?#(elf.rce|half_elf.rce)
À voir si c'est possible d'interpréter tout ça sans s'arracher les cheveux.

Pas de filtre prévu sur le niveau de la créature ?

Le palier me paraît être une fausse bonne idée. Trop subjectif et compliqué à maintenir. Si tu changes de méthode de calcul, tous les mods vont devoir revoir la valeur associée.
Je partirai plutôt sur trois colonnes comme chapitre/niveau de la créature/niveau du joueur (ou palier d'expérience ?). Ça fait moins rêver mais ça évitera bien des ennuis.


Pour le vol à la tire, il y a rien qui ne cible un objet spécifique (enfin si mais un objet non volable est non droppable également).
Cependant, on peut jouer sur le slot de l'objet. Pour rendre un objet involable, suffit par exemple de le mettre dans l'emplacement réservé aux bottes.
Pour cela, il faudrait pouvoir cibler précisément la position où ajouter l'objet.

Re: [WIP] ItemDispatcher

Posté : sam. 26 oct. 2024, 16:26
par jazira
Sympa comme idée. Ça me fait un peu penser à un bout du tout premier mod qu'on a réaliser avec un ami, Anton, sur DayZ mod (DayZRPVP, les vidéos des débuts de Laink et Terracid sur DayZ RP, ça vous dit quelque chose ? C'était notre serveur.). Une base de donnée de spawns de véhicules remplaçant l'originale par catégorie et par lieu ; militaire, militaire+, aviation militaire, aviation civil, civil terrestre ville, civil terrestre campagne, industrielle, ferme, côtier, randonnée, etc.

Bon courage. :)

Re: [WIP] ItemDispatcher

Posté : sam. 26 oct. 2024, 16:56
par vv221
rivvers a écrit : sam. 26 oct. 2024, 12:25 L'usage du | est discutable, pourquoi ne pas avoir utilisé & ?
"|" est le symbole typiquement utilisé en programmation pour signifier un "ou" logique. Là où au contraire "&" est plus généralement utilisé comme un "et" logique.

EDIT : Je viens de relire, et donc en fait je te rejoins là-dessus ;)

Re: [WIP] ItemDispatcher

Posté : sam. 26 oct. 2024, 18:58
par Selphira
rivvers a écrit : sam. 26 oct. 2024, 12:25 C'est plutôt cool comme idée.

Je pense que rapidement on va te demander de pouvoir ajouter des négations dans les filtres, par exemple : !innocent.cls ou !ar0602.are
Qui offrirait je pense, des opportunités supplémentaires : *#!innocent.cls
Ou même simplement pour exclure une créature particulière.

L'usage du | est discutable, pourquoi ne pas avoir utilisé & ?

Des gens voudront pouvoir faire des or ou même des xor, ça peut vite ajouter de la complexité mais si on veut rajouter un objet à un elfe ou à un demi-elfe aléatoire : ?#(elf.rce|half_elf.rce)
À voir si c'est possible d'interpréter tout ça sans s'arracher les cheveux.

Pas de filtre prévu sur le niveau de la créature ?

Le palier me paraît être une fausse bonne idée. Trop subjectif et compliqué à maintenir. Si tu changes de méthode de calcul, tous les mods vont devoir revoir la valeur associée.
Je partirai plutôt sur trois colonnes comme chapitre/niveau de la créature/niveau du joueur (ou palier d'expérience ?). Ça fait moins rêver mais ça évitera bien des ennuis.


Pour le vol à la tire, il y a rien qui ne cible un objet spécifique (enfin si mais un objet non volable est non droppable également).
Cependant, on peut jouer sur le slot de l'objet. Pour rendre un objet involable, suffit par exemple de le mettre dans l'emplacement réservé aux bottes.
Pour cela, il faudrait pouvoir cibler précisément la position où ajouter l'objet.
C'est vrai que l'utilisation du pipe au lieu du et commercial peut porter à confusion, c'est une bonne idée de le changer. Je voulais simplement un caractère de séparation, sans tenir compte de la logique. D'autant plus que si un jour le OU est implémenté, ce serait plus simple à comprendre. Mais pour le OU, j'ai autre chose à proposer, il y a quelques concepts que je n'ai pas expliqué, notamment celui des groupes, ce dernier devrait permettre de combler le manque de OU, mais cela restera un peu moins souple. Je mettrai à jour le sujet initial avec la description du concept des groupe, et ajouterai quelques nouvelles idées qui me sont venues entre-temps.

Comme tu l'as indiqué, l'interprétation de règles trop complexes peut s'avérer vraiment prise de tête. Je préfère, du moins dans un premier temps, éviter d'utiliser des parenthèses ainsi que le couple AND et OR.

Cette proposition de négation est très intéressante ! Nous pourrions facilement faire des chose comme "une créature de classe mage non humanoïde".
La négation agirait sur le segment qu'elle précèderait ".cre&mage.cls&!humanoid.gen"

Tu as raison pour le palier, c'est un concept que je trouve à la fois simple dans son fonctionnement, mais compliqué dans sa mise en œuvre.
L'une des problématiques que je voulais combler avec ce concept, est que pour un même niveau de créature, la créature peut être d'une difficulté très différente, notamment si cette créature est un boss.
Mais en y réfléchissant, le concept des groupes pourraient remplacer efficacement le concept de palier. On pourrait créer des groupes nommés "tier1" équivalent au palier 1, en y insérant les créatures concernées. Pour les boss, on pourrait en créer d'autres, par exemple un contenant les boss du chapitre 2, et si on veut ajouter un objet puissant à l'un d'eux, il suffirait par exemple d'écrire chapter2boss.grp. Et on pourrait évidemment combiner, 2 boss du chapitre 2 pourraient être d'un palier différent, et donc une petite combinaison du genre chapter2boss.grp&tier3 ne ciblerait que les boss du chapitre 2 considérés comme appartenant au palier 3.

Cependant, cela n'empêche pas non plus d'avoir un filtre basé sur le niveau (total pour le cas des multiclassés) de la créature.

Re: [WIP] ItemDispatcher

Posté : sam. 26 oct. 2024, 21:07
par rivvers
Ok, garder un cap simple pour commencer me paraît une très bonne idée.

Qu'entends-tu par groupe ? Pour moi c'est le specific mais je ne suis pas sûr.

Serait-il envisageable d'ajouter un % dans les quantités ?
30%#dwarf.cre
C'est un peu différent de la colonne chance. Car la ligne vise à chaque fois 30% des personnages plutôt que cibler tout le monde dans 30% des cas.


edit : pour info, pour le niveau du personnage, le moteur se base plutôt sur la moyenne du niveau des classes (arrondie au supérieur) plutôt que sur le cumul des niveaux.

Re: [WIP] ItemDispatcher

Posté : dim. 27 oct. 2024, 09:33
par loupgris
Avis personnel.
Pour la table de répartition des items, j'aurais surtout favorisé/classé les rencontres.
Je vais parler de BG 1 où j'ai fait de nombreux run ces derniers temps.
Les rencontres délicates (je suis sur SCS difficile, avec de nombreuses règles pour compliquer mes combats) :
-Le chaman des mines de Nashkel (SCS), cette canaille est capable d'envoyer des éclaires et est accompagné de gardes et de commandos (même au niveau 4-5) c'est une rencontre plus compliquée que Mulahey.
Pourtant, même avec la randomisation, il ne lâche toujours rien (a-t-il des emplacements ?).
-L'avatar que l'on rencontre sur le site de fouille, là où est l'idole. Il possède toujours qu'un simple casque dans son inventaire (même avec "randomiser").
-Icharyd (je vais vérifier avec la randomisation très bientôt), cela p-e une rencontre délicate s'il est poussé avec SCS, très décevant en butin.
-Le chevalier mort-vivant de flammevin (je vais vérifier très bientôt avec la randomisation, a-t-il des emplacements autres que l'armure brisée ?)
-Il a un mort-vivant dans Ulcaster, j'ai omis d'aller le voir (je vais y retourner), le loup d'Ulcaster sinon m'a randomisé dans son butin (cache plus loin) la cape +2, c'est correcte.
Edit : Mal-Kalen et son combattant squelette (il m'a sorti 32 pts de dégâts critiques sur mon combattant) ne file rien dommage (c'est un boss d'IR ?)
-Sil au phare ne file jamais rien, un peu dommage (pourtant elle a des emplacements).
-La forteresse gnoll, tomber sur le chef bien entouré à bas niveau, le chef ne semble pas "randomisé".

Après les combats difficiles de BG1 on les connaît, les lister et attribuer une note sur 10 ce n'est pas bien compliqué.
Je parle ici des rencontres délicates, Bassilus (SCS) avec son serviteur aérien qui tape comme un sourd, le déploiement des assassins avec SCS (durant les phases de voyage avec le mage à poil...), le camp des bandits (SCS appel à l'aide), le groupe de Drasus, Davaëorn, la rencontre finale, etc.

Bref outre la répartition des objets "classique" je comprends vos problématiques, pour les rencontres "épiques" une simple classification des rencontres (éventuellement avec ou sans SCS et ses composants particuliers) semble facile à mettre en place, non ?
En gros lister les meilleurs objets de BG1 et les attribuer aléatoirement à ces rencontres épiques (sans perdre d'objets en chemin).

Ce qui est intéressant en plus, c'est qu'avec Itemdispatcher, on est à deux doigts d'un mod d'augmentation de difficulté si les objets portés sont pris en compte dans les combats.

Re: [WIP] ItemDispatcher

Posté : dim. 27 oct. 2024, 11:04
par Selphira
Hello, j'ai mis à jour le sujet initial.

La section "L'objet" a un paragraphe supplémentaire, et j'ai rajouté les sections "Les groupes" et "Les trésors aléatoires".

C'est un peu décousu, mais je pense que les explications sont compréhensibles, et que vous pourrez vous faire une idée sur les possibilités offertes.

@rivvers Tes propositions sont encore une fois intéressantes. Je pense qu'il sera possible d'ajouter sans trop de problème le pourcentage au niveau de la quantité.

Pour ce qui est du niveau j'hésite à la manière de le réaliser. Une nouvelle colonne ou un filtre pour la cible ?
Je pencherais pour la seconde solution, afin que cela reste disponible dans les groupes. On aurait quelque chose comme ceci

Les créatures de niveau 3?.cre&3.lvl
Les créatures de niveau 3 et +?.cre&+3.lvl
Les créatures de niveau 3 et -?.cre&-3.lvl
Les créatures de niveau 3 à 6?.cre&3-6.lvl
Les dragons de niveau 10 à 15dragon.rce&10-15.lvl

Re: [WIP] ItemDispatcher

Posté : dim. 27 oct. 2024, 11:30
par loupgris
@Selphira
En poussant un peu dans le futur, avec l'aléatoire et une fois les "boss" identifiés avec les emplacements disponibles, cela pourrait même déboucher sur un mod de difficulté aléatoire.
Genre pour un combattant 1 ou 2 item :
150% pv
+4 Thac0
-4 CA
critique sur 18-20
50% RM
70% résistance à un élément
40% proc image
40% proc invis sup

En gros, tu pourrais presque déboucher sur un mod de difficulté aléatoire plus tard, non ?

Re: [WIP] ItemDispatcher

Posté : dim. 27 oct. 2024, 11:34
par deratiseur
loupgris a écrit : dim. 27 oct. 2024, 11:30 @Selphira
En poussant un peu dans le futur, avec l'aléatoire et une fois les "boss" identifiés avec les emplacements disponibles, cela pourrait même déboucher sur un mod de difficulté aléatoire.
Genre pour un combattant item :
150% pv
+4 Thac0
-4 CA
critique sur 18-20
50% RM
70% résistance à un élément
40% proc image
40% proc invis sup

En gros, tu pourrais presque déboucher sur un mod de difficulté aléatoire plus tard, non ?
Oui, Si l'aléatoire peut se limiter aux créatures ennemies. Parce-que si ça l'aléa donne l'objet à un pnj recrutable.....

Re: [WIP] ItemDispatcher

Posté : dim. 27 oct. 2024, 11:47
par Selphira
deratiseur a écrit : dim. 27 oct. 2024, 11:34
loupgris a écrit : dim. 27 oct. 2024, 11:30 @Selphira
En poussant un peu dans le futur, avec l'aléatoire et une fois les "boss" identifiés avec les emplacements disponibles, cela pourrait même déboucher sur un mod de difficulté aléatoire.
Genre pour un combattant item :
150% pv
+4 Thac0
-4 CA
critique sur 18-20
50% RM
70% résistance à un élément
40% proc image
40% proc invis sup

En gros, tu pourrais presque déboucher sur un mod de difficulté aléatoire plus tard, non ?
Oui, Si l'aléatoire peut se limiter aux créatures ennemies. Parce-que si ça l'aléa donne l'objet à un pnj recrutable.....
Il suffira de filtrer avec un groupe listant tous les pnj recrutables qui pourrait être npcs.grp: ?.cre&!npcs.grp

Cela ferait partie des groupes fournis par défaut par le mod.
Il y aura tout un travail en amont pour définir les listes utiles, mais à ne faire qu'une seule fois.

@loupgris Je ne suis pas certaines de comprendre. Il serait possible effectivement de rendre des créatures plus redoutables en leur donnant des objets puissants (non lootables ?). Mais comme de nature, le mod va aller piocher les listes des autres mods, cela me parait difficile avec ce qui a été réfléchi. En tout cas, le composant de base n'aura pas cette vocation.

Re: [WIP] ItemDispatcher

Posté : dim. 27 oct. 2024, 11:52
par rivvers
Bien sympa le système de groupe qui peuvent s'hériter entre eux (attention aux héritages circulaires du coup…).

Pour les niveaux, j'opterais également pour la seconde solution.
Par contre, je mettrais les quantités dans une autre colonne. À moins que je rate quelque chose ?

Re: [WIP] ItemDispatcher

Posté : dim. 27 oct. 2024, 11:53
par loupgris
Oui, par exemple pour les boss, puiser dans une dizaine de capacités rien qu'à eux, un ou deux pouvoirs par exemple.
T'aurais un mod de difficulté aléatoire.
Pas certain que ça existe en plus.
(je me doute bien que ce n'est pas la priorité pour l'instant)
On est un peu tous dans nos zones de confort avec les boss...un peu d'aléatoire...

Re: [WIP] ItemDispatcher

Posté : dim. 27 oct. 2024, 13:44
par Selphira
loupgris a écrit : dim. 27 oct. 2024, 11:53 Oui, par exemple pour les boss, puiser dans une dizaine de capacités rien qu'à eux, un ou deux pouvoirs par exemple.
T'aurais un mod de difficulté aléatoire.
Pas certain que ça existe en plus.
(je me doute bien que ce n'est pas la priorité pour l'instant)
On est un peu tous dans nos zones de confort avec les boss...un peu d'aléatoire...
J'imagine qu'on pourrait faire cela, mais avec un mod différent.
Il pourrait utiliser la même base pour sélectionner aléatoirement une cible et une capacité, mais après le travail est totalement différent.

Pour une capacité, ce n'est pas tout de donner la compétence à la créature, il faut coder l'IA qui va avec, et là on est dans une toute autre problématique. J'imagine que c'est réalisable, mais il faut se pencher dessus pour connaitre ce qui réalisable ainsi que les limites de l'approche.
rivvers a écrit : dim. 27 oct. 2024, 11:52 Par contre, je mettrais les quantités dans une autre colonne. À moins que je rate quelque chose ?
En effet, la quantité a tout intérêt à être dans une colonne différente, surtout avec la notion de groupe. On ne va pas limiter la quantité de la cible dans le groupe, mais uniquement dans le fichier items.2da lors de la définition de la répartition. Je vais mettre à jour le sujet original.

Merci pour vos remarques et idées, le mod n'a pas encore une seule ligne de code (le dépôt est créé en privé :p) mais ces partages et échanges vont faire qu'il n'en sera que meilleur !

Edit: Sujet initial mis à jour pour les quantités et le filtre par niveau du ciblage

Re: [WIP] ItemDispatcher

Posté : dim. 27 oct. 2024, 14:52
par loupgris
Selphira a écrit : dim. 27 oct. 2024, 13:44 il faut coder l'IA qui va avec
Si c'est du "passif" il n'y a p-e même pas besoin de coder ça non ?

Re: [WIP] ItemDispatcher

Posté : dim. 27 oct. 2024, 15:54
par rivvers
C'était une idée que j'avais eu effectivement, de pouvoir appliquer un sort plutôt que donner un objet.

Le problème serait l'accumulation des effets de plusieurs mods sur un même personnage, qui le booste chacun à leur tour.
Le problème est moindre pour les objets car on a un nombre d'emplacement limité.

D'ailleurs question, si plusieurs mods souhaitent équiper un collier à un personnage, le premier mod a la priorité ?

Re: [WIP] ItemDispatcher

Posté : dim. 27 oct. 2024, 16:07
par Selphira
rivvers a écrit : dim. 27 oct. 2024, 15:54 D'ailleurs question, si plusieurs mods souhaitent équiper un collier à un personnage, le premier mod a la priorité ?
Pour ce cas de figure, j'avais noté ceci à la base
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.
Mais j'e n'avais pas encore l'idée des trésors aléatoires.
Désormais, cela va devenir
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.

Re: [WIP] ItemDispatcher

Posté : sam. 02 nov. 2024, 10:30
par Selphira
Petit état sur l'avancée, j'ai commencé le développement à proprement parlé du mod, et actuellement je gère

- Le chargement et la fusion des listes d'objets et groupes depuis les dossiers des différents mods présents
- La protection contre les références cycliques des groupes
- Le chargement des données du jeu pour créer les meta-groupes (un meta-groupe est un groupe créé automatiquement par le mod à partir des données du jeu, par exemple elf.rce pour les créatures de race elfe)
- La prise en charge des meta-groupes dans les éléments des groupes
- La création de la structure des données qui permettra de facilement sélectionner une cible aléatoirement selon les divers filtres

Lors de la céation des meta-groupes, je me suis aussi créé des petits fichiers csv afin d'avoir une idée de la répartition des créatures selon le type de donnée.
J'ai été surprise par certains résultats, et je pense que cela pourrait éventuellement donner des idées à certains moddeurs.
Je partage donc en pièce jointe une archive contenant les fichiers .csv générés à partir d'un BG2EE vanilla.
statistiques.zip
(4.14 Kio) Téléchargé 11 fois

J'ai aussi eu une autre idée pour accroitre encore les possibilités de répartition "aléatoires maîtrisées".
Cette fois, on ne jouerait plus sur la cible, mais directement sur l'objet. On aurait un système de sélection similaire à celui des cibles, où l'on pourrait combiner plusieurs filtres/groupes.
Imaginez pouvoir faire ceci : "Répartir un arc non unique d'enchantement +3 à telle cible", cela pourrait se traduire par un chaîne ressemblant à ceci

Code : Tout sélectionner

bow.typ&!unique.grp&3.lvl
Qu'en pensez-vous ?

Re: [WIP] ItemDispatcher

Posté : sam. 02 nov. 2024, 11:02
par loupgris
On te fait confiance (*n'a rien capté :D )

Re: [WIP] ItemDispatcher

Posté : sam. 02 nov. 2024, 11:36
par rivvers
Il y a 3 fois plus d'homme que de femme, c'est inadmissible.

C'est intéressant d'avoir de "l'aléatoire maîtrisé" sur les objets. ;)

Re: [WIP] ItemDispatcher

Posté : sam. 02 nov. 2024, 12:03
par loupgris
Ah oui la parité repassera (j'ai vu ça aussi :D )

Re: [WIP] ItemDispatcher

Posté : sam. 02 nov. 2024, 12:29
par Selphira
Quelques points qui m'ont interpelée

- Certaines classes ne sont représentées par aucune créature ou moins de 5
- Très peu de créatures ont un kit assigné (peut-être parcequ'il faudrait avoir un script d'IA dédié ?)
- Les créatures sont plutôt bien réparties par niveau jusqu'au niveau 19, on a ensuite un énorme pic de niveau 20, et un autre au niveau 29/30. A noter qu'actuellement, je ne prends en compte que le niveau de la première classe
- Plusieurs races de créatures existantes ne sont pas assignées à ces créatures. Par exemple, la race "gobelin" , après vérification, les gobelins existant sont de race "kobold".

Re: [WIP] ItemDispatcher

Posté : sam. 02 nov. 2024, 13:11
par rivvers
Oui, quand on regarde de près les créatures, ça nous explose souvent au visage.
Le côté RP a été délaissé pour faire de la création de masse. Plus rapide et moins cher.

Concernant les kits, c'est pas uniquement un problème de script.
C'est aussi la gestion de gain des capacités au levelup. Et ça ne concerne pas que les kits.
Le cas classique, c'est le moine. Le moine a plein de bonus qu'il acquiert au fil du temps : immunité contre le charme, le poison, le ralentissement etc
Mais par défaut, un pnj moine n'a aucun de ces bonus, quelque soit son niveau. Il les acquiert quand il rejoint le groupe de CHARNAME.
C'est pourquoi les moines dans les quêtes de Rasaad ont une liste de bonus longue comme le bras : c'est pour simuler les effets réels qu'aurait un moine joueur de leur niveau.
Alors, pourquoi s'embêter ?

Il existe quelques exceptions hardcodés comme la protection contre les attaques sournoises des barbares ou géré via des 2da comme le bonus de multiplicateur d'attaque sournoise des assassins.
Mais cela reste rare.

Re: [WIP] ItemDispatcher

Posté : sam. 02 nov. 2024, 13:30
par deratiseur
Et aucun mod ne corrige ça (par exemple des gobelins vraiment gobelins) depuis que le jeu (old version) est sorti ?

je me rappelle que j'ai aussi eu quelques problèmes avec ça quand je voulais créer un objet spécialisé contre les géants. Certains géant ont comme race "élémentaire".

Re: [WIP] ItemDispatcher

Posté : sam. 02 nov. 2024, 14:14
par Selphira
L'EEfixpack corrige quelques trucs via eefixpack\files\tph\tbd_bulk_cre_fixes_bg2ee.tph mais assez peu et pas pour les gobelins.

En tout cas, le mod a déjà tout le nécessaire pour corriger ce genre de problème, j'imagine qu'il faut leur signaler, mais c'est une chose que de voir un cas évident comme celui-là, s'en est une autre de le faire de manière exhaustive.

Re: [WIP] ItemDispatcher

Posté : sam. 02 nov. 2024, 16:11
par loupgris
En même temps, il n'y a pas de gobelins dans BG1, tout au plus des hobgobelins (une autre race).
Si on veut rencontrer des gobelins, il faut jouer à iwd2.
Les rares qu'on rencontre ont été introduits par Beamdog.

Re: [WIP] ItemDispatcher

Posté : sam. 09 nov. 2024, 22:09
par Selphira
Quelques nouvelles sur l'avancée.

La sélection d'une cible aléatoire est presque terminée, j'ai mis en place une série de fonctions qui seront utiles pour les autres sélections aléatoires (l'objet et la source) et restructuré une partie des données pour une exploitation plus aisée.
Les combinaisons couplées aux groupes sont totalement fonctionnelles ! J'ai déjà fait plusieurs tests pour combiner des AND (notation &) et des OR (via les groupes), et cela fonctionne super bien !

Je suis en cours d'écriture du readme, cela me permet à la fois de me reposer, et de mettre à plat les idées.

Il reste encore pas mal de travail, mais ça avance !