From 1a4d58816fc2fadc74110d74ea510b4b2576cba2 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Fri, 6 Sep 2024 10:24:17 +0300 Subject: [PATCH] Tech Anomaly (#31764) * A * B * C * D * Update TechAnomalySystem.cs * idle anim * Update meta.json * new animation --- .../Components/TechAnomalyComponent.cs | 61 +++++++++ .../Anomaly/Effects/TechAnomalySystem.cs | 125 ++++++++++++++++++ .../Markers/Spawners/Random/anomaly.yml | 1 + .../Structures/Specific/Anomaly/anomalies.yml | 60 +++++++++ .../Structures/Specific/Anomaly/cores.yml | 26 ++++ .../Effects/techanom_beam.rsi/beam.png | Bin 0 -> 2720 bytes .../Effects/techanom_beam.rsi/meta.json | 22 +++ .../Anomalies/Cores/tech_core.rsi/core.png | Bin 0 -> 271 bytes .../Anomalies/Cores/tech_core.rsi/meta.json | 25 ++++ .../Anomalies/Cores/tech_core.rsi/pulse.png | Bin 0 -> 201 bytes .../Specific/Anomalies/tech_anom.rsi/bg.png | Bin 0 -> 226 bytes .../Anomalies/tech_anom.rsi/bg_powered.png | Bin 0 -> 1290 bytes .../Anomalies/tech_anom.rsi/meta.json | 90 +++++++++++++ .../Anomalies/tech_anom.rsi/part1.png | Bin 0 -> 756 bytes .../Anomalies/tech_anom.rsi/part2.png | Bin 0 -> 700 bytes .../Anomalies/tech_anom.rsi/part3.png | Bin 0 -> 771 bytes .../Anomalies/tech_anom.rsi/part4.png | Bin 0 -> 667 bytes .../Anomalies/tech_anom.rsi/pulse.png | Bin 0 -> 2487 bytes 18 files changed, 410 insertions(+) create mode 100644 Content.Server/Anomaly/Components/TechAnomalyComponent.cs create mode 100644 Content.Server/Anomaly/Effects/TechAnomalySystem.cs create mode 100644 Resources/Textures/Effects/techanom_beam.rsi/beam.png create mode 100644 Resources/Textures/Effects/techanom_beam.rsi/meta.json create mode 100644 Resources/Textures/Structures/Specific/Anomalies/Cores/tech_core.rsi/core.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/Cores/tech_core.rsi/meta.json create mode 100644 Resources/Textures/Structures/Specific/Anomalies/Cores/tech_core.rsi/pulse.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/bg.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/bg_powered.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/meta.json create mode 100644 Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/part1.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/part2.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/part3.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/part4.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/pulse.png diff --git a/Content.Server/Anomaly/Components/TechAnomalyComponent.cs b/Content.Server/Anomaly/Components/TechAnomalyComponent.cs new file mode 100644 index 0000000000..c15fa4fcf4 --- /dev/null +++ b/Content.Server/Anomaly/Components/TechAnomalyComponent.cs @@ -0,0 +1,61 @@ +using Content.Server.Anomaly.Effects; +using Content.Shared.Destructible.Thresholds; +using Content.Shared.DeviceLinking; +using Robust.Shared.Prototypes; + +namespace Content.Server.Anomaly.Components; + +[RegisterComponent, AutoGenerateComponentPause, Access(typeof(TechAnomalySystem))] +public sealed partial class TechAnomalyComponent : Component +{ + /// + /// the distance at which random ports will bind to the anomaly. Scales with severity. + /// + [DataField] + public MinMax LinkRadius = new(5, 10); + + /// + /// the maximum number of entities with which an anomaly is associated during pulsing. Scales with severity + /// + [DataField] + public MinMax LinkCountPerPulse = new(2, 8); + + /// + /// Number of linkable pairs. when supercrit, the anomaly will link random devices in the radius to each other in pairs. + /// + [DataField] + public int LinkCountSupercritical = 30; + + /// + /// port activated by pulsation of the anomaly + /// + [DataField] + public ProtoId PulsePort = "Pulse"; + + /// + /// A port that activates every few seconds of an anomaly's lifetime + /// + [DataField] + public ProtoId TimerPort = "Timer"; + + /// + /// Chance of emag the device, when supercrit + /// + [DataField] + public float EmagSupercritProbability = 0.4f; + + /// + /// A prototype beam shot into devices when pulsed + /// + [DataField] + public EntProtoId LinkBeamProto = "AnomalyTechBeam"; + + /// + /// time until the next activation of the timer ports + /// + [DataField, AutoPausedField] + public TimeSpan NextTimer = TimeSpan.Zero; + + [DataField] + public float TimerFrequency = 3f; +} diff --git a/Content.Server/Anomaly/Effects/TechAnomalySystem.cs b/Content.Server/Anomaly/Effects/TechAnomalySystem.cs new file mode 100644 index 0000000000..63174930df --- /dev/null +++ b/Content.Server/Anomaly/Effects/TechAnomalySystem.cs @@ -0,0 +1,125 @@ +using Content.Server.Anomaly.Components; +using Content.Server.Beam; +using Content.Server.DeviceLinking.Systems; +using Content.Shared.Anomaly.Components; +using Content.Shared.DeviceLinking; +using Content.Shared.Emag.Systems; +using Robust.Shared.Random; +using Robust.Shared.Timing; + +namespace Content.Server.Anomaly.Effects; + +public sealed class TechAnomalySystem : EntitySystem +{ + [Dependency] private readonly DeviceLinkSystem _signal = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly BeamSystem _beam = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly EmagSystem _emag = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnPulse); + SubscribeLocalEvent(OnSupercritical); + SubscribeLocalEvent(OnStabilityChanged); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var tech, out var anom)) + { + if (_timing.CurTime < tech.NextTimer) + return; + + tech.NextTimer = _timing.CurTime + TimeSpan.FromSeconds(tech.TimerFrequency * anom.Stability); + + _signal.InvokePort(uid, tech.TimerPort); + } + } + + private void OnStabilityChanged(Entity tech, ref AnomalyStabilityChangedEvent args) + { + var links = MathHelper.Lerp(tech.Comp.LinkCountPerPulse.Min, tech.Comp.LinkCountPerPulse.Max, args.Severity); + CreateNewRandomLink(tech, (int)links); + } + + private void CreateNewRandomLink(Entity tech, int count) + { + if (!TryComp(tech, out var anomaly)) + return; + if (!TryComp(tech, out var sourceComp)) + return; + + var range = MathHelper.Lerp(tech.Comp.LinkRadius.Min, tech.Comp.LinkRadius.Max, anomaly.Severity); + + var devices = _lookup.GetEntitiesInRange(Transform(tech).Coordinates, range); + if (devices.Count < 1) + return; + + for (var i = 0; i < count; i++) + { + var device = _random.Pick(devices); + CreateNewLink(tech, (tech, sourceComp), device); + } + } + + private void CreateNewLink(Entity tech, Entity source, Entity target) + { + var sourcePort = _random.Pick(source.Comp.Ports); + var sinkPort = _random.Pick(target.Comp.Ports); + + _signal.SaveLinks(null, source, target,new() + { + (sourcePort, sinkPort), + }); + _beam.TryCreateBeam(source, target, tech.Comp.LinkBeamProto); + } + + private void OnSupercritical(Entity tech, ref AnomalySupercriticalEvent args) + { + // We remove the component so that the anomaly does not bind itself to other devices before self destroy. + RemComp(tech); + + var sources = + _lookup.GetEntitiesInRange(Transform(tech).Coordinates, + tech.Comp.LinkRadius.Max); + + var sinks = + _lookup.GetEntitiesInRange(Transform(tech).Coordinates, + tech.Comp.LinkRadius.Max); + + for (var i = 0; i < tech.Comp.LinkCountSupercritical; i++) + { + if (sources.Count < 1) + return; + + if (sinks.Count < 1) + return; + + var source = _random.Pick(sources); + sources.Remove(source); + + var sink = _random.Pick(sinks); + sinks.Remove(sink); + + if (_random.Prob(tech.Comp.EmagSupercritProbability)) + { + _emag.DoEmagEffect(tech, source); + _emag.DoEmagEffect(tech, sink); + } + + CreateNewLink(tech, source, sink); + } + } + + private void OnPulse(Entity tech, ref AnomalyPulseEvent args) + { + _signal.InvokePort(tech, tech.Comp.PulsePort); + } +} diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml index d4edbe9fc0..5a9360e652 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml @@ -20,6 +20,7 @@ - AnomalyLiquid - AnomalyFlora - AnomalyShadow + - AnomalyTech chance: 1 offset: 0.15 # not to put it higher. The anomaly sychnronizer looks for anomalies within this radius, and if the radius is higher, the anomaly can be attracted from a neighboring tile. diff --git a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml index a16aaaabbb..140f3c9442 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml @@ -875,3 +875,63 @@ damage: types: Cold: 10 + +- type: entity + id: AnomalyTech + parent: BaseAnomaly + suffix: Tech + components: + - type: Sprite + sprite: Structures/Specific/Anomalies/tech_anom.rsi + layers: + - state: bg + map: ["enum.AnomalyVisualLayers.Base"] + - state: bg_powered + map: ["enum.AnomalyVisualLayers.Animated"] + visible: false + shader: unshaded + - state: part1 + - state: part2 + - state: part3 + - state: part4 + - type: PointLight + radius: 6.5 + energy: 3.5 + color: "#56c1e8" + - type: Anomaly + corePrototype: AnomalyCoreTech + coreInertPrototype: AnomalyCoreTechInert + minPulseLength: 60 + maxPulseLength: 120 + - type: TechAnomaly + - type: DeviceLinkSource + ports: + - Pulse + - Timer + +- type: entity + id: AnomalyTechBeam + categories: [ HideSpawnMenu ] + components: + - type: Sprite + sprite: /Textures/Effects/techanom_beam.rsi + drawdepth: Effects + layers: + - state: beam + shader: unshaded + color: "#21c4ff" + - type: Physics + canCollide: false + - type: PointLight + enabled: true + color: "#4080FF" + radius: 3.5 + softness: 1 + autoRot: true + castShadows: false + - type: Beam + - type: TimedDespawn + lifetime: 2.3 + - type: Tag + tags: + - HideContextMenu \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml index 97f4488fd4..71065a8e3d 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml @@ -168,6 +168,19 @@ color: "#793a80" castShadows: false +- type: entity + parent: BaseAnomalyCore + id: AnomalyCoreTech + suffix: Tech + components: + - type: Sprite + sprite: Structures/Specific/Anomalies/Cores/tech_core.rsi + - type: PointLight + radius: 1.5 + energy: 2.0 + color: "#56c1e8" + castShadows: false + # Inert cores - type: entity @@ -314,3 +327,16 @@ energy: 2.0 color: "#793a80" castShadows: false + +- type: entity + parent: BaseAnomalyInertCore + id: AnomalyCoreTechInert + suffix: Tech, Inert + components: + - type: Sprite + sprite: Structures/Specific/Anomalies/Cores/tech_core.rsi + - type: PointLight + radius: 1.5 + energy: 2.0 + color: "#56c1e8" + castShadows: false diff --git a/Resources/Textures/Effects/techanom_beam.rsi/beam.png b/Resources/Textures/Effects/techanom_beam.rsi/beam.png new file mode 100644 index 0000000000000000000000000000000000000000..9240fd5d6d77f69c4330c7ee8a40e4eacd4d0874 GIT binary patch literal 2720 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/bg.png b/Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..598abdf3c8e27b9f9b7bb1dc44a6beda456ef6dc GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}b39!fLoyoQ z-Z;qFV8GM*@WsvU;vN4r&OJQ3dmfjo%a*goEdTNwru@k1HDzXC_`a;t@=A8kE7mJ) zp$~t(e1BUj+CAvUyQ_hw2enJSZYdPioZ#^G?8cXKnK(t_?V{#sPH2d{ed57Xr}ByO zDvvMjT*oALI4WQG<#&f)Y?t0M3K?|Ux_K^0n36H2ZqBoQ9jWa?7ca%XOk2l_y1 ZE`OHYwjT|xQ-SVe@O1TaS?83{1OOE8T`2$n literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/bg_powered.png b/Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/bg_powered.png new file mode 100644 index 0000000000000000000000000000000000000000..85e04a74f5e2f455517537635e1146f1a1e52921 GIT binary patch literal 1290 zcmV+l1@-!gP)Px(#7RU!RCt{2oy$rbK@^6MfnY9z7+nanaG@JVD`iFGF+``6aasB6rTM4bR8~*=L@vr1J zfBa%qLc8%N**}-t2hN8}Hqh{Je{`_3H&g2PRT(8eZ`uD~XKyA){{;t7Q(;XKa|;`z z+2ti#S=yqj&2O}_v_-SaORe*9TP1Qge$(2E>z}I=QfNEDr2T^fsI4%Lgv2OQQ7@H^`qMAhpF?i|^)*hH{NmS->OlnmvL`{%&>OnvP?z5wtkUnRKXm)_ zPDjr#baC+-bybiHDSzqd*n)r16lP(X;h?qGd$(^u8mxjJ3iKQ~>EzgY0^4Is&pXS}m>l-m|O zS_|Hk<2Buau{5G)xewH}m1h)FdHj?2fpRyN^ct&#zvReZ#Xp-w+gYHsc8CT3 z|A-xl)Nf@-V`=@6LTUflkuB*=irJX6c=p0SAK4$Ks#n5V<5zh1Z$sKYX$ot59MlWg z7|k~o7HP!sv%uQf8xlP54@Z3wEj@~PA9*A{41~~o}>gC~000000000000000EaB>b?gpmCpL35){k0x% zXg^HPEw3$S2+yhjU9XjBzs?gx$5KxupGB-_DWpS?yzw|E&Let};sam&(`HR#xaS zqAS|fKpygKpoJpz?%G>Hx=mFZ6kYyKwkg;`*l{jrg#i1y_?7w%N1o-fP- z+h`HdVUF7nTDH!#u}9+u!X}8S*%2=vx668UX%0qHkr?hfU6zAbquxdt=nXD8Ok$ z3;zFUdON^fzN#@|@|{`4TfVkNyarFjB>S5U8V(a#DG(0wRe@x@=d1GW@0yU;ZY?)H z{6R8(4Ldxvo$t)MKTsqzFc3fh5aCP!005Aazc902>n2p*egFUf07*qoM6N<$g54>7 A%m4rY literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/meta.json b/Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/meta.json new file mode 100644 index 0000000000..26360487fd --- /dev/null +++ b/Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/meta.json @@ -0,0 +1,90 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Created by Jaraten (github) for ss14", + "size": { + "x": 48, + "y": 48 + }, + "states": [ + { + "name": "bg" + }, + { + "name": "bg_powered", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "part1", + "delays": [ + [ + 1.8, + 0.2, + 0.8, + 0.4, + 0.2, + 0.3 + ] + ] + }, + { + "name": "part2", + "delays": [ + [ + 1.1, + 0.1, + 0.8, + 0.5, + 0.2, + 0.1 + ] + ] + }, + { + "name": "part3", + "delays": [ + [ + 1.5, + 0.5, + 0.5, + 0.1, + 0.5, + 0.1 + ] + ] + }, + { + "name": "part4", + "delays": [ + [ + 1.8, + 0.1, + 0.9, + 0.4, + 1.0, + 0.4 + ] + ] + }, + { + "name": "pulse", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/part1.png b/Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/part1.png new file mode 100644 index 0000000000000000000000000000000000000000..48a3e66b62c47a7c3d5d192edd277c033ec7bf87 GIT binary patch literal 756 zcmeAS@N?(olHy`uVBq!ia0vp^6M#5@gAGW2y7GG=kYX$ja(7}_cTVOd0|V1KPZ!6K ziaBrZZtS}4AaLws;R)dtI}e>L+^hd!HEU*xf8vJU58PgT;$U3LsW{;jo4u=6^J^BN z$JcgnEh#Eq;;~qye3wO=cTd^Y&C37l*IHKoJ-a4v;z4C5pglk^XXBFjp|`R(Jcyhv zzMNy1)06vI%#l;~&%69XJ!@^_8nMI~&#s>R+8PtbyJh+#m5_gHO(r~5db2J2t*Qn0 z%zAC!l&u_xP0TB=+lU#}zvsO&RVhN$s-Ev6e_LkUUZ403{lhZrd9So80rfxmyj}j* z=?oX;|6%VOu5}ssd|p*ix_U29zSFb!Ya4fkv1D)gWdGYZ;L`bw8umD;6Ip_j>cV90 zwKx9Ya5Aoc&bBG41?betA3e%$Z}sWEbY2oE4W>MY^u5~EU4+KB{=b9g^JSmqn)ulKdnsz&K3z~eNDfSyZO|mU9Kgc-)}9v zxa9wGj`H8W+V2~ePqc>wB?js6M&j!d?T~-z|FzftKcx0!f0)#XS1XpU;{XQS;jlG* zRaPmb!Y$|SS2G{|b9mPBO?x<)on0aKP767eEXCL0dJ_9bxE2|!W*Bww|RH+ z(~9L0T@ReB>)$VK(CL?2wg1=(d9}JfACBEg=a{>HWr5SiJ)D>xR@l#2yz_9<$|$B@ Okff)ppUXO@geCyyQdI*0 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/part2.png b/Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/part2.png new file mode 100644 index 0000000000000000000000000000000000000000..be72368587f2015cea1cab49ae02674ba71fe6aa GIT binary patch literal 700 zcmeAS@N?(olHy`uVBq!ia0vp^6M#5@gAGW2y7GG=kYX$ja(7}_cTVOd0|Qf;r;B4q z#hkZy4YPw2C60bv+|gXJvU`E|iKryU=MCL|MH*9tmh3ROaPa*Ey`#2`bzHG6=R|Y9 zO>kY1Sdbjs+H ze`Tv>TfOLYX+@*|TWlv}|Jd4bYQFCmuDFuzI|cPTv?mn*P+y*&wbgp*^pEk2KJn`Z z@IEx>EiYe_*Ye^|aC~Ck!|Q5F_1_%+C+ygLIQ-lFOWaSS{vDlvXl>c?Pd3-))=zxz zu26|HqwT_xIK8n7p$s6sT(D zZe35H%$2P25(}w$^H2A`kLOC+VX zf9?Iewcg5ZLqv6O$iIb-IXQW{aeMDgSE;r6r*l&OPw&~attxlxKipXM#ar@cyST?E zp8af3_#q*PK^EM${KFb^cG2hO@lpSqKE>-Vb$F*d|BmZ3`8b8|6aC*k?LTM#R`i+0 zr;~gC_y+!5{;n}bza{zS`XtMorDE%z_D_pacs|kJwBv;RQU}wXnj*dWlz*;mYb|0s zq)y%6^6t+~=Cudb{*mkwIZ^r~Sohk@`i;O~Ql1}kT7GK%FX4{L=+w2=|375fn)cQt z-Mg8(lKJ@^H@mALb((7bKQI~QuU_-w&tc~RIm;t^HouN+op^TV9}F)j-0(luKI4pC RbMr-zoTsaw%Q~loCIB9uOX&ar literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/part3.png b/Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/part3.png new file mode 100644 index 0000000000000000000000000000000000000000..184d0ea8d4588def26e28246a6f13fe0e17037ee GIT binary patch literal 771 zcmeAS@N?(olHy`uVBq!ia0vp^6M#5@gAGW2y7GG=kYX$ja(7}_cTVOd0|V1uPZ!6K ziaBrZZp@ZSlsNuz{?ZbS$Vp2t=sc2IlaO}s=s(dWzs3u`iq8KV_*!?AXp{tf*#AQ5 z&YA^BLt~-}GN)Zwc)D~$`g*6#6MKK%S$zNeG@kr>zwZ{We?Rx394F8+G|-@~zFhp{ z%}V8M^Nw#k<^0co6W@hA)6li0cSHl_4)Gtf`tNj&@!UD-!rfP=sPrycsgf!5)u?}W zHb~diuf1*;uN^-D0>(!^L z+_gL2u8Lcovo4MQ*4kx21T@s`V#wRD;PC6_*DhBXy#8Y>9*|@cooN&O_v`NT^YLv` zb?R#l^PklEufRHG4##>MvHDr5{|<&JtluNPe`^Bk6g$C_v5p%<_)Km79oG84K>LEq zE73{2rTqDp{?Prz|4;ClVa3V(kNLOD{~hE$al3hk$@-)7x4r*UzNz!yzptB5D}9Rj zlll8heR_G~-g4dP>W8yG=6{~`|KNuo@}Stn1>D~UMA=1FebIi$r&{y6F1ml}^gqUX zl`m%h=={CAa-qEh(3dMdmkESt&%JT^;}gaIKKe;Z?oV55^JMFUS{C>7oFMqex`7kNh;H%l9uUFc3l>VFf&Ed=KO;g+dG;i5+hcE7z?7zD< zM?P3jU*i-PHaBizVr=Z7P}z>!as3!j^NPp)NIw=gH_f2rMZw*j)ykqo3P=;l9=YuH@cCE2Yv!#| zx3u}?yh}Y_UOwJ^YkQGy;Lmom0QFx3pr*l8GV3GW}d~fGF-P>1t`RndZXmik-Uq7|~@3>z702P7M|`F-u>*RhLiCo*`^gBv3&yP(muDQe)cH*x!iO@ z_J`MV+7-0^Phl&v+4b*ODTmT${`>`xx4TbUm|ra0wD3v(>i_@6(E<*c%XY5xYH(&~ zea4-w9B-_DE7x9i?5~Y3oqEcCYvY}+2m4-SM!Wob$onLY<$I|A#h=S<8t-&J*zqbe zHsxQY`;274wk@wTwf=u#lL``4+28AY@n`r?iT7bG3pHojb3gyrSeqWsoxfnA$U&ej zCI435XWpqdce2gCq8(l?|5mz7{NDDe>jcoInC=I^uG|ruSRci_Q!G*A_qLeN>G#7@ fpYTJRx?tD+w1~#Ee}8>1fCM~U{an^LB{Ts5nY%U> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/pulse.png b/Resources/Textures/Structures/Specific/Anomalies/tech_anom.rsi/pulse.png new file mode 100644 index 0000000000000000000000000000000000000000..9524b7e344b011e782b247df8f7b59306011d36f GIT binary patch literal 2487 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