[scrip]dialogue animée modulable a volonté

Répondre
Partager Rechercher
bon, j'ai fais sur commande (hu hu hu ) pour un poto cette après midi, pis comme ca marchait aps trop mal, me suis dit que j'allais le mettre ici tant qu'a faire, si ca peut servir
alors, c'est un "petit" script qui anime un peu une zone, genre une taverne, ou ds l'exemple un espèce de vente au enchères . . .

pour ceux qui commencent y a moyen d'adapter ca a n'importe quelle situation avec un minimum d'effort

c'est pas mal commenté, alors je n'en dis pas plus
il y en a un dans le onenter, et un autre à mettre dans le onexit


enjoy

onexit
Code PHP:

void main()
{
object oPC GetExitingObject();
if(
GetIsPC(oPC)) //seulement si c un PC qui sors
   
{
   
int nNbPJ GetLocalInt(GetArea(oPC), "NB_PJ");
   
nNbPJ --;
   
SetLocalInt(GetArea(oPC), "NB_PJ"nNbPJ);
   
//security truc
   
if(nNbPJ <= 0)
   
SetLocalInt(GetArea(oPC), "NB_PJ"0);
   }

on enter

Code PHP:


//::///////////////////////////////////////////////
//:: Dialogue aleatoire
//:: Copyright (c) Reyan ^_^
//:://////////////////////////////////////////////
/*
        OnEnter
        on peut mettre autant de phrases qu'on veut,
        changer la frquence moyenne
        mais il faut prcisert le nb de phrases
        qu'on a mis
        y a celle des acheteurs, avec leur frequence
        celle des gardes avec leur frequences et
        celle du vendeur avec leurs frequence


        comment ca marche :
        - mettre dans onenter
        -mettre le script associ dans le onexit
        -on peu rajouter autantde phrases possible que l'on veut
        il faut les separer par un "@" comme dans les exemples
        pour une mise en page plus clair regardez les exemple
        -il faut imperativement signaler le nb de phrases inscrites
        -il faut donner une frequence moyenne en secone
        -et une maximale de variation de frequence, inferieur a le frequence

        -il faut spcifier le tag des acheteurs, qui ont tous le meme
        -de meme pour garde et vendeur

        !!! il ne faut pas depasser les 510 caracteres en tout pour un type de PNJ
        toutes phrases comprises.
*/
//:://////////////////////////////////////////////
//:: Created By: Reyan
//:: Created On: 04/04/2003
//:://////////////////////////////////////////////

//declaration des fonction de dia
void AchetSpeak(float fFint nVarobject oAreaint nNbsAchetstring sAchetstring sTag);
void GardSpeak(float fFint nVarobject oAreaint nNbsGardstring sGardstring sTag);
void VendSpeak(float fFint nVarobject oAreaint nNbsVendstring sVendstring sTag);

string StrBefore(string sSourcestring sPattern);
string StrAfter(string sSourcestring sPattern);

string GetStrNB(string sStrint nNb);


void main()
{


//:://////////////////////////////////////////////
//:: Zone editable
//:://////////////////////////////////////////////
float fFsAchet 4.0;//frequence moyenne en secondes    acheteur
int  nVarAchet 2//variation de la frequence entre chaque, en seconde, inferieur a la frequence    acheteur
float fFsGard 12.0;//frequence moyenne en secondes   garde
int  nVarGard 5//variation de la frequence entre chaque, en seconde, inferieur a la frequence    garde
float fFsVend 12.0;//frequence moyenne en secondes   vendeur
int  nVarVend 5//variation de la frequence entre chaque, en seconde, inferieur a la frequence   vendeur

  
string sTagAchet "TAGDESACHETEURS"//a modifier
  
string sTagGard "TAGDESGARDES"//a modifier
  
string sTagVend "TAGDUVENDEUR"//a modifier


  //phrases de l'acheteur
  
string sAchet "Moi j'en prend !@"+
                  
"A boire !@"+
                  
"Comment ca va vieux !@"+
                  
"bla bla bla bla@"+
                  
". . . le cours des bovins a ouall strit  . . .@"+
                  
"Vous connaissez celle du fou qui repeint son plafond ?@"+
                  
"Mmm, qu'est ce qu'elle cache sous sa jupe celle la !@"+
                  
"* baille *@"+
                  
". . . et alors la il lui dit . . .@"+
                  
"J'ai plus d'inspiration pour les exemples . . .@"+
                  
"C'est bon vous voyez coment faire ?@"+
                  
"c marrant, c sense etre plus rp et y a des fautes partout . . .";
  
int nNbsAchet 12//nb de phrase des acheteurs


  //prases des gardes
  
string sGard "Altes !@"+
                  
"Rengez votre arme !@"+
                  
"Dis donc, t'as vu Bart ? C'est lui qui doit me revlever . . .@"+
                  
"Ah Ah AH !! Elle est bien bonne !@"+
                  
"Chut, voila le sergent !@"+
                  
"* s'ennui a mourir *@";
  
int nNbsGard 6//nb de phrase des gardes


  //prases du vendeur
  
string sVend "500, nous avons 500 ici !@"+
                 
"Pour la grose dame en verte avec les coliers ridicule la au troisieme rang !@"+
                 
"* se dure le nez *@"+
                 
"*Bam Bam Bam*@"+
                 
"Adjuge au gnome rougeaud la bas !";
  
int nNbsVend 5//nb de phrase des vendeur

//:://////////////////////////////////////////////
//:: fin de Zone editable
//:://////////////////////////////////////////////


object oPC GetEnteringObject();
if(
GetIsPC(oPC))
   {
   
int nNbPJ GetLocalInt(GetArea(oPC), "NB_PJ");
   if(
nNbPJ <= 0)
      {
      
SetLocalInt(GetArea(oPC), "NB_PJ"1);
      
PrintString("lancement des fonctions");
      
AchetSpeak(fFsAchetnVarAchetGetArea(oPC), nNbsAchetsAchetsTagAchet);
      
GardSpeak(fFsGardnVarGardGetArea(oPC), nNbsGardsGardsTagGard);
      
VendSpeak(fFsVendnVarVendGetArea(oPC), nNbsVendsVendsTagVend);
      }
   else
      {
      
nNbPJ++;
      
SetLocalInt(GetArea(oPC), "NB_PJ"nNbPJ);
      }
   }
}

//:://////////////////////////////////////////////
//:: Fonctions
//:://////////////////////////////////////////////

void AchetSpeak(float fFint nVarobject oAreaint nNbsAchetstring sAchetstring sTag)
{
if(
GetLocalInt(oArea"NB_PJ") <= 0) return;  //si y a peu personne, ca sert a rien de parler

  
object oPNJ =  GetFirstObjectInArea(oArea);
  
int i;
  while(
GetIsObjectValid(oPNJ))
     {
     if(
GetTag(oPNJ) == sTagi++; // on compte le nb de PNJ
     
oPNJ =  GetNextObjectInArea(oArea);
     }
  
oPNJ =  GetFirstObjectInArea(oArea);
  while((
i>0) && GetIsObjectValid(oPNJ))
    {
    if(
GetTag(oPNJ) == sTag)
    {
    if(
Random(i) == 0)   //meme proba pour tt les PNJ
      
{
      
string sTalk GetStrNB(sAchetRandom(nNbsAchet)+1);
      
AssignCommand(oPNJSpeakString(sTalk));  //dit une phrase au hasard
      
i=0;
      }
    
i--;
    }
    
oPNJ GetNextObjectInArea(oArea);
    }

int nRdm Random(nVar+1);
float fF2 fF;
if(
Random(2))
fF2 -= IntToFloat(nRdm);
else
fF2 += IntToFloat(nRdm);


DelayCommand(fF2AchetSpeakfF,  nVar,  oArea,  nNbsAchet,  sAchet,  sTag));
return;
}


void GardSpeak(float fFint nVarobject oAreaint nNbsGardstring sGardstring sTag)
{
if(
GetLocalInt(oArea"NB_PJ") <= 0) return;  //si y a peu personne, ca sert a rien de parler


  
object oPNJ =  GetFirstObjectInArea(oArea);
  
int i;
  while(
GetIsObjectValid(oPNJ))
     {
     if(
GetTag(oPNJ) == sTagi++; // on compte le nb de PNJ
     
oPNJ =  GetNextObjectInArea(oArea);
     }
  
oPNJ =  GetFirstObjectInArea(oArea);
  while((
i>0) && GetIsObjectValid(oPNJ))
    {
    if(
GetTag(oPNJ) == sTag)
    {
    if(
Random(i) == 0)   //meme proba pour tt les PNJ
      
{
      
string sTalk GetStrNB(sGardRandom(nNbsGard)+1);
      
AssignCommand(oPNJSpeakString(sTalk));  //dit une phrase au hasard
      
i=0;
      }
    
i--;
    }
    
oPNJ =  GetNextObjectInArea(oArea);
    }

int nRdm Random(nVar+1);
float fF2 fF;
if(
Random(2))
fF2 -= IntToFloat(nRdm);
else
fF2 += IntToFloat(nRdm);

DelayCommand(fF2GardSpeakfF,  nVar,  oArea,  nNbsGard,  sGard,  sTag));
return;
}


void VendSpeak(float fFint nVarobject oAreaint nNbsVendstring sVendstring sTag)
{
if(
GetLocalInt(oArea"NB_PJ") <= 0) return;  //si y a peu personne, ca sert a rien de parler

  
object oPNJ =  GetFirstObjectInArea(oArea);
  
int i;
  while(
GetIsObjectValid(oPNJ))
     {
     if(
GetTag(oPNJ) == sTagi++; // on compte le nb de PNJ
     
oPNJ =  GetNextObjectInArea(oArea);
     }
  
oPNJ =  GetFirstObjectInArea(oArea);
  while((
i>0) && GetIsObjectValid(oPNJ))
    {
    if(
GetTag(oPNJ) == sTag)
    {
    if(
Random(i) == 0)   //meme proba pour tt les PNJ
      
{
      
string sTalk GetStrNB(sVendRandom(nNbsVend)+1);
      
AssignCommand(oPNJSpeakString(sTalk));  //dit une phrase au hasard
      
i=0;
      }
    
i--;
    }
    
oPNJ =  GetNextObjectInArea(oArea);
    }

int nRdm Random(nVar+1);
float fF2 fF;
if(
Random(2))
fF2 -= IntToFloat(nRdm);
else
fF2 += IntToFloat(nRdm);

DelayCommand(fF2,  VendSpeakfF,  nVar,  oArea,  nNbsVend,  sVend,  sTag));
return;
}



string GetStrNB(string sStrint nNb)
{
string sF;
string sT sStr;
int i=1;
while(
i<=nNb)
   {
   
sF StrBefore(sT"@");
   
sT StrAfter(sT"@");
   
i++;
   }
return 
sF;
}


  
//::///////////////////////////////////////////////
//:: Gestion avancee des chaines de caracteres
//:: inc_strings.nss
//:: Copyright (c) Althea 2002
//:://////////////////////////////////////////////
/*
    Bibliotheques de fonction de traitement
    avance des chaines de caracteres.
*/
//:://////////////////////////////////////////////
//:: Créé par : Tynril
//:: Créé le  : 21/09/2002
//:://////////////////////////////////////////////
//----------------------------------------------------------------------------
// ACTUAL FUNCTION SOURCES

// FUNCTION: StrBefore
//
// Returns the portion of sSource which is before the first occurance of
// sPattern.  For example, Strbefore("Foo bar"," ") -> "Foo"
//
// If the pattern does not exist in the string, the entire string is returned.
string StrBefore(string sSourcestring sPattern)
{
    
int iMarker;
    
string sResult;

    
// Sanity check!
    
if ((sPattern == "") || (sSource == ""))
        return 
sSource;

    
iMarker FindSubString(sSource,sPattern);

    if (
iMarker >= 0) {
        
sResult GetSubString(sSource,0,iMarker);
    }
    else {
        
sResult sSource;
    }

    return 
sResult;
}

// FUNCTION: StrAfter
//
// Returns the portion of sSource which is after the first occurance of
// sPattern.  For example, Strbefore("Foo bar"," ") -> "bar"
//
// If the pattern does not exist in the string, an empty string is returned.
string StrAfter(string sSourcestring sPattern)
{
    
int iMarkeriMarkerLength;
    
string sResult;

    
// Sanity check!
    
if ((sPattern == "") || (sSource == ""))
        return 
"";

    
iMarkerLength GetStringLength(sPattern);
    
iMarker FindSubString(sSource,sPattern);

    if (
iMarker >= 0) {
        
sResult GetSubString(sSource,iMarker iMarkerLength,
            
GetStringLength(sSource) - (iMarker iMarkerLength));
    }
    else {
        
sResult "";
    }

    return 
sResult;

si il y a des bugs, des commentaires, dans conseils, des mars, comme d'habitude je suis preneur
(j'avais pensé à un bug à un moment mais g oublié, donc bon . . .s'en est p-e bien truffé )
Bon, il est passé sur la deuxième page, alors je me permet un up
Alors, vraiment rien à dire ? Il est parfait ce script ou bien il est tellement nul que vous savez plus quoi dire
allez, c'est pour la bonne cause, juste un pitit commentaire, une critique, un ajout ou même une insulte tiens, c mieux que rien
Ben j'ai pas encore testé. Le truc quand tu as des pavés de script comme ça c'est de faire un petit module de démo qui est beaucoup plus parlant qu'un énorme script indigeste.
Le problème c'est que les lecteurs du forum vont s'arrêter avant la fin en allant direct au dernier post pour voir ce que les autres en ont pensé
Un exemple vaux toujours mieux que de long discours

Jaha Effect
Citation :
Provient du message de Skanzo Sylan
Et bien... Jaha a tout à fait raison, tout simplement parce que j'ai justement effleuré le script pour aussitôt après me diriger vers l'avis des différentes personnes
Oui en fait moi aussi

Ca a l'air sympa mais j'ai pas le courage de tout lire, ca a beau etre commenté, un petit résumé de 4-5 lignes ferait pas de mal
roo le résumé de 4-5 lignes il y est

je te le remet la si tu veux

on défini le tag des "acheteurs" celui "du vendeur" et ceux "des gardes", en fait ca peut être n'importe quoi, trois groupes différents, les campagnards, les citadins et les intelectuels, que sais je ^_^
le nombre ne change rien, il faut juste jouer sur la fréquence à laquelle sont dites les phrases d'un groupe
pour donner les phrases il faut les mettres sous la forme

Code PHP:

phrases d'un tel = "une phrase.@"+
                             "une deuxieme phrase.@"+
                             "la dernière phrase.";
nNb = X; //nombre de prases inscrites 
comme fait dans l'exemple

Citation :
OnEnter
on peut mettre autant de phrases qu'on veut,
changer la frquence moyenne
mais il faut prcisert le nb de phrases
qu'on a mis
y a celle des acheteurs, avec leur frequence
celle des gardes avec leur frequences et
celle du vendeur avec leurs frequence


comment ca marche :
- mettre dans onenter
-mettre le script associ dans le onexit
-on peu rajouter autantde phrases possible que l'on veut
il faut les separer par un "@" comme dans les exemples
pour une mise en page plus clair regardez les exemple
-il faut imperativement signaler le nb de phrases inscrites
-il faut donner une frequence moyenne en secone
-et une maximale de variation de frequence, inferieur a le frequence

-il faut spcifier le tag des acheteurs, qui ont tous le meme
-de meme pour garde et vendeur

!!! il ne faut pas depasser les 510 caracteres en tout pour un type de PNJ
toutes phrases comprises.


le module demo



le fichier erf
Alors, la petite démo...
Alors premier point, comme souvent dans ce genre d'animation, la fréquence est trop élevée. On se retrouve très vite floodé mais bon c'est pas trop dure à changer, tu as prévu ce qu'il faut pour régler ça.
Second point, quand on regarde l'enchère, c'est un peu l'anarchie, un mec dis 100 au bout de la salle et le commissaire priseur annonce adjugé a 10000. Je pense qu'un int que tu incrémente serait mieux. Quoi que ce ne soit qu'un exemple des possibilités du script.
Je pense, personnellement, que c'est une peu trop aléatoire à mon goût, quand je fait ce genre d'anim, j'aime avoir une certaine cohérence dans les dialogues. Mais l'idée est intéressante et en la retravaillant pour des situations particulières on peut obtenir quelque chose de sympa

Jaha Effect
Ba vu comment je suis surbooké en ce moment je n'ai même pas pu tester.



J'essayerai ce WE.

reyan , tu pourrais m'envoyer tes deux modules de démo par mail, *j'aurai pensé que tu l'aurais déjà fais mais bon:/*, pour que je les test.

Merci
pour l'anarchie, ba ... en fait c t l'idée pour une vente eu enchère c'est pas trop ca, mais dans d'autre situation ca peut p-e mieux rendre, cela dit, j'avais une ou deux idée pour pouvoir balancer direct des mini conversation, mais alourdissait la chose, et le gus en question était préssé et ne cherchait pas les complication, cela dit, en effet, il faut faire attention au fait que ce n'est pas une conversation mais un "ambiance" donc peut être plus pour une taverne ou une caserne par exemple , mais pour une anime c'est un peu léger, cela dit, ayant souvent "rencontré" des zones vide, non pas des gens, quoique, mais de gens-qui-font-des-choses, je pense que c'est un début, notamment pour un premier module donc si ca peu servir à quelqu'un, comme c'est déjà fait cela dit, si j'avais un peu de temps, je referais bien un mini systeme de conversation ...
mais lui voulait une vente aux enchères donc bon . . .
en fait en créant éventuellement d'autres groupes, ce qui est très facil, il suffit de recopier une des fonctions en changeant le tag et le nom de la fonction, on peut animer un petit quartier par exemple, mais bon ca reste très basique

@RAT, ba, ca a été fait vite fait, pis g balancé les demo avt d'aller manger ( *sig* ) donc c vrai, tu les as pas recu, mais bon, je pensais pas que ca t'interesserais

rq : l'histoire des 100 et adjugé 10000 je les ai rajouté juste avant de balancer la demo, pour remplir un peu, de même que j'ai augmenter la fréquence
Répondre

Connectés sur ce fil

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