 PALIQUE.H. Una librera hbrida para conversaciones basada en las libreras Etemas y fhablaoo.
 Versin 1.2.
 Cortado, pegado y ligeramente modificado por Pedro Antonio Sanz Jimnez.
 E-Mail : pedroantonio77@yahoo.es.

 Crditos originales de Etemas y fhablaoo:


 ETEMAS   Otro enfoque para el parsing de Temas de conversacion
 Versin 2.0 biplataforma
 Para uso con Inform 6.15 Librera 6/7E  (InformATE!)
  o con Inform 6.21 Librera 6/10E (InformATE!)
  (c) 1999-2000 Zak McKraken  (6/Mayo/1999, 17/Octubre/2000)



 fhablaoo V2 (versin biplataforma Z/Glulx) 020408 No Oficial
 (c) Zak 2000
 fhablaoo.h: El sistema de conversacin basado en mens de Fotopia,
 convertido en librera orientada a objetos (oo). Es una adaptacin
 de la librera phtalkoo.h de David Glasser (basada a su vez en el
 cdigo phototalk.inf de Adam Cadre). Primera adaptacin de Zak
 McKracken Enero-2000. Segunda versin biplataforma 18 Octubre 2000.





INSTRUCCIONES DE USO.

La novedad de ste pequeo hbrido es la creacin de una clase palique,
cuyo cdigo es prcticamente igual al de la clase personaje que implementa
fhablaoo.h, excepto un par de cambios estticos y el hecho de que los objetos
derivados no tienen el atributo animado. Tan slo hay que llamar a la funcin
Palicar de un determinado objeto palique para que aparezca su men, tan simple cmo hacer

                                  palique.Palicar()

En otras palabras, cada objeto palique es un dilogo completo en forma de men,
cuyas opciones de dilogo podis activar y desactivar exactamente igual que en fhablaoo
(las funciones para ello son las mismas), y en el que debeis incluir las mismas funciones
miembro que en los de la clase personaje.


NOVEDADES VERSION 1.2

En esta versin se han hecho las siguientes modificaciones:
 -Se han eliminado todos los mensajes de fhablaoo, como "Qe deseas decir?" y otros.
 -Aadida a la clase palique la rutina TestQuipDicho(), que nos permite saber si un quip 
  concreto de un palique ha sido seleccionado alguna vez por el jugador (ver punto 3).
 -Aadida a la clase palique la rutina FinPalique()(ver punto 3.)
 -Aadida una sencilla rutina, InicioQuipsGlobal(), que ejecuta el cdigo para iniciar
 los quips de todos los objetos Palique del juego.
 A continuacin paso a detallar las caractersticas de la librera, lo que sigue es una pequea
variacin de las instrucciones de fhablaoo.h y Etemas.h.

  USO:

  1) Incluir este fichero en cualquier punto despus del "Eparser.h" y de "Gramtica.h".
  2) Definir, (despus de esta inclusin) tantos objetos "Temas-raiz"
  como se quiera, por ejemplo:
   Object TemasVoxPopuli;
   Object TemasdeManolo;
   Object Secretos;


  3) Definir objetos de la clase palique dentro de los objetos anteriores, cada uno de
  ellos con su propiedad 'nombre' que son las palabras que el jugador
  puede usar para referirse a ese tema (no es necesario especificar
  artculos o 'de'). Tamben se pueden meter objetos de tema normales y corrientes,
  como los que se especifican en la librera Etemas, solo que no participaran
  de las caractersticas de los de clase palique (ver punto 5).

  Cada objeto palique puede tener activado el atributo "parsing_estricto" que
  indica que a la hora de "encajar" ese tema, *todas* las palabras
  escritas por el jugador deben encajar con palabras de la propiedad
  'nombre', y en el mismo orden. Tambin puede tener el atributo
  "parsing_normal", segn el cual su nombre se "parsea" como el de
  cualquier otro objeto. Si no tiene activado ninguno de estos
  atributos, el encaje se har de forma ms flexible: Cuantas ms
  palabras de las escritas por el jugador encajen con el nombre, mejor;
  pero las que no encajen se ignoran sin ms.


  Cada uno de los objetos palique debe proporcionar una funcin miembro llamada
  Enunciado(x) y Respuesta(x), que debe imprimir el enunciado de la frase
  numero x, y la respuesta a ese enunciado; La funcin Respuesta(x) puede tambin
  llevar a cabo acciones, adems de imprimir la respuesta (como mover
  un objeto a otro sitio o cambiarle un atributo).

  A partir de ahora llamaremos "quip" a cada posible dilogo de un objeto clase
  palique, es decir, un "quip" es un nmero que identifica una opcin del
  men de dilogo y su correspondiente respuesta. Algunos de los
  "quips" estn activos (y por tanto esas opciones se muestran en el
  men). Otros pueden estar inactivos (y no se mostrarn). Como
  consecuencia de una Respuesta(), pueden activarse y desactivarse
  algunos de los quips, por lo que en la siguiente vez que se hable
  de ese tema el men ofrecido variar (aunque pueden mantenerse
  algunas opciones si sus correspondientes quips siguen activos).

  Cada uno de los objetos palique debe proporcionar tambin una funcin miembro
  llamada InicializarQuips(), que debe activar los quips activos para
  la primera vez que el jugador intente hablar de ese tema. La rutina
  InicializarQuips() debe ejecutarse para todos los Paliques del juego antes
  de que este comience, para lo cual tienes que aadir la siguiente llamada
           
           InicioQuipsGlobal()
           
   en el codigo de la funcin Inicializar. La rutina InicioQuipsGlobal(), 
   al ser llamada, ejecuta las rutinas InicializarQuips() de cada Palique del juego.


  Por ejemplo:


    Palique tiempo_atmosferico "el tiempo" TemasVoxPopuli
    with nombre 'buen' 'tiempo' 'llover' 'sol' 'calor' 'frio';
         Enunciado[linea;
                  switch (linea){
                     0:"....";
                     1:"....";
                     }
                    ],

          Respuesta[linea;
                  switch(linea){
                    0:"....";
                    1:"....";
                    }
                   ],

      InicializarQuips [;.....];

    Palique euro "el euro" TemasVoxPopuli
    with nombre 'euro';
         Enunciado[linea;
                  switch (linea){
                     0:"....";
                     1:"....";
                     }
                    ],

          Respuesta[linea;
                  switch(linea){
                    0:"....";
                    1:"....";
                    }
                   ],

      InicializarQuips [;.....];




  Una llamada a Palique.AsignaQuip(42,1), activa el quip nmero 42 de ese
  Palique (le asigna un 1), mientras que una llamada a
  Palique.AsignaQuip(42,0) lo desactiva (le asigna un 0). Tambin dispones
  de las siguientes formas equivalentes, ms breves: Palique.QuipOn(42) y
  Palique.QuipOff(42); Puedes activar varios quips de golpe mediante la
  funcin Palique.QuipsOn(N, a, b, ...); siendo N el nmero de quips a
  activar y a, b, ... los quips (N debe ser menor de 7, ya que Inform
  acepta como mximo 7 parmetros en las llamadas). Tambin tienes la
  funcin Palique.QuipsOff(N, a, b, ...) que ya te imaginas lo que hace.
  Finalmente, para comprobar el estado de un quip tienes
  Palique.TestQuip(42) que retorna 1 si el quip 42 est activo y 0 si no.

  Los quips se comienzan a enumerar desde 0. Cada Palique puede tener su
  propio conjunto de quips que van desde 0 hasta 55 (por defecto,
  aunque puede cambiarse este valor).

  Si alguno de los paliques necesita ms de 56 quips, puedes
  cambiarlo, bien modificando la clase base (en el cdigo fuente), o
  bien sobrecargando las propiedades qflag y qhabld para un palique concreto.
  Ambas propiedades se componen de una ristra de ceros. Con N ceros, el
  palique tendr N*8 quips (ya que internamente cada quip se
  almacena con un bit). Tambin debes modificar su propiedad MAXQUIP y
  darle el valor N*8-1 (ser el nmero del quip ms alto posible para
  ese palique).

  Para llamar a un determinado palique, slo debemos llamar a su mtodo Palicar:

  palique.Palicar();

  Ntese por tanto que podemos activar un dilogo desde cualquier punto del
  programa, aunque en el ejemplo del apartado 4 se haga desde dentro de un PNJ.

  Una nueva rutina existente en la clase Palique es FinPalique():permite detener la 
  rutina Palicar del objeto palique para el que es llamada,o sea terminar con la
  conversacin. Es til para colocarla en una determinada respuesta, como una despedida, 
  o en una que provoque un suceso importante en el juego y que necesite por tanto el fin 
  de la conversacin en curso, lo que antes no se produca a no ser que se hubiesen 
  desactivado todos los quips.

  Otra nueva funcin miembro en la versin 1.2 es TestQuipDicho().Ahora cuando se escoge
  alguna respuesta por primera vez, el quip correspondiente se marca automticamente como
  dicho. Analogamente a TestQuip(), Palique.TestQuipDicho(12) retornara 1 si dicho quip
  se ha seleccionado en algn dilogo y 0 si no ha sido as.

  4) La propiedad vida de los PNJ, en el apartado de Responder,
  Preguntar o Hablar deben llamar a la funcin AveriguarTema(),
  pasndole como parmetro la coleccin de temas en la que buscar. El
  valor retornado es el tema de conversacin ms probable a partir de
  las palabras escritas por el jugador. Por ejemplo:

     tema=AveriguarTema(TemasVoxPopuli);
     switch(tema) {
       tiempo_atmosferico: tiempo_atmosfrico.Palicar();
       euro: euro.Palicar();
       default: "No s nada de eso";
      }

  As, el juego admitir:
  > PREGUNTA A MANOLO SOBRE EL TIEMPO
  > MANOLO, PARECE QUE HACE SOL
  > PREGUNTA A MANOLO POR EL CAMBIO DEL EURO

  Estas preguntas slo llevarn al tema "tiempo" y "euro" con el
  parsing flexible usado por defecto. Con el parsing normal, la
  primera sera comprendida (pues 'tiempo' est en la lista de
  palabras de un tema), pero las otras dos no (porque 'parece' y
  'cambio' no estn en la lista de palabras de ningun
  tema). Finalmente, con parsing_estricto no sera comprendida ninguna
  de las frases, pues aunque 'tiempo' est en la lista de palabras de
  un tema, no es su primera palabra. Con parsing estricto slo sera
  comprendido:

  > PREGUNTA A MANOLO SOBRE EL BUEN TIEMPO
  > PREGUNTA A MANOLO POR EL EURO

  5) Cmo es evidente, en el switch con los posibles retornos de AveriguarTema
  no tenemos por que llamar slo al correspondiente men, sino que podemos imprimir
  un texto antes; o imprimir solamente un texto, como haramos usando la librera Etemas.
  De lo que se trata en definitiva es de tener la sencillez de los mens pero sin limitar
  lo que podemos preguntarle a un PNJ. Por otra parte, podemos llamar a un objeto palique
  desde cualquier sitio, por ejemplo despus de que un PNJ le pregunte algo al jugador, para
  darle la ocasin de responder, etc.
  Lo bueno en mi opinin es que as podemos meter en un slo tema-raz todos los posibles
  dilogos de un PNJ, incluyndolos en un mdulo aparte incluso, para no sobrecargar el
  cdigo del PNJ y hacer ms claro el cdigo fuente.

  6) NOTA: he mantenido las lneas de la gramtica de hablar que llevan a la accin Hablarcon
  originaria de fhablaoo.h(pero he aadido una nueva y he mantenido tambin las que llevaban a
  la accin Hablar, que en fhablaoo se sustituan por entero), porque las formas HABLA CON (PNJ) y
  HABLA A (PNJ) me parecen apropiadas para lanzar un hipottico palique genrico con preguntas
  bsicas cmo quin eres?,etc. Pero tened en cuenta que, como Hablarcon no es una accin de las
  que se capturan en la rutina vida, debeis capturarla en la rutina antes del PNJ, o sea;


                antes[; hablarcon: palique.Palicar();].

  Debido a esto es por lo que debemos incluir la librera siempre despus de gramatica.h
