diff --git a/Content.Server/_Pirate/BatteryLocking/BatterySlotRequiresLockComponent.cs b/Content.Server/_Pirate/BatteryLocking/BatterySlotRequiresLockComponent.cs
new file mode 100644
index 0000000000..f227a56539
--- /dev/null
+++ b/Content.Server/_Pirate/BatteryLocking/BatterySlotRequiresLockComponent.cs
@@ -0,0 +1,8 @@
+namespace Content.Server._Pirate.BatteryLocking;
+
+ [RegisterComponent]
+ public sealed partial class BatterySlotRequiresLockComponent : Component
+ {
+ [DataField("cellSlotId"), ViewVariables(VVAccess.ReadWrite)]
+ public string ItemSlot = string.Empty;
+ }
diff --git a/Content.Server/_Pirate/BatteryLocking/BatterySlotRequiresLockSystem.cs b/Content.Server/_Pirate/BatteryLocking/BatterySlotRequiresLockSystem.cs
new file mode 100644
index 0000000000..6abbd50c59
--- /dev/null
+++ b/Content.Server/_Pirate/BatteryLocking/BatterySlotRequiresLockSystem.cs
@@ -0,0 +1,26 @@
+using Content.Shared.Containers.ItemSlots;
+ using Content.Shared.Lock;
+
+namespace Content.Server._Pirate.BatteryLocking;
+
+public sealed class BatterySlotRequiresLockSystem : EntitySystem
+
+ {
+ [Dependency] private readonly ItemSlotsSystem _itemSlotsSystem = default!;
+
+ ///
+ public override void Initialize()
+ {
+ base.Initialize();
+ SubscribeLocalEvent(LockToggled);
+
+ }
+ private void LockToggled(EntityUid uid, BatterySlotRequiresLockComponent component, LockToggledEvent args)
+ {
+ if (!TryComp(uid, out var lockComp) || !TryComp(uid, out var itemslots))
+ return;
+ if (!_itemSlotsSystem.TryGetSlot(uid, component.ItemSlot, out var slot, itemslots))
+ return;
+ _itemSlotsSystem.SetLock(uid, slot, lockComp.Locked, itemslots);
+ }
+ }
diff --git a/Content.Server/_Pirate/EmitBuzzOnCrit/EmitBuzzOnCritSystem.cs b/Content.Server/_Pirate/EmitBuzzOnCrit/EmitBuzzOnCritSystem.cs
new file mode 100644
index 0000000000..f4c8caadb3
--- /dev/null
+++ b/Content.Server/_Pirate/EmitBuzzOnCrit/EmitBuzzOnCritSystem.cs
@@ -0,0 +1,53 @@
+using Content.Server.Popups;
+using Content.Shared._Pirate.EmitBuzzOnCrit;
+using Content.Shared.Audio;
+using Content.Shared.Body.Components;
+using Content.Shared.Mobs.Systems;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Random;
+using Robust.Shared.Timing;
+
+namespace Content.Server._Pirate.EmitBuzzOnCrit;
+
+ ///
+ /// This handles the buzzing popup and sound of a silicon based race when it goes into critical health.
+ ///
+ public sealed class EmitBuzzOnCritSystem : EntitySystem
+ {
+ [Dependency] private readonly MobStateSystem _mobState = default!;
+ [Dependency] private readonly IGameTiming _gameTiming = default!;
+ [Dependency] private readonly PopupSystem _popupSystem = default!;
+ [Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly IRobustRandom _robustRandom = default!;
+
+ public override void Update(float frameTime)
+ {
+ base.Update(frameTime);
+
+ var query = EntityQueryEnumerator();
+
+ while (query.MoveNext(out var uid, out var emitBuzzOnCritComponent, out var body))
+ {
+ if (_mobState.IsDead(uid))
+ continue;
+ if (!_mobState.IsCritical(uid))
+ continue;
+
+ emitBuzzOnCritComponent.AccumulatedFrametime += frameTime;
+
+ if (emitBuzzOnCritComponent.AccumulatedFrametime < emitBuzzOnCritComponent.CycleDelay)
+ continue;
+ emitBuzzOnCritComponent.AccumulatedFrametime -= emitBuzzOnCritComponent.CycleDelay;
+
+
+ // start buzzing
+ if (_gameTiming.CurTime >= emitBuzzOnCritComponent.LastBuzzPopupTime + emitBuzzOnCritComponent.BuzzPopupCooldown)
+ {
+ emitBuzzOnCritComponent.LastBuzzPopupTime = _gameTiming.CurTime;
+ _popupSystem.PopupEntity(Loc.GetString("silicon-behavior-buzz"), uid);
+ _audio.PlayPvs(emitBuzzOnCritComponent.Sound, uid, AudioHelpers.WithVariation(0.05f, _robustRandom));
+ }
+ }
+ }
+
+ }
diff --git a/Content.Shared/_Pirate/EmitBuzzOnCrit/EmitBuzzOnCritComponent.cs b/Content.Shared/_Pirate/EmitBuzzOnCrit/EmitBuzzOnCritComponent.cs
new file mode 100644
index 0000000000..cb66d83568
--- /dev/null
+++ b/Content.Shared/_Pirate/EmitBuzzOnCrit/EmitBuzzOnCritComponent.cs
@@ -0,0 +1,26 @@
+using System.ComponentModel.DataAnnotations;
+ using Robust.Shared.Audio;
+
+namespace Content.Shared._Pirate.EmitBuzzOnCrit;
+
+ ///
+ /// This is used for controlling the cadence of the buzzing emitted by EmitBuzzOnCritSystem.
+ /// This component is used by mechanical species that can get to critical health.
+ ///
+[RegisterComponent]
+public sealed partial class EmitBuzzOnCritComponent : Component
+{
+ [DataField("buzzPopupCooldown")]
+ public TimeSpan BuzzPopupCooldown { get; private set; } = TimeSpan.FromSeconds(8);
+
+ [ViewVariables]
+ public TimeSpan LastBuzzPopupTime;
+
+ [DataField("cycleDelay")]
+ public float CycleDelay = 2.0f;
+
+ public float AccumulatedFrametime;
+
+ [DataField("sound")]
+ public SoundSpecifier Sound = new SoundCollectionSpecifier("buzzes");
+}
diff --git a/Resources/Audio/_Pirate/Effects/Buzzes/buzz1.ogg b/Resources/Audio/_Pirate/Effects/Buzzes/buzz1.ogg
new file mode 100644
index 0000000000..aa21acee3c
Binary files /dev/null and b/Resources/Audio/_Pirate/Effects/Buzzes/buzz1.ogg differ
diff --git a/Resources/Audio/_Pirate/Effects/Buzzes/buzz2.ogg b/Resources/Audio/_Pirate/Effects/Buzzes/buzz2.ogg
new file mode 100644
index 0000000000..652d331abc
Binary files /dev/null and b/Resources/Audio/_Pirate/Effects/Buzzes/buzz2.ogg differ
diff --git a/Resources/Audio/_Pirate/Effects/Buzzes/buzz3.ogg b/Resources/Audio/_Pirate/Effects/Buzzes/buzz3.ogg
new file mode 100644
index 0000000000..e7721fa666
Binary files /dev/null and b/Resources/Audio/_Pirate/Effects/Buzzes/buzz3.ogg differ
diff --git a/Resources/Audio/_Pirate/Effects/Buzzes/buzz4.ogg b/Resources/Audio/_Pirate/Effects/Buzzes/buzz4.ogg
new file mode 100644
index 0000000000..8c400abe85
Binary files /dev/null and b/Resources/Audio/_Pirate/Effects/Buzzes/buzz4.ogg differ
diff --git a/Resources/Audio/_Pirate/Effects/Buzzes/buzz5.ogg b/Resources/Audio/_Pirate/Effects/Buzzes/buzz5.ogg
new file mode 100644
index 0000000000..b24a684e43
Binary files /dev/null and b/Resources/Audio/_Pirate/Effects/Buzzes/buzz5.ogg differ
diff --git a/Resources/Audio/_Pirate/Effects/Buzzes/buzz6.ogg b/Resources/Audio/_Pirate/Effects/Buzzes/buzz6.ogg
new file mode 100644
index 0000000000..81b206c6ed
Binary files /dev/null and b/Resources/Audio/_Pirate/Effects/Buzzes/buzz6.ogg differ
diff --git a/Resources/Audio/_Pirate/Effects/Buzzes/buzz7.ogg b/Resources/Audio/_Pirate/Effects/Buzzes/buzz7.ogg
new file mode 100644
index 0000000000..f58bfaa2ea
Binary files /dev/null and b/Resources/Audio/_Pirate/Effects/Buzzes/buzz7.ogg differ
diff --git a/Resources/Audio/_Pirate/Effects/Buzzes/buzz8.ogg b/Resources/Audio/_Pirate/Effects/Buzzes/buzz8.ogg
new file mode 100644
index 0000000000..75ad0c4fee
Binary files /dev/null and b/Resources/Audio/_Pirate/Effects/Buzzes/buzz8.ogg differ
diff --git a/Resources/Audio/_Pirate/Effects/Buzzes/buzz9.ogg b/Resources/Audio/_Pirate/Effects/Buzzes/buzz9.ogg
new file mode 100644
index 0000000000..1e3a743f73
Binary files /dev/null and b/Resources/Audio/_Pirate/Effects/Buzzes/buzz9.ogg differ
diff --git a/Resources/Audio/_Pirate/Voice/IPC/cry_robot_1.ogg b/Resources/Audio/_Pirate/Voice/IPC/cry_robot_1.ogg
new file mode 100644
index 0000000000..78a27496a5
Binary files /dev/null and b/Resources/Audio/_Pirate/Voice/IPC/cry_robot_1.ogg differ
diff --git a/Resources/Audio/_Pirate/Voice/IPC/robot-laugh_3.ogg b/Resources/Audio/_Pirate/Voice/IPC/robot-laugh_3.ogg
new file mode 100644
index 0000000000..331151f6b5
Binary files /dev/null and b/Resources/Audio/_Pirate/Voice/IPC/robot-laugh_3.ogg differ
diff --git a/Resources/Audio/_Pirate/Voice/IPC/robot-scream.ogg b/Resources/Audio/_Pirate/Voice/IPC/robot-scream.ogg
new file mode 100644
index 0000000000..6420a4009d
Binary files /dev/null and b/Resources/Audio/_Pirate/Voice/IPC/robot-scream.ogg differ
diff --git a/Resources/Locale/uk-UA/body/behavior/behavior.ftl b/Resources/Locale/uk-UA/body/behavior/behavior.ftl
index 3541987144..2a908259bc 100644
--- a/Resources/Locale/uk-UA/body/behavior/behavior.ftl
+++ b/Resources/Locale/uk-UA/body/behavior/behavior.ftl
@@ -1 +1,3 @@
-lung-behavior-gasp = Задихається
\ No newline at end of file
+lung-behavior-gasp = Задихається
+
+silicon-behavior-buzz = Бззззз...
diff --git a/Resources/Prototypes/SimpleStation14/Entities/Mobs/Player/ipc.yml b/Resources/Prototypes/SimpleStation14/Entities/Mobs/Player/ipc.yml
index 663d9571a6..f4abe9104b 100644
--- a/Resources/Prototypes/SimpleStation14/Entities/Mobs/Player/ipc.yml
+++ b/Resources/Prototypes/SimpleStation14/Entities/Mobs/Player/ipc.yml
@@ -75,6 +75,7 @@
boardName: "ipc-board-name"
layoutId: IPC
- type: SSDIndicator
+ - type: EmitBuzzOnCrit
# - type: UnblockableSpeech
- type: entity
diff --git a/Resources/Prototypes/SimpleStation14/Entities/Mobs/Player/silicon_base.yml b/Resources/Prototypes/SimpleStation14/Entities/Mobs/Player/silicon_base.yml
index bc6a41b880..d97b025ff0 100644
--- a/Resources/Prototypes/SimpleStation14/Entities/Mobs/Player/silicon_base.yml
+++ b/Resources/Prototypes/SimpleStation14/Entities/Mobs/Player/silicon_base.yml
@@ -314,9 +314,9 @@
speechSounds: Pai
- type: Vocal
sounds:
- Male: MaleHuman
- Female: FemaleHuman
- Unsexed: MaleHuman
+ Male: UnisexSilicon
+ Female: UnisexSilicon
+ Unsexed: UnisexSilicon
- type: MeleeWeapon
hidden: true
soundHit:
diff --git a/Resources/Prototypes/Voice/speech_emote_sounds.yml b/Resources/Prototypes/Voice/speech_emote_sounds.yml
index 5556afa07d..5eaabf39f4 100644
--- a/Resources/Prototypes/Voice/speech_emote_sounds.yml
+++ b/Resources/Prototypes/Voice/speech_emote_sounds.yml
@@ -315,6 +315,12 @@
path: /Audio/Items/bikehorn.ogg
Ping:
path: /Audio/Effects/Cargo/ping.ogg
+ Scream:
+ path: /Audio/_Pirate/Voice/IPC/robot-scream.ogg
+ Laugh:
+ path: /Audio/_Pirate/Voice/IPC/robot-laugh_3.ogg
+ Crying:
+ path: /Audio/_Pirate/Voice/IPC/cry_robot_1.ogg
# body emotes
- type: emoteSounds
diff --git a/Resources/Prototypes/_Pirate/SoundCollections/buzzes.yml b/Resources/Prototypes/_Pirate/SoundCollections/buzzes.yml
new file mode 100644
index 0000000000..338a5a7a51
--- /dev/null
+++ b/Resources/Prototypes/_Pirate/SoundCollections/buzzes.yml
@@ -0,0 +1,12 @@
+- type: soundCollection
+ id: buzzes
+ files:
+ - /Audio/_Pirate/Effects/Buzzes/buzz1.ogg
+ - /Audio/_Pirate/Effects/Buzzes/buzz2.ogg
+ - /Audio/_Pirate/Effects/Buzzes/buzz3.ogg
+ - /Audio/_Pirate/Effects/Buzzes/buzz4.ogg
+ - /Audio/_Pirate/Effects/Buzzes/buzz5.ogg
+ - /Audio/_Pirate/Effects/Buzzes/buzz6.ogg
+ - /Audio/_Pirate/Effects/Buzzes/buzz7.ogg
+ - /Audio/_Pirate/Effects/Buzzes/buzz8.ogg
+ - /Audio/_Pirate/Effects/Buzzes/buzz9.ogg