EffectToString (SetLocalEffect spotted ^_^ )

Répondre
Partager Rechercher
voila, je comence un ... machin, et j'ai besoin de définir des effets que je ne lance que plus tard (et je conais pas la durée d'attente ...) donc, ba j'aurai besoin d'un SetLocalEffect ... bon, y en a pas, on le sait, et le systeme de l'objet, si on lance pas l'effet, g fait qq essi, pas long, mais ca a pas l'air de marcher.
donc, g fait un essai, que j'aimerai bien qu'on me dise si c pas trop idiot il semble que ca marche ... jusqu'a maintenant ... donc bon ... mais si vous avez des conseils, des idées, des remarques, des insultes, du café ...
bon, ba voila :

arf, trop longue :/

Code PHP:

//:: lib pour un SetLocalEffect
//:: fonct_effets
//:: Copyright Reyan (c) ^_^ (made for Paorn)
/*
       Bon, alors ouala un essai de truc pour stocker
       des effets a rutiliser plus tard ...
(je ferais p-e mieux de mettre un lien nan ? )
       en gros, on transforme un effets en string,
       qu'on stock, et qu'on retransforme qd on a besoin ...

*/
//:: Created By: Reyan
//:: Created On: 11/03/2003

//:://////////////////////////////////////////////
//:: Declaration des variables de ma lib (reyan)
//:://////////////////////////////////////////////
//---------------!!!!!important!!!!!------------------
//ne rien modifier si l'on est pas sur de ce qu'on fait ^_^

//s'arranger pour que la string des location soit !!!====>unique<====!!!
//sinon RIEN ne vas marcher, enfin, ca poseras d'enorme pb ^_^
string sBaseLoc="EFFECTPOINT_";
string sBaseObj "EFFECTTARGET_";
//utiliser dans le onactivateitem
string sTok3 "#";
location lLocLocalEffects GetStartingLocation();              //GetTaLocationCommeTuVeux

//:: constantes d'effets

int CE_ABILITYDECREASE 1;
int CE_ABILITYINCREASE 2;
int CE_ACDECREASE =3;
int CE_ACINCREASE =4;
int CE_APPEAR =5;
int CE_AREAOFEFFECT =6;
int CE_ATTACKDECREASE =7;
int CE_ATTACKINCREASE =8;
int CE_BEAM =9;
int CE_BLINDNESS =10;
int CE_CHARMED =11;
int CE_CONCEALMENT =12;
int CE_CONFUSED =13;
int CE_CURSE =14;
int CE_CUTSCENEDOMINATED =15;
int CE_DAMAGE =16;
int CE_DAMAGEDEACREASE =17;
int CE_DAMAGEIMMUNITYDECREASE =18;
int CE_DAMAGEIMMUNITYINCREASE =19;
int CE_DAMAGEINCREASE =20;
int CE_DAMAGEREDUCTION =21;
int CE_DAMAGERESISTANCE =22;
int CE_DAMAGESHIELD =23;
int CE_DARKNESS =24;
int CE_DAZED =25;
int CE_DEAF =26;
int CE_DEATH =27;
int CE_DISAPPEAR =28;
int CE_DISEASE =29;
int CE_DISPELMAGICALL =30;
int CE_DISPELMAGICBEST =31;
int CE_DOMINATED =32;
int CE_ENTANGLE =33;
int CE_FRIGHTENED =34;
int CE_HASTE =35;
int CE_HEAL =36;
int CE_HITPOINTCHANGEWHENDYING =37;
int CE_IMMUNITY =38;
int CE_INVISBILTY =39;
int CE_KNOCKDOWN =40;
int CE_LINKEFFECTS =41;
int CE_MISSCHANCE =42;
int CE_MODIFYATTACKS =43;
int CE_MOVEMENTSPEEDDECREASE =44;
int CE_MOVEMENTSPEEDINCREASE =45;
int CE_NEGATIVELEVEL =46;
int CE_PARALYZE =47;
int CE_POISON =48;
int CE_POLYMORPH =49;
int CE_REGENERATE =50;
int CE_RESURRECTION =51;
int CE_SANCTUARY =52;
int CE_SAVINGTHROWDECREASE =53;
int CE_SAVINGTHROWINCREASE =54;
int CE_SEEINVISBLE =55;
int CE_SILENCE =56;
int CE_SKILLDECREASE =57;
int CE_SKILLINCREASE =58;
int CE_SLEEP =59;
int CE_SLOW =60;
int CE_SPELLIMMUNITY =61;
int CE_SPELLLEVELABSORPTION =62;
int CE_SPELLRESISTANCEDECREASE =63;
int CE_SPELLRESISTANCEINCREASE =64;
int CE_STUNNED =65;
int CE_SUMMONCREATURE =66;
int CE_SWARM =67;
int CE_TEMPORARYHITPOINTS =68;
int CE_TIMESTOP =69;
int CE_TRUESEEING =70;
int CE_TURNED =71;
int CE_TURNRESISTANCEDECREASE =72;
int CE_TURNRESISTANCEINCREASE =73;
int CE_ULTRAVISION =74;
int CE_VISUALEFFECT =75;

//:: Declaration des fonctions de ma lib (reyan)

//probably //debuged\\
//spawn nNb creature de resref stemplate a lLocation, avec ou sans animation de spawn
//va en spawn maximum nMax, si nMax=0, alors en spawn la valeur dfini par default dans la lib (par default : 5)
//void SpawnXStreum( string sTemplate, location lLocation, int nNb=1, int nAnimation=FALSE, int nMax=0);
//probably //debuged\\
//renvoi TRUE si lLocation exist dans cette area
int GetIsLocationValidlocation lLocation);
//probably //debuged\\
//a appliquer a sNb, si plus de chiffre que nNorme, alors on enleve les plus a gauche
//si plus cours, on rajoute des 0 devant
string NormalizeNbStrstring sNbToNormalizeint nNorme);
//probably //debuged\\
//transforme une location en string, de la forme sNb, avec 2 chiffres
//si oStock invalid : 00
//si lLoc = lNone : 00
string LocationToString(location lLocobject oStock);
//probably //debuged\\
//a partir de sNb, recupere la location sur oStock
//!! utilisation de LocationToString indispensable !! pour stockage
//si location invalid : retour lNone
//idem si oStock invalid
location StringToLocation(string sNbobject  oStock);
//recupere le chiffre a droite d'une string, quelque soit le nb de caracteres
string GetStringRightNb(string sString);
//recupere le chiffre a gauche d'une string, quelque soit le nb de caracteres
string GetStringLeftNb(string sString);
//stock l'objet sur oStock
//permet de choisir un emplacement vide recuparable par StringToObject
//erreur : OBJECT_INVALID
string CUSTOMObjectToString(object oObjectobject oStock);
//recupere un objet stocke sur oStock par CUSTOMObjectToString
//erreur : OBJECT_INVALID
object StringToObject(string sNbobject  oStock);
//transforme un effet en string, reconvertible plus tard en effet avec la fonction inverse.
// les effets utiliss sont des constante, de la forme CE_EFFECT ou EFFECT est remplace par le nom de l'effet disr en majuscule
//ex : CE_CURSE, CE_DAMAGE, etc.
//laisser les reglages par default, ils sont les parametre par default des effets (exept EffectCurse, ou la valeur indique est applique, mme si c'est 0)
//permet de faire un SetEffect avec un SetLocalString, et de l'executer plus tard.
string EffectToSTREffect(int EFFECTlocation lLocationfloat fParameter 0.0 object oTarget OBJECT_INVALID int nParametre1 =,int nParametre2 =int nParametre3 =,int nParametre4 =int nParametre5 =,int nParametre6 =string sParametre1 ="~" string sParametre2 ="~" string sParametre3 ="~" string sParametre4 ="~");
///fonction inverse de EffectToSTREffect
//recupere un effet
//default  : EFFECT_TYPE_INVALIDEFFECT
effect STREffectToEffect(string sSTREffect);
location lNone;
   
//:: J'utilise la biblio suivante :
   //:: 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

// CONSTANTES
// Succes de l'operation sur le Tokenizer.
int StrTOKENIZER_SUCCESS 0;
// Erreur retournee si l'on essaye d'initialise un Tokenizer existant.
int StrTOKENIZER_EXISTS = -1;
// Erreur retournee si l'on essaye d'utiliser un Tokenizer non-initialise.
int StrTOKENIZER_NOTINITIALIZED = -2;
// Erreur retournee si l'on essaye d'utiliser un Tokenizer avec un Token vide.
int StrTOKENIZER_EMPTYTOKEN = -3;
// Erreur retournee si l'on essaye d'utiliser un Tokenizer avec une chaine vide.
int StrTOKENIZER_EMPTYSTRING = -4;
// PROTOTYPES DE FONCTIONS ET DECLARATIONS

// Retourne les caracteres se trouvant avant sPattern.
// Exemple : StrBefore("Un chien"," ") -> "Un"
// Si sPattern n'est pas trouve dans la chaine, celle-ci est retournee entiere.
string StrBefore(string sSourcestring sPattern);
// Retourne les caracteres se trouvant apres sPattern.
// Exemple : StrAfter("Un chien"," ") -> "chien"
// Si sPattern n'est pas trouve dans la chaine, celle-ci est retournee entiere.
string StrAfter(string sSourcestring sPattern);
// Replaces all instances of sReplaceMe in sSource with sNewText, and return
// the altered string.  If sReplaceMe is empty, then sSource is immediately
// returned unaltered.
string StrReplace(string sSourcestring sReplaceMestring sNewText);
//:://////////////////////////////////////////////
//:: Corps des fonctions de gestion des effets
//:://////////////////////////////////////////////

//---------------------------GetIsLocationValid----------------------  debugged
int GetIsLocationValidlocation lLocation)
{
object oCowbay GetNearestObjectToLocation(OBJECT_TYPE_ALLlLocation);
if(
GetIsObjectValid(oCowbay)) return TRUE;
else return 
FALSE;
}
//-------------------------LocationToString-------------------------
string LocationToString(location lLocobject oStock)
{
   
string sNb="01";
   
location lLoc2=GetLocalLocation(oStocksBaseLoc+sNb);
   while(
GetIsLocationValid(lLoc2))
      {
      
int nNb StringToInt(sNb);
      
nNb++;
      
string s IntToString(nNb);
      
sNb NormalizeNbStr(s2);
      
lLoc2=GetLocalLocation(oStocksBaseLoc+sNb);
      }

   
//sanity check !!
   
if(!GetIsObjectValid(oStock)) oStock GetModule();
   if(
lLoc == lNonesNb "00";
   else
   
SetLocalLocation(oStocksBaseLoc+sNblLoc);
  return 
sNb;

}
//-------------------------StringToLocation-------------------------
location StringToLocation(string sNbobject  oStock)
{

   
//security :
   
string sNb2 NormalizeNbStr(sNb2);
   
location lLoc GetLocalLocation(oStocksBaseLoc+sNb2);

   
//security check !!
   
if(sNb == "00")lLoc lNone;
   if(!
GetIsLocationValid(lLoc)) lLoc lNone;
   if(!
GetIsObjectValid(oStock)) lLoc lNone;

   return 
lLoc;

}
//-------------------------GetStringRightNb------------------------------
string GetStringRightNb(string sString)
{
string sStringF;
  
string s1 GetStringRight(sString1);
  
int nL GetStringLength(sString);
  
nL--;
  
string sStringM GetStringLeft(sStringnL);
  
//on recupere la derniere lettre et on l'enleve de la string
  
int nNb=1;
  while( (
s1 == "1") ||
         (
s1 == "2" ) ||
         (
s1 == "3" ) ||
         (
s1 == "4" ) ||
         (
s1 == "5" ) ||
         (
s1 == "6" ) ||
         (
s1 == "7" ) ||
         (
s1 == "8" ) ||
         (
s1 == "9" )||
         (
s1 == "0"))
       {
       
//si la lettre teste est un chiffre, on prend la suivante
       
nNb++;
       
s1 GetStringRight(sStringM1);
       
nL--;
       
//if(nL<0) s1="STOP"; //si on arrive a la fin, on stop
       //on enleve la lettre prise pour test
       
sStringM GetStringLeft(sStringnL);

       }
    
nNb--; //on recupere la ou c t valid, pas apres
    //PrintString("***********************nNb a la fin : "+IntToString(nNb));
     
sStringF GetStringRight(sStringnNb);
  return 
sStringF;
}
//-------------------------GetStringRightNb------------------------------
string GetStringLeftNb(string sString)
{
string sStringF;
PrintString("***********************String a decouper : "+sString);
  
string s1 GetStringLeft(sString1);
  
int nL GetStringLength(sString);
  
nL--;
  
string sStringM GetStringRight(sStringnL);
  
//on recupere la derniere lettre et on l'enleve de la string
 
PrintString("***********************premier chiffre de la string decouper : "+s1);
  
int nNb=1;
  while( (
s1 == "1") ||
         (
s1 == "2" ) ||
         (
s1 == "3" ) ||
         (
s1 == "4" ) ||
         (
s1 == "5" ) ||
         (
s1 == "6" ) ||
         (
s1 == "7" ) ||
         (
s1 == "8" ) ||
         (
s1 == "9" )||
         (
s1 == "0"))
       {
       
//si la lettre teste est un chiffre, on prend la suivante
       
nNb++;
       
s1 GetStringLeft(sStringM1);
       
nL--;
       
//if(nL<0) s1="STOP"; //si on arrive a la fin, on stop
       //on enleve la lettre prise pour test
       
sStringM GetStringRight(sStringnL);

       
PrintString("***********************chiffre de la string decouper : "+s1);
       
PrintString("***********************string decouper moins le chiffre pris pour test : "+sStringM);
       
PrintString("***********************nNb : "+IntToString(nNb));
       
PrintString("***********************nL : "+IntToString(nL));
       }
    
nNb--; //on recupere la ou c t valid, pas apres
    
PrintString("***********************nNb a la fin : "+IntToString(nNb));
     
sStringF GetStringLeft(sStringnNb);
  return 
sStringF;
}
//-------------------------EffectToSTREffect------------------------------
string EffectToSTREffect(int EFFECTlocation lLocationfloat fParameter 0.0 object oTarget OBJECT_INVALID int nParametre1 =,int nParametre2 =int nParametre3 =,int nParametre4 =int nParametre5 =,int nParametre6 =string sParametre1 ="~" string sParametre2 ="~" string sParametre3 ="~" string sParametre4 ="~")
{
string sSTREffectF;
string sEffect IntToString(EFFECT);
string sFloat FloatToString(fParameter);
string sN1 IntToString(nParametre1);
string sN2 IntToString(nParametre2);
string sN3 IntToString(nParametre3);
string sN4 IntToString(nParametre4);
string sN5 IntToString(nParametre5);
string sN6 IntToString(nParametre6);
string sTarget;
string sLoc;

if(
lLocation != lNone)
sLoc LocationToString(lLocationGetModule());
else
sLoc "NONE";

if(
oTarget != OBJECT_INVALID)
sTarget CUSTOMObjectToString(oTargetGetModule());
else
sTarget "NONE";

sSTREffectF sEffect sTok3 sLoc sTok3 sFloat sTok3 sTarget sTok3 sN1 sTok3 sN2 sTok3 sN3 sTok3 sN4 sTok3 sN4 sTok3 sN5 sTok3 sN6 sTok3 sParametre1 sTok3 sParametre2 sTok3 sParametre3 sTok3 sParametre4;
return 
sSTREffectF;
}
//-------------------------EffectToSTREffect------------------------------
effect STREffectToEffect(string sSTREffect)
{
effect eEffectF;
string  sEffect StrBefore(sSTREffectsTok3);
string sStructT StrAfter(sSTREffectsTok3);
string sLoc =  StrBefore(sStructTsTok3);
string sStructT2 StrAfter(sStructTsTok3);
string sFloat StrBefore(sStructT2sTok3);
sStructT StrAfter(sStructT2sTok3);
string sTarget StrBefore(sStructTsTok3);
 
sStructT2 StrAfter(sStructTsTok3);
string sN1 StrBefore(sStructT2sTok3);
 
sStructT StrAfter(sStructT2sTok3);
string sN2 =  StrBefore(sStructTsTok3);
 
sStructT2 StrAfter(sStructTsTok3);
string sN3 StrBefore(sStructT2sTok3);
 
sStructT StrAfter(sStructT2sTok3);
string sN4 =  StrBefore(sStructTsTok3);
 
sStructT2 StrAfter(sStructTsTok3);
string sN5 StrBefore(sStructT2sTok3);
 
sStructT StrAfter(sStructT2sTok3);
string sN6 StrBefore(sStructTsTok3);
 
sStructT2 StrAfter(sStructTsTok3);
string sParametre1 StrBefore(sStructT2sTok3);
 
sStructT StrAfter(sStructT2sTok3);
string sParametre2 StrBefore(sStructTsTok3);
 
sStructT2 StrAfter(sStructTsTok3);
string sParametre3 StrBefore(sStructT2sTok3);
 
sStructT StrAfter(sStructTsTok3);
string sParametre4 StrBefore(sStructTsTok3);
object oTarget;
int N1 StringToInt(sN1);
int N2 StringToInt(sN2);
int N3 StringToInt(sN3);
int N4 StringToInt(sN4);
int N5 StringToInt(sN5);
int N6 StringToInt(sN6);
int nEffect StringToInt(sEffect);
float fFloat StringToFloat(sFloat);
location lLoc;

if(
sTarget != "NONE")
oTarget StringToObject(sTargetGetModule());
else 
oTarget OBJECT_INVALID;


if(
sLoc != "NONE")
 
lLoc StringToLocation(sLocGetModule());
else  
lLoc lNone;
switch(
nEffect)
   {
     case 
1eEffectF EffectAbilityDecreaseN1N2); break;
     case 
2eEffectF EffectAbilityIncrease(N1N2); break;
     case 
3:
       if(
N2==0)N2 AC_DODGE_BONUS;
       if(
N3 == 0N3 AC_VS_DAMAGE_TYPE_ALL;
       
eEffectF EffectACDecrease(N1N2N3);
       break;
     case 
4:
       if(
N2==0)N2 AC_DODGE_BONUS;
       if(
N3 == 0N3 AC_VS_DAMAGE_TYPE_ALL;
       
eEffectF EffectACIncrease(N1N2N3);
       break;
     case 
5eEffectF EffectAppear(); break;
     case 
6:
       if(
sParametre1 == "~"sParametre1 ="";
       if(
sParametre2 == "~"sParametre2 ="";
       if(
sParametre3 == "~"sParametre3 ="";
       
eEffectF EffectAreaOfEffect(N1sParametre1sParametre2sParametre3);
       break;
     case 
7:
       if(
N2 == 0N2 ATTACK_BONUS_MISC;
       
eEffectF EffectAttackDecrease(N1N2);
       break;
     case 
8:
       if(
N2 == 0N2 ATTACK_BONUS_MISC;
       
eEffectF EffectAttackIncrease(N1N2);
       break;
     case 
9:
       if(
N3 == 0N3 FALSE;
       
eEffectF EffectBeamN1oTargetN2N3);
       break;
     case 
10eEffectF EffectBlindness(); break;
     case 
11eEffectF EffectCharmed(); break;
     case 
12eEffectF EffectConcealment(N1); break;
     case 
13eEffectF EffectConfused(); break;
     case 
14eEffectF EffectCurse(N1N2N3N4N5N6); break;
     case 
15eEffectF EffectCutsceneDominated(); break;
     case 
16:
       if(
N2 == 0N2 DAMAGE_TYPE_MAGICAL;
       if(
N3 == 0N3 DAMAGE_POWER_NORMAL;
       
eEffectF EffectDamage(N1N2N3);
       break;
     case 
17:
       if(
N2 == 0N2 DAMAGE_TYPE_MAGICAL;
       
eEffectF EffectDamageDecrease(N1N2);
       break;
     case 
18eEffectF EffectDamageImmunityDecrease(N1N2); break;
     case 
19eEffectF EffectDamageImmunityIncrease(N1N2); break;
     case 
20:
       if(
N2 == 0N2 DAMAGE_TYPE_MAGICAL;
       
eEffectF EffectDamageIncrease(N1N2);
       break;
     case 
21eEffectF EffectDamageReduction(N1N2N3); break;
     case 
22eEffectF EffectDamageResistance(N1N2N3); break;
     case 
23eEffectF EffectDamageShield(N1N2N3); break;
     case 
24eEffectF EffectDarkness(); break;
     case 
25eEffectF EffectDazed(); break;
     case 
26eEffectF EffectDeaf(); break;
     case 
27:
       if(
N2 == 0N2 TRUE;
       
eEffectF EffectDeath(N1N2);
       break;
     case 
28eEffectF EffectDisappear(); break;
     case 
29eEffectF EffectDisappearAppear(lLoc); break;
     case 
30eEffectF EffectDisease(N1); break;
     case 
31eEffectF EffectDispelMagicAll(N1); break;
     case 
32eEffectF EffectDispelMagicBest(N1); break;
     case 
33eEffectF EffectEntangle(); break;
     case 
34eEffectF EffectFrightened(); break;
     case 
35eEffectF EffectHaste(); break;
     case 
36eEffectF EffectHeal(N1); break;
     case 
37eEffectF EffectHitPointChangeWhenDying(fFloat); break;
     case 
38eEffectF EffectImmunity(N1); break;
     case 
39eEffectF EffectInvisibility(N1); break;
     case 
40eEffectF EffectKnockdown(); break;
     case 
41: break;
     case 
42eEffectF EffectMissChance(N1); break;
     case 
43eEffectF EffectModifyAttacks(N1); break;
     case 
44eEffectF EffectMovementSpeedDecrease(N1); break;
     case 
45eEffectF EffectMovementSpeedIncrease(N1); break;
     case 
46eEffectF EffectNegativeLevel(N1); break;
     case 
47eEffectF EffectParalyze(); break;
     case 
48eEffectF EffectPoison(N1); break;
     case 
49eEffectF EffectPolymorph(N1); break;
     case 
50eEffectF EffectRegenerate(N1fFloat); break;
     case 
51eEffectF EffectResurrection(); break;
     case 
52eEffectF EffectSanctuary(N1); break;
     case 
53:
       if(
N3 ==0N3 SAVING_THROW_TYPE_ALL;
       
eEffectF EffectSavingThrowDecrease(N1N2N3);
       break;
     case 
54:
       if(
N3 ==0N3 SAVING_THROW_TYPE_ALL;
       
eEffectF EffectSavingThrowIncrease(N1N2N3);
       break;
     case 
55eEffectF EffectSeeInvisible(); break;
     case 
56eEffectF EffectSilence(); break;
     case 
57eEffectF EffectSkillDecrease(N1N2); break;
     case 
58eEffectF EffectSkillIncrease(N1N2); break;
     case 
59eEffectF EffectSleep(); break;
     case 
60eEffectF EffectSlow(); break;
     case 
61:
       if(
N1 == 0N1 SPELL_ALL_SPELLS;
       
eEffectF EffectSpellImmunity(N1);
       break;
     case 
62:
       if(
N3 == 0N3 SPELL_SCHOOL_GENERAL;
       
eEffectF EffectSpellLevelAbsorption(N1N2N3);
       break;
     case 
63eEffectF EffectSpellResistanceDecrease(N1); break;
     case 
64eEffectF EffectSpellResistanceIncrease(N1); break;
     case 
65eEffectF EffectStunned(); break;
     case 
66:
       if(
N1 == 0N1 VFX_NONE;
       
eEffectF EffectSummonCreature(sParametre1N1fFloat);
       break;
     case 
67:
       if(
sParametre2 == "~"sParametre2 ="";
       if(
sParametre3 == "~"sParametre3 ="";
       if(
sParametre4 == "~"sParametre4 ="";
       
eEffectF EffectSwarm(N1sParametre1sParametre2sParametre3sParametre4);
       break;
     case 
68eEffectF EffectTemporaryHitpoints(N1); break;
     case 
69eEffectF EffectTimeStop(); break;
     case 
70eEffectF EffectTrueSeeing(); break;
     case 
71eEffectF EffectTurned(); break;
     case 
72eEffectF EffectTurnResistanceDecrease(N1); break;
     case 
73eEffectF EffectTurnResistanceIncrease(N1); break;
     case 
74eEffectF EffectUltravision(); break;
     case 
75eEffectF EffectVisualEffect(N1N2); break;
     default:  break;
  }
return 
eEffectF;
}
//-------------------------CUSTOMObjectToString-------------------
string CUSTOMObjectToString(object oObjectobject oStock)
{
   
string sNb="01";

   
object oObject2 =GetLocalObject(oStocksBaseObj+sNb);
   while(
GetIsObjectValid(oObject2))
      {
      
int nNb StringToInt(sNb);
      
nNb++;
      
string s IntToString(nNb);
      
sNb NormalizeNbStr(s2);
      
oObject2 GetLocalObject(oStocksBaseObj+sNb);
      }

   
//sanity check !!
   
if(!GetIsObjectValid(oStock)) oStock GetModule();
   if(
oObject == OBJECT_INVALIDsNb "00";
    else
   
SetLocalObject(oStocksBaseObj+sNboObject);
  return 
sNb;
}
//-------------------------StringToObject-------------------------
object StringToObject(string sNbobject  oStock)
{
   
//security :
   
string sNb2 NormalizeNbStr(sNb2);
   
object oObject GetLocalObject(oStocksBaseObj+sNb2);
   
//security check !!
   
if(sNb == "00")oObject == OBJECT_INVALID;
   return 
oObject;
}
//-------------------------NormalizeNbStri---------------------   debugged
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;
}
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;
}
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;
}
string StrReplace(string sSourcestring sReplaceMestring sNewText)
{
    
string sResult;
    
int marker;

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

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

    
sResult sSource;
    while ((
marker FindSubString(sResultsReplaceMe)) >= 0) {

        
// Isn't it nice to be able to reuse your own library functions?
        
sResult =
            
StrBefore(sResultsReplaceMe) +
            
sNewText +
            
StrAfter(sResultsReplaceMe);

    }

    return 
sResult;

bon, g amputé de certain trucs et de qq annotations, pour la faire passer ... donc si c illisible .. ba je réanoterais :-/
Super !! Je trouve juste que tu aurais pu faire beaucoup plus simple et lisible en utilisant les constantes d'effets, puis les constantes pour beaucoup de paramêtres, je pense aussi qu'il y a trop de paramêtre, ta chaîne est trop longue. Je pense également que tu aurais pu utiliser avec profit la fonction que je proposais dans le post sur le OnHit...
Mais beau boulot quand même !!

{Edit} PS : Avoir une belle bibliothèque pour gérer les tokens dans une string et faire tout à la main, c'est un peu dommage quand même...
J'avoue ne pas avoir tout lu, juste le principe en fait. En cherchant ce qui s'était fait ces derniers temps pour NWN, je suis tombé là-dessus:
http://nwndynlib.sourceforge.net/
Une implémentation de librairie dynamique en nwscript!
Il s'est cassé le nez le nez sur les effets, et les a exclus de son système, la raison: les effets liés. Il n'y a pas moyen de savoir si un effet est lié à un autre et si oui lequel. Quand tu transformes l'effet en chaîne tu perds donc cette information, si je ne me trompe. Peut-être cela n'a-t-il pas d'importance pour ce que tu veux faire ceci dit....
Citation :
Provient du message de Jedaï
Super !! Je trouve juste que tu aurais pu faire beaucoup plus simple et lisible en utilisant les constantes d'effets, puis les constantes pour beaucoup de paramêtres, je pense aussi qu'il y a trop de paramêtre, ta chaîne est trop longue. Je pense également que tu aurais pu utiliser avec profit la fonction que je proposais dans le post sur le OnHit...
Mais beau boulot quand même !!

{Edit} PS : Avoir une belle bibliothèque pour gérer les tokens dans une string et faire tout à la main, c'est un peu dommage quand même...
oula oula moins vite
mais .. y a pas de fonction ds le topic sur le onhit ou alors c un autre sujet ? je vois pas dsl ...
pis je ne comprend pas bien ce que tu veux dire sur les constantes ... les constantes d'effets, c'est les CE_ c ca ? alors de quelle constantes tu parle après
pis pour les caractères ... ba ... en fait c'est pour pouvoir utiliser tout les effets, et certains demandent un peu tout et n'importe quoi ... donc là c ouvert en fait, mais si tu vois un autre moyen ...

et la lib sur les token ... ba ... j'y ai pas pensé, j'avoue mais je croyais qu'ils étaient calculés qd on lancait un "speaktokstr" ?
fin j'ai pas tt lu, ni tt exploré, mais je pensais pas pouvoir m'en servir là ... tu pourrais m'éclairer sur le comment stp ? (ca n'alourdirais pas encore plus le truc ?)

dsl, c'est la première fois que je fais un truc pareil mais je ne demande qu'a améliorer le "système" ^_^

qd aux effets lié ... euh, me suis pas trop pencher sur ca. c'est quoi au juste ? parce que déjà je pensais trouver un moyen de rendre les effets "Extraordinary" "Magical" etc. avec une fonction qui rajoute ca a la string, ce qui est alors interprété quand je reviens a un effets ... mais c'est pas ca un effet lié si ? (pis faut que j'inclu le moyen de les retrouver .. pff, encore des trucs à réfléchir ca )

quant a la librairie dynamique ... euh ... keeskecé ? g cherché un peu, dl, mais pas trouvé de "mode d'emploi" fin je vais continuer a cherché ^_^
Bon ba je ne pense pas avoir beaucoup de chose à dire .

Bon pas besoin de mettre ce que je t'ai dis sur icq mais sinon pour le reste je suis d'accord en général avec Jedaï.
Par contre, il est vrai que c'est du bon boulot et que cela m'a d'être très utile. Par contre, je pense que si cela t'intéresse dès que j'ai un peu plus de temps , on pourrait voir pour optimiser le code .


Bravo encore, continue comme ca
Tout d'abord excuse moi, j'avais mal compris ce que tu faisais: je pensais que tu voulais une fonction
void SetLocalEffect(...,..., effect eEffect)
Mais tu parts de l'effet non encore constitué si je ne me trompe (je suppose que les paramètres ne seraient pas possible à récupérer de toutes façon, ce qui serait un bien plus gros problème que cette histoire d'effet liés)

Les effets liés sont produits avec ça:
effect EffectLinkEffects(effect eChildEffect, effect eParentEffect ) , le résultat c'est que si la créature est immunisé à l'un des effets, aucun ne sera appliqué (de même ils seront solidaires en cas de dissipassion). L'intérêt est de pouvoir lié l'effet du sort sur la créature à son effet visuel.

Sinon pour ton code c'est un peu étrange de passer par des chaînes de caractères pour stocker des entiers ou des floats, certes tu n'a qu'une seule variable à passer mais elle est beaucoup plus lourde (les entiers ou les floats sont d'un type statique, c'est géré beaucoup plus efficacement en mémoire) et tu a des manip à faire et à défaire, un peu pareil pour la façon dont tu code la chaîne des LocalLocation...

ce n'est qu'une suggestion (et très incomplète) mais voilà comment je ferais:

l'idée générale est d'utiliser le nom fourni par l'utilisateur comme préfixe pour tous tes SetLocal et de stocker les informations sous leur forme propre.
Code PHP:


void SetLocalEffect
(object oObjectstring sVarNameint EFFECTlocation lLocationfloat fParameter 0.0 
            
object oTarget OBJECT_INVALID int nParametre1 =,int nParametre2 =,
             
int nParametre3 =,int nParametre4 =int nParametre5 =,int nParametre6 =string sParametre1 ="" 
             
string sParametre2 ="" string sParametre3 ="" string sParametre4 ="")
{
     if ((
oObject == OBJECT_INVALID) || sVarName == "" || EFFECT <= )
        return;
     
SetLocalInt(oObjectsVarName "ef"EFFECT); // on suffixe par e pour l'entier d'effet
     
SetLocalLocation(oObjectsVarName "lo"lLocation);

// comme on ne va pas réassigner ces variables si elles sont nulles on ne les initialisent pas:
     
if (fParameter != 0.0f)
        
SetLocalFloat(oObjectsVarName "fl"fParameter);
     if (
oTarget != OBJECT_INVALID)
        
SetLocalObject(oObjectsVarName "ta"oTarget);
     if (
nParametre1 != 0)
        
SetLocalInt(oObjectsVarName "p1"nParametre1);
     if (
nParametre2 != 0)
        
SetLocalInt(oObjectsVarName "p2"nParametre1);
     
//...
     
if (nParametre6 != 0)
        
SetLocalInt(oObjectsVarName "p6"nParametre1);
     if (
sParametre1 != 0)
        
SetLocalString(oObjectsVarName "s1"sParametre1);
     
//...
 // résultat? cela n'utilise pas le "sVarName" entré par l'utilisateur... pas très logique tu pourrais le 
// prendre tel quel nour le n° d'effet, la cible objet , et la cible location 
//(les trois à la fois puisque les types sont différents).

A l'autre bout tu fait la même chose que ce que tu fais maintenant: selon l'effet tu récupères les données dont tu as besoin....
Dans le même genre d'idée que le lien (mais plus simple, ça te rajoutera simplement quelques paramètres ) , il y a Magical/Supernatural/extraordinary que tu mentionnais, et aussi VersusAlignmentEffect, VersusRacialTypeEffect, VersusTrapEffect. A noter que pour le lien tu peux le simuler je pense, en passant en paramètre à l'effet enfant le sVarName de l'effet parent... mais c'est un peu tordu.
a ouais, aussi ^_^
en fait, l'idée de départ, c'est de faire des "chaine d'effets" pour les effets visuels, puis de faire un truc qui les additionne, et un qui les redecoupe, et les lance, pour pouvoir choisir et créer ses effets a l'interieur du jeu
donc en creant une chaine que je decode, ba je les additionne, puis les decoupe, et les traduits en effets, mais comme c faisable aussi avec les autres effets, ba g essayé, et ca marche
mais ton "SetLocalEffect" est p-e plus logique ^_^
donc il faut pouvoir stocker plusieurs location, plusieurs effets, sans passer par le code et spécifier de nouveaux noms de variables ... euh .. c compréhensible ce charabia ?
pis, j'ai un peu peur de poser 36000 variable je dois avouer, des fois qu'une soit réutilisée ... mais je pense que ca marcherais aussi bien ... pff, c malin ca
*se sent tt idiot avec sa chaine longue comme le bras *

sinon, c lourd a quel point une longue chaine de caractères ?
Citation :
Provient du message de Reyan
a ouais, aussi ^_^

donc il faut pouvoir stocker plusieurs location, plusieurs effets, sans passer par le code et spécifier de nouveaux noms de variables ... euh .. c compréhensible ce charabia ?

Je crois comprendre ce que tu veux dire, je ne pense pas que ma version pose problème:
Tu peux automatiser la création de sVarName:
exemple eff1, eff2,... eff246... (Une petite note il est de bonne politique d'utiliser des chaînes de caractères courtes quand y pas de raisons qu'elles soient longues ).

Citation :
pis, j'ai un peu peur de poser 36000 variable je dois avouer, des fois qu'une soit réutilisée ... mais je pense que ca marcherais aussi bien ... pff, c malin ca
*se sent tt idiot avec sa chaine longue comme le bras *

sinon, c lourd a quel point une longue chaine de caractères ?
Le truc c'est qu'assigner un entier en mémoire c'est très rapide, un entier est codé sur 32 bit, point, donc une adresse mémoire suffit, même chose pour les floats. En revanche pour les chaînes de caractères, version nwscript, c'est une autre histoire, je ne sais pas comment Bio fait exactement, c'est largement au dessus de mes compétences (faudrait demander à Torlack) , mais comme la longueur n'est pas fixée au départ, il faut faire un truc du type liste chaînée: chaque caractère de la chaîne ce voit associé l'adresse mémoire du suivant ou quelque chose comme ça . Tu remarquera que l'on retombe sur des types statiques: un caractère au fond c'est un int (son code ascii/iso) et une adresse mémoire aussi. Tout ça pour dire que pour récupérer une chaîne il y a plusieurs endroit à visiter. Ceci reste proportionnel à la taille de la chaîne a priori donc pas trop de problème. La où cela peut franchement se gâter c'est quand tu fait des manipulations, concaténation de deux chaînes par exemple, mais là tout dépend de la gueule des algos.
Citation :
Provient du message de Sire Pom-pom
J'avoue ne pas avoir tout lu, juste le principe en fait. En cherchant ce qui s'était fait ces derniers temps pour NWN, je suis tombé là-dessus:
http://nwndynlib.sourceforge.net/
Une implémentation de librairie dynamique en nwscript!
Il s'est cassé le nez le nez sur les effets, et les a exclus de son système, la raison: les effets liés. Il n'y a pas moyen de savoir si un effet est lié à un autre et si oui lequel. Quand tu transformes l'effet en chaîne tu perds donc cette information, si je ne me trompe. Peut-être cela n'a-t-il pas d'importance pour ce que tu veux faire ceci dit....
En fait, la raison pour laquelle je n'ai pas pu implémenter le stockage des effets sur la pile comme je l'ai fait avec les autres types de variables c'est que l'API de librairie dynamique doit être générique, et donc je n'ai pas le contexte de l'appel pour savoir le contenu d'une variable 'effect' si c'est une chaine d'effets lies. (la valeur de retour lorsque l'on lie des effets et un effet, qui peut lui aussi être lie a d'autres, etc., donc si j'ai seulement a ma disposition le résultat final, je ne peux pas savoir ce que cet effet implique)

Ceci dit... surprise surprise, vous m'avez fait sortir de ma cachette et apparaitre ici.
Citation :
Ceci dit... surprise surprise, vous m'avez fait sortir de ma cachette et apparaitre ici.
Oh!
Et y-a-t-il une chance pour que l'on puisse te garder?

Puisque je ne l'ai pas fait sur le topic de Bioware (un peu difficile a lire au début à cause des cris outragés sans queue ni tête sur le copyright ), j'en profite pour te tirer mon chapeau. Je me suis promis d'aller mettre mon nez dans le code, la simple lecture du forum et de la première page de ton site , m'aillant déjà donné beaucoup à penser...

Citation :
la valeur de retour lorsque l'on lie des effets et un effet, qui peut lui aussi être lie a d'autres, etc., donc si j'ai seulement a ma disposition le résultat final, je ne peux pas savoir ce que cet effet implique
Oui j'avais mal compris ce que Reyan voulait faire, je pensais à un SetLocalEffect...
En y réfléchissant, au delà du cas particulier des effets liés, les paramètres que l'on passe aux fonctions Effect...() pause problème aussi non? Ou y-a-t-il moyen de les récupérer à partir de l'effet?
Citation :
Provient du message de Sire Pom-pom

Le truc c'est qu'assigner un entier en mémoire c'est très rapide, un entier est codé sur 32 bit, point, donc une adresse mémoire suffit, même chose pour les floats. En revanche pour les chaînes de caractères, version nwscript, c'est une autre histoire, je ne sais pas comment Bio fait exactement, c'est largement au dessus de mes compétences (faudrait demander à Torlack) , mais comme la longueur n'est pas fixée au départ, il faut faire un truc du type liste chaînée: chaque caractère de la chaîne ce voit associé l'adresse mémoire du suivant ou quelque chose comme ça . Tu remarquera que l'on retombe sur des types statiques: un caractère au fond c'est un int (son code ascii/iso) et une adresse mémoire aussi. Tout ça pour dire que pour récupérer une chaîne il y a plusieurs endroit à visiter. Ceci reste proportionnel à la taille de la chaîne a priori donc pas trop de problème. La où cela peut franchement se gâter c'est quand tu fait des manipulations, concaténation de deux chaînes par exemple, mais là tout dépend de la gueule des algos.
En fait, pour une chaines de caractères, tu assignes seulement l'adresse de départ, et tous les caractères se suivent en mémoire, et tu arrêtes au premier NULL (0) ou après une longueur prédéterminée. En NWScript c'est moins important, puisque tu dois assigner une nom a chaque variable que tu stockes, donc tu as de toute façon a aller chercher/comparer une chaines de caractères même si tu stockes un entier. Par contre, les manipulations de chaines demandent beaucoup, donc encoder plusieurs informations dans une seule variable de type 'string' affecte beaucoup l'efficacité de l'aglorithm. Sans compter que le decodage d'entier est plus facile et performant puisqu'il permet l'utilisation de switch-case (qui n'effectue qu'un seul saut en mémoire plutôt que de multiples comparaisons).

Si tu veux plus de détails, je pourrais faire la demande a Torlack, on est d'assez bons amis (surtout que dernièrement lui et moi sommes entrain de porter son compilateur sur Linux et MacOS X).
Citation :
Provient du message de Sire Pom-pom
Oh!
Et y-a-t-il une chance pour que l'on puisse te garder?

Puisque je ne l'ai pas fait sur le topic de Bioware (un peu difficile a lire au début à çause des cris outragés sans queue ni tête sur le copyright ), j'en profite pour te tirer mon chapeau. Je me suis promis d'aller mettre mon nez dans le code, la simple lecture du forum et de la première page de ton site , m'aillant déjà donné beaucoup à penser...
Merci Je te suggères d'attendre la version 1.1... il y a beaucoup d'amélioration un niveau des algos pour la performance et la gestion d'erreurs. Tu peux regarder ce que j'ai en CVS, ca ne devrait pas beaucoup changer d'ici 1.1.

Pour ce qui est de me garder, tout dépend. Je ne sais même pas quel est le but de ces forums ici. Je les ai trouve puisque tu avais mis un lien a ma page et je traque tous les 'hits' et leur origine.

Citation :
Oui j'avais mal compris ce que Reyan voulait faire, je pensais à un SetLocalEffect...
En y réfléchissant, au delà du cas particulier des effets liés, les paramètrès que l'on passe aux fonctions Effect...() pause problème aussi non? Ou y-a-t-il moyen de les récupérer à partir de l'effet?
Ce n'est pas tout, il y a les ScaledEffects (changement de durée, efficacité, etc.), et aussi de très grande importance, le contexte. Lorsque tu crées un effet de type domination, par exemple, c'est le présent OBJECT_SELF qui est le propriétaire de la domination a assigner a quelqu'un. Je crois qu'il est possible d'obtenir l'auteur a partir de l'effet, mais c'est tres délicat lorsque tu le reproduis.
Merci pour les précisions
J'en profite pendant que tu es là, mais je ne voudrais pas exagérer :

Citation :
En fait, pour une chaines de caractères, tu assignes seulement l'adresse de départ, et tous les caractères se suivent en mémoire, et tu arrêtes au premier NULL (0) ou après une longueur prédéterminée.
A vrai dire pour le C, je savais que ça marchais comme ça, mais j'imaginais que dans nwscript puisque l'on ne précise pas la longueur maximale de la chaîne dans la déclaration, le moteur ne pouvait pas s'assurer d'avoir a priori une place consécutive suffisante en mémoire. Je ne sais pas s'y je suis très clair...
Imaginons que je fasse
SetLocalString(oObject, "CHAINE" , "foo");
et plus loin
SetLocalString(oObject,"CHAINE", "foofoo");

Comment puis être sûr de ne pas coller quelque chose en mémoire dans le laps de temps entre les deux instructions qui m'empêche de "rajouter" le deuxième foo? (Je sais pas si c'est beaucoup plus clair...)

Citation :
En NWScript c'est moins important, puisque tu dois assigner une nom a chaque variable que tu stockes, donc tu as de toute façon a aller chercher/comparer une chaines de caractères même si tu stockes un entier.
C'est pas faux
Citation :
Pour ce qui est de me garder, tout dépend. Je ne sais même pas quel est le but de ces forums ici. Je les ai trouve puisque tu avais mis un lien a ma page et je traque tous les 'hits' et leur origine.
Je crois que l'on pourrait le décrire comme un forum général technique sur tout ce qui touche à Aurora et avant tous les scripts. Mais eMRaistlin serait peut-être plus précis.
De toute façon, maintenant, je sais comment t'appeler à la rescousse en cas de problème épineux ^^.
Citation :
Provient du message de Sire Pom-pom
Merci pour les précisions
J'en profite pendant que tu es là, mais je ne voudrais pas exagérer :


A vrai dire pour le C, je savais que ça marchais comme ça, mais j'imaginais que dans nwscript puisque l'on ne précise pas la longueur maximale de la chaîne dans la déclaration, le moteur ne pouvait pas s'assurer d'avoir a priori une place consécutive suffisante en mémoire. Je ne sais pas s'y je suis très clair...
Imaginons que je fasse
SetLocalString(oObject, "CHAINE" , "foo");
et plus loin
SetLocalString(oObject,"CHAINE", "foofoo");

Comment puis être sûr de ne pas coller quelque chose en mémoire dans le laps de temps entre les deux instructions qui m'empêche de "rajouter" le deuxième foo? (Je sais pas si c'est beaucoup plus clair...)
En NWScript, l'extrapolation de la longueur necessaire se fait lors de la compilation puisque les chaines que tu definis sont toujours des constantes. Pour ton example, "CHAINE" pointe sur une adresse en memoire (en utilisant un algo de 'hashtable' probablement) qui elle contient une adresse vers le contenu. Comme en C tu pourrais faire:

char * foo = "foo";
char * foofoo = "foofoo";
int CHAINE;
CHAINE = (int) & foo;
printf ("%s\n", (char *) * CHAINE); // imprime "foo"
...
CHAINE = (int) & foofoo;
printf ("%s\n", (char *) * CHAINE); // imprime "foofoo"


Bon je suis pas certain que cela compile comme ca devrait (probablement un avertissement "made int to pointer without specific cast") mais l'idee est la.
Merci cela clarifie pas mal de chose, même si je ne sais pas ce qu'un un algo de "hashtable", mais j'irais voir.

Je bloque encore un peu néanmoins .
Si tu as un peu de temps ...
En y réfléchissant je crois que c'est là que je me perds:
Code:
string sChaine ="";
while(...)
{
       sChaine+="foo";
}
Je ne crois pas que la boucle change grand chose au problème mais bon... Là je vois pas comment le compilateur peut s'en tirer pour donner une longueur à sChaine. Evidement si sChaine est aussi un pointeur vers un char* la question ne se pose pas. Mais il faut bien qu'elle soit quelque part, la chaîne obtenue à la fin, et donc que le compilateur ait pu extrapoler sa longueur... Il est un peut tard en même temps donc si je suis en train de me noyer dans une tasse d'eau, ignore moi.
C'est assez simple, et c'est la raison pour laquelle la manipulation de chaines de caractères est si coûteuse. Lorsque tu fais face a une concaténation de chaines, ce n'est pas la chaine originale qui est agrandie, mais plutôt le compilateur crée une nouvelle chaine ayant la longueur de la somme des deux autres. En C cela serait similaire a:

char * foo1 = "foo1";
char * foo2 = "foo2";

// foo1 += foo2;
char * tmp = foo1;
int i;
foo1 = (char *) malloc ( (strlen(foo1) + strlen(foo2) + 1) * sizeof (char) );
for (i = 0; i < strlen(tmp); i++)
foo1[i] = tmp[i];
for (i = 0; i < strlen(foo2) ; i++)
foo1[i + strlen(tmp)] = foo2[i];

Biensur ce n'est pas la meilleure façon de le faire en C (on n'a qu'a utiliser strcat), mais je voulais illustrer le principe (sans compter que ce code a actuellement une fuite de mémoire -- ancien contenu de foo1 est encore en mémoire et perdu). Le "+1" est pour stocker la valeur NULL a la fin, que ici j'assume est donner par défaut par malloc (ce qui n'est pas nécessairement vrai sur toutes les plateformes).

Sachant ceci, tu peux t'imaginer que le NWScript suivant est un gaspillage de ressources extravagant:

string foo = "";
int i;
for (i = 0; i < 10; i++)
foo += IntToString(i);

(ceci va créer lors de son exécution 10 string temporaires, et faire n (n+1)/2 donc 55 copies de caractères .. c'est un algorithme d'ordre O(n^2)... ouch)

Un bon compilateur C est capable de reconnaitre des structures de ce type et de les optimiser les transformant en:

char * foo = (char *) malloc (11 * sizeof (char));
int i;
for (i = 0; i < 10; i++)
foo[i] = '0' + i;

(ceci ferait exactement 10 assignement de caractere, produisant un algo d'ordre O(n))

Mais ce n'est pas le cas du compilateur de Aurora... le compilateur de Torlack effectue un peu plus d'optimisation que celui de BioWare, mais il ne reconnaitrait pas un algo comme celui ci (son compilateur ne fait qu'optimiser en sauvant des sauts de branche).

Ceci dit, je crois qu'il est évident qu'il est beaucoup plus avantageux d'encoder sous forme d'entier plutôt que sous forme de string. Je crois que ma branche de carrière devient de plus en plus évidente. Si vous n'avez pas devine, je suis ingénieur en informatique spécialisé en programmation de système d'exploitations et en compilateurs.
En tout cas, c'est une bonne nouvelle que tu connaisse maintenant ce forum .
Vu tes compétences, même si tu ne passes que de temps en temps, ce sera déjà très profitable pour nous tous .

Oui j'ai regardé le code de ta dernière version, et il est vraiment très bien. Par contre c'est une mauvaise nouvelle pour moi que les manipulations de chaînes soit si coûteuses en NWScript....
(Enfin c'est sûr qu'il ne pouvait pas laisser des "chaînes" comme en C, un peu trop compliqué pour un langage qui se veut quand même "grand public", enfin...)
Citation :
Provient du message de Jedaï
Par contre c'est une mauvaise nouvelle pour moi que les manipulations de chaînes soit si coûteuses en NWScript....
(Enfin c'est sûr qu'il ne pouvait pas laisser des "chaînes" comme en C, un peu trop compliqué pour un langage qui se veut quand même "grand public", enfin...)
Si quelqu'un était assez aventureux pour entreprendre l'implémentation d'un compilateur faisant l'optimisation, cela serait moins coûteux sur le produit final. Ne demandez pas a Torlack de le faire, j'ai déjà touche le sujet avec lui et c'est trop gros comme projet pour le temps qu'il est prêt a y allouer. Il y a des chances par contre que OpenKnights le fassent éventuellement.
Citation :
Il y a des chances par contre que OpenKnights le fassent éventuellement.
Une bonne très bonne nouvelle. Mais je crois que vous avez déjà pas mal de pain sur la planche . Je ne me rends pas compte (du tout, comme tu dois t'en douter) de la difficulté de porter un compilateur pour nwscript d'un système d'exploitation à l'autre. Ce serait tout de même un comble que Linux et MacOS aient un meilleur compilateur que Windows .
Citation :
Provient du message de Sire Pom-pom
Une bonne très bonne nouvelle. Mais je crois que vous avez déjà pas mal de pain sur la planche . Je ne me rend pas compte (du tout, comme tu dois t'en douter) de la difficulté de porter un compilateur pour nwscript d'un système d'exploitation à l'autre. Se serait tout de même un comble que Linux et MacOS aient un meilleur compilateur que Windows .
Ce serait comique. Les deux plateformes jugées indignes de Aurora par BioWare ayant des outils plus efficaces.
Peut-être y aura-t-il une bonne âme pour faire profiter les utilisateurs de Windows de vos améliorations (quoi que je comprenne le plaisir que l'on pourrait trouver dans cette revanche), dans la limite du possible étant donné ce que tu dis sur les outils. Où est-ce quasi équivalent à réécrire tout le compilateur (pour ce qui est des librairies C j'ai déjà du mal avec stdio, mais j'imagine que tout est loin d'être standard) ?
Répondre

Connectés sur ce fil

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