diff --git a/Content.Client/Drunk/DrunkOverlay.cs b/Content.Client/Drunk/DrunkOverlay.cs index 1f26e75ffc..c806cdad66 100644 --- a/Content.Client/Drunk/DrunkOverlay.cs +++ b/Content.Client/Drunk/DrunkOverlay.cs @@ -1,5 +1,6 @@ using Content.Shared.Drunk; using Content.Shared.StatusEffect; +using Content.Shared.StatusEffectNew; using Robust.Client.Graphics; using Robust.Client.Player; using Robust.Shared.Enums; @@ -43,19 +44,21 @@ public sealed class DrunkOverlay : Overlay if (playerEntity == null) return; - if (!_entityManager.HasComponent(playerEntity) - || !_entityManager.TryGetComponent(playerEntity, out var status)) + var statusSys = _sysMan.GetEntitySystem(); + if (!statusSys.TryGetMaxTime(playerEntity.Value, out var status)) return; - var statusSys = _sysMan.GetEntitySystem(); - if (!statusSys.TryGetTime(playerEntity.Value, SharedDrunkSystem.DrunkKey, out var time, status)) - return; + var time = status.Item2; - var curTime = _timing.CurTime; - var timeLeft = (float) (time.Value.Item2 - curTime).TotalSeconds; + var power = SharedDrunkSystem.MagicNumber; + if (time != null) + { + var curTime = _timing.CurTime; + power = (float) (time - curTime).Value.TotalSeconds; + } - CurrentBoozePower += 8f * (0.5f*timeLeft - CurrentBoozePower) * args.DeltaSeconds / (timeLeft+1); + CurrentBoozePower += 8f * (power * 0.5f - CurrentBoozePower) * args.DeltaSeconds / (power+1); } protected override bool BeforeDraw(in OverlayDrawArgs args) diff --git a/Content.Client/Drunk/DrunkSystem.cs b/Content.Client/Drunk/DrunkSystem.cs index d9c6bb192f..c5fab75e7d 100644 --- a/Content.Client/Drunk/DrunkSystem.cs +++ b/Content.Client/Drunk/DrunkSystem.cs @@ -1,4 +1,5 @@ using Content.Shared.Drunk; +using Content.Shared.StatusEffectNew; using Robust.Client.Graphics; using Robust.Client.Player; using Robust.Shared.Player; @@ -16,38 +17,41 @@ public sealed class DrunkSystem : SharedDrunkSystem { base.Initialize(); - SubscribeLocalEvent(OnDrunkInit); - SubscribeLocalEvent(OnDrunkShutdown); + SubscribeLocalEvent(OnStatusApplied); + SubscribeLocalEvent(OnStatusRemoved); - SubscribeLocalEvent(OnPlayerAttached); - SubscribeLocalEvent(OnPlayerDetached); + SubscribeLocalEvent>(OnPlayerAttached); + SubscribeLocalEvent>(OnPlayerDetached); _overlay = new(); } - private void OnPlayerAttached(EntityUid uid, DrunkComponent component, LocalPlayerAttachedEvent args) + private void OnStatusApplied(Entity entity, ref StatusEffectAppliedEvent args) { - _overlayMan.AddOverlay(_overlay); + if (!_overlayMan.HasOverlay()) + _overlayMan.AddOverlay(_overlay); } - private void OnPlayerDetached(EntityUid uid, DrunkComponent component, LocalPlayerDetachedEvent args) + private void OnStatusRemoved(Entity entity, ref StatusEffectRemovedEvent args) { + if (Status.HasEffectComp(args.Target)) + return; + + if (_player.LocalEntity != args.Target) + return; + _overlay.CurrentBoozePower = 0; _overlayMan.RemoveOverlay(_overlay); } - private void OnDrunkInit(EntityUid uid, DrunkComponent component, ComponentInit args) + private void OnPlayerAttached(Entity entity, ref StatusEffectRelayedEvent args) { - if (_player.LocalEntity == uid) - _overlayMan.AddOverlay(_overlay); + _overlayMan.AddOverlay(_overlay); } - private void OnDrunkShutdown(EntityUid uid, DrunkComponent component, ComponentShutdown args) + private void OnPlayerDetached(Entity entity, ref StatusEffectRelayedEvent args) { - if (_player.LocalEntity == uid) - { - _overlay.CurrentBoozePower = 0; - _overlayMan.RemoveOverlay(_overlay); - } + _overlay.CurrentBoozePower = 0; + _overlayMan.RemoveOverlay(_overlay); } } diff --git a/Content.Client/Inventory/ClientInventorySystem.cs b/Content.Client/Inventory/ClientInventorySystem.cs index 97da176ed2..73f837d0d8 100644 --- a/Content.Client/Inventory/ClientInventorySystem.cs +++ b/Content.Client/Inventory/ClientInventorySystem.cs @@ -21,7 +21,6 @@ namespace Content.Client.Inventory { [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IUserInterfaceManager _ui = default!; - [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly ClientClothingSystem _clothingVisualsSystem = default!; [Dependency] private readonly ExamineSystem _examine = default!; diff --git a/Content.Client/Movement/Systems/ContentEyeSystem.cs b/Content.Client/Movement/Systems/ContentEyeSystem.cs index 518a4a1bd4..a332d25f9a 100644 --- a/Content.Client/Movement/Systems/ContentEyeSystem.cs +++ b/Content.Client/Movement/Systems/ContentEyeSystem.cs @@ -1,7 +1,6 @@ using System.Numerics; using Content.Shared.Movement.Components; using Content.Shared.Movement.Systems; -using Robust.Client.GameObjects; using Robust.Client.Player; namespace Content.Client.Movement.Systems; @@ -63,4 +62,15 @@ public sealed class ContentEyeSystem : SharedContentEyeSystem UpdateEyeOffset((entity, eyeComponent)); } } + + public override void Update(float frameTime) + { + base.Update(frameTime); + // TODO: Ideally we wouldn't want this to run in both FrameUpdate and Update, but we kind of have to since the visual update happens in FrameUpdate, but interaction update happens in Update. It's a workaround and a better solution should be found. + var eyeEntities = AllEntityQuery(); + while (eyeEntities.MoveNext(out var entity, out ContentEyeComponent? contentComponent, out EyeComponent? eyeComponent)) + { + UpdateEyeOffset((entity, eyeComponent)); + } + } } diff --git a/Content.Client/Movement/Systems/EyeCursorOffsetSystem.cs b/Content.Client/Movement/Systems/EyeCursorOffsetSystem.cs index 98ce4d7bfc..b758071094 100644 --- a/Content.Client/Movement/Systems/EyeCursorOffsetSystem.cs +++ b/Content.Client/Movement/Systems/EyeCursorOffsetSystem.cs @@ -1,6 +1,7 @@ using System.Numerics; using Content.Client.Movement.Components; using Content.Shared._Sunrise.SunriseCCVars; +using Content.Client.Viewport; using Content.Shared.Camera; using Content.Shared.Input; using Robust.Client.GameObjects; @@ -31,7 +32,7 @@ public sealed partial class EyeCursorOffsetSystem : EntitySystem // This value is here to make sure the user doesn't have to move their mouse // all the way out to the edge of the screen to get the full offset. - private readonly float _edgeOffset = 0.9f; + private static float _edgeOffset = 0.8f; public override void Initialize() { @@ -63,6 +64,10 @@ public sealed partial class EyeCursorOffsetSystem : EntitySystem public Vector2? OffsetAfterMouse(EntityUid uid, EyeCursorOffsetComponent? component) { + // We need the main viewport where the game content is displayed, as certain UI layouts (e.g. Separated HUD) can make it a different size to the game window. + if (_eyeManager.MainViewport is not ScalingViewport vp) + return null; + // Sunrise-Start if (_holdLookUp) { @@ -77,24 +82,25 @@ public sealed partial class EyeCursorOffsetSystem : EntitySystem } // Sunrise-End - var localPlayer = _player.LocalEntity; - var mousePos = _inputManager.MouseScreenPosition; - var screenControl = _eyeManager.MainViewport as Control; - var screenSize = screenControl?.PixelSize ?? _clyde.MainWindow.Size; - var minValue = MathF.Min(screenSize.X / 2, screenSize.Y / 2) * _edgeOffset; + var mousePos = _inputManager.MouseScreenPosition.Position; // TODO: If we ever get a right-aligned Separated HUD setting, this might need to be adjusted for that. - var mouseNormalizedPos = new Vector2(-(mousePos.X - screenSize.X / 2) / minValue, (mousePos.Y - screenSize.Y / 2) / minValue); // X needs to be inverted here for some reason, otherwise it ends up flipped. + var viewportSize = vp.PixelSize; // The size of the game viewport, including black bars - does not include the chatbox in Separated HUD view. + var scalingViewportSize = vp.ViewportSize * vp.CurrentRenderScale; // The size of the viewport in which the game is rendered (i.e. not including black bars). Note! Can extend outside the game window with certain zoom settings! + var visibleViewportSize = Vector2.Min(viewportSize, scalingViewportSize); // The size of the game viewport that is "actually visible" to the player, cutting off over-extensions and not counting black bar padding. - if (localPlayer == null) - return null; + Matrix3x2.Invert(_eyeManager.MainViewport.GetLocalToScreenMatrix(), out var matrix); + var mouseCoords = Vector2.Transform(mousePos, matrix); // Gives the mouse position inside of the *scaling viewport*, i.e. 0,0 is inside the black bars. Note! 0,0 can be outside the game window with certain zoom settings! + + var boundedMousePos = Vector2.Clamp(Vector2.Min(mouseCoords, mousePos), Vector2.Zero, visibleViewportSize); // Mouse position inside the visible game viewport's bounds. + + var offsetRadius = MathF.Min(visibleViewportSize.X / 2f, visibleViewportSize.Y / 2f) * _edgeOffset; + var mouseNormalizedPos = new Vector2(-(boundedMousePos.X - visibleViewportSize.X / 2f) / offsetRadius, (boundedMousePos.Y - visibleViewportSize.Y / 2f) / offsetRadius); if (component == null) - { component = EnsureComp(uid); - } // Doesn't move the offset if the mouse has left the game window! - if (mousePos.Window != WindowId.Invalid) + if (_inputManager.MouseScreenPosition.Window != WindowId.Invalid) { // The offset must account for the in-world rotation. var eyeRotation = _eyeManager.CurrentEye.Rotation; @@ -115,7 +121,7 @@ public sealed partial class EyeCursorOffsetSystem : EntitySystem var vectorOffset = component.TargetPosition - component.CurrentPosition; if (vectorOffset.Length() > component.OffsetSpeed) { - vectorOffset = vectorOffset.Normalized() * component.OffsetSpeed; + vectorOffset = vectorOffset.Normalized() * component.OffsetSpeed; // TODO: Probably needs to properly account for time delta or something. } component.CurrentPosition += vectorOffset; } diff --git a/Content.Client/Stack/StackSystem.cs b/Content.Client/Stack/StackSystem.cs index d7d1c34ae2..182daa73a5 100644 --- a/Content.Client/Stack/StackSystem.cs +++ b/Content.Client/Stack/StackSystem.cs @@ -12,7 +12,6 @@ namespace Content.Client.Stack { [Dependency] private readonly AppearanceSystem _appearanceSystem = default!; [Dependency] private readonly ItemCounterSystem _counterSystem = default!; - [Dependency] private readonly SpriteSystem _sprite = default!; public override void Initialize() { diff --git a/Content.Client/UserInterface/Controls/MenuButton.cs b/Content.Client/UserInterface/Controls/MenuButton.cs index 540a8ecb57..a0ba21da74 100644 --- a/Content.Client/UserInterface/Controls/MenuButton.cs +++ b/Content.Client/UserInterface/Controls/MenuButton.cs @@ -25,7 +25,7 @@ public sealed class MenuButton : ContainerButton private Color NormalColor => HasStyleClass(StyleClassRedTopButton) ? ColorRedNormal : ColorNormal; private Color HoveredColor => HasStyleClass(StyleClassRedTopButton) ? ColorRedHovered : ColorHovered; - private BoundKeyFunction _function; + private BoundKeyFunction? _function; private readonly BoxContainer _root; private readonly TextureRect? _buttonIcon; private readonly Label? _buttonLabel; @@ -33,13 +33,13 @@ public sealed class MenuButton : ContainerButton public string AppendStyleClass { set => AddStyleClass(value); } public Texture? Icon { get => _buttonIcon!.Texture; set => _buttonIcon!.Texture = value; } - public BoundKeyFunction BoundKey + public BoundKeyFunction? BoundKey { get => _function; set { _function = value; - _buttonLabel!.Text = BoundKeyHelper.ShortKeyName(value); + _buttonLabel!.Text = _function == null ? "" : BoundKeyHelper.ShortKeyName(_function.Value); } } @@ -95,12 +95,12 @@ public sealed class MenuButton : ContainerButton private void OnKeyBindingChanged(IKeyBinding obj) { - _buttonLabel!.Text = BoundKeyHelper.ShortKeyName(_function); + _buttonLabel!.Text = _function == null ? "" : BoundKeyHelper.ShortKeyName(_function.Value); } private void OnKeyBindingChanged() { - _buttonLabel!.Text = BoundKeyHelper.ShortKeyName(_function); + _buttonLabel!.Text = _function == null ? "" : BoundKeyHelper.ShortKeyName(_function.Value); } protected override void StylePropertiesChanged() diff --git a/Content.Client/Wieldable/WieldableSystem.cs b/Content.Client/Wieldable/WieldableSystem.cs index 2de837923c..e40544e39d 100644 --- a/Content.Client/Wieldable/WieldableSystem.cs +++ b/Content.Client/Wieldable/WieldableSystem.cs @@ -29,7 +29,10 @@ public sealed class WieldableSystem : SharedWieldableSystem return; if (_gameTiming.IsFirstTimePredicted) + { cursorOffsetComp.CurrentPosition = Vector2.Zero; + cursorOffsetComp.TargetPosition = Vector2.Zero; + } } public void OnGetEyeOffset(Entity entity, ref HeldRelayedEvent args) diff --git a/Content.Server/Animals/Systems/ParrotMemorySystem.cs b/Content.Server/Animals/Systems/ParrotMemorySystem.cs index a88957913f..6d8192f5d5 100644 --- a/Content.Server/Animals/Systems/ParrotMemorySystem.cs +++ b/Content.Server/Animals/Systems/ParrotMemorySystem.cs @@ -29,12 +29,10 @@ public sealed partial class ParrotMemorySystem : SharedParrotMemorySystem { [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; - [Dependency] private readonly IAdminManager _admin = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly MobStateSystem _mobState = default!; - [Dependency] private readonly PopupSystem _popup = default!; public override void Initialize() { diff --git a/Content.Server/Electrocution/ElectrocutionSystem.cs b/Content.Server/Electrocution/ElectrocutionSystem.cs index 1f04421c0f..a162b29e19 100644 --- a/Content.Server/Electrocution/ElectrocutionSystem.cs +++ b/Content.Server/Electrocution/ElectrocutionSystem.cs @@ -418,7 +418,7 @@ public sealed class ElectrocutionSystem : SharedElectrocutionSystem } } - _stuttering.DoStutter(uid, time * StutteringTimeMultiplier, refresh, statusEffects); + _stuttering.DoStutter(uid, time * StutteringTimeMultiplier, refresh); _jittering.DoJitter(uid, time * JitterTimeMultiplier, refresh, JitterAmplitude, JitterFrequency, true, statusEffects); _popup.PopupEntity(Loc.GetString("electrocuted-component-mob-shocked-popup-player"), uid, uid); diff --git a/Content.Server/NPC/Systems/NPCUtilitySystem.cs b/Content.Server/NPC/Systems/NPCUtilitySystem.cs index 6de26cd056..26910d1603 100644 --- a/Content.Server/NPC/Systems/NPCUtilitySystem.cs +++ b/Content.Server/NPC/Systems/NPCUtilitySystem.cs @@ -42,14 +42,12 @@ public sealed class NPCUtilitySystem : EntitySystem { [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly ContainerSystem _container = default!; - [Dependency] private readonly DrinkSystem _drink = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly HandsSystem _hands = default!; [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly IngestionSystem _ingestion = default!; [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly NpcFactionSystem _npcFaction = default!; - [Dependency] private readonly OpenableSystem _openable = default!; [Dependency] private readonly PuddleSystem _puddle = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SharedSolutionContainerSystem _solutions = default!; diff --git a/Content.Server/Objectives/Systems/PickObjectiveTargetSystem.cs b/Content.Server/Objectives/Systems/PickObjectiveTargetSystem.cs index 0fa20c27e5..b3075b2274 100644 --- a/Content.Server/Objectives/Systems/PickObjectiveTargetSystem.cs +++ b/Content.Server/Objectives/Systems/PickObjectiveTargetSystem.cs @@ -16,8 +16,6 @@ public sealed class PickObjectiveTargetSystem : EntitySystem { [Dependency] private readonly TargetObjectiveSystem _target = default!; [Dependency] private readonly SharedMindSystem _mind = default!; - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly TraitorRuleSystem _traitorRule = default!; public override void Initialize() { diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs b/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs index 4507c778cf..ade62bddcc 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs @@ -19,7 +19,6 @@ namespace Content.Server.Silicons.Borgs; public sealed partial class BorgSystem { [Dependency] private readonly EmagSystem _emag = default!; - [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly MobThresholdSystem _mobThresholdSystem = default!; [Dependency] private readonly ItemSlotsSystem _itemSlotsSystem = default!; diff --git a/Content.Server/Singularity/EntitySystems/EmitterSystem.cs b/Content.Server/Singularity/EntitySystems/EmitterSystem.cs index 28d3eedd32..2ccdc10934 100644 --- a/Content.Server/Singularity/EntitySystems/EmitterSystem.cs +++ b/Content.Server/Singularity/EntitySystems/EmitterSystem.cs @@ -28,7 +28,6 @@ namespace Content.Server.Singularity.EntitySystems public sealed class EmitterSystem : SharedEmitterSystem { [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; diff --git a/Content.Server/Speech/Components/StutteringAccentComponent.cs b/Content.Server/Speech/Components/StutteringAccentComponent.cs index e82cd9b12b..dd65ef66e0 100644 --- a/Content.Server/Speech/Components/StutteringAccentComponent.cs +++ b/Content.Server/Speech/Components/StutteringAccentComponent.cs @@ -6,29 +6,25 @@ namespace Content.Server.Speech.Components /// /// Percentage chance that a stutter will occur if it matches. /// - [DataField("matchRandomProb")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float MatchRandomProb = 0.8f; /// /// Percentage chance that a stutter occurs f-f-f-f-four times. /// - [DataField("fourRandomProb")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float FourRandomProb = 0.1f; /// /// Percentage chance that a stutter occurs t-t-t-three times. /// - [DataField("threeRandomProb")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float ThreeRandomProb = 0.2f; /// /// Percentage chance that a stutter cut off. /// - [DataField("cutRandomProb")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float CutRandomProb = 0.05f; } } diff --git a/Content.Server/Speech/EntitySystems/SlurredSystem.cs b/Content.Server/Speech/EntitySystems/SlurredSystem.cs index 8bb1bd6ff1..cc223b1edf 100644 --- a/Content.Server/Speech/EntitySystems/SlurredSystem.cs +++ b/Content.Server/Speech/EntitySystems/SlurredSystem.cs @@ -3,8 +3,7 @@ using Content.Server.Speech.Components; using Content.Shared.Drunk; using Content.Shared.Speech; using Content.Shared.Speech.EntitySystems; -using Content.Shared.StatusEffect; -using Robust.Shared.Prototypes; +using Content.Shared.StatusEffectNew; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -12,26 +11,15 @@ namespace Content.Server.Speech.EntitySystems; public sealed class SlurredSystem : SharedSlurredSystem { - [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; + [Dependency] private readonly StatusEffectsSystem _status = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IGameTiming _timing = default!; - private static readonly ProtoId SlurKey = "SlurredSpeech"; - public override void Initialize() { SubscribeLocalEvent(OnAccent); - } - public override void DoSlur(EntityUid uid, TimeSpan time, StatusEffectsComponent? status = null) - { - if (!Resolve(uid, ref status, false)) - return; - - if (!_statusEffectsSystem.HasStatusEffect(uid, SlurKey, status)) - _statusEffectsSystem.TryAddStatusEffect(uid, SlurKey, time, true, status); - else - _statusEffectsSystem.TryAddTime(uid, SlurKey, time, status); + SubscribeLocalEvent>(OnAccentRelayed); } /// @@ -39,15 +27,33 @@ public sealed class SlurredSystem : SharedSlurredSystem /// private float GetProbabilityScale(EntityUid uid) { - if (!_statusEffectsSystem.TryGetTime(uid, SharedDrunkSystem.DrunkKey, out var time)) + if (!_status.TryGetMaxTime(uid, out var time)) return 0; - var curTime = _timing.CurTime; - var timeLeft = (float) (time.Value.Item2 - curTime).TotalSeconds; - return Math.Clamp((timeLeft - 80) / 1100, 0f, 1f); + // This is a magic number. Why this value? No clue it was made 3 years before I refactored this. + var magic = SharedDrunkSystem.MagicNumber; + + if (time.Item2 != null) + { + var curTime = _timing.CurTime; + magic = (float) (time.Item2 - curTime).Value.TotalSeconds - 80f; + } + + return Math.Clamp(magic / SharedDrunkSystem.MagicNumber, 0f, 1f); } - private void OnAccent(EntityUid uid, SlurredAccentComponent component, AccentGetEvent args) + private void OnAccent(Entity entity, ref AccentGetEvent args) + { + GetAccent(entity, ref args); + } + + private void OnAccentRelayed(Entity entity, ref StatusEffectRelayedEvent args) + { + var ev = args.Args; + GetAccent(args.Args.Entity, ref ev); + } + + private void GetAccent(EntityUid uid, ref AccentGetEvent args) { var scale = GetProbabilityScale(uid); args.Message = Accentuate(args.Message, scale); diff --git a/Content.Server/Speech/EntitySystems/StutteringSystem.cs b/Content.Server/Speech/EntitySystems/StutteringSystem.cs index b6836da01a..09af2b4ed1 100644 --- a/Content.Server/Speech/EntitySystems/StutteringSystem.cs +++ b/Content.Server/Speech/EntitySystems/StutteringSystem.cs @@ -3,14 +3,13 @@ using System.Text.RegularExpressions; using Content.Server.Speech.Components; using Content.Shared.Speech; using Content.Shared.Speech.EntitySystems; -using Content.Shared.StatusEffect; +using Content.Shared.StatusEffectNew; using Robust.Shared.Random; namespace Content.Server.Speech.EntitySystems { public sealed class StutteringSystem : SharedStutteringSystem { - [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly IRobustRandom _random = default!; // Regex of characters to stutter. @@ -20,19 +19,36 @@ namespace Content.Server.Speech.EntitySystems public override void Initialize() { SubscribeLocalEvent(OnAccent); + + SubscribeLocalEvent>(OnAccent); } - public override void DoStutter(EntityUid uid, TimeSpan time, bool refresh, StatusEffectsComponent? status = null) + public override void DoStutter(EntityUid uid, TimeSpan time, bool refresh) { - if (!Resolve(uid, ref status, false)) - return; - - _statusEffectsSystem.TryAddStatusEffect(uid, StutterKey, time, refresh, status); + if (refresh) + Status.TryUpdateStatusEffectDuration(uid, Stuttering, time); + else + Status.TryAddStatusEffectDuration(uid, Stuttering, time); } - private void OnAccent(EntityUid uid, StutteringAccentComponent component, AccentGetEvent args) + public override void DoRemoveStutterTime(EntityUid uid, TimeSpan timeRemoved) { - args.Message = Accentuate(args.Message, component); + Status.TryAddTime(uid, Stuttering, -timeRemoved); + } + + public override void DoRemoveStutter(EntityUid uid) + { + Status.TryRemoveStatusEffect(uid, Stuttering); + } + + private void OnAccent(Entity entity, ref AccentGetEvent args) + { + args.Message = Accentuate(args.Message, entity.Comp); + } + + private void OnAccent(Entity entity, ref StatusEffectRelayedEvent args) + { + args.Args.Message = Accentuate(args.Args.Message, entity.Comp); } public string Accentuate(string message, StutteringAccentComponent component) diff --git a/Content.Server/Stack/StackSystem.cs b/Content.Server/Stack/StackSystem.cs index a24cb2df42..aac5a23902 100644 --- a/Content.Server/Stack/StackSystem.cs +++ b/Content.Server/Stack/StackSystem.cs @@ -16,13 +16,9 @@ namespace Content.Server.Stack { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - public static readonly int[] DefaultSplitAmounts = { 1, 5, 10, 20, 30, 50 }; - public override void Initialize() { base.Initialize(); - - SubscribeLocalEvent>(OnStackAlternativeInteract); } public override void SetCount(EntityUid uid, int amount, StackComponent? component = null) @@ -165,42 +161,7 @@ namespace Content.Server.Stack return amounts; } - private void OnStackAlternativeInteract(EntityUid uid, StackComponent stack, GetVerbsEvent args) - { - if (!args.CanAccess || !args.CanInteract || args.Hands == null || stack.Count == 1) - return; - - AlternativeVerb halve = new() - { - Text = Loc.GetString("comp-stack-split-halve"), - Category = VerbCategory.Split, - Act = () => UserSplit(uid, args.User, stack.Count / 2, stack), - Priority = 1 - }; - args.Verbs.Add(halve); - - var priority = 0; - foreach (var amount in DefaultSplitAmounts) - { - if (amount >= stack.Count) - continue; - - AlternativeVerb verb = new() - { - Text = amount.ToString(), - Category = VerbCategory.Split, - Act = () => UserSplit(uid, args.User, amount, stack), - // we want to sort by size, not alphabetically by the verb text. - Priority = priority - }; - - priority--; - - args.Verbs.Add(verb); - } - } - - private void UserSplit(EntityUid uid, EntityUid userUid, int amount, + protected override void UserSplit(EntityUid uid, EntityUid userUid, int amount, StackComponent? stack = null, TransformComponent? userTransform = null) { diff --git a/Content.Shared/Body/Components/BloodstreamComponent.cs b/Content.Shared/Body/Components/BloodstreamComponent.cs index 0139932262..51814eaba9 100644 --- a/Content.Shared/Body/Components/BloodstreamComponent.cs +++ b/Content.Shared/Body/Components/BloodstreamComponent.cs @@ -198,12 +198,6 @@ public sealed partial class BloodstreamComponent : Component [ViewVariables] public Entity? TemporarySolution; - /// - /// Variable that stores the amount of status time added by having a low blood level. - /// - [DataField, AutoNetworkedField] - public TimeSpan StatusTime; - /// /// Alert to show when bleeding. /// diff --git a/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs b/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs index ac385040a9..182cdb47d3 100644 --- a/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs +++ b/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs @@ -6,7 +6,6 @@ using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Chemistry.Reaction; using Content.Shared.Chemistry.Reagent; using Content.Shared.Damage; -using Content.Shared.Drunk; using Content.Shared.EntityEffects.Effects; using Content.Shared.FixedPoint; using Content.Shared.Fluids; @@ -16,7 +15,7 @@ using Content.Shared.Mobs.Systems; using Content.Shared.Popups; using Content.Shared.Random.Helpers; using Content.Shared.Rejuvenate; -using Content.Shared.Speech.EntitySystems; +using Content.Shared.StatusEffectNew; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Prototypes; @@ -27,17 +26,18 @@ namespace Content.Shared.Body.Systems; public abstract class SharedBloodstreamSystem : EntitySystem { + public static readonly EntProtoId Bloodloss = "StatusEffectBloodloss"; + [Dependency] protected readonly SharedSolutionContainerSystem SolutionContainer = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedPuddleSystem _puddle = default!; + [Dependency] private readonly StatusEffectsSystem _status = default!; [Dependency] private readonly AlertsSystem _alertsSystem = default!; [Dependency] private readonly MobStateSystem _mobStateSystem = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; - [Dependency] private readonly SharedDrunkSystem _drunkSystem = default!; - [Dependency] private readonly SharedStutteringSystem _stutteringSystem = default!; public override void Initialize() { @@ -100,15 +100,7 @@ public abstract class SharedBloodstreamSystem : EntitySystem // Apply dizziness as a symptom of bloodloss. // The effect is applied in a way that it will never be cleared without being healthy. // Multiplying by 2 is arbitrary but works for this case, it just prevents the time from running out - _drunkSystem.TryApplyDrunkenness( - uid, - (float)bloodstream.AdjustedUpdateInterval.TotalSeconds * 2, - applySlur: false); - _stutteringSystem.DoStutter(uid, bloodstream.AdjustedUpdateInterval * 2, refresh: false); - - // storing the drunk and stutter time so we can remove it independently from other effects additions - bloodstream.StatusTime += bloodstream.AdjustedUpdateInterval * 2; - DirtyField(uid, bloodstream, nameof(BloodstreamComponent.StatusTime)); + _status.TrySetStatusEffectDuration(uid, Bloodloss); } else if (!_mobStateSystem.IsDead(uid)) { @@ -118,12 +110,7 @@ public abstract class SharedBloodstreamSystem : EntitySystem bloodstream.BloodlossHealDamage * bloodPercentage, ignoreResistances: true, interruptsDoAfters: false); - // Remove the drunk effect when healthy. Should only remove the amount of drunk and stutter added by low blood level - _drunkSystem.TryRemoveDrunkenessTime(uid, bloodstream.StatusTime.TotalSeconds); - _stutteringSystem.DoRemoveStutterTime(uid, bloodstream.StatusTime.TotalSeconds); - // Reset the drunk and stutter time to zero - bloodstream.StatusTime = TimeSpan.Zero; - DirtyField(uid, bloodstream, nameof(BloodstreamComponent.StatusTime)); + _status.TryRemoveStatusEffect(uid, Bloodloss); } } } diff --git a/Content.Shared/Chemistry/EntitySystems/HypospraySystem.cs b/Content.Shared/Chemistry/EntitySystems/HypospraySystem.cs index 8e4df010fe..3584e382b6 100644 --- a/Content.Shared/Chemistry/EntitySystems/HypospraySystem.cs +++ b/Content.Shared/Chemistry/EntitySystems/HypospraySystem.cs @@ -207,7 +207,7 @@ public sealed class HypospraySystem : EntitySystem return returnValue; // Sunrise-End - _popup.PopupClient(Loc.GetString(msgFormat ?? "hypospray-component-inject-other-message", ("other", target)), target, user); + _popup.PopupClient(Loc.GetString(msgFormat ?? "hypospray-component-inject-other-message", ("other", Identity.Entity(target, EntityManager))), target, user); if (target != user) { diff --git a/Content.Shared/Drunk/DrunkComponent.cs b/Content.Shared/Drunk/DrunkComponent.cs deleted file mode 100644 index 61c195d27e..0000000000 --- a/Content.Shared/Drunk/DrunkComponent.cs +++ /dev/null @@ -1,6 +0,0 @@ -using Robust.Shared.GameStates; - -namespace Content.Shared.Drunk; - -[RegisterComponent, NetworkedComponent] -public sealed partial class DrunkComponent : Component { } diff --git a/Content.Shared/Drunk/DrunkStatusEffectComponent.cs b/Content.Shared/Drunk/DrunkStatusEffectComponent.cs new file mode 100644 index 0000000000..69ad7c3ad9 --- /dev/null +++ b/Content.Shared/Drunk/DrunkStatusEffectComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Drunk; + +/// +/// This is used by a status effect entity to apply the to an entity. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class DrunkStatusEffectComponent : Component +{ +} diff --git a/Content.Shared/Drunk/DrunkSystem.cs b/Content.Shared/Drunk/DrunkSystem.cs deleted file mode 100644 index 236ce2dcd3..0000000000 --- a/Content.Shared/Drunk/DrunkSystem.cs +++ /dev/null @@ -1,48 +0,0 @@ -using Content.Shared.Speech.EntitySystems; -using Content.Shared.StatusEffect; -using Content.Shared.Traits.Assorted; -using Robust.Shared.Prototypes; - -namespace Content.Shared.Drunk; - -public abstract class SharedDrunkSystem : EntitySystem -{ - public static readonly ProtoId DrunkKey = "Drunk"; - - [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; - [Dependency] private readonly SharedSlurredSystem _slurredSystem = default!; - - public void TryApplyDrunkenness(EntityUid uid, float boozePower, bool applySlur = true, - StatusEffectsComponent? status = null) - { - if (!Resolve(uid, ref status, false)) - return; - - if (TryComp(uid, out var trait)) - boozePower *= trait.BoozeStrengthMultiplier; - - if (applySlur) - { - _slurredSystem.DoSlur(uid, TimeSpan.FromSeconds(boozePower), status); - } - - if (!_statusEffectsSystem.HasStatusEffect(uid, DrunkKey, status)) - { - _statusEffectsSystem.TryAddStatusEffect(uid, DrunkKey, TimeSpan.FromSeconds(boozePower), true, status); - } - else - { - _statusEffectsSystem.TryAddTime(uid, DrunkKey, TimeSpan.FromSeconds(boozePower), status); - } - } - - public void TryRemoveDrunkenness(EntityUid uid) - { - _statusEffectsSystem.TryRemoveStatusEffect(uid, DrunkKey); - } - public void TryRemoveDrunkenessTime(EntityUid uid, double timeRemoved) - { - _statusEffectsSystem.TryRemoveTime(uid, DrunkKey, TimeSpan.FromSeconds(timeRemoved)); - } - -} diff --git a/Content.Shared/Drunk/SharedDrunkSystem.cs b/Content.Shared/Drunk/SharedDrunkSystem.cs new file mode 100644 index 0000000000..96aff82fa0 --- /dev/null +++ b/Content.Shared/Drunk/SharedDrunkSystem.cs @@ -0,0 +1,50 @@ +using Content.Shared.Speech.EntitySystems; +using Content.Shared.StatusEffectNew; +using Content.Shared.Traits.Assorted; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Drunk; + +public abstract class SharedDrunkSystem : EntitySystem +{ + public static EntProtoId Drunk = "StatusEffectDrunk"; + public static EntProtoId Woozy = "StatusEffectWoozy"; + + /* I have no clue why this magic number was chosen, I copied it from slur system and needed it for the overlay + If you have a more intelligent magic number be my guest to completely explode this value. + There were no comments as to why this value was chosen three years ago. */ + public static float MagicNumber = 1100f; + + [Dependency] protected readonly StatusEffectsSystem Status = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnLightweightDrinking); + } + + public void TryApplyDrunkenness(EntityUid uid, TimeSpan boozePower) + { + var ev = new DrunkEvent(boozePower); + RaiseLocalEvent(uid, ref ev); + + Status.TryAddStatusEffectDuration(uid, Drunk, ev.Duration); + } + + public void TryRemoveDrunkenness(EntityUid uid) + { + Status.TryRemoveStatusEffect(uid, Drunk); + } + + public void TryRemoveDrunkennessTime(EntityUid uid, TimeSpan boozePower) + { + Status.TryAddTime(uid, Drunk, - boozePower); + } + + private void OnLightweightDrinking(Entity entity, ref DrunkEvent args) + { + args.Duration *= entity.Comp.BoozeStrengthMultiplier; + } + + [ByRefEvent] + public record struct DrunkEvent(TimeSpan Duration); +} diff --git a/Content.Shared/EntityEffects/Effects/Drunk.cs b/Content.Shared/EntityEffects/Effects/Drunk.cs index 5f7f29c342..aa15df8f3d 100644 --- a/Content.Shared/EntityEffects/Effects/Drunk.cs +++ b/Content.Shared/EntityEffects/Effects/Drunk.cs @@ -9,13 +9,7 @@ public sealed partial class Drunk : EntityEffect /// BoozePower is how long each metabolism cycle will make the drunk effect last for. /// [DataField] - public float BoozePower = 3f; - - /// - /// Whether speech should be slurred. - /// - [DataField] - public bool SlurSpeech = true; + public TimeSpan BoozePower = TimeSpan.FromSeconds(3f); protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) => Loc.GetString("reagent-effect-guidebook-drunk", ("chance", Probability)); @@ -24,11 +18,10 @@ public sealed partial class Drunk : EntityEffect { var boozePower = BoozePower; - if (args is EntityEffectReagentArgs reagentArgs) { + if (args is EntityEffectReagentArgs reagentArgs) boozePower *= reagentArgs.Scale.Float(); - } var drunkSys = args.EntityManager.EntitySysManager.GetEntitySystem(); - drunkSys.TryApplyDrunkenness(args.TargetEntity, boozePower, SlurSpeech); + drunkSys.TryApplyDrunkenness(args.TargetEntity, boozePower); } } diff --git a/Content.Shared/Movement/Systems/WormSystem.cs b/Content.Shared/Movement/Systems/WormSystem.cs index 8dc7f86a08..c6f2b7834c 100644 --- a/Content.Shared/Movement/Systems/WormSystem.cs +++ b/Content.Shared/Movement/Systems/WormSystem.cs @@ -12,7 +12,6 @@ namespace Content.Shared.Movement.Systems; public sealed class WormSystem : EntitySystem { [Dependency] private readonly AlertsSystem _alerts = default!; - [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedStunSystem _stun = default!; public override void Initialize() diff --git a/Content.Shared/Speech/EntitySystems/SharedSlurredSystem.cs b/Content.Shared/Speech/EntitySystems/SharedSlurredSystem.cs index 8718e054ba..aadda6aa09 100644 --- a/Content.Shared/Speech/EntitySystems/SharedSlurredSystem.cs +++ b/Content.Shared/Speech/EntitySystems/SharedSlurredSystem.cs @@ -1,8 +1,11 @@ using Content.Shared.StatusEffect; +using Robust.Shared.Prototypes; namespace Content.Shared.Speech.EntitySystems; public abstract class SharedSlurredSystem : EntitySystem { + public static readonly EntProtoId Stutter = "StatusEffectSlurred"; + public virtual void DoSlur(EntityUid uid, TimeSpan time, StatusEffectsComponent? status = null) { } } diff --git a/Content.Shared/Speech/EntitySystems/SharedStutteringSystem.cs b/Content.Shared/Speech/EntitySystems/SharedStutteringSystem.cs index 05358a04bb..90cd8bc4de 100644 --- a/Content.Shared/Speech/EntitySystems/SharedStutteringSystem.cs +++ b/Content.Shared/Speech/EntitySystems/SharedStutteringSystem.cs @@ -1,26 +1,24 @@ -using Content.Shared.StatusEffect; +using Content.Shared.StatusEffectNew; using Robust.Shared.Prototypes; namespace Content.Shared.Speech.EntitySystems; public abstract class SharedStutteringSystem : EntitySystem { - public static readonly ProtoId StutterKey = "Stutter"; + public static readonly EntProtoId Stuttering = "StatusEffectStutter"; - [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; + [Dependency] protected readonly StatusEffectsSystem Status = default!; // For code in shared... I imagine we ain't getting accent prediction anytime soon so let's not bother. - public virtual void DoStutter(EntityUid uid, TimeSpan time, bool refresh, StatusEffectsComponent? status = null) + public virtual void DoStutter(EntityUid uid, TimeSpan time, bool refresh) { } - public virtual void DoRemoveStutterTime(EntityUid uid, double timeRemoved) + public virtual void DoRemoveStutterTime(EntityUid uid, TimeSpan timeRemoved) { - _statusEffectsSystem.TryRemoveTime(uid, StutterKey, TimeSpan.FromSeconds(timeRemoved)); } - public void DoRemoveStutter(EntityUid uid, double timeRemoved) + public virtual void DoRemoveStutter(EntityUid uid) { - _statusEffectsSystem.TryRemoveStatusEffect(uid, StutterKey); } } diff --git a/Content.Shared/Stacks/SharedStackSystem.cs b/Content.Shared/Stacks/SharedStackSystem.cs index 60b93a8da8..b3de1870fe 100644 --- a/Content.Shared/Stacks/SharedStackSystem.cs +++ b/Content.Shared/Stacks/SharedStackSystem.cs @@ -6,6 +6,7 @@ using Content.Shared.Interaction; using Content.Shared.Nutrition; using Content.Shared.Popups; using Content.Shared.Storage.EntitySystems; +using Content.Shared.Verbs; using JetBrains.Annotations; using Robust.Shared.GameStates; using Robust.Shared.Physics.Systems; @@ -29,6 +30,8 @@ namespace Content.Shared.Stacks [Dependency] protected readonly SharedPopupSystem Popup = default!; [Dependency] private readonly SharedStorageSystem _storage = default!; + public static readonly int[] DefaultSplitAmounts = { 1, 5, 10, 20, 30, 50 }; + public override void Initialize() { base.Initialize(); @@ -40,6 +43,7 @@ namespace Content.Shared.Stacks SubscribeLocalEvent(OnStackInteractUsing); SubscribeLocalEvent(OnBeforeEaten); SubscribeLocalEvent(OnEaten); + SubscribeLocalEvent>(OnStackAlternativeInteract); _vvm.GetTypeHandler() .AddPath(nameof(StackComponent.Count), (_, comp) => comp.Count, SetCount); @@ -432,6 +436,55 @@ namespace Content.Shared.Stacks // Here to tell the food system to do destroy stuff. args.Destroy = true; } + + private void OnStackAlternativeInteract(EntityUid uid, StackComponent stack, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract || args.Hands == null || stack.Count == 1) + return; + + AlternativeVerb halve = new() + { + Text = Loc.GetString("comp-stack-split-halve"), + Category = VerbCategory.Split, + Act = () => UserSplit(uid, args.User, stack.Count / 2, stack), + Priority = 1 + }; + args.Verbs.Add(halve); + + var priority = 0; + foreach (var amount in DefaultSplitAmounts) + { + if (amount >= stack.Count) + continue; + + AlternativeVerb verb = new() + { + Text = amount.ToString(), + Category = VerbCategory.Split, + Act = () => UserSplit(uid, args.User, amount, stack), + // we want to sort by size, not alphabetically by the verb text. + Priority = priority + }; + + priority--; + + args.Verbs.Add(verb); + } + } + + /// + /// OnStackAlternativeInteract() was moved to shared in order to faciliate prediction of stack splitting verbs. + /// However, prediction of interacitons with spawned entities is non-functional (or so i'm told) + /// So, UserSplit() and Split() should remain on the server for the time being. + /// This empty virtual method allows for UserSplit() to be called on the server from the client. + /// When prediction is improved, those two methods should be moved to shared, in order to predict the splitting itself (not just the verbs) + /// + protected virtual void UserSplit(EntityUid uid, EntityUid userUid, int amount, + StackComponent? stack = null, + TransformComponent? userTransform = null) + { + + } } /// diff --git a/Content.Shared/StatusEffectNew/Components/StatusEffectComponent.cs b/Content.Shared/StatusEffectNew/Components/StatusEffectComponent.cs index 25f40718e9..67ff8b3e61 100644 --- a/Content.Shared/StatusEffectNew/Components/StatusEffectComponent.cs +++ b/Content.Shared/StatusEffectNew/Components/StatusEffectComponent.cs @@ -1,4 +1,3 @@ -using Content.Shared.Alert; using Content.Shared.Whitelist; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; diff --git a/Content.Shared/StatusEffectNew/StatusEffectSystem.Relay.cs b/Content.Shared/StatusEffectNew/StatusEffectSystem.Relay.cs index 0c4c5cf1f7..3644bed45e 100644 --- a/Content.Shared/StatusEffectNew/StatusEffectSystem.Relay.cs +++ b/Content.Shared/StatusEffectNew/StatusEffectSystem.Relay.cs @@ -1,6 +1,7 @@ using Content.Shared.Movement.Events; using Content.Shared.Movement.Systems; using Content.Shared.Rejuvenate; +using Content.Shared.Speech; using Content.Shared.StatusEffectNew.Components; using Content.Shared.Stunnable; using Robust.Shared.Player; @@ -23,6 +24,8 @@ public sealed partial class StatusEffectsSystem SubscribeLocalEvent(RefRelayStatusEffectEvent); SubscribeLocalEvent(RefRelayStatusEffectEvent); + + SubscribeLocalEvent(RelayStatusEffectEvent); } private void RefRelayStatusEffectEvent(EntityUid uid, StatusEffectContainerComponent component, ref T args) where T : struct diff --git a/Content.Shared/Storage/EntitySystems/SecretStashSystem.cs b/Content.Shared/Storage/EntitySystems/SecretStashSystem.cs index 3691f6e2b6..7e83b50fba 100644 --- a/Content.Shared/Storage/EntitySystems/SecretStashSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SecretStashSystem.cs @@ -8,7 +8,6 @@ using Content.Shared.Interaction; using Content.Shared.Item; using Content.Shared.Materials; using Content.Shared.Nutrition; -using Content.Shared.Nutrition.EntitySystems; using Content.Shared.Popups; using Content.Shared.Storage.Components; using Content.Shared.Tools.EntitySystems; @@ -26,7 +25,6 @@ namespace Content.Shared.Storage.EntitySystems; /// public sealed class SecretStashSystem : EntitySystem { - [Dependency] private readonly IngestionSystem _ingestion = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly SharedContainerSystem _containerSystem = default!; diff --git a/Content.Shared/Trigger/Components/Effects/LockOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/LockOnTriggerComponent.cs index 38eea0a461..6dbec86c5d 100644 --- a/Content.Shared/Trigger/Components/Effects/LockOnTriggerComponent.cs +++ b/Content.Shared/Trigger/Components/Effects/LockOnTriggerComponent.cs @@ -1,19 +1,27 @@ +using Content.Shared.Lock; using Robust.Shared.GameStates; using Robust.Shared.Serialization; namespace Content.Shared.Trigger.Components.Effects; +/// +/// Will lock, unlock or toggle an entity with the . +/// If TargetUser is true then they will be (un)locked instead. +/// [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class LockOnTriggerComponent : BaseXOnTriggerComponent { + /// + /// If the trigger will lock, unlock or toggle the lock. + /// [DataField, AutoNetworkedField] - public LockAction LockOnTrigger = LockAction.Toggle; + public LockAction LockMode = LockAction.Toggle; } [Serializable, NetSerializable] public enum LockAction { - Lock = 0, + Lock = 0, Unlock = 1, Toggle = 2, } diff --git a/Content.Shared/Trigger/Systems/LockOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/LockOnTriggerSystem.cs index 8726ede899..2056d5fe51 100644 --- a/Content.Shared/Trigger/Systems/LockOnTriggerSystem.cs +++ b/Content.Shared/Trigger/Systems/LockOnTriggerSystem.cs @@ -19,16 +19,21 @@ public sealed class LockOnTriggerSystem : EntitySystem if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key)) return; - switch (ent.Comp.LockOnTrigger) + var target = ent.Comp.TargetUser ? args.User : ent.Owner; + + if (!TryComp(target, out var lockComp)) + return; // prevent the Resolve in Lock/Unlock/ToggleLock from logging errors in case the user does not have the component + + switch (ent.Comp.LockMode) { case LockAction.Lock: - _lock.Lock(ent.Owner, args.User); + _lock.Lock(target.Value, args.User, lockComp); break; case LockAction.Unlock: - _lock.Unlock(ent, args.User); + _lock.Unlock(target.Value, args.User, lockComp); break; case LockAction.Toggle: - _lock.ToggleLock(ent, args.User); + _lock.ToggleLock(target.Value, args.User, lockComp); break; } } diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 3d2caa23b7..f50bcb8a21 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,46 +1,4 @@ Entries: -- author: EmoGarbage404 - changes: - - message: Added 3 modkits for the proto-kinetic accelerator, granting increased - damage, range, and fire rate. They can be researched via the new "Kinetic Modifications" - arsenal tech. - type: Add - - message: Reduced damage and range on the proto-kinetic accelerator. - type: Tweak - id: 8351 - time: '2025-04-25T18:18:24.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/31247 -- author: Wolfkey-SomeoneElseTookMyUsername - changes: - - message: Added cotton buns, which can be be used for the creation of custom burgers - that can be eaten by moths. - type: Add - id: 8352 - time: '2025-04-26T01:54:14.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/36405 -- author: Booblesnoot42 - changes: - - message: Due to a lack of functionality, light-switches have temporarily been - removed from the construction menu. - type: Remove - id: 8353 - time: '2025-04-26T01:54:23.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34664 -- author: OnyxTheBrave - changes: - - message: Cloth is now able to be made in the Sheet-Meister 2000 - type: Add - id: 8354 - time: '2025-04-26T03:22:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32676 -- author: SyaoranFox - changes: - - message: Pulse Pistol, Pulse Carbine, and Pulse Rifle now share the same sound - file. - type: Tweak - id: 8355 - time: '2025-04-26T13:36:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/36952 - author: RedBookcase changes: - message: Various changes to edged weapons, including new storage sprites and new @@ -3953,3 +3911,44 @@ id: 8863 time: '2025-08-18T14:33:16.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/39727 +- author: SlamBamActionman + changes: + - message: Aiming with the Hristov is now working correctly when using the Separated + Chat HUD mode. + type: Fix + - message: Cursor targetting with the Hristov now correctly selects the target underneath + the cursor. + type: Fix + id: 8864 + time: '2025-08-18T18:22:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35087 +- author: Zokkie + changes: + - message: Lone Operative is now assigned the Solo Antagonist role ingame instead + of the Team Antagonist role. + type: Fix + id: 8865 + time: '2025-08-18T18:57:30.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36521 +- author: beck-thompson, slarticodefast + changes: + - message: Fixed rebinding keys crashing the client. + type: Fix + id: 8866 + time: '2025-08-18T18:58:30.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/39732 +- author: Princess-Cheeseballs + changes: + - message: Being a Lightweight drunk no longer extends your bloodloss + type: Fix + id: 8867 + time: '2025-08-18T20:26:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/38678 +- author: SlamBamActionman + changes: + - message: Auto-injector/medipen pop-ups now show the correct identity when injecting + someone else. + type: Fix + id: 8868 + time: '2025-08-18T20:42:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/39735 diff --git a/Resources/Changelog/Maps.yml b/Resources/Changelog/Maps.yml index 34ecf1fb01..0ec3640252 100644 --- a/Resources/Changelog/Maps.yml +++ b/Resources/Changelog/Maps.yml @@ -538,4 +538,17 @@ id: 66 time: '2025-08-18T04:33:37.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/39090 +- author: beck-thompson + changes: + - message: Replaced the guaranteed explosives on the infiltrator with a random grenade + spawner and ammo bundle. + type: Tweak + - message: Replaced the guaranteed med spawns on the infiltrator with random med + kit spawners. + type: Tweak + - message: Added a random loot spawner to the infiltrator. + type: Add + id: 67 + time: '2025-08-18T18:22:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/39091 Order: 1 diff --git a/Resources/Locale/en-US/_strings/chemistry/components/hypospray-component.ftl b/Resources/Locale/en-US/_strings/chemistry/components/hypospray-component.ftl index 1357eb5435..079707201d 100644 --- a/Resources/Locale/en-US/_strings/chemistry/components/hypospray-component.ftl +++ b/Resources/Locale/en-US/_strings/chemistry/components/hypospray-component.ftl @@ -8,7 +8,7 @@ hypospray-volume-label = Volume: [color=white]{$currentVolume}/{$totalVolume}u[/ ## Entity -hypospray-component-inject-other-message = You inject {$other}. +hypospray-component-inject-other-message = You inject {THE($other)}. hypospray-component-inject-self-message = You inject yourself. hypospray-component-empty-message = Nothing to inject. hypospray-component-feel-prick-message = You feel a tiny prick! diff --git a/Resources/Locale/en-US/changeling/changeling.ftl b/Resources/Locale/en-US/changeling/changeling.ftl index d304385848..57ad3550bf 100644 --- a/Resources/Locale/en-US/changeling/changeling.ftl +++ b/Resources/Locale/en-US/changeling/changeling.ftl @@ -2,7 +2,7 @@ roles-antag-changeling-objective = A intelligent predator that assumes the identities of its victims. changeling-devour-attempt-failed-rotting = This corpse has only rotted biomass. -changeling-devour-attempt-failed-protected = This victim's biomass is protected. +changeling-devour-attempt-failed-protected = This victim's biomass is protected by armor! changeling-devour-begin-windup-self = Our uncanny mouth reveals itself with otherworldly hunger. changeling-devour-begin-windup-others = { CAPITALIZE(POSS-ADJ($user)) } uncanny mouth reveals itself with otherworldly hunger. diff --git a/Resources/Maps/Shuttles/infiltrator.yml b/Resources/Maps/Shuttles/infiltrator.yml index 784886c892..d8b50e99ab 100644 --- a/Resources/Maps/Shuttles/infiltrator.yml +++ b/Resources/Maps/Shuttles/infiltrator.yml @@ -1,6 +1,17 @@ meta: - format: 6 - postmapinit: false + format: 7 + category: Grid + engineVersion: 266.0.0 + forkId: "" + forkVersion: "" + time: 08/18/2025 05:46:30 + entityCount: 822 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] tilemap: 0: Space 3: FloorArcadeRed @@ -34,20 +45,20 @@ entities: chunks: -1,-1: ind: -1,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAADHwAAAAABHwAAAAACHwAAAAABHwAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAbgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAWAAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAWAAAAAAAHwAAAAACfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAWAAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAACHwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAHwAAAAABHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAHwAAAAACHwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAXQAAAAACWAAAAAAAHwAAAAACHwAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAXQAAAAACaAAAAAAAWQAAAAAAHwAAAAADHwAAAAAAHwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAXQAAAAADWQAAAAAAaAAAAAABWAAAAAAAHwAAAAAAHwAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAXQAAAAAAXQAAAAADWAAAAAAAHwAAAAACHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAWAAAAAAAWAAAAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - version: 6 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAAfAAAAAAMAHwAAAAABAB8AAAAAAgAfAAAAAAEAHwAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAbgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAB8AAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAWAAAAAAAAB8AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAFgAAAAAAAAfAAAAAAIAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAABYAAAAAAAAHwAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAB8AAAAAAgAfAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAH0AAAAAAAB9AAAAAAAAfQAAAAAAAH4AAAAAAAAfAAAAAAEAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAH4AAAAAAAB+AAAAAAAAHwAAAAACAB8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAAfAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAXQAAAAACAFgAAAAAAAAfAAAAAAIAHwAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAABdAAAAAAIAaAAAAAAAAFkAAAAAAAAfAAAAAAMAHwAAAAAAAB8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAXQAAAAADAFkAAAAAAABoAAAAAAEAWAAAAAAAAB8AAAAAAAAfAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAABdAAAAAAAAXQAAAAADAFgAAAAAAAAfAAAAAAIAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAABYAAAAAAAAWAAAAAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + version: 7 0,-1: ind: 0,-1 - tiles: HwAAAAABHwAAAAABHwAAAAABHwAAAAABfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAbgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAACWAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAACWAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABWAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAADfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABWAAAAAAAegAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAADHwAAAAAAHwAAAAAAegAAAAADegAAAAABfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAWAAAAAAAegAAAAAAAwAAAAAAegAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAADWAAAAAAAfgAAAAAAAwAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAAAAWAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - version: 6 + tiles: HwAAAAABAB8AAAAAAQAfAAAAAAEAHwAAAAABAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAG4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAIAWAAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAACAFgAAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAQBYAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABAH4AAAAAAAB9AAAAAAAAfQAAAAAAAH0AAAAAAAB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAwB+AAAAAAAAfgAAAAAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABAFgAAAAAAAB6AAAAAAMAfgAAAAAAAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAwAfAAAAAAAAHwAAAAAAAHoAAAAAAwB6AAAAAAEAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAWAAAAAAAAHoAAAAAAAADAAAAAAAAegAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAADAFgAAAAAAAB+AAAAAAAAAwAAAAAAAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAAAAAABYAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + version: 7 -1,-2: ind: -1,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAWAAAAAAAWAAAAAAAWAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAOAAAAAAAJAAAAAAAOAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAOAAAAAAAJAAAAAAAOAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAOAAAAAAAJAAAAAAAOAAAAAAAWAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAACHwAAAAAAHwAAAAADWAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAACTwAAAAAAHwAAAAABWAAAAAAAfgAAAAAAfgAAAAAAbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAWAAAAAAAfgAAAAAAHwAAAAAAHwAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAKAAAAAAAKAAAAAAAWAAAAAAAHwAAAAADHwAAAAAAHwAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAWAAAAAAAHwAAAAAAWAAAAAAAfgAAAAAAHwAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAACHwAAAAABHwAAAAAAHwAAAAADHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAbgAAAAAAHwAAAAAAHwAAAAABfgAAAAAAfgAAAAAAfgAAAAAA - version: 6 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAB9AAAAAAAAfQAAAAAAAH0AAAAAAAB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAFgAAAAAAABYAAAAAAAAWAAAAAAAAH4AAAAAAAB9AAAAAAAAfQAAAAAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAA4AAAAAAAAJAAAAAAAADgAAAAAAAB+AAAAAAAAfQAAAAAAAH0AAAAAAAB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAOAAAAAAAACQAAAAAAAA4AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAADgAAAAAAAAkAAAAAAAAOAAAAAAAAFgAAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAfAAAAAAIAHwAAAAAAAB8AAAAAAwBYAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAHwAAAAACAE8AAAAAAAAfAAAAAAEAWAAAAAAAAH4AAAAAAAB+AAAAAAAAbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAB8AAAAAAAAfAAAAAAAAHwAAAAAAAFgAAAAAAAB+AAAAAAAAHwAAAAAAAB8AAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAB+AAAAAAAAKAAAAAAAACgAAAAAAABYAAAAAAAAHwAAAAADAB8AAAAAAAAfAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAAAAAAfgAAAAAAAFgAAAAAAAAfAAAAAAAAWAAAAAAAAH4AAAAAAAAfAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAB8AAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAB8AAAAAAgAfAAAAAAEAHwAAAAAAAB8AAAAAAwAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAG4AAAAAAAAfAAAAAAAAHwAAAAABAH4AAAAAAAB+AAAAAAAAfgAAAAAAAA== + version: 7 0,-2: ind: 0,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAATwAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAATwAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAATwAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAABfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABHwAAAAADHwAAAAABHwAAAAADHwAAAAABWAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAADHwAAAAACHwAAAAAAHwAAAAACHwAAAAADfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAHwAAAAACHwAAAAAAHwAAAAADHwAAAAABfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABHwAAAAAAHwAAAAABHwAAAAADfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAHwAAAAAAHwAAAAACbgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - version: 6 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAAAAAAfQAAAAAAAH0AAAAAAAB9AAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAAAAAB9AAAAAAAAfgAAAAAAAE8AAAAAAAB+AAAAAAAATwAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAAAAAAfQAAAAAAAH4AAAAAAABPAAAAAAAAfgAAAAAAAE8AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAATwAAAAAAAH4AAAAAAABPAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAHwAAAAABAH4AAAAAAAB+AAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAQAfAAAAAAMAHwAAAAABAB8AAAAAAwAfAAAAAAEAWAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAMAHwAAAAACAB8AAAAAAAAfAAAAAAIAHwAAAAADAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAB8AAAAAAgAfAAAAAAAAHwAAAAADAB8AAAAAAQB+AAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAEAHwAAAAAAAB8AAAAAAQAfAAAAAAMAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAAfAAAAAAAAHwAAAAACAG4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + version: 7 - type: Broadphase - type: Physics bodyStatus: InAir @@ -576,12 +587,14 @@ entities: flags: Hide - type: OccluderTree - type: Shuttle + dampingModifier: 0.25 - type: RadiationGridResistance - type: GravityShake shakeTimes: 10 - type: GasTileOverlay - type: SpreaderGrid - type: GridPathfinding + - type: ImplicitRoof - proto: AirlockExternalGlassShuttleSyndicateLocked entities: - uid: 8 @@ -593,7 +606,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - uid: 10 @@ -605,7 +619,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - proto: AirlockExternalSyndicateLocked @@ -618,7 +633,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3 components: - type: Transform @@ -629,7 +645,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 7 components: - type: Transform @@ -638,7 +655,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9 components: - type: Transform @@ -647,7 +665,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 12 components: - type: Transform @@ -656,7 +675,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13 components: - type: Transform @@ -667,7 +687,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 14 components: - type: Transform @@ -676,7 +697,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 22 components: - type: Transform @@ -685,7 +707,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockSyndicateGlassLocked entities: - uid: 4 @@ -727,12 +750,16 @@ entities: - type: Transform pos: -3.5,-18.5 parent: 1 + - type: Fixtures + fixtures: {} - uid: 19 components: - type: Transform rot: -1.5707963267948966 rad pos: 1.5,-8.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: AtmosFixNitrogenMarker entities: - uid: 25 @@ -820,45 +847,6 @@ entities: - type: Transform pos: 1.4510483,-2.399527 parent: 1 -- proto: Brutepack - entities: - - uid: 44 - components: - - type: Transform - pos: -3.292087,-4.1600046 - parent: 1 - - uid: 45 - components: - - type: Transform - pos: -3.354587,-4.4256296 - parent: 1 -- proto: C4 - entities: - - uid: 46 - components: - - type: Transform - pos: 1.7857682,-12.631323 - parent: 1 - - uid: 47 - components: - - type: Transform - pos: 1.5045182,-12.646948 - parent: 1 - - uid: 48 - components: - - type: Transform - pos: 1.5982682,-12.646948 - parent: 1 - - uid: 49 - components: - - type: Transform - pos: 1.4107682,-12.646948 - parent: 1 - - uid: 50 - components: - - type: Transform - pos: 1.6920182,-12.631323 - parent: 1 - proto: CableApcExtension entities: - uid: 51 @@ -2210,26 +2198,26 @@ entities: rot: 3.141592653589793 rad pos: -0.5,-3.5 parent: 1 -- proto: CigPackSyndicate +- proto: ClothingBackpackDuffelSyndicateAmmoFilled entities: - - uid: 313 + - uid: 49 components: - type: Transform - pos: -3.5658307,-17.516623 + pos: 1.4468282,-11.670399 parent: 1 - proto: ClothingBackpackDuffelSyndicateFilledMedical entities: - uid: 314 components: - type: Transform - pos: -3.5044222,-6.293252 + pos: -5.6167116,-4.2485933 parent: 1 - proto: ClothingHeadHatSyndie entities: - uid: 315 components: - type: Transform - pos: -3.1200604,-17.289778 + pos: -3.0420556,-17.469692 parent: 1 - proto: ClothingHeadHatSyndieMAA entities: @@ -3617,18 +3605,6 @@ entities: - type: Transform pos: -4.5,-3.5 parent: 1 -- proto: MedkitCombatFilled - entities: - - uid: 501 - components: - - type: Transform - pos: -3.401462,-3.5350046 - parent: 1 - - uid: 502 - components: - - type: Transform - pos: -3.557712,-3.4256296 - parent: 1 - proto: Mirror entities: - uid: 503 @@ -3636,6 +3612,8 @@ entities: - type: Transform pos: 4.5,-3.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: Multitool entities: - uid: 504 @@ -3672,17 +3650,38 @@ entities: - type: Transform pos: -2.5,-12.5 parent: 1 -- proto: Ointment +- proto: NukeOpsGrenadeSpawner entities: - - uid: 511 + - uid: 44 components: - type: Transform - pos: -3.651462,-4.5193796 + pos: 1.5,-12.5 parent: 1 - - uid: 512 +- proto: NukeOpsLootSpawner + entities: + - uid: 46 components: - type: Transform - pos: -3.667087,-4.2225046 + pos: -3.5,-17.5 + parent: 1 +- proto: NukeOpsMedkitBruteSpawner + entities: + - uid: 48 + components: + - type: Transform + pos: -3.5,-3.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: -3.5,-6.5 + parent: 1 +- proto: NukeOpsMedkitSpawner + entities: + - uid: 47 + components: + - type: Transform + pos: -3.5,-4.5 parent: 1 - proto: OperatingTable entities: @@ -3761,6 +3760,8 @@ entities: - type: Transform pos: 1.5,-14.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: PosterContrabandCC64KAd entities: - uid: 525 @@ -3768,6 +3769,8 @@ entities: - type: Transform pos: -5.5,-18.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: PosterContrabandCybersun600 entities: - uid: 526 @@ -3775,6 +3778,8 @@ entities: - type: Transform pos: 2.5,-6.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: PosterContrabandDonk entities: - uid: 527 @@ -3783,6 +3788,8 @@ entities: rot: 3.141592653589793 rad pos: 3.5,-18.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: PosterContrabandDonutCorp entities: - uid: 528 @@ -3791,6 +3798,8 @@ entities: rot: 3.141592653589793 rad pos: 1.5,-22.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: PosterContrabandEnergySwords entities: - uid: 529 @@ -3798,6 +3807,8 @@ entities: - type: Transform pos: 2.5,-18.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: PosterContrabandEnlistGorlex entities: - uid: 530 @@ -3806,6 +3817,8 @@ entities: rot: 3.141592653589793 rad pos: 2.5,-13.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: PosterContrabandFreeSyndicateEncryptionKey entities: - uid: 531 @@ -3813,6 +3826,8 @@ entities: - type: Transform pos: -2.5,-8.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: PosterContrabandInterdyne entities: - uid: 532 @@ -3821,6 +3836,8 @@ entities: rot: 3.141592653589793 rad pos: -4.5,-6.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: PosterContrabandKosmicheskayaStantsiya entities: - uid: 533 @@ -3828,6 +3845,8 @@ entities: - type: Transform pos: -2.5,-22.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: PosterContrabandMoth entities: - uid: 534 @@ -3835,11 +3854,15 @@ entities: - type: Transform pos: -2.5,-14.5 parent: 1 + - type: Fixtures + fixtures: {} - uid: 535 components: - type: Transform pos: 2.5,-3.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: PosterContrabandNuclearDeviceInformational entities: - uid: 536 @@ -3848,11 +3871,15 @@ entities: rot: 3.141592653589793 rad pos: -3.5,-13.5 parent: 1 + - type: Fixtures + fixtures: {} - uid: 537 components: - type: Transform pos: 0.5,-14.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: PosterContrabandSyndicatePistol entities: - uid: 538 @@ -3860,6 +3887,8 @@ entities: - type: Transform pos: 1.5,-10.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: PosterContrabandSyndicateRecruitment entities: - uid: 539 @@ -3867,6 +3896,8 @@ entities: - type: Transform pos: -1.5,-14.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: PosterContrabandWaffleCorp entities: - uid: 540 @@ -3875,6 +3906,8 @@ entities: rot: 3.141592653589793 rad pos: -2.5,-23.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: Poweredlight entities: - uid: 541 @@ -4302,9 +4335,13 @@ entities: - type: DeviceLinkSource linkedPorts: 600: - - Pressed: Toggle + - - Pressed + - Toggle 599: - - Pressed: Toggle + - - Pressed + - Toggle + - type: Fixtures + fixtures: {} - uid: 611 components: - type: Transform @@ -4313,7 +4350,10 @@ entities: - type: DeviceLinkSource linkedPorts: 605: - - Pressed: Toggle + - - Pressed + - Toggle + - type: Fixtures + fixtures: {} - proto: SignalButtonDirectional entities: - uid: 20 @@ -4325,9 +4365,13 @@ entities: - type: DeviceLinkSource linkedPorts: 602: - - Pressed: Toggle + - - Pressed + - Toggle 598: - - Pressed: Toggle + - - Pressed + - Toggle + - type: Fixtures + fixtures: {} - uid: 21 components: - type: Transform @@ -4337,19 +4381,28 @@ entities: - type: DeviceLinkSource linkedPorts: 597: - - Pressed: Toggle + - - Pressed + - Toggle 601: - - Pressed: Toggle + - - Pressed + - Toggle 608: - - Pressed: Toggle + - - Pressed + - Toggle 606: - - Pressed: Toggle + - - Pressed + - Toggle 604: - - Pressed: Toggle + - - Pressed + - Toggle 607: - - Pressed: Toggle + - - Pressed + - Toggle 603: - - Pressed: Toggle + - - Pressed + - Toggle + - type: Fixtures + fixtures: {} - proto: SignDirectionalEvac entities: - uid: 613 @@ -4357,30 +4410,40 @@ entities: - type: Transform pos: 0.5,-22.5 parent: 1 + - type: Fixtures + fixtures: {} - uid: 614 components: - type: Transform rot: 1.5707963267948966 rad pos: 4.5,-15.5 parent: 1 + - type: Fixtures + fixtures: {} - uid: 615 components: - type: Transform rot: 3.141592653589793 rad pos: -5.5,-14.5 parent: 1 + - type: Fixtures + fixtures: {} - uid: 616 components: - type: Transform rot: 3.141592653589793 rad pos: 4.5,-14.5 parent: 1 + - type: Fixtures + fixtures: {} - uid: 617 components: - type: Transform rot: -1.5707963267948966 rad pos: -5.5,-15.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: SignElectricalMed entities: - uid: 618 @@ -4388,6 +4451,8 @@ entities: - type: Transform pos: -2.5,-18.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: SignNosmoking entities: - uid: 619 @@ -4395,6 +4460,8 @@ entities: - type: Transform pos: 5.5,-22.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: SignSecureSmallRed entities: - uid: 620 @@ -4402,16 +4469,22 @@ entities: - type: Transform pos: -3.5,-11.5 parent: 1 + - type: Fixtures + fixtures: {} - uid: 621 components: - type: Transform pos: 4.5,-17.5 parent: 1 + - type: Fixtures + fixtures: {} - uid: 622 components: - type: Transform pos: 2.5,-11.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: SMESBasic entities: - uid: 623 @@ -4481,30 +4554,6 @@ entities: - type: Transform pos: 3.5,-19.5 parent: 1 -- proto: SyndieMiniBomb - entities: - - uid: 633 - components: - - type: Transform - pos: 1.4127003,-11.973867 - parent: 1 - - uid: 634 - components: - - type: Transform - pos: 1.6939503,-11.973867 - parent: 1 -- proto: SyringeInaprovaline - entities: - - uid: 635 - components: - - type: Transform - pos: -3.510837,-4.3787546 - parent: 1 - - uid: 636 - components: - - type: Transform - pos: -3.510837,-4.0193796 - parent: 1 - proto: Table entities: - uid: 637 @@ -4689,14 +4738,7 @@ entities: - uid: 669 components: - type: Transform - pos: -2.5731854,-17.414778 - parent: 1 -- proto: ToolboxSyndicateFilled - entities: - - uid: 670 - components: - - type: Transform - pos: 1.5034143,-11.298322 + pos: -2.468854,-17.396727 parent: 1 - proto: VendingMachineTankDispenserEVA entities: @@ -5516,6 +5558,8 @@ entities: - type: Transform pos: 4.5,-25.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: WarningO2 entities: - uid: 828 @@ -5523,6 +5567,8 @@ entities: - type: Transform pos: 2.5,-25.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: WarningWaste entities: - uid: 829 @@ -5530,6 +5576,8 @@ entities: - type: Transform pos: 4.5,-18.5 parent: 1 + - type: Fixtures + fixtures: {} - proto: WaterCooler entities: - uid: 830 diff --git a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml index 7adc77acb7..03bd492e52 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml @@ -113,7 +113,7 @@ raffle: settings: default mindRoles: - - MindRoleGhostRoleSoloAntagonist + - MindRoleLoneops - type: Sprite sprite: Markers/jobs.rsi layers: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml b/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml index d2dd761468..909e11e21f 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml @@ -19,7 +19,6 @@ group: GenericNumber - type: StatusEffects allowed: - - Stutter - Electrocution - TemporaryBlindness - RadiationProtection diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml b/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml index ba4c5e3698..eba25717f3 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml @@ -35,7 +35,6 @@ bodyType: KinematicController # Same for all inheritors - type: StatusEffects allowed: - - Stutter - Electrocution - type: Pullable - type: Tag diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index e6d58c40d0..bd8a38ad29 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -15,7 +15,6 @@ bodyType: KinematicController # Same for all inheritors - type: StatusEffects allowed: - - Stutter - Electrocution - Jump # Sunrise-Edit - Fall # Sunrise-Edit diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml index d8f2c79e12..a0658a74eb 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml @@ -19,7 +19,6 @@ baseSprintSpeed : 4 - type: StatusEffects allowed: - - Stutter - Electrocution - TemporaryBlindness - Pacified @@ -97,7 +96,6 @@ baseDecayRate: 0.04 - type: StatusEffects allowed: - - Stutter - Electrocution - TemporaryBlindness - Pacified diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml index 38f05eb955..b02a890051 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml @@ -104,7 +104,6 @@ types: {} - type: StatusEffects # Overwriting basesimplemob to remove flash, getting flashed as dragon just feelsbad allowed: - - Stutter - Electrocution - TemporaryBlindness - Pacified diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index 0fcc046b9f..b1f24f7289 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -125,10 +125,7 @@ - !type:WashCreamPieReaction - type: StatusEffects allowed: - - Stutter - Electrocution - - Drunk - - SlurredSpeech - RatvarianLanguage - PressureImmunity - Muted diff --git a/Resources/Prototypes/Entities/StatusEffects/body.yml b/Resources/Prototypes/Entities/StatusEffects/body.yml new file mode 100644 index 0000000000..3765ebefd4 --- /dev/null +++ b/Resources/Prototypes/Entities/StatusEffects/body.yml @@ -0,0 +1,18 @@ +- type: entity + parent: MobStatusEffectBase + id: BloodstreamStatusEffectBase + abstract: true + components: + - type: StatusEffect + whitelist: + components: + - Bloodstream + +- type: entity + parent: [ BloodstreamStatusEffectBase ] + id: StatusEffectBloodloss + name: bloodloss + components: + - type: StutteringAccent + - type: DrunkStatusEffect + - type: RejuvenateRemovedStatusEffect diff --git a/Resources/Prototypes/Entities/StatusEffects/misc.yml b/Resources/Prototypes/Entities/StatusEffects/misc.yml index 3ce81081c0..14c6b5b649 100644 --- a/Resources/Prototypes/Entities/StatusEffects/misc.yml +++ b/Resources/Prototypes/Entities/StatusEffects/misc.yml @@ -78,3 +78,17 @@ name: hallucinations components: - type: SeeingRainbowsStatusEffect + +# Causes your vision to become blurry and gives me a headache. +- type: entity + parent: MobStatusEffectDebuff + id: StatusEffectWoozy + name: woozy + components: + - type: DrunkStatusEffect + +# Causes you to get drunk +- type: entity + parent: [ StatusEffectWoozy, StatusEffectSlurred ] + id: StatusEffectDrunk + name: drunk diff --git a/Resources/Prototypes/Entities/StatusEffects/speech.yml b/Resources/Prototypes/Entities/StatusEffects/speech.yml new file mode 100644 index 0000000000..17e533b1a8 --- /dev/null +++ b/Resources/Prototypes/Entities/StatusEffects/speech.yml @@ -0,0 +1,27 @@ +- type: entity + parent: MobStatusEffectDebuff + id: SpeechStatusEffectBase + abstract: true + components: + - type: StatusEffect + whitelist: + components: + - MobState + - Speech + requireAll: true + +# Causes you to st-t-u-t-t-t-er randomly when talking. +- type: entity + parent: SpeechStatusEffectBase + id: StatusEffectStutter + name: stutter + components: + - type: StutteringAccent + +# Causes you to schlur your words schwhen talking. +- type: entity + parent: SpeechStatusEffectBase + id: StatusEffectSlurred + name: slurred + components: + - type: SlurredAccent diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 66e0876da2..fbc369db26 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -588,7 +588,7 @@ factions: - Syndicate mindRoles: - - MindRoleNukeops + - MindRoleLoneops - type: DynamicRuleCost cost: 75 diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index dd5266d88c..4dbb90ad66 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -12,9 +12,9 @@ - !type:GenericStatusEffect key: Stutter component: ScrambledAccent - - !type:Drunk - slurSpeech: false - boozePower: 20 + - !type:ModifyStatusEffect + effectProto: StatusEffectSlurred + time: 20.0 - type: reagent id: Dylovene @@ -106,8 +106,8 @@ metabolisms: Medicine: effects: - - !type:GenericStatusEffect - key: Drunk + - !type:ModifyStatusEffect + effectProto: StatusEffectDrunk time: 6.0 type: Remove - !type:HealthChange @@ -1461,8 +1461,8 @@ key: Jitter time: 2.0 type: Remove - - !type:GenericStatusEffect - key: Drunk + - !type:ModifyStatusEffect + effectProto: StatusEffectDrunk time: 6.0 type: Remove - !type:PopupMessage # we dont have sanity/mood so this will have to do diff --git a/Resources/Prototypes/Roles/MindRoles/mind_roles.yml b/Resources/Prototypes/Roles/MindRoles/mind_roles.yml index d387903ec4..d56e798fda 100644 --- a/Resources/Prototypes/Roles/MindRoles/mind_roles.yml +++ b/Resources/Prototypes/Roles/MindRoles/mind_roles.yml @@ -197,6 +197,14 @@ - type: MindRole antagPrototype: NukeopsCommander +- type: entity + parent: MindRoleNukeops + id: MindRoleLoneops + name: Loneops Operative Role + components: + - type: MindRole + roleType: SoloAntagonist + # Revolutionaries - type: entity parent: BaseMindRoleAntag