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());
}
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);
}
}
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));
}
}
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;
}
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());
}
}
Aggregations