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)