[script] Dans ville il y a vie...

Répondre
Partager Rechercher
Pour les débutants qui veulent donner de la vie à leurs villes...
Code PHP:

/////////////////////////////////////////////
/// "Trajet aleatoire par des WayPoints." ///
///   ***    By Ange Musicien     ***     ///
/////////////////////////////////////////////

// 1. Placez les waypoints desires sur votre carte en
//    leurs donnant ces tags:
//    WP_001,..., WP_015,...,WP_123,...,WP_999.
//    (toujours 3 chiffres apresle " _ ").
//    Vos waypoints auront ces tags. Les pnj iront
//    d'un tag waypoint a l'autre aleatoirement. Il
//    est conseille de les placer dans des endroits
//    logiques : devant un etal, au bord de l'eau, etc.
// 2. Placez ce script dans le OnUserDefined de votre passant
//    en ayant pris soin de debloquer le OnHeartBeat 
//    de votre OnSpawn (cf cours pour les quiches, maskado/JOL).
// 3. Remplacez dans ce script la case marquee
//    nombre de waypoints par le nombre de vos
//    Waypoints.

void main()
{
int nAP GetUserDefinedEventNumber();
switch(
nAP)
 {
 case 
1001:
 
int Rdm Random(nombre de waypoints) + 1;
 if(
Rdm 10)
  {
  
object oGo GetWaypointByTag("WP_00"+IntToString(Rdm));
  
location lGo GetLocation(oGo);
  
ActionMoveToLocation(lGo,FALSE);
  }
 if(
Rdm>=10 && Rdm 100)
  {
  
object oGo GetWaypointByTag("WP_0"+IntToString(Rdm));
  
location lGo GetLocation(oGo);
  
ActionMoveToLocation(lGo,FALSE);
  }
 if(
Rdm>=100)
  {
  
object oGo GetWaypointByTag("WP_"+IntToString(Rdm));
  
location lGo GetLocation(oGo);
  
ActionMoveToLocation(lGo,FALSE);
  }
 break;
 }

Voilà. IL est fort possible qu'il y est des fautes, si quelqu'un passe par là...
une remarque

Citation :
int Rdm = Random(nombre de waypoints + 1);
bon, je suis jamais trop sur sur ces trucs là, je me plante tt le tps
mais, pour 10 wp, 10+1=11
donc Random(10+1) ca donne un chiffre entre 0 et 10 inclu, or si t'as 10 wp, le dernier c'est 09
donc justement, il ne faut pas faire

int Rdm = Random(nombre de waypoints + 1);

mais

int Rdm = Random(nb du dernier wp + 1);


je dis ca parce que si quelqu'un le réutilise ca peut être source de bug, et j'en bouffe depuis 3 semaines du Random


autrement, moi j'aurais utilisé un fonction qui remet le nb de zéros adéquat, ou alors mis les tag : WP_1 ... WP_11 ... WP_111

Azrael07 en a donnée une il y a deux jours, je sais plus où ... et j'en utilise une ... je la met si ca peut servir une autre fois

Code PHP:

//par Reyan
//transforme une string de chiffres en lui rajoutant des zéro jusqu'à
//obtenir le nombre de caractères voulus
//faire attention, c'est bien une string, il faut un IntToString avant
string NormalizeNbStrstring sNbToNormalizeint nNorme);

string NormalizeNbStrstring sNbToNormalizeint nNorme)
{
   
string sF;
   
int nTaille=GetStringLength(sNbToNormalize);
   if(
nTaille nNorme)
       {
      
sF GetStringRight(sNbToNormalizenNorme);
       }
   else
      {
      
int nDif nNorme;
      
nDif -= nTaille;
      
sF=sNbToNormalize;
      
string sF2 sNbToNormalize;
      while(
nDif 0)
         {
         
sF "0"+sF2;
         
nDif--;
         
sF2 "0"+sF2;
         }
      }
return 
sF;

sinon, pour faciliter la customisation, j'aurais proposé qq chose comme :
Code PHP:

//par Reyan
//transforme une string de chiffres en lui rajoutant des zéro jusqu'à
//obtenir le nombre de caractères voulus
//faire attention, c'est bien une string, il faut un IntToString avant
string NormalizeNbStrstring sNbToNormalizeint nNorme);


//script
void main()
{
//a customiser
int nNbNb 3//nombre de chiffres dans les tag de wp
string sTag "WP_MVT_ALEA_"//tag des wp sans le nb


int nAP GetUserDefinedEventNumber();
switch(
nAP)
 {
 case 
1001:
 
int Rdm RandomRandom(nb du dernier wp 1);
 
string sNb NormalizeNbStr(IntToString(Rdm), nNbNb);
  
object oGo GetWaypointByTag(sTag+sNb);
  
location lGo GetLocation(oGo);
  
ActionMoveToLocation(lGo,FALSE);
 break;
 }
}


//definition de la fonction
string NormalizeNbStrstring sNbToNormalizeint nNorme)
{
   
string sF;
   
int nTaille=GetStringLength(sNbToNormalize);
   if(
nTaille nNorme)
       {
      
sF GetStringRight(sNbToNormalizenNorme);
       }
   else
      {
      
int nDif nNorme;
      
nDif -= nTaille;
      
sF=sNbToNormalize;
      
string sF2 sNbToNormalize;
      while(
nDif 0)
         {
         
sF "0"+sF2;
         
nDif--;
         
sF2 "0"+sF2;
         }
      }
return 
sF;


tiens, une autre remarque, je crois que tu ferais mieux de définir les variable que tu utilises dans un script, dans le script où tu les utilise, je dis ca pour le
Code PHP:

int nAP GetUserDefinedEventNumber(); 

que tu avais mis avant le void main(), ce qui n'est pas grave, mais pas top non plus ca peut poser des probleme dans les gros script avec beaucoup de fonction et des bout d'includes

edit : c'est ma fonction sapristi
Reyan, c'est un script normalisé, pour débutants qui ne veulent pas s'embêter... J'aurais pu peaufiner beaucoup de détails, comme influencer l'aléatoire pour la logique, en rajoutant des conditions, etc... Ce n'était pas dans le cahier des charges Je suis capable de faire un script de ce type, ne t'en fais pas, lol Le problème était que bcp de gens voulaient un trucs accessibles, et donner du tonus. C'est pourquoi il y a des lignes et des lignes de grisées au début, comme explications

Et il n'y a pas de WP_000, donc le max. est à 10... (dans mes explications, je l'explique par le WP_001)

Et le nAP je l'ai mis au début par soucis de clarification, pour aider. Sur un script de 20 lignes, ça n'a pas d'incidence...

Enfin merci quand même c'est très gentil de m'aider. Et merci pour le script d'Azraël, bien trop compliqué dans notre cas(personne ne va dépasser les 999 WP, même dans une carte de 32x32 ça voudrais dire plus d'un par tuile ), mais il me resservira.
euh, si t'as pas de 000, ba t'as un bug, parce que Random(10), ca renvoi 1, ou2, etc, ou9, ou 0
donc c'est
Random(nombre de waypoints)+1;

qu'il faut mettre
parce que sinon t'as une chance sur plein de tomber sur un WP inexistant, ce qui ne change pas grand chose, mais fais désordre

quant à
Citation :
Le problème était que bcp de gens voulaient un trucs accessibles, et donner du tonus.
d'où l'idée de faciliter l'édition

et pour le nAP, ca peut vraiment poser des problèmes, et comme c'est un script destinée aux quiches, ils seras surement disséqué par les dites quiches si elles veulent s'en sortir, autant montrer le bon exemple

et cette fonction, elle est de moi, pas d'Azrael07 non mais Azrael07 en a fait une autre, ailleurs, dans un autre topic (sans doute meilleur, plus optimisée et tout, mais g la flemme de chercher )
Ange - Reyan : 100% pinaillage

Bon ça n'a pas d'importance.

Pour les wp, je viens de comprendre. J'avais pas vu que je m'étais gouré de parenthèses...

Pour le switch, je te l'accorde aussi, c'est vraiment parce que c'est toi

Ok je remplace tout ça.

Pour info, je redonne la fonction d'Azraël, enfin l'optimisation de cette fonction est plutôt de mon fait et elle ne ressemble plus du tout à la fonction originelle...
Par ailleurs, si le nombre est trop long, elle renvoit plutôt une chaîne de "0" pour que ce soit plus facile de déceler les erreurs et problèmes :
Code PHP:

//Sur une idée et des fonctions originales de Azraël07
//remaniement par Jedaï

//Renvoie la valeur du bit de position nPosition du groupe sIntVarName
//oTrgObj : Objet cible par les variables
int GetBinInfo(object oTrgObjstring sIntVarNameint nPosition);

//prend un nombre et "normalise" sa longueur
string AdjustDecimal(int nNumberint nNumberOfDecimal 3);

//Attribue au bit de position nPosition du groupe sIntVarName la valeur bValue
//oTrgObj : Objet cible par les variables
void SetBinInfo(object oTrgObjstring sIntVarNameint nPositionint bValue TRUE);

string AdjustDecimal(int nNumberint nNumberOfDecimal 3)
{
    
string sNumber IntToString(nNumber);
    
int nL GetStringLength(sNumber) - nNumberOfDecimal;

    if (
nL<0)
        {
        
string sR "";
        for (; 
nNumberOfDecimal nNumberOfDecimal--)
            
sR += "0";
        return 
sR;
        }

    for (; 
nL nL--)
        
sNumber "0" sNumber;

    return 
sNumber;
}

void SetBinInfo(object oTrgObjstring sIntVarNameint nPositionint bValue TRUE)
{
    
int iNumber 0;
    for(; 
nPosition 32iNumber ++) nPosition -= 32;

    
string sStringName sIntVarName AdjustDecimal(iNumber);

    
iNumber << nPosition 1;

    
int nVar GetLocalInt(oTrgObjsStringName);
    
nVar bValue nVar iNumber nVar & ~iNumber;

    
SetLocalInt(oTrgObjsStringNamenVar);
}


int GetBinInfo(object oTrgObjstring sIntVarNameint nPosition)
{
    
int iNumber 0;
    for(; 
nPosition 32iNumber ++) nPosition -= 32;

    
string sStringName sIntVarName AdjustDecimal(iNumber);

    
iNumber << nPosition 1;

    
int nVar GetLocalInt(oTrgObjsStringName);

    return 
iNumber nVar TRUE FALSE;

Voui, y a le SetBinInfo() avec, mais c'était des fonctions auxquelles je suis attachées parce qu'elles ont été marrantes à faire et pis j'avais la flemme de faire deux copier coller.

(Je confirme que cette fonction doit être plus optimisée que la tienne Reyan, mais doit pas y avoir beaucoup de différence.
tiens, je viens de relire ma fonction et euh ... comment dire ... *pas fier* je crois que je vais changer qq trucs
mais bon, l'optimisation reste un grand mystère quand même
alors, bon, je dis ca comme ca hein, faut pas le prendre pour vous hein mais si jamais un gars du genre callé en script pouvait, dans un élan de générosité nous balancer qq info, voir, dans un élan de compassion, nous pondre un chtit, mm, pas tut, mais descriptif des cas les plus courant d'optimisation, genre "plutot que faire ca, faire ca", ba ca serait vraiment sympa
parce que quand on a jamais appris aucun langage par personne, sinon nwscript par les tuts, ba y a des trucs surement idiots et basiques qu'on ignore, mais qu'on aimerai surement savoir si on le savait
enfin je dis ca comme ca moi hein
Répondre

Connectés sur ce fil

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