def regarder(self, personnage): """personnage regarde self.""" self.script["regarde"]["avant"].executer(personnage=personnage, pnj=self) Personnage.regarder(self, personnage) self.script["regarde"]["après"].executer(personnage=personnage, pnj=self)
def mourir(self, adversaire=None, recompenser=True): """La mort d'un PNJ signifie sa destruction.""" try: self.script["meurt"]["avant"].executer(pnj=self, salle=self.salle, adversaire=adversaire) except InterrompreCommande: Personnage.mourir(self, adversaire=adversaire, recompenser=recompenser) else: Personnage.mourir(self, adversaire=adversaire, recompenser=recompenser) self.script["meurt"]["apres"].executer(pnj=self, salle=self.salle, adversaire=adversaire) cadavre = importeur.objet.creer_objet(importeur.objet.prototypes[ "cadavre"]) cadavre.pnj = self.prototype self.salle.objets_sol.ajouter(cadavre) importeur.hook["pnj:meurt"].executer(self, adversaire) # Gain d'XP if adversaire and self.gain_xp and recompenser: xp = importeur.perso.gen_niveaux.grille_xp[self.niveau][1] xp = xp * self.gain_xp / 100 adversaire.gagner_xp("combat", xp) importeur.pnj.supprimer_PNJ(self.identifiant)
def detruire(self): """Destruction du PNJ.""" self.decontroller() Personnage.detruire(self) if self in self.prototype.pnj: self.prototype.pnj.remove(self) if self.salle_origine: self.salle_origine.det_pnj(self)
def tick(self): """Méthode appelée à chaque tick.""" Personnage.tick(self) try: self.script["tick"].executer(pnj=self) except Exception: pass importeur.hook["pnj:tick"].executer(self)
def __init__(self, prototype, salle=None): """Constructeur du PNJ""" Personnage.__init__(self) self._nom = "" self.prototype = prototype self.salle = salle self.salle_origine = salle self.controle_par = None self.instance_connexion = None if salle: salle.pop_pnj(self) if prototype: prototype.no += 1 self.identifiant = prototype.cle + "_" + str( prototype.no) prototype.pnj.append(self) # On copie les attributs propres à l'objet # Ils sont disponibles dans le prototype, dans la variable # _attributs # C'est un dictionnaire contenant en clé le nom de l'attribut # et en valeur le constructeur de l'objet for nom, val in prototype._attributs.items(): setattr(self, nom, val.construire(self)) # On force l'écriture de la race self.race = prototype.race for stat in prototype.stats: t_stat = getattr(self.stats, "_{}".format(stat.nom)) t_stat.defaut = stat.defaut t_stat.courante = stat.defaut self.stats.restaurer() self.lier_equipement(prototype.squelette) self.genre = prototype.genre self.talents.update(prototype.talents) self.sorts.update(prototype.sorts) # Copie de l'équipement for membre, p_objet in prototype.equipement.items(): if self.equipement.squelette.a_membre(membre): objet = importeur.objet.creer_objet(p_objet) self.equipement.equiper_objet(membre, objet) # On force l'écriture du niveau self.niveau = prototype.niveau
def gagner_xp(self, niveau=None, xp=0, retour=True): """Fait gagner de l'XP au personnage.""" ancien_niveau = self.niveau res = Personnage.gagner_xp(self, niveau, xp, retour) importeur.hook["pnj:gagner_xp"].executer(self, niveau, xp, retour) if self.niveau > ancien_niveau: importeur.hook["pnj:gagner_niveau"].executer(self, self.niveau) return res
def get_nom_etat(self, personnage, nombre=1): """Retourne le nom et l'état (singulier ou pluriel).""" if nombre == 1: nom = self.get_nom_pour(personnage) + " " if self.etats: nom += Personnage.get_etat(self) else: nom += self.etat_singulier return nom else: return str(nombre) + " " + self.nom_pluriel + " " + \ self.etat_pluriel
def __getattr__(self, nom_attr): """Si le nom d'attribut n'est pas trouvé, le chercher dans le prototype """ if nom_attr == "prototype": return object.__getattr__(self, nom_attr) else: try: return Personnage.__getattr__(self, nom_attr) except AttributeError: return getattr(self.prototype, nom_attr)
def __init__(self): """Constructeur du joueur""" Personnage.__init__(self) self.nom_groupe = type(self).importeur.joueur.groupe_par_defaut self.compte = None self.instance_connexion = None self.connecte = False self.garder_connecte = False self.afk = "" self.retenus = {} self.distinction_visible = "" self.distinction_audible = "" self.no_tick = 1 self.alias_francais = {} self.alias_anglais = {} self.tips = importeur.information.cfg_info.tips self.creation = datetime.now() self.derniere_connexion = None self.adresse_ip = "inconnue" self.cpt_mort = 0 self.description = Description(parent=self, scriptable=False) self.description_a_valider = Description(parent=self, scriptable=False) self.description_modifiee = False self.pk = False
def get_structure(self): """Retourne la structure simple du personnage.""" d = self.creation creation = importeur.temps.variable creation.changer_IRL(d.year, d.month, d.day, d.hour, d.minute) d = self.derniere_connexion if d is not None: connexion = importeur.temps.variable connexion.changer_IRL(d.year, d.month, d.day, d.hour, d.minute) else: connexion = None structure = Personnage.get_structure(self) structure.nom = self.nom structure.creation = creation structure.derniere_connexion = connexion return structure
def appliquer_structure(self, structure): """Applique la structure passée en paramètre.""" Personnage.appliquer_structure(self, structure) for cle, valeur in structure.donnees.items(): if cle == "nom": importeur.joueur.renommer_joueur(self, valeur)
def mourir(self, adversaire=None, recompenser=True): Personnage.mourir(self, adversaire, recompenser) self.cpt_mort = 0
def tick(self): """Méthode appelée à chaque tick.""" if self.instance_connexion: self.instance_connexion.envoyer_options("hello") if self.afk: return if self.est_mort(): self.cpt_mort += 1 if self.cpt_mort <= 12: return else: self.etats.vider() self.stats.vitalite = 1 self.soif = 0 self.faim = 0 self.estomac = 0 self.envoyer("Vous reprenez lentement conscience, vous " \ "sentant encore très faible.") self.cpt_mort = 0 Personnage.tick(self) # Faim et soif if self.soif < 100: self.soif += 1 / 6 if self.faim < 100: self.faim += 1 / 9 if self.estomac > 0: self.estomac -= 0.1 msg_soif = [ (20, ("Vous avez soif.", 0)), (60, ("La soif vous assèche le gosier.", 0)), (80, ("Votre gorge asséchée vous fait souffrir le martyre.", 5)), (95, ("Votre vision se trouble sous l'effet de la déshydratation.", 20)), ] msg_faim = [ (20, ("Vous avez faim.", 0)), (40, ("Votre estomac gargouille avec insistance.", 0)), (60, ("La faim vous noue douloureusement le ventre.", 0)), (80, ("Votre ventre proteste violemment.", 0)), (90, ("Vous souffrez horriblement de la faim.", 3)), (98, ("Des visions de banquets croulant sous la nourriture vous " \ "assaillent...", 20)), ] if not self.est_immortel(): if self.soif >= 100: self << "Vous mourez de soif." self.mourir() return if self.faim >= 100: self << "Vous mourez de faim." self.mourir() return for seuil, msg in reversed(msg_soif): if self.soif >= seuil: self.instance_connexion.sans_prompt() self.instance_connexion.envoyer(msg[0], nl=1) try: self.vitalite -= msg[1] except DepassementStat: self << "Vous mourez de soif." self.mourir() return break for seuil, msg in reversed(msg_faim): if self.faim >= seuil: self.instance_connexion.sans_prompt() self.instance_connexion.envoyer(msg[0], nl=1) try: self.vitalite -= msg[1] except DepassementStat: self << "Vous mourez de faim." self.mourir() return break
def tick(self): """Méthode appelée à chaque tick.""" if self.afk: return if self.est_mort(): self.cpt_mort += 1 if self.cpt_mort <= 12: return else: self.etats.vider() self.stats.vitalite = 1 self.soif = 0 self.faim = 0 self.estomac = 0 self.envoyer("Vous reprenez lentement conscience, vous " \ "sentant encore très faible.") self.cpt_mort = 0 Personnage.tick(self) # Faim et soif if self.soif < 100: self.soif += 1/6 if self.faim < 100: self.faim += 1/9 if self.estomac > 0: self.estomac -= 0.1 msg_soif = [ (20, ("Vous avez soif.", 0)), (60, ("La soif vous assèche le gosier.", 0)), (80, ("Votre gorge asséchée vous fait souffrir le martyre.", 5)), (95, ("Votre vision se trouble sous l'effet de la déshydratation.", 20)), ] msg_faim = [ (20, ("Vous avez faim.", 0)), (40, ("Votre estomac gargouille avec insistance.", 0)), (60, ("La faim vous noue douloureusement le ventre.", 0)), (80, ("Votre ventre proteste violemment.", 0)), (90, ("Vous souffrez horriblement de la faim.", 3)), (98, ("Des visions de banquets croulant sous la nourriture vous " \ "assaillent...", 20)), ] if not self.est_immortel(): if self.soif >= 100: self << "Vous mourez de soif." self.mourir() return if self.faim >= 100: self << "Vous mourez de faim." self.mourir() return for seuil, msg in reversed(msg_soif): if self.soif >= seuil: self.instance_connexion.sans_prompt() self.instance_connexion.envoyer(msg[0], nl=1) try: self.vitalite -= msg[1] except DepassementStat: self << "Vous mourez de soif." self.mourir() return break for seuil, msg in reversed(msg_faim): if self.faim >= seuil: self.instance_connexion.sans_prompt() self.instance_connexion.envoyer(msg[0], nl=1) try: self.vitalite -= msg[1] except DepassementStat: self << "Vous mourez de faim." self.mourir() return break
def gagner_xp(self, niveau=None, xp=0, retour=True): """Fait gagner de l'XP au personnage.""" res = Personnage.gagner_xp(self, niveau, xp, retour) importeur.hook["pnj:gagner_xp"].executer(self, niveau, xp, retour) return res
def tick(self): """Méthode appelée à chaque tick.""" Personnage.tick(self) self.script["tick"].executer(pnj=self) importeur.hook["pnj:tick"].executer(self)