mirror of
https://github.com/DavidGailleton/42-Piscine_Python.git
synced 2026-03-14 05:06:55 +01:00
98 lines
2.7 KiB
Python
98 lines
2.7 KiB
Python
from ex0 import Card
|
|
from ex2 import Combatable
|
|
from .Rankable import Rankable
|
|
from typing import Union
|
|
|
|
|
|
class TournamentCard(Card, Combatable, Rankable):
|
|
def __init__(
|
|
self,
|
|
id: str,
|
|
name: str,
|
|
cost: int,
|
|
rarity: str,
|
|
damage: int,
|
|
health: int,
|
|
shield: int,
|
|
rank: int,
|
|
) -> None:
|
|
super().__init__(name, cost, rarity)
|
|
self.id = id
|
|
self.looses = 0
|
|
self.wins = 0
|
|
self.damage = damage
|
|
self.health = health
|
|
self.shield = shield
|
|
self.rank = rank
|
|
|
|
def play(self, game_state: dict) -> dict:
|
|
try:
|
|
res: dict[str, int | str] = {}
|
|
if game_state["mana"] < 2:
|
|
raise Exception("Not enough mana")
|
|
res["card_played"] = self.name
|
|
res["mana_used"] = 2
|
|
return res
|
|
except Exception as err:
|
|
print(err)
|
|
return {}
|
|
|
|
def attack(self, target: str) -> dict:
|
|
return {
|
|
"attacker": self.name,
|
|
"target": target,
|
|
"damage_dealt": self.damage,
|
|
"combat_type": "melee",
|
|
}
|
|
|
|
def defend(self, incoming_damage: int) -> dict:
|
|
res: dict[str, Union[str, int, bool]] = {}
|
|
res["defender"] = self.name
|
|
if incoming_damage <= self.shield:
|
|
res["damage_blocked"] = incoming_damage
|
|
res["damage_taken"] = 0
|
|
else:
|
|
res["damage_taken"] = incoming_damage - self.shield
|
|
res["damage_blocked"] = self.shield
|
|
self.health -= incoming_damage - self.shield
|
|
res["still_alive"] = self.health > 0
|
|
return res
|
|
|
|
def get_combate_stats(self) -> dict:
|
|
return {
|
|
"damage": self.damage,
|
|
"health": self.health,
|
|
"shield": self.shield,
|
|
}
|
|
|
|
def calculate_rating(self) -> int:
|
|
try:
|
|
if self.wins == 0:
|
|
return self.rank - self.looses * 10
|
|
return self.rank + (int(self.wins / self.looses) * 10)
|
|
except ZeroDivisionError:
|
|
return self.rank + self.wins * 10
|
|
except Exception as err:
|
|
print(err)
|
|
return self.rank
|
|
|
|
def get_tournament_stats(self) -> dict:
|
|
return {
|
|
"Interfaces": "[Card, Combatable, Rankable]",
|
|
"Rating": self.calculate_rating(),
|
|
"Record": f"{self.wins}-{self.looses}",
|
|
}
|
|
|
|
def update_wins(self, wins: int) -> None:
|
|
self.wins = wins
|
|
|
|
def update_losses(self, losses: int) -> None:
|
|
self.looses = losses
|
|
|
|
def get_rank_info(self) -> dict:
|
|
return {
|
|
"wins": self.wins,
|
|
"looses": self.looses,
|
|
"rank": self.rank,
|
|
}
|