示例#1
0
        protected override DynamicTimeReaction HandleBirthing()
        {
            DynamicTimeReaction retVal = ((SpawnTypeIncludeAnal)spawnType).HandleAnalBirth(creatureID);

            CreatureStore.GetCreatureClean(creatureID)?.genitals.ass.HandleBirth(spawnType.sizeOfCreatureAtBirth);
            return(retVal);
        }
示例#2
0
        public string FullDescription(HairData hair, bool alternateFormat = false)
        {
            if (this == NO_HAIR || hair.length == 0)
            {
                return(NO_HAIR.LongDescription(hair, alternateFormat));
            }
            else
            {
                byte creatureHeight = CreatureStore.GetCreatureClean(hair.creatureID)?.build.heightInInches ?? Build.DEFAULT_HEIGHT;


                StringBuilder sb = new StringBuilder(LengthText(hair.length, creatureHeight) + hair.hairColor.AsString());
                if (hair.style != HairStyle.NO_STYLE)
                {
                    sb.Append(", ");
                }
                else
                {
                    sb.Append(" ");
                }
                sb.Append(StyleStr(hair.style));
                sb.Append(ShortDescription());
                sb.Append(HighlightStr(hair.highlightColor));
                return(sb.ToString());
            }
        }
示例#3
0
        protected override DynamicTimeReaction HandleBirthing()
        {
            DynamicTimeReaction retVal = spawnType.HandleVaginalBirth(vaginaIndex);

            CreatureStore.GetCreatureClean(creatureID)?.genitals.vaginas[vaginaIndex].HandleBirth(spawnType.sizeOfCreatureAtBirth);
            return(retVal);
        }
示例#4
0
        public string GenericRemovedBlackNipples()
        {
            Creature creature = CreatureStore.GetCreatureClean(creatureID);

            string armorText = creature?.wearingArmor == true || creature?.wearingUpperGarment == true ? "Undoing your clothes" : "Looking down";

            return(GlobalStrings.NewParagraph() + "Something invisible brushes against your " + CommonShortNippleDescription()
                   + ", making you twitch. " + armorText + ", you take a look at your"
                   + " chest and find that your nipples have turned back to their natural flesh color.");
        }
示例#5
0
 public string RestoredText(DataClass oldData)
 {
     if (CreatureStore.TryGetCreature(creatureID, out Creature creature) && creature is PlayerBase player)
     {
         return(oldData.type.RestoredString(oldData, player));
     }
     else
     {
         return("");
     }
 }
示例#6
0
 public string TransformFromText(DataClass previousTypeData)
 {
     if (CreatureStore.TryGetCreature(creatureID, out Creature creature) && creature is PlayerBase player)
     {
         return(type.TransformFrom(previousTypeData, player));
     }
     else
     {
         return("");
     }
 }
示例#7
0
 public string PlayerDescription()
 {
     if (CreatureStore.TryGetCreature(creatureID, out Creature creature) && creature is PlayerBase player)
     {
         return(type.PlayerDescription((ThisClass)this, player));
     }
     else
     {
         return("");
     }
 }
示例#8
0
        //long has length, color, and highlights.
        protected static string GenericLongDesc(HairData hair, bool alternateFormat, string desc)
        {
            if (hair.type == NO_HAIR || hair.length == 0)
            {
                return(NO_HAIR.LongDescription(hair, alternateFormat));
            }
            else
            {
                byte creatureHeight = CreatureStore.GetCreatureClean(hair.creatureID)?.build.heightInInches ?? Build.DEFAULT_HEIGHT;

                return(LengthText(hair.length, creatureHeight) + " " + hair.hairColor.AsString() + desc + HighlightStr(hair.highlightColor));
            }
        }
示例#9
0
        public string DescriptionWithColorLengthAndStyle(HairData hair, bool alternateFormat = false)
        {
            if (this == NO_HAIR || hair.length == 0)
            {
                return(BaldHeadText(alternateFormat));
            }
            else
            {
                byte creatureHeight = CreatureStore.GetCreatureClean(hair.creatureID)?.build.heightInInches ?? Build.DEFAULT_HEIGHT;

                return(LengthText(hair.length, creatureHeight) + hair.hairColor.AsString() + " " + hair.ShortDescription());
            }
        }
示例#10
0
        public string RemovedExtraBreastRowGenericText(BreastData removedBreastRow)
        {
            Creature target = CreatureStore.GetCreatureClean(creatureID);
            string   skinText;
            bool     plural;

            if (target is null)
            {
                skinText = new BodyData(Guid.Empty).ShortEpidermisDescription(out plural);
            }
            else
            {
                skinText = target.body.ShortEpidermisDescription(out plural);
            }

            return($"You stumble back when your center of balance shifts, and though you adjust before you can fall over, you're left to watch in awe as your bottom-most " +
                   $"{removedBreastRow.ShortDescription()} shrink down, disappearing completely into your {(breastRows.Count > 2 ? "abdomen" : "chest")}. The " +
                   $"{removedBreastRow.ShortNippleDescription()} even fade until nothing but {skinText} {(plural ? "remain" : "remains")}. " +
                   SafelyFormattedString.FormattedText("You've lost a row of breasts!", StringFormats.BOLD));
        }
示例#11
0
        internal static string VaginaAdjectiveText(VaginaData v****a, bool fullDesc)
        {
            StringBuilder sb = new StringBuilder();
            //less confusing way to display values.

            bool showLooseness;
            bool showWetness;

            //guarenteed if virgin, tight, or forced.
            if (fullDesc || v****a.isVirgin || v****a.looseness == VaginalLooseness.TIGHT)
            {
                showLooseness = true;
                showWetness   = true;
            }
            //50% each if gaping or looser
            else if (v****a.looseness == VaginalLooseness.GAPING || v****a.looseness == VaginalLooseness.CLOWN_CAR_WIDE)
            {
                showLooseness = Utils.RandBool();
                showWetness   = Utils.RandBool();
            }
            //else variable.
            else
            {
                //tightness descript - 40% display rate
                showLooseness = Utils.Rand(5) < 2;
                //wetness descript - 30% display rate
                showWetness = Utils.Rand(10) < 3;
            }

            if (showLooseness)
            {
                sb.Append(v****a.looseness.AsDescriptor());
            }
            if (showWetness && v****a.wetness != VaginalWetness.NORMAL)
            {
                if (showLooseness)
                {
                    sb.Append(", ");
                }
                sb.Append(v****a.wetness.AsDescriptor());
            }
            if (v****a.labiaPiercings.isPierced && (fullDesc || Utils.Rand(3) == 0))
            {
                if (showWetness || showLooseness)
                {
                    sb.Append(", ");
                }
                sb.Append("pierced");
            }

            var creature = CreatureStore.GetCreatureClean(v****a.creatureID);

            if (sb.Length == 0 && creature?.body.type == BodyType.GOO)
            {
                if (sb.Length != 0)
                {
                    sb.Append(", ");
                }
                sb.Append(Utils.RandomChoice("gooey", "slimy"));
            }

            if (!v****a.everPracticedVaginal)
            {
                if (sb.Length != 0)
                {
                    sb.Append(", ");
                }


                sb.Append("true virgin");
            }
            else if (v****a.isVirgin)
            {
                if (sb.Length != 0)
                {
                    sb.Append(", ");
                }

                sb.Append("virgin");
            }
            return(sb.ToString());
        }
示例#12
0
        //some of these get an oxford comma on full description, some don't. Sue me.
        internal static string Desc(IClit c**t, bool alternateFormat, bool full)
        {
            double relativeLibido, relativeLust;

            if (CreatureStore.TryGetCreature(c**t.creatureID, out Creature source))
            {
                relativeLibido = source.relativeLibido;
                relativeLust   = source.relativeLust;
            }
            else
            {
                relativeLibido = 15;
                relativeLust   = 15;
            }

            string size = "";
            //this is not a pretty solution, but i'm just going to cheat it anyway. basically, i'm going to check and see if article is null, and if it is, replace it.
            //by setting it to empty when we don't need it, it'll never be null and thus always skipped.
            string article = alternateFormat ? null : "";

            //Length Adjective - 50% chance
            if (Utils.RandBool() || full)
            {
                size = SizeAdjective(c**t.length, out string temp);
                if (article is null)
                {
                    article = temp;
                }
            }

            string adjective = "";

            //Descriptive descriptions - 50% chance of being called
            if (Utils.Rand(2) == 0 || full)
            {
                string separator = full ? ", " : " ";
                //Doggie descriptors - 50%
                //TODO Conditionals don't make sense, need to introduce a class variable to keep of "something" or move race or Creature/Character
                //if (creature.hasAnyFur > 2  && Utils.Rand(2) == 0)
                //{
                //	description += "bitch-";
                //	haveDescription = true;
                //}

                /*Horse descriptors - 50%
                 * if (creature.hasAnyFur > 2 && !descripted && Utils.Rand(2) == 0) {
                 * descripted = true;
                 * descript += "mare-";
                 * }*/
                //Horny descriptors - 75% chance
                if (relativeLust > 70 && Utils.Rand(4) < 3)
                {
                    if (article is null)
                    {
                        article = "a ";
                    }

                    adjective = separator + Utils.RandomChoice("throbbing", "pulsating", "hard");
                }
                //High libido - always use if no other descript
                else if (relativeLibido > 50 && Utils.Rand(2) == 0)
                {
                    if (Utils.Rand(4) == 0)
                    {
                        adjective = "insatiable";
                        if (article is null)
                        {
                            article = "an ";
                        }
                    }
                    else
                    {
                        adjective = separator + Utils.RandomChoice("greedy", "demanding", "rapacious");
                        if (article is null)
                        {
                            article = "a ";
                        }
                    }
                }
                //else if (c**t.clitCockActive && Utils.RandBool())
                //{
                //	adjective = separator + Utils.RandomChoice("mutated", "corrupted");
                //	if (article is null) article = "a ";
                //}

                if (!full)
                {
                    return(article + size + adjective + " " + ClitNoun());
                }
                //else if (c**t.clitCockActive)
                //{
                //	adjective += separator + Utils.RandomChoice("mutated ", "corrupted ");
                //}
                else
                {
                    adjective += " ";
                }
            }

            //100% display rate if pierced and we've fallen through to this point, so we dont need to check for full.
            if (c**t.piercings.isPierced)
            {
                if (article is null)
                {
                    article = "a ";
                }

                return(article + size + adjective + "pierced " + ClitNoun());
            }


            //fall through. will rarely hit this, if ever.
            return(ClitNoun(article is null));
        }
示例#13
0
        public string PlayerDescription()
        {
            if (CreatureStore.TryGetCreature(creatureID, out Creature creature) && creature is PlayerBase player)
            {
                string fNale = " You estimate each of them to be about " + Measurement.ToNearestSmallUnit(size, false, true) + " across" + Environment.NewLine;

                BodyType bodyType = player.body.type;
                if (count > 0)
                {
                    if (count == 1)
                    {
                        if (bodyType == BodyType.GOO)
                        {
                            return("Your " + SackDescription() + " clings tightly to your groin, dripping and holding your" + LongDescription(false, false) + " snugly against you." + fNale);
                        }
                        else
                        {
                            return("Your " + SackDescription() + " clings tightly to your groin, holding your" + LongDescription(false, false) + " snugly against you." + fNale);
                        }
                    }
                    else if (!player.hasCock)
                    {
                        if (bodyType.primaryIsFurBased)
                        {
                            return("A fuzzy " + SackDescription() + " filled with " + LongDescription(false, true) + " swings low under where a penis would normally grow." + fNale);
                        }
                        else if (bodyType.epidermisType == EpidermisType.SCALES)
                        {
                            return("A scaley " + SackDescription() + " hugs your " + LongDescription(false, false) + " tightly against your body." + fNale);
                        }
                        else if (bodyType == BodyType.GOO)
                        {
                            return("An oozing, semi-solid sack with " + LongDescription(false, true) + " swings heavily under where a penis would normally grow." + fNale);
                        }
                        else                         //humanoid or skin. more cases for carapace or rubber could be added, idk.
                        {
                            return(("A " + SackDescription() + " with " + LongDescription(false, true) + " swings heavily under where a penis would normally grow.") + fNale);
                        }
                    }
                    else
                    {
                        if (bodyType.primaryIsFurBased)
                        {
                            return("A fuzzy " + SackDescription() + " filled with " + LongDescription(false, false) + " swings low under your " + player.genitals.AllCocksLongDescription() + "." + fNale);
                        }
                        else if (bodyType.epidermisType == EpidermisType.SCALES)
                        {
                            return("A scaley " + SackDescription() + " hugs your " + LongDescription(false, false) + " tightly against your body." + fNale);
                        }
                        else if (bodyType == BodyType.GOO)
                        {
                            return("An oozing, semi-solid sack with " + LongDescription(false, false) + " swings heavily beneath your " + player.genitals.AllCocksLongDescription() + "." + fNale);
                        }
                        else                         // if (bodyType == BodyType.HUMANOID)
                        {
                            return("A " + SackDescription() + " with " + LongDescription(false, false) + " swings heavily beneath your " + player.genitals.AllCocksLongDescription() + "." + fNale);
                        }
                    }
                }
                else
                {
                    return("");
                }
            }
            else
            {
                return("");
            }
        }