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); }
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()); }
protected override string ImpifiedText(Creature target, GenitalsData previousGenitals) { return(ImpFood.ImpifyText(target, previousGenitals)); }
protected abstract string ImpifiedText(Creature target, GenitalsData oldGenitals);
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);