private float CalculateBracketAngle ( float facing_deg, Vector avoid_bracket_dir_a, Vector avoid_bracket_dir_b, bool is_left, Limb limb ) { if (!limb.IsActiveBracket()) { return 0.0f; } Vector bracket_dir = Panel.GetBracketDirection( is_left, limb.main.IsUnknown() || limb.main.IsPassiveDown() ? -1 : limb.main.panel.index, limb.sub.IsUnknown() || limb.sub.IsPassiveDown() ? -1 : limb.sub.panel.index, limb.extra.IsUnknown() || limb.extra.IsPassiveDown() ? -1 : limb.extra.panel.index ); if (facing_deg == 0.0f) { if (bracket_dir.dx == 1.0f && bracket_dir.dy == 0.0f) { return 0.0f; } } else if (facing_deg == 180.0f) { if (bracket_dir.dx == -1.0f && bracket_dir.dy == 0.0f) { return 0.0f; } } float alignment_a = (bracket_dir.dot(avoid_bracket_dir_a) + 1.0f) / 2.0f; float alignment_b = (bracket_dir.dot(avoid_bracket_dir_b) + 1.0f) / 2.0f; float alignment = alignment_a < alignment_b ? alignment_a : alignment_b; return BAD_BRACKET_DEGREE_COST * ExpInterpolate(alignment, BAD_BRACKET_DEGREE_EXP_CONST); }