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
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))
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))
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]]
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
def run(self): eventhandler(ShopEvent(self)) eventhandler(InfoEvent('Shops coming soon!!!')) eventhandler(ShopClosedEvent(self)) return True
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