158 lines
5.4 KiB
Python
158 lines
5.4 KiB
Python
# roomUI
|
|
|
|
from models.heroes.hero import Hero
|
|
from models.heroes.monster import Monster
|
|
from views.PVE.chooseMonstersUI import ChooseMonstersUI
|
|
|
|
from sty import fg
|
|
from random import randint
|
|
|
|
# pour éviter les pb d'import circulaire
|
|
from typing import TYPE_CHECKING
|
|
|
|
if TYPE_CHECKING:
|
|
from controllers.PveController import PveController
|
|
|
|
|
|
class RoomUI:
|
|
def __init__(
|
|
self,
|
|
pveController: "PveController",
|
|
difficulty: int,
|
|
heroes: list[Hero],
|
|
) -> None:
|
|
self.pveController = pveController
|
|
self.difficulty = difficulty
|
|
self.heroes = heroes
|
|
self.monsters: list[Monster] = None
|
|
|
|
if self.heroes:
|
|
print("Monsters creation")
|
|
for i in range(0, 3):
|
|
self.monsters = ChooseMonstersUI(
|
|
pveController, difficulty, True
|
|
).monsters
|
|
print(f"{self.monsters[i].name} join the room")
|
|
|
|
monster_name = [monster.name for monster in self.monsters]
|
|
print(f"Here your new ennemis: {(", ".join(monster_name)).strip()}")
|
|
|
|
while self.heroes and self.monsters:
|
|
self.fight(self.heroes, self.monsters)
|
|
|
|
for monster in self.monsters:
|
|
if monster.HP < 0:
|
|
self.monsters.remove(monster)
|
|
|
|
if self.monsters:
|
|
self.fight(self.monsters, self.heroes, True)
|
|
|
|
for hero in self.heroes:
|
|
if hero.HP < 0:
|
|
self.heroes.remove(hero)
|
|
|
|
if self.heroes:
|
|
print("Congrats ! You passed next room")
|
|
elif self.monsters:
|
|
print(f"You {fg.red}lose{fg.rs}")
|
|
self.pveController.mController.close_game()
|
|
else:
|
|
raise Exception("An error occured")
|
|
|
|
def fight(
|
|
self,
|
|
heroes: list[Hero] | list[Monster],
|
|
opponents: list[Hero] | list[Monster],
|
|
is_ai_turn: bool = False,
|
|
):
|
|
heroes_list_len = len(heroes)
|
|
|
|
if heroes_list_len > 1:
|
|
choice = -1
|
|
while choice < 1 or choice > heroes_list_len:
|
|
if is_ai_turn:
|
|
choice = randint(1, heroes_list_len + 1)
|
|
else:
|
|
print("Who will attack?")
|
|
for i in range(0, heroes_list_len):
|
|
hero = heroes[i]
|
|
print(
|
|
f"{i+1} - {hero.name} | {hero.attack_power} {fg.red}Att{fg.rs} | {hero.defense} {fg.li_magenta}Blo{fg.rs} | {hero.HP}{fg.green} HP{fg.rs}"
|
|
)
|
|
|
|
try:
|
|
choice = int(input("Give your choice: "))
|
|
except ValueError:
|
|
print(f"{fg.red}Input a valid number{fg.rs}")
|
|
continue
|
|
|
|
if choice < 1 or choice > heroes_list_len:
|
|
print(f"{fg.red}Invalid choice. Try again{fg.rs}")
|
|
|
|
choosen_hero = heroes[choice - 1]
|
|
print(f"{choosen_hero.name} will attack")
|
|
else:
|
|
choosen_hero = heroes[0]
|
|
|
|
opponents_list_len = len(opponents)
|
|
|
|
choice = -1
|
|
while choice < 1 or choice > opponents_list_len:
|
|
if is_ai_turn:
|
|
choice = randint(1, opponents_list_len + 1)
|
|
else:
|
|
print("Who do you want to attack?")
|
|
for i in range(0, opponents_list_len):
|
|
opponent = opponents[i]
|
|
print(
|
|
f"{i+1} - {opponent.name} | {opponent.attack_power} {fg.red}Att{fg.rs} | {opponent.defense} {fg.li_magenta}Blo{fg.rs} | {opponent.HP} {fg.green}HP{fg.rs}"
|
|
)
|
|
|
|
try:
|
|
choice = int(input("Give your choice: "))
|
|
except ValueError:
|
|
print(f"{fg.red}Input a valid number{fg.rs}")
|
|
continue
|
|
|
|
if choice < 1 or choice > opponents_list_len:
|
|
print(f"{fg.red}Invalid choice. Try again{fg.rs}")
|
|
|
|
choosen_opponent = opponents[choice - 1]
|
|
print(f"{choosen_hero.name} attacks {choosen_opponent.name}")
|
|
|
|
self.attacks(choosen_hero, choosen_opponent, is_ai_turn)
|
|
|
|
def attacks(self, hero: Hero, opponent: Monster, is_ai_turn: bool):
|
|
|
|
attacks_list = hero.attacks_choice
|
|
len_attack_list = len(attacks_list)
|
|
|
|
choice = -1
|
|
while choice < 1 or choice > len_attack_list:
|
|
if is_ai_turn:
|
|
choice = randint(1, len_attack_list + 1)
|
|
else:
|
|
print("Choose an attack")
|
|
for i in range(0, len_attack_list):
|
|
print(f"{i+1} - {attacks_list[i]}")
|
|
|
|
try:
|
|
choice = int(input("Give your choice: "))
|
|
except ValueError:
|
|
print(f"{fg.red}Input a valid number{fg.rs}")
|
|
continue
|
|
|
|
if choice < 1 or choice > len_attack_list:
|
|
print(f"{fg.red}Invalid choice. Try again{fg.rs}")
|
|
|
|
print(f"You choose {attacks_list[choice-1]}")
|
|
|
|
if choice == 1:
|
|
opponent.HP -= hero.attacks(opponent)
|
|
elif choice == 2:
|
|
hero.HP = hero.cure()
|
|
|
|
if opponent.HP > 0:
|
|
print(f"{opponent.name}: {opponent.HP} {fg.green}HP{fg.rs}")
|
|
else:
|
|
print(f"{opponent.name} is {fg.red}dead{fg.rs}")
|