Game for PYTHON
Published: 2024-06-07 15:34:16

```
import random
import time

class Player:
    def __init__(self, name):
        self.name = name
        self.health = 100
        self.gold = 5
        self.berries = 0
        self.attack = 10
        self.defense = 5
        self.potions = 3
        self.weak_spell = 1
        self.special_ability = None
        self.stamina = 120
        self.active_quest = None
        self.job = None
        self.salary = 0
        self.required_attributes = {}
        self.has_attempted_run = False
        self.upgrade_points = 0
        self.attacks = {
            "Roundhouse kick": {"damage": 10, "stamina_cost": 10},
            "Heavy Strike": {"damage": 20, "stamina_cost": 25},
            "Power Shot": {"damage": 30, "stamina_cost": 35}
        }

    def change_job(self, company):
        if all(getattr(self, attr, 0) >= req for attr, req in company.required_attributes.items()):
            self.gold += company.salary
            self.job = company.name
            print(
                f"Congratulations! You have been hired by {company.name} and received a salary of {company.salary} gold!")
        else:
            print("You do not meet the requirements to join this company.")

    def undertake_quest(self, quest):
        self.active_quest = quest
        print(f"You undertook the quest: {quest.name}")

    def display_companies(companies):
        print("Available Companies:")
        for idx, company in enumerate(companies, start=1):
            print(
                f"{idx}. {company.name} - Salary: {company.salary}, Required Attributes: {company.required_attributes}")

    def complete_quest(self):
        if self.active_quest and not self.active_quest.completed:
            self.gold += self.active_quest.reward_gold
            self.upgrade_points += self.active_quest.reward_upgrade_points
            self.active_quest.completed = True
            print(f"Congratulations! You completed the quest: {self.active_quest.name}")
            print(
                f"You received {self.active_quest.reward_gold} gold and {self.active_quest.reward_upgrade_points} upgrade points!")
            self.active_quest = None
        else:
            print("No active quest to complete.")

    def display_details(self):
        print(f"Quest: {self.name}")
        print(f"Description: {self.description}")
        print(f"Reward: {self.reward_gold} gold, {self.reward_upgrade_points} upgrade points")
        print("Status: Completed" if self.completed else "Status: In Progress")

    def reset_run_attempt(self):
        self.has_attempted_run = False

    def attempt_run(self):
        if not self.has_attempted_run:
            self.has_attempted_run = True
            return True
        else:
            print("You have already attempted to run during this battle.")
            self.has_attempted_run = False

    def display_stats(self):
        print(f"Player: {self.name}")
        print(f"Health: {self.health}")
        print(f"Gold: {self.gold}")
        print(f"Berries: {self.berries}")
        print(f"Attack: {self.attack}")
        print(f"Defense: {self.defense}")
        print(f"Potions: {self.potions}")
        print(f"Stamina: {self.stamina}")
        print(f"Upgrade Points: {self.upgrade_points}")
        if self.special_ability:
            print(f"Special Ability: {self.special_ability.name}")
        print("\nAttacks:")
        for attack, details in self.attacks.items():
            if details.get("unlocked", True):
                print("Roundhouse kick: damage-10, stamina cost-10")
                print("Heavy strike: damage-20, stamina cost-25")
                print("Power shot: damage-30, stamina cost-35")

    def attack_enemy(self, enemy, attack_name):
        damage = 0
        if attack_name in self.attacks:
            if self.stamina >= self.attacks[attack_name]["stamina_cost"]:
                damage = self.attacks[attack_name]["damage"]
                if self.special_ability:
                    damage += self.special_ability.activate()
                enemy.take_damage(max(0, damage - enemy.defense))
                print(f"You use {attack_name} and deal {max(0, damage - enemy.defense)} damage to the {enemy.name}!")
                self.stamina -= self.attacks[attack_name]["stamina_cost"]
            else:
                print("Not enough stamina to perform this attack!")
        else:
            print("Invalid attack choice. Please try again.")

    def simple_attack(self, enemy):
        damage = max(0, self.attack - enemy.defense)
        enemy.health -= damage
        print(f"You attack the enemy and deal {damage} damage!")

    def take_damage(self, damage):
        self.health -= damage

    def use_potion(self):
        if self.potions > 0:
            self.health += 20
            self.potions -= 1
            print("You use a potion and restore 20 health.")
        else:
            print("You don't have any potions left!")

class Enemy:
    def __init__(self, name, health, attack, defense, gold_drop, is_god=False, key_fragment_drop=False):
        self.name = name
        self.health = health
        self.attack = attack
        self.defense = defense
        self.gold_drop = gold_drop
        self.is_god = is_god
        self.key_fragment_drop = key_fragment_drop

    def drop_items(self, player):
        if self.key_fragment_drop:
            player.defeat_enemy()

    def drop_fruit(self):
        if self.is_god:
            return random.choice(["Gomu Gomu no Mi", "Hie Hie no Mi", "Mera Mera no Mi"])
        else:
            return None

    def attack_player(self, player):
        damage = max(0, self.attack - player.defense)
        player.take_damage(damage)
        print(f"The {self.name} attacks you and deals {damage} damage!")

    def take_damage(self, damage):
        self.health -= damage

class BossEnemy(Enemy):
    def __init__(self, name, health, attack, defense, gold_drop, is_god=False):
        super().__init__(name, health, attack, defense, gold_drop, is_god)

    def boss_battle(player, friend, boss_enemy):
        print(f"A formidable foe, {boss_enemy.name}, appears!")
        while player.health > 0 and boss_enemy.health > 0:
            print("\nPlayer's Turn:")
            player.display_stats()
            print(f"{boss_enemy.name}'s Health: {boss_enemy.health}")
            print("1. Basic punch")
            print("Attacks:")
            for idx, attack_name in enumerate(player.attacks.keys(), start=2):
                print(f"{idx}. {attack_name}")
            print("5. Use Potion")
            print("6. Run")
            if player.special_ability:
                print("7. Use Special Ability")
            choice = input("Enter your choice number: ")

            if choice.isdigit() and 1 <= int(choice) <= 6:
                choice = int(choice)
                if choice == 1:
                    player.simple_attack(enemy)
                elif choice == 2:
                    attack_name = "Roundhouse kick"
                elif choice == 3:
                    attack_name = "Heavy Strike"
                elif choice == 4:
                    attack_name = "Power Shot"
                elif choice == 5 :
                    player.use_potion()
                elif choice == 6:
                    print("You attempt to run away!")
                    if random.random() < 0.55:
                        print("You successfully escaped from the battle!")
                        player.reset_run_attempt()
                        return True
                    else:
                        print("You couldn't escape!")
                        print(f"{enemy.name}'s Turn:")
                        enemy.attack_player(player)
                        continue
                elif choice == 7 and player.special_ability:
                    attack_name = "Special Ability"
                else:
                    print("Invalid choice. Please try again.")
                    continue

                player.attack_enemy(enemy, attack_name)

                if boss_enemy.health <= 0:
                    print(f"Congratulations! You defeated {boss_enemy.name}!")
                    print(f"You received {boss_enemy.gold_drop} gold!")
                    break

                print(f"\n{boss_enemy.name}'s Turn:")
                boss_enemy.attack_player(player)

                if player.health <= 0:
                    print("You have been defeated! Game over.")
                    break

class SpecialAbility:
    def __init__(self, name, description, damage, cooldown):
        self.name = name
        self.description = description
        self.damage = damage
        self.cooldown = cooldown
        self.last_used_time = 0

    def activate(self):
        current_time = time.time()
        if current_time - self.last_used_time >= self.cooldown:
            print(f"You activate {self.name}: {self.description}")
            self.last_used_time = current_time
            return self.damage
        else:
            print(f"The ability {self.name} is still on cooldown!")
            return 0

class quest:
    def undertake_quest(self, quest):
        if self.active_quest:
            print("You are already on a quest. Complete it before taking another.")

class Quest:
    def __init__(self, name, description, reward_gold, reward_upgrade_points):
        self.name = name
        self.description = description
        self.reward_gold = reward_gold
        self.reward_upgrade_points = reward_upgrade_points
        self.completed = False

    def undertake_quest(self, quest):
        self.active_quest = quest
        print(f"You undertook the quest: {quest.name}")

    def complete_quest(self):
        if self.active_quest and not self.active_quest.completed:
            self.gold += self.active_quest.reward_gold
            self.upgrade_points += self.active_quest.reward_upgrade_points
            self.active_quest.completed = True
            print(f"Congratulations! You completed the quest: {self.active_quest.name}")
            print(
                f"You received {self.active_quest.reward_gold} gold and {self.active_quest.reward_upgrade_points} upgrade points!")
            self.active_quest = None
        else:
            print("No active quest to complete.")

    def display_details(self):
        print(f"Quest: {self.name}")
        print(f"Description: {self.description}")
        print(f"Reward: {self.reward_gold} gold, {self.reward_upgrade_points} upgrade points")
        print("Status: Completed" if self.completed else "Status: In Progress")

class BossKeyQuest:
    def __init__(self):
        self.key_fragments_needed = 3
        self.key_fragments_collected = 0

    def start_quest(self):
        print("You've received a quest to obtain the boss key!")
        print("Defeat enemies to collect their key fragments.")
        print(f"You need to collect {self.key_fragments_needed} key fragments to unlock the boss chamber.")

    def check_progress(self):
        print(f"You have collected {self.key_fragments_collected} out of {self.key_fragments_needed} key fragments.")

    def collect_key_fragment(self):
        self.key_fragments_collected += 1
        print("You collected a key fragment!")

    def complete_quest(self):
        if self.key_fragments_collected >= self.key_fragments_needed:
            print("Congratulations! You have collected all key fragments and unlocked the boss chamber.")
            return True
        else:
            print("You still need to collect more key fragments to unlock the boss chamber.")
            return False

class Company:
    def __init__(self, name, salary, required_attributes):
        self.name = name
        self.salary = salary
        self.required_attributes = required_attributes


class NPC:
    def __init__(self, name, dialogue):
        self.name = name
        self.dialogue = dialogue

    def interact(self):
        print(f"{self.name}: {self.dialogue}")

class Shop:
    def __init__(self):
        self.items = {
            "Health Potion": {"price": 20, "effect": "restore health"},
            "Old set of armor and sword": {"price": 40, "effect": "increse attack and defense by 2" },
            "Sword": {"price": 50, "effect": "increase attack by 4"},
            "Armor": {"price": 50, "effect": "increase defense by 4"},
            "Elixir of Life": {"price": 100, "effect": "health buff of 50 instantly"},
            "Aluminum Sword": {"price": 57, "effect": "increase attack by 5"},
            "Chainmail Armor": {"price": 57, "effect": "increase defense by 5"},
            "Iron Sword": {"price": 65, "effect": "increase attack by 10"},
            "Iron Armor": {"price": 65, "effect": "increase defense by 10"},
            "Gold Sword": {"price": 80, "effect": "increase attack by 15"},
            "Gold Armor": {"price": 80, "effect": "increase defense by 15"},
            "Wizard's Staff": {"price": 100, "effect": "increase attack by 20"},
            "Heavenly Knight's Armor": {"price": 110, "effect": "increase defense by 25"},
            "Ring of Vigor": {"price": 60, "effect": "increase stamina by 20"}
        }
        self.mythical_items = {
            "Conqueror's Sword": {"price": 20, "effect": "massive increase in attack"},
            "Dragon Armor": {"price": 20, "effect": "massive increase in defense"},
            "Eternal Life": {"price": 21, "effect": "massive increase in health"},
            "Ring of valor": {"price": 25, "effect": "increase in stamina, health"},
            "The eternal dagger": {"price": 29, "effect":"increase in attack by 29" }
        }
        self.special_abilities = {
            "Gomu Gomu no Mi": SpecialAbility("Gomu Gomu no Mi", "stretching ability", 15, 60),
            "Hie Hie no Mi": SpecialAbility("Hie Hie no Mi", "ice manipulation", 20, 90),
            "Mera Mera no Mi": SpecialAbility("Mera Mera no Mi", "fire manipulation", 25, 120)
        }
        self.exchange_rate = 10

    def display_items(self):
        print("Welcome to the shop! Here are the available items:")
        print("Regular Items(gold):")
        for item, stats in self.items.items():
            print(f"{item}: Price: {stats['price']} Gold, Effect: {stats['effect']}")
        print("\nMythical Items(berries):")
        for item, stats in self.mythical_items.items():
            print(f"{item}: Price: {stats['price']} Berries, Effect: {stats['effect']}")
        print("\nSpecial Abilities(can't be bought):")
        for ability, stats in self.special_abilities.items():
            print(f"{ability}: Description: {stats.description}, Damage: {stats.damage}, Cooldown: {stats.cooldown} seconds")

    def buy_item(self, player, item_name):
        if item_name in self.items:
            item_price = self.items[item_name]["price"]
            if player.gold >= item_price:
                if item_name == "Health Potion":
                    player.potions += 1
                elif item_name == "Old set of armor and sword":
                    player.attack += 2
                    player.defense += 2
                elif item_name == "Sword":
                    player.attack += 4
                elif item_name == "Armor":
                    player.defense += 4
                elif item_name == "Elixir of Life":
                    player.health += 50
                elif item_name == "Aluminum Sword":
                    player.attack += 5
                elif item_name == "chainmail armor":
                    player.defense += 5
                elif item_name == "Iron Sword":
                    player.attack += 10
                elif item_name == "Iron Armor":
                    player.defense += 10
                elif item_name == "Gold Sword":
                    player.attack += 15
                elif item_name == "Gold armor":
                    player.defense += 15
                elif item_name == "wizard's staff":
                    player.attack += 20
                elif item_name == "Heavenly knight's armor":
                    player.defense += 25
                elif item_name == "Ring of Vigor":
                    player.stamina += 20
                player.gold -= item_price
                print(f"You bought {item_name} for {item_price} gold!")
            else:
                print("You don't have enough gold to buy this item!")
        elif item_name in self.mythical_items:
            item_price = self.mythical_items[item_name]["price"]
            if player.berries >= item_price:
                if item_name == "Conqueror's Sword":
                    player.attack += 27
                elif item_name == "Dragon Armor":
                    player.defense += 29
                elif item_name == "Eternal Life":
                    player.health += 75
                elif item_name == "Ring of valor":
                    player.stamina += 50
                    player.health += 25
                elif item_name == "The eternal dagger":
                    player.attack += 29
                player.berries -= item_price
                print(f"You bought {item_name} for {item_price} berries!")
            else:
                print("You don't have enough berries to buy this item!")
        else:
            print("Item not available in the shop!")

class Friend:
    def __init__(self, name):
        self.name = name
        self.health = 100
        self.attack = 15
        self.defense = 8
        self.upgrade_points_cost = 5  # Define cost of upgrading friend
        self.upgrade_level = 0

    def display_stats(self):
        print(f"{self.name}'s Stats:")
        print(f"Health: {self.health}")
        print(f"Attack: {self.attack}")
        print(f"Defense: {self.defense}")
        print(f"Upgrade Level: {self.upgrade_level}")

    def upgrade(self, player):
        if player.upgrade_points >= self.upgrade_points_cost:
            player.upgrade_points -= self.upgrade_points_cost
            self.attack += 5  # Example upgrade: Increase attack by 5
            self.defense += 3  # Example upgrade: Increase defense by 2
            self.health += 10  # Example upgrade: Increase health by 10
            self.upgrade_level += 1
            print(f"{self.name} has been upgraded!")
        else:
            print("Insufficient upgrade points.")

def battle(player, friend, enemy, enemies):
    print(f"A wild {enemy.name} appears!")
    print(f"{player.name}'s stats:")
    player.display_stats()
    print(f"{friend.name}'s stats:")
    friend.display_stats()

    num_enemies = random.randint(1, 2)

    if num_enemies == 2 :
        enemy.health *= 1.4
    total_gold_drop = enemy.gold_drop * num_enemies
    enemy.attack *= num_enemies
    enemy.defense *= num_enemies


    print(f"{enemy.name}'s stats:")
    print(f"Health: {enemy.health}")
    print(f"Attack: {enemy.attack}")
    print(f"Defense: {enemy.defense}")

    while player.health > 0 and enemy.health > 0:
        print("\nPlayer's Turn:")
        print("1. Basic punch")
        print("Attacks:")
        for idx, attack_name in enumerate(player.attacks.keys(), start=2):
            print(f"{idx}. {attack_name}")
        print("Others:")
        print("5. Use Potion")
        print("6. Run")
        if player.special_ability:
            print("7. Use Special Ability")
        choice = input("Enter your choice number: ")

        if choice.isdigit() and 1 <= int(choice) <= 7:
            choice = int(choice)
            if choice == 1:
                player.simple_attack(enemy)
            elif choice in range(2, 5):
                attack_name = list(player.attacks.keys())[choice - 2]
                player.attack_enemy(enemy, attack_name)
            elif choice == 5:
                player.use_potion()
            elif choice == 6:
                print("You attempt to run away!")
                if random.random() < 0.4991:
                    print("You successfully escaped from the battle!")
                    return False  # Return False when player escapes
                else:
                    print("You couldn't escape!")
                    player.attempt_run()
                    print(f"{enemy.name}'s Turn:")
                    enemy.attack_player(player)
                    continue
            elif choice == 7 and player.special_ability:
                player.attack_enemy(enemy, "Special Ability")
            else:
                print("Invalid choice. Please try again.")
                continue

            if enemy.health <= 0:
                print(f"You defeated the {enemy.name}!")
                player.gold += enemy.gold_drop
                print(f"You received {enemy.gold_drop} gold!")
                fruit = enemy.drop_fruit()
                if fruit:
                    print(f"The {enemy.name} dropped a {fruit}!")
                    if fruit in player.special_abilities:
                        print("You feel a strange power emanating from the fruit!")
                        print(f"It seems you acquired the ability: {fruit}")
                        player.special_ability = player.special_abilities[fruit]
                return True

            print(f"{enemy.name}'s Turn:")
            enemy.attack_player(player)
            print(f"{player.name}'s stats:")
            player.display_stats()
            print(f"{friend.name}'s stats:")
            friend.display_stats()
            print(f"{enemy.name}'s stats:")
            print(f"Health: {enemy.health}")
            print(f"Attack: {enemy.attack}")
            print(f"Defense: {enemy.defense}")
        else:
            print("Invalid choice. Please enter a number between 1 and 7.")

    if player.health <= 0:
        print("You have been defeated! Game over.")
        return False
    return True

def dungeon(player, friend, dungeon_enemies):
    print("Welcome to the dungeon!")
    print("You are not alone here. Your friend is with you.")

    while player.health > 0:
        if len(dungeon_enemies) == 0:
            print("Congratulations! You defeated all enemies in the dungeon!")
            break

        print("\nCurrent enemies in the dungeon:")
        for idx, enemy in enumerate(dungeon_enemies):
            print(f"{idx + 1}. {enemy.name}")

        print("\nWhat would you like to do?")
        print("1. Battle an enemy")
        print("2. Shop")
        print("3. quest")
        print("4. upgrade friend")
        print("5. Quit")
        choice = input("Enter your choice number: ")

        if choice == "1":
            enemy_choice = random.choice(dungeon_enemies)
            if battle(player, friend, enemy_choice):
                dungeon_enemies.remove(enemy_choice)
        elif choice == "2":
            shop.display_items()
            item_choice = input("Enter the item you want to buy or 'exit' to leave the shop: ")
            if item_choice.lower() != 'exit':
                shop.buy_item(player, item_choice)
        elif choice == "3":
            print("Available Quests:")
            for idx, quest in enumerate(quests, start=1):
                quest.display_details()
            quest_choice = input("Enter the number of the quest you want to undertake or 'exit' to go back: ")
            if quest_choice.isdigit() and 1 <= int(quest_choice) <= len(quests):
                player.undertake_quest(quests[int(quest_choice) - 1]) if hasattr(player, 'undertake_quest') else print(
                    "Player cannot undertake quests.")
            elif quest_choice.lower() == 'exit':
                continue
            else:
                print("Invalid quest choice. Please try again.")
        elif choice == "4":
            friend.upgrade(player)
        elif choice == "5":
            print("Exiting the dungeon...")
            break
        else:
            print("Invalid choice. Please try again.")

def main():
    player_name = input("Enter your name: ")
    player = Player(player_name)
    friend = Friend("Ally")
    shop = Shop()
    enemies = [
        Enemy("Demon", 50, 8, 2, 20, False, False),
        Enemy("Orc", 70, 12, 5, 30),
        Enemy("Dragon", 100, 20, 10, 50),
        Enemy("Giants", 80, 17, 9, 40),
        Enemy("Undead Insects", 61, 10, 3, 25),
        Enemy("Blood hyena", 75, 16, 7, 42),
        Enemy("Sea Kings", 90, 21, 9, 55, False, True),
        Enemy("Sea Kings (Enraged)", 110, 25, 13, 63),
        Enemy("Sea Beast", 120, 30, 15, 70),
        Enemy("Jin-Woo (HUMAN, HUNTER)", 125, 35, 20, 75, False, True),
        Enemy("Cerberus", 132, 40, 25, 86),
        Enemy("GOD", 140, 45, 25, 100, True),
        Enemy("GOD (Enraged)", 155, 50, 30, 110, True,True)
              ]

    dark_lord = BossEnemy("Dark Lord", 200, 45, 26, 181)

    dungeon_enemies = [
        Enemy("Skeleton", 60, 10, 10, 40),
        Enemy("Goblin", 100, 24, 16, 60),
        Enemy("Witch", 115, 42, 24, 110),
        Enemy("warewolfs", 140, 60, 37, 140),
        Enemy("Dark Knight", 145, 80, 50, 172),
        Enemy("Demon Lord", 150, 90, 55, 200, True),
        Enemy("Ancient Dragon", 200, 100, 60, 220)
    ]

    quests = [
        Quest("Defeat the Sea beeast", "Defeat the notorious Sea beast .", 50, 1),
        Quest("defeat the GOD", "Defeat the rebel GOD.", 100, 2),
        Quest("defeat demon lord", "defeat the demon lord and free the captured spirits .", 150, 3)
    ]

    npc_1 = NPC("Villager", "Thank you for helping our village. We are forever grateful.")
    npc_2 = NPC("Blacksmith","Looking for some new gear? I have the finest weapons and armor in the land. Just visit the shop")

    companies = [
        Company("new hunter guild", 45, {"attack": 10, "defense": 5}),
        Company("Hunter Association", 100, {"attack": 50, "defense": 30}),
        Company("Magic Guild", 120, {"attack": 40, "stamina": 20, "defense": 50}),
        Company("Mercenaries Guild", 80, {"attack": 60, "stamina": 70}),
        Company("Explorers Guild", 90, {"defense": 40, "stamina": 60}),
    ]

    boss_quest = BossKeyQuest()
    boss_quest.start_quest()

    print("Welcome to the RPG game!")
    print("Your grandpa just passed away and you inheritd 5 gold")
    print("new hunter guild offerd you a contract sign it in companies")
    print("You have been hired by a hunter organization.")
    print("Your goal is to defeat all enemies and become the ultimate warrior.")
    print("1 berry = 10 gold")
    print("Fruits can only be dropped by GOD.")
    print("A random number of enemies from one to two can spawn")

    while player.health > 0:
        if len(enemies) == 0:
            print("Congratulations! You defeated all enemies and opened a portal to a dungeon!")
            print("You enter the portal and find yourself in a dark dungeon...")
            print("But don't worry, you have a friend to help you in this journey!")
            dungeon(player, friend, dungeon_enemies)
            friend.upgrade(player)  # Upgrade friend when entering the dungeon
            break

        print("\nCurrent enemies:")
        for idx, enemy in enumerate(enemies):
            print(f"{idx + 1}. {enemy.name}")

        print("\nWhat would you like to do?")
        print("1. Battle an enemy")
        print("2. Visit the shop")
        print("3. Upgrade friend")
        print("4. Stats")
        print("5. View quest")
        print("6. Interact with NPC")
        print("7. JOB(companies)")
        print("8. special quest")
        print("9. Credits")
        print("10. Quit")
        choice = input("Enter your choice number: ")

        if choice == "1":
            if enemies:  # Check if there are remaining enemies
                enemy_choice = random.choice(enemies)
                if battle(player, friend, enemy_choice, enemies):
                    enemies.remove(enemy_choice)
        elif choice == "2":
            shop.display_items()
            item_choice = input("Enter the item you want to buy or 'exit' to leave the shop: ")
            if item_choice.lower() != 'exit':
                shop.buy_item(player, item_choice)
        elif choice == "3":
            friend.upgrade(player)
        elif choice == "4":
            player.display_stats()
            friend.display_stats()
        elif choice == "6":
            print("NPCs available for interaction:")
            print("1. Villager")
            print("2. Blacksmith")
            npc_choice = input("Enter the number of the NPC you want to interact with: ")
            if npc_choice == "1":
                npc_1.interact()
            elif npc_choice == "2":
                npc_2.interact()
            else:
                print("Invalid NPC choice.")
        elif choice == "5":
            if player.active_quest:
                print("You are already on a quest. Complete it before taking another.")
            else:
                print("Available Quests:")
                for idx, quest in enumerate(quests, start=1):
                    quest.display_details()
                quest_choice = input("Enter the number of the quest you want to undertake or 'exit' to go back: ")
                if quest_choice.isdigit() and 1 <= int(quest_choice) <= len(quests):
                    player.undertake_quest(quests[int(quest_choice) - 1])
                elif quest_choice.lower() == 'exit':
                    continue
                else:
                    print("Invalid quest choice. Please try again.")
        elif choice == "7":
            print("Available Companies:")
            for idx, company in enumerate(companies, start=1):
                print(f"{idx}. {company.name} - Salary: {company.salary} gold, Required Attributes: {company.required_attributes}")
            company_choice = input("Enter the number of the company you want to apply to or 'exit' to go back: ")
            if company_choice.isdigit() and 1 <= int(company_choice) <= len(companies):
                player.change_job(companies[int(company_choice) - 1])
            elif company_choice.lower() == 'exit':
                continue
            else:
                print("Invalid company choice. Please try again.")
        elif choice == "8":
            boss_quest.check_progress()
            op = input("type EXIT to go back to home- ")
            if op == 'EXIT':
                continue
        elif choice == "9":
            print("Game by - Praket singh bhadauria")
            print("inspiration - Solo leveling, One piece")
            op = input("type EXIT to go back to home- ")
            if op == 'EXIT':
                continue
        elif choice == "10":
            print("Thanks for playing!")
            break
        else:
            print("Invalid choice. Please try again.")

            if boss_quest.complete_quest():
                # Generate the boss enemy and start the boss battle
                boss_enemy = BossEnemy("Dark Lord", 300, 50, 30, 1000)
                BossEnemy.boss_battle(player, friend, boss_enemy)
                break

if __name__ == "__main__":
    main()
```