gerish escribió:
noo si pasarme
me ha pasado
digo que el ejemplo que se me ha puesto no termino de entenderlo
pero me hago una idea de como funciona
de todas formas me resulta más sencillo trastear con código picado (aun que no lo entienda) que entender algo que he leido decenas de veces sin entenderlo
saludso
Tu haz caso a Jen y no te limites a copiar códigos, trata, hasta donde puedas, de comprenderlos, así en el futuro podrás adaptarlos a tus necesidades (y no tener que adaptarte tu a ellos XDD)
En cualquier caso, vamos con el turrón de la versión Glulx de nuestras contraseñas. Vayamos por partes. El problema ya no es sólo que KeyboardPrimitive rellene de diferente manera en Glulx los elementos de su buffer (que es nuestro array). Para darle más emoción al asunto, resulta que en Z la rutina usa un elemento de Inform, la sentencia "read" inexistente en Glulx. Este "read" entre otras cosas, se encarga por su cuenta de limitar el número de caracteres que el jugador introduzca al tamaño del array que reciba como parámetro, lo cual proporciona la seguridad de que no se sobreescribiran inadvertidamente zonas de memoria que no debieran. Este resorte de seguridad adicional no lo tenemos en Glux, así que hay que procurarlo de alguna manera. Lo que haremos será meter el resultado de KeyboardPrimitive en "buffer", un array de sobrado tamaño predefinido en la librería precisamente para su uso con esta rutina.
Por otra parte en Glulx no "traga" con que no le indiquemos el parámetro de la tabla de parse, como pasaba en Z, así que se lo indicaremos (le señalaremos, precisamente, el array "parse" que ya viene debidamente definido en "Eparser.h"). Vamos allá:
Código:
Constant MAX_LONG_PASSW 10;
!Señalamos en una constante lo que queramos poner como límite
!máximo de la longitud de las contraseñas (en este caso 10). Se
!puede poner el que se quiera, pos supuesto, y además así se
!puede cambiar con comodidad (conque lo cambies en esta linea
!ya te olvidas)
Include "EParser";
Include "Acciones";
Include "Mensajes";
Include "Gramatica";
array contrasena1 -> MAX_LONG_PASSW;
array contrasena2 -> MAX_LONG_PASSW;
!definimos los arrays especificando su tamaño con
!ese valor máximo
[inicializar x;
do
{
print "Introduce password (máximo ", MAX_LONG_PASSW, " caracteres):^";
KeyboardPrimitive(buffer,parse);
}
until (buffer-->0~=0 && buffer-->0<=MAX_LONG_PASSW);
!la farragosa comprobación del final del bucle se encarga de
!garantizar
!que su longitud se halla estrictamente entre uno y 10
!Notese que en Glulx la longitud de la cadena introducida
!por el jugador se almacena en la "palabra" numero "cero" del
!buffer utilizado, (que en Glulx ocupa 4 bytes), por eso nos
!referimos a ella como "buffer-->0" (el motivo se explica
!en detalle en el enlace del otro día sobre las diferencias de
!KeyboardPrimitive en Glulx y Z)
for (x=0:x<=(buffer-->0)-1:x++)
contrasena1->x=buffer->(x+4);
!aquí hacemos otra maniobra nueva, pasamos uno a uno el
!contenido de buffer a nuestro primer array "contrasena1"
!Notese que sacamos a partir de la quinta posicion (la numero
! cuatro) de buffer e introducimos en "contrasena1" a partir de
!la cero (la primera)
!De momento ya tenemos la primera contraseña felizmente
!asegurada en "contrasena1"
for(::)
if (confirmar_contrasena()==true) break;
!llama insistentemente a "confirmar_contrasena" hasta que
!esta devuelva true, igual que la otra vez
localizacion=limbo;
];
[confirmar_contrasena x;
do
{
print "Confirma password:^";
KeyboardPrimitive(buffer,parse);
}
until (buffer-->0~=0 && buffer-->0<=MAX_LONG_PASSW);
!pide la confirmacion de la contraseña, igual que arriba, se
!cuda muy mucho de que lo introducido en "buffer" no se salga
!de los limites, o sea, que no sea una cadena vacía ni mayor de
!10 (o de lo que hayamos puesto en MAX_LONG_PASSW)
for(x=0:x<=MAX_LONG_PASSW-1:x++)
contrasena2->x=0;
!pequeño parche de seguridad, borra uno a uno todo lo que haya
!en "contrasena2". Es para evitar que, tras un intento
!fallido, su contenido quede con restos de una contraseña
!incorrecta (es raro, pero podría suceder)
for(x=0:x<=(buffer-->0)-1:x++)
{
contrasena2->x=buffer->(x+4);
}
!pasa caracter a caracter el contenido de buffer a
!contrasena2, igual que arriba hizo con "contrasena1"
for(x=0:x<=MAX_LONG_PASSW-1:x++)
{
if (contrasena1->x ~= contrasena2->x)
{ print "Password INCORRECTO^";
rfalse;
}
}
"^Password CORRECTO^";
!bucle de comprobacion letra a letra. Tras todas las precauciones
!anteriores, es (casi, siempre casi, recuerda XDD) seguro que
!contrasena1 y contrasena2 tienen el contenido correcto en la
!posición correcta
];
object limbo "limbo"
with descripcion "¿Como has llegado aquí?^ Malditos betatesters...^^",
has luz;
¡Bueno! pues ya tenemos una versión Glulx de nuestro follón de contraseñas... que no funciona en absoluto en Z XDD
Por supuesto, ahora es posible mezclar los dos códigos y hacer un código fuente biplataforma usando debidamente las directivas del compilador adecuadas de tal suerte que el mismo fichero compile correctamente tanto para la una como para la otra...
¡Pero creo que a estas alturas cuanto menos ya sí que has comprendido lo que decía al principio de que esta era una situación para la que Inform no estaba preparado!