33 |
class InterfazPNJ(Controlador): |
class InterfazPNJ(Controlador): |
34 |
"""Interfaz controla directamente a una instancia de clase PersonajeNoJugador. |
"""Interfaz controla directamente a una instancia de clase PersonajeNoJugador. |
35 |
|
|
36 |
El control es automátic, no necesita intervención de ningún jugador. De momento |
El control es automático, no necesita intervención de ningún jugador. De momento |
37 |
es muy básico, sólo sabe quedarse quieto en una sala y responder a un ataque. |
es muy básico, sólo sabe quedarse quieto en una sala y responder a un ataque. |
38 |
|
|
39 |
La clase funciona como una maquina de estados, que acepta los siguientes |
La clase funciona como una maquina de estados, que acepta los siguientes |
47 |
- susurra_pesonaje: otro personaje susurra algo a éste. |
- susurra_pesonaje: otro personaje susurra algo a éste. |
48 |
- grita_personaje: otro personaje dice algo a todos los personajes del mundo |
- grita_personaje: otro personaje dice algo a todos los personajes del mundo |
49 |
- ataca_personaje: otro personaje ataca a este |
- ataca_personaje: otro personaje ataca a este |
50 |
|
|
51 |
Contiene los siguientes atributos: |
Contiene los siguientes atributos: |
52 |
|
|
53 |
- personaje (Personaje): el personaje que controlamos |
- __personaje (Personaje): el personaje que controlamos |
54 |
- estado (string): el estado en el que se encuentra el interfaz |
- __estado (string): el estado en el que se encuentra el interfaz |
55 |
- sub_estado (int): algunos estados tienen fases intermedias. Si no, None. |
- __sub_estado (int): algunos estados tienen fases intermedias. Si no, None. |
56 |
- timer (Timer): temporizador usado opcionalmente |
- __timer (Timer): temporizador usado opcionalmente |
57 |
- oponente (Personaje): otro personaje con quien el nuestro está combatiendo |
- __oponente (Personaje): otro personaje con quien el nuestro está combatiendo |
58 |
|
|
59 |
Los siguientes atributos provocan ajustes automáticos al ser modificados: |
Los siguientes atributos provocan ajustes automáticos al ser modificados: |
60 |
|
|
61 |
- personaje: se modifica también al personaje para que tenga a este interfaz como |
- __personaje: se modifica también al personaje para que tenga a este interfaz como |
62 |
controlador |
controlador |
63 |
""" |
""" |
64 |
|
|
65 |
|
|
66 |
def __init__(self): |
def __init__(self): |
67 |
self.__dict__["personaje"] = None # El personaje se inicializa más tarde |
"""Crea un interfaz nuevo para un personaje recien creado o cargado de disco.""" |
68 |
self.__dict__["estado"] = "" |
self.__personaje = None |
69 |
self.__dict__["sub_estado"] = None |
self.__estado = "" |
70 |
self.__dict__["timer"] = None |
self.__sub_estado = None |
71 |
self.__dict__["oponente"] = None |
self.__timer = None |
72 |
|
self.__oponente = None |
73 |
self.estado_normal() |
self.estado_normal() |
|
|
|
|
|
|
|
def __setattr__(self, name, value): |
|
|
"""Realiza ajustes automáticos al modificar cualquier parámetro""" |
|
|
|
|
|
if name == "personaje": |
|
|
# Si es personaje, liberar al anterior y controlar al nuevo. |
|
|
if (self.personaje != None): self.personaje.controlador = None |
|
|
self.__dict__["personaje"] = value |
|
|
if (self.personaje != None): self.personaje.controlador = self |
|
|
else: |
|
|
# En otro caso, asignar y ya esta |
|
|
self.__dict__[name] = value |
|
74 |
|
|
75 |
|
|
76 |
def __del__(self): |
def __del__(self): |
77 |
"""Realiza ajustes automáticos al ser destruido""" |
"""Realiza ajustes automáticos al ser destruido""" |
78 |
|
if self.__personaje != None: |
79 |
# Liberar al personaje que estamos controlando |
self.liberar_personaje() |
80 |
self.personaje = None |
|
81 |
|
|
82 |
|
def personaje(self): |
83 |
|
return self.__personaje |
84 |
|
|
85 |
|
|
86 |
|
def controlar_personaje(self, personaje): |
87 |
|
"""Pasar a estar controlando un personaje. |
88 |
|
|
89 |
|
Requiere: |
90 |
|
self.__personaje == None |
91 |
|
personaje != None |
92 |
|
""" |
93 |
|
self.__personaje = personaje |
94 |
|
self.__personaje.controlar(self) |
95 |
|
|
96 |
|
|
97 |
|
def liberar_personaje(self): |
98 |
|
"""Soltar al personaje actual y dejarlo libre. |
99 |
|
|
100 |
|
Requiere: |
101 |
|
self.__personaje != None |
102 |
|
""" |
103 |
|
self.__personaje.liberar() |
104 |
|
self.__personaje = None |
105 |
|
|
106 |
|
|
107 |
# ---------------------------- |
# ---------------------------- |
123 |
nombre_sala_destino -- el nombre de la sala a donde va |
nombre_sala_destino -- el nombre de la sala a donde va |
124 |
""" |
""" |
125 |
pass # aqui no se me ocurre nada |
pass # aqui no se me ocurre nada |
126 |
|
|
127 |
|
|
128 |
|
def describir_entorno(self, mensaje): |
129 |
|
"""Metodo llamado cuando un personaje describe una accion. |
130 |
|
|
131 |
|
personaje -- el personaje que actçua. |
132 |
|
acción -- el texto que escribe. |
133 |
|
""" |
134 |
|
|
135 |
|
pass # aqui tampoco se me ocurre nada, en principio |
136 |
|
|
137 |
|
|
138 |
|
|
139 |
def actua_personaje(self, personaje, accion): |
def actua_personaje(self, personaje, accion): |
162 |
""" |
""" |
163 |
pass # se podría hacer que los PNJ entiendan conversaciones |
pass # se podría hacer que los PNJ entiendan conversaciones |
164 |
|
|
165 |
|
|
166 |
def susurra_personaje(self, personaje, mensaje): |
def susurra_personaje(self, personaje, mensaje): |
167 |
"""Metodo llamado cuando otro personaje susurra algo a éste. |
"""Metodo llamado cuando otro personaje susurra algo a éste. |
168 |
|
|
187 |
personaje -- el personaje que ha atacado. |
personaje -- el personaje que ha atacado. |
188 |
""" |
""" |
189 |
|
|
190 |
# Llamar a la función correspondiente según estado |
#%% funciones de combate desactivadas |
191 |
nombre_func = "ataque_" + self.estado |
#%% # Llamar a la función correspondiente según estado |
192 |
if self.sub_estado != None: nombre_func += "_" + str(self.sub_estado) |
#%% nombre_func = "ataque_" + self.estado |
193 |
|
#%% if self.sub_estado != None: nombre_func += "_" + str(self.sub_estado) |
194 |
func = getattr(self, nombre_func, None) |
#%% |
195 |
if func == None: |
#%% func = getattr(self, nombre_func, None) |
196 |
print "ERROR: recibido ataque en estado " + self.estado + \ |
#%% if func == None: |
197 |
((self.sub_estado != None and "_" + str(self.sub_estado)) or "") + \ |
#%% print "ERROR: recibido ataque en estado " + self.estado + \ |
198 |
((self.personaje != None and "(" + self.personaje.nombre + ")") or "") |
#%% ((self.sub_estado != None and "_" + str(self.sub_estado)) or "") + \ |
199 |
else: |
#%% ((self.personaje != None and "(" + self.personaje.nombre + ")") or "") |
200 |
func(personaje, result) |
#%% else: |
201 |
|
#%% func(personaje, result) |
202 |
|
|
203 |
|
|
204 |
def lanzar_timer(self, segundos): |
def lanzar_timer(self, segundos): |
239 |
self.sub_estado = None |
self.sub_estado = None |
240 |
|
|
241 |
|
|
242 |
def ataque_normal(self, personaje, result): |
#%% funciones de combate desactivadas |
243 |
# Al recibir un ataque, pasamos inmediantamente a estado combate |
#%% def ataque_normal(self, personaje, result): |
244 |
|
#%% # Al recibir un ataque, pasamos inmediantamente a estado combate |
245 |
self.oponente = personaje |
#%% |
246 |
self.cbt_empieza_combate_defiendes() |
#%% self.oponente = personaje |
247 |
self.cbt_te_pegan(result) |
#%% self.cbt_empieza_combate_defiendes() |
248 |
|
#%% self.cbt_te_pegan(result) |
249 |
if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"): |
#%% |
250 |
self.cbt_termina_combate() |
#%% if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"): |
251 |
self.estado_normal() |
#%% self.cbt_termina_combate() |
252 |
else: |
#%% self.estado_normal() |
253 |
# Al poner un timer de 3 segundos, el combate funciona como |
#%% else: |
254 |
# una sucesion de golpes alternados cada 3 segundos. |
#%% # Al poner un timer de 3 segundos, el combate funciona como |
255 |
self.lanzar_timer(3) |
#%% # una sucesion de golpes alternados cada 3 segundos. |
256 |
self.estado_combate() |
#%% self.lanzar_timer(3) |
257 |
|
#%% self.estado_combate() |
258 |
|
#%% |
259 |
# -------------- |
#%% |
260 |
# ESTADO COMBATE |
#%% # -------------- |
261 |
# -------------- |
#%% # ESTADO COMBATE |
262 |
|
#%% # -------------- |
263 |
|
#%% |
264 |
def estado_combate(self): |
#%% |
265 |
self.estado = "combate" |
#%% def estado_combate(self): |
266 |
self.sub_estado = None |
#%% self.estado = "combate" |
267 |
|
#%% self.sub_estado = None |
268 |
|
#%% |
269 |
def ataque_combate(self, oponente, result): |
#%% |
270 |
self.cbt_te_pegan(result) |
#%% def ataque_combate(self, oponente, result): |
271 |
if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"): |
#%% self.cbt_te_pegan(result) |
272 |
self.cbt_termina_combate() |
#%% if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"): |
273 |
self.estado_normal() |
#%% self.cbt_termina_combate() |
274 |
else: |
#%% self.estado_normal() |
275 |
self.estado_combate() |
#%% else: |
276 |
|
#%% self.estado_combate() |
277 |
|
#%% |
278 |
def timeout_combate(self): |
#%% |
279 |
self.cbt_pegar() |
#%% def timeout_combate(self): |
280 |
if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"): |
#%% self.cbt_pegar() |
281 |
self.cbt_termina_combate() |
#%% if (self.personaje.estado == "muerto") or (self.oponente.estado == "muerto"): |
282 |
self.estado_normal() |
#%% self.cbt_termina_combate() |
283 |
else: |
#%% self.estado_normal() |
284 |
self.lanzar_timer(6) |
#%% else: |
285 |
self.estado_combate() |
#%% self.lanzar_timer(6) |
286 |
|
#%% self.estado_combate() |
287 |
|
#%% |
288 |
def cbt_empieza_combate_defiendes(self): |
#%% |
289 |
pass |
#%% def cbt_empieza_combate_defiendes(self): |
290 |
|
#%% pass |
291 |
|
#%% |
292 |
def cbt_pegar(self): |
#%% |
293 |
self.personaje.hablar("\n" + color(33) + "\n" + self.personaje.nombre + |
#%% def cbt_pegar(self): |
294 |
" ataca a " + self.oponente.nombre + finl) |
#%% self.personaje.hablar("\n" + color(33) + "\n" + self.personaje.nombre + |
295 |
|
#%% " ataca a " + self.oponente.nombre + finl) |
296 |
result = self.personaje.ataque_fisico(self.oponente) |
#%% |
297 |
|
#%% result = self.personaje.ataque_fisico(self.oponente) |
298 |
if result == Personaje.ATAQUE_EXITO: |
#%% |
299 |
self.personaje.hablar(self.personaje.nombre + " ha conseguido golpear") |
#%% if result == Personaje.ATAQUE_EXITO: |
300 |
elif result == Personaje.ATAQUE_FALLADO: |
#%% self.personaje.hablar(self.personaje.nombre + " ha conseguido golpear") |
301 |
self.personaje.hablar(self.personaje.nombre + " ha fallado, su ataque no hace nada") |
#%% elif result == Personaje.ATAQUE_FALLADO: |
302 |
elif result == Personaje.ATAQUE_CRITICO: |
#%% self.personaje.hablar(self.personaje.nombre + " ha fallado, su ataque no hace nada") |
303 |
self.personaje.hablar(self.personaje.nombre + " ha ejecutado un golpe impresionante") |
#%% elif result == Personaje.ATAQUE_CRITICO: |
304 |
elif result == Personaje.ATAQUE_PIFIA: |
#%% self.personaje.hablar(self.personaje.nombre + " ha ejecutado un golpe impresionante") |
305 |
self.personaje.hablar("¡" + self.personaje.nombre + " ha fallado estrepitosamente, se daña a si mismo/a!") |
#%% elif result == Personaje.ATAQUE_PIFIA: |
306 |
else: |
#%% self.personaje.hablar("¡" + self.personaje.nombre + " ha fallado estrepitosamente, se daña a si mismo/a!") |
307 |
print "ERROR: recibido resultado de combate " + str(result) + \ |
#%% else: |
308 |
" (" + self.personaje.nombre + ")" |
#%% print "ERROR: recibido resultado de combate " + str(result) + \ |
309 |
|
#%% " (" + self.personaje.nombre + ")" |
310 |
self.personaje.hablar("A " + self.personaje.nombre + " le quedan " + |
#%% |
311 |
str(self.personaje.vida) + " puntos de vida") |
#%% self.personaje.hablar("A " + self.personaje.nombre + " le quedan " + |
312 |
self.personaje.hablar("Y a " + self.oponente.nombre + " le quedan " + |
#%% str(self.personaje.vida) + " puntos de vida") |
313 |
str(self.oponente.vida) + " puntos de vida") |
#%% self.personaje.hablar("Y a " + self.oponente.nombre + " le quedan " + |
314 |
|
#%% str(self.oponente.vida) + " puntos de vida") |
315 |
if self.oponente.estado == "muerto": |
#%% |
316 |
self.cbt_oponente_muerto() |
#%% if self.oponente.estado == "muerto": |
317 |
elif self.personaje.estado == "muerto": |
#%% self.cbt_oponente_muerto() |
318 |
self.cbt_personaje_muerto() |
#%% elif self.personaje.estado == "muerto": |
319 |
|
#%% self.cbt_personaje_muerto() |
320 |
|
#%% |
321 |
def cbt_te_pegan(self, result): |
#%% |
322 |
if self.oponente.estado == "muerto": |
#%% def cbt_te_pegan(self, result): |
323 |
self.cbt_oponente_muerto() |
#%% if self.oponente.estado == "muerto": |
324 |
elif self.personaje.estado == "muerto": |
#%% self.cbt_oponente_muerto() |
325 |
self.cbt_personaje_muerto() |
#%% elif self.personaje.estado == "muerto": |
326 |
|
#%% self.cbt_personaje_muerto() |
327 |
|
#%% |
328 |
def cbt_oponente_muerto(self): |
#%% |
329 |
self.personaje.hablar("\n" + color(31) + self.oponente.nombre + |
#%% def cbt_oponente_muerto(self): |
330 |
" ha muerto. RIP." + finl) |
#%% self.personaje.hablar("\n" + color(31) + self.oponente.nombre + |
331 |
# puntos de experiencia, objetos... (aún sin hacer) |
#%% " ha muerto. RIP." + finl) |
332 |
|
#%% # puntos de experiencia, objetos... (aún sin hacer) |
333 |
|
#%% |
334 |
def cbt_personaje_muerto(self): |
#%% |
335 |
# pues no se, habra que ver que hacemos aqui |
#%% def cbt_personaje_muerto(self): |
336 |
pass |
#%% # pues no se, habra que ver que hacemos aqui |
337 |
|
#%% pass |
338 |
|
#%% |
339 |
def cbt_termina_combate(self): |
#%% |
340 |
self.oponente = None |
#%% def cbt_termina_combate(self): |
341 |
if self.timer != None: |
#%% self.oponente = None |
342 |
self.timer.stop() |
#%% if self.timer != None: |
343 |
self.timer = None |
#%% self.timer.stop() |
344 |
|
#%% self.timer = None |
345 |
|
|
346 |
|
|
347 |
# Código para pruebas unitarias del módulo. |
# Código para pruebas unitarias del módulo. |