Module RPG.utilities.display

Classes

class Display

Classe qui gère l'affichage

Expand source code
class Display:
    """
    Classe qui gère l'affichage
    """
    def __init__(self) -> None:
        # system('mode con: cols=2000 lines=300')
        self.get_key = lambda: inputs.Input.get_keyboard_input()
        self.wait = lambda: inputs.Input.wait_input()
        self.clear = lambda: system('cls||clear')
        self.console = Console()

    def print(self, string: str, style: str | None = None, justify: str | None = None) -> None:
        """
        Permet d'afficher du texte à l'écran
        """
        self.console.print(string, style=style, highlight=False, justify=justify)

    def menu(self, actions: list, text: str | None = None, info: str | None = None) -> str:
        """
        Crée un menu avec les arguments donnés
        """

        assert actions != [] and type(actions) == list, 'Specified list of actions is not valid'

        cursor = 0
        key = None
        while key != 'enter':
            self.clear()
            if text != None:
                self.print(text)
            if info != None:
                self.print(info)
            cursor = cursor%len(actions)
            for i, e in enumerate(actions):
                if cursor == i:
                    self.console.print('\u2192 ' + e, justify='left')
                else:
                    self.console.print('  ' + e, justify='left')

            key = self.get_key()
            if key == 'haut':
                cursor -= 1
                if cursor<0:
                    cursor = len(actions) - 1
            elif key == 'bas':
                cursor += 1
        input()
        return actions[cursor%len(actions)]
    
    def get_healthbar(self, other: object, number: int | None = None) -> str:
        """
        Retourne une chaine de caractère représentant l'affichage du personnage et sa vie
        """
        namecolor = 'green' if other.isplayer else 'bright_red'
        pvcolor = "bright_green" if other.pv > 50/100*other.maxpv else "orange3" if other.pv > 20/100*other.maxpv else "bright_red"
        bar_length = 30
        fullbarlength = round(other.pv / other.maxpv * bar_length)
        return f'[bold {namecolor}]{other.name}[/bold {namecolor}] {f"({number+1})" if number != None else ""} {(22 - len(other.name)) * " " if number != None else (25 - len(other.name)) * " "} [gold1]Lvl. {other.lvl}[/gold1] [green on green]{fullbarlength * " "}[/green on green][grey19 on grey19]{(bar_length - fullbarlength) * " "}[/grey19 on grey19] [bold {pvcolor}]{other.pv}[/bold {pvcolor}]/[bold white]{other.maxpv}[/bold white]'
    
    def get_multiple_healthbars(self, player: object, enemies: tuple) -> str:
        """
        Retourne une chaine de ccaractère avec les barres de vie du joueur et des ennemis
        """
        string = self.get_healthbar(player) + "\n\n"
        for i, e in enumerate(enemies):
            string += self.get_healthbar(e, i if len(enemies)>1 else None) + "\n\n"
        return  string
    
    def get_title(self, title: str) -> str:
        """
        Construit une chaine de caractère: un titre entouré
        """
        horizontalch = "\u2500"
        maintitle = "\u250c"
        for i in range(len(title)+4):
            maintitle += horizontalch
        maintitle += "\u2510\n"
        maintitle += "\u2502  "
        maintitle += title
        maintitle += "  \u2502\n"
        maintitle += "\u2514"
        for i in range(len(title)+4):
            maintitle += horizontalch
        maintitle += "\u2518\n"
        return maintitle
    
    def get_xpbar(self, player: object) -> str:
        """
        Retourne une chaine de caractères représentant une barre d'expérience
        """
        length = 30
        fullbarlength = round(player.xp / player.maxxp * length) if player.xp <= player.maxxp else length
        color = "gold3" if player.xp >= 75/100 * player.maxxp else "light_goldenrod3" if player.xp >= 50/100 * player.maxxp else "tan" if player.xp >= 25/100 * player.maxxp else "misty_rose3"
        return f":sparkler:  [underline bold gold1]XP[/underline bold gold1] [{color} on {color}]{fullbarlength * ' '}[/{color} on {color}][grey19 on grey19]{(length - fullbarlength) * ' '}[/grey19 on grey19] [bold gold1]{player.xp}/{player.maxxp}[/bold gold1]"
    
    def get_map(self, region: list, currentzone: object) -> str:
        """
        Retourne une chaine de caractère représentant une carte avec la position du joueur
        """
        string = 'Vous : [bold green]O[/bold green]\n\n'
        string += ('\u250c' + '\u2500'*3 + '\u2510' + '  ') * 5 + '\n'
        for i, e in enumerate(region):
            string += ('\u2502' + (' [bold green]O[/bold green] ' if e == currentzone else '   ') + '\u2502' + (' \u2192' if i < len(region)-1 else ''))
        string += '\n' + ('\u2514' + '\u2500'*3 + '\u2518' + '  ') * 5 + '\n'
        string += 'Niv5   Niv15  Niv25  Niv35  Niv45  Boss\n'
        return string
    
    def get_quests(self, quests: dict) -> str:
        """
        Retourne une chaine de caractère permettant d'afficher lkes quêtes du joueur
        """
        string = ''
        for i, e in enumerate(quests.keys()):
            style = 'bold green' if quests[e][1] >= quests[e][2] else 'bold bright_red'
            string += f'[{style}]Quête {i+1}: {quests[e][0]} ({quests[e][1]}/{quests[e][2]})[/{style}]\n'
        return string

Methods

def get_healthbar(self, other: object, number: int | None = None) ‑> str

Retourne une chaine de caractère représentant l'affichage du personnage et sa vie

def get_map(self, region: list, currentzone: object) ‑> str

Retourne une chaine de caractère représentant une carte avec la position du joueur

def get_multiple_healthbars(self, player: object, enemies: tuple) ‑> str

Retourne une chaine de ccaractère avec les barres de vie du joueur et des ennemis

def get_quests(self, quests: dict) ‑> str

Retourne une chaine de caractère permettant d'afficher lkes quêtes du joueur

def get_title(self, title: str) ‑> str

Construit une chaine de caractère: un titre entouré

def get_xpbar(self, player: object) ‑> str

Retourne une chaine de caractères représentant une barre d'expérience

def menu(self, actions: list, text: str | None = None, info: str | None = None) ‑> str

Crée un menu avec les arguments donnés

def print(self, string: str, style: str | None = None, justify: str | None = None) ‑> None

Permet d'afficher du texte à l'écran