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)

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_exp(character.exp_reward)
            print(f"{self.name} zdobywa {character.exp_reward} punktów doświadczenia!")
        else:
            print(f'{self.name} pada pokonany przez {character.name}')

    def gain_exp(self, amount):
        self.exp += amount
        if self.exp >= self.level * 10:
            self.level_up()

    def level_up(self):
        self.level += 1
        self.exp = 0
        self.max_hp += 5
        self.attack_power += 2
        self.hp = self.max_hp
        print(f'{self.name} awansuje na level {self.level}!')

    def use_item(self):
        if not self.inventory:
            print('Nie masz nic w ekwipunku')
            return
        print(f'Inventory: {self.inventory}')
        print(f'(c)ancel')
        item = input('Przedmiot: ')
        if item == 'c': return
        for i in self.inventory:
            if i.name == item:
                if i.use(self):
                    self.inventory.remove(i)
                return
        print("Nieprawidłowy przedmiot.")

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=35, attack=6, exp_reward=10)

class Skeleton(Monster):
    def __init__(self):
        super().__init__("Skeleton", hp=75, attack=8, exp_reward=100)