private void nailSkinButton_Click(object sender, EventArgs e) { Option selectedOption = this.optionsBox.SelectedItem as Option; foreach (BodyMesh bMesh in selectedOption.BodyMeshes) { switch (bMesh.MeshType) { case BodyMeshType.Torso: case BodyMeshType.FingerNail: case BodyMeshType.ToeNail: SkinCustomizer skinCustomizer = new SkinCustomizer(bMesh, currentModelType); skinCustomizer.ShowDialog(); bMesh.TanTexture = skinCustomizer.TanTexture; bMesh.SkinTextures.Clear(); foreach (KeyValuePair <String, String> textureSlots in skinCustomizer.SkinTextures) { SkinTexture newSkinTexture = new SkinTexture(); newSkinTexture.SkinSlot = textureSlots.Key; newSkinTexture.Filename = textureSlots.Value; bMesh.SkinTextures.Add(newSkinTexture); } break; } } }
public static string AsString(this SkinTexture skinTexture, bool singularFormat = false) { if (!singularFormat) { switch (skinTexture) { case SkinTexture.SEXY: return("sexy"); case SkinTexture.ROUGH: return("rough"); case SkinTexture.FRECKLED: return("freckled"); case SkinTexture.THICK: return("thick"); case SkinTexture.SMOOTH: return("smooth"); case SkinTexture.SHINY: return("shiny"); case SkinTexture.SOFT: return("soft"); case SkinTexture.NONDESCRIPT: default: return(""); } } else { switch (skinTexture) { case SkinTexture.SEXY: return("a sexy"); case SkinTexture.ROUGH: return("a rough"); case SkinTexture.FRECKLED: return("a freckled"); case SkinTexture.THICK: return("a thick"); case SkinTexture.SMOOTH: return("a smooth"); case SkinTexture.SHINY: return("a shiny"); case SkinTexture.SOFT: return("a soft"); case SkinTexture.NONDESCRIPT: default: return(""); } } }
public static string AsAbbreviatedString(this SkinTexture skinTexture) { switch (skinTexture) { case SkinTexture.SEXY: return("sxy"); case SkinTexture.ROUGH: return("rgh"); case SkinTexture.FRECKLED: return("frkld"); case SkinTexture.THICK: return("thk"); case SkinTexture.SMOOTH: return("smth"); case SkinTexture.SHINY: return("shny"); case SkinTexture.SOFT: return("sft"); case SkinTexture.NONDESCRIPT: default: return(""); } }
public BodyLotionBase(SkinTexture texture) { targetTexture = texture; }
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 }, 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 if (target.relativeSensitivity > 25 && Utils.Rand(3) < 2) { target.ChangeSensitivity((-1 - Utils.Rand(3))); } //Increase strength 1-2 points (Up to 50) (60 for tiger) if (((target.relativeStrength < 60 && isTigerShark) || target.relativeStrength < 50) && Utils.Rand(3) == 0) { target.ChangeStrength(1 + Utils.Rand(2)); } //Increase Speed 1-3 points (Up to 75) (100 for tigers) if (((target.relativeSpeed < 100 && isTigerShark) || target.relativeSpeed < 75) && Utils.Rand(3) == 0) { target.ChangeSpeed(1 + Utils.Rand(3)); } //Reduce sensitivity 1-3 Points (Down to 25 points) //Increase Libido 2-4 points (Up to 75 points) (100 for tigers) if (((target.relativeLibido < 100 && isTigerShark) || target.relativeLibido < 75) && Utils.Rand(3) == 0) { target.ChangeLibido((1 + Utils.Rand(3))); } //Decrease intellect 1-3 points (Down to 40 points) if (target.relativeIntelligence > 40 && Utils.Rand(3) == 0) { target.ChangeIntelligence(-(1 + Utils.Rand(3))); } //Smexual stuff! //-TIGGERSHARK ONLY: Grow a c**t (guaranteed if no gender) if (isTigerShark && (target.gender == 0 || (!target.hasVagina && Utils.Rand(3) == 0))) { if (--remainingChanges <= 0) { return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges)); } //(balls) //(dick) //(neither) target.genitals.AddVagina(); target.ChangeSensitivity(10); } //WANG GROWTH - TIGGERSHARK ONLY if (isTigerShark && (!target.hasCock) && Utils.Rand(3) == 0) { //Genderless: //Female: if (target.balls.count == 0) { target.balls.GrowBalls(); } target.genitals.AddCock(CockType.defaultValue, 7, 1.4); target.DeltaCreatureStats(lib: 4, sens: 5, lus: 20); if (--remainingChanges <= 0) { return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges)); } } //(Requires the target having two testicles) if (isTigerShark && (target.balls.count == 0 || target.balls.count == 2) && target.hasCock && Utils.Rand(3) == 0) { if (target.balls.count == 2) { target.balls.AddBalls(2); } else if (target.balls.count == 0) { target.balls.GrowBalls(); } target.DeltaCreatureStats(lib: 2, sens: 3, lus: 10); if (--remainingChanges <= 0) { return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges)); } } //-Remove extra breast rows if (target.breasts.Count > 1 && Utils.Rand(3) == 0 && !hyperHappy) { target.RemoveExtraBreastRows(); } //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(); sb.Append(ClearOvipositionText(target)); if (--remainingChanges <= 0) { return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges)); } } //Transformations: //Mouth TF if (target.face.type != FaceType.SHARK && Utils.Rand(3) == 0) { FaceData oldData = target.face.AsReadOnlyData(); target.UpdateFace(FaceType.SHARK); sb.Append(UpdateFaceText(target, oldData)); if (--remainingChanges <= 0) { return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges)); } } //Remove odd eyes if (Utils.Rand(5) == 0 && target.eyes.type != EyeType.HUMAN) { EyeData oldData = target.eyes.AsReadOnlyData(); target.RestoreEyes(); sb.Append(RestoredEyesText(target, oldData)); if (--remainingChanges <= 0) { return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges)); } } //Tail TF if (target.tail.type != TailType.SHARK && Utils.Rand(3) == 0) { TailData oldData = target.tail.AsReadOnlyData(); target.UpdateTail(TailType.SHARK); sb.Append(UpdateTailText(target, oldData)); if (--remainingChanges <= 0) { return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges)); } } //Gills TF if (target.gills.type != GillType.FISH && target.tail.type == TailType.SHARK && target.face.type == FaceType.SHARK && Utils.Rand(3) == 0) { GillData oldData = target.gills.AsReadOnlyData(); target.UpdateGills(GillType.FISH); sb.Append(UpdateGillsText(target, oldData)); if (--remainingChanges <= 0) { return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges)); } } //Hair if (target.hair.hairColor != HairFurColors.SILVER && Utils.Rand(4) == 0) { target.hair.SetHairColor(HairFurColors.SILVER); if (--remainingChanges <= 0) { return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges)); } } //Skin //MOD NOTE: F**K. A TWO TONED SKIN TONE. F**K F**K F**K. //MOD NOTE (continued): tigershark skin tone is hacked in. it's a hack. it's an ugly as f**k hack and i need a shower now. but it'll work. i really, really, really //dont want to add a new body type for tigersharks, and i am not adding a fur color equivalent for tones for literally just tigersharks. if (((target.body.primarySkin.tone != Tones.GRAY && target.body.primarySkin.tone != Tones.TIGERSHARK) || target.body.type != BodyType.HUMANOID) && Utils.Rand(7) == 0) { Tones targetTone = isTigerShark ? Tones.TIGERSHARK : Tones.GRAY; SkinTexture targetTexture = SkinTexture.ROUGH; //getGame().rathazul.addMixologyXP(20); BodyData oldData = target.body.AsReadOnlyData(); target.UpdateBody(BodyType.HUMANOID, targetTone, targetTexture); sb.Append(UpdateBodyText(target, oldData)); if (--remainingChanges <= 0) { return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges)); } } //FINZ R WINGS if ((target.wings.type != WingType.NONE || target.back.type != BackType.SHARK_FIN) && Utils.Rand(3) == 0) { target.UpdateBack(BackType.SHARK_FIN); WingData oldData = target.wings.AsReadOnlyData(); target.RestoreWings(); sb.Append(RestoredWingsText(target, oldData)); if (--remainingChanges <= 0) { return(ApplyChangesAndReturn(target, sb, changeCount - remainingChanges)); } } //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)); }