From 700bcbf28d39c7dee6e676491392e6307d012e8e Mon Sep 17 00:00:00 2001
From: Super <84590915+SuperGDPWYL@users.noreply.github.com>
Date: Tue, 7 Apr 2026 19:44:17 +0100
Subject: [PATCH] Cause Anomalies to Go Supercritical [Traitor Objective]
(#43505)
* science explosions are projected to go up by 1%
* eof
* huh
* review
* newline
* make it exclusive
---
...upercriticalAnomaliesConditionComponent.cs | 14 +++++++
.../SupercriticalAnomaliesConditionSystem.cs | 41 +++++++++++++++++++
.../conditions/anomaly-supercrit.ftl | 1 +
.../Prototypes/Objectives/objectiveGroups.yml | 6 +++
Resources/Prototypes/Objectives/traitor.yml | 19 +++++++++
5 files changed, 81 insertions(+)
create mode 100644 Content.Server/Objectives/Components/SupercriticalAnomaliesConditionComponent.cs
create mode 100644 Content.Server/Objectives/Systems/SupercriticalAnomaliesConditionSystem.cs
create mode 100644 Resources/Locale/en-US/objectives/conditions/anomaly-supercrit.ftl
diff --git a/Content.Server/Objectives/Components/SupercriticalAnomaliesConditionComponent.cs b/Content.Server/Objectives/Components/SupercriticalAnomaliesConditionComponent.cs
new file mode 100644
index 0000000000..038150d90c
--- /dev/null
+++ b/Content.Server/Objectives/Components/SupercriticalAnomaliesConditionComponent.cs
@@ -0,0 +1,14 @@
+namespace Content.Server.Objectives.Components;
+
+///
+/// Objective condition that requires a certain number of anomalies (defined by ) to go supercritical while the objective is in play.
+///
+[RegisterComponent]
+public sealed partial class SupercriticalAnomaliesConditionComponent : Component
+{
+ ///
+ /// The number of anomalies that have gone supercritical since this objective was added.
+ ///
+ [DataField]
+ public int SupercriticalAnomalies = 0;
+}
diff --git a/Content.Server/Objectives/Systems/SupercriticalAnomaliesConditionSystem.cs b/Content.Server/Objectives/Systems/SupercriticalAnomaliesConditionSystem.cs
new file mode 100644
index 0000000000..93e649def2
--- /dev/null
+++ b/Content.Server/Objectives/Systems/SupercriticalAnomaliesConditionSystem.cs
@@ -0,0 +1,41 @@
+using Content.Server.Objectives.Components;
+using Content.Shared.Anomaly.Components;
+using Content.Shared.Objectives.Components;
+
+namespace Content.Server.Objectives.Systems;
+
+public sealed partial class SupercriticalAnomaliesConditionSystem : EntitySystem
+{
+ [Dependency] private readonly NumberObjectiveSystem _numberObjective = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnAnomalySupercrit);
+ SubscribeLocalEvent(OnGetProgress);
+ }
+
+ private void OnAnomalySupercrit(ref AnomalyShutdownEvent args)
+ {
+ if (!args.Supercritical)
+ return;
+
+ var query = EntityQueryEnumerator();
+ while (query.MoveNext(out var comp))
+ {
+ comp.SupercriticalAnomalies += 1;
+ }
+ }
+
+ private void OnGetProgress(Entity ent, ref ObjectiveGetProgressEvent args)
+ {
+ var target = _numberObjective.GetTarget(ent);
+ if (target == 0)
+ {
+ args.Progress = 0f;
+ return;
+ }
+ args.Progress = MathF.Min((float)ent.Comp.SupercriticalAnomalies / target, 1f);
+ }
+}
diff --git a/Resources/Locale/en-US/objectives/conditions/anomaly-supercrit.ftl b/Resources/Locale/en-US/objectives/conditions/anomaly-supercrit.ftl
new file mode 100644
index 0000000000..358b9e8673
--- /dev/null
+++ b/Resources/Locale/en-US/objectives/conditions/anomaly-supercrit.ftl
@@ -0,0 +1 @@
+objective-condition-supercrit-anomalies-title = Cause {$count} anomalies to go supercritical
diff --git a/Resources/Prototypes/Objectives/objectiveGroups.yml b/Resources/Prototypes/Objectives/objectiveGroups.yml
index 0480a5c9ad..9c524e57af 100644
--- a/Resources/Prototypes/Objectives/objectiveGroups.yml
+++ b/Resources/Prototypes/Objectives/objectiveGroups.yml
@@ -6,6 +6,7 @@
TraitorObjectiveGroupKill: 1
TraitorObjectiveGroupState: 1 #As in, something about your character. Alive, dead, arrested, gained an ability...
TraitorObjectiveGroupSocial: 1 #Involves helping/harming others without killing them or stealing their stuff
+ TraitorObjectiveGroupSabotage: 1
TraitorObjectiveGroupOther: 1
- type: weightedRandom
@@ -45,6 +46,11 @@
# RandomTraitorAliveObjective: 1 - Removed because the objective was boring and didn't progress the round.
RandomTraitorProgressObjective: 1
+- type: weightedRandom
+ id: TraitorObjectiveGroupSabotage
+ weights:
+ SupercritAnomaliesObjective: 1
+
#misc objectives that don't fall other another category
- type: weightedRandom
id: TraitorObjectiveGroupOther
diff --git a/Resources/Prototypes/Objectives/traitor.yml b/Resources/Prototypes/Objectives/traitor.yml
index f8cc42a222..6829084207 100644
--- a/Resources/Prototypes/Objectives/traitor.yml
+++ b/Resources/Prototypes/Objectives/traitor.yml
@@ -378,6 +378,25 @@
stealGroup: NukeDisk
owner: objective-condition-steal-station
+# sabotage
+- type: entity
+ parent: BaseTraitorObjective
+ id: SupercritAnomaliesObjective
+ description: Nanotrasen is very interested in anomalies with potentially catastrophic consequences. Introduce them to the fire they're playing with.
+ components:
+ - type: Objective
+ difficulty: 2
+ icon:
+ sprite: Structures/Specific/anomaly.rsi
+ state: anom1
+ - type: SupercriticalAnomaliesCondition
+ - type: NumberObjective
+ min: 3
+ max: 4
+ title: objective-condition-supercrit-anomalies-title
+ - type: ObjectiveLimit
+ limit: 1
+
# other
- type: entity
parent: BaseTraitorObjective