Otros trucosPausas y tiempo realEntrada/Salida a fichero

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:

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 filemodes 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.)


Otros trucosPausas y tiempo realEntrada/Salida a fichero