From d02fc7716ce8ebf849128613d3fb53ccedf53170 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 5 Jan 2025 23:45:58 -0500 Subject: [PATCH 1/4] Update hardsuits.yml --- .../Entities/Clothing/OuterClothing/hardsuits.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index a9bb8f1dc77..c7642247802 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -44,6 +44,8 @@ lowPressureMultiplier: 1000 - type: TemperatureProtection coefficient: 0.001 + - type: FireProtection + reduction: 1 - type: ExplosionResistance damageCoefficient: 0.5 - type: Armor @@ -98,6 +100,10 @@ coefficient: 0.75 # 25% - type: GuideHelp guides: [ HephaestusIndustries ] + - type: TemperatureProtection + coefficient: 0.001 + - type: FireProtection + reduction: 0.8 #Spationaut Hardsuit - type: entity @@ -397,6 +403,10 @@ coefficient: 0.65 # 35% - type: GuideHelp guides: [ HephaestusIndustries ] + - type: TemperatureProtection + coefficient: 0.001 + - type: FireProtection + reduction: 1 #Chief Medical Officer's Hardsuit - type: entity @@ -622,7 +632,7 @@ - type: ExplosionResistance damageCoefficient: 0.2 - type: FireProtection - reduction: 0.8 # perfect protection like atmos firesuit for pyro tf2 ops + reduction: 1 # perfect protection like atmos firesuit for pyro tf2 ops - type: Armor modifiers: coefficients: From cb3ca2a3bfd9949b6c86e3922e229d0f97075427 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 5 Jan 2025 23:47:50 -0500 Subject: [PATCH 2/4] Update hardsuits.yml --- .../Entities/Clothing/OuterClothing/hardsuits.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index c7642247802..4696e6d8e30 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -103,7 +103,7 @@ - type: TemperatureProtection coefficient: 0.001 - type: FireProtection - reduction: 0.8 + reduction: 1 #Spationaut Hardsuit - type: entity @@ -231,6 +231,8 @@ damageCoefficient: 0.2 - type: TemperatureProtection coefficient: 0.001 + - type: FireProtection + reduction: 1 - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitMaxim - type: GuideHelp @@ -900,6 +902,10 @@ clothingPrototype: ClothingHeadHelmetHardsuitERTEngineer - type: StaminaDamageResistance coefficient: 0.5 # 50% + - type: TemperatureProtection + coefficient: 0.001 + - type: FireProtection + reduction: 1 #ERT Medic Hardsuit - type: entity From 4d6081dec5179a4d34fc6a262e4d6118b1194b88 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 6 Jan 2025 20:31:17 -0500 Subject: [PATCH 3/4] I fucked up and need to move these, I'll revert them in a second --- .../Psionics/Abilities/AssayPowerSystem.cs | 116 ++++++++++++++++++ .../Actions/Events/AssayPowerActionEvent.cs | 29 +++++ Content.Shared/Psionics/Events.cs | 27 ++++ Resources/Locale/en-US/abilities/psionic.ftl | 3 + .../Locale/en-US/psionics/psionic-powers.ftl | 34 +++++ Resources/Prototypes/Actions/psionics.yml | 19 +++ .../Roles/Jobs/Epistemics/forensicmantis.yml | 1 + Resources/Prototypes/Psionics/psionics.yml | 27 ++++ .../Roles/Jobs/Civilian/librarian.yml | 1 + .../Interface/Actions/psionics.rsi/assay.png | Bin 0 -> 2351 bytes .../Interface/Actions/psionics.rsi/meta.json | 5 +- 11 files changed, 261 insertions(+), 1 deletion(-) create mode 100644 Content.Server/Abilities/Psionics/Abilities/AssayPowerSystem.cs create mode 100644 Content.Shared/Actions/Events/AssayPowerActionEvent.cs create mode 100644 Resources/Textures/Interface/Actions/psionics.rsi/assay.png diff --git a/Content.Server/Abilities/Psionics/Abilities/AssayPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/AssayPowerSystem.cs new file mode 100644 index 00000000000..32b32c021b2 --- /dev/null +++ b/Content.Server/Abilities/Psionics/Abilities/AssayPowerSystem.cs @@ -0,0 +1,116 @@ +using Content.Server.Chat.Managers; +using Content.Shared.Abilities.Psionics; +using Content.Shared.Actions.Events; +using Content.Shared.Chat; +using Content.Shared.DoAfter; +using Content.Shared.Popups; +using Content.Shared.Psionics.Events; +using Robust.Server.Audio; +using Robust.Shared.Audio; +using Robust.Server.Player; +using Robust.Shared.Timing; +using Robust.Shared.Player; + +namespace Content.Server.Abilities.Psionics; + +public sealed class AssayPowerSystem : EntitySystem +{ + [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly AudioSystem _audioSystem = default!; + [Dependency] private readonly SharedPopupSystem _popups = default!; + [Dependency] private readonly IChatManager _chatManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnPowerUsed); + SubscribeLocalEvent(OnDoAfter); + } + + private void OnPowerUsed(EntityUid uid, PsionicComponent psionic, AssayPowerActionEvent args) + { + if (!_psionics.OnAttemptPowerUse(args.Performer, "assay") + || psionic.DoAfter is not null) + return; + + var ev = new AssayDoAfterEvent(_gameTiming.CurTime, args.FontSize, args.FontColor); + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, args.Performer, args.UseDelay - TimeSpan.FromSeconds(psionic.CurrentAmplification), ev, args.Performer, args.Target, args.Performer) + { + BlockDuplicate = true, + BreakOnMove = true, + BreakOnDamage = true, + }, out var doAfterId); + psionic.DoAfter = doAfterId; + + _popups.PopupEntity(Loc.GetString(args.PopupTarget, ("entity", args.Target)), args.Performer, PopupType.Medium); + + _audioSystem.PlayPvs(args.SoundUse, args.Performer, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); + _psionics.LogPowerUsed(args.Performer, args.PowerName, args.MinGlimmer, args.MaxGlimmer); + args.Handled = true; + } + + private void OnDoAfter(EntityUid uid, PsionicComponent userPsionic, AssayDoAfterEvent args) + { + if (userPsionic is null) + return; + userPsionic.DoAfter = null; + + var user = uid; + var target = args.Target; + if (target == null || args.Cancelled + || !_playerManager.TryGetSessionByEntity(user, out var session)) + return; + + if (target == user) + { + var userAmp = MathF.Round(userPsionic.CurrentAmplification, 2); + var userDamp = MathF.Round(userPsionic.CurrentDampening, 2); + var userPotentia = MathF.Round(userPsionic.Potentia, 2); + var userFeedback = $"[font size={args.FontSize}][color={args.FontColor}]{Loc.GetString("assay-body", ("entity", target), ("amplification", userAmp), ("dampening", userDamp), ("potentia", userPotentia))}[/color][/font]"; + SendDescToChat(userFeedback, session); + + var assaySelf = Loc.GetString("assay-self", ("entity", target)); + _popups.PopupEntity(assaySelf, user, user, PopupType.LargeCaution); + + var assaySelfFeedback = $"[font size={args.FontSize}][color={args.FontColor}]{assaySelf}[/color][/font]"; + SendDescToChat(assaySelfFeedback, session); + return; + } + + if (!TryComp(target, out var targetPsionic)) + { + var noPowers = Loc.GetString("no-powers", ("entity", target)); + _popups.PopupEntity(noPowers, user, user, PopupType.LargeCaution); + + var noPowersFeedback = $"[font size={args.FontSize}][color={args.FontColor}]{noPowers}[/color][/font]"; + SendDescToChat(noPowersFeedback, session); + return; + } + + var targetAmp = MathF.Round(targetPsionic.CurrentAmplification, 2); + var targetDamp = MathF.Round(targetPsionic.CurrentDampening, 2); + var targetPotentia = MathF.Round(targetPsionic.Potentia, 2); + var message = $"[font size={args.FontSize}][color={args.FontColor}]{Loc.GetString("assay-body", ("entity", target), ("amplification", targetAmp), ("dampening", targetDamp), ("potentia", targetPotentia))}[/color][/font]"; + SendDescToChat(message, session); + + foreach (var feedback in targetPsionic.AssayFeedback) + { + var feedbackMessage = $"[font size={args.FontSize}][color={args.FontColor}]{Loc.GetString(feedback, ("entity", target))}[/color][/font]"; + SendDescToChat(feedbackMessage, session); + } + } + + private void SendDescToChat(string feedbackMessage, ICommonSession session) + { + _chatManager.ChatMessageToOne( + ChatChannel.Emotes, + feedbackMessage, + feedbackMessage, + EntityUid.Invalid, + false, + session.Channel); + } +} diff --git a/Content.Shared/Actions/Events/AssayPowerActionEvent.cs b/Content.Shared/Actions/Events/AssayPowerActionEvent.cs new file mode 100644 index 00000000000..debd19615fe --- /dev/null +++ b/Content.Shared/Actions/Events/AssayPowerActionEvent.cs @@ -0,0 +1,29 @@ +using Robust.Shared.Audio; + +namespace Content.Shared.Actions.Events; +public sealed partial class AssayPowerActionEvent : EntityTargetActionEvent +{ + [DataField] + public TimeSpan UseDelay = TimeSpan.FromSeconds(8f); + + [DataField] + public SoundSpecifier SoundUse = new SoundPathSpecifier("/Audio/Psionics/heartbeat_fast.ogg"); + + [DataField] + public string PopupTarget = "assay-begin"; + + [DataField] + public int FontSize = 10; + + [DataField] + public Color FontColor = Color.White; + + [DataField] + public int MinGlimmer = 3; + + [DataField] + public int MaxGlimmer = 6; + + [DataField] + public string PowerName = "assay"; +} diff --git a/Content.Shared/Psionics/Events.cs b/Content.Shared/Psionics/Events.cs index 68ec3097e7d..9c59332e229 100644 --- a/Content.Shared/Psionics/Events.cs +++ b/Content.Shared/Psionics/Events.cs @@ -1,6 +1,7 @@ using Robust.Shared.Serialization; using Content.Shared.Damage; using Content.Shared.DoAfter; +using Content.Shared.Abilities.Psionics; namespace Content.Shared.Psionics.Events; @@ -67,3 +68,29 @@ public PsionicHealOtherDoAfterEvent(TimeSpan startedAt) public override DoAfterEvent Clone() => this; } + +[Serializable, NetSerializable] +public sealed partial class AssayDoAfterEvent : DoAfterEvent +{ + [DataField(required: true)] + public TimeSpan StartedAt; + + [DataField] + public int FontSize = 10; + + [DataField] + public Color FontColor = Color.White; + + private AssayDoAfterEvent() + { + } + + public AssayDoAfterEvent(TimeSpan startedAt, int fontSize, Color fontColor) + { + StartedAt = startedAt; + FontSize = fontSize; + FontColor = fontColor; + } + + public override DoAfterEvent Clone() => this; +} diff --git a/Resources/Locale/en-US/abilities/psionic.ftl b/Resources/Locale/en-US/abilities/psionic.ftl index d0e8db72f8c..c8eb9635946 100644 --- a/Resources/Locale/en-US/abilities/psionic.ftl +++ b/Resources/Locale/en-US/abilities/psionic.ftl @@ -68,3 +68,6 @@ action-description-psychokinesis = Bend the fabric of space to instantly move ac action-name-rf-sensitivity = Toggle RF Sensitivity action-desc-rf-sensitivity = Toggle your ability to interpret radio waves on and off. + +action-name-assay = Assay +action-description-assay = Probe an entity at close range to glean metaphorical information about any powers they may have diff --git a/Resources/Locale/en-US/psionics/psionic-powers.ftl b/Resources/Locale/en-US/psionics/psionic-powers.ftl index ab2a991e06f..e3e097e4339 100644 --- a/Resources/Locale/en-US/psionics/psionic-powers.ftl +++ b/Resources/Locale/en-US/psionics/psionic-powers.ftl @@ -183,3 +183,37 @@ ghost-role-information-familiar-description = An interdimensional creature bound ghost-role-information-familiar-rules = Obey the one who summoned you. Do not act against the interests of your Master. You will die for your Master if it is necessary. +# Assay Power +assay-begin = The air around {CAPITALIZE($entity)} begins to shimmer faintly +assay-self = I AM. +no-powers = {CAPITALIZE($entity)} will never awaken from the dream in this life +assay-body = + MY WILL CAST UPON {CAPITALIZE($entity)} DIVINES THESE + Amplification: {$amplification} + Dampening: {$dampening} + Potentia: {$potentia} +assay-power-initialization-feedback = + I descend into the dreamlight once more, there I drink more fully of the cup of knowledge. The touch of the noosphere upon others becomes known to me, + I can cast my will upon them, divining the inner nature of others. +assay-power-metapsionic-feedback = {CAPITALIZE($entity)} bears a spark of the divine's judgment, they have drunk deeply of the cup of knowledge. + +# Entity Specific Feedback Messages +ifrit-feedback = A spirit of Gehenna, bound by the will of a powerful psychic +prober-feedback = A mirror into the end of time, the screaming of dead stars emanates from this machine +drain-feedback = A mirror into a realm where the stars sit still forever, a cold and distant malevolence stares back +sophic-grammateus-feedback = SEEKER, YOU NEED ONLY ASK FOR MY WISDOM. +oracle-feedback = WHY DO YOU BOTHER ME SEEKER? HAVE I NOT MADE MY DESIRES CLEAR? +orecrab-feedback = Heralds of the Lord of Earth, summoned to this realm from Grome's kingdom +reagent-slime-feedback = Heralds of the Lord of Water, summoned to this realm from Straasha's kingdom. +flesh-golem-feedback = Abominations pulled from dead realms, twisted amalgamations of those fallen to the influence of primordial Chaos +glimmer-mite-feedback = A semi-corporeal parasite native to the dreamlight, its presence here brings forth the screams of dead stars. +anomaly-pyroclastic-feedback = A small mirror to the plane of Gehenna, truth lies within the Secret of Fire +anomaly-gravity-feedback = Violet and crimson, blue of blue, impossibly dark yet greater than the whitest of white, a black star shines weakly at the end of it all +anomaly-electricity-feedback = A mirror to a realm tiled by silicon, the lifeblood of artificial thought flows from it +anomaly-flesh-feedback = From within it comes the suffering of damned mutants howling for all eternity +anomaly-bluespace-feedback = A bridge of dreamlight, crossing into the space between realms of the multiverse +anomaly-ice-feedback = Walls of blackened stone, ruin and famine wait for those who fall within +anomaly-rock-feedback = A vast old oak dwells high over a plane of stone, it turns to stare back +anomaly-flora-feedback = Musical notes drift around you, playfully beckoning, they wish to feast +anomaly-liquid-feedback = A realm of twisting currents. Its placidity is a lie. The eyes within stare hungrilly +anomaly-shadow-feedback = At the end of time, when all suns have set forever, there amidst the void stands a monument to past sins. diff --git a/Resources/Prototypes/Actions/psionics.yml b/Resources/Prototypes/Actions/psionics.yml index c6d9e17c2ac..97d19aae5f6 100644 --- a/Resources/Prototypes/Actions/psionics.yml +++ b/Resources/Prototypes/Actions/psionics.yml @@ -367,3 +367,22 @@ followMaster: true minGlimmer: 5 maxGlimmer: 10 + +- type: entity + id: ActionAssay + name: action-name-assay + description: action-description-assay + categories: [ HideSpawnMenu ] + components: + - type: EntityTargetAction + icon: { sprite: Interface/Actions/psionics.rsi, state: assay } + useDelay: 45 + checkCanAccess: false + range: 2 + itemIconStyle: BigAction + canTargetSelf: true + blacklist: + components: + - PsionicInsulation + - Mindbroken + event: !type:AssayPowerActionEvent diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml index f7a31205706..961bbf05fd0 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml @@ -39,6 +39,7 @@ powersToAdd: - MetapsionicPower - TelepathyPower + - AssayPower - type: startingGear id: ForensicMantisGear diff --git a/Resources/Prototypes/Psionics/psionics.yml b/Resources/Prototypes/Psionics/psionics.yml index 548881e61f7..b1e9d783a8e 100644 --- a/Resources/Prototypes/Psionics/psionics.yml +++ b/Resources/Prototypes/Psionics/psionics.yml @@ -170,6 +170,9 @@ - !type:AddPsionicStatSources amplificationModifier: 0.5 dampeningModifier: 0.5 + - !type:PsionicAddAvailablePowers + powerPrototype: AssayPower + weight: 0.1 removalFunctions: - !type:RemovePsionicActions - !type:RemovePsionicPowerComponents @@ -178,6 +181,8 @@ - !type:RemovePsionicStatSources - !type:RemoveAssayFeedback assayFeedback: metapsionic-power-metapsionic-feedback + - !type:PsionicRemoveAvailablePowers + powerPrototype: AssayPower - type: psionicPower id: PsionicRegenerationPower @@ -661,3 +666,25 @@ - !type:RemovePsionicPsychognomicDescriptors psychognomicDescriptor: calling powerSlotCost: 0 + +- type: psionicPower + id: AssayPower + name: Assay + powerCategories: + - Mentalic + initializeFunctions: + - !type:AddPsionicActions + actions: + - ActionAssay + - !type:PsionicFeedbackPopup + - !type:PsionicFeedbackSelfChat + feedbackMessage: assay-power-initialization-feedback + - !type:AddPsionicAssayFeedback + assayFeedback: assay-power-metapsionic-feedback + - !type:AddPsionicStatSources + dampeningModifier: 0.5 + removalFunctions: + - !type:RemovePsionicActions + - !type:RemovePsionicStatSources + - !type:RemoveAssayFeedback + assayFeedback: assay-power-metapsionic-feedback diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml index 3468d10f278..e370d1c3af9 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml @@ -37,6 +37,7 @@ powersToAdd: - XenoglossyPower - TelepathyPower + - AssayPower - type: startingGear diff --git a/Resources/Textures/Interface/Actions/psionics.rsi/assay.png b/Resources/Textures/Interface/Actions/psionics.rsi/assay.png new file mode 100644 index 0000000000000000000000000000000000000000..f245ca9e5e34e1e240ec8669d544d25a7c480053 GIT binary patch literal 2351 zcmV+~3DEY5P)9?Ncm1Y5zzB48of z_$vGd+6uM`f}jW@me#%+k@Zd@BuJcP_I{k1bD22<_Fz`anJqrZ<%>or;CC-Ym)*`6 z+8CyfL3}aI)aS!<5&j*Yci2?D^{QU~?`t|b6G>A8Tf6X-rW-}!8R6i1QCGYz+^c0` z3E@NGaYGI$e5Lewjh_{#Yy7U*h=gXru6nxD4IFP^Eo0<_$Amq(Y)Sh)kGe@$GQSv> zIv{fhlMn&?xQSC@jVwjHQuC5obDyv3Tc98wP5wG%3~{8%h<9Anl5|ZO^grk^BUY6hGVQ4pyq-dL6nbu;W2KhW?>Z;<5ZRC?x`w@d7?u65)gMjJXf8bEHof!!9}{TD5aGuh*q*{Nr^-k z32M}h@jBm}^WFS+?wm9K+;h&g=p8t@=P~m?zW*`LBuT&Y5$GfEe@0-SZsni)@gtW- zGr+S=rpx0m)+%CY06YpxfkVn_mCKd0EI>nA2_oy|DXsV!M`-43V`k) zF>`XT_3rxHyB*(uKlO4@zhDJWH6S!4F%y>-kcHVtTTEZOF{Pr#1{a^$YyRv^p#i;RBi`%lJN#tlR})I-mtP9 zxpct(7KH=at-rO;DlW@Q7bcR)cmEEyMVl)}cWl$f*Aw=4eft;NPAZR_pveJI9w6fk z48a%|6o)Vn441|mP8`0krN6w-^8(N$eeeQL@+aUj2WY)1$^(iRxE@jD4c|WZM-y%@ z%fiY;^2n!mb;v_7p}cGHJSE`?S`P>U5JOB_o&v*4Zdfo0o|*Y6dFA@O_WSMaUlZ9A zkQQPcAx1z$Ax2Obwjr;mY9!d9Wmt|1!Cj%K%=%J!SMe*!j#WOko7INE zP>r*>0VBB0*03PmmkPo&Hn(<+<%ex7OT{5P+hiUT^wgqoFyC_9M|%J*7aF)2i$Nya zTR?dzbo}N+t?mw1zxeY_qx^vcAjxiU>A@c?V9f3sYii|kX`$=Lqi;uAh#`)u$OOW= zG3z5D>*G6O9%b<0y8Yd~HQBo7Gk#@Wz;g&}<`l@p`jlC8jb1NMdjOd{zx<|U^2x$` z-qD+kZ(0?C;U0=D&wXXa0M{&y#?qwuJ8s7W7zY5Dg_XzbH@3mOw61T&2->b(FC>@p z4BPfT4}jpjo7N;XS`7kzKKp0(n!kyO_l;z1bTs*XJRQWK3?BTeH6Q{Ajim>ymuzlr zC1W$Arp8`-3q+C*p;6lTx7TwthvlIUt`09ydjKs9%d^nsAe0mcVDKC2rXe$I#{Fx_ zcaPujS_U3)?)U}c35Sx#>QvSyb!pN#Gm8*Pm6bfKcV%)hH1|)RRn1`40D!66eK9s+ z^`}>d_kc;-`}Dkt&hD)t>-s3?=09!&#?3KBJS6>4zHrgcOMHig z#(Iy5;ndn`5_C(f@+#!hO3VWtO?&{TVkd%mTUBOxyu=!ge8&B46FxPT4o{BC0c8ba z4x!RaoU-eSjp4E~MNfyzGQ88;_W}5~E#eNSdM!^+JpdCU&Lg-MfB_BeIrP=6CRGVi z&j64sMgRfBT^8JPh#R}WS{96+^a4~~4w)OPW&}8rijS#pI?Uah38GD1iy#s-p9fSr z0FsuMOJF|BF&yx%CQs_N!EC^=H4O?$Tp~da|(B5Ea52!-<&TKm>g!FQoFJY;R)Q$|Wa3F@j1Em>3BH^AAsrP}Y$3K~psu!pbmQ3WRw& z1dVw<=*ZzW)VsHE;iYM__qUxchsy-00fcVP#CYuLqHXrUGmCaFkq4%Hr^bBrgC5{E zBD#5JbTmr%MuIVCgxrw8vs7Lq1M8>(knRMO!4RmQFxHPLAw}6+XlTM4z#kVak9Hc@ zj|RXcOb}=djlgx(0SMhH4|&ucK;d0ah#BS8vE(h2bByJwk17eemIEU)&VJSB`Q7 z#_}l*K#1X;{%><3`TO7d2=o#7ZzJ#z8IV{m+3|1w0000EWmrjOO-%qQ0000800000 V0002eQ Date: Mon, 6 Jan 2025 20:32:05 -0500 Subject: [PATCH 4/4] Revert "I fucked up and need to move these, I'll revert them in a second" This reverts commit 4d6081dec5179a4d34fc6a262e4d6118b1194b88. --- .../Psionics/Abilities/AssayPowerSystem.cs | 116 ------------------ .../Actions/Events/AssayPowerActionEvent.cs | 29 ----- Content.Shared/Psionics/Events.cs | 27 ---- Resources/Locale/en-US/abilities/psionic.ftl | 3 - .../Locale/en-US/psionics/psionic-powers.ftl | 34 ----- Resources/Prototypes/Actions/psionics.yml | 19 --- .../Roles/Jobs/Epistemics/forensicmantis.yml | 1 - Resources/Prototypes/Psionics/psionics.yml | 27 ---- .../Roles/Jobs/Civilian/librarian.yml | 1 - .../Interface/Actions/psionics.rsi/assay.png | Bin 2351 -> 0 bytes .../Interface/Actions/psionics.rsi/meta.json | 5 +- 11 files changed, 1 insertion(+), 261 deletions(-) delete mode 100644 Content.Server/Abilities/Psionics/Abilities/AssayPowerSystem.cs delete mode 100644 Content.Shared/Actions/Events/AssayPowerActionEvent.cs delete mode 100644 Resources/Textures/Interface/Actions/psionics.rsi/assay.png diff --git a/Content.Server/Abilities/Psionics/Abilities/AssayPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/AssayPowerSystem.cs deleted file mode 100644 index 32b32c021b2..00000000000 --- a/Content.Server/Abilities/Psionics/Abilities/AssayPowerSystem.cs +++ /dev/null @@ -1,116 +0,0 @@ -using Content.Server.Chat.Managers; -using Content.Shared.Abilities.Psionics; -using Content.Shared.Actions.Events; -using Content.Shared.Chat; -using Content.Shared.DoAfter; -using Content.Shared.Popups; -using Content.Shared.Psionics.Events; -using Robust.Server.Audio; -using Robust.Shared.Audio; -using Robust.Server.Player; -using Robust.Shared.Timing; -using Robust.Shared.Player; - -namespace Content.Server.Abilities.Psionics; - -public sealed class AssayPowerSystem : EntitySystem -{ - [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; - [Dependency] private readonly AudioSystem _audioSystem = default!; - [Dependency] private readonly SharedPopupSystem _popups = default!; - [Dependency] private readonly IChatManager _chatManager = default!; - [Dependency] private readonly IPlayerManager _playerManager = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnPowerUsed); - SubscribeLocalEvent(OnDoAfter); - } - - private void OnPowerUsed(EntityUid uid, PsionicComponent psionic, AssayPowerActionEvent args) - { - if (!_psionics.OnAttemptPowerUse(args.Performer, "assay") - || psionic.DoAfter is not null) - return; - - var ev = new AssayDoAfterEvent(_gameTiming.CurTime, args.FontSize, args.FontColor); - _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, args.Performer, args.UseDelay - TimeSpan.FromSeconds(psionic.CurrentAmplification), ev, args.Performer, args.Target, args.Performer) - { - BlockDuplicate = true, - BreakOnMove = true, - BreakOnDamage = true, - }, out var doAfterId); - psionic.DoAfter = doAfterId; - - _popups.PopupEntity(Loc.GetString(args.PopupTarget, ("entity", args.Target)), args.Performer, PopupType.Medium); - - _audioSystem.PlayPvs(args.SoundUse, args.Performer, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); - _psionics.LogPowerUsed(args.Performer, args.PowerName, args.MinGlimmer, args.MaxGlimmer); - args.Handled = true; - } - - private void OnDoAfter(EntityUid uid, PsionicComponent userPsionic, AssayDoAfterEvent args) - { - if (userPsionic is null) - return; - userPsionic.DoAfter = null; - - var user = uid; - var target = args.Target; - if (target == null || args.Cancelled - || !_playerManager.TryGetSessionByEntity(user, out var session)) - return; - - if (target == user) - { - var userAmp = MathF.Round(userPsionic.CurrentAmplification, 2); - var userDamp = MathF.Round(userPsionic.CurrentDampening, 2); - var userPotentia = MathF.Round(userPsionic.Potentia, 2); - var userFeedback = $"[font size={args.FontSize}][color={args.FontColor}]{Loc.GetString("assay-body", ("entity", target), ("amplification", userAmp), ("dampening", userDamp), ("potentia", userPotentia))}[/color][/font]"; - SendDescToChat(userFeedback, session); - - var assaySelf = Loc.GetString("assay-self", ("entity", target)); - _popups.PopupEntity(assaySelf, user, user, PopupType.LargeCaution); - - var assaySelfFeedback = $"[font size={args.FontSize}][color={args.FontColor}]{assaySelf}[/color][/font]"; - SendDescToChat(assaySelfFeedback, session); - return; - } - - if (!TryComp(target, out var targetPsionic)) - { - var noPowers = Loc.GetString("no-powers", ("entity", target)); - _popups.PopupEntity(noPowers, user, user, PopupType.LargeCaution); - - var noPowersFeedback = $"[font size={args.FontSize}][color={args.FontColor}]{noPowers}[/color][/font]"; - SendDescToChat(noPowersFeedback, session); - return; - } - - var targetAmp = MathF.Round(targetPsionic.CurrentAmplification, 2); - var targetDamp = MathF.Round(targetPsionic.CurrentDampening, 2); - var targetPotentia = MathF.Round(targetPsionic.Potentia, 2); - var message = $"[font size={args.FontSize}][color={args.FontColor}]{Loc.GetString("assay-body", ("entity", target), ("amplification", targetAmp), ("dampening", targetDamp), ("potentia", targetPotentia))}[/color][/font]"; - SendDescToChat(message, session); - - foreach (var feedback in targetPsionic.AssayFeedback) - { - var feedbackMessage = $"[font size={args.FontSize}][color={args.FontColor}]{Loc.GetString(feedback, ("entity", target))}[/color][/font]"; - SendDescToChat(feedbackMessage, session); - } - } - - private void SendDescToChat(string feedbackMessage, ICommonSession session) - { - _chatManager.ChatMessageToOne( - ChatChannel.Emotes, - feedbackMessage, - feedbackMessage, - EntityUid.Invalid, - false, - session.Channel); - } -} diff --git a/Content.Shared/Actions/Events/AssayPowerActionEvent.cs b/Content.Shared/Actions/Events/AssayPowerActionEvent.cs deleted file mode 100644 index debd19615fe..00000000000 --- a/Content.Shared/Actions/Events/AssayPowerActionEvent.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Robust.Shared.Audio; - -namespace Content.Shared.Actions.Events; -public sealed partial class AssayPowerActionEvent : EntityTargetActionEvent -{ - [DataField] - public TimeSpan UseDelay = TimeSpan.FromSeconds(8f); - - [DataField] - public SoundSpecifier SoundUse = new SoundPathSpecifier("/Audio/Psionics/heartbeat_fast.ogg"); - - [DataField] - public string PopupTarget = "assay-begin"; - - [DataField] - public int FontSize = 10; - - [DataField] - public Color FontColor = Color.White; - - [DataField] - public int MinGlimmer = 3; - - [DataField] - public int MaxGlimmer = 6; - - [DataField] - public string PowerName = "assay"; -} diff --git a/Content.Shared/Psionics/Events.cs b/Content.Shared/Psionics/Events.cs index 9c59332e229..68ec3097e7d 100644 --- a/Content.Shared/Psionics/Events.cs +++ b/Content.Shared/Psionics/Events.cs @@ -1,7 +1,6 @@ using Robust.Shared.Serialization; using Content.Shared.Damage; using Content.Shared.DoAfter; -using Content.Shared.Abilities.Psionics; namespace Content.Shared.Psionics.Events; @@ -68,29 +67,3 @@ public PsionicHealOtherDoAfterEvent(TimeSpan startedAt) public override DoAfterEvent Clone() => this; } - -[Serializable, NetSerializable] -public sealed partial class AssayDoAfterEvent : DoAfterEvent -{ - [DataField(required: true)] - public TimeSpan StartedAt; - - [DataField] - public int FontSize = 10; - - [DataField] - public Color FontColor = Color.White; - - private AssayDoAfterEvent() - { - } - - public AssayDoAfterEvent(TimeSpan startedAt, int fontSize, Color fontColor) - { - StartedAt = startedAt; - FontSize = fontSize; - FontColor = fontColor; - } - - public override DoAfterEvent Clone() => this; -} diff --git a/Resources/Locale/en-US/abilities/psionic.ftl b/Resources/Locale/en-US/abilities/psionic.ftl index c8eb9635946..d0e8db72f8c 100644 --- a/Resources/Locale/en-US/abilities/psionic.ftl +++ b/Resources/Locale/en-US/abilities/psionic.ftl @@ -68,6 +68,3 @@ action-description-psychokinesis = Bend the fabric of space to instantly move ac action-name-rf-sensitivity = Toggle RF Sensitivity action-desc-rf-sensitivity = Toggle your ability to interpret radio waves on and off. - -action-name-assay = Assay -action-description-assay = Probe an entity at close range to glean metaphorical information about any powers they may have diff --git a/Resources/Locale/en-US/psionics/psionic-powers.ftl b/Resources/Locale/en-US/psionics/psionic-powers.ftl index e3e097e4339..ab2a991e06f 100644 --- a/Resources/Locale/en-US/psionics/psionic-powers.ftl +++ b/Resources/Locale/en-US/psionics/psionic-powers.ftl @@ -183,37 +183,3 @@ ghost-role-information-familiar-description = An interdimensional creature bound ghost-role-information-familiar-rules = Obey the one who summoned you. Do not act against the interests of your Master. You will die for your Master if it is necessary. -# Assay Power -assay-begin = The air around {CAPITALIZE($entity)} begins to shimmer faintly -assay-self = I AM. -no-powers = {CAPITALIZE($entity)} will never awaken from the dream in this life -assay-body = - MY WILL CAST UPON {CAPITALIZE($entity)} DIVINES THESE - Amplification: {$amplification} - Dampening: {$dampening} - Potentia: {$potentia} -assay-power-initialization-feedback = - I descend into the dreamlight once more, there I drink more fully of the cup of knowledge. The touch of the noosphere upon others becomes known to me, - I can cast my will upon them, divining the inner nature of others. -assay-power-metapsionic-feedback = {CAPITALIZE($entity)} bears a spark of the divine's judgment, they have drunk deeply of the cup of knowledge. - -# Entity Specific Feedback Messages -ifrit-feedback = A spirit of Gehenna, bound by the will of a powerful psychic -prober-feedback = A mirror into the end of time, the screaming of dead stars emanates from this machine -drain-feedback = A mirror into a realm where the stars sit still forever, a cold and distant malevolence stares back -sophic-grammateus-feedback = SEEKER, YOU NEED ONLY ASK FOR MY WISDOM. -oracle-feedback = WHY DO YOU BOTHER ME SEEKER? HAVE I NOT MADE MY DESIRES CLEAR? -orecrab-feedback = Heralds of the Lord of Earth, summoned to this realm from Grome's kingdom -reagent-slime-feedback = Heralds of the Lord of Water, summoned to this realm from Straasha's kingdom. -flesh-golem-feedback = Abominations pulled from dead realms, twisted amalgamations of those fallen to the influence of primordial Chaos -glimmer-mite-feedback = A semi-corporeal parasite native to the dreamlight, its presence here brings forth the screams of dead stars. -anomaly-pyroclastic-feedback = A small mirror to the plane of Gehenna, truth lies within the Secret of Fire -anomaly-gravity-feedback = Violet and crimson, blue of blue, impossibly dark yet greater than the whitest of white, a black star shines weakly at the end of it all -anomaly-electricity-feedback = A mirror to a realm tiled by silicon, the lifeblood of artificial thought flows from it -anomaly-flesh-feedback = From within it comes the suffering of damned mutants howling for all eternity -anomaly-bluespace-feedback = A bridge of dreamlight, crossing into the space between realms of the multiverse -anomaly-ice-feedback = Walls of blackened stone, ruin and famine wait for those who fall within -anomaly-rock-feedback = A vast old oak dwells high over a plane of stone, it turns to stare back -anomaly-flora-feedback = Musical notes drift around you, playfully beckoning, they wish to feast -anomaly-liquid-feedback = A realm of twisting currents. Its placidity is a lie. The eyes within stare hungrilly -anomaly-shadow-feedback = At the end of time, when all suns have set forever, there amidst the void stands a monument to past sins. diff --git a/Resources/Prototypes/Actions/psionics.yml b/Resources/Prototypes/Actions/psionics.yml index 97d19aae5f6..c6d9e17c2ac 100644 --- a/Resources/Prototypes/Actions/psionics.yml +++ b/Resources/Prototypes/Actions/psionics.yml @@ -367,22 +367,3 @@ followMaster: true minGlimmer: 5 maxGlimmer: 10 - -- type: entity - id: ActionAssay - name: action-name-assay - description: action-description-assay - categories: [ HideSpawnMenu ] - components: - - type: EntityTargetAction - icon: { sprite: Interface/Actions/psionics.rsi, state: assay } - useDelay: 45 - checkCanAccess: false - range: 2 - itemIconStyle: BigAction - canTargetSelf: true - blacklist: - components: - - PsionicInsulation - - Mindbroken - event: !type:AssayPowerActionEvent diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml index 961bbf05fd0..f7a31205706 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml @@ -39,7 +39,6 @@ powersToAdd: - MetapsionicPower - TelepathyPower - - AssayPower - type: startingGear id: ForensicMantisGear diff --git a/Resources/Prototypes/Psionics/psionics.yml b/Resources/Prototypes/Psionics/psionics.yml index b1e9d783a8e..548881e61f7 100644 --- a/Resources/Prototypes/Psionics/psionics.yml +++ b/Resources/Prototypes/Psionics/psionics.yml @@ -170,9 +170,6 @@ - !type:AddPsionicStatSources amplificationModifier: 0.5 dampeningModifier: 0.5 - - !type:PsionicAddAvailablePowers - powerPrototype: AssayPower - weight: 0.1 removalFunctions: - !type:RemovePsionicActions - !type:RemovePsionicPowerComponents @@ -181,8 +178,6 @@ - !type:RemovePsionicStatSources - !type:RemoveAssayFeedback assayFeedback: metapsionic-power-metapsionic-feedback - - !type:PsionicRemoveAvailablePowers - powerPrototype: AssayPower - type: psionicPower id: PsionicRegenerationPower @@ -666,25 +661,3 @@ - !type:RemovePsionicPsychognomicDescriptors psychognomicDescriptor: calling powerSlotCost: 0 - -- type: psionicPower - id: AssayPower - name: Assay - powerCategories: - - Mentalic - initializeFunctions: - - !type:AddPsionicActions - actions: - - ActionAssay - - !type:PsionicFeedbackPopup - - !type:PsionicFeedbackSelfChat - feedbackMessage: assay-power-initialization-feedback - - !type:AddPsionicAssayFeedback - assayFeedback: assay-power-metapsionic-feedback - - !type:AddPsionicStatSources - dampeningModifier: 0.5 - removalFunctions: - - !type:RemovePsionicActions - - !type:RemovePsionicStatSources - - !type:RemoveAssayFeedback - assayFeedback: assay-power-metapsionic-feedback diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml index e370d1c3af9..3468d10f278 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml @@ -37,7 +37,6 @@ powersToAdd: - XenoglossyPower - TelepathyPower - - AssayPower - type: startingGear diff --git a/Resources/Textures/Interface/Actions/psionics.rsi/assay.png b/Resources/Textures/Interface/Actions/psionics.rsi/assay.png deleted file mode 100644 index f245ca9e5e34e1e240ec8669d544d25a7c480053..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2351 zcmV+~3DEY5P)9?Ncm1Y5zzB48of z_$vGd+6uM`f}jW@me#%+k@Zd@BuJcP_I{k1bD22<_Fz`anJqrZ<%>or;CC-Ym)*`6 z+8CyfL3}aI)aS!<5&j*Yci2?D^{QU~?`t|b6G>A8Tf6X-rW-}!8R6i1QCGYz+^c0` z3E@NGaYGI$e5Lewjh_{#Yy7U*h=gXru6nxD4IFP^Eo0<_$Amq(Y)Sh)kGe@$GQSv> zIv{fhlMn&?xQSC@jVwjHQuC5obDyv3Tc98wP5wG%3~{8%h<9Anl5|ZO^grk^BUY6hGVQ4pyq-dL6nbu;W2KhW?>Z;<5ZRC?x`w@d7?u65)gMjJXf8bEHof!!9}{TD5aGuh*q*{Nr^-k z32M}h@jBm}^WFS+?wm9K+;h&g=p8t@=P~m?zW*`LBuT&Y5$GfEe@0-SZsni)@gtW- zGr+S=rpx0m)+%CY06YpxfkVn_mCKd0EI>nA2_oy|DXsV!M`-43V`k) zF>`XT_3rxHyB*(uKlO4@zhDJWH6S!4F%y>-kcHVtTTEZOF{Pr#1{a^$YyRv^p#i;RBi`%lJN#tlR})I-mtP9 zxpct(7KH=at-rO;DlW@Q7bcR)cmEEyMVl)}cWl$f*Aw=4eft;NPAZR_pveJI9w6fk z48a%|6o)Vn441|mP8`0krN6w-^8(N$eeeQL@+aUj2WY)1$^(iRxE@jD4c|WZM-y%@ z%fiY;^2n!mb;v_7p}cGHJSE`?S`P>U5JOB_o&v*4Zdfo0o|*Y6dFA@O_WSMaUlZ9A zkQQPcAx1z$Ax2Obwjr;mY9!d9Wmt|1!Cj%K%=%J!SMe*!j#WOko7INE zP>r*>0VBB0*03PmmkPo&Hn(<+<%ex7OT{5P+hiUT^wgqoFyC_9M|%J*7aF)2i$Nya zTR?dzbo}N+t?mw1zxeY_qx^vcAjxiU>A@c?V9f3sYii|kX`$=Lqi;uAh#`)u$OOW= zG3z5D>*G6O9%b<0y8Yd~HQBo7Gk#@Wz;g&}<`l@p`jlC8jb1NMdjOd{zx<|U^2x$` z-qD+kZ(0?C;U0=D&wXXa0M{&y#?qwuJ8s7W7zY5Dg_XzbH@3mOw61T&2->b(FC>@p z4BPfT4}jpjo7N;XS`7kzKKp0(n!kyO_l;z1bTs*XJRQWK3?BTeH6Q{Ajim>ymuzlr zC1W$Arp8`-3q+C*p;6lTx7TwthvlIUt`09ydjKs9%d^nsAe0mcVDKC2rXe$I#{Fx_ zcaPujS_U3)?)U}c35Sx#>QvSyb!pN#Gm8*Pm6bfKcV%)hH1|)RRn1`40D!66eK9s+ z^`}>d_kc;-`}Dkt&hD)t>-s3?=09!&#?3KBJS6>4zHrgcOMHig z#(Iy5;ndn`5_C(f@+#!hO3VWtO?&{TVkd%mTUBOxyu=!ge8&B46FxPT4o{BC0c8ba z4x!RaoU-eSjp4E~MNfyzGQ88;_W}5~E#eNSdM!^+JpdCU&Lg-MfB_BeIrP=6CRGVi z&j64sMgRfBT^8JPh#R}WS{96+^a4~~4w)OPW&}8rijS#pI?Uah38GD1iy#s-p9fSr z0FsuMOJF|BF&yx%CQs_N!EC^=H4O?$Tp~da|(B5Ea52!-<&TKm>g!FQoFJY;R)Q$|Wa3F@j1Em>3BH^AAsrP}Y$3K~psu!pbmQ3WRw& z1dVw<=*ZzW)VsHE;iYM__qUxchsy-00fcVP#CYuLqHXrUGmCaFkq4%Hr^bBrgC5{E zBD#5JbTmr%MuIVCgxrw8vs7Lq1M8>(knRMO!4RmQFxHPLAw}6+XlTM4z#kVak9Hc@ zj|RXcOb}=djlgx(0SMhH4|&ucK;d0ah#BS8vE(h2bByJwk17eemIEU)&VJSB`Q7 z#_}l*K#1X;{%><3`TO7d2=o#7ZzJ#z8IV{m+3|1w0000EWmrjOO-%qQ0000800000 V0002eQ