Save seed data in components and remove the seed-database (#7499)

This commit is contained in:
Leon Friedrich
2022-04-16 17:32:35 +12:00
committed by GitHub
parent 98e7c84dad
commit 6997bd83b2
16 changed files with 225 additions and 232 deletions

View File

@@ -87,7 +87,7 @@ namespace Content.Server.Botany.Components
public float WeedCoefficient { get; set; } = 1f; public float WeedCoefficient { get; set; } = 1f;
[ViewVariables(VVAccess.ReadWrite)] [ViewVariables(VVAccess.ReadWrite)]
public SeedPrototype? Seed { get; set; } public SeedData? Seed { get; set; }
[ViewVariables(VVAccess.ReadWrite)] [ViewVariables(VVAccess.ReadWrite)]
public bool ImproperHeat { get; set; } public bool ImproperHeat { get; set; }
@@ -613,15 +613,14 @@ namespace Content.Server.Botany.Components
appearanceComponent.SetData(PlantHolderVisuals.HarvestLight, Harvest); appearanceComponent.SetData(PlantHolderVisuals.HarvestLight, Harvest);
} }
public void CheckForDivergence(bool modified) /// <summary>
/// Check if the currently contained seed is unique. If it is not, clone it so that we have a unique seed.
/// Necessary to avoid modifying global seeds.
/// </summary>
public void EnsureUniqueSeed()
{ {
// Make sure we're not modifying a "global" seed. if (Seed != null && !Seed.Unique)
// If this seed is not in the global seed list, then no products of this line have been harvested yet. Seed = Seed.Clone();
// It is then safe to assume it's restricted to this tray.
if (Seed == null) return;
var plantSystem = EntitySystem.Get<BotanySystem>();
if (plantSystem.Seeds.ContainsKey(Seed.Uid))
Seed = Seed.Diverge(modified);
} }
public void ForceUpdateByExternalCause() public void ForceUpdateByExternalCause()

View File

@@ -1,7 +1,5 @@
using Content.Server.Botany.Systems; using Content.Server.Botany.Systems;
using Robust.Shared.Analyzers; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Robust.Shared.GameObjects;
using Robust.Shared.Serialization.Manager.Attributes;
namespace Content.Server.Botany.Components; namespace Content.Server.Botany.Components;
@@ -11,5 +9,15 @@ public sealed class ProduceComponent : Component
{ {
[DataField("targetSolution")] public string SolutionName { get; set; } = "food"; [DataField("targetSolution")] public string SolutionName { get; set; } = "food";
[DataField("seed", required: true)] public string SeedName = default!; /// <summary>
/// Seed data used to create a <see cref="SeedComponent"/> when this produce has its seeds extracted.
/// </summary>
[DataField("seed")]
public SeedData? Seed;
/// <summary>
/// Seed data used to create a <see cref="SeedComponent"/> when this produce has its seeds extracted.
/// </summary>
[DataField("seedId", customTypeSerializer: typeof(PrototypeIdSerializer<SeedPrototype>))]
public readonly string? SeedId;
} }

View File

@@ -1,7 +1,4 @@
using Content.Server.Botany.Systems; using Content.Server.Botany.Systems;
using Robust.Shared.Analyzers;
using Robust.Shared.GameObjects;
using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.Botany.Components namespace Content.Server.Botany.Components
@@ -9,7 +6,18 @@ namespace Content.Server.Botany.Components
[RegisterComponent, Friend(typeof(BotanySystem))] [RegisterComponent, Friend(typeof(BotanySystem))]
public sealed class SeedComponent : Component public sealed class SeedComponent : Component
{ {
[DataField("seed", required: true, customTypeSerializer:typeof(PrototypeIdSerializer<SeedPrototype>))] /// <summary>
public string SeedName = default!; /// Seed data containing information about the plant type & properties that this seed can grow seed. If
/// null, will instead attempt to get data from a seed prototype, if one is defined. See <see
/// cref="SeedId"/>.
/// </summary>
[DataField("seed")]
public SeedData? Seed;
/// <summary>
/// Name of a base seed prototype that is used if <see cref="Seed"/> is null.
/// </summary>
[DataField("seedId", customTypeSerializer:typeof(PrototypeIdSerializer<SeedPrototype>))]
public readonly string? SeedId;
} }
} }

View File

@@ -1,25 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Content.Server.Botany.Components; using Content.Server.Botany.Components;
using Content.Server.Botany.Systems; using Content.Server.Botany.Systems;
using Content.Shared.Atmos; using Content.Shared.Atmos;
using Content.Shared.Popups;
using Content.Shared.Random.Helpers;
using Content.Shared.Tag;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Localization;
using Robust.Shared.Map;
using Robust.Shared.Maths;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.Shared.Random; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
using Robust.Shared.Utility; using Robust.Shared.Utility;
namespace Content.Server.Botany; namespace Content.Server.Botany;
[Prototype("seed")]
public sealed class SeedPrototype : SeedData, IPrototype
{
[IdDataField] public string ID { get; private init; } = default!;
}
public enum HarvestType : byte public enum HarvestType : byte
{ {
NoRepeat, NoRepeat,
@@ -65,33 +61,53 @@ public struct SeedChemQuantity
[DataField("PotencyDivisor")] public int PotencyDivisor; [DataField("PotencyDivisor")] public int PotencyDivisor;
} }
[Prototype("seed")] // TODO reduce the number of friends to a reasonable level. Requires ECS-ing things like plant holder component.
public sealed class SeedPrototype : IPrototype [Virtual, DataDefinition]
[Friend(typeof(BotanySystem), typeof(PlantHolderSystem), typeof(SeedExtractorSystem), typeof(PlantHolderComponent))]
public class SeedData
{ {
public const string Prototype = "SeedBase"; #region Tracking
/// <summary>
[IdDataFieldAttribute] public string ID { get; private init; } = default!; /// The name of this seed. Determines the name of seed packets.
/// </summary>
[DataField("name")] public string Name = string.Empty;
/// <summary> /// <summary>
/// Unique identifier of this seed. Do NOT set this. /// The noun for this type of seeds. E.g. for fungi this should probably be "spores" instead of "seeds". Also
/// used to determine the name of seed packets.
/// </summary> /// </summary>
public int Uid { get; internal set; } = -1; [DataField("noun")] public string Noun = "seeds";
#region Tracking /// <summary>
/// Name displayed when examining the hydroponics tray. Describes the actual plant, not the seed itself.
[DataField("name")] public string Name = string.Empty; /// </summary>
[DataField("seedName")] public string SeedName = string.Empty;
[DataField("seedNoun")] public string SeedNoun = "seeds";
[DataField("displayName")] public string DisplayName = string.Empty; [DataField("displayName")] public string DisplayName = string.Empty;
[DataField("roundStart")] public bool RoundStart = true;
[DataField("mysterious")] public bool Mysterious; [DataField("mysterious")] public bool Mysterious;
/// <summary>
/// If true, the properties of this seed cannot be modified.
/// </summary>
[DataField("immutable")] public bool Immutable; [DataField("immutable")] public bool Immutable;
/// <summary>
/// If true, there is only a single reference to this seed and it's properties can be directly modified without
/// needing to clone the seed.
/// </summary>
[ViewVariables]
public bool Unique = false; // seed-prototypes or yaml-defined seeds for entity prototypes will not generally be unique.
#endregion #endregion
#region Output #region Output
/// <summary>
/// The entity prototype that is spawned when this type of seed is extracted from produce using a seed extractor.
/// </summary>
[DataField("packetPrototype", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
public string PacketPrototype = "SeedBase";
/// <summary>
/// The entity prototype this seed spawns when it gets harvested.
/// </summary>
[DataField("productPrototypes", customTypeSerializer: typeof(PrototypeIdListSerializer<EntityPrototype>))] [DataField("productPrototypes", customTypeSerializer: typeof(PrototypeIdListSerializer<EntityPrototype>))]
public List<string> ProductPrototypes = new(); public List<string> ProductPrototypes = new();
@@ -137,7 +153,13 @@ public sealed class SeedPrototype : IPrototype
[DataField("potency")] public float Potency = 1f; [DataField("potency")] public float Potency = 1f;
/// <summary>
/// If true, a sharp tool is required to harvest this plant.
/// </summary>
[DataField("ligneous")] public bool Ligneous;
// No, I'm not removing these. // No, I'm not removing these.
// if you re-add these, make sure that they get cloned.
//public PlantSpread Spread { get; set; } //public PlantSpread Spread { get; set; }
//public PlantMutation Mutation { get; set; } //public PlantMutation Mutation { get; set; }
//public float AlterTemperature { get; set; } //public float AlterTemperature { get; set; }
@@ -146,8 +168,6 @@ public sealed class SeedPrototype : IPrototype
//public bool Hematophage { get; set; } //public bool Hematophage { get; set; }
//public bool Thorny { get; set; } //public bool Thorny { get; set; }
//public bool Stinging { get; set; } //public bool Stinging { get; set; }
[DataField("ligneous")] public bool Ligneous;
// public bool Teleporting { get; set; } // public bool Teleporting { get; set; }
// public PlantJuicy Juicy { get; set; } // public PlantJuicy Juicy { get; set; }
@@ -168,17 +188,18 @@ public sealed class SeedPrototype : IPrototype
#endregion #endregion
public SeedPrototype Clone() public SeedData Clone()
{ {
var newSeed = new SeedPrototype DebugTools.Assert(!Immutable, "There should be no need to clone an immutable seed.");
var newSeed = new SeedData
{ {
ID = ID,
Name = Name, Name = Name,
SeedName = SeedName, Noun = Noun,
SeedNoun = SeedNoun, DisplayName = DisplayName,
RoundStart = RoundStart,
Mysterious = Mysterious, Mysterious = Mysterious,
PacketPrototype = PacketPrototype,
ProductPrototypes = new List<string>(ProductPrototypes), ProductPrototypes = new List<string>(ProductPrototypes),
Chemicals = new Dictionary<string, SeedChemQuantity>(Chemicals), Chemicals = new Dictionary<string, SeedChemQuantity>(Chemicals),
ConsumeGasses = new Dictionary<Gas, float>(ConsumeGasses), ConsumeGasses = new Dictionary<Gas, float>(ConsumeGasses),
@@ -209,14 +230,14 @@ public sealed class SeedPrototype : IPrototype
PlantIconState = PlantIconState, PlantIconState = PlantIconState,
Bioluminescent = Bioluminescent, Bioluminescent = Bioluminescent,
BioluminescentColor = BioluminescentColor, BioluminescentColor = BioluminescentColor,
SplatPrototype = SplatPrototype SplatPrototype = SplatPrototype,
Ligneous = Ligneous,
// Newly cloned seed is unique. No need to unnecessarily clone if repeatedly modified.
Unique = true,
}; };
return newSeed; return newSeed;
} }
public SeedPrototype Diverge(bool modified)
{
return Clone();
}
} }

View File

@@ -1,12 +1,8 @@
using System.Collections.Generic;
using Content.Server.Botany.Components; using Content.Server.Botany.Components;
using Content.Server.Chemistry.EntitySystems; using Content.Server.Chemistry.EntitySystems;
using Content.Server.Popups; using Content.Server.Popups;
using Content.Shared.GameTicking; using Content.Shared.GameTicking;
using Content.Shared.Tag;
using JetBrains.Annotations; using JetBrains.Annotations;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.Shared.Random; using Robust.Shared.Random;
@@ -20,49 +16,13 @@ namespace Content.Server.Botany.Systems
[Dependency] private readonly IRobustRandom _robustRandom = default!; [Dependency] private readonly IRobustRandom _robustRandom = default!;
[Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!;
private int _nextUid = 0;
private float _timer = 0f; private float _timer = 0f;
public readonly Dictionary<int, SeedPrototype> Seeds = new();
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
SubscribeLocalEvent<RoundRestartCleanupEvent>(Reset);
InitializeSeeds(); InitializeSeeds();
PopulateDatabase();
}
private void PopulateDatabase()
{
_nextUid = 0;
Seeds.Clear();
foreach (var seed in _prototypeManager.EnumeratePrototypes<SeedPrototype>())
{
seed.Uid = GetNextSeedUid();
Seeds[seed.Uid] = seed;
}
}
public bool AddSeedToDatabase(SeedPrototype seed)
{
// If it's not -1, it's already in the database. Probably.
if (seed.Uid != -1)
return false;
seed.Uid = GetNextSeedUid();
Seeds[seed.Uid] = seed;
return true;
}
private int GetNextSeedUid()
{
return _nextUid++;
} }
public override void Update(float frameTime) public override void Update(float frameTime)
@@ -80,10 +40,5 @@ namespace Content.Server.Botany.Systems
plantHolder.Update(); plantHolder.Update();
} }
} }
public void Reset(RoundRestartCleanupEvent ev)
{
PopulateDatabase();
}
} }
} }

View File

@@ -1,8 +1,6 @@
using Content.Server.Botany.Components; using Content.Server.Botany.Components;
using Content.Shared.FixedPoint; using Content.Shared.FixedPoint;
using Robust.Server.GameObjects; using Robust.Server.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.Maths;
namespace Content.Server.Botany.Systems; namespace Content.Server.Botany.Systems;
@@ -10,7 +8,7 @@ public sealed partial class BotanySystem
{ {
public void ProduceGrown(EntityUid uid, ProduceComponent produce) public void ProduceGrown(EntityUid uid, ProduceComponent produce)
{ {
if (!_prototypeManager.TryIndex<SeedPrototype>(produce.SeedName, out var seed)) if (!TryGetSeed(produce, out var seed))
return; return;
if (TryComp(uid, out SpriteComponent? sprite)) if (TryComp(uid, out SpriteComponent? sprite))

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using Content.Server.Botany.Components; using Content.Server.Botany.Components;
using Content.Server.Kitchen.Components; using Content.Server.Kitchen.Components;
@@ -26,35 +27,64 @@ public sealed partial class BotanySystem
SubscribeLocalEvent<SeedComponent, ExaminedEvent>(OnExamined); SubscribeLocalEvent<SeedComponent, ExaminedEvent>(OnExamined);
} }
public bool TryGetSeed(SeedComponent comp, [NotNullWhen(true)] out SeedData? seed)
{
if (comp.Seed != null)
{
seed = comp.Seed;
return true;
}
if (comp.SeedId != null
&& _prototypeManager.TryIndex(comp.SeedId, out SeedPrototype? protoSeed))
{
seed = protoSeed;
return true;
}
seed = null;
return false;
}
public bool TryGetSeed(ProduceComponent comp, [NotNullWhen(true)] out SeedData? seed)
{
if (comp.Seed != null)
{
seed = comp.Seed;
return true;
}
if (comp.SeedId != null
&& _prototypeManager.TryIndex(comp.SeedId, out SeedPrototype? protoSeed))
{
seed = protoSeed;
return true;
}
seed = null;
return false;
}
private void OnExamined(EntityUid uid, SeedComponent component, ExaminedEvent args) private void OnExamined(EntityUid uid, SeedComponent component, ExaminedEvent args)
{ {
if (!args.IsInDetailsRange) if (!args.IsInDetailsRange)
return; return;
if (!_prototypeManager.TryIndex<SeedPrototype>(component.SeedName, out var seed)) if (!TryGetSeed(component, out var seed))
return; return;
args.PushMarkup(Loc.GetString($"seed-component-description", ("seedName", seed.DisplayName))); args.PushMarkup(Loc.GetString($"seed-component-description", ("seedName", seed.DisplayName)));
args.PushMarkup(Loc.GetString($"seed-component-plant-yield-text", ("seedYield", seed.Yield)));
if (!seed.RoundStart) args.PushMarkup(Loc.GetString($"seed-component-plant-potency-text", ("seedPotency", seed.Potency)));
{
args.PushMarkup(Loc.GetString($"seed-component-has-variety-tag", ("seedUid", seed.Uid)));
}
else
{
args.PushMarkup(Loc.GetString($"seed-component-plant-yield-text", ("seedYield", seed.Yield)));
args.PushMarkup(Loc.GetString($"seed-component-plant-potency-text", ("seedPotency", seed.Potency)));
}
} }
#region SeedPrototype prototype stuff #region SeedPrototype prototype stuff
public EntityUid SpawnSeedPacket(SeedPrototype proto, EntityCoordinates transformCoordinates) public EntityUid SpawnSeedPacket(SeedData proto, EntityCoordinates transformCoordinates)
{ {
var seed = Spawn(SeedPrototype.Prototype, transformCoordinates); var seed = Spawn(proto.PacketPrototype, transformCoordinates);
var seedComp = EnsureComp<SeedComponent>(seed); var seedComp = EnsureComp<SeedComponent>(seed);
seedComp.SeedName = proto.ID; seedComp.Seed = proto;
if (TryComp(seed, out SpriteComponent? sprite)) if (TryComp(seed, out SpriteComponent? sprite))
{ {
@@ -63,13 +93,13 @@ public sealed partial class BotanySystem
sprite.LayerSetSprite(0, new SpriteSpecifier.Rsi(proto.PlantRsi, "seed")); sprite.LayerSetSprite(0, new SpriteSpecifier.Rsi(proto.PlantRsi, "seed"));
} }
string val = Loc.GetString("botany-seed-packet-name", ("seedName", proto.SeedName), ("seedNoun", proto.SeedNoun)); string val = Loc.GetString("botany-seed-packet-name", ("seedName", proto.Name), ("seedNoun", proto.Noun));
MetaData(seed).EntityName = val; MetaData(seed).EntityName = val;
return seed; return seed;
} }
public IEnumerable<EntityUid> AutoHarvest(SeedPrototype proto, EntityCoordinates position, int yieldMod = 1) public IEnumerable<EntityUid> AutoHarvest(SeedData proto, EntityCoordinates position, int yieldMod = 1)
{ {
if (position.IsValid(EntityManager) && if (position.IsValid(EntityManager) &&
proto.ProductPrototypes.Count > 0) proto.ProductPrototypes.Count > 0)
@@ -78,10 +108,8 @@ public sealed partial class BotanySystem
return Enumerable.Empty<EntityUid>(); return Enumerable.Empty<EntityUid>();
} }
public IEnumerable<EntityUid> Harvest(SeedPrototype proto, EntityUid user, int yieldMod = 1) public IEnumerable<EntityUid> Harvest(SeedData proto, EntityUid user, int yieldMod = 1)
{ {
if (AddSeedToDatabase(proto)) proto.Name = proto.Uid.ToString();
if (proto.ProductPrototypes.Count == 0 || proto.Yield <= 0) if (proto.ProductPrototypes.Count == 0 || proto.Yield <= 0)
{ {
_popupSystem.PopupCursor(Loc.GetString("botany-harvest-fail-message"), _popupSystem.PopupCursor(Loc.GetString("botany-harvest-fail-message"),
@@ -94,16 +122,13 @@ public sealed partial class BotanySystem
return GenerateProduct(proto, Transform(user).Coordinates, yieldMod); return GenerateProduct(proto, Transform(user).Coordinates, yieldMod);
} }
public IEnumerable<EntityUid> GenerateProduct(SeedPrototype proto, EntityCoordinates position, int yieldMod = 1) public IEnumerable<EntityUid> GenerateProduct(SeedData proto, EntityCoordinates position, int yieldMod = 1)
{ {
var totalYield = 0; var totalYield = 0;
if (proto.Yield > -1) if (proto.Yield > -1)
{ {
if (yieldMod < 0) if (yieldMod < 0)
{
yieldMod = 1;
totalYield = proto.Yield; totalYield = proto.Yield;
}
else else
totalYield = proto.Yield * yieldMod; totalYield = proto.Yield * yieldMod;
@@ -112,6 +137,9 @@ public sealed partial class BotanySystem
var products = new List<EntityUid>(); var products = new List<EntityUid>();
if (totalYield > 1 || proto.HarvestRepeat != HarvestType.NoRepeat)
proto.Unique = false;
for (var i = 0; i < totalYield; i++) for (var i = 0; i < totalYield; i++)
{ {
var product = _robustRandom.Pick(proto.ProductPrototypes); var product = _robustRandom.Pick(proto.ProductPrototypes);
@@ -122,7 +150,7 @@ public sealed partial class BotanySystem
var produce = EnsureComp<ProduceComponent>(entity); var produce = EnsureComp<ProduceComponent>(entity);
produce.SeedName = proto.ID; produce.Seed = proto;
ProduceGrown(entity, produce); ProduceGrown(entity, produce);
if (TryComp<AppearanceComponent>(entity, out var appearance)) if (TryComp<AppearanceComponent>(entity, out var appearance))
@@ -141,7 +169,7 @@ public sealed partial class BotanySystem
return products; return products;
} }
public bool CanHarvest(SeedPrototype proto, EntityUid? held = null) public bool CanHarvest(SeedData proto, EntityUid? held = null)
{ {
return !proto.Ligneous || proto.Ligneous && held != null && HasComp<SharpComponent>(held); return !proto.Ligneous || proto.Ligneous && held != null && HasComp<SharpComponent>(held);
} }

View File

@@ -98,12 +98,12 @@ namespace Content.Server.Botany.Systems
{ {
if (component.Seed == null) if (component.Seed == null)
{ {
if (!_prototypeManager.TryIndex<SeedPrototype>(seeds.SeedName, out var seed)) if (!_botanySystem.TryGetSeed(seeds, out var seed))
return; return ;
_popupSystem.PopupCursor(Loc.GetString("plant-holder-component-plant-success-message", _popupSystem.PopupCursor(Loc.GetString("plant-holder-component-plant-success-message",
("seedName", seed.SeedName), ("seedName", seed.Name),
("seedNoun", seed.SeedNoun)), Filter.Entities(args.User)); ("seedNoun", seed.Noun)), Filter.Entities(args.User));
component.Seed = seed; component.Seed = seed;
component.Dead = false; component.Dead = false;
@@ -215,6 +215,7 @@ namespace Content.Server.Botany.Systems
return; return;
} }
component.Seed.Unique = false;
var seed = _botanySystem.SpawnSeedPacket(component.Seed, Transform(args.User).Coordinates); var seed = _botanySystem.SpawnSeedPacket(component.Seed, Transform(args.User).Coordinates);
seed.RandomOffset(0.25f); seed.RandomOffset(0.25f);
_popupSystem.PopupCursor(Loc.GetString("plant-holder-component-take-sample-message", _popupSystem.PopupCursor(Loc.GetString("plant-holder-component-take-sample-message",

View File

@@ -1,4 +1,4 @@
using Content.Server.Botany.Components; using Content.Server.Botany.Components;
using Content.Server.Popups; using Content.Server.Popups;
using Content.Server.Power.Components; using Content.Server.Power.Components;
using Content.Shared.Interaction; using Content.Shared.Interaction;
@@ -14,7 +14,6 @@ namespace Content.Server.Botany.Systems;
public sealed class SeedExtractorSystem : EntitySystem public sealed class SeedExtractorSystem : EntitySystem
{ {
[Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly BotanySystem _botanySystem = default!; [Dependency] private readonly BotanySystem _botanySystem = default!;
@@ -32,7 +31,7 @@ public sealed class SeedExtractorSystem : EntitySystem
if (TryComp(args.Used, out ProduceComponent? produce)) if (TryComp(args.Used, out ProduceComponent? produce))
{ {
if (!_prototypeManager.TryIndex<SeedPrototype>(produce.SeedName, out var seed)) if (!_botanySystem.TryGetSeed(produce, out var seed))
return; return;
_popupSystem.PopupCursor(Loc.GetString("seed-extractor-component-interact-message",("name", args.Used)), _popupSystem.PopupCursor(Loc.GetString("seed-extractor-component-interact-message",("name", args.Used)),
@@ -43,6 +42,9 @@ public sealed class SeedExtractorSystem : EntitySystem
var random = _random.Next(component.MinSeeds, component.MaxSeeds); var random = _random.Next(component.MinSeeds, component.MaxSeeds);
var coords = Transform(uid).Coordinates; var coords = Transform(uid).Coordinates;
if (random > 1)
seed.Unique = false;
for (var i = 0; i < random; i++) for (var i = 0; i < random; i++)
{ {
_botanySystem.SpawnSeedPacket(seed, coords); _botanySystem.SpawnSeedPacket(seed, coords);

View File

@@ -20,13 +20,13 @@ namespace Content.Server.Chemistry.ReagentEffects.PlantMetabolism
if (random.Prob(0.1f)) if (random.Prob(0.1f))
{ {
plantHolderComp.CheckForDivergence(true); plantHolderComp.EnsureUniqueSeed();
plantHolderComp.Seed.Lifespan++; plantHolderComp.Seed.Lifespan++;
} }
if (random.Prob(0.1f)) if (random.Prob(0.1f))
{ {
plantHolderComp.CheckForDivergence(true); plantHolderComp.EnsureUniqueSeed();
plantHolderComp.Seed.Endurance++; plantHolderComp.Seed.Endurance++;
} }
} }

View File

@@ -20,13 +20,13 @@ namespace Content.Server.Chemistry.ReagentEffects.PlantMetabolism
if (plantHolderComp.Seed.Potency < 100 && random.Prob(0.1f)) if (plantHolderComp.Seed.Potency < 100 && random.Prob(0.1f))
{ {
plantHolderComp.CheckForDivergence(true); plantHolderComp.EnsureUniqueSeed();
plantHolderComp.Seed.Potency++; plantHolderComp.Seed.Potency++;
} }
if (plantHolderComp.Seed.Yield > 1 && random.Prob(0.1f)) if (plantHolderComp.Seed.Yield > 1 && random.Prob(0.1f))
{ {
plantHolderComp.CheckForDivergence(true); plantHolderComp.EnsureUniqueSeed();
plantHolderComp.Seed.Yield--; plantHolderComp.Seed.Yield--;
} }
} }

View File

@@ -1,4 +1,4 @@
namespace Content.Server.Kitchen.Components; namespace Content.Server.Kitchen.Components;
/// <summary> /// <summary>
/// Applies to items that are capable of butchering entities, or /// Applies to items that are capable of butchering entities, or
@@ -7,6 +7,7 @@
[RegisterComponent] [RegisterComponent]
public sealed class SharpComponent : Component public sealed class SharpComponent : Component
{ {
// TODO just make this a tool type.
public HashSet<EntityUid> Butchering = new(); public HashSet<EntityUid> Butchering = new();
[DataField("butcherDelayModifier")] [DataField("butcherDelayModifier")]

View File

@@ -49,7 +49,7 @@
- ReagentId: Flour - ReagentId: Flour
Quantity: 10 Quantity: 10
- type: Produce - type: Produce
seed: wheat seedId: wheat
- type: entity - type: entity
name: oat bushel name: oat bushel
@@ -66,7 +66,7 @@
- ReagentId: Oats - ReagentId: Oats
Quantity: 10 Quantity: 10
- type: Produce - type: Produce
seed: oat seedId: oat
- type: Extractable - type: Extractable
juiceSolution: juiceSolution:
reagents: reagents:
@@ -88,7 +88,7 @@
- ReagentId: Glucose - ReagentId: Glucose
Quantity: 10 Quantity: 10
- type: Produce - type: Produce
seed: sugarcane seedId: sugarcane
- type: entity - type: entity
name: tower-cap log name: tower-cap log
@@ -104,7 +104,7 @@
types: types:
Blunt: 10 Blunt: 10
- type: Produce - type: Produce
seed: towercap seedId: towercap
- type: Log - type: Log
- type: entity - type: entity
@@ -130,7 +130,7 @@
- ReagentId: Histamine - ReagentId: Histamine
Quantity: 25 Quantity: 25
- type: Produce - type: Produce
seed: nettle seedId: nettle
- type: MeleeChemicalInjector - type: MeleeChemicalInjector
transferAmount: 6 #To OD someone you would need 2 nettles and about 6-7 hits, the DOT is likely to crit them if they are running away with almost no health transferAmount: 6 #To OD someone you would need 2 nettles and about 6-7 hits, the DOT is likely to crit them if they are running away with almost no health
- type: Extractable - type: Extractable
@@ -158,7 +158,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/banana.rsi sprite: Objects/Specific/Hydroponics/banana.rsi
- type: Produce - type: Produce
seed: banana seedId: banana
- type: Extractable - type: Extractable
juiceSolution: juiceSolution:
reagents: reagents:
@@ -233,7 +233,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/carrot.rsi sprite: Objects/Specific/Hydroponics/carrot.rsi
- type: Produce - type: Produce
seed: carrots seedId: carrots
- type: Extractable - type: Extractable
juiceSolution: juiceSolution:
reagents: reagents:
@@ -258,7 +258,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/lemon.rsi sprite: Objects/Specific/Hydroponics/lemon.rsi
- type: Produce - type: Produce
seed: lemon seedId: lemon
- type: Extractable - type: Extractable
juiceSolution: juiceSolution:
reagents: reagents:
@@ -285,7 +285,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/pineapple.rsi sprite: Objects/Specific/Hydroponics/pineapple.rsi
- type: Produce - type: Produce
seed: pineapple seedId: pineapple
- type: Extractable - type: Extractable
juiceSolution: juiceSolution:
reagents: reagents:
@@ -313,7 +313,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/potato.rsi sprite: Objects/Specific/Hydroponics/potato.rsi
- type: Produce - type: Produce
seed: potato seedId: potato
- type: Extractable - type: Extractable
juiceSolution: juiceSolution:
reagents: reagents:
@@ -338,7 +338,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/tomato.rsi sprite: Objects/Specific/Hydroponics/tomato.rsi
- type: Produce - type: Produce
seed: tomato seedId: tomato
- type: Extractable - type: Extractable
grindableSolutionName: food grindableSolutionName: food
juiceSolution: juiceSolution:
@@ -419,7 +419,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/eggplant.rsi sprite: Objects/Specific/Hydroponics/eggplant.rsi
- type: Produce - type: Produce
seed: eggplant seedId: eggplant
- type: entity - type: entity
name: apple name: apple
@@ -439,7 +439,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/apple.rsi sprite: Objects/Specific/Hydroponics/apple.rsi
- type: Produce - type: Produce
seed: apple seedId: apple
- type: Extractable - type: Extractable
juiceSolution: juiceSolution:
reagents: reagents:
@@ -466,7 +466,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/corn.rsi sprite: Objects/Specific/Hydroponics/corn.rsi
- type: Produce - type: Produce
seed: corn seedId: corn
- type: Extractable - type: Extractable
juiceSolution: juiceSolution:
reagents: reagents:
@@ -506,7 +506,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/onion.rsi sprite: Objects/Specific/Hydroponics/onion.rsi
- type: Produce - type: Produce
seed: onion seedId: onion
- type: SliceableFood - type: SliceableFood
count: 5 count: 5
slice: FoodOnionSlice slice: FoodOnionSlice
@@ -529,7 +529,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/onion_red.rsi sprite: Objects/Specific/Hydroponics/onion_red.rsi
- type: Produce - type: Produce
seed: onionred seedId: onionred
- type: SliceableFood - type: SliceableFood
count: 4 count: 4
slice: FoodOnionRedSlice slice: FoodOnionRedSlice
@@ -549,7 +549,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/chanterelle.rsi sprite: Objects/Specific/Hydroponics/chanterelle.rsi
- type: Produce - type: Produce
seed: chanterelle seedId: chanterelle
# Slices # Slices
@@ -623,7 +623,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/chili.rsi sprite: Objects/Specific/Hydroponics/chili.rsi
- type: Produce - type: Produce
seed: chili seedId: chili
- type: entity - type: entity
name: aloe name: aloe
@@ -643,7 +643,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/aloe.rsi sprite: Objects/Specific/Hydroponics/aloe.rsi
- type: Produce - type: Produce
seed: aloe seedId: aloe
- type: Extractable - type: Extractable
grindableSolutionName: food grindableSolutionName: food
@@ -665,7 +665,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/poppy.rsi sprite: Objects/Specific/Hydroponics/poppy.rsi
- type: Produce - type: Produce
seed: poppy seedId: poppy
- type: Extractable - type: Extractable
grindableSolutionName: food grindableSolutionName: food
@@ -687,7 +687,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/lingzhi.rsi sprite: Objects/Specific/Hydroponics/lingzhi.rsi
- type: Produce - type: Produce
seed: lingzhi seedId: lingzhi
- type: Extractable - type: Extractable
grindableSolutionName: food grindableSolutionName: food
@@ -715,7 +715,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/ambrosia_vulgaris.rsi sprite: Objects/Specific/Hydroponics/ambrosia_vulgaris.rsi
- type: Produce - type: Produce
seed: ambrosiaVulgaris seedId: ambrosiaVulgaris
- type: Extractable - type: Extractable
grindableSolutionName: food grindableSolutionName: food
- type: Clothing - type: Clothing
@@ -739,7 +739,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/galaxythistle.rsi sprite: Objects/Specific/Hydroponics/galaxythistle.rsi
- type: Produce - type: Produce
seed: galaxythistle seedId: galaxythistle
- type: Extractable - type: Extractable
grindableSolutionName: food grindableSolutionName: food
@@ -761,7 +761,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/fly_amanita.rsi sprite: Objects/Specific/Hydroponics/fly_amanita.rsi
- type: Produce - type: Produce
seed: flyAmanita seedId: flyAmanita
- type: Extractable - type: Extractable
grindableSolutionName: food grindableSolutionName: food
@@ -783,6 +783,6 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/gatfruit.rsi sprite: Objects/Specific/Hydroponics/gatfruit.rsi
- type: Produce - type: Produce
seed: gatfruit seedId: gatfruit
- type: Food - type: Food
trash: RevolverPredator trash: RevolverPredator

View File

@@ -9,7 +9,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/cannabis.rsi sprite: Objects/Specific/Hydroponics/cannabis.rsi
- type: Produce - type: Produce
seed: cannabis seedId: cannabis
- type: Food - type: Food
- type: SolutionContainerManager - type: SolutionContainerManager
solutions: solutions:
@@ -71,7 +71,7 @@
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/tobacco.rsi sprite: Objects/Specific/Hydroponics/tobacco.rsi
- type: Produce - type: Produce
seed: tobacco seedId: tobacco
- type: entity - type: entity
name: dried tobacco leaves name: dried tobacco leaves

View File

@@ -17,7 +17,7 @@
id: WheatSeeds id: WheatSeeds
components: components:
- type: Seed - type: Seed
seed: wheat seedId: wheat
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/wheat.rsi sprite: Objects/Specific/Hydroponics/wheat.rsi
@@ -27,7 +27,7 @@
id: OatSeeds id: OatSeeds
components: components:
- type: Seed - type: Seed
seed: oat seedId: oat
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/oat.rsi sprite: Objects/Specific/Hydroponics/oat.rsi
@@ -37,7 +37,7 @@
id: BananaSeeds id: BananaSeeds
components: components:
- type: Seed - type: Seed
seed: banana seedId: banana
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/banana.rsi sprite: Objects/Specific/Hydroponics/banana.rsi
@@ -47,7 +47,7 @@
id: CarrotSeeds id: CarrotSeeds
components: components:
- type: Seed - type: Seed
seed: carrots seedId: carrots
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/carrot.rsi sprite: Objects/Specific/Hydroponics/carrot.rsi
@@ -57,7 +57,7 @@
id: LemonSeeds id: LemonSeeds
components: components:
- type: Seed - type: Seed
seed: lemon seedId: lemon
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/lemon.rsi sprite: Objects/Specific/Hydroponics/lemon.rsi
@@ -67,7 +67,7 @@
id: PineappleSeeds id: PineappleSeeds
components: components:
- type: Seed - type: Seed
seed: pineapple seedId: pineapple
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/pineapple.rsi sprite: Objects/Specific/Hydroponics/pineapple.rsi
@@ -77,7 +77,7 @@
id: PotatoSeeds id: PotatoSeeds
components: components:
- type: Seed - type: Seed
seed: potato seedId: potato
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/potato.rsi sprite: Objects/Specific/Hydroponics/potato.rsi
@@ -87,7 +87,7 @@
id: SugarcaneSeeds id: SugarcaneSeeds
components: components:
- type: Seed - type: Seed
seed: sugarcane seedId: sugarcane
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/sugarcane.rsi sprite: Objects/Specific/Hydroponics/sugarcane.rsi
@@ -97,7 +97,7 @@
id: TowercapSeeds id: TowercapSeeds
components: components:
- type: Seed - type: Seed
seed: towercap seedId: towercap
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/towercap.rsi sprite: Objects/Specific/Hydroponics/towercap.rsi
@@ -107,7 +107,7 @@
id: TomatoSeeds id: TomatoSeeds
components: components:
- type: Seed - type: Seed
seed: tomato seedId: tomato
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/tomato.rsi sprite: Objects/Specific/Hydroponics/tomato.rsi
@@ -117,7 +117,7 @@
id: EggplantSeeds id: EggplantSeeds
components: components:
- type: Seed - type: Seed
seed: eggplant seedId: eggplant
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/eggplant.rsi sprite: Objects/Specific/Hydroponics/eggplant.rsi
@@ -127,7 +127,7 @@
id: AppleSeeds id: AppleSeeds
components: components:
- type: Seed - type: Seed
seed: apple seedId: apple
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/apple.rsi sprite: Objects/Specific/Hydroponics/apple.rsi
@@ -137,7 +137,7 @@
id: CornSeeds id: CornSeeds
components: components:
- type: Seed - type: Seed
seed: corn seedId: corn
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/corn.rsi sprite: Objects/Specific/Hydroponics/corn.rsi
@@ -147,7 +147,7 @@
id: ChanterelleSeeds id: ChanterelleSeeds
components: components:
- type: Seed - type: Seed
seed: chanterelle seedId: chanterelle
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/chanterelle.rsi sprite: Objects/Specific/Hydroponics/chanterelle.rsi
@@ -157,7 +157,7 @@
id: EggySeeds id: EggySeeds
components: components:
- type: Seed - type: Seed
seed: eggy seedId: eggy
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/eggy.rsi sprite: Objects/Specific/Hydroponics/eggy.rsi
@@ -168,7 +168,7 @@
id: TobaccoSeeds id: TobaccoSeeds
components: components:
- type: Seed - type: Seed
seed: tobacco seedId: tobacco
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/tobacco.rsi sprite: Objects/Specific/Hydroponics/tobacco.rsi
@@ -179,7 +179,7 @@
id: CannabisSeeds id: CannabisSeeds
components: components:
- type: Seed - type: Seed
seed: cannabis seedId: cannabis
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/cannabis.rsi sprite: Objects/Specific/Hydroponics/cannabis.rsi
@@ -190,7 +190,7 @@
id: NettleSeeds id: NettleSeeds
components: components:
- type: Seed - type: Seed
seed: nettle seedId: nettle
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/nettle.rsi sprite: Objects/Specific/Hydroponics/nettle.rsi
@@ -201,7 +201,7 @@
id: ChiliSeeds id: ChiliSeeds
components: components:
- type: Seed - type: Seed
seed: chili seedId: chili
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/chili.rsi sprite: Objects/Specific/Hydroponics/chili.rsi
@@ -212,7 +212,7 @@
id: AloeSeeds id: AloeSeeds
components: components:
- type: Seed - type: Seed
seed: aloe seedId: aloe
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/aloe.rsi sprite: Objects/Specific/Hydroponics/aloe.rsi
@@ -223,7 +223,7 @@
id: PoppySeeds id: PoppySeeds
components: components:
- type: Seed - type: Seed
seed: poppy seedId: poppy
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/poppy.rsi sprite: Objects/Specific/Hydroponics/poppy.rsi
@@ -234,7 +234,7 @@
id: LingzhiSeeds id: LingzhiSeeds
components: components:
- type: Seed - type: Seed
seed: lingzhi seedId: lingzhi
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/lingzhi.rsi sprite: Objects/Specific/Hydroponics/lingzhi.rsi
@@ -245,7 +245,7 @@
id: AmbrosiaVulgarisSeeds id: AmbrosiaVulgarisSeeds
components: components:
- type: Seed - type: Seed
seed: ambrosiaVulgaris seedId: ambrosiaVulgaris
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/ambrosia_vulgaris.rsi sprite: Objects/Specific/Hydroponics/ambrosia_vulgaris.rsi
@@ -256,7 +256,7 @@
id: GalaxythistleSeeds id: GalaxythistleSeeds
components: components:
- type: Seed - type: Seed
seed: galaxythistle seedId: galaxythistle
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/galaxythistle.rsi sprite: Objects/Specific/Hydroponics/galaxythistle.rsi
@@ -267,7 +267,7 @@
id: FlyAmanitaSeeds id: FlyAmanitaSeeds
components: components:
- type: Seed - type: Seed
seed: flyAmanita seedId: flyAmanita
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/fly_amanita.rsi sprite: Objects/Specific/Hydroponics/fly_amanita.rsi
@@ -278,7 +278,7 @@
id: GatfruitSeeds id: GatfruitSeeds
components: components:
- type: Seed - type: Seed
seed: gatfruit seedId: gatfruit
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/gatfruit.rsi sprite: Objects/Specific/Hydroponics/gatfruit.rsi
@@ -289,6 +289,6 @@
id: OnionSeeds id: OnionSeeds
components: components:
- type: Seed - type: Seed
seed: onion seedId: onion
- type: Sprite - type: Sprite
sprite: Objects/Specific/Hydroponics/onion.rsi sprite: Objects/Specific/Hydroponics/onion.rsi

View File

@@ -1,7 +1,6 @@
- type: seed - type: seed
id: wheat id: wheat
name: wheat name: wheat
seedName: wheat
displayName: wheat stalks displayName: wheat stalks
plantRsi: Objects/Specific/Hydroponics/wheat.rsi plantRsi: Objects/Specific/Hydroponics/wheat.rsi
productPrototypes: productPrototypes:
@@ -26,7 +25,6 @@
- type: seed - type: seed
id: oat id: oat
name: oat name: oat
seedName: oat
displayName: oat stalks displayName: oat stalks
plantRsi: Objects/Specific/Hydroponics/oat.rsi plantRsi: Objects/Specific/Hydroponics/oat.rsi
productPrototypes: productPrototypes:
@@ -51,7 +49,6 @@
- type: seed - type: seed
id: banana id: banana
name: banana name: banana
seedName: banana
displayName: banana plant displayName: banana plant
plantRsi: Objects/Specific/Hydroponics/banana.rsi plantRsi: Objects/Specific/Hydroponics/banana.rsi
productPrototypes: productPrototypes:
@@ -77,7 +74,6 @@
- type: seed - type: seed
id: carrots id: carrots
name: carrot name: carrot
seedName: carrot
displayName: carrots displayName: carrots
plantRsi: Objects/Specific/Hydroponics/carrot.rsi plantRsi: Objects/Specific/Hydroponics/carrot.rsi
productPrototypes: productPrototypes:
@@ -102,7 +98,6 @@
- type: seed - type: seed
id: lemon id: lemon
name: lemon name: lemon
seedName: lemon
displayName: lemon trees displayName: lemon trees
plantRsi: Objects/Specific/Hydroponics/lemon.rsi plantRsi: Objects/Specific/Hydroponics/lemon.rsi
productPrototypes: productPrototypes:
@@ -127,7 +122,6 @@
- type: seed - type: seed
id: pineapple id: pineapple
name: pineapple name: pineapple
seedName: pineapple
displayName: pineapple plant displayName: pineapple plant
plantRsi: Objects/Specific/Hydroponics/pineapple.rsi plantRsi: Objects/Specific/Hydroponics/pineapple.rsi
productPrototypes: productPrototypes:
@@ -157,7 +151,6 @@
- type: seed - type: seed
id: potato id: potato
name: potato name: potato
seedName: potato
displayName: potatoes displayName: potatoes
plantRsi: Objects/Specific/Hydroponics/potato.rsi plantRsi: Objects/Specific/Hydroponics/potato.rsi
productPrototypes: productPrototypes:
@@ -182,7 +175,6 @@
- type: seed - type: seed
id: sugarcane id: sugarcane
name: sugarcane name: sugarcane
seedName: sugarcane
displayName: sugarcanes displayName: sugarcanes
plantRsi: Objects/Specific/Hydroponics/sugarcane.rsi plantRsi: Objects/Specific/Hydroponics/sugarcane.rsi
productPrototypes: productPrototypes:
@@ -203,8 +195,7 @@
- type: seed - type: seed
id: towercap id: towercap
name: towercap name: tower cap
seedName: tower cap
displayName: tower caps displayName: tower caps
plantRsi: Objects/Specific/Hydroponics/towercap.rsi plantRsi: Objects/Specific/Hydroponics/towercap.rsi
productPrototypes: productPrototypes:
@@ -223,7 +214,6 @@
- type: seed - type: seed
id: tomato id: tomato
name: tomato name: tomato
seedName: tomato
displayName: tomato plant displayName: tomato plant
plantRsi: Objects/Specific/Hydroponics/tomato.rsi plantRsi: Objects/Specific/Hydroponics/tomato.rsi
productPrototypes: productPrototypes:
@@ -253,7 +243,6 @@
- type: seed - type: seed
id: eggplant id: eggplant
name: eggplant name: eggplant
seedName: eggplant
displayName: eggplants displayName: eggplants
plantRsi: Objects/Specific/Hydroponics/eggplant.rsi plantRsi: Objects/Specific/Hydroponics/eggplant.rsi
productPrototypes: productPrototypes:
@@ -279,7 +268,6 @@
- type: seed - type: seed
id: apple id: apple
name: apple name: apple
seedName: apple
displayName: apple tree displayName: apple tree
plantRsi: Objects/Specific/Hydroponics/apple.rsi plantRsi: Objects/Specific/Hydroponics/apple.rsi
productPrototypes: productPrototypes:
@@ -304,7 +292,6 @@
- type: seed - type: seed
id: corn id: corn
name: corn name: corn
seedName: corn
displayName: ears of corn displayName: ears of corn
plantRsi: Objects/Specific/Hydroponics/corn.rsi plantRsi: Objects/Specific/Hydroponics/corn.rsi
productPrototypes: productPrototypes:
@@ -331,7 +318,6 @@
- type: seed - type: seed
id: onion id: onion
name: onion name: onion
seedName: onion
displayName: onions displayName: onions
plantRsi: Objects/Specific/Hydroponics/onion.rsi plantRsi: Objects/Specific/Hydroponics/onion.rsi
productPrototypes: productPrototypes:
@@ -358,7 +344,6 @@
- type: seed - type: seed
id: onionred id: onionred
name: red onion name: red onion
seedName: red onion
displayName: red onions displayName: red onions
plantRsi: Objects/Specific/Hydroponics/onion_red.rsi plantRsi: Objects/Specific/Hydroponics/onion_red.rsi
productPrototypes: productPrototypes:
@@ -385,8 +370,7 @@
- type: seed - type: seed
id: chanterelle id: chanterelle
name: chanterelle name: chanterelle
seedName: chanterelle noun: spores
seedNoun: spores
displayName: chanterelle mushrooms displayName: chanterelle mushrooms
plantRsi: Objects/Specific/Hydroponics/chanterelle.rsi plantRsi: Objects/Specific/Hydroponics/chanterelle.rsi
productPrototypes: productPrototypes:
@@ -408,8 +392,7 @@
- type: seed - type: seed
id: eggy id: eggy
name: eggy name: egg-plant
seedName: egg-plant
displayName: egg-plants displayName: egg-plants
plantRsi: Objects/Specific/Hydroponics/eggy.rsi plantRsi: Objects/Specific/Hydroponics/eggy.rsi
productPrototypes: productPrototypes:
@@ -431,7 +414,6 @@
- type: seed - type: seed
id: cannabis id: cannabis
name: cannabis name: cannabis
seedName: cannabis
displayName: cannabis displayName: cannabis
plantRsi: Objects/Specific/Hydroponics/cannabis.rsi plantRsi: Objects/Specific/Hydroponics/cannabis.rsi
productPrototypes: productPrototypes:
@@ -454,7 +436,6 @@
- type: seed - type: seed
id: tobacco id: tobacco
name: tobacco name: tobacco
seedName: tobacco
displayName: tobacco plant displayName: tobacco plant
plantRsi: Objects/Specific/Hydroponics/tobacco.rsi plantRsi: Objects/Specific/Hydroponics/tobacco.rsi
productPrototypes: productPrototypes:
@@ -477,7 +458,6 @@
- type: seed - type: seed
id: nettle id: nettle
name: nettle name: nettle
seedName: nettle
displayName: nettles displayName: nettles
plantRsi: Objects/Specific/Hydroponics/nettle.rsi plantRsi: Objects/Specific/Hydroponics/nettle.rsi
productPrototypes: productPrototypes:
@@ -500,7 +480,6 @@
- type: seed - type: seed
id: chili id: chili
name: chili name: chili
seedName: chili
displayName: chilis displayName: chilis
plantRsi: Objects/Specific/Hydroponics/chili.rsi plantRsi: Objects/Specific/Hydroponics/chili.rsi
productPrototypes: productPrototypes:
@@ -530,7 +509,6 @@
- type: seed - type: seed
id: poppy id: poppy
name: poppy name: poppy
seedName: poppy
displayName: poppies displayName: poppies
plantRsi: Objects/Specific/Hydroponics/poppy.rsi plantRsi: Objects/Specific/Hydroponics/poppy.rsi
productPrototypes: productPrototypes:
@@ -555,7 +533,6 @@
- type: seed - type: seed
id: aloe id: aloe
name: aloe name: aloe
seedName: aloe
displayName: aloe displayName: aloe
plantRsi: Objects/Specific/Hydroponics/aloe.rsi plantRsi: Objects/Specific/Hydroponics/aloe.rsi
productPrototypes: productPrototypes:
@@ -580,7 +557,6 @@
- type: seed - type: seed
id: lingzhi id: lingzhi
name: lingzhi name: lingzhi
seedName: lingzhi
displayName: lingzhi displayName: lingzhi
plantRsi: Objects/Specific/Hydroponics/lingzhi.rsi plantRsi: Objects/Specific/Hydroponics/lingzhi.rsi
productPrototypes: productPrototypes:
@@ -605,7 +581,6 @@
- type: seed - type: seed
id: ambrosiaVulgaris id: ambrosiaVulgaris
name: ambrosia vulgaris name: ambrosia vulgaris
seedName: ambrosiaVulgaris
displayName: ambrosia vulgaris displayName: ambrosia vulgaris
plantRsi: Objects/Specific/Hydroponics/ambrosia_vulgaris.rsi plantRsi: Objects/Specific/Hydroponics/ambrosia_vulgaris.rsi
productPrototypes: productPrototypes:
@@ -642,7 +617,6 @@
- type: seed - type: seed
id: galaxythistle id: galaxythistle
name: galaxythistle name: galaxythistle
seedName: galaxythistle
displayName: galaxythistle displayName: galaxythistle
plantRsi: Objects/Specific/Hydroponics/galaxythistle.rsi plantRsi: Objects/Specific/Hydroponics/galaxythistle.rsi
productPrototypes: productPrototypes:
@@ -663,7 +637,6 @@
- type: seed - type: seed
id: flyAmanita id: flyAmanita
name: fly amanita name: fly amanita
seedname: flyAmanita
displayName: fly amanita displayName: fly amanita
plantRsi: Objects/Specific/Hydroponics/fly_amanita.rsi plantRsi: Objects/Specific/Hydroponics/fly_amanita.rsi
productPrototypes: productPrototypes:
@@ -688,7 +661,6 @@
- type: seed - type: seed
id: gatfruit id: gatfruit
name: gatfruit name: gatfruit
seedName: gatfruit
displayName: gatfruit tree displayName: gatfruit tree
plantRsi: Objects/Specific/Hydroponics/gatfruit.rsi plantRsi: Objects/Specific/Hydroponics/gatfruit.rsi
productPrototypes: productPrototypes: