def parse_special_abilities(lines):
	retlines = []
	for statblock in yield_statblocks(lines, retlines):
		source = statblock.setdefault("source", {})
		sa_source = source.setdefault("special abilities", {})
		sa = None
		ability = {}
		sa_types = {"Ex": "Extraordinary", "Su": "Supernatural", "Sp": "Spell-Like"}
		for line in sa_source.get("lines", []):
			m = re.match("([A-Z ]*): (.*)", line.strip())
			if m:
				name = cap_name(m.groups()[0])
				description = m.groups()[1].strip()
				sa = statblock.setdefault("special_abilities", [])
				ability = create(
					"special_ability", name=name, description=description)
				sa.append(ability)
				continue

			m = re.match(u"([A-Za-z \u2019-]*) \(([SE][uxp])\) (.*)", line.strip())
			if m:
				name = cap_name(m.groups()[0])
				sa_type = m.groups()[1]
				description = m.groups()[2].strip()
				sa = statblock.setdefault("special_abilities", [])
				ability = create(
					"special_ability", name=name, description=description,
					ability_type=sa_types[sa_type], ability_type_abbrev=sa_type)
				sa.append(ability)
				continue
			ability["description"] = " ".join(
					[ability["description"], line.strip()])
		del source["special abilities"]
	return retlines
Ejemplo n.º 2
0
def parse_gear(lines):
	retlines = []
	for statblock in yield_statblocks(lines, retlines):
		source = statblock.setdefault("source", {})
		gear = source.setdefault("gear", {})
		if gear:
			_handle_gear(statblock, "gear", gear)
		del source["gear"]
	return retlines
Ejemplo n.º 3
0
def parse_tactics(lines):
	retlines = []
	for statblock in yield_statblocks(lines, retlines):
		source = statblock.setdefault("source", {})
		tactics_source = source.setdefault("tactics", {})
		tactics = statblock.setdefault("tactics", {})
		for key in tactics_source:
			_handle_text(tactics, key, tactics_source[key])
		del source["tactics"]
		if len(tactics) == 0:
			del statblock["tactics"]
	return retlines
Ejemplo n.º 4
0
def parse_alignment(lines):
    retlines = []
    for statblock in yield_statblocks(lines, retlines):
        source = statblock.setdefault("source", {})
        alignment = source.setdefault("alignment", {})
        basics = statblock.setdefault("basics", {})
        if alignment:
            if _is_haunt(alignment):
                _parse_haunt(basics, alignment)
            else:
                _parse_alignment(basics, alignment)
        del source["alignment"]
    return retlines
Ejemplo n.º 5
0
def parse_alignment(lines):
	retlines = []
	for statblock in yield_statblocks(lines, retlines):
		source = statblock.setdefault("source", {})
		alignment = source.setdefault("alignment", {})
		basics = statblock.setdefault("basics", {})
		if alignment:
			if _is_haunt(alignment):
				_parse_haunt(basics, alignment)
			else:
				_parse_alignment(basics, alignment)
		del source["alignment"]
	return retlines
Ejemplo n.º 6
0
def parse_defense(lines):
	retlines = []
	for statblock in yield_statblocks(lines, retlines):
		source = statblock.setdefault("source", {})
		defense_source = source.setdefault("defense", {})
		defense = statblock.setdefault("defense", {})
		keys = defense_source.keys()
		for key in keys:
			data = defense_source[key]
			del defense_source[key]
			handler = _get_defense_handler(key)
			handler(defense, key, data)
		del source["defense"]
		if len(defense) == 0:
			del statblock["defense"]
	return retlines
Ejemplo n.º 7
0
def parse_senses(lines):
	retlines = []
	for statblock in yield_statblocks(lines, retlines):
		source = statblock.setdefault("source", {})
		basics = statblock.setdefault("basics", {})
		senses_source = source.setdefault("senses", {})
		content = " ".join([sense.strip() for sense in senses_source.get("lines", [])])
		if content != "":
			parts = [part.strip() for part in split(content, ";")]
			parts = _handle_initiative(basics, parts)
			parts = _handle_senses(basics, parts)
			parts = _handle_perception(statblock, parts)
			if len(parts) > 0:
				raise Exception("Senses line contains unknown parts: %s" % content)
		del source["senses"]
	return retlines
Ejemplo n.º 8
0
def parse_defense(lines):
    retlines = []
    for statblock in yield_statblocks(lines, retlines):
        source = statblock.setdefault("source", {})
        defense_source = source.setdefault("defense", {})
        defense = statblock.setdefault("defense", {})
        keys = defense_source.keys()
        for key in keys:
            data = defense_source[key]
            del defense_source[key]
            handler = _get_defense_handler(key)
            handler(defense, key, data)
        del source["defense"]
        if len(defense) == 0:
            del statblock["defense"]
    return retlines
Ejemplo n.º 9
0
def parse_statistics(lines):
	retlines = []
	for statblock in yield_statblocks(lines, retlines):
		source = statblock.setdefault("source", {})
		stats_source = source.setdefault("statistics", {})
		stats = statblock.setdefault("statistics", {})
		if stats_source:
			keys = stats_source.keys()
			for key in keys:
				data = stats_source[key]
				del stats_source[key]
				handler = _get_stat_handler(key)
				handler(stats, key, data)
		del source["statistics"]
		if len(stats) == 0:
			del statblock["statistics"]
	return retlines
Ejemplo n.º 10
0
def parse_senses(lines):
    retlines = []
    for statblock in yield_statblocks(lines, retlines):
        source = statblock.setdefault("source", {})
        basics = statblock.setdefault("basics", {})
        senses_source = source.setdefault("senses", {})
        content = " ".join(
            [sense.strip() for sense in senses_source.get("lines", [])])
        if content != "":
            parts = [part.strip() for part in split(content, ";")]
            parts = _handle_initiative(basics, parts)
            parts = _handle_senses(basics, parts)
            parts = _handle_perception(statblock, parts)
            if len(parts) > 0:
                raise Exception("Senses line contains unknown parts: %s" %
                                content)
        del source["senses"]
    return retlines
def parse_special_abilities(lines):
    retlines = []
    for statblock in yield_statblocks(lines, retlines):
        source = statblock.setdefault("source", {})
        sa_source = source.setdefault("special abilities", {})
        sa = None
        ability = {}
        sa_types = {
            "Ex": "Extraordinary",
            "Su": "Supernatural",
            "Sp": "Spell-Like"
        }
        for line in sa_source.get("lines", []):
            m = re.match("([A-Z ]*): (.*)", line.strip())
            if m:
                name = cap_name(m.groups()[0])
                description = m.groups()[1].strip()
                sa = statblock.setdefault("special_abilities", [])
                ability = create("special_ability",
                                 name=name,
                                 description=description)
                sa.append(ability)
                continue

            m = re.match(u"([A-Za-z \u2019-]*) \(([SE][uxp])\) (.*)",
                         line.strip())
            if m:
                name = cap_name(m.groups()[0])
                sa_type = m.groups()[1]
                description = m.groups()[2].strip()
                sa = statblock.setdefault("special_abilities", [])
                ability = create("special_ability",
                                 name=name,
                                 description=description,
                                 ability_type=sa_types[sa_type],
                                 ability_type_abbrev=sa_type)
                sa.append(ability)
                continue
            ability["description"] = " ".join(
                [ability["description"], line.strip()])
        del source["special abilities"]
    return retlines
Ejemplo n.º 12
0
def parse_lines(lines):
    retlines = []
    for statblock in yield_statblocks(lines, retlines):
        source = statblock.setdefault("source", {})
        lines = source.setdefault("lines", [])
        content = " ".join([l.strip() for l in lines])
        if content:
            m = re.match("^(.*) \((.*)\)$", content)
            if m:
                content, book = m.groups()
                statblock["book"] = book
            parts = content.split()
            if len(parts) > 0:
                basics = statblock.setdefault("basics", {})
                if parts[0].lower() in ["male", "female"]:
                    basics["sex"] = parts.pop(0)
                _parse_classes(basics, parts)
                basics["race"] = " ".join(parts)
        del source["lines"]
    return retlines
Ejemplo n.º 13
0
def parse_lines(lines):
	retlines = []
	for statblock in yield_statblocks(lines, retlines):
		source = statblock.setdefault("source", {})
		lines = source.setdefault("lines", [])
		content = " ".join([l.strip() for l in lines])
		if content:
			m = re.match("^(.*) \((.*)\)$", content)
			if m:
				content, book = m.groups()
				statblock["book"] = book
			parts = content.split()
			if len(parts) > 0:
				basics = statblock.setdefault("basics", {})
				if parts[0].lower() in ["male", "female"]:
					basics["sex"] = parts.pop(0)
				_parse_classes(basics, parts)
				basics["race"] = " ".join(parts)
		del source["lines"]
	return retlines
Ejemplo n.º 14
0
def parse_offense(lines):
	retlines = []
	for statblock in yield_statblocks(lines, retlines):
		source = statblock.setdefault("source", {})
		offense_source = source.setdefault("offense", {})
		offense = statblock.setdefault("offense", {})
		keys = offense_source.keys()
		print json.dumps(offense_source, indent=2)
		for key in keys:
			data = offense_source[key]
			del offense_source[key]
			handler = _get_offense_handler(key)
			handler(offense, key, data)
		for key in ["melee", "ranged", "space", "speed", "special attacks"]:
			if source.has_key(key):
				data = source[key]
				del source[key]
				handler = _get_offense_handler(key)
				handler(offense, key, data)

		del source["offense"]
	return retlines
Ejemplo n.º 15
0
def parse_offense(lines):
    retlines = []
    for statblock in yield_statblocks(lines, retlines):
        source = statblock.setdefault("source", {})
        offense_source = source.setdefault("offense", {})
        offense = statblock.setdefault("offense", {})
        keys = offense_source.keys()
        print json.dumps(offense_source, indent=2)
        for key in keys:
            data = offense_source[key]
            del offense_source[key]
            handler = _get_offense_handler(key)
            handler(offense, key, data)
        for key in ["melee", "ranged", "space", "speed", "special attacks"]:
            if source.has_key(key):
                data = source[key]
                del source[key]
                handler = _get_offense_handler(key)
                handler(offense, key, data)

        del source["offense"]
    return retlines