Q'AECHO ESTO?

Por... Melitón Rodríguez, el de la 117

Qué Passa!

Antes de seguir con las explicaciones del CAECHO?, el JAPS me ha dicho que os diga lo siguiente:

  1. La versión completa 1.3 (la que vendemos por 1.200 ptas) trae un editor de caracteres propio. Lo digo porque creo que no queda claro y la versión SHARE no lo tiene.
  2. Ya está a la venta la versión 2.0 que puede comprarse por 3.000 ptas. Esta versión soporta gráficos y texto simultáneamente en VGA, en los formatos 320x200 256 colores y 640x480, 640x350, 640x200 16 colores. Además trae el manual impreso y el espacio libre del disco se utiliza para incluir más juegos de caracteres, programas de ejemplo y una versión muy mejorada de APACHE. También se ha modificado el generador de caracteres que ahora permite crear caracteres de cualquier altura. En el CAAD tendréis disponible unas demos con lo que el CAECHO? 2.0 puede hacer y en breve una versión SHARE. Casi se me olvida, por si fuera poco hemos mejorado los programas, acelerado los cargadores de gráficos, reducido el tamaño del interprete...
  3. Simultáneamente hemos terminado la versión AMIGA del CAECHO? 2.0. Como ya he dicho en alguna ocasión esta versión permite leer los ficheros .FUE de la versión PC y ejecutarlos por lo que tan sólo haciendo la versión PC o AMIGA se consigue tener la aventura en los dos formatos. La versión AMIGA, por supuesto, mezcla gráficos con texto en la misma pantalla, es capaz de tocar cualquier módulo SoundTracker (música y ruidos) y soporta gran diversidad de formatos diferentes (aparte de correr en multitarea y poder crear aventuras llamables desde el Workbench).

La versión AMIGA se puede conseguir de dos formas:

Una vez aclaradas estas cuestiones continuemos explicando el CAECHO?. Lo último que vimos fue el uso de PREG y los BUFFERES. Hoy vamos a explicar el uso de ANALIZA y HAZ.

Para que el jugador pueda interactuar el analizador de frases debe conocer las palabras que debe comprender, estas se indican en la sección de vocabulario. En esta sección (encabezada por '\VOC') se incluyen una serie de palabras (separadas por punto y coma) indicando en cada una su función gramatical (el tipo de palabra para nosotros) y su número. Las palabras con el mismo número se consideran sinónimos (a semejanza del PAWS). Veamos un ejemplo típico de vocabulario.

        \VOC
        N 4 Nombre; Algo 5 Nombre; Coger 5 Verbo;
        Coge 5 Verbo; de 5 Preposicion;

Lo único a tener en cuenta es que el número debe ser entre 4 y 9999, y que el tipo de palabara se escribe sin acento (las mayusculas no tienen importancia); así como que el número de letras significativas es seis.

La acción ANALIZA toma una frase de un buffer y la analiza colocando el código de las palabras que reconozca en las banderas cardinales adecuadas. Lo mejor es que miráseis el manual, pero estas banderas son:

        10. Verbo.
        11. Primer nombre.
        12. Segundo nombre.
        13. Adjetivo del primer nombre.
        14. Adjetivo del segundo nombre.
        15. Adjetivo cardinal del primer nombre.
        16. Adjetivo cardinal del segundo nombre.
        17. Preposición del primer nombre.
        18. Preposición del segundo nombre.
        19. Primer adverbio.
        20. Segundo adverbio.

        41. Tercer nombre.
        42. Adjetivo del tercer nombre.
        43. Preposición del tercer nombre.

Veamos un pequeño ejemplo de esto. Usaré la acción FIN, que provoca el final total de una aventura y la construcción HAZ, esta construcción es de la forma:

            HAZ valor
            {
            valor1:{Trozo1}
            valor2:{Trozo2}
            ....
            SINO {TrozoFinal}
            }

Básicamente lo que hace es: comprueba si 'valor' coincide con 'valor1', si es así ejecuta 'Trozo1', sino compruebe si 'valor' coincide con 'valor2', y si es así ejecuta 'Trozo2'... si 'valor' no coincide con ninguno de ellos ejecuta 'TrozoFinal'. (Esta última línea no tiene porqué ponerse, en tal caso si 'valor' no coincide con ninguno de ellos simplemente no se hace nada.)

\VOC
    Rojo 5 Verbo;
    Verde 6 Verbo;
    Azul 7 Verbo;
    Marrón 8 Verbo;
    FIN 9 Verbo;

    y 5 conjuncion;

\MEN 0
    \0 ""\zrRojo.\zl""
    \1 ""\zvVerde.\zl""
    \2 ""\zzAzul.\zl""
    \3 ""\zmMarrón.\zl""
    \4 ""\zfbr\zblNO TE ENTIENDO.\zfn\zl""
    \5 ""\zlTeclea: \zrRojo\zl,\zvVerde\zl,\zzAzul\zl,\zmMarrón\zl o FIN:\n >>""

\BLO
    BLOQUE [0] Colores()
    {
    COPI 0 47;      /: Tabla donde está el Prompt :/
    COPI 5 48;      /: Mensaje del Prompt :/
    MIENTRAS (IGQ 0 [0])    /: Un bucle infinito :/
        {
        PREG 0;
        ANALIZA 0 1;
        HAZ [10]        /: Toma el verbo de la frase tecleada :/
            {
            Rojo:{MENSAJE 0 0;}
            Verde:{MENSAJE 0 1;}
            Azul:{MENSAJE 0 2;}
            Marrón:{MENSAJE 0 3;}
            FIN:{FIN;}
            SINO {MENSAJE 0 4;}
            }
        }
    }

¿Habría alguna otra forma más sencilla de realizarlo? ¿Qué ocurre si tecleáis: 'Rojo, azul y verde'.? Pensadlo.

Ahora vamos a intentar algo diferente, vamos a hacer una mini aventura con justo lo necesario para que el jugador se mueva entre tres localidades. Para definir las localidades, usaremos la siguiente sintaxis:

\LOC
    \n nom adj ""nombre"" ""descripción"" camposboolenos< camposcardinal<
        $ Salidas
    

Donde:

-nom y adj: serían el nombre y adjetivo del vocabulario que irían asociados a la localidad (para cosas como: "Ve al castillo").

-nombre: se puede usar para el típico mensaje que ponía AD en la esquina superior derecha de sus aventuras para indicar donde te encontrabas, se puede usar para muchas más cosas, ya iremos viendo.

-descripción: es el típico mensaje que se imprime cuando entras en una localidad o tecleas: "mirar".

Las localidades en CAECHO? tienen una serie de banderas asociadas, es decir a parte de las 500 banderas cardinales (pueden contener números) y las 500 boolenas (pueden contener VERDADERO o FALSO), el programador tiene disponible 16 banderas cardinales y 16 boolenas por cada localidad que ponga en su aventura para guardar información de esa localidad en particular. Ya veremos como se usan.

Por último, las salidas se ponen en la forma:

Dirección puerta localidaddestino; Dirección puerta localidaddestino;...

Donde:

-Dirección: es un verbo del vocabulario que indica una conexión de la localidad.

-puerta: es un valor que indica el estado de ésa conexión, el programador de la aventura puede usarlo como desee, de momento pondremos un cero.

-localidaddestino: la localidad a la que lleva esa conexión.

Comencemos a escribir la aventura, lo primero será escribir el vocabulario. En esta ocasión tan sólo usaremos los cuatro verbos de las cuatro direcciones cardinales y FIN:

\VOC
    NORTE 4 Verbo; N 4 Verbo;
    SUR 5 Verbo; S 5 Verbo;
    ESTE 6 Verbo; E 6 Verbo;
    OESTE 7 Verbo; O 7 Verbo;
    FIN 8 Verbo;
    

Ahora toca el momento de meter las tablas de mensajes, como vamos a empezar escribir una aventura completa de verdad, deberíamos incluir la tabla de mensajes del sistema completa. Esta está en el manual así como en todos los .FUE que vienen con el disco del sistema, sería:

\MEN 0
    \0 "", ""
    \1 "" y ""
    \2 "".\n""
    \3 ""\ix""
    \4 ""No sé a qué te refieres con el pronombre.\n""
    \5 ""\lx""
    \6 ""el ""
    \7 ""la ""
    \8 ""un ""
    \9 ""una ""
    \10 ""Ya tengo \ix.\n""
    \11 ""No hay se eso por aquí.\n""
    \12 ""\ix me pesa demasiado.\n""
    \13 ""No puedo coger \ix; llevo demasiadas cosas.\n""
    \14 ""He cogido \ix.\n""
    \15 ""No veo nada y sin ver no puedo hacerlo.\n""
    \16 ""Teclea el nombre del fichero:\n>> ""
    \17 ""\zbvPulse una tecla...\zbg""
    \18 ""No cabe \ix en ""
    \19 ""No tengo eso.\n""
    \20 ""He dejado \ix.\n""
    \21 ""Ya me puse \ix.\n""
    \22 ""Me he puesto \ix.\n""
    \23 ""No llevo puesto de eso.\n""
    \24 ""Me he quitado \ix.\n""
    \25 ""No se puede meter nada en \ix.\n""
    \26 ""He colocado \ix en ""
    \27 ""No puede haber nada en \ix.\n""
    \28 ""No hay de eso en \ix.\n""
    \29 ""He sacado \ix ""
    \30 ""No se puede dar nada \a.\n""
    \31 ""Le he dado \ix ""
    \32 ""No se puede pedir nada \a.\n""
    \33 ""\ix no lleva de eso.\n""
    \34 ""\ix me ha dado ""
    \35 ""\ix ha cogido ""
    \36 ""\ix se ha puesto ""
    \37 ""\ix ha dejado ""
    \38 ""\ix se ha quitado ""
    \39 ""\ix ha colocado ""
    \40 ""\ix en ""
    \41 ""\ix ha sacado ""
    \42 ""\d""
    \43 ""\ix le ha dado ""
    \44 ""\a""
    \45 ""No se puede poner ni quitar \ix.\n""
    \46 ""a ""
    \47 ""de ""
    \48 ""al ""
    \49 ""del ""
    \50 "" ""   /: Espacio necesario para imprimir los mensajes 3 y 44 ó 42 :/
    \51 ""los ""
    \52 ""las ""
    \53 ""unos ""
    \54 ""unas ""
    

Para imprimir las salidas hay en CAECHO? una acción llamada SALIDAS, a la que tan sólo pasándole la localidad, la tabla de mensajes que debe usar y el primer mensaje a usar. Usaremos para esto:

\MEN 1
    \0 ""salida posible: ""
    \1 ""salidas posibles: ""
    \2 ""no hay salida.\n""
    \3 ""norte""
    \4 ""sur""
    \5 ""este""
    \6 ""oeste""
    \7 "" >>""
    \8 ""No puedo hacer éso.""
    

Metamos ahora tres localidades:

\LOC
    /: Las localidades 0 y 1 están reservadas :/
    \2 _ _ """" ""Primera localidad."" < < $ Norte 0 3; Este 0 4;
    \3 _ _ """" ""Segunda localidad."" < < $ Sur 0 2;
    \4 _ _ """" ""Tercera localidad."" < < $ Oeste 0 2;
    

Para realizar el programa vamos a necesitar:

-La acción DESC n, que pone en pantalla la descripción de la localidad 'n'. La localidad donde está el jugador está indicada en la bandera 34, por lo que imprimir la localidad actual del jugador sería: DESC [34];

-La condición CAMINAR c, que intenta moverse en la dirección indicada por la bandera cardinal 10 (verbo último tecleado), desde la localidad indicada por la bandera 'c', poniendo la localidad final en 'c'. Para mover al jugador habría que usar CAMINAR 34. Si hay una conexión en esa dirección será VERDADERA y si no será FALSA.ç

-'Verbo n' es un macro predefinido del sistema y equivale a 'IGQ 10 n'. -La acción LIMPANT que borra todo el contenido de la pantalla.

Finalmente sería:

\BLO
    BLOQUE [0] PrimeraAventura()
    {
    COPI 1 47;      /: Tabla donde está el Prompt :/
    COPI 7 48;      /: Mensaje del Prompt :/
    COPI 2 34;      /: Localidad inicial la 2 :/

    LIMPANT;
    DESC [34];
    NL;
    SALIDAS [34] 1 0;
    MIENTRAS (IGQ 0 [0])    /: Un bucle infinito :/
        {
        PREG 0;
        ANALIZA 0 1;
        (Verbo FIN)         /: Comprobar si el verbo es fin :/
            {FIN;}
        SINO                /: Si no es fin :/
            {
            (CAMINAR 34)    /: Intenta caminar en la dirección adecuada :/
                {
                /: Si lo consigue repetir descripción :/
                LIMPANT;
                DESC [34];
                NL;
                SALIDAS [34] 1 0;
                }
            SINO /: Si no lo consigue poner 'No puedo hacer éso' :/
                {
                MENSAJE 1 8;
                }
            }
        }
    }

Nada más, pensad todo esto e intentad hacer modificaciones y ampliaciones de este programa en vuestras casas.