Search in sources :

Example 1 with FluidModifier

use of com.lilithsthrone.game.character.body.valueEnums.FluidModifier in project liliths-throne-public by Innoxia.

the class Body method loadFromXML.

public static Body loadFromXML(StringBuilder log, Element parentElement, Document doc) {
    // **************** Core **************** //
    Element element = (Element) parentElement.getElementsByTagName("bodyCore").item(0);
    int importedFemininity = (Integer.valueOf(element.getAttribute("femininity")));
    CharacterUtils.appendToImportLog(log, "</br>Body: Set femininity: " + Integer.valueOf(element.getAttribute("femininity")));
    int importedHeight = (Integer.valueOf(element.getAttribute("height")));
    CharacterUtils.appendToImportLog(log, "</br>Body: Set height: " + Integer.valueOf(element.getAttribute("height")));
    int importedBodySize = (Integer.valueOf(element.getAttribute("bodySize")));
    CharacterUtils.appendToImportLog(log, "</br>Body: Set body size: " + Integer.valueOf(element.getAttribute("bodySize")));
    int importedMuscle = (Integer.valueOf(element.getAttribute("muscle")));
    CharacterUtils.appendToImportLog(log, "</br>Body: Set muscle: " + Integer.valueOf(element.getAttribute("muscle")));
    // TODO export
    GenitalArrangement importedGenitalArrangement = GenitalArrangement.NORMAL;
    if (element.getAttribute("genitalArrangement") != null && !element.getAttribute("genitalArrangement").isEmpty()) {
        importedGenitalArrangement = GenitalArrangement.valueOf(element.getAttribute("genitalArrangement"));
    }
    BodyMaterial importedBodyMaterial = BodyMaterial.FLESH;
    if (element.getAttribute("bodyMaterial") != null && !element.getAttribute("bodyMaterial").isEmpty()) {
        importedBodyMaterial = BodyMaterial.valueOf(element.getAttribute("bodyMaterial"));
    }
    // **************** Antenna **************** //
    Element antennae = (Element) parentElement.getElementsByTagName("antennae").item(0);
    Antenna importedAntenna = new Antenna(AntennaType.valueOf(antennae.getAttribute("type")));
    CharacterUtils.appendToImportLog(log, "</br></br>Body: Antennae:" + "</br>type: " + importedAntenna.getType());
    importedAntenna.rows = Integer.valueOf(antennae.getAttribute("rows"));
    CharacterUtils.appendToImportLog(log, "</br>rows: " + importedAntenna.getAntennaRows());
    // **************** Arm **************** //
    Element arm = (Element) parentElement.getElementsByTagName("arm").item(0);
    Arm importedArm = new Arm(ArmType.valueOf(arm.getAttribute("type")), Integer.valueOf(arm.getAttribute("rows")));
    CharacterUtils.appendToImportLog(log, "</br></br>Body: Arm:" + "</br>type: " + importedArm.getType());
    CharacterUtils.appendToImportLog(log, "</br>rows: " + importedArm.getArmRows());
    try {
        importedArm.underarmHair = BodyHair.valueOf(arm.getAttribute("underarmHair"));
        CharacterUtils.appendToImportLog(log, "</br>underarm hair: " + importedArm.getUnderarmHair());
    } catch (IllegalArgumentException e) {
        importedArm.underarmHair = BodyHair.ZERO_NONE;
        CharacterUtils.appendToImportLog(log, "</br>underarm hair: OLD_VALUE - Set to NONE");
    }
    // **************** Ass **************** //
    Element ass = (Element) parentElement.getElementsByTagName("ass").item(0);
    Element anus = (Element) parentElement.getElementsByTagName("anus").item(0);
    Ass importedAss = new Ass(AssType.valueOf(ass.getAttribute("type")), Integer.valueOf(ass.getAttribute("assSize")), Integer.valueOf(anus.getAttribute("wetness")), Float.valueOf(anus.getAttribute("capacity")), Integer.valueOf(anus.getAttribute("elasticity")), Integer.valueOf(anus.getAttribute("plasticity")), Boolean.valueOf(anus.getAttribute("virgin")));
    importedAss.hipSize = Integer.valueOf(ass.getAttribute("hipSize"));
    importedAss.anus.orificeAnus.stretchedCapacity = (Float.valueOf(anus.getAttribute("stretchedCapacity")));
    importedAss.anus.bleached = (Boolean.valueOf(anus.getAttribute("bleached")));
    try {
        importedAss.anus.assHair = (BodyHair.valueOf(anus.getAttribute("assHair")));
    } catch (IllegalArgumentException e) {
        importedAss.anus.assHair = BodyHair.ZERO_NONE;
        CharacterUtils.appendToImportLog(log, "</br>ass hair: OLD_VALUE - Set to NONE");
    }
    CharacterUtils.appendToImportLog(log, "</br></br>Body: Ass:" + "</br>type: " + importedAss.getType() + "</br>assSize: " + importedAss.getAssSize() + "</br>hipSize: " + importedAss.getHipSize());
    if (anus != null) {
        CharacterUtils.appendToImportLog(log, "</br></br>Anus:" + "</br>wetness: " + importedAss.anus.orificeAnus.wetness + "</br>elasticity: " + importedAss.anus.orificeAnus.elasticity + "</br>elasticity: " + importedAss.anus.orificeAnus.plasticity + "</br>capacity: " + importedAss.anus.orificeAnus.capacity + "</br>stretchedCapacity: " + importedAss.anus.orificeAnus.stretchedCapacity + "</br>virgin: " + importedAss.anus.orificeAnus.virgin + "</br>bleached: " + importedAss.anus.bleached + "</br>assHair: " + importedAss.anus.assHair + "</br>Modifiers:");
        Element anusModifiers = (Element) anus.getElementsByTagName("anusModifiers").item(0);
        importedAss.anus.orificeAnus.orificeModifiers.clear();
        for (OrificeModifier om : OrificeModifier.values()) {
            if (Boolean.valueOf(anusModifiers.getAttribute(om.toString()))) {
                importedAss.anus.orificeAnus.orificeModifiers.add(om);
                CharacterUtils.appendToImportLog(log, "</br>" + om.toString() + ":true");
            } else {
                CharacterUtils.appendToImportLog(log, "</br>" + om.toString() + ":false");
            }
        }
    }
    // **************** Breasts **************** //
    Element breasts = (Element) parentElement.getElementsByTagName("breasts").item(0);
    Element nipples = (Element) parentElement.getElementsByTagName("nipples").item(0);
    BreastShape breastShape = BreastShape.ROUND;
    try {
        breastShape = BreastShape.valueOf(breasts.getAttribute("shape"));
    } catch (Exception e) {
    }
    int milkStorage = 0;
    try {
        if (!breasts.getAttribute("lactation").isEmpty()) {
            milkStorage = Integer.valueOf(breasts.getAttribute("lactation"));
        } else {
            milkStorage = Integer.valueOf(breasts.getAttribute("milkStorage"));
        }
    } catch (Exception ex) {
    }
    Breast importedBreast = new Breast(BreastType.valueOf(breasts.getAttribute("type")), breastShape, Integer.valueOf(breasts.getAttribute("size")), milkStorage, Integer.valueOf(breasts.getAttribute("rows")), Integer.valueOf(nipples.getAttribute("nippleSize")), NippleShape.valueOf(nipples.getAttribute("nippleShape")), Integer.valueOf(nipples.getAttribute("areolaeSize")), Integer.valueOf(breasts.getAttribute("nippleCountPerBreast")), Float.valueOf(nipples.getAttribute("capacity")), Integer.valueOf(nipples.getAttribute("elasticity")), Integer.valueOf(nipples.getAttribute("plasticity")), Boolean.valueOf(nipples.getAttribute("virgin")));
    try {
        importedBreast.milkStored = Integer.valueOf(breasts.getAttribute("storedMilk"));
        importedBreast.milkRegeneration = Integer.valueOf(breasts.getAttribute("milkRegeneration"));
    } catch (Exception ex) {
    }
    importedBreast.nipples.orificeNipples.stretchedCapacity = (Float.valueOf(nipples.getAttribute("stretchedCapacity")));
    importedBreast.nipples.pierced = (Boolean.valueOf(nipples.getAttribute("pierced")));
    importedBreast.nipples.areolaeShape = (AreolaeShape.valueOf(nipples.getAttribute("areolaeShape")));
    CharacterUtils.appendToImportLog(log, "</br></br>Body: Breasts:" + "</br>type: " + importedBreast.getType() + "</br>size: " + importedBreast.getSize() + "</br>rows: " + importedBreast.getRows() + "</br>lactation: " + importedBreast.getRawMilkStorageValue() + "</br>nippleCountPer: " + importedBreast.getNippleCountPerBreast() + "</br></br>Nipples:" + "</br>elasticity: " + importedBreast.nipples.orificeNipples.getElasticity() + "</br>plasticity: " + importedBreast.nipples.orificeNipples.getPlasticity() + "</br>capacity: " + importedBreast.nipples.orificeNipples.getRawCapacityValue() + "</br>stretchedCapacity: " + importedBreast.nipples.orificeNipples.getStretchedCapacity() + "</br>virgin: " + importedBreast.nipples.orificeNipples.isVirgin() + "</br>pierced: " + importedBreast.nipples.isPierced() + "</br>nippleSize: " + importedBreast.nipples.getNippleSize() + "</br>nippleShape: " + importedBreast.nipples.getNippleShape() + "</br>areolaeSize: " + importedBreast.nipples.getAreolaeSize() + "</br>areolaeShape: " + importedBreast.nipples.getAreolaeShape() + "</br>Modifiers:");
    Element nippleModifiers = (Element) nipples.getElementsByTagName("nippleModifiers").item(0);
    importedBreast.nipples.orificeNipples.orificeModifiers.clear();
    for (OrificeModifier om : OrificeModifier.values()) {
        if (Boolean.valueOf(nippleModifiers.getAttribute(om.toString()))) {
            importedBreast.nipples.orificeNipples.orificeModifiers.add(om);
            CharacterUtils.appendToImportLog(log, "</br>" + om.toString() + ":true");
        } else {
            CharacterUtils.appendToImportLog(log, "</br>" + om.toString() + ":false");
        }
    }
    CharacterUtils.appendToImportLog(log, "</br></br>Milk:");
    Element milk = (Element) parentElement.getElementsByTagName("milk").item(0);
    importedBreast.milk.flavour = (FluidFlavour.valueOf(milk.getAttribute("flavour")));
    CharacterUtils.appendToImportLog(log, " flavour: " + importedBreast.milk.getFlavour() + "</br>Modifiers:");
    Element milkModifiers = (Element) milk.getElementsByTagName("milkModifiers").item(0);
    for (FluidModifier fm : FluidModifier.values()) {
        if (Boolean.valueOf(milkModifiers.getAttribute(fm.toString()))) {
            importedBreast.milk.fluidModifiers.add(fm);
            CharacterUtils.appendToImportLog(log, "</br>" + fm.toString() + ":true");
        } else {
            CharacterUtils.appendToImportLog(log, "</br>" + fm.toString() + ":false");
        }
    }
    // **************** Ear **************** //
    Element ear = (Element) parentElement.getElementsByTagName("ear").item(0);
    Ear importedEar = new Ear(EarType.valueOf(ear.getAttribute("type")));
    importedEar.pierced = (Boolean.valueOf(ear.getAttribute("pierced")));
    CharacterUtils.appendToImportLog(log, "</br></br>Body: Ear:" + "</br>type: " + importedEar.getType() + "</br>pierced: " + importedEar.isPierced());
    // **************** Eye **************** //
    Element eye = (Element) parentElement.getElementsByTagName("eye").item(0);
    String eyeTypeFromSave = eye.getAttribute("type");
    Map<String, String> eyeTypeConverterMap = new HashMap<>();
    eyeTypeConverterMap.put("EYE_HUMAN", "HUMAN");
    eyeTypeConverterMap.put("EYE_ANGEL", "ANGEL");
    eyeTypeConverterMap.put("EYE_DEMON_COMMON", "DEMON_COMMON");
    eyeTypeConverterMap.put("EYE_DOG_MORPH", "DOG_MORPH");
    eyeTypeConverterMap.put("EYE_LYCAN", "LYCAN");
    eyeTypeConverterMap.put("EYE_FELINE", "CAT_MORPH");
    eyeTypeConverterMap.put("EYE_SQUIRREL", "SQUIRREL_MORPH");
    eyeTypeConverterMap.put("EYE_HORSE_MORPH", "HORSE_MORPH");
    eyeTypeConverterMap.put("EYE_HARPY", "HARPY");
    eyeTypeConverterMap.put("EYE_SLIME", "SLIME");
    if (eyeTypeConverterMap.containsKey(eyeTypeFromSave)) {
        eyeTypeFromSave = eyeTypeConverterMap.get(eyeTypeFromSave);
    }
    Eye importedEye = new Eye(EyeType.valueOf(eyeTypeFromSave));
    importedEye.eyePairs = (Integer.valueOf(eye.getAttribute("eyePairs")));
    importedEye.irisShape = (EyeShape.valueOf(eye.getAttribute("irisShape")));
    importedEye.pupilShape = (EyeShape.valueOf(eye.getAttribute("pupilShape")));
    CharacterUtils.appendToImportLog(log, "</br></br>Body: Eye:" + "</br>type: " + importedEye.getType() + "</br>pairs: " + importedEye.getEyePairs() + "</br>iris shape: " + importedEye.getIrisShape() + "</br>pupil shape: " + importedEye.getPupilShape());
    // **************** Face **************** //
    Element face = (Element) parentElement.getElementsByTagName("face").item(0);
    Element mouth = (Element) parentElement.getElementsByTagName("mouth").item(0);
    Face importedFace = new Face(FaceType.valueOf(face.getAttribute("type")), Integer.valueOf(mouth.getAttribute("lipSize")));
    importedFace.piercedNose = (Boolean.valueOf(face.getAttribute("piercedNose")));
    try {
        importedFace.facialHair = (BodyHair.valueOf(face.getAttribute("facialHair")));
    } catch (IllegalArgumentException e) {
        importedFace.facialHair = BodyHair.ZERO_NONE;
        CharacterUtils.appendToImportLog(log, "</br>facial hair: OLD_VALUE - Set to NONE");
    }
    CharacterUtils.appendToImportLog(log, "</br></br>Body: Face: " + "</br>type: " + importedFace.getType() + "</br>piercedNose: " + importedFace.isPiercedNose() + "</br>facial hair: " + importedFace.getFacialHair() + "</br></br>Mouth: ");
    importedFace.mouth.orificeMouth.elasticity = (Integer.valueOf(mouth.getAttribute("elasticity")));
    importedFace.mouth.orificeMouth.plasticity = (Integer.valueOf(mouth.getAttribute("plasticity")));
    importedFace.mouth.orificeMouth.capacity = (Float.valueOf(mouth.getAttribute("capacity")));
    importedFace.mouth.orificeMouth.stretchedCapacity = (Float.valueOf(mouth.getAttribute("stretchedCapacity")));
    importedFace.mouth.orificeMouth.virgin = (Boolean.valueOf(mouth.getAttribute("virgin")));
    importedFace.mouth.piercedLip = (Boolean.valueOf(mouth.getAttribute("piercedLip")));
    CharacterUtils.appendToImportLog(log, "</br>elasticity: " + importedFace.mouth.orificeMouth.getElasticity() + "</br>plasticity: " + importedFace.mouth.orificeMouth.getPlasticity() + "</br>capacity: " + importedFace.mouth.orificeMouth.getCapacity() + "</br>stretchedCapacity: " + importedFace.mouth.orificeMouth.getStretchedCapacity() + "</br>virgin: " + importedFace.mouth.orificeMouth.isVirgin() + "</br>piercedLip: " + importedFace.mouth.isPiercedLip() + "</br>lipSize: " + importedFace.mouth.getLipSize() + "</br>Modifiers: ");
    Element mouthModifiers = (Element) mouth.getElementsByTagName("mouthModifiers").item(0);
    importedFace.mouth.orificeMouth.orificeModifiers.clear();
    for (OrificeModifier om : OrificeModifier.values()) {
        if (Boolean.valueOf(mouthModifiers.getAttribute(om.toString()))) {
            importedFace.mouth.orificeMouth.orificeModifiers.add(om);
            CharacterUtils.appendToImportLog(log, "</br>" + om.toString() + ":true");
        } else {
            CharacterUtils.appendToImportLog(log, "</br>" + om.toString() + ":false");
        }
    }
    Element tongue = (Element) parentElement.getElementsByTagName("tongue").item(0);
    importedFace.tongue.pierced = (Boolean.valueOf(tongue.getAttribute("piercedTongue")));
    importedFace.tongue.tongueLength = (Integer.valueOf(tongue.getAttribute("tongueLength")));
    CharacterUtils.appendToImportLog(log, "</br></br>Tongue: " + "</br>piercedTongue: " + importedFace.tongue.isPierced() + "</br>tongueLength: " + importedFace.tongue.getTongueLength() + "</br>Modifiers: ");
    Element tongueModifiers = (Element) tongue.getElementsByTagName("tongueModifiers").item(0);
    importedFace.tongue.tongueModifiers.clear();
    for (TongueModifier tm : TongueModifier.values()) {
        if (Boolean.valueOf(tongueModifiers.getAttribute(tm.toString()))) {
            importedFace.tongue.tongueModifiers.add(tm);
            CharacterUtils.appendToImportLog(log, "</br>" + tm.toString() + ":true");
        } else {
            CharacterUtils.appendToImportLog(log, "</br>" + tm.toString() + ":false");
        }
    }
    // **************** Hair **************** //
    Element hair = (Element) parentElement.getElementsByTagName("hair").item(0);
    String hairTypeFromSave = hair.getAttribute("type");
    Map<String, String> hairTypeConverterMap = new HashMap<>();
    hairTypeConverterMap.put("HAIR_HUMAN", "HUMAN");
    hairTypeConverterMap.put("HAIR_ANGEL", "ANGEL");
    hairTypeConverterMap.put("HAIR_DEMON", "DEMON_COMMON");
    hairTypeConverterMap.put("HAIR_CANINE_FUR", "DOG_MORPH");
    hairTypeConverterMap.put("HAIR_LYCAN_FUR", "LYCAN");
    hairTypeConverterMap.put("HAIR_FELINE_FUR", "CAT_MORPH");
    hairTypeConverterMap.put("HAIR_HORSE_HAIR", "HORSE_MORPH");
    hairTypeConverterMap.put("HAIR_SQUIRREL_FUR", "SQUIRREL_MORPH");
    hairTypeConverterMap.put("SLIME", "SLIME");
    hairTypeConverterMap.put("HAIR_HARPY", "HARPY");
    if (hairTypeConverterMap.containsKey(hairTypeFromSave)) {
        hairTypeFromSave = hairTypeConverterMap.get(hairTypeFromSave);
    }
    Hair importedHair = new Hair(HairType.valueOf(hairTypeFromSave), Integer.valueOf(hair.getAttribute("length")), HairStyle.valueOf(hair.getAttribute("hairStyle")));
    CharacterUtils.appendToImportLog(log, "</br></br>Body: Hair: " + "</br>type: " + importedHair.getType() + "</br>length: " + importedHair.getLength() + "</br>hairStyle: " + importedHair.getStyle());
    // **************** Horn **************** //
    Element horn = (Element) parentElement.getElementsByTagName("horn").item(0);
    Horn importedHorn = new Horn(HornType.NONE, 0);
    int rows = (Integer.valueOf(horn.getAttribute("rows")));
    String hornType = horn.getAttribute("type");
    if (hornType.equals("DEMON")) {
        hornType = "";
    }
    if (hornType.equals("BOVINE")) {
        hornType = "";
    }
    int length = 0;
    if (!hornType.equals("NONE")) {
        length = HornLength.TWO_LONG.getMedianValue();
    }
    if (!horn.getAttribute("length").isEmpty()) {
        try {
            length = Integer.valueOf(horn.getAttribute("length"));
        } catch (IllegalArgumentException e) {
        }
    }
    try {
        importedHorn = new Horn(HornType.valueOf(hornType), length);
        importedHorn.rows = rows;
        CharacterUtils.appendToImportLog(log, "</br></br>Body: Horn: " + "</br>type: " + importedHorn.getType() + "</br>length: " + length + "</br>rows: " + importedHorn.getHornRows());
    } catch (IllegalArgumentException e) {
        if (horn.getAttribute("type").startsWith("DEMON")) {
            importedHorn = new Horn(HornType.SWEPT_BACK, length);
            importedHorn.rows = rows;
        } else if (horn.getAttribute("type").startsWith("BOVINE")) {
            importedHorn = new Horn(HornType.CURVED, length);
            importedHorn.rows = rows;
        }
        CharacterUtils.appendToImportLog(log, "</br></br>Body: Horn: " + "</br>type NOT FOUND, defaulted to: " + importedHorn.getType() + "</br>rows: " + importedHorn.getHornRows());
    }
    // **************** Leg **************** //
    Element leg = (Element) parentElement.getElementsByTagName("leg").item(0);
    Leg importedLeg = new Leg(LegType.valueOf(leg.getAttribute("type")));
    CharacterUtils.appendToImportLog(log, "</br></br>Body: Leg: " + "</br>type: " + importedLeg.getType());
    // **************** Penis **************** //
    Element penis = (Element) parentElement.getElementsByTagName("penis").item(0);
    Element testicles = (Element) parentElement.getElementsByTagName("testicles").item(0);
    int girth = 2;
    if (penis.getAttribute("girth") != null && !penis.getAttribute("girth").isEmpty()) {
        girth = Integer.valueOf(penis.getAttribute("girth"));
    }
    Penis importedPenis = new Penis(PenisType.valueOf(penis.getAttribute("type")), Integer.valueOf(penis.getAttribute("size")), girth, Integer.valueOf(testicles.getAttribute("testicleSize")), Integer.valueOf(testicles.getAttribute("cumProduction")), Integer.valueOf(testicles.getAttribute("numberOfTesticles")));
    importedPenis.pierced = (Boolean.valueOf(penis.getAttribute("pierced")));
    if (!penis.getAttribute("virgin").isEmpty()) {
        importedPenis.virgin = (Boolean.valueOf(penis.getAttribute("virgin")));
    }
    CharacterUtils.appendToImportLog(log, "</br></br>Body: Penis: " + "</br>type: " + importedPenis.getType() + "</br>size: " + importedPenis.getRawSizeValue() + "</br>pierced: " + importedPenis.isPierced() + "</br>Penis Modifiers: ");
    Element penisModifiers = (Element) penis.getElementsByTagName("penisModifiers").item(0);
    importedPenis.penisModifiers.clear();
    for (PenisModifier pm : PenisModifier.values()) {
        if (penisModifiers != null && Boolean.valueOf(penisModifiers.getAttribute(pm.toString()))) {
            importedPenis.penisModifiers.add(pm);
            CharacterUtils.appendToImportLog(log, "</br>" + pm.toString() + ":true");
        } else {
            CharacterUtils.appendToImportLog(log, "</br>" + pm.toString() + ":false");
        }
    }
    importedPenis.orificeUrethra.elasticity = (Integer.valueOf(penis.getAttribute("elasticity")));
    importedPenis.orificeUrethra.plasticity = (Integer.valueOf(penis.getAttribute("plasticity")));
    importedPenis.orificeUrethra.capacity = (Float.valueOf(penis.getAttribute("capacity")));
    importedPenis.orificeUrethra.stretchedCapacity = (Float.valueOf(penis.getAttribute("stretchedCapacity")));
    if (!penis.getAttribute("urethraVirgin").isEmpty()) {
        importedPenis.orificeUrethra.virgin = (Boolean.valueOf(penis.getAttribute("urethraVirgin")));
    } else {
        importedPenis.orificeUrethra.virgin = true;
    }
    CharacterUtils.appendToImportLog(log, "</br>elasticity: " + importedPenis.orificeUrethra.getElasticity() + "</br>plasticity: " + importedPenis.orificeUrethra.getPlasticity() + "</br>capacity: " + importedPenis.orificeUrethra.getCapacity() + "</br>stretchedCapacity: " + importedPenis.orificeUrethra.getStretchedCapacity() + "</br>virgin: " + importedPenis.orificeUrethra.isVirgin() + "</br>Urethra Modifiers:");
    Element urethraModifiers = (Element) penis.getElementsByTagName("urethraModifiers").item(0);
    importedPenis.orificeUrethra.orificeModifiers.clear();
    for (OrificeModifier om : OrificeModifier.values()) {
        if (Boolean.valueOf(urethraModifiers.getAttribute(om.toString()))) {
            importedPenis.orificeUrethra.orificeModifiers.add(om);
            CharacterUtils.appendToImportLog(log, "</br>" + om.toString() + ":true");
        } else {
            CharacterUtils.appendToImportLog(log, "</br>" + om.toString() + ":false");
        }
    }
    importedPenis.testicle.internal = (Boolean.valueOf(testicles.getAttribute("internal")));
    CharacterUtils.appendToImportLog(log, "</br></br>Testicles: " + "</br>cumProduction: " + importedPenis.testicle.getRawCumProductionValue() + "</br>numberOfTesticles: " + importedPenis.testicle.getTesticleCount() + "</br>testicleSize: " + importedPenis.testicle.getTesticleSize() + "</br>internal: " + importedPenis.testicle.isInternal());
    CharacterUtils.appendToImportLog(log, "</br></br>Cum:");
    Element cum = (Element) parentElement.getElementsByTagName("cum").item(0);
    importedPenis.testicle.cum.flavour = (FluidFlavour.valueOf(cum.getAttribute("flavour")));
    CharacterUtils.appendToImportLog(log, " flavour: " + importedPenis.testicle.cum.getFlavour() + "</br>Modifiers:");
    Element cumModifiers = (Element) cum.getElementsByTagName("cumModifiers").item(0);
    for (FluidModifier fm : FluidModifier.values()) {
        if (Boolean.valueOf(cumModifiers.getAttribute(fm.toString()))) {
            importedPenis.testicle.cum.fluidModifiers.add(fm);
            CharacterUtils.appendToImportLog(log, "</br>" + fm.toString() + ":true");
        } else {
            CharacterUtils.appendToImportLog(log, "</br>" + fm.toString() + ":false");
        }
    }
    // **************** Skin **************** //
    Element skin = (Element) parentElement.getElementsByTagName("skin").item(0);
    String skinTypeFromSave = skin.getAttribute("type");
    Map<String, String> skinTypeConverterMap = new HashMap<>();
    skinTypeConverterMap.put("HUMAN", "HUMAN");
    skinTypeConverterMap.put("ANGEL", "ANGEL");
    skinTypeConverterMap.put("DEMON_COMMON", "DEMON_COMMON");
    skinTypeConverterMap.put("CANINE_FUR", "DOG_MORPH");
    skinTypeConverterMap.put("LYCAN_FUR", "LYCAN");
    skinTypeConverterMap.put("FELINE_FUR", "CAT_MORPH");
    skinTypeConverterMap.put("SQUIRREL_FUR", "SQUIRREL_MORPH");
    skinTypeConverterMap.put("HORSE_HAIR", "HORSE_MORPH");
    skinTypeConverterMap.put("SLIME", "SLIME");
    skinTypeConverterMap.put("FEATHERS", "HARPY");
    if (skinTypeConverterMap.containsKey(skinTypeFromSave)) {
        skinTypeFromSave = skinTypeConverterMap.get(skinTypeFromSave);
    }
    Skin importedSkin = new Skin(SkinType.valueOf(skinTypeFromSave));
    CharacterUtils.appendToImportLog(log, "</br></br>Body: Skin: " + "</br>type: " + importedSkin.getType());
    // **************** Tail **************** //
    Element tail = (Element) parentElement.getElementsByTagName("tail").item(0);
    Tail importedTail = new Tail(TailType.valueOf(tail.getAttribute("type")));
    importedTail.tailCount = (Integer.valueOf(tail.getAttribute("count")));
    CharacterUtils.appendToImportLog(log, "</br></br>Body: Tail: " + "</br>type: " + importedTail.getType() + "</br>count: " + importedTail.getTailCount());
    // **************** Vagina **************** //
    Element vagina = (Element) parentElement.getElementsByTagName("vagina").item(0);
    Vagina importedVagina = new Vagina(VaginaType.valueOf(vagina.getAttribute("type")), (vagina.getAttribute("labiaSize").isEmpty() ? 1 : Integer.valueOf(vagina.getAttribute("labiaSize"))), Integer.valueOf(vagina.getAttribute("clitSize")), Integer.valueOf(vagina.getAttribute("wetness")), Float.valueOf(vagina.getAttribute("capacity")), Integer.valueOf(vagina.getAttribute("elasticity")), Integer.valueOf(vagina.getAttribute("plasticity")), Boolean.valueOf(vagina.getAttribute("virgin")));
    importedVagina.pierced = (Boolean.valueOf(vagina.getAttribute("pierced")));
    importedVagina.orificeVagina.stretchedCapacity = (Float.valueOf(vagina.getAttribute("stretchedCapacity")));
    try {
        importedVagina.orificeVagina.squirter = (Boolean.valueOf(vagina.getAttribute("squirter")));
    } catch (Exception ex) {
    }
    CharacterUtils.appendToImportLog(log, "</br></br>Body: Vagina: " + "</br>type: " + importedVagina.getType() + "</br>clitSize: " + importedVagina.getClitorisSize() + "</br>pierced: " + importedVagina.isPierced() + "</br>wetness: " + importedVagina.orificeVagina.wetness + "</br>elasticity: " + importedVagina.orificeVagina.getElasticity() + "</br>plasticity: " + importedVagina.orificeVagina.getPlasticity() + "</br>capacity: " + importedVagina.orificeVagina.getCapacity() + "</br>stretchedCapacity: " + importedVagina.orificeVagina.getStretchedCapacity() + "</br>virgin: " + importedVagina.orificeVagina.isVirgin());
    Element vaginaModifiers = (Element) vagina.getElementsByTagName("vaginaModifiers").item(0);
    importedVagina.orificeVagina.orificeModifiers.clear();
    if (vaginaModifiers != null) {
        for (OrificeModifier om : OrificeModifier.values()) {
            if (Boolean.valueOf(vaginaModifiers.getAttribute(om.toString()))) {
                importedVagina.orificeVagina.orificeModifiers.add(om);
                CharacterUtils.appendToImportLog(log, "</br>" + om.toString() + ":true");
            } else {
                CharacterUtils.appendToImportLog(log, "</br>" + om.toString() + ":false");
            }
        }
    }
    CharacterUtils.appendToImportLog(log, "</br></br>Girlcum:");
    Element girlcum = (Element) parentElement.getElementsByTagName("girlcum").item(0);
    importedVagina.girlcum.flavour = (FluidFlavour.valueOf(girlcum.getAttribute("flavour")));
    CharacterUtils.appendToImportLog(log, " flavour: " + importedVagina.girlcum.getFlavour() + "</br>Modifiers:");
    Element girlcumModifiers = (Element) girlcum.getElementsByTagName("girlcumModifiers").item(0);
    for (FluidModifier fm : FluidModifier.values()) {
        if (Boolean.valueOf(girlcumModifiers.getAttribute(fm.toString()))) {
            importedVagina.girlcum.fluidModifiers.add(fm);
            CharacterUtils.appendToImportLog(log, "</br>" + fm.toString() + ":true");
        } else {
            CharacterUtils.appendToImportLog(log, "</br>" + fm.toString() + ":false");
        }
    }
    // **************** Wing **************** //
    Element wing = (Element) parentElement.getElementsByTagName("wing").item(0);
    int wingSize = 0;
    if (!wing.getAttribute("size").isEmpty()) {
        wingSize = Integer.valueOf(wing.getAttribute("size"));
    }
    Wing importedWing = new Wing(WingType.valueOf(wing.getAttribute("type")), wingSize);
    CharacterUtils.appendToImportLog(log, "</br></br>Body: Wing: " + "</br>type: " + importedWing.getType() + "</br>" + "</br>size: " + importedWing.getSizeValue() + "</br>");
    Body body = new Body.BodyBuilder(importedArm, importedAss, importedBreast, importedFace, importedEye, importedEar, importedHair, importedLeg, importedSkin, importedBodyMaterial, importedGenitalArrangement, importedHeight, importedFemininity, importedBodySize, importedMuscle).vagina(importedVagina).penis(importedPenis).horn(importedHorn).antenna(importedAntenna).tail(importedTail).wing(importedWing).build();
    body.setPiercedStomach(Boolean.valueOf(element.getAttribute("piercedStomach")));
    CharacterUtils.appendToImportLog(log, "</br>Body: Set piercedStomach: " + Boolean.valueOf(element.getAttribute("piercedStomach")));
    if (element.getAttribute("pubicHair") != null && !element.getAttribute("pubicHair").isEmpty()) {
        try {
            body.setPubicHair(BodyHair.valueOf(element.getAttribute("pubicHair")));
            CharacterUtils.appendToImportLog(log, "</br>Body: Set pubicHair: " + body.getPubicHair());
        } catch (IllegalArgumentException e) {
            body.pubicHair = BodyHair.ZERO_NONE;
            CharacterUtils.appendToImportLog(log, "</br>pubic hair: OLD_VALUE - Set to NONE");
        }
    }
    for (int i = 0; i < element.getElementsByTagName("bodyCovering").getLength(); i++) {
        Element e = ((Element) element.getElementsByTagName("bodyCovering").item(i));
        String type = e.getAttribute("type");
        if (type.equals("HORN_COW") || type.equals("HORN_DEMON")) {
            type = "HORN";
        }
        try {
            String colourPrimary = e.getAttribute("colourPrimary");
            String colourSecondary = e.getAttribute("colourSecondary");
            if (type.startsWith("HAIR_")) {
                if (colourPrimary.equals("COVERING_TAN")) {
                    colourPrimary = "COVERING_DIRTY_BLONDE";
                }
                if (colourSecondary.equals("COVERING_TAN")) {
                    colourSecondary = "COVERING_DIRTY_BLONDE";
                }
            }
            if (e.getAttribute("modifier").isEmpty()) {
                body.setBodyCoveringForXMLImport(BodyCoveringType.valueOf(type), CoveringPattern.valueOf(e.getAttribute("pattern")), Colour.valueOf(colourPrimary), !e.getAttribute("glowPrimary").isEmpty() ? Boolean.valueOf(e.getAttribute("glowPrimary")) : false, Colour.valueOf(colourSecondary), !e.getAttribute("glowSecondary").isEmpty() ? Boolean.valueOf(e.getAttribute("glowSecondary")) : false);
            } else {
                BodyCoveringType coveringType = BodyCoveringType.valueOf(type);
                CoveringModifier modifier = CoveringModifier.valueOf(e.getAttribute("modifier"));
                body.setBodyCoveringForXMLImport(coveringType, CoveringPattern.valueOf(e.getAttribute("pattern")), coveringType.getNaturalModifiers().contains(modifier) || coveringType.getExtraModifiers().contains(modifier) ? modifier : coveringType.getNaturalModifiers().get(0), Colour.valueOf(colourPrimary), !e.getAttribute("glowPrimary").isEmpty() ? Boolean.valueOf(e.getAttribute("glowPrimary")) : false, Colour.valueOf(colourSecondary), !e.getAttribute("glowSecondary").isEmpty() ? Boolean.valueOf(e.getAttribute("glowSecondary")) : false);
            }
            if (!e.getAttribute("discovered").isEmpty() && Boolean.valueOf(e.getAttribute("discovered"))) {
                body.getBodyCoveringTypesDiscovered().add(BodyCoveringType.valueOf(type));
            }
            CharacterUtils.appendToImportLog(log, "</br>Body: Set bodyCovering: " + e.getAttribute("type") + " pattern:" + CoveringPattern.valueOf(e.getAttribute("pattern")) + " " + Colour.valueOf(e.getAttribute("colourPrimary")) + " glow:" + Boolean.valueOf(e.getAttribute("glowPrimary")) + " | " + Colour.valueOf(e.getAttribute("colourSecondary")) + " glow:" + Boolean.valueOf(e.getAttribute("glowSecondary")) + " (discovered: " + e.getAttribute("discovered") + ")");
        } catch (Exception ex) {
        }
    }
    body.calculateRace();
    return body;
}
Also used : HashMap(java.util.HashMap) CoveringModifier(com.lilithsthrone.game.character.body.valueEnums.CoveringModifier) Element(org.w3c.dom.Element) BodyCoveringType(com.lilithsthrone.game.character.body.types.BodyCoveringType) PenisModifier(com.lilithsthrone.game.character.body.valueEnums.PenisModifier) BodyHair(com.lilithsthrone.game.character.body.valueEnums.BodyHair) GenitalArrangement(com.lilithsthrone.game.character.body.valueEnums.GenitalArrangement) BodyMaterial(com.lilithsthrone.game.character.body.valueEnums.BodyMaterial) BreastShape(com.lilithsthrone.game.character.body.valueEnums.BreastShape) FluidModifier(com.lilithsthrone.game.character.body.valueEnums.FluidModifier) TongueModifier(com.lilithsthrone.game.character.body.valueEnums.TongueModifier) OrificeModifier(com.lilithsthrone.game.character.body.valueEnums.OrificeModifier)

Example 2 with FluidModifier

use of com.lilithsthrone.game.character.body.valueEnums.FluidModifier in project liliths-throne-public by Innoxia.

the class Body method getBreastDescription.

public String getBreastDescription(GameCharacter owner, Breast viewedBreast) {
    descriptionSB = new StringBuilder();
    boolean isPlayer = owner.isPlayer();
    boolean playerKnowledgeOfBreasts = owner.getPlayerKnowsAreas().contains(CoverableArea.NIPPLES);
    if (!isPlayer && !playerKnowledgeOfBreasts) {
        descriptionSB.append("You've never seen [npc.her] naked chest, so you don't know what [npc.her] nipples look like.");
    } else if (isPlayer) {
        descriptionSB.append("On each of your " + (owner.hasBreasts() ? owner.getBreastShape().getName() + " breasts" : "pecs") + ", you have " + Util.intToString(owner.getNippleCountPerBreast()) + " [pc.nippleSize], ");
        switch(owner.getNippleShape()) {
            case NORMAL:
                descriptionSB.append(" [pc.nipplePrimaryColour(true)]");
                break;
            case LIPS:
                descriptionSB.append(" [pc.nipplePrimaryColour(true)]-lipped");
                break;
            case VAGINA:
                descriptionSB.append(" [pc.nipplePrimaryColour(true)]-lipped");
                break;
        }
        if (owner.getNippleCountPerBreast() > 1) {
            descriptionSB.append(" [pc.nipples],");
        } else {
            descriptionSB.append(" [pc.nipple],");
        }
        switch(owner.getAreolaeShape()) {
            case NORMAL:
                descriptionSB.append(" with [pc.areolaeSize], circular areolae.");
                break;
            case HEART:
                descriptionSB.append(" with [pc.areolaeSize], heart-shaped areolae.");
                break;
            case STAR:
                descriptionSB.append(" with [pc.areolaeSize], star-shaped areolae.");
                break;
        }
        if (owner.isPiercedNipple()) {
            descriptionSB.append(" They have been pierced.");
        }
        if (owner.getNippleCapacity() != Capacity.ZERO_IMPENETRABLE) {
            if (viewedBreast.isFuckable()) {
                descriptionSB.append("</br>Your [pc.breasts] have internal, [pc.nippleSecondaryColour(true)] channels, allowing your [pc.breastCapacity] [pc.nipples] to be comfortably penetrated by " + Capacity.getCapacityFromValue(viewedBreast.getNipples().getOrificeNipples().getStretchedCapacity()).getMaximumSizeComfortableWithLube().getDescriptor() + " objects with sufficient lubrication.");
            } else {
                descriptionSB.append("</br>Your [pc.breasts] have internal, [pc.nippleSecondaryColour(true)] channels, but you'd need at least D-cups before your [pc.breastCapacity] [pc.nipples] could be penetrated.");
            }
            // Nipple elasticity & plasticity:
            switch(viewedBreast.getNipples().getOrificeNipples().getElasticity()) {
                case ZERO_UNYIELDING:
                    descriptionSB.append(" [style.colourSex(They are extremely unyielding,");
                    break;
                case ONE_RIGID:
                    descriptionSB.append(" [style.colourSex(They take a huge amount of effort to stretch out,");
                    break;
                case TWO_FIRM:
                    descriptionSB.append(" [style.colourSex(They do not stretch very easily,");
                    break;
                case THREE_FLEXIBLE:
                    descriptionSB.append(" [style.colourSex(They reluctantly stretch out when penetrated,");
                    break;
                case FOUR_LIMBER:
                    descriptionSB.append(" [style.colourSex(They are somewhat resistant to being stretched out,");
                    break;
                case FIVE_STRETCHY:
                    descriptionSB.append(" [style.colourSex(They stretch out fairly easily,");
                    break;
                case SIX_SUPPLE:
                    descriptionSB.append(" [style.colourSex(They stretch out very easily,");
                    break;
                case SEVEN_ELASTIC:
                    descriptionSB.append(" [style.colourSex(They are extremely elastic,");
                    break;
                default:
                    break;
            }
            switch(viewedBreast.getNipples().getOrificeNipples().getPlasticity()) {
                case ZERO_RUBBERY:
                    descriptionSB.append(" and instantly return to their original size.)]");
                    break;
                case ONE_SPRINGY:
                    descriptionSB.append(" and return to their original size within a matter of hours.)]");
                    break;
                case TWO_TENSILE:
                    descriptionSB.append(" and return to their original size within a day or so.)]");
                    break;
                case THREE_RESILIENT:
                    descriptionSB.append(" and will return to their original size after a couple of days.)]");
                    break;
                case FOUR_ACCOMMODATING:
                    descriptionSB.append(" and take a while to return to their original size.)]");
                    break;
                case FIVE_YIELDING:
                    descriptionSB.append(" and struggle to return to their original size.)]");
                    break;
                case SIX_MALLEABLE:
                    descriptionSB.append(" and lose a good portion of their original tightness.)]");
                    break;
                case SEVEN_MOULDABLE:
                    descriptionSB.append(" and once stretched out, they stay that way.)]");
                    break;
                default:
                    break;
            }
            for (OrificeModifier om : OrificeModifier.values()) {
                if (owner.hasNippleOrificeModifier(om)) {
                    switch(om) {
                        case MUSCLE_CONTROL:
                            descriptionSB.append(" You have a series of muscles lining the inside of your [pc.nipples], allowing you to expertly squeeze and grip down on any intruding object.");
                            break;
                        case PUFFY:
                            descriptionSB.append(" Your [pc.nipples] have swollen up to be exceptionally plump and puffy.");
                            break;
                        case RIBBED:
                            descriptionSB.append(" The insides of your [pc.nipples] are lined with sensitive, fleshy ribs, which grant you extra pleasure when stimulated.");
                            break;
                        case TENTACLED:
                            descriptionSB.append(" Your [pc.nipples] are filled with tiny little tentacles, which wriggle and squirm with a mind of their own.");
                            break;
                    }
                }
            }
            if (!viewedBreast.getNipples().getOrificeNipples().isVirgin()) {
                for (PenetrationType pt : PenetrationType.values()) {
                    if (owner.getVirginityLoss(new SexType(SexParticipantType.CATCHER, pt, OrificeType.NIPPLE)) != null && !owner.getVirginityLoss(new SexType(SexParticipantType.CATCHER, pt, OrificeType.NIPPLE)).isEmpty()) {
                        descriptionSB.append(" [style.colourArcane(You lost your nipple virginity to " + owner.getVirginityLoss(new SexType(SexParticipantType.CATCHER, pt, OrificeType.NIPPLE)) + ".)]");
                        break;
                    }
                }
            } else {
                descriptionSB.append(" [style.colourGood(You have retained your nipple virginity.)]");
            }
        } else {
            if (owner.hasNippleOrificeModifier(OrificeModifier.PUFFY)) {
                descriptionSB.append(" Your [pc.nipples] have swollen up to be exceptionally plump and puffy.");
            }
        }
        if (viewedBreast.getRawMilkStorageValue() > 0) {
            descriptionSB.append("</br>You are currently producing " + viewedBreast.getRawMilkStorageValue() + "ml of [pc.milkPrimaryColour(true)] [pc.milk] (" + viewedBreast.getRawStoredMilkValue() + "ml currently stored) at [pc.a_milkRegen] rate.");
            switch(viewedBreast.getMilk().getFlavour()) {
                case CHOCOLATE:
                    descriptionSB.append(" Your [pc.milk] tastes of chocolate.");
                    break;
                case CUM:
                    descriptionSB.append(" Your [pc.milk] tastes exactly like cum.");
                    break;
                case GIRL_CUM:
                    descriptionSB.append(" Your [pc.milk] tastes of girl-cum.");
                    break;
                case HONEY:
                    descriptionSB.append(" Your [pc.milk] tastes of honey.");
                    break;
                case MILK:
                    descriptionSB.append(" Your [pc.milk] tastes like regular milk.");
                    break;
                case MINT:
                    descriptionSB.append(" Your [pc.milk] tastes of mint.");
                    break;
                case PINEAPPLE:
                    descriptionSB.append(" Your [pc.milk] tastes of pineapple.");
                    break;
                case SLIME:
                    descriptionSB.append(" Your [pc.milk] is mostly tasteless, but very sweet.");
                    break;
                case STRAWBERRY:
                    descriptionSB.append(" Your [pc.milk] tastes of strawberries.");
                    break;
                case BEER:
                    descriptionSB.append(" Your [pc.milk] tastes like beer.");
                    break;
                case VANILLA:
                    descriptionSB.append(" Your [pc.milk] tastes of vanilla.");
                    break;
            }
            for (FluidModifier fm : FluidModifier.values()) {
                if (owner.hasMilkModifier(fm)) {
                    switch(fm) {
                        case ADDICTIVE:
                            descriptionSB.append(" It is highly addictive, and anyone who drinks too much will quickly become dependent on it.");
                            break;
                        case BUBBLING:
                            descriptionSB.append(" It fizzes and bubbles like a carbonated drink.");
                            break;
                        case HALLUCINOGENIC:
                            descriptionSB.append(" Anyone who ingests it suffers psychoactive effects, which can manifest in lactation-related hallucinations or sensitivity to hypnotic suggestion.");
                            break;
                        case MUSKY:
                            descriptionSB.append(" It has a strong, musky smell.");
                            break;
                        case SLIMY:
                            descriptionSB.append(" It has a slimy, oily texture.");
                            break;
                        case STICKY:
                            descriptionSB.append(" It's quite sticky, and is difficult to fully wash off without soap.");
                            break;
                        case VISCOUS:
                            descriptionSB.append(" It's quite viscous, and slowly drips in large globules, much like thick treacle.");
                            break;
                        case ALCOHOLIC:
                            descriptionSB.append(" It has a high alcohol content, and will get those who consume it very drunk.");
                            break;
                    }
                }
            }
        } else {
            descriptionSB.append("</br>You are not producing any milk.");
        }
    } else {
        descriptionSB.append("On each of [npc.her] " + (owner.hasBreasts() ? owner.getBreastShape().getName() + " breasts" : "pecs") + ", [npc.she] has " + Util.intToString(owner.getNippleCountPerBreast()) + " [npc.nippleSize], ");
        switch(owner.getNippleShape()) {
            case NORMAL:
                descriptionSB.append(" [npc.nipplePrimaryColour(true)]");
                break;
            case LIPS:
                descriptionSB.append(" [npc.nipplePrimaryColour(true)]-lipped");
                break;
            case VAGINA:
                descriptionSB.append(" [npc.nipplePrimaryColour(true)]-lipped");
                break;
        }
        if (owner.getNippleCountPerBreast() > 1) {
            descriptionSB.append(" [npc.nipples],");
        } else {
            descriptionSB.append(" [npc.nipple],");
        }
        switch(owner.getAreolaeShape()) {
            case NORMAL:
                descriptionSB.append(" with [npc.areolaeSize], circular areolae.");
                break;
            case HEART:
                descriptionSB.append(" with [npc.areolaeSize], heart-shaped areolae.");
                break;
            case STAR:
                descriptionSB.append(" with [npc.areolaeSize], star-shaped areolae.");
                break;
        }
        if (owner.isPiercedNipple()) {
            descriptionSB.append(" They have been pierced.");
        }
        if (owner.getNippleCapacity() != Capacity.ZERO_IMPENETRABLE) {
            if (viewedBreast.isFuckable()) {
                descriptionSB.append("</br>[npc.Her] [npc.breasts] have internal, [npc.nippleSecondaryColour(true)] channels, allowing [npc.her] [npc.breastCapacity] [npc.nipples] to be comfortably penetrated by " + Capacity.getCapacityFromValue(viewedBreast.getNipples().getOrificeNipples().getStretchedCapacity()).getMaximumSizeComfortableWithLube().getDescriptor() + " objects with sufficient lubrication.");
            } else {
                descriptionSB.append("</br>[npc.Her] [npc.breasts] have internal, [npc.nippleSecondaryColour(true)] channels, but [npc.she]'s need at least D-cups before [npc.her] [npc.breastCapacity] [npc.nipples] could be penetrated.");
            }
            // Nipple elasticity & plasticity:
            switch(viewedBreast.getNipples().getOrificeNipples().getElasticity()) {
                case ZERO_UNYIELDING:
                    descriptionSB.append(" [style.colourSex(They are extremely unyielding,");
                    break;
                case ONE_RIGID:
                    descriptionSB.append(" [style.colourSex(They take a huge amount of effort to stretch out,");
                    break;
                case TWO_FIRM:
                    descriptionSB.append(" [style.colourSex(They do not stretch very easily,");
                    break;
                case THREE_FLEXIBLE:
                    descriptionSB.append(" [style.colourSex(They reluctantly stretch out when penetrated,");
                    break;
                case FOUR_LIMBER:
                    descriptionSB.append(" [style.colourSex(They are somewhat resistant to being stretched out,");
                    break;
                case FIVE_STRETCHY:
                    descriptionSB.append(" [style.colourSex(They stretch out fairly easily,");
                    break;
                case SIX_SUPPLE:
                    descriptionSB.append(" [style.colourSex(They stretch out very easily,");
                    break;
                case SEVEN_ELASTIC:
                    descriptionSB.append(" [style.colourSex(They are extremely elastic,");
                    break;
                default:
                    break;
            }
            switch(viewedBreast.getNipples().getOrificeNipples().getPlasticity()) {
                case ZERO_RUBBERY:
                    descriptionSB.append(" and instantly return to their original size.)]");
                    break;
                case ONE_SPRINGY:
                    descriptionSB.append(" and return to their original size within a matter of hours.)]");
                    break;
                case TWO_TENSILE:
                    descriptionSB.append(" and return to their original size within a day or so.)]");
                    break;
                case THREE_RESILIENT:
                    descriptionSB.append(" and will return to their original size after a couple of days.)]");
                    break;
                case FOUR_ACCOMMODATING:
                    descriptionSB.append(" and take a while to return to their original size.)]");
                    break;
                case FIVE_YIELDING:
                    descriptionSB.append(" and struggle to return to their original size.)]");
                    break;
                case SIX_MALLEABLE:
                    descriptionSB.append(" and lose a good portion of their original tightness.)]");
                    break;
                case SEVEN_MOULDABLE:
                    descriptionSB.append(" and once stretched out, they stay that way.)]");
                    break;
                default:
                    break;
            }
            for (OrificeModifier om : OrificeModifier.values()) {
                if (owner.hasNippleOrificeModifier(om)) {
                    switch(om) {
                        case MUSCLE_CONTROL:
                            descriptionSB.append(" [npc.She] has a series of muscles lining the insides of [npc.her] [npc.nipples], allowing [npc.herHim] to expertly squeeze and grip down on any intruding object.");
                            break;
                        case PUFFY:
                            descriptionSB.append(" [npc.Her] [npc.nipples] have swollen up to be exceptionally plump and puffy.");
                            break;
                        case RIBBED:
                            descriptionSB.append(" The insides of [npc.her] [npc.nipples] are lined with sensitive, fleshy ribs, which grant [npc.herHim] extra pleasure when stimulated.");
                            break;
                        case TENTACLED:
                            descriptionSB.append(" [npc.Her] [npc.nipples] are filled with tiny little tentacles, which wriggle and squirm with a mind of their own.");
                            break;
                    }
                }
            }
            if (!viewedBreast.getNipples().getOrificeNipples().isVirgin()) {
                for (PenetrationType pt : PenetrationType.values()) {
                    if (owner.getVirginityLoss(new SexType(SexParticipantType.CATCHER, pt, OrificeType.NIPPLE)) != null && !owner.getVirginityLoss(new SexType(SexParticipantType.CATCHER, pt, OrificeType.NIPPLE)).isEmpty()) {
                        descriptionSB.append(" [style.colourArcane([npc.Name] lost [npc.her] nipple virginity to " + owner.getVirginityLoss(new SexType(SexParticipantType.CATCHER, pt, OrificeType.NIPPLE)) + ".)]");
                        break;
                    }
                }
            } else {
                descriptionSB.append(" [style.colourGood([npc.Name] has retained [npc.her] nipple virginity.)]");
            }
            if (viewedBreast.getRawMilkStorageValue() > 0) {
                descriptionSB.append("</br>[npc.She] is currently producing " + viewedBreast.getRawMilkStorageValue() + "ml of [npc.milkPrimaryColour(true)] [npc.milk] (" + viewedBreast.getRawStoredMilkValue() + "ml currently stored) at [npc.a_milkRegen] rate.");
                switch(viewedBreast.getMilk().getFlavour()) {
                    case CHOCOLATE:
                        descriptionSB.append(" [npc.Her] [npc.milk] tastes of chocolate.");
                        break;
                    case CUM:
                        descriptionSB.append(" [npc.Her] [npc.milk] tastes exactly like cum.");
                        break;
                    case GIRL_CUM:
                        descriptionSB.append(" [npc.Her] [npc.milk] tastes of girl-cum.");
                        break;
                    case HONEY:
                        descriptionSB.append(" [npc.Her] [npc.milk] tastes of honey.");
                        break;
                    case MILK:
                        descriptionSB.append(" [npc.Her] [npc.milk] tastes like regular milk.");
                        break;
                    case MINT:
                        descriptionSB.append(" [npc.Her] [npc.milk] tastes of mint.");
                        break;
                    case PINEAPPLE:
                        descriptionSB.append(" [npc.Her] [npc.milk] tastes of pineapple.");
                        break;
                    case SLIME:
                        descriptionSB.append(" [npc.Her] [npc.milk] is mostly tasteless, but very sweet.");
                        break;
                    case STRAWBERRY:
                        descriptionSB.append(" [npc.Her] [npc.milk] tastes of strawberries.");
                        break;
                    case BEER:
                        descriptionSB.append(" [npc.Her] [npc.milk] tastes like beer.");
                        break;
                    case VANILLA:
                        descriptionSB.append(" [npc.Her] [npc.milk] tastes of vanilla.");
                        break;
                }
                for (FluidModifier fm : FluidModifier.values()) {
                    if (owner.hasMilkModifier(fm)) {
                        switch(fm) {
                            case ADDICTIVE:
                                descriptionSB.append(" It is highly addictive, and anyone who drinks too much will quickly become dependent on it.");
                                break;
                            case BUBBLING:
                                descriptionSB.append(" It fizzes and bubbles like a carbonated drink.");
                                break;
                            case HALLUCINOGENIC:
                                descriptionSB.append(" Anyone who ingests it suffers psychoactive effects, which can manifest in lactation-related hallucinations or sensitivity to hypnotic suggestion.");
                                break;
                            case MUSKY:
                                descriptionSB.append(" It has a strong, musky smell.");
                                break;
                            case SLIMY:
                                descriptionSB.append(" It has a slimy, oily texture.");
                                break;
                            case STICKY:
                                descriptionSB.append(" It's quite sticky, and is difficult to fully wash off without soap.");
                                break;
                            case VISCOUS:
                                descriptionSB.append(" It's quite viscous, and slowly drips in large globules, much like thick treacle.");
                                break;
                            case ALCOHOLIC:
                                descriptionSB.append(" It has a high alcohol content, and will get those who consume it very drunk.");
                                break;
                        }
                    }
                }
            } else {
                descriptionSB.append("</br>[npc.She] is not producing any milk.");
            }
        } else {
            if (owner.hasNippleOrificeModifier(OrificeModifier.PUFFY)) {
                descriptionSB.append(" [npc.Her] [npc.nipples] have swollen up to be exceptionally plump and puffy.");
            }
        }
    }
    return UtilText.parse(owner, descriptionSB.toString());
}
Also used : SexType(com.lilithsthrone.game.sex.SexType) FluidModifier(com.lilithsthrone.game.character.body.valueEnums.FluidModifier) PenetrationType(com.lilithsthrone.game.sex.PenetrationType) OrificeModifier(com.lilithsthrone.game.character.body.valueEnums.OrificeModifier)

Example 3 with FluidModifier

use of com.lilithsthrone.game.character.body.valueEnums.FluidModifier in project liliths-throne-public by Innoxia.

the class Body method getPenisDescription.

public String getPenisDescription(GameCharacter owner) {
    boolean isPlayer = owner.isPlayer();
    descriptionSB = new StringBuilder();
    Penis viewedPenis = penis;
    if (Main.game.getPlayer().hasIngestedPsychoactiveFluidType(FluidTypeBase.CUM)) {
        viewedPenis = new Penis(penis.getType(), (int) (penis.getRawSizeValue() * 2.25f), PenisGirth.FOUR_FAT.getValue(), penis.getTesticle().getTesticleSize().getValue() * 2, (int) ((penis.getTesticle().getRawCumProductionValue() + 100) * 3.25f), penis.getTesticle().getTesticleCount());
        descriptionSB.append("<i style='color:" + Colour.PSYCHOACTIVE.toWebHexString() + ";'>The psychoactive cum you recently ingested is causing your view of " + (owner.isPlayer() ? "your" : "[npc.name]'s") + " cock to be distorted!</i> ");
    }
    if (isPlayer) {
        descriptionSB.append("You have " + UtilText.generateSingularDeterminer(viewedPenis.getSize().getDescriptor()) + " " + viewedPenis.getSize().getDescriptor() + ", " + (viewedPenis.getGirth() == PenisGirth.TWO_AVERAGE ? "" : viewedPenis.getGirth().getName() + ", ") + (viewedPenis.getRawSizeValue() >= 1 ? viewedPenis.getRawSizeValue() + "-inch" : "sub-1-inch"));
    } else {
        descriptionSB.append("[npc.She] has " + UtilText.generateSingularDeterminer(viewedPenis.getSize().getDescriptor()) + " " + viewedPenis.getSize().getDescriptor() + ", " + (viewedPenis.getGirth() == PenisGirth.TWO_AVERAGE ? "" : viewedPenis.getGirth().getName() + ", ") + (viewedPenis.getRawSizeValue() >= 1 ? viewedPenis.getRawSizeValue() + "-inch" : "sub-1-inch"));
    }
    switch(viewedPenis.getType()) {
        case HUMAN:
            descriptionSB.append(" human cock");
            break;
        case DEMON_COMMON:
            descriptionSB.append(" demonic cock");
            break;
        case IMP:
            descriptionSB.append(" impish cock");
            break;
        case BOVINE:
            descriptionSB.append(" bovine cock");
            break;
        case CANINE:
            descriptionSB.append(" canine cock");
            break;
        case LUPINE:
            descriptionSB.append(" lupine cock");
            break;
        case FELINE:
            descriptionSB.append(" feline cock");
            break;
        case ALLIGATOR_MORPH:
            descriptionSB.append(" reptilian cock");
            break;
        case SQUIRREL:
            descriptionSB.append(" squirrel-like cock");
            break;
        case EQUINE:
            descriptionSB.append(" equine cock");
            break;
        case REINDEER_MORPH:
            descriptionSB.append(" rangiferine cock");
            break;
        case AVIAN:
            descriptionSB.append(" avian cock");
            break;
        case ANGEL:
            descriptionSB.append(" angelic cock");
            break;
        case NONE:
            break;
    }
    if (isPlayer) {
        descriptionSB.append(", which is " + getCoveredInDescriptor(owner) + " [pc.cockFullDescription(true)].");
    } else {
        descriptionSB.append(", which is " + getCoveredInDescriptor(owner) + " [npc.cockFullDescription(true)].");
    }
    for (PenisModifier pm : PenisModifier.values()) {
        if (owner.hasPenisModifier(pm)) {
            switch(pm) {
                case RIBBED:
                    descriptionSB.append(" It's lined with hard, fleshy ribs, which are sure to grant extra pleasure to any orifice that they penetrate.");
                    break;
                case TENTACLED:
                    descriptionSB.append(" A series of little tentacles coat its surface, which wriggle and squirm with a mind of their own.");
                    break;
                case BARBED:
                    descriptionSB.append(" Fleshy, backwards-facing barbs line its length.");
                    break;
                case BLUNT:
                    descriptionSB.append(" The head curves around to a smooth surface.");
                    break;
                case FLARED:
                    descriptionSB.append(" The head is wide and flared.");
                    break;
                case KNOTTED:
                    descriptionSB.append(" A fat knot sits at the base.");
                    break;
                case PREHENSILE:
                    descriptionSB.append(" It is prehensile, and can be manipulated and moved much like a primate's tail.");
                    break;
                case SHEATHED:
                    descriptionSB.append(" When not in use, it retreats back into the sheath at its base.");
                    break;
                case TAPERED:
                    descriptionSB.append(" The shaft is tapered, and gets thinner nearer to the head.");
                    break;
                case VEINY:
                    descriptionSB.append(" Large veins press out from its surface.");
                    break;
            }
        }
    }
    if (owner.isPlayer()) {
        if (!viewedPenis.isVirgin()) {
            for (OrificeType ot : OrificeType.values()) {
                if (owner.getVirginityLoss(new SexType(SexParticipantType.PITCHER, PenetrationType.PENIS, ot)) != null && !owner.getVirginityLoss(new SexType(SexParticipantType.PITCHER, PenetrationType.PENIS, ot)).isEmpty()) {
                    descriptionSB.append(" [style.colourArcane(You lost your penile virginity to " + owner.getVirginityLoss(new SexType(SexParticipantType.PITCHER, PenetrationType.PENIS, ot)) + ".)]");
                    break;
                }
            }
        } else {
            descriptionSB.append(" [style.colourGood(You have retained your penile virginity.)]");
        }
    } else {
        if (!viewedPenis.isVirgin()) {
            for (OrificeType ot : OrificeType.values()) {
                if (owner.getVirginityLoss(new SexType(SexParticipantType.PITCHER, PenetrationType.PENIS, ot)) != null && !owner.getVirginityLoss(new SexType(SexParticipantType.PITCHER, PenetrationType.PENIS, ot)).isEmpty()) {
                    descriptionSB.append(" [style.colourArcane([npc.Name] has lost [npc.her] penile virginity.)]");
                    break;
                }
            }
        } else {
            descriptionSB.append(" [style.colourGood([npc.Name] has retained [npc.her] penile virginity.)]");
        }
    }
    // Capacity:
    if (Capacity.getCapacityFromValue(viewedPenis.getOrificeUrethra().getStretchedCapacity()) != Capacity.ZERO_IMPENETRABLE) {
        if (isPlayer) {
            descriptionSB.append(" Your cock's urethra has been loosened enough that it presents a ready orifice for penetration," + " [style.colourSex(and can be comfortably penetrated by " + Capacity.getCapacityFromValue(viewedPenis.getOrificeUrethra().getStretchedCapacity()).getMaximumSizeComfortableWithLube().getDescriptor() + " cocks with sufficient lubrication.)]");
        } else {
            descriptionSB.append(" [npc.Her] cock's urethra has been loosened enough that it presents a ready orifice for penetration," + " [style.colourSex(and can be comfortably penetrated by " + Capacity.getCapacityFromValue(viewedPenis.getOrificeUrethra().getStretchedCapacity()).getMaximumSizeComfortableWithLube().getDescriptor() + " cocks with sufficient lubrication.)]");
        }
        switch(viewedPenis.getOrificeUrethra().getElasticity()) {
            case ZERO_UNYIELDING:
                descriptionSB.append(" <span style='color:" + Colour.GENERIC_SEX.toWebHexString() + ";'>It is extremely unyielding,");
                break;
            case ONE_RIGID:
                descriptionSB.append(" <span style='color:" + Colour.GENERIC_SEX.toWebHexString() + ";'>It takes a huge amount of effort to stretch it out,");
                break;
            case TWO_FIRM:
                descriptionSB.append(" <span style='color:" + Colour.GENERIC_SEX.toWebHexString() + ";'>It does not stretch very easily,");
                break;
            case THREE_FLEXIBLE:
                descriptionSB.append(" <span style='color:" + Colour.GENERIC_SEX.toWebHexString() + ";'>It reluctantly stretches out when used as a sexual orifice,");
                break;
            case FOUR_LIMBER:
                descriptionSB.append(" <span style='color:" + Colour.GENERIC_SEX.toWebHexString() + ";'>It is somewhat resistant to being stretched out,");
                break;
            case FIVE_STRETCHY:
                descriptionSB.append(" <span style='color:" + Colour.GENERIC_SEX.toWebHexString() + ";'>It stretches out fairly easily,");
                break;
            case SIX_SUPPLE:
                descriptionSB.append(" <span style='color:" + Colour.GENERIC_SEX.toWebHexString() + ";'>It stretches out very easily,");
                break;
            case SEVEN_ELASTIC:
                descriptionSB.append(" <span style='color:" + Colour.GENERIC_SEX.toWebHexString() + ";'>It is extremely elastic,");
                break;
            default:
                break;
        }
        switch(viewedPenis.getOrificeUrethra().getPlasticity()) {
            case ZERO_RUBBERY:
                descriptionSB.append(" and will instantly return to its original size.</span>");
                break;
            case ONE_SPRINGY:
                descriptionSB.append(" and returns to its original size within a matter of hours.</span>");
                break;
            case TWO_TENSILE:
                descriptionSB.append(" and returns to its original size within a day or so.</span>");
                break;
            case THREE_RESILIENT:
                descriptionSB.append(" and will return to its original size after a couple of days.</span>");
                break;
            case FOUR_ACCOMMODATING:
                descriptionSB.append(" and takes a while to return to its original size.</span>");
                break;
            case FIVE_YIELDING:
                descriptionSB.append(" and struggles to return to its original size.</span>");
                break;
            case SIX_MALLEABLE:
                descriptionSB.append(" and loses a good portion of its original tightness.</span>");
                break;
            case SEVEN_MOULDABLE:
                descriptionSB.append(" and once stretched out, it stays that way.</span>");
                break;
            default:
                break;
        }
        for (OrificeModifier om : OrificeModifier.values()) {
            if (owner.hasFaceOrificeModifier(om)) {
                if (owner.isPlayer()) {
                    switch(om) {
                        case PUFFY:
                            descriptionSB.append(" Your urethra has transformed into having a swollen, puffy rim.");
                            break;
                        case MUSCLE_CONTROL:
                            descriptionSB.append(" A series of muscles lining the inside of your urethra, allowing you to expertly squeeze and grip down on any intruding object.");
                            break;
                        case RIBBED:
                            descriptionSB.append(" The inside of your urethra is lined with sensitive, fleshy ribs, which grant you extra pleasure when stimulated.");
                            break;
                        case TENTACLED:
                            descriptionSB.append(" Your urethra is filled with tiny little tentacles, which wriggle and squirm with a mind of their own.");
                            break;
                    }
                } else {
                    switch(om) {
                        case PUFFY:
                            descriptionSB.append(" [npc.Her] urethra has transformed into having a swollen, puffy rim.");
                            break;
                        case MUSCLE_CONTROL:
                            descriptionSB.append(" [npc.She] has a series of muscles lining the inside of [npc.her] urethra, allowing [npc.herHim] to expertly squeeze and grip down on any intruding object.");
                            break;
                        case RIBBED:
                            descriptionSB.append(" The inside of [npc.her] urethra is lined with sensitive, fleshy ribs, which grant [npc.herHim] extra pleasure when stimulated.");
                            break;
                        case TENTACLED:
                            descriptionSB.append(" [npc.Her] urethra is filled with tiny little tentacles, which wriggle and squirm with a mind of their own.");
                            break;
                    }
                }
            }
        }
    }
    if (isPlayer && !owner.isUrethraVirgin()) {
        for (PenetrationType pt : PenetrationType.values()) {
            if (Main.game.getPlayer().getVirginityLoss(new SexType(SexParticipantType.CATCHER, pt, OrificeType.URETHRA)) != null && !Main.game.getPlayer().getVirginityLoss(new SexType(SexParticipantType.CATCHER, pt, OrificeType.URETHRA)).isEmpty()) {
                descriptionSB.append(" <span style='color:" + Colour.GENERIC_ARCANE.toWebHexString() + ";'>You lost your urethral virginity to " + Main.game.getPlayer().getVirginityLoss(new SexType(SexParticipantType.CATCHER, pt, OrificeType.URETHRA)) + ".</span>");
                break;
            }
        }
    }
    descriptionSB.append("</br>");
    // Pubic Hair:
    if (Main.game.isPubicHairEnabled()) {
        if (owner.getPubicHairType().getType() == BodyCoveringType.BODY_HAIR_SCALES_ALLIGATOR) {
            switch(owner.getPubicHair()) {
                case ZERO_NONE:
                    if (isPlayer) {
                        descriptionSB.append(" There's no trace of any rough " + owner.getPubicHairType().getName(owner) + " around the base of your cock.");
                    } else {
                        descriptionSB.append(" There's no trace of any rough  " + owner.getPubicHairType().getName(owner) + " around the base of [npc.her] cock.");
                    }
                    break;
                case ONE_STUBBLE:
                    if (isPlayer) {
                        descriptionSB.append(" You have a small amount of rough " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of your cock.");
                    } else {
                        descriptionSB.append(" [npc.She] has a small amount of rough " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of [npc.her] cock.");
                    }
                    break;
                case TWO_MANICURED:
                    if (isPlayer) {
                        descriptionSB.append(" You have a rough patch of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of your cock.");
                    } else {
                        descriptionSB.append(" [npc.She] has a rough patch of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of [npc.her] cock.");
                    }
                    break;
                case THREE_TRIMMED:
                    if (isPlayer) {
                        descriptionSB.append(" You have a rough patch of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of your cock.");
                    } else {
                        descriptionSB.append(" [npc.She] has a rough patch of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of [npc.her] cock.");
                    }
                    break;
                case FOUR_NATURAL:
                    if (isPlayer) {
                        descriptionSB.append(" You have a natural amount of rough " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of your cock.");
                    } else {
                        descriptionSB.append(" [npc.She] has a natural amount of rough " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of [npc.her] cock.");
                    }
                    break;
                case FIVE_UNKEMPT:
                    if (isPlayer) {
                        descriptionSB.append(" You have an unkempt mass of rough " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of your cock.");
                    } else {
                        descriptionSB.append(" [npc.She] has an unkempt mass of rough " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of [npc.her] cock.");
                    }
                    break;
                case SIX_BUSHY:
                    if (isPlayer) {
                        descriptionSB.append(" You have a thick, rough mass of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of your cock.");
                    } else {
                        descriptionSB.append(" [npc.She] has a thick, rough mass of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of [npc.her] cock.");
                    }
                    break;
                case SEVEN_WILD:
                    if (isPlayer) {
                        descriptionSB.append(" You have a wild, rough mass of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of your cock.");
                    } else {
                        descriptionSB.append(" [npc.She] has a wild, rough mass of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of [npc.her] cock.");
                    }
                    break;
            }
        } else {
            switch(owner.getPubicHair()) {
                case ZERO_NONE:
                    if (isPlayer) {
                        descriptionSB.append(" There is no trace of any " + owner.getPubicHairType().getName(owner) + " around the base of your cock.");
                    } else {
                        descriptionSB.append(" There is no trace of any " + owner.getPubicHairType().getName(owner) + " around the base of [npc.her] cock.");
                    }
                    break;
                case ONE_STUBBLE:
                    if (isPlayer) {
                        descriptionSB.append(" You have a stubbly patch of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of your cock.");
                    } else {
                        descriptionSB.append(" [npc.She] has a stubbly patch of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of [npc.her] cock.");
                    }
                    break;
                case TWO_MANICURED:
                    if (isPlayer) {
                        descriptionSB.append(" You have a neat, manicured patch of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of your cock.");
                    } else {
                        descriptionSB.append(" [npc.She] has a neat, manicured patch of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of [npc.her] cock.");
                    }
                    break;
                case THREE_TRIMMED:
                    if (isPlayer) {
                        descriptionSB.append(" You have a trimmed patch of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of your cock.");
                    } else {
                        descriptionSB.append(" [npc.She] has a trimmed patch of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of [npc.her] cock.");
                    }
                    break;
                case FOUR_NATURAL:
                    if (isPlayer) {
                        descriptionSB.append(" You have a natural bush of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of your cock.");
                    } else {
                        descriptionSB.append(" [npc.She] has a natural bush of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of [npc.her] cock.");
                    }
                    break;
                case FIVE_UNKEMPT:
                    if (isPlayer) {
                        descriptionSB.append(" You have an unkempt bush of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of your cock.");
                    } else {
                        descriptionSB.append(" [npc.She] has an unkempt bush of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of [npc.her] cock.");
                    }
                    break;
                case SIX_BUSHY:
                    if (isPlayer) {
                        descriptionSB.append(" You have a thick, bushy mass of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of your cock.");
                    } else {
                        descriptionSB.append(" [npc.She] has a thick, bushy mass of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of [npc.her] cock.");
                    }
                    break;
                case SEVEN_WILD:
                    if (isPlayer) {
                        descriptionSB.append(" You have a wild, bushy mass of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of your cock.");
                    } else {
                        descriptionSB.append(" [npc.She] has a wild, bushy mass of " + owner.getPubicHairType().getFullDescription(owner, true) + " around the base of [npc.her] cock.");
                    }
                    break;
            }
        }
    }
    descriptionSB.append("</br>");
    if (owner.isInternalTesticles()) {
        if (isPlayer) {
            descriptionSB.append(" Your [pc.ballsCount] [pc.balls+] have shifted to sit inside your body, leaving your [pc.cock] as the only visible part of your male reproductive organs.");
        } else {
            descriptionSB.append(" [npc.Her] [npc.ballsCount] [npc.balls+] have shifted to sit inside [npc.her] body, leaving [npc.her] [npc.cock] as the only visible part of [npc.her] male reproductive organs.");
        }
    } else {
        switch(viewedPenis.getTesticle().getTesticleSize()) {
            case ZERO_VESTIGIAL:
                if (isPlayer) {
                    descriptionSB.append(" Your [pc.ballsCount] [pc.balls] are " + getCoveredInDescriptor(owner) + " [pc.ballFullDescription(true)], and are so small that they're only just visible as tiny little mounds nestling beneath your [pc.cock].");
                } else {
                    descriptionSB.append(" [npc.Her] [npc.ballsCount] [npc.balls] are " + getCoveredInDescriptor(owner) + " [npc.ballFullDescription(true)], and are so small that they're only just visible as tiny little mounds nestling beneath [npc.her] [npc.cock].");
                }
                break;
            case ONE_TINY:
                if (isPlayer)
                    descriptionSB.append(" Your [pc.ballsCount] [pc.balls] are " + getCoveredInDescriptor(owner) + " [pc.ballFullDescription(true)], and are small enough to comfortably nestle underneath your [pc.cock].");
                else
                    descriptionSB.append(" [npc.Her] [npc.ballsCount] [npc.balls] are " + getCoveredInDescriptor(owner) + " [npc.ballFullDescription(true)], and are small enough to comfortably nestle underneath [npc.her] [npc.cock].");
                break;
            case TWO_AVERAGE:
                if (isPlayer)
                    descriptionSB.append(" Your [pc.ballsCount] [pc.balls+] are " + getCoveredInDescriptor(owner) + " [pc.ballFullDescription(true)], and dangle down beneath your [pc.cock].");
                else
                    descriptionSB.append(" [npc.Her] [npc.ballsCount] [npc.balls+] are " + getCoveredInDescriptor(owner) + " [npc.ballFullDescription(true)], and dangle down beneath [npc.her] [npc.cock].");
                break;
            case THREE_LARGE:
                if (isPlayer)
                    descriptionSB.append(" Your [pc.ballsCount] [pc.balls+] are " + getCoveredInDescriptor(owner) + " [pc.ballFullDescription(true)], and hang down beneath your [pc.cock].");
                else
                    descriptionSB.append(" [npc.Her] [npc.ballsCount] [npc.balls+] are " + getCoveredInDescriptor(owner) + " [npc.ballFullDescription(true)], and hang down beneath [npc.her] [npc.cock].");
                break;
            case FOUR_HUGE:
                if (isPlayer)
                    descriptionSB.append(" Your [pc.ballsCount] [pc.balls+] are " + getCoveredInDescriptor(owner) + " [pc.ballFullDescription(true)], and hang down beneath your [pc.cock].");
                else
                    descriptionSB.append(" [npc.Her] [npc.ballsCount] [npc.balls+] are " + getCoveredInDescriptor(owner) + " [npc.ballFullDescription(true)], and hang down beneath [npc.her] [npc.cock].");
                break;
            case FIVE_MASSIVE:
                if (isPlayer)
                    descriptionSB.append(" Your [pc.ballsCount] [pc.balls+] are " + getCoveredInDescriptor(owner) + " [pc.ballFullDescription(true)], and hang down beneath your [pc.cock].");
                else
                    descriptionSB.append(" [npc.Her] [npc.ballsCount] [npc.balls+] are " + getCoveredInDescriptor(owner) + " [npc.ballFullDescription(true)], and hang down beneath [npc.her] [npc.cock].");
                break;
            case SIX_GIGANTIC:
                if (isPlayer)
                    descriptionSB.append(" Your [pc.ballsCount] [pc.balls+] are " + getCoveredInDescriptor(owner) + " [pc.ballFullDescription(true)], and hang down beneath your [pc.cock].");
                else
                    descriptionSB.append(" [npc.Her] [npc.ballsCount] [npc.balls+] are " + getCoveredInDescriptor(owner) + " [npc.ballFullDescription(true)], and hang down beneath [npc.her] [npc.cock].");
                break;
            case SEVEN_ABSURD:
                if (isPlayer)
                    descriptionSB.append(" Your [pc.ballsCount] [pc.balls+] are " + getCoveredInDescriptor(owner) + " [pc.ballFullDescription(true)], and hang down beneath your [pc.cock].");
                else
                    descriptionSB.append(" [npc.Her] [npc.ballsCount] [npc.balls+] are " + getCoveredInDescriptor(owner) + " [npc.ballFullDescription(true)], and hang down beneath [npc.her] [npc.cock].");
                break;
        }
    }
    String cumName = "[npc.cum+]";
    if (owner.isPlayer()) {
        cumName = "[pc.cum+]";
    }
    switch(viewedPenis.getTesticle().getCumProduction()) {
        case ZERO_NONE:
            if (viewedPenis.getTesticle().getTesticleSize().getValue() > TesticleSize.TWO_AVERAGE.getValue()) {
                descriptionSB.append(" Despite their large size, they");
            } else {
                descriptionSB.append(" They");
            }
            descriptionSB.append(" don't produce any " + cumName + " at all.");
            break;
        case ONE_TRICKLE:
            if (viewedPenis.getTesticle().getTesticleSize().getValue() > TesticleSize.TWO_AVERAGE.getValue()) {
                descriptionSB.append(" Despite their large size, they");
            } else {
                descriptionSB.append(" They");
            }
            descriptionSB.append(" only produce a tiny trickle of " + cumName + " at each orgasm.");
            break;
        case TWO_SMALL_AMOUNT:
            if (viewedPenis.getTesticle().getTesticleSize().getValue() > TesticleSize.THREE_LARGE.getValue()) {
                descriptionSB.append(" Despite their large size, they");
            } else {
                descriptionSB.append(" They");
            }
            descriptionSB.append(" only produce a small amount of " + cumName + " at each orgasm.");
            break;
        case THREE_AVERAGE:
            if (viewedPenis.getTesticle().getTesticleSize().getValue() > TesticleSize.FOUR_HUGE.getValue()) {
                descriptionSB.append(" Despite their huge size, they only");
            } else {
                descriptionSB.append(" They");
            }
            descriptionSB.append(" produce an average amount of " + cumName + " at each orgasm.");
            break;
        case FOUR_LARGE:
            if (viewedPenis.getTesticle().getTesticleSize().getValue() < TesticleSize.TWO_AVERAGE.getValue()) {
                descriptionSB.append(" Despite their small size, they");
            } else {
                descriptionSB.append(" They");
            }
            descriptionSB.append(" produce a large amount of " + cumName + " at each orgasm.");
            break;
        case FIVE_HUGE:
            if (viewedPenis.getTesticle().getTesticleSize().getValue() < TesticleSize.TWO_AVERAGE.getValue()) {
                descriptionSB.append(" Despite their small size, they");
            } else {
                descriptionSB.append(" They");
            }
            descriptionSB.append(" produce a huge amount of " + cumName + " at each orgasm.");
            break;
        case SIX_EXTREME:
            if (viewedPenis.getTesticle().getTesticleSize().getValue() < TesticleSize.TWO_AVERAGE.getValue()) {
                descriptionSB.append(" Despite their small size, they");
            } else {
                descriptionSB.append(" They");
            }
            descriptionSB.append(" produce an extreme amount of " + cumName + " at each orgasm.");
            break;
        case SEVEN_MONSTROUS:
            if (viewedPenis.getTesticle().getTesticleSize().getValue() < TesticleSize.TWO_AVERAGE.getValue()) {
                descriptionSB.append(" Despite their small size, they");
            } else {
                descriptionSB.append(" They");
            }
            descriptionSB.append(" produce a monstrous amount of " + cumName + " at each orgasm.");
            break;
    }
    if (owner.isPlayer()) {
        descriptionSB.append(" Your [pc.cum]");
    } else {
        descriptionSB.append(" [npc.Her] [npc.cum]");
    }
    switch(viewedPenis.getTesticle().getCum().getFlavour()) {
        case CHOCOLATE:
            descriptionSB.append(" tastes of chocolate.");
            break;
        case CUM:
            descriptionSB.append(", much to nobody's surprise, tastes like cum.");
            break;
        case GIRL_CUM:
            descriptionSB.append(" tastes of girl-cum.");
            break;
        case HONEY:
            descriptionSB.append(" tastes of honey.");
            break;
        case MILK:
            descriptionSB.append(" tastes like milk.");
            break;
        case MINT:
            descriptionSB.append(" tastes of mint.");
            break;
        case PINEAPPLE:
            descriptionSB.append(" tastes of pineapple.");
            break;
        case SLIME:
            descriptionSB.append(" is mostly tasteless, but very sweet.");
            break;
        case STRAWBERRY:
            descriptionSB.append(" tastes of strawberries.");
            break;
        case BEER:
            descriptionSB.append(", which tastes like beer.");
            break;
        case VANILLA:
            descriptionSB.append(", which tastes of vanilla.");
            break;
    }
    for (FluidModifier fm : FluidModifier.values()) {
        if (owner.hasCumModifier(fm)) {
            switch(fm) {
                case ADDICTIVE:
                    descriptionSB.append(" It is highly addictive, and anyone who drinks too much will quickly become dependent on it.");
                    break;
                case BUBBLING:
                    descriptionSB.append(" It fizzes and bubbles like a carbonated drink.");
                    break;
                case HALLUCINOGENIC:
                    descriptionSB.append(" Anyone who ingests it suffers psychoactive effects, which can manifest in cum-related hallucinations or sensitivity to hypnotic suggestion.");
                    break;
                case MUSKY:
                    descriptionSB.append(" It has a strong, musky smell.");
                    break;
                case SLIMY:
                    descriptionSB.append(" It has a slimy, oily texture.");
                    break;
                case STICKY:
                    descriptionSB.append(" It's quite sticky, and is difficult to fully wash off without soap.");
                    break;
                case VISCOUS:
                    descriptionSB.append(" It's quite viscous, and slowly drips in large globules, much like thick treacle.");
                    break;
                case ALCOHOLIC:
                    descriptionSB.append(" It has a high alcohol content, and will get those who consume it very drunk.");
                    break;
            }
        }
    }
    return UtilText.parse(owner, descriptionSB.toString());
}
Also used : SexType(com.lilithsthrone.game.sex.SexType) FluidModifier(com.lilithsthrone.game.character.body.valueEnums.FluidModifier) OrificeType(com.lilithsthrone.game.sex.OrificeType) PenetrationType(com.lilithsthrone.game.sex.PenetrationType) PenisModifier(com.lilithsthrone.game.character.body.valueEnums.PenisModifier) OrificeModifier(com.lilithsthrone.game.character.body.valueEnums.OrificeModifier)

Example 4 with FluidModifier

use of com.lilithsthrone.game.character.body.valueEnums.FluidModifier in project liliths-throne-public by Innoxia.

the class FluidCum method saveAsXML.

public Element saveAsXML(Element parentElement, Document doc) {
    Element element = doc.createElement("cum");
    parentElement.appendChild(element);
    CharacterUtils.addAttribute(doc, element, "type", this.type.toString());
    CharacterUtils.addAttribute(doc, element, "flavour", this.flavour.toString());
    Element cumModifiers = doc.createElement("cumModifiers");
    element.appendChild(cumModifiers);
    for (FluidModifier fm : FluidModifier.values()) {
        CharacterUtils.addAttribute(doc, cumModifiers, fm.toString(), String.valueOf(this.hasFluidModifier(fm)));
    }
    return element;
}
Also used : FluidModifier(com.lilithsthrone.game.character.body.valueEnums.FluidModifier) Element(org.w3c.dom.Element)

Example 5 with FluidModifier

use of com.lilithsthrone.game.character.body.valueEnums.FluidModifier in project liliths-throne-public by Innoxia.

the class FluidCum method loadFromXML.

public static FluidCum loadFromXML(Element parentElement, Document doc) {
    Element cum = (Element) parentElement.getElementsByTagName("cum").item(0);
    FluidCum fluidCum = new FluidCum(FluidType.valueOf(cum.getAttribute("type")));
    fluidCum.flavour = (FluidFlavour.valueOf(cum.getAttribute("flavour")));
    Element cumModifiers = (Element) cum.getElementsByTagName("cumModifiers").item(0);
    for (FluidModifier fm : FluidModifier.values()) {
        if (Boolean.valueOf(cumModifiers.getAttribute(fm.toString()))) {
            fluidCum.fluidModifiers.add(fm);
        }
    }
    return fluidCum;
}
Also used : FluidModifier(com.lilithsthrone.game.character.body.valueEnums.FluidModifier) Element(org.w3c.dom.Element)

Aggregations

FluidModifier (com.lilithsthrone.game.character.body.valueEnums.FluidModifier)8 Element (org.w3c.dom.Element)6 OrificeModifier (com.lilithsthrone.game.character.body.valueEnums.OrificeModifier)4 PenisModifier (com.lilithsthrone.game.character.body.valueEnums.PenisModifier)3 BodyCoveringType (com.lilithsthrone.game.character.body.types.BodyCoveringType)2 TongueModifier (com.lilithsthrone.game.character.body.valueEnums.TongueModifier)2 PenetrationType (com.lilithsthrone.game.sex.PenetrationType)2 SexType (com.lilithsthrone.game.sex.SexType)2 BodyHair (com.lilithsthrone.game.character.body.valueEnums.BodyHair)1 BodyMaterial (com.lilithsthrone.game.character.body.valueEnums.BodyMaterial)1 BreastShape (com.lilithsthrone.game.character.body.valueEnums.BreastShape)1 CoveringModifier (com.lilithsthrone.game.character.body.valueEnums.CoveringModifier)1 GenitalArrangement (com.lilithsthrone.game.character.body.valueEnums.GenitalArrangement)1 OrificeType (com.lilithsthrone.game.sex.OrificeType)1 HashMap (java.util.HashMap)1