64 |
ninguna compañia o va el último) |
ninguna compañia o va el último) |
65 |
- anterior (Personaje): el personaje que va delante de el en la compañia (None si no está en |
- anterior (Personaje): el personaje que va delante de el en la compañia (None si no está en |
66 |
ninguna compañía o va el primero) |
ninguna compañía o va el primero) |
67 |
- mochila (Objeto[][]): lista de todos los objetos que va cargando el personaje. Es lista |
- __mochila (Objeto[][]): lista de todos los objetos que va cargando el personaje. Es lista |
68 |
doble porque si hay varios objetos con el mismo id, van agrupados. |
doble porque si hay varios objetos con el mismo id, van agrupados. |
69 |
- cuerpo ({String:Objeto}): mapa con las partes del cuerpo del PJ, indicando el objeto que |
- __cuerpo ({String:Objeto}): mapa con las partes del cuerpo del PJ, indicando el objeto que |
70 |
lleva puesto en cada parte, o None si no lleva nada. Las partes |
lleva puesto en cada parte, o None si no lleva nada. Las partes |
71 |
o posiciones son: cabeza, cuello, tronco, brazo-izq, brazo-der, |
o posiciones son: cabeza, cuello, tronco, brazo-izq, brazo-der, |
72 |
mano-izq, mano-der, dos-manos, piernas, tobillo-izq, tobillo-der, |
mano-izq, mano-der, dos-manos, piernas, tobillo-izq, tobillo-der, |
73 |
pie-izq y pie-der. |
pie-izq y pie-der. |
74 |
|
|
75 |
Un personaje puede ser controlado por cualquier clase, siempre y cuando ésta implemente |
Un personaje puede ser controlado por cualquier clase, siempre y cuando ésta implemente |
76 |
el interfaz Controlador, para que pueda responder a los eventos que genera un personaje. |
el interfaz Controlador, para que pueda responder a los eventos que genera un personaje. |
115 |
anterior != None -> anterior.siguiente == self |
anterior != None -> anterior.siguiente == self |
116 |
controlador == None -> ( siguiente == None and anterior == None ) |
controlador == None -> ( siguiente == None and anterior == None ) |
117 |
|
|
118 |
mochila != None |
__mochila != None |
119 |
mochila[i] != None |
__mochila[i] != None |
120 |
len(mochila[i] > 0) |
len(__mochila[i] > 0) |
121 |
mochila[i][j] != None |
__mochila[i][j] != None |
122 |
|
|
123 |
cuerpo != None |
__cuerpo != None |
124 |
len(cuerpo) == 13 |
len(__cuerpo) == 13 |
125 |
""" |
""" |
126 |
|
|
127 |
# Versión del sistema de personajes (se incrementa al cambiar cualquiera |
# Versión del sistema de personajes (se incrementa al cambiar cualquiera |
128 |
# de Personaje, PersonajeJugador o PersonajeNoJugador) |
# de Personaje, PersonajeJugador o PersonajeNoJugador) |
129 |
VERSION = '1.1' |
VERSION = '1.2' |
130 |
|
|
131 |
# Resultados de comparar otro personaje con este |
# Resultados de comparar otro personaje con este |
132 |
COMP_INF_MAS_FUERTE = 9 |
COMP_INF_MAS_FUERTE = 9 |
175 |
|
|
176 |
self.siguiente = None |
self.siguiente = None |
177 |
self.anterior = None |
self.anterior = None |
|
self.inventario = [] |
|
|
self.equipo = [] |
|
178 |
self.salas_visitadas = {} |
self.salas_visitadas = {} |
179 |
|
|
180 |
|
self.__mochila = [] |
181 |
|
self.__cuerpo = {"cabeza":None, |
182 |
|
"cuello":None, |
183 |
|
"tronco":None, |
184 |
|
"brazo-izq":None, |
185 |
|
"brazo-der":None, |
186 |
|
"mano-izq":None, |
187 |
|
"mano-der":None, |
188 |
|
"dos-manos":None, |
189 |
|
"piernas":None, |
190 |
|
"tobillo-izq":None, |
191 |
|
"tobillo-der":None, |
192 |
|
"pie-izq":None, |
193 |
|
"pie-der":None} |
194 |
|
|
195 |
|
|
196 |
def __setattr__(self, name, value): |
def __setattr__(self, name, value): |
197 |
"""Realiza ajustes automáticos al modificar cualquier parámetro""" |
"""Realiza ajustes automáticos al modificar cualquier parámetro""" |
269 |
self.__dict__["idiomas"] = idiomas_instancias |
self.__dict__["idiomas"] = idiomas_instancias |
270 |
|
|
271 |
# Verificar la versión. |
# Verificar la versión. |
272 |
assert(Personaje.VERSION == "1.1") |
assert(Personaje.VERSION == "1.2") |
273 |
while self.version != "1.1": |
while self.version != "1.2": |
274 |
|
|
275 |
if not self.__dict__.has_key("version"): |
if not self.__dict__.has_key("version"): |
276 |
raise ValueError("Cargado personaje " + self.id + " obsoleto: sin versión" + |
raise ValueError("Cargado personaje " + self.id + " obsoleto: sin versión" + |
282 |
self.siguiente = None |
self.siguiente = None |
283 |
self.version = "1.1" |
self.version = "1.1" |
284 |
escribir("Convertido personaje " + self.id + " a versión 1.1") |
escribir("Convertido personaje " + self.id + " a versión 1.1") |
285 |
|
elif self.version == "1.1": |
286 |
|
# Versión 1.1 -> 1.2: quitar inventario y equipo, y añadir __mochila y __cuerpo |
287 |
|
del self.inventario |
288 |
|
del self.equipo |
289 |
|
self.__mochila = [] |
290 |
|
self.__cuerpo = {"cabeza":None, |
291 |
|
"cuello":None, |
292 |
|
"tronco":None, |
293 |
|
"brazo-izq":None, |
294 |
|
"brazo-der":None, |
295 |
|
"mano-izq":None, |
296 |
|
"mano-der":None, |
297 |
|
"dos-manos":None, |
298 |
|
"piernas":None, |
299 |
|
"tobillo-izq":None, |
300 |
|
"tobillo-der":None, |
301 |
|
"pie-izq":None, |
302 |
|
"pie-der":None} |
303 |
|
self.version = "1.2" |
304 |
|
escribir("Convertido personaje " + self.id + " a versión 1.2") |
305 |
else: |
else: |
306 |
raise ValueError("Cargado personaje " + self.id + " con versión desconocida: " + |
raise ValueError("Cargado personaje " + self.id + " con versión desconocida: " + |
307 |
self.version + " cuando se esperaba " + Personaje.VERSION) |
self.version + " cuando se esperaba " + Personaje.VERSION) |
308 |
|
|
309 |
|
|
310 |
|
def mochila(self): |
311 |
|
return self.__mochila |
312 |
|
|
313 |
|
|
314 |
|
def cuerpo(self): |
315 |
|
return self.__cuerpo |
316 |
|
|
317 |
|
|
318 |
def poner_experiencia(self, experiencia): |
def poner_experiencia(self, experiencia): |
319 |
"""Modifica los puntos de experiencia del personaje. |
"""Modifica los puntos de experiencia del personaje. |
351 |
return > 0.0 |
return > 0.0 |
352 |
""" |
""" |
353 |
total = self.volumen |
total = self.volumen |
354 |
for objeto in self.inventario: |
for objeto in self.__mochila: |
355 |
try: |
for instancia in objeto: |
356 |
total += objeto['instancias'][0].volumen |
total += instancia.volumen |
357 |
except: |
for objeto in self.__cuerpo.values(): |
358 |
total += 0 |
if objeto != None: |
359 |
for objeto in self.equipo: |
total += objeto.volumen |
|
try: |
|
|
total += objeto['instancias'][0].volumen |
|
|
except: |
|
|
total += 0 |
|
360 |
return total |
return total |
361 |
|
|
362 |
|
|
735 |
return tirada |
return tirada |
736 |
|
|
737 |
|
|
738 |
|
def generar_dificultad(self, atributo, modif_atributo): |
739 |
|
"""Calcula la dificultad de una prueba que el personaje impone a otros, |
740 |
|
basandose en un atributo (pero que no es una competicion). |
741 |
|
|
742 |
|
La dificultad sera tal que otro personaje con un atributo igual que el tendra |
743 |
|
un 50% de probabilidades de superar la prueba. |
744 |
|
|
745 |
|
Ejemplos de prueba: esconder un objeto, atrancar una puerta, etc. |
746 |
|
""" |
747 |
|
|
748 |
|
nivel_atrib = self.atrib[atributo] + modif_atributo |
749 |
|
n_dados = floor(nivel_atrib / 6) + 1 |
750 |
|
rango = rango_dados(n_dados) |
751 |
|
dificultad = nivel_atrib + rango[(len(rango)-1) / 2] |
752 |
|
|
753 |
|
return dificultad |
754 |
|
|
755 |
|
|
756 |
def resultado_tirada(self, tirada, dificultad, modif_dificultad): |
def resultado_tirada(self, tirada, dificultad, modif_dificultad): |
757 |
"""Devuelve el numero de exitos o fallos de una tirada contra una dificultad.""" |
"""Devuelve el numero de exitos o fallos de una tirada contra una dificultad.""" |
758 |
diferencia = tirada - (dificultad + modif_dificultad) |
diferencia = tirada - (dificultad + modif_dificultad) |
759 |
if diferencia >= 0: |
|
760 |
return floor(diferencia / dificultad) + 1 |
# esto no me convence: la distribucion de las tiradas es muy rara, |
761 |
else: |
# y ademas no tiene sentido si la dificultad es cero |
762 |
return floor(diferencia / dificultad) - 1 |
#if diferencia >= 0: |
763 |
|
# return floor(diferencia / dificultad) + 1 |
764 |
|
#else: |
765 |
|
# return floor(diferencia / dificultad) - 1 |
766 |
|
return diferencia |
767 |
|
|
768 |
|
|
769 |
def prueba(self, atributo, modif_atributo, dificultad, modif_dificultad): |
def prueba(self, atributo, modif_atributo, dificultad, modif_dificultad): |
774 |
dificultad -- número que indica la dificultad de la prueba |
dificultad -- número que indica la dificultad de la prueba |
775 |
modif_dificultad -- numero que hay que sumar o restar a la dificultad |
modif_dificultad -- numero que hay que sumar o restar a la dificultad |
776 |
|
|
777 |
Devuelve true si la prueba ha sido superada. |
Devuelve el nº de exitos (>0) si la prueba ha sido superada o el nº de |
778 |
|
fallos (<0) si no lo ha sido. |
779 |
""" |
""" |
780 |
return self.resultado_tirada(self.tirada_atributo(atributo, modif_atributo), |
return self.resultado_tirada(self.tirada_atributo(atributo, modif_atributo), |
781 |
dificultad, modif_dificultad) |
dificultad, modif_dificultad) |
905 |
objeto != None |
objeto != None |
906 |
""" |
""" |
907 |
encontrado = 0 |
encontrado = 0 |
908 |
for lista_instancias in self.mochila: |
for lista_instancias in self.__mochila: |
909 |
if lista_instancias[0].id == objeto.id: |
if lista_instancias[0].id == objeto.id: |
910 |
encontrado = 1 |
encontrado = 1 |
911 |
lista_instancias.append(objeto) |
lista_instancias.append(objeto) |
912 |
break |
break |
913 |
|
|
914 |
if not encontrado: |
if not encontrado: |
915 |
self.mochila.append([objeto]) |
self.__mochila.append([objeto]) |
916 |
|
|
917 |
|
|
918 |
def sacar_de_mochila(self, id_objeto, n_orden = 1): |
def sacar_de_mochila(self, n_objeto, n_instancia): |
919 |
"""Sacar un objeto de la mochila del personaje. |
"""Sacar un objeto de la mochila del personaje. |
920 |
|
|
921 |
Si hay mas de una instancia con el mismo id, se puede elegir cual de |
n_objeto es el numero de orden dentro de la mochila, y n_instancia es el |
922 |
ellas (1 = la primera, 2 = la segunda, etc.) |
numero de la instancia, ambos empezando por cero. |
923 |
|
|
924 |
Requiere: |
Requiere: |
925 |
id_objeto pertenece a un objeto existente en la mochila. |
n_objeto in range(0, len(self.__mochila)-1) |
926 |
n_orden esta dentro de rango |
n_instancia in range(0, len(self.__mochila[n_objeto])-1) |
|
""" |
|
|
objeto = None |
|
927 |
|
|
928 |
for lista_instancias in self.mochila: |
Asegura: |
929 |
if lista_instancias[0].id == id_objeto: |
return != None |
930 |
objeto = lista_instancias[n_orden - 1] |
""" |
931 |
del lista_instancias[n_orden - 1] |
objeto = self.__mochila[n_objeto][n_instancia] |
932 |
break |
|
933 |
|
del self.__mochila[n_objeto][n_instancia] |
934 |
|
if len(self.__mochila[n_objeto]) == 0: |
935 |
|
del self.__mochila[n_objeto] |
936 |
|
|
937 |
return objeto |
return objeto |
938 |
|
|
946 |
puede haber que quitar mas de uno. |
puede haber que quitar mas de uno. |
947 |
|
|
948 |
Requiere: |
Requiere: |
949 |
posicion in self.cuerpo.keys() |
posicion in self.__cuerpo.keys() |
950 |
|
|
951 |
Asegura: |
Asegura: |
952 |
return != None |
return != None |
953 |
""" |
""" |
954 |
objetos_quitados = [] |
objetos_quitados = [] |
955 |
|
|
956 |
if self.cuerpo[posicion] != None: |
if self.__cuerpo[posicion] != None: |
957 |
objetos_quitados.append(self.cuerpo[posicion]) |
objetos_quitados.append(self.__cuerpo[posicion]) |
958 |
self.quitarse(posicion) |
self.quitarse(posicion) |
959 |
|
|
960 |
if posicion == "dos-manos": |
if posicion == "dos-manos": |
961 |
if self.cuerpo["mano-izq"] != None: |
if self.__cuerpo["mano-izq"] != None: |
962 |
objetos_quitados.append(self.cuerpo["mano-izq"]) |
objetos_quitados.append(self.__cuerpo["mano-izq"]) |
963 |
self.quitarse("mano-izq") |
self.quitarse("mano-izq") |
964 |
if self.cuerpo["mano-der"] != None: |
if self.__cuerpo["mano-der"] != None: |
965 |
objetos_quitados.append(self.cuerpo["mano-der"]) |
objetos_quitados.append(self.__cuerpo["mano-der"]) |
966 |
self.quitarse("mano-der") |
self.quitarse("mano-der") |
967 |
|
|
968 |
if posicion == "mano-izq" or posicion == "mano-der": |
if posicion == "mano-izq" or posicion == "mano-der": |
969 |
if self.cuerpo["dos-manos"] != None: |
if self.__cuerpo["dos-manos"] != None: |
970 |
objetos_quitados.append(self.cuerpo["dos-manos"]) |
objetos_quitados.append(self.__cuerpo["dos-manos"]) |
971 |
self.quitarse("dos-manos") |
self.quitarse("dos-manos") |
972 |
|
|
973 |
return objetos_quitados |
return objetos_quitados |
980 |
|
|
981 |
Requiere: |
Requiere: |
982 |
objeto != None |
objeto != None |
983 |
posicion in self.cuerpo.keys() |
posicion in self.__cuerpo.keys() |
984 |
el objeto se puede poner en esa posicion |
el objeto se puede poner en esa posicion |
985 |
el personaje cumple los requisitos del uso |
el personaje cumple los requisitos del uso |
986 |
self.cuerpo[posicion] == None |
self.__cuerpo[posicion] == None |
987 |
|
|
988 |
Asegura: |
Asegura: |
989 |
self.cuerpo[posicion] == objeto |
self.__cuerpo[posicion] == objeto |
990 |
""" |
""" |
991 |
self.cuerpo[posicion] = objeto |
self.__cuerpo[posicion] = objeto |
992 |
|
|
993 |
for uso in objeto.usos: |
for uso in objeto.usos: |
994 |
if uso["tipo"] == "ponerse" and uso["posicion"] == posicion: |
if uso["tipo"] == "ponerse" and uso["posicion"] == posicion: |
995 |
|
|
996 |
self.cuerpo[posicion] = objeto |
self.__cuerpo[posicion] = objeto |
997 |
|
|
998 |
if uso["descripcion"] != None: |
if uso["descripcion"] != None: |
999 |
self.controlador.habla_unomismo(uso["descripcion"]) |
self.controlador.habla_unomismo(uso["descripcion"]) |
1015 |
el objeto. Devuelve el objeto quitado. |
el objeto. Devuelve el objeto quitado. |
1016 |
|
|
1017 |
Requiere: |
Requiere: |
1018 |
posicion in self.cuerpo.keys() |
posicion in self.__cuerpo.keys() |
1019 |
self.cuerpo[posicion] != None |
self.__cuerpo[posicion] != None |
1020 |
|
|
1021 |
Asegura: |
Asegura: |
1022 |
self.cuerpo[posicion] == None |
self.__cuerpo[posicion] == None |
1023 |
return != None |
return != None |
1024 |
""" |
""" |
1025 |
objeto = self.cuerpo[posicion] |
objeto = self.__cuerpo[posicion] |
1026 |
del self.cuerpo[posicion] |
del self.__cuerpo[posicion] |
1027 |
|
|
1028 |
for uso in objeto.usos: |
for uso in objeto.usos: |
1029 |
if uso["tipo"] == "ponerse" and uso["posicion"] == posicion: |
if uso["tipo"] == "ponerse" and uso["posicion"] == posicion: |