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

Diff of /ambar/personaje.py

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

revision 1.18 by pabloruiz, Wed Jul 3 11:42:22 2002 UTC revision 1.19 by amoyav, Tue Aug 13 08:28:27 2002 UTC
# Line 146  class Personaje: Line 146  class Personaje:
146      ATAQUE_PIFIA   = 4      ATAQUE_PIFIA   = 4
147    
148    
149      def __init__(self, id, nombre, descripcion, experiencia, nivel, vida,      def __init__(self, id, sala):
                  volumen, estado, sala, controlador, atrib, idiomas):  
150          """Método para crear una nueva instancia de esta clase.          """Método para crear una nueva instancia de esta clase.
151    
152          Personaje es una clase abstracta, luego no puede ser directamente          Personaje es una clase abstracta, luego no puede ser directamente
153          instanciada. Este método sólo puede ser llamado desde subclases.          instanciada. Este método sólo puede ser llamado desde subclases.
154            El constructor de la subclase debe rellenar todos los valores de
155            tal forma que se mantenga la invariante.
156    
157          Requiere:          Requiere:
158            Todos los parámetros satisfacen las invariantes            Todos los parámetros satisfacen las invariantes
# Line 159  class Personaje: Line 160  class Personaje:
160          # Dar valores iniciales usando __dict__ para que no salte __setattr__          # Dar valores iniciales usando __dict__ para que no salte __setattr__
161          self.__dict__["id"] = id          self.__dict__["id"] = id
162          self.__dict__["version"] = Personaje.VERSION          self.__dict__["version"] = Personaje.VERSION
163          self.__dict__["nombre"] = nombre          self.__dict__["sala"] = sala
164          self.__dict__["descripcion"] = descripcion  
165          self.__dict__["experiencia"] = experiencia          self.__dict__["nombre"] = None
166          self.__dict__["nivel"] = nivel          self.__dict__["descripcion"] = None
167          self.__dict__["vida"] = vida          self.__dict__["experiencia"] = None
168          self.__dict__["volumen"] = volumen          self.__dict__["nivel"] = None
169          self.__dict__["estado"] = estado          self.__dict__["vida"] = None
170          self.__dict__["sala"] = None          self.__dict__["volumen"] = None
171          self.__dict__["controlador"] = controlador          self.__dict__["estado"] = None
172          self.__dict__["atrib"] = atrib          self.__dict__["controlador"] = None
173          self.__dict__["idiomas"] = idiomas          self.__dict__["atrib"] = None
174            self.__dict__["idiomas"] = None
175    
176          self.siguiente = None          self.siguiente = None
177          self.anterior = None          self.anterior = None
178          self.inventario = []          self.inventario = []
179          self.equipo = []          self.equipo = []
180          self.salas_visitadas = {}          self.salas_visitadas = {}
181    
182          # Dos opciones según el personaje venga ya controlado o no          from personajejugador import PersonajeJugador
         if self.controlador == None:  
183    
184              from mundo import Mundo          if isinstance(self, PersonajeJugador):
185              from mundo import Mundo_localizar_sala              # Dos opciones según el personaje venga ya controlado o no
186                if self.controlador == None:
             # No controlado: arranca en el limbo y la sala pedida  
             # se guarda para cuando alguien lo saque  
             self.id_sala_original = sala.id  
               
             self.__dict__["sala"] = Mundo_localizar_sala(Mundo.ID_SALA_LIMBO)  
             self.sala.entrar_personaje(self)  # se asume que el limbo tiene  
                                               # capacidad de volumen infinita  
         else:  
187    
188              from personajejugador import PersonajeJugador                  from mundo import Mundo
189              from mundo import Mundo_personaje_activado                  from mundo import Mundo_localizar_sala
190    
191              # Controlado: se lleva a la sala pedida y se avisa al mundo                  # No controlado: arranca en el limbo y la sala pedida
192              if isinstance(self, PersonajeJugador):                  # se guarda para cuando alguien lo saque
193                  Mundo_personaje_activado(self)                  self.id_sala_original = sala.id
194                  self.actuar_global(color(35) + self.id + " ha sido creado" + finl)                  
195                                    self.__dict__["sala"] = Mundo_localizar_sala(Mundo.ID_SALA_LIMBO)
196              self.__dict__["sala"] = sala                  self.sala.entrar_personaje(self)  # se asume que el limbo tiene
197              for otro_personaje in self.sala.personajes.values():                                                    # capacidad de volumen infinita
198                  if otro_personaje.controlador != None and otro_personaje.silencio == 'no':              else:
199                      otro_personaje.controlador.entra_personaje(self)  
200              self.sala.entrar_personaje(self)  # se asume que la sala de entrada tiene                  from mundo import Mundo_personaje_activado
201                                                # capacidad de volumen infinita  
202                    # Controlado: se lleva a la sala pedida y se avisa al mundo
203                    if isinstance(self, PersonajeJugador):
204                        Mundo_personaje_activado(self)
205                        self.actuar_global(color(35) + self.id + " ha sido creado" + finl)
206                        
207                    self.__dict__["sala"] = sala
208                    for otro_personaje in self.sala.personajes.values():
209                        if otro_personaje.controlador != None and (not isinstance(otro_personaje, PersonajeJugador) or otro_personaje.silencio == 'no'):
210                            otro_personaje.controlador.entra_personaje(self)
211                    self.sala.entrar_personaje(self)  # se asume que la sala de entrada tiene
212                                                      # capacidad de volumen infinita
213    
214    
215      def __setattr__(self, name, value):      def __setattr__(self, name, value):
# Line 229  class Personaje: Line 234  class Personaje:
234              self.liberar()              self.liberar()
235          if self.sala != None:          if self.sala != None:
236              self.sala.salir_personaje(self)              self.sala.salir_personaje(self)
237                from personajejugador import PersonajeJugador # %% PARCHE!!!! la comprobacion de "silencio" debe hacerse dentro de InterfazPJ, pues solo afecta a PJs.
238              for otro_personaje in self.sala.personajes.values():              for otro_personaje in self.sala.personajes.values():
239                  if otro_personaje.controlador != None and otro_personaje.silencio == 'no':                  if otro_personaje.controlador != None and (not isinstance(otro_personaje, PersonajeJugador) or otro_personaje.silencio == 'no'):
240                      otro_personaje.controlador.sale_personaje(self, "el vacío")                      otro_personaje.controlador.sale_personaje(self, "el vacío")
241              self.__dict__["sala"] = None              self.__dict__["sala"] = None
242    
# Line 267  class Personaje: Line 273  class Personaje:
273          if isinstance(self, PersonajeNoJugador):          if isinstance(self, PersonajeNoJugador):
274    
275              # PNJ: se crea el controlador al momento              # PNJ: se crea el controlador al momento
276              controlador = InterfazPNJ()              self.controlador_automatico()
             controlador.personaje = self  
277    
278          else:          else:
279    
# Line 350  class Personaje: Line 355  class Personaje:
355                  total += 0                  total += 0
356          return total          return total
357                    
358                                    def color_texto(self):
359            """Color con el que se muestran los mensajes que dice este personaje"""
360    
361            base = 0
362            for letra in self.nombre:
363                base = base + ord(letra)
364                
365            from personajenojugador import PersonajeNoJugador
366            if isinstance(self, PersonajeNoJugador):
367                return chr(27) + "[1;" + str(35) + "m"
368            return color(31 + base % 7)
369    
370            
371      def mover(self, sala, automatico = 0):      def mover(self, sala, automatico = 0):
372          """Mover al personaje a otra sala.          """Mover al personaje a otra sala.
373                    
# Line 378  class Personaje: Line 395  class Personaje:
395                  if self.anterior != None:                  if self.anterior != None:
396                      self.noseguir();                      self.noseguir();
397                            
398                from personajejugador import PersonajeJugador
399    
400              self.sala.salir_personaje(self)              self.sala.salir_personaje(self)
401              for otro_personaje in self.sala.personajes.values():              for otro_personaje in self.sala.personajes.values():   #%% PARCHE!!!! la comprobacion de "silencio" debe hacerse dentro de InterfazPJ, pues solo afecta a PJs.
402                  if otro_personaje.controlador != None and otro_personaje.silencio == 'no':                  if otro_personaje.controlador != None and (not isinstance(otro_personaje, PersonajeJugador) or otro_personaje.silencio == 'no'):
403                      otro_personaje.controlador.sale_personaje(self, sala.nombre)                      otro_personaje.controlador.sale_personaje(self, sala.nombre)
404    
405              self.__dict__["sala"] = sala              self.__dict__["sala"] = sala
406    
407              for otro_personaje in self.sala.personajes.values():              for otro_personaje in self.sala.personajes.values():
408                  if otro_personaje.controlador != None and otro_personaje.silencio == 'no':                  if otro_personaje.controlador != None and (not isinstance(otro_personaje, PersonajeJugador) or otro_personaje.silencio == 'no'):
409                      otro_personaje.controlador.entra_personaje(self)                      otro_personaje.controlador.entra_personaje(self)
410              self.sala.entrar_personaje(self)              self.sala.entrar_personaje(self)
411    
# Line 469  class Personaje: Line 488  class Personaje:
488          from mundo import Mundo          from mundo import Mundo
489          from mundo import Mundo_localizar_sala          from mundo import Mundo_localizar_sala
490          from mundo import Mundo_personaje_activado          from mundo import Mundo_personaje_activado
491            from mundo import Mundo_personaje_desactivado
492          from personajejugador import PersonajeJugador          from personajejugador import PersonajeJugador
493    
494          escribir("Trayendo desde el limbo a " + self.id)          if isinstance(self, PersonajeJugador):
495                escribir("Trayendo desde el limbo a " + self.id)
         id_sala_original = self.id_sala_original  
496    
497          try:              id_sala_original = self.id_sala_original
498    
499              # Aquí tengo un dilema gordo: en teoría debería comprobar el volumen ocupado de la              try:
             # sala y no dejarle entrar si está llena. Pero es una putada que alguien no pueda  
             # recuperar su personaje porque en la sala donde lo dejó ha entrado un montón de  
             # gente. Como será un caso muy poco frecuente, haremos la vista gorda y permitiremos  
             # que haya más gente en la sala de la que cabe, espero que no falle nada (durará  
             # sólo un ratito hasta que alguien salga)...  
             self.mover(Mundo_localizar_sala(self.id_sala_original))  
             del self.id_sala_original  
   
             self.controlador = controlador  
   
             if isinstance(self, PersonajeJugador):  
                 Mundo_personaje_activado(self)  
                 self.actuar_global(color(35) + self.id + " ha entrado en Minë" + finl)  
500    
501          except:                  # Aquí tengo un dilema gordo: en teoría debería comprobar el volumen ocupado de la
502              # Si casca algo, volvemos al limbo                  # sala y no dejarle entrar si está llena. Pero es una putada que alguien no pueda
503              self.id_sala_original = id_sala_original                  # recuperar su personaje porque en la sala donde lo dejó ha entrado un montón de
504              self.mover(Mundo_localizar_sala(Mundo.ID_SALA_LIMBO))  # se asume que el limbo tiene                  # gente. Como será un caso muy poco frecuente, haremos la vista gorda y permitiremos
505              self.controlador = None                                # capacidad de volumen infinita                  # que haya más gente en la sala de la que cabe, espero que no falle nada (durará
506              if isinstance(self, PersonajeJugador):                  # sólo un ratito hasta que alguien salga)...
507                  Mundo_personaje_desactivado(self)                  self.mover(Mundo_localizar_sala(self.id_sala_original))
508                                    del self.id_sala_original
509    
510                    self.controlador = controlador
511    
512                    if isinstance(self, PersonajeJugador):
513                        Mundo_personaje_activado(self)
514                        self.actuar_global(color(35) + self.id + " ha entrado en Minë" + finl)
515    
516                except:
517                    # Si casca algo, volvemos al limbo
518                    self.id_sala_original = id_sala_original
519                    self.mover(Mundo_localizar_sala(Mundo.ID_SALA_LIMBO))  # se asume que el limbo tiene
520                    self.controlador = None                                # capacidad de volumen infinita
521                    if isinstance(self, PersonajeJugador):
522                        Mundo_personaje_desactivado(self)
523            else:
524                self.controlador = controlador
525                        
526                                    
527      def seguir(self, lider):      def seguir(self, lider):
528          """Entrar en una compañía, siguiendo a otro personaje que hace de lider.          """Entrar en una compañía, siguiendo a otro personaje que hace de lider.
# Line 609  class Personaje: Line 632  class Personaje:
632      def describir(self, accion):      def describir(self, accion):
633          """Muestra lo que hace el personaje, de forma que lo vean los que estan en la sala."""          """Muestra lo que hace el personaje, de forma que lo vean los que estan en la sala."""
634          if self.sala != None:          if self.sala != None:
635                from personajejugador import PersonajeJugador # %% PARCHE!!!! la comprobacion de "silencio" debe hacerse dentro de InterfazPJ, pues solo afecta a PJs.
636              for personaje in [ p for p in self.sala.personajes.values()              for personaje in [ p for p in self.sala.personajes.values()
637                                 if p != self and p.controlador != None and p.silencio == "no"]:                                 if p != self and p.controlador != None and (not isinstance(p, PersonajeJugador) or p.silencio == "no")]:
638                  personaje.controlador.describir_entorno(accion)                  personaje.controlador.describir_entorno(accion)
639    
640    
641      def actuar_global(self, accion):      def actuar_global(self, accion):
642          """Muestra lo que hace el personaje, de forma que lo vean todos los jugadores conectados."""          """Muestra lo que hace el personaje, de forma que lo vean todos los jugadores conectados."""
643          from mundo import Mundo          from mundo import Mundo
644            from personajejugador import PersonajeJugador # %% PARCHE!!!! la comprobacion de "silencio" debe hacerse dentro de InterfazPJ, pues solo afecta a PJs.
645          for sala in Mundo.salas:          for sala in Mundo.salas:
646              for personaje in [ p for p in sala.personajes.values()              for personaje in [ p for p in sala.personajes.values()
647                                 if p != self and p.controlador != None and p.silencio == "no"]:                                 if p != self and p.controlador != None and (not isinstance(p, PersonajeJugador) or p.silencio == "no")]:
648                  personaje.controlador.actua_global_personaje(self, accion)                  personaje.controlador.actua_global_personaje(self, accion)
649    
650    
# Line 650  class Personaje: Line 675  class Personaje:
675      def gritar(self, mensaje, idioma=None):      def gritar(self, mensaje, idioma=None):
676          """Dice un texto en voz muy alta de forma que lo oigan todos los jugadores conectados."""          """Dice un texto en voz muy alta de forma que lo oigan todos los jugadores conectados."""
677          from mundo import Mundo          from mundo import Mundo
678            from personajejugador import PersonajeJugador # %% PARCHE!!!! la comprobacion de "silencio" debe hacerse dentro de InterfazPJ, pues solo afecta a PJs.
679          for sala in Mundo.salas:          for sala in Mundo.salas:
680              for personaje in [ p for p in sala.personajes.values()              for personaje in [ p for p in sala.personajes.values()
681                                 if p != self and p.controlador != None and p.silencio == "no"]:                                 if p != self and p.controlador != None and (not isinstance(p, PersonajeJugador) or p.silencio == "no")]:
682                  msg_f = self.mensaje_filtrado(mensaje, idioma, personaje)                  msg_f = self.mensaje_filtrado(mensaje, idioma, personaje)
683                  personaje.controlador.grita_personaje(self, msg_f)                  personaje.controlador.grita_personaje(self, msg_f)
684    

Legend:
Removed from v.1.18  
changed lines
  Added in v.1.19

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