Diseñando una aventura conversacional" - Parte 2

Por Spellcaster

Traducido por DCG

Manos a la obra

Una vez asimilado más o menos lo que os comentábamos en el número anterior, ya podemos empezar a codificar algo… Primero deberíamos ocuparnos de las habitaciones. Cada localización será una tupla (record) que contendrá la información de las salidas, y la propia descripción de la habitación:

Type TipoLocalizacion=Record

        Desc: Array[1..10] of String[79];

        Norte, Sur, Este, Oeste: Byte;
End;

La descripción es un array de strings, con sólo 79 carácteres por string ya que en la pantalla sólo nos cabrán 80 líneas, y además deberás tener en cuenta el retorno de carro. De hecho, es posible que no necesites las 79 columnas, ni tampoco las 10 líneas de texto. Si es así, deja una línea como '*' a continuación de la última línea de texto. Y si usas las 10 líneas, no hace falta que pongas '*'.

Como tendrás varias localizaciones, deberás tener un array con todas ellas:

ConstNumeroLocalizaciones=22;
Var Localizaciones:Array[1..NumeroLocalizaciones] of TipoLocalizacion;

El contenido de los campos Norte, Sur, Este y Oeste nos indicarán a que localización se va siguiendo esa dirección. Un cero indicará que no habrá salida en esa dirección. Por ejemplo, si Localizaciones[1].Norte=2 querrá decir que si desde la habitación 1 se va al norte, se irá a la habitación 2.

Fanglore usará un fichero, que llamaremos Room.Dat, y que contendrá todos los datos de las habitaciones. La rutina que usaremos para leer ese fichero será la siguiente:

Procedure LeerDatosLocalizaciones;
Var F:Text;

A,B:Byte;
Flag:Boolean;
Begin
        { Preparamos el fichero de texto }
        Assign(F,'Room.Dat');
        Reset(F);
        { Para todas y cada una de las localizaciones del juego }
        For A:=1 To NumeroLocalizaciones Do
        Begin
                { Limpiamos la descripción de la localización }
                For B:=1 To 10 Do Localizaciones[A].Desc[B]:='';
                { Leemos la descripción de la habitación }
                Flag:=True;
                B:=1;
                While Flag Do
                Begin
                        Readln(F,Localizaciones[A].Desc[B]);
                        If (B=10) Or (Localizaciones[A].Desc[B]='*') Then Flag:=False;
                        Inc(B);
                End;
                { Leemos las salidas }
                Readln(F,Localizaciones[A].Norte);
                Readln(F, Localizaciones[A].Sur);
                Readln(F, Localizaciones[A].Este);
                Readln(F, Localizaciones[A].Oeste);
        End;
        Close(F);
End;

La rutina es bastante clara, aún así hay algun que otro punto que es mejor que repasemos. Quizá te estés preguntando porqué limpiamos la descripción de las habitaciones antes de que las carguemos, si cuando lo hacemos no hay nada. La razón es que al crear una variable, Pascal la coloca en cualquier lugar de la memoria donde pueda caber y el caso es que allí puede haber cualquier cosa, y Pascal no hace limpieza… En programación, resulta una práctica muy aconsejable el limpiar el contenido de una variable antes de usarla (jeje, me parezco a uno de mis profesores). Segundo, no sé si ya os he comentado lo que hace la instrucción Inc. Lo que hace es incrementar el valor de una variable en una unidad (si no se especifica ningún parametro. Así que Inc(B) equivale a B:=B+1, y Inc(B,2) es igual a B:=B+2…

Bien, la llamada a esta rutina debería producirse desde otra rutina (Init, o algo así), la cual se encargará de inicializar todas las variables y de preparar el juego. En esta rutina habrán más cosas, pero de momento lo que tenemos es:

Procedure Init;
Begin
        LeerDatosLocalizaciones;
End;

Y la rutina Init debería ser llamada, a su vez, por el programa principal. Lo que tendremos aquí (de momento) será:

Begin
        Init;
End.

Todo esto lo encontrarás ya tecleado en el fichero FangLore.Pas…

NOTA: Cualquier fichero generado con el programa RoomGen puede se alterado a mano, es decir via editor ASCII. Podrás arreglar los errores que vayan saliendo y editar tanto como quieras el fichero aunque, ¡no te olvides de guardarlo como un fichero ASCII!

En el próximo número, te mostraré como el analizador de entradas, con alguno que otro de los verbos más básicos… Hasta entonces, trátalo de hacer tú mismo… :)

NOTA DE SPANISH QUEST: En los primeros números de 'The Mag' se realizó un cursillo de Pascal la mar de majo. Como comprenderéis no es cuestión de que lo reproduzcamos aquí, después de todo esto es una revista sobre aventuras, y no de programación. A los que no conozcáis Pascal y sepáis inglés os remito directamente a 'The Mag'. A los demás buscaos un buen tutorial en castellano, que seguro que los habrá perdidos en algún rincón de la red o miraros alguno de esos CD-ROMS que regalan las revistas, que puede que venga algun tutorial o cursillo interactivo de Pascal. Si el Pascal no os va, o simplemente conocéis algún otro lenguaje (BASIC, no gracias) no os será nada complicado el pasarlo.

Ficheros (cortesía de Spellcaster):

Volver al índice