62 |
EXT_SALAS = '' |
EXT_SALAS = '' |
63 |
|
|
64 |
|
|
65 |
TIPOS_SALA = { "Población" : [ "calle", "callejón", "plaza", |
TIPOS_SALA = { "Población" : [ "calle", "callejón", "plaza", |
66 |
"portal", "pasadizo", "arco", |
"portal", "pasadizo", "arco", |
67 |
"puerto", "embarcadero", "azotea" ], |
"puerto", "embarcadero", "azotea" ], |
68 |
|
|
69 |
"Edificio" : [ "salón","habitación","pasillo", |
"Edificio" : [ "salón", "habitación", "pasillo", |
70 |
"escaleras","vestíbulo","cuarto sin ventanas", |
"escaleras", "vestíbulo", "cuarto sin ventanas", |
71 |
"sótano", "calabozo", "alcantarilla", "tejado", |
"sótano", "calabozo", "alcantarilla", "tejado", |
72 |
"balcón", "letrina" ], |
"balcón", "letrina" ], |
73 |
|
|
74 |
"Campo" : [ "llanura", "bosque", "claro de bosque", "colina", |
"Campo" : [ "llanura", "bosque", "claro de bosque", "colina", |
75 |
"valle", "pantano", "páramo", "desierto" ], |
"valle", "pantano", "páramo", "desierto" ], |
|
|
|
|
"Agua" : [ "ribera", "costa", "acantilado", "cala", "rio", |
|
|
"lago", "mar", "islote" ], |
|
76 |
|
|
77 |
"Montaña" : [ "cima", "ladera", "promontorio", "grieta", |
"Agua" : [ "ribera", "costa", "acantilado", "cala", "rio", |
78 |
"desfiladero", "quebrada", "abismo", "cornisa" ], |
"lago", "mar", "islote" ], |
79 |
|
|
80 |
"Caverna" : ["entrada", "cueva", "pasadizo", "sima", |
"Montaña" : [ "cima", "ladera", "promontorio", "grieta", |
81 |
"rio subterráneo", "lago subterráneo"] |
"desfiladero", "quebrada", "abismo", "cornisa" ], |
82 |
} |
|
83 |
|
"Caverna" : [ "entrada", "cueva", "pasadizo", "sima", |
84 |
|
"rio subterráneo", "lago subterráneo"] |
85 |
|
} |
86 |
|
|
87 |
|
|
88 |
# Métodos estáticos |
# Métodos estáticos |
89 |
|
|
90 |
def cargar(id): |
def cargar(id): |
113 |
# Atributos públicos de la clase |
# Atributos públicos de la clase |
114 |
|
|
115 |
def __leer_id(self): return self.__id |
def __leer_id(self): return self.__id |
|
|
|
116 |
def __set_id(self,id): self.__id = id |
def __set_id(self,id): self.__id = id |
117 |
|
|
118 |
id = property(__leer_id,__set_id, |
id = property(__leer_id,__set_id, |
119 |
doc="""(string): identifica univocamente a la sala. |
doc="""(string): identifica univocamente a la sala. |
120 |
|
|
126 |
""") |
""") |
127 |
|
|
128 |
def __leer_version(self): return self.__version |
def __leer_version(self): return self.__version |
|
|
|
129 |
def __set_version(self,version): self.__version = version |
def __set_version(self,version): self.__version = version |
130 |
|
|
131 |
version = property(__leer_version, __set_version, |
version = property(__leer_version, __set_version, |
136 |
""") |
""") |
137 |
|
|
138 |
def __leer_autor(self): return self.__autor |
def __leer_autor(self): return self.__autor |
|
|
|
139 |
def __set_autor(self,autor): self.__autor = autor |
def __set_autor(self,autor): self.__autor = autor |
140 |
|
|
141 |
autor = property(__leer_autor, __set_autor, |
autor = property(__leer_autor, __set_autor, |
146 |
""") |
""") |
147 |
|
|
148 |
def __leer_area(self): return self.__area |
def __leer_area(self): return self.__area |
|
|
|
149 |
def __set_area(self, area): self.__area =area |
def __set_area(self, area): self.__area =area |
150 |
|
|
151 |
area = property(__leer_area, __set_area, |
area = property(__leer_area, __set_area, |
156 |
""") |
""") |
157 |
|
|
158 |
def __leer_comentario(self): return self.__comentario |
def __leer_comentario(self): return self.__comentario |
|
|
|
159 |
def __set_comentario(self, comentario): self.__comentario = comentario |
def __set_comentario(self, comentario): self.__comentario = comentario |
160 |
|
|
161 |
comentario = property(__leer_comentario, __set_comentario, |
comentario = property(__leer_comentario, __set_comentario, |
166 |
""") |
""") |
167 |
|
|
168 |
def __leer_nombre(self): return self.__nombre |
def __leer_nombre(self): return self.__nombre |
|
|
|
169 |
def __set_nombre(self,nombre): self.__nombre = nombre |
def __set_nombre(self,nombre): self.__nombre = nombre |
170 |
|
|
171 |
nombre = property(__leer_nombre,__set_nombre, |
nombre = property(__leer_nombre,__set_nombre, |
177 |
""") |
""") |
178 |
|
|
179 |
def __leer_aura(self): return self.__aura |
def __leer_aura(self): return self.__aura |
|
|
|
180 |
def __set_aura(self, aura): self.__aura = aura |
def __set_aura(self, aura): self.__aura = aura |
181 |
|
|
182 |
aura = property(__leer_aura, __set_aura, |
aura = property(__leer_aura, __set_aura, |
188 |
""") |
""") |
189 |
|
|
190 |
def __leer_tipo(self): return self.__tipo |
def __leer_tipo(self): return self.__tipo |
|
|
|
191 |
def __set_tipo(self, tipo): self.__tipo = tipo |
def __set_tipo(self, tipo): self.__tipo = tipo |
192 |
|
|
193 |
tipo = property(__leer_tipo,__set_tipo, |
tipo = property(__leer_tipo,__set_tipo, |
195 |
""") |
""") |
196 |
|
|
197 |
def __leer_subtipo(self): return self.__subtipo |
def __leer_subtipo(self): return self.__subtipo |
|
|
|
198 |
def __set_subtipo(self, subtipo): self.__subtipo = subtipo |
def __set_subtipo(self, subtipo): self.__subtipo = subtipo |
199 |
|
|
200 |
subtipo = property(__leer_subtipo,__set_subtipo, |
subtipo = property(__leer_subtipo,__set_subtipo, |
202 |
""") |
""") |
203 |
|
|
204 |
def __leer_volumen(self): return self.__volumen |
def __leer_volumen(self): return self.__volumen |
205 |
|
def __set_volumen(self, volumen): self.__volumen = float(volumen) |
|
def __set_volumen(self, volumen): |
|
|
self.__volumen = float(volumen) |
|
|
print("volumen: "+`self.volumen`) |
|
206 |
|
|
207 |
volumen = property(__leer_volumen,__set_volumen, |
volumen = property(__leer_volumen,__set_volumen, |
208 |
doc="""(float): volumen total que puede contener |
doc="""(float): volumen total que puede contener |
213 |
""") |
""") |
214 |
|
|
215 |
def __leer_luz(self): return self.__luz |
def __leer_luz(self): return self.__luz |
|
|
|
216 |
def __set_luz(self, luz): self.__luz = luz |
def __set_luz(self, luz): self.__luz = luz |
217 |
|
|
218 |
luz = property(__leer_luz, __set_luz, |
luz = property(__leer_luz, __set_luz, |
224 |
""") |
""") |
225 |
|
|
226 |
def __leer_combate(self): return self.__combate |
def __leer_combate(self): return self.__combate |
|
|
|
227 |
def __set_combate(self, combate): self.__combate = combate |
def __set_combate(self, combate): self.__combate = combate |
228 |
|
|
229 |
combate = property(__leer_combate, __set_combate, |
combate = property(__leer_combate, __set_combate, |
234 |
""") |
""") |
235 |
|
|
236 |
def __leer_ocultabilidad(self): return self.__ocultabilidad |
def __leer_ocultabilidad(self): return self.__ocultabilidad |
|
|
|
237 |
def __set_ocultabilidad(self, ocultabilidad): self.__ocultabilidad = ocultabilidad |
def __set_ocultabilidad(self, ocultabilidad): self.__ocultabilidad = ocultabilidad |
238 |
|
|
239 |
ocultabilidad = property(__leer_ocultabilidad,__set_ocultabilidad, |
ocultabilidad = property(__leer_ocultabilidad,__set_ocultabilidad, |
372 |
|
|
373 |
def __leer_elem_sal(self): return self.__elem_sal |
def __leer_elem_sal(self): return self.__elem_sal |
374 |
|
|
375 |
elem_sal=property(__leer_elem_sal, doc=""" """) |
elem_sal = property(__leer_elem_sal, doc=""" """) |
376 |
|
|
377 |
# Constructor |
# ^ Esto que es, me lo podria uste explicar ??? |
378 |
#def __init__(self, conservar_arbol_xml = 0): |
# (por cierto, no existe ningun self.__elem_sal en ningún sitio...) |
379 |
#tenemos que hacer un constructor que parta de cero |
|
380 |
|
|
381 |
def __init__(self, id, conservar_arbol_xml = 0): |
def __init__(self, id, conservar_arbol_xml = 0): |
382 |
"""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. |
392 |
# |
# |
393 |
# Invariantes: |
# Invariantes: |
394 |
# __fecha_fichero >= 0 |
# __fecha_fichero >= 0 |
395 |
|
# |
396 |
|
# __arbol_xml (minidom.Document, opcional): arbol XML leido del fichero de descripcion. |
397 |
|
|
398 |
self.__id = id |
self.__id = id |
399 |
self.__inicializar_sala(conservar_arbol_xml) |
self.__inicializar_sala(conservar_arbol_xml) |
406 |
self.__personajes = {} |
self.__personajes = {} |
407 |
self.__n_jugadores = 0 |
self.__n_jugadores = 0 |
408 |
|
|
|
|
|
|
# Atributos privados: |
|
|
# |
|
|
# __arbol_xml (minidom.Document, opcional): arbol XML leido del fichero de descripcion. |
|
|
|
|
409 |
archivo = os.path.join(Sala.DIR_DESC_SALAS, self.__id.split('-')[0], |
archivo = os.path.join(Sala.DIR_DESC_SALAS, self.__id.split('-')[0], |
410 |
self.__id + Sala.EXT_DESC_SALAS) |
self.__id + Sala.EXT_DESC_SALAS) |
411 |
|
|
471 |
else: |
else: |
472 |
self.__comentario = "" |
self.__comentario = "" |
473 |
|
|
474 |
|
|
475 |
def __parsear_id(self, elem_id): |
def __parsear_id(self, elem_id): |
476 |
"""Extrae el id de la sala""" |
"""Extrae el id de la sala""" |
477 |
id_fichero = extraer_contenido_xml(elem_id) |
id_fichero = extraer_contenido_xml(elem_id) |
478 |
if id_fichero != self.__id: |
if id_fichero != self.__id: |
479 |
raise ValueError("El id no coincide con el nombre del fichero") |
raise ValueError("El id no coincide con el nombre del fichero") |
480 |
|
|
481 |
|
|
482 |
def __parsear_nombre(self, elem_nombre): |
def __parsear_nombre(self, elem_nombre): |
483 |
"""Extrae el nombre de la sala""" |
"""Extrae el nombre de la sala""" |
484 |
self.__nombre = extraer_contenido_xml(elem_nombre) |
self.__nombre = extraer_contenido_xml(elem_nombre) |
485 |
|
|
486 |
|
|
487 |
def __parsear_propiedades(self, elem_propiedades): |
def __parsear_propiedades(self, elem_propiedades): |
488 |
"""Extrae las propiedades globales de la sala.""" |
"""Extrae las propiedades globales de la sala.""" |
489 |
if elem_propiedades.hasAttribute('aura'): |
if elem_propiedades.hasAttribute('aura'): |
561 |
else: |
else: |
562 |
dif_salida = 0 |
dif_salida = 0 |
563 |
#GPT: no gestiono lo siguiente con if pq no se las posibles excepciones que se pueden dar |
#GPT: no gestiono lo siguiente con if pq no se las posibles excepciones que se pueden dar |
564 |
try: |
try: |
565 |
tipo_cierre_salida = extraer_atributo_xml(nodo_salida,'tipo_cierre') |
tipo_cierre_salida = extraer_atributo_xml(nodo_salida,'tipo_cierre') |
566 |
except: |
except: |
567 |
tipo_cierre_salida = "ninguno" |
tipo_cierre_salida = "ninguno" |
568 |
try: |
try: |
569 |
datos_cierre_salida = extraer_atributo_xml(nodo_salida,'datos_cierre') |
datos_cierre_salida = extraer_atributo_xml(nodo_salida,'datos_cierre') |
570 |
except: |
except: |
571 |
datos_cierre_salida = "" |
datos_cierre_salida = "" |
572 |
try: |
try: |
573 |
mensaje_cerrado_salida = extraer_atributo_xml(nodo_salida,'mensaje_cerrado') |
mensaje_cerrado_salida = extraer_atributo_xml(nodo_salida,'mensaje_cerrado') |
574 |
except: |
except: |
575 |
mensaje_cerrado_salida = "Algo te impide pasar" |
mensaje_cerrado_salida = "Algo te impide pasar" |
576 |
|
|
577 |
id_salida = extraer_atributo_xml(nodo_salida,'id') |
id_salida = extraer_atributo_xml(nodo_salida,'id') |
578 |
desc_salida = extraer_contenido_xml(nodo_salida) |
desc_salida = extraer_contenido_xml(nodo_salida) |
579 |
|
|
580 |
self.__salidas.append({"direccion": direccion_salida, |
self.__salidas.append({"direccion": direccion_salida, |
581 |
"dificultad": dif_salida, |
"dificultad": dif_salida, |
582 |
"id": id_salida, |
"id": id_salida, |
583 |
"descripcion": desc_salida, |
"descripcion": desc_salida, |
584 |
"tipo_cierre": tipo_cierre_salida, |
"tipo_cierre": tipo_cierre_salida, |
585 |
"datos_cierre": datos_cierre_salida, |
"datos_cierre": datos_cierre_salida, |
586 |
"mensaje_cerrado": mensaje_cerrado_salida}) |
"mensaje_cerrado": mensaje_cerrado_salida}) |
587 |
|
|
588 |
|
|
848 |
return ocupado |
return ocupado |
849 |
|
|
850 |
|
|
851 |
def coger_objeto(self, n_objeto, n_instancia): |
def buscar_objeto(self, id_objeto, n_orden=1): |
852 |
"""Sacar una instancia de un objeto de la sala. |
"""Localiza un objeto en la sala. |
853 |
|
|
854 |
n_objeto es el numero de orden dentro de los objetos de la sala, y n_instancia |
- id_objeto es el identificador del objeto. Puede haber varios objetos distintos |
855 |
es el numero de la instancia, ambos empezando por cero. |
con el mismo id |
856 |
|
- n_orden sirve para distinguir el objeto si hay mas de uno con el mismo id |
857 |
|
|
858 |
Devuelve una instancia de clase Objeto. |
Devuelve el indice dentro de la lista de objetos de la sala que apunta al objeto buscado. |
859 |
|
|
860 |
|
Lanza ExcepcionDeJuego si no se encuentra. |
861 |
|
|
862 |
Requiere: |
Requiere: |
863 |
n_objeto in range(0, len(self.objetos)-1) |
id_objeto != None |
864 |
n_instancia in range(0, len(self.objetos[n_objeto]["instancias"])-1) |
n_orden >= 1 |
865 |
|
|
866 |
Asegura: |
Asegura: |
867 |
return != None |
return in range(0, len(self.objetos)) |
868 |
""" |
""" |
869 |
|
encontrados = 0 |
870 |
|
n_objeto = -1 |
871 |
|
|
872 |
|
for objeto in self.__objetos: |
873 |
|
n_objeto = n_objeto + 1 |
874 |
|
if len(objeto["instancias"]) > 0: |
875 |
|
if normalizar_id(id_objeto) == extraer_id(objeto["instancias"][0].nombre): |
876 |
|
encontrados = encontrados + 1 |
877 |
|
if encontrados == n_orden: |
878 |
|
break |
879 |
|
|
880 |
|
if encontrados == 0: |
881 |
|
raise ExcepcionDeJuego("No hay en la sala ningún objeto con identificativo " + |
882 |
|
id_objeto) |
883 |
|
elif encontrados < n_orden: |
884 |
|
raise ExcepcionDeJuego("No hay en la sala suficientes objetos con identificativo " + |
885 |
|
id_objeto + ", solo hay " + str(encontrados)) |
886 |
|
|
887 |
|
else: |
888 |
|
return n_objeto |
889 |
|
|
890 |
|
|
891 |
|
def coger(self, n_objeto, n_instancia=1, cantidad=1): |
892 |
|
"""Sacar una o varias instancias de un objeto de la sala. |
893 |
|
|
894 |
|
- n_objeto es el número de orden del objeto dentro de la sala |
895 |
|
- n_instancia es el número de orden de la primera instancia a extraer |
896 |
|
- cantidad es el número de instancias a extraer |
897 |
|
|
898 |
|
Devuelve una lista con las instancias extraidas. |
899 |
|
|
900 |
|
Lanza ExcepcionDeJuego si no puede sacarlas (por ejemplo, se han pedido |
901 |
|
más instancias de las que hay). |
902 |
|
|
903 |
|
Requiere: |
904 |
|
n_objeto in range(0, len(self.objetos)) |
905 |
|
n_instancia >= 1 |
906 |
|
cantidad >= 1 |
907 |
|
|
908 |
|
Asegura: |
909 |
|
return != None |
910 |
|
len(return) == cantidad |
911 |
|
""" |
912 |
objeto = self.__objetos[n_objeto] |
objeto = self.__objetos[n_objeto] |
913 |
|
|
914 |
instancia = objeto["instancias"][n_instancia] |
if (n_instancia + cantidad - 1) > len(objeto["instancias"]): |
915 |
|
raise ExcepcionDeJuego("No hay " + str(n_instancia + cantidad - 1) + |
916 |
|
" instancias de ese objeto, solo hay " + |
917 |
|
str(len(objeto["instancias"]))) |
918 |
|
|
919 |
|
objetos_cogidos = [] |
920 |
|
|
921 |
|
instancias = objeto["instancias"] |
922 |
|
for i in range(0, cantidad): |
923 |
|
objetos_cogidos.append(instancias[n_instancia-1]) |
924 |
|
instancias[n_instancia-1].activar() |
925 |
|
del instancias[n_instancia-1] |
926 |
|
|
927 |
del objeto["instancias"][n_instancia] |
if len(instancias) == 0 and objeto["probabilidad"] == 0: |
|
if len(objeto["instancias"]) == 0 and objeto["probabilidad"] == 0: |
|
928 |
del self.__objetos[n_objeto] |
del self.__objetos[n_objeto] |
929 |
|
|
930 |
instancia.activar() |
return objetos_cogidos |
|
|
|
|
return instancia |
|
931 |
|
|
932 |
|
|
933 |
def dejar_objeto(self, instancia, dificultad = 0): |
def dejar(self, objetos, dificultad = 0): |
934 |
"""Soltar un objeto en la sala. |
"""Soltar una o varias instancias de un objeto en la sala. |
935 |
|
|
936 |
instancia es de clase Objeto. Si ya habia mas instancias con el mismo id en la sala, |
Si dificultad != 0, el objeto queda escondido (excepto si ya había |
937 |
se añade a la lista, y si no, se crea un item nuevo en self.objetos. |
más instancias de ese mismo objeto anteriormente en la sala). |
938 |
|
|
939 |
Requiere: |
Requiere: |
940 |
instancia != None |
objetos != None |
941 |
|
len(objetos) >= 1 |
942 |
dificultad in range(0, 100) |
dificultad in range(0, 100) |
943 |
""" |
""" |
944 |
encontrado = 0 |
encontrado = 0 |
945 |
|
|
946 |
for objeto in self.__objetos: |
for objeto in self.__objetos: |
947 |
if objeto["id"] == instancia.id: |
if objeto["id"] == objetos[0].id: |
948 |
encontrado = 1 |
encontrado = 1 |
949 |
objeto["instancias"].append(instancia) |
objeto["instancias"].extend(objetos) |
950 |
break |
break |
951 |
|
|
952 |
if not encontrado: |
if not encontrado: |
954 |
"probabilidad":0, |
"probabilidad":0, |
955 |
"maximo":0, |
"maximo":0, |
956 |
"dificultad":dificultad, |
"dificultad":dificultad, |
957 |
"instancias":[instancia]}) |
"instancias":objetos}) |
958 |
|
|
959 |
|
|
960 |
def salida_cerrada(self, id_sala_destino): |
def salida_cerrada(self, id_sala_destino): |
1014 |
return (id_llave, salida["mensaje_cerrado"]) |
return (id_llave, salida["mensaje_cerrado"]) |
1015 |
|
|
1016 |
|
|
1017 |
|
def cambiar_aura(self, puntos): |
1018 |
|
"""Modifica el valor de la propiedad aura.""" |
1019 |
|
self.__aura += puntos |
1020 |
|
|
1021 |
|
|
1022 |
|
def ambiente(self, texto, rango_salas=0): |
1023 |
|
"""Ocurre algo que lo ven todos los personajes en esta sala y adyacentes. |
1024 |
|
|
1025 |
|
rango_de_salas es la distancia a la que se percibe el suceso (0 = sólo sala origen, |
1026 |
|
1 = salas a distancia 1, etc.) |
1027 |
|
|
1028 |
|
Requiere: |
1029 |
|
texto != None |
1030 |
|
rango_de_salas >= 0 |
1031 |
|
""" |
1032 |
|
sala = self |
1033 |
|
# Ahora tengo que buscar por ahí el algoritmo de recorrido de grafos sin repeticiones, |
1034 |
|
# con distancia limitada, pero no tengo ganas. Ya lo haré un día de estos. |
1035 |
|
for personaje in [ p for p in sala.personajes.values() if p.controlador != None]: |
1036 |
|
personaje.controlador.suceso_entorno(texto) |
1037 |
|
|
1038 |
|
|
1039 |
def salvar(self): |
def salvar(self): |
1040 |
"""Graba en un fichero de salas la sala con todo su contenido.""" |
"""Graba en un fichero de salas la sala con todo su contenido.""" |
1041 |
|
|