Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

make thief a subgamemode #25740

Merged
merged 8 commits into from
Mar 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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();
}
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down
17 changes: 17 additions & 0 deletions Content.Server/GameTicking/Rules/SubGamemodesSystem.cs
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
10 changes: 5 additions & 5 deletions Content.Server/GameTicking/Rules/ThiefRuleSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,19 +37,19 @@ public override void Initialize()
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);
Expand Down
7 changes: 3 additions & 4 deletions Resources/Prototypes/GameRules/midround.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,12 @@
- 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
Expand Down
16 changes: 10 additions & 6 deletions Resources/Prototypes/GameRules/roundstart.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -78,17 +86,13 @@
noSpawn: true
components:
- type: TraitorRule
- type: ThiefRule #the thieves come as an extension of another gamemode
ruleChance: 0.5

- type: entity
id: Revolutionary
parent: BaseGameRule
noSpawn: true
components:
- type: RevolutionaryRule
- type: ThiefRule #the thieves come as an extension of another gamemode
ruleChance: 0.5

- type: entity
id: Sandbox
Expand Down
3 changes: 3 additions & 0 deletions Resources/Prototypes/game_presets.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@
showInVote: false
rules:
- Traitor
- SubGamemodesRule
- BasicStationEventScheduler
- BasicRoundstartVariation

Expand All @@ -118,6 +119,7 @@
showInVote: false
rules:
- Nukeops
- SubGamemodesRule
- BasicStationEventScheduler
- BasicRoundstartVariation

Expand All @@ -132,6 +134,7 @@
showInVote: false
rules:
- Revolutionary
- SubGamemodesRule
- BasicStationEventScheduler
- BasicRoundstartVariation

Expand Down
Loading