using Content.Server.Body.Systems; using Content.Server.Nutrition.EntitySystems; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; using Content.Shared.Whitelist; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Server.Body.Components { [RegisterComponent, 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); /// /// 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 = BloodstreamComponent.DefaultChemicalsSolutionName; /// /// 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; /// /// 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; } } }