using Content.Shared.Body.Systems; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; using Content.Shared.Nutrition.EntitySystems; using Content.Shared.Whitelist; using Robust.Shared.GameStates; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Shared.Body.Components { [RegisterComponent, NetworkedComponent, Access(typeof(StomachSystem), typeof(FoodSystem))] public sealed partial class StomachComponent : Component { /// /// The next time that the stomach will try to digest its contents. /// [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] public TimeSpan NextUpdate; /// /// The interval at which this stomach digests its contents. /// [DataField] public TimeSpan UpdateInterval = TimeSpan.FromSeconds(1); /// /// Multiplier applied to for adjusting based on metabolic rate multiplier. /// [DataField] public float UpdateIntervalMultiplier = 1f; /// /// Adjusted update interval based off of the multiplier value. /// [ViewVariables] public TimeSpan AdjustedUpdateInterval => UpdateInterval * UpdateIntervalMultiplier; /// /// The solution inside of this stomach this transfers reagents to the body. /// [ViewVariables] public Entity? Solution; /// /// What solution should this stomach push reagents into, on the body? /// [DataField] public string BodySolutionName = "chemicals"; /// /// Time between reagents being ingested and them being /// transferred to /// [DataField] public TimeSpan DigestionDelay = TimeSpan.FromSeconds(20); /// /// A whitelist for what special-digestible-required foods this stomach is capable of eating. /// [DataField] public EntityWhitelist? SpecialDigestible = null; /// /// Controls whitelist behavior. If true, this stomach can digest only food that passes the whitelist. If false, it can digest normal food and any food that passes the whitelist. /// [DataField] public bool IsSpecialDigestibleExclusive = true; /// /// Used to track how long each reagent has been in the stomach /// [ViewVariables] public readonly List ReagentDeltas = new(); /// /// Used to track quantity changes when ingesting & digesting reagents /// public sealed class ReagentDelta { public readonly ReagentQuantity ReagentQuantity; public TimeSpan Lifetime { get; private set; } public ReagentDelta(ReagentQuantity reagentQuantity) { ReagentQuantity = reagentQuantity; Lifetime = TimeSpan.Zero; } public void Increment(TimeSpan delta) => Lifetime += delta; } } }