29 |
import string |
import string |
30 |
import os |
import os |
31 |
import cPickle |
import cPickle |
32 |
|
import sre |
33 |
|
|
34 |
from objeto import * |
from objeto import * |
35 |
from utils import * |
from utils import * |
400 |
self.__inicializar_sala(conservar_arbol_xml) |
self.__inicializar_sala(conservar_arbol_xml) |
401 |
|
|
402 |
|
|
403 |
def __inicializar_sala(self,conservar_arbol_xml): |
def __inicializar_sala(self, conservar_arbol_xml=0): |
404 |
"""Rellena todos los datos de la sala a partir de su fichero |
"""Rellena todos los datos de la sala a partir de su fichero |
405 |
de descripcion. |
de descripcion. |
406 |
""" |
""" |
647 |
else: |
else: |
648 |
dif_objeto = 0 |
dif_objeto = 0 |
649 |
|
|
650 |
instancias = [] |
instancias = [] |
651 |
for i in range(cantidad_objeto): |
for i in range(cantidad_objeto): |
652 |
instancias.append(Objeto(id_objeto)) |
instancia = Objeto(id_objeto) |
653 |
|
instancia.contener(self) |
654 |
|
instancias.append(instancia) |
655 |
|
|
656 |
self.__objetos.append({"id": id_objeto, |
self.__objetos.append({"id": id_objeto, |
657 |
"probabilidad": prob_objeto, |
"probabilidad": prob_objeto, |
658 |
"maximo": max_objeto, |
"maximo": max_objeto, |
659 |
"dificultad": dif_objeto, |
"dificultad": dif_objeto, |
660 |
"instancias": instancias}) |
"instancias": instancias}) |
661 |
|
|
662 |
|
|
663 |
def __parsear_encuentros(self, elem_encuentros): |
def __parsear_encuentros(self, elem_encuentros): |
805 |
if tirar_porcentaje() <= objeto["probabilidad"]: |
if tirar_porcentaje() <= objeto["probabilidad"]: |
806 |
if tirar_porcentaje() <= 50: |
if tirar_porcentaje() <= 50: |
807 |
if len(objeto["instancias"]) > 0: |
if len(objeto["instancias"]) > 0: |
808 |
|
objeto["instancias"][0].liberar() |
809 |
del objeto["instancias"][0] |
del objeto["instancias"][0] |
810 |
else: |
else: |
811 |
if (objeto["maximo"] == 0 or |
if (objeto["maximo"] == 0 or |
812 |
len(objeto["instancias"]) < objeto["maximo"]): |
len(objeto["instancias"]) < objeto["maximo"]): |
813 |
objeto["instancias"].append(Objeto(objeto["id"])) |
instancia = Objeto(objeto["id"]) |
814 |
|
instancia.contener(self) |
815 |
|
objeto["instancias"].append(instancia) |
816 |
|
|
817 |
|
|
818 |
def salir_personaje(self, personaje): |
def salir_personaje(self, personaje): |
894 |
return n_objeto |
return n_objeto |
895 |
|
|
896 |
|
|
897 |
|
def acceder_a_objeto(self, n_objeto, n_instancia=1): |
898 |
|
"""Accede a una instancia de un objeto para trabajar con ella, pero sin sacarla |
899 |
|
de la sala. |
900 |
|
|
901 |
|
- n_objeto es el número de orden del objeto dentro de la sala |
902 |
|
- n_instancia es el número de orden de la instancia a extraer |
903 |
|
|
904 |
|
Devuelve la instancia elegida. |
905 |
|
|
906 |
|
Lanza ExcepcionDeJuego si no puede acceder a ella. |
907 |
|
|
908 |
|
Requiere: |
909 |
|
n_objeto in range(0, len(self.objetos)) |
910 |
|
n_instancia >= 1 |
911 |
|
|
912 |
|
Asegura: |
913 |
|
return != None |
914 |
|
""" |
915 |
|
objeto = self.__objetos[n_objeto] |
916 |
|
return objeto["instancias"][n_instancia-1] |
917 |
|
|
918 |
|
|
919 |
def coger(self, n_objeto, n_instancia=1, cantidad=1): |
def coger(self, n_objeto, n_instancia=1, cantidad=1): |
920 |
"""Sacar una o varias instancias de un objeto de la sala. |
"""Sacar una o varias instancias de un objeto de la sala. |
921 |
|
|
944 |
" instancias de ese objeto, solo hay " + |
" instancias de ese objeto, solo hay " + |
945 |
str(len(objeto["instancias"]))) |
str(len(objeto["instancias"]))) |
946 |
|
|
947 |
|
# Asumimos que ningún personaje puede levantar más de 10 Tm. Es una manera |
948 |
|
# de representar objetos fijos al suelo, que no se pueden levantar. |
949 |
|
if objeto["instancias"][0].peso > 10000: |
950 |
|
raise ExcepcionDeJuego("Este objeto no se puede coger.") |
951 |
|
|
952 |
objetos_cogidos = [] |
objetos_cogidos = [] |
953 |
|
|
954 |
instancias = objeto["instancias"] |
instancias = objeto["instancias"] |
955 |
for i in range(0, cantidad): |
for i in range(0, cantidad): |
956 |
objetos_cogidos.append(instancias[n_instancia-1]) |
objetos_cogidos.append(instancias[n_instancia-1]) |
957 |
instancias[n_instancia-1].activar() |
instancias[n_instancia-1].activar() |
958 |
|
instancias[n_instancia-1].liberar() |
959 |
del instancias[n_instancia-1] |
del instancias[n_instancia-1] |
960 |
|
|
961 |
if len(instancias) == 0 and objeto["probabilidad"] == 0: |
if len(instancias) == 0 and objeto["probabilidad"] == 0: |
975 |
len(objetos) >= 1 |
len(objetos) >= 1 |
976 |
dificultad in range(0, 100) |
dificultad in range(0, 100) |
977 |
""" |
""" |
978 |
encontrado = 0 |
for objeto in objetos: |
979 |
|
objeto.contener(self) |
980 |
|
|
981 |
for objeto in self.__objetos: |
for objeto in self.__objetos: |
982 |
if objeto["id"] == objetos[0].id: |
if objeto["id"] == objetos[0].id: |
|
encontrado = 1 |
|
983 |
objeto["instancias"].extend(objetos) |
objeto["instancias"].extend(objetos) |
984 |
break |
break |
985 |
|
else: |
986 |
|
self.__objetos.append({"id":objetos[0].id, |
987 |
|
"probabilidad":0, |
988 |
|
"maximo":0, |
989 |
|
"dificultad":dificultad, |
990 |
|
"instancias":objetos}) |
991 |
|
|
992 |
|
|
993 |
if not encontrado: |
def objeto_destruido(self, objeto_destruido): |
994 |
|
"""Un objeto contenido en esta sala ha sido destruido. |
995 |
|
|
996 |
|
Hay que eliminarlo de la lista de instancias de la sala. Este método será llamado |
997 |
|
sólo desde el propio objeto, a través del interfaz Contenedor. |
998 |
|
""" |
999 |
|
objeto_destruido.liberar() |
1000 |
|
for i, objeto in izip(self.__objetos): |
1001 |
|
instancias = objeto["instancias"] |
1002 |
|
for j, instancia in izip(instancias): |
1003 |
|
if instancia == objeto_destruido: |
1004 |
|
del instancias[j] |
1005 |
|
if len(instancias) == 0 and objeto["probabilidad"] == 0: |
1006 |
|
del self.__objetos[i] |
1007 |
|
break |
1008 |
|
|
1009 |
|
|
1010 |
|
def objeto_reemplazado(self, objeto_antiguo, objeto_nuevo): |
1011 |
|
"""Un objeto contenido en esta sala ha sido destruido, y reemplazado por otro. |
1012 |
|
|
1013 |
|
Hay que eliminar el antiguo de la lista de instancias de la sala, y añadir el nuevo. |
1014 |
|
Este método será llamado sólo desde el propio objeto, a través del interfaz Contenedor. |
1015 |
|
""" |
1016 |
|
objeto_antiguo.liberar() |
1017 |
|
for i, objeto in izip(self.__objetos): |
1018 |
|
instancias = objeto["instancias"] |
1019 |
|
for j, instancia in izip(instancias): |
1020 |
|
if instancia == objeto_antiguo: |
1021 |
|
del instancias[j] |
1022 |
|
if len(instancias) == 0 and objeto["probabilidad"] == 0: |
1023 |
|
del self.__objetos[i] |
1024 |
|
break |
1025 |
|
|
1026 |
|
objeto_nuevo.contener(self) |
1027 |
|
|
1028 |
|
for objeto in self.__objetos: |
1029 |
|
if objeto["id"] == objeto_nuevo.id: |
1030 |
|
objeto["instancias"].append(objeto_nuevo) |
1031 |
|
break |
1032 |
|
else: |
1033 |
self.__objetos.append({"id":instancia.id, |
self.__objetos.append({"id":instancia.id, |
1034 |
"probabilidad":0, |
"probabilidad":0, |
1035 |
"maximo":0, |
"maximo":0, |
1036 |
"dificultad":dificultad, |
"dificultad":dificultad, |
1037 |
"instancias":objetos}) |
"instancias":[objeto_nuevo]}) |
1038 |
|
|
1039 |
|
|
1040 |
|
def objeto_en_sala(self, nombre_objeto): |
1041 |
|
"""Comprueba si en la sala existe un objeto con el nombre indicado. |
1042 |
|
|
1043 |
|
El nombre puede ser una expresión regular simple (con * y ?, como los wilcards de DOS). |
1044 |
|
|
1045 |
|
Requiere: |
1046 |
|
nombre_objeto != None |
1047 |
|
""" |
1048 |
|
# Convertir la expresion regular de tipo ?* al estilo del módulo sre. |
1049 |
|
nombre_objeto = "^" + nombre_objeto.replace("?", ".").replace("*", ".*") + "$" |
1050 |
|
for objeto in self.__objetos: |
1051 |
|
if len(objeto["instancias"]) > 0: |
1052 |
|
if sre.match(nombre_objeto, objeto["instancias"][0].nombre): |
1053 |
|
resultado = 1 |
1054 |
|
break |
1055 |
|
else: |
1056 |
|
resultado = 0 |
1057 |
|
|
1058 |
|
return resultado |
1059 |
|
|
1060 |
|
|
1061 |
def salida_cerrada(self, id_sala_destino): |
def salida_cerrada(self, id_sala_destino): |