Newer
Older
from gameparser import normalise_input
import os
def clear():
# 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')
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"]
self.alive = True
self.fought_boss = False
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
Thomas Glasper
committed
self.equipped = {
Thomas Glasper
committed
"defense": None,
"magic": 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.")
def get_equipped_name(self, category):
if self.equipped[category] == None:
return "none"
else:
return self.equipped[category].name
Thomas Glasper
committed
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
Thomas Glasper
committed
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):
Thomas Glasper
committed
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):
Thomas Glasper
committed
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):
Thomas Glasper
committed
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:
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
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.alive = False