1
2
3
4
5
6
7
8
9 import pilas.utils
10
12 """Componente que permite a los actores aprender habilidades o realizar comportamientos."""
13
15 """Inicializa el componente."""
16 self._habilidades = []
17 self.comportamiento_actual = None
18 self.comportamientos = []
19 self.repetir_comportamientos_por_siempre = False
20 self.habilidades = ProxyHabilidades(self._habilidades)
21
32
34 """Agrega una habilidad a la lista de cosas que puede hacer un actor.
35
36 :param classname: Referencia a la clase que representa la habilidad.
37 """
38 objeto_habilidad = classname(self, *k, **w)
39 self._habilidades.append(objeto_habilidad)
40
42 """ Elimina una habilidad asociada a un Actor.
43
44 :param classname: Referencia a la clase que representa la habilidad.
45 """
46 habilidad = self.obtener_habilidad(classname)
47
48 if habilidad:
49 self._habilidades.remove(habilidad)
50
52 """Comprueba si el actor ha aprendido la habilidad indicada.
53
54 :param classname: Referencia a la clase que representa la habilidad.
55 """
56 habilidades_actuales = [habilidad.__class__ for habilidad in self._habilidades]
57 return (classname in habilidades_actuales)
58
60 """Comprueba si el actor tiene el comportamiento indicado.
61
62 :param classname: Referencia a la clase que representa el comportamiento.
63 """
64 comportamientos_actuales = [comportamiento.__class__ for comportamiento in self.comportamientos]
65 return (classname in comportamientos_actuales)
66
68 """Obtiene la habilidad asociada a un Actor.
69
70 :param classname: Referencia a la clase que representa la habilidad.
71 :return: Devuelve None si no se encontró.
72 """
73 su_habilidad = None
74
75 for habilidad in self._habilidades:
76 if habilidad.__class__ == classname:
77 su_habilidad = habilidad
78 break
79
80 return su_habilidad
81
82 - def hacer_luego(self, comportamiento, repetir_por_siempre=False):
83 """Define un nuevo comportamiento para realizar al final.
84
85 Los actores pueden tener una cadena de comportamientos, este
86 metodo agrega el comportamiento al final de la cadena.
87
88 :param comportamiento: Referencia al comportamiento.
89 :param repetir_por_siempre: Si el comportamiento se volverá a ejecutar luego de terminar.
90 """
91
92 self.comportamientos.append(comportamiento)
93 self.repetir_comportamientos_por_siempre = repetir_por_siempre
94
95 - def hacer(self, comportamiento):
102
104 "Elimina todas las habilidades asociadas al actor."
105 for h in self._habilidades:
106 h.eliminar()
107
112
114 "Realiza una actualización sobre todas las habilidades."
115 for h in self._habilidades:
116 h.actualizar()
117
131
138
139
141 """Implementa un intermediario con todas las habilidades del Actor."""
142
145
147 su_habilidad = None
148
149 for habilidad in self.habilidades:
150 if habilidad.__class__.__name__ == name:
151 su_habilidad = habilidad
152 break
153
154 if not su_habilidad:
155 raise Exception("El actor no tiene asignada la habilidad " + name +
156 ".\n No puede acceder mediante actor.habilidades." + name)
157
158 return su_habilidad
159