mirror of
https://github.com/DeltaV-Station/Delta-v.git
synced 2026-10-10 00:07:27 +00:00
* Fix the sensor monitoring console forcing a GC every 3 seconds (#38146) * Optimize sensor monitoring window graph drawing * Add shared static Vector2 pool for all GraphView instances * Address requested changes * remove lock * Update submodule to 264.0.0 (#38629) * Toy/Plushie Inhands and Wearables (#38514) * Fixed dependency injection and some other issues in a few places. * More issue fixes * patchfor broken NetworkConfiguratorLinkMenu (#38632) fix * Fix solutions flickering when transferring contents (#34838) * Use Solution clones when applying SolutionComponent states * Revert "Use Solution clones when applying SolutionComponent states" This reverts commit 013fd111cf92b22562e00f98a7aaa49bc4b4ed62. * Make Solution implement ICloneable and rename Clone method. * Copy CanReact value when cloning a Solution * Convert to IRobustCloneable * Fix typos in guidebook: Buisness → Business (#38636) * Fix typo in `MinorAntagonists.xml` Buisness → Business * Fix typo in `YourFirstCharacter.xml` Buisness → Business * Various Headphones Fixes and Tweaks (#38479) * sprites, wearables * neck * icon-on sprite * Cleanup prototype instantiation in `DamageTest` (#38639) Cleanup prototype instantiation in DamageTest * Cleanup prototype instantiation in `ExplosionSystem` (#38642) Cleanup prototype instantiation in ExplosionSystem * AddBodyPartCommand localization. (#38612) commit * fix ItemSlotsSystem debug assert (#38655) * Allow the Command & Super door remotes to use the access of their user. (Re-creation of PR due to changes to game balance) (#35536) * Added directional beacons (#38284) * Added directional beacons Signed-off-by: Nox38 <nebulousnox38@gmail.com> * Fixed names Signed-off-by: Nox38 <nebulousnox38@gmail.com> --------- Signed-off-by: Nox38 <nebulousnox38@gmail.com> * Power stat and nuke codes commands get some LEC love. (#38585) * commit * requested changes. * Dsay Dirty and Follow commands converted to LEC and localized. (#38666) * commit * whoopwhoopwhoop * Retro laser sprite fix (#38676) * Fixed everything except the icon Signed-off-by: Nox38 <nebulousnox38@gmail.com> * fixed icon Signed-off-by: Nox38 <nebulousnox38@gmail.com> --------- Signed-off-by: Nox38 <nebulousnox38@gmail.com> * fix water coolers (#38681) * Monochromacy typo fix (#38686) * fixes the typo * Fixed cloning looking for the trait, not the component, RE https://github.com/space-wizards/space-station-14/pull/38686#issuecomment-3025093504 * Apply suggestions from code review --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * Validate `CloningSettingsPrototype`s (#38688) * Validate CloningSettingsPrototypes * Update Content.IntegrationTests/Tests/Cloning/CloningSettingsPrototypeTest.cs Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * Check EventComponents too --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * Add test of objective-related console commands (#36400) * Add test of objective add/list/remove commands * Not sure why we're validating test prototypes, but sure * We don't need a map * Improvements and fixups for New Status Effect API (#38660) * Predict healing and bloodstream (#38690) * initial commit * reapply 38126 * fix rootable * someone missed an important minus sign here * try this * fix * fix * reenable crit hits * cleanup * fix status time dirtying * fix * camelCase * Healing and bloodstream prediction fixes. * Resolving Wizard casting recall on nuke disk making it impossible to disarm (#38661) * Resolving Wizard Recall on Nuke disk making it impossible to disarm - Adding a DisarmBomb case to nuke status update loop - Changing a few methods and parameters to properly follow formatting standards - Updating some names to follow camelCase * Updating missed tag * Reverting DataField change Should prevent this preventative bugfix being a breaking change. * Switch HSV to the default colorspace for character customization (#38434) * Made HSV default for character editor * Adds/fixes comments to HSV defaulting * Added dropbox fix, potentially cursed * Revert "Added dropbox fix, potentially cursed" This reverts commit a709883366fbee813e839742125e70844672af29. --------- Co-authored-by: TrixxedHeart <46364955+TrixxedBit@users.noreply.github.com> * Fix: Don't deploy foldables when clicking on items inside containers (#38709) * Fix * Apply suggestions from code review --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * Pressure Relief Valve (#36708) * initial system (this math is probably WRONG) * General code cleanup and OnExamined support (holy moly this code sucks) * UICode and related events foundation TODO: - Actually write the XAML UI and the underlying system - Un-shitcode the entire thing - Actually test everything... * Working UI code TODO: Make predicted, as this certainly isn't predicted. Even though I said it was. It isn't. * Remove one TODO for unshitcoding the examine code * Add reminder yea * Make predicted (defenitely isn't) (also defenitely isn't a copypaste from pressure pump code) * It's predicted! TODO: - Give it snazzy predicted visuals! - Have a different field for pressure entry, lest it gets bulldozed every UI update. * Improve gas pressure relief valve UI TODO: Reminder to reduce amount of dirties using deltafields * Implement DirtyField prediction * Entity<T> cleanup A lot of Entity<T> conversions and lukewarm cleanup. Also got caught copy pasting code in 4K UHD but it's not like you couldn't tell. * More cleanup and comments * Remove TODO comment on bulldozing window title * """refactoring""" - Move appearance out of shared and finally fix it. Pointless to predict appearance in this instance. - More Entity<T> conversions because I like them. - Move UI creation handling over entirely to the ActivatableUI system. - Fix a hardcoded locale string (why????). * Add visuals * Revert debugging variable replacememt yea * Revert skissue * Remove unused using directives and remove TODO * Localize, cleanup, document * Fix adminlogging discrepancy * Add ability to construct, add guidebook entry * Clear up comment * Add guidebook tooltip to valve * Convert GasPressureReliefValveBoundUserInterface declaration into primary constructor * Adds more input handling and adds autofill on open * Un-deepfry input validator shitcode Genuinely what was I smoking * improve visuals logic * Refactor again - Update math to the correct implementation - Moved code that could be re-used in the future into a helper method under AtmosphereSystem.Gases.cs * I'm sorry but I hate warnings * Remove unused using directive in AtmosphereSystem.Gases.cs * Review and cleanup * Lukewarm UI glossup * Maintainer for the upstream project btw * Remove redundant state sets and messy logic * Unduplicate valve updater code * Redo UI (im sorry Slarti) * run tests * Test refactored UI messaging * Second round of UI improvements - God please find a way to improve this system. Feels bad. * Update loop implementation * Further predict UI * Clear up SetToCurrentThreshold * cleanup * Update to master + pipe layers and bug fixes want to run tests * fixes * Deploy rename pipebomb * Documentation and requested changes * Rename the method that wiggled away * Undo rounding changes * Fix comment * Rename and cleanup * Apply suggestions from code review --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * Fix TextLinkTag (#32203) * Adjust uplink buy button to be under item icon (#38596) * Adjusted uplink buy button to be under item icon * Put the discount subtext under the icon * Indent fixes, added margin --------- Co-authored-by: TrixxedHeart <46364955+TrixxedBit@users.noreply.github.com> * Scurrets - Audio Improvements (#38482) * Scurret audio tuning * Add new sfx * Update sneezing sfx * YAML support * Rename a folder * make telesci wreck easier (#37569) rel * Validate `ShaderPrototype` IDs (#38728) * Convert all shader prototype string literals to protoids in overlays * Convert more shader prototype literal strings to protoids * Convert ValidatePrototypeId to ProtoId * Later * [BUGFIX] Fixed revenant malfunction ability not working properly only MediBots and Stasis bed (#38664) * fixed * clean up * orks fix smart * review fix 1 * more requested changes * less cursed * more descriptive description * better wording * Tiny Tiny Cleanup of the EyeClosingSystem. (#38734) Update EyeClosingSystem.cs * Fix human skin tone distribution (#38701) * fix: Use PredictedQueueDel for gib spell (#38729) * fix: don't default to uncharged sprite state for cells (#38730) * Fix Hristov description - remove inaccurate technical specs (#38746) - Removes inaccurate 'armor piercing 14.5mm shells' reference - Replaces it with a more funny description, matching the style of the other snipers and guns - Keeps ammunition type '.60 anti-materiel ammo' specification - Fixes issue #38590 Co-authored-by: Arthur Fiorese de Andrade <aandrade@cmcxs.gov.br> * feat: allow mopping evaporating puddles (#38743) * Validate remaining `ProtoId` strings (#38747) Validate remaining ProtoId strings * Validate `ProtoId`s in tests (#38745) * Convert string literals to protoids in Content.Tests * Convert string literals to protoids or consts in Content.IntegrationTests * Fix linter failures Tricksy static using misled me * Cleanup warning in StomachSystem (#38748) you did not see this * Vox scars (#38592) * Added vox scars n'stuff, renamed vox_tattoos.ftl to just vox.ftl * Revert "Added vox scars n'stuff, renamed vox_tattoos.ftl to just vox.ftl" This reverts commit c73da55ba3b39ddf93b493aecd85604c54dd8a15. * locale key fix * Changed top surgery scar names to be more generalized * Adjusted face scars * Formatting fixes --------- Co-authored-by: TrixxedHeart <46364955+TrixxedBit@users.noreply.github.com> * UnlockNode command to LEC. (#38751) * commit * Update UnlockNodeCommand.cs * commit * move command locale to its own file. * Update Content.Server/Xenoarchaeology/Artifact/UnlockNodeCommand.cs --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * Typofixes for figurine dialogue (#38737) * Typofixes for figurine dialogue * Forgot two * Janitor Tool: Wire Brush (#38667) * Wow! It's -brush- * spacing. * Update Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * Update Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * fixed changes --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * Minor escape menu UX improvements (#38650) * fix: spellbooks can have infinite charges (#38376) * fix: spellbooks can have infinite charges * refactor: indicate infinite spellbook charges with null Not sure if I like this much better...
392 lines
13 KiB
C#
392 lines
13 KiB
C#
using Content.Server.Botany.Components;
|
|
using Content.Server.Botany.Systems;
|
|
using Content.Server.EntityEffects;
|
|
using Content.Shared.Atmos;
|
|
using Content.Shared.Database;
|
|
using Content.Shared.Random;
|
|
using Robust.Shared.Audio;
|
|
using Robust.Shared.Prototypes;
|
|
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
|
using Robust.Shared.Utility;
|
|
|
|
namespace Content.Server.Botany;
|
|
|
|
[Prototype]
|
|
public sealed partial class SeedPrototype : SeedData, IPrototype
|
|
{
|
|
[IdDataField] public string ID { get; private set; } = 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 partial struct SeedChemQuantity
|
|
{
|
|
/// <summary>
|
|
/// Minimum amount of chemical that is added to produce, regardless of the potency
|
|
/// </summary>
|
|
[DataField("Min")] public int Min;
|
|
|
|
/// <summary>
|
|
/// Maximum amount of chemical that can be produced after taking plant potency into account.
|
|
/// </summary>
|
|
[DataField("Max")] public int Max;
|
|
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
[DataField("PotencyDivisor")] public int PotencyDivisor;
|
|
|
|
/// <summary>
|
|
/// Inherent chemical is one that is NOT result of mutation or crossbreeding. These chemicals are removed if species mutation is executed.
|
|
/// </summary>
|
|
[DataField("Inherent")] public bool Inherent = true;
|
|
}
|
|
|
|
// 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), typeof(EntityEffectSystem), typeof(MutationSystem))]
|
|
public partial class SeedData
|
|
{
|
|
#region Tracking
|
|
|
|
/// <summary>
|
|
/// The name of this seed. Determines the name of seed packets.
|
|
/// </summary>
|
|
[DataField("name")]
|
|
public string Name { get; private set; } = "";
|
|
|
|
/// <summary>
|
|
/// 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>
|
|
[DataField("noun")]
|
|
public string Noun { get; private set; } = "";
|
|
|
|
/// <summary>
|
|
/// Name displayed when examining the hydroponics tray. Describes the actual plant, not the seed itself.
|
|
/// </summary>
|
|
[DataField("displayName")]
|
|
public string DisplayName { get; private set; } = "";
|
|
|
|
[DataField("mysterious")] public bool Mysterious;
|
|
|
|
/// <summary>
|
|
/// If true, the properties of this seed cannot be modified.
|
|
/// </summary>
|
|
[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
|
|
|
|
#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]
|
|
public List<EntProtoId> ProductPrototypes = new();
|
|
|
|
[DataField] public Dictionary<string, SeedChemQuantity> Chemicals = new();
|
|
|
|
[DataField] public Dictionary<Gas, float> ConsumeGasses = new();
|
|
|
|
[DataField] public Dictionary<Gas, float> ExudeGasses = new();
|
|
|
|
#endregion
|
|
|
|
#region Tolerances
|
|
|
|
[DataField] public float NutrientConsumption = 0.75f;
|
|
|
|
[DataField] public float WaterConsumption = 0.5f;
|
|
[DataField] public float IdealHeat = 293f;
|
|
[DataField] public float HeatTolerance = 10f;
|
|
[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 WeedTolerance = 5f;
|
|
|
|
[DataField] public float WeedHighLevelThreshold = 10f;
|
|
|
|
#endregion
|
|
|
|
#region General traits
|
|
|
|
[DataField] public float Endurance = 100f;
|
|
|
|
[DataField] public int Yield;
|
|
[DataField] public float Lifespan;
|
|
[DataField] public float Maturation;
|
|
[DataField] public float Production;
|
|
[DataField] public int GrowthStages = 6;
|
|
|
|
[DataField] public HarvestType HarvestRepeat = HarvestType.NoRepeat;
|
|
|
|
[DataField] public float Potency = 1f;
|
|
|
|
/// <summary>
|
|
/// If true, cannot be harvested for seeds. Balances hybrids and
|
|
/// mutations.
|
|
/// </summary>
|
|
[DataField] public bool Seedless = false;
|
|
|
|
/// <summary>
|
|
/// If false, rapidly decrease health while growing. Used to kill off
|
|
/// plants with "bad" mutations.
|
|
/// </summary>
|
|
[DataField] public bool Viable = true;
|
|
|
|
/// <summary>
|
|
/// If true, a sharp tool is required to harvest this plant.
|
|
/// </summary>
|
|
[DataField] 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(required: true)]
|
|
public ResPath PlantRsi { get; set; } = default!;
|
|
|
|
[DataField] public string PlantIconState { get; set; } = "produce";
|
|
|
|
/// <summary>
|
|
/// Screams random sound from collection SoundCollectionSpecifier
|
|
/// </summary>
|
|
[DataField]
|
|
public SoundSpecifier ScreamSound = new SoundCollectionSpecifier("PlantScreams", AudioParams.Default.WithVolume(-10));
|
|
|
|
[DataField("screaming")] public bool CanScream;
|
|
|
|
[DataField(customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))] public string KudzuPrototype = "WeakKudzu";
|
|
|
|
[DataField] public bool TurnIntoKudzu;
|
|
[DataField] public string? SplatPrototype { get; set; }
|
|
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// The mutation effects that have been applied to this plant.
|
|
/// </summary>
|
|
[DataField] public List<RandomPlantMutation> Mutations { get; set; } = new();
|
|
|
|
/// <summary>
|
|
/// The seed prototypes this seed may mutate into when prompted to.
|
|
/// </summary>
|
|
[DataField]
|
|
public List<ProtoId<SeedPrototype>> MutationPrototypes = new();
|
|
|
|
/// <summary>
|
|
/// Log impact for when the seed is planted.
|
|
/// </summary>
|
|
[DataField]
|
|
public LogImpact? PlantLogImpact = null;
|
|
|
|
/// <summary>
|
|
/// Log impact for when the seed is harvested.
|
|
/// </summary>
|
|
[DataField]
|
|
public LogImpact? HarvestLogImpact = null;
|
|
|
|
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<EntProtoId>(ProductPrototypes),
|
|
MutationPrototypes = new List<ProtoId<SeedPrototype>>(MutationPrototypes),
|
|
Chemicals = new Dictionary<string, SeedChemQuantity>(Chemicals),
|
|
ConsumeGasses = new Dictionary<Gas, float>(ConsumeGasses),
|
|
ExudeGasses = new Dictionary<Gas, float>(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,
|
|
|
|
Seedless = Seedless,
|
|
Viable = Viable,
|
|
Ligneous = Ligneous,
|
|
|
|
PlantRsi = PlantRsi,
|
|
PlantIconState = PlantIconState,
|
|
CanScream = CanScream,
|
|
TurnIntoKudzu = TurnIntoKudzu,
|
|
SplatPrototype = SplatPrototype,
|
|
Mutations = new List<RandomPlantMutation>(),
|
|
|
|
// Newly cloned seed is unique. No need to unnecessarily clone if repeatedly modified.
|
|
Unique = true,
|
|
};
|
|
|
|
newSeed.Mutations.AddRange(Mutations);
|
|
return newSeed;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Handles copying most species defining data from 'other' to this seed while keeping the accumulated mutations intact.
|
|
/// </summary>
|
|
public SeedData SpeciesChange(SeedData other)
|
|
{
|
|
var newSeed = new SeedData
|
|
{
|
|
Name = other.Name,
|
|
Noun = other.Noun,
|
|
DisplayName = other.DisplayName,
|
|
Mysterious = other.Mysterious,
|
|
|
|
PacketPrototype = other.PacketPrototype,
|
|
ProductPrototypes = new List<EntProtoId>(other.ProductPrototypes),
|
|
MutationPrototypes = new List<ProtoId<SeedPrototype>>(other.MutationPrototypes),
|
|
|
|
Chemicals = new Dictionary<string, SeedChemQuantity>(Chemicals),
|
|
ConsumeGasses = new Dictionary<Gas, float>(ConsumeGasses),
|
|
ExudeGasses = new Dictionary<Gas, float>(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 = other.GrowthStages,
|
|
HarvestRepeat = HarvestRepeat,
|
|
Potency = Potency,
|
|
|
|
Mutations = Mutations,
|
|
|
|
Seedless = Seedless,
|
|
Viable = Viable,
|
|
Ligneous = Ligneous,
|
|
|
|
PlantRsi = other.PlantRsi,
|
|
PlantIconState = other.PlantIconState,
|
|
CanScream = CanScream,
|
|
TurnIntoKudzu = TurnIntoKudzu,
|
|
SplatPrototype = other.SplatPrototype,
|
|
|
|
// Newly cloned seed is unique. No need to unnecessarily clone if repeatedly modified.
|
|
Unique = true,
|
|
};
|
|
|
|
// Adding the new chemicals from the new species.
|
|
foreach (var otherChem in other.Chemicals)
|
|
{
|
|
newSeed.Chemicals.TryAdd(otherChem.Key, otherChem.Value);
|
|
}
|
|
|
|
// Removing the inherent chemicals from the old species. Leaving mutated/crossbread ones intact.
|
|
foreach (var originalChem in newSeed.Chemicals)
|
|
{
|
|
if (!other.Chemicals.ContainsKey(originalChem.Key) && originalChem.Value.Inherent)
|
|
{
|
|
newSeed.Chemicals.Remove(originalChem.Key);
|
|
}
|
|
}
|
|
|
|
return newSeed;
|
|
}
|
|
}
|