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

Diff of /ambar/sala.py

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

revision 2.11 by amoyav, Tue Jul 8 06:17:46 2003 UTC revision 2.12 by amoyav, Wed Jul 30 14:17:58 2003 UTC
# Line 29  import sys Line 29  import sys
29  import string  import string
30  import os  import os
31  import cPickle  import cPickle
32    import sre
33    
34  from objeto import *  from objeto import *
35  from utils import *  from utils import *
# Line 399  class Sala(object): Line 400  class Sala(object):
400          self.__inicializar_sala(conservar_arbol_xml)          self.__inicializar_sala(conservar_arbol_xml)
401    
402    
403      def __inicializar_sala(self,conservar_arbol_xml):      def __inicializar_sala(self, conservar_arbol_xml=0):
404          """Rellena todos los datos de la sala a partir de su fichero          """Rellena todos los datos de la sala a partir de su fichero
405          de descripcion.          de descripcion.
406          """          """
# Line 646  class Sala(object): Line 647  class Sala(object):
647              else:              else:
648                  dif_objeto = 0                    dif_objeto = 0  
649    
650                  instancias = []              instancias = []
651              for i in range(cantidad_objeto):              for i in range(cantidad_objeto):
652                  instancias.append(Objeto(id_objeto))                  instancia = Objeto(id_objeto)
653                    instancia.contener(self)
654                    instancias.append(instancia)
655    
656              self.__objetos.append({"id": id_objeto,              self.__objetos.append({"id": id_objeto,
657                                     "probabilidad": prob_objeto,                                     "probabilidad": prob_objeto,
658                         "maximo": max_objeto,                                     "maximo": max_objeto,
659                         "dificultad": dif_objeto,                                     "dificultad": dif_objeto,
660                         "instancias": instancias})                                     "instancias": instancias})
661                    
662    
663      def __parsear_encuentros(self, elem_encuentros):      def __parsear_encuentros(self, elem_encuentros):
# Line 802  class Sala(object): Line 805  class Sala(object):
805                  if tirar_porcentaje() <= objeto["probabilidad"]:                  if tirar_porcentaje() <= objeto["probabilidad"]:
806                      if tirar_porcentaje() <= 50:                      if tirar_porcentaje() <= 50:
807                          if len(objeto["instancias"]) > 0:                          if len(objeto["instancias"]) > 0:
808                                objeto["instancias"][0].liberar()
809                              del objeto["instancias"][0]                              del objeto["instancias"][0]
810                      else:                      else:
811                          if (objeto["maximo"] == 0 or                          if (objeto["maximo"] == 0 or
812                              len(objeto["instancias"]) < objeto["maximo"]):                            len(objeto["instancias"]) < objeto["maximo"]):
813                              objeto["instancias"].append(Objeto(objeto["id"]))                              instancia = Objeto(objeto["id"])
814                                instancia.contener(self)
815                                objeto["instancias"].append(instancia)
816    
817                            
818      def salir_personaje(self, personaje):      def salir_personaje(self, personaje):
# Line 888  class Sala(object): Line 894  class Sala(object):
894              return n_objeto              return n_objeto
895    
896    
897        def acceder_a_objeto(self, n_objeto, n_instancia=1):
898            """Accede a una instancia de un objeto para trabajar con ella, pero sin sacarla
899            de la sala.
900            
901            - n_objeto es el número de orden del objeto dentro de la sala
902            - n_instancia es el número de orden de la instancia a extraer
903    
904            Devuelve la instancia elegida.
905    
906            Lanza ExcepcionDeJuego si no puede acceder a ella.
907    
908            Requiere:
909                n_objeto in range(0, len(self.objetos))
910                n_instancia >= 1
911    
912            Asegura:
913                return != None
914            """
915            objeto = self.__objetos[n_objeto]
916            return objeto["instancias"][n_instancia-1]
917    
918    
919      def coger(self, n_objeto, n_instancia=1, cantidad=1):      def coger(self, n_objeto, n_instancia=1, cantidad=1):
920          """Sacar una o varias instancias de un objeto de la sala.          """Sacar una o varias instancias de un objeto de la sala.
921                    
# Line 916  class Sala(object): Line 944  class Sala(object):
944                                     " instancias de ese objeto, solo hay " +                                     " instancias de ese objeto, solo hay " +
945                                     str(len(objeto["instancias"])))                                     str(len(objeto["instancias"])))
946    
947            # Asumimos que ningún personaje puede levantar más de 10 Tm. Es una manera
948            # de representar objetos fijos al suelo, que no se pueden levantar.
949            if objeto["instancias"][0].peso > 10000:
950                raise ExcepcionDeJuego("Este objeto no se puede coger.")
951    
952          objetos_cogidos = []          objetos_cogidos = []
953    
954          instancias = objeto["instancias"]          instancias = objeto["instancias"]
955          for i in range(0, cantidad):          for i in range(0, cantidad):
956              objetos_cogidos.append(instancias[n_instancia-1])              objetos_cogidos.append(instancias[n_instancia-1])
957              instancias[n_instancia-1].activar()              instancias[n_instancia-1].activar()
958                instancias[n_instancia-1].liberar()
959              del instancias[n_instancia-1]              del instancias[n_instancia-1]
960    
961          if len(instancias) == 0 and objeto["probabilidad"] == 0:          if len(instancias) == 0 and objeto["probabilidad"] == 0:
# Line 941  class Sala(object): Line 975  class Sala(object):
975              len(objetos) >= 1              len(objetos) >= 1
976              dificultad in range(0, 100)              dificultad in range(0, 100)
977          """          """
978          encontrado = 0          for objeto in objetos:
979                objeto.contener(self)
980                    
981          for objeto in self.__objetos:          for objeto in self.__objetos:
982              if objeto["id"] == objetos[0].id:              if objeto["id"] == objetos[0].id:
                 encontrado = 1  
983                  objeto["instancias"].extend(objetos)                  objeto["instancias"].extend(objetos)
984                  break                  break
985            else:
986                self.__objetos.append({"id":objetos[0].id,
987                                       "probabilidad":0,
988                                       "maximo":0,
989                                       "dificultad":dificultad,
990                                       "instancias":objetos})
991    
992    
993          if not encontrado:      def objeto_destruido(self, objeto_destruido):
994            """Un objeto contenido en esta sala ha sido destruido.
995    
996            Hay que eliminarlo de la lista de instancias de la sala. Este método será llamado
997            sólo desde el propio objeto, a través del interfaz Contenedor.
998            """
999            objeto_destruido.liberar()
1000            for i, objeto in izip(self.__objetos):
1001                instancias = objeto["instancias"]
1002                for j, instancia in izip(instancias):
1003                    if instancia == objeto_destruido:
1004                        del instancias[j]
1005                        if len(instancias) == 0 and objeto["probabilidad"] == 0:
1006                            del self.__objetos[i]
1007                        break
1008    
1009    
1010        def objeto_reemplazado(self, objeto_antiguo, objeto_nuevo):
1011            """Un objeto contenido en esta sala ha sido destruido, y reemplazado por otro.
1012    
1013            Hay que eliminar el antiguo de la lista de instancias de la sala, y añadir el nuevo.
1014            Este método será llamado sólo desde el propio objeto, a través del interfaz Contenedor.
1015            """
1016            objeto_antiguo.liberar()
1017            for i, objeto in izip(self.__objetos):
1018                instancias = objeto["instancias"]
1019                for j, instancia in izip(instancias):
1020                    if instancia == objeto_antiguo:
1021                        del instancias[j]
1022                        if len(instancias) == 0 and objeto["probabilidad"] == 0:
1023                            del self.__objetos[i]
1024                        break
1025    
1026            objeto_nuevo.contener(self)
1027            
1028            for objeto in self.__objetos:
1029                if objeto["id"] == objeto_nuevo.id:
1030                    objeto["instancias"].append(objeto_nuevo)
1031                    break
1032            else:
1033              self.__objetos.append({"id":instancia.id,              self.__objetos.append({"id":instancia.id,
1034                                     "probabilidad":0,                                     "probabilidad":0,
1035                                     "maximo":0,                                     "maximo":0,
1036                                     "dificultad":dificultad,                                     "dificultad":dificultad,
1037                                     "instancias":objetos})                                     "instancias":[objeto_nuevo]})
1038    
1039    
1040        def objeto_en_sala(self, nombre_objeto):
1041            """Comprueba si en la sala existe un objeto con el nombre indicado.
1042    
1043            El nombre puede ser una expresión regular simple (con * y ?, como los wilcards de DOS).
1044    
1045            Requiere:
1046                nombre_objeto != None
1047            """
1048            # Convertir la expresion regular de tipo ?* al estilo del módulo sre.
1049            nombre_objeto = "^" + nombre_objeto.replace("?", ".").replace("*", ".*") + "$"
1050            for objeto in self.__objetos:
1051                if len(objeto["instancias"]) > 0:
1052                    if sre.match(nombre_objeto, objeto["instancias"][0].nombre):
1053                        resultado = 1
1054                        break
1055            else:
1056                resultado = 0
1057    
1058            return resultado
1059    
1060    
1061      def salida_cerrada(self, id_sala_destino):      def salida_cerrada(self, id_sala_destino):

Legend:
Removed from v.2.11  
changed lines
  Added in v.2.12

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