Improve plant chemical and gas crossing (#19950)
Chemicals and gasses are not all wholesale swapped but given 50/50 for every chemical or gas.
This commit is contained in:
@@ -86,7 +86,7 @@ public sealed class MutationSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
SeedData result = b.Clone();
|
SeedData result = b.Clone();
|
||||||
|
|
||||||
result.Chemicals = Random(0.5f) ? a.Chemicals : result.Chemicals;
|
CrossChemicals(ref result.Chemicals, a.Chemicals);
|
||||||
|
|
||||||
CrossFloat(ref result.NutrientConsumption, a.NutrientConsumption);
|
CrossFloat(ref result.NutrientConsumption, a.NutrientConsumption);
|
||||||
CrossFloat(ref result.WaterConsumption, a.WaterConsumption);
|
CrossFloat(ref result.WaterConsumption, a.WaterConsumption);
|
||||||
@@ -115,8 +115,9 @@ public sealed class MutationSystem : EntitySystem
|
|||||||
CrossBool(ref result.Bioluminescent, a.Bioluminescent);
|
CrossBool(ref result.Bioluminescent, a.Bioluminescent);
|
||||||
CrossBool(ref result.TurnIntoKudzu, a.TurnIntoKudzu);
|
CrossBool(ref result.TurnIntoKudzu, a.TurnIntoKudzu);
|
||||||
CrossBool(ref result.CanScream, a.CanScream);
|
CrossBool(ref result.CanScream, a.CanScream);
|
||||||
result.ExudeGasses = Random(0.5f) ? a.ExudeGasses : result.ExudeGasses;
|
CrossGasses(ref result.ExudeGasses, a.ExudeGasses);
|
||||||
result.ConsumeGasses = Random(0.5f) ? a.ConsumeGasses : result.ConsumeGasses;
|
CrossGasses(ref result.ConsumeGasses, a.ConsumeGasses);
|
||||||
|
|
||||||
result.BioluminescentColor = Random(0.5f) ? a.BioluminescentColor : result.BioluminescentColor;
|
result.BioluminescentColor = Random(0.5f) ? a.BioluminescentColor : result.BioluminescentColor;
|
||||||
|
|
||||||
// Hybrids have a high chance of being seedless. Balances very
|
// Hybrids have a high chance of being seedless. Balances very
|
||||||
@@ -292,6 +293,70 @@ public sealed class MutationSystem : EntitySystem
|
|||||||
return color;
|
return color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CrossChemicals(ref Dictionary<string, SeedChemQuantity> val, Dictionary<string, SeedChemQuantity> other)
|
||||||
|
{
|
||||||
|
// Go through chemicals from the pollen in swab
|
||||||
|
foreach (var other_chem in other)
|
||||||
|
{
|
||||||
|
// if both have same chemical, randomly pick potency ratio from the two.
|
||||||
|
if (val.ContainsKey(other_chem.Key))
|
||||||
|
{
|
||||||
|
val[other_chem.Key] = Random(0.5f) ? other_chem.Value : val[other_chem.Key];
|
||||||
|
}
|
||||||
|
// if target plant doesn't have this chemical, has 50% chance to add it.
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (Random(0.5f))
|
||||||
|
{
|
||||||
|
val.Add(other_chem.Key, other_chem.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the target plant has chemical that the pollen in swab does not, 50% chance to remove it.
|
||||||
|
foreach (var this_chem in val)
|
||||||
|
{
|
||||||
|
if (!other.ContainsKey(this_chem.Key))
|
||||||
|
{
|
||||||
|
if (Random(0.5f))
|
||||||
|
{
|
||||||
|
val.Remove(this_chem.Key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CrossGasses(ref Dictionary<Gas, float> val, Dictionary<Gas, float> other)
|
||||||
|
{
|
||||||
|
// Go through gasses from the pollen in swab
|
||||||
|
foreach (var other_gas in other)
|
||||||
|
{
|
||||||
|
// if both have same gas, randomly pick ammount from the two.
|
||||||
|
if (val.ContainsKey(other_gas.Key))
|
||||||
|
{
|
||||||
|
val[other_gas.Key] = Random(0.5f) ? other_gas.Value : val[other_gas.Key];
|
||||||
|
}
|
||||||
|
// if target plant doesn't have this gas, has 50% chance to add it.
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (Random(0.5f))
|
||||||
|
{
|
||||||
|
val.Add(other_gas.Key, other_gas.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if the target plant has gas that the pollen in swab does not, 50% chance to remove it.
|
||||||
|
foreach (var this_gas in val)
|
||||||
|
{
|
||||||
|
if (!other.ContainsKey(this_gas.Key))
|
||||||
|
{
|
||||||
|
if (Random(0.5f))
|
||||||
|
{
|
||||||
|
val.Remove(this_gas.Key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
private void CrossFloat(ref float val, float other)
|
private void CrossFloat(ref float val, float other)
|
||||||
{
|
{
|
||||||
val = Random(0.5f) ? val : other;
|
val = Random(0.5f) ? val : other;
|
||||||
|
|||||||
Reference in New Issue
Block a user