From 4f8a2190299891ae2c565eae47deecffffb61824 Mon Sep 17 00:00:00 2001 From: Dethrace Labs <78985374+dethrace-labs@users.noreply.github.com> Date: Thu, 25 Sep 2025 14:49:50 +1200 Subject: [PATCH] ChooseNewObjective effectively matching --- src/DETHRACE/common/opponent.c | 157 +++++++++++++++------------------ 1 file changed, 69 insertions(+), 88 deletions(-) diff --git a/src/DETHRACE/common/opponent.c b/src/DETHRACE/common/opponent.c index 5b45da94..c0e00b5e 100644 --- a/src/DETHRACE/common/opponent.c +++ b/src/DETHRACE/common/opponent.c @@ -1625,16 +1625,17 @@ void ChooseNewObjective(tOpponent_spec* pOpponent_spec, int pMust_choose_one) { if (gTime_stamp_for_this_munging > pOpponent_spec->next_out_of_world_check) { pOpponent_spec->next_out_of_world_check = gTime_stamp_for_this_munging + 500; if (HasCarFallenOffWorld(pOpponent_spec->car_spec)) { - if (pOpponent_spec->car_spec->last_time_we_touched_a_player <= gTime_stamp_for_this_munging - 7000) { - TeleportOpponentToNearestSafeLocation(pOpponent_spec); - NewObjective(pOpponent_spec, eOOT_complete_race); - } else { + if (pOpponent_spec->car_spec->last_time_we_touched_a_player > gTime_stamp_for_this_munging - 7000) { TurnOpponentPhysicsOff(pOpponent_spec); pOpponent_spec->finished_for_this_race = 1; KnackerThisCar(pOpponent_spec->car_spec); pOpponent_spec->car_spec->car_master_actor->t.t.mat.m[3][1] -= 1000.0f; + return; + } else { + TeleportOpponentToNearestSafeLocation(pOpponent_spec); + NewObjective(pOpponent_spec, eOOT_complete_race); + return; } - return; } } if (pOpponent_spec->car_spec->knackered && !pOpponent_spec->knackeredness_detected) { @@ -1656,7 +1657,6 @@ void ChooseNewObjective(tOpponent_spec* pOpponent_spec, int pMust_choose_one) { NewObjective(pOpponent_spec, eOOT_get_near_player); } } - return; } else { if (CAR_SPEC_GET_SPEED_FACTOR(pOpponent_spec->car_spec) == 0.0f) { dr_dprintf("%s: Decided to freeze", pOpponent_spec->car_spec->driver_name); @@ -1672,17 +1672,15 @@ void ChooseNewObjective(tOpponent_spec* pOpponent_spec, int pMust_choose_one) { general_grudge_increase = (pOpponent_spec->nastiness * 40.0f + 10.0f); if (pOpponent_spec->car_spec->scary_bang && pOpponent_spec->player_to_oppo_d < 10.0f) { if (pOpponent_spec->current_objective == eOOT_pursue_and_twat) { - percentage = 40; + pursuit_percentage = 40; } else { - percentage = 0; + pursuit_percentage = 0; } - if (CAR_SPEC_IS_ROZZER(pOpponent_spec->car_spec)) { - if (PercentageChance(20)) { - dr_dprintf("%s: Decided to run away", pOpponent_spec->car_spec->driver_name); - NewObjective(pOpponent_spec, eOOT_run_away); - return; - } - } else if (PercentageChance((percentage + 60) - pOpponent_spec->nastiness * 50.0)) { + if (CAR_SPEC_IS_ROZZER(pOpponent_spec->car_spec) && PercentageChance(20)) { + dr_dprintf("%s: Decided to run away", pOpponent_spec->car_spec->driver_name); + NewObjective(pOpponent_spec, eOOT_run_away); + return; + } else if (PercentageChance((pursuit_percentage + 60) - pOpponent_spec->nastiness * 50.0f)) { dr_dprintf("%s: Decided to run away", pOpponent_spec->car_spec->driver_name); NewObjective(pOpponent_spec, eOOT_run_away); return; @@ -1697,14 +1695,6 @@ void ChooseNewObjective(tOpponent_spec* pOpponent_spec, int pMust_choose_one) { return; } if (pOpponent_spec->car_spec->big_bang && LastTwatterAPlayer(pOpponent_spec) && !AlreadyPursuingCar(pOpponent_spec, pOpponent_spec->car_spec->last_person_to_hit_us)) { - // v4 = gOpponents[pOpponent_spec->index].psyche.grudge_against_player; - // if (v4 <= 20) { - // v4 = 20; - // } - // v5 = general_grudge_increase + v4; - // if (v5 >= 100) { - // LOBYTE(v5) = 100; - // } gOpponents[pOpponent_spec->index].psyche.grudge_against_player = MIN(100, MAX(20, gOpponents[pOpponent_spec->index].psyche.grudge_against_player) + general_grudge_increase); sprintf(str, "%s: Christ! What was that?", pOpponent_spec->car_spec->driver_name); dr_dprintf("%s: Decided to pursue after big bang; last person to twat us was %s", pOpponent_spec->car_spec->driver_name, pOpponent_spec->car_spec->last_person_to_hit_us->driver_name); @@ -1712,14 +1702,6 @@ void ChooseNewObjective(tOpponent_spec* pOpponent_spec, int pMust_choose_one) { return; } if (LastTwatteeAPlayer(pOpponent_spec) && !AlreadyPursuingCar(pOpponent_spec, pOpponent_spec->car_spec->last_person_we_hit)) { - // v6 = gOpponents[pOpponent_spec->index].psyche.grudge_against_player; - // if (v6 <= 20) { - // v6 = 20; - // } - // v7 = general_grudge_increase + v6; - // if (v7 >= 100) { - // LOBYTE(v7) = 100; - // } gOpponents[pOpponent_spec->index].psyche.grudge_against_player = MIN(100, MAX(20, gOpponents[pOpponent_spec->index].psyche.grudge_against_player) + general_grudge_increase); sprintf(str, "%s: Ha! Bet you weren't expecting that!", pOpponent_spec->car_spec->driver_name); dr_dprintf("%s: Decided to pursue %s after accidentally hitting them", pOpponent_spec->car_spec->driver_name, pOpponent_spec->car_spec->last_person_we_hit->driver_name); @@ -1727,15 +1709,7 @@ void ChooseNewObjective(tOpponent_spec* pOpponent_spec, int pMust_choose_one) { return; } if (!AlreadyPursuingCar(pOpponent_spec, &gProgram_state.current_car)) { - if (pOpponent_spec->car_spec->grudge_raised_recently && (!CAR_SPEC_IS_ROZZER(pOpponent_spec->car_spec) || pOpponent_spec->player_to_oppo_d <= 20.0) && LastTwatterAPlayer(pOpponent_spec) && gOpponents[pOpponent_spec->index].psyche.grudge_against_player > 20) { - // v8 = gOpponents[pOpponent_spec->index].psyche.grudge_against_player; - // if (v8 <= 20) { - // v8 = 20; - // } - // v9 = general_grudge_increase + v8; - // if (v9 >= 100) { - // LOBYTE(v9) = 100; - // } + if (pOpponent_spec->car_spec->grudge_raised_recently && (!CAR_SPEC_IS_ROZZER(pOpponent_spec->car_spec) || pOpponent_spec->player_to_oppo_d <= 20.f) && LastTwatterAPlayer(pOpponent_spec) && gOpponents[pOpponent_spec->index].psyche.grudge_against_player > 20) { gOpponents[pOpponent_spec->index].psyche.grudge_against_player = MIN(100, MAX(20, gOpponents[pOpponent_spec->index].psyche.grudge_against_player) + general_grudge_increase); sprintf(str, "%s: Right! That's enough, %s!", pOpponent_spec->car_spec->driver_name, gProgram_state.current_car.driver_name); dr_dprintf("%s: Decided to pursue after grudginess raised; last person to twat us was %s", pOpponent_spec->car_spec->driver_name, pOpponent_spec->car_spec->last_person_to_hit_us->driver_name); @@ -1743,69 +1717,76 @@ void ChooseNewObjective(tOpponent_spec* pOpponent_spec, int pMust_choose_one) { return; } - if ((pOpponent_spec->player_in_view_now) != 0 && (pOpponent_spec->acknowledged_piv) == 0) { - pOpponent_spec->acknowledged_piv = 1; - if (CAR_SPEC_IS_ROZZER(pOpponent_spec->car_spec)) { - pursuit_percentage = (BrVector3Length(&gProgram_state.current_car.v) - gDefinite_no_cop_pursuit_speed) * gCop_pursuit_speed_percentage_multiplier; - } else if (gProgram_state.skill_level + 3 > gNum_of_opponents_pursuing) { - pursuit_percentage = gOpponents[pOpponent_spec->index].psyche.grudge_against_player - 20 + pOpponent_spec->nastiness * 30.f; - } else { - pursuit_percentage = 0; - } + if (pOpponent_spec->player_in_view_now) { + do_it = 0; + if (pOpponent_spec->acknowledged_piv == 0) { - pursuit_percentage += 50 * HeadOnWithPlayerPossible(pOpponent_spec); - do_it = PercentageChance(pursuit_percentage); - dr_dprintf("%s: Spotted player; chance of pursuing %d%%: %s", pOpponent_spec->car_spec->driver_name, pursuit_percentage, do_it ? "YES, Decided to pursue" : "NO, Decided NOT to pursue"); - if (do_it) { - gOpponents[pOpponent_spec->index].psyche.grudge_against_player = MIN(100, MAX(20, gOpponents[pOpponent_spec->index].psyche.grudge_against_player) + general_grudge_increase); - sprintf(str, "%s: I've decided to kill you for the fun of it", pOpponent_spec->car_spec->driver_name); - NewObjective(pOpponent_spec, eOOT_pursue_and_twat, &gProgram_state.current_car); - return; + pOpponent_spec->acknowledged_piv = 1; + if (CAR_SPEC_IS_ROZZER(pOpponent_spec->car_spec)) { + percentage = (BrVector3Length(&gProgram_state.current_car.v) - gDefinite_no_cop_pursuit_speed) * gCop_pursuit_speed_percentage_multiplier; + } else if (gProgram_state.skill_level + 3 > gNum_of_opponents_pursuing) { + percentage = gOpponents[pOpponent_spec->index].psyche.grudge_against_player - 20 + pOpponent_spec->nastiness * 30.f; + } else { + percentage = 0; + } + + percentage += 50 * HeadOnWithPlayerPossible(pOpponent_spec); + do_it = PercentageChance(percentage); + dr_dprintf("%s: Spotted player; chance of pursuing %d%%: %s", pOpponent_spec->car_spec->driver_name, percentage, do_it ? "YES, Decided to pursue" : "NO, Decided NOT to pursue"); + if (do_it) { + gOpponents[pOpponent_spec->index].psyche.grudge_against_player = MIN(100, MAX(20, gOpponents[pOpponent_spec->index].psyche.grudge_against_player) + general_grudge_increase); + sprintf(str, "%s: I've decided to kill you for the fun of it", pOpponent_spec->car_spec->driver_name); + NewObjective(pOpponent_spec, eOOT_pursue_and_twat, &gProgram_state.current_car); + return; + } } } } } } - if (!pMust_choose_one) { - return; - } - dr_dprintf("%s: Choosing new objective because we have to...", pOpponent_spec->car_spec->driver_name); - if (pOpponent_spec->has_moved_at_some_point) { - if (CAR_SPEC_IS_ROZZER(pOpponent_spec->car_spec)) { - NewObjective(pOpponent_spec, eOOT_return_to_start); - return; - } - if (gNum_of_opponents_pursuing + gNum_of_opponents_getting_near >= 3 || pOpponent_spec->player_to_oppo_d <= 10.0) { - if (gNum_of_opponents_completing_race >= 2) { - pursuit_percentage = pOpponent_spec->player_to_oppo_d - 15.0f; - if (PercentageChance(pursuit_percentage)) { - dr_dprintf("%s: Choosing to get_near because chance dictated it (%d%%)", pOpponent_spec->car_spec->driver_name, pursuit_percentage); + if (pMust_choose_one) { + dr_dprintf("%s: Choosing new objective because we have to...", pOpponent_spec->car_spec->driver_name, pOpponent_spec->car_spec->last_person_to_hit_us); + if (pOpponent_spec->has_moved_at_some_point) { + if (CAR_SPEC_IS_ROZZER(pOpponent_spec->car_spec)) { + NewObjective(pOpponent_spec, eOOT_return_to_start); + return; + } else { + if (gNum_of_opponents_getting_near + gNum_of_opponents_pursuing < 3 && pOpponent_spec->player_to_oppo_d > 10.0f) { + dr_dprintf("%s: Choosing to get_near because not enough oppos are yet (%d/%d)", pOpponent_spec->car_spec->driver_name, gNum_of_opponents_getting_near + gNum_of_opponents_pursuing, 3); + NewObjective(pOpponent_spec, eOOT_get_near_player); + return; + } + if (gNum_of_opponents_completing_race < 2) { + dr_dprintf("%s: Choosing to complete_race because not enough oppos are yet (%d/%d)", pOpponent_spec->car_spec->driver_name, gNum_of_opponents_completing_race, 2); + NewObjective(pOpponent_spec, eOOT_complete_race); + return; + } + + percentage = (int)pOpponent_spec->player_to_oppo_d - 15; + if (PercentageChance(percentage)) { + dr_dprintf("%s: Choosing to get_near because chance dictated it (%d%%)", pOpponent_spec->car_spec->driver_name, percentage); NewObjective(pOpponent_spec, eOOT_get_near_player); return; } else { - dr_dprintf("%s: Choosing to complete_race because chance dictated it (%d%%)", pOpponent_spec->car_spec->driver_name, pursuit_percentage); + dr_dprintf("%s: Choosing to complete_race because chance dictated it (%d%%)", pOpponent_spec->car_spec->driver_name, percentage); + NewObjective(pOpponent_spec, eOOT_complete_race); + return; } - } else { - dr_dprintf("%s: Choosing to complete_race because not enough oppos are yet (%d/%d)", pOpponent_spec->car_spec->driver_name, gNum_of_opponents_completing_race, 2); } + + } else if (CAR_SPEC_IS_ROZZER(pOpponent_spec->car_spec)) { + NewObjective(pOpponent_spec, eOOT_wait_for_some_hapless_sod); + return; + } else if (pOpponent_spec->pursue_from_start && !gMellow_opponents) { + gOpponents[pOpponent_spec->index].psyche.grudge_against_player = MIN(100.f, pOpponent_spec->nastiness * 40.f + (MAX(20, gOpponents[pOpponent_spec->index].psyche.grudge_against_player) + 20)); + NewObjective(pOpponent_spec, eOOT_pursue_and_twat, &gProgram_state.current_car); + return; + + } else { NewObjective(pOpponent_spec, eOOT_complete_race); return; } - dr_dprintf("%s: Choosing to get_near because not enough oppos are yet (%d/%d)", pOpponent_spec->car_spec->driver_name, gNum_of_opponents_pursuing + gNum_of_opponents_getting_near, 3); - NewObjective(pOpponent_spec, eOOT_get_near_player); - return; } - if (CAR_SPEC_IS_ROZZER(pOpponent_spec->car_spec)) { - NewObjective(pOpponent_spec, eOOT_wait_for_some_hapless_sod); - return; - } - if (!pOpponent_spec->pursue_from_start || gMellow_opponents) { - NewObjective(pOpponent_spec, eOOT_complete_race); - return; - } - - gOpponents[pOpponent_spec->index].psyche.grudge_against_player = MIN(100, pOpponent_spec->nastiness * 40.0 + (MAX(20, gOpponents[pOpponent_spec->index].psyche.grudge_against_player) + 20)); - NewObjective(pOpponent_spec, eOOT_pursue_and_twat, &gProgram_state.current_car); } }