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