diff --git a/Content.Server/AlertLevel/AlertLevelSystem.cs b/Content.Server/AlertLevel/AlertLevelSystem.cs index 848170ba9d..0b49d7e4bf 100644 --- a/Content.Server/AlertLevel/AlertLevelSystem.cs +++ b/Content.Server/AlertLevel/AlertLevelSystem.cs @@ -96,6 +96,16 @@ public sealed class AlertLevelSystem : EntitySystem RaiseLocalEvent(new AlertLevelPrototypeReloadedEvent()); } + public string GetLevel(EntityUid station, AlertLevelComponent? alert = null) + { + if (!Resolve(station, ref alert)) + { + return string.Empty; + } + + return alert.CurrentLevel; + } + public float GetAlertLevelDelay(EntityUid station, AlertLevelComponent? alert = null) { if (!Resolve(station, ref alert)) diff --git a/Content.Server/StationEvents/Components/AlertLevelInterceptionRuleComponent.cs b/Content.Server/StationEvents/Components/AlertLevelInterceptionRuleComponent.cs new file mode 100644 index 0000000000..6907aa6176 --- /dev/null +++ b/Content.Server/StationEvents/Components/AlertLevelInterceptionRuleComponent.cs @@ -0,0 +1,15 @@ +using Content.Server.StationEvents.Events; +using Content.Server.AlertLevel; +using Robust.Shared.Prototypes; + +namespace Content.Server.StationEvents.Components; + +[RegisterComponent, Access(typeof(AlertLevelInterceptionRule))] +public sealed partial class AlertLevelInterceptionRuleComponent : Component +{ + /// + /// Alert level to set the station to when the event starts. + /// + [DataField] + public string AlertLevel = "blue"; +} diff --git a/Content.Server/StationEvents/Events/AlertLevelInterceptionRule.cs b/Content.Server/StationEvents/Events/AlertLevelInterceptionRule.cs new file mode 100644 index 0000000000..a78a542d3b --- /dev/null +++ b/Content.Server/StationEvents/Events/AlertLevelInterceptionRule.cs @@ -0,0 +1,23 @@ +using Content.Server.GameTicking.Components; +using Content.Server.StationEvents.Components; +using Content.Server.AlertLevel; + +namespace Content.Server.StationEvents.Events; + +public sealed class AlertLevelInterceptionRule : StationEventSystem +{ + [Dependency] private readonly AlertLevelSystem _alertLevelSystem = default!; + + protected override void Started(EntityUid uid, AlertLevelInterceptionRuleComponent component, GameRuleComponent gameRule, + GameRuleStartedEvent args) + { + base.Started(uid, component, gameRule, args); + + if (!TryGetRandomStation(out var chosenStation)) + return; + if (_alertLevelSystem.GetLevel(chosenStation.Value) != "green") + return; + + _alertLevelSystem.SetLevel(chosenStation.Value, component.AlertLevel, true, true, true); + } +} \ No newline at end of file diff --git a/Resources/Audio/Announcements/attributions.yml b/Resources/Audio/Announcements/attributions.yml index 7bc8886f93..593095a660 100644 --- a/Resources/Audio/Announcements/attributions.yml +++ b/Resources/Audio/Announcements/attributions.yml @@ -42,3 +42,8 @@ license: "CC-BY-SA-3.0" copyright: "Paradise, volume and pitch changed, merged with redalert.ogg" source: "https://github.com/ParadiseSS13/Paradise/blob/07b26ee6b4a11a0607986d322ee007020569feae/sound/effects/siren.ogg" + +- files: ["intercept.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from tgstation" + source: "https://github.com/tgstation/tgstation/blob/95731342b97167d7883ff091d389f79c36442ee6/sound/ai/default/intercept.ogg" diff --git a/Resources/Audio/Announcements/intercept.ogg b/Resources/Audio/Announcements/intercept.ogg new file mode 100644 index 0000000000..3569a07d40 Binary files /dev/null and b/Resources/Audio/Announcements/intercept.ogg differ diff --git a/Resources/Locale/en-US/station-events/events/intercept.ftl b/Resources/Locale/en-US/station-events/events/intercept.ftl new file mode 100644 index 0000000000..3f84b027be --- /dev/null +++ b/Resources/Locale/en-US/station-events/events/intercept.ftl @@ -0,0 +1 @@ +station-event-communication-interception = Attention! Enemy communication intercepted. Security level elevated. diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index afc3a10cbd..73475a1184 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -454,6 +454,31 @@ - type: NukeopsRole prototype: Nukeops +- type: entity + id: SleeperAgentsRule + parent: BaseGameRule + noSpawn: true + components: + - type: StationEvent + earliestStart: 25 + weight: 15 + minimumPlayers: 15 + reoccurrenceDelay: 60 + startAnnouncement: station-event-communication-interception + startAudio: + path: /Audio/Announcements/intercept.ogg + - type: AlertLevelInterceptionRule + - type: TraitorRule + - type: AntagSelection + definitions: + - prefRoles: [ Traitor ] + min: 1 + max: 2 + playerRatio: 10 + mindComponents: + - type: TraitorRole + prototype: Traitor + - type: entity id: MassHallucinations parent: BaseGameRule