Example #1
0
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
Example #2
0
    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
Example #3
0
    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}!!")
Example #4
0
    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
Example #5
0
    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
Example #6
0
    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