Esempio n. 1
0
            protected override string CockChangedText(Creature target, GenitalsData oldGenitalData, int changedCock)
            {
                bool grewVagina = oldGenitalData.vaginas.Count == 0 && target.vaginas.Count > 0;
                bool lostBalls  = oldGenitalData.balls.hasBalls && !target.balls.hasBalls;
                bool lostCock   = oldGenitalData.cocks.Count > target.cocks.Count;

                CockData previousCockData = oldGenitalData.cocks[changedCock];

                string end;

                if (!grewVagina)
                {
                    end = target.genitals.allCocks.GenericChangeOneCockLengthText(previousCockData);
                }
                else
                {
                    end = target.genitals.allCocks.GenericChangeOneCockLengthText(previousCockData, lostCock, false) +
                          "Your " + oldGenitalData.cocks[0].LongDescription() + " suddenly starts tingling. It's a familiar feeling, similar to an o****m." +
                          "However, this one seems to start from the top down, instead of gushing up from your loins. You spend a few seconds frozen to the odd sensation, " +
                          "when it suddenly feels as though your own body starts sucking on the base of your shaft. Almost instantly, " +
                          "your c**k sinks into your crotch with a wet slurp. The tip gets stuck on the front of your body on the way down, " +
                          "but your glans soon loses all volume to turn into a shiny new c**t." +
                          (lostBalls ? " At the same time, your " + oldGenitalData.balls.ShortDescription() + " fall victim to the same sensation; " +
                           "eagerly swallowed whole by your crotch." : "") + " Curious, you touch around down there, to find you don't have any exterior organs left." +
                          "All of it got swallowed into the gash you now have running between two fleshy folds, like sensitive lips. " +
                          "It suddenly occurs to you; <b> you now have a v****a!</b> ";
                }

                return("Your " + previousCockData.LongDescription() + " feels strange as it brushes against the fabric of your gown." + Environment.NewLine +
                       end);
            }
        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);
        }
Esempio n. 3
0
        private static string ImpifyText(Creature target, GenitalsData previousGenitals)

        {
            StringBuilder sb = new StringBuilder("A strange sensation begins to sweep through your body, ");

            if (target.wearingAnything)
            {
                sb.Append("and you quickly disrobe, curious to see what other effects the imp food could have on your body.");
            }
            else
            {
                sb.Append("and you look down, curious as to what else the imp food could change.");
            }

            sb.Append(" As you give yourself a quick look-over, you're unsure what else the food could change, considering how impish you already are. ");

            if (previousGenitals.gender != Gender.MALE)
            {
                sb.Append("Come to think of it, though, you've only seen male imps... Oh.");
            }
            else if (previousGenitals.breasts.Count > 1)
            {
                sb.Append("Then again, you've never seen an imp with anything but a single pair of flat, manly breasts... Oh.");
            }
            else if (!previousGenitals.breasts[0].isMaleBreasts)
            {
                sb.Append("Then again, you've never seen an imp with breasts... Oh.");
            }
            else if (!previousGenitals.balls.hasBalls)
            {
                sb.Append("Then again, you can't say you've seen an imp without a pair of balls... Oh");
            }

            if (previousGenitals.breasts.Count > 1)
            {
                sb.Append(GlobalStrings.NewParagraph() + "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 extra breasts shrink down, disappearing completely into your body. The nipples even fade away until they're gone completely. " +
                          SafelyFormattedString.FormattedText("Your impification has removed all of your extra breast rows!", StringFormats.BOLD));
            }

            if (!previousGenitals.breasts[0].isMaleBreasts)
            {
                if (previousGenitals.breasts.Count > 1)
                {
                    sb.Append(SafelyFormattedString.FormattedText(" Additionally, your remaining breast row is now more flat and manly!", StringFormats.BOLD));
                    //link the two together with flavor text, maybe.
                }
                else
                {
                    sb.Append("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 "
                              + previousGenitals.breasts[0].ShortDescription() + " shrink down, " + SafelyFormattedString.FormattedText("becoming flatter and manlier!", StringFormats.BOLD));
                }
            }

            bool grewBalls = !previousGenitals.balls.hasBalls;

            //previously female
            if (previousGenitals.gender == Gender.FEMALE)
            {
                sb.Append("The sensation reaches your groin, and your " + (previousGenitals.numVaginas > 1 ? "vaginas seem" : "v****a seems") + " to be particularly affected. " +
                          "You can't help but watch as ");

                if (previousGenitals.numVaginas > 1)
                {
                    sb.Append(SafelyFormattedString.FormattedText("your " + previousGenitals.AllVaginasLongDescription() + " receed inward, their fleshy entrances " +
                                                                  "combining together before shrinking down to almost nothing.", StringFormats.BOLD));
                }
                else
                {
                    sb.Append(SafelyFormattedString.FormattedText("your innermost depths collapse on themselves, dragging the rest of your "
                                                                  + previousGenitals.vaginas[0].ShortDescription() + " with it. ", StringFormats.BOLD));
                }

                sb.Append(" Instead of disappearing, though, your remaining folds begin to bunch together, then push outward, flooding you with pleasure. " +
                          "You soon reach your limit, not able to stop yourself from cumming " + SafelyFormattedString.FormattedText("out of your new c**k!", StringFormats.BOLD));

                if (grewBalls)
                {
                    sb.Append(SafelyFormattedString.FormattedText(" A pair of balls drop below it, completing the look!", StringFormats.BOLD));
                }

                sb.Append("You soon realize that this means you're no longer female, but you suppose that's the price you pay to become fully impish.");
            }

            //previously herm
            else if (previousGenitals.gender == Gender.HERM)
            {
                sb.Append("The sensation reaches your groin, and your " + (previousGenitals.numVaginas > 1 ? "vaginas seem" : "v****a seems") + " to be particularly affected. " +
                          "You can't help but watch as ");

                if (previousGenitals.numVaginas > 1)
                {
                    sb.Append(SafelyFormattedString.FormattedText("your " + previousGenitals.AllVaginasLongDescription() + " receed inward, collapsing upon themselves " +
                                                                  "until they're completely gone!", StringFormats.BOLD));
                }
                else
                {
                    sb.Append(SafelyFormattedString.FormattedText("it receeds inwards, collapsing upon itself until it's completely gone!", StringFormats.BOLD));
                }

                sb.Append("It appears you're no longer a herm, but you suppose that's the price you pay to become fully impish.");

                if (grewBalls)
                {
                    sb.Append(Environment.NewLine + SafelyFormattedString.FormattedText("A pair of balls drops in place below your" + target.genitals.AllCocksLongDescription() +
                                                                                        "completing the transformation.", StringFormats.BOLD));
                }
            }
            //previously genderless
            else if (previousGenitals.gender == Gender.GENDERLESS)
            {
                sb.Append("The sensation reaches your groin, stirring up a sexual need with no real way to satisfy it. As if on cue, a bulge begins to form " +
                          "on your smooth groin, gradually building up pressure until it bursts forth. The feeling is so intense you can't help but cum from " +
                          SafelyFormattedString.FormattedText("your new c**k!", StringFormats.BOLD));

                if (grewBalls)
                {
                    sb.Append(Environment.NewLine + SafelyFormattedString.FormattedText("A pair of balls drops in place below it, completing the look.", StringFormats.BOLD));
                }

                sb.Append("It appears you're male now, which is apparently part of the price of becoming fully impish.");
            }
            //previously 'male' but without balls.
            else if (!previousGenitals.balls.hasBalls)
            {
                sb.Append(GlobalStrings.NewParagraph() + "Sure enough, the sensation drops below your thighs, where a strange, unpleasant pressure forms, and " +
                          SafelyFormattedString.FormattedText("A pair of balls drop below your " + target.genitals.AllCocksShortDescription() + "!", StringFormats.BOLD) +
                          "Welp, guess that's one more thing you have in common with imps now.");
            }


            return(sb.ToString());
        }
Esempio n. 4
0
 protected override string ImpifiedText(Creature target, GenitalsData previousGenitals)
 {
     return(ImpFood.ImpifyText(target, previousGenitals));
 }
Esempio n. 5
0
 protected abstract string ImpifiedText(Creature target, GenitalsData oldGenitals);
Esempio n. 6
0
        protected internal override string DoTransformation(Creature target, out bool isBadEnd)
        {
            isBadEnd = false;

            int changeCount      = GenerateChangeCount(target, new int[] { 2, 2 });
            int remainingChanges = changeCount;

            StringBuilder sb = new StringBuilder();

            sb.Append(InitialTransformText(target));
            target.DeltaCreatureStats(lus: 3, corr: 1);

            uint hpDelta;

            if (target.hasCock)
            {
                if (target.cocks[0].length < 12)
                {
                    CockData oldData = target.cocks[0].AsReadOnlyData();
                    double   temp    = target.cocks[0].IncreaseLength(Utils.Rand(2) + 2);
                    sb.Append(OneCockGrewLarger(target, oldData, temp));
                }
                hpDelta = 30;
            }
            else
            {
                hpDelta = 20;
            }

            if (target is CombatCreature healthCheck)
            {
                healthCheck.AddHP((uint)(hpDelta + healthCheck.toughness / 3));
                sb.Append(GainVitalityText(target));
            }
            if (remainingChanges <= 0)
            {
                return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
            }

            //Red or orange skin!
            if (Utils.Rand(30) == 0 && !Array.Exists(Species.IMP.availableTones, x => x == target.body.primarySkin.tone))
            {
                Tones oldSkinTone = target.body.primarySkin.tone;
                if (target.body.ChangeMainSkin(Utils.RandomChoice(Species.IMP.availableTones)))
                {
                    sb.Append(ChangeSkinColorText(target, oldSkinTone));

                    if (--remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
            }


            //Shrinkage!
            if (Utils.Rand(2) == 0 && target.build.heightInInches > 42)
            {
                byte heightDelta = target.build.DecreaseHeight((byte)(1 + Utils.Rand(3)));
                if (heightDelta > 0)
                {
                    sb.Append(GetShorterText(target, heightDelta));

                    if (--remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
            }
            //Imp wings - I just kinda robbed this from demon changeCount ~Foxwells
            if (Utils.Rand(3) == 0 && ((target.wings.type != WingType.IMP && target.IsCorruptEnough(25)) || (target.wings.type == WingType.IMP && target.IsCorruptEnough(50))))
            {
                bool changedWings = false;
                //grow smalls to large
                if (target.wings.type == WingType.IMP)
                {
                    if (target.wings.GrowLarge())
                    {
                        sb.Append(EnlargenedImpWingsText(target));
                        changedWings = true;
                    }
                }
                else
                {
                    WingData oldData = target.wings.AsReadOnlyData();
                    if (target.UpdateWings(WingType.IMP))
                    {
                        sb.Append(GrowOrChangeWingsText(target, oldData));
                        changedWings = true;
                    }
                }

                if (changedWings)
                {
                    if (--remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
            }

            //Imp tail, because that's a unique thing from what I see?
            if (Utils.Rand(3) == 0 && target.tail.type != TailType.IMP)
            {
                TailData oldData = target.tail.AsReadOnlyData();
                if (target.UpdateTail(TailType.IMP))
                {
                    sb.Append(GrowOrChangeTailText(target, oldData));
                    target.IncreaseCorruption(2);

                    if (--remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
            }

            //Feets, needs red/orange skin and tail
            if (Species.IMP.availableTones.Contains(target.body.primarySkin.tone) && target.tail.type == TailType.IMP && target.lowerBody.type != LowerBodyType.IMP && Utils.Rand(3) == 0)
            {
                LowerBodyData oldData = target.lowerBody.AsReadOnlyData();
                if (target.UpdateLowerBody(LowerBodyType.IMP))
                {
                    sb.Append(ChangeLowerBodyText(target, oldData));

                    target.IncreaseCorruption(2);

                    if (--remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
            }

            //Imp ears, needs red/orange skin and horns
            if (target.horns.type == HornType.IMP && Array.Exists(Species.IMP.availableTones, x => target.body.primarySkin.tone == x) && target.ears.type != EarType.IMP && Utils.Rand(3) == 0)
            {
                EarData oldData = target.ears.AsReadOnlyData();
                if (target.UpdateEars(EarType.IMP))
                {
                    sb.Append(ChangeEarsText(target, oldData));

                    target.IncreaseCorruption(2);
                    if (--remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
            }

            //Horns, because why not?
            if (target.horns.type != HornType.IMP && Utils.RandBool())
            {
                HornData oldData = target.horns.AsReadOnlyData();
                if (target.UpdateHorns(HornType.IMP))
                {
                    sb.Append(ChangeOrGrowHornsText(target, oldData));

                    target.IncreaseCorruption(2);

                    if (--remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
            }

            //Imp arms, needs orange/red skin. Also your hands turn human.
            if (Species.IMP.availableTones.Contains(target.body.primarySkin.tone) && target.arms.type != ArmType.IMP && Utils.Rand(3) == 0)
            {
                ArmData oldData = target.arms.AsReadOnlyData();
                if (target.UpdateArms(ArmType.IMP))
                {
                    sb.Append(ChangeArmText(target, oldData));

                    target.IncreaseCorruption(2);
                    if (--remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
            }

            //Changes hair to red/dark red, shortens it, sets it normal, and makes it curly.
            if (!Species.IMP.availableHairColors.Contains(target.hair.hairColor) && Utils.Rand(3) == 0)
            {
                HairData oldHairData = target.hair.AsReadOnlyData();

                HairFurColors hairColor  = Utils.RandomChoice(Species.IMP.availableHairColors);
                double        hairLength = 1;

                if (target.hair.type != HairType.NORMAL)
                {
                    //also restarts hair growth if disabled.
                    target.UpdateHair(HairType.NORMAL, true, hairColor, newHairLength: hairLength, newStyle: HairStyle.CURLY);
                }
                else
                {
                    //also restarts hair growth if disabled.
                    target.hair.SetAll(hairLength, true, hairColor, style: HairStyle.CURLY);
                }
                sb.Append(HairChangedText(target, oldHairData));

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }

            //Remove spare titties
            if (target.breasts.Count > 1 && Utils.Rand(3) == 0 && !hyperHappy)
            {
                BreastData toRemove = target.breasts[target.breasts.Count - 1].AsReadOnlyData();

                if (target.genitals.RemoveBreastRows() > 0)
                {
                    sb.Append(RemovedAnExtraRowOfBreasts(target, toRemove));

                    if (--remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
            }
            //Shrink titties
            if (target.genitals.BiggestCupSize() > CupSize.FLAT && Utils.Rand(3) == 0 && !hyperHappy)
            {
                byte rowsAlreadyModified = 0;
                //temp3 stores how many rows are changed
                foreach (Breasts breast in target.breasts)
                {
                    //If this row is over threshhold
                    if (breast.cupSize > CupSize.FLAT)
                    {
                        CupSize oldSize = breast.cupSize;

                        byte delta;
                        //Big change
                        if (breast.cupSize > CupSize.EE_BIG)
                        {
                            delta = breast.ShrinkBreasts((byte)(2 + Utils.Rand(3)));
                        }
                        else
                        {
                            delta = breast.ShrinkBreasts(1);
                        }

                        if (delta != 0)
                        {
                            sb.Append(CurrentBreastRowChanged(target, breast.rowIndex, delta, rowsAlreadyModified));

                            rowsAlreadyModified++;
                        }
                    }
                }
                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }


            //Free extra nipple removal service
            if (target.genitals.hasQuadNipples && Utils.Rand(3) == 0)
            {
                target.genitals.SetQuadNipples(false);

                sb.Append(RemovedQuadNippleText(target));

                target.DecreaseSensitivity(3);
                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }

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

                    if (--remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
            }
            //Rear body restore
            if (target.back.type != BackType.defaultValue && Utils.Rand(5) == 0)
            {
                BackData oldData = target.back.AsReadOnlyData();
                if (target.RestoreBack())
                {
                    sb.Append(RestoredBackText(target, oldData));

                    if (--remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
            }
            //Ovi perk loss
            if (target is Player && Utils.Rand(5) == 0)
            {
                if (((PlayerWomb)target.womb).ClearOviposition())
                {
                    sb.Append(RemovedOvipositionText(target));

                    if (--remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
            }

            //You lotta imp? Time to turn male!
            //Unless you're one of the hyper happy assholes I guess
            //For real tho doesn't seem like female imps exist? Guess they're goblins
            if (target.ImpScore() >= 4 && !hyperHappy)
            {
                bool         changedSomething = false;
                GenitalsData oldGenitals      = target.genitals.AsReadOnlyData();

                changedSomething |= target.genitals.RemoveExtraBreastRows() > 0;
                changedSomething |= target.breasts[0].MakeMale(true);
                changedSomething |= target.RemoveAllVaginas() > 0;

                if (!target.hasCock)
                {
                    changedSomething |= target.AddCock(CockType.HUMAN, 12, 2);
                }
                if (target.balls.count == 0)
                {
                    changedSomething |= target.genitals.GrowBalls(2);
                }

                if (changedSomething)
                {
                    sb.Append(ImpifiedText(target, oldGenitals));
                    remainingChanges--;
                    target.IncreaseCorruption(20);
                }
            }
            return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
        }
 protected abstract string CockChangedText(Creature target, GenitalsData oldGenitalData, int changedCock);