!---------------------------------------------------------------------------------------------
!	CONV.H (v.1) para informbp 6.21 o posterior
!	Gerardo Alfonso
!	3/7/2006
!	e-mail: 
!---------------------------------------------------------------------------------------------
!   Conv.h es una librería de conversación bastante rudimentaria y simple que surgió ante la
! necesidad de disponder de un sistema de comunicación con PSIs distinto al sugerido por
! Inform, el cual deja lugar a muchas ambiguedades en el momento de interpetar lo que el
! jugador ha querido decir dirigiéndose a un personaje, o bien requiere un extenso código si se
! desea realizar un análisis más detallado. Creo que esta librería propone una alternativa
! bastante aceptable para diálogos que no excedan las estructuras comunmente utilizadas.
!   Sospecho que ha de haber alguna forma más completa y efectiva de implementar un sistema de
! conversación a través de frases escritas. A pesar de esto he decidido dar a conocer Conv.h,
! por si a alguien le resulta útil. Yo espero emplearla pronto en mi primera aventura.
!
!   De más está decir que puedes utilizar esta librería en su totalidad o en parte, o bien
! modificar su código como gustes. 
!   
!---------------------------------------------------------------------------------------------
!   USO DE CONV.H
!
! - Incluir la librería después de EParser.h
!
! - Crear un objeto por cada tema de conversación. Cada objeto puede tener hasta seis
!   propiedades, llamadas 'frase1','frase2'..., etc., en las cuales se definen las frases que
!   servirán para que el jugador se refiera a un determinado tema con las mismas palabras y en
!   el mismo orden en que estén escritas dentro de una propiedad frase.
!   Las frases pueden tener hasta 8 palabras.  
!   Ejemplo:
!	Object DIME_TU_NOMBRE "dimetunombre" limbo
!	with	 frase1 'dime''tu''nombre',
!		 frase2 'como''te''llamas',
!		 frase3 'quien''eres',
!		 ...
!
! - Después se intercepta la acción Responder en la rutina vida del PSI, donde se hará la
!   comprobación para los temas que deseemos, de la forma siguiente:
!
!	Responder:
!		switch(BuscarTema(DIME_TU_NOMBRE, DONDE_VIVES, A_QUE_TE_DEDICAS))
!		{
!			DIME_TU_NOMBRE: !Si la frase del jugador coincide con una de este objeto
!			DONDE_VIVES: !Ibid.
!			A_QUE_TE_DEDICAS: !Ibid.
!			default: !Si no ha habido coincidencias
!		}
!
!   BuscarTema() recibe hasta ocho objetos-temas entre los cuales buscará la primera
!   coincidencia, y retornará el objeto-tema que la contiene o cero si no encuentra
!   coincidencias en ningún objeto.
!
!   Si necesitas verificar de a un objeto la rutina BuscarFrase(objeto_tema) se encarga de
!   hacerlo, devolviendo 1 si hay coincidencia ó 0 en caso contrario. Ejemplo:
!
!	Responder:
!		if (BuscarFrase(DIME_TU_NOMBRE))
!		{
!		    ... !En caso de que la frase escrita por el jugador haya sido igual a una de
!		    ... !las definidas en el objeto DIME_TU_NOMBRE
!		}
!
! - Hay dos formas de comunicación que puedes usar con Conv.h. Estas son:
!		PSI, CUAL ES TU NOMBRE
!   y 
!		DI CUAL ES TU NOMBRE AL PSI
!
!
!   NOTA: Si una de las frases tiene un arituclo de una sola letra debes poner dos barras
!   detrás de la misma, (ej.: 'a//','y//').
!
!---------------------------------------------------------------------------------------------

Property frase1;
Property frase2;
Property frase3;
Property frase4;
Property frase5;
Property frase6;

Array frase_jugador --> 8;

[ BuscarFrase objeto_tema tamano_frase coincidencia j k;

  if (objeto_tema == 0) return 0;	!Para las llamadas desde BuscarTema()

  coincidencia = 0;
  np = consultar_desde;

  !** Guardar la frase escrita por el jugador **
  for (k=consultar_desde, j=0: k< consultar_desde+consultar_num_palabras: k++, j++) {
	frase_jugador --> j = SiguientePalabra();	
  }  
 
  !** Buscar coincidencia **
  for (k=0:k<6:k++)
  {
	if (coincidencia == 1) break;

	if (k == 0)
	{
	    if (objeto_tema provides frase1) {
		  tamano_frase = (objeto_tema.#frase1)/WORDSIZE;
		  if (tamano_frase == consultar_num_palabras)
		  {
			for(j=0:j<consultar_num_palabras:j++) {			   
		  	   if (objeto_tema.&frase1 --> j ~= frase_jugador --> j){
				 coincidencia = 0; break; }
			   else { coincidencia = 1; }
			}
		  } 
	     }
	}
	if (k == 1)
	{
	    if (objeto_tema provides frase2) {
		  tamano_frase = (objeto_tema.#frase2)/WORDSIZE;
		  if (tamano_frase == consultar_num_palabras)
		  {
			for(j=0:j<consultar_num_palabras:j++) {
		  	   if (objeto_tema.&frase2 --> j ~= frase_jugador --> j){
				 coincidencia = 0; break; }
			   else { coincidencia = 1; }
			}
		  } 
	     }
	}

	if (k == 2)
	{
	    if (objeto_tema provides frase3) {
		  tamano_frase = (objeto_tema.#frase3)/WORDSIZE;
		  if (tamano_frase == consultar_num_palabras)
		  {
			for(j=0:j<consultar_num_palabras:j++) {
		  	   if (objeto_tema.&frase3 --> j ~= frase_jugador --> j){
				 coincidencia = 0; break; }
			   else { coincidencia = 1; }
			}
		  } 
	     }
	}
	if (k == 3)
	{
	    if (objeto_tema provides frase4) {
		  tamano_frase = (objeto_tema.#frase4)/WORDSIZE;
		  if (tamano_frase == consultar_num_palabras)
		  {
			for(j=0:j<consultar_num_palabras:j++) {
		  	   if (objeto_tema.&frase4 --> j ~= frase_jugador --> j){
				 coincidencia = 0; break; }
			   else { coincidencia = 1; }
			}
		  } 
	     }
	}
	if (k == 4)
	{
	    if (objeto_tema provides frase5) {
		  tamano_frase = (objeto_tema.#frase5)/WORDSIZE;
		  if (tamano_frase == consultar_num_palabras)
		  {
			for(j=0:j<consultar_num_palabras:j++) {
		  	   if (objeto_tema.&frase5 --> j ~= frase_jugador --> j){
				 coincidencia = 0; break; }
			   else { coincidencia = 1; break; }
			}
		  } 
	     }
	}
	if (k == 5)
	{
	    if (objeto_tema provides frase6) {
		  tamano_frase = (objeto_tema.#frase6)/WORDSIZE;
		  if (tamano_frase == consultar_num_palabras)
		  {
			for(j=0:j<consultar_num_palabras:j++) {
		  	   if (objeto_tema.&frase6 --> j ~= frase_jugador --> j){
				 coincidencia = 0; break; }
			   else { coincidencia = 1; break; }
			}
		  } 
	     }
	}

  } !for

  for (j=0:j<8:j++) frase_jugador --> j = NULL;	!* limpio el array antes de salir

  return coincidencia;
];


[ BuscarTema tema1 tema2 tema3 tema4 tema5 tema6 tema7 tema8 valor;
  valor = 0;

  valor = BuscarFrase(tema1);
  if (valor == 1) return tema1;
  valor = BuscarFrase(tema2);
  if (valor == 1) return tema2;
  valor = BuscarFrase(tema3);
  if (valor == 1) return tema3;
  valor = BuscarFrase(tema4);
  if (valor == 1) return tema4;
  valor = BuscarFrase(tema5);
  if (valor == 1) return tema5;
  valor = BuscarFrase(tema6);
  if (valor == 1) return tema6;
  valor = BuscarFrase(tema7);
  if (valor == 1) return tema7;
  valor = BuscarFrase(tema8);
  if (valor == 1) return tema8;
  
  return valor;
];

