34 |
|
|
35 |
from objeto import * |
from objeto import * |
36 |
from utils import * |
from utils import * |
37 |
|
from fechahoramine import * |
38 |
|
|
39 |
class Sala: |
class Sala: |
40 |
"""Una habitacion o sala dentro del juego. |
"""Una habitacion o sala dentro del juego. |
63 |
- "dificultad" (int): dificultad para percibirla (0-100) |
- "dificultad" (int): dificultad para percibirla (0-100) |
64 |
- "id" (string): el id de la sala a donde se va por ahi |
- "id" (string): el id de la sala a donde se va por ahi |
65 |
- "descripcion" (string): lo que se ve al mirar en esa direccion |
- "descripcion" (string): lo que se ve al mirar en esa direccion |
66 |
|
- "tipo_cierre" (string): el tipo de cerradura que hay (ninguno, |
67 |
|
cerradura, horario, magia) |
68 |
|
- "datos_cierre" (string): información adicional sobre el cierre: |
69 |
|
* ninguno: vacío |
70 |
|
* cerradura: id de objeto llave |
71 |
|
* horario: rango(s) horario(s) de apertura, |
72 |
|
formato hora_ini-hora_fin, separados por |
73 |
|
comas. Puede incluir un espacio y el id |
74 |
|
de la llave que abre cuando está cerrada |
75 |
|
* magia: id de hechizo (sin implementar) |
76 |
|
- "mensaje_cerrado" (string): mensaje que sale si se intenta salir |
77 |
|
estando cerrada. |
78 |
- objetos ({String:any}[]): lista de objetos de la sala, siendo cada objeto un diccionario: |
- objetos ({String:any}[]): lista de objetos de la sala, siendo cada objeto un diccionario: |
79 |
- "id" (string): el id del objeto |
- "id" (string): el id del objeto |
80 |
- "probabilidad" (int): probabilidad de que reaparezca cada vez |
- "probabilidad" (int): probabilidad de que reaparezca cada vez |
135 |
salidas[i]["dificultad"] in range(0,100) |
salidas[i]["dificultad"] in range(0,100) |
136 |
salidas[i]["id"] != Null |
salidas[i]["id"] != Null |
137 |
salidas[i]["descripcion"] != Null |
salidas[i]["descripcion"] != Null |
138 |
|
salidas[i]["tipo_cierre"] in ("ninguno", "cerradura", "horario", "magia") |
139 |
|
salidas[i]["datos_cierre"] != Null |
140 |
|
salidas[i]["mensaje_cerrado"] != Null |
141 |
|
|
142 |
objetos != None |
objetos != None |
143 |
len(objetos) >= 0 |
len(objetos) >= 0 |
166 |
|
|
167 |
# Version del sistema de descripciones de sala (se incrementa cada vez que cambia |
# Version del sistema de descripciones de sala (se incrementa cada vez que cambia |
168 |
# el formato de los ficheros de desc_salas) |
# el formato de los ficheros de desc_salas) |
169 |
VERSION_DESC_SALA = '1.0' |
VERSION_DESC_SALA = '1.2' |
170 |
|
|
171 |
# 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 |
172 |
# de la clase Sala) |
# de la clase Sala) |
173 |
VERSION_SALA = '1.1' |
VERSION_SALA = '1.2' |
174 |
|
|
175 |
DIR_DESC_SALAS = 'desc_salas' |
DIR_DESC_SALAS = 'desc_salas' |
176 |
EXT_DESC_SALAS = '.xml' |
EXT_DESC_SALAS = '.xml' |
358 |
except: |
except: |
359 |
dif_salida = 0 |
dif_salida = 0 |
360 |
try: |
try: |
361 |
horario_salida = nodo_salida._attrs.get('horario').value.encode('ISO-8859-1') |
tipo_cierre_salida = nodo_salida._attrs.get('tipo_cierre').value.encode('ISO-8859-1') |
362 |
except: |
except: |
363 |
horario_salida = "0-24" |
tipo_cierre_salida = "ninguno" |
364 |
try: |
try: |
365 |
error_salida = nodo_salida._attrs.get('error').value.encode('ISO-8859-1') |
datos_cierre_salida = nodo_salida._attrs.get('datos_cierre').value.encode('ISO-8859-1') |
366 |
except: |
except: |
367 |
error_salida = "Algo te impide pasar" |
datos_cierre_salida = "" |
368 |
|
try: |
369 |
|
mensaje_cerrado_salida = nodo_salida._attrs.get('mensaje_cerrado').value.encode('ISO-8859-1') |
370 |
|
except: |
371 |
|
mensaje_cerrado_salida = "Algo te impide pasar" |
372 |
|
|
373 |
id_salida = nodo_salida._attrs.get('id').value.encode('ISO-8859-1') |
id_salida = nodo_salida._attrs.get('id').value.encode('ISO-8859-1') |
374 |
desc_salida = nodo_salida.childNodes[0].data.encode('ISO-8859-1') |
desc_salida = nodo_salida.childNodes[0].data.encode('ISO-8859-1') |
375 |
|
|
376 |
self.salidas.append({"direccion": direccion_salida, |
self.salidas.append({"direccion": direccion_salida, |
377 |
"dificultad": dif_salida, |
"dificultad": dif_salida, |
|
"horario": horario_salida, |
|
|
"error": error_salida, |
|
378 |
"id": id_salida, |
"id": id_salida, |
379 |
"descripcion": desc_salida}) |
"descripcion": desc_salida, |
380 |
|
"tipo_cierre": tipo_cierre_salida, |
381 |
|
"datos_cierre": datos_cierre_salida, |
382 |
|
"mensaje_cerrado": mensaje_cerrado_salida}) |
383 |
|
|
384 |
|
# "horario": horario_salida, |
385 |
|
# "error": error_salida}) |
386 |
|
|
387 |
def __parsear_objetos(self, doc_xml): |
def __parsear_objetos(self, doc_xml): |
388 |
"""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.""" |
649 |
"instancias":[instancia]}) |
"instancias":[instancia]}) |
650 |
|
|
651 |
|
|
652 |
|
def salida_cerrada(self, id_sala_destino): |
653 |
|
"""Comprueba si la salida indicada, y si lo está devuelve el id de la llave, |
654 |
|
y el mensaje a mostrar si no se puede entrar. |
655 |
|
|
656 |
|
Requiere: |
657 |
|
id_sala_destino apunta a una salida que existe en la sala. |
658 |
|
|
659 |
|
Devuelve: |
660 |
|
una tupla (id_llave, mensaje_error). La id_llave vale None si la puerta está |
661 |
|
abierta, y "" si no se puede abrir. |
662 |
|
""" |
663 |
|
for salida in self.salidas: |
664 |
|
if salida["id"] == id_sala_destino: |
665 |
|
|
666 |
|
tipo_cierre = salida["tipo_cierre"] |
667 |
|
if tipo_cierre == "ninguno": |
668 |
|
|
669 |
|
return (None, "") |
670 |
|
|
671 |
|
elif tipo_cierre == "cerradura": |
672 |
|
|
673 |
|
return (salida["datos_cierre"], salida["mensaje_cerrado"]) |
674 |
|
|
675 |
|
elif tipo_cierre == "magia": |
676 |
|
|
677 |
|
return ("", salida["mensaje_cerrado"]) |
678 |
|
|
679 |
|
elif tipo_cierre == "horario": |
680 |
|
|
681 |
|
# Vamos a procesar el argumento horario, que está en la forma |
682 |
|
# "horaini-horafin,horaini-horafin,... idllave" |
683 |
|
|
684 |
|
# Primero, separar el id de la llave |
685 |
|
aux = salida["datos_cierre"].split(" ") |
686 |
|
rangos = aux[0].split(",") |
687 |
|
if len(aux) > 1: |
688 |
|
id_llave = aux[1] |
689 |
|
else: |
690 |
|
id_llave = "" |
691 |
|
|
692 |
|
# Luego, ver si la hora actual está dentro de alguno de los rangos |
693 |
|
abierto = 0 |
694 |
|
ahora = FechaHoraMine_ahora() |
695 |
|
for rango in rangos: |
696 |
|
aux = rango.split("-") |
697 |
|
hora_ini = int(aux[0]) |
698 |
|
hora_fin = int(aux[1]) |
699 |
|
if ahora.hora() >= hora_ini and ahora.hora() < hora_fin: |
700 |
|
abierto = 1 |
701 |
|
break |
702 |
|
|
703 |
|
if abierto: |
704 |
|
return (None, "") |
705 |
|
else: |
706 |
|
return (id_llave, salida["mensaje_cerrado"]) |
707 |
|
|
708 |
|
|
709 |
def salvar(self): |
def salvar(self): |
710 |
"""Graba en un fichero de salas la sala con todo su contenido.""" |
"""Graba en un fichero de salas la sala con todo su contenido.""" |
711 |
|
|
727 |
raise ValueError("Cargada sala " + self.id + " obsoleta: sin versión" + |
raise ValueError("Cargada sala " + self.id + " obsoleta: sin versión" + |
728 |
" cuando se esperaba " + Sala.VERSION_SALA) |
" cuando se esperaba " + Sala.VERSION_SALA) |
729 |
|
|
730 |
assert(Sala.VERSION_SALA == "1.1") |
assert(Sala.VERSION_SALA == "1.2") |
731 |
while self.version != "1.1": |
while self.version != "1.2": |
732 |
|
|
733 |
if self.version == "1.0": |
if self.version == "1.0": |
734 |
# Versión 1.0 -> 1.1: añadir fecha de modificacion de archivo de descripcion |
# Versión 1.0 -> 1.1: añadir fecha de modificacion de archivo de descripcion |
736 |
self.__fecha_fichero = os.path.getmtime(archivo) |
self.__fecha_fichero = os.path.getmtime(archivo) |
737 |
self.version = "1.1" |
self.version = "1.1" |
738 |
escribir("Convertida sala " + self.id + " a versión 1.1") |
escribir("Convertida sala " + self.id + " a versión 1.1") |
739 |
|
elif self.version == "1.1": |
740 |
|
# Versión 1.1 -> 1.2: cambiar horario y error por tipo_cierre, datos_cierre |
741 |
|
# y mensaje_cerrado |
742 |
|
for salida in self.salidas: |
743 |
|
horario = salida["horario"] |
744 |
|
error = salida["error"] |
745 |
|
del salida["horario"] |
746 |
|
del salida["error"] |
747 |
|
if horario == "0-24": |
748 |
|
salida["tipo_cierre"] = "ninguno" |
749 |
|
salida["datos_cierre"] = "" |
750 |
|
salida["mensaje_cerrado"] = "" |
751 |
|
else: |
752 |
|
salida["tipo_cierre"] = "horario" |
753 |
|
salida["datos_cierre"] = horario |
754 |
|
salida["mensaje_cerrado"] = mensaje_cerrado |
755 |
|
self.version = "1.2" |
756 |
|
escribir("Convertida sala " + self.id + " a versión 1.2") |
757 |
else: |
else: |
758 |
raise ValueError("Cargada sala " + self.id + " con versión desconocida: " + |
raise ValueError("Cargada sala " + self.id + " con versión desconocida: " + |
759 |
self.version + " cuando se esperaba " + Sala.VERSION_SALA) |
self.version + " cuando se esperaba " + Sala.VERSION_SALA) |