Carry over other mutations when doing species mutation (#20551)
This commit is contained in:
@@ -56,9 +56,26 @@ public enum HarvestType : byte
|
|||||||
[DataDefinition]
|
[DataDefinition]
|
||||||
public partial struct SeedChemQuantity
|
public partial struct SeedChemQuantity
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Minimum amount of chemical that is added to produce, regardless of the potency
|
||||||
|
/// </summary>
|
||||||
[DataField("Min")] public int Min;
|
[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;
|
[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;
|
[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.
|
// TODO reduce the number of friends to a reasonable level. Requires ECS-ing things like plant holder component.
|
||||||
@@ -293,4 +310,82 @@ public partial class SeedData
|
|||||||
|
|
||||||
return newSeed;
|
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<string>(other.ProductPrototypes),
|
||||||
|
MutationPrototypes = new List<string>(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,
|
||||||
|
|
||||||
|
Seedless = Seedless,
|
||||||
|
Viable = Viable,
|
||||||
|
Slip = Slip,
|
||||||
|
Sentient = Sentient,
|
||||||
|
Ligneous = Ligneous,
|
||||||
|
|
||||||
|
PlantRsi = other.PlantRsi,
|
||||||
|
PlantIconState = other.PlantIconState,
|
||||||
|
Bioluminescent = Bioluminescent,
|
||||||
|
CanScream = CanScream,
|
||||||
|
TurnIntoKudzu = TurnIntoKudzu,
|
||||||
|
BioluminescentColor = BioluminescentColor,
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
Chemicals.TryAdd(otherChem.Key, otherChem.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Removing the inherent chemicals from the old species. Leaving mutated/crossbread ones intact.
|
||||||
|
foreach (var originalChem in Chemicals)
|
||||||
|
{
|
||||||
|
if (!other.Chemicals.ContainsKey(originalChem.Key) && originalChem.Value.Inherent)
|
||||||
|
{
|
||||||
|
Chemicals.Remove(originalChem.Key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return newSeed;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using Robust.Shared.Random;
|
|||||||
using Content.Shared.Chemistry.Reagent;
|
using Content.Shared.Chemistry.Reagent;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Content.Shared.Atmos;
|
using Content.Shared.Atmos;
|
||||||
|
using FastAccessors;
|
||||||
|
|
||||||
namespace Content.Server.Botany;
|
namespace Content.Server.Botany;
|
||||||
|
|
||||||
@@ -269,6 +270,7 @@ public sealed class MutationSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
seedChemQuantity.Min = 1;
|
seedChemQuantity.Min = 1;
|
||||||
seedChemQuantity.Max = 1 + amount;
|
seedChemQuantity.Max = 1 + amount;
|
||||||
|
seedChemQuantity.Inherent = false;
|
||||||
}
|
}
|
||||||
int potencyDivisor = (int) Math.Ceiling(100.0f / seedChemQuantity.Max);
|
int potencyDivisor = (int) Math.Ceiling(100.0f / seedChemQuantity.Max);
|
||||||
seedChemQuantity.PotencyDivisor = potencyDivisor;
|
seedChemQuantity.PotencyDivisor = potencyDivisor;
|
||||||
@@ -295,10 +297,7 @@ public sealed class MutationSystem : EntitySystem
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var oldSeed = seed.Clone();
|
seed = seed.SpeciesChange(protoSeed);
|
||||||
seed = protoSeed.Clone();
|
|
||||||
seed.Potency = oldSeed.Potency;
|
|
||||||
seed.Yield = oldSeed.Yield;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Color RandomColor(Color color, int bits, int totalbits, float mult)
|
private Color RandomColor(Color color, int bits, int totalbits, float mult)
|
||||||
@@ -335,7 +334,9 @@ public sealed class MutationSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
if (Random(0.5f))
|
if (Random(0.5f))
|
||||||
{
|
{
|
||||||
val.Add(otherChem.Key, otherChem.Value);
|
var fixedChem = otherChem.Value;
|
||||||
|
fixedChem.Inherent = false;
|
||||||
|
val.Add(otherChem.Key, fixedChem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user