47 |
|
|
48 |
# Versión del sistema de personajes (se incrementa al cambiar cualquiera |
# Versión del sistema de personajes (se incrementa al cambiar cualquiera |
49 |
# de Personaje, PersonajeJugador o PersonajeNoJugador) |
# de Personaje, PersonajeJugador o PersonajeNoJugador) |
50 |
VERSION = '1.5.3' |
VERSION = '1.5.4' |
51 |
|
|
52 |
# Resultados de comparar otro personaje con este |
# Resultados de comparar otro personaje con este |
53 |
COMP_INF_MAS_FUERTE = 9 |
COMP_INF_MAS_FUERTE = 9 |
345 |
# Atributos privados: |
# Atributos privados: |
346 |
# |
# |
347 |
# __max_vida (int): valor inicial de la propiedad vida, nunca podrá superar este valor |
# __max_vida (int): valor inicial de la propiedad vida, nunca podrá superar este valor |
348 |
|
# __tiradas ({string:int}): nombres y resultados de las tiradas realizadas por este personaje |
349 |
|
# __competiciones ({string:int}): nombres y resultados de las competiciones realizadas por este |
350 |
|
# personaje |
351 |
|
|
352 |
self.__id = id |
self.__id = id |
353 |
self.__version = Personaje.VERSION |
self.__version = Personaje.VERSION |
370 |
self.__siguiente = None |
self.__siguiente = None |
371 |
self.__anterior = None |
self.__anterior = None |
372 |
|
|
373 |
|
self.__tiradas = {} |
374 |
|
self.__competiciones = {} |
375 |
|
|
376 |
from objeto import Objeto |
from objeto import Objeto |
377 |
|
|
378 |
self.__mochila = [] |
self.__mochila = [] |
452 |
raise ValueError("Cargado personaje " + self.__id + " obsoleto: sin versión" + |
raise ValueError("Cargado personaje " + self.__id + " obsoleto: sin versión" + |
453 |
" cuando se esperaba " + Personaje.VERSION) |
" cuando se esperaba " + Personaje.VERSION) |
454 |
|
|
455 |
assert(Personaje.VERSION == "1.5.3") |
assert(Personaje.VERSION == "1.5.4") |
456 |
while self.__version != "1.5.3": |
while self.__version != "1.5.4": |
457 |
|
|
458 |
# La versión 1.5.1 produce una ruptura con las anteriores ya que se migra al formato |
# La versión 1.5.1 produce una ruptura con las anteriores ya que se migra al formato |
459 |
# 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 |
477 |
self._PersonajeJugador__raza = self._PersonajeJugador__raza.nombre |
self._PersonajeJugador__raza = self._PersonajeJugador__raza.nombre |
478 |
self.__version = "1.5.3" |
self.__version = "1.5.3" |
479 |
escribir("Convertido personaje " + self.__id + " a versión 1.5.3") |
escribir("Convertido personaje " + self.__id + " a versión 1.5.3") |
480 |
|
if self.__version == "1.5.3": |
481 |
|
# Versión 1.5.3 -> 1.5.4: añadir __tiradas y __competiciones |
482 |
|
self.__tiradas = {} |
483 |
|
self.__competiciones = {} |
484 |
|
self.__version = "1.5.4" |
485 |
|
escribir("Convertido personaje " + self.__id + " a versión 1.5.4") |
486 |
else: |
else: |
487 |
raise ValueError("Cargado personaje " + self.__id + " con versión desconocida: " + |
raise ValueError("Cargado personaje " + self.__id + " con versión desconocida: " + |
488 |
self.__version + " cuando se esperaba " + Personaje.VERSION) |
self.__version + " cuando se esperaba " + Personaje.VERSION) |
626 |
|
|
627 |
Si la sala destino se llena, los que vengan detrás en compañia la abandonan. |
Si la sala destino se llena, los que vengan detrás en compañia la abandonan. |
628 |
|
|
629 |
|
Se olvidan todas las tiradas y competiciones memorizadas. |
630 |
|
|
631 |
El parametro automatico es solo para uso interno. |
El parametro automatico es solo para uso interno. |
632 |
|
|
633 |
Requiere: |
Requiere: |
668 |
"al límite de su capacidad y no cabes. Ya no sigues a " + self.__id + ".") |
"al límite de su capacidad y no cabes. Ya no sigues a " + self.__id + ".") |
669 |
self.__siguiente.no_seguir() |
self.__siguiente.no_seguir() |
670 |
|
|
671 |
|
self.__tiradas = {} |
672 |
|
self.__competiciones = {} |
673 |
|
|
674 |
except: |
except: |
675 |
escribir("Excepción imprevista durante el movimiento de un personaje.") |
escribir("Excepción imprevista durante el movimiento de un personaje.") |
676 |
escribir_excepcion() |
escribir_excepcion() |
1004 |
return result |
return result |
1005 |
|
|
1006 |
|
|
1007 |
def tirada_atributo(self, atributo, modif_atributo): |
def tirar_atributo(self, id_tirada, atributo, modif_atributo): |
1008 |
"""Realiza una tirada de datos basada en un atributo.""" |
"""Realiza una tirada de datos basada en un atributo. |
1009 |
|
|
1010 |
|
El personaje recuerda el resultado de la tirada por su id, hasta que se mueva a otra sala. |
1011 |
|
""" |
1012 |
|
|
1013 |
nivel_atrib = self.__atrib[atributo] + modif_atributo |
nivel_atrib = self.__atrib[atributo] + modif_atributo |
1014 |
n_dados = floor(nivel_atrib / 6) + 1 |
n_dados = floor(nivel_atrib / 6) + 1 |
1015 |
tirada = nivel_atrib + tirar_dados(n_dados) |
tirada = nivel_atrib + tirar_dados(n_dados) |
1016 |
|
|
1017 |
return tirada |
self.__tiradas[id_tirada] = tirada |
1018 |
|
|
1019 |
|
return tirada |
1020 |
|
|
1021 |
|
|
1022 |
def generar_dificultad(self, atributo, modif_atributo): |
def generar_dificultad(self, atributo, modif_atributo): |
1037 |
return dificultad |
return dificultad |
1038 |
|
|
1039 |
|
|
1040 |
def resultado_tirada(self, tirada, dificultad, modif_dificultad): |
def resultado_tirada(self, id_tirada, dificultad, modif_dificultad=0): |
1041 |
"""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.""" |
1042 |
|
tirada = self.__tiradas[id_tirada] |
1043 |
diferencia = tirada - (dificultad + modif_dificultad) |
diferencia = tirada - (dificultad + modif_dificultad) |
1044 |
|
|
1045 |
# esto no me convence: la distribucion de las tiradas es muy rara, |
# esto no me convence: la distribucion de las tiradas es muy rara, |
1062 |
Devuelve el nº de exitos (>0) si la prueba ha sido superada o el nº de |
Devuelve el nº de exitos (>0) si la prueba ha sido superada o el nº de |
1063 |
fallos (<0) si no lo ha sido. |
fallos (<0) si no lo ha sido. |
1064 |
""" |
""" |
1065 |
return self.resultado_tirada(self.tirada_atributo(atributo, modif_atributo), |
self.tirar_atributo("prueba", atributo, modif_atributo) |
1066 |
dificultad, modif_dificultad) |
return self.resultado_tirada("prueba", dificultad, modif_dificultad) |
1067 |
|
|
1068 |
|
|
1069 |
def competicion(self, otro_personaje, atrib_este, atrib_otro): |
def competicion(self, otro_personaje, atrib_este, atrib_otro): |
1076 |
Devuelve true si este personaje ha ganado la competición. |
Devuelve true si este personaje ha ganado la competición. |
1077 |
""" |
""" |
1078 |
|
|
1079 |
tirada_este = self.tirada_atributo(atrib_este, 0) |
tirada_este = self.tirar_atributo("competicion", atrib_este, 0) |
1080 |
tirada_otro = otro_personaje.tirada_atributo(atrib_otro, 0) |
tirada_otro = otro_personaje.tirar_atributo("competicion", atrib_otro, 0) |
1081 |
if tirada_este > tirada_otro: |
if tirada_este > tirada_otro: |
1082 |
return 1 |
return 1 |
1083 |
else: |
else: |
1096 |
|
|
1097 |
|
|
1098 |
def resucitar(self): |
def resucitar(self): |
1099 |
"""Esto es totalmente provisional, hasta que implementemos el sistema de muerte de verdad.""" |
"""ESTO ES TOTALMENTE PROVISIONAL, HASTA QUE IMPLEMENTEMOS EL SISTEMA DE MUERTE DE VERDAD.""" |
1100 |
self.actuar_uno_mismo("Estas bastante MUERTO") |
self.actuar_uno_mismo("Estas bastante MUERTO") |
1101 |
self.actuar_uno_mismo("Pero como todavía no está hecho el código de morirse, pues vamos " + \ |
self.actuar_uno_mismo("Pero como todavía no está hecho el código de morirse, pues vamos " + \ |
1102 |
"y te resucitamos por todo el morro") |
"y te resucitamos por todo el morro") |
1103 |
self.actuar_uno_mismo("Hale, a seguir tirando") |
self.actuar_uno_mismo("Hale, a seguir tirando") |
1104 |
self.actuar("tiembla un poco, gimotea, y cae al suelo, MUERTO.") |
self.actuar("tiembla un poco, gimotea, y cae al suelo, MUERTO.") |
1105 |
self.actuar("de pronto, se levanta, se sacude el polvo, dice 'vaya, que chungo', y " + \ |
self.actuar("De pronto, se levanta, se sacude el polvo, dice 'vaya, que chungo', y " + \ |
1106 |
"se encuentra de nuevo tan campante. ¿Pero esto qué es?") |
"se encuentra de nuevo tan campante. ¿Pero esto qué es?") |
1107 |
self.__vida = self.__atrib["constitucion"] * 2 |
self.__vida = self.__atrib["constitucion"] * 2 |
1108 |
if getattr(self, "alimentar", None) != None: |
if getattr(self, "alimentar", None) != None: |
1701 |
return objeto.nombre |
return objeto.nombre |
1702 |
|
|
1703 |
|
|
1704 |
def objeto_destruido(self, objeto_destruido): |
def objeto_desaparece(self, objeto): |
1705 |
"""Un objeto contenido en este personaje ha sido destruido. |
"""Un objeto contenido en este personaje ha desaparecido. |
1706 |
|
|
1707 |
Hay que eliminarlo de la mochila o del cuerpo, donde esté. Este método será llamado |
Hay que eliminarlo de la mochila o del cuerpo, donde esté. No ocurre ningún suceso |
1708 |
sólo desde el propio objeto, a través del interfaz Contenedor. |
en particular. Este método será llamado sólo desde el propio objeto, a través del |
1709 |
|
interfaz Contenedor. |
1710 |
""" |
""" |
1711 |
objeto_destruido.liberar() |
objeto.liberar() |
1712 |
|
|
1713 |
encontrado = False |
encontrado = False |
1714 |
for i, instancias in izip(self.__mochila): |
for i, instancias in izip(self.__mochila): |
1715 |
for j, instancia in izip(instancias): |
for j, instancia in izip(instancias): |
1716 |
if instancia == objeto_destruido: |
if instancia == objeto: |
1717 |
del instancias[j] |
del instancias[j] |
1718 |
if len(instancias) == 0: |
if len(instancias) == 0: |
1719 |
del self.__mochila[i] |
del self.__mochila[i] |
1722 |
|
|
1723 |
if not encontrado: |
if not encontrado: |
1724 |
for parte in self.__cuerpo.keys(): |
for parte in self.__cuerpo.keys(): |
1725 |
if self.__cuerpo[parte] == objeto_destruido: |
if self.__cuerpo[parte] == objeto: |
1726 |
del self.__cuerpo[parte] |
del self.__cuerpo[parte] |
1727 |
break |
break |
1728 |
|
|
1729 |
|
|
1730 |
|
def objeto_aparece(self, objeto): |
1731 |
|
"""Un objeto ha aparecido en este personaje (transportado automáticamente). |
1732 |
|
|
1733 |
|
Hay que añadir el obeto a la mochila. No ocurre ningún suceso en particular. |
1734 |
|
Este método será llamado sólo desde el propio objeto, a través del |
1735 |
|
interfaz Contenedor. |
1736 |
|
""" |
1737 |
|
objeto.contener(self) |
1738 |
|
|
1739 |
|
for instancias in self.__mochila: |
1740 |
|
if instancias[0].id == objeto.id: |
1741 |
|
instancias.append(objeto) |
1742 |
|
break |
1743 |
|
else: |
1744 |
|
self.__mochila.append([objeto]) |
1745 |
|
|
1746 |
|
|
1747 |
def objeto_reemplazado(self, objeto_antiguo, objeto_nuevo): |
def objeto_reemplazado(self, objeto_antiguo, objeto_nuevo): |
1748 |
"""Un objeto contenido en este personaje ha sido destruido, y reemplazado por otro. |
"""Un objeto contenido en este personaje ha sido destruido, y reemplazado por otro. |
1749 |
|
|
1750 |
Hay que eliminar el antiguo de la mochila o del cuerpo, donde esté, y añadir el nuevo. |
Hay que eliminar el antiguo de la mochila o del cuerpo, donde esté, y añadir el nuevo |
1751 |
Este método será llamado sólo desde el propio objeto, a través del interfaz Contenedor. |
en el mismo lugar donde estaba el antiguo. No ocurre ningún suceso en particular. Este |
1752 |
|
método será llamado sólo desde el propio objeto, a través del interfaz Contenedor. |
1753 |
""" |
""" |
1754 |
objeto_antiguo.liberar() |
objeto_antiguo.liberar() |
1755 |
|
|