From 845298e8fef1370aa6f0db19b37099fd0847a581 Mon Sep 17 00:00:00 2001 From: ReeZer2 <63300653+ReeZer2@users.noreply.github.com> Date: Sun, 23 Feb 2025 17:06:33 +0200 Subject: [PATCH] ADD: DNA Copy Implant for Uplink (#2601) * ADD: DNA Copy Implant for Uplink * ready for merge * fix fix commit * fix fix fix commit --- .../PenScrambler/ClientPenScramblerSystem.cs | 62 ++++++++++++++ .../Implants/SubdermalImplantSystem.cs | 63 ++++++++++++++ .../PenScrambler/PenScramblerComponent.cs | 19 ++++ .../SS220/PenScrambler/PenScramblerSystem.cs | 81 ++++++++++++++++++ .../PenScrambler/TransferIdentityComponent.cs | 13 +++ .../PenScrambler/TransferIdentitySystem.cs | 35 ++++++++ .../Components/SubdermalImplantComponent.cs | 7 ++ .../SetScaleFromTargetComponent.cs | 31 +++++++ .../PenScrambler/SharedPenScramblerEvents.cs | 18 ++++ .../hidden-description/hiddenDescription.ftl | 21 +++++ .../Locale/ru-RU/ss220/paper/paper-misc.ftl | 27 ++++++ .../ss220/pen-scrambler/pen-scrambler.ftl | 3 + .../SS220/Catalog/uplink_catalog.yml | 14 +++ .../DnaCopyImplanter/dnaimplanter.yml | 28 ++++++ .../Entities/Objects/Misc/implanters.yml | 7 ++ .../SS220/Entities/Objects/Misc/pen.yml | 19 ++++ .../Objects/Misc/subdermal_implants.yml | 30 +++++++ .../Medical/implant-dna-copy.rsi/dna-copy.png | Bin 0 -> 385 bytes .../Medical/implant-dna-copy.rsi/meta.json | 14 +++ 19 files changed, 492 insertions(+) create mode 100644 Content.Client/SS220/PenScrambler/ClientPenScramblerSystem.cs create mode 100644 Content.Server/SS220/PenScrambler/PenScramblerComponent.cs create mode 100644 Content.Server/SS220/PenScrambler/PenScramblerSystem.cs create mode 100644 Content.Server/SS220/PenScrambler/TransferIdentityComponent.cs create mode 100644 Content.Server/SS220/PenScrambler/TransferIdentitySystem.cs create mode 100644 Content.Shared/SS220/PenScrambler/SetScaleFromTargetComponent.cs create mode 100644 Content.Shared/SS220/PenScrambler/SharedPenScramblerEvents.cs create mode 100644 Resources/Locale/ru-RU/ss220/pen-scrambler/pen-scrambler.ftl create mode 100644 Resources/Prototypes/SS220/Entities/DnaCopyImplanter/dnaimplanter.yml create mode 100644 Resources/Textures/SS220/Objects/Specific/Medical/implant-dna-copy.rsi/dna-copy.png create mode 100644 Resources/Textures/SS220/Objects/Specific/Medical/implant-dna-copy.rsi/meta.json diff --git a/Content.Client/SS220/PenScrambler/ClientPenScramblerSystem.cs b/Content.Client/SS220/PenScrambler/ClientPenScramblerSystem.cs new file mode 100644 index 000000000000..a2741a9c251e --- /dev/null +++ b/Content.Client/SS220/PenScrambler/ClientPenScramblerSystem.cs @@ -0,0 +1,62 @@ +using Content.Shared.SS220.PenScrambler; +using Robust.Client.GameObjects; + +namespace Content.Client.SS220.PenScrambler; + +public sealed class ClientPenScramblerSystem : EntitySystem +{ + [Dependency] private readonly SpriteSystem _sprite = default!; + + public override void Initialize() + { + SubscribeNetworkEvent(OnSetScaleFromTarget); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityManager.EntityQueryEnumerator(); + + while (query.MoveNext(out var uid, out var comp)) + { + if (comp is { Target: not null, IsUpdated: false }) + { + TryUpdateSprite((uid, comp)); + } + } + } + + private void OnSetScaleFromTarget(SetScaleFromTargetEvent args) + { + var owner = GetEntity(args.Owner); + + if (!TryComp(owner, out var comp)) + return; + + comp.Target = args.Target; + Dirty(owner, comp); + + TryUpdateSprite((owner, comp)); + } + + private void TryUpdateSprite(Entity ent) + { + if (!ent.Comp.Target.HasValue) + return; + + if (!EntityManager.TryGetEntity(ent.Comp.Target.Value, out var target)) + return; + + if (!TryComp(ent.Owner, out var spriteUser)) + return; + + if (!TryComp(target, out var spriteTarget)) + return; + + spriteUser.Scale = spriteTarget.Scale; + ent.Comp.IsUpdated = true; + + _sprite.QueueUpdateInert(ent.Owner, spriteUser); + } +} diff --git a/Content.Server/Implants/SubdermalImplantSystem.cs b/Content.Server/Implants/SubdermalImplantSystem.cs index 5320e4ad2062..db445771a3b4 100644 --- a/Content.Server/Implants/SubdermalImplantSystem.cs +++ b/Content.Server/Implants/SubdermalImplantSystem.cs @@ -28,10 +28,14 @@ using Content.Shared.Movement.Pulling.Systems; using Content.Server.IdentityManagement; using Content.Server.DetailExaminable; +using Content.Server.Polymorph.Systems; +using Content.Server.SS220.PenScrambler; using Content.Shared.Store.Components; using Robust.Shared.Collections; using Robust.Shared.Map.Components; using Content.Shared.DoAfter; +using Content.Shared.Polymorph; +using Content.Shared.SS220.PenScrambler; using Content.Shared.SS220.Store; namespace Content.Server.Implants; @@ -53,6 +57,7 @@ public sealed class SubdermalImplantSystem : SharedSubdermalImplantSystem [Dependency] private readonly SharedMapSystem _mapSystem = default!; [Dependency] private readonly IdentitySystem _identity = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; //SS220-insert-currency-doafter + [Dependency] private readonly PolymorphSystem _polymorph = default!; //ss220 add dna copy implant private EntityQuery _physicsQuery; private HashSet> _targetGrids = []; @@ -70,6 +75,7 @@ public override void Initialize() SubscribeLocalEvent(OnScramImplant); SubscribeLocalEvent(OnDnaScramblerImplant); + SubscribeLocalEvent(OnDnaCopyImplant); //ss220 dna copy implant add } // SS220 - chemical-implants start @@ -285,4 +291,61 @@ private void OnDnaScramblerImplant(EntityUid uid, SubdermalImplantComponent comp args.Handled = true; QueueDel(uid); } + + //ss220 dna copy implant add start + private void OnDnaCopyImplant(Entity ent, ref UseDnaCopyImplantEvent args) + { + if (!TryComp(ent.Owner, out var transferIdentityComponent)) + return; + + var target = transferIdentityComponent.Target; + + if (target == null) + { + QueueDel(ent); + return; + } + + if (ent.Comp.ImplantedEntity is not { } user) + return; + + if (TryComp(user, out var humanoidAppearanceComponent)) + { + if (transferIdentityComponent.AppearanceComponent == null) + return; + + _humanoidAppearance.CloneAppearance(target.Value, user, transferIdentityComponent.AppearanceComponent, humanoidAppearanceComponent); + + _metaData.SetEntityName(user, MetaData(target.Value).EntityName, raiseEvents: false); + + if (TryComp(user, out var dna) + && TryComp(target.Value, out var dnaTarget)) + { + dna.DNA = dnaTarget.DNA; + var ev = new GenerateDnaEvent { Owner = user, DNA = dna.DNA }; + RaiseLocalEvent(ent, ref ev); + } + + if (TryComp(user, out var fingerprint) + && TryComp(target.Value, out var fingerprintTarget)) + { + fingerprint.Fingerprint = fingerprintTarget.Fingerprint; + } + + var setScale = EnsureComp(user); + setScale.Target = GetNetEntity(target); + + Dirty(user, setScale); + + var evEvent = new SetScaleFromTargetEvent(GetNetEntity(user), setScale.Target); + RaiseNetworkEvent(evEvent); + + _identity.QueueIdentityUpdate(user); + + _popup.PopupEntity(Loc.GetString("pen-scrambler-success-convert-to-identity", ("identity", MetaData(target.Value).EntityName)), user, user); + } + + QueueDel(ent); + } + //ss220 dna copy implant add end } diff --git a/Content.Server/SS220/PenScrambler/PenScramblerComponent.cs b/Content.Server/SS220/PenScrambler/PenScramblerComponent.cs new file mode 100644 index 000000000000..c3741136a362 --- /dev/null +++ b/Content.Server/SS220/PenScrambler/PenScramblerComponent.cs @@ -0,0 +1,19 @@ +using Content.Shared.Humanoid; + +namespace Content.Server.SS220.PenScrambler; + +[RegisterComponent] +public sealed partial class PenScramblerComponent : Component +{ + [DataField] + public EntityUid? Target; + + [DataField] + public HumanoidAppearanceComponent? AppearanceComponent; + + [DataField] + public bool HaveDna = false; + + public TimeSpan DelayForExtractDna = TimeSpan.FromSeconds(5); + public TimeSpan DelayForTransferToImplant = TimeSpan.FromSeconds(3); +} diff --git a/Content.Server/SS220/PenScrambler/PenScramblerSystem.cs b/Content.Server/SS220/PenScrambler/PenScramblerSystem.cs new file mode 100644 index 000000000000..f0d938335c84 --- /dev/null +++ b/Content.Server/SS220/PenScrambler/PenScramblerSystem.cs @@ -0,0 +1,81 @@ +using Content.Shared.DoAfter; +using Content.Shared.Humanoid; +using Content.Shared.Implants.Components; +using Content.Shared.Interaction; +using Content.Shared.Popups; +using Content.Shared.SS220.PenScrambler; + +namespace Content.Server.SS220.PenScrambler; + +public sealed class PenScramblerSystem : EntitySystem +{ + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnInteract); + SubscribeLocalEvent(OnCopyIdentity); + } + + private void OnInteract(Entity ent, ref AfterInteractEvent args) + { + if (!args.CanReach || args.Target == null) + return; + + if (HasComp(args.Target) && !ent.Comp.HaveDna) + { + _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, + args.User, + ent.Comp.DelayForExtractDna, + new CopyDnaToPenEvent(), + ent.Owner, + args.Target) + { + Hidden = true, + BreakOnMove = true, + BreakOnDamage = true, + BreakOnHandChange = true, + BreakOnDropItem = true, + DuplicateCondition = DuplicateConditions.None, + }); + } + + if (!TryComp(args.Target, out var implanterComponent)) + return; + + var implantEntity = implanterComponent.ImplanterSlot.ContainerSlot?.ContainedEntity; + + if (HasComp(implantEntity) && ent.Comp.HaveDna) + { + _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, + args.User, + ent.Comp.DelayForTransferToImplant, + new CopyDnaFromPenToImplantEvent(), + implantEntity, + ent.Owner) + { + BreakOnMove = true, + BreakOnDamage = true, + BreakOnHandChange = true, + BreakOnDropItem = true, + DuplicateCondition = DuplicateConditions.None, + }); + } + } + + private void OnCopyIdentity(Entity ent, ref CopyDnaToPenEvent args) + { + if (args.Cancelled) + return; + + if (!TryComp(args.Target, out var humanoidAppearanceComponent)) + return; + + ent.Comp.AppearanceComponent = humanoidAppearanceComponent; + ent.Comp.Target = args.Target; + ent.Comp.HaveDna = true; + + _popup.PopupEntity(Loc.GetString("pen-scrambler-success-copy", ("identity", MetaData(args.Target.Value).EntityName)), args.User, args.User); + } +} diff --git a/Content.Server/SS220/PenScrambler/TransferIdentityComponent.cs b/Content.Server/SS220/PenScrambler/TransferIdentityComponent.cs new file mode 100644 index 000000000000..c919d3bb773a --- /dev/null +++ b/Content.Server/SS220/PenScrambler/TransferIdentityComponent.cs @@ -0,0 +1,13 @@ +using Content.Shared.Humanoid; + +namespace Content.Server.SS220.PenScrambler; + +[RegisterComponent] +public sealed partial class TransferIdentityComponent : Component +{ + [DataField] + public EntityUid? Target; + + [DataField] + public HumanoidAppearanceComponent? AppearanceComponent; +} diff --git a/Content.Server/SS220/PenScrambler/TransferIdentitySystem.cs b/Content.Server/SS220/PenScrambler/TransferIdentitySystem.cs new file mode 100644 index 000000000000..902101327a16 --- /dev/null +++ b/Content.Server/SS220/PenScrambler/TransferIdentitySystem.cs @@ -0,0 +1,35 @@ +using Content.Shared.Popups; +using Content.Shared.SS220.PenScrambler; + +namespace Content.Server.SS220.PenScrambler; + +public sealed class TransferIdentitySystem : EntitySystem +{ + [Dependency] private readonly SharedPopupSystem _popup = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnCopyIdentityToImplant); + } + + private void OnCopyIdentityToImplant(Entity ent, ref CopyDnaFromPenToImplantEvent args) + { + if (args.Cancelled || args.Target == null) + return; + + if (!TryComp(args.Target, out var penComponent)) + return; + + if (penComponent.Target == null) + return; + + ent.Comp.Target = penComponent.Target.Value; + ent.Comp.AppearanceComponent = penComponent.AppearanceComponent; + + _popup.PopupEntity(Loc.GetString("pen-scrambler-success-transfer-to-implant", + ("identity", MetaData(penComponent.Target.Value).EntityName)), args.User, args.User); + + Dirty(ent); + QueueDel(args.Target); + } +} diff --git a/Content.Shared/Implants/Components/SubdermalImplantComponent.cs b/Content.Shared/Implants/Components/SubdermalImplantComponent.cs index c93922e310a1..5dd9cff76dfe 100644 --- a/Content.Shared/Implants/Components/SubdermalImplantComponent.cs +++ b/Content.Shared/Implants/Components/SubdermalImplantComponent.cs @@ -99,3 +99,10 @@ public sealed partial class UseDnaScramblerImplantEvent : InstantActionEvent { } + +//ss220 add dna copy implant start +public sealed partial class UseDnaCopyImplantEvent : InstantActionEvent +{ + +} +//ss220 add dna copy implant end diff --git a/Content.Shared/SS220/PenScrambler/SetScaleFromTargetComponent.cs b/Content.Shared/SS220/PenScrambler/SetScaleFromTargetComponent.cs new file mode 100644 index 000000000000..a40f8a74461e --- /dev/null +++ b/Content.Shared/SS220/PenScrambler/SetScaleFromTargetComponent.cs @@ -0,0 +1,31 @@ +using System.Numerics; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared.SS220.PenScrambler; + +[RegisterComponent] +[NetworkedComponent] +[AutoGenerateComponentState] +public sealed partial class SetScaleFromTargetComponent : Component +{ + [DataField] + [AutoNetworkedField] + public NetEntity? Target; + + [DataField] + public bool IsUpdated; +} + +[Serializable, NetSerializable] +public sealed class SetScaleFromTargetEvent : EntityEventArgs +{ + public NetEntity Owner { get; } + public NetEntity? Target { get; } + + public SetScaleFromTargetEvent(NetEntity owner, NetEntity? target) + { + Owner = owner; + Target = target; + } +} diff --git a/Content.Shared/SS220/PenScrambler/SharedPenScramblerEvents.cs b/Content.Shared/SS220/PenScrambler/SharedPenScramblerEvents.cs new file mode 100644 index 000000000000..95398ac8de91 --- /dev/null +++ b/Content.Shared/SS220/PenScrambler/SharedPenScramblerEvents.cs @@ -0,0 +1,18 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +namespace Content.Shared.SS220.PenScrambler; + +[Serializable] +[NetSerializable] +public sealed partial class CopyDnaToPenEvent : DoAfterEvent +{ + public override DoAfterEvent Clone() => this; +} + +[Serializable] +[NetSerializable] +public sealed partial class CopyDnaFromPenToImplantEvent : DoAfterEvent +{ + public override DoAfterEvent Clone() => this; +} diff --git a/Resources/Locale/ru-RU/ss220/hidden-description/hiddenDescription.ftl b/Resources/Locale/ru-RU/ss220/hidden-description/hiddenDescription.ftl index 5b2f6c50168a..9bcb41f08b0e 100644 --- a/Resources/Locale/ru-RU/ss220/hidden-description/hiddenDescription.ftl +++ b/Resources/Locale/ru-RU/ss220/hidden-description/hiddenDescription.ftl @@ -13,6 +13,10 @@ hidden-desc-MindSlaveImplant-medical = [color=#52B4E9]Сверив номера hidden-desc-MindSlaveImplant-research = [color=#D381C9]Внимательно осмотрев имплант, вы понимаете, что это внутри имплант, губительно влияющий на нервную систему.[/color] hidden-desc-MindSlaveImplant-syndicate = [color=#e31735]Этот имплант подчиняет разум владельца тому, кто установил имлпант. При извлечении импланта контроль над разумом теряется.[/color] +hidden-desc-DnaCopyImplant-medical = [color=#52B4E9]Этот имплант содержит структуры ДНК, что позволяет менять личность.[/color] +hidden-desc-DnaCopyImplant-research = [color=#D381C9]Имплант, позволяющий копировать и изменять ДНК, что дает возможность смены личности.[/color] +hidden-desc-DnaCopyImplant-syndicate = [color=#E31735]Имплант с функцией клонирования ДНК, позволяющий носителю принять новую личность.[/color] + # Regular decriptions below ent-ThermalVisorImplanter = { ent-Implanter } @@ -21,6 +25,20 @@ ent-ThermalVisorImplanter = { ent-Implanter } ent-ThermalVisionImplant = имплант Термального Зрения .desc = Микрочип, который вживляют под кожу. +ent-DnaCopyImplanter = { ent-Implanter } + .desc = { ent-Implanter.desc } + .suffix = Копирование ДНК +ent-DnaCopyImplant = имплант копирования ДНК + .desc = Микрочип, который вживляют под кожу. + +ent-ActionActivateDnaCopy = Активировать имплант копирования ДНК + .desc = Активирует процесс копирования ДНК, позволяя носителю изменить свою личность. Можно использовать для скрытия или маскировки. + +ent-BoxDnaCopyImplant = { ent-BoxCardboard } + .desc = { ent-BoxCardboard.desc } + +ent-PaperDnaCopyImplanter = { ent-Paper } + .desc = { ent-Paper.desc } # Uplink locale uplink-thermal-glasses-name = Термальные очки @@ -29,6 +47,9 @@ uplink-thermal-glasses-desc = Очки со встроенными термал uplink-thermal-visor-implanter-name = Имплант термального зрения uplink-thermal-visor-implanter-desc = Новейшая разработка синдиката, имплант позволяет глазу носителя различать тепловые сигнатуры сквозь преграды. +uplink-dna-copy-implanter-name = Имплант копирования ДНК +uplink-dna-copy-implanter-desc = Новейшая разработка синдиката, имплант позволяет скопировать внешность другого человека. + # silent shoes hidden-desc-SilentShoes-syndicate = [color=#e31735]Разработанные специально для шпионских миссий Синдиката, эти ботинки совершенно бесшумны на любых поверхностях[/color] hidden-desc-SilentShoes-research = [color=#D381C9]Вы можете различить скрытый слой поглощающего материала, полностью глушащий любые звуки шагов[/color] diff --git a/Resources/Locale/ru-RU/ss220/paper/paper-misc.ftl b/Resources/Locale/ru-RU/ss220/paper/paper-misc.ftl index eebf5cdcb7f1..8bfab4a01139 100644 --- a/Resources/Locale/ru-RU/ss220/paper/paper-misc.ftl +++ b/Resources/Locale/ru-RU/ss220/paper/paper-misc.ftl @@ -44,3 +44,30 @@ book-text-clownmime-scribbles = [color=red]Дорогие дети![/color] [ {"["}bold{"]"}{"["}color=#800000{"]"}С любовью,[/color][/bold] {"["}bold{"]"}{"["}color=red{"]"}Хонко[/color][color=green]мама[/bold][/color] и [bold][color=#808080]хранительница[/color][/bold] тишины! + + +book-text-identity-implant-info = + Спасибо, что выбрали наш имплант копирования личности! + Мы в компании Cybersun гордимся нашими передовыми биотехнологиями и ценим ваш вклад в развитие будущего! + + Имплант копирования личности позволяет вам перенять внешность другого человека, обеспечивая беспрецедентные возможности для маскировки и скрытности. + Однако помните: технология требует осознанного подхода и правильного использования! + + Комплект содержит: + + 1. Имплант копирования личности (неактивирован) + 2. Биометрическая ручка-дозатор + 3. Инструкция по применению + + Инструкция по применению: + + - Используйте биометрическую ручку на цели, чтобы извлечь образец её ДНК. + - Перенесите ДНК из ручки в имплант. + - Имплантируйте активированный имплант в своё тело. + - Активируйте подкожный имплант силой мысли. + + ВАЖНО! + ⚠ Имплант изначально содержит жидкость, в которую нужно добавить ДНК цели. Введение в тело без предварительной загрузки ДНК не даст никакого эффекта! + ⚠ Процедура необратима — повторная настройка невозможна, замените имплант для нового изменения внешности. + + Cybersun Inc. не несёт ответственности за юридические последствия, связанные с использованием технологии копирования личности. Будьте разумны! diff --git a/Resources/Locale/ru-RU/ss220/pen-scrambler/pen-scrambler.ftl b/Resources/Locale/ru-RU/ss220/pen-scrambler/pen-scrambler.ftl new file mode 100644 index 000000000000..14b50fc006cd --- /dev/null +++ b/Resources/Locale/ru-RU/ss220/pen-scrambler/pen-scrambler.ftl @@ -0,0 +1,3 @@ +pen-scrambler-success-copy = Вы успешно скопировали личность { $identity } в ручку +pen-scrambler-success-transfer-to-implant = Вы успешно перенесли личность { $identity } в имплант +pen-scrambler-success-convert-to-identity = Вы успешно превратились в { $identity } diff --git a/Resources/Prototypes/SS220/Catalog/uplink_catalog.yml b/Resources/Prototypes/SS220/Catalog/uplink_catalog.yml index 8a3cbe5e84bb..89f3933f7f77 100644 --- a/Resources/Prototypes/SS220/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/SS220/Catalog/uplink_catalog.yml @@ -173,6 +173,20 @@ categories: - UplinkImplants +- type: listing + id: DnaCopyImplanter + name: uplink-dna-copy-implanter-name + description: uplink-dna-copy-implanter-desc + icon: {sprite: /Textures/SS220/Objects/Specific/Medical/implant-dna-copy.rsi, state: dna-copy} + productEntity: BoxDnaCopyImplant + discountCategory: rareDiscounts + discountDownTo: + Telecrystal: 5 + cost: + Telecrystal: 8 + categories: + - UplinkImplants + - type: listing id: ClothingHeadHelmetSwatSyndicate name: uplink-helmet-swat-syndicate-name diff --git a/Resources/Prototypes/SS220/Entities/DnaCopyImplanter/dnaimplanter.yml b/Resources/Prototypes/SS220/Entities/DnaCopyImplanter/dnaimplanter.yml new file mode 100644 index 000000000000..0e7726b4df7d --- /dev/null +++ b/Resources/Prototypes/SS220/Entities/DnaCopyImplanter/dnaimplanter.yml @@ -0,0 +1,28 @@ +- type: entity + id: BoxDnaCopyImplant + parent: BoxCardboard + components: + - type: StorageFill + contents: + - id: PenDnaScrambler + - id: DnaCopyImplanter + - id: PaperDnaCopyImplanter + +- type: entity + id: PaperDnaCopyImplanter + parent: Paper + components: + - type: Paper + content: book-text-identity-implant-info + +- type: entity + id: ActionActivateDnaCopy + name: Dna Copy Implant + components: + - type: InstantAction + itemIconStyle: BigAction + priority: -20 + icon: + sprite: /Textures/SS220/Objects/Specific/Medical/implant-dna-copy.rsi + state: dna-copy + event: !type:UseDnaCopyImplantEvent diff --git a/Resources/Prototypes/SS220/Entities/Objects/Misc/implanters.yml b/Resources/Prototypes/SS220/Entities/Objects/Misc/implanters.yml index 73a0db401546..d7909e7bf74b 100644 --- a/Resources/Prototypes/SS220/Entities/Objects/Misc/implanters.yml +++ b/Resources/Prototypes/SS220/Entities/Objects/Misc/implanters.yml @@ -18,3 +18,10 @@ - type: Implanter implant: ThermalVisionImplant +- type: entity + id: DnaCopyImplanter + name: Dna Copy Implanter + parent: BaseImplantOnlyImplanterSyndi + components: + - type: Implanter + implant: DnaCopyImplant diff --git a/Resources/Prototypes/SS220/Entities/Objects/Misc/pen.yml b/Resources/Prototypes/SS220/Entities/Objects/Misc/pen.yml index 7563e6a858cb..ac85fe3ccd8e 100644 --- a/Resources/Prototypes/SS220/Entities/Objects/Misc/pen.yml +++ b/Resources/Prototypes/SS220/Entities/Objects/Misc/pen.yml @@ -57,3 +57,22 @@ tags: - Write - Pen + +- type: entity + name: ручка + description: Ручка с чёрными чернилами. + parent: BaseItem + id: PenDnaScrambler + components: + - type: Sprite + sprite: Objects/Misc/pens.rsi + state: pen + - type: Item + sprite: Objects/Misc/pens.rsi + heldPrefix: pen + size: Tiny + - type: PenScrambler + - type: Tag + tags: + - Write + - Pen diff --git a/Resources/Prototypes/SS220/Entities/Objects/Misc/subdermal_implants.yml b/Resources/Prototypes/SS220/Entities/Objects/Misc/subdermal_implants.yml index 57fa2d5f8a8d..7ce6187a0fd5 100644 --- a/Resources/Prototypes/SS220/Entities/Objects/Misc/subdermal_implants.yml +++ b/Resources/Prototypes/SS220/Entities/Objects/Misc/subdermal_implants.yml @@ -78,3 +78,33 @@ - TraitorRole - NukeOperative +- type: entity + parent: BaseSubdermalImplant + id: DnaCopyImplant + name: dna copy implant + categories: [ HideSpawnMenu ] + components: + - type: SubdermalImplant + implantAction: ActionActivateDnaCopy + - type: TriggerImplantAction + - type: TransferIdentity + - type: HiddenDescription + entries: + - label: hidden-desc-DnaCopyImplant-medical + jobRequired: + - Paramedic + - MedicalDoctor + - SeniorPhysician + - ChiefMedicalOfficer + - Brigmedic + - label: hidden-desc-DnaCopyImplant-research + jobRequired: + - ResearchAssistant + - ResearchDirector + - Scientist + - Borg + - label: hidden-desc-DnaCopyImplant-syndicate + whitelistMind: + mindRoles: + - TraitorRole + - NukeOperative diff --git a/Resources/Textures/SS220/Objects/Specific/Medical/implant-dna-copy.rsi/dna-copy.png b/Resources/Textures/SS220/Objects/Specific/Medical/implant-dna-copy.rsi/dna-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..9774304d914bc32fe2d42875d6138e0e006b91ca GIT binary patch literal 385 zcmV-{0e=38P)Px$J4r-AR9J=WRzVVjFbITBZ~B}1{}-gc(ew6z5w!^;!ZL=COjycNu-ZA2Bf zAQH=T!_`|*gXZUWqr`l2wVkLy#G*uE9;ksi54a?V$ru?6g9ZZjm6L)jC(uxY-Ww3A fyj`xqjmz-?AoJjxa@B9$00000NkvXXu0mjf26m;P literal 0 HcmV?d00001 diff --git a/Resources/Textures/SS220/Objects/Specific/Medical/implant-dna-copy.rsi/meta.json b/Resources/Textures/SS220/Objects/Specific/Medical/implant-dna-copy.rsi/meta.json new file mode 100644 index 000000000000..3c71e4a89bef --- /dev/null +++ b/Resources/Textures/SS220/Objects/Specific/Medical/implant-dna-copy.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from TG Station, repo https://github.com/tgstation/tgstation", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "dna-copy" + } + ] +}