From 967b6098d5802d702c0ddb6e1e9b8215af99c65f Mon Sep 17 00:00:00 2001 From: Mona Hmiza Date: Wed, 11 Sep 2024 16:04:21 +0300 Subject: [PATCH 1/9] Init --- .../GameRules/ScpSl/ScpMarkerComponent.cs | 11 ++ .../ScpSl/ScpSlEscapeZoneComponent.cs | 7 + .../GameRules/ScpSl/ScpSlGameRuleComponent.cs | 29 +++ .../GameRules/ScpSl/ScpSlGameRuleSystem.cs | 170 ++++++++++++++++++ 4 files changed, 217 insertions(+) create mode 100644 Content.Server/_Scp/GameRules/ScpSl/ScpMarkerComponent.cs create mode 100644 Content.Server/_Scp/GameRules/ScpSl/ScpSlEscapeZoneComponent.cs create mode 100644 Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleComponent.cs create mode 100644 Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpMarkerComponent.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpMarkerComponent.cs new file mode 100644 index 00000000000..c463d2b5348 --- /dev/null +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpMarkerComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; + +namespace Content.Server._Scp.GameRules.ScpSl; + + +//Component for marking SCP in SCP:SL gamemode +[RegisterComponent] +public sealed partial class ScpMarkerComponent : Component +{ + +} diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlEscapeZoneComponent.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlEscapeZoneComponent.cs new file mode 100644 index 00000000000..df88cf4947d --- /dev/null +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlEscapeZoneComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Server._Scp.GameRules.ScpSl; + +[RegisterComponent] +public sealed partial class ScpSlEscapeZoneComponent : Component +{ + +} diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleComponent.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleComponent.cs new file mode 100644 index 00000000000..6762e6828d2 --- /dev/null +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleComponent.cs @@ -0,0 +1,29 @@ +using Robust.Shared.Prototypes; + +namespace Content.Server._Scp.GameRules.ScpSl; + +[RegisterComponent] +public sealed partial class ScpSlGameRuleComponent : Component +{ + public int EscapedDClass = 0; + public int EscapedScientists = 0; + + + [DataField] + public List AllowedScps = new List(); + + [DataField] + public EntProtoId MogProtoId; + + [DataField] + public EntProtoId ChaosProtoId; + + [DataField] + public EntProtoId ScientistProtoId; + + [DataField] + public EntProtoId SecurityProtoId; + + [DataField] + public EntProtoId ClassDProtoId; +} diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs new file mode 100644 index 00000000000..2e2fa0d58b0 --- /dev/null +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs @@ -0,0 +1,170 @@ +using System.Linq; +using Content.Server.Cuffs; +using Content.Server.GameTicking; +using Content.Server.GameTicking.Rules; +using Content.Shared.Cuffs.Components; +using Content.Shared.GameTicking.Components; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; +using Content.Shared.NPC.Components; +using Content.Shared.NPC.Systems; +using Robust.Shared.Physics.Events; +using Robust.Shared.Player; + +namespace Content.Server._Scp.GameRules.ScpSl; + +/* + * Конец раунда начнется только если будут сделаны следующие условия - +Победа Мобильно-Оперативной Группы + +-Все SCP-Объекты нейтрализованы +-Сбежало 1-2 ученых +-Сбежало 0 Д-Класса + +Победа Класса-Д + +-Сбежало 1-2 и т.д Д-Класса +-Сбежало 0 Ученых +-1 Объект СЦП Нейтрализован +-Охрана комплекса и МОГ уничтожены + +Победа SCP-Объектов + +-Сбежало 0 Ученых +-Сбежало 0 Д-Класса +-Охрана комплекса и МОГ уничтожены +-Остались только SCP и Хаос (или Только SCP) +-Нейтрализовано 0 SCP + +Ничья + +-Сбежал 1 Д-Класс +-Сбежал 1 Ученый +-Убито 1-2 SCP-Объектов + */ + +public sealed class ScpSlGameRuleSystem : GameRuleSystem +{ + [Dependency] private readonly NpcFactionSystem _npcFactionSystem = default!; + [Dependency] private readonly CuffableSystem _cuffableSystem = default!; + + protected override string SawmillName => "ScpSl"; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnMobStateChanged); + SubscribeLocalEvent(OnEscapeZoneCollide); + } + + private void OnEscapeZoneCollide(Entity ent, ref StartCollideEvent args) + { + var ruleQuery = this.QueryActiveRules(); + + var collidedEntity = args.OtherEntity; + + if (_npcFactionSystem.IsMember(collidedEntity, "ClassDFaction")) + { + if (TryComp(collidedEntity, out var cuffed) + && cuffed.CuffedHandCount > 0 + && _npcFactionSystem.GetNearbyHostiles(collidedEntity, 5f).Any()) + { + //Become MOG + Escaped(EscapedType.Scientist); + return; + } + + //Become Chaos + Escaped(EscapedType.DClass); + return; + } + + if (_npcFactionSystem.IsMember(collidedEntity, "ScientistsFaction")) + { + + if (TryComp(collidedEntity, out var cuffed) + && cuffed.CuffedHandCount > 0 + && _npcFactionSystem.GetNearbyHostiles(collidedEntity, 5f).Any()) + { + //Become Chaos + Escaped(EscapedType.DClass); + return; + } + + //Become MOG + Escaped(EscapedType.Scientist); + return; + } + } + + private void OnMobStateChanged(MobStateChangedEvent ev) + { + if (ev.NewMobState != MobState.Dead) + { + ShouldRoundEnd(); + } + } + + protected override void Started(EntityUid uid, ScpSlGameRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) + { + base.Started(uid, component, gameRule, args); + } + + protected override void Added(EntityUid uid, ScpSlGameRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args) + { + base.Added(uid, component, gameRule, args); + } + + protected override void Ended(EntityUid uid, ScpSlGameRuleComponent component, GameRuleComponent gameRule, GameRuleEndedEvent args) + { + base.Ended(uid, component, gameRule, args); + } + + protected override void AppendRoundEndText(EntityUid uid, + ScpSlGameRuleComponent component, + GameRuleComponent gameRule, + ref RoundEndTextAppendEvent args) + { + base.AppendRoundEndText(uid, component, gameRule, ref args); + } + + private bool ShouldRoundEnd() + { + var scpsQuery = EntityQueryEnumerator(); + var humansQuery = EntityQueryEnumerator(); + + while (scpsQuery.MoveNext(out var scpUid, out var _, out var mobStateComponent, out var xformComponent)) + { + + } + + while (humansQuery.MoveNext(out var humanUid, out var npcFactionComponent, out var mobStateComponent, out var actorComponent)) + { + + } + + return false; + } + + private void Escaped(EscapedType escapedType) + { + var rules = QueryActiveRules(); + + while (rules.MoveNext(out var ruleUid, out var scpRuleComponent, out var ruleComponent)) + { + if (escapedType == EscapedType.Scientist) + { + scpRuleComponent.EscapedScientists++; + return; + } + + scpRuleComponent.EscapedDClass++; + } + } + + private enum EscapedType + { + Scientist, + DClass + } +} From eb1e0df04c2c2717cbc3be3e8ec7419329020f88 Mon Sep 17 00:00:00 2001 From: Mona Hmiza Date: Mon, 16 Sep 2024 10:17:50 +0300 Subject: [PATCH 2/9] wip --- .../GameRules/ScpSl/ScpSlGameRuleSystem.cs | 69 +++++++++++++++++++ .../GameRules/ScpSl/ScpSlSpawnComponent.cs | 22 ++++++ 2 files changed, 91 insertions(+) create mode 100644 Content.Server/_Scp/GameRules/ScpSl/ScpSlSpawnComponent.cs diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs index 2e2fa0d58b0..37aa773b4db 100644 --- a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs @@ -2,6 +2,8 @@ using Content.Server.Cuffs; using Content.Server.GameTicking; using Content.Server.GameTicking.Rules; +using Content.Server.Mind; +using Content.Server.Spawners.Components; using Content.Shared.Cuffs.Components; using Content.Shared.GameTicking.Components; using Content.Shared.Mobs; @@ -10,6 +12,8 @@ using Content.Shared.NPC.Systems; using Robust.Shared.Physics.Events; using Robust.Shared.Player; +using Robust.Shared.Random; +using Robust.Shared.Utility; namespace Content.Server._Scp.GameRules.ScpSl; @@ -47,6 +51,10 @@ public sealed class ScpSlGameRuleSystem : GameRuleSystem { [Dependency] private readonly NpcFactionSystem _npcFactionSystem = default!; [Dependency] private readonly CuffableSystem _cuffableSystem = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly MindSystem _mindSystem = default!; + + protected override string SawmillName => "ScpSl"; @@ -55,6 +63,38 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnMobStateChanged); SubscribeLocalEvent(OnEscapeZoneCollide); + SubscribeLocalEvent(OnPlayerSpawning); + } + + private void OnPlayerSpawning(RulePlayerSpawningEvent ev) + { + var pool = ev.PlayerPool.ShallowClone(); + + SpawnScp(pool); + + Spawn(pool, ScpSlSpawnType.Scientist); + Spawn(pool, ScpSlSpawnType.Security); + Spawn(pool, ScpSlSpawnType.ClassD); + } + + private List> GetSpawnPoints(ScpSlSpawnType spawnType) + { + var spawnPointsQuery = EntityQueryEnumerator(); + + List> spawnPoints = []; + + while (spawnPointsQuery.MoveNext(out var entityUid, out var spawnPointsComponent, out var transformComponent)) + { + if (spawnPointsComponent.SpawnType != spawnType) + { + continue; + } + + var entity = new Entity(entityUid, transformComponent, spawnPointsComponent); + spawnPoints.Add(entity); + } + + return spawnPoints; } private void OnEscapeZoneCollide(Entity ent, ref StartCollideEvent args) @@ -108,6 +148,35 @@ private void OnMobStateChanged(MobStateChangedEvent ev) protected override void Started(EntityUid uid, ScpSlGameRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) { base.Started(uid, component, gameRule, args); + args. + } + + private void Spawn(List pool, ScpSlSpawnType spawnType) + { + var spawnPoints = GetSpawnPoints(spawnType); + + if (spawnPoints.Count == 0) + { + Log.Error($"No spawnpoints provided for {spawnType}"); + return; + } + } + + private void SpawnScp(List pool) + { + var spawnPoints = GetSpawnPoints(ScpSlSpawnType.Scp); + _random.Shuffle(spawnPoints); + + var totalScps = _random.Next(2, spawnPoints.Count); + + for (var i = 0; i < totalScps; i++) + { + var (spawnPoint, xform, spawnComponent) = spawnPoints[i]; + var player = _random.PickAndTake(pool); + + var scp = Spawn(spawnComponent.ScpProto!, xform.Coordinates); + _mindSystem.ControlMob(player.UserId, scp); + } } protected override void Added(EntityUid uid, ScpSlGameRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args) diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlSpawnComponent.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlSpawnComponent.cs new file mode 100644 index 00000000000..82d4d755e8d --- /dev/null +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlSpawnComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.Prototypes; + +namespace Content.Server._Scp.GameRules.ScpSl; + +[RegisterComponent] +public sealed partial class ScpSlSpawnComponent : Component +{ + public EntProtoId? ScpProto { get; set; } + + [DataField(required: true)] + public ScpSlSpawnType SpawnType; +} + +public enum ScpSlSpawnType +{ + ClassD, + Scientist, + Security, + Mog, + Chaos, + Scp +} From a6b554e7d13fd77d4974df5c6b3c237185018e14 Mon Sep 17 00:00:00 2001 From: Mona Hmiza Date: Fri, 4 Oct 2024 20:42:55 +0300 Subject: [PATCH 3/9] SCP-914 stuff --- Content.Client/_Scp/Scp914/Scp914System.cs | 8 + .../Scp914/Ui/Scp914BoundUserInterface.cs | 74 ++++++ .../_Scp/Scp914/Ui/Scp914Window.xaml | 14 ++ .../_Scp/Scp914/Ui/Scp914Window.xaml.cs | 70 ++++++ .../GameRules/ScpSl/ScpSlSpawnComponent.cs | 22 -- Content.Server/_Scp/Scp914/Scp914System.cs | 234 ++++++++++++++++++ Content.Shared/_Scp/Scp914/Scp914UiData.cs | 48 ++++ .../_Scp/Scp914/SharedScp914Data.cs | 86 +++++++ .../_Scp/Scp914/SharedScp914System.cs | 50 ++++ Resources/Audio/_Scp/Scp914/scp914_clack.ogg | Bin 0 -> 7717 bytes Resources/Audio/_Scp/Scp914/scp914_refine.ogg | Bin 0 -> 153020 bytes .../_Scp/Entities/Objects/scp914.yml | 185 ++++++++++++++ 12 files changed, 769 insertions(+), 22 deletions(-) create mode 100644 Content.Client/_Scp/Scp914/Scp914System.cs create mode 100644 Content.Client/_Scp/Scp914/Ui/Scp914BoundUserInterface.cs create mode 100644 Content.Client/_Scp/Scp914/Ui/Scp914Window.xaml create mode 100644 Content.Client/_Scp/Scp914/Ui/Scp914Window.xaml.cs delete mode 100644 Content.Server/_Scp/GameRules/ScpSl/ScpSlSpawnComponent.cs create mode 100644 Content.Server/_Scp/Scp914/Scp914System.cs create mode 100644 Content.Shared/_Scp/Scp914/Scp914UiData.cs create mode 100644 Content.Shared/_Scp/Scp914/SharedScp914Data.cs create mode 100644 Content.Shared/_Scp/Scp914/SharedScp914System.cs create mode 100644 Resources/Audio/_Scp/Scp914/scp914_clack.ogg create mode 100644 Resources/Audio/_Scp/Scp914/scp914_refine.ogg create mode 100644 Resources/Prototypes/_Scp/Entities/Objects/scp914.yml diff --git a/Content.Client/_Scp/Scp914/Scp914System.cs b/Content.Client/_Scp/Scp914/Scp914System.cs new file mode 100644 index 00000000000..d11568ba8de --- /dev/null +++ b/Content.Client/_Scp/Scp914/Scp914System.cs @@ -0,0 +1,8 @@ +using Content.Shared._Scp.Scp914; + +namespace Content.Client._Scp.Scp914; + +public sealed class Scp914System : SharedScp914System +{ + +} diff --git a/Content.Client/_Scp/Scp914/Ui/Scp914BoundUserInterface.cs b/Content.Client/_Scp/Scp914/Ui/Scp914BoundUserInterface.cs new file mode 100644 index 00000000000..6745731e57e --- /dev/null +++ b/Content.Client/_Scp/Scp914/Ui/Scp914BoundUserInterface.cs @@ -0,0 +1,74 @@ +using Content.Client.Anomaly.Ui; +using Content.Shared._Scp.Scp914; +using Robust.Shared.Timing; + +namespace Content.Client._Scp.Scp914.Ui; + +public sealed class Scp914BoundUserInterface : BoundUserInterface +{ + private Scp914Window? _window; + private IGameTiming _gameTiming; + + public Scp914BoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + + _gameTiming = IoCManager.Resolve(); + } + + protected override void Open() + { + base.Open(); + + _window = new Scp914Window(_gameTiming); + _window.OnClose += Close; + _window.OnNewModeSelected += OnNewModeSelected; + _window.OnStartCycle += OnStartCycle; + + if (State != null) + { + UpdateState(State); + } + + _window.OpenCentered(); + } + + private void OnStartCycle() + { + var startCycleMessage = new Scp914StartCycleMessage(); + SendPredictedMessage(startCycleMessage); + } + + private void OnNewModeSelected(Scp914CycleDirection direction) + { + var changeModeMessage = new Scp914ChangeModeRequestMessage(direction); + SendPredictedMessage(changeModeMessage); + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + + if (state is not Scp914BuiState newState) + { + return; + } + + _window?.UpdateState(newState); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + if (_window == null) + { + return; + } + + _window.OnClose -= Close; + _window.OnNewModeSelected -= OnNewModeSelected; + + _window.Dispose(); + _window = null; + } +} diff --git a/Content.Client/_Scp/Scp914/Ui/Scp914Window.xaml b/Content.Client/_Scp/Scp914/Ui/Scp914Window.xaml new file mode 100644 index 00000000000..f039882ea79 --- /dev/null +++ b/Content.Client/_Scp/Scp914/Ui/Scp914Window.xaml @@ -0,0 +1,14 @@ + + + + + + diff --git a/Content.Client/_Scp/Scp914/Ui/Scp914Window.xaml.cs b/Content.Client/_Scp/Scp914/Ui/Scp914Window.xaml.cs new file mode 100644 index 00000000000..12ddd9ddd75 --- /dev/null +++ b/Content.Client/_Scp/Scp914/Ui/Scp914Window.xaml.cs @@ -0,0 +1,70 @@ +using Content.Client.UserInterface.Controls; +using Content.Shared._Scp.Scp914; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Timing; + +namespace Content.Client._Scp.Scp914.Ui; + +[GenerateTypedNameReferences] +public sealed partial class Scp914Window : FancyWindow +{ + public Action? OnNewModeSelected; + public Action? OnStartCycle; + + private IGameTiming _gameTiming; + + private TimeSpan _nextTimeUse; + private bool _active; + + public Scp914Window(IGameTiming gameTiming) + { + RobustXamlLoader.Load(this); + + _gameTiming = gameTiming; + + TurnLeftButton.OnPressed += _ => OnTurnLeftPressed(); + TurnRightButton.OnPressed += _ => OnTurnRightPressed(); + StartCycleBytton.OnPressed += _ => OnStartCyclePressed(); + } + + protected override void FrameUpdate(FrameEventArgs args) + { + base.FrameUpdate(args); + + var disabled = _active || _gameTiming.CurTime < _nextTimeUse; + + TurnLeftButton.Disabled = disabled; + TurnRightButton.Disabled = disabled; + StartCycleBytton.Disabled = disabled; + } + + public void UpdateState(Scp914BuiState newState) + { + CurrentModeLabel.Text = newState.NewMode.ToString(); + _active = newState.Active; + } + + private void OnStartCyclePressed() + { + OnStartCycle?.Invoke(); + SetNextTimeUse(); + } + + private void OnTurnRightPressed() + { + OnNewModeSelected?.Invoke(Scp914CycleDirection.Right); + SetNextTimeUse(); + } + + private void OnTurnLeftPressed() + { + OnNewModeSelected?.Invoke(Scp914CycleDirection.Left); + SetNextTimeUse(); + } + + private void SetNextTimeUse() + { + _nextTimeUse = _gameTiming.CurTime + TimeSpan.FromSeconds(1); + } +} diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlSpawnComponent.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlSpawnComponent.cs deleted file mode 100644 index 82d4d755e8d..00000000000 --- a/Content.Server/_Scp/GameRules/ScpSl/ScpSlSpawnComponent.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Robust.Shared.Prototypes; - -namespace Content.Server._Scp.GameRules.ScpSl; - -[RegisterComponent] -public sealed partial class ScpSlSpawnComponent : Component -{ - public EntProtoId? ScpProto { get; set; } - - [DataField(required: true)] - public ScpSlSpawnType SpawnType; -} - -public enum ScpSlSpawnType -{ - ClassD, - Scientist, - Security, - Mog, - Chaos, - Scp -} diff --git a/Content.Server/_Scp/Scp914/Scp914System.cs b/Content.Server/_Scp/Scp914/Scp914System.cs new file mode 100644 index 00000000000..cb46adcd41c --- /dev/null +++ b/Content.Server/_Scp/Scp914/Scp914System.cs @@ -0,0 +1,234 @@ +using System.Linq; +using Content.Server.Popups; +using Content.Server.Storage.Components; +using Content.Server.Storage.EntitySystems; +using Content.Shared._Scp.Scp914; +using Content.Shared.Interaction; +using Content.Shared.Popups; +using Robust.Server.Audio; +using Robust.Shared.Audio; +using Robust.Shared.Containers; +using Robust.Shared.Random; +using Robust.Shared.Timing; + +namespace Content.Server._Scp.Scp914; + +public sealed class Scp914System : SharedScp914System +{ + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; + [Dependency] private readonly EntityStorageSystem _entityStorageSystem = default!; + [Dependency] private readonly SharedContainerSystem _containerSystem = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly AudioSystem _audioSystem = default!; + [Dependency] private readonly EntityStorageSystem _storageSystem = default!; + [Dependency] private readonly SharedUserInterfaceSystem _userInterfaceSystem = default!; + [Dependency] private readonly PopupSystem _popupSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnInteractHand); + + Subs.BuiEvents(Scp914UiKey.Key, + subscriber => + { + subscriber.Event(OnChangeModeRequest); + subscriber.Event(OnStartCycleRequest); + }); + } + + private void UpdateState(Entity entity) + { + var state = new Scp914BuiState(entity.Comp.CurrentMode, entity.Comp.Active); + _userInterfaceSystem.SetUiState(entity.Owner, Scp914UiKey.Key, state); + } + + private void OnInteractHand(Entity ent, ref InteractHandEvent args) + { + UpdateState(ent); + _userInterfaceSystem.TryOpenUi(ent.Owner, Scp914UiKey.Key, args.User); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + + while (query.MoveNext(out var entityUid, out var scp914Component)) + { + if (!scp914Component.Active || _gameTiming.CurTime <= scp914Component.UpgradeTimeEnd) + continue; + + var scpEntity = new Entity(entityUid, scp914Component); + + scp914Component.Active = false; + ToggleLock(scpEntity, false); + + scp914Component.NextUpgradeTime = _gameTiming.CurTime + scp914Component.UpgradeCooldown; + } + } + + private void OnMapInit(Entity machineEntity, ref MapInitEvent args) + { + var query = EntityQueryEnumerator(); + var machineXform = Transform(machineEntity); + + while (query.MoveNext(out var containerEntity, out var containerXform, out var containerComponent)) + { + if (machineXform.MapID != containerXform.MapID || + !_transformSystem.InRange(machineEntity.Owner, containerEntity, 8f)) + { + continue; + } + + if (containerComponent.ContainerType == Scp914ContainerType.Input) + { + machineEntity.Comp.InputContainer = containerEntity; + } + else + { + machineEntity.Comp.OutputContainer = containerEntity; + } + } + } + + private void OnChangeModeRequest(Entity ent, ref Scp914ChangeModeRequestMessage args) + { + if (ent.Comp.Active) + { + return; + } + + if (ent.Comp.NextChangeCycleTime > _gameTiming.CurTime) + { + return; + } + + var newMode = CycleMod(ent.Comp.CurrentMode, args.Direction); + + ent.Comp.CurrentMode = newMode; + ent.Comp.NextChangeCycleTime = _gameTiming.CurTime + ent.Comp.CycleCooldown; + + _audioSystem.PlayPvs(ent.Comp.ClackSound, ent); + + UpdateState(ent); + Dirty(ent); + } + + private void OnStartCycleRequest(Entity ent, ref Scp914StartCycleMessage args) + { + if (ent.Comp.Active) + { + return; + } + + if (ent.Comp.NextUpgradeTime > _gameTiming.CurTime) + { + var message = Loc.GetString("scp914-cycle-timeout"); + _popupSystem.PopupEntity(message, ent, PopupType.LargeCaution); + return; + } + + _audioSystem.PlayPvs(ent.Comp.ClackSound, ent, AudioParams.Default.WithPitchScale(-10f).WithVariation(0.1f)); + _audioSystem.PlayPvs(ent.Comp.RefineSound, ent); + + ent.Comp.Active = true; + ent.Comp.UpgradeTimeEnd = _gameTiming.CurTime + ent.Comp.UpgradeDuration; + + ToggleLock(ent, true); + ProcessUpgrades(ent); + UpdateState(ent); + + Dirty(ent); + } + + private void ToggleLock(Entity ent, bool lockState) + { + var inputContainer = ent.Comp.InputContainer; + var outputContainer = ent.Comp.OutputContainer; + + if (lockState) + { + _storageSystem.CloseStorage(inputContainer); + _storageSystem.CloseStorage(outputContainer); + } + else + { + _storageSystem.OpenStorage(inputContainer); + _storageSystem.OpenStorage(outputContainer); + } + } + + private void ProcessUpgrades(Entity machineEntity) + { + var inputContainer = GetContainer(machineEntity, Scp914ContainerType.Input); + var outputContainer = GetContainer(machineEntity, Scp914ContainerType.Output); + + var machineMode = machineEntity.Comp.CurrentMode; + + foreach (var containedEntity in inputContainer.ContainedEntities.ToList()) + { + EntityUid? upgradedEntity = containedEntity; + + if (TryComp(containedEntity, out var upgradableComponent)) + { + var upgradableEntity = new Entity(containedEntity, upgradableComponent); + + UpgradeItem(upgradableEntity, machineMode, ref upgradedEntity); + } + + if (upgradedEntity.HasValue) + { + _containerSystem.Insert(upgradedEntity.Value, outputContainer, force: true); + } + } + } + + private void UpgradeItem(Entity upgradableEntity, Scp914Mode machineMode, ref EntityUid? entity) + { + var options = upgradableEntity.Comp.UpgradeOptions; + + Del(upgradableEntity); + + if (!options.TryGetValue(machineMode, out var upgradeOptions)) + { + entity = null; + return; + } + + var randomValue = _random.NextFloat(); + var cumulativeProbability = 0f; + + foreach (var option in upgradeOptions) + { + cumulativeProbability += option.Chanse; + + if (randomValue > cumulativeProbability) + { + continue; + } + + entity = Spawn(option.Item); + } + } + + private BaseContainer GetContainer(Entity machineEntity, Scp914ContainerType containerType) + { + BaseContainer container; + + if (containerType == Scp914ContainerType.Input) + { + container = Comp(machineEntity.Comp.InputContainer).Contents; + } + else + { + container = Comp(machineEntity.Comp.OutputContainer).Contents; + } + + return container; + } +} diff --git a/Content.Shared/_Scp/Scp914/Scp914UiData.cs b/Content.Shared/_Scp/Scp914/Scp914UiData.cs new file mode 100644 index 00000000000..3c062925d1b --- /dev/null +++ b/Content.Shared/_Scp/Scp914/Scp914UiData.cs @@ -0,0 +1,48 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared._Scp.Scp914; + + +[Serializable, NetSerializable] +public sealed partial class Scp914BuiState : BoundUserInterfaceState +{ + public Scp914Mode NewMode { get; set; } + public bool Active { get; set; } + + public Scp914BuiState(Scp914Mode newMode, bool active) + { + NewMode = newMode; + Active = active; + } +} + +[Serializable, NetSerializable] +public sealed partial class Scp914ChangeModeRequestMessage : BoundUserInterfaceMessage +{ + public Scp914CycleDirection Direction { get; set; } + + public Scp914ChangeModeRequestMessage(Scp914CycleDirection direction) + { + Direction = direction; + } +} + +[Serializable, NetSerializable] +public sealed partial class Scp914StartCycleMessage : BoundUserInterfaceMessage +{ + +} + +[Serializable, NetSerializable] +public enum Scp914CycleDirection : byte +{ + Left = 0, + Right = 1, +} + +[Serializable, NetSerializable] +public enum Scp914UiKey +{ + Key, +} + diff --git a/Content.Shared/_Scp/Scp914/SharedScp914Data.cs b/Content.Shared/_Scp/Scp914/SharedScp914Data.cs new file mode 100644 index 00000000000..545dc144e0c --- /dev/null +++ b/Content.Shared/_Scp/Scp914/SharedScp914Data.cs @@ -0,0 +1,86 @@ +using Content.Shared.Storage.Components; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared._Scp.Scp914; + + +[RegisterComponent, NetworkedComponent] +public sealed partial class Scp914Component : Component +{ + public Scp914Mode CurrentMode { get; set; } = Scp914Mode.Rough; + + [ViewVariables(VVAccess.ReadWrite)] + public bool Active { get; set; } + + [DataField] + public TimeSpan UpgradeDuration { get; private set; } = TimeSpan.FromSeconds(15); + + [ViewVariables(VVAccess.ReadOnly)] + public TimeSpan UpgradeTimeEnd { get; set; } = TimeSpan.MinValue; + + [DataField] + public TimeSpan UpgradeCooldown { get; set; } = TimeSpan.FromSeconds(5); + + public TimeSpan NextUpgradeTime { get; set; } + + [DataField] + public TimeSpan CycleCooldown = TimeSpan.FromSeconds(1); + + public TimeSpan NextChangeCycleTime { get; set; } = TimeSpan.MinValue; + + [ViewVariables] + public EntityUid InputContainer { get; set; } + + [ViewVariables] + public EntityUid OutputContainer { get; set; } + + [DataField] + public SoundSpecifier RefineSound { get; private set; } = new SoundPathSpecifier("/Audio/_Scp/Scp914/scp914_refine.ogg"); + + [DataField] + public SoundSpecifier ClackSound { get; private set; } = new SoundPathSpecifier("/Audio/_Scp/Scp914/scp914_clack.ogg"); +} + +[RegisterComponent] +public sealed partial class Scp914ContainerComponent : Component +{ + [DataField(required: true)] + public Scp914ContainerType ContainerType { get; set; } +} + +[RegisterComponent] +public sealed partial class Scp914UpgradableComponent : Component +{ + [DataField(required: true)] + public Dictionary> UpgradeOptions { get; private set; } = new(); +} + +[Serializable, NetSerializable] +public enum Scp914Mode : byte +{ + Rough = 0, + Coarse = 1, + OneToOne = 2, + Fine = 4, + VeryFine = 8, +} + +[Serializable] +public enum Scp914ContainerType : byte +{ + Input = 0, + Output = 1 +} + +[DataDefinition] +public sealed partial class UpgradeOption +{ + [DataField(required: true)] + public EntProtoId Item { get; private set; } + + [DataField(required: true)] + public float Chanse { get; private set; } +} diff --git a/Content.Shared/_Scp/Scp914/SharedScp914System.cs b/Content.Shared/_Scp/Scp914/SharedScp914System.cs new file mode 100644 index 00000000000..491baf1e961 --- /dev/null +++ b/Content.Shared/_Scp/Scp914/SharedScp914System.cs @@ -0,0 +1,50 @@ +using Content.Shared.Storage; +using Content.Shared.Storage.Components; + +namespace Content.Shared._Scp.Scp914; + +public abstract class SharedScp914System : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnOpenAttempt); + SubscribeLocalEvent(OnCloseAttempt); + SubscribeLocalEvent(OnInteractAttempt); + + + } + + private void OnCloseAttempt(Entity ent, ref StorageCloseAttemptEvent args) + { + args.Cancelled = true; + } + + private void OnInteractAttempt(Entity ent, ref StorageInteractAttemptEvent args) + { + args.Cancelled = true; + } + + private void OnOpenAttempt(Entity ent, ref StorageOpenAttemptEvent args) + { + args.Cancelled = true; + } + + protected Scp914Mode CycleMod(Scp914Mode value, Scp914CycleDirection direction) + { + var values = (Scp914Mode[])Enum.GetValues(typeof(Scp914Mode)); + + + var currentIndex = Array.IndexOf(values, value); + + var shift = direction == Scp914CycleDirection.Left ? -1 : 1; + var newIndex = (currentIndex + shift) % values.Length; + + if (newIndex < 0) + { + newIndex += values.Length; + } + + return values[newIndex]; + } +} diff --git a/Resources/Audio/_Scp/Scp914/scp914_clack.ogg b/Resources/Audio/_Scp/Scp914/scp914_clack.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9a18b7f31a6ae5e236f68e93f55cb65d7326f1d2 GIT binary patch literal 7717 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/_Scp/Scp914/scp914_refine.ogg b/Resources/Audio/_Scp/Scp914/scp914_refine.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9215e01c8a25af35f29d209a47a8bd67df67b925 GIT binary patch literal 153020 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 literal 0 HcmV?d00001 diff --git a/Resources/Prototypes/_Scp/Entities/Objects/scp914.yml b/Resources/Prototypes/_Scp/Entities/Objects/scp914.yml new file mode 100644 index 00000000000..2d5023bf976 --- /dev/null +++ b/Resources/Prototypes/_Scp/Entities/Objects/scp914.yml @@ -0,0 +1,185 @@ +- type: entity + id: Scp914Main + placement: + mode: SnapgridCenter + components: + - type: Sprite + sprite: _Scp/scp-914/64x64.rsi + state: center + offset: 0, 0.5 + - type: InteractionOutline + - type: Clickable + - type: Scp914 + - type: UserInterface + interfaces: + enum.Scp914UiKey.Key: + type: Scp914BoundUserInterface + +- type: entity + id: Scp914ContainerBase + categories: [ HideSpawnMenu ] + placement: + mode: SnapgridCenter + components: + - type: Sprite + offset: 0, 0.5 + - type: ItemSlots + - type: Clickable + - type: InteractionOutline + - type: EntityStorage + open: true + itemCanStoreMobs: false + - type: ContainerContainer + containers: + entity_storage: !type:Container + - type: Appearance + - type: Physics + bodyType: Static + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.5,0.5,0.8" + density: 75 + mask: + - MachineMask + layer: + - MachineLayer + +- type: entity + id: Scp914Input + parent: Scp914ContainerBase + placement: + mode: SnapgridCenter + components: + - type: Scp914Container + containerType: Input + - type: EntityStorageVisuals + stateBaseClosed: left-door + stateDoorOpen: left-door + stateDoorClosed: door + - type: Sprite + noRot: true + sprite: _Scp/scp-914/32x32.rsi + offset: 0, 0.5 + layers: + - state: left-door + map: [ "enum.StorageVisualLayers.Base" ] + - state: door + map: [ "enum.StorageVisualLayers.Door" ] + +- type: entity + id: Scp914Output + parent: Scp914ContainerBase + placement: + mode: SnapgridCenter + components: + - type: Scp914Container + containerType: Output + - type: EntityStorageVisuals + stateBaseClosed: left-door + stateDoorOpen: left-door + stateDoorClosed: door + - type: Sprite + noRot: true + sprite: _Scp/scp-914/32x32.rsi + offset: 0, 0.5 + layers: + - state: right-door + map: [ "enum.StorageVisualLayers.Base" ] + - state: door + map: [ "enum.StorageVisualLayers.Door" ] + +- type: entity + id: Scp914InputPipe + placement: + mode: SnapgridCenter + components: + - type: Sprite + sprite: _Scp/scp-914/32x32.rsi + state: input + drawDepth: 10 + offset: 0, 0.5 + - type: Physics + bodyType: Static + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.25,-0.48,0.25,0.48" + density: 75 + mask: + - MachineMask + layer: + - MachineLayer + +- type: entity + id: Scp914OutputPipe + placement: + mode: SnapgridCenter + components: + - type: Sprite + sprite: _Scp/scp-914/32x32.rsi + state: output + offset: 0, 0.5 + - type: Physics + bodyType: Static + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.25,-0.48,0.25,0.48" + density: 75 + mask: + - MachineMask + layer: + - MachineLayer + +- type: entity + id: Scp914Left + placement: + mode: SnapgridCenter + components: + - type: Sprite + sprite: _Scp/scp-914/32x32.rsi + state: left + offset: 0, 0.5 + - type: Physics + bodyType: Static + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.5,0.5,0.8" + density: 75 + mask: + - MachineMask + layer: + - MachineLayer + +- type: entity + id: Scp914Right + placement: + mode: SnapgridCenter + components: + - type: Sprite + sprite: _Scp/scp-914/32x32.rsi + state: right + offset: 0, 0.5 + - type: Physics + bodyType: Static + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.5,0.5,0.8" + density: 75 + mask: + - MachineMask + layer: + - MachineLayer From 4f892d3f283b2ff9a909f4600c1037972d14d04a Mon Sep 17 00:00:00 2001 From: Mona Hmiza Date: Fri, 4 Oct 2024 20:50:40 +0300 Subject: [PATCH 4/9] 914 Logic update --- Content.Server/_Scp/Scp914/Scp914System.cs | 12 +++++++++--- Content.Shared/_Scp/Scp914/SharedScp914Data.cs | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Content.Server/_Scp/Scp914/Scp914System.cs b/Content.Server/_Scp/Scp914/Scp914System.cs index cb46adcd41c..9ec83c13255 100644 --- a/Content.Server/_Scp/Scp914/Scp914System.cs +++ b/Content.Server/_Scp/Scp914/Scp914System.cs @@ -192,11 +192,8 @@ private void UpgradeItem(Entity upgradableEntity, Scp { var options = upgradableEntity.Comp.UpgradeOptions; - Del(upgradableEntity); - if (!options.TryGetValue(machineMode, out var upgradeOptions)) { - entity = null; return; } @@ -212,7 +209,16 @@ private void UpgradeItem(Entity upgradableEntity, Scp continue; } + if (!option.Item.HasValue) + { + Del(upgradableEntity); + entity = null; + + break; + } + entity = Spawn(option.Item); + break; } } diff --git a/Content.Shared/_Scp/Scp914/SharedScp914Data.cs b/Content.Shared/_Scp/Scp914/SharedScp914Data.cs index 545dc144e0c..4c899062e02 100644 --- a/Content.Shared/_Scp/Scp914/SharedScp914Data.cs +++ b/Content.Shared/_Scp/Scp914/SharedScp914Data.cs @@ -79,7 +79,7 @@ public enum Scp914ContainerType : byte public sealed partial class UpgradeOption { [DataField(required: true)] - public EntProtoId Item { get; private set; } + public EntProtoId? Item { get; private set; } [DataField(required: true)] public float Chanse { get; private set; } From 6ecac3cdc32e5d527bc3d544b83ae155a8a639d3 Mon Sep 17 00:00:00 2001 From: Mona Hmiza Date: Fri, 4 Oct 2024 22:31:23 +0300 Subject: [PATCH 5/9] More prikols --- Content.Server/_Scp/Scp914/Scp914System.cs | 4 +++- Content.Shared/_Scp/Scp914/SharedScp914Data.cs | 4 ++-- Content.Shared/_Scp/Scp914/SharedScp914System.cs | 2 -- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Content.Server/_Scp/Scp914/Scp914System.cs b/Content.Server/_Scp/Scp914/Scp914System.cs index 9ec83c13255..30374e3fb56 100644 --- a/Content.Server/_Scp/Scp914/Scp914System.cs +++ b/Content.Server/_Scp/Scp914/Scp914System.cs @@ -202,7 +202,7 @@ private void UpgradeItem(Entity upgradableEntity, Scp foreach (var option in upgradeOptions) { - cumulativeProbability += option.Chanse; + cumulativeProbability += option.Chance; if (randomValue > cumulativeProbability) { @@ -217,6 +217,8 @@ private void UpgradeItem(Entity upgradableEntity, Scp break; } + Del(upgradableEntity); + entity = Spawn(option.Item); break; } diff --git a/Content.Shared/_Scp/Scp914/SharedScp914Data.cs b/Content.Shared/_Scp/Scp914/SharedScp914Data.cs index 4c899062e02..ead9a94f94d 100644 --- a/Content.Shared/_Scp/Scp914/SharedScp914Data.cs +++ b/Content.Shared/_Scp/Scp914/SharedScp914Data.cs @@ -81,6 +81,6 @@ public sealed partial class UpgradeOption [DataField(required: true)] public EntProtoId? Item { get; private set; } - [DataField(required: true)] - public float Chanse { get; private set; } + [DataField] + public float Chance { get; private set; } = 1.0f; } diff --git a/Content.Shared/_Scp/Scp914/SharedScp914System.cs b/Content.Shared/_Scp/Scp914/SharedScp914System.cs index 491baf1e961..ab98e23e90b 100644 --- a/Content.Shared/_Scp/Scp914/SharedScp914System.cs +++ b/Content.Shared/_Scp/Scp914/SharedScp914System.cs @@ -11,8 +11,6 @@ public override void Initialize() SubscribeLocalEvent(OnOpenAttempt); SubscribeLocalEvent(OnCloseAttempt); SubscribeLocalEvent(OnInteractAttempt); - - } private void OnCloseAttempt(Entity ent, ref StorageCloseAttemptEvent args) From d36a9a0d8f48f62508685c4f389536bec7a7e41b Mon Sep 17 00:00:00 2001 From: Mona Hmiza Date: Tue, 8 Oct 2024 07:38:21 +0300 Subject: [PATCH 6/9] Gamemode stable --- .../Tests/GameRules/ScpSlGameRuleTest.cs | 138 +++++++ Content.Server/Voting/Managers/VoteManager.cs | 1 + .../GameRules/ScpSl/ScpMarkerComponent.cs | 11 - .../ScpSl/ScpSLGameRuleSystem.Subs.cs | 14 + .../ScpSl/ScpSlEscapeZoneComponent.cs | 24 +- .../GameRules/ScpSl/ScpSlGameRuleComponent.cs | 47 ++- .../ScpSl/ScpSlGameRuleSystem.Escape.cs | 69 ++++ .../ScpSl/ScpSlGameRuleSystem.Spawns.cs | 275 +++++++++++++ .../ScpSl/ScpSlGameRuleSystem.Tracker.cs | 54 +++ .../GameRules/ScpSl/ScpSlGameRuleSystem.cs | 306 ++++++++------- .../_Scp/GameRules/ScpSl/SlCvars.cs | 17 + Content.Shared/_Scp/GameRule/Sl/Markers.cs | 25 ++ Resources/Locale/ru-RU/_fire/scp/914.ftl | 12 + .../Locale/ru-RU/_fire/scp/game-rule.ftl | 2 + Resources/Maps/_Fire/sl_scp_test.yml | 366 ++++++++++++++++++ .../Objects/Misc/identification_cards.yml | 13 + .../_Scp/Entities/Objects/scp914.yml | 4 +- .../_Scp/ScpEscapeMode/spawn_points.yml | 123 ++++++ .../_Scp/ScpEscapeMode/triggers.yml | 34 ++ .../sl_humanoid_profiles.yml | 53 +++ .../sl_starting_gear.yml | 85 ++++ .../Prototypes/_Scp/SlGamemode/gameRule.yml | 33 ++ .../_Scp/ScpSl/spawn-points.rsi/c.png | Bin 0 -> 254 bytes .../_Scp/ScpSl/spawn-points.rsi/d.png | Bin 0 -> 235 bytes .../_Scp/ScpSl/spawn-points.rsi/e.png | Bin 0 -> 248 bytes .../_Scp/ScpSl/spawn-points.rsi/m.png | Bin 0 -> 280 bytes .../_Scp/ScpSl/spawn-points.rsi/meta.json | 26 ++ .../_Scp/ScpSl/spawn-points.rsi/s.png | Bin 0 -> 249 bytes .../Textures/_Scp/scp-914/32x32.rsi/door.png | Bin 0 -> 201 bytes .../Textures/_Scp/scp-914/32x32.rsi/input.png | Bin 0 -> 479 bytes .../_Scp/scp-914/32x32.rsi/left-door.png | Bin 0 -> 351 bytes .../Textures/_Scp/scp-914/32x32.rsi/left.png | Bin 0 -> 615 bytes .../Textures/_Scp/scp-914/32x32.rsi/meta.json | 30 ++ .../_Scp/scp-914/32x32.rsi/output.png | Bin 0 -> 439 bytes .../_Scp/scp-914/32x32.rsi/right-door.png | Bin 0 -> 319 bytes .../Textures/_Scp/scp-914/32x32.rsi/right.png | Bin 0 -> 603 bytes .../_Scp/scp-914/64x64.rsi/center.png | Bin 0 -> 1664 bytes .../Textures/_Scp/scp-914/64x64.rsi/meta.json | 12 + 38 files changed, 1604 insertions(+), 170 deletions(-) create mode 100644 Content.IntegrationTests/Tests/GameRules/ScpSlGameRuleTest.cs delete mode 100644 Content.Server/_Scp/GameRules/ScpSl/ScpMarkerComponent.cs create mode 100644 Content.Server/_Scp/GameRules/ScpSl/ScpSLGameRuleSystem.Subs.cs create mode 100644 Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Escape.cs create mode 100644 Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Spawns.cs create mode 100644 Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Tracker.cs create mode 100644 Content.Server/_Scp/GameRules/ScpSl/SlCvars.cs create mode 100644 Content.Shared/_Scp/GameRule/Sl/Markers.cs create mode 100644 Resources/Locale/ru-RU/_fire/scp/914.ftl create mode 100644 Resources/Locale/ru-RU/_fire/scp/game-rule.ftl create mode 100644 Resources/Maps/_Fire/sl_scp_test.yml create mode 100644 Resources/Prototypes/_Scp/ScpEscapeMode/spawn_points.yml create mode 100644 Resources/Prototypes/_Scp/ScpEscapeMode/triggers.yml create mode 100644 Resources/Prototypes/_Scp/SlGamemode/RandomHumanoidProfiles/sl_humanoid_profiles.yml create mode 100644 Resources/Prototypes/_Scp/SlGamemode/RandomHumanoidProfiles/sl_starting_gear.yml create mode 100644 Resources/Prototypes/_Scp/SlGamemode/gameRule.yml create mode 100644 Resources/Textures/_Scp/ScpSl/spawn-points.rsi/c.png create mode 100644 Resources/Textures/_Scp/ScpSl/spawn-points.rsi/d.png create mode 100644 Resources/Textures/_Scp/ScpSl/spawn-points.rsi/e.png create mode 100644 Resources/Textures/_Scp/ScpSl/spawn-points.rsi/m.png create mode 100644 Resources/Textures/_Scp/ScpSl/spawn-points.rsi/meta.json create mode 100644 Resources/Textures/_Scp/ScpSl/spawn-points.rsi/s.png create mode 100644 Resources/Textures/_Scp/scp-914/32x32.rsi/door.png create mode 100644 Resources/Textures/_Scp/scp-914/32x32.rsi/input.png create mode 100644 Resources/Textures/_Scp/scp-914/32x32.rsi/left-door.png create mode 100644 Resources/Textures/_Scp/scp-914/32x32.rsi/left.png create mode 100644 Resources/Textures/_Scp/scp-914/32x32.rsi/meta.json create mode 100644 Resources/Textures/_Scp/scp-914/32x32.rsi/output.png create mode 100644 Resources/Textures/_Scp/scp-914/32x32.rsi/right-door.png create mode 100644 Resources/Textures/_Scp/scp-914/32x32.rsi/right.png create mode 100644 Resources/Textures/_Scp/scp-914/64x64.rsi/center.png create mode 100644 Resources/Textures/_Scp/scp-914/64x64.rsi/meta.json diff --git a/Content.IntegrationTests/Tests/GameRules/ScpSlGameRuleTest.cs b/Content.IntegrationTests/Tests/GameRules/ScpSlGameRuleTest.cs new file mode 100644 index 00000000000..1f933e0f349 --- /dev/null +++ b/Content.IntegrationTests/Tests/GameRules/ScpSlGameRuleTest.cs @@ -0,0 +1,138 @@ +using System.Linq; +using Content.Server._Scp.GameRules.ScpSl; +using Content.Server._Sunrise.StationCentComm; +using Content.Server.GameTicking; +using Content.Server.GameTicking.Presets; +using Content.Server.GameTicking.Rules.Components; +using Content.Server.RoundEnd; +using Content.Shared._Scp.GameRule.Sl; +using Content.Shared.GameTicking; +using Content.Shared.Pinpointer; +using Content.Shared.Station.Components; +using Robust.Server.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.Map.Components; + +namespace Content.IntegrationTests.Tests.GameRules; + +[TestFixture] +public sealed class ScpSlGameRuleTest +{ + [Test] + public async Task TryStartGameRuleTestWithSufficientPlayers() + { + await using var pair = await PoolManager.GetServerClient(new PoolSettings + { + Dirty = true, + DummyTicker = false, + Connected = true, + InLobby = true, + }); + + var server = pair.Server; + var client = pair.Client; + + var entMan = server.EntMan; + + var ticker = server.System(); + var xformSystem = server.System(); + var physicsSystem = server.System(); + + Assert.That(ticker.DummyTicker, Is.False); + + Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.PreRoundLobby)); + Assert.That(client.AttachedEntity, Is.Null); + Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.NotReadyToPlay)); + + var dummies = await pair.Server.AddDummySessions(30); + + await pair.RunTicksSync(5); + + // Initially, the players have no attached entities + Assert.That(pair.Player?.AttachedEntity, Is.Null); + Assert.That(dummies.All(x => x.AttachedEntity == null)); + + Assert.That(entMan.Count(), Is.Zero); + Assert.That(entMan.Count(), Is.Zero); + Assert.That(entMan.Count(), Is.Zero); + Assert.That(entMan.Count(), Is.Zero); + Assert.That(entMan.Count(), Is.Zero); // Sunrise-Edit + + // And no sl related components + Assert.That(entMan.Count(), Is.Zero); + Assert.That(entMan.Count(), Is.Zero); + Assert.That(entMan.Count(), Is.Zero); + + ticker.ToggleReadyAll(true); + Assert.That(ticker.PlayerGameStatuses.Values.All(x => x == PlayerGameStatus.ReadyToPlay)); + + await pair.WaitCommand("forcepreset ScpSl"); + await pair.RunTicksSync(10); + + Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.InRound)); + Assert.That(ticker.PlayerGameStatuses.Values.All(x => x == PlayerGameStatus.JoinedGame)); + Assert.That(client.EntMan.EntityExists(client.AttachedEntity)); + + Assert.That(entMan.Count(), Is.EqualTo(1)); + Assert.That(entMan.Count, Is.AtLeast(1)); + Assert.That(entMan.Count, Is.AtLeast(1)); + + + //Try escape + + var (escapeZoneXform, _) = entMan.EntityQuery().First(); + + var chaosBefore = dummies.Count(x => + entMan.TryGetComponent(x.AttachedEntity!.Value!, out var marker) && + marker.HumanoidType == ScpSlHumanoidType.Chaos); + + var dBefore = dummies.Count(x => + entMan.TryGetComponent(x.AttachedEntity!.Value!, out var marker) && + marker.HumanoidType == ScpSlHumanoidType.ClassD); + + var dummyD = dummies + .First(x => entMan.TryGetComponent(x.AttachedEntity!.Value!, out var marker) && + marker.HumanoidType == ScpSlHumanoidType.ClassD) + .AttachedEntity!.Value!; + + physicsSystem.WakeBody(escapeZoneXform.Owner); + physicsSystem.WakeBody(dummyD); + + await pair.RunTicksSync(5); + + xformSystem.SetCoordinates(dummyD, escapeZoneXform.Coordinates); + + await pair.RunTicksSync(5); + + var dAfter = dummies.Count(x => + entMan.TryGetComponent(x.AttachedEntity!.Value!, out var marker) && + marker.HumanoidType == ScpSlHumanoidType.ClassD); + + var chaosAfter = dummies.Count(x => + entMan.TryGetComponent(x.AttachedEntity!.Value!, out var marker) && + marker.HumanoidType == ScpSlHumanoidType.Chaos); + + + Assert.That(dBefore > dAfter, Is.True); + Assert.That(chaosBefore < chaosAfter, Is.True); + + // Try end round + var player = pair.Player!.AttachedEntity!.Value; + + var dummyEntity = dummies.Select(x => x.AttachedEntity ?? default).Append(player).Where(x=> entMan.HasComponent(x)).ToList(); + + await server.WaitAssertion(() => + { + foreach (var entityUid in dummyEntity) + { + entMan.DeleteEntity(entityUid); + } + + }); + + Assert.That(ticker.RunLevel == GameRunLevel.PostRound, Is.True, "All humanoids are dead, but round doesn't end!"); + + ticker.SetGamePreset((GamePresetPrototype?) null); + await pair.CleanReturnAsync(); + } +} diff --git a/Content.Server/Voting/Managers/VoteManager.cs b/Content.Server/Voting/Managers/VoteManager.cs index ad74901f485..b682a81d25e 100644 --- a/Content.Server/Voting/Managers/VoteManager.cs +++ b/Content.Server/Voting/Managers/VoteManager.cs @@ -243,6 +243,7 @@ private void SendUpdates(VoteReg v) private void SendSingleUpdate(VoteReg v, ICommonSession player) { + return; var msg = new MsgVoteData(); msg.VoteId = v.Id; diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpMarkerComponent.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpMarkerComponent.cs deleted file mode 100644 index c463d2b5348..00000000000 --- a/Content.Server/_Scp/GameRules/ScpSl/ScpMarkerComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Robust.Shared.GameStates; - -namespace Content.Server._Scp.GameRules.ScpSl; - - -//Component for marking SCP in SCP:SL gamemode -[RegisterComponent] -public sealed partial class ScpMarkerComponent : Component -{ - -} diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSLGameRuleSystem.Subs.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSLGameRuleSystem.Subs.cs new file mode 100644 index 00000000000..fc53101cd4b --- /dev/null +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSLGameRuleSystem.Subs.cs @@ -0,0 +1,14 @@ +namespace Content.Server._Scp.GameRules.ScpSl; + +public sealed partial class ScpSlGameRuleSystem +{ + private int _maxChaosSpawnCount; + private int _maxMogSpawnCount; + private float _chaosSpawnChance; + private void InitializeSubs() + { + _cfg.OnValueChanged(SlCvars.MaxChaosSpawnCount, newValue => _maxChaosSpawnCount = newValue); + _cfg.OnValueChanged(SlCvars.MaxMogSpawnCount, newValue => _maxMogSpawnCount = newValue); + _cfg.OnValueChanged(SlCvars.ChaosSpawnChance, newValue => _chaosSpawnChance = newValue); + } +} diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlEscapeZoneComponent.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlEscapeZoneComponent.cs index df88cf4947d..cdbda6d8893 100644 --- a/Content.Server/_Scp/GameRules/ScpSl/ScpSlEscapeZoneComponent.cs +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlEscapeZoneComponent.cs @@ -1,7 +1,29 @@ -namespace Content.Server._Scp.GameRules.ScpSl; +using Content.Shared._Scp.GameRule.Sl; +using Content.Shared.NPC.Prototypes; +using Robust.Shared.Prototypes; + +namespace Content.Server._Scp.GameRules.ScpSl; [RegisterComponent] public sealed partial class ScpSlEscapeZoneComponent : Component { } + +[RegisterComponent] +public sealed partial class SlHumanoidSpawnPointComponent : Component +{ + [DataField(required: true)] + public ScpSlHumanoidType SpawnPointType { get; private set; } +} + +[RegisterComponent] +public sealed partial class SlScpSpawnPointComponent : Component +{ + [DataField(required: true)] + public EntProtoId ScpProtoId { get; private set; } + + [DataField] + public bool Playable { get; private set; } = true; +} + diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleComponent.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleComponent.cs index 6762e6828d2..a0b1310b0d5 100644 --- a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleComponent.cs +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleComponent.cs @@ -1,29 +1,46 @@ -using Robust.Shared.Prototypes; +using Content.Shared._Scp.GameRule.Sl; +using Content.Shared.Humanoid.Prototypes; +using Robust.Shared.Map.Components; +using Robust.Shared.Prototypes; namespace Content.Server._Scp.GameRules.ScpSl; [RegisterComponent] public sealed partial class ScpSlGameRuleComponent : Component { - public int EscapedDClass = 0; - public int EscapedScientists = 0; + [DataField(required: true)] + public Dictionary>> HumanoidPresets { get; private set; } = new(); + + public Dictionary> Zones { get; private set; } = new(); - [DataField] - public List AllowedScps = new List(); + [DataField(required: true)] + public ProtoId MogCaptainPrototype { get; set; } - [DataField] - public EntProtoId MogProtoId; + [DataField, ViewVariables(VVAccess.ReadWrite)] + public TimeSpan WaveSpawnCooldown { get; set; } = TimeSpan.FromSeconds(300); - [DataField] - public EntProtoId ChaosProtoId; + public TimeSpan NextWaveSpawnTime { get; set; } - [DataField] - public EntProtoId ScientistProtoId; + public int EscapedScientists = 0; + public int EscapedDClass = 0; - [DataField] - public EntProtoId SecurityProtoId; + public int ContainedScps = 0; - [DataField] - public EntProtoId ClassDProtoId; + public SlWinType WinType = SlWinType.Tie; +} + +public enum SlWinType : byte +{ + FondWin = 0, + Tie = 1, + ScpWin = 2, + ChaosWin = 3 +} + +public enum SlZoneType +{ + Light, + Hard, + Office } diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Escape.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Escape.cs new file mode 100644 index 00000000000..2437826b494 --- /dev/null +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Escape.cs @@ -0,0 +1,69 @@ +using Content.Shared._Scp.GameRule.Sl; +using Content.Shared.Cuffs.Components; +using Robust.Shared.Physics.Events; + +namespace Content.Server._Scp.GameRules.ScpSl; + +public sealed partial class ScpSlGameRuleSystem +{ + private void InitializeEscape() + { + SubscribeLocalEvent(OnEscapeZoneCollide); + } + + private void OnEscapeZoneCollide(Entity ent, ref StartCollideEvent args) + { + if(!TryGetActiveRule(out var rule)) + { + return; + } + + var collidedEntityUid = args.OtherEntity; + + if (!TryComp(collidedEntityUid, out var humanoidMarkerComponent) + || !_mindSystem.TryGetMind(collidedEntityUid, out var mindEntity, out var mindComponent)) + { + return; + } + + var humanoidToSpawn = humanoidMarkerComponent.HumanoidType; + + if (humanoidToSpawn == ScpSlHumanoidType.ClassD) + { + if (IsCuffed(collidedEntityUid)) + { + humanoidToSpawn = ScpSlHumanoidType.Mog; + } + else + { + humanoidToSpawn = ScpSlHumanoidType.Chaos; + rule.Value.Comp1.EscapedDClass++; + } + } + else if(humanoidToSpawn == ScpSlHumanoidType.Scientist) + { + rule.Value.Comp1.EscapedScientists++; + humanoidToSpawn = ScpSlHumanoidType.Mog; + } + else + { + return; + } + + var outfit = SelectHumanoidPreset(rule.Value, humanoidToSpawn); + + var spawnPoint = SelectRandomSpawnPosition(humanoidToSpawn); + + var newHumanoidUid = _randomHumanoidSystem.SpawnRandomHumanoid(outfit, spawnPoint, string.Empty); + + _mindSystem.TransferTo(mindEntity, newHumanoidUid); + + Del(collidedEntityUid); + } + + private bool IsCuffed(EntityUid entityUid) + { + return TryComp(entityUid, out var cuffableComponent) + && cuffableComponent.CuffedHandCount >= 2; + } +} diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Spawns.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Spawns.cs new file mode 100644 index 00000000000..db440752192 --- /dev/null +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Spawns.cs @@ -0,0 +1,275 @@ +using System.Linq; +using Content.Server.GameTicking; +using Content.Shared._Scp.GameRule.Sl; +using Content.Shared.Ghost; +using Content.Shared.Humanoid.Prototypes; +using Robust.Shared.Map; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; +using Robust.Shared.Utility; + +namespace Content.Server._Scp.GameRules.ScpSl; + +public sealed partial class ScpSlGameRuleSystem +{ + private int _tracker = 0; + + //4014314031441404134044434414 + public static IReadOnlyList SpawnQueue = [4, 0, 1, 4, 3, 1, 4, 0, 3, 1, 4, 4, 1, 4, 0, 4, 1, 3, 4, 0, 4, 4, 4, 3, 4, 4, 1, 4]; + + private Dictionary _numToHumanoidType = new() + { + { 1, ScpSlHumanoidType.Security }, + { 3, ScpSlHumanoidType.Scientist }, + { 4, ScpSlHumanoidType.ClassD }, + }; + + private void InitializeSpawn() + { + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnPlayerSpawning); + } + + private void OnPlayerSpawning(RulePlayerSpawningEvent ev) + { + if (!TryGetActiveRule(out var rule)) + { + return; + } + + InitialSpawn(rule.Value, ev.PlayerPool); + } + + private void InitialSpawn(Entity rule, List pool) + { + for (var i = 0; i < 5; i++) + { + _random.Shuffle(pool); + } + + foreach (var player in pool) + { + ProcessSpawn(rule, player); + } + + pool.Clear(); + } + + private void ProcessSpawn(Entity rule, ICommonSession playerToSpawn) + { + if (_tracker >= SpawnQueue.Count) + { + _tracker = 0; + } + + _gameTicker.PlayerJoinGame(playerToSpawn); + + var spawnType = SpawnQueue[_tracker]; + _tracker++; + + if (spawnType == 0 ) + { + if (TrySpawnScp(rule, playerToSpawn)) + { + return; + } + + spawnType = 1; + } + + if (!_numToHumanoidType.TryGetValue(spawnType, out var humanoidType)) + { + humanoidType = ScpSlHumanoidType.ClassD; + } + + SpawnHumanoid(rule, playerToSpawn, humanoidType); + } + + public void SpawnHumanoid(Entity rule, ICommonSession playerToSpawn, ScpSlHumanoidType humanoidType) + { + var spawnPosition = SelectRandomSpawnPosition(humanoidType); + + var humanoidPreset = SelectHumanoidPreset(rule, humanoidType); + + var humanoid = _randomHumanoidSystem.SpawnRandomHumanoid(humanoidPreset, spawnPosition, string.Empty); + + var mindEntity = _mindSystem.GetOrCreateMind(playerToSpawn.UserId); + + _mindSystem.TransferTo(mindEntity, humanoid); + } + + public bool TrySpawnScp(Entity rule, ICommonSession playerToSpawn) + { + var scpSpawns = GetScpSpawns(); + + if (scpSpawns.Count == 0) + { + return false; + } + + var spawn = _random.PickAndTake(scpSpawns); + var spawnPosition = spawn.Comp1.Coordinates; + var scpProto = spawn.Comp2.ScpProtoId; + + var scpEntity = Spawn(scpProto, spawnPosition); + AddComp(scpEntity); + + var mindEntity = _mindSystem.GetOrCreateMind(playerToSpawn.UserId); + + _mindSystem.TransferTo(mindEntity, scpEntity); + + Del(spawn); + return true; + } + + private void SpawnUpdate(Entity rule) + { + if (rule.Comp.NextWaveSpawnTime > _gameTiming.CurTime) + { + return; + } + + rule.Comp.NextWaveSpawnTime = _gameTiming.CurTime + rule.Comp.WaveSpawnCooldown; + + SpawnWave(rule); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + var xform = Transform(ent); + + if (ent.Comp.Playable) + { + return; + } + + Spawn(ent.Comp.ScpProtoId, xform.Coordinates); + + QueueDel(ent); + } + + private void SpawnChaosWave(Entity rule, List pool) + { + if (pool.Count == 0) + { + return; + } + + var playersToSpawn = Math.Min(pool.Count, _maxChaosSpawnCount); + + for (int i = 0; i < playersToSpawn; i++) + { + var player = _random.PickAndTake(pool); + + SpawnHumanoid(rule, player, ScpSlHumanoidType.Chaos); + } + } + + private void SpawnWave(Entity rule) + { + var players = _playerManager.NetworkedSessions; + + var eligible = GetEligiblePlayersForWave(players.ToList()); + + if (eligible.Count == 0) + { + return; + } + + if (_random.Prob(_chaosSpawnChance)) + { + SpawnChaosWave(rule, eligible); + return; + } + + SpawnMogWave(rule, eligible); + } + + private void SpawnMogWave(Entity rule, List pool) + { + if (pool.Count == 0) + { + return; + } + + var spawnPoint = SelectRandomSpawnPosition(ScpSlHumanoidType.Mog); + + var captainPlayer = _random.PickAndTake(pool); + var captainEntity = _randomHumanoidSystem.SpawnRandomHumanoid(rule.Comp.MogCaptainPrototype, spawnPoint, string.Empty); + + var captainMind = _mindSystem.GetOrCreateMind(captainPlayer.UserId); + _mindSystem.TransferTo(captainMind, captainEntity); + + var playersToSpawn = Math.Min(pool.Count, _maxMogSpawnCount); + + + for (var i = 0; i < playersToSpawn; i++) + { + var player = _random.PickAndTake(pool); + + SpawnHumanoid(rule, player, ScpSlHumanoidType.Mog); + } + } + + private List GetEligiblePlayersForWave(List sessions) + { + var eligiblePlayers = new List(); + + foreach (var session in sessions) + { + var playerEntity = session.AttachedEntity; + + if (!playerEntity.HasValue || !HasComp(playerEntity)) + { + continue; + } + + eligiblePlayers.Add(session); + } + + return eligiblePlayers; + } + + private ProtoId SelectHumanoidPreset(Entity rule, ScpSlHumanoidType humanoidType) + { + var outfits = rule.Comp.HumanoidPresets[humanoidType]; + return _random.Pick(outfits); + } + + private EntityCoordinates SelectRandomSpawnPosition(ScpSlHumanoidType humanoidType) + { + var spawners = GetHumanoidSpawnPoints(humanoidType); + return _random.Pick(spawners).Comp1.Coordinates; + } + + private List> GetHumanoidSpawnPoints(ScpSlHumanoidType spawnPointType) + { + var spawnPointsQuery = EntityQueryEnumerator(); + + List> spawnPoints = []; + + while (spawnPointsQuery.MoveNext(out var entityUid, out var transformComponent, out var spawnPointComponent)) + { + var entity = new Entity(entityUid, transformComponent, spawnPointComponent); + spawnPoints.Add(entity); + } + + return spawnPoints; + } + + private List> GetScpSpawns() + { + var spawnPointsQuery = EntityQueryEnumerator(); + + List> spawnPoints = []; + + while (spawnPointsQuery.MoveNext(out var entityUid, out var transformComponent, out var spawnPointComponent)) + { + var entity = new Entity(entityUid, transformComponent, spawnPointComponent); + spawnPoints.Add(entity); + } + + return spawnPoints; + } +} diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Tracker.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Tracker.cs new file mode 100644 index 00000000000..c2e3d331568 --- /dev/null +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Tracker.cs @@ -0,0 +1,54 @@ + +using Content.Shared._Scp.GameRule.Sl; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; + +namespace Content.Server._Scp.GameRules.ScpSl; + +public partial class ScpSlGameRuleSystem +{ + private void InitializeTracker() + { + SubscribeLocalEvent(OnHumanoidMobStateChanged); + SubscribeLocalEvent(OnHumanoidRemoved); + + SubscribeLocalEvent(OnScpMobStateChanged); + SubscribeLocalEvent(OnScpRemoved); + } + + private void OnScpMobStateChanged(Entity ent, ref MobStateChangedEvent args) + { + if (!TryGetActiveRule(out var rule)) + { + return; + } + + if (args.NewMobState != MobState.Alive) + { + ent.Comp.Contained = true; + TryEndRound(); + + _ghostSystem.SpawnGhost(ent.Owner, canReturn: false); + } + } + + private void OnScpRemoved(Entity ent, ref ComponentRemove args) + { + TryEndRound(); + } + + + private void OnHumanoidMobStateChanged(Entity ent, ref MobStateChangedEvent args) + { + if (args.NewMobState != MobState.Alive) + { + TryEndRound(); + } + } + + private void OnHumanoidRemoved(Entity ent, ref ComponentRemove args) + { + TryEndRound(); + } +} + diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs index 37aa773b4db..007e864842f 100644 --- a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs @@ -1,192 +1,134 @@ -using System.Linq; +using System.Diagnostics.CodeAnalysis; using Content.Server.Cuffs; using Content.Server.GameTicking; using Content.Server.GameTicking.Rules; +using Content.Server.Ghost; +using Content.Server.Humanoid.Systems; using Content.Server.Mind; -using Content.Server.Spawners.Components; -using Content.Shared.Cuffs.Components; +using Content.Server.Nuke; +using Content.Shared._Scp.GameRule.Sl; using Content.Shared.GameTicking.Components; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; -using Content.Shared.NPC.Components; +using Content.Shared.Mobs.Systems; using Content.Shared.NPC.Systems; -using Robust.Shared.Physics.Events; -using Robust.Shared.Player; +using Robust.Server.Player; +using Robust.Shared.Configuration; +using Robust.Shared.Map.Components; using Robust.Shared.Random; +using Robust.Shared.Timing; using Robust.Shared.Utility; namespace Content.Server._Scp.GameRules.ScpSl; -/* - * Конец раунда начнется только если будут сделаны следующие условия - -Победа Мобильно-Оперативной Группы - --Все SCP-Объекты нейтрализованы --Сбежало 1-2 ученых --Сбежало 0 Д-Класса - -Победа Класса-Д - --Сбежало 1-2 и т.д Д-Класса --Сбежало 0 Ученых --1 Объект СЦП Нейтрализован --Охрана комплекса и МОГ уничтожены - -Победа SCP-Объектов - --Сбежало 0 Ученых --Сбежало 0 Д-Класса --Охрана комплекса и МОГ уничтожены --Остались только SCP и Хаос (или Только SCP) --Нейтрализовано 0 SCP - -Ничья - --Сбежал 1 Д-Класс --Сбежал 1 Ученый --Убито 1-2 SCP-Объектов - */ - -public sealed class ScpSlGameRuleSystem : GameRuleSystem +public sealed partial class ScpSlGameRuleSystem : GameRuleSystem { [Dependency] private readonly NpcFactionSystem _npcFactionSystem = default!; [Dependency] private readonly CuffableSystem _cuffableSystem = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly MindSystem _mindSystem = default!; - + [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly RandomHumanoidSystem _randomHumanoidSystem = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly MobStateSystem _mobStateSystem = default!; + [Dependency] private readonly GameTicker _gameTicker = default!; + [Dependency] private readonly GhostSystem _ghostSystem = default!; protected override string SawmillName => "ScpSl"; + private TimeSpan NextRoundEndCheckTime; + public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnMobStateChanged); - SubscribeLocalEvent(OnEscapeZoneCollide); - SubscribeLocalEvent(OnPlayerSpawning); - } - private void OnPlayerSpawning(RulePlayerSpawningEvent ev) - { - var pool = ev.PlayerPool.ShallowClone(); + UpdatesAfter.Add(typeof(LoadMapRuleSystem)); - SpawnScp(pool); + InitializeEscape(); + InitializeSpawn(); + InitializeSubs(); + InitializeTracker(); - Spawn(pool, ScpSlSpawnType.Scientist); - Spawn(pool, ScpSlSpawnType.Security); - Spawn(pool, ScpSlSpawnType.ClassD); + SubscribeLocalEvent(OnNukeExploded); } - private List> GetSpawnPoints(ScpSlSpawnType spawnType) + private void OnNukeExploded(NukeExplodedEvent ev) { - var spawnPointsQuery = EntityQueryEnumerator(); - - List> spawnPoints = []; - - while (spawnPointsQuery.MoveNext(out var entityUid, out var spawnPointsComponent, out var transformComponent)) + if (!TryGetActiveRule(out var gameRule) + || !ev.OwningStation.HasValue) { - if (spawnPointsComponent.SpawnType != spawnType) - { - continue; - } - - var entity = new Entity(entityUid, transformComponent, spawnPointsComponent); - spawnPoints.Add(entity); + return; } - return spawnPoints; - } - - private void OnEscapeZoneCollide(Entity ent, ref StartCollideEvent args) - { - var ruleQuery = this.QueryActiveRules(); - - var collidedEntity = args.OtherEntity; + var stationUid = ev.OwningStation.Value; + var zones = gameRule.Value.Comp1.Zones.Values; - if (_npcFactionSystem.IsMember(collidedEntity, "ClassDFaction")) + if (zones.FirstOrNull(x => x.Owner == stationUid) == null) { - if (TryComp(collidedEntity, out var cuffed) - && cuffed.CuffedHandCount > 0 - && _npcFactionSystem.GetNearbyHostiles(collidedEntity, 5f).Any()) - { - //Become MOG - Escaped(EscapedType.Scientist); - return; - } - - //Become Chaos - Escaped(EscapedType.DClass); return; } - if (_npcFactionSystem.IsMember(collidedEntity, "ScientistsFaction")) + foreach (var zone in zones) { - - if (TryComp(collidedEntity, out var cuffed) - && cuffed.CuffedHandCount > 0 - && _npcFactionSystem.GetNearbyHostiles(collidedEntity, 5f).Any()) - { - //Become Chaos - Escaped(EscapedType.DClass); - return; - } - - //Become MOG - Escaped(EscapedType.Scientist); - return; + DustifyAllMobsOnGrid(zone); } } - private void OnMobStateChanged(MobStateChangedEvent ev) + private List> GetAllMobstatesOnGrid(Entity gridEntity) { - if (ev.NewMobState != MobState.Dead) + var query = EntityQueryEnumerator(); + var mobs = new List>(); + + while (query.MoveNext(out var uid, out var xform, out var mobStateComponent)) { - ShouldRoundEnd(); + if (xform.GridUid != gridEntity) + continue; + + var mobEntity = new Entity(uid, mobStateComponent); + mobs.Add(mobEntity); } - } - protected override void Started(EntityUid uid, ScpSlGameRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) - { - base.Started(uid, component, gameRule, args); - args. + return mobs; } - private void Spawn(List pool, ScpSlSpawnType spawnType) + private void DustifyAllMobsOnGrid(Entity gridEntity) { - var spawnPoints = GetSpawnPoints(spawnType); + var mobs = GetAllMobstatesOnGrid(gridEntity); - if (spawnPoints.Count == 0) + foreach (var mob in mobs) { - Log.Error($"No spawnpoints provided for {spawnType}"); - return; + var mobXform = Transform(mob); + _mobStateSystem.ChangeMobState(mob, MobState.Dead); + + Spawn("Ash", mobXform.Coordinates); + + Del(mob); } } - private void SpawnScp(List pool) + protected override void ActiveTick(EntityUid uid, ScpSlGameRuleComponent component, GameRuleComponent gameRule, float frameTime) { - var spawnPoints = GetSpawnPoints(ScpSlSpawnType.Scp); - _random.Shuffle(spawnPoints); + base.ActiveTick(uid, component, gameRule, frameTime); - var totalScps = _random.Next(2, spawnPoints.Count); + var ruleEntity = new Entity(uid, component); + SpawnUpdate(ruleEntity); - for (var i = 0; i < totalScps; i++) + if (NextRoundEndCheckTime < _gameTiming.CurTime) { - var (spawnPoint, xform, spawnComponent) = spawnPoints[i]; - var player = _random.PickAndTake(pool); + NextRoundEndCheckTime = _gameTiming.CurTime + TimeSpan.FromSeconds(5); - var scp = Spawn(spawnComponent.ScpProto!, xform.Coordinates); - _mindSystem.ControlMob(player.UserId, scp); + TryEndRound(); } } - protected override void Added(EntityUid uid, ScpSlGameRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args) + protected override void Started(EntityUid uid, ScpSlGameRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) { - base.Added(uid, component, gameRule, args); - } + base.Started(uid, component, gameRule, args); - protected override void Ended(EntityUid uid, ScpSlGameRuleComponent component, GameRuleComponent gameRule, GameRuleEndedEvent args) - { - base.Ended(uid, component, gameRule, args); + component.NextWaveSpawnTime = _gameTiming.CurTime + component.WaveSpawnCooldown; + NextRoundEndCheckTime = _gameTiming.CurTime + TimeSpan.FromMinutes(1); } protected override void AppendRoundEndText(EntityUid uid, @@ -197,43 +139,125 @@ protected override void AppendRoundEndText(EntityUid uid, base.AppendRoundEndText(uid, component, gameRule, ref args); } - private bool ShouldRoundEnd() + private void TryEndRound() { - var scpsQuery = EntityQueryEnumerator(); - var humansQuery = EntityQueryEnumerator(); + if (!TryGetActiveRule(out var rule)) + { + return; + } + + var slGameRuleComponent = rule.Value.Comp1; + + var dAlive = GetAliveHumanoidsCount(ScpSlHumanoidType.ClassD); + var mogAlive = GetAliveHumanoidsCount(ScpSlHumanoidType.Mog) + GetAliveHumanoidsCount(ScpSlHumanoidType.Scientist); + var chaosAlive = GetAliveHumanoidsCount(ScpSlHumanoidType.Chaos); + var scpAlive = GetAliveScpCount(); + + + var shouldRoundEnd = false; - while (scpsQuery.MoveNext(out var scpUid, out var _, out var mobStateComponent, out var xformComponent)) + if (mogAlive > 0 && dAlive == 0 && scpAlive == 0) { + shouldRoundEnd = true; + if (slGameRuleComponent.EscapedScientists > slGameRuleComponent.EscapedDClass) + { + slGameRuleComponent.WinType = SlWinType.FondWin; + } + else + { + slGameRuleComponent.WinType = SlWinType.Tie; + } } - while (humansQuery.MoveNext(out var humanUid, out var npcFactionComponent, out var mobStateComponent, out var actorComponent)) + if (scpAlive > 0 && dAlive == 0 && mogAlive == 0) { + shouldRoundEnd = true; + if (scpAlive > slGameRuleComponent.EscapedDClass + slGameRuleComponent.EscapedScientists) + { + slGameRuleComponent.WinType = SlWinType.ScpWin; + } + else if (slGameRuleComponent.EscapedDClass > slGameRuleComponent.EscapedScientists + scpAlive) + { + slGameRuleComponent.WinType = SlWinType.ChaosWin; + } + else + { + slGameRuleComponent.WinType = SlWinType.Tie; + } } - return false; + if ((dAlive > 0 || chaosAlive > 0) && scpAlive == 0 && mogAlive == 0) + { + shouldRoundEnd = true; + + if (slGameRuleComponent.EscapedScientists < slGameRuleComponent.EscapedDClass) + { + slGameRuleComponent.WinType = SlWinType.ChaosWin; + } + else + { + slGameRuleComponent.WinType = SlWinType.Tie; + } + } + + if(dAlive == 0 && mogAlive == 0 && scpAlive == 0) + { + shouldRoundEnd = true; + slGameRuleComponent.WinType = SlWinType.Tie; + } + + if (shouldRoundEnd) + { + _gameTicker.EndRound(); + } + } + + private bool TryGetActiveRule([NotNullWhen(true)] out Entity? gameRule) + { + gameRule = null; + + var query = QueryActiveRules(); + + while (query.MoveNext(out var _, out var scpRuleComponent, out var ruleComponent)) + { + gameRule = new Entity(scpRuleComponent.Owner, scpRuleComponent, ruleComponent); + } + + return gameRule.HasValue; } - private void Escaped(EscapedType escapedType) + private int GetAliveHumanoidsCount(ScpSlHumanoidType humanoidType) { - var rules = QueryActiveRules(); + var query = EntityQueryEnumerator(); - while (rules.MoveNext(out var ruleUid, out var scpRuleComponent, out var ruleComponent)) + var alive = 0; + while (query.MoveNext(out var _, out var markerComponent, out var mobStateComponent)) { - if (escapedType == EscapedType.Scientist) + if (mobStateComponent.CurrentState is MobState.Alive or MobState.Critical + && markerComponent.HumanoidType == humanoidType) { - scpRuleComponent.EscapedScientists++; - return; + alive++; } - - scpRuleComponent.EscapedDClass++; } + + return alive; } - private enum EscapedType + private int GetAliveScpCount() { - Scientist, - DClass + var query = EntityQueryEnumerator(); + var alive = 0; + + while (query.MoveNext(out var _, out var marker, out var _)) + { + if (!marker.Contained) + { + alive++; + } + } + + return alive; } } diff --git a/Content.Server/_Scp/GameRules/ScpSl/SlCvars.cs b/Content.Server/_Scp/GameRules/ScpSl/SlCvars.cs new file mode 100644 index 00000000000..bfeeb18e3c1 --- /dev/null +++ b/Content.Server/_Scp/GameRules/ScpSl/SlCvars.cs @@ -0,0 +1,17 @@ +using Robust.Shared.Configuration; + +namespace Content.Server._Scp.GameRules.ScpSl; + +[CVarDefs] +public sealed class SlCvars +{ + + public static readonly CVarDef MaxMogSpawnCount = + CVarDef.Create("sl.max_mog_spawn_count", 20, CVar.SERVERONLY | CVar.ARCHIVE); + + public static readonly CVarDef MaxChaosSpawnCount = + CVarDef.Create("sl.max_chaos_spawn_count", 20, CVar.SERVERONLY | CVar.ARCHIVE); + + public static readonly CVarDef ChaosSpawnChance = + CVarDef.Create("sl.chaos_spawn_chance", 0.2f, CVar.SERVERONLY | CVar.ARCHIVE); +} diff --git a/Content.Shared/_Scp/GameRule/Sl/Markers.cs b/Content.Shared/_Scp/GameRule/Sl/Markers.cs new file mode 100644 index 00000000000..51a368786d3 --- /dev/null +++ b/Content.Shared/_Scp/GameRule/Sl/Markers.cs @@ -0,0 +1,25 @@ +namespace Content.Shared._Scp.GameRule.Sl; + +//Component for marking SCP in SCP:SL gamemode +[RegisterComponent] +public sealed partial class ScpSlScpMarkerComponent : Component +{ + public bool Contained { get; set; } +} + +[RegisterComponent] +public sealed partial class ScpSlHumanoidMarkerComponent : Component +{ + [DataField(required: true)] + public ScpSlHumanoidType HumanoidType { get; set; } +} + +[Serializable] +public enum ScpSlHumanoidType : byte +{ + Mog = 0, + Chaos = 1, + Scientist = 2, + ClassD = 4, + Security = 8 +} diff --git a/Resources/Locale/ru-RU/_fire/scp/914.ftl b/Resources/Locale/ru-RU/_fire/scp/914.ftl new file mode 100644 index 00000000000..426c8e3bab1 --- /dev/null +++ b/Resources/Locale/ru-RU/_fire/scp/914.ftl @@ -0,0 +1,12 @@ +scp914-cycle-left-button = < +scp914-cycle-right-button = > +scp914-start-cycle = Запустить + +scp914-rough-mode = Очень грубо +scp914-coarse-mode = Грубо +scp914-onetoone-mode = 1:1 +scp914-fine-mode = Тонко +scp914-veryfine-mode = Очень тонко + + +scp914-cycle-timeout = Механизм не запускается... diff --git a/Resources/Locale/ru-RU/_fire/scp/game-rule.ftl b/Resources/Locale/ru-RU/_fire/scp/game-rule.ftl new file mode 100644 index 00000000000..299a1d1c66a --- /dev/null +++ b/Resources/Locale/ru-RU/_fire/scp/game-rule.ftl @@ -0,0 +1,2 @@ +scpsl-title = Побег +slpsl-description = Нужно просто сбежать из комплекса... diff --git a/Resources/Maps/_Fire/sl_scp_test.yml b/Resources/Maps/_Fire/sl_scp_test.yml new file mode 100644 index 00000000000..b77166dbd7b --- /dev/null +++ b/Resources/Maps/_Fire/sl_scp_test.yml @@ -0,0 +1,366 @@ +meta: + format: 6 + postmapinit: false +tilemap: + 0: Space + 86: FloorReinforced +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: Map Entity + - type: Transform + - type: Map + - type: PhysicsMap + - type: GridTree + - type: MovedGrids + - type: Broadphase + - type: OccluderTree + - uid: 2 + components: + - type: MetaData + name: grid + - type: Transform + pos: -2.237307,1.399869 + parent: 1 + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: VgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: [] + - type: GridAtmosphere + version: 2 + data: + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: SlEscapeZone + entities: + - uid: 47 + components: + - type: Transform + pos: 1.5,1.5 + parent: 2 +- proto: Sl173SpawnPoints + entities: + - uid: 55 + components: + - type: Transform + pos: 11.5,1.5 + parent: 2 +- proto: Sl939ASpawnPoint + entities: + - uid: 56 + components: + - type: Transform + pos: 10.5,1.5 + parent: 2 +- proto: SlChaosSpawnPoint + entities: + - uid: 48 + components: + - type: Transform + pos: 1.5,-6.5 + parent: 2 +- proto: SlClassDSpawnPoint + entities: + - uid: 49 + components: + - type: Transform + pos: 2.5,-6.5 + parent: 2 +- proto: SlMogSpawnPoint + entities: + - uid: 50 + components: + - type: Transform + pos: 3.5,-6.5 + parent: 2 +- proto: SlScientistSpawnPoint + entities: + - uid: 51 + components: + - type: Transform + pos: 4.5,-6.5 + parent: 2 +- proto: SlSecuritySpawnPoint + entities: + - uid: 52 + components: + - type: Transform + pos: 5.5,-6.5 + parent: 2 +- proto: WallBrick106 + entities: + - uid: 3 + components: + - type: Transform + pos: 12.5,2.5 + parent: 2 + - uid: 4 + components: + - type: Transform + pos: 12.5,1.5 + parent: 2 + - uid: 5 + components: + - type: Transform + pos: 12.5,0.5 + parent: 2 + - uid: 6 + components: + - type: Transform + pos: 12.5,-0.5 + parent: 2 + - uid: 7 + components: + - type: Transform + pos: 12.5,-1.5 + parent: 2 + - uid: 8 + components: + - type: Transform + pos: 12.5,-2.5 + parent: 2 + - uid: 9 + components: + - type: Transform + pos: 12.5,-3.5 + parent: 2 + - uid: 10 + components: + - type: Transform + pos: 12.5,-4.5 + parent: 2 + - uid: 11 + components: + - type: Transform + pos: 12.5,-5.5 + parent: 2 + - uid: 12 + components: + - type: Transform + pos: 12.5,-6.5 + parent: 2 + - uid: 13 + components: + - type: Transform + pos: 12.5,-7.5 + parent: 2 + - uid: 14 + components: + - type: Transform + pos: 11.5,-7.5 + parent: 2 + - uid: 15 + components: + - type: Transform + pos: 10.5,-7.5 + parent: 2 + - uid: 16 + components: + - type: Transform + pos: 9.5,-7.5 + parent: 2 + - uid: 17 + components: + - type: Transform + pos: 8.5,-7.5 + parent: 2 + - uid: 18 + components: + - type: Transform + pos: 6.5,-7.5 + parent: 2 + - uid: 19 + components: + - type: Transform + pos: 5.5,-7.5 + parent: 2 + - uid: 20 + components: + - type: Transform + pos: 4.5,-7.5 + parent: 2 + - uid: 21 + components: + - type: Transform + pos: 0.5,-7.5 + parent: 2 + - uid: 22 + components: + - type: Transform + pos: 1.5,-7.5 + parent: 2 + - uid: 23 + components: + - type: Transform + pos: 7.5,-7.5 + parent: 2 + - uid: 24 + components: + - type: Transform + pos: 3.5,-7.5 + parent: 2 + - uid: 25 + components: + - type: Transform + pos: 2.5,-7.5 + parent: 2 + - uid: 26 + components: + - type: Transform + pos: 0.5,-6.5 + parent: 2 + - uid: 27 + components: + - type: Transform + pos: 0.5,-5.5 + parent: 2 + - uid: 28 + components: + - type: Transform + pos: 0.5,-4.5 + parent: 2 + - uid: 29 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 2 + - uid: 30 + components: + - type: Transform + pos: 0.5,-2.5 + parent: 2 + - uid: 31 + components: + - type: Transform + pos: 0.5,-1.5 + parent: 2 + - uid: 32 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 2 + - uid: 33 + components: + - type: Transform + pos: 0.5,1.5 + parent: 2 + - uid: 34 + components: + - type: Transform + pos: 0.5,2.5 + parent: 2 + - uid: 35 + components: + - type: Transform + pos: 0.5,0.5 + parent: 2 + - uid: 36 + components: + - type: Transform + pos: 2.5,2.5 + parent: 2 + - uid: 37 + components: + - type: Transform + pos: 1.5,2.5 + parent: 2 + - uid: 38 + components: + - type: Transform + pos: 3.5,2.5 + parent: 2 + - uid: 39 + components: + - type: Transform + pos: 4.5,2.5 + parent: 2 + - uid: 40 + components: + - type: Transform + pos: 5.5,2.5 + parent: 2 + - uid: 41 + components: + - type: Transform + pos: 6.5,2.5 + parent: 2 + - uid: 42 + components: + - type: Transform + pos: 7.5,2.5 + parent: 2 + - uid: 43 + components: + - type: Transform + pos: 8.5,2.5 + parent: 2 + - uid: 44 + components: + - type: Transform + pos: 9.5,2.5 + parent: 2 + - uid: 45 + components: + - type: Transform + pos: 10.5,2.5 + parent: 2 + - uid: 46 + components: + - type: Transform + pos: 11.5,2.5 + parent: 2 +- proto: WallDiamond + entities: + - uid: 53 + components: + - type: Transform + pos: 2.5,1.5 + parent: 2 + - uid: 54 + components: + - type: Transform + pos: 2.5,0.5 + parent: 2 +- proto: WallMeat + entities: + - uid: 57 + components: + - type: Transform + pos: 9.5,1.5 + parent: 2 + - uid: 58 + components: + - type: Transform + pos: 9.5,0.5 + parent: 2 +... diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index 54695db82d8..566713b4c96 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -289,6 +289,19 @@ - state: idjanitor - type: PresetIdCard job: Janitor + - type: Scp914Upgradable + upgradeOptions: + Rough: + - item: null + Coarse: + - item: null + Fine: + - item: ResearchIDCard + VeryFine: + - item: ResearchIDCard + chance: 0.5 + - item: RDIDCard + chance: 0.5 - type: entity parent: IDCardStandard diff --git a/Resources/Prototypes/_Scp/Entities/Objects/scp914.yml b/Resources/Prototypes/_Scp/Entities/Objects/scp914.yml index 2d5023bf976..8f6ce12b746 100644 --- a/Resources/Prototypes/_Scp/Entities/Objects/scp914.yml +++ b/Resources/Prototypes/_Scp/Entities/Objects/scp914.yml @@ -78,8 +78,8 @@ - type: Scp914Container containerType: Output - type: EntityStorageVisuals - stateBaseClosed: left-door - stateDoorOpen: left-door + stateBaseClosed: right-door + stateDoorOpen: right-door stateDoorClosed: door - type: Sprite noRot: true diff --git a/Resources/Prototypes/_Scp/ScpEscapeMode/spawn_points.yml b/Resources/Prototypes/_Scp/ScpEscapeMode/spawn_points.yml new file mode 100644 index 00000000000..55c88a0df41 --- /dev/null +++ b/Resources/Prototypes/_Scp/ScpEscapeMode/spawn_points.yml @@ -0,0 +1,123 @@ +- type: entity + id: BaseSlSpawnPoints + abstract: true + noSpawn: true + parent: MarkerBase + components: + - type: Marker + - type: Sprite + layers: + - state: blue + +# Humanoids +- type: entity + id: SlMogSpawnPoint + parent: BaseSlSpawnPoints + components: + - type: Sprite + layers: + - sprite: _Scp/ScpSl/spawn-points.rsi + state: m + - type: SlHumanoidSpawnPoint + spawnPointType: Mog + +- type: entity + id: SlChaosSpawnPoint + parent: BaseSlSpawnPoints + components: + - type: Sprite + layers: + - sprite: _Scp/ScpSl/spawn-points.rsi + state: c + - type: SlHumanoidSpawnPoint + spawnPointType: Chaos + +- type: entity + id: SlClassDSpawnPoint + parent: BaseSlSpawnPoints + components: + - type: Sprite + layers: + - sprite: _Scp/ScpSl/spawn-points.rsi + state: d + - type: SlHumanoidSpawnPoint + spawnPointType: ClassD + +- type: entity + id: SlScientistSpawnPoint + parent: BaseSlSpawnPoints + components: + - type: Sprite + layers: + - sprite: _Scp/ScpSl/spawn-points.rsi + state: e + - type: SlHumanoidSpawnPoint + spawnPointType: Scientist + +- type: entity + id: SlSecuritySpawnPoint + parent: BaseSlSpawnPoints + components: + - type: Sprite + layers: + - sprite: _Scp/ScpSl/spawn-points.rsi + state: s + - type: SlHumanoidSpawnPoint + spawnPointType: Security + +# SCP +- type: entity + id: Sl096SpawnPoint + parent: BaseSlSpawnPoints + components: + - type: SlScpSpawnPoint + scpProtoId: Scp096 + playable: true + +- type: entity + id: Sl939ASpawnPoint + parent: BaseSlSpawnPoints + components: + - type: SlScpSpawnPoint + scpProtoId: Scp939 + playable: true + +- type: entity + id: Sl939BSpawnPoint + parent: BaseSlSpawnPoints + components: + - type: SlScpSpawnPoint + scpProtoId: Scp939 + playable: true + +- type: entity + id: Sl106SpawnPoints + parent: BaseSlSpawnPoints + components: + - type: SlScpSpawnPoint + scpProtoId: Scp106 + playable: true + +- type: entity + id: Sl173SpawnPoints + parent: BaseSlSpawnPoints + components: + - type: SlScpSpawnPoint + scpProtoId: Scp173 + playable: true + +- type: entity + id: Sl035SpawnPoints + parent: BaseSlSpawnPoints + components: + - type: SlScpSpawnPoint + scpProtoId: ClothingMaskScp035 + playable: false + +- type: entity + id: Sl500SpawnPoints + parent: BaseSlSpawnPoints + components: + - type: SlScpSpawnPoint + scpProtoId: PillCanisterScp500 + playable: false diff --git a/Resources/Prototypes/_Scp/ScpEscapeMode/triggers.yml b/Resources/Prototypes/_Scp/ScpEscapeMode/triggers.yml new file mode 100644 index 00000000000..97d8cdc3a9d --- /dev/null +++ b/Resources/Prototypes/_Scp/ScpEscapeMode/triggers.yml @@ -0,0 +1,34 @@ +- type: entity + id: BaseEscapeZone + name: EscapeZone + abstract: true + noSpawn: true + parent: MarkerBase + components: + - type: Sprite + - type: Marker + - type: Physics + bodyType: Static + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.5,0.5,0.5" + mask: + - MobMask + layer: + - MobMask + hard: false + - type: ScpSlEscapeZone + zoneType: Mog + +- type: entity + parent: BaseEscapeZone + id: SlEscapeZone + components: + - type: ScpSlEscapeZone + zoneType: Mog + - type: Sprite + layers: + - state: blue diff --git a/Resources/Prototypes/_Scp/SlGamemode/RandomHumanoidProfiles/sl_humanoid_profiles.yml b/Resources/Prototypes/_Scp/SlGamemode/RandomHumanoidProfiles/sl_humanoid_profiles.yml new file mode 100644 index 00000000000..90aba03a722 --- /dev/null +++ b/Resources/Prototypes/_Scp/SlGamemode/RandomHumanoidProfiles/sl_humanoid_profiles.yml @@ -0,0 +1,53 @@ +- type: randomHumanoidSettings + id: ClassDHumanoidSettings + randomizeName: true + components: + - type: Loadout + prototypes: [ SlClassDGear] + - type: ScpSlHumanoidMarker + humanoidType: ClassD + +- type: randomHumanoidSettings + id: ScientistHumanoidSettings + randomizeName: true + components: + - type: Loadout + prototypes: [ SlScientistGear ] + - type: ScpSlHumanoidMarker + humanoidType: Scientist + +- type: randomHumanoidSettings + id: SecurityHumanoidSettings + randomizeName: true + components: + - type: Loadout + prototypes: [ SlSecurityGear ] + - type: ScpSlHumanoidMarker + humanoidType: Security + +- type: randomHumanoidSettings + id: MogHumanoidSettings + randomizeName: true + components: + - type: Loadout + prototypes: [ SlMogGear ] + - type: ScpSlHumanoidMarker + humanoidType: Mog + +- type: randomHumanoidSettings + id: MogCaptainSettings + randomizeName: true + components: + - type: Loadout + prototypes: [ SlChaosGear ] + - type: ScpSlHumanoidMarker + humanoidType: Mog + +- type: randomHumanoidSettings + id: ChaosHumanoidSettings + randomizeName: true + components: + - type: Loadout + prototypes: [ SlChaosGear ] + - type: ScpSlHumanoidMarker + humanoidType: Chaos diff --git a/Resources/Prototypes/_Scp/SlGamemode/RandomHumanoidProfiles/sl_starting_gear.yml b/Resources/Prototypes/_Scp/SlGamemode/RandomHumanoidProfiles/sl_starting_gear.yml new file mode 100644 index 00000000000..35a5133f634 --- /dev/null +++ b/Resources/Prototypes/_Scp/SlGamemode/RandomHumanoidProfiles/sl_starting_gear.yml @@ -0,0 +1,85 @@ +- type: startingGear + id: SlClassDGear + equipment: + jumpsuit: ClothingUniformJumpsuitPrisoner + +- type: startingGear + id: SlScientistGear + equipment: + jumpsuit: ClothingUniformJumpsuitCapFormal + shoes: ClothingShoesBootsLaceup + eyes: ClothingEyesGlassesSunglasses + gloves: ClothingHandsGlovesCaptain + head: ClothingHeadHatCapcap + neck: ClothingNeckMantleCap + id: VisitorPDA + belt: WeaponDisabler + back: ClothingBackpackSatchelCaptain + ears: ClothingHeadsetAltCommand + outerClothing: ClothingOuterArmorCaptainCarapace + pocket1: WeaponDisabler + +- type: startingGear + id: SlSecurityGear + equipment: + jumpsuit: ClothingUniformJumpsuitCapFormal + shoes: ClothingShoesBootsLaceup + eyes: ClothingEyesGlassesSunglasses + gloves: ClothingHandsGlovesCaptain + head: ClothingHeadHatCapcap + neck: ClothingNeckMantleCap + id: VisitorPDA + belt: WeaponDisabler + back: ClothingBackpackSatchelCaptain + ears: ClothingHeadsetAltCommand + outerClothing: ClothingOuterArmorCaptainCarapace + pocket1: WeaponDisabler + +- type: startingGear + id: SlMogGear + equipment: + jumpsuit: ClothingUniformJumpsuitCapFormal + shoes: ClothingShoesBootsLaceup + eyes: ClothingEyesGlassesSunglasses + gloves: ClothingHandsGlovesCaptain + head: ClothingHeadHatCapcap + neck: ClothingNeckMantleCap + id: VisitorPDA + belt: WeaponDisabler + back: ClothingBackpackSatchelCaptain + ears: ClothingHeadsetAltCommand + outerClothing: ClothingOuterArmorCaptainCarapace + pocket1: WeaponDisabler + +- type: startingGear + id: SlChaosGear + equipment: + jumpsuit: ClothingUniformJumpsuitCapFormal + shoes: ClothingShoesBootsLaceup + eyes: ClothingEyesGlassesSunglasses + gloves: ClothingHandsGlovesCaptain + head: ClothingHeadHatCapcap + neck: ClothingNeckMantleCap + id: VisitorPDA + belt: WeaponDisabler + back: ClothingBackpackSatchelCaptain + ears: ClothingHeadsetAltCommand + outerClothing: ClothingOuterArmorCaptainCarapace + pocket1: WeaponDisabler + +- type: startingGear + id: SlMogCaptainGear + equipment: + jumpsuit: ClothingUniformJumpsuitCapFormal + shoes: ClothingShoesBootsLaceup + eyes: ClothingEyesGlassesSunglasses + gloves: ClothingHandsGlovesCaptain + head: ClothingHeadHatCapcap + neck: ClothingNeckMantleCap + id: VisitorPDA + belt: WeaponDisabler + back: ClothingBackpackSatchelCaptain + ears: ClothingHeadsetAltCommand + outerClothing: ClothingOuterArmorCaptainCarapace + pocket1: WeaponDisabler + diff --git a/Resources/Prototypes/_Scp/SlGamemode/gameRule.yml b/Resources/Prototypes/_Scp/SlGamemode/gameRule.yml new file mode 100644 index 00000000000..d86a33a85dd --- /dev/null +++ b/Resources/Prototypes/_Scp/SlGamemode/gameRule.yml @@ -0,0 +1,33 @@ +- type: entity + parent: BaseGameRule + id: ScpSlGameRule + components: + - type: GameRule + minPlayers: 2 + - type: LoadMapRule + mapPath: /Maps/_Fire/sl_scp_test.yml + - type: ScpSlGameRule + humanoidPresets: + ClassD: + - ClassDHumanoidSettings + Scientist: + - ScientistHumanoidSettings + Security: + - SecurityHumanoidSettings + Mog: + - MogHumanoidSettings + Chaos: + - ChaosHumanoidSettings + mogCaptainPrototype: MogCaptainSettings + waveSpawnCooldown: 300 + +- type: gamePreset + id: ScpSl + alias: + - ScpSl + name: scpsl-title + description: scpsl-description + showInVote: false + hide: false + rules: + - ScpSlGameRule diff --git a/Resources/Textures/_Scp/ScpSl/spawn-points.rsi/c.png b/Resources/Textures/_Scp/ScpSl/spawn-points.rsi/c.png new file mode 100644 index 0000000000000000000000000000000000000000..39855955cb3965712de3d62bc923adf46cf9c0b8 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}J3L(+Ln2z= zPP@(7V8G+L+G2vSMIWM zZ&|r~>5jYkRg*FmHFh#aD6EP*y466J{nq;Lub5gMMXKw~ds+|l1B0ilpUXO@geCwM C++k$^ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Scp/ScpSl/spawn-points.rsi/d.png b/Resources/Textures/_Scp/ScpSl/spawn-points.rsi/d.png new file mode 100644 index 0000000000000000000000000000000000000000..29c424dabecc4d7a928f221f1336ba587ada1b81 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}OFdm2Ln2z= zPCw1tpdjEPo*e!yQ9dk5{)=O5m3o7LF{AU0#hjJ>sXsHe8CmFk{b<*}+~mb4May-w z9c0`*ln!*{aA=6T{MpR3H1cVK?$iZZ1wS7IZJ6feF|A?Zgs%*{gqQeQ)QBrYG8J0uCfHipmHD96EcZjP1;!vnSkFKC0w1U-;_& hf-24{52oIK!pd3V{Vl{Re+tmS44$rjF6*2Ung9_3SJVIi literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Scp/ScpSl/spawn-points.rsi/e.png b/Resources/Textures/_Scp/ScpSl/spawn-points.rsi/e.png new file mode 100644 index 0000000000000000000000000000000000000000..46ed3e1476972f00545945dad1facf60d1ad73db GIT binary patch literal 248 zcmVPx#vPnciR9J=Wmn#y0FbqTk1D4}(f6Z~Q2(T5prTeFYbr`L z{|Id+8GsrhG*+l;u(B~kB^^UVX(jNkQ0O$wD9hq;%IpWa2eO;7382{hC;+v(1Gvrt yv)JXN^p#&q-&6uXB~Wd{X5_oTOnXHi>Y@i|?NELB4sqWA0000Px#(n&-?R9J=Wmfa12APj`nxQBzegTuIkgE@&lX-GqVu0Gf+qjxy6RstOm0MBquW&orqA`?J#xKv;K2vArRKx*g>B?N%Tb5sxj zdhhA_9H0mg37-`fJ_4>W2djaY0novm==w)qLL@6JfaEM1Miao3O3j%7G{=$KQf&t~ z6IlR@Bd(z}AJ>dmGLT9IDDm4R^=fYiYP|pHthRQ5y4M_e@}3|Ln2z= zPTMWmV8G+de0u|jci?7`ZUep$lNh^6ImO3SS0(=`kh!VJ`*mF>uf_JqN$2!`N1b(K z+;CEmL&CxLUeg4|sHJBapC>6Wm{~F#D$578HncG*{9-?_d&<1?7ys~FY|}Y;v_nT= zUD%q26Hnq4mi^8)Rc1d2tr!Nw4dhfzD^}boFyt=akR{02SX|P5=M^ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Scp/scp-914/32x32.rsi/door.png b/Resources/Textures/_Scp/scp-914/32x32.rsi/door.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e6819c091c2c9bd71cf6215b3ac738b04b2b71 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDb50q$YKTtz9S&aI8~cZ8YJiG z;uumf=j{z$p#}v3wt%^Y2OLc*{%@A}qHy64cVAzm${yVfFROWGZ_BRJ1F8pu24RD5 zhkv>M*m5SfJiDvyeZSrLVQJZIOVmbYD`SodsF8AR#k1TFUPkns*xA{xEcNdFe;j@aAi)V$maDspWI|}Sgj$rcDc%~V=PI6AEoXdwl!6d&er5fqz%`%NGVbZS%Hc3~@$UJukZ^b*&){cam3Q86(xH+|JAY*{n`pBA z_|NcTgTiI@XRlWCUfA-Bcf#}2cNwmfwr12${unsXFTQrReqZv*<(K)NPrSjL93;a8 Pj4=jJS3j3^P6(kPT+U?||fk-N=5^01w)j~k=Gu_e4(H}oZ&!u1-tmU&G}z5Cb7Z{H*T>BY@U zzALGlJz@=BTUR3Ldc^h8bP0l+XkKbmN1V literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Scp/scp-914/32x32.rsi/left.png b/Resources/Textures/_Scp/scp-914/32x32.rsi/left.png new file mode 100644 index 0000000000000000000000000000000000000000..1e80f20369094cc16c1574c9b41f5ff64a3bfeb9 GIT binary patch literal 615 zcmV-t0+{`YP);VKo)C1W1Z(46zegN=cj!NVHF#z4c+ENA3#;kk& zPz>N&U_KlU`2enGFEXzHd@5=y+eJ)GN#X6LPTIL`^VFPVE_G$I-zQl%C-D|j%{DS3;&ARSySbY7Jx}IigHTy ztW^Zq*~6}wsFFk=+5oC3s4`#FTdX30+b_88Iu*r^sl7o#?*ZwW^WI||0iKafFR8r* zO*OFdZ$uqH2hahWH9!)_|2zWyF!TqI4np!h`2|X54eifDcAx+N002ovPDHLkV1ldk B5DEYQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Scp/scp-914/32x32.rsi/meta.json b/Resources/Textures/_Scp/scp-914/32x32.rsi/meta.json new file mode 100644 index 00000000000..85bbddb4b90 --- /dev/null +++ b/Resources/Textures/_Scp/scp-914/32x32.rsi/meta.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 64 + }, + "states": [ + { + "name": "input" + }, + { + "name": "output" + }, + { + "name": "door" + }, + { + "name": "left" + }, + { + "name": "left-door" + }, + { + "name": "right-door" + }, + { + "name": "right" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Scp/scp-914/32x32.rsi/output.png b/Resources/Textures/_Scp/scp-914/32x32.rsi/output.png new file mode 100644 index 0000000000000000000000000000000000000000..2d2eafba12befb416e7875a1e3a2620816d9916e GIT binary patch literal 439 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDb50q$YKTtz9S&aI8~cZnt_2a z)6>N~IcYcA`|ybzX_JE=x&XT1B3?G>k2a$7d67T%hzJIA2^sHBJZRkPT+GAnMkf47-r zu{@(H=QY#zHx*9>;^O6=eN6kcs_F0Er9aJ!{N#R}i@R;rw6nTqHT#V)laJe0F|6^M zQdeWzH`8)^bkKE<4ZHMJvVtG1+PZP+c02v&w_?H>9|&8v91#zkE)?&Qn~>J~M14ov zTct@ln_k8)FcfwwI{fS7o11}5v2*5T&-(CBvuxJ~QHHDpMyU4`m==ilDcNpcetcqH z)ypMz*$sBA4g2{IuyCJBAc(?0YgqqBIQSt53jUTVRFvqy> Uzmm0Tjw#42Pgg&ebxsLQ0NEG0b^rhX literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Scp/scp-914/32x32.rsi/right-door.png b/Resources/Textures/_Scp/scp-914/32x32.rsi/right-door.png new file mode 100644 index 0000000000000000000000000000000000000000..30be5d232edb670b624e73973165fe7279be1a2a GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDb50q$YKTtz9S&aI8~cZ8YuYD z)5S5QV$Rzef!s|7BCHPA+<$2!^ z^3JqmVAvpcz|hua4P&kAKF;Jb6|u~dH2y`za4bCEte~K`h*9n?->#2U`**UwIXvNv zAn%FIIdKlLVT-$OtYKHbJ)zi6YU3Zrl-;uKj4@{$#1c-(6qqtcF`Q|9C!?{dDyl)V z=htP%UD~@Xo~Cr^)C({I-H8s?aBoQ!@L5r1*;h6dCpX6! yv#`u-lfL%OcK|Zq9scuPY0rnxuYaUY(oplCl5f$l+BsVgWTL05pUXO@geCx-v395c literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Scp/scp-914/32x32.rsi/right.png b/Resources/Textures/_Scp/scp-914/32x32.rsi/right.png new file mode 100644 index 0000000000000000000000000000000000000000..3568a713b7f6f62a0031843550a591b05e7fad7d GIT binary patch literal 603 zcmV-h0;K(kP)tAz#vvveec|{2VERHZnvAg-Ks(c> zD{Z-UEk&~D&Dg)*Z`a=Ct`LZ<0pRih9vAm}@jTBmdw`dxXFf<>*X=P)QxpJuo@rfG zT>v_GaW^*(Qk83Heg_g?mIrnf$t0JkBpdgsb_(bhX0u%Rz~|}%LW+E?%k~F5>NH9w z-i_~?Zy?2d4zcw9`UYgRTtZBd>wLyfRO^660F`MWviMGf@Wd=$V;-Q!*`SRf?5Obs znHQ`8M9BtBU)EUU2&+`A`$~2lGgU?amJgWgu`n)%Ie;Ah$MS(mF1aFV9%uog=Yg{P zo4)Gxpascd$;xk^?fDN_kS=UVp=P;BFxo+k5$^$<3kIz354FChc01zA?O%kY@Fn>s) p03fo+coe4VMFY@$o=xIG`~XnfMJl=FpgI5m002ovPDHLkV1h4G0yO{t literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Scp/scp-914/64x64.rsi/center.png b/Resources/Textures/_Scp/scp-914/64x64.rsi/center.png new file mode 100644 index 0000000000000000000000000000000000000000..9f31c994f696a4a6b2bbd823191fdebeea305098 GIT binary patch literal 1664 zcmV-`27md9P)1RCt{2Tg`GCMG&4KMSm7VNSKhS#Dyw3P*lMaaN;ev@Niss z3r;)%zHqQhMd08BEM$<^l7bNXP1Kvw?EG}ku4S9#t8!_xUaRN(rn{$mX46z}Io=7N z-f{#57(afpnf&(aJ#~i>_hj z$pfHSC-ST1()nDg-B$ZXPyixd1?H?1@hsrR`xYVU0nSXq}zPIiVO5YI@K|I za#dS|P|UN*!&YwdSsoeoc%&!^5K<3h@i~7v)Bh&5F`y7kvc6;&BJZjoNd)bcTOnwS zYsYu^szL9_VGxGRLAhKlMxGGM@?;O-7GJQ9F`QVTIhmX*E<_<l(>{d*LKB~oLdiRY zv)OD%gu=LoJYvgLqJI1Jm#PZB`{Ae3y~ANg{XShdMUaB!!=?-R$V&}>|Krc<)oP{g zw_5sBBGmNxnVL9q5UoTKR0?A4ih1lI0U;@do+ZLW^qa3fV?E~rt^bI7mq$v_96vrP z+;+KKC@zRRWnOiB>Rf&RA1T}iOfhf`x5tl91du=a;;EWnTxxINia<+YzUb!9H}t(E z>B#Ld5KiVb$%8Zz#(fj?J3LF`_yF>&ZEm9cLn3q!diwL~GK+E%3t+pwS%mmt&Lqt+ z?wR-P8TW+<0W%NS;lSsy&OM^z7XT}O3n1VBc%X(4N80VpdK{UV1JfG-nsqM7rmGh) zMSv%SykNC@74`tvIt~LD`FCER+RCrT{eh1C5P5QKGZ)ac`FnT)Rt0+2=LK+g*fecx z`&;tnE|wM|P!~7_pxKx1y!Z+qA`)|JZV2psN9a00vrN}Fg&RE@yGi1N9Rb>T$7Z@$ z-KQ{hK{_sR4)FaU45JQr6(7x zP#Mc0s}Mp-h@yZC7kMg-_}@|uu09~88*H`i%RRtF-rR}7))wbXpvo!$S8sL7p-9~z zXXY{S(LyK$S3iK*a~*&Ckh%(hJOrPrayUrQJo#m!+gQm~vacU_@aa>%dvx8$;Fx)k zPic$65y_l*CpSZAN2f2&_11JTkS$0Az~0fpc3ZoK6W~}Mz=cGOauTch^q`Y zccp4M81Vs{kw8lEK_qN&MR37B8k0gZkQ70ZZRika_6c;IDuSyS^1(bQX0t$zj|7(~ zbf9rP$b_&BG5G#=tN-?VF%EQ5h;kiDr>(d1aJ;Uxo$6A@&L5q0K$&0rF)Wu zs0Y|@hyeCRNb#=qr&A@`f5K1DXUF4x8Kz^X)L&w)Id}X20Z|~rneE&abf%02d4mJAj@Pg zO1Jm)zdfYmQtI`aX!S1sb~2B0000< KMNUMnLSTY(JrNlI literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Scp/scp-914/64x64.rsi/meta.json b/Resources/Textures/_Scp/scp-914/64x64.rsi/meta.json new file mode 100644 index 00000000000..9f7f6747ca1 --- /dev/null +++ b/Resources/Textures/_Scp/scp-914/64x64.rsi/meta.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "size": { + "x": 64, + "y": 64 + }, + "states": [ + { + "name": "center" + } + ] +} \ No newline at end of file From 711678972332d38357ac5e84729164e2797b246e Mon Sep 17 00:00:00 2001 From: Mona Hmiza Date: Tue, 8 Oct 2024 08:03:36 +0300 Subject: [PATCH 7/9] Oopsie Woopsie We Made a Fucky Wucky --- Content.Server/Voting/Managers/VoteManager.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Content.Server/Voting/Managers/VoteManager.cs b/Content.Server/Voting/Managers/VoteManager.cs index b682a81d25e..ad74901f485 100644 --- a/Content.Server/Voting/Managers/VoteManager.cs +++ b/Content.Server/Voting/Managers/VoteManager.cs @@ -243,7 +243,6 @@ private void SendUpdates(VoteReg v) private void SendSingleUpdate(VoteReg v, ICommonSession player) { - return; var msg = new MsgVoteData(); msg.VoteId = v.Id; From 1ba482e8316a51d785d69edd018818e12f6bd564 Mon Sep 17 00:00:00 2001 From: Mona Hmiza Date: Tue, 8 Oct 2024 08:03:43 +0300 Subject: [PATCH 8/9] Code cleanup --- .../_Scp/GameRules/ScpSl/ScpSlEscapeZoneComponent.cs | 6 +----- .../_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Spawns.cs | 1 - .../_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Tracker.cs | 4 +--- .../_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs | 9 ++++----- Content.Server/_Scp/GameRules/ScpSl/SlCvars.cs | 1 - 5 files changed, 6 insertions(+), 15 deletions(-) diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlEscapeZoneComponent.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlEscapeZoneComponent.cs index cdbda6d8893..28c518e6a0d 100644 --- a/Content.Server/_Scp/GameRules/ScpSl/ScpSlEscapeZoneComponent.cs +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlEscapeZoneComponent.cs @@ -1,14 +1,10 @@ using Content.Shared._Scp.GameRule.Sl; -using Content.Shared.NPC.Prototypes; using Robust.Shared.Prototypes; namespace Content.Server._Scp.GameRules.ScpSl; [RegisterComponent] -public sealed partial class ScpSlEscapeZoneComponent : Component -{ - -} +public sealed partial class ScpSlEscapeZoneComponent : Component; [RegisterComponent] public sealed partial class SlHumanoidSpawnPointComponent : Component diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Spawns.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Spawns.cs index db440752192..7ec5b289655 100644 --- a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Spawns.cs +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Spawns.cs @@ -7,7 +7,6 @@ using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; -using Robust.Shared.Utility; namespace Content.Server._Scp.GameRules.ScpSl; diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Tracker.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Tracker.cs index c2e3d331568..aad833b188e 100644 --- a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Tracker.cs +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Tracker.cs @@ -1,7 +1,5 @@ - -using Content.Shared._Scp.GameRule.Sl; +using Content.Shared._Scp.GameRule.Sl; using Content.Shared.Mobs; -using Content.Shared.Mobs.Components; namespace Content.Server._Scp.GameRules.ScpSl; diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs index 007e864842f..09665faff88 100644 --- a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs @@ -35,10 +35,9 @@ public sealed partial class ScpSlGameRuleSystem : GameRuleSystem "ScpSl"; - private TimeSpan NextRoundEndCheckTime; + private TimeSpan _nextRoundEndCheckTime; public override void Initialize() { @@ -115,9 +114,9 @@ protected override void ActiveTick(EntityUid uid, ScpSlGameRuleComponent compone var ruleEntity = new Entity(uid, component); SpawnUpdate(ruleEntity); - if (NextRoundEndCheckTime < _gameTiming.CurTime) + if (_nextRoundEndCheckTime < _gameTiming.CurTime) { - NextRoundEndCheckTime = _gameTiming.CurTime + TimeSpan.FromSeconds(5); + _nextRoundEndCheckTime = _gameTiming.CurTime + TimeSpan.FromSeconds(5); TryEndRound(); } @@ -128,7 +127,7 @@ protected override void Started(EntityUid uid, ScpSlGameRuleComponent component, base.Started(uid, component, gameRule, args); component.NextWaveSpawnTime = _gameTiming.CurTime + component.WaveSpawnCooldown; - NextRoundEndCheckTime = _gameTiming.CurTime + TimeSpan.FromMinutes(1); + _nextRoundEndCheckTime = _gameTiming.CurTime + TimeSpan.FromMinutes(1); } protected override void AppendRoundEndText(EntityUid uid, diff --git a/Content.Server/_Scp/GameRules/ScpSl/SlCvars.cs b/Content.Server/_Scp/GameRules/ScpSl/SlCvars.cs index bfeeb18e3c1..646cdff65d7 100644 --- a/Content.Server/_Scp/GameRules/ScpSl/SlCvars.cs +++ b/Content.Server/_Scp/GameRules/ScpSl/SlCvars.cs @@ -5,7 +5,6 @@ namespace Content.Server._Scp.GameRules.ScpSl; [CVarDefs] public sealed class SlCvars { - public static readonly CVarDef MaxMogSpawnCount = CVarDef.Create("sl.max_mog_spawn_count", 20, CVar.SERVERONLY | CVar.ARCHIVE); From b65107561c05a151e2645a4caf8c676001b9c57a Mon Sep 17 00:00:00 2001 From: Mona Hmiza Date: Tue, 8 Oct 2024 10:54:06 +0300 Subject: [PATCH 9/9] Fixes --- .../_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Escape.cs | 4 ++-- .../_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Tracker.cs | 5 +++-- Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs | 6 ++++-- .../RandomHumanoidProfiles/sl_humanoid_profiles.yml | 2 +- Resources/Prototypes/_Scp/SlGamemode/gameRule.yml | 1 + 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Escape.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Escape.cs index 2437826b494..522cbb17c05 100644 --- a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Escape.cs +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Escape.cs @@ -13,7 +13,7 @@ private void InitializeEscape() private void OnEscapeZoneCollide(Entity ent, ref StartCollideEvent args) { - if(!TryGetActiveRule(out var rule)) + if (!TryGetActiveRule(out var rule)) { return; } @@ -40,7 +40,7 @@ private void OnEscapeZoneCollide(Entity ent, ref Start rule.Value.Comp1.EscapedDClass++; } } - else if(humanoidToSpawn == ScpSlHumanoidType.Scientist) + else if (humanoidToSpawn == ScpSlHumanoidType.Scientist) { rule.Value.Comp1.EscapedScientists++; humanoidToSpawn = ScpSlHumanoidType.Mog; diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Tracker.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Tracker.cs index aad833b188e..538305e512b 100644 --- a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Tracker.cs +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.Tracker.cs @@ -24,9 +24,10 @@ private void OnScpMobStateChanged(Entity ent, ref MobSt if (args.NewMobState != MobState.Alive) { ent.Comp.Contained = true; - TryEndRound(); _ghostSystem.SpawnGhost(ent.Owner, canReturn: false); + + TryEndRound(); } } @@ -38,7 +39,7 @@ private void OnScpRemoved(Entity ent, ref ComponentRemo private void OnHumanoidMobStateChanged(Entity ent, ref MobStateChangedEvent args) { - if (args.NewMobState != MobState.Alive) + if (args.NewMobState == MobState.Dead) { TryEndRound(); } diff --git a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs index 09665faff88..7191be8fa83 100644 --- a/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs +++ b/Content.Server/_Scp/GameRules/ScpSl/ScpSlGameRuleSystem.cs @@ -15,6 +15,7 @@ using Robust.Server.Player; using Robust.Shared.Configuration; using Robust.Shared.Map.Components; +using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Timing; using Robust.Shared.Utility; @@ -38,6 +39,7 @@ public sealed partial class ScpSlGameRuleSystem : GameRuleSystem "ScpSl"; private TimeSpan _nextRoundEndCheckTime; + private EntProtoId _ashPrototype = "Ash"; public override void Initialize() { @@ -101,7 +103,7 @@ private void DustifyAllMobsOnGrid(Entity gridEntity) var mobXform = Transform(mob); _mobStateSystem.ChangeMobState(mob, MobState.Dead); - Spawn("Ash", mobXform.Coordinates); + Spawn(_ashPrototype, mobXform.Coordinates); Del(mob); } @@ -201,7 +203,7 @@ private void TryEndRound() } } - if(dAlive == 0 && mogAlive == 0 && scpAlive == 0) + if (dAlive == 0 && mogAlive == 0 && scpAlive == 0) { shouldRoundEnd = true; slGameRuleComponent.WinType = SlWinType.Tie; diff --git a/Resources/Prototypes/_Scp/SlGamemode/RandomHumanoidProfiles/sl_humanoid_profiles.yml b/Resources/Prototypes/_Scp/SlGamemode/RandomHumanoidProfiles/sl_humanoid_profiles.yml index 90aba03a722..37be0e1e329 100644 --- a/Resources/Prototypes/_Scp/SlGamemode/RandomHumanoidProfiles/sl_humanoid_profiles.yml +++ b/Resources/Prototypes/_Scp/SlGamemode/RandomHumanoidProfiles/sl_humanoid_profiles.yml @@ -39,7 +39,7 @@ randomizeName: true components: - type: Loadout - prototypes: [ SlChaosGear ] + prototypes: [ SlMogCaptainGear ] - type: ScpSlHumanoidMarker humanoidType: Mog diff --git a/Resources/Prototypes/_Scp/SlGamemode/gameRule.yml b/Resources/Prototypes/_Scp/SlGamemode/gameRule.yml index d86a33a85dd..3ef7b5a840b 100644 --- a/Resources/Prototypes/_Scp/SlGamemode/gameRule.yml +++ b/Resources/Prototypes/_Scp/SlGamemode/gameRule.yml @@ -25,6 +25,7 @@ id: ScpSl alias: - ScpSl + - scpsl name: scpsl-title description: scpsl-description showInVote: false