from graphics.colors import Colors from graphics.engine import Layer from graphics.engine import Screen from getkey import keys from re import match class GUI(Layer): """Calque du menu principal""" def __init__(self, z_index): super().__init__(z_index, "gui") self.__current = 0 self.__buttons = ["Attaquer", "Inventaire", "Quitter"] self.__inventaire = False self.handle_keys = False self.__page = 1 def draw(self): super().draw() if self.__inventaire == False: x = 1 for button in self.__buttons: color = (Colors.REDBG, Colors.BLACK) if self.__buttons[self.__current] == button else (Colors.WHITEBG, Colors.BLACK) self.put_string(button, x, self.y-10, color) x += len(button)+1 personnage = Screen.instance.game.personnage if personnage is not None: stats = personnage.affiche_caracteristiques() for i in range(5): self.put_string(stats[i], 1, self.y-8+i, [Colors.RED2]) ennemy = Screen.instance.game.ennemy if ennemy is not None: ennemy_stats = ennemy.affiche_caracteristiques() for i in range(5): self.put_string(ennemy_stats[i], self.x-(self.x-2)//3, self.y-8+i, [Colors.BLUE2]) else: x = 1 for button in self.__buttons: color = (Colors.REDBG, Colors.BLACK) if self.__buttons[self.__current] == button else (Colors.WHITEBG, Colors.BLACK) self.put_string(button, x, self.y-10, color) x += len(button)+1 self.put_string("Votre inventaire:", 1, self.y-8, [Colors.RED2]) stats = Screen.instance.game.personnage.affiche_inventaire() for i in range(len(stats)): self.put_string(stats[i], 1, self.y-7+i, [Colors.RED2]) return self def key_handler(self, key): if key == keys.RIGHT and self.__current < len(self.__buttons)-1: self.__current += 1 elif key == keys.LEFT and self.__current > 0: self.__current -= 1 elif key == keys.ENTER: if self.__inventaire == False: if self.__current == 0: attacker = Screen.instance.game.personnage victim = Screen.instance.game.ennemy Screen.instance.game.attack(attacker, victim) elif self.__current == 1: self.__inventaire = True self.__buttons = ["Retour", "Utiliser une potion"] elif self.__current == 2: raise KeyboardInterrupt else: if self.__current == 0: self.__inventaire = False self.__buttons = ["Attaquer", "Inventaire", "Quitter"] elif self.__current == 1: perso = Screen.instance.game.personnage inv = perso.inventaire if inv.has("POTION"): perso.change_pdv(-10) inv.remove(inv.pop_potion()) class StartPopUp(Layer): """Calque du menu de lancement""" def __init__(self, z_index): super().__init__(z_index, "popup") self.__classes = ["Guerrier", "Magicien", "Voleur", "Elfe"] self.__choosen_class = 0 self.__username = "" self.__missing_un = False def draw(self): super().draw() #bg self.rect(self.x//3, self.y//6, self.x*2//3, self.y//4 + self.y//3, Colors.WHITEBG) #name self.put_string("Nom: (A-z)", self.x//3 + 1, self.y//6 + 1, [Colors.WHITEBG, Colors.BLACK]) self.rect(self.x//3 + 1, self.y//6 + 2, self.x*2//3 - 2, self.y//6 + 2, Colors.REDBG if self.__missing_un else Colors.BLACKBG) self.put_string(self.__username, self.x//3 + 1, self.y//6 + 2, [Colors.WHITE, Colors.BLACKBG]) #Classes self.put_string("Classe perso.: (Flèches)", self.x//3 + 1, self.y//6 + 4, [Colors.WHITEBG, Colors.BLACK]) y = 0 for user_class in self.__classes: colors = [Colors.REDBG, Colors.BLACK] if y == self.__choosen_class else [Colors.GREYBG, Colors.WHITE] self.put_string(user_class, self.x//3 + 2, self.y//6 + 5 + y, colors) y += 1 self.put_string("TAB pour confirmer", self.x//3 + 1, self.y//4 + self.y//3 -1, [Colors.WHITEBG, Colors.BLACK]) return self def key_handler(self, key): if match("[a-zA-Z]", key): self.__username += key elif key == keys.BACKSPACE: self.__username = self.__username[:-1] elif key == keys.UP and self.__choosen_class > 0: self.__choosen_class -= 1 elif key == keys.DOWN and self.__choosen_class < 3: self.__choosen_class += 1 elif key == keys.TAB: if len(self.__username) == 0: self.__missing_un = True return Screen.instance.get_layer("gui").handle_keys = True Screen.instance.del_layer("popup") Screen.instance.game.init_personnage(self.__username, self.__classes[self.__choosen_class]) class PopUp(Layer): """Calque du menu de lancement""" def __init__(self, z_index, message, block=False): super().__init__(z_index, "popup") self.message = message self.block = block Screen.instance.get_layer("gui").handle_keys = False def draw(self): super().draw() self.rect(self.x//3, self.y//6, self.x*2//3, self.y//4 + self.y//3, Colors.WHITEBG) length = (self.x*2//3-1) - (self.x//3+1) x = 0 y = 0 for char in self.message: if char == "\n": x = 0 y += 1 continue self.put_char(char, self.x//3 + 1 + x, self.y//6 + 1 + y, [Colors.WHITEBG, Colors.BLACK]) x += 1 if x == length: x = 0 y += 1 if not self.block: self.put_string("TAB pour confirmer", self.x//3 + 1, self.y//4 + self.y//3 -1, [Colors.WHITEBG, Colors.BLACK]) return self def key_handler(self, key): if key == keys.TAB and not self.block: Screen.instance.get_layer("gui").handle_keys = True Screen.instance.del_layer("popup") class Sprite(Layer): def __init__(self, z_index, sprite_name, personnage_type): super().__init__(z_index, personnage_type) self.personnage_type = personnage_type self.sprite_name = sprite_name def draw(self): super().draw() with open(f"game/sprites/{self.sprite_name}.txt", "r") as sprite: pos = (1, 1) if self.personnage_type == "PLAYER" else (Screen.instance.x*2//3+1, 1) self.put_string(sprite.read(), *pos) def key_handler(self, key): pass