use of com.lilithsthrone.game.character.body.valueEnums.PenisModifier in project liliths-throne-public by Innoxia.
the class GenericOrgasms method getGenericPenisOrgasmDescription.
private static String getGenericPenisOrgasmDescription(GameCharacter characterOrgasming, OrgasmCumTarget cumTarget) {
genericOrgasmSB.setLength(0);
genericOrgasmSB.append(getPositionPreparation(characterOrgasming));
GameCharacter characterPenetrated = null;
OrificeType orificePenetrated = null;
if (!Sex.getCharactersBeingPenetratedBy(characterOrgasming, PenetrationType.PENIS).isEmpty()) {
characterPenetrated = Sex.getCharactersBeingPenetratedBy(characterOrgasming, PenetrationType.PENIS).get(0);
orificePenetrated = Sex.getOrificesBeingPenetratedBy(characterOrgasming, PenetrationType.PENIS, characterPenetrated).get(0);
}
if (characterPenetrated == null || cumTarget != OrgasmCumTarget.INSIDE) {
List<String> modifiers = new ArrayList<>();
for (PenisModifier mod : PenisModifier.values()) {
switch(mod) {
case BARBED:
break;
case BLUNT:
break;
case FLARED:
if (characterOrgasming.hasPenisModifier(mod)) {
if (characterOrgasming.isPlayer()) {
modifiers.add(" The wide, flared head of your [npc1.cock] swells up, and you feel your [npc1.balls+] tightening as you start to cum.");
} else {
modifiers.add(" The wide, flared head of [npc.name]'s [npc.cock] swells up, and [npc.she] feels [npc.her] [npc.balls+] tightening as [npc.she] starts to cum.");
}
}
break;
case KNOTTED:
if (characterOrgasming.hasPenisModifier(mod)) {
if (characterOrgasming.isPlayer()) {
modifiers.add(" The thick knot at the base of your [npc1.cock] swells up, and you feel your [npc1.balls+] tightening as you start to cum.");
} else {
modifiers.add(" The thick knot at the base of [npc.name]'s [npc.cock] swells up, and [npc.she] feels [npc.her] [npc.balls+] tightening as [npc.she] starts to cum.");
}
}
break;
case PREHENSILE:
break;
case RIBBED:
break;
case SHEATHED:
break;
case TAPERED:
break;
case TENTACLED:
if (characterOrgasming.hasPenisModifier(mod)) {
if (characterOrgasming.isPlayer()) {
modifiers.add(" The little tentacles lining your [npc1.cock] start frantically wriggling, and you feel your [npc1.balls+] tightening as you start to cum.");
} else {
modifiers.add(" The little tentacles lining [npc.name]'s [npc.cock] start frantically wriggling, and [npc.she] feels [npc.her] [npc.balls+] tightening as [npc.she] starts to cum.");
}
}
break;
case VEINY:
break;
}
}
if (!modifiers.isEmpty()) {
genericOrgasmSB.append(modifiers.get(Util.random.nextInt(modifiers.size())));
} else {
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(" Your [npc1.cock+] twitches, and you feel your [npc1.balls+] tightening as you start to cum.");
} else {
genericOrgasmSB.append(" [npc.Name]'s [npc1.cock+] twitches, and [npc.she] feels [npc.her] [npc.balls+] tightening as [npc.she] starts to cum.");
}
}
if (characterPenetrated != null) {
genericOrgasmSB.append("</br>");
switch(orificePenetrated) {
case ANUS:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append("You slide your [npc1.cock+] out of [npc2.name]'s [npc2.asshole+]");
} else {
if (characterPenetrated.isPlayer()) {
genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of your [npc2.asshole+]");
} else {
genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of [npc2.name]'s [npc2.asshole+]");
}
}
break;
case ASS:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append("You slide your [npc1.cock+] out from between [npc2.name]'s ass cheeks");
} else {
if (characterPenetrated.isPlayer()) {
genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out from between your ass cheeks");
} else {
genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out from between [npc2.name]'s ass cheeks");
}
}
break;
case BREAST:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append("You slide your [npc1.cock+] out from between [npc2.name]'s [npc2.breasts+]");
} else {
if (characterPenetrated.isPlayer()) {
genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out from between your [npc2.breasts+]");
} else {
genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out from between [npc2.name]'s [npc2.breasts+]");
}
}
break;
case MOUTH:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append("You slide your [npc1.cock+] out of [npc2.name]'s mouth");
} else {
if (characterPenetrated.isPlayer()) {
genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of your mouth");
} else {
genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of [npc2.name]'s mouth");
}
}
break;
case NIPPLE:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append("You slide your [npc1.cock+] out of [npc2.name]'s [npc2.nipple+]");
} else {
if (characterPenetrated.isPlayer()) {
genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of your [npc2.nipple+]");
} else {
genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of [npc2.name]'s [npc2.nipple+]");
}
}
break;
case THIGHS:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append("You slide your [npc1.cock+] out from between [npc2.name]'s thighs");
} else {
if (characterPenetrated.isPlayer()) {
genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out from between your thighs");
} else {
genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out from between [npc2.name]'s thighs");
}
}
break;
case URETHRA:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append("You slide your [npc1.cock+] out of [npc2.name]'s [npc2.urethra+]");
} else {
if (characterPenetrated.isPlayer()) {
genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of your [npc2.urethra+]");
} else {
genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of [npc2.name]'s [npc2.urethra+]");
}
}
break;
case VAGINA:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append("You slide your [npc1.cock+] out of [npc2.name]'s [npc2.pussy+]");
} else {
if (characterPenetrated.isPlayer()) {
genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of your [npc2.pussy+]");
} else {
genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of [npc2.name]'s [npc2.pussy+]");
}
}
break;
default:
break;
}
if (!characterOrgasming.getPenisModifiers().isEmpty()) {
switch(characterOrgasming.getPenisModifiers().get(Util.random.nextInt(characterOrgasming.getPenisModifiers().size()))) {
case BARBED:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(", before reaching down and sliding your [pc.hand] up and down over your sensitive little barbs.");
} else {
genericOrgasmSB.append(", before reaching down and sliding [npc1.her] [npc1.hand] up and down over [npc1.her] sensitive little barbs.");
}
break;
case BLUNT:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; your [pc.hand] running up the length of your [pc.cock] to rub and tease your blunt head.");
} else {
genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; [npc1.her] [npc1.hand] running up the length of [npc1.her] [npc1.cock] to rub and tease [npc1.her] blunt head.");
}
break;
case FLARED:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; your [pc.hand] running up the length of your [pc.cock] to rub and tease your wide, flared head.");
} else {
genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; [npc1.her] [npc1.hand] running up the length of [npc1.her] [npc1.cock] to rub and tease [npc1.her] wide, flared head.");
}
break;
case KNOTTED:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; your [pc.hand] sliding down the length of your [pc.cock] to grip and rub at your swollen knot.");
} else {
genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; [npc1.her] [npc1.hand] sliding down the length of [npc1.her] [npc1.cock] to grip and rub at [npc1.her] swollen knot.");
}
break;
case PREHENSILE:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; your [pc.hand] running up the length of your prehensile [pc.cock] as you curl it back against your [pc.fingers].");
} else {
genericOrgasmSB.append(", before reaching down and starting to furiously masturbate;" + " [npc1.her] [npc1.hand] sliding down the length of [npc1.her] prehensile [npc1.cock] as [npc1.she] curls it back against [npc1.her] [npc1.fingers].");
}
break;
case RIBBED:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(", before reaching down and sliding your [pc.hand] up and down over the bumpy ribs that line your [pc.cock].");
} else {
genericOrgasmSB.append(", before reaching down and sliding [npc1.her] [npc1.hand] up and down over the bumpy ribs that line [npc1.her] [npc1.cock].");
}
break;
case SHEATHED:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; your [pc.hand] sliding down the length of your [pc.cock] to bump against your sheath, before rising back up to your [pc.cockHead+].");
} else {
genericOrgasmSB.append(", before reaching down and starting to furiously masturbate;" + " [npc1.her] [npc1.hand] sliding down the length of [npc1.her] [npc1.cock] to bump against [npc1.her] sheath, before rising back up to [npc1.her] [npc1.cockHead+].");
}
break;
case TAPERED:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; your [pc.hand] running up the length of your [pc.cock] to rub and tease your tapered head.");
} else {
genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; [npc1.her] [npc1.hand] running up the length of [npc1.her] [npc1.cock] to rub and tease [npc1.her] tapered head.");
}
break;
case TENTACLED:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(", before reaching down and sliding your [pc.hand] up and down over the squirming tentacles that line the sides of your [pc.cock].");
} else {
genericOrgasmSB.append(", before reaching down and sliding [npc1.her] [npc1.hand] up and down over the squirming tentacles that line the sides of [npc1.her] [npc1.cock].");
}
break;
case VEINY:
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(", before reaching down and sliding your [pc.hand] up and down over your veiny [pc.cock].");
} else {
genericOrgasmSB.append(", before reaching down and sliding [npc1.her] [npc1.hand] up and down over [npc1.her] veiny [npc1.cock].");
}
break;
}
} else {
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; your [pc.hand] running up the length of your [pc.cock] to rub and tease your [pc.cockHead].");
} else {
genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; [npc1.her] [npc1.hand] running up the length of [npc1.her] [npc1.cock] to rub and tease [npc1.her] [npc1.cockHead].");
}
}
}
} else if (cumTarget == OrgasmCumTarget.INSIDE) {
List<String> modifiers = new ArrayList<>();
switch(orificePenetrated) {
case ANUS:
case NIPPLE:
case VAGINA:
String orificeName = (orificePenetrated == OrificeType.VAGINA ? "[npc2.pussy]" : (orificePenetrated == OrificeType.ANUS ? "[npc2.asshole]" : "[npc2.nipple]"));
String orificeNamePlusDescriptor = (orificePenetrated == OrificeType.VAGINA ? "[npc2.pussy+]" : (orificePenetrated == OrificeType.ANUS ? "[npc2.asshole+]" : "[npc2.nipple+]"));
if (characterOrgasming.hasPenisModifier(PenisModifier.KNOTTED)) {
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(" Pushing forwards, you ram the knot at the base of your [npc1.cock+] against [npc2.name]'s " + orificeNamePlusDescriptor + "." + " It's already started to swell up so much that you don't manage to get it inside on the first thrust," + " but, after pulling back and slamming your [pc.hips] forwards, you manage to push the thick knot into [npc2.her] " + orificeNamePlusDescriptor + ".");
} else {
if (characterPenetrated.isPlayer()) {
genericOrgasmSB.append(" [npc1.Name] pushes forwards, and you feel [npc1.herHim] ramming the knot at the base of [npc1.her] [npc1.cock+] against your " + orificeNamePlusDescriptor + "." + " It's already started to swell up so much that [npc.she] doesn't manage to get it inside on the first thrust," + " but, after pulling back and slamming [npc1.her] [npc1.hips] forwards, [npc1.she] manages to push the thick knot into your " + orificeNamePlusDescriptor + ".");
} else {
genericOrgasmSB.append(" Ramming the knot at the base of [npc1.her] [npc1.cock+] into [npc2.name]'s " + orificeNamePlusDescriptor + ", [npc1.name] lets out [npc1.a_moan+] as it starts to swell up inside of [npc2.herHim].");
}
}
} else {
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(" Ramming your [npc1.cock+] deep into [npc2.name]'s " + orificeNamePlusDescriptor + ", you let out [npc1.a_moan+] as you feel your [npc1.cock+] start to twitch.");
} else {
if (characterPenetrated.isPlayer()) {
genericOrgasmSB.append(" Ramming [npc1.her] [npc1.cock+] deep into your " + orificeNamePlusDescriptor + ", [npc1.name] lets out [npc1.a_moan+] as it starts to twitch inside of you.");
} else {
genericOrgasmSB.append(" Ramming [npc1.her] [npc1.cock+] deep into [npc2.name]'s " + orificeNamePlusDescriptor + ", [npc1.name] lets out [npc1.a_moan+] as it starts to twitch inside of [npc2.herHim].");
}
}
}
modifiers.clear();
for (PenisModifier mod : PenisModifier.values()) {
switch(mod) {
case BARBED:
if (characterOrgasming.hasPenisModifier(mod)) {
if (characterOrgasming.isPlayer()) {
modifiers.add(" You continue to make small, thrusting movements, raking your barbs back against the inner walls of [npc2.her] " + orificeName + " and causing [npc2.herHim] to let out [npc2.a_moan+].");
} else {
if (characterPenetrated.isPlayer()) {
modifiers.add(" [npc1.Name] continues to make small, thrusting movements, raking [npc1.her] barbs back against the inner walls of your " + orificeName + " and causing you to let out [npc2.a_moan+].");
} else {
modifiers.add(" [npc1.Name] continues to make small, thrusting movements, raking [npc1.her] barbs back against the inner walls of [npc2.name]'s " + orificeName + " and causing [npc2.herHim] to let out [npc2.a_moan+].");
}
}
}
break;
case BLUNT:
break;
case FLARED:
if (characterOrgasming.hasPenisModifier(mod)) {
if (characterOrgasming.isPlayer()) {
modifiers.add(" You feel the wide, flared head of your [npc1.cock] swell up, making a seal with which to trap your [npc1.cum] deep within [npc2.her] " + orificeName + ".");
} else {
if (characterPenetrated.isPlayer()) {
modifiers.add(" The wide, flared head of [npc1.name]'s [npc1.cock] swells up, making a seal with which to trap [npc1.her] [npc1.cum] deep within your " + orificeName + ".");
} else {
modifiers.add(" The wide, flared head of [npc1.name]'s [npc1.cock] swells up, making a seal with which to trap [npc1.her] [npc1.cum] deep within [npc2.name]'s " + orificeName + ".");
}
}
}
break;
case KNOTTED:
break;
case PREHENSILE:
break;
case RIBBED:
if (characterOrgasming.hasPenisModifier(mod)) {
if (characterOrgasming.isPlayer()) {
modifiers.add(" You feel your ribbed [npc1.cock] bumping against the inner walls of [npc2.her] " + orificeName + ", which causes [npc2.herHim] to let out [npc2.a_moan+].");
} else {
if (characterPenetrated.isPlayer()) {
modifiers.add(" The ribbed length of [npc1.name]'s [npc1.cock] bumps against the inner walls of your " + orificeName + ", which causes you to let out [npc2.a_moan+].");
} else {
modifiers.add(" The ribbed length of [npc1.name]'s [npc1.cock] bumps against the inner walls of [npc2.name]'s " + orificeName + ", which causes [npc2.herHim] to let out [npc2.a_moan+].");
}
}
}
break;
case SHEATHED:
break;
case TAPERED:
break;
case TENTACLED:
if (characterOrgasming.hasPenisModifier(mod)) {
if (characterOrgasming.isPlayer()) {
modifiers.add(" You feel the wriggling tentacles lining your [npc1.cock] start to massage the inner walls of [npc2.her] " + orificeName + ", which causes [npc2.herHim] to let out [npc2.a_moan+].");
} else {
if (characterPenetrated.isPlayer()) {
modifiers.add(" The wriggling tentacles lining [npc1.name]'s [npc1.cock] start to massage the inner walls of your " + orificeName + ", which causes you to let out [npc2.a_moan+].");
} else {
modifiers.add(" The wriggling tentacles lining [npc1.name]'s [npc1.cock] start to massage the inner walls of [npc2.name]'s " + orificeName + ", which causes [npc2.herHim] to let out [npc2.a_moan+].");
}
}
}
break;
case VEINY:
break;
}
}
if (!modifiers.isEmpty()) {
genericOrgasmSB.append(modifiers.get(Util.random.nextInt(modifiers.size())));
}
if (characterOrgasming.hasPenisModifier(PenisModifier.KNOTTED)) {
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(" Keeping your [npc1.hips] pushed tightly against [npc2.name]'s " + orificeName + ", you let out [npc1.a_moan+] as you feel your knot swell up to its full size." + " Bucking back a little, you grin as you feel [npc2.name] pulled along with you; evidence that your [npc1.cock] is now firmly locked inside [npc2.her] " + orificeNamePlusDescriptor + ".");
} else {
if (characterPenetrated.isPlayer()) {
genericOrgasmSB.append(" Keeping [npc1.her] [npc1.hips] pushed tightly against your " + orificeName + ", [npc1.name] lets out [npc1.a_moan+] as [npc1.her] knot swells up to its full size." + " [npc.She] then bucks back a little, and you let out a startled cry as you're pulled along with [npc.herHim]; evidence that [npc1.her] [npc1.cock] is now firmly locked inside your " + orificeNamePlusDescriptor + ".");
} else {
genericOrgasmSB.append(" After just a moment, [npc1.her] knot has fully swollen in size, locking [npc1.her] [npc1.cock] inside [npc2.name]'s " + orificeName + ".");
}
}
}
break;
case ASS:
break;
case BREAST:
break;
case MOUTH:
if (characterOrgasming.hasPenisModifier(PenisModifier.KNOTTED)) {
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(" Pushing forwards, you ram the knot at the base of your [npc1.cock+] against [npc2.name]'s [npc2.face+]." + " It's already started to swell up so much that you don't manage to get it past [npc2.her] [npc2.lips+] on the first thrust," + " but, after pulling back and slamming your [pc.hips] forwards, you manage to push the thick knot into [npc2.her] [npc2.mouth].");
} else {
if (characterPenetrated.isPlayer()) {
genericOrgasmSB.append(" [npc1.Name] pushes forwards, ramming the knot at the base of [npc1.her] [npc1.cock+] into your [npc2.face+]." + " It's already started to swell up so much that [npc.she] doesn't manage to get it past your [npc2.lips+] on the first thrust," + " but, after pulling back and slamming [npc1.her] [npc1.hips] forwards, [npc1.she] manages to push the thick knot into your [npc2.mouth].");
} else {
genericOrgasmSB.append(" Ramming the knot at the base of [npc1.her] [npc1.cock+] into [npc2.name]'s mouth, [npc1.name] lets out [npc1.a_moan+] as it starts to swell up inside of [npc2.herHim].");
}
}
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(" Ramming the knot at the base of your [npc1.cock+] into [npc2.name]'s mouth, you let out [npc1.a_moan+] as you feel it start to swell up.");
} else {
if (characterPenetrated.isPlayer()) {
genericOrgasmSB.append(" Ramming the knot at the base of [npc1.her] [npc1.cock+] into your mouth, [npc1.name] lets out [npc1.a_moan+] as it starts to swell up inside of you.");
} else {
genericOrgasmSB.append(" Ramming the knot at the base of [npc1.her] [npc1.cock+] into [npc2.name]'s mouth, [npc1.name] lets out [npc1.a_moan+] as it starts to swell up inside of [npc2.herHim].");
}
}
} else {
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(" Ramming your [npc1.cock+] deep down [npc2.name]'s throat, you let out [npc1.a_moan+] as you feel your [npc1.cock+] start to twitch.");
} else {
if (characterPenetrated.isPlayer()) {
genericOrgasmSB.append(" Ramming [npc1.her] [npc1.cock+] deep down your throat, [npc1.name] lets out [npc1.a_moan+] as it starts to twitch inside of you.");
} else {
genericOrgasmSB.append(" Ramming [npc1.her] [npc1.cock+] deep down [npc2.name]'s throat, [npc1.name] lets out [npc1.a_moan+] as it starts to twitch inside of [npc2.herHim].");
}
}
}
modifiers.clear();
for (PenisModifier mod : PenisModifier.values()) {
switch(mod) {
case BARBED:
if (characterOrgasming.hasPenisModifier(mod)) {
if (characterOrgasming.isPlayer()) {
modifiers.add(" You continue to make small, thrusting movements, raking your barbs back against the lining of [npc2.her] throat and causing [npc2.herHim] to let out a choking [npc2.moan].");
} else {
if (characterPenetrated.isPlayer()) {
modifiers.add(" [npc1.Name] continues to make small, thrusting movements, raking [npc1.her] barbs back against the lining of your throat and causing you to let out a choking [npc2.moan].");
} else {
modifiers.add(" [npc1.Name] continues to make small, thrusting movements, raking [npc1.her] barbs back against the lining of [npc2.name]'s throat and causing [npc2.herHim] to let out a choking [npc2.moan].");
}
}
}
break;
case BLUNT:
break;
case FLARED:
if (characterOrgasming.hasPenisModifier(mod)) {
if (characterOrgasming.isPlayer()) {
modifiers.add(" You feel the wide, flared head of your [npc1.cock] swell up, making a seal with which to trap your [npc1.cum] deep down [npc2.her] throat.");
} else {
if (characterPenetrated.isPlayer()) {
modifiers.add(" The wide, flared head of [npc1.name]'s [npc1.cock] swells up, making a seal with which to trap [npc1.her] [npc1.cum] deep down your throat.");
} else {
modifiers.add(" The wide, flared head of [npc1.name]'s [npc1.cock] swells up, making a seal with which to trap [npc1.her] [npc1.cum] deep down [npc2.name]'s throat.");
}
}
}
break;
case KNOTTED:
break;
case PREHENSILE:
break;
case RIBBED:
if (characterOrgasming.hasPenisModifier(mod)) {
if (characterOrgasming.isPlayer()) {
modifiers.add(" You feel your ribbed [npc1.cock] bumping against the lining of [npc2.her] throat, which causes [npc2.herHim] to let out a muffled [npc2.moan].");
} else {
if (characterPenetrated.isPlayer()) {
modifiers.add(" The ribbed length of [npc1.name]'s [npc1.cock] bumps against the lining of your throat, which causes you to let out a muffled [npc2.moan].");
} else {
modifiers.add(" The ribbed length of [npc1.name]'s [npc1.cock] bumps against the lining of [npc2.name]'s throat, which causes [npc2.herHim] to let out a muffled [npc2.moan].");
}
}
}
break;
case SHEATHED:
break;
case TAPERED:
break;
case TENTACLED:
if (characterOrgasming.hasPenisModifier(mod)) {
if (characterOrgasming.isPlayer()) {
modifiers.add(" You feel the wriggling tentacles lining your [npc1.cock] start to massage the lining of [npc2.her] throat, which causes [npc2.herHim] to let out a muffled [npc2.moan].");
} else {
if (characterPenetrated.isPlayer()) {
modifiers.add(" The wriggling tentacles lining [npc1.name]'s [npc1.cock] start to massage the lining of your throat, which causes you to let out a muffled [npc2.moan].");
} else {
modifiers.add(" The wriggling tentacles lining [npc1.name]'s [npc1.cock] start to massage the lining of [npc2.name]'s throat, which causes [npc2.herHim] to let out a muffled [npc2.moan].");
}
}
}
break;
case VEINY:
break;
}
}
if (!modifiers.isEmpty()) {
genericOrgasmSB.append(modifiers.get(Util.random.nextInt(modifiers.size())));
}
if (characterOrgasming.hasPenisModifier(PenisModifier.KNOTTED)) {
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(" Keeping your [npc1.hips] pushed tightly against [npc2.name]'s [npc2.face], you let out [npc1.a_moan+] as you feel your knot swell up to its full size." + " Bucking back a little, you grin as [npc2.name]'s pulled along with you; evidence that your [npc1.cock] is now firmly locked inside [npc2.her] [npc2.mouth].");
} else {
if (characterPenetrated.isPlayer()) {
genericOrgasmSB.append(" Keeping [npc1.her] [npc1.hips] pushed tightly against your [npc2.face], [npc1.name] lets out [npc1.a_moan+] as [npc1.her] knot swells up to its full size." + " [npc.She] then bucks back a little, and you let out a very muffled cry as you're pulled along with [npc1.herHim]; evidence that [npc1.her] [npc1.cock] is now firmly locked inside your [npc2.mouth].");
} else {
genericOrgasmSB.append(" After just a moment, [npc1.her] knot has fully swollen in size, locking [npc1.her] [npc1.cock] inside [npc2.name]'s [npc2.mouth].");
}
}
}
break;
case THIGHS:
break;
case URETHRA:
break;
default:
break;
}
}
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append(" As your [npc1.balls+] tense up, ");
} else {
genericOrgasmSB.append(" As [npc1.her] [npc1.balls+] tense up, ");
}
genericOrgasmSB.append(getCumQuantityDescription(characterOrgasming));
if (characterOrgasming.getPenisRawCumProductionValue() > 0) {
genericOrgasmSB.append(cumTargetDescription(characterOrgasming, characterPenetrated, cumTarget));
}
if (characterOrgasming.hasPenisModifier(PenisModifier.KNOTTED) && cumTarget == OrgasmCumTarget.INSIDE) {
if (characterOrgasming.isPlayer()) {
genericOrgasmSB.append("</br>" + "Even after your [npc1.balls+] have pumped their entire load into [npc2.name], your knot remains swollen, locking you and your partner together." + " It takes a few minutes for it to start to deflate, and with a wet pop, you're finally able to pull your [npc1.cock+] free.");
} else {
if (characterPenetrated.isPlayer()) {
genericOrgasmSB.append("</br>" + "Even after [npc1.name]'s [npc1.balls+] have pumped their entire load into you, [npc1.her] knot remains swollen, locking you and your partner together." + " It takes a few minutes for it to start to deflate, and with a wet pop, [npc1.she]'s finally able to pull [npc1.her] [npc1.cock+] free.");
} else {
genericOrgasmSB.append("</br>" + "Even after [npc1.name]'s [npc1.balls+] have pumped their entire load into [ncp2.name], [npc1.her] knot remains swollen, locking [npc1.herHim] and [npc1.her] partner together." + " It takes a few minutes for it to start to deflate, and with a wet pop, [npc1.she]'s finally able to pull [npc1.her] [npc1.cock+] free.");
}
}
}
if (characterPenetrated != null) {
return UtilText.parse(characterOrgasming, characterPenetrated, genericOrgasmSB.toString());
} else {
return UtilText.parse(characterOrgasming, genericOrgasmSB.toString());
}
}
use of com.lilithsthrone.game.character.body.valueEnums.PenisModifier in project liliths-throne-public by Innoxia.
the class Body method saveAsXML.
@Override
public Element saveAsXML(Element parentElement, Document doc) {
// Core:
Element bodyCore = doc.createElement("bodyCore");
parentElement.appendChild(bodyCore);
CharacterUtils.addAttribute(doc, bodyCore, "piercedStomach", String.valueOf(this.isPiercedStomach()));
CharacterUtils.addAttribute(doc, bodyCore, "height", String.valueOf(this.getHeightValue()));
CharacterUtils.addAttribute(doc, bodyCore, "femininity", String.valueOf(this.getFemininity()));
CharacterUtils.addAttribute(doc, bodyCore, "bodySize", String.valueOf(this.getBodySize()));
CharacterUtils.addAttribute(doc, bodyCore, "muscle", String.valueOf(this.getMuscle()));
CharacterUtils.addAttribute(doc, bodyCore, "pubicHair", String.valueOf(this.getPubicHair()));
CharacterUtils.addAttribute(doc, bodyCore, "bodyMaterial", String.valueOf(this.getBodyMaterial()));
CharacterUtils.addAttribute(doc, bodyCore, "genitalArrangement", String.valueOf(this.getGenitalArrangement()));
for (BodyCoveringType bct : BodyCoveringType.values()) {
Element element = doc.createElement("bodyCovering");
bodyCore.appendChild(element);
CharacterUtils.addAttribute(doc, element, "type", bct.toString());
CharacterUtils.addAttribute(doc, element, "pattern", this.coverings.get(bct).getPattern().toString());
CharacterUtils.addAttribute(doc, element, "modifier", this.coverings.get(bct).getModifier().toString());
CharacterUtils.addAttribute(doc, element, "colourPrimary", this.coverings.get(bct).getPrimaryColour().toString());
if (this.coverings.get(bct).isPrimaryGlowing()) {
CharacterUtils.addAttribute(doc, element, "glowPrimary", String.valueOf(this.coverings.get(bct).isPrimaryGlowing()));
}
CharacterUtils.addAttribute(doc, element, "colourSecondary", this.coverings.get(bct).getSecondaryColour().toString());
if (this.coverings.get(bct).isSecondaryGlowing()) {
CharacterUtils.addAttribute(doc, element, "glowSecondary", String.valueOf(this.coverings.get(bct).isSecondaryGlowing()));
}
if (this.getBodyCoveringTypesDiscovered().contains(bct)) {
CharacterUtils.addAttribute(doc, element, "discovered", String.valueOf(this.getBodyCoveringTypesDiscovered().contains(bct)));
}
}
// Antennae:
Element bodyAntennae = doc.createElement("antennae");
parentElement.appendChild(bodyAntennae);
CharacterUtils.addAttribute(doc, bodyAntennae, "type", this.antenna.getType().toString());
CharacterUtils.addAttribute(doc, bodyAntennae, "rows", String.valueOf(this.antenna.getAntennaRows()));
// Arm:
Element bodyArm = doc.createElement("arm");
parentElement.appendChild(bodyArm);
CharacterUtils.addAttribute(doc, bodyArm, "type", this.arm.getType().toString());
CharacterUtils.addAttribute(doc, bodyArm, "rows", String.valueOf(this.arm.getArmRows()));
CharacterUtils.addAttribute(doc, bodyArm, "underarmHair", this.arm.getUnderarmHair().toString());
// Ass:
Element bodyAss = doc.createElement("ass");
parentElement.appendChild(bodyAss);
CharacterUtils.addAttribute(doc, bodyAss, "type", this.ass.getType().toString());
CharacterUtils.addAttribute(doc, bodyAss, "assSize", String.valueOf(this.ass.getAssSize().getValue()));
CharacterUtils.addAttribute(doc, bodyAss, "hipSize", String.valueOf(this.ass.getHipSize().getValue()));
Element bodyAnus = doc.createElement("anus");
parentElement.appendChild(bodyAnus);
CharacterUtils.addAttribute(doc, bodyAnus, "wetness", String.valueOf(this.ass.anus.orificeAnus.wetness));
CharacterUtils.addAttribute(doc, bodyAnus, "elasticity", String.valueOf(this.ass.anus.orificeAnus.elasticity));
CharacterUtils.addAttribute(doc, bodyAnus, "plasticity", String.valueOf(this.ass.anus.orificeAnus.plasticity));
CharacterUtils.addAttribute(doc, bodyAnus, "capacity", String.valueOf(this.ass.anus.orificeAnus.capacity));
CharacterUtils.addAttribute(doc, bodyAnus, "stretchedCapacity", String.valueOf(this.ass.anus.orificeAnus.stretchedCapacity));
CharacterUtils.addAttribute(doc, bodyAnus, "virgin", String.valueOf(this.ass.anus.orificeAnus.virgin));
CharacterUtils.addAttribute(doc, bodyAnus, "bleached", String.valueOf(this.ass.anus.bleached));
CharacterUtils.addAttribute(doc, bodyAnus, "assHair", this.ass.anus.assHair.toString());
Element anusModifiers = doc.createElement("anusModifiers");
bodyAnus.appendChild(anusModifiers);
for (OrificeModifier om : OrificeModifier.values()) {
CharacterUtils.addAttribute(doc, anusModifiers, om.toString(), String.valueOf(this.ass.anus.orificeAnus.hasOrificeModifier(om)));
}
// Breasts:
Element bodyBreast = doc.createElement("breasts");
parentElement.appendChild(bodyBreast);
CharacterUtils.addAttribute(doc, bodyBreast, "type", this.breast.type.toString());
CharacterUtils.addAttribute(doc, bodyBreast, "shape", this.breast.shape.toString());
CharacterUtils.addAttribute(doc, bodyBreast, "size", String.valueOf(this.breast.size));
CharacterUtils.addAttribute(doc, bodyBreast, "rows", String.valueOf(this.breast.rows));
CharacterUtils.addAttribute(doc, bodyBreast, "milkStorage", String.valueOf(this.breast.milkStorage));
CharacterUtils.addAttribute(doc, bodyBreast, "storedMilk", String.valueOf(this.breast.milkStored));
CharacterUtils.addAttribute(doc, bodyBreast, "milkRegeneration", String.valueOf(this.breast.milkRegeneration));
CharacterUtils.addAttribute(doc, bodyBreast, "nippleCountPerBreast", String.valueOf(this.breast.nippleCountPerBreast));
Element bodyNipple = doc.createElement("nipples");
parentElement.appendChild(bodyNipple);
CharacterUtils.addAttribute(doc, bodyNipple, "elasticity", String.valueOf(this.breast.nipples.orificeNipples.elasticity));
CharacterUtils.addAttribute(doc, bodyNipple, "plasticity", String.valueOf(this.breast.nipples.orificeNipples.plasticity));
CharacterUtils.addAttribute(doc, bodyNipple, "capacity", String.valueOf(this.breast.nipples.orificeNipples.capacity));
CharacterUtils.addAttribute(doc, bodyNipple, "stretchedCapacity", String.valueOf(this.breast.nipples.orificeNipples.stretchedCapacity));
CharacterUtils.addAttribute(doc, bodyNipple, "virgin", String.valueOf(this.breast.nipples.orificeNipples.virgin));
CharacterUtils.addAttribute(doc, bodyNipple, "pierced", String.valueOf(this.breast.nipples.pierced));
CharacterUtils.addAttribute(doc, bodyNipple, "nippleSize", String.valueOf(this.breast.nipples.nippleSize));
CharacterUtils.addAttribute(doc, bodyNipple, "nippleShape", this.breast.nipples.nippleShape.toString());
CharacterUtils.addAttribute(doc, bodyNipple, "areolaeSize", String.valueOf(this.breast.nipples.areolaeSize));
CharacterUtils.addAttribute(doc, bodyNipple, "areolaeShape", this.breast.nipples.areolaeShape.toString());
Element nippleModifiers = doc.createElement("nippleModifiers");
bodyNipple.appendChild(nippleModifiers);
for (OrificeModifier om : OrificeModifier.values()) {
CharacterUtils.addAttribute(doc, nippleModifiers, om.toString(), String.valueOf(this.breast.nipples.orificeNipples.hasOrificeModifier(om)));
}
Element bodyMilk = doc.createElement("milk");
parentElement.appendChild(bodyMilk);
CharacterUtils.addAttribute(doc, bodyMilk, "flavour", this.breast.milk.getFlavour().toString());
Element milkModifiers = doc.createElement("milkModifiers");
bodyMilk.appendChild(milkModifiers);
for (FluidModifier fm : FluidModifier.values()) {
CharacterUtils.addAttribute(doc, milkModifiers, fm.toString(), String.valueOf(this.breast.milk.hasFluidModifier(fm)));
}
// TODO transformativeEffects;
// Ear:
Element bodyEar = doc.createElement("ear");
parentElement.appendChild(bodyEar);
CharacterUtils.addAttribute(doc, bodyEar, "type", this.ear.type.toString());
CharacterUtils.addAttribute(doc, bodyEar, "pierced", String.valueOf(this.ear.pierced));
// Eye:
Element bodyEye = doc.createElement("eye");
parentElement.appendChild(bodyEye);
CharacterUtils.addAttribute(doc, bodyEye, "type", this.eye.type.toString());
CharacterUtils.addAttribute(doc, bodyEye, "eyePairs", String.valueOf(this.eye.eyePairs));
CharacterUtils.addAttribute(doc, bodyEye, "irisShape", this.eye.irisShape.toString());
CharacterUtils.addAttribute(doc, bodyEye, "pupilShape", this.eye.pupilShape.toString());
// Face:
Element bodyFace = doc.createElement("face");
parentElement.appendChild(bodyFace);
CharacterUtils.addAttribute(doc, bodyFace, "type", this.face.type.toString());
CharacterUtils.addAttribute(doc, bodyFace, "piercedNose", String.valueOf(this.face.piercedNose));
CharacterUtils.addAttribute(doc, bodyFace, "facialHair", this.face.facialHair.toString());
Element bodyMouth = doc.createElement("mouth");
parentElement.appendChild(bodyMouth);
CharacterUtils.addAttribute(doc, bodyMouth, "elasticity", String.valueOf(this.face.mouth.orificeMouth.elasticity));
CharacterUtils.addAttribute(doc, bodyMouth, "plasticity", String.valueOf(this.face.mouth.orificeMouth.plasticity));
CharacterUtils.addAttribute(doc, bodyMouth, "capacity", String.valueOf(this.face.mouth.orificeMouth.capacity));
CharacterUtils.addAttribute(doc, bodyMouth, "stretchedCapacity", String.valueOf(this.face.mouth.orificeMouth.stretchedCapacity));
CharacterUtils.addAttribute(doc, bodyMouth, "virgin", String.valueOf(this.face.mouth.orificeMouth.virgin));
CharacterUtils.addAttribute(doc, bodyMouth, "piercedLip", String.valueOf(this.face.mouth.piercedLip));
CharacterUtils.addAttribute(doc, bodyMouth, "lipSize", String.valueOf(this.face.mouth.lipSize));
Element mouthModifiers = doc.createElement("mouthModifiers");
bodyMouth.appendChild(mouthModifiers);
for (OrificeModifier om : OrificeModifier.values()) {
CharacterUtils.addAttribute(doc, mouthModifiers, om.toString(), String.valueOf(this.face.mouth.orificeMouth.hasOrificeModifier(om)));
}
Element bodyTongue = doc.createElement("tongue");
parentElement.appendChild(bodyTongue);
CharacterUtils.addAttribute(doc, bodyTongue, "piercedTongue", String.valueOf(this.face.tongue.pierced));
CharacterUtils.addAttribute(doc, bodyTongue, "tongueLength", String.valueOf(this.face.tongue.tongueLength));
Element tongueModifiers = doc.createElement("tongueModifiers");
bodyTongue.appendChild(tongueModifiers);
for (TongueModifier tm : TongueModifier.values()) {
CharacterUtils.addAttribute(doc, tongueModifiers, tm.toString(), String.valueOf(this.face.tongue.hasTongueModifier(tm)));
}
// Hair:
Element bodyHair = doc.createElement("hair");
parentElement.appendChild(bodyHair);
CharacterUtils.addAttribute(doc, bodyHair, "type", this.hair.type.toString());
CharacterUtils.addAttribute(doc, bodyHair, "length", String.valueOf(this.hair.length));
CharacterUtils.addAttribute(doc, bodyHair, "hairStyle", this.hair.style.toString());
// Horn:
Element bodyHorn = doc.createElement("horn");
parentElement.appendChild(bodyHorn);
CharacterUtils.addAttribute(doc, bodyHorn, "type", this.horn.type.toString());
CharacterUtils.addAttribute(doc, bodyHorn, "length", String.valueOf(this.horn.length));
CharacterUtils.addAttribute(doc, bodyHorn, "rows", String.valueOf(this.horn.rows));
// Leg:
Element bodyLeg = doc.createElement("leg");
parentElement.appendChild(bodyLeg);
CharacterUtils.addAttribute(doc, bodyLeg, "type", this.leg.type.toString());
// Penis:
Element bodyPenis = doc.createElement("penis");
parentElement.appendChild(bodyPenis);
CharacterUtils.addAttribute(doc, bodyPenis, "type", this.penis.type.toString());
CharacterUtils.addAttribute(doc, bodyPenis, "size", String.valueOf(this.penis.size));
CharacterUtils.addAttribute(doc, bodyPenis, "girth", String.valueOf(this.penis.girth));
CharacterUtils.addAttribute(doc, bodyPenis, "pierced", String.valueOf(this.penis.pierced));
CharacterUtils.addAttribute(doc, bodyPenis, "virgin", String.valueOf(this.penis.virgin));
Element penisModifiers = doc.createElement("penisModifiers");
bodyPenis.appendChild(penisModifiers);
for (PenisModifier pm : PenisModifier.values()) {
CharacterUtils.addAttribute(doc, penisModifiers, pm.toString(), String.valueOf(this.penis.hasPenisModifier(pm)));
}
CharacterUtils.addAttribute(doc, bodyPenis, "elasticity", String.valueOf(this.penis.orificeUrethra.elasticity));
CharacterUtils.addAttribute(doc, bodyPenis, "plasticity", String.valueOf(this.penis.orificeUrethra.plasticity));
CharacterUtils.addAttribute(doc, bodyPenis, "capacity", String.valueOf(this.penis.orificeUrethra.capacity));
CharacterUtils.addAttribute(doc, bodyPenis, "stretchedCapacity", String.valueOf(this.penis.orificeUrethra.stretchedCapacity));
CharacterUtils.addAttribute(doc, bodyPenis, "urethraVirgin", String.valueOf(this.penis.orificeUrethra.virgin));
Element urethraModifiers = doc.createElement("urethraModifiers");
bodyPenis.appendChild(urethraModifiers);
for (OrificeModifier om : OrificeModifier.values()) {
CharacterUtils.addAttribute(doc, urethraModifiers, om.toString(), String.valueOf(this.penis.orificeUrethra.hasOrificeModifier(om)));
}
Element bodyTesticle = doc.createElement("testicles");
parentElement.appendChild(bodyTesticle);
CharacterUtils.addAttribute(doc, bodyTesticle, "testicleSize", String.valueOf(this.penis.testicle.testicleSize));
CharacterUtils.addAttribute(doc, bodyTesticle, "cumProduction", String.valueOf(this.penis.testicle.cumStorage));
CharacterUtils.addAttribute(doc, bodyTesticle, "numberOfTesticles", String.valueOf(this.penis.testicle.testicleCount));
CharacterUtils.addAttribute(doc, bodyTesticle, "internal", String.valueOf(this.penis.testicle.internal));
Element bodyCum = doc.createElement("cum");
parentElement.appendChild(bodyCum);
CharacterUtils.addAttribute(doc, bodyCum, "flavour", this.penis.testicle.cum.flavour.toString());
Element cumModifiers = doc.createElement("cumModifiers");
bodyCum.appendChild(cumModifiers);
for (FluidModifier fm : FluidModifier.values()) {
CharacterUtils.addAttribute(doc, cumModifiers, fm.toString(), String.valueOf(this.penis.testicle.cum.hasFluidModifier(fm)));
}
// TODO transformativeEffects;
// Skin:
Element bodySkin = doc.createElement("skin");
parentElement.appendChild(bodySkin);
CharacterUtils.addAttribute(doc, bodySkin, "type", this.skin.type.toString());
// Tail:
Element bodyTail = doc.createElement("tail");
parentElement.appendChild(bodyTail);
CharacterUtils.addAttribute(doc, bodyTail, "type", this.tail.type.toString());
CharacterUtils.addAttribute(doc, bodyTail, "count", String.valueOf(this.tail.tailCount));
// Vagina
Element bodyVagina = doc.createElement("vagina");
parentElement.appendChild(bodyVagina);
CharacterUtils.addAttribute(doc, bodyVagina, "type", this.vagina.type.toString());
CharacterUtils.addAttribute(doc, bodyVagina, "labiaSize", String.valueOf(this.vagina.labiaSize));
CharacterUtils.addAttribute(doc, bodyVagina, "clitSize", String.valueOf(this.vagina.clitSize));
CharacterUtils.addAttribute(doc, bodyVagina, "pierced", String.valueOf(this.vagina.pierced));
CharacterUtils.addAttribute(doc, bodyVagina, "wetness", String.valueOf(this.vagina.orificeVagina.wetness));
CharacterUtils.addAttribute(doc, bodyVagina, "elasticity", String.valueOf(this.vagina.orificeVagina.elasticity));
CharacterUtils.addAttribute(doc, bodyVagina, "plasticity", String.valueOf(this.vagina.orificeVagina.plasticity));
CharacterUtils.addAttribute(doc, bodyVagina, "capacity", String.valueOf(this.vagina.orificeVagina.capacity));
CharacterUtils.addAttribute(doc, bodyVagina, "stretchedCapacity", String.valueOf(this.vagina.orificeVagina.stretchedCapacity));
CharacterUtils.addAttribute(doc, bodyVagina, "virgin", String.valueOf(this.vagina.orificeVagina.virgin));
CharacterUtils.addAttribute(doc, bodyVagina, "squirter", String.valueOf(this.vagina.orificeVagina.squirter));
Element vaginaModifiers = doc.createElement("vaginaModifiers");
bodyVagina.appendChild(vaginaModifiers);
for (OrificeModifier om : OrificeModifier.values()) {
CharacterUtils.addAttribute(doc, vaginaModifiers, om.toString(), String.valueOf(this.vagina.orificeVagina.hasOrificeModifier(om)));
}
Element bodyGirlcum = doc.createElement("girlcum");
parentElement.appendChild(bodyGirlcum);
CharacterUtils.addAttribute(doc, bodyGirlcum, "flavour", this.vagina.girlcum.flavour.toString());
Element girlcumModifiers = doc.createElement("girlcumModifiers");
bodyGirlcum.appendChild(girlcumModifiers);
for (FluidModifier fm : FluidModifier.values()) {
CharacterUtils.addAttribute(doc, girlcumModifiers, fm.toString(), String.valueOf(this.vagina.girlcum.hasFluidModifier(fm)));
}
// TODO transformativeEffects;
// Wing:
Element bodyWing = doc.createElement("wing");
parentElement.appendChild(bodyWing);
CharacterUtils.addAttribute(doc, bodyWing, "type", this.wing.type.toString());
CharacterUtils.addAttribute(doc, bodyWing, "size", String.valueOf(this.wing.size));
return parentElement;
}
use of com.lilithsthrone.game.character.body.valueEnums.PenisModifier in project liliths-throne-public by Innoxia.
the class Penis method setType.
public String setType(GameCharacter owner, PenisType type) {
if (type == getType()) {
if (owner.isPlayer()) {
if (type == PenisType.NONE) {
return "<p style='text-align:center;'>[style.colourDisabled(You already lack a cock, so nothing happens...)]</p>";
} else {
return "<p style='text-align:center;'>[style.colourDisabled(You already have [pc.a_cockRace]'s cock, so nothing happens...)]</p>";
}
} else {
if (type == PenisType.NONE) {
return "<p style='text-align:center;'>[style.colourDisabled([npc.Name] already lacks a cock, so nothing happens...)]</p>";
} else {
return UtilText.parse(owner, "<p style='text-align:center;'>[style.colourDisabled([npc.Name] already has [npc.a_cockRace]'s cock, so nothing happens...)]</p>");
}
}
} else {
UtilText.transformationContentSB.setLength(0);
if (owner.getPenisType() == PenisType.NONE) {
if (size < 1) {
size = 1;
}
if (owner.isPlayer()) {
UtilText.transformationContentSB.append("<p>" + "You feel an intense heat building up in your groin, and you let out a lewd moan as you feel the [pc.skin] " + (owner.hasVagina() ? "above your pussy" : "between your legs") + " tighten up and start to press outwards." + " Within moments, a large bump has formed " + (owner.hasVagina() ? "above your feminine slit," : "in the middle of your groin,") + " and with a sudden splitting sensation, the bump pushes out and forms into a penis.");
if (owner.isInternalTesticles()) {
UtilText.transformationContentSB.append(" As your new cock flops down " + (owner.hasVagina() ? "to bump against your pussy, you feel [pc.a_balls] growing within your groin," : "between your legs, you feel [pc.a_balls] growing within your groin,") + " and you let out an unwitting [pc.moan] as your new sexual organ finishes growing.</br>");
} else {
UtilText.transformationContentSB.append(" As your new cock flops down " + (owner.hasVagina() ? "to bump against your pussy, you feel [pc.a_balls] pushing out between your two sexes," : "between your legs, you feel [pc.a_balls] push out underneath the base of your new shaft,") + " and you let out an unwitting [pc.moan] as your new sexual organ finishes growing.</br>");
}
} else {
UtilText.transformationContentSB.append("<p>" + "[npc.Name] feels an intense heat building up in [npc.her] groin, and [npc.she] lets out [npc.a_moan+] as [npc.she] feels the [npc.skin] " + (owner.hasVagina() ? "above [npc.her] pussy" : "between [npc.her] legs") + " tighten up and start to press outwards." + " Within moments, a large bump has formed " + (owner.hasVagina() ? "above [npc.her] feminine slit," : "in the middle of [npc.her] groin,") + " and with a sudden splitting sensation, the bump pushes out and forms into a penis.");
if (owner.isInternalTesticles()) {
UtilText.transformationContentSB.append(" As [npc.her] new cock flops down " + (owner.hasVagina() ? "to bump against [npc.her] pussy, [npc.she] feels [npc.a_balls] growing within [npc.her] groin," : "between [npc.her] legs, [npc.she] feels [npc.a_balls] growing within [npc.her] groin,") + " and [npc.she] lets out an unwitting [npc.moan] as [npc.her] new sexual organ finishes growing.</br>");
} else {
UtilText.transformationContentSB.append(" As [npc.her] new cock flops down " + (owner.hasVagina() ? "to bump against [npc.her] pussy, [npc.she] feels [npc.a_balls] pushing out between [npc.her] two sexes," : "between [npc.her] legs, [npc.she] feels [npc.a_balls] push out underneath the base of [npc.her] new shaft,") + " and [npc.she] lets out an unwitting [npc.moan] as [npc.her] new sexual organ finishes growing.</br>");
}
}
} else {
if (owner.isPlayer()) {
UtilText.transformationContentSB.append("<p>" + "You let out a gasp as you feel your [pc.cock] suddenly stand to attention, and, trying to get your unexpected erection under control, your gasp soon turns into [pc.a_moan+] as it transforms.</br>");
} else {
UtilText.transformationContentSB.append("<p>" + "[npc.Name] suddenly blushes and lets out [npc.a_moan+], squeezing [npc.her] thighs together as [npc.her] [npc.cock] transforms.</br>");
}
}
}
// Parse existing content before transformation:
String s = UtilText.parse(owner, UtilText.transformationContentSB.toString());
UtilText.transformationContentSB.setLength(0);
UtilText.transformationContentSB.append(s);
this.type = type;
testicle.setType(owner, type.getTesticleType());
switch(type) {
case NONE:
if (owner.isPlayer()) {
UtilText.transformationContentSB.append("You squirm and moan as your cock and balls rapidly shrink away, and within seconds, nothing's left to remind you of your manhood.</br>" + "You now have [style.boldSex(no penis)]." + "</p>");
} else {
UtilText.transformationContentSB.append("[npc.She] squirms and moans as [npc.her] cock and balls rapidly shrink away, and within seconds, nothing's left to remind [npc.herHim] of [npc.her] manhood.</br>" + "[npc.Name] now has [style.boldSex(no penis)]." + "</p>");
}
orificeUrethra.setVirgin(true);
owner.setPiercedPenis(false);
break;
case HUMAN:
if (owner.isPlayer()) {
UtilText.transformationContentSB.append("You now have a [style.boldHuman(human penis)], covered in [pc.penisFullDescription(true)].</br>" + "You have [style.boldHuman([pc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " human balls)], covered in [pc.ballsFullDescription(true)], which produce [pc.cumColour(true)] [style.boldHuman(human cum)].");
} else {
UtilText.transformationContentSB.append("[npc.She] now has a [style.boldHuman(human penis)], covered in [npc.penisFullDescription(true)].</br>" + "[npc.She] has [style.boldHuman([npc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " human balls)], covered in [npc.ballsFullDescription(true)], which produce [npc.cumColour(true)] [style.boldHuman(human cum)].");
}
break;
case DEMON_COMMON:
if (owner.isPlayer()) {
UtilText.transformationContentSB.append("You squirm and [pc.moan] as the skin covering your cock transforms into a smooth, highly sensitive demonic counterpart." + " Slimy pre-cum starts drooling from the tip, and you let out [pc.a_moan+] as thick ridges suddenly press out all along its length." + " As if that wasn't enough, rows of little bumps start to press out and form into little tentacles, which then start wriggling with a mind of their own.</br>" + "You now have a [style.boldDemon(demonic penis)], covered in [pc.penisFullDescription(true)].</br>" + "You have [style.boldDemon([pc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " demonic balls)], covered in [pc.ballsFullDescription(true)], which produce [pc.cumColour(true)] [style.boldDemon(demon cum)].");
} else {
UtilText.transformationContentSB.append("[npc.She] squirms and [npc.moansVerb] as the skin covering [npc.her] cock transforms into a smooth, highly sensitive demonic counterpart." + " Slimy pre-cum starts drooling from the tip, and [npc.she] lets out [npc.a_moan+] as thick ridges suddenly press out all along its length." + " As if that wasn't enough, rows of little bumps start to press out and form into little tentacles, which then start wriggling with a mind of their own.</br>" + "[npc.She] now has a [style.boldDemon(demonic penis)], covered in [npc.penisFullDescription(true)].</br>" + "[npc.She] has [style.boldDemon([npc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " demonic balls)], covered in [npc.ballsFullDescription(true)], which produce [npc.cumColour(true)] [style.boldDemon(demon cum)].");
}
break;
case IMP:
if (owner.isPlayer()) {
UtilText.transformationContentSB.append("You squirm and [pc.moan] as the skin covering your cock transforms into a smooth, highly sensitive impish counterpart." + " Slimy pre-cum starts drooling from the tip, and you let out [pc.a_moan+] as thick ridges suddenly press out all along its length." + " As if that wasn't enough, rows of little bumps start to press out and form into little tentacles, which then start wriggling with a mind of their own.</br>" + "You now have an [style.boldImp(impish penis)], covered in [pc.penisFullDescription(true)].</br>" + "You have [style.boldImp([pc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " impish balls)], covered in [pc.ballsFullDescription(true)], which produce [pc.cumColour(true)] [style.boldImp(imp cum)].");
} else {
UtilText.transformationContentSB.append("[npc.She] squirms and [npc.moansVerb] as the skin covering [npc.her] cock transforms into a smooth, highly sensitive impish counterpart." + " Slimy pre-cum starts drooling from the tip, and [npc.she] lets out [npc.a_moan+] as thick ridges suddenly press out all along its length." + " As if that wasn't enough, rows of little bumps start to press out and form into little tentacles, which then start wriggling with a mind of their own.</br>" + "[npc.She] now has a [style.boldImp(impish penis)], covered in [npc.penisFullDescription(true)].</br>" + "[npc.She] has [style.boldImp([npc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " impish balls)], covered in [npc.ballsFullDescription(true)], which produce [npc.cumColour(true)] [style.boldImp(imp cum)].");
}
break;
case CANINE:
owner.setSkinCovering(new Covering(BodyCoveringType.PENIS, Colour.SKIN_RED), false);
if (owner.isPlayer()) {
UtilText.transformationContentSB.append("Letting out an involuntary moan, you feel your penis shifting into a new form, and you're hit by a wave of overwhelming arousal as a thick knot suddenly presses out at the base of your shaft." + " Panting and gasping for air, you feel the tip of your cock narrowing down as it tapers into its new form.</br>" + "You now have a [style.boldDogMorph(canine penis)], covered in [pc.penisFullDescription(true)].</br>" + "You have [style.boldDogMorph([pc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " canine balls)], covered in [pc.ballsFullDescription(true)], which produce [pc.cumColour(true)] [style.boldDogMorph(canine cum)].");
} else {
UtilText.transformationContentSB.append("Letting out an involuntary moan, [npc.name] feels [npc.her] penis shifting into a new form, and [npc.she]'s hit by a wave of overwhelming arousal as a thick knot suddenly presses out at the base of [npc.her] shaft." + " As [npc.she] pants and gasps for air, the tip of [npc.her] cock narrows down as it tapers into its new form.</br>" + "[npc.She] now has a [style.boldDogMorph(canine penis)], covered in [npc.penisFullDescription(true)].</br>" + "[npc.She] has [style.boldDogMorph([npc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " canine balls)], covered in [npc.ballsFullDescription(true)], which produce [npc.cumColour(true)] [style.boldDogMorph(canine cum)].");
}
break;
case ANGEL:
if (owner.isPlayer()) {
UtilText.transformationContentSB.append("You now have an [style.boldAngel(angelic penis)], covered in [pc.penisFullDescription(true)].</br>" + "You have [style.boldAngel([pc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " angelic balls)], covered in [pc.ballsFullDescription(true)], which produce [pc.cumColour(true)] [style.boldAngel(angelic cum)].");
} else {
UtilText.transformationContentSB.append("[npc.She] now has an [style.boldAngel(angelic penis)], covered in [npc.penisFullDescription(true)].</br>" + "[npc.She] has [style.boldAngel([npc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " angelic balls)], covered in [npc.ballsFullDescription(true)], which produce [npc.cumColour(true)] [style.boldAngel(angelic cum)].");
}
break;
case AVIAN:
if (owner.isPlayer()) {
UtilText.transformationContentSB.append(" Letting out an involuntary moan, you feel your penis shifting into a new form, and you're hit by a wave of overwhelming arousal as it retreats down into a new sheath that's formed at the base.</br>" + "You now have an [style.boldHarpy(avian penis)], covered in [pc.penisFullDescription(true)].</br>" + "You have [style.boldHarpy([pc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " avian balls)], covered in [pc.ballsFullDescription(true)], which produce [pc.cumColour(true)] [style.boldHarpy(avian cum)].");
} else {
UtilText.transformationContentSB.append("Letting out an involuntary moan, [npc.name] feels [npc.her] penis shifting into a new form, and [npc.she]'s hit by a wave of overwhelming arousal as it retreats down into a new sheath that's formed at the base.</br>" + "[npc.She] now has an [style.boldHarpy(avian penis)], covered in [npc.penisFullDescription(true)].</br>" + "[npc.She] has [style.boldHarpy([npc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " avian balls)], covered in [npc.ballsFullDescription(true)], which produce [npc.cumColour(true)] [style.boldHarpy(avian cum)].");
}
break;
case EQUINE:
if (owner.isPlayer()) {
UtilText.transformationContentSB.append("Letting out an involuntary moan, you feel your penis shifting into a new form, and you're hit by a wave of overwhelming arousal as your shaft grows wider and the head flattens down.</br>" + "You now have an [style.boldHorseMorph(equine penis)], covered in [pc.penisFullDescription(true)].</br>" + "You have [style.boldHorseMorph([pc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " equine balls)], covered in [pc.ballsFullDescription(true)], which produce [pc.cumColour(true)] [style.boldHorseMorph(equine cum)].");
} else {
UtilText.transformationContentSB.append("Letting out an involuntary moan, [npc.name] feels [npc.her] penis shifting into a new form, and [npc.she]'s hit by a wave of overwhelming arousal as [npc.her] shaft grows wider and the head flattens down.</br>" + "[npc.She] now has an [style.boldHorseMorph(equine penis)], covered in [npc.penisFullDescription(true)].</br>" + "[npc.She] has [style.boldHorseMorph([npc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " equine balls)], covered in [npc.ballsFullDescription(true)], which produce [npc.cumColour(true)] [style.boldHorseMorph(equine cum)].");
}
break;
case REINDEER_MORPH:
if (owner.isPlayer()) {
UtilText.transformationContentSB.append("Letting out an involuntary moan, you feel your penis shifting into a new form, and you're hit by a wave of overwhelming arousal as your shaft grows wider and the head flattens down.</br>" + "You now have a [style.boldReindeerMorph(reindeer-like penis)], covered in [pc.penisFullDescription(true)].</br>" + "You have [style.boldReindeerMorph([pc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " rangiferine balls)]," + " covered in [pc.ballsFullDescription(true)], which produce [pc.cumColour(true)] [style.boldReindeerMorph(rangiferine cum)].");
} else {
UtilText.transformationContentSB.append("Letting out an involuntary moan, [npc.name] feels [npc.her] penis shifting into a new form, and [npc.she]'s hit by a wave of overwhelming arousal as [npc.her] shaft grows wider and the head flattens down.</br>" + "[npc.She] now has an [style.boldReindeerMorph(reindeer-like penis)], covered in [npc.penisFullDescription(true)].</br>" + "[npc.She] has [style.boldReindeerMorph([npc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " rangiferine balls)]," + " covered in [npc.ballsFullDescription(true)], which produce [npc.cumColour(true)] [style.boldReindeerMorph(rangiferine cum)].");
}
break;
case BOVINE:
if (owner.isPlayer()) {
UtilText.transformationContentSB.append("Letting out an involuntary moan, you feel your penis shifting into a new form, and you're hit by a wave of overwhelming arousal as your shaft grows wider and the head flattens down.</br>" + "You now have a [style.boldCowMorph(bovine penis)], covered in [pc.penisFullDescription].</br>" + "You have [style.boldCowMorph([pc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " bovine balls)], covered in [pc.ballsFullDescription(true)], which produce [pc.cumColour(true)] [style.boldCowMorph(bovine cum)].");
} else {
UtilText.transformationContentSB.append("Letting out an involuntary moan, [npc.name] feels [npc.her] penis shifting into a new form, and [npc.she]'s hit by a wave of overwhelming arousal as [npc.her] shaft grows wider and the head flattens down.</br>" + "[npc.She] now has a [style.boldCowMorph(bovine penis)], covered in [npc.penisFullDescription].</br>" + "[npc.She] has [style.boldCowMorph([npc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " bovine balls)], covered in [npc.ballsFullDescription(true)], which produce [npc.cumColour(true)] [style.boldCowMorph(bovine cum)].");
}
break;
case FELINE:
if (owner.isPlayer()) {
UtilText.transformationContentSB.append("Letting out an involuntary moan, you feel your penis shifting into a new form, and you're hit by a wave of overwhelming arousal as rows of fleshy little backwards-facing barbs press out all along your shaft.</br>" + "You now have a [style.boldCatMorph(feline penis)], covered in [pc.penisFullDescription(true)].</br>" + "You have [style.boldCatMorph([pc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " feline balls)], covered in [pc.ballsFullDescription(true)], which produce [pc.cumColour(true)] [style.boldCatMorph(feline cum)].");
} else {
UtilText.transformationContentSB.append("Letting out an involuntary moan, [npc.she] feels [npc.her] penis shifting into a new form, and [npc.she]'s hit by a wave of overwhelming arousal as rows of fleshy little backwards-facing barbs press out all along [npc.her] shaft.</br>" + "[npc.She] now has a [style.boldCatMorph(feline penis)], covered in [npc.penisFullDescription(true)].</br>" + "[npc.She] has [style.boldCatMorph([npc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " feline balls)], covered in [npc.ballsFullDescription(true)], which produce [npc.cumColour(true)] [style.boldCatMorph(feline cum)].");
}
break;
case LUPINE:
if (owner.isPlayer()) {
UtilText.transformationContentSB.append(" Letting out an involuntary moan, you feel your penis shifting into a new form, and you're hit by a wave of overwhelming arousal as a thick knot suddenly presses out at the base of your shaft." + " Panting and gasping for air, you feel the tip of your cock narrowing down as it tapers into its new form.</br>" + "You now have a [style.boldWolfMorph(lupine penis)], covered in [pc.penisFullDescription(true)].</br>" + "You have [style.boldWolfMorph([pc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " lupine balls)], covered in [pc.ballsFullDescription(true)], which produce [pc.cumColour(true)] [style.boldWolfMorph(lupine cum)].");
} else {
UtilText.transformationContentSB.append(" Letting out an involuntary moan, [npc.name] feels [npc.her] penis shifting into a new form, and [npc.she]'s hit by a wave of overwhelming arousal as a thick knot suddenly presses out at the base of [npc.her] shaft." + " As [npc.she] pants and gasps for air, the tip of [npc.her] cock narrows down as it tapers into its new form.</br>" + "[npc.She] now has a [style.boldWolfMorph(lupine penis)], covered in [npc.penisFullDescription(true)].</br>" + "[npc.She] has [style.boldWolfMorph([npc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " lupine balls)], covered in [npc.ballsFullDescription(true)], which produce [npc.cumColour(true)] [style.boldWolfMorph(lupine cum)].");
}
break;
case ALLIGATOR_MORPH:
if (owner.isPlayer()) {
UtilText.transformationContentSB.append("Letting out an involuntary moan, you feel your penis shifting into a new form, and you're hit by a wave of overwhelming arousal as your shaft grows erect and the head smoothes over.</br>" + "You now have an [style.boldGatorMorph(alligator penis)], covered in [pc.penisFullDescription].</br>" + "You have [style.boldGatorMorph([pc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " reptilian balls)]," + " covered in [pc.ballsFullDescription(true)], which produce [pc.cumColour(true)] [style.boldGatorMorph(alligator-morph cum)].");
} else {
UtilText.transformationContentSB.append("Letting out an involuntary moan, [npc.name] feels [npc.her] penis shifting into a new form, and [npc.she]'s hit by a wave of overwhelming arousal as [npc.her] shaft grows erect and the head smoothes over.</br>" + "[npc.She] now has an [style.boldGatorMorph(alligator penis)], covered in [npc.penisFullDescription].</br>" + "[npc.She] has [style.boldGatorMorph([npc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " reptilian balls)]," + " covered in [npc.ballsFullDescription(true)], which produce [npc.cumColour(true)] [style.boldGatorMorph(alligator-morph cum)].");
}
break;
case SQUIRREL:
if (owner.isPlayer()) {
UtilText.transformationContentSB.append("You now have a [style.boldSquirrelMorph(squirrel-morph's penis)], covered in [pc.penisFullDescription(true)].</br>" + "You have [style.boldSquirrelMorph([pc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " squirrel-morph's balls)]," + " covered in [pc.ballsFullDescription(true)], which produce [pc.cumColour(true)] [style.boldSquirrelMorph(squirrel-morph cum)].");
} else {
UtilText.transformationContentSB.append("[npc.She] now has a [style.boldSquirrelMorph(squirrel-morph's penis)], covered in [npc.penisFullDescription(true)].</br>" + "[npc.She] has [style.boldSquirrelMorph([npc.ballsCount]" + (owner.isInternalTesticles() ? " internal," : "") + " squirrel-morph's balls)], covered in [npc.ballsFullDescription(true)]," + " which produce [npc.cumColour(true)] [style.boldSquirrelMorph(squirrel-morph cum)].");
}
break;
}
penisModifiers.clear();
penisModifiers.addAll(type.getDefaultPenisModifiers());
if (owner.isPlayer()) {
UtilText.transformationContentSB.append("</br>" + "Any old modifiers that your penis might have had have [style.boldShrink(transformed away)]!");
} else {
UtilText.transformationContentSB.append("</br>" + "Any old modifiers that [npc.her] penis might have had have [style.boldShrink(transformed away)]!");
}
if (penisModifiers.isEmpty()) {
UtilText.transformationContentSB.append("</p>");
} else {
if (owner.isPlayer()) {
UtilText.transformationContentSB.append("</br>" + "Instead, your new cock is:");
} else {
UtilText.transformationContentSB.append("</br>" + "Instead, [npc.her] new cock is:");
}
for (PenisModifier pm : penisModifiers) {
UtilText.transformationContentSB.append("</br>[style.boldGrow(" + Util.capitaliseSentence(pm.getName()) + ")]");
}
UtilText.transformationContentSB.append("</p>");
}
return UtilText.parse(owner, UtilText.transformationContentSB.toString()) + "<p>" + owner.postTransformationCalculation(false) + "</p>";
}
Aggregations