Пример #1
0
    def useitem(self):
        def handler(consumeables):
            if len(consumeables) == 0:
                eventhandler(InfoEvent('No usable items.'))
                return []
            choices = dict(
                (i + 1, ch) for i, ch in enumerate(consumeables.keys()))
            choices['q'] = None

            def formatter(choice):
                items = consumeables[choice]
                quantityStr = ('' if len(items) == 1 else '[x{}]'.format(
                    len(items)))
                return '{}{}'.format(choice, quantityStr)

            choice = Console.inst.menu(choices, formatter=formatter)
            if choice is None:
                return []
            return [consumeables[choice][0]]

        while True:
            items = self.player.inventory.use(handler)
            if len(items) == 0:
                return False
            item = items[0]
            targets = [self.player]
            targets.extend(self.fighters)
            choices = dict((i + 1, t) for i, t in enumerate(targets))
            choices['b'] = None
            choice = Console.inst.menu(choices, 'Use on whom?')
            eventhandler(ItemUsedEvent(self.player, choice, item))
            if choice is None or not item.use(choice):
                continue
            break
        return True
Пример #2
0
 def addexp(self, xp):
     self.xp += xp
     while self.level < MAX_LEVEL and self.xp >= self.needed:
         self.level += 1
         self.xp -= self.needed
         self.needed = int(self.needed * 1.1)
         eventhandler(LevelUpEvent(self, self.level))
Пример #3
0
 def attack(self, target, spell_name='Attack'):
     roll = D20.roll()
     critical = roll == 20
     if critical:
         hit = True
     else:
         hit = roll > target.ac()
     spell = self.spells[spell_name]
     dmg = spell.crit_damage(target) if critical else spell.damage(target)
     if hit:
         target.health -= max(0, dmg)
     eventhandler(AttackEvent(self, target, hit, dmg, critical))
Пример #4
0
        def handler(consumeables):
            if len(consumeables) == 0:
                eventhandler(InfoEvent('No usable items.'))
                return []
            choices = dict(
                (i + 1, ch) for i, ch in enumerate(consumeables.keys()))
            choices['q'] = None

            def formatter(choice):
                items = consumeables[choice]
                quantityStr = ('' if len(items) == 1 else '[x{}]'.format(
                    len(items)))
                return '{}{}'.format(choice, quantityStr)

            choice = Console.inst.menu(choices, formatter=formatter)
            if choice is None:
                return []
            return [consumeables[choice][0]]
Пример #5
0
    def play(self):
        result = True
        while result:
            encounter = Encounter.random(self.player)
            result = encounter.run()
            eventhandler(InfoEvent(''))
        eventhandler(InfoEvent(self.player.stats(True) + '\n'))

        score = self.player.gold
        score += sum(i.value for i in self.player.inventory)
        score += int((self.player.level - 1) * 1.1 * BASE_XP_NEEDED / 10)
        score += self.player.xp
        eventhandler(InfoEvent('Score: {}'.format(score)))
        return score
Пример #6
0
 def run(self):
     eventhandler(ShopEvent(self))
     eventhandler(InfoEvent('Shops coming soon!!!'))
     eventhandler(ShopClosedEvent(self))
     return True
Пример #7
0
 def run(self):
     eventhandler(BattleEvent(self))
     result = True
     while (result and not self.player.isdead()
            and any(not f.isdead() for f in self.fighters)):
         eventhandler(InfoEvent(self.player.stats()))
         eventhandler(InfoEvent(str(self)))
         while True:
             choices = {'a': 'Attack', 'i': 'Inventory', 'q': 'Quit'}
             choice = Console.inst.menu(choices, 'Choose:').lower()
             if choice.startswith('q'):
                 result = False
                 break
             elif choice.startswith('a'):
                 if self.attack():
                     break
                 else:
                     continue
             elif choice.startswith('i'):
                 if self.useitem():
                     break
                 else:
                     continue
         if not result:
             break
         for _fighter in self.fighters:
             if _fighter.isdead():
                 eventhandler(DeathEvent(_fighter.name))
                 self.player.addexp(_fighter.xp)
                 self.player.gold += _fighter.gold
                 eventhandler(XPEarnedEvent(self.player, _fighter.xp))
                 eventhandler(GoldObtainedEvent(self.player, _fighter.gold))
                 self.fighters.remove(_fighter)
             else:
                 fighter.attack(self.player)
                 if self.player.isdead():
                     break
         Console.inst.print('')
     if self.player.isdead():
         eventhandler(DeathEvent(self.player))
         result = False
     if result:
         eventhandler(VictoryEvent(self))
         # handle reward
     else:
         eventhandler(GameOverEvent(self))
     return result