import random, time

class Character:
    def __init__(self, name, hp, attack):
        self.name = name
        self.max_hp = hp
        self.hp = hp
        self.attack_power = attack
    
    def is_alive(self):
        return self.hp > 0
    
    def show(self):
        print(f"{self.name}: {self.hp}/{self.max_hp} HP")
    
    def attack(self, other):
        damage = random.randint(1, self.attack_power)
        other.hp -= damage
        if other.hp < 0:
            other.hp = 0
        print(f"{self.name} zadaje {other.name} {damage} obrażeń!")
        other.show()
        time.sleep(0.5)
        return damage

class Hero(Character):
    def __init__(self, name, level = 1):
        super().__init__(name, hp=100, attack=10)
        self.level = level

    def fight(self, character):
        while self.is_alive() and character.is_alive():
            self.attack(character)
            if character.is_alive():
                character.attack(self)

class Player(Hero):
    def __init__(self, name):
        super().__init__(name, level=1)
        self.exp = 0
        self.inventory = []
    
    def fight(self, character):
        super().fight(character)
        if self.is_alive():
            self.gain_xp(character.exp_reward)
        else:
            print(f"{self.name} pada pokonany przez {character.name}!")

    def gain_xp(self, amount):
        print(f"{self.name} zdobywa {amount} punktów doświadczenia!")
        self.exp += amount
        if self.exp >= self.level * 10:
            self.level_up()

    def level_up(self):
        self.exp -= self.level * 10
        self.level += 1
        self.max_hp += 5
        self.hp = self.max_hp
        print(f"{self.name} awansuje na level {self.level}!")
    
class Monster(Character):
    def __init__(self, name, hp, attack, exp_reward):
        super().__init__(name, hp, attack)
        self.exp_reward = exp_reward

class Goblin(Monster):
    def __init__(self):
        super().__init__("Goblin", hp=15, attack=4, exp_reward=5)

class Orc(Monster):
    def __init__(self):
        super().__init__("Orc", hp=25, attack=5, exp_reward=10)