25 |
|
|
26 |
import sys |
import sys |
27 |
from personaje import * |
from personaje import * |
28 |
|
from cronomine import * |
29 |
|
|
30 |
class PersonajeJugador(Personaje): |
class PersonajeJugador(Personaje): |
31 |
"""Cualquier personaje controlado por un jugador. |
"""Cualquier personaje controlado por un jugador. |
219 |
silencio in ["si", "no"] |
silencio in ["si", "no"] |
220 |
""") |
""") |
221 |
|
|
222 |
|
def __leer_hambre(self): return self.__hambre |
223 |
|
|
224 |
|
hambre = property(__leer_hambre, |
225 |
|
doc="""(int): nivel de hambre del personaje (de 0 = satisfecho |
226 |
|
a 15 = muriendose de hambre). |
227 |
|
|
228 |
|
Invariantes: |
229 |
|
hambre in range(0, 16) |
230 |
|
""") |
231 |
|
|
232 |
|
|
233 |
|
def __leer_mensaje_hambre(self): |
234 |
|
return self.__raza.niveles_hambre[int(self.__hambre)]["mensaje"] |
235 |
|
|
236 |
|
mensaje_hambre = property(__leer_mensaje_hambre, |
237 |
|
doc="""(string): texto que refleja el hambre que tiene |
238 |
|
el personaje. |
239 |
|
|
240 |
|
Invariantes: |
241 |
|
mensaje_hambre != None |
242 |
|
""") |
243 |
|
|
244 |
|
|
245 |
|
def __leer_sed(self): return self.__sed |
246 |
|
|
247 |
|
sed = property(__leer_sed, |
248 |
|
doc="""(int): nivel de sed del personaje (de 0 = satisfecho |
249 |
|
a 15 = muriendose de sed). |
250 |
|
|
251 |
|
Invariantes: |
252 |
|
sed in range(0, 16) |
253 |
|
""") |
254 |
|
|
255 |
|
|
256 |
|
def __leer_mensaje_sed(self): |
257 |
|
return self.__raza.niveles_sed[int(self.__sed)]["mensaje"] |
258 |
|
|
259 |
|
mensaje_sed = property(__leer_mensaje_sed, |
260 |
|
doc="""(string): texto que refleja el sed que tiene |
261 |
|
el personaje. |
262 |
|
|
263 |
|
Invariantes: |
264 |
|
mensaje_sed != None |
265 |
|
""") |
266 |
|
|
267 |
# Constructor |
# Constructor |
268 |
|
|
269 |
def __init__(self, id, clave, es_maia, nombre, descripcion, experiencia, nivel, vida, |
def __init__(self, id, clave, es_maia, nombre, descripcion, experiencia, nivel, vida, |
281 |
Personaje.__init__(self, id, sala, nombre, descripcion, experiencia, nivel, vida, |
Personaje.__init__(self, id, sala, nombre, descripcion, experiencia, nivel, vida, |
282 |
volumen, estado, aura, controlador, atrib, idiomas, idioma_base) |
volumen, estado, aura, controlador, atrib, idiomas, idioma_base) |
283 |
|
|
284 |
|
# Atributos privados: |
285 |
|
# |
286 |
|
# - __crono_subir_hambre(CronoMine): cronometro que cada vez que vence, sube |
287 |
|
# un nivel de hambre |
288 |
|
# - __crono_msg_hambre(CronoMine): cronometro que cada vez que vence, muestra |
289 |
|
# un mensaje de hambre y produce daño |
290 |
|
# - __crono_subir_sed(CronoMine): cronometro que cada vez que vence, sube |
291 |
|
# un nivel de sed |
292 |
|
# - __crono_msg_sed(CronoMine): cronometro que cada vez que vence, muestra |
293 |
|
# un mensaje de sed y produce daño |
294 |
|
# |
295 |
|
# Invariantes: |
296 |
|
# self.__crono_subir_hambre != None |
297 |
|
# self.__crono_subir_sed != None |
298 |
|
|
299 |
self.__clave = clave |
self.__clave = clave |
300 |
self.__es_maia = es_maia |
self.__es_maia = es_maia |
301 |
self.__raza = raza |
self.__raza = raza |
307 |
self.__color_de_ojos = color_de_ojos |
self.__color_de_ojos = color_de_ojos |
308 |
self.__color_de_pelo = color_de_pelo |
self.__color_de_pelo = color_de_pelo |
309 |
self.__silencio = 'no' |
self.__silencio = 'no' |
310 |
|
self.__hambre = 0 |
311 |
|
self.__sed = 0 |
312 |
|
|
313 |
|
self.__crono_subir_hambre = None |
314 |
|
self.__crono_subir_sed = None |
315 |
|
self.__crono_msg_hambre = None |
316 |
|
self.__crono_msg_sed = None |
317 |
|
|
318 |
|
self.__efectos_hambre() |
319 |
|
self.__efectos_sed() |
320 |
|
|
321 |
# Dos opciones según el personaje venga ya controlado o no |
# Dos opciones según el personaje venga ya controlado o no |
322 |
if self._Personaje__controlador == None: |
if self._Personaje__controlador == None: |
331 |
self._Personaje__sala.entrar_personaje(self) # se asume que el limbo tiene |
self._Personaje__sala.entrar_personaje(self) # se asume que el limbo tiene |
332 |
# capacidad de volumen infinita |
# capacidad de volumen infinita |
333 |
|
|
334 |
|
# Al estar en el limbo, los cronometros estan pausados |
335 |
|
self._PersonajeJugador__crono_subir_hambre.pausar() |
336 |
|
self._PersonajeJugador__crono_subir_sed.pausar() |
337 |
|
if self._PersonajeJugador__crono_msg_hambre != None: |
338 |
|
self._PersonajeJugador__crono_msg_hambre.pausar() |
339 |
|
if self._PersonajeJugador__crono_msg_sed != None: |
340 |
|
self._PersonajeJugador__crono_msg_sed.pausar() |
341 |
|
|
342 |
self.actuar_global("ha sido creado") |
self.actuar_global("ha sido creado") |
343 |
|
|
344 |
else: |
else: |
357 |
# capacidad de volumen infinita |
# capacidad de volumen infinita |
358 |
|
|
359 |
|
|
360 |
|
# métodos normales |
361 |
|
|
362 |
|
def alimentar(self, puntos_nutritivos): |
363 |
|
"""Se reduce el nivel de hambre de un personaje. |
364 |
|
|
365 |
|
El nivel reducido depende de la raza (para un humano, 1 punto nutritivo = |
366 |
|
1 nivel de hambre). Si llega a 0, el exceso de puntos nutritivos se |
367 |
|
pierde. |
368 |
|
|
369 |
|
Requiere: |
370 |
|
puntos_nutritivos > 0 |
371 |
|
""" |
372 |
|
self.__hambre -= puntos_nutritivos / self.__raza.puntos_nutritivos |
373 |
|
if self.__hambre < 0: |
374 |
|
self.__hambre = 0 |
375 |
|
self.__efectos_hambre() |
376 |
|
|
377 |
|
|
378 |
|
def hidratar(self, puntos_hidratantes): |
379 |
|
"""Se reduce el nivel de sed de un personaje. |
380 |
|
|
381 |
|
El nivel reducido depende de la raza (para un humano, 1 punto hidratante = |
382 |
|
1 nivel de sed). Si llega a 0, el exceso de puntos hidratantes se |
383 |
|
pierde. |
384 |
|
|
385 |
|
Requiere: |
386 |
|
puntos_hidratantes > 0 |
387 |
|
""" |
388 |
|
self.__sed -= puntos_hidratantes / self.__raza.puntos_hidratantes |
389 |
|
if self.__sed < 0: |
390 |
|
self.__sed = 0 |
391 |
|
self.__efectos_sed() |
392 |
|
|
393 |
|
|
394 |
|
# Métodos privados |
395 |
|
|
396 |
|
def __efectos_hambre(self): |
397 |
|
"""Ejecuta los efectos correspondientes según nivel de hambre.""" |
398 |
|
|
399 |
|
from mundo import Mundo |
400 |
|
|
401 |
|
# Iniciar el cronometro para subir al siguiente nivel de hambre |
402 |
|
tiempo_subir_hambre = self.__raza.tiempo_hambre |
403 |
|
self.__crono_subir_hambre = CronoMine(Mundo.cronoMine_control, |
404 |
|
FechaHoraMineRel(horas = tiempo_subir_hambre), |
405 |
|
self.__vencido_crono_subir_hambre) |
406 |
|
|
407 |
|
# Comprobar los datos del nivel actual de hambre |
408 |
|
hambre_int = int(self.__hambre) |
409 |
|
nivel_hambre = self.__raza.niveles_hambre[hambre_int] |
410 |
|
if nivel_hambre["horas"] > 0: |
411 |
|
# Si hay efectos, enviar el mensaje, producir el daño e iniciar |
412 |
|
# el cronometro para el siguiente mensaje. |
413 |
|
self.actuar_uno_mismo(nivel_hambre["mensaje"]) |
414 |
|
self.danar(nivel_hambre["puntos_dano"]) |
415 |
|
self.__crono_msg_hambre = CronoMine(Mundo.cronoMine_control, |
416 |
|
FechaHoraMineRel(horas = nivel_hambre["horas"]), |
417 |
|
self.__vencido_crono_msg_hambre) |
418 |
|
else: |
419 |
|
# Si no, destruir el crono, si lo hay |
420 |
|
if self.__crono_msg_hambre != None: |
421 |
|
self.__crono_msg_hambre.parar() |
422 |
|
self.__crono_msg_hambre = None |
423 |
|
|
424 |
|
|
425 |
|
def __vencido_crono_subir_hambre(self, crono): |
426 |
|
"""Realiza las acciones que ocurren al subir un nivel de hambre.""" |
427 |
|
self.__hambre += 1 |
428 |
|
if self.__hambre > 15: |
429 |
|
self.__hambre = 15 |
430 |
|
self.__efectos_hambre() |
431 |
|
escribir('El personaje ' + self.id + ' aumenta un nivel de hambre.') |
432 |
|
|
433 |
|
|
434 |
|
def __vencido_crono_msg_hambre(self, crono): |
435 |
|
"""Realiza las acciones que ocurren al mostrar un mensaje de hambre.""" |
436 |
|
|
437 |
|
from mundo import Mundo |
438 |
|
|
439 |
|
hambre_int = int(self.__hambre) |
440 |
|
nivel_hambre = self.__raza.niveles_hambre[hambre_int] |
441 |
|
if nivel_hambre["horas"] > 0: |
442 |
|
# Si hay efectos, enviar el mensaje, producir el daño e iniciar |
443 |
|
# el cronometro para el siguiente mensaje. |
444 |
|
self.actuar_uno_mismo(nivel_hambre["mensaje"]) |
445 |
|
self.danar(nivel_hambre["puntos_dano"]) |
446 |
|
self.__crono_msg_hambre = CronoMine(Mundo.cronoMine_control, |
447 |
|
FechaHoraMineRel(horas = nivel_hambre["horas"]), |
448 |
|
self.__vencido_crono_msg_hambre) |
449 |
|
|
450 |
|
def __efectos_sed(self): |
451 |
|
"""Ejecuta los efectos correspondientes según nivel de sed.""" |
452 |
|
|
453 |
|
from mundo import Mundo |
454 |
|
|
455 |
|
# Iniciar el cronometro para subir al siguiente nivel de sed |
456 |
|
tiempo_subir_sed = self.__raza.tiempo_sed |
457 |
|
self.__crono_subir_sed = CronoMine(Mundo.cronoMine_control, |
458 |
|
FechaHoraMineRel(horas = tiempo_subir_sed), |
459 |
|
self.__vencido_crono_subir_sed) |
460 |
|
|
461 |
|
# Comprobar los datos del nivel actual de sed |
462 |
|
sed = int(self.__sed) |
463 |
|
nivel_sed = self.__raza.niveles_sed[sed] |
464 |
|
if nivel_sed["horas"] > 0: |
465 |
|
# Si hay efectos, enviar el mensaje, producir el daño e iniciar |
466 |
|
# el cronometro para el siguiente mensaje. |
467 |
|
self.__actuar_uno_mismo(nivel_sed["mensaje"]) |
468 |
|
self.__danar(nivel_sed["puntos_dano"]) |
469 |
|
self.__crono_msg_sed = CronoMine(Mundo.cronoMine_control, |
470 |
|
FechaHoraMineRel(horas = nivel_sed["horas"]), |
471 |
|
self.__vencido_crono_msg_sed) |
472 |
|
else: |
473 |
|
# Si no, destruir el crono, si lo hay |
474 |
|
if self.__crono_msg_sed != None: |
475 |
|
self.__crono_msg_sed.parar() |
476 |
|
self.__crono_msg_sed = None |
477 |
|
|
478 |
|
|
479 |
|
def __vencido_crono_subir_sed(self, crono): |
480 |
|
"""Realiza las acciones que ocurren al subir un nivel de sed.""" |
481 |
|
self.__sed += 1 |
482 |
|
if self.__sed > 15: |
483 |
|
self.__sed = 15 |
484 |
|
self.__efectos_sed() |
485 |
|
escribir('El personaje ' + self.id + ' aumenta un nivel de sed.') |
486 |
|
|
487 |
|
|
488 |
|
def __vencido_crono_msg_sed(self, crono): |
489 |
|
"""Realiza las acciones que ocurren al mostrar un mensaje de sed.""" |
490 |
|
|
491 |
|
from mundo import Mundo |
492 |
|
|
493 |
|
sed = int(self.__sed) |
494 |
|
nivel_sed = self.__raza.niveles_sed[sed] |
495 |
|
if nivel_sed["horas"] > 0: |
496 |
|
# Si hay efectos, enviar el mensaje, producir el daño e iniciar |
497 |
|
# el cronometro para el siguiente mensaje. |
498 |
|
self.__actuar_uno_mismo(nivel_sed["mensaje"]) |
499 |
|
self.__danar(nivel_sed["puntos_dano"]) |
500 |
|
self.__crono_msg_sed = CronoMine(Mundo.cronoMine_control, |
501 |
|
FechaHoraMineRel(horas = nivel_sed["horas"]), |
502 |
|
self.__vencido_crono_msg_sed) |
503 |
|
|
504 |
|
|
505 |
# Código para pruebas unitarias del módulo. |
# Código para pruebas unitarias del módulo. |
506 |
|
|
507 |
if (__name__ == '__main__'): |
if (__name__ == '__main__'): |