]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Delete FoodComponent, migrate prototypes to EdibleComponent (#41070)
authorāda <ss.adasts@gmail.com>
Fri, 24 Oct 2025 18:32:14 +0000 (13:32 -0500)
committerGitHub <noreply@github.com>
Fri, 24 Oct 2025 18:32:14 +0000 (18:32 +0000)
* yml

* yml fixes

* cs

* document regression

* comment

* organs fix

* diona consistency

* push

---------

Co-authored-by: iaada <iaada@users.noreply.github.com>
Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
30 files changed:
Content.Server/Crayon/CrayonSystem.cs
Content.Server/Nutrition/Components/BadFoodComponent.cs
Content.Server/Nutrition/Components/IgnoreBadFoodComponent.cs
Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs
Content.Shared/Body/Components/StomachComponent.cs
Content.Shared/Nutrition/Components/FoodComponent.cs [deleted file]
Content.Shared/Nutrition/EntitySystems/FoodSystem.cs [deleted file]
Resources/Prototypes/Body/Organs/Animal/animal.yml
Resources/Prototypes/Body/Organs/Animal/ruminant.yml
Resources/Prototypes/Body/Organs/Animal/slimes.yml
Resources/Prototypes/Body/Organs/arachnid.yml
Resources/Prototypes/Body/Organs/diona.yml
Resources/Prototypes/Body/Organs/human.yml
Resources/Prototypes/Entities/Clothing/Eyes/hud.yml
Resources/Prototypes/Entities/Mobs/NPCs/animals.yml
Resources/Prototypes/Entities/Mobs/NPCs/scurret.yml
Resources/Prototypes/Entities/Mobs/NPCs/space.yml
Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml
Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml
Resources/Prototypes/Entities/Objects/Consumable/Food/cottonburger.yml
Resources/Prototypes/Entities/Objects/Consumable/Food/egg.yml
Resources/Prototypes/Entities/Objects/Fun/error.yml
Resources/Prototypes/Entities/Objects/Fun/toys.yml
Resources/Prototypes/Entities/Objects/Misc/kudzu.yml
Resources/Prototypes/Entities/Objects/Misc/paper.yml
Resources/Prototypes/Entities/Objects/Specific/Hydroponics/leaves.yml
Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml
Resources/Prototypes/Entities/Objects/Specific/rehydrateable.yml
Resources/Prototypes/Entities/Objects/Tools/lighters.yml
Resources/Prototypes/Entities/Structures/spider_web.yml

index 07b580fba56665832a0e1189854c066203c526ac..e6f96c5abe6f5c6f05c8109bd60babb50bbb0d39 100644 (file)
@@ -34,8 +34,8 @@ public sealed class CrayonSystem : SharedCrayonSystem
         SubscribeLocalEvent<CrayonComponent, MapInitEvent>(OnMapInit);
         SubscribeLocalEvent<CrayonComponent, CrayonSelectMessage>(OnCrayonBoundUI);
         SubscribeLocalEvent<CrayonComponent, CrayonColorMessage>(OnCrayonBoundUIColor);
-        SubscribeLocalEvent<CrayonComponent, UseInHandEvent>(OnCrayonUse, before: new[] { typeof(FoodSystem) });
-        SubscribeLocalEvent<CrayonComponent, AfterInteractEvent>(OnCrayonAfterInteract, after: new[] { typeof(FoodSystem) });
+        SubscribeLocalEvent<CrayonComponent, UseInHandEvent>(OnCrayonUse);
+        SubscribeLocalEvent<CrayonComponent, AfterInteractEvent>(OnCrayonAfterInteract, after: [typeof(IngestionSystem)]);
         SubscribeLocalEvent<CrayonComponent, DroppedEvent>(OnCrayonDropped);
     }
 
@@ -47,6 +47,7 @@ public sealed class CrayonSystem : SharedCrayonSystem
         Dirty(ent);
     }
 
+    // Runs after IngestionSystem so it doesn't bulldoze force-feeding
     private void OnCrayonAfterInteract(EntityUid uid, CrayonComponent component, AfterInteractEvent args)
     {
         if (args.Handled || !args.CanReach)
index 16f90533cba7394bafaa909d7795f09cb9819b96..40a805e43706aa73df488c09a4a47ae0530edbb7 100644 (file)
@@ -6,7 +6,5 @@ namespace Content.Server.Nutrition.Components;
 /// This component prevents NPC mobs like mice from wanting to eat something that is edible but is not exactly food.
 /// Including but not limited to: uranium, death pills, insulation
 /// </summary>
-[RegisterComponent, Access(typeof(FoodSystem))]
-public sealed partial class BadFoodComponent : Component
-{
-}
+[RegisterComponent]
+public sealed partial class BadFoodComponent : Component;
index f5b3c326f32596bf94ad4a87215ee3477c6151bf..c0f2fefce48983029ac7342b7c4f214e357ae933 100644 (file)
@@ -6,7 +6,5 @@ namespace Content.Server.Nutrition.Components;
 /// This component allows NPC mobs to eat food with BadFoodComponent.
 /// See MobMouseAdmeme for usage.
 /// </summary>
-[RegisterComponent, Access(typeof(FoodSystem))]
-public sealed partial class IgnoreBadFoodComponent : Component
-{
-}
+[RegisterComponent]
+public sealed partial class IgnoreBadFoodComponent : Component;
index 7164c701f548151c10ec0962128c17b082daa545..33b619732d2aa73e753b2312bd2d9956fc8b5f3d 100644 (file)
@@ -33,8 +33,6 @@ namespace Content.Server.Nutrition.EntitySystems
         {
             base.Initialize();
 
-            // activate BEFORE entity is deleted and trash is spawned
-            SubscribeLocalEvent<CreamPieComponent, ConsumeDoAfterEvent>(OnConsume, before: [typeof(FoodSystem)]);
             SubscribeLocalEvent<CreamPieComponent, SliceFoodEvent>(OnSlice);
 
             SubscribeLocalEvent<CreamPiedComponent, RejuvenateEvent>(OnRejuvenate);
@@ -59,10 +57,10 @@ namespace Content.Server.Nutrition.EntitySystems
             QueueDel(entity);
         }
 
-        private void OnConsume(Entity<CreamPieComponent> entity, ref ConsumeDoAfterEvent args)
-        {
-            ActivatePayload(entity);
-        }
+        // TODO
+        // A regression occured here. Previously creampies would activate their hidden payload if you tried to eat them.
+        // However, the refactor to IngestionSystem caused the event to not be reached,
+        // because eating is blocked if an item is inside the food.
 
         private void OnSlice(Entity<CreamPieComponent> entity, ref SliceFoodEvent args)
         {
index 1b2f58782409e6e681dc024f0c9b21d28b7adc2c..ca20cc544a815d8e2337d2338ade480501af15fe 100644 (file)
@@ -8,7 +8,7 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
 
 namespace Content.Shared.Body.Components
 {
-    [RegisterComponent, NetworkedComponent, Access(typeof(StomachSystem), typeof(FoodSystem))]
+    [RegisterComponent, NetworkedComponent, Access(typeof(StomachSystem))]
     public sealed partial class StomachComponent : Component
     {
         /// <summary>
diff --git a/Content.Shared/Nutrition/Components/FoodComponent.cs b/Content.Shared/Nutrition/Components/FoodComponent.cs
deleted file mode 100644 (file)
index bb135a4..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-using Content.Shared.Body.Components;
-using Content.Shared.FixedPoint;
-using Content.Shared.Nutrition.EntitySystems;
-using Robust.Shared.Audio;
-using Robust.Shared.Prototypes;
-
-namespace Content.Shared.Nutrition.Components;
-[Obsolete("Migration to Content.Shared.Nutrition.Components.EdibleComponent is required")]
-[RegisterComponent, Access(typeof(FoodSystem), typeof(FoodSequenceSystem))]
-public sealed partial class FoodComponent : Component
-{
-    [DataField]
-    public string Solution = "food";
-
-    [DataField]
-    public SoundSpecifier UseSound = new SoundCollectionSpecifier("eating");
-
-    [DataField]
-    public List<EntProtoId> Trash = new();
-
-    [DataField]
-    public FixedPoint2? TransferAmount = FixedPoint2.New(5);
-
-    /// <summary>
-    /// Acceptable utensil to use
-    /// </summary>
-    [DataField]
-    public UtensilType Utensil = UtensilType.Fork; //There are more "solid" than "liquid" food
-
-    /// <summary>
-    /// Is utensil required to eat this food
-    /// </summary>
-    [DataField]
-    public bool UtensilRequired;
-
-    /// <summary>
-    ///     If this is set to true, food can only be eaten if you have a stomach with a
-    ///     <see cref="StomachComponent.SpecialDigestible"/> that includes this entity in its whitelist,
-    ///     rather than just being digestible by anything that can eat food.
-    ///     Whitelist the food component to allow eating of normal food.
-    /// </summary>
-    [DataField]
-    public bool RequiresSpecialDigestion;
-
-    /// <summary>
-    /// The localization identifier for the eat message. Needs a "food" entity argument passed to it.
-    /// </summary>
-    [DataField]
-    public LocId EatMessage = "edible-nom";
-
-    /// <summary>
-    /// How long it takes to eat the food personally.
-    /// </summary>
-    [DataField]
-    public float Delay = 1;
-
-    /// <summary>
-    ///     This is how many seconds it takes to force feed someone this food.
-    ///     Should probably be smaller for small items like pills.
-    /// </summary>
-    [DataField]
-    public float ForceFeedDelay = 3;
-
-    /// <summary>
-    /// For mobs that are food, requires killing them before eating.
-    /// </summary>
-    [DataField, ViewVariables(VVAccess.ReadWrite)]
-    public bool RequireDead = true;
-}
diff --git a/Content.Shared/Nutrition/EntitySystems/FoodSystem.cs b/Content.Shared/Nutrition/EntitySystems/FoodSystem.cs
deleted file mode 100644 (file)
index a599a1e..0000000
+++ /dev/null
@@ -1,253 +0,0 @@
-using Content.Shared.Administration.Logs;
-using Content.Shared.Chemistry.EntitySystems;
-using Content.Shared.Database;
-using Content.Shared.Forensics;
-using Content.Shared.Hands.EntitySystems;
-using Content.Shared.IdentityManagement;
-using Content.Shared.Interaction;
-using Content.Shared.Interaction.Events;
-using Content.Shared.Inventory;
-using Content.Shared.Mobs.Systems;
-using Content.Shared.Nutrition.Components;
-using Content.Shared.Popups;
-using Content.Shared.Verbs;
-using Robust.Shared.Audio;
-using Robust.Shared.Audio.Systems;
-
-namespace Content.Shared.Nutrition.EntitySystems;
-
-/// <summary>
-/// Handles feeding attempts both on yourself and on the target.
-/// </summary>
-[Obsolete("Migration to Content.Shared.Nutrition.EntitySystems.IngestionSystem is required")]
-public sealed class FoodSystem : EntitySystem
-{
-    [Dependency] private readonly FlavorProfileSystem _flavorProfile = default!;
-    [Dependency] private readonly IngestionSystem _ingestion = default!;
-    [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
-    [Dependency] private readonly MobStateSystem _mobState = default!;
-    [Dependency] private readonly SharedPopupSystem _popup = default!;
-    [Dependency] private readonly SharedAudioSystem _audio = default!;
-    [Dependency] private readonly SharedHandsSystem _hands = default!;
-    [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!;
-    [Dependency] private readonly SharedTransformSystem _transform = default!;
-
-    public const float MaxFeedDistance = 1.0f;
-
-    public override void Initialize()
-    {
-        base.Initialize();
-
-        SubscribeLocalEvent<FoodComponent, UseInHandEvent>(OnUseFoodInHand, after: new[] { typeof(OpenableSystem), typeof(InventorySystem) });
-        SubscribeLocalEvent<FoodComponent, AfterInteractEvent>(OnFeedFood);
-
-        SubscribeLocalEvent<FoodComponent, GetVerbsEvent<AlternativeVerb>>(AddEatVerb);
-
-        SubscribeLocalEvent<FoodComponent, BeforeIngestedEvent>(OnBeforeFoodEaten);
-        SubscribeLocalEvent<FoodComponent, IngestedEvent>(OnFoodEaten);
-        SubscribeLocalEvent<FoodComponent, FullyEatenEvent>(OnFoodFullyEaten);
-
-        SubscribeLocalEvent<FoodComponent, GetUtensilsEvent>(OnGetUtensils);
-
-        SubscribeLocalEvent<FoodComponent, IsDigestibleEvent>(OnIsFoodDigestible);
-
-        SubscribeLocalEvent<FoodComponent, EdibleEvent>(OnFood);
-
-        SubscribeLocalEvent<FoodComponent, GetEdibleTypeEvent>(OnGetEdibleType);
-
-        SubscribeLocalEvent<FoodComponent, BeforeFullySlicedEvent>(OnBeforeFullySliced);
-    }
-
-    /// <summary>
-    /// Eat or drink an item
-    /// </summary>
-    private void OnUseFoodInHand(Entity<FoodComponent> entity, ref UseInHandEvent ev)
-    {
-        if (ev.Handled)
-            return;
-
-        ev.Handled = _ingestion.TryIngest(ev.User, ev.User, entity);
-    }
-
-    /// <summary>
-    /// Feed someone else
-    /// </summary>
-    private void OnFeedFood(Entity<FoodComponent> entity, ref AfterInteractEvent args)
-    {
-        if (args.Handled || args.Target == null || !args.CanReach)
-            return;
-
-        args.Handled = _ingestion.TryIngest(args.User, args.Target.Value, entity);
-    }
-
-    private void AddEatVerb(Entity<FoodComponent> entity, ref GetVerbsEvent<AlternativeVerb> args)
-    {
-        var user = args.User;
-
-        if (entity.Owner == user || !args.CanInteract || !args.CanAccess)
-            return;
-
-        if (!_ingestion.TryGetIngestionVerb(user, entity, IngestionSystem.Food, out var verb))
-            return;
-
-        args.Verbs.Add(verb);
-    }
-
-    private void OnBeforeFoodEaten(Entity<FoodComponent> food, ref BeforeIngestedEvent args)
-    {
-        if (args.Cancelled || args.Solution is not { } solution)
-            return;
-
-        // Set it to transfer amount if it exists, otherwise eat the whole volume if possible.
-        args.Transfer = food.Comp.TransferAmount ?? solution.Volume;
-    }
-
-    private void OnFoodEaten(Entity<FoodComponent> entity, ref IngestedEvent args)
-    {
-        if (args.Handled)
-            return;
-
-        args.Handled = true;
-
-        _audio.PlayPredicted(entity.Comp.UseSound, args.Target, args.User, AudioParams.Default.WithVolume(-1f).WithVariation(0.20f));
-
-        var flavors = _flavorProfile.GetLocalizedFlavorsMessage(entity.Owner, args.Target, args.Split);
-
-        if (args.ForceFed)
-        {
-            var targetName = Identity.Entity(args.Target, EntityManager);
-            var userName = Identity.Entity(args.User, EntityManager);
-            _popup.PopupEntity(Loc.GetString("edible-force-feed-success", ("user", userName), ("verb", _ingestion.GetProtoVerb(IngestionSystem.Food)), ("flavors", flavors)), entity, entity);
-
-            _popup.PopupClient(Loc.GetString("edible-force-feed-success-user", ("target", targetName), ("verb", _ingestion.GetProtoVerb(IngestionSystem.Food))), args.User, args.User);
-
-            // log successful forced feeding
-            _adminLogger.Add(LogType.ForceFeed, LogImpact.Medium, $"{ToPrettyString(entity):user} forced {ToPrettyString(args.User):target} to eat {ToPrettyString(entity):food}");
-        }
-        else
-        {
-            _popup.PopupClient(Loc.GetString(entity.Comp.EatMessage, ("food", entity.Owner), ("flavors", flavors)), args.User, args.User);
-
-            // log successful voluntary eating
-            _adminLogger.Add(LogType.Ingestion, LogImpact.Low, $"{ToPrettyString(args.User):target} ate {ToPrettyString(entity):food}");
-        }
-
-        // BREAK OUR UTENSILS
-        if (_ingestion.TryGetUtensils(args.User, entity, out var utensils))
-        {
-            foreach (var utensil in utensils)
-            {
-                _ingestion.TryBreak(utensil, args.User);
-            }
-        }
-
-        if (_ingestion.GetUsesRemaining(entity, entity.Comp.Solution, args.Split.Volume) > 0)
-        {
-            // Leave some of the consumer's DNA on the consumed item...
-            var ev = new TransferDnaEvent
-            {
-                Donor = args.Target,
-                Recipient = entity,
-                CanDnaBeCleaned = false,
-            };
-            RaiseLocalEvent(args.Target, ref ev);
-
-            args.Repeat = !args.ForceFed;
-            return;
-        }
-
-        // Food is always destroyed...
-        args.Destroy = true;
-    }
-
-    private void OnFoodFullyEaten(Entity<FoodComponent> food, ref FullyEatenEvent args)
-    {
-        if (food.Comp.Trash.Count == 0)
-            return;
-
-        var position = _transform.GetMapCoordinates(food);
-        var trashes = food.Comp.Trash;
-        var tryPickup = _hands.IsHolding(args.User, food, out _);
-
-        foreach (var trash in trashes)
-        {
-            var spawnedTrash = EntityManager.PredictedSpawn(trash, position);
-
-            // If the user is holding the item
-            if (tryPickup)
-            {
-                // Put the trash in the user's hand
-                _hands.TryPickupAnyHand(args.User, spawnedTrash);
-            }
-        }
-    }
-
-    private void OnFood(Entity<FoodComponent> food, ref EdibleEvent args)
-    {
-        if (args.Cancelled)
-            return;
-
-        if (args.Cancelled || args.Solution != null)
-            return;
-
-        if (food.Comp.UtensilRequired && !_ingestion.HasRequiredUtensils(args.User, food.Comp.Utensil))
-        {
-            args.Cancelled = true;
-            return;
-        }
-
-        // Check this last
-        _solutionContainer.TryGetSolution(food.Owner, food.Comp.Solution, out args.Solution);
-        args.Time += TimeSpan.FromSeconds(food.Comp.Delay);
-    }
-
-    private void OnGetUtensils(Entity<FoodComponent> entity, ref GetUtensilsEvent args)
-    {
-        if (entity.Comp.Utensil == UtensilType.None)
-            return;
-
-        if (entity.Comp.UtensilRequired)
-            args.AddRequiredTypes(entity.Comp.Utensil);
-        else
-            args.Types |= entity.Comp.Utensil;
-    }
-
-    // TODO: When DrinkComponent and FoodComponent are properly obseleted, make the IsDigestionBools in IngestionSystem private again.
-    private void OnIsFoodDigestible(Entity<FoodComponent> ent, ref IsDigestibleEvent args)
-    {
-        if (ent.Comp.RequireDead && _mobState.IsAlive(ent))
-            return;
-
-        args.AddDigestible(ent.Comp.RequiresSpecialDigestion);
-    }
-
-    private void OnGetEdibleType(Entity<FoodComponent> ent, ref GetEdibleTypeEvent args)
-    {
-        if (args.Type != null)
-            return;
-
-        args.SetPrototype(IngestionSystem.Food);
-    }
-
-    private void OnBeforeFullySliced(Entity<FoodComponent> food, ref BeforeFullySlicedEvent args)
-    {
-        if (food.Comp.Trash.Count == 0)
-            return;
-
-        var position = _transform.GetMapCoordinates(food);
-        var trashes = food.Comp.Trash;
-        var tryPickup = _hands.IsHolding(args.User, food, out _);
-
-        foreach (var trash in trashes)
-        {
-            var spawnedTrash = EntityManager.PredictedSpawn(trash, position);
-
-            // If the user is holding the item
-            if (tryPickup)
-            {
-                // Put the trash in the user's hand
-                _hands.TryPickupAnyHand(args.User, spawnedTrash);
-            }
-        }
-    }
-}
index dbf96068fab6b6d964343482f9943acbff65f24c..4aa14a440dc9bafb724a4634e8dd22d20d3171fb 100644 (file)
@@ -4,7 +4,7 @@
   abstract: true
   components:
   - type: Organ
-  - type: Food
+  - type: Edible
   - type: Sprite
     sprite: Mobs/Species/Human/organs.rsi
   - type: StaticPrice
     solutions:
       stomach:
         maxVol: 30
+      food:
+        maxVol: 5
+        reagents:
+        - ReagentId: UncookedAnimalProteins
+          Quantity: 5
   - type: Item
     size: Small
     heldPrefix: stomach
index 6b64aa4c1d661ec83c0504447dc9f777eea8cf2b..3dd34f1bb6e4f972d2f54e4a982626e4fadb9190 100644 (file)
@@ -14,3 +14,8 @@
     solutions:
       stomach:
         maxVol: 80
+      food:
+        maxVol: 5
+        reagents:
+        - ReagentId: UncookedAnimalProteins
+          Quantity: 5
index f1a3d47e6673a9c799564b5958114df3dbcfe842..c3e1965c06c53b9f71b172d89aae68b75ef9ddd1 100644 (file)
       solutions:
         stomach:
           maxVol: 30.0
+        food:
+          maxVol: 5
+          reagents:
+          - ReagentId: GreyMatter
+            Quantity: 5
 
 - type: entity
   id: OrganSlimesLungs
@@ -55,3 +60,8 @@
         Lung:
           maxVol: 100.0
           canReact: false
+        food:
+          maxVol: 5
+          reagents:
+          - ReagentId: Slime
+            Quantity: 5
index b044706ecf388b27e4c37062255d02a1bcf01a28..129c06a688bb81f25a192dfcdc52143953921fbc 100644 (file)
@@ -6,7 +6,7 @@
   - type: Sprite
     sprite: Mobs/Species/Arachnid/organs.rsi
   - type: Organ
-  - type: Food
+  - type: Edible
   - type: Extractable
     grindableSolutionName: organ
   - type: SolutionContainerManager
index bf865a07fd9e1b2dc1b6a4e0bb6bf4c635a829e4..cf8e2d0c0a22bacd31c321e3a6f1645d20c69828 100644 (file)
@@ -6,7 +6,7 @@
   - type: Sprite
     sprite: Mobs/Species/Diona/organs.rsi
   - type: Organ
-  - type: Food
+  - type: Edible
   - type: Extractable
     grindableSolutionName: organ
   - type: SolutionContainerManager
@@ -19,7 +19,7 @@
       food:
         maxVol: 5
         reagents:
-        - ReagentId: UncookedAnimalProteins
+        - ReagentId: Cellulose
           Quantity: 5
   - type: FlavorProfile
     flavors:
@@ -78,7 +78,7 @@
       food:
         maxVol: 5
         reagents:
-        - ReagentId: UncookedAnimalProteins
+        - ReagentId: Cellulose
           Quantity: 5
   - type: Stomach
   - type: Metabolizer
   - type: Item
     size: Small
     heldPrefix: lungs
-  - type: Lung 
+  - type: Lung
   - type: Metabolizer
     removeEmpty: true
     solutionOnBody: false
       Lung:
         maxVol: 100
         canReact: False
+      food:
+        maxVol: 5
+        reagents:
+        - ReagentId: Cellulose
+          Quantity: 5
 
 # Organs that turn into nymphs on removal
 - type: entity
   description: "The source of incredible, unending intelligence. Honk."
   components:
   - type: Brain
-  - type: Nymph # This will make the organs turn into a nymph when they're removed. 
+  - type: Nymph # This will make the organs turn into a nymph when they're removed.
     entityPrototype: OrganDionaNymphBrain
     transferMind: true
 
 
 - type: entity
   id: OrganDionaNymphStomach
-  parent: MobDionaNymphAccent 
+  parent: MobDionaNymphAccent
   categories: [ HideSpawnMenu ]
   name: diona nymph
   suffix: Stomach
-  description: Contains the stomach of a formerly fully-formed Diona. It doesn't taste any better for it. 
+  description: Contains the stomach of a formerly fully-formed Diona. It doesn't taste any better for it.
   components:
   - type: IsDeadIC
   - type: Body
   categories: [ HideSpawnMenu ]
   name: diona nymph
   suffix: Lungs
-  description: Contains the lungs of a formerly fully-formed Diona. Breathtaking. 
+  description: Contains the lungs of a formerly fully-formed Diona. Breathtaking.
   components:
   - type: IsDeadIC
   - type: Body
index cb1492b8a6a1529cfd785e8679430acfb14d5f08..4d7a077d4e04ac014c27b3297a66cc881ecbaad2 100644 (file)
@@ -6,7 +6,7 @@
   - type: Sprite
     sprite: Mobs/Species/Human/organs.rsi
   - type: Organ
-  - type: Food
+  - type: Edible
   - type: Extractable
     grindableSolutionName: organ
   - type: SolutionContainerManager
@@ -74,7 +74,7 @@
   - type: Item
     size: Small
     heldPrefix: brain
-  
+
 - type: entity
   id: OrganHumanEyes
   parent: BaseHumanOrgan
index 5ecabc41eb1af4b06a7c4d6085dbf4b6f804404c..ffff779f726fd15ea54ca34ced51ac38e21ef2f2 100644 (file)
   - type: Clothing
     sprite: Clothing/Eyes/Hud/friedonion.rsi
   - type: ShowHungerIcons
-  - type: Food
+  - type: Edible
   - type: SolutionContainerManager
     solutions:
       food:
index 448f6702241be5ec5717643f2d8ab35916dc47c0..8b79eaeb5a3ac1e9bbbcb79732d276d22df558da 100644 (file)
   - type: Bloodstream
     bloodReagent: InsectBlood
     bloodMaxVolume: 20
-  - type: Food
+  - type: Edible
   - type: FlavorProfile
     flavors:
     - horrible
         Base: dead-0
       Dead:
         Base: splat-0
-  - type: Food
+  - type: Edible
   - type: FlavorProfile
     flavors:
     - meaty
         Base: dead-0
       Dead:
         Base: splat-0
-  - type: Food
+  - type: Edible
   - type: FlavorProfile
     flavors:
     - meaty
index 3c1901063543c83cd72452940e47b6708268c448..8f84e1496ae0079d2a6ed0b899cdaed5eaa2c34c 100644 (file)
           state: hand
 
   - type: InventorySlots
-  - type: Food
+  - type: Edible # Why? I'm not sure but I also am afraid of the answer.
   - type: Hunger
     baseDecayRate: 0.05 # They get a lil' hungy
   - type: BodyEmotes # Grants them clapping and so on.
index 785c8939edd40f8efb541d5997801615f1536169..69a1b932457d885512be8d13ae04efd0a01d6c84 100644 (file)
         Base: dead
       Dead:
         Base: dead
-  - type: Food
+  - type: Edible
   - type: Thirst
     startingThirst: 25  # spawn with Okay thirst state
     thresholds:
index 820814a46899aa592a653e8aae2f536475446e83..9f6d57083d71308796b64232dae11b097a78966c 100644 (file)
@@ -48,7 +48,7 @@
   - type: FlavorProfile
     flavors:
       - sweet
-  - type: Food
+  - type: Edible
   - type: SolutionContainerManager
     solutions:
       food:
           Quantity: 80
         - ReagentId: Sugar
           Quantity: 30
-  - type: Food
+  - type: Edible
     transferAmount: 12
   - type: Item
     size: Normal
           Quantity: 10
         - ReagentId: Sugar
           Quantity: 5
-  - type: Food
+  - type: Edible
     transferAmount: 3
   - type: PointLight
     color: "#FFFF00"
index 819256443ffa33f70479e1ad3212de5afa63d90b..05bbf930ab07b7671a3efd1bdec5c98b46b8cf59 100644 (file)
@@ -5,7 +5,7 @@
   id: FoodDonkpocketBase
   abstract: true
   components:
-  - type: Food
+  - type: Edible
   - type: Sprite
     sprite: Objects/Consumable/Food/Baked/donkpocket.rsi
   - type: SolutionContainerManager
           Quantity: 5
   - type: Sprite
     state: moth
-  - type: Food
+  - type: Edible
     requiresSpecialDigestion: true
   - type: Tag
     tags:
index e12eed22c04c0d2d7a16a5682372ab0fce80a4b4..af417c2d112f4f4a69e72612acc6ada81d3640a7 100644 (file)
@@ -6,7 +6,7 @@
   name: cotton bun
   description: A cotton hamburger bun. Soft, round and convenient to hold.
   components:
-  - type: Food
+  - type: Edible
     requiresSpecialDigestion: true
   - type: Sprite
     sprite: Objects/Consumable/Food/cottonburger.rsi
@@ -43,7 +43,7 @@
   components:
   - type: Item
     size: Normal #patch until there is an adequate resizing system in place
-  - type: Food
+  - type: Edible
     requiresSpecialDigestion: true
   - type: Sprite
     drawdepth: Mobs
@@ -84,7 +84,7 @@
   name: cotton top bun
   description: The perfect finish for your fibrous burger tower.
   components:
-  - type: Food
+  - type: Edible
     requiresSpecialDigestion: true
   - type: Sprite
     sprite: Objects/Consumable/Food/cottonburger.rsi
index 20e61869b02cab05c0a4833089e263caf9c0699c..25e40d12dc498fb1597e3157020fb4cc25d6b049 100644 (file)
@@ -69,7 +69,7 @@
   id: Eggshells
   description: You're walkin' on 'em bud.
   components:
-  - type: Food
+  - type: Edible
   - type: Sprite
     sprite: Objects/Consumable/Food/egg.rsi
     state: eggshells
index eb1e4d524a752f3b58610b2168402e9f5bb4394f..75507e69f3314cf2ac3cb61d1faa0fb75cb4d95c 100644 (file)
@@ -7,7 +7,7 @@
   - type: Sprite
     sprite: error.rsi
     state: error
-  - type: Food
+  - type: Edible
   - type: SolutionContainerManager
     solutions:
       food:
index a62ef84132a9bc5bbdd74e83af95c94dc3230972..f1b8679caecac5716456aa5f89dccce2008e4e03 100644 (file)
   - type: MeleeWeapon
     soundHit:
       path: /Audio/Items/Toys/ian.ogg
-  - type: Food
-    requiresSpecialDigestion: true
+  - type: Edible
     useSound:
       path: /Audio/Items/Toys/ian.ogg
   - type: FoodSequenceElement
   - type: FlavorProfile
     flavors:
     - plastic
-  - type: Food
+  - type: Edible
   - type: SolutionContainerManager
     solutions:
       food:
index 5062ee4821fa7bdba99c20ded4e8a3852d5d2ca9..3b8196c30ba329a646c2069afb0bb4e728b4579d 100644 (file)
@@ -80,7 +80,6 @@
             types:
               Heat: 0.5
     - type: AtmosExposed
-    - type: Edible
     - type: Kudzu
       growthTickChance: 0.3
       spreadChance: 0.4
@@ -90,7 +89,7 @@
       ignoreWhitelist:
         components:
         - IgnoreKudzu
-    - type: Food
+    - type: Edible
       requiresSpecialDigestion: true
       delay: 0.5
     - type: FlavorProfile
        types:
          Heat: 3
     - type: AtmosExposed
-    - type: Edible
+    - type: Edible # delightfully devilish !
+      delay: 0.5
     - type: SpeedModifierContacts
       walkSpeedModifier: 0.3
       sprintSpeedModifier: 0.3
       ignoreWhitelist:
         tags:
         - Flesh
-    - type: Food # delightfully devilish !
-      delay: 0.5
     - type: SolutionContainerManager
       solutions:
         food:
index 9cbb4a83d1abce0c975ec4bc3aea5489d6837a2f..89deedf8120e0d2284516f0957acb11c85a419c5 100644 (file)
@@ -38,8 +38,7 @@
             max: 1
       - !type:DoActsBehavior
         acts: [ "Destruction" ]
-  - type: Food
-    solution: food
+  - type: Edible
     delay: 7
     forceFeedDelay: 7
   - type: FlavorProfile
index de3f8e1003e83bcf9e849372a7e1c198cf373329..ef8700476d9924633eb82708751ef93e7e712ffc 100644 (file)
@@ -10,7 +10,7 @@
     sprite: Objects/Specific/Hydroponics/cannabis.rsi
   - type: Produce
     seedId: cannabis
-  - type: Food
+  - type: Edible # Precursor to the one true edible
   - type: SolutionContainerManager
     solutions:
       food:
index 318c8d71502a0aa1376e7d0874532f8238897ed4..172a75959edcab3e1447e16c7191566af68b696b 100644 (file)
@@ -63,7 +63,7 @@
   - type: FlavorProfile
     flavors:
       - clean
-  - type: Food
+  - type: Edible
     solution: soap
   - type: BadFood
   - type: CleansForensics
index c9a8c2c89b884add7e49bbbff853c1e08647fbe4..71b09ce007078ad6c20c56216dcb5b43fe9afc22 100644 (file)
@@ -57,7 +57,7 @@
           Quantity: 9
         - ReagentId: Fat
           Quantity: 9
-  - type: Food
+  - type: Edible
     solution: cube
   - type: FlavorProfile
     flavors:
index a55c02082512a794aa41fedcd93689e731896ce3..dfe21506668bcbfbb46f21cd308f68fa7ec58173 100644 (file)
       - cheap
   - type: ComponentToggler
     components:
-    - type: Food
+    - type: Edible # This shouldn't be component toggler, but doesn't work when it's not
   - type: PointLight
     enabled: false
     netsync: false
index 962b5adbbdb1281a734e231627526d200787e6b3..73e5f5f03214418a6d676c2d92961adba10302dd 100644 (file)
   - type: FlavorProfile
     flavors:
       - sweet
-  - type: Food
+  - type: Edible
     delay: 2
   - type: SolutionContainerManager
     solutions: