def armor_class(self): try: max_dex = min(item.max_dex for item in self.ac_items() if item.max_dex is not None) dexterity_modifier = min(max_dex, self.dexterity_modifier()) except ValueError: # If there is no AC item with a max dex dexterity_modifier = self.dexterity_modifier() return 10 + dexterity_modifier + get_total_bonus(self, 'armor class')
def will_save(self): levels = self.levels.values('character_class__id').annotate( Count("id")).order_by() base_save = 0 for level in levels: character_class = CharacterClass.objects.filter( id=level['character_class__id']).get() base_save += self.get_base_save( character_class.good_will_progression, level['id__count'], character_class.is_prestige_class) return base_save + self.wisdom_modifier() + get_total_bonus( self, 'will save')
def burrow_speed(self): speed = self.get_best_speed('burrow') return max(self.safe_race().burrow_speed, speed) + get_total_bonus( self, 'burrow speed')
def climb_speed(self): speed = self.get_best_speed('climb') return max(self.safe_race().climb_speed, speed) + get_total_bonus( self, 'climb speed')
def dexterity(self): return self.base_dexterity + get_total_bonus(self, 'dexterity')
def attack_bonus(self, specific_weapon): # TODO proficiency, weapon properties (enhancement) return self.base_attack_bonus() + self.strength_modifier( ) + get_total_bonus(self, 'attack')
def combat_maneuver_defense(self): return 10 + self.base_attack_bonus() + self.strength_modifier() + self.dexterity_modifier() + \ self.get_special_size_modifier(self.size) + get_total_bonus(self, 'armor class', bonus_types=[ 'circumstance', 'deflection', 'dodge', 'insight', 'luck', 'morale', 'profane', 'sacred', 'penalty' ])
def damage_resistance(self): return 0 + get_total_bonus(self, 'damage resistance')
def charisma(self): return self.base_charisma + get_total_bonus(self, 'charisma')
def hit_points(self): return self.get_starting_hit_points() \ + sum(roll.result for roll in self.roll_set.all()) \ + get_modifier(self.constitution()) * self.level() \ + get_total_bonus(self, 'hit points')
def wisdom(self): return self.base_wisdom + get_total_bonus(self, 'wisdom')
def intelligence(self): return self.base_intelligence + get_total_bonus(self, 'intelligence')
def constitution(self): return self.base_constitution + get_total_bonus(self, 'constitution')
def touch_armor_class(self): return self.armor_class() - get_total_bonus( self, 'armor class', bonus_types=['armor', 'shield', 'natural armor'])
def initiative(self): return get_modifier(self.dexterity()) + get_total_bonus( self, 'initiative')
def flatfooted_armor_class(self): return 10 + get_total_bonus(self, 'armor class') - get_total_bonus( self, 'armor class', bonus_types=['dodge'])
def base_speed(self): return self.safe_race().base_speed + get_total_bonus( self, 'base speed')
def spell_resistance(self): return 0 + get_total_bonus(self, 'spell resistance')
def fly_speed(self): speed = self.get_best_speed('fly') return max(self.safe_race().fly_speed, speed) + get_total_bonus( self, 'fly speed')
def skill_bonus(self, skill): trained_bonus = 3 if (self.trained(skill) and self.class_skill(skill)) else 0 return self.rank_set.filter(to=skill).count() + trained_bonus + self.get_ability_modifier(skill.key_ability) + \ get_total_bonus(self, skill.name.lower())
def swim_speed(self): speed = self.get_best_speed('swim') return max(self.safe_race().swim_speed, speed) + get_total_bonus( self, 'swim speed')
def damage(self, specific_weapon): damage_bonus = self.strength_modifier() + get_total_bonus( self, 'damage') damage = specific_weapon.damage() return f'{damage[0]}d{damage[1]}+{damage_bonus}'
def strength(self): return self.base_strength + get_total_bonus(self, 'strength')