From b08dcd79eb2aa5acee433fef261cc459b6b38554 Mon Sep 17 00:00:00 2001
From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>
Date: Fri, 18 Sep 2026 22:35:09 +0000
Subject: [PATCH] Examinable Changeling Doafters (#46052)
yay!
---
.../Components/ChangelingDevourComponent.cs | 12 ++++++++++++
.../Components/ChangelingTransformComponent.cs | 10 ++++++++--
.../Changeling/Systems/ChangelingDevourSystem.cs | 2 ++
.../Changeling/Systems/ChangelingTransformSystem.cs | 1 +
Resources/Locale/en-US/changeling/changeling.ftl | 5 +++++
5 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/Content.Shared/Changeling/Components/ChangelingDevourComponent.cs b/Content.Shared/Changeling/Components/ChangelingDevourComponent.cs
index 66d05175b3..15cc1b7d18 100644
--- a/Content.Shared/Changeling/Components/ChangelingDevourComponent.cs
+++ b/Content.Shared/Changeling/Components/ChangelingDevourComponent.cs
@@ -142,6 +142,18 @@ public sealed partial class ChangelingDevourComponent : Component
{ "ChangelingDNA", 10 }
};
+ ///
+ /// What to show on examine while the changeling's devour is in the windup stage.
+ ///
+ [DataField]
+ public LocId? WindupExamine = "changeling-devour-doafter-windup";
+
+ ///
+ /// What to show on examine while the changeling is currently devouring somebody.
+ ///
+ [DataField]
+ public LocId? DevourExamine = "changeling-devour-doafter";
+
public override bool SendOnlyToOwner => true;
}
diff --git a/Content.Shared/Changeling/Components/ChangelingTransformComponent.cs b/Content.Shared/Changeling/Components/ChangelingTransformComponent.cs
index 5446f1b849..6ca3702a34 100644
--- a/Content.Shared/Changeling/Components/ChangelingTransformComponent.cs
+++ b/Content.Shared/Changeling/Components/ChangelingTransformComponent.cs
@@ -50,12 +50,18 @@ public sealed partial class ChangelingTransformComponent : Component
///
public ProtoId TransformCloningSettings = "ChangelingCloningSettings";
- public override bool SendOnlyToOwner => true;
-
///
/// If true, then the changeling can manually drop identities. If false, then whenever they transform, the changeling will drop their former identity.
///
[DataField, AutoNetworkedField]
public bool ManualDrop = true;
+
+ ///
+ /// Examine text to show when the changeling is currently transforming.
+ ///
+ [DataField]
+ public LocId? TransformExamine = "changeling-transform-doafter";
+
+ public override bool SendOnlyToOwner => true;
}
diff --git a/Content.Shared/Changeling/Systems/ChangelingDevourSystem.cs b/Content.Shared/Changeling/Systems/ChangelingDevourSystem.cs
index a95fef39ca..119f53699a 100644
--- a/Content.Shared/Changeling/Systems/ChangelingDevourSystem.cs
+++ b/Content.Shared/Changeling/Systems/ChangelingDevourSystem.cs
@@ -90,6 +90,7 @@ public sealed partial class ChangelingDevourSystem : EntitySystem
BreakOnMove = true,
CancelDuplicate = true,
DuplicateCondition = DuplicateConditions.None,
+ ExamineText = ent.Comp.WindupExamine == null ? null : Loc.GetString(ent.Comp.WindupExamine, ("user", Identity.Entity(ent, EntityManager)), ("target", Identity.Entity(target, EntityManager)))
});
var selfMessage = Loc.GetString("changeling-devour-begin-windup-self", ("user", Identity.Entity(ent.Owner, EntityManager)));
@@ -142,6 +143,7 @@ public sealed partial class ChangelingDevourSystem : EntitySystem
BreakOnMove = true,
CancelDuplicate = true,
DuplicateCondition = DuplicateConditions.None,
+ ExamineText = ent.Comp.DevourExamine == null ? null : Loc.GetString(ent.Comp.DevourExamine, ("user", Identity.Entity(ent, EntityManager)), ("target", Identity.Entity(target, EntityManager)))
});
}
diff --git a/Content.Shared/Changeling/Systems/ChangelingTransformSystem.cs b/Content.Shared/Changeling/Systems/ChangelingTransformSystem.cs
index 63d5e81ddd..c2841f2b97 100644
--- a/Content.Shared/Changeling/Systems/ChangelingTransformSystem.cs
+++ b/Content.Shared/Changeling/Systems/ChangelingTransformSystem.cs
@@ -161,6 +161,7 @@ public sealed partial class ChangelingTransformSystem : EntitySystem
DuplicateCondition = DuplicateConditions.None,
RequireCanInteract = false,
DistanceThreshold = null,
+ ExamineText = ent.Comp.TransformExamine == null ? null : Loc.GetString(ent.Comp.TransformExamine, ("user", Identity.Entity(ent, EntityManager)))
});
}
diff --git a/Resources/Locale/en-US/changeling/changeling.ftl b/Resources/Locale/en-US/changeling/changeling.ftl
index 849f509a57..2d8e0943f5 100644
--- a/Resources/Locale/en-US/changeling/changeling.ftl
+++ b/Resources/Locale/en-US/changeling/changeling.ftl
@@ -18,10 +18,15 @@ changeling-devour-begin-consume-others = { CAPITALIZE(POSS-ADJ($user)) } uncanny
changeling-devour-consume-complete-self = Our uncanny mouth retreats, biomass consumed.
changeling-devour-consume-complete-others = { CAPITALIZE(POSS-ADJ($user)) } uncanny mouth retreats.
+changeling-devour-doafter-windup = [color=red]{ CAPITALIZE(POSS-ADJ($user)) } face is splitting open, preparing to feast![/color]
+changeling-devour-doafter = [color=red]{ CAPITALIZE(SUBJECT($user)) } { CONJUGATE-BE($user) } tearing into the flesh of {$target}![/color]
+
# transformation
changeling-transform-attempt-self = Our bones snap, muscles tear, one flesh becomes another.
changeling-transform-attempt-others = { CAPITALIZE(POSS-ADJ($user)) } bones snap, muscles tear, body shifts into another.
+changeling-transform-doafter = [color=red]The surface of { POSS-ADJ($user) } skin is melting, taking another shape.[/color]
+
# transformation BUI
changeling-transform-bui-select-entity = {$entity}
changeling-transform-bui-drop-identity-menu = Drop a devoured identity from your memory.