class Character(db.Model): __tablename__ = 'character' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) player_character = db.Column(db.Boolean, default=False) race = db.relationship("Race", backref="characters") race_id = db.Column(db.Integer, db.ForeignKey('race.id')) character_classes = db.relationship("CharacterClass", lazy='dynamic') abilities = db.relationship("CharacterAbility", lazy='dynamic') skills = db.relationship("CharacterSkill", lazy='dynamic') def get_ability(self, ability): return self.abilities.filter( CharacterAbility.ability.has(name=ability)).first() def get_skill(self, skill): return self.skills.filter(CharacterSkill.skill.has(name=skill)).first() def add_race_modifiers(self): for ability_mod in self.race.ability_mods: iterator = ( char_ability for char_ability in self.abilities if ability_mod.ability.name in char_ability.ability.name) for ability in iterator: ability.score = ability.score + ability_mod.modifier
class CharacterLog(Base, TimestampMixin): character_id = db.Column(db.ForeignKey('character.id'), index=True) character = db.relationship('Character', backref=backref("logs", cascade="all, delete")) log_id = db.Column(db.ForeignKey('adventurelog.id'), index=True) log = db.relationship('AdventureLog', backref=backref("characters", cascade="all, delete")) xp = db.Column(db.Integer, default=0) gold = db.Column(db.Integer, default=0)
class Statistics(db.Model): __tablename__ = 'statistics' id = db.Column(db.Integer, primary_key= True) gender = db.Column(db.String(32)) alignment = db.Column(db.String(32)) level = db.Column(db.Integer, default=1) hp_dice = db.relationship("Dice", uselist=False, backref="hp_dice") strength = db.Column(db.Integer, default=8) dexterity = db.Column(db.Integer, default=8) constitution = db.Column(db.Integer, default=8) intelligence = db.Column(db.Integer, default=8) wisdom = db.Column(db.Integer, default=8) charisma = db.Column(db.Integer, default=8) skills = db.relationship("SkillEntity") race = db.relationship("Race") race_id = db.Column(db.Integer, db.ForeignKey('race.id')) class_info = db.relationship("ClassInfo") class_info_id = db.Column(db.Integer, db.ForeignKey('class_info.id')) character_id = db.Column(db.Integer, db.ForeignKey('character.id')) def get_modifier(self, stat): return int(float(stat - 10)/2) def get_initiative(self): return self.get_modifier(self.dexterity) def get_armor_class(self): return 10 + self.get_modifier(self.dexterity)
class ClassInfo(db.Model): __tablename__ = 'class_info' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) spell_ability = db.relationship("Ability") spell_ability_id = db.Column(db.Integer, db.ForeignKey('ability.id')) skill_proficiencies = db.relationship("Skill", secondary=class_skill_table, backref="class_skills")
class Attack(db.Model): __tablename__ = 'attack' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) damage = db.relationship("Dice", uselist=False, backref="damage_dice") to_hit_mod = db.Column(db.Integer, default=0) damage_mod = db.Column(db.Integer, default=0)
class Player(db.Model): __tablename__ = 'player' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) active = db.Column(db.Boolean, default=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) user = db.relationship('User', backref=db.backref('players', lazy='dynamic'))
class Location(db.Model): __tablename__ = 'address' id = db.Column(db.Integer, primary_key=True) address1 = db.Column(db.String(64)) address2 = db.Column(db.String(64)) city = db.Column(db.String(32)) state = db.Column(db.String(32)) host_id = db.Column(db.Integer, db.ForeignKey('host.id')) host = db.relationship('Host', backref=db.backref('location', lazy='dynamic'))
class RaceAbility(db.Model): __tablename__ = 'race_ability' race_id = db.Column(db.Integer, db.ForeignKey('race.id'), primary_key=True) ability_id = db.Column(db.Integer, db.ForeignKey('ability.id'), primary_key=True) modifier = db.Column(db.Integer) ability = db.relationship("Ability") def __init__(self, ability, modifier): self.ability = ability self.modifier = modifier
class Host(db.Model): __tablename__ = 'host' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) preference = db.relationship("Preference", uselist=False, backref="host") def is_available(self, date): if type(date) is not datetime.date: raise TypeError('arg must be a datetime.date, not a %s' % type(date)) for suspended_date in self.suspended_dates: if date >= suspended_date.from_date and date <= suspended_date.to_date: return False return True
class Race(db.Model): __tablename__ = 'race' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) size = db.Column(db.String(32)) speed = db.Column(db.Integer, default=30) ability_mods = db.relationship("RaceAbility") def get_ability_modifier(self, ability): iterator = (modifier for modifier in self.ability_mods if ability in modifier.ability.name) for modifier in iterator: return modifier return RaceAbility(get_ability(ability), modifier=0)
class AdventureLog(Base, TimestampMixin): date_ran = db.Column(db.DateTime, default=datetime.utcnow) length = db.Column(db.Integer) author_id = db.Column(db.ForeignKey('user.id'), index=True) author = db.relationship('User', backref='logs') def xp_total(self): xp = 0 for character in self.characters: xp = character.xp + xp return xp def gold_total(self): gold = 0 for character in self.characters: gold = character.gold + gold return gold
class CharacterSkill(db.Model): __tablename__ = 'character_skill' character_id = db.Column(db.Integer, db.ForeignKey('character.id'), primary_key=True) proficient = db.Column(db.Boolean, default=False) modifier = db.Column(db.Integer) skill_id = db.Column(db.Integer, db.ForeignKey('skill.id'), primary_key=True) skill = db.relationship("Skill") def __init__(self, skill): self.skill = skill self.proficient = True
class CharacterClass(db.Model): __tablename__ = 'character_class' character_id = db.Column(db.Integer, db.ForeignKey('character.id'), primary_key=True) starting = db.Column(db.Boolean, default=False) level = db.Column(db.Integer) class_info_id = db.Column(db.Integer, db.ForeignKey('class_info.id'), primary_key=True) class_info = db.relationship("ClassInfo") def __init__(self, class_info, level, starting=False): self.class_info = class_info self.level = level self.starting = starting
class Suspend(db.Model): __tablename__ = 'suspend' id = db.Column(db.Integer, primary_key=True) host_id = db.Column(db.Integer, db.ForeignKey('host.id')) host = db.relationship('Host', backref=db.backref('suspended_dates', lazy='dynamic')) from_date = db.Column(db.Date) to_date = db.Column(db.Date) def is_available(self, date): if type(date) is not datetime.date: raise TypeError('arg must be a datetime.date, not a %s' % type(date)) if date >= self.from_date and date <= self.to_date: return False else: return True
class CharacterAbility(db.Model): __tablename__ = 'character_ability' character_id = db.Column(db.Integer, db.ForeignKey('character.id'), primary_key=True) score = db.Column(db.Integer) modifier = db.Column(db.Integer) ability_id = db.Column(db.Integer, db.ForeignKey('ability.id'), primary_key=True) ability = db.relationship("Ability") def __init__(self, ability, score): self.ability = ability self.score = score def __setattr__(self, name, value): # Call the parent class method first. super(CharacterAbility, self).__setattr__(name, value) if (name == "score"): self.modifier = int((self.score - 10) / 2)
class Skill(db.Model): __tablename__ = 'skill' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) ability = db.relationship("Ability") ability_id = db.Column(db.Integer, db.ForeignKey('ability.id'))
class SavingThrow(db.Model): __tablename__ = 'saving_throw' id = db.Column(db.Integer, primary_key=True) ability = db.relationship("Ability", uselist=False, backref="ability_saving_throw")