Пример #1
0
        private static string SandTrapRestoreStr(VaginaData oldVagina, PlayerBase player)
        {
            string vagDesc;

            //2 vaginas, and both used to be the same type - we want to tell them which one we're talking about.
            if (player.vaginas.Count == 2 && player.genitals.CountVaginasOfType(oldVagina.type) == 1)
            {
                vagDesc = $"{Utils.NumberAsPlace(oldVagina.vaginaIndex)} {oldVagina.ShortDescription()}";
            }
            else
            {
                vagDesc = oldVagina.LongDescription(false);
            }

            string wearingText;

            if (!player.wearingAnything)
            {
                wearingText = $" You watch as your {vagDesc} shifts and the inner folds return to a more natural shape and color.";
            }
            else
            {
                wearingText = $" Undoing your clothes, you take a look at your {vagDesc} and find that it has turned back to its natural flesh colour.";
            }
            return(GlobalStrings.NewParagraph() + "Something invisible brushes against your sex, making you twinge. " + wearingText);
        }
Пример #2
0
        private static string GenericLoseVaginaDesc(VaginaData removedVagina, PlayerBase player)
        {
            string byeVag = "You slip a hand down to check on it, only to feel the slit growing smaller and smaller until it disappears, taking your c**t with it! ";

            if (player.vaginas.Count == 0)
            {
                return("Your " + removedVagina.ShortDescription() + " clenches in pain, doubling you over. " + byeVag +
                       SafelyFormattedString.FormattedText("Your v****a is gone!", StringFormats.BOLD));
            }
            else
            {
                if (player.genitals.CountVaginasOfType(removedVagina.type) == 1)
                {
                    return("One of your " + removedVagina.ShortDescription() + "clenches in pain, causing you to double over. " + byeVag +
                           SafelyFormattedString.FormattedText("One of your " + removedVagina.ShortDescription(true) + "is gone", StringFormats.BOLD) +
                           ", leaving you with just your " + player.vaginas[0].LongDescription());
                }
                else
                {
                    return("Your " + removedVagina.ShortDescription() + " clenches in pain, doubling you over. " + byeVag +
                           SafelyFormattedString.FormattedText("Your " + removedVagina.LongDescription() + "is gone", StringFormats.BOLD) +
                           ", leaving you with just your " + player.vaginas[0].LongDescription());
                }
            }
        }
Пример #3
0
        //largely stolen from kelly horse-c**t-> humanoid pussy, and adapted to make it work here.
        private static string EquineRestoreStr(VaginaData oldVagina, PlayerBase player)
        {
            string intro = "Something invisible brushes against your sex, making you twinge.";

            string vagDesc;

            //2 vaginas, and both used to be the same type - we want to tell them which one we're talking about.
            if (player.vaginas.Count == 2 && player.genitals.CountVaginasOfType(oldVagina.type) == 1)
            {
                vagDesc = $"{Utils.NumberAsPlace(oldVagina.vaginaIndex)} {oldVagina.ShortDescription()}";
            }
            else
            {
                vagDesc = oldVagina.LongDescription(false);
            }
            string wearingText;

            if (!player.wearingAnything)
            {
                wearingText = $" You watch, dumbfounded, as your {vagDesc} shrinks down, finally stopping as it reaches a more human size and shape.";
            }
            else
            {
                wearingText = $" You strip off your clothes to inspect your nethers, and immediately notice your {vagDesc} is much smaller than it was just a few moments ago. " +
                              $"It continues shrinking before your eyes, finally stopping when it reaches a more human size and shape.";
            }
            return(intro + wearingText + "Your outer lips also shift from their current dark-purple, back to a more tone that blends more naturally with the rest of your body and " +
                   "complements your feminine folds. With a start, you realize " + SafelyFormattedString.FormattedText("You have a human pussy once again!", StringFormats.BOLD) +
                   " While smaller than it used to be, it appears just as tight, relatively speaking, and is still just as wet as it was before. Still, you're almost certain " +
                   "you've lost some of your former capacity, and a quick probe into your folds proves that is indeed the case. ");
        }
Пример #4
0
        private static string SandTrapTransformStr(VaginaData oldVagina, PlayerBase player)
        {
            var currentVag = player.vaginas[oldVagina.vaginaIndex];

            //should never happen but would cause strangeness in my lazy check later, so we'll explicitely handle it.
            if (oldVagina.type == currentVag.type)
            {
                return("Your v****a feels odd, but a quick inspection reveals nothing changed. Odd.");
            }

            StringBuilder sb = new StringBuilder(GlobalStrings.NewParagraph());

            //2 vaginas, and both used to be the same type - we want to tell them which one we're talking about.
            if (player.vaginas.Count == 2 && player.genitals.CountVaginasOfType(oldVagina.type) == 1)
            {
                sb.Append($"Your {Utils.NumberAsPlace(oldVagina.vaginaIndex)} {oldVagina.ShortDescription()}");
            }
            else
            {
                sb.Append($"Your {oldVagina.LongDescription(false)}");
            }

            if (oldVagina.type == HUMAN)
            {
                sb.Append(" feels... odd. You undo your clothes and gingerly inspect your nether regions. " +
                          "The tender pink color of your sex has disappeared, replaced with smooth, marble blackness starting at your lips and working inwards.");
            }
            else
            {
                sb.Append(" feels... odd. You undo your clothes and gingerly inspect your nether regions. You quickly notice it has changed back toward something more distincly human, "
                          + "though it is most definitely not. Instead of tender pink inner folds you'd expect, your sex is a smooth marble blackness, "
                          + "beginning at your outer lips and moving inward.");
            }
            //(Wet:
            if (currentVag.wetness >= VaginalWetness.SLICK)
            {
                sb.Append(" Your natural lubrication makes it gleam invitingly.");
            }
            //(Corruption <50:
            if (player.corruption < 50)
            {
                sb.Append(" After a few cautious touches you decide it doesn't feel any different");

                if (oldVagina.type != VaginaType.HUMAN)
                {
                    sb.Append(" than you'd expect");
                }
                sb.Append(" - it does certainly look odd, though.");
            }
            else
            {
                sb.Append(" After a few cautious touches you decide it doesn't feel any different - the sheer bizarreness of it is a big turn on though, " +
                          "and you feel it beginning to shine with anticipation at the thought of using it.");
            }

            sb.Append(SafelyFormattedString.FormattedText("Your v****a is now ebony in color.", StringFormats.BOLD));

            return(sb.ToString());
        }
        public string RestoredAllVaginasGeneric(VaginaCollectionData oldVaginas)
        {
            //if changed has elements, we know they still exist in the current collection.
            IEnumerable <ValueDifference <VaginaData> > changed = ChangedVaginas(oldVaginas, true);
            int changeCount = changed.Count(x => x.newValue.isDefault && !x.oldValue.isDefault);

            if (changeCount == 0)
            {
                return("");
            }

            int humanVags = CountVaginasOfType(VaginaType.HUMAN);

            string changeText;

            if (vaginas.Count == 1)
            {
                //old should never be null.
                VaginaData old = oldVaginas.vaginas.FirstOrDefault(x => x.collectionID == vaginas[0].collectionID);
                if (old is null)
                {
                    return("");
                }
                else
                {
                    return(vaginas[0].RestoredText(old));
                }
            }

            if (humanVags < vaginas.Count)
            {
                changeText = "vaginas and find that one has returned back to a more natural, human size and color.";
            }
            else if (humanVags > changeCount)
            {
                changeText = "vaginas and find that one has returned back to something more fit on a human, matching the other one.";
            }
            else
            {
                changeText = "vaginas and find that they have turned back to their more natural, human size and color.";
            }

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

            return(GlobalStrings.NewParagraph() + "nSomething invisible brushes against your sex, making you twinge. " + armorText + ", you take a look at your "
                   + changeText);
        }
Пример #6
0
        private static string GenericDesc(VaginaData v****a, bool alternateFormat, bool fullDesc, string typeAdjective = null)
        {
            string baseAdjectives = VaginaAdjectiveText(v****a, fullDesc);

            if (!string.IsNullOrWhiteSpace(typeAdjective))
            {
                typeAdjective = typeAdjective.Trim() + " ";
            }

            if (!string.IsNullOrWhiteSpace(baseAdjectives))
            {
                baseAdjectives += " ";
            }

            //NOTE FROM VANILLA:
            //	Something that would be nice to have but needs a variable in Creature or Character.
            //if (i_creature.bunnyScore() >= 3) sb.Append("rabbit hole");
            //END NOTE
            //Response: agreed, but species implementation is in the frontend, plus that's weird with say, equine type or sand trap.
            //possible to add to frontend as an extension method, but would require some edge case detection requiring vag type to be humanoid/normal/whatever the default is called.


            return((alternateFormat ? "a " : "") + baseAdjectives + typeAdjective + VaginaNoun(false));
        }
Пример #7
0
        protected internal override string DoTransformation(Creature target, out bool isBadEnd)
        {
            isBadEnd = false;

            //by default, this is 2 rolls at 50%, so a 25% chance of 0 additional tfs, 50% chance of 1 additional tf, 25% chance of 2 additional tfs.
            //also takes into consideration any perks that increase or decrease tf effectiveness. if you need to roll out your own, feel free to do so.
            int changeCount  = GenerateChangeCount(target, new int[] { 2, 2, 3 }, isEnhanced ? 3 : 1);
            int totalChanges = 0;

            StringBuilder sb = new StringBuilder();

            //For all of these, any text regarding the transformation should be instead abstracted out as an abstract string function. append the result of this abstract function
            //to the string builder declared above (aka sb.Append(FunctionCall(variables));) string builder is just a fancy way of telling the compiler that you'll be creating a
            //long string, piece by piece, so don't do any crazy optimizations first.

            //the initial text for starting the transformation. feel free to add additional variables to this if needed.
            sb.Append(InitialTransformationText(target));

            //Add any free changes here - these can occur even if the change count is 0. these include things such as change in stats (intelligence, etc)
            //change in height, hips, and/or butt, or other similar stats.

            //this will handle the edge case where the change count starts out as 0.

            //paste this line after any tf is applied, and it will: automatically decrement the remaining changes count. if it becomes 0 or less, apply the total number of changes
            //underwent to the target's change count (if applicable) and then return the StringBuilder content.
            //if (--remainingChanges <= 0) return ApplyChangesAndReturn(target, sb, changeCount - remainingChanges);

            //STATS
            //Increase player str:
            if (target.strength < 60 && Utils.Rand(3) == 0)
            {
                double delta = target.IncreaseStrength((60 - target.strength) / 10.0);
                sb.Append(StrengthUpText(delta));
            }
            //Increase player tou:
            if (target.toughness < 60 && Utils.Rand(3) == 0)
            {
                double delta = target.IncreaseToughness((60 - target.toughness) / 10.0);
                sb.Append(ToughnessUpText(delta));
            }
            //Decrease player spd if it is over 30:
            if (target.relativeSpeed > 30 && target.speed > 30 && Utils.Rand(3) == 0)
            {
                double decrease = target.DecreaseSpeed((target.speed - 30) / 10.0);
                sb.Append(SpeedDownText(decrease));
            }
            //Increase Corr, up to a max of 50.
            //this is silent, apparently.
            if (!isPurified && target.corruption < 50)
            {
                target.IncreaseCorruptionBy((50 - target.corruption) / 10.0);
            }

            if (totalChanges >= changeCount)
            {
                return(FinalizeTransformation(target, sb, totalChanges));
            }

            //Sex bits - Duderiffic
            if (target.cocks.Count > 0 && Utils.Rand(2) == 0 && !hyperHappy)
            {
                //If the player has at least one dick, decrease the size of each slightly,

                C**k     biggest   = target.genitals.LongestCock();
                CockData preChange = biggest.AsReadOnlyData();

                if (biggest.DecreaseLengthAndCheckIfNeedsRemoval(Utils.Rand(3) + 1))
                {
                    target.genitals.RemoveCock(biggest);
                    if (target.cocks.Count == 0 && !target.hasVagina)
                    {
                        BallsData oldBalls = target.balls.AsReadOnlyData();
                        target.AddVagina(0.25);
                        target.genitals.RemoveAllBalls();

                        sb.Append(MadeFemale(target, preChange, oldBalls));
                    }
                    else
                    {
                        sb.Append(ShrunkOneCock(target, preChange, true));
                    }
                }
                else
                {
                    sb.Append(ShrunkOneCock(target, preChange, false));
                }

                if (++totalChanges >= changeCount)
                {
                    return(FinalizeTransformation(target, sb, totalChanges));
                }
            }
            //Sex bits - girly
            bool boobsGrew = false;
            //Increase player's breast size, if they are FF or bigger
            //do not increase size, but do the other actions:
            CupSize biggestCup = target.genitals.BiggestCupSize();

            if ((biggestCup < CupSize.DD || (!isPurified && biggestCup < CupSize.FF)) && (isEnhanced || Utils.Rand(3) == 0))
            {
                BreastData oldBreasts = target.breasts[0].AsReadOnlyData();
                if (target.breasts[0].GrowBreasts((byte)(1 + Utils.Rand(3))) > 0)
                {
                    boobsGrew = true;
                    sb.Append(GrewFirstBreastRow(target, oldBreasts));
                    if (++totalChanges >= changeCount)
                    {
                        return(FinalizeTransformation(target, sb, totalChanges));
                    }
                }
                target.DeltaCreatureStats(sens: .5);
            }

            //Remove feathery hair
            HairData oldHair = target.hair.AsReadOnlyData();

            if (base.RemoveFeatheryHair(target))
            {
                sb.Append(RemovedFeatheryHairText(target, oldHair));
                if (++totalChanges >= changeCount)
                {
                    return(FinalizeTransformation(target, sb, totalChanges));
                }
            }

            //refresh the biggest cup size because we may have grown some breasts earlier.
            biggestCup = target.genitals.BiggestCupSize();

            //If breasts are D or bigger and are not lactating, they also start lactating:
            if (biggestCup >= CupSize.D && !target.genitals.isLactating && (isEnhanced || boobsGrew || Utils.Rand(3) == 0))
            {
                BreastData preLactation = target.breasts[0].AsReadOnlyData();
                target.genitals.StartLactating();

                sb.Append(StartedLactatingText(target, preLactation));

                if (++totalChanges >= changeCount)
                {
                    return(FinalizeTransformation(target, sb, totalChanges));
                }

                target.DeltaCreatureStats(sens: .5);
            }
            //Quad nipples and other 'special isEnhanced things.
            if (isEnhanced)
            {
                //QUAD DAMAGE!
                if (!target.genitals.hasQuadNipples)
                {
                    BreastCollectionData oldBreasts = target.genitals.allBreasts.AsReadOnlyData();
                    target.genitals.SetQuadNipples(true);

                    sb.Append(GrantQuadNippleText(target, oldBreasts));

                    if (++totalChanges >= changeCount)
                    {
                        return(FinalizeTransformation(target, sb, totalChanges));
                    }
                }
                else if (target.genitals.isLactating)
                {
                    BreastCollectionData oldBreasts = target.genitals.allBreasts.AsReadOnlyData();

                    target.genitals.BoostLactation(2.5);
                    double delta = 0;

                    if (target.genitals.nippleLength < 1 || (target.genitals.nippleLength < 1.5 && !isPurified))
                    {
                        delta = target.genitals.GrowNipples(0.25);
                        target.DeltaCreatureStats(sens: .5);
                    }

                    sb.Append(BoostedLactationText(target, oldBreasts, delta));

                    if (++totalChanges >= changeCount)
                    {
                        return(FinalizeTransformation(target, sb, totalChanges));
                    }
                }
            }
            //If breasts are already lactating and the player is not lactating beyond a reasonable level, they start lactating more:
            else
            {
                if (target.genitals.isLactating && (target.genitals.lactationStatus < LactationStatus.MODERATE ||
                                                    (!isPurified && target.genitals.lactationStatus < LactationStatus.STRONG)) && (isEnhanced || Utils.Rand(3) == 0))
                {
                    BreastCollectionData oldBreasts = target.genitals.allBreasts.AsReadOnlyData();
                    double delta = 0;

                    target.genitals.BoostLactation(0.75);

                    if (target.genitals.nippleLength < 1 || (target.genitals.nippleLength < 1.5 && !isPurified))
                    {
                        delta = target.genitals.GrowNipples(0.25);
                        target.DeltaCreatureStats(sens: .5);
                    }

                    sb.Append(BoostedLactationText(target, oldBreasts, delta));

                    if (++totalChanges >= changeCount)
                    {
                        return(FinalizeTransformation(target, sb, totalChanges));
                    }
                }
                else if (isPurified && target.genitals.lactationStatus >= LactationStatus.STRONG)
                {
                    BreastCollectionData oldData = target.genitals.allBreasts.AsReadOnlyData();

                    target.DeltaCreatureStats(sens: .5);
                    target.genitals.BoostLactation(-1);

                    sb.Append(BoostedLactationText(target, oldData, 0));


                    if (++totalChanges >= changeCount)
                    {
                        return(FinalizeTransformation(target, sb, totalChanges));
                    }
                }
            }
            //If breasts are lactating at a fair level
            //and the player has not received this status,
            //apply an effect where the player really wants
            //to give their milk to other creatures
            //(capable of getting them addicted):
            biggestCup = target.genitals.BiggestCupSize();

            if (!target.HasPerk <Feeder>() && target.genitals.lactationStatus >= LactationStatus.MODERATE && Utils.Rand(2) == 0 && biggestCup >= CupSize.DD &&
                target.IsCorruptEnough(35))
            {
                target.perks.AddPerk <Feeder>();
                sb.Append(GainedFeederPerk(target));
                if (++totalChanges >= changeCount)
                {
                    return(FinalizeTransformation(target, sb, totalChanges));
                }
            }
            //UNFINISHED
            //If player has addictive quality and drinks pure version, removes addictive quality.
            //if the player has a v****a and it is tight, it loosens.
            if (target.hasVagina)
            {
                VaginalLooseness targetLooseness = EnumHelper.Min(VaginalLooseness.LOOSE, target.genitals.maxVaginalLooseness);
                V****a           tightest        = target.genitals.TightestVagina();

                if (tightest.looseness < targetLooseness && Utils.Rand(2) == 0)
                {
                    VaginaData preLoosened = tightest.AsReadOnlyData();


                    tightest.IncreaseLooseness(2);
                    sb.Append(LoosenedTwatText(target, preLoosened));

                    if (++totalChanges >= changeCount)
                    {
                        return(FinalizeTransformation(target, sb, totalChanges));
                    }

                    target.DeltaCreatureStats(lus: 10);
                }
            }
            //Neck restore
            if (target.neck.type != NeckType.HUMANOID && Utils.Rand(4) == 0)
            {
                NeckData oldData = target.neck.AsReadOnlyData();
                target.RestoreNeck();
                sb.Append(RestoredNeckText(target, oldData));

                if (++totalChanges >= changeCount)
                {
                    return(FinalizeTransformation(target, sb, totalChanges));
                }
            }
            //Rear body restore
            if (target.back.type != BackType.SHARK_FIN && Utils.Rand(5) == 0)
            {
                BackData oldData = target.back.AsReadOnlyData();
                target.RestoreBack();
                sb.Append(RestoredBackText(target, oldData));
                if (++totalChanges >= changeCount)
                {
                    return(FinalizeTransformation(target, sb, totalChanges));
                }
            }
            //Ovi perk loss
            if (!isPurified && target.womb.canRemoveOviposition && Utils.Rand(5) == 0)
            {
                target.womb.ClearOviposition();
                sb.Append(ClearOvipositionText(target));

                if (++totalChanges >= changeCount)
                {
                    return(FinalizeTransformation(target, sb, totalChanges));
                }
            }
            //General Appearance (Tail -> Ears -> Paws(fur stripper) -> Face -> Horns
            //Give the player a bovine tail, same as the minotaur
            if (!isPurified && target.tail.type != TailType.COW && Utils.Rand(3) == 0)
            {
                TailData oldData = target.tail.AsReadOnlyData();

                target.UpdateTail(TailType.COW);
                sb.Append(ChangedTailText(target, oldData));

                if (++totalChanges >= changeCount)
                {
                    return(FinalizeTransformation(target, sb, totalChanges));
                }
            }
            //Give the player bovine ears, same as the minotaur
            if (!isPurified && target.ears.type != EarType.COW && Utils.Rand(4) == 0 && target.tail.type == TailType.COW)
            {
                EarData oldEars = target.ears.AsReadOnlyData();
                target.UpdateEars(EarType.COW);

                sb.Append(ChangedEarsText(target, oldEars));

                if (++totalChanges >= changeCount)
                {
                    return(FinalizeTransformation(target, sb, totalChanges));
                }
            }
            //If the player is under 7 feet in height, increase their height, similar to the minotaur
            if (((isEnhanced && target.build.heightInInches < 96) || target.build.heightInInches < 84) && Utils.Rand(2) == 0)
            {
                int temp = Utils.Rand(5) + 3;
                //Slow rate of growth near ceiling
                if (target.build.heightInInches > 74)
                {
                    temp = (int)Math.Floor(temp / 2.0);
                }
                //Never 0
                if (temp == 0)
                {
                    temp = 1;
                }


                byte delta = target.build.IncreaseHeight((byte)temp);

                sb.Append(GrowTaller(target, delta));

                if (++totalChanges >= changeCount)
                {
                    return(FinalizeTransformation(target, sb, totalChanges));
                }
            }
            //Give the player hoofs, if the player already has hoofs STRIP FUR
            if (!isPurified && target.lowerBody.type != LowerBodyType.HOOVED && target.ears.type == EarType.COW)
            {
                if (Utils.Rand(3) == 0)
                {
                    var oldData = target.lowerBody.AsReadOnlyData();
                    target.UpdateLowerBody(LowerBodyType.HOOVED);

                    sb.Append(ChangedLowerBodyText(target, oldData));

                    if (++totalChanges >= changeCount)
                    {
                        return(FinalizeTransformation(target, sb, totalChanges));
                    }
                }
            }
            //If the player's face is non-human, they gain a human face
            if (!isEnhanced && target.lowerBody.type == LowerBodyType.HOOVED && target.face.type != FaceType.HUMAN && Utils.Rand(4) == 0)
            {
                //Remove face before fur!
                var oldData = target.face.AsReadOnlyData();
                target.RestoreFace();
                sb.Append(RestoredFaceText(target, oldData));

                if (++totalChanges >= changeCount)
                {
                    return(FinalizeTransformation(target, sb, totalChanges));
                }
            }
            //isEnhanced get shitty fur
            var targetFur = new FurColor(HairFurColors.BLACK, HairFurColors.WHITE, FurMulticolorPattern.SPOTTED);

            if (isEnhanced && (!target.body.IsFurBodyType() || !target.body.mainEpidermis.fur.Equals(targetFur)))
            {
                var oldData = target.body.AsReadOnlyData();

                if (target.body.type == BodyType.SIMPLE_FUR)
                {
                    target.body.ChangeMainFur(targetFur);
                }
                else
                {
                    target.UpdateBody(BodyType.SIMPLE_FUR, targetFur);
                }

                if (!oldData.IsFurBodyType())
                {
                    sb.Append(ChangedBodyText(target, oldData));
                }
                else
                {
                    sb.Append(ChandedFurToSpots(target, oldData));
                }

                if (++totalChanges >= changeCount)
                {
                    return(FinalizeTransformation(target, sb, totalChanges));
                }
            }
            //if isEnhanced to probova give a shitty cow face
            else if (isEnhanced && target.face.type != FaceType.COW_MINOTAUR)
            {
                var oldData = target.face.AsReadOnlyData();
                target.UpdateFace(FaceType.COW_MINOTAUR);
                sb.Append(ChangedFaceText(target, oldData));

                if (++totalChanges >= changeCount)
                {
                    return(FinalizeTransformation(target, sb, totalChanges));
                }
            }
            //Give the player bovine horns, or increase their size, same as the minotaur
            //New horns or expanding mino horns
            if (!isPurified && Utils.Rand(3) == 0)
            {
                var oldHorns = target.horns.AsReadOnlyData();
                if (target.horns.type != HornType.BOVINE)
                {
                    target.UpdateHorns(HornType.BOVINE);
                    sb.Append(ChangedHornsText(target, oldHorns));

                    if (++totalChanges >= changeCount)
                    {
                        return(FinalizeTransformation(target, sb, totalChanges));
                    }
                }
                else if (target.horns.type == HornType.BOVINE && target.horns.CanStrengthen && target.horns.significantHornSize < 5)
                {
                    target.horns.StrengthenTransform();
                    sb.Append(MadeHornsBigger(target, oldHorns));

                    if (++totalChanges >= changeCount)
                    {
                        return(FinalizeTransformation(target, sb, totalChanges));
                    }
                }
            }

            //Increase the size of the player's hips, if they are not already childbearing or larger
            if (Utils.Rand(2) == 0 && target.hips.size < 15)
            {
                if (isPurified && target.hips.size < 8 || !isPurified)
                {
                    var oldHips = target.hips.AsReadOnlyData();

                    if (target.build.GrowHips((byte)(1 + Utils.Rand(4))) > 0)
                    {
                        sb.Append(WidenedHipsText(target, oldHips));
                        if (++totalChanges >= changeCount)
                        {
                            return(FinalizeTransformation(target, sb, totalChanges));
                        }
                    }
                }
            }
            // Remove gills
            if (Utils.Rand(4) == 0 && target.gills.type != GillType.NONE)
            {
                var oldData = target.gills.AsReadOnlyData();
                target.RestoreGills();

                sb.Append(RestoredGillsText(target, oldData));

                if (++totalChanges >= changeCount)
                {
                    return(FinalizeTransformation(target, sb, totalChanges));
                }
            }

            //Increase the size of the player's ass (less likely then hips), if it is not already somewhat big
            if (Utils.Rand(2) == 0 && target.butt.size < 8 || (!isPurified && target.butt.size < 13))
            {
                var oldButt = target.butt.AsReadOnlyData();
                if (target.butt.GrowButt((byte)(1 + Utils.Rand(2))) > 0)
                {
                    sb.Append(GrewButtText(target, oldButt));
                    if (++totalChanges >= changeCount)
                    {
                        return(FinalizeTransformation(target, sb, totalChanges));
                    }
                }
            }
            //Nipples Turn Back:
            if (target.genitals.hasBlackNipples && Utils.Rand(3) == 0)
            {
                target.genitals.SetBlackNipples(false);
                sb.Append(RemovedBlackNippleText(target));

                if (++totalChanges >= changeCount)
                {
                    return(FinalizeTransformation(target, sb, totalChanges));
                }
            }
            //Debugcunt
            if (target.hasVagina && target.vaginas.Any(x => x.type != VaginaType.defaultValue) && Utils.Rand(3) == 0)
            {
                var oldCollection = target.genitals.allVaginas.AsReadOnlyData();
                target.vaginas.ForEach(x => target.genitals.RestoreVagina(x));
                sb.Append(RestoreAllVaginasText(target, oldCollection));

                if (++totalChanges >= changeCount)
                {
                    return(FinalizeTransformation(target, sb, totalChanges));
                }
            }


            //this is the fallthrough that occurs when a tf item goes through all the changes, but does not proc enough of them to exit early. it will apply however many changes
            //occurred, then return the contents of the stringbuilder.
            return(FinalizeTransformation(target, sb, changeCount - totalChanges));
        }
Пример #8
0
 private static string HumanFullDesc(VaginaData v****a, bool alternateFormat)
 {
     return(GenericDesc(v****a, alternateFormat, true));
 }
Пример #9
0
 private static string SandTrapRemovedVaginaStr(VaginaData removedVagina, PlayerBase player)
 {
     return(GenericLoseVaginaDesc(removedVagina, player));
 }
Пример #10
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());
        }
Пример #11
0
 private static string HumanRestoreStr(VaginaData originalVagina, PlayerBase player)
 {
     return(GlobalStrings.RevertAsDefault(originalVagina, player));
 }
Пример #12
0
 private static string HumanTransformStr(VaginaData previousVagina, PlayerBase player)
 {
     return(previousVagina.type.RestoredString(previousVagina, player));
 }
Пример #13
0
 private static string HumanLongDesc(VaginaData v****a, bool alternateFormat)
 {
     return(GenericDesc(v****a, alternateFormat, false));
 }
Пример #14
0
 protected abstract string LoosenedTwatText(Creature target, VaginaData preLoosened);
Пример #15
0
        //some text taken from kelly pussy->horse-c**t text, and largely altered to work here.
        private static string EquineTransformStr(VaginaData oldVagina, PlayerBase player)
        {
            var currentVag = player.vaginas[oldVagina.vaginaIndex];

            //should never happen but would cause strangeness in my lazy check later, so we'll explicitely handle it.
            if (oldVagina.type == currentVag.type)
            {
                return("Your " + oldVagina.ShortDescription() + " feels odd, but a quick inspection reveals nothing changed. Odd.");
            }

            StringBuilder sb = new StringBuilder(GlobalStrings.NewParagraph());

            //2 vaginas, and both used to be the same type - we want to tell them which one we're talking about.
            if (player.vaginas.Count == 2)
            {
                sb.Append($"Your {Utils.NumberAsPlace(oldVagina.vaginaIndex)} c**t");
            }
            else
            {
                sb.Append($"your {oldVagina.c**t.ShortDescription()}");
            }

            //basically, cheat this by forcing the player to o****m, then realize the changes once they come to. allows me to not care what the old type was.
            sb.Append(" tingles, as if something delicate was being brushed against it. The feeling builds");

            if (player.wearingAnything)
            {
                sb.Append(" until you can't help yourself but undress, desperate to find the source. Strangely, the feeling doesn't go away even though you're completely naked. ");
            }
            else
            {
                sb.Append(" despite the fact that you aren't wearing anything that could cause it, which only serves to confuse you. ");
            }

            if (player.corruption < 25)
            {
                sb.Append("Briefly, you consider masturbating to see if it will relieve the sensation, but quickly push that aside. What are you thinking? Your self-control," +
                          "however, has little effect, as the sensation only seems to be getting worse. ");
            }
            else if (player.corruption < 50)
            {
                sb.Append("You consider masturbating to see if it will relieve the sensation, and eventually give in, rubbing your " + oldVagina.c**t.ShortDescription() + " gently. " +
                          "Unfortunately, that only seems to make things worse. You knew it was a bad idea! ");
            }
            else
            {
                sb.Append("Well, whatever. You suppose you could use an excuse to m********e, and quickly being rubbing your " + oldVagina.c**t.ShortDescription() + " with as much" +
                          "fervor as you can manage. At this point you're absolutely certain this will make things worse, but you don't really care. ");
            }

            sb.Append("The sensation builds, heat flooding your " + oldVagina.LongDescription(false) + "until the telltale signs of an oncoming o****m threaten to overwhelm you. ");

            if (player.corruption < 50)
            {
                sb.Append("Seeing as you have little choice, you begin to m********e in earnest, desperate to deal with your sudden sexual need. ");
            }
            else
            {
                sb.Append("You attack your c**t with renewed purpose, eager to sate your needs, slipping your other" + player.hands.ShortDescription(false) + "into your folds. ");
            }
            //explain why the o****m doesn't affect breasts or cocks (if applicable)
            if (player.gender == Gender.HERM || player.genitals.isLactating || player.genitals.nippleType == NippleStatus.DICK_NIPPLE)
            {
                sb.Append("Strangely, the urge is centered exclusively in your " + oldVagina.LongDescription(false) + "; ");
                if (player.gender == Gender.HERM)
                {
                    string hangStr = player.cocks.Count > 1 ? "hang" : "hangs";
                    sb.Append($" your {player.genitals.AllCocksShortDescription()} just {hangStr} there limply");
                }
                else
                {
                    sb.Append(" your nipples aren't even remotely aroused.");
                }
            }
            //
            sb.Append(" Accelerated by your aide, it isn't long before you climax. You to scream in ecstasy before passing out, suddenly completely spent. " +
                      "You awake shortly after and realize the cause of all this commotion: " + SafelyFormattedString.FormattedText("you now have an equine pussy!", StringFormats.BOLD));
            //describe it.
            sb.Append(" Your vertical slit is much longer and wider than anything you'd normally see on a human, and your inner lips are significantly more plump. Your vulva, " +
                      "which has also shifted to accomodate your new size, is also a dark-purple, almost black color, contrasting with your pink inner folds. ");

            //and explain capacity bonus.
            if (player.corruption < 25)
            {
                sb.Append($"You clean up a bit and move to a more secluded spot to regain some semblence of decency before checking examining your {currentVag.LongDescription(false)} " +
                          "further. ");
            }

            sb.Append("A quick examination reveals you're just as tight and as wet as you were before, ");
            if (currentVag.VaginalCapacity() >= 60 && oldVagina.capacity <= 50)
            {
                sb.Append("but if the fact that you can now fit part of your arm inside you is any indication, you can take larger insertions");
            }
            else
            {
                string penetrator = currentVag.VaginalCapacity() >= 60 ? "arm " : "hand ";
                sb.Append("but if the fact that you can now fit more of your " + penetrator + " inside you is any indication, you're pretty sure you can take larger insertions");
            }

            return(sb.ToString());
        }
Пример #16
0
 private static string EquineFullDesc(VaginaData v****a, bool alternateFormat)
 {
     return(GenericDesc(v****a, alternateFormat, true, "equine"));
 }
Пример #17
0
 private static string EquineLongDesc(VaginaData v****a, bool alternateFormat)
 {
     return(GenericDesc(v****a, alternateFormat, false, "equine"));
 }
Пример #18
0
 protected override string LoosenedTwatText(Creature target, VaginaData preLoosened)
 {
     return(GlobalStrings.NewParagraph() + "You feel a relaxing sensation in your groin. On further inspection you discover your "
            + preLoosened.LongDescription() + " has somehow relaxed, permanently loosening.");
 }
Пример #19
0
 private static string SandTrapFullDesc(VaginaData v****a, bool alternateFormat)
 {
     return(GenericDesc(v****a, alternateFormat, true, Utils.RandomChoice(sandTrapStrings)));
 }