From 9aeb4b4ac5b68270032ca23b21d30b3fb8817c93 Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Thu, 25 Jun 2026 10:23:34 -0500 Subject: [PATCH 01/17] add detritivore metabolizer --- Resources/Locale/en-US/_DEN/metabolism/metabolizer-types.ftl | 1 + Resources/Prototypes/_DEN/Chemistry/metabolizer_types.yml | 5 +++++ 2 files changed, 6 insertions(+) create mode 100644 Resources/Locale/en-US/_DEN/metabolism/metabolizer-types.ftl create mode 100644 Resources/Prototypes/_DEN/Chemistry/metabolizer_types.yml diff --git a/Resources/Locale/en-US/_DEN/metabolism/metabolizer-types.ftl b/Resources/Locale/en-US/_DEN/metabolism/metabolizer-types.ftl new file mode 100644 index 0000000000..b3b8f03590 --- /dev/null +++ b/Resources/Locale/en-US/_DEN/metabolism/metabolizer-types.ftl @@ -0,0 +1 @@ +metabolizer-type-detritivore = Detritivore diff --git a/Resources/Prototypes/_DEN/Chemistry/metabolizer_types.yml b/Resources/Prototypes/_DEN/Chemistry/metabolizer_types.yml new file mode 100644 index 0000000000..0f38c926ad --- /dev/null +++ b/Resources/Prototypes/_DEN/Chemistry/metabolizer_types.yml @@ -0,0 +1,5 @@ +# Hardy digestion for trash eaters and decomposers. +# Can consume gastrotoxin and mold safely, and derive nutrition from doing so. +- type: metabolizerType + id: Detritivore + name: metabolizer-type-detritivore From 55bc1c173e9c535ccc962280a36ca9e4ae62bca5 Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Thu, 25 Jun 2026 11:23:11 -0500 Subject: [PATCH 02/17] allow detritivores to digest mold and gastrotoxin --- Resources/Prototypes/Reagents/toxins.yml | 34 +++++++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index 670baa829b..3fdda2c57d 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -93,6 +93,10 @@ Bloodstream: effects: - !type:HealthChange + conditions: # DEN: Detritivore metabolism + - !type:MetabolizerTypeCondition + type: [ Detritivore ] + inverted: true damage: types: Poison: 2 @@ -101,7 +105,16 @@ - !type:ReagentCondition reagent: GastroToxin min: 2 + - !type:MetabolizerTypeCondition # DEN: Detritivore metabolism + type: [ Detritivore ] + inverted: true probability: 0.2 + Digestion: # DEN: Detritivores can digest gastrotoxin. + effects: + - !type:SatiateHunger + conditions: + - !type:MetabolizerTypeCondition + type: [Detritivore] - type: reagent id: Mold @@ -116,9 +129,19 @@ Bloodstream: effects: - !type:HealthChange + conditions: # DEN: Detritivore metabolism + - !type:MetabolizerTypeCondition + type: [ Detritivore ] + inverted: true damage: types: Poison: 1 + Digestion: # DEN: Detritivores can digest mold. + effects: + - !type:SatiateHunger + conditions: + - !type:MetabolizerTypeCondition + type: [Detritivore] - type: reagent id: PolytrinicAcid @@ -488,7 +511,7 @@ - !type:PopupMessage conditions: - !type:MetabolizerTypeCondition - type: [ Animal, Vox ] + type: [ Animal, Vox, Detritivore ] # DEN: Add Detritivore inverted: true type: Local visualType: MediumCaution @@ -498,12 +521,12 @@ probability: 0.1 conditions: - !type:MetabolizerTypeCondition - type: [ Animal, Vox, Plant ] + type: [ Animal, Vox, Plant, Detritivore ] # DEN: Add Detritivore inverted: true - !type:HealthChange conditions: - !type:MetabolizerTypeCondition - type: [ Animal, Vox, Plant ] + type: [ Animal, Vox, Plant, Detritivore ] # DEN: Add Detritivore inverted: true damage: types: @@ -518,13 +541,16 @@ - !type:AdjustReagent conditions: - !type:MetabolizerTypeCondition - type: [ Animal ] + type: [ Animal, Detritivore ] # DEN: Add Detritivore reagent: Protein amount: 0.5 - !type:AdjustReagent conditions: - !type:MetabolizerTypeCondition type: [ Vox ] + - !type:MetabolizerTypeCondition # DEN: Prevent redundant metabolism for detritivore vox + type: [ Detritivore ] + inverted: true reagent: Protein amount: 0.25 From 70d4fe9feb95b40ff2e4cbe95b78f00ef9077f50 Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Sat, 27 Jun 2026 10:58:47 -0500 Subject: [PATCH 03/17] allow detritivores to digest vent crud + trash --- Resources/Prototypes/Reagents/toxins.yml | 38 ++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index 3fdda2c57d..fb1d6c39e8 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -477,6 +477,17 @@ damage: types: Poison: 2 + conditions: # DEN: Detritivores aren't poisoned by vent crud + - !type:MetabolizerTypeCondition + type: [Detritivore] + inverted: true + Digestion: # DEN: Detritivores can process vent crud + effects: + - !type:SatiateHunger + factor: 0.5 + conditions: + - !type:MetabolizerTypeCondition + type: [Detritivore] - type: reagent id: Romerol @@ -788,6 +799,33 @@ conditions: - !type:MetabolizerTypeCondition type: [Vox] + - !type:SatiateHunger # DEN: Detritivores can process trash + factor: 0.5 + conditions: + - !type:MetabolizerTypeCondition + type: [Detritivore] + - !type:MetabolizerTypeCondition + inverted: true + type: [Vox] + Bloodstream: # DEN: Add poison effect to trash + effects: + - !type:HealthChange + damage: + types: + Poison: 2 + conditions: + - !type:MetabolizerTypeCondition + inverted: true + type: [ Vox, Detritivore ] + - !type:Vomit + probability: 0.2 + conditions: + - !type:ReagentCondition + reagent: ToxinTrash + min: 2 + - !type:MetabolizerTypeCondition # DEN: Detritivore metabolism + type: [ Vox, Detritivore ] + inverted: true - type: reagent id: Hemorrhinol From 6c395a4b5aa430b8aa6fc2d9bc976234055e4f2b Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Sat, 27 Jun 2026 11:04:54 -0500 Subject: [PATCH 04/17] whitespace --- Resources/Prototypes/Reagents/toxins.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index fb1d6c39e8..c3f9ba9fca 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -114,7 +114,7 @@ - !type:SatiateHunger conditions: - !type:MetabolizerTypeCondition - type: [Detritivore] + type: [ Detritivore ] - type: reagent id: Mold @@ -141,7 +141,7 @@ - !type:SatiateHunger conditions: - !type:MetabolizerTypeCondition - type: [Detritivore] + type: [ Detritivore ] - type: reagent id: PolytrinicAcid @@ -479,7 +479,7 @@ Poison: 2 conditions: # DEN: Detritivores aren't poisoned by vent crud - !type:MetabolizerTypeCondition - type: [Detritivore] + type: [ Detritivore ] inverted: true Digestion: # DEN: Detritivores can process vent crud effects: @@ -487,7 +487,7 @@ factor: 0.5 conditions: - !type:MetabolizerTypeCondition - type: [Detritivore] + type: [ Detritivore ] - type: reagent id: Romerol @@ -803,7 +803,7 @@ factor: 0.5 conditions: - !type:MetabolizerTypeCondition - type: [Detritivore] + type: [ Detritivore ] - !type:MetabolizerTypeCondition inverted: true type: [Vox] From bc663840751c3bd8e7c633f5984cf71db2a940a3 Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Sat, 27 Jun 2026 14:50:49 -0500 Subject: [PATCH 05/17] add metabolizer traits --- .../Metabolism/MetabolizerSystem.cs | 2 + .../_DEN/Metabolism/MetabolizerSystem.cs | 92 +++++++++++++++++++ .../TraitFunctions.Components.cs | 31 +++++++ 3 files changed, 125 insertions(+) create mode 100644 Content.Shared/_DEN/Metabolism/MetabolizerSystem.cs diff --git a/Content.Shared/Metabolism/MetabolizerSystem.cs b/Content.Shared/Metabolism/MetabolizerSystem.cs index 21de771dfc..2c8c975d08 100644 --- a/Content.Shared/Metabolism/MetabolizerSystem.cs +++ b/Content.Shared/Metabolism/MetabolizerSystem.cs @@ -40,6 +40,8 @@ public override void Initialize() SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent>(OnApplyMetabolicMultiplier); + + InitializeDen(); // DEN - metabolizer extension } private void OnMapInit(Entity ent, ref MapInitEvent args) diff --git a/Content.Shared/_DEN/Metabolism/MetabolizerSystem.cs b/Content.Shared/_DEN/Metabolism/MetabolizerSystem.cs new file mode 100644 index 0000000000..d35d68d4ec --- /dev/null +++ b/Content.Shared/_DEN/Metabolism/MetabolizerSystem.cs @@ -0,0 +1,92 @@ +using System.Linq; +using Content.Shared.Body; +using Content.Shared.Whitelist; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Metabolism; + +public sealed partial class MetabolizerSystem +{ + [Dependency] private BodySystem _body = default!; + [Dependency] private EntityWhitelistSystem _whitelist = default!; + + private void InitializeDen() + { + SubscribeLocalEvent(_body.RelayEvent); + SubscribeLocalEvent(_body.RelayEvent); + + SubscribeLocalEvent>(OnAddTraitMetabolizerEvent); + SubscribeLocalEvent>(OnRemoveTraitMetabolizerEvent); + } + + /// + /// Adds metabolizers to metabolizer organs that pass a whitelist. + /// + /// The metabolizer organ. + private void OnAddTraitMetabolizerEvent(Entity ent, + ref BodyRelayedEvent args) + { + if (args.Args.Handled + || _whitelist.IsWhitelistFail(args.Args.OrganWhitelist, ent) + || args.Args.Metabolizers.Count == 0) + return; + + var metabolizers = args.Args.Metabolizers; + + if (ent.Comp.MetabolizerTypes != null) + metabolizers = metabolizers.Union(ent.Comp.MetabolizerTypes).ToHashSet(); + + ent.Comp.MetabolizerTypes = metabolizers; + args.Args = args.Args with + { + Handled = true, + }; + } + + /// + /// Removes metabolizers from metabolizer organs that pass a whitelist. + /// + /// The metabolizer organ. + private void OnRemoveTraitMetabolizerEvent(Entity ent, + ref BodyRelayedEvent args) + { + if (args.Args.Handled + || _whitelist.IsWhitelistFail(args.Args.OrganWhitelist, ent) + || args.Args.Metabolizers.Count == 0 + || ent.Comp.MetabolizerTypes == null) + return; + + // TODO: add smarter handling for this + var metabolizers = ent.Comp.MetabolizerTypes + .Except(args.Args.Metabolizers) + .ToHashSet(); + + ent.Comp.MetabolizerTypes = metabolizers; + args.Args = args.Args with + { + Handled = true, + }; + } +} + +/// +/// An event that adds metabolizers to subscribed entities that pass the whitelist. +/// +/// The metabolizers to add. +/// The whitelist for organs to add metabolizers to. +/// Whether or not this event has been handled. +[ByRefEvent] +public record struct AddTraitMetabolizerEvent(HashSet> Metabolizers, + EntityWhitelist? OrganWhitelist = null, + bool Handled = false); + +/// +/// An event that removes metabolizers from subscribed entities that pass the whitelist. +/// +/// The metabolizers to add. +/// The whitelist for organs to add metabolizers to. +/// Whether or not this event has been handled. +[ByRefEvent] +public record struct RemoveTraitMetabolizerEvent(HashSet> Metabolizers, + EntityWhitelist? OrganWhitelist = null, + bool Handled = false); diff --git a/Content.Shared/_DEN/Traits/TraitFunctions/TraitFunctions.Components.cs b/Content.Shared/_DEN/Traits/TraitFunctions/TraitFunctions.Components.cs index a26f733ac4..7482f4cead 100644 --- a/Content.Shared/_DEN/Traits/TraitFunctions/TraitFunctions.Components.cs +++ b/Content.Shared/_DEN/Traits/TraitFunctions/TraitFunctions.Components.cs @@ -1,3 +1,5 @@ +using Content.Shared.Metabolism; +using Content.Shared.Whitelist; using JetBrains.Annotations; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.Manager; @@ -58,3 +60,32 @@ public void OnTraitRemoved(EntityUid owner, EntityManager entityManager) } } } + +/// +/// A trait that adds a metabolizer to this entity's organs. +/// +[UsedImplicitly] +public sealed partial class AddMetabolizerTrait : ITraitFunction +{ + /// + /// A set of metabolizers to add to this entity's organs. + /// + [DataField] public HashSet> MetabolizerTypes = []; + + /// + /// A whitelist of allowed organs to use for this trait. + /// + [DataField] public EntityWhitelist? OrganWhitelist = null; + + public void OnTraitAdded(EntityUid owner, EntityManager entityManager) + { + var ev = new AddTraitMetabolizerEvent(MetabolizerTypes, OrganWhitelist); + entityManager.EventBus.RaiseLocalEvent(owner, ref ev); + } + + public void OnTraitRemoved(EntityUid owner, EntityManager entityManager) + { + var ev = new RemoveTraitMetabolizerEvent(MetabolizerTypes, OrganWhitelist); + entityManager.EventBus.RaiseLocalEvent(owner, ref ev); + } +} From e34449d9fc4763fdc6f4c685af90f8b930b2e1f3 Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Sat, 27 Jun 2026 14:51:04 -0500 Subject: [PATCH 06/17] add perks trait category --- Resources/Locale/en-US/_DEN/traits/categories.ftl | 1 + Resources/Prototypes/_DEN/EntityTraits/categories.yml | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/Resources/Locale/en-US/_DEN/traits/categories.ftl b/Resources/Locale/en-US/_DEN/traits/categories.ftl index ea2c28cb06..497bc06bf7 100644 --- a/Resources/Locale/en-US/_DEN/traits/categories.ftl +++ b/Resources/Locale/en-US/_DEN/traits/categories.ftl @@ -1,2 +1,3 @@ +trait-category-perks = Perks trait-category-species-morphs = Morphotypes trait-category-species-specific = Species-specific diff --git a/Resources/Prototypes/_DEN/EntityTraits/categories.yml b/Resources/Prototypes/_DEN/EntityTraits/categories.yml index 723ce83024..43139ce980 100644 --- a/Resources/Prototypes/_DEN/EntityTraits/categories.yml +++ b/Resources/Prototypes/_DEN/EntityTraits/categories.yml @@ -1,3 +1,8 @@ +- type: traitCategory + id: Perks + name: trait-category-perks + priority: -8 + - type: traitCategory id: SpeciesMorphs name: trait-category-species-morphs From a64c766b7eb3f0c9d4fcf23b28ec8675001dab24 Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Sat, 27 Jun 2026 14:51:12 -0500 Subject: [PATCH 07/17] add detritivore trait --- Resources/Locale/en-US/_DEN/traits/perks.ftl | 4 ++++ Resources/Prototypes/_DEN/EntityTraits/perks.yml | 12 ++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 Resources/Locale/en-US/_DEN/traits/perks.ftl create mode 100644 Resources/Prototypes/_DEN/EntityTraits/perks.yml diff --git a/Resources/Locale/en-US/_DEN/traits/perks.ftl b/Resources/Locale/en-US/_DEN/traits/perks.ftl new file mode 100644 index 0000000000..ff3245b7a7 --- /dev/null +++ b/Resources/Locale/en-US/_DEN/traits/perks.ftl @@ -0,0 +1,4 @@ +trait-detritivore-name = Detritivore +trait-detritivore-desc = + You can digest gastrotoxin (rotting food), mold, and trash without being poisoned, + and sate your hunger by doing so! diff --git a/Resources/Prototypes/_DEN/EntityTraits/perks.yml b/Resources/Prototypes/_DEN/EntityTraits/perks.yml new file mode 100644 index 0000000000..c1dd8af081 --- /dev/null +++ b/Resources/Prototypes/_DEN/EntityTraits/perks.yml @@ -0,0 +1,12 @@ +- type: entityTrait + id: Detritivore + name: trait-detritivore-name + description: trait-detritivore-desc + category: Perks + requirements: + - !type:PlayerSpeciesRequirement + # species: [Rodentia] # TODO: Rodentia + inverted: true + functions: + - !type:AddMetabolizerTrait + metabolizerTypes: [Detritivore] From cbff793fd839c474e0e8a0691e9e4448892401ca Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Sat, 27 Jun 2026 15:38:18 -0500 Subject: [PATCH 08/17] increase satiation of vent crud and trash --- Resources/Prototypes/Reagents/toxins.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index c3f9ba9fca..48ebf40bfd 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -484,7 +484,7 @@ Digestion: # DEN: Detritivores can process vent crud effects: - !type:SatiateHunger - factor: 0.5 + factor: 0.75 conditions: - !type:MetabolizerTypeCondition type: [ Detritivore ] @@ -800,7 +800,7 @@ - !type:MetabolizerTypeCondition type: [Vox] - !type:SatiateHunger # DEN: Detritivores can process trash - factor: 0.5 + factor: 0.75 conditions: - !type:MetabolizerTypeCondition type: [ Detritivore ] From 30c771983b2cfd248b70a589bf90332b7dee97b1 Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Sat, 27 Jun 2026 15:44:07 -0500 Subject: [PATCH 09/17] tweaks --- Resources/Locale/en-US/_DEN/traits/perks.ftl | 4 ++-- Resources/Prototypes/_DEN/EntityTraits/perks.yml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/Locale/en-US/_DEN/traits/perks.ftl b/Resources/Locale/en-US/_DEN/traits/perks.ftl index ff3245b7a7..0ecea78cc4 100644 --- a/Resources/Locale/en-US/_DEN/traits/perks.ftl +++ b/Resources/Locale/en-US/_DEN/traits/perks.ftl @@ -1,4 +1,4 @@ trait-detritivore-name = Detritivore trait-detritivore-desc = - You can digest gastrotoxin (rotting food), mold, and trash without being poisoned, - and sate your hunger by doing so! + You can digest gastrotoxin (rotting food), mold, and trash without being + poisoned, and sate your hunger by doing so! diff --git a/Resources/Prototypes/_DEN/EntityTraits/perks.yml b/Resources/Prototypes/_DEN/EntityTraits/perks.yml index c1dd8af081..439e614d7b 100644 --- a/Resources/Prototypes/_DEN/EntityTraits/perks.yml +++ b/Resources/Prototypes/_DEN/EntityTraits/perks.yml @@ -3,10 +3,10 @@ name: trait-detritivore-name description: trait-detritivore-desc category: Perks - requirements: - - !type:PlayerSpeciesRequirement - # species: [Rodentia] # TODO: Rodentia - inverted: true + # requirements: + # - !type:PlayerSpeciesRequirement + # species: [Rodentia] # TODO: Rodentia + # inverted: true functions: - !type:AddMetabolizerTrait metabolizerTypes: [Detritivore] From 76fd5ef30cd5cff557c4535c3d3699000fc78e8c Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Sat, 27 Jun 2026 18:26:59 -0500 Subject: [PATCH 10/17] this does not need to be handled --- .../_DEN/Metabolism/MetabolizerSystem.cs | 28 +++++-------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/Content.Shared/_DEN/Metabolism/MetabolizerSystem.cs b/Content.Shared/_DEN/Metabolism/MetabolizerSystem.cs index d35d68d4ec..68d435c967 100644 --- a/Content.Shared/_DEN/Metabolism/MetabolizerSystem.cs +++ b/Content.Shared/_DEN/Metabolism/MetabolizerSystem.cs @@ -26,9 +26,8 @@ private void InitializeDen() private void OnAddTraitMetabolizerEvent(Entity ent, ref BodyRelayedEvent args) { - if (args.Args.Handled - || _whitelist.IsWhitelistFail(args.Args.OrganWhitelist, ent) - || args.Args.Metabolizers.Count == 0) + if (args.Args.Metabolizers.Count == 0 + || _whitelist.IsWhitelistFail(args.Args.OrganWhitelist, ent)) return; var metabolizers = args.Args.Metabolizers; @@ -37,10 +36,6 @@ private void OnAddTraitMetabolizerEvent(Entity ent, metabolizers = metabolizers.Union(ent.Comp.MetabolizerTypes).ToHashSet(); ent.Comp.MetabolizerTypes = metabolizers; - args.Args = args.Args with - { - Handled = true, - }; } /// @@ -50,10 +45,9 @@ private void OnAddTraitMetabolizerEvent(Entity ent, private void OnRemoveTraitMetabolizerEvent(Entity ent, ref BodyRelayedEvent args) { - if (args.Args.Handled - || _whitelist.IsWhitelistFail(args.Args.OrganWhitelist, ent) - || args.Args.Metabolizers.Count == 0 - || ent.Comp.MetabolizerTypes == null) + if (args.Args.Metabolizers.Count == 0 + || ent.Comp.MetabolizerTypes == null + || _whitelist.IsWhitelistFail(args.Args.OrganWhitelist, ent)) return; // TODO: add smarter handling for this @@ -62,10 +56,6 @@ private void OnRemoveTraitMetabolizerEvent(Entity ent, .ToHashSet(); ent.Comp.MetabolizerTypes = metabolizers; - args.Args = args.Args with - { - Handled = true, - }; } } @@ -74,19 +64,15 @@ private void OnRemoveTraitMetabolizerEvent(Entity ent, /// /// The metabolizers to add. /// The whitelist for organs to add metabolizers to. -/// Whether or not this event has been handled. [ByRefEvent] public record struct AddTraitMetabolizerEvent(HashSet> Metabolizers, - EntityWhitelist? OrganWhitelist = null, - bool Handled = false); + EntityWhitelist? OrganWhitelist = null); /// /// An event that removes metabolizers from subscribed entities that pass the whitelist. /// /// The metabolizers to add. /// The whitelist for organs to add metabolizers to. -/// Whether or not this event has been handled. [ByRefEvent] public record struct RemoveTraitMetabolizerEvent(HashSet> Metabolizers, - EntityWhitelist? OrganWhitelist = null, - bool Handled = false); + EntityWhitelist? OrganWhitelist = null); From d1ffdd7823ca2cb85cc58af906961dfe2cca24d3 Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Sat, 27 Jun 2026 19:37:30 -0500 Subject: [PATCH 11/17] "fix" detritivore metabolism this is kind of ugly but we ball --- Resources/Prototypes/Reagents/toxins.yml | 35 ++++++++++-------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index 48ebf40bfd..26eee206c2 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -109,12 +109,11 @@ type: [ Detritivore ] inverted: true probability: 0.2 - Digestion: # DEN: Detritivores can digest gastrotoxin. - effects: - - !type:SatiateHunger - conditions: - - !type:MetabolizerTypeCondition - type: [ Detritivore ] + - !type:SatiateHunger # DEN: Detritivore metabolism + # DEN Comment: This cannot be in Digestion or the metabolism will break. + conditions: + - !type:MetabolizerTypeCondition + type: [ Detritivore ] - type: reagent id: Mold @@ -136,9 +135,8 @@ damage: types: Poison: 1 - Digestion: # DEN: Detritivores can digest mold. - effects: - - !type:SatiateHunger + - !type:SatiateHunger # DEN: Detritivores can digest mold. + # DEN Comment: This cannot be in Digestion or the metabolism will break. conditions: - !type:MetabolizerTypeCondition type: [ Detritivore ] @@ -481,13 +479,12 @@ - !type:MetabolizerTypeCondition type: [ Detritivore ] inverted: true - Digestion: # DEN: Detritivores can process vent crud - effects: - - !type:SatiateHunger - factor: 0.75 - conditions: - - !type:MetabolizerTypeCondition - type: [ Detritivore ] + - !type:SatiateHunger # DEN: Detritivores can process vent crud + # DEN Comment: This cannot be in Digestion or the metabolism will break. + factor: 0.75 + conditions: + - !type:MetabolizerTypeCondition + type: [ Detritivore ] - type: reagent id: Romerol @@ -807,9 +804,7 @@ - !type:MetabolizerTypeCondition inverted: true type: [Vox] - Bloodstream: # DEN: Add poison effect to trash - effects: - - !type:HealthChange + - !type:HealthChange # DEN: Add poison effect to trash damage: types: Poison: 2 @@ -817,7 +812,7 @@ - !type:MetabolizerTypeCondition inverted: true type: [ Vox, Detritivore ] - - !type:Vomit + - !type:Vomit # DEN: Add poison effect to trash probability: 0.2 conditions: - !type:ReagentCondition From d55119772315bf1b6837e84eff2ff68c6bee67b1 Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Mon, 29 Jun 2026 00:11:53 -0500 Subject: [PATCH 12/17] give mice and rats detritivore --- Resources/Prototypes/Body/Animals/rat.yml | 10 ++-- .../Prototypes/Entities/Mobs/NPCs/animals.yml | 2 +- .../_DEN/Body/Animals/detritivore.yml | 55 +++++++++++++++++++ 3 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 Resources/Prototypes/_DEN/Body/Animals/detritivore.yml diff --git a/Resources/Prototypes/Body/Animals/rat.yml b/Resources/Prototypes/Body/Animals/rat.yml index e8bf585c66..047df6f4c5 100644 --- a/Resources/Prototypes/Body/Animals/rat.yml +++ b/Resources/Prototypes/Body/Animals/rat.yml @@ -4,7 +4,7 @@ suffix: Rat components: - type: Metabolizer - metabolizerTypes: [ Rat ] + metabolizerTypes: [ Rat, Detritivore ] # DEN: Add Detritivore - type: entity id: BaseMobRat @@ -16,7 +16,7 @@ body_organs: !type:AllSelector children: - id: OrganRatLungs - - id: OrganAnimalHeart - - id: OrganAnimalStomach - - id: OrganAnimalLiver - - id: OrganAnimalKidneys + - id: OrganDetritivoreHeart # DEN: OrganAnimalHeart -> OrganDetritivoreHeart + - id: OrganDetritivoreStomach # DEN: OrganAnimalStomach -> OrganDetritivoreStomach + - id: OrganDetritivoreLiver # DEN: OrganAnimalLiver -> OrganDetritivoreLiver + - id: OrganDetritivoreKidneys # DEN: OrganAnimalKidneys -> OrganDetritivoreKidneys diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 748aa802c9..f99a40d071 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -1923,7 +1923,7 @@ - type: entity name: mouse - parent: [SimpleMobBase, BaseMobAnimal, SolutionVermin, BaseSlicingRefinable] + parent: [SimpleMobBase, BaseMobAnimalDetritivore, SolutionVermin, BaseSlicingRefinable] # DEN: BaseMobAnimal -> BaseMobAnimalDetritivore id: MobMouse description: Squeak! components: diff --git a/Resources/Prototypes/_DEN/Body/Animals/detritivore.yml b/Resources/Prototypes/_DEN/Body/Animals/detritivore.yml new file mode 100644 index 0000000000..0cc0d46d55 --- /dev/null +++ b/Resources/Prototypes/_DEN/Body/Animals/detritivore.yml @@ -0,0 +1,55 @@ +- type: entity + id: OrganDetritivoreMetabolizer + abstract: true + components: + - type: Metabolizer + metabolizerTypes: [ Animal, Detritivore ] + +- type: entity + parent: OrganBaseOrganic + id: OrganDetritivore + abstract: true + suffix: Detritivore + +- type: entity + parent: OrganDetritivore + id: OrganDetritivoreInternal + abstract: true + components: + - type: Sprite + sprite: Mobs/Species/Human/organs.rsi # TODO: Custom detritivore organ sprites + +- type: entity + parent: [ OrganBaseLungs, OrganDetritivoreInternal, OrganDetritivoreMetabolizer ] + id: OrganDetritivoreLungs + +- type: entity + parent: [ OrganBaseHeart, OrganDetritivoreInternal, OrganDetritivoreMetabolizer ] + id: OrganDetritivoreHeart + +- type: entity + parent: [ OrganBaseStomach, OrganDetritivoreInternal, OrganDetritivoreMetabolizer ] + id: OrganDetritivoreStomach + +- type: entity + parent: [ OrganBaseLiver, OrganDetritivoreInternal, OrganDetritivoreMetabolizer ] + id: OrganDetritivoreLiver + +- type: entity + parent: [ OrganBaseKidneys, OrganDetritivoreInternal, OrganDetritivoreMetabolizer ] + id: OrganDetritivoreKidneys + +- type: entity + abstract: true + parent: BaseMobAnimal + id: BaseMobAnimalDetritivore + components: + - type: EntityTableContainerFill + containers: + body_organs: !type:AllSelector + children: + - id: OrganDetritivoreLungs + - id: OrganDetritivoreHeart + - id: OrganDetritivoreStomach + - id: OrganDetritivoreLiver + - id: OrganDetritivoreKidneys From e81cc5e44e823bf84330fefe132f61c6964a4754 Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Mon, 29 Jun 2026 00:17:31 -0500 Subject: [PATCH 13/17] elaboration --- .../_DEN/Traits/TraitFunctions/TraitFunctions.Components.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Content.Shared/_DEN/Traits/TraitFunctions/TraitFunctions.Components.cs b/Content.Shared/_DEN/Traits/TraitFunctions/TraitFunctions.Components.cs index 7482f4cead..a01775f5ea 100644 --- a/Content.Shared/_DEN/Traits/TraitFunctions/TraitFunctions.Components.cs +++ b/Content.Shared/_DEN/Traits/TraitFunctions/TraitFunctions.Components.cs @@ -75,6 +75,9 @@ public sealed partial class AddMetabolizerTrait : ITraitFunction /// /// A whitelist of allowed organs to use for this trait. /// + /// + /// For example: you can have this only apply to the heart or lungs by whitelisting Heart or Lung components. + /// [DataField] public EntityWhitelist? OrganWhitelist = null; public void OnTraitAdded(EntityUid owner, EntityManager entityManager) From d580a25b69be2e8c1d64cacc5f9be7a1a98419b9 Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Mon, 29 Jun 2026 08:30:23 -0500 Subject: [PATCH 14/17] rename proto --- Resources/Prototypes/Entities/Mobs/NPCs/animals.yml | 2 +- Resources/Prototypes/_DEN/Body/Animals/detritivore.yml | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index f99a40d071..0ffe521e31 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -1923,7 +1923,7 @@ - type: entity name: mouse - parent: [SimpleMobBase, BaseMobAnimalDetritivore, SolutionVermin, BaseSlicingRefinable] # DEN: BaseMobAnimal -> BaseMobAnimalDetritivore + parent: [SimpleMobBase, BaseMobDetritivore, SolutionVermin, BaseSlicingRefinable] # DEN: BaseMobAnimal -> BaseMobDetritivore id: MobMouse description: Squeak! components: diff --git a/Resources/Prototypes/_DEN/Body/Animals/detritivore.yml b/Resources/Prototypes/_DEN/Body/Animals/detritivore.yml index 0cc0d46d55..bedc7db9ec 100644 --- a/Resources/Prototypes/_DEN/Body/Animals/detritivore.yml +++ b/Resources/Prototypes/_DEN/Body/Animals/detritivore.yml @@ -41,9 +41,9 @@ - type: entity abstract: true - parent: BaseMobAnimal - id: BaseMobAnimalDetritivore + id: BaseMobDetritivore components: + - type: Body - type: EntityTableContainerFill containers: body_organs: !type:AllSelector @@ -53,3 +53,9 @@ - id: OrganDetritivoreStomach - id: OrganDetritivoreLiver - id: OrganDetritivoreKidneys + - type: ContainerContainer + containers: + languages: !type:Container + - type: LanguageCommunicator + languages: + Animal: [ true, Fluent ] From d468765e7b39c032fc96e34b432d03ea00cad025 Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Mon, 29 Jun 2026 08:41:00 -0500 Subject: [PATCH 15/17] i ficked it --- Resources/Prototypes/Entities/Mobs/NPCs/animals.yml | 2 +- Resources/Prototypes/_DEN/Body/Animals/detritivore.yml | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 0ffe521e31..c01cd3367b 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -1923,7 +1923,7 @@ - type: entity name: mouse - parent: [SimpleMobBase, BaseMobDetritivore, SolutionVermin, BaseSlicingRefinable] # DEN: BaseMobAnimal -> BaseMobDetritivore + parent: [BaseMobDetritivore, SimpleMobBase, SolutionVermin, BaseSlicingRefinable] # DEN: BaseMobAnimal -> BaseMobDetritivore id: MobMouse description: Squeak! components: diff --git a/Resources/Prototypes/_DEN/Body/Animals/detritivore.yml b/Resources/Prototypes/_DEN/Body/Animals/detritivore.yml index bedc7db9ec..afdcdcae9a 100644 --- a/Resources/Prototypes/_DEN/Body/Animals/detritivore.yml +++ b/Resources/Prototypes/_DEN/Body/Animals/detritivore.yml @@ -43,7 +43,6 @@ abstract: true id: BaseMobDetritivore components: - - type: Body - type: EntityTableContainerFill containers: body_organs: !type:AllSelector @@ -53,9 +52,3 @@ - id: OrganDetritivoreStomach - id: OrganDetritivoreLiver - id: OrganDetritivoreKidneys - - type: ContainerContainer - containers: - languages: !type:Container - - type: LanguageCommunicator - languages: - Animal: [ true, Fluent ] From c1c3f492cd178f57eb78c798b474bc070ef3eccc Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Mon, 29 Jun 2026 08:44:08 -0500 Subject: [PATCH 16/17] comment --- Resources/Prototypes/_DEN/Chemistry/metabolizer_types.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/_DEN/Chemistry/metabolizer_types.yml b/Resources/Prototypes/_DEN/Chemistry/metabolizer_types.yml index 0f38c926ad..0dcce66e56 100644 --- a/Resources/Prototypes/_DEN/Chemistry/metabolizer_types.yml +++ b/Resources/Prototypes/_DEN/Chemistry/metabolizer_types.yml @@ -1,5 +1,5 @@ # Hardy digestion for trash eaters and decomposers. -# Can consume gastrotoxin and mold safely, and derive nutrition from doing so. +# Can consume gastrotoxin, trash, and mold safely, and derive nutrition from doing so. - type: metabolizerType id: Detritivore name: metabolizer-type-detritivore From 7cdf7752771239ec2e04c12d6fd733e1e96d4b3b Mon Sep 17 00:00:00 2001 From: portfiend <109661617+portfiend@users.noreply.github.com> Date: Wed, 1 Jul 2026 07:23:26 -0500 Subject: [PATCH 17/17] predict metabolism types --- Content.Shared/Metabolism/MetabolizerComponent.cs | 1 + Content.Shared/_DEN/Metabolism/MetabolizerSystem.cs | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Content.Shared/Metabolism/MetabolizerComponent.cs b/Content.Shared/Metabolism/MetabolizerComponent.cs index 263816be69..3143f16474 100644 --- a/Content.Shared/Metabolism/MetabolizerComponent.cs +++ b/Content.Shared/Metabolism/MetabolizerComponent.cs @@ -85,6 +85,7 @@ public sealed partial class MetabolizerComponent : Component /// [DataField] [Access(typeof(MetabolizerSystem), Other = AccessPermissions.ReadExecute)] // FIXME Friends + [AutoNetworkedField] // DEN public HashSet>? MetabolizerTypes; /// diff --git a/Content.Shared/_DEN/Metabolism/MetabolizerSystem.cs b/Content.Shared/_DEN/Metabolism/MetabolizerSystem.cs index 68d435c967..5e059f331b 100644 --- a/Content.Shared/_DEN/Metabolism/MetabolizerSystem.cs +++ b/Content.Shared/_DEN/Metabolism/MetabolizerSystem.cs @@ -36,6 +36,7 @@ private void OnAddTraitMetabolizerEvent(Entity ent, metabolizers = metabolizers.Union(ent.Comp.MetabolizerTypes).ToHashSet(); ent.Comp.MetabolizerTypes = metabolizers; + Dirty(ent); } /// @@ -56,6 +57,7 @@ private void OnRemoveTraitMetabolizerEvent(Entity ent, .ToHashSet(); ent.Comp.MetabolizerTypes = metabolizers; + Dirty(ent); } }