From 282db32ad8e491be3de1b740a185d8736b801b08 Mon Sep 17 00:00:00 2001 From: TomaszKawalec <40093912+TK-A369@users.noreply.github.com> Date: Sat, 16 Sep 2023 22:25:53 +0200 Subject: [PATCH] MutationSystem style changes (#19954) --- .../Botany/Systems/MutationSystem.cs | 202 +++++++++--------- 1 file changed, 100 insertions(+), 102 deletions(-) diff --git a/Content.Server/Botany/Systems/MutationSystem.cs b/Content.Server/Botany/Systems/MutationSystem.cs index 1a63693a33..13ef8e3781 100644 --- a/Content.Server/Botany/Systems/MutationSystem.cs +++ b/Content.Server/Botany/Systems/MutationSystem.cs @@ -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 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 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.White, @@ -325,33 +323,33 @@ public sealed class MutationSystem : EntitySystem private void CrossChemicals(ref Dictionary val, Dictionary 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 val, Dictionary 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); } } } -- 2.51.2