]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Nuke agent is separete role (#15385)
authorlzk228 <124214523+lzk228@users.noreply.github.com>
Mon, 1 May 2023 14:20:56 +0000 (17:20 +0300)
committerGitHub <noreply@github.com>
Mon, 1 May 2023 14:20:56 +0000 (00:20 +1000)
Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs
Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs
Resources/Locale/en-US/prototypes/roles/antags.ftl
Resources/Prototypes/Roles/Antags/nukeops.yml

index 3df94d9eed2789e133ff836e65e51ea4225611d2..e53d01994b66800d8fc3ee0913a2355bc6f5c699 100644 (file)
@@ -53,6 +53,9 @@ public sealed class NukeopsRuleComponent : Component
     [DataField("operativeRoleProto", customTypeSerializer: typeof(PrototypeIdSerializer<StartingGearPrototype>))]
     public string OperativeRoleProto = "Nukeops";
 
+    [DataField("medicRoleProto", customTypeSerializer: typeof(PrototypeIdSerializer<StartingGearPrototype>))]
+    public string MedicRoleProto = "NukeopsMedic";
+
     [DataField("commanderStartingGearProto", customTypeSerializer: typeof(PrototypeIdSerializer<StartingGearPrototype>))]
     public string CommanderStartGearPrototype = "SyndicateCommanderGearFull";
 
index 2d372cf3d56efee91d6fc79a118cb1854555af11..e7171c562746e7c275975f7ac58b5e4be761f19b 100644 (file)
@@ -408,8 +408,10 @@ public sealed class NukeopsRuleSystem : GameRuleSystem<NukeopsRuleComponent>
             var playersPerOperative = nukeops.PlayersPerOperative;
             var maxOperatives = nukeops.MaxOperatives;
 
+            // Dear lord what is happening HERE.
             var everyone = new List<IPlayerSession>(ev.PlayerPool);
             var prefList = new List<IPlayerSession>();
+            var medPrefList = new List<IPlayerSession>();
             var cmdrPrefList = new List<IPlayerSession>();
             var operatives = new List<IPlayerSession>();
 
@@ -427,7 +429,10 @@ public sealed class NukeopsRuleSystem : GameRuleSystem<NukeopsRuleComponent>
                 {
                     prefList.Add(player);
                 }
-
+                if (profile.AntagPreferences.Contains(nukeops.MedicRoleProto))
+                   {
+                       medPrefList.Add(player);
+                   }
                 if (profile.AntagPreferences.Contains(nukeops.CommanderRolePrototype))
                 {
                     cmdrPrefList.Add(player);
@@ -438,31 +443,38 @@ public sealed class NukeopsRuleSystem : GameRuleSystem<NukeopsRuleComponent>
 
             for (var i = 0; i < numNukies; i++)
             {
+                // TODO: Please fix this if you touch it.
                 IPlayerSession nukeOp;
                 // Only one commander, so we do it at the start
                 if (i == 0)
                 {
                     if (cmdrPrefList.Count == 0)
                     {
-                        if (prefList.Count == 0)
+                        if (medPrefList.Count == 0)
                         {
-                            if (everyone.Count == 0)
+                            if (prefList.Count == 0)
                             {
-                                Logger.InfoS("preset",
-                                    "Insufficient ready players to fill up with nukeops, stopping the selection");
-                                break;
+                                if (everyone.Count == 0)
+                                {
+                                    Logger.InfoS("preset", "Insufficient ready players to fill up with nukeops, stopping the selection");
+                                    break;
+                                }
+                                nukeOp = _random.PickAndTake(everyone);
+                                Logger.InfoS("preset", "Insufficient preferred nukeop commanders, agents or nukies, picking at random.");
+                            }
+                            else
+                            {
+                                nukeOp = _random.PickAndTake(prefList);
+                                everyone.Remove(nukeOp);
+                                Logger.InfoS("preset", "Insufficient preferred nukeop commander or agents, picking at random from regular op list.");
                             }
-
-                            nukeOp = _random.PickAndTake(everyone);
-                            Logger.InfoS("preset",
-                                "Insufficient preferred nukeop commanders or nukies, picking at random.");
                         }
                         else
                         {
-                            nukeOp = _random.PickAndTake(prefList);
+                            nukeOp = _random.PickAndTake(medPrefList);
                             everyone.Remove(nukeOp);
-                            Logger.InfoS("preset",
-                                "Insufficient preferred nukeop commanders, picking at random from regular op list.");
+                            prefList.Remove(nukeOp);
+                            Logger.InfoS("preset", "Insufficient preferred nukeop commanders, picking an agent");
                         }
                     }
                     else
@@ -470,29 +482,44 @@ public sealed class NukeopsRuleSystem : GameRuleSystem<NukeopsRuleComponent>
                         nukeOp = _random.PickAndTake(cmdrPrefList);
                         everyone.Remove(nukeOp);
                         prefList.Remove(nukeOp);
+                        medPrefList.Remove(nukeOp);
                         Logger.InfoS("preset", "Selected a preferred nukeop commander.");
                     }
                 }
-                else
+                else if (i == 1)
                 {
-                    if (prefList.Count == 0)
+                    if (medPrefList.Count == 0)
                     {
-                        if (everyone.Count == 0)
+                        if (prefList.Count == 0)
                         {
-                            Logger.InfoS("preset",
-                                "Insufficient ready players to fill up with nukeops, stopping the selection");
-                            break;
+                            if (everyone.Count == 0)
+                            {
+                                Logger.InfoS("preset", "Insufficient ready players to fill up with nukeops, stopping the selection");
+                                break;
+                            }
+                            nukeOp = _random.PickAndTake(everyone);
+                            Logger.InfoS("preset", "Insufficient preferred nukeop commanders, agents or nukies, picking at random.");
+                        }
+                        else
+                        {
+                            nukeOp = _random.PickAndTake(prefList);
+                            everyone.Remove(nukeOp);
+                            Logger.InfoS("preset", "Insufficient preferred nukeop commander or agents, picking at random from regular op list.");
                         }
-
-                        nukeOp = _random.PickAndTake(everyone);
-                        Logger.InfoS("preset", "Insufficient preferred nukeops, picking at random.");
                     }
                     else
                     {
-                        nukeOp = _random.PickAndTake(prefList);
+                        nukeOp = _random.PickAndTake(medPrefList);
                         everyone.Remove(nukeOp);
-                        Logger.InfoS("preset", "Selected a preferred nukeop.");
+                        Logger.InfoS("preset", "Insufficient preferred nukeop commanders, picking an agent");
                     }
+
+                }
+                else
+                {
+                    nukeOp = _random.PickAndTake(prefList);
+                    everyone.Remove(nukeOp);
+                    Logger.InfoS("preset", "Selected a preferred nukeop commander.");
                 }
 
                 operatives.Add(nukeOp);
@@ -641,7 +668,7 @@ public sealed class NukeopsRuleSystem : GameRuleSystem<NukeopsRuleComponent>
                 break;
             case 1:
                 name = Loc.GetString("nukeops-role-agent") + " " + _random.PickAndTake(component.OperativeNames[component.NormalNames]);
-                role = component.OperativeRoleProto;
+                role = component.MedicRoleProto;
                 gear = component.MedicStartGearPrototype;
                 break;
             default:
index fb3e14d6770bfb74a29360e40dd7da4b26fb5cc2..21a8809e6923e98f65d6ff8b231ca335054ad6c3 100644 (file)
@@ -16,5 +16,8 @@ roles-antag-suspicion-suspect-objective = Kill the innocents.
 roles-antag-nuclear-operative-commander-name = Nuclear operative commander
 roles-antag-nuclear-operative-commander-objective = Lead your team to the destruction of the station.
 
+roles-antag-nuclear-operative-agent-name = Nuclear operative agent
+roles-antag-nuclear-operative-agent-objective = Like default operative, the team's treatment will have priority.
+
 roles-antag-nuclear-operative-name = Nuclear operative
 roles-antag-nuclear-operative-objective = Find the nuke disk and blow up the station.
index 9dd30256b4cf6a233a953c5439f34cf93e11943b..7370d805a39a0539f5998fdeb85dd4b9006c047c 100644 (file)
@@ -5,6 +5,13 @@
   setPreference: true
   objective: roles-antag-nuclear-operative-objective
 
+- type: antag
+  id: NukeopsMedic
+  name: roles-antag-nuclear-operative-agent-name
+  antagonist: true
+  setPreference: true
+  objective: roles-antag-nuclear-operative-agent-objective
+
 - type: antag
   id: NukeopsCommander
   name: roles-antag-nuclear-operative-commander-name