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

Diff of /ambar/sala.py

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

revision 2.14 by amoyav, Mon Aug 4 17:52:44 2003 UTC revision 2.15 by amoyav, Mon Aug 4 19:04:46 2003 UTC
# Line 55  class Sala(object): Line 55  class Sala(object):
55    
56      # Version del sistema de salas (se incrementa cada vez que varian los atributos      # Version del sistema de salas (se incrementa cada vez que varian los atributos
57      # de la clase Sala)      # de la clase Sala)
58      VERSION_SALA = '1.2.1'      VERSION_SALA = '1.2.2'
59    
60      DIR_DESC_SALAS = 'desc_salas'      DIR_DESC_SALAS = 'desc_salas'
61      EXT_DESC_SALAS = '.xml'      EXT_DESC_SALAS = '.xml'
# Line 310  class Sala(object): Line 310  class Sala(object):
310                              - "maximo" (int): maximos objetos que pueden aparecer (si es 0,                              - "maximo" (int): maximos objetos que pueden aparecer (si es 0,
311                                                no hay máximo)                                                no hay máximo)
312                              - "dificultad" (int): dificultad para percibirlo (0-100)                              - "dificultad" (int): dificultad para percibirlo (0-100)
313                                - "cantidad" (int): cantidad inicial de objetos (es útil sobre todo
314                                                    para el editor de salas)
315                                - "descripcion" (string): texto que describe el objeto cuando está
316                                                          en la sala
317                              - "instancias" (Objeto[]): lista con una o más instancias del                              - "instancias" (Objeto[]): lista con una o más instancias del
318                                                         objeto real (puede estar vacía si                                                         objeto real (puede estar vacía si
319                                                         probabilidad > 0, porque es posible                                                         probabilidad > 0, porque es posible
# Line 322  class Sala(object): Line 326  class Sala(object):
326                                objetos[i]["probabilidad"] in range(0,100)                                objetos[i]["probabilidad"] in range(0,100)
327                                objetos[i]["maximo"] >= 0                                objetos[i]["maximo"] >= 0
328                                objetos[i]["dificultad"] in range(0,100)                                objetos[i]["dificultad"] in range(0,100)
329                                  objetos[i]["cantidad"] > 0
330                                  objetos[i]["descripcion"] != Null
331                                objetos[i]["instancias"] != Null                                objetos[i]["instancias"] != Null
332                              """)                              """)
333    
# Line 338  class Sala(object): Line 344  class Sala(object):
344                                                   no hay máximo)                                                   no hay máximo)
345                                 - "dificultad" (int): dificultad para percibirlo (0-100)                                 - "dificultad" (int): dificultad para percibirlo (0-100)
346                                 - "descripcion" (string): que aspecto tiene el personaje                                 - "descripcion" (string): que aspecto tiene el personaje
347                                   - "cantidad" (int): cantidad inicial de pnjs (es útil sobre todo
348                                                       para el editor de salas)
349    
350                                Invariantes:                                Invariantes:
351                                    encuentros != None                                    encuentros != None
# Line 347  class Sala(object): Line 355  class Sala(object):
355                                    encuentros[i]["maximo"] >= 0                                    encuentros[i]["maximo"] >= 0
356                                    encuentros[i]["dificultad"] in range(0,100)                                    encuentros[i]["dificultad"] in range(0,100)
357                                    encuentros[i]["descripcion"] != Null                                    encuentros[i]["descripcion"] != Null
358                                      encuentros[i]["cantidad"] > 0
359                                """)                                """)
360    
361      def __leer_personajes(self): return self.__personajes      def __leer_personajes(self): return self.__personajes
# Line 371  class Sala(object): Line 380  class Sala(object):
380                                     n_jugadores <= len(personajes)                                     n_jugadores <= len(personajes)
381                                 """)                                 """)
382    
     def __leer_elem_sal(self): return self.__elem_sal  
       
     elem_sal = property(__leer_elem_sal, doc=""" """)  
       
         # ^ Esto que es, me lo podria uste explicar ???  
         #   (por cierto, no existe ningun self.__elem_sal en ningún sitio...)  
   
383                            
384      def __init__(self, id, conservar_arbol_xml = 0, editar_sala = False):      def __init__(self, id, conservar_arbol_xml = False, crear_contenidos = True):
385          """Crea una sala nueva a partir de un fichero de descripción de sala.          """Crea una sala nueva a partir de un fichero de descripción de sala.
386    
387            id -- el id de la nueva sala
388            conservar_arbol_xml -- si vale True, el árbol XML construido a partir del
389                                   fichero no se borra, por si se quiere usar para
390                                   modificar el fichero (en el editor)
391            crear_contenidos -- indica si se deben crear los objetos y encuentros
392                                contenidos inicialmente en la sala (esto valdrá
393                                False en el editor)
394                    
395          Requiere:          Requiere:
396            id != None            id != None
397            id corresponde con un fichero existente            id corresponde con un fichero existente, o bien id = ""
398          """          """
399          #GPT:Ojo, cuando se edita una sala, puede ser id = "" y no existir fichero          #GPT:Ojo, cuando se edita una sala, puede ser id = "" y no existir fichero
400          #Tengo ya la idea para evitar esto, en cuanto pueda lo arreglo, por ahora          #Tengo ya la idea para evitar esto, en cuanto pueda lo arreglo, por ahora
# Line 400  class Sala(object): Line 410  class Sala(object):
410          # __arbol_xml (minidom.Document, opcional): arbol XML leido del fichero de descripcion.          # __arbol_xml (minidom.Document, opcional): arbol XML leido del fichero de descripcion.
411    
412          self.__id = id          self.__id = id
413          self.__inicializar_sala(conservar_arbol_xml, editar_sala)          self.__inicializar_sala(conservar_arbol_xml, crear_contenidos)
414    
415    
416      def __inicializar_sala(self, conservar_arbol_xml = 0, editar_sala = False):      def __inicializar_sala(self, conservar_arbol_xml = False, crear_contenidos = True):
417          """Rellena todos los datos de la sala a partir de su fichero          """Rellena todos los datos de la sala a partir de su fichero
418          de descripcion.          de descripcion.
419          """          """
# Line 453  class Sala(object): Line 463  class Sala(object):
463              self.__parsear_salidas(elem_salidas)              self.__parsear_salidas(elem_salidas)
464                            
465              elem_objetos = elem_sala.getElementsByTagName('objetos')[0]              elem_objetos = elem_sala.getElementsByTagName('objetos')[0]
466              self.__parsear_objetos(elem_objetos, editar_sala)              self.__parsear_objetos(elem_objetos, crear_contenidos)
467                            
468              elem_encuentros = elem_sala.getElementsByTagName('encuentros')[0]              elem_encuentros = elem_sala.getElementsByTagName('encuentros')[0]
469              self.__parsear_encuentros(elem_encuentros, editar_sala)              self.__parsear_encuentros(elem_encuentros, crear_contenidos)
470    
471              if conservar_arbol_xml:              if conservar_arbol_xml:
472                  self.__elem_sala=elem_sala                  self.__elem_sala=elem_sala
# Line 607  class Sala(object): Line 617  class Sala(object):
617                                     "mensaje_cerrado": mensaje_cerrado_salida})                                     "mensaje_cerrado": mensaje_cerrado_salida})
618    
619    
620      def __parsear_objetos(self, elem_objetos, editar_sala):      def __parsear_objetos(self, elem_objetos, crear_contenidos):
621          """Extrae toda la información de los objetos que hay en la sala inicialmente."""          """Extrae toda la información de los objetos que hay en la sala inicialmente."""
622    
623          self.__objetos = []          self.__objetos = []
# Line 616  class Sala(object): Line 626  class Sala(object):
626          for elem_objeto in elems_objeto:          for elem_objeto in elems_objeto:
627                    
628              id_objeto = extraer_atributo_xml(elem_objeto,'id')              id_objeto = extraer_atributo_xml(elem_objeto,'id')
629  #           desc_objeto = extraer_contenido_xml(elem_objeto)  
630  #        desc_objeto= " ".join(texto_item.split()) # elimina todos los espacios redundantes              desc_objeto = extraer_contenido_xml(elem_objeto)
631                desc_objeto= " ".join(desc_objeto.split()) # elimina todos los espacios redundantes
632                    
633              if elem_objeto.hasAttribute('cantidad'):              if elem_objeto.hasAttribute('cantidad'):
634                  try:                  try:
# Line 667  class Sala(object): Line 678  class Sala(object):
678              else:              else:
679                  dif_objeto = 0                    dif_objeto = 0  
680    
681                  instancias = []              instancias = []
682              if editar_sala == False:                  
683                if crear_contenidos:                
684                  for i in range(cantidad_objeto):                  for i in range(cantidad_objeto):
685                      instancia = Objeto(id_objeto)                      instancia = Objeto(id_objeto)
686                      instancia.contener(self)                      instancia.contener(self)
687                      instancias.append(instancia)                      instancias.append(instancia)
688            
689                  self.__objetos.append({"id": id_objeto,              self.__objetos.append({"id": id_objeto,
690                                         "probabilidad": prob_objeto,                                     "probabilidad": prob_objeto,
691                                         "maximo": max_objeto,                                     "maximo": max_objeto,
692                                         "dificultad": dif_objeto,                                     "dificultad": dif_objeto,
693                                         "instancias": instancias})                                     "cantidad": cantidad_objeto,
694              else:                                     "descripcion": desc_objeto,
695                  #GPT Hay que pasar la descripcion al parseado normal (no solo                                     "instancias": instancias})
                 # cuando se este editando la sala) y modificar el pickle  
                 desc_objeto = extraer_contenido_xml(elem_objeto)  
                 self.__objetos.append({"id": id_objeto,  
                                        "probabilidad": prob_objeto,  
                                        "maximo": max_objeto,  
                                        "dificultad": dif_objeto,  
                                        "cantidad": cantidad_objeto,  
                                        "descripcion": desc_objeto})  
696                    
697      def __parsear_encuentros(self, elem_encuentros, editar_sala):  
698        def __parsear_encuentros(self, elem_encuentros, crear_contenidos):
699          """Extrae toda la información de los PNJs que hay en la sala inicialmente."""          """Extrae toda la información de los PNJs que hay en la sala inicialmente."""
700                    
701          #limpiar_nodos_text_xml(elem_encuentros)          #limpiar_nodos_text_xml(elem_encuentros)
# Line 745  class Sala(object): Line 750  class Sala(object):
750                  dif_encuentro = 0                  dif_encuentro = 0
751              desc_encuentro = extraer_contenido_xml(elem_encuentro)              desc_encuentro = extraer_contenido_xml(elem_encuentro)
752                            
753              if editar_sala == False:              if crear_contenidos:
                 self.__encuentros.append({"id": id_encuentro,  
                                           "maximo": max_encuentro,  
                                           "probabilidad": prob_encuentro,  
                                           "dificultad": dif_encuentro,  
                                           "descripcion": desc_encuentro})  
   
754                  escribir("Vamos a crear " + str(cant_encuentro) + " pnjs")                  escribir("Vamos a crear " + str(cant_encuentro) + " pnjs")
755                  for i in range(cant_encuentro):                  for i in range(cant_encuentro):
756                      id_unico = id_encuentro + '%' + PersonajeNoJugador.nuevo_id()                      id_unico = id_encuentro + '%' + PersonajeNoJugador.nuevo_id()
757                      escribir("Vamos a crear a " + id_unico)                      escribir("Vamos a crear a " + id_unico)
758                      self.__personajes[id_unico] = PersonajeNoJugador.nuevo(id_unico, self)                      self.__personajes[id_unico] = PersonajeNoJugador.nuevo(id_unico, self)
759              else:  
760                  self.__encuentros.append({"id": id_encuentro,              self.__encuentros.append({"id": id_encuentro,
761                                            "maximo": max_encuentro,                                        "maximo": max_encuentro,
762                                            "probabilidad": prob_encuentro,                                        "probabilidad": prob_encuentro,
763                                            "dificultad": dif_encuentro,                                        "dificultad": dif_encuentro,
764                                            "descripcion": desc_encuentro,                                        "descripcion": desc_encuentro,
765                                            "cantidad":cant_encuentro})                                            "cantidad":cant_encuentro})    
766    
767      # Métodos normales      # Métodos normales
768    
# Line 915  class Sala(object): Line 914  class Sala(object):
914          for objeto in self.__objetos:          for objeto in self.__objetos:
915              n_objeto = n_objeto + 1              n_objeto = n_objeto + 1
916              if len(objeto["instancias"]) > 0:              if len(objeto["instancias"]) > 0:
917                  if normalizar_id(id_objeto) == extraer_id(objeto["instancias"][0].nombre):                  if normalizar_id(id_objeto) == extraer_id(objeto["descripcion"]):
918                      encontrados = encontrados + 1                      encontrados = encontrados + 1
919                      if encontrados == n_orden:                      if encontrados == n_orden:
920                          break                          break
# Line 983  class Sala(object): Line 982  class Sala(object):
982    
983          # Asumimos que ningún personaje puede levantar más de 10 Tm. Es una manera          # Asumimos que ningún personaje puede levantar más de 10 Tm. Es una manera
984          # de representar objetos fijos al suelo, que no se pueden levantar.          # de representar objetos fijos al suelo, que no se pueden levantar.
985            objeto["instancias"][0].activar()  # para corregir cierto fallo en algunos objetos
986          if objeto["instancias"][0].peso > 10000:          if objeto["instancias"][0].peso > 10000:
987              raise ExcepcionDeJuego("Este objeto no se puede coger.")              raise ExcepcionDeJuego("Este objeto no se puede coger.")
988    
# Line 1024  class Sala(object): Line 1024  class Sala(object):
1024                                     "probabilidad":0,                                     "probabilidad":0,
1025                                     "maximo":0,                                     "maximo":0,
1026                                     "dificultad":dificultad,                                     "dificultad":dificultad,
1027                                       "cantidad":len(objetos),
1028                                       "descripcion": objetos[0].nombre,
1029                                     "instancias":objetos})                                     "instancias":objetos})
1030    
1031    
# Line 1071  class Sala(object): Line 1073  class Sala(object):
1073                                     "probabilidad":0,                                     "probabilidad":0,
1074                                     "maximo":0,                                     "maximo":0,
1075                                     "dificultad":dificultad,                                     "dificultad":dificultad,
1076                                       "cantidad":1,
1077                                       "descripcion":objeto_nuevo.nombre,
1078                                     "instancias":[objeto_nuevo]})                                     "instancias":[objeto_nuevo]})
1079    
1080    
# Line 1195  class Sala(object): Line 1199  class Sala(object):
1199              raise ValueError("Cargada sala " + self.__id + " obsoleta: sin versión" +              raise ValueError("Cargada sala " + self.__id + " obsoleta: sin versión" +
1200                               " cuando se esperaba " + Sala.VERSION_SALA)                               " cuando se esperaba " + Sala.VERSION_SALA)
1201    
1202          assert(Sala.VERSION_SALA == "1.2.1")          assert(Sala.VERSION_SALA == "1.2.2")
1203          while self.__version != "1.2.1":          while self.__version != "1.2.2":
1204    
1205          # La versión 1.2.1 produce una ruptura con las anteriores ya que se migra al formato              # La versión 1.2.1 produce una ruptura con las anteriores ya que se migra al formato
1206          # de clases de Python 2.2, y no es compatible con el anterior. Hay que borrar todas              # de clases de Python 2.2, y no es compatible con el anterior. Hay que borrar todas
1207          # las salas, personajes y objetos.              # las salas, personajes y objetos.
1208          #          
1209          #    if self.__version == "1.0":              if self.__version == "1.2.1":
1210          #        # Versión 1.0 -> 1.1: añadir fecha de modificacion de archivo de descripcion                  # Version 1.2.1 -> 1.2.2: añadir cantidad y descripcion a los objetos, y cantidad
1211          #        archivo = os.path.join(Sala.DIR_DESC_SALAS, self.__id + Sala.EXT_DESC_SALAS)                  # a los encuentros.
1212          #        self.__fecha_fichero = os.path.getmtime(archivo)                  for objeto in self.__objetos:
1213          #        self.__version = "1.1"                      objeto["cantidad"] = len(objeto["instancias"])
1214          #        escribir("Convertida sala " + self.__id + " a versión 1.1")                      if len(objeto["instancias"]) > 0:
1215          #   elif self.__version == "1.1":                          objeto["descripcion"] = objeto["instancias"][0].nombre
1216          #       (...etc...)                      else:
1217                            instancia = Objeto(objeto["id"])
1218              raise ValueError("Cargada sala " + self.__id + " con versión desconocida: " +                          objeto["descripcion"] = instancia.nombre
1219                               self.__version + " cuando se esperaba " + Sala.VERSION_SALA)                  for encuentro in self.__encuentros:
1220                        encuentro["cantidad"] = 1
1221                    self.__version = "1.2.2"
1222                    escribir("Convertida sala " + self.__id + " a versión 1.2.2")
1223                else:
1224                    raise ValueError("Cargada sala " + self.__id + " con versión desconocida: " +
1225                                     self.__version + " cuando se esperaba " + Sala.VERSION_SALA)
1226    
1227                    
1228  # Código para pruebas unitarias del módulo.  # Código para pruebas unitarias del módulo.

Legend:
Removed from v.2.14  
changed lines
  Added in v.2.15

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