from abc import ABC, abstractmethod from typing import override class Unit(ABC): def __init__(self, strength: float, dexterity: float, constitution: float, wisdom: float, intelligence: float, charisma: float): self.strength: float = strength self.dexterity: float = dexterity self.constitution: float = constitution self.wisdom: float = wisdom self.intelligence: float = intelligence self.charisma: float = charisma @abstractmethod def calculate_max_health(self) -> float: pass @abstractmethod def calculate_damage(self) -> float: pass @abstractmethod def calculate_defense(self) -> float: pass # class Spell(ABC): # def __init__(self, name: str, damage: float, mana_cost: float): # self.name: str = name # self.damage: float = damage # self.mana_cost: float = mana_cost # @abstractmethod # def cast(self): # pass class Monster(Unit): def __init__(self, strength: float, dexterity: float, constitution: float, wisdom: float, intelligence: float, charisma: float): super().__init__(strength, dexterity, constitution, wisdom, intelligence, charisma) self.max_health: float = self.calculate_max_health() self.defense: float = self.calculate_max_health() self.damage: float = self.calculate_damage() @override def calculate_damage(self): return self.strength * 2 + self.constitution / 5 @override def calculate_max_health(self): return self.constitution * 8 + self.strength / 3 @override def calculate_defense(self): return self.constitution * 1.2 + self.strength / 5 class Character(Unit): def __init__(self, strength: float, dexterity: float, constitution: float, wisdom: float, intelligence: float, charisma: float, char_class: str): super().__init__(strength, dexterity, constitution, wisdom, intelligence, charisma) self.character_class: str = char_class self.max_health: float = self.calculate_max_health() self.defense: float = self.calculate_max_health() self.damage: float = self.calculate_damage() # self.max_mana: float = self.calculate_max_mana() @override def calculate_max_health(self): return self.constitution * 10 + self.strength / 2 @override def calculate_damage(self) -> float: if self.character_class == "warrior": return self.strength * 2.2 + self.constitution / 3 elif self.character_class == "mage": return self.intelligence * 2.5 + self.wisdom / 2 elif self.character_class == "hunter": return self.dexterity * 1.9 + self.strength / 3 else: return 0 @override def calculate_defense(self): if self.character_class == "warrior": return self.constitution * 1.8 + self.strength / 4 elif self.character_class == "mage": return self.wisdom * 1.3 + self.intelligence / 6 elif self.character_class == "hunter": return self.dexterity * 1.6 + self.constitution / 5 else: return 0 # def calculate_max_mana(self): # if self.character_class == "warrior": # return self.intelligence + self.strength // 2 # elif self.character_class == "mage": # return self.wisdom * 3 + self.intelligence # elif self.character_class == "hunter": # return self.dexterity * 1.5 + self.wisdom // 2 # else: # return 0