Search in sources :

Example 1 with OrificeType

use of com.lilithsthrone.game.sex.OrificeType 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 2 with OrificeType

use of com.lilithsthrone.game.sex.OrificeType 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 3 with OrificeType

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

the class SexAction method getFetishesForEitherPartner.

public List<Fetish> getFetishesForEitherPartner(GameCharacter characterPerformingAction, boolean characterPerformingActionFetishes) {
    // if(characterFetishes==null || characterFetishes.get(characterPerformingAction)==null) {
    GameCharacter characterTarget = Sex.getTargetedPartner(characterPerformingAction);
    characterFetishes = new HashMap<>();
    characterFetishesForPartner = new HashMap<>();
    characterFetishes.putIfAbsent(characterPerformingAction, new HashSet<>());
    characterFetishesForPartner.putIfAbsent(characterPerformingAction, new HashSet<>());
    if (this.getParticipantType() == SexParticipantType.SELF && !characterPerformingActionFetishes) {
        // If this is a self action, do not apply fetishes to other partner.
        return new ArrayList<>(characterFetishesForPartner.get(characterPerformingAction));
    }
    if (this.getParticipantType() != SexParticipantType.SELF && characterPerformingAction.isRelatedTo(characterTarget)) {
        characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_INCEST);
        characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_INCEST);
    }
    if (this.getSexPace(characterPerformingAction) != null) {
        switch(this.getSexPace(characterPerformingAction)) {
            case DOM_GENTLE:
                characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_DOMINANT);
                characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_SUBMISSIVE);
                break;
            case DOM_NORMAL:
                characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_DOMINANT);
                characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_SUBMISSIVE);
                break;
            case DOM_ROUGH:
                characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_DOMINANT);
                characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_SUBMISSIVE);
                characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_SADIST);
                characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_MASOCHIST);
                break;
            case SUB_EAGER:
                characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_SUBMISSIVE);
                characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_DOMINANT);
                break;
            case SUB_NORMAL:
                characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_SUBMISSIVE);
                characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_DOMINANT);
                break;
            case SUB_RESISTING:
                characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_SUBMISSIVE);
                characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_DOMINANT);
                characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_NON_CON_SUB);
                characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_NON_CON_DOM);
                break;
        }
    }
    List<CoverableArea> cummedOnList = this.getAreasCummedOn(characterPerformingAction, characterTarget);
    if (cummedOnList != null) {
        characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_CUM_STUD);
        characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_CUM_ADDICT);
        for (CoverableArea area : cummedOnList) {
            switch(area) {
                case ANUS:
                case ASS:
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ANAL_GIVING);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ANAL_RECEIVING);
                    break;
                case BACK:
                    break;
                case BREASTS:
                case NIPPLES:
                    if (characterTarget.getBreastRawMilkStorageValue() > 0) {
                        characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_OTHERS);
                        characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_SELF);
                    }
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_OTHERS);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_SELF);
                    break;
                case HAIR:
                    break;
                case LEGS:
                case THIGHS:
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_LEG_LOVER);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_STRUTTER);
                    break;
                case MOUND:
                    break;
                case MOUTH:
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ORAL_GIVING);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ORAL_RECEIVING);
                    break;
                case PENIS:
                case TESTICLES:
                    break;
                case STOMACH:
                    break;
                case VAGINA:
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_GIVING);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_RECEIVING);
                    break;
            }
        }
    }
    cummedOnList = this.getAreasCummedOn(characterTarget, characterPerformingAction);
    if (cummedOnList != null) {
        characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_CUM_ADDICT);
        characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_CUM_STUD);
        for (CoverableArea area : cummedOnList) {
            switch(area) {
                case ANUS:
                case ASS:
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ANAL_RECEIVING);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ANAL_GIVING);
                    break;
                case BACK:
                    break;
                case BREASTS:
                case NIPPLES:
                    if (characterPerformingAction.getBreastRawMilkStorageValue() > 0) {
                        characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_SELF);
                        characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_OTHERS);
                    }
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_SELF);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_OTHERS);
                    break;
                case HAIR:
                    break;
                case LEGS:
                case THIGHS:
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_STRUTTER);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_LEG_LOVER);
                    break;
                case MOUND:
                    break;
                case MOUTH:
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ORAL_RECEIVING);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ORAL_GIVING);
                    break;
                case PENIS:
                case TESTICLES:
                    break;
                case STOMACH:
                    break;
                case VAGINA:
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_RECEIVING);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_GIVING);
                    break;
            }
        }
    }
    List<OrificeType> cummedInList = this.getAreasCummedIn(characterPerformingAction, characterTarget);
    if (cummedInList != null) {
        characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_CUM_STUD);
        characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_CUM_ADDICT);
        for (OrificeType orifice : cummedInList) {
            switch(orifice) {
                case ANUS:
                case ASS:
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ANAL_GIVING);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ANAL_RECEIVING);
                    break;
                case BREAST:
                case NIPPLE:
                    if (characterTarget.getBreastRawMilkStorageValue() > 0) {
                        characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_OTHERS);
                        characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_SELF);
                    }
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_OTHERS);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_SELF);
                    break;
                case THIGHS:
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_LEG_LOVER);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_STRUTTER);
                    break;
                case MOUTH:
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ORAL_GIVING);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ORAL_RECEIVING);
                    break;
                case VAGINA:
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_GIVING);
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_IMPREGNATION);
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_SEEDER);
                    if (this.getParticipantType() == SexParticipantType.SELF) {
                        characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_PREGNANCY);
                        characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_BROODMOTHER);
                    }
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_RECEIVING);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_PREGNANCY);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_BROODMOTHER);
                    break;
                case URETHRA:
                    break;
            }
        }
    }
    cummedInList = this.getAreasCummedIn(characterTarget, characterPerformingAction);
    if (cummedInList != null) {
        characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_CUM_ADDICT);
        characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_CUM_STUD);
        for (OrificeType orifice : cummedInList) {
            switch(orifice) {
                case ANUS:
                case ASS:
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ANAL_RECEIVING);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ANAL_GIVING);
                    break;
                case BREAST:
                case NIPPLE:
                    if (characterPerformingAction.getBreastRawMilkStorageValue() > 0) {
                        characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_SELF);
                        characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_LACTATION_OTHERS);
                    }
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_SELF);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_BREASTS_OTHERS);
                    break;
                case THIGHS:
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_STRUTTER);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_LEG_LOVER);
                    break;
                case MOUTH:
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_ORAL_RECEIVING);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_ORAL_GIVING);
                    break;
                case VAGINA:
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_RECEIVING);
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_PREGNANCY);
                    characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_BROODMOTHER);
                    if (this.getParticipantType() == SexParticipantType.SELF) {
                        characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_IMPREGNATION);
                        characterFetishes.get(characterPerformingAction).add(Fetish.FETISH_SEEDER);
                    }
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_VAGINAL_GIVING);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_IMPREGNATION);
                    characterFetishesForPartner.get(characterPerformingAction).add(Fetish.FETISH_SEEDER);
                    break;
                case URETHRA:
                    break;
            }
        }
    }
    if (this.getAssociatedPenetrationType() != null && this.getAssociatedOrificeType() != null && this.getActionType() != SexActionType.PLAYER_STOP_PENETRATION && this.getActionType() != SexActionType.PARTNER_STOP_PENETRATION && this.getParticipantType() != SexParticipantType.MISC) {
        if (characterPerformingActionFetishes) {
            characterFetishes.get(characterPerformingAction).addAll(getFetishesFromPenetrationAndOrificeTypes(characterPerformingAction, this.getAssociatedPenetrationType(), this.getAssociatedOrificeType(), characterPerformingActionFetishes));
        } else {
            characterFetishesForPartner.get(characterPerformingAction).addAll(getFetishesFromPenetrationAndOrificeTypes(characterPerformingAction, this.getAssociatedPenetrationType(), this.getAssociatedOrificeType(), characterPerformingActionFetishes));
        }
    }
    characterFetishes.get(characterPerformingAction).removeIf(f -> !characterTarget.hasVagina() && (f == Fetish.FETISH_VAGINAL_GIVING || f == Fetish.FETISH_IMPREGNATION || f == Fetish.FETISH_SEEDER));
    characterFetishesForPartner.get(characterPerformingAction).removeIf(f -> !characterTarget.hasVagina() && (f == Fetish.FETISH_VAGINAL_GIVING || f == Fetish.FETISH_IMPREGNATION || f == Fetish.FETISH_SEEDER));
    if (characterPerformingActionFetishes) {
        return new ArrayList<>(characterFetishes.get(characterPerformingAction));
    } else {
        return new ArrayList<>(characterFetishesForPartner.get(characterPerformingAction));
    }
}
Also used : CoverableArea(com.lilithsthrone.game.character.body.CoverableArea) OrificeType(com.lilithsthrone.game.sex.OrificeType) ArrayList(java.util.ArrayList) GameCharacter(com.lilithsthrone.game.character.GameCharacter)

Example 4 with OrificeType

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

the class GameCharacter method saveAsXML.

@Override
public Element saveAsXML(Element parentElement, Document doc) {
    Element properties = doc.createElement("character");
    parentElement.appendChild(properties);
    // ************** Core information **************//
    Element characterCoreInfo = doc.createElement("core");
    Comment comment = doc.createComment("If you want to edit any of these values, just be warned that it might break the game...");
    properties.appendChild(characterCoreInfo);
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "id", this.getId());
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "pathName", this.getClass().getCanonicalName());
    Element name = doc.createElement("name");
    characterCoreInfo.appendChild(name);
    CharacterUtils.addAttribute(doc, name, "nameFeminine", this.getNameTriplet().getFeminine());
    CharacterUtils.addAttribute(doc, name, "nameAndrogynous", this.getNameTriplet().getAndrogynous());
    CharacterUtils.addAttribute(doc, name, "nameMasculine", this.getNameTriplet().getMasculine());
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "surname", this.getSurname());
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "description", this.getDescription());
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "playerPetName", playerPetName);
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "playerKnowsName", String.valueOf(this.isPlayerKnowsName()));
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "level", String.valueOf(this.getTrueLevel()));
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "version", Main.VERSION_NUMBER);
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "history", this.getHistory().toString());
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "personality", this.getPersonality().toString());
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "sexualOrientation", this.getSexualOrientation().toString());
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "obedience", String.valueOf(this.getObedienceValue()));
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "genderIdentity", String.valueOf(this.getGenderIdentity()));
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "experience", String.valueOf(this.getExperience()));
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "perkPoints", String.valueOf(this.getPerkPoints()));
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "health", String.valueOf(this.getHealth()));
    CharacterUtils.createXMLElementWithValue(doc, characterCoreInfo, "mana", String.valueOf(this.getMana()));
    // Knows area map:
    Element characterPlayerKnowsAreas = doc.createElement("playerKnowsAreas");
    characterCoreInfo.appendChild(characterPlayerKnowsAreas);
    for (CoverableArea area : getPlayerKnowsAreas()) {
        Element element = doc.createElement("area");
        characterPlayerKnowsAreas.appendChild(element);
        CharacterUtils.addAttribute(doc, element, "type", area.toString());
    }
    characterCoreInfo.getParentNode().insertBefore(comment, characterCoreInfo);
    // ************** Location Information **************//
    Element locationInformation = doc.createElement("locationInformation");
    properties.appendChild(locationInformation);
    CharacterUtils.createXMLElementWithValue(doc, locationInformation, "worldLocation", this.getWorldLocation().toString());
    CharacterUtils.createXMLElementWithValue(doc, locationInformation, "homeWorldLocation", this.getHomeWorldLocation().toString());
    Element location = doc.createElement("location");
    locationInformation.appendChild(location);
    CharacterUtils.addAttribute(doc, location, "x", String.valueOf(this.getLocation().getX()));
    CharacterUtils.addAttribute(doc, location, "y", String.valueOf(this.getLocation().getY()));
    location = doc.createElement("homeLocation");
    locationInformation.appendChild(location);
    CharacterUtils.addAttribute(doc, location, "x", String.valueOf(this.getHomeLocation().getX()));
    CharacterUtils.addAttribute(doc, location, "y", String.valueOf(this.getHomeLocation().getY()));
    // ************** Body **************//
    Element characterBody = doc.createElement("body");
    properties.appendChild(characterBody);
    this.body.saveAsXML(characterBody, doc);
    // ************** Inventory **************//
    this.inventory.saveAsXML(properties, doc);
    // ************** Attributes **************//
    // Attributes:
    Element characterCoreAttributes = doc.createElement("attributes");
    properties.appendChild(characterCoreAttributes);
    for (Attribute att : Attribute.values()) {
        if (this.getBaseAttributeValue(att) != att.getBaseValue()) {
            Element element = doc.createElement("attribute");
            characterCoreAttributes.appendChild(element);
            CharacterUtils.addAttribute(doc, element, "type", att.toString());
            CharacterUtils.addAttribute(doc, element, "value", String.valueOf(this.getBaseAttributeValue(att)));
        }
    }
    Element characterPotionAttributes = doc.createElement("potionAttributes");
    properties.appendChild(characterPotionAttributes);
    for (Entry<Attribute, Float> entry : getPotionAttributes().entrySet()) {
        Element element = doc.createElement("attribute");
        characterPotionAttributes.appendChild(element);
        CharacterUtils.addAttribute(doc, element, "type", entry.getKey().toString());
        CharacterUtils.addAttribute(doc, element, "value", String.valueOf(entry.getValue()));
    }
    // Perks:
    Element characterEquippedPerks = doc.createElement("traits");
    properties.appendChild(characterEquippedPerks);
    for (Perk p : this.getTraits()) {
        Element element = doc.createElement("perk");
        characterEquippedPerks.appendChild(element);
        CharacterUtils.addAttribute(doc, element, "type", p.toString());
    }
    Element characterPerks = doc.createElement("perks");
    properties.appendChild(characterPerks);
    for (Entry<Integer, Set<Perk>> p : this.getPerksMap().entrySet()) {
        for (Perk perk : p.getValue()) {
            Element element = doc.createElement("perk");
            characterPerks.appendChild(element);
            CharacterUtils.addAttribute(doc, element, "row", p.getKey().toString());
            CharacterUtils.addAttribute(doc, element, "type", perk.toString());
        }
    }
    // Fetishes:
    Element characterFetishes = doc.createElement("fetishes");
    properties.appendChild(characterFetishes);
    for (Fetish f : this.getFetishes()) {
        Element element = doc.createElement("fetish");
        characterFetishes.appendChild(element);
        CharacterUtils.addAttribute(doc, element, "type", f.toString());
    }
    Element fetishDesire = doc.createElement("fetishDesire");
    properties.appendChild(fetishDesire);
    for (Entry<Fetish, FetishDesire> entry : this.getFetishDesireMap().entrySet()) {
        Element fondenessEntry = doc.createElement("entry");
        fetishDesire.appendChild(fondenessEntry);
        CharacterUtils.addAttribute(doc, fondenessEntry, "fetish", entry.getKey().toString());
        CharacterUtils.addAttribute(doc, fondenessEntry, "desire", entry.getValue().toString());
    }
    Element fetishExperience = doc.createElement("fetishExperience");
    properties.appendChild(fetishExperience);
    for (Entry<Fetish, Integer> entry : this.getFetishExperienceMap().entrySet()) {
        Element expEntry = doc.createElement("entry");
        fetishExperience.appendChild(expEntry);
        CharacterUtils.addAttribute(doc, expEntry, "fetish", entry.getKey().toString());
        CharacterUtils.addAttribute(doc, expEntry, "experience", String.valueOf(entry.getValue()));
    }
    // Status effects:
    Element characterStatusEffects = doc.createElement("statusEffects");
    properties.appendChild(characterStatusEffects);
    for (StatusEffect se : this.getStatusEffects()) {
        Element element = doc.createElement("statusEffect");
        characterStatusEffects.appendChild(element);
        CharacterUtils.addAttribute(doc, element, "type", se.toString());
        CharacterUtils.addAttribute(doc, element, "value", String.valueOf(this.getStatusEffectDuration(se)));
    }
    // ************** Relationships **************//
    Element characterRelationships = doc.createElement("characterRelationships");
    properties.appendChild(characterRelationships);
    for (Entry<String, Float> entry : this.getAffectionMap().entrySet()) {
        Element relationship = doc.createElement("relationship");
        characterRelationships.appendChild(relationship);
        CharacterUtils.addAttribute(doc, relationship, "character", entry.getKey());
        CharacterUtils.addAttribute(doc, relationship, "value", String.valueOf(entry.getValue()));
    }
    // ************** Pregnancy **************//
    // Pregnancy:
    Element characterPregnancy = doc.createElement("pregnancy");
    properties.appendChild(characterPregnancy);
    CharacterUtils.addAttribute(doc, characterPregnancy, "timeProgressedToFinalPregnancyStage", String.valueOf(this.getTimeProgressedToFinalPregnancyStage()));
    Element characterPotentialPartnersAsMother = doc.createElement("potentialPartnersAsMother");
    characterPregnancy.appendChild(characterPotentialPartnersAsMother);
    for (PregnancyPossibility pregPoss : this.getPotentialPartnersAsMother()) {
        pregPoss.saveAsXML(characterPotentialPartnersAsMother, doc);
    }
    Element characterPotentialPartnersAsFather = doc.createElement("potentialPartnersAsFather");
    characterPregnancy.appendChild(characterPotentialPartnersAsFather);
    for (PregnancyPossibility pregPoss : this.getPotentialPartnersAsFather()) {
        pregPoss.saveAsXML(characterPotentialPartnersAsFather, doc);
    }
    Element characterPregnancyCurrentLitter = doc.createElement("pregnantLitter");
    characterPregnancy.appendChild(characterPregnancyCurrentLitter);
    if (this.getPregnantLitter() != null) {
        this.getPregnantLitter().saveAsXML(characterPregnancyCurrentLitter, doc);
    }
    Element characterPregnancyBirthedLitters = doc.createElement("birthedLitters");
    characterPregnancy.appendChild(characterPregnancyBirthedLitters);
    for (Litter litter : this.getLittersBirthed()) {
        litter.saveAsXML(characterPregnancyBirthedLitters, doc);
    }
    Element characterPregnancyLittersFathered = doc.createElement("littersFathered");
    characterPregnancy.appendChild(characterPregnancyLittersFathered);
    for (Litter litter : this.getLittersFathered()) {
        litter.saveAsXML(characterPregnancyLittersFathered, doc);
    }
    // ************** Family **************//
    Element characterFamily = doc.createElement("family");
    properties.appendChild(characterFamily);
    CharacterUtils.createXMLElementWithValue(doc, characterFamily, "motherId", this.getMotherId());
    CharacterUtils.createXMLElementWithValue(doc, characterFamily, "fatherId", this.getFatherId());
    CharacterUtils.createXMLElementWithValue(doc, characterFamily, "dayOfConception", String.valueOf(this.getDayOfConception()));
    CharacterUtils.createXMLElementWithValue(doc, characterFamily, "dayOfBirth", String.valueOf(this.getDayOfBirth()));
    // ************** Slavery **************//
    Element slaveryElement = doc.createElement("slavery");
    properties.appendChild(slaveryElement);
    Element slavesOwned = doc.createElement("slavesOwned");
    slaveryElement.appendChild(slavesOwned);
    for (String slave : this.getSlavesOwned()) {
        Element element = doc.createElement("slave");
        slavesOwned.appendChild(element);
        CharacterUtils.addAttribute(doc, element, "id", slave);
    }
    CharacterUtils.createXMLElementWithValue(doc, slaveryElement, "owner", this.getOwner() == null ? "" : this.getOwner().getId());
    CharacterUtils.createXMLElementWithValue(doc, slaveryElement, "slaveJob", this.getSlaveJob().toString());
    Element slaveJobSettings = doc.createElement("slaveJobSettings");
    slaveryElement.appendChild(slaveJobSettings);
    for (SlaveJobSetting setting : this.getSlaveJobSettings()) {
        Element element = doc.createElement("setting");
        slaveJobSettings.appendChild(element);
        CharacterUtils.addAttribute(doc, element, "value", setting.toString());
    }
    Element slavePermissionSettings = doc.createElement("slavePermissionSettings");
    slaveryElement.appendChild(slavePermissionSettings);
    for (Entry<SlavePermission, Set<SlavePermissionSetting>> entry : this.getSlavePermissionSettings().entrySet()) {
        Element element = doc.createElement("permission");
        slavePermissionSettings.appendChild(element);
        CharacterUtils.addAttribute(doc, element, "type", entry.getKey().toString());
        for (SlavePermissionSetting setting : entry.getValue()) {
            Element settingElement = doc.createElement("setting");
            element.appendChild(settingElement);
            CharacterUtils.addAttribute(doc, settingElement, "value", setting.toString());
        }
    }
    Element slaveWorkHours = doc.createElement("slaveWorkHours");
    slaveryElement.appendChild(slaveWorkHours);
    for (int i = 0; i < workHours.length; i++) {
        CharacterUtils.addAttribute(doc, slaveWorkHours, "hour" + String.valueOf(i), String.valueOf(workHours[i]));
    }
    // ************** Sex Stats **************//
    Element characterSexStats = doc.createElement("sexStats");
    properties.appendChild(characterSexStats);
    Element characterCummedInAreas = doc.createElement("cummedInAreas");
    characterSexStats.appendChild(characterCummedInAreas);
    for (OrificeType orifice : OrificeType.values()) {
        Element element = doc.createElement("entry");
        characterCummedInAreas.appendChild(element);
        CharacterUtils.addAttribute(doc, element, "orifice", orifice.toString());
        CharacterUtils.addAttribute(doc, element, "cumQuantity", String.valueOf(this.getCummedInAreaMap().get(orifice)));
    }
    CharacterUtils.createXMLElementWithValue(doc, characterSexStats, "sexConsensualCount", String.valueOf(this.getSexConsensualCount()));
    CharacterUtils.createXMLElementWithValue(doc, characterSexStats, "sexAsSubCount", String.valueOf(this.getSexAsSubCount()));
    CharacterUtils.createXMLElementWithValue(doc, characterSexStats, "sexAsDomCount", String.valueOf(this.getSexAsDomCount()));
    Element characterCumCount = doc.createElement("cumCounts");
    characterSexStats.appendChild(characterCumCount);
    for (SexParticipantType participant : SexParticipantType.values()) {
        for (PenetrationType pt : PenetrationType.values()) {
            for (OrificeType ot : OrificeType.values()) {
                if (this.getCumCount(new SexType(participant, pt, ot)) > 0) {
                    Element element = doc.createElement("cumCount");
                    characterCumCount.appendChild(element);
                    CharacterUtils.addAttribute(doc, element, "participantType", participant.toString());
                    CharacterUtils.addAttribute(doc, element, "penetrationType", pt.toString());
                    CharacterUtils.addAttribute(doc, element, "orificeType", ot.toString());
                    CharacterUtils.addAttribute(doc, element, "count", String.valueOf(this.getCumCount(new SexType(participant, pt, ot))));
                }
            }
        }
    }
    Element characterSexCount = doc.createElement("sexCounts");
    characterSexStats.appendChild(characterSexCount);
    for (SexParticipantType participant : SexParticipantType.values()) {
        for (PenetrationType pt : PenetrationType.values()) {
            for (OrificeType ot : OrificeType.values()) {
                if (this.getSexCount(new SexType(participant, pt, ot)) > 0) {
                    Element element = doc.createElement("sexCount");
                    characterSexCount.appendChild(element);
                    CharacterUtils.addAttribute(doc, element, "participantType", participant.toString());
                    CharacterUtils.addAttribute(doc, element, "penetrationType", pt.toString());
                    CharacterUtils.addAttribute(doc, element, "orificeType", ot.toString());
                    CharacterUtils.addAttribute(doc, element, "count", String.valueOf(this.getSexCount(new SexType(participant, pt, ot))));
                }
            }
        }
    }
    Element characterVirginityTakenBy = doc.createElement("virginityTakenBy");
    characterSexStats.appendChild(characterVirginityTakenBy);
    for (SexParticipantType participant : SexParticipantType.values()) {
        for (PenetrationType pt : PenetrationType.values()) {
            for (OrificeType ot : OrificeType.values()) {
                if (this.getVirginityLoss(new SexType(participant, pt, ot)) != null && !this.getVirginityLoss(new SexType(participant, pt, ot)).isEmpty()) {
                    Element element = doc.createElement("virginity");
                    characterVirginityTakenBy.appendChild(element);
                    CharacterUtils.addAttribute(doc, element, "participantType", participant.toString());
                    CharacterUtils.addAttribute(doc, element, "penetrationType", pt.toString());
                    CharacterUtils.addAttribute(doc, element, "orificeType", ot.toString());
                    CharacterUtils.addAttribute(doc, element, "takenBy", String.valueOf(this.getVirginityLoss(new SexType(participant, pt, ot))));
                }
            }
        }
    }
    Element sexPartnerMapElement = doc.createElement("sexPartnerMap");
    characterSexStats.appendChild(sexPartnerMapElement);
    for (String s : sexPartnerMap.keySet()) {
        Element element = doc.createElement("id");
        sexPartnerMapElement.appendChild(element);
        CharacterUtils.addAttribute(doc, element, "value", s);
        for (Entry<SexType, Integer> entry : sexPartnerMap.get(s).entrySet()) {
            Element entryElement = doc.createElement("entry");
            element.appendChild(entryElement);
            CharacterUtils.addAttribute(doc, entryElement, "participantType", entry.getKey().getAsParticipant().toString());
            CharacterUtils.addAttribute(doc, entryElement, "penetrationType", entry.getKey().getPenetrationType().toString());
            CharacterUtils.addAttribute(doc, entryElement, "orificeType", entry.getKey().getOrificeType().toString());
            CharacterUtils.addAttribute(doc, entryElement, "count", String.valueOf(entry.getValue()));
        }
    }
    // ************** Fluids **************//
    Element characterAddictionsCore = doc.createElement("addictionsCore");
    properties.appendChild(characterAddictionsCore);
    CharacterUtils.addAttribute(doc, characterAddictionsCore, "alcoholLevel", String.valueOf(alcoholLevel));
    Element characterAddictions = doc.createElement("addictions");
    characterAddictionsCore.appendChild(characterAddictions);
    for (Addiction add : addictions) {
        add.saveAsXML(characterAddictions, doc);
    }
    Element psychoactives = doc.createElement("psychoactiveFluids");
    characterAddictionsCore.appendChild(psychoactives);
    for (FluidType ft : this.getPsychoactiveFluidsIngested()) {
        Element element = doc.createElement("fluid");
        psychoactives.appendChild(element);
        CharacterUtils.addAttribute(doc, element, "value", ft.toString());
    }
    return properties;
}
Also used : FluidType(com.lilithsthrone.game.character.body.types.FluidType) SlaveJobSetting(com.lilithsthrone.game.slavery.SlaveJobSetting) CoverableArea(com.lilithsthrone.game.character.body.CoverableArea) EnumSet(java.util.EnumSet) Set(java.util.Set) HashSet(java.util.HashSet) ClothingSet(com.lilithsthrone.game.inventory.clothing.ClothingSet) Attribute(com.lilithsthrone.game.character.attributes.Attribute) Element(org.w3c.dom.Element) SlavePermission(com.lilithsthrone.game.slavery.SlavePermission) PenetrationType(com.lilithsthrone.game.sex.PenetrationType) SexParticipantType(com.lilithsthrone.game.sex.SexParticipantType) Fetish(com.lilithsthrone.game.character.fetishes.Fetish) Comment(org.w3c.dom.Comment) SexType(com.lilithsthrone.game.sex.SexType) OrificeType(com.lilithsthrone.game.sex.OrificeType) Perk(com.lilithsthrone.game.character.effects.Perk) StatusEffect(com.lilithsthrone.game.character.effects.StatusEffect) SlavePermissionSetting(com.lilithsthrone.game.slavery.SlavePermissionSetting) Addiction(com.lilithsthrone.game.character.effects.Addiction) FetishDesire(com.lilithsthrone.game.character.fetishes.FetishDesire)

Example 5 with OrificeType

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

the class NPC method generateSexChoices.

public void generateSexChoices(GameCharacter target) {
    List<SexType> foreplaySexTypes = new ArrayList<>();
    List<SexType> mainSexTypes = new ArrayList<>();
    if (isKeenToPerformFetishAction(target, Fetish.FETISH_BREASTS_OTHERS)) {
        foreplaySexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.FINGER, OrificeType.BREAST));
        foreplaySexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.TONGUE, OrificeType.BREAST));
        foreplaySexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.FINGER, OrificeType.NIPPLE));
        foreplaySexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.TONGUE, OrificeType.NIPPLE));
        foreplaySexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.PENIS, OrificeType.BREAST));
        mainSexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.PENIS, OrificeType.BREAST));
        mainSexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.TAIL, OrificeType.BREAST));
        mainSexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.PENIS, OrificeType.NIPPLE));
        mainSexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.TAIL, OrificeType.NIPPLE));
    }
    if (isKeenToPerformFetishAction(target, Fetish.FETISH_BREASTS_SELF)) {
        foreplaySexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.FINGER, OrificeType.BREAST));
        foreplaySexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.TONGUE, OrificeType.BREAST));
        foreplaySexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.FINGER, OrificeType.NIPPLE));
        foreplaySexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.TONGUE, OrificeType.NIPPLE));
        foreplaySexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.PENIS, OrificeType.BREAST));
        mainSexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.PENIS, OrificeType.BREAST));
        mainSexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.TAIL, OrificeType.BREAST));
        mainSexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.PENIS, OrificeType.NIPPLE));
        mainSexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.TAIL, OrificeType.NIPPLE));
    }
    if (isKeenToPerformFetishAction(target, Fetish.FETISH_ANAL_GIVING)) {
        foreplaySexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.FINGER, OrificeType.ANUS));
        foreplaySexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.TONGUE, OrificeType.ANUS));
        mainSexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.PENIS, OrificeType.ANUS));
        mainSexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.TAIL, OrificeType.ANUS));
    }
    if (isKeenToPerformFetishAction(target, Fetish.FETISH_ANAL_RECEIVING)) {
        foreplaySexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.FINGER, OrificeType.ANUS));
        foreplaySexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.TONGUE, OrificeType.ANUS));
        mainSexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.PENIS, OrificeType.ANUS));
        mainSexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.TAIL, OrificeType.ANUS));
    }
    if ((isKeenToPerformFetishAction(target, Fetish.FETISH_DEFLOWERING) && target.isVaginaVirgin()) || isKeenToPerformFetishAction(target, Fetish.FETISH_IMPREGNATION) || isKeenToPerformFetishAction(target, Fetish.FETISH_SEEDER)) {
        mainSexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.PENIS, OrificeType.VAGINA));
    }
    if (isKeenToPerformFetishAction(target, Fetish.FETISH_PREGNANCY) || isKeenToPerformFetishAction(target, Fetish.FETISH_BROODMOTHER)) {
        mainSexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.PENIS, OrificeType.VAGINA));
    }
    if (isKeenToPerformFetishAction(target, Fetish.FETISH_ORAL_RECEIVING)) {
        foreplaySexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.TONGUE, OrificeType.VAGINA));
        foreplaySexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.PENIS, OrificeType.MOUTH));
        mainSexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.TONGUE, OrificeType.VAGINA));
        mainSexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.PENIS, OrificeType.MOUTH));
    }
    if (isKeenToPerformFetishAction(target, Fetish.FETISH_ORAL_GIVING)) {
        foreplaySexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.TONGUE, OrificeType.VAGINA));
        foreplaySexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.PENIS, OrificeType.MOUTH));
        mainSexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.TONGUE, OrificeType.VAGINA));
        mainSexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.PENIS, OrificeType.MOUTH));
    }
    // If no preferences from fetishes, add all common foreplay actions:
    if (foreplaySexTypes.isEmpty()) {
        // Player penetrates:
        List<PenetrationType> penTypes = Util.newArrayListOfValues(new ListValue<>(PenetrationType.FINGER), new ListValue<>(PenetrationType.TONGUE));
        List<OrificeType> orificeTypes = Util.newArrayListOfValues(new ListValue<>(OrificeType.BREAST), new ListValue<>(OrificeType.NIPPLE), new ListValue<>(OrificeType.VAGINA));
        for (PenetrationType pen : penTypes) {
            for (OrificeType orifice : orificeTypes) {
                foreplaySexTypes.add(new SexType(SexParticipantType.CATCHER, pen, orifice));
                foreplaySexTypes.add(new SexType(SexParticipantType.PITCHER, pen, orifice));
            }
        }
        foreplaySexTypes.add(new SexType(SexParticipantType.CATCHER, PenetrationType.PENIS, OrificeType.MOUTH));
        foreplaySexTypes.add(new SexType(SexParticipantType.PITCHER, PenetrationType.PENIS, OrificeType.MOUTH));
    }
    // If no preferences from fetishes, add all common sex actions:
    if (mainSexTypes.isEmpty()) {
        // TODO make a better weighting method, rather than just adding multiple entries
        // Player penetrates:
        List<PenetrationType> penTypes = Util.newArrayListOfValues(new ListValue<>(PenetrationType.PENIS), new ListValue<>(PenetrationType.PENIS), new ListValue<>(PenetrationType.PENIS), new ListValue<>(PenetrationType.TAIL));
        List<OrificeType> orificeTypes = Util.newArrayListOfValues(new ListValue<>(OrificeType.BREAST), new ListValue<>(OrificeType.VAGINA), new ListValue<>(OrificeType.VAGINA), new ListValue<>(OrificeType.VAGINA));
        for (PenetrationType pen : penTypes) {
            for (OrificeType orifice : orificeTypes) {
                mainSexTypes.add(new SexType(SexParticipantType.CATCHER, pen, orifice));
                mainSexTypes.add(new SexType(SexParticipantType.PITCHER, pen, orifice));
            }
        }
    }
    // Penis:
    if (!target.hasPenis() || !target.isAbleToAccessCoverableArea(CoverableArea.PENIS, true)) {
        foreplaySexTypes.removeIf(sexType -> sexType.getPenetrationType() == PenetrationType.PENIS && !sexType.getAsParticipant().isUsingSelfPenetrationType());
        mainSexTypes.removeIf(sexType -> sexType.getPenetrationType() == PenetrationType.PENIS && !sexType.getAsParticipant().isUsingSelfPenetrationType());
    }
    if (!this.hasPenis() || !this.isAbleToAccessCoverableArea(CoverableArea.PENIS, true)) {
        foreplaySexTypes.removeIf(sexType -> sexType.getPenetrationType() == PenetrationType.PENIS && sexType.getAsParticipant().isUsingSelfPenetrationType());
        mainSexTypes.removeIf(sexType -> sexType.getPenetrationType() == PenetrationType.PENIS && sexType.getAsParticipant().isUsingSelfPenetrationType());
    }
    // Vagina:
    if (!target.hasVagina() || !target.isAbleToAccessCoverableArea(CoverableArea.VAGINA, true) || isKeenToAvoidFetishAction(target, Fetish.FETISH_VAGINAL_GIVING)) {
        foreplaySexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.VAGINA && !sexType.getAsParticipant().isUsingSelfOrificeType());
        mainSexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.VAGINA && !sexType.getAsParticipant().isUsingSelfOrificeType());
    }
    if (isKeenToPerformFetishAction(target, Fetish.FETISH_PURE_VIRGIN) || !this.hasVagina() || !this.isAbleToAccessCoverableArea(CoverableArea.VAGINA, true) || isKeenToAvoidFetishAction(target, Fetish.FETISH_VAGINAL_RECEIVING)) {
        foreplaySexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.VAGINA && sexType.getAsParticipant().isUsingSelfOrificeType());
        mainSexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.VAGINA && sexType.getAsParticipant().isUsingSelfOrificeType());
    }
    // Anus:
    if (!target.isAbleToAccessCoverableArea(CoverableArea.ANUS, true) || isKeenToAvoidFetishAction(target, Fetish.FETISH_ANAL_GIVING)) {
        foreplaySexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.ANUS && !sexType.getAsParticipant().isUsingSelfOrificeType());
        mainSexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.ANUS && !sexType.getAsParticipant().isUsingSelfOrificeType());
    }
    if (!this.isAbleToAccessCoverableArea(CoverableArea.ANUS, true) || isKeenToAvoidFetishAction(target, Fetish.FETISH_VAGINAL_RECEIVING)) {
        foreplaySexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.ANUS && sexType.getAsParticipant().isUsingSelfOrificeType());
        mainSexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.ANUS && sexType.getAsParticipant().isUsingSelfOrificeType());
    }
    // Oral:
    if (!target.isAbleToAccessCoverableArea(CoverableArea.MOUTH, true) || isKeenToAvoidFetishAction(target, Fetish.FETISH_ORAL_GIVING)) {
        foreplaySexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.MOUTH && !sexType.getAsParticipant().isUsingSelfOrificeType());
        foreplaySexTypes.removeIf(sexType -> sexType.getPenetrationType() == PenetrationType.TONGUE && !sexType.getAsParticipant().isUsingSelfPenetrationType());
        mainSexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.MOUTH && !sexType.getAsParticipant().isUsingSelfOrificeType());
        mainSexTypes.removeIf(sexType -> sexType.getPenetrationType() == PenetrationType.TONGUE && !sexType.getAsParticipant().isUsingSelfPenetrationType());
    }
    if (!this.isAbleToAccessCoverableArea(CoverableArea.MOUTH, true) || isKeenToAvoidFetishAction(target, Fetish.FETISH_ORAL_RECEIVING)) {
        foreplaySexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.MOUTH && sexType.getAsParticipant().isUsingSelfOrificeType());
        foreplaySexTypes.removeIf(sexType -> sexType.getPenetrationType() == PenetrationType.TONGUE && sexType.getAsParticipant().isUsingSelfPenetrationType());
        mainSexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.MOUTH && sexType.getAsParticipant().isUsingSelfOrificeType());
        mainSexTypes.removeIf(sexType -> sexType.getPenetrationType() == PenetrationType.TONGUE && sexType.getAsParticipant().isUsingSelfPenetrationType());
    }
    // Breasts:
    if (!target.isAbleToAccessCoverableArea(CoverableArea.NIPPLES, true) || (!target.hasBreasts() && !target.isBreastFuckableNipplePenetration()) || isKeenToAvoidFetishAction(target, Fetish.FETISH_BREASTS_OTHERS)) {
        foreplaySexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.NIPPLE && !sexType.getAsParticipant().isUsingSelfOrificeType());
        foreplaySexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.BREAST && !sexType.getAsParticipant().isUsingSelfOrificeType());
        mainSexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.NIPPLE && !sexType.getAsParticipant().isUsingSelfOrificeType());
        mainSexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.BREAST && !sexType.getAsParticipant().isUsingSelfOrificeType());
    }
    if (!this.isAbleToAccessCoverableArea(CoverableArea.NIPPLES, true) || (!this.hasBreasts() && !this.isBreastFuckableNipplePenetration()) || isKeenToAvoidFetishAction(target, Fetish.FETISH_BREASTS_SELF)) {
        foreplaySexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.NIPPLE && sexType.getAsParticipant().isUsingSelfOrificeType());
        foreplaySexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.BREAST && sexType.getAsParticipant().isUsingSelfOrificeType());
        mainSexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.NIPPLE && sexType.getAsParticipant().isUsingSelfOrificeType());
        mainSexTypes.removeIf(sexType -> sexType.getOrificeType() == OrificeType.BREAST && sexType.getAsParticipant().isUsingSelfOrificeType());
    }
    // Tail:
    if (!target.getTailType().isSuitableForPenetration()) {
        foreplaySexTypes.removeIf(sexType -> sexType.getPenetrationType() == PenetrationType.TAIL && !sexType.getAsParticipant().isUsingSelfPenetrationType());
        mainSexTypes.removeIf(sexType -> sexType.getPenetrationType() == PenetrationType.TAIL && !sexType.getAsParticipant().isUsingSelfPenetrationType());
    }
    if (!this.getTailType().isSuitableForPenetration()) {
        foreplaySexTypes.removeIf(sexType -> sexType.getPenetrationType() == PenetrationType.TAIL && sexType.getAsParticipant().isUsingSelfPenetrationType());
        mainSexTypes.removeIf(sexType -> sexType.getPenetrationType() == PenetrationType.TAIL && sexType.getAsParticipant().isUsingSelfPenetrationType());
    }
    if (foreplaySexTypes.isEmpty()) {
        foreplayPreference = null;
    } else {
        foreplayPreference = foreplaySexTypes.get(Util.random.nextInt(foreplaySexTypes.size()));
    // System.out.println("Foreplay: "+foreplayPreference.getPenetrationType().toString()+" "+foreplayPreference.getOrificeType().toString());
    }
    if (mainSexTypes.isEmpty()) {
        mainSexPreference = null;
    } else {
        mainSexPreference = mainSexTypes.get(Util.random.nextInt(mainSexTypes.size()));
    // System.out.println("Main: "+mainSexPreference.getPenetrationType().toString()+" "+mainSexPreference.getOrificeType().toString());
    }
}
Also used : SexType(com.lilithsthrone.game.sex.SexType) OrificeType(com.lilithsthrone.game.sex.OrificeType) ArrayList(java.util.ArrayList) PenetrationType(com.lilithsthrone.game.sex.PenetrationType)

Aggregations

OrificeType (com.lilithsthrone.game.sex.OrificeType)9 ArrayList (java.util.ArrayList)6 PenetrationType (com.lilithsthrone.game.sex.PenetrationType)5 GameCharacter (com.lilithsthrone.game.character.GameCharacter)4 CoverableArea (com.lilithsthrone.game.character.body.CoverableArea)3 SexType (com.lilithsthrone.game.sex.SexType)3 PenisModifier (com.lilithsthrone.game.character.body.valueEnums.PenisModifier)2 SexParticipantType (com.lilithsthrone.game.sex.SexParticipantType)2 SexAction (com.lilithsthrone.game.sex.sexActions.SexAction)2 SexActionInterface (com.lilithsthrone.game.sex.sexActions.SexActionInterface)2 HashSet (java.util.HashSet)2 Attribute (com.lilithsthrone.game.character.attributes.Attribute)1 FluidType (com.lilithsthrone.game.character.body.types.FluidType)1 FluidModifier (com.lilithsthrone.game.character.body.valueEnums.FluidModifier)1 OrificeModifier (com.lilithsthrone.game.character.body.valueEnums.OrificeModifier)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