diff --git a/Content.Client/Clothing/ClientClothingSystem.cs b/Content.Client/Clothing/ClientClothingSystem.cs index 1e2bd6f396..5eb9c021ce 100644 --- a/Content.Client/Clothing/ClientClothingSystem.cs +++ b/Content.Client/Clothing/ClientClothingSystem.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; +using System.Numerics; using Content.Client.Inventory; using Content.Shared.Clothing; using Content.Shared.Clothing.Components; @@ -116,6 +117,7 @@ public sealed class ClientClothingSystem : ClothingSystem i++; } + item.MappedLayer = key; args.Layers.Add((key, layer)); } } @@ -156,13 +158,9 @@ public sealed class ClientClothingSystem : ClothingSystem // species specific if (speciesId != null && rsi.TryGetState($"{state}-{speciesId}", out _)) - { state = $"{state}-{speciesId}"; - } else if (!rsi.TryGetState(state, out _)) - { return false; - } var layer = new PrototypeLayerData(); layer.RsiPath = rsi.Path.ToString(); @@ -290,6 +288,8 @@ public sealed class ClientClothingSystem : ClothingSystem if (layerData.Color != null) sprite.LayerSetColor(key, layerData.Color.Value); + if (layerData.Scale != null) + sprite.LayerSetScale(key, layerData.Scale.Value); } else index = sprite.LayerMapReserveBlank(key); diff --git a/Content.Client/Clothing/FlippableClothingVisualizerSystem.cs b/Content.Client/Clothing/FlippableClothingVisualizerSystem.cs new file mode 100644 index 0000000000..2c3afb0324 --- /dev/null +++ b/Content.Client/Clothing/FlippableClothingVisualizerSystem.cs @@ -0,0 +1,48 @@ +using Content.Shared.Clothing; +using Content.Shared.Clothing.Components; +using Content.Shared.Clothing.EntitySystems; +using Content.Shared.Foldable; +using Content.Shared.Item; +using Robust.Client.GameObjects; + +namespace Content.Client.Clothing; + +public sealed class FlippableClothingVisualizerSystem : VisualizerSystem +{ + [Dependency] private readonly SharedItemSystem _itemSys = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnGetVisuals, after: [typeof(ClothingSystem)]); + SubscribeLocalEvent(OnFolded); + } + + private void OnFolded(Entity ent, ref FoldedEvent args) + { + _itemSys.VisualsChanged(ent); + } + + private void OnGetVisuals(Entity ent, ref GetEquipmentVisualsEvent args) + { + if (!TryComp(ent, out SpriteComponent? sprite) || + !TryComp(ent, out ClothingComponent? clothing)) + return; + + if (clothing.MappedLayer == null || + !AppearanceSystem.TryGetData(ent, FoldableSystem.FoldedVisuals.State, out var folding) || + !sprite.LayerMapTryGet(folding ? ent.Comp.FoldingLayer : ent.Comp.UnfoldingLayer, out var idx)) + return; + + // add each layer to the visuals + var spriteLayer = sprite[idx]; + foreach (var layer in args.Layers) + { + if (layer.Item1 != clothing.MappedLayer) + continue; + + layer.Item2.Scale = spriteLayer.Scale; + } + } +} diff --git a/Content.Client/Clothing/FlippableClothingVisualsComponent.cs b/Content.Client/Clothing/FlippableClothingVisualsComponent.cs new file mode 100644 index 0000000000..33d622b8b5 --- /dev/null +++ b/Content.Client/Clothing/FlippableClothingVisualsComponent.cs @@ -0,0 +1,16 @@ +namespace Content.Client.Clothing; + +/// +/// Communicates folded layers data (currently only Scale to handle flipping) +/// to the wearer clothing sprite layer +/// +[RegisterComponent] +[Access(typeof(FlippableClothingVisualizerSystem))] +public sealed partial class FlippableClothingVisualsComponent : Component +{ + [DataField] + public string FoldingLayer = "foldedLayer"; + + [DataField] + public string UnfoldingLayer = "unfoldedLayer"; +} diff --git a/Content.Client/Robotics/UI/RoboticsConsoleWindow.xaml.cs b/Content.Client/Robotics/UI/RoboticsConsoleWindow.xaml.cs index 367114f2aa..fc7b234bcc 100644 --- a/Content.Client/Robotics/UI/RoboticsConsoleWindow.xaml.cs +++ b/Content.Client/Robotics/UI/RoboticsConsoleWindow.xaml.cs @@ -134,7 +134,7 @@ public sealed partial class RoboticsConsoleWindow : FancyWindow BorgInfo.SetMessage(text); // how the turntables - DisableButton.Disabled = !data.HasBrain; + DisableButton.Disabled = !(data.HasBrain && data.CanDisable); DestroyButton.Disabled = _timing.CurTime < _console.Comp1.NextDestroy; } diff --git a/Content.Client/Sprite/RandomSpriteSystem.cs b/Content.Client/Sprite/RandomSpriteSystem.cs index b9be2a44b4..c4aa43a65b 100644 --- a/Content.Client/Sprite/RandomSpriteSystem.cs +++ b/Content.Client/Sprite/RandomSpriteSystem.cs @@ -43,9 +43,6 @@ public sealed class RandomSpriteSystem : SharedRandomSpriteSystem if (!Resolve(uid, ref clothing, false)) return; - if (clothing.ClothingVisuals == null) - return; - foreach (var slotPair in clothing.ClothingVisuals) { foreach (var keyColorPair in component.Selected) diff --git a/Content.Server/Explosion/Components/AutomatedTimerComponent.cs b/Content.Server/Explosion/Components/AutomatedTimerComponent.cs index 7019c08d43..c01aeb91e5 100644 --- a/Content.Server/Explosion/Components/AutomatedTimerComponent.cs +++ b/Content.Server/Explosion/Components/AutomatedTimerComponent.cs @@ -1,7 +1,7 @@ namespace Content.Server.Explosion.Components; /// -/// Disallows starting the timer by hand, must be stuck or triggered by a system. +/// Disallows starting the timer by hand, must be stuck or triggered by a system using StartTimer. /// [RegisterComponent] public sealed partial class AutomatedTimerComponent : Component diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.OnUse.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.OnUse.cs index 8725dd1ae7..dcd11062bb 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.OnUse.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.OnUse.cs @@ -26,13 +26,7 @@ public sealed partial class TriggerSystem if (!component.StartOnStick) return; - HandleTimerTrigger( - uid, - args.User, - component.Delay, - component.BeepInterval, - component.InitialBeepDelay, - component.BeepSound); + StartTimer((uid, component), args.User); } private void OnExamined(EntityUid uid, OnUseTimerTriggerComponent component, ExaminedEvent args) @@ -54,14 +48,7 @@ public sealed partial class TriggerSystem args.Verbs.Add(new AlternativeVerb() { Text = Loc.GetString("verb-start-detonation"), - Act = () => HandleTimerTrigger( - uid, - args.User, - component.Delay, - component.BeepInterval, - component.InitialBeepDelay, - component.BeepSound - ), + Act = () => StartTimer((uid, component), args.User), Priority = 2 }); } @@ -174,13 +161,7 @@ public sealed partial class TriggerSystem if (component.DoPopup) _popupSystem.PopupEntity(Loc.GetString("trigger-activated", ("device", uid)), args.User, args.User); - HandleTimerTrigger( - uid, - args.User, - component.Delay, - component.BeepInterval, - component.InitialBeepDelay, - component.BeepSound); + StartTimer((uid, component), args.User); args.Handled = true; } diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs index e03b8aff54..92e065bf4c 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs @@ -265,6 +265,18 @@ namespace Content.Server.Explosion.EntitySystems comp.TimeRemaining += amount; } + /// + /// Start the timer for triggering the device. + /// + public void StartTimer(Entity ent, EntityUid? user) + { + if (!Resolve(ent, ref ent.Comp, false)) + return; + + var comp = ent.Comp; + HandleTimerTrigger(ent, user, comp.Delay, comp.BeepInterval, comp.InitialBeepDelay, comp.BeepSound); + } + public void HandleTimerTrigger(EntityUid uid, EntityUid? user, float delay, float beepInterval, float? initialBeepDelay, SoundSpecifier? beepSound) { if (delay <= 0) diff --git a/Content.Server/Power/Generation/Teg/TegSystem.cs b/Content.Server/Power/Generation/Teg/TegSystem.cs index bc1bff052c..02412ca5fb 100644 --- a/Content.Server/Power/Generation/Teg/TegSystem.cs +++ b/Content.Server/Power/Generation/Teg/TegSystem.cs @@ -179,7 +179,7 @@ public sealed class TegSystem : EntitySystem component.LastGeneration = electricalEnergy; // Turn energy (at atmos tick rate) into wattage. - var power = electricalEnergy * _atmosphere.AtmosTickRate; + var power = electricalEnergy / args.dt; // Add ramp factor. This magics slight power into existence, but allows us to ramp up. supplier.MaxSupply = power * component.RampFactor; diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs b/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs index 1c10cbe667..781f847be3 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs @@ -1,5 +1,6 @@ using Content.Shared.DeviceNetwork; using Content.Shared.Emag.Components; +using Content.Shared.Movement.Components; using Content.Shared.Popups; using Content.Shared.Robotics; using Content.Shared.Silicons.Borgs.Components; @@ -26,6 +27,9 @@ public sealed partial class BorgSystem var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var comp, out var chassis, out var device, out var meta)) { + if (comp.NextDisable is {} nextDisable && now >= nextDisable) + DoDisable((uid, comp, chassis, meta)); + if (now < comp.NextBroadcast) continue; @@ -33,13 +37,16 @@ public sealed partial class BorgSystem if (_powerCell.TryGetBatteryFromSlot(uid, out var battery)) charge = battery.CurrentCharge / battery.MaxCharge; + var hasBrain = chassis.BrainEntity != null && !comp.FakeDisabled; + var canDisable = comp.NextDisable == null && !comp.FakeDisabling; var data = new CyborgControlData( comp.Sprite, comp.Name, meta.EntityName, charge, chassis.ModuleCount, - chassis.BrainEntity != null); + hasBrain, + canDisable); var payload = new NetworkPayload() { @@ -52,6 +59,24 @@ public sealed partial class BorgSystem } } + private void DoDisable(Entity ent) + { + ent.Comp1.NextDisable = null; + if (ent.Comp1.FakeDisabling) + { + ent.Comp1.FakeDisabled = true; + ent.Comp1.FakeDisabling = false; + return; + } + + if (ent.Comp2.BrainEntity is not {} brain) + return; + + var message = Loc.GetString(ent.Comp1.DisabledPopup, ("name", Name(ent, ent.Comp3))); + Popup.PopupEntity(message, ent); + _container.Remove(brain, ent.Comp2.BrainContainer); + } + private void OnPacketReceived(Entity ent, ref DeviceNetworkPacketEvent args) { var payload = args.Data; @@ -61,28 +86,28 @@ public sealed partial class BorgSystem if (command == RoboticsConsoleConstants.NET_DISABLE_COMMAND) Disable(ent); else if (command == RoboticsConsoleConstants.NET_DESTROY_COMMAND) - Destroy(ent.Owner); + Destroy(ent); } private void Disable(Entity ent) { - if (!Resolve(ent, ref ent.Comp2) || ent.Comp2.BrainEntity is not {} brain) + if (!Resolve(ent, ref ent.Comp2) || ent.Comp2.BrainEntity == null || ent.Comp1.NextDisable != null) return; - // this won't exactly be stealthy but if you are malf its better than actually disabling you + // update ui immediately + ent.Comp1.NextBroadcast = _timing.CurTime; + + // pretend the borg is being disabled forever now if (CheckEmagged(ent, "disabled")) - return; + ent.Comp1.FakeDisabling = true; + else + Popup.PopupEntity(Loc.GetString(ent.Comp1.DisablingPopup), ent); - var message = Loc.GetString(ent.Comp1.DisabledPopup, ("name", Name(ent))); - Popup.PopupEntity(message, ent); - _container.Remove(brain, ent.Comp2.BrainContainer); + ent.Comp1.NextDisable = _timing.CurTime + ent.Comp1.DisableDelay; } - private void Destroy(Entity ent) + private void Destroy(Entity ent) { - if (!Resolve(ent, ref ent.Comp)) - return; - // this is stealthy until someone realises you havent exploded if (CheckEmagged(ent, "destroyed")) { @@ -91,7 +116,12 @@ public sealed partial class BorgSystem return; } - _explosion.TriggerExplosive(ent, ent.Comp, delete: false); + var message = Loc.GetString(ent.Comp.DestroyingPopup, ("name", Name(ent))); + Popup.PopupEntity(message, ent); + _trigger.StartTimer(ent.Owner, user: null); + + // prevent a shitter borg running into people + RemComp(ent); } private bool CheckEmagged(EntityUid uid, string name) diff --git a/Content.Server/Silicons/Borgs/BorgSystem.cs b/Content.Server/Silicons/Borgs/BorgSystem.cs index 1ab7f5387f..c97ca9cbc0 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.cs @@ -43,8 +43,8 @@ public sealed partial class BorgSystem : SharedBorgSystem [Dependency] private readonly ActionsSystem _actions = default!; [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly DeviceNetworkSystem _deviceNetwork = default!; - [Dependency] private readonly ExplosionSystem _explosion = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly TriggerSystem _trigger = default!; [Dependency] private readonly HandsSystem _hands = default!; [Dependency] private readonly MetaDataSystem _metaData = default!; [Dependency] private readonly SharedMindSystem _mind = default!; diff --git a/Content.Server/StationEvents/Events/MeteorSwarmSystem.cs b/Content.Server/StationEvents/Events/MeteorSwarmSystem.cs index 1e70e058fd..02469dd903 100644 --- a/Content.Server/StationEvents/Events/MeteorSwarmSystem.cs +++ b/Content.Server/StationEvents/Events/MeteorSwarmSystem.cs @@ -62,7 +62,14 @@ public sealed class MeteorSwarmSystem : GameRuleSystem : new Random(uid.Id).NextAngle(); var offset = angle.RotateVec(new Vector2((maximumDistance - minimumDistance) * RobustRandom.NextFloat() + minimumDistance, 0)); - var subOffset = RobustRandom.NextAngle().RotateVec(new Vector2( (playableArea.TopRight - playableArea.Center).Length() / 2 * RobustRandom.NextFloat(), 0)); + + // the line at which spawns occur is perpendicular to the offset. + // This means the meteors are less likely to bunch up and hit the same thing. + var subOffsetAngle = RobustRandom.Prob(0.5f) + ? angle + Math.PI / 2 + : angle - Math.PI / 2; + var subOffset = subOffsetAngle.RotateVec(new Vector2( (playableArea.TopRight - playableArea.Center).Length() / 3 * RobustRandom.NextFloat(), 0)); + var spawnPosition = new MapCoordinates(center + offset + subOffset, mapId); var meteor = Spawn(spawnProto, spawnPosition); var physics = Comp(meteor); diff --git a/Content.Shared/Clothing/Components/ClothingComponent.cs b/Content.Shared/Clothing/Components/ClothingComponent.cs index 6d7226e767..846a78b868 100644 --- a/Content.Shared/Clothing/Components/ClothingComponent.cs +++ b/Content.Shared/Clothing/Components/ClothingComponent.cs @@ -16,9 +16,14 @@ namespace Content.Shared.Clothing.Components; public sealed partial class ClothingComponent : Component { [DataField("clothingVisuals")] - [Access(typeof(ClothingSystem), typeof(InventorySystem), Other = AccessPermissions.ReadExecute)] // TODO remove execute permissions. public Dictionary> ClothingVisuals = new(); + /// + /// The name of the layer in the user that this piece of clothing will map to + /// + [DataField] + public string? MappedLayer; + [ViewVariables(VVAccess.ReadWrite)] [DataField("quickEquip")] public bool QuickEquip = true; @@ -121,4 +126,3 @@ public sealed partial class ClothingUnequipDoAfterEvent : DoAfterEvent public override DoAfterEvent Clone() => this; } - diff --git a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs index 1e2825a49a..bdcb2c8204 100644 --- a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs @@ -241,9 +241,6 @@ public abstract class ClothingSystem : EntitySystem public void SetLayerColor(ClothingComponent clothing, string slot, string mapKey, Color? color) { - if (clothing.ClothingVisuals == null) - return; - foreach (var layer in clothing.ClothingVisuals[slot]) { if (layer.MapKeys == null) @@ -257,9 +254,6 @@ public abstract class ClothingSystem : EntitySystem } public void SetLayerState(ClothingComponent clothing, string slot, string mapKey, string state) { - if (clothing.ClothingVisuals == null) - return; - foreach (var layer in clothing.ClothingVisuals[slot]) { if (layer.MapKeys == null) diff --git a/Content.Shared/Clothing/EntitySystems/FoldableClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/FoldableClothingSystem.cs index 27ea168018..be55588ddd 100644 --- a/Content.Shared/Clothing/EntitySystems/FoldableClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/FoldableClothingSystem.cs @@ -33,32 +33,32 @@ public sealed class FoldableClothingSystem : EntitySystem private void OnFolded(Entity ent, ref FoldedEvent args) { - if (TryComp(ent.Owner, out var clothingComp) && - TryComp(ent.Owner, out var itemComp)) + if (!TryComp(ent.Owner, out var clothingComp) || + !TryComp(ent.Owner, out var itemComp)) + return; + + if (args.IsFolded) { - if (args.IsFolded) - { - if (ent.Comp.FoldedSlots.HasValue) - _clothingSystem.SetSlots(ent.Owner, ent.Comp.FoldedSlots.Value, clothingComp); + if (ent.Comp.FoldedSlots.HasValue) + _clothingSystem.SetSlots(ent.Owner, ent.Comp.FoldedSlots.Value, clothingComp); - if (ent.Comp.FoldedEquippedPrefix != null) - _clothingSystem.SetEquippedPrefix(ent.Owner, ent.Comp.FoldedEquippedPrefix, clothingComp); + if (ent.Comp.FoldedEquippedPrefix != null) + _clothingSystem.SetEquippedPrefix(ent.Owner, ent.Comp.FoldedEquippedPrefix, clothingComp); - if (ent.Comp.FoldedHeldPrefix != null) - _itemSystem.SetHeldPrefix(ent.Owner, ent.Comp.FoldedHeldPrefix, false, itemComp); - } - else - { - if (ent.Comp.UnfoldedSlots.HasValue) - _clothingSystem.SetSlots(ent.Owner, ent.Comp.UnfoldedSlots.Value, clothingComp); + if (ent.Comp.FoldedHeldPrefix != null) + _itemSystem.SetHeldPrefix(ent.Owner, ent.Comp.FoldedHeldPrefix, false, itemComp); + } + else + { + if (ent.Comp.UnfoldedSlots.HasValue) + _clothingSystem.SetSlots(ent.Owner, ent.Comp.UnfoldedSlots.Value, clothingComp); - if (ent.Comp.FoldedEquippedPrefix != null) - _clothingSystem.SetEquippedPrefix(ent.Owner, null, clothingComp); + if (ent.Comp.FoldedEquippedPrefix != null) + _clothingSystem.SetEquippedPrefix(ent.Owner, null, clothingComp); - if (ent.Comp.FoldedHeldPrefix != null) - _itemSystem.SetHeldPrefix(ent.Owner, null, false, itemComp); + if (ent.Comp.FoldedHeldPrefix != null) + _itemSystem.SetHeldPrefix(ent.Owner, null, false, itemComp); - } } } } diff --git a/Content.Shared/Robotics/Components/RoboticsConsoleComponent.cs b/Content.Shared/Robotics/Components/RoboticsConsoleComponent.cs index 4329e437a2..9e4b51866f 100644 --- a/Content.Shared/Robotics/Components/RoboticsConsoleComponent.cs +++ b/Content.Shared/Robotics/Components/RoboticsConsoleComponent.cs @@ -36,7 +36,7 @@ public sealed partial class RoboticsConsoleComponent : Component /// Radio message sent when destroying a borg. /// [DataField] - public LocId DestroyMessage = "robotics-console-cyborg-destroyed"; + public LocId DestroyMessage = "robotics-console-cyborg-destroying"; /// /// Cooldown on destroying borgs to prevent complete abuse. diff --git a/Content.Shared/Robotics/RoboticsConsoleUi.cs b/Content.Shared/Robotics/RoboticsConsoleUi.cs index 1be89beff0..996c65cb0e 100644 --- a/Content.Shared/Robotics/RoboticsConsoleUi.cs +++ b/Content.Shared/Robotics/RoboticsConsoleUi.cs @@ -97,6 +97,13 @@ public record struct CyborgControlData [DataField] public bool HasBrain; + /// + /// Whether the borg can currently be disabled if the brain is installed, + /// if on cooldown then can't queue up multiple disables. + /// + [DataField] + public bool CanDisable; + /// /// When this cyborg's data will be deleted. /// Set by the console when receiving the packet. @@ -104,7 +111,7 @@ public record struct CyborgControlData [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] public TimeSpan Timeout = TimeSpan.Zero; - public CyborgControlData(SpriteSpecifier? chassisSprite, string chassisName, string name, float charge, int moduleCount, bool hasBrain) + public CyborgControlData(SpriteSpecifier? chassisSprite, string chassisName, string name, float charge, int moduleCount, bool hasBrain, bool canDisable) { ChassisSprite = chassisSprite; ChassisName = chassisName; @@ -112,6 +119,7 @@ public record struct CyborgControlData Charge = charge; ModuleCount = moduleCount; HasBrain = hasBrain; + CanDisable = canDisable; } } diff --git a/Content.Shared/Silicons/Borgs/Components/BorgTransponderComponent.cs b/Content.Shared/Silicons/Borgs/Components/BorgTransponderComponent.cs index 8c15e20d5d..577056bb46 100644 --- a/Content.Shared/Silicons/Borgs/Components/BorgTransponderComponent.cs +++ b/Content.Shared/Silicons/Borgs/Components/BorgTransponderComponent.cs @@ -23,12 +23,25 @@ public sealed partial class BorgTransponderComponent : Component public string Name = string.Empty; /// - /// Popup shown to everyone when a borg is disabled. + /// Popup shown to everyone after a borg is disabled. /// Gets passed a string "name". /// [DataField] public LocId DisabledPopup = "borg-transponder-disabled-popup"; + /// + /// Popup shown to the borg when it is being disabled. + /// + [DataField] + public LocId DisablingPopup = "borg-transponder-disabling-popup"; + + /// + /// Popup shown to everyone when a borg is being destroyed. + /// Gets passed a string "name". + /// + [DataField] + public LocId DestroyingPopup = "borg-transponder-destroying-popup"; + /// /// How long to wait between each broadcast. /// @@ -40,4 +53,28 @@ public sealed partial class BorgTransponderComponent : Component /// [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] public TimeSpan NextBroadcast = TimeSpan.Zero; + + /// + /// When to next disable the borg. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + public TimeSpan? NextDisable; + + /// + /// How long to wait to disable the borg after RD has ordered it. + /// + [DataField] + public TimeSpan DisableDelay = TimeSpan.FromSeconds(5); + + /// + /// Pretend that the borg cannot be disabled due to being on delay. + /// + [DataField] + public bool FakeDisabling; + + /// + /// Pretend that the borg has no brain inserted. + /// + [DataField] + public bool FakeDisabled; } diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b3d8fff813..65c7dd73de 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,50 +1,4 @@ Entries: -- author: Flareguy - changes: - - message: Removed SCAF armor. - type: Remove - id: 6261 - time: '2024-03-31T02:01:28.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26566 -- author: lzk228 - changes: - - message: Syndicate duffelbag storage increased from 8x5 to 9x5. - type: Tweak - id: 6262 - time: '2024-03-31T02:21:31.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26565 -- author: Velcroboy - changes: - - message: Changed plastic flaps to be completely constructable/deconstructable - type: Tweak - id: 6263 - time: '2024-03-31T02:24:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26341 -- author: Flareguy - changes: - - message: Security glasses have been moved from research to roundstart gear. All - officers now start with them instead of sunglasses by default. - type: Tweak - - message: You can now craft security glasses. - type: Add - id: 6264 - time: '2024-03-31T03:00:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26487 -- author: brainfood1183 - changes: - - message: Toilets can now be connected to the disposal system. - type: Add - id: 6265 - time: '2024-03-31T03:21:18.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/22133 -- author: DrMelon - changes: - - message: Syndicate Uplinks now have a searchbar to help those dirty, rotten antagonists - find appropriate equipment more easily! - type: Tweak - id: 6266 - time: '2024-03-31T04:09:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24287 - author: chromiumboy changes: - message: Additional construction options have been added to the Rapid Construction @@ -3859,3 +3813,48 @@ id: 6760 time: '2024-06-16T11:57:57.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/25155 +- author: Futuristic + changes: + - message: RandomSentience event was removed + type: Remove + id: 6761 + time: '2024-06-16T23:24:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28982 +- author: notafet + changes: + - message: Adjust TEG power generation levels. + type: Tweak + id: 6762 + time: '2024-06-17T01:13:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29112 +- author: Cojoke-dot, AJCM-git + changes: + - message: You can now flip your eyepatches to the other eye! Yarrrrr! + type: Add + id: 6763 + time: '2024-06-17T03:21:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26277 +- author: deltanedas + changes: + - message: Borgs now have a 10 second beeping timer that paralyzes them when being + exploded with the robotics console and a 5 second delay when being disabled + with it. + type: Tweak + id: 6764 + time: '2024-06-17T03:30:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27876 +- author: EmoGarbage404 + changes: + - message: Changed meteor swarm spawning to be less clumped up and favor hitting + multiple areas more. + type: Tweak + id: 6765 + time: '2024-06-17T05:20:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29057 +- author: Ubaser + changes: + - message: Added new reptilian horns, "Demonic". + type: Add + id: 6766 + time: '2024-06-17T10:53:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29022 diff --git a/Resources/Locale/en-US/borg/borg.ftl b/Resources/Locale/en-US/borg/borg.ftl index 72667f318e..6c495510b0 100644 --- a/Resources/Locale/en-US/borg/borg.ftl +++ b/Resources/Locale/en-US/borg/borg.ftl @@ -21,5 +21,7 @@ borg-ui-module-counter = {$actual}/{$max} # Transponder borg-transponder-disabled-popup = A brain shoots out the top of {$name}! +borg-transponder-disabling-popup = Your transponder begins to lock you out of the chassis! +borg-transponder-destroying-popup = The self destruct of {$name} starts beeping! borg-transponder-emagged-disabled-popup = Your transponder's lights go out! borg-transponder-emagged-destroyed-popup = Your transponder's fuse blows! diff --git a/Resources/Locale/en-US/markings/reptilian.ftl b/Resources/Locale/en-US/markings/reptilian.ftl index 470af07361..d66d3cb9e6 100644 --- a/Resources/Locale/en-US/markings/reptilian.ftl +++ b/Resources/Locale/en-US/markings/reptilian.ftl @@ -93,6 +93,9 @@ marking-LizardHornsMyrsore = Lizard Horns (Myrsore) marking-LizardHornsBighorn-horns_bighorn = Lizard Horns (Bighorn) marking-LizardHornsBighorn = Lizard Horns (Bighorn) +marking-LizardHornsDemonic-horns_demonic = Lizard Horns (Demonic) +marking-LizardHornsDemonic = Lizard Horns (Demonic) + marking-LizardHornsKoboldEars-horns_kobold_ears = Lizard Ears (Kobold) marking-LizardHornsKoboldEars = Lizard Ears (Kobold) diff --git a/Resources/Locale/en-US/research/components/robotics-console.ftl b/Resources/Locale/en-US/research/components/robotics-console.ftl index 978fa9a43c..a4c82bd032 100644 --- a/Resources/Locale/en-US/research/components/robotics-console.ftl +++ b/Resources/Locale/en-US/research/components/robotics-console.ftl @@ -16,4 +16,4 @@ robotics-console-locked-message = Controls locked, swipe ID. robotics-console-disable = Disable robotics-console-destroy = Destroy -robotics-console-cyborg-destroyed = The cyborg {$name} has been remotely destroyed. +robotics-console-cyborg-destroying = {$name} is being remotely detonated! diff --git a/Resources/Maps/Shuttles/emergency_meta.yml b/Resources/Maps/Shuttles/emergency_meta.yml index a85c607195..84b6ff02e6 100644 --- a/Resources/Maps/Shuttles/emergency_meta.yml +++ b/Resources/Maps/Shuttles/emergency_meta.yml @@ -465,85 +465,6 @@ entities: - type: RadiationGridResistance - type: GravityShake shakeTimes: 10 -- proto: ActionToggleLight - entities: - - uid: 4 - components: - - type: Transform - parent: 3 - - type: InstantAction - container: 3 - - uid: 5 - components: - - type: Transform - parent: 3 - - type: InstantAction - container: 3 - - uid: 12 - components: - - type: Transform - parent: 11 - - type: InstantAction - container: 11 - - uid: 13 - components: - - type: Transform - parent: 11 - - type: InstantAction - container: 11 - - uid: 22 - components: - - type: Transform - parent: 21 - - type: InstantAction - container: 21 - - uid: 23 - components: - - type: Transform - parent: 21 - - type: InstantAction - container: 21 - - uid: 32 - components: - - type: Transform - parent: 31 - - type: InstantAction - container: 31 - - uid: 33 - components: - - type: Transform - parent: 31 - - type: InstantAction - container: 31 - - uid: 42 - components: - - type: Transform - parent: 41 - - type: InstantAction - container: 41 - - uid: 43 - components: - - type: Transform - parent: 41 - - type: InstantAction - container: 41 -- proto: ActionToggleSuitPiece - entities: - - uid: 51 - components: - - type: Transform - parent: 50 - - type: InstantAction - container: 50 - entIcon: 52 -- proto: ActionVendingThrow - entities: - - uid: 54 - components: - - type: Transform - parent: 53 - - type: InstantAction - container: 53 - proto: AirCanister entities: - uid: 55 @@ -2604,27 +2525,8 @@ entities: components: - type: Transform parent: 2 - - type: HandheldLight - selfToggleActionEntity: 5 - toggleActionEntity: 4 - - type: ContainerContainer - containers: - cell_slot: !type:ContainerSlot - showEnts: False - occludes: True - ent: 6 - actions: !type:Container - showEnts: False - occludes: True - ents: - - 4 - - 5 - type: Physics canCollide: False - - type: ActionsContainer - - type: Actions - actions: - - 5 - type: InsideEntityStorage - proto: ClothingMaskBreath entities: @@ -2755,23 +2657,8 @@ entities: - type: Transform pos: 11.467667,-10.363369 parent: 1 - - type: ToggleableClothing - clothingUid: 52 - actionEntity: 51 - - type: ContainerContainer - containers: - toggleable-clothing: !type:ContainerSlot - showEnts: False - occludes: True - ent: 52 - actions: !type:Container - showEnts: False - occludes: True - ents: - - 51 - type: Physics canCollide: False - - type: ActionsContainer - proto: ClothingOuterSuitFire entities: - uid: 8 @@ -3291,102 +3178,26 @@ entities: components: - type: Transform parent: 10 - - type: HandheldLight - selfToggleActionEntity: 13 - toggleActionEntity: 12 - - type: ContainerContainer - containers: - cell_slot: !type:ContainerSlot - showEnts: False - occludes: True - ent: 14 - actions: !type:Container - showEnts: False - occludes: True - ents: - - 12 - - 13 - type: Physics canCollide: False - - type: ActionsContainer - - type: Actions - actions: - - 13 - uid: 21 components: - type: Transform parent: 20 - - type: HandheldLight - selfToggleActionEntity: 23 - toggleActionEntity: 22 - - type: ContainerContainer - containers: - cell_slot: !type:ContainerSlot - showEnts: False - occludes: True - ent: 24 - actions: !type:Container - showEnts: False - occludes: True - ents: - - 22 - - 23 - type: Physics canCollide: False - - type: ActionsContainer - - type: Actions - actions: - - 23 - uid: 31 components: - type: Transform parent: 30 - - type: HandheldLight - selfToggleActionEntity: 33 - toggleActionEntity: 32 - - type: ContainerContainer - containers: - cell_slot: !type:ContainerSlot - showEnts: False - occludes: True - ent: 34 - actions: !type:Container - showEnts: False - occludes: True - ents: - - 32 - - 33 - type: Physics canCollide: False - - type: ActionsContainer - - type: Actions - actions: - - 33 - uid: 41 components: - type: Transform parent: 40 - - type: HandheldLight - selfToggleActionEntity: 43 - toggleActionEntity: 42 - - type: ContainerContainer - containers: - cell_slot: !type:ContainerSlot - showEnts: False - occludes: True - ent: 44 - actions: !type:Container - showEnts: False - occludes: True - ents: - - 42 - - 43 - type: Physics canCollide: False - - type: ActionsContainer - - type: Actions - actions: - - 43 - proto: FoodBoxDonut entities: - uid: 583 @@ -7517,17 +7328,6 @@ entities: - type: Transform pos: 16.5,-0.5 parent: 1 - - type: VendingMachine - actionEntity: 54 - - type: Actions - actions: - - 54 - - type: ActionsContainer - - type: ContainerContainer - containers: - actions: !type:Container - ents: - - 54 - proto: VendingMachineWallMedical entities: - uid: 926 diff --git a/Resources/Maps/atlas.yml b/Resources/Maps/atlas.yml index 18c63121f6..d220057d5e 100644 --- a/Resources/Maps/atlas.yml +++ b/Resources/Maps/atlas.yml @@ -2855,14 +2855,6 @@ entities: - type: GasTileOverlay - type: RadiationGridResistance - type: NavMap -- proto: ActionToggleLight - entities: - - uid: 7876 - components: - - type: Transform - parent: 7875 - - type: InstantAction - container: 7875 - proto: AirAlarm entities: - uid: 1942 @@ -39104,22 +39096,8 @@ entities: - type: Transform pos: -43.645462,-17.224262 parent: 30 - - type: HandheldLight - toggleActionEntity: 7876 - - type: ContainerContainer - containers: - cell_slot: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - actions: !type:Container - showEnts: False - occludes: True - ents: - - 7876 - type: Physics canCollide: True - - type: ActionsContainer - proto: LemonSeeds entities: - uid: 8448 diff --git a/Resources/Maps/bagel.yml b/Resources/Maps/bagel.yml index 3dfb5c154a..51a2b8ba6c 100644 --- a/Resources/Maps/bagel.yml +++ b/Resources/Maps/bagel.yml @@ -9395,14 +9395,6 @@ entities: - type: Transform pos: 31.477634,-79.4623 parent: 60 -- proto: ActionToggleLight - entities: - - uid: 3189 - components: - - type: Transform - parent: 19193 - - type: InstantAction - container: 19193 - proto: AirAlarm entities: - uid: 249 @@ -70806,20 +70798,6 @@ entities: - type: Transform pos: 20.983997,21.51571 parent: 60 - - type: HandheldLight - toggleActionEntity: 3189 - - type: ContainerContainer - containers: - cell_slot: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - actions: !type:Container - showEnts: False - occludes: True - ents: - - 3189 - - type: ActionsContainer - uid: 21240 components: - type: Transform diff --git a/Resources/Maps/cluster.yml b/Resources/Maps/cluster.yml index 78fdcc4fd1..655c0ff53d 100644 --- a/Resources/Maps/cluster.yml +++ b/Resources/Maps/cluster.yml @@ -4499,20 +4499,6 @@ entities: - type: Transform pos: 3.5402613,7.6028175 parent: 1 -- proto: ActionToggleLight - entities: - - uid: 9312 - components: - - type: Transform - parent: 12532 - - type: InstantAction - container: 12532 - - uid: 9313 - components: - - type: Transform - parent: 12533 - - type: InstantAction - container: 12533 - proto: AirAlarm entities: - uid: 8049 @@ -35985,39 +35971,11 @@ entities: - type: Transform pos: 16.59333,23.726284 parent: 1 - - type: HandheldLight - toggleActionEntity: 9312 - - type: ContainerContainer - containers: - cell_slot: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - actions: !type:Container - showEnts: False - occludes: True - ents: - - 9312 - - type: ActionsContainer - uid: 12533 components: - type: Transform pos: 16.59333,23.476284 parent: 1 - - type: HandheldLight - toggleActionEntity: 9313 - - type: ContainerContainer - containers: - cell_slot: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - actions: !type:Container - showEnts: False - occludes: True - ents: - - 9313 - - type: ActionsContainer - proto: Floodlight entities: - uid: 7307 diff --git a/Resources/Maps/marathon.yml b/Resources/Maps/marathon.yml index caa60e9149..f7a2a60564 100644 --- a/Resources/Maps/marathon.yml +++ b/Resources/Maps/marathon.yml @@ -7773,14 +7773,6 @@ entities: - type: Transform pos: -19.30925,-35.362278 parent: 30 -- proto: ActionToggleLight - entities: - - uid: 3117 - components: - - type: Transform - parent: 5704 - - type: InstantAction - container: 5704 - proto: AirAlarm entities: - uid: 6224 @@ -98436,22 +98428,8 @@ entities: - type: Transform pos: 2.4391665,31.963726 parent: 30 - - type: HandheldLight - toggleActionEntity: 3117 - - type: ContainerContainer - containers: - cell_slot: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - actions: !type:Container - showEnts: False - occludes: True - ents: - - 3117 - type: Physics canCollide: True - - type: ActionsContainer - uid: 7472 components: - type: Transform diff --git a/Resources/Maps/oasis.yml b/Resources/Maps/oasis.yml index 9fd4c24c89..34c01f3a3f 100644 --- a/Resources/Maps/oasis.yml +++ b/Resources/Maps/oasis.yml @@ -9688,70 +9688,6 @@ entities: - type: Transform pos: 19.476593,-4.469906 parent: 21002 -- proto: ActionToggleInternals - entities: - - uid: 23831 - components: - - type: Transform - parent: 23830 - - type: InstantAction - container: 23830 - - uid: 23833 - components: - - type: Transform - parent: 23832 - - type: InstantAction - container: 23832 - - uid: 23835 - components: - - type: Transform - parent: 23834 - - type: InstantAction - container: 23834 - - uid: 23837 - components: - - type: Transform - parent: 23836 - - type: InstantAction - container: 23836 - - uid: 23839 - components: - - type: Transform - parent: 23838 - - type: InstantAction - container: 23838 - - uid: 28282 - components: - - type: Transform - parent: 28281 - - type: InstantAction - container: 28281 - - uid: 28284 - components: - - type: Transform - parent: 28283 - - type: InstantAction - container: 28283 -- proto: ActionToggleLight - entities: - - uid: 2263 - components: - - type: Transform - parent: 2262 - - type: InstantAction - container: 2262 - - uid: 6624 - components: - - type: Transform - parent: 6623 - - type: InstantAction - container: 6623 - - uid: 23803 - components: - - type: Transform - parent: 23802 - - type: InstantAction - container: 23802 - proto: AirAlarm entities: - uid: 5583 @@ -74652,20 +74588,6 @@ entities: - type: Transform pos: -1.6524403,40.692146 parent: 2 - - type: HandheldLight - toggleActionEntity: 23803 - - type: ContainerContainer - containers: - cell_slot: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - actions: !type:Container - showEnts: False - occludes: True - ents: - - 23803 - - type: ActionsContainer - proto: ClothingHeadHelmetRiot entities: - uid: 4267 @@ -86086,14 +86008,6 @@ entities: - type: Transform pos: -26.335854,15.494169 parent: 2 - - type: GasTank - toggleActionEntity: 23839 - - type: ActionsContainer - - type: ContainerContainer - containers: - actions: !type:Container - ents: - - 23839 - proto: DoubleEmergencyOxygenTankFilled entities: - uid: 23832 @@ -86101,14 +86015,6 @@ entities: - type: Transform pos: -26.606686,15.712919 parent: 2 - - type: GasTank - toggleActionEntity: 23833 - - type: ActionsContainer - - type: ContainerContainer - containers: - actions: !type:Container - ents: - - 23833 - proto: Dresser entities: - uid: 22340 @@ -87717,14 +87623,6 @@ entities: - type: Transform pos: -26.28377,14.921253 parent: 2 - - type: GasTank - toggleActionEntity: 23837 - - type: ActionsContainer - - type: ContainerContainer - containers: - actions: !type:Container - ents: - - 23837 - uid: 28423 components: - type: Transform @@ -87747,40 +87645,16 @@ entities: - type: Transform pos: -26.481686,14.431669 parent: 2 - - type: GasTank - toggleActionEntity: 23835 - - type: ActionsContainer - - type: ContainerContainer - containers: - actions: !type:Container - ents: - - 23835 - uid: 28281 components: - type: Transform pos: 43.584152,5.432804 parent: 21002 - - type: GasTank - toggleActionEntity: 28282 - - type: ActionsContainer - - type: ContainerContainer - containers: - actions: !type:Container - ents: - - 28282 - uid: 28283 components: - type: Transform pos: 64.58009,6.520523 parent: 21002 - - type: GasTank - toggleActionEntity: 28284 - - type: ActionsContainer - - type: ContainerContainer - containers: - actions: !type:Container - ents: - - 28284 - uid: 28286 components: - type: Transform @@ -87989,14 +87863,6 @@ entities: - type: Transform pos: -26.606686,14.921253 parent: 2 - - type: GasTank - toggleActionEntity: 23831 - - type: ActionsContainer - - type: ContainerContainer - containers: - actions: !type:Container - ents: - - 23831 - proto: ExtinguisherCabinetFilled entities: - uid: 5804 @@ -134748,22 +134614,8 @@ entities: - type: Transform pos: -31.387814,-44.28387 parent: 2 - - type: HandheldLight - toggleActionEntity: 2263 - - type: ContainerContainer - containers: - cell_slot: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - actions: !type:Container - showEnts: False - occludes: True - ents: - - 2263 - type: Physics canCollide: True - - type: ActionsContainer - proto: LampGold entities: - uid: 1597 @@ -134788,22 +134640,8 @@ entities: - type: Transform pos: 3.4081588,44.633736 parent: 2 - - type: HandheldLight - toggleActionEntity: 6624 - - type: ContainerContainer - containers: - cell_slot: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - actions: !type:Container - showEnts: False - occludes: True - ents: - - 6624 - type: Physics canCollide: True - - type: ActionsContainer - uid: 7981 components: - type: Transform diff --git a/Resources/Maps/saltern.yml b/Resources/Maps/saltern.yml index c9d3218c45..048b0a2e5c 100644 --- a/Resources/Maps/saltern.yml +++ b/Resources/Maps/saltern.yml @@ -3401,14 +3401,6 @@ entities: - type: Transform pos: -11.470391,11.486723 parent: 31 -- proto: ActionToggleLight - entities: - - uid: 7544 - components: - - type: Transform - parent: 9761 - - type: InstantAction - container: 9761 - proto: AirAlarm entities: - uid: 5107 @@ -48902,20 +48894,6 @@ entities: - type: Transform pos: -16.721703,-38.96948 parent: 31 - - type: HandheldLight - toggleActionEntity: 7544 - - type: ContainerContainer - containers: - cell_slot: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - actions: !type:Container - showEnts: False - occludes: True - ents: - - 7544 - - type: ActionsContainer - proto: LargeBeaker entities: - uid: 5074 diff --git a/Resources/Prototypes/Entities/Clothing/Eyes/base_clothingeyes.yml b/Resources/Prototypes/Entities/Clothing/Eyes/base_clothingeyes.yml index 10f265a4a2..b31f821629 100644 --- a/Resources/Prototypes/Entities/Clothing/Eyes/base_clothingeyes.yml +++ b/Resources/Prototypes/Entities/Clothing/Eyes/base_clothingeyes.yml @@ -10,3 +10,42 @@ - type: Item size: Small storedRotation: -90 + +- type: entity + parent: [ClothingEyesBase, BaseFoldable] + id: ClothingHeadEyeBaseFlippable + abstract: true + components: + - type: Appearance + - type: FlippableClothingVisuals + - type: Foldable + canFoldInsideContainer: true + unfoldVerbText: fold-flip-verb + foldVerbText: fold-flip-verb + - type: FoldableClothing + - type: Sprite + layers: + - map: [ "unfoldedLayer" ] + state: icon + - map: ["foldedLayer"] + state: icon + visible: false + scale: -1,1 + +- type: entity + parent: ClothingHeadEyeBaseFlippable + id: ClothingHeadEyeBaseFlipped + suffix: flipped + abstract: true + components: + - type: Foldable + folded: true + - type: Sprite + layers: + - map: [ "unfoldedLayer" ] + state: icon + visible: false + - map: ["foldedLayer"] + state: icon + visible: true + scale: -1,1 diff --git a/Resources/Prototypes/Entities/Clothing/Eyes/hud.yml b/Resources/Prototypes/Entities/Clothing/Eyes/hud.yml index c74a60e8fc..0c7fc5b2a1 100644 --- a/Resources/Prototypes/Entities/Clothing/Eyes/hud.yml +++ b/Resources/Prototypes/Entities/Clothing/Eyes/hud.yml @@ -220,7 +220,7 @@ suffix: Syndicate - type: entity - parent: ClothingEyesHudMedical + parent: [ClothingEyesHudMedical, ClothingHeadEyeBaseFlippable] id: ClothingEyesEyepatchHudMedical name: medical hud eyepatch description: A heads-up display that scans the humanoids in view and provides accurate data about their health status. For true patriots. @@ -231,7 +231,12 @@ sprite: Clothing/Eyes/Hud/medpatch.rsi - type: entity - parent: ClothingEyesHudSecurity + parent: [ClothingEyesEyepatchHudMedical, ClothingHeadEyeBaseFlipped] + id: ClothingEyesEyepatchHudMedicalFlipped + name: medical hud eyepatch + +- type: entity + parent: [ClothingEyesHudSecurity, ClothingHeadEyeBaseFlippable] id: ClothingEyesEyepatchHudSecurity name: security hud eyepatch description: A heads-up display that scans the humanoids in view and provides accurate data about their ID status and security records. For true patriots. @@ -242,7 +247,12 @@ sprite: Clothing/Eyes/Hud/secpatch.rsi - type: entity - parent: ClothingEyesHudBeer + parent: [ClothingEyesEyepatchHudSecurity, ClothingHeadEyeBaseFlipped] + id: ClothingEyesEyepatchHudSecurityFlipped + name: security hud eyepatch + +- type: entity + parent: [ClothingEyesHudBeer, ClothingHeadEyeBaseFlippable] id: ClothingEyesEyepatchHudBeer name: beer hud eyepatch description: A pair of sunHud outfitted with apparatus to scan reagents, as well as providing an innate understanding of liquid viscosity while in motion. For true patriots. @@ -253,7 +263,12 @@ sprite: Clothing/Eyes/Hud/beerpatch.rsi - type: entity - parent: ClothingEyesBase + parent: [ClothingEyesEyepatchHudBeer, ClothingHeadEyeBaseFlipped] + id: ClothingEyesEyepatchHudBeerFlipped + name: beer hud eyepatch + +- type: entity + parent: [ClothingEyesHudDiagnostic, ClothingHeadEyeBaseFlippable] id: ClothingEyesEyepatchHudDiag name: diagnostic hud eyepatch description: A heads-up display capable of analyzing the integrity and status of robotics and exosuits. Made out of see-borg-ium. @@ -262,7 +277,8 @@ sprite: Clothing/Eyes/Hud/diagpatch.rsi - type: Clothing sprite: Clothing/Eyes/Hud/diagpatch.rsi - - type: ShowHealthBars - damageContainers: - - Inorganic - - Silicon + +- type: entity + parent: [ClothingEyesEyepatchHudDiag, ClothingHeadEyeBaseFlipped] + id: ClothingEyesEyepatchHudDiagFlipped + name: diagnostic hud eyepatch diff --git a/Resources/Prototypes/Entities/Clothing/Eyes/misc.yml b/Resources/Prototypes/Entities/Clothing/Eyes/misc.yml index 06ff347172..075ccae1c4 100644 --- a/Resources/Prototypes/Entities/Clothing/Eyes/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/Eyes/misc.yml @@ -1,16 +1,3 @@ -- type: entity - parent: ClothingEyesBase - id: ClothingEyesEyepatch - name: eyepatch - description: Yarr. - components: - - type: Sprite - sprite: Clothing/Eyes/Misc/eyepatch.rsi - - type: Clothing - sprite: Clothing/Eyes/Misc/eyepatch.rsi - - type: EyeProtection - protectionTime: 5 - - type: entity parent: ClothingEyesBase id: ClothingEyesBlindfold @@ -26,3 +13,21 @@ graph: Blindfold node: blindfold - type: FlashImmunity + +- type: entity + parent: ClothingHeadEyeBaseFlippable + id: ClothingEyesEyepatch + name: eyepatch + description: Yarr. + components: + - type: Sprite + sprite: Clothing/Eyes/Misc/eyepatch.rsi + - type: Clothing + sprite: Clothing/Eyes/Misc/eyepatch.rsi + - type: EyeProtection + protectionTime: 5 + +- type: entity + parent: [ClothingEyesEyepatch, ClothingHeadEyeBaseFlipped] + id: ClothingEyesEyepatchFlipped + suffix: flipped diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml index 5a52e09bf2..19768f8dc2 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml @@ -294,6 +294,15 @@ - sprite: Mobs/Customization/reptilian_parts.rsi state: horns_bighorn +- type: marking + id: LizardHornsDemonic + bodyPart: HeadTop + markingCategory: HeadTop + speciesRestriction: [Reptilian] + sprites: + - sprite: Mobs/Customization/reptilian_parts.rsi + state: horns_demonic + - type: marking id: LizardHornsKoboldEars bodyPart: HeadTop diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index 60fb9e791a..b6e84f650f 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -233,9 +233,20 @@ deviceNetId: Wireless receiveFrequencyId: CyborgControl transmitFrequencyId: RoboticsConsole + - type: OnUseTimerTrigger + delay: 10 + examinable: false + beepSound: + path: /Audio/Effects/Cargo/buzz_two.ogg + params: + volume: -4 + # prevent any funnies if someone makes a cyborg item... + - type: AutomatedTimer + - type: ExplodeOnTrigger # explosion does most of its damage in the center and less at the edges - type: Explosive explosionType: Minibomb + deleteAfterExplosion: false # let damage threshold gib the borg totalIntensity: 30 intensitySlope: 20 maxIntensity: 20 diff --git a/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/horns_demonic.png b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/horns_demonic.png new file mode 100644 index 0000000000..63181ea08f Binary files /dev/null and b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/horns_demonic.png differ diff --git a/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/meta.json b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/meta.json index 3770a771d8..bb12e3bf03 100644 --- a/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/meta.json +++ b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "https://github.com/Skyrat-SS13/Skyrat-tg/tree/40e3cdbb15b8bc0d5ef2fb46133adf805bda5297, while Argali, Ayrshire, Myrsore and Bighorn are drawn by Ubaser, and Kobold Ears are drawn by Pigeonpeas. Body_underbelly made by Nairod(github) for SS14. Large drawn by Ubaser. Wagging tail by SonicDC. Splotch modified from Sharp by KittenColony(github). Frills neckfull come from: https://github.com/Bubberstation/Bubberstation/commit/8bc6b83404803466a560b694bf22ef3c0ac266a2", + "copyright": "https://github.com/Skyrat-SS13/Skyrat-tg/tree/40e3cdbb15b8bc0d5ef2fb46133adf805bda5297, while Argali, Ayrshire, Myrsore, Bighorn and Demonic are drawn by Ubaser, and Kobold Ears are drawn by Pigeonpeas. Body_underbelly made by Nairod(github) for SS14. Large drawn by Ubaser. Wagging tail by SonicDC. Splotch modified from Sharp by KittenColony(github). Frills neckfull come from: https://github.com/Bubberstation/Bubberstation/commit/8bc6b83404803466a560b694bf22ef3c0ac266a2", "size": { "x": 32, "y": 32 @@ -581,6 +581,10 @@ "name": "horns_bighorn", "directions": 4 }, + { + "name": "horns_demonic", + "directions": 4 + }, { "name": "horns_kobold_ears", "directions": 4