diff --git a/Content.Server/Chat/SpeakOnUseComponent.cs b/Content.Server/Chat/SpeakOnUseComponent.cs new file mode 100644 index 0000000000..f8953aebef --- /dev/null +++ b/Content.Server/Chat/SpeakOnUseComponent.cs @@ -0,0 +1,18 @@ +using Content.Shared.Dataset; +using Robust.Shared.Prototypes; + +namespace Content.Server.Chat; + +/// +/// Entity will say the things when activated +/// +[RegisterComponent] +public sealed partial class SpeakOnUseComponent : Component +{ + /// + /// The identifier for the dataset prototype containing messages to be spoken by this entity. + /// + [DataField(required: true)] + public ProtoId Pack { get; private set; } + +} diff --git a/Content.Server/Chat/Systems/SpeakOnUseSystem.cs b/Content.Server/Chat/Systems/SpeakOnUseSystem.cs new file mode 100644 index 0000000000..addec79e41 --- /dev/null +++ b/Content.Server/Chat/Systems/SpeakOnUseSystem.cs @@ -0,0 +1,42 @@ +using Content.Server.Chat; +using Content.Shared.Dataset; +using Content.Shared.Interaction.Events; +using Content.Shared.Timing; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Server.Chat.Systems; + +/// +/// Handles the speech on activating an entity +/// +public sealed partial class SpeakOnUIClosedSystem : EntitySystem +{ + [Dependency] private readonly UseDelaySystem _useDelay = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly ChatSystem _chat = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnUseInHand); + } + + public void OnUseInHand(EntityUid uid, SpeakOnUseComponent? component, UseInHandEvent args) + { + if (!Resolve(uid, ref component)) + return; + + // Yes it won't work without UseDelayComponent, but we don't want any kind of spam + if (!TryComp(uid, out UseDelayComponent? useDelay) || _useDelay.IsDelayed((uid, useDelay))) + return; + + if (!_prototypeManager.TryIndex(component.Pack, out var messagePack)) + return; + + var message = Loc.GetString(_random.Pick(messagePack.Values)); + _chat.TrySendInGameICMessage(uid, message, InGameICChatType.Speak, true); + _useDelay.TryResetDelay((uid, useDelay)); + } +} diff --git a/Resources/Locale/en-US/datasets/figurines.ftl b/Resources/Locale/en-US/datasets/figurines.ftl new file mode 100644 index 0000000000..0de2d9131b --- /dev/null +++ b/Resources/Locale/en-US/datasets/figurines.ftl @@ -0,0 +1,166 @@ +figurines-hop-1 = Papers, please. +figurines-hop-2 = You are fired. + +figurines-passenger-1 = How to change hands? +figurines-passenger-2 = Call evac. + +figurines-greytider-1 = Man, this party stinks. I fucking hate these people. +figurines-greytider-2 = Uh-oh, who's lost their stunbaton? +figurines-greytider-3 = Robust. +figurines-greytider-4 = I'm not me without a toolbox. +figurines-greytider-5 = Grey tide station wide! + +figurines-clown-1 = Honk! +figurines-clown-2 = Banana! +figurines-clown-3 = Soap! +figurines-clown-4 = HoP has one clown, HoS has the whole department. +figurines-clown-5 = Do I annoy you? + +figurines-holoclown-1 = I'm helping my older brother. + +figurines-mime-1 = ... +figurines-mime-2 = ... +figurines-mime-3 = .... +figurines-mime-4 = ....... +figurines-mime-5 = ................ + +figurines-musician-1 = Never gonna give you up! +figurines-musician-2 = Never gonna let you down! + +# figurines-boxer- + +figurines-captain-1 = Crew, the Nuke Disk is safely up my ass. +figurines-captain-2 = Glory to NT! + +figurines-hos-1 = Space law? What? +figurines-hos-2 = Shot the clown. + +figurines-warden-1 = Execute him for breaking in! + +figurines-detective-1 = The butler did it. + +figurines-security-1 = I am the law! +figurines-security-2 = You have violated article 1984. + +figurines-lawyer-1 = Better Call Saul! +figurines-lawyer-2 = Objection! + +figurines-cargotech-1 = DRAGON ON ATS! +figurines-cargotech-2 = I sold the station! +figurines-cargotech-3 = Brain bounty? I don't have a brain. + +figurines-salvage-1 = Megafauna? It was mega easy. + +figurines-qm-1 = Who stole the shuttle? +figurines-qm-2 = I won't approve the guns. +figurines-qm-3 = I didn't buy those guns! +figurines-qm-4 = One toys crate for ma fellow clown! +figurines-qm-5 = Time to spent all money on gambling. +figurines-qm-6 = Viva La Cargonia! +figurines-qm-7 = Fill the form. + +figurines-ce-1 = Everyone to the briefing! +figurines-ce-2 = Wire the solars! +figurines-ce-3 = How to setup the TEG? +figurines-ce-4 = SINGULOOSE! +figurines-ce-5 = TESLOOSE! + +figurines-engineer-1 = SINGULOOSE! +figurines-engineer-2 = TESLOOSE! +figurines-engineer-3 = What is AME? + +figurines-atmostech-1 = I put plasma in distro. +figurines-atmostech-2 = I will burn you in a burn chamber. +figurines-atmostech-3 = Frezon... +figurines-atmostech-4 = Tritium... +figurines-atmostech-5 = Glory to Atmosia! + +figurines-rd-1 = Blowing all of the borgs! +figurines-rd-2 = Tier 3 arsenal? No way. + +figurines-scientist-1 = Someone else must have made those bombs! +figurines-scientist-2 = He asked to be borged! +figurines-scientist-3 = Carp at sci! +figurines-scientist-4 = Explosion at sci. +figurines-scientist-5 = The anomaly has exploded. + +figurines-cmo-1 = Suit sensors! +figurines-cmo-2 = Why do we have meth? + +figurines-chemist-1 = Get your pills! + +figurines-paramedic-1 = Insuls and tools! +figurines-paramedic-2 = I need AA for saving people! + +figurines-doctor-1 = The patient is already dead! +figurines-doctor-2 = CLEAR! +figurines-doctor-3 = Saw makes BRRR. + +figurines-librarian-1 = One day while... +figurines-librarian-2 = Silence! + +figurines-chaplain-1 = Would you like to join my cul- I mean religion. +figurines-chaplain-2 = Gods make me a killing machine please! +figurines-chaplain-3 = God exists! + +figurines-chef-1 = I swear it's not human meat. + +figurines-bartender-1 = Where's my monkey? +figurines-bartender-2 = Sec won't drink. + +figurines-botanist-1 = I don't have any weed, officer! +figurines-botanist-2 = Dude, I see colors... + +figurines-janitor-1 = Clown stole my soap. Again. +figurines-janitor-2 = Look at the signs, you idiot. + +figurines-nukie-1 = I got the disk! +figurines-nukie-2 = Whiskey, Echo, Whiskey. +figurines-nukie-3 = The nuke makes boom. +figurines-nukie-4 = What's the code? + +figurines-nukie-elite-1 = Not a word in nanotrasen. +figurines-nukie-elite-2 = THAT'S A KEG! +figurines-nukie-elite-3 = Guys are you alive? + +figurines-nukie-commander-1 = GET DAT FUKKEN DISK! + +figurines-footsoldier-1 = I'm an evil boy. Less boy every day, more evil every day. +figurines-footsoldier-2 = Who will you choose? Them or us? Us or them? + +figurines-wizard-1 = Ei Nath! +figurines-wizard-2 = Wehgardium Leviosa! +figurines-wizard-3 = Skidaddle skadoodle! +figurines-wizard-4 = FIREBALL! + +figurines-space-dragon-1 = Fish will consume the station. + +# figurines-queen + +figurines-rat-king-1 = Gimme some food, capiche? +figurines-rat-king-2 = Fugeddaboutit. +figurines-rat-king-3 = Whack 'em! + +figurines-rat-servant-1 = Capiche! +figurines-rat-servant-2 = Boss says! + +figurines-mouse-1 = Piep! +figurines-mouse-2 = Squeak! +figurines-mouse-3 = Chuu! +figurines-mouse-4 = Eeee! +figurines-mouse-5 = Pip! +figurines-mouse-6 = Fwiep! +figurines-mouse-7 = Heep! + +figurines-slime-1 = Blyump. +figurines-slime-2 = Blimpuf? +figurines-slime-3 = Blump! + +figurines-hamlet-1 = Piep! +figurines-hamlet-2 = Squeak! +figurines-hamlet-3 = Chuu! +figurines-hamlet-4 = Eeee! +figurines-hamlet-5 = Pip! +figurines-hamlet-6 = Fwiep! +figurines-hamlet-7 = Heep! +figurines-hamlet-8 = NOT THE MICROWAVE! diff --git a/Resources/Prototypes/Datasets/figurines.yml b/Resources/Prototypes/Datasets/figurines.yml new file mode 100644 index 0000000000..8ad651c134 --- /dev/null +++ b/Resources/Prototypes/Datasets/figurines.yml @@ -0,0 +1,263 @@ +- type: localizedDataset + id: FigurinesHoP + values: + prefix: figurines-hop- + count: 2 + +- type: localizedDataset + id: FigurinesPassenger + values: + prefix: figurines-passenger- + count: 2 + +- type: localizedDataset + id: FigurinesGreytider + values: + prefix: figurines-greytider- + count: 5 + +- type: localizedDataset + id: FigurinesClown + values: + prefix: figurines-clown- + count: 5 + +- type: localizedDataset + id: FigurinesHoloClown + values: + prefix: figurines-holoclown- + count: 1 + +- type: localizedDataset + id: FigurinesMime + values: + prefix: figurines-mime- + count: 5 + +- type: localizedDataset + id: FigurinesMusician + values: + prefix: figurines-musician- + count: 2 + +# - type: localizedDataset # TODO add something +# id: FigurinesBoxer +# values: +# prefix: figurines-boxer- +# count: 0 + +- type: localizedDataset + id: FigurinesCaptain + values: + prefix: figurines-captain- + count: 2 + +- type: localizedDataset + id: FigurinesHoS + values: + prefix: figurines-hos- + count: 2 + +- type: localizedDataset + id: FigurinesWarden + values: + prefix: figurines-warden- + count: 1 + +- type: localizedDataset + id: FigurinesDetective + values: + prefix: figurines-detective- + count: 1 + +- type: localizedDataset + id: FigurinesSecurity + values: + prefix: figurines-security- + count: 2 + +- type: localizedDataset + id: FigurinesLawyer + values: + prefix: figurines-lawyer- + count: 2 + +- type: localizedDataset + id: FigurinesCargoTech + values: + prefix: figurines-cargotech- + count: 3 + +- type: localizedDataset + id: FigurinesSalvage + values: + prefix: figurines-salvage- + count: 1 + +- type: localizedDataset + id: FigurinesQM + values: + prefix: figurines-qm- + count: 7 + +- type: localizedDataset + id: FigurinesCE + values: + prefix: figurines-ce- + count: 5 + +- type: localizedDataset + id: FigurinesEngineer + values: + prefix: figurines-engineer- + count: 3 + +- type: localizedDataset + id: FigurinesAtmosTech + values: + prefix: figurines-atmostech- + count: 5 + +- type: localizedDataset + id: FigurinesRD + values: + prefix: figurines-rd- + count: 2 + +- type: localizedDataset + id: FigurinesScientist + values: + prefix: figurines-scientist- + count: 5 + +- type: localizedDataset + id: FigurinesCMO + values: + prefix: figurines-cmo- + count: 2 + +- type: localizedDataset + id: FigurinesChemist + values: + prefix: figurines-chemist- + count: 1 + +- type: localizedDataset + id: FigurinesParamedic + values: + prefix: figurines-paramedic- + count: 2 + +- type: localizedDataset + id: FigurinesDoctor + values: + prefix: figurines-doctor- + count: 3 + +- type: localizedDataset + id: FigurinesLibrarian + values: + prefix: figurines-librarian- + count: 2 + +- type: localizedDataset + id: FigurinesChaplain + values: + prefix: figurines-chaplain- + count: 3 + +- type: localizedDataset + id: FigurinesChef + values: + prefix: figurines-chef- + count: 1 + +- type: localizedDataset + id: FigurinesBartender + values: + prefix: figurines-bartender- + count: 2 + +- type: localizedDataset + id: FigurinesBotanist + values: + prefix: figurines-botanist- + count: 2 + +- type: localizedDataset + id: FigurinesJanitor + values: + prefix: figurines-janitor- + count: 2 + +- type: localizedDataset + id: FigurinesNukie + values: + prefix: figurines-nukie- + count: 4 + +- type: localizedDataset + id: FigurinesNukieElite + values: + prefix: figurines-nukie-elite- + count: 3 + +- type: localizedDataset + id: FigurinesNukieCommander + values: + prefix: figurines-nukie-commander- + count: 1 + +- type: localizedDataset + id: FigurinesFootsoldier + values: + prefix: figurines-footsoldier- + count: 2 + +- type: localizedDataset + id: FigurinesWizard + values: + prefix: figurines-wizard- + count: 1 + +- type: localizedDataset + id: FigurinesSpaceDragon + values: + prefix: figurines-space-dragon- + count: 1 + +# - type: localizedDataset # TODO add something +# id: FigurinesQueen +# values: +# prefix: figurines-queen- +# count: 0 + +- type: localizedDataset + id: FigurinesRatKing + values: + prefix: figurines-rat-king- + count: 3 + +- type: localizedDataset + id: FigurinesRatServant + values: + prefix: figurines-rat-servant- + count: 2 + +- type: localizedDataset + id: FigurinesMouse + values: + prefix: figurines-mouse- + count: 7 + +- type: localizedDataset + id: FigurinesSlime + values: + prefix: figurines-slime- + count: 3 + +- type: localizedDataset + id: FigurinesHamlet + values: + prefix: figurines-hamlet- + count: 8 diff --git a/Resources/Prototypes/Entities/Objects/Fun/figurines.yml b/Resources/Prototypes/Entities/Objects/Fun/figurines.yml index ce83f66cb3..0ab95ce043 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/figurines.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/figurines.yml @@ -19,6 +19,10 @@ - Figurine - type: StealTarget stealGroup: Figurines + - type: UseDelay + delay: 10 + - type: Speech + speechSounds: Pai # it just sounds better - type: entity parent: BaseFigurine @@ -28,6 +32,8 @@ components: - type: Sprite state: hop + - type: SpeakOnUse + pack: FigurinesHoP - type: entity parent: BaseFigurine @@ -37,6 +43,8 @@ components: - type: Sprite state: passenger + - type: SpeakOnUse + pack: FigurinesPassenger - type: entity parent: BaseFigurine @@ -46,6 +54,8 @@ components: - type: Sprite state: passenger_greytide + - type: SpeakOnUse + pack: FigurinesGreytider - type: entity parent: BaseFigurine @@ -55,6 +65,8 @@ components: - type: Sprite state: clown + - type: SpeakOnUse + pack: FigurinesClown - type: entity parent: BaseFigurine @@ -64,7 +76,8 @@ components: - type: Sprite state: holoclown - + - type: SpeakOnUse + pack: FigurinesHoloClown - type: entity parent: BaseFigurine @@ -74,6 +87,8 @@ components: - type: Sprite state: mime + - type: SpeakOnUse + pack: FigurinesMime - type: entity parent: BaseFigurine @@ -83,6 +98,8 @@ components: - type: Sprite state: musician + - type: SpeakOnUse + pack: FigurinesMusician - type: entity parent: BaseFigurine @@ -92,6 +109,8 @@ components: - type: Sprite state: boxer + # - type: SpeakOnUse # TODO add something + # pack: FigurinesBoxer - type: entity parent: BaseFigurine @@ -101,6 +120,8 @@ components: - type: Sprite state: captain + - type: SpeakOnUse + pack: FigurinesCaptain - type: entity parent: BaseFigurine @@ -110,6 +131,8 @@ components: - type: Sprite state: hos + - type: SpeakOnUse + pack: FigurinesHoS - type: entity parent: BaseFigurine @@ -119,6 +142,8 @@ components: - type: Sprite state: warden + - type: SpeakOnUse + pack: FigurinesWarden - type: entity parent: BaseFigurine @@ -128,6 +153,8 @@ components: - type: Sprite state: detective + - type: SpeakOnUse + pack: FigurinesDetective - type: entity parent: BaseFigurine @@ -137,6 +164,8 @@ components: - type: Sprite state: security + - type: SpeakOnUse + pack: FigurinesSecurity - type: entity parent: BaseFigurine @@ -146,6 +175,8 @@ components: - type: Sprite state: lawyer + - type: SpeakOnUse + pack: FigurinesLawyer - type: entity parent: BaseFigurine @@ -155,6 +186,8 @@ components: - type: Sprite state: cargotech + - type: SpeakOnUse + pack: FigurinesCargoTech - type: entity parent: BaseFigurine @@ -164,6 +197,8 @@ components: - type: Sprite state: salvage + - type: SpeakOnUse + pack: FigurinesSalvage - type: entity parent: BaseFigurine @@ -173,6 +208,8 @@ components: - type: Sprite state: qm + - type: SpeakOnUse + pack: FigurinesQM - type: entity parent: BaseFigurine @@ -182,6 +219,8 @@ components: - type: Sprite state: ce + - type: SpeakOnUse + pack: FigurinesCE - type: entity parent: BaseFigurine @@ -191,6 +230,8 @@ components: - type: Sprite state: engineer + - type: SpeakOnUse + pack: FigurinesEngineer - type: entity parent: BaseFigurine @@ -200,6 +241,8 @@ components: - type: Sprite state: atmos + - type: SpeakOnUse + pack: FigurinesAtmosTech - type: entity parent: BaseFigurine @@ -209,6 +252,8 @@ components: - type: Sprite state: rd + - type: SpeakOnUse + pack: FigurinesRD - type: entity parent: BaseFigurine @@ -218,6 +263,8 @@ components: - type: Sprite state: scientist + - type: SpeakOnUse + pack: FigurinesScientist - type: entity parent: BaseFigurine @@ -227,6 +274,8 @@ components: - type: Sprite state: cmo + - type: SpeakOnUse + pack: FigurinesCMO - type: entity parent: BaseFigurine @@ -236,6 +285,8 @@ components: - type: Sprite state: chemist + - type: SpeakOnUse + pack: FigurinesChemist - type: entity parent: BaseFigurine @@ -245,6 +296,8 @@ components: - type: Sprite state: paramedic + - type: SpeakOnUse + pack: FigurinesParamedic - type: entity parent: BaseFigurine @@ -254,6 +307,8 @@ components: - type: Sprite state: medical + - type: SpeakOnUse + pack: FigurinesDoctor - type: entity parent: BaseFigurine @@ -263,6 +318,8 @@ components: - type: Sprite state: librarian + - type: SpeakOnUse + pack: FigurinesLibrarian - type: entity parent: BaseFigurine @@ -272,6 +329,8 @@ components: - type: Sprite state: chaplain + - type: SpeakOnUse + pack: FigurinesChaplain - type: entity parent: BaseFigurine @@ -281,6 +340,8 @@ components: - type: Sprite state: chef + - type: SpeakOnUse + pack: FigurinesChef - type: entity parent: BaseFigurine @@ -290,6 +351,8 @@ components: - type: Sprite state: bartender + - type: SpeakOnUse + pack: FigurinesBartender - type: entity parent: BaseFigurine @@ -299,6 +362,8 @@ components: - type: Sprite state: botanist + - type: SpeakOnUse + pack: FigurinesBotanist - type: entity parent: BaseFigurine @@ -308,6 +373,8 @@ components: - type: Sprite state: janitor + - type: SpeakOnUse + pack: FigurinesJanitor - type: entity parent: BaseFigurine @@ -317,6 +384,8 @@ components: - type: Sprite state: nukie + - type: SpeakOnUse + pack: FigurinesNukie - type: entity parent: BaseFigurine @@ -326,6 +395,8 @@ components: - type: Sprite state: nukie_elite + - type: SpeakOnUse + pack: FigurinesNukieElite - type: entity parent: BaseFigurine @@ -335,6 +406,8 @@ components: - type: Sprite state: nukie_commander + - type: SpeakOnUse + pack: FigurinesNukieCommander - type: entity parent: BaseFigurine @@ -344,6 +417,8 @@ components: - type: Sprite state: footsoldier + - type: SpeakOnUse + pack: FigurinesFootsoldier - type: entity parent: BaseFigurine @@ -353,6 +428,8 @@ components: - type: Sprite state: wizard + - type: SpeakOnUse + pack: FigurinesWizard - type: entity parent: BaseFigurine @@ -362,6 +439,8 @@ components: - type: Sprite state: wizard_fake + - type: SpeakOnUse + pack: FigurinesWizard #Nonhuman Figurines @@ -373,6 +452,8 @@ components: - type: Sprite state: spacedragon + - type: SpeakOnUse + pack: FigurinesSpaceDragon - type: entity parent: BaseFigurine @@ -382,6 +463,8 @@ components: - type: Sprite state: queen + # - type: SpeakOnUse # TODO add something + # pack: FigurinesQueen - type: entity parent: BaseFigurine @@ -391,6 +474,8 @@ components: - type: Sprite state: ratking + - type: SpeakOnUse + pack: FigurinesRatKing - type: entity parent: BaseFigurine @@ -400,6 +485,8 @@ components: - type: Sprite state: ratservant + - type: SpeakOnUse + pack: FigurinesRatServant - type: entity parent: BaseFigurine @@ -409,6 +496,8 @@ components: - type: Sprite state: mouse + - type: SpeakOnUse + pack: FigurinesMouse - type: entity parent: BaseFigurine @@ -418,6 +507,8 @@ components: - type: Sprite state: slime + - type: SpeakOnUse + pack: FigurinesSlime - type: entity parent: BaseFigurine @@ -427,6 +518,8 @@ components: - type: Sprite state: hamlet + - type: SpeakOnUse + pack: FigurinesHamlet #TODO: Convert these to the new figurine sprite template and rename their sprite name. #Yes, these are humanoids, but they need to be updated first.