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^ctzvReZ#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|fKpygK`3Mda>poJpz?%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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
B(v|=K
literal 0
HcmV?d00001
--
2.51.2