diff --git a/code/modules/admin/antag_panel.dm b/code/modules/admin/antag_panel.dm index a70d509c932..87b05cb320f 100644 --- a/code/modules/admin/antag_panel.dm +++ b/code/modules/admin/antag_panel.dm @@ -186,7 +186,8 @@ GLOBAL_VAR(antag_prototypes) var/uplink_info = "Uplink:" var/datum/component/uplink/U = find_syndicate_uplink() if(U) - uplink_info += "take" + if(!U.uplink_handler.has_objectives) + uplink_info += "take" if (check_rights(R_FUN, 0)) uplink_info += ", [U.uplink_handler.telecrystals] TC" if(U.uplink_handler.has_progression) diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 28a3499e4fb..3b0b6bc95b4 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -78,6 +78,11 @@ return ..() +/datum/antagonist/traitor/on_removal() + if(uplink_handler) + uplink_handler.has_objectives = FALSE + return ..() + /datum/antagonist/traitor/proc/traitor_objective_to_html(datum/traitor_objective/to_display) var/string = "[to_display.name]" if(to_display.objective_state == OBJECTIVE_STATE_ACTIVE || to_display.objective_state == OBJECTIVE_STATE_INACTIVE) diff --git a/code/modules/antagonists/traitor/traitor_objective.dm b/code/modules/antagonists/traitor/traitor_objective.dm index 424b5c91fcc..6c4eb50100f 100644 --- a/code/modules/antagonists/traitor/traitor_objective.dm +++ b/code/modules/antagonists/traitor/traitor_objective.dm @@ -106,7 +106,7 @@ if(global_progression_influence_intensity <= 0) return var/minimum_progression = progression_reward * global_progression_limit_coeff - var/maximum_progression = global_progression_limit_coeff != 0? progression_reward / global_progression_limit_coeff : INFINITY + var/maximum_progression = progression_reward * (2-global_progression_limit_coeff) var/deviance = (SStraitor.current_global_progression - handler.progression_points) / SStraitor.progression_scaling_deviance if(abs(deviance) < global_progression_deviance_required) return @@ -114,9 +114,13 @@ deviance = deviance - global_progression_deviance_required else deviance = deviance + global_progression_deviance_required - var/coeff = NUM_E ** (global_progression_influence_intensity * deviance) - 1 - // This has less of an effect as the coeff gets nearer to 1. Is linear - coeff += progression_cost_coeff * (1 - coeff) + var/coeff = NUM_E ** (global_progression_influence_intensity * abs(deviance)) - 1 + if(abs(deviance) != deviance) + coeff *= -1 + + // This has less of an effect as the coeff gets nearer to -1. Is linear + coeff += progression_cost_coeff * min(max(1 - abs(coeff), 1), 0) + progression_reward = clamp( progression_reward + progression_reward * coeff, diff --git a/code/modules/antagonists/traitor/uplink_handler.dm b/code/modules/antagonists/traitor/uplink_handler.dm index 92430c5a60c..c1aa52a8a30 100644 --- a/code/modules/antagonists/traitor/uplink_handler.dm +++ b/code/modules/antagonists/traitor/uplink_handler.dm @@ -177,8 +177,8 @@ /// Updates the objectives on the uplink and deletes /datum/uplink_handler/proc/update_objectives() - var/list/potential_objectives_copy = potential_objectives.Copy() - for(var/datum/traitor_objective/objective as anything in potential_objectives_copy) + var/list/objectives_copy = potential_objectives + active_objectives + for(var/datum/traitor_objective/objective as anything in objectives_copy) if(progression_points > objective.progression_maximum && !objective.forced) objective.fail_objective(trigger_update = FALSE) continue