Ben je pense qu'on peut faire bien mieux de plein de façon differentes mais la plus simple est de faire ainsi a mon avis
deja pour faire un truc qui marche par tout avec le meme code c de chercher le tag de la cle en fonction du tag de la porte donc prendre la partie gauche du tag de la porte dela guilde des voleurs par exemple comme cela
Tag de la porte VOLEUR_XXXX
je reviendrais sur les XXXX apres
donc je verrais bien un truc du style
object oPC = GetClickingObject();
string sDoor = GetTag(OBJECT_SELF);
string sGuilde = GetStringLeftRight(sDoor, FindSubString(sDoor,"_") );
string sKeyToFind = "CLE" + sGuilde + "_";
Ce qui fait que dans la boucle de test sur la cle on fait la comparaison sur sKeyToFind et non plus sur une valeur en dure...
Bon ca c'est le premier truc
Maitenant sur le XXXX
Je vois plusieurs au moins 2 possibiltes pour ne plus avoir qu'un seul et unique test a l'interieure de la boucle.
- Une possibilite qui fait qu'il faut connaitre le binaire c-a-d qu'il faut reussir a transformer le 110 sans se tromper en valeur decimale etc... pour ensuite faire un seuk et unique test en binaire avec le & (operateur de comparaison de bit)
en gros dans le cas ici tu considere une porte avec la chaine 100
et une cle 110
le but est de traduire 100 en decimal, sauf erreur de ma part cela fait 4
pareil pour 110 cela 6
donc on a une porte qui s'appelle VOLEUR_4 et une cle qui s'appelle CLEVOLEUR_6
on recupere les 2 chaines de caractere a droite du "_"
on les passes en int
Le code apres le test sur la cle devient donc un truc du style
string sAutorisationCle = GetStringRight(sItem, FindSubString(sItem,"_") - 1); // on recupere ce qu'il y a apres CLEVOLEUR_
string sAutorisationPorte = GetStringRight(sDoor, FindSubString(sDoor,"_") - 1); // on recupere dans le tag de la porte ce qu'il y a apres le DOOR_
int icle = StringToInt(sAutorisationCle);
int iporte = StringToInt(sAutorisationPorte);
if (icle & iporte)
{
OpenGuilde();
}
- Une autre possibilite qui est hyper simple c'est de mettre tout a l'envers (a noter dans la possibilte au dessus ca marche dans les 2 sens
) par rapport a la notation prise sur les codes au dessus pour les autorisation de porte
par exemple la premier niveau de porte c'est pas 1000 mais 0001
le 2nd c'est pas 0100 mais 0010, le troisieme c'est pas 0010 mais 0100 et le 4eme c'est pas 0001 mais 1000
Et donc du coup facile si la cle qui ouvre le 4eme niveau doit ouvrir aussi le 1er, 2nd, le 3eme c'est facile car 1000 >= 0001 (pour le 1er lvl)
1000 >= 0010 (pour le 2nd lvl)
1000 >= 0100 (pour le 3eme lvl)
1000 >) 1000 (pour le 4eme lvl)
ce qui nous donne un code bien facile
string sAutorisationCle = GetStringRight(sItem, FindSubString(sItem,"_") - 1); // on recupere ce qu'il y a apres CLEVOLEUR_
string sAutorisationPorte = GetStringRight(sDoor, FindSubString(sDoor,"_") - 1); // on recupere dans le tag de la porte ce qu'il y a apres le DOOR_
int icle = StringToInt(sAutorisationCle);
int iporte = StringToInt(sAutorisationPorte);
if (icle >= iporte)
{
OpenGuilde();
}
Voila bon la premiere solution fait jouer les masques binaires ce qui veut dire qu'on peut reussir a faire des trucs assez complexes du style une porte 0100 une 0010 une 1000 et une cle qui ne peut ouvrir que la 3eme et la 2nd donc la cle aura 1010 sans ouvrir la 1ere
Alors qu'avec la 2 eme solution c'est assez basique tu suis absolument les niveaux