using Content.Server.Botany.Components; using Content.Server.Botany.Systems; using Content.Shared.Atmos; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; using Robust.Shared.Utility; namespace Content.Server.Botany; [Prototype("seed")] public sealed class SeedPrototype : SeedData, IPrototype { [IdDataField] public string ID { get; private init; } = default!; } public enum HarvestType : byte { NoRepeat, Repeat, SelfHarvest } /* public enum PlantSpread : byte { NoSpread, Creepers, Vines, } public enum PlantMutation : byte { NoMutation, Mutable, HighlyMutable, } public enum PlantCarnivorous : byte { NotCarnivorous, EatPests, EatLivingBeings, } public enum PlantJuicy : byte { NotJuicy, Juicy, Slippery, } */ [DataDefinition] public struct SeedChemQuantity { [DataField("Min")] public int Min; [DataField("Max")] public int Max; [DataField("PotencyDivisor")] public int PotencyDivisor; } // TODO reduce the number of friends to a reasonable level. Requires ECS-ing things like plant holder component. [Virtual, DataDefinition] [Access(typeof(BotanySystem), typeof(PlantHolderSystem), typeof(SeedExtractorSystem), typeof(PlantHolderComponent))] public class SeedData { #region Tracking /// /// The name of this seed. Determines the name of seed packets. /// [DataField("name")] public string Name = string.Empty; /// /// 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. /// [DataField("noun")] public string Noun = "seeds"; /// /// Name displayed when examining the hydroponics tray. Describes the actual plant, not the seed itself. /// [DataField("displayName")] public string DisplayName = string.Empty; [DataField("mysterious")] public bool Mysterious; /// /// If true, the properties of this seed cannot be modified. /// [DataField("immutable")] public bool Immutable; /// /// 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. /// [ViewVariables] public bool Unique = false; // seed-prototypes or yaml-defined seeds for entity prototypes will not generally be unique. #endregion #region Output /// /// The entity prototype that is spawned when this type of seed is extracted from produce using a seed extractor. /// [DataField("packetPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] public string PacketPrototype = "SeedBase"; /// /// The entity prototype this seed spawns when it gets harvested. /// [DataField("productPrototypes", customTypeSerializer: typeof(PrototypeIdListSerializer))] public List ProductPrototypes = new(); [DataField("chemicals")] public Dictionary Chemicals = new(); [DataField("consumeGasses")] public Dictionary ConsumeGasses = new(); [DataField("exudeGasses")] public Dictionary ExudeGasses = new(); #endregion #region Tolerances [DataField("nutrientConsumption")] public float NutrientConsumption = 0.25f; [DataField("waterConsumption")] public float WaterConsumption = 3f; [DataField("idealHeat")] public float IdealHeat = 293f; [DataField("heatTolerance")] public float HeatTolerance = 20f; [DataField("idealLight")] public float IdealLight = 7f; [DataField("lightTolerance")] public float LightTolerance = 5f; [DataField("toxinsTolerance")] public float ToxinsTolerance = 4f; [DataField("lowPressureTolerance")] public float LowPressureTolerance = 25f; [DataField("highPressureTolerance")] public float HighPressureTolerance = 200f; [DataField("pestTolerance")] public float PestTolerance = 5f; [DataField("weedTolerance")] public float WeedTolerance = 5f; #endregion #region General traits [DataField("endurance")] public float Endurance = 100f; [DataField("yield")] public int Yield; [DataField("lifespan")] public float Lifespan; [DataField("maturation")] public float Maturation; [DataField("production")] public float Production; [DataField("growthStages")] public int GrowthStages = 6; [DataField("harvestRepeat")] public HarvestType HarvestRepeat = HarvestType.NoRepeat; [DataField("potency")] public float Potency = 1f; /// /// If true, a sharp tool is required to harvest this plant. /// [DataField("ligneous")] public bool Ligneous; // No, I'm not removing these. // if you re-add these, make sure that they get cloned. //public PlantSpread Spread { get; set; } //public PlantMutation Mutation { get; set; } //public float AlterTemperature { get; set; } //public PlantCarnivorous Carnivorous { get; set; } //public bool Parasite { get; set; } //public bool Hematophage { get; set; } //public bool Thorny { get; set; } //public bool Stinging { get; set; } // public bool Teleporting { get; set; } // public PlantJuicy Juicy { get; set; } #endregion #region Cosmetics [DataField("plantRsi", required: true)] public ResourcePath PlantRsi { get; set; } = default!; [DataField("plantIconState")] public string PlantIconState { get; set; } = "produce"; [DataField("bioluminescent")] public bool Bioluminescent { get; set; } [DataField("bioluminescentColor")] public Color BioluminescentColor { get; set; } = Color.White; [DataField("splatPrototype")] public string? SplatPrototype { get; set; } #endregion public SeedData Clone() { DebugTools.Assert(!Immutable, "There should be no need to clone an immutable seed."); var newSeed = new SeedData { Name = Name, Noun = Noun, DisplayName = DisplayName, Mysterious = Mysterious, PacketPrototype = PacketPrototype, ProductPrototypes = new List(ProductPrototypes), Chemicals = new Dictionary(Chemicals), ConsumeGasses = new Dictionary(ConsumeGasses), ExudeGasses = new Dictionary(ExudeGasses), NutrientConsumption = NutrientConsumption, WaterConsumption = WaterConsumption, IdealHeat = IdealHeat, HeatTolerance = HeatTolerance, IdealLight = IdealLight, LightTolerance = LightTolerance, ToxinsTolerance = ToxinsTolerance, LowPressureTolerance = LowPressureTolerance, HighPressureTolerance = HighPressureTolerance, PestTolerance = PestTolerance, WeedTolerance = WeedTolerance, Endurance = Endurance, Yield = Yield, Lifespan = Lifespan, Maturation = Maturation, Production = Production, GrowthStages = GrowthStages, HarvestRepeat = HarvestRepeat, Potency = Potency, PlantRsi = PlantRsi, PlantIconState = PlantIconState, Bioluminescent = Bioluminescent, BioluminescentColor = BioluminescentColor, SplatPrototype = SplatPrototype, Ligneous = Ligneous, // Newly cloned seed is unique. No need to unnecessarily clone if repeatedly modified. Unique = true, }; return newSeed; } }