Skip to content
Snippets Groups Projects
player.py 6.49 KiB
Newer Older
Evan Morgan's avatar
Evan Morgan committed
from items import *
from map import rooms
from gameparser import normalise_input
    # posix is os name for Linux or mac
    if os.name == 'posix':
        os.system('clear')
    # else screen will be cleared for windows
    else:
        os.system('cls')
Evan Morgan's avatar
Evan Morgan committed

def check_one_of_classes(classes, obj):
    for potential_class in classes:
        if type(obj) == potential_class:
            return True

    return False

class Player:
    def __init__(self):
        self.inventory = []
        self.current_room = rooms["spawn_room"]
Evan Morgan's avatar
Evan Morgan committed

        self.hp = 100
        self.level = 1
        self.xp = 0

        # stats
        self.base_hp = 100
        self.base_attack = 10
        self.base_defense = 10
        self.base_luck = 10  

        #  equipped items
            "weapon": None,
    def gain_xp(self, xp):
        # calculate required xp for next level
        required_xp = self.level * 10

        self.xp += xp
        print("You gained", str(xp), "xp.")

        if self.xp >= required_xp: 
            self.xp -= required_xp
            self.level += 1

            print("You levelled up to level", str(self.level) + "!")

            while True:
                print("")
                print("You can now select a base stat to make stronger.")
                print("You can use the following commands:")
                print("HP to increase your base HP.")
                print("ATTACK to increase your base attack.")
                print("DEFENSE to increase your base defense.")
                print("LUCK to increase your base luck.")

                user_input = input("> ")
                user_input = normalise_input(user_input)

                if user_input[0] == "hp":
                    print("You increased your base HP!\n")
                    self.base_hp += 5
                    break

                elif user_input[0] == "attack":
                    print("You increased your base attack!\n")
                    self.base_attack += 5
                    break

                elif user_input[0] == "defense":
                    print("You increased your base defense!\n")
                    self.base_defense += 5
                    break

                elif user_input[0] == "luck":
                    print("You increased your base luck!\n")
                    self.base_luck += 5
                    break

                else:
                    print("Did not recognise that category.")

Thomas Glasper's avatar
Thomas Glasper committed
    def get_equipped_name(self, category):
        if self.equipped[category] == None: 
            return "none"
        else:
            return self.equipped[category].name

    def inspect_item(self, item_id):
        for item in self.inventory:
            if item.id == item_id:
                item.inspect()
                return
        
        for category in self.equipped:
            item = self.equipped[category]

            # We must check is it a valid object, as we can also expect NoneType here
            if issubclass(type(item), GameObject):
                if item.id == item_id:
                    item.inspect()
                    return

        print("Could not find that item to inspect.")

    def equip(self, item_id):
        # find item to equip
        to_equip = None
        for item in self.inventory:
            if item.id == item_id:
                to_equip = item

        if to_equip == None:
            print("Cannot find that item to equip.")
            return

        if check_one_of_classes(spawnable_items["weapons"], to_equip):
            if self.equipped["weapon"] != None:
                print("You already have a weapon equipped, unequip it first.")
                return
            else:
                self.equipped["weapon"] = to_equip
                self.inventory.remove(to_equip)
                return

        if check_one_of_classes(spawnable_items["defense"], to_equip):
            if self.equipped["defense"] != None:
                print("You already have a defense item equipped, unequip it first.")
                return
            else:
                self.equipped["defense"] = to_equip
                self.inventory.remove(to_equip)
                return

        if check_one_of_classes(spawnable_items["magic"], to_equip):
            if self.equipped["magic"] != None:
                print("You already have a magic item equipped, unequip it first.")
                return
            else:
                self.equipped["magic"] = to_equip
                self.inventory.remove(to_equip)
                return

        print("Could not equip that item.\n")

    def unequip(self, item_id):
        for category in self.equipped:
            item = self.equipped[category]
            if item != None and item.id == item_id:
                self.inventory.append(item)
                self.equipped[category] = None
                return

        print("Could not find that item to unequip.\n")

    def get_luck(self):
        luck = self.base_luck
        if self.equipped["magic"] != None:
Ryan Tresman's avatar
Ryan Tresman committed
            luck += self.equipped["magic"].magic

        return luck

    def apply_defense(self, damage):
        if self.equipped["defense"] != None:
            return self.equipped["defense"].get_defense(damage, self.base_defense)

        else:
            return damage - self.base_defense

    def check_attack_missed(self, multiplier=1):
        # check if attack missed, higher multiplier means more chance
        return (self.get_luck() * multiplier) > random.randint(0, 100)

    def get_damage(self, multiplier=1):
        damage = self.base_attack

        if self.equipped["weapon"] != None:
            damage += self.equipped["weapon"].get_attack()

        critical = False
        if self.get_luck() > random.randint(0, 100):
            critical = True
            damage *= 2

        return int(damage * multiplier), critical

    def take_attack_wear(self, wear):
        if self.equipped["weapon"] != None and wear > 0:
            self.equipped["weapon"].checkout_dura(self, rooms, wear)
            return True

        return False

    def take_defense_wear(self, wear):
        if self.equipped["defense"] != None and wear > 0:
            self.equipped["defense"].checkout_dura(self, rooms, wear)
            return True

        return False

    def take_damage(self, damage):
        self.hp -= damage
        if self.hp <= 0: 
player = Player()