Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Food Rework Update #1839

Draft
wants to merge 83 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
3ced7d0
draft
ErhardSteinhauer Mar 27, 2024
a147065
Food System
dvir001 Mar 27, 2024
199e72b
Create fun.yml
dvir001 Mar 27, 2024
d9862db
food stuffs
ErhardSteinhauer Mar 27, 2024
79f80e2
Merge branch 'GoblinFoodSystem' of https://github.com/ErhardSteinhaue…
ErhardSteinhauer Mar 27, 2024
2fca643
there_do_be_goblins.txt
ErhardSteinhauer Mar 27, 2024
142b1a3
revert changes to toxins.yml
ErhardSteinhauer Mar 27, 2024
443322c
Merge branch 'GoblinFoodSystem' of https://github.com/ErhardSteinhaue…
ErhardSteinhauer Mar 27, 2024
03ce1a6
Update pie.yml
dvir001 Mar 27, 2024
d7f6d41
Merge branch 'GoblinFoodSystem' of https://github.com/ErhardSteinhaue…
dvir001 Mar 27, 2024
0c82113
mail things
ErhardSteinhauer Mar 27, 2024
a93646a
Merge branch 'GoblinFoodSystem' of https://github.com/ErhardSteinhaue…
ErhardSteinhauer Mar 27, 2024
06c29ad
Update StomachComponent.cs
dvir001 Mar 31, 2024
85538a2
Update FoodComponent.cs
dvir001 Mar 31, 2024
c4e7c52
Update StomachComponent.cs
dvir001 Mar 31, 2024
730522f
Merge branch 'master' into GoblinFoodSystem
dvir001 Apr 27, 2024
38f3a33
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer Apr 27, 2024
075435b
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer Apr 29, 2024
611be4a
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer Apr 29, 2024
ba68a1b
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer Apr 29, 2024
802d6f1
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer Apr 29, 2024
3fafed3
Merge branch 'master' of https://github.com/dvir001/frontier-station-…
dvir001 May 3, 2024
a41995a
Food System Multi types support
dvir001 May 3, 2024
9693762
trash eating gob stomach
ErhardSteinhauer May 3, 2024
fe792f7
Update FoodSystem.cs
dvir001 May 3, 2024
2ff271a
Merge branch 'GoblinFoodSystem' of https://github.com/ErhardSteinhaue…
dvir001 May 3, 2024
bd84268
Update FoodSystem.cs
dvir001 May 3, 2024
a3cf959
more trash food
ErhardSteinhauer May 3, 2024
24c27e8
Food
dvir001 May 3, 2024
d009322
Merge branch 'GoblinFoodSystem' of https://github.com/ErhardSteinhaue…
dvir001 May 3, 2024
f890786
Allow goblin to eat open mail only
dvir001 May 3, 2024
94294be
yml fixes
ErhardSteinhauer May 4, 2024
e9a96a6
more yml fixes
ErhardSteinhauer May 4, 2024
0b59814
No More refill
dvir001 May 4, 2024
39aefbd
less corn in cob
ErhardSteinhauer May 4, 2024
0d099ee
Pain
dvir001 May 4, 2024
0d15fce
Fixing
dvir001 May 4, 2024
052d619
Moff
dvir001 May 4, 2024
118699e
Update paper.yml
dvir001 May 4, 2024
ac5ed9a
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer May 8, 2024
b68dbc3
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer May 15, 2024
4986a68
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer May 15, 2024
43c326c
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer May 15, 2024
e170050
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer May 16, 2024
69e9585
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer May 17, 2024
86e939a
Merge branch 'master' into GoblinFoodSystem
ErhardSteinhauer May 20, 2024
a411773
Merge branch 'master' of https://github.com/dvir001/frontier-station-…
dvir001 May 30, 2024
4874a83
Merge branch 'GoblinFoodSystem' of https://github.com/ErhardSteinhaue…
dvir001 May 30, 2024
eaee2bf
Fixup
dvir001 May 30, 2024
7298cf6
Update burger.yml
dvir001 May 30, 2024
7a6338e
Update FoodSystem.cs
dvir001 May 30, 2024
6c7010f
Update FoodSystem.cs
dvir001 May 30, 2024
483d048
Update Resources/Locale/en-US/_NF/nutrition/components/food-component…
dvir001 May 30, 2024
311260b
Update FoodSystem.cs
dvir001 May 30, 2024
92dd46b
Update Resources/Locale/en-US/_NF/reagents/foods.ftl
dvir001 May 31, 2024
4130c94
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer Jun 1, 2024
bf200cb
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer Jun 2, 2024
9aebf22
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer Jun 6, 2024
38f6b4e
mail
ErhardSteinhauer Jun 14, 2024
5773635
Merge branch 'GoblinFoodSystem' of https://github.com/ErhardSteinhaue…
ErhardSteinhauer Jun 14, 2024
5b5852e
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer Jun 14, 2024
743d8f2
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer Jun 15, 2024
cbc57d7
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer Jun 19, 2024
27f449a
Merge branch 'new-frontiers-14:master' into GoblinFoodSystem
ErhardSteinhauer Jun 23, 2024
ad7958c
Merge branch 'master' of https://github.com/new-frontiers-14/frontier…
whatston3 Jul 10, 2024
1dda7a0
Stomach: Digestion types & function enums
whatston3 Jul 10, 2024
af99523
FoodSystem: digestion rework
whatston3 Jul 10, 2024
20d78a5
digestion check proof of concept
whatston3 Jul 11, 2024
c7065b4
Quality to enum, restore special digestion for now
whatston3 Jul 11, 2024
e354ede
Missing food qualities, restore special digestion
whatston3 Jul 11, 2024
1633fe7
Merge branch 'master' of https://github.com/new-frontiers-14/frontier…
whatston3 Aug 10, 2024
a822ac3
Merge branch 'master' of https://github.com/new-frontiers-14/frontier…
whatston3 Aug 10, 2024
61939fd
Merge branch 'master' of https://github.com/new-frontiers-14/frontier…
whatston3 Aug 27, 2024
0e84795
Merge branch 'master' of https://github.com/new-frontiers-14/frontier…
whatston3 Aug 29, 2024
ab50cd9
Merge branch 'master' into 2024-07-09-GoblinFoodSystem-cleanup
ErhardSteinhauer Sep 7, 2024
07c2abf
Merge branch 'master' of https://github.com/new-frontiers-14/frontier…
whatston3 Sep 18, 2024
08cd56e
Species-specific digestion progress with prototype
whatston3 Sep 18, 2024
02d0806
Compilation fix (bad merge)
whatston3 Sep 18, 2024
f719d0a
Bugfixes, initial bloatamine pass
whatston3 Sep 18, 2024
e972738
more stuff
whatston3 Sep 19, 2024
488d9f8
Merge branch 'master' of https://github.com/new-frontiers-14/frontier…
whatston3 Sep 19, 2024
0b34d57
Merge branch 'master' of https://github.com/new-frontiers-14/frontier…
whatston3 Sep 29, 2024
32c3372
Merge branch 'master' into 2024-07-09-GoblinFoodSystem-cleanup
dvir001 Oct 20, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions Content.Server/Body/Components/StomachComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.Whitelist;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;

namespace Content.Server.Body.Components
Expand Down Expand Up @@ -69,5 +70,11 @@ public ReagentDelta(ReagentQuantity reagentQuantity)

public void Increment(TimeSpan delta) => Lifetime += delta;
}

/// <summary>
/// Frontier: digestion prototype (used for species-specific reagent replacement/effects)
/// </summary>
[DataField]
public ProtoId<DigestionPrototype>? Digestion = "Default";
}
}
24 changes: 23 additions & 1 deletion Content.Server/Nutrition/Components/FoodComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@
using Content.Shared.FixedPoint;
using Robust.Shared.Audio;
using Robust.Shared.Prototypes;
using Content.Server.Mail; // Frontier

namespace Content.Server.Nutrition.Components;

[RegisterComponent, Access(typeof(FoodSystem), typeof(FoodSequenceSystem))]
[RegisterComponent, Access(typeof(FoodSystem), typeof(FoodSequenceSystem), typeof(MailSystem))] // Frontier
public sealed partial class FoodComponent : Component
{
[DataField]
Expand Down Expand Up @@ -75,6 +76,14 @@ public sealed partial class FoodComponent : Component
[DataField, ViewVariables(VVAccess.ReadWrite)]
public bool RequireDead = true;

// New Frontiers - Digestion Rework - Add quality to add species-specific digestion
// This code is licensed under AGPLv3. See AGPLv3.txt
/// <summary>
/// The quality of this food, for species-specific digestion.
/// </summary>
[DataField, ViewVariables]
public FoodQuality Quality = FoodQuality.Normal;

[DataField]
public LocId VerbEat = "food-system-verb-eat"; // Frontier

Expand All @@ -96,3 +105,16 @@ public sealed partial class FoodComponent : Component
[DataField]
public LocId CannotEatAnyMoreOtherMessage = "food-system-you-cannot-eat-any-more-other"; // Frontier
}

/// <summary>
/// An enumeration of the quality of given pieces of food.
/// </summary>
public enum FoodQuality : byte
{
Toxin,
Nasty,
Junk,
Normal,
High,
}
// End of modified code
77 changes: 56 additions & 21 deletions Content.Server/Nutrition/EntitySystems/FoodSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,12 @@
using Content.Shared.Containers.ItemSlots;
using Robust.Server.GameObjects;
using Content.Shared.Whitelist;

namespace Content.Server.Nutrition.EntitySystems;

/// <summary>
/// Handles feeding attempts both on yourself and on the target.
/// </summary>
public sealed class FoodSystem : EntitySystem
public partial class FoodSystem : EntitySystem // Frontier: sealed<partial
{
[Dependency] private readonly BodySystem _body = default!;
[Dependency] private readonly FlavorProfileSystem _flavorProfile = default!;
Expand Down Expand Up @@ -244,12 +243,22 @@ private void OnDoAfter(Entity<FoodComponent> entity, ref ConsumeDoAfterEvent arg

var split = _solutionContainer.SplitSolution(soln.Value, transferAmount);

// Frontier: food digestion
if (!CheckDigestablePrereqs(entity, entity.Comp, stomachs)) {
return;
}

// Get the stomach with the highest available solution volume
var highestAvailable = FixedPoint2.Zero;
Entity<StomachComponent>? stomachToUse = null;
foreach (var ent in stomachs)
{
var owner = ent.Owner;

// Frontier: check specific-stomach digestion
if (!IsFoodDigestibleByStomach(args.Used.Value, entity.Comp, ent.Comp1)) // Frontier: make sure food is processed by a stomach that can digest it
continue;

if (!_stomach.CanTransferSolution(owner, split, ent.Comp1))
continue;

Expand All @@ -271,16 +280,21 @@ private void OnDoAfter(Entity<FoodComponent> entity, ref ConsumeDoAfterEvent arg
return;
}

var digestion = DigestFood(entity, stomachToUse.Value, split, args.Target.Value, args.User); // Frontier: species-specific digestion

_reaction.DoEntityReaction(args.Target.Value, solution, ReactionMethod.Ingestion);
_stomach.TryTransferSolution(stomachToUse!.Value.Owner, split, stomachToUse);

var flavors = args.FlavorMessage;

if (forceFeed)
{
var targetName = Identity.Entity(args.Target.Value, EntityManager);
var targetName = Identity.Entity(args.Target!.Value, EntityManager);
var userName = Identity.Entity(args.User, EntityManager);
_popup.PopupEntity(Loc.GetString(entity.Comp.ForceFeedSuccessMessage, ("user", userName), ("flavors", flavors)), args.Target.Value, args.Target.Value); // Frontier: entity.Owner->args.Target.Value

// TODO: revise this with napkin work
if (digestion.ShowFlavors) // Frontier
_popup.PopupEntity(Loc.GetString(entity.Comp.ForceFeedSuccessMessage, ("user", userName), ("flavors", flavors)), args.Target.Value, args.Target.Value); // Frontier: entity.Owner->args.Target.Value

_popup.PopupEntity(Loc.GetString(entity.Comp.ForceFeedSuccessUserMessage, ("target", targetName)), args.User, args.User);

Expand All @@ -289,13 +303,14 @@ private void OnDoAfter(Entity<FoodComponent> entity, ref ConsumeDoAfterEvent arg
}
else
{
_popup.PopupEntity(Loc.GetString(entity.Comp.EatMessage, ("food", entity.Owner), ("flavors", flavors)), args.User, args.User);
if (digestion.ShowFlavors) // Frontier
_popup.PopupEntity(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.Owner):food}");
}

_audio.PlayPvs(entity.Comp.UseSound, args.Target.Value, AudioParams.Default.WithVolume(-1f));
_audio.PlayPvs(entity.Comp.UseSound, args.Target!.Value, AudioParams.Default.WithVolume(-1f));

// Try to break all used utensils
foreach (var utensil in utensils)
Expand Down Expand Up @@ -416,29 +431,49 @@ public bool IsDigestibleBy(EntityUid uid, EntityUid food, FoodComponent? foodCom
/// </summary>
private bool IsDigestibleBy(EntityUid food, FoodComponent component, List<Entity<StomachComponent, OrganComponent>> stomachs)
{
var digestible = true;
return GetDigestableStomach(food, component, stomachs) is not null; // Frontier: removed
}

// Does the mob have enough stomachs?
if (stomachs.Count < component.RequiredStomachs)
private bool CheckDigestablePrereqs(EntityUid food, FoodComponent component, List<Entity<StomachComponent, OrganComponent>> stomachs)
{
return stomachs.Count >= component.RequiredStomachs;
}

private bool IsFoodDigestibleByStomach(EntityUid food, FoodComponent component, StomachComponent stomach)
{
if (!component.RequiresSpecialDigestion)
return true;

// Check if the food is in the whitelist
if (_whitelistSystem.IsWhitelistPass(stomach.SpecialDigestible, food))
return true;
else
return false;
}

private StomachComponent? GetDigestableStomach(EntityUid food, FoodComponent component, List<Entity<StomachComponent, OrganComponent>> stomachs)
{
if (!CheckDigestablePrereqs(food, component, stomachs)) {
return null;
}
// Run through the mobs' stomachs
foreach (var ent in stomachs)
{
// Find a stomach with a SpecialDigestible
if (ent.Comp1.SpecialDigestible == null)
continue;
// Check if the food is in the whitelist
if (_whitelistSystem.IsWhitelistPass(ent.Comp1.SpecialDigestible, food))
return true;
// They can only eat whitelist food and the food isn't in the whitelist. It's not edible.
return false;
}
if (IsFoodDigestibleByStomach(food, component, ent.Comp1)) {
return ent.Comp1;
}

if (component.RequiresSpecialDigestion)
return false;
// // Find a stomach with a SpecialDigestible
// if (ent.Comp1.SpecialDigestible == null)
// continue;
// // Check if the food is in the whitelist
// if (_whitelistSystem.IsWhitelistPass(ent.Comp1.SpecialDigestible, food))
// return true;
// // They can only eat whitelist food and the food isn't in the whitelist. It's not edible.
// return false;
}

return digestible;
return null;
}

private bool TryGetRequiredUtensils(EntityUid user, FoodComponent component,
Expand Down
80 changes: 80 additions & 0 deletions Content.Server/_NF/Nutrition/EntitySystems/FoodSystem.Digestion.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// New Frontiers - This file is licensed under AGPLv3
// Copyright (c) 2024 New Frontiers Contributors
// See AGPLv3.txt for details.
using Content.Server.Nutrition.Components;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.Chemistry.Components;
using Content.Server.Body.Components;
using Robust.Shared.Prototypes;
using Content.Shared.EntityEffects;
using Robust.Shared.Random;
using Content.Shared.Chemistry;

namespace Content.Server.Nutrition.EntitySystems;

// Frontier: extending food system to handle species-specific digestion quirks.
public sealed partial class FoodSystem : EntitySystem // Frontier: sealed<partial
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly IRobustRandom _random = default!;

public struct DigestionResult
{
public bool ShowFlavors;
}

DigestionResult DigestFood(Entity<FoodComponent> food, Entity<StomachComponent> stomach, Solution eatenSolution, EntityUid target, EntityUid _)
{
var result = new DigestionResult
{
ShowFlavors = true
};

// Frontier - Food quality system
if (!_prototype.TryIndex(stomach.Comp.Digestion, out var digestion))
{
return result;
}

var eatenVolume = eatenSolution.Volume;
while (digestion != null)
{
// Iterate through effects
foreach (var effect in digestion.Effects)
{
// Precondition: match food quality and/or whitelist.
if (effect.Quality != null && effect.Quality != food.Comp.Quality)
continue;

if (_whitelistSystem.IsWhitelistFail(effect.Whitelist, food.Owner))
continue;

// Run reagent conversions
foreach (var (beforeReagent, afterDict) in effect.Conversions)
{
var removedAmount = eatenSolution.RemoveReagent(new ReagentQuantity(beforeReagent, eatenVolume));
foreach (var (afterReagent, afterRatio) in afterDict)
{
eatenSolution.AddReagent(new ReagentQuantity(afterReagent, removedAmount * afterRatio));
}
}

var args = new EntityEffectReagentArgs(target, EntityManager, stomach.Owner, eatenSolution, eatenSolution.Volume, null, ReactionMethod.Ingestion, 1.0f);
foreach (var entEffect in effect.Effects)
{
if (!EntityEffectExt.ShouldApply(entEffect, args, _random))
continue;
entEffect.Effect(args);
}
}

// Get next digestion to run
if (!_prototype.TryIndex(digestion.PostDigest, out digestion))
{
digestion = null;
}
}

return result;
}
}
56 changes: 56 additions & 0 deletions Content.Server/_NF/Nutrition/Prototypes/DigestionPrototype.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
using Content.Server.Nutrition.Components;
using Content.Shared.EntityEffects;
using Content.Shared.FixedPoint;
using Content.Shared.Whitelist;
using Robust.Shared.Prototypes;

namespace Content.Shared.Chemistry.Reagent;

[Prototype("digestion")]
[DataDefinition]
public sealed partial class DigestionPrototype : IPrototype
{
[ViewVariables]
[IdDataField]
public string ID { get; private set; } = default!;

/// <summary>
/// The list of digestive effects that occur in this organ.
/// </summary>
[DataField]
public List<DigestionEffect> Effects { get; private set; } = new();

/// <summary>
/// The list of digestive effects that occur in this organ.
/// </summary>
[DataField]
public ProtoId<DigestionPrototype>? PostDigest { get; private set; } = null;
}

[DataDefinition]
public sealed partial class DigestionEffect
{
/// <summary>
/// The quality of food this effect occurs on.
/// </summary>
[DataField]
public FoodQuality? Quality { get; private set; } = null;

/// <summary>
/// A whitelist on the food item this bite was taken from.
/// </summary>
[DataField]
public EntityWhitelist? Whitelist { get; private set; } = null;

/// <summary>
/// A list of reagent effects that happen on the stomach solution
/// </summary>
[DataField]
public List<EntityEffect> Effects { get; private set; } = new();

/// <summary>
/// A list of conversions. All values should be ratios of the input reagent, and the sum of their values should be <= 1.
/// </summary>
[DataField]
public Dictionary<ProtoId<ReagentPrototype>, Dictionary<ProtoId<ReagentPrototype>, FixedPoint2>> Conversions { get; private set; } = new();
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,6 @@ food-system-verb-wipe = Wipe Face
food-system-wipe = {CAPITALIZE(THE($user))} is trying to wipe your face.
food-system-wipe-success = {CAPITALIZE(THE($user))} wiped your face.
food-system-wipe-success-user = You wiped {THE($target)}'s face.

food-system-nasty = That food was gross.
food-system-toxin = That food was bad.
2 changes: 2 additions & 0 deletions Resources/Locale/en-US/_NF/reagents/foods.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
reagent-name-trashjuice = trash juice
reagent-desc-trashjuice = Do you really want to know what it is?
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
reagent-name-flavorol = flavorol
reagent-desc-flavorol = All the vitamins, minerals, and carbohydrates the body needs in pure form.

reagent-name-bloatamine = bloatamine
reagent-desc-bloatamine = A metabolized version of the preservatives put in junk food. Carcinogenic in large quantities.

reagent-name-raisins = raisins
reagent-desc-raisins = Are they the best or worst part of the cookie? They're a bunch of desiccated grapes is what they are.
1 change: 1 addition & 0 deletions Resources/Locale/en-US/_NF/reagents/physical-desc.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
reagent-physical-desc-trashjuice = ... Wait.. Did it just move?
4 changes: 2 additions & 2 deletions Resources/Prototypes/Body/Organs/Animal/animal.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
abstract: true
components:
- type: Organ
- type: Food
# quality: Nasty # Frontier
- type: Food # Frontier
quality: Nasty # Frontier
- type: Sprite
sprite: Mobs/Species/Human/organs.rsi
- type: StaticPrice
Expand Down
8 changes: 8 additions & 0 deletions Resources/Prototypes/Body/Organs/arachnid.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@
sprite: Mobs/Species/Arachnid/organs.rsi
state: stomach
- type: Stomach
digestion: Arachnid # Frontier
# specialDigestible:
# tags:
# - Fruit
# - Pill
# - BloodFood
# - Crayon
# - Soup
updateInterval: 1.5
- type: SolutionContainerManager
solutions:
Expand Down
Loading
Loading