/[ambar]/ambar/interfazpnj.py
ViewVC logotype

Diff of /ambar/interfazpnj.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2.4 by amoyav, Sun Oct 27 10:16:28 2002 UTC revision 2.5 by pabloruiz, Tue Nov 5 22:58:22 2002 UTC
# Line 1  Line 1 
1  #!/usr/bin/env python  #!/usr/bin/env python
2  #  #
3  #Minë. Mundo Interactivo-Narrativo en Español [Tierra-Media]  #Minë. Mundo Interactivo-Narrativo en Español [Tierra-Media]
4  #Copyright (C) 2002  Pablo Ruiz Múzquiz  #Copyright (C) 2002  Pablo Ruiz Múzquiz
5  #  #
6  #  #
7  #This program is free software; you can redistribute it and/or modify  #This program is free software; you can redistribute it and/or modify
8  #it under the terms of the GNU General Public License as published by  #it under the terms of the GNU General Public License as published by
9  #the Free Software Foundation; either version 2 of the License, or  #the Free Software Foundation; either version 2 of the License, or
10  #(at your option) any later version.  #(at your option) any later version.
11  #  #
12  #This program is distributed in the hope that it will be useful,  #This program is distributed in the hope that it will be useful,
13  #but WITHOUT ANY WARRANTY; without even the implied warranty of  #but WITHOUT ANY WARRANTY; without even the implied warranty of
14  #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  #GNU General Public License for more details.  #GNU General Public License for more details.
16  #  #
17  #You should have received a copy of the GNU General Public License  #You should have received a copy of the GNU General Public License
18  #along with this program; if not, write to the Free Software  #along with this program; if not, write to the Free Software
19  #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA  #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  #  #
21  #  #
22  #Fichero: interfazpnj.py  #Fichero: interfazpnj.py
23    
24  """Clase InterfazPNJ."""  """Clase InterfazPNJ."""
25    
26  from controlador import *  from controlador import *
27  from personaje import *  from personaje import *
28  from personajejugador import *  from personajejugador import *
29  from personajenojugador import *  from personajenojugador import *
30  from sala import *  from sala import *
31  from utils import *  from utils import *
32  from cronomine import *  from cronomine import *
33    
34    
35  class InterfazPNJ(Controlador):  class InterfazPNJ(Controlador):
36      """Interfaz controla directamente a una instancia de clase PersonajeNoJugador.      """Interfaz controla directamente a una instancia de clase PersonajeNoJugador.
37    
38      El control es automático, no necesita intervención de ningún jugador. De momento      El control es automático, no necesita intervención de ningún jugador. De momento
39      es muy básico, sólo sabe quedarse quieto en una sala y responder a un ataque.      es muy básico, sólo sabe quedarse quieto en una sala y responder a un ataque.
40            
41      La clase funciona como una maquina de estados, que acepta los eventos de      La clase funciona como una maquina de estados, que acepta los eventos de
42      Controlador, y reacciona apropiadamente en cada caso.      Controlador, y reacciona apropiadamente en cada caso.
43    
44      Contiene los siguientes atributos:      Contiene los siguientes atributos:
45            
46       - __personaje (Personaje): el personaje que controlamos       - __personaje (Personaje): el personaje que controlamos
47       - __estado (string): el estado en el que se encuentra el interfaz       - __estado (string): el estado en el que se encuentra el interfaz
48       - __sub_estado (int): algunos estados tienen fases intermedias. Si no, None.       - __sub_estado (int): algunos estados tienen fases intermedias. Si no, None.
49       - __crono (CronoMine): cronometro usado opcionalmente       - __crono (CronoMine): cronometro usado opcionalmente
50       - __oponente (Personaje): otro personaje con quien el nuestro está combatiendo       - __oponente (Personaje): otro personaje con quien el nuestro está combatiendo
51            
52       Los siguientes atributos provocan ajustes automáticos al ser modificados:       Los siguientes atributos provocan ajustes automáticos al ser modificados:
53    
54       - __personaje: se modifica también al personaje para que tenga a este interfaz como       - __personaje: se modifica también al personaje para que tenga a este interfaz como
55                    controlador                    controlador
56       """       """
57    
58    
59      def __init__(self):      def __init__(self):
60          """Crea un interfaz nuevo para un personaje recien creado o cargado de disco."""          """Crea un interfaz nuevo para un personaje recien creado o cargado de disco."""
61          self.__personaje = None          self.__personaje = None
62          self.__estado = ""          self.__estado = ""
63          self.__sub_estado = None          self.__sub_estado = None
64          self.__crono = None          self.__crono = None
65          self.__oponente = None          self.__oponente = None
66          self.estado_normal()          self.estado_normal()
67                            
68                            
69      def __del__(self):      def __del__(self):
70          """Realiza ajustes automáticos al ser destruido"""          """Realiza ajustes automáticos al ser destruido"""
71          if self.__personaje != None:          if self.__personaje != None:
72              self.liberar_personaje()              self.liberar_personaje()
73    
74    
75      def personaje(self):      def personaje(self):
76          return self.__personaje          return self.__personaje
77    
78    
79      def controlar_personaje(self, personaje):      def controlar_personaje(self, personaje):
80          """Pasar a estar controlando un personaje.          """Pasar a estar controlando un personaje.
81                    
82          Requiere:          Requiere:
83            self.__personaje == None            self.__personaje == None
84            personaje != None            personaje != None
85          """          """
86          self.__personaje = personaje          self.__personaje = personaje
87          self.__personaje.controlar(self)          self.__personaje.controlar(self)
88    
89    
90      def liberar_personaje(self):      def liberar_personaje(self):
91          """Soltar al personaje actual y dejarlo libre.          """Soltar al personaje actual y dejarlo libre.
92    
93          Requiere:          Requiere:
94            self.__personaje != None            self.__personaje != None
95          """          """
96          self.__personaje.liberar()          self.__personaje.liberar()
97          self.__personaje = None          self.__personaje = None
98                    
99                    
100      # -------------------------------------------------      # -------------------------------------------------
101      # Metodos de manejo de eventos (ver controlador.py)      # Metodos de manejo de eventos (ver controlador.py)
102      # -------------------------------------------------      # -------------------------------------------------
103            
104      def entra_personaje(self, personaje):      def entra_personaje(self, personaje):
105          pass # algún día se puede hacer que el PNJ salude o amenace          pass # algún día se puede hacer que el PNJ salude o amenace
106                                                    
107                                                    
108      def sale_personaje(self, personaje, nombre_sala_destino):      def sale_personaje(self, personaje, nombre_sala_destino):
109          pass  # a lo mejor se puede hacer que se despida          pass  # a lo mejor se puede hacer que se despida
110                                                    
111                                                    
112      def habla_personaje(self, personaje, mensaje):      def habla_personaje(self, personaje, mensaje):
113          pass  # se podría hacer que los PNJ entiendan conversaciones          pass  # se podría hacer que los PNJ entiendan conversaciones
114    
115    
116      def susurra_personaje(self, personaje, mensaje):      def susurra_personaje(self, personaje, mensaje):
117          pass  # se podría hacer que los PNJ entiendan conversaciones          pass  # se podría hacer que los PNJ entiendan conversaciones
118    
119            
120      def grita_personaje(self, personaje, mensaje):      def grita_personaje(self, personaje, mensaje):
121          pass  # id          pass  # id
122    
123                                                    
124      def actua_personaje(self, personaje, accion):      def actua_personaje(self, personaje, accion):
125          pass  # se podría hacer que los PNJ reaccionen a acciones          pass  # se podría hacer que los PNJ reaccionen a acciones
126    
127    
128      def actua_individual_personaje(self, personaje, accion):      def actua_individual_personaje(self, personaje, accion):
129          pass  # id          pass  # id
130                                                
131    
132      def actua_uno_mismo(self, accion):      def actua_uno_mismo(self, accion):
133          pass  # aqui no se me ocurre nada          pass  # aqui no se me ocurre nada
134                                                    
135    
136      def actua_global_personaje(self, personaje, accion):      def actua_global_personaje(self, personaje, accion):
137          pass  # se podría hacer que los PNJ reaccionen a acciones          pass  # se podría hacer que los PNJ reaccionen a acciones
138    
139    
140      def suceso_entorno(self, mensaje):      def suceso_entorno(self, mensaje):
141          pass # aqui tampoco se me ocurre nada, en principio          pass # aqui tampoco se me ocurre nada, en principio
142                
143            
144      def ataca_personaje(self, personaje, result):      def ataca_personaje(self, personaje, result):
145          pass          pass
146  #%% funciones de combate desactivadas  #%% funciones de combate desactivadas
147  #%%        # Llamar a la función correspondiente según estado  #%%        # Llamar a la función correspondiente según estado
148  #%%        nombre_func = "ataque_" + self.estado  #%%        nombre_func = "ataque_" + self.estado
149  #%%        if self.sub_estado != None: nombre_func += "_" + str(self.sub_estado)  #%%        if self.sub_estado != None: nombre_func += "_" + str(self.sub_estado)
150  #%%          #%%        
151  #%%        func = getattr(self, nombre_func, None)  #%%        func = getattr(self, nombre_func, None)
152  #%%        if func == None:  #%%        if func == None:
153  #%%            print "ERROR: recibido ataque en estado " + self.estado + \  #%%            print "ERROR: recibido ataque en estado " + self.estado + \
154  #%%                  ((self.sub_estado != None and "_" + str(self.sub_estado)) or "") + \  #%%                  ((self.sub_estado != None and "_" + str(self.sub_estado)) or "") + \
155  #%%                  ((self.personaje != None and  "(" + self.personaje.nombre + ")") or "")  #%%                  ((self.personaje != None and  "(" + self.personaje.nombre + ")") or "")
156  #%%        else:  #%%        else:
157  #%%            func(personaje, result)  #%%            func(personaje, result)
158                    
159                    
160      def lanzar_crono(self, segundos_vencimiento):      def lanzar_crono(self, segundos_vencimiento):
161          """Lanza un cronometro que vence al cabo del numero de segundos indicado.          """Lanza un cronometro que vence al cabo del numero de segundos indicado.
162                    
163          Se admiten decimales.          Se admiten decimales.
164          """          """
165          from mundo import Mundo          from mundo import Mundo
166          if self.crono != None: self.crono.parar()          if self.crono != None: self.crono.parar()
167          self.crono = CronoMine(Mundo.cronoMine_control,          self.crono = CronoMine(Mundo.cronoMine_control,
168                                 FechaHoraMineRel(segundos=segundos_vencimiento),                                 FechaHoraMineRel(segundos=segundos_vencimiento),
169                                 self.vencimiento)                                 self.vencimiento)
170                    
171                    
172      def vencimiento(self, crono):      def vencimiento(self, crono):
173          """Metodo llamado cuando vence el cronometro."""          """Metodo llamado cuando vence el cronometro."""
174                    
175          self.crono = None          self.crono = None
176                    
177          # Llamar a la función correspondiente según estado          # Llamar a la función correspondiente según estado
178          nombre_func = "vencimiento_" + self.estado          nombre_func = "vencimiento_" + self.estado
179          if self.sub_estado != None: nombre_func += "_" + str(self.sub_estado)          if self.sub_estado != None: nombre_func += "_" + str(self.sub_estado)
180    
181          func = getattr(self, nombre_func, None)          func = getattr(self, nombre_func, None)
182          if func == None:          if func == None:
183              print "ERROR: recibido vencimiento en estado " + self.estado + \              print "ERROR: recibido vencimiento en estado " + self.estado + \
184                    ((self.sub_estado != None and "_" + str(self.sub_estado)) or "") + \                    ((self.sub_estado != None and "_" + str(self.sub_estado)) or "") + \
185                    ((self.personaje != None and  "(" + self.personaje.nombre + ")") or "")                    ((self.personaje != None and  "(" + self.personaje.nombre + ")") or "")
186          else:          else:
187              func()              func()
188                    
189                    
190      # -------------      # -------------
191      # ESTADO NORMAL      # ESTADO NORMAL
192      # -------------      # -------------
193    
194    
195      def estado_normal(self):      def estado_normal(self):
196          self.estado = "normal"          self.estado = "normal"
197          self.sub_estado = None          self.sub_estado = None
198                            
199                            
200  #%% funciones de combate desactivadas  #%% funciones de combate desactivadas
201  #%%    def ataque_normal(self, personaje, result):  #%%    def ataque_normal(self, personaje, result):
202  #%%        # Al recibir un ataque, pasamos inmediantamente a estado combate  #%%        # Al recibir un ataque, pasamos inmediantamente a estado combate
203  #%%          #%%        
204  #%%        self.oponente = personaje  #%%        self.oponente = personaje
205  #%%        self.cbt_empieza_combate_defiendes()  #%%        self.cbt_empieza_combate_defiendes()
206  #%%        self.cbt_te_pegan(result)  #%%        self.cbt_te_pegan(result)
207  #%%          #%%        
208  #%%        if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"):  #%%        if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"):
209  #%%            self.cbt_termina_combate()  #%%            self.cbt_termina_combate()
210  #%%            self.estado_normal()  #%%            self.estado_normal()
211  #%%        else:  #%%        else:
212  #%%            # Al poner un crono de 3 segundos, el combate funciona como  #%%            # Al poner un crono de 3 segundos, el combate funciona como
213  #%%            # una sucesion de golpes alternados cada 3 segundos.  #%%            # una sucesion de golpes alternados cada 3 segundos.
214  #%%            self.lanzar_crono(3)  #%%            self.lanzar_crono(3)
215  #%%            self.estado_combate()  #%%            self.estado_combate()
216  #%%  #%%
217  #%%  #%%
218  #%%    # --------------  #%%    # --------------
219  #%%    # ESTADO COMBATE  #%%    # ESTADO COMBATE
220  #%%    # --------------  #%%    # --------------
221  #%%              #%%            
222  #%%              #%%            
223  #%%    def estado_combate(self):  #%%    def estado_combate(self):
224  #%%        self.estado = "combate"  #%%        self.estado = "combate"
225  #%%        self.sub_estado = None  #%%        self.sub_estado = None
226  #%%  #%%
227  #%%  #%%
228  #%%    def ataque_combate(self, oponente, result):  #%%    def ataque_combate(self, oponente, result):
229  #%%        self.cbt_te_pegan(result)          #%%        self.cbt_te_pegan(result)        
230  #%%        if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"):  #%%        if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"):
231  #%%            self.cbt_termina_combate()  #%%            self.cbt_termina_combate()
232  #%%            self.estado_normal()  #%%            self.estado_normal()
233  #%%        else:  #%%        else:
234  #%%            self.estado_combate()  #%%            self.estado_combate()
235  #%%              #%%            
236  #%%          #%%        
237  #%%    def vencimiento_combate(self):  #%%    def vencimiento_combate(self):
238  #%%        self.cbt_pegar()          #%%        self.cbt_pegar()        
239  #%%        if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"):  #%%        if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"):
240  #%%            self.cbt_termina_combate()  #%%            self.cbt_termina_combate()
241  #%%            self.estado_normal()  #%%            self.estado_normal()
242  #%%        else:  #%%        else:
243  #%%            self.lanzar_crono(6)  #%%            self.lanzar_crono(6)
244  #%%            self.estado_combate()            #%%            self.estado_combate()          
245  #%%          #%%        
246  #%%          #%%        
247  #%%    def cbt_empieza_combate_defiendes(self):  #%%    def cbt_empieza_combate_defiendes(self):
248  #%%        pass  #%%        pass
249  #%%  #%%
250  #%%          #%%        
251  #%%    def cbt_pegar(self):  #%%    def cbt_pegar(self):
252  #%%        self.personaje.hablar("\n" + color(33) + "\n" + self.personaje.nombre +  #%%        self.personaje.hablar("\n" + color(33) + "\n" + self.personaje.nombre +
253  #%%                              " ataca a " + self.oponente.nombre + finl)  #%%                              " ataca a " + self.oponente.nombre + finl)
254  #%%          #%%        
255  #%%        result = self.personaje.ataque_fisico(self.oponente)  #%%        result = self.personaje.ataque_fisico(self.oponente)
256  #%%          #%%        
257  #%%        if result == Personaje.ATAQUE_EXITO:  #%%        if result == Personaje.ATAQUE_EXITO:
258  #%%            self.personaje.hablar(self.personaje.nombre + " ha conseguido golpear")  #%%            self.personaje.hablar(self.personaje.nombre + " ha conseguido golpear")
259  #%%        elif result == Personaje.ATAQUE_FALLADO:  #%%        elif result == Personaje.ATAQUE_FALLADO:
260  #%%            self.personaje.hablar(self.personaje.nombre + " ha fallado, su ataque no hace nada")  #%%            self.personaje.hablar(self.personaje.nombre + " ha fallado, su ataque no hace nada")
261  #%%        elif result == Personaje.ATAQUE_CRITICO:  #%%        elif result == Personaje.ATAQUE_CRITICO:
262  #%%            self.personaje.hablar(self.personaje.nombre + " ha ejecutado un golpe impresionante")  #%%            self.personaje.hablar(self.personaje.nombre + " ha ejecutado un golpe impresionante")
263  #%%        elif result == Personaje.ATAQUE_PIFIA:  #%%        elif result == Personaje.ATAQUE_PIFIA:
264  #%%            self.personaje.hablar("¡" + self.personaje.nombre + " ha fallado estrepitosamente, se daña a si mismo/a!")  #%%            self.personaje.hablar("¡" + self.personaje.nombre + " ha fallado estrepitosamente, se daña a si mismo/a!")
265  #%%        else:  #%%        else:
266  #%%            print "ERROR: recibido resultado de combate " + str(result) + \  #%%            print "ERROR: recibido resultado de combate " + str(result) + \
267  #%%                  " (" + self.personaje.nombre + ")"  #%%                  " (" + self.personaje.nombre + ")"
268  #%%                    #%%                  
269  #%%        self.personaje.hablar("A " + self.personaje.nombre + " le quedan " +  #%%        self.personaje.hablar("A " + self.personaje.nombre + " le quedan " +
270  #%%                              str(self.personaje.vida) + " puntos de vida")  #%%                              str(self.personaje.vida) + " puntos de vida")
271  #%%        self.personaje.hablar("Y a " + self.oponente.nombre + " le quedan " +  #%%        self.personaje.hablar("Y a " + self.oponente.nombre + " le quedan " +
272  #%%                              str(self.oponente.vida) + " puntos de vida")  #%%                              str(self.oponente.vida) + " puntos de vida")
273  #%%                    #%%                  
274  #%%        if self.oponente.estado == "muerto":  #%%        if self.oponente.estado == "muerto":
275  #%%            self.cbt_oponente_muerto()  #%%            self.cbt_oponente_muerto()
276  #%%        elif self.personaje.estado == "muerto":  #%%        elif self.personaje.estado == "muerto":
277  #%%            self.cbt_personaje_muerto()  #%%            self.cbt_personaje_muerto()
278  #%%              #%%            
279  #%%      #%%    
280  #%%    def cbt_te_pegan(self, result):  #%%    def cbt_te_pegan(self, result):
281  #%%        if self.oponente.estado == "muerto":  #%%        if self.oponente.estado == "muerto":
282  #%%            self.cbt_oponente_muerto()  #%%            self.cbt_oponente_muerto()
283  #%%        elif self.personaje.estado == "muerto":  #%%        elif self.personaje.estado == "muerto":
284  #%%            self.cbt_personaje_muerto()  #%%            self.cbt_personaje_muerto()
285  #%%                                #%%                              
286  #%%      #%%    
287  #%%    def cbt_oponente_muerto(self):  #%%    def cbt_oponente_muerto(self):
288  #%%        self.personaje.hablar("\n" + color(31) + self.oponente.nombre +  #%%        self.personaje.hablar("\n" + color(31) + self.oponente.nombre +
289  #%%                              " ha muerto. RIP." + finl)  #%%                              " ha muerto. RIP." + finl)
290  #%%        # puntos de experiencia, objetos... (aún sin hacer)  #%%        # puntos de experiencia, objetos... (aún sin hacer)
291  #%%          #%%        
292  #%%          #%%        
293  #%%    def cbt_personaje_muerto(self):  #%%    def cbt_personaje_muerto(self):
294  #%%        # pues no se, habra que ver que hacemos aqui  #%%        # pues no se, habra que ver que hacemos aqui
295  #%%        pass  #%%        pass
296  #%%          #%%        
297  #%%          #%%        
298  #%%    def cbt_termina_combate(self):  #%%    def cbt_termina_combate(self):
299  #%%        self.oponente = None  #%%        self.oponente = None
300  #%%        if self.crono != None:  #%%        if self.crono != None:
301  #%%            self.crono.parar()  #%%            self.crono.parar()
302  #%%            self.crono = None  #%%            self.crono = None
303    
304    
305  # Código para pruebas unitarias del módulo.  # Código para pruebas unitarias del módulo.
306    
307  if (__name__ == '__main__'):  if (__name__ == '__main__'):
308      print "No hay código para pruebas unitarias del módulo. Para probar, ejecutar ambar.py"      print "No hay código para pruebas unitarias del módulo. Para probar, ejecutar ambar.py"
309      print "y conectarse via telnet."      print "y conectarse via telnet."

Legend:
Removed from v.2.4  
changed lines
  Added in v.2.5

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26