From 4db47a65468730e264cc2aa2a5b77a30d30dcbb7 Mon Sep 17 00:00:00 2001 From: kekoven1 Date: Sun, 25 Jan 2026 18:32:53 +0300 Subject: [PATCH] [ADD] Blue blood trait (#1050) * trait * en ftl * Update traits.yml * Update Content.Server/_White/Traits/BlueBloodTraitSystem.cs Co-authored-by: Remuchi <72476615+Remuchi@users.noreply.github.com> * metabolizer --------- Co-authored-by: Remuchi <72476615+Remuchi@users.noreply.github.com> --- .../Body/Components/MetabolizerComponent.cs | 3 +- .../_White/Traits/BlueBloodTraitComponent.cs | 14 ++++++ .../_White/Traits/BlueBloodTraitSystem.cs | 50 +++++++++++++++++++ .../Locale/en-US/_white/traits/traits.ftl | 3 ++ .../Locale/ru-RU/_white/traits/traits.ftl | 3 ++ Resources/Prototypes/_White/Traits/traits.yml | 18 +++++++ 6 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 Content.Server/_White/Traits/BlueBloodTraitComponent.cs create mode 100644 Content.Server/_White/Traits/BlueBloodTraitSystem.cs diff --git a/Content.Server/Body/Components/MetabolizerComponent.cs b/Content.Server/Body/Components/MetabolizerComponent.cs index fddaa4c517..d4fa3ae883 100644 --- a/Content.Server/Body/Components/MetabolizerComponent.cs +++ b/Content.Server/Body/Components/MetabolizerComponent.cs @@ -5,6 +5,7 @@ using Content.Shared.FixedPoint; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; using Content.Server.Limbus.Traits; +using Content.Server._White.Traits; //wwdp blue blood trait namespace Content.Server.Body.Components { @@ -46,7 +47,7 @@ namespace Content.Server.Body.Components /// List of metabolizer types that this organ is. ex. Human, Slime, Felinid, w/e. /// [DataField] - [Access(typeof(MetabolizerSystem), typeof(LiquorLifelineSystem), typeof(VampirismSystem), Other = AccessPermissions.ReadExecute)] // FIXME Friends + [Access(typeof(MetabolizerSystem), typeof(LiquorLifelineSystem), typeof(VampirismSystem), typeof(BlueBloodTraitSystem), Other = AccessPermissions.ReadExecute)] // FIXME Friends //wwdp blue blood trait public HashSet>? MetabolizerTypes = null; /// diff --git a/Content.Server/_White/Traits/BlueBloodTraitComponent.cs b/Content.Server/_White/Traits/BlueBloodTraitComponent.cs new file mode 100644 index 0000000000..401875b0dc --- /dev/null +++ b/Content.Server/_White/Traits/BlueBloodTraitComponent.cs @@ -0,0 +1,14 @@ +using Content.Shared.Body.Prototypes; +using Robust.Shared.Prototypes; + +namespace Content.Server._White.Traits; + +[RegisterComponent] +public sealed partial class BlueBloodTraitComponent : Component +{ + [DataField] + public HashSet> MetabolizerPrototype = new() { "Arachnid" }; + + [DataField] + public string Blood = "CopperBlood"; +} diff --git a/Content.Server/_White/Traits/BlueBloodTraitSystem.cs b/Content.Server/_White/Traits/BlueBloodTraitSystem.cs new file mode 100644 index 0000000000..8cbb59236e --- /dev/null +++ b/Content.Server/_White/Traits/BlueBloodTraitSystem.cs @@ -0,0 +1,50 @@ +using Content.Server.Body.Components; +using Content.Server.Body.Systems; +using Content.Shared._Shitmed.Body.Organ; +using Content.Shared.Body.Organ; +using Content.Shared.Body.Systems; +using System.Diagnostics.CodeAnalysis; +using static Content.Server.Power.Pow3r.PowerState; + +namespace Content.Server._White.Traits; +public sealed class BlueBloodTraitSystem : EntitySystem +{ + [Dependency] private readonly BloodstreamSystem _bloodstream = default!; + [Dependency] private readonly SharedBodySystem _bodySys = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMapInit); + } + + private void OnMapInit(EntityUid uid, BlueBloodTraitComponent component, MapInitEvent args) + { + if (TryComp(uid, out var bloodstream)) + { + _bloodstream.TryModifyBloodLevel(uid, 0, bloodstream, false); + _bloodstream.ChangeBloodReagent(uid, component.Blood, bloodstream); + _bloodstream.TryModifyBloodLevel(uid, bloodstream.BloodMaxVolume, bloodstream, false); + } + + if (TryGetMetabolizer(uid, out var metabolizer) && metabolizer != null) + metabolizer.Value.Comp.MetabolizerTypes = component.MetabolizerPrototype; + } + + private bool TryGetMetabolizer(EntityUid uid, out Entity? metabolizer) + { + metabolizer = null; + + foreach (var (organId, _) in _bodySys.GetBodyOrgans(uid)) + { + if (TryComp(organId, out MetabolizerComponent? metabolizerComp)) + { + metabolizer = (organId, metabolizerComp); + return true; + } + } + + return false; + } +} diff --git a/Resources/Locale/en-US/_white/traits/traits.ftl b/Resources/Locale/en-US/_white/traits/traits.ftl index ca3dd26960..367df457fa 100644 --- a/Resources/Locale/en-US/_white/traits/traits.ftl +++ b/Resources/Locale/en-US/_white/traits/traits.ftl @@ -6,3 +6,6 @@ trait-description-Contract = You signed paper with your own blood, what could go trait-name-StudioVisor = Studio Visor trait-description-StudioVisor = A studio-grade visor is installed in your vision sensors, which significantly reduces the intensity of CRT-like visual effects and glitches caused by damage or low health. + +trait-name-BlueBlood = Blue Blood +trait-description-BlueBlood = The hemocyanin in your blood uses copper to transport oxygen. As a result, your blood is blue and requires copper instead of iron to replenish it. diff --git a/Resources/Locale/ru-RU/_white/traits/traits.ftl b/Resources/Locale/ru-RU/_white/traits/traits.ftl index ab3d6816fa..cb8f8f5375 100644 --- a/Resources/Locale/ru-RU/_white/traits/traits.ftl +++ b/Resources/Locale/ru-RU/_white/traits/traits.ftl @@ -6,3 +6,6 @@ trait-description-Contract = Вы подписали какую-то бумаж trait-name-StudioVisor = Студийный визор trait-description-StudioVisor = В ваши оптические сенсоры встроен визор студийного класса, который значительно снижает интенсивность визуальных ЭЛТ-эффектов и глитчей, вызванных повреждениями или низким уровнем заряда. + +trait-name-BlueBlood = Синяя кровь +trait-description-BlueBlood = Гемоцианин в вашей крови использует медь для переноса кислорода. В результате кровь синяя, а для ее восстановления необходима медь, а не железо. diff --git a/Resources/Prototypes/_White/Traits/traits.yml b/Resources/Prototypes/_White/Traits/traits.yml index 1cb27cb6e8..111700bfd0 100644 --- a/Resources/Prototypes/_White/Traits/traits.yml +++ b/Resources/Prototypes/_White/Traits/traits.yml @@ -33,3 +33,21 @@ - type: DeleteOnTrigger - type: SpawnOnTrigger proto: giber + +- type: trait + id: BlueBlood + category: Physical + points: 0 + slots: 0 + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - IPC + - Arachnid + - SlimePerson + - Shadowkin + functions: + - !type:TraitAddComponent + components: + - type: BlueBloodTrait