# Online Python compiler (interpreter) to run Python online. # Write Python 3 code in this online editor and run it. import time import random as rand import copy class Inventory: def __init__(self): self.itemInventory = ["Health Potion"] * 3 self.amethysts = 0 self.emeralds = 0 self.itemEffects = {} def defineItemEffects(self): self.itemEffects = { "Health Potion": "Heal 60", "Life Crystal": "MaxHealth 20" } class Player: def __init__(self, maxHealth, attackDamage): self.maxHealth = maxHealth self.health = self.maxHealth self.attackDamage = attackDamage self.critChance = 0.10 self.maxEnergy = 3 self.energy = 0 self.specialAttacks = { "Sweep": ["Attacks all enemies", 2] #attack:[desc, cost] } def __str__(self): return self.name class Enemy: def __init__(self, maxHealth, attackDamage, name, aDrop, eDrop): self.maxHealth = maxHealth self.health = self.maxHealth self.attackDamage = attackDamage self.name = name self.eDrop = eDrop self.aDrop = aDrop self.alive = True def __str__(self): return self.name #def reset(self): # self.__init__() def introduction(): print("Welcome to Text-Based RPG in Python!") print("\nIMPORTANT! At the top, on the same row as \"main.py\", there's a fullscreen button. See it? Make sure to click it! If you don't, you won't be able to scroll down to the bottom of the output!\n") print("This is a demo. Right now you battle five battles. Try to defeat King Slime!") print("The controls are simple. For now, all you need to know is: type in \"a\" for attack, \"i\" for items, and \"o\" for other. \nUsually, just type in the first letter of the option you choose.") global name name = input("Before we start, what's your name? ") if name == "": name = "Player" if "skibidi" in name.lower(): name = "Arnav" print(f"All right, {name.title()}!") p.name = name.title() input("Enter key to start!") #Battle Functions def playerUI(): print(f"{p.name}\'s Health: ♥ {p.health}/{p.maxHealth}") print(f"You have {inventory.amethysts} Amethysts and {inventory.emeralds} Emeralds") def enemyUI(enemy, number): if not best[enemy.name]["Entry"][1]: print(f"[{number}] {enemy.name}\'s Health: ♥ {(enemy.health / enemy.maxHealth) * 100}%") else: print(f"[{number}]{enemy.name}\'s Health: ♥ {enemy.health}/{enemy.maxHealth}") def battleUI(): print("") enemyUI(e1, 1) if 'e2' in globals(): enemyUI(e2, 2) if 'e3' in globals(): enemyUI(e3, 3) print(f"{p.name}\'s Health: ♥ {p.health}/{p.maxHealth}") print(f"{p.name}\'s Energy: {p.energy}/{p.maxEnergy}") def attack(target, attacker): global enemyCount if target == p: p.health -= attacker.attackDamage print(f"\n{attacker.name} attacked you.") else: if target == 'all': if enemyCount == 2: e1.health -= p.attackDamage e2.health -= p.attackDamage elif enemyCount == 3: e1.health -= p.attackDamage e2.health -= p.attackDamage e3.health -= p.attackDamage else: e1.health -= p.attackDamage if enemyCount == 2: e1.health -= p.attackDamage *.5 e2.health -= p.attackDamage *.5 elif enemyCount == 3: e1.health -= p.attackDamage *.5 e2.health -= p.attackDamage *.5 e3.health -= p.attackDamage *.5 else: e1.health -= p.attackDamage *.5 else: target.health -= p.attackDamage target.health -= p.attackDamage * .5 print("\nCritical Hit!") else: print("\nYou attacked.") if target != 'all' and target.health <= 0 : target.health = 0 def useItem(toUse): itemToUse = inventory.itemInventory[toUse] effect = inventory.itemEffects[itemToUse] type = effect[0] if type == 'Heal': p.health += int(effect[1]) if p.health > p.maxHealth: p.health = p.maxHealth if type == 'MaxHealth': p.maxHealth += int(effect[1]) p.health += int(effect[1]) inventory.itemInventory.pop(toUse) def useInventory(): print(f"Your Item Inventory: {inventory.itemInventory}") item = input("Would you like to use an item? (Type the number of the item in the list, starting at one eg. for first item type 1. Type anything else, or nothing, to exit.) ") if item.isdigit() == True: if len(inventory.itemInventory) > int(item) - 1: useItem(int(item) - 1) return True else: print("Invalid Number") return False else: return False def playerTurn(): playerMove = input("| ️Attack | Item | Other | ").lower() if playerMove == "a": attackType = '' while not (attackType == 'r' or attackType == 's'): attackType = input("| ️Regular Attack | Special Attack | ").lower() specialAttackType = "" if attackType == 's': print("Your special attacks:\n") for attacktype, info in p.specialAttacks.items(): print(f"{attacktype}: {info[0]}, costs {info[1]} energy.") specialAttackType = input("\nWhich one would you like to use? (type number, anything else to exit.) ").lower() if specialAttackType.isdigit(): specialAttackType = int(specialAttackType) - 1 try: except: return playerTurn() if p.energy < 0: print("Not enough energy.") return playerTurn() if specialAttackType == 0: attack('all', p) return None if enemyCount == 1: if attackType == "r": attack(e1, p) else: attacking = "" while not attacking.isdigit(): attacking = input("Which enemy would you like to attack? (Type the number): ") if attacking.isdigit(): if int(attacking) < 1 or int(attacking) > enemyCount: print("Invalid number. Choose again.") attacking = "" attacking = int(attacking) if attacking == 1: attack(e1, p) elif attacking == 2: attack(e2, p) elif attacking == 3: attack(e3, p) elif playerMove == 'i': if not useInventory(): return playerTurn() return playerTurn() elif playerMove == 'o': otherMove = input("| ️Charge Energy | ").lower() if otherMove == 'c': p.energy += 1 if p.energy > p.maxEnergy: p.energy = p.maxEnergy else: return playerTurn() else: return playerTurn() def enemyTurn(enemy): if enemy == 1: enemy = e1 elif enemy == 2: enemy = e2 elif enemy == 3: enemy = e3 if enemy.health <= 0: enemy.alive = False enemy.health = 0 else: attack(p, enemy) def battle(): global enemyCount global e1 global e2 global e3 if 'e2' in globals(): if 'e3' in globals(): condition = e1.alive or e2.alive or e3.alive else: condition = e1.alive or e2.alive else: condition = e1.alive while (condition == True) and p.health > 0: p.energy += 1; if p.energy > p.maxEnergy: p.energy = p.maxEnergy battleUI() playerTurn() battleUI() enemyTurn(i) if 'e2' in globals(): if 'e3' in globals(): condition = e1.alive or e2.alive or e3.alive else: condition = e1.alive or e2.alive else: condition = e1.alive battleUI() if p.health <= 0: p.health = 0 if e1.health <= 0: e1.health = 0 if 'e2' in globals(): if e2.health <= 0: e2.health = 0 if 'e3' in globals(): if e3.health <= 0: e3.health = 0 if p.health <= 0: print('You Lose!') quit() else: print('\nYou Win!') if 'e2' in globals(): if 'e3' in globals(): inBattle = [e1, e2, e3] else: inBattle = [e1, e2] else: inBattle = [e1] for i in inBattle: inventory.amethysts += i.aDrop print(f'+{i.aDrop} Amethysts') if i.eDrop > 0: inventory.emeralds += i.eDrop print(f'+{i.eDrop} Emeralds') if len(i.specialDrops) > 0: print(f"Dropped {i.specialDrops}") inventory.itemInventory.extend(i.specialDrops) if not best[i.name]["Entry"][1]: best[i.name]["Entry"][1] = True print(f"{i.name} added to bestiary.") def initiateBattle(wave): global e1 global e2 global e3 global enemyCount e1.specialDrops = waves[wave][1]["specialDrops"] enemyCount = 1 if len(waves[wave]) > 1: if waves[wave][2]["enemy"] == waves[wave][1]["enemy"]: else: e2 = waves[wave][2]["enemy"] e2.specialDrops = waves[wave][2]["specialDrops"] enemyCount += 1 if len(waves[wave]) == 3: if waves[wave][3]["enemy"] == waves[wave][1]["enemy"]: if waves[wave][3]["enemy"] == waves[wave][2]["enemy"]: e3 = waves[wave][3]["enemy"] e3.specialDrops = waves[wave][3]["specialDrops"] enemyCount += 1 else: try: del e3 except: pass else: try: del e2 del e3 except: pass if e1.name == "King Slime": print("\nBOSS BATTLE!") if enemyCount == 2: print(f"\n{p.name} vs. {e1.name}, {e2.name}") elif enemyCount == 3: print(f"\n{p.name} vs. {e1.name}, {e2.name}, {e3.name}") else: print(f"\n{p.name} vs. {e1.name}") #End of batte functions def viewBestiary(): print("\nEnemies in your bestiary:") global best viewable = [] for enemy in best: if best[enemy]["Entry"][1] == False: continue print(enemy) viewable.append(enemy) view = input("\nWhich entry would you like to view? (Type position of enemy in the list of enemies, eg. first type \"1\". Type anything else, or nothing, to exit.) ") if view.isdigit() == True: if int(view) - 1 < len(viewable): view = int(view) - 1 print() print(viewable[view]) print(best[viewable[view]]["Entry"][0]) else: print("Invalid Number") def rest(): playerUI() print("\nWhat would you like to do?") choice = input("| Item | View Bestiary | (i for item, b for bestiary, anything else to exit) ").lower() if choice == "i": while useInventory(): print() playerUI() elif choice == 'b': viewBestiary() else: print("Text-Based RPG in Python, by Maxwell") p = Player(100, 20) inventory = Inventory() inventory.defineItemEffects() global playerMove best = { "Orange Slime": { "Enemy": Enemy(40, 10, "Orange Slime", 2, 0), "Entry": ["""Health: 40, Attack Damage: 10 Just your regular orange slime boi.""", False] }, "Blue Slime": { "Enemy": Enemy(60, 10, "Blue Slime", 3, 0), "Entry": ["""Health: 60, Attack Damage: 10 Slightly more durable than the orange slime. Also, comes in a cool shade of blue! Although you can't really see that...""", False] }, "King Slime": { "Enemy": Enemy(120, 20, "King Slime", 5, 1), "Entry": ["""Health: 120, Attack Damage: 20 [BOSS] A king among slimes. Very strong, very large, and rocks a cool crown.""", False] } } #Short for "bestiary", basically a monster encyclopedia waves = { 1 : { 1 : { "enemy" : best["Orange Slime"]["Enemy"], "specialDrops" : [] } }, 2 : { 1 : { "enemy" : best["Blue Slime"]["Enemy"], "specialDrops" : [] } }, 3 : { 1 : { "enemy" : best["Orange Slime"]["Enemy"], "specialDrops" : [] }, 2 : { "enemy" : best["Orange Slime"]["Enemy"], "specialDrops" : [] } }, 4 : { 1 : { "enemy" : best["Blue Slime"]["Enemy"], "specialDrops" : [] }, 2 : { "enemy" : best["Blue Slime"]["Enemy"], "specialDrops" : ["Health Potion"] } }, 5 : { 1 : { "enemy" : best["King Slime"]["Enemy"], "specialDrops" : ["Life Crystal"] } } } introduction() initiateBattle(wave) battle() rest() print(f"\nCongrats, {p.name}! You've beaten the demo.") # To Do: #████████╗███████╗██╗ ██╗████████╗ #╚══██╔══╝██╔════╝╚██╗██╔╝╚══██╔══╝ # ██║ █████╗ ╚███╔╝ ██║ █████╗ # ██║ ██╔══╝ ██╔██╗ ██║ ╚════╝ # ██║ ███████╗██╔╝ ██╗ ██║ # ╚═╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ # #██████╗ █████╗ ███████╗███████╗██████╗ ██████╗ ██████╗ ██████╗ #██╔══██╗██╔══██╗██╔════╝██╔════╝██╔══██╗ ██╔══██╗██╔══██╗██╔════╝ #██████╔╝███████║███████╗█████╗ ██║ ██║ ██████╔╝██████╔╝██║ ███╗ #██╔══██╗██╔══██║╚════██║██╔══╝ ██║ ██║ ██╔══██╗██╔═══╝ ██║ ██║ #██████╔╝██║ ██║███████║███████╗██████╔╝ ██║ ██║██║ ╚██████╔╝ #╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═════╝
Standard input is empty
# Online Python compiler (interpreter) to run Python online. # Write Python 3 code in this online editor and run it. import time import random as rand import copy class Inventory: def __init__(self): self.itemInventory = ["Health Potion"] * 3 self.amethysts = 0 self.emeralds = 0 self.itemEffects = {} def defineItemEffects(self): self.itemEffects = { "Health Potion": "Heal 60", "Life Crystal": "MaxHealth 20" } class Player: def __init__(self, maxHealth, attackDamage): self.maxHealth = maxHealth self.health = self.maxHealth self.attackDamage = attackDamage self.critChance = 0.10 self.maxEnergy = 3 self.energy = 0 self.specialAttacks = { "Sweep": ["Attacks all enemies", 2] #attack:[desc, cost] } def __str__(self): return self.name class Enemy: def __init__(self, maxHealth, attackDamage, name, aDrop, eDrop): self.maxHealth = maxHealth self.health = self.maxHealth self.attackDamage = attackDamage self.name = name self.eDrop = eDrop self.aDrop = aDrop self.alive = True def __str__(self): return self.name #def reset(self): # self.__init__() def introduction(): print("Welcome to Text-Based RPG in Python!") print("\nIMPORTANT! At the top, on the same row as \"main.py\", there's a fullscreen button. See it? Make sure to click it! If you don't, you won't be able to scroll down to the bottom of the output!\n") print("This is a demo. Right now you battle five battles. Try to defeat King Slime!") print("The controls are simple. For now, all you need to know is: type in \"a\" for attack, \"i\" for items, and \"o\" for other. \nUsually, just type in the first letter of the option you choose.") global name name = input("Before we start, what's your name? ") if name == "": name = "Player" if "skibidi" in name.lower(): name = "Arnav" print(f"All right, {name.title()}!") p.name = name.title() input("Enter key to start!") #Battle Functions def playerUI(): print(f"{p.name}\'s Health: ♥ {p.health}/{p.maxHealth}") print(f"You have {inventory.amethysts} Amethysts and {inventory.emeralds} Emeralds") def enemyUI(enemy, number): if not best[enemy.name]["Entry"][1]: print(f"[{number}] {enemy.name}\'s Health: ♥ {(enemy.health / enemy.maxHealth) * 100}%") else: print(f"[{number}]{enemy.name}\'s Health: ♥ {enemy.health}/{enemy.maxHealth}") def battleUI(): print("") enemyUI(e1, 1) if 'e2' in globals(): enemyUI(e2, 2) if 'e3' in globals(): enemyUI(e3, 3) print(f"{p.name}\'s Health: ♥ {p.health}/{p.maxHealth}") print(f"{p.name}\'s Energy: {p.energy}/{p.maxEnergy}") def attack(target, attacker): global enemyCount if target == p: p.health -= attacker.attackDamage print(f"\n{attacker.name} attacked you.") else: if target == 'all': if enemyCount == 2: e1.health -= p.attackDamage e2.health -= p.attackDamage elif enemyCount == 3: e1.health -= p.attackDamage e2.health -= p.attackDamage e3.health -= p.attackDamage else: e1.health -= p.attackDamage if rand.random() < p.critChance: if enemyCount == 2: e1.health -= p.attackDamage *.5 e2.health -= p.attackDamage *.5 elif enemyCount == 3: e1.health -= p.attackDamage *.5 e2.health -= p.attackDamage *.5 e3.health -= p.attackDamage *.5 else: e1.health -= p.attackDamage *.5 else: target.health -= p.attackDamage if rand.random() < p.critChance: target.health -= p.attackDamage * .5 print("\nCritical Hit!") else: print("\nYou attacked.") if target != 'all' and target.health <= 0 : target.health = 0 def useItem(toUse): itemToUse = inventory.itemInventory[toUse] effect = inventory.itemEffects[itemToUse] effect = effect.split(' ') type = effect[0] if type == 'Heal': p.health += int(effect[1]) if p.health > p.maxHealth: p.health = p.maxHealth if type == 'MaxHealth': p.maxHealth += int(effect[1]) p.health += int(effect[1]) inventory.itemInventory.pop(toUse) def useInventory(): print(f"Your Item Inventory: {inventory.itemInventory}") item = input("Would you like to use an item? (Type the number of the item in the list, starting at one eg. for first item type 1. Type anything else, or nothing, to exit.) ") if item.isdigit() == True: if len(inventory.itemInventory) > int(item) - 1: useItem(int(item) - 1) return True else: print("Invalid Number") return False else: return False def playerTurn(): playerMove = input("| ️Attack | Item | Other | ").lower() time.sleep(0.25) if playerMove == "a": attackType = '' while not (attackType == 'r' or attackType == 's'): attackType = input("| ️Regular Attack | Special Attack | ").lower() specialAttackType = "" if attackType == 's': print("Your special attacks:\n") for attacktype, info in p.specialAttacks.items(): print(f"{attacktype}: {info[0]}, costs {info[1]} energy.") specialAttackType = input("\nWhich one would you like to use? (type number, anything else to exit.) ").lower() if specialAttackType.isdigit(): specialAttackType = int(specialAttackType) - 1 try: p.energy -= (p.specialAttacks[list(p.specialAttacks.keys())[specialAttackType]][1]) except: return playerTurn() if p.energy < 0: p.energy += p.specialAttacks[list(p.specialAttacks.keys())[specialAttackType]][1] print("Not enough energy.") return playerTurn() if specialAttackType == 0: attack('all', p) return None if enemyCount == 1: if attackType == "r": attack(e1, p) else: attacking = "" while not attacking.isdigit(): attacking = input("Which enemy would you like to attack? (Type the number): ") if attacking.isdigit(): if int(attacking) < 1 or int(attacking) > enemyCount: print("Invalid number. Choose again.") attacking = "" attacking = int(attacking) if attacking == 1: attack(e1, p) elif attacking == 2: attack(e2, p) elif attacking == 3: attack(e3, p) elif playerMove == 'i': if not useInventory(): return playerTurn() return playerTurn() elif playerMove == 'o': otherMove = input("| ️Charge Energy | ").lower() if otherMove == 'c': p.energy += 1 if p.energy > p.maxEnergy: p.energy = p.maxEnergy else: return playerTurn() else: return playerTurn() def enemyTurn(enemy): if enemy == 1: enemy = e1 elif enemy == 2: enemy = e2 elif enemy == 3: enemy = e3 if enemy.health <= 0: enemy.alive = False enemy.health = 0 else: time.sleep(rand.randrange(10, 15, 1) / 10) attack(p, enemy) def battle(): global enemyCount global e1 global e2 global e3 if 'e2' in globals(): if 'e3' in globals(): condition = e1.alive or e2.alive or e3.alive else: condition = e1.alive or e2.alive else: condition = e1.alive while (condition == True) and p.health > 0: p.energy += 1; if p.energy > p.maxEnergy: p.energy = p.maxEnergy battleUI() playerTurn() time.sleep(0.5) battleUI() for i in range(1, enemyCount + 1): enemyTurn(i) if 'e2' in globals(): if 'e3' in globals(): condition = e1.alive or e2.alive or e3.alive else: condition = e1.alive or e2.alive else: condition = e1.alive time.sleep(0.5) battleUI() if p.health <= 0: p.health = 0 if e1.health <= 0: e1.health = 0 if 'e2' in globals(): if e2.health <= 0: e2.health = 0 if 'e3' in globals(): if e3.health <= 0: e3.health = 0 if p.health <= 0: print('You Lose!') quit() else: print('\nYou Win!') if 'e2' in globals(): if 'e3' in globals(): inBattle = [e1, e2, e3] else: inBattle = [e1, e2] else: inBattle = [e1] for i in inBattle: inventory.amethysts += i.aDrop print(f'+{i.aDrop} Amethysts') if i.eDrop > 0: inventory.emeralds += i.eDrop print(f'+{i.eDrop} Emeralds') if len(i.specialDrops) > 0: print(f"Dropped {i.specialDrops}") inventory.itemInventory.extend(i.specialDrops) if not best[i.name]["Entry"][1]: best[i.name]["Entry"][1] = True print(f"{i.name} added to bestiary.") def initiateBattle(wave): global e1 global e2 global e3 global enemyCount e1 = copy.copy(waves[wave][1]["enemy"]) e1.specialDrops = waves[wave][1]["specialDrops"] enemyCount = 1 if len(waves[wave]) > 1: if waves[wave][2]["enemy"] == waves[wave][1]["enemy"]: e2 = copy.copy(e1) else: e2 = waves[wave][2]["enemy"] e2.specialDrops = waves[wave][2]["specialDrops"] enemyCount += 1 if len(waves[wave]) == 3: if waves[wave][3]["enemy"] == waves[wave][1]["enemy"]: e3 = copy.copy(e1) if waves[wave][3]["enemy"] == waves[wave][2]["enemy"]: e3 = copy.copy(e2) e3 = waves[wave][3]["enemy"] e3.specialDrops = waves[wave][3]["specialDrops"] enemyCount += 1 else: try: del e3 except: pass else: try: del e2 del e3 except: pass if e1.name == "King Slime": print("\nBOSS BATTLE!") if enemyCount == 2: print(f"\n{p.name} vs. {e1.name}, {e2.name}") elif enemyCount == 3: print(f"\n{p.name} vs. {e1.name}, {e2.name}, {e3.name}") else: print(f"\n{p.name} vs. {e1.name}") #End of batte functions def viewBestiary(): print("\nEnemies in your bestiary:") global best viewable = [] for enemy in best: if best[enemy]["Entry"][1] == False: continue print(enemy) viewable.append(enemy) view = input("\nWhich entry would you like to view? (Type position of enemy in the list of enemies, eg. first type \"1\". Type anything else, or nothing, to exit.) ") if view.isdigit() == True: if int(view) - 1 < len(viewable): view = int(view) - 1 print() print(viewable[view]) print(best[viewable[view]]["Entry"][0]) else: print("Invalid Number") def rest(): playerUI() exit = False while exit == False: print("\nWhat would you like to do?") choice = input("| Item | View Bestiary | (i for item, b for bestiary, anything else to exit) ").lower() if choice == "i": while useInventory(): print() playerUI() elif choice == 'b': viewBestiary() else: exit = True; print("Text-Based RPG in Python, by Maxwell") p = Player(100, 20) inventory = Inventory() inventory.defineItemEffects() global playerMove best = { "Orange Slime": { "Enemy": Enemy(40, 10, "Orange Slime", 2, 0), "Entry": ["""Health: 40, Attack Damage: 10 Just your regular orange slime boi.""", False] }, "Blue Slime": { "Enemy": Enemy(60, 10, "Blue Slime", 3, 0), "Entry": ["""Health: 60, Attack Damage: 10 Slightly more durable than the orange slime. Also, comes in a cool shade of blue! Although you can't really see that...""", False] }, "King Slime": { "Enemy": Enemy(120, 20, "King Slime", 5, 1), "Entry": ["""Health: 120, Attack Damage: 20 [BOSS] A king among slimes. Very strong, very large, and rocks a cool crown.""", False] } } #Short for "bestiary", basically a monster encyclopedia waves = { 1 : { 1 : { "enemy" : best["Orange Slime"]["Enemy"], "specialDrops" : [] } }, 2 : { 1 : { "enemy" : best["Blue Slime"]["Enemy"], "specialDrops" : [] } }, 3 : { 1 : { "enemy" : best["Orange Slime"]["Enemy"], "specialDrops" : [] }, 2 : { "enemy" : best["Orange Slime"]["Enemy"], "specialDrops" : [] } }, 4 : { 1 : { "enemy" : best["Blue Slime"]["Enemy"], "specialDrops" : [] }, 2 : { "enemy" : best["Blue Slime"]["Enemy"], "specialDrops" : ["Health Potion"] } }, 5 : { 1 : { "enemy" : best["King Slime"]["Enemy"], "specialDrops" : ["Life Crystal"] } } } introduction() for wave in range(1, len(waves) + 1): initiateBattle(wave) battle() rest() print(f"\nCongrats, {p.name}! You've beaten the demo.") # To Do: #████████╗███████╗██╗ ██╗████████╗ #╚══██╔══╝██╔════╝╚██╗██╔╝╚══██╔══╝ # ██║ █████╗ ╚███╔╝ ██║ █████╗ # ██║ ██╔══╝ ██╔██╗ ██║ ╚════╝ # ██║ ███████╗██╔╝ ██╗ ██║ # ╚═╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ # #██████╗ █████╗ ███████╗███████╗██████╗ ██████╗ ██████╗ ██████╗ #██╔══██╗██╔══██╗██╔════╝██╔════╝██╔══██╗ ██╔══██╗██╔══██╗██╔════╝ #██████╔╝███████║███████╗█████╗ ██║ ██║ ██████╔╝██████╔╝██║ ███╗ #██╔══██╗██╔══██║╚════██║██╔══╝ ██║ ██║ ██╔══██╗██╔═══╝ ██║ ██║ #██████╔╝██║ ██║███████║███████╗██████╔╝ ██║ ██║██║ ╚██████╔╝ #╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═════╝