Gestion des quetes

Répondre
Partager Rechercher
Salut a vous,

Voila, une question pour ceux qui ont deja fait des gros modules (ou qui sont en train d'en monter un) et qui ont trouve un moyen systematique et peu couteux en nombre de script (l'idee etant d'avoir dans la liste des scripts de l'editeur une vision claire de ce qui a ete fait et de ce qui reste a faire).

La question donc, comment gerer tous les scripts (ou une large majorite) concernant les quetes afin qu'ils soient le moins nombreux possibles. En effet, je me vois mal creer un nouveau script pour chaque "Condition d'execution" d'un dialogue implique dans la realisation d'une quete bidon du style aller chercher un item pour une personne.

Merci par avance de vos reponses, je crois en effet qu'elles pourront en aider par la suite plus d'un qui n'ont aucune envie d'avoir une liste de 3.000 scripts de 2 lignes chacun.

Prince Nexus.
Et Ben.... Ca va parraitre bourrin mais je me rappelle d'un post sur le forum officiel de bioware qui voulait utiliser la base de donnée (nwnx ou la bdd officielle de la version 1.30 du client) pour gerer ces quetes.
Apparement, ils voulaient faire un ensemble de scripts qui prendrait le tag de l'initiateur de la quete, aller chercher son dialoge, entrées du journal, et recompenses dans la BDD ainsi que le tag de l'objet à recuperer ou du type a tuer. A partir de là on pourrait imaginer une serie de quetes génériques (a la maniere du plot wizard).

Il n'y a jamais eut de suites alors je pense que le projet est tombé a l'eau...
__________________
..::Heavenlynet le net paradisiaque ::..
http://gw.heaven-ly.net/images/stories/divers/sigfg042.gif
Oui, ca a l'air d'etre une bonne idee, quoique comme tu le dis, un peu bourrine, neanmoims tout a fait faisable. Je me vois bien creer dans un include pas mal d'entier qui seront les recompenses en XP et en Or pour des quetes classiques (le tout parametrable a partir d'un ou deux includes, c'est le leitmotiv chez moi, le tout parametrable... Ca evite pas mal de prise de tete dans un remaniement futur.) et puis des fonctions generiques renvoyant des booleens. Ca demande bcp de rigueur dans la creation meme des dialogues ensuite, mais bon, c'est aussi bcp plus clair. Y a plus qu'a mettre ca sur papier.

Neanmoins, si d'autres ont des idees lumineuses, qu'ils n'hesitent pas.

Prince Nexus.

P.S. : Une remarque sur le vault, ne pensez pas que tous leurs scripts fonctionnent, loin de la ! Je me suis par exemple deja retrouve avec un gros code qui etait tres joli a regarder... mais qui ne compilait pas ! (des fois c'est des fautes betes du genre ClearAllAction(TRUE) mais souvent c'est tout le truc qui est a revoir). Alors pensez a toujours regarder si le script compile...
Bon, je me decide, je m'y attele...

Dans l'idee, il ya 4 cas qui se distinguent (pour les mondes persistants) : la quete se fait en solo et une seule fois, elle se fait en solo et plusieurs fois (a chaque redemarrage du module), elle se fait en groupe et une seule fois ou en groupe et plusieurs fois.

Ensuite, il y a les schemas d'intrigue : je n'en vois que de deux types. Soit quelqu'un (ou quelque chose) veut un truc et quand il l'a, il est content. Soit il veut plusieurs exemplaires de ce truc jusqu'a un nombre nMax (nMax peut etre infini).

Si vous avez dans la tete d'autres schemas d'intrigues classiques, faites m'en part ici.

Prince Nexus.
Tiens ça me rappelle un monde persistant (ça doit être Avlis, qui est également à l'origine du NWNX), ou ils avaient carrément scripté un générateur de quêtes aléatoires ... enfin je suppose que ça se limite à des quêtes mineures mais quand même...
Ouep, c'est faisable ce truc avec des tokens. Mais bon, je laisse ca a quelqu'un d'autre, c'est carrement un casse-tete chinois...

Sinon, sur leur site, ils ne le donnent pas le script capable de faire ce que je demande, a moins que j'ai mal cherche ?

Prince Nexus.
Heum... mouaip ben là je peux pô trop aider

L'éditeur de journal m'est pour ainsi dire quasi inconnu sans parler de l'assistant d'intrigue

Visiblement le plus génant est le nombre de scripts nécessaires aux conditions d'éxecution.

Pour chaque phrase d'accueil que le PNJ dit, il faut obligatoirement un script chacun car le principale problème vient du fait qu'une phrase ne réagit qu'à TRUE.


La meilleur solution est de créer plusieurs scripts réutilisables pour toutes les conversations.

Phrase "0" => Script "QuestCond0", la quête n'est pô encore démarré
Phrase "1" => Script "QuestCond1"
Phrase "2" => Script "QuestCond2"
Phrase "3" => Script "QuestCond3"
Phrase "4" => Script "QuestCond4"
etc.

Chacun de ces scripts sont identiques à par qu'ils ne mettent TRUE en présence d'une seule valeur et selon la quete.
Selon le TAG du PNJ, on va savoir quelle quête est en cour et à quelle étape ce qui permet à l'ensemble des conditions d'enclencher telle ou telle partie du dialogue.

Code PHP:

int StartingConditional()
{
    
object oPC GetPCSpeaker();
    
object oNPC GetLastSpeaker();


// le tag du pnj permet de connaitre la quete dans laquelle il est implique
    
string sQuest GetTagoNPC);

// on recupere une variable precisant a quelle etape de la quete le PJ se trouve
    
int nQuest GetLocalIntoPCsQuest);

// ici on envoie TRUE si le personnage est a la 1ere etape de la quete.
    
if(nQuest == 1)
        return 
TRUE;

    return 
FALSE;

Ainsi on a non pô x conditions par quête:
5 conditions x 10 quêtes = 50

Mais seulement 5 pour toutes les quêtes:
5 conditions + 10 = 15
Ouep Skanzo, c'est tout a fait ca dans le principe. Seulement, je veux aller plus loin et mettre les Action Taken (recompenses, journal, etc.) et utiliser des fonctions du type :

QuestAward(int Gold, int XP, object object1, object object2,...,) tout ca avec les options persistantes que j'ai ennonce ci dessus.

J'ai donc calcule, pour un schema d'intrigue classique tel que celui du dessus, il y a 5 scripts (3 sc et 2 at) + 1 include (classic_quest_inc). Morale, ca nous fait pour 2000 quetes..... 6 SCRIPTS !!!! Miraculeux non ???

Pour le second schema d'intrigue, ca nous fait 6 scripts (3 sc et 3 at) + 1 include (le meme). Le tout en 6 quoi... Effarant !

Eh eh, voila qui devrait en interesser plus d'un non ?
Quand aux quetes randomisables, c'est faisable aussi. Bon je posterai les scripts a la rentree, passke la je peux pas.

Prince Nexus.

P.S. : la limite, c'est quand meme qu'il s'agit de quetes trop classiques...
On peut faire la même chose avec d'autres scripts type réutilisables.

N'a pas l'item = Script "QuestNoItem"
A l'item = Script "QuestItem"

Ces deux scripts vont vérifier si le PJ a récupéré l'item. L'item ayant lui aussi un tag approprié. Avec ça on va pouvoir aiguiller la conversation vers un "retourne-y, il me faut cet objet à tout pris" ou une récompense

Ou encore le script: "QuestOneMoreStep" pour faire avancer la quête d'une étape lorsque le PJ a remplit une partie du contrat


On met le script "QuestOneMoreStep":
- dans le OnDeath d'une créature pour un assassinat
- dans le OnAcquireItem s'il faut récupérer un item particulier
- dans la conversation d'un PNJ secondaire pour la recherche d'une informations vitales.


Ce sera certainement plus compliqué et il faudra à coup sûr préparer quelques fonctions dans une librairie mais dans l'ensemble on aura un nombre de script très réduit, les dialogues gérant quasiment l'ensemble des quêtes


Edit: et voilà ce qui arrive quand on part vadrouiller sans valider le post :bouffon:
Tiens tout ça me parait vraiment une bonne idée. moi c'est avec les variables que je voudrais simplifier. Par exemple les conditions d'executions dans les dialogues.

Code PHP:

int StartingConditional()
{

    
// Inspecter variables locales
    
if(!(GetLocalInt(GetPCSpeaker(), "Tag variable") == 1))
        return 
FALSE;

    return 
TRUE;

Mettre un script different dans chaque branche de dialogue pour chaque rang de variable, ça fait beaucoup de petits scripts encombrant.
Je me pose donc une question, après avoir lut ce topic.
Est ce que mettre toutes les conditions de variables dans le même script (même tag de variable, mais de rang 1 plus 2 plus 3 etc....) c'est posssible, sans que ça mette le bordel ?
si on respecte l'ordre des branches de dialogue, si le Pj à la variable 1, hop branche 1, si le Pj à la variable 2, hop branche 2 etc.... et tout ça avec un seul script.
Théoriquement c'est faisable ? mais dans la pratique ?
*se demande si avec sa question, on va pas le prendre pour un taré*
je me disais ca aussi (faire un script pour toutes les conditions) mais je doit dire que je ne m'y connais pas en dialogues et je ne suis pas sûre que l'on puisse recupérer comme ca une branche de dialogue
__________________
..::Heavenlynet le net paradisiaque ::..
http://gw.heaven-ly.net/images/stories/divers/sigfg042.gif
Heeuuu, qu'est-ce qu'il a de plus ton script??
C'est exactement le même!

Et puis ces scripts ne sont pô du tout encombrant. Pour moi, quelque chose d'encombrant est un truc très peu utile et qui prend de la place pour pô grand chose hors là ces scripts sont utilisés pour toutes les quêtes! Et on diminue le nombre de script de nombre de conditions x nombre de quête.
C'est super utile, trois scripts c'est pô grand chose, et c'est hyper malin!

Et puis comment veux-tu avec un seul script choisir la branche de la conversation sachant que la condition ne sais renvoyé que TRUE or FALSE?
Comment veux-tu que le script sache à quelle branche il a affaire? il est impossible pour lui de savoir si il est à la 2ème ou 3ème branche et donc de renvoyer TRUE si besoin est.


Mais il y a quand même une petite astuce qui pourrait marcher malgré tout.
Incrémenter une variable locale à la fin de chaque condition.

Code PHP:

int StartingConditional()
{

    
object oPC GetPCSpeaker();
    
object oNPC GetLastSpeaker();
    
int nQuest GetLocalIntoPCGetTagoNPC));
    
int i GetLocalIntoNPC"Branche");

    
SetLocalIntoNPC"Branche"i++);
    
DelayCommand2.0fDeleteLocalIntoNPC"Branche"));

    if(
== nQuest)
        return 
TRUE;

    return 
FALSE;

maintenant que j'y pense, une solution serait de ne pas faire de script conditionnel (Qui, comme tu viens de le dire skanzo, ne renvoie que TRUE ou FALSE) mais plutot un script dans OnConversation qui fait un ActionStartConversation() avec la bonne branche de conversation (en gros mettre les branches de dialogues dans des dialogues a part)

Maintenant c'est vrai que c'est uniquement pour le plaisir de n'avoir qu'un seul script qui gere toutes les quetes. Ca doit surement etre l'enfer a gerer (et sa fait considerablement augmenter le nombre de fichiers dialogue).
__________________
..::Heavenlynet le net paradisiaque ::..
http://gw.heaven-ly.net/images/stories/divers/sigfg042.gif
Citation :
Heeuuu, qu'est-ce qu'il a de plus ton script??
C'est exactement le même!
Oui en effet
C'etait juste pour montrer de quoi je parlais, rien de plus. . J'aurais put dire c'est vrais juste le mot condition de variable dans un dialogue, mais j'aime bien me compliquer la vie

Citation :
Et puis comment veux-tu avec un seul script choisir la branche de la conversation sachant que la condition ne sais renvoyé que TRUE or FALSE?
Comment veux-tu que le script sache à quelle branche il a affaire? il est impossible pour lui de savoir si il est à la 2ème ou 3ème branche et donc de renvoyer TRUE si besoin est.
Bah oui je savais bien que ma question était co**e

Citation :
Mais il y a quand même une petite astuce qui pourrait marcher malgré tout.
Incrémenter une variable locale à la fin de chaque condition.
Euh.... y'a moyen d'expliquer ou de commenter un peu ce script, qui m'a l'air assez pratique.

Citation :
Maintenant c'est vrai que c'est uniquement pour le plaisir de n'avoir qu'un seul script qui gere toutes les quetes. Ca doit surement etre l'enfer a gerer (et sa fait considerablement augmenter le nombre de fichiers dialogue).
C'est vrais que si on se complique la vie ailleurs, ça vaut pas vraiment le coup . Disons que j'ai rien dis.
*s'en va discrètement *
Dans la pratique je suis pô certain que ça fonctionne parfaitement.

Le truc est que la variable compte le nombre d'execution du script et par la même compte aussi le nombre de branche, ainsi on peut connaitre à quelle branche on a affaire.

Pour chaque branche de la conversation, le script sera executé.
Dans un dialogue de 3 branches, le script sera executé 3 fois.

À la première exécution et donc à la première branche, la variable "Branche" n'existe pô et indique donc 0.
À la deuxième, la variable sera 1.
À la troisième, 2.

On peut facilement en faire une fonction GetBranchConversation() ou un autre bidule du genre

Pour effacer la variable, j'ai mis un delaycommand sans vraiment y reflechir mais je pense que ça ne posera pô de problème si on met le DeleteLocalInt dans la condition TRUE. Enfin je crois me rappeler que le PNJ affiche toujours la première phrase "possible" (cad quand la condition est TRUE) même si les conditions suivantes sont elle aussi vraies.
Citation :
Enfin je crois me rappeler que le PNJ affiche toujours la première phrase "possible" (cad quand la condition est TRUE) même si les conditions suivantes sont elle aussi vraies.
Et oui c'est bien pour ça qu'il faut toujours mettre ses branches à l'envers, et que cela m'a donné justement l'idée de ma question précédente. Imaginons que je sois à la branche 4 (car j'ai la variable 4 sur moi) et bien il va pas aller plus bas que la variable 4, même si il y a une condition plus bas genre si je possède tel anneau et que j'ai bien l'anneau. Non ca sera la 4 qui sera prise. mais si je met la condition anneau plus haut, la variable 4 sera pas prise. l'anneau oui. C'est pourquoi que je me disais qu'on pouvait tout mettre dans un script sans se prendre la tête même avec un dialogue compliqué, puisque le choix des branches se fait dans un ordre précis.
Mais bon là je fait que répeter ce que tout le monde sait. donc j'arrête promis de flooder sur ce post, car je n'y apporte rien de nouveau.
Désolé faut toujours que je fasse celui qui sait tout alors qu'il ne sait rien Salut^^
Systeme de Gestion des Quetes v. 1.0 : SGQ
Resalut a vous,

Bon, le systeme de gestion des quetes (SGQ) est fini et se compose de 11 scripts (3 includes dont 1, le quest_library, ou il faut remplir les formalites de realisation de la quete et autres petits details.)

Citation :
Concretement, SGQ gere la persistance a 2 niveaux, persistance groupe et persistance personnage seulement. Il effectue toujours une sauvegarde en local au cas ou la BDD plante : cela siginifie que SGQ est interessant pour ceux faisant des modules solos. Il evite la fraude par rapport aux barrieres d'XP imposees pour l'initiation ou non d'une quete (et d'autres manips de triches, mais secret defense... ).
Il gere egalement la repartition d'XP et de po lors des recompenses accordees aux membres du groupe (3 types de repartition : equitable, loi du plus fort et loi du plus faible). Sa limite neanmoins est qu'il n'est concu que pour des quetes lineaires. (Cependant, la fonction GetMissingObject() permet de facilement monter des quetes qui ne le sont pas - de toute maniere, les quetes non lineaires doivent etre traitees au cas par cas).

Son avantage par rapport a l'assistant intrigue est le nombre de scripts employes, la gestion de la persistance, le nombre de schemas possibles, les securites contre la triche et surtout sa lisibilite : toutes les informations de votre quete sont contenus dans un seul fichier. (En somme, l'utilisation de cet assistant devient completement caduc si vous employez SGQ)

Je l'ai teste et il m'a fallu 5 min. chrono pour realiser une quete avec (dialogues, perso et recompenses) ; ca change la vie !

Enfin, le petit plus, il permet de sauvegarder le journal du joueur egalement. Donc, si vous ne possedez pas encore de systeme de sauvegarde de journal, SGQ le fait pour vous. En revanche, si vous en avez deja un et que vous y tenez, lisez le README pour voir comment il faut proceder.

SGQ contien aussi de nombreuses fonctions tres utiles et completant celles de Bioware quand a la realisation d'une quete que je vous laisse decouvrir.
Maintenant, vous me direz, mais il est ou son truc ?!!! J'ai parle avec RAT qui a accepte de l'heberger (le fichier fait 54ko, comprenant un README, un .erf un module de demo) : le tout sera disponible a partir du 04/08/03. Je mettrai le lien ici et dans [Persistant].

Prince Nexus.

P.S : SGQ est concu pour NWNX2, mais une modification d'un include (aps_include) permet de switcher de celui-ci a un autre systeme de persistance de donnees. (Il y a sur le vault un script qui permet de switcher tres facilement entre differents systeme de persistance). Le nom de la table ou sont stockees les donnes peut etre naturellement modifie.("quest" par defaut)
Répondre

Connectés sur ce fil

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