def ban_kyurem(tiers):
    elements = tiers.findall(".//tier")
    new_bans = set(("Kyurem-W", "Kyurem-B"))
    for element in elements:
        tier = element.attrib["name"]
        gen = element.attrib["gen"]
        if gen != "5": continue
        current_bans = deserialize_bans(element.attrib["pokemons"])
        bans = copy(current_bans)
        p = element
        while 1: 
            parent = p.attrib["banParent"] if "banParent" in p.attrib else None
            if not parent:
                break
            print("Adding {parent} to {tier}'s bans".format(parent=parent,tier=tier))
            p = tiers.find(".//tier[@name='{parent}']".format(parent=parent))
            bans |= deserialize_bans(p.attrib["pokemons"])

        ban_subset = new_bans - bans
        if ban_subset:
            print("Add bans for {pokemon} in {tier}.".format(pokemon=ban_subset, tier=tier))
            ans = input("Proceed with changes? [Y/n] ")
            if ans == "" or ans.upper().startswith("Y"):
                current_bans |= ban_subset
                element.attrib["pokemons"] = serialize_bans(bans)
                print("Tier {tier} updated!".format(tier=tier))
            else:
                print("Tier {tier} not updated.".format(tier=tier))
        else:
            print("Tier {tier} has bans already.".format(tier=tier))

    return tiers
Exemple #2
0
def ban_kyurem(tiers):
    elements = tiers.findall(".//tier")
    new_bans = set(("Kyurem-W", "Kyurem-B"))
    for element in elements:
        tier = element.attrib["name"]
        gen = element.attrib["gen"]
        if gen != "5": continue
        current_bans = deserialize_bans(element.attrib["pokemons"])
        bans = copy(current_bans)
        p = element
        while 1: 
            parent = p.attrib["banParent"] if "banParent" in p.attrib else None
            if not parent:
                break
            print("Adding {parent} to {tier}'s bans".format(parent=parent,tier=tier))
            p = tiers.find(".//tier[@name='{parent}']".format(parent=parent))
            bans |= deserialize_bans(p.attrib["pokemons"])

        ban_subset = new_bans - bans
        if ban_subset:
            print("Add bans for {pokemon} in {tier}.".format(pokemon=ban_subset, tier=tier))
            ans = input("Proceed with changes? [Y/n] ")
            if ans == "" or ans.upper().startswith("Y"):
                current_bans |= ban_subset
                element.attrib["pokemons"] = serialize_bans(bans)
                print("Tier {tier} updated!".format(tier=tier))
            else:
                print("Tier {tier} not updated.".format(tier=tier))
        else:
            print("Tier {tier} has bans already.".format(tier=tier))

    return tiers
def update_tiers(tiers):
    for USAGE_TREE in TIER_TREES:
        all_bans = set(BANLIST.get(USAGE_TREE[0],[]))
        tier_usage = {}
        tier_pokemon = {}
        ban_parent = None
        grand_ban_parent = None
        for tier in USAGE_TREE:
            # Find bans by parent tier top usage
            top_usage = set()
            print("Calculating banlists for {tier}...".format(tier=tier), end = " ")
            if ban_parent:
                print("Downloading ranked stats for {tier}...".format(tier=ban_parent), end=" ")
                stats = get_ranked_stats(ban_parent)
                tier_usage[ban_parent] = dict((s[0], float(s[1])) for s in stats)

                cutoff = SPECIAL_CUTOFFS.get(tier, DEFAULT_CUTOFF)
                tier_pokemon[ban_parent] = [entry[0] for entry in stats if float(entry[1]) >= cutoff]

            # Bans 
            parent_pokemon = tier_pokemon[ban_parent] if ban_parent else set()
            usage_bans = set(parent_pokemon) 
            banlist_bans = set(BANLIST.get(tier,[])) | set(ADDITIONAL_BANS.get(tier,[]))
            pokemon_bans = usage_bans | banlist_bans

            element = tiers.find(".//tier[@name='{tier}']".format(tier=tier))
 
            drops = set()
            if grand_ban_parent:
                # Calculate drops using very heuristic approach.
                for pokemon in tier_usage[grand_ban_parent]:
                    if pokemon not in (all_bans | pokemon_bans) and 0.1 < tier_usage[grand_ban_parent][pokemon] < SPECIAL_CUTOFFS.get(ban_parent, DEFAULT_CUTOFF) and tier_usage[ban_parent].get(pokemon, 0) * 20 < tier_usage[grand_ban_parent][pokemon]:
                        drops.add(pokemon)
            pokemon_bans |= drops            
 
            current_bans = deserialize_bans(element.attrib["pokemons"])
            all_bans = all_bans | pokemon_bans
            missing_bans = pokemon_bans - current_bans
            extra_bans = current_bans - pokemon_bans
            likely_drops = current_bans - all_bans
            removable_bans = extra_bans - likely_drops
            print("Calculated.")
 
            if drops:
                print("Likely dropped from {grand_parent} to {parent}: {pokes}. Added to {tier} ban list.".format(pokes=drops, grand_parent=grand_ban_parent, parent=ban_parent, tier=tier))
            if missing_bans or removable_bans or likely_drops:
                bans = copy(current_bans)
                print("Proposed changes:")
                for reason, missing_subset in (("usage", usage_bans), ("banlist", banlist_bans), ("dropping from grandparent", drops)):
                    ban_subset = missing_subset - current_bans
                    if ban_subset:
                        print("Add bans for {pokemon} as they should be banned by {reason}.".format(pokemon=ban_subset, reason=reason))
                        ans = input("Proceed with changes? [Y/n] ")
                        if ans == "" or ans.upper().startswith("Y"):
                            bans |= ban_subset

                if removable_bans:
                    print("Remove bans for {extra} as they are banned in parent tiers.".format(extra=removable_bans))
                    ans = input("Proceed with changes? [Y/n] ")
                    if ans == "" or ans.upper().startswith("Y"):
                        bans -= removable_bans

                if likely_drops:
                    print("These pokemon have fell in usage or have been removed from banlist {bans} and their bans are to be removed.".format(bans=likely_drops))
                    ans = input("Proceed with changes? [Y/n] ")
                    if ans == "" or ans.upper().startswith("Y"):
                        bans -= likely_drops 

                if bans != current_bans:
                    element.attrib["pokemons"] = serialize_bans(bans)
                    print("Tier {tier} updated!".format(tier=tier))
                else:
                    print("Tier {tier} not updated.".format(tier=tier))
            else:
                print("Tier {tier} seems fine.".format(tier=tier))
            grand_ban_parent = ban_parent
            ban_parent = tier

    return tiers
Exemple #4
0
def update_tiers(tiers):
    for USAGE_TREE in TIER_TREES:
        all_bans = set(BANLIST.get(USAGE_TREE[0],[]))
        tier_usage = {}
        tier_pokemon = {}
        ban_parent = None
        grand_ban_parent = None
        for tier in USAGE_TREE:
            # Find bans by parent tier top usage
            top_usage = set()
            print("Calculating banlists for {tier}...".format(tier=tier), end = " ")
            if ban_parent:
                print("Downloading ranked stats for {tier}...".format(tier=ban_parent), end=" ")
                stats = get_ranked_stats(ban_parent)
                tier_usage[ban_parent] = dict((s[0], float(s[1])) for s in stats)

                cutoff = SPECIAL_CUTOFFS.get(tier, DEFAULT_CUTOFF)
                tier_pokemon[ban_parent] = [entry[0] for entry in stats if float(entry[1]) >= cutoff]

            # Bans 
            parent_pokemon = tier_pokemon[ban_parent] if ban_parent else set()
            usage_bans = set(parent_pokemon) 
            banlist_bans = set(BANLIST.get(tier,[])) | set(ADDITIONAL_BANS.get(tier,[]))
            pokemon_bans = usage_bans | banlist_bans

            element = tiers.find(".//tier[@name='{tier}']".format(tier=tier))
 
            drops = set()
            if grand_ban_parent:
                # Calculate drops using very heuristic approach.
                for pokemon in tier_usage[grand_ban_parent]:
                    if pokemon not in (all_bans | pokemon_bans) and 0.1 < tier_usage[grand_ban_parent][pokemon] < SPECIAL_CUTOFFS.get(ban_parent, DEFAULT_CUTOFF) and tier_usage[ban_parent].get(pokemon, 0) * 20 < tier_usage[grand_ban_parent][pokemon]:
                        drops.add(pokemon)
            pokemon_bans |= drops            
 
            current_bans = deserialize_bans(element.attrib["pokemons"])
            all_bans = all_bans | pokemon_bans
            missing_bans = pokemon_bans - current_bans
            extra_bans = current_bans - pokemon_bans
            likely_drops = current_bans - all_bans
            removable_bans = extra_bans - likely_drops
            print("Calculated.")
 
            if drops:
                print("Likely dropped from {grand_parent} to {parent}: {pokes}. Added to {tier} ban list.".format(pokes=drops, grand_parent=grand_ban_parent, parent=ban_parent, tier=tier))
            if missing_bans or removable_bans or likely_drops:
                bans = copy(current_bans)
                print("Proposed changes:")
                for reason, missing_subset in (("usage", usage_bans), ("banlist", banlist_bans), ("dropping from grandparent", drops)):
                    ban_subset = missing_subset - current_bans
                    if ban_subset:
                        print("Add bans for {pokemon} as they should be banned by {reason}.".format(pokemon=ban_subset, reason=reason))
                        ans = input("Proceed with changes? [Y/n] ")
                        if ans == "" or ans.upper().startswith("Y"):
                            bans |= ban_subset

                if removable_bans:
                    print("Remove bans for {extra} as they are banned in parent tiers.".format(extra=removable_bans))
                    ans = input("Proceed with changes? [Y/n] ")
                    if ans == "" or ans.upper().startswith("Y"):
                        bans -= removable_bans

                if likely_drops:
                    print("These pokemon have fell in usage or have been removed from banlist {bans} and their bans are to be removed.".format(bans=likely_drops))
                    ans = input("Proceed with changes? [Y/n] ")
                    if ans == "" or ans.upper().startswith("Y"):
                        bans -= likely_drops 

                if bans != current_bans:
                    element.attrib["pokemons"] = serialize_bans(bans)
                    print("Tier {tier} updated!".format(tier=tier))
                else:
                    print("Tier {tier} not updated.".format(tier=tier))
            else:
                print("Tier {tier} seems fine.".format(tier=tier))
            grand_ban_parent = ban_parent
            ban_parent = tier

    return tiers