[Système] Génération de trésor

Répondre
Partager Rechercher
Le fichier (à renommer en .rar) est à télécharger ici.

Je vous mets le ReadMe :



Readme - Système de Génération de Trésor
---------------------------------------------------------
- Par Taern et Solaufein

version du 26/09/03


* Présentation :


Ce système est basé sur l'utilisation des 2DAs. Il diffère également du système de base de NWN de par le fait qu'il ne tient pas compte des niveaux et caractéristiques du joueur pour générer un trésor.
Les 2DAs servent à rentrer le Resref des objets qui pourront être générés aléatoirement. Dans ces 2DAs se trouvent 3 colonnes qui représentent 3 "valeurs". Par exemple, une pièce d'équipement pourra être soit

courante, peu courante ou rare.
Les caractéristiques de ces 2DAs peuvent être modifiées facilement à l'intérieur du script treasure_inc.nss, malgré tout il est conseillé de réutiliser les 2DAs livrés avec ce fichier. Il est impossible (ou en tout cas peu

commode) de rajouter ou de supprimer des fichiers 2DAs pour l'instant. De même, seules les 20 premières lignes du 2DA seront prises en compte.
Les différents types de trésor, ainsi que leur fichier 2DA correspondant, sont :

- Richesses diverses (or, gemmes) : rand_treasure.2da
- Nourriture : rand_food.2da
- Biens, vêtements : rand_goods.2da
- Réactifs : rand_reagent.2da
- Livres : rand_book.2da
- Equipement : rand_equip.2da
- Objets magiques : rand_magic.2da
- Potions : rand_potion.2da
- Parchemins : rand_scroll.2da


* Installation :


1/ Importer le fichier treasure_inc.erf dans le module


2/ Mettre les fichiers 2DAs dans le hak pack du module, ou dans le dossier "override" le cas échéant.
Remarque : seul le serveur a besoin de posséder ces fichier 2DAs


3/ Pour les créatures :
- Créatures originales de NWN :
Importer le fichier new_spawn.erf dans le module. Cela aura pour conséquence de modifier automatiquement la majeure partie des script de spawns des créatures originales du jeu (à l'exception des henchman et des

animaux).
- Créatures personnalisées :
La fonction GenerateNPCTreasure() du fichier treasure_inc permet de génerer un trésor aléatoire de PNJ en fonction des classes et dés de vie du dit PNJ. Il suffit de l'appeler dans le script d'initialisation (OnSpawn)

du PNJ.


4/ Pour les plaçables :
Les plaçables utilisant ce système sont décrits par 3 paramètres : le niveau de richesse du plaçable, son type, et le nombre de tirages à effectuer. Ces informations sont contenues dans le tag du plaçable.
Exemple : "blablabla_misc_avrg_2" sera le tag d'un contenant banal, de contenu moyennement riche, et sur lequel on fera 2 tirages de génération de trésor.
La syntaxe est donc : "xxxxx_<type>_<richesse>_<tirages>", ou "xxxxx" peut prendre n'importe quelle valeur.
Les différents mots-clé sont :

- misc : contenant banal
- book : bibliothèque, livres
- merch : coffre de marchand
- mage : coffre de mage
- treas : coffre à trésor
- wpn : râtelier d'arme

- poor : pauvre
- avrg : moyen
- rich : riche

Ces mots-clé sont modifiables et il est possible d'en rajouter. Ils sont définis au début de la libraire treasure_inc.
Pour tirer parti du système de génération aléatoire de trésor, il suffit d'appeller la fonction GeneratePlaceableTreasure() du script treasure_inc sur l'évènement OnUsed du plaçable.


* Utilisation :


Les 2DAs doivent contenir les ResRefs (et non les Tags) des objets qui seront générés par le système. Le numéro de ligne ou est placé le Resref n'a aucune influence, au contraire de la colonne (qui représente la

valeur de l'objet).
Cependant, il est possible de mettre autre chose dans les 2DAs :
- mettre un nombre (dans sa forme la plus réduite possible, c'est à dire que "12" fonctionnera, mais pas "012" ou encore "12.0") aura pour effet de faire apparaitre ce nombre en pièces d'or.
- rajouter "*x" à la fin du Resref d'un objet (où x peut valoir n'importe quelle valeur numérique) aura pour effet de créer non pas 1, mais x objets empilés. Cela ne fonctionne que pour les objets empilables (gemmes,

potions, munitions etc.); avec un objet non-empilable, rajouter ceci n'aura aucun effet.


Il existe un moyen de définir les probabilités des colonnes d'un fichier .2da indépendamment des autres fichiers. Pour cela, il faut appeller la fonction ForceColumnChance() AVANT d'appeller

GenerateRandomTreasure(). Exemple :
{
ForceColumnChance(TREASURE_2DA, 80, 10, 10);
}
force les probabilités des colonnes du fichier rand_treasure.2da à 80%, 10% et 10%, et cela indépendamment des paramètres passés à GenerateRandomTreasure().


Des routines de génération de trésor pour plaçables et créatures sont déja intégrées, mais il est possible de les modifier intégralement. Les probabilités sont stockées dans une structure nommée

TREASURE_CHANCES, et qui contient les probabilités de chaque type de trésor, de chaque colonne ainsi que du nombre de tirage.
Par exemple :
{
struct TREASURE_CHANCES sTreasure;
sTreasure.rolls = 4;
sTreasure.empty = 20;
sTreasure.goods = 80;
sTreasure.col1 = 60;
sTreasure.col3 = 40;
}
aura pour effet de créer une structure de probabilité, de définir un nombre de tirage à 4, la probabilité de générert un trésor vide à 20%; la probabilité de générer un trésor de type marchandise à 80%, la probabilité de

générer un objet de la 1ere colonne à 60% et enfin la probabilité de générer un objet de la 3e colonne à 40% (les deux dernières proba. ne tiennent pas compte d'un éventuel forçage expliqué auparavant).


En plus de tout ceci vient s'ajouter un outil très utile : la consultation des probabilités de génération de trésor pour créatures et plaçables. Pour l'utiliser :
- utiliser l'objet Consultation : génération de trésor (catégorie Objets de Quête) sur une créature ou un plaçable
OU
- créer un objet portant le tag "treasure_view", lui affecter un sort Pouvoir Unique (utilisation illimitée), et cocher la case "identifié"
Pour que l'objet de consultation fonctionne, il faut en plus que le contenu du script "onactivate" soit placé sur l'évènement OnActivateItem du module
A noter qu'il sera probablement nécessaire de fusionner le script "onactivate" avec le script déja associé à l'évènement OnActivateItem.


Lorsque le script détecte une erreur dans un fichier 2da (resref invalide, ou pile d'objet demandée trop grande), un message de débuggage est envoyé : dans le log (précédé du tag défini par la constante

ERROR_TAG), sur le canal DM, et aux personnes environnantes. Ce message précise le fichier, la ligne ainsi que la colonne ou se trouve l'erreur.


REMARQUES :
---------------------

1/ Il est très fortement conseillé de reremplir les tableaux 2DAs selon ses propres besoins. En l'état actuel, leur contenu permet surtout de se rendre compte du fonctionnement du système, mais n'est sûrement pas

adapté à tout le monde.
Pour faire une entrée vide (qui ne renvoie pas d'erreur), il est conseillé de mettre *** dans celle-ci.

2/ Le système a été développé pour un serveur précis, Eauprofonde. Ceci explique que les catégories de trésor ne soient pas vraiment passe-partout. Cela dit, faire en sorte de pouvoir rajouter et supprimer des

catégories, compliquerait énormément la chose; c'est pourquoi je pense laisser les choses en état, à moins que la demande d'en changer soit vraiment importante (disons, au point où on m'agresserait dans la rue )

3/ Le module de test fourni dans l'archive, démontre les possiblités du système. Il est conseillé d'utiliser le module en tant que MJ, afin de pouvoir créer n'importe quelle créature et voir le trésor qui lui est assigné,

mais il est aussi possible d'en voir une partie en tant que joueur. Pour cela, il suffit d'utiliser le pupitre à côté de chaque monstre présent dans le module; cela aura pour effet de tuer ce monstre et d'en créer un

identique à sa place. Ces monstres sont inoffensifs puisque dépouillés de leurs scripts, mis à part le script d'initialisation bien sûr.



Soyez indulgents pliz, c'est un des premiers ReadMe que je rédige

Enjoy

EDIT: grosse mise à jour
Il est très bien ce ReadMe. Du vrai français, sans fautes. Bravo rien que pour ça déjà. Il donne envie d'essayer rien que pour voir.
A priori, c'est du beau boulot. Bravo encore une fois.



---------------------------------------------------------------------------------
(A prendre au second degré:

*le rencontre dans la rue*
*bourre-pif*

"Hé ! C'est toi qui l'a dit ! Faudrait t'agresser dans la rue !"
" Tu ne veux pas l'assouplir ton système ?"

Je ne pouvais pas m'empêcher de la faire )
Ahlala, encore cette histoire de resref/tag

Tout d'abord, CreateObject a besoin d'un resref pour fonctionner correctement. Vu que deux objets peuvent avoir le même tag, utiliser celui-ci n'aurait pas de sens.

MAIS, et c'est de là que vient l'embrouille : Bioware utilise pour ses objets des tags et resrefs identiques (à la casse près).

DE PLUS, faire "Editer et copier" sur un objet Bioware ne permet PAS de connaître son resref, car dans ce cas c'est un nouveau resref qui a été généré automatiquement (le plus souvent ... en enlevant "nw_" au début, ce qui confirme ce que j'ai dit au-dessus).

Pour connaitre le resref d'un objet Bioware :
1/ Utiliser le tag de l'objet (marche dans 100% des cas avec les objets je crois)
2/ Créer un objet n'importe où dans le module, et regarder son resref. C'est un peu plus compliqué mais bon, ça permet d'être sûr

A noter qu'il existe des fichiers référençant tous les objets de Bioware avec leurs resrefs, par exemple ici. Ca aide pas mal je suppose

En tout cas, merci d'avoir testé
désolé d'être lourd mais en l'occurence il faut remplir les 2DA avec les TAG et PAS avec les resref sinon ça ne marche pas.

Histoire d'être concret, pour une copper ring :
tag : nw_it_mring021
resref : it_mring022

j'en suis absolument certain et d'ailleurs tu as toi même rempli tes tableaux avec les tags et pas avec les resrefs. J'aurai fait un peu plus gaffe j'aurai pas tout à me retaper.

Enfin bref, reste plus qu'à scripter un système pour empecher les coffre de respawn à chaque ouverture
Bah franchement t'as de quoi être désolé là

"nw_it_mring021" c'est le tag de l'objet, mais aussi son ResRef.
"it_mring022" c'est le resref ni le tag de rien du tout. De toutes façons tous les resrefs des objets de Bioware commencent par "nw_".

Bon je pense que c'est assez clair là

Dans le mod j'avais inclus un petit script qui se met sur le OnHeartBeat des plaçables et simule un OnSpawn. Comme ça le trésor n'est généré qu'une seule fois, à la création du plaçable.

Bien sûr il y a d'autres utilisations possibles
Histoire de compléter ce joli système de génération de trésor, un chti script piqué je sais plus où, certainement sur Maskado d'ailleurs , modifié pour aller avec le travail de Taern.

Code PHP:

//::///////////////////////////////////////////////
//:: Remplissage aléatoire d'un contenant
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Utilise le systeme de generation de tresor de Taern,
disponible a cette adresse :
[url]https://forums.jeuxonline.info/showthread.php?t=228699[/url]

Permet de reremplir les contenants toutes les X secondes
Changez simplement le fRespawnTime.

Se place dans le OnOpen du contenant contrairement a ce qui est
indique dans le readme ( fort bien ecrit par ailleurs :p ) de Taern.
*/
//:://////////////////////////////////////////////
//:: Created By: Kray
//:: Created On: 10/07/2002 08:29
//:: Modifie par : Ketil Dimzad ( [email]loupias.marc@wanadoo.fr[/email] )
//:://////////////////////////////////////////////

#include "treasure_inc"


void main()
{
//Par défaut, à 10min de respawn.
float fRespawnTime 300.0;
object oPC GetLastOpenedBy();
if(
GetIsPC(oPC))
{
if(
GetLocalInt(OBJECT_SELF,"EMPTY") == 0)
{
GeneratePlaceableTreasure();
SetLocalInt(OBJECT_SELF,"EMPTY",1);
DelayCommand(fRespawnTime,SetLocalInt(OBJECT_SELF,"EMPTY",0));
}
else
{
SendMessageToPC(oPC,"Cet objet est vide!");
}
}

vala, j'ose espérer que cette très modeste contribution pourra aider.
Merci bien
Attention toutefois, je pense qu'il serait bon de rajouter un test pour vérifier que le plaçable est vide avant de le re-remplir.

Un simple : GetFirstItemInInventory(OBJECT_SELF) == OBJECT_INVALID suffit normalement.
Voilà, grosse mise à jour comme on les aime

Alors, au rang des nouveautés :
- Nettoyage des lignes de débuggage obsolètes
- Modification du système de nomenclature des plaçables, le système actuel est plus souple sur la longueur des mots-clés et permet de définir le nombre de tirages à effectuer.
- Message de débuggage lorsqu'une entrée problématique (mauvais resref, pile d'objet trop grande) est trouvée dans un 2da; ce message est envoyé dans le log, sur le canal MJ et également aux personnes dans les environs.
A noter que ce message est précédé dans le log d'un tag défini par la constante ERROR_TAG, pratique si on veut parser les erreurs après
- Nombre de lignes des 2das modifiable facilement, grâce à la constante LINES_COUNT_2DA.
- Utilisation d'une structure pour contenir toutes les probabilités et les passer plus simplement entre fonctions.
- Encapsulation des routines de création de trésor pour les créatures et plaçables : il est possible de modifier absolument tout dans celles-ci, et il est aisé de rajouter des paramètres (par exemple de nouveaux types de plaçables, ou une nouvelle manière de les gérer).
- Plus que 3 catégories de richesse des plaçables, qui correspondent aux 3 colonnes des 2das; un nouveau type de plaçable : le râtelier d'arme.
- Et enfin, un outil indispensable : la consultation ingame des probabilités de génération de trésor d'une créature ou d'un plaçable. Utile lorsqu'il s'agit d'équilibrer le loot

Voilà voilà, j'espère que ça vous plaira
Le nouveau ReadMe explique tout ça plus amplement.
Le lien n'a pas changé.
Bien le bonjour, contrairement a ce que j'ai pu dire ailleurs , ton système me plais beaucoup.
passer par des fichiers 2da, est une bonne façon d'avoir la main mise sur les "objets spawnable".

Cependant : je voudrai augmenter le nombre de ligne des fichiers 2da.
Mais je ne sais pas comment faire (a part remplir les tableaux bien sur)


Citation :
Provient du message de Taern
- Nombre de lignes des 2das modifiable facilement, grâce à la constante LINES_COUNT_2DA.
Alors j'ai vu ça... mais je ne vois ou cela se trouve ... ??

Merci d'avance pour ton aide
Content que le système te convienne

La constante LINES_COUNT_2DA se trouve à la ligne 53 du script treasure_inc, avec les autres constantes modifiables.
Vala
bon désolé, mais a la ligne 53 du script j'ai :

53 : const string GOODS_2DA = "rand_marchandise";



j'ai jeté un coup d'oeil sur le script sans succès !

j'ai utilisé le lien au début du fil ? c'est le bon ?

de plus plus loin dans le script il y a ça :

289 : d = d20(); // 3e jet de dé : choix de la ligne

Donc je suppose qu'il tire un d20 sur la Table x, Colonne y ...


Voila, je suis un peu confus là, visiblement je n'ai pas la même version du script que toi, enfin cela semble le plus logique ....

Meci d'avance
Alors là je comprend pas pourquoi ça marche pas chez toi.
J'ai bien vérifié que le fichier que j'avais mis en téléchargement était le bon, mais pourtant c'est effectivement une ancienne version que tu as (le d20() en est la preuve).

Essaie de le retélécharger sinon
Là je peux pas vraiment t'aider.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés