Search in sources :

Example 1 with PenetrationType

use of com.lilithsthrone.game.sex.PenetrationType in project liliths-throne-public by Innoxia.

the class Body method getVaginaDescription.

public String getVaginaDescription(GameCharacter owner) {
    boolean isPlayer = owner.isPlayer();
    descriptionSB = new StringBuilder();
    Vagina viewedVagina = vagina;
    if (Main.game.getPlayer().hasIngestedPsychoactiveFluidType(FluidTypeBase.GIRLCUM)) {
        viewedVagina = new Vagina(vagina.getType(), vagina.getRawLabiaSizeValue(), vagina.getRawClitorisSizeValue(), Wetness.SEVEN_DROOLING.getValue(), vagina.getOrificeVagina().getRawCapacityValue() * 3, vagina.getOrificeVagina().getElasticity().getValue(), vagina.getOrificeVagina().getPlasticity().getValue(), vagina.getOrificeVagina().isVirgin());
        viewedVagina.setPierced(owner, vagina.isPierced());
        descriptionSB.append("<i style='color:" + Colour.PSYCHOACTIVE.toWebHexString() + ";'>The psychoactive girlcum which you recently ingested is causing your view of " + (owner.isPlayer() ? "your" : "[npc.name]'s") + " pussy to be distorted!</i> ");
    }
    if (isPlayer) {
        if (penis.getType() != PenisType.NONE)
            descriptionSB.append("Beneath your [pc.penis], you have");
        else
            descriptionSB.append("Between your legs, you have");
    } else {
        if (penis.getType() != PenisType.NONE)
            descriptionSB.append("Beneath [npc.her] [npc.penis], [npc.she] has");
        else
            descriptionSB.append("Between [npc.her] legs, [npc.she] has");
    }
    switch(viewedVagina.getType()) {
        case HUMAN:
            if (isPlayer) {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " a") + " human pussy, with [pc.labiaSize], [pc.pussyPrimaryColour(true)] labia and [pc.pussySecondaryColour(true)] inner-walls.");
            } else {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " a") + " human pussy, with [npc.labiaSize], [npc.pussyPrimaryColour(true)] labia and [npc.pussySecondaryColour(true)] inner-walls.");
            }
            break;
        case ANGEL:
            if (isPlayer) {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " an") + " angelic pussy, with [pc.labiaSize], [pc.pussyPrimaryColour(true)] labia and [pc.pussySecondaryColour(true)] inner-walls.");
            } else {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " an") + " angelic pussy, with [npc.labiaSize], [npc.pussyPrimaryColour(true)] labia and [npc.pussySecondaryColour(true)] inner-walls.");
            }
            break;
        case DEMON_COMMON:
            if (isPlayer) {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " a") + " demonic pussy, with [pc.labiaSize], [pc.pussyPrimaryColour(true)] labia and [pc.pussySecondaryColour(true)] inner-walls.");
            } else {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " a") + " demonic pussy, with [npc.labiaSize], [npc.pussyPrimaryColour(true)] labia and [npc.pussySecondaryColour(true)] inner-walls.");
            }
            break;
        case DOG_MORPH:
            if (isPlayer) {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " a") + " canine pussy, with [pc.labiaSize], [pc.pussyPrimaryColour(true)] labia and [pc.pussySecondaryColour(true)] inner-walls.");
            } else {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " a") + " canine pussy, with [npc.labiaSize], [npc.pussyPrimaryColour(true)] labia and [npc.pussySecondaryColour(true)] inner-walls.");
            }
            break;
        case WOLF_MORPH:
            if (isPlayer) {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " a") + " lupine pussy, with [pc.labiaSize], [pc.pussyPrimaryColour(true)] labia and [pc.pussySecondaryColour(true)] inner-walls.");
            } else {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " a") + " lupine pussy, with [npc.labiaSize], [npc.pussyPrimaryColour(true)] labia and [npc.pussySecondaryColour(true)] inner-walls.");
            }
            break;
        case ALLIGATOR_MORPH:
            if (isPlayer) {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " a") + " reptilian pussy, with [pc.labiaSize], [pc.pussyPrimaryColour(true)] labia and [pc.pussySecondaryColour(true)] inner-walls.");
            } else {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " a") + " reptilian pussy, with [npc.labiaSize], [npc.pussyPrimaryColour(true)] labia and [npc.pussySecondaryColour(true)] inner-walls.");
            }
            break;
        case CAT_MORPH:
            if (isPlayer) {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " a") + " feline pussy, with [pc.labiaSize], [pc.pussyPrimaryColour(true)] labia and [pc.pussySecondaryColour(true)] inner-walls.");
            } else {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " a") + " feline pussy, with [npc.labiaSize], [npc.pussyPrimaryColour(true)] labia and [npc.pussySecondaryColour(true)] inner-walls.");
            }
            break;
        case COW_MORPH:
            if (isPlayer) {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " a") + " bovine pussy, with [pc.labiaSize], [pc.pussyPrimaryColour(true)] labia and [pc.pussySecondaryColour(true)] inner-walls.");
            } else {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " a") + " bovine pussy, with [npc.labiaSize], [npc.pussyPrimaryColour(true)] labia and [npc.pussySecondaryColour(true)] inner-walls.");
            }
            break;
        case SQUIRREL_MORPH:
            if (isPlayer) {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " a") + " squirrel-morph's pussy, with [pc.labiaSize], [pc.pussyPrimaryColour(true)] labia and [pc.pussySecondaryColour(true)] inner-walls.");
            } else {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " a") + " squirrel-morph's pussy, with [npc.labiaSize], [npc.pussyPrimaryColour(true)] labia and [npc.pussySecondaryColour(true)] inner-walls.");
            }
            break;
        case HORSE_MORPH:
            if (isPlayer) {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " an") + " equine pussy, with [pc.labiaSize], [pc.pussyPrimaryColour(true)] labia and [pc.pussySecondaryColour(true)] inner-walls.");
            } else {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " an") + " equine pussy, with [npc.labiaSize], [npc.pussyPrimaryColour(true)] labia and [npc.pussySecondaryColour(true)] inner-walls.");
            }
            break;
        case REINDEER_MORPH:
            if (isPlayer) {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " an") + " rangiferine pussy, with [pc.labiaSize], [pc.pussyPrimaryColour(true)] labia and [pc.pussySecondaryColour(true)] inner-walls.");
            } else {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " an") + " rangiferine pussy, with [npc.labiaSize], [npc.pussyPrimaryColour(true)] labia and [npc.pussySecondaryColour(true)] inner-walls.");
            }
            break;
        case HARPY:
            if (isPlayer) {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " an") + " avian pussy, with [pc.labiaSize], [pc.pussyPrimaryColour(true)] labia and [pc.pussySecondaryColour(true)] inner-walls.");
            } else {
                descriptionSB.append((viewedVagina.isPierced() ? " a pierced," : " an") + " avian pussy, with [npc.labiaSize], [npc.pussyPrimaryColour(true)] labia and [npc.pussySecondaryColour(true)] inner-walls.");
            }
            break;
        default:
            break;
    }
    // Pubic Hair:
    if (Main.game.isPubicHairEnabled()) {
        switch(owner.getPubicHair()) {
            case ZERO_NONE:
                if (isPlayer) {
                    descriptionSB.append(" There is no trace of any " + owner.getPubicHairType().getName(owner) + " around your pussy.");
                } else {
                    descriptionSB.append(" There is no trace of any " + owner.getPubicHairType().getName(owner) + " around [npc.her] pussy.");
                }
                break;
            case ONE_STUBBLE:
                if (isPlayer) {
                    descriptionSB.append(" You have a stubbly patch of " + owner.getPubicHairType().getFullDescription(owner, true) + " around your pussy.");
                } else {
                    descriptionSB.append(" [npc.She] has a stubbly patch of " + owner.getPubicHairType().getFullDescription(owner, true) + " around [npc.her] pussy.");
                }
                break;
            case TWO_MANICURED:
                if (isPlayer) {
                    descriptionSB.append(" You have a neat, manicured patch of " + owner.getPubicHairType().getFullDescription(owner, true) + " around your pussy.");
                } else {
                    descriptionSB.append(" [npc.She] has a neat, manicured patch of " + owner.getPubicHairType().getFullDescription(owner, true) + " around [npc.her] pussy.");
                }
                break;
            case THREE_TRIMMED:
                if (isPlayer) {
                    descriptionSB.append(" You have a trimmed patch of " + owner.getPubicHairType().getFullDescription(owner, true) + " around your pussy.");
                } else {
                    descriptionSB.append(" [npc.She] has a trimmed patch of " + owner.getPubicHairType().getFullDescription(owner, true) + " around [npc.her] pussy.");
                }
                break;
            case FOUR_NATURAL:
                if (isPlayer) {
                    descriptionSB.append(" You have a natural bush of " + owner.getPubicHairType().getFullDescription(owner, true) + " around your pussy.");
                } else {
                    descriptionSB.append(" [npc.She] has a natural bush of " + owner.getPubicHairType().getFullDescription(owner, true) + " around [npc.her] pussy.");
                }
                break;
            case FIVE_UNKEMPT:
                if (isPlayer) {
                    descriptionSB.append(" You have an unkempt bush of " + owner.getPubicHairType().getFullDescription(owner, true) + " around your pussy.");
                } else {
                    descriptionSB.append(" [npc.She] has an unkempt bush of " + owner.getPubicHairType().getFullDescription(owner, true) + " around [npc.her] pussy.");
                }
                break;
            case SIX_BUSHY:
                if (isPlayer) {
                    descriptionSB.append(" You have a thick, bushy mass of " + owner.getPubicHairType().getFullDescription(owner, true) + " around your pussy.");
                } else {
                    descriptionSB.append(" [npc.She] has a thick, bushy mass of " + owner.getPubicHairType().getFullDescription(owner, true) + " around [npc.her] pussy.");
                }
                break;
            case SEVEN_WILD:
                if (isPlayer) {
                    descriptionSB.append(" You have a wild, bushy mass of " + owner.getPubicHairType().getFullDescription(owner, true) + " around your pussy.");
                } else {
                    descriptionSB.append(" [npc.She] has a wild, bushy mass of " + owner.getPubicHairType().getFullDescription(owner, true) + " around [npc.her] pussy.");
                }
                break;
        }
    }
    if (isPlayer) {
        if (owner.getVaginaRawClitorisSizeValue() == 0) {
            descriptionSB.append(" You have [pc.a_clitSize] clit, which measures less than one inch in length.");
        } else {
            descriptionSB.append(" You have [pc.a_clitSize] clit, which measures [pc.clitSizeInches] inch" + (owner.getVaginaRawClitorisSizeValue() == 1 ? "" : "es") + " long.");
        }
    } else {
        if (owner.getVaginaRawClitorisSizeValue() == 0) {
            descriptionSB.append(" [npc.She] has [npc.a_clitSize] clit, which measures less than one inch in length.");
        } else {
            descriptionSB.append(" [npc.She] has [npc.a_clitSize] clit, which measures [npc.clitSizeInches] inch" + (owner.getVaginaRawClitorisSizeValue() == 1 ? "" : "es") + " long.");
        }
    }
    // Virgin/capacity:
    if (viewedVagina.getOrificeVagina().isVirgin()) {
        if (isPlayer) {
            descriptionSB.append(" [style.colourSex(Within your " + Capacity.getCapacityFromValue(viewedVagina.getOrificeVagina().getStretchedCapacity()).getDescriptor() + " [pc.pussy], your hymen is still intact, as it has never been penetrated before.)]" + " [style.colourGood(You have retained your vaginal virginity.)]");
        } else {
            descriptionSB.append(" [style.colourSex(Within [npc.her] " + Capacity.getCapacityFromValue(viewedVagina.getOrificeVagina().getStretchedCapacity()).getDescriptor() + " [npc.pussy], [npc.her] hymen is still intact, as it has never been penetrated before.)]" + " [style.colourGood([npc.She] has retained [npc.her] vaginal virginity.)]");
        }
    } else {
        if (isPlayer) {
            descriptionSB.append(" [style.colourSex(Your pussy is " + Capacity.getCapacityFromValue(viewedVagina.getOrificeVagina().getStretchedCapacity()).getDescriptor() + ", and can comfortably take " + Capacity.getCapacityFromValue(viewedVagina.getOrificeVagina().getStretchedCapacity()).getMaximumSizeComfortableWithLube().getDescriptor() + " cocks with sufficient lubrication.)]");
            for (PenetrationType pt : PenetrationType.values()) {
                if (Main.game.getPlayer().getVirginityLoss(new SexType(SexParticipantType.CATCHER, pt, OrificeType.VAGINA)) != null && !Main.game.getPlayer().getVirginityLoss(new SexType(SexParticipantType.CATCHER, pt, OrificeType.VAGINA)).isEmpty() && pt.isTakesVirginity()) {
                    descriptionSB.append(" <span style='color:" + Colour.GENERIC_ARCANE.toWebHexString() + ";'>You lost your virginity to " + Main.game.getPlayer().getVirginityLoss(new SexType(SexParticipantType.CATCHER, pt, OrificeType.VAGINA)) + ".</span>");
                    break;
                }
            }
        } else {
            descriptionSB.append(" [style.colourSex([npc.Her] pussy is " + Capacity.getCapacityFromValue(viewedVagina.getOrificeVagina().getStretchedCapacity()).getDescriptor() + ", and can comfortably take " + Capacity.getCapacityFromValue(viewedVagina.getOrificeVagina().getStretchedCapacity()).getMaximumSizeComfortableWithLube().getDescriptor() + " cocks with sufficient lubrication.)]");
        }
    }
    // Wetness:
    switch(viewedVagina.getOrificeVagina().getWetness(owner)) {
        case ZERO_DRY:
            if (isPlayer) {
                descriptionSB.append(" [style.colourSex(It's completely dry and never gets wet, no matter how aroused you are.)]");
            } else {
                descriptionSB.append(" [style.colourSex(It's completely dry and never gets wet, no matter how aroused [npc.she] gets.)]");
            }
            break;
        case ONE_SLIGHTLY_MOIST:
            if (isPlayer) {
                descriptionSB.append(" [style.colourSex(It's slightly moist, and you need a huge amount of stimulation before you get wet.)]");
            } else {
                descriptionSB.append(" [style.colourSex(It's slightly moist, and [npc.she] needs a huge amount of stimulation before [npc.she] gets wet.)]");
            }
            break;
        case TWO_MOIST:
            if (isPlayer) {
                descriptionSB.append(" [style.colourSex(It's moist, but you still need a lot of stimulation before you get wet.)]");
            } else {
                descriptionSB.append(" [style.colourSex(It's moist, but [npc.she] still needs a lot of stimulation before [npc.she] gets wet.)]");
            }
            break;
        case THREE_WET:
            if (isPlayer) {
                descriptionSB.append(" [style.colourSex(You only need a small amount of foreplay before it gets wet enough for penetration.)]");
            } else {
                descriptionSB.append(" [style.colourSex([npc.She] only needs a small amount of foreplay before [npc.she] gets wet enough for penetration.)]");
            }
            break;
        case FOUR_SLIMY:
            if (isPlayer) {
                descriptionSB.append(" [style.colourSex(It's always slimy and wet, and you're ready for penetration at a moment's notice.)]");
            } else {
                descriptionSB.append(" [style.colourSex(It's always slimy and wet, and [npc.she]'s ready for penetration at a moment's notice.)]");
            }
            break;
        case FIVE_SLOPPY:
            if (isPlayer) {
                descriptionSB.append(" [style.colourSex(Its surface is always coated in slimy moisture, and within, your pussy is sloppy and practically begging to be fucked.)]");
            } else {
                descriptionSB.append(" [style.colourSex(Its surface is always coated in slimy moisture, and within, [npc.her] pussy is sloppy and practically begging to be fucked.)]");
            }
            break;
        case SIX_SOPPING_WET:
            if (isPlayer) {
                descriptionSB.append(" [style.colourSex(Your pussy is never anything less than sopping wet, and a trickle of your natural lubricant constantly dribbles from your slit.)]");
            } else {
                descriptionSB.append(" [style.colourSex([npc.Her] pussy is never anything less than sopping wet, and a trickle of [npc.her] natural lubricant constantly dribbles from [npc.her] slit.)]");
            }
            break;
        case SEVEN_DROOLING:
            if (isPlayer) {
                descriptionSB.append(" [style.colourSex(Your pussy is so wet that it audibly squelches with every step you take, and a constant stream of juices flow from your inviting cunt.)]");
            } else {
                descriptionSB.append(" [style.colourSex([npc.Her] pussy is so wet that it audibly squelches with every step [npc.she] takes, and a constant stream of juices flow from [npc.her] inviting cunt.)]");
            }
            break;
        default:
            break;
    }
    if (viewedVagina.getOrificeVagina().isSquirter()) {
        if (isPlayer) {
            descriptionSB.append(" [style.colourSex(You are a squirter, and produce a considerable amount of female ejaculate each time you orgasm.)]");
        } else {
            descriptionSB.append(" [style.colourSex([npc.She] is a squirter, and produces a considerable amount of female ejaculate each time [npc.she] orgasms.)]");
        }
    }
    // Elasticity & plasticity:
    switch(viewedVagina.getOrificeVagina().getElasticity()) {
        case ZERO_UNYIELDING:
            descriptionSB.append(" [style.colourSex(It is extremely unyielding,");
            break;
        case ONE_RIGID:
            descriptionSB.append(" [style.colourSex(It takes a huge amount of effort to stretch it out,");
            break;
        case TWO_FIRM:
            descriptionSB.append(" [style.colourSex(It does not stretch very easily,");
            break;
        case THREE_FLEXIBLE:
            descriptionSB.append(" [style.colourSex(It reluctantly stretches out when used as a sexual orifice,");
            break;
        case FOUR_LIMBER:
            descriptionSB.append(" [style.colourSex(It is somewhat resistant to being stretched out,");
            break;
        case FIVE_STRETCHY:
            descriptionSB.append(" [style.colourSex(It stretches out fairly easily,");
            break;
        case SIX_SUPPLE:
            descriptionSB.append(" [style.colourSex(It stretches out very easily,");
            break;
        case SEVEN_ELASTIC:
            descriptionSB.append(" [style.colourSex(It is extremely elastic,");
            break;
        default:
            break;
    }
    switch(viewedVagina.getOrificeVagina().getPlasticity()) {
        case ZERO_RUBBERY:
            descriptionSB.append(" and will instantly return to its original size.)]");
            break;
        case ONE_SPRINGY:
            descriptionSB.append(" and returns to its original size within a matter of hours.)]");
            break;
        case TWO_TENSILE:
            descriptionSB.append(" and returns to its original size within a day or so.)]");
            break;
        case THREE_RESILIENT:
            descriptionSB.append(" and will return to its original size after a couple of days.)]");
            break;
        case FOUR_ACCOMMODATING:
            descriptionSB.append(" and takes a while to return to its original size.)]");
            break;
        case FIVE_YIELDING:
            descriptionSB.append(" and struggles to return to its original size.)]");
            break;
        case SIX_MALLEABLE:
            descriptionSB.append(" and loses a good portion of its original tightness.)]");
            break;
        case SEVEN_MOULDABLE:
            descriptionSB.append(" and once stretched out, it stays that way.)]");
            break;
        default:
            break;
    }
    for (OrificeModifier om : OrificeModifier.values()) {
        if (owner.hasVaginaOrificeModifier(om)) {
            if (owner.isPlayer()) {
                switch(om) {
                    case MUSCLE_CONTROL:
                        descriptionSB.append(" You have a series of internal muscles lining the inside of your [pc.vagina], allowing you to expertly squeeze and grip down on any intruding object.");
                        break;
                    case PUFFY:
                        descriptionSB.append(" Your labia have swollen up into big, extra-puffy pussy lips.");
                        break;
                    case RIBBED:
                        descriptionSB.append(" The inside of your [pc.vagina] is lined with sensitive, fleshy ribs, which grant you extra pleasure when stimulated.");
                        break;
                    case TENTACLED:
                        descriptionSB.append(" Your [pc.vagina] is filled with tiny little tentacles, which wriggle and squirm with a mind of their own.");
                        break;
                }
            } else {
                switch(om) {
                    case MUSCLE_CONTROL:
                        descriptionSB.append(" [npc.She] has a series of internal muscles lining the inside of [npc.her] [npc.vagina], allowing [npc.herHim] to expertly squeeze and grip down on any intruding object.");
                        break;
                    case PUFFY:
                        descriptionSB.append(" [npc.Her] labia have swollen up into big, extra-puffy pussy lips.");
                        break;
                    case RIBBED:
                        descriptionSB.append(" The inside of [npc.her] [npc.vagina] is lined with sensitive, fleshy ribs, which grant [npc.herHim] extra pleasure when stimulated.");
                        break;
                    case TENTACLED:
                        descriptionSB.append(" [npc.Her] [npc.vagina] is filled with tiny little tentacles, which wriggle and squirm with a mind of their own.");
                        break;
                }
            }
        }
    }
    return UtilText.parse(owner, descriptionSB.toString());
}
Also used : SexType(com.lilithsthrone.game.sex.SexType) PenetrationType(com.lilithsthrone.game.sex.PenetrationType) OrificeModifier(com.lilithsthrone.game.character.body.valueEnums.OrificeModifier)

Example 2 with PenetrationType

use of com.lilithsthrone.game.sex.PenetrationType 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 PenetrationType

use of com.lilithsthrone.game.sex.PenetrationType 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 PenetrationType

use of com.lilithsthrone.game.sex.PenetrationType in project liliths-throne-public by Innoxia.

the class GameCharacter method getDirtyTalk.

/**
 * @return A <b>formatted</b> piece of speech, reacting to any current penetration.
 */
public String getDirtyTalk() {
    if (!Main.game.isInSex()) {
        return "";
    } else {
        boolean isPlayerDom = Sex.isDom(Main.game.getPlayer());
        List<String> speech = new ArrayList<>();
        String s = "";
        for (OrificeType orifice : OrificeType.values()) {
            switch(orifice) {
                case ANUS:
                    s = getDirtyTalkAssPenetrated(Sex.getTargetedPartner(this), isPlayerDom);
                    break;
                case ASS:
                    s = null;
                    break;
                case BREAST:
                    s = getDirtyTalkBreastsPenetrated(Sex.getTargetedPartner(this), isPlayerDom);
                    break;
                case MOUTH:
                    s = getDirtyTalkMouthPenetrated(Sex.getTargetedPartner(this), isPlayerDom);
                    break;
                case NIPPLE:
                    s = getDirtyTalkNipplePenetrated(Sex.getTargetedPartner(this), isPlayerDom);
                    break;
                case THIGHS:
                    s = null;
                    break;
                case URETHRA:
                    s = null;
                    break;
                case VAGINA:
                    s = getDirtyTalkVaginaPenetrated(Sex.getTargetedPartner(this), isPlayerDom);
                    break;
            }
            if (s != null) {
                if (!Sex.getPenetratingCharacterUsingOrifice(this, orifice).equals(this)) {
                    speech.add(s);
                }
            }
        }
        for (PenetrationType penetration : PenetrationType.values()) {
            switch(penetration) {
                case FINGER:
                    s = getDirtyTalkFingerPenetrating(Sex.getTargetedPartner(this), isPlayerDom);
                    break;
                case PENIS:
                    s = getDirtyTalkPenisPenetrating(Sex.getTargetedPartner(this), isPlayerDom);
                    break;
                case TAIL:
                    s = getDirtyTalkTailPenetrating(Sex.getTargetedPartner(this), isPlayerDom);
                    break;
                case TENTACLE:
                    s = null;
                    break;
                case TONGUE:
                    s = getDirtyTalkTonguePenetrating(Sex.getTargetedPartner(this), isPlayerDom);
                    break;
            }
            if (s != null) {
                if (!Sex.getCharactersBeingPenetratedBy(this, penetration).contains(this) || Sex.getCharactersBeingPenetratedBy(this, penetration).size() > 1) {
                    speech.add(s);
                }
            }
        }
        // Choose a random line to say:
        if (!speech.isEmpty()) {
            // Prefer non-self penetrative speech.
            s = speech.get(Util.random.nextInt(speech.size()));
        } else if (Sex.isCharacterPenetrated(this)) {
            s = UtilText.returnStringAtRandom("Fuck!", "Yeah!", "Oh yeah!");
        } else {
            s = getDirtyTalkNoPenetration(Sex.getTargetedPartner(this), isPlayerDom);
        }
        return UtilText.parseSpeech(s, this);
    }
}
Also used : OrificeType(com.lilithsthrone.game.sex.OrificeType) ArrayList(java.util.ArrayList) PenetrationType(com.lilithsthrone.game.sex.PenetrationType)

Example 5 with PenetrationType

use of com.lilithsthrone.game.sex.PenetrationType in project liliths-throne-public by Innoxia.

the class GenericOrgasms method getGenericVaginaOrgasmDescription.

private static String getGenericVaginaOrgasmDescription(GameCharacter characterOrgasming) {
    genericOrgasmSB.setLength(0);
    if (characterOrgasming.isPlayer()) {
        genericOrgasmSB.append("A desperate, shuddering heat suddenly crashes up from your [npc1.pussy+], and you let out a manic squeal as a blinding wave of pure ecstasy washes over you.");
    } else {
        genericOrgasmSB.append("A desperate, shuddering heat suddenly crashes up from [npc1.name]'s [npc1.pussy+], and [npc1.she] lets out a manic squeal as a blinding wave of pure ecstasy washes over [npc1.herHim].");
    }
    GameCharacter characterPenetrating = Sex.getPenetratingCharacterUsingOrifice(characterOrgasming, OrificeType.VAGINA);
    PenetrationType penetration = Sex.getPenetrationTypeInOrifice(characterOrgasming, OrificeType.VAGINA);
    if (characterPenetrating != null) {
        switch(penetration) {
            case FINGER:
                if (characterOrgasming.isPlayer()) {
                    if (characterPenetrating.isPlayer()) {
                        genericOrgasmSB.append(" You curl your fingers up deep inside your [npc1.pussy+], and, while desperately stroking in a 'come-hither' motion," + " you let out a series of high-pitched moans as your vaginal muscles grip and squeeze around your intruding digits.");
                    } else {
                        genericOrgasmSB.append(" [npc2.Name]'s fingers carry on pumping away at your [npc1.pussy+], and you let out a series of high-pitched moans as your vaginal muscles grip and squeeze around the intruding digits.");
                    }
                } else {
                    if (characterPenetrating.isPlayer()) {
                        genericOrgasmSB.append(" [npc1.Name]'s vaginal muscles grip and squeeze around your intruding digits," + " and you continue to stroke and tease [npc1.her] clit, drawing out a series of [npc1.moans+] from between [npc1.her] [npc1.lips+].");
                    } else {
                        genericOrgasmSB.append(" [npc1.Name]'s vaginal muscles grip and squeeze around [npc2.name]'s intruding digits," + " and [npc2.she] continues to stroke and tease [npc1.her] clit, drawing out a series of [npc1.moans+] from between [npc1.her] [npc1.lips+].");
                    }
                }
                break;
            case PENIS:
                if (characterOrgasming.isPlayer()) {
                    if (characterPenetrating.isPlayer()) {
                        genericOrgasmSB.append(" You carry on fucking yourself through your orgasm, letting out a series of high-pitched moans as your vaginal muscles grip and squeeze around your [npc1.cock+].");
                    } else {
                        genericOrgasmSB.append(" [npc2.Name] carries on fucking your [npc1.pussy+] through your orgasm, and you let out a series of high-pitched moans as your vaginal muscles grip and squeeze around [npc2.her] [npc2.penis+].");
                    }
                } else {
                    if (characterPenetrating.isPlayer()) {
                        genericOrgasmSB.append(" You carry on fucking [npc1.name] through [npc1.her] orgasm, causing [npc1.herHim] to let out a series of high-pitched moans as [npc1.her] vaginal muscles grip and squeeze around your [npc2.cock+].");
                    } else {
                        genericOrgasmSB.append(" [npc2.Name] carries on fucking [npc1.name]'s [npc1.pussy+] through [npc1.her] orgasm," + " causing [npc1.herHim] to let out a series of high-pitched moans as [npc1.her] vaginal muscles grip and squeeze around [npc2.her] [npc2.penis+].");
                    }
                }
                break;
            case TAIL:
                if (characterOrgasming.isPlayer()) {
                    if (characterPenetrating.isPlayer()) {
                        genericOrgasmSB.append(" You carry on tail-fucking yourself through your orgasm, letting out a series of high-pitched moans as your vaginal muscles grip and squeeze around the intruding object.");
                    } else {
                        genericOrgasmSB.append(" [npc2.Name] carries on tail-fucking your [npc1.pussy+] through your orgasm, and you let out a series of high-pitched moans as your vaginal muscles grip and squeeze around the intruding object.");
                    }
                } else {
                    if (characterPenetrating.isPlayer()) {
                        genericOrgasmSB.append(" You carry on tail-fucking [npc1.name] through [npc1.her] orgasm," + " causing [npc1.herHim] to let out a series of high-pitched moans as [npc1.her] vaginal muscles grip and squeeze around the intruding object.");
                    } else {
                        genericOrgasmSB.append(" [npc2.Name] carries on tail-fucking [npc1.name]'s [npc1.pussy+] through [npc1.her] orgasm," + " causing [npc1.herHim] to let out a series of high-pitched moans as [npc1.her] vaginal muscles grip and squeeze around the intruding object.");
                    }
                }
                break;
            case TONGUE:
                if (characterOrgasming.isPlayer()) {
                    if (characterPenetrating.isPlayer()) {
                        genericOrgasmSB.append(" You carry on licking and kissing your clit as you orgasm, letting out a series of high-pitched moans as you feel your vaginal muscles quiver and contract at the overwhelming sensation.");
                    } else {
                        genericOrgasmSB.append(" [npc2.Name] carries on licking and kissing at your clit while you orgasm," + " causing you to let out a series of high-pitched moans as you feel your vaginal muscles quiver and contract at the overwhelming sensation.");
                    }
                } else {
                    if (characterPenetrating.isPlayer()) {
                        genericOrgasmSB.append(" You carry on licking and kissing [npc1.name]'s clit as [npc1.she] orgasms," + " causing [npc1.herHim] to let out a series of high-pitched moans as [npc1.her] vaginal muscles quiver and contract at the overwhelming sensation.");
                    } else {
                        genericOrgasmSB.append(" [npc2.Name] carries on licking and kissing at [npc1.name]'s clit while [npc1.she] orgasms," + " causing [npc1.herHim] to let out a series of high-pitched moans as [npc1.her] vaginal muscles quiver and contract at the overwhelming sensation.");
                    }
                }
                break;
            case TENTACLE:
                break;
        }
    } else {
        // No penetration:
        if (characterOrgasming.isPlayer()) {
            genericOrgasmSB.append(" Your [npc1.pussy+] clenches down hard, and the wave of disappointment upon finding itself empty almost overwhelms the pleasure that radiates up through your groin.");
        } else {
            genericOrgasmSB.append(" [npc1.Name]'s [npc1.pussy+] clenches down hard, and the wave of disappointment upon finding itself empty almost overwhelms the pleasure that radiates up through [npc.her] groin.");
        }
    }
    if (characterOrgasming.isVaginaSquirter()) {
        if (characterOrgasming.isPlayer()) {
            genericOrgasmSB.append(" As your inner muscles spasm and quiver with delight, a huge spurt of female ejaculate squirts out from your [npc1.pussy+].");
        } else {
            genericOrgasmSB.append(" As [npc1.name]'s inner muscles spasm and quiver with delight, a huge spurt of female ejaculate squirts out from [npc1.her] [npc1.pussy+].");
        }
    }
    if (characterOrgasming.isPlayer()) {
        genericOrgasmSB.append(" With a deeply-satisfied sigh, your feminine climax starts to fade, and you take a few deep gasps of air as you seek to catch your breath.");
    } else {
        genericOrgasmSB.append(" With a deeply-satisfied sigh, [npc1.name]'s feminine climax starts to fade, and [npc1.she] takes a few deep gasps of air as [npc1.she] seeks to catch [npc1.her] breath.");
    }
    if (characterPenetrating != null) {
        return UtilText.parse(characterOrgasming, characterPenetrating, genericOrgasmSB.toString());
    } else {
        return UtilText.parse(characterOrgasming, genericOrgasmSB.toString());
    }
}
Also used : GameCharacter(com.lilithsthrone.game.character.GameCharacter) PenetrationType(com.lilithsthrone.game.sex.PenetrationType)

Aggregations

PenetrationType (com.lilithsthrone.game.sex.PenetrationType)10 SexType (com.lilithsthrone.game.sex.SexType)7 OrificeModifier (com.lilithsthrone.game.character.body.valueEnums.OrificeModifier)5 OrificeType (com.lilithsthrone.game.sex.OrificeType)5 ArrayList (java.util.ArrayList)3 GameCharacter (com.lilithsthrone.game.character.GameCharacter)2 CoverableArea (com.lilithsthrone.game.character.body.CoverableArea)2 FluidModifier (com.lilithsthrone.game.character.body.valueEnums.FluidModifier)2 SexParticipantType (com.lilithsthrone.game.sex.SexParticipantType)2 Attribute (com.lilithsthrone.game.character.attributes.Attribute)1 FluidType (com.lilithsthrone.game.character.body.types.FluidType)1 PenisModifier (com.lilithsthrone.game.character.body.valueEnums.PenisModifier)1 TongueModifier (com.lilithsthrone.game.character.body.valueEnums.TongueModifier)1 Addiction (com.lilithsthrone.game.character.effects.Addiction)1 Perk (com.lilithsthrone.game.character.effects.Perk)1 StatusEffect (com.lilithsthrone.game.character.effects.StatusEffect)1 Fetish (com.lilithsthrone.game.character.fetishes.Fetish)1 FetishDesire (com.lilithsthrone.game.character.fetishes.FetishDesire)1 ClothingSet (com.lilithsthrone.game.inventory.clothing.ClothingSet)1 SexAction (com.lilithsthrone.game.sex.sexActions.SexAction)1