if (previous)
{
auto accelerating = current->matrix_orig.layers[6].weight >= previous->matrix_orig.layers[6].weight &&
current->matrix_orig.layers[6].playback_rate >= previous->matrix_orig.layers[6].playback_rate;
if (!(current->flags.has(FL_ONGROUND)) || !(previous->flags.has(FL_ONGROUND)))
accelerating = false;
if (accelerating)
{
auto best_match = std::make_pair(side_original, FLT_MAX);
for (int i = side_left; i <= side_right; ++i)
{
auto current_side = ANIMFIX->get_matrix_side(current, i);
if (current_side->layers[6].sequence != current->matrix_orig.layers[6].sequence)
continue;
const auto delta_weight = fabsf(current_side->layers[6].weight - current->matrix_orig.layers[6].weight);
const auto delta_cycle = fabsf(current_side->layers[6].cycle - current->matrix_orig.layers[6].cycle);
const auto delta_rate = fabsf(current_side->layers[6].playback_rate - current->matrix_orig.layers[6].playback_rate);
const auto delta_total = delta_weight + delta_cycle + delta_rate;
if (delta_total < best_match.second)
best_match = { static_cast<simulate_side_t>(i), delta_total };
if (delta_weight < 0.000001f || delta_cycle < 0.000001f || delta_rate < 0.000001f)
best_match = { static_cast<simulate_side_t>(i), 0.f };
}
if (best_match.second < FLT_MAX)
{
info.side = best_match.first;
info.mode = XOR("layers");
info.anim_resolve_ticks = HACKS->global_vars->tickcount;
info.resolved = true;
}
}
}