]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Improve plant chemical and gas crossing (#19950)
authordrteaspoon420 <87363733+drteaspoon420@users.noreply.github.com>
Sat, 9 Sep 2023 21:54:37 +0000 (00:54 +0300)
committerGitHub <noreply@github.com>
Sat, 9 Sep 2023 21:54:37 +0000 (13:54 -0800)
Chemicals and gasses are not all wholesale swapped but given 50/50 for every chemical or gas.

Content.Server/Botany/Systems/MutationSystem.cs

index 2ac326087754e06978d79352db368b8c9518bfdb..68863a4801b4e20cb44e81ae441289161a580955 100644 (file)
@@ -86,7 +86,7 @@ public sealed class MutationSystem : EntitySystem
     {
         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.WaterConsumption, a.WaterConsumption);
@@ -115,8 +115,9 @@ public sealed class MutationSystem : EntitySystem
         CrossBool(ref result.Bioluminescent, a.Bioluminescent);
         CrossBool(ref result.TurnIntoKudzu, a.TurnIntoKudzu);
         CrossBool(ref result.CanScream, a.CanScream);
-        result.ExudeGasses = Random(0.5f) ? a.ExudeGasses : result.ExudeGasses;
-        result.ConsumeGasses = Random(0.5f) ? a.ConsumeGasses : result.ConsumeGasses;
+        CrossGasses(ref result.ExudeGasses, a.ExudeGasses);
+        CrossGasses(ref result.ConsumeGasses, a.ConsumeGasses);
+
         result.BioluminescentColor = Random(0.5f) ? a.BioluminescentColor : result.BioluminescentColor;
 
         // Hybrids have a high chance of being seedless. Balances very
@@ -292,6 +293,70 @@ public sealed class MutationSystem : EntitySystem
         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)
     {
         val = Random(0.5f) ? val : other;