def parse_actions(actions_filename):
    "Output dict mapping actionname to Stuct(use_upperedge, movements)."
    f = TabFile(actions_filename)
    f.head()

    # Action_info_count included "action", "reverse_leftright", "slide_count", "use_upper_edge" #
    action_info_count = 4

    for line in f.parse():
        info = list(f.parse_line(line))

        # 0 > name #
        actionname = info[0]

        # 1-3 > important info #
        reverse_lr, slide_count, use_ue = map(int, info[1:action_info_count])

        if not reverse_lr: transformation = lambda x: (x[0]-10, x[1]+10)
        elif reverse_lr == 1: transformation = reversed
        else: transformation = False

        # 4: > bodyparts and angle ranges #
        bodypart_angle_dict = {}
        for bodypart, raw_angles in parallel(f.header[action_info_count:], info[action_info_count:]):
            if raw_angles:
                angle_range = map(int, parse_definition(raw_angles))
                bodypart_angle_dict[bodypart] = tuple(spread(angle_range, slide_count))
                if transformation and bodypart[-2:] == '_r':
                    left_bodypart = bodypart[:-2]+'_l'
                    bodypart_angle_dict[left_bodypart] = tuple(spread(transformation(angle_range), slide_count))
                else: continue
            else: break

        yield Struct(action=actionname, use_upperedge=use_ue, movements=bodypart_angle_dict)
def init_build(bodyparts_filename):
    "Output set of Struct(bodypart, origin, layer, joints) from raw resources."
    # MAKES LEFT SIDE FROM RIGHT SIDE! #
    # ORIGIN IS (coord1, coord2) #
    f = FaFile(bodyparts_filename)
    for bodypart, subkey_values, entry_value in f.yield_all():
        str_origin, str_layer = tuple(subkey_values)
        layer = int(str_layer)
        joints = {jt_name:map(int, parse_definition(raw_coord)) for jt_name, raw_coord in entry_value}
        origin = joints[str_origin]
        yield Struct(bodypart=bodypart, origin=origin, layer=layer, joints=joints)
        if bodypart[-2:] == '_r':
            left_bodypart = bodypart[:-2]+'_l'
            left_joints = {jt_name[:-2]+'_l':coord for jt_name, coord in joints.iteritems()}
            left_origin = origin
            yield Struct(bodypart=left_bodypart, origin=left_origin, layer=-layer, joints=left_joints)
        else: continue