internal static string AllVaginasShortDescription <T>(IVaginaCollection <T> collection, out bool isPlural) where T : IVagina
        {
            isPlural = collection.vaginas.Count != 1;

            if (collection.vaginas.Count == 0)
            {
                return("");
            }
            else if (collection.vaginas.Count == 1)
            {
                return(collection.vaginas[0].ShortDescription());
            }
            bool mismatched = collection.vaginas.Any(x => x.type != collection.vaginas[0].type);

            return(mismatched ? VaginaType.VaginaNoun(true) : collection.vaginas[0].ShortDescription(false));
        }
 private static string RandomMixedVaginasText()
 {
     return(Utils.RandomChoice("mixed ", "mixed ", "mismatched ") + VaginaType.VaginaNoun(true));
 }
        internal static string EachVaginaOrVaginasNoun <T>(IVaginaCollection <T> collection, Conjugate conjugate, out bool isPlural) where T : IVagina
        {
            isPlural = collection.vaginas.Count != 1;
            if (collection.vaginas.Count == 0)
            {
                return("");
            }

            return(CommonBodyPartStrings.EachOfDescription(collection.vaginas.Count > 1, conjugate, VaginaType.VaginaNoun(collection.vaginas.Count > 1)));
        }
 internal static string OneVaginaOrVaginasNoun <T>(IVaginaCollection <T> collection, Conjugate conjugate) where T : IVagina
 {
     if (collection.vaginas.Count == 0)
     {
         return("");
     }
     return(CommonBodyPartStrings.OneOfDescription(collection.vaginas.Count > 1, conjugate, VaginaType.VaginaNoun(collection.vaginas.Count > 1)));
 }
 internal static string AllVaginasNoun <T>(IVaginaCollection <T> collection, out bool isPlural) where T : IVagina
 {
     isPlural = collection.vaginas.Count > 1;
     return(VaginaType.VaginaNoun(collection.vaginas.Count > 1));
 }
 private static string RandomMixedClitsText()
 {
     return(Utils.RandomChoice("different-sized ", "uneven ", "mismatched ") + VaginaType.VaginaNoun(true));
 }
        private string WetnessLoosenessText(PlayerBase player)
        {
            string WetnessText(V****a v****a)
            {
                byte wetnessLevel = 0;

                if (v****a.wetness >= VaginalWetness.DROOLING)
                {
                    wetnessLevel = 2;
                }
                else if (v****a.wetness >= VaginalWetness.WET)
                {
                    wetnessLevel = 1;
                }


                //stack once if above 50 in at least one - at least horny.
                if (player.relativeLust >= 50 || player.relativeLibido >= 50)
                {
                    wetnessLevel++;
                }
                //stack again if both are very high - uber horny.
                if (player.relativeLust >= 80 && player.relativeLibido >= 80)
                {
                    wetnessLevel++;
                }
                if (wetnessLevel > 0)
                {
                    return("");
                }
                else if (wetnessLevel == 1)
                {
                    return("Moisture gleams in ");                    //horny and below wet or not horny and between wet and max wetness.
                }
                else if (wetnessLevel == 2)
                {
                    return("Occasional beads of lubricant drip from "); //uber horny and below wet or horny and above wet and not max or not horny and max.
                }
                else if (wetnessLevel == 3)                             //uber horny and above wet, but not max. or horny and max.
                {
                    return("Thin streams of lubricant occasionally dribble from ");
                }
                else                 //(wetnessLevel > 3) //uber horny and max wetness.
                {
                    return("Thick streams of lubricant drool constantly from ");
                }
            }

            string WetnessPredicate(V****a v****a)
            {
                byte wetnessLevel = 0;

                if (v****a.wetness >= VaginalWetness.DROOLING)
                {
                    wetnessLevel = 2;
                }
                else if (v****a.wetness >= VaginalWetness.WET)
                {
                    wetnessLevel = 1;
                }


                //stack once if above 50 in at least one - at least horny.
                if (player.relativeLust >= 50 || player.relativeLibido >= 50)
                {
                    wetnessLevel++;
                }
                //stack again if both are very high - uber horny.
                if (player.relativeLust >= 80 && player.relativeLibido >= 80)
                {
                    wetnessLevel++;
                }
                if (wetnessLevel > 0)
                {
                    return("");
                }
                else if (wetnessLevel == 1)
                {
                    return("gleams");                    //horny and below wet or not horny and between wet and max wetness.
                }
                else if (wetnessLevel == 2)
                {
                    return("drips");                    //uber horny and below wet or horny and above wet and not max or not horny and max.
                }
                else if (wetnessLevel == 3)             //uber horny and above wet, but not max. or horny and max.
                {
                    return("occasionally dribbles");
                }
                else                 //(wetnessLevel > 3) //uber horny and max wetness.
                {
                    return("drools constantly");
                }
            }

            if (player.vaginas.Count == 1)
            {
                V****a v****a = player.vaginas[0];
                //the original source repeated the same text for various options, though it did so in a specific way. this does the same, but makes it cleaner.


                string wetness = WetnessText(v****a);

                if (!string.IsNullOrEmpty(wetness))
                {
                    string tightness;
                    if (v****a.looseness == VaginalLooseness.TIGHT)
                    {
                        tightness = "your tight " + v****a.ShortDescription();
                    }
                    else if (v****a.looseness == VaginalLooseness.NORMAL)
                    {
                        tightness = "your " + v****a.ShortDescription();
                    }
                    else if (v****a.looseness < VaginalLooseness.GAPING)
                    {
                        tightness = "your " + v****a.ShortDescription() + ", its lips slightly parted";
                    }
                    else
                    {
                        tightness = "the massive hole that is your " + v****a.ShortDescription();
                    }
                    return(wetness + tightness + ".");
                }
                //default case: no wetness description. Try to do a looseness description if applicable.
                else if (v****a.looseness != VaginalLooseness.NORMAL)
                {
                    if (v****a.looseness == VaginalLooseness.TIGHT)
                    {
                        return("Your " + v****a.ShortDescription() + " is extremely tight, though otherwise normal.");
                    }
                    else if (v****a.looseness <= VaginalLooseness.ROOMY)
                    {
                        return("Your pussy-lips have parted slightly, granting extra room in your otherwise normal " + v****a.ShortDescription() + ".");
                    }
                    else
                    {
                        return("Your " + v****a.ShortDescription() + "has been stretched so wide that it gapes.");
                    }
                }
                else
                {
                    return("");
                }
            }
            else
            {
                V****a first  = player.vaginas[0];
                V****a second = player.vaginas[1];

                string loosenessText(VaginalLooseness looseness)
                {
                    if (looseness <= VaginalLooseness.TIGHT)
                    {
                        return("a little tight");
                    }
                    else if (looseness == VaginalLooseness.LOOSE)
                    {
                        return("a little loose");
                    }
                    else if (looseness == VaginalLooseness.ROOMY)
                    {
                        return("rather loose");
                    }
                    else                     //if (looseness > VaginalLooseness.GAPING)
                    {
                        return("so loose that they gape");
                    }
                }

                //if both are the same wetness and looseness.
                if (first.looseness == second.looseness && first.wetness == second.wetness)
                {
                    //both are normal
                    if (first.looseness == VaginalLooseness.NORMAL && first.wetness == VaginalWetness.NORMAL)
                    {
                        return("Both vaginas are relatively normal");
                    }
                    //wetness normal, non-normal looseness.
                    else if (first.wetness == VaginalWetness.NORMAL)
                    {
                        return("Both of your " + VaginaType.VaginaNoun(true) + " are " + loosenessText(first.looseness) + ", but otherwise normal.");
                    }
                    //looseness normal, non-normal wetness.
                    else if (first.looseness == VaginalLooseness.NORMAL)
                    {
                        if (first.wetness == VaginalWetness.DRY)
                        {
                            return("Both of your vaginas are relatively normal, though a bit dry.");
                        }
                        else
                        {
                            return(WetnessText(first) + " both of your vaginas.");
                        }
                    }
                    else
                    {
                        return("Both of your " + VaginaType.VaginaNoun(true) + " are " + loosenessText(first.looseness) + ", and " + WetnessText(first).ToLower() + "from both of them");
                    }
                }
                //same looseness, different wetness.
                else if (first.looseness == second.looseness)
                {
                    string wetter, describe;

                    if (first.wetness > second.wetness)
                    {
                        wetter   = "first";
                        describe = "your first is " + first.wetness.AsAdjective() + "; your second: " + second.wetness.AsAdjective();
                    }
                    else
                    {
                        wetter   = "second";
                        describe = "your second is " + second.wetness.AsAdjective() + "; your first: " + first.wetness.AsAdjective();
                    }

                    return("Both of your " + VaginaType.VaginaNoun(true) + " are " + loosenessText(first.looseness) + ", but your " + wetter + " is wetter - " + describe + ".");
                }
                //same wetness, differnet looseness.
                else if (first.wetness == second.wetness)
                {
                    if (first.looseness >= VaginalLooseness.GAPING && second.looseness >= VaginalLooseness.GAPING)
                    {
                        string looser = first.looseness > second.looseness ? "first" : "second";

                        return("Both of your " + VaginaType.VaginaNoun(true) + " are " + first.wetness.AsAdjective() + " and are so loose they gape; but your " + looser +
                               " is slightly looser. ");
                    }
                    else
                    {
                        string looser, describe;
                        if (first.looseness > second.looseness)
                        {
                            looser   = "first";
                            describe = "your first is " + loosenessText(first.looseness) + "; your second: " + loosenessText(second.looseness);
                        }
                        else
                        {
                            looser   = "second";
                            describe = "your second is " + loosenessText(second.looseness) + "; your first: " + loosenessText(first.looseness);
                        }

                        return("Both of your " + VaginaType.VaginaNoun(true) + " are " + first.wetness.AsAdjective() + ", but your " + looser + " is looser - " + describe + ".");
                    }
                }
                //different wetness, looseness
                //one looser and wetter than other.
                else if ((first.wetness > second.wetness && first.looseness > second.looseness) || (second.wetness > first.wetness && second.looseness > first.looseness))
                {
                    V****a moreUsed;
                    V****a lessUsed;

                    string moreUsedString;
                    string lessUsedString;

                    if (first.wetness > second.wetness)
                    {
                        moreUsedString = "first";
                        lessUsedString = "second";

                        moreUsed = first;
                        lessUsed = second;
                    }
                    else
                    {
                        moreUsedString = "second";
                        lessUsedString = "first";

                        moreUsed = second;
                        lessUsed = first;
                    }

                    return("Your " + moreUsedString + " is both wetter and looser than your " + lessUsedString + ". Your " + moreUsedString + " is " + loosenessText(moreUsed.looseness) +
                           " and " + WetnessPredicate(moreUsed) + ", while your " + lessUsedString + " is " + loosenessText(lessUsed.looseness) + " and " + WetnessPredicate(lessUsed) + ".");
                }
                //mixed
                else
                {
                    string firstString, secondString;

                    if (first.wetness > second.wetness)
                    {
                        firstString  = "wetter";
                        secondString = "looser";
                    }
                    else
                    {
                        firstString  = "looser";
                        secondString = "wetter";
                    }

                    return("Your first is " + firstString + "than the second, though the second is " + secondString + ". Your first is " + loosenessText(first.looseness) + " and " +
                           WetnessPredicate(first) + ", while your second is " + loosenessText(second.looseness) + " and " + WetnessPredicate(second) + ".");
                }
            }
        }