From eaa7c0dd36e4647196e94ed24847cdfe11500c70 Mon Sep 17 00:00:00 2001 From: Kara Date: Thu, 17 Nov 2022 11:40:05 -0600 Subject: [PATCH] Item artifacts (#12652) --- .../RandomArtifactSpriteSystem.cs | 46 +++++ .../XenoArtifacts/RandomArtifactVisualizer.cs | 30 --- .../XenoArtifacts/ArtifactSystem.Commands.cs | 51 +++++ .../XenoArtifacts/ArtifactSystem.Nodes.cs | 37 ++-- .../XenoArtifacts/ArtifactSystem.cs | 4 +- .../Effects/Systems/SpawnArtifactSystem.cs | 2 +- .../ArtifactLandTriggerComponent.cs | 9 + .../ArtifactMicrowaveTriggerComponent.cs | 9 + .../Triggers/Systems/ArtifactLandSystem.cs | 21 +++ .../Systems/ArtifactMicrowaveTriggerSystem.cs | 20 ++ .../XenoArtifacts/ArtifactEffectPrototype.cs | 10 +- .../XenoArtifacts/ArtifactTriggerPrototype.cs | 10 +- .../RandomArtifactSpriteComponent.cs | 2 +- .../en-US/xenoarchaeology/artifact-hints.ftl | 7 +- .../Markers/Spawners/Random/artifacts.yml | 5 + .../Xenoarchaeology/item_artifacts.yml | 59 ++++++ ...{artifacts.yml => structure_artifacts.yml} | 6 +- .../normal_effects.yml} | 95 +++++----- .../XenoArch/Effects/utility_effects.yml | 163 ++++++++++++++++ .../Prototypes/XenoArch/artifact_triggers.yml | 30 ++- .../item_artifacts.rsi/ano01.png | Bin 0 -> 303 bytes .../item_artifacts.rsi/ano01_on.png | Bin 0 -> 817 bytes .../item_artifacts.rsi/ano02.png | Bin 0 -> 399 bytes .../item_artifacts.rsi/ano02_on.png | Bin 0 -> 774 bytes .../item_artifacts.rsi/ano03.png | Bin 0 -> 494 bytes .../item_artifacts.rsi/ano03_on.png | Bin 0 -> 720 bytes .../item_artifacts.rsi/ano04.png | Bin 0 -> 523 bytes .../item_artifacts.rsi/ano04_on.png | Bin 0 -> 863 bytes .../item_artifacts.rsi/ano05.png | Bin 0 -> 372 bytes .../item_artifacts.rsi/ano05_on.png | Bin 0 -> 889 bytes .../item_artifacts.rsi/ano06.png | Bin 0 -> 446 bytes .../item_artifacts.rsi/ano06_on.png | Bin 0 -> 1021 bytes .../item_artifacts.rsi/ano07.png | Bin 0 -> 500 bytes .../item_artifacts.rsi/ano07_on.png | Bin 0 -> 749 bytes .../item_artifacts.rsi/ano08.png | Bin 0 -> 386 bytes .../item_artifacts.rsi/ano08_on.png | Bin 0 -> 547 bytes .../item_artifacts.rsi/ano09.png | Bin 0 -> 359 bytes .../item_artifacts.rsi/ano09_on.png | Bin 0 -> 619 bytes .../item_artifacts.rsi/ano10.png | Bin 0 -> 359 bytes .../item_artifacts.rsi/ano10_on.png | Bin 0 -> 676 bytes .../item_artifacts.rsi/ano11.png | Bin 0 -> 739 bytes .../item_artifacts.rsi/ano11_on.png | Bin 0 -> 1378 bytes .../item_artifacts.rsi/meta.json | 178 ++++++++++++++++++ 43 files changed, 690 insertions(+), 104 deletions(-) create mode 100644 Content.Client/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteSystem.cs delete mode 100644 Content.Client/Xenoarchaeology/XenoArtifacts/RandomArtifactVisualizer.cs create mode 100644 Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Commands.cs create mode 100644 Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactLandTriggerComponent.cs create mode 100644 Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactMicrowaveTriggerComponent.cs create mode 100644 Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactLandSystem.cs create mode 100644 Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMicrowaveTriggerSystem.cs rename {Content.Server => Content.Shared}/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteComponent.cs (84%) create mode 100644 Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_artifacts.yml rename Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/{artifacts.yml => structure_artifacts.yml} (93%) rename Resources/Prototypes/XenoArch/{artifact_effects.yml => Effects/normal_effects.yml} (78%) create mode 100644 Resources/Prototypes/XenoArch/Effects/utility_effects.yml create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano01.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano01_on.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano02.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano02_on.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano03.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano03_on.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano04.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano04_on.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano05.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano05_on.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano06.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano06_on.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano07.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano07_on.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano08.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano08_on.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano09.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano09_on.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano10.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano10_on.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano11.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano11_on.png create mode 100644 Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/meta.json diff --git a/Content.Client/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteSystem.cs b/Content.Client/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteSystem.cs new file mode 100644 index 0000000000..0345c0cdce --- /dev/null +++ b/Content.Client/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteSystem.cs @@ -0,0 +1,46 @@ +using Content.Shared.Xenoarchaeology.XenoArtifacts; +using Robust.Client.GameObjects; + +namespace Content.Client.Xenoarchaeology.XenoArtifacts; + +public sealed class RandomArtifactSpriteSystem : VisualizerSystem +{ + protected override void OnAppearanceChange(EntityUid uid, RandomArtifactSpriteComponent component, ref AppearanceChangeEvent args) + { + if (args.Sprite == null) + return; + + if (!AppearanceSystem.TryGetData(uid, SharedArtifactsVisuals.SpriteIndex, out var ind, args.Component) + || ind is not int spriteIndex) + return; + + if (!AppearanceSystem.TryGetData(uid, SharedArtifactsVisuals.IsActivated, out var act, args.Component) + || act is not bool isActivated) + isActivated = false; + + var spriteIndexStr = spriteIndex.ToString("D2"); + var spritePrefix = isActivated ? "_on" : ""; + + // layered artifact sprite + if (args.Sprite.LayerMapTryGet(ArtifactsVisualLayers.Effect, out var layer)) + { + var spriteState = "ano" + spriteIndexStr; + args.Sprite.LayerSetState(ArtifactsVisualLayers.Base, spriteState); + args.Sprite.LayerSetState(layer, spriteState + "_on"); + args.Sprite.LayerSetVisible(layer, isActivated); + } + // non-layered + else + { + var spriteState = "ano" + spriteIndexStr + spritePrefix; + args.Sprite.LayerSetState(ArtifactsVisualLayers.Base, spriteState); + } + + } +} + +public enum ArtifactsVisualLayers : byte +{ + Base, + Effect // doesn't have to use this +} diff --git a/Content.Client/Xenoarchaeology/XenoArtifacts/RandomArtifactVisualizer.cs b/Content.Client/Xenoarchaeology/XenoArtifacts/RandomArtifactVisualizer.cs deleted file mode 100644 index 3f7b3448ae..0000000000 --- a/Content.Client/Xenoarchaeology/XenoArtifacts/RandomArtifactVisualizer.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Content.Shared.Xenoarchaeology.XenoArtifacts; -using Robust.Client.GameObjects; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; - -namespace Content.Client.Xenoarchaeology.XenoArtifacts; - -public sealed class RandomArtifactVisualizer : AppearanceVisualizer -{ - [Obsolete("Subscribe to AppearanceChangeEvent instead.")] - public override void OnChangeData(AppearanceComponent component) - { - base.OnChangeData(component); - - var entities = IoCManager.Resolve(); - if (!entities.TryGetComponent(component.Owner, out ISpriteComponent? sprite)) return; - - if (!component.TryGetData(SharedArtifactsVisuals.SpriteIndex, out int spriteIndex)) - return; - - if (!component.TryGetData(SharedArtifactsVisuals.IsActivated, out bool isActivated)) - isActivated = false; - - var spriteIndexStr = spriteIndex.ToString("D2"); - var spritePrefix = isActivated ? "_on" : ""; - - var spriteState = "ano" + spriteIndexStr + spritePrefix; - sprite.LayerSetState(0, spriteState); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Commands.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Commands.cs new file mode 100644 index 0000000000..1cdd6b6c93 --- /dev/null +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Commands.cs @@ -0,0 +1,51 @@ +using System.Linq; +using Content.Server.Administration; +using Content.Shared.Administration; +using Content.Shared.Xenoarchaeology.XenoArtifacts; +using Robust.Shared.Console; +using Robust.Shared.Utility; + +namespace Content.Server.Xenoarchaeology.XenoArtifacts; + +public partial class ArtifactSystem +{ + [Dependency] private readonly IConsoleHost _conHost = default!; + + public void InitializeCommands() + { + _conHost.RegisterCommand("forceartifactnode", "Forces an artifact to traverse to a given node", "forceartifacteffect ", + ForceArtifactNode, + ForceArtifactNodeCompletions); + } + + [AdminCommand(AdminFlags.Fun)] + private void ForceArtifactNode(IConsoleShell shell, string argstr, string[] args) + { + if (args.Length != 2) + shell.WriteError("Argument length must be 2"); + + if (!EntityUid.TryParse(args[0], out var uid) || ! int.TryParse(args[1], out var id)) + return; + + if (!TryComp(uid, out var artifact) || artifact.NodeTree == null) + return; + + if (artifact.NodeTree.AllNodes.FirstOrDefault(n => n.Id == id) is { } node) + { + EnterNode(uid, ref node); + } + } + + private CompletionResult ForceArtifactNodeCompletions(IConsoleShell shell, string[] args) + { + if (args.Length == 2 && EntityUid.TryParse(args[0], out var uid)) + { + if (TryComp(uid, out var artifact) && artifact.NodeTree != null) + { + return CompletionResult.FromHintOptions(artifact.NodeTree.AllNodes.Select(s => s.Id.ToString()), ""); + } + } + + return CompletionResult.Empty; + } +} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs index d616637dcf..0125fc6fa5 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs @@ -1,5 +1,6 @@ using System.Linq; using Content.Server.Xenoarchaeology.XenoArtifacts.Events; +using Content.Shared.Item; using Content.Shared.Xenoarchaeology.XenoArtifacts; using Robust.Shared.Prototypes; using Robust.Shared.Random; @@ -20,7 +21,7 @@ public sealed partial class ArtifactSystem /// /// The tree being generated. /// The amount of nodes it has. - private void GenerateArtifactNodeTree(ref ArtifactTree tree, int nodeAmount) + private void GenerateArtifactNodeTree(EntityUid artifact, ref ArtifactTree tree, int nodeAmount) { if (nodeAmount < 1) { @@ -33,14 +34,14 @@ public sealed partial class ArtifactSystem while (uninitializedNodes.Any()) { - GenerateNode(ref uninitializedNodes, ref tree, nodeAmount); + GenerateNode(artifact, ref uninitializedNodes, ref tree, nodeAmount); } } /// /// Generate an individual node on the tree. /// - private void GenerateNode(ref List uninitializedNodes, ref ArtifactTree tree, int targetNodeAmount) + private void GenerateNode(EntityUid artifact, ref List uninitializedNodes, ref ArtifactTree tree, int targetNodeAmount) { if (!uninitializedNodes.Any()) return; @@ -69,8 +70,8 @@ public sealed partial class ArtifactSystem uninitializedNodes.Add(neighbor); } - node.Trigger = GetRandomTrigger(ref node); - node.Effect = GetRandomEffect(ref node); + node.Trigger = GetRandomTrigger(artifact, ref node); + node.Effect = GetRandomEffect(artifact, ref node); tree.AllNodes.Add(node); } @@ -78,28 +79,31 @@ public sealed partial class ArtifactSystem //yeah these two functions are near duplicates but i don't //want to implement an interface or abstract parent - private ArtifactTriggerPrototype GetRandomTrigger(ref ArtifactNode node) + private ArtifactTriggerPrototype GetRandomTrigger(EntityUid artifact, ref ArtifactNode node) { var allTriggers = _prototype.EnumeratePrototypes().ToList(); var validDepth = allTriggers.Select(x => x.TargetDepth).Distinct().ToList(); var weights = GetDepthWeights(validDepth, node.Depth); var selectedRandomTargetDepth = GetRandomTargetDepth(weights); - var targetTriggers = allTriggers.Where(x => - x.TargetDepth == selectedRandomTargetDepth).ToList(); + var targetTriggers = allTriggers + .Where(x => x.TargetDepth == selectedRandomTargetDepth) + .Where(x => (x.Whitelist?.IsValid(artifact, EntityManager) ?? true) && (!x.Blacklist?.IsValid(artifact, EntityManager) ?? true)).ToList(); + return _random.Pick(targetTriggers); } - private ArtifactEffectPrototype GetRandomEffect(ref ArtifactNode node) + private ArtifactEffectPrototype GetRandomEffect(EntityUid artifact, ref ArtifactNode node) { var allEffects = _prototype.EnumeratePrototypes().ToList(); var validDepth = allEffects.Select(x => x.TargetDepth).Distinct().ToList(); var weights = GetDepthWeights(validDepth, node.Depth); var selectedRandomTargetDepth = GetRandomTargetDepth(weights); - var targetEffects = allEffects.Where(x => - x.TargetDepth == selectedRandomTargetDepth).ToList(); + var targetEffects = allEffects + .Where(x => x.TargetDepth == selectedRandomTargetDepth) + .Where(x => (x.Whitelist?.IsValid(artifact, EntityManager) ?? true) && (!x.Blacklist?.IsValid(artifact, EntityManager) ?? true)).ToList(); return _random.Pick(targetEffects); } @@ -164,11 +168,22 @@ public sealed partial class ArtifactSystem foreach (var (name, entry) in allComponents) { var reg = _componentFactory.GetRegistration(name); + + if (EntityManager.HasComponent(uid, reg.Type)) + { + // Don't re-add permanent components + if (node.Effect.PermanentComponents.ContainsKey(name)) + continue; + + EntityManager.RemoveComponent(uid, reg.Type); + } + var comp = (Component) _componentFactory.GetComponent(reg); comp.Owner = uid; var temp = (object) comp; _serialization.Copy(entry.Component, ref temp); + EntityManager.AddComponent(uid, (Component) temp!, true); } diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs index 60955a5381..7b535e5b30 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs @@ -22,6 +22,8 @@ public sealed partial class ArtifactSystem : EntitySystem SubscribeLocalEvent(OnInit); SubscribeLocalEvent(GetPrice); + + InitializeCommands(); } private void OnInit(EntityUid uid, ArtifactComponent component, MapInitEvent args) @@ -105,7 +107,7 @@ public sealed partial class ArtifactSystem : EntitySystem component.NodeTree = new ArtifactTree(); - GenerateArtifactNodeTree(ref component.NodeTree, nodeAmount); + GenerateArtifactNodeTree(component.Owner, ref component.NodeTree, nodeAmount); EnterNode(component.Owner, ref component.NodeTree.StartNode, component); } diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/SpawnArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/SpawnArtifactSystem.cs index b2cc629cac..f8e5f16a77 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/SpawnArtifactSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/SpawnArtifactSystem.cs @@ -44,7 +44,7 @@ public sealed class SpawnArtifactSystem : EntitySystem toSpawn = _random.Pick(component.PossiblePrototypes); // select spawn position near artifact - var artifactCord = Transform(uid).Coordinates; + var artifactCord = Transform(uid).MapPosition; var dx = _random.NextFloat(-component.Range, component.Range); var dy = _random.NextFloat(-component.Range, component.Range); var spawnCord = artifactCord.Offset(new Vector2(dx, dy)); diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactLandTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactLandTriggerComponent.cs new file mode 100644 index 0000000000..700b162635 --- /dev/null +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactLandTriggerComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; + +/// +/// Triggers when the artifact lands after being thrown. +/// +[RegisterComponent] +public sealed class ArtifactLandTriggerComponent : Component +{ +} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactMicrowaveTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactMicrowaveTriggerComponent.cs new file mode 100644 index 0000000000..038c7f4a1b --- /dev/null +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactMicrowaveTriggerComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; + +/// +/// Triggers when an item artifact is microwaved. +/// +[RegisterComponent] +public sealed class ArtifactMicrowaveTriggerComponent : Component +{ +} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactLandSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactLandSystem.cs new file mode 100644 index 0000000000..1183250ac9 --- /dev/null +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactLandSystem.cs @@ -0,0 +1,21 @@ +using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; +using Content.Shared.Throwing; + +namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; + +public sealed class ArtifactLandSystem : EntitySystem +{ + [Dependency] private readonly ArtifactSystem _artifact = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnLand); + } + + private void OnLand(EntityUid uid, ArtifactLandTriggerComponent component, LandEvent args) + { + _artifact.TryActivateArtifact(uid, args.User); + } +} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMicrowaveTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMicrowaveTriggerSystem.cs new file mode 100644 index 0000000000..ca61c8f8ab --- /dev/null +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMicrowaveTriggerSystem.cs @@ -0,0 +1,20 @@ +using Content.Server.Kitchen.Components; +using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; + +namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; + +public sealed class ArtifactMicrowaveTriggerSystem : EntitySystem +{ + [Dependency] private readonly ArtifactSystem _artifact = default!; + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnMicrowaved); + } + + private void OnMicrowaved(EntityUid uid, ArtifactMicrowaveTriggerComponent component, BeingMicrowavedEvent args) + { + _artifact.TryActivateArtifact(uid); + } +} diff --git a/Content.Shared/Xenoarchaeology/XenoArtifacts/ArtifactEffectPrototype.cs b/Content.Shared/Xenoarchaeology/XenoArtifacts/ArtifactEffectPrototype.cs index 2b42cff916..0fa62fdee0 100644 --- a/Content.Shared/Xenoarchaeology/XenoArtifacts/ArtifactEffectPrototype.cs +++ b/Content.Shared/Xenoarchaeology/XenoArtifacts/ArtifactEffectPrototype.cs @@ -1,4 +1,6 @@ -using Robust.Shared.Prototypes; +using Content.Shared.Item; +using Content.Shared.Whitelist; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Xenoarchaeology.XenoArtifacts; @@ -33,4 +35,10 @@ public sealed class ArtifactEffectPrototype : IPrototype [DataField("effectHint")] public string? EffectHint; + + [DataField("whitelist")] + public EntityWhitelist? Whitelist; + + [DataField("blacklist")] + public EntityWhitelist? Blacklist; } diff --git a/Content.Shared/Xenoarchaeology/XenoArtifacts/ArtifactTriggerPrototype.cs b/Content.Shared/Xenoarchaeology/XenoArtifacts/ArtifactTriggerPrototype.cs index c00fde2abb..ff34f6fafe 100644 --- a/Content.Shared/Xenoarchaeology/XenoArtifacts/ArtifactTriggerPrototype.cs +++ b/Content.Shared/Xenoarchaeology/XenoArtifacts/ArtifactTriggerPrototype.cs @@ -1,4 +1,6 @@ -using Robust.Shared.Prototypes; +using Content.Shared.Item; +using Content.Shared.Whitelist; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Xenoarchaeology.XenoArtifacts; @@ -22,4 +24,10 @@ public sealed class ArtifactTriggerPrototype : IPrototype [DataField("triggerHint")] public string? TriggerHint; + + [DataField("whitelist")] + public EntityWhitelist? Whitelist; + + [DataField("blacklist")] + public EntityWhitelist? Blacklist; } diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteComponent.cs b/Content.Shared/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteComponent.cs similarity index 84% rename from Content.Server/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteComponent.cs rename to Content.Shared/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteComponent.cs index 3091cf8dd2..545c6f4b85 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteComponent.cs +++ b/Content.Shared/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts; +namespace Content.Shared.Xenoarchaeology.XenoArtifacts; [RegisterComponent] public sealed class RandomArtifactSpriteComponent : Component diff --git a/Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl b/Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl index a8e5d7bf27..6ec6b7a6f6 100644 --- a/Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl +++ b/Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl @@ -10,6 +10,10 @@ artifact-effect-hint-consumption = Energy consumption artifact-effect-hint-release = Energy release artifact-effect-hint-biochemical = Biochemical disruption artifact-effect-hint-destruction = Station-wide destruction +artifact-effect-hint-gun = Small entity accelerator +artifact-effect-hint-multitool = Utility conglomerate +artifact-effect-hint-storage = Internal chamber +artifact-effect-hint-drill = Serrated rotator # the triggers should be more obvious than the effects # gives people an idea of what to do: don't be too specific (i.e. no "welders") @@ -24,4 +28,5 @@ artifact-trigger-hint-magnet = Magnetic waves artifact-trigger-hint-death = Life essence artifact-trigger-hint-radiation = Radiation artifact-trigger-hint-pressure = Extreme pressure -artifact-trigger-hint-gas = Gas \ No newline at end of file +artifact-trigger-hint-gas = Gas +artifact-trigger-hint-land = Active deceleration diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/artifacts.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/artifacts.yml index 38b5288eaf..853dd8bc32 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/artifacts.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/artifacts.yml @@ -13,8 +13,13 @@ - MediumXenoArtifact - MediumXenoArtifact - MediumXenoArtifact + - MediumXenoArtifact - ComplexXenoArtifact - ComplexXenoArtifact + - ComplexXenoArtifact + - SimpleXenoArtifactItem + - MediumXenoArtifactItem + - ComplexXenoArtifactItem chance: 1 - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_artifacts.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_artifacts.yml new file mode 100644 index 0000000000..3205a154db --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_artifacts.yml @@ -0,0 +1,59 @@ +- type: entity + parent: BaseItem + id: BaseXenoArtifactItem + name: alien artifact + description: A strange handheld alien device. + abstract: true + components: + - type: Sprite + sprite: Objects/Specific/Xenoarchaeology/item_artifacts.rsi + netsync: false + layers: + - state: ano01 + map: [ "enum.ArtifactsVisualLayers.Base" ] + - state: ano01_on + map: [ "enum.ArtifactsVisualLayers.Effect" ] + visible: false + - type: Damageable + - type: Physics + bodyType: Dynamic + - type: InteractionOutline + - type: Artifact + - type: RandomArtifactSprite + maxSprite: 11 + activationTime: 2.4 + - type: RandomSprite + available: + - enum.ArtifactsVisualLayers.Effect: + ano01_on: Rainbow + - type: Appearance + - type: StaticPrice + price: 500 + +- type: entity + parent: BaseXenoArtifactItem + id: SimpleXenoArtifactItem + suffix: Simple + components: + - type: Artifact + nodesMin: 2 + nodesMax: 5 + +- type: entity + parent: BaseXenoArtifactItem + id: MediumXenoArtifactItem + suffix: Medium + components: + - type: Artifact + nodesMin: 5 + nodesMax: 9 + +- type: entity + parent: BaseXenoArtifactItem + id: ComplexXenoArtifactItem + suffix: Complex + components: + - type: Artifact + nodesMin: 9 + nodesMax: 13 + diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifacts.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml similarity index 93% rename from Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifacts.yml rename to Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml index 93a523fd4f..ff33084649 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifacts.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml @@ -9,6 +9,9 @@ drawdepth: SmallObjects sprite: Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi netsync: false + layers: + - state: ano01 + map: [ "enum.ArtifactsVisualLayers.Base" ] state: ano01 noRot: true - type: Damageable @@ -31,9 +34,6 @@ - type: Artifact - type: RandomArtifactSprite - type: Appearance - visuals: - - type: RandomArtifactVisualizer - - type: StaticPrice price: 500 diff --git a/Resources/Prototypes/XenoArch/artifact_effects.yml b/Resources/Prototypes/XenoArch/Effects/normal_effects.yml similarity index 78% rename from Resources/Prototypes/XenoArch/artifact_effects.yml rename to Resources/Prototypes/XenoArch/Effects/normal_effects.yml index 6378bd3790..eb2d43f489 100644 --- a/Resources/Prototypes/XenoArch/artifact_effects.yml +++ b/Resources/Prototypes/XenoArch/Effects/normal_effects.yml @@ -1,32 +1,32 @@ -- type: artifactEffect +- type: artifactEffect id: EffectBadFeeling targetDepth: 0 effectHint: artifact-effect-hint-mental components: - type: TelepathicArtifact messages: - - badfeeling-artifact-1 - - badfeeling-artifact-2 - - badfeeling-artifact-3 - - badfeeling-artifact-4 - - badfeeling-artifact-5 - - badfeeling-artifact-6 - - badfeeling-artifact-7 - - badfeeling-artifact-8 - - badfeeling-artifact-9 - - badfeeling-artifact-10 - - badfeeling-artifact-11 - - badfeeling-artifact-12 - - badfeeling-artifact-13 - - badfeeling-artifact-14 - - badfeeling-artifact-15 + - badfeeling-artifact-1 + - badfeeling-artifact-2 + - badfeeling-artifact-3 + - badfeeling-artifact-4 + - badfeeling-artifact-5 + - badfeeling-artifact-6 + - badfeeling-artifact-7 + - badfeeling-artifact-8 + - badfeeling-artifact-9 + - badfeeling-artifact-10 + - badfeeling-artifact-11 + - badfeeling-artifact-12 + - badfeeling-artifact-13 + - badfeeling-artifact-14 + - badfeeling-artifact-15 drastic: - - badfeeling-artifact-drastic-1 - - badfeeling-artifact-drastic-2 - - badfeeling-artifact-drastic-3 - - badfeeling-artifact-drastic-4 - - badfeeling-artifact-drastic-5 - - badfeeling-artifact-drastic-6 + - badfeeling-artifact-drastic-1 + - badfeeling-artifact-drastic-2 + - badfeeling-artifact-drastic-3 + - badfeeling-artifact-drastic-4 + - badfeeling-artifact-drastic-5 + - badfeeling-artifact-drastic-6 - type: artifactEffect id: EffectGoodFeeling @@ -35,27 +35,27 @@ components: - type: TelepathicArtifact messages: - - goodfeeling-artifact-1 - - goodfeeling-artifact-2 - - goodfeeling-artifact-3 - - goodfeeling-artifact-4 - - goodfeeling-artifact-5 - - goodfeeling-artifact-6 - - goodfeeling-artifact-7 - - goodfeeling-artifact-8 - - goodfeeling-artifact-9 - - goodfeeling-artifact-10 - - goodfeeling-artifact-11 - - goodfeeling-artifact-12 - - goodfeeling-artifact-13 - - goodfeeling-artifact-14 + - goodfeeling-artifact-1 + - goodfeeling-artifact-2 + - goodfeeling-artifact-3 + - goodfeeling-artifact-4 + - goodfeeling-artifact-5 + - goodfeeling-artifact-6 + - goodfeeling-artifact-7 + - goodfeeling-artifact-8 + - goodfeeling-artifact-9 + - goodfeeling-artifact-10 + - goodfeeling-artifact-11 + - goodfeeling-artifact-12 + - goodfeeling-artifact-13 + - goodfeeling-artifact-14 drastic: - - goodfeeling-artifact-drastic-1 - - goodfeeling-artifact-drastic-2 - - goodfeeling-artifact-drastic-3 - - goodfeeling-artifact-drastic-4 - - goodfeeling-artifact-drastic-5 - - goodfeeling-artifact-drastic-6 + - goodfeeling-artifact-drastic-1 + - goodfeeling-artifact-drastic-2 + - goodfeeling-artifact-drastic-3 + - goodfeeling-artifact-drastic-4 + - goodfeeling-artifact-drastic-5 + - goodfeeling-artifact-drastic-6 - type: artifactEffect id: EffectJunkSpawn @@ -241,7 +241,6 @@ - UltraHighPowerMicroLaserStockPart - SuperMatterBinStockPart - - type: artifactEffect id: EffectDisease targetDepth: 3 @@ -271,14 +270,6 @@ - GoldOre1 - UraniumOre1 -- type: artifactEffect - id: EffectPowerGen20K - targetDepth: 3 - effectHint: artifact-effect-hint-release - components: - - type: PowerSupplier - supplyRate: 20000 - - type: artifactEffect id: EffectHeat targetDepth: 3 @@ -316,4 +307,4 @@ - type: SpawnArtifact maxSpawns: 1 possiblePrototypes: - - Singularity \ No newline at end of file + - Singularity diff --git a/Resources/Prototypes/XenoArch/Effects/utility_effects.yml b/Resources/Prototypes/XenoArch/Effects/utility_effects.yml new file mode 100644 index 0000000000..ef16f571c3 --- /dev/null +++ b/Resources/Prototypes/XenoArch/Effects/utility_effects.yml @@ -0,0 +1,163 @@ +# Utility effects permanently modify the entity in some way when triggered, and they generally make it 'useful' for some purpose, +# like turning the artifact into a tool, or gun, or whatever. + +- type: artifactEffect + id: EffectStorage + targetDepth: 2 + effectHint: artifact-effect-hint-storage + whitelist: + components: + - Item # it doesnt necessarily have to be restricted from structures, but i think it'll be better that way + permanentComponents: + - type: UserInterface + interfaces: + - key: enum.StorageUiKey.Key + type: StorageBoundUserInterface + - type: ContainerContainer + containers: + storagebase: !type:Container + ents: [ ] + - type: Storage + capacity: 50 + +- type: artifactEffect + id: EffectSolutionStorage + targetDepth: 2 + effectHint: artifact-effect-hint-storage + whitelist: + components: + - Item + permanentComponents: + - type: UserInterface + interfaces: + - key: enum.TransferAmountUiKey.Key + type: TransferAmountBoundUserInterface + - type: SolutionContainerManager + solutions: + beaker: + maxVol: 150 + - type: FitsInDispenser + solution: beaker + - type: RefillableSolution + solution: beaker + - type: DrainableSolution + solution: beaker + - type: ExaminableSolution + solution: beaker + - type: DrawableSolution + solution: beaker + - type: InjectableSolution + solution: beaker + - type: SolutionTransfer + canChangeTransferAmount: true + - type: Drink + isOpen: true + solution: beaker + +- type: artifactEffect + id: EffectDrill + targetDepth: 3 + effectHint: artifact-effect-hint-drill + permanentComponents: + - type: GatheringTool + damage: + types: + Structural: 125 + gatheringTime: 0.50 + MaxGatheringEntities: 3 + - type: ItemCooldown + - type: MeleeWeapon + damage: + types: + Piercing: 18 + Blunt: 4 + soundHit: + path: /Audio/Weapons/bladeslice.ogg + - type: Sharp + + +- type: artifactEffect + id: EffectPowerGen20K + targetDepth: 3 + effectHint: artifact-effect-hint-release + blacklist: + components: + - Item + permanentComponents: + - type: PowerSupplier + supplyRate: 20000 + +- type: artifactEffect + id: EffectBigIron + targetDepth: 3 + effectHint: artifact-effect-hint-gun + whitelist: + components: + - Item + permanentComponents: + - type: ContainerContainer + containers: + revolver-ammo: !type:Container + - type: RevolverAmmoProvider + whitelist: + tags: + - CartridgeMagnumHC + - SpeedLoaderMagnumHC + proto: CartridgeMagnumHC + capacity: 7 + chambers: [ True, True, True, True, True, True, True ] + ammoSlots: [ null, null, null, null, null, null, null ] + soundEject: + path: /Audio/Weapons/Guns/MagOut/revolver_magout.ogg + soundInsert: + path: /Audio/Weapons/Guns/MagIn/revolver_magin.ogg + - type: Gun + selectedMode: SemiAuto + fireRate: 2 + availableModes: + - SemiAuto + - FullAuto # no alien revolver in buildings + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/revolver.ogg + +- type: artifactEffect + id: EffectMultitool + targetDepth: 3 + effectHint: artifact-effect-hint-multitool + whitelist: + components: + - Item + permanentComponents: + - type: TilePrying + - type: SignalLinker + - type: Tool + qualities: + - Screwing + speed: 2 # Very powerful multitool to balance out the desire to sell or scrap for points + useSound: /Audio/Items/drill_use.ogg + - type: MultipleTool + statusShowBehavior: true + entries: + - behavior: Screwing + useSound: + path: /Audio/Items/drill_use.ogg + changeSound: + path: /Audio/Items/change_drill.ogg + - behavior: Prying + useSound: + path: /Audio/Items/jaws_pry.ogg + changeSound: + path: /Audio/Items/change_drill.ogg + - behavior: Anchoring + useSound: + path: /Audio/Items/ratchet.ogg + changeSound: + path: /Audio/Items/change_drill.ogg + - behavior: Cutting + useSound: + path: /Audio/Items/jaws_cut.ogg + changeSound: + path: /Audio/Items/change_drill.ogg + - behavior: Pulsing + changeSound: + path: /Audio/Items/change_drill.ogg diff --git a/Resources/Prototypes/XenoArch/artifact_triggers.yml b/Resources/Prototypes/XenoArch/artifact_triggers.yml index 81bab760e0..3f79e479cd 100644 --- a/Resources/Prototypes/XenoArch/artifact_triggers.yml +++ b/Resources/Prototypes/XenoArch/artifact_triggers.yml @@ -21,6 +21,9 @@ id: TriggerAnchor targetDepth: 0 triggerHint: artifact-trigger-hint-tool + blacklist: + components: + - Item components: - type: ArtifactAnchorTrigger @@ -28,6 +31,9 @@ id: TriggerElectricity targetDepth: 0 triggerHint: artifact-trigger-hint-electricity + blacklist: + components: + - Item components: - type: ArtifactElectricityTrigger - type: PowerConsumer @@ -61,10 +67,20 @@ - type: ArtifactDamageTrigger damageTypes: - Blunt - - Slash + - Slash - Piercing damageThreshold: 50 +- type: artifactTrigger + id: TriggerItemLanded + targetDepth: 1 + triggerHint: artifact-trigger-hint-land + whitelist: + components: + - Item + components: + - type: ArtifactLandTrigger + - type: artifactTrigger id: TriggerHeat targetDepth: 1 @@ -98,6 +114,16 @@ components: - type: ArtifactMagnetTrigger +- type: artifactTrigger + id: TriggerMicrowave + targetDepth: 2 + triggerHint: artifact-trigger-hint-radiation + whitelist: + components: + - Item + components: + - type: ArtifactMicrowaveTrigger + - type: artifactTrigger id: TriggerLowPressure targetDepth: 2 @@ -141,4 +167,4 @@ - type: ArtifactGasTrigger #don't add in new targetdepth values until you have a few -#or else it will skew heavily towards a few options. \ No newline at end of file +#or else it will skew heavily towards a few options. diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano01.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano01.png new file mode 100644 index 0000000000000000000000000000000000000000..3b628460451cbe78495c8550271792e4c217f1a8 GIT binary patch literal 303 zcmV+~0nq-5P)t-h8Y#}t?XQ{aCDthGDc%Q+uc@BJz&pp@D}2xYCcZhrQ*0KkngWep-R z#v+3EA_7o$%pA+z8;`z(G+QqF#{}yBLtsnjzK8(rGr)V=F(iN^2OzG@DW&!5d`RG| zv{;GyjDrsgK$+>>(@M0!hXkPfw8sE%1>O=s_~+BQY}?i}W{(M+!AG<17LbCo0`<5_ zz*zxlI4j_sJ7Dm~lYp}V--spwiOjnMBx4Fpfj3^coj9*VL0bR-002ovPDHLkV1gFO BeN+Gd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano01_on.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano01_on.png new file mode 100644 index 0000000000000000000000000000000000000000..7db0ddebc196840f9040b8465b31e4ff6e76e0e2 GIT binary patch literal 817 zcmeAS@N?(olHy`uVBq!ia0vp^4nUm1!3HGP9xZtRq&N#aB8wRq_>O=u<5X=vX$A(S z$DS^ZAr*7p&I#;WY{1i2zhtk-`Y#ci`-|6px|O^!Wy*#)Z4;Hko?YM6d##qvD*SYt zPsI99Q(+8)#BtUJ80ErpW82%E`}cgCUpi}<=&3i~_DAQIa|@{Lm#*8899?m@-(SLK z#-F@r=9~Ar{pJ^$(9s|+eSt0Z+M(auJva&^mQ23>p>B)wTlE|JFQ&k&VE*&( zg+&|HE^O%k*1d54geaEtHv1PCsYsvn``5+n;@>=T!+b-DXSH(QT-i-H5BOV`JaYV+ zQL&EmsMqg1o4xaRzPu@Lo6PY3U!ly63mcYCKCipYG&#es@d@kN);y83nhuK`vKKD? zCSLUIWs$>HhCip?d(HDawEj=k;`LDtf!xupwSfo!-d5;&%yhs)j{z6u@kh99df8>I zp0r~hgH?mp@}}i^uisd-r0%!{hkVZQQx}$6A4|HLc!>M^qI>cM6Kv#XnqF$W|bkE7Mv2yoOCGu{rNYW zAGQWR`}@i&bvlE}pXV<+duz-}KIwd|t73FIcYU3;Q1^q2a~yd4zt#Bc6{vMrcJscw z$-7~#WRdHnRnIv(I17Rn%KGKAMlG>g6DfFV!S395uNbnvy)P@eHDTe_>OWJBMYdn9 zOSE~fW|8*YV(Ej24_`YTJbd)+??t{rHbU=o=DBt8W!$y-dp@(>r=~M;f6tshH zqF=M9c312E*OscWng{ByD-=Jxx^?dV$NP9Zx&IY1d7#Ewa$JM`9;-$Zt78v=S%87T M)78&qol`;+01F|1-v9sr literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano02.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano02.png new file mode 100644 index 0000000000000000000000000000000000000000..2f380fa4813ae9bc803476f6f9db33ef37f48c36 GIT binary patch literal 399 zcmV;A0dW3_P)mjX`?MA?5ahy`sTASMu=_F)*3 zzLo(JMG3H1uG?jRY6S<_KtCRpj0h!?EjK>KOS(G)BqYV8@f)Dr2DJn^pP`gK+f^9w zG<343Y0BO0I8UXL&Qa3?wtEM#(cYbth|57>{Dhch$zJ&qdI+ODFd=&LZquG(8w4W+ tMSg{N4j_t}57a|VP%vx;H+``0kJ2{WbE3RZ{%WhtVk?&mH!D`N8W(zD0E?|s!=yUE=C zmBdx`;>sItn){rU6;4z<+%<3V+B>U@ixauLlyi92<-hy8)iB@cxao=47whiMZ#uV+ zF?`DZjdHv1Hb|eIe=RxG`iBG;)V#?5_=cg2;)wxZ{F4~Nc0e>5Mho*h`zC8t1+cDorA`6N zzdj-wzb%#=;y%H=k3;~!WuIrBd@h?qC^PA zF->I}uC-OXhO5vC({-yLoB$jQzt{rozeH%nKUIJsB&J+7J|UId1K9?&8L|(Y~!aRSxve$FAPkbBI32=9z^=N1=7zk$Fp8bO1k|T2;b1MK0R|U5PM%i)RC8mV{ zIAXXwZqKyd-Xj{nr*p~F9>jIohyXZP&@%rS;`mZ2R0mI)OuYeEFo7AehB?2ZidEQz k|6wQsSce*b2B3C;86k@Trvzt|U;qFB07*qoM6N<$f>2Y*cK`qY literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano03_on.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano03_on.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4cf4fbb570a174fec203845f44b4f2bf9960db GIT binary patch literal 720 zcmeAS@N?(olHy`uVBq!ia0vp^4nUm1!3HGP9xZtRq&N#aB8wRq_>O=u<5X=vX$A(S zCQlc~kcv5PXI;!aY{289xuCmbZpo6G>Lq2e{ga~Pc_bV+dd&1v`uy&=uF~vhiz|c@ zY6A-x8Cb;`0ty%#jyvbgzNA()dE1Bm(Ld(Tt2Sg_V}2&)?W|pC4Pu8hBBD5E6{ay* zE}S!iqiAxtUqs)>5I+rdwMYL?X{+lTf3q^1&4VMgHTA0d)~=R-u!yi&WA8iB4G(+1 zbnabwwqT2$VTx!4Yl~ZrDa#tBQw!3Zwa1$^rQTlPm(603_m}GNyu$>-M2@y z?YGg2t2%3&)^11(SUo*E_hIDUF#YSd4wXtyX}fld`2vHdbM{-tHRr>&ABZbj|KjW3 zCw)5I9~ijw7#2KW!bW|vk}vSp)cvBC`%ypo&whm0s_gq#DfBcgZCxOFz1S|{WM`*B zc;(ZUrxN~8TZ)pD{<+3kCR(QX?|sfZ%_#As)Av>VS)!Z^*KAm`D{b12?F@${UkXgU$ct(N^PG0n@aKbxDMA! zUdfskb}%f$c*WJzTep2!QwR3sE*>wCw=x=*EZq8y;aYn1Id&b}{gs*eJC#o>*)%k9 zGidB!z((yk$6m91O4zJ`8I0GY)7F*w?v-~B6-aBi3iQ$0&X529n8yQs@oe(dYP$qo z;k1*hmUBiO-ODQBH|vPH+g$z`Y)oN{XBWtUA|!ZW=6>FLKu0Psovhm&b@$vW#`MWI znX^LIZgurik78R2a+=9Zo#)Kg=H0i8#R&6t^)5F~_$5}e{styd22WQ%mvv4FO#p>P BGPwW% literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano04.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano04.png new file mode 100644 index 0000000000000000000000000000000000000000..a485a769c04f21ae2a9836be8fe823d81f04811c GIT binary patch literal 523 zcmV+m0`&cfP)=%5TgM=#6viFdy#r`a(q_RAYwxNS`oHD_I;xQ zP*l(M=}wwV#IleKpsSl=F$jHLZi(DqJIP)G3S$-s78tL`24?!FH+DNFWngE|?>}c= z9D4w<)p#F;DE|K3KXw!#oH;}>8?+Vz)eaa``QxpVgOfHZ6h}Aw$Okw}L^zlibB!3p zc^}SEc(V^licSE|q%{6tXb{qW5i>GLT-9p)u+=Va{`__s3*td;xaUFT+5wn$Z9N N002ovPDHLkV1l@s)8POB literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano04_on.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano04_on.png new file mode 100644 index 0000000000000000000000000000000000000000..774e69acaa09ff2c0f6c871e595f6adf04e2b52f GIT binary patch literal 863 zcmV-l1EBngP)S`)OZyKIO5xZ79u#} zP6&5VB8Ursgjp~MlS15%_yA+*9FMJg1c zG#p3)eEUNK`1aTM{$dA&&~gEnc&Q6m4#*MHb_hl6szb5@a7opU|I%?WTrPxqFLWr_ zdBByM?~oxxLZIcJ9lts(x&L$}m>Q!Y0_SuG$Ec)1YISpEu>`2q&6UMmh!sM|j}Ujk znN=-ufmjw8H62e4Y0Z)9tm!}I<#yI)r*M z#3EHY{!7QjAn|at>q3Wuod;aG`3@OEBm`Ri+3~BxlKW3rf~heYB5+Q3aEwYCq*gaq z7E6Fy-CSABg;*hU{0MOuoLSWp7fAL844Dos4Z`Fw0bp{N05CaB0GJ#m089>z{(w(> zzn7;gbPlclfYk}%uHHq^=nq)&bp#Q#`vX=#Bzi=x{(x>>P@_MfOX7$#{Q+-Qehje7 zQ{eUo{FBF+9wD~5piYI~a=O3jp$H>7f^#UkQlD>I|M@-z&eP$S{o#fvc0hkm!@CQBvB&IK2X7m66002ovPDHLkV1lBzbxZ&N literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano05.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano05.png new file mode 100644 index 0000000000000000000000000000000000000000..e815d930aa0adee28a22d948c75e40b27dff33d5 GIT binary patch literal 372 zcmV-)0gL{LP)` z1dD@Y{VQ4oB+O@@wao5Ppg=N5Rb5qJv$cltoXMQ~;6@Z18FT92P2 z;JKofV^D$T7O}d=&9Tn~Z>#E8yQ2P>TS;aS~AK z1UxYg2`_X9Bpk=66Eu#hIy{#^5>9ua#1cW<;d3AVhG!N?gUi^8;LHNw;8~(15JD*| zI-20h0+h{E{AAi)eQO=u<5X=vX$A&n zZBG}+kcv5PXT2|ctRQf7e)_u3B@Ig$%pWin<*MZF=q;9h&UB@LtApEO`om=718dAR zoRY=_2o!v4ydmYcwGKzml9jSMw1E8d8a-|y7{AhPPV+6gI(r%okx=F zDW4`Va(+x-a&*4wvU;bQ_ANjBQh5~u-+8kf3_be$qxH56r86| z&dcc(*g{8vagY;N3kV&{>|IScM4`q(TqV@|94bVATS!feLvKsD>F z6HoeSZsM76(l1vyWmE7a7VgG5e*fm$Zwr+Ce@_0k>ifC2%-1%p@;~at(3{M*pzsWX zNuOlHF+=7H7HJH?AiA(;r+4D_g>N_Ql$%=kc>ku4_QADY*Vy0ub+EO*xB2rbHAol< zKCU-j7*gvXa{Ax=`-_EQbfo{YN={k9zoYunyvQTQn~n(gUt{<9XnW~Vb??jh0`-nj ze_TOfle2KO*1i7!FOTszsduY;U16UC3YhOlGQUoZ7fJQhOTM0+*Iek9@t%SCh@{~b zW`QU+o>phwwnGo4RbMmvEz~`3}M#1$^Ae}KOU@O}@&`@jBfgWSFHn2bNjLZvRQNW zZNXFl$ewpU%1)RCOg5>TbOkfX7z#v4Fx3EP>fQ{>=c&!bt3R0005n2gJ{0yiCWqtT z-51RG4vg)!vR8gE7crQU4|RZj<=dS(C!i{yaWnvirRngv@;>SfP&;$#6H)2}kRa9C zDecbVD(?i4#liLJHk<%))Cx47xhep~`E?_-DLX-9&Ug_Xu#*5}dvSSC-0k}%Q|Pq4 z6`;DatDB3a4q^ax9d)2>XFCWx0gb`b0_gf9!R~OkQ`KOq0{A4sOd7%_{SKz4yZ~*% oJR1O&$~*`lm2ogYYF!-Q2T~}5<%(hEod5s;07*qoM6N<$f~ZWsd;kCd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano06_on.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano06_on.png new file mode 100644 index 0000000000000000000000000000000000000000..a2ca5550f154f646faed89903916ceab5e2e7d39 GIT binary patch literal 1021 zcmV2@DI55?`L2_rshVtpMia5Glap@%XgwUDth^3|QtLVE%FI zTJ{0}`41SY7Xio*X#O#FJzD|Xsv97$4Y%qB$fts(0C?3Au3D>)R~=!@(gJ{MuKouk zk+)zefF--ELUij(3Zo^9S|Bw4;I75rv+aQ8#=l^qPoJcQFfRA}g8L6X$(S&*w*V%W zLl`l+6k!xILZt|!SOExKP!&c(7f4}jR#@`pRv2^IVk?YWwpe@zWcCAkR=8BO0#IL; zbew$^{}sSJa z1+LVIPEiy`>O?0|jI{vZ-Pf@<`Ez$TZ!aN?;N91;H~+A_4d~b5i)-G0c0lS1OYMf# z73SOxo4*2qW33tj$67W-3vdQu+~Wg^dC<8B(E`MTQ3EkyQTWT8VssCEvqXy$C@59nBvt0%ty;hhc9rz^%Fg@~Pm; z2dt}(FlntmUUh_9mKFd^x%wZFMBaicA26X7AR#G?mh5u>=++MjBWFI~H%!#~BsGN5 zS$0d*Cm9n)iG09HE{8B;aw)+Cptw@yiq4QiDKYVh(%w#Iw&4fuO_v9scdEKr4SpOT~`ts__e|K|tyE7_)Z+bC5ckTPd zgX>QP=>!PP(i*Qn*R6Meq(B4#VzWdTzkR&d&%^x#_fEf0g=hg_ZcU$7&&~wHkkkhV z5M2sJKp$g@Fb_faeKs0d0L-3`HPGU5S+`$aSBf}M(P8?MkNFq8)xG&OgTdKH^3-@NbMM03xHYWW;6S(eb;5)0$`x3r+~0g z$j$@X)@T4W55$(WC_w1mU`aMX3}dy~ej zQA#o!3{Z!@`kg&TuPcQY1#l4F=F7(Le-C=07RIN*sw!j>`N z-~l~}V1;N3^dds*JwN~%1A++nTFpSO*WJOpw$yzoPY8mTZHBNX1VN-iK+;|et_Ya8 zwh-AY07cLeVt;lk6`_?7r)dy-0u;hp1j-|7!CD7Ufw7c)hygjmiLoOQ_V=k|4E92( zHai513!jZdF!cZpV0S-re=8IT0Mg?hxMo5kH5FUe!TI1&TUZOrm$vPlfxp4?d7eH1h zO@kZPlD!iTD4qgvMTb)xzHb=-RqFum9=~Tus>4HCIt5O3I7_(K=*~r|I?Q(M^=ck4 zxBxJ$1(=n*N4K>>E8J$bzQ@l4azD=C9X}69ZE@WsvEl6jIT6C= ztBL_TL^gErNs4hbA#jIC^27(90bE50szW4u>@~6w)Ny*MLxfYh77_nuLnc*O&UJ`H zB4}iW+A4Dmpa%pI&N@V*z~}~!0kEnR!08YnMQ|4hhEyi(-CHF)2m4D7~`G$zQMCQ=VL^bNynt&xfWDGxY9)sa{an;Lwr f6hog0YNW$|CK7=E35Qgs00000NkvXXu0mjf!c{&9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano08.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano08.png new file mode 100644 index 0000000000000000000000000000000000000000..5d3c340977ec83ffd33c5074c4a69a7c7fbedc34 GIT binary patch literal 386 zcmV-|0e$|7P)^={h1nBXA=0bFy4Y3Vb!-_5HcW&y_4!^8f$<07*qoM6N<$g1=a*&Hw-a literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano08_on.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano08_on.png new file mode 100644 index 0000000000000000000000000000000000000000..4020839a83338cdafb8f494cb91bea9b3f869baa GIT binary patch literal 547 zcmV+;0^I$HP)xCY^`0XPs)G(3PPK^OvnF)m!^ zf>3*J8UZB;-2lSJF@v}VKn?-({X7DmAan!Z^z6*-uZGe|Z7snIJhq^6|6%BxAX)>v*Z z2L#d9Sgk+*w0x$7(6T?_O|1I^QV7)AW`6+HPwZT>=IF@7wm;wiSqgx1&DbgWui|6> z1HAS0DfJ3qw8(JH0Vu_~8q7WI7hDh2y2H)0ty1@>)%dr~jg-PPN6`>UM)rDs1_W$# zv~a^&-Ej z;+A=TS|;kq)~6jat5axJ*mM5%i;#!sgPFVyk&no<9Z$7k>LE_xyInoV}cj((2_!s9f z?E9tRa_iZh2EWyuJ6JgmoIakCagKGt?|k`l3$BJr$^2f;$y(F)obw4&2j6*?34-&a z6trzb9nvb49Lg+&16&~Z!Q9tD&BBbXzMLA2`Ile5m@s+L`VL^oF?hQAxvX literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano09_on.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano09_on.png new file mode 100644 index 0000000000000000000000000000000000000000..834ae912011931d2834d212b0b2e7be31a591ddc GIT binary patch literal 619 zcmeAS@N?(olHy`uVBq!ia0vp^4nUm1!3HGP9xZtRq&N#aB8wRq_>O=u<5X=vX$A%+ zSx*0gDhy9N7)}(5Z@8H=FE`tXgI6ozt9)*B z#NYFC?oZ#r*t?ehxAOI=DmpoPBme%E;ml*&b@KQ#!;LL@pEg#eczxKz$ZO>rK4HV; znsqJl+!j-6s`niV^AqG#y+2PscdBs1!za>HQZ;^V>UUWC#QJN$m)*lpd@H8ZZ2$M- ziEy6&!IhKWue8_t+48#lz?GBVublU@Tj-xSL77p(oynn(r9p<10pZ4p3{VNb&Yum| zx2Gw#r~=)ZpA#MVH}u?l?>h}QesuqxxZF!9=`nxUe^d9S=QRiXfv)t?Svb2UM{cH& zP5uGDPogSsROV|ROtwqN|Md2!Othsd$kBF(!~FE+%o8+zUV6!|8vjjj#nhVR{{l~{ z?|H_YrE-6*z17bapm9rpZj_%|bEw)b;nI`pSLy2WFDy4W0e2X77cW0jbD%Z%wZI|q zG>1;<4ckhymF_)PI9P1=K>g3|^pV{81*o$+@eP*nloPU1#wtwpxc+~%=&+e}{ z!+yr-XUp}P18*kzSDa%%0}QF}H3xDg`M(I307V?7(8A5 KT-G@yGywq4xCcD| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano10.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano10.png new file mode 100644 index 0000000000000000000000000000000000000000..0f9d74868c623eba72faf3c4135b2c770277fed1 GIT binary patch literal 359 zcmV-t0hs=YP)}h)3uN zy4Jm}L{LPE6kNwn$VgI5ByH1zWH!^5Hvi?%Bx#e>91g$%H~vs@2q`$EN@Q002ovPDHLk FV1gdBgk%5! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano10_on.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano10_on.png new file mode 100644 index 0000000000000000000000000000000000000000..843338287848603e8c9fff4900284a6ec172c93e GIT binary patch literal 676 zcmeAS@N?(olHy`uVBq!ia0vp^4nUm1!3HGP9xZtRq&N#aB8wRq_>O=u<5X=vX$A(S zFi#i9kcv5PXI;!aY{28sALxC!p)@8qx9!4F#Un)|@ zt?^uL){b>grQE+a7rk59`8sOd#_jSI@0r%N+&jBrYQZ1A2`r_%b655A**Xec`7!&| z;S0h()(a*ol&q~&b~Ff$H;`}iIy51@!HcQQmZP_Z>B^61N4Wp!H#`VnXmV!c;A2&= z5W&W|Cm(VB>!hGxhZKtb1o!<<{=2W-?!lz#oA>p<)^nV6{#SEF7GDU7SDCZw$L=K&&zR*%_sN>ij9Xb2W`C9D zY+CuNDc$bD>h#CImH+i`{dl$FIdhvWW7Z$T?FZAFP@@1PKERxR$#w~zns*H~@BM60 z)$iWdKRXC$TEao$2R9j&5>BnU4t4a>Dqqv7BByH(Jig;Be0^(7^0vAMd%3p=efVPS zAav#JzLj=rZ#b|0Y=~+yNd3xszUDyfwPWFr=km`m`^fa48!06HDj4^t>u^uA+rBOn QnCuulUHx3vIVCg!06Zow4gdfE literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano11.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/ano11.png new file mode 100644 index 0000000000000000000000000000000000000000..c9392a774d172ab14fd25271e982f31df543617c GIT binary patch literal 739 zcmV<90v!E`P)Px%ok>JNR9J=WmoabCKp2LfOKFlO7fZ;MkvtS3STd1`KhUtG3nQsS_z55dk>3zR zhOTTR5*-ktOS=#xW+t=X0fYpD1y-}TCWO$&4DDG-)!J88s8s4Z+5UX@zW2S~eP@d( zia1MT&XoN^z=eSSLBOS?VE54deIerOYONjt^taXpK%?0f%TFKA?CFMvfHTj)sRcBe z?Q5qQpJ>5xsMhL{G%WzWeR%%`5XmEsM`{LoE32`ujb=M0GAx_CG-lp?`{+sL@R&4+ zq_g1m%4#G{i*Vp$mn(DKPHS@K-h;@nYyif?kZeH`_#PX*HPL9cGoI`0sWERhU!-P6 z%K~Xyc&@Wot=0K6`UODXdjMn$64mMfMp zm#)XwZ1mO==T=C}KyPI=vdfhtW1i~(%y>Q?hUBF|wjfofJY5myiY3OwFuqp>2%v4v$QC5yVMyS6HDXTEZw}7 z>2_KXfKCx=sZ_mxXZr`rlId3LxelW+pm^EDbDh+!cVYnwzklw~-&z-*>%=MdTnD>c znGXj(^ZA97Os6M6tv($1@yEyRc+4maVjH@h)~*sEO^fB)UG2k2D+ANy0Pp&*gepSy z{6NH9IPeiCIGwcwOp_;}+i6Yga%E1N9gVXPx)97#k$RCt{2Ts>~%IuQP}QssVI1#n@wHJ(rMQso3bM&M)k1g^3tQQ%f^5#YJq z-i;~n6%oC(!k^)v>D}cA2uLhyhMeKdaHJtC&N&M5;alzw{Ou?T$c&duybDiMOgvu70@7fpbo|I?g#Rm&@*Qx!n9F-;;ieeNE|h6aK3EvH9z0 zc9YAAzq9Zq1zfMmy%b82`>>n#LHd1{pbwpak5UdUN}#x)^=Mj3vto?x0Bp!6=LriR z`S)E!wjE>aeL~YV)*WMP(=;^iPHA-`d0YGR6ddW(=o=rj9*7v;@vUE)|5Wj6p#})%D)`vo=WW}fZCe1~ec#9AZ^d-{A+)?*(0o3}d_E81 z9fa9zhS_XpY%}H#Nf2xN-Y)3l<0F`P2+rqoD$-U91mca~*8-};;ef;8famAuDoRgo zVGEqq>2$*Bbi#7E)bekdCRK(WZTumN>Iwkf-rhp^t3X=0v~61fNiD&M)oN7%pO#=* z1Q;#KI}wuuZ>Cky^>2d!NbbbvIpX-ObRIbq&Iw<|In(*m6S0R!Q9x!C1?Um_3WMav zN(?X~RxHq>C?GS63(Ab5fXpZg$c&|N4{tq7Gr@o5l0IWrUtfuH_`XwucGHg6k@ip~hDi_cAWw`;BywMs)HRm5Q2MbIkNU)7=|a#`45wOQQRY!M4DDX%0W~7oMaK9 zf?K=NkgP8X>bm}(u)IYX17y<)aUmfqqtMwO^!y~2Bptsk4+xn_V)pvFBInt!dDfMG zH^!0>{=nzL<=w`As(=poG-DCjGazOF^_m0;T#lB%$^!1Oez)P_6S}_d`FNR{S!1Ct zqHbW>?YG@-ul4b-udmu3Fvi};oFFQw_4$mkT~$?2bzM`)k|v5Mj|YI$>BKRXX=?Zz z_lkMF3)*hCe6d(yu~+~A-)^_IN22ajq3%x*3F0Igglcp>fWiGxptJzO z?)U0=JmPpf8avQ5&Bk|^isd<%`utSIRTTn-4?uZVL?_ODP@RY1a*1;r9O&P>G~}QJ*grnUu8^R9bT?IPgz|SiGl?t% z>XBtvlVprRssfmHE=AIFLw^{CpW@rE!cE-sEvo6G54j)Y9WwH1P=;p71(2}vfdZYv ky{*1%QOb-`nwS~?0|@SZ3XDWCk^lez07*qoM6N<$f*|jz%m4rY literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/meta.json b/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/meta.json new file mode 100644 index 0000000000..a6ffbe8156 --- /dev/null +++ b/Resources/Textures/Objects/Specific/Xenoarchaeology/item_artifacts.rsi/meta.json @@ -0,0 +1,178 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA 3.0", + "copyright": "goonstation at 4059e4be90832b02b1228b1bee3db342094e4f1e. ano11/ano11_on by brainfood#7460", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "ano01" + }, + { + "name": "ano01_on", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "ano02" + }, + { + "name": "ano02_on", + "delays": [ + [ + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17, + 0.17 + ] + ] + }, + { + "name": "ano03" + }, + { + "name": "ano03_on", + "delays": [ + [ + 0.24, + 0.24, + 0.24, + 0.24, + 0.24 + ] + ] + }, + { + "name": "ano04" + }, + { + "name": "ano04_on", + "delays": [ + [ + 0.24, + 0.24, + 0.24, + 0.24, + 0.24 + ] + ] + }, + { + "name": "ano05" + }, + { + "name": "ano05_on", + "delays": [ + [ + 0.24, + 0.24, + 0.24, + 0.24, + 0.24 + ] + ] + }, + { + "name": "ano06" + }, + { + "name": "ano06_on", + "delays": [ + [ + 0.24, + 0.24, + 0.24, + 0.24, + 0.24 + ] + ] + }, + { + "name": "ano07" + }, + { + "name": "ano07_on", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "ano08" + }, + { + "name": "ano08_on", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "ano09" + }, + { + "name": "ano09_on", + "delays": [ + [ + 0.24, + 0.24, + 0.24, + 0.24, + 0.24 + ] + ] + }, + { + "name": "ano10" + }, + { + "name": "ano10_on", + "delays": [ + [ + 0.24, + 0.24, + 0.24, + 0.24, + 0.24 + ] + ] + }, + { + "name": "ano11" + }, + { + "name": "ano11_on", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + ] +} \ No newline at end of file