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' |
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 |
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 |
|
|
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 |
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 |
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 |
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 |
""" |
""" |
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 |
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 = [] |
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: |
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) |
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 |
|
|
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 |
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 |
|
|
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 |
|
|
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 |
|
|
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. |