From 8a59ead61e791ea5d93e7c528f59875f5d270303 Mon Sep 17 00:00:00 2001 From: Velken <8467292+Velken@users.noreply.github.com> Date: Fri, 16 Jan 2026 19:08:52 -0300 Subject: [PATCH] Admin Anomaly Scanner (#42443) * admin anom scanner * improvement * green * sprite --- .../Anomaly/AnomalyScannerSystem.cs | 18 ++--- Content.Server/Anomaly/AnomalySystem.cs | 67 ++++++++++++++---- .../Components/AnomalyScannerComponent.cs | 6 ++ Resources/Locale/en-US/anomaly/anomaly.ftl | 3 +- .../Objects/Specific/Research/anomaly.yml | 12 ++++ .../adminanomalyscanner.rsi/decaying.png | Bin 0 -> 603 bytes .../adminanomalyscanner.rsi/growing.png | Bin 0 -> 211 bytes .../Research/adminanomalyscanner.rsi/icon.png | Bin 0 -> 582 bytes .../adminanomalyscanner.rsi/inhand-left.png | Bin 0 -> 638 bytes .../adminanomalyscanner.rsi/inhand-right.png | Bin 0 -> 659 bytes .../adminanomalyscanner.rsi/meta.json | 61 ++++++++++++++++ .../adminanomalyscanner.rsi/severity_mask.png | Bin 0 -> 195 bytes .../adminanomalyscanner.rsi/supercritical.png | Bin 0 -> 501 bytes .../adminanomalyscanner.rsi/timer_1.png | Bin 0 -> 149 bytes .../adminanomalyscanner.rsi/timer_2.png | Bin 0 -> 157 bytes .../adminanomalyscanner.rsi/timer_3.png | Bin 0 -> 158 bytes .../adminanomalyscanner.rsi/timer_4.png | Bin 0 -> 158 bytes .../adminanomalyscanner.rsi/timer_5.png | Bin 0 -> 160 bytes 18 files changed, 143 insertions(+), 24 deletions(-) create mode 100644 Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/decaying.png create mode 100644 Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/growing.png create mode 100644 Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/icon.png create mode 100644 Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/severity_mask.png create mode 100644 Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/supercritical.png create mode 100644 Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/timer_1.png create mode 100644 Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/timer_2.png create mode 100644 Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/timer_3.png create mode 100644 Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/timer_4.png create mode 100644 Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/timer_5.png diff --git a/Content.Server/Anomaly/AnomalyScannerSystem.cs b/Content.Server/Anomaly/AnomalyScannerSystem.cs index ba657cf056..b8bc3b6036 100644 --- a/Content.Server/Anomaly/AnomalyScannerSystem.cs +++ b/Content.Server/Anomaly/AnomalyScannerSystem.cs @@ -41,12 +41,12 @@ public sealed class AnomalyScannerSystem : SharedAnomalyScannerSystem Appearance.SetData(scanner, AnomalyScannerVisuals.HasAnomaly, true, appearanceComp); - var stability = _secretData.IsSecret(anomaly, AnomalySecretData.Stability, secretDataComp) + var stability = _secretData.IsSecret(anomaly, AnomalySecretData.Stability, secretDataComp) && !scannerComp.IgnoreSecret ? AnomalyStabilityVisuals.Stable : _anomaly.GetStabilityVisualOrStable((anomaly, anomalyComp)); Appearance.SetData(scanner, AnomalyScannerVisuals.AnomalyStability, stability, appearanceComp); - var severity = _secretData.IsSecret(anomaly, AnomalySecretData.Severity, secretDataComp) + var severity = _secretData.IsSecret(anomaly, AnomalySecretData.Severity, secretDataComp) && !scannerComp.IgnoreSecret ? 0 : anomalyComp.Severity; Appearance.SetData(scanner, AnomalyScannerVisuals.AnomalySeverity, severity, appearanceComp); @@ -109,13 +109,14 @@ public sealed class AnomalyScannerSystem : SharedAnomalyScannerSystem private void OnScannerAnomalySeverityChanged(ref AnomalySeverityChangedEvent args) { - var severity = _secretData.IsSecret(args.Anomaly, AnomalySecretData.Severity) ? 0 : args.Severity; var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var component)) { if (component.ScannedAnomaly != args.Anomaly) continue; + var severity = _secretData.IsSecret(args.Anomaly, AnomalySecretData.Severity) && !component.IgnoreSecret ? 0 : args.Severity; + UpdateScannerUi(uid, component); Appearance.SetData(uid, AnomalyScannerVisuals.AnomalySeverity, severity); } @@ -123,15 +124,16 @@ public sealed class AnomalyScannerSystem : SharedAnomalyScannerSystem private void OnScannerAnomalyStabilityChanged(ref AnomalyStabilityChangedEvent args) { - var stability = _secretData.IsSecret(args.Anomaly, AnomalySecretData.Stability) - ? AnomalyStabilityVisuals.Stable - : _anomaly.GetStabilityVisualOrStable(args.Anomaly); var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var component)) { if (component.ScannedAnomaly != args.Anomaly) continue; + var stability = _secretData.IsSecret(args.Anomaly, AnomalySecretData.Stability) && !component.IgnoreSecret + ? AnomalyStabilityVisuals.Stable + : _anomaly.GetStabilityVisualOrStable(args.Anomaly); + UpdateScannerUi(uid, component); Appearance.SetData(uid, AnomalyScannerVisuals.AnomalyStability, stability); } @@ -154,12 +156,12 @@ public sealed class AnomalyScannerSystem : SharedAnomalyScannerSystem TryComp(uid, out var appearanceComp); TryComp(args.Anomaly, out var secretDataComp); - var severity = _secretData.IsSecret(args.Anomaly, AnomalySecretData.Severity, secretDataComp) + var severity = _secretData.IsSecret(args.Anomaly, AnomalySecretData.Severity, secretDataComp) && !component.IgnoreSecret ? 0 : anomalyComp.Severity; Appearance.SetData(uid, AnomalyScannerVisuals.AnomalySeverity, severity, appearanceComp); - var stability = _secretData.IsSecret(args.Anomaly, AnomalySecretData.Stability, secretDataComp) + var stability = _secretData.IsSecret(args.Anomaly, AnomalySecretData.Stability, secretDataComp) && !component.IgnoreSecret ? AnomalyStabilityVisuals.Stable : _anomaly.GetStabilityVisualOrStable((args.Anomaly, anomalyComp)); Appearance.SetData(uid, AnomalyScannerVisuals.AnomalyStability, stability, appearanceComp); diff --git a/Content.Server/Anomaly/AnomalySystem.cs b/Content.Server/Anomaly/AnomalySystem.cs index 102391baff..4955b4e336 100644 --- a/Content.Server/Anomaly/AnomalySystem.cs +++ b/Content.Server/Anomaly/AnomalySystem.cs @@ -236,14 +236,19 @@ public sealed partial class AnomalySystem : SharedAnomalySystem TryComp(anomaly, out var secret); //Severity - if (secret != null && secret.Secret.Contains(AnomalySecretData.Severity)) + if (secret != null && secret.Secret.Contains(AnomalySecretData.Severity) && !component.IgnoreSecret) msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-severity-percentage-unknown")); else - msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-severity-percentage", ("percent", anomalyComp.Severity.ToString("P")))); + { + var text = Loc.GetString("anomaly-scanner-severity-percentage", ("percent", anomalyComp.Severity.ToString("P"))); + if (secret != null && secret.Secret.Contains(AnomalySecretData.Severity)) + text += " " + Loc.GetString("anomaly-secret-admin"); + msg.AddMarkupOrThrow(text); + } msg.PushNewline(); //Stability - if (secret != null && secret.Secret.Contains(AnomalySecretData.Stability)) + if (secret != null && secret.Secret.Contains(AnomalySecretData.Stability) && !component.IgnoreSecret) msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-stability-unknown")); else { @@ -254,15 +259,24 @@ public sealed partial class AnomalySystem : SharedAnomalySystem stateLoc = Loc.GetString("anomaly-scanner-stability-high"); else stateLoc = Loc.GetString("anomaly-scanner-stability-medium"); + + if (secret != null && secret.Secret.Contains(AnomalySecretData.Stability)) + stateLoc += " " + Loc.GetString("anomaly-secret-admin"); + msg.AddMarkupOrThrow(stateLoc); } msg.PushNewline(); //Point output - if (secret != null && secret.Secret.Contains(AnomalySecretData.OutputPoint)) + if (secret != null && secret.Secret.Contains(AnomalySecretData.OutputPoint) && !component.IgnoreSecret) msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-point-output-unknown")); else - msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-point-output", ("point", GetAnomalyPointValue(anomaly, anomalyComp)))); + { + var text = Loc.GetString("anomaly-scanner-point-output", ("point", GetAnomalyPointValue(anomaly, anomalyComp))); + if (secret != null && secret.Secret.Contains(AnomalySecretData.OutputPoint)) + text += " " + Loc.GetString("anomaly-secret-admin"); + msg.AddMarkupOrThrow(text); + } msg.PushNewline(); msg.PushNewline(); @@ -271,40 +285,63 @@ public sealed partial class AnomalySystem : SharedAnomalySystem msg.PushNewline(); //Danger - if (secret != null && secret.Secret.Contains(AnomalySecretData.ParticleDanger)) + if (secret != null && secret.Secret.Contains(AnomalySecretData.ParticleDanger) && !component.IgnoreSecret) msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-danger-unknown")); else - msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-danger", ("type", GetParticleLocale(anomalyComp.SeverityParticleType)))); + { + var text = Loc.GetString("anomaly-scanner-particle-danger", ("type", GetParticleLocale(anomalyComp.SeverityParticleType))); + if (secret != null && secret.Secret.Contains(AnomalySecretData.ParticleDanger)) + text += " " + Loc.GetString("anomaly-secret-admin"); + msg.AddMarkupOrThrow(text); + } msg.PushNewline(); //Unstable - if (secret != null && secret.Secret.Contains(AnomalySecretData.ParticleUnstable)) + if (secret != null && secret.Secret.Contains(AnomalySecretData.ParticleUnstable) && !component.IgnoreSecret) msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-unstable-unknown")); else - msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-unstable", ("type", GetParticleLocale(anomalyComp.DestabilizingParticleType)))); + { + var text = Loc.GetString("anomaly-scanner-particle-unstable", ("type", GetParticleLocale(anomalyComp.DestabilizingParticleType))); + if (secret != null && secret.Secret.Contains(AnomalySecretData.ParticleUnstable)) + text += " " + Loc.GetString("anomaly-secret-admin"); + msg.AddMarkupOrThrow(text); + } msg.PushNewline(); //Containment - if (secret != null && secret.Secret.Contains(AnomalySecretData.ParticleContainment)) + if (secret != null && secret.Secret.Contains(AnomalySecretData.ParticleContainment) && !component.IgnoreSecret) msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-containment-unknown")); else - msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-containment", ("type", GetParticleLocale(anomalyComp.WeakeningParticleType)))); + { + var text = Loc.GetString("anomaly-scanner-particle-containment", ("type", GetParticleLocale(anomalyComp.WeakeningParticleType))); + if (secret != null && secret.Secret.Contains(AnomalySecretData.ParticleContainment)) + text += " " + Loc.GetString("anomaly-secret-admin"); + msg.AddMarkupOrThrow(text); + } msg.PushNewline(); //Transformation - if (secret != null && secret.Secret.Contains(AnomalySecretData.ParticleTransformation)) + if (secret != null && secret.Secret.Contains(AnomalySecretData.ParticleTransformation) && !component.IgnoreSecret) msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-transformation-unknown")); else - msg.AddMarkupOrThrow(Loc.GetString("anomaly-scanner-particle-transformation", ("type", GetParticleLocale(anomalyComp.TransformationParticleType)))); + { + var text = Loc.GetString("anomaly-scanner-particle-transformation", ("type", GetParticleLocale(anomalyComp.TransformationParticleType))); + if (secret != null && secret.Secret.Contains(AnomalySecretData.ParticleTransformation)) + text += " " + Loc.GetString("anomaly-secret-admin"); + msg.AddMarkupOrThrow(text); + } //Behavior msg.PushNewline(); msg.PushNewline(); - msg.AddMarkupOrThrow(Loc.GetString("anomaly-behavior-title")); + var behaviorTitle = Loc.GetString("anomaly-behavior-title"); + if (secret != null && secret.Secret.Contains(AnomalySecretData.Behavior) && component.IgnoreSecret) + behaviorTitle += " " + Loc.GetString("anomaly-secret-admin"); + msg.AddMarkupOrThrow(behaviorTitle); msg.PushNewline(); - if (secret != null && secret.Secret.Contains(AnomalySecretData.Behavior)) + if (secret != null && secret.Secret.Contains(AnomalySecretData.Behavior) && !component.IgnoreSecret) msg.AddMarkupOrThrow(Loc.GetString("anomaly-behavior-unknown")); else { diff --git a/Content.Shared/Anomaly/Components/AnomalyScannerComponent.cs b/Content.Shared/Anomaly/Components/AnomalyScannerComponent.cs index c49743f630..842445b704 100644 --- a/Content.Shared/Anomaly/Components/AnomalyScannerComponent.cs +++ b/Content.Shared/Anomaly/Components/AnomalyScannerComponent.cs @@ -29,4 +29,10 @@ public sealed partial class AnomalyScannerComponent : Component /// [DataField] public SoundSpecifier? CompleteSound = new SoundPathSpecifier("/Audio/Items/beep.ogg"); + + /// + /// Whether to ignore the secret data on the anomaly. + /// + [DataField] + public bool IgnoreSecret; } diff --git a/Resources/Locale/en-US/anomaly/anomaly.ftl b/Resources/Locale/en-US/anomaly/anomaly.ftl index 77608da435..cb6841ca4b 100644 --- a/Resources/Locale/en-US/anomaly/anomaly.ftl +++ b/Resources/Locale/en-US/anomaly/anomaly.ftl @@ -79,7 +79,7 @@ anomaly-generator-flavor-right = v1.1 anomaly-behavior-unknown = [color=red]ERROR. Cannot be read.[/color] -anomaly-behavior-title = behavior deviation analysis: +anomaly-behavior-title = Behavior Deviation Analysis: anomaly-behavior-point = [color=gold]Anomaly produces {$mod}% of the points[/color] anomaly-behavior-safe = [color=forestgreen]The anomaly is extremely stable. Extremely rare pulsations.[/color] @@ -97,3 +97,4 @@ anomaly-behavior-inconstancy = [color=crimson]Impermanence has been detected. Pa anomaly-behavior-fast = [color=crimson]The pulsation frequency is strongly increased.[/color] anomaly-behavior-strenght = [color=crimson]The pulsation power is significantly increased.[/color] anomaly-behavior-moving = [color=crimson]Coordinate instability was detected.[/color] +anomaly-secret-admin = [color=red](ERROR)[/color] diff --git a/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml b/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml index b2eae73ddf..b9fccd35f0 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml @@ -69,6 +69,18 @@ - type: Item storedRotation: -90 +- type: entity + parent: AnomalyScanner + id: AnomalyScannerAdmin + name: admin anomaly scanner + description: A hand-held scanner built to collect information on various anomalous objects. This one seems to have a few extra features. + suffix: Admin + components: + - type: AnomalyScanner + ignoreSecret: true + - type: Sprite + sprite: Objects/Specific/Research/adminanomalyscanner.rsi + - type: entity id: AnomalyLocatorUnpowered parent: BaseItem diff --git a/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/decaying.png b/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/decaying.png new file mode 100644 index 0000000000000000000000000000000000000000..7335e13cb0c0d2c733a99bcd21689d574011c3de GIT binary patch literal 603 zcmV-h0;K(kP)4Tx04R}tkv&MmKpe$izoibb$c+6t{Ym|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jf7n~Gbq{ROvg%&X$9QWhhy~o`4L6R%#8_xhH>NsHm=FxlVH!Nh~3SGz3U!po$ty#A#JYF_5ACgo}U3_NU1uk*f+u zjs?`AK(zhffAG6oqck%%087&Oc}KlZwa~*o3a}c)cU= p@46Nw>K%a@^ZA#|vtrY0YC{Alv`|002ovPDHLkV1f(j5KaI9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/growing.png b/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/growing.png new file mode 100644 index 0000000000000000000000000000000000000000..3c9eeba747a681da8e605d26e8c1cfd22e93cc3a GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|dOcknLn`LH zy=BPPY{0`BaQXJvIR(4*Vy$*_YupsjoV4_rEoUd|&&i72^(;W;2X@-b`?~XK$>+`7 z6HFD2@@-m6)>YNL zW)o>WvEmK;m%9!15oh^CRg`Y^?Mt%1f0-Ys#;t}i)j0Oz5#2CGkQPr@KbLh*2~7Yw Ck57;Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/icon.png b/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4f2e97776fe69e1b7db632c0b4d93648634ebae6 GIT binary patch literal 582 zcmV-M0=fN(P)Px%07*naR9J=Wl(B0QaTLctmsBNO?M;PRXvyHx&~QRa>tX^*N(KWFEG3&11t*7s z&_BST;N)fzf|J3a7|@{#3e6X{C4I5LCMb?U|Llz!)T%FP3JtVs;*WH1qF!Z zk^_BP8qE&)z24t+-aBuxsY3lQ+Efi(M zIlnAE_02(01+E;*@a`wg+mmGXrpPS%57G%hR=)zL15gwN!!TU7)zycmO1`%C{6wF? zA@qWhAEcQ{R092K+bPT!TS75~0KU}Tb9eC$05gdS&t@;uF{_k%c?yv-F?kMv;=y?T zMg<%3$Ij=#*uHz(o}&;cQ|jgEm{mGvRpej90rrMW{@hQ{9UFGpYuhOb zk+K7^eEBy3rC#3UBdWj_L>p~SduHPi07WMImg~X^g#iwC_9Zs$q2Ld22Te{w4W#x%bPyqFsimo>UXNjOqcvKVdxaS%b(XZWIp&X$?g*w0b2fAXa U0?UDZ*Z=?k07*qoM6N<$f`Ew$3;+NC literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/inhand-left.png b/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..0fd106f67fce69d9f505de4f12649a366aba7cf3 GIT binary patch literal 638 zcmV-^0)hRBP)Px%I7vi7RCt{2+OcaBVHgJRC#eW04N^2%y7V7NxI#;_*a#kXgu+c3t{{ZtrVhdF zD0G&Bbn8?^f(V5a9E3s%4V~L1@AtkB zA6ec5h=_=Yh=_=Yh$3@6U;XbMt|~26$n|`s&*%UEty)x?ofiv3v-3);7840qB!F=E zdioGs^@ei#1z>st5>1CeI{kt~tCz$MARPWy`4tW-Z_!)WglQS)4Y#`SJDi??lP$rt zjQF+w;D$tzdioFtnKo*tQy71p~PacevM0!+(5Z(&oS)k{PIczkye z_g|iWHuv_i{iPu?JOI3?t)~De6UzWzOO%x7dcNAKHvS9hshqAWCtJd5^XcIGACu!4`_zjRxM%?SjE;@YF1$?pmk@Hgu8xBs6?J`f zu_6Zm%*|RbEd$RVtply@V0g5;kyi4e0R%?@md@r;JDq};X=9_a3)3<%H){=^86M^; zhJSZ*(g6UhnJXB3_c8MD03h-b!?5A^g_h3d5gY}PhyL3cNz@h*UiBoGrCh`k5m9_U Y0b1?e@FeQ@aR2}S07*qoM6N<$f)?o@zyJUM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/inhand-right.png b/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..cdac73f3982c906f78644a9e7968c057056f0c24 GIT binary patch literal 659 zcmV;E0&M+>P)Px%O-V#SRCt{2+OcaIQ5*;G?`bJqQA%i~Axr)Nk0&(5C9zOZByf|%1qwlKa*%Ek z$Xo)&ty3sPLLuPLPJ#r*DIFT89A@ek0@4OcC=s2~*CFu;g{Wtq^k}}H@$TL8{eJiE zJoxZURA8b>BTFC-)u z=V0~Y*sJWzN}%QYBv}18aDC$@89#aloSehz$B{}W(OccYmyNG@l>OxEB&5Sri%3{7dptJQEy_mT+)~-3arg{Vh)wYI{a|91hv7Ook z0Gyq5-SgAd=5JoN^!zILcikH7a0lg!1+4#GhI8ahGxe?R+(eMGi&De{oFhkhQ^IiW tN}%Niue|X=g;^F&hwl>>W{HSMy+1PQ+PQN)gb4ru002ovPDHLkV1k6DHHH8H literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/meta.json b/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/meta.json new file mode 100644 index 0000000000..66fa65a74f --- /dev/null +++ b/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/meta.json @@ -0,0 +1,61 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Modified from anomalyscanner.rsi (at commit d0352e734d97f3762f2e9082ea61bd2f83101874) by Samuka-C (github)", + "states": [ + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "growing", + "delays": [ + [ 0.2, 0.2, 0.2 ] + ] + }, + { + "name": "decaying", + "delays": [ + [ 0.2, 0.2, 0.2 ] + ] + }, + { + "name": "severity_mask", + "delays": [ + [ 0.25, 0.25, 0.25, 0.25 ] + ] + }, + { + "name": "timer_1" + }, + { + "name": "timer_2" + }, + { + "name": "timer_3" + }, + { + "name": "timer_4" + }, + { + "name": "timer_5" + }, + { + "name": "supercritical", + "delays": [ + [ 0.125, 0.125, 0.125, 0.125 ] + ] + } + ] +} diff --git a/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/severity_mask.png b/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/severity_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..4d0ae9a3aec38d0a62c97ed155ecb337ec712c93 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|YCT;XLn`LH zz2(T&pdi3{;myDDZBrE*C8mX)sh*t`ST9s!yg3(Sf=T9sxi%kfpZ@$^x^)h7+TRZz z->yV`I{I2aOColqm4fNK@SMi5vYqd_>Ooe4bO=1GZdU%xxc=L-{S##C>=wM+|Gny~ l@syj*?wbzJXJlXyxWf3SMuU-0rHBut-qY33Wt~$(697t|NM!&3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/supercritical.png b/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/supercritical.png new file mode 100644 index 0000000000000000000000000000000000000000..fedb3ba03b76fc8d8390d1b34979462ece53725a GIT binary patch literal 501 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv=}#LT=BJwMkF1yemk zJ@f8s-z|Y^wxvdRrg?g5F>nAmtPE0&tPG4mmKP99L)jqLXfQH^#hHL?Lq;YB0U#X( z#F_0ZVDT&<8w3)77^ELYqgl$p%)l^#oq+|Y!obMbfN=rDRFDqV1rU>_0NEhG1T=>U ztTM>b0?2~uGBhv%$*Q`~>s@TJ^(c_J#M8wwq$2L^O-H^a0}+;hlDB{TU&&<$ZBV$> zRdeyl-Y4v7rb{(fmw~kL{!09H`f;tId*rLCQ<<~oeEzJvGH21W?_0{hFXNS%v+k$r z?B^ctW&Ou>-j-E9`S(fu#-gZs#U01q{RZg<0{I_}yLWCqXJme}#&({U+Owb1eNl&R zt(z{K`ewx%MYp$yyJePsd+5x!IV{R=%ErZ;fbsWW>bl*GOI7z8pR@XF3o^sg)z4*} HQ$iB}?%j)l literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/timer_1.png b/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/timer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..47b483bf5dc49cd1cc0e7997d8383bd29bec0151 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}{+=$5ArY;~ z2@=gy+DhBVS%rdYCg9J$O;BeS3j3^P6oFc4t9D9e?c^ip-}f=i4dlj;m4z9<^pm~bZH+fV!Lj~phctc;!F!m#n2Y8_{V zd(P>5qK37SQ(1O?oAZ|E#Me#+i*?05p3V2`9VVGv;oWpzYD!J#%AY_x7(8A5T-G@y GGywn>Z#gpn literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/timer_4.png b/Resources/Textures/Objects/Specific/Research/adminanomalyscanner.rsi/timer_4.png new file mode 100644 index 0000000000000000000000000000000000000000..e3c79e9ab29bff7b630d91efcd92d9c3f71e0937 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}5uPrNArY;~ z2@!HOgf$#RBe1N)FpG!WmVgpNFJWxOBx#| zIk6v*VPsyvziz>_=nl3I8WIyszRrWex_+%!mIUo#(Al#3H;?in~Z-<1{CB zktYTQJ~NmS_y7CVXr-sfc%Zp{!KDKl5ObJTF)=(+luF2IxETSog~8L+&t;ucLK6VX C0Wrz| literal 0 HcmV?d00001 -- 2.52.0