gerish escribió:
¿que solo comprueva el ... ¿primer carácter????
Pues no lo se, si que es cierto que he testeado decenas y decenas de veces este programa y hace lo que le da la gana ... según que password pones (la primera vez) al poner la segunda si no es la misma actua como si lo fuera.
En caso de funcionar como debe, si pones el segundo password diferente al primero muchas veces acaba aceptandolo ...
no entiendo ...
miraré casi muerto haber si encuentro algo nuevo
Pues sí, estás comprobando sólo el "contrasena1->1"... que es sólamente el elemento número 1 ( o sea, el segundo, ya sabes que el primero es el 0) el cual podría o no coincidir, pero no tienes en cuenta el resto de caracteres de la contraseña.
Para más coña (ya te digo que esto tiene su gracia

) la rutina KeyboardPrimitive() no es enteramente...
inocente... quiero decir, trastea con su buffer, en nuestro caso el array contrasena1 o contrasena2. Tras su paso deja el primer elemento (el 0, recuerda) con la longitud del buffer y el segundo (el 1) con la longitud de la cadena tecleada por el jugador (de hecho, lo habitual es que no coincidan exactamente). El resultado es que al comparar contrasena1->1 y contrasena2->1 te saldrá siempre positivo si tienen la misma longitud, es decir, si el jugador ha tecleado cualquier cadena de la misma longitud que la contraseña... vamos, que si la contraseña es
pepe y el jugador teclea
caca la rutina creerá que la clave es correcta ^_^''
Te meto en spoiler una alternativa más o menos comentada que todavía debe pulirse un poquito:
[spoiler]Vamos a poner, por ejemplo, que la contraseña correcta sea "flipi". Comenzamos definiendo los arrays:
Código:
array contrasena1 string " flipi";
array contrasena2 string 6;
Ahora toca leerse el texto sobre los arrays y cadenas para entender las implicaciones de especificar lo de "string"... y... ¿por qué habre´puesto un espacio en blanco al principio de la contrasena1? Huuum...
Metemos los includes de rigor:
Código:
Include "EParser";
Include "Acciones";
Include "Gramatica";
Ponemos la rutina inicializar:
Código:
[inicializar;
for(::)
if (confirmar_contrasena()==true) break;
localizacion=limbo;
];
Si repasa la sección de Documentate que trata sobre los bucles verás que he puesto un bucle infinito que llama una y otra vez a la rutina confirma_contrasena
hasta que esta devuelva
true, cosa que no sucederá, como veremos más abajo, hasta que el jugador no meta la contraseña correcta, tras lo cual hace que la localización sea el limbo y comienze la aventura en sí misma.
Y esta es la rutina confirma_contrasena con todo el meollo:
Código:
[confirmar_contrasena x;
print "Introduce password:^^";
KeyboardPrimitive(contrasena2);
for(x=2:x<=contrasena1->0:x++)
{
if (contrasena1->x ~= contrasena2->x)
{
print"Password INCORRECTO^";
rfalse;
}
}
"^Password CORRECTO^";
];
Fijate que ahora, tras llamar a KeyboardPrimitive, no se contenta con mirar sólo uno de los caracteres, como tu hacías, sino que se mete en un bucle que los compara todos uno a uno. En cuanto encuentra uno que no coincide salta y dice que es incorrecto y retorna con el valor false a la rutina inicializar que lo volverá a llamar hasta que meta la clave buena.
Como estás viendo, el bucle que los compará letra a letra recorre los valores o posiciones del array desde la 2 a la indicada en "contrasena1->0" (que, como sabrás, almacena la longitud de la clave original, de nuevo leerse con muucha calma el texto sobre arrays y cadenas). ¡Un momneto! ¿y por qué desde la 2 y no desde la 1 o la 0 que parecería lo normal?
Pues porque la posición cero almacena un byte con la longitud de la cadena (hasta ahí bien) y una de las "gracias" que hace KeyboardPrimitive (en realidad no ella, sino la sentencia de ensamblador de la máquina Z a la que llama, "read" es colocar en el segundo elemento (el nº 1, recuerda siempre lo de que el primero es el 0) la longitud de lo que haya introducido exactamente el jugador. Evidentemente sus buenos motivos tiene y lo hace para bien, pero en este caso implica que empecemos a comparar desde el tercer elemento (el nº 2) de contrasena2. Como eso no ha sucedido en contrasena1, he recurrido a la chapuzilla de meter un espacio en blanco al principio de ella para que la comparación elemento a elemento coincida adecuadamente.
Y tras todo ello solo queda meter la localidad limbo y... ¡a jugar!

Código:
object limbo "limbo"
with descripcion "¿Como has llegado aquí?^
Malditos betatesters...^^",
has luz;
[/spoiler]
La parte buena es que funciona estupendamente en máquina Z y la mala es que, como cabía esperar de un apaño semejante, en Glulx compila, pero no funciona ni para atrás, debido, en principio, al modo sustancialmente distinto en que funcionan en una y otra la rutina KeyboardPrimitive. Estoy mirando, sin mucho éxito, a ver cómo podría hacerse, pero me temo que la cosa me supera bastante.
¿alguna idea?