def add_experience(self, d, stat=None): if isinstance(d, dict): d2 = [] for s, amt in d.items(): self.__dict__[s+"_exp"] += amt while self.__dict__[s+"_exp"] >= 2 * self.__dict__["base_"+s] + 1: self.__dict__[s+"_exp"] -= 2 * self.__dict__["base_"+s] + 1 self.__dict__["base_"+s] += 1 if not s in d2: d2.append(s) self.save() self.update_vars(d2) return d elif isinstance(d, int): if stat: return self.add_experience({stat:d}) else: from main.utils import distribute weights = [1,3,2,2,1,1] exp = distribute(d, weights) s = ['brawn','charm','finesse','lore','magery','stamina'] stats = dict(zip(s,exp)) return self.add_experience(stats) else: return None
def next_round(self): from main.utils import distribute self.turn += 1 self.save() for hero in self.heros(): hero.combat_messages.append([]) hero.save() combatants = Combatant.objects.filter(combat=self, alive=True).all() magerys = map(lambda s: s.__getattribute__("magery"), combatants) num_mp = 5 * len(combatants) mp_gains = distribute(num_mp, magerys) for i in xrange(len(combatants)): combatants[i].mp = min(combatants[i].max_mp, combatants[i].mp + mp_gains[i]) combatants[i].save() Trigger.invoke_triggers(combatants[i], "end of round")