protected bool ChangeCock(Creature target, StringBuilder sb)
        {
            if (HyperHappySettings.isEnabled)
            {
                return(false);
            }

            //find the largest c**k. shrink it. if it gets small enough to remove it, do so. if it's the only c**k the creature has, grow a v****a in its place.
            if (target.hasCock)
            {
                GenitalsData oldGenitals = target.genitals.AsReadOnlyData();
                C**k         largest     = target.genitals.LongestCock();

                if (largest.DecreaseLengthAndCheckIfNeedsRemoval(Utils.Rand(3) + 1))
                {
                    target.genitals.RemoveCock(largest);

                    if (!target.hasCock && !target.hasVagina)
                    {
                        target.AddVagina(.25);
                        target.IncreaseCorruption();

                        BallsData oldBalls = target.balls.AsReadOnlyData();
                        target.balls.RemoveAllBalls();
                    }
                }

                sb.Append(CockChangedText(target, oldGenitals, largest.cockIndex));
                return(true);
            }
            return(false);
        }
Beispiel #2
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));
        }
        protected override string OnConsumeAttempt(Creature consumer, out bool consumeItem, out bool isBadEnd)
        {
            isBadEnd = false;

            BimBro bimbroPerk = consumer.GetPerkData <BimBro>();

            StringBuilder sb = new StringBuilder();

            if (bimbroPerk != null && bimbroPerk.broBody)
            {
                sb.Append("You wince as the stuff hits your stomach, already feeling the insidious effects beginning to take hold. A lengthy belch escapes your lips " +
                          "as your stomach gurgles, and you giggle abashedly to yourself.");
                if (consumer.build.heightInInches < 77)
                {
                    sb.Append(" ...Did the ground just get farther away? You glance down and realize, you're growing! Like a sped-up flower sprout, you keep on getting " +
                              "taller until finally stopping around... six and a half feet, you assume. Huh. You didn't expect that to happen!");
                    consumer.build.SetHeight(77);
                }
                CupSize biggestSize = consumer.genitals.BiggestCupSize();
                if (biggestSize < CupSize.E)
                {
                    if (biggestSize == CupSize.FLAT)
                    {
                        sb.Append(" Tingling, your chest begins to itch, then swell into a pair of rounded orbs. ");
                    }
                    else
                    {
                        sb.Append(" You feel a tingling inside your breasts. ");
                    }

                    sb.Append("They quiver ominously, and you can't help but squeeze your t**s together to further appreciate the boobquake as another tremor runs through them. " +
                              "Unexpectedly, the shaking pushes your hands further apart as your t**s balloon against each other, growing rapidly against your now-sunken fingers. " +
                              "The quakes continue until calming at around an E-cup.");
                    consumer.breasts[0].SetCupSize(CupSize.E);
                }
                //(If v****a = 2tight:
                if (!consumer.hasVagina)
                {
                    string armorText = consumer.LowerBodyArmorShort(false) ?? "volumous breasts";
                    sb.Append(" Before you can even take a breath, an extremely peculiar sensation emanates from your crotch. You can't see through your " + armorText +
                              ", but you can certainly feel the v****a splitting " + (consumer.balls.hasBalls ? "from behind your testicles" : "your groin") +
                              ". Luckily, the c**t-forming doesn't yield any discomfort - on the contrary, you feel yourself falling farther into your chemically-dulled, " +
                              "libido-fueled rut.");
                    if (consumer.hips.size < 12 || consumer.butt.size < 12)
                    {
                        sb.Append(" As if realizing the necessity of womanly proportions to attract the hard cocks your body now craves, your waist pinches slightly inward " +
                                  "and your hips and butt swell. You can't help but run a hand across your newly-feminized pelvis, admiring it.");
                    }

                    consumer.AddVagina();

                    if (consumer.hips.size < 12)
                    {
                        consumer.hips.SetHipSize(12);
                    }

                    if (consumer.butt.size < 12)
                    {
                        consumer.butt.SetButtSize(12);
                    }
                }
                sb.Append(GlobalStrings.NewParagraph());
                sb.Append("A wave of numbness rolls through your features, alerting you that another change is happening. You reach up to your feel your jaw narrowing, " +
                          "becoming more... feminine? Heavy, filling lips purse in disappointment as your face takes on a very feminine cast. You're probably pretty hot now!"
                          + GlobalStrings.NewParagraph());
                if (consumer.femininity < 80)
                {
                    consumer.femininity.SetFemininity(80);
                }

                sb.Append("Your surging, absurdly potent libido surges through your body, reminding you that you need to f**k. Not just bitches, but guys too. " +
                          "Hard cocks, wet pussies, hell, you don't care. They can have both or a dozen of either. You just want to get laid and bone something, " +
                          "hopefully at the same time!");

                sb.Append(GlobalStrings.NewParagraph() + "<b>(Perks Updated: Bro Body => Futa Form");
                if (bimbroPerk.bimbroBrains)
                {
                    sb.Append(", Bro Brains => Futa Faculties");
                }
                sb.Append(")" + Environment.NewLine);

                if (!bimbroPerk.bimbroBrains)
                {
                    sb.Append("(Perks Gained: Futa Faculties)");
                }
                sb.Append("</b>" + Environment.NewLine);

                if (consumer.intelligence > 35)
                {
                    consumer.SetIntelligence(35);
                }
                if (consumer.libido < 50)
                {
                    consumer.SetLibido(50);
                }
            }
            else
            {
                sb.Append("You pop the cork from the flask and are immediately assaulted by a cloying, spiced scent that paints visions of a slutty slave-girl's " +
                          "slightly-spread folds. Wow, this is some potent stuff! Well, you knew what you were getting into when you found this bottle! You open wide " +
                          "and guzzle it down, feeling the fire of alcohol burning a path to your belly. The burning quickly fades to a pleasant warmth that makes you " +
                          "light-headed and giggly." + GlobalStrings.NewParagraph());

                if (consumer.hair.hairColor != HairFurColors.PLATINUM_BLONDE || consumer.hair.isBald || !consumer.hair.type.growsOverTime || consumer.hair.type.isFixedLength)
                {
                    sb.Append("The first change that you notice is to your " + consumer.hair.LongDescription()
                              + ". It starts with a tingling in your scalp and intensifies ");

                    if (consumer.hair.isBald)
                    {
                        sb.Append("as hair grows along your previously bald dome, rapidly thickening and lengthening.");
                    }
                    else if (!consumer.hair.type.growsOverTime || consumer.hair.type.isFixedLength)
                    {
                        sb.Append("as it begins changing, reverting to something more natural. As it does, it rapidly gets longer and heavier until it's "
                                  + (Measurement.UsesMetric ? "nearly a meter" : "several feet") + " in length.");
                    }
                    else if (consumer.hair.length < 36)
                    {
                        sb.Append("as you feel the weight of your hair growing heavier and longer.");
                    }
                    else
                    {
                        sb.Append("as your hair grows thicker and heavier.");
                    }

                    sb.Append(" You grab a lock of the silken strands and watch open-mouthed while streaks so blonde they're almost white flow down the "
                              + consumer.hair.hairColor.AsString() + " hair. It goes faster and faster until your hair has changed into perfectly bimbo-blonde, flowing locks."
                              + GlobalStrings.NewParagraph());
                }

                sb.Append("Moaning lewdly, you begin to sway your hips from side to side, putting on a show for anyone who might manage to see you.  You just feel so... sexy. " +
                          "Too sexy to hide it. Your body aches to show itself and feel the gaze of someone, anyone upon it. Mmmm, it makes you so wet! ");
                if (!consumer.hasVagina)
                {
                    consumer.AddVagina(0.25, VaginalLooseness.NORMAL, VaginalWetness.SLICK);

                    if (consumer.isQuadruped)
                    {
                        sb.Append("Wait!? Wet? You wish you could touch yourself between the " + consumer.lowerBody.LongDescription() + ", " +
                                  "but you can tell from the fluid running down your hind-legs just how soaked your new v****a is.");
                    }
                    else
                    {
                        sb.Append("Wait!? Wet? You touch yourself between the " + consumer.lowerBody.LongDescription() +
                                  " and groan when your fingers sink into a sloppy, wet c**t.");
                    }
                }
                else
                {
                    if (consumer.isQuadruped)
                    {
                        sb.Append("You wish you could sink your fingers into " + (consumer.vaginas.Count > 1 ? "either of your sloppy, wet cunts" : "your sloppy, wet c**t") +
                                  " , but as a centaur, you can't quite reach.");
                        if (consumer.vaginas[0].wetness < VaginalWetness.SLICK)
                        {
                            consumer.vaginas[0].SetVaginalWetness(VaginalWetness.SLICK);
                        }
                    }
                    else if (consumer.vaginas.Count > 1)
                    {
                        sb.Append("You alternate slipping your fingers into both of your cunts, moaning with satisfaction at how sloppy and wet they are");

                        if (consumer.genitals.SmallestVaginalWetness() < VaginalWetness.SLICK)
                        {
                            sb.Append(" now");
                        }
                        sb.Append(".");
                    }
                    else
                    {
                        sb.Append("You sink your fingers into your ");
                        if (consumer.vaginas[0].wetness < VaginalWetness.SLICK)
                        {
                            sb.Append("now ");
                        }
                        sb.Append("sloppy, wet c**t with a groan of satisfaction.");
                    }
                }
                //prevent this from messing up futa form.
                if (bimbroPerk is null || bimbroPerk.bimboBody)
                {
                    if (consumer.balls.hasBalls)
                    {
                        sb.Append(GlobalStrings.NewParagraph() + "There's a light pinch against your [sack] that makes you gasp in surprise, followed by an exquisite tightness that makes your " +
                                  consumer.genitals.AllVaginasNoun() + " drool. Looking down, <b>you see your balls slowly receding into your body, leaving nothing behind but your puffy mons.</b>");

                        consumer.balls.RemoveAllBalls();
                    }
                    if (consumer.hasCock)
                    {
                        sb.Append(GlobalStrings.NewParagraph() + consumer.genitals.EachCockOrCocksShort(Conjugate.YOU, out bool isPlural) + (isPlural ? " seem" : " seems")
                                  + " to be responding to the liqueur in " + (isPlural ? "their" : "its") + " own way. Clenching and relaxing obscenely, " +
                                  "your genitals begin to drizzle cum onto the ground in front of you, throwing you into paroxysms of bliss. The flow of cum is steady but weak, " +
                                  "and each droplet that leaves you lets " + consumer.genitals.EachCockOrCocksShort() + " go more flaccid. Even once you're soft and little, " +
                                  "it doesn't stop. You cum your way down to nothing, a tiny droplet heralding your new, girlish groin. <b>You no longer have " +
                                  (isPlural ? "any penises" : "a penis") + "!</b>");
                    }
                }
                sb.Append(" Somehow, you feel like you could seduce anyone right now!" + GlobalStrings.NewParagraph());

                sb.Append("Another bubbly giggle bursts from your lips, which you then lick hungrily. You, like, totally want some dick to suck! " +
                          "Wow, that came out of left field. You shake your head and try to clear the unexpected, like, words from your head but it's getting kind of hard. " +
                          "Omigosh, you feel kind of like a dumb bimbo after, like, drinking that weird booze. Oh, well, it doesn't matter anyhow – you can, like, " +
                          "still stop the demons and stuff. You'll just have to show off your sexy bod until they're offering to serve you." + GlobalStrings.NewParagraph());

                sb.Append("You sigh and run one hand over your " + consumer.breasts[0].LongNippleDescription());

                consumer.breasts[0].GrowBreasts((byte)(5 + Utils.Rand(5)));

                if (consumer.breasts[0].cupSize < CupSize.EE_BIG)
                {
                    sb.Append(", surprised at how large and rounded your expanding breasts have become while fresh tit-flesh continues to spill out around your needy fingers. " +
                              "They feel so supple and soft, but when you let them go, they still sit fairly high and firm on your chest. The newer, more generous, "
                              + consumer.breasts[0].cupSize.AsText() + " cleavage has you moaning with how sensitive it is, pinching a nipple with one hand ");
                }
                else
                {
                    sb.Append(", admiring how sensitive they're getting. The big breasts start getting bigger and bigger, soft chest-flesh practically oozing out " +
                              "between your fingers as the squishy mammaries sprout like weeds, expanding well beyond any hand's ability to contain them. The supple, " +
                              consumer.breasts[0].cupSize.AsText() + " boobs still manage to sit high on your chest, almost gravity defying in their ability to generate cleavage. " +
                              "You pinch a nipple with one hand ");
                }

                consumer.IncreaseSensitivity(20);
                sb.Append("while the other toys with the juicy entrance of your folds. Mmmm, it, like, feels too good not to touch yourself, and after being worried " +
                          "about getting all dumb and stuff, you need to relax. Thinking is hard, but sex is so easy and, like, natural! You lean back and start grunting " +
                          "as you plunge four fingers inside yourself, plowing " + consumer.genitals.OneVaginaOrVaginasShort() + " like no tomorrow. " +
                          "By now, " + (consumer.vaginas.Count > 1 ? "its " : "your ") + consumer.vaginas[0].c**t.LongDescription() + " is throbbing, " +
                          "and you give it an experimental ");
                if (consumer.clits[0].length >= 3)
                {
                    sb.Append("jerk ");
                }
                else
                {
                    sb.Append("caress ");
                }

                sb.Append("that makes your " + consumer.lowerBody.LongDescription() + " give out as you cum, splattering female fluids as you convulse " +
                          "nervelessly on the ground." + GlobalStrings.NewParagraph());

                sb.Append("Though the o****m is intense, you recover a few moments later feeling refreshed, but still hot and horny. Maybe you could find a partner to f**k? " +
                          "After all, sex is, like, better with a partner or two. Or that number after two. You brush a lengthy, platinum blonde strand of hair out of your eyes " +
                          "and lick your lips - you're ready to have some fun!" + GlobalStrings.NewParagraph());

                if (consumer.hips.size < 12 || consumer.butt.size < 12)
                {
                    sb.Append("As you start to walk off in search of a sexual partner, you feel your center of balance shifting.");
                    if (consumer.hips.size < 12 && consumer.butt.size < 12)
                    {
                        sb.Append(" Your ass and hips inflate suddenly, forcing you to adopt a slow, swaying gait. You find that rolling your hips back and forth " +
                                  "comes naturally to you. You make sure to squeeze your butt-muscles and make your curvy tush jiggle as you go.");
                        consumer.butt.SetButtSize(12);
                        consumer.hips.SetHipSize(12);
                    }
                    else if (consumer.hips.size < 12)
                    {
                        sb.Append(" Your hips widen suddenly, forcing you to adopt a slow, swaying gait. You find that rolling yours hips back and forth " +
                                  "comes naturally to you, and your big, obscene ass seems to jiggle all on its own with every step you take.");
                        consumer.hips.SetHipSize(12);
                    }
                    else
                    {
                        sb.Append(" Your " + consumer.build.ButtLongDescription() + " swells dramatically, the puffy cheeks swelling with newfound weight " +
                                  "that jiggles along with each step. Clenching your glutes to make the posh cheeks jiggle a little more enticingly becomes second nature " +
                                  "to you in a few seconds.");
                        consumer.butt.SetButtSize(12);
                    }
                    sb.Append(GlobalStrings.NewParagraph());
                }
                if (consumer.build.muscleTone > 0)
                {
                    sb.Append("Like, weirdest of all, your muscles seem to be vanishing! Before your eyes, all muscle tone vanishes, leaving your body soft and gently curvy. " +
                              "You poke yourself and giggle! Everyone's totally going to want to, like, rub up against you at every opportunity. " +
                              "Your thighs are so soft you bet you could squeeze a pair of dicks to o****m without even touching your moist cunny.");
                    sb.Append(" It does get a bit harder to carry yourself around with your diminished strength, but that's, like, what big strong hunks are for anyways! " +
                              "You can just flirt until one of them volunteers to help out or something! Besides, you don't need to be strong to jerk off cocks " +
                              "or finger slutty pussies!");
                    sb.Append(GlobalStrings.NewParagraph());
                }
                if (bimbroPerk == null)
                {
                    sb.Append("<b>Perks gained : Bimbo Body, Bimbo Brains</b>" + Environment.NewLine);
                }
                else if (bimbroPerk.bimboBody && !bimbroPerk.bimbroBrains)
                {
                    sb.Append("<b>(Bimbo Body - Perk Gained!)</b>" + Environment.NewLine);
                }
                else if (!bimbroPerk.bimboBody && bimbroPerk.bimbroBrains)
                {
                    sb.Append("<b>(Bimbo Brains - Perk Gained!)</b>" + Environment.NewLine);                    //int to 20. max int 50)
                }

                if (consumer.intelligence > 21)
                {
                    consumer.SetIntelligence((byte)Math.Floor(Math.Max(consumer.intelligenceTrue / 5.0, 21)));
                }
                consumer.HaveGenericVaginalOrgasm(0, false, true);
                consumer.DeltaCreatureStats(inte: -1, lib: 4, sens: 25);
                //FULL ON BITCHFACE
                sb.Append(consumer.ModifyFemininity(100, 100));
                //Body
                //Tease/Seduce Boost
                //*boosts min lust and lust resistance)
                //*Tit size
                //Brain
                //Max int - 50
            }

            consumeItem = true;
            return(sb.ToString());
        }