146 |
ATAQUE_PIFIA = 4 |
ATAQUE_PIFIA = 4 |
147 |
|
|
148 |
|
|
149 |
def __init__(self, id, nombre, descripcion, experiencia, nivel, vida, |
def __init__(self, id, sala): |
|
volumen, estado, sala, controlador, atrib, idiomas): |
|
150 |
"""Método para crear una nueva instancia de esta clase. |
"""Método para crear una nueva instancia de esta clase. |
151 |
|
|
152 |
Personaje es una clase abstracta, luego no puede ser directamente |
Personaje es una clase abstracta, luego no puede ser directamente |
153 |
instanciada. Este método sólo puede ser llamado desde subclases. |
instanciada. Este método sólo puede ser llamado desde subclases. |
154 |
|
El constructor de la subclase debe rellenar todos los valores de |
155 |
|
tal forma que se mantenga la invariante. |
156 |
|
|
157 |
Requiere: |
Requiere: |
158 |
Todos los parámetros satisfacen las invariantes |
Todos los parámetros satisfacen las invariantes |
160 |
# Dar valores iniciales usando __dict__ para que no salte __setattr__ |
# Dar valores iniciales usando __dict__ para que no salte __setattr__ |
161 |
self.__dict__["id"] = id |
self.__dict__["id"] = id |
162 |
self.__dict__["version"] = Personaje.VERSION |
self.__dict__["version"] = Personaje.VERSION |
163 |
self.__dict__["nombre"] = nombre |
self.__dict__["sala"] = sala |
164 |
self.__dict__["descripcion"] = descripcion |
|
165 |
self.__dict__["experiencia"] = experiencia |
self.__dict__["nombre"] = None |
166 |
self.__dict__["nivel"] = nivel |
self.__dict__["descripcion"] = None |
167 |
self.__dict__["vida"] = vida |
self.__dict__["experiencia"] = None |
168 |
self.__dict__["volumen"] = volumen |
self.__dict__["nivel"] = None |
169 |
self.__dict__["estado"] = estado |
self.__dict__["vida"] = None |
170 |
self.__dict__["sala"] = None |
self.__dict__["volumen"] = None |
171 |
self.__dict__["controlador"] = controlador |
self.__dict__["estado"] = None |
172 |
self.__dict__["atrib"] = atrib |
self.__dict__["controlador"] = None |
173 |
self.__dict__["idiomas"] = idiomas |
self.__dict__["atrib"] = None |
174 |
|
self.__dict__["idiomas"] = None |
175 |
|
|
176 |
self.siguiente = None |
self.siguiente = None |
177 |
self.anterior = None |
self.anterior = None |
178 |
self.inventario = [] |
self.inventario = [] |
179 |
self.equipo = [] |
self.equipo = [] |
180 |
self.salas_visitadas = {} |
self.salas_visitadas = {} |
181 |
|
|
182 |
# Dos opciones según el personaje venga ya controlado o no |
from personajejugador import PersonajeJugador |
|
if self.controlador == None: |
|
183 |
|
|
184 |
from mundo import Mundo |
if isinstance(self, PersonajeJugador): |
185 |
from mundo import Mundo_localizar_sala |
# Dos opciones según el personaje venga ya controlado o no |
186 |
|
if self.controlador == None: |
|
# No controlado: arranca en el limbo y la sala pedida |
|
|
# se guarda para cuando alguien lo saque |
|
|
self.id_sala_original = sala.id |
|
|
|
|
|
self.__dict__["sala"] = Mundo_localizar_sala(Mundo.ID_SALA_LIMBO) |
|
|
self.sala.entrar_personaje(self) # se asume que el limbo tiene |
|
|
# capacidad de volumen infinita |
|
|
else: |
|
187 |
|
|
188 |
from personajejugador import PersonajeJugador |
from mundo import Mundo |
189 |
from mundo import Mundo_personaje_activado |
from mundo import Mundo_localizar_sala |
190 |
|
|
191 |
# Controlado: se lleva a la sala pedida y se avisa al mundo |
# No controlado: arranca en el limbo y la sala pedida |
192 |
if isinstance(self, PersonajeJugador): |
# se guarda para cuando alguien lo saque |
193 |
Mundo_personaje_activado(self) |
self.id_sala_original = sala.id |
194 |
self.actuar_global(color(35) + self.id + " ha sido creado" + finl) |
|
195 |
|
self.__dict__["sala"] = Mundo_localizar_sala(Mundo.ID_SALA_LIMBO) |
196 |
self.__dict__["sala"] = sala |
self.sala.entrar_personaje(self) # se asume que el limbo tiene |
197 |
for otro_personaje in self.sala.personajes.values(): |
# capacidad de volumen infinita |
198 |
if otro_personaje.controlador != None and otro_personaje.silencio == 'no': |
else: |
199 |
otro_personaje.controlador.entra_personaje(self) |
|
200 |
self.sala.entrar_personaje(self) # se asume que la sala de entrada tiene |
from mundo import Mundo_personaje_activado |
201 |
# capacidad de volumen infinita |
|
202 |
|
# Controlado: se lleva a la sala pedida y se avisa al mundo |
203 |
|
if isinstance(self, PersonajeJugador): |
204 |
|
Mundo_personaje_activado(self) |
205 |
|
self.actuar_global(color(35) + self.id + " ha sido creado" + finl) |
206 |
|
|
207 |
|
self.__dict__["sala"] = sala |
208 |
|
for otro_personaje in self.sala.personajes.values(): |
209 |
|
if otro_personaje.controlador != None and (not isinstance(otro_personaje, PersonajeJugador) or otro_personaje.silencio == 'no'): |
210 |
|
otro_personaje.controlador.entra_personaje(self) |
211 |
|
self.sala.entrar_personaje(self) # se asume que la sala de entrada tiene |
212 |
|
# capacidad de volumen infinita |
213 |
|
|
214 |
|
|
215 |
def __setattr__(self, name, value): |
def __setattr__(self, name, value): |
234 |
self.liberar() |
self.liberar() |
235 |
if self.sala != None: |
if self.sala != None: |
236 |
self.sala.salir_personaje(self) |
self.sala.salir_personaje(self) |
237 |
|
from personajejugador import PersonajeJugador # %% PARCHE!!!! la comprobacion de "silencio" debe hacerse dentro de InterfazPJ, pues solo afecta a PJs. |
238 |
for otro_personaje in self.sala.personajes.values(): |
for otro_personaje in self.sala.personajes.values(): |
239 |
if otro_personaje.controlador != None and otro_personaje.silencio == 'no': |
if otro_personaje.controlador != None and (not isinstance(otro_personaje, PersonajeJugador) or otro_personaje.silencio == 'no'): |
240 |
otro_personaje.controlador.sale_personaje(self, "el vacío") |
otro_personaje.controlador.sale_personaje(self, "el vacío") |
241 |
self.__dict__["sala"] = None |
self.__dict__["sala"] = None |
242 |
|
|
273 |
if isinstance(self, PersonajeNoJugador): |
if isinstance(self, PersonajeNoJugador): |
274 |
|
|
275 |
# PNJ: se crea el controlador al momento |
# PNJ: se crea el controlador al momento |
276 |
controlador = InterfazPNJ() |
self.controlador_automatico() |
|
controlador.personaje = self |
|
277 |
|
|
278 |
else: |
else: |
279 |
|
|
355 |
total += 0 |
total += 0 |
356 |
return total |
return total |
357 |
|
|
358 |
|
def color_texto(self): |
359 |
|
"""Color con el que se muestran los mensajes que dice este personaje""" |
360 |
|
|
361 |
|
base = 0 |
362 |
|
for letra in self.nombre: |
363 |
|
base = base + ord(letra) |
364 |
|
|
365 |
|
from personajenojugador import PersonajeNoJugador |
366 |
|
if isinstance(self, PersonajeNoJugador): |
367 |
|
return chr(27) + "[1;" + str(35) + "m" |
368 |
|
return color(31 + base % 7) |
369 |
|
|
370 |
|
|
371 |
def mover(self, sala, automatico = 0): |
def mover(self, sala, automatico = 0): |
372 |
"""Mover al personaje a otra sala. |
"""Mover al personaje a otra sala. |
373 |
|
|
395 |
if self.anterior != None: |
if self.anterior != None: |
396 |
self.noseguir(); |
self.noseguir(); |
397 |
|
|
398 |
|
from personajejugador import PersonajeJugador |
399 |
|
|
400 |
self.sala.salir_personaje(self) |
self.sala.salir_personaje(self) |
401 |
for otro_personaje in self.sala.personajes.values(): |
for otro_personaje in self.sala.personajes.values(): #%% PARCHE!!!! la comprobacion de "silencio" debe hacerse dentro de InterfazPJ, pues solo afecta a PJs. |
402 |
if otro_personaje.controlador != None and otro_personaje.silencio == 'no': |
if otro_personaje.controlador != None and (not isinstance(otro_personaje, PersonajeJugador) or otro_personaje.silencio == 'no'): |
403 |
otro_personaje.controlador.sale_personaje(self, sala.nombre) |
otro_personaje.controlador.sale_personaje(self, sala.nombre) |
404 |
|
|
405 |
self.__dict__["sala"] = sala |
self.__dict__["sala"] = sala |
406 |
|
|
407 |
for otro_personaje in self.sala.personajes.values(): |
for otro_personaje in self.sala.personajes.values(): |
408 |
if otro_personaje.controlador != None and otro_personaje.silencio == 'no': |
if otro_personaje.controlador != None and (not isinstance(otro_personaje, PersonajeJugador) or otro_personaje.silencio == 'no'): |
409 |
otro_personaje.controlador.entra_personaje(self) |
otro_personaje.controlador.entra_personaje(self) |
410 |
self.sala.entrar_personaje(self) |
self.sala.entrar_personaje(self) |
411 |
|
|
488 |
from mundo import Mundo |
from mundo import Mundo |
489 |
from mundo import Mundo_localizar_sala |
from mundo import Mundo_localizar_sala |
490 |
from mundo import Mundo_personaje_activado |
from mundo import Mundo_personaje_activado |
491 |
|
from mundo import Mundo_personaje_desactivado |
492 |
from personajejugador import PersonajeJugador |
from personajejugador import PersonajeJugador |
493 |
|
|
494 |
escribir("Trayendo desde el limbo a " + self.id) |
if isinstance(self, PersonajeJugador): |
495 |
|
escribir("Trayendo desde el limbo a " + self.id) |
|
id_sala_original = self.id_sala_original |
|
496 |
|
|
497 |
try: |
id_sala_original = self.id_sala_original |
498 |
|
|
499 |
# Aquí tengo un dilema gordo: en teoría debería comprobar el volumen ocupado de la |
try: |
|
# sala y no dejarle entrar si está llena. Pero es una putada que alguien no pueda |
|
|
# recuperar su personaje porque en la sala donde lo dejó ha entrado un montón de |
|
|
# gente. Como será un caso muy poco frecuente, haremos la vista gorda y permitiremos |
|
|
# que haya más gente en la sala de la que cabe, espero que no falle nada (durará |
|
|
# sólo un ratito hasta que alguien salga)... |
|
|
self.mover(Mundo_localizar_sala(self.id_sala_original)) |
|
|
del self.id_sala_original |
|
|
|
|
|
self.controlador = controlador |
|
|
|
|
|
if isinstance(self, PersonajeJugador): |
|
|
Mundo_personaje_activado(self) |
|
|
self.actuar_global(color(35) + self.id + " ha entrado en Minë" + finl) |
|
500 |
|
|
501 |
except: |
# Aquí tengo un dilema gordo: en teoría debería comprobar el volumen ocupado de la |
502 |
# Si casca algo, volvemos al limbo |
# sala y no dejarle entrar si está llena. Pero es una putada que alguien no pueda |
503 |
self.id_sala_original = id_sala_original |
# recuperar su personaje porque en la sala donde lo dejó ha entrado un montón de |
504 |
self.mover(Mundo_localizar_sala(Mundo.ID_SALA_LIMBO)) # se asume que el limbo tiene |
# gente. Como será un caso muy poco frecuente, haremos la vista gorda y permitiremos |
505 |
self.controlador = None # capacidad de volumen infinita |
# que haya más gente en la sala de la que cabe, espero que no falle nada (durará |
506 |
if isinstance(self, PersonajeJugador): |
# sólo un ratito hasta que alguien salga)... |
507 |
Mundo_personaje_desactivado(self) |
self.mover(Mundo_localizar_sala(self.id_sala_original)) |
508 |
|
del self.id_sala_original |
509 |
|
|
510 |
|
self.controlador = controlador |
511 |
|
|
512 |
|
if isinstance(self, PersonajeJugador): |
513 |
|
Mundo_personaje_activado(self) |
514 |
|
self.actuar_global(color(35) + self.id + " ha entrado en Minë" + finl) |
515 |
|
|
516 |
|
except: |
517 |
|
# Si casca algo, volvemos al limbo |
518 |
|
self.id_sala_original = id_sala_original |
519 |
|
self.mover(Mundo_localizar_sala(Mundo.ID_SALA_LIMBO)) # se asume que el limbo tiene |
520 |
|
self.controlador = None # capacidad de volumen infinita |
521 |
|
if isinstance(self, PersonajeJugador): |
522 |
|
Mundo_personaje_desactivado(self) |
523 |
|
else: |
524 |
|
self.controlador = controlador |
525 |
|
|
526 |
|
|
527 |
def seguir(self, lider): |
def seguir(self, lider): |
528 |
"""Entrar en una compañía, siguiendo a otro personaje que hace de lider. |
"""Entrar en una compañía, siguiendo a otro personaje que hace de lider. |
632 |
def describir(self, accion): |
def describir(self, accion): |
633 |
"""Muestra lo que hace el personaje, de forma que lo vean los que estan en la sala.""" |
"""Muestra lo que hace el personaje, de forma que lo vean los que estan en la sala.""" |
634 |
if self.sala != None: |
if self.sala != None: |
635 |
|
from personajejugador import PersonajeJugador # %% PARCHE!!!! la comprobacion de "silencio" debe hacerse dentro de InterfazPJ, pues solo afecta a PJs. |
636 |
for personaje in [ p for p in self.sala.personajes.values() |
for personaje in [ p for p in self.sala.personajes.values() |
637 |
if p != self and p.controlador != None and p.silencio == "no"]: |
if p != self and p.controlador != None and (not isinstance(p, PersonajeJugador) or p.silencio == "no")]: |
638 |
personaje.controlador.describir_entorno(accion) |
personaje.controlador.describir_entorno(accion) |
639 |
|
|
640 |
|
|
641 |
def actuar_global(self, accion): |
def actuar_global(self, accion): |
642 |
"""Muestra lo que hace el personaje, de forma que lo vean todos los jugadores conectados.""" |
"""Muestra lo que hace el personaje, de forma que lo vean todos los jugadores conectados.""" |
643 |
from mundo import Mundo |
from mundo import Mundo |
644 |
|
from personajejugador import PersonajeJugador # %% PARCHE!!!! la comprobacion de "silencio" debe hacerse dentro de InterfazPJ, pues solo afecta a PJs. |
645 |
for sala in Mundo.salas: |
for sala in Mundo.salas: |
646 |
for personaje in [ p for p in sala.personajes.values() |
for personaje in [ p for p in sala.personajes.values() |
647 |
if p != self and p.controlador != None and p.silencio == "no"]: |
if p != self and p.controlador != None and (not isinstance(p, PersonajeJugador) or p.silencio == "no")]: |
648 |
personaje.controlador.actua_global_personaje(self, accion) |
personaje.controlador.actua_global_personaje(self, accion) |
649 |
|
|
650 |
|
|
675 |
def gritar(self, mensaje, idioma=None): |
def gritar(self, mensaje, idioma=None): |
676 |
"""Dice un texto en voz muy alta de forma que lo oigan todos los jugadores conectados.""" |
"""Dice un texto en voz muy alta de forma que lo oigan todos los jugadores conectados.""" |
677 |
from mundo import Mundo |
from mundo import Mundo |
678 |
|
from personajejugador import PersonajeJugador # %% PARCHE!!!! la comprobacion de "silencio" debe hacerse dentro de InterfazPJ, pues solo afecta a PJs. |
679 |
for sala in Mundo.salas: |
for sala in Mundo.salas: |
680 |
for personaje in [ p for p in sala.personajes.values() |
for personaje in [ p for p in sala.personajes.values() |
681 |
if p != self and p.controlador != None and p.silencio == "no"]: |
if p != self and p.controlador != None and (not isinstance(p, PersonajeJugador) or p.silencio == "no")]: |
682 |
msg_f = self.mensaje_filtrado(mensaje, idioma, personaje) |
msg_f = self.mensaje_filtrado(mensaje, idioma, personaje) |
683 |
personaje.controlador.grita_personaje(self, msg_f) |
personaje.controlador.grita_personaje(self, msg_f) |
684 |
|
|