53 |
|
|
54 |
# Version del sistema de objetos (se incrementa cada vez que varian los atributos |
# Version del sistema de objetos (se incrementa cada vez que varian los atributos |
55 |
# de la clase Objeto) |
# de la clase Objeto) |
56 |
VERSION_OBJETO = '1.0.2' |
VERSION_OBJETO = '1.0.3' |
57 |
|
|
58 |
DIR_DESC_OBJETOS = 'desc_objetos' |
DIR_DESC_OBJETOS = 'desc_objetos' |
59 |
EXT_DESC_OBJETOS = '.xml' |
EXT_DESC_OBJETOS = '.xml' |
65 |
'vestimenta', 'escritura', 'recipìente', 'comestible', 'accesorio' ] |
'vestimenta', 'escritura', 'recipìente', 'comestible', 'accesorio' ] |
66 |
|
|
67 |
SUCESOS = [ 'personaje_come', 'personaje_bebe', 'personaje_lanza', 'personaje_usa', |
SUCESOS = [ 'personaje_come', 'personaje_bebe', 'personaje_lanza', 'personaje_usa', |
68 |
'personaje_pone_cabeza', 'personaje_pone_cuello', 'personaje_pone_tronco', |
'personaje_usa_con', 'personaje_pone_cabeza', 'personaje_pone_cuello', |
69 |
'personaje_pone_brazo_izq', 'personaje_pone_brazo_der', |
'personaje_pone_tronco', 'personaje_pone_brazo_izq', |
70 |
'personaje_pone_mano_izq', 'personaje_pone_mano_der', |
'personaje_pone_brazo_der', 'personaje_pone_mano_izq', |
71 |
'personaje_pone_dos_manos', 'personaje_pone_piernas', |
'personaje_pone_mano_der', 'personaje_pone_dos_manos', |
72 |
'personaje_pone_tobillo_izq', 'personaje_pone_tobillo_der', |
'personaje_pone_piernas', 'personaje_pone_tobillo_izq', |
73 |
'personaje_pone_pie_izq', 'personaje_pone_pie_der', |
'personaje_pone_tobillo_der', 'personaje_pone_pie_izq', |
74 |
'personaje_quita_cabeza', 'personaje_quita_cuello', 'personaje_quita_tronco', |
'personaje_pone_pie_der', 'personaje_quita_cabeza', |
75 |
|
'personaje_quita_cuello', 'personaje_quita_tronco', |
76 |
'personaje_quita_brazo_izq', 'personaje_quita_brazo_der', |
'personaje_quita_brazo_izq', 'personaje_quita_brazo_der', |
77 |
'personaje_quita_mano_izq', 'personaje_quita_mano_der', |
'personaje_quita_mano_izq', 'personaje_quita_mano_der', |
78 |
'personaje_quita_dos_manos', 'personaje_quita_piernas', |
'personaje_quita_dos_manos', 'personaje_quita_piernas', |
79 |
'personaje_quita_tobillo_izq', 'personaje_quita_tobillo_der', |
'personaje_quita_tobillo_izq', 'personaje_quita_tobillo_der', |
80 |
'personaje_quita_pie_izq', 'personaje_quita_pie_der' ] |
'personaje_quita_pie_izq', 'personaje_quita_pie_der' ] |
81 |
|
|
|
# USOS = [ 'comer', 'beber', 'poner', 'lanzar', 'usar' ] |
|
|
|
|
82 |
|
|
83 |
# Atributos públicos de la clase |
# Atributos públicos de la clase |
84 |
|
|
242 |
sucesos.keys(i) in SUCESOS |
sucesos.keys(i) in SUCESOS |
243 |
""") |
""") |
244 |
|
|
245 |
|
def __leer_contenedor(self): return self.__contenedor |
246 |
|
|
247 |
|
contenedor = property(__leer_contenedor, |
248 |
|
doc="""(contenedor): entidad que contiene a este objeto. |
249 |
|
|
250 |
|
Normalmente será una sala o un personaje. Puede ser None temporalmente, |
251 |
|
durante alguna operación (por ejemplo, después de cogerlo de una sala y |
252 |
|
antes de meterlo en la mochila). |
253 |
|
""") |
254 |
|
|
255 |
|
|
256 |
# def __leer_usos(self): return self.__usos |
# def __leer_usos(self): return self.__usos |
257 |
# |
# |
258 |
# usos = property(__leer_usos, |
# usos = property(__leer_usos, |
333 |
self.__inicializar_objeto(conservar_arbol_xml) |
self.__inicializar_objeto(conservar_arbol_xml) |
334 |
|
|
335 |
|
|
336 |
def __inicializar_objeto(self,conservar_arbol_xml): |
def __inicializar_objeto(self, conservar_arbol_xml = 0): |
337 |
"""Rellena todos los datos del objeto a partir de su fichero de descripcion.""" |
"""Rellena todos los datos del objeto a partir de su fichero de descripcion.""" |
338 |
|
|
339 |
archivo = os.path.join(Objeto.DIR_DESC_OBJETOS, self.__id + Objeto.EXT_DESC_OBJETOS) |
archivo = os.path.join(Objeto.DIR_DESC_OBJETOS, self.__id + Objeto.EXT_DESC_OBJETOS) |
444 |
else: |
else: |
445 |
self.__categoria="" |
self.__categoria="" |
446 |
if elem_propiedades.hasAttribute('peso'): |
if elem_propiedades.hasAttribute('peso'): |
447 |
self.__peso = extraer_atributo_xml(elem_propiedades,'peso') |
self.__peso = float(extraer_atributo_xml(elem_propiedades,'peso')) |
448 |
else: |
else: |
449 |
self.__peso="" |
self.__peso="" |
450 |
if elem_propiedades.hasAttribute('volumen'): |
if elem_propiedades.hasAttribute('volumen'): |
576 |
raise ValueError("Cargado objeto " + self.id + " obsoleto: sin versión," + |
raise ValueError("Cargado objeto " + self.id + " obsoleto: sin versión," + |
577 |
" cuando se esperaba " + Objeto.VERSION_OBJETO) |
" cuando se esperaba " + Objeto.VERSION_OBJETO) |
578 |
|
|
579 |
assert(Objeto.VERSION_OBJETO == "1.0.2") |
assert(Objeto.VERSION_OBJETO == "1.0.3") |
580 |
while self.__version != "1.0.2": |
while self.__version != "1.0.3": |
581 |
|
|
582 |
# La versión 1.0.1 produce una ruptura con las anteriores ya que se migra al formato |
# La versión 1.0.1 produce una ruptura con las anteriores ya que se migra al formato |
583 |
# 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 |
584 |
# las salas, personajes y objetos. |
# las salas, personajes y objetos. |
585 |
|
|
586 |
if self.__version == "1.0.2": |
if self.__version == "1.0.1": |
587 |
# Versión 1.0.1 -> 1.0.2: añadir __max_cargas, borrar usos y crear sucesos. |
# Versión 1.0.1 -> 1.0.2: añadir __max_cargas, borrar usos y crear sucesos. |
588 |
# Se crea sin sucesos, pero al activarlo se reseteará a partir del nuevo |
# Se crea sin sucesos, pero al activarlo se reseteará a partir del nuevo |
589 |
# fichero descriptor XML. |
# fichero descriptor XML. |
592 |
self.__sucesos = {} |
self.__sucesos = {} |
593 |
self.__version = "1.0.2" |
self.__version = "1.0.2" |
594 |
escribir("Convertido objeto " + self.__id + " a versión 1.0.2") |
escribir("Convertido objeto " + self.__id + " a versión 1.0.2") |
595 |
|
elif self.__version == "1.0.2": |
596 |
raise ValueError("Cargado objeto " + self.__id + " con versión desconocida: " + |
# Versión 1.0.2 -> 1.0.3: añadir __contenedor. En realidad en este momento |
597 |
self.__version + " cuando se esperaba " + Objeto.VERSION_OBJETO) |
# no podemos saber cual es el contenedor real, así que lo inicializamos a None. |
598 |
|
# Esto es una inconsistencia, pero se arregla en el momento en el que alguien |
599 |
|
# coja o deje el objeto. Si alguien lo usa antes de cogerlo o dejarlo, puede |
600 |
|
# que ocurra algo raro, pero esperemos que no sea muy grave. |
601 |
|
self.__contenedor = None |
602 |
|
self.__version = "1.0.3" |
603 |
|
escribir("Convertido objeto " + self.__id + " a versión 1.0.3") |
604 |
|
else: |
605 |
|
raise ValueError("Cargado objeto " + self.__id + " con versión desconocida: " + |
606 |
|
self.__version + " cuando se esperaba " + Objeto.VERSION_OBJETO) |
607 |
|
|
608 |
|
|
609 |
# Métodos normales |
# Métodos normales |
610 |
|
|
611 |
|
def contener(self, contenedor): |
612 |
|
"""Pasa a estar contenido en el contenedor indicado. |
613 |
|
|
614 |
|
Requiere: |
615 |
|
contenedor != None |
616 |
|
""" |
617 |
|
self.__contenedor = contenedor |
618 |
|
|
619 |
|
|
620 |
|
def liberar(self): |
621 |
|
"""Pasa a no estar contenido en ningún sitio (temporalmente, durante alguna operación).""" |
622 |
|
self.__contenedor = None |
623 |
|
|
624 |
|
|
625 |
def activar(self): |
def activar(self): |
626 |
"""Realiza algunos chequeos periodicos de integridad del objeto. |
"""Realiza algunos chequeos periodicos de integridad del objeto. |
647 |
self.__cargas = self.__max_cargas |
self.__cargas = self.__max_cargas |
648 |
|
|
649 |
|
|
650 |
|
def cambiar_estado(self, puntos): |
651 |
|
"""Modifica el valor de la propiedad estado. |
652 |
|
|
653 |
|
El valor del parámetro puntos es sumado al de la propiedad. Puede ser negativo. Si el |
654 |
|
resultado es menor que 0 o mayor que 100, se trunca. |
655 |
|
""" |
656 |
|
self.__estado += estado |
657 |
|
if self.__estado < 0: |
658 |
|
self.__estado = 0 |
659 |
|
if self.__estado > 100: |
660 |
|
self.__estado = 100 |
661 |
|
|
662 |
|
|
663 |
def destruir(self): |
def destruir(self): |
664 |
"""El objeto desaparece del juego.""" |
"""El objeto desaparece del juego.""" |
665 |
#%% Este tiene más miga de lo que parece, me lo iré pensando cuando pueda... |
if self.__contenedor != None: |
666 |
pass |
self.__contenedor.objeto_destruido(self) |
667 |
|
|
668 |
|
|
669 |
|
def reemplazar(self, id_objeto_nuevo): |
670 |
|
"""El objeto desaparece del juego, y otro objeto nuevo se coloca en su lugar.""" |
671 |
|
if self.__contenedor != None: |
672 |
|
objeto_nuevo = Objeto(id_objeto_nuevo) |
673 |
|
self.__contenedor.objeto_reemplazado(self, objeto_nuevo) |
674 |
|
|
675 |
|
|
676 |
def responder_suceso_personaje(self, suceso, usuario): |
def responder_suceso_personaje(self, suceso, usuario): |
677 |
"""Todas las respuestas a sucesos de personaje son iguales, asi que las pongo aquí. |
"""Todas las respuestas a sucesos de personaje son iguales, asi que las pongo aquí. |
678 |
|
|
679 |
Chequea los requisitos y realiza las acciones correspondientes, y devuelve 1 |
Chequea los requisitos y realiza las acciones correspondientes, y devuelve 1 |
680 |
si se ha podido comer con éxito, y 0 si no. |
si se ha podido realizar el suceso con éxito, y 0 si no. |
681 |
|
|
682 |
Requiere: |
Requiere: |
683 |
usuario != None |
usuario != None |
685 |
if not self.__sucesos.has_key(suceso): |
if not self.__sucesos.has_key(suceso): |
686 |
return 0 |
return 0 |
687 |
else: |
else: |
688 |
respuesta_comer = self.__sucesos[suceso] |
respuesta = self.__sucesos[suceso] |
689 |
result = respuesta_comer.ejecutar(macros = {"$usuario": usuario, |
result = respuesta.ejecutar(macros = {"$usuario": usuario, |
690 |
"$sala": usuario.sala, |
"$sala": usuario.sala, |
691 |
"$objeto": self}) |
"$objeto": self}) |
692 |
|
|
693 |
if result == None: # Si ninguna acción acepta o cancela explícitamente el |
if result == None: # Si ninguna acción acepta o cancela explícitamente el |
694 |
result = 1 # suceso, se asume que se acepta |
result = 1 # suceso, se asume que se acepta |
786 |
def personaje_quita_pie_der(self, usuario): |
def personaje_quita_pie_der(self, usuario): |
787 |
return self.responder_suceso_personaje("personaje_quita_pie_der", usuario) |
return self.responder_suceso_personaje("personaje_quita_pie_der", usuario) |
788 |
|
|
789 |
|
def personaje_usa_con(self, usuario, objeto2): |
790 |
|
"""El suceso personaje_usa_con es casi igual, pero tiene un parámetro más. |
791 |
|
|
792 |
|
Chequea los requisitos y realiza las acciones correspondientes, y devuelve 1 |
793 |
|
si se ha podido realizar el suceso con éxito, y 0 si no. |
794 |
|
|
795 |
|
Requiere: |
796 |
|
usuario != None |
797 |
|
objeto2 != None |
798 |
|
""" |
799 |
|
if not self.__sucesos.has_key("personaje_usa_con"): |
800 |
|
return 0 |
801 |
|
else: |
802 |
|
respuesta = self.__sucesos["personaje_usa_con"] |
803 |
|
result = respuesta.ejecutar(macros = {"$usuario": usuario, |
804 |
|
"$sala": usuario.sala, |
805 |
|
"$objeto": self, |
806 |
|
"$objeto2": objeto2}) |
807 |
|
|
808 |
|
if result == None: # Si ninguna acción acepta o cancela explícitamente el |
809 |
|
result = 1 # suceso, se asume que se acepta |
810 |
|
|
811 |
|
return result |
812 |
|
|
813 |
|
|
814 |
# def puede_comer(self, usuario): |
# def puede_comer(self, usuario): |
815 |
# """Comprueba si el usuario puede 'comer' este objeto. |
# """Comprueba si el usuario puede 'comer' este objeto. |