AntagRandomObjectivesSystem.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using Content.Server.Antag.Components;
  2. using Content.Server.Objectives;
  3. using Content.Shared.Mind;
  4. using Content.Shared.Objectives.Components;
  5. using Content.Shared.Objectives.Systems;
  6. using Robust.Shared.Random;
  7. namespace Content.Server.Antag;
  8. /// <summary>
  9. /// Adds fixed objectives to an antag made with <c>AntagRandomObjectivesComponent</c>.
  10. /// </summary>
  11. public sealed class AntagRandomObjectivesSystem : EntitySystem
  12. {
  13. [Dependency] private readonly IRobustRandom _random = default!;
  14. [Dependency] private readonly SharedMindSystem _mind = default!;
  15. [Dependency] private readonly ObjectivesSystem _objectives = default!;
  16. public override void Initialize()
  17. {
  18. base.Initialize();
  19. SubscribeLocalEvent<AntagRandomObjectivesComponent, AfterAntagEntitySelectedEvent>(OnAntagSelected);
  20. }
  21. private void OnAntagSelected(Entity<AntagRandomObjectivesComponent> ent, ref AfterAntagEntitySelectedEvent args)
  22. {
  23. if (!_mind.TryGetMind(args.Session, out var mindId, out var mind))
  24. {
  25. Log.Error($"Antag {ToPrettyString(args.EntityUid):player} was selected by {ToPrettyString(ent):rule} but had no mind attached!");
  26. return;
  27. }
  28. var difficulty = 0f;
  29. foreach (var set in ent.Comp.Sets)
  30. {
  31. if (!_random.Prob(set.Prob))
  32. continue;
  33. for (var pick = 0; pick < set.MaxPicks && ent.Comp.MaxDifficulty > difficulty; pick++)
  34. {
  35. var remainingDifficulty = ent.Comp.MaxDifficulty - difficulty;
  36. if (_objectives.GetRandomObjective(mindId, mind, set.Groups, remainingDifficulty) is not { } objective)
  37. continue;
  38. _mind.AddObjective(mindId, mind, objective);
  39. var adding = Comp<ObjectiveComponent>(objective).Difficulty;
  40. difficulty += adding;
  41. Log.Debug($"Added objective {ToPrettyString(objective):objective} to {ToPrettyString(args.EntityUid):player} with {adding} difficulty");
  42. }
  43. }
  44. }
  45. }