Add Machine Incompatible Trait (#2395)

* Mostly done, just needs some messaging added

Going to change the description for the unborgable brain and add a popup.

* Inspection says if brain has trait

* Comments

* Moved comment, removed body, localized, etc.

* move to shared, shitmed ready, add warning to health analyzer

* pro

* remove old component

* untroll brain system

* :trollface:

* :trollface:

* fix

---------

Signed-off-by: deltanedas <39013340+deltanedas@users.noreply.github.com>
Co-authored-by: deltanedas <@deltanedas:kde.org>
Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com>
This commit is contained in:
Emily 2025-01-09 21:45:39 -07:00 committed by GitHub
parent 2d6d852dc2
commit d361ecea17
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 94 additions and 1 deletions

View File

@ -1,6 +1,7 @@
using System.Linq;
using System.Numerics;
using Content.Client.Message;
using Content.Shared._DV.Traits.Assorted; // DeltaV
using Content.Shared.Atmos;
using Content.Client.UserInterface.Controls;
using Content.Shared._Shitmed.Targeting; // Shitmed
@ -36,6 +37,7 @@ namespace Content.Client.HealthAnalyzer.UI
private readonly SpriteSystem _spriteSystem;
private readonly IPrototypeManager _prototypes;
private readonly IResourceCache _cache;
private readonly UnborgableSystem _unborgable; // DeltaV
// Shitmed Change Start
public event Action<TargetBodyPart?, EntityUid>? OnBodyPartSelected;
@ -57,6 +59,7 @@ namespace Content.Client.HealthAnalyzer.UI
_spriteSystem = _entityManager.System<SpriteSystem>();
_prototypes = dependencies.Resolve<IPrototypeManager>();
_cache = dependencies.Resolve<IResourceCache>();
_unborgable = _entityManager.System<UnborgableSystem>(); // DeltaV
// Shitmed Change Start
_bodyPartControls = new Dictionary<TargetBodyPart, TextureButton>
{
@ -184,7 +187,8 @@ namespace Content.Client.HealthAnalyzer.UI
// Alerts
var showAlerts = msg.Unrevivable == true || msg.Bleeding == true;
var unborgable = _unborgable.IsUnborgable(_target.Value); // DeltaV
var showAlerts = msg.Unrevivable == true || msg.Bleeding == true || unborgable;
AlertsDivider.Visible = showAlerts;
AlertsContainer.Visible = showAlerts;
@ -208,6 +212,14 @@ namespace Content.Client.HealthAnalyzer.UI
MaxWidth = 300
});
if (unborgable) // DeltaV
AlertsContainer.AddChild(new RichTextLabel
{
Text = Loc.GetString("health-analyzer-window-entity-unborgable-text"),
Margin = new Thickness(0, 4),
MaxWidth = 300
});
// Damage Groups
var damageSortedGroups =

View File

@ -0,0 +1,10 @@
using Robust.Shared.GameStates;
namespace Content.Shared._DV.Traits.Assorted;
/// <summary>
/// This is used for the unborgable trait, which blacklists a brain from MMIs.
/// If this is added to a body, it gets moved to its brain if it has one.
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class UnborgableComponent : Component;

View File

@ -0,0 +1,54 @@
using Content.Shared.Body.Components;
using Content.Shared.Body.Organ;
using Content.Shared.Body.Systems;
using Content.Shared.Examine;
using Content.Shared.Movement.Components; // TODO: use BrainComponent instead of InputMover when shitmed is merged
using Robust.Shared.Utility;
namespace Content.Shared._DV.Traits.Assorted;
/// <summary>
/// Adds a warning examine message to brains with <see cref="UnborgableComponent"/>.
/// </summary>
public sealed class UnborgableSystem : EntitySystem
{
[Dependency] private readonly SharedBodySystem _body = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<UnborgableComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<UnborgableComponent, ExaminedEvent>(OnExamined);
}
/// <summary>
/// Returns true if a mob's brain has <see cref="UnborgableComponent"/>.
/// </summary>
public bool IsUnborgable(Entity<BodyComponent?> ent)
{
// technically this will apply for any organ not just brain, but assume nobody will be evil and do that
return _body.GetBodyOrganEntityComps<UnborgableComponent>(ent).Count > 0;
}
private void OnMapInit(Entity<UnborgableComponent> ent, ref MapInitEvent args)
{
if (!TryComp<BodyComponent>(ent, out var body))
return;
var brains = _body.GetBodyOrganEntityComps<InputMoverComponent>((ent.Owner, body));
foreach (var brain in brains)
{
EnsureComp<UnborgableComponent>(brain);
}
}
private void OnExamined(Entity<UnborgableComponent> ent, ref ExaminedEvent args)
{
// need a health analyzer to see if someone can't be borged, can't just look at them and know
if (!args.IsInDetailsRange || HasComp<BodyComponent>(ent))
return;
args.PushMarkup(Loc.GetString("brain-cannot-be-borged-message"));
}
}

View File

@ -1,3 +1,5 @@
borg-type-security-name = Security
borg-type-security-desc = Assist security in the fight for justice by detaining dangerous criminals.
borg-type-security-transponder = security cyborg
brain-cannot-be-borged-message = [color=red]This brain is damaged beyond use.[/color]

View File

@ -0,0 +1 @@
health-analyzer-window-entity-unborgable-text = [color=red]Patient's brain signatures are incompatible with MMI technology![/color]

View File

@ -32,3 +32,6 @@ trait-inpain-desc = Youre constantly in discomfort. You need painkillers to f
trait-addicted-name = Addicted
trait-addicted-desc = You crave the substance, and your thoughts keep drifting back to it. Without it, you feel incomplete, anxious, and on edge.
trait-unborgable-name = Machine Incompatible
trait-unborgable-desc = Your brain cannot be put into a man-machine interface.

View File

@ -41,6 +41,9 @@
whitelist:
components:
- Brain
blacklist: # DeltaV
components:
- Unborgable
- type: ContainerContainer
containers:
brain_slot: !type:ContainerSlot

View File

@ -22,3 +22,11 @@
category: Disabilities
components:
- type: Pain
- type: trait
id: Unborgable
name: trait-unborgable-name
description: trait-unborgable-desc
category: Disabilities
components:
- type: Unborgable # Automatically gets moved to the brain