예제 #1
0
        private string AssTightenedUpDueToInactivity(AnalLooseness currentLooseness)
        {
            string recoverText;

            if (currentLooseness <= AnalLooseness.ROOMY)
            {
                recoverText = " recovers from your ordeals, tightening up a bit.";
            }
            else if (currentLooseness == AnalLooseness.STRETCHED)
            {
                recoverText = " recovers from your ordeals and becomes tighter.";
            }
            else
            {
                recoverText = " recovers from the brutal stretching it has received and tightens up.";
            }
            return(Environment.NewLine + SafelyFormattedString.FormattedText("Your " + LongDescription() + recoverText, StringFormats.BOLD) + Environment.NewLine);
        }
예제 #2
0
        public static string AsDescriptor(this AnalLooseness analLooseness)
        {
            switch (analLooseness)
            {
            case AnalLooseness.GAPING:
                return("gaping");

            case AnalLooseness.STRETCHED:
                return("stretched");

            case AnalLooseness.ROOMY:
                return("roomy");

            case AnalLooseness.LOOSE:
                return("loose");

            case AnalLooseness.NORMAL:
            default:
                return("tight");
            }
        }
예제 #3
0
 private void CheckAnalLoosenessChanged(AnalLooseness oldValue)
 {
     source.genitals.ass.CheckLooseness();
 }
예제 #4
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, 3, 3 }, 1, 2);
            int remainingChanges = changeCount;

            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.
            if (remainingChanges <= 0)
            {
                return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
            }

            //Any transformation related changes go here. these typically cost 1 change. these can be anything from body parts to gender (which technically also changes body parts,
            //but w/e). You are required to make sure you return as soon as you've applied changeCount changes, but a single line of code can be applied at the end of a change to do
            //this for you.

            //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
            //Strength h
            if (Utils.Rand(3) == 0)
            {
                //weaker characters gain more
                if (target.relativeStrength <= 50)
                {
                    //very weak targets gain more
                    if (target.relativeStrength <= 20)
                    {
                        target.ChangeStrength(3);
                    }
                    else
                    {
                        target.ChangeStrength(2);
                    }
                }
                //stronger characters gain less
                else
                {
                    //small growth if over 75
                    if (target.relativeStrength >= 75)
                    {
                        target.ChangeStrength(.5);
                    }
                    //faster from 50-75
                    else
                    {
                        target.ChangeStrength(1);
                    }
                }
                //Chance of speed drop
                if (Utils.Rand(2) == 0 && target.relativeStrength > 50)
                {
                    target.ChangeSpeed(-1);
                }
            }
            //Toughness (chance of - sensitivity)
            if (Utils.Rand(3) == 0)
            {
                //weaker characters gain more
                if (target.relativeToughness <= 50)
                {
                    //very weak targets gain more
                    if (target.relativeToughness <= 20)
                    {
                        target.ChangeToughness(3);
                    }
                    else
                    {
                        target.ChangeToughness(2);
                    }
                }
                //stronger characters gain less
                else
                {
                    //small growth if over 75
                    if (target.relativeToughness >= 75)
                    {
                        target.ChangeToughness(.5);
                    }
                    //faster from 50-75
                    else
                    {
                        target.ChangeToughness(1);
                    }
                }
                //chance of less sensitivity
                if (Utils.Rand(2) == 0 && target.relativeSensitivity > 10)
                {
                    if (target.relativeToughness > 75)
                    {
                        target.ChangeSensitivity(-3);
                    }
                    if (target.relativeToughness <= 75 && target.relativeToughness > 50)
                    {
                        target.ChangeSensitivity(-2);
                    }
                    if (target.relativeToughness <= 50)
                    {
                        target.ChangeSensitivity(-3);
                    }
                }
            }
            //SEXUAL
            //Boosts ball size MORE than equinum :D:D:D:D:D:D:
            if (Utils.Rand(2) == 0 && target.balls.size <= 5 && target.genitals.HasAnyCocksOfType(CockType.HORSE))
            {
                //Chance of ball growth if not 3" yet
                if (target.balls.count == 0)
                {
                    target.balls.GrowBalls();

                    target.DeltaCreatureStats(lib: 2, lus: 5);
                }
                else
                {
                    target.balls.EnlargeBalls(1);
                    target.DeltaCreatureStats(lib: 1, lus: 3);
                }
                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //Neck restore
            if (target.neck.type != NeckType.HUMANOID && Utils.Rand(4) == 0)
            {
                target.RestoreNeck();
            }
            //Rear body restore
            if (!target.back.isDefault && Utils.Rand(5) == 0)
            {
                target.RestoreBack();
            }
            //Ovi perk loss
            if (target.womb.canRemoveOviposition && Utils.Rand(5) == 0)
            {
                target.womb.ClearOviposition();
                //if (--remainingChanges <= 0) return ApplyChangesAndReturn(target, sb, changeCount - remainingChanges);
            }
            //Restore arms to become human arms again
            if (Utils.Rand(4) == 0)
            {
                target.RestoreArms();
            }
            //+hooves
            if (target.lowerBody.type != LowerBodyType.HOOVED)
            {
                if (Utils.Rand(3) == 0)
                {
                    //Catch-all
                    target.UpdateLowerBody(LowerBodyType.HOOVED);
                    target.ChangeSpeed(1);

                    if (--remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
            }
            if (!hyperHappy)
            {
                //Kills v****a size (and eventually the whole v****a)
                if (target.vaginas.Count > 0)
                {
                    //behavior not defined for multi vag. i'
                    VaginalLooseness minLooseness = target.genitals.minVaginalLooseness;
                    //
                    if (target.genitals.LargestVaginalLooseness() > minLooseness)
                    {
                        //tighten that bitch up!
                        foreach (V****a vag in target.vaginas)
                        {
                            if (vag.looseness > minLooseness)
                            {
                                vag.DecreaseLooseness();
                            }
                        }
                    }
                    else if (target.vaginas.Count > 1)
                    {
                        target.RemoveExtraVaginas();
                    }
                    else
                    {
                        if (target.cocks.Count == 0)
                        {
                            target.genitals.AddCock(CockType.HORSE, target.vaginas[0].c**t.length + 2, 1);
                        }

                        //Goodbye womanhood!
                        target.genitals.RemoveAllVaginas();
                    }
                    if (--remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
                //-Remove extra breast rows
                if (target.breasts.Count > 1 && Utils.Rand(3) == 0)
                {
                    target.RemoveExtraBreastRows();
                }

                //Shrink boobages till they are normal
                else if (Utils.Rand(2) == 0 && target.breasts.Count > 0)
                {
                    //Single row
                    CupSize smallestCup = EnumHelper.Max(target.genitals.smallestPossibleCupSize, CupSize.B);

                    bool changedAny = false;

                    foreach (Breasts row in target.breasts.Where(x => x.cupSize > smallestCup))
                    {
                        changedAny |= row.ShrinkBreasts() > 0;
                        if (row.cupSize > CupSize.E_BIG)
                        {
                            changedAny |= row.ShrinkBreasts() > 0;
                        }
                    }

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


            //Boosts c**k size up to 36"x5".
            //MOD: Used linq: find the first c**k that matches the requirement, or if no cocks exist, return null.
            C**k firstCockToGrow = target.cocks.FirstOrDefault(x => x.type == CockType.HORSE && x.length < 36 || x.girth < 5);

            //MOD: thus, we can simply place the null check here to see if we actually grow it.
            if (!(firstCockToGrow is null) && Utils.Rand(2) == 0)
            {
                if (firstCockToGrow.girth < 5 && firstCockToGrow.length < 36)
                {
                    firstCockToGrow.IncreaseThickness(1);
                    firstCockToGrow.IncreaseLength(2 + Utils.Rand(8));
                }
                else if (firstCockToGrow.length < 36)
                {
                    firstCockToGrow.IncreaseLength(2 + Utils.Rand(8));
                }
                else
                {
                    firstCockToGrow.IncreaseThickness(1);
                }

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

            //Morph dick to horsediiiiick
            C**k firstNonHorse = target.cocks.FirstOrDefault(x => x.type != CockType.HORSE);

            if (!(firstNonHorse is null) && Utils.Rand(2) == 0)
            {
                //Text for humandicks or others
                //Text for dogdicks
                target.genitals.UpdateCockWithLength(firstNonHorse, CockType.HORSE, firstNonHorse.length + 4);

                target.DeltaCreatureStats(lib: 5, sens: 4, lus: 35);
                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }

            //Males go into rut
            if (Utils.Rand(4) == 0)
            {
                if (target.GoIntoRut())
                {
                    remainingChanges--;
                    if (remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
            }

            //Anti-masturbation status
            if (Utils.Rand(4) == 0 && !target.HasTimedEffect <Dysfunction>() && target.gender != Gender.GENDERLESS)
            {
                target.AddTimedEffect <Dysfunction>();

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //Appearance shit:
            //Tail, Ears, Hooves, Horns, Height (no prereq), Face
            //+height up to 9 foot
            //Mod note: rand(1.7) seriously? rand only works with ints, guys. that's straight from vanilla. though to be fair, it's not caught there b/c actionscript is shit.
            if (Utils.Rand(17) < 10 && target.build.heightInInches < 108)
            {
                byte temp = (byte)(Utils.Rand(5) + 3);
                //Slow rate of growth near ceiling
                if (target.build.heightInInches > 90)
                {
                    temp /= 2;
                }
                //Never 0
                if (temp == 0)
                {
                    temp = 1;
                }
                //Flavor texts. Flavored like 1950's cigarettes. Yum.
                target.build.IncreaseHeight(temp);
                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //Face change, requires Ears + Height + Hooves
            if (target.ears.type == EarType.COW && target.lowerBody.type == LowerBodyType.HOOVED && target.build.heightInInches >= 90 &&
                target.face.type != FaceType.COW_MINOTAUR && Utils.Rand(3) == 0)
            {
                FaceData oldData = target.face.AsReadOnlyData();
                target.UpdateFace(FaceType.COW_MINOTAUR);
                sb.Append(UpdateFaceText(target, oldData));

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //+mino horns require ears/tail
            if (Utils.Rand(3) == 0 && target.ears.type == EarType.COW && target.tail.type == TailType.COW)
            {
                //New horns or expanding mino horns
                if (target.horns.type == HornType.BOVINE || target.horns.type == HornType.NONE)
                {
                    //Get bigger if target has horns
                    if (target.horns.type == HornType.BOVINE)
                    {
                        //Fems horns don't get bigger.
                        if (target.vaginas.Count > 0)
                        {
                            if (target.horns.significantHornSize > 4)
                            {
                                target.genitals.AddPentUpTime(200);
                                target.ChangeLust(20);
                            }
                            else
                            {
                                target.horns.StrengthenTransform(2);
                            }
                            if (--remainingChanges <= 0)
                            {
                                return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                            }
                        }
                        //Males horns get 'uge.
                        else
                        {
                            target.horns.StrengthenTransform(2);

                            //boys get a cum refill sometimes
                            if (Utils.Rand(2) == 0)
                            {
                                target.genitals.AddPentUpTime(200);
                                target.ChangeLust(20);
                            }
                            if (--remainingChanges <= 0)
                            {
                                return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                            }
                        }
                    }
                    //If no horns yet..
                    else
                    {
                        HornData oldData = target.horns.AsReadOnlyData();
                        target.UpdateHorns(HornType.BOVINE);
                        sb.Append(UpdateHornsText(target, oldData));

                        if (--remainingChanges <= 0)
                        {
                            return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                        }
                    }
                }
                //Not mino horns, change to cow-horns
                else
                {
                    HornData oldData = target.horns.AsReadOnlyData();
                    target.UpdateHorns(HornType.BOVINE);
                    sb.Append(UpdateHornsText(target, oldData));

                    if (--remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
            }
            //+cow ears	- requires tail
            if (target.ears.type != EarType.COW && target.tail.type == TailType.COW && Utils.Rand(2) == 0)
            {
                EarData oldData = target.ears.AsReadOnlyData();
                target.UpdateEars(EarType.COW);
                sb.Append(UpdateEarsText(target, oldData));

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //+cow tail
            if (Utils.Rand(2) == 0 && target.tail.type != TailType.COW)
            {
                TailData oldData = target.tail.AsReadOnlyData();
                target.UpdateTail(TailType.COW);
                sb.Append(UpdateTailText(target, oldData));

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            // Remove gills
            if (Utils.Rand(4) == 0 && !target.gills.isDefault)
            {
                GillData oldData = target.gills.AsReadOnlyData();
                target.RestoreGills();
                sb.Append(RestoredGillsText(target, oldData));

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

            if (Utils.Rand(4) == 0 && target.ass.wetness > target.ass.minWetness)
            {
                target.ass.DecreaseWetness();
                AnalLooseness targetLooseness = EnumHelper.Max(AnalLooseness.LOOSE, target.ass.minLooseness);
                if (target.ass.looseness > targetLooseness)
                {
                    target.ass.DecreaseLooseness();
                }

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //Give you that mino build!
            //Default
            if (remainingChanges == changeCount)
            {
                if (target.balls.count > 0)
                {
                    target.genitals.AddPentUpTime(200);
                }
                (target as CombatCreature)?.AddHP(50);
                target.ChangeLust(50);
            }

            //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(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
        }
        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(InitialTransformationText(target));

            //*************
            //Stat Changes
            //*************
            //(increases sensitivity)
            if (Utils.Rand(3) == 0)
            {
                target.ChangeSensitivity(1);
            }
            //(Increase libido)
            if (Utils.Rand(3) == 0)
            {
                target.ChangeLibido(1);
            }
            //MOD: speed now has a common roll.
            if (Utils.Rand(3) == 0)
            {
                //(If speed<70, increases speed)
                if (target.relativeSpeed < 70)
                {
                    target.ChangeSpeed(1.5);
                }
                //(If speed>80, decreases speed down to minimum of 80)
                else if (target.relativeSpeed > 80)
                {
                    target.ChangeSpeed(-1.5);
                }
            }

            //(increase toughness to 60)
            if (Utils.Rand(3) == 0 && target.relativeToughness < 60)
            {
                target.ChangeToughness(1);
            }
            //(decrease strength to 70)
            if (target.relativeStrength > 70 && Utils.Rand(3) == 0)
            {
                target.ChangeStrength(-1);
            }


            //this will handle the edge case where the change count starts out as 0.
            if (remainingChanges <= 0)
            {
                return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
            }

            //****************
            //Sexual Changes
            //****************
            //Increase venom recharge
            if (target.tail.type == TailType.SPIDER_SPINNERET && target.tail.regenRate < target.tail.maxRegen)
            {
                target.tail.UpdateResources(regenRateDelta: 5);

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //(tightens v****a to 1, increases lust/libido)
            if (target.hasVagina && Utils.Rand(3) == 0)
            {
                //respects any perks that prevent us from dropping too loose (like marae perk).
                //shrink largest if possible. if 2 (or more if that happens) and both(all) at min, remove extra one.
                VaginalLooseness minVaginalLooseness = EnumHelper.Max(VaginalLooseness.NORMAL, target.genitals.minVaginalLooseness);
                if (target.genitals.LargestVaginalLooseness() > minVaginalLooseness)
                {
                    foreach (V****a v****a in target.vaginas)
                    {
                        if (v****a.looseness > minVaginalLooseness)
                        {
                            v****a.DecreaseLooseness();
                        }
                    }

                    target.DeltaCreatureStats(lib: 2, lus: 25);

                    if (--remainingChanges <= 0)
                    {
                        return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                    }
                }
                else if (target.vaginas.Count > 1)
                {
                    target.RemoveExtraVaginas();
                }
            }
            AnalLooseness minAnalLooseness = EnumHelper.Max(AnalLooseness.LOOSE, target.genitals.minAnalLooseness);

            //(tightens asshole to 1, increases lust)
            if (target.ass.looseness > minAnalLooseness && Utils.Rand(3) == 0)
            {
                target.ass.DecreaseLooseness();
                target.DeltaCreatureStats(lib: 2, lus: 25);

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //[Requires penises]
            //(Thickens all cocks to a ratio of 1\" thickness per 5.5\"

            //use a handly linq conversion to grab all the cocks that are below this threshold.
            C**k[] toThicken = target.cocks.Where(x => x.girth * 5.5 < x.length).ToArray();

            if (toThicken.Length > 0 && Utils.Rand(4) == 0)
            {
                int amountChanged = toThicken.Sum(x => x.IncreaseThickness(0.1) != 0 ? 1 : 0);

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //[Increase to Breast Size] - up to Large DD
            if (target.genitals.SmallestCupSize() < CupSize.DD_BIG && Utils.Rand(4) == 0)
            {
                target.genitals.SmallestBreast().GrowBreasts();

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //[Increase to Ass Size] - to 11
            if (target.butt.size < 11 && Utils.Rand(4) == 0)
            {
                target.butt.GrowButt();

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //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 (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //Rear body restore
            if (!target.back.isDefault && Utils.Rand(5) == 0)
            {
                BackData oldData = target.back.AsReadOnlyData();
                target.RestoreBack();
                sb.Append(RestoredBackText(target, oldData));
                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //Ovi perk loss
            if (target.womb.canRemoveOviposition && Utils.Rand(5) == 0)
            {
                target.womb.ClearOviposition();
                sb.Append(ClearOvipositionText(target));

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

            //***************
            //Appearance Changes
            //***************
            //(Ears become pointed if not human)
            if (target.ears.type != EarType.HUMAN && target.ears.type != EarType.ELFIN && Utils.Rand(4) == 0)
            {
                EarData oldData = target.ears.AsReadOnlyData();
                target.UpdateEars(EarType.ELFIN);
                sb.Append(UpdateEarsText(target, oldData));

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //(Fur/Scales fall out)
            if (target.body.type != BodyType.HUMANOID && (target.ears.type == EarType.HUMAN || target.ears.type == EarType.ELFIN) && Utils.Rand(4) == 0)
            {
                BodyData oldData = target.body.AsReadOnlyData();
                target.UpdateBody(BodyType.HUMANOID, Tones.PALE);
                sb.Append(UpdateBodyText(target, oldData));

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //(Gain human face)
            if (target.body.type == BodyType.HUMANOID && (target.face.type != FaceType.SPIDER && target.face.type != FaceType.HUMAN) && Utils.Rand(4) == 0)
            {
                FaceData oldData = target.face.AsReadOnlyData();
                target.UpdateFace(FaceType.HUMAN);
                sb.Append(UpdateFaceText(target, oldData));

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //-Remove breast rows over 2.
            if (target.breasts.Count > 2 && Utils.Rand(3) == 0 && !hyperHappy)
            {
                target.RemoveExtraBreastRows();
                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //-Nipples reduction to 1 per tit.
            if (target.genitals.hasQuadNipples && Utils.Rand(4) == 0)
            {
                target.genitals.SetQuadNipples(false);

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //Nipples Turn Black:
            if (!target.genitals.hasBlackNipples && Utils.Rand(6) == 0)
            {
                target.genitals.SetBlackNipples(true);

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //eyes!
            if (target.body.type == BodyType.HUMANOID && target.eyes.type != EyeType.SPIDER && Utils.Rand(4) == 0)
            {
                target.IncreaseIntelligence(5);
                EyeData oldData = target.eyes.AsReadOnlyData();
                target.UpdateEyes(EyeType.SPIDER);
                sb.Append(UpdateEyesText(target, oldData));

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //(Gain spider fangs)
            if (target.face.type == FaceType.HUMAN && target.body.type == BodyType.HUMANOID && Utils.Rand(4) == 0)
            {
                FaceData oldData = target.face.AsReadOnlyData();
                target.UpdateFace(FaceType.SPIDER);
                sb.Append(UpdateFaceText(target, oldData));

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //(Arms to carapace-covered arms)
            if (target.arms.type != ArmType.SPIDER && Utils.Rand(4) == 0)
            {
                ArmData oldData = target.arms.AsReadOnlyData();
                target.UpdateArms(ArmType.SPIDER);
                sb.Append(UpdateArmsText(target, oldData));

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            if (Utils.Rand(4) == 0 && target.lowerBody.type != LowerBodyType.DRIDER && target.lowerBody.type != LowerBodyType.CHITINOUS_SPIDER)
            {
                target.RestoreLowerBody();
            }
            //Drider butt
            if (isDrider && target.tail.type == TailType.SPIDER_SPINNERET && target.tail.ovipositor.type != OvipositorType.SPIDER && target.lowerBody.type == LowerBodyType.DRIDER &&
                Utils.Rand(3) == 0 && (target.hasVagina || Utils.Rand(2) == 0))
            {
                //V1 - Egg Count
                //V2 - Fertilized Count
                target.tail.GrantOvipositor();
                //Opens up drider ovipositor scenes from available mobs. The character begins producing unfertilized eggs in their arachnid abdomen. Egg buildup raises minimum lust and eventually lowers speed until the target has gotten rid of them. This perk may only be used with the drider lower body, so your scenes should reflect that.
                //Any PC can get an Ovipositor perk, but it will be much rarer for characters without vaginas.
                //Eggs are unfertilized by default, but can be fertilized:
                //-female/herm characters can fertilize them by taking in s***n; successfully passing a pregnancy check will convert one level ofunfertilized eggs to fertilized, even if the PC is already pregnant.
                //-male/herm characters will have a sex dream if they reach stage three of unfertilized eggs; this will represent their bee/drider parts drawing their own s***n from their body to fertilize the eggs, and is accompanied by a nocturnal emission.
                //-unsexed characters cannot currently fertilize their eggs.
                //Even while unfertilized, eggs can be deposited inside NPCs - obviously, unfertilized eggs will never hatch and cannot lead to any egg-birth scenes that may be written later.
                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //(Normal Biped Legs -> Carapace-Clad Legs)
            if (((isDrider && target.lowerBody.type != LowerBodyType.DRIDER && target.lowerBody.type != LowerBodyType.CHITINOUS_SPIDER) || (!isDrider && target.lowerBody.type != LowerBodyType.CHITINOUS_SPIDER)) && target.lowerBody.isBiped && Utils.Rand(4) == 0)
            {
                LowerBodyData oldData = target.lowerBody.AsReadOnlyData();
                target.UpdateLowerBody(LowerBodyType.CHITINOUS_SPIDER);
                sb.Append(UpdateLowerBodyText(target, oldData));

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //(Tail becomes spider abdomen GRANT WEB ATTACK)
            if (target.tail.type != TailType.SPIDER_SPINNERET && (target.lowerBody.type == LowerBodyType.CHITINOUS_SPIDER || target.lowerBody.type == LowerBodyType.DRIDER) && target.arms.type == ArmType.SPIDER && Utils.Rand(4) == 0)
            {
                //(Pre-existing tails)
                //(No tail)
                TailData oldData = target.tail.AsReadOnlyData();
                target.UpdateTail(TailType.SPIDER_SPINNERET);
                sb.Append(UpdateTailText(target, oldData));

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            //(Drider Item Only: Carapace-Clad Legs to Drider Legs)
            if (isDrider && target.lowerBody.type == LowerBodyType.CHITINOUS_SPIDER && Utils.Rand(4) == 0 && target.tail.type == TailType.SPIDER_SPINNERET)
            {
                LowerBodyData oldData = target.lowerBody.AsReadOnlyData();
                target.UpdateLowerBody(LowerBodyType.DRIDER);
                sb.Append(UpdateLowerBodyText(target, oldData));

                if (--remainingChanges <= 0)
                {
                    return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
                }
            }
            // Remove gills
            if (Utils.Rand(4) == 0 && !target.gills.isDefault)
            {
                target.RestoreGills();
            }

            if (remainingChanges == changeCount && target is CombatCreature fatigueCheck)
            {
                fatigueCheck.RecoverFatigue(33);
            }


            //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(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges));
        }