Ejemplo n.º 1
0
class Character():
    def __init__(self,
                 name,
                 hp=10,
                 strength=5,
                 toughness=1,
                 inventory=None,
                 equipment=None):
        self.name = name
        self.maxHp = hp
        self.hp = hp
        self.strength = strength
        self.toughness = toughness
        self.equipment = Equipment() if equipment is None else equipment
        self.inventory = Inventory([HealingPotion()
                                    ]) if inventory is None else inventory

    def attack(self):
        #Bare-hands attack
        dmg = self.strength
        if self.equipment.weapon:
            dmg = dmg + self.equipment.weapon.getDamages()
        return dmg

    def protect(self, dmg):
        if self.equipment.armor:
            dmg = self.equipment.armor.protect(dmg)
        dmg = dmg - self.toughness
        return max(dmg, 0)

    def pickup(self, item):
        def default():
            self.inventory.addItem(item)

        def w():
            self.equipment.weapon = item

        def a():
            self.equipment.armor = item

        switch = {
            'Weapon': w,
            'Armor': a,
        }
        switch.get(type(item).__name__, default)()

    def isAlive(self):
        return self.hp > 0

    def __str__(self):
        return self.name + (' is alive with %s HP'%self.hp if self.isAlive() else ' is dead ')\
         + ', carrying ' + (str(self.equipment.armor) if self.equipment.armor else 'no armor')\
         + ' and wielding ' + (str(self.equipment.weapon) if self.equipment.weapon else 'no weapon') + '.'
Ejemplo n.º 2
0
class Hero(Entity):

	def __init__(self):

		self.heroRace = Race()
		self.heroClass = ""

		#Получаем Данные от пользователя
		self.getName()
		self.getClass()
		self.getRace()

		super().__init__(self.name,self.heroRace.stats,Elements(),0)

		## Инвентарь героя
		self.inventory = Inventory()
		## Обмундирование героя
		self.equipment = Equipment()
		## Карман с Лечебками героя
		self.potionsPocket = PotionsPocket()

	## Получает имя Персонажа
	def getName(self): #TODO! Не получать пустую строку , и чтобы ввод был норм.
		while True:
			self.name = input("Input you name:")
			if self.name:
				# Если что-то было введено - прекратить цикл
				break
	## Получает Рассу
	def getRace(self):
		#Получаем Расу
		self.heroRace = utils.getChoice("Choose your Race:",races) #TODOlater Сделать вывод по горизонтали

	## Получает Класс
	def getClass(self): #TODO Сдлеать сразу содание класса, при выборе одного из классов(вызывается создание класса) http://stackoverflow.com/questions/8141165/how-to-dynamically-select-a-method-call-in-python
		self.heroClass = utils.getChoice("Choose Your Class:",[
			"Warrior",
			"Ranger",
			"Mage"
		])


		## Выводит полный перечень Того что есть у Персонажа:
	## Уровень Опыт Класс Рассу
	## Статистики (stats, hp, mp, money)
	## Урон
	## Вещи в inventory (инвентаре)
	## Вещи в equipment (обмундировании)
	## Лечебки в potionsPocket
	## Резисты Персонажа
	## Квесты в QuestJournal
	## Заклинания в SpellBook

	def showStats(self):
	#TODO showStats() в hero делать с переносом на новую строку при выводе каждого объекта. При этом с использованием \n и дальше на новой строке код
	#        -Level exp
	#		 +Race Class
	# 		 +Stats
	#        +Damage
	#        +inventory
	#        +equipment
	#        +potionsPocket
	#        +resists
	#        -questJournal
	#        -spellbook
	#
		pass

	## восстанавливает hp и mp
	def heal(self):
		self.stats.hp = self.stats.maxHp
		self.stats.mp = self.stats.maxMp

	## Кастует Заклинание
	def castSpell(self, spell): #TODOlater Сделать когда будет готов класс Spell и SpellBook
		pass

		#TODO Переименовать на action? или еще что-то
	def castSpellChoice(self, hero, enemies):
		pass

	def usePotionChoice(self, hero, enemies):
		choosedPotion = utils.getChoice("What potion to use?", self.potionsPocket.items(), cancel=True)
		if choosedPotion:
			# Если было выбрано одно из зелий
			self.use(choosedPotion)
		else:
			#TODO! Выбрали отмену
			return False

		#вызывает simpleAttack для выбранного монстра
	def attackChoice(self, hero, enemies):
		if len(enemies) > 1:
			choosedEnemy = utils.getChoice("Choose your target:", enemies, cancel=True)
			if choosedEnemy == 0:
				#TODO! Выбрана отмена
				return False
		else:
		# Если один противник - его бьёт автоматически
			choosedEnemy = enemies[0]
		self.simpleAttack(choosedEnemy)

	def doTurn(self, hero, enemies):
		availableBattleChoices = self.getAvailableBattleChoices()
		selectedBattleChoice = utils.getChoice("What would you do?", list(availableBattleChoices.keys()))
		availableBattleChoices[selectedBattleChoice](hero, enemies)


		## Возвращает Словарь с возможными вариантами хода и методом за них отвечающим
	def getAvailableBattleChoices(self):
		battleChoices = {}
		# Simple attack is always available
		battleChoices["Attack with \"{0}\"".format(self.equipment.weapon())] = self.attackChoice
		#if not self.spellBook.isEmpty():
		#   battleChoices["Cast Spell"] = self.castSpellChoice
		if not self.potionsPocket.isEmpty():
			battleChoices["Use Potion"] = self.usePotionChoice
		return battleChoices

		## Одевает item в equipment и убирает из inventory
	def equip(self, item):
		if self.equipment.equipment[item.piece] != "empty":#if there is an item
			self.unequip(self.equipment.equipment[item.piece])
		#now the slot is empty
		self.equipment.equipment[item.piece]=item
		#Если вещь в инвентаре - убрать её оттуда
		self.inventory.removeItem(item)
		#give items Stats bonus and damage/defence
		self.stats.addStats(item.bonusStats)
		if item.isWeapon():
			self.stats.damage.addDamage(item.damage)
		if item.isArmor():
			self.defence+=item.defence

	#Think Нужен ли equipList() - который будет просто вызывать equip для каждой вещи

	## Снимает item из equipment и кладёт в inventory
	def unequip(self, item):
		#remove Stats that this item added
		self.stats.removeStats(self.equipment.equipment[item.piece].bonusStats)
		if item.isWeapon():
			self.stats.damage.removeDamage(item.damage)
		if item.isArmor():
			self.defence-=item.defence
			#add it to inventory
		self.inventory.addItem(self.equipment.equipment[item.piece])
		#make this slot empty
		self.equipment.equipment[item.piece] = "empty"


	## Использует вещь на героя (например Зелье)
	def use(self, item):
		item.use(self)

	## Возвращает true Если герой может использовать это (Spell, weapon, armor и т.п.)
	def canUse(self, object):
		return object.canUse(hero)

	def __str__(self):
		#return '"{0}" Health: {1}/{2} Mana: {3}/{4} {5} Defence: {6}'.format(self.name,self.hp,self.maxHp,self.mp,self.maxMp,self.stats.damage,self.defence)
		return '"{0}"  Health: {1.hp}/{1.maxHp}  Mana: {1.mp}/{1.maxMp}  {1.damage}  Defence: {2}'.format(self.name, self.stats, self.defence)
Ejemplo n.º 3
0
 def inv_button_click_3(self, item):
     myInv = Inventory()
     myInv.addItem("pasta", 22)
     myInv.__str__()
Ejemplo n.º 4
0
 def inv_button_click_2(self, item):
     myInv = Inventory()
     myInv.addItem("carrots", 15)
     myInv.__str__()
Ejemplo n.º 5
0
 def inv_button_click_1(self, item):
     myInv = Inventory()
     myInv.addItem("chicken", 45)
     myInv.__str__()
Ejemplo n.º 6
0
from Inventory import Inventory

myInv = Inventory()
myInv.addItem("chicken", 45)
myInv.addItem("carrots", 15)
myInv.addItem("pasta", 18)

myInv.currQuantity("chicken")

myInv.__str__()
Ejemplo n.º 7
0
class Hero(Entity):
    def __init__(self):

        self.heroRace = Race()
        self.heroClass = ""

        #Получаем Данные от пользователя
        self.getName()
        self.getClass()
        self.getRace()

        super().__init__(self.name, self.heroRace.stats, Elements(), 0)

        ## Инвентарь героя
        self.inventory = Inventory()
        ## Обмундирование героя
        self.equipment = Equipment()
        ## Карман с Лечебками героя
        self.potionsPocket = PotionsPocket()

    ## Получает имя Персонажа
    def getName(
            self):  #TODO! Не получать пустую строку , и чтобы ввод был норм.
        while True:
            self.name = input("Input you name:")
            if self.name:
                # Если что-то было введено - прекратить цикл
                break

    ## Получает Рассу
    def getRace(self):
        #Получаем Расу
        self.heroRace = utils.getChoice(
            "Choose your Race:",
            races)  #TODOlater Сделать вывод по горизонтали

    ## Получает Класс
    def getClass(
        self
    ):  #TODO Сдлеать сразу содание класса, при выборе одного из классов(вызывается создание класса) http://stackoverflow.com/questions/8141165/how-to-dynamically-select-a-method-call-in-python
        self.heroClass = utils.getChoice("Choose Your Class:",
                                         ["Warrior", "Ranger", "Mage"])

        ## Выводит полный перечень Того что есть у Персонажа:

    ## Уровень Опыт Класс Рассу
    ## Статистики (stats, hp, mp, money)
    ## Урон
    ## Вещи в inventory (инвентаре)
    ## Вещи в equipment (обмундировании)
    ## Лечебки в potionsPocket
    ## Резисты Персонажа
    ## Квесты в QuestJournal
    ## Заклинания в SpellBook

    def showStats(self):
        #TODO showStats() в hero делать с переносом на новую строку при выводе каждого объекта. При этом с использованием \n и дальше на новой строке код
        #        -Level exp
        #		 +Race Class
        # 		 +Stats
        #        +Damage
        #        +inventory
        #        +equipment
        #        +potionsPocket
        #        +resists
        #        -questJournal
        #        -spellbook
        #
        pass

    ## восстанавливает hp и mp
    def heal(self):
        self.stats.hp = self.stats.maxHp
        self.stats.mp = self.stats.maxMp

    ## Кастует Заклинание
    def castSpell(
            self, spell
    ):  #TODOlater Сделать когда будет готов класс Spell и SpellBook
        pass

        #TODO Переименовать на action? или еще что-то
    def castSpellChoice(self, hero, enemies):
        pass

    def usePotionChoice(self, hero, enemies):
        choosedPotion = utils.getChoice("What potion to use?",
                                        self.potionsPocket.items(),
                                        cancel=True)
        if choosedPotion:
            # Если было выбрано одно из зелий
            self.use(choosedPotion)
        else:
            #TODO! Выбрали отмену
            return False

        #вызывает simpleAttack для выбранного монстра
    def attackChoice(self, hero, enemies):
        if len(enemies) > 1:
            choosedEnemy = utils.getChoice("Choose your target:",
                                           enemies,
                                           cancel=True)
            if choosedEnemy == 0:
                #TODO! Выбрана отмена
                return False
        else:
            # Если один противник - его бьёт автоматически
            choosedEnemy = enemies[0]
        self.simpleAttack(choosedEnemy)

    def doTurn(self, hero, enemies):
        availableBattleChoices = self.getAvailableBattleChoices()
        selectedBattleChoice = utils.getChoice(
            "What would you do?", list(availableBattleChoices.keys()))
        availableBattleChoices[selectedBattleChoice](hero, enemies)

        ## Возвращает Словарь с возможными вариантами хода и методом за них отвечающим
    def getAvailableBattleChoices(self):
        battleChoices = {}
        # Simple attack is always available
        battleChoices["Attack with \"{0}\"".format(
            self.equipment.weapon())] = self.attackChoice
        #if not self.spellBook.isEmpty():
        #   battleChoices["Cast Spell"] = self.castSpellChoice
        if not self.potionsPocket.isEmpty():
            battleChoices["Use Potion"] = self.usePotionChoice
        return battleChoices

        ## Одевает item в equipment и убирает из inventory
    def equip(self, item):
        if self.equipment.equipment[
                item.piece] != "empty":  #if there is an item
            self.unequip(self.equipment.equipment[item.piece])
        #now the slot is empty
        self.equipment.equipment[item.piece] = item
        #Если вещь в инвентаре - убрать её оттуда
        self.inventory.removeItem(item)
        #give items Stats bonus and damage/defence
        self.stats.addStats(item.bonusStats)
        if item.isWeapon():
            self.stats.damage.addDamage(item.damage)
        if item.isArmor():
            self.defence += item.defence

    #Think Нужен ли equipList() - который будет просто вызывать equip для каждой вещи

    ## Снимает item из equipment и кладёт в inventory
    def unequip(self, item):
        #remove Stats that this item added
        self.stats.removeStats(self.equipment.equipment[item.piece].bonusStats)
        if item.isWeapon():
            self.stats.damage.removeDamage(item.damage)
        if item.isArmor():
            self.defence -= item.defence
            #add it to inventory
        self.inventory.addItem(self.equipment.equipment[item.piece])
        #make this slot empty
        self.equipment.equipment[item.piece] = "empty"

    ## Использует вещь на героя (например Зелье)
    def use(self, item):
        item.use(self)

    ## Возвращает true Если герой может использовать это (Spell, weapon, armor и т.п.)
    def canUse(self, object):
        return object.canUse(hero)

    def __str__(self):
        #return '"{0}" Health: {1}/{2} Mana: {3}/{4} {5} Defence: {6}'.format(self.name,self.hp,self.maxHp,self.mp,self.maxMp,self.stats.damage,self.defence)
        return '"{0}"  Health: {1.hp}/{1.maxHp}  Mana: {1.mp}/{1.maxMp}  {1.damage}  Defence: {2}'.format(
            self.name, self.stats, self.defence)