Module RPG.utilities.fight

Classes

class Combat (player: object, display: object)

Classe qui permet de gérer les combats

Expand source code
class Combat:
    """
    Classe qui permet de gérer les combats
    """
    def __init__(self, player: object, display: object) -> None:
        self.player = player
        self.display = display

    def fight(self, *enemies: object) ->  tuple:
        """
        Gère un combat entre le joueur et les ennemies donnés en arguments
        """
        enemiesalive = True
        slayer = enemies[0]
        while self.player.is_alive() and enemiesalive:
            backed = False
            actions = ['Attack', 'Bag', 'Flee']
            selected = self.display.menu(actions=actions, text=self.display.get_multiple_healthbars(player=self.player, enemies=enemies))
            match selected:
                case 'Attack':
                    availableattacks = list(self.player.attacks.keys())
                    availableattacks.append('Back')
                    selected = self.display.menu(actions=availableattacks, text=self.display.get_multiple_healthbars(player=self.player, enemies=enemies))

                    match selected:
                        case 'Back':
                            backed = True
                    
                        case _:
                            if len(enemies) == 1:
                                self.display.menu(actions=['OK'], text=self.display.get_multiple_healthbars(player=self.player, enemies=enemies), info = f'Vous attaquez {enemies[0].name} avec {selected}!')
                                success = self.player.attack(enemies[0], selected)

                            else:
                                enemieslist = list()
                                for i, e in enumerate(enemies):
                                    if e.is_alive():
                                        enemieslist.append(e.name + ' ({})'.format(i+1))
                                enemieslist.append('Cancel')
                                enemy = self.display.menu(actions=enemieslist, text=self.display.get_multiple_healthbars(player=self.player, enemies=enemies))
                                if enemy != 'Cancel':
                                    self.display.menu(actions=['OK'], text=self.display.get_multiple_healthbars(player=self.player, enemies=enemies), info = f'Vous attaquez {enemies[int(enemy[-2])-1].name} ({enemy[-2]}) avec {selected}!')
                                    success = self.player.attack(enemies[int(enemy[-2])-1], selected)
                                
                                else:
                                    backed = True
                                    success = True
                                    
                            if not success:
                                self.display.menu(actions=['OK'], text=self.display.get_multiple_healthbars(player=self.player, enemies=enemies), info = f'Vous ratez votre attaque!')

                case 'Bag':
                    backed = True

                case 'Flee':
                    return 'flee', self.get_battle_data(enemies=enemies)

            if not backed:
                number = 0
                for i, e in enumerate(enemies):
                    if not e.is_alive():
                        number += 1
                    elif self.player.is_alive():
                        chosen = choice(list(e.attacks.keys()))
                        self.display.menu(actions = ['OK'], text = self.display.get_multiple_healthbars(player=self.player, enemies=enemies), info = f'{e.name} vous attaque avec {chosen}!' if len(enemies) == 1 else f'{e.name} ({i+1}) vous attaque avec {chosen}!')
                        if not e.attack(self.player, chosen):
                            self.display.menu(actions = ['OK'], text = self.display.get_multiple_healthbars(player=self.player, enemies=enemies), info = f'{e.name} rate son attaque!' if len(enemies) == 1 else f'{e.name} ({i+1}) rate son attaque!')
                        elif not self.player.is_alive():
                            slayer = e
                if number == len(enemies):
                    enemiesalive = False
        result = self.lose(self.display.get_multiple_healthbars(player=self.player, enemies=enemies), slayer) if enemiesalive else self.win(self.display.get_multiple_healthbars(player=self.player, enemies=enemies), enemies)
        return result, self.get_battle_data(enemies=enemies)
    
    def win(self, lastbar: str, enemies) -> bool:
        """
        Appelé quand le joueur gagne un combat, permet de calculer les récompenses
        """
        self.display.menu(actions = ['OK'], text = lastbar, info = ':tada: Vous avez gagné le combat!')

        exp = 0
        gold = 0

        for i in enemies:
            if i.name in ('Fallen angel', 'Soul eater'):
                exp += i.lvl * 300
            else:
                exp += i.lvl * 100

        self.display.menu(actions = ['OK'], text = lastbar, info = f':sparkles: [green]Vous[/green] [bold]gagnez[/bold] [bold gold1]{exp} XP[/bold gold1] :sparkler:!')
        self.player.xp += exp
        self.display.menu(actions = ['OK'], text = lastbar, info = self.display.get_xpbar(self.player) + '\n')

        self.player.xp += exp
        while self.player.maxxp <= self.player.xp:
            self.display.menu(actions = ['OK'], text = lastbar, info = f'Vous passez niveau {self.player.lvl + 1}!')
            self.player.lvl += 1
            self.player.xp -= self.player.maxxp
            self.display.menu(actions = ['OK'], text = lastbar, info = self.display.get_xpbar(self.player) + '\n')
        
        return True

    def lose(self, lastbar: str, slayer: object) -> bool:
        """
        Appelé quand le joueur meurt
        """
        self.display.menu(actions = ['OK'], text = lastbar, info = f':skull: Vous avez été terrassé par {slayer.name} Lvl. {slayer.lvl}!')
        return False

    def get_battle_data(self, enemies: tuple) -> tuple:
        """
        A la fin du combat, calcule les dégats et le nombre d'ennemies tués et renvoi les valeurs
        """
        kills = 0
        dmg = 0
        for i in enemies:
            if not i.is_alive():
                kills += 1
                dmg += i.maxpv
            else:
                dmg += i.maxpv - i.pv
        return kills, dmg

Methods

def fight(self, *enemies: object) ‑> tuple

Gère un combat entre le joueur et les ennemies donnés en arguments

def get_battle_data(self, enemies: tuple) ‑> tuple

A la fin du combat, calcule les dégats et le nombre d'ennemies tués et renvoi les valeurs

def lose(self, lastbar: str, slayer: object) ‑> bool

Appelé quand le joueur meurt

def win(self, lastbar: str, enemies) ‑> bool

Appelé quand le joueur gagne un combat, permet de calculer les récompenses