NMP : RUTINAS AVANZADAS (2)

Es habitual en una aventura encontrarnos con la respuesta "No puedes ir en esa dirección" o similar. Sin embargo, las aventuras más profesionales amplian esa información, obteniendo respuestas del tipo "No puedes ir al este. Las salidas posibles son norte y sur.". Veamos como podemos hacer eso con el parser NMP.

Comenzaremos creando la rutina de salidas, trabajo que es muy fácil con NMP:

Primeramente debemos crearnos una serie de mensajes en la tabla de mensajes número 1, por este orden:

  1. un mensaje del tipo "Puedes ir ", que es el principio de la frase que nos listará las respuestas.

  2. un mensaje del tipo "No hay ninguna salida.", que la rutina mostrará en caso de que no encuentre ninguna salida en la localidad indicada.

  3. una serie de mensajes, cada uno correspondiente a un verbo de dirección. Recordemos que los verbos de dirección son aquellos cuyo número de verbo es menor que 20, es decir, del 0 al 19. Si miramos la tabla de vocabulario veremos que el primer verbo que hay puesto es {1,v,norte}, con lo cual no hay verbo con número 0 (aunque no hay inconveniente en que lo haya). Esto quiere decir que esa lista de mensajes debe empezar por un mensaje vacío, que es el que corresponde al verbo 0, seguir por un mensaje "al norte", luego uno "al sur", y así para todos los restantes verbos de dirección. Si nuestra aventura usa otro tipo de direcciones como "derecha" pues pondríamos los mensajes correspondientes. Tampoco necesitamos poner los mensajes hasta el verbo 19, los verbos que no se usen pueden dejar sus mensajes correspondientes sin definir (en lugar de vacíos), o pueden aprovecharse para otra función.

Bien, supongamos que el primer mensaje (el de "Puedes ir") es el 100, luego el de "No hay salidas" es el 101 y el del primer verbo (el 0) es el 102. Pues bien, la entrada:

        -SALIDAS *
        EXITS @1 100
        DONE
mostraría las salidas.

Vamos ahora a aprovechar esos mensajes y otras ordenes para lograr nuestro objetivo:

Introduzcamos esto en la tabla de respuestas, al final:

        -* *
        clear fAUX1
        lt 18 20
        let fAUX1 @18
        move 1 fAUX1
        btst0 fAUX1 7
        let fAUX1 @18
        plus fAUX1 102
        write {No podía ir }
        mes @fAUX1
        write {. }
        done

        -* *
        lt 18 20
        btst fAUX1 7
        desc

Bien, veamos que hace esto:

Comenzamos poniendo a cero el flag fAUX1, un flag auxiliar (de uso temporal, útil para varias cosas) que nosotros elijamos, y comprobamos que el verbo tecleado por el jugador es de dirección, es decir, menor que 20. Como el número de verbo de la frase actual está contenido en el flag 18 el LT 18 20 hace esa labor. En caso afirmativo copiamos en nuestro flag auxiliar ese verbo y haremos las operaciones con él (para no modificar en ningún momento el flag 18).

Ahora usamos la orden MOVE, que actualiza el valor de un flag (el 1 en este caso, el que guarda la localidad actual) conforme a un verbo de dirección (el contenido en el flag 18, que ahora está en fAUX1, por tanto MOVE 1 @fAUX1). En caso de que la orden MOVE sea capaz de "mover" al jugador en la dirección indicada modifica el flag 1, y pone a 1 el bit 7 del flag auxiliar, por lo que seguidamente compruebo si no ha cambiado, en cuyo caso he de poner el mensaje "No puedes ir al xxxxx". Para ello restauro el valor del flag auxiliar (esto es en realidad innecesario, puesto que el bit 7 ha quedado a 0, por lo que el flag auxiliar no habrá cambiado, pero por claridad del código y para que lo entendáis lo pongo), añado 102 al flag auxiliar, de modo que su valor me corresponda con el número de mensaje correspondiente al verbo de dirección tecleado. Escribo el texto "No puedes ir ", seguido del mensaje correspondiente, y luego un punto. Finalmente acabo la orden con DONE.

¿Qué ocurre en caso de que el MOVE tenga éxito? Pues que se sale de la primera entrada en el BTST0 y pasa a la segunda, donde tras comprobar de nuevo que el verbo es de dirección, y que la orden MOVE tuvo éxito (BTST, esta orden es también redundante si os fijáis un poco en el código) hago un DESC.

La orden write está indocumentada en el manual de NMP, debido a que se añadió poco antes de distribuir la última versión. Su sintaxis es WRITE {texto}, y funciona a partir de NMP 5.01. Puede producir y producirá algún problema con el resaltado de sintaxis del editor, debido a que el mismo no estaba preparado para ella (así que no os extrañe). Todo el texto ha de estar en una sola línea del código, aunque nada impide poner:

        write {hola }
        write {¿que tal?}
Así mismo admite secuencias de escape como los mensajes. Estoy seguro de que a aquellos que aún no la conocéis os resultará muy cómoda.

Esto es todo, si queréis saber más o queréis colaborar con rutinas, comentarios, mejoras de las mismas rutinas o simplemente queréis preguntar alguna duda podéis contactar conmigo. Necesitamos vuestra colaboración, aunque sea con pequeñas rutinas o truquillos :)

Carlos Sánchez
e-mail Internet: csanchez@temple.subred.org
Netmail FidoNet: 2:341/136.39


[Volver]