From 1de228577e9b3d8acd7f202360cc1029ae53a02c Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Wed, 17 Jun 2026 01:33:12 -0500 Subject: [PATCH 01/61] Add PlantNutrientPrototype --- .../Botany/PlantNutrientPrototype.cs | 20 +++++++++++++++++++ Resources/Locale/en-US/plant-nutrients.ftl | 1 + .../Prototypes/Hydroponics/nutrients.yml | 3 +++ 3 files changed, 24 insertions(+) create mode 100644 Content.Server/Botany/PlantNutrientPrototype.cs create mode 100644 Resources/Locale/en-US/plant-nutrients.ftl create mode 100644 Resources/Prototypes/Hydroponics/nutrients.yml diff --git a/Content.Server/Botany/PlantNutrientPrototype.cs b/Content.Server/Botany/PlantNutrientPrototype.cs new file mode 100644 index 00000000000..0a0f91ec8fc --- /dev/null +++ b/Content.Server/Botany/PlantNutrientPrototype.cs @@ -0,0 +1,20 @@ +using Robust.Shared.Prototypes; + +namespace Content.Server.Botany; + +/// +/// This is a prototype for... +/// +[Prototype()] +public sealed partial class PlantNutrientPrototype : IPrototype +{ + /// + [IdDataField] + public string ID { get; private set; } = default!; + + [DataField(required: true)] + private LocId Name { get; set; } + + [ViewVariables(VVAccess.ReadOnly)] + public string LocalizedName => Loc.GetString(Name); +} diff --git a/Resources/Locale/en-US/plant-nutrients.ftl b/Resources/Locale/en-US/plant-nutrients.ftl new file mode 100644 index 00000000000..3ec0620c96b --- /dev/null +++ b/Resources/Locale/en-US/plant-nutrients.ftl @@ -0,0 +1 @@ +nutrient-name-test = Test Nutrient diff --git a/Resources/Prototypes/Hydroponics/nutrients.yml b/Resources/Prototypes/Hydroponics/nutrients.yml new file mode 100644 index 00000000000..5f88fc2818b --- /dev/null +++ b/Resources/Prototypes/Hydroponics/nutrients.yml @@ -0,0 +1,3 @@ +- type: plantNutrient + id: test + name: nutrient-name-test From 2261401852f0d821e2d2e9822e8a04055d7642e2 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Wed, 17 Jun 2026 13:18:46 -0500 Subject: [PATCH 02/61] Move PlantNutrientPrototype.cs to Shared --- .../Botany/PlantNutrientPrototype.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) rename {Content.Server => Content.Shared}/Botany/PlantNutrientPrototype.cs (87%) diff --git a/Content.Server/Botany/PlantNutrientPrototype.cs b/Content.Shared/Botany/PlantNutrientPrototype.cs similarity index 87% rename from Content.Server/Botany/PlantNutrientPrototype.cs rename to Content.Shared/Botany/PlantNutrientPrototype.cs index 0a0f91ec8fc..57d466f7a10 100644 --- a/Content.Server/Botany/PlantNutrientPrototype.cs +++ b/Content.Shared/Botany/PlantNutrientPrototype.cs @@ -1,11 +1,12 @@ using Robust.Shared.Prototypes; -namespace Content.Server.Botany; +namespace Content.Shared.Botany; /// /// This is a prototype for... /// -[Prototype()] +[Prototype] +[DataDefinition] public sealed partial class PlantNutrientPrototype : IPrototype { /// From a245f3abdf257e0887a5467f3979b29ebf581ff7 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Wed, 17 Jun 2026 22:30:10 -0500 Subject: [PATCH 03/61] Basic guidebook functionality --- .../Controls/GuidePlantNutrientEmbed.xaml | 43 ++++ .../Controls/GuidePlantNutrientEmbed.xaml.cs | 214 ++++++++++++++++++ .../GuidePlantNutrientGroupEmbed.xaml | 4 + .../GuidePlantNutrientGroupEmbed.xaml.cs | 45 ++++ .../Botany/PlantNutrientPrototype.cs | 9 + .../Locale/en-US/botany/plant-nutrients.ftl | 5 + Resources/Locale/en-US/guidebook/guides.ftl | 1 + Resources/Locale/en-US/plant-nutrients.ftl | 1 - Resources/Prototypes/Guidebook/references.yml | 6 + .../Prototypes/Hydroponics/nutrients.yml | 7 + .../Guidebook/Service/PlantNutrients.xml | 9 + 11 files changed, 343 insertions(+), 1 deletion(-) create mode 100644 Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml create mode 100644 Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml.cs create mode 100644 Content.Client/Guidebook/Controls/GuidePlantNutrientGroupEmbed.xaml create mode 100644 Content.Client/Guidebook/Controls/GuidePlantNutrientGroupEmbed.xaml.cs create mode 100644 Resources/Locale/en-US/botany/plant-nutrients.ftl delete mode 100644 Resources/Locale/en-US/plant-nutrients.ftl create mode 100644 Resources/ServerInfo/Guidebook/Service/PlantNutrients.xml diff --git a/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml b/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml new file mode 100644 index 00000000000..007bbd12473 --- /dev/null +++ b/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + diff --git a/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml.cs b/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml.cs new file mode 100644 index 00000000000..74b09fc6c35 --- /dev/null +++ b/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml.cs @@ -0,0 +1,214 @@ +using Content.Client.Chemistry.EntitySystems; +using Content.Client.Guidebook.Richtext; +using Content.Client.Message; +using Content.Client.UserInterface.ControlExtensions; +using Content.Shared.CCVar; +using Content.Shared.Botany; +using Content.Shared.Localizations; +using Content.Shared.Metabolism; +using JetBrains.Annotations; +using Robust.Client.AutoGenerated; +using Robust.Client.Graphics; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; +using System.Diagnostics.CodeAnalysis; +using System.Linq; + +namespace Content.Client.Guidebook.Controls; + +/// +/// Control for embedding a reagent into a guidebook. +/// +[UsedImplicitly, GenerateTypedNameReferences] +public sealed partial class GuidePlantNutrientEmbed : BoxContainer, IDocumentTag, ISearchableControl, IPrototypeRepresentationControl +{ + [Dependency] private readonly IEntitySystemManager _systemManager = default!; + [Dependency] private readonly ILogManager _logManager = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private readonly IConfigurationManager _config = default!; + + //private readonly ChemistryGuideDataSystem _chemistryGuideData; + private readonly ISawmill _sawmill; + + public IPrototype? RepresentedPrototype { get; private set; } + + public GuidePlantNutrientEmbed() + { + RobustXamlLoader.Load(this); + IoCManager.InjectDependencies(this); + _sawmill = _logManager.GetSawmill("guidebook.reagent"); + //_chemistryGuideData = _systemManager.GetEntitySystem(); + MouseFilter = MouseFilterMode.Stop; + } + + public GuidePlantNutrientEmbed(string nutrient) : this() + { + GenerateControl(_prototype.Index(nutrient)); + } + + public GuidePlantNutrientEmbed(PlantNutrientPrototype nutrient) : this() + { + GenerateControl(nutrient); + } + + public bool CheckMatchesSearch(string query) + { + return this.ChildrenContainText(query); + } + + public void SetHiddenState(bool state, string query) + { + Visible = CheckMatchesSearch(query) ? state : !state; + } + + public bool TryParseTag(Dictionary args, [NotNullWhen(true)] out Control? control) + { + control = null; + if (!args.TryGetValue("Reagent", out var id)) + { + _sawmill.Error("Reagent embed tag is missing reagent prototype argument"); + return false; + } + + if (!_prototype.TryIndex(id, out var nutrient)) + { + _sawmill.Error($"Specified reagent prototype \"{id}\" is not a valid reagent prototype"); + return false; + } + + GenerateControl(nutrient); + + control = this; + return true; + } + + private void GenerateControl(PlantNutrientPrototype nutrient) + { + RepresentedPrototype = nutrient; + + NameBackground.PanelOverride = new StyleBoxFlat + { + BackgroundColor = nutrient.SubstanceColor + }; + + var r = nutrient.SubstanceColor.R; + var g = nutrient.SubstanceColor.G; + var b = nutrient.SubstanceColor.B; + + var textColor = 0.2126f * r + 0.7152f * g + 0.0722f * b > 0.5 + ? Color.Black + : Color.White; + + ReagentName.SetMarkup(Loc.GetString("guidebook-reagent-name", + ("color", textColor), ("name", nutrient.LocalizedName))); + + #region Effects + /*if (_chemistryGuideData.ReagentGuideRegistry.TryGetValue(reagent.ID, out var guideEntryRegistry) && + guideEntryRegistry.GuideEntries != null && + guideEntryRegistry.GuideEntries.Values.Any(pair => pair.EffectDescriptions.Any() || pair.Metabolites?.Any() == true)) + { + EffectsDescriptionContainer.Children.Clear(); + foreach (var (stage, effect) in guideEntryRegistry.GuideEntries) + { + var hasMetabolites = effect.Metabolites?.Any() == true; + if (!effect.EffectDescriptions.Any() && !hasMetabolites) + continue; + + var groupLabel = new RichTextLabel(); + groupLabel.SetMarkup(Loc.GetString("guidebook-reagent-effects-metabolism-stage-rate", + ("stage", _prototype.Index(stage).LocalizedName), ("rate", effect.MetabolismRate))); + var descriptionLabel = new RichTextLabel + { + Margin = new Thickness(25, 0, 10, 0) + }; + + var descMsg = new FormattedMessage(); + var descriptionsCount = effect.EffectDescriptions.Length; + var i = 0; + foreach (var effectString in effect.EffectDescriptions) + { + descMsg.AddMarkupOrThrow(effectString); + i++; + if (i < descriptionsCount || hasMetabolites) + descMsg.PushNewline(); + } + if (hasMetabolites) + { + var metabolites = new List(); + foreach (var (metabolite, ratio) in effect.Metabolites!) + { + metabolites.Add(Loc.GetString("guidebook-reagent-effects-metabolite-item", ("rate", (double)ratio), ("reagent", _prototype.Index(metabolite).LocalizedName))); + } + metabolites.Sort(); + + descMsg.AddMarkupOrThrow(Loc.GetString("guidebook-reagent-effects-metabolites", ("items", ContentLocalizationManager.FormatList(metabolites)))); + } + descriptionLabel.SetMessage(descMsg); + + EffectsDescriptionContainer.AddChild(groupLabel); + EffectsDescriptionContainer.AddChild(descriptionLabel); + } + } + else + { + EffectsContainer.Visible = false; + }*/ + #endregion + + //GenerateSources(reagent); + + FormattedMessage description = new(); + description.AddText(nutrient.LocalizedDescription); + description.PushNewline(); + /*description.AddMarkupOrThrow(Loc.GetString("guidebook-reagent-physical-description", + ("description", nutrient.LocalizedPhysicalDescription)));*/ + + ReagentDescription.SetMessage(description); + } + + /*private void GenerateSources(ReagentPrototype reagent) + { + var sources = _chemistryGuideData.GetReagentSources(reagent.ID); + if (sources.Count == 0) + { + SourcesContainer.Visible = false; + return; + } + SourcesContainer.Visible = true; + + var orderedSources = sources + .OrderBy(o => o.OutputCount) + .ThenBy(o => o.IdentifierString); + foreach (var source in orderedSources) + { + if (source is ReagentEntitySourceData entitySourceData) + { + SourcesDescriptionContainer.AddChild(new GuideReagentReaction( + entitySourceData.SourceEntProto, + entitySourceData.Solution, + entitySourceData.MixingType, + _prototype, + _systemManager)); + } + else if (source is ReagentReactionSourceData reactionSourceData) + { + SourcesDescriptionContainer.AddChild(new GuideReagentReaction( + reactionSourceData.ReactionPrototype, + _prototype, + _systemManager)); + } + else if (source is ReagentGasSourceData gasSourceData) + { + SourcesDescriptionContainer.AddChild(new GuideReagentReaction( + gasSourceData.GasPrototype, + gasSourceData.MixingType, + _prototype, + _systemManager)); + } + } + }*/ +} diff --git a/Content.Client/Guidebook/Controls/GuidePlantNutrientGroupEmbed.xaml b/Content.Client/Guidebook/Controls/GuidePlantNutrientGroupEmbed.xaml new file mode 100644 index 00000000000..da671adaa72 --- /dev/null +++ b/Content.Client/Guidebook/Controls/GuidePlantNutrientGroupEmbed.xaml @@ -0,0 +1,4 @@ + + + diff --git a/Content.Client/Guidebook/Controls/GuidePlantNutrientGroupEmbed.xaml.cs b/Content.Client/Guidebook/Controls/GuidePlantNutrientGroupEmbed.xaml.cs new file mode 100644 index 00000000000..397f197dccd --- /dev/null +++ b/Content.Client/Guidebook/Controls/GuidePlantNutrientGroupEmbed.xaml.cs @@ -0,0 +1,45 @@ +using Content.Client.Guidebook.Richtext; +//using Content.Shared.Chemistry.Reagent; +using Content.Shared.Botany; +using JetBrains.Annotations; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Prototypes; +using System.Diagnostics.CodeAnalysis; +using System.Linq; + +namespace Content.Client.Guidebook.Controls; + +/// +/// Control for embedding a reagent into a guidebook. +/// +[UsedImplicitly, GenerateTypedNameReferences] +public sealed partial class GuidePlantNutrientGroupEmbed : BoxContainer, IDocumentTag +{ + [Dependency] private readonly ILogManager _logManager = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; + + + public GuidePlantNutrientGroupEmbed() + { + RobustXamlLoader.Load(this); + IoCManager.InjectDependencies(this); + MouseFilter = MouseFilterMode.Stop; + } + + public bool TryParseTag(Dictionary args, [NotNullWhen(true)] out Control? control) + { + control = null; + var prototypes = _prototype.EnumeratePrototypes().OrderBy(p => p.LocalizedName); + foreach (var nutrient in prototypes) + { + var embed = new GuidePlantNutrientEmbed(nutrient); + GroupContainer.AddChild(embed); + } + + control = this; + return true; + } +} diff --git a/Content.Shared/Botany/PlantNutrientPrototype.cs b/Content.Shared/Botany/PlantNutrientPrototype.cs index 57d466f7a10..b5c5467cbb3 100644 --- a/Content.Shared/Botany/PlantNutrientPrototype.cs +++ b/Content.Shared/Botany/PlantNutrientPrototype.cs @@ -18,4 +18,13 @@ public sealed partial class PlantNutrientPrototype : IPrototype [ViewVariables(VVAccess.ReadOnly)] public string LocalizedName => Loc.GetString(Name); + + [DataField("desc", required: true)] + private LocId Description { get; set; } + + [ViewVariables(VVAccess.ReadOnly)] + public string LocalizedDescription => Loc.GetString(Description); + + [DataField("color")] + public Color SubstanceColor { get; private set; } = Color.White; } diff --git a/Resources/Locale/en-US/botany/plant-nutrients.ftl b/Resources/Locale/en-US/botany/plant-nutrients.ftl new file mode 100644 index 00000000000..86092b2e6b6 --- /dev/null +++ b/Resources/Locale/en-US/botany/plant-nutrients.ftl @@ -0,0 +1,5 @@ +nutrient-name-test = Test Nutrient +nutrient-desc-test = Nutrient description! Add this to your plant! (Legal Disclaimer: This currently cannot be added to plants) + +nutrient-name-goog = Goog +nutrient-desc-goog = Long description waijfiowafiowafiowjafvwajfwoafjowafoiwoajfwjafojowajiowajofijwaofjiawfiojoij Among us awjfpawfpbabfajioioafjafiwowfjawfoffj Unfunny joke here diff --git a/Resources/Locale/en-US/guidebook/guides.ftl b/Resources/Locale/en-US/guidebook/guides.ftl index 9a4e60cf969..3bdcf7ab04a 100644 --- a/Resources/Locale/en-US/guidebook/guides.ftl +++ b/Resources/Locale/en-US/guidebook/guides.ftl @@ -107,6 +107,7 @@ guide-entry-chemicals = Chemicals guide-entry-drinks = Drinks guide-entry-entities = Entity Recipes guide-entry-foodrecipes = Food Recipes +guide-entry-plant-nutrients = Plant nutrients guide-entry-elements = Elements guide-entry-medicine = Medicine diff --git a/Resources/Locale/en-US/plant-nutrients.ftl b/Resources/Locale/en-US/plant-nutrients.ftl deleted file mode 100644 index 3ec0620c96b..00000000000 --- a/Resources/Locale/en-US/plant-nutrients.ftl +++ /dev/null @@ -1 +0,0 @@ -nutrient-name-test = Test Nutrient diff --git a/Resources/Prototypes/Guidebook/references.yml b/Resources/Prototypes/Guidebook/references.yml index 7de64ce8a29..57ec228409b 100644 --- a/Resources/Prototypes/Guidebook/references.yml +++ b/Resources/Prototypes/Guidebook/references.yml @@ -8,6 +8,7 @@ - Drinks - EntityRecipes - FoodRecipes + - PlantNutrients - Writing - Lawsets @@ -135,6 +136,11 @@ text: "/ServerInfo/Guidebook/Service/SecretRecipes.xml" filterEnabled: True +- type: guideEntry + id: PlantNutrients + name: guide-entry-plant-nutrients + text: "/ServerInfo/Guidebook/Service/PlantNutrients.xml" + - type: guideEntry id: Writing name: guide-entry-writing diff --git a/Resources/Prototypes/Hydroponics/nutrients.yml b/Resources/Prototypes/Hydroponics/nutrients.yml index 5f88fc2818b..7e80a1eefcd 100644 --- a/Resources/Prototypes/Hydroponics/nutrients.yml +++ b/Resources/Prototypes/Hydroponics/nutrients.yml @@ -1,3 +1,10 @@ - type: plantNutrient id: test name: nutrient-name-test + desc: nutrient-desc-test + +- type: plantNutrient + id: goog + name: nutrient-name-goog + desc: nutrient-desc-goog + color: "#8487ff" diff --git a/Resources/ServerInfo/Guidebook/Service/PlantNutrients.xml b/Resources/ServerInfo/Guidebook/Service/PlantNutrients.xml new file mode 100644 index 00000000000..6f09826a273 --- /dev/null +++ b/Resources/ServerInfo/Guidebook/Service/PlantNutrients.xml @@ -0,0 +1,9 @@ + + + # Plant Nutrients + + Test text + + + + From bc0949568e1da8932028d5a393d6cf8b76a5ce7a Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Sat, 20 Jun 2026 00:52:58 -0500 Subject: [PATCH 04/61] Trays can now store PlantNutrients --- .../Botany/Components/PlantHolderComponent.cs | 6 ++++++ Content.Server/Botany/Systems/PlantHolderSystem.cs | 11 +++++++++-- .../botany/components/plant-holder-component.ftl | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Content.Server/Botany/Components/PlantHolderComponent.cs b/Content.Server/Botany/Components/PlantHolderComponent.cs index 34a41683af2..1a841a50843 100644 --- a/Content.Server/Botany/Components/PlantHolderComponent.cs +++ b/Content.Server/Botany/Components/PlantHolderComponent.cs @@ -1,5 +1,8 @@ +using Content.Shared.Botany; using Content.Shared.Chemistry.Components; +using Content.Shared.FixedPoint; using Robust.Shared.Audio; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Server.Botany.Components; @@ -59,6 +62,9 @@ public sealed partial class PlantHolderComponent : Component [DataField] public float NutritionLevel = 100f; + [DataField] + public Dictionary, FixedPoint2> Nutrients = new(); + [DataField] public float PestLevel; diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index 123833960bd..d3d17288630 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -148,8 +148,15 @@ private void OnExamine(Entity entity, ref ExaminedEvent ar args.PushMarkup(Loc.GetString($"plant-holder-component-water-level-message", ("waterLevel", (int)component.WaterLevel))); - args.PushMarkup(Loc.GetString($"plant-holder-component-nutrient-level-message", - ("nutritionLevel", (int)component.NutritionLevel))); + + foreach (var nutrientID in component.Nutrients.Keys) + { + var nutrient = _prototype.Index(nutrientID); + args.PushMarkup(Loc.GetString(nutrient.LocalizedName) + + Loc.GetString($"plant-holder-component-nutrient-level-message", + ("color", nutrient.SubstanceColor), + ("nutritionLevel", component.Nutrients[nutrientID]))); + } if (component.DrawWarnings) { diff --git a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl index 0f416455c7e..41d83b5184c 100644 --- a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl +++ b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl @@ -24,7 +24,7 @@ plant-holder-component-dead-plant-matter-message = It's full of [color=red]dead plant-holder-component-weed-high-level-message = It's filled with [color=green]weeds[/color]! plant-holder-component-pest-high-level-message = It's filled with [color=gray]tiny worms[/color]! plant-holder-component-water-level-message = Water: [color=cyan]{$waterLevel}[/color]. -plant-holder-component-nutrient-level-message = Nutrient: [color=orange]{$nutritionLevel}[/color]. +plant-holder-component-nutrient-level-message = : [color={$color}]{$nutritionLevel}[/color]. plant-holder-component-toxins-high-warning = The [color=red]toxicity level alert[/color] is flashing red. plant-holder-component-light-improper-warning = The [color=yellow]improper light level alert[/color] is blinking. plant-holder-component-heat-improper-warning = The [color=orange]improper temperature level alert[/color] is blinking. From 085db4d961c5d16131cf514660e5e134a965f46b Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Sun, 21 Jun 2026 00:45:33 -0500 Subject: [PATCH 05/61] PlantAdjustNutrientEntityEffect added. --- .../Botany/Systems/PlantHolderSystem.cs | 48 +++++-------------- .../PlantAdjustNutrientEntityEffectSystem.cs | 17 +++++++ .../PlantAdjustNutritionEntityEffectSystem.cs | 4 +- .../PlantAdjustToxinsEntityEffectSystem.cs | 9 ++-- .../PlantAdjustWaterEntityEffectSystem.cs | 5 +- .../Botany/PlantAdjustNutrientEntityEffect.cs | 38 +++++++++++++++ .../components/plant-holder-component.ftl | 1 - .../Locale/en-US/botany/plant-nutrients.ftl | 14 ++++-- .../guidebook/entity-effects/effects.ftl | 6 +++ .../Prototypes/Hydroponics/nutrients.yml | 27 ++++++++--- Resources/Prototypes/Reagents/fun.yml | 4 ++ Resources/Prototypes/Reagents/toxins.yml | 4 ++ 12 files changed, 119 insertions(+), 58 deletions(-) create mode 100644 Content.Server/EntityEffects/Effects/Botany/PlantAdjustNutrientEntityEffectSystem.cs create mode 100644 Content.Shared/EntityEffects/Effects/Botany/PlantAdjustNutrientEntityEffect.cs diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index d3d17288630..62f3e93a44a 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -146,16 +146,13 @@ private void OnExamine(Entity entity, ref ExaminedEvent ar if (component.PestLevel >= 5) args.PushMarkup(Loc.GetString("plant-holder-component-pest-high-level-message")); - args.PushMarkup(Loc.GetString($"plant-holder-component-water-level-message", - ("waterLevel", (int)component.WaterLevel))); - - foreach (var nutrientID in component.Nutrients.Keys) + foreach (var nutrientId in component.Nutrients.Keys) { - var nutrient = _prototype.Index(nutrientID); + var nutrient = _prototype.Index(nutrientId); args.PushMarkup(Loc.GetString(nutrient.LocalizedName) + Loc.GetString($"plant-holder-component-nutrient-level-message", ("color", nutrient.SubstanceColor), - ("nutritionLevel", component.Nutrients[nutrientID]))); + ("nutritionLevel", component.Nutrients[nutrientId]))); } if (component.DrawWarnings) @@ -363,7 +360,7 @@ private void OnInteractUsing(Entity entity, ref InteractUs if (seed != null) { var nutrientBonus = seed.Potency / 2.5f; - AdjustNutrient(uid, nutrientBonus, component); + AdjustNutrient(uid, nutrientBonus, "nutrient", component); } QueueDel(args.Used); } @@ -475,23 +472,6 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) component.UpdateSpriteAfterUpdate = true; } - // Nutrient consumption. - if (component.Seed.NutrientConsumption > 0 && component.NutritionLevel > 0 && _random.Prob(0.75f)) - { - component.NutritionLevel -= MathF.Max(0f, component.Seed.NutrientConsumption * HydroponicsSpeedMultiplier); - if (component.DrawWarnings) - component.UpdateSpriteAfterUpdate = true; - } - - // Water consumption. - if (component.Seed.WaterConsumption > 0 && component.WaterLevel > 0 && _random.Prob(0.75f)) - { - component.WaterLevel -= MathF.Max(0f, - component.Seed.WaterConsumption * HydroponicsConsumptionMultiplier * HydroponicsSpeedMultiplier); - if (component.DrawWarnings) - component.UpdateSpriteAfterUpdate = true; - } - var healthMod = _random.Next(1, 3) * HydroponicsSpeedMultiplier; // Make sure genetics are viable. @@ -860,25 +840,19 @@ public void AffectGrowth(EntityUid uid, int amount, PlantHolderComponent? compon } } - public void AdjustNutrient(EntityUid uid, float amount, PlantHolderComponent? component = null) - { - if (!Resolve(uid, ref component)) - return; - - component.NutritionLevel += amount; - } - - public void AdjustWater(EntityUid uid, float amount, PlantHolderComponent? component = null) + public void AdjustNutrient(EntityUid uid, FixedPoint2 amount, ProtoId nutrient, PlantHolderComponent? component = null) { if (!Resolve(uid, ref component)) return; - component.WaterLevel += amount; + if (!component.Nutrients.TryAdd(nutrient, amount)) + { + component.Nutrients[nutrient] += amount; + } - // Water dilutes toxins. - if (amount > 0) + if (component.Nutrients[nutrient] <= 0) { - component.Toxins -= amount * 4f; + component.Nutrients.Remove(nutrient); } } diff --git a/Content.Server/EntityEffects/Effects/Botany/PlantAdjustNutrientEntityEffectSystem.cs b/Content.Server/EntityEffects/Effects/Botany/PlantAdjustNutrientEntityEffectSystem.cs new file mode 100644 index 00000000000..253a61f12be --- /dev/null +++ b/Content.Server/EntityEffects/Effects/Botany/PlantAdjustNutrientEntityEffectSystem.cs @@ -0,0 +1,17 @@ +using Content.Server.Botany.Components; +using Content.Server.Botany.Systems; +using Content.Shared.EntityEffects; +using Content.Shared.EntityEffects.Effects.Botany; +using Content.Shared.EntityEffects.Effects.Botany.PlantAttributes; + +namespace Content.Server.EntityEffects.Effects.Botany.PlantAttributes; + +public sealed partial class PlantAdjustNutrientEntityEffectSystem : EntityEffectSystem +{ + [Dependency] private readonly PlantHolderSystem _plantHolder = default!; + + protected override void Effect(Entity entity, ref EntityEffectEvent args) + { + _plantHolder.AdjustNutrient(entity, args.Effect.Amount, args.Effect.Nutrient, entity); + } +} diff --git a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustNutritionEntityEffectSystem.cs b/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustNutritionEntityEffectSystem.cs index 56c016700dd..797efc796de 100644 --- a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustNutritionEntityEffectSystem.cs +++ b/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustNutritionEntityEffectSystem.cs @@ -4,13 +4,13 @@ using Content.Shared.EntityEffects.Effects.Botany.PlantAttributes; namespace Content.Server.EntityEffects.Effects.Botany.PlantAttributes; - +// TODO: Delete this entity effect after all usages have been replaced with PlantAdjustNutrient public sealed partial class PlantAdjustNutritionEntityEffectSystem : EntityEffectSystem { [Dependency] private readonly PlantHolderSystem _plantHolder = default!; protected override void Effect(Entity entity, ref EntityEffectEvent args) { - _plantHolder.AdjustNutrient(entity, args.Effect.Amount, entity); + _plantHolder.AdjustNutrient(entity, args.Effect.Amount, "nutrient", entity); } } diff --git a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustToxinsEntityEffectSystem.cs b/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustToxinsEntityEffectSystem.cs index 31dc3289777..a77b7c35cca 100644 --- a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustToxinsEntityEffectSystem.cs +++ b/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustToxinsEntityEffectSystem.cs @@ -1,16 +1,15 @@ using Content.Server.Botany.Components; +using Content.Server.Botany.Systems; using Content.Shared.EntityEffects; using Content.Shared.EntityEffects.Effects.Botany.PlantAttributes; namespace Content.Server.EntityEffects.Effects.Botany.PlantAttributes; - +// TODO: Delete this entity effect after all usages have been replaced with PlantAdjustNutrient public sealed partial class PlantAdjustToxinsEntityEffectSystem : EntityEffectSystem { + [Dependency] private readonly PlantHolderSystem _plantHolder = default!; protected override void Effect(Entity entity, ref EntityEffectEvent args) { - if (entity.Comp.Seed == null || entity.Comp.Dead) - return; - - entity.Comp.Toxins += args.Effect.Amount; + _plantHolder.AdjustNutrient(entity, args.Effect.Amount, "toxin", entity); } } diff --git a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustWaterEntityEffectSystem.cs b/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustWaterEntityEffectSystem.cs index 706eeb2ffe0..b189879ed08 100644 --- a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustWaterEntityEffectSystem.cs +++ b/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustWaterEntityEffectSystem.cs @@ -4,13 +4,14 @@ using Content.Shared.EntityEffects.Effects.Botany.PlantAttributes; namespace Content.Server.EntityEffects.Effects.Botany.PlantAttributes; - +// TODO: Delete this entity effect after all usages have been replaced with PlantAdjustNutrient public sealed partial class PlantAdjustWaterEntityEffectSystem : EntityEffectSystem { [Dependency] private readonly PlantHolderSystem _plantHolder = default!; protected override void Effect(Entity entity, ref EntityEffectEvent args) { - _plantHolder.AdjustWater(entity, args.Effect.Amount, entity.Comp); + _plantHolder.AdjustNutrient(entity, args.Effect.Amount, "water", entity); + _plantHolder.AdjustNutrient(entity, args.Effect.Amount * -4, "toxin", entity); } } diff --git a/Content.Shared/EntityEffects/Effects/Botany/PlantAdjustNutrientEntityEffect.cs b/Content.Shared/EntityEffects/Effects/Botany/PlantAdjustNutrientEntityEffect.cs new file mode 100644 index 00000000000..c7851407106 --- /dev/null +++ b/Content.Shared/EntityEffects/Effects/Botany/PlantAdjustNutrientEntityEffect.cs @@ -0,0 +1,38 @@ +using Robust.Shared.Prototypes; +using Content.Shared.Botany; +using Content.Shared.FixedPoint; + +namespace Content.Shared.EntityEffects.Effects.Botany; + +/// +/// A type of which modifies the nutrient of a Seed in a PlantHolder. +/// These are not modified by scale as botany has no concept of scale. +/// +/// The effect inheriting this BaseEffect +/// +public sealed partial class PlantAdjustNutrient : EntityEffectBase +{ + /// + /// How much we're adjusting the given nutrient by. + /// + [DataField(required: true)] + public FixedPoint2 Amount { get; private set; } = 1; + + /// + /// The given nutrient + /// + [DataField(required: true)] + public ProtoId Nutrient { get; set; } + + public override string? EntityEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) + { + return prototype.Resolve(Nutrient, out PlantNutrientPrototype? proto) + ? Loc.GetString("entity-effect-guidebook-plant-nutrient", + ("nutrient", Loc.GetString(proto.LocalizedName)), + ("amount", Amount.ToString()), + ("color", proto.SubstanceColor), + ("chance", Probability)) + : null; + + } +} diff --git a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl index 41d83b5184c..b9dfdc0db26 100644 --- a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl +++ b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl @@ -23,7 +23,6 @@ plant-holder-component-plant-unhealthy-adjective = unhealthy plant-holder-component-dead-plant-matter-message = It's full of [color=red]dead plant matter[/color]. plant-holder-component-weed-high-level-message = It's filled with [color=green]weeds[/color]! plant-holder-component-pest-high-level-message = It's filled with [color=gray]tiny worms[/color]! -plant-holder-component-water-level-message = Water: [color=cyan]{$waterLevel}[/color]. plant-holder-component-nutrient-level-message = : [color={$color}]{$nutritionLevel}[/color]. plant-holder-component-toxins-high-warning = The [color=red]toxicity level alert[/color] is flashing red. plant-holder-component-light-improper-warning = The [color=yellow]improper light level alert[/color] is blinking. diff --git a/Resources/Locale/en-US/botany/plant-nutrients.ftl b/Resources/Locale/en-US/botany/plant-nutrients.ftl index 86092b2e6b6..575bdbf72bb 100644 --- a/Resources/Locale/en-US/botany/plant-nutrients.ftl +++ b/Resources/Locale/en-US/botany/plant-nutrients.ftl @@ -1,5 +1,11 @@ -nutrient-name-test = Test Nutrient -nutrient-desc-test = Nutrient description! Add this to your plant! (Legal Disclaimer: This currently cannot be added to plants) +nutrient-name-nutrient = nutrients +nutrient-desc-nutrient = Nutrient description! Add this to your plant! (Legal Disclaimer: This currently can be added to plants) -nutrient-name-goog = Goog -nutrient-desc-goog = Long description waijfiowafiowafiowjafvwajfwoafjowafoiwoajfwjafojowajiowajofijwaofjiawfiojoij Among us awjfpawfpbabfajioioafjafiwowfjawfoffj Unfunny joke here +nutrient-name-water = water +nutrient-desc-water = It is water, plant drink this, hydroponic tray. + +nutrient-name-toxin = toxins +nutrient-desc-toxin = This nutrient will kill your plants when that's implemented. + +nutrient-name-clown = clown essence +nutrient-desc-clown = Honk! diff --git a/Resources/Locale/en-US/guidebook/entity-effects/effects.ftl b/Resources/Locale/en-US/guidebook/entity-effects/effects.ftl index 3a453b3404b..fee8cfffc8f 100644 --- a/Resources/Locale/en-US/guidebook/entity-effects/effects.ftl +++ b/Resources/Locale/en-US/guidebook/entity-effects/effects.ftl @@ -483,6 +483,12 @@ entity-effect-guidebook-plant-attribute = *[false] [color=green]{$amount}[/color] } +entity-effect-guidebook-plant-nutrient = + { $chance -> + [1] Adjusts + *[other] adjust + } {$nutrient} by [color={$color}]{$amount}[/color] + entity-effect-guidebook-plant-cryoxadone = { $chance -> [1] Ages back diff --git a/Resources/Prototypes/Hydroponics/nutrients.yml b/Resources/Prototypes/Hydroponics/nutrients.yml index 7e80a1eefcd..6f17ec24d00 100644 --- a/Resources/Prototypes/Hydroponics/nutrients.yml +++ b/Resources/Prototypes/Hydroponics/nutrients.yml @@ -1,10 +1,23 @@ - type: plantNutrient - id: test - name: nutrient-name-test - desc: nutrient-desc-test + id: nutrient + name: nutrient-name-nutrient + desc: nutrient-desc-nutrient + color: "orange" - type: plantNutrient - id: goog - name: nutrient-name-goog - desc: nutrient-desc-goog - color: "#8487ff" + id: water + name: nutrient-name-water + desc: nutrient-desc-water + color: "cyan" + +- type: plantNutrient + id: toxin + name: nutrient-name-toxin + desc: nutrient-desc-toxin + color: "red" + +- type: plantNutrient + id: clown + name: nutrient-name-clown + desc: nutrient-desc-clown + color: "#FF4DD2" diff --git a/Resources/Prototypes/Reagents/fun.yml b/Resources/Prototypes/Reagents/fun.yml index f9b99cc5b9c..8fa5fc74359 100644 --- a/Resources/Prototypes/Reagents/fun.yml +++ b/Resources/Prototypes/Reagents/fun.yml @@ -313,6 +313,10 @@ color: "#FF4DD2" slipData: requiredSlipSpeed: 3.5 #clown juice gotta slip + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 0.1 + nutrient: clown metabolisms: Bloodstream: effects: diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index 6f59fda9ad6..51d2052e158 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -648,6 +648,10 @@ physicalDesc: reagent-physical-desc-pungent flavor: bitter color: "#F2E9D2" + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: clown metabolisms: Bloodstream: metabolismRate: 0.05 From 125222c31c5cfbe80918b51b31ac15d6c8bc4425 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Sun, 21 Jun 2026 00:56:41 -0500 Subject: [PATCH 06/61] Capitalisation fix --- Content.Server/Botany/Systems/PlantHolderSystem.cs | 4 ++-- .../Locale/en-US/botany/components/plant-holder-component.ftl | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index 62f3e93a44a..a8e7cd3bdec 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -149,8 +149,8 @@ private void OnExamine(Entity entity, ref ExaminedEvent ar foreach (var nutrientId in component.Nutrients.Keys) { var nutrient = _prototype.Index(nutrientId); - args.PushMarkup(Loc.GetString(nutrient.LocalizedName) + - Loc.GetString($"plant-holder-component-nutrient-level-message", + args.PushMarkup(Loc.GetString($"plant-holder-component-nutrient-level-message", + ("name", nutrient.LocalizedName), ("color", nutrient.SubstanceColor), ("nutritionLevel", component.Nutrients[nutrientId]))); } diff --git a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl index b9dfdc0db26..c19d77e07a6 100644 --- a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl +++ b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl @@ -23,7 +23,7 @@ plant-holder-component-plant-unhealthy-adjective = unhealthy plant-holder-component-dead-plant-matter-message = It's full of [color=red]dead plant matter[/color]. plant-holder-component-weed-high-level-message = It's filled with [color=green]weeds[/color]! plant-holder-component-pest-high-level-message = It's filled with [color=gray]tiny worms[/color]! -plant-holder-component-nutrient-level-message = : [color={$color}]{$nutritionLevel}[/color]. +plant-holder-component-nutrient-level-message = {CAPITALIZE($name)}: [color={$color}]{$nutritionLevel}[/color]. plant-holder-component-toxins-high-warning = The [color=red]toxicity level alert[/color] is flashing red. plant-holder-component-light-improper-warning = The [color=yellow]improper light level alert[/color] is blinking. plant-holder-component-heat-improper-warning = The [color=orange]improper temperature level alert[/color] is blinking. From be6d5134ce6bdaf30bf4dc8be7016ad17758ffd4 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Sun, 21 Jun 2026 23:23:36 -0500 Subject: [PATCH 07/61] Remove the word "reagent" from plant nutrient guidebook code --- .../Controls/GuidePlantNutrientEmbed.xaml | 10 +++++----- .../Controls/GuidePlantNutrientEmbed.xaml.cs | 16 +++++++--------- .../GuidePlantNutrientGroupEmbed.xaml.cs | 2 +- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml b/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml index 007bbd12473..7726f342e9c 100644 --- a/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml +++ b/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml @@ -8,21 +8,21 @@ - + - - + diff --git a/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml.cs b/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml.cs index 74b09fc6c35..0f52c87f3cd 100644 --- a/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml.cs +++ b/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml.cs @@ -21,7 +21,7 @@ namespace Content.Client.Guidebook.Controls; /// -/// Control for embedding a reagent into a guidebook. +/// Control for embedding a plant nutrient into a guidebook. /// [UsedImplicitly, GenerateTypedNameReferences] public sealed partial class GuidePlantNutrientEmbed : BoxContainer, IDocumentTag, ISearchableControl, IPrototypeRepresentationControl @@ -40,7 +40,7 @@ public GuidePlantNutrientEmbed() { RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); - _sawmill = _logManager.GetSawmill("guidebook.reagent"); + _sawmill = _logManager.GetSawmill("guidebook.plantNutrient"); //_chemistryGuideData = _systemManager.GetEntitySystem(); MouseFilter = MouseFilterMode.Stop; } @@ -68,15 +68,15 @@ public void SetHiddenState(bool state, string query) public bool TryParseTag(Dictionary args, [NotNullWhen(true)] out Control? control) { control = null; - if (!args.TryGetValue("Reagent", out var id)) + if (!args.TryGetValue("Nutrient", out var id)) { - _sawmill.Error("Reagent embed tag is missing reagent prototype argument"); + _sawmill.Error("Plant nutrient embed tag is missing nutrient prototype argument"); return false; } if (!_prototype.TryIndex(id, out var nutrient)) { - _sawmill.Error($"Specified reagent prototype \"{id}\" is not a valid reagent prototype"); + _sawmill.Error($"Specified plant nutrient prototype \"{id}\" is not a valid plant nutrient prototype"); return false; } @@ -103,7 +103,7 @@ private void GenerateControl(PlantNutrientPrototype nutrient) ? Color.Black : Color.White; - ReagentName.SetMarkup(Loc.GetString("guidebook-reagent-name", + NutrientName.SetMarkup(Loc.GetString("guidebook-reagent-name", ("color", textColor), ("name", nutrient.LocalizedName))); #region Effects @@ -164,10 +164,8 @@ private void GenerateControl(PlantNutrientPrototype nutrient) FormattedMessage description = new(); description.AddText(nutrient.LocalizedDescription); description.PushNewline(); - /*description.AddMarkupOrThrow(Loc.GetString("guidebook-reagent-physical-description", - ("description", nutrient.LocalizedPhysicalDescription)));*/ - ReagentDescription.SetMessage(description); + NutrientDescription.SetMessage(description); } /*private void GenerateSources(ReagentPrototype reagent) diff --git a/Content.Client/Guidebook/Controls/GuidePlantNutrientGroupEmbed.xaml.cs b/Content.Client/Guidebook/Controls/GuidePlantNutrientGroupEmbed.xaml.cs index 397f197dccd..8ed92df83ce 100644 --- a/Content.Client/Guidebook/Controls/GuidePlantNutrientGroupEmbed.xaml.cs +++ b/Content.Client/Guidebook/Controls/GuidePlantNutrientGroupEmbed.xaml.cs @@ -13,7 +13,7 @@ namespace Content.Client.Guidebook.Controls; /// -/// Control for embedding a reagent into a guidebook. +/// Control for embedding a plant nutrient into a guidebook. /// [UsedImplicitly, GenerateTypedNameReferences] public sealed partial class GuidePlantNutrientGroupEmbed : BoxContainer, IDocumentTag From 60d0eda75769cd31dfa10c1ab84c92656801d447 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Mon, 22 Jun 2026 19:05:20 -0500 Subject: [PATCH 08/61] Plant nutrient guidebook sources tab --- .../Controls/GuidePlantNutrientEmbed.xaml.cs | 66 +++--- .../Controls/GuidePlantNutrientSource.xaml | 30 +++ .../Controls/GuidePlantNutrientSource.xaml.cs | 223 ++++++++++++++++++ .../en-US/guidebook/plant-nutrients.ftl | 3 + 4 files changed, 284 insertions(+), 38 deletions(-) create mode 100644 Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml create mode 100644 Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml.cs create mode 100644 Resources/Locale/en-US/guidebook/plant-nutrients.ftl diff --git a/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml.cs b/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml.cs index 0f52c87f3cd..bd611798f4a 100644 --- a/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml.cs +++ b/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml.cs @@ -3,6 +3,7 @@ using Content.Client.Message; using Content.Client.UserInterface.ControlExtensions; using Content.Shared.CCVar; +using Content.Shared.Chemistry.Reagent; using Content.Shared.Botany; using Content.Shared.Localizations; using Content.Shared.Metabolism; @@ -17,6 +18,8 @@ using Robust.Shared.Utility; using System.Diagnostics.CodeAnalysis; using System.Linq; +using Content.Shared.EntityEffects; +using Content.Shared.EntityEffects.Effects.Botany; namespace Content.Client.Guidebook.Controls; @@ -159,7 +162,25 @@ private void GenerateControl(PlantNutrientPrototype nutrient) }*/ #endregion - //GenerateSources(reagent); + #region Recipe + var reagents = _prototype.EnumeratePrototypes() + .Where(p => CheckReagentPlantMetabolisms(p.PlantMetabolisms, nutrient.ID)) + //.OrderBy(p => p.Priority) + //.ThenBy(p => p.Products.Count) + .ToList(); + + if (reagents.Any()) + { + foreach (var reagentPrototype in reagents) + { + SourcesDescriptionContainer.AddChild(new GuidePlantNutrientSource(reagentPrototype, _prototype, _systemManager)); + } + } + else + { + SourcesContainer.Visible = false; + } + #endregion FormattedMessage description = new(); description.AddText(nutrient.LocalizedDescription); @@ -168,45 +189,14 @@ private void GenerateControl(PlantNutrientPrototype nutrient) NutrientDescription.SetMessage(description); } - /*private void GenerateSources(ReagentPrototype reagent) + private bool CheckReagentPlantMetabolisms(List effects, string nutrientId) { - var sources = _chemistryGuideData.GetReagentSources(reagent.ID); - if (sources.Count == 0) + foreach (var effect in effects) { - SourcesContainer.Visible = false; - return; + if (effect is PlantAdjustNutrient adjustNutrient && adjustNutrient.Nutrient == nutrientId) + return true; } - SourcesContainer.Visible = true; + return false; + } - var orderedSources = sources - .OrderBy(o => o.OutputCount) - .ThenBy(o => o.IdentifierString); - foreach (var source in orderedSources) - { - if (source is ReagentEntitySourceData entitySourceData) - { - SourcesDescriptionContainer.AddChild(new GuideReagentReaction( - entitySourceData.SourceEntProto, - entitySourceData.Solution, - entitySourceData.MixingType, - _prototype, - _systemManager)); - } - else if (source is ReagentReactionSourceData reactionSourceData) - { - SourcesDescriptionContainer.AddChild(new GuideReagentReaction( - reactionSourceData.ReactionPrototype, - _prototype, - _systemManager)); - } - else if (source is ReagentGasSourceData gasSourceData) - { - SourcesDescriptionContainer.AddChild(new GuideReagentReaction( - gasSourceData.GasPrototype, - gasSourceData.MixingType, - _prototype, - _systemManager)); - } - } - }*/ } diff --git a/Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml b/Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml new file mode 100644 index 00000000000..d87b0c755d8 --- /dev/null +++ b/Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml.cs b/Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml.cs new file mode 100644 index 00000000000..b8ef8403e85 --- /dev/null +++ b/Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml.cs @@ -0,0 +1,223 @@ +using Content.Client.Message; +using Content.Client.UserInterface.ControlExtensions; +using Content.Shared.Atmos.Prototypes; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reaction; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.FixedPoint; +using Content.Shared.Localizations; +using Content.Shared.EntityEffects.Effects.Botany; +using Content.Shared.Botany; +using JetBrains.Annotations; +using Robust.Client.AutoGenerated; +using Robust.Client.GameObjects; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Graphics.RSI; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; +using System.Linq; + +namespace Content.Client.Guidebook.Controls; + +[UsedImplicitly, GenerateTypedNameReferences] +public sealed partial class GuidePlantNutrientSource : BoxContainer, ISearchableControl +{ + private static readonly ProtoId DefaultMixingCategory = "DummyMix"; + + private readonly IPrototypeManager _protoMan; + + public GuidePlantNutrientSource(IPrototypeManager protoMan) + { + RobustXamlLoader.Load(this); + _protoMan = protoMan; + } + + public GuidePlantNutrientSource(ReagentPrototype reagent, IPrototypeManager protoMan, IEntitySystemManager sysMan, string prod = "") : this(protoMan) + { + Container container = SourcesContainer; + SetNutrients(reagent, ref container, protoMan); + Container productContainer = NutrientsContainer; + var nutrients = GetNutrients(reagent); + if (prod != "") + { + nutrients.Add(prod, 1); + } + SetNutrients(nutrients, ref productContainer, protoMan, false); + SetMixingCategory(sysMan); + } + + public GuidePlantNutrientSource(EntityPrototype prototype, + Solution solution, + IReadOnlyList> categories, + IPrototypeManager protoMan, + IEntitySystemManager sysMan) : this(protoMan) + { + var icon = sysMan.GetEntitySystem().GetPrototypeIcon(prototype).GetFrame(RsiDirection.South, 0); + var entContainer = new BoxContainer + { + Orientation = LayoutOrientation.Horizontal, + HorizontalExpand = true, + HorizontalAlignment = HAlignment.Center, + Children = + { + new TextureRect + { + Texture = icon + } + } + }; + var nameLabel = new RichTextLabel(); + nameLabel.SetMarkup(Loc.GetString("guidebook-reagent-sources-ent-wrapper", ("name", prototype.Name))); + entContainer.AddChild(nameLabel); + SourcesContainer.AddChild(entContainer); + + Container productContainer = NutrientsContainer; + SetNutrients(solution.Contents, ref productContainer, protoMan, false); + SetMixingCategory(/*categories,*/ sysMan); + } + + public GuidePlantNutrientSource(GasPrototype prototype, + IReadOnlyList> categories, + IPrototypeManager protoMan, + IEntitySystemManager sysMan) : this(protoMan) + { + var label = new RichTextLabel(); + label.SetMarkup(Loc.GetString("guidebook-reagent-sources-gas-wrapper", + ("name", Loc.GetString(prototype.Name).ToLower()))); + + SourcesContainer.Visible = true; + SourcesContainer.AddChild(label); + + if (prototype.Reagent != null) + { + var quantity = new Dictionary + { + { prototype.Reagent, FixedPoint2.New(0.21f) } + }; + Container productContainer = NutrientsContainer; + SetNutrients(quantity, ref productContainer, protoMan, false); + } + SetMixingCategory(/*categories,*/ sysMan); + } + + private Dictionary GetNutrients(ReagentPrototype reagent) + { + Dictionary nutrients = new(); + foreach (var effect in reagent.PlantMetabolisms) + { + if (effect is PlantAdjustNutrient adjustNutrient) + nutrients.Add(adjustNutrient.Nutrient, adjustNutrient.Amount); + } + return nutrients; + } + + private void SetNutrients(List reagents, ref Container container, IPrototypeManager protoMan, bool addLinks = true) + { + var amounts = new Dictionary(); + foreach (var (reagent, quantity) in reagents) + { + amounts.Add(reagent.Prototype, quantity); + } + SetNutrients(amounts, ref container, protoMan, addLinks); + } + + private void SetNutrients( + ReagentPrototype reagent, + ref Container container, + IPrototypeManager protoMan, + bool addLinks = true) + { + var amounts = new Dictionary(); + amounts.Add(reagent.ID, 1); + SetNutrients(amounts, ref container, protoMan, addLinks); + } + + [PublicAPI] + private void SetNutrients( + Dictionary, ReactantPrototype> reactants, + ref Container container, + IPrototypeManager protoMan, + bool addLinks = true) + { + var amounts = new Dictionary(); + foreach (var (reagent, reactantPrototype) in reactants) + { + amounts.Add(reagent, reactantPrototype.Amount); + } + SetNutrients(amounts, ref container, protoMan, addLinks); + } + + private void SetNutrients(Dictionary reagents, ref Container container, IPrototypeManager protoMan, bool addLinks = true) + { + foreach (var (product, amount) in reagents.OrderByDescending(p => p.Value)) + { + var msg = new FormattedMessage(); + var label = new GuidebookRichPrototypeLink(); + if (protoMan.HasIndex(product)) + { + var productProto = protoMan.Index(product); + msg.AddMarkupOrThrow(Loc.GetString("guidebook-reagent-recipes-reagent-display", + ("reagent", productProto.LocalizedName), ("ratio", amount))); + if (addLinks) + label.LinkedPrototype = productProto; + } + else if (protoMan.HasIndex(product)) + { + var productProto = protoMan.Index(product); + msg.AddMarkupOrThrow(Loc.GetString("guidebook-reagent-recipes-reagent-display", + ("reagent", productProto.LocalizedName), ("ratio", amount))); + if (addLinks) + label.LinkedPrototype = productProto; + } + else + { + var productProto = protoMan.Index(product); + msg.AddMarkupOrThrow(Loc.GetString("guidebook-reagent-recipes-reagent-display", + ("reagent", productProto.Name), ("ratio", amount))); + if (addLinks) + label.LinkedPrototype = productProto; + } + label.SetMessage(msg); + container.AddChild(label); + } + container.Visible = true; + } + + /*private void SetMixingCategory(IReadOnlyList> mixingCategories, IEntitySystemManager sysMan) + { + var foo = new List(); + foreach (var cat in mixingCategories) + { + foo.Add(_protoMan.Index(cat)); + } + SetMixingCategory(foo, sysMan); + }*/ + + private void SetMixingCategory(/*IReadOnlyList mixingCategories, */IEntitySystemManager sysMan) + { + /*if (mixingCategories.Count == 0) + return; + + // only use the first one for the icon. + if (mixingCategories.First() is { } primaryCategory) + { + MixTexture.Texture = sysMan.GetEntitySystem().Frame0(primaryCategory.Icon); + } + */ + + var text = Loc.GetString("guidebook-plant-nutrients-source-info", ("verb", Loc.GetString("plant-nutrient-source-verb-default-osmosis"))); + + MixLabel.SetMarkup(text); + } + + public bool CheckMatchesSearch(string query) + { + return this.ChildrenContainText(query); + } + + public void SetHiddenState(bool state, string query) + { + Visible = CheckMatchesSearch(query) ? state : !state; + } +} diff --git a/Resources/Locale/en-US/guidebook/plant-nutrients.ftl b/Resources/Locale/en-US/guidebook/plant-nutrients.ftl new file mode 100644 index 00000000000..5a44860863c --- /dev/null +++ b/Resources/Locale/en-US/guidebook/plant-nutrients.ftl @@ -0,0 +1,3 @@ +guidebook-plant-nutrients-source-info = {CAPITALIZE($verb)} + +plant-nutrient-source-verb-default-osmosis = osmosis From 311f84818cc69ee3aeb3fe3b861edc295b80a994 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 23 Jun 2026 17:40:15 -0500 Subject: [PATCH 09/61] Add NutrientRequirement struct --- Content.Server/Botany/SeedPrototype.cs | 34 +++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/Content.Server/Botany/SeedPrototype.cs b/Content.Server/Botany/SeedPrototype.cs index a01d96a8781..9c1d051e650 100644 --- a/Content.Server/Botany/SeedPrototype.cs +++ b/Content.Server/Botany/SeedPrototype.cs @@ -1,4 +1,5 @@ using Content.Shared.Atmos; +using Content.Shared.Botany; using Content.Shared.Database; using Content.Shared.FixedPoint; using Content.Shared.Random; @@ -58,18 +59,23 @@ public partial struct SeedChemQuantity /// /// Minimum amount of chemical that is added to produce, regardless of the potency /// - [DataField("Min")] public FixedPoint2 Min = FixedPoint2.Epsilon; + [DataField("Min")] public FixedPoint2 Min = FixedPoint2.Epsilon; // To be removed /// /// Maximum amount of chemical that can be produced after taking plant potency into account. /// - [DataField("Max")] public FixedPoint2 Max; + [DataField("Max")] public FixedPoint2 Max; // To be removed /// /// When chemicals are added to produce, the potency of the seed is divided with this value. Final chemical amount is the result plus the `Min` value. /// Example: PotencyDivisor of 20 with seed potency of 55 results in 2.75, 55/20 = 2.75. If minimum is 1 then final result will be 3.75 of that chemical, 55/20+1 = 3.75. /// - [DataField("PotencyDivisor")] public float PotencyDivisor; + [DataField("PotencyDivisor")] public float PotencyDivisor; // To be removed + + /// + /// Nutrient requirements needed for the plant's produce to contain this reagent + /// + [DataField("Requirements")] public Dictionary, NutrientRequirement> Requirements = new(); /// /// Inherent chemical is one that is NOT result of mutation or crossbreeding. These chemicals are removed if species mutation is executed. @@ -77,6 +83,25 @@ public partial struct SeedChemQuantity [DataField("Inherent")] public bool Inherent = true; } +[DataDefinition] +public partial struct NutrientRequirement +{ + /// + /// Minimum amount of nutrients required to meet the requirement. + /// + [DataField("Min")] public FixedPoint2 Min = FixedPoint2.Zero; + + /// + /// Amount of nutrients required to get the full reagent bonus. + /// + [DataField("Max")] public FixedPoint2 Max; + + /// + /// Amount of extra reagent added to the produce when the maximum requirement is reached, does nothing if the requirement is not used by a reagent. + /// + [DataField("Bonus")] public FixedPoint2 Bonus = FixedPoint2.Zero; +} + // TODO Make Botany ECS and give it a proper API. I removed the limited access of this class because it's egregious how many systems needed access to it due to a lack of an actual API. /// /// SeedData is no longer restricted because the number of friends is absolutely unreasonable. @@ -148,6 +173,9 @@ public partial class SeedData [DataField] public float NutrientConsumption = 0.75f; [DataField] public float WaterConsumption = 0.5f; + + [DataField] public Dictionary, NutrientRequirement> Requirements = new(); + [DataField] public float IdealHeat = 293f; [DataField] public float HeatTolerance = 10f; [DataField] public float IdealLight = 7f; From c64d4c69382726ae66bc2cb5c54c8de8486d0f77 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 23 Jun 2026 18:28:40 -0500 Subject: [PATCH 10/61] Fix requirements being lost when seedData is cloned. --- Content.Server/Botany/SeedPrototype.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Content.Server/Botany/SeedPrototype.cs b/Content.Server/Botany/SeedPrototype.cs index 9c1d051e650..dfa1fe1c80f 100644 --- a/Content.Server/Botany/SeedPrototype.cs +++ b/Content.Server/Botany/SeedPrototype.cs @@ -302,6 +302,7 @@ public SeedData Clone() Chemicals = new Dictionary(Chemicals), ConsumeGasses = new Dictionary(ConsumeGasses), ExudeGasses = new Dictionary(ExudeGasses), + Requirements = new Dictionary, NutrientRequirement>(Requirements), NutrientConsumption = NutrientConsumption, WaterConsumption = WaterConsumption, @@ -359,6 +360,7 @@ public SeedData SpeciesChange(SeedData other) PacketPrototype = other.PacketPrototype, ProductPrototypes = new List(other.ProductPrototypes), MutationPrototypes = new List>(other.MutationPrototypes), + Requirements = new Dictionary, NutrientRequirement>(other.Requirements), Chemicals = new Dictionary(Chemicals), ConsumeGasses = new Dictionary(ConsumeGasses), From e126e65aa46745d679f2201edc5c143c27c88642 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 23 Jun 2026 23:13:29 -0500 Subject: [PATCH 11/61] Show nutrient requirements in hydroponic tray descriptions --- .../Botany/Components/PlantHolderComponent.cs | 2 +- Content.Server/Botany/PlantNutrientInfo.cs | 17 +++++ Content.Server/Botany/SeedPrototype.cs | 12 +-- .../Botany/Systems/PlantHolderSystem.cs | 75 +++++++++++++++++-- .../components/plant-holder-component.ftl | 10 ++- 5 files changed, 100 insertions(+), 16 deletions(-) create mode 100644 Content.Server/Botany/PlantNutrientInfo.cs diff --git a/Content.Server/Botany/Components/PlantHolderComponent.cs b/Content.Server/Botany/Components/PlantHolderComponent.cs index 1a841a50843..9fa096d43ff 100644 --- a/Content.Server/Botany/Components/PlantHolderComponent.cs +++ b/Content.Server/Botany/Components/PlantHolderComponent.cs @@ -63,7 +63,7 @@ public sealed partial class PlantHolderComponent : Component public float NutritionLevel = 100f; [DataField] - public Dictionary, FixedPoint2> Nutrients = new(); + public Dictionary, PlantNutrientInfo> Nutrients = new(); [DataField] public float PestLevel; diff --git a/Content.Server/Botany/PlantNutrientInfo.cs b/Content.Server/Botany/PlantNutrientInfo.cs new file mode 100644 index 00000000000..9e3d80910b6 --- /dev/null +++ b/Content.Server/Botany/PlantNutrientInfo.cs @@ -0,0 +1,17 @@ +using Content.Shared.FixedPoint; + +namespace Content.Server.Botany; + +[Serializable] +[DataDefinition] +public sealed partial class PlantNutrientInfo +{ + [DataField] + public FixedPoint2 Amount = FixedPoint2.Zero; + + [DataField] + public FixedPoint2 Required = FixedPoint2.Zero; + + [DataField] + public FixedPoint2 Bonus = FixedPoint2.Zero; +} diff --git a/Content.Server/Botany/SeedPrototype.cs b/Content.Server/Botany/SeedPrototype.cs index dfa1fe1c80f..5d26bab7a3c 100644 --- a/Content.Server/Botany/SeedPrototype.cs +++ b/Content.Server/Botany/SeedPrototype.cs @@ -87,19 +87,19 @@ public partial struct SeedChemQuantity public partial struct NutrientRequirement { /// - /// Minimum amount of nutrients required to meet the requirement. + /// Amount of nutrients required to meet the requirement. /// - [DataField("Min")] public FixedPoint2 Min = FixedPoint2.Zero; + [DataField("Requirement")] public FixedPoint2 Requirement = FixedPoint2.Zero; /// - /// Amount of nutrients required to get the full reagent bonus. + /// Amount of extra nutrients required to get the full reagent bonus. If this is zero, the reagent bonus is always added. /// - [DataField("Max")] public FixedPoint2 Max; + [DataField("BonusRequirement")] public FixedPoint2 BonusRequirement = FixedPoint2.Zero; /// - /// Amount of extra reagent added to the produce when the maximum requirement is reached, does nothing if the requirement is not used by a reagent. + /// Amount of extra reagent added to the produce when the bonus requirement is fulfilled, does nothing if the requirement is not used by a reagent. /// - [DataField("Bonus")] public FixedPoint2 Bonus = FixedPoint2.Zero; + [DataField("BonusAmount")] public FixedPoint2 BonusAmount = FixedPoint2.Zero; } // TODO Make Botany ECS and give it a proper API. I removed the limited access of this class because it's egregious how many systems needed access to it due to a lack of an actual API. diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index a8e7cd3bdec..f35f72fbc63 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -1,3 +1,4 @@ +using System.Linq; using Content.Server.Atmos.EntitySystems; using Content.Server.Botany.Components; using Content.Server.Hands.Systems; @@ -27,6 +28,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Timing; +using Robust.Shared.Utility; namespace Content.Server.Botany.Systems; @@ -149,10 +151,19 @@ private void OnExamine(Entity entity, ref ExaminedEvent ar foreach (var nutrientId in component.Nutrients.Keys) { var nutrient = _prototype.Index(nutrientId); + var nutrientInfo = component.Nutrients[nutrientId]; + var bonusMessage = ""; + if (nutrientInfo.Bonus > 0) + bonusMessage = Loc.GetString($"plant-holder-component-nutrient-bonus-message", + ("bonusNutrients", nutrientInfo.Bonus + nutrientInfo.Required), + ("fulfilled", nutrientInfo.Amount >= nutrientInfo.Bonus + nutrientInfo.Required)); args.PushMarkup(Loc.GetString($"plant-holder-component-nutrient-level-message", - ("name", nutrient.LocalizedName), - ("color", nutrient.SubstanceColor), - ("nutritionLevel", component.Nutrients[nutrientId]))); + ("name", nutrient.LocalizedName), + ("color", nutrient.SubstanceColor), + ("nutrientLevel", nutrientInfo.Amount), + ("requiredNutrients", nutrientInfo.Required), + ("fulfilled", nutrientInfo.Amount >= nutrientInfo.Required), + ("bonusMessage", bonusMessage))); } if (component.DrawWarnings) @@ -214,6 +225,7 @@ private void OnInteractUsing(Entity entity, ref InteractUs CheckLevelSanity(uid, component); UpdateSprite(uid, component); + UpdateNutrientRequirements(uid, component); if (seed.PlantLogImpact != null) _adminLogger.Add(LogType.Botany, seed.PlantLogImpact.Value, $"{ToPrettyString(args.User):player} planted {Loc.GetString(seed.Name):seed} at Pos:{Transform(uid).Coordinates}."); @@ -814,6 +826,7 @@ public void RemovePlant(EntityUid uid, PlantHolderComponent? component = null) component.ImproperHeat = false; UpdateSprite(uid, component); + UpdateNutrientRequirements(uid, component); } public void AffectGrowth(EntityUid uid, int amount, PlantHolderComponent? component = null) @@ -840,19 +853,64 @@ public void AffectGrowth(EntityUid uid, int amount, PlantHolderComponent? compon } } - public void AdjustNutrient(EntityUid uid, FixedPoint2 amount, ProtoId nutrient, PlantHolderComponent? component = null) + public void AdjustNutrient(EntityUid uid, FixedPoint2 amount, ProtoId nutrientId, PlantHolderComponent? component = null) { if (!Resolve(uid, ref component)) return; - if (!component.Nutrients.TryAdd(nutrient, amount)) + var nutrient = component.Nutrients.GetOrNew(nutrientId); + + nutrient.Amount += amount; + + if (nutrient.Amount > 0) + return; + + nutrient.Amount = 0; + RemoveEmptyNutrient(uid, nutrientId, component); + } + + private void RemoveEmptyNutrient(EntityUid uid, ProtoId nutrient, PlantHolderComponent? component = null) + { + if (!Resolve(uid, ref component)) + return; + var nutrientInfo = component.Nutrients[nutrient]; + if (nutrientInfo.Amount == 0 && nutrientInfo.Required == 0 && nutrientInfo.Bonus == 0) + component.Nutrients.Remove(nutrient); + } + + public void UpdateNutrientRequirements(EntityUid uid, PlantHolderComponent? component = null) + { + if (!Resolve(uid, ref component)) + return; + foreach (var nutrientInfo in component.Nutrients.Values) { - component.Nutrients[nutrient] += amount; + nutrientInfo.Required = 0; + nutrientInfo.Bonus = 0; } - if (component.Nutrients[nutrient] <= 0) + if (component.Seed != null && !component.Dead) { - component.Nutrients.Remove(nutrient); + var yield = component.Seed.Yield; + foreach (var requirement in component.Seed.Requirements) + { + var nutrient = component.Nutrients.GetOrNew(requirement.Key); + + nutrient.Required += requirement.Value.Requirement * yield; + nutrient.Bonus += requirement.Value.BonusRequirement * yield; + } + + foreach (var requirement in component.Seed.Chemicals.Values.SelectMany(quantity => quantity.Requirements)) + { + var nutrient = component.Nutrients.GetOrNew(requirement.Key); + + nutrient.Required += requirement.Value.Requirement * yield; + nutrient.Bonus += requirement.Value.BonusRequirement * yield; + } + } + + foreach (var nutrientId in component.Nutrients.Keys) + { + RemoveEmptyNutrient(uid, nutrientId, component); } } @@ -892,6 +950,7 @@ private void Mutate(EntityUid uid, float severity, PlantHolderComponent? compone { EnsureUniqueSeed(uid, component); _mutation.MutateSeed(uid, ref component.Seed, severity); + UpdateNutrientRequirements(uid, component); } } diff --git a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl index c19d77e07a6..ddd4f8db3c8 100644 --- a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl +++ b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl @@ -23,7 +23,15 @@ plant-holder-component-plant-unhealthy-adjective = unhealthy plant-holder-component-dead-plant-matter-message = It's full of [color=red]dead plant matter[/color]. plant-holder-component-weed-high-level-message = It's filled with [color=green]weeds[/color]! plant-holder-component-pest-high-level-message = It's filled with [color=gray]tiny worms[/color]! -plant-holder-component-nutrient-level-message = {CAPITALIZE($name)}: [color={$color}]{$nutritionLevel}[/color]. +plant-holder-component-nutrient-level-message = {CAPITALIZE($name)}: [color={$color}]{$nutrientLevel}[/color]/{ $fulfilled -> + [true] [color=green]{$requiredNutrients}[/color] + *[false] [color=red]{$requiredNutrients}[/color] + }{$bonusMessage}. + +plant-holder-component-nutrient-bonus-message = -{ $fulfilled -> + [true] [color=green]{$bonusNutrients}[/color] + *[false] [color=red]{$bonusNutrients}[/color] + } plant-holder-component-toxins-high-warning = The [color=red]toxicity level alert[/color] is flashing red. plant-holder-component-light-improper-warning = The [color=yellow]improper light level alert[/color] is blinking. plant-holder-component-heat-improper-warning = The [color=orange]improper temperature level alert[/color] is blinking. From 4cd9ba41c009203fd83642c84bde2aa1396e5ee2 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Thu, 25 Jun 2026 21:04:52 -0500 Subject: [PATCH 12/61] Bonus nutrient display no longer turns red when not fulfilled --- .../Locale/en-US/botany/components/plant-holder-component.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl index ddd4f8db3c8..1f99fbc09db 100644 --- a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl +++ b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl @@ -30,7 +30,7 @@ plant-holder-component-nutrient-level-message = {CAPITALIZE($name)}: [color={$co plant-holder-component-nutrient-bonus-message = -{ $fulfilled -> [true] [color=green]{$bonusNutrients}[/color] - *[false] [color=red]{$bonusNutrients}[/color] + *[false] {$bonusNutrients} } plant-holder-component-toxins-high-warning = The [color=red]toxicity level alert[/color] is flashing red. plant-holder-component-light-improper-warning = The [color=yellow]improper light level alert[/color] is blinking. From 0074cc198ea397071e8cff7c8be4469f6d26052f Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Fri, 26 Jun 2026 01:11:16 -0500 Subject: [PATCH 13/61] Plants now use up nutrients when harvested, and gain bonus reagents. The nutrient display in plant holder descriptions have been made more elegant --- Content.Server/Botany/SeedPrototype.cs | 5 ++ .../Botany/Systems/BotanySwabSystem.cs | 2 + .../Botany/Systems/BotanySystem.Produce.cs | 26 ++++++-- .../Botany/Systems/BotanySystem.Seed.cs | 12 ++-- .../Botany/Systems/PlantHolderSystem.cs | 64 +++++++++++++++++-- .../components/plant-holder-component.ftl | 7 +- 6 files changed, 98 insertions(+), 18 deletions(-) diff --git a/Content.Server/Botany/SeedPrototype.cs b/Content.Server/Botany/SeedPrototype.cs index 5d26bab7a3c..8b221b7ee59 100644 --- a/Content.Server/Botany/SeedPrototype.cs +++ b/Content.Server/Botany/SeedPrototype.cs @@ -72,6 +72,11 @@ public partial struct SeedChemQuantity /// [DataField("PotencyDivisor")] public float PotencyDivisor; // To be removed + /// + /// Minimum amount of chemical that is added to produce, regardless of nutrient requirement bonuses + /// + [DataField("BaseAmount")] public FixedPoint2 BaseAmount = FixedPoint2.Epsilon; + /// /// Nutrient requirements needed for the plant's produce to contain this reagent /// diff --git a/Content.Server/Botany/Systems/BotanySwabSystem.cs b/Content.Server/Botany/Systems/BotanySwabSystem.cs index e8c7af92c27..025080da0bf 100644 --- a/Content.Server/Botany/Systems/BotanySwabSystem.cs +++ b/Content.Server/Botany/Systems/BotanySwabSystem.cs @@ -12,6 +12,7 @@ public sealed class BotanySwabSystem : EntitySystem [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly MutationSystem _mutationSystem = default!; + [Dependency] private readonly PlantHolderSystem _plantHolderSystem = default!; public override void Initialize() { @@ -73,6 +74,7 @@ private void OnDoAfter(EntityUid uid, BotanySwabComponent swab, DoAfterEvent arg return; plant.Seed = _mutationSystem.Cross(swab.SeedData, old); // Cross-pollenate swab.SeedData = old; // Transfer old plant pollen to swab + _plantHolderSystem.UpdateNutrientRequirements(args.Args.Target.Value, plant); _popupSystem.PopupEntity(Loc.GetString("botany-swab-to"), args.Args.Target.Value, args.Args.User); } diff --git a/Content.Server/Botany/Systems/BotanySystem.Produce.cs b/Content.Server/Botany/Systems/BotanySystem.Produce.cs index bba3c48b867..5371d29e79e 100644 --- a/Content.Server/Botany/Systems/BotanySystem.Produce.cs +++ b/Content.Server/Botany/Systems/BotanySystem.Produce.cs @@ -2,6 +2,8 @@ using Content.Shared.EntityEffects; using Content.Shared.Examine; using Content.Shared.FixedPoint; +using Content.Shared.Botany; +using Robust.Shared.Prototypes; namespace Content.Server.Botany.Systems; @@ -9,7 +11,7 @@ public sealed partial class BotanySystem { [Dependency] private readonly SharedEntityEffectsSystem _entityEffects = default!; - public void ProduceGrown(EntityUid uid, ProduceComponent produce) + public void ProduceGrown(EntityUid uid, ProduceComponent produce, Dictionary, PlantNutrientInfo> nutrients) { if (!TryGetSeed(produce, out var seed)) return; @@ -27,12 +29,26 @@ public void ProduceGrown(EntityUid uid, ProduceComponent produce) return; solutionContainer.RemoveAllSolution(); + + Dictionary, FixedPoint2> bonusRatio = new(); + + foreach (var nutrient in nutrients) + { + var info = nutrient.Value; + if (info.Bonus > 0) + bonusRatio.Add(nutrient.Key, FixedPoint2.Clamp((info.Amount - info.Required) / info.Bonus, 0, 1)); + } + foreach (var (chem, quantity) in seed.Chemicals) { - var amount = quantity.Min; - if (quantity.PotencyDivisor > 0 && seed.Potency > 0) - amount += seed.Potency / quantity.PotencyDivisor; - amount = FixedPoint2.Clamp(amount, quantity.Min, quantity.Max); + var amount = quantity.BaseAmount; + foreach (var requirement in quantity.Requirements) + { + if (requirement.Value.BonusAmount > 0 && bonusRatio.TryGetValue(requirement.Key, out var ratio)) + { + amount += requirement.Value.BonusAmount * ratio; + } + } solutionContainer.MaxVolume += amount; solutionContainer.AddReagent(chem, amount); } diff --git a/Content.Server/Botany/Systems/BotanySystem.Seed.cs b/Content.Server/Botany/Systems/BotanySystem.Seed.cs index 0af08dd8736..4eae7727844 100644 --- a/Content.Server/Botany/Systems/BotanySystem.Seed.cs +++ b/Content.Server/Botany/Systems/BotanySystem.Seed.cs @@ -116,7 +116,7 @@ public EntityUid SpawnSeedPacket(SeedData proto, EntityCoordinates coords, Entit return seed; } - public IEnumerable AutoHarvest(SeedData proto, EntityCoordinates position, int yieldMod = 1) + public IEnumerable AutoHarvest(SeedData proto, EntityCoordinates position, Dictionary, PlantNutrientInfo> nutrients, int yieldMod = 1) { if (position.IsValid(EntityManager) && proto.ProductPrototypes.Count > 0) @@ -124,13 +124,13 @@ public IEnumerable AutoHarvest(SeedData proto, EntityCoordinates posi if (proto.HarvestLogImpact != null) _adminLogger.Add(LogType.Botany, proto.HarvestLogImpact.Value, $"Auto-harvested {Loc.GetString(proto.Name):seed} at Pos:{position}."); - return GenerateProduct(proto, position, yieldMod); + return GenerateProduct(proto, position, nutrients, yieldMod); } return Enumerable.Empty(); } - public IEnumerable Harvest(SeedData proto, EntityUid user, int yieldMod = 1) + public IEnumerable Harvest(SeedData proto, EntityUid user, Dictionary, PlantNutrientInfo> nutrients, int yieldMod = 1) { if (proto.ProductPrototypes.Count == 0 || proto.Yield <= 0) { @@ -144,10 +144,10 @@ public IEnumerable Harvest(SeedData proto, EntityUid user, int yieldM if (proto.HarvestLogImpact != null) _adminLogger.Add(LogType.Botany, proto.HarvestLogImpact.Value, $"{ToPrettyString(user):player} harvested {Loc.GetString(proto.Name):seed} at Pos:{Transform(user).Coordinates}."); - return GenerateProduct(proto, Transform(user).Coordinates, yieldMod); + return GenerateProduct(proto, Transform(user).Coordinates, nutrients, yieldMod); } - public IEnumerable GenerateProduct(SeedData proto, EntityCoordinates position, int yieldMod = 1) + public IEnumerable GenerateProduct(SeedData proto, EntityCoordinates position, Dictionary, PlantNutrientInfo> nutrients, int yieldMod = 1) { var totalYield = 0; if (proto.Yield > -1) @@ -176,7 +176,7 @@ public IEnumerable GenerateProduct(SeedData proto, EntityCoordinates var produce = EnsureComp(entity); produce.Seed = proto; - ProduceGrown(entity, produce); + ProduceGrown(entity, produce, nutrients); _appearance.SetData(entity, ProduceVisuals.Potency, proto.Potency); diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index f35f72fbc63..61aea2af9da 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -52,7 +52,7 @@ public sealed class PlantHolderSystem : EntitySystem [Dependency] private readonly SharedEntityEffectsSystem _entityEffects = default!; public const float HydroponicsSpeedMultiplier = 1f; - public const float HydroponicsConsumptionMultiplier = 2f; + public const float HydroponicsConsumptionMultiplier = 1f; public readonly FixedPoint2 PlantMetabolismRate = FixedPoint2.New(1); private static readonly ProtoId HoeTag = "Hoe"; @@ -148,21 +148,37 @@ private void OnExamine(Entity entity, ref ExaminedEvent ar if (component.PestLevel >= 5) args.PushMarkup(Loc.GetString("plant-holder-component-pest-high-level-message")); - foreach (var nutrientId in component.Nutrients.Keys) + foreach (var nutrientId in component.Nutrients.Keys + .OrderByDescending(p => component.Nutrients[p].Required) + .ThenByDescending(p => component.Nutrients[p].Bonus) + .ThenByDescending(p => component.Nutrients[p].Amount)) { var nutrient = _prototype.Index(nutrientId); var nutrientInfo = component.Nutrients[nutrientId]; + var requirementMessage = ""; var bonusMessage = ""; + + if (nutrientInfo.Required > 0 || nutrientInfo.Bonus > 0) + { + requirementMessage = Loc.GetString($"plant-holder-component-nutrient-requirement-message", + ("requiredNutrients", nutrientInfo.Required), + ("fulfilled", nutrientInfo.Amount >= nutrientInfo.Required)); + } + if (nutrientInfo.Bonus > 0) + { bonusMessage = Loc.GetString($"plant-holder-component-nutrient-bonus-message", ("bonusNutrients", nutrientInfo.Bonus + nutrientInfo.Required), ("fulfilled", nutrientInfo.Amount >= nutrientInfo.Bonus + nutrientInfo.Required)); + } + args.PushMarkup(Loc.GetString($"plant-holder-component-nutrient-level-message", ("name", nutrient.LocalizedName), ("color", nutrient.SubstanceColor), ("nutrientLevel", nutrientInfo.Amount), ("requiredNutrients", nutrientInfo.Required), ("fulfilled", nutrientInfo.Amount >= nutrientInfo.Required), + ("requirementMessage", requirementMessage), ("bonusMessage", bonusMessage))); } @@ -651,7 +667,7 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) // If enough time has passed since the plant was harvested, we're ready to harvest again! if (!component.Dead && component.Seed.ProductPrototypes.Count > 0) { - if (component.Age > component.Seed.Production) + if (component.Age > component.Seed.Production && CheckRequiredNutrients(uid, component)) { if (component.Age - component.LastProduce > component.Seed.Production && !component.Harvest) { @@ -723,7 +739,15 @@ public bool DoHarvest(EntityUid plantholder, EntityUid user, PlantHolderComponen return false; } - _botany.Harvest(component.Seed, user, component.YieldMod); + if (!CheckRequiredNutrients(plantholder, component)) // This should only happen if a reagent that removes nutrients is added to the plant. + { + _popup.PopupCursor(Loc.GetString("plant-holder-component-low-nutrient-cant-harvest-message"), user); + component.Harvest = false; + UpdateSprite(plantholder, component); + return false; + } + + _botany.Harvest(component.Seed, user, component.Nutrients, component.YieldMod); AfterHarvest(plantholder, component); return true; } @@ -757,7 +781,12 @@ public void AutoHarvest(EntityUid uid, PlantHolderComponent? component = null) if (component.Seed == null || !component.Harvest) return; - _botany.AutoHarvest(component.Seed, Transform(uid).Coordinates); + if (!CheckRequiredNutrients(uid, component)) // This should only happen if a reagent that removes nutrients is added to the plant. + { + return; + } + + _botany.AutoHarvest(component.Seed, Transform(uid).Coordinates, component.Nutrients, component.YieldMod); AfterHarvest(uid, component); } @@ -771,6 +800,14 @@ private void AfterHarvest(EntityUid uid, PlantHolderComponent? component = null) DoScream(uid, component.Seed); + if (!component.Dead) + { + foreach (var nutrient in component.Nutrients) + { + AdjustNutrient(uid, (nutrient.Value.Required + nutrient.Value.Bonus) * -1, nutrient.Key, component); + } + } + if (component.Seed?.HarvestRepeat == HarvestType.NoRepeat) RemovePlant(uid, component); @@ -914,6 +951,23 @@ public void UpdateNutrientRequirements(EntityUid uid, PlantHolderComponent? comp } } + public bool CheckRequiredNutrients(EntityUid uid, PlantHolderComponent? component = null) + { + if (!Resolve(uid, ref component)) + return false; + if (component.Dead) + return false; + + + foreach (var nutrientInfo in component.Nutrients.Values) + { + if (nutrientInfo.Amount < nutrientInfo.Required) + return false; + } + + return true; + } + public void UpdateReagents(EntityUid uid, PlantHolderComponent? component = null) { if (!Resolve(uid, ref component)) diff --git a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl index 1f99fbc09db..7b6f35e04a6 100644 --- a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl +++ b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl @@ -23,10 +23,12 @@ plant-holder-component-plant-unhealthy-adjective = unhealthy plant-holder-component-dead-plant-matter-message = It's full of [color=red]dead plant matter[/color]. plant-holder-component-weed-high-level-message = It's filled with [color=green]weeds[/color]! plant-holder-component-pest-high-level-message = It's filled with [color=gray]tiny worms[/color]! -plant-holder-component-nutrient-level-message = {CAPITALIZE($name)}: [color={$color}]{$nutrientLevel}[/color]/{ $fulfilled -> +plant-holder-component-nutrient-level-message = {CAPITALIZE($name)}: [color={$color}]{$nutrientLevel}[/color]{$requirementMessage}{$bonusMessage}. + +plant-holder-component-nutrient-requirement-message = /{ $fulfilled -> [true] [color=green]{$requiredNutrients}[/color] *[false] [color=red]{$requiredNutrients}[/color] - }{$bonusMessage}. + } plant-holder-component-nutrient-bonus-message = -{ $fulfilled -> [true] [color=green]{$bonusNutrients}[/color] @@ -39,3 +41,4 @@ plant-holder-component-pressure-improper-warning = The [color=lightblue]improper plant-holder-component-gas-missing-warning = The [color=cyan]improper gas environment alert[/color] is blinking. plant-holder-component-early-sample-message = The plant hasn't grown enough to take a sample yet. plant-holder-component-ligneous-cant-harvest-message = The plant is too tough to harvest with your bare hands. +"plant-holder-component-low-nutrient-cant-harvest-message = This plant is missing nutrients required to grow it's produce. From a7ef81740e9ff2d5a2aa8aa476f7dc641f024387 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Sun, 28 Jun 2026 23:29:37 -0500 Subject: [PATCH 14/61] Add a lot of new plant nutrients, and make reagents give them to plants. --- .../Locale/en-US/botany/plant-nutrients.ftl | 45 +++++++++ .../Prototypes/Hydroponics/nutrients.yml | 92 ++++++++++++++++++- .../Reagents/Consumable/Drink/alcohol.yml | 11 +++ .../Reagents/Consumable/Drink/base_drink.yml | 15 ++- .../Reagents/Consumable/Drink/drinks.yml | 11 ++- .../Reagents/Consumable/Food/condiments.yml | 23 +++-- .../Reagents/Consumable/Food/food.yml | 18 +++- .../Reagents/Consumable/Food/ingredients.yml | 16 +++- Resources/Prototypes/Reagents/biological.yml | 18 +++- Resources/Prototypes/Reagents/botany.yml | 52 ++++++----- Resources/Prototypes/Reagents/chemicals.yml | 7 ++ Resources/Prototypes/Reagents/elements.yml | 55 ++++++++--- Resources/Prototypes/Reagents/gases.yml | 36 ++++++++ Resources/Prototypes/Reagents/medicine.yml | 23 +++-- Resources/Prototypes/Reagents/narcotics.yml | 3 +- Resources/Prototypes/Reagents/toxins.yml | 56 ++++++----- 16 files changed, 389 insertions(+), 92 deletions(-) diff --git a/Resources/Locale/en-US/botany/plant-nutrients.ftl b/Resources/Locale/en-US/botany/plant-nutrients.ftl index 575bdbf72bb..a2439acb71a 100644 --- a/Resources/Locale/en-US/botany/plant-nutrients.ftl +++ b/Resources/Locale/en-US/botany/plant-nutrients.ftl @@ -4,8 +4,53 @@ nutrient-desc-nutrient = Nutrient description! Add this to your plant! (Legal Di nutrient-name-water = water nutrient-desc-water = It is water, plant drink this, hydroponic tray. +nutrient-name-fertilizer = fertilizer +nutrient-desc-fertilizer = Plant like this + +nutrient-name-sugar = sugar +nutrient-desc-sugar = Sweet stuff that tends to attract pests. + +nutrient-name-protein = protein +nutrient-desc-protein = Meat Meat Meat Meat Meat + +nutrient-name-alcohol = alcohol +nutrient-desc-alcohol = Let your plants have a sip. + nutrient-name-toxin = toxins nutrient-desc-toxin = This nutrient will kill your plants when that's implemented. +nutrient-name-pest = pests +nutrient-desc-pest = Tiny little bugs that eat your plants. Not really a nutrient. + +nutrient-name-radiation = radiation +nutrient-desc-radiation = Ionizing rays of light. Sources of this tend to mutate plants. + +nutrient-name-acid = acids +nutrient-desc-acid = Various acidic compounds. + +nutrient-name-carbon = carbon +nutrient-desc-carbon = Fundamental building block of life or something. these descriptions will be rewritten anyway + +nutrient-name-iron = iron +nutrient-desc-iron = It's iron. + +nutrient-name-gold = gold +nutrient-desc-gold = Expensive. + +nutrient-name-silver = silver +nutrient-desc-silver = OOoo. + +nutrient-name-titanium = titanium +nutrient-desc-titanium = Strong metal dust. + nutrient-name-clown = clown essence nutrient-desc-clown = Honk! + +nutrient-name-plasma = plasma +nutrient-desc-plasma = Magic purple space whatever + +nutrient-name-carbonDioxide = carbon dioxide +nutrient-desc-carbonDioxide = Photosynthesis. Supposed to only be added to plants via respiration + +nutrient-name-frezon = frezon +nutrient-desc-frezon = Description goes here. diff --git a/Resources/Prototypes/Hydroponics/nutrients.yml b/Resources/Prototypes/Hydroponics/nutrients.yml index 6f17ec24d00..3b7d91affaa 100644 --- a/Resources/Prototypes/Hydroponics/nutrients.yml +++ b/Resources/Prototypes/Hydroponics/nutrients.yml @@ -10,14 +10,104 @@ desc: nutrient-desc-water color: "cyan" +- type: plantNutrient + id: fertilizer + name: nutrient-name-fertilizer + desc: nutrient-desc-fertilizer + color: "#3e901c" + +- type: plantNutrient + id: sugar + name: nutrient-name-sugar + desc: nutrient-desc-sugar + color: "white" + +- type: plantNutrient + id: protein + name: nutrient-name-protein + desc: nutrient-desc-protein + color: "#FFFFE5" + +- type: plantNutrient + id: alcohol + name: nutrient-name-alcohol + desc: nutrient-desc-alcohol + color: "#b05b3c" + - type: plantNutrient id: toxin name: nutrient-name-toxin desc: nutrient-desc-toxin - color: "red" + color: "#cf3600" + +- type: plantNutrient + id: pest + name: nutrient-name-pest + desc: nutrient-desc-pest + color: "black" + +- type: plantNutrient + id: radiation + name: nutrient-name-radiation + desc: nutrient-desc-radiation + color: "#00ff04" + +- type: plantNutrient + id: acid + name: nutrient-name-acid + desc: nutrient-desc-acid + color: "#BF8C00" + +- type: plantNutrient + id: carbon + name: nutrient-name-carbon + desc: nutrient-desc-carbon + color: "#22282b" + +- type: plantNutrient + id: iron + name: nutrient-name-iron + desc: nutrient-desc-iron + color: "#434b4d" + +- type: plantNutrient + id: gold + name: nutrient-name-gold + desc: nutrient-desc-gold + color: "#F7C430" + +- type: plantNutrient + id: silver + name: nutrient-name-silver + desc: nutrient-desc-silver + color: "#d0d0d0" + +- type: plantNutrient + id: titanium + name: nutrient-name-titanium + desc: nutrient-desc-titanium + color: "#d0d0d0" - type: plantNutrient id: clown name: nutrient-name-clown desc: nutrient-desc-clown color: "#FF4DD2" + +- type: plantNutrient + id: plasma + name: nutrient-name-plasma + desc: nutrient-desc-plasma + color: "#7e009e" + +- type: plantNutrient + id: carbonDioxide + name: nutrient-name-carbonDioxide + desc: nutrient-desc-carbonDioxide + color: "#66ff33" + +- type: plantNutrient + id: frezon + name: nutrient-name-frezon + desc: nutrient-desc-frezon + color: "#3a758c" diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml index eaa219f4778..6180f1b79d8 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml @@ -142,6 +142,10 @@ color: "#b05b3c" boilingPoint: 78.2 meltingPoint: -114.1 + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: alcohol metabolisms: Metabolites: metabolismRate: 0.05 @@ -2463,6 +2467,13 @@ metamorphicMaxFillLevels: 2 metamorphicFillBaseName: fill- metamorphicChangeColor: false + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 2 + nutrient: alcohol + - !type:PlantAdjustNutrient + amount: 0.25 + nutrient: toxin metabolisms: Digestion: metabolites: diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/base_drink.yml b/Resources/Prototypes/Reagents/Consumable/Drink/base_drink.yml index d0ea31063cb..acfff63060b 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/base_drink.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/base_drink.yml @@ -15,8 +15,9 @@ effects: - !type:Extinguish plantMetabolism: - - !type:PlantAdjustWater + - !type:PlantAdjustNutrient amount: 1 + nutrient: water tileReactions: - !type:ExtinguishTileReaction { } - !type:SpillIfPuddlePresentTileReaction { } @@ -31,10 +32,12 @@ - !type:SatiateThirst factor: 2 plantMetabolism: - - !type:PlantAdjustNutrition + - !type:PlantAdjustNutrient amount: 0.1 - - !type:PlantAdjustWater + nutrient: sugar + - !type:PlantAdjustNutrient amount: 0.1 + nutrient: water - !type:PlantAdjustHealth amount: -0.1 footstepSound: @@ -64,10 +67,12 @@ - !type:FlammableTileReaction temperatureMultiplier: 1.35 plantMetabolism: - - !type:PlantAdjustNutrition + - !type:PlantAdjustNutrient amount: 0.25 - - !type:PlantAdjustWater + nutrient: alcohol + - !type:PlantAdjustNutrient amount: 0.7 + nutrient: water - type: reagent id: BaseJuice diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml b/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml index 738be26e097..f439638809b 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml @@ -273,10 +273,12 @@ color: "#DFDFDF" recognizable: true plantMetabolism: - - !type:PlantAdjustNutrition + - !type:PlantAdjustNutrient amount: 0.1 - - !type:PlantAdjustWater + nutrient: protein + - !type:PlantAdjustNutrient amount: 0.9 + nutrient: water metabolisms: Digestion: effects: @@ -503,8 +505,9 @@ - !type:SatiateThirst factor: 3 # Slightly worse for quenching thirst than just straight water plantMetabolism: - - !type:PlantAdjustWater - amount: 1 # The internet tells me I should avoid watering plants with ice, but mostly because of temperature, so this value being the same as water should probably be fine? + - !type:PlantAdjustNutrient + amount: 1 + nutrient: water # The internet tells me I should avoid watering plants with ice, but mostly because of temperature, so this value being the same as water should probably be fine? metamorphicSprite: sprite: Objects/Consumable/Drinks/iceglass.rsi state: icon_empty diff --git a/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml b/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml index 61255df5e69..07577483d18 100644 --- a/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml +++ b/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml @@ -146,16 +146,20 @@ boilingPoint: 1465.0 meltingPoint: 800.7 plantMetabolism: - - !type:PlantAdjustWater + - !type:PlantAdjustNutrient amount: -3 - - !type:PlantAdjustNutrition + nutrient: water + - !type:PlantAdjustNutrient amount: -0.3 - - !type:PlantAdjustToxins - amount: 8 + nutrient: nutrient + - !type:PlantAdjustNutrient + amount: 0.8 + nutrient: toxin + - !type:PlantAdjustNutrient + amount: -1 + nutrient: pest - !type:PlantAdjustWeeds amount: -2 - - !type:PlantAdjustPests - amount: -1 - !type:PlantAdjustHealth amount: -2 metabolisms: @@ -177,6 +181,13 @@ viscosity: 0.55 #Start using syrup to attach your remote recievers to your microwaves! tileReactions: - !type:SpillTileReaction + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 2 + nutrient: sugar + - !type:PlantAdjustNutrient + amount: 2 + nutrient: pest metabolisms: Digestion: # 12 diona blood for 1 unit of syrup, this stuff better be worthwhile. diff --git a/Resources/Prototypes/Reagents/Consumable/Food/food.yml b/Resources/Prototypes/Reagents/Consumable/Food/food.yml index f0ddefce5b0..d968d0717e6 100644 --- a/Resources/Prototypes/Reagents/Consumable/Food/food.yml +++ b/Resources/Prototypes/Reagents/Consumable/Food/food.yml @@ -12,8 +12,9 @@ effects: - !type:SatiateHunger plantMetabolism: - - !type:PlantAdjustNutrition + - !type:PlantAdjustNutrient amount: 1.5 + nutrient: nutrient - !type:PlantAdjustHealth amount: 0.75 pricePerUnit: 2 @@ -40,8 +41,9 @@ - !type:SatiateHunger #Numbers are balanced with this in mind + it helps limit how much healing you can get from food # Lets plants benefit too plantMetabolism: - - !type:PlantAdjustNutrition + - !type:PlantAdjustNutrient amount: 0.5 + nutrient: pest - !type:PlantAdjustHealth amount: 1.5 pricePerUnit: 2.5 @@ -64,6 +66,10 @@ - !type:ModifyBloodLevel amount: 1 # weaker than iron but pretty good all things considered - !type:SatiateHunger + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: protein pricePerUnit: 3 - type: reagent @@ -98,12 +104,14 @@ min: 0.1 factor: 1 plantMetabolism: - - !type:PlantAdjustNutrition - amount: 0.1 + - !type:PlantAdjustNutrient + amount: 1 + nutrient: sugar - !type:PlantAdjustWeeds amount: 2 - - !type:PlantAdjustPests + - !type:PlantAdjustNutrient amount: 2 + nutrient: pest metamorphicSprite: sprite: Objects/Consumable/Drinks/sugarglass.rsi state: icon_empty diff --git a/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml b/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml index 285458baa74..4249660788a 100644 --- a/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml +++ b/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml @@ -64,6 +64,10 @@ flavor: raw-egg color: white recognizable: true + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: protein metabolisms: Digestion: metabolites: @@ -78,6 +82,10 @@ flavor: egg color: white recognizable: true + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 2 + nutrient: protein metabolisms: Digestion: metabolites: @@ -230,11 +238,13 @@ min: 0.1 factor: 1 plantMetabolism: - - !type:PlantAdjustNutrition + - !type:PlantAdjustNutrient amount: 0.1 - - !type:PlantAdjustWeeds + nutrient: nutrient + - !type:PlantAdjustNutrient amount: 2 - - !type:PlantAdjustPests + nutrient: pest + - !type:PlantAdjustWeeds amount: 2 - type: reagent diff --git a/Resources/Prototypes/Reagents/biological.yml b/Resources/Prototypes/Reagents/biological.yml index fcabcadee55..d6bd8799807 100644 --- a/Resources/Prototypes/Reagents/biological.yml +++ b/Resources/Prototypes/Reagents/biological.yml @@ -39,8 +39,12 @@ types: Poison: 0.2 plantMetabolism: - - !type:PlantAdjustWater - amount: 0.5 + - !type:PlantAdjustNutrient + amount: 1 + nutrient: water + - !type:PlantAdjustNutrient + amount: 0.2 + nutrient: protein footstepSound: collection: FootstepBlood params: @@ -110,6 +114,13 @@ factor: 1 - !type:SatiateThirst factor: 1 + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 0.9 + nutrient: water + - !type:PlantAdjustNutrient + amount: 0.1 + nutrient: sugar footstepSound: collection: FootstepSlime params: @@ -201,8 +212,9 @@ amount: -1.5 # Just in case you REALLY want to water your plants plantMetabolism: - - !type:PlantAdjustWater + - !type:PlantAdjustNutrient amount: 0.5 + nutrient: water footstepSound: collection: FootstepBlood params: diff --git a/Resources/Prototypes/Reagents/botany.yml b/Resources/Prototypes/Reagents/botany.yml index 1b1ae04cd55..c6da4bcdda1 100644 --- a/Resources/Prototypes/Reagents/botany.yml +++ b/Resources/Prototypes/Reagents/botany.yml @@ -7,8 +7,9 @@ color: "#664330" physicalDesc: reagent-physical-desc-thick plantMetabolism: - - !type:PlantAdjustNutrition + - !type:PlantAdjustNutrient amount: 2 + nutrient: nutrient metabolisms: Digestion: effects: @@ -26,8 +27,9 @@ color: "#5b406c" physicalDesc: reagent-physical-desc-heterogeneous plantMetabolism: - - !type:PlantAdjustNutrition + - !type:PlantAdjustNutrient amount: 1 + nutrient: nutrient - !type:PlantAdjustHealth amount: -0.5 - !type:PlantAdjustMutationMod @@ -57,10 +59,12 @@ color: "#9e9886" physicalDesc: reagent-physical-desc-bubbling plantMetabolism: - - !type:PlantAdjustToxins - amount: 4 - - !type:PlantAdjustPests + - !type:PlantAdjustNutrient + amount: 0.4 + nutrient: toxin + - !type:PlantAdjustNutrient amount: -6 + nutrient: pest metabolisms: Bloodstream: effects: @@ -81,8 +85,9 @@ color: "#49002E" physicalDesc: reagent-physical-desc-bubbling plantMetabolism: - - !type:PlantAdjustToxins - amount: 6 + - !type:PlantAdjustNutrient + amount: 0.6 + nutrient: toxin - !type:PlantAdjustWeeds amount: -8 - !type:PlantAdjustHealth @@ -112,15 +117,16 @@ color: "#3e901c" physicalDesc: reagent-physical-desc-robust plantMetabolism: - - !type:PlantAdjustNutrition - amount: 0.05 + - !type:PlantAdjustNutrient + amount: 1 + nutrient: fertilizer - !type:PlantAdjustWeeds probability: 0.025 amount: 1 - - !type:PlantAdjustPests + - !type:PlantAdjustNutrient probability: 0.025 amount: 1 - - !type:RobustHarvest {} + nutrient: pest metabolisms: Bloodstream: effects: @@ -168,8 +174,8 @@ amount: -2 - !type:PlantRestoreSeeds probability: 0.20 - - !type:PlantAdjustPotency - amount: -3 # Match this with current rate of Robust Harvest potency increase + #- !type:PlantAdjustPotency Not sure what to replace this with + # amount: -3 - type: reagent id: WeedKiller @@ -180,8 +186,9 @@ color: "#968395" physicalDesc: reagent-physical-desc-bubbling plantMetabolism: - - !type:PlantAdjustToxins - amount: 4 + - !type:PlantAdjustNutrient + amount: 0.4 + nutrient: toxin - !type:PlantAdjustWeeds amount: -6 metabolisms: @@ -206,10 +213,11 @@ boilingPoint: -33.0 meltingPoint: -77.7 plantMetabolism: - - !type:PlantAdjustNutrition - amount: 1 - - !type:PlantAdjustHealth - amount: 0.5 + - !type:PlantAdjustNutrient + amount: 0.1 + nutrient: nutrient + - !type:PlantAdjustHealth + amount: 0.5 metabolisms: Bloodstream: effects: @@ -288,11 +296,13 @@ boilingPoint: 55.5 meltingPoint: -50.0 plantMetabolism: - - !type:PlantAdjustNutrition + - !type:PlantAdjustNutrient amount: 0.1 - - !type:PlantAdjustPests + nutrient: nutrient + - !type:PlantAdjustNutrient probability: 0.1 amount: -1 + nutrient: pest - !type:PlantAdjustHealth amount: 0.1 - !type:PlantAffectGrowth diff --git a/Resources/Prototypes/Reagents/chemicals.yml b/Resources/Prototypes/Reagents/chemicals.yml index 36f7e2073f4..4e6e69fcd86 100644 --- a/Resources/Prototypes/Reagents/chemicals.yml +++ b/Resources/Prototypes/Reagents/chemicals.yml @@ -34,6 +34,13 @@ color: "#22282b" boilingPoint: 4200.0 meltingPoint: 3550.0 + plantMetabolism: + - !type:PlantAdjustNutrient + amount: -0.5 + nutrient: toxin + - !type:PlantAdjustNutrient + amount: 0.5 + nutrient: carbon metabolisms: Bloodstream: effects: diff --git a/Resources/Prototypes/Reagents/elements.yml b/Resources/Prototypes/Reagents/elements.yml index a7cad7b427a..cfaed15df50 100644 --- a/Resources/Prototypes/Reagents/elements.yml +++ b/Resources/Prototypes/Reagents/elements.yml @@ -19,6 +19,10 @@ color: "#22282b" boilingPoint: 4200.0 meltingPoint: 3550.0 + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: carbon - type: reagent id: Chlorine @@ -31,10 +35,12 @@ meltingPoint: -101.5 boilingPoint: -34.04 plantMetabolism: - - !type:PlantAdjustWater + - !type:PlantAdjustNutrient amount: -0.5 - - !type:PlantAdjustToxins - amount: 15 + nutrient: water + - !type:PlantAdjustNutrient + amount: 1.5 + nutrient: toxin - !type:PlantAdjustWeeds amount: -3 - !type:PlantAdjustHealth @@ -98,10 +104,12 @@ boilingPoint: -188.11 meltingPoint: -219.67 plantMetabolism: - - !type:PlantAdjustWater + - !type:PlantAdjustNutrient amount: -0.5 - - !type:PlantAdjustToxins - amount: 25 + nutrient: water + - !type:PlantAdjustNutrient + amount: 2.5 + nutrient: toxin - !type:PlantAdjustWeeds amount: -4 - !type:PlantAdjustHealth @@ -138,6 +146,10 @@ color: "#F7C430" boilingPoint: 2700.0 meltingPoint: 1064.76 + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: gold - type: reagent id: Hydrogen @@ -201,6 +213,10 @@ type: [ Arachnid ] inverted: true amount: 0.4 + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: iron - type: reagent id: Lithium @@ -272,8 +288,9 @@ meltingPoint: 44.2 boilingPoint: 280.5 plantMetabolism: - - !type:PlantAdjustNutrition + - !type:PlantAdjustNutrient amount: 0.1 + nutrient: fertilizer - type: reagent id: Titanium @@ -294,8 +311,12 @@ types: Poison: 0.2 plantMetabolism: - - !type:PlantAdjustWater + - !type:PlantAdjustNutrient + amount: 1 + nutrient: titanium + - !type:PlantAdjustNutrient amount: -0.5 + nutrient: water - !type:PlantAdjustWeeds amount: -2 @@ -320,6 +341,13 @@ - !type:AdjustReagent reagent: Honk amount: 0.25 + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 0.5 + nutrient: clown + - !type:PlantAdjustNutrient + amount: 0.5 + nutrient: nutrient - type: reagent id: Radium @@ -361,6 +389,10 @@ color: "#d0d0d0" boilingPoint: 2212.0 meltingPoint: 960.5 + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: silver - type: reagent id: Tin @@ -415,10 +447,9 @@ plantMetabolism: - !type:PlantAdjustMutationLevel amount: 0.6 - - !type:PlantAdjustToxins - amount: 4 - - !type:PlantAdjustHealth - amount: -1.5 + - !type:PlantAdjustNutrient + amount: 1 + nutrient: radiation - !type:PlantAdjustMutationMod probability: 0.2 amount: 0.1 diff --git a/Resources/Prototypes/Reagents/gases.yml b/Resources/Prototypes/Reagents/gases.yml index 5d93016c083..f0018fa608e 100644 --- a/Resources/Prototypes/Reagents/gases.yml +++ b/Resources/Prototypes/Reagents/gases.yml @@ -87,6 +87,14 @@ tileReactions: - !type:FlammableTileReaction temperatureMultiplier: 1.5 + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: plasma +# plantRespiration: +# - !type:PlantAdjustNutrient +# amount: 1 +# nutrient: plasma metabolisms: Bloodstream: effects: @@ -135,6 +143,18 @@ effects: - !type:Flammable multiplier: 0.8 + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 1.5 + nutrient: radiation + - !type:PlantAdjustMutationLevel + amount: 1 +# plantRespiration: +# - !type:PlantAdjustNutrient +# amount: 1.5 +# nutrient: radiation +# - !type:PlantAdjustMutationLevel +# amount: 1 metabolisms: Bloodstream: effects: @@ -164,6 +184,14 @@ physicalDesc: reagent-physical-desc-odorless flavor: bitter color: "#66ff33" + plantMetabolism: + - !type:PlantAdjustNutrient # TODO: Remove this when plant respiration is implemented + amount: 0.05 + nutrient: carbonDioxide + # plantRespiration: + # - !type:PlantAdjustNutrient + # amount: 1 + # nutrient: carbonDioxide metabolisms: Bloodstream: effects: @@ -342,6 +370,14 @@ color: "#3a758c" boilingPoint: -195.8 meltingPoint: -210.0 + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: frezon + # plantRespiration: + # - !type:PlantAdjustNutrient + # amount: 1 + # nutrient: frezon metabolisms: Bloodstream: effects: diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index 5650265a114..8693d9096d9 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -67,8 +67,9 @@ reagent: Dylovene min: 15 plantMetabolism: - - !type:PlantAdjustToxins - amount: -10 + - !type:PlantAdjustNutrient + amount: -1 + nutrient: toxin - !type:PlantAdjustHealth amount: 1 @@ -180,8 +181,9 @@ flavor: medicine color: "#0091ff" plantMetabolism: - - !type:PlantAdjustToxins - amount: -5 + - !type:PlantAdjustNutrient + amount: -0.5 + nutrient: toxin - !type:PlantAdjustHealth amount: 5 - !type:PlantCryoxadone {} @@ -590,8 +592,9 @@ flavor: medicine color: "#c8ff75" plantMetabolism: - - !type:PlantAdjustToxins - amount: 6 + - !type:PlantAdjustNutrient + amount: 0.6 + nutrient: toxin - !type:PlantPhalanximine minScale: 4 metabolisms: @@ -737,8 +740,9 @@ flavor: medicine color: "#2b2f77" plantMetabolism: - - !type:PlantAdjustToxins - amount: -5 + - !type:PlantAdjustNutrient + amount: -0.5 + nutrient: toxin metabolisms: Bloodstream: effects: @@ -1178,8 +1182,9 @@ types: Holy: 0.5 plantMetabolism: - - !type:PlantAdjustWater + - !type:PlantAdjustNutrient amount: 1 + nutrient: water tileReactions: - !type:ExtinguishTileReaction { } diff --git a/Resources/Prototypes/Reagents/narcotics.yml b/Resources/Prototypes/Reagents/narcotics.yml index 65674bb5a2d..56c24f9e238 100644 --- a/Resources/Prototypes/Reagents/narcotics.yml +++ b/Resources/Prototypes/Reagents/narcotics.yml @@ -219,8 +219,9 @@ color: "#808080" physicalDesc: reagent-physical-desc-crystalline plantMetabolism: - - !type:PlantAdjustNutrition + - !type:PlantAdjustNutrient amount: -5 + nutrient: nutrient - !type:PlantAdjustHealth amount: -1 metabolisms: diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index 51d2052e158..c3860379807 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -8,10 +8,9 @@ physicalDesc: reagent-physical-desc-opaque contrabandSeverity: Minor plantMetabolism: - - !type:PlantAdjustToxins - amount: 10 - - !type:PlantAdjustHealth - amount: -5 + - !type:PlantAdjustNutrient + amount: 1 + nutrient: toxin metabolisms: Bloodstream: effects: @@ -33,8 +32,15 @@ boilingPoint: -127.3 meltingPoint: -186.4 plantMetabolism: - - !type:PlantAdjustToxins - amount: 40 + - !type:PlantAdjustNutrient + amount: 1 + nutrient: titanium + - !type:PlantAdjustNutrient + amount: 1 + nutrient: clown + - !type:PlantAdjustNutrient + amount: 2 + nutrient: plasma metabolisms: Bloodstream: effects: @@ -70,10 +76,9 @@ allowedDepartments: - Medical plantMetabolism: - - !type:PlantAdjustToxins - amount: 10 - - !type:PlantAdjustHealth - amount: -5 + - !type:PlantAdjustNutrient + amount: 1 + nutrient: toxin metabolisms: Bloodstream: effects: @@ -171,8 +176,9 @@ boilingPoint: 78.2 # This isn't a real chemical... meltingPoint: -19.4 plantMetabolism: - - !type:PlantAdjustToxins - amount: 20 + - !type:PlantAdjustNutrient + amount: 2 + nutrient: acid - !type:PlantAdjustWeeds amount: -4 - !type:PlantAdjustHealth @@ -280,12 +286,11 @@ boilingPoint: 337.0 meltingPoint: 10.31 plantMetabolism: - - !type:PlantAdjustToxins - amount: 10 + - !type:PlantAdjustNutrient + amount: 1 + nutrient: acid - !type:PlantAdjustWeeds amount: -2 - - !type:PlantAdjustHealth - amount: -5 reactiveEffects: Acidic: methods: [ Touch ] @@ -355,8 +360,9 @@ types: Asphyxiation: 5 plantMetabolism: - - !type:PlantAdjustToxins - amount: 10 + - !type:PlantAdjustNutrient + amount: 1 + nutrient: toxin - type: reagent id: Lexorin @@ -384,8 +390,9 @@ flavor: bitter color: "#77b58e" plantMetabolism: - - !type:PlantAdjustToxins - amount: 10 + - !type:PlantAdjustNutrient + amount: 1 + nutrient: toxin metabolisms: Bloodstream: effects: @@ -547,6 +554,10 @@ physicalDesc: reagent-physical-desc-clumpy flavor: bitter color: "#FFFFE5" + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: protein metabolisms: Bloodstream: effects: @@ -720,8 +731,9 @@ plantMetabolism: - !type:PlantMutateChemicals randomPickBotanyReagent: EvilRandomFillSolution - - !type:PlantAdjustToxins - amount: 10 + - !type:PlantAdjustNutrient + amount: 1 + nutrient: toxin metabolisms: Bloodstream: effects: From 7a7e120898bc502cf87d510d4cfdc4d0bc1a0f64 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Mon, 29 Jun 2026 23:04:54 -0500 Subject: [PATCH 15/61] Fix typo --- .../Locale/en-US/botany/components/plant-holder-component.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl index 7b6f35e04a6..540a25390ce 100644 --- a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl +++ b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl @@ -41,4 +41,4 @@ plant-holder-component-pressure-improper-warning = The [color=lightblue]improper plant-holder-component-gas-missing-warning = The [color=cyan]improper gas environment alert[/color] is blinking. plant-holder-component-early-sample-message = The plant hasn't grown enough to take a sample yet. plant-holder-component-ligneous-cant-harvest-message = The plant is too tough to harvest with your bare hands. -"plant-holder-component-low-nutrient-cant-harvest-message = This plant is missing nutrients required to grow it's produce. +"plant-holder-component-low-nutrient-cant-harvest-message = This plant is missing nutrients required to grow its produce. From b98d4d51bfe8c24d343e09ed468486050952effe Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Mon, 29 Jun 2026 23:07:50 -0500 Subject: [PATCH 16/61] Fix typo made while fixing typo --- .../Locale/en-US/botany/components/plant-holder-component.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl index 540a25390ce..7d5b7a429cb 100644 --- a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl +++ b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl @@ -41,4 +41,4 @@ plant-holder-component-pressure-improper-warning = The [color=lightblue]improper plant-holder-component-gas-missing-warning = The [color=cyan]improper gas environment alert[/color] is blinking. plant-holder-component-early-sample-message = The plant hasn't grown enough to take a sample yet. plant-holder-component-ligneous-cant-harvest-message = The plant is too tough to harvest with your bare hands. -"plant-holder-component-low-nutrient-cant-harvest-message = This plant is missing nutrients required to grow its produce. +plant-holder-component-low-nutrient-cant-harvest-message = This plant is missing nutrients required to grow its produce. From c605935a5627cc33ec9977a552a91715ee96c1b5 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Mon, 29 Jun 2026 23:13:48 -0500 Subject: [PATCH 17/61] Remove depricated entity effects --- .../PlantAdjustNutritionEntityEffectSystem.cs | 16 -------- .../PlantAdjustPestsEntityEffectSystem.cs | 16 -------- .../PlantAdjustPotencyEntityEffectSystem.cs | 16 -------- .../PlantAdjustToxinsEntityEffectSystem.cs | 15 -------- .../PlantAdjustWaterEntityEffectSystem.cs | 17 --------- .../RobustHarvestEntityEffectSystem.cs | 37 ------------------- .../PlantAttributes/PlantAdjustNutrition.cs | 6 --- .../PlantAttributes/PlantAdjustPests.cs | 7 ---- .../PlantAttributes/PlantAdjustPotency.cs | 9 ----- .../PlantAttributes/PlantAdjustToxins.cs | 9 ----- .../PlantAttributes/PlantAdjustWater.cs | 7 ---- .../Botany/PlantAttributes/RobustHarvest.cs | 22 ----------- 12 files changed, 177 deletions(-) delete mode 100644 Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustNutritionEntityEffectSystem.cs delete mode 100644 Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustPestsEntityEffectSystem.cs delete mode 100644 Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustPotencyEntityEffectSystem.cs delete mode 100644 Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustToxinsEntityEffectSystem.cs delete mode 100644 Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustWaterEntityEffectSystem.cs delete mode 100644 Content.Server/EntityEffects/Effects/Botany/PlantAttributes/RobustHarvestEntityEffectSystem.cs delete mode 100644 Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustNutrition.cs delete mode 100644 Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustPests.cs delete mode 100644 Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustPotency.cs delete mode 100644 Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustToxins.cs delete mode 100644 Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustWater.cs delete mode 100644 Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/RobustHarvest.cs diff --git a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustNutritionEntityEffectSystem.cs b/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustNutritionEntityEffectSystem.cs deleted file mode 100644 index 797efc796de..00000000000 --- a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustNutritionEntityEffectSystem.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Content.Server.Botany.Components; -using Content.Server.Botany.Systems; -using Content.Shared.EntityEffects; -using Content.Shared.EntityEffects.Effects.Botany.PlantAttributes; - -namespace Content.Server.EntityEffects.Effects.Botany.PlantAttributes; -// TODO: Delete this entity effect after all usages have been replaced with PlantAdjustNutrient -public sealed partial class PlantAdjustNutritionEntityEffectSystem : EntityEffectSystem -{ - [Dependency] private readonly PlantHolderSystem _plantHolder = default!; - - protected override void Effect(Entity entity, ref EntityEffectEvent args) - { - _plantHolder.AdjustNutrient(entity, args.Effect.Amount, "nutrient", entity); - } -} diff --git a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustPestsEntityEffectSystem.cs b/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustPestsEntityEffectSystem.cs deleted file mode 100644 index 0495034b38d..00000000000 --- a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustPestsEntityEffectSystem.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Content.Server.Botany.Components; -using Content.Shared.EntityEffects; -using Content.Shared.EntityEffects.Effects.Botany.PlantAttributes; - -namespace Content.Server.EntityEffects.Effects.Botany.PlantAttributes; - -public sealed partial class PlantAdjustPestsEntityEffectSystem : EntityEffectSystem -{ - protected override void Effect(Entity entity, ref EntityEffectEvent args) - { - if (entity.Comp.Seed == null || entity.Comp.Dead) - return; - - entity.Comp.PestLevel += args.Effect.Amount; - } -} diff --git a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustPotencyEntityEffectSystem.cs b/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustPotencyEntityEffectSystem.cs deleted file mode 100644 index b1340cb0f66..00000000000 --- a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustPotencyEntityEffectSystem.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Content.Server.Botany.Components; -using Content.Shared.EntityEffects; -using Content.Shared.EntityEffects.Effects.Botany.PlantAttributes; - -namespace Content.Server.EntityEffects.Effects.Botany.PlantAttributes; - -public sealed partial class PlantAdjustPotencyEntityEffectSystem : EntityEffectSystem -{ - protected override void Effect(Entity entity, ref EntityEffectEvent args) - { - if (entity.Comp.Seed == null || entity.Comp.Dead) - return; - - entity.Comp.Seed.Potency = Math.Max(entity.Comp.Seed.Potency + args.Effect.Amount, 1); - } -} diff --git a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustToxinsEntityEffectSystem.cs b/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustToxinsEntityEffectSystem.cs deleted file mode 100644 index a77b7c35cca..00000000000 --- a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustToxinsEntityEffectSystem.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Content.Server.Botany.Components; -using Content.Server.Botany.Systems; -using Content.Shared.EntityEffects; -using Content.Shared.EntityEffects.Effects.Botany.PlantAttributes; - -namespace Content.Server.EntityEffects.Effects.Botany.PlantAttributes; -// TODO: Delete this entity effect after all usages have been replaced with PlantAdjustNutrient -public sealed partial class PlantAdjustToxinsEntityEffectSystem : EntityEffectSystem -{ - [Dependency] private readonly PlantHolderSystem _plantHolder = default!; - protected override void Effect(Entity entity, ref EntityEffectEvent args) - { - _plantHolder.AdjustNutrient(entity, args.Effect.Amount, "toxin", entity); - } -} diff --git a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustWaterEntityEffectSystem.cs b/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustWaterEntityEffectSystem.cs deleted file mode 100644 index b189879ed08..00000000000 --- a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustWaterEntityEffectSystem.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Content.Server.Botany.Components; -using Content.Server.Botany.Systems; -using Content.Shared.EntityEffects; -using Content.Shared.EntityEffects.Effects.Botany.PlantAttributes; - -namespace Content.Server.EntityEffects.Effects.Botany.PlantAttributes; -// TODO: Delete this entity effect after all usages have been replaced with PlantAdjustNutrient -public sealed partial class PlantAdjustWaterEntityEffectSystem : EntityEffectSystem -{ - [Dependency] private readonly PlantHolderSystem _plantHolder = default!; - - protected override void Effect(Entity entity, ref EntityEffectEvent args) - { - _plantHolder.AdjustNutrient(entity, args.Effect.Amount, "water", entity); - _plantHolder.AdjustNutrient(entity, args.Effect.Amount * -4, "toxin", entity); - } -} diff --git a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/RobustHarvestEntityEffectSystem.cs b/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/RobustHarvestEntityEffectSystem.cs deleted file mode 100644 index 8d38acbb54b..00000000000 --- a/Content.Server/EntityEffects/Effects/Botany/PlantAttributes/RobustHarvestEntityEffectSystem.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Content.Server.Botany.Components; -using Content.Shared.EntityEffects; -using Content.Shared.EntityEffects.Effects.Botany.PlantAttributes; -using Robust.Shared.Random; - -namespace Content.Server.EntityEffects.Effects.Botany.PlantAttributes; - -/// -/// This effect directly increases the potency of a PlantHolder's plant provided it exists and isn't dead. -/// Potency directly correlates to the size of the plant's produce. -/// -/// -public sealed partial class RobustHarvestEntityEffectSystem : EntityEffectSystem -{ - [Dependency] private readonly IRobustRandom _random = default!; - - protected override void Effect(Entity entity, ref EntityEffectEvent args) - { - if (entity.Comp.Seed == null || entity.Comp.Dead) - return; - - if (entity.Comp.Seed.Potency < args.Effect.PotencyLimit) - { - entity.Comp.Seed.Potency = Math.Min(entity.Comp.Seed.Potency + args.Effect.PotencyIncrease, args.Effect.PotencyLimit); - - if (entity.Comp.Seed.Potency > args.Effect.PotencySeedlessThreshold) - { - entity.Comp.Seed.Seedless = true; - } - } - else if (entity.Comp.Seed.Yield > 1 && _random.Prob(0.1f)) - { - // Too much of a good thing reduces yield - entity.Comp.Seed.Yield--; - } - } -} diff --git a/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustNutrition.cs b/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustNutrition.cs deleted file mode 100644 index 6f53076fb36..00000000000 --- a/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustNutrition.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Content.Shared.EntityEffects.Effects.Botany.PlantAttributes; - -public sealed partial class PlantAdjustNutrition : BasePlantAdjustAttribute -{ - public override string GuidebookAttributeName { get; set; } = "plant-attribute-nutrition"; -} diff --git a/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustPests.cs b/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustPests.cs deleted file mode 100644 index c1661ec89e6..00000000000 --- a/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustPests.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Content.Shared.EntityEffects.Effects.Botany.PlantAttributes; - -public sealed partial class PlantAdjustPests : BasePlantAdjustAttribute -{ - public override string GuidebookAttributeName { get; set; } = "plant-attribute-pests"; - public override bool GuidebookIsAttributePositive { get; protected set; } = false; -} diff --git a/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustPotency.cs b/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustPotency.cs deleted file mode 100644 index c68ffcf007a..00000000000 --- a/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustPotency.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Content.Shared.EntityEffects.Effects.Botany.PlantAttributes; - -/// -/// Handles increase or decrease of plant potency. -/// -public sealed partial class PlantAdjustPotency : BasePlantAdjustAttribute -{ - public override string GuidebookAttributeName { get; set; } = "plant-attribute-potency"; -} diff --git a/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustToxins.cs b/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustToxins.cs deleted file mode 100644 index 04eccb03ec4..00000000000 --- a/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustToxins.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Content.Shared.EntityEffects.Effects.Botany.PlantAttributes; - -public sealed partial class PlantAdjustToxins : BasePlantAdjustAttribute -{ - public override string GuidebookAttributeName { get; set; } = "plant-attribute-toxins"; - - public override bool GuidebookIsAttributePositive { get; protected set; } = false; -} - diff --git a/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustWater.cs b/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustWater.cs deleted file mode 100644 index 1d6ef8ea095..00000000000 --- a/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantAdjustWater.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Content.Shared.EntityEffects.Effects.Botany.PlantAttributes; - -public sealed partial class PlantAdjustWater : BasePlantAdjustAttribute -{ - public override string GuidebookAttributeName { get; set; } = "plant-attribute-water"; -} - diff --git a/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/RobustHarvest.cs b/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/RobustHarvest.cs deleted file mode 100644 index 77bde39b125..00000000000 --- a/Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/RobustHarvest.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Robust.Shared.Prototypes; - -namespace Content.Shared.EntityEffects.Effects.Botany.PlantAttributes; - -public sealed partial class RobustHarvest : EntityEffectBase -{ - [DataField] - public int PotencyLimit = 50; - - [DataField] - public int PotencyIncrease = 3; - - [DataField] - public int PotencySeedlessThreshold = 30; - - public override string? EntityEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) => - Loc.GetString("entity-effect-guidebook-plant-robust-harvest", - ("seedlesstreshold", PotencySeedlessThreshold), - ("limit", PotencyLimit), - ("increase", PotencyIncrease), - ("chance", Probability)); -} From 61399db092de184e407d1f6faa1e54cb691ed3cd Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 30 Jun 2026 16:51:31 -0500 Subject: [PATCH 18/61] Refactor heat and pressure tolerances. Seperate improper heat/pressure warnings into low heat/pressure warnings and high heat/pressure warnings --- .../Botany/Components/PlantHolderComponent.cs | 35 ++++- Content.Server/Botany/SeedPrototype.cs | 42 +++--- .../Botany/Systems/BotanySwabSystem.cs | 2 +- .../Botany/Systems/MutationSystem.cs | 4 - .../Botany/Systems/PlantHolderSystem.cs | 142 ++++++++++++------ .../components/plant-holder-component.ftl | 6 +- 6 files changed, 155 insertions(+), 76 deletions(-) diff --git a/Content.Server/Botany/Components/PlantHolderComponent.cs b/Content.Server/Botany/Components/PlantHolderComponent.cs index 9fa096d43ff..8c6ef10333c 100644 --- a/Content.Server/Botany/Components/PlantHolderComponent.cs +++ b/Content.Server/Botany/Components/PlantHolderComponent.cs @@ -86,6 +86,9 @@ public sealed partial class PlantHolderComponent : Component [DataField] public bool Harvest; + [DataField] + public bool HarvestAge; + /// /// Set to true if this plant has been clipped by seed clippers. Used to prevent a single plant /// from repeatedly being clipped. @@ -114,17 +117,41 @@ public sealed partial class PlantHolderComponent : Component [DataField] public SeedData? Seed; + [DataField] + public float MinimumTemperature = float.NegativeInfinity; + + [DataField] + public float MaximumTemperature = float.PositiveInfinity; + + [DataField] + public float MinimumPressure = float.NegativeInfinity; + + [DataField] + public float MaximumPressure = float.PositiveInfinity; + + /// + /// True if the plant is losing health due to too low temperature. + /// + [DataField] + public bool LowHeat; + + /// + /// True if the plant is losing health due to too high temperature. + /// + [DataField] + public bool HighHeat; + /// - /// True if the plant is losing health due to too high/low temperature. + /// True if the plant is losing health due to too low pressure. /// [DataField] - public bool ImproperHeat; + public bool LowPressure; /// - /// True if the plant is losing health due to too high/low pressure. + /// True if the plant is losing health due to too high pressure. /// [DataField] - public bool ImproperPressure; + public bool HighPressure; /// /// Not currently used. diff --git a/Content.Server/Botany/SeedPrototype.cs b/Content.Server/Botany/SeedPrototype.cs index 8b221b7ee59..5caf0d39ba0 100644 --- a/Content.Server/Botany/SeedPrototype.cs +++ b/Content.Server/Botany/SeedPrototype.cs @@ -86,6 +86,14 @@ public partial struct SeedChemQuantity /// Inherent chemical is one that is NOT result of mutation or crossbreeding. These chemicals are removed if species mutation is executed. /// [DataField("Inherent")] public bool Inherent = true; + + [DataField("ModifyIdealHeat")] public float ModifyIdealHeat = 0; + + [DataField("ModifyHeatTolerance")] public float ModifyHeatTolerance = 0; + + [DataField("ModifyIdealPressure")] public float ModifyIdealPressure = 0; + + [DataField("ModifyPressureTolerance")] public float ModifyPressureTolerance = 0; } [DataDefinition] @@ -181,17 +189,14 @@ public partial class SeedData [DataField] public Dictionary, NutrientRequirement> Requirements = new(); - [DataField] public float IdealHeat = 293f; - [DataField] public float HeatTolerance = 10f; + [DataField] public float BaseIdealHeat = 293f; + [DataField] public float BaseHeatTolerance = 10f; + [DataField] public float IdealHeat = 293f; // TODO: remove this + [DataField] public float HeatTolerance = 10f; // TODO: remove this [DataField] public float IdealLight = 7f; [DataField] public float LightTolerance = 3f; - [DataField] public float ToxinsTolerance = 4f; - - [DataField] public float LowPressureTolerance = 81f; - - [DataField] public float HighPressureTolerance = 121f; - - [DataField] public float PestTolerance = 5f; + [DataField] public float BaseIdealPressure = 101f; + [DataField] public float BasePressureTolerance = 20f; [DataField] public float WeedTolerance = 5f; @@ -309,16 +314,17 @@ public SeedData Clone() ExudeGasses = new Dictionary(ExudeGasses), Requirements = new Dictionary, NutrientRequirement>(Requirements), + BaseHeatTolerance = BaseHeatTolerance, + BaseIdealHeat = BaseIdealHeat, + BaseIdealPressure = BaseIdealPressure, + BasePressureTolerance = BasePressureTolerance, + NutrientConsumption = NutrientConsumption, WaterConsumption = WaterConsumption, IdealHeat = IdealHeat, HeatTolerance = HeatTolerance, IdealLight = IdealLight, LightTolerance = LightTolerance, - ToxinsTolerance = ToxinsTolerance, - LowPressureTolerance = LowPressureTolerance, - HighPressureTolerance = HighPressureTolerance, - PestTolerance = PestTolerance, WeedTolerance = WeedTolerance, Endurance = Endurance, @@ -377,12 +383,13 @@ public SeedData SpeciesChange(SeedData other) HeatTolerance = HeatTolerance, IdealLight = IdealLight, LightTolerance = LightTolerance, - ToxinsTolerance = ToxinsTolerance, - LowPressureTolerance = LowPressureTolerance, - HighPressureTolerance = HighPressureTolerance, - PestTolerance = PestTolerance, WeedTolerance = WeedTolerance, + BaseHeatTolerance = other.BaseHeatTolerance, + BaseIdealHeat = other.BaseIdealHeat, + BaseIdealPressure = other.BaseIdealPressure, + BasePressureTolerance = other.BasePressureTolerance, + Endurance = Endurance, Yield = Yield, Lifespan = Lifespan, @@ -423,6 +430,7 @@ public SeedData SpeciesChange(SeedData other) } } + return newSeed; } } diff --git a/Content.Server/Botany/Systems/BotanySwabSystem.cs b/Content.Server/Botany/Systems/BotanySwabSystem.cs index 025080da0bf..91bdca2349c 100644 --- a/Content.Server/Botany/Systems/BotanySwabSystem.cs +++ b/Content.Server/Botany/Systems/BotanySwabSystem.cs @@ -74,7 +74,7 @@ private void OnDoAfter(EntityUid uid, BotanySwabComponent swab, DoAfterEvent arg return; plant.Seed = _mutationSystem.Cross(swab.SeedData, old); // Cross-pollenate swab.SeedData = old; // Transfer old plant pollen to swab - _plantHolderSystem.UpdateNutrientRequirements(args.Args.Target.Value, plant); + _plantHolderSystem.SeedUpdated(args.Args.Target.Value, plant); _popupSystem.PopupEntity(Loc.GetString("botany-swab-to"), args.Args.Target.Value, args.Args.User); } diff --git a/Content.Server/Botany/Systems/MutationSystem.cs b/Content.Server/Botany/Systems/MutationSystem.cs index 834fd9e8efb..6a34ca41963 100644 --- a/Content.Server/Botany/Systems/MutationSystem.cs +++ b/Content.Server/Botany/Systems/MutationSystem.cs @@ -68,10 +68,6 @@ public SeedData Cross(SeedData a, SeedData b) CrossFloat(ref result.HeatTolerance, a.HeatTolerance); CrossFloat(ref result.IdealLight, a.IdealLight); CrossFloat(ref result.LightTolerance, a.LightTolerance); - CrossFloat(ref result.ToxinsTolerance, a.ToxinsTolerance); - CrossFloat(ref result.LowPressureTolerance, a.LowPressureTolerance); - CrossFloat(ref result.HighPressureTolerance, a.HighPressureTolerance); - CrossFloat(ref result.PestTolerance, a.PestTolerance); CrossFloat(ref result.WeedTolerance, a.WeedTolerance); CrossFloat(ref result.Endurance, a.Endurance); diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index 61aea2af9da..5b331fe1399 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -190,11 +190,17 @@ private void OnExamine(Entity entity, ref ExaminedEvent ar if (component.ImproperLight) args.PushMarkup(Loc.GetString("plant-holder-component-light-improper-warning")); - if (component.ImproperHeat) - args.PushMarkup(Loc.GetString("plant-holder-component-heat-improper-warning")); + if (component.LowHeat) + args.PushMarkup(Loc.GetString("plant-holder-component-heat-low-warning")); - if (component.ImproperPressure) - args.PushMarkup(Loc.GetString("plant-holder-component-pressure-improper-warning")); + if (component.HighHeat) + args.PushMarkup(Loc.GetString("plant-holder-component-heat-high-warning")); + + if (component.LowPressure) + args.PushMarkup(Loc.GetString("plant-holder-component-pressure-low-warning")); + + if (component.HighPressure) + args.PushMarkup(Loc.GetString("plant-holder-component-pressure-high-warning")); if (component.MissingGas > 0) args.PushMarkup(Loc.GetString("plant-holder-component-gas-missing-warning")); @@ -241,7 +247,7 @@ private void OnInteractUsing(Entity entity, ref InteractUs CheckLevelSanity(uid, component); UpdateSprite(uid, component); - UpdateNutrientRequirements(uid, component); + SeedUpdated(uid, component); if (seed.PlantLogImpact != null) _adminLogger.Add(LogType.Botany, seed.PlantLogImpact.Value, $"{ToPrettyString(args.User):player} planted {Loc.GetString(seed.Name):seed} at Pos:{Transform(uid).Coordinates}."); @@ -437,8 +443,8 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) component.MutationLevel = 0; } - // Weeds like water and nutrients! They may appear even if there's not a seed planted. - if (component.WaterLevel > 10 && component.NutritionLevel > 5) + // Weeds might need to be changed due to the plant nutrient rework + if (CheckRequiredNutrients(uid, component)) { var chance = 0f; if (component.Seed == null) @@ -514,22 +520,11 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) if (component.SkipAging < 10) { // Make sure the plant is not starving. - if (component.NutritionLevel > 5) + if (CheckRequiredNutrients(uid, component)) { - component.Health += Convert.ToInt32(_random.Prob(0.35f)) * healthMod; + component.Health += Convert.ToInt32(_random.Prob(0.7f)) * healthMod; } - else - { - AffectGrowth(uid, -1, component); - component.Health -= healthMod; - } - - // Make sure the plant is not thirsty. - if (component.WaterLevel > 10) - { - component.Health += Convert.ToInt32(_random.Prob(0.35f)) * healthMod; - } - else + else if (component.HarvestAge) { AffectGrowth(uid, -1, component); component.Health -= healthMod; @@ -565,30 +560,34 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) // SeedPrototype pressure resistance. var pressure = environment.Pressure; - if (pressure < component.Seed.LowPressureTolerance || pressure > component.Seed.HighPressureTolerance) + + var lowPressure = pressure < component.MaximumPressure; + var highPressure = pressure > component.MaximumPressure; + + if (component.LowPressure || component.HighPressure) { component.Health -= healthMod; - component.ImproperPressure = true; - if (component.DrawWarnings) - component.UpdateSpriteAfterUpdate = true; - } - else - { - component.ImproperPressure = false; } // SeedPrototype ideal temperature. - if (MathF.Abs(environment.Temperature - component.Seed.IdealHeat) > component.Seed.HeatTolerance) + + var lowHeat = environment.Temperature < component.MinimumTemperature; + var highHeat = environment.Temperature > component.MaximumTemperature; + + if (component.LowHeat || component.HighHeat) { component.Health -= healthMod; - component.ImproperHeat = true; - if (component.DrawWarnings) - component.UpdateSpriteAfterUpdate = true; } - else + + if (component.DrawWarnings && + (component.LowHeat != lowHeat || component.HighHeat != highHeat || component.LowPressure != lowPressure || component.HighPressure != highPressure)) { - component.ImproperHeat = false; + component.UpdateSpriteAfterUpdate = true; } + component.LowHeat = lowHeat; + component.HighHeat = highHeat; + component.LowPressure = lowPressure; + component.HighPressure = highPressure; // Gas production. var exudeCount = component.Seed.ExudeGasses.Count; @@ -603,7 +602,7 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) // Toxin levels beyond the plant's tolerance cause damage. // They are, however, slowly reduced over time. - if (component.Toxins > 0) + /*if (component.Toxins > 0) { var toxinUptake = MathF.Max(1, MathF.Round(component.Toxins / 10f)); if (component.Toxins > component.Seed.ToxinsTolerance) @@ -627,7 +626,7 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) if (component.DrawWarnings) component.UpdateSpriteAfterUpdate = true; - } + }*/ // Weed levels. if (component.WeedLevel > 0) @@ -664,12 +663,14 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) //if (component.Harvest && component.Seed.HarvestRepeat == HarvestType.SelfHarvest) // AutoHarvest(uid, component); + component.HarvestAge = component.Age - component.LastProduce > component.Seed.Production; + // If enough time has passed since the plant was harvested, we're ready to harvest again! if (!component.Dead && component.Seed.ProductPrototypes.Count > 0) { if (component.Age > component.Seed.Production && CheckRequiredNutrients(uid, component)) { - if (component.Age - component.LastProduce > component.Seed.Production && !component.Harvest) + if (component.HarvestAge && !component.Harvest) { component.Harvest = true; component.LastProduce = component.Age; @@ -837,8 +838,10 @@ public void Die(EntityUid uid, PlantHolderComponent? component = null) component.YieldMod = 1; component.MutationMod = 1; component.ImproperLight = false; - component.ImproperHeat = false; - component.ImproperPressure = false; + component.LowHeat = false; + component.HighHeat = false; + component.LowPressure = false; + component.HighPressure = false; component.WeedLevel += 1 * HydroponicsSpeedMultiplier; component.PestLevel = 0; UpdateSprite(uid, component); @@ -859,11 +862,13 @@ public void RemovePlant(EntityUid uid, PlantHolderComponent? component = null) component.Sampled = false; component.Harvest = false; component.ImproperLight = false; - component.ImproperPressure = false; - component.ImproperHeat = false; + component.LowHeat = false; + component.HighHeat = false; + component.LowPressure = false; + component.HighPressure = false; UpdateSprite(uid, component); - UpdateNutrientRequirements(uid, component); + SeedUpdated(uid, component); } public void AffectGrowth(EntityUid uid, int amount, PlantHolderComponent? component = null) @@ -968,6 +973,47 @@ public bool CheckRequiredNutrients(EntityUid uid, PlantHolderComponent? componen return true; } + public void UpdateTolerances(EntityUid uid, PlantHolderComponent? component = null) + { + if (!Resolve(uid, ref component)) + return; + if (component.Seed == null) + { + component.MinimumTemperature = float.NegativeInfinity; + component.MaximumTemperature = float.PositiveInfinity; + component.MinimumPressure = float.NegativeInfinity; + component.MaximumPressure = float.PositiveInfinity; + return; + } + + var idealHeat = component.Seed.BaseIdealHeat; + var heatTolerance = component.Seed.BaseHeatTolerance; + var idealPressure = component.Seed.BaseIdealPressure; + var pressureTolerance = component.Seed.BasePressureTolerance; + + foreach (var quantity in component.Seed.Chemicals.Values) + { + idealHeat += quantity.ModifyIdealHeat; + heatTolerance += quantity.ModifyHeatTolerance; + idealPressure += quantity.ModifyIdealPressure; + pressureTolerance += quantity.ModifyPressureTolerance; + } + + component.MinimumTemperature = idealHeat - heatTolerance; + component.MaximumTemperature = idealHeat + heatTolerance; + component.MinimumPressure = idealPressure - pressureTolerance; + component.MaximumPressure = idealPressure + pressureTolerance; + + } + + public void SeedUpdated(EntityUid uid, PlantHolderComponent? component = null) + { + if (!Resolve(uid, ref component)) + return; + UpdateNutrientRequirements(uid, component); + UpdateTolerances(uid, component); + } + public void UpdateReagents(EntityUid uid, PlantHolderComponent? component = null) { if (!Resolve(uid, ref component)) @@ -988,7 +1034,7 @@ public void UpdateReagents(EntityUid uid, PlantHolderComponent? component = null var reagentProto = _prototype.Index(entry.Reagent.Prototype); _entityEffects.ApplyEffects(uid, reagentProto.PlantMetabolisms.ToArray(), entry.Quantity); } - + SeedUpdated(uid, component); _solutionContainerSystem.RemoveEachReagent(component.SoilSolution.Value, PlantMetabolismRate); } @@ -1004,7 +1050,7 @@ private void Mutate(EntityUid uid, float severity, PlantHolderComponent? compone { EnsureUniqueSeed(uid, component); _mutation.MutateSeed(uid, ref component.Seed, severity); - UpdateNutrientRequirements(uid, component); + SeedUpdated(uid, component); } } @@ -1059,10 +1105,10 @@ public void UpdateSprite(EntityUid uid, PlantHolderComponent? component = null) return; _appearance.SetData(uid, PlantHolderVisuals.WaterLight, component.WaterLevel <= 15, app); - _appearance.SetData(uid, PlantHolderVisuals.NutritionLight, component.NutritionLevel <= 8, app); + _appearance.SetData(uid, PlantHolderVisuals.NutritionLight, !CheckRequiredNutrients(uid, component) && component.HarvestAge, app); _appearance.SetData(uid, PlantHolderVisuals.AlertLight, - component.WeedLevel >= 5 || component.PestLevel >= 5 || component.Toxins >= 40 || component.ImproperHeat || - component.ImproperLight || component.ImproperPressure || component.MissingGas > 0, app); + component.WeedLevel >= 5 || component.PestLevel >= 5 || component.Toxins >= 40 || component.LowHeat || component.HighHeat || + component.ImproperLight || component.LowPressure || component.HighPressure || component.MissingGas > 0, app); _appearance.SetData(uid, PlantHolderVisuals.HarvestLight, component.Harvest, app); } diff --git a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl index 7d5b7a429cb..25f1dd24327 100644 --- a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl +++ b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl @@ -36,8 +36,10 @@ plant-holder-component-nutrient-bonus-message = -{ $fulfilled -> } plant-holder-component-toxins-high-warning = The [color=red]toxicity level alert[/color] is flashing red. plant-holder-component-light-improper-warning = The [color=yellow]improper light level alert[/color] is blinking. -plant-holder-component-heat-improper-warning = The [color=orange]improper temperature level alert[/color] is blinking. -plant-holder-component-pressure-improper-warning = The [color=lightblue]improper environment pressure alert[/color] is blinking. +plant-holder-component-heat-high-warning = The [color=orange]high temperature level alert[/color] is blinking. +plant-holder-component-heat-low-warning = The [color=orange]low level alert[/color] is blinking. +plant-holder-component-pressure-high-warning = The [color=lightblue]high environment pressure alert[/color] is blinking. +plant-holder-component-pressure-low-warning = The [color=lightblue]low environment pressure alert[/color] is blinking. plant-holder-component-gas-missing-warning = The [color=cyan]improper gas environment alert[/color] is blinking. plant-holder-component-early-sample-message = The plant hasn't grown enough to take a sample yet. plant-holder-component-ligneous-cant-harvest-message = The plant is too tough to harvest with your bare hands. From 7acc56ce20408e7f109888bb8441cf3b796d4724 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 30 Jun 2026 16:56:13 -0500 Subject: [PATCH 19/61] Fixed low pressure warning being based off of maximum pressure instead of minimum. --- Content.Server/Botany/Systems/PlantHolderSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index 5b331fe1399..e4495323a41 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -561,7 +561,7 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) // SeedPrototype pressure resistance. var pressure = environment.Pressure; - var lowPressure = pressure < component.MaximumPressure; + var lowPressure = pressure < component.MinimumPressure; var highPressure = pressure > component.MaximumPressure; if (component.LowPressure || component.HighPressure) From eb295a151213be66c64039af4057d8612a080428 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 30 Jun 2026 16:58:58 -0500 Subject: [PATCH 20/61] Low temperature alert is now no longer just "low level alert" --- .../Locale/en-US/botany/components/plant-holder-component.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl index 25f1dd24327..b148b710a1a 100644 --- a/Resources/Locale/en-US/botany/components/plant-holder-component.ftl +++ b/Resources/Locale/en-US/botany/components/plant-holder-component.ftl @@ -37,7 +37,7 @@ plant-holder-component-nutrient-bonus-message = -{ $fulfilled -> plant-holder-component-toxins-high-warning = The [color=red]toxicity level alert[/color] is flashing red. plant-holder-component-light-improper-warning = The [color=yellow]improper light level alert[/color] is blinking. plant-holder-component-heat-high-warning = The [color=orange]high temperature level alert[/color] is blinking. -plant-holder-component-heat-low-warning = The [color=orange]low level alert[/color] is blinking. +plant-holder-component-heat-low-warning = The [color=orange]low temperature level alert[/color] is blinking. plant-holder-component-pressure-high-warning = The [color=lightblue]high environment pressure alert[/color] is blinking. plant-holder-component-pressure-low-warning = The [color=lightblue]low environment pressure alert[/color] is blinking. plant-holder-component-gas-missing-warning = The [color=cyan]improper gas environment alert[/color] is blinking. From fe9babd31d737bf8d2a78f92d96a2bf54754036b Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 30 Jun 2026 17:12:25 -0500 Subject: [PATCH 21/61] Change how temperature and pressure work again, make health loss scale with heat/pressure difference and tolerance --- .../Botany/Components/PlantHolderComponent.cs | 8 ++--- .../Botany/Systems/PlantHolderSystem.cs | 31 +++++++++---------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/Content.Server/Botany/Components/PlantHolderComponent.cs b/Content.Server/Botany/Components/PlantHolderComponent.cs index 8c6ef10333c..9de41c58896 100644 --- a/Content.Server/Botany/Components/PlantHolderComponent.cs +++ b/Content.Server/Botany/Components/PlantHolderComponent.cs @@ -118,16 +118,16 @@ public sealed partial class PlantHolderComponent : Component public SeedData? Seed; [DataField] - public float MinimumTemperature = float.NegativeInfinity; + public float IdealHeat = 0; [DataField] - public float MaximumTemperature = float.PositiveInfinity; + public float HeatTolerance = float.PositiveInfinity; [DataField] - public float MinimumPressure = float.NegativeInfinity; + public float IdealPressure = 0; [DataField] - public float MaximumPressure = float.PositiveInfinity; + public float PressureTolerance = float.PositiveInfinity; /// /// True if the plant is losing health due to too low temperature. diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index e4495323a41..fd9776139de 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -561,22 +561,22 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) // SeedPrototype pressure resistance. var pressure = environment.Pressure; - var lowPressure = pressure < component.MinimumPressure; - var highPressure = pressure > component.MaximumPressure; + var lowPressure = pressure < component.IdealPressure - component.PressureTolerance; + var highPressure = pressure > component.IdealPressure + component.PressureTolerance; if (component.LowPressure || component.HighPressure) { - component.Health -= healthMod; + component.Health -= Math.Abs(pressure - component.IdealPressure) / component.PressureTolerance * healthMod; } // SeedPrototype ideal temperature. - var lowHeat = environment.Temperature < component.MinimumTemperature; - var highHeat = environment.Temperature > component.MaximumTemperature; + var lowHeat = environment.Temperature < component.IdealHeat - component.HeatTolerance; + var highHeat = environment.Temperature > component.IdealHeat + component.HeatTolerance; - if (component.LowHeat || component.HighHeat) + if (component.LowHeat) { - component.Health -= healthMod; + component.Health -= Math.Abs(environment.Temperature - component.Seed.IdealHeat) / component.HeatTolerance * healthMod; } if (component.DrawWarnings && @@ -979,10 +979,10 @@ public void UpdateTolerances(EntityUid uid, PlantHolderComponent? component = nu return; if (component.Seed == null) { - component.MinimumTemperature = float.NegativeInfinity; - component.MaximumTemperature = float.PositiveInfinity; - component.MinimumPressure = float.NegativeInfinity; - component.MaximumPressure = float.PositiveInfinity; + component.IdealHeat = 0; + component.HeatTolerance = float.PositiveInfinity; + component.IdealPressure = 0; + component.PressureTolerance = float.PositiveInfinity; return; } @@ -999,11 +999,10 @@ public void UpdateTolerances(EntityUid uid, PlantHolderComponent? component = nu pressureTolerance += quantity.ModifyPressureTolerance; } - component.MinimumTemperature = idealHeat - heatTolerance; - component.MaximumTemperature = idealHeat + heatTolerance; - component.MinimumPressure = idealPressure - pressureTolerance; - component.MaximumPressure = idealPressure + pressureTolerance; - + component.IdealHeat = idealHeat; + component.HeatTolerance = heatTolerance; + component.IdealPressure = idealPressure; + component.PressureTolerance = pressureTolerance; } public void SeedUpdated(EntityUid uid, PlantHolderComponent? component = null) From 980a5b937a1442bc25cd860f1efa8e33cf481bee Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 30 Jun 2026 17:26:28 -0500 Subject: [PATCH 22/61] Damage from improper heat now properly scales with a plants ideal heat. --- Content.Server/Botany/Systems/PlantHolderSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index fd9776139de..fa04639946f 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -576,7 +576,7 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) if (component.LowHeat) { - component.Health -= Math.Abs(environment.Temperature - component.Seed.IdealHeat) / component.HeatTolerance * healthMod; + component.Health -= Math.Abs(environment.Temperature - component.IdealHeat) / component.HeatTolerance * healthMod; } if (component.DrawWarnings && From fab362e236821f7119d3af12e18f2667e9941e7c Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 30 Jun 2026 18:50:08 -0500 Subject: [PATCH 23/61] Split seeds.yml into multiple files --- .../Prototypes/Hydroponics/Seeds/flowers.yml | 129 ++ .../Prototypes/Hydroponics/Seeds/fruit.yml | 857 +++++++ .../Prototypes/Hydroponics/Seeds/fungus.yml | 119 + .../Prototypes/Hydroponics/Seeds/grains.yml | 160 ++ .../Prototypes/Hydroponics/Seeds/leaves.yml | 293 +++ .../Prototypes/Hydroponics/Seeds/other.yml | 272 +++ .../Hydroponics/Seeds/rootveggies.yml | 186 ++ Resources/Prototypes/Hydroponics/seeds.yml | 2022 ----------------- 8 files changed, 2016 insertions(+), 2022 deletions(-) create mode 100644 Resources/Prototypes/Hydroponics/Seeds/flowers.yml create mode 100644 Resources/Prototypes/Hydroponics/Seeds/fruit.yml create mode 100644 Resources/Prototypes/Hydroponics/Seeds/fungus.yml create mode 100644 Resources/Prototypes/Hydroponics/Seeds/grains.yml create mode 100644 Resources/Prototypes/Hydroponics/Seeds/leaves.yml create mode 100644 Resources/Prototypes/Hydroponics/Seeds/other.yml create mode 100644 Resources/Prototypes/Hydroponics/Seeds/rootveggies.yml delete mode 100644 Resources/Prototypes/Hydroponics/seeds.yml diff --git a/Resources/Prototypes/Hydroponics/Seeds/flowers.yml b/Resources/Prototypes/Hydroponics/Seeds/flowers.yml new file mode 100644 index 00000000000..f8d15a9d34c --- /dev/null +++ b/Resources/Prototypes/Hydroponics/Seeds/flowers.yml @@ -0,0 +1,129 @@ +- type: seed + id: poppy + name: seeds-poppy-name + noun: seeds-noun-seeds + displayName: seeds-poppy-display-name + plantRsi: Objects/Specific/Hydroponics/poppy.rsi + packetPrototype: PoppySeeds + productPrototypes: + - FoodPoppy + mutationPrototypes: + - lily + lifespan: 25 + maturation: 10 + production: 3 + yield: 3 + potency: 10 + growthStages: 3 + waterConsumption: 0.60 + chemicals: + Nutriment: + Min: 1 + Max: 2 + PotencyDivisor: 50 + Bicaridine: + Min: 1 + Max: 20 + PotencyDivisor: 5 + +- type: seed + id: lily + name: seeds-lily-name + noun: seeds-noun-seeds + displayName: seeds-lily-display-name + plantRsi: Objects/Specific/Hydroponics/lily.rsi + packetPrototype: LilySeeds + productPrototypes: + - FoodLily + mutationPrototypes: + - spacemansTrumpet + lifespan: 25 + maturation: 10 + production: 3 + yield: 3 + potency: 10 + growthStages: 3 + waterConsumption: 0.60 + chemicals: + Nutriment: + Min: 1 + Max: 2 + PotencyDivisor: 50 + Bicaridine: + Min: 1 + Max: 20 + PotencyDivisor: 5 + +- type: seed + id: spacemansTrumpet + name: seeds-spacemans-trumpet-name + noun: seeds-noun-seeds + displayName: seeds-spacemans-trumpet-display-name + plantRsi: Objects/Specific/Hydroponics/spacemans_trumpet.rsi + packetPrototype: SpacemansTrumpetSeeds + productPrototypes: + - FoodSpacemansTrumpet + growthStages: 4 + lifespan: 20 + maturation: 14 + production: 3 + yield: 2 + potency: 10 + waterConsumption: 0.60 + chemicals: + Nutriment: + Min: 1 + Max: 5 + PotencyDivisor: 50 + PolypyryliumOligomers: + Min: 1 + Max: 15 + PotencyDivisor: 5 + +- type: seed + id: galaxythistle + name: seeds-galaxythistle-name + noun: seeds-noun-seeds + displayName: seeds-galaxythistle-display-name + plantRsi: Objects/Specific/Hydroponics/galaxythistle.rsi + packetPrototype: GalaxythistleSeeds + productPrototypes: + - FoodGalaxythistle + lifespan: 25 + maturation: 10 + production: 3 + yield: 3 + potency: 10 + growthStages: 3 + waterConsumption: 0.60 + chemicals: + Stellibinin: + Min: 1 + Max: 25 + PotencyDivisor: 4 + +- type: seed + id: glasstle + name: seeds-glasstle-name + noun: seeds-noun-seeds + displayName: seeds-glasstle-display-name + plantRsi: Objects/Specific/Hydroponics/glasstle.rsi + packetPrototype: GlasstleSeeds + productPrototypes: + - FoodGlasstle + lifespan: 25 + maturation: 10 + production: 3 + yield: 1 + potency: 10 + growthStages: 3 + waterConsumption: 0.5 + chemicals: + Razorium: + Min: 1 + Max: 25 + PotencyDivisor: 4 + Desoxyephedrine: # meff!! + Min: 1 + Max: 10 + PotencyDivisor: 10 diff --git a/Resources/Prototypes/Hydroponics/Seeds/fruit.yml b/Resources/Prototypes/Hydroponics/Seeds/fruit.yml new file mode 100644 index 00000000000..d76acf47934 --- /dev/null +++ b/Resources/Prototypes/Hydroponics/Seeds/fruit.yml @@ -0,0 +1,857 @@ +- type: seed + id: banana + name: seeds-banana-name + noun: seeds-noun-seeds + displayName: seeds-banana-display-name + plantRsi: Objects/Specific/Hydroponics/banana.rsi + packetPrototype: BananaSeeds + productPrototypes: + - FoodBanana + mutationPrototypes: + - mimana + harvestRepeat: Repeat + lifespan: 50 + maturation: 6 + production: 6 + yield: 2 + idealLight: 9 + waterConsumption: 0.60 + idealHeat: 298 + chemicals: + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + Nutriment: + Min: 1 + Max: 2 + PotencyDivisor: 50 + +- type: seed + id: mimana + name: seeds-mimana-name + noun: seeds-noun-seeds + displayName: seeds-mimana-display-name + plantRsi: Objects/Specific/Hydroponics/mimana.rsi + packetPrototype: MimanaSeeds + productPrototypes: + - FoodMimana + harvestRepeat: Repeat + lifespan: 50 + maturation: 6 + production: 6 + yield: 2 + idealLight: 9 + waterConsumption: 0.60 + idealHeat: 298 + chemicals: + MuteToxin: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Nutriment: + Min: 1 + Max: 2 + PotencyDivisor: 50 + +- type: seed + id: lemon + name: seeds-lemon-name + noun: seeds-noun-seeds + displayName: seeds-lemon-display-name + plantRsi: Objects/Specific/Hydroponics/lemon.rsi + packetPrototype: LemonSeeds + productPrototypes: + - FoodLemon + mutationPrototypes: + - lemoon + - lime + - orange + harvestRepeat: Repeat + lifespan: 55 + maturation: 6 + production: 6 + yield: 3 + potency: 10 + idealLight: 8 + chemicals: + Nutriment: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: lemoon + name: seeds-lemoon-name + noun: seeds-noun-seeds + displayName: seeds-lemoon-display-name + plantRsi: Objects/Specific/Hydroponics/lemoon.rsi + packetPrototype: LemoonSeeds + productPrototypes: + - FoodLemoon + harvestRepeat: Repeat + lifespan: 90 + maturation: 8 + production: 6 + yield: 4 + potency: 1 + idealLight: 8 + chemicals: + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + Milk: + Min: 8 + Max: 20 + PotencyDivisor: 5 + +- type: seed + id: lime + name: seeds-lime-name + noun: seeds-noun-seeds + displayName: seeds-lime-display-name + plantRsi: Objects/Specific/Hydroponics/lime.rsi + packetPrototype: LimeSeeds + productPrototypes: + - FoodLime + mutationPrototypes: + - orange + - lemon + harvestRepeat: Repeat + lifespan: 55 + maturation: 6 + production: 6 + yield: 3 + potency: 10 + idealLight: 8 + chemicals: + Nutriment: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: orange + name: seeds-orange-name + noun: seeds-noun-seeds + displayName: seeds-orange-display-name + plantRsi: Objects/Specific/Hydroponics/orange.rsi + packetPrototype: OrangeSeeds + productPrototypes: + - FoodOrange + mutationPrototypes: + - extradimensionalOrange + - lemon + - lime + harvestRepeat: Repeat + lifespan: 55 + maturation: 6 + production: 6 + yield: 3 + potency: 10 + idealLight: 8 + chemicals: + Nutriment: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: extradimensionalOrange + name: seeds-extradimensionalorange-name + noun: seeds-noun-seeds + displayName: seeds-extradimensionalorange-display-name + plantRsi: Objects/Specific/Hydroponics/extradimensional_orange.rsi + packetPrototype: ExtradimensionalOrangeSeeds + productPrototypes: + - FoodExtradimensionalOrange + harvestRepeat: Repeat + lifespan: 55 + maturation: 6 + production: 6 + yield: 3 + potency: 10 + idealLight: 8 + chemicals: + Haloperidol: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Nutriment: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: pineapple + name: seeds-pineapple-name + noun: seeds-noun-seeds + displayName: seeds-pineapple-display-name + plantRsi: Objects/Specific/Hydroponics/pineapple.rsi + packetPrototype: PineappleSeeds + productPrototypes: + - FoodPineapple + harvestRepeat: Repeat + lifespan: 55 + maturation: 6 + production: 6 + yield: 3 + potency: 10 + idealLight: 8 + growthStages: 3 + chemicals: + Nutriment: + Min: 1 + Max: 20 + PotencyDivisor: 20 + Water: + Min: 1 + Max: 4 + PotencyDivisor: 25 + Vitamin: + Min: 1 + Max: 2 + PotencyDivisor: 50 + +- type: seed + id: tomato + name: seeds-tomato-name + noun: seeds-noun-seeds + displayName: seeds-tomato-display-name + plantRsi: Objects/Specific/Hydroponics/tomato.rsi + packetPrototype: TomatoSeeds + productPrototypes: + - FoodTomato + mutationPrototypes: + - blueTomato + - bloodTomato + harvestRepeat: Repeat + lifespan: 25 + maturation: 8 + production: 6 + yield: 2 + potency: 10 + waterConsumption: 0.60 + nutrientConsumption: 0.40 + idealLight: 8 + idealHeat: 298 + splatPrototype: PuddleSplatter + chemicals: + Nutriment: + Min: 1 + Max: 7 + PotencyDivisor: 14 + Vitamin: + Min: 1 + Max: 3 + PotencyDivisor: 33 + Water: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: blueTomato + name: seeds-bluetomato-name + noun: seeds-noun-seeds + displayName: seeds-bluetomato-display-name + plantRsi: Objects/Specific/Hydroponics/blue_tomato.rsi + packetPrototype: BlueTomatoSeeds + productPrototypes: + - FoodBlueTomato + harvestRepeat: Repeat + lifespan: 25 + maturation: 8 + production: 6 + yield: 2 + potency: 10 + waterConsumption: 0.60 + nutrientConsumption: 0.70 + idealLight: 8 + idealHeat: 298 + splatPrototype: PuddleSplatter + chemicals: + Nutriment: + Min: 1 + Max: 5 + PotencyDivisor: 20 + SpaceLube: + Min: 5 + Max: 15 + PotencyDivisor: 10 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: bloodTomato + name: seeds-bloodtomato-name + noun: seeds-noun-seeds + displayName: seeds-bloodtomato-display-name + plantRsi: Objects/Specific/Hydroponics/blood_tomato.rsi + packetPrototype: BloodTomatoSeeds + productPrototypes: + - FoodBloodTomato + # mutationPrototypes: + # - killerTomato # Persistence: massive performance risk & no real gameplay benefit + harvestRepeat: Repeat + lifespan: 60 + maturation: 8 + production: 6 + yield: 2 + potency: 10 + waterConsumption: 0.60 + nutrientConsumption: 0.70 + idealLight: 8 + idealHeat: 298 + splatPrototype: PuddleSplatter + chemicals: + Blood: + Min: 1 + Max: 10 + PotencyDivisor: 10 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: killerTomato + name: seeds-killertomato-name + noun: seeds-noun-seeds + displayName: seeds-killertomato-display-name + plantRsi: Objects/Specific/Hydroponics/tomatokiller.rsi + plantLogImpact: High + harvestLogImpact: High + packetPrototype: KillerTomatoSeeds + productPrototypes: + - MobTomatoKiller + harvestRepeat: Repeat + lifespan: 25 + maturation: 15 + production: 6 + yield: 2 + potency: 10 + waterConsumption: 0.60 + nutrientConsumption: 0.70 + idealLight: 8 + idealHeat: 298 + growthStages: 2 + splatPrototype: PuddleSplatter + chemicals: + Blood: + Min: 1 + Max: 10 + PotencyDivisor: 10 + JuiceTomato: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: eggplant + name: seeds-eggplant-name + noun: seeds-noun-seeds + displayName: seeds-eggplant-display-name + plantRsi: Objects/Specific/Hydroponics/eggplant.rsi + packetPrototype: EggplantSeeds + productPrototypes: + - FoodEggplant + mutationPrototypes: + - eggy + harvestRepeat: Repeat + lifespan: 25 + maturation: 6 + production: 6 + yield: 2 + potency: 20 + growthStages: 3 + idealLight: 9 + idealHeat: 298 + chemicals: + Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 10 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: apple + name: seeds-apple-name + noun: seeds-noun-seeds + displayName: seeds-apple-display-name + plantRsi: Objects/Specific/Hydroponics/apple.rsi + packetPrototype: AppleSeeds + productPrototypes: + - FoodApple + # mutationPrototypes: + # - goldenApple + harvestRepeat: Repeat + lifespan: 55 + maturation: 6 + production: 6 + yield: 3 + potency: 10 + idealLight: 6 + chemicals: + Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 10 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: goldenApple + name: seeds-goldenapple-name + noun: seeds-noun-seeds + displayName: seeds-goldenapple-display-name + plantRsi: Objects/Specific/Hydroponics/golden_apple.rsi + packetPrototype: GoldenAppleSeeds + productPrototypes: + - FoodGoldenApple + harvestRepeat: Repeat + lifespan: 55 + maturation: 6 + production: 6 + yield: 3 + potency: 10 + idealLight: 6 + waterConsumption: 0.75 + nutrientConsumption: 0.75 + chemicals: + Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 10 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + DoctorsDelight: + Min: 3 + Max: 13 + PotencyDivisor: 10 + +- type: seed + id: chili + name: seeds-chili-name + noun: seeds-noun-seeds + displayName: seeds-chili-display-name + plantRsi: Objects/Specific/Hydroponics/chili.rsi + packetPrototype: ChiliSeeds + productPrototypes: + - FoodChiliPepper + mutationPrototypes: + - chilly + harvestRepeat: Repeat + lifespan: 25 + maturation: 6 + production: 6 + yield: 2 + potency: 20 + idealLight: 9 + idealHeat: 298 + chemicals: + CapsaicinOil: + Min: 1 + Max: 10 + PotencyDivisor: 10 + Nutriment: + Min: 1 + Max: 4 + PotencyDivisor: 25 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: chilly + name: seeds-chilly-name + noun: seeds-noun-seeds + displayName: seeds-chilly-display-name + plantRsi: Objects/Specific/Hydroponics/chilly.rsi + packetPrototype: ChillySeeds + productPrototypes: + - FoodChillyPepper + harvestRepeat: Repeat + lifespan: 25 + maturation: 6 + production: 6 + yield: 2 + potency: 20 + idealLight: 9 + idealHeat: 298 + chemicals: + FrostOil: + Min: 1 + Max: 10 + PotencyDivisor: 10 + Nutriment: + Min: 1 + Max: 4 + PotencyDivisor: 25 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: gatfruit + name: seeds-gatfruit-name + noun: seeds-noun-seeds + displayName: seeds-gatfruit-display-name + plantRsi: Objects/Specific/Hydroponics/gatfruit.rsi + packetPrototype: GatfruitSeeds + productPrototypes: + - FoodGatfruit + # mutationPrototypes: + # - fakeCapfruit + # - realCapfruit + lifespan: 65 + maturation: 25 + production: 25 + yield: 1 + potency: 10 + growthStages: 2 + idealLight: 6 + chemicals: + Nutriment: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Sulfur: + Min: 1 + Max: 5 + PotencyDivisor: 20 + +- type: seed + id: fakeCapfruit + name: seeds-capfruit-name + noun: seeds-noun-seeds + displayName: seeds-capfruit-display-name + plantRsi: Objects/Specific/Hydroponics/capfruit.rsi + packetPrototype: FakeCapfruitSeeds + productPrototypes: + - FoodFakeCapfruit + lifespan: 65 + maturation: 25 + production: 25 + yield: 1 + potency: 10 + growthStages: 2 + idealLight: 6 + chemicals: + Nutriment: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Sulfur: + Min: 1 + Max: 5 + PotencyDivisor: 20 + +- type: seed + id: realCapfruit + name: seeds-capfruit-name + noun: seeds-noun-seeds + displayName: seeds-capfruit-display-name + plantRsi: Objects/Specific/Hydroponics/capfruit.rsi + packetPrototype: RealCapfruitSeeds + productPrototypes: + - FoodRealCapfruit + lifespan: 65 + maturation: 25 + production: 25 + yield: 1 + potency: 10 + growthStages: 2 + idealLight: 6 + chemicals: + Nutriment: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Sulfur: + Min: 1 + Max: 5 + PotencyDivisor: 20 + +- type: seed + id: grape + name: seeds-grape-name + noun: seeds-noun-seeds + displayName: seeds-grape-display-name + plantRsi: Objects/Specific/Hydroponics/grape.rsi + packetPrototype: GrapeSeeds + productPrototypes: + - FoodGrape + lifespan: 50 + maturation: 6 + production: 5 + yield: 3 + potency: 10 + growthStages: 2 + chemicals: + Nutriment: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: watermelon + name: seeds-watermelon-name + noun: seeds-noun-seeds + displayName: seeds-watermelon-display-name + plantRsi: Objects/Specific/Hydroponics/watermelon.rsi + packetPrototype: WatermelonSeeds + productPrototypes: + - FoodWatermelon + mutationPrototypes: + - holymelon + lifespan: 55 + maturation: 12 + production: 3 + yield: 1 + potency: 1 + idealLight: 8 + chemicals: + Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 10 + Water: + Min: 1 + Max: 10 + PotencyDivisor: 10 + Vitamin: + Min: 1 + Max: 5 + PotencyDivisor: 20 + +- type: seed + id: holymelon + name: seeds-holymelon-name + noun: seeds-noun-seeds + displayName: seeds-holymelon-display-name + plantRsi: Objects/Specific/Hydroponics/holymelon.rsi + packetPrototype: HolymelonSeeds + productPrototypes: + - FoodHolymelon + lifespan: 55 + maturation: 12 + production: 3 + yield: 1 + potency: 1 + idealLight: 8 + chemicals: + Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 10 + Holywater: + Min: 1 + Max: 10 + PotencyDivisor: 10 + Vitamin: + Min: 1 + Max: 5 + PotencyDivisor: 20 + +- type: seed + id: berries + name: seeds-berries-name + noun: seeds-noun-seeds + displayName: seeds-berries-display-name + plantRsi: Objects/Specific/Hydroponics/berries.rsi + packetPrototype: BerrySeeds + productPrototypes: + - FoodBerries + harvestRepeat: Repeat + lifespan: 50 + maturation: 6 + production: 6 + yield: 4 + idealLight: 7 + nutrientConsumption: 0.6 + chemicals: + Nutriment: + Min: 2 + Max: 5 + PotencyDivisor: 30 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 40 + +- type: seed + id: bungo + name: seeds-bungo-name + noun: seeds-noun-seeds + displayName: seeds-bungo-display-name + plantRsi: Objects/Specific/Hydroponics/bungo.rsi + packetPrototype: BungoSeeds + productPrototypes: + - FoodBungo + harvestRepeat: Repeat + lifespan: 50 + maturation: 8 + production: 6 + potency: 10 + yield: 3 + idealLight: 8 + idealHeat: 298 + growthStages: 4 + waterConsumption: 0.6 + chemicals: + Nutriment: + Min: 5 + Max: 10 + PotencyDivisor: 20 + Enzyme: + Min: 5 + Max: 10 + PotencyDivisor: 20 + +- type: seed + id: pumpkin + name: seeds-pumpkin-name + noun: seeds-noun-seeds + displayName: seeds-pumpkin-display-name + plantRsi: Objects/Specific/Hydroponics/pumpkin.rsi + packetPrototype: PumpkinSeeds + productPrototypes: + - FoodPumpkin + mutationPrototypes: + - bluePumpkin + lifespan: 55 + maturation: 10 + production: 4 + yield: 2 + potency: 10 + idealHeat: 288 + growthStages: 3 + chemicals: + PumpkinFlesh: + Min: 1 + Max: 20 + PotencyDivisor: 5 + Vitamin: + Min: 1 + Max: 5 + PotencyDivisor: 20 + +- type: seed + id: bluePumpkin + name: seeds-blue-pumpkin-name + noun: seeds-noun-seeds + displayName: seeds-blue-pumpkin-display-name + plantRsi: Objects/Specific/Hydroponics/blue_pumpkin.rsi + packetPrototype: BluePumpkinSeeds + productPrototypes: + - FoodBluePumpkin + lifespan: 55 + maturation: 10 + production: 4 + yield: 2 + potency: 10 + idealHeat: 288 + growthStages: 3 + chemicals: + Ammonia: + Min: 1 + Max: 15 + PotencyDivisor: 3 + Chlorine: + Min: 1 + Max: 5 + PotencyDivisor: 5 + Vitamin: + Min: 1 + Max: 10 + PotencyDivisor: 3 + +- type: seed + id: cherry + name: seeds-cherry-name + noun: seeds-noun-seeds + displayName: seeds-cherry-display-name + plantRsi: Objects/Specific/Hydroponics/cherry.rsi + packetPrototype: CherrySeeds + productPrototypes: + - FoodCherry + harvestRepeat: Repeat + lifespan: 55 + maturation: 6 + production: 6 + yield: 5 + potency: 10 + idealLight: 6 + chemicals: + Nutriment: + Min: 1 + Max: 3 + PotencyDivisor: 30 + Vitamin: + Min: 1 + Max: 3 + PotencyDivisor: 40 + +- type: seed + id: anomalyBerry + name: seeds-anomaly-berry-name + noun: seeds-noun-seeds + displayName: seeds-anomaly-berry-display-name + plantRsi: Objects/Specific/Hydroponics/anomaly_berry.rsi + packetPrototype: AnomalyBerrySeeds + productPrototypes: + - FoodAnomalyBerry + lifespan: 25 + maturation: 12 + production: 3 + yield: 3 + potency: 10 + growthStages: 2 + waterConsumption: 0.60 + nutrientConsumption: 0.50 + chemicals: + Artifexium: + Min: 1 + Max: 1 + PotencyDivisor: 4 + Nutriment: + Min: 1 + Max: 2 + PotencyDivisor: 30 + Vitamin: + Min: 1 + Max: 2 + PotencyDivisor: 40 diff --git a/Resources/Prototypes/Hydroponics/Seeds/fungus.yml b/Resources/Prototypes/Hydroponics/Seeds/fungus.yml new file mode 100644 index 00000000000..45950ba9bcd --- /dev/null +++ b/Resources/Prototypes/Hydroponics/Seeds/fungus.yml @@ -0,0 +1,119 @@ +- type: seed + id: towercap + name: seeds-towercap-name + noun: seeds-noun-spores + displayName: seeds-towercap-display-name + plantRsi: Objects/Specific/Hydroponics/towercap.rsi + packetPrototype: TowercapSeeds + productPrototypes: + - Log + lifespan: 80 + maturation: 15 + ligneous: true + production: 3 + yield: 5 + potency: 1 + growthStages: 3 + waterConsumption: 0.60 + nutrientConsumption: 0.50 + lightTolerance: 6 + idealHeat: 288 + +- type: seed + id: steelcap + name: seeds-steelcap-name + noun: seeds-noun-spores + displayName: seeds-steelcap-display-name + plantRsi: Objects/Specific/Hydroponics/steelcap.rsi + packetPrototype: SteelcapSeeds + productPrototypes: + - SteelLog + lifespan: 80 + maturation: 15 + ligneous: true + production: 1 + yield: 1 + potency: 1 + growthStages: 3 + waterConsumption: 0.60 + nutrientConsumption: 0.80 + lightTolerance: 6 + idealHeat: 288 + +- type: seed + id: chanterelle + name: seeds-chanterelle-name + noun: seeds-noun-spores + displayName: seeds-chanterelle-display-name + plantRsi: Objects/Specific/Hydroponics/chanterelle.rsi + packetPrototype: ChanterelleSeeds + productPrototypes: + - FoodMushroom + lifespan: 35 + maturation: 10 + production: 7 + yield: 5 + potency: 1 + growthStages: 3 + lightTolerance: 6 + waterConsumption: 0.60 + nutrientConsumption: 0.50 + idealHeat: 288 + chemicals: + Nutriment: + Min: 1 + Max: 25 + PotencyDivisor: 25 + +- type: seed + id: lingzhi + name: seeds-lingzhi-name + noun: seeds-noun-spores + displayName: seeds-lingzhi-display-name + plantRsi: Objects/Specific/Hydroponics/lingzhi.rsi + packetPrototype: LingzhiSeeds + productPrototypes: + - FoodLingzhi + lifespan: 25 + maturation: 10 + production: 3 + yield: 3 + potency: 10 + growthStages: 3 + waterConsumption: 0.60 + chemicals: + Ultravasculine: + Min: 1 + Max: 20 + PotencyDivisor: 5 + Epinephrine: + Min: 1 + Max: 20 + PotencyDivisor: 5 + +- type: seed + id: flyAmanita + name: seeds-flyamanita-name + noun: seeds-noun-spores + displayName: seeds-flyamanita-display-name + plantRsi: Objects/Specific/Hydroponics/fly_amanita.rsi + packetPrototype: FlyAmanitaSeeds + productPrototypes: + - FoodFlyAmanita + lifespan: 25 + maturation: 12 + production: 3 + yield: 3 + potency: 10 + growthStages: 2 + waterConsumption: 0.60 + nutrientConsumption: 0.50 + chemicals: + Amatoxin: + Min: 1 + Max: 10 + PotencyDivisor: 12 + Nutriment: ## yumby :) + Min: 1 + Max: 5 + PotencyDivisor: 20 diff --git a/Resources/Prototypes/Hydroponics/Seeds/grains.yml b/Resources/Prototypes/Hydroponics/Seeds/grains.yml new file mode 100644 index 00000000000..dbef6cb5600 --- /dev/null +++ b/Resources/Prototypes/Hydroponics/Seeds/grains.yml @@ -0,0 +1,160 @@ +- type: seed + id: wheat + name: seeds-wheat-name + noun: seeds-noun-seeds + displayName: seeds-wheat-display-name + plantRsi: Objects/Specific/Hydroponics/wheat.rsi + packetPrototype: WheatSeeds + productPrototypes: + - WheatBushel + mutationPrototypes: + - meatwheat + lifespan: 25 + maturation: 6 + production: 3 + yield: 3 + potency: 5 + idealLight: 8 + nutrientConsumption: 0.40 + chemicals: + Nutriment: + Min: 1 + Max: 20 + PotencyDivisor: 20 + Flour: + Min: 5 + Max: 20 + PotencyDivisor: 20 + +- type: seed + id: meatwheat + name: seeds-meatwheat-name + noun: seeds-noun-seeds + displayName: seeds-meatwheat-display-name + plantRsi: Objects/Specific/Hydroponics/meatwheat.rsi + packetPrototype: MeatwheatSeeds + productPrototypes: + - MeatwheatBushel + lifespan: 25 + maturation: 6 + production: 3 + yield: 3 + potency: 5 + idealLight: 8 + nutrientConsumption: 0.40 + chemicals: + Nutriment: + Min: 1 + Max: 20 + PotencyDivisor: 20 + UncookedAnimalProteins: + Min: 5 + Max: 20 + PotencyDivisor: 20 + +- type: seed + id: oat + name: seeds-oat-name + noun: seeds-noun-seeds + displayName: seeds-oat-display-name + plantRsi: Objects/Specific/Hydroponics/oat.rsi + packetPrototype: OatSeeds + productPrototypes: + - OatBushel + lifespan: 25 + maturation: 6 + production: 3 + yield: 3 + potency: 5 + idealLight: 8 + nutrientConsumption: 0.40 + chemicals: + Nutriment: + Min: 1 + Max: 20 + PotencyDivisor: 20 + Oats: + Min: 5 + Max: 20 + PotencyDivisor: 20 + +- type: seed + id: corn + name: seeds-corn-name + noun: seeds-noun-seeds + displayName: seeds-corn-display-name + plantRsi: Objects/Specific/Hydroponics/corn.rsi + packetPrototype: CornSeeds + productPrototypes: + - FoodCorn + lifespan: 25 + maturation: 8 + production: 6 + yield: 2 + potency: 20 + growthStages: 3 + idealLight: 8 + waterConsumption: 0.60 + idealHeat: 298 + chemicals: + Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 20 + Cornmeal: + Min: 5 + Max: 15 + PotencyDivisor: 10 + +- type: seed + id: rice + name: seeds-rice-name + noun: seeds-noun-seeds + displayName: seeds-rice-display-name + plantRsi: Objects/Specific/Hydroponics/rice.rsi + packetPrototype: RiceSeeds + productPrototypes: + - RiceBushel + lifespan: 25 + maturation: 6 + production: 3 + yield: 3 + potency: 5 + growthStages: 4 + idealLight: 5 + nutrientConsumption: 0.40 + waterConsumption: 0.60 + chemicals: + Nutriment: + Min: 1 + Max: 20 + PotencyDivisor: 20 + Rice: + Min: 5 + Max: 20 + PotencyDivisor: 20 + +- type: seed + id: soybeans + name: seeds-soybeans-name + noun: seeds-noun-seeds + displayName: seeds-soybeans-display-name + plantRsi: Objects/Specific/Hydroponics/soybeans.rsi + packetPrototype: SoybeanSeeds + productPrototypes: + - FoodSoybeans + mutationPrototypes: + - koibean + growthStages: 4 + lifespan: 25 + maturation: 6 + production: 6 + yield: 3 + potency: 5 + idealLight: 7 + nutrientConsumption: 0.40 + chemicals: + Nutriment: + Min: 1 + Max: 2 + PotencyDivisor: 50 diff --git a/Resources/Prototypes/Hydroponics/Seeds/leaves.yml b/Resources/Prototypes/Hydroponics/Seeds/leaves.yml new file mode 100644 index 00000000000..ce42114e203 --- /dev/null +++ b/Resources/Prototypes/Hydroponics/Seeds/leaves.yml @@ -0,0 +1,293 @@ +- type: seed + id: teaPlant + name: seeds-teaplant-name + noun: seeds-noun-seeds + displayName: seeds-teaplant-display-name + plantRsi: Objects/Specific/Hydroponics/tea_plant.rsi + packetPrototype: TeaPlantSeeds + productPrototypes: + - LeavesTea + harvestRepeat: Repeat + lifespan: 75 + maturation: 5 + production: 3 + yield: 2 + potency: 20 + growthStages: 5 + waterConsumption: 0.6 + idealLight: 9 + idealHeat: 298 + chemicals: + Vitamin: + Min: 1 + Max: 5 + PotencyDivisor: 20 + +- type: seed + id: cabbage + name: seeds-cabbage-name + noun: seeds-noun-seeds + displayName: seeds-cabbage-display-name + plantRsi: Objects/Specific/Hydroponics/cabbage.rsi + packetPrototype: CabbageSeeds + productPrototypes: + - FoodCabbage + lifespan: 50 + maturation: 7 + production: 5 + yield: 3 + potency: 10 + growthStages: 1 + chemicals: + Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 10 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: cannabis + name: seeds-cannabis-name + noun: seeds-noun-seeds + displayName: seeds-cannabis-display-name + plantRsi: Objects/Specific/Hydroponics/cannabis.rsi + packetPrototype: CannabisSeeds + productPrototypes: + - LeavesCannabis + mutationPrototypes: + - rainbowCannabis + harvestRepeat: Repeat + lifespan: 75 + maturation: 8 + production: 12 + yield: 2 + potency: 20 + growthStages: 3 + waterConsumption: 0.40 + idealLight: 9 + idealHeat: 298 + chemicals: + THC: + Min: 1 + Max: 10 + PotencyDivisor: 10 + +- type: seed + id: rainbowCannabis + name: seeds-rainbow-cannabis-name + noun: seeds-noun-seeds + displayName: seeds-rainbow-cannabis-display-name + plantRsi: Objects/Specific/Hydroponics/rainbow_cannabis.rsi + packetPrototype: RainbowCannabisSeeds + productPrototypes: + - LeavesCannabisRainbow + harvestRepeat: Repeat + lifespan: 75 + maturation: 8 + production: 12 + yield: 2 + potency: 20 + growthStages: 3 + waterConsumption: 0.40 + idealLight: 9 + idealHeat: 298 + chemicals: + SpaceDrugs: + Min: 1 + Max: 15 + PotencyDivisor: 10 + Lipolicide: + Min: 1 + Max: 15 + PotencyDivisor: 10 + MindbreakerToxin: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Happiness: + Min: 1 + Max: 5 + PotencyDivisor: 20 + # ColorfulReagent: + # Min: 0 + # Max: 5 + # PotencyDivisor: 20 + Psicodine: + Min: 0 + Max: 5 + PotencyDivisor: 33 + +- type: seed + id: tobacco + name: seeds-tobacco-name + noun: seeds-noun-seeds + displayName: seeds-tobacco-display-name + plantRsi: Objects/Specific/Hydroponics/tobacco.rsi + packetPrototype: TobaccoSeeds + productPrototypes: + - LeavesTobacco + harvestRepeat: Repeat + lifespan: 75 + maturation: 5 + production: 5 + yield: 2 + potency: 20 + growthStages: 3 + waterConsumption: 0.40 + idealLight: 9 + idealHeat: 298 + chemicals: + Nicotine: + Min: 1 + Max: 10 + PotencyDivisor: 10 + +- type: seed + id: nettle + name: seeds-nettle-name + noun: seeds-noun-seeds + displayName: seeds-nettle-display-name + plantRsi: Objects/Specific/Hydroponics/nettle.rsi + packetPrototype: NettleSeeds + productPrototypes: + - Nettle + mutationPrototypes: + - deathNettle + lifespan: 25 + maturation: 8 + production: 6 + yield: 2 + potency: 20 + growthStages: 5 + idealLight: 8 + waterConsumption: 0.60 + idealHeat: 298 + chemicals: + Histamine: + Min: 1 + Max: 25 + PotencyDivisor: 4 + +- type: seed + id: deathNettle + name: seeds-deathnettle-name + noun: seeds-noun-seeds + displayName: seeds-deathnettle-display-name + plantRsi: Objects/Specific/Hydroponics/death_nettle.rsi + packetPrototype: DeathNettleSeeds + plantLogImpact: High + harvestLogImpact: High + productPrototypes: + - DeathNettle + lifespan: 25 + maturation: 8 + production: 6 + yield: 2 + potency: 20 + growthStages: 5 + idealLight: 8 + waterConsumption: 0.70 + nutrientConsumption: 0.80 + idealHeat: 298 + chemicals: + SulfuricAcid: + Min: 1 + Max: 15 + PotencyDivisor: 6 + FluorosulfuricAcid: + Min: 1 + Max: 15 + PotencyDivisor: 6 + +- type: seed + id: aloe + name: seeds-aloe-name + noun: seeds-noun-seeds + displayName: seeds-aloe-display-name + plantRsi: Objects/Specific/Hydroponics/aloe.rsi + packetPrototype: AloeSeeds + productPrototypes: + - FoodAloe + lifespan: 25 + maturation: 10 + production: 3 + yield: 3 + potency: 10 + growthStages: 5 + waterConsumption: 0.60 + chemicals: + Aloe: + Min: 1 + Max: 10 + PotencyDivisor: 10 + Dermaline: + Min: 1 + Max: 10 + PotencyDivisor: 10 + +- type: seed + id: ambrosiaVulgaris + name: seeds-ambrosiavulgaris-name + noun: seeds-noun-seeds + displayName: seeds-ambrosiavulgaris-display-name + plantRsi: Objects/Specific/Hydroponics/ambrosia_vulgaris.rsi + packetPrototype: AmbrosiaVulgarisSeeds + productPrototypes: + - FoodAmbrosiaVulgaris + lifespan: 25 + maturation: 10 + production: 3 + yield: 3 + potency: 10 + growthStages: 6 + waterConsumption: 0.60 + chemicals: + Nutriment: + Min: 1 + Max: 2 + PotencyDivisor: 10 + Bicaridine: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Kelotane: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Vitamin: + Min: 1 + Max: 2 + PotencyDivisor: 50 + +- type: seed + id: ambrosiaDeus + name: seeds-ambrosiadeus-name + noun: seeds-noun-seeds + displayName: seeds-ambrosiadeus-display-name + plantRsi: Objects/Specific/Hydroponics/ambrosia_deus.rsi + packetPrototype: AmbrosiaDeusSeeds + productPrototypes: + - FoodAmbrosiaVulgaris + lifespan: 25 + maturation: 10 + production: 3 + yield: 3 + potency: 10 + growthStages: 6 + waterConsumption: 0.60 + chemicals: + Nutriment: + Min: 1 + Max: 2 + PotencyDivisor: 10 + Omnizine: # Don't kill me + Min: 1 + Max: 3 + PotencyDivisor: 35 + SpaceDrugs: + Min: 1 + Max: 5 + PotencyDivisor: 20 diff --git a/Resources/Prototypes/Hydroponics/Seeds/other.yml b/Resources/Prototypes/Hydroponics/Seeds/other.yml new file mode 100644 index 00000000000..f53f97d83fa --- /dev/null +++ b/Resources/Prototypes/Hydroponics/Seeds/other.yml @@ -0,0 +1,272 @@ +- type: seed + id: laughinPea + name: seeds-laughin-pea-name + noun: seeds-noun-seeds + displayName: seeds-laughin-pea-display-name + plantRsi: Objects/Specific/Hydroponics/laughin_pea.rsi + packetPrototype: LaughinPeaSeeds + productPrototypes: + - FoodLaughinPeaPod + mutationPrototypes: + - worldPea + lifespan: 25 + growthStages: 3 + maturation: 7 + production: 5 + yield: 3 + potency: 20 + idealLight: 8 + harvestRepeat: Repeat + nutrientConsumption: 0.6 + waterConsumption: 0.6 + chemicals: + Nutriment: + Min: 1 + Max: 3 + PotencyDivisor: 7 + Sugar: + Min: 1 + Max: 10 + PotencyDivisor: 5 + Laughter: + Min: 1 + Max: 10 + PotencyDivisor: 5 + +- type: seed + id: sugarcane + name: seeds-sugarcane-name + noun: seeds-noun-seeds + displayName: seeds-sugarcane-display-name + plantRsi: Objects/Specific/Hydroponics/sugarcane.rsi + packetPrototype: SugarcaneSeeds + productPrototypes: + - Sugarcane + mutationPrototypes: + - papercane + harvestRepeat: Repeat + lifespan: 60 + maturation: 6 + production: 6 + yield: 3 + potency: 10 + growthStages: 3 + idealHeat: 298 + chemicals: + Sugar: + Min: 4 + Max: 5 + PotencyDivisor: 5 + +- type: seed + id: papercane + name: seeds-papercane-name + noun: seeds-noun-seeds + displayName: seeds-papercane-display-name + plantRsi: Objects/Specific/Hydroponics/papercane.rsi + packetPrototype: PapercaneSeeds + productPrototypes: + - Papercane + harvestRepeat: Repeat + lifespan: 60 + maturation: 6 + production: 6 + yield: 3 + potency: 10 + growthStages: 3 + idealHeat: 298 + +- type: seed + id: eggy + name: seeds-eggy-name + noun: seeds-noun-seeds + displayName: seeds-eggy-display-name + plantRsi: Objects/Specific/Hydroponics/eggy.rsi + packetPrototype: EggySeeds + productPrototypes: + - FoodEgg + harvestRepeat: Repeat + lifespan: 75 + maturation: 6 + production: 12 + yield: 2 + potency: 20 + nutrientConsumption: 0.50 + idealLight: 9 + idealHeat: 298 + chemicals: + Egg: + Min: 4 + Max: 12 + PotencyDivisor: 10 + +- type: seed + id: koibean + name: seeds-koibean-name + noun: seeds-noun-seeds + displayName: seeds-koibean-display-name + plantRsi: Objects/Specific/Hydroponics/koibean.rsi + packetPrototype: KoibeanSeeds + productPrototypes: + - FoodKoibean + growthStages: 4 + lifespan: 25 + maturation: 6 + production: 6 + yield: 3 + potency: 5 + idealLight: 7 + nutrientConsumption: 0.40 + chemicals: + Nutriment: + Min: 1 + Max: 5 + PotencyDivisor: 20 + CarpoToxin: + Min: 1 + Max: 4 + PotencyDivisor: 30 + +- type: seed + id: cocoa + name: seeds-cocoa-name + noun: seeds-noun-seeds + displayName: seeds-cocoa-display-name + plantRsi: Objects/Specific/Hydroponics/cocoa.rsi + packetPrototype: CocoaSeeds + productPrototypes: + - FoodCocoaPod + harvestRepeat: Repeat + lifespan: 50 + maturation: 6 + production: 6 + yield: 6 + idealLight: 7 + waterConsumption: 1 + nutrientConsumption: 0.8 + idealHeat: 298 + chemicals: + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + Nutriment: + Min: 1 + Max: 2 + PotencyDivisor: 50 + +- type: seed + id: pea + name: seeds-pea-name + noun: seeds-noun-seeds + displayName: seeds-pea-display-name + plantRsi: Objects/Specific/Hydroponics/pea.rsi + packetPrototype: PeaSeeds + productPrototypes: + - FoodPeaPod + mutationPrototypes: + - laughinPea + lifespan: 25 + growthStages: 3 + maturation: 8 + production: 6 + yield: 3 + potency: 25 + idealLight: 8 + harvestRepeat: Repeat + nutrientConsumption: 0.5 + waterConsumption: 0.5 + chemicals: + Nutriment: + Min: 1 + Max: 3 + PotencyDivisor: 33 + Vitamin: + Min: 1 + Max: 2 + PotencyDivisor: 50 + +- type: seed + id: worldPea + name: seeds-worldpea-name + noun: seeds-noun-seeds + displayName: seeds-worldpea-display-name + plantRsi: Objects/Specific/Hydroponics/world_pea.rsi + packetPrototype: PeaSeeds + productPrototypes: + - FoodWorldPeas + lifespan: 25 + growthStages: 3 + maturation: 20 + production: 6 + yield: 3 + potency: 25 + idealLight: 8 + harvestRepeat: Repeat + nutrientConsumption: 0.5 + waterConsumption: 0.5 + chemicals: + Happiness: + Min: 1 + Max: 3 + PotencyDivisor: 25 + Nutriment: + Min: 1 + Max: 3 + PotencyDivisor: 20 + Pax: + Min: 1 + Max: 2 + PotencyDivisor: 50 + +- type: seed + id: cotton + name: seeds-cotton-name + noun: seeds-noun-seeds + displayName: seeds-cotton-display-name + plantRsi: Objects/Specific/Hydroponics/cotton.rsi + packetPrototype: CottonSeeds + productPrototypes: + - CottonBol + mutationPrototypes: + - pyrotton + lifespan: 25 + maturation: 8 + production: 3 + yield: 3 + potency: 5 + idealLight: 8 + growthStages: 3 + waterConsumption: 0.60 + chemicals: + Fiber: + Min: 5 + Max: 10 + PotencyDivisor: 20 + +- type: seed + id: pyrotton + name: seeds-pyrotton-name + noun: seeds-noun-seeds + displayName: seeds-pyrotton-display-name + plantRsi: Objects/Specific/Hydroponics/pyrotton.rsi + packetPrototype: PyrottonSeeds + productPrototypes: + - PyrottonBol + lifespan: 25 + maturation: 8 + production: 3 + yield: 2 + potency: 5 + idealLight: 8 + growthStages: 3 + waterConsumption: 0.80 + chemicals: + Fiber: + Min: 5 + Max: 10 + PotencyDivisor: 20 + Phlogiston: + Min: 4 + Max: 8 + PotencyDivisor: 30 diff --git a/Resources/Prototypes/Hydroponics/Seeds/rootveggies.yml b/Resources/Prototypes/Hydroponics/Seeds/rootveggies.yml new file mode 100644 index 00000000000..cdd7860c812 --- /dev/null +++ b/Resources/Prototypes/Hydroponics/Seeds/rootveggies.yml @@ -0,0 +1,186 @@ +- type: seed + id: carrots + name: seeds-carrots-name + noun: seeds-noun-seeds + displayName: seeds-carrots-display-name + plantRsi: Objects/Specific/Hydroponics/carrot.rsi + packetPrototype: CarrotSeeds + productPrototypes: + - FoodCarrot + lifespan: 25 + maturation: 10 + production: 3 + yield: 3 + potency: 10 + growthStages: 3 + waterConsumption: 0.60 + chemicals: + JuiceCarrot: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Oculine: + Min: 2 + Max: 6 + PotencyDivisor: 20 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: potato + name: seeds-potato-name + noun: seeds-noun-seeds + displayName: seeds-potato-display-name + plantRsi: Objects/Specific/Hydroponics/potato.rsi + packetPrototype: PotatoSeeds + productPrototypes: + - FoodPotato + lifespan: 30 + maturation: 10 + production: 3 + yield: 3 + potency: 10 + growthStages: 4 + waterConsumption: 0.60 + chemicals: + Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 10 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: garlic + name: seeds-garlic-name + noun: seeds-noun-seeds + displayName: seeds-garlic-display-name + plantRsi: Objects/Specific/Hydroponics/garlic.rsi + packetPrototype: GarlicSeeds + productPrototypes: + - FoodGarlic + lifespan: 25 + maturation: 8 + production: 5 + yield: 3 + potency: 25 + growthStages: 3 + chemicals: + Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 10 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + Allicin: + Min: 1 + Max: 8 + PotencyDivisor: 25 + +- type: seed + id: onion + name: seeds-onion-name + noun: seeds-noun-seeds + displayName: seeds-onion-display-name + plantRsi: Objects/Specific/Hydroponics/onion.rsi + packetPrototype: OnionSeeds + productPrototypes: + - FoodOnion + mutationPrototypes: + - onionred + - bloonion + lifespan: 25 + maturation: 8 + production: 6 + yield: 2 + potency: 20 + growthStages: 3 + idealLight: 8 + waterConsumption: 0.60 + idealHeat: 298 + chemicals: + Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 10 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + Allicin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: onionred + name: seeds-onionred-name + noun: seeds-noun-seeds + displayName: seeds-onionred-display-name + plantRsi: Objects/Specific/Hydroponics/onion_red.rsi + packetPrototype: OnionRedSeeds + productPrototypes: + - FoodOnionRed + lifespan: 25 + maturation: 8 + production: 6 + yield: 2 + potency: 20 + growthStages: 3 + idealLight: 8 + waterConsumption: 0.60 + idealHeat: 298 + chemicals: + Nutriment: + Min: 1 + Max: 10 + PotencyDivisor: 10 + Vitamin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + Allicin: + Min: 1 + Max: 4 + PotencyDivisor: 25 + +- type: seed + id: bloonion + name: seeds-bloonion-name + noun: seeds-noun-seeds + displayName: seeds-bloonion-display-name + plantRsi: Objects/Specific/Hydroponics/bloonion.rsi + packetPrototype: BloonionSeeds + productPrototypes: + - FoodBloonion + lifespan: 25 + maturation: 15 + production: 3 + yield: 3 + potency: 10 + growthStages: 4 + waterConsumption: 0.60 + nutrientConsumption: 0.50 + chemicals: + Potassium: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Phosphorus: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Sugar: + Min: 1 + Max: 5 + PotencyDivisor: 20 + Allicin: + Min: 1 + Max: 10 + PotencyDivisor: 10 diff --git a/Resources/Prototypes/Hydroponics/seeds.yml b/Resources/Prototypes/Hydroponics/seeds.yml deleted file mode 100644 index 4db77829580..00000000000 --- a/Resources/Prototypes/Hydroponics/seeds.yml +++ /dev/null @@ -1,2022 +0,0 @@ -- type: seed - id: wheat - name: seeds-wheat-name - noun: seeds-noun-seeds - displayName: seeds-wheat-display-name - plantRsi: Objects/Specific/Hydroponics/wheat.rsi - packetPrototype: WheatSeeds - productPrototypes: - - WheatBushel - mutationPrototypes: - - meatwheat - lifespan: 25 - maturation: 6 - production: 3 - yield: 3 - potency: 5 - idealLight: 8 - nutrientConsumption: 0.40 - chemicals: - Nutriment: - Min: 1 - Max: 20 - PotencyDivisor: 20 - Flour: - Min: 5 - Max: 20 - PotencyDivisor: 20 - -- type: seed - id: meatwheat - name: seeds-meatwheat-name - noun: seeds-noun-seeds - displayName: seeds-meatwheat-display-name - plantRsi: Objects/Specific/Hydroponics/meatwheat.rsi - packetPrototype: MeatwheatSeeds - productPrototypes: - - MeatwheatBushel - lifespan: 25 - maturation: 6 - production: 3 - yield: 3 - potency: 5 - idealLight: 8 - nutrientConsumption: 0.40 - chemicals: - Nutriment: - Min: 1 - Max: 20 - PotencyDivisor: 20 - UncookedAnimalProteins: - Min: 5 - Max: 20 - PotencyDivisor: 20 - -- type: seed - id: oat - name: seeds-oat-name - noun: seeds-noun-seeds - displayName: seeds-oat-display-name - plantRsi: Objects/Specific/Hydroponics/oat.rsi - packetPrototype: OatSeeds - productPrototypes: - - OatBushel - lifespan: 25 - maturation: 6 - production: 3 - yield: 3 - potency: 5 - idealLight: 8 - nutrientConsumption: 0.40 - chemicals: - Nutriment: - Min: 1 - Max: 20 - PotencyDivisor: 20 - Oats: - Min: 5 - Max: 20 - PotencyDivisor: 20 - -- type: seed - id: banana - name: seeds-banana-name - noun: seeds-noun-seeds - displayName: seeds-banana-display-name - plantRsi: Objects/Specific/Hydroponics/banana.rsi - packetPrototype: BananaSeeds - productPrototypes: - - FoodBanana - mutationPrototypes: - - mimana - harvestRepeat: Repeat - lifespan: 50 - maturation: 6 - production: 6 - yield: 2 - idealLight: 9 - waterConsumption: 0.60 - idealHeat: 298 - chemicals: - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - Nutriment: - Min: 1 - Max: 2 - PotencyDivisor: 50 - -- type: seed - id: mimana - name: seeds-mimana-name - noun: seeds-noun-seeds - displayName: seeds-mimana-display-name - plantRsi: Objects/Specific/Hydroponics/mimana.rsi - packetPrototype: MimanaSeeds - productPrototypes: - - FoodMimana - harvestRepeat: Repeat - lifespan: 50 - maturation: 6 - production: 6 - yield: 2 - idealLight: 9 - waterConsumption: 0.60 - idealHeat: 298 - chemicals: - MuteToxin: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Nutriment: - Min: 1 - Max: 2 - PotencyDivisor: 50 - -- type: seed - id: carrots - name: seeds-carrots-name - noun: seeds-noun-seeds - displayName: seeds-carrots-display-name - plantRsi: Objects/Specific/Hydroponics/carrot.rsi - packetPrototype: CarrotSeeds - productPrototypes: - - FoodCarrot - lifespan: 25 - maturation: 10 - production: 3 - yield: 3 - potency: 10 - growthStages: 3 - waterConsumption: 0.60 - chemicals: - JuiceCarrot: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Oculine: - Min: 2 - Max: 6 - PotencyDivisor: 20 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: laughinPea - name: seeds-laughin-pea-name - noun: seeds-noun-seeds - displayName: seeds-laughin-pea-display-name - plantRsi: Objects/Specific/Hydroponics/laughin_pea.rsi - packetPrototype: LaughinPeaSeeds - productPrototypes: - - FoodLaughinPeaPod - mutationPrototypes: - - worldPea - lifespan: 25 - growthStages: 3 - maturation: 7 - production: 5 - yield: 3 - potency: 20 - idealLight: 8 - harvestRepeat: Repeat - nutrientConsumption: 0.6 - waterConsumption: 0.6 - chemicals: - Nutriment: - Min: 1 - Max: 3 - PotencyDivisor: 7 - Sugar: - Min: 1 - Max: 10 - PotencyDivisor: 5 - Laughter: - Min: 1 - Max: 10 - PotencyDivisor: 5 - -- type: seed - id: lemon - name: seeds-lemon-name - noun: seeds-noun-seeds - displayName: seeds-lemon-display-name - plantRsi: Objects/Specific/Hydroponics/lemon.rsi - packetPrototype: LemonSeeds - productPrototypes: - - FoodLemon - mutationPrototypes: - - lemoon - - lime - - orange - harvestRepeat: Repeat - lifespan: 55 - maturation: 6 - production: 6 - yield: 3 - potency: 10 - idealLight: 8 - chemicals: - Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: lemoon - name: seeds-lemoon-name - noun: seeds-noun-seeds - displayName: seeds-lemoon-display-name - plantRsi: Objects/Specific/Hydroponics/lemoon.rsi - packetPrototype: LemoonSeeds - productPrototypes: - - FoodLemoon - harvestRepeat: Repeat - lifespan: 90 - maturation: 8 - production: 6 - yield: 4 - potency: 1 - idealLight: 8 - chemicals: - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - Milk: - Min: 8 - Max: 20 - PotencyDivisor: 5 - -- type: seed - id: lime - name: seeds-lime-name - noun: seeds-noun-seeds - displayName: seeds-lime-display-name - plantRsi: Objects/Specific/Hydroponics/lime.rsi - packetPrototype: LimeSeeds - productPrototypes: - - FoodLime - mutationPrototypes: - - orange - - lemon - harvestRepeat: Repeat - lifespan: 55 - maturation: 6 - production: 6 - yield: 3 - potency: 10 - idealLight: 8 - chemicals: - Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: orange - name: seeds-orange-name - noun: seeds-noun-seeds - displayName: seeds-orange-display-name - plantRsi: Objects/Specific/Hydroponics/orange.rsi - packetPrototype: OrangeSeeds - productPrototypes: - - FoodOrange - mutationPrototypes: - - extradimensionalOrange - - lemon - - lime - harvestRepeat: Repeat - lifespan: 55 - maturation: 6 - production: 6 - yield: 3 - potency: 10 - idealLight: 8 - chemicals: - Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: extradimensionalOrange - name: seeds-extradimensionalorange-name - noun: seeds-noun-seeds - displayName: seeds-extradimensionalorange-display-name - plantRsi: Objects/Specific/Hydroponics/extradimensional_orange.rsi - packetPrototype: ExtradimensionalOrangeSeeds - productPrototypes: - - FoodExtradimensionalOrange - harvestRepeat: Repeat - lifespan: 55 - maturation: 6 - production: 6 - yield: 3 - potency: 10 - idealLight: 8 - chemicals: - Haloperidol: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: pineapple - name: seeds-pineapple-name - noun: seeds-noun-seeds - displayName: seeds-pineapple-display-name - plantRsi: Objects/Specific/Hydroponics/pineapple.rsi - packetPrototype: PineappleSeeds - productPrototypes: - - FoodPineapple - harvestRepeat: Repeat - lifespan: 55 - maturation: 6 - production: 6 - yield: 3 - potency: 10 - idealLight: 8 - growthStages: 3 - chemicals: - Nutriment: - Min: 1 - Max: 20 - PotencyDivisor: 20 - Water: - Min: 1 - Max: 4 - PotencyDivisor: 25 - Vitamin: - Min: 1 - Max: 2 - PotencyDivisor: 50 - -- type: seed - id: potato - name: seeds-potato-name - noun: seeds-noun-seeds - displayName: seeds-potato-display-name - plantRsi: Objects/Specific/Hydroponics/potato.rsi - packetPrototype: PotatoSeeds - productPrototypes: - - FoodPotato - lifespan: 30 - maturation: 10 - production: 3 - yield: 3 - potency: 10 - growthStages: 4 - waterConsumption: 0.60 - chemicals: - Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: sugarcane - name: seeds-sugarcane-name - noun: seeds-noun-seeds - displayName: seeds-sugarcane-display-name - plantRsi: Objects/Specific/Hydroponics/sugarcane.rsi - packetPrototype: SugarcaneSeeds - productPrototypes: - - Sugarcane - mutationPrototypes: - - papercane - harvestRepeat: Repeat - lifespan: 60 - maturation: 6 - production: 6 - yield: 3 - potency: 10 - growthStages: 3 - idealHeat: 298 - chemicals: - Sugar: - Min: 4 - Max: 5 - PotencyDivisor: 5 - -- type: seed - id: teaPlant - name: seeds-teaplant-name - noun: seeds-noun-seeds - displayName: seeds-teaplant-display-name - plantRsi: Objects/Specific/Hydroponics/tea_plant.rsi - packetPrototype: TeaPlantSeeds - productPrototypes: - - LeavesTea - harvestRepeat: Repeat - lifespan: 75 - maturation: 5 - production: 3 - yield: 2 - potency: 20 - growthStages: 5 - waterConsumption: 0.6 - idealLight: 9 - idealHeat: 298 - chemicals: - Vitamin: - Min: 1 - Max: 5 - PotencyDivisor: 20 - -- type: seed - id: papercane - name: seeds-papercane-name - noun: seeds-noun-seeds - displayName: seeds-papercane-display-name - plantRsi: Objects/Specific/Hydroponics/papercane.rsi - packetPrototype: PapercaneSeeds - productPrototypes: - - Papercane - harvestRepeat: Repeat - lifespan: 60 - maturation: 6 - production: 6 - yield: 3 - potency: 10 - growthStages: 3 - idealHeat: 298 - -- type: seed - id: towercap - name: seeds-towercap-name - noun: seeds-noun-spores - displayName: seeds-towercap-display-name - plantRsi: Objects/Specific/Hydroponics/towercap.rsi - packetPrototype: TowercapSeeds - productPrototypes: - - Log - lifespan: 80 - maturation: 15 - ligneous: true - production: 3 - yield: 5 - potency: 1 - growthStages: 3 - waterConsumption: 0.60 - nutrientConsumption: 0.50 - lightTolerance: 6 - idealHeat: 288 - -- type: seed - id: steelcap - name: seeds-steelcap-name - noun: seeds-noun-spores - displayName: seeds-steelcap-display-name - plantRsi: Objects/Specific/Hydroponics/steelcap.rsi - packetPrototype: SteelcapSeeds - productPrototypes: - - SteelLog - lifespan: 80 - maturation: 15 - ligneous: true - production: 1 - yield: 1 - potency: 1 - growthStages: 3 - waterConsumption: 0.60 - nutrientConsumption: 0.80 - lightTolerance: 6 - idealHeat: 288 - -- type: seed - id: tomato - name: seeds-tomato-name - noun: seeds-noun-seeds - displayName: seeds-tomato-display-name - plantRsi: Objects/Specific/Hydroponics/tomato.rsi - packetPrototype: TomatoSeeds - productPrototypes: - - FoodTomato - mutationPrototypes: - - blueTomato - - bloodTomato - harvestRepeat: Repeat - lifespan: 25 - maturation: 8 - production: 6 - yield: 2 - potency: 10 - waterConsumption: 0.60 - nutrientConsumption: 0.40 - idealLight: 8 - idealHeat: 298 - splatPrototype: PuddleSplatter - chemicals: - Nutriment: - Min: 1 - Max: 7 - PotencyDivisor: 14 - Vitamin: - Min: 1 - Max: 3 - PotencyDivisor: 33 - Water: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: blueTomato - name: seeds-bluetomato-name - noun: seeds-noun-seeds - displayName: seeds-bluetomato-display-name - plantRsi: Objects/Specific/Hydroponics/blue_tomato.rsi - packetPrototype: BlueTomatoSeeds - productPrototypes: - - FoodBlueTomato - harvestRepeat: Repeat - lifespan: 25 - maturation: 8 - production: 6 - yield: 2 - potency: 10 - waterConsumption: 0.60 - nutrientConsumption: 0.70 - idealLight: 8 - idealHeat: 298 - splatPrototype: PuddleSplatter - chemicals: - Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 20 - SpaceLube: - Min: 5 - Max: 15 - PotencyDivisor: 10 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: bloodTomato - name: seeds-bloodtomato-name - noun: seeds-noun-seeds - displayName: seeds-bloodtomato-display-name - plantRsi: Objects/Specific/Hydroponics/blood_tomato.rsi - packetPrototype: BloodTomatoSeeds - productPrototypes: - - FoodBloodTomato -# mutationPrototypes: -# - killerTomato # Persistence: massive performance risk & no real gameplay benefit - harvestRepeat: Repeat - lifespan: 60 - maturation: 8 - production: 6 - yield: 2 - potency: 10 - waterConsumption: 0.60 - nutrientConsumption: 0.70 - idealLight: 8 - idealHeat: 298 - splatPrototype: PuddleSplatter - chemicals: - Blood: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: killerTomato - name: seeds-killertomato-name - noun: seeds-noun-seeds - displayName: seeds-killertomato-display-name - plantRsi: Objects/Specific/Hydroponics/tomatokiller.rsi - plantLogImpact: High - harvestLogImpact: High - packetPrototype: KillerTomatoSeeds - productPrototypes: - - MobTomatoKiller - harvestRepeat: Repeat - lifespan: 25 - maturation: 15 - production: 6 - yield: 2 - potency: 10 - waterConsumption: 0.60 - nutrientConsumption: 0.70 - idealLight: 8 - idealHeat: 298 - growthStages: 2 - splatPrototype: PuddleSplatter - chemicals: - Blood: - Min: 1 - Max: 10 - PotencyDivisor: 10 - JuiceTomato: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: eggplant - name: seeds-eggplant-name - noun: seeds-noun-seeds - displayName: seeds-eggplant-display-name - plantRsi: Objects/Specific/Hydroponics/eggplant.rsi - packetPrototype: EggplantSeeds - productPrototypes: - - FoodEggplant - mutationPrototypes: - - eggy - harvestRepeat: Repeat - lifespan: 25 - maturation: 6 - production: 6 - yield: 2 - potency: 20 - growthStages: 3 - idealLight: 9 - idealHeat: 298 - chemicals: - Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: cabbage - name: seeds-cabbage-name - noun: seeds-noun-seeds - displayName: seeds-cabbage-display-name - plantRsi: Objects/Specific/Hydroponics/cabbage.rsi - packetPrototype: CabbageSeeds - productPrototypes: - - FoodCabbage - lifespan: 50 - maturation: 7 - production: 5 - yield: 3 - potency: 10 - growthStages: 1 - chemicals: - Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: garlic - name: seeds-garlic-name - noun: seeds-noun-seeds - displayName: seeds-garlic-display-name - plantRsi: Objects/Specific/Hydroponics/garlic.rsi - packetPrototype: GarlicSeeds - productPrototypes: - - FoodGarlic - lifespan: 25 - maturation: 8 - production: 5 - yield: 3 - potency: 25 - growthStages: 3 - chemicals: - Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - Allicin: - Min: 1 - Max: 8 - PotencyDivisor: 25 - -- type: seed - id: apple - name: seeds-apple-name - noun: seeds-noun-seeds - displayName: seeds-apple-display-name - plantRsi: Objects/Specific/Hydroponics/apple.rsi - packetPrototype: AppleSeeds - productPrototypes: - - FoodApple - # mutationPrototypes: - # - goldenApple - harvestRepeat: Repeat - lifespan: 55 - maturation: 6 - production: 6 - yield: 3 - potency: 10 - idealLight: 6 - chemicals: - Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: goldenApple - name: seeds-goldenapple-name - noun: seeds-noun-seeds - displayName: seeds-goldenapple-display-name - plantRsi: Objects/Specific/Hydroponics/golden_apple.rsi - packetPrototype: GoldenAppleSeeds - productPrototypes: - - FoodGoldenApple - harvestRepeat: Repeat - lifespan: 55 - maturation: 6 - production: 6 - yield: 3 - potency: 10 - idealLight: 6 - waterConsumption: 0.75 - nutrientConsumption: 0.75 - chemicals: - Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - DoctorsDelight: - Min: 3 - Max: 13 - PotencyDivisor: 10 - -- type: seed - id: corn - name: seeds-corn-name - noun: seeds-noun-seeds - displayName: seeds-corn-display-name - plantRsi: Objects/Specific/Hydroponics/corn.rsi - packetPrototype: CornSeeds - productPrototypes: - - FoodCorn - lifespan: 25 - maturation: 8 - production: 6 - yield: 2 - potency: 20 - growthStages: 3 - idealLight: 8 - waterConsumption: 0.60 - idealHeat: 298 - chemicals: - Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 20 - Cornmeal: - Min: 5 - Max: 15 - PotencyDivisor: 10 - -- type: seed - id: onion - name: seeds-onion-name - noun: seeds-noun-seeds - displayName: seeds-onion-display-name - plantRsi: Objects/Specific/Hydroponics/onion.rsi - packetPrototype: OnionSeeds - productPrototypes: - - FoodOnion - mutationPrototypes: - - onionred - - bloonion - lifespan: 25 - maturation: 8 - production: 6 - yield: 2 - potency: 20 - growthStages: 3 - idealLight: 8 - waterConsumption: 0.60 - idealHeat: 298 - chemicals: - Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - Allicin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: onionred - name: seeds-onionred-name - noun: seeds-noun-seeds - displayName: seeds-onionred-display-name - plantRsi: Objects/Specific/Hydroponics/onion_red.rsi - packetPrototype: OnionRedSeeds - productPrototypes: - - FoodOnionRed - lifespan: 25 - maturation: 8 - production: 6 - yield: 2 - potency: 20 - growthStages: 3 - idealLight: 8 - waterConsumption: 0.60 - idealHeat: 298 - chemicals: - Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - Allicin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: chanterelle - name: seeds-chanterelle-name - noun: seeds-noun-spores - displayName: seeds-chanterelle-display-name - plantRsi: Objects/Specific/Hydroponics/chanterelle.rsi - packetPrototype: ChanterelleSeeds - productPrototypes: - - FoodMushroom - lifespan: 35 - maturation: 10 - production: 7 - yield: 5 - potency: 1 - growthStages: 3 - lightTolerance: 6 - waterConsumption: 0.60 - nutrientConsumption: 0.50 - idealHeat: 288 - chemicals: - Nutriment: - Min: 1 - Max: 25 - PotencyDivisor: 25 - -- type: seed - id: eggy - name: seeds-eggy-name - noun: seeds-noun-seeds - displayName: seeds-eggy-display-name - plantRsi: Objects/Specific/Hydroponics/eggy.rsi - packetPrototype: EggySeeds - productPrototypes: - - FoodEgg - harvestRepeat: Repeat - lifespan: 75 - maturation: 6 - production: 12 - yield: 2 - potency: 20 - nutrientConsumption: 0.50 - idealLight: 9 - idealHeat: 298 - chemicals: - Egg: - Min: 4 - Max: 12 - PotencyDivisor: 10 - -- type: seed - id: cannabis - name: seeds-cannabis-name - noun: seeds-noun-seeds - displayName: seeds-cannabis-display-name - plantRsi: Objects/Specific/Hydroponics/cannabis.rsi - packetPrototype: CannabisSeeds - productPrototypes: - - LeavesCannabis - mutationPrototypes: - - rainbowCannabis - harvestRepeat: Repeat - lifespan: 75 - maturation: 8 - production: 12 - yield: 2 - potency: 20 - growthStages: 3 - waterConsumption: 0.40 - idealLight: 9 - idealHeat: 298 - chemicals: - THC: - Min: 1 - Max: 10 - PotencyDivisor: 10 - -- type: seed - id: rainbowCannabis - name: seeds-rainbow-cannabis-name - noun: seeds-noun-seeds - displayName: seeds-rainbow-cannabis-display-name - plantRsi: Objects/Specific/Hydroponics/rainbow_cannabis.rsi - packetPrototype: RainbowCannabisSeeds - productPrototypes: - - LeavesCannabisRainbow - harvestRepeat: Repeat - lifespan: 75 - maturation: 8 - production: 12 - yield: 2 - potency: 20 - growthStages: 3 - waterConsumption: 0.40 - idealLight: 9 - idealHeat: 298 - chemicals: - SpaceDrugs: - Min: 1 - Max: 15 - PotencyDivisor: 10 - Lipolicide: - Min: 1 - Max: 15 - PotencyDivisor: 10 - MindbreakerToxin: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Happiness: - Min: 1 - Max: 5 - PotencyDivisor: 20 -# ColorfulReagent: -# Min: 0 -# Max: 5 -# PotencyDivisor: 20 - Psicodine: - Min: 0 - Max: 5 - PotencyDivisor: 33 - -- type: seed - id: tobacco - name: seeds-tobacco-name - noun: seeds-noun-seeds - displayName: seeds-tobacco-display-name - plantRsi: Objects/Specific/Hydroponics/tobacco.rsi - packetPrototype: TobaccoSeeds - productPrototypes: - - LeavesTobacco - harvestRepeat: Repeat - lifespan: 75 - maturation: 5 - production: 5 - yield: 2 - potency: 20 - growthStages: 3 - waterConsumption: 0.40 - idealLight: 9 - idealHeat: 298 - chemicals: - Nicotine: - Min: 1 - Max: 10 - PotencyDivisor: 10 - -- type: seed - id: nettle - name: seeds-nettle-name - noun: seeds-noun-seeds - displayName: seeds-nettle-display-name - plantRsi: Objects/Specific/Hydroponics/nettle.rsi - packetPrototype: NettleSeeds - productPrototypes: - - Nettle - mutationPrototypes: - - deathNettle - lifespan: 25 - maturation: 8 - production: 6 - yield: 2 - potency: 20 - growthStages: 5 - idealLight: 8 - waterConsumption: 0.60 - idealHeat: 298 - chemicals: - Histamine: - Min: 1 - Max: 25 - PotencyDivisor: 4 - -- type: seed - id: deathNettle - name: seeds-deathnettle-name - noun: seeds-noun-seeds - displayName: seeds-deathnettle-display-name - plantRsi: Objects/Specific/Hydroponics/death_nettle.rsi - packetPrototype: DeathNettleSeeds - plantLogImpact: High - harvestLogImpact: High - productPrototypes: - - DeathNettle - lifespan: 25 - maturation: 8 - production: 6 - yield: 2 - potency: 20 - growthStages: 5 - idealLight: 8 - waterConsumption: 0.70 - nutrientConsumption: 0.80 - idealHeat: 298 - chemicals: - SulfuricAcid: - Min: 1 - Max: 15 - PotencyDivisor: 6 - FluorosulfuricAcid: - Min: 1 - Max: 15 - PotencyDivisor: 6 - -- type: seed - id: chili - name: seeds-chili-name - noun: seeds-noun-seeds - displayName: seeds-chili-display-name - plantRsi: Objects/Specific/Hydroponics/chili.rsi - packetPrototype: ChiliSeeds - productPrototypes: - - FoodChiliPepper - mutationPrototypes: - - chilly - harvestRepeat: Repeat - lifespan: 25 - maturation: 6 - production: 6 - yield: 2 - potency: 20 - idealLight: 9 - idealHeat: 298 - chemicals: - CapsaicinOil: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Nutriment: - Min: 1 - Max: 4 - PotencyDivisor: 25 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: chilly - name: seeds-chilly-name - noun: seeds-noun-seeds - displayName: seeds-chilly-display-name - plantRsi: Objects/Specific/Hydroponics/chilly.rsi - packetPrototype: ChillySeeds - productPrototypes: - - FoodChillyPepper - harvestRepeat: Repeat - lifespan: 25 - maturation: 6 - production: 6 - yield: 2 - potency: 20 - idealLight: 9 - idealHeat: 298 - chemicals: - FrostOil: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Nutriment: - Min: 1 - Max: 4 - PotencyDivisor: 25 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: poppy - name: seeds-poppy-name - noun: seeds-noun-seeds - displayName: seeds-poppy-display-name - plantRsi: Objects/Specific/Hydroponics/poppy.rsi - packetPrototype: PoppySeeds - productPrototypes: - - FoodPoppy - mutationPrototypes: - - lily - lifespan: 25 - maturation: 10 - production: 3 - yield: 3 - potency: 10 - growthStages: 3 - waterConsumption: 0.60 - chemicals: - Nutriment: - Min: 1 - Max: 2 - PotencyDivisor: 50 - Bicaridine: - Min: 1 - Max: 20 - PotencyDivisor: 5 - -- type: seed - id: aloe - name: seeds-aloe-name - noun: seeds-noun-seeds - displayName: seeds-aloe-display-name - plantRsi: Objects/Specific/Hydroponics/aloe.rsi - packetPrototype: AloeSeeds - productPrototypes: - - FoodAloe - lifespan: 25 - maturation: 10 - production: 3 - yield: 3 - potency: 10 - growthStages: 5 - waterConsumption: 0.60 - chemicals: - Aloe: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Dermaline: - Min: 1 - Max: 10 - PotencyDivisor: 10 - -- type: seed - id: lily - name: seeds-lily-name - noun: seeds-noun-seeds - displayName: seeds-lily-display-name - plantRsi: Objects/Specific/Hydroponics/lily.rsi - packetPrototype: LilySeeds - productPrototypes: - - FoodLily - mutationPrototypes: - - spacemansTrumpet - lifespan: 25 - maturation: 10 - production: 3 - yield: 3 - potency: 10 - growthStages: 3 - waterConsumption: 0.60 - chemicals: - Nutriment: - Min: 1 - Max: 2 - PotencyDivisor: 50 - Bicaridine: - Min: 1 - Max: 20 - PotencyDivisor: 5 - -- type: seed - id: lingzhi - name: seeds-lingzhi-name - noun: seeds-noun-spores - displayName: seeds-lingzhi-display-name - plantRsi: Objects/Specific/Hydroponics/lingzhi.rsi - packetPrototype: LingzhiSeeds - productPrototypes: - - FoodLingzhi - lifespan: 25 - maturation: 10 - production: 3 - yield: 3 - potency: 10 - growthStages: 3 - waterConsumption: 0.60 - chemicals: - Ultravasculine: - Min: 1 - Max: 20 - PotencyDivisor: 5 - Epinephrine: - Min: 1 - Max: 20 - PotencyDivisor: 5 - -- type: seed - id: ambrosiaVulgaris - name: seeds-ambrosiavulgaris-name - noun: seeds-noun-seeds - displayName: seeds-ambrosiavulgaris-display-name - plantRsi: Objects/Specific/Hydroponics/ambrosia_vulgaris.rsi - packetPrototype: AmbrosiaVulgarisSeeds - productPrototypes: - - FoodAmbrosiaVulgaris - lifespan: 25 - maturation: 10 - production: 3 - yield: 3 - potency: 10 - growthStages: 6 - waterConsumption: 0.60 - chemicals: - Nutriment: - Min: 1 - Max: 2 - PotencyDivisor: 10 - Bicaridine: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Kelotane: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Vitamin: - Min: 1 - Max: 2 - PotencyDivisor: 50 - -- type: seed - id: ambrosiaDeus - name: seeds-ambrosiadeus-name - noun: seeds-noun-seeds - displayName: seeds-ambrosiadeus-display-name - plantRsi: Objects/Specific/Hydroponics/ambrosia_deus.rsi - packetPrototype: AmbrosiaDeusSeeds - productPrototypes: - - FoodAmbrosiaVulgaris - lifespan: 25 - maturation: 10 - production: 3 - yield: 3 - potency: 10 - growthStages: 6 - waterConsumption: 0.60 - chemicals: - Nutriment: - Min: 1 - Max: 2 - PotencyDivisor: 10 - Omnizine: # Don't kill me - Min: 1 - Max: 3 - PotencyDivisor: 35 - SpaceDrugs: - Min: 1 - Max: 5 - PotencyDivisor: 20 - -- type: seed - id: galaxythistle - name: seeds-galaxythistle-name - noun: seeds-noun-seeds - displayName: seeds-galaxythistle-display-name - plantRsi: Objects/Specific/Hydroponics/galaxythistle.rsi - packetPrototype: GalaxythistleSeeds - productPrototypes: - - FoodGalaxythistle - lifespan: 25 - maturation: 10 - production: 3 - yield: 3 - potency: 10 - growthStages: 3 - waterConsumption: 0.60 - chemicals: - Stellibinin: - Min: 1 - Max: 25 - PotencyDivisor: 4 - -- type: seed - id: glasstle - name: seeds-glasstle-name - noun: seeds-noun-seeds - displayName: seeds-glasstle-display-name - plantRsi: Objects/Specific/Hydroponics/glasstle.rsi - packetPrototype: GlasstleSeeds - productPrototypes: - - FoodGlasstle - lifespan: 25 - maturation: 10 - production: 3 - yield: 1 - potency: 10 - growthStages: 3 - waterConsumption: 0.5 - chemicals: - Razorium: - Min: 1 - Max: 25 - PotencyDivisor: 4 - Desoxyephedrine: # meff!! - Min: 1 - Max: 10 - PotencyDivisor: 10 - -- type: seed - id: flyAmanita - name: seeds-flyamanita-name - noun: seeds-noun-spores - displayName: seeds-flyamanita-display-name - plantRsi: Objects/Specific/Hydroponics/fly_amanita.rsi - packetPrototype: FlyAmanitaSeeds - productPrototypes: - - FoodFlyAmanita - lifespan: 25 - maturation: 12 - production: 3 - yield: 3 - potency: 10 - growthStages: 2 - waterConsumption: 0.60 - nutrientConsumption: 0.50 - chemicals: - Amatoxin: - Min: 1 - Max: 10 - PotencyDivisor: 12 - Nutriment: ## yumby :) - Min: 1 - Max: 5 - PotencyDivisor: 20 - -- type: seed - id: gatfruit - name: seeds-gatfruit-name - noun: seeds-noun-seeds - displayName: seeds-gatfruit-display-name - plantRsi: Objects/Specific/Hydroponics/gatfruit.rsi - packetPrototype: GatfruitSeeds - productPrototypes: - - FoodGatfruit - # mutationPrototypes: - # - fakeCapfruit - # - realCapfruit - lifespan: 65 - maturation: 25 - production: 25 - yield: 1 - potency: 10 - growthStages: 2 - idealLight: 6 - chemicals: - Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Sulfur: - Min: 1 - Max: 5 - PotencyDivisor: 20 - -- type: seed - id: fakeCapfruit - name: seeds-capfruit-name - noun: seeds-noun-seeds - displayName: seeds-capfruit-display-name - plantRsi: Objects/Specific/Hydroponics/capfruit.rsi - packetPrototype: FakeCapfruitSeeds - productPrototypes: - - FoodFakeCapfruit - lifespan: 65 - maturation: 25 - production: 25 - yield: 1 - potency: 10 - growthStages: 2 - idealLight: 6 - chemicals: - Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Sulfur: - Min: 1 - Max: 5 - PotencyDivisor: 20 - -- type: seed - id: realCapfruit - name: seeds-capfruit-name - noun: seeds-noun-seeds - displayName: seeds-capfruit-display-name - plantRsi: Objects/Specific/Hydroponics/capfruit.rsi - packetPrototype: RealCapfruitSeeds - productPrototypes: - - FoodRealCapfruit - lifespan: 65 - maturation: 25 - production: 25 - yield: 1 - potency: 10 - growthStages: 2 - idealLight: 6 - chemicals: - Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Sulfur: - Min: 1 - Max: 5 - PotencyDivisor: 20 - -- type: seed - id: rice - name: seeds-rice-name - noun: seeds-noun-seeds - displayName: seeds-rice-display-name - plantRsi: Objects/Specific/Hydroponics/rice.rsi - packetPrototype: RiceSeeds - productPrototypes: - - RiceBushel - lifespan: 25 - maturation: 6 - production: 3 - yield: 3 - potency: 5 - growthStages: 4 - idealLight: 5 - nutrientConsumption: 0.40 - waterConsumption: 0.60 - chemicals: - Nutriment: - Min: 1 - Max: 20 - PotencyDivisor: 20 - Rice: - Min: 5 - Max: 20 - PotencyDivisor: 20 - -- type: seed - id: soybeans - name: seeds-soybeans-name - noun: seeds-noun-seeds - displayName: seeds-soybeans-display-name - plantRsi: Objects/Specific/Hydroponics/soybeans.rsi - packetPrototype: SoybeanSeeds - productPrototypes: - - FoodSoybeans - mutationPrototypes: - - koibean - growthStages: 4 - lifespan: 25 - maturation: 6 - production: 6 - yield: 3 - potency: 5 - idealLight: 7 - nutrientConsumption: 0.40 - chemicals: - Nutriment: - Min: 1 - Max: 2 - PotencyDivisor: 50 - -- type: seed - id: spacemansTrumpet - name: seeds-spacemans-trumpet-name - noun: seeds-noun-seeds - displayName: seeds-spacemans-trumpet-display-name - plantRsi: Objects/Specific/Hydroponics/spacemans_trumpet.rsi - packetPrototype: SpacemansTrumpetSeeds - productPrototypes: - - FoodSpacemansTrumpet - growthStages: 4 - lifespan: 20 - maturation: 14 - production: 3 - yield: 2 - potency: 10 - waterConsumption: 0.60 - chemicals: - Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 50 - PolypyryliumOligomers: - Min: 1 - Max: 15 - PotencyDivisor: 5 - -- type: seed - id: koibean - name: seeds-koibean-name - noun: seeds-noun-seeds - displayName: seeds-koibean-display-name - plantRsi: Objects/Specific/Hydroponics/koibean.rsi - packetPrototype: KoibeanSeeds - productPrototypes: - - FoodKoibean - growthStages: 4 - lifespan: 25 - maturation: 6 - production: 6 - yield: 3 - potency: 5 - idealLight: 7 - nutrientConsumption: 0.40 - chemicals: - Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 20 - CarpoToxin: - Min: 1 - Max: 4 - PotencyDivisor: 30 - -- type: seed - id: grape - name: seeds-grape-name - noun: seeds-noun-seeds - displayName: seeds-grape-display-name - plantRsi: Objects/Specific/Hydroponics/grape.rsi - packetPrototype: GrapeSeeds - productPrototypes: - - FoodGrape - lifespan: 50 - maturation: 6 - production: 5 - yield: 3 - potency: 10 - growthStages: 2 - chemicals: - Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed - id: watermelon - name: seeds-watermelon-name - noun: seeds-noun-seeds - displayName: seeds-watermelon-display-name - plantRsi: Objects/Specific/Hydroponics/watermelon.rsi - packetPrototype: WatermelonSeeds - productPrototypes: - - FoodWatermelon - mutationPrototypes: - - holymelon - lifespan: 55 - maturation: 12 - production: 3 - yield: 1 - potency: 1 - idealLight: 8 - chemicals: - Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Water: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Vitamin: - Min: 1 - Max: 5 - PotencyDivisor: 20 - -- type: seed - id: holymelon - name: seeds-holymelon-name - noun: seeds-noun-seeds - displayName: seeds-holymelon-display-name - plantRsi: Objects/Specific/Hydroponics/holymelon.rsi - packetPrototype: HolymelonSeeds - productPrototypes: - - FoodHolymelon - lifespan: 55 - maturation: 12 - production: 3 - yield: 1 - potency: 1 - idealLight: 8 - chemicals: - Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Holywater: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Vitamin: - Min: 1 - Max: 5 - PotencyDivisor: 20 - -- type: seed - id: cocoa - name: seeds-cocoa-name - noun: seeds-noun-seeds - displayName: seeds-cocoa-display-name - plantRsi: Objects/Specific/Hydroponics/cocoa.rsi - packetPrototype: CocoaSeeds - productPrototypes: - - FoodCocoaPod - harvestRepeat: Repeat - lifespan: 50 - maturation: 6 - production: 6 - yield: 6 - idealLight: 7 - waterConsumption: 1 - nutrientConsumption: 0.8 - idealHeat: 298 - chemicals: - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - Nutriment: - Min: 1 - Max: 2 - PotencyDivisor: 50 - -- type: seed - id: berries - name: seeds-berries-name - noun: seeds-noun-seeds - displayName: seeds-berries-display-name - plantRsi: Objects/Specific/Hydroponics/berries.rsi - packetPrototype: BerrySeeds - productPrototypes: - - FoodBerries - harvestRepeat: Repeat - lifespan: 50 - maturation: 6 - production: 6 - yield: 4 - idealLight: 7 - nutrientConsumption: 0.6 - chemicals: - Nutriment: - Min: 2 - Max: 5 - PotencyDivisor: 30 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 40 - -- type: seed - id: bungo - name: seeds-bungo-name - noun: seeds-noun-seeds - displayName: seeds-bungo-display-name - plantRsi: Objects/Specific/Hydroponics/bungo.rsi - packetPrototype: BungoSeeds - productPrototypes: - - FoodBungo - harvestRepeat: Repeat - lifespan: 50 - maturation: 8 - production: 6 - potency: 10 - yield: 3 - idealLight: 8 - idealHeat: 298 - growthStages: 4 - waterConsumption: 0.6 - chemicals: - Nutriment: - Min: 5 - Max: 10 - PotencyDivisor: 20 - Enzyme: - Min: 5 - Max: 10 - PotencyDivisor: 20 - -- type: seed - id: pea - name: seeds-pea-name - noun: seeds-noun-seeds - displayName: seeds-pea-display-name - plantRsi: Objects/Specific/Hydroponics/pea.rsi - packetPrototype: PeaSeeds - productPrototypes: - - FoodPeaPod - mutationPrototypes: - - laughinPea - lifespan: 25 - growthStages: 3 - maturation: 8 - production: 6 - yield: 3 - potency: 25 - idealLight: 8 - harvestRepeat: Repeat - nutrientConsumption: 0.5 - waterConsumption: 0.5 - chemicals: - Nutriment: - Min: 1 - Max: 3 - PotencyDivisor: 33 - Vitamin: - Min: 1 - Max: 2 - PotencyDivisor: 50 - -- type: seed - id: worldPea - name: seeds-worldpea-name - noun: seeds-noun-seeds - displayName: seeds-worldpea-display-name - plantRsi: Objects/Specific/Hydroponics/world_pea.rsi - packetPrototype: PeaSeeds - productPrototypes: - - FoodWorldPeas - lifespan: 25 - growthStages: 3 - maturation: 20 - production: 6 - yield: 3 - potency: 25 - idealLight: 8 - harvestRepeat: Repeat - nutrientConsumption: 0.5 - waterConsumption: 0.5 - chemicals: - Happiness: - Min: 1 - Max: 3 - PotencyDivisor: 25 - Nutriment: - Min: 1 - Max: 3 - PotencyDivisor: 20 - Pax: - Min: 1 - Max: 2 - PotencyDivisor: 50 - -- type: seed - id: pumpkin - name: seeds-pumpkin-name - noun: seeds-noun-seeds - displayName: seeds-pumpkin-display-name - plantRsi: Objects/Specific/Hydroponics/pumpkin.rsi - packetPrototype: PumpkinSeeds - productPrototypes: - - FoodPumpkin - mutationPrototypes: - - bluePumpkin - lifespan: 55 - maturation: 10 - production: 4 - yield: 2 - potency: 10 - idealHeat: 288 - growthStages: 3 - chemicals: - PumpkinFlesh: - Min: 1 - Max: 20 - PotencyDivisor: 5 - Vitamin: - Min: 1 - Max: 5 - PotencyDivisor: 20 - -- type: seed - id: bluePumpkin - name: seeds-blue-pumpkin-name - noun: seeds-noun-seeds - displayName: seeds-blue-pumpkin-display-name - plantRsi: Objects/Specific/Hydroponics/blue_pumpkin.rsi - packetPrototype: BluePumpkinSeeds - productPrototypes: - - FoodBluePumpkin - lifespan: 55 - maturation: 10 - production: 4 - yield: 2 - potency: 10 - idealHeat: 288 - growthStages: 3 - chemicals: - Ammonia: - Min: 1 - Max: 15 - PotencyDivisor: 3 - Chlorine: - Min: 1 - Max: 5 - PotencyDivisor: 5 - Vitamin: - Min: 1 - Max: 10 - PotencyDivisor: 3 - -- type: seed - id: cotton - name: seeds-cotton-name - noun: seeds-noun-seeds - displayName: seeds-cotton-display-name - plantRsi: Objects/Specific/Hydroponics/cotton.rsi - packetPrototype: CottonSeeds - productPrototypes: - - CottonBol - mutationPrototypes: - - pyrotton - lifespan: 25 - maturation: 8 - production: 3 - yield: 3 - potency: 5 - idealLight: 8 - growthStages: 3 - waterConsumption: 0.60 - chemicals: - Fiber: - Min: 5 - Max: 10 - PotencyDivisor: 20 - -- type: seed - id: pyrotton - name: seeds-pyrotton-name - noun: seeds-noun-seeds - displayName: seeds-pyrotton-display-name - plantRsi: Objects/Specific/Hydroponics/pyrotton.rsi - packetPrototype: PyrottonSeeds - productPrototypes: - - PyrottonBol - lifespan: 25 - maturation: 8 - production: 3 - yield: 2 - potency: 5 - idealLight: 8 - growthStages: 3 - waterConsumption: 0.80 - chemicals: - Fiber: - Min: 5 - Max: 10 - PotencyDivisor: 20 - Phlogiston: - Min: 4 - Max: 8 - PotencyDivisor: 30 - -- type: seed - id: cherry - name: seeds-cherry-name - noun: seeds-noun-seeds - displayName: seeds-cherry-display-name - plantRsi: Objects/Specific/Hydroponics/cherry.rsi - packetPrototype: CherrySeeds - productPrototypes: - - FoodCherry - harvestRepeat: Repeat - lifespan: 55 - maturation: 6 - production: 6 - yield: 5 - potency: 10 - idealLight: 6 - chemicals: - Nutriment: - Min: 1 - Max: 3 - PotencyDivisor: 30 - Vitamin: - Min: 1 - Max: 3 - PotencyDivisor: 40 - -- type: seed - id: anomalyBerry - name: seeds-anomaly-berry-name - noun: seeds-noun-seeds - displayName: seeds-anomaly-berry-display-name - plantRsi: Objects/Specific/Hydroponics/anomaly_berry.rsi - packetPrototype: AnomalyBerrySeeds - productPrototypes: - - FoodAnomalyBerry - lifespan: 25 - maturation: 12 - production: 3 - yield: 3 - potency: 10 - growthStages: 2 - waterConsumption: 0.60 - nutrientConsumption: 0.50 - chemicals: - Artifexium: - Min: 1 - Max: 1 - PotencyDivisor: 4 - Nutriment: - Min: 1 - Max: 2 - PotencyDivisor: 30 - Vitamin: - Min: 1 - Max: 2 - PotencyDivisor: 40 - -- type: seed - id: bloonion - name: seeds-bloonion-name - noun: seeds-noun-seeds - displayName: seeds-bloonion-display-name - plantRsi: Objects/Specific/Hydroponics/bloonion.rsi - packetPrototype: BloonionSeeds - productPrototypes: - - FoodBloonion - lifespan: 25 - maturation: 15 - production: 3 - yield: 3 - potency: 10 - growthStages: 4 - waterConsumption: 0.60 - nutrientConsumption: 0.50 - chemicals: - Potassium: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Phosphorus: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Sugar: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Allicin: - Min: 1 - Max: 10 - PotencyDivisor: 10 From a959b4fcca3364772f615e21986c2ba79c1cba8c Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 30 Jun 2026 19:43:23 -0500 Subject: [PATCH 24/61] Fix nutrient ID capitilization --- .../Botany/Systems/PlantHolderSystem.cs | 2 +- .../Prototypes/Hydroponics/nutrients.yml | 38 +++++++++---------- .../Reagents/Consumable/Drink/alcohol.yml | 6 +-- .../Reagents/Consumable/Drink/base_drink.yml | 10 ++--- .../Reagents/Consumable/Drink/drinks.yml | 6 +-- .../Reagents/Consumable/Food/condiments.yml | 12 +++--- .../Reagents/Consumable/Food/food.yml | 10 ++--- .../Reagents/Consumable/Food/ingredients.yml | 8 ++-- Resources/Prototypes/Reagents/biological.yml | 10 ++--- Resources/Prototypes/Reagents/botany.yml | 22 +++++------ Resources/Prototypes/Reagents/chemicals.yml | 4 +- Resources/Prototypes/Reagents/elements.yml | 28 +++++++------- Resources/Prototypes/Reagents/fun.yml | 2 +- Resources/Prototypes/Reagents/gases.yml | 14 +++---- Resources/Prototypes/Reagents/medicine.yml | 10 ++--- Resources/Prototypes/Reagents/narcotics.yml | 2 +- Resources/Prototypes/Reagents/toxins.yml | 24 ++++++------ 17 files changed, 104 insertions(+), 104 deletions(-) diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index fa04639946f..38c0cd8c879 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -394,7 +394,7 @@ private void OnInteractUsing(Entity entity, ref InteractUs if (seed != null) { var nutrientBonus = seed.Potency / 2.5f; - AdjustNutrient(uid, nutrientBonus, "nutrient", component); + AdjustNutrient(uid, nutrientBonus, "Nutrient", component); } QueueDel(args.Used); } diff --git a/Resources/Prototypes/Hydroponics/nutrients.yml b/Resources/Prototypes/Hydroponics/nutrients.yml index 3b7d91affaa..180cdd6c7d8 100644 --- a/Resources/Prototypes/Hydroponics/nutrients.yml +++ b/Resources/Prototypes/Hydroponics/nutrients.yml @@ -1,113 +1,113 @@ - type: plantNutrient - id: nutrient + id: Nutrient name: nutrient-name-nutrient desc: nutrient-desc-nutrient color: "orange" - type: plantNutrient - id: water + id: Water name: nutrient-name-water desc: nutrient-desc-water color: "cyan" - type: plantNutrient - id: fertilizer + id: Fertilizer name: nutrient-name-fertilizer desc: nutrient-desc-fertilizer color: "#3e901c" - type: plantNutrient - id: sugar + id: Sugar name: nutrient-name-sugar desc: nutrient-desc-sugar color: "white" - type: plantNutrient - id: protein + id: Protein name: nutrient-name-protein desc: nutrient-desc-protein color: "#FFFFE5" - type: plantNutrient - id: alcohol + id: Alcohol name: nutrient-name-alcohol desc: nutrient-desc-alcohol color: "#b05b3c" - type: plantNutrient - id: toxin + id: Toxin name: nutrient-name-toxin desc: nutrient-desc-toxin color: "#cf3600" - type: plantNutrient - id: pest + id: Pest name: nutrient-name-pest desc: nutrient-desc-pest color: "black" - type: plantNutrient - id: radiation + id: Radiation name: nutrient-name-radiation desc: nutrient-desc-radiation color: "#00ff04" - type: plantNutrient - id: acid + id: Acid name: nutrient-name-acid desc: nutrient-desc-acid color: "#BF8C00" - type: plantNutrient - id: carbon + id: Carbon name: nutrient-name-carbon desc: nutrient-desc-carbon color: "#22282b" - type: plantNutrient - id: iron + id: Iron name: nutrient-name-iron desc: nutrient-desc-iron color: "#434b4d" - type: plantNutrient - id: gold + id: Gold name: nutrient-name-gold desc: nutrient-desc-gold color: "#F7C430" - type: plantNutrient - id: silver + id: Silver name: nutrient-name-silver desc: nutrient-desc-silver color: "#d0d0d0" - type: plantNutrient - id: titanium + id: Titanium name: nutrient-name-titanium desc: nutrient-desc-titanium color: "#d0d0d0" - type: plantNutrient - id: clown + id: Clown name: nutrient-name-clown desc: nutrient-desc-clown color: "#FF4DD2" - type: plantNutrient - id: plasma + id: Plasma name: nutrient-name-plasma desc: nutrient-desc-plasma color: "#7e009e" - type: plantNutrient - id: carbonDioxide + id: CarbonDioxide name: nutrient-name-carbonDioxide desc: nutrient-desc-carbonDioxide color: "#66ff33" - type: plantNutrient - id: frezon + id: Frezon name: nutrient-name-frezon desc: nutrient-desc-frezon color: "#3a758c" diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml index 6180f1b79d8..0e673145542 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml @@ -145,7 +145,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: alcohol + nutrient: Alcohol metabolisms: Metabolites: metabolismRate: 0.05 @@ -2470,10 +2470,10 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 2 - nutrient: alcohol + nutrient: Alcohol - !type:PlantAdjustNutrient amount: 0.25 - nutrient: toxin + nutrient: Toxin metabolisms: Digestion: metabolites: diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/base_drink.yml b/Resources/Prototypes/Reagents/Consumable/Drink/base_drink.yml index acfff63060b..3f0f3691bde 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/base_drink.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/base_drink.yml @@ -17,7 +17,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: water + nutrient: Water tileReactions: - !type:ExtinguishTileReaction { } - !type:SpillIfPuddlePresentTileReaction { } @@ -34,10 +34,10 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 0.1 - nutrient: sugar + nutrient: Sugar - !type:PlantAdjustNutrient amount: 0.1 - nutrient: water + nutrient: Water - !type:PlantAdjustHealth amount: -0.1 footstepSound: @@ -69,10 +69,10 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 0.25 - nutrient: alcohol + nutrient: Alcohol - !type:PlantAdjustNutrient amount: 0.7 - nutrient: water + nutrient: Water - type: reagent id: BaseJuice diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml b/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml index f439638809b..36781c387ee 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml @@ -275,10 +275,10 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 0.1 - nutrient: protein + nutrient: Protein - !type:PlantAdjustNutrient amount: 0.9 - nutrient: water + nutrient: Water metabolisms: Digestion: effects: @@ -507,7 +507,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: water # The internet tells me I should avoid watering plants with ice, but mostly because of temperature, so this value being the same as water should probably be fine? + nutrient: Water # The internet tells me I should avoid watering plants with ice, but mostly because of temperature, so this value being the same as water should probably be fine? metamorphicSprite: sprite: Objects/Consumable/Drinks/iceglass.rsi state: icon_empty diff --git a/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml b/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml index 07577483d18..4951ff4d317 100644 --- a/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml +++ b/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml @@ -148,16 +148,16 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: -3 - nutrient: water + nutrient: Water - !type:PlantAdjustNutrient amount: -0.3 - nutrient: nutrient + nutrient: Nutrient - !type:PlantAdjustNutrient amount: 0.8 - nutrient: toxin + nutrient: Toxin - !type:PlantAdjustNutrient amount: -1 - nutrient: pest + nutrient: Pest - !type:PlantAdjustWeeds amount: -2 - !type:PlantAdjustHealth @@ -184,10 +184,10 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 2 - nutrient: sugar + nutrient: Sugar - !type:PlantAdjustNutrient amount: 2 - nutrient: pest + nutrient: Pest metabolisms: Digestion: # 12 diona blood for 1 unit of syrup, this stuff better be worthwhile. diff --git a/Resources/Prototypes/Reagents/Consumable/Food/food.yml b/Resources/Prototypes/Reagents/Consumable/Food/food.yml index d968d0717e6..a593ce5e4db 100644 --- a/Resources/Prototypes/Reagents/Consumable/Food/food.yml +++ b/Resources/Prototypes/Reagents/Consumable/Food/food.yml @@ -14,7 +14,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1.5 - nutrient: nutrient + nutrient: Nutrient - !type:PlantAdjustHealth amount: 0.75 pricePerUnit: 2 @@ -43,7 +43,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 0.5 - nutrient: pest + nutrient: Pest - !type:PlantAdjustHealth amount: 1.5 pricePerUnit: 2.5 @@ -69,7 +69,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: protein + nutrient: Protein pricePerUnit: 3 - type: reagent @@ -106,12 +106,12 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: sugar + nutrient: Sugar - !type:PlantAdjustWeeds amount: 2 - !type:PlantAdjustNutrient amount: 2 - nutrient: pest + nutrient: Pest metamorphicSprite: sprite: Objects/Consumable/Drinks/sugarglass.rsi state: icon_empty diff --git a/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml b/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml index 4249660788a..24d28265075 100644 --- a/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml +++ b/Resources/Prototypes/Reagents/Consumable/Food/ingredients.yml @@ -67,7 +67,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: protein + nutrient: Protein metabolisms: Digestion: metabolites: @@ -85,7 +85,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 2 - nutrient: protein + nutrient: Protein metabolisms: Digestion: metabolites: @@ -240,10 +240,10 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 0.1 - nutrient: nutrient + nutrient: Nutrient - !type:PlantAdjustNutrient amount: 2 - nutrient: pest + nutrient: Pest - !type:PlantAdjustWeeds amount: 2 diff --git a/Resources/Prototypes/Reagents/biological.yml b/Resources/Prototypes/Reagents/biological.yml index d6bd8799807..7fbfa15bbd0 100644 --- a/Resources/Prototypes/Reagents/biological.yml +++ b/Resources/Prototypes/Reagents/biological.yml @@ -41,10 +41,10 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: water + nutrient: Water - !type:PlantAdjustNutrient amount: 0.2 - nutrient: protein + nutrient: Protein footstepSound: collection: FootstepBlood params: @@ -117,10 +117,10 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 0.9 - nutrient: water + nutrient: Water - !type:PlantAdjustNutrient amount: 0.1 - nutrient: sugar + nutrient: Sugar footstepSound: collection: FootstepSlime params: @@ -214,7 +214,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 0.5 - nutrient: water + nutrient: Water footstepSound: collection: FootstepBlood params: diff --git a/Resources/Prototypes/Reagents/botany.yml b/Resources/Prototypes/Reagents/botany.yml index c6da4bcdda1..0f8de751ea4 100644 --- a/Resources/Prototypes/Reagents/botany.yml +++ b/Resources/Prototypes/Reagents/botany.yml @@ -9,7 +9,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 2 - nutrient: nutrient + nutrient: Nutrient metabolisms: Digestion: effects: @@ -29,7 +29,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: nutrient + nutrient: Nutrient - !type:PlantAdjustHealth amount: -0.5 - !type:PlantAdjustMutationMod @@ -61,10 +61,10 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 0.4 - nutrient: toxin + nutrient: Toxin - !type:PlantAdjustNutrient amount: -6 - nutrient: pest + nutrient: Pest metabolisms: Bloodstream: effects: @@ -87,7 +87,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 0.6 - nutrient: toxin + nutrient: Toxin - !type:PlantAdjustWeeds amount: -8 - !type:PlantAdjustHealth @@ -119,14 +119,14 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: fertilizer + nutrient: Fertilizer - !type:PlantAdjustWeeds probability: 0.025 amount: 1 - !type:PlantAdjustNutrient probability: 0.025 amount: 1 - nutrient: pest + nutrient: Pest metabolisms: Bloodstream: effects: @@ -188,7 +188,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 0.4 - nutrient: toxin + nutrient: Toxin - !type:PlantAdjustWeeds amount: -6 metabolisms: @@ -215,7 +215,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 0.1 - nutrient: nutrient + nutrient: Nutrient - !type:PlantAdjustHealth amount: 0.5 metabolisms: @@ -298,11 +298,11 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 0.1 - nutrient: nutrient + nutrient: Nutrient - !type:PlantAdjustNutrient probability: 0.1 amount: -1 - nutrient: pest + nutrient: Pest - !type:PlantAdjustHealth amount: 0.1 - !type:PlantAffectGrowth diff --git a/Resources/Prototypes/Reagents/chemicals.yml b/Resources/Prototypes/Reagents/chemicals.yml index 4e6e69fcd86..24b9d2adeb7 100644 --- a/Resources/Prototypes/Reagents/chemicals.yml +++ b/Resources/Prototypes/Reagents/chemicals.yml @@ -37,10 +37,10 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: -0.5 - nutrient: toxin + nutrient: Toxin - !type:PlantAdjustNutrient amount: 0.5 - nutrient: carbon + nutrient: Carbon metabolisms: Bloodstream: effects: diff --git a/Resources/Prototypes/Reagents/elements.yml b/Resources/Prototypes/Reagents/elements.yml index cfaed15df50..fb0aa778a0b 100644 --- a/Resources/Prototypes/Reagents/elements.yml +++ b/Resources/Prototypes/Reagents/elements.yml @@ -22,7 +22,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: carbon + nutrient: Carbon - type: reagent id: Chlorine @@ -37,10 +37,10 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: -0.5 - nutrient: water + nutrient: Water - !type:PlantAdjustNutrient amount: 1.5 - nutrient: toxin + nutrient: Toxin - !type:PlantAdjustWeeds amount: -3 - !type:PlantAdjustHealth @@ -106,10 +106,10 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: -0.5 - nutrient: water + nutrient: Water - !type:PlantAdjustNutrient amount: 2.5 - nutrient: toxin + nutrient: Toxin - !type:PlantAdjustWeeds amount: -4 - !type:PlantAdjustHealth @@ -149,7 +149,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: gold + nutrient: Gold - type: reagent id: Hydrogen @@ -216,7 +216,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: iron + nutrient: Iron - type: reagent id: Lithium @@ -290,7 +290,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 0.1 - nutrient: fertilizer + nutrient: Fertilizer - type: reagent id: Titanium @@ -313,10 +313,10 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: titanium + nutrient: Titanium - !type:PlantAdjustNutrient amount: -0.5 - nutrient: water + nutrient: Water - !type:PlantAdjustWeeds amount: -2 @@ -344,10 +344,10 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 0.5 - nutrient: clown + nutrient: Clown - !type:PlantAdjustNutrient amount: 0.5 - nutrient: nutrient + nutrient: Nutrient - type: reagent id: Radium @@ -392,7 +392,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: silver + nutrient: Silver - type: reagent id: Tin @@ -449,7 +449,7 @@ amount: 0.6 - !type:PlantAdjustNutrient amount: 1 - nutrient: radiation + nutrient: Radiation - !type:PlantAdjustMutationMod probability: 0.2 amount: 0.1 diff --git a/Resources/Prototypes/Reagents/fun.yml b/Resources/Prototypes/Reagents/fun.yml index 8fa5fc74359..5ad7bc2ed0f 100644 --- a/Resources/Prototypes/Reagents/fun.yml +++ b/Resources/Prototypes/Reagents/fun.yml @@ -316,7 +316,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 0.1 - nutrient: clown + nutrient: Clown metabolisms: Bloodstream: effects: diff --git a/Resources/Prototypes/Reagents/gases.yml b/Resources/Prototypes/Reagents/gases.yml index f0018fa608e..d19f3563357 100644 --- a/Resources/Prototypes/Reagents/gases.yml +++ b/Resources/Prototypes/Reagents/gases.yml @@ -90,11 +90,11 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: plasma + nutrient: Plasma # plantRespiration: # - !type:PlantAdjustNutrient # amount: 1 -# nutrient: plasma +# nutrient: Plasma metabolisms: Bloodstream: effects: @@ -146,7 +146,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1.5 - nutrient: radiation + nutrient: Radiation - !type:PlantAdjustMutationLevel amount: 1 # plantRespiration: @@ -187,11 +187,11 @@ plantMetabolism: - !type:PlantAdjustNutrient # TODO: Remove this when plant respiration is implemented amount: 0.05 - nutrient: carbonDioxide + nutrient: CarbonDioxide # plantRespiration: # - !type:PlantAdjustNutrient # amount: 1 - # nutrient: carbonDioxide + # nutrient: CarbonDioxide metabolisms: Bloodstream: effects: @@ -373,11 +373,11 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: frezon + nutrient: Frezon # plantRespiration: # - !type:PlantAdjustNutrient # amount: 1 - # nutrient: frezon + # nutrient: Frezon metabolisms: Bloodstream: effects: diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index 8693d9096d9..931b5dbb8be 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -69,7 +69,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: -1 - nutrient: toxin + nutrient: Toxin - !type:PlantAdjustHealth amount: 1 @@ -183,7 +183,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: -0.5 - nutrient: toxin + nutrient: Toxin - !type:PlantAdjustHealth amount: 5 - !type:PlantCryoxadone {} @@ -594,7 +594,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 0.6 - nutrient: toxin + nutrient: Toxin - !type:PlantPhalanximine minScale: 4 metabolisms: @@ -742,7 +742,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: -0.5 - nutrient: toxin + nutrient: Toxin metabolisms: Bloodstream: effects: @@ -1184,7 +1184,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: water + nutrient: Water tileReactions: - !type:ExtinguishTileReaction { } diff --git a/Resources/Prototypes/Reagents/narcotics.yml b/Resources/Prototypes/Reagents/narcotics.yml index 56c24f9e238..855bdaf88ab 100644 --- a/Resources/Prototypes/Reagents/narcotics.yml +++ b/Resources/Prototypes/Reagents/narcotics.yml @@ -221,7 +221,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: -5 - nutrient: nutrient + nutrient: Nutrient - !type:PlantAdjustHealth amount: -1 metabolisms: diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index c3860379807..53d27c48f02 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -10,7 +10,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: toxin + nutrient: Toxin metabolisms: Bloodstream: effects: @@ -34,13 +34,13 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: titanium + nutrient: Titanium - !type:PlantAdjustNutrient amount: 1 - nutrient: clown + nutrient: Clown - !type:PlantAdjustNutrient amount: 2 - nutrient: plasma + nutrient: Plasma metabolisms: Bloodstream: effects: @@ -78,7 +78,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: toxin + nutrient: Toxin metabolisms: Bloodstream: effects: @@ -178,7 +178,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 2 - nutrient: acid + nutrient: Acid - !type:PlantAdjustWeeds amount: -4 - !type:PlantAdjustHealth @@ -288,7 +288,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: acid + nutrient: Acid - !type:PlantAdjustWeeds amount: -2 reactiveEffects: @@ -362,7 +362,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: toxin + nutrient: Toxin - type: reagent id: Lexorin @@ -392,7 +392,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: toxin + nutrient: Toxin metabolisms: Bloodstream: effects: @@ -557,7 +557,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: protein + nutrient: Protein metabolisms: Bloodstream: effects: @@ -662,7 +662,7 @@ plantMetabolism: - !type:PlantAdjustNutrient amount: 1 - nutrient: clown + nutrient: Clown metabolisms: Bloodstream: metabolismRate: 0.05 @@ -733,7 +733,7 @@ randomPickBotanyReagent: EvilRandomFillSolution - !type:PlantAdjustNutrient amount: 1 - nutrient: toxin + nutrient: Toxin metabolisms: Bloodstream: effects: From 789692d352c9e84a2a286b3978f1be5939a21acd Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 30 Jun 2026 21:04:10 -0500 Subject: [PATCH 25/61] Convert root vegetables to the new nutrient system --- .../Hydroponics/Seeds/rootveggies.yml | 248 +++++++++++++----- 1 file changed, 179 insertions(+), 69 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/Seeds/rootveggies.yml b/Resources/Prototypes/Hydroponics/Seeds/rootveggies.yml index cdd7860c812..fadda489703 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/rootveggies.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/rootveggies.yml @@ -11,22 +11,43 @@ maturation: 10 production: 3 yield: 3 - potency: 10 growthStages: 3 - waterConsumption: 0.60 chemicals: JuiceCarrot: - Min: 1 - Max: 5 - PotencyDivisor: 20 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Nutrient: + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 Oculine: - Min: 2 - Max: 6 - PotencyDivisor: 20 + BaseAmount: 2 + Nutrient: + Requirement: 0.5 + BonusRequirement: 0.5 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.6 + BonusAmount: 3 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 - type: seed id: potato @@ -41,18 +62,32 @@ maturation: 10 production: 3 yield: 3 - potency: 10 growthStages: 4 - waterConsumption: 0.60 chemicals: Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 2 + Requirements: + Water: + Requirement: 2 + Fertilizer: + BonusRequirement: 0.8 + BonusAmount: 4 + CarbonDioxide: + BonusRequirement: 0.4 + BonusAmount: 4 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 - type: seed id: garlic @@ -67,21 +102,37 @@ maturation: 8 production: 5 yield: 3 - potency: 25 growthStages: 3 chemicals: Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 2 + Requirements: + Water: + Requirement: 1.5 + Fertilizer: + BonusRequirement: 0.8 + BonusAmount: 4 + CarbonDioxide: + BonusRequirement: 0.4 + BonusAmount: 4 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 2 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 Allicin: - Min: 1 - Max: 8 - PotencyDivisor: 25 + BaseAmount: 2 + Requirements: + Water: + Requirement: 0.5 - type: seed id: onion @@ -99,24 +150,39 @@ maturation: 8 production: 6 yield: 2 - potency: 20 growthStages: 3 idealLight: 8 - waterConsumption: 0.60 - idealHeat: 298 + baseIdealHeat: 298 chemicals: Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 2 + Requirements: + Water: + Requirement: 1.5 + Fertilizer: + BonusRequirement: 0.8 + BonusAmount: 4 + CarbonDioxide: + BonusRequirement: 0.4 + BonusAmount: 4 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 2 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 Allicin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 2 + Requirements: + Water: + Requirement: 0.5 - type: seed id: onionred @@ -131,24 +197,39 @@ maturation: 8 production: 6 yield: 2 - potency: 20 growthStages: 3 idealLight: 8 - waterConsumption: 0.60 - idealHeat: 298 + baseIdealHeat: 298 chemicals: Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 2 + Requirements: + Water: + Requirement: 1.5 + Fertilizer: + BonusRequirement: 0.8 + BonusAmount: 4 + CarbonDioxide: + BonusRequirement: 0.4 + BonusAmount: 4 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 2 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 Allicin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 2 + Requirements: + Water: + Requirement: 0.5 - type: seed id: bloonion @@ -163,24 +244,53 @@ maturation: 15 production: 3 yield: 3 - potency: 10 growthStages: 4 - waterConsumption: 0.60 - nutrientConsumption: 0.50 chemicals: - Potassium: - Min: 1 - Max: 5 - PotencyDivisor: 20 + Potassium: # Same requirements for all 3, to ensure all of the reagents are used in the smoke reaction. + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 1.5 + BonusAmount: 2 + Sugar: + BonusRequirement: 1 + BonusAmount: 1 Phosphorus: - Min: 1 - Max: 5 - PotencyDivisor: 20 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 1.5 + BonusAmount: 2 + Sugar: + BonusRequirement: 1 + BonusAmount: 1 Sugar: - Min: 1 - Max: 5 - PotencyDivisor: 20 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 1.5 + BonusAmount: 2 + Sugar: + BonusRequirement: 1 + BonusAmount: 1 Allicin: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 1 + Requirements: + Water: + Requirement: 0.5 + Nutrient: + BonusRequirement: 1 + BonusAmount: 4 + Fertilizer: + BonusRequirement: 0.5 + BonusAmount: 5 From 1a36e71f5204b932fa9df7392feae1771fcf6d75 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 30 Jun 2026 21:20:44 -0500 Subject: [PATCH 26/61] Soybeans moved to other.yml, Grains converted to new system --- .../Prototypes/Hydroponics/Seeds/grains.yml | 179 +++++++++++------- .../Prototypes/Hydroponics/Seeds/other.yml | 95 ++++++---- 2 files changed, 169 insertions(+), 105 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/Seeds/grains.yml b/Resources/Prototypes/Hydroponics/Seeds/grains.yml index dbef6cb5600..388c88aa151 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/grains.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/grains.yml @@ -13,18 +13,30 @@ maturation: 6 production: 3 yield: 3 - potency: 5 idealLight: 8 - nutrientConsumption: 0.40 chemicals: Nutriment: - Min: 1 - Max: 20 - PotencyDivisor: 20 - Flour: - Min: 5 - Max: 20 - PotencyDivisor: 20 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + Fertilizer: + BonusRequirement: 0.4 + BonusAmount: 2 + CarbonDioxide: + BonusRequirement: 0.2 + BonusAmount: 2 + Flour: #Should be better than using a bio-generator to make flour. + BaseAmount: 5 + Requirements: + Nutrient: + Requirement: 2.5 + Fertilizer: + BonusRequirement: 0.5 + BonusAmount: 2.5 + CarbonDioxide: + BonusRequirement: 0.25 + BonusAmount: 2.5 - type: seed id: meatwheat @@ -39,18 +51,32 @@ maturation: 6 production: 3 yield: 3 - potency: 5 idealLight: 8 - nutrientConsumption: 0.40 chemicals: Nutriment: - Min: 1 - Max: 20 - PotencyDivisor: 20 - UncookedAnimalProteins: - Min: 5 - Max: 20 - PotencyDivisor: 20 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + Fertilizer: + BonusRequirement: 0.4 + BonusAmount: 2 + CarbonDioxide: + BonusRequirement: 0.2 + BonusAmount: 2 + UncookedAnimalProteins: #Should be cheap to compete with bio-generated monkey cubes. + BaseAmount: 5 + Requirements: + Water: # Meat is wetter than flour + Requirement: 2 + Nutrient: + Requirement: 2.5 + Fertilizer: + BonusRequirement: 0.5 + BonusAmount: 2.5 + CarbonDioxide: + BonusRequirement: 0.25 + BonusAmount: 2.5 - type: seed id: oat @@ -65,18 +91,30 @@ maturation: 6 production: 3 yield: 3 - potency: 5 idealLight: 8 - nutrientConsumption: 0.40 chemicals: Nutriment: - Min: 1 - Max: 20 - PotencyDivisor: 20 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + Fertilizer: + BonusRequirement: 0.4 + BonusAmount: 2 + CarbonDioxide: + BonusRequirement: 0.2 + BonusAmount: 2 Oats: - Min: 5 - Max: 20 - PotencyDivisor: 20 + BaseAmount: 5 + Requirements: + Nutrient: + Requirement: 2.5 + Fertilizer: + BonusRequirement: 0.5 + BonusAmount: 2.5 + CarbonDioxide: + BonusRequirement: 0.25 + BonusAmount: 2.5 - type: seed id: corn @@ -91,20 +129,32 @@ maturation: 8 production: 6 yield: 2 - potency: 20 growthStages: 3 idealLight: 8 - waterConsumption: 0.60 - idealHeat: 298 + baseIdealHeat: 298 chemicals: Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 20 - Cornmeal: - Min: 5 - Max: 15 - PotencyDivisor: 10 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + Fertilizer: + BonusRequirement: 0.4 + BonusAmount: 2 + CarbonDioxide: + BonusRequirement: 0.2 + BonusAmount: 2 + CornMeal: + BaseAmount: 5 + Requirements: + Nutrient: + Requirement: 2.5 + Fertilizer: + BonusRequirement: 1 + BonusAmount: 5 + CarbonDioxide: + BonusRequirement: 0.5 + BonusAmount: 5 - type: seed id: rice @@ -119,42 +169,31 @@ maturation: 6 production: 3 yield: 3 - potency: 5 growthStages: 4 idealLight: 5 - nutrientConsumption: 0.40 - waterConsumption: 0.60 chemicals: Nutriment: - Min: 1 - Max: 20 - PotencyDivisor: 20 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + Fertilizer: + BonusRequirement: 0.4 + BonusAmount: 2 + CarbonDioxide: + BonusRequirement: 0.2 + BonusAmount: 2 Rice: - Min: 5 - Max: 20 - PotencyDivisor: 20 - -- type: seed - id: soybeans - name: seeds-soybeans-name - noun: seeds-noun-seeds - displayName: seeds-soybeans-display-name - plantRsi: Objects/Specific/Hydroponics/soybeans.rsi - packetPrototype: SoybeanSeeds - productPrototypes: - - FoodSoybeans - mutationPrototypes: - - koibean - growthStages: 4 - lifespan: 25 - maturation: 6 - production: 6 - yield: 3 - potency: 5 - idealLight: 7 - nutrientConsumption: 0.40 - chemicals: - Nutriment: - Min: 1 - Max: 2 - PotencyDivisor: 50 + BaseAmount: 5 + Requirements: + Water: + Requirement: 5 # Rice need a lot of water + Nutrient: + BonusRequirement: 0.5 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.4 + BonusAmount: 2 + CarbonDioxide: + BonusRequirement: 0.2 + BonusAmount: 2 diff --git a/Resources/Prototypes/Hydroponics/Seeds/other.yml b/Resources/Prototypes/Hydroponics/Seeds/other.yml index f53f97d83fa..dd4cf2d96b8 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/other.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/other.yml @@ -1,38 +1,3 @@ -- type: seed - id: laughinPea - name: seeds-laughin-pea-name - noun: seeds-noun-seeds - displayName: seeds-laughin-pea-display-name - plantRsi: Objects/Specific/Hydroponics/laughin_pea.rsi - packetPrototype: LaughinPeaSeeds - productPrototypes: - - FoodLaughinPeaPod - mutationPrototypes: - - worldPea - lifespan: 25 - growthStages: 3 - maturation: 7 - production: 5 - yield: 3 - potency: 20 - idealLight: 8 - harvestRepeat: Repeat - nutrientConsumption: 0.6 - waterConsumption: 0.6 - chemicals: - Nutriment: - Min: 1 - Max: 3 - PotencyDivisor: 7 - Sugar: - Min: 1 - Max: 10 - PotencyDivisor: 5 - Laughter: - Min: 1 - Max: 10 - PotencyDivisor: 5 - - type: seed id: sugarcane name: seeds-sugarcane-name @@ -100,6 +65,31 @@ Max: 12 PotencyDivisor: 10 +- type: seed + id: soybeans + name: seeds-soybeans-name + noun: seeds-noun-seeds + displayName: seeds-soybeans-display-name + plantRsi: Objects/Specific/Hydroponics/soybeans.rsi + packetPrototype: SoybeanSeeds + productPrototypes: + - FoodSoybeans + mutationPrototypes: + - koibean + growthStages: 4 + lifespan: 25 + maturation: 6 + production: 6 + yield: 3 + potency: 5 + idealLight: 7 + nutrientConsumption: 0.40 + chemicals: + Nutriment: + Min: 1 + Max: 2 + PotencyDivisor: 50 + - type: seed id: koibean name: seeds-koibean-name @@ -186,6 +176,41 @@ Max: 2 PotencyDivisor: 50 +- type: seed + id: laughinPea + name: seeds-laughin-pea-name + noun: seeds-noun-seeds + displayName: seeds-laughin-pea-display-name + plantRsi: Objects/Specific/Hydroponics/laughin_pea.rsi + packetPrototype: LaughinPeaSeeds + productPrototypes: + - FoodLaughinPeaPod + mutationPrototypes: + - worldPea + lifespan: 25 + growthStages: 3 + maturation: 7 + production: 5 + yield: 3 + potency: 20 + idealLight: 8 + harvestRepeat: Repeat + nutrientConsumption: 0.6 + waterConsumption: 0.6 + chemicals: + Nutriment: + Min: 1 + Max: 3 + PotencyDivisor: 7 + Sugar: + Min: 1 + Max: 10 + PotencyDivisor: 5 + Laughter: + Min: 1 + Max: 10 + PotencyDivisor: 5 + - type: seed id: worldPea name: seeds-worldpea-name From 0e1e1612c23d1f5f137eb4822b4e579db7d18d53 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 30 Jun 2026 22:05:37 -0500 Subject: [PATCH 27/61] Add comments to more easily see which seeds i have updated. --- .../Prototypes/Hydroponics/Seeds/flowers.yml | 10 ++-- .../Prototypes/Hydroponics/Seeds/fruit.yml | 58 +++++++++---------- .../Prototypes/Hydroponics/Seeds/fungus.yml | 10 ++-- .../Prototypes/Hydroponics/Seeds/leaves.yml | 20 +++---- .../Prototypes/Hydroponics/Seeds/other.yml | 22 +++---- 5 files changed, 60 insertions(+), 60 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/Seeds/flowers.yml b/Resources/Prototypes/Hydroponics/Seeds/flowers.yml index f8d15a9d34c..cbb6aa94925 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/flowers.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/flowers.yml @@ -1,4 +1,4 @@ -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: poppy name: seeds-poppy-name noun: seeds-noun-seeds @@ -26,7 +26,7 @@ Max: 20 PotencyDivisor: 5 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: lily name: seeds-lily-name noun: seeds-noun-seeds @@ -54,7 +54,7 @@ Max: 20 PotencyDivisor: 5 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: spacemansTrumpet name: seeds-spacemans-trumpet-name noun: seeds-noun-seeds @@ -80,7 +80,7 @@ Max: 15 PotencyDivisor: 5 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: galaxythistle name: seeds-galaxythistle-name noun: seeds-noun-seeds @@ -102,7 +102,7 @@ Max: 25 PotencyDivisor: 4 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: glasstle name: seeds-glasstle-name noun: seeds-noun-seeds diff --git a/Resources/Prototypes/Hydroponics/Seeds/fruit.yml b/Resources/Prototypes/Hydroponics/Seeds/fruit.yml index d76acf47934..0dadd8f0062 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/fruit.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/fruit.yml @@ -1,4 +1,4 @@ -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: banana name: seeds-banana-name noun: seeds-noun-seeds @@ -27,7 +27,7 @@ Max: 2 PotencyDivisor: 50 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: mimana name: seeds-mimana-name noun: seeds-noun-seeds @@ -54,7 +54,7 @@ Max: 2 PotencyDivisor: 50 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: lemon name: seeds-lemon-name noun: seeds-noun-seeds @@ -84,7 +84,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: lemoon name: seeds-lemoon-name noun: seeds-noun-seeds @@ -110,7 +110,7 @@ Max: 20 PotencyDivisor: 5 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: lime name: seeds-lime-name noun: seeds-noun-seeds @@ -139,7 +139,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: orange name: seeds-orange-name noun: seeds-noun-seeds @@ -169,7 +169,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: extradimensionalOrange name: seeds-extradimensionalorange-name noun: seeds-noun-seeds @@ -199,7 +199,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: pineapple name: seeds-pineapple-name noun: seeds-noun-seeds @@ -230,7 +230,7 @@ Max: 2 PotencyDivisor: 50 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: tomato name: seeds-tomato-name noun: seeds-noun-seeds @@ -267,7 +267,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: blueTomato name: seeds-bluetomato-name noun: seeds-noun-seeds @@ -301,7 +301,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: bloodTomato name: seeds-bloodtomato-name noun: seeds-noun-seeds @@ -333,7 +333,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: killerTomato name: seeds-killertomato-name noun: seeds-noun-seeds @@ -366,7 +366,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: eggplant name: seeds-eggplant-name noun: seeds-noun-seeds @@ -396,7 +396,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: apple name: seeds-apple-name noun: seeds-noun-seeds @@ -424,7 +424,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: goldenApple name: seeds-goldenapple-name noun: seeds-noun-seeds @@ -456,7 +456,7 @@ Max: 13 PotencyDivisor: 10 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: chili name: seeds-chili-name noun: seeds-noun-seeds @@ -489,7 +489,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: chilly name: seeds-chilly-name noun: seeds-noun-seeds @@ -520,7 +520,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: gatfruit name: seeds-gatfruit-name noun: seeds-noun-seeds @@ -549,7 +549,7 @@ Max: 5 PotencyDivisor: 20 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: fakeCapfruit name: seeds-capfruit-name noun: seeds-noun-seeds @@ -575,7 +575,7 @@ Max: 5 PotencyDivisor: 20 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: realCapfruit name: seeds-capfruit-name noun: seeds-noun-seeds @@ -601,7 +601,7 @@ Max: 5 PotencyDivisor: 20 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: grape name: seeds-grape-name noun: seeds-noun-seeds @@ -626,7 +626,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: watermelon name: seeds-watermelon-name noun: seeds-noun-seeds @@ -657,7 +657,7 @@ Max: 5 PotencyDivisor: 20 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: holymelon name: seeds-holymelon-name noun: seeds-noun-seeds @@ -686,7 +686,7 @@ Max: 5 PotencyDivisor: 20 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: berries name: seeds-berries-name noun: seeds-noun-seeds @@ -712,7 +712,7 @@ Max: 4 PotencyDivisor: 40 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: bungo name: seeds-bungo-name noun: seeds-noun-seeds @@ -741,7 +741,7 @@ Max: 10 PotencyDivisor: 20 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: pumpkin name: seeds-pumpkin-name noun: seeds-noun-seeds @@ -769,7 +769,7 @@ Max: 5 PotencyDivisor: 20 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: bluePumpkin name: seeds-blue-pumpkin-name noun: seeds-noun-seeds @@ -799,7 +799,7 @@ Max: 10 PotencyDivisor: 3 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: cherry name: seeds-cherry-name noun: seeds-noun-seeds @@ -825,7 +825,7 @@ Max: 3 PotencyDivisor: 40 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: anomalyBerry name: seeds-anomaly-berry-name noun: seeds-noun-seeds diff --git a/Resources/Prototypes/Hydroponics/Seeds/fungus.yml b/Resources/Prototypes/Hydroponics/Seeds/fungus.yml index 45950ba9bcd..b8c34bc48ac 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/fungus.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/fungus.yml @@ -1,4 +1,4 @@ -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: towercap name: seeds-towercap-name noun: seeds-noun-spores @@ -19,7 +19,7 @@ lightTolerance: 6 idealHeat: 288 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: steelcap name: seeds-steelcap-name noun: seeds-noun-spores @@ -40,7 +40,7 @@ lightTolerance: 6 idealHeat: 288 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: chanterelle name: seeds-chanterelle-name noun: seeds-noun-spores @@ -65,7 +65,7 @@ Max: 25 PotencyDivisor: 25 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: lingzhi name: seeds-lingzhi-name noun: seeds-noun-spores @@ -91,7 +91,7 @@ Max: 20 PotencyDivisor: 5 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: flyAmanita name: seeds-flyamanita-name noun: seeds-noun-spores diff --git a/Resources/Prototypes/Hydroponics/Seeds/leaves.yml b/Resources/Prototypes/Hydroponics/Seeds/leaves.yml index ce42114e203..9d32e0d100b 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/leaves.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/leaves.yml @@ -1,4 +1,4 @@ -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: teaPlant name: seeds-teaplant-name noun: seeds-noun-seeds @@ -23,7 +23,7 @@ Max: 5 PotencyDivisor: 20 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: cabbage name: seeds-cabbage-name noun: seeds-noun-seeds @@ -48,7 +48,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: cannabis name: seeds-cannabis-name noun: seeds-noun-seeds @@ -75,7 +75,7 @@ Max: 10 PotencyDivisor: 10 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: rainbowCannabis name: seeds-rainbow-cannabis-name noun: seeds-noun-seeds @@ -120,7 +120,7 @@ Max: 5 PotencyDivisor: 33 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: tobacco name: seeds-tobacco-name noun: seeds-noun-seeds @@ -145,7 +145,7 @@ Max: 10 PotencyDivisor: 10 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: nettle name: seeds-nettle-name noun: seeds-noun-seeds @@ -171,7 +171,7 @@ Max: 25 PotencyDivisor: 4 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: deathNettle name: seeds-deathnettle-name noun: seeds-noun-seeds @@ -202,7 +202,7 @@ Max: 15 PotencyDivisor: 6 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: aloe name: seeds-aloe-name noun: seeds-noun-seeds @@ -228,7 +228,7 @@ Max: 10 PotencyDivisor: 10 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: ambrosiaVulgaris name: seeds-ambrosiavulgaris-name noun: seeds-noun-seeds @@ -262,7 +262,7 @@ Max: 2 PotencyDivisor: 50 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: ambrosiaDeus name: seeds-ambrosiadeus-name noun: seeds-noun-seeds diff --git a/Resources/Prototypes/Hydroponics/Seeds/other.yml b/Resources/Prototypes/Hydroponics/Seeds/other.yml index dd4cf2d96b8..567b8f2554f 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/other.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/other.yml @@ -1,4 +1,4 @@ -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: sugarcane name: seeds-sugarcane-name noun: seeds-noun-seeds @@ -23,7 +23,7 @@ Max: 5 PotencyDivisor: 5 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: papercane name: seeds-papercane-name noun: seeds-noun-seeds @@ -41,7 +41,7 @@ growthStages: 3 idealHeat: 298 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: eggy name: seeds-eggy-name noun: seeds-noun-seeds @@ -65,7 +65,7 @@ Max: 12 PotencyDivisor: 10 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: soybeans name: seeds-soybeans-name noun: seeds-noun-seeds @@ -90,7 +90,7 @@ Max: 2 PotencyDivisor: 50 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: koibean name: seeds-koibean-name noun: seeds-noun-seeds @@ -117,7 +117,7 @@ Max: 4 PotencyDivisor: 30 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: cocoa name: seeds-cocoa-name noun: seeds-noun-seeds @@ -145,7 +145,7 @@ Max: 2 PotencyDivisor: 50 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: pea name: seeds-pea-name noun: seeds-noun-seeds @@ -176,7 +176,7 @@ Max: 2 PotencyDivisor: 50 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: laughinPea name: seeds-laughin-pea-name noun: seeds-noun-seeds @@ -211,7 +211,7 @@ Max: 10 PotencyDivisor: 5 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: worldPea name: seeds-worldpea-name noun: seeds-noun-seeds @@ -244,7 +244,7 @@ Max: 2 PotencyDivisor: 50 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: cotton name: seeds-cotton-name noun: seeds-noun-seeds @@ -269,7 +269,7 @@ Max: 10 PotencyDivisor: 20 -- type: seed +- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: pyrotton name: seeds-pyrotton-name noun: seeds-noun-seeds From 737706140af3965e2abf0379b944ba6238e7a411 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Wed, 1 Jul 2026 23:47:29 -0500 Subject: [PATCH 28/61] Change default nutrient source icon to hydroponics tray --- Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml b/Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml index d87b0c755d8..97f663eda5b 100644 --- a/Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml +++ b/Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml @@ -11,7 +11,7 @@ - From dec9a26c1532fea04d91557caa6a6c03e8c160ae Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Mon, 6 Jul 2026 18:49:44 -0500 Subject: [PATCH 29/61] Refactor total plant nutrients and environmental tolerances to be stored in the seedData instead of the PlantHolderComponent. --- .../Botany/Components/PlantHolderComponent.cs | 14 +- Content.Server/Botany/PlantNutrientInfo.cs | 17 -- Content.Server/Botany/SeedPrototype.cs | 56 ++++- .../Botany/Systems/BotanySwabSystem.cs | 1 - .../Botany/Systems/BotanySystem.Produce.cs | 11 +- .../Botany/Systems/BotanySystem.Seed.cs | 7 +- .../Botany/Systems/MutationSystem.cs | 3 +- .../Botany/Systems/PlantHolderSystem.cs | 192 +++++++----------- .../PlantMutateChemicalsEntityEffectSystem.cs | 2 + 9 files changed, 144 insertions(+), 159 deletions(-) delete mode 100644 Content.Server/Botany/PlantNutrientInfo.cs diff --git a/Content.Server/Botany/Components/PlantHolderComponent.cs b/Content.Server/Botany/Components/PlantHolderComponent.cs index 9de41c58896..08d84da7919 100644 --- a/Content.Server/Botany/Components/PlantHolderComponent.cs +++ b/Content.Server/Botany/Components/PlantHolderComponent.cs @@ -63,7 +63,7 @@ public sealed partial class PlantHolderComponent : Component public float NutritionLevel = 100f; [DataField] - public Dictionary, PlantNutrientInfo> Nutrients = new(); + public Dictionary, FixedPoint2> Nutrients = new(); [DataField] public float PestLevel; @@ -117,18 +117,6 @@ public sealed partial class PlantHolderComponent : Component [DataField] public SeedData? Seed; - [DataField] - public float IdealHeat = 0; - - [DataField] - public float HeatTolerance = float.PositiveInfinity; - - [DataField] - public float IdealPressure = 0; - - [DataField] - public float PressureTolerance = float.PositiveInfinity; - /// /// True if the plant is losing health due to too low temperature. /// diff --git a/Content.Server/Botany/PlantNutrientInfo.cs b/Content.Server/Botany/PlantNutrientInfo.cs deleted file mode 100644 index 9e3d80910b6..00000000000 --- a/Content.Server/Botany/PlantNutrientInfo.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Content.Shared.FixedPoint; - -namespace Content.Server.Botany; - -[Serializable] -[DataDefinition] -public sealed partial class PlantNutrientInfo -{ - [DataField] - public FixedPoint2 Amount = FixedPoint2.Zero; - - [DataField] - public FixedPoint2 Required = FixedPoint2.Zero; - - [DataField] - public FixedPoint2 Bonus = FixedPoint2.Zero; -} diff --git a/Content.Server/Botany/SeedPrototype.cs b/Content.Server/Botany/SeedPrototype.cs index 5caf0d39ba0..cbe80289c88 100644 --- a/Content.Server/Botany/SeedPrototype.cs +++ b/Content.Server/Botany/SeedPrototype.cs @@ -1,3 +1,4 @@ +using System.Linq; using Content.Shared.Atmos; using Content.Shared.Botany; using Content.Shared.Database; @@ -115,6 +116,13 @@ public partial struct NutrientRequirement [DataField("BonusAmount")] public FixedPoint2 BonusAmount = FixedPoint2.Zero; } +[DataDefinition] +public partial struct NutrientInfo +{ + [DataField("Requirement")] public FixedPoint2 Requirement = FixedPoint2.Zero; + [DataField("BonusRequirement")] public FixedPoint2 BonusRequirement = FixedPoint2.Zero; +} + // TODO Make Botany ECS and give it a proper API. I removed the limited access of this class because it's egregious how many systems needed access to it due to a lack of an actual API. /// /// SeedData is no longer restricted because the number of friends is absolutely unreasonable. @@ -124,6 +132,7 @@ public partial struct NutrientRequirement [Virtual, DataDefinition] public partial class SeedData { + #region Tracking /// @@ -189,14 +198,18 @@ public partial class SeedData [DataField] public Dictionary, NutrientRequirement> Requirements = new(); + [DataField] public Dictionary, NutrientRequirement> TotalRequirements { get; private set; } = new(); + [DataField] public float BaseIdealHeat = 293f; [DataField] public float BaseHeatTolerance = 10f; - [DataField] public float IdealHeat = 293f; // TODO: remove this - [DataField] public float HeatTolerance = 10f; // TODO: remove this + [DataField] public float IdealHeat { get; private set; } + [DataField] public float HeatTolerance { get; private set; } [DataField] public float IdealLight = 7f; [DataField] public float LightTolerance = 3f; [DataField] public float BaseIdealPressure = 101f; [DataField] public float BasePressureTolerance = 20f; + [DataField] public float IdealPressure { get; private set; } + [DataField] public float PressureTolerance { get; private set; } [DataField] public float WeedTolerance = 5f; @@ -295,6 +308,44 @@ public partial class SeedData [DataField] public LogImpact? HarvestLogImpact = null; + public void ApplyModifiers() + { + IdealHeat = BaseIdealHeat; + HeatTolerance = BaseHeatTolerance; + IdealPressure = BaseIdealPressure; + PressureTolerance = BasePressureTolerance; + + foreach (var chemical in Chemicals.Values) + { + IdealHeat += chemical.ModifyIdealHeat; + HeatTolerance += chemical.ModifyHeatTolerance; + IdealPressure += chemical.ModifyIdealPressure; + PressureTolerance += chemical.ModifyPressureTolerance; + } + + TotalRequirements.Clear(); + + foreach (var requirement in Requirements) + { + TotalRequirements.Add(requirement.Key, requirement.Value); + } + + foreach (var requirement in Chemicals.SelectMany(t => t.Value.Requirements)) + { + if (TotalRequirements.TryGetValue(requirement.Key, out var currentRequirement)) + { + currentRequirement.Requirement += requirement.Value.Requirement; + currentRequirement.BonusRequirement += requirement.Value.BonusRequirement; + TotalRequirements[requirement.Key] = currentRequirement; + } + else + { + TotalRequirements.Add(requirement.Key, requirement.Value); + } + } + + } + public SeedData Clone() { DebugTools.Assert(!Immutable, "There should be no need to clone an immutable seed."); @@ -352,6 +403,7 @@ public SeedData Clone() }; newSeed.Mutations.AddRange(Mutations); + //newSeed.ApplyModifiers(); return newSeed; } diff --git a/Content.Server/Botany/Systems/BotanySwabSystem.cs b/Content.Server/Botany/Systems/BotanySwabSystem.cs index 91bdca2349c..053010053f0 100644 --- a/Content.Server/Botany/Systems/BotanySwabSystem.cs +++ b/Content.Server/Botany/Systems/BotanySwabSystem.cs @@ -74,7 +74,6 @@ private void OnDoAfter(EntityUid uid, BotanySwabComponent swab, DoAfterEvent arg return; plant.Seed = _mutationSystem.Cross(swab.SeedData, old); // Cross-pollenate swab.SeedData = old; // Transfer old plant pollen to swab - _plantHolderSystem.SeedUpdated(args.Args.Target.Value, plant); _popupSystem.PopupEntity(Loc.GetString("botany-swab-to"), args.Args.Target.Value, args.Args.User); } diff --git a/Content.Server/Botany/Systems/BotanySystem.Produce.cs b/Content.Server/Botany/Systems/BotanySystem.Produce.cs index 5371d29e79e..3f38ac10253 100644 --- a/Content.Server/Botany/Systems/BotanySystem.Produce.cs +++ b/Content.Server/Botany/Systems/BotanySystem.Produce.cs @@ -11,7 +11,7 @@ public sealed partial class BotanySystem { [Dependency] private readonly SharedEntityEffectsSystem _entityEffects = default!; - public void ProduceGrown(EntityUid uid, ProduceComponent produce, Dictionary, PlantNutrientInfo> nutrients) + public void ProduceGrown(EntityUid uid, ProduceComponent produce, Dictionary, FixedPoint2> nutrients) { if (!TryGetSeed(produce, out var seed)) return; @@ -32,11 +32,12 @@ public void ProduceGrown(EntityUid uid, ProduceComponent produce, Dictionary, FixedPoint2> bonusRatio = new(); - foreach (var nutrient in nutrients) + foreach (var nutrient in seed.TotalRequirements) { - var info = nutrient.Value; - if (info.Bonus > 0) - bonusRatio.Add(nutrient.Key, FixedPoint2.Clamp((info.Amount - info.Required) / info.Bonus, 0, 1)); + var required = nutrient.Value.Requirement; + var bonus = nutrient.Value.BonusRequirement; + if (bonus > 0) + bonusRatio.Add(nutrient.Key, FixedPoint2.Clamp((nutrients[nutrient.Key] - required) / bonus, 0, 1)); } foreach (var (chem, quantity) in seed.Chemicals) diff --git a/Content.Server/Botany/Systems/BotanySystem.Seed.cs b/Content.Server/Botany/Systems/BotanySystem.Seed.cs index 4eae7727844..84f3f0c6ac4 100644 --- a/Content.Server/Botany/Systems/BotanySystem.Seed.cs +++ b/Content.Server/Botany/Systems/BotanySystem.Seed.cs @@ -16,6 +16,7 @@ using Robust.Shared.Random; using System.Diagnostics.CodeAnalysis; using System.Linq; +using Content.Shared.FixedPoint; namespace Content.Server.Botany.Systems; @@ -116,7 +117,7 @@ public EntityUid SpawnSeedPacket(SeedData proto, EntityCoordinates coords, Entit return seed; } - public IEnumerable AutoHarvest(SeedData proto, EntityCoordinates position, Dictionary, PlantNutrientInfo> nutrients, int yieldMod = 1) + public IEnumerable AutoHarvest(SeedData proto, EntityCoordinates position, Dictionary, FixedPoint2> nutrients, int yieldMod = 1) { if (position.IsValid(EntityManager) && proto.ProductPrototypes.Count > 0) @@ -130,7 +131,7 @@ public IEnumerable AutoHarvest(SeedData proto, EntityCoordinates posi return Enumerable.Empty(); } - public IEnumerable Harvest(SeedData proto, EntityUid user, Dictionary, PlantNutrientInfo> nutrients, int yieldMod = 1) + public IEnumerable Harvest(SeedData proto, EntityUid user, Dictionary, FixedPoint2> nutrients, int yieldMod = 1) { if (proto.ProductPrototypes.Count == 0 || proto.Yield <= 0) { @@ -147,7 +148,7 @@ public IEnumerable Harvest(SeedData proto, EntityUid user, Dictionary return GenerateProduct(proto, Transform(user).Coordinates, nutrients, yieldMod); } - public IEnumerable GenerateProduct(SeedData proto, EntityCoordinates position, Dictionary, PlantNutrientInfo> nutrients, int yieldMod = 1) + public IEnumerable GenerateProduct(SeedData proto, EntityCoordinates position, Dictionary, FixedPoint2> nutrients, int yieldMod = 1) { var totalYield = 0; if (proto.Yield > -1) diff --git a/Content.Server/Botany/Systems/MutationSystem.cs b/Content.Server/Botany/Systems/MutationSystem.cs index 6a34ca41963..289f5d8ac0c 100644 --- a/Content.Server/Botany/Systems/MutationSystem.cs +++ b/Content.Server/Botany/Systems/MutationSystem.cs @@ -64,8 +64,6 @@ public SeedData Cross(SeedData a, SeedData b) CrossFloat(ref result.NutrientConsumption, a.NutrientConsumption); CrossFloat(ref result.WaterConsumption, a.WaterConsumption); - CrossFloat(ref result.IdealHeat, a.IdealHeat); - CrossFloat(ref result.HeatTolerance, a.HeatTolerance); CrossFloat(ref result.IdealLight, a.IdealLight); CrossFloat(ref result.LightTolerance, a.LightTolerance); CrossFloat(ref result.WeedTolerance, a.WeedTolerance); @@ -97,6 +95,7 @@ public SeedData Cross(SeedData a, SeedData b) result.Seedless = true; } + result.ApplyModifiers(); return result; } diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index 38c0cd8c879..b0fbf91b761 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -148,36 +148,41 @@ private void OnExamine(Entity entity, ref ExaminedEvent ar if (component.PestLevel >= 5) args.PushMarkup(Loc.GetString("plant-holder-component-pest-high-level-message")); - foreach (var nutrientId in component.Nutrients.Keys - .OrderByDescending(p => component.Nutrients[p].Required) - .ThenByDescending(p => component.Nutrients[p].Bonus) - .ThenByDescending(p => component.Nutrients[p].Amount)) + foreach (var nutrientId in GetSortedNutrientIds(entity, component)) { var nutrient = _prototype.Index(nutrientId); - var nutrientInfo = component.Nutrients[nutrientId]; + var requirement = FixedPoint2.Zero; + var bonusRequirement = FixedPoint2.Zero; + if (component.Seed != null) + { + requirement = component.Seed.TotalRequirements[nutrientId].Requirement; + bonusRequirement = component.Seed.TotalRequirements[nutrientId].BonusRequirement; + } + + var nutrientAmount = component.Nutrients.GetOrNew(nutrientId); var requirementMessage = ""; var bonusMessage = ""; - if (nutrientInfo.Required > 0 || nutrientInfo.Bonus > 0) + if (requirement > 0 || bonusRequirement > 0) { requirementMessage = Loc.GetString($"plant-holder-component-nutrient-requirement-message", - ("requiredNutrients", nutrientInfo.Required), - ("fulfilled", nutrientInfo.Amount >= nutrientInfo.Required)); + ("requiredNutrients", requirement), + ("fulfilled", nutrientAmount >= requirement)); } - if (nutrientInfo.Bonus > 0) + if (bonusRequirement > 0) { bonusMessage = Loc.GetString($"plant-holder-component-nutrient-bonus-message", - ("bonusNutrients", nutrientInfo.Bonus + nutrientInfo.Required), - ("fulfilled", nutrientInfo.Amount >= nutrientInfo.Bonus + nutrientInfo.Required)); + ("bonusNutrients", bonusRequirement + requirement), + ("fulfilled", nutrientAmount >= bonusRequirement + requirement)); } args.PushMarkup(Loc.GetString($"plant-holder-component-nutrient-level-message", ("name", nutrient.LocalizedName), ("color", nutrient.SubstanceColor), - ("nutrientLevel", nutrientInfo.Amount), - ("requiredNutrients", nutrientInfo.Required), - ("fulfilled", nutrientInfo.Amount >= nutrientInfo.Required), + ("nutrientLevel", nutrientAmount), + ("requiredNutrients", requirement), + ("fulfilled", nutrientAmount >= requirement), ("requirementMessage", requirementMessage), ("bonusMessage", bonusMessage))); } @@ -208,6 +213,35 @@ private void OnExamine(Entity entity, ref ExaminedEvent ar } } + private IOrderedEnumerable> GetSortedNutrientIds(EntityUid uid, PlantHolderComponent component) + { + var nutrients = new List>(); + + foreach (var nutrientId in component.Nutrients.Keys) + { + nutrients.Add(_prototype.Index(nutrientId)); + } + + IOrderedEnumerable> sortednutrients; + + if (component.Seed != null) + { + foreach (var nutrientId in component.Seed.TotalRequirements.Keys) + { + if (!nutrients.Contains(nutrientId)) + nutrients.Add(_prototype.Index(nutrientId)); + } + sortednutrients = nutrients.OrderByDescending(p => component.Seed.TotalRequirements[p].Requirement) + .ThenByDescending(p => component.Seed.TotalRequirements[p].BonusRequirement) + .ThenByDescending(p => component.Nutrients.GetOrNew(p)); + } + else + { + sortednutrients = nutrients.OrderByDescending(p => component.Nutrients[p]); + } + return sortednutrients; + } + private void OnInteractUsing(Entity entity, ref InteractUsingEvent args) { var (uid, component) = entity; @@ -226,6 +260,7 @@ private void OnInteractUsing(Entity entity, ref InteractUs ("seedName", name), ("seedNoun", noun)), args.User, PopupType.Medium); + seed.ApplyModifiers(); // This should probably be run after prototypes are loaded, instead of when the seed is planted. component.Seed = seed; component.Dead = false; component.Age = 1; @@ -247,7 +282,6 @@ private void OnInteractUsing(Entity entity, ref InteractUs CheckLevelSanity(uid, component); UpdateSprite(uid, component); - SeedUpdated(uid, component); if (seed.PlantLogImpact != null) _adminLogger.Add(LogType.Botany, seed.PlantLogImpact.Value, $"{ToPrettyString(args.User):player} planted {Loc.GetString(seed.Name):seed} at Pos:{Transform(uid).Coordinates}."); @@ -561,22 +595,22 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) // SeedPrototype pressure resistance. var pressure = environment.Pressure; - var lowPressure = pressure < component.IdealPressure - component.PressureTolerance; - var highPressure = pressure > component.IdealPressure + component.PressureTolerance; + var lowPressure = pressure < component.Seed.IdealPressure - component.Seed.PressureTolerance; + var highPressure = pressure > component.Seed.IdealPressure + component.Seed.PressureTolerance; if (component.LowPressure || component.HighPressure) { - component.Health -= Math.Abs(pressure - component.IdealPressure) / component.PressureTolerance * healthMod; + component.Health -= Math.Abs(pressure - component.Seed.IdealPressure) / component.Seed.PressureTolerance * healthMod; } // SeedPrototype ideal temperature. - var lowHeat = environment.Temperature < component.IdealHeat - component.HeatTolerance; - var highHeat = environment.Temperature > component.IdealHeat + component.HeatTolerance; + var lowHeat = environment.Temperature < component.Seed.IdealHeat - component.Seed.HeatTolerance; + var highHeat = environment.Temperature > component.Seed.IdealHeat + component.Seed.HeatTolerance; if (component.LowHeat) { - component.Health -= Math.Abs(environment.Temperature - component.IdealHeat) / component.HeatTolerance * healthMod; + component.Health -= Math.Abs(environment.Temperature - component.Seed.IdealHeat) / component.Seed.HeatTolerance * healthMod; } if (component.DrawWarnings && @@ -801,11 +835,11 @@ private void AfterHarvest(EntityUid uid, PlantHolderComponent? component = null) DoScream(uid, component.Seed); - if (!component.Dead) + if (!component.Dead && component.Seed != null) { - foreach (var nutrient in component.Nutrients) + foreach (var nutrient in component.Seed.TotalRequirements) { - AdjustNutrient(uid, (nutrient.Value.Required + nutrient.Value.Bonus) * -1, nutrient.Key, component); + AdjustNutrient(uid, (nutrient.Value.Requirement + nutrient.Value.BonusRequirement) * -1, nutrient.Key, component); } } @@ -868,7 +902,7 @@ public void RemovePlant(EntityUid uid, PlantHolderComponent? component = null) component.HighPressure = false; UpdateSprite(uid, component); - SeedUpdated(uid, component); + } public void AffectGrowth(EntityUid uid, int amount, PlantHolderComponent? component = null) @@ -900,119 +934,45 @@ public void AdjustNutrient(EntityUid uid, FixedPoint2 amount, ProtoId 0) - return; - - nutrient.Amount = 0; - RemoveEmptyNutrient(uid, nutrientId, component); + if (component.Nutrients.ContainsKey(nutrientId)) + { + component.Nutrients[nutrientId] += amount; + RemoveEmptyNutrient(uid, nutrientId, component); + } + else if (amount > 0) + { + component.Nutrients.Add(nutrientId, amount); + } } private void RemoveEmptyNutrient(EntityUid uid, ProtoId nutrient, PlantHolderComponent? component = null) { if (!Resolve(uid, ref component)) return; - var nutrientInfo = component.Nutrients[nutrient]; - if (nutrientInfo.Amount == 0 && nutrientInfo.Required == 0 && nutrientInfo.Bonus == 0) + var nutrientAmount = component.Nutrients[nutrient]; + if (nutrientAmount <= FixedPoint2.Zero) component.Nutrients.Remove(nutrient); } - public void UpdateNutrientRequirements(EntityUid uid, PlantHolderComponent? component = null) - { - if (!Resolve(uid, ref component)) - return; - foreach (var nutrientInfo in component.Nutrients.Values) - { - nutrientInfo.Required = 0; - nutrientInfo.Bonus = 0; - } - - if (component.Seed != null && !component.Dead) - { - var yield = component.Seed.Yield; - foreach (var requirement in component.Seed.Requirements) - { - var nutrient = component.Nutrients.GetOrNew(requirement.Key); - - nutrient.Required += requirement.Value.Requirement * yield; - nutrient.Bonus += requirement.Value.BonusRequirement * yield; - } - - foreach (var requirement in component.Seed.Chemicals.Values.SelectMany(quantity => quantity.Requirements)) - { - var nutrient = component.Nutrients.GetOrNew(requirement.Key); - - nutrient.Required += requirement.Value.Requirement * yield; - nutrient.Bonus += requirement.Value.BonusRequirement * yield; - } - } - - foreach (var nutrientId in component.Nutrients.Keys) - { - RemoveEmptyNutrient(uid, nutrientId, component); - } - } public bool CheckRequiredNutrients(EntityUid uid, PlantHolderComponent? component = null) { if (!Resolve(uid, ref component)) return false; - if (component.Dead) + if (component.Dead || component.Seed == null) return false; - foreach (var nutrientInfo in component.Nutrients.Values) + foreach (var nutrient in component.Seed.TotalRequirements) { - if (nutrientInfo.Amount < nutrientInfo.Required) + var amount = component.Nutrients.GetValueOrDefault(nutrient.Key); + if (amount < nutrient.Value.Requirement) return false; } return true; } - public void UpdateTolerances(EntityUid uid, PlantHolderComponent? component = null) - { - if (!Resolve(uid, ref component)) - return; - if (component.Seed == null) - { - component.IdealHeat = 0; - component.HeatTolerance = float.PositiveInfinity; - component.IdealPressure = 0; - component.PressureTolerance = float.PositiveInfinity; - return; - } - - var idealHeat = component.Seed.BaseIdealHeat; - var heatTolerance = component.Seed.BaseHeatTolerance; - var idealPressure = component.Seed.BaseIdealPressure; - var pressureTolerance = component.Seed.BasePressureTolerance; - - foreach (var quantity in component.Seed.Chemicals.Values) - { - idealHeat += quantity.ModifyIdealHeat; - heatTolerance += quantity.ModifyHeatTolerance; - idealPressure += quantity.ModifyIdealPressure; - pressureTolerance += quantity.ModifyPressureTolerance; - } - - component.IdealHeat = idealHeat; - component.HeatTolerance = heatTolerance; - component.IdealPressure = idealPressure; - component.PressureTolerance = pressureTolerance; - } - - public void SeedUpdated(EntityUid uid, PlantHolderComponent? component = null) - { - if (!Resolve(uid, ref component)) - return; - UpdateNutrientRequirements(uid, component); - UpdateTolerances(uid, component); - } - public void UpdateReagents(EntityUid uid, PlantHolderComponent? component = null) { if (!Resolve(uid, ref component)) @@ -1033,7 +993,7 @@ public void UpdateReagents(EntityUid uid, PlantHolderComponent? component = null var reagentProto = _prototype.Index(entry.Reagent.Prototype); _entityEffects.ApplyEffects(uid, reagentProto.PlantMetabolisms.ToArray(), entry.Quantity); } - SeedUpdated(uid, component); + _solutionContainerSystem.RemoveEachReagent(component.SoilSolution.Value, PlantMetabolismRate); } @@ -1049,7 +1009,7 @@ private void Mutate(EntityUid uid, float severity, PlantHolderComponent? compone { EnsureUniqueSeed(uid, component); _mutation.MutateSeed(uid, ref component.Seed, severity); - SeedUpdated(uid, component); + } } diff --git a/Content.Server/EntityEffects/Effects/Botany/PlantMutateChemicalsEntityEffectSystem.cs b/Content.Server/EntityEffects/Effects/Botany/PlantMutateChemicalsEntityEffectSystem.cs index 0288ea34182..8cfedaf9584 100644 --- a/Content.Server/EntityEffects/Effects/Botany/PlantMutateChemicalsEntityEffectSystem.cs +++ b/Content.Server/EntityEffects/Effects/Botany/PlantMutateChemicalsEntityEffectSystem.cs @@ -41,5 +41,7 @@ protected override void Effect(Entity entity, ref EntityEf var potencyDivisor = 100f / seedChemQuantity.Max; seedChemQuantity.PotencyDivisor = (float)potencyDivisor; chemicals[chemicalId] = seedChemQuantity; + + entity.Comp.Seed.ApplyModifiers(); } } From f5065c0240d8edd2254d06b775ddebffe87a0e63 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Mon, 6 Jul 2026 19:28:04 -0500 Subject: [PATCH 30/61] Fix some crashes caused by the refactor --- Content.Server/Botany/SeedPrototype.cs | 5 ++++- Content.Server/Botany/Systems/PlantHolderSystem.cs | 8 ++++---- Resources/Locale/en-US/botany/plant-nutrients.ftl | 3 +++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Content.Server/Botany/SeedPrototype.cs b/Content.Server/Botany/SeedPrototype.cs index cbe80289c88..b518f9fee23 100644 --- a/Content.Server/Botany/SeedPrototype.cs +++ b/Content.Server/Botany/SeedPrototype.cs @@ -1,6 +1,8 @@ using System.Linq; +using System.Runtime.CompilerServices; using Content.Shared.Atmos; using Content.Shared.Botany; +using Content.Shared.Climbing.Events; using Content.Shared.Database; using Content.Shared.FixedPoint; using Content.Shared.Random; @@ -403,7 +405,7 @@ public SeedData Clone() }; newSeed.Mutations.AddRange(Mutations); - //newSeed.ApplyModifiers(); + newSeed.ApplyModifiers(); return newSeed; } @@ -482,6 +484,7 @@ public SeedData SpeciesChange(SeedData other) } } + newSeed.ApplyModifiers(); return newSeed; } diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index b0fbf91b761..91adc92ccc8 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -153,7 +153,7 @@ private void OnExamine(Entity entity, ref ExaminedEvent ar var nutrient = _prototype.Index(nutrientId); var requirement = FixedPoint2.Zero; var bonusRequirement = FixedPoint2.Zero; - if (component.Seed != null) + if (component.Seed != null && component.Seed.TotalRequirements.ContainsKey(nutrientId)) { requirement = component.Seed.TotalRequirements[nutrientId].Requirement; bonusRequirement = component.Seed.TotalRequirements[nutrientId].BonusRequirement; @@ -231,9 +231,9 @@ private IOrderedEnumerable> GetSortedNutrientIds if (!nutrients.Contains(nutrientId)) nutrients.Add(_prototype.Index(nutrientId)); } - sortednutrients = nutrients.OrderByDescending(p => component.Seed.TotalRequirements[p].Requirement) - .ThenByDescending(p => component.Seed.TotalRequirements[p].BonusRequirement) - .ThenByDescending(p => component.Nutrients.GetOrNew(p)); + sortednutrients = nutrients.OrderByDescending(p => component.Seed.TotalRequirements.GetValueOrDefault(p).Requirement) + .ThenByDescending(p => component.Seed.TotalRequirements.GetValueOrDefault(p).BonusRequirement) + .ThenByDescending(p => component.Nutrients.GetValueOrDefault(p)); } else { diff --git a/Resources/Locale/en-US/botany/plant-nutrients.ftl b/Resources/Locale/en-US/botany/plant-nutrients.ftl index a2439acb71a..3039487e842 100644 --- a/Resources/Locale/en-US/botany/plant-nutrients.ftl +++ b/Resources/Locale/en-US/botany/plant-nutrients.ftl @@ -34,6 +34,9 @@ nutrient-desc-carbon = Fundamental building block of life or something. these de nutrient-name-iron = iron nutrient-desc-iron = It's iron. +nutrient-name-aluminum = aluminum +nutrient-desc-aluminum = Light metal dust. + nutrient-name-gold = gold nutrient-desc-gold = Expensive. From faf922a99f1a762494847d32907460e1661164dd Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Mon, 6 Jul 2026 21:51:30 -0500 Subject: [PATCH 31/61] Towercaps & Steelcaps converted to the new system. --- .../Prototypes/Hydroponics/Seeds/fungus.yml | 25 +++++++++++-------- .../Prototypes/Hydroponics/nutrients.yml | 6 +++++ Resources/Prototypes/Reagents/elements.yml | 4 +++ 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/Seeds/fungus.yml b/Resources/Prototypes/Hydroponics/Seeds/fungus.yml index b8c34bc48ac..e1359209123 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/fungus.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/fungus.yml @@ -1,4 +1,4 @@ -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: towercap name: seeds-towercap-name noun: seeds-noun-spores @@ -12,14 +12,16 @@ ligneous: true production: 3 yield: 5 - potency: 1 growthStages: 3 - waterConsumption: 0.60 - nutrientConsumption: 0.50 + requirements: + Nutrient: + Requirement: 10 + Water: + Requirement: 10 lightTolerance: 6 - idealHeat: 288 + baseIdealHeat: 288 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: steelcap name: seeds-steelcap-name noun: seeds-noun-spores @@ -33,12 +35,15 @@ ligneous: true production: 1 yield: 1 - potency: 1 growthStages: 3 - waterConsumption: 0.60 - nutrientConsumption: 0.80 + requirements: + Aluminum: + Requirement: 5 + Carbon: + Requirement: 1 lightTolerance: 6 - idealHeat: 288 + baseIdealHeat: 425 + baseHeatTolerance: 425 # Incredibly high heat tolerance, but using it comes with extra nutrient requirements. - type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: chanterelle diff --git a/Resources/Prototypes/Hydroponics/nutrients.yml b/Resources/Prototypes/Hydroponics/nutrients.yml index 180cdd6c7d8..859fd01fa39 100644 --- a/Resources/Prototypes/Hydroponics/nutrients.yml +++ b/Resources/Prototypes/Hydroponics/nutrients.yml @@ -70,6 +70,12 @@ desc: nutrient-desc-iron color: "#434b4d" +- type: plantNutrient + id: Aluminum + name: nutrient-name-aluminum + desc: nutrient-desc-aluminum + color: "#848789" + - type: plantNutrient id: Gold name: nutrient-name-gold diff --git a/Resources/Prototypes/Reagents/elements.yml b/Resources/Prototypes/Reagents/elements.yml index fb0aa778a0b..af97b3d6046 100644 --- a/Resources/Prototypes/Reagents/elements.yml +++ b/Resources/Prototypes/Reagents/elements.yml @@ -8,6 +8,10 @@ color: "#848789" boilingPoint: 2327.0 meltingPoint: 660.0 + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: Aluminum - type: reagent id: Carbon From bb99b5020dbc391fccfab15c21b2197e91325467 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 7 Jul 2026 22:28:24 -0500 Subject: [PATCH 32/61] Unfinished fruit.yml changes --- .../Prototypes/Hydroponics/Seeds/fruit.yml | 551 +++++++++++++----- 1 file changed, 393 insertions(+), 158 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/Seeds/fruit.yml b/Resources/Prototypes/Hydroponics/Seeds/fruit.yml index 0dadd8f0062..3daed54ff40 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/fruit.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/fruit.yml @@ -54,7 +54,7 @@ Max: 2 PotencyDivisor: 50 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: lemon name: seeds-lemon-name noun: seeds-noun-seeds @@ -72,19 +72,34 @@ maturation: 6 production: 6 yield: 3 - potency: 10 idealLight: 8 chemicals: Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 20 + BaseAmount: 1 + Requirements: + Water: + Requirement: 2 + Fertilizer: + BonusRequirement: 0.4 + BonusAmount: 2 + CarbonDioxide: + BonusRequirement: 0.2 + BonusAmount: 2 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: lemoon name: seeds-lemoon-name noun: seeds-noun-seeds @@ -98,7 +113,6 @@ maturation: 8 production: 6 yield: 4 - potency: 1 idealLight: 8 chemicals: Vitamin: @@ -110,7 +124,7 @@ Max: 20 PotencyDivisor: 5 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: lime name: seeds-lime-name noun: seeds-noun-seeds @@ -127,19 +141,34 @@ maturation: 6 production: 6 yield: 3 - potency: 10 idealLight: 8 chemicals: Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 20 + BaseAmount: 1 + Requirements: + Water: + Requirement: 2 + Fertilizer: + BonusRequirement: 0.4 + BonusAmount: 2 + CarbonDioxide: + BonusRequirement: 0.2 + BonusAmount: 2 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: orange name: seeds-orange-name noun: seeds-noun-seeds @@ -157,17 +186,32 @@ maturation: 6 production: 6 yield: 3 - potency: 10 idealLight: 8 chemicals: Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 20 + BaseAmount: 1 + Requirements: + Water: + Requirement: 2 + Fertilizer: + BonusRequirement: 0.4 + BonusAmount: 2 + CarbonDioxide: + BonusRequirement: 0.2 + BonusAmount: 2 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 - type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: extradimensionalOrange @@ -194,12 +238,19 @@ Min: 1 Max: 5 PotencyDivisor: 20 - Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: pineapple name: seeds-pineapple-name noun: seeds-noun-seeds @@ -213,24 +264,35 @@ maturation: 6 production: 6 yield: 3 - potency: 10 idealLight: 8 growthStages: 3 chemicals: Nutriment: - Min: 1 - Max: 20 - PotencyDivisor: 20 - Water: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 2 + Requirements: + Water: + Requirement: 2 + Fertilizer: + BonusRequirement: 0.8 + BonusAmount: 4 + CarbonDioxide: + BonusRequirement: 0.4 + BonusAmount: 4 Vitamin: - Min: 1 - Max: 2 - PotencyDivisor: 50 + BaseAmount: 1 + Requirements: + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + Water: + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + BonusRequirement: 3 + BonusAmount: 3 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: tomato name: seeds-tomato-name noun: seeds-noun-seeds @@ -248,24 +310,39 @@ production: 6 yield: 2 potency: 10 - waterConsumption: 0.60 - nutrientConsumption: 0.40 - idealLight: 8 + baseIdealLight: 8 idealHeat: 298 splatPrototype: PuddleSplatter chemicals: Nutriment: - Min: 1 - Max: 7 - PotencyDivisor: 14 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + Fertilizer: + BonusRequirement: 0.6 + BonusAmount: 3 + CarbonDioxide: + BonusRequirement: 0.3 + BonusAmount: 3 Vitamin: - Min: 1 - Max: 3 - PotencyDivisor: 33 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 Water: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + BonusRequirement: 3 + BonusAmount: 3 - type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: blueTomato @@ -297,9 +374,18 @@ Max: 15 PotencyDivisor: 10 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 - type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: bloodTomato @@ -329,9 +415,18 @@ Max: 10 PotencyDivisor: 10 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 - type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: killerTomato @@ -366,7 +461,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: eggplant name: seeds-eggplant-name noun: seeds-noun-seeds @@ -382,21 +477,36 @@ maturation: 6 production: 6 yield: 2 - potency: 20 growthStages: 3 idealLight: 9 - idealHeat: 298 + baseIdealHeat: 298 chemicals: Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 2 + Requirements: + Water: + Requirement: 2 + Fertilizer: + BonusRequirement: 0.8 + BonusAmount: 4 + CarbonDioxide: + BonusRequirement: 0.4 + BonusAmount: 4 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: apple name: seeds-apple-name noun: seeds-noun-seeds @@ -412,19 +522,34 @@ maturation: 6 production: 6 yield: 3 - potency: 10 idealLight: 6 chemicals: Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 2 + Requirements: + Water: + Requirement: 2 + Fertilizer: + BonusRequirement: 0.8 + BonusAmount: 4 + CarbonDioxide: + BonusRequirement: 0.4 + BonusAmount: 4 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert Doctor's Delight to the new system. id: goldenApple name: seeds-goldenapple-name noun: seeds-noun-seeds @@ -438,19 +563,32 @@ maturation: 6 production: 6 yield: 3 - potency: 10 idealLight: 6 - waterConsumption: 0.75 - nutrientConsumption: 0.75 chemicals: Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 2 + Requirements: + Water: + Requirement: 2 + Fertilizer: + BonusRequirement: 0.8 + BonusAmount: 4 + CarbonDioxide: + BonusRequirement: 0.4 + BonusAmount: 4 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 DoctorsDelight: Min: 3 Max: 13 @@ -601,7 +739,7 @@ Max: 5 PotencyDivisor: 20 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: grape name: seeds-grape-name noun: seeds-noun-seeds @@ -614,19 +752,34 @@ maturation: 6 production: 5 yield: 3 - potency: 10 growthStages: 2 chemicals: Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 20 + BaseAmount: 1 + Requirements: + Water: + Requirement: 2 + Fertilizer: + BonusRequirement: 0.4 + BonusAmount: 2 + CarbonDioxide: + BonusRequirement: 0.2 + BonusAmount: 2 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: watermelon name: seeds-watermelon-name noun: seeds-noun-seeds @@ -641,23 +794,41 @@ maturation: 12 production: 3 yield: 1 - potency: 1 idealLight: 8 chemicals: Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 2 + Requirements: + Water: + Requirement: 2 + Fertilizer: + BonusRequirement: 0.8 + BonusAmount: 4 + CarbonDioxide: + BonusRequirement: 0.4 + BonusAmount: 4 Water: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + BonusRequirement: 9 + BonusAmount: 9 Vitamin: - Min: 1 - Max: 5 - PotencyDivisor: 20 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 0.5 + BonusRequirement: 1.5 + BonusAmount: 2 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: holymelon name: seeds-holymelon-name noun: seeds-noun-seeds @@ -670,23 +841,41 @@ maturation: 12 production: 3 yield: 1 - potency: 1 idealLight: 8 chemicals: Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 - Holywater: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 2 + Requirements: + Water: + Requirement: 2 + Fertilizer: + BonusRequirement: 0.8 + BonusAmount: 4 + CarbonDioxide: + BonusRequirement: 0.4 + BonusAmount: 4 + HolyWater: + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + BonusRequirement: 3 + BonusAmount: 3 Vitamin: - Min: 1 - Max: 5 - PotencyDivisor: 20 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 0.5 + BonusRequirement: 1.5 + BonusAmount: 2 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: berries name: seeds-berries-name noun: seeds-noun-seeds @@ -701,18 +890,33 @@ production: 6 yield: 4 idealLight: 7 - nutrientConsumption: 0.6 chemicals: Nutriment: - Min: 2 - Max: 5 - PotencyDivisor: 30 + BaseAmount: 2 + Requirements: + Water: + Requirement: 2 + Fertilizer: + BonusRequirement: 0.3 + BonusAmount: 1.5 + CarbonDioxide: + BonusRequirement: 0.15 + BonusAmount: 1.5 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 40 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system id: bungo name: seeds-bungo-name noun: seeds-noun-seeds @@ -725,12 +929,10 @@ lifespan: 50 maturation: 8 production: 6 - potency: 10 yield: 3 idealLight: 8 - idealHeat: 298 + baseIdealHeat: 298 growthStages: 4 - waterConsumption: 0.6 chemicals: Nutriment: Min: 5 @@ -741,7 +943,7 @@ Max: 10 PotencyDivisor: 20 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: pumpkin name: seeds-pumpkin-name noun: seeds-noun-seeds @@ -756,18 +958,33 @@ maturation: 10 production: 4 yield: 2 - potency: 10 - idealHeat: 288 + baseIdealHeat: 288 growthStages: 3 chemicals: PumpkinFlesh: - Min: 1 - Max: 20 - PotencyDivisor: 5 + BaseAmount: 2 + Requirements: + Water: + Requirement: 2 + Fertilizer: + BonusRequirement: 1.6 + BonusAmount: 8 + CarbonDioxide: + BonusRequirement: 0.8 + BonusAmount: 8 Vitamin: - Min: 1 - Max: 5 - PotencyDivisor: 20 + BaseAmount: 2 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 - type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption id: bluePumpkin @@ -799,7 +1016,7 @@ Max: 10 PotencyDivisor: 3 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: cherry name: seeds-cherry-name noun: seeds-noun-seeds @@ -813,19 +1030,32 @@ maturation: 6 production: 6 yield: 5 - potency: 10 idealLight: 6 chemicals: Nutriment: - Min: 1 - Max: 3 - PotencyDivisor: 30 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 Vitamin: - Min: 1 - Max: 3 - PotencyDivisor: 40 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert Artifexium to the new system id: anomalyBerry name: seeds-anomaly-berry-name noun: seeds-noun-seeds @@ -838,20 +1068,25 @@ maturation: 12 production: 3 yield: 3 - potency: 10 growthStages: 2 - waterConsumption: 0.60 - nutrientConsumption: 0.50 chemicals: Artifexium: Min: 1 Max: 1 PotencyDivisor: 4 Nutriment: - Min: 1 - Max: 2 - PotencyDivisor: 30 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 Vitamin: - Min: 1 - Max: 2 - PotencyDivisor: 40 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 From 5af187c9f300130ece3d29425dfdabe7a555d969 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Thu, 16 Jul 2026 15:39:49 -0500 Subject: [PATCH 33/61] More fruit changes --- .../Prototypes/Hydroponics/Seeds/fruit.yml | 102 +++++++++++------- 1 file changed, 66 insertions(+), 36 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/Seeds/fruit.yml b/Resources/Prototypes/Hydroponics/Seeds/fruit.yml index 3daed54ff40..23e8320f358 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/fruit.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/fruit.yml @@ -1,4 +1,4 @@ -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: banana name: seeds-banana-name noun: seeds-noun-seeds @@ -16,7 +16,7 @@ yield: 2 idealLight: 9 waterConsumption: 0.60 - idealHeat: 298 + baseIdealHeat: 298 chemicals: Vitamin: Min: 1 @@ -27,7 +27,7 @@ Max: 2 PotencyDivisor: 50 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: mimana name: seeds-mimana-name noun: seeds-noun-seeds @@ -43,7 +43,7 @@ yield: 2 idealLight: 9 waterConsumption: 0.60 - idealHeat: 298 + baseIdealHeat: 298 chemicals: MuteToxin: Min: 1 @@ -213,7 +213,7 @@ BonusRequirement: 0.1 BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: extradimensionalOrange name: seeds-extradimensionalorange-name noun: seeds-noun-seeds @@ -310,8 +310,8 @@ production: 6 yield: 2 potency: 10 - baseIdealLight: 8 - idealHeat: 298 + idealLight: 8 + baseIdealHeat: 298 splatPrototype: PuddleSplatter chemicals: Nutriment: @@ -344,7 +344,7 @@ BonusRequirement: 3 BonusAmount: 3 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: blueTomato name: seeds-bluetomato-name noun: seeds-noun-seeds @@ -362,7 +362,7 @@ waterConsumption: 0.60 nutrientConsumption: 0.70 idealLight: 8 - idealHeat: 298 + baseIdealHeat: 298 splatPrototype: PuddleSplatter chemicals: Nutriment: @@ -387,7 +387,7 @@ BonusRequirement: 0.1 BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: bloodTomato name: seeds-bloodtomato-name noun: seeds-noun-seeds @@ -404,16 +404,24 @@ production: 6 yield: 2 potency: 10 - waterConsumption: 0.60 - nutrientConsumption: 0.70 idealLight: 8 - idealHeat: 298 + baseIdealHeat: 298 splatPrototype: PuddleSplatter chemicals: Blood: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + BonusRequirement: 2 + BonusAmount: 2 + Protein: + Requirement: 0.25 + BonusRequirement: 0.5 + BonusAmount: 2 + Iron: + BonusRequirement: 0.2 + BonusAmount: 5 Vitamin: BaseAmount: 1 Requirements: @@ -428,7 +436,7 @@ BonusRequirement: 0.1 BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: killerTomato name: seeds-killertomato-name noun: seeds-noun-seeds @@ -444,22 +452,44 @@ maturation: 15 production: 6 yield: 2 - potency: 10 - waterConsumption: 0.60 - nutrientConsumption: 0.70 idealLight: 8 - idealHeat: 298 + baseIdealHeat: 298 growthStages: 2 splatPrototype: PuddleSplatter + requirements: + Protein: + Requirement: 5 + Nutrient: + Requirement: 3 chemicals: Blood: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + BonusRequirement: 2 + BonusAmount: 2 + Protein: + Requirement: 0.25 + BonusRequirement: 0.5 + BonusAmount: 2 + Iron: + BonusRequirement: 0.2 + BonusAmount: 5 JuiceTomato: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + Nutrient: + BonusRequirement: 0.5 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 - type: seed id: eggplant @@ -594,7 +624,7 @@ Max: 13 PotencyDivisor: 10 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: chili name: seeds-chili-name noun: seeds-noun-seeds @@ -612,7 +642,7 @@ yield: 2 potency: 20 idealLight: 9 - idealHeat: 298 + baseIdealHeat: 298 chemicals: CapsaicinOil: Min: 1 @@ -627,7 +657,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: chilly name: seeds-chilly-name noun: seeds-noun-seeds @@ -643,7 +673,7 @@ yield: 2 potency: 20 idealLight: 9 - idealHeat: 298 + baseIdealHeat: 298 chemicals: FrostOil: Min: 1 @@ -658,7 +688,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: gatfruit name: seeds-gatfruit-name noun: seeds-noun-seeds @@ -687,7 +717,7 @@ Max: 5 PotencyDivisor: 20 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: fakeCapfruit name: seeds-capfruit-name noun: seeds-noun-seeds @@ -713,7 +743,7 @@ Max: 5 PotencyDivisor: 20 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: realCapfruit name: seeds-capfruit-name noun: seeds-noun-seeds @@ -986,7 +1016,7 @@ BonusRequirement: 0.1 BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: bluePumpkin name: seeds-blue-pumpkin-name noun: seeds-noun-seeds @@ -1000,7 +1030,7 @@ production: 4 yield: 2 potency: 10 - idealHeat: 288 + baseIdealHeat: 288 growthStages: 3 chemicals: Ammonia: From 25340b361286bb7bdf4cb540670d545d295cbaf8 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Mon, 20 Jul 2026 18:05:29 -0500 Subject: [PATCH 34/61] Extradimensional orange YAML --- .../Prototypes/Hydroponics/Seeds/fruit.yml | 53 ++++++++++++------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/Seeds/fruit.yml b/Resources/Prototypes/Hydroponics/Seeds/fruit.yml index 23e8320f358..0f43b2e9809 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/fruit.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/fruit.yml @@ -213,7 +213,7 @@ BonusRequirement: 0.1 BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption +- type: seed id: extradimensionalOrange name: seeds-extradimensionalorange-name noun: seeds-noun-seeds @@ -227,28 +227,43 @@ maturation: 6 production: 6 yield: 3 - potency: 10 idealLight: 8 chemicals: Haloperidol: - Min: 1 - Max: 5 - PotencyDivisor: 20 + BaseAmount: 1 + Requirements: + Aluminum: + Requirement: 1 + Fertilizer: + BonusRequirement: 2 + BonusAmount: 2 + Nutrient: + BonusRequirement: 2 + BonusAmount: 2 Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 20 - Requirements: - Nutrient: - Requirement: 1 - BonusRequirement: 1 - BonusAmount: 1 - Fertilizer: - BonusRequirement: 0.2 - BonusAmount: 1 - CarbonDioxide: - BonusRequirement: 0.1 - BonusAmount: 1 + BaseAmount: 1 + Requirements: + Water: + Requirement: 2 + Fertilizer: + BonusRequirement: 0.4 + BonusAmount: 2 + CarbonDioxide: + BonusRequirement: 0.2 + BonusAmount: 2 + Vitamin: + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 - type: seed id: pineapple From b4839486baf32ebe5f6301065e8f57497fceceb3 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Thu, 23 Jul 2026 22:11:29 -0500 Subject: [PATCH 35/61] all fruit except for gatfruit, capfruit, and anomaly berries converted to new system --- .../Prototypes/Hydroponics/Seeds/fruit.yml | 176 +++++++++++++----- 1 file changed, 126 insertions(+), 50 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/Seeds/fruit.yml b/Resources/Prototypes/Hydroponics/Seeds/fruit.yml index 0f43b2e9809..839dbffb2ba 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/fruit.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/fruit.yml @@ -359,7 +359,7 @@ BonusRequirement: 3 BonusAmount: 3 -- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption +- type: seed id: blueTomato name: seeds-bluetomato-name noun: seeds-noun-seeds @@ -373,21 +373,31 @@ maturation: 8 production: 6 yield: 2 - potency: 10 - waterConsumption: 0.60 - nutrientConsumption: 0.70 idealLight: 8 baseIdealHeat: 298 splatPrototype: PuddleSplatter chemicals: Nutriment: - Min: 1 - Max: 5 - PotencyDivisor: 20 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + Fertilizer: + BonusRequirement: 0.4 + BonusAmount: 2 + CarbonDioxide: + BonusRequirement: 0.2 + BonusAmount: 2 SpaceLube: - Min: 5 - Max: 15 - PotencyDivisor: 10 + BaseAmount: 6 + Requirements: + Water: + Requirement: 5 + Nutrient: + Requirement: 1.5 + Iron: # 1.5u iron > 3u fersilicite > 15u lube + BonusRequirement: 1.5 + BonusAmount: 9 Vitamin: BaseAmount: 1 Requirements: @@ -639,7 +649,7 @@ Max: 13 PotencyDivisor: 10 -- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption +- type: seed id: chili name: seeds-chili-name noun: seeds-noun-seeds @@ -655,24 +665,48 @@ maturation: 6 production: 6 yield: 2 - potency: 20 idealLight: 9 baseIdealHeat: 298 chemicals: CapsaicinOil: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 2 + Requirements: + Water: + Requirement: 2 + Nutrient: + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.6 + BonusAmount: 3 + CarbonDioxide: + BonusRequirement: 0.4 + BonusAmount: 4 Nutriment: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Water: + Requirement: 1 + Fertilizer: + BonusRequirement: 0.3 + BonusAmount: 1.5 + CarbonDioxide: + BonusRequirement: 0.15 + BonusAmount: 1.5 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption +- type: seed id: chilly name: seeds-chilly-name noun: seeds-noun-seeds @@ -686,22 +720,41 @@ maturation: 6 production: 6 yield: 2 - potency: 20 idealLight: 9 baseIdealHeat: 298 chemicals: FrostOil: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 2 + ModifyIdealHeat: -25 + Requirements: + Water: + Requirement: 3 + Nutrient: + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.4 + BonusAmount: 2 + Frezon: + BonusRequirement: 0.1 + BonusAmount: 5 Nutriment: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 2 + Water: + Requirement: 2 + Fertilizer: + BonusRequirement: 0.4 + BonusAmount: 2 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.4 + BonusAmount: 2 - type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: gatfruit @@ -961,7 +1014,7 @@ BonusRequirement: 0.1 BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system +- type: seed id: bungo name: seeds-bungo-name noun: seeds-noun-seeds @@ -980,13 +1033,22 @@ growthStages: 4 chemicals: Nutriment: - Min: 5 - Max: 10 - PotencyDivisor: 20 + BaseAmount: 5 + Requirements: + Water: + Requirement: 5 + CarbonDioxide: + Requirement: 0.5 + BonusRequirement: 0.5 + BonusAmount: 5 Enzyme: - Min: 5 - Max: 10 - PotencyDivisor: 20 + BaseAmount: 5 + Requirements: + Nutrient: + Requirement: 5 + Sugar: + BonusRequirement: 2 + BonusAmount: 5 - type: seed id: pumpkin @@ -1031,7 +1093,7 @@ BonusRequirement: 0.1 BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption +- type: seed id: bluePumpkin name: seeds-blue-pumpkin-name noun: seeds-noun-seeds @@ -1044,22 +1106,36 @@ maturation: 10 production: 4 yield: 2 - potency: 10 baseIdealHeat: 288 growthStages: 3 chemicals: Ammonia: - Min: 1 - Max: 15 - PotencyDivisor: 3 + BaseAmount: 4 + Requirements: + Nutrient: + Requirement: 4 + BonusRequirement: 2 + BonusAmount: 3 + Fertilizer: + BonusRequirement: 4 + BonusAmount: 8 Chlorine: - Min: 1 - Max: 5 - PotencyDivisor: 5 + BaseAmount: 3 + Requirements: + Toxin: + Requirement: 3 + BonusRequirement: 7 + BonusAmount: 2 Vitamin: - Min: 1 - Max: 10 - PotencyDivisor: 3 + BaseAmount: 4 + Requirements: + Nutrient: + Requirement: 4 + BonusRequirement: 2 + BonusAmount: 3 + Fertilizer: + BonusRequirement: 0.6 + BonusAmount: 3 - type: seed id: cherry From 15025d982133efb080010a54d2a73a99c820882b Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Thu, 23 Jul 2026 22:19:47 -0500 Subject: [PATCH 36/61] banana and lemoon --- .../Prototypes/Hydroponics/Seeds/fruit.yml | 67 +++++++++++++------ 1 file changed, 48 insertions(+), 19 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/Seeds/fruit.yml b/Resources/Prototypes/Hydroponics/Seeds/fruit.yml index 839dbffb2ba..ff55c782780 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/fruit.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/fruit.yml @@ -1,4 +1,4 @@ -- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption +- type: seed id: banana name: seeds-banana-name noun: seeds-noun-seeds @@ -15,19 +15,31 @@ production: 6 yield: 2 idealLight: 9 - waterConsumption: 0.60 baseIdealHeat: 298 chemicals: Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 Nutriment: - Min: 1 - Max: 2 - PotencyDivisor: 50 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption +- type: seed # TODO: Convert mute toxin to the new system id: mimana name: seeds-mimana-name noun: seeds-noun-seeds @@ -42,7 +54,6 @@ production: 6 yield: 2 idealLight: 9 - waterConsumption: 0.60 baseIdealHeat: 298 chemicals: MuteToxin: @@ -50,9 +61,13 @@ Max: 5 PotencyDivisor: 20 Nutriment: - Min: 1 - Max: 2 - PotencyDivisor: 50 + BaseAmount: 1 + Requirements: + Water: + Requirement: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 - type: seed id: lemon @@ -116,13 +131,27 @@ idealLight: 8 chemicals: Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 Milk: - Min: 8 - Max: 20 - PotencyDivisor: 5 + BaseAmount: 10 + Requirements: + Water: + Requirement: 10 + Protein: + Requirement: 1 + BonusRequirement: 2 + BonusAmount: 10 - type: seed id: lime From 0e33e984d441096c325b587923b87cf5c04d9647 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Thu, 23 Jul 2026 22:27:18 -0500 Subject: [PATCH 37/61] replace idealHeat with baseIdealHeat in others.yml, update sugarcane --- .../Prototypes/Hydroponics/Seeds/other.yml | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/Seeds/other.yml b/Resources/Prototypes/Hydroponics/Seeds/other.yml index 567b8f2554f..8f5eb36d583 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/other.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/other.yml @@ -1,4 +1,4 @@ -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: sugarcane name: seeds-sugarcane-name noun: seeds-noun-seeds @@ -14,16 +14,18 @@ maturation: 6 production: 6 yield: 3 - potency: 10 growthStages: 3 - idealHeat: 298 + baseIdealHeat: 298 chemicals: Sugar: - Min: 4 - Max: 5 - PotencyDivisor: 5 + BaseAmount: 5 + Requirements: + Water: + Requirement: 2 + Nutrient: + Requirement: 3 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed id: papercane name: seeds-papercane-name noun: seeds-noun-seeds @@ -37,11 +39,15 @@ maturation: 6 production: 6 yield: 3 - potency: 10 growthStages: 3 - idealHeat: 298 + baseIdealHeat: 298 + Requirements: + Water: + Requirement: 2 + Nutrient: + Requirement: 3 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: eggy name: seeds-eggy-name noun: seeds-noun-seeds @@ -58,14 +64,14 @@ potency: 20 nutrientConsumption: 0.50 idealLight: 9 - idealHeat: 298 + baseIdealHeat: 298 chemicals: Egg: Min: 4 Max: 12 PotencyDivisor: 10 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: soybeans name: seeds-soybeans-name noun: seeds-noun-seeds @@ -90,7 +96,7 @@ Max: 2 PotencyDivisor: 50 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: koibean name: seeds-koibean-name noun: seeds-noun-seeds @@ -117,7 +123,7 @@ Max: 4 PotencyDivisor: 30 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: cocoa name: seeds-cocoa-name noun: seeds-noun-seeds @@ -134,7 +140,7 @@ idealLight: 7 waterConsumption: 1 nutrientConsumption: 0.8 - idealHeat: 298 + baseIdealHeat: 298 chemicals: Vitamin: Min: 1 @@ -145,7 +151,7 @@ Max: 2 PotencyDivisor: 50 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: pea name: seeds-pea-name noun: seeds-noun-seeds @@ -176,7 +182,7 @@ Max: 2 PotencyDivisor: 50 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: laughinPea name: seeds-laughin-pea-name noun: seeds-noun-seeds @@ -211,7 +217,7 @@ Max: 10 PotencyDivisor: 5 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: worldPea name: seeds-worldpea-name noun: seeds-noun-seeds @@ -244,7 +250,7 @@ Max: 2 PotencyDivisor: 50 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: cotton name: seeds-cotton-name noun: seeds-noun-seeds @@ -269,7 +275,7 @@ Max: 10 PotencyDivisor: 20 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: pyrotton name: seeds-pyrotton-name noun: seeds-noun-seeds From 242cce7d5e13ab00be156b51f4213fa4f959ce2e Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Thu, 23 Jul 2026 22:30:18 -0500 Subject: [PATCH 38/61] replace idealHeat with baseIdealHeat in all YAML files --- .../Prototypes/Hydroponics/Seeds/flowers.yml | 10 +++--- .../Prototypes/Hydroponics/Seeds/fungus.yml | 8 ++--- .../Prototypes/Hydroponics/Seeds/leaves.yml | 32 +++++++++---------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/Seeds/flowers.yml b/Resources/Prototypes/Hydroponics/Seeds/flowers.yml index cbb6aa94925..52eae7f596d 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/flowers.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/flowers.yml @@ -1,4 +1,4 @@ -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove water/nutrient Consumption id: poppy name: seeds-poppy-name noun: seeds-noun-seeds @@ -26,7 +26,7 @@ Max: 20 PotencyDivisor: 5 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove water/nutrient Consumption id: lily name: seeds-lily-name noun: seeds-noun-seeds @@ -54,7 +54,7 @@ Max: 20 PotencyDivisor: 5 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove water/nutrient Consumption id: spacemansTrumpet name: seeds-spacemans-trumpet-name noun: seeds-noun-seeds @@ -80,7 +80,7 @@ Max: 15 PotencyDivisor: 5 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove water/nutrient Consumption id: galaxythistle name: seeds-galaxythistle-name noun: seeds-noun-seeds @@ -102,7 +102,7 @@ Max: 25 PotencyDivisor: 4 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove water/nutrient Consumption id: glasstle name: seeds-glasstle-name noun: seeds-noun-seeds diff --git a/Resources/Prototypes/Hydroponics/Seeds/fungus.yml b/Resources/Prototypes/Hydroponics/Seeds/fungus.yml index e1359209123..a469767943d 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/fungus.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/fungus.yml @@ -45,7 +45,7 @@ baseIdealHeat: 425 baseHeatTolerance: 425 # Incredibly high heat tolerance, but using it comes with extra nutrient requirements. -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: chanterelle name: seeds-chanterelle-name noun: seeds-noun-spores @@ -63,14 +63,14 @@ lightTolerance: 6 waterConsumption: 0.60 nutrientConsumption: 0.50 - idealHeat: 288 + baseIdealHeat: 288 chemicals: Nutriment: Min: 1 Max: 25 PotencyDivisor: 25 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: lingzhi name: seeds-lingzhi-name noun: seeds-noun-spores @@ -96,7 +96,7 @@ Max: 20 PotencyDivisor: 5 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: flyAmanita name: seeds-flyamanita-name noun: seeds-noun-spores diff --git a/Resources/Prototypes/Hydroponics/Seeds/leaves.yml b/Resources/Prototypes/Hydroponics/Seeds/leaves.yml index 9d32e0d100b..1daf571d49c 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/leaves.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/leaves.yml @@ -1,4 +1,4 @@ -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: teaPlant name: seeds-teaplant-name noun: seeds-noun-seeds @@ -16,14 +16,14 @@ growthStages: 5 waterConsumption: 0.6 idealLight: 9 - idealHeat: 298 + baseIdealHeat: 298 chemicals: Vitamin: Min: 1 Max: 5 PotencyDivisor: 20 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: cabbage name: seeds-cabbage-name noun: seeds-noun-seeds @@ -48,7 +48,7 @@ Max: 4 PotencyDivisor: 25 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: cannabis name: seeds-cannabis-name noun: seeds-noun-seeds @@ -68,14 +68,14 @@ growthStages: 3 waterConsumption: 0.40 idealLight: 9 - idealHeat: 298 + baseIdealHeat: 298 chemicals: THC: Min: 1 Max: 10 PotencyDivisor: 10 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: rainbowCannabis name: seeds-rainbow-cannabis-name noun: seeds-noun-seeds @@ -93,7 +93,7 @@ growthStages: 3 waterConsumption: 0.40 idealLight: 9 - idealHeat: 298 + baseIdealHeat: 298 chemicals: SpaceDrugs: Min: 1 @@ -120,7 +120,7 @@ Max: 5 PotencyDivisor: 33 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: tobacco name: seeds-tobacco-name noun: seeds-noun-seeds @@ -138,14 +138,14 @@ growthStages: 3 waterConsumption: 0.40 idealLight: 9 - idealHeat: 298 + baseIdealHeat: 298 chemicals: Nicotine: Min: 1 Max: 10 PotencyDivisor: 10 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: nettle name: seeds-nettle-name noun: seeds-noun-seeds @@ -164,14 +164,14 @@ growthStages: 5 idealLight: 8 waterConsumption: 0.60 - idealHeat: 298 + baseIdealHeat: 298 chemicals: Histamine: Min: 1 Max: 25 PotencyDivisor: 4 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: deathNettle name: seeds-deathnettle-name noun: seeds-noun-seeds @@ -191,7 +191,7 @@ idealLight: 8 waterConsumption: 0.70 nutrientConsumption: 0.80 - idealHeat: 298 + baseIdealHeat: 298 chemicals: SulfuricAcid: Min: 1 @@ -202,7 +202,7 @@ Max: 15 PotencyDivisor: 6 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: aloe name: seeds-aloe-name noun: seeds-noun-seeds @@ -228,7 +228,7 @@ Max: 10 PotencyDivisor: 10 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: ambrosiaVulgaris name: seeds-ambrosiavulgaris-name noun: seeds-noun-seeds @@ -262,7 +262,7 @@ Max: 2 PotencyDivisor: 50 -- type: seed # TODO: Convert chemicals to the new system, remove potency, replace idealHeat with baseIdealHeat, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: ambrosiaDeus name: seeds-ambrosiadeus-name noun: seeds-noun-seeds From ba1121a83aa6afc24e558fc9a3f0263689232918 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Sat, 25 Jul 2026 20:12:28 -0500 Subject: [PATCH 39/61] Port omnizine change --- Resources/Prototypes/Hydroponics/Seeds/leaves.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/Seeds/leaves.yml b/Resources/Prototypes/Hydroponics/Seeds/leaves.yml index 1daf571d49c..679b9a55699 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/leaves.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/leaves.yml @@ -237,6 +237,8 @@ packetPrototype: AmbrosiaVulgarisSeeds productPrototypes: - FoodAmbrosiaVulgaris + mutationPrototypes: + - ambrosiaDeus lifespan: 25 maturation: 10 production: 3 @@ -270,7 +272,7 @@ plantRsi: Objects/Specific/Hydroponics/ambrosia_deus.rsi packetPrototype: AmbrosiaDeusSeeds productPrototypes: - - FoodAmbrosiaVulgaris + - FoodAmbrosiaDues lifespan: 25 maturation: 10 production: 3 @@ -283,7 +285,11 @@ Min: 1 Max: 2 PotencyDivisor: 10 - Omnizine: # Don't kill me + #Omnizine: # Don't kill me + #Min: 1 + #Max: 3 + #PotencyDivisor: 35 + Nectar: Min: 1 Max: 3 PotencyDivisor: 35 From 7c426a9a6cab5c91ab02e41f3687a85bc9864922 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 28 Jul 2026 17:47:56 -0500 Subject: [PATCH 40/61] tray & soil YAML changes. toxins & pests removed from plant analyzers --- .../PlantAnalyzer/PlantAnalyzerWindow.xaml | 16 ---------------- .../PlantAnalyzer/PlantAnalyzerWindow.xaml.cs | 12 ++---------- .../Botany/Systems/PlantAnalyzerSystem.cs | 8 ++------ .../PlantAnalyzerScannedUserMessage.cs | 8 +++----- .../components/plant-analyzer-component.ftl | 2 -- .../Entities/Structures/hydro_tray.yml | 8 +------- .../Prototypes/Entities/Structures/soil.yml | 4 +--- 7 files changed, 9 insertions(+), 49 deletions(-) diff --git a/Content.Client/Botany/PlantAnalyzer/PlantAnalyzerWindow.xaml b/Content.Client/Botany/PlantAnalyzer/PlantAnalyzerWindow.xaml index 95a5adc343d..3ab879daf1b 100644 --- a/Content.Client/Botany/PlantAnalyzer/PlantAnalyzerWindow.xaml +++ b/Content.Client/Botany/PlantAnalyzer/PlantAnalyzerWindow.xaml @@ -71,22 +71,6 @@ [Serializable, NetSerializable] -public sealed class PlantAnalyzerTolerancesData(float nutrientConsumption, float waterConsumption, float idealHeat, float heatTolerance, float idealLight, float lightTolerance, float toxinsTolerance, float lowPressureTolerance, float highPressureTolerance, float pestTolerance, float weedTolerance, List consumeGasses) +public sealed class PlantAnalyzerTolerancesData(float nutrientConsumption, float waterConsumption, float idealHeat, float heatTolerance, float idealLight, float lightTolerance, float idealPressure, float pressureTolerance, float weedTolerance, List consumeGasses) { public float WaterConsumption = waterConsumption; public float NutrientConsumption = nutrientConsumption; - public float ToxinsTolerance = toxinsTolerance; - public float PestTolerance = pestTolerance; public float WeedTolerance = weedTolerance; - public float IdealPressure = (lowPressureTolerance + highPressureTolerance) / 2; - public float PressureTolerance = (lowPressureTolerance + highPressureTolerance) / 2 - lowPressureTolerance; + public float IdealPressure = idealPressure; + public float PressureTolerance = pressureTolerance; public float IdealHeat = idealHeat; public float HeatTolerance = heatTolerance; public float IdealLight = idealLight; diff --git a/Resources/Locale/en-US/botany/components/plant-analyzer-component.ftl b/Resources/Locale/en-US/botany/components/plant-analyzer-component.ftl index 2d49d718600..7acac891e6d 100644 --- a/Resources/Locale/en-US/botany/components/plant-analyzer-component.ftl +++ b/Resources/Locale/en-US/botany/components/plant-analyzer-component.ftl @@ -84,8 +84,6 @@ plant-analyzer-printout = {"[bullet/]"} Growth profile: {" "}[bullet/] Water: [color=cyan]{$water}[/color] {" "}[bullet/] Nutrition: [color=orange]{$nutrients}[/color] - {" "}[bullet/] Toxins: [color=yellowgreen]{$toxins}[/color] - {" "}[bullet/] Pests: [color=magenta]{$pests}[/color] {" "}[bullet/] Weeds: [color=red]{$weeds}[/color] {"[bullet/]"} Environmental profile: {" "}[bullet/] Composition: [bold]{$gasesIn}[/bold] diff --git a/Resources/Prototypes/Entities/Structures/hydro_tray.yml b/Resources/Prototypes/Entities/Structures/hydro_tray.yml index b1cbcc8b863..df5f1a7f692 100644 --- a/Resources/Prototypes/Entities/Structures/hydro_tray.yml +++ b/Resources/Prototypes/Entities/Structures/hydro_tray.yml @@ -98,13 +98,7 @@ - Botany - Chemicals -- type: entity +- type: entity # No difference from normal tray after plant nutrients rework. Kept for compatibility parent: hydroponicsTray id: HydroponicsTrayEmpty suffix: Empty - components: - - type: PlantHolder - waterLevel: 0 - nutritionLevel: 0 - # for the lights to update immediately - updateSpriteAfterUpdate: true diff --git a/Resources/Prototypes/Entities/Structures/soil.yml b/Resources/Prototypes/Entities/Structures/soil.yml index 276b053157b..a71069dcd5e 100644 --- a/Resources/Prototypes/Entities/Structures/soil.yml +++ b/Resources/Prototypes/Entities/Structures/soil.yml @@ -57,6 +57,7 @@ solution: soil - type: Appearance - type: PlantHolderVisuals + - type: RadiationReceiver - type: entity parent: hydroponicsSoil @@ -71,6 +72,3 @@ sprite: Structures/Hydroponics/misc.rsi state: fungal_soil noRot: true - - type: PlantHolder - waterLevel: 0 - nutritionLevel: 0 From 0b6dba43ac37b4ec1405bcf984bddf4305ec44bc Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 28 Jul 2026 18:52:08 -0500 Subject: [PATCH 41/61] Trays and soil can now absorb radiation --- .../Botany/Systems/PlantHolderSystem.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index 91adc92ccc8..90a4e52ffdf 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -3,6 +3,7 @@ using Content.Server.Botany.Components; using Content.Server.Hands.Systems; using Content.Server.Popups; +using Content.Server.Radiation.Components; using Content.Shared.Administration.Logs; using Content.Shared.Atmos; using Content.Shared.Botany; @@ -477,6 +478,8 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) component.MutationLevel = 0; } + UpdateRadiation(uid, component); + // Weeds might need to be changed due to the plant nutrient rework if (CheckRequiredNutrients(uid, component)) { @@ -1013,6 +1016,23 @@ private void Mutate(EntityUid uid, float severity, PlantHolderComponent? compone } } + private void UpdateRadiation(EntityUid uid, PlantHolderComponent? component = null, RadiationReceiverComponent? receiver = null) + { + if (!Resolve(uid, ref component)) + return; + if (!Resolve(uid, ref receiver)) + return; + var currentRadiation = component.Nutrients.GetValueOrDefault("Radiation"); + var maxRadiation = receiver.CurrentRadiation * 10; + + if (currentRadiation >= maxRadiation) + return; + + var addRadiation = (maxRadiation - currentRadiation) / 10; + + AdjustNutrient(uid, addRadiation, "Radiation", component); + } + public void UpdateSprite(EntityUid uid, PlantHolderComponent? component = null) { if (!Resolve(uid, ref component)) From e04397cfc84fe56ac9014c13c78b41781f55cddd Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 28 Jul 2026 20:04:46 -0500 Subject: [PATCH 42/61] Plants absorb radiation faster --- Content.Server/Botany/Systems/PlantHolderSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index 90a4e52ffdf..3d9fc3d59b9 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -1028,7 +1028,7 @@ private void UpdateRadiation(EntityUid uid, PlantHolderComponent? component = nu if (currentRadiation >= maxRadiation) return; - var addRadiation = (maxRadiation - currentRadiation) / 10; + var addRadiation = (maxRadiation - currentRadiation) / 5; AdjustNutrient(uid, addRadiation, "Radiation", component); } From f832881fab6106148ad4e452fd24137a408e0155 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Tue, 28 Jul 2026 23:45:21 -0500 Subject: [PATCH 43/61] Add TODO comments to randomMutations.yml --- Resources/Prototypes/Hydroponics/randomMutations.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/randomMutations.yml b/Resources/Prototypes/Hydroponics/randomMutations.yml index 2d45601da9b..72901f62931 100644 --- a/Resources/Prototypes/Hydroponics/randomMutations.yml +++ b/Resources/Prototypes/Hydroponics/randomMutations.yml @@ -28,7 +28,7 @@ persists: false effect: !type:PlantChangeStat targetValue: Viable - - name: ChangeWaterConsumption + - name: ChangeWaterConsumption # TODO: Remove this baseOdds: 0.018 persists: false effect: !type:PlantChangeStat @@ -36,7 +36,7 @@ minValue: 0.3 maxValue: 0.9 steps: 5 - - name: ChangeNutrientConsumption + - name: ChangeNutrientConsumption # TODO: Remove this baseOdds: 0.018 persists: false effect: !type:PlantChangeStat @@ -60,7 +60,7 @@ minValue: 2 maxValue: 25 steps: 5 - - name: ChangeToxinsTolerance + - name: ChangeToxinsTolerance # TODO: Remove this baseOdds: 0.018 persists: false effect: !type:PlantChangeStat @@ -68,7 +68,7 @@ minValue: 1 maxValue: 10 steps: 5 - - name: ChangeLowPressureTolerance + - name: ChangeLowPressureTolerance # TODO: Update this baseOdds: 0.018 persists: false effect: !type:PlantChangeStat @@ -76,7 +76,7 @@ minValue: 60 maxValue: 100 steps: 5 - - name: ChangeHighPressureTolerance + - name: ChangeHighPressureTolerance # TODO: Update this baseOdds: 0.018 persists: false effect: !type:PlantChangeStat @@ -84,7 +84,7 @@ minValue: 100 maxValue: 140 steps: 5 - - name: ChangePestTolerance + - name: ChangePestTolerance # TODO: Remove this baseOdds: 0.018 persists: false effect: !type:PlantChangeStat From 7ec90cc51e077a16c61d96c8754d7e7141ad1fa5 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Fri, 31 Jul 2026 12:38:16 -0500 Subject: [PATCH 44/61] Easy leaves done --- .../Prototypes/Hydroponics/Seeds/leaves.yml | 110 ++++++++++++------ 1 file changed, 76 insertions(+), 34 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/Seeds/leaves.yml b/Resources/Prototypes/Hydroponics/Seeds/leaves.yml index 679b9a55699..51fc1f058f5 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/leaves.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/leaves.yml @@ -1,4 +1,4 @@ -- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption +- type: seed id: teaPlant name: seeds-teaplant-name noun: seeds-noun-seeds @@ -12,18 +12,27 @@ maturation: 5 production: 3 yield: 2 - potency: 20 growthStages: 5 - waterConsumption: 0.6 idealLight: 9 baseIdealHeat: 298 chemicals: Vitamin: - Min: 1 - Max: 5 - PotencyDivisor: 20 + BaseAmount: 2 + Requirements: + Water: + Requirement: 1 + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 -- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption +- type: seed id: cabbage name: seeds-cabbage-name noun: seeds-noun-seeds @@ -36,19 +45,33 @@ maturation: 7 production: 5 yield: 3 - potency: 10 growthStages: 1 chemicals: Nutriment: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 2 + Requirements: + Water: + Requirement: 2 + Fertilizer: + BonusRequirement: 0.8 + BonusAmount: 4 + CarbonDioxide: + BonusRequirement: 0.4 + BonusAmount: 4 Vitamin: - Min: 1 - Max: 4 - PotencyDivisor: 25 - -- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption + BaseAmount: 1 + Requirements: + Nutrient: + Requirement: 1 + BonusRequirement: 1 + BonusAmount: 1 + Fertilizer: + BonusRequirement: 0.2 + BonusAmount: 1 + CarbonDioxide: + BonusRequirement: 0.1 + BonusAmount: 1 +- type: seed id: cannabis name: seeds-cannabis-name noun: seeds-noun-seeds @@ -66,14 +89,20 @@ yield: 2 potency: 20 growthStages: 3 - waterConsumption: 0.40 idealLight: 9 baseIdealHeat: 298 chemicals: THC: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 3 + Requirements: + Nutrient: + Requirement: 3 + Fertilizer: + BonusRequirement: 0.6 + BonusAmount: 3 + CarbonDioxide: + BonusRequirement: 0.4 + BonusAmount: 4 - type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: rainbowCannabis @@ -120,7 +149,7 @@ Max: 5 PotencyDivisor: 33 -- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption +- type: seed id: tobacco name: seeds-tobacco-name noun: seeds-noun-seeds @@ -134,18 +163,23 @@ maturation: 5 production: 5 yield: 2 - potency: 20 growthStages: 3 - waterConsumption: 0.40 idealLight: 9 baseIdealHeat: 298 chemicals: Nicotine: - Min: 1 - Max: 10 - PotencyDivisor: 10 + BaseAmount: 3 + Requirements: + Nutrient: + Requirement: 3 + Fertilizer: + BonusRequirement: 0.6 + BonusAmount: 3 + CarbonDioxide: + BonusRequirement: 0.4 + BonusAmount: 4 -- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption +- type: seed id: nettle name: seeds-nettle-name noun: seeds-noun-seeds @@ -160,16 +194,23 @@ maturation: 8 production: 6 yield: 2 - potency: 20 growthStages: 5 idealLight: 8 - waterConsumption: 0.60 baseIdealHeat: 298 chemicals: Histamine: - Min: 1 - Max: 25 - PotencyDivisor: 4 + BaseAmount: 6 + Requirements: + Nutrient: + Requirement: 3 + Water: + Requirement: 3 + Fertilizer: + BonusRequirement: 0.5 + BonusAmount: 6.5 + CarbonDioxide: + BonusRequirement: 1 + BonusAmount: 12.5 - type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: deathNettle @@ -197,10 +238,12 @@ Min: 1 Max: 15 PotencyDivisor: 6 + BaseAmount: 4 FluorosulfuricAcid: Min: 1 Max: 15 PotencyDivisor: 6 + BaseAmount: 4 - type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption id: aloe @@ -228,7 +271,7 @@ Max: 10 PotencyDivisor: 10 -- type: seed # TODO: Convert chemicals to the new system, remove potency, remove water/nutrient Consumption +- type: seed # TODO: Convert chemicals to the new system, remove potency id: ambrosiaVulgaris name: seeds-ambrosiavulgaris-name noun: seeds-noun-seeds @@ -245,7 +288,6 @@ yield: 3 potency: 10 growthStages: 6 - waterConsumption: 0.60 chemicals: Nutriment: Min: 1 From 6cf0cdf5245739c25a9b6ba073de7f8a885a9029 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Thu, 6 Aug 2026 23:58:49 -0500 Subject: [PATCH 45/61] Philosophor's stone based gold recipe and required nutrients added. --- .../Locale/en-US/botany/plant-nutrients.ftl | 13 ++++++++-- .../Prototypes/Hydroponics/Seeds/fruit.yml | 23 +++++++++++----- .../Prototypes/Hydroponics/nutrients.yml | 26 ++++++++++++++++--- Resources/Prototypes/Reagents/biological.yml | 4 +++ Resources/Prototypes/Reagents/elements.yml | 8 ++++++ Resources/Prototypes/Reagents/medicine.yml | 4 +++ 6 files changed, 65 insertions(+), 13 deletions(-) diff --git a/Resources/Locale/en-US/botany/plant-nutrients.ftl b/Resources/Locale/en-US/botany/plant-nutrients.ftl index 3039487e842..61de0775f8c 100644 --- a/Resources/Locale/en-US/botany/plant-nutrients.ftl +++ b/Resources/Locale/en-US/botany/plant-nutrients.ftl @@ -46,14 +46,23 @@ nutrient-desc-silver = OOoo. nutrient-name-titanium = titanium nutrient-desc-titanium = Strong metal dust. +nutrient-name-tin = tin +nutrient-desc-tin = Stron + nutrient-name-clown = clown essence nutrient-desc-clown = Honk! -nutrient-name-plasma = plasma -nutrient-desc-plasma = Magic purple space whatever +nutrient-name-sapient = Smart reagent think of better name +nutrient-desc-sapient = The stuff i would need to make a better description for this nutrient-name-carbonDioxide = carbon dioxide nutrient-desc-carbonDioxide = Photosynthesis. Supposed to only be added to plants via respiration +nutrient-name-hydrogen = hydrogen +nutrient-desc-hydrogen = Very small atoms + +nutrient-name-plasma = plasma +nutrient-desc-plasma = Magic purple space whatever + nutrient-name-frezon = frezon nutrient-desc-frezon = Description goes here. diff --git a/Resources/Prototypes/Hydroponics/Seeds/fruit.yml b/Resources/Prototypes/Hydroponics/Seeds/fruit.yml index ff55c782780..3d6b80e93c0 100644 --- a/Resources/Prototypes/Hydroponics/Seeds/fruit.yml +++ b/Resources/Prototypes/Hydroponics/Seeds/fruit.yml @@ -599,8 +599,8 @@ packetPrototype: AppleSeeds productPrototypes: - FoodApple - # mutationPrototypes: - # - goldenApple + mutationPrototypes: + - goldenApple harvestRepeat: Repeat lifespan: 55 maturation: 6 @@ -633,7 +633,7 @@ BonusRequirement: 0.1 BonusAmount: 1 -- type: seed # TODO: Convert Doctor's Delight to the new system. +- type: seed id: goldenApple name: seeds-goldenapple-name noun: seeds-noun-seeds @@ -673,10 +673,19 @@ CarbonDioxide: BonusRequirement: 0.1 BonusAmount: 1 - DoctorsDelight: - Min: 3 - Max: 13 - PotencyDivisor: 10 + Gold: # Based vaguely off of my understanding of the magnum opus (process of creating philosopher's stone) from Wikipedia. + BaseAmount: 10 + Requirements: + Tin: # Base metal + Requirement: 10 + Toxin: # Nigredo = Decomposition = Toxic + Requirement: 2 + Acid: # Albedo = Washing away impurities. Making a nutrient that requires space cleaner seemed strange, so i used acid instead. + Requirement: 2 + Hydrogen: # Citrinitas = Solar light inherent in ones being = Stars? = Hydrogen + Requirement: 2 + Sapient: # Rubedo = Ego/self? + Requirement: 2 - type: seed id: chili diff --git a/Resources/Prototypes/Hydroponics/nutrients.yml b/Resources/Prototypes/Hydroponics/nutrients.yml index 859fd01fa39..812c49adf03 100644 --- a/Resources/Prototypes/Hydroponics/nutrients.yml +++ b/Resources/Prototypes/Hydroponics/nutrients.yml @@ -94,6 +94,12 @@ desc: nutrient-desc-titanium color: "#d0d0d0" +- type: plantNutrient + id: Tin + name: nutrient-name-tin + desc: nutrient-desc-tin + color: "#c0c0c0" + - type: plantNutrient id: Clown name: nutrient-name-clown @@ -101,10 +107,10 @@ color: "#FF4DD2" - type: plantNutrient - id: Plasma - name: nutrient-name-plasma - desc: nutrient-desc-plasma - color: "#7e009e" + id: Sapient + name: nutrient-name-sapient + desc: nutrient-desc-sapient + color: "#b50ee8" - type: plantNutrient id: CarbonDioxide @@ -112,6 +118,18 @@ desc: nutrient-desc-carbonDioxide color: "#66ff33" +- type: plantNutrient + id: Hydrogen + name: nutrient-name-hydrogen + desc: nutrient-desc-hydrogen + color: "#cccccc" + +- type: plantNutrient + id: Plasma + name: nutrient-name-plasma + desc: nutrient-desc-plasma + color: "#7e009e" + - type: plantNutrient id: Frezon name: nutrient-name-frezon diff --git a/Resources/Prototypes/Reagents/biological.yml b/Resources/Prototypes/Reagents/biological.yml index 7fbfa15bbd0..ab7dfe20ff2 100644 --- a/Resources/Prototypes/Reagents/biological.yml +++ b/Resources/Prototypes/Reagents/biological.yml @@ -273,3 +273,7 @@ damage: types: Cellular: 2 + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 10 # I love murder + nutrient: Sapient diff --git a/Resources/Prototypes/Reagents/elements.yml b/Resources/Prototypes/Reagents/elements.yml index af97b3d6046..3c4235939e5 100644 --- a/Resources/Prototypes/Reagents/elements.yml +++ b/Resources/Prototypes/Reagents/elements.yml @@ -178,6 +178,10 @@ minScale: 1.5 clear: True time: 5 + plantMetabolism: # Remove when plant respiration is added + - !type:PlantAdjustNutrient + amount: 1 + nutrient: Hydrogen - type: reagent id: Iodine @@ -408,6 +412,10 @@ color: "#c0c0c0" boilingPoint: 2602.0 meltingPoint: 231.93 + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: Tin - type: reagent id: Sulfur diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index d89afc4f696..84f4cdd4ecf 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -956,6 +956,10 @@ - !type:ReagentCondition reagent: Cognizine min: 5 + plantMetabolism: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: Sapient - type: reagent id: Ethyloxyephedrine From db92cae68955960075a66525b20e47366d6462db Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Fri, 7 Aug 2026 00:05:57 -0500 Subject: [PATCH 46/61] Golden apples don't juice into gold. TODO Comment added to produce.yml --- .../Entities/Objects/Consumable/Food/produce.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml index dc06f48cace..9f808ee23e7 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml @@ -44,7 +44,7 @@ grindableSolutionName: food # Subclasses - +# TODO: Change reagent contents of all produce to match post-rework values - type: entity name: wheat bushel description: Sigh... wheat... a-grain? @@ -1146,8 +1146,8 @@ Quantity: 10 - ReagentId: Vitamin Quantity: 4 - - ReagentId: DoctorsDelight - Quantity: 13 + - ReagentId: Gold + Quantity: 10 - type: Sprite sprite: Objects/Specific/Hydroponics/golden_apple.rsi - type: Item @@ -1159,8 +1159,6 @@ reagents: - ReagentId: JuiceApple Quantity: 10 - - ReagentId: Gold - Quantity: 10 - type: Tag tags: - Fruit From c7e9c92c9c56bf49258d7d0aa213ac9baeb1909e Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Fri, 7 Aug 2026 16:50:13 -0500 Subject: [PATCH 47/61] Comment out several mutations in randomMutations.yml --- .../Hydroponics/randomMutations.yml | 88 +++++++++---------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/randomMutations.yml b/Resources/Prototypes/Hydroponics/randomMutations.yml index 72901f62931..20ea3681cd8 100644 --- a/Resources/Prototypes/Hydroponics/randomMutations.yml +++ b/Resources/Prototypes/Hydroponics/randomMutations.yml @@ -28,22 +28,22 @@ persists: false effect: !type:PlantChangeStat targetValue: Viable - - name: ChangeWaterConsumption # TODO: Remove this - baseOdds: 0.018 - persists: false - effect: !type:PlantChangeStat - targetValue: WaterConsumption - minValue: 0.3 - maxValue: 0.9 - steps: 5 - - name: ChangeNutrientConsumption # TODO: Remove this - baseOdds: 0.018 - persists: false - effect: !type:PlantChangeStat - targetValue: NutrientConsumption - minValue: 0.05 - maxValue: 1.2 - steps: 5 +# - name: ChangeWaterConsumption Persistence: Plant nutrient rework +# baseOdds: 0.018 +# persists: false +# effect: !type:PlantChangeStat +# targetValue: WaterConsumption +# minValue: 0.3 +# maxValue: 0.9 +# steps: 5 +# - name: ChangeNutrientConsumption +# baseOdds: 0.018 +# persists: false +# effect: !type:PlantChangeStat +# targetValue: NutrientConsumption +# minValue: 0.05 +# maxValue: 1.2 +# steps: 5 - name: ChangeIdealHeat baseOdds: 0.018 persists: false @@ -60,14 +60,14 @@ minValue: 2 maxValue: 25 steps: 5 - - name: ChangeToxinsTolerance # TODO: Remove this - baseOdds: 0.018 - persists: false - effect: !type:PlantChangeStat - targetValue: ToxinsTolerance - minValue: 1 - maxValue: 10 - steps: 5 +# - name: ChangeToxinsTolerance Persistence: Plant Nutrient Rework +# baseOdds: 0.018 +# persists: false +# effect: !type:PlantChangeStat +# targetValue: ToxinsTolerance +# minValue: 1 +# maxValue: 10 +# steps: 5 - name: ChangeLowPressureTolerance # TODO: Update this baseOdds: 0.018 persists: false @@ -84,14 +84,14 @@ minValue: 100 maxValue: 140 steps: 5 - - name: ChangePestTolerance # TODO: Remove this - baseOdds: 0.018 - persists: false - effect: !type:PlantChangeStat - targetValue: PestTolerance - minValue: 0 - maxValue: 15 - steps: 5 +# - name: ChangePestTolerance # Persistence: Plant Nutrient Rework +# baseOdds: 0.018 +# persists: false +# effect: !type:PlantChangeStat +# targetValue: PestTolerance +# minValue: 0 +# maxValue: 15 +# steps: 5 - name: ChangeWeedTolerance baseOdds: 0.018 persists: false @@ -140,14 +140,14 @@ minValue: 1 maxValue: 10 steps: 5 - - name: ChangePotency - baseOdds: 0.036 - persists: false - effect: !type:PlantChangeStat - targetValue: Potency - minValue: 30 - maxValue: 100 - steps: 5 +# - name: ChangePotency Persistence: Plant Nutrient Rework +# baseOdds: 0.036 +# persists: false +# effect: !type:PlantChangeStat +# targetValue: Potency +# minValue: 30 +# maxValue: 100 +# steps: 5 - name: ChangeSeedless baseOdds: 0.036 persists: false @@ -176,10 +176,10 @@ baseOdds: 0.0145 persists: false effect: !type:PlantMutateExudeGases - - name: ChangeConsumeGasses - baseOdds: 0.0036 - persists: false - effect: !type:PlantMutateConsumeGases +# - name: ChangeConsumeGasses Persistence: Plant Nutrient Rework +# baseOdds: 0.0036 +# persists: false +# effect: !type:PlantMutateConsumeGases - name: ChangeHarvest baseOdds: 0.036 persists: false From 79e868ce02c9d789715b510e2d00e0db4d61b59d Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Fri, 7 Aug 2026 17:16:05 -0500 Subject: [PATCH 48/61] Added comments indicating changed code to PlantHolderSystem.cs --- .../Botany/Systems/PlantHolderSystem.cs | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index 3d9fc3d59b9..887052b80bb 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -149,7 +149,7 @@ private void OnExamine(Entity entity, ref ExaminedEvent ar if (component.PestLevel >= 5) args.PushMarkup(Loc.GetString("plant-holder-component-pest-high-level-message")); - foreach (var nutrientId in GetSortedNutrientIds(entity, component)) + foreach (var nutrientId in GetSortedNutrientIds(entity, component)) // Persistence: Nutrient rework { var nutrient = _prototype.Index(nutrientId); var requirement = FixedPoint2.Zero; @@ -478,10 +478,8 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) component.MutationLevel = 0; } - UpdateRadiation(uid, component); - // Weeds might need to be changed due to the plant nutrient rework - if (CheckRequiredNutrients(uid, component)) + if (CheckRequiredNutrients(uid, component)) // Persistence: Plant Nutrient Rework { var chance = 0f; if (component.Seed == null) @@ -523,14 +521,17 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) return; } + UpdateRadiation(uid, component); // Persistence: Plant Nutrient Rework + // There's a small chance the pest population increases. // Can only happen when there's a live seed planted. + /* Persistence: Plant Nutrient Rework if (_random.Prob(0.01f)) { component.PestLevel += 0.5f * HydroponicsSpeedMultiplier; if (component.DrawWarnings) component.UpdateSpriteAfterUpdate = true; - } + }*/ // Advance plant age here. if (component.SkipAging > 0) @@ -557,11 +558,11 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) if (component.SkipAging < 10) { // Make sure the plant is not starving. - if (CheckRequiredNutrients(uid, component)) + if (CheckRequiredNutrients(uid, component)) // Persistence: Plant Nutrient Rework { component.Health += Convert.ToInt32(_random.Prob(0.7f)) * healthMod; } - else if (component.HarvestAge) + else if (component.HarvestAge) // Persistence: Plant Nutrient Rework { AffectGrowth(uid, -1, component); component.Health -= healthMod; @@ -595,7 +596,7 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) } } - // SeedPrototype pressure resistance. + // SeedPrototype pressure resistance. Persistence: Changed pressure to use ideal pressure and tolerance like heat does var pressure = environment.Pressure; var lowPressure = pressure < component.Seed.IdealPressure - component.Seed.PressureTolerance; @@ -637,7 +638,7 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) } } - // Toxin levels beyond the plant's tolerance cause damage. + // Toxin levels beyond the plant's tolerance cause damage. Persistence: Commented out toxins, due to them being converted into a nutrient // They are, however, slowly reduced over time. /*if (component.Toxins > 0) { @@ -652,7 +653,7 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) component.UpdateSpriteAfterUpdate = true; } - // Weed levels. + // Weed levels. ersistence: Commented out pests, due to them being converted into a nutrient if (component.PestLevel > 0) { // TODO: Carnivorous plants? @@ -777,7 +778,7 @@ public bool DoHarvest(EntityUid plantholder, EntityUid user, PlantHolderComponen return false; } - if (!CheckRequiredNutrients(plantholder, component)) // This should only happen if a reagent that removes nutrients is added to the plant. + if (!CheckRequiredNutrients(plantholder, component)) //Persistence: Plant Nutrient Rework, This should only happen if a reagent that removes nutrients is added to the plant. { _popup.PopupCursor(Loc.GetString("plant-holder-component-low-nutrient-cant-harvest-message"), user); component.Harvest = false; @@ -932,7 +933,7 @@ public void AffectGrowth(EntityUid uid, int amount, PlantHolderComponent? compon } } - public void AdjustNutrient(EntityUid uid, FixedPoint2 amount, ProtoId nutrientId, PlantHolderComponent? component = null) + public void AdjustNutrient(EntityUid uid, FixedPoint2 amount, ProtoId nutrientId, PlantHolderComponent? component = null) // Persistence: Plant Nutrient Rework { if (!Resolve(uid, ref component)) return; @@ -948,7 +949,7 @@ public void AdjustNutrient(EntityUid uid, FixedPoint2 amount, ProtoId nutrient, PlantHolderComponent? component = null) + private void RemoveEmptyNutrient(EntityUid uid, ProtoId nutrient, PlantHolderComponent? component = null) // Persistence: Plant Nutrient Rework { if (!Resolve(uid, ref component)) return; @@ -958,7 +959,7 @@ private void RemoveEmptyNutrient(EntityUid uid, ProtoId } - public bool CheckRequiredNutrients(EntityUid uid, PlantHolderComponent? component = null) + public bool CheckRequiredNutrients(EntityUid uid, PlantHolderComponent? component = null) // Persistence: Plant Nutrient Rework { if (!Resolve(uid, ref component)) return false; @@ -1016,7 +1017,7 @@ private void Mutate(EntityUid uid, float severity, PlantHolderComponent? compone } } - private void UpdateRadiation(EntityUid uid, PlantHolderComponent? component = null, RadiationReceiverComponent? receiver = null) + private void UpdateRadiation(EntityUid uid, PlantHolderComponent? component = null, RadiationReceiverComponent? receiver = null) // Persistence: Plant Nutrient Rework { if (!Resolve(uid, ref component)) return; From 91ad840354dddafa837c4e21ba4c22b960b4ae26 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Fri, 7 Aug 2026 18:15:42 -0500 Subject: [PATCH 49/61] Remove extra dependancy added in BotanySwabSystem.cs --- Content.Server/Botany/Systems/BotanySwabSystem.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Content.Server/Botany/Systems/BotanySwabSystem.cs b/Content.Server/Botany/Systems/BotanySwabSystem.cs index 053010053f0..e8c7af92c27 100644 --- a/Content.Server/Botany/Systems/BotanySwabSystem.cs +++ b/Content.Server/Botany/Systems/BotanySwabSystem.cs @@ -12,7 +12,6 @@ public sealed class BotanySwabSystem : EntitySystem [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly MutationSystem _mutationSystem = default!; - [Dependency] private readonly PlantHolderSystem _plantHolderSystem = default!; public override void Initialize() { From aabfb9446b97569db2886f64e957829625e5d92d Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Fri, 7 Aug 2026 18:19:12 -0500 Subject: [PATCH 50/61] Comments added to MutationSystem.cs --- Content.Server/Botany/Systems/MutationSystem.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/Botany/Systems/MutationSystem.cs b/Content.Server/Botany/Systems/MutationSystem.cs index 289f5d8ac0c..da392117f81 100644 --- a/Content.Server/Botany/Systems/MutationSystem.cs +++ b/Content.Server/Botany/Systems/MutationSystem.cs @@ -56,7 +56,7 @@ public void MutateSeed(EntityUid plantHolder, ref SeedData seed, float severity) CheckRandomMutations(plantHolder, ref seed, severity); } - public SeedData Cross(SeedData a, SeedData b) + public SeedData Cross(SeedData a, SeedData b) // Persistence: Toxin and pest tolerances removed due to them becoming nutrients. Heat and pressure tolerances removed due to them being balanced around the species of the plant. { SeedData result = b.Clone(); @@ -95,7 +95,7 @@ public SeedData Cross(SeedData a, SeedData b) result.Seedless = true; } - result.ApplyModifiers(); + result.ApplyModifiers(); // Persistence: Plant nutrient rework return result; } From e4d11322154e10b5d9136fdaaa2c6e75da4178f5 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Fri, 7 Aug 2026 18:33:50 -0500 Subject: [PATCH 51/61] Plant respiration added to reagents --- .../Botany/Systems/PlantHolderSystem.cs | 32 ++++++++++++--- Resources/Prototypes/Reagents/elements.yml | 2 +- Resources/Prototypes/Reagents/gases.yml | 40 +++++++++---------- 3 files changed, 46 insertions(+), 28 deletions(-) diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index 887052b80bb..da87abe5ded 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -574,7 +574,7 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) var environment = _atmosphere.GetContainingMixture(uid, true, true) ?? GasMixture.SpaceGas; - component.MissingGas = 0; + /*component.MissingGas = 0; Persistence: Nutrient rework if (component.Seed.ConsumeGasses.Count > 0) { foreach (var (gas, amount) in component.Seed.ConsumeGasses) @@ -594,7 +594,7 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) if (component.DrawWarnings) component.UpdateSpriteAfterUpdate = true; } - } + }*/ // SeedPrototype pressure resistance. Persistence: Changed pressure to use ideal pressure and tolerance like heat does var pressure = environment.Pressure; @@ -627,8 +627,8 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) component.LowPressure = lowPressure; component.HighPressure = highPressure; - // Gas production. - var exudeCount = component.Seed.ExudeGasses.Count; + // Gas production. Persistence: Nutrient rework, Logic moved to UpdateGasses + /*var exudeCount = component.Seed.ExudeGasses.Count; if (exudeCount > 0) { foreach (var (gas, amount) in component.Seed.ExudeGasses) @@ -636,7 +636,9 @@ public void Update(EntityUid uid, PlantHolderComponent? component = null) environment.AdjustMoles(gas, MathF.Max(1f, MathF.Round(amount * MathF.Round(component.Seed.Potency) / exudeCount))); } - } + }*/ + + UpdateGasses(uid, environment, component); // Persistence: Nutrient rework // Toxin levels beyond the plant's tolerance cause damage. Persistence: Commented out toxins, due to them being converted into a nutrient // They are, however, slowly reduced over time. @@ -1034,6 +1036,26 @@ private void UpdateRadiation(EntityUid uid, PlantHolderComponent? component = nu AdjustNutrient(uid, addRadiation, "Radiation", component); } + private void UpdateGasses(EntityUid uid, GasMixture environment, PlantHolderComponent? component = null) // Persistence: Plant nutrient rework + { + if (!Resolve(uid, ref component)) + return; + + if (component.Seed == null) + return; + + var exudeCount = component.Seed.ExudeGasses.Count; + if (exudeCount > 0) + { + foreach (var (gas, amount) in component.Seed.ExudeGasses) + { + environment.AdjustMoles(gas, + MathF.Max(1f, MathF.Round(amount * MathF.Round(component.Seed.Potency) / exudeCount))); + } + } + + } + public void UpdateSprite(EntityUid uid, PlantHolderComponent? component = null) { if (!Resolve(uid, ref component)) diff --git a/Resources/Prototypes/Reagents/elements.yml b/Resources/Prototypes/Reagents/elements.yml index 3c4235939e5..14c859b21f5 100644 --- a/Resources/Prototypes/Reagents/elements.yml +++ b/Resources/Prototypes/Reagents/elements.yml @@ -178,7 +178,7 @@ minScale: 1.5 clear: True time: 5 - plantMetabolism: # Remove when plant respiration is added + plantRespiration: - !type:PlantAdjustNutrient amount: 1 nutrient: Hydrogen diff --git a/Resources/Prototypes/Reagents/gases.yml b/Resources/Prototypes/Reagents/gases.yml index d19f3563357..fe4b8f77409 100644 --- a/Resources/Prototypes/Reagents/gases.yml +++ b/Resources/Prototypes/Reagents/gases.yml @@ -91,10 +91,10 @@ - !type:PlantAdjustNutrient amount: 1 nutrient: Plasma -# plantRespiration: -# - !type:PlantAdjustNutrient -# amount: 1 -# nutrient: Plasma + plantRespiration: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: Plasma metabolisms: Bloodstream: effects: @@ -149,12 +149,12 @@ nutrient: Radiation - !type:PlantAdjustMutationLevel amount: 1 -# plantRespiration: -# - !type:PlantAdjustNutrient -# amount: 1.5 -# nutrient: radiation -# - !type:PlantAdjustMutationLevel -# amount: 1 + plantRespiration: + - !type:PlantAdjustNutrient + amount: 1.5 + nutrient: radiation + - !type:PlantAdjustMutationLevel + amount: 1 metabolisms: Bloodstream: effects: @@ -184,14 +184,10 @@ physicalDesc: reagent-physical-desc-odorless flavor: bitter color: "#66ff33" - plantMetabolism: - - !type:PlantAdjustNutrient # TODO: Remove this when plant respiration is implemented - amount: 0.05 - nutrient: CarbonDioxide - # plantRespiration: - # - !type:PlantAdjustNutrient - # amount: 1 - # nutrient: CarbonDioxide + plantRespiration: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: CarbonDioxide metabolisms: Bloodstream: effects: @@ -374,10 +370,10 @@ - !type:PlantAdjustNutrient amount: 1 nutrient: Frezon - # plantRespiration: - # - !type:PlantAdjustNutrient - # amount: 1 - # nutrient: Frezon + plantRespiration: + - !type:PlantAdjustNutrient + amount: 1 + nutrient: Frezon metabolisms: Bloodstream: effects: From 8bd361ed63efd11048530306a19860031e3dc784 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Fri, 7 Aug 2026 19:16:55 -0500 Subject: [PATCH 52/61] Plant respiration added to the guidebook --- .../Guidebook/Controls/GuideReagentEmbed.xaml | 11 ++++++ .../Controls/GuideReagentEmbed.xaml.cs | 34 +++++++++++++++++++ .../Chemistry/Reagent/ReagentPrototype.cs | 10 ++++++ .../Locale/en-US/guidebook/chemistry/core.ftl | 2 ++ 4 files changed, 57 insertions(+) diff --git a/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml b/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml index 73a17e9bcc9..b694d284532 100644 --- a/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml +++ b/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml @@ -58,6 +58,17 @@ + + + + + + + + diff --git a/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml.cs b/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml.cs index f0028d884ee..8b575a764c9 100644 --- a/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml.cs +++ b/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml.cs @@ -221,6 +221,40 @@ private void GenerateControl(ReagentPrototype reagent) } #endregion + //Persistence: Plant nutrient rework + #region PlantRespiration + if (_chemistryGuideData.ReagentGuideRegistry.TryGetValue(reagent.ID, out var guideEntryRegistryPlantRespiration) && + guideEntryRegistryPlantRespiration.PlantRespiration != null && + guideEntryRegistryPlantRespiration.PlantRespiration.Count > 0) + { + PlantRespirationDescriptionContainer.Children.Clear(); + var metabolismLabel = new RichTextLabel(); + metabolismLabel.SetMarkup(Loc.GetString("guidebook-reagent-plant-metabolisms-rate")); + var descriptionLabel = new RichTextLabel + { + Margin = new Thickness(25, 0, 10, 0) + }; + var descMsg = new FormattedMessage(); + var descriptionsCount = guideEntryRegistryPlantRespiration.PlantRespiration.Count; + var i = 0; + foreach (var effectString in guideEntryRegistryPlantRespiration.PlantRespiration) + { + descMsg.AddMarkupOrThrow(effectString); + i++; + if (i < descriptionsCount) + descMsg.PushNewline(); + } + descriptionLabel.SetMessage(descMsg); + + PlantRespirationDescriptionContainer.AddChild(metabolismLabel); + PlantRespirationDescriptionContainer.AddChild(descriptionLabel); + } + else + { + PlantRespirationContainer.Visible = false; + } + #endregion + GenerateSources(reagent); FormattedMessage description = new(); diff --git a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs index 85102ddfa6d..496d50c5ebf 100644 --- a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs +++ b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs @@ -180,6 +180,9 @@ public sealed partial class ReagentPrototype : IPrototype, IInheritingPrototype [DataField("plantMetabolism")] public List PlantMetabolisms = new(0); + [DataField("plantRespiration")] + public List PlantRespiration = new(0); // Persistence: Plant nutrient rework + [DataField] public float PricePerUnit; @@ -246,6 +249,8 @@ public struct ReagentGuideEntry public List? PlantMetabolisms = null; + public List? PlantRespiration = null; // Persistence: Plant nutrient rework + public ReagentGuideEntry(ReagentPrototype proto, IPrototypeManager prototype, IEntitySystemManager entSys) { ReagentPrototype = proto.ID; @@ -257,6 +262,11 @@ public ReagentGuideEntry(ReagentPrototype proto, IPrototypeManager prototype, IE PlantMetabolisms = new List(proto.GuidebookReagentEffectsDescription(prototype, entSys, proto.PlantMetabolisms, FixedPoint2.New(1f))); } + if (proto.PlantRespiration.Count > 0) // Persistence: Plant nutrient rework + { + PlantRespiration = + new List(proto.GuidebookReagentEffectsDescription(prototype, entSys, proto.PlantRespiration, FixedPoint2.New(1f))); + } } } diff --git a/Resources/Locale/en-US/guidebook/chemistry/core.ftl b/Resources/Locale/en-US/guidebook/chemistry/core.ftl index 502675bd9e8..702028c2f6b 100644 --- a/Resources/Locale/en-US/guidebook/chemistry/core.ftl +++ b/Resources/Locale/en-US/guidebook/chemistry/core.ftl @@ -22,6 +22,8 @@ guidebook-reagent-effects-metabolite-item = {$reagent} at a rate of { NATURALPER guidebook-reagent-effects-metabolites = Metabolizes into { $items }. guidebook-reagent-plant-metabolisms-header = Plant Metabolism guidebook-reagent-plant-metabolisms-rate = [bold]Plant Metabolism[/bold] [color=gray](1 unit every 3 seconds as base)[/color] +guidebook-reagent-plant-respiration-header = Plant Respiration +guidebook-reagent-plant-respiration-rate = [bold]Plant Respiration[/bold] [color=gray](per mol every 15 seconds as base. This is placeholder text)[/color] guidebook-reagent-physical-description = [italic]Seems to be {$description}.[/italic] guidebook-reagent-recipes-mix-info = {$minTemp -> [0] {$hasMax -> From 6607b4ec28c9e37f056e86117ee5eebbe0e3d8cf Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Fri, 7 Aug 2026 19:19:38 -0500 Subject: [PATCH 53/61] More comments in PlantHolderComponent.cs --- .../Botany/Components/PlantHolderComponent.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Content.Server/Botany/Components/PlantHolderComponent.cs b/Content.Server/Botany/Components/PlantHolderComponent.cs index 08d84da7919..a1d560600b3 100644 --- a/Content.Server/Botany/Components/PlantHolderComponent.cs +++ b/Content.Server/Botany/Components/PlantHolderComponent.cs @@ -25,7 +25,7 @@ public sealed partial class PlantHolderComponent : Component [DataField] public int LastProduce; - [DataField] + [DataField] // TODO: Comment out with plant nutrient rework public int MissingGas; /// @@ -56,22 +56,22 @@ public sealed partial class PlantHolderComponent : Component [DataField] public bool DrawWarnings = false; - [DataField] + [DataField] // TODO: Comment out with plant nutrient rework public float WaterLevel = 100f; - [DataField] + [DataField] // TODO: Comment out with plant nutrient rework public float NutritionLevel = 100f; [DataField] public Dictionary, FixedPoint2> Nutrients = new(); - [DataField] + [DataField] // TODO: Comment out with plant nutrient rework public float PestLevel; [DataField] public float WeedLevel; - [DataField] + [DataField] // TODO: Comment out with plant nutrient rework public float Toxins; [DataField] @@ -118,25 +118,25 @@ public sealed partial class PlantHolderComponent : Component public SeedData? Seed; /// - /// True if the plant is losing health due to too low temperature. + /// Persistence: Plant nutrient rework, True if the plant is losing health due to too low temperature. /// [DataField] public bool LowHeat; /// - /// True if the plant is losing health due to too high temperature. + /// Persistence: Plant nutrient rework, True if the plant is losing health due to too high temperature. /// [DataField] public bool HighHeat; /// - /// True if the plant is losing health due to too low pressure. + /// Persistence: Plant nutrient rework, True if the plant is losing health due to too low pressure. /// [DataField] public bool LowPressure; /// - /// True if the plant is losing health due to too high pressure. + /// Persistence: Plant nutrient rework, True if the plant is losing health due to too high pressure. /// [DataField] public bool HighPressure; From 2a57170a28e900e672aacd8493a70cd5254d66ce Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Fri, 7 Aug 2026 19:27:28 -0500 Subject: [PATCH 54/61] Adjust amount of nutrients that will be added by gasses. --- Resources/Prototypes/Reagents/elements.yml | 2 +- Resources/Prototypes/Reagents/gases.yml | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Resources/Prototypes/Reagents/elements.yml b/Resources/Prototypes/Reagents/elements.yml index 14c859b21f5..378ce91bc94 100644 --- a/Resources/Prototypes/Reagents/elements.yml +++ b/Resources/Prototypes/Reagents/elements.yml @@ -180,7 +180,7 @@ time: 5 plantRespiration: - !type:PlantAdjustNutrient - amount: 1 + amount: 0.21 nutrient: Hydrogen - type: reagent diff --git a/Resources/Prototypes/Reagents/gases.yml b/Resources/Prototypes/Reagents/gases.yml index fe4b8f77409..69336000bbc 100644 --- a/Resources/Prototypes/Reagents/gases.yml +++ b/Resources/Prototypes/Reagents/gases.yml @@ -93,7 +93,7 @@ nutrient: Plasma plantRespiration: - !type:PlantAdjustNutrient - amount: 1 + amount: 0.21 # Same amount as condensed nutrient: Plasma metabolisms: Bloodstream: @@ -151,10 +151,8 @@ amount: 1 plantRespiration: - !type:PlantAdjustNutrient - amount: 1.5 + amount: 0.4 # Slightly more efficient than condensing it and pouring it onto a plant nutrient: radiation - - !type:PlantAdjustMutationLevel - amount: 1 metabolisms: Bloodstream: effects: @@ -372,7 +370,7 @@ nutrient: Frezon plantRespiration: - !type:PlantAdjustNutrient - amount: 1 + amount: 1 # ~5x more efficient than condensing it and pouring it into a tray. nutrient: Frezon metabolisms: Bloodstream: From 4522d6227a75a151326cac2d641d9910bdb50163 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Sat, 8 Aug 2026 14:41:04 -0500 Subject: [PATCH 55/61] Rudimentary gas nutrient implementation --- Content.Server/Botany/Systems/PlantHolderSystem.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index da87abe5ded..73946f1b262 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -23,6 +23,7 @@ using Content.Shared.Popups; using Content.Shared.Random; using Content.Shared.Tag; +using Content.Shared.Body.Systems; // Persistence: Incredibly janky workaround using Robust.Server.GameObjects; using Robust.Shared.Audio.Systems; using Robust.Shared.Player; @@ -1044,6 +1045,17 @@ private void UpdateGasses(EntityUid uid, GasMixture environment, PlantHolderComp if (component.Seed == null) return; + foreach (var (gasId, amount) in environment) + { + if (amount == 0) + return; + var gasReagent = _atmosphere.GetGas(gasId).Reagent; + if (gasReagent == null) + return; + var reagentProto = _prototype.Index(gasReagent); + _entityEffects.ApplyEffects(uid, reagentProto.PlantRespiration.ToArray(), amount); + } + var exudeCount = component.Seed.ExudeGasses.Count; if (exudeCount > 0) { From 2162392d0e8347b84008ba2b5dfb1b4ef7b3b933 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Sat, 8 Aug 2026 17:37:06 -0500 Subject: [PATCH 56/61] Move seeds to _Persistence14 --- .../Prototypes/{ => _Persistence14}/Hydroponics/Seeds/flowers.yml | 0 .../Prototypes/{ => _Persistence14}/Hydroponics/Seeds/fruit.yml | 0 .../Prototypes/{ => _Persistence14}/Hydroponics/Seeds/fungus.yml | 0 .../Prototypes/{ => _Persistence14}/Hydroponics/Seeds/grains.yml | 0 .../Prototypes/{ => _Persistence14}/Hydroponics/Seeds/leaves.yml | 0 .../Prototypes/{ => _Persistence14}/Hydroponics/Seeds/other.yml | 0 .../{ => _Persistence14}/Hydroponics/Seeds/rootveggies.yml | 0 .../Prototypes/{ => _Persistence14}/Hydroponics/nutrients.yml | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename Resources/Prototypes/{ => _Persistence14}/Hydroponics/Seeds/flowers.yml (100%) rename Resources/Prototypes/{ => _Persistence14}/Hydroponics/Seeds/fruit.yml (100%) rename Resources/Prototypes/{ => _Persistence14}/Hydroponics/Seeds/fungus.yml (100%) rename Resources/Prototypes/{ => _Persistence14}/Hydroponics/Seeds/grains.yml (100%) rename Resources/Prototypes/{ => _Persistence14}/Hydroponics/Seeds/leaves.yml (100%) rename Resources/Prototypes/{ => _Persistence14}/Hydroponics/Seeds/other.yml (100%) rename Resources/Prototypes/{ => _Persistence14}/Hydroponics/Seeds/rootveggies.yml (100%) rename Resources/Prototypes/{ => _Persistence14}/Hydroponics/nutrients.yml (100%) diff --git a/Resources/Prototypes/Hydroponics/Seeds/flowers.yml b/Resources/Prototypes/_Persistence14/Hydroponics/Seeds/flowers.yml similarity index 100% rename from Resources/Prototypes/Hydroponics/Seeds/flowers.yml rename to Resources/Prototypes/_Persistence14/Hydroponics/Seeds/flowers.yml diff --git a/Resources/Prototypes/Hydroponics/Seeds/fruit.yml b/Resources/Prototypes/_Persistence14/Hydroponics/Seeds/fruit.yml similarity index 100% rename from Resources/Prototypes/Hydroponics/Seeds/fruit.yml rename to Resources/Prototypes/_Persistence14/Hydroponics/Seeds/fruit.yml diff --git a/Resources/Prototypes/Hydroponics/Seeds/fungus.yml b/Resources/Prototypes/_Persistence14/Hydroponics/Seeds/fungus.yml similarity index 100% rename from Resources/Prototypes/Hydroponics/Seeds/fungus.yml rename to Resources/Prototypes/_Persistence14/Hydroponics/Seeds/fungus.yml diff --git a/Resources/Prototypes/Hydroponics/Seeds/grains.yml b/Resources/Prototypes/_Persistence14/Hydroponics/Seeds/grains.yml similarity index 100% rename from Resources/Prototypes/Hydroponics/Seeds/grains.yml rename to Resources/Prototypes/_Persistence14/Hydroponics/Seeds/grains.yml diff --git a/Resources/Prototypes/Hydroponics/Seeds/leaves.yml b/Resources/Prototypes/_Persistence14/Hydroponics/Seeds/leaves.yml similarity index 100% rename from Resources/Prototypes/Hydroponics/Seeds/leaves.yml rename to Resources/Prototypes/_Persistence14/Hydroponics/Seeds/leaves.yml diff --git a/Resources/Prototypes/Hydroponics/Seeds/other.yml b/Resources/Prototypes/_Persistence14/Hydroponics/Seeds/other.yml similarity index 100% rename from Resources/Prototypes/Hydroponics/Seeds/other.yml rename to Resources/Prototypes/_Persistence14/Hydroponics/Seeds/other.yml diff --git a/Resources/Prototypes/Hydroponics/Seeds/rootveggies.yml b/Resources/Prototypes/_Persistence14/Hydroponics/Seeds/rootveggies.yml similarity index 100% rename from Resources/Prototypes/Hydroponics/Seeds/rootveggies.yml rename to Resources/Prototypes/_Persistence14/Hydroponics/Seeds/rootveggies.yml diff --git a/Resources/Prototypes/Hydroponics/nutrients.yml b/Resources/Prototypes/_Persistence14/Hydroponics/nutrients.yml similarity index 100% rename from Resources/Prototypes/Hydroponics/nutrients.yml rename to Resources/Prototypes/_Persistence14/Hydroponics/nutrients.yml From 3526f47a135816a9d347ecf4cfd3a1dea65db8bd Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Sat, 8 Aug 2026 19:37:45 -0500 Subject: [PATCH 57/61] Fix crash --- Content.Server/Botany/Systems/BotanySystem.Produce.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Server/Botany/Systems/BotanySystem.Produce.cs b/Content.Server/Botany/Systems/BotanySystem.Produce.cs index 3f38ac10253..08f3db93f19 100644 --- a/Content.Server/Botany/Systems/BotanySystem.Produce.cs +++ b/Content.Server/Botany/Systems/BotanySystem.Produce.cs @@ -4,6 +4,7 @@ using Content.Shared.FixedPoint; using Content.Shared.Botany; using Robust.Shared.Prototypes; +using Robust.Shared.Utility; namespace Content.Server.Botany.Systems; @@ -37,7 +38,7 @@ public void ProduceGrown(EntityUid uid, ProduceComponent produce, Dictionary 0) - bonusRatio.Add(nutrient.Key, FixedPoint2.Clamp((nutrients[nutrient.Key] - required) / bonus, 0, 1)); + bonusRatio.Add(nutrient.Key, FixedPoint2.Clamp((nutrients.GetValueOrDefault(nutrient.Key) - required) / bonus, 0, 1)); } foreach (var (chem, quantity) in seed.Chemicals) From 56efbd763bc63e0b0da5edc813e925c414e3661a Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Sat, 8 Aug 2026 19:38:00 -0500 Subject: [PATCH 58/61] Proper gas absorption --- .../Botany/Systems/PlantHolderSystem.cs | 14 ++++++---- .../Atmos/Prototypes/GasPrototype.cs | 26 +++++++++++++++++++ Resources/Prototypes/Atmospherics/gases.yml | 20 ++++++++++++++ Resources/Prototypes/Reagents/elements.yml | 4 --- Resources/Prototypes/Reagents/gases.yml | 16 ------------ 5 files changed, 55 insertions(+), 25 deletions(-) diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index 73946f1b262..9aba1f6444d 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -1048,12 +1048,16 @@ private void UpdateGasses(EntityUid uid, GasMixture environment, PlantHolderComp foreach (var (gasId, amount) in environment) { if (amount == 0) + continue; + var gasPrototype = _atmosphere.GetGas(gasId); + if (gasPrototype.Nutrient == null) + continue; + var gasAbsorbed = Math.Min(amount, gasPrototype.PlantAbsorptionRate); + gasAbsorbed = Math.Min(gasAbsorbed, (gasPrototype.MaxNutrient * amount / gasPrototype.NutrientAmount - component.Nutrients.GetValueOrDefault(gasPrototype.Nutrient)).Float()); + if (gasAbsorbed <= 0) return; - var gasReagent = _atmosphere.GetGas(gasId).Reagent; - if (gasReagent == null) - return; - var reagentProto = _prototype.Index(gasReagent); - _entityEffects.ApplyEffects(uid, reagentProto.PlantRespiration.ToArray(), amount); + environment.AdjustMoles(gasId, gasAbsorbed); + AdjustNutrient(uid, gasPrototype.NutrientAmount * gasAbsorbed, gasPrototype.Nutrient, component); } var exudeCount = component.Seed.ExudeGasses.Count; diff --git a/Content.Shared/Atmos/Prototypes/GasPrototype.cs b/Content.Shared/Atmos/Prototypes/GasPrototype.cs index 8b17a6a0737..4b3b06d4256 100644 --- a/Content.Shared/Atmos/Prototypes/GasPrototype.cs +++ b/Content.Shared/Atmos/Prototypes/GasPrototype.cs @@ -1,4 +1,6 @@ using Content.Shared.Chemistry.Reagent; +using Content.Shared.Botany; // Persistence: Plant nutrient rework +using Content.Shared.FixedPoint; // Persistence: Plant nutrient rework using Robust.Shared.Maths; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -80,6 +82,30 @@ public sealed partial class GasPrototype : IPrototype [DataField("reagent", customTypeSerializer: typeof(PrototypeIdSerializer))] public string? Reagent { get; private set; } = default!; + /// + /// Persistence: The nutrient that this gas will turn into when absorbed by a plant. + /// + [DataField("nutrient", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? Nutrient { get; private set; } = default!; + + /// + /// Persistence: The amount of nutrient gained per mol of gas absorbed by a plant.. + /// + [DataField("nutrientAmount")] + public FixedPoint2 NutrientAmount { get; private set; } = default!; + + /// + /// Persistence: The maximum amount of nutrients a plant can absorb from this gas, relative to the number of mols in the environment. + /// + [DataField("maxNutrient")] + public FixedPoint2 MaxNutrient { get; private set; } = default!; + + /// + /// Persistence: The maximum rate, in mols per 15 seconds, that a plant can absorb this gas. + /// + [DataField("plantAbsorptionRate")] + public float PlantAbsorptionRate { get; private set; } = 1f; // The gas is not absorbed if it does not have an associated nutrient. + [DataField("color")] public string Color { get; private set; } = string.Empty; [DataField("pricePerMole")] diff --git a/Resources/Prototypes/Atmospherics/gases.yml b/Resources/Prototypes/Atmospherics/gases.yml index 98bed058bb5..c0db1760511 100644 --- a/Resources/Prototypes/Atmospherics/gases.yml +++ b/Resources/Prototypes/Atmospherics/gases.yml @@ -28,6 +28,10 @@ color: 4e4e4e reagent: CarbonDioxide pricePerMole: 0.1 + nutrient: CarbonDioxide # Persistence: Plant nutrient rework + nutrientAmount: 1.0 + maxNutrient: 1.0 + plantAbsorptionRate: 2.0 - type: gas id: Plasma @@ -42,6 +46,10 @@ pricePerMole: 0 isFuel: true burnColor: "#FF4500" + nutrient: Plasma # Persistence: Plant nutrient rework + nutrientAmount: 0.21 # As effective as condensing and adding to a tray. + maxNutrient: 0.5 + plantAbsorptionRate: 5.0 - type: gas id: Tritium @@ -56,6 +64,10 @@ pricePerMole: 0.8 isFuel: true burnColor: "#33FF88" + nutrient: Radiation # Persistence: Plant nutrient rework + nutrientAmount: 0.4 + maxNutrient: 0.1 # Should be less effective than directly absorbing radiation + plantAbsorptionRate: 2.0 - type: gas id: WaterVapor @@ -105,6 +117,10 @@ color: 3a758c reagent: Frezon pricePerMole: 1 + nutrient: Frezon # Persistence: Plant nutrient rework + nutrientAmount: 1.0 # ~5x as effective as pouring condensed frezon into a tray. + maxNutrient: 0.5 + plantAbsorptionRate: 2.5 - type: gas id: Hydrogen @@ -117,6 +133,10 @@ pricePerMole: 0.5 isFuel: true burnColor: "#D4F1FF18" + nutrient: Hydrogen # Persistence: Plant nutrient rework + nutrientAmount: 1 + maxNutrient: 0.5 + plantAbsorptionRate: 3.0 - type: gas id: Chlorine diff --git a/Resources/Prototypes/Reagents/elements.yml b/Resources/Prototypes/Reagents/elements.yml index 378ce91bc94..9e9ffe1c3a1 100644 --- a/Resources/Prototypes/Reagents/elements.yml +++ b/Resources/Prototypes/Reagents/elements.yml @@ -178,10 +178,6 @@ minScale: 1.5 clear: True time: 5 - plantRespiration: - - !type:PlantAdjustNutrient - amount: 0.21 - nutrient: Hydrogen - type: reagent id: Iodine diff --git a/Resources/Prototypes/Reagents/gases.yml b/Resources/Prototypes/Reagents/gases.yml index 69336000bbc..81bc8da4612 100644 --- a/Resources/Prototypes/Reagents/gases.yml +++ b/Resources/Prototypes/Reagents/gases.yml @@ -91,10 +91,6 @@ - !type:PlantAdjustNutrient amount: 1 nutrient: Plasma - plantRespiration: - - !type:PlantAdjustNutrient - amount: 0.21 # Same amount as condensed - nutrient: Plasma metabolisms: Bloodstream: effects: @@ -149,10 +145,6 @@ nutrient: Radiation - !type:PlantAdjustMutationLevel amount: 1 - plantRespiration: - - !type:PlantAdjustNutrient - amount: 0.4 # Slightly more efficient than condensing it and pouring it onto a plant - nutrient: radiation metabolisms: Bloodstream: effects: @@ -182,10 +174,6 @@ physicalDesc: reagent-physical-desc-odorless flavor: bitter color: "#66ff33" - plantRespiration: - - !type:PlantAdjustNutrient - amount: 1 - nutrient: CarbonDioxide metabolisms: Bloodstream: effects: @@ -368,10 +356,6 @@ - !type:PlantAdjustNutrient amount: 1 nutrient: Frezon - plantRespiration: - - !type:PlantAdjustNutrient - amount: 1 # ~5x more efficient than condensing it and pouring it into a tray. - nutrient: Frezon metabolisms: Bloodstream: effects: From f5164bb1497b0c808a0a3a8481d5f2b1a592bbc2 Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Sat, 8 Aug 2026 19:40:02 -0500 Subject: [PATCH 59/61] Remove plant respiration from reagents --- Content.Shared/Chemistry/Reagent/ReagentPrototype.cs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs index 496d50c5ebf..85102ddfa6d 100644 --- a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs +++ b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs @@ -180,9 +180,6 @@ public sealed partial class ReagentPrototype : IPrototype, IInheritingPrototype [DataField("plantMetabolism")] public List PlantMetabolisms = new(0); - [DataField("plantRespiration")] - public List PlantRespiration = new(0); // Persistence: Plant nutrient rework - [DataField] public float PricePerUnit; @@ -249,8 +246,6 @@ public struct ReagentGuideEntry public List? PlantMetabolisms = null; - public List? PlantRespiration = null; // Persistence: Plant nutrient rework - public ReagentGuideEntry(ReagentPrototype proto, IPrototypeManager prototype, IEntitySystemManager entSys) { ReagentPrototype = proto.ID; @@ -262,11 +257,6 @@ public ReagentGuideEntry(ReagentPrototype proto, IPrototypeManager prototype, IE PlantMetabolisms = new List(proto.GuidebookReagentEffectsDescription(prototype, entSys, proto.PlantMetabolisms, FixedPoint2.New(1f))); } - if (proto.PlantRespiration.Count > 0) // Persistence: Plant nutrient rework - { - PlantRespiration = - new List(proto.GuidebookReagentEffectsDescription(prototype, entSys, proto.PlantRespiration, FixedPoint2.New(1f))); - } } } From 796f29bcc636fc6029bd7f437e9dc5072e7915ff Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Sat, 8 Aug 2026 19:41:21 -0500 Subject: [PATCH 60/61] Remove plant respiration from guidebook reagent embeds --- .../Guidebook/Controls/GuideReagentEmbed.xaml | 11 ------ .../Controls/GuideReagentEmbed.xaml.cs | 34 ------------------- 2 files changed, 45 deletions(-) diff --git a/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml b/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml index b694d284532..73a17e9bcc9 100644 --- a/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml +++ b/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml @@ -58,17 +58,6 @@ - - - - - - - - diff --git a/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml.cs b/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml.cs index 8b575a764c9..f0028d884ee 100644 --- a/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml.cs +++ b/Content.Client/Guidebook/Controls/GuideReagentEmbed.xaml.cs @@ -221,40 +221,6 @@ private void GenerateControl(ReagentPrototype reagent) } #endregion - //Persistence: Plant nutrient rework - #region PlantRespiration - if (_chemistryGuideData.ReagentGuideRegistry.TryGetValue(reagent.ID, out var guideEntryRegistryPlantRespiration) && - guideEntryRegistryPlantRespiration.PlantRespiration != null && - guideEntryRegistryPlantRespiration.PlantRespiration.Count > 0) - { - PlantRespirationDescriptionContainer.Children.Clear(); - var metabolismLabel = new RichTextLabel(); - metabolismLabel.SetMarkup(Loc.GetString("guidebook-reagent-plant-metabolisms-rate")); - var descriptionLabel = new RichTextLabel - { - Margin = new Thickness(25, 0, 10, 0) - }; - var descMsg = new FormattedMessage(); - var descriptionsCount = guideEntryRegistryPlantRespiration.PlantRespiration.Count; - var i = 0; - foreach (var effectString in guideEntryRegistryPlantRespiration.PlantRespiration) - { - descMsg.AddMarkupOrThrow(effectString); - i++; - if (i < descriptionsCount) - descMsg.PushNewline(); - } - descriptionLabel.SetMessage(descMsg); - - PlantRespirationDescriptionContainer.AddChild(metabolismLabel); - PlantRespirationDescriptionContainer.AddChild(descriptionLabel); - } - else - { - PlantRespirationContainer.Visible = false; - } - #endregion - GenerateSources(reagent); FormattedMessage description = new(); From c1a1c53f28735f83396c8a7facd1baf2b97c18ca Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Mon, 10 Aug 2026 18:13:16 -0500 Subject: [PATCH 61/61] Plant respiration as a guidebook source --- .../Controls/GuidePlantNutrientEmbed.xaml.cs | 39 ++++- .../Controls/GuidePlantNutrientSource.xaml.cs | 28 ++-- .../Botany/BotanyGuideDataSystem.cs | 156 ++++++++++++++++++ .../Botany/BotanyGuideDataSystem.cs | 73 ++++++++ .../Botany/PlantNutrientPrototype.cs | 29 ++++ .../Botany/SharedBotanyGuideDataSystem.cs | 45 +++++ .../guidebook/plant-nutrients.ftl | 1 + .../Locale/en-US/guidebook/chemistry/core.ftl | 2 - .../_Persistence14/Chemistry/mixing_types.yml | 13 ++ 9 files changed, 370 insertions(+), 16 deletions(-) create mode 100644 Content.Client/_Persistence14/Botany/BotanyGuideDataSystem.cs create mode 100644 Content.Server/_Persistence14/Botany/BotanyGuideDataSystem.cs create mode 100644 Content.Shared/_Persistence14/Botany/SharedBotanyGuideDataSystem.cs rename Resources/Locale/en-US/{ => _Persistence14}/guidebook/plant-nutrients.ftl (65%) create mode 100644 Resources/Prototypes/_Persistence14/Chemistry/mixing_types.yml diff --git a/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml.cs b/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml.cs index bd611798f4a..5831cc2b224 100644 --- a/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml.cs +++ b/Content.Client/Guidebook/Controls/GuidePlantNutrientEmbed.xaml.cs @@ -2,6 +2,7 @@ using Content.Client.Guidebook.Richtext; using Content.Client.Message; using Content.Client.UserInterface.ControlExtensions; +using Content.Client._Persistence14.Botany; using Content.Shared.CCVar; using Content.Shared.Chemistry.Reagent; using Content.Shared.Botany; @@ -34,7 +35,7 @@ public sealed partial class GuidePlantNutrientEmbed : BoxContainer, IDocumentTag [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IConfigurationManager _config = default!; - //private readonly ChemistryGuideDataSystem _chemistryGuideData; + private readonly BotanyGuideDataSystem _botanyGuideData; private readonly ISawmill _sawmill; public IPrototype? RepresentedPrototype { get; private set; } @@ -44,7 +45,7 @@ public GuidePlantNutrientEmbed() RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); _sawmill = _logManager.GetSawmill("guidebook.plantNutrient"); - //_chemistryGuideData = _systemManager.GetEntitySystem(); + _botanyGuideData = _systemManager.GetEntitySystem(); MouseFilter = MouseFilterMode.Stop; } @@ -182,6 +183,8 @@ private void GenerateControl(PlantNutrientPrototype nutrient) } #endregion + GenerateSources(nutrient); + FormattedMessage description = new(); description.AddText(nutrient.LocalizedDescription); description.PushNewline(); @@ -198,5 +201,37 @@ private bool CheckReagentPlantMetabolisms(List effects, string nut } return false; } + private void GenerateSources(PlantNutrientPrototype reagent) + { + var sources = _botanyGuideData.GetPlantNutrientSources(reagent.ID); + if (sources.Count == 0) + { + //SourcesContainer.Visible = false; + return; + } + SourcesContainer.Visible = true; + + var orderedSources = sources + //.OrderBy(o => o.OutputCount) + .OrderBy(o => o.IdentifierString); + foreach (var source in orderedSources) + { + if (source is PlantNutrientReagentSourceData reactionSourceData) + { + SourcesDescriptionContainer.AddChild(new GuidePlantNutrientSource( + reactionSourceData.ReagentPrototype, + _prototype, + _systemManager)); + } + else if (source is PlantNutrientGasSourceData gasSourceData) + { + SourcesDescriptionContainer.AddChild(new GuidePlantNutrientSource( + gasSourceData.GasPrototype, + gasSourceData.MixingType, + _prototype, + _systemManager)); + } + } + } } diff --git a/Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml.cs b/Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml.cs index b8ef8403e85..3bf394530f5 100644 --- a/Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml.cs +++ b/Content.Client/Guidebook/Controls/GuidePlantNutrientSource.xaml.cs @@ -23,7 +23,7 @@ namespace Content.Client.Guidebook.Controls; [UsedImplicitly, GenerateTypedNameReferences] public sealed partial class GuidePlantNutrientSource : BoxContainer, ISearchableControl { - private static readonly ProtoId DefaultMixingCategory = "DummyMix"; + private static readonly ProtoId DefaultMixingCategory = "DummyPlantOsmosis"; private readonly IPrototypeManager _protoMan; @@ -44,7 +44,9 @@ public GuidePlantNutrientSource(ReagentPrototype reagent, IPrototypeManager prot nutrients.Add(prod, 1); } SetNutrients(nutrients, ref productContainer, protoMan, false); - SetMixingCategory(sysMan); + + var mixingCategories = new List { protoMan.Index(DefaultMixingCategory) }; + SetMixingCategory(mixingCategories, sysMan); } public GuidePlantNutrientSource(EntityPrototype prototype, @@ -74,7 +76,7 @@ public GuidePlantNutrientSource(EntityPrototype prototype, Container productContainer = NutrientsContainer; SetNutrients(solution.Contents, ref productContainer, protoMan, false); - SetMixingCategory(/*categories,*/ sysMan); + SetMixingCategory(categories, sysMan); } public GuidePlantNutrientSource(GasPrototype prototype, @@ -89,16 +91,16 @@ public GuidePlantNutrientSource(GasPrototype prototype, SourcesContainer.Visible = true; SourcesContainer.AddChild(label); - if (prototype.Reagent != null) + if (prototype.Nutrient != null) { var quantity = new Dictionary { - { prototype.Reagent, FixedPoint2.New(0.21f) } + { prototype.Nutrient, prototype.NutrientAmount } }; Container productContainer = NutrientsContainer; SetNutrients(quantity, ref productContainer, protoMan, false); } - SetMixingCategory(/*categories,*/ sysMan); + SetMixingCategory(categories, sysMan); } private Dictionary GetNutrients(ReagentPrototype reagent) @@ -184,7 +186,7 @@ private void SetNutrients(Dictionary reagents, ref Containe container.Visible = true; } - /*private void SetMixingCategory(IReadOnlyList> mixingCategories, IEntitySystemManager sysMan) + private void SetMixingCategory(IReadOnlyList> mixingCategories, IEntitySystemManager sysMan) { var foo = new List(); foreach (var cat in mixingCategories) @@ -192,11 +194,11 @@ private void SetNutrients(Dictionary reagents, ref Containe foo.Add(_protoMan.Index(cat)); } SetMixingCategory(foo, sysMan); - }*/ + } - private void SetMixingCategory(/*IReadOnlyList mixingCategories, */IEntitySystemManager sysMan) + private void SetMixingCategory(IReadOnlyList mixingCategories, IEntitySystemManager sysMan) { - /*if (mixingCategories.Count == 0) + if (mixingCategories.Count == 0) return; // only use the first one for the icon. @@ -204,9 +206,11 @@ private void SetMixingCategory(/*IReadOnlyList mixingCa { MixTexture.Texture = sysMan.GetEntitySystem().Frame0(primaryCategory.Icon); } - */ - var text = Loc.GetString("guidebook-plant-nutrients-source-info", ("verb", Loc.GetString("plant-nutrient-source-verb-default-osmosis"))); + var mixingVerb = ContentLocalizationManager.FormatList(mixingCategories + .Select(p => Loc.GetString(p.VerbText)).ToList()); + + var text = Loc.GetString("guidebook-plant-nutrients-source-info", ("verb", mixingVerb)); MixLabel.SetMarkup(text); } diff --git a/Content.Client/_Persistence14/Botany/BotanyGuideDataSystem.cs b/Content.Client/_Persistence14/Botany/BotanyGuideDataSystem.cs new file mode 100644 index 00000000000..f7d01dd997f --- /dev/null +++ b/Content.Client/_Persistence14/Botany/BotanyGuideDataSystem.cs @@ -0,0 +1,156 @@ +using System.Linq; +using Content.Shared.Chemistry.EntitySystems; +using Content.Shared.Atmos.Prototypes; +using Content.Shared.Body; +using Content.Shared._Persistence14.Botany; +using Content.Shared.Botany; +using Content.Shared.Chemistry; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Components.SolutionManager; +using Content.Shared.Chemistry.Reaction; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Kitchen.Components; +using Content.Shared.Prototypes; +using Robust.Shared.Prototypes; + +namespace Content.Client._Persistence14.Botany; + +/// +public sealed class BotanyGuideDataSystem : SharedBotanyGuideDataSystem +{ + [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!; + + private static readonly ProtoId DefaultMixingCategory = "DummyPlantOsmosis"; + private static readonly ProtoId DefaultCondenseCategory = "DummyPlantRespiration"; + + private readonly Dictionary> _PlantNutrientSources = new(); + + /// + public override void Initialize() + { + base.Initialize(); + + SubscribeNetworkEvent(OnReceiveRegistryUpdate); + SubscribeLocalEvent(OnPrototypesReloaded); + OnPrototypesReloaded(null); + } + + private void OnReceiveRegistryUpdate(PlantNutrientGuideRegistryChangedEvent message) + { + var data = message.Changeset; + foreach (var remove in data.Removed) + { + Registry.Remove(remove); + } + + foreach (var (key, val) in data.GuideEntries) + { + Registry[key] = val; + } + } + + private void OnPrototypesReloaded(PrototypesReloadedEventArgs? ev) + { + // this doesn't check what prototypes are being reloaded because, to be frank, we use a lot of them. + _PlantNutrientSources.Clear(); + foreach (var PlantNutrient in PrototypeManager.EnumeratePrototypes()) + { + _PlantNutrientSources.Add(PlantNutrient.ID, new()); + } + + foreach (var reagent in PrototypeManager.EnumeratePrototypes()) + { + var data = new PlantNutrientReagentSourceData(new() { DefaultMixingCategory }, reagent); + List> nutrients = new(); + + foreach (var nutrient in nutrients) + { + _PlantNutrientSources[nutrient].Add(data); + } + } + + foreach (var gas in PrototypeManager.EnumeratePrototypes()) + { + if (gas.Nutrient == null) + continue; + + var data = new PlantNutrientGasSourceData( + new() { DefaultCondenseCategory }, + gas); + _PlantNutrientSources[gas.Nutrient].Add(data); + } + } + + public List GetPlantNutrientSources(string id) + { + return _PlantNutrientSources.GetValueOrDefault(id) ?? new List(); + } + + // Is handled on server and updated on client via PlantNutrientGuideRegistryChangedEvent + public override void ReloadAllPlantNutrientPrototypes() + { + } +} + +/// +/// A generic class meant to hold information about a PlantNutrient source. +/// +public abstract class PlantNutrientSourceData +{ + /// + /// The mixing type that applies to this source. + /// + public readonly IReadOnlyList> MixingType; + + // + // The number of distinct outputs. Used for primary ordering. + // + //public abstract int OutputCount { get; } + + /// + /// A text string corresponding to this source. Typically a name. Used for secondary ordering. + /// + public abstract string IdentifierString { get; } + + protected PlantNutrientSourceData(List> mixingType) + { + MixingType = mixingType; + } +} + +/// +/// Used to store a nutrient source that comes from absorbing reagents. +/// +public sealed class PlantNutrientReagentSourceData : PlantNutrientSourceData +{ + public readonly ReagentPrototype ReagentPrototype; + + //public override int OutputCount => ReactionPrototype.Products.Count + ReactionPrototype.Reactants.Count(r => r.Value.Catalyst); + + public override string IdentifierString => ReagentPrototype.ID; + + public PlantNutrientReagentSourceData(List> mixingType, ReagentPrototype reagentPrototype) + : base(mixingType) + { + ReagentPrototype = reagentPrototype; + } +} + +/// +/// Used to store a nutrient source that comes from absorbing gasses. +/// +public sealed class PlantNutrientGasSourceData : PlantNutrientSourceData +{ + public readonly GasPrototype GasPrototype; + + //public override int OutputCount => 1; + + public override string IdentifierString => Loc.GetString(GasPrototype.Name); + + public PlantNutrientGasSourceData(List> mixingType, GasPrototype gasPrototype) + : base(mixingType) + { + GasPrototype = gasPrototype; + } +} + diff --git a/Content.Server/_Persistence14/Botany/BotanyGuideDataSystem.cs b/Content.Server/_Persistence14/Botany/BotanyGuideDataSystem.cs new file mode 100644 index 00000000000..4014ff963f3 --- /dev/null +++ b/Content.Server/_Persistence14/Botany/BotanyGuideDataSystem.cs @@ -0,0 +1,73 @@ +using Content.Shared._Persistence14.Botany; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Botany; +using Robust.Server.Player; +using Robust.Shared.Enums; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; + +namespace Content.Server._Persistence14.Botany; + + +public sealed class BotanyGuideDataSystem : SharedBotanyGuideDataSystem +{ + [Dependency] private readonly IPlayerManager _player = default!; + + /// + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(PrototypeManagerReload); + _player.PlayerStatusChanged += OnPlayerStatusChanged; + + InitializeServerRegistry(); + } + + private void InitializeServerRegistry() + { + var changeset = new PlantNutrientGuideChangeset(new Dictionary(), new HashSet()); + foreach (var proto in PrototypeManager.EnumeratePrototypes()) + { + var entry = new PlantNutrientGuideEntry(proto, PrototypeManager, EntityManager.EntitySysManager); + changeset.GuideEntries.Add(proto.ID, entry); + Registry[proto.ID] = entry; + } + + var ev = new PlantNutrientGuideRegistryChangedEvent(changeset); + RaiseNetworkEvent(ev); + } + + private void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e) + { + if (e.NewStatus != SessionStatus.Connected) + return; + + var sendEv = new PlantNutrientGuideRegistryChangedEvent(new PlantNutrientGuideChangeset(Registry, new HashSet())); + RaiseNetworkEvent(sendEv, e.Session); + } + + private void PrototypeManagerReload(PrototypesReloadedEventArgs obj) + { + if (!obj.ByType.TryGetValue(typeof(PlantNutrientPrototype), out var PlantNutrients)) + return; + + var changeset = new PlantNutrientGuideChangeset(new Dictionary(), new HashSet()); + + foreach (var (id, proto) in PlantNutrients.Modified) + { + var plantNutrientProto = (PlantNutrientPrototype)proto; + var entry = new PlantNutrientGuideEntry(plantNutrientProto, PrototypeManager, EntityManager.EntitySysManager); + changeset.GuideEntries.Add(id, entry); + Registry[id] = entry; + } + + var ev = new PlantNutrientGuideRegistryChangedEvent(changeset); + RaiseNetworkEvent(ev); + } + + public override void ReloadAllPlantNutrientPrototypes() + { + InitializeServerRegistry(); + } +} diff --git a/Content.Shared/Botany/PlantNutrientPrototype.cs b/Content.Shared/Botany/PlantNutrientPrototype.cs index b5c5467cbb3..c6a866ec7ff 100644 --- a/Content.Shared/Botany/PlantNutrientPrototype.cs +++ b/Content.Shared/Botany/PlantNutrientPrototype.cs @@ -1,4 +1,5 @@ using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; namespace Content.Shared.Botany; @@ -28,3 +29,31 @@ public sealed partial class PlantNutrientPrototype : IPrototype [DataField("color")] public Color SubstanceColor { get; private set; } = Color.White; } + +[Serializable, NetSerializable] +public struct PlantNutrientGuideEntry +{ + public string ReagentPrototype; + + //public Dictionary, ReagentEffectsGuideEntry>? GuideEntries; + + //public List? PlantMetabolisms = null; + + public PlantNutrientGuideEntry(PlantNutrientPrototype proto, + IPrototypeManager prototype, + IEntitySystemManager entSys) + { + ReagentPrototype = proto.ID;/* + GuideEntries = proto.Metabolisms?.Metabolisms + .Select(x => (x.Key, x.Value.MakeGuideEntry(prototype, entSys, proto))) + .ToDictionary(x => x.Key, x => x.Item2); + if (proto.PlantMetabolisms.Count > 0) + { + PlantMetabolisms = + new List(proto.GuidebookReagentEffectsDescription(prototype, + entSys, + proto.PlantMetabolisms, + FixedPoint2.New(1f))); + }*/ + } +} diff --git a/Content.Shared/_Persistence14/Botany/SharedBotanyGuideDataSystem.cs b/Content.Shared/_Persistence14/Botany/SharedBotanyGuideDataSystem.cs new file mode 100644 index 00000000000..aded4f32f2c --- /dev/null +++ b/Content.Shared/_Persistence14/Botany/SharedBotanyGuideDataSystem.cs @@ -0,0 +1,45 @@ +using Content.Shared.Botany; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared._Persistence14.Botany; + +/// +/// This handles the chemistry guidebook and caching it. +/// +public abstract class SharedBotanyGuideDataSystem : EntitySystem +{ + [Dependency] protected readonly IPrototypeManager PrototypeManager = default!; + + protected readonly Dictionary Registry = new(); + + public IReadOnlyDictionary PlantNutrientGuideRegistry => Registry; + + // Only ran on the server + public abstract void ReloadAllPlantNutrientPrototypes(); +} + +[Serializable, NetSerializable] +public sealed class PlantNutrientGuideRegistryChangedEvent : EntityEventArgs +{ + public PlantNutrientGuideChangeset Changeset; + + public PlantNutrientGuideRegistryChangedEvent(PlantNutrientGuideChangeset changeset) + { + Changeset = changeset; + } +} + +[Serializable, NetSerializable] +public sealed class PlantNutrientGuideChangeset +{ + public Dictionary GuideEntries; + + public HashSet Removed; + + public PlantNutrientGuideChangeset(Dictionary guideEntries, HashSet removed) + { + GuideEntries = guideEntries; + Removed = removed; + } +} diff --git a/Resources/Locale/en-US/guidebook/plant-nutrients.ftl b/Resources/Locale/en-US/_Persistence14/guidebook/plant-nutrients.ftl similarity index 65% rename from Resources/Locale/en-US/guidebook/plant-nutrients.ftl rename to Resources/Locale/en-US/_Persistence14/guidebook/plant-nutrients.ftl index 5a44860863c..76c83179fb5 100644 --- a/Resources/Locale/en-US/guidebook/plant-nutrients.ftl +++ b/Resources/Locale/en-US/_Persistence14/guidebook/plant-nutrients.ftl @@ -1,3 +1,4 @@ guidebook-plant-nutrients-source-info = {CAPITALIZE($verb)} plant-nutrient-source-verb-default-osmosis = osmosis +plant-nutrient-source-verb-default-respiration = respiration diff --git a/Resources/Locale/en-US/guidebook/chemistry/core.ftl b/Resources/Locale/en-US/guidebook/chemistry/core.ftl index 702028c2f6b..502675bd9e8 100644 --- a/Resources/Locale/en-US/guidebook/chemistry/core.ftl +++ b/Resources/Locale/en-US/guidebook/chemistry/core.ftl @@ -22,8 +22,6 @@ guidebook-reagent-effects-metabolite-item = {$reagent} at a rate of { NATURALPER guidebook-reagent-effects-metabolites = Metabolizes into { $items }. guidebook-reagent-plant-metabolisms-header = Plant Metabolism guidebook-reagent-plant-metabolisms-rate = [bold]Plant Metabolism[/bold] [color=gray](1 unit every 3 seconds as base)[/color] -guidebook-reagent-plant-respiration-header = Plant Respiration -guidebook-reagent-plant-respiration-rate = [bold]Plant Respiration[/bold] [color=gray](per mol every 15 seconds as base. This is placeholder text)[/color] guidebook-reagent-physical-description = [italic]Seems to be {$description}.[/italic] guidebook-reagent-recipes-mix-info = {$minTemp -> [0] {$hasMax -> diff --git a/Resources/Prototypes/_Persistence14/Chemistry/mixing_types.yml b/Resources/Prototypes/_Persistence14/Chemistry/mixing_types.yml new file mode 100644 index 00000000000..3ad331a3deb --- /dev/null +++ b/Resources/Prototypes/_Persistence14/Chemistry/mixing_types.yml @@ -0,0 +1,13 @@ +- type: mixingCategory + id: DummyPlantOsmosis + verbText: plant-nutrient-source-verb-default-osmosis + icon: + sprite: Structures/Hydroponics/containers.rsi + state: hydrotray3 + +- type: mixingCategory + id: DummyPlantRespiration + verbText: plant-nutrient-source-verb-default-respiration + icon: + sprite: Mobs/Species/Diona/organs.rsi + state: lungs