]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
make thief a subgamemode (#25740)
authordeltanedas <39013340+deltanedas@users.noreply.github.com>
Sat, 2 Mar 2024 16:33:24 +0000 (16:33 +0000)
committerGitHub <noreply@github.com>
Sat, 2 Mar 2024 16:33:24 +0000 (11:33 -0500)
* add SubGamemodes comp/sys

* remove RuleChance from thief rule

* use SubGamemodes for adding thief rule instead of adding ThiefRule component to random gamemodes

* clean up thief rule prototype

* add better logging + end rule if it fails to start

* march 1st incident

* preset ops

* the dreaded

---------

Co-authored-by: deltanedas <@deltanedas:kde.org>
Content.Server/GameTicking/Rules/Components/SubGamemodesComponent.cs [new file with mode: 0644]
Content.Server/GameTicking/Rules/Components/ThiefRuleComponent.cs
Content.Server/GameTicking/Rules/SubGamemodesSystem.cs [new file with mode: 0644]
Content.Server/GameTicking/Rules/ThiefRuleSystem.cs
Resources/Prototypes/GameRules/midround.yml
Resources/Prototypes/GameRules/roundstart.yml
Resources/Prototypes/game_presets.yml

diff --git a/Content.Server/GameTicking/Rules/Components/SubGamemodesComponent.cs b/Content.Server/GameTicking/Rules/Components/SubGamemodesComponent.cs
new file mode 100644 (file)
index 0000000..76ee610
--- /dev/null
@@ -0,0 +1,20 @@
+using Content.Server.GameTicking.Rules;
+using Content.Shared.Storage;
+
+namespace Content.Server.GameTicking.Rules.Components;
+
+/// <summary>
+/// When this gamerule is added it has a chance of adding other gamerules.
+/// Since it's done when added and not when started you can still use normal start logic.
+/// Used for starting subgamemodes in game presets.
+/// </summary>
+[RegisterComponent, Access(typeof(SubGamemodesSystem))]
+public sealed partial class SubGamemodesComponent : Component
+{
+    /// <summary>
+    /// Spawn entries for each gamerule prototype.
+    /// Use orGroups if you want to limit rules.
+    /// </summary>
+    [DataField(required: true)]
+    public List<EntitySpawnEntry> Rules = new();
+}
index 3b0158dcd1ec57d3e7e3b38aacc0411e38e9f4f6..9dfd6e6627cc28127cba50ef5328730346139edd 100644 (file)
@@ -29,12 +29,6 @@ public sealed partial class ThiefRuleComponent : Component
     [DataField]
     public bool PacifistThieves = true;
 
-    /// <summary>
-    /// A chance for this mode to be added to the game.
-    /// </summary>
-    [DataField]
-    public float RuleChance = 1f;
-
     [DataField]
     public ProtoId<AntagPrototype> ThiefPrototypeId = "Thief";
 
diff --git a/Content.Server/GameTicking/Rules/SubGamemodesSystem.cs b/Content.Server/GameTicking/Rules/SubGamemodesSystem.cs
new file mode 100644 (file)
index 0000000..42e7e82
--- /dev/null
@@ -0,0 +1,17 @@
+using Content.Server.GameTicking.Rules.Components;
+using Content.Shared.Storage;
+
+namespace Content.Server.GameTicking.Rules;
+
+public sealed class SubGamemodesSystem : GameRuleSystem<SubGamemodesComponent>
+{
+    protected override void Added(EntityUid uid, SubGamemodesComponent comp, GameRuleComponent rule, GameRuleAddedEvent args)
+    {
+        var picked = EntitySpawnCollection.GetSpawns(comp.Rules, RobustRandom);
+        foreach (var id in picked)
+        {
+            Log.Info($"Starting gamerule {id} as a subgamemode of {ToPrettyString(uid):rule}");
+            GameTicker.AddGameRule(id);
+        }
+    }
+}
index 32f6de608cf3e9e0c52126ca6aac5f1e5e6160be..32f9040f89f990cfe29747c1bdc9c221224de122 100644 (file)
@@ -37,19 +37,19 @@ public sealed class ThiefRuleSystem : GameRuleSystem<ThiefRuleComponent>
     private void OnPlayersSpawned(RulePlayerJobsAssignedEvent ev)
     {
         var query = QueryActiveRules();
-        while (query.MoveNext(out _, out var comp, out _))
+        while (query.MoveNext(out var uid, out _, out var comp, out var gameRule))
         {
-            //Chance to not launch the game rule
-            if (!_random.Prob(comp.RuleChance))
-                continue;
-
             //Get all players eligible for this role, allow selecting existing antags
             //TO DO: When voxes specifies are added, increase their chance of becoming a thief by 4 times >:)
             var eligiblePlayers = _antagSelection.GetEligiblePlayers(ev.Players, comp.ThiefPrototypeId, acceptableAntags: AntagAcceptability.All, allowNonHumanoids: true);
 
             //Abort if there are none
             if (eligiblePlayers.Count == 0)
+            {
+                Log.Warning($"No eligible thieves found, ending game rule {ToPrettyString(uid):rule}");
+                GameTicker.EndGameRule(uid, gameRule);
                 continue;
+            }
 
             //Calculate number of thieves to choose
             var thiefCount = _random.Next(1, comp.MaxAllowThief + 1);
index 28767e2c1808d1112bea92fbf1110d9beb7d7915..37fc4b44cde277893e7cf081b1cd288b47d2b992 100644 (file)
     - CarpRiftsObjective
     - DragonSurviveObjective
 
-# need for admin panel antag create (because the rule doesn't have a roundstart entity like TraitorRule)
 - type: entity
-  id: Thief
-  parent: BaseGameRule
   noSpawn: true
+  parent: BaseGameRule
+  id: Thief
   components:
-  - type: ThiefRule 
+  - type: ThiefRule
 
 - type: entity
   noSpawn: true
index a3ef4a7f0b3306cdcbdfb522b65c5a131139e26c..a836faf500c7516971d2d0c8c37e27d2f26643d9 100644 (file)
@@ -5,6 +5,16 @@
   components:
   - type: GameRule
 
+- type: entity
+  noSpawn: true
+  parent: BaseGameRule
+  id: SubGamemodesRule
+  components:
+  - type: SubGamemodes
+    rules:
+    - id: Thief
+      prob: 0.5
+
 - type: entity
   id: DeathMatch31
   parent: BaseGameRule
@@ -62,8 +72,6 @@
     minPlayers: 20
   - type: NukeopsRule
     faction: Syndicate
-  - type: ThiefRule #the thieves come as an extension of another gamemode
-    ruleChance: 0.5
 
 - type: entity
   id: Pirates
@@ -78,8 +86,6 @@
   noSpawn: true
   components:
   - type: TraitorRule
-  - type: ThiefRule #the thieves come as an extension of another gamemode
-    ruleChance: 0.5
 
 - type: entity
   id: Revolutionary
@@ -87,8 +93,6 @@
   noSpawn: true
   components:
   - type: RevolutionaryRule
-  - type: ThiefRule #the thieves come as an extension of another gamemode
-    ruleChance: 0.5
 
 - type: entity
   id: Sandbox
index f1f16ab9b8a257bae35d1a0742e78adbd9cdd9ae..a5b20a3db68e8297c570c0d42651d17cf18b5e68 100644 (file)
@@ -93,6 +93,7 @@
   showInVote: false
   rules:
     - Traitor
+    - SubGamemodesRule
     - BasicStationEventScheduler
     - BasicRoundstartVariation
 
   showInVote: false
   rules:
     - Nukeops
+    - SubGamemodesRule
     - BasicStationEventScheduler
     - BasicRoundstartVariation
 
   showInVote: false
   rules:
     - Revolutionary
+    - SubGamemodesRule
     - BasicStationEventScheduler
     - BasicRoundstartVariation