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.2' |
VERSION_SALA = '1.2.3' |
59 |
|
|
60 |
DIR_DESC_SALAS = 'desc_salas' |
DIR_DESC_SALAS = 'desc_salas' |
61 |
EXT_DESC_SALAS = '.xml' |
EXT_DESC_SALAS = '.xml' |
255 |
el item (0 = automatico, |
el item (0 = automatico, |
256 |
100 = imposible) |
100 = imposible) |
257 |
- "texto" (string): el texto del item |
- "texto" (string): el texto del item |
258 |
|
- "personaje_mira" (guion): el guion que se ejecuta cuando |
259 |
|
un personaje mira el item |
260 |
|
|
261 |
Invariantes: |
Invariantes: |
262 |
descripcion != None |
descripcion != None |
287 |
* magia: id de hechizo (sin implementar) |
* magia: id de hechizo (sin implementar) |
288 |
- "mensaje_cerrado" (string): mensaje que sale si se intenta salir |
- "mensaje_cerrado" (string): mensaje que sale si se intenta salir |
289 |
estando cerrada. |
estando cerrada. |
290 |
|
- "personaje_mira" (guion): el guion que se ejecuta cuando un personaje |
291 |
|
mira la salida |
292 |
|
- "personaje_cruza" (guion): el guion que se ejecuta cuando un personaje |
293 |
|
intenta atravesar la salida |
294 |
|
|
295 |
Invariantes: |
Invariantes: |
296 |
salidas != None |
salidas != None |
324 |
objeto real (puede estar vacía si |
objeto real (puede estar vacía si |
325 |
probabilidad > 0, porque es posible |
probabilidad > 0, porque es posible |
326 |
que reaparezcan objetos más tarde) |
que reaparezcan objetos más tarde) |
327 |
|
- "personaje_mira" (Guion): guion que se ejecuta cuando un personaje |
328 |
|
mira la sala |
329 |
|
|
330 |
Invariantes: |
Invariantes: |
331 |
objetos != None |
objetos != None |
576 |
". La dificultad de la descripción tiene que ser de 0 a 100.") |
". La dificultad de la descripción tiene que ser de 0 a 100.") |
577 |
else: |
else: |
578 |
dif_item = 0 |
dif_item = 0 |
579 |
self.__descripcion.append({"dificultad": dif_item, "texto": texto_item}) |
|
580 |
|
guion = None |
581 |
|
for elem_suceso in elem_item.childNodes: |
582 |
|
suceso = extraer_nombre_xml(elem_suceso) |
583 |
|
if suceso == "personaje_mira": |
584 |
|
guion = Guion(elem_suceso, |
585 |
|
macros_tipos = [ ("$observador", "Personaje"), |
586 |
|
("$sala", "Sala") ]) |
587 |
|
|
588 |
|
self.__descripcion.append({"dificultad": dif_item, "texto": texto_item, |
589 |
|
"personaje_mira": guion}) |
590 |
|
|
591 |
|
|
592 |
|
|
626 |
id_salida = extraer_atributo_xml(nodo_salida,'id') |
id_salida = extraer_atributo_xml(nodo_salida,'id') |
627 |
desc_salida = extraer_contenido_xml(nodo_salida) |
desc_salida = extraer_contenido_xml(nodo_salida) |
628 |
|
|
629 |
|
guion_mira = None |
630 |
|
guion_cruza = None |
631 |
|
for elem_suceso in elem_item.childNodes: |
632 |
|
suceso = extraer_nombre_xml(elem_suceso) |
633 |
|
if suceso == "personaje_mira": |
634 |
|
guion_mira = Guion(elem_suceso, |
635 |
|
macros_tipos = [ ("$observador", "Personaje"), |
636 |
|
("$sala", "Sala") ]) |
637 |
|
elif suceso == "personaje_cruza": |
638 |
|
guion_cruza = Guion(elem_suceso, |
639 |
|
macros_tipos = [ ("$viajero", "Personaje"), |
640 |
|
("$sala_origen", "Sala"), |
641 |
|
("$sala_destino", "Sala") ]) |
642 |
|
|
643 |
self.__salidas.append({"direccion": direccion_salida, |
self.__salidas.append({"direccion": direccion_salida, |
644 |
"dificultad": dif_salida, |
"dificultad": dif_salida, |
645 |
"id": id_salida, |
"id": id_salida, |
646 |
"descripcion": desc_salida, |
"descripcion": desc_salida, |
647 |
"tipo_cierre": tipo_cierre_salida, |
"tipo_cierre": tipo_cierre_salida, |
648 |
"datos_cierre": datos_cierre_salida, |
"datos_cierre": datos_cierre_salida, |
649 |
"mensaje_cerrado": mensaje_cerrado_salida}) |
"mensaje_cerrado": mensaje_cerrado_salida, |
650 |
|
"personaje_mira": guion_mira, |
651 |
|
"personaje_cruza": guion_cruza}) |
652 |
|
|
653 |
|
|
654 |
def __parsear_objetos(self, elem_objetos, crear_contenidos): |
def __parsear_objetos(self, elem_objetos, crear_contenidos): |
712 |
else: |
else: |
713 |
dif_objeto = 0 |
dif_objeto = 0 |
714 |
|
|
715 |
|
guion = None |
716 |
|
for elem_suceso in elem_item.childNodes: |
717 |
|
suceso = extraer_nombre_xml(elem_suceso) |
718 |
|
if suceso == "personaje_mira": |
719 |
|
guion = Guion(elem_suceso, |
720 |
|
macros_tipos = [ ("$observador", "Personaje"), |
721 |
|
("$sala", "Sala") ]) |
722 |
|
|
723 |
instancias = [] |
instancias = [] |
724 |
|
|
725 |
if crear_contenidos: |
if crear_contenidos: |
734 |
"dificultad": dif_objeto, |
"dificultad": dif_objeto, |
735 |
"cantidad": cantidad_objeto, |
"cantidad": cantidad_objeto, |
736 |
"descripcion": desc_objeto, |
"descripcion": desc_objeto, |
737 |
"instancias": instancias}) |
"instancias": instancias, |
738 |
|
"personaje_mira": guion}) |
739 |
|
|
740 |
|
|
741 |
def __parsear_encuentros(self, elem_encuentros, crear_contenidos): |
def __parsear_encuentros(self, elem_encuentros, crear_contenidos): |
916 |
self.__n_jugadores -= 1 |
self.__n_jugadores -= 1 |
917 |
|
|
918 |
|
|
919 |
|
def personaje_mira(self, observador): |
920 |
|
"""Responde al suceso de que un personaje mira la descripción de esta sala. |
921 |
|
|
922 |
|
Por cada item de descripcion de la sala, chequea los requisitos y realiza las acciones |
923 |
|
correspondientes. Luego realiza la misma operación con las salidas y los objetos. |
924 |
|
Al final devuelve tres listas, con todos los items de descripción, salidas y objetos |
925 |
|
cuyo guion de respuesta ha devuelto un resultado de éxito. |
926 |
|
|
927 |
|
Requiere: |
928 |
|
observador != None |
929 |
|
""" |
930 |
|
items_devueltos = [] |
931 |
|
salidas_devueltas = [] |
932 |
|
objetos_devueltos = [] |
933 |
|
|
934 |
|
for item in self.__descripcion: |
935 |
|
if item["personaje_mira"] == None: |
936 |
|
items_devueltos.append(item) |
937 |
|
else: |
938 |
|
respuesta = item["personaje_mira"] |
939 |
|
result = respuesta.ejecutar(macros_valores = {"$observador": observador, |
940 |
|
"$sala": self}) |
941 |
|
|
942 |
|
if result == None: # Si ninguna acción acepta o cancela explícitamente el |
943 |
|
result = 1 # suceso, se asume que se acepta |
944 |
|
|
945 |
|
if result: |
946 |
|
items_devueltos.append(item) |
947 |
|
|
948 |
|
for salida in self.__salidas: |
949 |
|
if salida["personaje_mira"] == None: |
950 |
|
salidas_devueltas.append(salida) |
951 |
|
else: |
952 |
|
respuesta = salida["personaje_mira"] |
953 |
|
result = respuesta.ejecutar(macros_valores = {"$observador": observador, |
954 |
|
"$sala": self}) |
955 |
|
|
956 |
|
if result == None: # Si ninguna acción acepta o cancela explícitamente el |
957 |
|
result = 1 # suceso, se asume que se acepta |
958 |
|
|
959 |
|
if result: |
960 |
|
items_devueltos.append(salida) |
961 |
|
|
962 |
|
for objeto in self.__objetos: |
963 |
|
if len(objeto["instancias"]) > 0: |
964 |
|
if objeto["personaje_mira"] == None: |
965 |
|
objetos_devueltos.append(objeto) |
966 |
|
else: |
967 |
|
respuesta = objeto["personaje_mira"] |
968 |
|
result = respuesta.ejecutar(macros_valores = {"$observador": observador, |
969 |
|
"$sala": self, |
970 |
|
"$objeto": objeto["instancias"][0]}) |
971 |
|
|
972 |
|
if result == None: # Si ninguna acción acepta o cancela explícitamente el |
973 |
|
result = 1 # suceso, se asume que se acepta |
974 |
|
|
975 |
|
if result: |
976 |
|
objetos_devueltos.append(objeto) |
977 |
|
|
978 |
|
return (items_devueltos, salidas_devueltas, objetos_devueltos) |
979 |
|
|
980 |
|
|
981 |
def volumen_ocupado(self): |
def volumen_ocupado(self): |
982 |
"""El total de volumen que ocupa toda la gente y objetos que hay dentro. |
"""El total de volumen que ocupa toda la gente y objetos que hay dentro. |
983 |
Asegura: |
Asegura: |
1146 |
objeto["instancias"].extend(objetos) |
objeto["instancias"].extend(objetos) |
1147 |
break |
break |
1148 |
else: |
else: |
1149 |
self.__objetos.append({"id":objetos[0].id, |
self.__objetos.append({"id": objetos[0].id, |
1150 |
"probabilidad":0, |
"probabilidad": 0, |
1151 |
"maximo":0, |
"maximo": 0, |
1152 |
"dificultad":dificultad, |
"dificultad": dificultad, |
1153 |
"cantidad":len(objetos), |
"cantidad": len(objetos), |
1154 |
"descripcion": objetos[0].nombre, |
"descripcion": objetos[0].nombre, |
1155 |
"instancias":objetos}) |
"instancias": objetos, |
1156 |
|
"personaje_mira": None}) |
1157 |
|
|
1158 |
|
|
1159 |
def objeto_desaparece(self, objeto): |
def objeto_desaparece(self, objeto): |
1186 |
objeto["instancias"].append(objeto) |
objeto["instancias"].append(objeto) |
1187 |
break |
break |
1188 |
else: |
else: |
1189 |
self.__objetos.append({"id":instancia.id, |
self.__objetos.append({"id": instancia.id, |
1190 |
"probabilidad":0, |
"probabilidad": 0, |
1191 |
"maximo":0, |
"maximo": 0, |
1192 |
"dificultad":dificultad, |
"dificultad": dificultad, |
1193 |
"cantidad":1, |
"cantidad": 1, |
1194 |
"descripcion":objeto.nombre, |
"descripcion": objeto.nombre, |
1195 |
"instancias":[objeto]}) |
"instancias": [objeto], |
1196 |
|
"personaje_mira": None}) |
1197 |
|
|
1198 |
|
|
1199 |
def objeto_reemplazado(self, objeto_antiguo, objeto_nuevo): |
def objeto_reemplazado(self, objeto_antiguo, objeto_nuevo): |
1328 |
raise ValueError("Cargada sala " + self.__id + " obsoleta: sin versión" + |
raise ValueError("Cargada sala " + self.__id + " obsoleta: sin versión" + |
1329 |
" cuando se esperaba " + Sala.VERSION_SALA) |
" cuando se esperaba " + Sala.VERSION_SALA) |
1330 |
|
|
1331 |
assert(Sala.VERSION_SALA == "1.2.2") |
assert(Sala.VERSION_SALA == "1.2.3") |
1332 |
while self.__version != "1.2.2": |
while self.__version != "1.2.3": |
1333 |
|
|
1334 |
# 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 |
1335 |
# 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 |
1349 |
encuentro["cantidad"] = 1 |
encuentro["cantidad"] = 1 |
1350 |
self.__version = "1.2.2" |
self.__version = "1.2.2" |
1351 |
escribir("Convertida sala " + self.__id + " a versión 1.2.2") |
escribir("Convertida sala " + self.__id + " a versión 1.2.2") |
1352 |
|
elif self.__version == "1.2.2": |
1353 |
|
# Versión 1.2.2 -> 1.2.3: añadir suceso personaje_mira a los items de descripción, |
1354 |
|
# a las salidas y a los objetos, y personaje_cruza a las salidas. |
1355 |
|
for item in self.__descripcion: |
1356 |
|
item["personaje_mira"] = None |
1357 |
|
for objeto in self.__objetos: |
1358 |
|
objeto["personaje_mira"] = None |
1359 |
|
for salida in self.__salidas: |
1360 |
|
salida["personaje_mira"] = None |
1361 |
|
salida["personaje_cruza"] = None |
1362 |
|
self.__version = "1.2.3" |
1363 |
|
escribir("Convertida sala " + self.__id + " a versión 1.2.3") |
1364 |
else: |
else: |
1365 |
raise ValueError("Cargada sala " + self.__id + " con versión desconocida: " + |
raise ValueError("Cargada sala " + self.__id + " con versión desconocida: " + |
1366 |
self.__version + " cuando se esperaba " + Sala.VERSION_SALA) |
self.__version + " cuando se esperaba " + Sala.VERSION_SALA) |