]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
MutationSystem style changes (#19954)
authorTomaszKawalec <40093912+TK-A369@users.noreply.github.com>
Sat, 16 Sep 2023 20:25:53 +0000 (22:25 +0200)
committerGitHub <noreply@github.com>
Sat, 16 Sep 2023 20:25:53 +0000 (12:25 -0800)
Content.Server/Botany/Systems/MutationSystem.cs

index 1a63693a335a669f931461ed5bcc2d0faf3fd1d3..13ef8e37818c8ab34cd4a1f9340e63ee1c8a0b48 100644 (file)
@@ -39,41 +39,42 @@ public sealed class MutationSystem : EntitySystem
         const int totalbits = 265;
 
         // Tolerances (55)
-        MutateFloat(ref seed.NutrientConsumption   , 0.05f , 1.2f , 5 , totalbits , severity);
-        MutateFloat(ref seed.WaterConsumption      , 3f    , 9f   , 5 , totalbits , severity);
-        MutateFloat(ref seed.IdealHeat             , 263f  , 323f , 5 , totalbits , severity);
-        MutateFloat(ref seed.HeatTolerance         , 2f    , 25f  , 5 , totalbits , severity);
-        MutateFloat(ref seed.IdealLight            , 0f    , 14f  , 5 , totalbits , severity);
-        MutateFloat(ref seed.LightTolerance        , 1f    , 5f   , 5 , totalbits , severity);
-        MutateFloat(ref seed.ToxinsTolerance       , 1f    , 10f  , 5 , totalbits , severity);
-        MutateFloat(ref seed.LowPressureTolerance  , 60f   , 100f , 5 , totalbits , severity);
-        MutateFloat(ref seed.HighPressureTolerance , 100f  , 140f , 5 , totalbits , severity);
-        MutateFloat(ref seed.PestTolerance         , 0f    , 15f  , 5 , totalbits , severity);
-        MutateFloat(ref seed.WeedTolerance         , 0f    , 15f  , 5 , totalbits , severity);
+        MutateFloat(ref seed.NutrientConsumption  , 0.05f, 1.2f, 5, totalbits, severity);
+        MutateFloat(ref seed.WaterConsumption     , 3f   , 9f  , 5, totalbits, severity);
+        MutateFloat(ref seed.IdealHeat            , 263f , 323f, 5, totalbits, severity);
+        MutateFloat(ref seed.HeatTolerance        , 2f   , 25f , 5, totalbits, severity);
+        MutateFloat(ref seed.IdealLight           , 0f   , 14f , 5, totalbits, severity);
+        MutateFloat(ref seed.LightTolerance       , 1f   , 5f  , 5, totalbits, severity);
+        MutateFloat(ref seed.ToxinsTolerance      , 1f   , 10f , 5, totalbits, severity);
+        MutateFloat(ref seed.LowPressureTolerance , 60f  , 100f, 5, totalbits, severity);
+        MutateFloat(ref seed.HighPressureTolerance, 100f , 140f, 5, totalbits, severity);
+        MutateFloat(ref seed.PestTolerance        , 0f   , 15f , 5, totalbits, severity);
+        MutateFloat(ref seed.WeedTolerance        , 0f   , 15f , 5, totalbits, severity);
 
         // Stats (30*2 = 60)
-        MutateFloat(ref seed.Endurance             , 50f   , 150f , 5 , totalbits , 2*severity);
-        MutateInt(ref seed.Yield                   , 3     , 10   , 5 , totalbits , 2*severity);
-        MutateFloat(ref seed.Lifespan              , 10f   , 80f  , 5 , totalbits , 2*severity);
-        MutateFloat(ref seed.Maturation            , 3f    , 8f   , 5 , totalbits , 2*severity);
-        MutateFloat(ref seed.Production            , 1f    , 10f  , 5 , totalbits , 2*severity);
-        MutateFloat(ref seed.Potency               , 30f   , 100f , 5 , totalbits , 2*severity);
+        MutateFloat(ref seed.Endurance            , 50f  , 150f, 5, totalbits, 2 * severity);
+        MutateInt(ref seed.Yield                  , 3    , 10  , 5, totalbits, 2 * severity);
+        MutateFloat(ref seed.Lifespan             , 10f  , 80f , 5, totalbits, 2 * severity);
+        MutateFloat(ref seed.Maturation           , 3f   , 8f  , 5, totalbits, 2 * severity);
+        MutateFloat(ref seed.Production           , 1f   , 10f , 5, totalbits, 2 * severity);
+        MutateFloat(ref seed.Potency              , 30f  , 100f, 5, totalbits, 2 * severity);
 
         // Kill the plant (30)
-        MutateBool(ref seed.Viable         , false , 30 , totalbits , severity);
+        MutateBool(ref seed.Viable        , false, 30, totalbits, severity);
 
         // Fun (90)
-        MutateBool(ref seed.Seedless       , true  , 10 , totalbits , severity);
-        MutateBool(ref seed.Slip           , true  , 10 , totalbits , severity);
-        MutateBool(ref seed.Sentient       , true  , 10 , totalbits , severity);
-        MutateBool(ref seed.Ligneous       , true  , 10 , totalbits , severity);
-        MutateBool(ref seed.Bioluminescent , true  , 10 , totalbits , severity);
+        MutateBool(ref seed.Seedless      , true , 10, totalbits, severity);
+        MutateBool(ref seed.Slip          , true , 10, totalbits, severity);
+        MutateBool(ref seed.Sentient      , true , 10, totalbits, severity);
+        MutateBool(ref seed.Ligneous      , true , 10, totalbits, severity);
+        MutateBool(ref seed.Bioluminescent, true , 10, totalbits, severity);
         // Kudzu disabled until superkudzu bug is fixed
-        // MutateBool(ref seed.TurnIntoKudzu  , true  , 5  , totalbits , severity);
-        MutateBool(ref seed.CanScream      , true  , 10 , totalbits , severity);
+        // MutateBool(ref seed.TurnIntoKudzu , true , 10, totalbits, severity);
+        MutateBool(ref seed.CanScream     , true , 10, totalbits, severity);
         seed.BioluminescentColor = RandomColor(seed.BioluminescentColor, 10, totalbits, severity);
+
         // ConstantUpgade (10)
-        MutateHarvestType(ref seed.HarvestRepeat   , 10 , totalbits , severity);
+        MutateHarvestType(ref seed.HarvestRepeat, 10, totalbits, severity);
 
         // Gas (5)
         MutateGasses(ref seed.ExudeGasses, 0.01f, 0.5f, 4, totalbits, severity);
@@ -119,6 +120,7 @@ public sealed class MutationSystem : EntitySystem
         CrossBool(ref result.Bioluminescent, a.Bioluminescent);
         // CrossBool(ref result.TurnIntoKudzu, a.TurnIntoKudzu);
         CrossBool(ref result.CanScream, a.CanScream);
+
         CrossGasses(ref result.ExudeGasses, a.ExudeGasses);
         CrossGasses(ref result.ConsumeGasses, a.ConsumeGasses);
 
@@ -142,94 +144,93 @@ public sealed class MutationSystem : EntitySystem
     // one bit gets flipped.
     private void MutateFloat(ref float val, float min, float max, int bits, int totalbits, float mult)
     {
-        // Probability that a bit flip happens for this value.
-        float p = mult*bits/totalbits;
-        p = Math.Clamp(p, 0, 1);
-        if (!Random(p))
-        {
+        // Probability that a bit flip happens for this value's representation in thermometer code.
+        float probBitflip = mult * bits / totalbits;
+        probBitflip = Math.Clamp(probBitflip, 0, 1);
+        if (!Random(probBitflip))
             return;
-        }
 
         // Starting number of bits that are high, between 0 and bits.
-        int n = (int)Math.Round((val - min) / (max - min) * bits);
-        // val may be outside the range of min/max due to starting prototype values, so clamp
-        n = Math.Clamp(n, 0, bits);
+        // In other words, it's val mapped linearly from range [min, max] to range [0, bits], and then rounded.
+        int valInt = (int)MathF.Round((val - min) / (max - min) * bits);
+        // val may be outside the range of min/max due to starting prototype values, so clamp.
+        valInt = Math.Clamp(valInt, 0, bits);
 
         // Probability that the bit flip increases n.
-        float p_increase = 1-(float)n/bits;
-        int np;
-        if (Random(p_increase))
+        // The higher the current value is, the lower the probability of increasing value is, and the higher the probability of decreasive it it.
+        // In other words, it tends to go to the middle.
+        float probIncrease = 1 - (float)valInt / bits;
+        int valIntMutated;
+        if (Random(probIncrease))
         {
-            np = n + 1;
+            valIntMutated = valInt + 1;
         }
         else
         {
-            np = n - 1;
+            valIntMutated = valInt - 1;
         }
 
         // Set value based on mutated thermometer code.
-        float nval = MathF.Min(MathF.Max((float)np/bits * (max - min) + min, min), max);
-        val = nval;
+        float valMutated = Math.Clamp((float)valIntMutated / bits * (max - min) + min, min, max);
+        val = valMutated;
     }
 
-    private void MutateInt(ref int n, int min, int max, int bits, int totalbits, float mult)
+    private void MutateInt(ref int val, int min, int max, int bits, int totalbits, float mult)
     {
-        // Probability that a bit flip happens for this value.
-        float p = mult*bits/totalbits;
-        p = Math.Clamp(p, 0, 1);
-        if (!Random(p))
-        {
+        // Probability that a bit flip happens for this value's representation in thermometer code.
+        float probBitflip = mult * bits / totalbits;
+        probBitflip = Math.Clamp(probBitflip, 0, 1);
+        if (!Random(probBitflip))
             return;
-        }
 
         // Probability that the bit flip increases n.
-        float p_increase = 1-(float)n/bits;
-        int np;
-        if (Random(p_increase))
+        // The higher the current value is, the lower the probability of increasing value is, and the higher the probability of decreasive it it.
+        // In other words, it tends to go to the middle.
+        float probIncrease = 1 - (float)val / bits;
+        int valMutated;
+        if (Random(probIncrease))
         {
-            np = n + 1;
+            valMutated = val + 1;
         }
         else
         {
-            np = n - 1;
+            valMutated = val - 1;
         }
 
-        np = Math.Min(Math.Max(np, min), max);
-        n = np;
+        valMutated = Math.Clamp(valMutated, min, max);
+        val = valMutated;
     }
 
     private void MutateBool(ref bool val, bool polarity, int bits, int totalbits, float mult)
     {
         // Probability that a bit flip happens for this value.
-        float p = mult * bits / totalbits;
-        p = Math.Clamp(p, 0, 1);
-        if (!Random(p))
-        {
+        float probSet = mult * bits / totalbits;
+        probSet = Math.Clamp(probSet, 0, 1);
+        if (!Random(probSet))
             return;
-        }
 
         val = polarity;
     }
 
     private void MutateHarvestType(ref HarvestType val, int bits, int totalbits, float mult)
     {
-        float p = mult * bits/totalbits;
-        p = Math.Clamp(p, 0, 1);
-        if (!Random(p))
+        float probModify = mult * bits / totalbits;
+        probModify = Math.Clamp(probModify, 0, 1);
+
+        if (!Random(probModify))
             return;
 
         if (val == HarvestType.NoRepeat)
             val = HarvestType.Repeat;
-
         else if (val == HarvestType.Repeat)
             val = HarvestType.SelfHarvest;
     }
 
     private void MutateGasses(ref Dictionary<Gas, float> gasses, float min, float max, int bits, int totalbits, float mult)
     {
-        float p = mult * bits / totalbits;
-        p = Math.Clamp(p, 0, 1);
-        if (!Random(p))
+        float probModify = mult * bits / totalbits;
+        probModify = Math.Clamp(probModify, 0, 1);
+        if (!Random(probModify))
             return;
 
         // Add a random amount of a random gas to this gas dictionary
@@ -247,34 +248,31 @@ public sealed class MutationSystem : EntitySystem
 
     private void MutateChemicals(ref Dictionary<string, SeedChemQuantity> chemicals, int max, int bits, int totalbits, float mult)
     {
-        float p = mult * bits / totalbits;
-        p = Math.Clamp(p, 0, 1);
-        if (!Random(p))
+        float probModify = mult * bits / totalbits;
+        probModify = Math.Clamp(probModify, 0, 1);
+        if (!Random(probModify))
             return;
 
         // Add a random amount of a random chemical to this set of chemicals
-        ReagentPrototype selected_chemical = _robustRandom.Pick(_allChemicals);
-        if (selected_chemical != null)
+        ReagentPrototype selectedChemical = _robustRandom.Pick(_allChemicals);
+        if (selectedChemical != null)
         {
-            string chemical_id = selected_chemical.ID;
+            string chemicalId = selectedChemical.ID;
             int amount = _robustRandom.Next(1, max);
-            SeedChemQuantity seed_chem_quantity = new SeedChemQuantity();
-            if (chemicals.ContainsKey(chemical_id))
+            SeedChemQuantity seedChemQuantity = new SeedChemQuantity();
+            if (chemicals.ContainsKey(chemicalId))
             {
-                seed_chem_quantity.Min = chemicals[chemical_id].Min;
-                seed_chem_quantity.Max = chemicals[chemical_id].Max + amount;
-                int potency = (int) Math.Ceiling(100.0f / (float) seed_chem_quantity.Max);
-                seed_chem_quantity.PotencyDivisor = potency;
-                chemicals[chemical_id] = seed_chem_quantity;
+                seedChemQuantity.Min = chemicals[chemicalId].Min;
+                seedChemQuantity.Max = chemicals[chemicalId].Max + amount;
             }
             else
             {
-                seed_chem_quantity.Min = 1;
-                seed_chem_quantity.Max = 1 + amount;
-                int potency = (int) Math.Ceiling(100.0f / (float) seed_chem_quantity.Max);
-                seed_chem_quantity.PotencyDivisor = potency;
-                chemicals.Add(chemical_id, seed_chem_quantity);
+                seedChemQuantity.Min = 1;
+                seedChemQuantity.Max = 1 + amount;
             }
+            int potencyDivisor = (int) Math.Ceiling(100.0f / seedChemQuantity.Max);
+            seedChemQuantity.PotencyDivisor = potencyDivisor;
+            chemicals[chemicalId] = seedChemQuantity;
         }
     }
 
@@ -305,8 +303,8 @@ public sealed class MutationSystem : EntitySystem
 
     private Color RandomColor(Color color, int bits, int totalbits, float mult)
     {
-        float p = mult*bits/totalbits;
-        if (Random(p))
+        float probModify = mult * bits / totalbits;
+        if (Random(probModify))
         {
             var colors = new List<Color>{
                 Color.White,
@@ -325,33 +323,33 @@ public sealed class MutationSystem : EntitySystem
     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)
+        foreach (var otherChem in other)
         {
             // if both have same chemical, randomly pick potency ratio from the two.
-            if (val.ContainsKey(other_chem.Key))
+            if (val.ContainsKey(otherChem.Key))
             {
-                val[other_chem.Key] = Random(0.5f) ? other_chem.Value : val[other_chem.Key];
+                val[otherChem.Key] = Random(0.5f) ? otherChem.Value : val[otherChem.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);
+                    val.Add(otherChem.Key, otherChem.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)
+        foreach (var thisChem in val)
         {
-            if (!other.ContainsKey(this_chem.Key))
+            if (!other.ContainsKey(thisChem.Key))
             {
                 if (Random(0.5f))
                 {
                     if (val.Count > 1)
                     {
-                        val.Remove(this_chem.Key);
+                        val.Remove(thisChem.Key);
                     }
                 }
             }
@@ -361,30 +359,30 @@ public sealed class MutationSystem : EntitySystem
     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)
+        foreach (var otherGas in other)
         {
             // if both have same gas, randomly pick ammount from the two.
-            if (val.ContainsKey(other_gas.Key))
+            if (val.ContainsKey(otherGas.Key))
             {
-                val[other_gas.Key] = Random(0.5f) ? other_gas.Value : val[other_gas.Key];
+                val[otherGas.Key] = Random(0.5f) ? otherGas.Value : val[otherGas.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);
+                    val.Add(otherGas.Key, otherGas.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)
+        foreach (var thisGas in val)
         {
-            if (!other.ContainsKey(this_gas.Key))
+            if (!other.ContainsKey(thisGas.Key))
             {
                 if (Random(0.5f))
                 {
-                    val.Remove(this_gas.Key);
+                    val.Remove(thisGas.Key);
                 }
             }
         }