diff --git a/hydra.c b/hydra.c index 25275e5..00a32aa 100644 --- a/hydra.c +++ b/hydra.c @@ -1562,26 +1562,23 @@ void hydra_kill_head(int head_no, int killit, int fail) { } void hydra_increase_fail_count(int target_no, int head_no) { - int i, k; + int i, k, ok, maxfail = 0; if (target_no < 0) return; + if (hydra_targets[target_no]->ok) { + const int tasks = hydra_options.tasks; + const int success = tasks - hydra_targets[target_no]->failed; + const int t = tasks < 5 ? 6 - tasks : 1; + const int s = success < 5 ? 6 - success : 1; + maxfail = MAXFAIL + t + s + 2; + } + hydra_targets[target_no]->fail_count++; if (debug) - printf("[DEBUG] hydra_increase_fail_count: %d >= %d => disable\n", hydra_targets[target_no]->fail_count, - MAXFAIL + (hydra_options.tasks <= 4 && hydra_targets[target_no]->ok ? 6 - hydra_options.tasks : 1) + (hydra_options.tasks - hydra_targets[target_no]->failed < 5 - && hydra_targets[target_no]->ok ? 6 - (hydra_options.tasks - - hydra_targets - [target_no]->failed) : 1) - + (hydra_targets[target_no]->ok ? 2 : -2)); - if (hydra_targets[target_no]->fail_count >= - MAXFAIL + (hydra_options.tasks <= 4 && hydra_targets[target_no]->ok ? 6 - hydra_options.tasks : 1) + (hydra_options.tasks - hydra_targets[target_no]->failed < 5 - && hydra_targets[target_no]->ok ? 6 - (hydra_options.tasks - - hydra_targets - [target_no]->failed) : 1) + - (hydra_targets[target_no]->ok ? 2 : -2) - ) { + printf("[DEBUG] hydra_increase_fail_count: %d >= %d => disable\n", hydra_targets[target_no]->fail_count, maxfail); + if (hydra_targets[target_no]->fail_count >= maxfail) { k = 0; for (i = 0; i < hydra_options.max_use; i++) if (hydra_heads[i]->active >= 0 && hydra_heads[i]->target_no == target_no)