]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Polymorph Artifact Effect (#20660)
authorbrainfood1183 <113240905+brainfood1183@users.noreply.github.com>
Mon, 9 Oct 2023 23:49:42 +0000 (00:49 +0100)
committerGitHub <noreply@github.com>
Mon, 9 Oct 2023 23:49:42 +0000 (16:49 -0700)
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PolyArtifactComponent.cs [new file with mode: 0644]
Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PolyArtifactSystem.cs [new file with mode: 0644]
Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl
Resources/Prototypes/Polymorphs/polymorph.yml
Resources/Prototypes/XenoArch/Effects/normal_effects.yml

diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PolyArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PolyArtifactComponent.cs
new file mode 100644 (file)
index 0000000..8edeb77
--- /dev/null
@@ -0,0 +1,30 @@
+using Robust.Shared.Audio;
+using Content.Shared.Polymorph;
+using Robust.Shared.Prototypes;
+
+namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components;
+
+/// <summary>
+/// Artifact polymorphs surrounding entities when triggered.
+/// </summary>
+[RegisterComponent]
+public sealed partial class PolyArtifactComponent : Component
+{
+    /// <summary>
+    /// The polymorph effect to trigger.
+    /// </summary>
+    [DataField]
+    public ProtoId<PolymorphPrototype> PolymorphPrototypeName = "ArtifactMonkey";
+
+    /// <summary>
+    /// range of the effect.
+    /// </summary>
+    [DataField]
+    public float Range = 2f;
+
+    /// <summary>
+    /// Sound to play on polymorph.
+    /// </summary>
+    [DataField]
+    public SoundSpecifier PolySound = new SoundPathSpecifier("/Audio/Weapons/Guns/Gunshots/Magic/staff_animation.ogg");
+}
diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PolyArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PolyArtifactSystem.cs
new file mode 100644 (file)
index 0000000..d192e92
--- /dev/null
@@ -0,0 +1,41 @@
+using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components;
+using Content.Server.Xenoarchaeology.XenoArtifacts.Events;
+using Content.Shared.Humanoid;
+using Content.Server.Polymorph.Systems;
+using Content.Shared.Mobs.Systems;
+using Content.Shared.Polymorph;
+
+namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems;
+
+public sealed class PolyArtifactSystem : EntitySystem
+{
+    [Dependency] private readonly EntityLookupSystem _lookup = default!;
+    [Dependency] private readonly MobStateSystem _mob = default!;
+    [Dependency] private readonly PolymorphSystem _poly = default!;
+    [Dependency] private readonly SharedAudioSystem _audio = default!;
+
+    /// <summary>
+    /// On effect trigger polymorphs targets in range.
+    /// </summary>
+    public override void Initialize()
+    {
+        SubscribeLocalEvent<PolyArtifactComponent, ArtifactActivatedEvent>(OnActivate);
+    }
+
+    /// <summary>
+    /// Provided target is alive and is not a zombie, polymorphs the target.
+    /// </summary>
+    private void OnActivate(EntityUid uid, PolyArtifactComponent component, ArtifactActivatedEvent args)
+    {
+        var xform = Transform(uid);
+        foreach (var comp in _lookup.GetComponentsInRange<HumanoidAppearanceComponent>(xform.Coordinates, component.Range))
+        {
+            var target = comp.Owner;
+            if (_mob.IsAlive(target))
+            {
+                _poly.PolymorphEntity(target, component.PolymorphPrototypeName);
+                _audio.PlayPvs(component.PolySound, uid);
+            }
+        }
+    }
+}
index 1da33c3232b6ad137bae5420ff88520d4f573541..48a6f49408c347efdb16e38f848469ced5b3f839 100644 (file)
@@ -18,6 +18,7 @@ artifact-effect-hint-soap = Lubricated surface
 artifact-effect-hint-communication = Long-distance communication
 artifact-effect-hint-phasing = Structural phasing
 artifact-effect-hint-sentience = Neurological activity
+artifact-effect-hint-polymorph = Transmogrificational activity
 
 # 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")
index fe4f80811f80d641a357c1f6415cf758a91f0b1a..c710d83ceccb50f39e7e4b89affe5c79c8d08462 100644 (file)
   transferName: true
   revertOnDeath: true
 
+
+# this is the monkey polymorph for artifact.
+- type: polymorph
+  id: ArtifactMonkey
+  entity: MobMonkey
+  forced: true
+  transferName: true
+  allowRepeatedMorphs: true
+  inventory: Transfer
+  revertOnCrit: true
+  revertOnDeath: true
+  duration: 20
+
+- type: polymorph
+  id: ArtifactCluwne
+  entity: MobCluwne
+  forced: true
+  transferName: true
+  transferHumanoidAppearance: true
+  inventory: None
+  revertOnDeath: true
+  revertOnCrit: true
+  duration: 30
+
+- type: polymorph
+  id: ArtifactLizard
+  entity: MobLizard
+  forced: true
+  transferName: true
+  transferHumanoidAppearance: true
+  inventory: None
+  revertOnDeath: true
+  revertOnCrit: true
+  duration: 20
index 8deeebcc55c473226d7dbf415fd893676180950c..040f688403c51d93a5e9b93a31f8cc724a7cdc07 100644 (file)
@@ -1,4 +1,4 @@
-- type: artifactEffect
+- type: artifactEffect
   id: EffectBadFeeling
   targetDepth: 0
   effectHint: artifact-effect-hint-mental
   components:
   - type: EmpArtifact
 
+- type: artifactEffect
+  id: EffectPolyMonkey
+  targetDepth: 2
+  effectHint: artifact-effect-hint-polymorph
+  components:
+  - type: PolyArtifact
+
+- type: artifactEffect
+  id: EffectPolyLizard
+  targetDepth: 2
+  effectHint: artifact-effect-hint-polymorph
+  components:
+  - type: PolyArtifact
+    polymorphPrototypeName: ArtifactLizard
+
 - type: artifactEffect
   id: EffectHealAll
   targetDepth: 3