Une clef multiserrure (avec plusieurs tags de serrure)

Répondre
Partager Rechercher
Post
Avant d'aller faire dodo, en fait j'ai modifié les deux lignes suivantes commençant par :

string sKey = ...

string s2 = ...

Autrement les lignes que j'avais rajouté, c'était pour faire
les tests, pour voir le résultat des commandes sur les tags
en cours de jeu, cela aide des fois.

Bonne nuit :baille:
Ok je comprend mieux alors. Un repos bien mérité. Le script fonctionne à merveille. Bonne nuit Aldech et MERCI encore, car j'ai cru qu'on allait devenir fou. Enfin surtout toi je pense, car moi j'ai rien fait en fait dans cette histoire juste quémander et râler

Le sujet est je pense clos maintenant grâce à toi, car je pense pas que l'on puisse faire mieux que ça comme script. Il est tout simplement (euh compliquement plutôt ) parfais.
salut^^
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

Code PHP:

object oPC GetClickingObject();
  
string sDoor GetTag(OBJECT_SELF);
  
string sGuilde GetStringLeftRight(sDoorFindSubString(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
Code PHP:

string sAutorisationCle GetStringRight(sItemFindSubString(sItem,"_") - 1);  // on recupere ce qu'il y a apres CLEVOLEUR_ 
string sAutorisationPorte GetStringRight(sDoorFindSubString(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

Code PHP:

string sAutorisationCle GetStringRight(sItemFindSubString(sItem,"_") - 1);  // on recupere ce qu'il y a apres CLEVOLEUR_ 
string sAutorisationPorte GetStringRight(sDoorFindSubString(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
lol

Parce que ce qui est simple ne se voit pas toujours du premier coup tiens regarde encore plus simple
CLEVOLEUR_1 pour ouvrir les portes de la guilde voleur du 1er niveau
CLEVOLEUR_2 pour ouvrir celle du premier et 2nd
CLEVOLEUR_3 pour toutes les portes du lvl 1 a 3
etc...

avec le meme test que la 2nd solution c'est encore plus simple et en plus t'es pas oblige de prevoir un nombre de chiffre correspondant a un nombre de niveau....
tu peux avoir CLEVOLEUR_12 si tu veux 12 niveaux d'autorisation de porte dans ta guilde...

pfuuut ce qui est simple ne se voit pas forcement du premier coup

euh la maintenant plus simple que cela je vois pas
L'erreur vient du fait que la fonction GetStringRight() fonctionne avec une longueur et non pas une position, ici il faut mettre 3 pour avoir les 3 derniers caractères.

http://www.nwnlexicon.com/compiled/f...ringRight.html

D'autre part c'est dangereux d'appeler une fonction à l'intérieur d'une autre fonction en NWScript, ici ça fonctionne mais cela peut ne pas marcher^^.

donc:
Code PHP:


GetStringRight
(sItem3) ; 
Cela fonctionnait dans le premier cas car FindSubString() renvoyait 4 pour les tags commençant par "DOOR_" donc avec -1 on obtenait 3. Dans le deuxième cas "CLE_" donne 3 et avec -1 on obtient 2 ce qui renvoyait par exemple "11" au lieu du "111" voulu.

D'ailleurs si on avait dû utiliser FindSubString on aurait dû écrire :

GetStringRight(sItem, FindSubString(sItem, "_")+1) ;

C'est ce qui m'a mis la puce à l'oreille^^.
Répondre

Connectés sur ce fil

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