def startgame(App): """ Function creates game object based on user input ... Parameters ---------- :param App: TKinter window object that deals gui :type App: Tk.window Return ------ :return t_game: game for user to start playing :type t_game: game object """ x = App.username # Pull name data from entry field if App.gametype.get() == 0: # Data from radio buttons - load vs new game t_game = game(x,new=True) elif App.gametype.get() == 1: try: t_game = game(x,new=False) except: w("Unable to find user data, will load a new game...") t_game = game(x,new=True) else: t_game = game(x,new=True) return t_game
def remove_item(self, item): """ allows user to get rid of an item if desired ... Parameters ---------- :param item: item in bag :type item: item Return ------ :return response: response based on whether function was successfull or not :type response: str """ removed = False if item not in self.items: # If item is not in dict bag w(f"You do not have {item} in inventory") else: del self.items[item] if type( item ) == weapon: # if item is of type weapon, associated ad must be removed self.AD -= item.AD elif type(item) == shield or type( item ) == armour: # if item is of time shield or armour, associated HP must be removed self.HP -= item.HP self.max_HP -= item.HP w(f"{item} has been removed from inventory") removed = True return removed
def exp_gain(self, opponent): """ Adds EXP based on enemy and if EXP meets level up requirements, levels up user ... Parameters ---------- :param opponent: enemy that has been battled :type opponent: enemy.character """ self.EXP += opponent.EXP_given # Add EXP if self.EXP > self.exp_needed: # If EXP meets requirements LEVEL UP self.level += 1 self.exp_needed = int(self.exp_needed + 500 * (1.1**self.level)) w(f"{self.name} just leveled up to Level {self.level}!!")
def add_item(self, item): """ function to add a new item to user bag ... Parameters ---------- :param item: item in bag :type item: item Return ------ :return item_added: to inform shop if a purchase was made or not :type item_added: bool """ x = type(item) # log what the item is contents = [] # Log of types of items in bag things_list = [] # Log of items in bag item_added = False for thing in self.items.keys(): things_list.append(thing.name.lower()) contents.append(type(thing)) if item.name.lower() in things_list: # if item is already in bag if x == pot: # if it is a pot then player can have more than 1 otherwise is limited self.items[item] += 1 item_added = True p(f"You now have another {item.name}") elif x == weapon or x == shield or x == armour: p("You already have one") else: # If it is not already in bag if x == pot: # New pot self.items[item] = 1 item_added = True w(f"{item.name} has been added to your inventory") else: if x in contents: # if it is not a pot then matching types cannot be bough until an old one is gotten rid off removal = p( "Please get rid of your old weapon/shield/armour before purchasing a new one \nWould you like to get rid of an item? (yes/no)", inp=True) # Allow user to delete old item if removal.lower() == "yes": to_be_removed = p( "What item would you like removed? (Enter name)", inp=True) # Find item to be deleted for i in all_items: if i.name.lower() == to_be_removed.lower(): self.remove_item(i) p( "Item was removed" ) # If it was removed then this message will display else: self.items[ item] = 1 # If it is not in bag or same type isnt in bag, simply add 1 unit to bag item_added = True if type(item) == weapon: self.AD += item.AD # scale Ad based on items elif type(item) == shield or type(item) == armour: self.HP += item.HP # Scale hp based on items self.max_HP += item.HP w(f"{item.name} has been added to your inventory") return item_added
def battle(self, opponent): """ Fight between player and an opponent ... Parameters ---------- :param opponent: enemy for user to fight :param type: enemy.character Return ------ :param winner: Name of the winner of the battle :type winner: str """ sbm(True) # Tell gui to switch to battle mode on winner = None # Set winner equal to None, incase player decides to run away w(f"{opponent.name} attacks...") while winner == None: # When a new winner is set the battle is over opponent.attack( self ) # Since enemies suprise the player, they get to attack first if self.HP <= 0: # Check if somone has won winner = opponent.name p(f"{self.name} has been defeated.") break next_move = p( "What is your next move? 1 = attack, 2 = use item , 3 = try to run ", inp=True) if next_move == "1": # If user chooses to retaliate self.attack(opponent) if opponent.HP <= 0: # Check if somone has won winner = self.name p(f"{opponent.name} has been defeated.") elif next_move == "2": # If user chooses to use an item item_selected = False # To ensure an item is actually selected and to loop around if it is not while item_selected == False: # Item selection or exit x = p( "Which item would you like to use? type exit to return to battle ", inp=True) if x == "exit": item_selected = True else: outcome = self.use_item(x) if outcome == True: item_selected = True w(f"{x} was used") else: w("Invalid Input") elif next_move == "3": # If user chooses to try and run away value = random() # Generate float between 0 and 1 if value > 0.75: # To make it a 25% chance of success p("You got away") winner = "No winner" else: w("You got blocked") else: # If entry was invalid w("Invalid entry, while you were choosing your were attacked...." ) if self.name == winner: # If user has won for i in opponent.items: self.add_item(i) self.gold += opponent.gold # Steal enemies gold self.exp_gain(opponent) # Gain experinece points p(f"{self.name} wins..... {self.name} loot {opponent.gold} and {opponent.items}" ) elif opponent.name == winner: # If user has been killed p("You will be taken to your last save location") self.death() # To clear frame5 pf5("", 0) pf5("", 1) sbm(False) # Tell gui to switch back to battle mode false return winner
def interact(self, typ, placeholder): """ Logic behind interactions with "objects" on map ... Paramters --------- :param typ: Informs what type of object user is interacting with :type typ: str :param palceholder: 2nd part of tuple from matrix on a map :type placeholder: str Return ------ :return int: interger value based on typ to confirm completion :type int: int """ if typ == "storyCharacter": for character in all_story_characters: if placeholder == character.key: p( f"{character.name}:" ) ############################************************************* fix this TODO character.interact(self) return 0 elif typ == "bed": for bed in all_beds: # Determine which bed using bed keys and given key if bed.key == placeholder: x = p( f"This bed will cost {bed.cost} for the night \n Do you wish to continue? yes/no?", inp=True) # User confirmation if x.lower( ) == "yes": # Lowercase to avoid captil letter errors if self.gold > bed.cost: # Given user has enough gold (incase of hotel) self.gold -= bed.cost # Deducts gold cost self.HP = self.max_HP # Resets HP self.savegame() # Saves game p("The game has been saved") else: p("You have insufficient gold") elif x.lower( ) == "no": # If user chooses no, allow user back to map pass else: p("Invalid input" ) # Any other inputs are met with this error message return 1 elif typ == "shop": for shop in all_shops: # To determine which items to display search for shop in all shops if shop.key == placeholder: # Once found, print list of available items str1 = "Welcome, we have: " for i in shop.available_items: str1 += f"\n{i.name} for {i.value} gold" x = p( str1 + "\nWould you like to purchase anything? if no type exit otherwise select an item", inp=True) # Ask user for purchase if x == "exit": # if user changes mind break else: temp = None # Need to initiate variable outside loop, set to None for convienence for i in shop.available_items: if i.name.lower() == x.lower( ): # puts all letters into lowercase to avoid captial letter errors temp = i if temp != None: # If temp has been assigned a new value if self.gold > temp.value: # if player has enough gold try: item_added = self.add_item(temp) if item_added == True: self.gold -= temp.value except: w("You can not have more than one, sword, shield or armour" ) # Error from player.add_item is due to multiple of same type of item else: p("insufficient gold") else: p("Invalid input, please try again") return 2