From f25b1834e407ce65f9120ace4195a350952c06e3 Mon Sep 17 00:00:00 2001
From: lowercasedonkey <lowercasedonkey@gmail.com>
Date: Tue, 11 May 2021 09:45:03 -0400
Subject: [PATCH 1/7] start

---
 src/npc/interaction/fKiss.js | 578 +++++++++++++++++++++++++++++++++++
 src/npc/interaction/fKiss.tw | 326 --------------------
 2 files changed, 578 insertions(+), 326 deletions(-)
 create mode 100644 src/npc/interaction/fKiss.js
 delete mode 100644 src/npc/interaction/fKiss.tw

diff --git a/src/npc/interaction/fKiss.js b/src/npc/interaction/fKiss.js
new file mode 100644
index 00000000000..32e9abad78c
--- /dev/null
+++ b/src/npc/interaction/fKiss.js
@@ -0,0 +1,578 @@
+/**
+ *
+ * @param {App.Entity.SlaveState} slave
+ * @returns {DocumentFragment}
+ */
+App.Interact.fKiss = function(slave) {
+	const node = new DocumentFragment();
+	let r = [];
+
+	const {
+		He, His,
+		he, his, him, himself, wife, woman, girl
+	} = getPronouns(slave);
+
+	const {title: Master, say: say} = getEnunciation(slave);
+
+	const {womanP} = getPronouns(V.PC).appendSuffix("P");
+	let _tempGag = "";
+	r.push(`You tell ${slave.slaveName} to`);
+	switch (slave.mouthAccessory) {
+		case "none":
+			if (canMove(slave)) {
+				r.push(`approach you.`);
+			} else {
+				r.push(`have another slave help ${him} to your desk.`);
+			}
+		case "dildo gag":
+			if (hasAnyArms(slave) && canMove(slave)) {
+				r.push(`remove ${his} dildo gag and approach you.`);
+			} else {
+				r.push(`have another slave remove ${his} dildo gag and set ${him} down on your desk.`);
+			}
+			_tempGag = slave.mouthAccessory;
+			slave.mouthAccessory = "none";
+		case "massive dildo gag":
+			if (hasAnyArms(slave) && canMove(slave)) {
+				r.push(`pull ${his} enormous dildo gag out of the depths of ${his} throat and approach you.`);
+			} else {
+				r.push(`have another slave pull the enormous dildo gag out of the depths of ${his} throat and set ${him} down on your desk.`);
+			}
+			_tempGag = slave.mouthAccessory, slave.mouthAccessory = "none";
+		default:
+			if (hasAnyArms(slave) && canMove(slave)) {
+				r.push(`undo ${his} gag and approach you.`);
+			} else {
+				r.push(`have another slave undo ${his} gag and set ${him} down on your desk.`);
+			}
+			_tempGag = slave.mouthAccessory, slave.mouthAccessory = "none";
+	}
+
+	if (slave.fetish === "mindbroken" && slave.relationship !== -3) {
+		r.push(`${He} complies mechanically. ${He} remembers that when ${getWrittenTitle(slave)}'s commands are not obeyed, there is punishment.`);
+	} else if (slave.relationship === -2) {
+		r.push(`${He} hurriedly complies, happy to be near the object of ${his} longing. Once ${he}'s close, you take a moment to gaze deeply`);
+		if (canSee(slave)) {
+			r.push(`into ${his} `);
+			App.Desc.eyesColor(slave);
+			r.push(`. ${He} finds the intense look from the ${womanP} ${he} loves overwhelming, and ${his} eyes flick downward after a moment.`);
+		} else {
+			r.push(`upon ${his} face. ${He} senses the intense look from the ${womanP} ${he} loves and finds it overwhelming, and after a moment glances away.`);
+		}
+		r.push(`${He} blushes furiously.`);
+	} else if (slave.relationship === -3) {
+		if (slave.fetish === "mindbroken") {
+			r.push(`${He} complies mechanically. ${He} remembers that when ${getWrittenTitle(slave)}'s commands are not obeyed, there is punishment. You kiss ${him} deeply and intensely; ${he} doesn't understand why.`);
+		} else if (slave.devotion+slave.trust >= 175) {
+			r.push(`${He} complies in a ${wife}ly fashion, moving ${his} body as ${he} approaches to best catch your desire. Once ${he}'s close, you take a moment to gaze deeply`);
+			if (canSee(slave)) {
+				r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s married to affirming, and looks down with a smile, running ${his} eyes over your `);
+				if (V.PC.boobs >= 300) {
+					r.push(`bosom`);
+				} else {
+					r.push(`chest`);
+				}
+				r.push(`.`);
+			} else {
+				r.push(`upon ${his} face. ${He} senses the intense look from the ${womanP} ${he}'s married to and finds it affirming, and looks down with a smile.`);
+			}
+		} else if (slave.devotion < -20 && slave.trust > 20) {
+			r.push(`${He} complies. Once ${he}'s close, you take a moment to gaze deeply`);
+			if (canSee(slave)) {
+				r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s forcibly married to disturbing, and quickly breaks eye contact.`);
+			} else {
+				r.push(`upon ${his} face. ${He} senses the intense look from the ${womanP} ${he}'s forcibly married to and finds it disturbing, and quickly turns ${his} face away.`);
+			}
+		} else if (slave.devotion < -20) {
+			r.push(`${He} complies fearfully. Once ${he}'s close, you take a moment to gaze deeply`);
+			if (canSee(slave)) {
+				r.push(`into ${his} tearing ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s forcibly married to horrifying, and quickly breaks eye contact.`);
+			} else {
+				r.push(`upon ${his} tear-streaked face. ${He} senses the intense look from the ${womanP} ${he}'s forcibly married to and finds it horrifying, and quickly turns ${his} face away.`);
+			}
+		} else {
+			r.push(`${He} complies obediently. Once ${he}'s close, you take a moment to gaze deeply`);
+			if (canSee(slave)) {
+				r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s married to reassuring, and looks down with a slight smile, running ${his} eyes over your `);
+				if (V.PC.boobs >= 300) {
+					r.push(`bosom`);
+				} else {
+					r.push(`chest`);
+				}
+				r.push(`.`);
+			} else {
+				r.push(`upon ${his} face. ${He} senses the intense look from the ${womanP} ${he}'s married to and finds it reassuring, and looks down with a slight smile.`);
+			}
+		}
+	} else if (slave.devotion > 75) {
+		r.push(`${He} hurriedly complies, happy to be near you. Once ${he}'s close, you take a moment to gaze deeply`);
+		if (canSee(slave)) {
+			r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from ${his} beloved ${getWrittenTitle(slave)}`);
+
+			r.push(` disconcerting, and ${his} eyes flick downward after a moment.`);
+		} else {
+			r.push(`upon ${his} face. ${He} senses the intense look from ${his} beloved ${getWrittenTitle(slave)} and finds it disconcerting, and after a moment glances away.`);
+		}
+		r.push(`${He} blushes furiously.`);
+	} else if (slave.devotion > 50) {
+		r.push(`${He} hurriedly complies, happy to be near you. Once ${he}'s close, you take a moment to gaze deeply`);
+		if (canSee(slave)) {
+			r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)}`);
+
+			r.push(` disconcerting, and ${he} looks down after a moment, blushing.`);
+		} else {
+			r.push(`upon ${his} face. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} disconcerting, and ${he} looks down after a moment, blushing.`);
+		}
+	} else if (slave.devotion > 20) {
+		r.push(`${He} hurriedly complies, happy to be near you. Once ${he}'s close, you take a moment to gaze deeply`);
+		if (canSee(slave)) {
+			r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} worrying, and ${he} looks down after a moment, blushing nervously.`);
+		} else {
+			r.push(`upon ${his} face. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} worrying, and ${he} looks down after a moment, blushing nervously.`);
+		}
+	} else if (slave.devotion >= -20 && slave.trust >= -20) {
+		r.push(`${He} visibly considers disobedience, but decides that complying with such an apparently harmless order is safe, for now. Once ${he}'s close, you take a moment to gaze deeply`);
+		if (canSee(slave)) {
+			r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} worrying, and ${he} looks down after a moment, ${his} lower lip trembling with nervousness.`);
+		} else {
+			r.push(`upon ${his} face. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} worrying, and turns away after a moment, ${his} lower lip trembling with nervousness.`);
+		}
+	} else if (slave.trust < -20) {
+		r.push(`The command terrifies ${him}, but ${he}'s more frightened still of the consequences of disobedience, and ${he} complies. Once ${he}'s close, you take a moment to gaze deeply`);
+		if (canSee(slave)) {
+			r.push(`into ${his} ${App.Desc.eyesColor(slave)}. After a mere instant of locked gazes, ${he} looks down fearfully, and begins to shake with terror, tears leaking silently down ${his} cheeks.`);
+		} else {
+			r.push(`upon ${his} face. After a mere instant of locked faces, ${he} looks down fearfully, and begins to shake with terror, tears leaking silently down ${his} cheeks.`);
+		}
+	} else {
+		r.push(`${He} pauses, obviously considering whether to resist, but eventually decides to save ${his} strength to fight more onerous orders, and gives in. Once ${he}'s close, you take a moment to gaze deeply`);
+		if (canSee(slave)) {
+			r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} stares back, but after a few moments ${he} loses the contest of wills and looks down.`);
+		} else {
+			r.push(`upon ${his} face. ${He} faces you defiantly, but after a few moments ${he} loses the contest of wills and looks down.`);
+		}
+	}
+
+	r.push(`You extend a`);
+	if (V.PC.title === 1) {
+		r.push(`manly`);
+	} else {
+		r.push(`feminine`);
+	}
+	r.push(` hand and graze your fingertips along the line of ${his} cheekbone.`);
+	if (slave.lipsTat !== 0) {
+		r.push(`Your fingers trace ${his} facial tattoos, slowly picking out the patterns against ${his} ${slave.skin} skin.`);
+	}
+	if (slave.lipsPiercing+slave.tonguePiercing > 2) {
+		r.push(`You touch each of ${his} facial piercings, one by one, feeling the hard metal contrast with ${his} pliant flesh.`);
+	}
+	r.push(`Then, you gently raise ${his} `);
+	if (slave.face > 95) {
+		r.push(`heartrendingly beautiful`);
+	} else if (slave.face > 10) {
+		r.push(`lovely`);
+	} else if (slave.face >= -10) {
+		r.push(`pretty`);
+	} else if (slave.face >= -40) {
+		r.push(`homely`);
+	} else {
+		r.push(`ugly`);
+	}
+	r.push(` chin and kiss ${him} right on ${his} `);
+	if (slave.lips > 95) {
+		r.push(`facepussy`);
+	} else {
+		if (slave.lips > 70) {
+			r.push(`pillowlike `);
+		} else if (slave.lips > 40) {
+			r.push(`generous `);
+		} else if (slave.lips > 20) {
+			r.push(`plush `);
+		}
+		r.push(`lips`);
+	}
+	r.push(`.`);
+
+	if (slave.relationship === -3) {
+		if (slave.fetish === "mindbroken") {
+			r.push(`${His} mouth opens to accept the kiss, and is compliant with your questing tongue. You kiss your broken ${wife} deeply. ${His} posture remains completely unchanged. Being kissed affects ${him} as little as being penetrated, being struck, being loved, or being your V.wife: not at all. When you pull away,`);
+			if (canSee(slave)) {
+				r.push(`${his} ${App.Desc.eyesColor(slave)} track you carefully, awaiting further use of ${his} body.`);
+			} else {
+				r.push(`${he} exposes ${himself} to you, awaiting further use of ${his} body.`);
+			}
+		} else if (slave.devotion+slave.trust >= 175) {
+			r.push(`${His} mouth accepts yours with love, matching itself perfectly to your insistent lips and tongue.`);
+			if (slave.teeth === "pointy" || slave.teeth === "fangs" || slave.teeth === "fang") {
+				r.push(` (Though you're quite careful around ${his} sharp dentition.)`);
+			}
+			r.push(` ${He} melts into you, sighing ever so gently. When you finally break the kiss, ${his} mouth freezes in the shape it was in when last your lips touched, and a momentary look of longing crosses ${his} face.`);
+			if (hasAnyArms(slave)) {
+				r.push(` A hand reaches dumbly up to ${his} mouth to trace ${his} lips where yours last touched.`);
+			}
+			if (slave.accent >= 3) {
+				r.push(`${He} does ${his} best to communicate love with ${his} `);
+				if (canSee(slave)) {
+					r.push(App.Desc.eyesColor(slave));
+				} else {
+					r.push(`facial expressions`);
+				}
+				r.push(`, since ${he} does not speak ${V.language} well enough to express ${himself}.`);
+			} else if (!hasAnyArms(slave) && !canTalk(slave)) {
+				r.push(`${He} does ${his} best to communicate love with ${his} `);
+				if (canSee(slave)) {
+					r.push(App.Desc.eyesColor(slave));
+				} else {
+					r.push(`facial expressions`);
+				}
+				r.push(`.`);
+			} else if (!canTalk(slave)) {
+				r.push(`${He} signs that ${he} loves you.`);
+			} else {
+				r.push(`"I love you, ${Master}," ${he} says dreamily.`);
+			}
+		} else if (slave.devotion < -20 && slave.trust > 20) {
+			r.push(`${He} reflexively turns ${his} head away from you, but you catch your ${wife} by ${his} jaw and kiss ${him} harder. You wrap your arms around ${him} so ${he} cannot escape. ${He} wriggles desperately, but ${his} struggles slowly subside as ${he} realizes that you're not taking this any farther. When you bore of it and pull away, ${he} glares at you.`);
+			if (!hasAnyArms(slave) && !canTalk(slave)) {
+				r.push(`${His} `);
+				if (canSee(slave)) {
+					r.push(`eyes demand`);
+				} else {
+					r.push(`expression demands`);
+				}
+				r.push(` an answer: are you done?`);
+			} else if (!canTalk(slave)) {
+				r.push(`${He} signs irritably, asking if you're done.`);
+			} else {
+				r.push(`${He} splutters, "Are you done, ${Master}?"`);
+			}
+		} else if (slave.devotion < -20) {
+			r.push(`${He} is nearly frozen with fear, and does not resist as you kiss ${him} deeply. In fact, ${he} barely reacts at all. ${He} opens ${his} mouth mechanically in response to your insistent tongue, but it's like kissing a doll. ${He} is so filled with terror that ${he} remains stiff even as it becomes clear to ${him} you're not going to hurt ${him}. When you bore of making out with your ${wife} and pull away, ${he} stares at you in utter incomprehension.`);
+			if (!hasAnyArms(slave) && !canTalk(slave)) {
+				r.push(`${His} `);
+				if (canSee(slave)) {
+					r.push(`eyes beg`);
+				} else {
+					r.push(`expression begs`);
+				}
+				r.push(` for an answer: is that it?`);
+			} else if (!canTalk(slave)) {
+				r.push(`${He} signs spastically, begging fearfully to know if that's it.`);
+			} else {
+				r.push(`${He} asks nervously before cringing, "I-is that it, ${Master}?"`);
+			}
+		} else {
+			r.push(`${He} accepts the kiss willingly. As you are so close to ${him}, you sense considerable turmoil in the `);
+			if (slave.physicalAge > 30) {
+				r.push(`${woman};`);
+			} else {
+				r.push(`${girl};`);
+			}
+			r.push(`${he}'s doing ${his} duty as a ${wife} by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of ${his} mind by your lips and tongue. When you finally break the kiss,`);
+			if (canSee(slave)) {
+				r.push(`${his} ${App.Desc.eyesColor(slave)} gaze into yours searchingly`);
+			} else {
+				r.push(`${he} gazes at you`);
+			}
+			r.push(`, looking for answers that are not there.`);
+			if (!hasAnyArms(slave) && !canTalk(slave)) {
+				r.push(`${His} `);
+				if (canSee(slave)) {
+					r.push(`eyes beg`);
+				} else {
+					r.push(`expression begs`);
+				}
+				r.push(` for an answer: is that it?`);
+			} else if (!canTalk(slave)) {
+				r.push(`${He} signs hesitantly, asking if that's it.`);
+			} else {
+				r.push(`${He} asks hesitantly, "I-is that it, ${Master}?"`);
+			}
+		}
+	} else if (slave.fetish === "mindbroken") {
+		r.push(`${His} mouth opens to accept the kiss, and is compliant with your questing tongue. ${His} posture remains completely unchanged. Being kissed affects ${him} as little as being penetrated, being struck, or being loved: not at all. When you pull away,`);
+		if (canSee(slave)) {
+			r.push(`${his} ${App.Desc.eyesColor(slave)} track you carefully, awaiting further use of ${his} body.`);
+		} else {
+			r.push(`${he} exposes ${himself} to you, awaiting further use of ${his} body.`);
+		}
+	} else if (slave.relationship === -2) {
+		r.push(`${His} mouth accepts yours with love, matching itself perfectly to your insistent lips and tongue.`);
+		if (slave.teeth === "pointy" || slave.teeth === "fangs" || slave.teeth === "fang") {
+			r.push(` (Though you're quite careful around ${his} sharp dentition.)`);
+		}
+		r.push(` ${He} melts into you, sighing ever so gently. When you finally break the kiss, ${his} mouth freezes in the shape it was in when last your lips touched, and a momentary look of longing crosses ${his} face.`);
+		if (hasAnyArms(slave)) {
+			r.push(` A hand reaches dumbly up to ${his} mouth to trace ${his} lips where yours last touched.`);
+		}
+		if (slave.accent >= 3) {
+			r.push(`${He} does ${his} best to communicate love with ${his} `);
+			if (canSee(slave)) {
+				r.push(App.Desc.eyesColor(slave));
+			} else {
+				r.push(`facial expressions`);
+			}
+			r.push(`, since ${he} does not speak ${V.language} well enough to express ${himself}.`);
+		} else if (!hasAnyArms(slave) && !canTalk(slave)) {
+			r.push(`${He} does ${his} best to communicate love with ${his} `);
+			if (canSee(slave)) {
+				r.push(App.Desc.eyesColor(slave));
+			} else {
+				r.push(`facial expressions`);
+			}
+			r.push(`.`);
+		} else if (!canTalk(slave)) {
+			r.push(`${He} signs that ${he} loves you.`);
+		} else {
+			r.push(`"I love you, ${Master},"`);
+			r.push(`${he} ${say}s dreamily.`);
+		}
+	} else if (slave.devotion > 50 && slave.fetish === "dom" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
+		r.push(`${He} giggles into you and kisses you back with vigor, ${his} head pressing insistently forward. The two of you make out rather aggressively`);
+		if (slave.teeth === "pointy") {
+			r.push(`, ${his} sharp teeth drawing a bit of blood from your lips and tongue`);
+		} else if (slave.teeth === "fangs") {
+			r.push(`, ${his} fangs drawing a bit of blood from your lips and tongue`);
+		} else if (slave.teeth === "fang") {
+			r.push(`, ${his} pointy fang drawing a bit of blood from your lips and tongue`);
+		}
+		r.push(`. ${He} takes ${his} tendency towards sexual dominance right up to the edge of insubordination, ${his} active tongue only retreating when yours presses against it. When you finally shove ${him} away, ${he}'s breathing hard through ${his} grin.`);
+		if (slave.accent >= 3) {
+			r.push(`${He} does ${his} best to communicate excitement with ${his} `);
+			if (canSee(slave)) {
+				r.push(App.Desc.eyesColor(slave));
+			} else {
+				r.push(`facial expressions`);
+			}
+			r.push(`, since ${he} does not speak ${V.language} well enough to express ${himself}.`);
+		} else if (!hasAnyArms(slave) && !canTalk(slave)) {
+			r.push(`${He} does ${his} best to communicate excitement with ${his} `);
+			if (canSee(slave)) {
+				r.push(App.Desc.eyesColor(slave));
+			} else {
+				r.push(`facial expressions`);
+			}
+			r.push(`.`);
+		} else if (!canTalk(slave)) {
+			r.push(`${He} signs that ${he} liked that.`);
+		} else {
+			r.push(`"That was fun, ${Master}," ${he} `);
+
+			r.push(`${say}s cheerfully.`);
+		}
+	} else if (slave.devotion > 50 && slave.fetish === "cumslut" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
+		r.push(`${He} stiffens with arousal. ${His} sexuality is complex, focusing on cum, but with a heavy layer of oral fixation. As your tongue plunders ${his} mouth, ${he} reacts almost as though ${he}'s receiving oral, whimpering and moaning into you and pressing ${himself} lewdly against your`);
+		if (V.PC.boobs >= 1400) {
+			r.push(`giant tits.`);
+		} else if (V.PC.boobs >= 1200) {
+			r.push(`huge breasts.`);
+		} else if (V.PC.boobs >= 1000) {
+			r.push(`big breasts.`);
+		} else if (V.PC.boobs >= 800) {
+			r.push(`prominent breasts.`);
+		} else if (V.PC.boobs >= 650) {
+			r.push(`unremarkable breasts.`);
+		} else if (V.PC.boobs >= 500) {
+			r.push(`breasts.`);
+		} else if (V.PC.boobs >= 300) {
+			r.push(`tiny breasts.`);
+		} else if (V.PC.title > 0) {
+			r.push(`manly chest.`);
+		} else {
+			r.push(`non-existent breasts.`);
+		}
+		if (slave.teeth === "pointy") {
+			r.push(`${He}'s very careful to avoid spearing your tongue with ${his} sharp teeth.`);
+		} else if (slave.teeth === "fangs") {
+			r.push(`${He}'s very careful to avoid spearing your tongue with ${his} fangs.`);
+		} else if (slave.teeth === "fang") {
+			r.push(`${He}'s very careful to avoid poking you with ${his} fang.`);
+		}
+		r.push(`${He} achieves a weak orgasm before you tire of making out with ${him}.`);
+		if (slave.accent >= 3) {
+			r.push(`${He} does ${his} best to communicate undiminished lust with ${his} `);
+			if (canSee(slave)) {
+				r.push(App.Desc.eyesColor(slave));
+			} else {
+				r.push(`facial expressions`);
+			}
+			r.push(`, since ${he} does not speak ${V.language} well enough to express ${himself}.`);
+		} else if (!hasAnyArms(slave) && !canTalk(slave)) {
+			r.push(`${He} does ${his} best to communicate undiminished lust with ${his} `);
+			if (canSee(slave)) {
+				r.push(App.Desc.eyesColor(slave));
+			} else {
+				r.push(`facial expressions`);
+			}
+			r.push(`.`);
+		} else if (!canTalk(slave)) {
+			r.push(`${He} signs that ${he} liked that.`);
+		} else {
+			r.push(`"That was fun, ${Master},"`);
+			r.push(` ${he} ${say}s lustfully.`);
+		}
+	} else if (slave.devotion > 50) {
+		r.push(`${His} mouth accepts yours with devotion, matching itself carefully to your insistent lips and tongue.`);
+		if (slave.teeth === "pointy") {
+			r.push(`${He} is exquisitely careful to keep ${his} sharp teeth clear of you.`);
+		} else if (slave.teeth === "fangs") {
+			r.push(`${He} is exquisitely careful to keep ${his} fangs from poking you.`);
+		} else if (slave.teeth === "fang") {
+			r.push(`${He} is exquisitely careful to keep ${his} fang from getting into trouble.`);
+		}
+		r.push(`${He} presses ${himself} against you, ${his} warmth wonderful against your`);
+		if (V.PC.boobs >= 1400) {
+			r.push(`expansive `);
+			if (V.PC.boobsImplant/V.PC.boobs >= .60) {
+				r.push(`firm`);
+			} else {
+				r.push(`soft`);
+			}
+			r.push(` chest.`);
+		} else if (V.PC.boobs >= 1200) {
+			r.push(`huge `);
+			if (V.PC.boobsImplant/V.PC.boobs >= .60) {
+				r.push(`firm`);
+			} else {
+				r.push(`soft`);
+			}
+			r.push(` breasts.`);
+		} else if (V.PC.boobs >= 1000) {
+			r.push(`big `);
+			if (V.PC.boobsImplant/V.PC.boobs >= .60) {
+				r.push(`firm`);
+			} else {
+				r.push(`soft`);
+			}
+			r.push(` breasts.`);
+		} else if (V.PC.boobs >= 800) {
+			r.push(`soft breasts.`);
+		} else if (V.PC.boobs >= 500) {
+			r.push(`breasts.`);
+		} else if (V.PC.boobs >= 300) {
+			r.push(`small chest.`);
+		} else if (V.PC.title > 0) {
+			r.push(`manly chest.`);
+		} else {
+			r.push(`flat chest.`);
+		}
+		r.push(`When you finally break the kiss, ${he} runs ${his} tongue rapturously across ${his} moistened lips`);
+		if (hasAnyArms(slave)) {
+			r.push(` and then runs a finger across them as well`);
+		}
+		r.push(`, an openly sexual look on ${his} ${slave.skin} face.`);
+		if (slave.accent >= 3) {
+			r.push(`${He} does ${his} best to communicate devotion with ${his} `);
+			if (canSee(slave)) {
+				r.push(App.Desc.eyesColor(slave));
+			} else {
+				r.push(`facial expressions`);
+			}
+			r.push(`, since ${he}'s not confident in ${his} ability to express it in ${V.language}.`);
+		} else if (!hasAnyArms(slave) && !canTalk(slave)) {
+			r.push(`${He} does ${his} best to communicate devotion with ${his} `);
+			if (canSee(slave)) {
+				r.push(App.Desc.eyesColor(slave));
+			} else {
+				r.push(`facial expressions`);
+			}
+			r.push(`.`);
+		} else if (!canTalk(slave)) {
+			r.push(`${He} signs that ${he} loves you.`);
+		} else {
+			r.push(`"I love you, ${Master},"`);
+			r.push(`${he} ${say}s forthrightly.`);
+		}
+	} else if (slave.devotion > 20) {
+		r.push(`${He} accepts the kiss willingly. As you are so close to ${him}, you sense considerable turmoil in the `);
+		if (slave.physicalAge > 30) {
+			r.push(`${woman};`);
+		} else {
+			r.push(`${girl};`);
+		}
+		r.push(`${he}'s doing ${his} duty as a slave by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of ${his} mind by your lips and tongue. When you finally break the kiss, `);
+		if (canSee(slave)) {
+			r.push(`${his} ${App.Desc.eyesColor(slave)} gaze into yours searchingly`);
+		} else {
+			r.push(`${he} gazes at you`);
+		}
+		r.push(`, looking for answers that are not there.`);
+		if (!hasAnyArms(slave) && !canTalk(slave)) {
+			r.push(`${His} `);
+			if (canSee(slave)) {
+				r.push(`eyes beg`);
+			} else {
+				r.push(`expression begs`);
+			}
+			r.push(` for an answer: is that it?`);
+		} else if (!canTalk(slave)) {
+			r.push(`${He} signs hesitantly, asking if that's it.`);
+		} else {
+			r.push(`${He} asks hesitantly, `);
+			r.push(`"I-is that it, ${Master}?"`);
+		}
+	} else if (slave.devotion >= -20 && slave.trust < -20) {
+		r.push(`${He} accepts the kiss fearfully. As you kiss ${his} unresisting mouth, ${his} eagerness to avoid punishment leads ${him} to kiss you back, though nervousness makes ${him} mechanical. You kiss ${him} harder, enjoying ${his} fear, and the physical intimacy slowly does its work. ${He} becomes softer and more natural, ${his} resistance easing. When you pull away from ${him} for a moment, ${he} `);
+		if (canSee(slave)) {
+			r.push(`looks`);
+		} else {
+			r.push(`gazes`);
+		}
+		r.push(` at you for a long moment, ${his} mouth still hanging open, before visibly catching ${himself} with a reminder that ${he}'s a slave and you're ${his} owner.`);
+		if (!hasAnyArms(slave) && !canTalk(slave)) {
+			r.push(`${His} `);
+			if (canSee(slave)) {
+				r.push(`eyes beg`);
+			} else {
+				r.push(`expression begs`);
+			}
+			r.push(` for an answer: is that it?`);
+		} else if (!canTalk(slave)) {
+			r.push(`${He} signs hesitantly, asking if that's it.`);
+		} else {
+			r.push(`${He} asks hesitantly, "I-is that it, ${Master}?"`);
+		}
+	} else if (slave.trust < -50) {
+		r.push(`${He} is nearly frozen with fear, and does not resist as you kiss ${him}. In fact, ${he} barely reacts at all. ${He} opens ${his} mouth mechanically in response to your insistent tongue, but it's like kissing a doll. ${He} is so filled with terror that ${he} remains stiff even as it becomes clear to ${him} you're not going to hurt ${him}. When you bore of making out with the poor `);
+		if (slave.physicalAge > 30) {
+			r.push(`${woman}`);
+		} else {
+			r.push(`${girl}`);
+		}
+		r.push(` and pull away, ${he} stares at you in utter incomprehension.`);
+		if (!hasAnyArms(slave) && !canTalk(slave)) {
+			r.push(`${His} `);
+			if (canSee(slave)) {
+				r.push(`eyes beg`);
+			} else {
+				r.push(`expression begs`);
+			}
+			r.push(` for an answer: is that it?`);
+		} else if (!canTalk(slave)) {
+			r.push(`${He} signs spastically, begging fearfully to know if that's it.`);
+		} else {
+			r.push(`${He} asks nervously before cringing, "I-is that it, ${Master}?"`);
+		}
+	} else {
+		r.push(`${He} reflexively turns ${his} head away from you, but you catch ${his} jaw and kiss ${him} harder. Spluttering, ${he} flees backwards, but you tip forward with ${him} and pin ${him} against your desk, plundering ${his} mouth without mercy. ${He} wriggles desperately, but ${his} struggles slowly subside as ${he} realizes that you're not taking this any farther. When you bore of it and pull away, ${he} stares at you in utter incomprehension.`);
+		if (!hasAnyArms(slave) && !canTalk(slave)) {
+			r.push(`${His} `);
+			if (canSee(slave)) {
+				r.push(`eyes demand`);
+			} else {
+				r.push(`expression demands`);
+			}
+			r.push(` an answer: is that it?`);
+		} else if (!canTalk(slave)) {
+			r.push(`${He} signs irritably, asking whether that's it.`);
+		} else {
+			r.push(`${He} splutters, "Is that it, ${Master}!?"`);
+		}
+	}
+
+	if (_tempGag) {
+		slave.mouthAccessory = _tempGag;
+	}
+	App.Events.addParagraph(node, r);
+	return node;
+};
diff --git a/src/npc/interaction/fKiss.tw b/src/npc/interaction/fKiss.tw
deleted file mode 100644
index 1019969fc2f..00000000000
--- a/src/npc/interaction/fKiss.tw
+++ /dev/null
@@ -1,326 +0,0 @@
-:: FKiss [nobr no-history]
-
-<<run App.Utils.setLocalPronouns(getSlave($AS))>>
-<<setPlayerPronouns>>
-
-You tell <<= getSlave($AS).slaveName>> to
-<<switch getSlave($AS).mouthAccessory>>
-<<case "none">>
-	<<if canMove(getSlave($AS))>>
-		approach you.
-	<<else>>
-		have another slave help $him to your desk.
-	<</if>>
-<<case "dildo gag">>
-	<<if hasAnyArms(getSlave($AS)) && canMove(getSlave($AS))>>
-		remove $his dildo gag and approach you.
-	<<else>>
-		have another slave remove $his dildo gag and set $him down on your desk.
-	<</if>>
-	<<set _tempGag = getSlave($AS).mouthAccessory, getSlave($AS).mouthAccessory = "none">>
-<<case "massive dildo gag">>
-	<<if hasAnyArms(getSlave($AS)) && canMove(getSlave($AS))>>
-		pull $his enormous dildo gag out of the depths of $his throat and approach you.
-	<<else>>
-		have another slave pull the enormous dildo gag out of the depths of $his throat and set $him down on your desk.
-	<</if>>
-	<<set _tempGag = getSlave($AS).mouthAccessory, getSlave($AS).mouthAccessory = "none">>
-<<default>>
-	<<if hasAnyArms(getSlave($AS)) && canMove(getSlave($AS))>>
-		undo $his gag and approach you.
-	<<else>>
-		have another slave undo $his gag and set $him down on your desk.
-	<</if>>
-	<<set _tempGag = getSlave($AS).mouthAccessory, getSlave($AS).mouthAccessory = "none">>
-<</switch>>
-
-<<run Enunciate(getSlave($AS))>>
-
-<<if (getSlave($AS).fetish == "mindbroken") && (getSlave($AS).relationship != -3)>>
-	$He complies mechanically. $He remembers that when <<= getWrittenTitle(getSlave($AS))>>'s commands are not obeyed, there is punishment.
-<<elseif (getSlave($AS).relationship == -2)>>
-	$He hurriedly complies, happy to be near the object of $his longing. Once $he's close, you take a moment to gaze deeply
-	<<if canSee(getSlave($AS))>>
-		into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he loves overwhelming, and $his eyes flick downward after a moment.
-	<<else>>
-		upon $his face. $He senses the intense look from the _womanP $he loves and finds it overwhelming, and after a moment glances away.
-	<</if>>
-	$He blushes furiously.
-<<elseif (getSlave($AS).relationship == -3)>>
-	<<if getSlave($AS).fetish == "mindbroken">>
-		$He complies mechanically. $He remembers that when <<= getWrittenTitle(getSlave($AS))>>'s commands are not obeyed, there is punishment. You kiss $him deeply and intensely; $he doesn't understand why.
-	<<elseif getSlave($AS).devotion+getSlave($AS).trust >= 175>>
-		$He complies in a <<= $wife>>ly fashion, moving $his body as $he approaches to best catch your desire. Once $he's close, you take a moment to gaze deeply
-		<<if canSee(getSlave($AS))>>
-			into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's married to affirming, and looks down with a smile, running $his eyes over your <<if $PC.boobs >= 300>>bosom<<else>>chest<</if>>.
-		<<else>>
-			upon $his face. $He senses the intense look from the _womanP $he's married to and finds it affirming, and looks down with a smile.
-		<</if>>
-	<<elseif getSlave($AS).devotion < -20 && getSlave($AS).trust > 20>>
-		$He complies. Once $he's close, you take a moment to gaze deeply
-		<<if canSee(getSlave($AS))>>
-			into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's forcibly married to disturbing, and quickly breaks eye contact.
-		<<else>>
-			upon $his face. $He senses the intense look from the _womanP $he's forcibly married to and finds it disturbing, and quickly turns $his face away.
-		<</if>>
-	<<elseif getSlave($AS).devotion < -20>>
-		$He complies fearfully. Once $he's close, you take a moment to gaze deeply
-		<<if canSee(getSlave($AS))>>
-			into $his tearing <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's forcibly married to horrifying, and quickly breaks eye contact.
-		<<else>>
-			upon $his tear-streaked face. $He senses the intense look from the _womanP $he's forcibly married to and finds it horrifying, and quickly turns $his face away.
-		<</if>>
-	<<else>>
-		$He complies obediently. Once $he's close, you take a moment to gaze deeply
-		<<if canSee(getSlave($AS))>>
-			into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from the _womanP $he's married to reassuring, and looks down with a slight smile, running $his eyes over your <<if $PC.boobs >= 300>>bosom<<else>>chest<</if>>.
-		<<else>>
-			upon $his face. $He senses the intense look from the _womanP $he's married to and finds it reassuring, and looks down with a slight smile.
-		<</if>>
-	<</if>>
-<<elseif (getSlave($AS).devotion > 75)>>
-	$He hurriedly complies, happy to be near you. Once $he's close, you take a moment to gaze deeply
-	<<if canSee(getSlave($AS))>>
-		into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense look from $his beloved <<= getWrittenTitle(getSlave($AS))>> disconcerting, and $his eyes flick downward after a moment.
-	<<else>>
-		upon $his face. $He senses the intense look from $his beloved <<= getWrittenTitle(getSlave($AS))>> and finds it disconcerting, and after a moment glances away.
-	<</if>>
-	$He blushes furiously.
-<<elseif (getSlave($AS).devotion > 50)>>
-	$He hurriedly complies, happy to be near you. Once $he's close, you take a moment to gaze deeply
-	<<if canSee(getSlave($AS))>>
-		into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> disconcerting, and $he looks down after a moment, blushing.
-	<<else>>
-		upon $his face. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> disconcerting, and $he looks down after a moment, blushing.
-	<</if>>
-<<elseif (getSlave($AS).devotion > 20)>>
-	$He hurriedly complies, happy to be near you. Once $he's close, you take a moment to gaze deeply
-	<<if canSee(getSlave($AS))>>
-		into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> worrying, and $he looks down after a moment, blushing nervously.
-	<<else>>
-		upon $his face. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> worrying, and $he looks down after a moment, blushing nervously.
-	<</if>>
-<<elseif (getSlave($AS).devotion >= -20) && (getSlave($AS).trust >= -20)>>
-	$He visibly considers disobedience, but decides that complying with such an apparently harmless order is safe, for now. Once $he's close, you take a moment to gaze deeply
-	<<if canSee(getSlave($AS))>>
-		into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> worrying, and $he looks down after a moment, $his lower lip trembling with nervousness.
-	<<else>>
-		upon $his face. $He finds the intense attention from $his <<= getWrittenTitle(getSlave($AS))>> worrying, and turns away after a moment, $his lower lip trembling with nervousness.
-	<</if>>
-<<elseif (getSlave($AS).trust < -20)>>
-	The command terrifies $him, but $he's more frightened still of the consequences of disobedience, and $he complies. Once $he's close, you take a moment to gaze deeply
-	<<if canSee(getSlave($AS))>>
-		into $his <<= App.Desc.eyesColor(getSlave($AS))>>. After a mere instant of locked gazes, $he looks down fearfully, and begins to shake with terror, tears leaking silently down $his cheeks.
-	<<else>>
-		upon $his face. After a mere instant of locked faces, $he looks down fearfully, and begins to shake with terror, tears leaking silently down $his cheeks.
-	<</if>>
-<<else>>
-	$He pauses, obviously considering whether to resist, but eventually decides to save $his strength to fight more onerous orders, and gives in. Once $he's close, you take a moment to gaze deeply
-	<<if canSee(getSlave($AS))>>
-		into $his <<= App.Desc.eyesColor(getSlave($AS))>>. $He stares back, but after a few moments $he loses the contest of wills and looks down.
-	<<else>>
-		upon $his face. $He faces you defiantly, but after a few moments $he loses the contest of wills and looks down.
-	<</if>>
-<</if>>
-
-You extend a <<if $PC.title == 1>>manly<<else>>feminine<</if>> hand and graze your fingertips along the line of $his cheekbone.
-<<if (getSlave($AS).lipsTat != 0)>>
-	Your fingers trace $his facial tattoos, slowly picking out the patterns against $his <<= getSlave($AS).skin>> skin.
-<</if>>
-<<if (getSlave($AS).lipsPiercing+getSlave($AS).tonguePiercing > 2)>>
-	You touch each of $his facial piercings, one by one, feeling the hard metal contrast with $his pliant flesh.
-<</if>>
-Then, you gently raise $his <<if getSlave($AS).face > 95>>heartrendingly beautiful<<elseif getSlave($AS).face > 10>>lovely<<elseif getSlave($AS).face >= -10>>pretty<<elseif getSlave($AS).face >= -40>>homely<<else>>ugly<</if>> chin and kiss $him right on $his <<if getSlave($AS).lips > 95>>facepussy<<else>><<if getSlave($AS).lips > 70>>pillowlike <<elseif getSlave($AS).lips > 40>>generous <<elseif getSlave($AS).lips > 20>>plush <</if>>lips<</if>>.
-
-<<if (getSlave($AS).relationship == -3)>>
-	<<if getSlave($AS).fetish == "mindbroken">>
-		$His mouth opens to accept the kiss, and is compliant with your questing tongue. You kiss your broken $wife deeply. $His posture remains completely unchanged. Being kissed affects $him as little as being penetrated, being struck, being loved, or being your $wife: not at all. When you pull away,
-		<<if canSee(getSlave($AS))>>
-			$his <<= App.Desc.eyesColor(getSlave($AS))>> track you carefully, awaiting further use of $his body.
-		<<else>>
-			$he exposes $himself to you, awaiting further use of $his body.
-		<</if>>
-	<<elseif getSlave($AS).devotion+getSlave($AS).trust >= 175>>
-		$His mouth accepts yours with love, matching itself perfectly to your insistent lips and tongue.<<if (getSlave($AS).teeth == "pointy") || (getSlave($AS).teeth == "fangs") || (getSlave($AS).teeth == "fang")>> (Though you're quite careful around $his sharp dentition.)<</if>> $He melts into you, sighing ever so gently. When you finally break the kiss, $his mouth freezes in the shape it was in when last your lips touched, and a momentary look of longing crosses $his face.<<if hasAnyArms(getSlave($AS))>> A hand reaches dumbly up to $his mouth to trace $his lips where yours last touched.<</if>>
-		<<if (getSlave($AS).accent >= 3)>>
-			$He does $his best to communicate love with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>, since $he does not speak $language well enough to express $himself.
-		<<elseif !hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS)))>>
-			$He does $his best to communicate love with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>.
-		<<elseif !canTalk(getSlave($AS))>>
-			$He signs that $he loves you.
-		<<else>>
-			"I love you, <<Master>>," $he <<say>>s dreamily.
-		<</if>>
-	<<elseif getSlave($AS).devotion < -20 && getSlave($AS).trust > 20>>
-		$He reflexively turns $his head away from you, but you catch your $wife by $his jaw and kiss $him harder. You wrap your arms around $him so $he cannot escape. $He wriggles desperately, but $his struggles slowly subside as $he realizes that you're not taking this any farther. When you bore of it and pull away, $he glares at you.
-		<<if (!hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS))))>>
-			$His <<if canSee(getSlave($AS))>>eyes demand<<else>>expression demands<</if>> an answer: are you done?
-		<<elseif !canTalk(getSlave($AS))>>
-			$He signs irritably, asking if you're done.
-		<<else>>
-			$He splutters, "Are you done, <<Master>>?"
-		<</if>>
-	<<elseif getSlave($AS).devotion < -20>>
-		$He is nearly frozen with fear, and does not resist as you kiss $him deeply. In fact, $he barely reacts at all. $He opens $his mouth mechanically in response to your insistent tongue, but it's like kissing a doll. $He is so filled with terror that $he remains stiff even as it becomes clear to $him you're not going to hurt $him. When you bore of making out with your $wife and pull away, $he stares at you in utter incomprehension.
-		<<if (!hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS))))>>
-			$His <<if canSee(getSlave($AS))>>eyes beg<<else>>expression begs<</if>> for an answer: is that it?
-		<<elseif !canTalk(getSlave($AS))>>
-			$He signs spastically, begging fearfully to know if that's it.
-		<<else>>
-			$He asks nervously before cringing, "I-i<<s>> that it, <<Master>>?"
-		<</if>>
-	<<else>>
-		$He accepts the kiss willingly. As you are so close to $him, you sense considerable turmoil in the <<if (getSlave($AS).physicalAge > 30)>>$woman<<else>>$girl<</if>>; $he's doing $his duty as a $wife by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of $his mind by your lips and tongue. When you finally break the kiss, <<if canSee(getSlave($AS))>>$his <<= App.Desc.eyesColor(getSlave($AS))>> gaze into yours searchingly<<else>>$he gazes at you<</if>>, looking for answers that are not there.
-		<<if (!hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS))))>>
-			$His <<if canSee(getSlave($AS))>>eyes beg<<else>>expression begs<</if>> for an answer: is that it?
-		<<elseif !canTalk(getSlave($AS))>>
-			$He signs hesitantly, asking if that's it.
-		<<else>>
-			$He asks hesitantly, "I-i<<s>> that it, <<Master>>?"
-		<</if>>
-	<</if>>
-<<elseif (getSlave($AS).fetish == "mindbroken")>>
-	$His mouth opens to accept the kiss, and is compliant with your questing tongue. $His posture remains completely unchanged. Being kissed affects $him as little as being penetrated, being struck, or being loved: not at all. When you pull away,
-	<<if canSee(getSlave($AS))>>
-		$his <<= App.Desc.eyesColor(getSlave($AS))>> track you carefully, awaiting further use of $his body.
-	<<else>>
-		$he exposes $himself to you, awaiting further use of $his body.
-	<</if>>
-<<elseif (getSlave($AS).relationship == -2)>>
-	$His mouth accepts yours with love, matching itself perfectly to your insistent lips and tongue.<<if (getSlave($AS).teeth == "pointy") || (getSlave($AS).teeth == "fangs") || (getSlave($AS).teeth == "fang")>> (Though you're quite careful around $his sharp dentition.)<</if>> $He melts into you, sighing ever so gently. When you finally break the kiss, $his mouth freezes in the shape it was in when last your lips touched, and a momentary look of longing crosses $his face.<<if hasAnyArms(getSlave($AS))>> A hand reaches dumbly up to $his mouth to trace $his lips where yours last touched.<</if>>
-	<<if (getSlave($AS).accent >= 3)>>
-		$He does $his best to communicate love with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>, since $he does not speak $language well enough to express $himself.
-	<<elseif !hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS)))>>
-		$He does $his best to communicate love with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>.
-	<<elseif !canTalk(getSlave($AS))>>
-		$He signs that $he loves you.
-	<<else>>
-		"I love you, <<Master>>," $he <<say>>s dreamily.
-	<</if>>
-<<elseif (getSlave($AS).devotion > 50) && (getSlave($AS).fetish == "dom") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60)>>
-	$He giggles into you and kisses you back with vigor, $his head pressing insistently forward. The two of you make out rather aggressively<<if (getSlave($AS).teeth == "pointy")>>, $his sharp teeth drawing a bit of blood from your lips and tongue<<elseif (getSlave($AS).teeth == "fangs")>>, $his fangs drawing a bit of blood from your lips and tongue<<elseif (getSlave($AS).teeth == "fang")>>, $his pointy fang drawing a bit of blood from your lips and tongue<</if>>. $He takes $his tendency towards sexual dominance right up to the edge of insubordination, $his active tongue only retreating when yours presses against it. When you finally shove $him away, $he's breathing hard through $his grin.
-	<<if (getSlave($AS).accent >= 3)>>
-		$He does $his best to communicate excitement with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>, since $he does not speak $language well enough to express $himself.
-	<<elseif !hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS)))>>
-		$He does $his best to communicate excitement with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>.
-	<<elseif !canTalk(getSlave($AS))>>
-		$He signs that $he liked that.
-	<<else>>
-		"That wa<<s>> fun, <<Master>>," $he <<say>>s cheerfully.
-	<</if>>
-<<elseif (getSlave($AS).devotion > 50) && (getSlave($AS).fetish == "cumslut") && (getSlave($AS).fetishKnown == 1) && (getSlave($AS).fetishStrength > 60)>>
-	$He stiffens with arousal. $His sexuality is complex, focusing on cum, but with a heavy layer of oral fixation. As your tongue plunders $his mouth, $he reacts almost as though $he's receiving oral, whimpering and moaning into you and pressing $himself lewdly against your
-	<<if $PC.boobs >= 1400>>
-		giant tits.
-	<<elseif $PC.boobs >= 1200>>
-		huge breasts.
-	<<elseif $PC.boobs >= 1000>>
-		big breasts.
-	<<elseif $PC.boobs >= 800>>
-		prominent breasts.
-	<<elseif $PC.boobs >= 650>>
-		unremarkable breasts.
-	<<elseif $PC.boobs >= 500>>
-		breasts.
-	<<elseif $PC.boobs >= 300>>
-		tiny breasts.
-	<<elseif $PC.title > 0>>
-		manly chest.
-	<<else>>
-		non-existent breasts.
-	<</if>>
-	<<if (getSlave($AS).teeth == "pointy")>>
-		$He's very careful to avoid spearing your tongue with $his sharp teeth.
-	<<elseif (getSlave($AS).teeth == "fangs")>>
-		$He's very careful to avoid spearing your tongue with $his fangs.
-	<<elseif (getSlave($AS).teeth == "fang")>>
-		$He's very careful to avoid poking you with $his fang.
-	<</if>>
-	$He achieves a weak orgasm before you tire of making out with $him.
-	<<if (getSlave($AS).accent >= 3)>>
-		$He does $his best to communicate undiminished lust with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>, since $he does not speak $language well enough to express $himself.
-	<<elseif !hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS)))>>
-		$He does $his best to communicate undiminished lust with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>.
-	<<elseif !canTalk(getSlave($AS))>>
-		$He signs that $he liked that.
-	<<else>>
-		"That wa<<s>> fun, <<Master>>," $he <<say>>s lustfully.
-	<</if>>
-<<elseif (getSlave($AS).devotion > 50)>>
-	$His mouth accepts yours with devotion, matching itself carefully to your insistent lips and tongue.
-	<<if (getSlave($AS).teeth == "pointy")>>
-		$He is exquisitely careful to keep $his sharp teeth clear of you.
-	<<elseif (getSlave($AS).teeth == "fangs")>>
-		$He is exquisitely careful to keep $his fangs from poking you.
-	<<elseif (getSlave($AS).teeth == "fang")>>
-		$He is exquisitely careful to keep $his fang from getting into trouble.
-	<</if>>
-	$He presses $himself against you, $his warmth wonderful against your
-	<<if $PC.boobs >= 1400>>
-		expansive <<if $PC.boobsImplant/$PC.boobs >= .60>>firm<<else>>soft<</if>> chest.
-	<<elseif $PC.boobs >= 1200>>
-		huge <<if $PC.boobsImplant/$PC.boobs >= .60>>firm<<else>>soft<</if>> breasts.
-	<<elseif $PC.boobs >= 1000>>
-		big <<if $PC.boobsImplant/$PC.boobs >= .60>>firm<<else>>soft<</if>> breasts.
-	<<elseif $PC.boobs >= 800>>
-		soft breasts.
-	<<elseif $PC.boobs >= 500>>
-		breasts.
-	<<elseif $PC.boobs >= 300>>
-		small chest.
-	<<elseif $PC.title > 0>>
-		manly chest.
-	<<else>>
-		flat chest.
-	<</if>>
-	When you finally break the kiss, $he runs $his tongue rapturously across $his moistened lips<<if hasAnyArms(getSlave($AS))>> and then runs a finger across them as well<</if>>, an openly sexual look on $his <<= getSlave($AS).skin>> face.
-	<<if (getSlave($AS).accent >= 3)>>
-		$He does $his best to communicate devotion with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>, since $he's not confident in $his ability to express it in $language.
-	<<elseif !hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS)))>>
-		$He does $his best to communicate devotion with $his <<if canSee(getSlave($AS))>><<= App.Desc.eyesColor(getSlave($AS))>><<else>>facial expressions<</if>>.
-	<<elseif !canTalk(getSlave($AS))>>
-		$He signs that $he loves you.
-	<<else>>
-		"I love you, <<Master>>," $he <<say>>s forthrightly.
-	<</if>>
-<<elseif (getSlave($AS).devotion > 20)>>
-	$He accepts the kiss willingly. As you are so close to $him, you sense considerable turmoil in the <<if (getSlave($AS).physicalAge > 30)>>$woman<<else>>$girl<</if>>; $he's doing $his duty as a slave by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of $his mind by your lips and tongue. When you finally break the kiss, <<if canSee(getSlave($AS))>>$his <<= App.Desc.eyesColor(getSlave($AS))>> gaze into yours searchingly<<else>>$he gazes at you<</if>>, looking for answers that are not there.
-	<<if (!hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS))))>>
-		$His <<if canSee(getSlave($AS))>>eyes beg<<else>>expression begs<</if>> for an answer: is that it?
-	<<elseif !canTalk(getSlave($AS))>>
-		$He signs hesitantly, asking if that's it.
-	<<else>>
-		$He asks hesitantly, "I-i<<s>> that it, <<Master>>?"
-	<</if>>
-<<elseif (getSlave($AS).devotion >= -20) && (getSlave($AS).trust < -20)>>
-	$He accepts the kiss fearfully. As you kiss $his unresisting mouth, $his eagerness to avoid punishment leads $him to kiss you back, though nervousness makes $him mechanical. You kiss $him harder, enjoying $his fear, and the physical intimacy slowly does its work. $He becomes softer and more natural, $his resistance easing. When you pull away from $him for a moment, $he <<if canSee(getSlave($AS))>>looks<<else>>gazes<</if>> at you for a long moment, $his mouth still hanging open, before visibly catching $himself with a reminder that $he's a slave and you're $his owner.
-	<<if (!hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS))))>>
-		$His <<if canSee(getSlave($AS))>>eyes beg<<else>>expression begs<</if>> for an answer: is that it?
-	<<elseif !canTalk(getSlave($AS))>>
-		$He signs hesitantly, asking if that's it.
-	<<else>>
-		$He asks hesitantly, "I-i<<s>> that it, <<Master>>?"
-	<</if>>
-<<elseif (getSlave($AS).trust < -50)>>
-	$He is nearly frozen with fear, and does not resist as you kiss $him. In fact, $he barely reacts at all. $He opens $his mouth mechanically in response to your insistent tongue, but it's like kissing a doll. $He is so filled with terror that $he remains stiff even as it becomes clear to $him you're not going to hurt $him. When you bore of making out with the poor <<if (getSlave($AS).physicalAge > 30)>>$woman<<else>>$girl<</if>> and pull away, $he stares at you in utter incomprehension.
-	<<if (!hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS))))>>
-		$His <<if canSee(getSlave($AS))>>eyes beg<<else>>expression begs<</if>> for an answer: is that it?
-	<<elseif !canTalk(getSlave($AS))>>
-		$He signs spastically, begging fearfully to know if that's it.
-	<<else>>
-		$He asks nervously before cringing, "I-i<<s>> that it, <<Master>>?"
-	<</if>>
-<<else>>
-	$He reflexively turns $his head away from you, but you catch $his jaw and kiss $him harder. Spluttering, $he flees backwards, but you tip forward with $him and pin $him against your desk, plundering $his mouth without mercy. $He wriggles desperately, but $his struggles slowly subside as $he realizes that you're not taking this any farther. When you bore of it and pull away, $he stares at you in utter incomprehension.
-	<<if (!hasAnyArms(getSlave($AS)) && (!canTalk(getSlave($AS))))>>
-		$His <<if canSee(getSlave($AS))>>eyes demand<<else>>expression demands<</if>> an answer: is that it?
-	<<elseif !canTalk(getSlave($AS))>>
-		$He signs irritably, asking whether that's it.
-	<<else>>
-		$He splutters, "I<<s>> that it, <<Master>>!?"
-	<</if>>
-<</if>>
-
-<<if def _tempGag>>
-	<<set getSlave($AS).mouthAccessory = _tempGag>>
-<</if>>
-- 
GitLab


From 32faf447d7d4a9715584264ce10696a31e6110a0 Mon Sep 17 00:00:00 2001
From: lowercasedonkey <lowercasedonkey@gmail.com>
Date: Tue, 11 May 2021 09:49:16 -0400
Subject: [PATCH 2/7] fix console warnings

---
 src/npc/interaction/fKiss.js | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/npc/interaction/fKiss.js b/src/npc/interaction/fKiss.js
index 32e9abad78c..16d349cf59a 100644
--- a/src/npc/interaction/fKiss.js
+++ b/src/npc/interaction/fKiss.js
@@ -24,6 +24,7 @@ App.Interact.fKiss = function(slave) {
 			} else {
 				r.push(`have another slave help ${him} to your desk.`);
 			}
+			break;
 		case "dildo gag":
 			if (hasAnyArms(slave) && canMove(slave)) {
 				r.push(`remove ${his} dildo gag and approach you.`);
@@ -32,20 +33,24 @@ App.Interact.fKiss = function(slave) {
 			}
 			_tempGag = slave.mouthAccessory;
 			slave.mouthAccessory = "none";
+			break;
 		case "massive dildo gag":
 			if (hasAnyArms(slave) && canMove(slave)) {
 				r.push(`pull ${his} enormous dildo gag out of the depths of ${his} throat and approach you.`);
 			} else {
 				r.push(`have another slave pull the enormous dildo gag out of the depths of ${his} throat and set ${him} down on your desk.`);
 			}
-			_tempGag = slave.mouthAccessory, slave.mouthAccessory = "none";
+			_tempGag = slave.mouthAccessory;
+			slave.mouthAccessory = "none";
+			break;
 		default:
 			if (hasAnyArms(slave) && canMove(slave)) {
 				r.push(`undo ${his} gag and approach you.`);
 			} else {
 				r.push(`have another slave undo ${his} gag and set ${him} down on your desk.`);
 			}
-			_tempGag = slave.mouthAccessory, slave.mouthAccessory = "none";
+			_tempGag = slave.mouthAccessory;
+			slave.mouthAccessory = "none";
 	}
 
 	if (slave.fetish === "mindbroken" && slave.relationship !== -3) {
-- 
GitLab


From 59196203c81da4677f4e0d178db9b41a0bd1e412 Mon Sep 17 00:00:00 2001
From: lowercasedonkey <lowercasedonkey@gmail.com>
Date: Tue, 11 May 2021 09:57:48 -0400
Subject: [PATCH 3/7] fixes

---
 src/npc/interaction/fKiss.js | 257 ++++++++++++++++-------------------
 1 file changed, 120 insertions(+), 137 deletions(-)

diff --git a/src/npc/interaction/fKiss.js b/src/npc/interaction/fKiss.js
index 16d349cf59a..6b3f5fd6938 100644
--- a/src/npc/interaction/fKiss.js
+++ b/src/npc/interaction/fKiss.js
@@ -15,7 +15,7 @@ App.Interact.fKiss = function(slave) {
 	const {title: Master, say: say} = getEnunciation(slave);
 
 	const {womanP} = getPronouns(V.PC).appendSuffix("P");
-	let _tempGag = "";
+	let assignedGag = "";
 	r.push(`You tell ${slave.slaveName} to`);
 	switch (slave.mouthAccessory) {
 		case "none":
@@ -31,7 +31,7 @@ App.Interact.fKiss = function(slave) {
 			} else {
 				r.push(`have another slave remove ${his} dildo gag and set ${him} down on your desk.`);
 			}
-			_tempGag = slave.mouthAccessory;
+			assignedGag = slave.mouthAccessory;
 			slave.mouthAccessory = "none";
 			break;
 		case "massive dildo gag":
@@ -40,7 +40,7 @@ App.Interact.fKiss = function(slave) {
 			} else {
 				r.push(`have another slave pull the enormous dildo gag out of the depths of ${his} throat and set ${him} down on your desk.`);
 			}
-			_tempGag = slave.mouthAccessory;
+			assignedGag = slave.mouthAccessory;
 			slave.mouthAccessory = "none";
 			break;
 		default:
@@ -49,7 +49,7 @@ App.Interact.fKiss = function(slave) {
 			} else {
 				r.push(`have another slave undo ${his} gag and set ${him} down on your desk.`);
 			}
-			_tempGag = slave.mouthAccessory;
+			assignedGag = slave.mouthAccessory;
 			slave.mouthAccessory = "none";
 	}
 
@@ -58,9 +58,7 @@ App.Interact.fKiss = function(slave) {
 	} else if (slave.relationship === -2) {
 		r.push(`${He} hurriedly complies, happy to be near the object of ${his} longing. Once ${he}'s close, you take a moment to gaze deeply`);
 		if (canSee(slave)) {
-			r.push(`into ${his} `);
-			App.Desc.eyesColor(slave);
-			r.push(`. ${He} finds the intense look from the ${womanP} ${he} loves overwhelming, and ${his} eyes flick downward after a moment.`);
+			r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he} loves overwhelming, and ${his} eyes flick downward after a moment.`);
 		} else {
 			r.push(`upon ${his} face. ${He} senses the intense look from the ${womanP} ${he} loves and finds it overwhelming, and after a moment glances away.`);
 		}
@@ -68,16 +66,15 @@ App.Interact.fKiss = function(slave) {
 	} else if (slave.relationship === -3) {
 		if (slave.fetish === "mindbroken") {
 			r.push(`${He} complies mechanically. ${He} remembers that when ${getWrittenTitle(slave)}'s commands are not obeyed, there is punishment. You kiss ${him} deeply and intensely; ${he} doesn't understand why.`);
-		} else if (slave.devotion+slave.trust >= 175) {
+		} else if (slave.devotion + slave.trust >= 175) {
 			r.push(`${He} complies in a ${wife}ly fashion, moving ${his} body as ${he} approaches to best catch your desire. Once ${he}'s close, you take a moment to gaze deeply`);
 			if (canSee(slave)) {
-				r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s married to affirming, and looks down with a smile, running ${his} eyes over your `);
+				r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s married to affirming, and looks down with a smile, running ${his} eyes over your`);
 				if (V.PC.boobs >= 300) {
-					r.push(`bosom`);
+					r.push(`bosom.`);
 				} else {
-					r.push(`chest`);
+					r.push(`chest.`);
 				}
-				r.push(`.`);
 			} else {
 				r.push(`upon ${his} face. ${He} senses the intense look from the ${womanP} ${he}'s married to and finds it affirming, and looks down with a smile.`);
 			}
@@ -98,13 +95,12 @@ App.Interact.fKiss = function(slave) {
 		} else {
 			r.push(`${He} complies obediently. Once ${he}'s close, you take a moment to gaze deeply`);
 			if (canSee(slave)) {
-				r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s married to reassuring, and looks down with a slight smile, running ${his} eyes over your `);
+				r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from the ${womanP} ${he}'s married to reassuring, and looks down with a slight smile, running ${his} eyes over your`);
 				if (V.PC.boobs >= 300) {
-					r.push(`bosom`);
+					r.push(`bosom.`);
 				} else {
-					r.push(`chest`);
+					r.push(`chest.`);
 				}
-				r.push(`.`);
 			} else {
 				r.push(`upon ${his} face. ${He} senses the intense look from the ${womanP} ${he}'s married to and finds it reassuring, and looks down with a slight smile.`);
 			}
@@ -112,9 +108,7 @@ App.Interact.fKiss = function(slave) {
 	} else if (slave.devotion > 75) {
 		r.push(`${He} hurriedly complies, happy to be near you. Once ${he}'s close, you take a moment to gaze deeply`);
 		if (canSee(slave)) {
-			r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from ${his} beloved ${getWrittenTitle(slave)}`);
-
-			r.push(` disconcerting, and ${his} eyes flick downward after a moment.`);
+			r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense look from ${his} beloved ${getWrittenTitle(slave)} disconcerting, and ${his} eyes flick downward after a moment.`);
 		} else {
 			r.push(`upon ${his} face. ${He} senses the intense look from ${his} beloved ${getWrittenTitle(slave)} and finds it disconcerting, and after a moment glances away.`);
 		}
@@ -122,9 +116,7 @@ App.Interact.fKiss = function(slave) {
 	} else if (slave.devotion > 50) {
 		r.push(`${He} hurriedly complies, happy to be near you. Once ${he}'s close, you take a moment to gaze deeply`);
 		if (canSee(slave)) {
-			r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)}`);
-
-			r.push(` disconcerting, and ${he} looks down after a moment, blushing.`);
+			r.push(`into ${his} ${App.Desc.eyesColor(slave)}. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} disconcerting, and ${he} looks down after a moment, blushing.`);
 		} else {
 			r.push(`upon ${his} face. ${He} finds the intense attention from ${his} ${getWrittenTitle(slave)} disconcerting, and ${he} looks down after a moment, blushing.`);
 		}
@@ -164,14 +156,14 @@ App.Interact.fKiss = function(slave) {
 	} else {
 		r.push(`feminine`);
 	}
-	r.push(` hand and graze your fingertips along the line of ${his} cheekbone.`);
+	r.push(`hand and graze your fingertips along the line of ${his} cheekbone.`);
 	if (slave.lipsTat !== 0) {
 		r.push(`Your fingers trace ${his} facial tattoos, slowly picking out the patterns against ${his} ${slave.skin} skin.`);
 	}
-	if (slave.lipsPiercing+slave.tonguePiercing > 2) {
+	if (slave.lipsPiercing + slave.tonguePiercing > 2) {
 		r.push(`You touch each of ${his} facial piercings, one by one, feeling the hard metal contrast with ${his} pliant flesh.`);
 	}
-	r.push(`Then, you gently raise ${his} `);
+	r.push(`Then, you gently raise ${his}`);
 	if (slave.face > 95) {
 		r.push(`heartrendingly beautiful`);
 	} else if (slave.face > 10) {
@@ -183,20 +175,19 @@ App.Interact.fKiss = function(slave) {
 	} else {
 		r.push(`ugly`);
 	}
-	r.push(` chin and kiss ${him} right on ${his} `);
+	r.push(`chin and kiss ${him} right on ${his}`);
 	if (slave.lips > 95) {
-		r.push(`facepussy`);
+		r.push(`facepussy.`);
 	} else {
 		if (slave.lips > 70) {
-			r.push(`pillowlike `);
+			r.push(`pillowlike`);
 		} else if (slave.lips > 40) {
-			r.push(`generous `);
+			r.push(`generous`);
 		} else if (slave.lips > 20) {
-			r.push(`plush `);
+			r.push(`plush`);
 		}
-		r.push(`lips`);
+		r.push(`lips.`);
 	}
-	r.push(`.`);
 
 	if (slave.relationship === -3) {
 		if (slave.fetish === "mindbroken") {
@@ -206,46 +197,45 @@ App.Interact.fKiss = function(slave) {
 			} else {
 				r.push(`${he} exposes ${himself} to you, awaiting further use of ${his} body.`);
 			}
-		} else if (slave.devotion+slave.trust >= 175) {
+		} else if (slave.devotion + slave.trust >= 175) {
 			r.push(`${His} mouth accepts yours with love, matching itself perfectly to your insistent lips and tongue.`);
 			if (slave.teeth === "pointy" || slave.teeth === "fangs" || slave.teeth === "fang") {
-				r.push(` (Though you're quite careful around ${his} sharp dentition.)`);
+				r.push(`(Though you're quite careful around ${his} sharp dentition.)`);
 			}
-			r.push(` ${He} melts into you, sighing ever so gently. When you finally break the kiss, ${his} mouth freezes in the shape it was in when last your lips touched, and a momentary look of longing crosses ${his} face.`);
+			r.push(`${He} melts into you, sighing ever so gently. When you finally break the kiss, ${his} mouth freezes in the shape it was in when last your lips touched, and a momentary look of longing crosses ${his} face.`);
 			if (hasAnyArms(slave)) {
-				r.push(` A hand reaches dumbly up to ${his} mouth to trace ${his} lips where yours last touched.`);
+				r.push(`A hand reaches dumbly up to ${his} mouth to trace ${his} lips where yours last touched.`);
 			}
 			if (slave.accent >= 3) {
-				r.push(`${He} does ${his} best to communicate love with ${his} `);
+				r.push(`${He} does ${his} best to communicate love with ${his}`);
 				if (canSee(slave)) {
-					r.push(App.Desc.eyesColor(slave));
+					r.push(`${App.Desc.eyesColor(slave)},`);
 				} else {
-					r.push(`facial expressions`);
+					r.push(`facial expressions,`);
 				}
-				r.push(`, since ${he} does not speak ${V.language} well enough to express ${himself}.`);
+				r.push(`since ${he} does not speak ${V.language} well enough to express ${himself}.`);
 			} else if (!hasAnyArms(slave) && !canTalk(slave)) {
-				r.push(`${He} does ${his} best to communicate love with ${his} `);
+				r.push(`${He} does ${his} best to communicate love with ${his}`);
 				if (canSee(slave)) {
-					r.push(App.Desc.eyesColor(slave));
+					r.push(`${App.Desc.eyesColor(slave)}.`);
 				} else {
-					r.push(`facial expressions`);
+					r.push(`facial expressions.`);
 				}
-				r.push(`.`);
 			} else if (!canTalk(slave)) {
 				r.push(`${He} signs that ${he} loves you.`);
 			} else {
-				r.push(`"I love you, ${Master}," ${he} says dreamily.`);
+				r.push(Spoken(slave, `"I love you, ${Master}," ${he} says dreamily.`));
 			}
 		} else if (slave.devotion < -20 && slave.trust > 20) {
 			r.push(`${He} reflexively turns ${his} head away from you, but you catch your ${wife} by ${his} jaw and kiss ${him} harder. You wrap your arms around ${him} so ${he} cannot escape. ${He} wriggles desperately, but ${his} struggles slowly subside as ${he} realizes that you're not taking this any farther. When you bore of it and pull away, ${he} glares at you.`);
 			if (!hasAnyArms(slave) && !canTalk(slave)) {
-				r.push(`${His} `);
+				r.push(`${His}`);
 				if (canSee(slave)) {
 					r.push(`eyes demand`);
 				} else {
 					r.push(`expression demands`);
 				}
-				r.push(` an answer: are you done?`);
+				r.push(`an answer: are you done?`);
 			} else if (!canTalk(slave)) {
 				r.push(`${He} signs irritably, asking if you're done.`);
 			} else {
@@ -254,20 +244,20 @@ App.Interact.fKiss = function(slave) {
 		} else if (slave.devotion < -20) {
 			r.push(`${He} is nearly frozen with fear, and does not resist as you kiss ${him} deeply. In fact, ${he} barely reacts at all. ${He} opens ${his} mouth mechanically in response to your insistent tongue, but it's like kissing a doll. ${He} is so filled with terror that ${he} remains stiff even as it becomes clear to ${him} you're not going to hurt ${him}. When you bore of making out with your ${wife} and pull away, ${he} stares at you in utter incomprehension.`);
 			if (!hasAnyArms(slave) && !canTalk(slave)) {
-				r.push(`${His} `);
+				r.push(`${His}`);
 				if (canSee(slave)) {
 					r.push(`eyes beg`);
 				} else {
 					r.push(`expression begs`);
 				}
-				r.push(` for an answer: is that it?`);
+				r.push(`for an answer: is that it?`);
 			} else if (!canTalk(slave)) {
 				r.push(`${He} signs spastically, begging fearfully to know if that's it.`);
 			} else {
 				r.push(`${He} asks nervously before cringing, "I-is that it, ${Master}?"`);
 			}
 		} else {
-			r.push(`${He} accepts the kiss willingly. As you are so close to ${him}, you sense considerable turmoil in the `);
+			r.push(`${He} accepts the kiss willingly. As you are so close to ${him}, you sense considerable turmoil in the`);
 			if (slave.physicalAge > 30) {
 				r.push(`${woman};`);
 			} else {
@@ -275,19 +265,19 @@ App.Interact.fKiss = function(slave) {
 			}
 			r.push(`${he}'s doing ${his} duty as a ${wife} by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of ${his} mind by your lips and tongue. When you finally break the kiss,`);
 			if (canSee(slave)) {
-				r.push(`${his} ${App.Desc.eyesColor(slave)} gaze into yours searchingly`);
+				r.push(`${his} ${App.Desc.eyesColor(slave)} gaze into yours searchingly,`);
 			} else {
-				r.push(`${he} gazes at you`);
+				r.push(`${he} gazes at you,`);
 			}
-			r.push(`, looking for answers that are not there.`);
+			r.push(`looking for answers that are not there.`);
 			if (!hasAnyArms(slave) && !canTalk(slave)) {
-				r.push(`${His} `);
+				r.push(`${His}`);
 				if (canSee(slave)) {
 					r.push(`eyes beg`);
 				} else {
 					r.push(`expression begs`);
 				}
-				r.push(` for an answer: is that it?`);
+				r.push(`for an answer: is that it?`);
 			} else if (!canTalk(slave)) {
 				r.push(`${He} signs hesitantly, asking if that's it.`);
 			} else {
@@ -304,66 +294,65 @@ App.Interact.fKiss = function(slave) {
 	} else if (slave.relationship === -2) {
 		r.push(`${His} mouth accepts yours with love, matching itself perfectly to your insistent lips and tongue.`);
 		if (slave.teeth === "pointy" || slave.teeth === "fangs" || slave.teeth === "fang") {
-			r.push(` (Though you're quite careful around ${his} sharp dentition.)`);
+			r.push(`(Though you're quite careful around ${his} sharp dentition.)`);
 		}
-		r.push(` ${He} melts into you, sighing ever so gently. When you finally break the kiss, ${his} mouth freezes in the shape it was in when last your lips touched, and a momentary look of longing crosses ${his} face.`);
+		r.push(`${He} melts into you, sighing ever so gently. When you finally break the kiss, ${his} mouth freezes in the shape it was in when last your lips touched, and a momentary look of longing crosses ${his} face.`);
 		if (hasAnyArms(slave)) {
-			r.push(` A hand reaches dumbly up to ${his} mouth to trace ${his} lips where yours last touched.`);
+			r.push(`A hand reaches dumbly up to ${his} mouth to trace ${his} lips where yours last touched.`);
 		}
 		if (slave.accent >= 3) {
-			r.push(`${He} does ${his} best to communicate love with ${his} `);
+			r.push(`${He} does ${his} best to communicate love with ${his}`);
 			if (canSee(slave)) {
-				r.push(App.Desc.eyesColor(slave));
+				r.push(`${App.Desc.eyesColor(slave)},`);
 			} else {
-				r.push(`facial expressions`);
+				r.push(`facial expressions,`);
 			}
-			r.push(`, since ${he} does not speak ${V.language} well enough to express ${himself}.`);
+			r.push(`since ${he} does not speak ${V.language} well enough to express ${himself}.`);
 		} else if (!hasAnyArms(slave) && !canTalk(slave)) {
-			r.push(`${He} does ${his} best to communicate love with ${his} `);
+			r.push(`${He} does ${his} best to communicate love with ${his}`);
 			if (canSee(slave)) {
-				r.push(App.Desc.eyesColor(slave));
+				r.push(`${App.Desc.eyesColor(slave)}.`);
 			} else {
-				r.push(`facial expressions`);
+				r.push(`facial expressions.`);
 			}
-			r.push(`.`);
 		} else if (!canTalk(slave)) {
 			r.push(`${He} signs that ${he} loves you.`);
 		} else {
-			r.push(`"I love you, ${Master},"`);
+			r.push(Spoken(slave, `"I love you, ${Master},"`));
 			r.push(`${he} ${say}s dreamily.`);
 		}
 	} else if (slave.devotion > 50 && slave.fetish === "dom" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
-		r.push(`${He} giggles into you and kisses you back with vigor, ${his} head pressing insistently forward. The two of you make out rather aggressively`);
+		r.push(`${He} giggles into you and kisses you back with vigor, ${his} head pressing insistently forward. The two of you make out rather`);
 		if (slave.teeth === "pointy") {
-			r.push(`, ${his} sharp teeth drawing a bit of blood from your lips and tongue`);
+			r.push(`aggressively, ${his} sharp teeth drawing a bit of blood from your lips and tongue.`);
 		} else if (slave.teeth === "fangs") {
-			r.push(`, ${his} fangs drawing a bit of blood from your lips and tongue`);
+			r.push(`aggressively, ${his} fangs drawing a bit of blood from your lips and tongue.`);
 		} else if (slave.teeth === "fang") {
-			r.push(`, ${his} pointy fang drawing a bit of blood from your lips and tongue`);
+			r.push(`aggressively, ${his} pointy fang drawing a bit of blood from your lips and tongue.`);
+		} else {
+			r.push(`aggressively.`);
 		}
-		r.push(`. ${He} takes ${his} tendency towards sexual dominance right up to the edge of insubordination, ${his} active tongue only retreating when yours presses against it. When you finally shove ${him} away, ${he}'s breathing hard through ${his} grin.`);
+		r.push(`${He} takes ${his} tendency towards sexual dominance right up to the edge of insubordination, ${his} active tongue only retreating when yours presses against it. When you finally shove ${him} away, ${he}'s breathing hard through ${his} grin.`);
 		if (slave.accent >= 3) {
-			r.push(`${He} does ${his} best to communicate excitement with ${his} `);
+			r.push(`${He} does ${his} best to communicate excitement with ${his}`);
 			if (canSee(slave)) {
-				r.push(App.Desc.eyesColor(slave));
+				r.push(`${App.Desc.eyesColor(slave)},`);
 			} else {
-				r.push(`facial expressions`);
+				r.push(`facial expressions,`);
 			}
-			r.push(`, since ${he} does not speak ${V.language} well enough to express ${himself}.`);
+			r.push(`since ${he} does not speak ${V.language} well enough to express ${himself}.`);
 		} else if (!hasAnyArms(slave) && !canTalk(slave)) {
-			r.push(`${He} does ${his} best to communicate excitement with ${his} `);
+			r.push(`${He} does ${his} best to communicate excitement with ${his}`);
 			if (canSee(slave)) {
-				r.push(App.Desc.eyesColor(slave));
+				r.push(`${App.Desc.eyesColor(slave)}.`);
 			} else {
-				r.push(`facial expressions`);
+				r.push(`facial expressions.`);
 			}
-			r.push(`.`);
 		} else if (!canTalk(slave)) {
 			r.push(`${He} signs that ${he} liked that.`);
 		} else {
-			r.push(`"That was fun, ${Master}," ${he} `);
-
-			r.push(`${say}s cheerfully.`);
+			r.push(Spoken(slave, `"That was fun, ${Master},"`));
+			r.push(`${he} ${say}s cheerfully.`);
 		}
 	} else if (slave.devotion > 50 && slave.fetish === "cumslut" && slave.fetishKnown === 1 && slave.fetishStrength > 60) {
 		r.push(`${He} stiffens with arousal. ${His} sexuality is complex, focusing on cum, but with a heavy layer of oral fixation. As your tongue plunders ${his} mouth, ${he} reacts almost as though ${he}'s receiving oral, whimpering and moaning into you and pressing ${himself} lewdly against your`);
@@ -395,26 +384,25 @@ App.Interact.fKiss = function(slave) {
 		}
 		r.push(`${He} achieves a weak orgasm before you tire of making out with ${him}.`);
 		if (slave.accent >= 3) {
-			r.push(`${He} does ${his} best to communicate undiminished lust with ${his} `);
+			r.push(`${He} does ${his} best to communicate undiminished lust with ${his}`);
 			if (canSee(slave)) {
-				r.push(App.Desc.eyesColor(slave));
+				r.push(`${App.Desc.eyesColor(slave)},`);
 			} else {
-				r.push(`facial expressions`);
+				r.push(`facial expressions,`);
 			}
-			r.push(`, since ${he} does not speak ${V.language} well enough to express ${himself}.`);
+			r.push(`since ${he} does not speak ${V.language} well enough to express ${himself}.`);
 		} else if (!hasAnyArms(slave) && !canTalk(slave)) {
-			r.push(`${He} does ${his} best to communicate undiminished lust with ${his} `);
+			r.push(`${He} does ${his} best to communicate undiminished lust with ${his}`);
 			if (canSee(slave)) {
-				r.push(App.Desc.eyesColor(slave));
+				r.push(`${App.Desc.eyesColor(slave)}.`);
 			} else {
-				r.push(`facial expressions`);
+				r.push(`facial expressions.`);
 			}
-			r.push(`.`);
 		} else if (!canTalk(slave)) {
 			r.push(`${He} signs that ${he} liked that.`);
 		} else {
-			r.push(`"That was fun, ${Master},"`);
-			r.push(` ${he} ${say}s lustfully.`);
+			r.push(Spoken(slave, `"That was fun, ${Master},"`));
+			r.push(`${he} ${say}s lustfully.`);
 		}
 	} else if (slave.devotion > 50) {
 		r.push(`${His} mouth accepts yours with devotion, matching itself carefully to your insistent lips and tongue.`);
@@ -427,29 +415,29 @@ App.Interact.fKiss = function(slave) {
 		}
 		r.push(`${He} presses ${himself} against you, ${his} warmth wonderful against your`);
 		if (V.PC.boobs >= 1400) {
-			r.push(`expansive `);
-			if (V.PC.boobsImplant/V.PC.boobs >= .60) {
+			r.push(`expansive`);
+			if (V.PC.boobsImplant / V.PC.boobs >= .60) {
 				r.push(`firm`);
 			} else {
 				r.push(`soft`);
 			}
-			r.push(` chest.`);
+			r.push(`chest.`);
 		} else if (V.PC.boobs >= 1200) {
-			r.push(`huge `);
-			if (V.PC.boobsImplant/V.PC.boobs >= .60) {
+			r.push(`huge`);
+			if (V.PC.boobsImplant / V.PC.boobs >= .60) {
 				r.push(`firm`);
 			} else {
 				r.push(`soft`);
 			}
-			r.push(` breasts.`);
+			r.push(`breasts.`);
 		} else if (V.PC.boobs >= 1000) {
-			r.push(`big `);
-			if (V.PC.boobsImplant/V.PC.boobs >= .60) {
+			r.push(`big`);
+			if (V.PC.boobsImplant / V.PC.boobs >= .60) {
 				r.push(`firm`);
 			} else {
 				r.push(`soft`);
 			}
-			r.push(` breasts.`);
+			r.push(`breasts.`);
 		} else if (V.PC.boobs >= 800) {
 			r.push(`soft breasts.`);
 		} else if (V.PC.boobs >= 500) {
@@ -461,98 +449,93 @@ App.Interact.fKiss = function(slave) {
 		} else {
 			r.push(`flat chest.`);
 		}
-		r.push(`When you finally break the kiss, ${he} runs ${his} tongue rapturously across ${his} moistened lips`);
-		if (hasAnyArms(slave)) {
-			r.push(` and then runs a finger across them as well`);
-		}
-		r.push(`, an openly sexual look on ${his} ${slave.skin} face.`);
+		r.push(`When you finally break the kiss, ${he} runs ${his} tongue rapturously across ${his} moistened lips${hasAnyArms(slave) ? ` and then runs a finger across them as well` : ``}, an openly sexual look on ${his} ${slave.skin} face.`);
 		if (slave.accent >= 3) {
-			r.push(`${He} does ${his} best to communicate devotion with ${his} `);
+			r.push(`${He} does ${his} best to communicate devotion with ${his}`);
 			if (canSee(slave)) {
-				r.push(App.Desc.eyesColor(slave));
+				r.push(`${App.Desc.eyesColor(slave)},`);
 			} else {
-				r.push(`facial expressions`);
+				r.push(`facial expressions,`);
 			}
-			r.push(`, since ${he}'s not confident in ${his} ability to express it in ${V.language}.`);
+			r.push(`since ${he}'s not confident in ${his} ability to express it in ${V.language}.`);
 		} else if (!hasAnyArms(slave) && !canTalk(slave)) {
-			r.push(`${He} does ${his} best to communicate devotion with ${his} `);
+			r.push(`${He} does ${his} best to communicate devotion with ${his}`);
 			if (canSee(slave)) {
-				r.push(App.Desc.eyesColor(slave));
+				r.push(`${App.Desc.eyesColor(slave)}.`);
 			} else {
-				r.push(`facial expressions`);
+				r.push(`facial expressions.`);
 			}
-			r.push(`.`);
 		} else if (!canTalk(slave)) {
 			r.push(`${He} signs that ${he} loves you.`);
 		} else {
-			r.push(`"I love you, ${Master},"`);
+			r.push(Spoken(slave, `"I love you, ${Master},"`));
 			r.push(`${he} ${say}s forthrightly.`);
 		}
 	} else if (slave.devotion > 20) {
-		r.push(`${He} accepts the kiss willingly. As you are so close to ${him}, you sense considerable turmoil in the `);
+		r.push(`${He} accepts the kiss willingly. As you are so close to ${him}, you sense considerable turmoil in the`);
 		if (slave.physicalAge > 30) {
 			r.push(`${woman};`);
 		} else {
 			r.push(`${girl};`);
 		}
-		r.push(`${he}'s doing ${his} duty as a slave by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of ${his} mind by your lips and tongue. When you finally break the kiss, `);
+		r.push(`${he}'s doing ${his} duty as a slave by complying with your wishes, and is probably struggling with the mixture of resistance, obedience and perhaps even devotion forced to the forefront of ${his} mind by your lips and tongue. When you finally break the kiss,`);
 		if (canSee(slave)) {
-			r.push(`${his} ${App.Desc.eyesColor(slave)} gaze into yours searchingly`);
+			r.push(`${his} ${App.Desc.eyesColor(slave)} gaze into yours searchingly,`);
 		} else {
-			r.push(`${he} gazes at you`);
+			r.push(`${he} gazes at you,`);
 		}
-		r.push(`, looking for answers that are not there.`);
+		r.push(`looking for answers that are not there.`);
 		if (!hasAnyArms(slave) && !canTalk(slave)) {
-			r.push(`${His} `);
+			r.push(`${His}`);
 			if (canSee(slave)) {
 				r.push(`eyes beg`);
 			} else {
 				r.push(`expression begs`);
 			}
-			r.push(` for an answer: is that it?`);
+			r.push(`for an answer: is that it?`);
 		} else if (!canTalk(slave)) {
 			r.push(`${He} signs hesitantly, asking if that's it.`);
 		} else {
-			r.push(`${He} asks hesitantly, `);
-			r.push(`"I-is that it, ${Master}?"`);
+			r.push(`${He} asks hesitantly,`);
+			r.push(Spoken(slave, `"I-is that it, ${Master}?"`));
 		}
 	} else if (slave.devotion >= -20 && slave.trust < -20) {
-		r.push(`${He} accepts the kiss fearfully. As you kiss ${his} unresisting mouth, ${his} eagerness to avoid punishment leads ${him} to kiss you back, though nervousness makes ${him} mechanical. You kiss ${him} harder, enjoying ${his} fear, and the physical intimacy slowly does its work. ${He} becomes softer and more natural, ${his} resistance easing. When you pull away from ${him} for a moment, ${he} `);
+		r.push(`${He} accepts the kiss fearfully. As you kiss ${his} unresisting mouth, ${his} eagerness to avoid punishment leads ${him} to kiss you back, though nervousness makes ${him} mechanical. You kiss ${him} harder, enjoying ${his} fear, and the physical intimacy slowly does its work. ${He} becomes softer and more natural, ${his} resistance easing. When you pull away from ${him} for a moment, ${he}`);
 		if (canSee(slave)) {
 			r.push(`looks`);
 		} else {
 			r.push(`gazes`);
 		}
-		r.push(` at you for a long moment, ${his} mouth still hanging open, before visibly catching ${himself} with a reminder that ${he}'s a slave and you're ${his} owner.`);
+		r.push(`at you for a long moment, ${his} mouth still hanging open, before visibly catching ${himself} with a reminder that ${he}'s a slave and you're ${his} owner.`);
 		if (!hasAnyArms(slave) && !canTalk(slave)) {
-			r.push(`${His} `);
+			r.push(`${His}`);
 			if (canSee(slave)) {
 				r.push(`eyes beg`);
 			} else {
 				r.push(`expression begs`);
 			}
-			r.push(` for an answer: is that it?`);
+			r.push(`for an answer: is that it?`);
 		} else if (!canTalk(slave)) {
 			r.push(`${He} signs hesitantly, asking if that's it.`);
 		} else {
 			r.push(`${He} asks hesitantly, "I-is that it, ${Master}?"`);
 		}
 	} else if (slave.trust < -50) {
-		r.push(`${He} is nearly frozen with fear, and does not resist as you kiss ${him}. In fact, ${he} barely reacts at all. ${He} opens ${his} mouth mechanically in response to your insistent tongue, but it's like kissing a doll. ${He} is so filled with terror that ${he} remains stiff even as it becomes clear to ${him} you're not going to hurt ${him}. When you bore of making out with the poor `);
+		r.push(`${He} is nearly frozen with fear, and does not resist as you kiss ${him}. In fact, ${he} barely reacts at all. ${He} opens ${his} mouth mechanically in response to your insistent tongue, but it's like kissing a doll. ${He} is so filled with terror that ${he} remains stiff even as it becomes clear to ${him} you're not going to hurt ${him}. When you bore of making out with the poor`);
 		if (slave.physicalAge > 30) {
 			r.push(`${woman}`);
 		} else {
 			r.push(`${girl}`);
 		}
-		r.push(` and pull away, ${he} stares at you in utter incomprehension.`);
+		r.push(`and pull away, ${he} stares at you in utter incomprehension.`);
 		if (!hasAnyArms(slave) && !canTalk(slave)) {
-			r.push(`${His} `);
+			r.push(`${His}`);
 			if (canSee(slave)) {
 				r.push(`eyes beg`);
 			} else {
 				r.push(`expression begs`);
 			}
-			r.push(` for an answer: is that it?`);
+			r.push(`for an answer: is that it?`);
 		} else if (!canTalk(slave)) {
 			r.push(`${He} signs spastically, begging fearfully to know if that's it.`);
 		} else {
@@ -561,13 +544,13 @@ App.Interact.fKiss = function(slave) {
 	} else {
 		r.push(`${He} reflexively turns ${his} head away from you, but you catch ${his} jaw and kiss ${him} harder. Spluttering, ${he} flees backwards, but you tip forward with ${him} and pin ${him} against your desk, plundering ${his} mouth without mercy. ${He} wriggles desperately, but ${his} struggles slowly subside as ${he} realizes that you're not taking this any farther. When you bore of it and pull away, ${he} stares at you in utter incomprehension.`);
 		if (!hasAnyArms(slave) && !canTalk(slave)) {
-			r.push(`${His} `);
+			r.push(`${His}`);
 			if (canSee(slave)) {
 				r.push(`eyes demand`);
 			} else {
 				r.push(`expression demands`);
 			}
-			r.push(` an answer: is that it?`);
+			r.push(`an answer: is that it?`);
 		} else if (!canTalk(slave)) {
 			r.push(`${He} signs irritably, asking whether that's it.`);
 		} else {
@@ -575,8 +558,8 @@ App.Interact.fKiss = function(slave) {
 		}
 	}
 
-	if (_tempGag) {
-		slave.mouthAccessory = _tempGag;
+	if (assignedGag) {
+		slave.mouthAccessory = assignedGag;
 	}
 	App.Events.addParagraph(node, r);
 	return node;
-- 
GitLab


From 1ca946886166a2b74b8dd4307d81cbdfca78af47 Mon Sep 17 00:00:00 2001
From: lowercasedonkey <lowercasedonkey@gmail.com>
Date: Tue, 11 May 2021 10:00:35 -0400
Subject: [PATCH 4/7] sharp teeth to data

---
 js/003-data/slaveMods.js     |  5 ++++-
 src/npc/interaction/fKiss.js | 32 ++++++++++++++++++--------------
 2 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/js/003-data/slaveMods.js b/js/003-data/slaveMods.js
index 72411ca7525..7a6180316a0 100644
--- a/js/003-data/slaveMods.js
+++ b/js/003-data/slaveMods.js
@@ -511,13 +511,16 @@ App.Medicine.Modification.teeth = new Map([
 				`.`
 			);
 		},
-		get requirements() { return (V.seeExtreme === 1); }
+		get requirements() { return (V.seeExtreme === 1); },
+		sharp: true
 	}],
 	["fangs", {
 		desc: ``,
+		sharp: true
 	}],
 	["fang", {
 		desc: ``,
+		sharp: true
 	}],
 	["baby", {
 		desc: ``,
diff --git a/src/npc/interaction/fKiss.js b/src/npc/interaction/fKiss.js
index 6b3f5fd6938..4a4579c647b 100644
--- a/src/npc/interaction/fKiss.js
+++ b/src/npc/interaction/fKiss.js
@@ -199,7 +199,7 @@ App.Interact.fKiss = function(slave) {
 			}
 		} else if (slave.devotion + slave.trust >= 175) {
 			r.push(`${His} mouth accepts yours with love, matching itself perfectly to your insistent lips and tongue.`);
-			if (slave.teeth === "pointy" || slave.teeth === "fangs" || slave.teeth === "fang") {
+			if (App.Medicine.Modification.teeth.get(slave.teeth).sharp) {
 				r.push(`(Though you're quite careful around ${his} sharp dentition.)`);
 			}
 			r.push(`${He} melts into you, sighing ever so gently. When you finally break the kiss, ${his} mouth freezes in the shape it was in when last your lips touched, and a momentary look of longing crosses ${his} face.`);
@@ -293,7 +293,7 @@ App.Interact.fKiss = function(slave) {
 		}
 	} else if (slave.relationship === -2) {
 		r.push(`${His} mouth accepts yours with love, matching itself perfectly to your insistent lips and tongue.`);
-		if (slave.teeth === "pointy" || slave.teeth === "fangs" || slave.teeth === "fang") {
+		if (App.Medicine.Modification.teeth.get(slave.teeth).sharp) {
 			r.push(`(Though you're quite careful around ${his} sharp dentition.)`);
 		}
 		r.push(`${He} melts into you, sighing ever so gently. When you finally break the kiss, ${his} mouth freezes in the shape it was in when last your lips touched, and a momentary look of longing crosses ${his} face.`);
@@ -375,12 +375,14 @@ App.Interact.fKiss = function(slave) {
 		} else {
 			r.push(`non-existent breasts.`);
 		}
-		if (slave.teeth === "pointy") {
-			r.push(`${He}'s very careful to avoid spearing your tongue with ${his} sharp teeth.`);
-		} else if (slave.teeth === "fangs") {
-			r.push(`${He}'s very careful to avoid spearing your tongue with ${his} fangs.`);
-		} else if (slave.teeth === "fang") {
-			r.push(`${He}'s very careful to avoid poking you with ${his} fang.`);
+		if (App.Medicine.Modification.teeth.get(slave.teeth).sharp) {
+			if (slave.teeth === "pointy") {
+				r.push(`${He}'s very careful to avoid spearing your tongue with ${his} sharp teeth.`);
+			} else if (slave.teeth === "fangs") {
+				r.push(`${He}'s very careful to avoid spearing your tongue with ${his} fangs.`);
+			} else if (slave.teeth === "fang") {
+				r.push(`${He}'s very careful to avoid poking you with ${his} fang.`);
+			}
 		}
 		r.push(`${He} achieves a weak orgasm before you tire of making out with ${him}.`);
 		if (slave.accent >= 3) {
@@ -406,12 +408,14 @@ App.Interact.fKiss = function(slave) {
 		}
 	} else if (slave.devotion > 50) {
 		r.push(`${His} mouth accepts yours with devotion, matching itself carefully to your insistent lips and tongue.`);
-		if (slave.teeth === "pointy") {
-			r.push(`${He} is exquisitely careful to keep ${his} sharp teeth clear of you.`);
-		} else if (slave.teeth === "fangs") {
-			r.push(`${He} is exquisitely careful to keep ${his} fangs from poking you.`);
-		} else if (slave.teeth === "fang") {
-			r.push(`${He} is exquisitely careful to keep ${his} fang from getting into trouble.`);
+		if (App.Medicine.Modification.teeth.get(slave.teeth).sharp) {
+			if (slave.teeth === "pointy") {
+				r.push(`${He} is exquisitely careful to keep ${his} sharp teeth clear of you.`);
+			} else if (slave.teeth === "fangs") {
+				r.push(`${He} is exquisitely careful to keep ${his} fangs from poking you.`);
+			} else if (slave.teeth === "fang") {
+				r.push(`${He} is exquisitely careful to keep ${his} fang from getting into trouble.`);
+			}
 		}
 		r.push(`${He} presses ${himself} against you, ${his} warmth wonderful against your`);
 		if (V.PC.boobs >= 1400) {
-- 
GitLab


From de4e21ded178cd27403098ab486740421e5ff8e0 Mon Sep 17 00:00:00 2001
From: lowercasedonkey <lowercasedonkey@gmail.com>
Date: Tue, 11 May 2021 10:01:06 -0400
Subject: [PATCH 5/7] hook up

---
 src/interaction/main/walkPast.js | 2 +-
 src/interaction/siWork.js        | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/interaction/main/walkPast.js b/src/interaction/main/walkPast.js
index 53d7ea70211..c70028abf1d 100644
--- a/src/interaction/main/walkPast.js
+++ b/src/interaction/main/walkPast.js
@@ -9359,7 +9359,7 @@ globalThis.walkPast = (function() {
 		}
 
 		if (jsRandom(1, 3) === 1) {
-			target = "FKiss";
+			target = "fKiss";
 		} else {
 			target = "fLips";
 		}
diff --git a/src/interaction/siWork.js b/src/interaction/siWork.js
index fb5bb154293..42159205857 100644
--- a/src/interaction/siWork.js
+++ b/src/interaction/siWork.js
@@ -353,7 +353,7 @@ App.UI.SlaveInteract.work = function(slave, refresh) {
 				});
 			}
 			sexOptions.push({text: `Use ${his} mouth`, scene: () => App.Interact.fLips(slave)});
-			sexOptions.push({text: `Kiss ${him}`, scene: `FKiss`});
+			sexOptions.push({text: `Kiss ${him}`, scene: () => App.Interact.fKiss(slave)});
 			if (hasAnyLegs(slave)) {
 				sexOptions.push({text: `Have ${him} dance for you`, scene: () => App.Interact.fDance(slave)});
 			}
-- 
GitLab


From eeaac2bf8b63757dbf75e41ad9149d260bab711f Mon Sep 17 00:00:00 2001
From: lowercasedonkey <lowercasedonkey@gmail.com>
Date: Tue, 11 May 2021 10:14:42 -0400
Subject: [PATCH 6/7] fuckdollery.  Best part is they say NOTHING

---
 src/interaction/main/walkPast.js        |   6 +-
 src/interaction/siWork.js               |   8 +-
 src/npc/interaction/FFuckdollAnal.js    | 147 +++++++++++++++++++
 src/npc/interaction/FFuckdollAnal.tw    |  51 -------
 src/npc/interaction/FFuckdollImpreg.js  | 182 ++++++++++++++++++++++++
 src/npc/interaction/FFuckdollImpreg.tw  |  87 -----------
 src/npc/interaction/FFuckdollOral.js    | 103 ++++++++++++++
 src/npc/interaction/FFuckdollOral.tw    |  32 -----
 src/npc/interaction/FFuckdollVaginal.js | 148 +++++++++++++++++++
 src/npc/interaction/FFuckdollVaginal.tw |  51 -------
 10 files changed, 587 insertions(+), 228 deletions(-)
 create mode 100644 src/npc/interaction/FFuckdollAnal.js
 delete mode 100644 src/npc/interaction/FFuckdollAnal.tw
 create mode 100644 src/npc/interaction/FFuckdollImpreg.js
 delete mode 100644 src/npc/interaction/FFuckdollImpreg.tw
 create mode 100644 src/npc/interaction/FFuckdollOral.js
 delete mode 100644 src/npc/interaction/FFuckdollOral.tw
 create mode 100644 src/npc/interaction/FFuckdollVaginal.js
 delete mode 100644 src/npc/interaction/FFuckdollVaginal.tw

diff --git a/src/interaction/main/walkPast.js b/src/interaction/main/walkPast.js
index c70028abf1d..1df621ff1e4 100644
--- a/src/interaction/main/walkPast.js
+++ b/src/interaction/main/walkPast.js
@@ -142,14 +142,14 @@ globalThis.walkPast = (function() {
 		} else {
 			switch (target) {
 				case "fVagina":
-					links.push(App.UI.DOM.link(`Fuck ${him}`, executeWalkpast, "FFuckdollVaginal"));
+					links.push(App.UI.DOM.link(`Fuck ${him}`, executeWalkpast, "fFuckdollVaginal"));
 					break;
 				case "fButt":
 				case "fAnus":
-					links.push(App.UI.DOM.link(`Fuck ${him}`, executeWalkpast, "FFuckdollAnal"));
+					links.push(App.UI.DOM.link(`Fuck ${him}`, executeWalkpast, "fFuckdollAnal"));
 					break;
 				default:
-					links.push(App.UI.DOM.link(`Fuck ${him}`, executeWalkpast, "FFuckdollOral"));
+					links.push(App.UI.DOM.link(`Fuck ${him}`, executeWalkpast, "fFuckdollOral"));
 			}
 		}
 
diff --git a/src/interaction/siWork.js b/src/interaction/siWork.js
index 42159205857..f1696f2c775 100644
--- a/src/interaction/siWork.js
+++ b/src/interaction/siWork.js
@@ -713,17 +713,17 @@ App.UI.SlaveInteract.work = function(slave, refresh) {
 			}
 		} else {
 			/* IS A FUCKDOLL */
-			sexOptions.push({text: `Fuck ${his} face hole`, scene: `FFuckdollOral`});
+			sexOptions.push({text: `Fuck ${his} face hole`, scene: () => App.Interact.fFuckdollOral(slave)});
 			if (canDoVaginal(slave)) {
-				sexOptions.push({text: `Fuck ${his} front hole`, scene: `FFuckdollVaginal`});
+				sexOptions.push({text: `Fuck ${his} front hole`, scene: () => App.Interact.fFuckdollVaginal(slave)});
 			}
 			if (canGetPregnant(slave) && (slave.geneticQuirks.superfetation !== 2 || V.geneticMappingUpgrade !== 0) && V.seePreg !== 0) {
 				if (canImpreg(slave, V.PC)) {
-					sexOptions.push({text: `Put a baby in ${him}`, scene: `FFuckdollImpreg`});
+					sexOptions.push({text: `Put a baby in ${him}`, scene: () => App.Interact.fFuckdollImpreg(slave)});
 				}
 			}
 			if (canDoAnal(slave)) {
-				sexOptions.push({text: `Fuck ${his} rear hole`, scene: `FFuckdollAnal`});
+				sexOptions.push({text: `Fuck ${his} rear hole`, scene: () => App.Interact.fFuckdollAnal(slave)});
 			}
 		}
 		let activeSlaveRepSacrifice = repGainSacrifice(slave, V.arcologies[0]);
diff --git a/src/npc/interaction/FFuckdollAnal.js b/src/npc/interaction/FFuckdollAnal.js
new file mode 100644
index 00000000000..ee8968d3ee4
--- /dev/null
+++ b/src/npc/interaction/FFuckdollAnal.js
@@ -0,0 +1,147 @@
+/**
+ *
+ * @param {App.Entity.SlaveState} slave
+ * @returns {DocumentFragment}
+ */
+App.Interact.fFuckdollAnal = function(slave) {
+	const node = new DocumentFragment();
+	let r = [];
+
+	const {
+		He, His,
+		he, his, him
+	} = getPronouns(slave);
+
+	addPartner(slave, -1);
+
+	seX(slave, "anal", V.PC, "penetrative");
+	r.push(`You decide to use the Fuckdoll's`);
+	if (slave.anus > 3) {
+		r.push(`gaping`);
+	} else if (slave.anus === 3) {
+		r.push(`loose`);
+	} else if (slave.anus === 2) {
+		r.push(`relaxed`);
+	} else if (slave.anus === 1) {
+		r.push(`tight`);
+	}
+	r.push(`rear hole.`);
+	if (slave.fuckdoll <= 10) {
+		r.push(`Since ${he} is not well adapted to life as a living sex toy yet, ${he} won't respond to position commands. So, you simply`);
+		if (hasAnyLegs(slave)) {
+			r.push(`walk over to ${him}`);
+		} else {
+			r.push(`flip ${him} over`);
+		}
+		r.push(`and ram`);
+		if (V.PC.dick !== 0) {
+			r.push(`your cock`);
+		} else {
+			r.push(`a strap-on`);
+		}
+		r.push(`up ${his} rear hole.`);
+	} else if (slave.fuckdoll <= 80) {
+		r.push(`${He} can follow intermediate commands, so you order ${him} to present ${his} rear hole. ${He} obediently`);
+		if (hasAnyLegs(slave)) {
+			r.push(`bends over, arches ${his} back, and`);
+		} else {
+			r.push(`flips over and`);
+		}
+		r.push(`winks ${his} anus until you insert`);
+		if (V.PC.dick !== 0) {
+			r.push(`your cock.`);
+		} else {
+			r.push(`a strap-on.`);
+		}
+	} else {
+		r.push(`${He} can follow advanced commands, so you bring ${him} over to your chair`);
+		if (hasAnyLegs(slave)) {
+			r.push(`and order ${him} to squat down onto your`);
+			if (V.PC.dick !== 0) {
+				r.push(`cock`);
+			} else {
+				r.push(`strap-on`);
+			}
+			r.push(`and slide ${his} anus up and down`);
+			if (V.PC.dick !== 0) {
+				r.push(`your`);
+			} else {
+				r.push(`the`);
+			}
+			r.push(`shaft.`);
+		} else {
+			r.push(`and impale ${him} on`);
+			if (V.PC.dick !== 0) {
+				r.push(`your cock,`);
+			} else {
+				r.push(`your strap-on,`);
+			}
+			r.push(`ordering ${him} to do ${his} feeble best to bounce.`);
+		}
+	}
+	if (slave.fuckdoll <= 20) {
+		r.push(`${He}'s not fully used to having things suddenly forced up ${his} ass, so ${he} struggles, and ${his} sphincter spasms deliciously.`);
+	} else if (slave.fuckdoll <= 40) {
+		r.push(`Aware that ${he} is supposed to relax and accept anal rape, ${he} does ${his} best to accommodate the sodomy.`);
+	} else {
+		r.push(`You command ${him} to milk your`);
+		if (V.PC.dick !== 0) {
+			r.push(`cock`);
+		} else {
+			r.push(`strap-on`);
+		}
+		r.push(`with ${his} asshole, and ${he} obediently tightens ${his} sphincter against the invading phallus rhythmically.`);
+	}
+	if (slave.fuckdoll <= 60) {
+		if (slave.energy > 60) {
+			r.push(`Denied any other outlet for ${his} powerful sex drive, ${he} orgasms.`);
+		}
+	} else {
+		r.push(`Tuned to enjoy any use by total denial of all other stimulation, ${he} orgasms repeatedly as you fuck ${his} anus.`);
+	}
+	if (slave.voice === 0) {
+		r.push(`Though ${he} is mute, ${his} breath hisses loudly`);
+		if (slave.lips > 95) {
+			r.push(`past the lips of ${his} facepussy.`);
+		} else {
+			r.push(`through ${his} mouth insert.`);
+		}
+	} else {
+		r.push(`${He} moans,`);
+		if (slave.lips > 95) {
+			r.push(`and the lips of ${his} facepussy quiver.`);
+		} else {
+			r.push(`struggling to force the sound past ${his} mouth insert.`);
+		}
+	}
+	r.push(`You climax${(V.PC.dick !== 0) ? `, filling ${his} rectum with your cum,` : ``} and return ${him} to`);
+	if (hasAnyLegs(slave)) {
+		r.push(`a standing position.`);
+	} else {
+		r.push(`where ${he} was resting.`);
+	}
+	if (V.PC.dick !== 0) {
+		if (slave.anus > 2) {
+			r.push(`Your cum flows out of ${his} gaped rear hole and down the material of ${his} suit.`);
+		} else if (slave.anus === 2) {
+			r.push(`Your cum drips out of ${his} loosened rear hole and down the material of ${his} suit.`);
+		} else {
+			r.push(`${His} tight rear hole retains every drop of your cum.`);
+		}
+		if (canImpreg(slave, V.PC)) {
+			r.push(knockMeUp(slave, 5, 0, -1));
+		}
+		r.push(`The Fuckdoll will be cleaned by another slave.`);
+	}
+	if (slave.anus === 0) {
+		if (slave.fetish !== "mindbroken") {
+			r.push(`As you return to your business, ${he} shakes slightly in place, and a few low moans come out of ${his} face hole. This is probably a reaction to losing ${his} anal virginity.`);
+		} else {
+			r.push(`${He} gives no external indication that ${he}'s aware that ${he}'s just lost ${his} anal virginity.`);
+		}
+		r.push(`In any case, <span class="virginity loss">${his} rear hole has been broken in.</span>`);
+		slave.anus = 1;
+	}
+	App.Events.addParagraph(node, r);
+	return node;
+};
diff --git a/src/npc/interaction/FFuckdollAnal.tw b/src/npc/interaction/FFuckdollAnal.tw
deleted file mode 100644
index 76cb99324db..00000000000
--- a/src/npc/interaction/FFuckdollAnal.tw
+++ /dev/null
@@ -1,51 +0,0 @@
-:: FFuckdollAnal [nobr no-history]
-
-<<run App.Utils.setLocalPronouns(getSlave($AS))>>
-<<run addPartner(getSlave($AS), -1)>>
-
-<<set getSlave($AS).counter.anal++, $analTotal++>>
-You decide to use the Fuckdoll's <<if getSlave($AS).anus > 3>>gaping<<elseif getSlave($AS).anus == 3>>loose<<elseif getSlave($AS).anus == 2>>relaxed<<elseif getSlave($AS).anus == 1>>tight<</if>> rear hole.
-<<if getSlave($AS).fuckdoll <= 10>>
-	Since $he is not well adapted to life as a living sex toy yet, $he won't respond to position commands. So, you simply <<if hasAnyLegs(getSlave($AS))>>walk over to $him<<else>>flip $him over<</if>> and ram <<if $PC.dick != 0>>your cock<<else>>a strap-on<</if>> up $his rear hole.
-<<elseif getSlave($AS).fuckdoll <= 80>>
-	$He can follow intermediate commands, so you order $him to present $his rear hole. $He obediently <<if hasAnyLegs(getSlave($AS))>>bends over, arches $his back, and<<else>>flips over and<</if>> winks $his anus until you insert <<if $PC.dick != 0>>your cock<<else>>a strap-on<</if>>.
-<<else>>
-	$He can follow advanced commands, so you bring $him over to your chair <<if hasAnyLegs(getSlave($AS))>>and order $him to squat down onto your <<if $PC.dick != 0>>cock<<else>>strap-on<</if>> and slide $his anus up and down <<if $PC.dick != 0>>your<<else>>the<</if>> shaft.<<else>>and impale $him on <<if $PC.dick != 0>>your cock<<else>>your strap-on<</if>>, ordering $him to do $his feeble best to bounce.<</if>>
-<</if>>
-<<if getSlave($AS).fuckdoll <= 20>>
-	$He's not fully used to having things suddenly forced up $his ass, so $he struggles, and $his sphincter spasms deliciously.
-<<elseif getSlave($AS).fuckdoll <= 40>>
-	Aware that $he is supposed to relax and accept anal rape, $he does $his best to accommodate the sodomy.
-<<else>>
-	You command $him to milk your <<if $PC.dick != 0>>cock<<else>>strap-on<</if>> with $his asshole, and $he obediently tightens $his sphincter against the invading phallus rhythmically.
-<</if>>
-<<if getSlave($AS).fuckdoll <= 60>>
-	<<if getSlave($AS).energy > 60>>Denied any other outlet for $his powerful sex drive, $he orgasms.<</if>>
-<<else>>
-	Tuned to enjoy any use by total denial of all other stimulation, $he orgasms repeatedly as you fuck $his anus.
-<</if>>
-<<if getSlave($AS).voice == 0>>
-	Though $he is mute, $his breath hisses loudly <<if getSlave($AS).lips > 95>>past the lips of $his facepussy<<else>>through $his mouth insert<</if>>.
-<<else>>
-	$He moans, <<if getSlave($AS).lips > 95>>and the lips of $his facepussy quiver<<else>>struggling to force the sound past $his mouth insert<</if>>.
-<</if>>
-You climax<<if $PC.dick != 0>>, filling $his rectum with your cum,<</if>> and return $him to <<if hasAnyLegs(getSlave($AS))>>a standing position<<else>>where $he was resting<</if>>.
-<<if $PC.dick != 0>>
-	<<if getSlave($AS).anus > 2>>Your cum flows out of $his gaped rear hole and down the material of $his suit.
-	<<elseif getSlave($AS).anus == 2>>Your cum drips out of $his loosened rear hole and down the material of $his suit.
-	<<else>>$His tight rear hole retains every drop of your cum.
-	<</if>>
-	<<if canImpreg(getSlave($AS), $PC)>>
-		<<= knockMeUp(getSlave($AS), 5, 0, -1)>>
-	<</if>>
-	The Fuckdoll will be cleaned by another slave.
-<</if>>
-<<if getSlave($AS).anus == 0>>
-	<<if getSlave($AS).fetish != "mindbroken">>
-		As you return to your business, $he shakes slightly in place, and a few low moans come out of $his face hole. This is probably a reaction to losing $his anal virginity.
-	<<else>>
-		$He gives no external indication that $he's aware that $he's just lost $his anal virginity.
-	<</if>>
-	In any case, <span class="virginity loss">$his rear hole has been broken in.</span>
-	<<set getSlave($AS).anus = 1>>
-<</if>>
diff --git a/src/npc/interaction/FFuckdollImpreg.js b/src/npc/interaction/FFuckdollImpreg.js
new file mode 100644
index 00000000000..6abfbbaa87f
--- /dev/null
+++ b/src/npc/interaction/FFuckdollImpreg.js
@@ -0,0 +1,182 @@
+/**
+ *
+ * @param {App.Entity.SlaveState} slave
+ * @returns {DocumentFragment}
+ */
+App.Interact.fFuckdollImpreg = function(slave) {
+	const node = new DocumentFragment();
+	let r = [];
+
+	const {
+		He, His,
+		he, his, him
+	} = getPronouns(slave);
+
+	addPartner(slave, -1);
+	const _bonus = random(6, 20);
+
+	if (slave.mpreg === 1) {
+		slave.counter.anal += _bonus + 1;
+		V.analTotal += _bonus + 1;
+	} else {
+		slave.counter.vaginal += _bonus + 1;
+		V.vaginalTotal += _bonus + 1;
+	}
+
+	r.push(`You decide to use the Fuckdoll's fertile womb to grow a child.`);
+	if (slave.fuckdoll <= 10) {
+		r.push(`Since ${he} is not well adapted to life as a living sex toy yet, ${he} won't respond to position commands. So, you simply`);
+		if (hasAnyLegs(slave)) {
+			r.push(`push ${him} down to lie on the couch`);
+		} else {
+			r.push(`set ${him} on your desk`);
+		}
+		r.push(`and shove`);
+		if (V.PC.dick !== 0) {
+			r.push(`your cock`);
+		} else {
+			r.push(`a strap-on`);
+		}
+		r.push(`inside ${his}`);
+		if (slave.mpreg === 1) {
+			r.push(`asshole.`);
+		} else {
+			r.push(`vagina.`);
+		}
+	} else if (slave.fuckdoll <= 70) {
+		r.push(`${He} can follow intermediate commands, so you order ${him} into a position for use of ${his}`);
+		if (slave.mpreg === 1) {
+			r.push(`rear`);
+		} else {
+			r.push(`front`);
+		}
+		r.push(`hole. ${He} obediently`);
+		if (hasAllLimbs(slave)) {
+			r.push(`gets down on all fours and`);
+		}
+		r.push(`cocks ${his} hips, offering ${his}`);
+		if (slave.mpreg === 1) {
+			r.push(`asspussy`);
+		} else {
+			r.push(`cunt`);
+		}
+		r.push(`until you insert your`);
+		if (V.PC.dick > 0) {
+			r.push(`cock`);
+		} else {
+			r.push(`strap-on`);
+		}
+		r.push(`into ${his}`);
+		if (slave.mpreg === 1) {
+			r.push(`winking`);
+		} else {
+			r.push(`wet`);
+		}
+		r.push(`channel.`);
+	} else {
+		r.push(`${He} can follow advanced commands, so you bring ${him} over to your chair`);
+		if (hasAnyLegs(slave)) {
+			r.push(`and order ${him} to squat down onto your cock and ride.`);
+		} else {
+			r.push(`and impale ${him} on your cock, ordering ${him} to do ${his} feeble best to bounce.`);
+		}
+	}
+	if (slave.fuckdoll <= 20) {
+		r.push(`${He}'s not fully used to being raped without warning, so ${he} struggles, ${his} muscles spasming delightfully.`);
+	} else if (slave.fuckdoll <= 40) {
+		r.push(`Aware that ${he} is supposed to relax and accept rape, ${he} does ${his} best to let you take ${him} without resistance.`);
+	} else {
+		r.push(`You command ${him} to milk your cock with ${his}`);
+		if (slave.mpreg === 1) {
+			r.push(`anal`);
+		} else {
+			r.push(`vaginal`);
+		}
+		r.push(`walls, and ${he} obediently starts to flex ${his} well-developed`);
+		if (slave.mpreg === 1) {
+			r.push(`cunt`);
+		} else {
+			r.push(`anal`);
+		}
+		r.push(`muscles, squeezing you from base to tip.`);
+	}
+	if (slave.fuckdoll <= 60) {
+		if (slave.energy > 40) {
+			r.push(`Denied any other outlet for ${his} healthy sex drive, ${he} orgasms.`);
+		}
+	} else {
+		r.push(`${He} orgasmed for the first time as you entered ${him}, and ${he} continues to do so as you fuck ${him}. ${He}'s perfectly tuned.`);
+	}
+	if (slave.voice === 0) {
+		r.push(`Though ${he} is mute, ${his} breath hisses loudly`);
+		if (slave.lips > 95) {
+			r.push(`past the lips of ${his} facepussy.`);
+		} else {
+			r.push(`through ${his} mouth insert.`);
+		}
+	} else {
+		r.push(`${He} moans,`);
+		if (slave.lips > 95) {
+			r.push(`and the lips of ${his} facepussy quiver.`);
+		} else {
+			r.push(`struggling to force the sound past ${his} mouth insert.`);
+		}
+	}
+	r.push(`You climax, your cum shooting forward to splash against ${his} womb, and return ${he} to`);
+	if (hasAnyLegs(slave)) {
+		r.push(`a standing position`);
+	} else {
+		r.push(`where ${he} was resting`);
+	}
+	r.push(`to allow your seed to find ${his} mark.`);
+	if (slave.mpreg === 1) {
+		if (slave.anus > 2) {
+			r.push(`Your cum flows out of ${his} gaping rear hole and down the material of ${his} suit.`);
+		} else if (slave.anus === 2) {
+			r.push(`Your cum drips out of ${his} well-fucked rear hole and down the material of ${his} suit.`);
+		} else {
+			r.push(`${His} tight rear hole retains almost every drop of your cum. A few escape and run down the material of ${his} suit.`);
+		}
+		r.push(`The Fuckdoll will be cleaned by another slave.`);
+		if (slave.anus === 0) {
+			if (slave.fetish !== "mindbroken") {
+				r.push(`As you return to your business, ${he} shakes slightly in place, and a few low moans come out of ${his} face hole. This is probably a reaction to losing ${his} anal virginity.`);
+			} else {
+				r.push(`${He} gives no external indication that ${he}'s aware that ${he}'s just lost ${his} virginity.`);
+			}
+			r.push(`In any case, <span class="virginity loss">${his} rear hole has been broken in.</span>`);
+			slave.anus = 1;
+		}
+	} else {
+		if (slave.vagina >= 10) {
+			r.push(`Your cum steadily flows from its prolapsed front hole and down the material of ${his} suit.`);
+		} else if (slave.vagina > 2) {
+			r.push(`Your cum flows out of ${his} gaping front hole and down the material of ${his} suit.`);
+		} else if (slave.vagina === 2) {
+			r.push(`Your cum drips out of ${his} well-fucked front hole and down the material of ${his} suit.`);
+		} else {
+			r.push(`${His} tight front hole retains almost every drop of your cum. A few escape and run down the material of ${his} suit.`);
+		}
+		r.push(`The Fuckdoll will be cleaned by another slave.`);
+		if (slave.vagina === 0) {
+			if (slave.fetish !== "mindbroken") {
+				r.push(`As you return to your business, ${he} shakes slightly in place, and a few low moans come out of ${his} face hole. This is probably a reaction to losing ${his} virginity.`);
+			} else {
+				r.push(`${He} gives no external indication that ${he}'s aware that ${he}'s just lost ${his} virginity.`);
+			}
+			r.push(`In any case, <span class="virginity loss">${his} front hole has been broken in.</span>`);
+			slave.vagina = 1;
+		}
+	}
+
+	r.push(`You repeat this ritual throughout the week, ensuring that ${he} will be an <span class="pregnant">incubator for your child.</span> ${knockMeUp(slave, 100, 2, -1, true)}`);
+
+	if (V.arcologies[0].FSRestart !== "unset" && V.eugenicsFullControl !== 1) {
+		if (slave.breedingMark !== 1 || V.propOutcome === 0) {
+			r.push(`Rumors spread about you knocking up your playthings; the Societal Elite are <span class="elites.loss"> very displeased</span> by these rumors.`);
+			V.failedElite += 5;
+		}
+	}
+	App.Events.addParagraph(node, r);
+	return node;
+};
diff --git a/src/npc/interaction/FFuckdollImpreg.tw b/src/npc/interaction/FFuckdollImpreg.tw
deleted file mode 100644
index f521b5f02fa..00000000000
--- a/src/npc/interaction/FFuckdollImpreg.tw
+++ /dev/null
@@ -1,87 +0,0 @@
-:: FFuckdollImpreg [nobr no-history]
-
-<<run App.Utils.setLocalPronouns(getSlave($AS))>>
-<<run addPartner(getSlave($AS), -1)>>
-<<set _bonus = random(6,20)>>
-
-<<if getSlave($AS).mpreg == 1>>
-	<<set getSlave($AS).counter.anal += _bonus+1, $analTotal += _bonus+1>>
-<<else>>
-	<<set getSlave($AS).counter.vaginal += _bonus+1, $vaginalTotal += _bonus+1>>
-<</if>>
-
-You decide to use the Fuckdoll's fertile womb to grow a child.
-<<if getSlave($AS).fuckdoll <= 10>>
-	Since $he is not well adapted to life as a living sex toy yet, $he won't respond to position commands. So, you simply <<if hasAnyLegs(getSlave($AS))>>push $him down to lie on the couch<<else>>set $him on your desk<</if>> and shove <<if $PC.dick != 0>>your cock<<else>>a strap-on<</if>> inside $his <<if getSlave($AS).mpreg == 1>>asshole<<else>>vagina<</if>>.
-<<elseif getSlave($AS).fuckdoll <= 70>>
-	$He can follow intermediate commands, so you order $him into a position for use of $his <<if getSlave($AS).mpreg == 1>>rear<<else>>front<</if>> hole. $He obediently <<if hasAllLimbs(getSlave($AS))>>gets down on all fours and <</if>>cocks $his hips, offering $his <<if getSlave($AS).mpreg == 1>>asspussy<<else>>cunt<</if>> until you insert your
-	<<if $PC.dick > 0>>
-		cock
-	<<else>>
-		strap-on
-	<</if>>
-	into $his <<if getSlave($AS).mpreg == 1>>winking<<else>>wet<</if>> channel.
-<<else>>
-	$He can follow advanced commands, so you bring $him over to your chair <<if hasAnyLegs(getSlave($AS))>>and order $him to squat down onto your cock and ride.<<else>>and impale $him on your cock, ordering $him to do $his feeble best to bounce.<</if>>
-<</if>>
-<<if getSlave($AS).fuckdoll <= 20>>
-	$He's not fully used to being raped without warning, so $he struggles, $his muscles spasming delightfully.
-<<elseif getSlave($AS).fuckdoll <= 40>>
-	Aware that $he is supposed to relax and accept rape, $he does $his best to let you take $him without resistance.
-<<else>>
-	You command $him to milk your cock with $his <<if getSlave($AS).mpreg == 1>>anal<<else>>vaginal<</if>> walls, and $he obediently starts to flex $his well-developed <<if getSlave($AS).mpreg == 1>>cunt<<else>>anal<</if>> muscles, squeezing you from base to tip.
-<</if>>
-<<if getSlave($AS).fuckdoll <= 60>>
-	<<if getSlave($AS).energy > 40>>Denied any other outlet for $his healthy sex drive, $he orgasms.<</if>>
-<<else>>
-	$He orgasmed for the first time as you entered $him, and $he continues to do so as you fuck $him. $He's perfectly tuned.
-<</if>>
-<<if getSlave($AS).voice == 0>>
-	Though $he is mute, $his breath hisses loudly <<if getSlave($AS).lips > 95>>past the lips of $his facepussy<<else>>through $his mouth insert<</if>>.
-<<else>>
-	$He moans, <<if getSlave($AS).lips > 95>>and the lips of $his facepussy quiver<<else>>struggling to force the sound past $his mouth insert<</if>>.
-<</if>>
-You climax, your cum shooting forward to splash against $his womb, and return $he to <<if hasAnyLegs(getSlave($AS))>>a standing position<<else>>where $he was resting<</if>> to allow your seed to find $his mark.
-<<if getSlave($AS).mpreg == 1>>
-	<<if getSlave($AS).anus > 2>>Your cum flows out of $his gaping rear hole and down the material of $his suit.
-	<<elseif getSlave($AS).anus == 2>>Your cum drips out of $his well-fucked rear hole and down the material of $his suit.
-	<<else>>$His tight rear hole retains almost every drop of your cum. A few escape and run down the material of $his suit.
-	<</if>>
-	The Fuckdoll will be cleaned by another slave.
-	<<if getSlave($AS).anus == 0>>
-		<<if getSlave($AS).fetish != "mindbroken">>
-			As you return to your business, $he shakes slightly in place, and a few low moans come out of $his face hole. This is probably a reaction to losing $his anal virginity.
-		<<else>>
-			$He gives no external indication that $he's aware that $he's just lost $his virginity.
-		<</if>>
-		In any case, <span class="virginity loss">$his rear hole has been broken in.</span>
-		<<set getSlave($AS).anus = 1>>
-	<</if>>
-<<else>>
-	<<if getSlave($AS).vagina >= 10>>Your cum steadily flows from its prolapsed front hole and down the material of $his suit.
-	<<elseif getSlave($AS).vagina > 2>>Your cum flows out of $his gaping front hole and down the material of $his suit.
-	<<elseif getSlave($AS).vagina == 2>>Your cum drips out of $his well-fucked front hole and down the material of $his suit.
-	<<else>>$His tight front hole retains almost every drop of your cum. A few escape and run down the material of $his suit.
-	<</if>>
-	The Fuckdoll will be cleaned by another slave.
-	<<if getSlave($AS).vagina == 0>>
-		<<if getSlave($AS).fetish != "mindbroken">>
-			As you return to your business, $he shakes slightly in place, and a few low moans come out of $his face hole. This is probably a reaction to losing $his virginity.
-		<<else>>
-			$He gives no external indication that $he's aware that $he's just lost $his virginity.
-		<</if>>
-		In any case, <span class="virginity loss">$his front hole has been broken in.</span>
-		<<set getSlave($AS).vagina = 1>>
-	<</if>>
-<</if>>
-
-You repeat this ritual throughout the week, ensuring that $he will be an @@.pregnant;incubator for your child.@@
-
-<<= knockMeUp(getSlave($AS), 100, 2, -1, 1)>>
-
-<<if $arcologies[0].FSRestart != "unset" && $eugenicsFullControl != 1>>
-	<<if getSlave($AS).breedingMark != 1 || $propOutcome == 0>>
-		Rumors spread about you knocking up your playthings; the Societal Elite are @@.elites.loss; very displeased@@ by these rumors.
-		<<set $failedElite += 5>>
-	<</if>>
-<</if>>
diff --git a/src/npc/interaction/FFuckdollOral.js b/src/npc/interaction/FFuckdollOral.js
new file mode 100644
index 00000000000..6ea7b81106c
--- /dev/null
+++ b/src/npc/interaction/FFuckdollOral.js
@@ -0,0 +1,103 @@
+/**
+ *
+ * @param {App.Entity.SlaveState} slave
+ * @returns {DocumentFragment}
+ */
+App.Interact.fFuckdollOral = function(slave) {
+	const node = new DocumentFragment();
+	let r = [];
+
+	const {
+		He,
+		he, his, him
+	} = getPronouns(slave);
+
+	addPartner(slave, -1);
+
+	seX(slave, "oral", V.PC, "penetrative");
+	r.push(`You decide to use the Fuckdoll's`);
+	if (slave.lips > 95) {
+		r.push(`facepussy.`);
+	} else {
+		r.push(`face hole.`);
+	}
+	if (slave.fuckdoll <= 10) {
+		r.push(`Since ${he} is not well adapted to life as a living sex toy yet, ${he} won't respond to position commands. So, you simply`);
+		if (hasBothLegs(slave)) {
+			r.push(`shove ${him} into a kneeling position`);
+		} else {
+			r.push(`set ${him} on the couch`);
+		}
+		r.push(`and straddle ${his} face.`);
+	} else if (slave.fuckdoll <= 80) {
+		r.push(`${He} can follow intermediate commands, so you order ${him} into a position for use of ${his} face hole. ${He} obediently`);
+		if (hasBothLegs(slave)) {
+			r.push(`gets to ${his} knees`);
+		} else {
+			r.push(`cranes ${his} neck up`);
+		}
+		r.push(`and sticks ${his} tongue out as far as it will go, wiggling it invitingly. You straddle ${his} face.`);
+	} else {
+		r.push(`${He} can follow advanced commands, so you order ${him} into a position for use of ${his} face hole. ${He} instantly`);
+		if (hasAnyLegs(slave)) {
+			if (V.PC.dick !== 0) {
+				r.push(`bends at the waist and turns ${his} head upward, placing ${his} throat horizontally and at waist height.`);
+			} else {
+				r.push(`gets to ${his} knees and turns ${his} head upward at just the right angle for a pussy to ride ${his} face hole.`);
+			}
+		} else {
+			r.push(`cranes ${his} neck up and sticks ${his} tongue out as far as it will go, wiggling it invitingly.`);
+		}
+		r.push(`You straddle ${his} face.`);
+	}
+	if (slave.fuckdoll <= 20) {
+		r.push(`${He}'s not fully used to being surprised with face rape, so ${he} struggles, and ${his} difficulty breathing`);
+		if (V.PC.dick !== 0) {
+			r.push(`makes ${his} throat spasm around your dickhead.`);
+		} else {
+			r.push(`feels lovely on your cunt.`);
+		}
+	} else if (slave.fuckdoll <= 50) {
+		r.push(`Aware that ${he} is supposed to relax and let you rape ${his} face, ${he} does ${his} best to let you`);
+		if (V.PC.dick !== 0) {
+			r.push(`fuck ${his} throat.`);
+		} else {
+			r.push(`ride ${his} face.`);
+		}
+	} else {
+		r.push(`You command ${him} to`);
+		if (V.PC.dick !== 0) {
+			r.push(`milk your dick, and ${he} begins to suck with almost frightening force.`);
+		} else {
+			r.push(`pleasure your cunt, and ${he} begins to eat you out with almost frightening hunger.`);
+		}
+	}
+	if (slave.fuckdoll <= 60) {
+		if (slave.energy > 80) {
+			r.push(`Denied any other outlet for ${his} extreme sex drive, ${he} orgasms from nothing more than oral stimulation.`);
+		}
+	} else {
+		r.push(`${He}'s so perfectly tuned that ${he} begins to orgasm from nothing more than oral stimulation, and ${he} continues to shiver with repeated orgasms as ${he} sucks.`);
+	}
+	r.push(`You climax,`);
+	if (V.PC.dick !== 0) {
+		r.push(`blowing your load down ${his} throat,`);
+	} else {
+		r.push(`giving ${him} a good amount of femcum to swallow,`);
+	}
+	r.push(`and return ${him} to`);
+	if (hasAnyLegs(slave)) {
+		r.push(`a standing position.`);
+	} else {
+		r.push(`where ${he} was resting.`);
+	}
+	if (V.PC.dick !== 0) {
+		if (slave.lips > 95) {
+			r.push(`${He} gives sloppy blowjobs, ${his} lips being too big for much control, and strings of your cum beribbon ${his} suit. The Fuckdoll will be cleaned by another slave.`);
+		} else {
+			r.push(`${He} swallows repeatedly as ${he} returns to ${his} resting posture.`);
+		}
+	}
+	App.Events.addParagraph(node, r);
+	return node;
+};
diff --git a/src/npc/interaction/FFuckdollOral.tw b/src/npc/interaction/FFuckdollOral.tw
deleted file mode 100644
index b3c5da8aa7c..00000000000
--- a/src/npc/interaction/FFuckdollOral.tw
+++ /dev/null
@@ -1,32 +0,0 @@
-:: FFuckdollOral [nobr no-history]
-
-<<run App.Utils.setLocalPronouns(getSlave($AS))>>
-<<run addPartner(getSlave($AS), -1)>>
-
-<<set getSlave($AS).counter.oral++, $oralTotal++>>
-You decide to use the Fuckdoll's <<if getSlave($AS).lips > 95>>facepussy<<else>>face hole<</if>>.
-<<if getSlave($AS).fuckdoll <= 10>>
-	Since $he is not well adapted to life as a living sex toy yet, $he won't respond to position commands. So, you simply <<if hasBothLegs(getSlave($AS))>>shove $him into a kneeling position<<else>>set $him on the couch<</if>> and straddle $his face.
-<<elseif getSlave($AS).fuckdoll <= 80>>
-	$He can follow intermediate commands, so you order $him into a position for use of $his face hole. $He obediently <<if hasBothLegs(getSlave($AS))>>gets to $his knees<<else>>cranes $his neck up<</if>> and sticks $his tongue out as far as it will go, wiggling it invitingly. You straddle $his face.
-<<else>>
-	$He can follow advanced commands, so you order $him into a position for use of $his face hole. $He instantly <<if hasAnyLegs(getSlave($AS))>><<if $PC.dick != 0>>bends at the waist and turns $his head upward, placing $his throat horizontally and at waist height.<<else>>gets to $his knees and turns $his head upward at just the right angle for a pussy to ride $his face hole.<</if>><<else>>cranes $his neck up and sticks $his tongue out as far as it will go, wiggling it invitingly.<</if>> You straddle $his face.
-<</if>>
-<<if getSlave($AS).fuckdoll <= 20>>
-	$He's not fully used to being surprised with face rape, so $he struggles, and $his difficulty breathing <<if $PC.dick != 0>>makes $his throat spasm around your dickhead<<else>>feels lovely on your cunt<</if>>.
-<<elseif getSlave($AS).fuckdoll <= 50>>
-	Aware that $he is supposed to relax and let you rape $his face, $he does $his best to let you <<if $PC.dick != 0>>fuck $his throat<<else>>ride $his face<</if>>.
-<<else>>
-	You command $him to <<if $PC.dick != 0>>milk your dick, and $he begins to suck with almost frightening force<<else>>pleasure your cunt, and $he begins to eat you out with almost frightening hunger<</if>>.
-<</if>>
-<<if getSlave($AS).fuckdoll <= 60>>
-	<<if getSlave($AS).energy > 80>>Denied any other outlet for $his extreme sex drive, $he orgasms from nothing more than oral stimulation.<</if>>
-<<else>>
-	$He's so perfectly tuned that $he begins to orgasm from nothing more than oral stimulation, and $he continues to shiver with repeated orgasms as $he sucks.
-<</if>>
-You climax, <<if $PC.dick != 0>>blowing your load down $his throat<<else>>giving $him a good amount of femcum to swallow<</if>>, and return $him to <<if hasAnyLegs(getSlave($AS))>>a standing position<<else>>where $he was resting<</if>>.
-<<if $PC.dick != 0>>
-	<<if getSlave($AS).lips > 95>>$He gives sloppy blowjobs, $his lips being too big for much control, and strings of your cum beribbon $his suit. The Fuckdoll will be cleaned by another slave.
-	<<else>>$He swallows repeatedly as $he returns to $his resting posture.
-	<</if>>
-<</if>>
diff --git a/src/npc/interaction/FFuckdollVaginal.js b/src/npc/interaction/FFuckdollVaginal.js
new file mode 100644
index 00000000000..a4ad469a6d2
--- /dev/null
+++ b/src/npc/interaction/FFuckdollVaginal.js
@@ -0,0 +1,148 @@
+/**
+ *
+ * @param {App.Entity.SlaveState} slave
+ * @returns {DocumentFragment}
+ */
+App.Interact.fFuckdollVaginal = function(slave) {
+	const node = new DocumentFragment();
+	let r = [];
+
+	const {
+		He, His,
+		he, his, him
+	} = getPronouns(slave);
+
+	addPartner(slave, -1);
+
+	seX(slave, "vaginal", V.PC, "penetrative");
+	r.push(`You decide to use the Fuckdoll's`);
+	if (slave.vagina > 3) {
+		r.push(`cavernous`);
+	} else if (slave.vagina === 3) {
+		r.push(`soft`);
+	} else if (slave.vagina === 2) {
+		r.push(`inviting`);
+	} else if (slave.vagina === 1) {
+		r.push(`tight`);
+	}
+	r.push(`front hole.`);
+	if (slave.fuckdoll <= 10) {
+		r.push(`Since ${he} is not well adapted to life as a living sex toy yet, ${he} won't respond to position commands. So, you simply`);
+		if (hasAnyLegs(slave)) {
+			r.push(`push ${him} down to lie on the couch`);
+		} else {
+			r.push(`set ${him} on your desk`);
+		}
+		r.push(`and shove`);
+		if (V.PC.dick !== 0) {
+			r.push(`your cock`);
+		} else {
+			r.push(`a strap-on`);
+		}
+		r.push(`inside ${his} vagina.`);
+	} else if (slave.fuckdoll <= 70) {
+		r.push(`${He} can follow intermediate commands, so you order ${him} into a position for use of ${his} front hole. ${He} obediently`);
+		if (hasAllLimbs(slave)) {
+			r.push(`gets down on all fours and`);
+		} else if (hasAnyLegs(slave)) {
+			r.push(`bends over and`);
+		}
+		r.push(`cocks ${his} hips, offering ${his} cunt until you insert`);
+		if (V.PC.dick !== 0) {
+			r.push(`your cock`);
+		} else {
+			r.push(`a strap-on`);
+		}
+		r.push(`into ${his} wet channel.`);
+	} else {
+		r.push(`${He} can follow advanced commands, so you bring ${him} over to your chair`);
+		if (hasAnyLegs(slave)) {
+			r.push(`and order ${him} to squat down onto your`);
+			if (V.PC.dick !== 0) {
+				r.push(`cock`);
+			} else {
+				r.push(`strap-on`);
+			}
+			r.push(`and ride.`);
+		} else {
+			r.push(`and impale ${him} on`);
+			if (V.PC.dick !== 0) {
+				r.push(`your cock,`);
+			} else {
+				r.push(`your strap-on,`);
+			}
+			r.push(`ordering ${him} to do ${his} feeble best to bounce.`);
+		}
+	}
+	if (slave.fuckdoll <= 20) {
+		r.push(`${He}'s not fully used to being raped without warning, so ${he} struggles, ${his} muscles spasming delightfully.`);
+	} else if (slave.fuckdoll <= 40) {
+		r.push(`Aware that ${he} is supposed to relax and accept rape, ${he} does ${his} best to let you take ${him} without resistance.`);
+	} else {
+		r.push(`You command ${him} to milk your`);
+		if (V.PC.dick !== 0) {
+			r.push(`cock`);
+		} else {
+			r.push(`strap-on`);
+		}
+		r.push(`with ${his} vaginal walls, and ${he} obediently starts to flex ${his} well-developed cunt muscles, squeezing`);
+		if (V.PC.dick !== 0) {
+			r.push(`you`);
+		} else {
+			r.push(`your strap-on`);
+		}
+		r.push(`from base to tip.`);
+	}
+	if (slave.fuckdoll <= 60) {
+		if (slave.energy > 40) {
+			r.push(`Denied any other outlet for ${his} healthy sex drive, ${he} orgasms.`);
+		}
+	} else {
+		r.push(`${He} orgasmed for the first time as you entered ${him}, and ${he} continues to do so as you fuck ${him}. ${He}'s perfectly tuned.`);
+	}
+	if (slave.voice === 0) {
+		r.push(`Though ${he} is mute, ${his} breath hisses loudly`);
+		if (slave.lips > 95) {
+			r.push(`past the lips of ${his} facepussy.`);
+		} else {
+			r.push(`through ${his} mouth insert.`);
+		}
+	} else {
+		r.push(`${He} moans,`);
+		if (slave.lips > 95) {
+			r.push(`and the lips of ${his} facepussy quiver.`);
+		} else {
+			r.push(`struggling to force the sound past ${his} mouth insert.`);
+		}
+	}
+	r.push(`You climax${(V.PC.dick !== 0) ? `, your cum shooting forward to splash against ${his} womb,` : ``} and return ${him} to`);
+	if (hasAnyLegs(slave)) {
+		r.push(`a standing position.`);
+	} else {
+		r.push(`where ${he} was resting.`);
+	}
+	if (V.PC.dick !== 0) {
+		if (slave.vagina > 2) {
+			r.push(`Your cum flows out of ${his} gaping front hole and down the material of ${his} suit.`);
+		} else if (slave.vagina === 2) {
+			r.push(`Your cum drips out of ${his} well-fucked front hole and down the material of ${his} suit.`);
+		} else {
+			r.push(`${His} tight front hole retains almost every drop of your cum. A few escape and run down the material of ${his} suit.`);
+		}
+		if (canImpreg(slave, V.PC)) {
+			r.push(knockMeUp(slave, 5, 1, -1));
+		}
+		r.push(`The Fuckdoll will be cleaned by another slave.`);
+	}
+	if (slave.vagina === 0) {
+		if (slave.fetish !== "mindbroken") {
+			r.push(`As you return to your business, ${he} shakes slightly in place, and a few low moans come out of ${his} face hole. This is probably a reaction to losing ${his} virginity.`);
+		} else {
+			r.push(`${He} gives no external indication that ${he}'s aware that ${he}'s just lost ${his} virginity.`);
+		}
+		r.push(`In any case, <span class="lime">${his} front hole has been broken in.</span>`);
+		slave.vagina = 1;
+	}
+	App.Events.addParagraph(node, r);
+	return node;
+};
diff --git a/src/npc/interaction/FFuckdollVaginal.tw b/src/npc/interaction/FFuckdollVaginal.tw
deleted file mode 100644
index 4c30c5c3372..00000000000
--- a/src/npc/interaction/FFuckdollVaginal.tw
+++ /dev/null
@@ -1,51 +0,0 @@
-:: FFuckdollVaginal [nobr no-history]
-
-<<run App.Utils.setLocalPronouns(getSlave($AS))>>
-<<run addPartner(getSlave($AS), -1)>>
-
-<<set getSlave($AS).counter.vaginal++, $vaginalTotal++>>
-You decide to use the Fuckdoll's <<if getSlave($AS).vagina > 3>>cavernous<<elseif getSlave($AS).vagina == 3>>soft<<elseif getSlave($AS).vagina == 2>>inviting<<elseif getSlave($AS).vagina == 1>>tight<</if>> front hole.
-<<if getSlave($AS).fuckdoll <= 10>>
-	Since $he is not well adapted to life as a living sex toy yet, $he won't respond to position commands. So, you simply <<if hasAnyLegs(getSlave($AS))>>push $him down to lie on the couch<<else>>set $him on your desk<</if>> and shove <<if $PC.dick != 0>>your cock<<else>>a strap-on<</if>> inside $his vagina.
-<<elseif getSlave($AS).fuckdoll <= 70>>
-	$He can follow intermediate commands, so you order $him into a position for use of $his front hole. $He obediently <<if hasAllLimbs(getSlave($AS))>>gets down on all fours and <<elseif hasAnyLegs(getSlave($AS))>>bends over and <</if>>cocks $his hips, offering $his cunt until you insert <<if $PC.dick != 0>>your cock<<else>>a strap-on<</if>> into $his wet channel.
-<<else>>
-	$He can follow advanced commands, so you bring $him over to your chair <<if hasAnyLegs(getSlave($AS))>>and order $him to squat down onto your <<if $PC.dick != 0>>cock<<else>>strap-on<</if>> and ride.<<else>>and impale $him on <<if $PC.dick != 0>>your cock<<else>>your strap-on<</if>>, ordering $him to do $his feeble best to bounce.<</if>>
-<</if>>
-<<if getSlave($AS).fuckdoll <= 20>>
-	$He's not fully used to being raped without warning, so $he struggles, $his muscles spasming delightfully.
-<<elseif getSlave($AS).fuckdoll <= 40>>
-	Aware that $he is supposed to relax and accept rape, $he does $his best to let you take $him without resistance.
-<<else>>
-	You command $him to milk your <<if $PC.dick != 0>>cock<<else>>strap-on<</if>> with $his vaginal walls, and $he obediently starts to flex $his well-developed cunt muscles, squeezing <<if $PC.dick != 0>>you<<else>>your strap-on<</if>> from base to tip.
-<</if>>
-<<if getSlave($AS).fuckdoll <= 60>>
-	<<if getSlave($AS).energy > 40>>Denied any other outlet for $his healthy sex drive, $he orgasms.<</if>>
-<<else>>
-	$He orgasmed for the first time as you entered $him, and $he continues to do so as you fuck $him. $He's perfectly tuned.
-<</if>>
-<<if getSlave($AS).voice == 0>>
-	Though $he is mute, $his breath hisses loudly <<if getSlave($AS).lips > 95>>past the lips of $his facepussy<<else>>through $his mouth insert<</if>>.
-<<else>>
-	$He moans, <<if getSlave($AS).lips > 95>>and the lips of $his facepussy quiver<<else>>struggling to force the sound past $his mouth insert<</if>>.
-<</if>>
-You climax<<if $PC.dick != 0>>, your cum shooting forward to splash against $his womb,<</if>> and return $him to <<if hasAnyLegs(getSlave($AS))>>a standing position<<else>>where $he was resting<</if>>.
-<<if $PC.dick != 0>>
-	<<if getSlave($AS).vagina > 2>>Your cum flows out of $his gaping front hole and down the material of $his suit.
-	<<elseif getSlave($AS).vagina == 2>>Your cum drips out of $his well-fucked front hole and down the material of $his suit.
-	<<else>>$His tight front hole retains almost every drop of your cum. A few escape and run down the material of $his suit.
-	<</if>>
-	<<if canImpreg(getSlave($AS), $PC)>>
-		<<= knockMeUp(getSlave($AS), 5, 1, -1)>>
-	<</if>>
-	The Fuckdoll will be cleaned by another slave.
-<</if>>
-<<if getSlave($AS).vagina == 0>>
-	<<if getSlave($AS).fetish != "mindbroken">>
-		As you return to your business, $he shakes slightly in place, and a few low moans come out of $his face hole. This is probably a reaction to losing $his virginity.
-	<<else>>
-		$He gives no external indication that $he's aware that $he's just lost $his virginity.
-	<</if>>
-	In any case, @@.lime;$his front hole has been broken in.@@
-	<<set getSlave($AS).vagina = 1>>
-<</if>>
-- 
GitLab


From 6f9d0d7330789d40977ff7f6ff04183e1e8a0d8e Mon Sep 17 00:00:00 2001
From: lowercasedonkey <lowercasedonkey@gmail.com>
Date: Tue, 11 May 2021 12:34:56 -0400
Subject: [PATCH 7/7] spoken addition

---
 src/npc/interaction/fKiss.js | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/src/npc/interaction/fKiss.js b/src/npc/interaction/fKiss.js
index 4a4579c647b..de04aa1bc29 100644
--- a/src/npc/interaction/fKiss.js
+++ b/src/npc/interaction/fKiss.js
@@ -522,7 +522,10 @@ App.Interact.fKiss = function(slave) {
 		} else if (!canTalk(slave)) {
 			r.push(`${He} signs hesitantly, asking if that's it.`);
 		} else {
-			r.push(`${He} asks hesitantly, "I-is that it, ${Master}?"`);
+			r.push(
+				`${He} asks hesitantly,`,
+				Spoken(slave, `"I-is that it, ${Master}?"`)
+			);
 		}
 	} else if (slave.trust < -50) {
 		r.push(`${He} is nearly frozen with fear, and does not resist as you kiss ${him}. In fact, ${he} barely reacts at all. ${He} opens ${his} mouth mechanically in response to your insistent tongue, but it's like kissing a doll. ${He} is so filled with terror that ${he} remains stiff even as it becomes clear to ${him} you're not going to hurt ${him}. When you bore of making out with the poor`);
@@ -543,7 +546,10 @@ App.Interact.fKiss = function(slave) {
 		} else if (!canTalk(slave)) {
 			r.push(`${He} signs spastically, begging fearfully to know if that's it.`);
 		} else {
-			r.push(`${He} asks nervously before cringing, "I-is that it, ${Master}?"`);
+			r.push(
+				`${He} asks nervously before cringing,`,
+				Spoken(slave, `"I-is that it, ${Master}?"`)
+			);
 		}
 	} else {
 		r.push(`${He} reflexively turns ${his} head away from you, but you catch ${his} jaw and kiss ${him} harder. Spluttering, ${he} flees backwards, but you tip forward with ${him} and pin ${him} against your desk, plundering ${his} mouth without mercy. ${He} wriggles desperately, but ${his} struggles slowly subside as ${he} realizes that you're not taking this any farther. When you bore of it and pull away, ${he} stares at you in utter incomprehension.`);
@@ -558,7 +564,10 @@ App.Interact.fKiss = function(slave) {
 		} else if (!canTalk(slave)) {
 			r.push(`${He} signs irritably, asking whether that's it.`);
 		} else {
-			r.push(`${He} splutters, "Is that it, ${Master}!?"`);
+			r.push(
+				`${He} splutters,`,
+				Spoken(slave, `"Is that it, ${Master}!?"`)
+			);
 		}
 	}
 
-- 
GitLab