Example #1
0
def scrape_monster(buffer, name, cr, monsters, spell_profiles, spell_like_profiles, page, source, flavor_text, description):
    monster = Monster(name, cr)

    ##Flavor Text and Description
    monster.flavor_text = flavor_text
    monster.description = description

    ## General
    #Typeline
    monster.type = get_string('[LEGCN]{1,2} (Fine|Diminutive|Tiny|Small|Medium|Large|Huge|Gargantuan|Colossal).+', buffer)
    #Classline
    monster.classline = get_class_line(buffer)
    # Initiative Bonus
    monster.init = get_signed_integer('(?<=Init ).\d+', buffer)
    # Senses
    monster.senses = get_csv('(?<=Senses ).+(?=;)', buffer)
    # Perception Bonus
    monster.perception = get_signed_integer('(?<=Perception ).\d+', buffer)
    # Auras
    monster.aura = get_csv('(?<=Aura ).+', buffer)

    ## Defense
    # AC and Bonuses
    monster.ac = get_integer('(?<=AC )\d+', buffer)
    monster.ac_touch = get_integer('(?<=touch )\d+', buffer)
    monster.ac_flat_footed = get_integer('(?<=flat-footed )\d+', buffer)
    monster.ac_bonuses = get_csv('((?<=flat-footed \d\d \()|(?<=flat-footed \d \()).+(?=\))', buffer)
    # HP & Special Rules
    monster.hp = get_string('(?<=hp )[0-9\(\)d\+– ]+(?=[;\n])', buffer)
    monster.health_rules = get_string('(?<=\d\); ).+(?=\nFort)', buffer)
    # Saves
    monster.save_fortitude = get_signed_integer('(?<=Fort ).\d+', buffer)
    monster.save_reflex = get_signed_integer('(?<=Ref ).\d+', buffer)
    monster.save_will = get_signed_integer('(?<=Will ).\d+', buffer)
    monster.saving_throw_modifiers = get_csv('((?<=Will \+\d; )|(?<=Will \+\d\d; )).+', buffer)
    # Resistences, Immunities and Weaknesses
    monster.spell_resist = get_integer('(?<=SR )\d+', buffer)
    monster.damage_reductions = get_csv('(?<=DR )[\d\/, \w]+', buffer)
    monster.immunities = get_csv('(?<=Immune )[\d \w\+\(\)–,]+', buffer)
    monster.weaknesses = get_csv('(?<=Weaknesses )[\d \w\+\(\)–,]+', buffer)
    monster.resistences = get_csv('(?<=Resist )[\d \w\+\(\)–,]+', buffer)
    # Defenseive Abilities
    monster.defensive_abilities = get_csv('(?<=Defensive Abilities )[\d \w\+\(\)–,]+', buffer)

    ## Offense
    # Speed Profile
    monster.speed_profile = get_string('(?<=Speed ).+', buffer)
    # Attacks
    monster.melee_profile = get_string('(?<=Melee ).+', buffer)
    monster.ranged_profile = get_string('(?<=Ranged ).+', buffer)
    monster.special_attacks = get_string('(?<=Special Attacks ).+', buffer)
    # Space & Reach
    monster.space = get_integer('(?<=Space )\d+', buffer)
    monster.reach = get_integer('(?<=Reach )\d+', buffer)
    # Offensive Abilities
    monster.offensive_abilities = get_csv('(?<=Offensive Abilities )[\d \w\+\(\)–,]+', buffer)

    ##Statistics
    # Ability Scores
    monster.strength = get_integer('(?<=\nStr )\d+', buffer)
    monster.dexterity = get_integer('(?<=, Dex )\d+', buffer)
    monster.constitution = get_integer('(?<=, Con )\d+', buffer)
    monster.intelligence = get_integer('(?<=, Int )\d+', buffer)
    monster.wisdom = get_integer('(?<=, Wis )\d+', buffer)
    monster.charisma = get_integer('(?<=, Cha )\d+', buffer)
    # Base Attack Bonus
    monster.base_attack_bonus = get_integer('(?<=Base Atk \+)\d+', buffer)
    # Combat Maneuver Bonus & Defense
    monster.combat_maneuver_bonus = get_signed_integer('(?<=CMB ).\d+', buffer)
    monster.combat_maneuver_defense = get_integer('(?<=CMD )\d+', buffer)
    # Feats, Skills and Languages
    monster.feats = get_csv('(?<=Feats ).+', buffer)
    monster.skills = get_csv('(?<=Skills )[A-Za-z \(\)\+–—,\d]+', buffer)
    monster.racial_skill_modifiers = get_csv('(?<=Racial Modifiers )[A-Za-z \(\)\+–,\d]+', buffer)
    monster.languages = get_csv('(?<=Languages )[A-Za-z\d,\.\' ]+', buffer)
    monster.language_special_rules = get_language_special_rules(buffer)
    # Special Qualities
    monster.special_qualities = get_string('(?<=SQ ).+', buffer)

    ##Ecology
    # Enviroment, Organization, Treasure
    monster.environment = get_string('(?<=Environment ).+', buffer)
    monster.organization = get_string('(?<=Organization ).+', buffer)
    monster.treasure = get_string('(?<=Treasure ).+', buffer)

    # Encode the buffer for spellcasting checks
    buffer = buffer

    ## Spellcasting, Spell-Like Abilities and Psychic Magic
    # Psychic Magic
    monster.psychic_magic_caster_level = get_integer('(?<=Psychic Magic \(CL )\d+', buffer)

    if monster.psychic_magic_caster_level != 0:
        # Concentration
        monster.psychic_magic_concentration = get_integer('((?<=Psychic Magic \(CL \d\w\w; concentration \+)|(?<=Psychic Magic \(CL \d\d\w\w; concentration \+))\d+', buffer)
        # Energy Pool and Abilities
        result = get_psychic_pool_and_abilities(buffer)
        monster.psychic_energy_pool = int(result[0])
        monster.psychic_magic_abilities = split_csv(result[1])

    # Spellcasting
    result = get_spell_casting_profiles(buffer, monster.name, source)
    monster.spellcaster = result[0]
    if monster.spellcaster is True:
        for s in range(1, len(result)):
            spell_profiles.append(result[s])

    # Spell-Like Abilities
    result = get_spell_like_ability_profiles(buffer, monster.name, source)
    monster.spell_like_abilities = result[0]
    if monster.spell_like_abilities is True:
        for s in range(1, len(result)):
            spell_like_profiles.append(result[s])

    ## Tactics
    monster.tactics_before_combat = get_string('(?<=Before Combat ).+', buffer)
    monster.tactics_during_combat = get_string('(?<=During Combat ).+', buffer)
    monster.tactics_base_statistics = get_string('(?<=Base Statistics ).+', buffer)
    monster.combat_gear = get_csv('(?<=Combat Gear ).+', buffer)

    monster.boon = get_string('(?<=Boon ).+', buffer)

    # Add Source
    monster.page = page
    monster.source = source
    monsters.append(monster)