def damage(cls, target, amount, actor=None): from trigger import Trigger target.hp -= amount target.save() print "damage:",amount,"target:",target,"hp left:",target.hp Trigger.invoke_triggers(target, "receive damage") if actor: Trigger.invoke_triggers(actor, "deal damage")
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")
def generic_attack(cls, actor, target, stats={}): ''' returns damage dealt (None on miss) case accuracy: 'Inf', attack hits, None: attack misses, else: roll some dice case critical: 'Inf', critical hit, None: normal damage, else: roll some dice case exact_damage: None: roll some dice, else: damage = exact_damage ''' import random, math from trigger import Trigger DEFAULT_STATS = { "accuracy": actor.finesse, "critical": actor.lore, "exact_damage": None, "might": actor.brawn, "weapon": 3, #actor.weapon_power "plus_damage": 0, } stats_in = stats stats = DEFAULT_STATS.copy() stats.update(stats_in) #print "actor:", actor, "target:", target #print "stats:", stats Trigger.invoke_triggers(target, "receive attack") Trigger.invoke_triggers(actor, "deal attack") if (stats['accuracy'] != None) and (float(stats['accuracy']) * 2.0 / 3.0 / target.charm >= random.random()): Trigger.invoke_triggers(target, "receive hit") Trigger.invoke_triggers(actor, "deal hit") else: Trigger.invoke_triggers(target, "receive miss") Trigger.invoke_triggers(actor, "deal miss") return None if stats['exact_damage'] == None: damage = int(math.ceil(stats['might'] * stats['weapon'] * (0.8 + 0.4 * random.random()) / target.stamina)) damage += stats['plus_damage'] else: damage = stats['exact_damage'] if damage > 0: if stats['critical'] != None: if 0.25 * (float(stats['critical'])-target.lore)/target.lore >= random.random(): damage = int(math.ceil(damage * 1.5)) Action.damage(target, damage) else: damage = 0 return damage