use of com.lilithsthrone.game.character.race.RacialBody in project liliths-throne-public by Innoxia.
the class CharacterUtils method generateBody.
public static Body generateBody(Gender startingGender, GameCharacter mother, GameCharacter father) {
RacialBody startingBodyType = RacialBody.HUMAN;
RacialBody motherBody = RacialBody.valueOfRace(mother.getSubspecies().getOffspringSubspecies().getRace());
RacialBody fatherBody = RacialBody.valueOfRace(father.getSubspecies().getOffspringSubspecies().getRace());
Subspecies raceTakesAfter = mother.getSubspecies();
RaceStage stage = RaceStage.HUMAN;
boolean takesAfterMother = true;
boolean raceFromMother = true;
boolean feminineGender = startingGender.isFeminine();
NPC blankNPC = Main.game.getGenericAndrogynousNPC();
GameCharacter parentTakesAfter = mother;
// Core body type is random:
if (Math.random() <= 0.5) {
startingBodyType = motherBody;
stage = mother.getRaceStage();
} else {
startingBodyType = fatherBody;
stage = father.getRaceStage();
raceTakesAfter = father.getSubspecies();
raceFromMother = false;
}
switch(startingGender.isFeminine() ? Main.getProperties().subspeciesFeminineFurryPreferencesMap.get(raceTakesAfter) : Main.getProperties().subspeciesMasculineFurryPreferencesMap.get(raceTakesAfter)) {
case HUMAN:
stage = RaceStage.HUMAN;
break;
case MINIMUM:
if (stage != RaceStage.HUMAN || stage != RaceStage.PARTIAL) {
stage = RaceStage.PARTIAL;
}
break;
case REDUCED:
if (stage != RaceStage.HUMAN || stage != RaceStage.PARTIAL || stage != RaceStage.LESSER) {
stage = RaceStage.LESSER;
}
break;
case NORMAL:
break;
case MAXIMUM:
stage = RaceStage.GREATER;
break;
}
Body body = generateBody(startingGender, startingBodyType, stage);
if (mother.getBodyMaterial() == BodyMaterial.SLIME) {
body.setBodyMaterial(BodyMaterial.SLIME);
}
// Takes other features from the parent closest to their femininity:
if (Math.abs(mother.getFemininityValue() - body.getFemininity()) > Math.abs(father.getFemininityValue() - body.getFemininity())) {
takesAfterMother = false;
parentTakesAfter = father;
}
float takesAfterMotherChance = takesAfterMother ? 0.75f : 0.25f;
List<BodyCoveringType> typesToInfluence = new ArrayList<>();
// Skin & fur colours:
for (BodyPartInterface bp : body.getAllBodyParts()) {
if (bp.getType().getBodyCoveringType(body) != null && bp.getType().getBodyCoveringType(body).getRace() != null && !(bp instanceof Eye)) {
typesToInfluence.add(bp.getType().getBodyCoveringType(body));
}
}
typesToInfluence.add(BodyCoveringType.ANUS);
typesToInfluence.add(BodyCoveringType.NIPPLES);
typesToInfluence.add(BodyCoveringType.MOUTH);
typesToInfluence.add(BodyCoveringType.TONGUE);
if (raceFromMother) {
typesToInfluence = setCoveringColours(body, mother, typesToInfluence);
setCoveringColours(body, father, typesToInfluence);
} else {
typesToInfluence = setCoveringColours(body, father, typesToInfluence);
setCoveringColours(body, mother, typesToInfluence);
}
body.updateCoverings(false, false, true, false);
// Iris colour:
if (Math.random() >= 0.9f) {
if (Math.random() >= takesAfterMotherChance) {
body.getCoverings().put(body.getEye().getType().getBodyCoveringType(body), new Covering(body.getEye().getType().getBodyCoveringType(body), mother.getCovering(mother.getEyeType().getBodyCoveringType(mother)).getPattern(), mother.getCovering(mother.getEyeType().getBodyCoveringType(mother)).getPrimaryColour(), mother.getCovering(mother.getEyeType().getBodyCoveringType(mother)).isPrimaryGlowing(), mother.getCovering(mother.getEyeType().getBodyCoveringType(mother)).getPrimaryColour(), mother.getCovering(mother.getEyeType().getBodyCoveringType(mother)).isPrimaryGlowing()));
} else {
body.getCoverings().put(body.getEye().getType().getBodyCoveringType(body), new Covering(body.getEye().getType().getBodyCoveringType(body), father.getCovering(father.getEyeType().getBodyCoveringType(father)).getPattern(), father.getCovering(father.getEyeType().getBodyCoveringType(father)).getPrimaryColour(), father.getCovering(father.getEyeType().getBodyCoveringType(father)).isPrimaryGlowing(), father.getCovering(father.getEyeType().getBodyCoveringType(father)).getPrimaryColour(), father.getCovering(father.getEyeType().getBodyCoveringType(father)).isPrimaryGlowing()));
}
}
// Pupil colour:
if (Math.random() >= 0.4f) {
if (Math.random() >= takesAfterMotherChance) {
body.getCoverings().put(BodyCoveringType.EYE_PUPILS, new Covering(body.getEye().getType().getBodyCoveringType(body), mother.getCovering(BodyCoveringType.EYE_PUPILS).getPattern(), mother.getCovering(BodyCoveringType.EYE_PUPILS).getPrimaryColour(), mother.getCovering(BodyCoveringType.EYE_PUPILS).isPrimaryGlowing(), mother.getCovering(BodyCoveringType.EYE_PUPILS).getPrimaryColour(), mother.getCovering(BodyCoveringType.EYE_PUPILS).isPrimaryGlowing()));
} else {
body.getCoverings().put(BodyCoveringType.EYE_PUPILS, new Covering(body.getEye().getType().getBodyCoveringType(body), father.getCovering(BodyCoveringType.EYE_PUPILS).getPattern(), father.getCovering(BodyCoveringType.EYE_PUPILS).getPrimaryColour(), father.getCovering(BodyCoveringType.EYE_PUPILS).isPrimaryGlowing(), father.getCovering(BodyCoveringType.EYE_PUPILS).getPrimaryColour(), father.getCovering(BodyCoveringType.EYE_PUPILS).isPrimaryGlowing()));
}
}
// Body core:
// Height:
body.setHeight(getSizeFromGenetics(body.getHeightValue(), (body.isFeminine() ? mother.isFeminine() : !mother.isFeminine()), mother.getHeightValue(), (body.isFeminine() ? father.isFeminine() : !father.isFeminine()), father.getHeightValue()));
// Femininity:
switch(startingGender.getType()) {
case FEMININE:
if (takesAfterMother) {
if (mother.getFemininityValue() >= Femininity.FEMININE.getMinimumFemininity()) {
body.setFemininity(mother.getFemininityValue());
}
} else {
if (father.getFemininityValue() >= Femininity.FEMININE.getMinimumFemininity()) {
body.setFemininity(father.getFemininityValue());
}
}
break;
case NEUTRAL:
if (takesAfterMother) {
if (mother.getFemininity() == Femininity.ANDROGYNOUS) {
body.setFemininity(mother.getFemininityValue());
}
} else {
if (father.getFemininity() == Femininity.ANDROGYNOUS) {
body.setFemininity(father.getFemininityValue());
}
}
break;
case MASCULINE:
if (takesAfterMother) {
if (mother.getFemininityValue() < Femininity.ANDROGYNOUS.getMinimumFemininity()) {
body.setFemininity(mother.getFemininityValue());
}
} else {
if (father.getFemininityValue() < Femininity.ANDROGYNOUS.getMinimumFemininity()) {
body.setFemininity(father.getFemininityValue());
}
}
break;
}
// Body size:
int minimumSize = Math.min(mother.getBodySizeValue(), father.getBodySizeValue()) - Util.random.nextInt(5);
int maximumSize = Math.min(mother.getBodySizeValue(), father.getBodySizeValue()) + Util.random.nextInt(5);
if (takesAfterMother) {
minimumSize = Math.max(minimumSize, (feminineGender ? motherBody.getFemaleBodySize() - 30 : motherBody.getMaleBodySize() - 30));
maximumSize = Math.max(maximumSize, (feminineGender ? motherBody.getFemaleBodySize() + 30 : motherBody.getMaleBodySize() + 30));
} else {
minimumSize = Math.max(minimumSize, (feminineGender ? fatherBody.getFemaleBodySize() - 30 : fatherBody.getMaleBodySize() - 30));
maximumSize = Math.max(maximumSize, (feminineGender ? fatherBody.getFemaleBodySize() + 30 : fatherBody.getMaleBodySize() + 30));
}
int variance = (maximumSize == minimumSize ? 0 : Util.random.nextInt(maximumSize - minimumSize));
body.setBodySize(minimumSize + variance);
// Muscle:
int minimumMuscle = Math.min(mother.getMuscleValue(), father.getMuscleValue()) - Util.random.nextInt(5);
int maximumMuscle = Math.min(mother.getMuscleValue(), father.getMuscleValue()) + Util.random.nextInt(5);
if (takesAfterMother) {
minimumMuscle = Math.max(minimumMuscle, (feminineGender ? motherBody.getFemaleMuscle() - 30 : motherBody.getMaleMuscle() - 30));
maximumMuscle = Math.max(maximumMuscle, (feminineGender ? motherBody.getFemaleMuscle() + 30 : motherBody.getMaleMuscle() + 30));
} else {
minimumMuscle = Math.max(minimumMuscle, (feminineGender ? fatherBody.getFemaleMuscle() - 30 : fatherBody.getMaleMuscle() - 30));
maximumMuscle = Math.max(maximumMuscle, (feminineGender ? fatherBody.getFemaleMuscle() + 30 : fatherBody.getMaleMuscle() + 30));
}
variance = (maximumMuscle == minimumMuscle ? 0 : Util.random.nextInt(maximumMuscle - minimumMuscle));
body.setMuscle(minimumMuscle + variance);
// Body parts:
boolean inheritsFromMotherFemininity = mother.isFeminine() == body.isFeminine();
boolean inheritsFromFatherFemininity = father.isFeminine() == body.isFeminine();
// Arm:
if (Math.random() > 0.75) {
body.getArm().setArmRows(blankNPC, parentTakesAfter.getArmRows());
}
// Ass:
// Ass size:
body.getAss().setAssSize(blankNPC, getSizeFromGenetics(body.getAss().getAssSize().getValue(), inheritsFromMotherFemininity, mother.getAssSize().getValue(), inheritsFromFatherFemininity, father.getAssSize().getValue()));
// Hip size:
body.getAss().setHipSize(blankNPC, getSizeFromGenetics(body.getAss().getHipSize().getValue(), inheritsFromMotherFemininity, mother.getHipSize().getValue(), inheritsFromFatherFemininity, father.getHipSize().getValue()));
// Breasts:
boolean inheritsFromMotherBreasts = mother.hasBreasts();
boolean inheritsFromFatherBreasts = father.hasBreasts();
if (body.getBreast().getRawSizeValue() > 0) {
// Breast shape:
if (Math.random() >= 0.8f) {
if (inheritsFromMotherBreasts && inheritsFromFatherBreasts) {
if (Math.random() >= takesAfterMotherChance) {
body.getBreast().setShape(blankNPC, mother.getBreastShape());
} else {
body.getBreast().setShape(blankNPC, father.getBreastShape());
}
} else if (inheritsFromMotherBreasts) {
body.getBreast().setShape(blankNPC, mother.getBreastShape());
} else if (inheritsFromFatherBreasts) {
body.getBreast().setShape(blankNPC, father.getBreastShape());
}
}
// Breast size:
body.getBreast().setSize(blankNPC, getSizeFromGenetics(body.getBreast().getSize().getMeasurement(), inheritsFromMotherBreasts, mother.getBreastSize().getMeasurement(), inheritsFromFatherBreasts, father.getBreastSize().getMeasurement()));
// Breast rows:
if (Math.random() >= 0.75) {
if (Math.random() >= takesAfterMotherChance) {
body.getBreast().setRows(blankNPC, mother.getBreastRows());
} else {
body.getBreast().setRows(blankNPC, father.getBreastRows());
}
}
// Modifiers:
for (OrificeModifier om : OrificeModifier.values()) {
if (Math.random() >= 0.5) {
if (inheritsFromMotherBreasts && inheritsFromFatherBreasts) {
if (Math.random() >= takesAfterMotherChance) {
if (mother.hasNippleOrificeModifier(om)) {
body.getBreast().getNipples().getOrificeNipples().addOrificeModifier(blankNPC, om);
}
} else {
if (father.hasNippleOrificeModifier(om)) {
body.getBreast().getNipples().getOrificeNipples().addOrificeModifier(blankNPC, om);
}
}
} else if (inheritsFromMotherBreasts) {
if (mother.hasNippleOrificeModifier(om)) {
body.getBreast().getNipples().getOrificeNipples().addOrificeModifier(blankNPC, om);
}
} else if (inheritsFromFatherBreasts) {
if (father.hasNippleOrificeModifier(om)) {
body.getBreast().getNipples().getOrificeNipples().addOrificeModifier(blankNPC, om);
}
}
}
}
}
// Nipple count:
if (Math.random() > 0.75f) {
if (Math.random() >= takesAfterMotherChance) {
body.getBreast().setNippleCountPerBreast(blankNPC, mother.getNippleCountPerBreast());
} else {
body.getBreast().setNippleCountPerBreast(blankNPC, father.getNippleCountPerBreast());
}
}
// Nipple shape:
if (Math.random() >= 0.75f) {
if (Math.random() >= takesAfterMotherChance) {
body.getBreast().getNipples().setNippleShape(blankNPC, mother.getNippleShape());
} else {
body.getBreast().getNipples().setNippleShape(blankNPC, father.getNippleShape());
}
}
// Areolae shape:
if (Math.random() >= 0.75f) {
if (Math.random() >= takesAfterMotherChance) {
body.getBreast().getNipples().setAreolaeShape(blankNPC, mother.getAreolaeShape());
} else {
body.getBreast().getNipples().setAreolaeShape(blankNPC, father.getAreolaeShape());
}
}
// Nipple size:
body.getBreast().getNipples().setNippleSize(blankNPC, getSizeFromGenetics(body.getBreast().getNipples().getNippleSizeValue(), inheritsFromMotherBreasts, mother.getNippleSize().getValue(), inheritsFromFatherBreasts, father.getNippleSize().getValue()));
// Areolae size:
body.getBreast().getNipples().setAreolaeSize(blankNPC, getSizeFromGenetics(body.getBreast().getNipples().getAreolaeSizeValue(), inheritsFromMotherBreasts, mother.getAreolaeSize().getValue(), inheritsFromFatherBreasts, father.getAreolaeSize().getValue()));
// Face:
// Lip size:
body.getFace().getMouth().setLipSize(blankNPC, getSizeFromGenetics(body.getFace().getMouth().getLipSizeValue(), inheritsFromMotherFemininity, mother.getLipSizeValue(), inheritsFromFatherFemininity, father.getLipSizeValue()));
// Mouth modifiers:
for (OrificeModifier om : OrificeModifier.values()) {
if (Math.random() >= 0.5) {
if (Math.random() >= takesAfterMotherChance) {
if (mother.hasFaceOrificeModifier(om)) {
body.getFace().getMouth().getOrificeMouth().addOrificeModifier(blankNPC, om);
}
} else {
if (father.hasFaceOrificeModifier(om)) {
body.getFace().getMouth().getOrificeMouth().addOrificeModifier(blankNPC, om);
}
}
}
}
// Tongue modifiers:
for (TongueModifier tm : TongueModifier.values()) {
if (Math.random() >= 0.5) {
if (Math.random() >= takesAfterMotherChance) {
if (mother.hasTongueModifier(tm)) {
body.getFace().getTongue().addTongueModifier(blankNPC, tm);
}
} else {
if (father.hasTongueModifier(tm)) {
body.getFace().getTongue().addTongueModifier(blankNPC, tm);
}
}
}
}
// Eye pairs:
if (Math.random() >= 0.75) {
if (Math.random() >= takesAfterMotherChance) {
body.getEye().setEyePairs(blankNPC, mother.getEyePairs());
} else {
body.getEye().setEyePairs(blankNPC, father.getEyePairs());
}
}
// Iris shape:
if (Math.random() >= 0.75) {
if (Math.random() >= takesAfterMotherChance) {
body.getEye().setIrisShape(blankNPC, mother.getIrisShape());
} else {
body.getEye().setIrisShape(blankNPC, father.getIrisShape());
}
}
// Pupil shape:
if (Math.random() >= 0.75) {
if (Math.random() >= takesAfterMotherChance) {
body.getEye().setPupilShape(blankNPC, mother.getPupilShape());
} else {
body.getEye().setPupilShape(blankNPC, father.getPupilShape());
}
}
// Horn rows:
if (Math.random() >= 0.75) {
if (Math.random() >= takesAfterMotherChance) {
body.getHorn().setHornRows(blankNPC, mother.getHornRows());
} else {
body.getHorn().setHornRows(blankNPC, father.getHornRows());
}
}
// Penis:
boolean inheritsFromMotherPenis = mother.hasPenis();
boolean inheritsFromFatherPenis = father.hasPenis();
if (body.getPenis().getType() != PenisType.NONE) {
// Penis size:
body.getPenis().setPenisSize(blankNPC, getSizeFromGenetics(body.getPenis().getRawSizeValue(), inheritsFromMotherPenis, mother.getPenisRawSizeValue(), inheritsFromFatherPenis, father.getPenisRawSizeValue()));
// Penis modifiers:
for (PenisModifier pm : PenisModifier.values()) {
if (Math.random() >= 0.5) {
if (inheritsFromMotherPenis && inheritsFromFatherPenis) {
if (Math.random() >= takesAfterMotherChance) {
if (mother.hasPenisModifier(pm)) {
body.getPenis().addPenisModifier(blankNPC, pm);
}
} else {
if (father.hasPenisModifier(pm)) {
body.getPenis().addPenisModifier(blankNPC, pm);
}
}
} else if (inheritsFromMotherPenis) {
if (mother.hasPenisModifier(pm)) {
body.getPenis().addPenisModifier(blankNPC, pm);
}
} else if (inheritsFromFatherPenis) {
if (father.hasPenisModifier(pm)) {
body.getPenis().addPenisModifier(blankNPC, pm);
}
}
}
}
// Urethra modifiers:
for (OrificeModifier om : OrificeModifier.values()) {
if (Math.random() >= 0.5) {
if (inheritsFromMotherPenis && inheritsFromFatherPenis) {
if (Math.random() >= takesAfterMotherChance) {
if (mother.hasUrethraOrificeModifier(om)) {
body.getPenis().getOrificeUrethra().addOrificeModifier(blankNPC, om);
}
} else {
if (father.hasUrethraOrificeModifier(om)) {
body.getPenis().getOrificeUrethra().addOrificeModifier(blankNPC, om);
}
}
} else if (inheritsFromMotherPenis) {
if (mother.hasUrethraOrificeModifier(om)) {
body.getPenis().getOrificeUrethra().addOrificeModifier(blankNPC, om);
}
} else if (inheritsFromFatherPenis) {
if (father.hasUrethraOrificeModifier(om)) {
body.getPenis().getOrificeUrethra().addOrificeModifier(blankNPC, om);
}
}
}
}
// Testicles:
// Testicle size:
body.getPenis().getTesticle().setTesticleSize(blankNPC, getSizeFromGenetics(body.getPenis().getTesticle().getTesticleSize().getValue(), inheritsFromMotherPenis, mother.getTesticleSize().getValue(), inheritsFromFatherPenis, father.getTesticleSize().getValue()));
// Testicle count:
if (Math.random() >= 0.75) {
if (inheritsFromMotherPenis && inheritsFromFatherPenis) {
if (Math.random() >= takesAfterMotherChance) {
body.getPenis().getTesticle().setTesticleCount(blankNPC, mother.getTesticleCount());
} else {
body.getPenis().getTesticle().setTesticleCount(blankNPC, father.getTesticleCount());
}
} else if (inheritsFromMotherPenis) {
body.getPenis().getTesticle().setTesticleCount(blankNPC, mother.getTesticleCount());
} else if (inheritsFromFatherPenis) {
body.getPenis().getTesticle().setTesticleCount(blankNPC, father.getTesticleCount());
}
}
// Internal testicles:
if (Math.random() >= 0.75) {
if (inheritsFromMotherPenis && inheritsFromFatherPenis) {
if (Math.random() >= takesAfterMotherChance) {
if (mother.isInternalTesticles()) {
body.getPenis().getTesticle().setInternal(blankNPC, true);
}
} else {
if (father.isInternalTesticles()) {
body.getPenis().getTesticle().setInternal(blankNPC, true);
}
}
} else if (inheritsFromMotherPenis) {
if (mother.isInternalTesticles()) {
body.getPenis().getTesticle().setInternal(blankNPC, true);
}
} else if (inheritsFromFatherPenis) {
if (father.isInternalTesticles()) {
body.getPenis().getTesticle().setInternal(blankNPC, true);
}
}
}
// Cum Production:
body.getPenis().getTesticle().setCumProduction(blankNPC, getSizeFromGenetics(body.getPenis().getTesticle().getRawCumProductionValue(), inheritsFromMotherPenis, mother.getPenisRawCumProductionValue(), inheritsFromFatherPenis, father.getPenisRawCumProductionValue()));
}
// Tail:
if (Math.random() > 0.75) {
if (Math.random() >= takesAfterMotherChance) {
body.getTail().setTailCount(blankNPC, mother.getTailCount());
} else {
body.getTail().setTailCount(blankNPC, father.getTailCount());
}
}
// Vagina:
boolean inheritsFromMotherVagina = mother.hasVagina();
boolean inheritsFromFatherVagina = father.hasVagina();
if (body.getVagina().getType() != VaginaType.NONE) {
// Clitoris size:
body.getVagina().setClitorisSize(blankNPC, getSizeFromGenetics(body.getVagina().getRawClitorisSizeValue(), inheritsFromMotherVagina, mother.getVaginaRawClitorisSizeValue(), inheritsFromFatherVagina, father.getVaginaRawClitorisSizeValue()));
// Labia size:
body.getVagina().setLabiaSize(blankNPC, getSizeFromGenetics(body.getVagina().getRawLabiaSizeValue(), inheritsFromMotherVagina, mother.getVaginaRawLabiaSizeValue(), inheritsFromFatherVagina, father.getVaginaRawLabiaSizeValue()));
// // Capacity:
// body.getVagina().getOrificeVagina().setCapacity(blankNPC, getSizeFromGenetics(
// (int) body.getVagina().getOrificeVagina().getRawCapacityValue(),
// inheritsFromMotherVagina, (int) mother.getVaginaRawCapacityValue(),
// inheritsFromFatherVagina, (int) father.getVaginaRawCapacityValue()));
// Wetness:
body.getVagina().getOrificeVagina().setWetness(blankNPC, getSizeFromGenetics(body.getVagina().getOrificeVagina().getWetness(blankNPC).getValue(), inheritsFromMotherVagina, mother.getVaginaWetness().getValue(), inheritsFromFatherVagina, father.getVaginaWetness().getValue()));
// Modifiers:
for (OrificeModifier om : OrificeModifier.values()) {
if (Math.random() >= 0.5) {
if (inheritsFromMotherVagina && inheritsFromFatherVagina) {
if (Math.random() >= takesAfterMotherChance) {
if (mother.hasVaginaOrificeModifier(om)) {
body.getVagina().getOrificeVagina().addOrificeModifier(blankNPC, om);
}
} else {
if (father.hasVaginaOrificeModifier(om)) {
body.getVagina().getOrificeVagina().addOrificeModifier(blankNPC, om);
}
}
} else if (inheritsFromMotherVagina) {
if (mother.hasVaginaOrificeModifier(om)) {
body.getVagina().getOrificeVagina().addOrificeModifier(blankNPC, om);
}
} else if (inheritsFromFatherVagina) {
if (father.hasVaginaOrificeModifier(om)) {
body.getVagina().getOrificeVagina().addOrificeModifier(blankNPC, om);
}
}
}
}
}
return body;
}
use of com.lilithsthrone.game.character.race.RacialBody in project liliths-throne-public by Innoxia.
the class CharacterUtils method generateBody.
public static Body generateBody(Gender startingGender, RacialBody startingBodyType, Subspecies species, RaceStage stage) {
boolean hasVagina = startingGender.getGenderName().isHasVagina();
boolean hasPenis = startingGender.getGenderName().isHasPenis();
boolean hasBreasts = startingGender.getGenderName().isHasBreasts();
Body body = new Body.BodyBuilder(new Arm((stage.isArmFurry() ? startingBodyType.getArmType() : ArmType.HUMAN), startingBodyType.getArmRows()), new Ass(stage.isAssFurry() ? startingBodyType.getAssType() : AssType.HUMAN, (startingGender.isFeminine() ? startingBodyType.getFemaleAssSize() : startingBodyType.getMaleAssSize()), startingBodyType.getAnusWetness(), startingBodyType.getAnusCapacity(), startingBodyType.getAnusElasticity(), startingBodyType.getAnusPlasticity(), true), new Breast(stage.isBreastFurry() ? startingBodyType.getBreastType() : BreastType.HUMAN, BreastShape.getRandomBreastShape(), (hasBreasts ? startingBodyType.getBreastSize() : startingBodyType.getNoBreastSize()), (startingGender.isFeminine() ? startingBodyType.getFemaleLactationRate() : startingBodyType.getMaleLactationRate()), ((stage.isSkinFurry() && Main.getProperties().multiBreasts == 1) || (stage.isBreastFurry() && Main.getProperties().multiBreasts == 2) ? (startingGender.isFeminine() ? startingBodyType.getBreastCountFemale() : startingBodyType.getBreastCountMale()) : 1), (startingGender.isFeminine() ? startingBodyType.getFemaleNippleSize() : startingBodyType.getMaleNippleSize()), (startingGender.isFeminine() ? startingBodyType.getFemaleNippleShape() : startingBodyType.getMaleNippleShape()), (startingGender.isFeminine() ? startingBodyType.getFemaleAreolaeSize() : startingBodyType.getMaleAreolaeSize()), (stage.isBreastFurry() ? (startingGender.isFeminine() ? startingBodyType.getFemaleNippleCountPerBreast() : startingBodyType.getMaleNippleCountPerBreast()) : 1), (startingGender.isFeminine() ? startingBodyType.getFemaleBreastCapacity() : startingBodyType.getMaleBreastCapacity()), (startingGender.isFeminine() ? startingBodyType.getFemaleBreastElasticity() : startingBodyType.getMaleBreastElasticity()), (startingGender.isFeminine() ? startingBodyType.getFemaleBreastPlasticity() : startingBodyType.getMaleBreastPlasticity()), true), new Face((stage.isFaceFurry() ? startingBodyType.getFaceType() : FaceType.HUMAN), (startingGender.isFeminine() ? startingBodyType.getFemaleLipSize() : startingBodyType.getMaleLipSize())), new Eye(stage.isEyeFurry() ? startingBodyType.getEyeType() : EyeType.HUMAN), new Ear(stage.isEarFurry() ? startingBodyType.getEarType() : EarType.HUMAN), new Hair(stage.isHairFurry() ? startingBodyType.getHairType() : HairType.HUMAN, (startingBodyType.isHairTypeLinkedToFaceType() ? (stage.isFaceFurry() ? (startingGender.isFeminine() ? startingBodyType.getFemaleHairLength() : startingBodyType.getMaleHairLength()) : (startingGender.isFeminine() ? RacialBody.HUMAN.getFemaleHairLength() : RacialBody.HUMAN.getMaleHairLength())) : (startingGender.isFeminine() ? startingBodyType.getFemaleHairLength() : startingBodyType.getMaleHairLength())), HairStyle.getRandomHairStyle((startingGender.isFeminine() ? startingBodyType.getFemaleHairLength() : startingBodyType.getMaleHairLength()))), new Leg(stage.isLegFurry() ? startingBodyType.getLegType() : LegType.HUMAN), new Skin(stage.isSkinFurry() ? startingBodyType.getSkinType() : SkinType.HUMAN), startingBodyType.getBodyMaterial(), startingBodyType.getGenitalArrangement(), (startingGender.isFeminine() ? startingBodyType.getFemaleHeight() : startingBodyType.getMaleHeight()), startingGender.getType() == PronounType.NEUTRAL ? 50 : (startingGender.isFeminine() ? startingBodyType.getFemaleFemininity() : startingBodyType.getMaleFemininity()), (startingGender.isFeminine() ? startingBodyType.getFemaleBodySize() : startingBodyType.getMaleBodySize()), (startingGender.isFeminine() ? startingBodyType.getFemaleMuscle() : startingBodyType.getMaleMuscle())).vagina(hasVagina ? new Vagina(stage.isVaginaFurry() ? startingBodyType.getVaginaType() : VaginaType.HUMAN, LabiaSize.getRandomLabiaSize().getValue(), startingBodyType.getClitSize(), startingBodyType.getVaginaWetness(), startingBodyType.getVaginaCapacity(), startingBodyType.getVaginaElasticity(), startingBodyType.getVaginaPlasticity(), true) : new Vagina(VaginaType.NONE, 0, 0, 0, 0, 3, 3, true)).penis(hasPenis ? new Penis(stage.isPenisFurry() ? startingBodyType.getPenisType() : PenisType.HUMAN, startingBodyType.getPenisSize(), startingBodyType.getPenisGirth(), startingBodyType.getTesticleSize(), startingBodyType.getCumProduction(), startingBodyType.getTesticleQuantity()) : new Penis(PenisType.NONE, 0, 0, 0, 0, 2)).horn(new Horn((stage.isHornFurry() ? startingBodyType.getRandomHornType(false) : HornType.NONE), (startingGender.isFeminine() ? startingBodyType.getFemaleHornLength() : startingBodyType.getMaleHornLength()))).antenna(new Antenna(stage.isAntennaFurry() ? startingBodyType.getAntennaType() : AntennaType.NONE)).tail(new Tail(stage.isTailFurry() ? startingBodyType.getTailType() : TailType.NONE)).wing(new Wing((stage.isWingFurry() ? startingBodyType.getWingType() : WingType.NONE), (startingGender.isFeminine() ? startingBodyType.getFemaleWingSize() : startingBodyType.getMaleWingSize()))).build();
// Pubic hair:
BodyHair hair = BodyHair.getRandomBodyHair();
body.setPubicHair(hair);
body.getFace().setFacialHair(null, hair);
body.getArm().setUnderarmHair(null, hair);
body.getAss().getAnus().setAssHair(null, hair);
if (species != null) {
body.calculateRace();
species.applySpeciesChanges(body);
body.calculateRace();
}
return body;
}
Aggregations