diff --git a/Content.Server/Chat/FunnyFontsChatSystem.cs b/Content.Server/Chat/FunnyFontsChatSystem.cs index a86e720c49..330206e77e 100644 --- a/Content.Server/Chat/FunnyFontsChatSystem.cs +++ b/Content.Server/Chat/FunnyFontsChatSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Chat.Systems; using Content.Server.VoiceMask; using Content.Shared.Interaction.Components; +using Content.Server._White.HopSpeaker; namespace Content.Server.Chat; @@ -14,11 +15,17 @@ public sealed class FunnyFontsChatSystem : EntitySystem private void OnEntitySpeak(SpeechTransformedEvent ev) { - if(TryComp(ev.Sender, out VoiceMaskComponent? mask) && mask.Enabled) return; + if (TryComp(ev.Sender, out VoiceMaskComponent? mask) && mask.Enabled) return; if (TryComp(ev.Sender, out _)) { ev.Message = $"[font=\"ComicSansMS\"]{ev.Message}[/font]"; } + // WD EDIT START + if (TryComp(ev.Sender, out _)) + { + ev.Message = $"[font=\"BureaucracyPixel\"]{ev.Message}[/font]"; + } + // WD EDIT END } } diff --git a/Content.Server/_White/HopSpeaker/HopSpeakerComponent.cs b/Content.Server/_White/HopSpeaker/HopSpeakerComponent.cs new file mode 100644 index 0000000000..9fbd8120d0 --- /dev/null +++ b/Content.Server/_White/HopSpeaker/HopSpeakerComponent.cs @@ -0,0 +1,17 @@ +using Robust.Shared.Audio; + +namespace Content.Server._White.HopSpeaker; + +[RegisterComponent] +public sealed partial class HopSpeakerComponent : Component +{ + [DataField("delay")] + public TimeSpan Delay = TimeSpan.FromSeconds(5); + + [ViewVariables(VVAccess.ReadOnly)] + public TimeSpan DelayEnd = TimeSpan.Zero; + + [DataField] + public SoundSpecifier Sound = new SoundPathSpecifier("/Audio/White/Effects/dynamicNEXT_.ogg"); +} + diff --git a/Content.Server/_White/HopSpeaker/HopSpeakerSystem.cs b/Content.Server/_White/HopSpeaker/HopSpeakerSystem.cs new file mode 100644 index 0000000000..9920bcc5ad --- /dev/null +++ b/Content.Server/_White/HopSpeaker/HopSpeakerSystem.cs @@ -0,0 +1,39 @@ +using Content.Server.Explosion.EntitySystems; +using Content.Server.Chat.Systems; +using Content.Server.Power.Components; +using Robust.Shared.Audio; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Player; +using Robust.Shared.Timing; + +namespace Content.Server._White.HopSpeaker; + +public sealed partial class HopSpeakerSystem : EntitySystem +{ + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(HandleChatOnTrigger); + } + + private void HandleChatOnTrigger(EntityUid uid, HopSpeakerComponent component, TriggerEvent args) + { + if (component.DelayEnd > _gameTiming.CurTime) + return; + + if (!TryComp(uid, out var receiverComponent) || !receiverComponent.Powered) + return; + + _chat.TrySendInGameICMessage(uid, Loc.GetString("hopspeaker-next"), InGameICChatType.Speak, + ChatTransmitRange.Normal); + _audio.PlayEntity(component.Sound, Filter.Local(), uid, false, AudioParams.Default.WithVolume(-2f)); + + component.DelayEnd = _gameTiming.CurTime + component.Delay; + } +} diff --git a/Content.Server/_White/HopSpeaker/PapersSpeechComponent.cs b/Content.Server/_White/HopSpeaker/PapersSpeechComponent.cs new file mode 100644 index 0000000000..71ccf34fa5 --- /dev/null +++ b/Content.Server/_White/HopSpeaker/PapersSpeechComponent.cs @@ -0,0 +1,10 @@ +namespace Content.Server._White.HopSpeaker; + +/// +/// Entity with this component will have a pixel font while speaking. +/// +[RegisterComponent] +public sealed partial class PapersSpeechComponent : Component +{ + +} diff --git a/Resources/Audio/White/Effects/dynamicNEXT_.ogg b/Resources/Audio/White/Effects/dynamicNEXT_.ogg new file mode 100644 index 0000000000..e7dfd96e9b Binary files /dev/null and b/Resources/Audio/White/Effects/dynamicNEXT_.ogg differ diff --git a/Resources/Fonts/BureaucracyPixel/BureaucracyPixel.ttf b/Resources/Fonts/BureaucracyPixel/BureaucracyPixel.ttf new file mode 100644 index 0000000000..fbe984cb5c Binary files /dev/null and b/Resources/Fonts/BureaucracyPixel/BureaucracyPixel.ttf differ diff --git a/Resources/Locale/ru-RU/_white/hop-speaker.ftl b/Resources/Locale/ru-RU/_white/hop-speaker.ftl new file mode 100644 index 0000000000..e845c49149 --- /dev/null +++ b/Resources/Locale/ru-RU/_white/hop-speaker.ftl @@ -0,0 +1,3 @@ +hopspeaker-next = СЛЕДУЮЩИЙ! +ent-HOPSpeaker = громкоговоритель + .desc = Особо экстравагантный способ продвинуть очередь. diff --git a/Resources/Prototypes/_White/Entities/Structures/Wallmounts/speaker.yml b/Resources/Prototypes/_White/Entities/Structures/Wallmounts/speaker.yml new file mode 100644 index 0000000000..06d1c378a9 --- /dev/null +++ b/Resources/Prototypes/_White/Entities/Structures/Wallmounts/speaker.yml @@ -0,0 +1,58 @@ +- type: entity + id: HOPSpeaker + name: loudspeaker + description: An especially extravagant way to move the queue. + placement: + mode: SnapgridCenter + snap: + - Wallmount + components: + - type: HopSpeaker + - type: PapersSpeech + - type: Speech + - type: Transform + anchored: true + - type: WallMount + arc: 360 + - type: InteractionOutline + - type: Clickable + - type: Appearance + - type: Sprite + drawdepth: WallMountedItems + sprite: White/Structures/Wallmounts/speaker.rsi + state: speaker + noRot: true + - type: TriggerOnSignal + - type: DeviceNetwork + deviceNetId: Wireless + receiveFrequencyId: BasicDevice + - type: WirelessNetworkConnection + range: 200 + - type: DeviceLinkSink + ports: + - Trigger + - type: ApcPowerReceiver + powerLoad: 500 + needsPower: true + - type: Electrified + enabled: false + usesApcPower: true + - type: ExtensionCableReceiver + - type: Damageable + damageContainer: StructuralInorganic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 100 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:DoActsBehavior + acts: ["Destruction"] + - type: MeleeSound + soundGroups: + Brute: + path: + "/Audio/Weapons/smash.ogg" diff --git a/Resources/Prototypes/fonts.yml b/Resources/Prototypes/fonts.yml index bfcebb10f1..c0095dc65a 100644 --- a/Resources/Prototypes/fonts.yml +++ b/Resources/Prototypes/fonts.yml @@ -61,3 +61,7 @@ - type: font id: Emoji path: /Fonts/NotoEmoji.ttf + +- type: font # WD + id: BureaucracyPixel + path: /Fonts/BureaucracyPixel/BureaucracyPixel.ttf diff --git a/Resources/Textures/White/Structures/Wallmounts/speaker.rsi/meta.json b/Resources/Textures/White/Structures/Wallmounts/speaker.rsi/meta.json new file mode 100644 index 0000000000..b819f3b4bc --- /dev/null +++ b/Resources/Textures/White/Structures/Wallmounts/speaker.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Nickel", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "speaker" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/White/Structures/Wallmounts/speaker.rsi/speaker.png b/Resources/Textures/White/Structures/Wallmounts/speaker.rsi/speaker.png new file mode 100644 index 0000000000..d6bb46cd0f Binary files /dev/null and b/Resources/Textures/White/Structures/Wallmounts/speaker.rsi/speaker.png differ