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