Entrada/Salida a fichero
La mayoría de los sistemas de programación de aventuras tienen
previsto algún tipo de entrada/salida a fichero, aunque sólo sea para
crear y leer partidas guardadas en disco. Inform Glulx permite al
programador crear y leer ficheros con cualquier tipo de contenido. Por
ejemplo, puedes escribir una serie de juegos con el mismo
protagonista, y transferir información sobre el personaje de un juego
al siguiente. Esto puede hacerse si el primer juego crea un fichero
que contiene la información pertinente, y el segundo lo lee. He aquí
cómo.
Para crear un fichero, lo primero de todo, debes crear un objeto
conocido como fileref
, de modo que el programa tenga una forma de
referirse al fichero. Esto se puede hacer de dos formas. Si quieres
que el nombre del fichero sea fijo, siempre el mismo, elegido por el
programa, el comando es glk_fileref_create_by_name;
si prefieres que
sea el jugador el que elija el nombre del fichero, usarás
glk_fileref_create_by_prompt
. Ambos necesitan tres parámetros.
El primer parámetro indica qué tipo de fichero queremos
crear. Consiste en dos constantes, unidas por un signo más. La primera
constante será fileusage_Data
(otras posibilidades se usan sólo para
ficheros con partidas grabadas y similares). La segunda constante será
o bien fileusage_BinaryMode
o fileusage_TextMode
; el modo Binary se
usa para ficheros que sólo serán leídos desde otros juegos Glulx (como
en el ejemplo de antes que almacenaba datos del personaje), mientras
que el modo Text es para ficheros que puedan ser leidos por el jugador
(como una lista de cosas divertidas para probar en el juego, un
certificado de haber finalizado, o lo que se te ocurra).
El tercer parámetro (veremos el segundo en un momento) es la ROCA del
fichero que vamos a crear. Las rocas para filerefs son análogas a las
de las ventanas o los canales de sonido. Por supuesto, si estás
creando un fichero simplemente para escribir información en él y
cerrarlo a continuación, no necesitarás una roca, ya que las rocas son
para seguir la pista a los objetos Glk entre diferentes sesiones de
juego, y no va a ocurrir un cambio de sesión a mitad de la escritura
del fichero. Así que en este caso puedes poner un 0 para este
parámetro. Si necesitas mantener el fichero abierto durante varios
turnos, en cambio, necesitarás crear una roca para él.
El segundo parámetro depende del método de creación del fichero. Si lo
has creado en la forma en la que el programador especifica el nombre
del fichero, aquí sería donde iría ese nombre. Sin embargo, hay dos
complicaciones. En primer lugar, querrás que el nombre de fichero
funcione en diferentes ordenadores y plataformas, así que lo más
fiable es que te limites a nombres con ocho caracteres o menos (ya que
algunas plataformas no pueden manejar nombres más largos). En segundo
lugar, no puedes simplemente poner el nombre del fichero en este
punto, sino que tienes que envolverlo en una llamada especial:
ConvertAnyToCString()
. Por ejemplo, para crear un fichero llamado
INFO
en el que poder escribir después, habría que poner:
fref = glk_fileref_create_by_name(fileusage_Data+fileusage_BinaryMode,
ConvertAnyToCString("INFO"), 0);
|
Si vas a dejar que el jugador elija el nombre del fichero, el segundo
parámetro contiene información sobre el tipo de fichero que se va a
crear. Ya que se usa el mismo comando para crear ficheros de lectura o
de escritura, aqui hay cuatro opciones:
filemode_Read
: El fichero tiene que existir ya previamente. Al
jugador se le pedirá que elija uno de los ficheros ya existentes
para ese uso concreto.
filemode_Write
: El fichero no debe existir; si el jugador
elige un fichero ya existente, se le avisará de que los contenidos
serán reemplazados.
filemode_ReadWrite
: El fichero puede existir o no, si ya
existe se avisará al jugador de que será modificado.
filemode_WriteAppend
: El comportamiento es el mismo que el
anterior, pero debe usarse para añadir información al fichero en el
caso de que éste ya exista.
En este caso podríamos terminar con una llamada como:
fref = glk_fileref_create_by_prompt(fileusage_Data+fileusage_BinaryMode,
filemode_Write, 0);
|
Una vez que has obtenido el fileref
, puedes abrir el fichero:
str = glk_stream_open_file(fref, filemode_Write, 0);
|
El segundo parámetro es uno de los filemode
s que hemos listado
antes. Si has pedido el nombre del fichero al jugador, debe ser el
mismo filemode
que usaste antes.
Una vez que el fichero ha sido abierto, podemos deshacernos del
fileref
:
glk_fileref_destroy(fref);
|
Para escribir, hacemos que el stream actual sea ese fichero, y después
imprimimos texto normalmente (como si fuera para la pantalla):
glk_stream_set_current(str);
print "PUNTOS DE EXPERIENCIA: ", jugador.exp, "^";
|
Una vez finalizado, volvemos a la ventana principal, y cerramos el
stream:
glk_set_window(gg_mainwin);
glk_stream_close(str, 0);
|
El segundo parámetro de glk_stream_close()
, al igual que en
glk_window_close()
, sólo tiene interés si quieres conocer cuántos
caracteres han sido escritos o leídos. En cualquier otro caso, usa
cero.
Para leer de un fichero, el proceso es muy similar, solo que usando
filemode_Read
. Las funciones para leer los datos son glk_get_char_stream()
para leer un único carácter, glk_get_buffer_stream()
para leer un
array de bytes, y glk_get_line_stream()
para leer una línea de
bytes, hasta el siguiente carácter de línea nueva.
Mira el paquete Ork
para más detalles. (Ork 1 genera un fichero con
información sobre el jugador; Ork 2 permite al jugador cargar el
personaje que quieran, o empezar de cero.)