Aller au contenu

Photo

problème avec les dialogues


  • Veuillez vous connecter pour répondre
13 réponses à ce sujet

#1
slaaleth

slaaleth
  • Members
  • 71 messages
Bonjour

je débute avec le tool set, pour le moment je suit le tuto sur le wiki mais j'ai un petit problème avec les dialogues.

quand je met un texte a mon perso pour finir un dialogue, genre "Au revoire[END DIALOGUE]". dans le jeu quand je clique sur au revoire le dialogue se termine bien comme il faut.

par contre si je veux finir le dialogue sur une phrase du NPC rien ne se passe j'ai la gueule du NPC avec son texte au dessus et pour terminer le dialogue je doit appuyer sur escape. est ce que j'ai rater quelque chose  dans la configuration du dialogue?
au passage j'ai bien mis une ligne supplémentaire sous celle de l'owner avec [END DIALOGUE]. par contre je n'ai pas encore mis en place la caméra des perso lors du dialogue(tout d'un coup que sa soit pour sa que sa marche pas)


Tant que j'y suis et pour ne pas faire un autre topic j'ai mis une quête qui se lance avec un dialogue. elle se lance nikel, j'arrive bien a avancer dedans avec le dialogue, par contre comment je fait pour la linker a la mort d'un monstre? je m'explique la quête serait d'aller tuer un monstre, mais quand je le tue rien ne se passe(ce qui est normal vu que j'ai mis nul part quel monstre je devais tuer) j'ai eu beau chercher dans les propriété su monstre et de la quête je ne vois pas comment les associer.

Merci d'avance pour vos réponse

Modifié par slaaleth, 28 décembre 2009 - 03:19 .


#2
ItchOther

ItchOther
  • Members
  • 199 messages
ce que tu dit sur les dialogue est somme toute logique car on ne peut finir un dialogue que par une phrase de PC (tant bien que cela soit comme dans les toolset de NWN).
dans DA d'ailleur beaucoup de fin de dialogue se finisse par "continuez"...
bref.
pour ta quete déjà c'est bien que tu prévoit cette action comme une étape de la quête :)
le tout va se faire par script tu t'en doute et il peut y avoir 150 façon de faire possible, le tout dépendra de ta quête, de sa conception et de ce que tu veut précisémement.
la mort du monstre se trouve dans le script aposer au monstre !

void main()
{
...
[color=#0000ff"> ]switch[/color](nEventType)
    {
         case EVENT_TYPE_AREALOAD_SPECIAL:
         {
             // code propre à l'événement
             break;
         }
        case EVENT_TYPE_ ...    
         {
         // code propre à l'événement
        } 
    }
}


c'est grosso modo la structure d'un script avec DA donc à chaque case EVENT_TYPE_.....
on déclare au jeu de faire suivant l'événement voulu (case event_type_..) le code entre crochet {} juste en desous du CASE correspondant !

si on regarde du plus pret l'exemple que j'ai copier/coller du wiki on voit que le script prévoit du code si l''événement
EVENT_TYPE_AREALOAD_SPECIAL est déclencher bref ce type d'événement nous sera util dans un script d'AERA plus particulièrement.
pour la mort d'une créature tu a à 2 événement possible d'aprés le WIKI :




[*]EVENT_TYPE_DYING - a creature received the killing blow.


[*]EVENT_TYPE_DEATH - creature or placeable have the death effect applied (regardless of hitpoints)

donc tu pourra dans le script de ta créature soit chercher si les case EVENT-TYPE existe déjà dans le script, soit les créer pour faire ce que tu souhaite faire à la mort de ton monstre.

ensuite reste à savoir comment va tu mettre à jours ta quêtes, et la faut que tu en dise plus suivant ce que tu à déjà fait.
par exemple on va souvent se servir de variable aposer au joueur qui définissent à quelle étapes de la quête le joueur en est !

on imagine donc les étapes de la quêtes et c'est pourquoi je dit plus haut que c'est très bien déjà le fait que tu imagine ta quête en étape.
par exemple on peut définir ca comme ca :
- quand ma variable = 0 cela veut dire que le joueur n'a pas prit la quete
- quand ma variable = 1 le joueur à prit la quete
- quand ma variable = 2 le joueur à éffectuer l'objectif N°1 de la quete.. etc

avec un peut de jugote on arrivera à ce genre de pseudo code dans le case EVENT_TYPE_DYING du monstre a tuer
DEBUT
oPC = le caractere qui a tuer le monstre (une fonction existe pour retrouver le killer)
Si oPC possede ma variable de quete et qu'elle est égale à 1 ALORS
la variable de quete d' oPC passe à 2
FIN SI
FIN
techniquement il suffira d'ajouter cette portion de script au script existant de la créature à tuer, puis sauver le script (sous un autre nom peut etre) et vérifié qu'il soit bien séléctionner dans la propriété script prévu à cette effet.

à ca je rajouterai que pour toute quete il faut savoir sauvegarder l'état de la quete et que pour cela il existe des variables locales spécial qui seront sauver avec le personnage lors de la sauvegarde et qui se définisse par :
SetLocal...
SetLocalInt
SetLocalFloat
SetLocalObject
SetLocalString
SetLocalResource

toutes ses variable locale sont sauvgarder sur le personnage, pour une quete à étape SetLocalInt nous suffira et permet de définir un entier comme variable.
void SetLocalInt(

object oObject,
string sVarName,
int nValue
);

oObject sera l'objet sur lequel on pose la varaible ( cela va de soit qu'il faut choisir le PlayerCaracter comme objet si on veut qu'elle soit sauvegarder mais on peut de cette manière aposer des variables à tous les objet de l'éditeur)
sVarName sera le nom de ma varaible on va dire "Ma1ereQuete" c'est une chaine de caractere d'ou les "..." quand on définira donc le nom de notre variable
et enfin nValue sera la valeur de ma variable qui va nous servir pour définir les étapes de la quete.
ainsi on peut imaginer le script suivant dans le case EVENT_TYPE_DYING du monstre
object oPC = GetPlayerKiller(); //(une fonction semblable doit surement exister avec DA, la ca vient de mes souvenir avec NWN )
if (GetLocalInt(oPC,"Ma1ereQuete") == 1 )
{
SetLocalInt(oPC,"Ma1ereQuete",2) ;
}
en gros 3 ligne à rajouter suffise pour faire ce que tu demande tant bien que les étape de ta quête soit défini avec le meme nom de variable local.
on voit ici GetLocalInt qui sert à renvoyer la valeur de ma variable de quete)
SetlocalInt défini cette valeur, si rien est défini la valeur renvoyer = 0
cette variable va servir aussi à faire aparaitre ou pas le dialogue de quete suivant que le personnage joueur à déjà prit ou pas la quete (et aussi suivant ce que l'on veut faire en terme de possibilité.. quete répétable ?)

dans la condition d'aparition de ta ligne de dialogue tu peut imaginer facilement le script suivant :
IntStartingConditional() {
object oPC = GetPCSpeaker();
if (GetLocalInt(oPC,"Ma1ereQuete") < 1 )
{
return true; }
else
{
return false; }
}
le pnj porposera cette ligne de dialogue donc que si le joueur à sa variable de quete < à 1 et on sais que si on ne lui pas encore défini cette variable local elle reverra 0 par défaut, donc si il n'a jamais prit la quete ca renvoi 0 donc < 1 et la phrase du pnj aparaitra

dans les actions conséquentes de ta ligne de dialogue ou le joueur accepte la quete tu peut imaginer le script suivant !
voidmain() {
object oPC = GetPCSpeaker();
SetLocalInt(oPC,"Ma1ereQuete",1) ;
}
le joueur à accepter la quête, on lui apose la variable Ma1ereQuete avec comme valeur 1.....

bon tout cela n'est qu'une solution parmis tant d'autres, il y a X solution et toutes ses solution vont dépendre des critère de ta quete, si tu veut qu'elle soit répétable ou pas ? qu'elle soit unique etc..
faut savoir d'abords dans quel condition tu veut que ta quête se déclenche, ensuite connaitre les étapes quelle comporte et le tour est jouer.
bien souvent mettre une seul variable local de type SetLocalInt suffit à dérouler les étapes de quête de A à Z tant qu'on appose ses variable sur le PC !!!
une autre solution serait aussi de sauver ses variables de quetes dans une base de donnée vu que DA en propose (je n'ais pas regardé cet aspect encore).
je dirais que tout va dépendre de la taille du module qu'on veut créer, car on voit vite l'utilité et la faiclité de poser des variable sur le joueurs sachant que ces varaibles seront sauver faut penser aussi qu'on pourra pas mettre indéfiniment des variables comme ca sur notre joueurs... à un moment ou à un autre suivant la taille de notre module faudra se diriger vers la sauvegarde de ses données via une BDD(base de donnée).
dans la pratique ca restera aussi simple et il n'y aurra pas plus de ligne de code..

PS: désoler pour les fautes d'orthographe, je sais que j'en fait beaucoup.

Modifié par ItchOther, 28 décembre 2009 - 07:11 .


#3
slaaleth

slaaleth
  • Members
  • 71 messages
ok merci

Je testerai pour la quête quand j'aurais déjà bien définit les étapes la je voulais juste tester avec l'exemple du wiki la ils mette 3 monstre et un dialogue juste pour aller les tuer et je voulais test tt sa mais bon...

(tu pourrais me mettre le lien du wiki ou tu as trouver les infos sur les event du monstre?)


sinon pour le dialogue sa doit pourtant être possible car dans la quête de démo du tool set certains des dialogues se finisse par le owner et non pas par le joueur (notamment lors des déclenchements de combats. sa fait genre: "get her" et sa passe a la phase de combat)

Modifié par slaaleth, 28 décembre 2009 - 07:43 .


#4
ItchOther

ItchOther
  • Members
  • 199 messages
aprés avoir lu le tutorial sur les dialogue du wiki vite fait, ils le disent à un moment d'ailleur ma méthode date un peu de NWN ou il falait faire ca par script (bien qu'il est concu un assistant pour les quetes bef).
la avec le système tu définit tes étape grace au plot (qui corresondent au entrée de ton journal).
il faudra donc dans l'EVENT_TYPE_DYING du monstre intéragir avec les PLOT de ta quete..

http://social.biowar...ipting_tutorial


on retrouve dans le tutorial sur les script "la suite" du tuto sur les conversation dans le sens ou la il se serve d'une zone pour voir si le joueur a détruit le ou les monstres en question.
il apose leur script sur la hut_interieur du module de démo je pense.

il se servent d'un EVENT qui s'active quand le dernier membre d'un groupe de monstre est tuer (which is sent when the last member of a team of creatures is destroyed).
il font donc rentrer le joueur dans cette Hutte ^^ une fois le pack de mob tuer il capture l'événement sur l'aera directement avec EVENT_TYPE_TEAM_DESTROYED et mette à jour le journal.

avec :  WR_SetPlotFlag(PLT_CLEAR_THE_HUT, MONSTERS_SLAIN, TRUE);
c'est donc plus cette fonction qu'il faut retenir pour mettre à jour le journal que la manière dont il l'emploi dans l'exemple de la quete...
on peut tout aussi bien mettre à jours le journal depuis la mort d'un monstre comme dans mon exemple précédent..
le script sera un truc du genre :
dans le script du monstre dans la partie case EVENT-TYPE-DYING
if (WR_GetPlotFlag(PLT_CLEAR_THE_HUT, QUEST_ACCEPTED) == TRUE )
{
   WR_SetPlotFlag(PLT_CLEAR_THE_HUT, MONSTERS_SLAIN, TRUE);
 }
faudra rajouter dans l'entete du script #include "plt_clear_the_hut"
c'est la bibliotheque ou se trouve cette fonction WR_SetPloFlag().

la je vérifie donc que le joueur est prit la quete avant de mettre à jour son journal..
je ne sais pas si la fonction WR_GetPlotFlag existe mais surement que oui :) ^^

[edite] la liste des event de DA : http://social.biowar..._(dascript_type)

Modifié par ItchOther, 28 décembre 2009 - 08:21 .


#5
slaaleth

slaaleth
  • Members
  • 71 messages
yes merci beaucoup pour tes réponses

#6
ItchOther

ItchOther
  • Members
  • 199 messages
je rajouterai ceci qui ca sont importance toujours suivant ce que l'on veut faire.
en suivant le tuto sur le wiki on voit sur le script de la hutte qu'aucune vérification n'est faite avant de mettre à jour le journal.
donc en allant directement dans la hutte tuer les monstre sans prendre la quete cela mettra à jour le journal.
dans mon exemple je fait une vérification qui fait qu'un personnage n'ayant pas prit la quete ne déclenchera aucune entrée dans le journal.
on vois donc l'importance de bien définir une quetes avec ce qu'il est possible de faire durant ses étape.
en imaginant un mixte de mon exemple et du wiki on pourait faire ceci :
- si le PJ prend la quete le pnj le récompensera au final.
- si il ne prend pas la quete et qu'il tue les monstres le pnj lui dira simplement merci.
les possibilité sont infini et il faut donc vraiement définir de quel manière on veut que la quêtes soit réalisable..
les tutorial sur le wiki sont très légèr à ce niveau car il présente quelques chose de fonctionnel sans mettre en avant différentes possibilitées.
et quelques part on peut voir cette quete comme comportant une erreur selon les entrée du journal.
imagine que l'entrée du journal lier à la mort des monstre soit : "vous venez de tuer les monstres que renald vous avez demandé de tuer ! retournez le voir"
tel quel si le joueur ne prend pas la quete et va tuer les monstre il aurra cette entrée dans son journal ce qui ne voudrait au final rien dire pour le joueur qui ne connait donc pas le PNJ renald.

on peut alors imaginer la quete de manière plus complexe avec 2 déroulement possible !
1) le déroulement normal prise de la quete au pnj/tuage des monstre/rendre la quete
2) tuage des monstre avec une entrée spécial dans le journal/ rendre la quete
il faudra alors définir 5 plot a la quete
1 _ prise de la quete au PNJ
2 _ tuage des monstres en ayant la quete
3 _tuage des monstres sans avoir pri la quete
4_ rendre la quete (final de l'étape 2)
5_ rendre la quete (final de l'étape 3)

après une simple vérification suffira à gérer ces 2 possibilité au même endroit :
A la mort des monstre !(en pseudo code)
SI le PJ est à l'étape 1 de la quete ALORS
 je passe la quete à l'étape 2
SINON SI le PJ n'a pas prit la quete ALORS
je passe la quete à l'étape 3
FIN SI

dans le dialogue on peut ensuite faire 2 réponse de récompense selon que PJ est à l'étape 2 ou 3
2 _ merci d'avoir fait ce que je vous avez demandé - > récompense
3_ tient je vois que vous avez mit fin à ces monstre merci l'ami -> autre récompense.

pour bien faire on peut  faire 2 entrée final au journal la 4 correspondant à la quete prise au pnj depuis le début, la 5 en ayant par hasard tuer ces monstres sans avoir rencontrer le pnj.
4_ vous avez fait le travail que renald vous avez demandé patatit.
5_ vous avez tuer des monstre qu'un chasseur du nom de renald voulais occir patati patata..

ce n'ais plus ainsi une quete simple avec X étape mais une quete comportant 2 trame un peu différentes sur la fin. le joueur n'ayant pas parler au pnj avant de tuer les monstre passera obligatoirement par les étapes 3 et 5
et le joueur ayant prit avant la quete au pnj passera par les étapes 2 et 4 uniquement. !

imaginer les possibilité de résolution permet ensuite d'écrire un journal réaliste vis à vis des action du joueurs..
ce qui peut être complétement faux dans l'exemple du wiki !
bref je tient à souligner l'importance du background quand à la réalisation technique d'une quetes..
plus la quete sera défini de manières littéral plus sa réalisation sera réalisable de manière précise avec le toolset.

#7
slaaleth

slaaleth
  • Members
  • 71 messages
ha ouai ok



petite question rapide (je n'ai pas encore regarder sa sur le wiki ni faire de recherche a ce propos) mais est-ce possible de faire que la porte de la hutte soit fermée et non crochetable tant qu'on a pas pris la quête au quest master (qui nous donnerais une clé par exemple) genre que si le joueur a la clé la porte est déverrouillée ou que si le joueur a pris la quête la porte est déverrouillée

#8
ItchOther

ItchOther
  • Members
  • 199 messages
oui tout à fait.
chaque objet dans l'éditeur comporte une proriétée script. (je me base sur les éditeur de NWN m'étant pas encore trop plonger dans celui de DA mais ca reste identique sauf peut etre pour les items.)
sur les portes il y a des proriétés  du type crochetable, néccessite une clé.. etc

suffit donc d'autorisé la transition uniquement si le joueur à la clé.
c'est une solution auquel j'ai pensé aussi, mais  tu va comprendre que malgré sont aspect dirigiste passera/passera pas  la solution de la porte entraine un aspect auquel il faut réfléchir, c'est la classe de voleur et sa compétence de crochetage ^^ !
car bon les voleur crochete des porte néccéssitant des clé à la base hein :) bioware fait bien rire avec sont ouverture néccisstant une clé et non crochetable ..... ( c'est je pense passé à coté de fait plaisir au voleur)

d'un point de vue technique oui cela est facilement possible de géré une étape de ta quete sur le script de la porte !
mais qui dit porte dans un JDr avec une classe de voleur dit -> quel gameplay pour tes joueur voleur dans ton petit mod ?

la solution la plus brute, mais pas forcément la plus jolie c'est définir ta quete pour une tranche de level précise de 3 à 8 par exemple, et tu pourra facilement expliquer qu'un voleur de ce niveau prennant la quete ne puisse pas l'ouvrir.
par contre tu pourra pas expliquer qu'un voleur 20 ne puisse pas l'ouvrir :kissing: sauf si la zone leur est fermer à ce niveau..
( c'est un peut la méthode bioware tout ca, ca reste très dirigiste, et en parlant des portes c'est pas forcément super bien développer dans le jeu DA pour les voleurs..)

moi je trouve que c'est important, dans D&D il y a des régles et de l'expérience dans ce domaine qui peuvent bien aider pour ce genre de chose
-un pnj level 5 ne peut pas protégé une porte contre un voleur level 5+sans avoir des talent de voleur), à moin qu'il ait acheter une protéction et dans ce cas ca soulevel plein de question sur le BackGround de ce PNJ... et sur le trésor qu'il cherche à cacher...
- plus une protection sera élevé plus elle enfermera des richesse élevé.
- les protection de type magique sont rare, suffisament pour que le MJ puisse en expliquer le pourquoi à ces joueur au file de son scénario..

bon c'est des régles pour un jeu sur table ou les joueur on besoin d'avoir une histoire qui tienne la route, mais quelques part c'est des à a coté qui feront super plaisir au voleur si c'est prit en compte dans un jeu vidéo :)
c'est un peut comme le fait de pouvoir tuer ou pas tous les pnj ^^ vaste question.

perso avec la porte je garderais ma 1ere solution le joueur peut réalisé la quete sans l'avoir prit au préalable au pnj.
et suivant le level du pnj la porte de la hutte sera crochetable pour un voleur de level pnj + 3 par exemple.
ce qui implique que le pnj donneur de quete à  un savoir faire pour protéger une serrue, il à donc des talent en piege/crochetage.. 
par la meme occasion il poura avoir un dialogue avec un voleur qui à reussi à crocheter sa porte ^^

donc voila oui la porte au premier abord ca parait simple est dirigiste à souhait, bioware à fait dans sa campagne plein de coffre corchetable pour nos amis les voleurs et quelques porte sans grand intérêt..
quelques que soit la quete, le joueur aprécira de voir que ca classe est prise en compte...
donc voila un pnj lambda dison level 5 ne pourra jamais empéché techniquement un voleur level 5+ de franchire une porte.. à  moins qu'il est des talent de voleur ou investi une forte somme pour protégé sa porte.
d'un point de vue technique on peut se dire osef d'appliquer de tel règles à mon module, et je ferais ainsi, mais le premier voleur qui testera cette quete risque de dire lui aussi osef de ce module qui prend pas en compte son crochetage :) !
c'est donc le danger avec les porte :bandit:

Modifié par ItchOther, 31 décembre 2009 - 02:20 .


#9
slaaleth

slaaleth
  • Members
  • 71 messages
ok je n'y avait pas penser comme sa c'est vrais que vu de ce côté la c'est problématique en fait a la bbase je voulais pas que le joueur puisse tuer les monstre avant qu'il ai pris la quête mais ta version est mieu celle de faire qu'il n'y ai pas de récompense si on les tue avant


sinon j'ai une autre question qui n'a rien a voire avec le sujet de départ mais comme sa je recrée pas de topic

J'essaye de mettre des transition de zone par la map et non pas par une porte(2 lieux différent de la carte) j'ai bien suivi le tuto sur le wiki je vois bien la nouvelle carte dans le toolset pour les cartes, tout se s'exporte correctement, et j'ai mis le scripte pour définir la carte par défaut ainsi que les event pour la transition, par contre quand j'appuie sur "n" dans le jeu(afficher la carte du monde) rien ne se passe et quand je clique sur ma zone de transition j'ai bien le truc pour la carte qui s'ouvre mais sa reste tout blanc(enfin couleur parchemin quoi).

je me suis dis qu'il ne pouvait pas lire ma carte puisque c'était pas une carte par défaut, j'ai donc tester avec la carte du monde de base, sa fait exactement la même chose... je m'escrime depuis 2 heures la dessus et je commence doucement a péter un câble^^

si besoin des settings ou du code dans le scripte suffit de demander je les met volontier (ou screenshot de quelque chose)



si jamais pour que les dialogues prennent fin avec l'owner plutot qu'avec le joueur il faut définir un "stage" le truc avec les caméra une fois que c'est mis avec la conversation sa se fait tout seul.

Modifié par slaaleth, 31 décembre 2009 - 02:38 .


#10
slaaleth

slaaleth
  • Members
  • 71 messages
bon j'ai réussi a afficher la carte du monde si j'utilise la carte par défaut si je test avec une personalisée j'ai que les villes qui s'affichent par contre sa ne repère pas sur quel ville je suis du coup les voyages plantent (je n'ai pas l'icone qui tourne autour de la ville dans laquel je suis) et quand je clique sur une destination un chargement infini se lance, je n'ai même pas les trails qui bougent.

j'ai beau chercher les différence entre mon scripte et celui de la démo je ne vois rien qui change donc sa doit venir d'ailleur...

si quelqu'un a une idée je suis preneur par-ce que c'est pas cool de pas pouvoir changer de zone

Modifié par slaaleth, 31 décembre 2009 - 04:38 .


#11
slaaleth

slaaleth
  • Members
  • 71 messages
ok ben en fait c'était ma faute j'ai confondu les map tag avec les area tag du coup sa marche mieux avec les bons noms au bons endroits

#12
ItchOther

ItchOther
  • Members
  • 199 messages
ben c'est bien tu trouve ce que tu cherche.

c'est L' erreur clasique les erreurs de nom de tag !

qu'on retrouve aussi dans les scripts.

faut toujours penser à vérifier ses nom de tag... :)

#13
Fralboj

Fralboj
  • Members
  • 43 messages
Sinon pour ton problème du début, en fait c'est plus simple que tu ne le crois. Il NE FAUT PAS mettre de ligne en-dessous de la dernière phrase prononcée par le personnage. Tu écris la ligne en rouge du PNJ (owner) et stop. Moi ça marche à chaque fois !

En gros là sans le vouloir tu rajoutes une ligne de dialogue vide pour le joueur après chaque dernière phrase de ton PNJ. La gueule de ton PNJ s'affiche comme s'il attendait ta réponse, sauf que le champ est complètement vide. En appuyant sur échap, ça skip la scène, c'est tout.

#14
slaaleth

slaaleth
  • Members
  • 71 messages
heu petite question tu pourrais me dire comment unlock une porte par scripte?

par-ce que dans la liste des event ici: http://social.biowar...(dascript_type) je sais pas trop quoi uiliser.

je pensais tester de faire quelque chose avec la fonction EVENT_TYPE_PLACEABLE_ONCLICK

dans le genre:
switch(nEventType)
{
case EVENT_TYPE_PLACEABLE_ONCLICK:
{
if(WR_Get_Plot_Flag(ma_quest, Flag, true)
{
//et la unlock la porte mais je vois pas trop quoi mettre
}
}
}
tant que j'y suis peut on également me dire ou je dois mettre la récompense a la fin d'une quete

Modifié par slaaleth, 12 janvier 2010 - 02:27 .