Update 1.2

PHOTO EMBED

Sat Mar 23 2024 13:37:44 GMT+0000 (Coordinated Universal Time)

Saved by @SkyFragment

import os
import time
import sys

class Player:
    def __init__(self, name, difficulty):
        self.name = name
        self.difficulty = difficulty
        self.attack = 10
        self.defense = 5
        self.dodge = 2
        self.speed = 3
        self.gold = 100
        self.diamonds = 0
        self.experience = 0
        self.level = 1
        self.exp_required = 100
        self.exp_multiplier = 0.75  # 75% increase for experience requirement per level
        self.inventory = {  # Initialize inventory
            "Weapons": [],
            "Armors": [],
            "Shields": [],
            "Footwear": [],
            "Usable Items": []  # Add Usable Items category
        }
        self.equipped_items = {  # Initialize equipped items
            "Weapons": {"name": "Broken Sword", "description": "+10 Damage", "attack": 10},
            "Armors": {"name": "Broken Armor", "description": "+5 Defense", "defense": 5},
            "Shields": {"name": "Broken Shield", "description": "+2 Dodge", "dodge": 2},
            "Footwear": {"name": "Broken Footwear", "description": "+3 Speed", "speed": 3},
            "Accessories": None,
            "Bag": None
        }
        self.base_stats = {
            "HP": 100,
            "Defense": 0,
            "Attack": 0,
            "Dodge": 0,
            "Speed": 0
        }
        self.max_inventory_slots = 30
        self.update_stats()  # Update player stats based on equipped items
        
    def visit_inventory(self):
        while True:
            os.system('cls' if os.name == 'nt' else 'clear')
            print("Inventory:")
            print("=" * 40)
            print("1. Weapons")
            print("2. Armors")
            print("3. Shields")
            print("4. Footwear")
            print("5. Usable Items")
            print("6. Back to Player Status")
            print("\nEnter the number to select an option.")

            choice = input("")

            if choice == "1":
                self.display_items("Weapons")
            elif choice == "2":
                self.display_items("Armors")
            elif choice == "3":
                self.display_items("Shields")
            elif choice == "4":
                self.display_items("Footwear")
            elif choice == "5":
                self.display_items("Usable Items")
            elif choice == "6":
                self.display_status()
            else:
                print("Invalid option. Please enter a valid number.")
                time.sleep(1)

    def display_items(self, item_type):
        while True:
            os.system('cls' if os.name == 'nt' else 'clear')
            print(f"{item_type}:")
            print("=" * 40)
            if self.inventory[item_type]:
                for idx, item in enumerate(self.inventory[item_type], 1):
                    print(f"{idx}. {item['name']}: {item['description']}")
                print("0. Back to Inventory Menu")
                print("Enter the number to equip the item or 0 to go back.")
                choice = input("")
                if choice == "0":
                    break  # Break out of the inner loop to return to the previous menu
                elif choice.isdigit() and 0 < int(choice) <= len(self.inventory[item_type]):
                    self.equip_item(item_type, int(choice) - 1)
                else:
                    print("Invalid option. Please enter a valid number.")
                    time.sleep(1)
            else:
                print("No items in this category.")
                print("Press < to go back")
                choice = input("")
                if choice == "<":
                    break  # Break out of the inner loop to return to the previous menu

    def equip_item(self, item_type, index):
        item = self.inventory[item_type].pop(index)
        if item_type in ["Weapons", "Armors", "Shields", "Footwear"]:
            self.remove_equipped_item(item_type)  # Remove any previously equipped item of the same type
            self.equipped_items[item_type] = item  # Equip the new item
            self.update_stats()  # Update player stats with the new equipment
            print(f"{item['name']} equipped.")
            time.sleep(1)
        else:
            # Handle equipping usable items
            pass
        self.visit_inventory()

    def remove_equipped_item(self, item_type):
        if item_type in self.equipped_items:
            item = self.equipped_items.pop(item_type)
            self.inventory[item_type].append(item)

    def update_stats(self):
        # Reset stats to base values
        for stat in self.base_stats:
            setattr(self, stat.lower(), self.base_stats[stat])
        
        # Add bonuses from equipped items
        for item_type, item in self.equipped_items.items():
            if item:
                for stat in item:
                    if stat in self.base_stats:
                        setattr(self, stat.lower(), self.base_stats[stat] + item[stat])

                
    def display_equipped_items(self):
        os.system('cls' if os.name == 'nt' else 'clear')
        print("Equipped Items:")
        print("=" * 40)
        for item_type, item in self.equipped_items.items():
            if item:
                print(f"{item_type}: {item['name']} - {item['description']}")
            else:
                print(f"{item_type}: None")
        
        # Add option to unequip items
        print("Press u to unequip.")
        choice = input("")
        if choice == "u":
            self.unequip_menu()
        elif choice == "<":
            self.display_status()
        else:
            print("Invalid option. Please enter u to unequip or < to go back.")
            time.sleep(1)
            self.display_equipped_items()

    def display_status(self):
        print("Player Status:")
        print("=" * 40)
        print(f"Name: {self.name}")
        print(f"Difficulty: {self.difficulty}")
        print("-" * 40)
        print("Stats:")
        print(f"HP      :❤️{self.base_stats['HP']}")
        print(f"Defense :🛡️{self.defense}")
        print(f"Attack  :⚔️{self.attack}")
        print(f"Dodge   :🤺{self.dodge}")
        print(f"Speed   :🏃{self.speed}")
        print("-"*40)
        print(f"Level: {self.level}")
        print(f"Experience: {self.experience}/{self.exp_required}")
        print("-"*40)
        print(f"Gold: {self.gold} 💰")
        print(f"Diamonds: {self.diamonds} 💎")
        print("="*40)
        print("Game Options:")
        print("1. Visit Shop")
        print("2. Inventory")
        print("3. Equipped Items")  # New option to display equipped items
        print("4. Play Game")
        print("5. Delete this Character")
        print("6. Add 50 Experience Points")  # New option to add 50 exp
        print("\nEnter the number to select an option.")
        
        choice = input("")
        if choice == "1":
            self.visit_shop()
        elif choice == "2":
            self.visit_inventory()
        elif choice == "3":
            self.display_equipped_items()  
        elif choice == "4":
            self.play_game()
        elif choice == "5":
            return
        elif choice == "6":  # Option to add 50 exp
            self.add_experience(50)
        else:
            print("Invalid option. Please enter a valid number.")
            time.sleep(1)
            self.display_status()   
            
    def calculate_stat(self, stat_name):
        base_stat = getattr(self, stat_name)
        bonus_stat = sum(item.get(stat_name, 0) for item in self.equipped_items.values() if item)
        return base_stat + bonus_stat

    def display_items(self, item_type):
        os.system('cls' if os.name == 'nt' else 'clear')
        print(f"{item_type}:")
        print("=" * 40)
        if self.inventory[item_type]:
            for idx, item in enumerate(self.inventory[item_type], 1):
                if item:  # Check if item is not None
                    print(f"{idx}. {item['name']}: {item['description']}")
                else:
                    print("No items in this category.")
                    print("You need to press < to go back.")
            choice = input("")
            if choice == "<":
                self.visit_inventory()
            elif choice.isdigit() and 0 < int(choice) <= len(self.inventory[item_type]):
                self.equip_item(item_type, int(choice) - 1)
            else:
                print("Invalid option. Please enter a valid number.")
                time.sleep(1)
                self.display_items(item_type)
        else:
            print("No items in this category.")
            print("You need to press < to go back.")
            choice = input("")
            if choice == "<":
                self.visit_inventory()
            else:
                print("Invalid option. Please enter < to go back.")
                time.sleep(1)
                self.visit_inventory()
    def equip_item(self, item_type, index):
        if item_type in self.inventory:
            if 0 <= index < len(self.inventory[item_type]):
                item = self.inventory[item_type].pop(index)
                if self.equipped_items[item_type]:
                    old_item = self.equipped_items[item_type]
                    self.inventory[item_type].append(old_item)
                self.equipped_items[item_type] = item
                self.update_stats()
                print(f"{item['name']} equipped.")
                time.sleep(1)
            else:
                print("Invalid item index.")
                time.sleep(1)
        else:
            print("Invalid item type.")
            time.sleep(1)


    def unequip_item(self, item_type_to_unequip):
        if self.equipped_items[item_type_to_unequip]:
            self.inventory[item_type_to_unequip].append(self.equipped_items[item_type_to_unequip])
            self.equipped_items[item_type_to_unequip] = None
            print(f"{item_type_to_unequip}: None")
            time.sleep(1)
            self.unequip_menu(item_type_to_unequip)
        else:
            print("No item equipped.")
            time.sleep(1)
            self.display_equipped_items()
            
    def unequip_menu(self, item_type_to_unequip):
        os.system('cls' if os.name == 'nt' else 'clear')
        print(f"Unequip {item_type_to_unequip}:")
        print("=" * 40)
        if self.equipped_items[item_type_to_unequip]:
            print(f"1. {self.equipped_items[item_type_to_unequip]['name']} - {self.equipped_items[item_type_to_unequip]['description']}")
            print("Enter 1 to unequip or press < to cancel.")
            choice = input("")
            if choice == "1":
                self.unequip_item(item_type_to_unequip)
            elif choice == "<":
                self.display_equipped_items()
            else:
                print("Invalid option. Please enter a valid option.")
                time.sleep(1)
                self.unequip_menu(item_type_to_unequip)
        else:
            print(f"No {item_type_to_unequip} equipped.")
            time.sleep(1)
            self.display_equipped_items()
            
    def display_equipped_items(self):
        os.system('cls' if os.name == 'nt' else 'clear')
        print("Equipped Items:")
        print("=" * 40)
        for item_type, item in self.equipped_items.items():
            if item:
                print(f"{item_type}: {item['name']} - {item['description']}")
            else:
                print(f"{item_type}: None")
        print("\nUnequip Items:")
        print("=" * 40)
        for i, (item_type, item) in enumerate(self.equipped_items.items(), start=1):
            if item:
                print(f"{i}. {item_type}: {item['name']} - {item['description']}")
            else:
                print(f"{i}. {item_type}: None")
        print("Press < to go back to the player status menu.")
        choice = input("")
        if choice == "<":
            self.display_status()
        elif choice.isdigit():
            index = int(choice) - 1
            if 0 <= index < len(self.equipped_items):
                item_type_to_unequip = list(self.equipped_items.keys())[index]
                self.unequip_menu(item_type_to_unequip)
            else:
                print("Invalid option. Please enter a valid number.")
                time.sleep(1)
                self.display_equipped_items()
        else:
            print("Invalid option. Please enter a valid option.")
            time.sleep(1)
            self.display_equipped_items()
            
    def remove_equipped_item(self, item_type):
        if item_type in self.equipped_items:
            item = self.equipped_items.pop(item_type)
            self.inventory[item_type].append(item)

    def play_game(self):
        # Placeholder for play game functionality
        input("Play game functionality is under construction. Press Enter to return to the player status menu...")
        self.display_status()

    def add_experience(self, amount):
        self.experience += amount
        if self.experience >= self.exp_required:
            self.level_up()
        self.display_status()

    def level_up(self):
        self.level += 1
        self.exp_required = int(self.exp_required * (1 + self.exp_multiplier))  # Increase by 75%
        self.attack += 0.5
        self.defense += 0.5
        self.dodge += 0.5
        self.speed += 0.5

    def get_name_display(self):
        symbol = ""
        if self.difficulty == "Basic":
            symbol = "🛡️"
        elif self.difficulty == "Exemplar":
            symbol = "⚔️"
        elif self.difficulty == "Templar":
            symbol = "☠️"
        return f"{symbol} {self.name}"

    def get_difficulty_display(self):
        return self.difficulty

    def visit_shop(self):
        while True:
            os.system('cls' if os.name == 'nt' else 'clear')
            print("Welcome to the Shop!")
            print("=" * 40)
            print("Shop Sections:")
            print("1. Weapons")
            print("2. Armors")
            print("3. Shields")
            print("4. Footwear")
            print("5. Usable Items")
            print("6. Back to Player Status")
            print("\nEnter the number to select a shop section.")

            choice = input("")

            if choice == "1":
                self.display_shop_section("Weapons")
            elif choice == "2":
                self.display_shop_section("Armors")
            elif choice == "3":
                self.display_shop_section("Shields")
            elif choice == "4":
                self.display_shop_section("Footwear")
            elif choice == "5":
                self.display_shop_section("Usable Items")
            elif choice == "6":
                self.display_status()
            else:
                print("Invalid option. Please enter a valid number.")
                time.sleep(1)

    def display_shop_section(self, item_type):
        os.system('cls' if os.name == 'nt' else 'clear')
        print(f"Shop - {item_type}:")
        print("=" * 40)
        if item_type in items_groups:
            for idx, item in enumerate(items_groups[item_type], 1):
                print(f"{idx}. {item['name']}: {item['description']} - Cost: {item['cost']} gold")
            print("0. Back to Shop Sections")
            print("Enter the number to purchase the item or 0 to go back.")
            choice = input("")
            if choice == "0":
                self.visit_shop()
            elif choice.isdigit() and 0 < int(choice) <= len(items_groups[item_type]):
                self.purchase_item(item_type, int(choice) - 1)
            else:
                print("Invalid option. Please enter a valid number.")
                time.sleep(1)
                self.display_shop_section(item_type)
        else:
            print("Invalid shop section.")
            time.sleep(1)
            self.visit_shop()

    def purchase_item(self, item_type, index):
        item = items_groups[item_type][index]
        cost = item['cost']
        if self.gold >= cost:
            self.gold -= cost
            self.inventory[item_type].append(item)
            print(f"You have purchased {item['name']} for {cost} gold.")
            time.sleep(1)
        else:
            print("Insufficient gold to purchase this item.")
            time.sleep(1)
        self.display_shop_section(item_type)
            
items_groups = {
    "Usable Items": [
        {"name": "Small Healing Potion", "description": "+15 hp", "cost": 20},
        {"name": "Self Healing Potion", "description": "+20 hp", "cost": 50},
        {"name": "Moderated Potion", "description": "+25 hp", "cost": 75},
        {"name": "Regen Potion", "description": "+15%", "cost": 100},
        {"name": "Hammerhead Crocker", "description": "+7% attack for 7 turns", "cost": 55, "attack_bonus": 0.07},
        {"name": "Warhammer Crocker", "description": "+15% attack for 7 turns", "cost": 75, "attack_bonus": 0.15},
        {"name": "Barhog", "description": "+7% Defense for 7 turns", "cost": 45, "defense_bonus": 0.07},
        {"name": "Warhog", "description": "+15% defense for 7 turns", "cost": 60, "defense_bonus": 0.15},
        {"name": "Non applicable scroll", "description": "+2 Speed for 7 turns", "cost": 40, "speed_bonus": 2},
        {"name": "Applicable scroll", "description": "+4 speed for 7 turns", "cost": 55, "speed_bonus": 4},
        {"name": "Ransacked Shield", "description": "+12% Dodge chance for 3 turns", "cost": 60, "dodge_bonus": 0.12},
        {"name": "Unbuilded Shield", "description": "+23% Dodge Chance for 5 turns", "cost": 90, "dodge_bonus": 0.23},
        {"name": "Mystic Scroll", "description": "25% chance to negate all debuffs on player for 4 turns", "cost": 60},
        {"name": "Mystic Beurau", "description": "50% chance to negate all debuffs on player for 4 turns", "cost": 120},
        {"name": "Variant Bs", "description": "Increase all stats up to 25% for 10 turns", "cost": 200},
        {"name": "Variant Ex", "description": "Increase all stats up to 50% for 10 turns", "cost": 400},
        {"name": "Hide cloak", "description": "40% chance to dodge the battle against enemies when exploring", "cost": 50, "dodge_bonus": 0.4},
        {"name": "Invisible potion", "description": "60% chance to dodge the battle against enemies when exploring", "cost": 75, "dodge_bonus": 0.6},
        {"name": "Exp Moneter", "description": "Give you 20 exp points", "cost": 50},
        {"name": "Exp Vitalis", "description": "Give you 50 exp points", "cost": 100},
        {"name": "Exp For enhancer", "description": "Give you 100 points", "cost": 150}
    ],
    "Weapons": [
        {"name": "Stone Sword", "description": "+12 attack", "cost": 150, "attack_bonus": 12},
        {"name": "Copper Sword", "description": "+15 attack", "cost": 275, "attack_bonus": 15},
        {"name": "Sickanum Sword", "description": "+17 attack", "cost": 400, "attack_bonus": 17},
        {"name": "Arivanum Sword", "description": "+23 attack", "cost": 600, "attack_bonus": 23},
        {"name": "Viranium Sword", "description": "+25 attack", "cost": 850, "attack_bonus": 25},
        {"name": "Titanium sword", "description": "+35 attack", "cost": 1250, "attack_bonus": 35}
    ],
    "Armors": [
                {"name": "Jungle sets", "description": "+7 Defense", "cost": 90, "defense_bonus": 7},
        {"name": "Byzantine sets", "description": "+12 Defense", "cost": 140, "defense_bonus": 12},
        {"name": "Nikel Sets", "description": "+15 Defense", "cost": 350, "defense_bonus": 15},
        {"name": "Warhead Sets", "description": "+25 Defense", "cost": 560, "defense_bonus": 25},
        {"name": "Titanium Sets", "description": "+40 Defense", "cost": 850, "defense_bonus": 40}
    ],
    "Shields": [
        {"name": "Wooden Ob", "description": "+2 dodge", "cost": 80, "dodge_bonus": 2},
        {"name": "Long Ob", "description": "+3 dodge, +2 Defense", "cost": 120, "dodge_bonus": 3, "defense_bonus": 2},
        {"name": "Cob Ob", "description": "+5 dodge, +4 Defense", "cost": 300, "dodge_bonus": 5, "defense_bonus": 4},
        {"name": "Knock Ob", "description": "+7 dodge, +5 Defense, +3 Attack", "cost": 550, "dodge_bonus": 7, "defense_bonus": 5, "attack_bonus": 3},
        {"name": "Neb Ob", "description": "+12 dodge, +7 Defense, +5 Attack", "cost": 760, "dodge_bonus": 12, "defense_bonus": 7, "attack_bonus": 5}
    ],
    "Footwear": [
        {"name": "Jungle Foot", "description": "+3 speeds", "cost": 45, "speed_bonus": 3},
        {"name": "Iron Foot", "description": "+5 Speed", "cost": 75, "speed_bonus": 5},
        {"name": "Metal WarFoot", "description": "+8 Speeds", "cost": 120, "speed_bonus": 8},
        {"name": "Diamond Boots", "description": "+12 Speeds", "cost": 230, "speed_bonus": 12},
        {"name": "Noble Boots", "description": "+19 Speeds", "cost": 450, "speed_bonus": 19},
        {"name": "Lizable Boots", "description": "+25 Speeds", "cost": 700, "speed_bonus": 25}
    ]
}


def create_character():
    clear_screen()
    print("Character Creation")
    name = input("Enter your character's name: ")
    clear_screen()
    print(f"Character Name: {name}\n")
    
    while True:
        print("Select Difficulty:")
        print("1. Basic 🛡️")
        print("2. Exemplar ⚔️")
        print("3. Templar ☠️")
        difficulty_choice = input("Enter the number to select difficulty: ")
        
        if difficulty_choice == "1":
            difficulty = "Basic"
            description = "Enemies are powerful in their origins."
        elif difficulty_choice == "2":
            difficulty = "Exemplar"
            description = "Enemies are harder and more immortalized."
        elif difficulty_choice == "3":
            difficulty = "Templar"
            description = "Enemies are evils."
        else:
            print("Invalid difficulty choice. Please choose a valid option.")
            time.sleep(1)
            clear_screen()
            continue
        
        clear_screen()
        print("Selected Difficulty:")
        print(f"Name: {name}")
        print(f"Difficulty: {difficulty}")
        print(f"Description: {description}\n")
        print("1. Confirm")
        print("2. Back")
        
        confirm_choice = input("Enter your choice: ")
        if confirm_choice == "1":
            break
        elif confirm_choice == "2":
            clear_screen()
            continue
        else:
            print("Invalid choice. Please enter 1 to confirm or 2 to go back.")
            time.sleep(1)
            clear_screen()

    player = Player(name, difficulty)
    player.equipped_items["Weapons"] = {"name": "Broken Sword", "description": "+10 Damage", "attack": 10}
    player.equipped_items["Armors"] = {"name": "Broken Armor", "description": "+5 Defense", "defense": 5}
    player.equipped_items["Shields"] = {"name": "Broken Shield", "description": "+2 Dodge", "dodge": 2}
    player.equipped_items["Footwear"] = {"name": "Broken Footwear", "description": "+3 Speed", "speed": 3}

    return Player(name, difficulty)

def clear_screen():
    """Clears the console screen."""
    os.system('cls' if os.name == 'nt' else 'clear')

def main_menu():
    clear_screen()
    print("BeaVenture\n")
    print("1. Create Character")
    print("2. Exit")
    print("\nEnter the number to select an option.")

def main():
    while True:
        main_menu()
        try:
            choice = int(input(""))

            if choice == 1:
                player = create_character()
                player.display_status()
            elif choice == 2:
                clear_screen()
                print("Exiting BeaVenture. Goodbye!")
                time.sleep(2)
                clear_screen()
                print("Game Was Ended")
                input("Press Enter to exit...")
                clear_screen()
                break
            else:
                print("Invalid option. Please enter a valid number.")
                time.sleep(2)
        except ValueError:
            print("Invalid input. Please enter a number.")

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