from random import randint from enum import Enum from graphics.engine import Screen from graphics.layers import Sprite class StatsSet: #HP, ATK, DEF, INITIATIVE, XPCOEF def __init__(self, hp, atkP, defP, initiative, xpcoef): self.hp = hp self.atkP = atkP self.defP = defP self.initiative = initiative self.xpcoef = xpcoef class ClassType(Enum): GUERRIER = StatsSet(20, 10, 15, 5, 8) MAGICIEN = StatsSet(15, 15, 6, 5, 7) VOLEUR = StatsSet(9, 30, 9, 7, 9) ELFE = StatsSet(13, 22, 1, 5, 10) class Personnage: def __init__(self, nom, class_type, place): self.nom = nom self.class_name = class_type.name self.class_type = class_type.value self.__xp = 1 self.potions = [Item(Material.POTION, 10)] self.arme = Item(*ClassItem[self.class_name].value) self.__hp = self.class_type.hp + self.arme.stats.hp Sprite(3, self.class_name, place) def jet_attaque(self): damage = randint(1, 20) self.change_exp(self.class_type.xpcoef * self.__xp) return damage + self.class_type.initiative + self.arme.stats.initiative def jet_defense(self): damage = randint(1, 20) self.change_exp(self.class_type.xpcoef * self.__xp) return damage + self.class_type.initiative + self.arme.stats.initiative def get_hp(self): return self.__hp def change_hp(self, nb_hp): if self.__hp - nb_hp < 0: self.__hp = 0 elif self.__hp - nb_hp > self.class_type.hp + self.arme.stats.hp: self.__hp = self.class_type.hp + self.arme.stats.hp else: self.__hp -= nb_hp def get_xp(self): return self.__xp def change_exp(self, nb_exp): if nb_exp > 0: self.__xp += nb_exp else: raise ValueError("nb_exp attends un nombre positif") def affiche_caracteristiques(self): return (f"Nom: {self.nom}", f"Type de classe: {self.class_name}", f"Vie: {self.__hp}", f"Expérience: {self.__xp}", "Stats (classe + inventaire):", f"- HP: {self.class_type.hp} + {self.arme.stats.hp}", f"- ATK%: {self.class_type.atkP} + {self.arme.stats.atkP}", f"- DEF%: {self.class_type.defP} + {self.arme.stats.defP}", f"- INITIATIVE: {self.class_type.initiative} + {self.arme.stats.initiative}", f"- XPCOEF: {self.class_type.xpcoef} + {self.arme.stats.xpcoef}" ) def reduced_stats(self): return(f"Ennemi: {self.nom}", f"Type: {self.class_name}", f"Vie: {self.__hp}" ) class Item(): def __init__(self, material, stats: int | StatsSet, meta=None): self.material = material self.meta = material.value if meta == None else meta self.stats = stats class ItemMeta: def __init__(self, name, description): self.name = name self.description = description class Material(Enum): POTION = ItemMeta("Potion", "TODO") EPEE = ItemMeta("Épée", "TODO") BATON = ItemMeta("Bâton", "TODO") DAGUE = ItemMeta("Dague", "TODO") ARC = ItemMeta("Arc", "TODO") class ClassItem(Enum): #HP, ATK, DEF, INITIATIVE, XPCOEF GUERRIER = (Material.EPEE, StatsSet(3, 5, 2, 6, 0)) MAGICIEN = (Material.BATON, StatsSet(8, 1, 2, 3, 0)) VOLEUR = (Material.DAGUE, StatsSet(1, 9, 1, 1, 0)) ELFE = (Material.ARC, StatsSet(4, 2, 5, 3, 0))