#!/usr/bin/env python
# encoding: iso-8859-15
#
#Minë. Mundo Interactivo-Narrativo en Español [Tierra-Media]
#Copyright (C) 2002  Pablo Ruiz Múzquiz
#
#
#This program is free software; you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation; either version 2 of the License, or
#(at your option) any later version.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program; if not, write to the Free Software
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#

#
#Fichero: Dialogo.py

"""Clase Dialogo."""


class Dialogo(object):
    """Clase base que representa un diálogo mantenido con el jugador
    a través de una conexión de socket.
    
    Responde a los eventos de socket, y también a los del controlador
    de un personaje. Tiene implementaciones por defecto de las respuestas
    a todos los eventos, que generan un error. Hay que redefinir todas
    las respuestas a eventos que se espera que ocurran.

    Los eventos de controlador tienen una respuesta única, pero los de
    socket tienen una respuesta distinta para cada estado. Las subclases
    deberán definir un método por cada estado, llamado comando_<estado>
    (por ejemplo, comando_0, comando_1, etc.).

    Contiene los siguientes atributos:
     - __padre(InterfazPJ): el interfaz al cual pertenece este diálogo
     - __conn(Connection): la conexión por la cual se comunica
     - __estado(int): el estado en el que se encuentra este diálogo

    Invariantes:
       __padre != None
       __conn != None
       __estado >= 0
    """

    def __init__(self, padre, conn):
        """Inicializa la base y empieza en estado 0.

	Requiere:
	  padre != None
	  conn != None
	"""
        self.__padre = padre
        self.__conn = conn
        self.__estado = 0


    def padre(self):
    	return self.__padre


    def conn(self):
    	return self.__conn


    def estado(self):
    	return self.__estado


    def poner_estado(self, estado):
        """Requiere: estado >= 0"""
	self.__estado = estado


    def comando_0(self, cmd_list):
        """Responde a un comando que viene del socket.

	El comando ya viene partido en una lista de palabras.

	Requiere:
	  cmd_list != None
	"""
        raise ValueError("Recibido comando en un diálogo que no lo espera")
	    

    def entra_personaje(self, personaje):
	raise ValueError("Recibido evento entra_personaje en un diálogo que no lo espera")
                        
                        
    def sale_personaje(self, personaje, nombre_sala_destino):
	raise ValueError("Recibido evento sale_personaje en un diálogo que no lo espera")
                        
                        
    def habla_personaje(self, personaje, mensaje):
	raise ValueError("Recibido evento habla_personaje en un diálogo que no lo espera")

	
    def susurra_personaje(self, personaje, mensaje):
	raise ValueError("Recibido evento susurra_personaje en un diálogo que no lo espera")

	
    def grita_personaje(self, personaje, mensaje):
	raise ValueError("Recibido evento grita_personaje en un diálogo que no lo espera")


    def actua_personaje(self, personaje, accion):
	raise ValueError("Recibido evento actua_personaje en un diálogo que no lo espera")
 

    def actua_individual_personaje(self, personaje, accion):
	raise ValueError("Recibido evento actua_individual_personaje en un diálogo que no lo espera")
 

    def actua_uno_mismo(self, accion):
	raise ValueError("Recibido evento actua_uno_mismo en un diálogo que no lo espera")
                      
                        
    def actua_global_personaje(self, personaje, accion):
	raise ValueError("Recibido evento actua_global_personaje en un diálogo que no lo espera")


    def suceso_entorno(self, mensaje):
	raise ValueError("Recibido evento suceso_entorno en un diálogo que no lo espera")
        
    
    def ataca_personaje(self, personaje, result):
	raise ValueError("Recibido evento ataca_personaje en un diálogo que no lo espera")
         
    
    def movimiento_automatico(self):
	raise ValueError("Recibido evento movimiento_automatico en un diálogo que no lo espera")
         
    
    def paga_personaje(self, personaje, monedas):
	raise ValueError("Recibido evento paga_personaje en un diálogo que no lo espera")
    

# Código para pruebas unitarias del módulo.

if (__name__ == '__main__'):
    print "No hay código para pruebas unitarias del módulo."
    print "Para probar, ejecutar mine.py y conectarse via telnet."

